[pdal] 01/08: Imported Upstream version 1.0.0

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sun Mar 20 03:18:23 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository pdal.

commit 78bc78465b4973761ae9845ff19065d461e9835f
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Tue Mar 15 20:54:40 2016 +0100

    Imported Upstream version 1.0.0
---
 .gitignore                                         |   147 +
 .travis.yml                                        |    25 +
 AUTHORS.txt                                        |    37 +
 CMakeLists.txt                                     |   368 +
 CONTRIBUTING.md                                    |    45 +
 LICENSE.txt                                        |    46 +
 PDALConfig.cmake.in                                |    21 +
 README.md                                          |     7 +
 Vagrantfile                                        |   140 +
 apps/CMakeLists.txt                                |   107 +
 apps/pdal-config.in                                |    67 +
 apps/pdal.cpp                                      |   334 +
 apps/pdal.pc.in                                    |    12 +
 appveyor.yml                                       |    67 +
 astylerc                                           |    25 +
 cmake/boost.cmake                                  |    26 +
 cmake/check_demangle.cpp                           |     8 +
 cmake/common.cmake                                 |    19 +
 cmake/compiler_options.cmake                       |    12 +
 cmake/config.cmake                                 |    28 +
 cmake/directories.cmake                            |    13 +
 cmake/gdal.cmake                                   |    14 +
 cmake/geos.cmake                                   |    18 +
 cmake/geotiff.cmake                                |    19 +
 cmake/geowave.cmake                                |    17 +
 cmake/hdf5.cmake                                   |    11 +
 cmake/jace.cmake                                   |    21 +
 cmake/jni.cmake                                    |    19 +
 cmake/laszip.cmake                                 |    22 +
 cmake/lazperf.cmake                                |    10 +
 cmake/libraries.cmake                              |    13 +
 cmake/libxml2.cmake                                |    17 +
 cmake/macros.cmake                                 |   241 +
 cmake/modules.cmake                                |     5 +
 cmake/modules/BuildOSGeo4W.cmake                   |   152 +
 cmake/modules/FindFreeGLUT.cmake                   |    37 +
 cmake/modules/FindGDAL.cmake                       |   261 +
 cmake/modules/FindGEOS.cmake                       |   175 +
 cmake/modules/FindGeoTIFF.cmake                    |    89 +
 cmake/modules/FindGeoWave.cmake                    |    27 +
 cmake/modules/FindHexer.cmake                      |    96 +
 cmake/modules/FindICONV.cmake                      |   102 +
 cmake/modules/FindJSONCPP.cmake                    |   103 +
 cmake/modules/FindJace.cmake                       |    46 +
 cmake/modules/FindLASzip.cmake                     |    98 +
 cmake/modules/FindMatlab.cmake                     |    47 +
 cmake/modules/FindMrSID.cmake                      |    56 +
 cmake/modules/FindNitro.cmake                      |    73 +
 cmake/modules/FindNumPy.cmake                      |    34 +
 cmake/modules/FindOracle.cmake                     |    81 +
 cmake/modules/FindP2G.cmake                        |   109 +
 cmake/modules/FindPostgreSQL.cmake                 |    83 +
 cmake/modules/FindSQLite3.cmake                    |    60 +
 cmake/modules/GetGitRevisionDescription.cmake      |   123 +
 cmake/modules/GetGitRevisionDescription.cmake.in   |    38 +
 cmake/nitro.cmake                                  |    17 +
 cmake/policies.cmake                               |     7 +
 cmake/postgres.cmake                               |     9 +
 cmake/python.cmake                                 |    15 +
 cmake/sqlite.cmake                                 |     8 +
 cmake/threads.cmake                                |     7 +
 cmake/unix_compiler_options.cmake                  |    22 +
 cmake/win32_compiler_options.cmake                 |    85 +
 cmake/zlib.cmake                                   |    13 +
 doc/_static/breathe.css                            |    13 +
 doc/_static/dummy                                  |     1 +
 doc/_static/files/2011_Codesprint_libpc_design.pdf |   Bin 0 -> 363934 bytes
 .../files/2011_Codesprint_libpc_implementation.pdf |   Bin 0 -> 366239 bytes
 doc/_static/logo/Bauhaus93.ttf                     |   Bin 0 -> 41484 bytes
 doc/_static/logo/big_bubbles.png                   |   Bin 0 -> 69035 bytes
 doc/_static/logo/big_text.png                      |   Bin 0 -> 9318 bytes
 doc/_static/logo/dongle/back.ai                    | 10118 ++++++++++
 doc/_static/logo/dongle/front.ai                   |  6536 ++++++
 doc/_static/logo/favicon.ico                       |   Bin 0 -> 3774 bytes
 doc/_static/logo/pdal_favicon.svg                  |    99 +
 doc/_static/logo/pdal_logo-horizontal.svg          |   323 +
 doc/_static/logo/pdal_logo.svg                     |   321 +
 doc/_static/logo/pdal_logo_only.png                |   Bin 0 -> 11601 bytes
 doc/_static/pdal_bubbles_only.png                  |   Bin 0 -> 12019 bytes
 doc/_static/pdal_logo.png                          |   Bin 0 -> 14703 bytes
 doc/_static/sphinx.css                             |   244 +
 doc/_themes/bootstrap/bootstrap.js                 |  2038 ++
 doc/_themes/bootstrap/bootstrap.min.js             |     7 +
 doc/_themes/bootstrap/indexsidebar.html            |    42 +
 doc/_themes/bootstrap/layout.html                  |   267 +
 doc/_themes/bootstrap/static/bootstrap-default.css |  5624 ++++++
 .../bootstrap/static/bootstrap-default.min.css     |     9 +
 doc/_themes/bootstrap/static/bootstrap-dropdown.js |    81 +
 .../bootstrap/static/bootstrap-engineauth.css      |  5700 ++++++
 .../bootstrap/static/bootstrap-engineauth.min.css  |   829 +
 .../bootstrap/static/bootstrap-responsive.css      |  1040 +
 .../bootstrap/static/bootstrap-responsive.min.css  |     9 +
 doc/_themes/bootstrap/static/bootstrap-sapling.css |  6484 ++++++
 doc/_themes/bootstrap/static/jquery.js             |     4 +
 doc/_themes/bootstrap/static/sphinx-bootstrap.css  |   188 +
 doc/_themes/bootstrap/theme.conf                   |    16 +
 doc/api/cpp/bounds.rst                             |     8 +
 doc/api/cpp/dimension.rst                          |    17 +
 doc/api/cpp/index.rst                              |    21 +
 doc/api/cpp/log.rst                                |     8 +
 doc/api/cpp/metadata.rst                           |    11 +
 doc/api/cpp/option.rst                             |    11 +
 doc/api/cpp/options.rst                            |     9 +
 doc/api/cpp/pointtable.rst                         |    10 +
 doc/api/cpp/pointview.rst                          |    11 +
 doc/api/cpp/reader.rst                             |    53 +
 doc/api/cpp/stage.rst                              |    14 +
 doc/api/cpp/writer.rst                             |    11 +
 doc/api/index.rst                                  |    18 +
 doc/apps.rst                                       |   698 +
 doc/community.rst                                  |    27 +
 doc/compilation/dependencies.rst                   |   211 +
 doc/compilation/index.rst                          |    17 +
 doc/compilation/media/OSGeo4WInstallAdvanced.png   |   Bin 0 -> 26527 bytes
 .../media/OSGeo4WInstallFromInternet.png           |   Bin 0 -> 21083 bytes
 doc/compilation/media/OSGeo4WInstallGDALDev.png    |   Bin 0 -> 31180 bytes
 doc/compilation/media/OSGeo4WInstallIConv.png      |   Bin 0 -> 31629 bytes
 doc/compilation/media/OSGeo4WInstallLASZip.png     |   Bin 0 -> 31377 bytes
 doc/compilation/media/OSGeo4WInstallLibXML2.png    |   Bin 0 -> 31852 bytes
 doc/compilation/media/OSGeo4WInstallOCI.png        |   Bin 0 -> 69090 bytes
 .../media/OSGeo4WInstallRootDirectory.png          |   Bin 0 -> 26383 bytes
 doc/compilation/media/ccmake-osx-start.png         |   Bin 0 -> 118109 bytes
 doc/compilation/media/cmake-gui-osx-configured.png |   Bin 0 -> 222684 bytes
 doc/compilation/media/cmake-gui-osx-start.png      |   Bin 0 -> 72467 bytes
 doc/compilation/media/xcode-lasinfo-arguments.png  |   Bin 0 -> 49603 bytes
 .../media/xcode-set-default-executable.png         |   Bin 0 -> 113254 bytes
 doc/compilation/media/xcode-start.png              |   Bin 0 -> 103489 bytes
 doc/compilation/unix.rst                           |   309 +
 doc/compilation/windows.rst                        |   259 +
 doc/conf.py                                        |   307 +
 doc/copyright.rst                                  |     7 +
 doc/development/conventions.rst                    |   121 +
 doc/development/docs.rst                           |    41 +
 doc/development/errorhandling.rst                  |    41 +
 doc/development/goals.rst                          |    29 +
 doc/development/index.rst                          |    37 +
 doc/development/testing.rst                        |   172 +
 doc/development/usecases.rst                       |    99 +
 doc/docs.rst                                       |    34 +
 doc/download.rst                                   |    47 +
 doc/faq.rst                                        |    38 +
 doc/index.rst                                      |    45 +
 doc/make.bat                                       |   179 +
 doc/metadata.rst                                   |   231 +
 doc/pipeline.rst                                   |   244 +
 doc/stages/filters.attribute.rst                   |   127 +
 doc/stages/filters.chipper.img1.png                |   Bin 0 -> 65435 bytes
 doc/stages/filters.chipper.img2.png                |   Bin 0 -> 115016 bytes
 doc/stages/filters.chipper.rst                     |    52 +
 doc/stages/filters.colorization.img1.jpg           |   Bin 0 -> 666757 bytes
 doc/stages/filters.colorization.rst                |    76 +
 doc/stages/filters.crop.rst                        |    48 +
 doc/stages/filters.decimation.rst                  |    33 +
 doc/stages/filters.ferry.rst                       |    80 +
 doc/stages/filters.hexbin.img1.jpg                 |   Bin 0 -> 340821 bytes
 doc/stages/filters.hexbin.rst                      |   107 +
 doc/stages/filters.merge.rst                       |    42 +
 doc/stages/filters.mortonorder.rst                 |    35 +
 doc/stages/filters.pclblock.rst                    |   148 +
 doc/stages/filters.predicate.rst                   |    92 +
 doc/stages/filters.programmable.rst                |    94 +
 doc/stages/filters.range.rst                       |    58 +
 doc/stages/filters.reprojection.rst                |    62 +
 doc/stages/filters.sort.rst                        |    46 +
 doc/stages/filters.splitter.rst                    |    49 +
 doc/stages/filters.stats.rst                       |    52 +
 doc/stages/filters.transformation.rst              |    51 +
 doc/stages/index.rst                               |    74 +
 doc/stages/readers.bpf.rst                         |    38 +
 doc/stages/readers.buffer.rst                      |    20 +
 doc/stages/readers.faux.rst                        |    51 +
 doc/stages/readers.geowave.rst                     |    65 +
 doc/stages/readers.greyhound.rst                   |    35 +
 doc/stages/readers.las.rst                         |    49 +
 doc/stages/readers.mrsid.rst                       |    38 +
 doc/stages/readers.nitf.rst                        |    51 +
 doc/stages/readers.oci.rst                         |    61 +
 doc/stages/readers.optech.rst                      |    29 +
 doc/stages/readers.pcd.rst                         |    34 +
 doc/stages/readers.pgpointcloud.rst                |    51 +
 doc/stages/readers.ply.rst                         |    36 +
 doc/stages/readers.qfit.rst                        |    50 +
 doc/stages/readers.rxp.rst                         |   127 +
 doc/stages/readers.sbet.rst                        |    30 +
 doc/stages/readers.sqlite.rst                      |    50 +
 doc/stages/writers.bpf.rst                         |    89 +
 doc/stages/writers.derivative.rst                  |    52 +
 doc/stages/writers.geowave.rst                     |    66 +
 doc/stages/writers.las.rst                         |   155 +
 doc/stages/writers.matlab.rst                      |    41 +
 doc/stages/writers.nitf.rst                        |    89 +
 doc/stages/writers.null.rst                        |    33 +
 doc/stages/writers.oci.rst                         |   167 +
 doc/stages/writers.p2g.rst                         |   103 +
 doc/stages/writers.pcd.rst                         |    42 +
 doc/stages/writers.pclvisualizer.rst               |    21 +
 doc/stages/writers.pgpointcloud.rst                |    85 +
 doc/stages/writers.ply.rst                         |    46 +
 doc/stages/writers.rialto.rst                      |    44 +
 doc/stages/writers.sqlite.rst                      |    89 +
 doc/stages/writers.text.rst                        |    59 +
 doc/tutorial/after-front1.png                      |   Bin 0 -> 55074 bytes
 doc/tutorial/after-front2.png                      |   Bin 0 -> 80452 bytes
 doc/tutorial/after-front3.png                      |   Bin 0 -> 105133 bytes
 doc/tutorial/after-top1.png                        |   Bin 0 -> 711754 bytes
 doc/tutorial/after-top2.png                        |   Bin 0 -> 809196 bytes
 doc/tutorial/after-top3.png                        |   Bin 0 -> 757718 bytes
 doc/tutorial/index.rst                             |    40 +
 doc/tutorial/liblas_to_pdal.rst                    |   350 +
 doc/tutorial/original.png                          |   Bin 0 -> 1491791 bytes
 doc/tutorial/overview.rst                          |   438 +
 doc/tutorial/pcl_block_tutorial.rst                |   353 +
 doc/tutorial/pcl_ground.rst                        |   193 +
 doc/tutorial/pcl_spec.rst                          |   578 +
 doc/tutorial/pipeline.png                          |   Bin 0 -> 57285 bytes
 doc/tutorial/reading.rst                           |   274 +
 doc/tutorial/sor_pmf.json                          |    14 +
 doc/tutorial/sor_pmf2.json                         |    15 +
 doc/tutorial/using.rst                             |   120 +
 doc/tutorial/writing-filter.rst                    |    76 +
 doc/tutorial/writing-kernel.rst                    |   103 +
 doc/tutorial/writing-reader.rst                    |    95 +
 doc/tutorial/writing-writer.rst                    |   103 +
 doc/tutorial/writing.rst                           |    88 +
 doc/vagrant.rst                                    |   139 +
 examples/writing-filter/CMakeLists.txt             |    11 +
 examples/writing-filter/MyFilter.cpp               |    29 +
 examples/writing-filter/MyFilter.hpp               |    39 +
 examples/writing-kernel/CMakeLists.txt             |    11 +
 examples/writing-kernel/MyKernel.cpp               |    73 +
 examples/writing-kernel/MyKernel.hpp               |    25 +
 examples/writing-reader/CMakeLists.txt             |    11 +
 examples/writing-reader/MyReader.cpp               |    73 +
 examples/writing-reader/MyReader.hpp               |    25 +
 examples/writing-writer/CMakeLists.txt             |    11 +
 examples/writing-writer/MyWriter.cpp               |    73 +
 examples/writing-writer/MyWriter.hpp               |    25 +
 examples/writing/CMakeLists.txt                    |     9 +
 examples/writing/tutorial.cpp                      |    72 +
 filters/CMakeLists.txt                             |    15 +
 filters/chipper/CMakeLists.txt                     |    17 +
 filters/chipper/ChipperFilter.cpp                  |   327 +
 filters/chipper/ChipperFilter.hpp                  |   177 +
 filters/colorization/CMakeLists.txt                |    17 +
 filters/colorization/ColorizationFilter.cpp        |   254 +
 filters/colorization/ColorizationFilter.hpp        |   108 +
 filters/crop/CMakeLists.txt                        |    17 +
 filters/crop/CropFilter.cpp                        |   332 +
 filters/crop/CropFilter.hpp                        |   100 +
 filters/decimation/CMakeLists.txt                  |    17 +
 filters/decimation/DecimationFilter.cpp            |    76 +
 filters/decimation/DecimationFilter.hpp            |    69 +
 filters/ferry/CMakeLists.txt                       |    17 +
 filters/ferry/FerryFilter.cpp                      |   128 +
 filters/ferry/FerryFilter.hpp                      |    73 +
 filters/merge/CMakeLists.txt                       |     5 +
 filters/merge/MergeFilter.cpp                      |    50 +
 filters/merge/MergeFilter.hpp                      |    75 +
 filters/mortonorder/CMakeLists.txt                 |    17 +
 filters/mortonorder/MortonOrderFilter.cpp          |   128 +
 filters/mortonorder/MortonOrderFilter.hpp          |    65 +
 filters/range/CMakeLists.txt                       |     5 +
 filters/range/RangeFilter.cpp                      |   129 +
 filters/range/RangeFilter.hpp                      |    79 +
 filters/reprojection/CMakeLists.txt                |    17 +
 filters/reprojection/ReprojectionFilter.cpp        |   194 +
 filters/reprojection/ReprojectionFilter.hpp        |    85 +
 filters/sort/CMakeLists.txt                        |     5 +
 filters/sort/SortFilter.cpp                        |    50 +
 filters/sort/SortFilter.hpp                        |    83 +
 filters/splitter/CMakeLists.txt                    |    17 +
 filters/splitter/SplitterFilter.cpp                |   131 +
 filters/splitter/SplitterFilter.hpp                |    69 +
 filters/stats/CMakeLists.txt                       |    17 +
 filters/stats/StatsFilter.cpp                      |   200 +
 filters/stats/StatsFilter.hpp                      |   139 +
 filters/transformation/CMakeLists.txt              |    18 +
 filters/transformation/TransformationFilter.cpp    |   112 +
 filters/transformation/TransformationFilter.hpp    |    77 +
 gitsha.cpp.in                                      |     3 +
 include/pdal/BufferReader.hpp                      |    60 +
 include/pdal/Compression.hpp                       |   243 +
 include/pdal/DbReader.hpp                          |    72 +
 include/pdal/DbWriter.hpp                          |    90 +
 include/pdal/Dimension.hpp                         |   799 +
 include/pdal/Filter.hpp                            |    88 +
 include/pdal/FlexWriter.hpp                        |   135 +
 include/pdal/GDALUtils.hpp                         |   177 +
 include/pdal/GlobalEnvironment.hpp                 |    70 +
 include/pdal/KDIndex.hpp                           |   334 +
 include/pdal/Kernel.hpp                            |   195 +
 include/pdal/KernelFactory.hpp                     |    71 +
 include/pdal/KernelSupport.hpp                     |   110 +
 include/pdal/Log.hpp                               |   135 +
 include/pdal/Metadata.hpp                          |   750 +
 include/pdal/Options.hpp                           |   564 +
 include/pdal/PDALUtils.hpp                         |   322 +
 include/pdal/PipelineManager.hpp                   |   106 +
 include/pdal/PipelineReader.hpp                    |    94 +
 include/pdal/PipelineWriter.hpp                    |    77 +
 include/pdal/PluginManager.hpp                     |   109 +
 include/pdal/PointLayout.hpp                       |   117 +
 include/pdal/PointTable.hpp                        |   123 +
 include/pdal/PointView.hpp                         |   570 +
 include/pdal/PointViewIter.hpp                     |   171 +
 include/pdal/QuadIndex.hpp                         |   182 +
 include/pdal/QuickInfo.hpp                         |    62 +
 include/pdal/Reader.hpp                            |    78 +
 include/pdal/SpatialReference.hpp                  |   130 +
 include/pdal/Stage.hpp                             |   184 +
 include/pdal/StageFactory.hpp                      |    94 +
 include/pdal/StageWrapper.hpp                      |    50 +
 include/pdal/UserCallback.hpp                      |   127 +
 include/pdal/Writer.hpp                            |    92 +
 include/pdal/XMLSchema.hpp                         |   144 +
 include/pdal/gitsha.h                              |     1 +
 include/pdal/pdal.hpp                              |    42 +
 include/pdal/pdal_config.hpp                       |    68 +
 include/pdal/pdal_export.hpp                       |    60 +
 include/pdal/pdal_internal.hpp                     |    67 +
 include/pdal/pdal_macros.hpp                       |   120 +
 include/pdal/pdal_test_main.hpp                    |    46 +
 include/pdal/pdal_types.hpp                        |   139 +
 include/pdal/plang/Array.hpp                       |    77 +
 include/pdal/plang/BufferedInvocation.hpp          |    61 +
 include/pdal/plang/Environment.hpp                 |    85 +
 include/pdal/plang/Invocation.hpp                  |   109 +
 include/pdal/plang/Redirector.hpp                  |    50 +
 include/pdal/plang/Script.hpp                      |    78 +
 include/pdal/plugin.hpp                            |    99 +
 include/pdal/util/Algorithm.hpp                    |    49 +
 include/pdal/util/Bounds.hpp                       |   377 +
 include/pdal/util/Charbuf.hpp                      |    74 +
 include/pdal/util/Endian.hpp                       |   110 +
 include/pdal/util/Extractor.hpp                    |   398 +
 include/pdal/util/FileUtils.hpp                    |   127 +
 include/pdal/util/Georeference.hpp                 |    92 +
 include/pdal/util/IStream.hpp                      |   346 +
 include/pdal/util/Inserter.hpp                     |   230 +
 include/pdal/util/OStream.hpp                      |   227 +
 include/pdal/util/Utils.hpp                        |   490 +
 include/pdal/util/portable_endian.hpp              |   115 +
 io/CMakeLists.txt                                  |    13 +
 io/bpf/BpfCompressor.cpp                           |   132 +
 io/bpf/BpfCompressor.hpp                           |    70 +
 io/bpf/BpfHeader.cpp                               |   391 +
 io/bpf/BpfHeader.hpp                               |   258 +
 io/bpf/BpfReader.cpp                               |   475 +
 io/bpf/BpfReader.hpp                               |   109 +
 io/bpf/BpfWriter.cpp                               |   338 +
 io/bpf/BpfWriter.hpp                               |    85 +
 io/bpf/CMakeLists.txt                              |    23 +
 io/derivative/CMakeLists.txt                       |    17 +
 io/derivative/DerivativeWriter.cpp                 |  1671 ++
 io/derivative/DerivativeWriter.hpp                 |   173 +
 io/faux/CMakeLists.txt                             |    17 +
 io/faux/FauxReader.cpp                             |   211 +
 io/faux/FauxReader.hpp                             |   128 +
 io/las/CMakeLists.txt                              |    66 +
 io/las/GeotiffSupport.cpp                          |   313 +
 io/las/GeotiffSupport.hpp                          |    86 +
 io/las/HeaderVal.hpp                               |   136 +
 io/las/LasError.hpp                                |    84 +
 io/las/LasHeader.cpp                               |   346 +
 io/las/LasHeader.hpp                               |   403 +
 io/las/LasReader.cpp                               |   836 +
 io/las/LasReader.hpp                               |   143 +
 io/las/LasUtils.cpp                                |   219 +
 io/las/LasUtils.hpp                                |   135 +
 io/las/LasWriter.cpp                               |   930 +
 io/las/LasWriter.hpp                               |   155 +
 io/las/SummaryData.cpp                             |   109 +
 io/las/SummaryData.hpp                             |    76 +
 io/las/VariableLengthRecord.cpp                    |   103 +
 io/las/VariableLengthRecord.hpp                    |   124 +
 io/las/ZipPoint.cpp                                |   123 +
 io/las/ZipPoint.hpp                                |    83 +
 io/null/CMakeLists.txt                             |    14 +
 io/null/NullWriter.cpp                             |    16 +
 io/null/NullWriter.hpp                             |    58 +
 io/optech/CMakeLists.txt                           |    10 +
 io/optech/OptechCommon.hpp                         |   110 +
 io/optech/OptechReader.cpp                         |   283 +
 io/optech/OptechReader.hpp                         |    91 +
 io/optech/OptechRotationMatrix.hpp                 |    46 +
 io/ply/CMakeLists.txt                              |    14 +
 io/ply/PlyReader.cpp                               |   260 +
 io/ply/PlyReader.hpp                               |    80 +
 io/ply/PlyWriter.cpp                               |   209 +
 io/ply/PlyWriter.hpp                               |    71 +
 io/qfit/CMakeLists.txt                             |    17 +
 io/qfit/QfitReader.cpp                             |   459 +
 io/qfit/QfitReader.hpp                             |   118 +
 io/sbet/CMakeLists.txt                             |    38 +
 io/sbet/SbetCommon.cpp                             |    72 +
 io/sbet/SbetCommon.hpp                             |    44 +
 io/sbet/SbetReader.cpp                             |   114 +
 io/sbet/SbetReader.hpp                             |    77 +
 io/sbet/SbetWriter.cpp                             |    84 +
 io/sbet/SbetWriter.hpp                             |    67 +
 io/terrasolid/CMakeLists.txt                       |    17 +
 io/terrasolid/TerrasolidReader.cpp                 |   293 +
 io/terrasolid/TerrasolidReader.hpp                 |   140 +
 io/text/CMakeLists.txt                             |    17 +
 io/text/TextWriter.cpp                             |   264 +
 io/text/TextWriter.hpp                             |    99 +
 kernels/CMakeLists.txt                             |    13 +
 kernels/delta/CMakeLists.txt                       |    17 +
 kernels/delta/DeltaKernel.cpp                      |   245 +
 kernels/delta/DeltaKernel.hpp                      |   100 +
 kernels/diff/CMakeLists.txt                        |    17 +
 kernels/diff/DiffKernel.cpp                        |   223 +
 kernels/diff/DiffKernel.hpp                        |    72 +
 kernels/info/CMakeLists.txt                        |    17 +
 kernels/info/InfoKernel.cpp                        |   472 +
 kernels/info/InfoKernel.hpp                        |   110 +
 kernels/merge/CMakeLists.txt                       |    17 +
 kernels/merge/MergeKernel.cpp                      |   114 +
 kernels/merge/MergeKernel.hpp                      |    62 +
 kernels/pipeline/CMakeLists.txt                    |    17 +
 kernels/pipeline/PipelineKernel.cpp                |   146 +
 kernels/pipeline/PipelineKernel.hpp                |    70 +
 kernels/random/CMakeLists.txt                      |    17 +
 kernels/random/RandomKernel.cpp                    |   191 +
 kernels/random/RandomKernel.hpp                    |    77 +
 kernels/sort/CMakeLists.txt                        |    17 +
 kernels/sort/SortKernel.cpp                        |   184 +
 kernels/sort/SortKernel.hpp                        |    66 +
 kernels/split/CMakeLists.txt                       |    17 +
 kernels/split/SplitKernel.cpp                      |   168 +
 kernels/split/SplitKernel.hpp                      |    66 +
 kernels/tindex/CMakeLists.txt                      |    18 +
 kernels/tindex/TIndexKernel.cpp                    |   778 +
 kernels/tindex/TIndexKernel.hpp                    |   119 +
 kernels/translate/CMakeLists.txt                   |     3 +
 kernels/translate/TranslateKernel.cpp              |   214 +
 kernels/translate/TranslateKernel.hpp              |    75 +
 pdal_defines.h.in                                  |    77 +
 plugins/CMakeLists.txt                             |    64 +
 plugins/attribute/CMakeLists.txt                   |    21 +
 plugins/attribute/filters/AttributeFilter.cpp      |   356 +
 plugins/attribute/filters/AttributeFilter.hpp      |   140 +
 plugins/cpd/CMakeLists.txt                         |    41 +
 plugins/cpd/kernel/Cpd.cpp                         |   333 +
 plugins/cpd/kernel/Cpd.hpp                         |    84 +
 plugins/cpd/test/CpdKernelTest.cpp                 |   126 +
 plugins/geowave/CMakeLists.txt                     |    47 +
 plugins/geowave/io/GeoWaveReader.cpp               |   399 +
 plugins/geowave/io/GeoWaveReader.hpp               |    89 +
 plugins/geowave/io/GeoWaveWriter.cpp               |   350 +
 plugins/geowave/io/GeoWaveWriter.hpp               |    78 +
 plugins/greyhound/CMakeLists.txt                   |    35 +
 plugins/greyhound/io/CompressionStream.cpp         |    45 +
 plugins/greyhound/io/CompressionStream.hpp         |    27 +
 plugins/greyhound/io/Exchanges.cpp                 |   424 +
 plugins/greyhound/io/Exchanges.hpp                 |   196 +
 plugins/greyhound/io/GreyhoundReader.cpp           |   134 +
 plugins/greyhound/io/GreyhoundReader.hpp           |    73 +
 plugins/greyhound/io/WebSocketClient.cpp           |   158 +
 plugins/greyhound/io/WebSocketClient.hpp           |    96 +
 plugins/hexbin/CMakeLists.txt                      |    22 +
 plugins/hexbin/filters/HexBin.cpp                  |   146 +
 plugins/hexbin/filters/HexBin.hpp                  |    75 +
 plugins/hexbin/test/HexbinFilterTest.cpp           |    96 +
 plugins/icebridge/CMakeLists.txt                   |    29 +
 plugins/icebridge/io/Hdf5Handler.cpp               |   155 +
 plugins/icebridge/io/Hdf5Handler.hpp               |   112 +
 plugins/icebridge/io/IcebridgeReader.cpp           |   193 +
 plugins/icebridge/io/IcebridgeReader.hpp           |    82 +
 plugins/icebridge/test/IcebridgeReaderTest.cpp     |   153 +
 plugins/matlab/CMakeLists.txt                      |    23 +
 plugins/matlab/io/MatlabWriter.cpp                 |   164 +
 plugins/matlab/io/MatlabWriter.hpp                 |    76 +
 plugins/matlab/test/MatlabWriterTest.cpp           |   107 +
 plugins/mrsid/CMakeLists.txt                       |    26 +
 plugins/mrsid/io/MrsidReader.cpp                   |   386 +
 plugins/mrsid/io/MrsidReader.hpp                   |   103 +
 plugins/mrsid/test/MrsidTest.cpp                   |    82 +
 plugins/nitf/CMakeLists.txt                        |    63 +
 plugins/nitf/io/MetadataReader.cpp                 |   415 +
 plugins/nitf/io/MetadataReader.hpp                 |   132 +
 plugins/nitf/io/NitfFile.cpp                       |   251 +
 plugins/nitf/io/NitfFile.hpp                       |   108 +
 plugins/nitf/io/NitfReader.cpp                     |   121 +
 plugins/nitf/io/NitfReader.hpp                     |    93 +
 plugins/nitf/io/NitfWriter.cpp                     |   377 +
 plugins/nitf/io/NitfWriter.hpp                     |    83 +
 plugins/nitf/io/nitflib.h                          |   413 +
 plugins/nitf/io/tre_plugins.cpp                    |   253 +
 plugins/nitf/io/tre_plugins.hpp                    |    52 +
 plugins/nitf/test/NitfReaderTest.cpp               |   175 +
 plugins/nitf/test/NitfWriterTest.cpp               |   306 +
 plugins/oci/CMakeLists.txt                         |    55 +
 plugins/oci/io/OciCommon.cpp                       |   159 +
 plugins/oci/io/OciCommon.hpp                       |   124 +
 plugins/oci/io/OciReader.cpp                       |   453 +
 plugins/oci/io/OciReader.hpp                       |   100 +
 plugins/oci/io/OciWrapper.cpp                      |  2498 +++
 plugins/oci/io/OciWrapper.h                        |   483 +
 plugins/oci/io/OciWriter.cpp                       |  1139 ++
 plugins/oci/io/OciWriter.hpp                       |   141 +
 plugins/oci/test/OCITest.cpp                       |   402 +
 plugins/p2g/CMakeLists.txt                         |    16 +
 plugins/p2g/io/P2gWriter.cpp                       |   231 +
 plugins/p2g/io/P2gWriter.hpp                       |   104 +
 plugins/pcl/CMakeLists.txt                         |   178 +
 plugins/pcl/PCLConversions.hpp                     |   200 +
 plugins/pcl/filters/GroundFilter.cpp               |   195 +
 plugins/pcl/filters/GroundFilter.hpp               |    79 +
 plugins/pcl/filters/PCLBlock.cpp                   |   149 +
 plugins/pcl/filters/PCLBlock.hpp                   |    65 +
 plugins/pcl/io/PCLVisualizer.cpp                   |   196 +
 plugins/pcl/io/PCLVisualizer.hpp                   |    61 +
 plugins/pcl/io/PcdCommon.cpp                       |    56 +
 plugins/pcl/io/PcdCommon.hpp                       |    44 +
 plugins/pcl/io/PcdReader.cpp                       |    85 +
 plugins/pcl/io/PcdReader.hpp                       |    68 +
 plugins/pcl/io/PcdWriter.cpp                       |    98 +
 plugins/pcl/io/PcdWriter.hpp                       |    70 +
 plugins/pcl/io/point_types.hpp                     |    22 +
 plugins/pcl/kernel/GroundKernel.cpp                |   170 +
 plugins/pcl/kernel/GroundKernel.hpp                |    79 +
 plugins/pcl/kernel/HeightAboveGroundKernel.cpp     |   237 +
 plugins/pcl/kernel/HeightAboveGroundKernel.hpp     |    66 +
 plugins/pcl/kernel/PCLKernel.cpp                   |   170 +
 plugins/pcl/kernel/PCLKernel.hpp                   |    65 +
 plugins/pcl/kernel/SmoothKernel.cpp                |   157 +
 plugins/pcl/kernel/SmoothKernel.hpp                |    64 +
 plugins/pcl/kernel/ViewKernel.cpp                  |   192 +
 plugins/pcl/kernel/ViewKernel.hpp                  |    64 +
 plugins/pcl/pipeline/PCLPipeline.cpp               |    52 +
 plugins/pcl/pipeline/PCLPipeline.h                 |   248 +
 plugins/pcl/pipeline/PCLPipeline.hpp               |   696 +
 plugins/pcl/test/PCLBlockFilterTest.cpp            |   244 +
 plugins/pgpointcloud/CMakeLists.txt                |    63 +
 plugins/pgpointcloud/io/PgCommon.hpp               |   159 +
 plugins/pgpointcloud/io/PgReader.cpp               |   385 +
 plugins/pgpointcloud/io/PgReader.hpp               |   139 +
 plugins/pgpointcloud/io/PgWriter.cpp               |   514 +
 plugins/pgpointcloud/io/PgWriter.hpp               |   109 +
 .../pgpointcloud/test/PgpointcloudWriterTest.cpp   |   254 +
 plugins/pgpointcloud/test/Pgtest-Support.hpp.in    |    54 +
 plugins/python/CMakeLists.txt                      |    10 +
 plugins/python/filters/CMakeLists.txt              |    31 +
 plugins/python/filters/PredicateFilter.cpp         |   117 +
 plugins/python/filters/PredicateFilter.hpp         |    73 +
 plugins/python/filters/ProgrammableFilter.cpp      |   119 +
 plugins/python/filters/ProgrammableFilter.hpp      |    79 +
 plugins/python/plang/CMakeLists.txt                |    34 +
 plugins/python/plang/Plang.cpp                     |    78 +
 plugins/python/plang/Plang.hpp                     |    55 +
 plugins/python/test/CMakeLists.txt                 |     0
 plugins/python/test/PLangTest.cpp                  |   463 +
 plugins/python/test/PredicateFilterTest.cpp        |   375 +
 plugins/python/test/ProgrammableFilterTest.cpp     |   239 +
 plugins/rxp/CMakeLists.txt                         |    38 +
 plugins/rxp/io/RxpPointcloud.cpp                   |   146 +
 plugins/rxp/io/RxpPointcloud.hpp                   |    92 +
 plugins/rxp/io/RxpReader.cpp                       |   142 +
 plugins/rxp/io/RxpReader.hpp                       |    98 +
 plugins/rxp/test/Config.hpp.in                     |    13 +
 plugins/rxp/test/RxpReaderTest.cpp                 |   166 +
 plugins/rxp/test/data/130501_232206_cut.rxp        |   Bin 0 -> 2437128 bytes
 plugins/sqlite/CMakeLists.txt                      |    39 +
 plugins/sqlite/io/SQLiteCommon.hpp                 |   578 +
 plugins/sqlite/io/SQLiteReader.cpp                 |   343 +
 plugins/sqlite/io/SQLiteReader.hpp                 |    91 +
 plugins/sqlite/io/SQLiteWriter.cpp                 |   583 +
 plugins/sqlite/io/SQLiteWriter.hpp                 |   101 +
 plugins/sqlite/test/SQLiteTest.cpp                 |   285 +
 python/CHANGES.txt                                 |     3 +
 python/MANIFEST.in                                 |     5 +
 python/README.rst                                  |    11 +
 python/VERSION.txt                                 |     1 +
 python/pdal/Pipeline.cpp                           |    61 +
 python/pdal/Pipeline.hpp                           |    40 +
 python/pdal/__init__.py                            |     1 +
 python/pdal/libpdalpython.pyx                      |    55 +
 python/pdal/pipeline_xml.py                        |    62 +
 python/setup.py                                    |   172 +
 python/test/__init__.py                            |     2 +
 python/test/test_libpdal.py                        |    55 +
 python/test/test_pipeline.py                       |    51 +
 schemas/16-dim-schema.xml                          |   218 +
 schemas/6-dim-schema.xml                           |   108 +
 schemas/LAS.xsd                                    |   179 +
 schemas/pdal_pipeline.xsd                          |    75 +
 schemas/utf8-schema.xml                            |    18 +
 src/CMakeLists.txt                                 |   215 +
 src/DbReader.cpp                                   |   139 +
 src/DbWriter.cpp                                   |   258 +
 src/DynamicLibrary.cpp                             |   120 +
 src/DynamicLibrary.h                               |    68 +
 src/Filter.cpp                                     |    62 +
 src/GDALUtils.cpp                                  |   120 +
 src/GlobalEnvironment.cpp                          |   106 +
 src/Kernel.cpp                                     |   641 +
 src/KernelFactory.cpp                              |    98 +
 src/KernelSupport.cpp                              |   152 +
 src/Log.cpp                                        |   149 +
 src/Options.cpp                                    |   235 +
 src/PDALUtils.cpp                                  |   228 +
 src/PipelineManager.cpp                            |   123 +
 src/PipelineReader.cpp                             |   546 +
 src/PipelineWriter.cpp                             |   166 +
 src/PluginManager.cpp                              |   432 +
 src/PointLayout.cpp                                |   297 +
 src/PointTable.cpp                                 |   104 +
 src/PointView.cpp                                  |   190 +
 src/QuadIndex.cpp                                  |   906 +
 src/Reader.cpp                                     |    65 +
 src/SpatialReference.cpp                           |   411 +
 src/Stage.cpp                                      |   254 +
 src/StageFactory.cpp                               |   270 +
 src/StageRunner.hpp                                |    66 +
 src/Writer.cpp                                     |   160 +
 src/XMLSchema.cpp                                  |   631 +
 src/gitsha.cpp                                     |     3 +
 src/libpdalcpp                                     |     1 +
 src/pdal_config.cpp                                |   238 +
 src/plang/Array.cpp                                |   199 +
 src/plang/BufferedInvocation.cpp                   |   121 +
 src/plang/CMakeLists.txt                           |    35 +
 src/plang/Environment.cpp                          |   322 +
 src/plang/Invocation.cpp                           |   290 +
 src/plang/Redirector.cpp                           |   216 +
 src/plang/Script.cpp                               |    65 +
 src/prototype.vcxproj                              |   115 +
 src/util/Bounds.cpp                                |   252 +
 src/util/CMakeLists.txt                            |    52 +
 src/util/Charbuf.cpp                               |   122 +
 src/util/FileUtils.cpp                             |   358 +
 src/util/Georeference.cpp                          |    90 +
 src/util/Utils.cpp                                 |   740 +
 test/CMakeLists.txt                                |     8 +
 test/data/apps/pdalinfo_point.txt                  |    28 +
 test/data/apps/pdalinfo_schema.txt                 |   453 +
 test/data/apps/pdalinfo_stage.txt                  |    28 +
 test/data/apps/pdalinfo_stage_nosrs.txt            |    27 +
 test/data/apps/pdalinfo_stats-win32.txt            |  2017 ++
 test/data/apps/pdalinfo_stats.txt                  |   150 +
 test/data/apps/simple.las                          |   Bin 0 -> 36437 bytes
 test/data/apps/simple.laz                          |   Bin 0 -> 22149 bytes
 test/data/autzen/attributes.dbf                    |   Bin 0 -> 223 bytes
 test/data/autzen/attributes.prj                    |     1 +
 test/data/autzen/attributes.qix                    |   Bin 0 -> 84 bytes
 test/data/autzen/attributes.qpj                    |     1 +
 test/data/autzen/attributes.shp                    |   Bin 0 -> 1508 bytes
 test/data/autzen/attributes.shx                    |   Bin 0 -> 148 bytes
 test/data/autzen/autzen-dd.las                     |   Bin 0 -> 36998 bytes
 test/data/autzen/autzen-point-format-3.las         |   Bin 0 -> 5598 bytes
 test/data/autzen/autzen-point-format-3.txt         |   107 +
 test/data/autzen/autzen-selection-dd.wkt           |     1 +
 test/data/autzen/autzen-selection.wkt              |     1 +
 test/data/autzen/autzen-srs.wkt                    |    17 +
 test/data/autzen/autzen-thin-srs.las               |   Bin 0 -> 363585 bytes
 test/data/autzen/autzen-thin.las                   |   Bin 0 -> 362537 bytes
 test/data/autzen/autzen-utm-chipped-25.las         |   Bin 0 -> 37416 bytes
 test/data/autzen/autzen-utm.las                    |   Bin 0 -> 37417 bytes
 test/data/autzen/autzen.jpg                        |   Bin 0 -> 1343370 bytes
 test/data/autzen/autzen.jpg.aux.xml                |    78 +
 test/data/autzen/autzen.las                        |   Bin 0 -> 4962 bytes
 test/data/autzen/autzen.wld                        |     6 +
 test/data/bpf/autzen-dd.bpf                        |   Bin 0 -> 51968 bytes
 ...utzen-utm-chipped-25-v3-deflate-interleaved.bpf |   Bin 0 -> 24110 bytes
 ...autzen-utm-chipped-25-v3-deflate-segregated.bpf |   Bin 0 -> 18853 bytes
 test/data/bpf/autzen-utm-chipped-25-v3-deflate.bpf |   Bin 0 -> 19808 bytes
 ...autzen-utm-chipped-25-v3-fastlz-interleaved.bpf |   Bin 0 -> 29352 bytes
 .../autzen-utm-chipped-25-v3-fastlz-segregated.bpf |   Bin 0 -> 21599 bytes
 test/data/bpf/autzen-utm-chipped-25-v3-fastlz.bpf  |   Bin 0 -> 26970 bytes
 .../bpf/autzen-utm-chipped-25-v3-interleaved.bpf   |   Bin 0 -> 47652 bytes
 .../bpf/autzen-utm-chipped-25-v3-segregated.bpf    |   Bin 0 -> 47652 bytes
 test/data/bpf/autzen-utm-chipped-25-v3.bpf         |   Bin 0 -> 47652 bytes
 test/data/bpf/autzen-utm-chipped-25.bpf            |   Bin 0 -> 51968 bytes
 test/data/bpf/autzen-utm.bpf                       |   Bin 0 -> 51968 bytes
 test/data/bpf/bpf.xml.in                           |    19 +
 test/data/bpf/bpf2nitf.xml.in                      |    54 +
 test/data/bpf/bundle1                              |     1 +
 test/data/bpf/bundle2                              |     1 +
 test/data/bpf/utm15.bpf                            |   Bin 0 -> 896 bytes
 test/data/filters/attribute.xml.in                 |    58 +
 test/data/filters/chip.xml.in                      |    18 +
 test/data/filters/chipper.xml.in                   |    22 +
 test/data/filters/colorize-multi.xml.in            |    92 +
 test/data/filters/colorize.xml.in                  |    51 +
 test/data/filters/crop_reproject.xml.in            |    35 +
 test/data/filters/crop_wkt.xml.in                  |    47 +
 test/data/filters/crop_wkt_2d.xml.in               |    27 +
 .../data/filters/crop_wkt_2d_classification.xml.in |    49 +
 test/data/filters/decimate.xml.in                  |    22 +
 test/data/filters/ferry.xml.in                     |    45 +
 test/data/filters/hexbin-info.xml.in               |    28 +
 test/data/filters/hexbin.txt                       |    34 +
 test/data/filters/hexbin.xml.in                    |    33 +
 test/data/filters/hextest.txt                      |     8 +
 test/data/filters/merge.xml.in                     |    15 +
 test/data/filters/pcl/example_PMF_1.json           |    13 +
 test/data/filters/pcl/example_PMF_2.json           |    18 +
 test/data/filters/pcl/example_PassThrough_1.json   |    18 +
 test/data/filters/pcl/example_PassThrough_2.json   |    28 +
 test/data/filters/pcl/filter_APMF_1.json           |    19 +
 .../filters/pcl/filter_ConditionalRemoval_1.json   |    21 +
 .../filters/pcl/filter_ConditionalRemoval_2.json   |    21 +
 test/data/filters/pcl/filter_GridMinimum.json      |    12 +
 .../filters/pcl/filter_NormalEstimation_1.json     |    21 +
 .../filters/pcl/filter_NormalEstimation_2.json     |    21 +
 test/data/filters/pcl/filter_PMF_1.json            |    19 +
 test/data/filters/pcl/filter_PMF_2.json            |    19 +
 test/data/filters/pcl/filter_PMF_3.json            |    19 +
 test/data/filters/pcl/filter_PMF_4.json            |    19 +
 test/data/filters/pcl/filter_PMF_5.json            |    19 +
 test/data/filters/pcl/filter_PMF_6.json            |    19 +
 test/data/filters/pcl/filter_PMF_7.json            |    19 +
 test/data/filters/pcl/filter_PMF_8.json            |    19 +
 test/data/filters/pcl/filter_PMF_9.json            |    19 +
 test/data/filters/pcl/filter_PassThrough_1.json    |    17 +
 test/data/filters/pcl/filter_PassThrough_2.json    |    17 +
 .../filters/pcl/filter_RadiusOutlierRemoval_1.json |    13 +
 .../filters/pcl/filter_RadiusOutlierRemoval_2.json |    13 +
 .../pcl/filter_StatisticalOutlierRemoval_1.json    |    13 +
 .../pcl/filter_StatisticalOutlierRemoval_2.json    |    13 +
 test/data/filters/pcl/filter_VoxelGrid.json        |    17 +
 test/data/filters/pcl/passthrough.xml              |    18 +
 test/data/filters/range_classification.xml.in      |    22 +
 test/data/filters/range_z.xml.in                   |    23 +
 test/data/filters/range_z_classification.xml.in    |    29 +
 test/data/filters/reproject.xml.in                 |    46 +
 test/data/filters/sort.xml.in                      |    13 +
 test/data/filters/splitter.xml.in                  |    18 +
 test/data/filters/stats.xml.in                     |    15 +
 test/data/hole/autzen-dd.las                       |   Bin 0 -> 36998 bytes
 test/data/hole/crop.xml.in                         |    24 +
 test/data/hole/hole.dbf                            |   Bin 0 -> 76 bytes
 test/data/hole/hole.las                            |   Bin 0 -> 33019 bytes
 test/data/hole/hole.prj                            |     1 +
 test/data/hole/hole.qpj                            |     1 +
 test/data/hole/hole.shp                            |   Bin 0 -> 268 bytes
 test/data/hole/hole.shx                            |   Bin 0 -> 108 bytes
 test/data/hole/make-spurious.py                    |    29 +
 test/data/hole/spurious.las                        |   Bin 0 -> 36998 bytes
 test/data/icebridge/pipeline.xml.in                |     9 +
 test/data/icebridge/twoPoints.h5                   |   Bin 0 -> 8192 bytes
 test/data/io/header.json                           |    38 +
 test/data/io/p2g-writer.xml.in                     |    19 +
 test/data/io/sqlite-reader.xml.in                  |    22 +
 test/data/io/sqlite-writer.xml.in                  |    61 +
 test/data/io/text-writer-csv.xml.in                |    19 +
 test/data/io/text-writer-geojson.xml.in            |    25 +
 test/data/io/text-writer-space-delimited.xml.in    |    20 +
 test/data/las/1.2-with-color-clipped.las           |   Bin 0 -> 36405 bytes
 test/data/las/1.2-with-color.las                   |   Bin 0 -> 36439 bytes
 test/data/las/1.2-with-color.las.wkt               |     1 +
 test/data/las/4_1.las                              |   Bin 0 -> 5572238 bytes
 test/data/las/4_6.las                              |   Bin 0 -> 5971566 bytes
 test/data/las/epsg_4326.las                        |   Bin 0 -> 108453 bytes
 test/data/las/extrabytes.las                       |   Bin 0 -> 66354 bytes
 test/data/las/hextest.las                          |   Bin 0 -> 387 bytes
 test/data/las/interesting.las                      |   Bin 0 -> 37698 bytes
 test/data/las/lots_of_vlr.las                      |   Bin 0 -> 81919 bytes
 test/data/las/mvk-thin.las                         |   Bin 0 -> 179154 bytes
 test/data/las/mvk-thin.las.wkt                     |     1 +
 test/data/las/no-points.las                        |   Bin 0 -> 859 bytes
 test/data/las/noise-clean.las                      |   Bin 0 -> 36439 bytes
 test/data/las/noise-dirty.las                      |   Bin 0 -> 36439 bytes
 test/data/las/permutations/1.0_0.las               |   Bin 0 -> 1027 bytes
 test/data/las/permutations/1.0_1.las               |   Bin 0 -> 1035 bytes
 test/data/las/permutations/1.1_0.las               |   Bin 0 -> 1025 bytes
 test/data/las/permutations/1.1_1.las               |   Bin 0 -> 1033 bytes
 test/data/las/permutations/1.2-no-points.las       |   Bin 0 -> 229 bytes
 test/data/las/permutations/1.2_0.las               |   Bin 0 -> 1025 bytes
 test/data/las/permutations/1.2_1.las               |   Bin 0 -> 1033 bytes
 test/data/las/permutations/1.2_2.las               |   Bin 0 -> 1031 bytes
 test/data/las/permutations/1.2_3.las               |   Bin 0 -> 1039 bytes
 test/data/las/simple.las                           |   Bin 0 -> 36437 bytes
 test/data/las/utm15.las                            |   Bin 0 -> 472 bytes
 test/data/las/utm17.las                            |   Bin 0 -> 1039 bytes
 test/data/laszip/basefile.las                      |   Bin 0 -> 36439 bytes
 test/data/laszip/laszip-generated.laz              |   Bin 0 -> 18219 bytes
 .../laszip/laszip-generated_with2bytespadding.laz  |   Bin 0 -> 18217 bytes
 test/data/laszip/liblas-generated.laz              |   Bin 0 -> 18249 bytes
 test/data/laz/simple.laz                           |   Bin 0 -> 22149 bytes
 test/data/logs/log_py.txt                          |     1 +
 test/data/logs/logtest.txt                         |     1 +
 test/data/logs/logtest_1.txt                       |     1 +
 test/data/logs/logtest_123.txt                     |     5 +
 test/data/logs/logtest_2.txt                       |     2 +
 test/data/logs/logtest_3.txt                       |     2 +
 test/data/misc/data1.dat                           |     1 +
 test/data/misc/data1.txt                           |     3 +
 test/data/misc/data2.dat                           |     1 +
 test/data/misc/data2.txt                           |     3 +
 test/data/misc/data3.dat                           |     1 +
 test/data/misc/data3.txt                           |     5 +
 test/data/misc/data4a.dat                          |     1 +
 test/data/misc/data4b.dat                          |     1 +
 test/data/misc/opts2json.txt                       |    43 +
 test/data/misc/opts2json_meta.txt                  |    43 +
 test/data/mrsid/Tetons_200k.las.sid                |   Bin 0 -> 2572053 bytes
 test/data/nitf/autzen-utm10.las                    |   Bin 0 -> 4962 bytes
 test/data/nitf/autzen-utm10.ntf                    |   Bin 0 -> 766852 bytes
 test/data/nitf/chipper.xml.in                      |    12 +
 test/data/nitf/conversion.xml.in                   |    13 +
 test/data/nitf/las2nitf.xml.in                     |    54 +
 test/data/nitf/reader.xml                          |    14 +
 test/data/nitf/write_laz.xml.in                    |    31 +
 test/data/nitf/write_options.xml.in                |    64 +
 test/data/nitf/write_test1.ntf                     |   Bin 0 -> 36474 bytes
 test/data/optech/sample.csd                        |   Bin 0 -> 71048 bytes
 test/data/oracle/big-read.xml                      |    30 +
 test/data/oracle/big-write.xml                     |    75 +
 test/data/oracle/cleanup.sql                       |    34 +
 test/data/oracle/qfit-read.xml                     |    14 +
 test/data/oracle/qfit-write.xml                    |    81 +
 test/data/oracle/read-colorize.xml                 |    66 +
 test/data/oracle/read.xml                          |    32 +
 test/data/oracle/view-read.xml                     |    39 +
 test/data/oracle/wake-hobu-environment.sh          |     3 +
 test/data/oracle/write.xml                         |    77 +
 test/data/pipeline/bad/pipeline_bad01.xml          |    20 +
 test/data/pipeline/bad/pipeline_bad02.xml          |    19 +
 test/data/pipeline/bad/pipeline_bad03.xml          |    21 +
 test/data/pipeline/bad/pipeline_bad04.xml          |    19 +
 test/data/pipeline/bad/pipeline_bad05.xml          |    24 +
 test/data/pipeline/bad/pipeline_bad06.xml          |    24 +
 test/data/pipeline/bad/pipeline_bad07.xml          |    24 +
 test/data/pipeline/bad/pipeline_bad08.xml          |    19 +
 test/data/pipeline/bad/pipeline_bad09.xml          |    19 +
 test/data/pipeline/bad/pipeline_bad10.xml          |    14 +
 test/data/pipeline/drop_color.xml.in               |    21 +
 test/data/pipeline/pipeline_interpolate.xml.in     |    58 +
 test/data/pipeline/pipeline_metadata_reader.xml.in |     8 +
 test/data/pipeline/pipeline_metadata_writer.xml.in |    54 +
 test/data/pipeline/pipeline_mississippi.xml.in     |    14 +
 .../pipeline/pipeline_mississippi_reverse.xml.in   |    14 +
 test/data/pipeline/pipeline_multioptions.xml.in    |    21 +
 test/data/pipeline/pipeline_read.xml.in            |    13 +
 test/data/pipeline/pipeline_read_notype.xml.in     |    13 +
 test/data/pipeline/pipeline_readcomments.xml.in    |    14 +
 test/data/pipeline/pipeline_write.xml.in           |    31 +
 test/data/pipeline/pipeline_write2.xml.in          |    13 +
 test/data/pipeline/pipeline_writecomments.xml.in   |    19 +
 test/data/plang/from-module.xml.in                 |    13 +
 test/data/plang/predicate-embed.xml.in             |    23 +
 .../plang/predicate-keep-ground-and-unclass.xml.in |    37 +
 test/data/plang/predicate-keep-last-return.xml.in  |    32 +
 .../plang/predicate-keep-specified-returns.xml.in  |    37 +
 .../programmable-update-classifications.xml.in     |    33 +
 test/data/plang/programmable-update-y-dims.xml.in  |    20 +
 test/data/plang/test1.py                           |     9 +
 test/data/ply/no_vertex.ply                        |     3 +
 test/data/ply/simple_binary.ply                    |   Bin 0 -> 244 bytes
 test/data/ply/simple_text.ply                      |    10 +
 test/data/pointbuffer/metadata.txt                 |    14 +
 test/data/qfit/10-word.qi                          |   Bin 0 -> 82120 bytes
 test/data/qfit/14-word.qi                          |   Bin 0 -> 60592 bytes
 test/data/qfit/20100515_152839.atm4bT2.qi          |   Bin 0 -> 497664 bytes
 test/data/qfit/conversion.xml.in                   |    34 +
 test/data/qfit/little-endian-conversion.xml.in     |    37 +
 test/data/qfit/pipeline.xml.in                     |    12 +
 test/data/qfit/reader.xml.in                       |    20 +
 test/data/sbet/2-points.sbet                       |   Bin 0 -> 272 bytes
 test/data/sbet/badfile.sbet                        |   Bin 0 -> 271 bytes
 test/data/sbet/pipeline.xml.in                     |     9 +
 test/data/soci/read-cloud.xml                      |    39 +
 test/data/soci/read.xml                            |    44 +
 test/data/soci/sthelens-write.xml                  |    51 +
 test/data/soci/write-utm.xml                       |    48 +
 test/data/soci/write.xml                           |    51 +
 test/data/terrasolid/20020715-time-color.bin       |   Bin 0 -> 28056 bytes
 test/data/text/TextWriterTest-geojson.json         |     1 +
 test/data/text/text.txt                            |     1 +
 test/data/wkt/0102.las.wkt                         |     1 +
 test/temp/README.txt                               |     1 +
 test/unit/BoundsTest.cpp                           |   296 +
 test/unit/CMakeLists.txt                           |   119 +
 test/unit/CompressionTest.cpp                      |   285 +
 test/unit/ConfigTest.cpp                           |    77 +
 test/unit/FileUtilsTest.cpp                        |   171 +
 test/unit/GeoreferenceTest.cpp                     |   128 +
 test/unit/KDIndexTest.cpp                          |   290 +
 test/unit/LogTest.cpp                              |    85 +
 test/unit/MetadataTest.cpp                         |   312 +
 test/unit/OptionsTest.cpp                          |   363 +
 test/unit/PDALUtilsTest.cpp                        |    70 +
 test/unit/PipelineManagerTest.cpp                  |   126 +
 test/unit/PointContextTest.cpp                     |   186 +
 test/unit/PointTableTest.cpp                       |   178 +
 test/unit/PointViewTest.cpp                        |   448 +
 test/unit/SpatialReferenceTest.cpp                 |   334 +
 test/unit/Support.cpp                              |   363 +
 test/unit/Support.hpp                              |   144 +
 test/unit/SupportTest.cpp                          |   222 +
 test/unit/TestConfig.cpp                           |    41 +
 test/unit/TestConfig.hpp.in                        |    55 +
 test/unit/UserCallbackTest.cpp                     |   109 +
 test/unit/UtilsTest.cpp                            |   331 +
 test/unit/XMLSchemaTest.cpp                        |   272 +
 test/unit/apps/MergeTest.cpp                       |   110 +
 test/unit/apps/pc2pcTest.cpp                       |   181 +
 test/unit/apps/pcinfoTest.cpp                      |   220 +
 test/unit/apps/pcpipelineTest.cpp                  |   289 +
 test/unit/filters/ChipperTest.cpp                  |   232 +
 test/unit/filters/ColorizationFilterTest.cpp       |   171 +
 test/unit/filters/CropFilterTest.cpp               |   243 +
 test/unit/filters/DecimationFilterTest.cpp         |    84 +
 test/unit/filters/FerryFilterTest.cpp              |   108 +
 test/unit/filters/MergeTest.cpp                    |    56 +
 test/unit/filters/RangeFilterTest.cpp              |   310 +
 test/unit/filters/ReprojectionFilterTest.cpp       |   159 +
 test/unit/filters/SortFilterTest.cpp               |   112 +
 test/unit/filters/SplitterTest.cpp                 |   103 +
 test/unit/filters/StatsFilterTest.cpp              |   229 +
 test/unit/filters/TransformationFilterTest.cpp     |   174 +
 test/unit/io/bpf/BPFTest.cpp                       |   555 +
 test/unit/io/buffer/BufferTest.cpp                 |    97 +
 test/unit/io/faux/FauxReaderTest.cpp               |   216 +
 test/unit/io/las/LasReaderTest.cpp                 |   413 +
 test/unit/io/las/LasWriterTest.cpp                 |   649 +
 test/unit/io/oci/oracle_array.cpp                  |   324 +
 test/unit/io/optech/OptechReaderTest.cpp           |   146 +
 test/unit/io/ply/PlyReaderTest.cpp                 |   115 +
 test/unit/io/ply/PlyWriterTest.cpp                 |    77 +
 test/unit/io/qfit/QFITReaderTest.cpp               |   113 +
 test/unit/io/sbet/SbetReaderTest.cpp               |   138 +
 test/unit/io/sbet/SbetWriterTest.cpp               |    96 +
 test/unit/io/terrasolid/TerrasolidReaderTest.cpp   |   128 +
 tools/CMakeLists.txt                               |     1 +
 tools/lasdump/CMakeLists.txt                       |    45 +
 tools/lasdump/Dumper.cpp                           |   215 +
 tools/lasdump/Dumper.hpp                           |    75 +
 tools/lasdump/Header.cpp                           |   223 +
 tools/lasdump/Header.hpp                           |   345 +
 tools/lasdump/Lasdump.hpp                          |    92 +
 tools/lasdump/Vlr.hpp                              |   113 +
 vendor/eigen-3.1.91/Eigen/Array                    |    11 +
 vendor/eigen-3.1.91/Eigen/CMakeLists.txt           |    19 +
 vendor/eigen-3.1.91/Eigen/Cholesky                 |    32 +
 vendor/eigen-3.1.91/Eigen/CholmodSupport           |    45 +
 vendor/eigen-3.1.91/Eigen/Core                     |   377 +
 vendor/eigen-3.1.91/Eigen/Dense                    |     7 +
 vendor/eigen-3.1.91/Eigen/Eigen                    |     2 +
 vendor/eigen-3.1.91/Eigen/Eigen2Support            |    82 +
 vendor/eigen-3.1.91/Eigen/Eigenvalues              |    48 +
 vendor/eigen-3.1.91/Eigen/Geometry                 |    63 +
 vendor/eigen-3.1.91/Eigen/Householder              |    23 +
 vendor/eigen-3.1.91/Eigen/IterativeLinearSolvers   |    40 +
 vendor/eigen-3.1.91/Eigen/Jacobi                   |    26 +
 vendor/eigen-3.1.91/Eigen/LU                       |    41 +
 vendor/eigen-3.1.91/Eigen/LeastSquares             |    32 +
 vendor/eigen-3.1.91/Eigen/MetisSupport             |    28 +
 vendor/eigen-3.1.91/Eigen/OrderingMethods          |    66 +
 vendor/eigen-3.1.91/Eigen/PaStiXSupport            |    46 +
 vendor/eigen-3.1.91/Eigen/PardisoSupport           |    30 +
 vendor/eigen-3.1.91/Eigen/QR                       |    45 +
 vendor/eigen-3.1.91/Eigen/QtAlignedMalloc          |    34 +
 vendor/eigen-3.1.91/Eigen/SPQRSupport              |    29 +
 vendor/eigen-3.1.91/Eigen/SVD                      |    37 +
 vendor/eigen-3.1.91/Eigen/Sparse                   |    27 +
 vendor/eigen-3.1.91/Eigen/SparseCholesky           |    38 +
 vendor/eigen-3.1.91/Eigen/SparseCore               |    64 +
 vendor/eigen-3.1.91/Eigen/SparseLU                 |    46 +
 vendor/eigen-3.1.91/Eigen/SparseQR                 |    29 +
 vendor/eigen-3.1.91/Eigen/StdDeque                 |    27 +
 vendor/eigen-3.1.91/Eigen/StdList                  |    26 +
 vendor/eigen-3.1.91/Eigen/StdVector                |    27 +
 vendor/eigen-3.1.91/Eigen/SuperLUSupport           |    59 +
 vendor/eigen-3.1.91/Eigen/UmfPackSupport           |    36 +
 vendor/eigen-3.1.91/Eigen/src/CMakeLists.txt       |     7 +
 .../eigen-3.1.91/Eigen/src/Cholesky/CMakeLists.txt |     6 +
 vendor/eigen-3.1.91/Eigen/src/Cholesky/LDLT.h      |   599 +
 vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT.h       |   490 +
 vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT_MKL.h   |   102 +
 .../Eigen/src/CholmodSupport/CMakeLists.txt        |     6 +
 .../Eigen/src/CholmodSupport/CholmodSupport.h      |   602 +
 vendor/eigen-3.1.91/Eigen/src/Core/Array.h         |   308 +
 vendor/eigen-3.1.91/Eigen/src/Core/ArrayBase.h     |   228 +
 vendor/eigen-3.1.91/Eigen/src/Core/ArrayWrapper.h  |   254 +
 vendor/eigen-3.1.91/Eigen/src/Core/Assign.h        |   583 +
 .../eigen-3.1.91/Eigen/src/Core/AssignEvaluator.h  |   754 +
 vendor/eigen-3.1.91/Eigen/src/Core/Assign_MKL.h    |   224 +
 vendor/eigen-3.1.91/Eigen/src/Core/BandMatrix.h    |   334 +
 vendor/eigen-3.1.91/Eigen/src/Core/Block.h         |   405 +
 vendor/eigen-3.1.91/Eigen/src/Core/BooleanRedux.h  |   154 +
 vendor/eigen-3.1.91/Eigen/src/Core/CMakeLists.txt  |    10 +
 .../eigen-3.1.91/Eigen/src/Core/CommaInitializer.h |   143 +
 .../eigen-3.1.91/Eigen/src/Core/CoreEvaluators.h   |  1311 ++
 vendor/eigen-3.1.91/Eigen/src/Core/CoreIterators.h |    61 +
 vendor/eigen-3.1.91/Eigen/src/Core/CwiseBinaryOp.h |   229 +
 .../eigen-3.1.91/Eigen/src/Core/CwiseNullaryOp.h   |   864 +
 vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryOp.h  |   126 +
 .../eigen-3.1.91/Eigen/src/Core/CwiseUnaryView.h   |   139 +
 vendor/eigen-3.1.91/Eigen/src/Core/DenseBase.h     |   511 +
 .../eigen-3.1.91/Eigen/src/Core/DenseCoeffsBase.h  |   754 +
 vendor/eigen-3.1.91/Eigen/src/Core/DenseStorage.h  |   331 +
 vendor/eigen-3.1.91/Eigen/src/Core/Diagonal.h      |   237 +
 .../eigen-3.1.91/Eigen/src/Core/DiagonalMatrix.h   |   313 +
 .../eigen-3.1.91/Eigen/src/Core/DiagonalProduct.h  |   113 +
 vendor/eigen-3.1.91/Eigen/src/Core/Dot.h           |   262 +
 vendor/eigen-3.1.91/Eigen/src/Core/EigenBase.h     |   161 +
 vendor/eigen-3.1.91/Eigen/src/Core/Flagged.h       |   140 +
 .../Eigen/src/Core/ForceAlignedAccess.h            |   146 +
 vendor/eigen-3.1.91/Eigen/src/Core/Functors.h      |   985 +
 vendor/eigen-3.1.91/Eigen/src/Core/Fuzzy.h         |   150 +
 .../eigen-3.1.91/Eigen/src/Core/GeneralProduct.h   |   635 +
 .../Eigen/src/Core/GenericPacketMath.h             |   350 +
 .../eigen-3.1.91/Eigen/src/Core/GlobalFunctions.h  |    91 +
 vendor/eigen-3.1.91/Eigen/src/Core/IO.h            |   249 +
 vendor/eigen-3.1.91/Eigen/src/Core/Map.h           |   192 +
 vendor/eigen-3.1.91/Eigen/src/Core/MapBase.h       |   242 +
 vendor/eigen-3.1.91/Eigen/src/Core/MathFunctions.h |   753 +
 vendor/eigen-3.1.91/Eigen/src/Core/Matrix.h        |   405 +
 vendor/eigen-3.1.91/Eigen/src/Core/MatrixBase.h    |   515 +
 vendor/eigen-3.1.91/Eigen/src/Core/NestByValue.h   |   111 +
 vendor/eigen-3.1.91/Eigen/src/Core/NoAlias.h       |   130 +
 vendor/eigen-3.1.91/Eigen/src/Core/NumTraits.h     |   150 +
 .../Eigen/src/Core/PermutationMatrix.h             |   688 +
 .../eigen-3.1.91/Eigen/src/Core/PlainObjectBase.h  |   782 +
 vendor/eigen-3.1.91/Eigen/src/Core/Product.h       |   107 +
 vendor/eigen-3.1.91/Eigen/src/Core/ProductBase.h   |   278 +
 .../Eigen/src/Core/ProductEvaluators.h             |   411 +
 vendor/eigen-3.1.91/Eigen/src/Core/Random.h        |   152 +
 vendor/eigen-3.1.91/Eigen/src/Core/Redux.h         |   408 +
 vendor/eigen-3.1.91/Eigen/src/Core/Ref.h           |   255 +
 vendor/eigen-3.1.91/Eigen/src/Core/Replicate.h     |   177 +
 vendor/eigen-3.1.91/Eigen/src/Core/ReturnByValue.h |    88 +
 vendor/eigen-3.1.91/Eigen/src/Core/Reverse.h       |   224 +
 vendor/eigen-3.1.91/Eigen/src/Core/Select.h        |   162 +
 .../eigen-3.1.91/Eigen/src/Core/SelfAdjointView.h  |   314 +
 .../Eigen/src/Core/SelfCwiseBinaryOp.h             |   197 +
 .../eigen-3.1.91/Eigen/src/Core/SolveTriangular.h  |   260 +
 vendor/eigen-3.1.91/Eigen/src/Core/StableNorm.h    |   190 +
 vendor/eigen-3.1.91/Eigen/src/Core/Stride.h        |   108 +
 vendor/eigen-3.1.91/Eigen/src/Core/Swap.h          |   126 +
 vendor/eigen-3.1.91/Eigen/src/Core/Transpose.h     |   416 +
 .../eigen-3.1.91/Eigen/src/Core/Transpositions.h   |   436 +
 .../eigen-3.1.91/Eigen/src/Core/TriangularMatrix.h |   830 +
 vendor/eigen-3.1.91/Eigen/src/Core/VectorBlock.h   |    95 +
 vendor/eigen-3.1.91/Eigen/src/Core/VectorwiseOp.h  |   641 +
 vendor/eigen-3.1.91/Eigen/src/Core/Visitor.h       |   237 +
 .../Eigen/src/Core/arch/AltiVec/CMakeLists.txt     |     6 +
 .../Eigen/src/Core/arch/AltiVec/Complex.h          |   217 +
 .../Eigen/src/Core/arch/AltiVec/PacketMath.h       |   498 +
 .../Eigen/src/Core/arch/CMakeLists.txt             |     4 +
 .../Eigen/src/Core/arch/Default/CMakeLists.txt     |     6 +
 .../Eigen/src/Core/arch/Default/Settings.h         |    49 +
 .../Eigen/src/Core/arch/NEON/CMakeLists.txt        |     6 +
 .../Eigen/src/Core/arch/NEON/Complex.h             |   259 +
 .../Eigen/src/Core/arch/NEON/PacketMath.h          |   407 +
 .../Eigen/src/Core/arch/SSE/CMakeLists.txt         |     6 +
 .../eigen-3.1.91/Eigen/src/Core/arch/SSE/Complex.h |   442 +
 .../Eigen/src/Core/arch/SSE/MathFunctions.h        |   464 +
 .../Eigen/src/Core/arch/SSE/PacketMath.h           |   644 +
 .../Eigen/src/Core/products/CMakeLists.txt         |     6 +
 .../Eigen/src/Core/products/CoeffBasedProduct.h    |   441 +
 .../src/Core/products/GeneralBlockPanelKernel.h    |  1335 ++
 .../Eigen/src/Core/products/GeneralMatrixMatrix.h  |   427 +
 .../Core/products/GeneralMatrixMatrixTriangular.h  |   278 +
 .../products/GeneralMatrixMatrixTriangular_MKL.h   |   146 +
 .../src/Core/products/GeneralMatrixMatrix_MKL.h    |   118 +
 .../Eigen/src/Core/products/GeneralMatrixVector.h  |   573 +
 .../src/Core/products/GeneralMatrixVector_MKL.h    |   131 +
 .../Eigen/src/Core/products/Parallelizer.h         |   159 +
 .../src/Core/products/SelfadjointMatrixMatrix.h    |   436 +
 .../Core/products/SelfadjointMatrixMatrix_MKL.h    |   295 +
 .../src/Core/products/SelfadjointMatrixVector.h    |   281 +
 .../Core/products/SelfadjointMatrixVector_MKL.h    |   114 +
 .../Eigen/src/Core/products/SelfadjointProduct.h   |   123 +
 .../src/Core/products/SelfadjointRank2Update.h     |    93 +
 .../src/Core/products/TriangularMatrixMatrix.h     |   427 +
 .../src/Core/products/TriangularMatrixMatrix_MKL.h |   309 +
 .../src/Core/products/TriangularMatrixVector.h     |   348 +
 .../src/Core/products/TriangularMatrixVector_MKL.h |   247 +
 .../src/Core/products/TriangularSolverMatrix.h     |   329 +
 .../src/Core/products/TriangularSolverMatrix_MKL.h |   155 +
 .../src/Core/products/TriangularSolverVector.h     |   139 +
 vendor/eigen-3.1.91/Eigen/src/Core/util/BlasUtil.h |   264 +
 .../Eigen/src/Core/util/CMakeLists.txt             |     6 +
 .../eigen-3.1.91/Eigen/src/Core/util/Constants.h   |   438 +
 .../Eigen/src/Core/util/DisableStupidWarnings.h    |    40 +
 .../Eigen/src/Core/util/ForwardDeclarations.h      |   299 +
 .../eigen-3.1.91/Eigen/src/Core/util/MKL_support.h |   109 +
 vendor/eigen-3.1.91/Eigen/src/Core/util/Macros.h   |   416 +
 vendor/eigen-3.1.91/Eigen/src/Core/util/Memory.h   |   974 +
 vendor/eigen-3.1.91/Eigen/src/Core/util/Meta.h     |   243 +
 vendor/eigen-3.1.91/Eigen/src/Core/util/NonMPL2.h  |     3 +
 .../Eigen/src/Core/util/ReenableStupidWarnings.h   |    14 +
 .../Eigen/src/Core/util/StaticAssert.h             |   206 +
 .../eigen-3.1.91/Eigen/src/Core/util/XprHelper.h   |   468 +
 .../eigen-3.1.91/Eigen/src/Eigen2Support/Block.h   |   126 +
 .../Eigen/src/Eigen2Support/CMakeLists.txt         |     8 +
 .../eigen-3.1.91/Eigen/src/Eigen2Support/Cwise.h   |   192 +
 .../Eigen/src/Eigen2Support/CwiseOperators.h       |   298 +
 .../Eigen/src/Eigen2Support/Geometry/AlignedBox.h  |   159 +
 .../Eigen/src/Eigen2Support/Geometry/All.h         |   115 +
 .../Eigen/src/Eigen2Support/Geometry/AngleAxis.h   |   214 +
 .../src/Eigen2Support/Geometry/CMakeLists.txt      |     6 +
 .../Eigen/src/Eigen2Support/Geometry/Hyperplane.h  |   254 +
 .../src/Eigen2Support/Geometry/ParametrizedLine.h  |   141 +
 .../Eigen/src/Eigen2Support/Geometry/Quaternion.h  |   495 +
 .../Eigen/src/Eigen2Support/Geometry/Rotation2D.h  |   145 +
 .../src/Eigen2Support/Geometry/RotationBase.h      |   123 +
 .../Eigen/src/Eigen2Support/Geometry/Scaling.h     |   167 +
 .../Eigen/src/Eigen2Support/Geometry/Transform.h   |   786 +
 .../Eigen/src/Eigen2Support/Geometry/Translation.h |   184 +
 vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LU.h   |   120 +
 vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Lazy.h |    71 +
 .../Eigen/src/Eigen2Support/LeastSquares.h         |   170 +
 .../eigen-3.1.91/Eigen/src/Eigen2Support/Macros.h  |    20 +
 .../Eigen/src/Eigen2Support/MathFunctions.h        |    57 +
 .../eigen-3.1.91/Eigen/src/Eigen2Support/Memory.h  |    45 +
 vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Meta.h |    75 +
 .../eigen-3.1.91/Eigen/src/Eigen2Support/Minor.h   |   117 +
 vendor/eigen-3.1.91/Eigen/src/Eigen2Support/QR.h   |    67 +
 vendor/eigen-3.1.91/Eigen/src/Eigen2Support/SVD.h  |   638 +
 .../Eigen/src/Eigen2Support/TriangularSolver.h     |    42 +
 .../Eigen/src/Eigen2Support/VectorBlock.h          |    94 +
 .../Eigen/src/Eigenvalues/CMakeLists.txt           |     6 +
 .../Eigen/src/Eigenvalues/ComplexEigenSolver.h     |   333 +
 .../Eigen/src/Eigenvalues/ComplexSchur.h           |   456 +
 .../Eigen/src/Eigenvalues/ComplexSchur_MKL.h       |    94 +
 .../Eigen/src/Eigenvalues/EigenSolver.h            |   598 +
 .../Eigen/src/Eigenvalues/GeneralizedEigenSolver.h |   341 +
 .../GeneralizedSelfAdjointEigenSolver.h            |   227 +
 .../src/Eigenvalues/HessenbergDecomposition.h      |   373 +
 .../Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h  |   160 +
 vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealQZ.h |   624 +
 .../eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur.h |   529 +
 .../Eigen/src/Eigenvalues/RealSchur_MKL.h          |    83 +
 .../Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h |   802 +
 .../src/Eigenvalues/SelfAdjointEigenSolver_MKL.h   |    92 +
 .../Eigen/src/Eigenvalues/Tridiagonalization.h     |   557 +
 .../eigen-3.1.91/Eigen/src/Geometry/AlignedBox.h   |   375 +
 vendor/eigen-3.1.91/Eigen/src/Geometry/AngleAxis.h |   233 +
 .../eigen-3.1.91/Eigen/src/Geometry/CMakeLists.txt |     8 +
 .../eigen-3.1.91/Eigen/src/Geometry/EulerAngles.h  |    85 +
 .../eigen-3.1.91/Eigen/src/Geometry/Homogeneous.h  |   307 +
 .../eigen-3.1.91/Eigen/src/Geometry/Hyperplane.h   |   270 +
 .../eigen-3.1.91/Eigen/src/Geometry/OrthoMethods.h |   218 +
 .../Eigen/src/Geometry/ParametrizedLine.h          |   195 +
 .../eigen-3.1.91/Eigen/src/Geometry/Quaternion.h   |   775 +
 .../eigen-3.1.91/Eigen/src/Geometry/Rotation2D.h   |   157 +
 .../eigen-3.1.91/Eigen/src/Geometry/RotationBase.h |   206 +
 vendor/eigen-3.1.91/Eigen/src/Geometry/Scaling.h   |   166 +
 vendor/eigen-3.1.91/Eigen/src/Geometry/Transform.h |  1440 ++
 .../eigen-3.1.91/Eigen/src/Geometry/Translation.h  |   206 +
 vendor/eigen-3.1.91/Eigen/src/Geometry/Umeyama.h   |   177 +
 .../Eigen/src/Geometry/arch/CMakeLists.txt         |     6 +
 .../Eigen/src/Geometry/arch/Geometry_SSE.h         |   115 +
 .../Eigen/src/Householder/BlockHouseholder.h       |    68 +
 .../Eigen/src/Householder/CMakeLists.txt           |     6 +
 .../Eigen/src/Householder/Householder.h            |   171 +
 .../Eigen/src/Householder/HouseholderSequence.h    |   441 +
 .../IterativeLinearSolvers/BasicPreconditioners.h  |   149 +
 .../Eigen/src/IterativeLinearSolvers/BiCGSTAB.h    |   261 +
 .../src/IterativeLinearSolvers/CMakeLists.txt      |     6 +
 .../src/IterativeLinearSolvers/ConjugateGradient.h |   265 +
 .../src/IterativeLinearSolvers/IncompleteLUT.h     |   468 +
 .../IterativeLinearSolvers/IterativeSolverBase.h   |   254 +
 .../eigen-3.1.91/Eigen/src/Jacobi/CMakeLists.txt   |     6 +
 vendor/eigen-3.1.91/Eigen/src/Jacobi/Jacobi.h      |   433 +
 vendor/eigen-3.1.91/Eigen/src/LU/CMakeLists.txt    |     8 +
 vendor/eigen-3.1.91/Eigen/src/LU/Determinant.h     |   101 +
 vendor/eigen-3.1.91/Eigen/src/LU/FullPivLU.h       |   742 +
 vendor/eigen-3.1.91/Eigen/src/LU/Inverse.h         |   400 +
 vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU.h    |   501 +
 .../eigen-3.1.91/Eigen/src/LU/PartialPivLU_MKL.h   |    85 +
 .../eigen-3.1.91/Eigen/src/LU/arch/CMakeLists.txt  |     6 +
 .../eigen-3.1.91/Eigen/src/LU/arch/Inverse_SSE.h   |   329 +
 .../Eigen/src/MetisSupport/CMakeLists.txt          |     6 +
 .../Eigen/src/MetisSupport/MetisSupport.h          |   137 +
 .../eigen-3.1.91/Eigen/src/OrderingMethods/Amd.h   |   435 +
 .../Eigen/src/OrderingMethods/CMakeLists.txt       |     6 +
 .../Eigen/src/OrderingMethods/Eigen_Colamd.h       |  1850 ++
 .../Eigen/src/OrderingMethods/Ordering.h           |   150 +
 .../Eigen/src/PaStiXSupport/CMakeLists.txt         |     6 +
 .../Eigen/src/PaStiXSupport/PaStiXSupport.h        |   721 +
 .../Eigen/src/PardisoSupport/CMakeLists.txt        |     6 +
 .../Eigen/src/PardisoSupport/PardisoSupport.h      |   592 +
 vendor/eigen-3.1.91/Eigen/src/QR/CMakeLists.txt    |     6 +
 .../Eigen/src/QR/ColPivHouseholderQR.h             |   555 +
 .../Eigen/src/QR/ColPivHouseholderQR_MKL.h         |    99 +
 .../Eigen/src/QR/FullPivHouseholderQR.h            |   598 +
 vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR.h   |   351 +
 .../eigen-3.1.91/Eigen/src/QR/HouseholderQR_MKL.h  |    69 +
 .../Eigen/src/SPQRSupport/CMakeLists.txt           |     6 +
 .../Eigen/src/SPQRSupport/SuiteSparseQRSupport.h   |   304 +
 vendor/eigen-3.1.91/Eigen/src/SVD/CMakeLists.txt   |     6 +
 vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD.h      |   884 +
 vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD_MKL.h  |    92 +
 .../Eigen/src/SVD/UpperBidiagonalization.h         |   148 +
 .../Eigen/src/SparseCholesky/CMakeLists.txt        |     6 +
 .../Eigen/src/SparseCholesky/SimplicialCholesky.h  |   667 +
 .../src/SparseCholesky/SimplicialCholesky_impl.h   |   199 +
 .../eigen-3.1.91/Eigen/src/SparseCore/AmbiVector.h |   373 +
 .../Eigen/src/SparseCore/CMakeLists.txt            |     6 +
 .../Eigen/src/SparseCore/CompressedStorage.h       |   233 +
 .../SparseCore/ConservativeSparseSparseProduct.h   |   245 +
 .../Eigen/src/SparseCore/CoreIterators.h           |    61 +
 .../Eigen/src/SparseCore/MappedSparseMatrix.h      |   179 +
 .../Eigen/src/SparseCore/SparseAssign.h            |     0
 .../Eigen/src/SparseCore/SparseBlock.h             |   403 +
 .../Eigen/src/SparseCore/SparseColEtree.h          |   204 +
 .../Eigen/src/SparseCore/SparseCwiseBinaryOp.h     |   324 +
 .../Eigen/src/SparseCore/SparseCwiseUnaryOp.h      |   163 +
 .../Eigen/src/SparseCore/SparseDenseProduct.h      |   300 +
 .../Eigen/src/SparseCore/SparseDiagonalProduct.h   |   192 +
 .../eigen-3.1.91/Eigen/src/SparseCore/SparseDot.h  |   101 +
 .../Eigen/src/SparseCore/SparseFuzzy.h             |    26 +
 .../Eigen/src/SparseCore/SparseMatrix.h            |  1219 ++
 .../Eigen/src/SparseCore/SparseMatrixBase.h        |   448 +
 .../Eigen/src/SparseCore/SparsePermutation.h       |   148 +
 .../Eigen/src/SparseCore/SparseProduct.h           |   187 +
 .../Eigen/src/SparseCore/SparseRedux.h             |    45 +
 .../Eigen/src/SparseCore/SparseSelfAdjointView.h   |   480 +
 .../SparseCore/SparseSparseProductWithPruning.h    |   149 +
 .../Eigen/src/SparseCore/SparseTranspose.h         |    61 +
 .../Eigen/src/SparseCore/SparseTriangularView.h    |   164 +
 .../eigen-3.1.91/Eigen/src/SparseCore/SparseUtil.h |   173 +
 .../Eigen/src/SparseCore/SparseVector.h            |   412 +
 .../eigen-3.1.91/Eigen/src/SparseCore/SparseView.h |    98 +
 .../Eigen/src/SparseCore/TriangularSolver.h        |   334 +
 .../eigen-3.1.91/Eigen/src/SparseLU/CMakeLists.txt |     6 +
 vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU.h  |   618 +
 .../eigen-3.1.91/Eigen/src/SparseLU/SparseLUImpl.h |    64 +
 .../Eigen/src/SparseLU/SparseLU_Memory.h           |   222 +
 .../Eigen/src/SparseLU/SparseLU_Structs.h          |   111 +
 .../Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h |   294 +
 .../Eigen/src/SparseLU/SparseLU_Utils.h            |    80 +
 .../Eigen/src/SparseLU/SparseLU_column_bmod.h      |   180 +
 .../Eigen/src/SparseLU/SparseLU_column_dfs.h       |   177 +
 .../Eigen/src/SparseLU/SparseLU_copy_to_ucol.h     |   106 +
 .../Eigen/src/SparseLU/SparseLU_gemm_kernel.h      |   279 +
 .../Eigen/src/SparseLU/SparseLU_heap_relax_snode.h |   127 +
 .../Eigen/src/SparseLU/SparseLU_kernel_bmod.h      |   130 +
 .../Eigen/src/SparseLU/SparseLU_panel_bmod.h       |   223 +
 .../Eigen/src/SparseLU/SparseLU_panel_dfs.h        |   258 +
 .../Eigen/src/SparseLU/SparseLU_pivotL.h           |   134 +
 .../Eigen/src/SparseLU/SparseLU_pruneL.h           |   135 +
 .../Eigen/src/SparseLU/SparseLU_relax_snode.h      |    83 +
 .../eigen-3.1.91/Eigen/src/SparseQR/CMakeLists.txt |     6 +
 vendor/eigen-3.1.91/Eigen/src/SparseQR/SparseQR.h  |   588 +
 .../Eigen/src/StlSupport/CMakeLists.txt            |     6 +
 .../eigen-3.1.91/Eigen/src/StlSupport/StdDeque.h   |   134 +
 vendor/eigen-3.1.91/Eigen/src/StlSupport/StdList.h |   114 +
 .../eigen-3.1.91/Eigen/src/StlSupport/StdVector.h  |   126 +
 vendor/eigen-3.1.91/Eigen/src/StlSupport/details.h |    84 +
 .../Eigen/src/SuperLUSupport/CMakeLists.txt        |     6 +
 .../Eigen/src/SuperLUSupport/SuperLUSupport.h      |  1026 +
 .../Eigen/src/UmfPackSupport/CMakeLists.txt        |     6 +
 .../Eigen/src/UmfPackSupport/UmfPackSupport.h      |   432 +
 vendor/eigen-3.1.91/Eigen/src/misc/CMakeLists.txt  |     6 +
 vendor/eigen-3.1.91/Eigen/src/misc/Image.h         |    84 +
 vendor/eigen-3.1.91/Eigen/src/misc/Kernel.h        |    81 +
 vendor/eigen-3.1.91/Eigen/src/misc/Solve.h         |    76 +
 vendor/eigen-3.1.91/Eigen/src/misc/SparseSolve.h   |   128 +
 vendor/eigen-3.1.91/Eigen/src/misc/blas.h          |   658 +
 .../Eigen/src/plugins/ArrayCwiseBinaryOps.h        |   211 +
 .../Eigen/src/plugins/ArrayCwiseUnaryOps.h         |   203 +
 .../eigen-3.1.91/Eigen/src/plugins/BlockMethods.h  |   747 +
 .../eigen-3.1.91/Eigen/src/plugins/CMakeLists.txt  |     6 +
 .../Eigen/src/plugins/CommonCwiseBinaryOps.h       |    46 +
 .../Eigen/src/plugins/CommonCwiseUnaryOps.h        |   172 +
 .../Eigen/src/plugins/MatrixCwiseBinaryOps.h       |   126 +
 .../Eigen/src/plugins/MatrixCwiseUnaryOps.h        |    67 +
 vendor/gtest-1.7.0/CHANGES                         |   157 +
 vendor/gtest-1.7.0/CMakeLists.txt                  |   252 +
 vendor/gtest-1.7.0/CONTRIBUTORS                    |    37 +
 vendor/gtest-1.7.0/LICENSE                         |    28 +
 vendor/gtest-1.7.0/README                          |   435 +
 vendor/gtest-1.7.0/aclocal.m4                      |  1198 ++
 vendor/gtest-1.7.0/build-aux/config.guess          |  1530 ++
 vendor/gtest-1.7.0/build-aux/config.h.in           |    69 +
 vendor/gtest-1.7.0/build-aux/config.sub            |  1773 ++
 vendor/gtest-1.7.0/build-aux/depcomp               |   688 +
 vendor/gtest-1.7.0/build-aux/install-sh            |   527 +
 vendor/gtest-1.7.0/build-aux/ltmain.sh             |  9661 +++++++++
 vendor/gtest-1.7.0/build-aux/missing               |   331 +
 vendor/gtest-1.7.0/cmake/internal_utils.cmake      |   227 +
 vendor/gtest-1.7.0/codegear/gtest.cbproj           |   138 +
 vendor/gtest-1.7.0/codegear/gtest.groupproj        |    54 +
 vendor/gtest-1.7.0/codegear/gtest_all.cc           |    38 +
 vendor/gtest-1.7.0/codegear/gtest_link.cc          |    40 +
 vendor/gtest-1.7.0/codegear/gtest_main.cbproj      |    82 +
 vendor/gtest-1.7.0/codegear/gtest_unittest.cbproj  |    88 +
 vendor/gtest-1.7.0/configure                       | 18222 +++++++++++++++++
 vendor/gtest-1.7.0/configure.ac                    |    68 +
 vendor/gtest-1.7.0/fused-src/gtest/gtest-all.cc    |  9592 +++++++++
 vendor/gtest-1.7.0/fused-src/gtest/gtest.h         | 20061 +++++++++++++++++++
 vendor/gtest-1.7.0/fused-src/gtest/gtest_main.cc   |    38 +
 .../gtest-1.7.0/include/gtest/gtest-death-test.h   |   294 +
 vendor/gtest-1.7.0/include/gtest/gtest-message.h   |   250 +
 .../gtest-1.7.0/include/gtest/gtest-param-test.h   |  1421 ++
 .../include/gtest/gtest-param-test.h.pump          |   487 +
 vendor/gtest-1.7.0/include/gtest/gtest-printers.h  |   855 +
 vendor/gtest-1.7.0/include/gtest/gtest-spi.h       |   232 +
 vendor/gtest-1.7.0/include/gtest/gtest-test-part.h |   179 +
 .../gtest-1.7.0/include/gtest/gtest-typed-test.h   |   259 +
 vendor/gtest-1.7.0/include/gtest/gtest.h           |  2291 +++
 vendor/gtest-1.7.0/include/gtest/gtest_pred_impl.h |   358 +
 vendor/gtest-1.7.0/include/gtest/gtest_prod.h      |    58 +
 .../gtest/internal/gtest-death-test-internal.h     |   319 +
 .../include/gtest/internal/gtest-filepath.h        |   206 +
 .../include/gtest/internal/gtest-internal.h        |  1158 ++
 .../include/gtest/internal/gtest-linked_ptr.h      |   233 +
 .../gtest/internal/gtest-param-util-generated.h    |  5143 +++++
 .../internal/gtest-param-util-generated.h.pump     |   301 +
 .../include/gtest/internal/gtest-param-util.h      |   619 +
 .../include/gtest/internal/gtest-port.h            |  1948 ++
 .../include/gtest/internal/gtest-string.h          |   167 +
 .../include/gtest/internal/gtest-tuple.h           |  1012 +
 .../include/gtest/internal/gtest-tuple.h.pump      |   339 +
 .../include/gtest/internal/gtest-type-util.h       |  3331 +++
 .../include/gtest/internal/gtest-type-util.h.pump  |   297 +
 vendor/gtest-1.7.0/m4/acx_pthread.m4               |   363 +
 vendor/gtest-1.7.0/m4/gtest.m4                     |    74 +
 vendor/gtest-1.7.0/m4/libtool.m4                   |  8001 ++++++++
 vendor/gtest-1.7.0/m4/ltoptions.m4                 |   384 +
 vendor/gtest-1.7.0/m4/ltsugar.m4                   |   123 +
 vendor/gtest-1.7.0/m4/ltversion.m4                 |    23 +
 vendor/gtest-1.7.0/m4/lt~obsolete.m4               |    98 +
 vendor/gtest-1.7.0/msvc/gtest-md.vcproj            |   126 +
 vendor/gtest-1.7.0/msvc/gtest.vcproj               |   126 +
 vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj       |   129 +
 vendor/gtest-1.7.0/msvc/gtest_main.vcproj          |   129 +
 vendor/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj  |   164 +
 vendor/gtest-1.7.0/msvc/gtest_prod_test.vcproj     |   164 +
 vendor/gtest-1.7.0/msvc/gtest_unittest-md.vcproj   |   147 +
 vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj      |   147 +
 vendor/gtest-1.7.0/samples/prime_tables.h          |   123 +
 vendor/gtest-1.7.0/samples/sample1.cc              |    68 +
 vendor/gtest-1.7.0/samples/sample1.h               |    43 +
 vendor/gtest-1.7.0/samples/sample10_unittest.cc    |   144 +
 vendor/gtest-1.7.0/samples/sample1_unittest.cc     |   153 +
 vendor/gtest-1.7.0/samples/sample2.cc              |    56 +
 vendor/gtest-1.7.0/samples/sample2.h               |    85 +
 vendor/gtest-1.7.0/samples/sample2_unittest.cc     |   109 +
 vendor/gtest-1.7.0/samples/sample3-inl.h           |   172 +
 vendor/gtest-1.7.0/samples/sample3_unittest.cc     |   151 +
 vendor/gtest-1.7.0/samples/sample4.cc              |    46 +
 vendor/gtest-1.7.0/samples/sample4.h               |    53 +
 vendor/gtest-1.7.0/samples/sample4_unittest.cc     |    45 +
 vendor/gtest-1.7.0/samples/sample5_unittest.cc     |   199 +
 vendor/gtest-1.7.0/samples/sample6_unittest.cc     |   224 +
 vendor/gtest-1.7.0/samples/sample7_unittest.cc     |   130 +
 vendor/gtest-1.7.0/samples/sample8_unittest.cc     |   173 +
 vendor/gtest-1.7.0/samples/sample9_unittest.cc     |   160 +
 vendor/gtest-1.7.0/src/gtest-all.cc                |    48 +
 vendor/gtest-1.7.0/src/gtest-death-test.cc         |  1344 ++
 vendor/gtest-1.7.0/src/gtest-filepath.cc           |   382 +
 vendor/gtest-1.7.0/src/gtest-internal-inl.h        |  1218 ++
 vendor/gtest-1.7.0/src/gtest-port.cc               |   805 +
 vendor/gtest-1.7.0/src/gtest-printers.cc           |   363 +
 vendor/gtest-1.7.0/src/gtest-test-part.cc          |   110 +
 vendor/gtest-1.7.0/src/gtest-typed-test.cc         |   110 +
 vendor/gtest-1.7.0/src/gtest.cc                    |  5015 +++++
 vendor/gtest-1.7.0/src/gtest_main.cc               |    38 +
 .../gtest-1.7.0/test/gtest-death-test_ex_test.cc   |    93 +
 vendor/gtest-1.7.0/test/gtest-death-test_test.cc   |  1367 ++
 vendor/gtest-1.7.0/test/gtest-filepath_test.cc     |   680 +
 vendor/gtest-1.7.0/test/gtest-linked_ptr_test.cc   |   154 +
 vendor/gtest-1.7.0/test/gtest-listener_test.cc     |   310 +
 vendor/gtest-1.7.0/test/gtest-message_test.cc      |   159 +
 vendor/gtest-1.7.0/test/gtest-options_test.cc      |   215 +
 vendor/gtest-1.7.0/test/gtest-param-test2_test.cc  |    65 +
 vendor/gtest-1.7.0/test/gtest-param-test_test.cc   |   904 +
 vendor/gtest-1.7.0/test/gtest-param-test_test.h    |    57 +
 vendor/gtest-1.7.0/test/gtest-port_test.cc         |  1253 ++
 vendor/gtest-1.7.0/test/gtest-printers_test.cc     |  1566 ++
 vendor/gtest-1.7.0/test/gtest-test-part_test.cc    |   208 +
 vendor/gtest-1.7.0/test/gtest-tuple_test.cc        |   320 +
 vendor/gtest-1.7.0/test/gtest-typed-test2_test.cc  |    45 +
 vendor/gtest-1.7.0/test/gtest-typed-test_test.cc   |   360 +
 vendor/gtest-1.7.0/test/gtest-typed-test_test.h    |    66 +
 vendor/gtest-1.7.0/test/gtest-unittest-api_test.cc |   341 +
 vendor/gtest-1.7.0/test/gtest_all_test.cc          |    47 +
 .../test/gtest_break_on_failure_unittest.py        |   212 +
 .../test/gtest_break_on_failure_unittest_.cc       |    88 +
 .../test/gtest_catch_exceptions_test.py            |   237 +
 .../test/gtest_catch_exceptions_test_.cc           |   311 +
 vendor/gtest-1.7.0/test/gtest_color_test.py        |   130 +
 vendor/gtest-1.7.0/test/gtest_color_test_.cc       |    71 +
 vendor/gtest-1.7.0/test/gtest_env_var_test.py      |   103 +
 vendor/gtest-1.7.0/test/gtest_env_var_test_.cc     |   126 +
 vendor/gtest-1.7.0/test/gtest_environment_test.cc  |   192 +
 vendor/gtest-1.7.0/test/gtest_filter_unittest.py   |   633 +
 vendor/gtest-1.7.0/test/gtest_filter_unittest_.cc  |   140 +
 vendor/gtest-1.7.0/test/gtest_help_test.py         |   172 +
 vendor/gtest-1.7.0/test/gtest_help_test_.cc        |    46 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest.py  |   207 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest_.cc |   157 +
 vendor/gtest-1.7.0/test/gtest_main_unittest.cc     |    45 +
 vendor/gtest-1.7.0/test/gtest_no_test_unittest.cc  |    56 +
 vendor/gtest-1.7.0/test/gtest_output_test.py       |   335 +
 vendor/gtest-1.7.0/test/gtest_output_test_.cc      |  1034 +
 .../test/gtest_output_test_golden_lin.txt          |   720 +
 .../gtest-1.7.0/test/gtest_pred_impl_unittest.cc   |  2427 +++
 .../gtest-1.7.0/test/gtest_premature_exit_test.cc  |   141 +
 vendor/gtest-1.7.0/test/gtest_prod_test.cc         |    57 +
 vendor/gtest-1.7.0/test/gtest_repeat_test.cc       |   253 +
 vendor/gtest-1.7.0/test/gtest_shuffle_test.py      |   325 +
 vendor/gtest-1.7.0/test/gtest_shuffle_test_.cc     |   103 +
 vendor/gtest-1.7.0/test/gtest_sole_header_test.cc  |    57 +
 vendor/gtest-1.7.0/test/gtest_stress_test.cc       |   256 +
 vendor/gtest-1.7.0/test/gtest_test_utils.py        |   320 +
 .../test/gtest_throw_on_failure_ex_test.cc         |    92 +
 .../test/gtest_throw_on_failure_test.py            |   171 +
 .../test/gtest_throw_on_failure_test_.cc           |    72 +
 .../gtest-1.7.0/test/gtest_uninitialized_test.py   |    70 +
 .../gtest-1.7.0/test/gtest_uninitialized_test_.cc  |    43 +
 vendor/gtest-1.7.0/test/gtest_unittest.cc          |  7415 +++++++
 .../gtest-1.7.0/test/gtest_xml_outfile1_test_.cc   |    49 +
 .../gtest-1.7.0/test/gtest_xml_outfile2_test_.cc   |    49 +
 vendor/gtest-1.7.0/test/gtest_xml_outfiles_test.py |   132 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest.py  |   307 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest_.cc |   181 +
 vendor/gtest-1.7.0/test/gtest_xml_test_utils.py    |   194 +
 vendor/gtest-1.7.0/test/production.cc              |    36 +
 vendor/gtest-1.7.0/test/production.h               |    55 +
 .../gtest-1.7.0/xcode/Config/DebugProject.xcconfig |    30 +
 .../xcode/Config/FrameworkTarget.xcconfig          |    17 +
 vendor/gtest-1.7.0/xcode/Config/General.xcconfig   |    41 +
 .../xcode/Config/ReleaseProject.xcconfig           |    32 +
 .../xcode/Config/StaticLibraryTarget.xcconfig      |    18 +
 .../gtest-1.7.0/xcode/Config/TestTarget.xcconfig   |     8 +
 vendor/gtest-1.7.0/xcode/Resources/Info.plist      |    30 +
 .../xcode/Samples/FrameworkSample/Info.plist       |    28 +
 .../xcode/Samples/FrameworkSample/runtests.sh      |    62 +
 .../xcode/Samples/FrameworkSample/widget.cc        |    63 +
 .../xcode/Samples/FrameworkSample/widget.h         |    59 +
 .../xcode/Samples/FrameworkSample/widget_test.cc   |    68 +
 vendor/gtest-1.7.0/xcode/Scripts/runtests.sh       |    65 +
 .../gtest-1.7.0/xcode/Scripts/versiongenerate.py   |   100 +
 vendor/nanoflann-1.1.8/nanoflann.hpp               |  1460 ++
 vendor/rply-1.1.3/LICENSE                          |    20 +
 vendor/rply-1.1.3/etc/convert.c                    |   130 +
 vendor/rply-1.1.3/etc/dump.c                       |    44 +
 vendor/rply-1.1.3/etc/input.ply                    |    16 +
 vendor/rply-1.1.3/etc/sconvert.c                   |    64 +
 vendor/rply-1.1.3/manual/manual.html               |  1056 +
 vendor/rply-1.1.3/manual/reference.css             |    54 +
 vendor/rply-1.1.3/manual/rply.png                  |   Bin 0 -> 6232 bytes
 vendor/rply-1.1.3/rply.c                           |  1593 ++
 vendor/rply-1.1.3/rply.h                           |   376 +
 1443 files changed, 359380 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..32cff87
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,147 @@
+#
+# these are generated by cmake
+#
+pdal_defines.h
+plugins/pgpointcloud/Pgtest-Support.hpp
+
+#
+# rst outputs
+#
+*.pdf
+
+#
+# cmake stuff
+#
+PDALConfig.cmake
+PDALConfigVersion.cmake
+PDALTargets.cmake
+CMakeCache.txt
+CMakeFiles/
+CPackConfig.cmake
+CPackSourceConfig.cmake
+cmake_install.cmake
+CTestTestfile.cmake
+Testing/
+test/temp/
+apps/pdal-config
+apps/pdal.pc
+src/CMakeScripts/
+apps/CMakeScripts/
+CMakeScripts/
+_CPack_Packages/
+install_manifest.txt
+
+#
+# visual studio cruft
+#
+Debug/
+Release/
+RelWithDebInfo/
+ipch/
+*.sln
+*.vcxproj
+*.vcxproj.filters
+*.vcxproj.user
+*.csproj.user
+*.vcproj.*.user
+*.sdf
+*.suo
+*.opensdf
+*.sln.docstates
+
+#
+# doxygen cruft
+#
+doc/doxygen/html
+doc/doxygen/xml
+
+#
+# test stuff
+#
+test/temp/*.txt
+test/temp/*.las
+test/temp/*.laz
+test/data/local
+
+#
+# OS X stuff
+#
+.DS_Store
+
+_build
+build
+Makefile
+doc/build
+bin/
+lib/
+test/unit/CMakeScripts/
+src/gitsha.cpp
+.vagrant/
+test/unit/TestConfig.hpp
+*.pyc
+
+test/data/bpf/bpf.xml
+test/data/bpf/bpf2nitf.xml
+test/data/filters/attribute.xml
+test/data/filters/chip.xml
+test/data/filters/chipper.xml
+test/data/filters/colorize-multi.xml
+test/data/filters/colorize.xml
+test/data/filters/crop_reproject.xml
+test/data/filters/crop_wkt.xml
+test/data/filters/crop_wkt_2d.xml
+test/data/filters/crop_wkt_2d_classification.xml
+test/data/filters/decimate.xml
+test/data/filters/ferry.xml
+test/data/filters/hexbin-info.xml
+test/data/filters/hexbin.xml
+test/data/filters/merge.xml
+test/data/filters/range_classification.xml
+test/data/filters/range_z.xml
+test/data/filters/range_z_classification.xml
+test/data/filters/reproject.xml
+test/data/filters/sort.xml
+test/data/filters/splitter.xml
+test/data/filters/stats.xml
+test/data/hole/crop.xml
+test/data/icebridge/pipeline.xml
+test/data/io/p2g-writer.xml
+test/data/io/sqlite-reader.xml
+test/data/io/sqlite-writer.xml
+test/data/io/text-writer-csv.xml
+test/data/io/text-writer-geojson.xml
+test/data/io/text-writer-space-delimited.xml
+test/data/nitf/chipper.xml
+test/data/nitf/conversion.xml
+test/data/nitf/las2nitf.xml
+test/data/nitf/write_laz.xml
+test/data/nitf/write_options.xml
+test/data/pipeline/drop_color.xml
+test/data/pipeline/pipeline_interpolate.xml
+test/data/pipeline/pipeline_metadata_reader.xml
+test/data/pipeline/pipeline_metadata_writer.xml
+test/data/pipeline/pipeline_mississippi.xml
+test/data/pipeline/pipeline_mississippi_reverse.xml
+test/data/pipeline/pipeline_multioptions.xml
+test/data/pipeline/pipeline_read.xml
+test/data/pipeline/pipeline_read_notype.xml
+test/data/pipeline/pipeline_readcomments.xml
+test/data/pipeline/pipeline_write.xml
+test/data/pipeline/pipeline_write2.xml
+test/data/pipeline/pipeline_writecomments.xml
+test/data/plang/from-module.xml
+test/data/plang/predicate-embed.xml
+test/data/plang/predicate-keep-ground-and-unclass.xml
+test/data/plang/predicate-keep-last-return.xml
+test/data/plang/predicate-keep-specified-returns.xml
+test/data/plang/programmable-update-y-dims.xml
+test/data/qfit/conversion.xml
+test/data/qfit/little-endian-conversion.xml
+test/data/qfit/pipeline.xml
+test/data/qfit/reader.xml
+test/data/sbet/pipeline.xml
+
+python/*.egg*
+python/build/*
+python/pdal/libpdalpython.so
+python/pdal/libpdalpython.cpp
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..49ec64e
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,25 @@
+# .travis.yml
+# Configure Travis CI service for http://github.com/PDAL
+language: cpp
+
+compiler:
+  - g++
+  - clang
+
+env:
+  - PDAL_OPTIONAL_COMPONENTS=all
+  - PDAL_OPTIONAL_COMPONENTS=none
+
+before_install: ./scripts/ci/before_install.sh
+
+script: ./scripts/ci/script.sh
+
+notifications:
+  on_success: always
+  on_failure: always
+  irc: chat.freenode.net#pdal
+  slack:
+    rooms:
+      secure: AjatYRAUpsczjENkpHPFiLLZ/leDlzx4TH+oPQYZCpA4WpJdNRy0IB4oMR2IYiY+qz0nHDbeMTBvF0l8S6NknZAz20f8buf4IkrdXymBQBOTmLHMWbpgHuSCCu7xMwtG6thjMEmBOXm5UgCcdqvlchcaoAUunyprXQWgJwI+tHE=
+    on_failure: always
+    on_success: change
diff --git a/AUTHORS.txt b/AUTHORS.txt
new file mode 100644
index 0000000..b1dcb78
--- /dev/null
+++ b/AUTHORS.txt
@@ -0,0 +1,37 @@
+The PDAL team acknowledges and thanks the following people and companies for
+their contributions to this project. The open source community appreciates
+their efforts.
+
+Howard Butler
+  Hobu, Inc.
+  howard at hobu.co
+
+Michael P. Gerlek
+  Flaxen Geo Consulting
+  mpg at flaxen.com
+
+Andrew Bell
+  Hobu, Inc.
+  andrew at hobu.co
+
+Paul Ramsey
+  Boundless
+  pramsey at cleverelephant.ca
+
+Bradley Chambers
+  RadiantBlue
+  brad dot chambers at gmail.com
+
+Mateusz Loskot
+  mateusz at loskot.net
+
+Chris Foster
+  https://github.com/c42f
+
+Pete Gadomski
+  USACE
+  pete dot gadomski at gmail.com
+
+Kirk McKelvey
+  LizardTech
+  kmckelvey at lizardtech.com
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..fddd41e
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,368 @@
+#
+# top-level CMake configuration file for PDAL
+#
+# (based originally on the libLAS files copyright Mateusz Loskot)
+
+cmake_minimum_required(VERSION 2.8.11)
+
+project(PDAL CXX C)
+string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
+
+set(ROOT_DIR "${PROJECT_SOURCE_DIR}")
+include(${ROOT_DIR}/cmake/common.cmake NO_POLICY_SCOPE)
+
+#------------------------------------------------------------------------------
+# internal cmake settings
+#------------------------------------------------------------------------------
+
+set(CMAKE_COLOR_MAKEFILE ON)
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+include(FeatureSummary)
+
+# Allow advanced users to generate Makefiles printing detailed commands
+mark_as_advanced(CMAKE_VERBOSE_MAKEFILE)
+
+#------------------------------------------------------------------------------
+# PDAL general settings
+#------------------------------------------------------------------------------
+
+# the next line is the ONLY place in the entire pdal system where
+# the version info is hard-coded
+set(PDAL_VERSION_STRING "1.0.0" CACHE STRING "PDAL version" FORCE)
+
+DISSECT_VERSION()
+GET_OS_INFO()
+SET_INSTALL_DIRS()
+
+set(PDAL_API_VERSION "1")
+set(PDAL_BUILD_VERSION "1.0.0")
+
+# Name of C++ library
+
+#
+# To facilitate one-library linking, we do special things for various platforms.
+#
+# On Linux we install a linker script that we call libpdalcpp.so and it
+# in turn links libpdal_base.so and libpdal_util.so
+#
+# On OSX we reexport the symbols from libpdal_util.dylib into libpdalcpp.dylib
+# See src/CMakeLists.txt for the rest of the magic.
+#
+if (APPLE OR WINDOWS)
+    set(PDAL_LIB_NAME pdalcpp)
+    set(PDAL_BASE_LIB_NAME pdalcpp)
+    set(PDAL_UTIL_LIB_NAME pdal_util)
+    set(PDAL_PLANG_LIB_NAME pdal_plang)
+else()
+    set(PDAL_LIB_NAME pdalcpp)
+    set(PDAL_BASE_LIB_NAME pdal_base)
+    set(PDAL_UTIL_LIB_NAME pdal_util)
+    set(PDAL_PLANG_LIB_NAME pdal_plang)
+endif()
+
+set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)
+
+set(PDAL_OUTPUT_LIB_DIR "${PDAL_BINARY_DIR}/${PDAL_LIB_INSTALL_DIR}")
+set(PDAL_OUTPUT_BIN_DIR "${PDAL_BINARY_DIR}/${PDAL_BIN_INSTALL_DIR}")
+set(PDAL_PLUGIN_INSTALL_PATH "${CMAKE_INSTALL_PREFIX}/${PDAL_LIB_INSTALL_DIR}")
+file(MAKE_DIRECTORY "${PDAL_OUTPUT_LIB_DIR}")
+file(MAKE_DIRECTORY "${PDAL_OUTPUT_BIN_DIR}")
+
+# per http://www.cmake.org/Wiki/CMake_RPATH_handling
+SET(CMAKE_SKIP_BUILD_RPATH FALSE )
+SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+if (APPLE)
+    SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
+endif()
+SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+IF (APPLE)
+    SET(MACOSX_RPATH ON)
+endif()
+LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_PREFIX}/lib" isSystemDir)
+IF("${isSystemDir}" STREQUAL "-1")
+    SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+ENDIF("${isSystemDir}" STREQUAL "-1")
+
+# wipe lib/ drectory on clean. It will have plugins that could be out of date
+# in the next build
+set_directory_properties(PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${PDAL_OUTPUT_LIB_DIR}/*")
+
+if(WIN32)
+  add_definitions("-DPDAL_DLL_EXPORT=1")
+  foreach(config ${CMAKE_CONFIGURATION_TYPES})
+    string(TOUPPER ${config} CONFIG)
+    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONFIG} "${PDAL_OUTPUT_LIB_DIR}")
+    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONFIG} "${PDAL_OUTPUT_BIN_DIR}")
+    # ---[ Windows requires DLLs (shared libraries) to be installed in the same directory as executables
+    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_${CONFIG} "${PDAL_OUTPUT_BIN_DIR}")
+  endforeach(config)
+else(WIN32)
+  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PDAL_OUTPUT_LIB_DIR}")
+  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PDAL_OUTPUT_BIN_DIR}")
+  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PDAL_OUTPUT_LIB_DIR}")
+endif(WIN32)
+
+set(PDAL_HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/pdal")
+
+#------------------------------------------------------------------------------
+# misc user options
+#------------------------------------------------------------------------------
+if(DEFINED ENV{ORACLE_HOME})
+    set(DEFINED_ORACLE_HOME TRUE)
+else(DEFINED ENV{ORACLE_HOME})
+    set(DEFINED_ORACLE_HOME FALSE)
+endif(DEFINED ENV{ORACLE_HOME})
+
+# Choose package components
+option(WITH_APPS "Choose if PDAL utilities should be built" TRUE)
+add_feature_info("PDAL application" WITH_APPS
+    "the PDAL command line application")
+
+option(BUILD_PLUGIN_ATTRIBUTE "Choose if Attribute filter is built" FALSE)
+add_feature_info("Attribute plugin" BUILD_PLUGIN_ATTRIBUTE
+    "apply attributes to a subset of points")
+
+option(BUILD_PLUGIN_CPD "Choose if Coherent Point Drift kernel is built" FALSE)
+add_feature_info("CPD plugin" BUILD_PLUGIN_CPD
+    "run Coherent Point Drift on two datasets")
+
+option(BUILD_PLUGIN_GEOWAVE "Choose if GeoWave support should be built" FALSE)
+add_feature_info("GeoWave plugin" BUILD_PLUGIN_GEOWAVE
+    "Read and Write data using GeoWave")
+
+option(BUILD_PLUGIN_GREYHOUND "Choose if Greyhound support should be built" FALSE)
+add_feature_info("Greyhound plugin" BUILD_PLUGIN_GREYHOUND
+    "read points from a Greyhound server")
+
+option(BUILD_PLUGIN_HEXBIN "Whether or not HexBin filter is built" FALSE)
+add_feature_info("Hexbin plugin" BUILD_PLUGIN_HEXBIN
+    "determine boundary and density of a point cloud")
+
+option(BUILD_PLUGIN_ICEBRIDGE "Choose if Icebridge support should be built" FALSE)
+add_feature_info("Icebridge plugin" BUILD_PLUGIN_ICEBRIDGE
+    "read data in the Icebridge format")
+
+option(BUILD_PLUGIN_MATLAB "Choose if Matlab support should be built" FALSE)
+add_feature_info("Matlab plugin" BUILD_PLUGIN_MATLAB
+    "write data to a .mat file")
+
+option(BUILD_PLUGIN_MRSID "Choose if MrSID/LiDAR support should be built" FALSE)
+add_feature_info("MrSID plugin" BUILD_PLUGIN_MRSID
+    "read data in the MrSID format")
+
+option(BUILD_PLUGIN_NITF "Choose if NITF support should be built (only install supported is from http://github.com/hobu/nitro)" FALSE)
+add_feature_info("NITF plugin" BUILD_PLUGIN_NITF
+    "read/write LAS data wrapped in NITF")
+
+option(BUILD_PLUGIN_OCI "Choose if OCI support should be built" ${DEFINED_ORACLE_HOME})
+option(BUILD_PLUGIN_P2G "Choose if Points2Grid support should be built" FALSE)
+option(BUILD_PLUGIN_PCL "Choose if PCL support should be built" FALSE)
+add_feature_info("PCL plugin" BUILD_PLUGIN_PCL
+    "provides PCL-based readers, writers, filters, and kernels")
+
+find_package(PostgreSQL QUIET)
+option(BUILD_PLUGIN_PGPOINTCLOUD "Choose if PostgreSQL PointCloud support should be built" ${POSTGRESQL_FOUND})
+add_feature_info("PostgreSQL PointCloud plugin" BUILD_PLUGIN_PGPOINTCLOUD
+    "read/write PostgreSQL PointCloud objects")
+
+option(BUILD_PLUGIN_SQLITE "Choose if SQLite database support should be built" FALSE)
+add_feature_info("SQLite plugin" BUILD_PLUGIN_SQLITE
+    "read/write SQLite objects")
+
+option(BUILD_PLUGIN_RIVLIB "Choose if RiVLib support should be built" FALSE)
+add_feature_info("RiVLib plugin" BUILD_PLUGIN_RIVLIB
+    "read data in the RXP format")
+
+option(BUILD_PLUGIN_PYTHON "Choose if Python support should be built" FALSE)
+add_feature_info("Python plugin" BUILD_PLUGIN_PYTHON
+    "add features that depend on python")
+
+option(WITH_TESTS "Choose if PDAL unit tests should be built" TRUE)
+add_feature_info("Unit tests" WITH_TESTS "PDAL unit tests")
+
+# Choose dependent options
+
+include(CMakeDependentOption)
+
+cmake_dependent_option(BUILD_PGPOINTCLOUD_TESTS "Choose if PostgreSQL PointCloud tests should be built" ON "BUILD_PLUGIN_PGPOINTCLOUD; WITH_TESTS" OFF)
+cmake_dependent_option(BUILD_SQLITE_TESTS "Choose if SQLite tests should be built" ON "BUILD_PLUGIN_SQLITE; WITH_TESTS" OFF)
+cmake_dependent_option(BUILD_OCI_TESTS "Choose if OCI tests should be built" ON "BUILD_PLUGIN_OCI; WITH_TESTS" OFF)
+cmake_dependent_option(BUILD_RIVLIB_TESTS "Choose if RiVLib tests should be built" ON "BUILD_PLUGIN_RIVLIB; WITH_TESTS" OFF)
+cmake_dependent_option(BUILD_PIPELINE_TESTS "Choose if pipeline tests should be built" OFF "WITH_APPS; WITH_TESTS" OFF)
+
+if(BUILD_PLUGIN_PGPOINTCLOUD OR BUILD_PLUGIN_OCI OR BUILD_PLUGIN_SQLITE)
+    include(${PDAL_CMAKE_DIR}/libxml2.cmake)
+endif()
+
+#------------------------------------------------------------------------------
+# test harness settings
+#------------------------------------------------------------------------------
+
+# Name of test suite runner
+set(PDAL_UNIT_TEST pdal_test)
+
+# Enable CTest and submissions to PDAL dashboard at CDash
+# http://my.cdash.org/index.php?project=PDAL
+option(ENABLE_CTEST "Enable CTest to support submissions of results to CDash at http://cdash.org" FALSE)
+
+#------------------------------------------------------------------------------
+# General build settings
+#------------------------------------------------------------------------------
+
+set(PDAL_BUILD_TYPE ${CMAKE_BUILD_TYPE})
+
+#------------------------------------------------------------------------------
+#  Dependencies.
+#------------------------------------------------------------------------------
+
+include(${PDAL_CMAKE_DIR}/boost.cmake)
+include(${PDAL_CMAKE_DIR}/gdal.cmake)
+include(${PDAL_CMAKE_DIR}/geos.cmake)  # Optional
+include(${PDAL_CMAKE_DIR}/geotiff.cmake)  # Optional
+include(${PDAL_CMAKE_DIR}/lazperf.cmake)  # Optional
+include(${PDAL_CMAKE_DIR}/laszip.cmake)  # Optional
+include(${PDAL_CMAKE_DIR}/threads.cmake)
+include(${PDAL_CMAKE_DIR}/zlib.cmake)
+
+#------------------------------------------------------------------------------
+# generate the pdal_defines.h header
+#------------------------------------------------------------------------------
+
+# from http://stackoverflow.com/questions/1435953/how-can-i-pass-git-sha1-to-compiler-as-definition-using-cmake
+include(GetGitRevisionDescription)
+get_git_head_revision(GIT_REFSPEC GIT_SHA1)
+
+configure_file(
+  "${PROJECT_SOURCE_DIR}/gitsha.cpp.in"
+  "${PROJECT_SOURCE_DIR}/src/gitsha.cpp")
+
+# needs to come before configuration of pdal_defines
+if(APPLE)
+    option(PDAL_BUNDLE "Create PDAL as Application Bundle on OSX" FALSE)
+    if (PDAL_BUNDLE)
+        set(PDAL_APP_BUNDLE 1)
+    endif()
+endif()
+
+set(pdal_defines_h_in "${CMAKE_CURRENT_SOURCE_DIR}/pdal_defines.h.in")
+set(pdal_defines_h "${CMAKE_CURRENT_BINARY_DIR}/include/pdal/pdal_defines.h")
+configure_file(${pdal_defines_h_in} ${pdal_defines_h})
+PDAL_ADD_INCLUDES("" "" ${pdal_defines_h})
+include_directories("${CMAKE_CURRENT_BINARY_DIR}/include")
+
+include_directories(vendor/eigen-3.1.91)
+include_directories(vendor/nanoflann-1.1.8)
+include_directories(vendor/rply-1.1.3)
+
+#------------------------------------------------------------------------------
+# subdirectory controls
+#------------------------------------------------------------------------------
+
+# PDAL_TARGET_OBJECTS is used to collect the driver object libraries
+set(PDAL_TARGET_OBJECTS "")
+
+add_subdirectory(src/util)
+add_subdirectory(io)
+add_subdirectory(filters)
+add_subdirectory(kernels)
+add_subdirectory(src)
+add_subdirectory(tools)
+if (BUILD_PLUGIN_PYTHON)
+    add_subdirectory(src/plang)
+endif()
+
+if(WITH_TESTS)
+  # This is fixed in trunk
+  # https://code.google.com/p/googletest/source/detail?r=675
+  # but for now, we need this fix
+  # http://stackoverflow.com/questions/12558327/google-test-in-visual-studio-2012
+  if (MSVC AND MSVC_VERSION EQUAL 1700)
+    add_definitions(/D _VARIADIC_MAX=10)
+  endif()
+
+  add_subdirectory(vendor/gtest-1.7.0)
+  enable_testing()
+  include_directories(vendor/gtest-1.7.0/include vendor/gtest-1.7.0)
+
+  if(ENABLE_CTEST)
+    message(STATUS
+      "Enable CTest to support submissions of results to CDash at http://cdash.org")
+    cmake_minimum_required(VERSION 2.8.0)
+    # Dashboard has been prepared for experiments
+    # http://my.cdash.org/index.php?project=PDAL
+    include(CTest)
+    message(STATUS
+      "Enable CTest to support submissions of results to CDash at http://cdash.org - done")
+  endif()
+
+  add_subdirectory(test)
+
+  # Define "make check" as alias for "make test"
+  ADD_CUSTOM_TARGET(check COMMAND ctest)
+else()
+  if(ENABLE_CTEST)
+    message(WARNING
+      "CTest support requested but WITH_TESTS option not specified to build of PDAL unit tests")
+  endif()
+endif()
+
+add_subdirectory(plugins)
+
+if(WITH_APPS)
+  add_subdirectory(apps)
+endif()
+
+#------------------------------------------------------------------------------
+# CPACK controls
+#------------------------------------------------------------------------------
+
+SET(CPACK_PACKAGE_VERSION_MAJOR ${PDAL_VERSION_MAJOR})
+SET(CPACK_PACKAGE_VERSION_MINOR ${PDAL_VERSION_MINOR})
+SET(CPACK_PACKAGE_VERSION_PATCH ${PDAL_VERSION_MINOR})
+SET(CPACK_PACKAGE_NAME "PDAL")
+
+SET(CPACK_SOURCE_GENERATOR "TBZ2;TGZ")
+SET(CPACK_PACKAGE_VENDOR "PDAL Development Team")
+SET(CPACK_RESOURCE_FILE_LICENSE    "${PROJECT_SOURCE_DIR}/LICENSE.txt")
+
+set(CPACK_SOURCE_PACKAGE_FILE_NAME
+    "${CMAKE_PROJECT_NAME}-${PDAL_VERSION_STRING}-src")
+
+set(CPACK_SOURCE_IGNORE_FILES
+"/\\\\.gitattributes;/\\\\.vagrant;/\\\\.DS_Store;/CVS/;/\\\\.git/;\\\\.swp$;~$;\\\\.\\\\#;/\\\\#")
+
+list(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeScripts/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeCache.txt")
+list(APPEND CPACK_SOURCE_IGNORE_FILES ".xcodeproj")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "build.make")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "_CPack_Packages")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "cmake_install.cmake")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "Testing")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "PDAL.build/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/bin/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/lib/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "Makefile")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "CMakeFiles")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "CTestTestfile.cmake")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/test/data/local/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/doc/doxygen/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/doc/build/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/doc/presentations/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/scripts/")
+list(APPEND CPACK_SOURCE_IGNORE_FILES "/cmake/examples/")
+
+include(CPack)
+
+add_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source)
+
+export(TARGETS ${PDAL_BASE_LIB_NAME} ${PDAL_UTIL_LIB_NAME}
+    FILE "${PDAL_BINARY_DIR}/PDALTargets.cmake")
+install(EXPORT PDALTargets DESTINATION lib/pdal/cmake)
+include(${PDAL_CMAKE_DIR}/config.cmake)
+
+feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES)
+
+# TODO: move under scripts/bash-completion ?
+if (IS_DIRECTORY /etc/bash_completion.d)
+    install(FILES "${PROJECT_SOURCE_DIR}/scripts/bash-completion/pdal" DESTINATION "${CMAKE_INSTALL_PREFIX}/etc/bash_completion.d")
+endif()
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..a4ee38f
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,45 @@
+# How to contribute
+
+PDAL welcomes all contributions.
+We use Github's [pull requests](https://help.github.com/articles/using-pull-requests) to accept patches from the community.
+
+## Getting Started
+
+* Make sure you have a [GitHub account](https://github.com/signup/free).
+* Fork the repository on GitHub.
+
+## Making Changes
+
+* Create a topic branch from where you want to base your work.
+  * You usually should base your topic branch off of the master branch.
+  * To quickly create a topic branch: `git checkout -b my-topic-branch`
+* Make commits of logical units.
+* Check for unnecessary whitespace with `git diff --check` before committing.
+* Make sure your commit messages are in the [proper format](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html).
+* Make sure you have added the necessary tests for your changes.
+* [Run _all_ the tests](http://www.pdal.io/development/testing.html) to assure nothing else was accidentally broken.
+
+## Submitting Changes
+
+* Push your changes to a topic branch in your fork of the repository.
+* Submit a pull request to the repository in the PDAL organization.
+  * If your pull request fixes/references an issue, include that issue number in the pull request. For example:
+
+```
+Wiz the bang
+
+Fixes #123.
+```
+
+* PDAL developers will look at your patch and take an appropriate action.
+
+## Additional Resources
+
+* [PDAL's coding conventions](http://www.pdal.io/development/conventions.html)
+* [General GitHub documentation](http://help.github.com/)
+* [GitHub pull request documentation](http://help.github.com/send-pull-requests/)
+* #pdal IRC channel on freenode.org
+
+## Acknowledgements
+
+The basic skeleton of this CONTRIBUTING file was lifted directly from [Puppet's](https://github.com/puppetlabs/puppet/blob/master/CONTRIBUTING.md).
diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..a72ac4c
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,46 @@
+Unless otherwise indicated, all files in the PDAL distribution are
+
+  Copyright (c) 2015, Hobu, Inc. (howard at hobu.co)
+
+and are released under the terms of the BSD open source license.
+
+This file contains the license terms of all files within PDAL.
+
+
+Overall PDAL license (BSD)
+===========================
+
+ Copyright (c) 2015, Hobu, Inc. (howard at hobu.co)
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following
+ conditions are met:
+
+     * Redistributions of source code must retain the above copyright
+       notice, this list of conditions and the following disclaimer.
+     * Redistributions in binary form must reproduce the above copyright
+       notice, this list of conditions and the following disclaimer in
+       the documentation and/or other materials provided
+       with the distribution.
+     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+       names of its contributors may be used to endorse or promote
+       products derived from this software without specific prior
+       written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ OF SUCH DAMAGE.
+
+
+
diff --git a/PDALConfig.cmake.in b/PDALConfig.cmake.in
new file mode 100644
index 0000000..1fa72e9
--- /dev/null
+++ b/PDALConfig.cmake.in
@@ -0,0 +1,21 @@
+ at PACKAGE_INIT@
+
+set(PDAL_VERSION_MAJOR @PDAL_VERSION_MAJOR@)
+set(PDAL_VERSION_MINOR @PDAL_VERSION_MINOR@)
+set(PDAL_VERSION_PATCH @PDAL_VERSION_PATCH@)
+
+set(PDAL_INCLUDE_DIRS)
+set(PDAL_LIBRARY_DIRS)
+foreach(_dir @PDAL_CONFIG_INCLUDE_DIRS@)
+  set_and_check(_foo ${_dir})
+  list(APPEND PDAL_INCLUDE_DIRS ${_foo})
+endforeach(_dir)
+foreach(_dir @PDAL_CONFIG_LIBRARY_DIRS@)
+  set_and_check(_foo ${_dir})
+  list(APPEND PDAL_LIBRARY_DIRS ${_foo})
+endforeach(_dir)
+check_required_components("@PDAL_BASE_LIB_NAME@")
+check_required_components("@PDAL_UTIL_LIB_NAME@")
+set(PDAL_LIBRARIES "@PDAL_LIB_NAME@" "@PDAL_UTIL_LIB_NAME@")
+
+include("${CMAKE_CURRENT_LIST_DIR}/PDALTargets.cmake")
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..066bad1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+PDAL
+====
+
+[![Build Status](https://travis-ci.org/PDAL/PDAL.png?branch=master)](https://travis-ci.org/PDAL/PDAL)
+[![Appveyor Build Status](https://ci.appveyor.com/api/projects/status/github/pdal/pdal?branch=master&svg=true)](https://ci.appveyor.com/project/hobu/pdal)
+
+See http://www.pdal.io/ for more info
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644
index 0000000..001b915
--- /dev/null
+++ b/Vagrantfile
@@ -0,0 +1,140 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+require 'socket'
+require 'ipaddr'
+
+# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
+VAGRANTFILE_API_VERSION = "2"
+
+
+# Evaluate a block passing one argument, an integer plucked from an environment
+# variable. If that integer is zero, or the environment variable evaluates to
+# zero with String#to_i, then don't evaluate the block.
+def with_nonzero_integer_envvar(envvar, default = 0)
+  integer = ENV[envvar] ? ENV[envvar].to_i : default
+  if integer == 0
+    # noop
+  else
+    yield integer
+  end
+end
+
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+  config.vm.box = "trusty64"
+
+  config.vm.hostname = "pdal-vagrant"
+  config.vm.box_url = "https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box"
+  config.vm.host_name = "pdal-vagrant"
+
+  # Set the bash environment variable PDAL_VAGRANT_SSH_FORWARD_AGENT to any
+  # value to turn on ssh forwarding. This allows you to use your host machine's
+  # ssh credentials inside your guest box, for example when interacting with
+  # private github repositories.
+  #
+  # To confirm that ssh fowarding is working, run the following from inside the
+  # guest machine:
+  #
+  #   ssh -T git at github.com
+  #
+  # You should see something like "Hi <your name here>! You've successfully
+  # authenticated, but GitHub does not provide shell access."
+  #
+  # You may need to run `ssh-add` on your host machine to add your private key
+  # identities to the authentication agent.
+  if ENV['PDAL_VAGRANT_SSH_FORWARD_AGENT']
+    config.ssh.forward_agent = true
+  end
+
+  # Set PDAL_VAGRANT_PORT_80_FORWARD to customize the target port
+  # for the guest port 80. To disable guest port 80 forwarding, set
+  # PDAL_VAGRANT_PORT_80_FORWARD to any value that cannot be parsed to
+  # an integer with ruby's String#to_i method (e.g. 'false').
+  with_nonzero_integer_envvar('PDAL_VAGRANT_PORT_80_FORWARD', 8080) do |host_port|
+    config.vm.network :forwarded_port, guest: 80, host: host_port
+  end
+
+  config.vm.provider :virtualbox do |vb|
+    # Set PDAL_VAGRANT_VIRTUALBOX_MEMORY to customize the virtualbox vm memory
+    with_nonzero_integer_envvar('PDAL_VAGRANT_VIRTUALBOX_MEMORY', 4096) do |memory|
+      vb.customize ["modifyvm", :id, "--memory", memory]
+    end
+    # Set PDAL_VAGRANT_VIRTUALBOX_CPUS to customize the virtualbox vm cpus
+    with_nonzero_integer_envvar('PDAL_VAGRANT_VIRTUALBOX_CPUS', 2) do |cpus|
+      vb.customize ["modifyvm", :id, "--cpus", cpus]
+    end
+    # Set PDAL_VAGRANT_VIRTUALBOX_IOAPIC to customize the virtualbox vm ioapic
+    vb.customize ["modifyvm", :id, "--ioapic", ENV['PDAL_VAGRANT_VIRTUALBOX_IOAPIC'] || "on"]
+    vb.name = "pdal-vagrant"
+
+    # Set PDAL_VAGRANT_VIRTUALBOX_ENABLE_GUI to turn on the gui
+    if ENV['PDAL_VAGRANT_VIRTUALBOX_ENABLE_GUI']
+      vb.gui = true
+    end
+  end
+
+
+  if RUBY_PLATFORM.include? "darwin"
+    # If on a Mac, set PDAL_VAGRANT_PRIVATE_NETWORK_IP to customize
+    # the private network's IP. Set to a non-IP value to disable private networking.
+    if ENV['PDAL_VAGRANT_PRIVATE_NETWORK_IP']
+      begin
+        ipaddr = IPAddr.new ENV['PDAL_VAGRANT_PRIVATE_NETWORK_IP']
+      rescue ArgumentError
+        # noop
+      else
+        config.vm.network "private_network", ip: ipaddr
+      end
+    else
+      config.vm.network "private_network", ip: "192.168.10.4"
+    end
+
+    # If on a Mac, set PDAL_VAGRANT_DISABLE_NFS to false to disable nfs mounting
+    use_nfs = !ENV['PDAL_VAGRANT_DISABLE_NFS']
+    config.vm.synced_folder ".", "/vagrant", nfs: use_nfs
+
+    if Socket.gethostname.include? "pyro" # Howard's machine
+      config.vm.synced_folder "/Users/hobu/dev/git/pointcloud", "/pointcloud", nfs: use_nfs
+    end
+  end
+
+  if RUBY_PLATFORM.include? "win32"
+    config.vm.synced_folder ".", "/vagrant", type: "smb"
+  end
+
+  ppaRepos = [
+    "ppa:ubuntugis/ubuntugis-unstable",
+  ]
+
+	  pkg_cmd = ""
+
+	  pkg_cmd << "apt-get update -qq; apt-get install -q -y python-software-properties; "
+
+	  if ppaRepos.length > 0
+		  ppaRepos.each { |repo| pkg_cmd << "add-apt-repository -y " << repo << " ; " }
+		  pkg_cmd << "apt-get update -qq; "
+	  end
+
+	  config.vm.provision :shell, :inline => pkg_cmd
+      scripts_path = "scripts/linux-install-scripts/"
+      config.vm.provision :shell, :path => scripts_path << "packages.sh"
+      pkg_cmd = ""
+
+	  # install packages we need we need
+    scripts = [
+      "startup.sh",
+      "libgeotiff.sh",
+      "nitro.sh",
+      "hexer.sh",
+      "lazperf.sh",
+      "p2g.sh",
+      "laszip.sh",
+      "pcl.sh",
+      "websocketpp.sh",
+      "geowave.sh",
+      "pdal.sh",
+      "pgpointcloud.sh"
+    ];
+    scripts.each { |script| config.vm.provision :shell, :path => "scripts/linux-install-scripts/" << script }
+end
diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt
new file mode 100644
index 0000000..39fe64f
--- /dev/null
+++ b/apps/CMakeLists.txt
@@ -0,0 +1,107 @@
+#
+# ./apps CMake configuration file for PDAL utilties
+#
+# (based originally on the libLAS files copyright Mateusz Loskot)
+
+cmake_minimum_required(VERSION 2.8)
+
+set(PDAL_SOURCE_DIR ../src)
+
+#------------------------------------------------------------------------------
+# includes
+#------------------------------------------------------------------------------
+
+include_directories(
+    .
+    ../include
+    ../util
+    ${PROJECT_SOURCE_DIR}/io/faux
+    ${PROJECT_SOURCE_DIR}/io/las
+    ${PROJECT_SOURCE_DIR}/kernels
+    ${PROJECT_SOURCE_DIR}/kernels/delta
+    ${PROJECT_SOURCE_DIR}/kernels/diff
+    ${PROJECT_SOURCE_DIR}/kernels/info
+    ${PROJECT_SOURCE_DIR}/kernels/pipeline
+    ${PROJECT_SOURCE_DIR}/kernels/random
+    ${PROJECT_SOURCE_DIR}/kernels/sort
+    ${PROJECT_SOURCE_DIR}/kernels/translate
+)
+
+#------------------------------------------------------------------------------
+# Collect programs to build
+#------------------------------------------------------------------------------
+
+set(PDAL_UTILITY pdal)
+
+#------------------------------------------------------------------------------
+# Configure build targets
+#------------------------------------------------------------------------------
+
+link_directories(${Boost_LIBRARY_DIRS})
+
+if(PDAL_UTILITY)
+    set(srcs pdal.cpp)
+
+    if(WIN32)
+        list(APPEND srcs ${PDAL_TARGET_OBJECTS})
+    endif()
+
+    list(APPEND PDAL_UTILITIES ${PDAL_UTILITY})
+    if (APPLE AND PDAL_BUNDLE)
+        add_executable(${PDAL_UTILITY} MACOSX_BUNDLE ${srcs})
+    else (APPLE AND PDAL_BUNDLE)
+        add_executable(${PDAL_UTILITY} ${srcs})
+    endif(APPLE AND PDAL_BUNDLE)
+    target_link_libraries(${PDAL_UTILITY} ${PDAL_BASE_LIB_NAME})
+endif()
+
+#------------------------------------------------------------------------------
+# Targets installation
+#------------------------------------------------------------------------------
+
+if (APPLE AND PDAL_BUNDLE)
+    install(TARGETS ${PDAL_UTILITIES}
+        BUNDLE DESTINATION ${PDAL_BIN_INSTALL_DIR})
+else(APPLE AND PDAL_BUNDLE)
+    install(TARGETS ${PDAL_UTILITIES}
+        RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR})
+endif(APPLE AND PDAL_BUNDLE)
+
+if(UNIX OR APPLE)
+
+    set(PKGCONFIG_LIBRARY_DEFINITIONS "")
+    set(PDAL_INCLUDE_DEFINITIONS "-I${CMAKE_INSTALL_PREFIX}/include -I${Boost_INCLUDE_DIR} -I${GDAL_INCLUDE_DIR}")
+    set(PKGCONFIG_LIBRARY_DEFINITIONS "${PKGCONFIG_LIBRARY_DEFINITIONS} gdal")
+
+    if(LIBXML2_FOUND)
+        set(PKGCONFIG_LIBRARY_DEFINITIONS "${PKGCONFIG_LIBRARY_DEFINITIONS} libxml-2.0")
+        set(PDAL_INCLUDE_DEFINITIONS "${PDAL_INCLUDE_DEFINITIONS} -I${LIBXML2_INCLUDE_DIR}")
+    endif()
+
+    if (GEOS_FOUND)
+        set(PKGCONFIG_LIBRARY_DEFINITIONS "${PKGCONFIG_LIBRARY_DEFINITIONS} geos")
+        set(PDAL_INCLUDE_DEFINITIONS "${PDAL_INCLUDE_DEFINITIONS} -I${GEOS_INCLUDE_DIR}")
+    endif()
+
+    if (LASZIP_FOUND)
+        set(PDAL_INCLUDE_DEFINITIONS "${PDAL_INCLUDE_DEFINITIONS} -I${LASZIP_INCLUDE_DIR}")
+    endif()
+
+    file(MAKE_DIRECTORY "${PDAL_OUTPUT_LIB_DIR}/pkgconfig/")
+    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/pdal.pc.in
+                   ${CMAKE_CURRENT_BINARY_DIR}/pdal.pc @ONLY)
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pdal.pc
+        DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig/"
+        PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ)
+
+
+
+    # Autoconf compatibility variables to use the same script source.
+    configure_file("${CMAKE_CURRENT_SOURCE_DIR}/pdal-config.in"
+                   "${CMAKE_CURRENT_BINARY_DIR}/pdal-config" @ONLY)
+
+    install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/pdal-config"
+      DESTINATION "${CMAKE_INSTALL_PREFIX}/bin"
+      PERMISSIONS
+      OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
+endif()
diff --git a/apps/pdal-config.in b/apps/pdal-config.in
new file mode 100644
index 0000000..286d7b3
--- /dev/null
+++ b/apps/pdal-config.in
@@ -0,0 +1,67 @@
+#!/bin/sh
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@/bin
+libdir=@CMAKE_INSTALL_PREFIX@/lib
+
+
+usage()
+{
+	cat <<EOF
+Usage: pdal-config [OPTIONS]
+Options:
+	[--libs]
+	[--cflags]
+	[--cxxflags]
+	[--defines]
+	[--includes]
+	[--version]
+EOF
+	exit $1
+}
+
+if test $# -eq 0; then
+	usage 1 1>&2
+fi
+
+case $1 in
+  --libs)
+    echo -L at CMAKE_INSTALL_PREFIX@/lib -lpdalcpp
+    ;;
+
+  --plugin-dir)
+    echo @PDAL_PLUGIN_INSTALL_PATH@
+    ;;
+
+  --prefix)
+    echo ${prefix}
+     ;;
+
+  --ldflags)
+    echo -L${libdir}
+    ;;
+
+  --defines)
+    echo @PDAL_CONFIG_DEFINITIONS@
+    ;;
+
+  --includes)
+    echo @PDAL_INCLUDE_DEFINITIONS@
+    ;;
+
+  --cflags)
+    echo @CMAKE_C_FLAGS@
+    ;;
+
+  --cxxflags)
+    echo @CMAKE_CXX_FLAGS@ -std=c++11
+    ;;
+
+  --version)
+    echo @PDAL_VERSION_STRING@
+    ;;
+
+  *)
+    usage 1 1>&2
+    ;;
+
+esac
diff --git a/apps/pdal.cpp b/apps/pdal.cpp
new file mode 100644
index 0000000..1e554ba
--- /dev/null
+++ b/apps/pdal.cpp
@@ -0,0 +1,334 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+* Copyright (c) 2014-2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/KernelFactory.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/pdal_config.hpp>
+
+#include <iomanip>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <string>
+#include <vector>
+
+using namespace pdal;
+
+std::string headline(Utils::screenWidth(), '-');
+
+std::string splitDriverName(std::string const& name)
+{
+    std::string out;
+
+    StringList names = Utils::split2(name, '.');
+    if (names.size() == 2)
+        out = names[1];
+    return out;
+}
+
+void outputVersion()
+{
+    std::cout << headline << std::endl;
+    std::cout << "pdal " << GetFullVersionString() << std::endl;
+    std::cout << headline << std::endl;
+    std::cout << std::endl;
+}
+
+void outputHelp()
+{
+    std::cout << "Usage: pdal <command> [--debug] [--drivers] [--help] "
+        "[--options[=<driver name>]] [--version]" << std::endl << std::endl;
+    std::cout << "  --debug      Show debug information" << std::endl;
+    std::cout << "  --drivers    Show drivers" << std::endl;
+    std::cout << "  -h [--help]  Print help message" << std::endl;
+    std::cout << "  --options [=arg(=all)]" << std::endl;
+    std::cout << "               Show driver options" << std::endl;
+    std::cout << "  --version    Show version info" << std::endl;
+    std::cout << std::endl;
+
+    std::cout << "The following commands are available:" << std::endl;
+
+    KernelFactory f(false);
+    StringList loaded_kernels = f.getKernelNames();
+
+    for (auto name : loaded_kernels)
+        std::cout << "   - " << splitDriverName(name) << std::endl;
+    std::cout << "See http://pdal.io/apps.html for more detail" << std::endl;
+}
+
+void outputDrivers()
+{
+    StageFactory f(false);
+
+    std::ostringstream strm;
+
+    int nameColLen(25);
+    int descripColLen(Utils::screenWidth() - nameColLen - 1);
+
+    std::string tablehead(std::string(nameColLen, '=') + ' ' +
+        std::string(descripColLen, '='));
+
+    strm << std::endl;
+    strm << tablehead << std::endl;
+    strm << std::left << std::setw(nameColLen) << "Name" <<
+        " Description" << std::endl;
+    strm << tablehead << std::endl;
+
+    strm << std::left;
+
+    std::map<std::string, std::string> sm = f.getStageMap();
+    for (auto s : sm)
+    {
+        std::string name = s.first;
+        StringList lines = Utils::wordWrap(s.second, descripColLen - 1);
+        for (size_t i = 0; i < lines.size(); ++i)
+        {
+            strm << std::setw(nameColLen) << name << " " <<
+                lines[i] << std::endl;
+            name.clear();
+        }
+    }
+
+    strm << tablehead << std::endl;
+    std::cout << strm.str() << std::endl;
+}
+
+void outputOptions(std::string const& n)
+{
+    StageFactory f(false);
+
+    std::unique_ptr<Stage> s(f.createStage(n));
+    if (!s)
+    {
+        std::cerr << "Unable to create stage " << n << "\n";
+        return;
+    }
+
+    std::cout << n << std::endl;
+    std::cout << headline << std::endl;
+
+    std::vector<Option> options = s->getDefaultOptions().getOptions();
+    if (options.empty())
+    {
+        std::cout << "No options" << std::endl << std::endl;
+        return;
+    }
+
+    for (auto const& opt : options)
+    {
+        std::string name = opt.getName();
+        std::string defVal = Utils::escapeNonprinting(
+            opt.getValue<std::string>());
+        std::string description = opt.getDescription();
+
+        std::cout << name;
+        if (!defVal.empty())
+            std::cout << " [" << defVal << "]";
+        std::cout << std::endl;
+
+        if (!description.empty())
+        {
+            StringList lines =
+                Utils::wordWrap(description, headline.size() - 6);
+            for (std::string& line : lines)
+                std::cout << "    " << line << std::endl;
+        }
+        std::cout << std::endl;
+    }
+}
+
+
+void outputCommands()
+{
+    KernelFactory f(false);
+    std::vector<std::string> loaded_kernels;
+    loaded_kernels = f.getKernelNames();
+    for (auto name : loaded_kernels)
+    {
+        std::cout << splitDriverName(name) << std::endl;
+    }
+}
+
+
+void outputOptions()
+{
+    StageFactory f(false);
+    StringList nv = f.getStageNames();
+    for (auto const& n : nv)
+        outputOptions(n);
+}
+
+
+int main(int argc, char* argv[])
+{
+    // No arguments, print basic usage, plugins will be loaded
+    if (argc < 2)
+    {
+        outputHelp();
+        return 1;
+    }
+
+    // Discover available kernels without plugins, and test to see if
+    // the positional option 'command' is a valid kernel
+    KernelFactory f(true);
+    std::vector<std::string> loaded_kernels;
+    loaded_kernels = f.getKernelNames();
+
+    bool isValidKernel = false;
+    std::string command(argv[1]);
+    std::string fullname;
+    for (auto name : loaded_kernels)
+    {
+        if (boost::iequals(argv[1], splitDriverName(name)))
+        {
+            fullname = name;
+            isValidKernel = true;
+            break;
+        }
+    }
+
+    // If the kernel was not available, then light up the plugins and retry
+    if (!isValidKernel)
+    {
+        KernelFactory f(false);
+        loaded_kernels.clear();
+        loaded_kernels = f.getKernelNames();
+
+        for (auto name : loaded_kernels)
+        {
+            if (boost::iequals(argv[1], splitDriverName(name)))
+            {
+                fullname = name;
+                isValidKernel = true;
+                break;
+            }
+        }
+    }
+
+    // Dispatch execution to the kernel, passing all remaining args
+    if (isValidKernel)
+    {
+        int count(argc - 1); // remove the 1st argument
+        const char** args = const_cast<const char**>(&argv[1]);
+        std::unique_ptr<Kernel> app = f.createKernel(fullname);
+        return app->run(count, args, command);
+    }
+
+    // Otherwise, process the remaining args to see if they are supported
+    bool debug = false;
+    bool drivers = false;
+    bool help = false;
+    bool options = false;
+    bool version = false;
+    std::string optString("all");  // --options will default to displaying information on all available stages
+    for (int i = 1; i < argc; ++i)
+    {
+        if (boost::iequals(argv[i], "--debug"))
+        {
+            debug = true;
+        }
+        else if (boost::iequals(argv[i], "--drivers"))
+        {
+            drivers = true;
+        }
+        else if (boost::iequals(argv[i], "--help") || boost::iequals(argv[i], "-h"))
+        {
+            help = true;
+        }
+        else if (boost::algorithm::istarts_with(argv[i], "--options"))
+        {
+            std::vector<std::string> optionsVec;
+            // we are rather unsophisticated for now, only splitting on '=', no spaces allowed
+            boost::algorithm::split(optionsVec, argv[i],
+                boost::algorithm::is_any_of("="), boost::algorithm::token_compress_on);
+            options = true;
+            if (optionsVec.size() == 2)
+                optString = optionsVec[1];
+        }
+        else if (boost::iequals(argv[i], "--version"))
+        {
+            version = true;
+        }
+        else if (boost::iequals(argv[i], "--list-commands"))
+        {
+            outputCommands();
+            return 0;
+        }
+        else
+        {
+            if (boost::algorithm::istarts_with(argv[i], "--"))
+                std::cerr << "Unknown option '" << argv[i] <<"' not recognized" << std::endl << std::endl;
+        }
+    }
+
+    if (version)
+    {
+        outputVersion();
+        return 0;
+    }
+
+    if (drivers)
+    {
+        outputDrivers();
+        return 0;
+    }
+
+    if (options)
+    {
+        if (boost::iequals(optString, "all"))
+            outputOptions();
+        else
+            outputOptions(optString);
+        return 0;
+    }
+
+    if (debug)
+    {
+        std::cerr << getPDALDebugInformation() << std::endl;
+        return 0;
+    }
+
+    if (help)
+    {
+        outputHelp();
+        return 0;
+    }
+
+    if (!isValidKernel)
+        std::cerr << "Command '" << command <<"' not recognized" << std::endl << std::endl;
+    outputHelp();
+    return 1;
+}
+
diff --git a/apps/pdal.pc.in b/apps/pdal.pc.in
new file mode 100644
index 0000000..c9cb7c4
--- /dev/null
+++ b/apps/pdal.pc.in
@@ -0,0 +1,12 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@/bin
+libdir=@CMAKE_INSTALL_PREFIX@/lib
+includedir=@CMAKE_INSTALL_PREFIX@/include
+
+Name: PDAL
+Description: Point Data Abstraction Library
+Requires:  @PKGCONFIG_LIBRARY_DEFINITIONS@
+Version: @PDAL_VERSION_STRING@
+Libs: -L${libdir} -l at PDAL_LIB_NAME@
+Cflags: -I${includedir}/pdal  @PDAL_CONFIG_DEFINITIONS@
+
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 0000000..6b3a0f0
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,67 @@
+version: 1.0.{build}
+
+os: Windows Server 2012
+
+platform:
+  - x64
+
+configuration: Release
+
+environment:
+  # set the directory to use for OSGeo4W install, our CMake find packages know
+  # to look here
+  OSGEODIR: C:\OSGeo4W64
+
+  matrix:
+    - PDAL_OPTIONAL_COMPONENTS: OFF
+    - PDAL_OPTIONAL_COMPONENTS: ON
+
+install:
+  # make a temp directory for downloading osgeo4w-setup.exe
+  # this may not matter as much if part of the install step, as pdal has
+  # already been cloned, otherwise git would complain about a non-empty
+  # directory
+  - ps: mkdir C:\temp | out-null
+
+  # make the osgeo directory
+  - ps: mkdir %OSGEODIR% | out-null
+
+  # get the OSGeo installer
+  - ps: wget http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe -OutFile C:\temp\osgeo4w-setup.exe | out-null
+
+  # and install our dependencies
+  - C:\temp\osgeo4w-setup.exe -s http://download.osgeo.org/osgeo4w/ -a -q -P boost-devel,eigen,gdal,geos,hexer,iconv,laszip,libgeotiff,libtiff,libpq,libxml2,nitro,pcl,points2grid,proj,python-numpy,zlib -R %OSGEODIR% > nul
+
+  # call our PDAL install script
+  - call .\\scripts\\appveyor\\install.cmd
+
+#cache:
+#  # this should cache our OSGeo4W install between jobs in the build matrix
+#  - C:\OSGeo4W64
+
+build:
+  parallel: true
+  project: PDAL.sln
+  verbosity: minimal
+
+notifications:
+  - provider: Email
+    on_build_success: false
+    on_build_failure: false
+    on_build_status_changed: false
+
+  - provider: Slack
+    auth_token:
+      secure: Ycvea4CbhP10k3tQwTr9vU2QMdYa4JusDfbCoOwkns2O87afn/G5eBsUakdM/eyW
+    channel: pdal
+    on_build_failure: true
+    on_build_success: false
+    on_build_status_changed: true
+
+#test_script:
+#  - "SET PATH=%OSGEODIR%\\bin;%PATH%"
+#  - echo %PATH%
+#  - ctest --output-on-failure -C Release -VV
+
+matrix:
+  fast_finish: true
diff --git a/astylerc b/astylerc
new file mode 100644
index 0000000..fa875c1
--- /dev/null
+++ b/astylerc
@@ -0,0 +1,25 @@
+# usage (for a single file):
+#  AStyle.exe --options=astylerc include/pdal/Bounds.hpp
+#
+# usage (for directories):
+#  AStyle.exe --options=astylerc --recursive "include/*.hpp" "src/*.cpp"
+
+--style=ansi
+
+--indent=spaces=4
+
+--convert-tabs
+
+--lineend=linux
+
+--suffix=none
+
+--unpad-paren
+
+--indent-switches
+
+--indent-cases
+
+--indent-labels
+
+--pad-header
\ No newline at end of file
diff --git a/cmake/boost.cmake b/cmake/boost.cmake
new file mode 100644
index 0000000..2a6add0
--- /dev/null
+++ b/cmake/boost.cmake
@@ -0,0 +1,26 @@
+# Default to using static, multithreaded libraries for
+# linking under MSVC.  This is because we show users how to
+# use boostpro.com installer and install those options when linking
+# on windows in the compilation documentation.
+if(WIN32)
+    if (MSVC)
+        set(Boost_USE_STATIC_LIBS   OFF)
+        set(Boost_USE_MULTITHREADED ON)
+
+        if (PDAL_USE_STATIC_RUNTIME)
+            set(Boost_USE_STATIC_RUNTIME ON)
+        endif(PDAL_USE_STATIC_RUNTIME)
+    endif(MSVC)
+endif(WIN32)
+
+find_package(Boost 1.53 REQUIRED COMPONENTS program_options iostreams filesystem system thread)
+set_package_properties(Boost PROPERTIES TYPE REQUIRED
+    PURPOSE "Boost provides fundamental functionality for PDAL")
+if(Boost_FOUND)
+  include_directories(${Boost_INCLUDE_DIRS})
+
+  # make these available for the user to set.
+  mark_as_advanced(CLEAR Boost_INCLUDE_DIR)
+  mark_as_advanced(CLEAR Boost_LIBRARY_DIRS)
+  link_directories(${Boost_LIBRARY_DIRS})
+endif(Boost_FOUND)
diff --git a/cmake/check_demangle.cpp b/cmake/check_demangle.cpp
new file mode 100644
index 0000000..db89cff
--- /dev/null
+++ b/cmake/check_demangle.cpp
@@ -0,0 +1,8 @@
+#include <cxxabi.h>
+
+int main(int ac, char *av[])
+{
+    int status;
+    char *p = abi::__cxa_demangle("i", 0, 0, &status);
+}
+
diff --git a/cmake/common.cmake b/cmake/common.cmake
new file mode 100644
index 0000000..a5f78fa
--- /dev/null
+++ b/cmake/common.cmake
@@ -0,0 +1,19 @@
+#
+# To reduce typing.
+#
+set(CDIR "${CMAKE_CURRENT_LIST_DIR}")
+
+#
+# This must be first.
+#
+include(${CDIR}/directories.cmake)
+
+#
+# This must come before macros, but I don't understand why the policies
+# apply to the macros rather than the invocation of the macros.
+#
+include(${CDIR}/policies.cmake NO_POLICY_SCOPE)
+include(${CDIR}/macros.cmake)
+include(${CDIR}/libraries.cmake)
+include(${CDIR}/compiler_options.cmake)
+include(${CDIR}/modules.cmake)
diff --git a/cmake/compiler_options.cmake b/cmake/compiler_options.cmake
new file mode 100644
index 0000000..6032cff
--- /dev/null
+++ b/cmake/compiler_options.cmake
@@ -0,0 +1,12 @@
+include_directories(${PDAL_INCLUDE_DIR})
+include_directories(${PDAL_UTIL_DIR})
+include_directories(${PDAL_SRC_DIR})
+include_directories(${PDAL_IO_DIR})
+include_directories(${PDAL_KERNEL_DIR})
+include_directories(${PDAL_FILTER_DIR})
+if (WIN32)
+    include (${CMAKE_CURRENT_LIST_DIR}/win32_compiler_options.cmake)
+else()
+    include (${CMAKE_CURRENT_LIST_DIR}/unix_compiler_options.cmake)
+endif()
+
diff --git a/cmake/config.cmake b/cmake/config.cmake
new file mode 100644
index 0000000..b47aa29
--- /dev/null
+++ b/cmake/config.cmake
@@ -0,0 +1,28 @@
+set(INCLUDE_INSTALL_DIR include/ CACHE PATH "include")
+set(LIB_INSTALL_DIR lib/ CACHE PATH "lib")
+set(SYSCONFIG_INSTALL_DIR etc/pdal/ CACHE PATH "sysconfig")
+
+include(CMakePackageConfigHelpers)
+
+set(PDAL_CONFIG_INCLUDE_DIRS
+  "${CMAKE_INSTALL_PREFIX}/include"
+  "${Boost_INCLUDE_DIRS}")
+set(PDAL_CONFIG_LIBRARY_DIRS
+  "${CMAKE_INSTALL_PREFIX}/lib"
+  "${Boost_LIBRARY_DIRS}")
+
+configure_package_config_file(
+  PDALConfig.cmake.in
+  ${CMAKE_CURRENT_BINARY_DIR}/PDALConfig.cmake
+  INSTALL_DESTINATION ${LIB_INSTALL_DIR}/pdal/cmake
+  PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR)
+
+write_basic_package_version_file(
+  ${CMAKE_CURRENT_BINARY_DIR}/PDALConfigVersion.cmake
+  VERSION ${PDAL_VERSION_STRING}
+  COMPATIBILITY SameMajorVersion)
+
+install(FILES
+  ${CMAKE_CURRENT_BINARY_DIR}/PDALConfig.cmake
+  ${CMAKE_CURRENT_BINARY_DIR}/PDALConfigVersion.cmake
+  DESTINATION ${LIB_INSTALL_DIR}/pdal/cmake)
diff --git a/cmake/directories.cmake b/cmake/directories.cmake
new file mode 100644
index 0000000..956b498
--- /dev/null
+++ b/cmake/directories.cmake
@@ -0,0 +1,13 @@
+if(NOT ROOT_DIR)
+    message(FATAL_ERROR "ROOT_DIR must be set in top-level CMakeLists.txt")
+endif()
+set(PDAL_SRC_DIR ${ROOT_DIR}/src)
+set(PDAL_CMAKE_DIR ${ROOT_DIR}/cmake)
+set(PDAL_INCLUDE_DIR ${ROOT_DIR}/include)
+set(PDAL_MODULE_DIR ${PDAL_CMAKE_DIR}/modules)
+set(PDAL_UTIL_DIR ${ROOT_DIR}/src/util)
+set(PDAL_TOOLS_DIR ${ROOT_DIR}/tools)
+set(PDAL_KERNEL_DIR ${ROOT_DIR}/kernels)
+set(PDAL_FILTER_DIR ${ROOT_DIR}/filters)
+set(PDAL_IO_DIR ${ROOT_DIR}/io)
+
diff --git a/cmake/gdal.cmake b/cmake/gdal.cmake
new file mode 100644
index 0000000..4f1a148
--- /dev/null
+++ b/cmake/gdal.cmake
@@ -0,0 +1,14 @@
+#
+# GDAL/OGR support (required)
+#
+find_package(GDAL QUIET 1.9.0)
+set_package_properties(GDAL PROPERTIES TYPE REQUIRED
+    PURPOSE "Provides general purpose raster, vector, and reference system support")
+if (GDAL_FOUND)
+
+    include_directories("${GDAL_INCLUDE_DIR}")
+    mark_as_advanced(CLEAR GDAL_INCLUDE_DIR)
+    mark_as_advanced(CLEAR GDAL_LIBRARY)
+else()
+    message(FATAL_ERROR "GDAL support is required")
+endif()
diff --git a/cmake/geos.cmake b/cmake/geos.cmake
new file mode 100644
index 0000000..b3a4aa3
--- /dev/null
+++ b/cmake/geos.cmake
@@ -0,0 +1,18 @@
+#
+# GEOS (optional)
+#
+find_package(GEOS QUIET 3.3)
+set_package_properties(GEOS PROPERTIES TYPE OPTIONAL
+    PURPOSE "Provides general purpose geometry support")
+if (GEOS_FOUND)
+    find_file(GEOS_VERSION_H version.h "${GEOS_INCLUDE_DIR}/geos")
+    if ("${GEOS_VERSION_H}" STREQUAL "GEOS_VERSION_H-NOTFOUND")
+        set(GEOS_LIBRARY "")
+        set(GEOS_FOUND FALSE)
+    else()
+        include_directories("${GEOS_INCLUDE_DIR}")
+        set(PDAL_HAVE_GEOS 1)
+    endif()
+else()
+    set(GEOS_LIBRARY "")
+endif()
diff --git a/cmake/geotiff.cmake b/cmake/geotiff.cmake
new file mode 100644
index 0000000..4450f05
--- /dev/null
+++ b/cmake/geotiff.cmake
@@ -0,0 +1,19 @@
+#
+# GeoTIFF support
+#
+option(WITH_GEOTIFF "Choose if GeoTIFF support should be built" TRUE)
+if (WITH_GEOTIFF)
+    find_package(GeoTIFF QUIET 1.3.0)
+    set_package_properties(GeoTIFF PROPERTIES TYPE OPTIONAL)
+    if (GEOTIFF_FOUND)
+        include_directories("${GEOTIFF_INCLUDE_DIR}")
+        set(PDAL_HAVE_LIBGEOTIFF 1)
+        mark_as_advanced(CLEAR TIFF_INCLUDE_DIR)
+        mark_as_advanced(CLEAR TIFF_LIBRARY)
+        if (WIN32)
+            set(TIFF_NAMES libtiff_i)
+        endif(WIN32)
+    else()
+        set(WITH_GEOTIFF FALSE)
+    endif()
+endif()
diff --git a/cmake/geowave.cmake b/cmake/geowave.cmake
new file mode 100644
index 0000000..a9cec72
--- /dev/null
+++ b/cmake/geowave.cmake
@@ -0,0 +1,17 @@
+#
+# GeoWave support
+#
+
+# GeoWave support - optional, default=OFF
+option(BUILD_PLUGIN_GEOWAVE "Choose if GeoWave support should be built" FALSE)
+if(BUILD_PLUGIN_GEOWAVE)
+    find_package(GeoWave 0.8.3)
+    if(GEOWAVE_FOUND)    
+        mark_as_advanced(CLEAR GeoWave_RUNTIME_JAR)
+        add_definitions(-DGEOWAVE_RUNTIME_JAR=${GEOWAVE_RUNTIME_JAR})
+        set(PDAL_HAVE_GEOWAVE 1)
+    else()
+        set(GEOWAVE_RUNTIME_JAR "")
+        set(BUILD_PLUGIN_GEOWAVE FALSE)
+    endif()
+endif()
diff --git a/cmake/hdf5.cmake b/cmake/hdf5.cmake
new file mode 100644
index 0000000..98cd7ea
--- /dev/null
+++ b/cmake/hdf5.cmake
@@ -0,0 +1,11 @@
+#
+# HDF5
+#
+
+set (HDF5_FIND_COMPONENTS "CXX")
+find_package(HDF5 COMPONENTS CXX REQUIRED)
+if(HDF5_FOUND)
+    include_directories(${HDF5_INCLUDE_DIR})
+    add_definitions(-DHAVE_HDF5=1)
+    set(PDAL_HAVE_HDF5 1)
+endif()
diff --git a/cmake/jace.cmake b/cmake/jace.cmake
new file mode 100644
index 0000000..62ed14f
--- /dev/null
+++ b/cmake/jace.cmake
@@ -0,0 +1,21 @@
+#
+# Jace support
+#
+
+# Jace support - optional, default=OFF
+if(BUILD_PLUGIN_GEOWAVE)
+    find_package(Jace)
+    if(JACE_FOUND)    
+        set(CMAKE_REQUIRED_LIBRARIES "${JACE_LIBRARY}")
+        include_directories(${JACE_INCLUDE_DIR})
+        mark_as_advanced(CLEAR JACE_INCLUDE_DIR)
+        mark_as_advanced(CLEAR JACE_LIBRARY)
+        mark_as_advanced(CLEAR JACE_RUNTIME_JAR)
+        add_definitions(-DJACE_RUNTIME_JAR=${JACE_RUNTIME_JAR})
+        set(PDAL_HAVE_JACE 1)
+    else()
+        set(JACE_LIBRARY "")
+        set(JACE_RUNTIME "")
+        set(BUILD_PLUGIN_GEOWAVE FALSE)
+    endif()
+endif()
diff --git a/cmake/jni.cmake b/cmake/jni.cmake
new file mode 100644
index 0000000..f3a89aa
--- /dev/null
+++ b/cmake/jni.cmake
@@ -0,0 +1,19 @@
+#
+# JNI support
+#
+
+# JNI support - optional, default=OFF
+if(BUILD_PLUGIN_GEOWAVE)
+    find_package(JNI)
+    if(JNI_FOUND) 
+        set(CMAKE_REQUIRED_LIBRARIES "${JNI_LIBRARIES}")
+        include_directories(${JNI_INCLUDE_DIRS})
+        mark_as_advanced(CLEAR JNI_INCLUDE_DIRS)
+        mark_as_advanced(CLEAR JNI_LIBRARIES)
+        add_definitions(-DJAVA_EXECUTABLE_PATH=${Java_JAVA_EXECUTABLE})
+        set(PDAL_HAVE_JNI 1)
+    else()
+        set(JNI_LIBRARIES "")
+        set(BUILD_PLUGIN_GEOWAVE FALSE)
+    endif()
+endif()
diff --git a/cmake/laszip.cmake b/cmake/laszip.cmake
new file mode 100644
index 0000000..5271142
--- /dev/null
+++ b/cmake/laszip.cmake
@@ -0,0 +1,22 @@
+#
+# LASZIP support
+#
+option(WITH_LASZIP "Choose if LASzip support should be built" TRUE)
+option(WITH_STATIC_LASZIP "Choose if LASzip should be statically linked" FALSE)
+mark_as_advanced(WITH_STATIC_LASZIP)
+if(WITH_LASZIP)
+    find_package(LASzip QUIET 1.0.1)
+    set_package_properties(LASzip PROPERTIES TYPE RECOMMENDED
+        PURPOSE "Provides LASzip compression")
+    if(LASZIP_FOUND)
+        set(CMAKE_REQUIRED_LIBRARIES "${LASZIP_LIBRARY}")
+        include_directories(${LASZIP_INCLUDE_DIR})
+        mark_as_advanced(CLEAR LASZIP_INCLUDE_DIR)
+        mark_as_advanced(CLEAR LASZIP_LIBRARY)
+        mark_as_advanced(CLEAR LASZIP_VERSION)
+        set(PDAL_HAVE_LASZIP 1)
+    else()
+        set(LASZIP_LIBRARY "")
+        set(WITH_LASZIP FALSE)
+    endif()
+endif()
diff --git a/cmake/lazperf.cmake b/cmake/lazperf.cmake
new file mode 100644
index 0000000..5ad9193
--- /dev/null
+++ b/cmake/lazperf.cmake
@@ -0,0 +1,10 @@
+option(WITH_LAZPERF
+    "Choose to use laz-perf compression for database drivers" FALSE)
+if (WITH_LAZPERF)
+    find_package(Lazperf)
+    set_package_properties(Lazperf PROPERTIES TYPE OPTIONAL)
+    if (LAZPERF_FOUND)
+        include_directories(${LAZPERF_INCLUDE_DIR})
+        set(PDAL_HAVE_LAZPERF 1)
+    endif()
+endif()
diff --git a/cmake/libraries.cmake b/cmake/libraries.cmake
new file mode 100644
index 0000000..dae98ea
--- /dev/null
+++ b/cmake/libraries.cmake
@@ -0,0 +1,13 @@
+# Build shared libraries by default.
+
+option(PDAL_BUILD_STATIC "Build PDAL as a static library" OFF)
+if (PDAL_BUILD_STATIC)
+  set(PDAL_LIB_TYPE "STATIC")
+  set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
+else ()
+  set(PDAL_LIB_TYPE "SHARED")
+  if (WIN32)
+    set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_IMPORT_LIBRARY_SUFFIX})
+  endif()
+endif()
+mark_as_advanced(PDAL_BUILD_STATIC)
diff --git a/cmake/libxml2.cmake b/cmake/libxml2.cmake
new file mode 100644
index 0000000..27f88fd
--- /dev/null
+++ b/cmake/libxml2.cmake
@@ -0,0 +1,17 @@
+get_property(EXISTS GLOBAL PROPERTY _LIBXML2_INCLUDED)
+if(EXISTS)
+    return()
+endif()
+#
+# libxml2
+#
+
+
+find_package(LibXml2)
+set_package_properties(LibXml2 PROPERTIES TYPE OPTIONAL)
+mark_as_advanced(CLEAR LIBXML2_INCLUDE_DIR)
+mark_as_advanced(CLEAR LIBXML2_LIBRARIES)
+include_directories(${LIBXML2_INCLUDE_DIR})
+set(PDAL_HAVE_LIBXML2 1)
+
+set_property(GLOBAL PROPERTY _LIBXML2_INCLUDED TRUE)
diff --git a/cmake/macros.cmake b/cmake/macros.cmake
new file mode 100644
index 0000000..578f97e
--- /dev/null
+++ b/cmake/macros.cmake
@@ -0,0 +1,241 @@
+##########################################################################
+# These macros were taken from the Point Cloud Library (pointclouds.org) #
+# and have been modified for PDAL. License details follow.               #
+##########################################################################
+# Software License Agreement (BSD License)                               #
+#                                                                        #
+# Point Cloud Library (PCL) - www.pointclouds.org                        #
+# Copyright (c) 2009-2012, Willow Garage, Inc.                           #
+# Copyright (c) 2012-, Open Perception, Inc.                             #
+# Copyright (c) XXX, respective authors.                                 #
+#                                                                        #
+# All rights reserved.                                                   #
+#                                                                        #
+# Redistribution and use in source and binary forms, with or without     #
+# modification, are permitted provided that the following conditions     #
+# are met:                                                               #
+#                                                                        #
+#  * Redistributions of source code must retain the above copyright      #
+#    notice, this list of conditions and the following disclaimer.       #
+#  * Redistributions in binary form must reproduce the above             #
+#    copyright notice, this list of conditions and the following         #
+#    disclaimer in the documentation and/or other materials provided     #
+#    with the distribution.                                              #
+#  * Neither the name of the copyright holder(s) nor the names of its    #
+#    contributors may be used to endorse or promote products derived     #
+#    from this software without specific prior written permission.       #
+#                                                                        #
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS    #
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT      #
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS      #
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE         #
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,    #
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,   #
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;       #
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER       #
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT     #
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN      #
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE        #
+# POSSIBILITY OF SUCH DAMAGE.                                            #
+##########################################################################
+
+
+###############################################################################
+# Add a set of include files to install.
+# _component The part of PDAL that the install files belong to.
+# _subdir The sub-directory for these include files.
+# ARGN The include files.
+macro(PDAL_ADD_INCLUDES _subdir)
+    install(FILES ${ARGN} DESTINATION ${PDAL_INCLUDE_INSTALL_DIR}/${_subdir})
+endmacro(PDAL_ADD_INCLUDES)
+
+
+###############################################################################
+# Add a library target.
+# _name The library name.
+# _component The part of PDAL that this library belongs to.
+# ARGN The source files for the library.
+macro(PDAL_ADD_LIBRARY _name)
+    add_library(${_name} ${PDAL_LIB_TYPE} ${ARGN})
+    set_property(TARGET ${_name} PROPERTY FOLDER "Libraries")
+
+    install(TARGETS ${_name}
+        EXPORT PDALTargets
+        RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
+        LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
+        ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
+    if (APPLE)
+        set_target_properties(${_name} PROPERTIES INSTALL_NAME_DIR
+            "@executable_path/../lib")
+    endif()
+endmacro(PDAL_ADD_LIBRARY)
+
+###############################################################################
+# Add an executable target.
+# _name The executable name.
+# _component The part of PDAL that this library belongs to.
+# ARGN the source files for the library.
+macro(PDAL_ADD_EXECUTABLE _name)
+    add_executable(${_name} ${ARGN})
+
+    # must link explicitly against boost.
+    target_link_libraries(${_name} ${Boost_LIBRARIES})
+
+    set(PDAL_EXECUTABLES ${PDAL_EXECUTABLES} ${_name})
+    install(TARGETS ${_name}
+        EXPORT PDALTargets
+        RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR})
+endmacro(PDAL_ADD_EXECUTABLE)
+
+
+###############################################################################
+# Add a plugin target.
+# _name The plugin name.
+# ARGN :
+#    FILES the srouce files for the plugin
+#    LINK_WITH link plugin with libraries
+macro(PDAL_ADD_PLUGIN _name _type _shortname)
+    set(options)
+    set(oneValueArgs)
+    set(multiValueArgs FILES LINK_WITH)
+    cmake_parse_arguments(PDAL_ADD_PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+    if(WIN32)
+        set(${_name} "libpdal_plugin_${_type}_${_shortname}")
+    else()
+        set(${_name} "pdal_plugin_${_type}_${_shortname}")
+    endif()
+
+    if (WIN32)
+	    list(APPEND ${PDAL_ADD_PLUGIN_FILES} ${PDAL_TARGET_OBJECTS})
+    endif()
+
+    add_library(${${_name}} SHARED ${PDAL_ADD_PLUGIN_FILES})
+    target_link_libraries(${${_name}} ${PDAL_BASE_LIB_NAME}
+        ${PDAL_ADD_PLUGIN_LINK_WITH})
+
+    set_property(TARGET ${${_name}} PROPERTY FOLDER "Plugins/${_type}")
+
+    install(TARGETS ${${_name}}
+        RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
+        LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
+        ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
+    if (APPLE)
+        set_target_properties(${${_name}} PROPERTIES INSTALL_NAME_DIR "@loader_path/../lib")
+    endif()
+endmacro(PDAL_ADD_PLUGIN)
+
+###############################################################################
+# Add a test target.
+# _name The driver name.
+# ARGN :
+#    FILES the source files for the test
+#    LINK_WITH link test executable with libraries
+macro(PDAL_ADD_TEST _name)
+    set(options)
+    set(oneValueArgs)
+    set(multiValueArgs FILES LINK_WITH)
+    cmake_parse_arguments(PDAL_ADD_TEST "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+    include_directories(${PROJECT_SOURCE_DIR}/test/unit)
+    include_directories(${PROJECT_BINARY_DIR}/test/unit)
+    set(common_srcs
+        ${PROJECT_SOURCE_DIR}/test/unit/Support.cpp
+        ${PROJECT_SOURCE_DIR}/test/unit/TestConfig.cpp
+    )
+    if (WIN32)
+        list(APPEND ${PDAL_ADD_TEST_FILES} ${PDAL_TARGET_OBJECTS})
+        add_definitions("-DPDAL_DLL_EXPORT=1")
+    endif()
+    add_executable(${_name} ${PDAL_ADD_TEST_FILES} ${common_srcs})
+    set_target_properties(${_name} PROPERTIES COMPILE_DEFINITIONS PDAL_DLL_IMPORT)
+    set_property(TARGET ${_name} PROPERTY FOLDER "Tests")
+    target_link_libraries(${_name} ${PDAL_BASE_LIB_NAME} gtest
+        ${PDAL_ADD_TEST_LINK_WITH})
+    add_test(NAME ${_name} COMMAND "${PROJECT_BINARY_DIR}/bin/${_name}" WORKING_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/..")
+    set_property(TEST ${_name} PROPERTY ENVIRONMENT
+      # Ensure plugins are loaded from build dir
+      # https://github.com/PDAL/PDAL/issues/840
+      "PDAL_DRIVER_PATH=${PROJECT_BINARY_DIR}/lib"
+    )
+endmacro(PDAL_ADD_TEST)
+
+###############################################################################
+# Add a driver. Creates object library and adds files to source_group for windows IDE.
+# _type The driver type (e.g., driver, filter, kernel).
+# _name The driver name.
+# _srcs The list of source files to add.
+# _incs The list of includes to add.
+# _objs The object library name that is created.
+macro(PDAL_ADD_DRIVER _type _name _srcs _incs _objs)
+    source_group("Header Files\\${_type}\\${_name}" FILES ${_incs})
+    source_group("Source Files\\${_type}\\${_name}" FILES ${_srcs})
+
+    set(libname ${_type}_${_name})
+    set(${_objs} $<TARGET_OBJECTS:${libname}>)
+	if (NOT WIN32)
+		add_definitions("-fPIC")
+	endif()
+    add_library(${libname} OBJECT ${_srcs} ${_incs})
+    set_property(TARGET ${libname} PROPERTY FOLDER "Drivers/${_type}")
+
+    install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/"
+        DESTINATION "${PDAL_INCLUDE_INSTALL_DIR}"
+        FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
+    )
+endmacro(PDAL_ADD_DRIVER)
+
+###############################################################################
+# Get the operating system information. Generally, CMake does a good job of
+# this. Sometimes, though, it doesn't give enough information. This macro will
+# distinguish between the UNIX variants. Otherwise, use the CMake variables
+# such as WIN32 and APPLE and CYGWIN.
+# Sets OS_IS_64BIT if the operating system is 64-bit.
+# Sets LINUX if the operating system is Linux.
+macro(GET_OS_INFO)
+    string(REGEX MATCH "Linux" OS_IS_LINUX ${CMAKE_SYSTEM_NAME})
+    if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+        set(OS_IS_64BIT TRUE)
+    else(CMAKE_SIZEOF_VOID_P EQUAL 8)
+        set(OS_IS_64BIT FALSE)
+    endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
+endmacro(GET_OS_INFO)
+
+###############################################################################
+# Pull the component parts out of the version number.
+macro(DISSECT_VERSION)
+    # Find version components
+    string(REGEX REPLACE "^([0-9]+).*" "\\1"
+        PDAL_VERSION_MAJOR "${PDAL_VERSION_STRING}")
+    string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1"
+        PDAL_VERSION_MINOR "${PDAL_VERSION_STRING}")
+    string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1"
+        PDAL_VERSION_PATCH "${PDAL_VERSION_STRING}")
+    string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.[0-9]+(.*)" "\\1"
+        PDAL_CANDIDATE_VERSION "${PDAL_VERSION_STRING}")
+endmacro(DISSECT_VERSION)
+
+###############################################################################
+# Set the destination directories for installing stuff.
+# Sets PDAL_LIB_INSTALL_DIR. Install libraries here.
+# Sets PDAL_BIN_INSTALL_DIR. Install binaries here.
+# Sets PDAL_INCLUDE_INSTALL_DIR. Install include files here, preferably in a
+# subdirectory named after the library in question (e.g.
+# "registration/blorgle.h")
+macro(SET_INSTALL_DIRS)
+  string(TOLOWER ${PROJECT_NAME} PROJECT_NAME_LOWER)
+  if (NOT DEFINED PDAL_LIB_INSTALL_DIR)
+    set(PDAL_LIB_INSTALL_DIR lib)
+  endif ()
+    set(PDAL_INCLUDE_INSTALL_ROOT "include/")
+    set(PDAL_INCLUDE_INSTALL_DIR
+        "${PDAL_INCLUDE_INSTALL_ROOT}/${PROJECT_NAME_LOWER}/")
+    set(PDAL_DOC_INCLUDE_DIR
+        "share/doc/${PROJECT_NAME_LOWER}-${PDAL_VERSION_MAJOR}.${PDAL_VERSION_MINOR}")
+    set(PDAL_BIN_INSTALL_DIR "bin")
+    set(PDAL_PLUGIN_INSTALL_DIR "share/pdal/plugins")
+    if(WIN32)
+        set(PDALCONFIG_INSTALL_DIR "cmake")
+    else(WIN32)
+        set(PDALCONFIG_INSTALL_DIR
+            "share/${PROJECT_NAME_LOWER}-${PDAL_VERSION_MAJOR}.${PDAL_VERSION_MINOR}")
+    endif(WIN32)
+endmacro(SET_INSTALL_DIRS)
diff --git a/cmake/modules.cmake b/cmake/modules.cmake
new file mode 100644
index 0000000..7cfc648
--- /dev/null
+++ b/cmake/modules.cmake
@@ -0,0 +1,5 @@
+#
+# Processing necessary to deal with modules.
+#
+set(CMAKE_MODULE_PATH ${PDAL_MODULE_DIR} ${CMAKE_MODULE_PATH})
+
diff --git a/cmake/modules/BuildOSGeo4W.cmake b/cmake/modules/BuildOSGeo4W.cmake
new file mode 100644
index 0000000..d8641c2
--- /dev/null
+++ b/cmake/modules/BuildOSGeo4W.cmake
@@ -0,0 +1,152 @@
+###############################################################################
+#
+# OSGeo4W packaging
+#
+###############################################################################
+
+
+set(OSGEO4W_DIR osgeo4w)
+set(OSGEO4W_LIB_DIR ${OSGEO4W_DIR}/lib)
+set(OSGEO4W_ETC_DIR ${OSGEO4W_DIR}/etc)
+set(OSGEO4W_ETC_INI_DIR ${OSGEO4W_DIR}/etc/ini)
+set(OSGEO4W_ETC_POSTINSTALL_DIR ${OSGEO4W_DIR}/etc/postinstall)
+set(OSGEO4W_LIB_BIN_DIR ${OSGEO4W_DIR}/lib/bin)
+set(OSGEO4W_BIN_DIR ${OSGEO4W_DIR}/bin)
+set(OSGEO4W_DEVEL_DIR ${OSGEO4W_DIR}/devel)
+set(OSGEO4W_DEVEL_INCLUDE_DIR ${OSGEO4W_DEVEL_DIR}/include)
+set(OSGEO4W_DEVEL_INCLUDE_LIBLAS_DIR ${OSGEO4W_DEVEL_INCLUDE_DIR}/liblas)
+set(OSGEO4W_DEVEL_LIB_DIR ${OSGEO4W_DEVEL_DIR}/lib)
+set(OSGEO4W_DEVEL_BIN_DIR ${OSGEO4W_DEVEL_DIR}/bin)
+
+set(OSGEO4W_PYTHON_DIR ${OSGEO4W_DIR}/apps/python25/lib/site-packages/liblas)
+set(OSGEO4W_PACKAGES ${OSGEO4W_DIR}/packages)
+
+
+set(OSGEO4W_DIRECTORIES
+    ${OSGEO4W_DIR}
+    ${OSGEO4W_ETC_DIR}
+    ${OSGEO4W_ETC_INI_DIR}
+    ${OSGEO4W_ETC_POSTINSTALL_DIR}
+    ${OSGEO4W_LIB_DIR}
+    ${OSGEO4W_LIB_BIN_DIR}
+    ${OSGEO4W_DEVEL_DIR}
+    ${OSGEO4W_DEVEL_INCLUDE_DIR}
+    ${OSGEO4W_DEVEL_INCLUDE_LIBLAS_DIR}
+    ${OSGEO4W_DEVEL_LIB_DIR}
+    ${OSGEO4W_PYTHON_DIR}
+    ${OSGEO4W_DEVEL_BIN_DIR}
+    ${OSGEO4W_PACKAGES}
+    ${OSGEO4W_BIN_DIR})
+
+
+
+add_custom_target(make_osgeo4w_directories
+  COMMAND ${CMAKE_COMMAND} -E echo "Building OSGeo4W install directories")
+
+foreach(utility ${LIBLAS_UTILITIES})
+    add_dependencies(  make_osgeo4w_directories  ${utility} )
+endforeach()
+
+
+macro (make_directories)
+    add_custom_command(
+        TARGET make_osgeo4w_directories
+        COMMAND ${CMAKE_COMMAND} -E  remove_directory  ${libLAS_SOURCE_DIR}/osgeo4w DEPENDS osgeo4w
+    )
+    foreach(directory ${OSGEO4W_DIRECTORIES})
+
+    STRING(REGEX REPLACE "/" "_" target "${directory}" )
+
+    add_custom_command(
+        TARGET make_osgeo4w_directories
+        COMMAND ${CMAKE_COMMAND} -E make_directory ${directory}
+    )
+
+    endforeach()
+
+endmacro(make_directories)
+
+
+
+add_custom_target(copy ALL COMMENT "Copying OSGeo4W files")
+add_dependencies( copy make_osgeo4w_directories  )
+
+
+macro(copy_files GLOBPAT DESTINATION  )
+
+    file(GLOB_RECURSE COPY_FILES
+         RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+        ${GLOBPAT})
+    foreach(FILENAME ${COPY_FILES})
+        set(SRC "${FILENAME}")
+        set(DST "${DESTINATION}")
+        add_custom_command(
+            TARGET copy
+            COMMAND ${CMAKE_COMMAND} -E copy ${SRC} ${DST}
+        )
+    endforeach(FILENAME)
+endmacro(copy_files)
+
+
+macro(copy_directory SOURCE DESTINATION  )
+        add_custom_command(
+            TARGET copy
+            COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE} ${DESTINATION}
+        )
+endmacro(copy_directory)
+
+
+add_custom_target(tar
+  COMMAND ${CMAKE_COMMAND} -E echo "Tarring OSGeo4W install")
+add_dependencies( tar copy  )
+
+macro (tar_directories source destination base_paths)    
+    add_custom_command(
+        TARGET tar
+        COMMAND ${CMAKE_COMMAND} -E chdir ${source} cmake -E tar cjf  ${destination} ${base_paths}
+    )
+endmacro(tar_directories)
+
+make_directories()
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/lasinfo.exe ${OSGEO4W_BIN_DIR}/lasinfo.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/lasinfo-old.exe ${OSGEO4W_BIN_DIR}/lasinfo-old.exe   )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2las.exe ${OSGEO4W_BIN_DIR}/las2las.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2las-old.exe ${OSGEO4W_BIN_DIR}/las2las-old.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2ogr.exe ${OSGEO4W_BIN_DIR}/las2ogr.exe   )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2oci.exe ${OSGEO4W_BIN_DIR}/las2oci.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2txt.exe ${OSGEO4W_BIN_DIR}/las2txt.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/las2txt-old.exe ${OSGEO4W_BIN_DIR}/las2txt-old.exe   )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/lasblock.exe ${OSGEO4W_BIN_DIR}/lasblock.exe   )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/lasmerge.exe ${OSGEO4W_BIN_DIR}/lasmerge.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/txt2las.exe ${OSGEO4W_BIN_DIR}/txt2las.exe  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/ts2las.exe ${OSGEO4W_BIN_DIR}/ts2las.exe  )
+
+
+
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/liblas_c.dll ${OSGEO4W_BIN_DIR}/  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/liblas.dll ${OSGEO4W_BIN_DIR}/  )
+
+copy_files(${libLAS_SOURCE_DIR}/liblas-osgeo4w-start.bat.tmpl ${OSGEO4W_BIN_DIR}/liblas.bat.tmpl )
+copy_files(${libLAS_SOURCE_DIR}/liblas-osgeo4w-init.bat ${OSGEO4W_ETC_INI_DIR}/liblas.bat )
+copy_files(${libLAS_SOURCE_DIR}/liblas-osgeo4w-postinstall.bat ${OSGEO4W_ETC_POSTINSTALL_DIR}/liblas.bat )
+
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/liblas.lib ${OSGEO4W_DEVEL_LIB_DIR}/  )
+copy_files(${LIBLAS_BUILD_OUTPUT_DIRECTORY}/liblas_c.lib ${OSGEO4W_DEVEL_LIB_DIR}/  )
+
+
+copy_directory(./include/liblas/ ${OSGEO4W_DEVEL_INCLUDE_LIBLAS_DIR}/  )
+copy_files(./python/liblas/*.py ${OSGEO4W_PYTHON_DIR}/  )
+
+tar_directories(${OSGEO4W_DIR} ${libLAS_SOURCE_DIR}/${OSGEO4W_PACKAGES}/liblas-${LIBLAS_VERSION_MAJOR}.${LIBLAS_VERSION_MINOR}.${LIBLAS_VERSION_PATCH}-${OSGEO4W_UPSTREAM_RELEASE}.tar.bz2 "bin/;etc/")
+tar_directories(${OSGEO4W_DIR} ${libLAS_SOURCE_DIR}/${OSGEO4W_PACKAGES}/liblas-python-${LIBLAS_VERSION_MAJOR}.${LIBLAS_VERSION_MINOR}.${LIBLAS_VERSION_PATCH}-${OSGEO4W_UPSTREAM_RELEASE}.tar.bz2 apps)
+tar_directories(${OSGEO4W_DIR}/devel ${libLAS_SOURCE_DIR}/${OSGEO4W_PACKAGES}/liblas-devel-${LIBLAS_VERSION_MAJOR}.${LIBLAS_VERSION_MINOR}.${LIBLAS_VERSION_PATCH}-${OSGEO4W_UPSTREAM_RELEASE}.tar.bz2 "lib/;include")
+
+
+add_custom_target(osgeo4w
+    COMMAND ${CMAKE_COMMAND} -E echo "Making OSGeo4W build")
+
+add_dependencies( osgeo4w tar   )
+
+
+
+
diff --git a/cmake/modules/FindFreeGLUT.cmake b/cmake/modules/FindFreeGLUT.cmake
new file mode 100644
index 0000000..03dcdd8
--- /dev/null
+++ b/cmake/modules/FindFreeGLUT.cmake
@@ -0,0 +1,37 @@
+# Copyright (C) 2007-2009 LuaDist.
+# Created by Peter Kapec <kapecp at gmail.com>
+# Redistribution and use of this file is allowed according to the terms of the MIT license.
+# For details see the COPYRIGHT file distributed with LuaDist.
+#	Note:
+#		Searching headers and libraries is very simple and is NOT as powerful as scripts
+#		distributed with CMake, because LuaDist defines directories to search for.
+#		Everyone is encouraged to contact the author with improvements. Maybe this file
+#		becomes part of CMake distribution sometimes.
+
+# - Find FreeGLUT
+# Find the native FreeGLUT headers and libraries.
+#
+#  FREEGLUT_INCLUDE_DIRS - where to find freeglut.h, etc.
+#  FREEGLUT_LIBRARIES    - List of libraries when using FreeGLUT.
+#  FREEGLUT_FOUND        - True if FreeGLUT found.
+
+# Look for the header file.
+FIND_PATH(FREEGLUT_INCLUDE_DIR NAMES GL/freeglut.h)
+
+# Look for the library.
+FIND_LIBRARY(FREEGLUT_LIBRARY NAMES freeglut)
+
+# Handle the QUIETLY and REQUIRED arguments and set FREEGLUT_FOUND to TRUE if all listed variables are TRUE.
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(FREEGLUT DEFAULT_MSG FREEGLUT_LIBRARY FREEGLUT_INCLUDE_DIR)
+
+# Copy the results to the output variables.
+IF(FREEGLUT_FOUND)
+	SET(FREEGLUT_LIBRARIES ${FREEGLUT_LIBRARY})
+	SET(FREEGLUT_INCLUDE_DIRS ${FREEGLUT_INCLUDE_DIR})
+ELSE(FREEGLUT_FOUND)
+	SET(FREEGLUT_LIBRARIES)
+	SET(FREEGLUT_INCLUDE_DIRS)
+ENDIF(FREEGLUT_FOUND)
+
+MARK_AS_ADVANCED(FREEGLUT_INCLUDE_DIRS FREEGLUT_LIBRARIES)
diff --git a/cmake/modules/FindGDAL.cmake b/cmake/modules/FindGDAL.cmake
new file mode 100644
index 0000000..143a0b6
--- /dev/null
+++ b/cmake/modules/FindGDAL.cmake
@@ -0,0 +1,261 @@
+###############################################################################
+# CMake macro to find GDAL library.
+#
+# On success, the macro sets the following variables:
+# GDAL_FOUND       = if the library found
+# GDAL_LIBRARY     = full path to the library
+# GDAL_INCLUDE_DIR = where to find the library headers 
+#
+# On Unix, macro sets also:
+# GDAL_VERSION_STRING = human-readable string containing version of the library
+#
+# Author of original: Magnus Homann (Quantum GIS)
+# Modifications: Mateusz Loskot <mateusz at loskot.net>
+#
+###############################################################################
+
+# Computes the realtionship between two version strings.  A version
+# string is a number delineated by '.'s such as 1.3.2 and 0.99.9.1.
+# You can feed version strings with different number of dot versions,
+# and the shorter version number will be padded with zeros: 9.2 <
+# 9.2.1 will actually compare 9.2.0 < 9.2.1.
+#
+# Input: a_in - value, not variable
+#        b_in - value, not variable
+#        result_out - variable with value:
+#                         -1 : a_in <  b_in
+#                          0 : a_in == b_in
+#                          1 : a_in >  b_in
+#
+# Written by James Bigler.
+MACRO(COMPARE_VERSION_STRINGS a_in b_in result_out)
+  # Since SEPARATE_ARGUMENTS using ' ' as the separation token,
+  # replace '.' with ' ' to allow easy tokenization of the string.
+  STRING(REPLACE "." " " a ${a_in})
+  STRING(REPLACE "." " " b ${b_in})
+  SEPARATE_ARGUMENTS(a)
+  SEPARATE_ARGUMENTS(b)
+
+  # Check the size of each list to see if they are equal.
+  LIST(LENGTH a a_length)
+  LIST(LENGTH b b_length)
+
+  # Pad the shorter list with zeros.
+
+  # Note that range needs to be one less than the length as the for
+  # loop is inclusive (silly CMake).
+  IF(a_length LESS b_length)
+    # a is shorter
+    SET(shorter a)
+    MATH(EXPR range "${b_length} - 1")
+    MATH(EXPR pad_range "${b_length} - ${a_length} - 1")
+  ELSE(a_length LESS b_length)
+    # b is shorter
+    SET(shorter b)
+    MATH(EXPR range "${a_length} - 1")
+    MATH(EXPR pad_range "${a_length} - ${b_length} - 1")
+  ENDIF(a_length LESS b_length)
+
+  # PAD out if we need to
+  IF(NOT pad_range LESS 0)
+    FOREACH(pad RANGE ${pad_range})
+      # Since shorter is an alias for b, we need to get to it by by dereferencing shorter.
+      LIST(APPEND ${shorter} 0)
+    ENDFOREACH(pad RANGE ${pad_range})
+  ENDIF(NOT pad_range LESS 0)
+
+  SET(result 0)
+  FOREACH(index RANGE ${range})
+    IF(result EQUAL 0)
+      # Only continue to compare things as long as they are equal
+      LIST(GET a ${index} a_version)
+      LIST(GET b ${index} b_version)
+      # LESS
+      IF(a_version LESS b_version)
+        SET(result -1)
+      ENDIF(a_version LESS b_version)
+      # GREATER
+      IF(a_version GREATER b_version)
+        SET(result 1)
+      ENDIF(a_version GREATER b_version)
+    ENDIF(result EQUAL 0)
+  ENDFOREACH(index)
+
+  # Copy out the return result
+  SET(${result_out} ${result})
+ENDMACRO(COMPARE_VERSION_STRINGS)
+
+set (GDAL_VERSION_COUNT 3)
+
+SET(GDAL_NAMES gdal)
+
+IF(WIN32)
+
+    SET(OSGEO4W_IMPORT_LIBRARY gdal_i)
+    IF(DEFINED ENV{OSGEO4W_ROOT})
+        SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+        #MESSAGE(STATUS " FindGDAL: trying OSGeo4W using environment variable OSGEO4W_ROOT=$ENV{OSGEO4W_ROOT}")
+    ELSE()
+        SET(OSGEO4W_ROOT_DIR c:/OSGeo4W)
+        #MESSAGE(STATUS " FindGDAL: trying OSGeo4W using default location OSGEO4W_ROOT=${OSGEO4W_ROOT_DIR}")
+    ENDIF()
+
+    IF(MINGW)
+        FIND_PATH(GDAL_INCLUDE_DIR
+            gdal.h
+            PATH_PREFIXES gdal gdal-1.6
+            PATHS
+            /usr/local/include
+            /usr/include
+            c:/msys/local/include
+            ${OSGEO4W_ROOT_DIR}/include)
+
+        FIND_LIBRARY(GDAL_LIBRARY
+            NAMES ${GDAL_NAMES}
+            PATH_PREFIXES gdal gdal-1.6
+            PATHS
+            /usr/local/lib
+            /usr/lib
+            c:/msys/local/lib
+            ${OSGEO4W_ROOT_DIR}/lib)
+    ENDIF(MINGW)
+
+    IF(MSVC)
+
+        FIND_PATH(GDAL_INCLUDE_DIR
+            NAMES gdal.h 
+            PATH_PREFIXES gdal gdal-1.6
+            PATHS
+            "${OSGEO4W_ROOT_DIR}/apps/gdal-dev/include"
+            "$ENV{LIB_DIR}/include/gdal"
+            ${OSGEO4W_ROOT_DIR}/include)
+
+        SET(GDAL_NAMES ${OSGEO4W_IMPORT_LIBRARY} ${GDAL_NAMES})
+        FIND_LIBRARY(GDAL_LIBRARY
+            NAMES ${GDAL_NAMES}
+            PATH_PREFIXES gdal gdal-1.6
+            PATHS
+            "$ENV{LIB_DIR}/lib"
+            /usr/lib
+            c:/msys/local/lib
+            "${OSGEO4W_ROOT_DIR}/apps/gdal-dev/lib"            
+            ${OSGEO4W_ROOT_DIR}/lib)
+        
+        IF(GDAL_LIBRARY)
+            SET(GDAL_LIBRARY;odbc32;odbccp32 CACHE STRING INTERNAL)
+        ENDIF()
+    ENDIF(MSVC)
+  
+ELSEIF(UNIX)
+
+    # Try to use framework on Mac OS X
+    IF(APPLE)
+        SET(GDAL_MAC_PATH /Library/Frameworks/GDAL.framework/unix/bin)
+    ENDIF()
+
+    # Try to use GDAL_HOME location if specified
+    IF($ENV{GDAL_HOME})
+        SET(GDAL_CONFIG_PREFER_PATH
+            "$ENV{GDAL_HOME}/bin" CACHE STRING "Search for gdal-config program in preferred location")
+    ENDIF()
+
+    # Try to use OSGeo4W installation
+    IF($ENV{OSGEO4W_HOME})
+        SET(GDAL_CONFIG_PREFER_OSGEO4W_PATH
+            "$ENV{OSGEO4W_HOME}/bin" CACHE STRING "Search for gdal-config program provided by OSGeo4W")
+    ENDIF()
+
+    # Try to use FWTools installation
+    IF($ENV{FWTOOLS_HOME})
+        SET(GDAL_CONFIG_PREFER_FWTOOLS_PATH
+            "$ENV{FWTOOLS_HOME}/bin_safe" CACHE STRING "Search for gdal-config program provided by FWTools")
+    ENDIF()
+
+    FIND_PROGRAM(GDAL_CONFIG gdal-config
+        ${GDAL_CONFIG_PREFER_PATH}
+        ${GDAL_CONFIG_PREFER_OSGEO4W_PATH}
+        ${GDAL_CONFIG_PREFER_FWTOOLS_PATH}
+        ${GDAL_MAC_PATH}
+        /usr/local/bin/
+        /usr/bin/)
+            
+    IF(GDAL_CONFIG) 
+
+        # TODO: Replace the regex hacks with CMake version comparison feature:
+        # if(version1 VERSION_LESS version2)
+
+        # Extract GDAL version
+        EXEC_PROGRAM(${GDAL_CONFIG} ARGS --version OUTPUT_VARIABLE GDAL_VERSION_STATED)
+        SET(GDAL_VERSION_STRING "${GDAL_VERSION_STATED}" CACHE STRING "Version of GDAL package found")
+
+        STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GDAL_VERSION_MAJOR "${GDAL_VERSION_STATED}")
+        STRING(REGEX REPLACE "([0-9]+)\\.(/^\\d{1,2}$/)\\.([0-9]+)" "\\2" GDAL_VERSION_MINOR "${GDAL_VERSION_STATED}")
+        STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\3" GDAL_VERSION_PATCH "${GDAL_VERSION_STATED}")
+        
+        # Check for GDAL version
+        if (GDAL_FIND_VERSION)
+            COMPARE_VERSION_STRINGS( "${GDAL_VERSION_STATED}" "${GDAL_FIND_VERSION}" version_result)
+            IF (version_result LESS 0)
+                MESSAGE (FATAL_ERROR "GDAL version is too old (${GDAL_VERSION_STATED}). Use ${GDAL_FIND_VERSION} or higher requested.")
+            ENDIF()
+            set (GDAL_VERSION_STRING ${GDAL_VERSION_STATED})
+            set (GDAL_VERSION_COMPATIBLE true)
+        endif()
+
+        set (GDAL_FOUND TRUE)
+        # Set INCLUDE_DIR to prefix+include
+        EXEC_PROGRAM(${GDAL_CONFIG} ARGS --prefix OUTPUT_VARIABLE GDAL_PREFIX)
+
+        FIND_PATH(GDAL_INCLUDE_DIR
+            gdal.h 
+            PATH_PREFIXES gdal
+            PATHS
+            ${GDAL_PREFIX}/include/gdal
+            ${GDAL_PREFIX}/include
+            /usr/local/include 
+            /usr/include)
+
+        # Extract link dirs for rpath  
+        EXEC_PROGRAM(${GDAL_CONFIG} ARGS --libs OUTPUT_VARIABLE GDAL_CONFIG_LIBS)
+
+        # Split off the link dirs (for rpath)
+        # Use regular expression to match wildcard equivalent "-L*<endchar>"
+        # with <endchar> is a space or a semicolon
+        STRING(REGEX MATCHALL "[-][L]([^ ;])+" GDAL_LINK_DIRECTORIES_WITH_PREFIX "${GDAL_CONFIG_LIBS}")
+        #MESSAGE("DBG GDAL_LINK_DIRECTORIES_WITH_PREFIX=${GDAL_LINK_DIRECTORIES_WITH_PREFIX}")
+
+        # Remove prefix -L because we need the pure directory for LINK_DIRECTORIES
+        IF(GDAL_LINK_DIRECTORIES_WITH_PREFIX)
+            STRING(REGEX REPLACE "[-][L]" "" GDAL_LINK_DIRECTORIES "${GDAL_LINK_DIRECTORIES_WITH_PREFIX}" )
+            #MESSAGE("DBG GDAL_LINK_DIRECTORIES ${GDAL_LINK_DIRECTORIES}")
+        ENDIF()
+
+        # Split off the name
+        # use regular expression to match wildcard equivalent "-l*<endchar>"
+        # with <endchar> is a space or a semicolon
+        STRING(REGEX MATCHALL "[-][l]([^ ;])+" GDAL_LIB_NAME_WITH_PREFIX "${GDAL_CONFIG_LIBS}")
+
+        # Remove prefix -l because we need the pure name
+        IF(GDAL_LIB_NAME_WITH_PREFIX)
+            STRING(REGEX REPLACE "[-][l]" "" GDAL_LIB_NAME ${GDAL_LIB_NAME_WITH_PREFIX})
+        ENDIF()
+
+        IF(APPLE)
+            SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.dylib CACHE STRING INTERNAL)
+        ELSE()
+            SET(GDAL_LIBRARY ${GDAL_LINK_DIRECTORIES}/lib${GDAL_LIB_NAME}.so CACHE STRING INTERNAL)
+        ENDIF()
+      
+    ELSE()
+        MESSAGE("FindGDAL.cmake: gdal-config not found. Please set it manually: GDAL_CONFIG=${GDAL_CONFIG}")
+    ENDIF(GDAL_CONFIG)
+
+ELSE()
+    MESSAGE("FindGDAL.cmake: unrecognized or unsupported operating system (use Unix or Windows)")
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set GDAL_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GDAL DEFAULT_MSG GDAL_LIBRARY GDAL_INCLUDE_DIR)
+
diff --git a/cmake/modules/FindGEOS.cmake b/cmake/modules/FindGEOS.cmake
new file mode 100644
index 0000000..5be0cf3
--- /dev/null
+++ b/cmake/modules/FindGEOS.cmake
@@ -0,0 +1,175 @@
+# Find GEOS
+# ~~~~~~~~~
+# Copyright (c) 2008, Mateusz Loskot <mateusz at loskot.net>
+# (based on FindGDAL.cmake by Magnus Homann)
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+# CMake module to search for GEOS library
+#
+# If it's found it sets GEOS_FOUND to TRUE
+# and following variables are set:
+#    GEOS_INCLUDE_DIR
+#    GEOS_LIBRARY
+#
+ 
+
+IF(WIN32)
+
+  IF (MINGW)
+    FIND_PATH(GEOS_INCLUDE_DIR geos_c.h /usr/local/include /usr/include c:/msys/local/include)
+    FIND_LIBRARY(GEOS_LIBRARY NAMES geos_c PATHS /usr/local/lib /usr/lib c:/msys/local/lib)
+  ENDIF (MINGW)
+
+  IF (MSVC)
+    IF(DEFINED ENV{OSGEO4W_ROOT})
+      SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+    ELSE()
+      SET(OSGEO4W_ROOT_DIR c:/OSGeo4W64)
+    ENDIF()  
+
+    FIND_PATH(GEOS_INCLUDE_DIR geos_c.h $ENV{LIB_DIR}/include $ENV{INCLUDE} ${OSGEO4W_ROOT_DIR}/include)
+    FIND_LIBRARY(GEOS_LIBRARY NAMES geos geos_c PATHS 
+      "$ENV{LIB}/lib"
+      $ENV{LIB}
+      #mingw
+      c:/msys/local/lib
+	  ${OSGEO4W_ROOT_DIR}/lib
+      NO_DEFAULT_PATH
+      )
+    IF (GEOS_LIBRARY)
+       SET (
+         GEOS_LIBRARY 
+         GEOS_LIBRARY;odbc32;odbccp32 
+         CACHE STRING INTERNAL)
+    ENDIF (GEOS_LIBRARY)
+  ENDIF (MSVC)
+  
+ELSE(WIN32)
+
+ IF(UNIX) 
+
+    # try to use framework on mac
+    # want clean framework path, not unix compatibility path
+    IF (APPLE)
+      IF (CMAKE_FIND_FRAMEWORK MATCHES "FIRST"
+          OR CMAKE_FRAMEWORK_PATH MATCHES "ONLY"
+          OR NOT CMAKE_FIND_FRAMEWORK)
+        SET (CMAKE_FIND_FRAMEWORK_save ${CMAKE_FIND_FRAMEWORK} CACHE STRING "" FORCE)
+        SET (CMAKE_FIND_FRAMEWORK "ONLY" CACHE STRING "" FORCE)
+        FIND_LIBRARY(GEOS_LIBRARY GEOS)
+        IF (GEOS_LIBRARY)
+          # they're all the same in a framework
+          SET (GEOS_INCLUDE_DIR ${GEOS_LIBRARY}/Headers CACHE PATH "Path to a file.")
+          SET (GEOS_CONFIG ${GEOS_LIBRARY}/Programs/geos-config CACHE FILEPATH "Path to a program.")
+        ENDIF (GEOS_LIBRARY)
+        SET (CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK_save} CACHE STRING "" FORCE)
+      ENDIF ()
+    ENDIF (APPLE)
+
+    IF (NOT GEOS_INCLUDE_DIR OR NOT GEOS_LIBRARY OR NOT GEOS_CONFIG)
+      # didn't find OS X framework, and was not set by user
+      SET(GEOS_CONFIG_PREFER_PATH "$ENV{GEOS_HOME}/bin" CACHE STRING "preferred path to GEOS (geos-config)")
+      FIND_PROGRAM(GEOS_CONFIG geos-config
+          ${GEOS_CONFIG_PREFER_PATH}
+          /usr/local/bin/
+          /usr/bin/
+          )
+      #MESSAGE("DBG GEOS_CONFIG ${GEOS_CONFIG}")
+
+      IF (GEOS_CONFIG)
+      
+        EXEC_PROGRAM(${GEOS_CONFIG}
+            ARGS --version
+            OUTPUT_VARIABLE GEOS_VERSION)
+        STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\1" GEOS_VERSION_MAJOR "${GEOS_VERSION}")
+        STRING(REGEX REPLACE "([0-9]+)\\.([0-9]+)\\.([0-9]+)" "\\2" GEOS_VERSION_MINOR "${GEOS_VERSION}")
+
+        IF (GEOS_VERSION_MAJOR LESS 3)
+          MESSAGE (FATAL_ERROR "GEOS version is too old (${GEOS_VERSION}). Use 3.0.0 or higher.")
+        ENDIF (GEOS_VERSION_MAJOR LESS 3)
+     
+        # set INCLUDE_DIR to prefix+include
+        EXEC_PROGRAM(${GEOS_CONFIG}
+            ARGS --prefix
+            OUTPUT_VARIABLE GEOS_PREFIX)
+
+        FIND_PATH(GEOS_INCLUDE_DIR 
+            geos_c.h 
+            ${GEOS_PREFIX}/include
+            /usr/local/include 
+            /usr/include 
+            )
+
+        ## extract link dirs for rpath  
+        EXEC_PROGRAM(${GEOS_CONFIG}
+            ARGS --libs
+            OUTPUT_VARIABLE GEOS_CONFIG_LIBS )
+
+        ## split off the link dirs (for rpath)
+        ## use regular expression to match wildcard equivalent "-L*<endchar>"
+        ## with <endchar> is a space or a semicolon
+        STRING(REGEX MATCHALL "[-][L]([^ ;])+" 
+            GEOS_LINK_DIRECTORIES_WITH_PREFIX 
+            "${GEOS_CONFIG_LIBS}" )
+        #MESSAGE("DBG  GEOS_LINK_DIRECTORIES_WITH_PREFIX=${GEOS_LINK_DIRECTORIES_WITH_PREFIX}")
+
+        ## remove prefix -L because we need the pure directory for LINK_DIRECTORIES
+      
+        IF (GEOS_LINK_DIRECTORIES_WITH_PREFIX)
+          STRING(REGEX REPLACE "[-][L]" "" GEOS_LINK_DIRECTORIES ${GEOS_LINK_DIRECTORIES_WITH_PREFIX} )
+        ENDIF (GEOS_LINK_DIRECTORIES_WITH_PREFIX)
+
+        ### XXX - mloskot: geos-config --libs does not return -lgeos_c, so set it manually
+        ## split off the name
+        ## use regular expression to match wildcard equivalent "-l*<endchar>"
+        ## with <endchar> is a space or a semicolon
+        #STRING(REGEX MATCHALL "[-][l]([^ ;])+" 
+        #  GEOS_LIB_NAME_WITH_PREFIX 
+        #  "${GEOS_CONFIG_LIBS}" )
+        #MESSAGE("DBG  GEOS_CONFIG_LIBS=${GEOS_CONFIG_LIBS}")
+        #MESSAGE("DBG  GEOS_LIB_NAME_WITH_PREFIX=${GEOS_LIB_NAME_WITH_PREFIX}")
+        SET(GEOS_LIB_NAME_WITH_PREFIX -lgeos_c CACHE STRING INTERNAL)
+
+        ## remove prefix -l because we need the pure name
+      
+        IF (GEOS_LIB_NAME_WITH_PREFIX)
+          STRING(REGEX REPLACE "[-][l]" "" GEOS_LIB_NAME ${GEOS_LIB_NAME_WITH_PREFIX} )
+        ENDIF (GEOS_LIB_NAME_WITH_PREFIX)
+        #MESSAGE("DBG  GEOS_LIB_NAME=${GEOS_LIB_NAME}")
+
+        IF (APPLE)
+          IF (NOT GEOS_LIBRARY)
+            # work around empty GEOS_LIBRARY left by framework check
+            # while still preserving user setting if given
+            # ***FIXME*** need to improve framework check so below not needed
+            SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.dylib CACHE STRING INTERNAL FORCE)
+          ENDIF (NOT GEOS_LIBRARY)
+        ELSE (APPLE)
+          SET(GEOS_LIBRARY ${GEOS_LINK_DIRECTORIES}/lib${GEOS_LIB_NAME}.so CACHE STRING INTERNAL)
+        ENDIF (APPLE)
+        #MESSAGE("DBG  GEOS_LIBRARY=${GEOS_LIBRARY}")
+      
+      ELSE(GEOS_CONFIG)
+        MESSAGE("FindGEOS.cmake: geos-config not found. Please set it manually if you would also like it configured. GEOS_CONFIG=${GEOS_CONFIG}")
+      ENDIF(GEOS_CONFIG)
+    ENDIF(NOT GEOS_INCLUDE_DIR OR NOT GEOS_LIBRARY OR NOT GEOS_CONFIG)
+  ENDIF(UNIX)
+ENDIF(WIN32)
+
+
+IF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY)
+   SET(GEOS_FOUND TRUE)
+ENDIF (GEOS_INCLUDE_DIR AND GEOS_LIBRARY)
+
+IF (GEOS_FOUND)
+
+   IF (NOT GEOS_FIND_QUIETLY)
+      MESSAGE(STATUS "Found GEOS: ${GEOS_LIBRARY}")
+   ENDIF (NOT GEOS_FIND_QUIETLY)
+
+ELSE (GEOS_FOUND)
+
+   message(STATUS "Could not find GEOS")
+
+ENDIF (GEOS_FOUND)
diff --git a/cmake/modules/FindGeoTIFF.cmake b/cmake/modules/FindGeoTIFF.cmake
new file mode 100644
index 0000000..83f5a8d
--- /dev/null
+++ b/cmake/modules/FindGeoTIFF.cmake
@@ -0,0 +1,89 @@
+###############################################################################
+#
+# CMake module to search for GeoTIFF library
+#
+# On success, the macro sets the following variables:
+# GEOTIFF_FOUND       = if the library found
+# GEOTIFF_LIBRARIES   = full path to the library
+# GEOTIFF_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# GEOTIFF_LIBRARY     = where to find the PROJ.4 library.
+# GEOTIFF_VERSION     = version of library which was found, e.g. "1.2.5"
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+IF(GEOTIFF_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(GEOTIFF_FIND_QUIETLY TRUE)
+ENDIF()
+
+IF(WIN32)
+  SET(OSGEO4W_IMPORT_LIBRARY geotiff_i)
+  IF(DEFINED ENV{OSGEO4W_ROOT})
+    SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+    #MESSAGE(STATUS " FindGeoTIFF: trying OSGeo4W using environment variable OSGEO4W_ROOT=$ENV{OSGEO4W_ROOT}")
+  ELSE()
+    SET(OSGEO4W_ROOT_DIR c:/OSGeo4W)
+    #MESSAGE(STATUS " FindGeoTIFF: trying OSGeo4W using default location OSGEO4W_ROOT=${OSGEO4W_ROOT_DIR}")
+  ENDIF()
+ENDIF()
+     
+FIND_PATH(GEOTIFF_INCLUDE_DIR
+  geotiff.h
+  PATH_SUFFIXES geotiff
+  PATHS
+  ${OSGEO4W_ROOT_DIR}/include)
+
+SET(GEOTIFF_NAMES ${OSGEO4W_IMPORT_LIBRARY} geotiff)
+
+FIND_LIBRARY(GEOTIFF_LIBRARY
+  NAMES ${GEOTIFF_NAMES}
+  PATHS
+  ${OSGEO4W_ROOT_DIR}/lib)
+
+IF(GEOTIFF_FOUND)
+  SET(GEOTIFF_LIBRARIES ${GEOTIFF_LIBRARY})
+ENDIF()
+
+IF(GEOTIFF_INCLUDE_DIR)
+  SET(GEOTIFF_VERSION 0)
+
+  SET(GEOTIFF_VERSION_H "${GEOTIFF_INCLUDE_DIR}/geotiff.h")
+  FILE(READ ${GEOTIFF_VERSION_H} GEOTIFF_VERSION_H_CONTENTS)
+
+  IF (DEFINED GEOTIFF_VERSION_H_CONTENTS)
+    STRING(REGEX REPLACE ".*#define[ \t]LIBGEOTIFF_VERSION[ \t]+([0-9]+).*" "\\1" GEOTIFF_VERSION_NUM "${GEOTIFF_VERSION_H_CONTENTS}")
+
+    IF(NOT ${GEOTIFF_VERSION_NULL} MATCHES "[0-9]+")
+      MESSAGE(FATAL_ERROR "GeoTIFF version parsing failed!")
+    ENDIF()
+
+    IF(GEOTIFF_VERSION_NUM AND NOT "${GEOTIFF_VERSION_NUM}" STREQUAL "0")
+      MATH(EXPR GTIFF_VERSION_MAJOR "${GEOTIFF_VERSION_NUM} / 1000")
+      MATH(EXPR GTIFF_VERSION_MINOR "${GEOTIFF_VERSION_NUM} % 1000 / 100")
+      MATH(EXPR GTIFF_VERSION_PATCH "${GEOTIFF_VERSION_NUM} % 100 / 10")
+    ENDIF()
+
+    SET(GEOTIFF_VERSION "${GTIFF_VERSION_MAJOR}.${GTIFF_VERSION_MINOR}.${GTIFF_VERSION_PATCH}"
+      CACHE INTERNAL "The version string for GeoTIFF library")
+
+    IF (GEOTIFF_VERSION VERSION_LESS GeoTIFF_FIND_VERSION)
+      MESSAGE(FATAL_ERROR "GeoTIFF version check failed. Version ${GEOTIFF_VERSION} was found, at least version ${GeoTIFF_FIND_VERSION} is required")
+    ENDIF()
+  ELSE()
+    MESSAGE(FATAL_ERROR "Failed to open ${GEOTIFF_VERSION_H} file")
+  ENDIF()
+
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set GEOTIFF_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GeoTIFF DEFAULT_MSG GEOTIFF_LIBRARY GEOTIFF_INCLUDE_DIR)
diff --git a/cmake/modules/FindGeoWave.cmake b/cmake/modules/FindGeoWave.cmake
new file mode 100644
index 0000000..7440eef
--- /dev/null
+++ b/cmake/modules/FindGeoWave.cmake
@@ -0,0 +1,27 @@
+###############################################################################
+#
+# CMake module to search for GeoWave
+#
+# On success, the macro sets the following variables:
+# GeoWave_FOUND    = if the runtime jar is found
+# GeoWave_RUNTIME  = full path to the GeoWave jar
+#
+###############################################################################
+MESSAGE(STATUS "Searching for GeoWave")
+
+IF(GEOWAVE_RUNTIME_JAR)
+  # Already in cache, be silent
+  SET(GEOWAVE_FIND_QUIETLY TRUE)
+ENDIF()
+
+FIND_FILE(GEOWAVE_RUNTIME_JAR
+  geowave-deploy-${GeoWave_FIND_VERSION}-accumulo-singlejar.jar
+  PATHS
+  /usr/bin
+  /usr/local
+  /usr/local/bin)
+
+# Handle the QUIETLY and REQUIRED arguments and set GeoWave_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GeoWave DEFAULT_MSG GEOWAVE_RUNTIME_JAR)
diff --git a/cmake/modules/FindHexer.cmake b/cmake/modules/FindHexer.cmake
new file mode 100644
index 0000000..0bdbd71
--- /dev/null
+++ b/cmake/modules/FindHexer.cmake
@@ -0,0 +1,96 @@
+###############################################################################
+#
+# CMake module to search for Hexer library
+#
+# On success, the macro sets the following variables:
+# HEXER_FOUND       = if the library found
+# HEXER_LIBRARIES   = full path to the library
+# HEXER_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# HEXER_LIBRARY     = where to find the hexer library.
+# HEXER_VERSION     = version of library which was found, e.g. "1.2.5"
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+IF(HEXER_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(HEXER_FIND_QUIETLY TRUE)
+ENDIF()
+
+IF(WIN32)
+  SET(OSGEO4W_IMPORT_LIBRARY hexer)
+  IF(DEFINED ENV{OSGEO4W_ROOT})
+    SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+    #MESSAGE(STATUS " FindHexer: trying OSGeo4W using environment variable OSGEO4W_ROOT=$ENV{OSGEO4W_ROOT}")
+  ELSE()
+    SET(OSGEO4W_ROOT_DIR c:/OSGeo4W)
+    #MESSAGE(STATUS " FindHexer: trying OSGeo4W using default location OSGEO4W_ROOT=${OSGEO4W_ROOT_DIR}")
+  ENDIF()
+ENDIF()
+
+
+FIND_PATH(HEXER_INCLUDE_DIR
+  hexer.hpp
+  PATH_PREFIXES hexer
+  PATHS
+  /usr/include
+  /usr/local/include
+  /tmp/lasjunk/include
+  ${OSGEO4W_ROOT_DIR}/include)
+
+SET(HEXER_NAMES ${OSGEO4W_IMPORT_LIBRARY} hexer)
+
+FIND_LIBRARY(HEXER_LIBRARY
+  NAMES ${HEXER_NAMES}
+  PATHS
+  /usr/lib
+  /usr/local/lib
+  ${OSGEO4W_ROOT_DIR}/lib)
+
+IF(HEXER_FOUND)
+  SET(HEXER_LIBRARIES ${HEXER_LIBRARY})
+ENDIF()
+
+IF(HEXER_INCLUDE_DIR)
+  SET(HEXER_VERSION 0)
+
+  SET(HEXER_VERSION_H "${HEXER_INCLUDE_DIR}/hexer/hexer_defines.h")
+  FILE(READ ${HEXER_VERSION_H} HEXER_VERSION_H_CONTENTS)
+
+  IF (DEFINED HEXER_VERSION_H_CONTENTS)
+    string(REGEX REPLACE ".*#define[ \t]HEXER_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" HEXER_VERSION_MAJOR "${HEXER_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]HEXER_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" HEXER_VERSION_MINOR "${HEXER_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]HEXER_VERSION_PATCH[ \t]+([0-9]+).*"   "\\1" HEXER_VERSION_PATCH   "${HEXER_VERSION_H_CONTENTS}")
+
+    if(NOT ${HEXER_VERSION_MAJOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Hexer version parsing failed for HEXER_VERSION_MAJOR!")
+    endif()
+    if(NOT ${HEXER_VERSION_MINOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Hexer version parsing failed for HEXER_VERSION_MINOR!")
+    endif()
+    if(NOT ${HEXER_VERSION_REVISION} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Hexer version parsing failed for HEXER_VERSION_PATCH!")
+    endif()
+
+
+    SET(HEXER_VERSION "${HEXER_VERSION_MAJOR}.${HEXER_VERSION_MINOR}.${HEXER_VERSION_PATCH}"
+      CACHE INTERNAL "The version string for Hexer library")
+
+    IF (HEXER_VERSION VERSION_LESS Hexer_FIND_VERSION)
+      MESSAGE(FATAL_ERROR "Hexer version check failed. Version ${HEXER_VERSION} was found, at least version ${Hexer_FIND_VERSION} is required")
+    ENDIF()
+  ELSE()
+    MESSAGE(FATAL_ERROR "Failed to open ${HEXER_VERSION_H} file")
+  ENDIF()
+
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set HEXER_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Hexer DEFAULT_MSG HEXER_LIBRARY HEXER_INCLUDE_DIR)
diff --git a/cmake/modules/FindICONV.cmake b/cmake/modules/FindICONV.cmake
new file mode 100644
index 0000000..f5fd3fd
--- /dev/null
+++ b/cmake/modules/FindICONV.cmake
@@ -0,0 +1,102 @@
+# taken from:
+# http://code.google.com/p/tinygettext/source/browse/trunk/FindICONV.cmake?spec=svn183&r=183
+
+#
+#  Copyright (c) 2006, Peter Kümmel, <syntheticpp at gmx.net>
+#
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+#  
+#  1. Redistributions of source code must retain the copyright
+#     notice, this list of conditions and the following disclaimer.
+#  2. Redistributions in binary form must reproduce the copyright
+#     notice, this list of conditions and the following disclaimer in the
+#     documentation and/or other materials provided with the distribution.
+#  3. The name of the author may not be used to endorse or promote products 
+#     derived from this software without specific prior written permission.
+#  
+#  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+#  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+#  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+#  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+#  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+#  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+#  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#  
+
+set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
+include(CheckFunctionExists)
+if (ICONV_INCLUDE_DIR)
+  # Already in cache, be silent
+  set(ICONV_FIND_QUIETLY TRUE)
+endif()
+
+find_path(ICONV_INCLUDE_DIR iconv.h
+ /usr/include
+ /usr/local/include)
+
+set(POTENTIAL_ICONV_LIBS iconv libiconv libiconv2)
+
+find_library(ICONV_LIBRARY NAMES ${POTENTIAL_ICONV_LIBS}
+	PATHS /usr/lib /usr/local/lib)
+
+if(WIN32)
+	set(ICONV_DLL_NAMES iconv.dll  libiconv.dll libiconv2.dll)
+	find_file(ICONV_DLL   
+					NAMES ${ICONV_DLL_NAMES}
+					PATHS ENV PATH
+					NO_DEFAULT_PATH)
+	find_file(ICONV_DLL_HELP   
+					NAMES ${ICONV_DLL_NAMES}
+					PATHS ENV PATH
+					${ICONV_INCLUDE_DIR}/../bin)
+	if(ICONV_FIND_REQUIRED)
+		if(NOT ICONV_DLL AND NOT ICONV_DLL_HELP)
+			message(FATAL_ERROR "Could not find iconv.dll, please add correct your PATH environment variable")
+		endif()
+		if(NOT ICONV_DLL AND ICONV_DLL_HELP)
+			get_filename_component(ICONV_DLL_HELP ${ICONV_DLL_HELP} PATH)
+			message(STATUS)
+			message(STATUS "Could not find iconv.dll in standard search path, please add ")
+			message(STATUS "${ICONV_DLL_HELP}")
+			message(STATUS "to your PATH environment variable.")
+			message(STATUS)
+			message(FATAL_ERROR "exit cmake")
+		endif()
+	endif()
+	if(ICONV_INCLUDE_DIR AND ICONV_LIBRARY AND ICONV_DLL)
+   		set(ICONV_FOUND TRUE)
+	endif()
+else()
+	check_function_exists(iconv HAVE_ICONV_IN_LIBC)
+	if(ICONV_INCLUDE_DIR AND HAVE_ICONV_IN_LIBC)
+   		set(ICONV_FOUND TRUE)
+		set(ICONV_LIBRARY  CACHE TYPE STRING FORCE)
+	endif()
+	if(ICONV_INCLUDE_DIR AND ICONV_LIBRARY)
+   		set(ICONV_FOUND TRUE)
+	endif()
+endif()
+
+
+
+if(ICONV_FOUND)
+   if(NOT ICONV_FIND_QUIETLY)
+      message(STATUS "Found iconv library: ${ICONV_LIBRARY}")
+      #message(STATUS "Found iconv   dll  : ${ICONV_DLL}")
+   endif()
+else()
+   if(ICONV_FIND_REQUIRED)
+      message(STATUS "Looked for iconv library named ${POTENTIAL_ICONV_LIBS}.")
+      message(STATUS "Found no acceptable iconv library. This is fatal.")
+      message(STATUS "iconv header: ${ICONV_INCLUDE_DIR}")
+      message(STATUS "iconv lib   : ${ICONV_LIBRARY}")
+      message(FATAL_ERROR "Could NOT find iconv library")
+   endif()
+endif()
+
+mark_as_advanced(ICONV_LIBRARY ICONV_INCLUDE_DIR)
diff --git a/cmake/modules/FindJSONCPP.cmake b/cmake/modules/FindJSONCPP.cmake
new file mode 100644
index 0000000..bcd30f6
--- /dev/null
+++ b/cmake/modules/FindJSONCPP.cmake
@@ -0,0 +1,103 @@
+# - try to find JSONCPP library
+#
+# Cache Variables: (probably not for direct use in your scripts)
+#  JSONCPP_INCLUDE_DIR
+#  JSONCPP_LIBRARY
+#
+# Non-cache variables you might use in your CMakeLists.txt:
+#  JSONCPP_FOUND
+#  JSONCPP_INCLUDE_DIRS
+#  JSONCPP_LIBRARIES
+#
+# Requires these CMake modules:
+#  FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
+#
+# Author:
+# 2011 Philippe Crassous (ENSAM ParisTech / Institut Image) p.crassous _at_ free.fr
+#
+# Adapted from the Virtual Reality Peripheral Network library.
+# https://github.com/rpavlik/vrpn/blob/master/README.Legal
+#
+
+set(JSONCPP_ROOT_DIR
+	"${JSONCPP_ROOT_DIR}"
+	CACHE
+	PATH
+	"Directory to search for JSONCPP")
+set(_jsoncppnames)
+set(_pathsuffixes
+	suncc
+	vacpp
+	mingw
+	msvc6
+	msvc7
+	msvc71
+	msvc80
+	msvc90
+	linux-gcc)
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+	execute_process(COMMAND
+		${CMAKE_CXX_COMPILER}
+		-dumpversion
+		OUTPUT_VARIABLE
+		_gnucxx_ver
+		OUTPUT_STRIP_TRAILING_WHITESPACE)
+	list(APPEND
+		_jsoncppnames
+		json_linux-gcc-${_gnucxx_ver}_libmt
+		json_linux-gcc_libmt)
+	list(APPEND _pathsuffixes linux-gcc-${_gnucxx_ver})
+elseif(MSVC)
+	if(MSVC_VERSION EQUAL 1200)
+		list(APPEND _jsoncppnames json_vc6_libmt)
+	elseif(MSVC_VERSION EQUAL 1300)
+		list(APPEND _jsoncppnames json_vc7_libmt)
+	elseif(MSVC_VERSION EQUAL 1310)
+		list(APPEND _jsoncppnames json_vc71_libmt)
+	elseif(MSVC_VERSION EQUAL 1400)
+		list(APPEND _jsoncppnames json_vc8_libmt)
+	elseif(MSVC_VERSION EQUAL 1500)
+		list(APPEND _jsoncppnames json_vc9_libmt)
+	elseif(MSVC_VERSION EQUAL 1600)
+		list(APPEND _jsoncppnames json_vc10_libmt)
+	endif()
+else()
+	list(APPEND _jsoncppnames
+		json_suncc_libmt
+		json_vacpp_libmt)
+endif()
+
+list(APPEND _jsoncppnames
+	json_mingw_libmt
+    jsoncpp)
+
+find_library(JSONCPP_LIBRARY
+	NAMES
+	${_jsoncppnames}
+	PATHS
+	"${JSONCPP_ROOT_DIR}/libs"
+	PATH_SUFFIXES
+	${_pathsuffixes})
+
+find_path(JSONCPP_INCLUDE_DIR
+	NAMES
+	json/json.h
+	PATHS
+	"${JSONCPP_ROOT_DIR}"
+	PATH_SUFFIXES
+	include)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(JSONCPP
+	DEFAULT_MSG
+	JSONCPP_LIBRARY
+	JSONCPP_INCLUDE_DIR)
+
+if(JSONCPP_FOUND)
+	set(JSONCPP_LIBRARIES "${JSONCPP_LIBRARY}")
+	set(JSONCPP_INCLUDE_DIRS "${JSONCPP_INCLUDE_DIR}")
+	mark_as_advanced(JSONCPP_ROOT_DIR)
+endif()
+
+mark_as_advanced(JSONCPP_INCLUDE_DIR JSONCPP_LIBRARY)
+
diff --git a/cmake/modules/FindJace.cmake b/cmake/modules/FindJace.cmake
new file mode 100644
index 0000000..a413db2
--- /dev/null
+++ b/cmake/modules/FindJace.cmake
@@ -0,0 +1,46 @@
+###############################################################################
+#
+# CMake module to search for Jace library
+#
+# On success, the macro sets the following variables:
+# JACE_FOUND       = if the library found
+# JACE_LIBRARIES   = full path to the library
+# JACE_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# JACE_LIBRARY     = where to find the Jace library.
+#
+###############################################################################
+MESSAGE(STATUS "Searching for Jace library")
+
+IF(JACE_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(JACE_FIND_QUIETLY TRUE)
+ENDIF()
+
+FIND_PATH(JACE_INCLUDE_DIR
+  Jace.h
+  PATHS
+  /usr/include
+  /usr/local
+  /usr/local/include)
+
+SET(JACE_NAMES libjace.so jace.lib)
+
+FIND_LIBRARY(JACE_LIBRARY
+  NAMES ${JACE_NAMES}
+  PATHS
+  /usr/lib
+  /usr/local
+  /usr/local/lib)
+
+FIND_FILE(JACE_RUNTIME_JAR
+  jace-runtime.jar
+  PATHS
+  /usr/bin
+  /usr/local
+  /usr/local/bin)
+
+# Handle the QUIETLY and REQUIRED arguments and set JACE_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Jace DEFAULT_MSG JACE_RUNTIME_JAR JACE_LIBRARY JACE_INCLUDE_DIR)
diff --git a/cmake/modules/FindLASzip.cmake b/cmake/modules/FindLASzip.cmake
new file mode 100644
index 0000000..38d32c1
--- /dev/null
+++ b/cmake/modules/FindLASzip.cmake
@@ -0,0 +1,98 @@
+###############################################################################
+#
+# CMake module to search for LASzip library
+#
+# On success, the macro sets the following variables:
+# LASZIP_FOUND       = if the library found
+# LASZIP_LIBRARIES   = full path to the library
+# LASZIP_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# LASZIP_LIBRARY     = where to find the laszip library.
+# LASZIP_VERSION     = version of library which was found, e.g. "1.2.5"
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+IF(LASZIP_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(LASZIP_FIND_QUIETLY TRUE)
+ENDIF()
+
+IF(WIN32)
+  SET(OSGEO4W_IMPORT_LIBRARY laszip)
+  IF(DEFINED ENV{OSGEO4W_ROOT})
+    SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+    #MESSAGE(STATUS " FindLASzip: trying OSGeo4W using environment variable OSGEO4W_ROOT=$ENV{OSGEO4W_ROOT}")
+  ELSE()
+    SET(OSGEO4W_ROOT_DIR c:/OSGeo4W)
+    #MESSAGE(STATUS " FindLASzip: trying OSGeo4W using default location OSGEO4W_ROOT=${OSGEO4W_ROOT_DIR}")
+  ENDIF()
+ENDIF()
+
+
+FIND_PATH(LASZIP_INCLUDE_DIR
+  laszip/laszip.hpp
+  PATHS
+  /usr/include
+  /usr/local/include
+  /tmp/lasjunk/include
+  ${OSGEO4W_ROOT_DIR}/include)
+
+SET(LASZIP_NAMES ${OSGEO4W_IMPORT_LIBRARY} laszip)
+
+FIND_LIBRARY(LASZIP_LIBRARY
+  NAMES ${LASZIP_NAMES}
+  PATHS
+  /usr/lib
+  /usr/local/lib
+  /tmp/lasjunk/lib
+  ${OSGEO4W_ROOT_DIR}/lib)
+
+IF(LASZIP_INCLUDE_DIR)
+  SET(LASZIP_VERSION 0)
+
+  SET(LASZIP_VERSION_H "${LASZIP_INCLUDE_DIR}/laszip/laszip.hpp")
+  FILE(READ ${LASZIP_VERSION_H} LASZIP_VERSION_H_CONTENTS)
+
+  IF (DEFINED LASZIP_VERSION_H_CONTENTS)
+    string(REGEX REPLACE ".*#define[ \t]LASZIP_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" LASZIP_VERSION_MAJOR "${LASZIP_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]LASZIP_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" LASZIP_VERSION_MINOR "${LASZIP_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]LASZIP_VERSION_REVISION[ \t]+([0-9]+).*"   "\\1" LASZIP_VERSION_REVISION   "${LASZIP_VERSION_H_CONTENTS}")
+
+    if(NOT ${LASZIP_VERSION_MAJOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "LASzip version parsing failed for LASZIP_VERSION_MAJOR!")
+    endif()
+    if(NOT ${LASZIP_VERSION_MINOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "LASzip version parsing failed for LASZIP_VERSION_MINOR!")
+    endif()
+    if(NOT ${LASZIP_VERSION_REVISION} MATCHES "[0-9]+")
+      message(FATAL_ERROR "LASzip version parsing failed for LASZIP_VERSION_REVISION!")
+    endif()
+
+
+    SET(LASZIP_VERSION "${LASZIP_VERSION_MAJOR}.${LASZIP_VERSION_MINOR}.${LASZIP_VERSION_REVISION}"
+      CACHE INTERNAL "The version string for LASzip library")
+
+    IF (LASZIP_VERSION VERSION_LESS LASzip_FIND_VERSION)
+      MESSAGE(FATAL_ERROR "LASzip version check failed. Version ${LASZIP_VERSION} was found, at least version ${LASzip_FIND_VERSION} is required")
+    ENDIF()
+  ELSE()
+    MESSAGE(FATAL_ERROR "Failed to open ${LASZIP_VERSION_H} file")
+  ENDIF()
+
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set LASZIP_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(LASzip DEFAULT_MSG LASZIP_LIBRARY LASZIP_INCLUDE_DIR)
+
+IF(LASZIP_FOUND)
+  SET(LASZIP_LIBRARIES ${LASZIP_LIBRARY})
+ENDIF()
diff --git a/cmake/modules/FindMatlab.cmake b/cmake/modules/FindMatlab.cmake
new file mode 100644
index 0000000..13ffcc9
--- /dev/null
+++ b/cmake/modules/FindMatlab.cmake
@@ -0,0 +1,47 @@
+# Finds Matlab's libmat, and nothing more
+#
+# This is a custom script for PDAL. CMake's provided FindMatlab doesn't
+# find libmat.
+#
+# Defines:
+#
+#  MATLAB_INCLUDE_DIR: the Matlab include path
+#  MATLAB_LIBRARIES: path to Matlab libraries
+#
+# Set MATLAB_ROOT to help cmake find the right stuff.
+
+set(MATLAB_FOUND 0)
+
+
+set(MATLAB_EXTERN_DIR ${MATLAB_ROOT}/extern/include)
+if (APPLE)
+    set(MATLAB_LIB_DIR ${MATLAB_ROOT}/bin/maci64)
+elseif (UNIX)
+    set(MATLAB_LIB_DIR ${MATLAB_ROOT}/bin/glnxa64)
+endif()
+
+message(STATUS ${MATLAB_LIB_DIR})
+
+find_library(MATLAB_MAT_LIBRARY
+    mat
+    ${MATLAB_LIB_DIR}
+    )
+find_library(MATLAB_MX_LIBRARY
+    mx
+    ${MATLAB_LIB_DIR}
+    )
+find_path(MATHALB_INCLUDE_DIR
+    "mat.h"
+    ${MATLAB_EXTERN_DIR}
+    )
+
+set(MATLAB_LIBRARIES
+    ${MATLAB_MAT_LIBRARY}
+    ${MATLAB_MX_LIBRARY}
+    )
+mark_as_advanced(MATLAB_LIBRARIES)
+
+
+if (MATLAB_MAT_LIBRARIES AND MATLAB_INCLUDE_DIR)
+    set(MATLAB_FOUND 1)
+endif()
diff --git a/cmake/modules/FindMrSID.cmake b/cmake/modules/FindMrSID.cmake
new file mode 100644
index 0000000..9a4c12e
--- /dev/null
+++ b/cmake/modules/FindMrSID.cmake
@@ -0,0 +1,56 @@
+###############################################################################
+#
+# CMake module to search for MrSID/MG4 libraries
+#
+# On success, the macro sets the following variables:
+# MRSID_FOUND        = if the library was found
+# MRSID_LIBRARY      = full path to the library
+# MRSID_INCLUDE_DIR  = full path to the headers
+# MRSID_VERSION      = version of library which was found
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Developed with inspiration from Petr Vanek <petr at scribus.info>
+# who wrote similar macro for TOra - http://torasql.com/
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+if(MRSID_INCLUDE_DIR AND MRSID_LIBRARY)
+  # Already in cache, be silent
+  set(MRSID_FIND_QUIETLY TRUE)
+endif()
+
+if(NOT MRSID_FIND_QUIETLY)
+  message(STATUS "Searching for MrSID LiDAR library ${MrSID_FIND_VERSION}+")
+endif()
+
+if(NOT MRSID_ROOT)
+  message(FATAL_ERROR "Missing variable MRSID_ROOT with location of MrSID LiDAR sdk")
+endif()
+
+find_path(MRSID_INCLUDE_DIR
+          lidar/Base.h
+          PATHS
+            ${MRSID_ROOT}/include
+            ${MRSID_ROOT}/Lidar_DSDK/include
+          NO_DEFAULT_PATH)
+
+find_library(MRSID_LIBRARY
+             NAMES
+               lti_lidar_dsdk
+               liblti_lidar_dsdk
+             HINTS
+               ${MRSID_INCLUDE_DIR}/../lib
+             NO_DEFAULT_PATH)
+
+
+# Handle the QUIETLY and REQUIRED arguments and set MRSID_FOUND to TRUE
+# if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(MrSID DEFAULT_MSG MRSID_LIBRARY MRSID_INCLUDE_DIR)
+
diff --git a/cmake/modules/FindNitro.cmake b/cmake/modules/FindNitro.cmake
new file mode 100644
index 0000000..d2e5254
--- /dev/null
+++ b/cmake/modules/FindNitro.cmake
@@ -0,0 +1,73 @@
+# ###############################################################################
+# #
+# # CMake module to search for Nitro library
+# #
+# # On success, the macro sets the following variables:
+# # NITRO_FOUND       = if the library found
+# # NITRO_LIBRARIES   = full path to the library
+# # NITRO_INCLUDE_DIR = where to find the library headers also defined,
+# #                       but not for general use are
+# # NITRO_LIBRARY     = where to find the hexer library.
+# # NITRO_VERSION     = version of library which was found, e.g. "1.2.5"
+# #
+# # Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+# #
+# # Redistribution and use is allowed according to the terms of the BSD license.
+# # For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+# #
+# ###############################################################################
+
+IF(NITRO_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(NITRO_FIND_QUIETLY TRUE)
+ENDIF()
+
+IF(WIN32)
+  IF(DEFINED ENV{OSGEO4W_ROOT})
+    SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+  ELSE()
+    SET(OSGEO4W_ROOT_DIR c:/OSGeo4W64)
+  ENDIF()
+ENDIF()
+
+FIND_PATH(NITRO_INCLUDE_DIR
+  nitro
+  PATHS
+  /usr/include
+  /usr/local/include
+  ${OSGEO4W_ROOT_DIR}/include)
+
+SET(NITRO_C_NAME  nitf-c)
+
+FIND_LIBRARY(NITRO_C_LIBRARY
+  NAMES ${NITRO_C_NAME}
+  PATHS
+  /usr/lib
+  /usr/local/lib
+  ${OSGEO4W_ROOT_DIR}/lib)
+
+SET(NITRO_CPP_NAME  nitf-cpp)
+
+FIND_LIBRARY(NITRO_CPP_LIBRARY
+  NAMES ${NITRO_CPP_NAME}
+  PATHS
+  /usr/lib
+  /usr/local/lib)
+
+SET(NITRO_FOUND 1)
+SET(NITRO_LIBRARIES ${NITRO_CPP_LIBRARY} ${NITRO_C_LIBRARY})
+
+
+IF(NITRO_INCLUDE_DIR)
+  SET(NITRO_VERSION 0)
+
+#  SET(NITRO_VERSION_H "${NITRO_INCLUDE_DIR}/nitro/c/nitf/nitf/Defines.h")
+#  FILE(READ ${NITRO_VERSION_H} NITRO_VERSION_H_CONTENTS)
+
+
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set NITRO_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(Nitro DEFAULT_MSG NITRO_LIBRARIES NITRO_INCLUDE_DIR)
diff --git a/cmake/modules/FindNumPy.cmake b/cmake/modules/FindNumPy.cmake
new file mode 100644
index 0000000..b663ba8
--- /dev/null
+++ b/cmake/modules/FindNumPy.cmake
@@ -0,0 +1,34 @@
+# - Try to find the Python module NumPy
+#
+# This module defines: 
+#  NUMPY_INCLUDE_DIR: include path for arrayobject.h
+
+# Copyright (c) 2009-2012 Arnaud Barré <arnaud.barre at gmail.com>
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+IF (NUMPY_INCLUDE_DIR)
+  SET(NUMPY_FIND_QUIETLY TRUE)
+endif (NUMPY_INCLUDE_DIR)
+
+# To set the variables PYTHON_EXECUTABLE
+FIND_PACKAGE(PythonInterp QUIET REQUIRED)
+FIND_PACKAGE(PythonLibs QUIET REQUIRED)
+
+# Look for the include path
+# WARNING: The variable PYTHON_EXECUTABLE is defined by the script FindPythonInterp.cmake
+EXECUTE_PROCESS(COMMAND "${PYTHON_EXECUTABLE}" -c "import numpy; print (numpy.get_include()); print (numpy.version.version)"
+                 OUTPUT_VARIABLE NUMPY_OUTPUT
+                 ERROR_VARIABLE NUMPY_ERROR)
+                 
+IF(NOT NUMPY_ERROR)
+  STRING(REPLACE "\n" ";" NUMPY_OUTPUT ${NUMPY_OUTPUT})
+  LIST(GET NUMPY_OUTPUT 0 NUMPY_INCLUDE_DIR)
+  LIST(GET NUMPY_OUTPUT 1 NUMPY_VERSION)
+ENDIF(NOT NUMPY_ERROR)
+
+INCLUDE(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(NumPy DEFAULT_MSG NUMPY_VERSION NUMPY_INCLUDE_DIR)
+
+MARK_AS_ADVANCED(NUMPY_INCLUDE_DIR)
diff --git a/cmake/modules/FindOracle.cmake b/cmake/modules/FindOracle.cmake
new file mode 100644
index 0000000..556301c
--- /dev/null
+++ b/cmake/modules/FindOracle.cmake
@@ -0,0 +1,81 @@
+###############################################################################
+#
+# CMake module to search for Oracle client library (OCI)
+#
+# On success, the macro sets the following variables:
+# ORACLE_FOUND       = if the library found
+# ORACLE_LIBRARY     = full path to the library
+# ORACLE_LIBRARIES   = full path to the library
+# ORACLE_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# ORACLE_VERSION     = version of library which was found, e.g. "1.2.5"
+#
+# Copyright (c) 2009-2013 Mateusz Loskot <mateusz at loskot.net>
+#
+# Developed with inspiration from Petr Vanek <petr at scribus.info>
+# who wrote similar macro for TOra - http://torasql.com/
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+# If ORACLE_HOME not defined, assume Oracle libraries not available
+if(DEFINED ENV{ORACLE_HOME})
+
+  set(ORACLE_HOME $ENV{ORACLE_HOME})
+
+  find_path(ORACLE_INCLUDE_DIR
+    NAMES oci.h
+    PATHS
+    ${ORACLE_HOME}/rdbms/public
+    ${ORACLE_HOME}/include
+    ${ORACLE_HOME}/sdk/include  # Oracle SDK
+    ${ORACLE_HOME}/OCI/include) # Oracle XE on Windows
+
+  set(ORACLE_OCI_NAMES clntsh libclntsh oci)
+  set(ORACLE_NNZ_NAMES nnz10 libnnz10 nnz11 nnz12 libnnz11 libnnz12 ociw32)
+  set(ORACLE_OCCI_NAMES libocci occi oraocci10 oraocci11)
+
+  set(ORACLE_LIB_DIR 
+    ${ORACLE_HOME}/      
+    ${ORACLE_HOME}/lib
+    ${ORACLE_HOME}/sdk/lib       # Oracle SDK
+    ${ORACLE_HOME}/sdk/lib/msvc
+    ${ORACLE_HOME}/OCI/lib/msvc) # Oracle XE on Windows
+
+  find_library(ORACLE_OCI_LIBRARY  NAMES ${ORACLE_OCI_NAMES} PATHS ${ORACLE_LIB_DIR})
+
+if (NOT WIN32)
+  find_library(ORACLE_OCCI_LIBRARY NAMES ${ORACLE_OCCI_NAMES} PATHS ${ORACLE_LIB_DIR})
+  find_library(ORACLE_NNZ_LIBRARY NAMES ${ORACLE_NNZ_NAMES} PATHS ${ORACLE_LIB_DIR})
+endif()
+  set(ORACLE_LIBRARY ${ORACLE_OCI_LIBRARY} ${ORACLE_OCCI_LIBRARY} ${ORACLE_NNZ_LIBRARY})
+
+  # if(APPLE)
+  #   set(ORACLE_OCIEI_NAMES libociei ociei)
+  # 
+  #   find_library(ORACLE_OCIEI_LIBRARY
+  #     NAMES libociei ociei
+  #     PATHS ${ORACLE_LIB_DIR})
+  # 
+  #   if(ORACLE_OCIEI_LIBRARY)
+  #     set(ORACLE_LIBRARY ${ORACLE_LIBRARY} ${ORACLE_OCIEI_LIBRARY})
+  #   else(ORACLE_OCIEI_LIBRARY)
+  #     message(STATUS
+  #       "libociei.dylib is not found. It may cause crash if you are building BUNDLE")
+  #   endif()
+  # endif()
+
+  set(ORACLE_LIBRARIES ${ORACLE_LIBRARY})
+
+endif(DEFINED ENV{ORACLE_HOME})
+
+# Handle the QUIETLY and REQUIRED arguments and set ORACLE_FOUND to TRUE
+# if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Oracle DEFAULT_MSG ORACLE_LIBRARY ORACLE_INCLUDE_DIR)
+
+mark_as_advanced(ORACLE_INCLUDE_DIR ORACLE_LIBRARY)
diff --git a/cmake/modules/FindP2G.cmake b/cmake/modules/FindP2G.cmake
new file mode 100644
index 0000000..4dd98d3
--- /dev/null
+++ b/cmake/modules/FindP2G.cmake
@@ -0,0 +1,109 @@
+###############################################################################
+#
+# CMake module to search for Points2Grid library
+#
+# On success, the macro sets the following variables:
+# P2G_FOUND       = if the library found
+# P2G_LIBRARIES   = full path to the library
+# P2G_INCLUDE_DIR = where to find the library headers also defined,
+#                       but not for general use are
+# P2G_LIBRARY     = where to find the PROJ.4 library.
+# P2G_VERSION     = version of library which was found, e.g. "1.2.5"
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Module source: http://github.com/mloskot/workshop/tree/master/cmake/
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+IF(P2G_INCLUDE_DIR)
+  # Already in cache, be silent
+  SET(P2G_FIND_QUIETLY TRUE)
+ENDIF()
+
+IF(WIN32)
+  SET(OSGEO4W_IMPORT_LIBRARY points2grid)
+  IF(DEFINED ENV{OSGEO4W_ROOT})
+    SET(OSGEO4W_ROOT_DIR $ENV{OSGEO4W_ROOT})
+    #MESSAGE(STATUS " FindPoints2Grid: trying OSGeo4W using environment variable OSGEO4W_ROOT=$ENV{OSGEO4W_ROOT}")
+  ELSE()
+    SET(OSGEO4W_ROOT_DIR c:/OSGeo4W64)
+    #MESSAGE(STATUS " FindPoints2Grid: trying OSGeo4W using default location OSGEO4W_ROOT=${OSGEO4W_ROOT_DIR}")
+  ENDIF()
+ENDIF()
+
+
+FIND_PATH(P2G_INCLUDE_DIR
+  points2grid/config.h
+  PATHS
+  /usr/include
+  /usr/local/include
+  /tmp/lasjunk
+  ${OSGEO4W_ROOT_DIR}/include
+  )
+
+if(WIN32)
+    SET(P2G_NAMES ${OSGEO4W_IMPORT_LIBRARY} libpts2grd)
+else()
+    SET(P2G_NAMES ${OSGEO4W_IMPORT_LIBRARY} pts2grd)
+endif()
+
+FIND_LIBRARY(P2G_LIBRARY
+  NAMES ${P2G_NAMES}
+  PATHS
+  /usr/lib
+  /usr/local/lib
+  /tmp/lasjunk/lib
+  ${OSGEO4W_ROOT_DIR}/lib)
+
+IF(P2G_FOUND)
+  SET(P2G_LIBRARIES ${P2G_LIBRARY})
+ENDIF()
+
+IF (NOT P2G_INCLUDE_DIR)
+  MESSAGE(FATAL_ERROR "Unable to find Points2Grid include directory")
+endif()
+
+IF(P2G_INCLUDE_DIR)
+  SET(P2G_VERSION 0)
+  
+  SET(P2G_VERSION_H "${P2G_INCLUDE_DIR}/points2grid/config.h")
+  FILE(READ ${P2G_VERSION_H} P2G_VERSION_H_CONTENTS)
+  
+  IF (DEFINED P2G_VERSION_H_CONTENTS)
+  
+    string(REGEX REPLACE ".*#define[ \t]P2G_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" P2G_VERSION_MAJOR "${P2G_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]P2G_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" P2G_VERSION_MINOR "${P2G_VERSION_H_CONTENTS}")
+    string(REGEX REPLACE ".*#define[ \t]P2G_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" P2G_VERSION_PATCH "${P2G_VERSION_H_CONTENTS}")
+    #message(FATAL_ERROR "${P2G_VERSION_MAJOR}.${P2G_VERSION_MINOR}.${P2G_VERSION_PATCH}")
+
+    if(NOT ${P2G_VERSION_MAJOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Points2Grid version parsing failed for P2G_VERSION_MAJOR!")
+    endif()
+    if(NOT ${P2G_VERSION_MINOR} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Points2Grid version parsing failed for P2G_VERSION_MINOR!")
+    endif()
+    if(NOT ${P2G_VERSION_PATCH} MATCHES "[0-9]+")
+      message(FATAL_ERROR "Points2Grid version parsing failed for P2G_VERSION_PATCH!")
+    endif()
+
+
+    SET(P2G_VERSION "${P2G_VERSION_MAJOR}.${P2G_VERSION_MINOR}.${P2G_VERSION_PATCH}"
+      CACHE INTERNAL "The version string for Points2Grid library")
+
+    IF (P2G_VERSION VERSION_LESS Points2Grid_FIND_VERSION)
+      MESSAGE(FATAL_ERROR "Points2Grid version check failed. Version ${P2G_VERSION} was found, at least version ${Points2Grid_FIND_VERSION} is required")
+    ENDIF()
+  ELSE()
+    MESSAGE(FATAL_ERROR "Failed to open ${P2G_VERSION_H} file")
+  ENDIF()
+
+ENDIF()
+
+# Handle the QUIETLY and REQUIRED arguments and set P2G_FOUND to TRUE
+# if all listed variables are TRUE
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(P2G DEFAULT_MSG P2G_LIBRARY P2G_INCLUDE_DIR)
diff --git a/cmake/modules/FindPostgreSQL.cmake b/cmake/modules/FindPostgreSQL.cmake
new file mode 100644
index 0000000..8178418
--- /dev/null
+++ b/cmake/modules/FindPostgreSQL.cmake
@@ -0,0 +1,83 @@
+# - Find PostgreSQL
+# Find the PostgreSQL includes and client library
+# This module defines
+#  POSTGRESQL_INCLUDE_DIR, where to find libpq-fe.h
+#  POSTGRESQL_LIBRARIES, libraries needed to use PostgreSQL
+#  POSTGRESQL_VERSION, if found, version of PostgreSQL
+#  POSTGRESQL_FOUND, if false, do not try to use PostgreSQL
+#
+# Copyright (c) 2010, Mateusz Loskot, <mateusz at loskot.net>
+# Copyright (c) 2006, Jaroslaw Staniek, <js at iidea.pl>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+
+find_program(PG_CONFIG NAMES pg_config
+  PATHS
+  /usr/bin
+  /usr/local/bin
+  $ENV{ProgramFiles}/PostgreSQL/*/bin
+  $ENV{SystemDrive}/PostgreSQL/*/bin
+  DOC "Path to pg_config utility")
+
+if(PG_CONFIG)
+  exec_program(${PG_CONFIG}
+    ARGS "--version"
+    OUTPUT_VARIABLE PG_CONFIG_VERSION)
+
+  if(${PG_CONFIG_VERSION} MATCHES "^[A-Za-z]+[ ](.*)$")
+    string(REGEX REPLACE "^[A-Za-z]+[ ](.*)$" "\\1" POSTGRESQL_VERSION "${PG_CONFIG_VERSION}")
+  endif()
+
+  exec_program(${PG_CONFIG}
+    ARGS "--includedir"
+    OUTPUT_VARIABLE PG_CONFIG_INCLUDEDIR)  
+
+  exec_program(${PG_CONFIG}
+    ARGS "--libdir"
+    OUTPUT_VARIABLE PG_CONFIG_LIBDIR)
+else()
+  set(POSTGRESQL_VERSION "unknown")
+endif()
+
+find_path(POSTGRESQL_INCLUDE_DIR libpq-fe.h
+  ${PG_CONFIG_INCLUDEDIR}
+  /usr/include/server
+  /usr/include/pgsql/server
+  /usr/local/include/pgsql/server
+  /usr/include/postgresql
+  /usr/include/postgresql/server
+  /usr/include/postgresql/*/server
+  $ENV{ProgramFiles}/PostgreSQL/*/include
+  $ENV{SystemDrive}/PostgreSQL/*/include)
+
+find_library(POSTGRESQL_LIBRARIES NAMES pq libpq
+  PATHS
+  ${PG_CONFIG_LIBDIR}  
+  /usr/lib
+  /usr/local/lib
+  /usr/lib/postgresql
+  /usr/lib64
+  /usr/local/lib64
+  /usr/lib64/postgresql
+  $ENV{ProgramFiles}/PostgreSQL/*/lib
+  $ENV{SystemDrive}/PostgreSQL/*/lib
+  $ENV{ProgramFiles}/PostgreSQL/*/lib/ms
+  $ENV{SystemDrive}/PostgreSQL/*/lib/ms)
+
+if(POSTGRESQL_INCLUDE_DIR AND POSTGRESQL_LIBRARIES)
+  set(POSTGRESQL_FOUND TRUE)
+else()
+  set(POSTGRESQL_FOUND FALSE)
+endif()
+
+# Handle the QUIETLY and REQUIRED arguments and set POSTGRESQL_FOUND to TRUE
+# if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(PostgreSQL
+  DEFAULT_MSG
+  POSTGRESQL_INCLUDE_DIR
+  POSTGRESQL_LIBRARIES
+  POSTGRESQL_VERSION)
+
+mark_as_advanced(POSTGRESQL_INCLUDE_DIR POSTGRESQL_LIBRARIES)
diff --git a/cmake/modules/FindSQLite3.cmake b/cmake/modules/FindSQLite3.cmake
new file mode 100644
index 0000000..86c5e21
--- /dev/null
+++ b/cmake/modules/FindSQLite3.cmake
@@ -0,0 +1,60 @@
+###############################################################################
+# CMake module to search for SQLite 3 library
+#
+# On success, the macro sets the following variables:
+# SQLITE3_FOUND = if the library found
+# SQLITE3_LIBRARY = full path to the library
+# SQLITE3_LIBRARIES = full path to the library
+# SSQLITE3_INCLUDE_DIR = where to find the library headers
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+# Redistribution and use is allowed according to the terms of the BSD license.
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
+#
+###############################################################################
+
+find_path(SQLITE3_INCLUDE_DIR
+  NAMES sqlite3.h
+  PATH_PREFIXES sqlite sqlite3
+  PATHS
+  /usr/include
+  /usr/local/include
+  $ENV{LIB_DIR}/include
+  $ENV{LIB_DIR}/include/sqlite
+  $ENV{LIB_DIR}/include/sqlite3
+  $ENV{ProgramFiles}/SQLite/*/include
+  $ENV{ProgramFiles}/SQLite3/*/include
+  $ENV{SystemDrive}/SQLite/*/include
+  $ENV{SystemDrive}/SQLite3/*/include
+  $ENV{SQLITE_ROOT}/include
+  ${SQLITE_ROOT_DIR}/include
+  $ENV{OSGEO4W_ROOT}/include)
+
+set(SQLITE3_NAMES sqlite3_i sqlite3)
+find_library(SQLITE3_LIBRARY
+  NAMES ${SQLITE3_NAMES}
+  PATHS
+  /usr/lib
+  /usr/local/lib
+  $ENV{LIB_DIR}/lib
+  $ENV{ProgramFiles}/SQLite/*/lib
+  $ENV{ProgramFiles}/SQLite3/*/lib
+  $ENV{SystemDrive}/SQLite/*/lib
+  $ENV{SystemDrive}/SQLite3/*/lib
+  $ENV{SQLITE_ROOT}/lib
+  ${SQLITE_ROOT_DIR}/lib
+  $ENV{OSGEO4W_ROOT}/lib)
+
+set(SQLITE3_LIBRARIES ${SQLITE3_LIBRARY})
+
+#message(STATUS ${SQLITE3_LIBRARY})
+# Handle the QUIETLY and REQUIRED arguments and set SQLITE3_FOUND to TRUE
+# if all listed variables are TRUE
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(SQLITE3
+  DEFAULT_MSG
+  SQLITE3_LIBRARY
+  SQLITE3_INCLUDE_DIR)
+
+mark_as_advanced(SQLITE3_LIBRARY SQLITE3_INCLUDE_DIR SQLITE3_LIBRARY)
diff --git a/cmake/modules/GetGitRevisionDescription.cmake b/cmake/modules/GetGitRevisionDescription.cmake
new file mode 100644
index 0000000..2e61f4f
--- /dev/null
+++ b/cmake/modules/GetGitRevisionDescription.cmake
@@ -0,0 +1,123 @@
+# - Returns a version string from Git
+#
+# These functions force a re-configure on each git commit so that you can
+# trust the values of the variables in your build system.
+#
+#  get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
+#
+# Returns the refspec and sha hash of the current head revision
+#
+#  git_describe(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe on the source tree, and adjusting
+# the output so that it tests false if an error occurs.
+#
+#  git_get_exact_tag(<var> [<additional arguments to git describe> ...])
+#
+# Returns the results of git describe --exact-match on the source tree,
+# and adjusting the output so that it tests false if there was no exact
+# matching tag.
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+if(__get_git_revision_description)
+	return()
+endif()
+set(__get_git_revision_description YES)
+
+# We must run the following at "include" time, not at function call time,
+# to find the path to this module rather than the path to a calling list file
+get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
+
+function(get_git_head_revision _refspecvar _hashvar)
+	set(GIT_PARENT_DIR "${CMAKE_SOURCE_DIR}")
+	set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+	while(NOT EXISTS "${GIT_DIR}")	# .git dir not found, search parent directories
+		set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
+		get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
+		if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
+			# We have reached the root directory, we are not in git
+            set(${_refspecvar} "Release" PARENT_SCOPE)
+            set(${_hashvar} "Release" PARENT_SCOPE)
+			return()
+		endif()
+		set(GIT_DIR "${GIT_PARENT_DIR}/.git")
+	endwhile()
+	set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
+	if(NOT EXISTS "${GIT_DATA}")
+		file(MAKE_DIRECTORY "${GIT_DATA}")
+	endif()
+
+	if(NOT EXISTS "${GIT_DIR}/HEAD")
+		return()
+	endif()
+	set(HEAD_FILE "${GIT_DATA}/HEAD")
+	configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
+
+	configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
+		"${GIT_DATA}/grabRef.cmake"
+		@ONLY)
+	include("${GIT_DATA}/grabRef.cmake")
+
+	set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
+	set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
+endfunction()
+
+function(git_describe _var)
+	if(NOT GIT_FOUND)
+		find_package(Git QUIET)
+	endif()
+	get_git_head_revision(refspec hash)
+	if(NOT GIT_FOUND)
+		set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
+		return()
+	endif()
+	if(NOT hash)
+		set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
+		return()
+	endif()
+
+	# TODO sanitize
+	#if((${ARGN}" MATCHES "&&") OR
+	#	(ARGN MATCHES "||") OR
+	#	(ARGN MATCHES "\\;"))
+	#	message("Please report the following error to the project!")
+	#	message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
+	#endif()
+
+	#message(STATUS "Arguments to execute_process: ${ARGN}")
+
+	execute_process(COMMAND
+		"${GIT_EXECUTABLE}"
+		describe
+		${hash}
+		${ARGN}
+		WORKING_DIRECTORY
+		"${CMAKE_SOURCE_DIR}"
+		RESULT_VARIABLE
+		res
+		OUTPUT_VARIABLE
+		out
+		ERROR_QUIET
+		OUTPUT_STRIP_TRAILING_WHITESPACE)
+	if(NOT res EQUAL 0)
+		set(out "${out}-${res}-NOTFOUND")
+	endif()
+
+	set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
+
+function(git_get_exact_tag _var)
+	git_describe(out --exact-match ${ARGN})
+	set(${_var} "${out}" PARENT_SCOPE)
+endfunction()
diff --git a/cmake/modules/GetGitRevisionDescription.cmake.in b/cmake/modules/GetGitRevisionDescription.cmake.in
new file mode 100644
index 0000000..888ce13
--- /dev/null
+++ b/cmake/modules/GetGitRevisionDescription.cmake.in
@@ -0,0 +1,38 @@
+# 
+# Internal file for GetGitRevisionDescription.cmake
+#
+# Requires CMake 2.6 or newer (uses the 'function' command)
+#
+# Original Author:
+# 2009-2010 Ryan Pavlik <rpavlik at iastate.edu> <abiryan at ryand.net>
+# http://academic.cleardefinition.com
+# Iowa State University HCI Graduate Program/VRAC
+#
+# Copyright Iowa State University 2009-2010.
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or copy at
+# http://www.boost.org/LICENSE_1_0.txt)
+
+set(HEAD_HASH)
+
+file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
+
+string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
+if(HEAD_CONTENTS MATCHES "ref")
+	# named branch
+	string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
+	if(EXISTS "@GIT_DIR@/${HEAD_REF}")
+		configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+	elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
+		configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
+		set(HEAD_HASH "${HEAD_REF}")
+	endif()
+else()
+	# detached HEAD
+	configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
+endif()
+
+if(NOT HEAD_HASH)
+	file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
+	string(STRIP "${HEAD_HASH}" HEAD_HASH)
+endif()
diff --git a/cmake/nitro.cmake b/cmake/nitro.cmake
new file mode 100644
index 0000000..dca8eb2
--- /dev/null
+++ b/cmake/nitro.cmake
@@ -0,0 +1,17 @@
+#
+# NITRO support
+#
+
+find_package(Nitro QUIET 2.6 REQUIRED)
+if (NITRO_FOUND)
+    include_directories(${NITRO_INCLUDE_DIR})
+    include_directories(${NITRO_INCLUDE_DIR}/nitro/c++)
+    include_directories(${NITRO_INCLUDE_DIR}/nitro/c)
+    add_definitions("-D_REENTRANT")
+    if (WIN32)
+        add_definitions("-DSIZEOF_SIZE_T=4")
+        add_definitions("-DIMPORT_NITRO_API")
+    else()
+        add_definitions("-D__POSIX")
+    endif()
+endif()
diff --git a/cmake/policies.cmake b/cmake/policies.cmake
new file mode 100644
index 0000000..e968597
--- /dev/null
+++ b/cmake/policies.cmake
@@ -0,0 +1,7 @@
+#
+# cmake policies
+#
+if (CMAKE_MAJOR_VERSION GREATER 2)
+    cmake_policy(SET CMP0022 OLD) # interface link libraries
+    cmake_policy(SET CMP0042 NEW) # osx rpath
+endif()
diff --git a/cmake/postgres.cmake b/cmake/postgres.cmake
new file mode 100644
index 0000000..0dad710
--- /dev/null
+++ b/cmake/postgres.cmake
@@ -0,0 +1,9 @@
+#
+# PostgreSQL configuration.
+#
+
+find_package(PostgreSQL REQUIRED)
+
+mark_as_advanced(CLEAR POSTGRESQL_INCLUDE_DIR)
+mark_as_advanced(CLEAR POSTGRESQL_LIBRARIES)
+include_directories(${POSTGRESQL_INCLUDE_DIR})
diff --git a/cmake/python.cmake b/cmake/python.cmake
new file mode 100644
index 0000000..dd0890f
--- /dev/null
+++ b/cmake/python.cmake
@@ -0,0 +1,15 @@
+#
+# Python
+#
+find_package(PythonInterp QUIET )
+find_package(PythonLibs QUIET 2.4)
+set_package_properties(PythonInterp PROPERTIES TYPE REQUIRED)
+if(PYTHONLIBS_FOUND)
+    set(CMAKE_REQUIRED_LIBRARIES "${PYTHON_LIBRARY}")
+    include_directories(SYSTEM ${PYTHON_INCLUDE_DIR})
+    add_definitions(-DHAVE_PYTHON=1)
+    set(PDAL_HAVE_PYTHON 1)
+
+    find_package(NumPy QUIET 1.5 REQUIRED)
+    include_directories(SYSTEM ${NUMPY_INCLUDE_DIR})
+endif()
diff --git a/cmake/sqlite.cmake b/cmake/sqlite.cmake
new file mode 100644
index 0000000..84199c2
--- /dev/null
+++ b/cmake/sqlite.cmake
@@ -0,0 +1,8 @@
+#
+# SQLite cmake configuration
+#
+
+find_package(SQLite3 QUIET REQUIRED)
+mark_as_advanced(CLEAR SQLITE3_INCLUDE_DIR)
+mark_as_advanced(CLEAR SQLITE3_LIBRARY)
+include_directories(${SQLITE3_INCLUDE_DIR})
diff --git a/cmake/threads.cmake b/cmake/threads.cmake
new file mode 100644
index 0000000..f4b6333
--- /dev/null
+++ b/cmake/threads.cmake
@@ -0,0 +1,7 @@
+#
+# Locate the threads package (required)
+#
+
+find_package(Threads)
+set_package_properties(Threads PROPERTIES DESCRIPTION
+    "The thread library of the system" TYPE REQUIRED)
diff --git a/cmake/unix_compiler_options.cmake b/cmake/unix_compiler_options.cmake
new file mode 100644
index 0000000..79aca3b
--- /dev/null
+++ b/cmake/unix_compiler_options.cmake
@@ -0,0 +1,22 @@
+set(PDAL_COMMON_CXX_FLAGS "-Wextra -Wall -Wno-unused-parameter -Wno-unused-variable -Wpointer-arith -Wcast-align -Wcast-qual -Wredundant-decls -Wno-long-long -Wno-unknown-pragmas -isystem /usr/local/include"
+)
+
+if (${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
+    if (${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS 4.7)
+       set(CXX_STANDARD "-std=c++0x")
+    else()
+       set(CXX_STANDARD "-std=c++11")
+    endif()
+    if (${CMAKE_CXX_COMPILER_VERSION} VERSION_GREATER 4.6)
+        set(PDAL_NO_AS_NEEDED_START "-Wl,--no-as-needed")
+        set(PDAL_NO_AS_NEEDED_END "-Wl,--as-needed")
+    endif()
+    set(PDAL_COMPILER_GCC 1)
+elseif (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
+    set(CXX_STANDARD "-std=c++11")
+    set(PDAL_COMPILER_CLANG 1)
+else()
+    message(FATAL_ERROR "Unsupported C++ compiler")
+endif()
+
+set (CMAKE_CXX_FLAGS "${PDAL_COMMON_CXX_FLAGS} ${CXX_STANDARD}")
diff --git a/cmake/win32_compiler_options.cmake b/cmake/win32_compiler_options.cmake
new file mode 100644
index 0000000..ffb91eb
--- /dev/null
+++ b/cmake/win32_compiler_options.cmake
@@ -0,0 +1,85 @@
+if (MSVC)
+    set(PDAL_COMPILER_MSVC 1)
+    if (MSVC12)
+      set(PDAL_COMPILER_VC12 1)
+    elseif (MSVC11)
+      set(PDAL_COMPILER_VC11 1)
+    elseif (MSVC10)
+      set(PDAL_COMPILER_VC10 1)
+    elseif (MSVC9)
+      set(PDAL_COMPILER_VC9 1)
+    elseif (MSVC8)
+      set(PDAL_COMPILER_VC8 1)
+    endif()
+
+    # check for MSVC 8+
+    if (NOT (MSVC_VERSION VERSION_LESS 1400))
+        add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+        add_definitions(-D_CRT_SECURE_NO_WARNINGS)
+        add_definitions(-D_CRT_NONSTDC_NO_WARNING)
+        add_definitions(-D_SCL_SECURE_NO_WARNINGS)
+        add_definitions(-DNOMINMAX)
+        add_definitions(-DBOOST_LIB_TOOLSET="vc110")
+        add_definitions(-DBOOST_ALL_DYN_LINK)
+
+        # Nitro makes use of Exception Specifications, which results in
+        # numerous warnings when compiling in MSVC. We will ignore them for
+        # now.
+        add_definitions("/wd4290")
+	add_definitions("/wd4800")
+
+        # Windows still warns about nameless struct/union, but we assume
+        # that all of our compilers support this
+        #add_definitions("/wd4201")
+    endif()
+
+    if (CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
+        string(REGEX REPLACE "/W[0-4]" "/W3"
+               CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+    else()
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W3")
+    endif()
+
+    # check for MSVC 9+
+    if (NOT (MSVC_VERSION VERSION_LESS 1500))
+        include(ProcessorCount)
+        ProcessorCount(N)
+        if(NOT N EQUAL 0)
+            set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS}   /MP${N}")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP${N}")
+        endif()
+    endif()
+
+    option(PDAL_USE_STATIC_RUNTIME "Use the static runtime" FALSE)
+    if (PDAL_USE_STATIC_RUNTIME)
+      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT")
+
+      # Note that the CMake cache will still show /MD
+      # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace
+      foreach(flag_var
+        CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+        CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+        if(${flag_var} MATCHES "/MD")
+          string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
+        endif(${flag_var} MATCHES "/MD")
+      endforeach(flag_var)
+    endif()
+
+endif(MSVC)
+add_definitions(-DWIN32_LEAN_AND_MEAN)
+
+# note we default to debug mode
+#if(NOT MSVC_IDE)
+#  if(NOT CMAKE_BUILD_TYPE)
+#  set(CMAKE_BUILD_TYPE Debug CACHE STRING
+#    "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel" FORCE)
+#  endif()
+#  message(STATUS "Setting PDAL build type - ${CMAKE_BUILD_TYPE}")
+#endif()
+
+set(CMAKE_INCLUDE_PATH "c:/OSGeo4W64/include;$ENV{CMAKE_INCLUDE_PATH}")
+set(CMAKE_LIBRARY_PATH "c:/OSGeo4W64/lib;$ENV{CMAKE_LIBRARY_PATH}")
+set(CMAKE_PREFIX_PATH "c:/OSGeo4W64/cmake;$ENV{CMAKE_LIBRARY_PATH}")
+
+#ABELL - WHY?
+set(PDAL_PLATFORM_WIN32 1)
diff --git a/cmake/zlib.cmake b/cmake/zlib.cmake
new file mode 100644
index 0000000..cbeeba9
--- /dev/null
+++ b/cmake/zlib.cmake
@@ -0,0 +1,13 @@
+#
+# ZLIB support
+#
+find_package(ZLIB REQUIRED)
+set_package_properties(ZLIB PROPERTIES TYPE REQUIRED
+        PURPOSE "Compression support in BPF")
+if(ZLIB_FOUND)
+    set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} "${ZLIB_LIBRARY}")
+    include_directories(${ZLIB_INCLUDE_DIR})
+    mark_as_advanced(CLEAR ZLIB_INCLUDE_DIR)
+    mark_as_advanced(CLEAR ZLIB_LIBRARY)
+    set(PDAL_HAVE_ZLIB 1)
+endif()
diff --git a/doc/_static/breathe.css b/doc/_static/breathe.css
new file mode 100644
index 0000000..292bc7f
--- /dev/null
+++ b/doc/_static/breathe.css
@@ -0,0 +1,13 @@
+
+/* -- breathe specific styles ----------------------------------------------- */
+
+/* So enum value descriptions are displayed inline to the item */
+.breatheenumvalues li tt + p {
+	display: inline;
+}
+
+/* So parameter descriptions are displayed inline to the item */
+.breatheparameterlist li tt + p {
+	display: inline;
+}
+
diff --git a/doc/_static/dummy b/doc/_static/dummy
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/doc/_static/dummy
@@ -0,0 +1 @@
+ 
diff --git a/doc/_static/files/2011_Codesprint_libpc_design.pdf b/doc/_static/files/2011_Codesprint_libpc_design.pdf
new file mode 100644
index 0000000..743df95
Binary files /dev/null and b/doc/_static/files/2011_Codesprint_libpc_design.pdf differ
diff --git a/doc/_static/files/2011_Codesprint_libpc_implementation.pdf b/doc/_static/files/2011_Codesprint_libpc_implementation.pdf
new file mode 100644
index 0000000..2c8f603
Binary files /dev/null and b/doc/_static/files/2011_Codesprint_libpc_implementation.pdf differ
diff --git a/doc/_static/logo/Bauhaus93.ttf b/doc/_static/logo/Bauhaus93.ttf
new file mode 100755
index 0000000..b705701
Binary files /dev/null and b/doc/_static/logo/Bauhaus93.ttf differ
diff --git a/doc/_static/logo/big_bubbles.png b/doc/_static/logo/big_bubbles.png
new file mode 100644
index 0000000..5aef452
Binary files /dev/null and b/doc/_static/logo/big_bubbles.png differ
diff --git a/doc/_static/logo/big_text.png b/doc/_static/logo/big_text.png
new file mode 100644
index 0000000..b225940
Binary files /dev/null and b/doc/_static/logo/big_text.png differ
diff --git a/doc/_static/logo/dongle/back.ai b/doc/_static/logo/dongle/back.ai
new file mode 100644
index 0000000..9f4d00e
--- /dev/null
+++ b/doc/_static/logo/dongle/back.ai
@@ -0,0 +1,10118 @@
+%PDF-1.5
%����
+1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[6 0 R 65 0 R 123 0 R 181 0 R 218 0 R 276 0 R]/Order 277 0 R/RBGroups[]>>/OCGs[6 0 R 65 0 R 123 0 R 181 0 R 218 0 R 276 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 46206/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156821, 2014/08/29-03:07:50        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">Print</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmp:MetadataDate>2014-12-22T13:49:47-06:00</xmp:MetadataDate>
+         <xmp:ModifyDate>2014-12-22T13:49:47-06:00</xmp:ModifyDate>
+         <xmp:CreateDate>2014-12-22T13:19:35-06:00</xmp:CreateDate>
+         <xmp:CreatorTool>Adobe Illustrator CC 2014 (Macintosh)</xmp:CreatorTool>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>76</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgATAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQV [...]
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpMM:InstanceID>uuid:b836aab4-72de-484d-94c9-62a12fb4a9b4</xmpMM:InstanceID>
+         <xmpMM:DocumentID>xmp.did:279b96da-73fd-4f18-a911-b0f92a8f1768</xmpMM:DocumentID>
+         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:d1c078a0-2746-42b2-b0d1-25aedff8fb1e</stRef:instanceID>
+            <stRef:documentID>xmp.did:1b6690ed-28a8-c141-9479-b6a9cf6be651</stRef:documentID>
+            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:279b96da-73fd-4f18-a911-b0f92a8f1768</stEvt:instanceID>
+                  <stEvt:when>2014-12-22T13:19:35-06:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CC 2014 (Macintosh)</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <illustrator:Type>Document</illustrator:Type>
+         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>46.499639</stDim:w>
+            <stDim:h>15.998472</stDim:h>
+            <stDim:unit>Millimeters</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:Fonts>
+            <rdf:Bag>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Helvetica-Bold</stFnt:fontName>
+                  <stFnt:fontFamily>Helvetica</stFnt:fontFamily>
+                  <stFnt:fontFace>Bold</stFnt:fontFace>
+                  <stFnt:fontType>TrueType</stFnt:fontType>
+                  <stFnt:versionString>10.0d1e1</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Helvetica.dfont</stFnt:fontFileName>
+               </rdf:li>
+            </rdf:Bag>
+         </xmpTPg:Fonts>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>White</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>15.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>85.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>80.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>35.000000</xmpG:magenta>
+                           <xmpG:yellow>85.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>5.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>20.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>90.000000</xmpG:cyan>
+                           <xmpG:magenta>30.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>30.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>80.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>45.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>70.000000</xmpG:cyan>
+                           <xmpG:magenta>15.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>95.000000</xmpG:magenta>
+                           <xmpG:yellow>5.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>25.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>35.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>10.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>95.000000</xmpG:magenta>
+                           <xmpG:yellow>20.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>25.000000</xmpG:magenta>
+                           <xmpG:yellow>40.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>45.000000</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>5.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>60.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>55.000000</xmpG:cyan>
+                           <xmpG:magenta>60.000000</xmpG:magenta>
+                           <xmpG:yellow>65.000000</xmpG:yellow>
+                           <xmpG:black>40.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>40.000000</xmpG:magenta>
+                           <xmpG:yellow>65.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>30.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000000</xmpG:cyan>
+                           <xmpG:magenta>60.000000</xmpG:magenta>
+                           <xmpG:yellow>80.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>65.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>35.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>70.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>70.000000</xmpG:magenta>
+                           <xmpG:yellow>80.000000</xmpG:yellow>
+                           <xmpG:black>70.000000</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Grays</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>89.999400</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>79.998800</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>69.999700</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>59.999100</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>39.999400</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>29.998800</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>19.999700</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>9.999100</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>4.998800</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Brights</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>75.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>60.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>0.003100</xmpG:yellow>
+                           <xmpG:black>0.003100</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[8 0 R]/Type/Pages>>
endobj
8 0 obj
<</ArtBox[1.73402 0.134171 128.275 45.2162]/BleedBox[0.0 0.0 131.81 45.35]/Contents 278 0 R/Group 279 0 R/LastModified(D:20141222134947-06'00')/MediaBox[0.0 0.0 131.81 45.35]/Parent 3 0 R/PieceInfo<</Illustrator 280 0 R>>/Resources<</ColorSpace<</CS0 281 0 R>>/ExtGState<</GS0 282 0 R>>/Font<</TT0 275 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 276 0 R>>/XObject<</Fm0 283 0 R>>>>/Thumb 284 0 R/TrimBox[0.0 0.0 131.81 45.35]/Type/Page>>
endobj
278 0 obj
<</Filter/FlateDecode/Length 175>>stream
+H����
+�@���s�C���n���:IH
]�������g�!�������?rcQ�0I-���A()\�[_�[H
H�%,=�s�/[��!�=H�
�;���E�1�E&�@
^R���ٞ�`w�ڹ;C��
.bf�``����W/��r���	��ߩ5�UC�vC�,�X�]� �,J>
endstream
endobj
279 0 obj
<</CS 285 0 R/I false/K false/S/Transparency>>
endobj
284 0 obj
<</BitsPerComponent 8/ColorSpace 286 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 5/Length 42/Width 16>>stream
+8;Xp,*<rlN['d<Fis%bO#(-c.ng`7p!sBG@)KIgu~>
endstream
endobj
286 0 obj
[/Indexed/DeviceRGB 255 287 0 R]
endobj
287 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
283 0 obj
<</BBox[1.73402 42.5696 75.7423 5.08058]/Group 288 0 R/Length 5646/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 289 0 R/CS1 281 0 R>>/ExtGState<</GS0 290 0 R/GS1 291 0 R/GS2 282 0 R>>/ProcSet[/PDF/ImageC]/Shading<</Sh0 292 0 R>>/XObject<</Im0 293 0 R>>>>/Subtype/Form>>stream
+q
+/GS0 gs
+74.0078095 0 0 37.4888263 1.7340353 5.0807957 cm
+/Im0 Do
+Q
+q
+38.946 40.568 m
+38.946 20.939 l
+38.458 22.155 37.721 23.253 36.727 24.241 c
+36.727 24.241 l
+34.751 26.177 32.342 27.152 29.508 27.152 c
+29.508 27.152 l
+26.688 27.152 24.296 26.19 22.333 24.267 c
+22.333 24.267 l
+21.267 23.223 20.497 22.051 20.011 20.766 c
+20.011 20.766 l
+19.837 22.661 19.317 24.095 18.442 25.064 c
+18.442 25.064 l
+17.155 26.455 15.439 27.152 13.294 27.152 c
+13.294 27.152 l
+11.409 27.152 9.689 26.45 8.129 25.046 c
+8.129 25.046 l
+8.129 40.568 l
+3.735 40.568 l
+3.735 7.628 l
+8.129 7.628 l
+8.129 16.814 l
+8.129 19.153 8.428 20.809 9.039 21.77 c
+9.039 21.77 l
+9.663 22.72 10.747 23.191 12.281 23.191 c
+12.281 23.191 l
+13.476 23.191 14.339 22.849 14.872 22.161 c
+14.872 22.161 l
+15.418 21.485 15.695 20.38 15.695 18.859 c
+15.695 18.859 l
+15.695 7.628 l
+20.079 7.628 l
+20.079 13.364 l
+20.56 12.118 21.294 10.998 22.281 10.011 c
+22.281 10.011 l
+24.205 8.06 26.584 7.081 29.43 7.081 c
+29.43 7.081 l
+32.303 7.081 34.734 8.039 36.71 9.95 c
+36.71 9.95 l
+37.715 10.935 38.455 12.042 38.946 13.27 c
+38.946 13.27 l
+38.946 7.628 l
+43.331 7.628 l
+43.331 9.621 l
+45.059 7.931 47.019 7.081 49.216 7.081 c
+49.216 7.081 l
+51.815 7.081 53.969 8.035 55.671 9.933 c
+55.671 9.933 l
+56.566 10.93 57.227 12.067 57.656 13.339 c
+57.656 13.339 l
+57.747 12.683 57.881 12.126 58.064 11.684 c
+58.064 11.684 l
+58.441 10.696 59.086 9.807 59.996 9.014 c
+59.996 9.014 l
+61.477 7.727 63.354 7.081 65.629 7.081 c
+65.629 7.081 l
+67.917 7.081 69.806 7.727 71.287 9.014 c
+71.287 9.014 l
+72.185 9.807 72.813 10.696 73.177 11.684 c
+73.177 11.684 l
+73.554 12.788 73.741 14.106 73.741 15.626 c
+73.741 15.626 l
+73.741 26.624 l
+69.355 26.624 l
+69.355 15.722 l
+69.355 12.576 68.112 11.007 65.629 11.007 c
+65.629 11.007 l
+63.146 11.007 61.911 12.576 61.911 15.722 c
+61.911 15.722 l
+61.911 26.624 l
+57.517 26.624 l
+57.517 21.328 l
+57.093 22.415 56.481 23.4 55.688 24.284 c
+55.688 24.284 l
+53.986 26.195 51.854 27.152 49.293 27.152 c
+49.293 27.152 l
+47.07 27.152 45.085 26.242 43.331 24.422 c
+43.331 24.422 l
+43.331 40.568 l
+h
+44.562 12.697 m
+43.574 13.802 43.079 15.28 43.079 17.126 c
+43.079 17.126 l
+43.079 18.92 43.578 20.376 44.579 21.494 c
+44.579 21.494 l
+45.592 22.624 46.902 23.191 48.514 23.191 c
+48.514 23.191 l
+50.021 23.191 51.282 22.603 52.283 21.433 c
+52.283 21.433 l
+53.271 20.289 53.765 18.807 53.765 16.988 c
+53.765 16.988 l
+53.765 15.271 53.254 13.841 52.24 12.697 c
+52.24 12.697 l
+51.238 11.566 49.982 11.007 48.461 11.007 c
+48.461 11.007 l
+46.85 11.007 45.55 11.566 44.562 12.697 c
+25.401 12.679 m
+24.387 13.785 23.876 15.288 23.876 17.186 c
+23.876 17.186 l
+23.876 18.954 24.395 20.393 25.435 21.511 c
+25.435 21.511 l
+26.475 22.629 27.832 23.191 29.508 23.191 c
+29.508 23.191 l
+31.211 23.191 32.585 22.629 33.625 21.511 c
+33.625 21.511 l
+34.652 20.406 35.167 18.937 35.167 17.091 c
+35.167 17.091 l
+35.167 15.245 34.652 13.767 33.625 12.662 c
+33.625 12.662 l
+32.598 11.558 31.224 11.007 29.508 11.007 c
+29.508 11.007 l
+27.805 11.007 26.441 11.562 25.401 12.679 c
+W n
+q
+0 g
+/GS1 gs
+0.2773154 0 0 -0.2773154 -16.4739784 130.842298 cm
+BX /Sh0 sh EX Q
+Q
+q
+1.734 42.569 74.008 -37.489 re
+W n
+/CS1 CS 0 0 0 0  SCN
+0.622 w 4 M 0 j 0 J []0 d 
+/GS2 gs
+q 1 0 0 1 3.7353 40.5684 cm
+0 0 m
+0 -32.94 l
+4.394 -32.94 l
+4.394 -23.754 l
+4.394 -21.415 4.693 -19.759 5.304 -18.797 c
+5.928 -17.848 7.011 -17.376 8.545 -17.376 c
+9.741 -17.376 10.603 -17.718 11.136 -18.407 c
+11.682 -19.083 11.96 -20.188 11.96 -21.709 c
+11.96 -32.94 l
+16.344 -32.94 l
+16.344 -27.203 l
+16.825 -28.45 17.559 -29.57 18.546 -30.557 c
+20.47 -32.507 22.849 -33.486 25.695 -33.486 c
+28.568 -33.486 30.999 -32.529 32.975 -30.618 c
+33.98 -29.633 34.72 -28.526 35.211 -27.298 c
+35.211 -32.94 l
+39.596 -32.94 l
+39.596 -30.947 l
+41.325 -32.637 43.283 -33.486 45.48 -33.486 c
+48.079 -33.486 50.233 -32.533 51.937 -30.635 c
+52.831 -29.638 53.493 -28.501 53.921 -27.229 c
+54.012 -27.885 54.146 -28.442 54.328 -28.884 c
+54.705 -29.872 55.351 -30.76 56.26 -31.554 c
+57.742 -32.841 59.618 -33.486 61.894 -33.486 c
+64.182 -33.486 66.07 -32.841 67.552 -31.554 c
+68.449 -30.76 69.078 -29.872 69.442 -28.884 c
+69.819 -27.78 70.005 -26.462 70.005 -24.942 c
+70.005 -13.944 l
+65.62 -13.944 l
+65.62 -24.846 l
+65.62 -27.992 64.377 -29.561 61.894 -29.561 c
+59.411 -29.561 58.176 -27.992 58.176 -24.846 c
+58.176 -13.944 l
+53.782 -13.944 l
+53.782 -19.239 l
+53.358 -18.152 52.746 -17.168 51.954 -16.284 c
+50.25 -14.373 48.119 -13.416 45.558 -13.416 c
+43.335 -13.416 41.35 -14.325 39.596 -16.145 c
+39.596 0 l
+35.211 0 l
+35.211 -19.629 l
+34.723 -18.412 33.986 -17.314 32.992 -16.327 c
+31.016 -14.39 28.607 -13.416 25.773 -13.416 c
+22.952 -13.416 20.561 -14.378 18.597 -16.301 c
+17.532 -17.345 16.762 -18.517 16.275 -19.802 c
+16.101 -17.907 15.582 -16.473 14.707 -15.504 c
+13.42 -14.113 11.704 -13.416 9.559 -13.416 c
+7.674 -13.416 5.954 -14.118 4.394 -15.522 c
+4.394 0 l
+0 0 l
+h
+25.773 -17.376 m
+27.476 -17.376 28.849 -17.939 29.89 -19.057 c
+30.917 -20.162 31.432 -21.631 31.432 -23.477 c
+31.432 -25.323 30.917 -26.801 29.89 -27.905 c
+28.863 -29.01 27.489 -29.561 25.773 -29.561 c
+24.07 -29.561 22.706 -29.006 21.665 -27.888 c
+20.652 -26.783 20.141 -25.279 20.141 -23.381 c
+20.141 -21.614 20.661 -20.175 21.7 -19.057 c
+22.74 -17.939 24.096 -17.376 25.773 -17.376 c
+h
+44.778 -17.376 m
+46.286 -17.376 47.547 -17.965 48.548 -19.135 c
+49.536 -20.279 50.03 -21.761 50.03 -23.58 c
+50.03 -25.297 49.518 -26.726 48.504 -27.87 c
+47.503 -29.002 46.247 -29.561 44.726 -29.561 c
+43.114 -29.561 41.814 -29.002 40.826 -27.87 c
+39.838 -26.766 39.344 -25.288 39.344 -23.442 c
+39.344 -21.648 39.843 -20.192 40.844 -19.074 c
+41.857 -17.943 43.166 -17.376 44.778 -17.376 c
+h
+S
+Q
+Q
+
endstream
endobj
288 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
293 0 obj
<</BitsPerComponent 8/ColorSpace 289 0 R/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 1686>>/Filter/FlateDecode/Height 854/Intent/RelativeColorimetric/Length 136474/Name/X/SMask 294 0 R/Subtype/Image/Type/XObject/Width 1686>>stream
+H��kn�HFg��OV��h~�A"V�U�'�AYsU��
H��!�G�Ψc������?�\�4W���;0�!���+��7�Nx�A���f��%�4sہ���n\��y���O���\m�C!�j_
�Y�:ᑸP#1Dn����,����:��ސ?RD
b·ˢ-��}S���V�q�H77d!����I��`W1"ިvs�A`�4�f���i<Ls�A�+�n�Z��
�sډt���!��j��L��~7�p{F��#E�ʌ.���j7b�ܯG&��	��C����[
��~m���{}���������+��3dًэ	��I
~8���9e^�,/�{��q���L��~E��fz��"ubt��!}E�
YJ�����qN��n}���1��/
�H'|/_�QEnaH-��x��o�V6�O4Ʊ��3�~N<��9��~M���L�l�\���P��+�`E�0�vi��$7b�8�$.�����������htI��ӳ�M�-����k�

�}���0j
7)L����Ly�U��>M�F���oJ��\l�bԐ��e�إ�ߔ ܄�C�
+GIb��6'�j��D��]�V��V<Ҏ�`�K"�07S������Y��\4$��r�|��槛"�l��
+G��ll{T���϶
+�|.Mm����� J�p�-x�Q�(H.F72Đ"m���D]��ғ"�,&���IBߖd�FU��J��NAV�����k��%�N��3�M��FA�1
+��!�3dy֐g1D�Q
�k����q�H7V
j�%���-����6�wV;/҉sŒ�\JN�$J�Udh�W���8u
��.Mei��%��I$��
mC� Po at f�^�{?'�l�X��K(]$YfgT��	��I��71���f�Daj�䖛"�4.GM�‘oM�Q6��@J�:�{�>��z�����A��d��9a&��ޓW��6h�6p�6��
��"#�d�!�3d)�?��q�.J�q�I(
�ƶ�h �F�#��}�>�
+�z 
x�a�9���A�N��z��Q��
�ī��Ć|R�Q�R8C
+�ZCl�r`�("<0��g�q�$�����k��&�n�4˚�ɲ��.���
˲4�����
���"�0��.��fI���4�H0ۨI��h�A��!I���-��@��"�"�"�)kHAe�:惉�D璙���oM�N_��
�Ɓp�$�
t{�lp�edX�}� (�=�ټ��ߒvt1Q�V�%��t�%QN��n�\�
E�gۚ�I�"iV�5$��!��	�O7�%w.#�M�a��Q��x�ܤ�|� �i���
��t�D;m��L.L�K ݑ���Y
+��"�p':_;%;ێn�9C@��o�EC��e
ټ���3�%��Œ71DxT����t�3�5�(T�I"�@6-ݥ0��Z�u��4]�/rz>A�{�&*���ueE���8v�%���
����s��8J4ۂ&�!M6Ê���R�!ӊԨH�Mi��.���,�?�ޥ��(��(�M�
�Iݒ}�����L�$���J����8ޥibP��:'�r[�gI���`��R;�\��T$Mw�U�zC��!�t�eBE�r
��02܄��D����
+��h��R�@6�,M�@�T��K��=��LP>4�Ԇ��Dc�K�BYB�:�����Bא]J�(�l�&�j#C@�?C��C&	
AE N
+�D��t{�.ѹf���$��X��K0�8�$�$�Yb�@30��u�$I����o`
+�sumPC�ۄiRqk
tɞKA��)�$�	�e���d^�"v�ѝD����@��@V���6�aC@
+*m"C L8��^z-�\C�h����dl��e�	�Ϩr`\��
D�k
+�ř�
�ge鯥�<��+�( N���
jg�˶��%�n�R�%�$U�L��p�eE�Mi�����F�mG�c
��.�Ơ!�tӍ���K�%6�
7���д_�S'J��x\�Q*J2G ��ohOAZuum&�yc����6�w�.1d
v��%����x
+.;Ήu����h���Q��P�٦�I1
K<� H8�0D�7�bC@6�M7�,74�Mǐ��5�ed��!�#V���V���30�h
�Ip&�p�(K쑩@��v]�4
�<�0��&��)�����*L��w&��K��K�,- K�TI�#c�m\J��lۖ�}�W�6�lYe�*q�dސE�o�
G:��h�v	u	��K����Аg1DxdU:����@<��8j&)ݣv�����kir�� ^J���T�o�#��V�D�8Kd�x�LA��pG&v��^Jū�ly�m�W[R�5�J�\<9+r�!5R�!n�=M7����K
�,�-
��ߞ |��9�
GI����(�
4)��|,iS�n`[E��%K�K44˒��<�����^�8���e��3'�N�$ܗ^��VŗDI�
ζ]��&�^+���F��"�1do
)�!%n�\�
,��›)ۼ+���%�AUns�=A�<�*�
��K�f`��ѱT$i
+��m �
o�Á^u ���o�n��d�ӱT$� �Ga�JvХdk�ӯ���*���gI�$ܙ~��ݶZG
��F�gۮ�ՆI/��	�)r��r8��8C�%O�
ɒm
'Z������MyC�J£㿿�S	�����5�KIg
6�H�
|C����J�!�tLA��p
+��0�i�]�1�YRA�VK����$U��p��e]G�uTT1D��}�)�k4�v	6)�x2�4aȴ"�X���)
L�%<����,E���5D�$<4���D;p���yd�hB��Q%nR�I�[	�%�ix��[�
?F6h
z�%�1�<N)K��M�e�^�KSp���8'܉�!���jMQھj�R�8��M*MdX$�}ٛ+
9

E(LF���T�,mt��mm��"��rje���R�(���X����7
HS���8���ő�,�D���e����,�^*r�����f�*i
+�s/F��M�J�����j
��~ۖ�\S�r��lSФ��-k�=r�ӧcȴ"����dP&�n�%�
��� K�p�֫;�"TD
�g�\v�F�(z�����X3�"B�
����z������u�9E��v�"@@��� ��pe���7����JB�
����I�� Ni[��o�6�
�5\�]7�c���
+����:�jjB�p�A�K����kɚ
�����Z^�#+}K̥��]rFd�۾���b�R�!��4�!�
W��M(�"����SDFB����LH�xÃ���iU�T9�����z���I��wf�:p�Ҕ��������3�2�b��JMC��D[ i�[�v
-]x[��S �'1y�f}]iU:�J{ZK�N�F��ű�]�Rb.ݝ�BO%���Ô�nsݦ�r��TH�j�#%���BR D>�
D���f1�jx��J:%
k�
�&nEB��n��t~7V"��"rF�Z慴��e���\��$�i���X���HF��
� y�6�AU;֒�g1�_ƒ^�Rb.ݝ��JbFd�T�%u��FR��$>8۰��ڼg#�KB:��HL�5
m%�K��?q�	
+��*�@�E+�!�
���}z�ȝ9�@ '�NR֥�R���D
9�i���fB �z��rB��O&~��
�д�vD���A�A9kIZ��tH��|%-��c�)A��w�&���DݖQ�u�ܫ=����$)U�RmPn��Ը[	��E�!� rKH�=�y��4}�QK�
n]pb
K�p{J��{�c���Jbxr�� �,`���j�3���D%���������S?o%PG�s!BG-��I���2�cia��JOO�I��7�����JS���A�t�$�RAG���9�!B�O
"��9��B���A���/j��p��5;7K����=��Z�
+9er���ЁKR�l@��N"��O�<
8����w���a��B�5�;�A����с�(9�9�ɦ��tJVJw��h�#2L4�J�J�2/�.���
ʶv!����:"��3!�nx8"��T)�p˯�m��V�pKVJ��w�R&Č\��T�ܩ

���� ��,�k�8.�m(���m���c�U#c��E�4k�i�)Xh������4a,y�}i,%+����X�����[1ȵp�2N�PP����/%g|
���������!���B�y	�ԍ�����*�n�BK�q,��Ip��	IVJ���X)N%}��a*mg��w`�g)q��ڙ7 ���,���?���w~�|	���k�"t-”��`%�^���m�DV�̭����ᮬ�b+i��$7���o�6L�Ңܜ���7�xʶ�g2.�
~��L�k!d����\2���n����;ߖK��N
!�J�
�n���+1r��T���t�t��R"�:GJ"v#��������"&����+��T�Қ��Xs
+�I���V�J��s�V@�%��6����*�P�Jm�u����9\!r&�
��z�K��n���p�ǒ
+K��_X$+�{�c+}[��@n�B����X]X W[�@�h)�
D��o6�
�:
�>������Y�c�~�� i	k��Б��!�0�잘�X�`�ʹ�V������b���W�m���J�6WS��>$mÄ��
��&"�7�0!�BF"�AHKs���
��SU
K6W>e�R��Ƅ|KVJ��w�R��
�k '��U�##��r6]׷��ͼ7�fa��M��������� 
cG)XY����5s�;sY�R�{ܵ�����$7Η�n3����MER�B�AJ-�ۇ3!��Y9r��=ҭ��>tݢ��}�)�j�%UT���v�m�X)KVJ��wm��F.���	9���9;��zxil�#�͸!�1��������C<�XM$�~ķj��Z�`�T��t4�T��+�0�JVJw��h��4L�J�3Nr���m�RM|��Z&�FB�mRD����,�
L�D����`/Q����
�h��-!�J�
�.VZ�C�!XY���ru�bBJD
�4�
p�� [...]
+"W�
gB�Ä�„@Kn�#�臷��9�ņ�V�HH�R�Ǽh��
+�=G+��
�8 �jI/;*ȵ��
=��
��i��t���~	߁�4� ��e-51��1�0�
+E�io�[g�h_^���U�R�?+��J//����
�Ƚ6�)Ua���-|�IJ@�6�
"����`/�]G����p����5�%U6��d�U�m��[$$Y)�cލ��%�rV?��	���QJ �0D���[D�x<����G~��-b/
�YK
�k�>נ;��0�J]V��.����S�R��ܭ�N��6Xi�B�urO݆j���[��4���oi�`�L��fD�_B$����
m���t7gj+�ѶVv�����J�d�t|�� $|j�+��j����U�9U}D.f�4�3p?ގ���o��y<c��@18��ơ��3�8�%�e%g��w�Y�3sY�)!���^�W����Q��J��z�Ke�ʹ��Zs�y�R
J���ۏ����W�q\�4"#�C�!S
ǒ3�,�B�|�(� Bڗ�3����1�WV
+j	�����r�mɢ��J>`��20�Ah
B6a^��"Y�H�4�t���O�Y��D���N�v"��
k
�����UUS�R�
p}?�v�����9�Y���x��%@����
K��$�c�1'��F�J~��G+z�
d0�mIij�T[�7�BF)�݈��9�"�GHg	���P�D��RI�">>J�,f�2ܑ�6����|���`
+A0�L`.��	��"W(��n���Rr��v>�/��W�i���`�;\KM��cI�������GH%��x+��bK+�JO�L�0xf趔�������J�!B��:i�N�D�MH���pSc�)J�"G4�,���]"œ����
!�J~���V�
e��BPr�
���\
�ڊ.����w��24�6:_�d�aA���iھ�������Xs9��S
k�9S�O��"�[��F���VR�.L^�۲b�yN�&m�Q_�z���a8.9�N���pA­��UQӱ$p�I�Æ1�1�a"X�;��[Pn����z���
�Ro�J�P>��1x!/,p�\��H�\?I��*`�[i��IK}���RA|8��a�r0�����-�{x�V��VVz��ʠ�>	�D��^��r���v[I�І����"�.7�� ^ۖ�G)�$S8��$�Q��J��˧��һ�������2Y)���R�̓�K/ �R�T҄\�r-�4�w�0|Ⱦ��}��`��'�����n�&�
+bNҁ&X�3�
JP���<r~�v���\X)
+�xy%
P@3)�mZwVJ-Ii�?"���Zj:��A�F�H>L���g��R0Y鋷��=�업��
B0ى���y��ˀ�b�	�%�\�.������.��W������Ơ���\�Ё����s�
����հR��w���LJ�n�|fq�,�)��
�r�
+x�]?^JFI�r�!W9_�	��&ܠ%�`Ӣ�l�)�y��G�Ÿ�p�`����
FB�x+���Vz���D���R���,!+XIW%	bZJi��������J���\�v�\mb��9PWsc	�Vz�V��.��+��@F�P�0�!���J�W�k]uMJ���+BN�+���9���޵�N�E�$���-�t�/��E*�n����}K+m`�퓈&a�"Jͭ�3IpQV�M	�%rGC�5ҕ �b�7k����Z"��Xŕ��K��qnJ�����w�]��S �]���gqV��
�-�R7 ��L����P��ÈLf"B����[������e,����KT�DV�x+���
V
+`�P�a�"Y�K���
r��]J��Ӣ����"��t2^B
�J&{�\M1�-s%l,�pIAV*��
���~���,!�%YIȊ�q���J��y\�
+t[]�8�z#��q4�=�o?����3!Gnx[���&��
+�B(��k��D�D	�Ri�D�x+���VV
+4�$a�8e��%K
%9�`Y�d���!hN%��`��5c�����5x"�ЂFK]׶
�����`n�S`��$v�"+�J~7�+d%U1AV��
t��� H
+�R[��d�m D�;i�;�8Ë́
-!�Z�8�L$"�"WTmQ��
������{�J���J���$�/ �)�5� 2�i�	�㙐�Ci���[��
�g��q:�F���A
��S	�$bW����Jo%�_��J��J-Y)e"	y��U9�P�2�ֶ�붽!d����
�� 2����i8�p�%�W���B���y�iT�a*Y�J�h����ߝ��J1Yi+qd �&��Z\��T9:� �i��������{�^�?�����0+Ay�-A¼�8�@]��0���z+��pW���Vb��!h�� $DQ�J語K�O!2r4� ��Cj$b!��%IQi\�l���[�����Vz"+	X�pS�t�T�z1!h���V:��s���_o>�h �L��~�\�kS����rnK0�d��Y)�V��V
+��X)�	�U,YZ��
�%5��\�
J�O�g��$�XɆ}1Y
+|��e!��U��8��g��[��^7Y�}�� +�PJ~���,x)�\v�J���3+����G+��������3%XQ	�J�)�0%+Ig�wo%�[li�wg%IVJa%.�(=��6��M��n;:DƇ����9:B0XQ"Z+��Ș�RFV��J��J~w��J�h%5Y����4�Z�VC�?sg�
U�W�A�bg�;���y�\K��'զK�`3�R䬔z+��d++��JY��J��
+�D��������p�No�Y�<"���!� B@>���R>��2��J��T9+��J~��+VJY���ʜ�T��J8c�N�R:��M��r�@n��ʌ�;�V�{k%B��*
+�a��Y��[��6[[��Y)#+�Le�dz�$豭)��nF�d��s�XBN��J&ܚNו6V*jˇ�x���v�J��J~w���6��$Y�La%%��a�
+ hRFw�����K+9����
+��Jf�M�<s�4-(��R謴�V��.��qV�J	���B�J��5Yi$dX�ӈ��D at Hg�Tk8���wZ�+	o%���-�TNVJ��YI�J�R9Z�o
+���|
+�?
r��07s��0� Y�x�JP�a%����߭�M+�Y��%5�x)���ԑ�����������!�ta���G��J�e�ޚ�س0��7���c< B��Ctj���i�YnC�Jt?�VnR�M��[}Q�tqVW���Jת�G֫R���褮��U]�a[�ѸT��\�\or��
��>�����͇���UZ,6���?eu�J啩��ŶJ�U"�~��T{U\�U��.�T�^LzUZ�5ey<b"�݅,ۻm>�M�iS�Q��R����*}Q%>�~���*
�*]�J���J��J��|ՙ�C���߮`r���Wi�~W*�כ6�`�aS���M�NT�</�t����yS���J�^�V�*��c&�|�^��z!���ͤ܆��I�*
�*�_m�t2U%>��*��t1h�t9��4)?�q5�m��<\������Mo[��ͭ�4��4�T���*���T�lW�ӶJ�R����ؖb̦���v!w���U���4~X�څ,��4
��t��ҿT��n�J_�*
G�*MJ����_���2��j~�Jw�K�Ti�ViT5U*��U�R��t�J��*]]�5U�#Qg�.�M�n��V���*����T�fZ��x]�q[��]�.U��e��ө���J��M�[p]��|=�uZ
����棏�*�4�`Ӥu���m�4��Vi8�T��Mu�J&�C[?��^�����Ujҭ�lZ��M'm��W�*
U���@����S���o�4�l���U�qD��6��Vi�V�̻�ҠW�o�D��JU�J�M���*�r��YH��r>�V���*
�U:?U%>��U:�֭R}��U�FU����
��U*����U�7ש��KU"[T���n����R]��t6�V�n7��#'R�.���D�*�f�d]�a5�V�t�J|
+A��_��T�U���mT�����כ��U���tݯҙ*�/���I�J��-U�i�4�/U�G'r�J7��t2R%>��Jg�~��\Lo߻J��m�TF=ٯRs	��^�����*Mnn�Uzh
���R}�M��t=T%>�W����E�f�7��J����*5��*�;�^�����*���*�/Y���*�Z�2��UZ.6Uzx�*���*
U���o�T�9X���Wi�,d�J��sU�s��*�����*-�m�
ޭJ��b�W��T%~��T�<�U�Jۅ�o�V�B�U�
G��ħ�*�]�Viu��U�_���lN����Z��~��D޷Je!{U�T����U���t���.Uz|,ߥJ��~�JӒ�N�:��*�����t;��T�O�*-��zr�����c'������J+U�OsD���~�~j"�B�,-�e"��g�SUj'��m;������N����K�vE����Bz)YR%�q~E�^�J|$��Jo��*�O�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�JR%H�J [...]
<� 
+0�d��g�*z�d���?S$}��'K�
�8I �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ����@v`% D`% �+ +�
X	 X	���J ��J dV@V ;� "� ف� �� ��r!���e"�Rs2K�
X-?�J-?q
�r
�	z�����㭴��u�~��z
E�Ȥ��?�J�X%j�V_-Ԭ����ͷ�8+me|`��-[i�r�e,��|����� +mjz`��mZi�r92Oj�������o�V�uh5�
l�=+�h�

:ց>!9�
�=S���o�JG9�6&V�ږ�:��]�v��]���
+zX�9����a+u
���z`���X��ZM]�*�T4T�оl�
�k`p�3'o/i�V<�p��
��
+����zl\�--��(g�e���
tK�m�m�Kޤ�Zf9f���7���ZQ�Rc��f훑{�ܱk�s.��^A7�~�3���6f�γ�;Jy|?�6`j�V��u+�P�#7���5�1e6�A7澈3����d��a�W�a�bm�Mo�فբ6i���\B�������L��kOuB�Y!q;�5����[����
YI��\�N�l
�Rt-���5.a:&chj�V*�s�+�z��
+�|dސ�,�X�Io�+!�1R���rn�]>�]n�j�a%�+�ae����]�@�2�i�s)��0�J��K�~>׮�Y��[–�
�d�C�ar����x/�{q���xVj�&;�t����q�
+�M�:���g֫�B�Pk��}X�tp�֋v�Fwi߈�[�3�c�f����i~���
vl
�L�;{&���z�V��f��z
+
*��w/����4�)f'
��r9cYpj}V:�+�����B�E7�ٝ���3i���]uǶ)&ix�
+rVd�q130������L0>{�1k�R�8�aJ�d���
+*_:�F1Mp���&_�8
�Z���ߗ�J����>"�re���us5S�M���`Y��NՊƬ�
+;7�Mh��͝&��P`>c�V��2d|�6����u��47����.���ɮg$����C[~ኬt�_m����I��˷�w��ދ��xc�5�;2�X]�
�I�ZÃh�#�� �S�أ������|�֬4�2�2Am.\m�j3woZ�Vn�ގ��n��zƒ#���j��k������R���R�N���w���X�� �
I�|�|��WT��c[�2�wC�oRsMҩ:�Q�s
t��CJ�<�q�vk;��*��d�V���'�D��T&
%!ń�^��
��g�������g4����Z���'b%�s
)�WY/"$�-�+�
��w
y��K�4�2�1[��
S1-�~l������S���B��
����-��雿]���P��ƕ9r����L�F�

s��rt�=mG�O����
|9�YKj
V�:�T��a������(�]��^�\�Yu�N����[U4[��d����-�l�����#�}��}�s�G#I��ov��g�*z�P0]���볒>�혁�y*Eq�2�d�\c����
���Ytb�d'�tߟ��,��A�3�
i4���!���[�t�X�,]e�����_�
]�JrF�B2�r��E���L1��۷��I�̕�6m��˺
���+)9U��G&f�3�1 ν^r6���w��6��\qWf��:�Vb�t$�)��ie��ȵ1G�CZ�@7Mq�xo�̯ע����(��3WH#uS�4���:WY��E�n�������(s�W���H�]�[�X~5>���i�fjFJ��3/&6���c#�o��TwO*E��T��#��>�/�� �Z
���od�g�K��
+�S�br�]��.Ej�`��!������̥&lMT����0b��K|�7��t��貚�]̭�^3��ITa]�PK���{m�Ϗ�J�RK�ZKe*�?���?��z�v�r�j�ZU��Q��`��Z��j~Kڒ�
I�a�l-^b�����T��T�v��_m�.�C�{%*��H�6�h���-���	{�&+�Cj%��*)2��
�%%[�W[:�SX�{��$�q���;8Z��,�<���uLW1��]
Ìio
��Z��>��J��++����ZF��5ޕ���j%�~�zy!�r�%ij���A�a^u�R7��n�-��1S\��������n�k9U�B";�����
��i�v�����9<��-

+1�w��J�O�J�}��:�x�TI�Hre�Q�q�{��
Ot~xE�z�Q
6����އ
�۪
��3Y�d��i�v���?O~t�V�z�V:��_���ǥ�He
DI��L��r�'=k#[��Y�%/�U�/M�얬^�+�z�6� �e{��O�Ĝ��
��C��֏���~&����]�����^n�1�wb���b�Gj%UŰS;G����<���Qʕ	�w
�g�tdz��o����u�C�k�� I�q���'�Q��C�4�*��7�NN#��K�ҥl���Si���t���-���I�N���H�\�l�t��r��z����r�RWM�̸���u�V,�i}�%6�l�$
��ڔ���ɡ:ԾY`6�:�K����hכ�n™�g/�i��y�j���T=,�
�d�U>��^^
+�2z�d����󳵉�WO/ˁ�Ý]��p���.e���U
o�	j܉8��$�F����4BE�4�NF�x�Vz~{)����Z��x���6Z:�OJ'W+�lK]/�*���rU�r���'�������'{\wM�=3-++e;f+V5��%(��Wk�rݔ
�hhsc%M����0�g�7��X���/�ܝ����I�ܙ Xn#����n
V��m�J瓶�=��C����
���T�OW�����;d���3j�x��7�(z���i��Ivn�uZ�\�A���d���_ŝ6�lD�yæ���'atL�H�اiP/5HZ-�J��J����y�(o������t_�~�����n�������ٌա��5F�j7�;���U
�f*��#-���W�ve�M}s�ǤTI�H�	�Ѿ^`A�&\�tUOb2�E�-]nu�"���
�)��[��<�9+}_�����mA���1�*I��NS�̓��Й�6n|o��\m����!>Щ��غ��;"$�x��@�2Qӎy������m�4����I�d�m�?�JǷǧ��?Oe�_Gs_v6�C�$ӯ��W٦�]�\foV�ҥ*�2���N���S_n�m3Y��g?��<�%0� D���%��&)�R4���s�}cS���?Ӄ~[��u��S��+|����66���'
+ȳ8, Sĥ�r�>w}�-����$?��V�/���
`_Xd�FM�d��#‹�N�P�D'�d�f��q�0-��7f��X9�FC�M��TD���3
ʆ),���Y��,���)C���4�m��6�Bw%��Lm�ns
+���>J��-�̟����6�9�9��|�w��uAb�[$�y5�M���,cH��ʨv�X*
:T*�5�}g�|�g|���/OO�
�!	��a����d ��8%�Y�!H����;�x��R�|F.c��8 1���ð�eg#��&�\z�ky��FՕ�I�.I�VM���g�K��I�D�v�פ;g����m�	L�JA�=?'��
��j*�C,��������g�R�(�
�C�8�ӬB�
�Q��(g���6]0>��hmcɔ.t�q�jt��mSx��2X����g9�=G?��r$sg�$�A�z���Iz�9�Ѫ!<1~K�m���Qzi���:*]�J�8.�
�+:�2�p�xl��
��A�)��_�)�	�E��$Se|h��y�~/q\���g`3e{���;�L�^�-L+�R�O�I��&�V�-�6�J/�F�����%��t�ݛT'�eg�R�J�k��!��F�҅Z>�TM�a�5	[�"	ǩ�l�2�,�4�Q;��23�4�6';=D�&,t
�`tvrW�t�_Ha	aN`�T���=G>��
�Vp7�K�q)u���	A���j�6��E�����uQ�i]T��Q��	�4�m^u���~o�����y��lP� I���H�.
J�V��N�A��IJ�~�)-�i�3rf$�	=&�E0 �����
qi�]�}1n�^ӀIUP�/�f�Z6$�a#c_u���b=_�3�c�۠��4�0ܪ0M��}���5S	
b�ԝ�J?���.K� %�Nx�`M����q�d�·L��$�e��e������w��!81��m��ЙD�;ۅi��K
�[%N��3�X�w���gL�-��A"��:sq��\��$��q [...]
�	:߉��tB���M
�19
�g#�����u�
�z�
��c��jFR�jՔa��0cu
�CVg�w޲�G+��J";��l*� ܼ�M� ķ� H7/ޒF�:��J��T"���y��}��o�7�=�&�@q�Hr%.��A
�(�-3�M���O�&%Ӭ��\�R���7��T=P
s
+
�(�%}1b+9�-G߬�Ly,a��%���g�XoQz B/�1��J*%5o���k�F�g��J?c*�M�T�o�U��pYz)˯�t�L�����%@œ
)$�i��Tʏ�-�x�z/�
]F?0��L�3�,�LM`�QP2&���K�a�L�����(|$��V�6�
j3�"��%�I鄎�V����p���q'�í֕��w�g��������7P�0u�**m7_�����=T[�I��|$�4�^��20K
�?�.e�6n|dd��lc�y�;����D�{�M�F.��w����HS�@���x�c���閎�
�
|���X��Q�4�|,��r,��b`�ާFB
V#�j��XiytXJ�1��J疨�}��P�uU ����^��#$�Dr@:���Y�*�@�
-
�뒗���2R�d��S�9)��5p)5
+�YˤpM�l���Q�6"r-{��0��
+}�Bs��4���]dG�G�����J/��k~��-����$�J�trT
R��g��.�n�����(y�e�D��2��LX���R��az�K�O*��	�&���3:Y�l��s�K�\bXo�RXC�D�+�K�-�S�'x��,�,p*%�ea�+�֥�S|�%V��$V��}5TD'�P0	���m���k�lJ}
����l��2��������dY]��_d� I�^$2��E��h$�&����FF8��1&��)��ً�%u]͵h����	�zL�פ�L��0�<�ʒa�}H�S �m��~�٩,u���*���^��{�����
ʭ�J�R�!*U�����u�xp8gL�
�
;QZ���8u8k7�%˄�a@�k:aSh�r�Ѝ�0�4:
ݕ����nL�
+g00�/�J���O��5z��3f/�)+�1�8�uA�������@	�8�j���QݥF�j0�D
ƴRZ�֥���wB�i�T��T�ß`j�[1T�ٿ��
�7L"�t>�K�#���:��J��ƻ���JG��
3�Ф�xT0i�S.e�K���z����$�#���S�k���&Xܪ�
# 1�
�)�zO�]Ϗ����
^�
��N��M7�|P%j�]\RK��JgG%�n@�¼��K�����'��<	��e�D�dX$�8�'���x��e��9ۄ�ß�M�m�V��ē
�T�ƥ�
�^i
�D�Z�K��w���ǘ�����b��)�M�Ű$��Zؖ>��3(��
R�
+"i���55v���@5�K�Li�N M3�m�/��yS�G�9��=�m^�-a��������Hb�\�H�#̓e���8�k˩��"�I��Y�
恉�s���qi.λ_��>Ȟ��F��E֤���^Ni�aJ}Oh��Y�w:���������lJ���)����T�ʥ�z��ұ%*
�JYg2�vY����<����VM�1��5����);��G��Y.�2m�x|]l�F�:��W��9�(
�����P�+^=�䘔�Z������5|
Y�좰x�]��d����+���)wI��,���J
+�7��߯F,����FL���@�v�MZ�i]T�ߏB�����醦2���
`	
4�OO���^~�$��85�Hb.��-���H�
��H�I�1�4Q>��LP�1��i�%���.%ݺĤL�Ku��2j՘a��`eV�ϱ�WW�X�@w+<�[H&e���Գڝ�
+��7k�;��t"*UE]���7/� �
D�v���3��I4Q(m�8OD�3*qC����Z&ؔNj���6��6C+dr��F�
5��K�Xga͝��MúH
+���
��
���gj�c�㿄o�
��$J�=F��rI��ߖ�'�����[PJ�Q�����b�&$���<5,��Z*����n<
��еy��c镰����$�|X�	I�����T�.�z�#p�ʺ)U����k`4�e�z���ģf��K�廋S�u�=/��V�kȤ��[�jI�ߪ�6�a,���zޫ�ۗ�0~���t��� ��V&�(��/LX�/�si&ન�ãҙ�t�>Ԕ����y�ö

N�H&�D[nq�$l0N�xq��0�2G�U˨k�]��!����-t�:�8s.=F�y�Ka
�
�D)�QSc ÷o��̗�nID�\��Л0���I�Z]}gs4
�b�}�Ffֵ/��K�
$�"-2�"N�J\���^
+@�`��D��Á
9��g�s�%S�fX��m����4r�x����4J�F��i�~
�q8 Q
E��4B,�x�
K�4�w@�Y*9�
�R���|UjUT�!KB/�tL
�:;&
L�$ɯ#�l�U��h�eeE��o
o���>QY�&!�T�Ҁ��%��0Al,/�.�봉ku�]�@�_.2�M�Pm{h�;
�]�^�1����
+���c��[�����o�
+�ZR�u7�+Lbo�\�\����Jeޠ.�Jo�V��b�@Ғ2�RI&dp�㖄�!�!.�
4�l�2\f����沑�@�
+�|��7��׹tq��P2.l�N�!Ipm2*5NA��v�Y�t��
l��g2�.�Xz�0�Me���)����J¤z}9O���ipS�xe[�a0�lytXB[Zg�����͑�{�R�6
�T�IhJu�
�C�C-S���a�^���"��U�QG�+��Ļa
+�y��M�&p���z�GV�##o$}Qd'.e1�&)���em��K��%��)�KaRX���ܒ�����Ru$�ak���3���77�
s�P�k|k ���ա�
+���$��k*�->Z]
�J��,)H?�V��&)CVJ)�Ԥ���KHB�
C�L2�'W��������7���@��Is.}���y�6L��A����B.,&
&
��~˲i����v�Yx6^C�
C41X�K/��
,#~x����
�aJ4
"4�FL#�����4�00

�4`".���FXrø#*��R�+NTj�Jm](��,�V��
�0�XS�af^`�$��*�<�H[FX,�ѝ�;�1'6љa��4���R�7Ja"gc�qɘb��-?�՝�'b���I;�$_���:$u��z�}<�i1嵳>�>v���
�	
��	�PW)��]��
6��p)
�}Q�Q	"mtZd�&��sJ���D&�$Y���"e�F{NqXdI�$�7^�̴T̚l�8�4���Lfw%5&Z]/���q�(�r�ҹ\�ν
�
G5��N�dM
����9�KӁp����Q;���9^�R�c&��pI��
���c
`�ƚ_w�[
�i��B�Ө�4��Fqmu4

F�b�Ӊ�4��93YH#�?��Ju�����%�&O%\\
ٗ�R)dAf/><�S�
Ŏə/@��fI�"uq�����&�
�6�
��XfFe���~�?"�7J~
?,�sɫ�cu���K����T�r����$_�8T���2�Y�憴�a��fs^/L2�a9�i#����VL�BF�F���P�r��v��S�r�T"�
uUw���,i�j_�/Z!�� �,��^MM�"e��6��B-����iB
��H2�l��,��ū&X�)Z�ߞ��]�
t�''�\E��g���ե~��̸09
$Q)9�&�~�ɲ��dMv����V,\J�.ͱ���M5�e��4����
O#����4~�:F���4
�	��\By4�&,���I���
���N��'4���t"�At
�0�T�:o����u�I�
�$M+�$/0k���� e������g��X�d��9���Xb�Ǒ*��	ʂ7Ja�3
+���u���z]�݅
�%��'f�8�LCM�P�DH�T}���f�?�9����PZ��O����[Ǖ��D� �gw�&����=�`�Kn�=S��
UT�\mN�t��@�^�(����RFN��B�J�H��,$3Y�
v�[��{���
#��M�k\���”UTu%Q��DE�-��}�M�l8!(�(�0	#9�	ÂɁY/I���ɩ׏�R���e�)	M��p*�%v��]�-���Ż��)�i~��G�L#
�Q���צхӰài�5�p	u�E �X�a<yF?�w�wS��Xt`R���J]�$�
�C`5U��y�H���d$U�$�KȊ��� ��5)~�N�
��
���8�[���EY�\�
�Hfd��}�	�\��K{pi�.�K�f72����
&�P]�I�&��h�!��TmfL�z�aks>^9v��܏~ulnG���ILJ����0��
riZ�����S*�I؝Ҫ���*r�l�|���MM����2�KIq�ad�D%) R ��P2� [...]
�9��BNYr�t�əϴ��e�f)�"
�����~_9��)�U��H#�q4
+c0�+r�CP@���}ĥ�.�
}�V[5i��m��2u[�
��Z&=�L��
N�&QE�6H�=t`���H��9
s>s^6%:���+�)��"��%p�֭��\a��;[�Rg�p-x��J1�~X*��JZ��U�%%������? �Hz�5r��J���j���$��dN����*WUsZ����CS�0��W�(L�9å~�K&���[s��|�������]�NՠLRbܗƓ���V�[�
�t%.-���
n
3�T–L\b'޿� X,����G%W
�E����
J���4�ahF����sV&d��%x7�p`�T���y���P��?���qb*
A����&+�l%-��i�t�R[4UL/0�$g��V�Ֆ�j���~%:�l������� L⍦0Y.Q_����]⊵E���nq
��E���#&�!�(T����L
���H2��c�������sޚ���`�c�	"s�����X&,���ij�s.Eui-x��
�����覬J��H�
+Xz˲]�f����
΋�&�J�2�t}��}�N2&^�~4}R2Q�X���f
�:Z�&�Դ9l�SA_�k�X�����Jilè�>?�
'd������o�7�
�����/#Ul��4a.'VKΈsk�7��u��k�1Mߟwu��x��Q�i�>=�`�����
+�ʡ$H��j���=���ͧq�;*AohJHNH�M]���g�<G#���ę�

>��xe .#
���������Z�p:ya290����Os�c.��X])q	���.�o����gL:#0��9�zbR[v��I ��C�C��]�0gR����ù_0��?�6�Ab�n)L
V���K�K�u���������W%|�RE��D`�߿�L�I6f�`R_#ehNqf���1�̰*�ϭҬ����S(�X7�L�0��6Em�T1�ho�a�ܖ�ƙ �O����׾s�*�rT�U< $
$ʇ8����3� E�RN66�S���f��uGui
��j̥���K��@�U%��ul�:�L�z�v@&�v`�+��-�.L�]>�M(#�Ғ	���fU9'
�D��f52�C�Iq�4��6%�Rr�L�i�_�Ɩ�1�%
���4�)Q�逥<
�#m�sR�5��-S�
`�� 
e��V��
^mBM�GH��D����	
;#����y< �U5#.umQ�4��n�|�I� [...]
+:����ܠ�ݡw�?ύ��i�n�L0��
U&T Sm��t����'������WHL���
�Xkl[Z�%T�T��M)H��D1�"\���6�I;�U���� �w43���ٌtS��|aj��K�'�8�i�.]^:(Mm�jR�R�6��
3��A4<��r�ځ/�;������	^
+&.�`)#,m�5�j�,�1*]��t��`7��C��ixB�i��O#j����'���T{H3�*����&b��?�
��L%΂5�I�<���<� �`�%�L[KMb�
H��u<��_<v�[*
h���!�1�Z�s	�Op)7[���ʨ.M��;�4�qQZ�NQ�<���0	��tm�F������Y׻�Z���,��i�n#s
mu�+S�몌_
+S%��UL���[��{u)P��
Tz�
�j�ryeR�g	}������I�R�6c&�S��3&R�̹��]߁l��	��oN�C���Աt6:�tR�B���y&��tMT�66�g(%�Q"u�+Cɋ|Lފ+���s�
�w�{����1�ȊUN\J8�B�e,��و��������~�\���Č^��V���4�5��it�M��K��a`
&�n�aJ�ι;��u�hx��a\{F�i|
*��JT�zA��im�ގ��E��FG��,I&��:�o��^\ce=�w��ʜƜ�Ha},02E��X^�D\H���R�i]M��Wu�M}QzsEi�^f���B��m�0�P=�"M=���9/�}��B&��nS]��$��U�T��.�݁Ko˭5���c��S��S	�
��P%�{,i���R�.���&��vC�e$�a�N2��.�Y�x}���O������&z
\�ۢq{�H�⺴ե��(�
/6�gο1�
lx�S�P
tfɅm
tM�
+�ږ�~���
?���
Ŷm�sV[D���N��`���/��?������Y�OS�*��4J��d��I��i��i4�<�aE����4��kKY�cƌ��-^���p*�z*}'*= ;�;�I���,�c,Z+�X��<<N���1���"
���r�Lu�
���#)�5&�B���vm�%�{�H\�B���ec,�R]��RT��It/�L�J�$$�lĤ�a�j*�I����m��^���aa^�zi���6gn�L�nC_{3.!w#D'k8���J�#���rp���E�S~K�}�&"�"IR���z++L����4 ���C�8����|O6~yN7q��)�&���|��sP��Yq7Pb����6��Үaù�p��(h0���Қ�";i��t�����'�N��
����+.	G.MSAH�}�~Pr?H�n���y*�xF�4�/�REM�O��ZcAӰ�F3�.�	��i2
L�n�+a&�%dA�a�	�2�w_Q
��X$B������'P	�C8o)
�,�S�~�J�I�x2��+!�
5���n)�"Y�ڊ$�}�
�,h,HL���/�
�K�.��,��<��R�K-'�_�����Ei5.J`�fʤ(SSWr��!i��i�/'
zq�/���ϙ�
R�s7<'��y��f.i�%�p$
\��*��ҋ��$�wT�
>`
�K�ɲ'�
פ�ia�
��1�S�$űp�!.,�p�'�ov{�@G�����(".)C��
"]Vy�D��KÔP)CUj�uY��6��,7
R �2�Z�`��~+��������uz7�Nv�^\�$x&�@iEXJ������[�rYڭ�z���㈊#O���=C��4��2�ƺilO��.�Ɩ�AU��@iS{Hk�%�
�Cu�rb�j�џ�J�B%��i�
+�`u�t%
��U��$'0�/1�H]ǔ���1�
"shz�	�
�^_,/�%��:��D]2\�v�K��DY�iX8�.2iR�
�:Unpu�5���|MjG�6����
�Ǒ��o���G�&d�M몀����~SG\�]�Fg�
.8�7��".��T��&��
�z�E��X�̖g����lr:hIE�ELB�
L��i��&�����$slySՌe�f&l�w��':ǥ�A�+)ұvB]��m��<�����r`�L��p頻�5�0!�=�
�]������_v��hb05(L�_��b,��D�䖍��f�'#Vo�J�8n��@�N
�4d_��0��Oc�cO�����_�L&��q�����I	KR

�[P��Q���?�J��~��Yn5�$�	�N.U�T��&EHr�
+�j�AΪ-����
��/z��D9�i���s�K�
E�HZqL�I,-B�%KuP"&��$��W�kR@9��8U?,y؉ :c�s� ���SA
�i	��C.m�K1�*r8������*��ﻶwۦ�
Q��)�4I��IR�%��3���Q���IϿ(���^&��
t{Y�l�E�%�K��D�n�.�
u�
���\V7������}��ĨT�<MR��4&�i�����-�g�M��I���%r��aIK����#f*9,]^\\���3LAބ��DW���/�n��J��i�4
4G
��gӐ�#:QwD[*�<�7�Ѿ,)_�.�4>�^
�(:�jJY2�|&]��@U�U U� Iև�6�k�ׂ�^������
��F{��	[��qi'�H���;�%���XZ^Y�籴0o���E	L*+���3��vL
+5���C���B��x�t�/3=|��{�2��(<
����Ϳ
b��K���
�����p3u�K��P�'*mI M��� ��;�
��,3T��Wکa&�6=�|Mr)��ө��4,�ef��ge3э�	_�)a"p�r_��!�r� �H]:
Lk	b�CU�
g�Jy'�TJMI[Uѭol����
��b�љ���[�NL��$$���U+
�2q��͝/Kl�#*�sT��1_.�m#Y������1z��#�
�
�
+o��$�=1
N�Px��䖬j�j�)7xoe�̳W����3�RFKq�4Lc�(�RgӰ
�v�t S����pB�ǯ!��Q�P
-���6�J?��I*����6,K0v)K�|�\B
TZkS�
��
���������37Ӊ�Le��O�%�8�R�8���Ɇ�G����~K�n�(�E��܂I�"T[��0)�MO*F��bMBu[�#$�K�z�î���ܗ�m�����҄3�n)���%���1�I�>W�\i/P�x/*=uTj�J����c|�	�yx L1�j��<ꘔ�L¼LMr��nsI2�W�������	t�[�L�.���R騝`�K�4�.�s:}6U��*�mQ�b/���`ð`
���[_�zл�~�����[?�\�k��+������:x/*I2]
��FY
��p��i��@I��(_4�v2����Fj M,Ea������ٲd��i|*�oL���Rm˒&f�X��)��-e�Q
^�creW��H���y/5Iљ����
;}5�KM [...]
+_R��
��qa�vz0
��!`{�P��sy��
�d�XKP�7b)	�`���,5����
�ě{:i���_6w�4��*�Vi�0���f�;��Ӱ��
�s♣ �X
�`t���]9���T(�I��ӈJE^;!i�XpI% N����9G'a��q�/'�O���¹$���z0u���K�qE�"ƺ�Yi	�t��K׵��W�2�P�_����aQ�=�~��f��.��_Y�dj�
���'=t���uf�W����B]=��j�DP;���;.�#.E)������:�v��iD���Q�Q�th���.�z�!�����}���gR9cҸ&M��,�U^Z�L63�
�͹\B�(��
+���چ��'_����0 �Ŝ�d�A�xq���8��d�I�΂!f�l��AzB�C�bk�tb�Vdڒ�~�1��1�h�m=�yS*u7W�=��Fq�#�e)Q�F(�
�HGӨ^3
������%@�`	�H�U���Fg�O�}�J?*��A0����
�`�U	%IˉA$���]Ӆ���&��8�y\R�Xd���odj�\*;ueeMq�e�#��_Pt1��m��=
�`Z�������P
&Ź�Ik=�WՖ]M�O{�B����[�������
ݺ���jΥ���P	�`�7
.��=�u�Ò���Rp�6T�{�J�LJ|�F�TI]bcJh܁%�$�7� IŋL���I�1��mN�t�fν�i,�y�����\�����r�L��
���Lgij�l���&�e��,��U��������BI����4p�c���>w�]����a�81
�J5��A�ӈ�{�%<�
Э��W��;P	7�f�q��ѨJ
��q@t��d�!���F��i��\��5
+��,b_�c�zF�(K_9���$��`Tz*�B��#g�3X��dN�eZ*��Iͼ&u~��#��z�SY/�Na��$�Yauu���R�#C��$�1��X���1�?p	%�(A���Fy��*�I��p���$Tϐ��a��=7襱/����
��\�����.J�K�ݖK,�\�8ܬ.qkK&γ��fJ��]���P�@*�U�O��%@������B � �(��Z��9&q��b&Hm󥫴?��l{C�Xt]aj���r'����d�P�֧��&`Q��6\l�T%)@�:�tfmV��̸����@.ճ�x<4|nc�xv<s�U`��%56Tx�$��a�껷U�� O<P��[Q��'C����"��*a,K!�/�(�4��Oco����;�-P
�\�-���TG
F+0z3b4��i|$*=�T�
�)%�L]�M�'G��G1�0�In���&iu6���L`ԗ٢�U/j!�D�^��s"o�V���K�v�H��������T�o"e���D��5t`�B= [...]
�G\�c�V����Z�ԥ��8��Kr
�B�4�@ܺ.rA3�ry
J����5�]i�$6�E��)nA2���
i��恎��r�
�T�foR�Ը.!L8
W��ze�=.�_R�PlU�
+�K�X����
��)ą�7�c�?ƍ��Lx��!KS<�ܲ�F�����;�R�`ě[ϋv`��-�$ξ����9n��ml�RL$�
�qS��t�Ѽ|
�!���
�%���tG�B�:a���o^rWd�_e���`T����V�,��nn�R�$)O�T�kdkR�ڡ&-�S�oz�Xb�Va����Kmח(��/�K0HP(�/
+|�,>���Y,=ߒN
EI�t�%���
�I�.L&`�i�1	4��5�I�Hz\�����!/�mj�K�ֻ�8v�%���:p��ۚ

N�wd�R&u��7�U�`bUꩴ��T�y�x��TI�O�0�	�HkgS&�S&9
��
m�ߊW:�9�t��{.Ռt:�]]���0�/��.���U�+��۪W�	[(e5�DZ&���
��8>Ο
���to��j:
�$�Q��J�R�@o�z�^T�Y�7��h�w��]y���8J�f�����8�i�B��:�=,e�1��x��~��GP �A%z��R+T��rKR����>�BYz�&�����]��1�&`��Ϩ
�hC�Pꒄ[X�BlR���eX�H����R�:R0cE&��
L:̑4�Hg<��s�����������ۚF\�K
n��p��Y�p�Zۺ�m�n�K�����cL%|��a��.MIi?�����e�|O���Y�{��g����n��
\��R�G:~�LE�.I���ݥ���$�R�� CU���r cԩd1�23��l�
����yx�to4dbG�˶��1���ш�
�ͺa=�����
�`����}���%�ƾT%�1�4"N#�Q��4L{�IU1�c ��
+�H� ��{�>��`t�渦�nn6
�;3�(T:��g�̚�Ƶ �������/S�<����m�� ��f;������s p�y���vٮ�:�_7�"�%M�9\��=�$pk���1$9�����ƺd���k�K����HW�&$|i�KչX:�#�ǫ6�7PBQ2â$��$^
+w�e�����Ѝ3�A}�Z�;
��䇡�3����j�J-�
�n��������K	'o�%����\b(a19���4�
T�Ao�������X�+�E	@BK�:L2��
��}&����D.oP��������{�&�har�K�5&��X�
K#.�A���P���d'�m9���r���	������Yq�j����0����
0�)���Q�TZNf4�yx
�i4UI�4r���WL�Ki�B�
U&��(��,
���.��DJ�
?%��[[�@ؚ��k�k(?��$
�H"㴃�}�-�F����
=gJl��>�(�K�`��uI+N|�&e%�!�� K_�X:q�E��e*_�J.J��
+��2L��=&����K�g���/������M/v�k[�<�J�*
��&��h�R�֥����
PI�
*��knJ&�D^�hI���IRRY�ע`�`�˪�$3F�|^�x���]W8[��:\��KTsI;eS�"&l��,�Kc.�$���JT�0�U��V%	j��U7Y;ZÃ�k
����ÿC�L΂��RIX2H|Ж3b\.Xq�H��6�
LÊ4�u�T�}�&g�Τ27�m���42A�(�4L�˦��L����i�M��Dձ�\�,Ş�2
�ȧ�9�>)��	��a@%�T(�(�#�*K|�̓E���N��!�
yTg�`�r�m�r�t�O��"IK��I�S��KC(٢$mQ�ۢ��
���HL�.S�3Ɏ�eR��Nz��P��
ݽ�������lo�.�8w����/���`6y7X�\��~�����Q)�@*���4m��-!)+k}�<��ԛ�̞��BY�mY�L���1R�N��l������X���Y�D��
$�tL�
]6u	a�/-C���f����r(Q7��\��=�
+
їmP&k�RݸɆM�Z�#3�.�����������\È
k�(K\��
���փ�7ܯ���B��q
2/��8c�"*}����Q&�;0Z$[���!�f��F�Q�i<
��4>
��i0
N����p�yZ ��=_�����8�����
'�K�!�Ʃ��Q��'���fIe�l�D\"0�p���%��
��I�t�
��i��iȥm��.��|,-J|9++-��IX=,�/�R%��
J�s�8��
�-J	�H ʕ�(O/k]+S��Yi��^��/��ᱟ
+�ܭ�-���R���H&
�3W����m�D�	JW���G��C�D�
"�Tڮ�L%�~�V�%��
=I�����L�
&�m����t�.[��
t�\��ξW_�D��!}���,!��t.��6�rU2�p����!�b��f��]5�h؄��?�&���-;FLe))�����A�pT��0*�d�{d��
���7�R�4ц��Lc{�4��0:[d,�Z����b���]>�Y�Ɵ����4T��=[*=��:�m�X�D-��%|0�Q]�Ȭgn6�g>
GҸ��
��2;,0��.�֎K��D��JK`C��b,EK�밄b����=̓��RX4q6�#Ģ�(�T�NK�ʬ�e�C�X�>QDY�ޠO
��P@����K54�X
+e	��&�㓯K�M�p�^]��Jז��U��R�ATz�Q���d�
’�&)S)�<I�gRu�IG�t�F�������D��m��H׭K0 �H"͡.A�@����f�iH��������Q�<�a��BSU���K@��y{߇Hr��7칽����|C�m��+2b#�z��Et����
̦�*�R��T
+<�f�Z�������x!�4x
�6��
]ዧѥ�Swk f^��
+���ޚ0�y}o�|F*��PYrX҆�Di�h��pNˤ���k(������kù��E'.�|xh�UrDH�X/L�Jsć�X�JAi��E)�ja��(i���T�x)p
��T�3�S���t$T����9�1�c���C��.���0�਴��=�K>y{,�I��^ә8*ɆJ�]���� z#�SDP^�X�d* &>hK��dN0���B��|��Ȧ�
�\Zu�4�K�7�G�!�e6K�%���AIE�J�-��A(
d�THW�
+U�KLh�m����
>���7[�j����\Y+�SԃEf�̓(����a9�IHw�dq�;�v��a�x�t=J��5�%$WZFk�gIFLZ���
���6�OG��G!�%���%���/p�H�#iMHj�Ԇ�����*�< �V_C.�V\�8�Q��N��d,�bK�K�&�@)W�8���HQ�E�P�U�L
��I�5��P��1���u���7{\*���|�ε�@u)vɻ��
+9#,Y.5P
+*LS*�;�De���1�VҶ%<��>�<G�c&u��(��Qm�͢��@7�
�q�"��M]b�d9�:���K����lU�(Q*`�0D��mU��
+����I#��ߕ:���1/�q#�ۥ��S=(d��i���H�P>�J;PI�)SIh���>������z���X�~���*x��1:��
�E
fQ���hK��g��sK�-��Re*���NUy$��"m9�u̟��z�< �}.�5��bH[��
+�%
+|pD
yoK;��ga��X�;(�*M�ɼ)Jȇ(HB��J�(�U�u�:�$_�!��e
���s�����X�
�R���u8W�R��CY!y��l]".����JP��ӽ;� ��J�
	T�$Ke�$Yz�2��,����r/h�0i�o����sLns�\��N�����fGY"�yS]�%�&1��*���0��T^��%���
/JϘ�x���oכ%���x�Kh
B�X��T�] �J3K���'~*}�T���ا�\D��
�1Z�4���.U�4�~�T:o�	�ѫ
+���4IL�47ǐ�c>D�*�͑���S�W�J�X8���%p�{	�I���䘴
eҨ�γǓVyDa��Zu
�R��l�BYK�	,}9���3_���#[~�G������)�"��k]\.�;�����䬽�
+��N �J�"5$�w���Շ��9��2��g�����
_�,�R��V0.�:����g�i


+��x؅9_���य�6}.�)�%�ap���.�EP]����%����������g���fT��T�0���%
�}�@&)�I���E&�[��vyI6Á�X9�noˠ�^]�\G�A��}��JL
� &�J�X��6,5�D��R��հ3D2�K�~ה؄���vC�{|�C�V�XZ��Ȉ]= &1
��2{�e��id��d�iT��QI'��E�
�$�Bb��ӠܼX�lk�~��ln
���J�J��#�!��x� �%��=P	�[,g{,�ܐ��Y���z�L�
0i�{���M^&�2:u9q������++m턵�R�[X!�Z_�%�7%��D�1iQ��V�\��P�0ݺe&5
�&��դ�[�o�ۅ�����0��m���]�����'%�J��b��R�2E����#f��T����O��T�`ь%�6������B8�����K]�0i0ō���;W��D�=�Ҋ��w<�Lg�����jQ�R K����f�;���B��Y�E�d�%�XHCՠn���>�QVK_�z̀&~���!]A�^�ވ-�
�
$��
KYeIETQ�
�J}�R�R��*J_0%�P��bKLc��i����U
��Ă�R`4vb�cZd��s�����D�_=*m<��Հ%&H
�@���Hd̤u`ҩgv~y#�
Uة1�tX���s6D�������zm�K���Y(1�Jo}(ټ�u [...]
+�U�V���J�O���I�e�S�R��M� 2��X�k?�4
���7�:��
�5��Q�9>�9f�
[ė����T�.1�@&>s:K:�$���v9�����Ƹ�յ�si͑�K
��RL�Ka�䶔x,Փ������"�,�J
���K��+K]Qr`Z:��Dΰ�3�&����C�g�������0
p�rwgp��d��%6aJgq
�"���
sǥ6@	���E*����TK�K��T!�C��C�Uf{�e&ݚH#�
t���;�t.�Q]j�x���C
��VVEV3����Re8�RLU	��Ej�cH���n�/3�aW��
�v�b�c�%�8z =�5זV��}FM�T
d�����ЩIœ����@��S��{Q�́�_H�Ƨq�,�Y�ѵ0����4�����i�a��X�*��#O�
1�&R�/�9z*ՎJ4��D��v�Ò��i>�D���}=e��H�NjVyLA]^\���
���X��u K�ϱ�����=���?zP�J��R��47�f%�$�
+E��i�H
&ܚe���I�=����$��҅9_��+c�8��%28ϥ~]�
T�W��
���.�߾�
L�J&���ʆ�����J��+K��l��l�%�-q	dr���LG����
f�o��w��ՍqiqP�8L��e	Wq��Q����4�'A)EUJ�${���R�K(�f3�����W��z{f����Yp0j�)����2	L(�;Z-��?�����O���S�T�@%\��
+��
C'�x}�4h��4�EC5��14ǤJc4�,ѠR�%�Do���4�u��� �#�y$�a�Yy}�$6ʥ��ժ��9aɎbI�Z����ٲt ���^^�k�E�3�0��:+*�J���
%Ǥ%_��2d�M�I'5i��އ�����_
�����v��3�f�p��%�	�U�,���En��(z|x�L�4͹*�l���T��]T�(N��6KԔP�j>�$�Ϥ��1i㗺c�qƸ�*���.�8�>�t
&|U�W��ؙ��
:%�JY�d	�D@�%��B;�=T%8�f������Ǹ���[o�
g�d��K5��La
+Yf�T��R�4�#�&�Js�R>UY,�w�.qy�i̙Jtc><
�X��>�	�m��+j���r��ƹQi�4�+���?},�P��a	e	�
�1�0*�bHc��$w�6��[Y�e.
c	�Z��Pg��-逥����� U��+���RNP��(ic��YX�Ud����d Y�VW���]�1�&�F�4ܒn���2vp�%�
�q)�%��O޴
+SjIXJ�(lBu�\��HTJ�J9��ޔJ���J�N֞J(���,a	u	+�kމ��
@^�c��-u7Ȥ�)�n�N��Gk��%�4�'��;C���%�)V�?QFU)GQJd��쬪��%)`WK��
�0��.4������
��/·_9�l؈Y閚He�D�]4�"sT�O���$@%
�{�f*a���� �nn4�W�
��|lCs4�QWJ�Ԥ"�1Q��Q���ʒ�R�K�,V�l=�O�t"�[{�Y}
��.�������X귥���%t!���4��biJ���R�Rn�ԥ��0J7
+\j��Ҝ��@Oz
d�	��ɣ��_��-܊�7�r�.q��7 ?�X
UW�k���ć�RM��J����^T�����7��Y�Zז,�T����f�I�&�Mq������ԫK>��]�~o���e�9�"f.�I	J�Jŋ�0?��!�=
+��5��|�7t�7�a8�p����s���g��%*�wx*!�VRSE���3ETz�T���I�(P)"*iP�J�*/�HMťbko��o7
~��\`4/�>�4>�cZf9
T����JwTz
Tڐq�K}0y$Q���]fҝ�rX_����屴���$QlE�6c�8,�,9,�9��?�P�졔Xh?5i�DXTR���!��� `�
��:�|�JGL:(�W8���48�Aw�"w�5�꒡��,NVV�"�ˊ��m����DGQ1�0�'���m�m
	��?�<��핯�TNT	 ����'��
���dǖN�d�hv��J���r�z��	,qN�s`T"-aX/��LZ�M
+(]��gVs�t���8X��;ݚ��!*��
+�1KV制i
G�ҷ8F����w���.�$�rT
+�ì�ꕏJ�
����s�?�A���h�r�*1�I%�T�B
+5'�L�Uz�l�^�J�TP)�	
+,��o#0���@�:l[��lt�c�M
+&��$PZ&��	*�~�J��*�x��q*5��KKΥպ;[�I�dybҭ�5Ym���;lP��\<�K�MX��X��&��,e3-g`	�pX:e)���Ci�(�	%�i!�,0"���*k�A	/�f�7i?a�9IoT��E�z뗆���=�wSV��T�͛G\�3��Xi1�U��.&
�����w�Ҧ�,/H��OUz��ґÞ
KU��!K	�]�oᏜIX7Ȥ�Io'����R\u����*�v��f	�jA�]��
I��R$
+ �*U��0-�f�
������~���x�2�_����������'�
{
�
��D21i�
�wVI�����Hc�*4�T�����w�F{��'�dN%�(dA&A%E*٠���Jc=G����&aǒw�ôZ��W��JS&�ᔜj�i���u�R�g�쳔;�X��J,
��e�,�:����Lb�^�(�d��Ī8O���BK��2#�0�\P�A�L�9��Ǒ�um��0�n��[��t�������{�Ż�,�8���ԙI]
�$����� &�dv��;f��W)�l��N%bi�g�r.��HZ՝I
��s��񼤣��b�R��.
׉�n��%�wP[��Jh���� %�J
+M���R
ER�D�(�l��Oӧ?���>2���짛�|�xݬj~F|-d��
@B2'��"��z�^�J�
P�@�D�gm��҇��u�6�S�1�ү�m�*
��e�y��
���Kʎ�N!9B�Ǡ��^�Z�~���G��]��(5�P���m&}ب��`���z�Z��묍c�\�X��ʭIEa���YҞ%�����֥�FPJg��$�NM�%�9���*"(�ҡ�J��vޤaN:�I���K���'��x`���
�z���n�y��ʕ
Cc.��ycQ@\z���LZX����9�x�*�TiӬ
K5-�}�ÿS�j�?2i�G�0���>����nĥc�;�6�ٸ]�/v�>U��)^%�tq�d����I@	Q)FZ�&Ѭ����
^�5ps����e0�G���C�T:
:���)�XR�`�t��
TҭJwQ�U)"��h���B�ܫ�
+�����h89��ʊD�𓊑ƬR��T�Ui�Rp	g�O���&}����`S�u�
K��*�iyb��T�1K1��ybz�FT��>K�0J�s�*��0��\e�)(%�x�"��x;�
+_��5��7iw<_�/ǤO����O�tɥ��s�ť0�ʚ[ƫ7�k)�����Eb��٣�g��Ji$�;���SiG*A
JK�2K���
IK�6��vd��t���-�S�w�K��䖉͚�V��-�B�1)ʖ�xJ��E�H����2i��h
�d�­A��ps�OT|闛����
�[R	�=!}�$P�V�JR�*wRi֪��J*���͕�xy�m���Wi�U��J�$�$\���A�Y�*��x�ҏ�)KΥN&j��%�`j^h�h��ui,.u��[�j������L&�����Ě�ђ^\q��z(��|QeQ���0E����%]f�-֖C�z��}J�L�B��\�W?ӘK�1�ڸ�X��d\Tr,#.�ce�K��G�Jߥ�RT*?W�cP	��X��d݁HUU��\Xz:�������,�M.
Nv:^�|��.▦济n�(�".-R�ćPBT�*�E�g(\�y����
�ڙ�3���K~��sn�N�
+͍��{�*IV)�T��R7ױ�B%m2zk�R	��n�owoP��
�ҖU�4�Ŗ5݇���L��W�e	�����T����
&�w�e�3�>w^N�ׄK�Xr�^I]�Ahe
�I��X�,Kާ��f)��!J�EI�@)-D"
��%�@
�R�0��7�to�&�����{ܥ�DcγT�MARA��-�5Kp���s
�JOJc�)����e�:�إ�����kz&�u��w(�m��͗�z?T��v	����%�J`I��)M:�PJ��i��3
����VU��pӛ��L	�39���a�A���Jhq��T�J@*)ө���JQ�R�*�[
��*��ؿ�6�9�
�6(9���Xv*y�-�_�Ҁ��ҞY�7Υ��¡N���m9郺j���`*Z�����-mR#0�I�Ub�giD,�3�.���<ś'
-MaUA��JuI�
+%
�AP��=J#&��q�v���
[���tq�$.�dRU��d�]�	�UDj��� ��/�Jb�{�J�J�V	��U�,ѳV��J>��A}y��y�SE�E�U�</u,�mh��5kYR�pAR��XE�'����<H��
+E�@�zE��j�l�J��9<v=�g>Si��xЩ�cK$R)�T�����v*ũW�"��6*ZU7N��
���@�k�c��q*Iѩ�/S�w����Xb��%�R�7��>���;��~;]ƥ	�j
��Vc�0�*f�d�'�8�(,�\3r����:�"�R"��Q2���dMU�K
R���A鶝��76r��:�iܥ��68��kl�lU��M�)*a�%q�汒�opIgt��}CT��E��!U�u���p�~U�n0<��R]�K�t۳��YK*m#(�b���3Q�~�~�ť�%m����%\�J:C�� R"�R�XD�'E�D�Lb�#�'0���N%7�����JB���$��6�J��*e�SI�a�C�������o��OU���D��J��N��Uj��w�c�8`i�4�2
OP
Joi�?�����C�l�g�r,e��Y���Ĩ�&��FDK}�

BP�@I*
������GQ�Љ+7�AiwnҏMz�-�v������q<.���{YR18*e%������i��8�����S���N�DI$E�:|u���I���ʒl��x��	v��m�T��+�P0K��\LZ�A��Y��@%�
v�����ʽ@*�,5.ѩ��,���P��I7)�D�&V:g��E�w	�Y�p)䂥8E�
���%�L�$nU�)�=-�T*W�
�iy�<{6/}wT��B����U	øS��
*e�J�.��mq��h_Ju{mU�
�eUYX���QIx��xXjY�'p��Z��M��
r��f��dy&Y"��,�z��gJF*�8�a�r<�*³[�Ը��Ԡ��Oe�R�2B)Ӊd���P�O^,K���͑�4'']9}�=g���K�7�]z�o�D�e)�Y�՛Y�i���#.�%>�x�%�01ї��ڪ�,���)	�,Y���$٦�Mz�W��I7��Y�;���]&�V��k�*j��%h�q���co
+!�p��R��
#�b�1

�!�8���T9s�Qܩ��JkV�tTZ:*�𷨔+W%��s
�S�^��*��aUr�#~Q�Rf
�t�*
�%�R��K�R#7/�ouX�@ivc�k�����?�����~�%�	q�$���`
j	?>���=���I��j���(F)�K؅t���(��aPڏ����L��\�2��{�O{̥~\Z�#��,���Ch�uj"
x��\��'���T���iW���U� �Z����T1K�Ǜ�Fm�.JooG�:���P���9e�k�
�6.K
�P3
+��M�Kp�[,`�/����U	TBO d�*����9�~�q�V���U)wU
+�ߦ@rT�gb��i�.�
<xoNr�YW�*�=��#��������6/��
�Eiߡ�yMP����vl����5��/�)uz�M‚nU�9̌zT�o��_�I@�)/%�E)�PZ�2�fҲA	��hP����j.��]���
���Ku\��G
�<���3�@�PEL�nNt�/�%��(�� 
��S��
�ݍ��Jt06H%�ҺTU�Us�I�AuPz�?�&�US�
g�뉲�ۢm�}�-K�Y�kDB���fGS%���g�bD�8�ReK�5*U�
~���ߡ��'T�:*av�*	�{UJ�*��bժ���mt*��Vc*a�~�F�R�R�R���$|����h��=v�es��m���o�Қ�jY�-CP-�I2��ː��Q߅�w,�(	�a�f�I3ނ(��(Q�b`�����^�%�4���^uf���.��q�Y��+�hE3�c
+�-ؾ,�^�q�	&�p��i��S�ݿ�J�Jȫ�K8�O�k�� �C
�%�������Qر�|�~�F�R�h��ʦd�&�8*��DG(�稄�4S)�T�J�z�Y�o�Һ�JY��U�šJXj��J���P%��쫤��j�F>~�8�ªԤ�&)
�dM"�N�#}0�g��Ȼ
X��7ր%����F�d��0��D������/����Q҄����2'�h�V(���TP:�R_t�7:��K��A�^��͵pVodלsf
ҫIBL:!�E$�a�R�It����T*n���ls4*��:�hU��ȴ��m���lPz�V��L�_���zˡK���u���H�u�P/�(��M��"$��d����
�ӠRqw���@%=�JI�
TZ��6�*�7��J�y
��n�R�R��A�1�j�ƺ⒗��Ϡ��Y�I�1M���GW+������~Q���?8&�_��-=�R�?�I�:BiՠD&m۠t3�.�W��ܗ��6\�ʲT�YBT�i
�@z�P���
G%�$�Di�m��V��[�>l�ź����hTô�3��MK��պ�mF��[&�5�	�X*Z�$�q)�}��R)T
i)N�/��aO��J� �PT��T�M��T�
����
B�Q����ei�Ҿ5i
+���w�W�4�K#,��
���W�A�K��4� Rj(Xfԓ`��%:߾5(}�$,J:��K@)�P��v$(�����k
O���(���.����z��%�Š��.�B&!�Ea(P�b�01P)S�pW��
U��Q	,���j��ۃ_�sPz�3Jź��ø4`iw�Jֱ���%!�'�B)D%��m
*TyG����D}�x*���T�~s�h��U*�������{8,��
���M�J�[��]o
ai�T�
+M����T�ba'~����{��4�R���۰��#�hT�kFi��:������ַ
u�o>�4�K/\��<�0H,K�,_bI� 
+SN��|o������e�=
e"��*e�S�U�a	xU�T�J��C��e���y���F��8�f�&&�%�$��B�ʧ�D=��J�Ui��J�[����P��qU*Tz��f*�e�T��x0��}w����%�P�}||
J���uno�diC,dG�"O4ҭ�i�X�G?�(�S�,�%>dR鋧�"�d�R^'��Q�y+�P7JJ[z�v/ǂҵ&]v�������ɸ���%�q+���+��R��8MMR\"�|��|_>kD%�PKL�l���j�~:�aL�',�0uqig��c(ݹZ��n,��YZ�,e��,E��B��T�'��Q��1
3����J�T9*�V��0 6�J���\����J�5�C�t�R�%��"}ԧ3�
P���_����M��AHs�\V�S��$x~�8H�	d�,qZ�K|r
+J�JK샴�3J�2��6'(�Diޕ�ݣ�_6��
�H\rX�%����PT*r���m7p�
���K,�@	�T`ܥ�� \��*�쾀��'��'����ve�n9���O��9(M��~%����v�L��֬)Y�RZ�&�B��#� �qj��0�m�\�*����7���|�s�?e3�^�����ҩDC����*��xoo�T�=�JðԦ%����9פ�O��
����1�$�4��2��5
�8�3<���Q�\�CA�� %�Z��%�%섫j}��kӇ��Ҍo���~���,Kۍ-G�
+�-
�$��N��B
�0\x>f]���PZ�*�
r�J?�*�a�Y�9qi�mϮEi?@��;ܰ�d�����g�ʉ%��P3�%�A,�@�Dq�X%@6���$;�i���_�ҥ��{Tz�H��,���t
+�G��
�6��\�I�[&��%�L������\��� %�	���_'�mM����+PN
�מ�$ّ��J�w�ג\
�A�H�H>��3�L�,��4.
+�B�A�ɉ��~�g����b�%KպD,Q
G�粸`Ipt:
�ƥ�=ΎyX�"�;%�JE�[E%��R���e	.=�(�
�*�޺(��
+����f�X��RZmi� ����A1LEJ9�r�4�Ɇ>Ӧ�����UjX*]z��1i��g�;_}
��c�T�t4,QM
�TU� `BdQ���C,%����
c���(�]��g���7J�
��2�ŋ��_�'�����u�\�K��
KҰĢ��7��c8
&�p� I0��Ur�K��M�e�^���+*g`]��,I��XhrI�0
E$
JR#"r)�M+�T�T���}�:��b�s�&-E���UY=�̴g!��hZ�~�V��*�`!6%��
+��`�����D�v ��~(
�%J�tr.Jm���*�(��'�X그sw["�(��KX\cb)`�q�
���N�R�~�J�J
��N'�$ۤrSz�D���/��Sxr�֞%�XҚӺ����}H&��6�R�ҡVi���b�tS��5~3�\,5����I���'X��z,�K���
n�
fH�LR�J�&��X�$�`�$n H�Ir��F��(
�(
������q4?��.5����
K�a	�$26� �G2"�=Pª��R���T��
+*u��W�
K�9wPz��f��_�k�r�6
ڳ���b	qe�V1H�,!f����0���D*��R=����Ҝ�;_�R�bi���2�7�g��(�\_��r�T�A���`ҁF�]wX+�C�)�G��#��CL&�A��,�P��%J�3P�}��>�/���I#��K�%��f�6,�	�D�.
+ᒷ�����J�A�GR�����dƙ>K�I%L@�m.J���Y�b�̬6K�K�0?�Rh�X��lJ��Z!itHҲ86�6�����=�]|���O2i��_o���������p*E"t+I�
�����9d�-@��(�jSF�T��ܘ��I���)�����K�&�o5KG��Ԙ$���0�>���@���lKF%�u����H��J#,��S�T�4�g�EQ
�6��i��DI-\��9@	9aU¯�J�P�
�6��`��,
��Q�Ƥ+��{������^YQQ�NUbD�x���T��,�I��9
���$�&��%�����P���BixQ�XѤ�����d߳���T���KhrK
+,1L�
�8N��0�7~)M3x�������x
�z��$J�xnd��+��,1��,�`)�+i@�#
+
+1���8�*�,��1m*�*M�d���:���h��{�Ds��n��.H%u�I�bY҉P1�kS>�
<b���I���[��6Jʵ)=<J�&P�~���{}��.��=s��OOU�;�,��%�J��%	�B!`�� 40�X����|�J�eɺ7om�νm�2��҅�ri`�g�O�m���K9X�*ƺ��p�b�U)N�J�<9�Tp�J�M�M�ѫ�>3[�%5]a9L�q�Nب԰d��,Ad�3�;#��=<Ò`���$�I�
�W��	%5��S��sc���4��]WHb$��f߳6K/#,��dhs��(�̏�����.̧/�%��/U����6���K�R�<�(�V&]��ja]�`h���$�LD���J�lK)�5�M�M%��n���浬��j�'OD1u��T֔���P.K4���b|zj��+���
2ɟB�8��ʋ��I����5�RI��ob�X�x�hm�I@��~3�3��~�z˒�ҋ����o�PZ=���R?���XJ�U [...]
J��gY���T�T���{��i��&�f�����0�d�f�.��
�
6W��<�}I��D�(f���>gw_|�d���(�m��
J�
QZ�s��1vL���!���4�KX��$�$`	�9d�?��f'͢D�Bygy���r����V�f��f��� �~gJ��}VR�����O�zKf�x�XB
�b	�,�D�-�$�V�fT!�o��M�M���o���Yd��4r&�k"�鰚�b7BSSEĕ��0)�5��%LB�;E,}�K��
�tǸ�"(q�j
��ƣ(5&�V}��׿�D�r�z��<��H�u��ұ�R
�؈4"!�pD$Ǫ�D��J�R�:-�5�Tے�(
y�(-(�9Y]q�
�
DV���%�.	��G�A�X��lSiS����7˥�U5��+l�ʲ����f�-�੸È
W��I
+���/�
,�_�|��/_Ȥ��DIJ	��/Q:^���/7���1
���ݮ��
�f�P��ı K¸$�H�

&ª$� ��R�ǧ���
,U��V�Km�^�.Fi��釵8���z��Y�`�Os�
s���	s�A�V%��IJ�ߦҦR�zo�L���|��V*,�Q���j�lB3w���d�1Ia,�U�0����u	0}�#��@�{A�␺!�T�D�ҡ�����Ju���/6�ł�q,�v�G���b�Ѱ�7,�ĒB"�aS��
�pB�q�9
�����R}m��:�2i6J���T�B�\��%lJ H�J�*�Y��
�
7�6�گпy��.�r���ș(�U*��_�*K��,

L�9�>
�
+}�
4����o�Ҏ�E�y
JW��;��c
c�n�oqE�k7�6Kǒ%t����Rh� JJTmKYN*џ_��K}�l�:(
�4�p.����n�K�̬Ğ[,��b����-�f[J�4�?�����j���*�YU�*,G)�e<Uc�Қ�e�e],�
�_�r,KY
+��+	����&�����A��x�pBɸd��8����K�{?��z]u���t�s�;�ҡ�R
���K�`
�L
+T\��
*�
�V��R�!����2�>�rF`���B��ҾbI'"�&�p�`���-Q�X*������c���ș"i����I�&��x�!���[qx0�R�/�[���XG�G`i�a�A��;ϗ�F�:f�Z�rS�sQ��5���bA
��7��ZpU�ui��}��V�.)�d:
�ą4�j��
+�J��U�a?i��gys��'�P���hAXk�䌬N��P�%�"�I0QT�P��FRm��
+�^6��p��wi�HV��

G�9kkqa5�)�j��vz0ט�%M�y�*\c�"�d�w������	S�F���olK����ᅤgu�1��,��Ti��KLRh���M��
L�C",(�n�@
��2�
1x�f��VCO;�
{|?�n�*��2C�aU �AZ(�1U��*;.�n	_C%
K�K��m��	�Lǩ�`Zx�L͖`	ZT��L�@�K]U*rD#�:�e��F%�-�I��&b��e/�YCMjƕ��Z�H5��i�%Y�
���=���&����
J2�3(9�x�
+V�y7�ǹ�?����s:�a J�GԔ�DQ�o!��m["
��T�ʒ��*����xC�s�b
�u
t\��C3'��
+�h�(�%���&I(�*!�$��e��F%�-��I���&�`0�]��&�r��bIsT�\_�2��q�g"������������K�F+z
MI��E��}o��9P�� �,5���c��)�X�J,5���DM	\
+�wQ(�
+�<�
T֢|
�8,�\R�r
*Mg�d�X�ʥX:J,�\�R
�i$�'��U����%�F�9�o�sx�7*��^��Pr8�1_��r,�OĒ�{���{��\���,%Ĥ$8ȶ����r�yy��� �$��
JG|��B"��
���N&=�H�
VحO;}�yX�{,e�K"n��K��JE�W��ҩ��{���Si
+K6�x&�/���6�G����	��\b�4<2^4��a��c��^I��D�T���(NP��5��` *}|||~lTڨ��4s�9Pb��$��b���V���
��R*˒ ����	����!1)����C�(dS* �A�4
Jk�\�ͷ������s`I[�
,�-�
+,ۈ���$0	PU%�y�*9�d��zx&�H�]ɾ,�0�Y����t
�K�Q��`��QBu	��Q��Q�FT�pR�z�y6*�o�sx�?*��q}�@��֤e�Ùa./���N�b�*�,eT��*�0�D����
0)�� 
	9���Ju�P�2iI���3��p`Z�%���8b��a�8b	u)�H�0�<�YYTY[�Q�}N�KƱ���7äǐ�V
�\<K3��=�N5\T@,,I�T���=�U�wT�mTڨ�M��U�lkM��:^���2}5o8{ �JVYjڲ���E.�
��$|
�����
��rx}ۉ���CPz��
���V��¯��ڴ[��
+X�Km�B�D&ɤ$BڥqQ�B��:*��ă�B
&͒�k
+Pn��q�Ē*=X�%Ym�uY�r�(m*nBU�>%-��J�<�؃�e�n)k?�]��ͥ�XR
�?hG%���P��*y
	|��.|{{}{
��C 9�J(��W�:�ns����Y&MU���
�
�V�u\�c��`	����R%I�]��d�Ж�<#頠���:*�X�
��H��d��I�[Xz�tB
��.s �
p$<CP"�*�*}nTڨ�
4�%�\
$��q���1�^��
[�
O��5S�JbR�c)��n�{0)HD
	%��8���nE��u�%(�4`�M�s�̴ssi�X
,]G,Մ��.*4�
��$�$	�4F�A��J�A��	��J�XZ~���@1�X.=�@����R�r	*e��K֥
�)�J���e,K�6*i#y�d���-��n�q�˶��.-�O
�6�P�����-K���.�
.�9x�� ����
�˳�4�$>޼*\�o�c�M��
+.��R�a�",i˥8
q�XH(�*�+yI��v�H*!�>?
��?�$�

e�g������ݩ�c��O��
�
+�#�Z�HI�JT�h�+*���Qi����3�I
yh���z��G���B69[-p
H1�Y�.JY��LLj�.o8�.ܣ(J1���P"]T(]�8�d�0!o>5��{8�fO�c��I�t9
	KYV�9�ID{�HB���@�YT�\L%�����x�&u/�$��9WF+�;�}�
b��b�\T�\"
�I�6A<��q��F�9C1�V��G�h�����Ō$4�er�AS���M��B�%|�0��A�=m�{!� NR�R
(ey�C�4%��Bi|����If�u���y稰OK;m:[j�t,�XJS4W���$	��*��
4������J
�\`jf�t�I�d���]o�X�8�VcI��]��T�%a)��
^¡Ɣ��WTeY�P8�>P�{��F%m*nN&Y&iκi<����&�\����,�e�eRQʚDX�8� &q8�P��$ҡD��'���J&�X��f��
l5(����ΗvK��%���
KG�%l��R&n�aG]�LT�*�
Y�i.�>
��K�#��33TҘ��i�6�W2�:W�V^�f�E�͌�e�
!�
��� ���'�;(�N�J׍J��cqc�P�f�$�0f!g��u�i`2�eԥ�T�[˿w�,�47bR�b	Ui�vA�
C*Ka�B�:�J����Ħ�h-pƛWF��w7%�,0���pH?��=��Ky [...]
+K��
].�Ku�n�Y"5I��J��Ruj�=�*�b>����$c�W��.�>0�ᵺ�
+����`��f�V�<r�HSl|eQW-��
+��ڨ�QizJJ,�4$��b���PA�Ҙ膛XbL�|,�NfYj����
�����H�Q D�8�&�(Je%� �h�"Y�4��(i�2ɮ�j�5�o��j�Ɲ�aY.��K>,�/|���a�:b�.���`D�7tI	JT�����QR�|[K��dC�c��F�l�\&q|z5��Ie(����b	/����6`�Ԫ�l�D`�h�-ɔ��d�N�lTڨ4��6S2��$�X�w��;j����`�~�\R������,���,yjY���Ti�� ���?Q�LQLe��5(�U�W�4&
�T9$)@�e8������_�'��|,Q[:�X�Q��$�U
��,&(�yw�I���T��~耒Z�&1H�ԋ�uNs6�cmu�
+�4��O�`�
��K=�$�JYF*�T�oTڨ4yx(i��d i0�Yu��
�m����^V�/�XZ��zzY��C�Z�p�{,�Q O��$P��\���&(�i�J�1�W@�H9W��LR4�G5l9N:�40-H��3X�R��a����2anǂ�����H� I���d���e��T�.Q5��N*���_w�1�j:�}
�� U
��1�v}L���TJ����J�P
+L�
D�/Y���N��׺K��
+XRV��T��K�=� �;��
�$�|�u.���F��J_�1�R:��NRH�Y��9�/���Q�'���c�K)��D���}c�6��T�=�`�SU;JU�
�H�@�>�JP�̆�5�I>�Ƭ��
!�R9B�Ed�^
�i�`�}K&
p�@%h!�~�dB(A�YG%����ןR)����KP*�=�J�)�,9�
�V�hU�*RJ�X�o����U���$X��M����i�iJm�Y;�=<�	�ta*�6*mT�w�($~'P�v{�9K�5:S���u��I���˛���"�b,=�?�~K�
���O
	�GX¥���
���R��4�Jj��[�ηqN�-U!�Aˡ����r�]=����Y
/aIS��{/aL�"� Hp
B	�(a�
�J���G�"�=Y~�;P��$��
�l(�Z���O�5��o�O0cI�t�e�O�\�MCD����Z��x
�3ب�Q���S11�5�I���Yb,��8�۟�z���0ȟe2Mn09c��l�g�Ec��8�%\K��W���S�ׯ=
K�$�4�
J�PZfR�o.�<��'-*��$j
�/}�vs!���3,}�X:	���,a�1t50���(���>��RB���JW��9�&�L�D4
+������"��ZwYO����XRXb�v�%ضM���{?�7�"X��uZ�w���Q��i��RiJ.��
����#㠣\�e���21�d0��f2��U���
�o̤�ǒ�
�;��]���%�
��T�ti�=�x_��IQ�y�
+,���:Z
/�n
+Q�}ɥ����c,�<�Ɖ璵]�\��@(�
�p�6�����b�,}?Ji���ܩ(������V��:ǥX��a�MQi��C~���e(�{�
�J'x��F��J�/��A���>Gn�b-��l+������2���$`����,y��D��A�������/H�
���*
K]���S)<��P�3NA���|GvN���T-�
��cXH;���_��3qwK����
�%H7�$���\J����f�3�PI���d)���5or���"��S�����3��%�Q��ԊX�'8�3���c�w]���L���J�iʨ�{��F���R(�q&R"��F�-A�d!�
+�J��>�����^��֚�^:�
�����M*^B�	����ښ�RU��H&5�ƶ=Ai@(M�� ���� ����H��1�0
-���˂��n��n����ư��r,�c
+� Gt�K%��a�T��>t�=C��ŋ|	���4�*�K��,���RZ
�{�c�u�t��ɬ����%8W�7��4Lm�YFt��
+e*]6*mT�{�E(]�P�Lr���d���k�OXJ.
+�\��sIͥt-=�E�
C�
T,�����ai�C��h-�J��
+�Q�R�����t�IS�oQ� I��TH��9��*��(��^�K�a�Yw9#�N'�%c�m(�@`��e*ѣ����P�=\Q�
J%��ɴ�$�|�q"�\�SZ�{|�8�^�����G��T����Q���OC;�7 Q	�tި�Q�;�S�վk<�<�ƣ��/��b���WR}�e����7����\�����sXJ��M�%�A�,!��}�
�%�$P�Ђ��ց�R�]�OU׸# �X�&=�

w*�8:Ӵ;���.�]�<�	�w�����iL�1	��u�J'G��U��7�EJ�qKL���Fɬ�Mb��shvt��)�<��B���,����tE,y*���
=�c��-S�}��9��WQ)��J\��PRLRHr��CS���]<�c$R�a����-�8�2���x�12���?�
�Q�r�X2
c�!.ɩ��Rk��Ci^J�P�:�_�簓�s��6
�
+M��VC��z�!������������]�%
+:��|��:D.a����/ԶtA�2��	�tY�J�;,B魨Y`��IN��!R�2�F{����
+���հM�ZKZ���a��d���J�J��q���$=}�$Lo	��Xl+r��5q+m�N?3d/JB&���ϥ��?��u�+�6���KX��a]U�
 	�D�@Y�P©ty
��⏿Ȥ1�7�5� 2H"$�C�n��C�Χ]���-|	K��%�3��7$1��-Q��
+*-(�j�YJ	�|��$k�q�9�:�[P�c�S��KE��x̔��D���Z��",�8VO��r1�D��[�
fT�1P�}��F�/.����5 at it�蘄�jI�,�����~Q�/�{���M�L���q���7Ua-)?=~ɜJp�qp,!����=��A&5K-x\B���^%)�g�T�G�I=�[D$�ɐ���`NQ�U���U���4��ZX�t��X«O@%�RO9���]����b��g�Z*�tO3�$W#z����&�%+8��%ZQ����"Q��������⃨D�i>q��ӹ�)�'
RD��F��Jw�vJ'�����>$q�����h�O�~M&&O%���
l���w���Z�Ǟ�ґ� ��*���"�Ai*A�)Xރ�J�N򝛂�5n�7L�y�*�B���Q���&�
��fi7'\
+X�I�����c	�4�&
+:��}�$�?�@�h*}�Tʠ�h���g�
�d]0N�95/�X+'��uG�u�ԂP�
��(�)���X"*]����@2JL%�t6*��P陓@�w%
J %�ā^|
+D�C
K�,�c�q�H��W��D�4{Y�LF�%\��a)3�c�&c	}$Y��
�QS�MCD��‚��nݿJ*�Jn�r�)&Q-T���O@����u2��v
%Q��h	NwI�
崋Zx���aib,upguZ
��J߄��i�=�1I��$�
+�SvNS�wN^+'&��k��,�9�Kɬ}
K��>>�X�����
k��2!��J����O95��P�D&���
�,�
�
+-u�Ȉ�=�z�셦������a�a�I,R�ƥvĸ��ح,!�5���v!Hq(i*��o�n�$��]�oT�-��T�2$S)ȱ���h*����t��?w�g��D��L�	���QH"&�{�i*]�J�WRi	J
�	��FXI�AIv(8�ku�K�C��/�Z*ͥ�
	�>�4�>4�`�NC�� 	B�Qi�ҽ�D���`�/������jköb
���{^�~Ϟ"4��� �
&�ڪ�G.{<��R+aISɥ
E��8a	Xt� ? ����H�O�@)J�/�$��>�p�2�*Q����DpC�ɡ�w@�\�ӎ{B���ӹ�|ܕ�Vp�| #'
q��u�L�=�:GC�b��T*C�\$�I��0I�$���&H&[)w��Zcv ��	�~�j
L[ť�s��^��
cI:�sL���GM���J��.vJؑy(���I�-s�0$"���D���:�%|\&��_�˃	��}����ڜ������j�AtEH\|INR����ht [...]
f.���RQ
e
���]Q��)��W�m�0\�_�t����K�\��T�Xz��6����J���5K�%
2	�/(5%P���6��
|	J3���R0f���~�Z��
+�X��z9�LyUH����i��\o�o��RL%b�H,��YO�RaO(�Nc*���+T��҅"4c���4��ɌH��dҬJI+T8x'K�VF&S]L�4?��S�0b,�����Q� $5���QTz�R�W�ҕ��Ri�2o��A	=u����Tp&�S���٪`�ǒ�
B�d*}�6�ͥBXj����B��q23�
���BdO��<'�xw���I��p����:��
W3
�Q�>
'��L��$^N��T�|[���@Ҿy�C��c�ij��ɤɔE#v�£�tg,���K��QI���P��M�t��ߋJsP��&�I�ZI�#V��@
睍z�ȴu`�H[�mò
�F,��4�Xa,��J�Ԣ����A���t&S)��%�}����%��vz
�T���DSi,��8�p���us؋d2$��K��%X���bid�;��G%����&�H���,���$>�w�
J���A��[��f��;��
�!�n�y�*<�3��z�
CS��`ڎ���[�x,Yoxy����K�P�I�sQ��MT�
+%����׬�f�P#&C�P�`��s���N��f
+Rq0�ָT�f'���
��kX����J��Ѩ�j
i�6�^_
�
TzP��]�BI}�rVw�O��'����$��Y��%���(�T
��/
+f�RS	�"��ˍK�$n.�T=�Za�c��}d��w�JȒ����X*
+&��	{	��,�P:(M��
��J��ͱTk��6��oa��\�	GP����ȱdޅ�Ч��R�]h�!�K�b�p<�o�Q��c ��@��T��J��E��|�pHJ�oz�x��^)HU, �@+�:�0���J�*�P��Z�%`��U�=�a�$�R�����J*]�+[q4��P:z(�`u��v�O��ޒ���JB*IԻlpV+�.[<�&��Z\b���;,�Xz	7߻�V/
U��{U�=�g7�ZX�p�
+�RL���a��tz�N�{A�
CI���nf��U߹�o)�
���;�S!�U���Ԡ
H=�)�
+}ڱ,���qiZx{
K�>�!������%<�����xT�%
U��{��(EE�ifLڪͩ��6�v�%c�X�M��JY$�V(z)�H�ʔ��R����<�n�i"����w�
N���)�I
	%y�V�
T��4�*M�R�����
J;��ġTU`o%$1
�Պ�η�yr���wD�Kd"�
+�$pi��s�.{,�Q�|K��N��F%k��P� Ke).�R�
D�7�?�qA�sPz}{��T��^��?
J�.�n2i+&�L�|+�$S��0P�i,�VeAq7J�<�]��z<�~�ޣ�O���Q�|�L���NU5`�����!(
4�z�c��mN�8�
Hđʃw΢Wj�U
պ�j]�
+�T�KK;j�����X��!*	K'��a<���#���>z(=����ME�4�̛l%�kgC	
a�o��X
+§�4M˔�
NY�wt�w�[�?8
n��0�p߆%����trX��X�2O���MB,��G���|0Xw躓��W���	�.�n1I٦���r�Ղ�-U��-���^��NP�r8=��&G�4J��_�%K;N�0��A
�O�
��
���\�$\
��N*]k/�_�"!��
1	�IV'�i,YY��k�촒{&
+fJ�Kղ	���u��\K�"�(�R)��dzP����+�44Zd��(5J(}n(�[�$�=C�$[�J�%�st�BQ��� &
�,��Th.A;M%`igX��Z_�c,}e,]�E��%d�
$_�K��h�
J=�~ݤ�MP)�;��� Ͽg�f�Ϸ@$���m�Bh�N
�ae��B֧]��nZ����s.�|
�
,������v�
��2J=���L�k�EP
+Eb�YV��-0i�)4l7���df�9�8��\��T�b����s	�!S��\jd�
K�X��<�
�Z�R�����A��f��O��eJ]+(���#���g�&7&!�
I�BZj�ڇ����
B�YHs�[I�x��%��zC<eҏk�
���5,}},E2�E.���ATڱ�׵�i8��zoM�xu*}�>��B���U`�f�˷"��muI�H
�ގMN� &��b��+&-�����q7I�W�t6,Q�n��Z��e?~�n���ľv5�
%�Y�i��&���1'�X3'��Z�ZW<�:���R��/��ݮ�����47��
KG�%Iֵ�B(u6�^�Q��%<�t�i�
T�
�S�3��F@��1
�4�
+|&d�e�R;_-��`��z�w�$q߭���t`�V�K�Kx�=KL�VX:�`ih����J�ҙ�9�m3�*���^��kY�8*��9T�*}d)9(
K7?�E�N]��LR��k�b�B�T��z��
�
+�L� �J�
��/��ѻ�G��ag׶�GuL%�pQ��[�4m��b(5�HԽf�1��
+�f�0��I�ӟ���X�ZG�6KV�T�a;�K*w
g���h��wb�
�tXrP�:7���J����?����I�_�[��YpY
�Bcɠ��PZ-�̘$o���h+�`U-y�ミ��p���D.=-6h}�U�LX���O�q���O��p�=�δ�ɶ
\22a7U���"
� �/L��|@�ӳ�xC�X�0R5T7=�й�|+�Z �j(�(Vz$�+�*,�����[8Ҏ-�ͥf�»;��i���:1�
b	A�秇�������5��iۊIKpM�4����
�
���
+㖽.�Ry�Ay���\�
�~߄�ٱ�72�
�[.u�%��M��
T��QTJ��#���Z�����Qn���������f�'��+Y
+���Q*.�L���<-P�֛d��
?����ޅ�t#�~_�Ҟ7�+�����P
+J2������"���9(

J]�K7�R�n<{Ǥ�fR�$��zN�,>�
��e�
+J�r�vj�Q
/���GE�֨trTjM+[���J�;R�hS(���5V$�f%5#��5�v,��I6V
LLN��(�A(��h�vn�J����ځV�dg��<d��T��A��k*]�J�Zc�RA��$�Hb�[�bR"oII�?�˭��l
���W�O���,$Kq�o���8�0�����ݱ
���D�����R����B�wr8�L
&��y��Ԥ�_uˊ
�XZ),�y,]�]*=1��=Un$�zՙ����Q	����K���ۯa(
(a)��]W�����f�$S�o�
+ep\=DQ�K;Li�p|��x
?
cɉ�3�it,
K[�%�$��>N%�h���zM"���(Q�K� �j�YŚ��$�}ɘF\�S�Z崙�T�u�%��5��V�kU�Y�ǒ��sXr6$Q	���`)\Jv*���F��zS)�F�%#�%4u�{(~U�̐��$A;K���o9
���Eւ��)%`@��R��O��{
{������X�T�yGX��7��f%G���P�U�N_5�F���h(I)Х�,ZKT
+d�&6�l-�h�"���g��߻r��@i75i7�iG\ʸ�M��o�>�zXz}e��G�:�$�%���G��m��_@��â��d�-i���3	5�H6
%�;gR*�VT�r-*���}5-	hd�CK�/�Rl,���I��K�'3�zT2?��ݨ�7R)2���T�h(闆̅�9Z:�&�ZIp��S�7�
	D���4�?�^�a�
|���^��B�_�� K�}�p,Ũtd�HĭV˕s$�(�
�P�/���(�(��t�ţtC *�%�v��U*LB�6H�Z�vU�W?s������]�Ӯ����NQ,���Zx,�X&����ƞ-'
	�+|
��V9W4JR$�f�J�Th&)ɖJ2]!�C��\��D�I� .%

�j�B(�jֺ:
��N1��
��b���K��I�Г;�nT�Q��<CSI�̃R�UJi�~Wdd/�IT��Zd,�J��:<��I�D\J�K�:O�2�Xj�fձ�6��Ro,]"���n
�X:
�K��
���L%�(��ʼ��~9��t�W�BN�n�T�b&I�Hb"I�eE=<9f������-<w[�BZ8k���^Kj,�1>�l�E��<�r�\���	hֈf��
L´M [...]
+Ju��K�,CM�4���I����L�?��L��`,Ts�KI��%�%8
+��I{ۭ5����k�R@%`�Ri�_t�K�ù�+K)(=�
�|(�*��'(Q�B�wۖn�B�5�۹�RU�`�0���t�,�i'`�ii�K��W��c��o����Xb,
(�H���*�{=����T��*>�z�
{P2Eb�E�S��L��H�Y{?7�Y�,
�<��ֱ}�9O[蓠�q��P��X���H�ͪ�����k�àX�B%z�=.=9P�M���3�Ʀ��l/S�\�Zs".�V�T�lI^J�K1��P�dc�	���)���m�,iESiQu��Vk*z䦯K�J�&�v��vt���:��vq�<K�;�{����K8�P�ۧB`Kw�6y�H���b�ͷҭZ��=����.M��v���N
�7p
��
kdD�������ι�wJ�z*
P�
+���6
+%S$x()ͨGP�+�M�և�RZ+"�+U>�Q�Bj.���Iˊf-��_K_0jC�,=�H0��$
%g*�6�?��F���Jo��Si'P�p,B��h��-�
�/O)��-A�6Տ������
�K��|j�7��-��S!��l�X:ũt.\���O*1�
�ֺ���䟚JN��.p2Pz���X�JT�k��ZJ7
U�$�o&�t�ً�s��G��wN�Z�]����~�t
���1,=��H
�x_A�a(��y@��-,�E��3=��3��T��h�8�0N�Ռ&�[�K4lE����?ЬUX����Qk�Ȋ��z1s��9��S�'ҍJߖJ�S	���j
��Yddcі�@)(�PRLB
������Dds1�25�K��Y�^&��ǣc�����/�l��A��];&�I�
���]?��t�C���H� &=��Ԕ�I�R�  y��w�
w^�i0ٴ+G[�2���Z��c����"&	�

&)*��S�*t%�EXJzݖhq�%W30�Ԉ��y�����JŽ�p	�S��]�����EjZ*wq,��pͨ5w����\:L(��ҍJߙJ�h��M%�YK.�?�ZԀR(��Y1��4��I0� I�����
y��5��\z�5��LB/��k/
Kg~t���?z,
K[�����g.	��b*��U�^��w�����,F��V�;�P���c��oon��5������
+La
�s�[x��
�t�X
+F��%}��D|8�Tz��'�ԟJ�hGq�>���Ԣ����4�5bH��2n������*�J(􇖦-�Z��Ҏ�0��ި��~�b��dOJ7*ݨ�џJ�G-�Ne#�e�(�ji�K��T��f� 	�r��&�怉|��{���(,Մ�2��(�	
+.���X:�c)H��K�C��K轌%>;uJ#S��+���
�q(�`,0�[4�A�Jw=O�6�N��S��Y�?B&t�c�i�*H�EҎ[x���h
���kZ�@�v��w���I���Pi\����۝�R���\B��7JZ3[#�^��{L�3�nf�z�a��Bhi1�L���!,=E�t�X�j�*,=L�P�J7*};*�o��q����j��K�����Ӣr�4�C�0�C+��6
�o).��\,���),`%�	�:5���#{l�]<�B*�>/��G2�%�
%
+���L���;��ڹq(�7��Բ���m�Jw��=O%�$��T�B~����������~]}�c	1w�k�e����{��**�D;Y�bPZֲn�H���4&I�0H�I6b
�e%�(��RT �P	`T�*K��VU��g�C��,��K�&�]�44�ơt���m�T��T�p���%�կX40��R6��(
�,�r�����%�����X��+� 6[Tˊ$l������ST��S�4p�� �A��<�'�E�;�o��q�����f*A	��U�Kw2+�s)ݙ�ow��Jԇh⧝�R�>w[xe[��>���ҳƒp�Q!���;��J�7O�ϻ�*��P��H4@�3P�`
0T��i&-�5?.�,��+M[VJ�Z�"'�H�K�4\�W���>2j�B,]rS��Z.�,�4���t�ҍJ�TRT�N����Ux��:�ɒ

���X�
JHĻ�$�F��G�냜��DXB���4�Uy�r�MUR�#�(��XRy���j*�
+�R�qJO�k��ͷ��u��H��u�q�T�J�WbJ�4O۟z��KՉ�����wѴ;��w�~�d
���Œ:VGO��FZ�/���$6́R�P�u+E"�,&
H6&[�ױ�&�AH�X$�?Ь����wkx)��gF�U�K�K/.�\(
M���
�~��md*m���~��1)��Y�����0I[k�S���\d,N@��2T��9Z^
+CL
��e�V�gǒ��5cI>��3��q,I
���r�m�k����}���^!UBQ�J$v|>��@���I��٧��v����
+H
؞�Y��z��q���MO]�}eC	��
F�� |C�#�$��,g��{�~��8n���n�Sx��R������MM�gP�IEX¡q0��
+J�*y�M%�*iѼz�BI	��ä�d�-�Vj
-)@�P���`)biX�N�N���
³�X��K
�$J��� �
�T�
��W�
eUZoi�IuHʡ'�vYP����%�d�V���\�X�	K�C�i^T`|��EYj�,	*��t��J'E�Wiu�,��F��H&��K�*y�7�*9�v`PY *@�1P� JU��(�1��V=u����~
QY�u��J�P`U
+O�)��(�_X�T���g�WLP�U�ͫJ�WůJ�$��%j�)��4˨(	��no#?ɍ��HeqI
%�TV
K-��
.Y"�taz�y�	K�K
L�
%�*�'�T�۩�J�%�3 FV�l蛸PKT��n�}��[�K
K?"ܧd^$���ACV�p
�R�Y��!Fz�I{����'Q���ZGZ�������o6t�zǠ�XP��j
+݌Ia{���齯-��
+!�[��t�A
+o��t
+`i��XY�X".��q�H����G�&�mK�v%�T.u�UA��̎
���%CR�(@���	Ļ��N�
+6	�D���<
Ko�`�y�].��¡�J�D�RɟƟL�SP�PUڠ�
�v�'x�x�s�Ձ��D
IC׿Q�%��ҷ�ai����
+��(K����"�:ew�M�!�J/�JO�J?CTzD*��tFU���S�
+mp�0s1vJ��(�X�aQ}gL��G�
��yn7!�7V
+��tF
+w㷇�CRJ�P�
�\�G#�N����P�v˂���V2雝�����uJ��2BE񃨵��Bc�iܤv�FS�:�!Pj'
�K/&��t�ЕJ����E�C�*���P��a��r�.!�ŵ��b$�K-�3d\�X���:���W
L���( ޖ���ei�����J�,q$I.�����M1W�����$ C���J�
+q(�iq����B7�[˙d�ۇ��
�{wSx&Sx՗�7*���I��R?�
��yP��ET���$�n�RJ$�(�E���Ĉi!B�IKEJ�P�$�����<�X�Q���T!�������
����ҋ�$b������J�+��T�%����RU)+�tY%�o�>D�ý�R��d�4�
=,��f�{���tn�R-�R�&�ۉ�dSi�$,)_�ѡ�YXڙ�DP9��t�&�|0Ui�� �C8xxb��PZ�5B�
Bw.Cw��0�!i��	�
K�9�����Jῧ��v
+K�.10=���J�=v�h��"�R	�HB����c�y!����$j�H9�R"e9hTV�����vݑ������L`��;��C�J��i��T:�}�F��6�X5Y�*�Ju�\$�<�q�@��J�_r�&܆���z��#J�.K�S�(Khy[�;��#n��DS��K%��bɩKJOO��4q�n���I�(���aS(�0x�R4ǒJ�;E)Ĥs�$N��D���e%��Eı��)\�]ח�r

Ò�;�ܪ�<o䪜�+���Q�	(�JBI��%jf%�Δ��(�͖	��k��R
�:5�%�h���Sj/I��X]r����q�@W*
L�O�RoU�ʮ�^XU*��+�f%| ر[
��LzgX� K�O����
ƐPY��i�R�RF9�N�h��!���H*=��ma�lJ�J�Y�����u�-

�@[�0{�R^B?�P��MP2�����>7
�n����Τp�;J�:����§P��c��r��/�Ui
+�E��Dc����B5��
(�jv�T�K�.��
},%�%�xU���ԊurK���
�’�$�����+��A*��'y���rHU�`Ϩ*��h��M���.��w�8��߂9K��w�,-�N`�h8��F���K4�J�'���$�Ď`ҥP�1@�<,�6�h��J�P1
p(�PRe��D0���׫�
��8`w��owc�q�!	r�tqU��Z4J(B	\Q�
J���f�(q�&K�
���%!�Z��R�T�N�ITj[�s*�^z�X�N�b9X2\z
1ɇҕJ�*���ж�q�RZDT���`��9��Ҩk�Z�fK�MT��y
�T�X�r
DAL�5ڒ�uhv���B���-K�%�K�ه��U)�ob�Z�L
V
+�Φ�I(�3
+ѻ���ޚԷpn�Y)���4��]\�_Kj���fPr]u�W
#���1��tY�SjJ�ݚ 1��A3
|Ws��R���R�,���`�#,�i�vۋӃ�%�Ko$YP:��ҕJC��
���>��J� MU]+U��P�0���L��{@n����X�"Q�`����Kd]��cۨIt��ϣG�d��˒���~/�DPTz����l&.FN��Ϫ]�Z\
��
�e6[��m��a�;�N����j;��ݹ)|�9)ܞ��%�%&��R�hͪjL��+Ja&q1����
+�J�Z
KU"-1;�E��Vx�~z8��a$*��),i.I�̇��+��T
+��^Si��У���;��jE�.+�J����KX3�2��{J��Wc�m��R�'��@G����஺�n�u!*�Y
<z�
,,I.�#��_V% -��׆,�i�,�uV.3�Rɡ�C�>L�
Rx��ݵM�*5�x�·�~~Y�X�\��Ņ�ET�@4���2I4�pe���ā�$z4�@*&����Nu�jE�7�����a�{����%�K.����1(]��R���3��u
�&�mrܳZV�>L>����'���#5�wuY����C
%s��
N� &��%��(��`7���!��XXzr��$���P�K�4�N�|C��@�9�%x���PR��k8tO���
�K})������p���ĝ��,�X2u饇I}P�%�h�]�vB�
l��%�@1]oJ� �E8$��ҥRI�D~puJR�*/�8��gJ�J��]�
��\���2i|S�Rip6�<�<��D�¸�!�
n�U��Js��6�AE{4�2RY��,%�c�\�%\��
�*!��J�gQ�Ć�%�%&�G�)YS�R�ެ�}�[Ǘ����A(�M%�,j�R���P����o�)<1)<�Q
����ZkR�%e)�%�%E&�Ɇ�ц�4*
�-����rDK��T�ֆ��k�#a雥S\�	K(�c���v�Ӄr7=
Ǿ�ր��5��
���=2�F*t���4�V*���"ע(Ue�ՙ[�"�J�Y�’��.���m�:��'1<͓
7��A�N���
9�S_YbXR\r��@�Ҫ���r �VL�����i
�B���*
�әPn(�ǵN�O�Зd��}^Yr���d�f���A)P��NU�E�I����JJ���+���h*�,S���y�,@$�5��)�Y��t�]��è�YC`�;�g�$�Ri`	��������/�ݶ�-���ܧ��e��@�p'��MVb�H�m��Bv7��,۰!b�CEt�⩯Jm"�X�������UUi�W%sǖ$�R}(KrQZDU ����(��N*y����~6��
+cb� �v�?(�V����t�c��8U%j�
���f�8���*6���K(�C���6��N
+��X���)
�=�����+K[��K�K#$)(�~7�ފ'�����
��B%�T&�"A鼚��RX����d!a��D�V6ZPu>=�.K���3`:J*�M�R�yFU
DP	����	�� ђR�m��J��N�N:�,!�w�5�LI�(�	+�
+%�Fr���,\*͖�),�UX�4\�tBʟ�JG*��D�nV�U^&<�1� ���V�)]}{�
ݯ򷹅4S��?��I��T�
�}��k)�~"�/O�ƒ�%�zt�d�ޚ'�O�v�D�A��Ec�h"I��
��ݞY��P�N��	�!,9��D�ed0�bz���?O^�
_�
���4Z�{
�8�������i����ծJ�P�F��,AH=
+�QV��dv��T�0P�nؠ
>��
��Œ�%�$
J�g�۬Jr�T9Ehmh����%A)$(�c����*o[XI3��H����4J
�$h%�t�e�5������Ò�K��PZ�$Q⾯JGY�ڃ��E듄����TS��7���`���� �2]js,��yP�इ�QY�`1>Y?
���t�҅J�9����׭��!l�pqF'�[U	{�	Jc5�;�JjQZDU��T�&��
�;5�㭠���|S��d�%�%�%
�?=�<P:CU��k�c�r�@�� P!r�2�~JP*<PZ��k/��-,qew%�N�p��H�jmCv�R��`��T
+���;J
�=`�g��m{˂
�zrwݩJG%��F�Vb�hC���[AiKZ'�S
�i�UjY^�O�W�%�-=-^�?�$΅J�i|*
�]GwA��T�Gr4�
+� ��&!�	��Ԫ�QS�Q���u��V2J��N��+��Nn��I�з���r���ZPڲ�cW�1�>r����1rΰLQVE��{�eJ %8��^ajӗ��I��Sx"Rx�0l
�\����o��,-MҸ�x���e���P��Jf���&mc������&��v�6B�:E׹Hya�

UV�Բ���҃]��6x�C�.��^�΅J�i|R*=�
�8�sU�
Z�<�ABȊ]#l�Iv3Ui;�TY����U�p�A̸�vCκ-�I��T��|n
0���Ϥ�Mi�*�U	��\*p�,��8LX�b�R��%��PZ�Rtm��R8C
+�J���n�k��?���
��\��d�
+������E���[�Ң�HA)����5��	��P��B�ִNz8CYaiL�OnW�B�/D��M���^Tq�0�%�E)SQ����:E���J�YD{d�̊4Oy��mJJ�A�0�RiK�K��`���Kd=��zk��8
���Д4�UeB#��P���(��fK�u�ݩNv�dU��lQ�� V���ei�=v:?�ķ��o�^�k1�bI�fU��(���hToiS�
J^,�(��aI�Z��"�}zheY:zʒ��֏o	L�Om��B%�4�
�
Q��źQ�1G�jґ�A�dU�gR��r�;��N�b�p;�]T�k)k
�@�VFG
䣒=
�X�
0w�ѩK.�
(��*ݎ�"w�` �x�"�v���i9���P�xYO����)
^��
+�e
+ǫ�%'�o+K�\��u,o�}+�2�1�Z�QU9�D㬘�̓�G'��.H�R��U�D�`��e��RYZ?�92�?�Y�
����T�4�)��M�Zs"bU�s�Pu/T
���JW���,����v�R���QJn��
+q9�5�㭠��/s}�Pi����F}I��IP���/OUjU�F
�Y��q�=��@����4����s�N���y	�C
+gdwڃ]�~�ei��l��r���^�[#��(A��%At�t��D��h�hu�SD:5�
+Qj*������a�,m��:
�I�\��%�4��VRI�$Y$dEr��	gQ��9��� �2����eH�aT1�
x��a�L����vx�$��iL��*y����\�'Ai����t�v
+IxoxVp�8IH�
��'��b8/��,���
�dwHU��T�ͥ�kj8�Q��`�����02?����=�����Jf�%ѐ#8
2-Z�E���w�I��.�6K�NL����3����Z�
�f��9�����>���K��I2�,�
��9��8�\UZO���ZJc��,����nK�u���ZNOC��;�a,{{����IƸg�<=m�*
$��"�r��G9MB�h���Ai��oW�݅�'�Xx}E
+�uY:��$��
��a�0�L�`{~ц(aV���~
Ѡ�������t�i,Q��{�Tj��P�a(=8e���eɕ�L�Piv_�J���G�ݛ�@)���U���
�8�
Q�f��ҹ�D�(������쪠��ī��oCZ�:֭���,�{���8F�%��
�Z��Ԕ
kT�͉)���ǔ�G*u���=��i�p�
���>���B�x��l[�,����hw�����
����<U��$���o���[��]t����
��Rz�� ���TY2�jSYڄ���9|�J�i|*�>)����ew��"�I"��1(*Q�9�U� �����"w����-�@�~�]n�������r������^�J�����DN[�F*ȑ�>J�vG/n��![�(s�dvfY�����_��E餪4%����D�]Ǧ���m
���g��t����*��
�CRRY�
����ei,�9��r���4>?�
I%��MҺA�)���QeI�7ȀI����<�<ZF�%�
�.�c�Ә��.�X�s�� [...]
+JfY���w;�i7�%�jg�҅Js��T2q�76I\
G)����U	�lv�*��J/���N�1����itj�[�r}��0���������|Eiv�~�=]�^Y��&	S��
ϯ�Eb��}�u�r���v}��wX��+�f
�P�ʾ,u
eiu�j&m���Q���*UT�D�M�HѸ�=����Pj�s`I��0.)=�}z&s�
���I�v�n�A�˅J����T��X�^�V�$/���9�{�d����3*m�����,�id�3&
!��E{C�3P���Tz�>f:�I�י�~q�S��T%��+xfq���!�� ��Sx$"��Q�j�,
�R����I���/���%Z�*Y���D�3`�҃(�H5�F��E_���t2J�F$W�
��.�~)I�$��8a�$h�QR
+ԧ�p��Hh�όH[����c�Lvי(����Oѻ��
+�0pmZEj��L�E_���� R��)�k4�#�a}�_�B�J
�[�X��J)�.Ns����ڕ�]�6��A�l�\��_>8���8|�WƩJU����8� um�o����`
+7�C�V�z�,eNY�q�(vTY��c�t4��7�'J�n�W��~�2���E�N㤇|�z�C^hF�e��ӞV����
�=\�?��<E��9
D��$e!��8�}
�)��m����ʕ�R��
+��C[��ڠ�I�JZ��q
p��-��;dI���8�����*a3UU�QUZ���y�-�a���n�Jʖ�{���WB����PY*4��
�n�wF�����
Q❢��F	)�*�qI�����h
�LzX��[��
^��^�y���4�ޕ�t]iW+N�/�!dYP��J��E �F!�[���4��i���PL��+%�J��C�Ra���+y��K�-�_
�V
?<��]S1ݹU)�2��������|S�qU��Τp�;�+\��$v�w�wo���ʦ�,Hg�u�x���`U��h�yLz؏�%�i3����N{���J#��	����(
+ا
��=�Cl"�WZ6��S��t���3#��ɕ��L=Wz�������m��H��tp��|��Y�|�*��!�/AUZ��ovޝ�}��z�?ߤ�^^P�6�,%NY����t���D	[���J��~{;Ѽ���,%�LY�RYzm�җ��1����ÕF�q��4�__+Ǖ��X� ��q2ч�@IH�jߜu;ON�Y[�
�ɨ)Ep�2t%�
ߕ7m����
G�|���
�GbX����^0�Jpi�
��ڕl�U���땥��p�k�n��
��%=�/�y_zC��0Jl��*���MU����t�$���,K�W�xS�L�{;��^�y���4�ڕ<R~hEɕ�
���K�qs���)��̈�e�b
r�
�O
+��0{�+����q�+u�v�'M�-�ui' �/��R�.�*%X�[��3n÷�y��}�_M
+We)픥<��+/��+y�X�x��Di�WUi
mָ����ۛ����%ޔ�1[�+�Ū�u}h�nlKW�����M���
�9� 4�xR4��
#&���x���3ϕjG�P��c���
W��m�'
��a���S��^ 
+ }U��ݩJ'����}-�^\>L�,1*KIlpWhܵo0J��D�]œ�Zo�GY`�H1J��V�V��v�[���/K�S� HH��AQ�,MY2��C�9���+�L�Ǹ�M�U]ow%��Tg�	�T`�6j� �=
w���3ǕJ�Jk�
��;�@wIW��K'@o�T/�"�p�U%.N;�T%�osp��W�^��AY��,Ew� �����-�Spml�GB���E�8d��J��A�%�$b҃Jr&+4&�f՗�Wy
�42�{w%OPEJ�sy��A0O�:�s ���C�it����_��Е�J�X�l-(���J0V�R��xӈ_����2�#M6�f�
��9|#��ݑ��)^�`�*

�w<�K��۳'S�6�,� �"
�d�n8J�j��D	&��J��Jlê4�

+3,�T��T�RA�Q�9�!�9��
+�ÕF��\�]:+(�>��B[
+�=�3p�Ig�Ε�|���@\��i�EfE���a^T!�LWM܃�1���;k�K�r1wӰ�T�S at u��}�_nYZĂ�1�.��]�\�~�M숈��v�{�]���--y+JlR7J
U��䔥]� �I
�@p�\qr��i��UYz���4��
v������K,Lp�r�d�g�b�\9͇z
�J��?,��
���$��D^J�J�fm�
'�$Y/mJ��V���.S�p_�k
6s��Ӭ�RYzV�q�
*�D��d w_n��I 
�w��6Jp/J,�(��M�Ҵ��.���f	���4�T]��^�y���4~�+yKg� H��
1Rz��
W:[N���
+r�\	
	\	"�h��Rәlj�t�-M�+}x����
�{�&�[�nɷ!�\��
�]f�p=g܍��w��*���@�Ȁ2RG���ȼ���[�Ow�R��Dkq�{P�85Z��ժ�:�|dz���4�Օ���TG��
+�4;��A3�N�
N
�汮���`��D5��,r�:=����	���'u�֬��;0f�������2����mU�-K{]�ڸ�
�P����P���z[��F�Q�|��%�/��L�,=!&)=,!רּ�<B�d�Ы��;mg�n��ÕF�q���驗��;�
�2��
+���J�FЫ�ҳf
���uI�Y�V�B�4ݗ�|�7��eys�.J��8����^"���=4��{�W���l�.0����p�u�%����J݂�|	c��-W��LMYbX�B�$��?ӘpcPSͼ�>\id?Ε`>�t9.��H�T�qȥhv����Е@�욮4ɗ�}QϤ}W����wG$4�u�	 zi |�}U�D]����n�b%
"��\ȴ��w��E�wN!|x?>M�ؖ<� �4�0J�YE	�d(����H�AH
"(3��AД��;�ÕF�q���٠roOK'q~�H��#�8�#p�L�XW2���Jߕ2p�t�+y9��\ē�����Z���Z*�o,L�ox]�^�<�����y����`ܿ���s�wK+�� O/H$�E	ܐ�D	���N�I�BN�����:m+�;��dz�Rw��J}��,����2Q���T�R�Ǩy�+��:�q%���<w�]Ȓ�|k�R���[�5�
.*��Tl`д;f��l���ڏ�6v�
+�w
5�;
���
+*�*������~TM�%_����1���i
Q�;�N�i�j�6�ZuZ�
+�˚����tڇ+�L��\��+YTzz� ��I�*����+I
�zu\WJ��JΔNw$�
|{�ͩ�oD7� ��\�mY�p�3�[�q_g
wq�"Pp�.�>O���>��}|�
+nA7� �Ā��f%��eIwZ���&2�N����N�p��iܩ+����q%�JxW�T���JG�9ٕp
D����ݍ+��s�K<�|sZ)��-����k B&��;�0
Sj��܅q"T��K�7�����u!�-��-�P��V|�mVK\����ݯ��L{�i%{�#R�~ k괲�i�4����+��Jp�O�u�r%TT�Rl��.���]iݸ��<��Jvq�I߲�L�
+
�.�
���t[f��ۏ�Bm܅�pnjh�
�Ie�;8Y�<c��)�;Jm	�6��LX���
�4�(��NR�R�uZ�*TB�-:��kn���J#��!��f�m�(M�W'�`d��Y:~
Wҿ`�4�(z�Q�ݕ��\;i�J�Lm��
�/�����
��z�âfm�Ewq�"�
,LG��g�J�/�w����7���S���Q�p^�vZ�[��&�*۝v7�N�p��iܻ+9r�+U$W���|
r)4*��	8�z�	4��rz�T[W�
��a�}��L�ۛ]
��n����/�%�m �����_�W^MM�JU�@R"A�!Q�X��c+ݍ'���D#�b�M�
��{Ͻ*g�����o_�u-u�ƭ��Nǹ�cw����Y�UD��B��X��:WP�!�S���˱����%��s;-X%#�d��tZ��=*����Pi�5�M�=*�,X+*��9R�|�T<{��m���K%f�A4��=���d�5Tr^�/[i�&�P�Բt�t�+��q�ֵ���4���-�q���N�p<�D%��d�mM�-l�e~�
*J8�����\;�9
�&^�CQ��0̂�U���J@%���K��\��R�N	G���J�r���o�q�d�Qv��7,Y�oa�ʚ����݅�'�M��
+.ͭ�
+.�����}v��a�IY�m6l�u:m9�iae���
*͞J���q�2
R[2�� ���R)3TᬹO������Pi�S��7�
�^�Z�
C��=�
�s)��_P�v���.-�6�Cx{]�܆
��v���Pps�*�%�L�㋗��ϝ�s
�ʳ��@�-�����p��>K
�&^cvT�u�J&�����)�
��*�ΞJ��T�����A.qXxk��#_v�R���yǹ�g��bO1��!�l�T.�����w�v�u�F��p٠��zיZ(c�d:m�;m�V$^��B��f9:����J�1O*�
� C%L�B&�B�Se�WU�O��y�J��:T� us�Q��n�7��+HݢH1usL�+�p�͐��8��-~m�-B��?��Zc
�%�{?�߼��=��v��n]y(���J��Zp�=�:m�
+�b��
��
��^c�T2ˣK����	
�2�^ټ?�h�
��,UT�
��ySɔ�t�L�[���җ�9�^Km��+�pXc���kBx3���
�r�S�̎�tصM��턶�
+nE�*���i��f�-�i�n��#�Nk�B����(T:�|@��{���2��
ϭӼH%xM�!�mNT�7����J�
���K_~��
��}�[EL@��A���~����	vg�dzjdv0���kp<%ڄ*��Ш�MC��%,��h�J^WvڅJ��*�W*Y�
�(�FɎ���H���5P���2� *�A7>���WT�k��J�
���-��T�f���JA��w��hj�3�
{�~c�
�Z���Bx�Jϴ;jV�Gkv V�Z�͸( �J
����)�;�m��Ӓ��N[�N;䖃�v�����J��JSf����
+��
+> �T�j�t�i��%���7����J�ЄSJc���@%mw^�&
�O0� ��-�c��
��fWB�(3&Ê\��ɂ.��NY�ᛘ
�[�:m9�i{Tz�Y�4���Rg�Gi�D%'
fE�TR���?��(*E�̨t��)*I���
�CN�ޱ7SkL*|Q!|!<�=�.��ّ
%�.��	T2��L�$�-���z
����f�R�I�ۊ
+�#���f�b��Jv�R�iQ^�-��68�	*�ݣң�Pi�5>
��Y�j2K^�0�d�D���M�w�f�@�휩�s:u�vUie�x�4�M	�߼c�fCx��-��dؐ
�>/��P��u�J�����E��f'�+ʣ_p�=���Cf:m��;-�ZXH�i5�ކ�����J�1w*���4�J��T��o
*����4�ᏓU�P�4*9��U�[�[Y�ld�)uWT���
t��!|��
eXi�� ��)�}*�w��587^��Z�w���2�Vq��\��	uZpK�i�߀��P_~�]�d���*ݙJj���&Rɘ�B��Έ��L�v�
�5�Z�n�M���?�n�ǯNg)��(/@�	�^r��M�J�E~��MQ��l%L� �
+.PYA�^1kvaS�t����
��R_M#�ҧ҈].T�~�P�Tj�ij��Jd��B��g:u�� �^����Y��[���;�n~O)���7�$
-�^-2RI����т�WG
����A�
Ê\ʛKygL�]XC��k�d;�o at _i��wڞ]vڅJ��*]O��Y���Pi'�Y�*����Y��S�^�
����JoAR钿�UMT"��-������/��c.��
Y��(ް�$9�5&*�H��8��ɍR�O���V��q�.*��B�&Pp
RGpT�LvZ�WN��v	��C��yjYZ�4��Jo�Pw���i��J�؋���Z�f�J�8�J�������P�F�p�<J�6u�o�1��B8.��s�k�b����%���:|*���8Iuk*�I
��lk�u�J�:���\�i�Jы�d�`�`�`��8��
+l��� ��B���R�9>�*
:Ӝ
����T*�J�S�ۜ���K�U7u'�R����c���v>S�Ef�������Bl��H�����&E�7E�]�Ի�V7�[ .�c3��������G�����h�
�
+ƭ
�B��T:P��8
���_�t'*���4O�;�T�Q镦���Tb9R�{T�3p*
��݌�nPM���;���`p,͘)�V��[�������Nͱ:9��Am
̍�
@��Fu�,Z1�u�l�TT�P�V�8"��np?��5�N߇��`��Pi�5>�N#��r�;���R�
N����s�T:*��n�Rw���
}=�J��@V�6�7YSInr��~^����گQ�����a`*��@�j`Vuw�����*}e�pQ�ob.R �(k^Y�I*���B���/T���u��4XaL��+���;?�J8Β;TgT��퇟���[��}PTzu�t�=���i*���88���H�I@%p��M
	���>|j�����4�
+�EP8+r��M"G
�MM��sʰ����r�i���՝v�R��
��@�7I%�
鎨����J�zFT�nz�j?��
�1u��oݣ��6�!�%0�l�6�B:����_�C��J�EMVdz"gi
w[	TG5*y���H�����
��u;�i��.T��~�ҿ�҈[**UD��r8
.T�O�J#��6��{��o��ԃ�n�&F
�J��R
��
�J��ԍl.���=�KR)VT�zV�oj�F
�
�%�U�i��6�8]*]��c�B��ט3��3��fAM�u&�`cu�ir��G*�3�o^�&*�3u{G_�
\��|Ⱦ1�dT���@&�wu�
��_�қC����c���D�`uTz�l�c��X�c)uZɤ�u�v�����B��Q�%*Q���J
n�*9nit7=̅J���'x���}��<���F*��2�D�:c���"-���
lNNR��N����uT:��*E%��FTZi����>�853&+0p
�Rox68�r����VS��2�
+��J�����T*
���s�K�z��/*��T2uN���D��Sw����!
���cP)�E�n!sC%wr�

�N�J
qW9,'P�#�j�-;̍J��W�J��RۚN�P�?�����zKn�V� 앟�xـ��*K %�@��d{\��dtWH�
���T%��@�����T�B��Ϩ4q�����L_�e���[4� [...]
U�ލ�P�i<X�����T�J�k�JG�*u��(�R�tJT�ө�U��2ބ��Ԥ�Ԥ3*ea��:�NvNc�e�ÈPi�U#U�C��Ui�$�%��ׄJΓ�źu
��Z8*�R�I^�ը1*����A
UzNV%k��V$z��7-ﰕQ��i�JT�䌜/��

U�ލ�Q��R	��p��*���W�*�OT��Ɯ[w�*K%�n�Q�Ψt�<����
*����5p�IGK�R��J0r@%9$*͌
Tɭ��Q���T�*T�B�]%*Tj�g	�vg*E;�ܒk
UZ)�JB�J�Q��{*�&��^�$�lj�As��1=���!�J��P�q�5�=�tq����5ބJ���*9�G��z�J�M��P�݂Jr�K��
v ��߳H��R���7G��(']ԩ�9�+m�ܑ�<�^P����
U��J��A�.���,����*e�t�*�Ti
�Tj@�Z�����1��W6�R��J����ia���U:߳@�~�*-?!s*=[��i��\�T*�J��Q��ޯ��6T��TbZ�B���ƨt<��T	\��(�l�Jeܩ��<��Q	�
�09pF��Q�P�~�*�M����ߩ�*��;"U��7��zƨ�ӛR�G�D��[S�sj*'�qU��J�S�*M�a�{T�U��g�J�W��٠J�Wi��J��JW��S�D��J�9jjT"i���*�R%T���A��=
����һVo5ޫ���VI-U�X�Q��o�Rg�4��R�T�*�"NM��9�J�{���Q���Da�۲1*�kTi�>L%r�*��U�y�J��U*�J��IAN��V�Urk�{T�*�]K�J��R�*��4�R��T��45
SX�V�Dm����T�~�*}�J�C�i�`#is���4U�W%3�P�T��Pi�*M�Y�f�G�>H��T��R�F��
UB�nI�
U�C��N��ҠTj`�s�*O%�t����=U�B*婩�~��J4i��ަR����P%T [...]
�uj*�9��[]|�
�k-�~�Jn�~�*�S���TT��%��T��VU���V��Qi�*���R�U��Q)��TNg*�I
*e���j�{T��Tz]��U�\oW�*�?�M��<ʥ�Ү�´sU:ģ��ZP�gK%1�Jj���ɩĴJ�R�	����P%k�5�=�t}�Χ%�t^�
�)���1����[t�)�DG%1�@%}���*��R���Q��h�*�!�����f�G�P��U�u���g��?��s�ߤ�d$i��iG�
|+�]'�wOI%k�5*���ur:�2��
�	Fk-��P�P�~�*}�J�����i�
����tP�<(���7������
���ǮRh�m	֫�T��z*�#U��,P�ߣJWVi�*-�)���*
-�ԛ��o�Z��X��I��J���ߤ
;�Ӧ��r�*�ݑ�J��;ro�Jn�~�*]O��T�P�K5^�/�4�J%Vw\%8&[8&8&
y,�B�S�*��y�w�y��
ר��T
+��bM�͉w�D�~��J;k��Ҹg���
U�X����Z��{L�8&�Ԓ�R�%�
e9�
+s�xڝ�t�۾J
���T*,���U:y9�[Րtي����Q.rb��)Tif7nR�Uz_U��uL�J�h�R�U�7m��2����K����~�;�ʩi��v�J���$��i�-4onFxw�	�T����9AR�Vi�('��W��J�ՇT:X*5��[k�Jr��J-�
���˨P�oO�H�Sj�
�
�k�M�4vdz}g�Q�RR)��DN��xN��It����lN���������c"V�G���4�*���;j�J�$URM���4k�4���v,�i7��/O��Q��k�(���*�R��"'��eB*5�^�Tn�u��� ��Q��<���Pi華�r�R�v�Z�
UB�>��Uz6*
R��:Ms�ё8��
+Ӝv��15�,Z����&xsg�zCɺ#�{�eh&�;'�JB!�r[���n찹�~G��KP%�d_���䪁���UB��]a�^m���i8+b�Y�*�8�*�RI6w'߸Vs��
�p�ΌJ�=bL�ͩ��H^<ʜj�������ܜ ��T�#�L7���}�J[Tir���Ǘ���>�
K%u�k�F�b�����*�9=^��pv��I^�iw|�U%��O��*����Dr���Ԩ��.a��)��9�����6�.���9up09
MN��J���V�`3H���[��n�*�)̻[S)�4�gM�G]��_��0�T*ST�dO�5i�i���n�4��=�zhoP�*�v�.�9�ek9�"�:9���8<���' ܧ���
�9f*U_����Q��cUz5*�A�^�D
�*-
��;�tT�Y����r��9��cy$J�UJ*�ua��q�
Դ{�h�M�d^��*5��-�rW6���;��J���>�8��8�
켜~���2�q[W�h����+�-O
\�a0��FR�-��
d軋����:�m�.p��P�YkUy�S7��[)��O+}��Vڷ��)+�����ywCV:8]�z�X���4Niz	�l��%�$g��Q��/܅��_�v"�WA�6HϾd�]�_r���lh?ZI����$i�lcۣ���߽�p͍Z
�Ȑ���9��6�VV�a��Z��VR���

�x�҄0��	+�)+�Ꚛ���w����
���4Vzw���Z�\O?d\@��� ��y�%{A�ֆ۳���:���҆�Rw�ڣ�+=��Q�QNH
+���j���}��=h%"�H��w�{c��R�!+
(�jL���t<̻�J��OOd��������q̩�VYP���Si�:�z����m������ܗ�{�x��~
D]c%D��nl�񞡻���W�E�ެdN)�D�r*Gr�y����VJ�����
F��bLU��E��2[�ü�}+)�5V��&ŞpU�9���ZIӎ�ԇ)gi���$�=ڽ]�v�V�ѳR����Td%���p3��2�7�NN	rb���	��?�39��g���߷���d�LP)f+M	���d�-��ح���G���儊I��t��	Y�
�{g��p��
���2a��C�iw�JvÕ�MVµ1K��4�#0� �AV
+����%Z9ᒉ[�X�΢$a�AZ����ә;����~[���Tf��R}+�
�R����V��?b�n��d���
�CIPi?�n��ۙ��hd�v�
��
�~\�v6\m%��bSʋ<-�
y�
w�a�῕\�Dh1�a[J�4wr���
毕�q+U��R����DVz��4[���ױJ�����8���`�%��Jw�c.����ʡ��7�+�j�>���ËZ�7K��
��ǎ��p���R����
�^��_�L|��A�6bc�����̩�9
楧V�k����V⧴�']f������j\R7�������f+M���d�{㕮�P�
+��
��
�Ƈ�J�u��Yi�X�7����[7�/�
�v�~�E��p�����`�gc%�E'��@r����o�99=�!�X=ƴ�ʜ؆'Q���plNOO����9���w+�<Nc~q+�FꏕP��J�a�ݒ�:��E��Ү��A�rQ��8؍y��K��Z�ޭ�]��N�԰X`�p�G��8K�����0�Y��p���=
��i!q�rb!�2媿r�%���LN
p��J���D�1"s⎕�Oe%j������Jِ�������l%Rt(f+���&��e%Yj=v�A"�
��`�[j�R��Jͷ�Kڽ?�v�1�jh�`4���-����O+5�]de.0}���f��l�U��6���ΈN;'j/���C�̉
�����9�Sߨ�Re%�X)9��t�'[���V�g+��yw
V����������嶂�T�S�S�C�5���u�n/ �:��z�[�
m�i,�":7�J/Shw����e
R��"S�D��ɩ
7XQ�,��l������jx#q	/!�R�TI�׽��dN�L�۫$q�J�c%��l�J�8�OX�� �$��XIX+mOl��q+���r�V�]�Sj��Xp�ی��뱻u�����~Ǻ
�
���=����Y����oi%��V�Ihm�Q�7�pj���wo�� ��.72�G�W@�ŠV�MtXUo��#9�Jx�s�J;k�∕

��k%`���i��XIB�g���Jc?�n+
�{�Ե3��5�
���!+�ְ���g�k��b�v�E��h�wlڰ�UiRn����YBYi�6%|R���p� j�%�=����r����I�(9q��K� w�~Y�Yo��J刕�FS:x�ѿ�Z)�V�X�n��T㠕�A+}��4����R���Z��@\�o��F\���:��(5���X��7+B����;��
���a+=�ni�n
&<[
����|�CK�91�BH�l/�D�Ӯ��[7�_~[�v���q*��J��
V������V��
G���z�����yw�V�m���z�.�؝
�������q��K�%�.���v�/y�3�{��v��
�p�m��
7��ȂHn����{��,q8'��
3����n��~^����J9Y	���J+X)ٰsZ��
+�o0|�`�CV��$��ܱҢe%���J�ܼ�������O�/��i���<cI�� �z3x�v�9��=���4�Wj��n���p?{��67Ѵ�l�KҒIZf�Ҽ�h��*j���^Ω9�C_c���V*����J{�J���҃k%���J\�Vҿc�iXG����J�a�݄����ߜZ+a��d��L���
۱�?��Ns-C;ni��4���Glh����桕�#��pi GW6n��6�˺�Ss.B�%i��V����n
+�Զ�
�ɩW�s��V�*+�����s[	S���Bi%<�����V����4[Ɍݻ��{���B�ݕ��\�8�2��v
�cE�ެdj݅�K�]��������Y��UpW�!7ܕ`���s���
[&L���0N�sr^r72��&�����JO
+��R�u�T���V���Z�5�
���J:�ӰN�6�Vb�J��l�џ܈��;Vjj���
��� *�-�\�4�ҡ}n�.������d*�=IڽzF�aص7\tH);���+���nI�fxýhj�5�JKͅ���M�9>��.EKOs��󠕈Ƒ�R`���m%�
��?�CyN+�(�X���t�{��J�?v

b�28����k
�N.�T�����+�]��s�
�U״�:נޢ���6��6�h��"/3Zh�Gjܼti9
�';ӬTPJNN±Ҫg�q����w��)f��I+m
+����&b�hYi=[�x��'�m�7�o����A��7,
+�jsm��I<�q?[��h�hi�"����R�v}+�,Q�
7?��C�Sso�]iCZies!)������~_�t��lC�J���J,�ͥ��p+i�'D1
��J���4h�蠕>�V�ɕ[�
[�ѱ{+ץ<�qN>Um c7����ZǽR�vKI;��R
s�^��
�J��Μ���7��J6\��Jk`��(�C<ǥ���
9}�
ܜ�|�J;�Z���AZ�!q���ZI/�
V����8��.ʆb�R�X	e at -��
�f+
��V��
�;�8'�n�X�i) �3��v��
+p���ȥ�f�C� !D����^�N��M���ݑ
��؆�!��Jm�
O6\�;ݕ�z+��A� �
7Oc�4��eN���ƺ�g�Jo��hz(�N
��!@�_����}+�1-a%Qm���Xݶ��úc�m��J��l~r�V���;�+2�8Y�Z�ע�=8?��^HF���u�md	�o~��O��� �����Ëd�N�{
��r�7�2
^q�b#RT��WU�xg��8�@w^�i��&ڙ��vv����
w�
4�Gj�&Kܯ!Kؿ�Ω�ѣb�oY[q�aS,�U�nG�U��[ە~8�"W2(��
+���+
�L����z
E�fWJɕ�J{Y
�tj�Ҵ�vٕ��+�%W�ɕ
<�~ό��+u���]ɍs
8�K�si2���
��6&��ۏ����������>�D;J��|�q�Gk�Z�
+hW]W7�]&��I$

w���o`WZÚ
�6+I[��`�_�ө`���6K�ҟ1�TW�1��/i믹ҙ]�E�PO:
"�b���jЄ���0•ʕ�8ss��ˬo�|�����p4�#��@\"	p�L�b}�s.�u�5�$�lg�
��D���� ۇx}�������$~T9h��
7#��P�XMõ�@U�s��f^J���J[�e������]�;m�ĮT0��( NI[��xK熴.й?
�o6�ThW�
+VM�BZ�r`�'�7�W\i縒����-�ƕ�c��
���}F���L�B>.k�sٯc6F��[M;��Q"
�(�?1�Y�?��^�
��6�J�$��/�@<FJ�_1�����ߦIsnTZ�V
j�p����J[}�+�~[kґ���d�C�IUi�+=F�����]�����q%�d�Õ@u�OZ��C�JW
+b�+�ٕ>�)\IaF�_�J_o��w��t%+v�tb�w���	1j���m�-oK����S�{`�I�
�T�nϜX%��ᾴ�4
�y��L������ᡪ�P���1�;I
�V�M
X[\�f�ӟ�5��֞lW�U�	�L�i
�D�6�%�@�I���0���w���J[��5Z�_S��-WzWLk���
�TR["WJ��͕..Ӻ峻R8�;�9}\
�!�Հ�_�X��Ѵ���hm���(��2�cR!iG��M����Rg���l�*�G�;/����nG�XxM���4TiUi3?�['���k�j�f�Z�4ݙ:]��+��5Qxx�E�%��(Nw��ծT�X�lpC��2�abbC��y�r%�i����J�z�+mn�4|�'t�V�n��y7 �����ni[�_E`E�M�(��h�(F�^Y^���d8�f��n%���K����d	j��=����Ҝ_f��"�@�E�z��k�5�)�D��_U2�\���J�e��]�>܄�� �T�+aإTT�'�r�тr��m�8���J�.1�ҷ�+��\��M�s�]�ep�\Ǫ�eh'ia��v��A�ԦݞV��d��W?�Z
7㆛��
�S��$��f���[����J���"�ߡ-/U�6W��$�UҚiO<�J���JzKK+�U\	,��j���JְUR�-�%4�=c�}�+�R����J��Jt\��I�\����Ւ����q%
��ڀ��t^YY�_��J�� ��
�vY���$�iw<�NGC��պ��q-�#rn�yA*)�p�=<h��H#���.�%�v��TW���R ��ʺ�֨����{�IW�ܰ��q&IZ$.��ZR�e֎.
��2���SI�L	 ���1�%����q��I���%W:
�2�}�<�2�Af
W
+�cts��;��JsĹ
�T�;���>k�NL��ulJ_�*U�{дñ	��%o,/�����C������DB1<�+��,ai����e���vUh�]ʤ�����*�
࡬W�'&xw�s�R����`m��U�+�~Ų�a�׏s����=*W�Y#�E&  ����*����M�
�J�L&��Ԯ�6\I��͕�[�w��t�V�oǕ���*�щa�e8*Kb]e�~�6�"�]�hƪ(�=K�:��]�ή������*9U
!�e"�,�B_��"޷ud	�gݛJ�Q�AU�Jd>��,jVڞ ?��N�Qv
�[i+W�X�D::ą �AX�J*��c�����VdЄG�N�
A��]�t�ѕ
ejW:U�$Ӭӕ@��+
޲�+� �Ƴz ��	����T�">2� \{O��kU� �/,-NI��0s�q����v66�)���7�c�pY&e��D�H�	��*�RkO&<��*q|O�Si��J;qO�
iœ�%>�2�ꉗT�,Έŏ�/�J�G��
�P'W�&0k
�HGK�M�E˕�lW*�i|Z���J�w����QNϼہ� NM��उt�#�%��%�%�L��R���1
�8��4���kʃ������O�y�p������9�� �]�mY(��ί����J$+� ��8U�6oTZ��=�v��&�ӕ*mY�ᤛ�e��".��.[�
��X��~h=��2�Q�a�6�æ��	�4�k���&=�+9T���#���͕zo߲�+�&�ּ[��
p�KqȀ�CO�p������;��nG�CQ�C�)_�i�bI�>�]i�-�n�'K |
�'9�
:!�(K;
+qU��.[��om����ȶ��� J�!���Ҟf�;y���[��<��%--j�jI�X�=���Sr�W���Ѕ9o�=n�0�#@ |�R�(B�P?� �z�"�Q��zRQ��J��?��J�-˹��M��[�+ �����e��)K�+t��
�)���X�����
�9h7a[c7ri�	�d�u�
+�,�2��S�6
�%wM=U)���P�J�w*m
�S�Ա���k��.���ʕ��o�
-�bHɁ�
�H�sSV�s��Hk�J�
+0��ږ�C�p%�' 5�� �G���#�J�z
VC��+��\����\i$�o�2�G���3�.*0�S���%�
�Ȯ�$��\�šv*�ӕ�]S׳�
���p�h��ߒP2�Љ�$���,IS��X���{�TE�IPj!+UiTi�g���MtyR�1
<�y�[��_̞��+qSB3��BS3a*��Vn�0��=��&Y����*0�T�E��a���q�g���R^��Ю���|����-
���M�]S:-�=7eͲ�,�x�n.I_w5�
+M�h�UUJ��]N�;
N�ڍ7���Գ�V
�,q�P��j�pY���FYZ4K8?HI�	�*��
]�Pi��dJ�*�(T�W�%u���%Y��|��BW�� f�u�T�*�ӕ���5�2@�KC�jx���
s�>)��ǵەTk{9A�Ҹ���:]��f�qn�4�w���tYJ�,!��Qc_*w����jUͪ����yE�R����.M�oW�׈����B�%��:M�N�)o�7��Wq>/��暪� ZU)��$U�U��U�={��[��6�4_��ʕXX�=@W2��"W:+U
,���>Y�eA��B�Ki�2�K(F
;
�s�:]�	�����	
+�DG��R�5����R�-K�R����'�
�j���AE��FY�R�,-lK���
�}GU
+UU��T*���m�?�ն���p���
~:Q�8�9�'4NY�%l�Y�]eJ��`W%�*���L߯��m5��Ր�ȕ�q��
fڕhGt�
�g3x/��ܦ�����r�^d`�6”,h��g��v7� �����)|�+_�
��3)Y�za$qb��=CrN<ɖ�
	�`�9P�t�W1����Ŕ�B
�S�
�� ̥�Q�R�sqL�*��T�����#��TrE�H0-��epo���eh��,a�w�O��MSI=[A���{&���ZU���$���v�_r;�`�o̽�>��j�b��4B2�,Iߒ%��c�Cx at U*ͪ�t:��|�Қꌯ���	���a�]�Y{>�b�^�
��pc��f�U�J%��i! �-,��R����/��V��~[��R�@m)�s@:�T�:㓸��Tyd�T�����fp��

����*K�(K�r����<�>�

WR�T�|�J�R�v�\�N#Ui%�����ܛ�S,�hQ�M�w�5Ee�%$3��i��h�N:<�
\����U�>�R1<�/�so3
V�~n��]"�t*�X�T��Z:$YI7kh���$5
�L�rZDe�<�@�Z�e�fZ���]+��өK%k'V���JrtW[1�R	�*:cpO�	5�Gn�J
Ln��֌|�� �]������R�!w[
+ɏ��
#8m_ľ�*�B����
J�E�c�E7Y�,��KW���,�AR�,1K��:�L�h�`0X(8
�}�x�dU��ҪC_�ՒX�S���N"�Z�,9(	�h����
�'���
L��"��H+����륒4���PtSa/iN�D�D����J��l�J��t��W��~���Բ�ʲ���ܝ2w��l
K�*������Rp�LT�R�J��vs>�ʥ�w�9Y�U-KǑ�����,�����
+������<��R��p��Kua�U>�XN�4��/�Oq��k�J��A��*c�=��$4R���	iF~������b�������ґ�l�|{xڭaa�<}��nS?��M%{)��B�������CwI賓?r�T�9}mt�[uΙ��%��,�\��n��&��C{�!�pq��`u^
��]��Ϊ�nwQUZ�I�\�~��hK�h��Eõ�R�����X�D�m,i�Di���1<d
���*5&<t�4��r�t��<R>�TZњ?eH%��	�';�Z帣EXE~
�
�l���ei�{��w4�g���$���b`+�*Y��b'� &L�S���
�R)��Ҥ��#7N�u>�m̲�^<S��,ah�*w���6��#e(a�����@�H�dq
+�����4�Lr)g ��KS��.K�vY��g�~F0�n"��C�F
�~��<$
`1r��*��Ui�隹#I�A�5�4�J(K/�4jX ��ǤO�T�?}C*
���t�)")Nsv0ug魎j�H�S�SxK���<�z�J��/�����mS�J�餭̂��Їn�R�j�,i������p��mbI=P\�
���S?���K ���U�^/t;-^\��p�e������p�/jY�~[�%�I��0�,1��7���D�t����<s����0T���R];]!W&)����:���D�J�=R����@�(/ُ�%�<Ǧ��Ҹ.#Ǐ~M��9�s�"	�*N�U���ݸ[�ҕa/����K3u��a��=��T��.���P<�:3��7,
�`p
K���t$���S����A��f���۳U,��=�F���c?,	9��骴��h���[��Ri��v�җ%Ly�>D#��E+o*���J6<�.x��������إ���%�Q��Fz*ɽju;k�,��zq�~
B
	
�!��2�CG�&
}G��
@D�Z�\�<o\��L%�-�t+��UR����g3L=�wt�Si�mS�_
+��d2<nf���y7
�*KU���9���OB_p��'�n�XR�C�GpȄ?Y^Fȥ4��dV�7m���;_9?���s�������/��,!��z)�KF�E>�x*D���i�\]�G��2��{���j
�Z�
��uz7>�n�"����L��j*1�`C�e��A��!f`m֦���:�*y5��

�!
����8����!�^;s��ȥC��J��!p4�2�
�4��-SI���Lr@��K���Q�������Џsܝ� ���`�6�%����A��K

�</�(��2K	�V��h7TS2�]j
�4~��̲t���^����D��g��:��7�%K'��
�$�ᑥ

�MSErG��K#��X#�%�����;�%�
-U��yQ��@U�s��QY܇�N��JO��c���Ӽ$��s.IGo_5V[i�K��_͹DC(9���/�v��T�xd�T�X����K��.�uCY깛և�D}	��4}���O�.-�P��+�G/�s(y�@p�
ܮ�py��*��e�h�U`�TZQ�j�\�N�qH��%ܢ]S3['���S�-J�K��1�ߨ
��=A#���>�\�T�M@ݏ��zm��P���Ҙ�l�92�eei�;bꏼ��_AD�H����y�b-�q�*��)Hs�C o�[*��R)�A��Z*��Si���J��h�{�er3�4U�ZY�T�aoX!L�ȮH	�%�!�>y�
'
��e5�-tjjHu<�Lx������T��J.�E��a(�
`<C0Y�w�q,Y�]O3['%�v���0fx�AB$����M��IE'E##��`۫����	��g
ā<U�Dz�О��>�4k���w�}�:?0���PN��sb Z�㷦�����~�\�[�X�˘AR�5�)�T��S�?�J�Pz�?_�%e{�����.O�Bq��R�R�M,iG<����#xǵ�F�#��l�*-��v(ّd�Z=���JSe�X�9�0�7�D�WE��$�
�=��]M�GJ���V?��&�'E	��r�<R���9xX1>e���4�ٖl�$�R�O%�^*�v*��м* ГE�˒�
������X��YL
�$ f���ڛ:��v����糘��<�@�
ڥ�(G@�s_vu��=��G�H�G��ۣ�\��6
��I�%�}����Qg�KI�X�G�KW�%��lvj(=�!�&
�'�������U�S��R�G��nYX"Ks�X�D'�3���6K8u
+�FK�S.eP�>���7T%c�D
+�5|\��k�:��:�Z+���ܒ��8�
�����($��&����������#����H�Q�d_A���_
+¿��ĆΩ�v���)�!��=�8�E�
+�%غH%Y�\����#�K��c���t*խ���$�g{ڕIF��e ���?�B��ϛĒ�;
:��D{�Q(ya쉞X��nr�KǃX>��������
�䨴6;h���O�W�]e��˒Ȥ��i�
��,��V>]��u
+FmQ�L�p�����l|:����$=��ei�'M�LG~�D��R5’�	C�$5ق��,KO�e�u���%
�dU
+@���%��u�'
��b/��X� �3��b{zOG*�*J%x�=�f6k�T23�o�c��b���Q�T�>��MlW�U!�|���
�dZ�����2�'g(p0�o`yvU���YJ)���کXZp�%�DYz�e	ˊ��hq�h�����7Kߠ�!��)�?�e��6�E�?���+�� 
���P��"5ږ�����}jbU�JIw�B
�bX�g��F�)-�k������i�*9s��Q0��s����f0����
+�͚v��h:PY��0�e���,�B�X��:p��*E�J	� ����W��H0�_{�'�Z�:+Y�{*q0#P�����K��
w*Y����+v�IN��4K��Ӳd�nֵ%^�<-�d�UQ�(,��K���}t�N@��.I��
+��k1�OL�@}���.��K%whCYR��ٴ|n�z4�����q,afO�-}���A
�dmI�X���]�I���<U
+ at II_z��k5aBV$�����5y��B�a6B,Y�c�wk��?JE%U�i
g�q���̫����Z���w�J#�8��hW��.� 3�b����N�?�J�
����I�ν���MXBƕ9+0�
oQNe��w�%_�}���LRa�$��ו%˒C	��+�H;��
�� ^۹i�RHi�N;�Jd�w����͖w�5�Vchi#�DF��mIci�K3f��3'�h�т|�������H*�P��^>,���G>dk�L��a4(
X'�
�R<�%/�|���Te��JK�J
�@J�
�Ə�6���^
�u�#�4�EQ������: ��m	Y�T֙~�S���_M�P�s���4K����<���v5Z7g��2�,,��\r@C�ɘPz]R�*@)��
��cD
3�pgV�>�Ƈ�J
+D!�5�t,���9��Ǟ�����C�z,af�K|��s�P�M�2Z����Z��p=���^��~�f��1&C���ˋ�	w�dg�rY���

��,�M
Y��WW��X3	-C臏"��*E�*�hlh�
�t&��N�5�����#
�N��
�2��PkV�,ZT��N���b*]*vV��So2�.Ȓ�ݴB����
��o�D
�֤q.���
+,=I,	]r3n�ܯ2����D]�\%%T�/l��
+�WogT��yi�i#�v$��C;C�.��\�d�`4���U
ah,6��*�|.�e��ҫ6ڔ-��*a��
�a:�<P2�d�Im�,٦��#wj�k
iB���Ր�[Uf$Kϑ�xa,yo=����P%~�5:[�d� T)�4o�<�Z��w{1�<���E:? ��8�z�2��I^��+R[�R�W.P��<*������'�n{yB��7�]���V�Rז�
�
�TK���>�\����<��*
��k#8������2#(1��f-����ʹ;:�4M7�+�*yeIbI
��(�oh+�
KC�}p�9gR�� LI�7Z���k�
:��uy��HT�cB���{��4,���Z�pY��
RͶ�ӦreiA�D���٢p�
~"��'
���JyR�(�R��?�=���G�1]͵E} "S�1��w5��W�AO���pS���N%�Wn�R;�J
+J>U��hv�
�\rhl�� K�����5H�
+6R�J8&�T.�&5}�Ɍu�7���:�rv
J���x��W����J(ݨ�����lxӠ,ɽ�,CKVA,�Êk��ڲ�%�0甒����2i��5��î7�c?���2�y�N�r��ӭ*#dQ�D���H۠3]�D#YX�\��-�`&,-<X:���{%R��R��T��*Q�W��\ڪ�z3O|d��T2��7#�"��^U�TQ�*3�w*�YT���:
I=�<X�-�g�R߻i��܈���%�Td"�8��%3�D��ܭd���u���dB�UA	��Uueծ�x4 �p�?'��P��^�d���.�?�]�:���Ck0�̇���{���|����P
�Wa��6ږ����}����]�Ҝ�p6�t/�N�%Kci�,��9��|�*+׉a6�%Ka�9����ȕ˄R�:�~�T)+�؏��H�c�Ⱦfյ@|]9��,J*a�]ˑ
(�f�w*��T���t
�-�D�N6�X�����wo�
�]�nC{��k�߉��X*^���m��%~�����a-
�tQ��bmJ
�TT9� ��`�
+��
+�������
U��5'�>x�d�o���?04�Kl��C�L,�bf���U�q���11��2�hy at J(���G��< E�P�I��
+bi*��TV���L��vm�KY��<���+b��ycbi�K7���T~��3�<ΠJ���T�*5�P��Z�7�������G���1`��̪���SF�H�^�)u���/�{x��戮�J&��Vg`ɓx7��y'O�XZo;|�*!�Z�Q��$*�	�V��
.)]�\�
r�z4�nAA�E�C�ՂR
+(�,����J������o	B�b����
G���
���]�5���U��%�)ng��Ҕz�.U

Q�j�˔&(Um%�v-��`�|U�-�ئ�w�����<*�0TVl������)K���U���4n
���>� �p�1��*��*���n��u8��4.���&:=�TEz�TB��	KWm-<z��Tґ~�S�7R�=g�L&y{ݸ^sS�>P��Ⴤ�0����
+X��[���6�f���a��W
��f(�<��ꢔP".]��Ui%I'-�,Y��@%sh���w�{�Fj
�*�̫27�Tf6gd�
QP� �T@)�Y�7�Ѯ����~Fk��͔��P�~
J�K�d��v�,�:H[вTIYJ��,�\P���f���U
��	�E����ft�P��j����3��T*�
&��@L&5�ï[DhA��לJ����J
+��[�ov����bi�+d�nG�N}��Kx�:|t�I,5u�g�%4�>�x��].MӃFR�$ٿ)��8�dbρ֎s	���+�ܼ9i�\�hO6�<3G���$��Zˇ�ȯ0��Θ�%����hd��ãˤ��-|NJE�jH\g]���<Ur��I�&/�?��Z�)T
+��ɕ��+K�
i�O�|%�}�:
K7sI���������'YTe��N��:[�U���f��@�&R�~z'���
k�YRG,&M��H8�D�H�y����p�(
�K��'�&ʒ�p�=�v���Z�pT�%�"’h��"�T��\��4�L�L&���Cg�R�� J�Q�Eڝf��{p6�
��U�,�x
�{�:�X�L,Aq	K�T�ғod�������b!�C�˃%����_���QB�͸�>��|�4�~�Na:�ja��
$KL�R�cLj�U�]��W�H,�c[`��]M at i��R�^�e��v�e֤8t�Jk���*
'>J
*�����[���
Tz�~�ү��� ���Ȅ����`�Gބ����4#�����ƛ7*
�I��8�K&�nϹI$
t.�62�bl�*I�U��Kk��xK�w|��*8߼�U�T� ��_5ڰ,�x(���z,
4��-�(��*�V⏑�&���.A#;Fv}b֨|�!5��ʅ�4�V��2��S%cRߏ>(X��5�J [...]
+
�UX���/�e��8��������z�
�� �ɝLR�([�]����%w��6��A	U��&�
�8�`
+{��P�f�Pۊ놹T�e�QU�`�j9�n
>�1�//ώ��D�%^}մe�:z�
�N�?�J�D�%"�c"�
��ci��
�\�f
0ۑ
+��\,A�K������K�\02��
q����)"Y$��ᶩ�T�` (I�R��R	�(齛���V��V�2Is��p�fE{�M6�%p�&�X�*.ץ�d���~w"<X����ƒ�:���J%�h�lx�2ݨ*�RJ�F!�v����R�z�{���y�,��,5X�
+46�Ky&<,5�*�����}�nO����$2X�Y����m�*�\�z�
8[���_F%S�M���h#`$pw r�J�7;��q����T�&*�o�U%�u�`g=�e�u8^"Ra�=�c,� M��S�ɻ�]��\�.lֱc�d���N�o�:�Y$�,.�\�`v�������o�E���������ri29\H��<�v�h=�\,Q[J⦆��đ�Y�.�P�s��Ã��Q����KJ�AX��wÃo�W%JaYbL�����p�Φҿ^��/K-��&K0�AZH<�Xꝺ���	3����h�����,R=�. ��]�޺*}e���z�"�:�8(ฆ��m-��r!��	
�N�o���l�����x��x�`�#ϛM�_���҇�v:�i���V;���#-sJްR�2����pI|Z��d����=:H�N���R�^�<�JM�X�=Z
+���z�٬��E��P��N`�HY��}�E3y|?+2����zq�u4c.�Y�Jv�h�B&AQrƒ�ux0P��5�+�C���
+WiJ
���Sĩ�xU�-K`k�,!�
+ tg���8���K���pB%�ғ���`����7UK
3��J��rg��Pɻ�5t�sO���{�"�@�:�"Z
+M%���wA���;���Jz SU�7hk��%?��鰮ź��u�
eYK-a)�JNީ�u��R &���|����9X4fR�V�EI��Q ��F����I�R�Pj���v|&xT �}Nc�D�Qi^�0KltY�XU\�,��JvD�	��z��CD�!��(��n%�hw��ƒU �YT
+�b�6t<,�,]��ei�R�U�$C�ô�U�a�����	����( <��$,��PR��
�*I�[�*���-��S�<�
����;����*����
��_4h�w*�YT��Jh6�B[�,�%�ӟ#'w�%@��K
b)�W%�,
Z
|���	�%cr�����:r
S��uM�=	�L��ՐӺ)3�6�R=�C�sVo
+J?
(�:�As�b�$r�����sT4�>#ں�pj�T���͞y�`.-ƒ�%�)��
+P���t�CY�N�:
����d��A��tત���9KT��׹Z���W�*K+Цi;%��PB�����ċn��K�

+>?uO��ctC(�0�,
R�uYa .�^U�V~mU����\��4n��lK`�6�N:S�ǝJ0�TUA���b�Ov�G�#��l��p��T%�'��G�KL���f �|�~Xؖ��N3	�7%�R��)B���Bi�@�Z��r:i?��)�{���dp��?�Xт<�ቶ��R	/���!Μ�+�dN�e'
K6y�T
�Bk�Ri�	�RM�uڬUf�i�g�vW���Db
.��
�֎���ई�y\�`�P�+l��$y%\,�K�%?��J�����
J
�x���e��_٪4LW��o�����Б�xg�RWNr�p��	C�S�Ϥ�/�һ�Ҩ)�j,�,�Y����6�R�a��%&o�8�K���%29�r���`���
!
�S5	�K[]���
�<� �K���8B��P"�ۍ#�-�Y���T�UeiN�3�t�h.�
+’̫��l�%J�ԗ̨�E�

�R�P��P闅Ҩ�j�~޸*9P�c��X�y���P),K��,��I�K��RU�0~��LȺt��&��c�E����|F(-JyY�e�P��'u-V%���F>[�Nm���3i�|
�#�3��
+h\��'2��$Z&/�BD]c�Ć~��wS�W�P	�1�w��TY:�G�Ӟ�`�H�9,AU���-@�uI&1y��&g\�ɤ�N�H��P�S�
�
�Y�5�2�󷨳�L�FVyQ�E�͎�ԻP:�O�� �*���tS�Z�Ri.|_N�1��h[���%�h��J��F� I�
ד�J���
��J���6�(<d
�T:<�gC險��靫���.�6Q
�F)�,u��%�� MӪ���.�
+J
+�r�c1
Q�P��/��.��;lIWi.���܇W�*��\����}�k�:~�B?�(d��:��X�h)�J=R	�5�;���J��<�*i(i��),M-�5Xڏ
��7`	DQɛ,.4���=Nq�.�
�	��v}���9D���p�
&q�Ƣ��p���Ћ5��vJD���@Iqi�
v@�w�J����i��������\���j̀O`��g��
I�)6>#�"��fK#�"��$SP�
�l�3Za���I���<\���`�
�"*͸�-K
�@���}��Q��
��"�턈��0!�#��t������$�P�Ѵ�V��%������Y3�����\Q	ޭk�^*?o�"��")�L�O�_4���h��G�s���Qɛ�����n�
8

�#�x�F{���ei���a��
��Rm)KM���
�8}�ˑ͹h���w�A���]��}����Nt̤4����p���VNZ�
���v�F�ѡD��J,��$��c	�õ�˩����h��%h��9�p+.q	��.L�W��,<�&K�d
-2)�"J��2��`uZ�:�l�Q	�z�Djq�SLRGai��s^�"����DO1	z,nR����Q�����d��H���C�C��Y9P�$�������������U�^;�s�`��+óX�%�W�y~��
�T:��O*��p��P2TZۃ\b��ݴ,�-:���,����`�*��y
r�,�$���D6�>����n�,
��H�iAF���2	�*J�q���Ai;
� �_V�(i
�uSR�a�T�����%'�3D�Xª\���1ͪ����㆒-���J�>�#j��X��
+>�i�4

�G����U�vZ�_�*�|�U���D��u�(K'����t��lz���k9�!�DN
6�#]`
�Ƅ�(��SaO���ܔ
+�e	�߬�K뵩Jj=��t1���P�;1���IDw�
 �<�x_�ωJ?�T�3��˥��JkKà�4W�.��O��v�p���
+�I�dq�PT�2�8�R���rkN
Y����j��i�6
'��Ew�� �
���3'�����5����+��@��:U�ez�S�
6�4��h�N\N�#I�4W&a�2%,YRɦ!�C�����5P��*
�J{���H�dTzҲ���mTz�h�1��RQ���:��R�<��#ɠ2�b�ؠZ�*і�5�
¤���Bx�+�A�ҝ���*Q-���t�\�RO,	���I̻�/�%z[O"`�
���Xʉ��XJ��K
L#Vc�.
+D��G
=_ZS�j)K\������֥��f*��X���[Ⴋ�+�nZ-a�n9{\~-
][��1?���Ǥ�sD�ͰC�>��6*K����qȉ���s��>’[+��Jc��%>�qʥ4�����r�L�"����}$�9���$0�&%5���ćx
�� H��b}�UI
�vCI�dTڿN���R�U,��4���*�Y���\P�
+%���m�J���
�|�40�҄��P�V���7@�}U��٪$����;�Ґ$��b	
u�1�j*�Z��܀A)��8�j�X�ǔ�<��D,��_���&b�"
�,�IOMj<��T(ѱ�.�肌�=�ҷ᚟b*���pΦN�W<k��"P��C��T��T� �.mFP$,=?�lw{Y��
�cIV	{c��a��.UIs)�
��l���2����ƿ
+��@�>�l
It:�$X
�x\݈׵m#Pj�������
PW�g�$�R�Mlq�t`i�e�J���J�Kb~������\��R��T\r�
׸�J��+����ˉJe�RA)-��2I�ʤ��
���EP�T��B�yg�v
�V
��j5���"��/K?Ζ��%H���`)+��Y ���(Jvc-(�(�i( ���&��T6%���w�S�r��V�p��tB���b�r�-n>W�©��嬙����u�o�s����O*�kT���Q�ۘJ�x��V�%N�?
�t���K�
\�8yM-��C��Y�\�br���Z�t���(���
H�9����0)�JϤ��;W�CDY�]6�)�n�J���U%����%V%�ҳP�۝���X��*�P�2&��FY���Mf*U�8ځIuT����OBiT�d�0���v��P����uT:S�^�t/��X�(�Ҷ&�%eZ���_�d�_�@��$��l.=��B�JRR����|
������|0��M7
@�
��q�Ί,i���v.T��I��T��T��
�FXz���{bi�R�%�8�K9
�q�%59�r��vi>gl*��ⱗ+�����>jR�
��X]
+�k$���5N�Ļlv�J�s��F'��U�퀤�uZ�A��
���T�K��9��n��u�z
F��d�V&(�i"h6y�R��0*�ƤL�������T����*(���bT���v����I�q
�wJV�Ab'G����\�x���5Vf(K[-����G,�%T%6&��¥�Bհd��D
�A�oߘ�x�Y�H@(U��(!а$h���
����*
T�
�
n�3_��
+����V�&�g��xX���>�����x�
�E(
ю+E&�J�P�K?�Kw'�-8�!jK�%�OެKU�H]�Ge\��a� &'.�6G��ѩ��T������Ql[&F��-N�T���(a�h�X8��_�QU:z*�p�>���n�iD%��ݨ�h��
�5ӊ�Q�	 ž��k`�d�41h��,Z���J����$�DB��H�8<�u:��-Ui�;�t<
J{��v�ٴN?jңb#*�ym�;�ѡ:��da�Q,�x�`)Fκd\��`��4�u� C(HQ���fWe
(+mJN��Ϧ�o�\���/��è��捺yS�yZdռY����R��f�_��?����S)T���<�:�R���������Y�3,1�y��M��8rI·&�rJ&A�:��L��J�o�09�\ �
�7
O�#aR]�**J>�c�����f�>(���cT�%r�o�Yo���qY�Թ
�ކ�
�@Ņn�Kc��LTl,٠�f�Ix�BK��IH�&����pW�Ί�ªt*a$?t0�v4�O�PB��b�x��4T�i�e+�D4��-5�`%��.���(&-�iQ�H��K0�L����r�R
��@i�t7��N�|U̜� ��s-.�Z���\��
TJU�Ǣ{����
��'�>"�B�'��֨���c�*�Iw�c)��E,�e�b�s
�7�����H�*s9T&�9���VG�KG����՜<�����J"	5I�Θ�!�Սy]��5f�����'M��(�`�O��Z)��CY�/�^�0�R�=�L�t��K����d`�a�Q2�l4yn�!eeJU�$)K"���K���`�*���tPZs�v��m׌��E۱Q]�һ�R����')K}���%I�:I�R"\�&�n�E
i�L$�s
+ E�n�z%ܥ�#8z��`�#Ϻ�
T�����`]��޴�DuV���ݼ57��������P�w�l��&q�d��dR?�ҵ{t��/b������[<��sG.���L
+��d"��M�:1�����qR�8ڜG�,I��N�䘿}Q� ��_4;��U�Ǹ*�W�JP�f��(�$T:\�����",�
K�8!�2�X�ȥB�T�T�&T1�lv*��D*(��Ϥ�h�P���pY��Ci!^�U�(ithlV%�KtjY��(��ϸ\������M��ֹR�RƠPʥy诮k�'� O�,�2	魒���V�:��Z����?YU:s�WV����4�����޼�ӦZ�ʳ��q�
��P�K����O*} *
&T�@r��J�J
K��a��b��)N�bq>z�ښ
%ٛ\�ɕ�� ��s�&��3��g
���j����H�B�Ě$NG��o�Y��n�iv������
+�IU�P�	��#0�ՒI�bS�T�{,�h���A��h��n��\($k|��(f�
JA�D��FR%e������)+T�v
�߆�w5�S���"��~+b	�\4|Ne�_X&R�嶲��iY2,m-���I*��&	
�p�d�)��)��5��|~Ȥ�E�\��kM
Ai�>Z��T��GUI�\̜��Zv�Z�<Oq�3�.����R����_��?��OR���\�R/��K�0أ�_���/K�*�����kX:�*Y��z���D�k�K��%�
ӷ���l�%����9
���>��|W���
C�F�$%m`Rۖ����:���>Z
�cS�T%����L�R�m��J�_B�A�����h����
$
\�*J�,aa���T1�Y,�jU�&�5R�jaM�
�r�hυ�(ݭ*	�d�0XD��I��e".�����g�̚7� ����<�ӄ^&�)�h4N�����VVU8�)�+G�t�#Hd~�7Qi:��X�
�T1���G��ޯ+mv9��ɑ8�F�$C���%Ͽ��1��Jw�J.9�.�U����̥��"K^8�/��zi����Na�i���A�/N�
Tj�#w:>L��K7ջ9,y.�c/Eͻ��]K�!�j撄\���`2�Ld-�\'�brt5�09
�{�9g
+A�I]�y&I�vY7(����`*��P�P�A��R��.q
O�
j<q\��M�Y�%�-+�8t�=��R���H�,�Am�Xd�fRY�*	B5Ѣ��ӽ�S	Ob�P�Sk�s���e�0�z�S�=S���t�X���cU6�
�`�F��rGZi2د �kv^�
T�T��'���K�܀�6�KP'�
�v!��a�W��[��$.ٗe
��7���J�*
`%P�m|�V�D6j݆���G�z�a,������%��z�S�Kҽ�}�8ߨ�Y!�Kf=�$�(��^�' *>�	�����@b"%I/$f��2I�7U�.�wC馩tvS	G�D��?��J��Q�w�
�4֌'�ɕK��,Y�%M�*ƒE����@i��THJD)���X�H(�bCW���Ӈ�43�N�-��0�j|��dɨ�
�EX�;*��7��:b]�
K;�Rc	s��\*L���nv�h9�S��K�C5IYv
=~��J�Jq`�:���n*q��
˪���-�֬�\�?WdO�EUh�{*�
~P�kR��[
�IV܄�
+y�B�ֻ��M�ٵai<�\"OQ�e
ud(�xS2I��]d/l|�SkS�,&DB�Ft۩&]e��$P�r��P�t�t(��ᎠT0�I@����9TzK�0q���:qy/��
:1�D1h����fI�I�� ���
K2hI��v�	��C4�>J�S��Ć�|����\B�P*���1���8xQ��� K<`�ە�KE\��QQP-D�g����@��� ����'�����B�J=�b��D�=���� �8_K.A�&������ �NlV�R�T��萅�C(�1�N�Hw��1��"�V�ݤ\"Oq��;���n2
s�s�-f�n>e0�
���E4zɅG�ǜ)"$�H�)�$�zͺ�d]T�
��t�g�O_�J�S����>�J��cI�kVG\�U��u	�Bk#łdN)��u��%g��$�ZV�z&YW
�.�tˢ�
GHH��lF��նl#����`��a.��l�tC�/�_Q[พ`	jX7�r�(گk.v�@
9���oXI [...]
���K��*�
���
+Y��<0�IC&!'C�S�43��=|�c(��`���'����%�%�:P�<�k��� K;�Ҧ�vi7~���~-u��f紈ǒ����P���U����P��T�5�J!��RN I��E�<[/M�c�<��~b*�/9���ע�Q���i�¤2

?����K.�",i�ջ���c0�|R �[�t�#��]����Q�����k�9E�K:Ǥ�
�d(�
J�
�P����S��B�&*���;
�ѝN�@�waif�2�I�d`*M9�X����[{��R�"�u����Bݵ<\V�,SI���A����Ht��KeE�5��
^��t�},M�ǫr
X��)hQp�2�GWJ�E���P
���I4�0T�In(������K�&(M��k<��؂
���jla*cS���Y����Gy�
Q�}<�
T�;�^�H%@I�`$�PR�5���XR��^�$�
�4�׹�:�Ŕs�y4���^�-�,>�}��#�
��T$�džL���~�uð��sÇA�?�W(u�$��K��0�J�RD�+�*��&�n4q#.�C��%��b�,��T�����@*��Z��;I�:1�s�t���0Tt�4KJ� �,ע��K[�t�.sâ1��9��|
h2���KU�	�q5�iQ��7р�"T�I
����y(�~J��<s���0��
+2��)gef�t���.?WdO�EUh�?��ֿ�jT�0�j
J���p�XrT:�<�f�R0������|��`_�L5}�h��ڶ���.

+8o�g�9���IȻ�&�o�Y(]�
�t�p %<y�
ECź(�"a�JG�J�A��ai4�D3 �%c���K�Cżd��ߵ�HE#��,#I��Lj:jㄒ�p��ӍP�%�����F��e]х��v�ɖ��z"�4��K�Q�-,���g,�(w�.��&�&�	�=�q~Q��C�rCU��h��?z�W=�Qo{���S���n��k�+S�9q$�h(!ɗ�zi���)P�����0���

��$;)T�a�,�?K�z.��cW��sd4!�4��Tҭ$8���u#i�)�����,�4�.B�
+�]��I��
�=*T.%b,��Tz�����A<I�l�%(
#żd�VR�Jъ�䑄�T�A˙���<\���@��JE��D�"��7h=�%a'��`,���l�^�<�����~�E
;�	��D~�˸��I2�6�	���P��T:3se*��i[�J���6][�"$%����7$���TzP�Ri'T��e�ܶ�E����z��[��IU�� ���r;��
0\��dI���"vYC 
������L�v��n�r���,a����q�UKc)���K���\C�|d*�n���(�
�^SC"���D�e��jRĤ!��%�����·���@�0��5q�
+�d��!I*�
�J	,�f1��Aŵ\2
��Ѐ	��$��d*�J1������dL�LR?
�[�R� �JtK����F�z������xm{��,��^�zXz
��A<� IL����jAK[
j���������n'��v(E&�NV%�q�qI�LeE�Zde1��������9��J�?�(T:`�C*�0�5�R�$��kX8�]GXz
�t�e;�%Y���.Y��`b2�J�u������T�K�&r9
1K$.KĽ5�>�vg��
P�-�TzE(m׶�c��T�
@��ݩ�Ь�%�f;ϥ�J��d=�0P�F3V�&��,U%�j�3).J�o��٪�w�kJ
+�[��ʴ�s�PE,5Kԕ�-KA�5mi�
+,���A*�1�j��5�'h�z�a�L"�M&�9y
Jɪ�6����x��8�̗�<[L���i�K����PzR鱨�?�����Q�BI��⍬
�Z�b	�MxW^�$����Klr!�j��[e��6��J#eE6���$y$qM���?W�F�,j�6�b��XjMX *�J��V\åNH��5��X1Փ*Ԋjck4��6bR��Z�F���A	3D[c�PeU���Y�u	�
x%4
�RCX���K�5�I�x_},

��v�L]�<7��W
��_&�UA��TU�	�@铧z��ō��#E'�� �⋪������y�R~#U�I���GD�
�_CPR!)�xim�4:�N�%�
��Ι
&&�(�9kt��dM
+��6�
��G
�d��njj
�d���w�һ�>_%�$�~N��P�%T�P�x/*E���lrIv\Qnc�X2
(�+���h���P�����E�6(�R;Ai�A�pO %8O�L*Vfh-y�X҈%��6�ҵe�
�^
����v"&1Z�@��EU2��$��W��Ʊ*i��TP����|RM'?�?���3rA%��O*=��,�6HuCP���#+^R��5\?`Ž��Tz�Y
+�i,,�
�
���9&�9v�F1G�KY
�lo<�|M���o���R
��,-L
�%�Rc�—P�X�*.H�1�qa�Y�b*��[FRXh�'
�;@I$Pio��F(A!*U�L��%�<0��T�V5��d����Me�$�|]��$c��BX\����0��EuL(
T���J-!�*
]T�
+
�r^-��㙞��S�J�ȟT:���J�yDT� �0�i����	� Z �@�|;��-K�~Y�Ki��Mn#���DhB�k)�5�����֤?C$�$�I��&��-��j(��g7_�FO��!��e�ʆ��T*Ҥ��P-��J1�>ť����J(�SR�T
�B+��?%ԍPJ�#�>B	���k-���\fY���e &Ē*+�z9�%���$]��!2��� �\21��bB����HAQ�1�(��J��׆K*SY��ٲ���M�����ljJ���Tzd*a!� (�@%t@�K��uU�ed,�",����T]JqI�I��
[�����uI[ �Y�sFg��3)��i��J�H�P�I�̦���+b	[�$�����<���^TJci��J.�
+0%C�f��
+�l�}����75����tQ
J�{P�����^��B&Ue�e	6�
�Jbi�%*
n.K���!$�!�9.u]Zdke��d4R��o��t3�DxOT�M������Z�mBX��O�i�c�3{�6�T�|UzR�!��Q	�UJ�#L�`�О��o"c���z�b)&iq��^��Y��]Βi�x���[�լ}o
�Z1.I
I�4�uWC�]B��f�5n�)��T�up�%��#*]ll�:��d]�1s�m�d�K�%�UkÃC�O�&���=�ރԎ�}�"(��Lʗؖ2W�r��v
��uP����%��A,�h�w�C5D������8J]Ȥ�P��&�i\���W%Ho���-�S�q
6�}Ҽ*��ғJH�7����/Q	�����
��0N5�F�R4Na���[rɸ
�
-�Ny��@����m�,�6}$��t7(

��$	&

�
�x���J��e�XJsɃ�T�
��K%�
+����)�tu�
ϝ�+���Ԩ��rbR�-+X��)_ebIWM������8$�,
�%+H�%�0&Բ���Ѐ%�D*�=����7~���4��D&�CUR�r^�YY at U���U�
�x�m�*=���TBu	J��&H��D.��^6����z	,��8�t9as4[܅��u<a����׎Gk����LY�t}&I�J;%��VX_
�	(b��ds����K�d�$5;&5��+t�Ŋ�}�Z�X�]�I#����r	(m,�ti��j>_šρL��b	�=L>�Ҟ�
���{�X�ե�/`�k!W�Z:�'e(}�*axâ&��VP����R���\�L�ғJ�?�oS�CRi
T�� J�"(9�<@�s��nZ�Rg.c@���t�.
�)�9�.3Cv��j�?Z�	�s>gj����nd(AN�)' �*���T0�4�W8/x^�/�R
+Ki.�Y�b�
+���A�}J)
B��9������J�W
�h������T�J0�F�K��~���nK!�B.���]��b��[*�9&%�ҝ���z������	���f���K���oH�Ї�Tz(*
�0�6P�Eq�>�K�K����n�u�xp&gҷs9O&.kuv����N)��O0�� ���rJ۵��P��[+$l�����^�L����R��~]"ͤd�^�`�Z!ȀTm(U�$爟l��
:t{	%�J������(-Is^���JKtz<n?.Kca)P$ͥN���y:byD��	����PtC��Rm�R���)/�`�j�����^����IV�'�
�J�%G�W��x� J��J%��@.5K0L�"�_��RX����K6}{�c�cׂ���)Xv�ܻ-��H=$�N���#@IT�����6�]q�lBXQQR�%�H��J�{R�O�RX�g�@�mH�X�X�A��R�&
2��5:
�A��P��M�F�%�U�-V��r�\.g��jn��J]+
��m��+ƻ/Kb�O��~�;\r���Ztb�����
4إ�4����.Q�` ��V������J���bUbR)q���Җ��&�� (�����k�apU�
Kb����	.��$��d2Fg��P0X�E�q
$I$�$��>ˤ�(�� A at cO�h�	!�+J���km�T������b)�R(�@�ئs�$��	�B����F�:���G�����Y��P�pQS.匥�V���1�²t-��w�wO'�.꯻�C�V^��L:�=�z(���:E�u��J��J3S���~��(�,A����}���}Y5�K�~��v�G���K�]ec�a$J;���&�_D�L���~����Tz!*}��L%JFǒ��K(���\0I"6�B��e{,�꒙K��i6נ��:㎩/�*��Ӑ4p:��Vz�)�v_q %)G&��MB�)-$1a���
)���Ϧ�I&,����G�.KhaB��L�GM��IF [...]
+c��H�����8�DX��
��Λ�%���ե�/��k�'��T�3�K&�`�|�J���W���� 
O�*���
^���p~�֪қJ/K��JזJlk�!��$:�)˒<ͳ�`�:�Қq�sS\�\Zvd�khv�Q��]Z_Z�3"�ؓ�
�c�j�`%� D�XJ"�ʒF�OI%���L I�үi��,1
+6�LZ�]��ͅ���v��z�����I�EYB�R
�^ 
��N�;��K��-�<����Xr�f �]�i
FL������J��*զ�$�i�T�0wvႪ��KQ�k@�#S)�4�&T� ���)�P���R^�L�M�3�	�q��IC�`�,Gyw�Ɋ�	�[U
P�2�.
��
b "dD�6�Kx.�[�T"_�;*}nJ�9"�Xr��q����Z�R��z\�� ,P��P:����#6��R���dY�CUI!c)NrlYU
Q���-���%k]�\jը5-hPOH0.��@�T��(�������(U)ާ�Z�����ԟקҕ�D��$*qUJ%�"�(J�I�tNu)/KG
K���Q]��Rcs���.��?���6��Hw�G���n-���
��DQ�X�&
 ��&�Q�*����T�NS�~:-B��%�K��t[�X��

6f��>5(�+r�c�6PJ< �����U�x�`)-J2�#9
[�V�6���.M��c¼�n̤͡t�7U���D�MU)�U)U�Rk�L��7����T�Q�TAdT�TB	L
+C'�VH^X����n�3�8�u��{�S|����:���U��~�VL�C���d�(qk�s�(J1�AR !�K�"�2���J0������q�-���IX�d��Y1�d�%R��
���(��"{d�*�c�(
�$o��p���AU��O�b	���N#,�[����4��� E]�E��'C�U%�S
��;o�R�T�l\�~تқJ/H��F%8!�0�J at R�G�"��� K�B- �F7
��ӗ����������_sLz
�*)3)����DXj�R)�TK*]���=Lp����ÄI���v�,J�g���J?io(e�����7

��|ᆾH�L��r�WQѪkI�[�F��t�a���a�
�Y�
+V3��P��_�����JE%�@�U%��J�_�U�M�W�C	�����.�
�<-$�N,s�uidr&�c����+�Ӈ�F��V@	˖�dRЄpIb)��h%�K�=��?J%tr��"��U�jRo�Þ�,(�FP"�(a�C�u��@i� 
�
#�c,e9\Fw$�;�ei��U�n��bB7�9-�D06��P�l[��VP�(�U��
)6C�*E���Kw��P��T���tb*eE�g솰B�MF'7��i�
�t�K.u6�=	&it�~Ml��-��Z���a�J'��HsfRD� �ူDe)�
+��is*Y`ӟY.�QbB�YŮ��v���Z��S��X/���	P� ���DPJ�(��~�s]w��Dx0��R��o
+�
��
K�-R���w?�v���Ƅ��"�S����7>��2v!1
+P1��*��V%x�o�J
��>��ҋQ铡$3�Nf��J	4&&� L��
K�K��a遤7��,�:���i��1F�!~�O�)(�
P�IBG�6��Ȁ��d֖Xj����d'�KR��&��ʮ�
+��cР��u�4���.s,(�HT�\�w�A�p� \r�*E1�GX�ʲ��f,
��{,
��d}�J1#�P�GB��>(ɪTT��I\�<�*�gQUzS��C��'��TB~�r�a!�
b��yBH7�p��ұ�R�T,ٸċ5E���)g��I$�����T�P��D�iJ�r�PRg��%��1i������n��
�1�P�ܑ�"(�=V%j��$���
D@Ҟ����X
++�,�
+Y�����Z_�DZ�qi�KN��U�wm�ҭ��Թ�&��%1]��_b��7�^�J�D(�]Is�JA���yas�KT�$�ʣ��&,}����T0m�Z�I���A&i��1��ZB�tl�c��8�t���� dOےJ��d��Kwe��2��
J%�C���"���P�JH(Kb��>����p܈��Ҍ�T���X�n��.m�q�+�➍P�)c��Z
��F�N��O�$U������V�7���gQ�*
+,V,��0�}%�c>)r:�TMa�ҖVX��t��=�L�!��4
���DE�z�!T� � ,QY���J?[*u�7<��xz�q��4 �=�ݣ�T2iaSj�tb{��%Ĉ�����g���s8

������
�� ͘Id����>���
XZW���n
0���
�z(�T�=Ѳ@�U	���KAD
&�
Ƚ��:MUzSI=�@����T�
�;
��	J�K�R�ӹ.����wz&��\�\�s���B�Ǚ�J%�
�������D�˲�E�G���0��I2��4�S��K�<ofɆ�B�n�T��!0G�������?B� �t�\ڣ*ʼn�T%Tvi��oGhx>�
[�0�����!-�Xs���+c炚U��<�0ৱ{P��~YUzS��R^f��lK��	�u�M	��h�����چ%��?��5.M��ݭ�׫��{ds���d�J_�PB	�e	��&_6%.KI�?�J3L��K�'
%[�լRw=l�)�@�\��t�(��K(�\G�w���ۉC��E ,�"	�sq��ZW,"��s�d�үR,�`� �P��-��^U$�$��8��ć�=yW��rf�қJ/K�KK�*/�-QU�W8>�0�dU�^�C,]ai.��=4��
S��I#�
I0iJu���De)��X#���Ӛ�gHe*
��T������f���8`���̊Y%3i�@��
��fV(����l
q	��be��OD�:{/<�I���q���p\�� K�e�lt�ֵ(���r��HWBP1��?q~�)����¹k�I'N�6)
R�΀�u��Z�^FK�ݪ.���������� �����~YA��Prs�6��v ���qI	�d)�
�mU�̪J*�e*=7bWHD-EFP�R{$�2"�\�,�=�s�b,�r���w��u�	�m/rogR�(yV
C�j�d4�
+���L
\S2,B	�%�f*�o�M���\��<0]�ؘTkڀf�tl�jָ��cIe��2%�#
�>%,�#:1��,�
���)��eQ�վ�6:-w�b)̥`�$ňA	~
J�v�Ee
j���ɜ )WQ�D�DvoX���bUzP�R�K%������"&����\�XՁ���R}w,y\�ιa�N�(rSH��~�̓RIPBQR���K�,� ��T:�L��	<�I�a�`��Sj�ըRW~��y��ݯ�J�t�(�EY�1T�$�	���8B��Tt�%ԥ�bI��U�h����T�K��'-]�-���&ք�3����ko�/��'�&n�9�T`ꂸ$�*����Inƪ҃Jӿ�V���FT��5ebAH�8�����c�N\RZ Kz
�|K�å^��n��������7^�
+(�(���Й�P�٭@	AeI�6���4H��
�9�q.�c��WX�IŮ��ʏ�P�(}����/�;�*)
e��b`�n?~�n9�a�3�5i������l�w.:���)9
`%,M�iJ�K,R`����_NP:и0s�mT8\�J��pm)��ͯJ*�T2ear) ��i�1
�T�L�\*��%c����t�V]�qif�]w���{�[oܽ�%q�PR�-J)揝�sl�]
+4��4�T�q��J?{T���#�'SjcL
+
�P�I��UjL��bJ_zPڑA	�6�{��>~��>�LYFXb	�ai���(�j��K�q�V)&$�y�Pr���6)��QP��3�r
gI,lUb��U�A��K�ϟ�X�-�rk3jKhJ
u)���N\����<��j?ՖF�t�6u��>� co�l�f�
���!��J0z*G]ʼncFX�N 펝�T:<7��Jݟ�8Ĥ�z��lpc^C��JD��
(ٕ����a��PL�J)�DL��H�(��
XJ#�"V4/,�M�a�>��nX�h���4��S:sGJ�&v�HK*�y��R���U)EUrP�\�҃J��$�aWG*
+����T&rc��ciw,
�ʹ�������~����ԇҡ
�����Bc��`�
XBYʕ�`jv�U���I��	pitn3��'�,���L
U��� J��^U��R&���S�R��,���Gʘ}�Y�`IQU�������\��Yw���.�i��5Xp+o𯯞S|(U�	=,��Bj%tb��L�����
T�?�J���-I�RB�)c<�c�Y�Q6��2IWbi9��`����cQ8�]�{J/](
|(a�PQR2����`���-���סR���eH�)P��\�׏�T��s
���$�)���"��N�X�v��JۏĤ-�g+d'[�R��.��QzQx���Kp�����V���@�j\<kH�]��Ѧ�
���0���(QOR,�1r[r�$7iTofW���8��-���$2T%�E
�Q�Q�P)E"��I%-�-���ΖZ�.��Ro�
v�
����(���P�|�Ra��SY�5f����;�l)��P�zd	�~΄�I�1.M����"TP��f�l
Cɮ�H�PBYRP�,�XLLz�~���=q��+NX�<?1���V��n7��E\h-�4xo�;J�
�c�QUiw��h�Lnmn�������@�����+;��F"I�I����*<�p[z���B.�� �Ƣs��~�>��:
+��%�RA+���2M掍���i�.U5�YK���T��΅�P����;
.-���z�&TP5_��P*,������(EL�lb�dL
0q`�Y,�	���*)M5�J�뽭��G�g�K��5�<����*Q�lA��Љ�*2I$J�J
���_T��T����4� y]W��-Li"X����3�ۅ��Lj��]��~3�ts��v�ϱ�dSE�q����Rm�dr���$��N��\Sʕ9Q��V*u����
(u���8�S�K3F�L���
+��c<�p�;������R!5v@	��Bɘ�'M��0�%�%��XB�d�`�(J���̙�pp
�c[�w�>7����G�t���6T��"sn0�\�Hm�%�v]:(m|(=�tao�J���mKU��i²���qF�HU)hJ�*�c�����Z�B��ݸ�~���.�ͷ!�^|(회+�ld5��-K�Iv
�����D��є�Ӏo�j!�:
����q\����Ұ.�e�^w�*$��}(}	B�Y�]:��\�%�}�
�$��R�6
���Y�
+/�/�$9���D�>��mi%.ͲϬ���'�ҡ�{
��,�.(�QP��1���ްUI�����s�A�7M�}Y�EH�5O��J<z�q�%NL��L������sk�>��Q�Nohų�]�L:�]��P*�p����1)�Qa!pXJ��&2LY/�J�k�4@�ϥow�ү�j\� �^Mi?��vP�'(=��Gi��R��L��p-
���[��b�yK���d�S����P:����4�BImD�
+�T�D�DUڰ��t�R�%T�4��C��a*�q���X�R���IdD�(��NXڝ��6���RcXZ�K�����.�n�#E��.�v䵲 ()�9��m HzJp�`
HmS�
��P�n2�-�P���Υ���tlOLߺ\��XZ&Մj3��
G�$w\����1�(!(% �= �䰔E�����KpQ�bi����˝���<�N>8��U�S�1�]�
��������q�ĒJ�P�[�
T�MT
+
d@�f �c����1QiBP��N��K��HU����SC,}i������NX:���c0�է�RJ{k5@��BI��%���K8�`�%�JL�-��ԽxJ>�NPj�Ұ.�bi5�֐*x������>�vN��-K��#
s�2�B	=����,�8��f���L��0U���]�jʼk����A�"z��%��]�����s���Rf�*�MU�k^UzP�Q�?��@<*
�T��mZ�-���z�m[G� ���X?X`a`�%R%��%v��E�}g�
u���>9g�H��Ԓg8��D4�E��0���<��TJb�P��ّXڷYz̺�L�㪫���E�l�9w8���Ԩ��, �xY�4
��,@���ò$UC����48��T�T�t:��T�K���{'��Q���s�|�����
#���"�?j�G�%J��=bh�I���<�<�_K� K,^|
-����e�ڃ�m��,�"?<
�TJ'԰5D�Y -[��@iA(MX���җW	YsΩ�$F�@H�IO�V��j%�R�Ƅ4�����Y*j�]�j����U����(�˱�,�nF)Es�yY�Q��F�� �˕IJ�"ip-
+���U����{u%j��
�*���!��\�:�rJ��G;6����$�
��ad��襁�K���^�&���Y��yĔ�ҶET��d��Ҥui~
?���ӎ�$��Uo�9~(�ņ�~��T�
�k�ҋ��׌��U�.*�\���/�4V�n@�*
�
�(�-�m�e��%�vA�RdYJ��
,��]�&�t����DytQjw�%lJ뜦n�d(�!/K��Ngec�e	7BU*m�4|!�Ui
��K��[���K����of�/i�)(E4�
����dYJ�� U�I�*�FgK��ҡ�ҹg��Q>�ʁ�K����4p�A)߲Hy5
`CE�
|���.�c�|�H4��(}N��eW���} !��]~��JW�g�J�Z%dD�X����@��R���#��Ȥ��,�#k;��FQ��K���7㌛�t��%�4nqTj@)M�R����!�Zб����6%R)I�2��K�N�J?�}4l�[aQ�U�TAD��癏�e�����f�����Hk
ؔ�1"�P�,J�Q�=U�ċ��$	ÔcG"��A�1K���Β���|K�]zH
�2iJ�A�w�PM(�c
���h!бyUZ,���d'A�*��k�p��J�K�
+��V�*�/|�*�Kh���c��PR

E.I��荴*�f
�
�$���	,
��u��.�������\��˿�o����q��n�4��l[��eI��Z�$H�
@��R@� R��ҦRi�̽�u�4n���wW���RI���h��k��[���K7�N�;\�o.������9"g?A*�R袄=	$}���a�Yz�~�y�P	�۲D��9,�[,���3�.Mp�^����n�T��Lp������sQ��
U�‹�ҋQg��J3T�[*����D�W
���*�
�^�|B%j(�IG�-�҈T
+
`���jɇ��M24&�
+�����Kj�v.K��*X�ʥ�տ_����n�
-Jͩ�
+mG+%5�|���Fs��1 �7F��L�VthXJ��!6�Hg5bU�

+��n����+�H�K<n�I�,�![W~r7mukl�D)+z�@i���C(#�(Qž�<p�`i�,���,E�A>ɤ��
��e��d׮��ui�K7���<w
��\^P�M)�J��qg��4�5�=�z��c�V��&��M��ґk�*᮹*Qξ�J��Z*]�A����
H1X�x
V�=ŝTB닰-���[1Ja@'�K�btI�B*Y��Z�R9��,5�%g���Kw��ɿ�cRcQ:W�RYh��M(eJ�*�nJc at H�����8J#�j;�miV�p�{#ZW�xmV�\lJ/墴o�D��Y*����^y�D}�s'��s%���D�'vj�Ƣd��;Z�hO������\�,Ez%�O��D��PEifMjlK.K֥^��w�)�S�=3����u6%%Sn�Y�k)V�Ei�B�S*�g-��˚{-��&*���-�24�/�^��Ҟא;���T�`'��(ƛJ.�"�@G�KJ��x�h^����i�ޖ�
O\T���
��Ml^)|���~���-�%�3��(�҆P�e� $j_� p8�>�%LP	w4�q�߈�Uzw�D�*U(
�����U���KwpiJ�n�������� [...]
+1P��pDܣ9 ,+��I�b�R�2A��R��F�(�JM�v�!��L�9�^
�~�ѥi�FO�����Di7��� ��J�⯂�Ed,K�!XRi����ҩ�Rߺ4m_/�+�0��L
��$K�/�P�a�Qҋa'�D��UҦ��~��W�
�o��/�ET
+U[������D�!�����^ �%z�*�'b^�h|7X�".)��-Kk�H���qt]�ߗ>S_���ݩϽhR���:;��<󲄫�Y�
T�9�
�e	C@
��h�S�<�M at 74�*A�7w/R�67�]��J%t�
+��
������,�qirƦ}zO��u[c���=(qsJi�iT=��R
+�� ��I�`�$��Ѯ�Ү�R����39�S#;�L��x�����>/Q�.],K��k�x�(-M�zA(M^��U2���� ��mU�]M�T��k���WI�5\��[z�R%' 7S���J����U��UH(I��#�Rh��RL�{��%��fGܢr���.}ҥGW�}&�n���o��g���,J�,i.8ImNcQ2<H:�R�|��@B��U2P)��ҟ����^gU:����4)�cE*��
�)Y�n��
�7����x�9;�qW�FBi�E)�Eia^@�,�
���I�A�Ŗ%	�"��b�۷Y�Y��b}� �
���ta��PmJ%J��S�{X+
�†�Qj�J�(
��z-�rR��v��^��.~�ˏ��[���J�_�R�T�B�Y��J�>����ҡ�Z T
+T,�2��.�~����y��q�S�
{�� sTS�R5�
WX���L(�V\�'�M�.J�:#�l���M5� ��_�Ȑ%�6���;X�F`3�BV����*=�*
݈ޯ�@ɪd���n[����J��ҋݔ^�#�@F�2lL��
&�ms��R��
aLj
+%j��Oh����Zԇ�j��%I,iix���K����
�r֥��w��}�I�(��@�u���(aV�5���І�W���A�*��pU2�*m�Tz{�U%cJ��ܹZ��_f�q�H��O�W̛��4S�%
WAk/�Zn���H�j�ٽ
[%27b*��J��]*O�G%`ڡR^iC�r�J��
9;�v��Ը�R)���
1�
B:�OT��RHbR�=Icm%k
+��I�$����$�~�q�F0�[^��$���t>
�Ҏ|���6&v������EG"Uf؏|8D� ��r�T�
��J��#�<�@鵥>t��m6mM2@����
� _�?�4>�.oZ]o��x�ʭ�F���
�%[�~��a)����()�<
�h�d�Re���d�a�
+.�
�>l��O�0��4�B	e�B)o��
Վ�@醪4F�(u��3�P�*��Ү�
��{L�~kG����g�TxT���J�G��R	�9F%�R�ěǩ�L�r��+C�(ς8\�P�R��A><�U�ϙ,��L�3�jD5R�F�ԯz��,���u��>x��ߣLb�yE�u��ֻ�8v��Q[
�RX�(	�R �e� 
�2��&(�ȡ��R�o�J{
�I+>{����>�\��[�t�2o^�%&Yk<
� �۲�ƪ�q�~u��R߫2Z(��X��\���g"��~ɯ�;>�`f���
^
�Tzs7S�A�*)�Jya�T��
+8��O/����c�g��.�Z��%s��T(�JK�
T���RI�Js��j�z�+����@��
䕏�
�,��D%
*�I�I��S�(���H��yRDq*t.2�5�
+T&jKVT�K.�\���Kw��J���H�I/#E�38�Ҋcw��.T*3h.�E��/1hi@�?
�FR��¼�B�S���
+*
o��om��P�7PZW8L��9[����p���-[�=������ͬm����:��&��A)�A�?��X
+<,)K���h�(�
+�0U�.��{g�121�aQj'�~�
��R�PJ� ^Ms_:a��*�s	J*�7먔f�J��/�J
+d��wR�c��U4K��d*i�Pi��TZ8TR���Gk���l��
O�S��Q��
�0	2@�5�G<�*�`���1�()�8�X2�b,զ-�l���bi�K36v�/��
�9d�HO:7L��m�:�M�&���7�wJ.	���cDH�Agr><��>Q�䖥���J���ι39���[�Pz3P����T���hM5��g�t��{ziqý�Pڙ��
{�8
+�������X,�KX�	KjK����б����ɫK~7���~��`��pM�s�@�
(I at I��Iԟ�]P�S)�TDL%81��9
�C5TڏSix����t�TڻT*�JʡR,:*E_M�����]*:WL���n �;�Qzo��f�P	W@�Ji��FABU)
`��_8i�\��-UJ0	��jj�J�
եz�.������ǾL]sD0Ƀ�Ϥ^Q2:�P2��\i
��:�S��>�|x���$��"NcxWC%�Sv��:z#����ޚ��P:Y(m��53��bg��
�~�aK�p�s�9��I&�
�-��-���9�,�8FxP�<(5E�
��K�%���ƱD������������A]�v؟2뙹O���g�� 
��MS�-����ܹ��2�\*]�R�JUG���f'�T��J�
K������6ec�x{3��R�V�5�5E_D�<c*���R��T�[*���P���pxDP�-�}*�:���<Nt�J5Q	���%�R*�`,��Tzz$1iA`�]�)	�������y���d=�M�Q���q��������������I�!�0�M[�(���ʁ�%x
3�'m�
�,��2�E��R�F$1��)��vÍ�dVCb�e(�=U�$�W�A�X�����&������{{{�6H�Μ
A��m�!��>�~��a�X�0ƒ����Ò&,�VA�['�Y�
��7��Y�LO���hX�4��H����LC�f*-Z*%��T$���R�"���mr�T��va�:��Dze��
�J��xS����\�JiK%�
��J�R�T�M}��@�
�v>��@�<�w�s;EC���	�;�J+C%Z���e
�Jp�0
�:�a�/�(F��4;E��#�WiEEU���D]��j�KcF�Y��Q���դFc�E��
���=����S�Z�L 5Fmƌ��ψJ�������R�C*�{#<(��{�A%�I�$��
T(�Xڱ:[.
7ze���u��
�\kܵA����R!���Nʈ
+5�
�LO2Oe�4����%����
+*,u"�
���.}�v.�ff�k��ʁ�ߔT��� M�}�+��Q�WK��������-��t9:*�^__o�Rc�t�C�	��J����t�A�T�"��T�QI����`x��,�|��#ĝǥ��S���C%8

&)i
+���s$�ǐ��"\.�R˥��.�	a� �
+��
�k��.k'왺���p�4��
�������sH�d�q�(��W���ۗJ��
+�w`Ƭ�|K2xLE�
�����RIUmN�8T��F�o*�h�th��1	q���0m
.�
��M\z�6/�n�I�5
�����]��
!��Rx	Jnf��􋱔,�Ґx�RKZU4tR
;��ԥ�S�g�)$]H�Z��4 ��^(�J��|(���K��-�2�R�J&j�$A��J�c_r���?ޟY��ǣ5�=^
�"��蕑X�-ɀ��6T��UT��P)e*�f��ꖅ���u �;��8vT�ל
�JX�/Q	aTzz2���$�Fd�!�2�D�\,e�%XY�W
���A]��K�z���?w���Lr{gnS�,���(�ɬ�TV F"A���q!
i̊����,xxaȼ���r�s#��7⟱�1��ҁ�t�TwL�|��*R'���n�ĥ#qi���B���Gmo.Lx{�4�����
)G`eZ(	J�4���跥
��$�B��*�7�gK�6uiL>3!��}�j�%��\0��i �\zi���R۔��RU�������K%�Q	>��@�*7T�Ip�u\�d4׾�n�
}��Ҿ�I�^_�ė��bP)�J��R�5T�*ED%<�L���Cѣ�Cry���h
{K�;�RzgT�tG���i�DU	M	^�сe.u��0��)ILR�*�
Q]ZQ�+m]�Y]�%�
�����Y�4�$֘���޶��~e[��
+�
+�pQ��f
JT�HӔ�
r� �?�0"(D%
���.��܈��F�]��$)//��J}(�I���/�ݶ�.����S��G.0'B�}inZ-�<�
�U�����(���1��H2yNW}UdP)?�p
+�^��O�ҹ����{�\���0�w���
��V�,�K�Kr�1�{Pܭ`�ÒoڒNv�RZ��:�n?�u3\z|؏H�������~(�i�
�۔,����ǫR�J�JiC%4%E*�KU�m���h�t"�.�/FvKLؾ�z���ӟl5@�+

7r���3@X�J�R��OP��RI�Jk܄�%��M�I���džJ�@̣��߱�p
��
Dσݱ�R�U��s ^��{!��đ
R�OIy:��i��4��4�����m]��jȥ��n+�=4Mh�w� �kl�5i�$+2[���^ˬ*U�
��stQ
+
��-�4�_3IO\��~�'b�
+	T��*�\���)퉸>~"�P�� �
Pb3�=I�<ϲ�)L5YK0�K'r�5����$��uc��$
+�RSno
@���>�Kȹ+b��XZ7XJ5�R*L�`g���\w
�u���L{j����o��K�a�t�륁4
6%�;��@���c��Jn#q�
+��X
+�M��cs���r����՚0����T2ՠ"�3<6�rR	&��<R)�Tr��J��RB*y����|R)���M�Js�
ZL_G<��@޺�h)]�0T
}�C O��C/By��&�J���<�%\B]b�'�2$�0ʥ1�	�T�
{%�k�.���
��N_�_4p�AMc�A�
c�%�
cp���
Bh���d�����gL,�,��"L�
T�^����9e'
+9tr�C'�+�JG�<�|O(IQ�
+ 	֬/!�m���D.�U�j,�r�9���]N��.�n�R/���m�r�
��7���&�����
���((,m)����.�f��K���
+�<8��4�c�؊j���P�J�g@����P�TZ�J������I�j�ࡥ����3�j��JN�o�h�8i�� �@:Z�b�'����KH�gK��WSie��L*%�:�m�>o(��+�.��J2=�
��CSI�C�

1>
�R��9xqX�����2\B]Z���sT'd=��R	��
�J{�=-��".-ӧ�k�
 i�I�(i{�J�cQ��'�N�_
a�a�cw,J���X����k�6�#CNH�$���~7v"��1�#s
,�H����
��J5�d���iʺ��x���i��}��ǹ�V9����&�q�ۼ��Z�ΐ#�a�
��%PZ��P%�(�
vP��:�%�������4c?än�ݦIp����P�(����*E^�Rs�I�8�4��
���b�v�����ӛ����� B�R
]�;
ڒ�ˏz�
���i*���K����_ u���8�`HQ�i1v	�2�k�a�
���w�O��Q�Ҿ���;*��38eL�������c>=��V+1M�%_k�t}ܡT%E&	�je��j�5\2��˥��������Ɛ4Ǥ��u�|.���,�r��BKMQ&A!�k&L*�,x*N#?Sa,J�s�>@�P�tnO�u�D
�D&J�#�=��TX��4U	��ĺT J� �ƐK7�B����
g�����$y
���Ņ�[�#$�ؘ�
Jw�"|(Q�lMUT�>4��եi.��TwG4S��I�F.��R�4�~
J�>%C%l���T�#W��9�m7(���'ɂ��U����7�	Є�᚟_��u5H�D����hR�2T���T�f�T�J�K���q�#nʔ������hf;����� [...]
+P��mBR�h
+i�Xb�
����R�Hz�.YI{���@ZS`�A�]�Ϳs�H�-���	&Qdâ��
I��_x�e���o�������ܖm��I*�)%�
+9eo����{�_�V"J`��
����
�,M�R�)!�xehQH
�x8%���y�K�:���w7㌝��z�%c��	�3)�6GX(m����$�J|�PP^d6��h;V�,���\�=팋�s�L���� 
T����4`�@I,�cP�T��C�gP)J�u�5���gIl5��C�]��x�$HC
5�Q�I/�[�¯�gPSuU%� e5PyL�e���w�lP
@����__H%
D��"���@y��6R7ayĭ���W��<9�����<������y��8��X
�s�t��#�\�dn�Ӻ*��W�#|�u}ܰ���:��**J�^[���Z]
Ǹ4&-�G�tO^_��?�����#L���$���%f�D
.���K��pR��I2��;�,녹-�7^Q�Q���)K�D�
?S�!�x
�3�Ci��~$e)��m	W�o���K�kM�8����d�����9c�IM\�Z#�a������c�e�H�Pz_�q,%K
�r
+��D@3�Ү�ԥC�.u�46�����a�Ǥ�4����rA$h�����@�T���zN�%���
� PI��`�
��N��5��vb!�}��W
+��5:&�ų�p��[
7��
+���<������G���#[
cVG�;\b�cY���}��@.�@:�J�-���
�o��k?%�X�`��#aYsI�Ҧ�&�(NCV�8�u)k�,l+�㒵�;`��S�5��.��Hz�7*�6�$ko���ῡ���t
@h`�0���t9����s����=	�
1J����q����q���|�C�PyX����m��ra��,�B�*
+�/�k+[�5\�'����GW9����&��7k��5֘�^0Hpgq���2Gt�q1�F��K�Z�^P�P�'ꡈ����ѐ����@=�Þ��g�fN4c)�
+���
+I��gӀ��yP�R�[C���^.�m+K�/Ͽ�ڻ 
��!l
�3�%[r�
܅ou�p8�+�#a 9�m�잪��N�y�FID
+,3�9��F\�a�w��NH��}���J��#�	�	��KW

+�j�>�q,� O~ۂJ7�J7�R
b��d�7*�|s��	L
��$&D�xT��LY���/vT��
�
�4��(s��4�0ɿ�J�ʀi����]A�a��
�*��$�+�	
4���t�8�%�0��t��	4�Mcӟ�?_\SHr�$kndӍDn)J�����i�gI�g\����ۢ����n)� �=�Qj�Xr�2��Ᏼ��҉��L�O>�`&���L"(ao���;*J`#	d�U��6�gЩ(m�?^o�y~��1c�"��7�:/L\���uW���n+$*��q�J�[��Y�R$�N鬴2@?�:����d-q̥�T7���Sʹh~N3I��tj�
�r! IPWi �p(}vTj6۠����{h�N}��n�����[���Yp&G���<f$Q1 at 3h	�
��U#�@q5�&
�j{���o^��^@���ݪ�+��<�Mqo�W�ƙlل�9����X�D;BR
J쁺#,0�a�!S)؆ܔ6��s6�9	K$*ԥ"5UR���jI{$�F$�ĥ�K�Ɋ˩kM�U�ү
�4A�I$�=�cR����%���q���``��q�e�BL�ܖ�IﻜBQ�ND98��8
��$�REPBQb&�DA&iK�Z�em�7`��]i�k7�����-nn̤���#�$*k�Ԓ��H"�,�,B��
�J>�b�������`�f�S�\�;غ��a?�tY��'Ӣv^�����a`�$/
�~��j���Pb*}vT2��Q�n��Ys��OstB/H�
%���~�"P��p ����Ky	
��@�ߣ|��H_S���?E��*�	�<���pkn��"L�LN��L��h
�n
J8����Dh��_��XL���"*�r6_�u��ĢR�o
�
�2S^]*J�{�������
+�M�{���,���u�6Ť�cR}��נ$
�L_� ����'�OKQ�����J8)d�'{�)Q��Rf��џ��-��D�.��'��
�TeU.J�$��ܕ�ʍ)����`��Ic	L��nj�ۛOS�h��k;�Q��Q�:�D�3��j��AiKz_��r
+vXs^�%W%]�&�~�Xw��Ҭx^���8��1�7�c�ߥ�Z�/�%�)
�}H?J
�����|#*�r`DIP��$.\�i��aI� q�{֑œ
+="9~� x"ƣt��_�\
bT��!��Q3ش�����J�4�ik�c�Ei���p��-q�8�m{pXz�\<Z��O&�y0�#c��C�(��a�`�
��^1ݐo�4!+�y�N�*Q5*�a��	%��T"��
(�9.�{��������Al�?���4���$�r�f���$ј��,LÙ���%18��
+�l4�z��Ё�B2
��s
+�!Gt�퉠�!�
��qv'b�@�ߺ�S\�I���DE	��zQj)JR���ʒJW%�Lu]�7��K�޻���fW7rF^�ݛ�+�Zg�yQq^�l^WRn�޸J�XJYA�`	���vU��
�u�����䧺��n,�7jg��}�<{)�麡vi�/J��m0Hy�~
��Si�� S�t�|�9�!�
e�'χ�kz}����Ν	7G��A��
��V�h�jp��.`*5���ߣ��MЈ	�����j*K�*����D���11��yt��9�
+�Ѡt��/����L§L�����1"���e7I���.a�um腻�`];a�\&k%ӌp���^c׿�x4$������4�$~"��2�%m�
n'آDL�i�71�d�R 
+yȑS��>�>�24��FiO�i|"&�ҤD��'0��������qQR
�b��L����P&�\��9k�S^����lo䌃����u���5�)��u�v֗۷AiK� � x�.��!�.Y���� ��H�U�Ǹ1�N"�q�gJQ�$8����	��J� o&��٪2�S!k� ��@s��Ձ���-�EGK��ꮁ�|�=[�d'�USW�	��SEՀM�^ÄUp�Qi�穴�t+����1@�D��\ʒ�=�	��`
2����<�����8�	��
(]v�Έ�{��C���4�q������s';
+{5�R�ۺ�wu��
�$u�/=�t�Yq��Il�����߰�r��WؘIp��@"�
+B3��"���(���� ���2��[V�.��q"�@��
nP�W����z�1�"��8�R��b.	���b��/�eԕ*^*2ސK�Ac�U�����9�I�����g��ף.�k��[^�~����`,���
�s����:���4P��Z0�m���>1x��vV<�rȅ#\�^�0�^>J�T�Мf���(+I��΅a���ҁE��tz�a�˗���Y<� �84}U*2h�	�0�A���~k�ߥ���"��$$L���.�,
Y@�L�?����
��2
�Y�A���P��Ra�)M
а�
+���J�[�Jb��uϗ^TJ﫤QNUR���Z�ܛ�>�
\��0ͫ�Z`����G�x�
�/I>���|�]1�&&����Rz�\�Xf�I��V.�q�sW
KY"�졐�r
+b�"@ ��S�.`YKǃUH"��K
�N�������1�%�� J(J�Iq
E�J9��(V
0�p�4ǥ%�
���s�;˻�r�����G�������l����dez�Wc酰D�&q��f
Ƽ�Rr]-u	i��u�\�þ����W�f���Q;/2I�@%i�F�4P���@4N%G��M�v�((� �Dsߝ�ąM��o�t�\:������J�#\'�`.JǃXFe��΄�9tw&\������/��
Q�ӟ��'����\�L���v!a:��Ĉ�0mJm؄h �p O�"���t���e�@���p>��
+�uGMAy��Ir�{�XQ��a��T�u	�*r��VZt%
��K��'_Z0�!Ӽ���ή���<D���Na�m
��k�� 2S�ތ�
ѯ����O~Qr���ʁ�HN	�U� SB���D!�`}uK�<��Dx��F9h*���D��y
gY���rYn�j���<��Z;տPEe�E .��Ŗ]Ɋ�������H�#�
J&g���Nc�
`�r���4��]����Q��8�I�%첬5v�A"��u9�t;����
KF��
vi�
��K6u��%�����P�Ó�;d�B<����̯q�ۏ�4��l M�D8�%_\���ҐJ���5���L����q�b	Y��6L�
߯x��Y�,�ʆ16���4��i�-#�p�&�D*=<�
�7T
+~x�ӈƫ��o
����4j ���\;LrP�E���"R:��;"!F%"U�^"x��Ox飫KF�^
�u	!3�l��׼7�K�vZ�zq9@
��H.��C��k����t��?fRYPcu�NR�`oZ�6�E�f�AQ
+�{[��G��_��r�
+KYG^pC��>�"�Il����
+!�
@"����]	h�2iKy��Le��
+�lori
+�Kb�m�pw�4�/N������z+[��XK��Ab!|��X:Y	��&7����{�O)|B���7.��r2�빿7��Ϥf��S2
�����ҥWQ��
P�T�:�
�J���Ns�,Yf,+�
�HUw<��=��s$�y`
L��R�f�If�t�Ԉ	G�c�
�h�����J%�C"�1�;�h,�N"`�6����4!bd���2���2��!����
J��pNT�����hZ|�����U*)����Œ�ja"��(��8·�����!�˥à0
�4V���k�)�f��	��o5jO�Dw�D��آTwEI����~��%
+yT�HNYf�3��)ĩp�\Ė�N/�}ٌbOBr�V�R���'��R���(Y��+�1i��+!�
ƶ���.t�3^_G�����|#M
��q���uͫF�1떆�>�#�o��<��R'��b�
A6X8�c�C�x��I�>όv>t�o
��T3,�;��h�}Cui@�RI�H@E�Z&uv�@ɣ��I�A�
�n �K�<EV7���%��-����j{��q��1|<��,z�($Q6ն��
+
s M߲���K��a�qۈ��>�
�c�_,���B�$�i��iI��@����C��mZ�'PWZ
�J�Rz����Ϗ2�����q�u��U�u)fڃ��x-�
U	�����({.���]��3�hkR�l�g�U�i�b'ޟ����Z'�.�u5	��Z�S�3�A_v�2�p�u��Ve�ߜ�:���ʱ� P	
+AF�����Rn��D!��E
�\��DhdR����,�(	��U���kiK�J�d�&�t�Kg2�4�OW��&'�������u�ߢ��EI�yݠ�j��vXo��IK����`�	(a]�~�.eB���
t�T7�d��q_��kTs����dxi��
q��.
P.�� 
��N'v����ܺ�
]�	�Ͻ�јq��ޒI����/k[�$\a]�B#P�f ���h��RM8X��)le�
�b1!�4��b:�
FN�&�)P�*~�H��]5���+��c�pk%��ڬ�*��0�b#�쎶*�6�屹
wb|U��&׺IŸ�բ+�=�R�s	ʒ��4&^��}�����}�V��#��:q��$�Қ�ֶ�
+�T�P at El"�sEɨ��ĒP	9E�sJ���a
"��,%��Hyu��E�B��b(��2	�e�\Ң�e1���B�ii�R��Y�&%���~�t
�s���V���~��ď�θ����M�/S�T+�ҷFk���G at I��uI��mC@�
+��N�S2́I�*��U��i��8ӏ�s���Ƹ�s1n�����Jpi@��TTF�.
�&��i�6(�T��.�k�.
0%Y
ZJɂUS"2�)����o?��
+��
P� %i�%�A
+Չ	�b�A�F�΄���|*a
A|O
+cP)J��[� ��
5!V%����h������
�qp�ر'��0�JI��0��%[����,��ߟ<�츄�w��.%GԥZ�
ej]�����
ri3�KM����0y`�ɗ�ȉn�Ռ����&H�����cRa�D
I��R+2؛fn)J��7�~
��P��E!�3l*H�SlYJ%���)K�(D/���"�z�$I�I(K�(�+�M�XL�d%O�'DR$�ِK�]
���m��u�*�`���C$
+�Iu��u��t`�)��샄��EP�2��<�l�{5
2�Y�H]�IC>�jK[���x�n�{2�׏��쯰9n>�
�0���L�X��>t¯QQ�$�A-�i�F()�~�$>��`�9*.�r`�`U��9}+;�NVp�������J$�	%�^G+g�-�F0a��A&����'R	*�6G_�,Bb:EeY�1L(!�T�5籕��n����Ņ�J��@4�r!�����Y��C�U��y�,T��u��%�{�%�
�bS)��.q�V��5 ����#��/'��>�	m��?�iJ����6|���e�L�@�Ȣ�"���%�Y��~��� ��'*�+rJ�W�RD}Ę�����E�q�I��18&�ahCQJ#p)$���zǬJ�Oq�FW*2,�	��#.�3�
�F^9�x���:�gܻ0�1I���uWo�5��4vy��y���n
+�/���z����^A�D@�\�\G�D�>b]*��0g�kǥ��ʰςi2�y��s��'�Ǹ�0
�L��Ȧ�8��.J�BiD��d5΃�.�
LZE3*N�dCX�0a
0�v�,��#���u?�Hb/(%�)� �N��K5��[�go�3���|*	�M��F�2��o,��B6���鸷!�c��@�<p
�C�eRi�!#(���K ���;>�A�F�Q]R,�u)A]��ja*5U��
��f+6&�O
+�L^er�^��匵�|��׎�ԩ�h��2ߠ&Aac&��� 2�+E��u2���D�������ds�
n .�H
i�Rr�E8�4N"۲V&A `�Rf)�&@R��ڕVa�F��ҕ6
K=�v�q���l�������&�8�Ĉ���
�L%q
ֈ�
�1��X=z;���{x	�r�B]�\����6C.ɘ�з��D;�t��

���������Ÿ~�/�Yɴc&Q0�4�7�A��4
�mH��S�N��д�(��`�����xG,��JD�e��-��;�V{�#/��"�
��s�<z�A�.�U
JU�	���I�&��T�*�H%b:�&Lg(K�*^�1F���g�ɥ�@.�_����d\+�KiJ��$�8
[��R��vǓ%j��~��A]Z�0F�]E��ܖ�H� ���><��
\(��Y-�B��yF�
��̪��9Y�v������2�Kya�T7C[���$��`ߴ�ɘ����-�m�|G��
+��t1�vi�q��0zۜI
~}��bo��ڰ(ىZ,�iY�B$�HY�F ��ny*X�&��V.��8߽�D�
wSۮ��T$Yt:f�'�J�i��iʖ�iΥA�d3�<g���ܺ���4�c!M��
�$�,���L\���������PZ��'
vPv�r	�h�R"u	�1���.�Tgţ�~�����c���}�HI~Ђz�WS1�6T���(uH�P-�i�x�n�PI�қhN�R>��5
+�
��#�a�K������/6�<������IU�Q�JQ��@M��	�_w��S����u*a/�L祖%�P���lK"�F\����9�q�P&�5�����Ȟ�Štd��N��O%OT�.ai*�.AV��=Օ��p�0\:;Q��q�=0Y+Su����+�
+qd-M�%�2�f��36�ljm��>f��gR��F�U�7,�-J�_����>��Ʋ���T1���N1�Jy��fr�FX����R	�E
�¤CD$
�\O�TռPX&�69�>�&~��]�u�+�7�� MXg�L����dR�g�8��s&���XzX��:�O�u�dy�	���lU=�WN��:`z�jgI:?Lݟ���
����€�8a��ksM,J�bHV��/�ȿ�J������p�-�ą���(�RUd]^Ԫ:�]��� �o,�>�Q����b���@)�f�h�q51��G%�jBO�
c1�Xʒ��G^�<�
�.v ���恟�<���@�D(�r)WJ7�T%
�ޯJ�E-��u)��4멫	���\���N����u$�����d��TT?'�i��	�,�T]Ig�7+0��
�3��ϸD�J&yE)ݣ�
� �G�)Z��������}%�d#���xG!/��<߶�D��"bG:�M@�J�M)M��S
LY�`-=.��vll�>/s0]7c�?�
���K�x}�"i07�i���IOji�����<�ư���6�d���\�I]�Q���ź��6\�%��T�j�V���Z�
+gk�k��\�0P��A0!n!
X(�mU�;9�pƅ�JNsߠ9��#�J�%��\ V��p�s�
�O.�(� BQ�nP�J%�T�K4�Ț��	�>�����RI0�hYB�����d[���uG^ka
	���Wj��������(}�<
mV��&2Sմ.ui~���+�=+,�%~�1��
�
+&�V��LF_N`3��~ƿ�(K��ɖ$��iIF_]�5	�&�o�I�n�Ɋ�E�E�il{����aJN�X�4��F��aR]b#�Ս�߈�	)P�&9B �a���tx~~zbQ*blLF0�0�U.t����z�/�mnČ;or���.��\&Z�Ix]aRl�D<�Ɲ��݂5��s�ڵ* ��X��"v��a�z��s狧������Y���ui�g3xä3�TY&���i��@��zS����
��.օ�Op�,:(�NZ
2F0�_�#X���9�x��0
6r ]V0ř���1��gg���L�[��|��yx&}�:�,��&�L:K�t]�
Ԛ��Ar�<:��ņ�I,J�!
��c��'�����$��U��B�%�{9u�y/k;�/uʥfPi��76�����>gf��|�ݨ����
�����
Ku�H���Z��V𷲁��I47�>jL�mH(����(�¢d�dr���㎣��v���-==�y�0��FԵ$وvi#;+�6BW�����"r2�ÉL:���ӷo�cƃ�6� S�$��%dx\h?��/�m�3�nr������e��8ä1�njQu|k|/���s,}��:[�2�uq�ɭ\�r���O����q��oU���h.2�W���N�d�@����4�q.,7�@��|f9��.���R->LىSy*�A8	���[�$�F��
�
�DN�X&��giO��3aL��U���J�i���kY)��	���2����@�T }���ca ��y$5b@��R�t<D�c�?R��U����U��J���SYQW�{��ބKjc��
L}́��c��)�<8�D����ϣ�
�\�u]�>�ƚ��ٞ$�V�It��4�l�(�J��y�
I�t,���F��lD*��!Q&�ڕ�d�L:<?�}�n�$�c|�i2hLuC�J��
��
?�)��]�u���Ό��
+��Mg�D?e���ָ��ﳇE,Y��N�ҡ�L��.��Έ�l{�T;a����v��\����'1N%C&u
�:�2�i���4�q.���QI�]X� ʁb�Y0NЕ�l��uI#��j�}��4x���Dn��-5�I.M��A�gi�҃k�>�LYz�e��3
MH��[��
I��7�
#rc��8�:/����deGDŽPB2��J�F�*1�̫Ҩ���J�Ҡy�3r�(�D>S������g[�T]V^��D`��n;�^�������O�(�l�3�6֤R�M��$q7D�����%�)�-K"�U�s�{R,��t�W�Ftf#�[6��%R�Dے�0)�N�	L��7�\�S�DPh
0�VӚ��L�Te�A�c�7�:��I̸�y���cXp/�3��8c�$�u�C�ޖ
ָ���u���/�:��t� ��7�q)!��}2}�tV��r]
��d�I�i�}'
|��e�͔%�pC��

Ma� Ȯ�A1]�u%�&A����eB}�B�+ˮFK��
+T&�"c1H")K���p
DkUz
�����0e���QLm�HO��,K4�JjΣ��L�>���<�
-M&��mJ��(
a~u��t�E.YU���+�=p����x]��hKD�
�,�Li����ilMj�'��}u�2��d�v�$�$�OFk˸U��Ȥ>c�+�4����[���0w��6b�K�Br�d#
+وnu#��m�Z� %�Iv�Jd
o(J�I��=�<'� ����bm;å1h�^ΰV9��%�\�ɵ��ӄg���Ƃ;cR
&M��ZQ�m(-b��J��b]Q�5��ι�1��t
�=�;�^Ռ���j����H:/1�6� 
��4X����Ņ�).�Xڛ�s�H�\���L
�`���Q��4��$��R�Rj���)EJ�
+&�yb��
��	}�M(B[�0"	��h� �9I��Mo�?&�*JKr��6PbuDh�ٹ��ת�h��$q�p��r�(���+U��m!b��/��(/�/#0U���mc�<����Z��eKR�$��$�8M�g]��o�I�(���6��ei��������Rk������)tG�aǁ������7`*k��^$1�rX�
TU旉�v$�<�iM#�Ҕ�܈K{q� �cz֕ "%8a�k���
+&%�u������C//�&���R��K����\�_ƌ�[�
����p}�����VΨL�8K�8��Q\_X�gy㞀�.�a]�X>E9a�U�%+�&�9Lu����
�,{E4��sU�_Ǹ9
AO�ji�8��/�R�u�¢`�
�
<K9���df.�=��d��<�	B�g���N�#��zk������Pz�f f�+<
>y{�xW*��
���sN�
UH����<��<�"��y�M&5
+闣AI��/�@���qҭ�ꊲ}sIl
��&&z	*�A��	3�9<�����?���+K�%�bqyu���5	#k��
�ҐI*����_�;+��[�a��Zָ�
�-��k
+ٹ	m@�H����F��׊�DH��$y����e9�D�H���2�
\�2<
+�Z%msމW���4ȿ�[mO�q^���5�{&��$�ۇ�Fk�?�a_?0���H?*�R�� i������ۤ�w+�}`�;��~�a ��ZKq�P���w@)؃E�;�R��A���(�%�0��F2j�խO�����P��3�o�Cnm�]�m�$xp�f�&�҃k�ҏ�
��<d �h�?
KM^��Bm��>DFd�<I�6�G_�
PH7!��:f��N���K�]".��K�*�m�"��BU�i�DNf���e�R}���¼����Z��F�/��@2q��(jӫ"i{�M#kˑ�hxLʖL�
%;�Ep��?K
T�":p�N�/b���y�=�H"�AO�W��Ite�|�JcR��o���b�E�R�B,�$.!�
��G�ض��+#�\�j�	ׇ�E���D�$猜�k�ubR1�~�L*�z�φ����RV �@>i��E�ĺ!.qP�
3R���f��.�Ks_�f'���)@����d�	`�
+U�4T'�P/N.�9��5,4�Q9,�Ut���2	.���3� 8�"�J,8�n������I�
�d�M�؄8w�%�tF��֚��j�oHg�xp]�mr2Q1 ��B)!(%������������mݗTY#l��%�i���5&�W�K�eGS���Tj�ǿ|��3jileЖ#��+F鋝m
���
�

++�I�1�a�&�B�7`)Ӡ"�
�St�.�f�D��E I">�aR�2��M����)I��S]� ��
+S��x��2�;0�nj��&7���YR��
\�:uFM�
&uĤ�3��u��O��7�'�K$�SJ��\�rJ!��-)�7��L.	\�N$������9�^��Nj��ʥ���.��W�h
?K����A��s
+�UG�J%iRd'I����ؐ/>����6ȭ$��UG`ʨ��Q
�)��{����]���V*��x:�Ä����8�p�\*ʮ�i,6�F��8�A�`�y�$�c�∢��P
+��ᖪ��Ž ﭸD6V�
���9�
L'x���e8��?�
~��X!�vv
�L�-��hi��T\T��,� I�/v6�>�6UX�$��Rd�
2
n�
ܸ-K���"zwuxW"��H�Ύ-KL�F��DBLJk )����H?s�����
��r#�3�h������s蕋Mn���z}o�sl����#I�q��&lqʤ������/,J+���X�'9\*=�0�f�@�aS;��`:���)Nu�������j
H1���������k��nj,����J_	�5�ԅ�
�Ltd�̥
`��5
yW;V0c�Z�޼~��O�F}�
�b����ѓ�

�!v����&l����d&d�vXB}�3p���
+$!�H]E;�6����d\s4�8����PC�3���~�JZ
=���i����Kq_���
��0!`
�И .�2�}P����k�)�4��9{��g�Λ銄%��%�qͽ��Y}͐Da��$
+}�1�LJ�I��n.Jn�I�
�
�"����E��%"e�%"A'�����ضdR ��9
݀�x�LR�t�4�
��t�歘1�����Y�/H�6
+��5��ѧubRaL���}�$� J�R�ui
�Cꉸ4Nx؜�
��z�
�si��[n�jN:��b\8xh�FhT2!�0y
|�.�Ot�p�A�r ,At
��*�A*M� ����)Y�̓�����cnXj��A���d���T�qЄ��R�
N+�8
#w0"
���1�<�H�$0�aj�
J�D�t�N�u�q��}I_Y�^��藡���"��LB&��t���pb���T1o�W��#�$�Y�U$�H��KI"G�
I06Be�
i���®1�)��=���"�v�.b�/'�Q�E�D�&(�<'�-3��D��x0OO�[h^�4$�Xg��4#fh�_�
�B'�&[�����
A��-�4��m9c>
+���'-��;o�K��~�|*�ǫ��d!��C?M�
O�-���x�o�x�6�՜ת������T�@+5�I�P����C)��?�h�o��R�e]� Xt";�
��q��.>��"GGʐd����-X��
�>%G�R�P���/���@̄",q}�P�؅ �{�ᜫ�2�x
l?4��y�Q�O
Ҹ7�û��@6du
���ac*-�1��Lbe�X]#]��&�W�}֛���=�
�LW
���Hlj"������dHjs��$q[�`ҝj�B���ef
n��^��H8�eE|E�
+��"��>�H���ȜD&��'$�/� O��L
&���
��Xg��B|���*��fo���g���������nwZp�

[LZ���<���^=�G�sb.-R�4k�X<T��ځ��� ɸ�]��L�����F
���#"��#��
�8ԤF$3O�g�����
8*E.,Y�Eg\� &�])9^�1�,'<��wJ�����RErŝcF1�ה�<���Jn w~ �rZ]�R��p�@J��<&�
��&R��$1 ������W�wEi?�`.[�ZriTaE��$�AZ�c��-q���gy3��L_,0UX��vtvO���d�2 ���D\��f|�#��Ԥ�L���6�����kK*u���6|�
�h��"��"@���Rp*>	a#���=���������4�E�o��<�*]��5ŻU^��j{�g۞c�<�t*��"�Rg�xs�U�d����-�
n�&����KQ�as
+@=
9д(���q�|x�P
�8�R�d�q%�@�%�-����J~�
؅OܖDt�K���t��+}S�9����v@@�zS&��6�ҁF���e�X
D�
wx���N+�0��}��6m�⽁���@r��
(i�4�{I.w����/�ܶ� �乏O�7a��
+1E��(�g�N�NOsHIN,g^
+t
�t�W�
��ſD�W�K�,�1�/L��!�z٘ ʰ����f�#��`�ab�ɞ�
׸FG���]W�Q��KR��6"	*�mY��`m�In�
�d��"q�-* �$�M'␝��=�X��I�$@Rx�H�2�&��pI�t��{��`Қqv5�4���I��m�&$�Wڄ$c�ebפ]����/����Z��s��
5l��L❁�t��:��u75�@�15�k.�U�g��@N~YS/�
��Z4�O�+r
�V���T� �;@ԕC����0��ߐI��/%Bi�P���K��n
B��p�cP��X��FAP�=�;A�_0%*H��	�
�� �&������B.m���L�u at W��A�4P�&4���ah1�������H(b[�0�$�Hm$����B�[!����Iҷ�LZ��SVA��8�7��
rH
��-BL
+k 韏��@�-���B�h�=�����3�Қq��&G���Ģ��[�g�!�d
��L`2r���P��p ���Ժ
E�ri$.�C	 ��v
+-�S��l[����}�u��YݕH�$���qM�2�e��P���s
+#�.K�r�-
�]H�н�&Z��C�;�� Kl~czL'�'�O�*�	�~K
�uE��PZ����R�l��i��KQ�
̥]�9D��*��AN�d��
�A�ru}��k2�+|#�R��RR�ha"o1��\�2Y2���Mh�00��]&N�
���Y~hd
��<��H�$
M}�HR�d�hc&�$n7�l&�@=�Ri
�4e2������'2	�T�
�+���1�]������Lp��2O�f��g��̝3�_��>�"��4�W�;i���Ii��L:M��h��
+�.9.��l
Z |�7�;T��;���Z�{��>��q�5�D��z��5Nˀc�7(��7)�2�
�������L`<��}��S�~"8��.<b"�
�3����
^=�N��v�-!�RN�Z� )�H���
+b��i]BA@ؒʄI�9Ҧ�[
3�d}�ta.�����D`���{ S������Kod$*s�A�f����!:�M�~bk��#��j3��5	�M
�</|��"��
BE%���ND���4u~"���m&m6�$�{���DS��
�{���H�1\&��\͠��7��
}g�E_'���t�H��ص�a�I
u�K��}&\�% �>K
��	�d �u�[�s]v�9���Ÿ�Lj���}��r�RaM'1̮Ƀ��w�x
������r+l�m@$E�2	�tSZ=dSz�b:ٖp}�)$`RA�F���@A��
�0�@�BiJ��W��ٗ����V��]L�21�j�&γ�gL��k��:(x�tx9��޵���RG�Yl-�-K�cI�&q��ä��C
+ܖbQ���D4���2;�R
�I��|�L�R�ƈY鮓ns�fts7�-��k��~��'w�Wgn.�ua�:2);�_��ߴĥ�/5��6�NW�n�:=�i"�{z�� �Yeg�[�N��.����̮Q&m�ۓ�.�3����M�� &
�K���nW�M��i�M��\'>�g
<�4u
~�Z�A��n
<Y
�*_����Òp��
+��
�	�U� 
+r�����
��H�LbHo�՜ yIf}�ris�Ѕ���IV��dɄ�b��(��[��ZvU2U�R[1����Z��Z4��I�&m%�P��1i��M�*���n"*����D�GG~*LD
��'Z�gi�'TI!Ӵh4�g�m&5#|
�d���Bs�_��iZ'��6��z�I�ƼV+)&Y.90Y�$։h�zS��>�
K\;u
���䄟cR!�y��V�϶
����u#�|����W�9�}F*a�nۉߨ%̤�b����z� +�>AJn�`w&u��)KJ��H�A�ő,:O�YI���\�`��~�9&A��52��_`�'��
c
��^3�>������5�7tY
3-)��8֊$��ܬI�O1�+��嵟��
'b/,RZ&�*|�
^&�q�\��j��������'�Q�&�.������ή�7��c����O��G3i�>�ȥu�۶���	������u���g\��	?�q0W5X&iq���斃�t�%�� 9�./8����S.y
fG<�	D	I�p�
~��&��XZK|Ӿ�1D9D��K��
��!���
z��&�l�u���.���\!��]�3a���jdS40�6����
O���Z큦�A����(��e�-1�������2kR���t�~)�V�͟���H�D�4�ڰ��H ���
�d��׾h,tx[3�
�Z3�X�MOo�15�]�Q�ۙ`\Hƿ�I����GJ�[Ն`��rO��]<���.�7}�Ը��
o֤"Zf�oQ~�tkM+t
؎|7�U��<���p�ٟ���6��"�
w��_
�A�i
@��� A~_�U��X�7�$�
S2k��Ykۯ)__Ld..��.�����&r8=ֺ���+u'v���¦�uB8!�0�,��]�%���ۜl<FҟgRF=�����\z1y�}�TE5�k�	|�x��+���W��gɄh«�{s�fU�ݕ�)*ȣ�n��`d"�,��dtL�.(eݳ�%��3R
�j�kk�>���n�Y�Z�͑t�Q�ָf/5N��I\�enb��w�?G,IT�ۡ�(�1�P�9���-�f#��� �
�����H=
�-�D���4�
�����9=����Mi�>�kg%9�����ڇ��0å)�*V?�0�9<�&;�0f5J~>
�
�YOF�@c:
�Z!�$��\�$qնH�kRʤ��m��-*��Dx���q�Dl�DldM*����4*3
���J����g`Z�Mn���3�w�X<�K@�D��n�4���2��S�H��P�L;�ΙȤr�֔XgF��3�dQ��1��k�H$#��Ը-����2�Ϥi
+�b]Ƕ#4���덇ǟE
Q���p�$�<T���H�)D1T�(�SA>�G[P�� 򐞌�=o�K����lU�7Y��Ll/���?Dщ<F����Hv ~_�8:]'�"�0Ѩ�Q��f�%DbwQ�������3iIW�)#\�t"6h"?�)�G|�s�R4��TƚQejFo��9/���z�j��Wc.� #���u>�&�&�
�iuE�[@�����&ښTo���Q��D�F3�K��;�ָ��V�����t�:
�B4m����vWO|� 
1��.
��'-d��p)�\RR3�X��ף*�)�����W�/6]��`0�����Ddb{���`DZe8�qU:j��'�?�,���X�б
����H�$�ђ$��`S&��4�r�y�(�d"���~7�HפUr0�o�tX��c��܏IeO�{��������y��m��-��&=J��9�����G2��:���
+�=��;
龟��8�*@�
��
��2���I�gÁK��D&H�Y�Oq�g�j�lHI�'}#���$\�`=D���
+z��
�?@�Lz�;%o�e��IFQF�Ì����<�@#8��ǂ�PZ���$��
+ӌiM
rL2�B
SM���k͖4�&����9٘K��D\
��"��O�ڮI̢�g���6*M������j\��γV�,��8�0 ^rz
~�T%U�J�lK�	�����{��-�bz�k���K����������2��)$
�aW�/��ebrnU������~Q�t�
+ё%�����w�	���8{�V�I�si����L<K�E�)�޾
+�4�ܚJI�#ڋp
� r~��������>+�
�EM�^����(�k��ˮ�v��8s�a��
Ff�Y�>
kT���6��ʕ���
+�eF�4;� �/�H���te*i~'��)���?��.^L<�^L~T�,i�$ɯ�D��%�ù�	.�i%%'�z:I=�Hx;����ՔDG7<�����q߿	5����o3�XV���C�tA1�$�~�·Yذ�`�C{��!���\�"����::Q��< �,؞-�b[�`��af�lRM�M�0�ؕ1ٛ���Nb����(3P]��62u�
}��d�b�$*	���\�t�ĉ��f�w"��A�wT*��td;���.M�f�,_�5C$�Q��=�O���D.�b�����N�O�:z�����L��k�N�6�!��Sl^��_��gG�\��.��q��$�q9�p�I| o��.\�k���
y�7ܥJ)��p�`
uޏ���cC
� ���9���;�ůL���.M��"S�b�H������
���yׁF�r3
�=����zVIY�F�$��]4�G���D:�t�rTe�|T�4��t�䆥k'$I����}�m�
F����ɘ?ʤ��� eBv(:'DG7\����H��
+	���D��� ��"�m1Y�,x�
��T፮�,n���^�ݐ~���H���LE���6��&�MXNW�
c�n�{�r�����bu�<Xa��F�ti���5i�9Jx�{���ى��>_��$��5[3^�$}�A>=��
�{a��X'��*��V�G���p{
:��
+5��㻿#=u�Ư���g�8u��
#�w�Ð����X�8o�ݲΤ
�~���`��Gΐi�h�N�n/�	��	��|��_�-��(s�y}����F��
+Wn �����Ђ�7��ˬ���N�s
��VRp"?5$��wn�g�0�
~hV�I�(!<߉��a�"-��i�UV����k����ľ�6H��
��5�0>�ƩϷ&�u;���D��9F85�7�55��%C���֣���߇b�p�f2x�jB�
a1�?��~�yhro�D�<X�,RH�-�
�r?���&�"��bB���������q�4qT�f�f�3	o�Zzq|�����o��ܩ�UW��H���	t�K��v�;����^��u>O
玱7M���7�Z�CvԐC+C?���
t���W&l&RM8Ϯ��,b�1WP���K��
V��\�L㍔�����x�Aw��J�bw92*1Me͠Q�aI�Q~��.q|��S�H�wœ1V��}��?n��;F'Ŏ�{��]�5���@
o����
+�Eq[Ѫ4��cS?����[�&c��k�o&_M
0 � f��Rf83�
�[����M2���`u�}
+Io$�WK��Omy"R��٥��v�x�7[�[
�L�|��A|'I��7�M�I����!n3v���rQ��+|�ƭ��,v�;VN�>�D�k2�����GiH��jX�F�O2veB�D5y��ng谐Y�4]�
+�j��n�GJ+� �k���
!��BZ"�8	�J}V�$y���j|�mbg���*��W�l��>a� :*;������Ư����
1#�j��UƯ��Mn
��5��q؏j���i&�
���0ǘ�
0
�1��r/���6B��,��EI���|��>c;(q$R? �D1uQ3]H��$c}��\|�\d����vJ{����f��G��m���k�^@s3f*(y�)w�y\����O�ʆH?�����#�7Dp��U�b��9� 3ԧ�+���	��:�}�
+i��Z^��~��DLj$�O��I��Q� �$���d|$=��ns�m���:;
���)tr�?�)6�5�qՔ9�;������������
�����ܯyd���.�+���A�8��͉�z�QTY�,W~��B�p	��շ+{ � R�GC�-��Z3�d͸�I�(1�T|GYH!�p-�<_���+cv䶶Ս@G��
�.ָ2�W�� ���t�����"���hH��
I|�C�.^M�@0�1�1�RXF�+
֕������{t5;>A�;p&
+�G{�\��5�D)g���P&>�
����6U��T3u��)�]b3���<�KXh��M�Z�
�
�!�eJ5�@s���B�Q҄�K.�s��Qg�.���֕��k��ykF�g�Yɲd��)�ı4���UW"Ɏ��!��Žb��}��w>KB{-��RwoH�w�fr|���rB�(g9�|�{�G����u��[���?/1*�5�(I%�^n�`Ldw��+O��>��Y�G�s
�=��-	Meph��;�{7$�8]�� 0���
cYDZ$��=�� #2�J��R��4�ו�]�$I�����2ѹ�:����w��R)=(v'�V
�C�W�aj
���4�S��FK?��܏��YUv����#�������
Y�LK7�hv�S4里Yf�Q���+
�mL�z�]
�w��"j�5���O=O5-��cudž$�.�����H^ޕ�~�1
��hei�C43�r��Y"�t�#�JoU�D%Olu��Ql�B�Җ�R�Gj�稥;�#�#^��b���蛎�
Z�m�X#B/U�����<I=>���F��cVF����o1~��+�� ��E�
���@>�|M��6���	s(ɑ�i�e�]f�cGE�0���,mҦM��k�Mt�	�J��O?97�6��U� ����[ړv*Gg9S�YڝM�f)�ו/�M1c*o���
��*
��$��Joi/ګ:#}���o�
ʟr��bδ�
r��5]u����&�Nm���Q���vl�TS�
�!+Ѯ��6��0�6�-��Wѡ�J�n�}��V_����%#>uc��F'ɳ
��+ш3��=��_m��_�4T���}��»�n��f��_����і�m�����M�[X��-����?��� z��
endstream
endobj
289 0 obj
[/Separation/Black 281 0 R<</C0[0.0 0.0 0.0 0.0]/C1[0.0 0.0 0.0 1.0]/Domain[0 1]/FunctionType 2/N 1.0/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]>>]
endobj
294 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 1686>>/Filter/FlateDecode/Height 854/Intent/RelativeColorimetric/Length 215908/Name/X/Subtype/Image/Type/XObject/Width 1686>>stream
+H��gWTIF�%v�DI"B�Y	�P�`�
���?��9Uu�n�n$\���v�֬�f������͕d��L.	"�%I6'�>D;��9E�A0�k��/� �!�p��m[ٟ��xI	A�"�
��!�$�%�"����(o�:Დ�Hb� �%Y|
�R~��'�	��xEB�S�!�pjb��-��<�i_�vIA0�%�

)C��%{�N&X^D�i]�F��D���
)�I��,
]�85!�ډt�%#�!��jHy Lb�P�DQ$�̵�r��N�.!�M����7�o1D(b�6ɵ�8Sy:����F�"��v�q�
+�"-!�"��S�z�����=ϻ,]J�	�M�!e����I
	*m�U�P�6�W$�5�R��I��I�.��U�,
�:�!�܄b$�8G8�'�֧:�?�o\��xZ�l]J�3	�K�&�$�
9�"UAEt��0E.��?� ��(�l��oF6�Z�'��ϧ��%ɒp)��m�!�M���9�!U�Lb�P"D���&I��yVg��
���g��ΎA�NH��l
7)�32��+S\�����;��p�$囲�J���sἵz�v!�D:�2%�$�$ϐHEr��1�֌7;�����n�'
��d��5x4�ľ�T�w^�t�D:��Ry`�yI� ջ�����&=ݸK�\C�"#6J�p�oJ6�X��9O�s��R��3a��H'$�/J~C��ͦc�*�4�gH�"�(yM��©"�nJ5R�����O�W�'-�?ݦT���Z�����Pj�G�k�I)6�Oщ�8�
��2�L
���
�Mb�od���������6���iRڹ]"�*$KB⸆x�T�"n��$kH�rS�7]&S�K�%���a�j��}� �j���h�td�<� [...]
MR�
IR��s�:tE"
���$��B�R*3Q��M"��7e��:�.Ýx�7�JAV��;&��t/�1(�	���K���g5I�6U$e�	��)b
i3��p�ؐ��!WC��"B�R�q�$N�F��kJ�npWѓ
�����%d�`
��"�0�5H]�1Β('\4W�qf7�V�6)hH~��uQ�҆�q�(L|0�.�s).KI5A�s�;�%m
��&)ߠ�Ƣ����L_
�C�V��c�X;���K��z
z����GJ��(Ur��lK�":IT�N��ʐ���
Q��!�mz��.9�
7��*g��3P��fդ6���D��f�L�>�W<�G���c�M��#� 
�Ʉ�t	��d˒H'\�Q��Vcf�1�� A.�ߐ,�8��׆�"dʄ�)`�K�%���b��Q�JQrf�g\[]I��H4�400���c��
v�ܣ6�2uz�56���\�eI�� f��(��
�KA���C��!}�4�|�x�͟�2��QD(hQ*E�kR�IR/	��f0�&Fr����=yH�y�α.$]d���pB���`�L��!�z4��ߐ��!���]nqY��&<q����q�$��~d#�FG��1ø����������|d��&��A+����9�tI8�T�R
��x�Q��jcC�z��!�!Cbq
!E���L��x�Q��\
+
�rnBQ�?��(����M�I�nÔ#�l||bbb��RLG��wxOB>j��� [����%_��S0�'�
+��FQ�����w�6m)��9��kȤ2d
y�6�!M7u/�\�!
�P�ʔ"R%��	U�w`Uu�7�8�$�u�
M�g��33O�S0�
z�Ogff !܃zHk��C�x
*�,U�,I��
ƩRx�546�ن;	M�jӣ
��FڐmHE��LQ�<Cx�q�:;�\r�
nR%�p�
�U556Jm�l
�@Ǿ���mP
������/�g��H��n~~n�|�m"�H;�����%��f隒�=��:�����"�(�9Jf�Q�
"I�H�S4�(D'7d^E�!(O7����Ҍ,��YC��ƭ�فוr*Jzb�N�3��419=�=�_ Ŗ����W���y�
=ZY^^ZZ��T�٧�
��������RT��SP����\J��RgWw�=�$�6$��E�#Rd�q
�Pd�Q$	�id����s��MgI
�
o�*�
h��H���&�!I3Ofga�"�F������oll�0����;�l������Bro��;h71��%�,��RY�����I=��qO%g��(ݼ���y���g�УZmS�\$V)"C���dSd�!CVؐ*O7�-7�Kw:;t���&��@P9g�9J4{3�0n#����g�V���4�����������y
	��7�[[��d��:�G���>��ut/
�t=wy
�,�)X��I=��	�J�"6J
�wh�=�ly�3iz�)��e��:RC6�3�B��!k�ޖ��h��`�r�r�C��8KM*Kl�/Kb�P����w�QN]J<��q�$���`��M��vvvww�����7��Ox�����C
+no�<J��������K�CZ:�RsSC:Ug�$U.�`���V�J��ij
M�j[x��̛�A�vH�|
�gCHǐU
+��4
y<<48p�����d	í�"U
+
���T"�[(J���2ָ�yn}�t�
������÷o߾�~�?��������ۅy�[�aZZ\�.�
f�7u��9�b0U�N���UUյu�tCS3��ޅ(e��69EM•�|m��5�����3$�"�!֐M2duyu�Υ�������pC���w*]�S��
D���
��}��f 
J�I+�$�F�

�4���O���>3�F�?


��GH��}�aZ��ia���(I��t�����!U_3��zB�4Dﶺ�G�v;]J���A�mS3ܤյu$	E�d;8D�H��
�
4iz�a�.�r�gtx��t��C
��n�!�!Ba�8g�����Q��C�
��P"�I$���>���T�d_����~��c��Q�H?������(x�޿;<�v��7_n�^z6?��!K��,55��s4�J���m����T����UE���461��FM�j{�zw��M��ʐ/Ɛ,�x�
[C��v�馺�sib����Cd�ni;�*H��P�h�ʨJzB��Fށ�R���Ԍ2����kJһ��
9�i�}����ϟ�~�������_�~����
���}>�����aҽ���Ę���h
+�45���sT�2��pA8�x��Ԩ��z�����44�xlr��ܳ�n��ޛ÷�?P�H4�3$�"�Y6�1���gS��F�
+�K�b�7��HA�I�%�)�B $�.�����r�޹��$�(���e&3����|̚���ښ��r"^B�%'>��'hi/܈n{V:ƭ��io�9�@�����'t`XD�e`*#�9�������G�`&��dr�B�E�}�ыB���e2����xM"`Wͨ�����$蠥���B._<���#��S�c�[�ߑ�>!֩t���K���m��l)�'$��ef���Ie�U�P���D6��JBE�L ���$j�g�V/�dg��$&@K7��Í�7!�J���
�d7���Bãb���Rz������� \������h��]�J�J�V�5M;��	���T*% T�e����	���TT��4;3-%QXK��a���c,q+�;����C��S�]F������Rґm���ITm���Vj6���=BAĎ�n"D��Afj5���K(7̥��������l�����@��
�?�>�\rԁ@.�,u`xd����2�1��K+��&$��S
+ܔ*50������tz���݀�	�����z��FMn"3��uՕ���\�N���ب��`��~HAO��������TB�yQ���.�FD�^�NK))R�-(*)����$q;	�F�h�6BAD�!�6B0����
^B���de�&�Z�an>�/7~Ny6���$L%߀�A@
��I)C	�5b&8�� �N�
���a���^���
�������Ѩ����5��k�Z�s3�JLdxȟ�9X�C��_<�/����T�

B���ۮ^�y'�abJ�TXTZQ]� j�j�)`$M#��J��_�/�Vv+�DH
+����<��(�b��C/�pcc��7+qD�9�9Z����s4��b�
+
h�Ry'8⍄4�F�F�i�l
�?���l6��LF 8d
��z�5S�D�
1H�1-%?z@)x�� c�g�9Wn%~Gu�[�u�?�����TB�]��y�>����$���V����FզT�h{u �0	�����@H��OۣVvɥ
��R}Me�UK�	�p
����i�
+7n%~N|�V:��bE�
S�?���K!a�1@������
�2���S(U���fk�lbbrjjzzz��
�>�ujjjrbb|
�G�]���Q��.�BGZJK~)
r��u,y��������8+�Tr�n�@�����{���{
%��R*.��mhjK:�]*��W�?h@��Fa"!� 2�a��!� Dߧը�%I��ڪ��RzJ�C
+�ب���t���]K6B8"����BRr;) ��t��
g�Qfd	R��P�H���$���6ئ���ܜ�2?����	��-���,zP��8l uj�B�A�AKE�ٙ�I	���ֱt�۞���J����t�Y���
�v���u�ҭ��	�i�Or
�˪j��m�.�Fۧ�hC�!3!�"�Gȋ�i!CH7򒬳������
kI�����p6��1�l�����s�s���
� �\�����
��=+��aR"���a����$�4k�d�KK���+++����.---��y
ț��7�F��}=�n9A�P[YZT�4+#Ֆ�K�Xs
��J.�J���
���q���T��;�&�fd�AJ
ͭ��n������<>15
Y��Y>���?1�c/u+�qsc-i)�IfZ���nֱ�Gc�9���­�ω�!w��J@Λ�;��\Bu`aq9��@"�0
�&�p[\"�VW_���y��;�>�y����zu���2�[�̽������Z�R-a-U�>��y�.� �RX01�/0��)77�J�8r����Y�J�����v�v���{
�dd=�/*��mlK�
+eO�
NB�AIs����p�@ȡ���,23516jʭK&�`-�S��$>���R���=B(�!
~�y{V:q����5	���"��TJ$�
+�˪�D-m
�@"�8:>5%��� H{����������������������o@ޫ�%`7Kԙ�
�}=J�`kS}uEIanvf*R��Rd�>s�6�Np+�;����	k��{zy����w�m��O�V�`)I�]�
]��9����!�F6B6%d��vm�Y\��t
1
�j��ReY
�K���4����x�v �#��9�7+1��
b�JɄ\Q:�E�)����
#&�Y ��
+Fz�@ڇ�;;;�����]�no��~
�AM�IL�s3S�f�� ZP!m.��.�LO����dǜ������ĺ�/ ��E�mqB�e?-(���oj�ȺTZ����LNB�!� �
 b%d�PBv![D����K�҄�4<�ת�e���
+�'��{c)��� n�pD�9��[Ɇ
B�/ !
}��{�r
K��
$�~���
�����`i�>}����ׯ_�}��_�×o_�����O�>�[�o�V�%�,b�8<���:�[�J���d���Ę�t��J^
�9n%~GrVra��{x����-�6�r�ʪ�D�ۥ$��ad�����e�$D���m b%�
#� D!_!���DȻ�ׯ��f&�G�
�^u������-�Fc�Ƶب�F��o"䔛�@G��s�`��Ǐۅ��_`��K!a�1W��C+r�u"t� %�����"��v}�����O��0���Ǐ�?������/�~�������+��3mn�{���^L��HKJy��R�� 7+#c�f
1wY`���/ϯ��5���:�PC�^��&�WAAD�"����T��4*
+�4�I]@@��{�����I�8��O�]�u~����ޏ�����Q9r��~Z�(�������
EAIY��`�n��stt[|b��7���k�q���jC��>2�	�L��^B:����G�k�+ʊ
ne�p���p
�c�����H_��A��()�#B �BHD�
ΉXIrO2u�
M� 9����
+
�[X
R�{���%vROo� ��B��9��q.�;����q���X,��CԽ&��-�eg���\8}*,��������'sTsbb���
�D�$&�V�WPR��kh�n�����
)i�2s�j?{wRGg7(iph��"���-!�&����ҋg�j�U���ʼ��-&*<������������������U`%1�J���I�Jǎ
 ��B�  ��)D��9ť��
>z���9	�
}7�j��)�������4�›���9l0��� �R;�i���ܬWR��X���vwq��<!`� EVF��1d�a�������!G!b�`%Y�����CSw������?�d�켢���4�|���	gRAO@�>�`BxB�!�}�=�ܚ�45��T���Rr:�|<\
m��M
���
5UeE*"DJH�!$"��������qpq���8}!���w�����H�U+��?4�z��p��G�3|���������� [...]
5��(ܮ_IM���
+
��ts���05��a2�4d% ���C�]+
?��J�j���v��
>������
+KrMp)���
+DNG�� ��������ߋ^�������<��v
�����\Ku�p
+޸
+�0��u�30�JP^h�㤕�
��Z��J�TEU�S������$t[8t[�%���e����Rjim���
�j�����,bB�A��	����KPn��-��������������3����.6�'�
t�4�i*�
+��J!���
���J(�
M
}CA@��/(<*�r %��C#�I�)�
ᶴ�~eeeuuumm���emu�}�
p�M��X��=���
=�E)�RZJ0B0gA0�KP^NVZR����گV����+)���Z��m��.�>!���RP��Tܫ{�Rk{gO�����;95�#		Y���&d��K���`?�%
n%Eyp,]�����hkefb�����������$�D�P崙 ��d䐕htSG�B����8� �\K��ì1��$4 (	�oe@[_�������(:x���X_G�"� �3��q���`��^<m��_Yz;/�ƕ���\X�/b�3'(A
+bN\L��������JRҲy%U�������������o`XdL\b�����eU5
MO_�FR��65�%!#!B0"��""B�""dj��~72����[��ₜ��KI��F��z�9�Y���ik2�T�	B$BH+�;���@N`%i�`%
������
 �z*Z�gЁ]�����8p��
���ӧ�����nk�ӧ��;����I�nx�����H��;9�s�A~^���
Q�{���#�#�ON`�#�XIYUM���gdjnm����
~:6>9�Z�’�{��O������6�
T\H!�� �#&dmeŸ�Mp�XC}=�D��c)����)	��D��{�t��175��a2���JһV:BZ��a�orB+��A���5�t
�ͭl��<}�£ΞO��N W���
b��1qव�H[����wvv�|��Ut��eg�z���u������i
��Ro7J����ʲ��,s������֘9\�
+T��
XI���������J2���2M����7:aa����
q�܅�Wnd��.��}��YKۛnBJSӳ��$�$!!ۘ�}��l
�@���k7�j�ʊ�3��&�E�
+
�qwq��8a���ԠӔ!`%!!GH+�;��c%�]+��kj���[�9���
�8
��r�����e�5��˶���!����'m�������۷?𾋎x��
����!��/-���&�Zx
)���ú�������/�EG��dNP�T�
XI����/V� +�Q���4:CK���������'042�|b��̜�;�Tz񺽫���
�D(	�KD��������!s|�һ�A
np,�//)���~))�ldX�������������:MY	BZ��!�^+I��(�
+ʪj
������=��ȩ3q�������TB�
����4;��CN�@I|����x�
�����̴�rp}��2��=:��݁���%�����1Q��9�Ƹ���I+�;��g%y��
+����k`bfe����u6>9���ܢR�m�-m�=ã�	
n�
�J"�KD�����Kkp.!-q����Ame��ܬ뗓bO��y�9�Y���ii��T�!Ғ����
�a+
�c%*X��`j��Z�8@�FFC�����
�������V�SZeEfd���d�V����M�[���I���J�TB�_��s����~��Ư�ϳ��r������u�^���!�1�UzX�:>%�"ndt
+�����4��ǩ)`oc����-55�@
+�e�%�E�
��rw��45$�[*���2�FV�FX�o����壬D�y�6d����X�qp��
�JȜVPR��52���t��'(4�JE%��k��::�{�^
�����OD��I��QDH_o�RC���Ң�������`ߛ
���f�zZ�ʊr2������
�,�� B��V"��Doݍ�JL��J�`%�Ü<���KA����!x72.)-+����kAR�
���	%!�ffffgg?2.�33=0������y{K�`Y1<K�	QaA���;�[��ib�$�9(A6�{I�h+�[��f%&d�=�XX�8�y��$O�)*�i��[ۻx��
�NLɄn+���ojm'�44��D��]����y�R[s}Mz�2Sc�C��o�:ؘ��k�)��;))&,����~���v�J���+mذ�J��JG8��
��K�RP��B���oPXTBrFNAq��'�MЁ�SB���w��?� jsss���0.�ss�
�Gz	�%�-u=�)XQ��9ksc}-̜�*�#� [...]
���v��򲁎��s�R'D�x8bٿBZim%z�t�X���J�J\G��D%dN+*�j��Y�;C���$�f�>(�W	�{�
R�)%a�>1.
�9�3�t�Ђ/{ ��T�si�b#� s��6&ڈ9(A^nvV\�;i+�[íb����8��ENH�ʟ���cp���������Qq��9��m5
�m�:ѧ4<:��m��6��ª�`Bp�}��|��p�C��܀������Q�A>7ݝ쬮^�P9wFV��� 'i������QV�HZ��J�`%^~!1	9Ee5-}csk����+*�W	�����
FH77O�hqq�3��H�7�qA7�v|dh�JAx���
���%h�����$J����.�Ji+�[����F�J��J�s�
<..u��9�K�W���o��E'�d�G�V��
+�������8�m!
��U!�
23=���
=K���Y)��a����;_�65�ոx^ᔴ�q�cG9�
+�������%+m"��Y����W at XL���
j��&6�n���,(.\� ���D
�2�"��ڗ/_�2._0z 
P����x;62��׋����ʒ���Ԅ� ��<FV
+� �ad%f�J�h+�[����&�J��J��JB�ťO�9���khj}���-���Ĵ���R�mO;�z_����p��,����!'L�Ǚ��~7x��<*+��NK�����p��63�Ӽ��pJF��X��3e�M����-[i3i�=�J�`��'��^P�1�li{���'04:��꺦���}�Ё�)MS�!� �o߾}g
\�!���н�x36<��e��-
�������`T�V�F�4Q	JA	��p"+�����5��6SVڋ��V�>�p�����������HDlRzv~qyUMc
���1�)�l#�
!�mUDV2�q���5�[{KcmU���{��wn�pu�17��RUR<-#.
+V�BV�GYi3m%z�w�Xi?
�XIJV������K;'���Aa1	�Yy�8۟wr#co��q�/_1l?~��'������[�����P_OgGkc��������� \��ƺ��P��`%(A��~�J[h+�[�1Zi
e��JG��D%dN+(�j���8�ܸ
p'2�^����յMm�:{���ې��l�F„��&�+&da~�n
�ۋ�gmMuՕ%r3����x�:ښ��k�)+�>)!*�ϋ�t����J���VXi뒕!+	���ΜSѸdx����[~�᱉i��EeU�
-
�
�Jo�MN#�H'}ǰ����_���O
��E�[�D�uc�*
>��q/
�����Y�`%!l������V��F��J[)+�b+	����T����m
]=}�F%$g�>(��n{
+��
+��-Hi�#H� #�sUD0!�1!� �fp��g�����'�J
�2S�C}��
�,L
�Ք�ʁ����Xi+����J+m[��al%q������L��:{x��D�%���?�kj}��������	ԁ�8BJ����8;�n%tӐ�#C�/����'�%����o{�:ؘ�����+A	�V����S+�
AV�+)�i�X�:�y��F'�d��>�ihi����G���4Hie�F�
�܀�ϟ!��ތB��v��4�T��g�&Ą��t�fgy�@[�XIR
Y��}�J�h+�[�c���%+q� +I�+iꂕ�]<���D��˸��aEu}s� ~��ȑN"��̄���+��f?L�g��km�A%�������hkn�%�('��ĵd��L����~���%+qc+��+��X�]s��
+�NL��/*��ml���}502NvH� d�H�#B���25���]
mM��ˋ
��cƒ�n�;]��l�V���V�^�m%z�z�V��_���;�����PJ)��c���j+=Z��*XG
-R�P6({�7a�f��M�
I�ޛH-����v���}�g$����������*=�R��*��7hȨqSf�[�j���]aᑱ���!�e}�����(��v������^���s��9+��Rv����c�%�c��5�̙6���{��*Y��]%�t�Ԏ*AO�*��T������V�z���4q�������=x4:>)�LZf��n�~Ju�l�'r=�D\
���
n�g���(?���3�I	����
޴vŢ�3&�1x@�J/uuU��=Uj�5���[�*}�[��wrU�7�*

=~���KWo��{�ᨸ����+,)�0�s��$�����ՙѹO��r{s���⣭K0t[���
�*}4��J�%hUɾ�*��JP�J�Uz�T���V��cUiъuA�;�
���O>y������Rs�]�r�s��"���s��7��T^V\���~�drBLdxخ�M�V.��4v��J�_3Uz�[��T	w��U��7�U�կ]U��λv���Z`Ui�=�D�
?a
�9�!X^i&W玒���3��VgF�>�*J��]�7gUɾ�*-�;}�U��}�rU��'|�ԁ*AS�*u�V�'�qU��>v�&͘�xźM�w��G�$��:���[XRj�+W�<g�)Rˉ8���p�?Ke%�y��N�$�D
޿{�f�J�fN��Է��ғ�y�ԁ*�ײJ���s�3Uz؇v���ٸͮұ��T��/*��2�s��$�3fv����ܧ`u���7�aUi��u+�*�1�T��o}�tOG�U���
�*u��Ҁ!#��UZ�~s�U������2��*����j]��l3Ej9�rsn�g� [...]
+ټ~�bw����ݷJ�%H��G�����қ=����dՆ-;L�RϜ���/.������=��N��[�RmueYqA��gRM�vlݰz��J�z��[���O��&U��O�����*��w("&1�[%39'JN������Z�]cC��˟\�V)�x\�����*�
9d�_��K�*A�\�>�W��CG�s�����c�I>U����F��f��r"���>ܬ��T)9>�����*�
6ȯJ��*����_�Wi��9�|�t*-#;�������tU�N��{s9��UZ2�d�*�.A�}�U��G�Uiʬ�K�U:y6�BnAIy��n��*ٟ����¼��'�UZ�`����Uz�!��6��*���UZ�n��]a�T��D�Iҿ���Y�3�kj��kY�{vlٰ�y�\� U���z�:=�T�*�޸5t���U�khl�m�H-'�\n�íe��
ݶqM�*=�x'��6��*=���T)<2�����3s
+nI�
+s��%�;�J�:?C�p�|n����-@��F'$�:���Wx+�T���q�TJBLD�*���9�������zK�RqYeM���%'I��gfg�Ό�ZSC��˟||Ѿ�*�t]�T	�ύT���{��TZQe�Ʀk�����D���}�Y
�t���T��;=�x�*�͹�*��?x��*�5t`?����F��oаѺU�p���R%�I7\�I3�.^�~�W]����.�5�*��E�4~����}�U
+Z�|�i�ڬ/Z����G�%��I��[xK�T�go.9!�����[�� 7Q�m;�
��IL9����_tK�T���v�Dbldx��`����KU������frN��$�ן���:3�O�56�]��Z{sT	w�/]���js�5]��s��"���s��7k!���,+�J��B� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� [...]
O�ƪ�p�^,�t�.tt���[6������v�UZz��?��?=Vꆪ�w��vi�‹��آK,q��?��o�J
�2ޗ}�gm8֍Ti�v-�
g/�=;v�|r�a��|칗�
W�Vfz~�N������*�nW�Y���{�<W�;�A�����7Z��+s�Q���<׆���J�G��]�^���7��d��a�E�_a�=;��x'��*�
����9�pm����ώ�Zu���K���,W�Uo��]�.ٳذ�"��a{=;���m�L���7U���y�Q�=�k}������G8�3��i��J��|�h��5^��.���/�h����Y�
�<d3A�^a��<7��� �rk?�T):��a
u�K�f��$����r>�\�0�Z�f�*��k�]��*��@e׆[6ܱ�
����ߪ��/�ұ�����~�[�Rt�� �G������2X�Խ9�Z=֓~�S]�0VY�~�U�W�^�n���ݬ�[6W�5=�3F#*R���_�������N��m���Rp���
�ht��+���.�Bw�}z�'�8���i��Jw�*u�t�v�U�V�f���
~z7ܴq����̈́i�|}��]m��P����.���J��
��de�Ӌ�ozz�gw��x|����褻8ѥ����[Y [...]
�}an�չ��Ox)hG��*
G2<�3�Lq|�ڌN���<����s޿�.�}��O��������珻*m�/��r�^�v��U���^|
ߘ�5�l�c���0O����
v_�x�S���Wn�j��,L�V[�f&��<pe
•��Cmm����B��~q�e��>ϩ�����8d+���?~�Ui�������h���*������g�e�׬\��w��]���\����A��s
������n��	f/�����*5ߖ�aԓT�
Ree£
o�c����[�Bw�G�r�v�.����K��x�a
7��Ti�s}��/K/�
i�_� ����U�Jw>���֭Y�e펍�4\�'د��7I����{
�iF0�r�]nGN�Uz����l���V�az�Ӎ�Mp|���y��B7������t�m|=]Z�4VR�f�*�o�,u�ѫ�~��e�^�ru��[�ϝ/����u��l�d�2�a��r֢$U�t�O���~�
�e�d����w���|aZo���m/�望�
��ݍV�qr���������׾W$���I��~_
n�B��>��q�uK���lWQ�n�6U�,ݟU�d���~=NRW�2H�nu��]��[ߦ����o[Q�b��2�6�;���/�A\�$MުwߏvwX�U���x�K������/�����V�]�e��R;�Z��+s_[��ӕ��L�6��M��i_��&M�����z�=��l��0�p�iL۴�K+��n�~n�n�u���(��+R�]�n���_�?��
�]�f͊%�.�nł0��K���=��39x��T�~{�}���x�����r�����y+8p�����}Q�v�
_�j+�\�~g���
�hm>ͮM%Lgz��O����nߌ-���w�Ut�6�ӧ�(T�i�����b羵Kw��@3��f�vo|�z�۵]�f�ڵ���/[�V4��[�gݖm�l�c��_�a�[K��H�୺
R���
����*s/�^ν|q���糮*}��XTi���M�}�+W�Ky�?O���6]����<\���
�$L'-N�I�
<��'�i������u\^ŕ.
����]�Ӧ���Ә9�+����W�_~�Ti�t>�ۇ���KR�_�z�A�.W�Z�Zmo�߶~i~�]��qj��ݱ�L�+�늻6�T_ϾU�T�a�����#ӹ�W\�mo��;��r�?�ݖ�ڪ��sY����v�-�T)^��Q��fz|����~�7gz��Fi���
+n������2�\����ȝ�8L�"}�U�__�����f��7Y�
��?V&iX�f�6˵ݭ�f�K������H���l6�]�͒�W�f�ve
+�4:�+����N�t7�"�������?
t;�N�s����O�w���vwp��i=U���қׯ��`�5i�������2w�3��x�4bؗn荭��A @	�4IH�v��U
U�S��5���l����؉#v�ĉ�#�����������;5S���J}�w��ܲ�
�2�2�����*b�Bl�#
�1���f��
�ngs�
�K���Q��f�)�c�'S��,1Z�J_��J�H%0�@?�̀%���OgG�$e/1[
�%�83

>��D��ψM�cl������:7IQ�V���>
�t�I�������6���:��>L';���ʖJp,���Fq�>�"y�T��c��6���i��]hfm
��.����:���,a
Eq�UNl�')�j*mH>�N&F�cS�F2��qkR�?���,�֖
��G*��P~ �%Ē��]��B�
�Q)@s���W���0s2�f��#JKt��\fL�
c��ô��_Gr�^��
ŤI��Q_�	a��j��`�>��+�k�4n�	0
q05�p�J�ۘJ]�H%��d؅�>y���b�eh�3z�j��8�>��/��
ݥ�r)~�m�I�o����F���dE��#B��d���P�X
ˣH�������\�#F�R�G�J[אJ��J��y����E6߽��K�/����CmEɸ�>��D���N�eh2��8,	&\Cl��R�I�3)�$E$
����/4�{99Nx%����T'(�d"�{�=���<Piy��6�RoRIB���II�NU�|�L�Ur�H{&�
�/؞ئT��u$����~��W�]Io�qFDzBS���X
+��7�Ʊ�H���S#%FkR�g�Jw�Jsӓ���q]�4,|�{�Y:�$���D�q��p�BS�(\6�sE>Y��(-�id3v�1z��
�)�R[�q)�m֙��k��
c�U���Zh��j<JxOv_�D'�d�E�;
	Ǹ����6��1���J�%�Rۧ~���8e�ie��:���G�[
lS
m�H�;
�2�D)�C��
�oM�ÿ�g�¸�.b���	(i����&Q�=N�
j�
���ݯi���TZY���UGG*��P>/	$�yHAX��LT���(%�Yh*��kkk�8W����%���
Mh���|4�

��
�f�/��z[�X�`��%-��II�V��<�a�t&��Xh�w#
'��NDz�tKuW
+�Y`:��t��C���4�*uñ�!��
�P�$(q�fշ̼���`��m�<�����j�6�Lم���\�`�'
�Ts C����%�dJ�n�&�pv��B4;��9�x$(:���]�W�t��_������S�������Lmbl�ǒ�L �E���w�D% ɘ
�E���ظff�7��|Dq	V��	��c����d0
+������T�Ir&u�	�ݪm�ͪ
[a���V�ɱ£�,���b���
��o]Y]�9.�7*�J�؊�!�!�-��L�'H�u�m�e`���d�v��e"۬[� ����m�B78�X]F~y{����Oaa!0y��f�G"���f�ϥ�A|J�A^���=-5z�)�{�T�Ũ�?����3��|T�{ss����������J���c��q�e�C6>��
���N	�2Q���u�̭h�����>C�AF��cd1h�
���Se��I�N�Ō��:Lj�Ju����UӅ�3lU묅eo��QÏXw'{��r�T�Ln�L0%jw3\j}*�X*�T
�r}��p,�/��`�tzg�8B�s-3�-��D�e�����v�ms���Dl����
+]��8).�[Z��k(I
+w	��pa�B���ӣ�~k�#Ә�8��g{-����PN' 
C�B�*���Q�n5*�Y�􃯀J�v�޼~������q8�J��|cp�"���'ɘ
���BWa4޽{�
�}5��|@�	^3FC����d�&
+HpX

&`�lQ2�5d]�gƥ����jBR!ժ1��	H6�6��(42�uF}�c�Gݝ젻�[�	ft�F���x�B�R=.e���T��&T*
��wvt�({�L
��k��J�o�
��[e�e"��뻪m��`��A*t\)�ťL(��-1��E0�/Dl�����K6c
s�(#�L�%-�RC�ԕ�F�j���tA��Kn���֥�?��
+���J�v�ݺ~uuyqn�V�c�\,��E����`�/��d/�$X
3=������������_�t�|�q	V������cH�y&���RF0a4B2&���I=&}�'.�r�&[5e�
+ݡ6�0� �@�mz��~��Y0����d�C����@�ۄ�L(�;W=��|;�K�Js���TJ�A�D���p��2�L���D�\�,cvip�rǮR�i��l�ش�l���Q�
+C�`���K�A.%�����Q0B0y+0�nF�F�
��2Ʊ����q���l���#K
�y5b���@��K<1Z�J�*�]��s����
ܻuccueq~fj�:f���QL
+�$i"Y ��Z�Y�*�ƽ�Gf��1���0/�k�3����d��I�%\J����R�$לB&Iw��#��V-��w��0��
+��B���q�xCϴ�,;�n��mk+�"�h�Z�N7�
��RZ����W�J+K@���Ra(�������7Zh�2f�G�F�U�2ey��mm��m��B����Q4ƥ��$o�Ha;m��vf̛q����G9�NB&w�yI
c��}ݍV
g�A��I�`P!�ML�V�t�Z�w�P�_�J��߾x������֮,-�NON��a��H
+��`����Hh.�8
|������Ӄ��gј��#�K�54����ɡ�-��!e/tW�*KQA8m,�P��,���ϤAL0�CӭZ�d3���	��B���a>ZݑSq�oT
+�:���w����B*t4¥�r�K��B�u�Rut�\
���0=�<=��I�l�#�<ЫT�y�&�
�o�g�Dl
+l�U�r0�8O4��:���P���n��
z��
+3�g��3�iNgdB~�E(�c,����r�]��ƨ�QmJ���A�b5Ӄ~
�R�H��	5Z�J�*�����޿{�l���;[��W./���&��%�$eK$2��%��	ܵK�2�ˆ|��xx���K�Wf����!��1���$e$��,&��\ʅ\�Υ��R&�\���d����bIa��������Y	��z
�+�ޓ� �J��6
�^�Y�I��
L~�n�K�K%����M��L�::R.���%�:����ިݧ��/ql���#��CY%/�Gls�����ؤl���.ty�K�I�D\��tQ��v�a����-	2��
1[33eg:=�s���32��b��yI����6~J�V
[?#5j��1���85��(ڞ[�8�k)<
[�J�
����������}����϶��ܼ���4?;�X�o��d
f�D�"{1��G`-�H����o޼y���;����?���C�K�5c4�3��>�IY�
����
+������s�
�ڈI
Ĥ
d�-նU��d3��L:~��
+M:��_�|�#b�Qw�����}�A�	|2`R>�jw̥�%�*��C*�*��TJ���
���6����KLRgU
�'�S�)
��c�Qj��1�7��=I���I�9t6�
���Z'��@���d%aR	�
����c��~�:�(�Һ�
��%�~�;

0
��0\
v|�/
�p ����
�6���Qڪn�^T硩�Tj
��>��R#5R+Ej��V��gt�����;�
`
��Of8H���Z��)b
i�d��
����y�i|���� ��8�
,�����޵�J˪���jx��j����:��a)��**��?%*���G�Ο>љjn��VW�XҥJ��dv>�$�
a�I��pD�"c�TƁ�����K��'��
��>X
F8�d���bp���8�|\�hp)C$�ً�2&quRf$��$�H�0��ΰ�
�{�:_��F>��}�
p�
�]�9�l2'�ٺ}�{��p);��zS����()<�w���=�rsw��F���n���$�I�P�z�O 	��8�p�G����6ywz}j}��>t�3^�$[��<���w0��ک��:�p)lj�uV
�����aRҗҵ���SfL�=��(�I	�r!�)����=T{��������!Q����(Uj�P�Д��Jqh�aa�w:~+K��w�J��3��#��.�A�7�Մq,ɫK >�#�Aw>TxF�j|��v�G�^8�|G

]�2<<<�u����\A^�k0ی٤=�C�#�9`B6�hT�򶥍˝Kk�b1i��I[�-��jIV�nn	�0���B��Z�2����"���>����G��/ܚ���d]Lރi���J��0˨��6�R�ٓD��h$\QZt4��r�ΝoҵDo�6���V�I�PA�/�i-S,ӧV)��U�qlîѶ��P.T�s���Ԋ�B��ϥ
��	�RN@
��1�c�%H1�#���"�S���c�<�3������
+� ,�2*��d�A?�R�T�Rj�)5����&�
5
,e��QT���K���������/^�*؞L��q,��7�����É��H�#���w	�Gp�0L�`
���
>Cd�mJ���I�IN&
���?�_�&xn?p7p.��2
J�����.��
�D�Ӫ2
8T:Ch�yLd�Fs�7�T���Н<�\����[c
'��B7��I�-�KK�KYJ�E/��B�E���g�� 퐖A+�V%��W5
Y�*qz��GL#�r�]�X�3�6c�m��Y�s���:�:u0��^J*�5��8�)�9y��*�jL�r�O��p�Ly\��_��@�%�@p��
�U��m�pd�[P2ۊO�0�Q�bj��F��(EM4�O/��-4�ѯ�J��T�S�)Qia�έ�����9{�����)ZWSUY^&_R���"��0fCL�����${qT*sGd-��,u���7&'obn��'''����d�Q'2��Y��
���q6�_\ٱ	�K[�hsY�Z����K�&m�;�����+)�
+{Z�
$%�����5z��&uoc޳�?�YwPJ�n�!ܤ�L
&q���n߾.��"f���)*
�J�ɦhmU�����r���7��5Z�!
+
}&�������mk��WJ�Y�eh������:]߸�@�������3
+]L�J.t|�F����
��å
;�-(�
1�כ+Ep�[S�Djkk�0��
?EO�� �)�M�ŚK�>,��x�L�
�%�54��jTZjԽ�Z
RdR`�RMH�F3`��S�<�O�s�~��G?�h���׮���;u�3���G��!Yx
�$�3KK!�6�F�u��%ً���$Y
�"W!�����
����'�4=5��$���8&DŽMd2�Y��Q9�����l��	�(���
+�Wr.-�$��ˤ���9�[� )
+��Z� �ž���O�u�Z��ϴ3�R�#;���I7O�uu�R'�&X� 
��y���K����JO-*u�'�
�Օe%�G�#���r�H�v�+���J��6�b�������5�*ӖcL�L���(Y��ɰMz-�^���cu�b
ޜU��m�['c���
�x�I
S�2I:���Fhb�X�LS��/�
�F)�)�)��L�)�$1
K�m,�*��h����}�!����h��`1X
�i.��%IC
�o8X��W��J��Tz�}�Tz���o_��@���'��'�
u��\���R����Χ���Dž����R<�d!"���33���we�Ѩ҇333�K��6�$�@r�x
y���;��	�/�ů�Zz6��%�K�Υ��R�Q�n�W����3I��*�M�d�j����:O��^��
�
����^d���S����
�A_�Q)H%[4�jT�!�^u�f ��<��~��"*=STJO���;���o���,/)�/�+�8�{����$^)�
�
�h����Սu���
�R�Ҷ�=c�md}؟�>s{�Wp��
]��N
L���k�m�s)Dž�'��I
�i�R�L*�Z$p·�)
O$͘�����g�q3%ri
���_I,��%�}��� ��Pc�JD�"[�(�1V��+��� 5�L�F�*ة@Z���)��e��k��L*}��g�~�����{�w��`߅3ouuб��h����e��!I�`T�5�P��^��]��c���ߟ����_XX��
�d�~17�����;i�&2yL,�;�����e�
L�����k,m8�VK>&y���z����b��I�-E��H�#�h�N�9*
�F��Zt~@��7�T��dg<Y�n�=�L Ss���t'8�{�?�V¥��s�J7�J�;Z���pEi1� �9q�g��}�Ҽ<^)ZF�
+gR�1��"W#��y��]F�U�2e�o��9���,Z
w:mFz
+]���5����SW��Y��˥
���w��t+�wJt�&�������	Do2��ښJ��dڃG~I����d�L�h�W`.�$��ϋ�u� ^�1�缾~��hQ㐡�P����h3��b@
!�	5n�s�@��YZ��h�^�F*�WQ���s_�>��<�?=59>r��;gO
�lK6�K['�
�*��*F�JL���$�K������K	99K4"c-�R>z����9�����G�
�np�$�,=�
�䛉O&&d#L
���^ĥ�!��p.⪼��Ci)&�R���T�$
+0X6��"�n�t"���0�>t����=k�#�u'J!��'��i_'
�p�G�A{:�4�t��Ԉp0��mriK&.b)'����,Qi�R����;S���HU��)H�o+�_�IG�2�(�i���R�
Ǩb���K�A$:�x��eh�X�w��1zu�mP2��I��������\�q�
��K��Nc)J�-(�ٻ����h���r������
�
<�;<�����A�L��L"���
��K%��V��M���������s*eP���Pn���X�]���m�F�p:
+7Vc�|<�J],���-F6P�_��������_~��}�����'�
+N����;}�RX�?�����}��Ei]�u��Y�**
+h�E9	*<r�3r���炢���V@�bm����ڤ]�&��m�nY�%K�,Y�w˲,��뺿���ypn����)��y�s߿��\S�����+TѴ�)�OZ�}���,w�UR]�G��E��7vttvv^�eG����%��xj�i���Db�
�0�#�����������m��jK�����e�dä�n&ͥb#mMb�_g��
���Nյ�aM>;�8��|��Y�h��2]v��z�v�g�p�'���|�B*SvV �}A&��Cp�Y���L�O%�����W*�	�:O� �v�V��6�&���.m�be��% i6�4��
�.�/)�E��H�9U�k��9d$�[�ҥ�QM��|�zDr�
/(�mB�KօI��n�!��#��C�%��>i����چ�X
�m �ƒa�i�_offf ����=�����e2؄a���׏���Œ��
���J̢cmc�J�]"������F��F�� ��'.#�d"�D��@������&��q��[s ���쓟|���w��v�?u��eoS����¼��Mi)�n�*6v%&�Md>�IJ`��%@��jjfGz��V)�:�qt���=vuuw���\���۫���i�['}2;eD�� I��&(��F��pk~n6
Sچ�$7����\gz��|�
+K��(�I��in&�
���M�\�Cu�E������y�O��ѽd�ݲg���r��q��[���.�&{wP6�57�L\�S��Wa��&� �K��KO�>*
�JgN
nٻ���� 7�iCҺ5�+��Jٳ�
�3gN8ʚĘa\)#!Q�����|���j�S��"{L��>�W2����Q��|q^�dd#hB���

+tN*�/���M��Kr7�ق���P⽄J>F5��(ې����xsrrs�0����G>�rssr��pdر����W('��Xz�?B �l�V%���S��f�6�z�a"~���Co#�l#W�@�N`SbJ��15"�����9�n�ig�N��=�Jw߽y�rW�`�憚ʲ���-��� qqq�W�? ��D$Q`�"0Dx�$�%���@K+�EuqGTdw����ᅡ��>�}}�KqJ�IQDF�!��LL�L
+Le��<)L�K�PW$�$��֥g�y
X
+U�<Lb`"�~�gR����W������
+�gh$�ba:U�1
v��aba�sϥ^g���5��=#�����{e�]U(�gen{�ܸ����b
�

LD�EE.`2�s�9�B�%����P�T:"T*+�ݲ9-9a�1*�Ο2��H21�YXRF��8uP���F�S�������9�#�k�v"�|����Ψ�52y]�
+��4
�x7W]�b��S~.MTTRP�UI��n�Y�Z-�������sJ�
~�����Ȱc�	�O�_������ψ�*�����
!�����O�6�����u ��ed0%�JJ�S�v�Ĕa�#/9�Tr4�OM�?�J�|�՗��ч���}���o
ܿ{G]���������4F��u���k	��"����$
+L�$����[�,�"Q]�#����7^�~}`��;z䏁�|D��SBh�NVc��ᶃ��LpG��
`���>.�����ISt2��|����4vQzZ�T3ij&EFI��;�kRjC5
L��
+U�\�Z{�I7��͞��gY�,�������޼�]�~'�����7
skU������b��)O�[Zjr��Xmo�K�o3g��[�����d��J�5��*
\��A���겢����)��W�._&o��
"� I�I�1�8)lG.��S\�F��=8�qH�ݒ�-�Oi��&����M�x(��@WZ���d	�l��T�p�	I��d',Ȇ���CB)|~Dd��%��ն5�A��o���������o�T��y̯���������
a�$��?A;����6�I~#~�P��c�*M��mL�64��mBs�S���߆,�\-�X��'dB1Ư5^(XzY��[�����A���T��7_��g������n]��p���C���^����%�+���^&11)�HB�
 I.�$A_G�)"�*5�D[�(,���888xs�3|��P�&t���"��`� ӱ�P��!`�(/.m�o���p�po]�I+(��/�L2Ei2u��äg�����wt��&�|�C�X�v�Su��~��W��������y�o�~�'��'�ɓ	\�o�nV��Z&����tU��({[���j���7{���ݢ�ҳ�O�۠҅��GZ [...]
t�r�\��4�
�T]�a���0S���(�^�
>OA	�v�����<*��VTVUUUo����Ԏ=��_����3Ӑa�0�<���ĬK,K�{AF
f���҄��?�m���Z#k��o�Q�mT?�6��
J�4�L&j��
�;
+���
qJ
���	�J�Y*��B�/>�����ॷνy��eoscmUyIa~�� �����I�Ҁ$I��>�I��
=��~V�RIx4 4��h�CC�����φ��������t��hL$�
+Ce:�ڢ���^]Y.�Oq)%�]]�j����X��KVZa:+|���4I�)S�f�R��+��mn���P]��Ԥ,̝��y�X�<���]�H��c�x��;��Mg���M������nnr�� ��[&�Җ�K�..9��r)�.ME��O �.�Jo��knؾ�xkv��
I	kW���xQtttTTTt�"�$���$JF�8��]{����o
;ѮB���e#��wJ��]g\���}=�&}��%е8`b�ӅI[��@���8�K�=u)�%S�Ćg�(-T6�*��
�Eťe�Q5̷���������qfg��G���Z}}]]m
�T����y�6���oX���O#�2%DYz�Tr��o+�
�
��4"��F��lC-õ
��h"�MFW��+jے�:�':�q|��oM��)*��׿��?��ǣC�o\�x���#��w�`Y*.�;oޔ��&���q6�%ۤxU���I�׹�"/X�xt����FFFG�ݻ��̇j�xzot�n	�Ah���-#2hL$��A��
٘���/�}���K�F\
�ϳu�-�G�%?�&x��$壟���4�ä�U�_ɩR�\�W=�
ө;�{���
�g.z�Y4W|?���뵏p���;�w����|�U}^a|��mL�$��D6QD6APTP�
"
+.��{/�zAY�b7TP�Fm��
+Q�km���d�tI�t˴��Lۯ���9�}��rﵒZI·Lr/r�y���<��j�V���*��b����W�b���܍l`08g�Ӱdأ3��ƕJ?�T�9p9v��@��̾��`c�%5ye"4��'4$x��`Ԥ���Q�1q���I�E��:�pζ�N�L��d.k�|W��u�
��	�����a4!W���J��V��\�$��nZ�ӵ�R��x�U�i�y}���/l8P�p��	x�`M��߂'�
�-�ZmvLqqq	�^��-���j�+�ٽ��dڤ���O��,	#F?0�%~j/�J��:Dq��g��ב�z
�6����1o�f��Q{N@Ӗ��t�,�"A:~QL4a	ל�G�Q0��BF���5'��׿�J���O�JF�/��
��lm���(��,���Z֥��]��������f�ZMK�\��IR`�$�%_�$�K�u�<�Du�������M�[r�?���� �%�F:����~֘"�P�&�/rF
Cri���K�6�I[�E] [...]
�v3j��A^� ��B�S&P�ơ��*��J�p7�����\"#.M�\zU;�9
L4S��D�7ƉJ7Q��޿9p���~��Qn�SX�����fU��h`)<,44&j���8􂄤
32)e�EQ�8�U3�ZZ�p��,�SB2��[�F@�Y2�Lc��v��,�z"W]�9ЉH!��K� �9��z+��%�&���ܧ�{z�����H�FO/
��,8*�햖����W�T��SVZ
+_.�ȍ��(	�r���W%��	K��G?��F
F�ms=x�T�u�#oP
+
+	�����_F�`BK��m`c�F��Fo���4�($0�Ҹ��4a)<�\UG2A3��.T����~��㇣#CW/��9q�`ہ���R{Ѯ�-�T3-���Ry���Q49�h�i!	�B|�Y��%�$ ��&IY$�۷��GFFޗs�F�+>

f�$���N�&�K��	R�S
����E�y).A]˖�
b�Ki	eyxx<��Z�$�^����w�L���:��
L�d��D�7�P�0J�L����.�
&-̰�a�g��]��VOk��$�����lnD�����L
+L�n2vg�\Z��Hи(s7�`08����$�4�iTZ���ҿ�P�w��LP�
Q�R���C��u���o�ز)'3}���K��Q-懋AKZ%���^����EeMR-��Jұn�L�yOHfH?�.9&��'���Mr��S
����6;�:���B�H����
&�l
�I�ɋ��

����?`�����t*��.LHb��}+��
��555�0��}USS]]��� ?F*�등�N�Bg!,��H#~��)S��3�����3�? 0(XBi9j#^1	z/�(Q�p<kb؆�QUI� 6٬o�)iP� �W&%Pt�
���(�2���D�/@�_|�1Q	Q����^8{Y��a���Ķg��-�x��R�E
��$mܤ[��IF$A_g�RG"�@���&	F���wGGG?��s�
_�[�QBg
'!��d�/���º���߂7��*�KK�65.�K�-&Qw���,�"�AZƘ�R����X��+JĤ���jL2���$�T�
s��DBE�sž�0m�wyϴ��<L#>��������n���Lp�hn

+v�a�2c7�$c��q�K�T��}˥.�'*��7��P��T��>��\_SQR�s���,Kj
+Q�
QQ
"##"""I3LL�I!����MI]G�$��\�%3$$3b8�������e#�'"��M?�m��p�t9N�\�tD���.���%9Z������3c�9s�����
`Ö�ي�x�%�e���5��ں�������F�&���-�����\8UŒK�6��ęTK��%g#f*�X�0�4>�?UP�0V%.�r�h@)Ymc�3���6�x���r´����N�,�����,M�j��7E�O?��u�{�\<w��pgkS
�R�u����Ps7�dge�������ـ�$��d�5I�����,!/	$��l�"Y�9>|��C�G���
�Kh�u�pb�]������'�D�B�cy�H]��&%,%S��.���Rʚ��c�Nc��S�����3����9`R�+�TM���($51���d�V�	���F�=?{��~��h���N{���~Ӝ	
�v
�� ���)1p춸r�r7uV
��ҁ�p���FI���ҟ�~�'$���.��
��hi�W�׺k[���4�?���1
��h��$Ԥ��	���H�&�$�<��$�\1Kfĭd
9�T�C��N��l��\A��|�9=�I0��D�C�\�í".��D��u�5LH0M [...]
+>yt����w�����8�v[3�R�^{�ӂ�Myss7lؐ��%)��$c��L)����}]����%�%�t��i���
?~�������%����Md��LBaL�G��
+���������p�|�.�IZ�(*<�\��%��4��&�Uzz���͜ &K&-RLJ��P��y������la���iǮ

���Cbϴ����0�#�x�;�]�}Ԝ	�������:y��Q&��U�0r�Fa��t.�܍#��9o׺d��d�T�x�T�)����
���3ǻ:[�U��vo/�����_C�hq���	�W(&�H&�`:�(�$#�z�pN-�i��f4�<r��~:�l��N�M�
�
+
O���@'�SY�˱���З�W�tp�(�H;~z]�꒜o��4ET��^�Js�B�u(��������	�G�jn����wttvv
ļ�9d
��������ho�#N0�Z����NuI`��AD����zY��`|���t23z�4.���j�W0�r�6�$�q��چX��N� R7""J)R� ��V._���4����3m
5�m�6�[\��h������ˢ��b�����ྡ�%n���(�*�Q+��h�Z-Q�1�ɤ��I���v��әv���<�����
7
�@��!���x����9�:��˒��񘨤4�/R�/���?�����T�(x��3'�
>X]U�s�f���
�%d���Ԕ���)M!I��-Sj��B��#G��,E^獸(-
+���%655��r�8��uF8i�2!�#��
��Z_�}�V�m"%�i"�%%�m��F�[u	I]IK'>�,�ҕ�
+K-_��(=�(�E�{������?`����/�5&8�f2ujz�ɐ�P-=��%	V��tԯ�	�͞oZ{�����z��ڭ�_vf�����1�ce*c*(v�I��,eo��R���������2x�֪�R{S�,&�	���BH�������N�J�۷lX]�d�������(K^�y�!�Ac8ADRXD��퍎o�4]1i�b��
�\#�%��D2��[���-{l�H������lp=���J��r:&}�<
+^
�C�#ҁKr6�.�a�Iu5���ĚW��~�
{��cB�]�B)�UT��֭'���o-)ٶm��
����?ڎS[�R$lZ��<>�5{:
+����RTx�mĦ,}��wL=hs*�嶗u�*=ӥ��64���6ȤB�
Шېe`%����hZK0����)ӈ%/�����}�������*��޽u��[Ͼq�H]��ݥ۶l\�z�R���3�gf�������gdff�$1�3��d��IJ`
+I�W�I��"�D����+1�;�wZ?���Ԡ3�L<Rk��9H
�
�	�����3R^�Fq*�)���
	Ru�HK��KY6�Zז�<R��D(9�Rg�.]��x�W��~
~n���_�Su���+5I�+�#�$��+"��dz��0����}[�ž����z��ڛ��iw����L
+X�vW8�ͨ�����
$�K^.
�+��2x�:��.IFpR�����J�O�^WSU��xÚK�Ϛ��:�e�ԍ



�����GDF�u{c�t�x��JFR��ILq�$�$�K憟SZ�4�S���{[����C6gϨΤt#�΀����[�P�
ͥ��r����1�lv]r�G�%�@��D1GU��`���(w�8%T���(���#w��~w�����WTT���;�#~Z^VVV��\B4mڰ~-
�r�Y,Җ�����,��
��O�)�|_�0��q��Ͽ�m�Gy��Ĥ�Ln�����U�Q��m�r 5�D0�*\�d��BZa)�;6B���!�6gt{��E�+*�]����Dt�߽���W�<w�����+�w�,�]U�T�ev���YYӧge͘�=Hʃe"�/�/�i
�~	�|��;�ԅ�'<���+e����{����_Rj�3�L�
��:+��$�j��],L[6k.�|�8�5>6Z�%F>%-&�.?21�ے�'�-(IQ�м(u��l��}���`Rx��I`R��������j�TM"IE��۲�w̞e��ͼ���`��׮�n����ך�[#��HC���
+Le�$�.��
{˰�$}I��a��t��bե��u�	k�E�O��R����6�b���N7�^_�Tڸv岅�ٙ�&O���y�]Q�� ���D�0i�fҊU�ME�&�b
+�X�tG��B2Z3�S��t��q>	�tv���@w�'Љp6���-�r
���$�O����D;ì��]�G���K��Qg�UiTPh���	�l��`�r�k��w���W��]Y�gϞ���}����O�Q�M%\����f
/�+��cA�H}eJ��P�0q �(~�tY��$/����������pn�
=n�d%lc�Rlc���ܚm�2��Jlp����{�<���S�'�7��b4�`秹��
�
�+��)T�
���o>���߽���]:�����U�P�6���X���ɛ={V�̬ٹyhI�L.p�	}�&A`I�/�,E^T�ڢ��+�8��|ҎI�AgJe�h
�?JpG�c�7R_�}�K�7oD쓷))!�J�4Aץ1��DZ���ueLT,���I(A�x��|�R����
2��/�4|�� 0��`R���
Mj���P]%H��S��RK
�k�|_�Y��C?c/޹v�w�	,4isC(�)*�tЀ	�V\$}u%�@{���Ҝ\b� [...]
�t�ӊ9l�t�<�ŕ���}��q��V
��h�d��˾���:&\Uw�
+�K�驐�6D:��v]������.	�l(�
�
�r0&$�卍O��
+�V�͑LR��

�ݷ����������A�Qkkkj��aʠS%�x�v�֭�,]����jl��
<z����>=�wC=�z�M�o���
�t;t�>
���$ۈ�O ��g�6.[AB��ۨ�ۨ�"�LB���Ι����4y�TǠQ�с`tF������E��I����y���ٓǏ���CY*)��
/���+ȟ3'�3'?��-	��b�}VM��Oj$�-���.%�Ee���1��3��P̒B�)��ƴ�Da&
�H}�Kw����Kf�LK}E�ԥ��#^��T��٣�`�sk���}��[��lY��
$E�L
+	�t��c�YL��љ�p���
ՕI衖�9R����}9���=�8>��
�
X{�Gwk�	4�
+	��
+L�ݶ:c�\r)��R4��4r�28���U�l��%
�d�B�!*}���E��gN
k8�owi���V.��?�eI�{\l�����
�7:&6n|�ĄLR��S�Q�q���9uΫ�$s׺e
�8O�s>#��8e#��	tǬ@�H����U� �f*�H��2N��%�	GǕ0A.q��ʁ�J�aQ����fdJ
�X�


��=p������������?�;t�
�z��I�
��ZJ~��qh���}z��#F���mJ%qvy��Jݟ�
�m���前�$���@V�F
5�߳�u�h0� �jj�# V��!"f�;��;���uE�,��<���+��u�Tj����fT������W?|��;Pݕ7ϝ:q��e�l�֢
�N�z̟7o.f޼�2_�AU�Y��ήQYM�I��آ(bÊHEzQb�� �J/b%D�k@D�Ҭ��Ս&�dbI��:�Lfw2������s��~���
$f6�{���x�y���<	�k�%DMZ/C�.�&՞D�H��Ty	 A[$-֕p��r
�Q~U,��&\R����0	�S䍤/rFɥB*zi��.B]�<��4�e9�1��
��B�X��)�~�yv %.J21ʢdie=xȰ�̤	'O�>��u�;Bu@�¤��	I����ZRZ�0�{(m�,촖HZS,L��/5K~�P74�W�n���3�sk�ʄ��0��nL\�8v��$%į�[�p)@�ntV�=
�A�.��u��z	�BU%�Jou%��mN�6A��W/�k1�<v��}e%�
+r֦&��[��D��������������
�2i��I�
\T*��	��yqN�5U��4ҝ�tL�p:8�榔͵N�!)��
+9���C:1�#��|'���J]�KaB9ɇ�$��Z��r0�֎ˁ���_PhD4C)%
6\�aS�V2�={��W
>r�������s\?��������\�Ht�����B�y�������`�N�EY:x o�/�J�p�
�
��
<�f��Jns���B��)���|h^X�
��/�
^m|��1�4�f.m�H�6�R[�]
��1�U�%�w���hPɢG��*	�=��q�S�����M��,�*����=+Ð�������fMRRrJjZ��
Y�6�зW�I,0�$�K�� kK�H��#1_)#$풕&��	�)d��$��
���%�6���4�&A\K�[-꒧�,W8�d��0D�C�_��_d�9�:,J#m�Ǝ��4����������ߌI��<���`$���=vV�,���	
k�ge�_�F�zI)6856)�@��CU&c�ӑ
+%vsa*�Ǔ�����7�0ә
��E]z�!{�R�p
�(+��T����J�>�ITj5��
-߿k�����f�%�^��$�`�����7D�
	
�01)9Ce�Lq�
��IE�U3��Uoi&���c.�|���F��8�
��Da��j���X;Ύ�.q��F��
�JnOFC�^~_ذRP��
x�Ν7��U	��d�b%�#y��a���'Nb�0��CџN�”	N� Ӈ���K��%�ˆ�,���yw�5׃�}�ߕ����uT�
P�ꎅ�q�j�}�X{*��J�6�
�F=�R���#/�
^m|��1	�
3J�㚌��K-�
��rw���ٍ
1l�`�h�=^}�F��T���S�'-�(
+~�ݷϟ>y���w?�y���δ뎣,
�S�}��fge�5���
k3��seMR=�\�$)0I���*	HB[,,i���iØ~S�R�$d��(�I��`:��L�I�>�׳3ҩ��-����
��B]rv�6eℱv�C��w^K/%S�W����yQ�4e������9^`Rej�2D��L5i�nYC�T$�jS���=L�0�=���D
�gڽ��I{3e�y��+�{�L
+��UQ�z�ؽ.?Wǥ(����
�ndp(�
�պԏ���RO�%�C��*�.��O
P�)����7�|�|k���v�n�\��eHAY���BC�� ������aĤ����._)��GL�J��w�)��ZZ)b\�$ΩHF
<�yh.�6�hT�9��tf�1
t�pp9$
+Y7�K�,
�t�
o��n\��j"L���%�F\"0�I��Oq
U����Qv�&N� 8,r�{�V&$�g������(�ꈝ y��a���

F��Ӥ��hlhh��)Î���JJ���Ғ�[�(1�FG���� #
=r��AJ=�{yT�*���:������C��6dU
+	���m ѹ�ET�S�6j4�h�lFeuD�j��0��,޴�����1$��c��
���֖��h
��cQ��_E���w�ҳ'�)
޾��kW��O�,
ڇ�,m@���������dfee����5�{��L0I�$죋z$A^R]B[,,���hT�JpR�$%f�G�!�Sa�3����T��
+q%���ʼn�Ζ�em��Gn��g�%I�W:}�Z&�Ҿ(YHe���!�(M�8y���3g����

	�	�LJ�r�׭Wj�>YC����$����ܩ�I
k�秝�i�m��e(�f��zs��ʤ����
������(�d.-$.��S8psAi�[_����RwɥnJ�d��T��;��CP��
P�tөڪ��{v|�e}ANF*�o�b���ya�sC�����A�P )r���ԓV�NLN3H&Q
��LRR
j��$:��f����T2�l4��]�:o��N
+�.�NV�p)� �į�
c��Q�
"�Q��rɂ���1�JTll�L�4M-��,�OJˠnP�m;vr�]��W

����������z��immiin�'��u'k���I����l\����`91ʒ����I��F�6x�e`��k�=z�u�*u�֝���7h
�h�
�FhD�+V�6
+ %��>���
�/m���?h"V�S>$0q�(�D[�4$'Ru�

�'FO�l?�
2�
+އD���9���B��=�
���;�~r���g��u��G�2��߼q}QaA~^������u�7l5��s�&�c���T"!�
u��XY� ����v�gϤU�΄� 2h����RaB`W.�Ϟni�riAu3R�%�҂�y�HZNӑ�Ǎ�
)���Π$���(J2�����88:��r���

����]�L�$�w��L�yb��
+�.K
S��1���){6���n�W�ٻ>�ӑ�*-����֯�ݰ7�-�(w�!�lp3�)xOT�5!���%�K��h��$�,��J�T�T���q�Ƶ��4��V>����֗�.Ϣ�計y�a�4a��""��c�3�R
��y�E�$��C�tRV
R
z�2�S��$Ӧ?��d����F^O��8�.�A8M��0Q��\ڸ�0/;wKX��%��i�„r4�|4�%�^���P�p99z�����T�P�V%��J�e����Z�p���=s��s���\�}�?�;{�
;�N�˫�DC ۢ���"��rYl
��ٮN��

Q�Ao�x\���������0a�J��;�`�6���:͜��
��?ėwT�g���MlqײbGQ�ee%�b��5T@����@�*���,�X��M�h��15��X�f�l99g���7�

FM4�
�������/04,��H&5��DR��a5X
Rp�L��aC�tR
��LG���=��"F�kj"�c'P�
���o��{MTjj9�s?1��u?����'�
~ˮ�y�ڕخ��R�����������

��_T��5!I�$��Ֆ>$&LIl/D�J���*��o
=]\
+����d���GL��<���E��v�Ab�o��s)��*�=�ōϚ�5t�!,�y	,������P�P�1{���M�P��P�
?i��s�η]����]�N
�j
1ikTL,�}���R
柗�T�����/%XS��3���+�$t�J�_H����L<��0WI~��M�ź1b
q�{76+ʁ�<�VQ�Gj璉�y
,QE�5�0���
+*
jB��_�Jd�m�}���R=�q�l����ve�&�Eo��vUp�������e��?�e.�n
*/0)���q��hu
1)�v�W��0�**5��J�*o$��
�e
8e˶���67��AW��8�N2��\J�WG�K�P��
8�<�&M�
c5b��t4�K�\��u�(�Rw��C��-��N�2c���4�W�۰9J
�#�bx��ü
	���%KKK����+
����Rd2��c���G[0~�h|
��:)��m�͞>y���Æ�J�ݺJTj�ƨ����il��6��԰spr��
^��CV��D�?"��E�(��K�&�	%��Jƾ=������["��B��dFO�fF
�ϸW��]��ֶ���_�J?<y�=�t���[7>��������|�����?�Xّ��V��Ĩ���D I�I�E�!&�҇����d"��bwIޒ�Ei�����J�fZ4Q at r�S������ǥ<گ0�b.Q�ck��M#,Y1�	,�x
�^`(����v+��O��E���q_����4v����f�~��v�K
����}���5b'�R�2�S+f(�-��T�תi"�6�}�Β��?絠�����v�p#�u�V|�I[�weg���b��
������+��3�x�#�s��h�"�ts��<@;	��T��Z��o
���w����W/��T�^(>Up�Pޞ��dN>���%O�����������;����BfҦ��1q�;�D�A�#��(��#�d�M,����^�6��
]:Mey�L4u�����41N���J'�%{[6�D��t4`���|4�K�:��ԭ>���R [...]
Go��е6m��OJ��	5� 4�����@
��
+"5�t�(]Xp
s)o/�yr�����+��
���ƌ
Ό��[,G�J�~+*�t����A%v���_R�r�V��t�Lщc����r����
I�	�A�䔴�L�I�I���$*}����9/�_
��G�d.�X
��Z|ڤ6&c��Ũ���$�U.�\����~�k�:�
菦��x߬�S�,+���̐���%}(�"(��I�4�-{��ӷ�n(��4k�<�E�
�]=�|�V��Y�d�P�T��$�o�Hr��Wf��?絤�7��MK&	LU�n%숢BQ�����H\�B��w��|)�h����t.��[�sI<i�b��T����=*���]�����ǧO
=���
��bK�/����T�<<<T*O i�@��P�IQ1q	;Rӳr�L�Z
.�����E�|M�2Wܲ�e���?������W��˷�����R\S���/���ȕ.�Ϧ�K��Ə
=��Lt	c�F��u"(�T¡0�Y`�N�>{������Si��-ѱ�)�
�+��c)2�JC�[[[WW�wI�џ��jk)�5�T�V�N��K�t
��K
˖.Z0wִI�0̆
451�ս[��
;�A*�kמ�[�n�즂��&C
|��!kH��$�AP:Bj�-���"j�A
��	�.�|,>]Hc;Ki4
##�$F��Ǐ��07�i9���X����1��u1�������b,�_�P|祶�w��쬌�Ԕ�d���Դ���]�I�
�o	5^*}�`:��DT������z���%���d2��I8�
�l�r��R]m5ۋ���M�`��x5y
������dz�l�ҨͰ��e����[���Ũkw��>����
:,uvq���[�L���]�$F�Q
��qVi�t#I�jL$%���L�-=}�u��	o0ܴ`�t�(&�<A�F��p�p?8�.�ӧL��dIsi��y#�K
+.��	
+a���
��߽}
Tj��*/9w���Grw	�o�)�2p���������"0(���-�9����U�ItQᘫ
+$�}U�4����1P��8L|9������ݰ�\�z�|<i.�yfL�<��J���K`.�K ^g���J�`
�[Z��0eƜ�v��ܼ����شM�����;��U�
�kj�(}/�]���Ɔd�b�{��'1����D���,�tut��y0
��/
dگO/8���y�&�Ԛ����wۻ�#1ZV��㪵6G�S�A鸬��Ѱ��Q�j���j�1p�3�KG�۳3�1Z��3��r|�l�@Ӿ�=�#�:
+*��
��?�JϞ>yDTB�u��1�*�J�1��3�K9�Y����YY9;��ܼ���k�D5�K�
&�E�Ol$�.a.�YR
�`�)�R��d2xLX��Q��/$#5v���'�QS�ݝ������0<l��B㳷�����K0�^s,����XR
%�6m�B�Q���ڡ4|��h
���g�?���~��27���A����o�ܲm{l��IJ��
e}��$Q��
�
*d~� �R�gz���O�t�
+/�����
�k�t�(�j7���:.�R�	��swq��-N�KCE��St���s��D�
	�R�
 *Y��~�*	����P��[7>���NSq��٢���3_�AY�i�Iv�1�����QQP�b/�W�J�
+H�M@��
T�GAAD at t�E
�u�8&qW����Lf�}?��5��I�}f����s��\�����7i��|��yz���sw���|����Q&��g� o
+�LB�����j����5�6f�FN٘m��)�S�԰���tr0�r�\����m��$Φ̥9�Lp��gk-��]s���&1�x*!�����#��N�:��i�JWw��H�����;��b(�HR�C��F�޹s�^����ޡ�G}���\*����6�LA�mSLD���������<����w��];���
+*}�T"��	T�XP�S��F�LͿ�r�I
��sI
L�
�Y
Bt~�PM�
+�^[
}9���`b.�E����I����zk\4ƒ����Ѽ
��r4$*�j)�#���I�7�
��H*q|�C]�*1�Ξ.��#;3=-%9������HI�$�IyG
��1��)ݨ�OLT>��b/�\jciG�+�ƥ��M
+�4`�����>vW�5]�K�DT� �u�����p��R��`IR�!�>jJ��ы�PS$S
+(����Ci"��lJ�V������
	���ۼuǮ=�I�����
��H�_C}�
�I�::�z�ӡ�V)��O�k7�M�N����j���$�vQ7�f

���h]�L�{
%�$�KCi.�h7o�K�%~-%�s
+*Qo�Jw�J�ߟJ���
5pǕ
g�K��
�V%s�
+�F` ��z{y�������B�"�$��G�c9�R�$5��?��e����چ|�H���8��fZ\��JOK>��J�s;Չ�P1���\��0i<�]�Zv	3�Gp	`2h�P�h�;uC
c�
>j��i��2g7Oߠ���J��'&�e2�JE�\�,@�
J��Ꚛ{x��>�������>�
+a���O�?v$'#5)A�eCTX��'σ��#�
���ݫ��
�;���J-�`7�dfޭ�eb�q��Ά����J{�'&�H����SgΝg�K5�6�F
� <�+�S���<Q����N�c)6�^�b�9ӧL��hcճ{,G��)�~S�$����3��z1�n^��T/X����LW���$''�%'����ҁ$�$���`�S�ϥOm0�_����k	3����1�t�LZL
L���/�}��%v>P2W��K��|d-/7�p��Y(|ㄱ4X26B�i
Ko��_%��η�)�I3j��������4Ci:
�EKW�r]����a��
;��W�� _�+f(�+w�&´[�/���BWg]�_�Ƅ��]^nO�תT���ׯ���.�ލ͊r��N)�b.���4��woK��qԼ;`.��\�Z�Tk��Tz��T����� *=yT*ݭ�q��ӥ'
+�|���Ł


��������&m &�ܳ7>�@R
+�����0I:��1O�����2���v��
+��`�.�s�w
-;�*]B���T'b�h.��0r��͙!�6l� {;�>�%��u�x�N�f�]�[X���7pȈ�� �-wY���S�PjF�%!
��6�/�����xt�T[Ky�4Q���3p}���l
+⽻�o���[�f���i�ƍ>��mK�R'cC��m�J->�Z3�L̺t�����G�G��_�|5����m�ȁ'I��������P��D�2��U��H��Ù���x0:n}h����8�a"�#rϪ/G�6��0*U���]��W/�
b,=��T}�Vŵ�g
�������HOW����T�t)+�p�|dfQqI
L�x��N�>m$�_�����8��[��i�el2i18�ґ��
��{
.���࿐w�:ϥ�[�b"Â��=ָ�\�h���DZ����'McI
%fC��6���;���<��m��4d����M���`���+]�xx��F��ݸe��/
����.�oS�jڡ?4ժ��⥎�����ӧTc�nR|9W9!�`�p��\��HpI��$z���(�8?/�5��"�0�&�3R4oqܼ�P�x.I.�j���Ш����Jc��R���3.m��UUV\�t�LY��Y*|TrGDGE������b&��Q3��RTt�B��
+�pR�1`ң�lB�O�[��;YF�5�4Q�p�:6
�[�
�
��~�[�!����A�K4r�LP�]���2qy.a/�32�LQ�z�����0�a�\��+]ݽ¢6l�T:����=Zx��b�:�Ǫ*���uuh`�`��~���@��
P����X:AA������96*����e�����O
?z���v֖����T��R	߭��I�.�-���2b̄)3�"�]�݆�p�5��#j��V�ASj�I5d9�d,��Hciۦ��`_O�UK��7s�1�r��hD�T����J/A����J�0�jk�nߺq�������r�dggeee�_v��$�L*+?s�
v�z<g&"S3�$	{�ݥ��N$���Ѥ��H
�$�~�`��H�(�Sy)��Q9�P��ZQ��>�kW�\���q�
��`,J,�mK�B�
(�3 at n�'vP�ccg?`��#1��L�J�Q�q��}���+�����C��_<��R���V��z:�y�kDw��:�@]
+�V��vO&j��K.j��W�8��\r@�
�K
��D��	�ԡ=�$��J��5��T��
��
�x��!Q����/����������fĖ�b�GE����ⅅ��b�6m�LJ<�����
U�I��H��,���\漏m)t<��KJ�#.��gg���ݣ�K���Kr���.1|� ��|���<��%<c,%S�e�z���?x�H:��WK��<}�£7n��S)'��D�)�a�NJ`���x�t�T�e�N��՜�W/]QO
���H9��έq��h
�X�4gƔ	cF
���ʢ[3���0��-[J*��Ϣ�Q	�к�A{#��َ��0��I��i��}4���j5�5�Q�
j0�e� 
^�Z*/=q<
��Ҏͱ�!�^k\�/�?{�䱣�
���-�����/�(�+����n�=���*�;H� 
+"�;kA{�],(
+�
����`C�^
�((*J0(vE�5���D����{���f�tI��=����{���=��J�6>=�Pu��^<��i�ҭ�k�5�K`(ȥ��SY'�d!�rIŧ!�	L_x&,N��5���.MU�i7��ƫLM&
0q�b\��@�����K�`�UDJ%���l���v�2���]gM�,�%���K�Va�W�L҂����3(QL
6Bo���������8g�(-Y�j-�m;�%҈���D-�B&՜���H5I��Vn�"iI�a�Y�Ȉ�]MZ���U&�0aX;/��[�A8B9����=��Tu���q�
Y�����@ueu	��ӕ�ԋ�4d���ǡ�[5�^<�������ƫ�/��)��O
�8���U�e�ݒ��]AA���AA��Ia�rEL�
<jZ��c�YٹEpTm&�E[�֫BwMm���g.)*��h�F4б�t�����ܬL�
�KRHp��֭�PꙎY�U\#��X��K::}��D�741��
3�e�
�����^��-04<*6qU���Ҋ3�8f.|-�!VH�ǚ�����/�WGLm��?K��9q,�@Jb�<,$�����V-]4w��I�
�͌G�
6h P�'P��'�R��:�

N�>��y2>�e�=��n�m(�8f��6*�i�+��m�`�%	
+,�BMuT��S��hE��
>�֯]���:s�
5GC�C�9���'P��ǠҫR�˂\Y��/K-X�n4����D.������
+��+��5L��&<$AM�Ĉ���#����nD�ƋL�L��(��p�*_��RS��ể�}�l�����X�X�BX��saYҜϴ���=�5u��H�4021������2IX��6o���&�G�%$�KE�:���G�EL�#�¸�,ՏUHK���Ϟ�F���֞L��tK
�Y2`\�c�:+gp��@�[6n�%H�`qp
+Scfq��������%�nT�@ݰ�!��O*�*DM��$�g�㏭�
޻s�������g+1�CYJOۏX����I�vKBCCBBC%@�,�gRjڡ�G3Of���(��I���yJ��
q�1;v���9�x����T\*�H��5�u)�\
J���kW-�XDY�U\+
ScC�d��ȥ��8%�J#!�YXۍu� V��}��M>�A�">9� U%eyչ�:�ҵ�h%��[Ȁ[!�i
|jen
db��:�R�Y0�¼����'�c=��`�����L���8����`��@��@��<�:}D*u��%R��N?|��2�����}�wI"��$cq��m��m\�m�l�mC{
�
�
<$
��T��+JK�sN"�b�a�;��9����8�i�����C�G����K�J�>���R�]�cT��૗?=G݁�?,�u��Q�\*0�),**.A$UT��̇�YO��~H����F��Hjm	�����Pc��T`Bo$}�؇�jd⢺T��H+iOL�,,$���{���V��Kx,�Ą
�TwLR�ǒJ�A(aQ���
��z�706���
=v��	��͜3w�"�e�(�n��;<R�')��W;&5PZ�j�L1$	����޹g�_|;w�cR]9{p� �
!=-�
N.
���﷕ե%���䍧��03ƈ X�����k�K�%��|�?�d�A��o!�� �^�x�gP����ܺ��_�t�ܙreQ>�5���=q1
+y�,<\*
�J��@Rtl|B1)���r�
K�etT��תNq��7Ɉ�M{��U�v�T`��]ݗ�n%E���t�t�&�B���l�ZOG�,���ގ�
*.�%���o?�&3=#S
���'N�5��c��
�}w�E�$���NU������A	`}�
����k���9���U�G-
����T�b�=z(u�h�� �M�k���w�1�������`�p��R7��.Pi����4G`���;mc'l#6!� �\����
��)�6nwdmm�h���Z��ː˫ʕ�y���qQҐ�m[�9.��8q�X;+3�Q#��������[F%��K�,=y���
]���K���R��t	7���R���5��.qA�L�$�I 0^_L^*u�
�֚Zd2��@`�j.Q�k���:_����0��X*k����
��%����d�a	:!`�+����Xz�z��QH�ehlfamk���<q��Y���E)0X"����Oܻ���
��E%<�.�LԤV|�
�D��Z{͚{��{G���C�:vs`j�nLk�A
W��\**����<V��
C�;$HX�(y��9����431B���
+!�w�^=�/�`U�*:@@����P�$*)>
�(����Z
ܽ�܄R���,���f
/*%)!>6F%���ˣ IP��I? ��
?q*'���tYEU5ǤF�)c���q�h]ML6��d�ҍ0е�rns\��|��V�Ě����%��$8�����b���<VqU7Ê;���3 �Ģ�������i��-D+��3D*�Mܗv�x+�/�742��:�/X�Gs��SF���З�q�u�ɈO�d
�8���k����kW�/p�9�e����������!��sT}L*u��R�?PI����v�ӄ���Y��[�F l#.i���ǩ8��� � (���6�Mj�0A��VW���8r(59^!

���n����fO���`gmnd0r(�p��<�:��T�e�*KmP�4�t��T`*/++---+ UT2$A��T��h�-*&�c����RW�
R�'�"SI�_�4�Ԍ%�*d'�.壴 ��M�SDJK۶"�V�dc	iOİ���^
K@��r����g�y�e�QF&�6vc
�\&M�1���P�V�Q�0�<:.!�+��"��I�ך Sߺs�!_�`�T��}���0�;UMG�F�L��̓�	��}.vkq�:+�08���U]Z�
���qcG�X���#���}�.�pz��?h(R���S�_B*�:��8
ܻ}�:��@��Ae b���C|��圯a��s]c��5s샤�T�R*��k�*���$�$[�� ����Vo%�}�JhO��i̹0Ɯ�fw�,���-��]�����u��{��}��L\�i2�qg��'$&��i&]�TZ^USw����zk;
��]�Ib��Hq�r%����
�z��!Ёr$�D��؀q��2� �%7�оH<Z�_�5�] [...]
+�
��
=�g���|=ݜ�̌�u4y
Uf�B*M�@Si�_M�1
�&"��J��ź�ͭ�ݽ�6R�8u6)5Kx����q�q�1�:�@6=c��%��T��	�R�c�>�{[�&W
�ez�j@%E��$�Jc>�h�Ѳ�%ȃ��{h,uu.]mnjjl�����Dj$��wtv��i��<�I����b�%%�?F�*㒉&Z_
�@]�� u�
+�H9�����P�{��9X�C,�*�X�0��_|N�]kŰā���(M��4o�*OCk��������������Z��M������������UQU
�Z�I�d���J�H�I�#r�E��������%���Xw����ȥ
�K��Օep4�T�gN�u)$�$obq+�M�
��hi�����rӦ.�` J�� t�k�BL,m�J^�J��J/��꠨4<48Џ�
T}MEiq!b	>%%)�\B�Y����s�����$!0�������2$
�I�e0�X���
%#-
��
�D�!���.]oi�8QQ��%(�&����Y�T\�f$J�-��;�p	Gq��2V%U��6ذ�
+[�U
>�7�n+;v*>9M ,�T^�U����v߽|�/x����z��9Z�Xe{���6�W3���WQ{w��y�9�[�/��Y
T���1C��H%���Ti��Cst�^Hm�4n#�����Jm�4�:�@6=�
��ҝ[=�m�Vk+K��3�'ĝ�>�%��WG[
SC�%�@%e���J�
�JޞJ ;QY���g�:�f�a���t����B�6D�$�|}�T��d�H`��Xy��I�IL$0V_
.
=
$q��u	"_5�H^N(�ll
���@�
(,� ���Az�0E�4��!��$QL��J_N�>c���Q�����t����
+{G��k�}�7�n�+J��‚�b�D��0i�g����*��LLj��eF��H��g�8����������ڪ�R088�X]�
������}��J[+
l��ښP]�#���H]�<	�L(�;*�h*9�ET���ݷپ
z��Gh��
+�9���T~JrRR"NRr2 )-#S�C�TRVY][L¤��ӋAc
�Tv��EJ2/�@2��=б�yL�4@���q��d�|r5&ܻk��Р��k���1Qou	�D��UIm��%zˌͬ윰�n���@���	)���K+k�IU��?0�M	V��/����!���O�<���VwG۵&R�����S���
���{��Jk���@�yH��_2T�
�4���[��|����f�
2z�6�F,l#�Q��h�m�c���!�ˠ
���_)KW�ˋ
r3����
9�g{��
k=W9�Y�.*-TA*Me�4�R�S�~���
�.~^�^	�ȥ���7n\��?�m�HMBӔ�$*��B���FsH)��$�0L\z�|j
,��UYv�0?7+�|R<b	�Fc�����Ҟ�&Ou��l%���
,}Ķ%v��4n��I
(�!!.]�����v��*wO�
��[�w�ދE�U����о Rs���5�p��/N�����G5�W.��7�
��[�D\b����
�y>	�X�b�.탺������������P_2�:&o�Y
+�t].�J��f̜�<���)M���J������1���񣇠tR� �\��,��fge������a��Դt at Rv.ͤ
+`$
�I���AАdW1�s�p˷9�(��4�H��8��(�K�)&b���v��
��c��
%t��f�
� ������JP��5 ��[�;�y���y��	���������+Wo�c9��
?y���v|�b�?QO�J)
��h�כ�*K/�g��$�>~x��m!���]�J�@�E�H�,�>y/T����<RIM�dba������%��ȅmT��6:�m ��a��b�m�@�
�K�,�� �/]f�&�=y���
a��<ݜ�,͌�J�Jr�J�oL%Ye	���g",aV"\�����h�����s��6�$4M"0�$R0)��j�H_��zc��#0Z_x6.��
>��X"J
|��+H��N
�������.�����&O
?�
r*YX"P�HJ�((A at T����ohlfim�����v}@PHX������IQJ�g�
.^*��"5�$��&���j��$�D_�a����ܼd(s7Z��\z��%�KW��*� x��
+��I]�:@�7X�����.��6+0zCu� �C,)�ĺ\�d��P�.'� T���[,F�
�J��ԁ�ȆT
��e������9ق�̌t����,Av�0����TU�Lb�Ɲ�~r�aR8L�Q2��qR3��F
+Lb�@�C�)p	���%(�&��N
?�?r�6��x37��%%4xj
�.͙
3g��<�J<�g�F&�+�W{��
��K䃕�W�7��vP�`h��
�т��L������]
P�ʊ
+r2�'Ğ�������`cal���TRR`���{��g,�	���J����j�Ѹ�3�
aaqy�e�F��6��Bi�e����	�hR�ڮ]m��,)��%ş�*j�έ��^nN�+�J:��J�
i*}�釠��$��e����K�Mbƽ����ޛ==��]�tCG��{�B�}&ȣk2���	;c�՗lqI��&)-1q0�q���.u�xۀ�?)!N
+KV�g���j��8���;�2�1�H�E�i_e����$�$-�JEiʔ-K��Ri��v�H$�R�Ɖ������;�;3�>����N�2�����y���y��pU&���5T�L��F~���aD�zb�O(���ҨϿ3v�xeU��Z���,�ΰ��o���e��/_����[�cA��r����/&�u��������J=�ԃH��X/s���ߕnoejw'_�q
�(��A�IJ�
+H񦺴owB����0�8?oO��˗:.��X27�����P�����\"ߗD���J�,�<�J?�Ά�
N
sOJe��z�*������i�RSR.◒�z	�����W &�WV�L������XJ��3����p�[���QP��(�R�
X�K(�X��ҠKD����ָc�`
����tIG
�D>�{
+���-tZ���!8<z{�ރ�N_H��+*���^Y��v\~6��q<��-���űA
.�ڌzp�je�87���SG����9����u)Ri��O��~0*	r}2Ri�tk�Ko�b��ӐT�4��4
�{�&�E�D.@��޺Q[]^B��xrRb\LxH��U.K�J3����@T�)K�{�4�(.5#������$)�$z`rL�Lp_�����8.�f���Ϡ�3��U_A���/����,��]��ڞ�
\�9bIS]UEYi���pɮPla[K�7DJ�rP��>Y[W��ĜB�~��R�����6��E�l�O�͊Rzfv^aqiy%TjʤFEL��jRO$�a��Q�WX
+dҭ���.y.��}���:����b��p�KG@��yC���Y�z�r�%��m�zO�b�*����:q�2`	���X���J�"cs���sT���T��+m�8�'�i0�Ԋ���
�RQa~nNV����4��32I����Rd�Ua�h$�x�
,U�zA��4
�����r^��!�o���Rq!-���=	qx>�~>P%\����H�02��jkii⧥
P2021�2m�� �@����
����ӳ!ʪ�ݸu�������?���p���w��+z�� ����=��*+��L�p��=�l�*y�F*ͳF*��x*
��T�SI�P��ڕ
>��a�;�«%�(��i��iH����x��4޲�Gb��3T�G��ݮ�~���0'#�܉�I��[����t*��*�jrT��Q�$�%
K�d@�@]"\055=�����"�0�;>4�
��.�w$��|�qa�\b�� V���E\>��y���,AA�Ahl Ҟ�>Ie�8�Ҩ���*�R�P����C�=��~���V���
ظ)<j뎝�{��D�@\"����������~T%�HR �����f/&�W��c"�F{7�ҍښ�JIiQ!�K�y��FGl	����ps]
��LpWSc����U�Q� Lc�P%f�&}P�潩�
O�7���x��RKS�;�n�JJ���y9��Y���"����J*8&1[��=�*dR��I�:{ns0V���R����!�`oO��tIRe"3=�v4y�
8�������}<W��:�Å*alh�'���2i�D��ƦV�g��~����}��-1q�Iɸ����۰��GR� [...]
+%
%S
�Ҽ_/rZ�������yKtl�7��
<|���
���+$��B�~�L�>!��c���T�HS�
I���!_Z�={Y0��Ο�7�������&��3��g��s�.�:��;1~{LdXhІu�k�W�8-v ,��Z���jkj�M]��4?%��@�44u�
M,�f̡�M��c��+��>(Ƚ�,�
������bq!�)/�|H$qQqI����0�6
�UR�p��N���"R����?\"�)��l���� �v��c�p>;��D����%��dc
�kafbd�\�������*YN�a=w�����^~��[�w%
>q�9\{��{��
w�*�����LG(�2�ؿ�j&���v<j#zp�ZRR��~��/a{4R�c��S�J�>4�F~�S�̊�u�RLܮ�d�����R2��8�'2��f��s

��u|��'moij�S��x�<Pi��X��Z��JS-T����JK,f;IQ�����db��vJ$�������
(%�yb2&å7
�8]�ӂ@�˂�G���a)*
���I�d7o�̩��F��Z���KP��SY�4d+J���Y)20"�pμ��\V���Z��=>qOҡ#�YQ**�TV��޸y�2�����b&�Ф��w�����CW�&Y.A�f���r�.
��۵s�֨�M��=������P�`	t	�`&)+�LTU��*�ZL��Q)x��_�J��b.
e��1�
+j��
+	p�H,.���LR^Yu�c6
n�t�]]2�w`-��B'ht|���\V���ji�åa�8|p�,2,k�`	z����`���KF�zz"�H�@��hv
����6E�������˹�Ҋ����`�A�*��~d��
�<w�Ǿ8�\\#��
�^)G*��=~�
��C�4{��J�?��P�v)���PB%:
x�8�����L�D �T��9>l�{���JTJ�p���Ҧ ?J���T3��@%��r�A�|�IG�T����H$Dդ>�$w`�����b.q�%�����@�{��`��0O��X�R�zO7WgG�s�gXY���h���(�
Ow�x�
�X.

�B�O�2���W %Z�
��J6��

���t���
ظ)<��̗wP�g���Lv6�Y]7�fM,���{����QA�*�"�  `�	*6��r�
E�M4Q��$���-߽߽�K5+�3
�����9aQ��$��g�:s�"o(�J�q��aדn�0�I��QI#e�X�<�x�vc	@��@c�weyiq!̥Kygs�y�����
�

��ߏ��K:�j*���
I�K�%�fϙ;OB�##�T�d1��N�J(��^�6���8�����
+o�*((���/ "a$��s+1�P�P�'�D
3>5�(��r4H�{��.��Va� ѠKd�%#�P��Z�f����r;�,\=4�TU�����UT�5�QG3��ut�����
w$9=�tޕ��W�7�v�(C���%
+3�����p�
~�b���JU�ŷ�_:���?"�R��ƜE���,T��ʧ��B��}q�J�%�jL%t
���5�F��{^�㏕2�P���(��L���=����Y��4�S�J�����P��%
$�}}�0��M����}d%�����&��c�%
ba��P�g5��Rdx��-���z{�,[j9h 1�$/Ñ�7�;��i K"LbCi:�Ҭ�����
���ghbjnmk���c������m���#��&
M�8~"���d(�ԑ���a���
8�&љ$I�H�O/t|�~N�K��Ki�FK�?�NfC�%
�����`g�B#}
Mu%Yi4��Ksf�CP���+�hh��Z,AT�TJK�7c����c�5��� X�� .� ��
+�+**.$�q+*�k�0��i<x���*�IC\�I��E�� ��1 8���U���h�.#�d��$
���D�.`���^��Nv6���꣹\RQV&��k�T?XX�9�xx��
+�$9���M����m�:��{�P4��<��b&��?q
mMu�J��iI�(��ݝ�T���g���s�Tr�\E�t�\���]t�>
�?��J
�a9�4�*�=���@��z�� �fO*�ƒ0��0��L�׏�D��2�k�L��c���K�������
�X��c���k{��u�.�v����:�Jr�
�ַ3��1}��H�?,}�g@�/_(��
%e
+%
k[��
^>k�7m	��g_L�����l:�n��ԏ
?��!*�$����6�������Q�fלp�x�+-�M�RNVzJґ�Q{A���!�=ݜ
!��t��U��d�`.��(IrH��76E�v��ۀ���T⍥��c	P��j���JKK�+--+$UU��546#&�CLb�
+���D{��
3	MG�r�ѱ��e��s	��J.���9�{4�*���
��%[jcinjb�撦�IUU
CI��x�����e�� SȞ������3��,,��4�0�J�<����qr���R}5�����3T
+޲a� �8��J���vӶ�
��5J+D_�-s
�sP
�я*�Ju�e��.��/H%��S�JK�
+b	G9�
!H0�M�
b"$Af&
��$�������%j.�-d���>쬎�-M,,���HM[E��
+
+� \���hge��HO[]EQNz��
<mgL�������/0�DC�#-����	�}������������7oݾ+to����Rҳrr��]��t���V\���t���Ϥc����k|�9Wj�A.
��O
f.A�>w���cG�FG@�������e��E��Z�ʊ�h.�$$�͓@P�����106�{�v\�^��J0��_ӱ�o�>� hm�G\����r���� I0��(�:aU��>㩊E
'�&)�`�%��K����),�4K��ٷgw0K�%V�f
��\.ih�khhj�袩dn��~��
+�Ҏ�{c$�d� *��
n�{t�$Q6�z�
H$��A��?� ��~�y�n3�J�c#Ä�� �٩$�(D�p�
*���k�����|��F��ҫ�
�=�hmdQ)�@��A*)�KO5*��%�9�����
�D
���I�.���D-6:�&�Ѹ$<��0A�OK�Kq��;�Uk|V�99�B;7��RSV��/���i �%��I⡤��dic������vC��
!aѱ�
M�8~��
��ݼUt���v_��{���+�ץ���I"n/L�x�K(�z�i�T
s�7��Ϝ��LKN<�2��ߪ���P���5�T��d�9
$%�Ó�\ %-+�����k`bfiK���S�?�H��G_�����榆��ښ��*x�𧺺�������0	�:��
ä!,�GL�a&%�8�����\"�A���[��t���3P%Ra���X�|W���/��0[�撮��z�J0�,�m
��V��ݸd�9���y���k�E�d"s��0�8���qT�y%�tN� [...]
�7x(QMǸ�>�uFR�%�0�K�M��R����X��4�*
�`	$c������bS4��K������K�{�^�ik0�)15�$P�����I2�� �DB�]�5�Ҁ�������������BQT�Xd8��ddj)�JEe�
8�'E����{mM�U�wn����b�)C�����XXz'�"��L��By?! =A����Ťw"Ss�.������Pv��&?�4�8���<h{�)�c��~�?Eq�q �
v71���eLLE�C�o����[�[D ���� 
+*�\��
"WѬ��kL\5�>��==���0@���>?�4e1C?�<��{(!vxp����n��1
�j�
+2R��7m� 
[��5`��PN�������������' (4�@lBJZf�����SU���\�����K�I
�f�з�"&����~$Ͽcܯ|]‡Zp�s��Mƥx�]����,/+����ăQ�a�����N�m`�!��T�e�!.I����mC(m���UPV����z��LR)�T�2�~�
�ċ��yK�_C\
A0
5�D�
1���	�I���̮��J��Yv�D�
��]t�9*=.�<"����pKtw��������b)
�
X
+��K�����P�%u��*�K}�������%n� X�q�Ц�H�:(�f�<�'ʴ/�����P
B�w
S����tթ���0����O��bOu���:���Tr��X�*q��%
�����	d��_H$I|L�F�A�o8a
��'.��&�����.�,�eN���

��rs��63��RWU���.!�����B��~�!�.0I0J�zx 
]=}��"�&�
���/*)-?S][��jK[獛}C�G!(ݧ���8'5�$�7��
h%��^���,p	/8����%ty��6_�t�|M�i|zg��&�EG���z�9��X��j�R۩��㒤�֭��[�JHn۾C�8���H� P)�T�~�*q����D/�
K�������\�n���H�&�M�&=��>#���̌@�V���^	k
_�~$f��
�4�Ƨ��
�
�t
+X��&Y��	�djd q	\Rg�X���Z(*�[��;��� ��A��
+��WZ;�����7�=��{.M��� ?�U���HD��Rldh���jV�w�xA["�%
��C"Q$�Mb���R@��F�5\��E.�e�X�XWs�����HVZr\tD�
_O[KSC]M����m[�|�٧��_ׯ[��C���
�(��A	-I%'WO������C�YG�
/;]Y}�¥�ͭ�ݽ���#cDPB'5l�o��kE&-����
>��'r��[
���8��
��ZqЋ+�
u�΢
W������?<d������-����k�2�K�%I			I������N��������Ï�R�rT���;NXz�#u�<�4=u\� ��M�ưH(&�I�\��A�{zPz� %amXI���N�K�^1����
ٴ�aq;��)Q_[u�ԉ�KaK���f�(.iij�����302���sp��
�
k8%=�X1V�jkGO��ᩇ3
T��l�W���t��x������@��Ԭ�"�
3�Δ�gNZ�*1Y��p	Äd��B�}�I"c�DDI�������������=�%4VM�Re9
{���I����x8۳-L
t4Ԕd�$�7oڸ�����O8(	@IP�������?:.)5=;��'+���54^�v������;�'(Ѷ�Ka&	}D�w�ʛ��a|?��K�8 S+:�g�qih���ζ��M��>s����hNfZr|́}{��y�;;�Z���ik�TU���d�wHm��]
+�������c`bac���~� :�W��/�9�%
� �K ��q� $	�$¤Y�I���ֲ&����NTN۸q��;�èg蔸t����d):X���KŽmifqIWG[
J�db�����ߞ�Ș�C���
+i[;A���{H%b��>	S�g�"F*�E<������G���[.7Ծ�*�䈟�]�4��Y�J���c�7�ښ�kV�J
��'�LX&Z��C�$�4�&�QZ٘�h�8�Ec��O�fɴ':�UksS�y��E�9�c���{�9�Y��i��*�Io���sx��g�>�,�K���%|�Jf�6���B)&>)5#'���ĩ��su����uܸ�70426>q��?��D7��2L⿝����`~&����oD^
+�K���]���,/-)���b�� ow;k
S`IS]MEIA^��c��������.-]C8
@��p4!9���	�&��3,Q���
L!��MD!�0I`�cFN���
+J+,�Z�K
�:&��n"� �
P9�RR
b)���
������@_OWWGGWO����������PV�HA�I�xX��b����h�W�ƃ?�JϿ}O�Şj��
���w*�B�,�w�D�D�D�+E�B�(�x����	/a.�Ѣ��x�d	�U{��Ɔ�U'�
�NO���

��tu��25��d�(�B˶|�٧�>�x-f	\���J�>�����

%�>�={�J�i�9G
�K��T��_ljni����

Y���(�
J<]�I�� 
�H,��4���>r�Kx���%X��8.�‰����N츚��eNj�s�� K����Ķ05�����ک�]���������
�
�S[W/�Rʯ�OX"�"X}X�g�U�K&HLP���SS� &qL�sj���wKP�����M�
�O�qӦp�o�vw�]���e)#�����������\2Ї200265�d�9��{��ML���
*�"U����ۅ���W��JH�,1]"a"m"8"D��0����-U�͘��E�/^�^S,�`Qii
����SU[u��� /+-9.*bo����=��D_{�LFJBl����K�*l�Z^�I�� %w�ҁ؄�����’�����
�.7��w����=z�iޠĹ�E0�gA�a��&����o�ǍKLMN���

��wcC]���'�
;,%
��|<\
�ؖfF�Z,U%Ey9Y(9yEe5uM
��m
A��}Q�R�1rݵ-[%:K��G����KL�@�i$"�2�쪠�
+Bi���7:›�
��%�fgpą��,� 5�G���h�R8���ޖm�\222����Օ��o�Mlh��F�Fc�Q�"��8�
��{TD��@,�� ]j��=�&E
]��f�.f��9wʽsϝ����O~˝<���},,,��%��P����."j�����EV"9
�{x���G�T��T"��\���B���/_2H�&�B��U,����9]����\��s9Kh�X�6݂
����|�䣇�����!�m-M
�Vh��h��9�f�����%p	�Qҡ��(Aiρ�G�N���>[XR^U}�jͯ7[n�#�~�%0鿬���?D3כ�9(	C�`��Z������6���s�E�9�i��G�G,��K�pz�l��M�
�V�@.-]�d�R��J]}Cs+;�@��*���*�Yz�������l� ��>�$E�8�K�

%ai��(�.�Ԩ���d���9)K�%,m�X���.	
�<;[k�ll%G���_k���U���t_qs�D-�1�>&��b�!2]�¤�^�H��D@�99o�=҄q��j��E���f��F�KՕ�Eg��S��
��=&2|m���ȉgcal���t���sg5}�4���?& 	L�|���Z2��e��v������I'�2r��\^uP��ohji���
E�p�(IZ�{�D�oꦠ$
Mi�rI~x��7j�w;�Z�o���������������Kp{K���b��;k
S������rm�e˴�%�JF���B�'R):��}H�lN���T%K���~��0rip �$y� E2��8�?�&Qz�J�5:����谂�������x
+?n	\q�)�t��R̦���@?oW���������Ξ�wpr�y�Ɉ޶s����R�� ���@�
�J�P	-�1�>
+�����e0)��L��f�s�ސa�X��p�Ҩt�P�.���.؄M0UW/���[/3���ă{vnۼ1,���U�`gef��R{ɢo��z���_~1�4\�>��q��$Cik\�^@)95-3'����܅��j���jjm�@E��o`�ᰤ(��\�Զ�-)��H�+%#�
+ɱ�sx.�K���)��o77ބ�
+,U��f��JA,��X
+���;#�,͌

�K::�utV J��f�6<t
+��m��������U���*�X�.A_z8�e��� 	��"��$=5��%�SN���
5d"�6ʮ�O�-!ͬ����"#��!l-���&v89����[�wt��zx���G�@�=t�T�sE�D%�{��lL��I%��1*��ג'�H&��Q <�H�&=��1�K#��?�v����s�;f�A7
�p���\�x��� '�t��FE��z���Z���]�l�w
�͙5�_R��}�2i��J��B�`��������Ҋ���R{�fcsk{'B��`�!�(in�H��!�xKLC�ԨK����z
tw���k]�U(�e%yY��QK.:2b]��������������@Ow�J�V���CU2��[@���
W���}	X��R�{��P�dߎ>
}=lhT��L�{�E�$A�4�ЩA/JD�X��bpT��>L�ܘ,����W\KM��+�,�b���}<�]]�%G>����(���^���"6m�
*%�� �*�/נ��T��U"��t�9 [...]
V-_����sg5cbi҄	��q��O �&O��J)��Y��e��_o44��n�������phx�
%ZQ��$�A��9
f֚�Dt�^�
��4��C��&��TU^R�K�����%��gkeajb��@_O����j#3Kk{�����?d}d��]����	)��*5k��,IYB��]B0� ��A"a��&�T�
%��a͞���i�q��<�K�cBRq�)�.K;cc�6�
���p���'x��H������!jkܮ}����.ċ
�D�4<�ҧ��%�K
+����8Hb��0R/�
s���
�t�_���Ж
��`>��y3
�5��K
��N
O<�g����y��|;KSC��?,����gϜ>m*bi��&BQ��1Q2%�t*=+�������՚�
M-m
�����ð�T%�Hb��f
+
+i�/u��
+��u	��� uzw��•p���e`	/�Ә�ݰ䀥� OW���gk
u�\2���
�LL-�lyB��O���M[�@���J
,Qu	��a�$�-%	"e�DG��sv4��ktH��jxH���Ki]�X�D`鄄�-Q��@?oOw7���=����U�����m;v��r:3�����R�Jc*�7��&<�"�Ɗ1S/V0��g� �f�I]��ßokS��ګϕ��f�N9��WܖM�k}�EN<
�պ:K�`ޜY��)ZZ�&M��I_L�6}�,J�%
�3Yy�%eU����ֶ�������70�p��,J�h9�c`��\�)�A[wJu>�P��IV�#`i��u����͍7Kh����@,
�O�����"t\cgceafbld������������ �vH�r@���hݵi��_�o����
|;r	�2��c$"�2��$YQ���H����
��
K�8bC�F��\�n�(2(������.$����*vqq�]�=�|�C�"6����s �؉�̼�Ҫ1��TR�ҟ�yQ[$�X1V�3���D [...]
�}�~B(eJ�U՗�����jnm��(�
�<��I�hEI}�8H�J�w
+�0Ґo;��
�#���A���]w�o�HY� �r���#�6���z!����.����3153�����"7/��Ј��;�J�gr
+>T������K�K�'�&�IJ��$zQ"��`G�dr��ub\u
Y)�ùXuI��|J�Xʓ����g����ʶ8��%3�Y�����
A�Ej 	��^�v�*,XPA��yb}�����A�{o�sn�=�%����[p�Vr����޹��)�6N�T���A���)��1�x}rzvފ5śK��+`
ן�|��&�J?�J<��.}�J�Y��\��"!�DU'�-W\Ȩ|��
Lf\�c�
�f��;��!T�ݾy��ųu�N
9X^V�y�ꂜ�d�Z�d���~�0v���mm��.�B&
��Q�%Di9���Tq��ɚz@�Z#F�џO��|�����VӇ�%&I�$�B�D:��k�_���찓vIx.�Z�������%<�j�O`�J�ғ�q�ʰ�@?o��p.-p�?o��y��;/pqu_��

�IL��)\S��t���
�RK_U�D�D`���@"u~�1I��
ɖuI�
�f��ʂ�I�6
��N�a�,���V�eg K�j8����PTa��(U�VgH�;ۆ-���UTV�6�J7�*YU�ĺ��d�M�"SE����f�1`�L��[���Kd�TKϟ�
�2u�|C��c���ٱu㺕��i����� ?/w����:i���NC
K�����gd�@[{�!��%g@�70DA�T TKPj�}��C���7�>4��Qb�^
%I�>P]�tᓰ
�0���g�t؉���\�".���
+���<��ٽNK���)cX��⁥��>^K��\] &�
]\�{z�-
QD�j�)���J��*=�*�_�=��>QO��䌏�2I�P��d��G�[�W&vs,}�XB�g���Ԥ�M\
��P��+"""�T����䴬܂U�6lݾ{ߡʓD�;��S�JV�,q.�0��̮��B�#j ����\�h��0Y�i�>�A��<���^:W_SUY�oW���5���)�UDh��ǢsgM�2q��NC��A
�߿_��ȤA,J�J���X�R>Fi'F�P�xP�s���[@�P�Dku�%�I�F�����B��.Hw��w�V&s_�>�z�s����=:^	Kw9�*Y�
+�K�H`)�����p����"��
p*�+Ր���b톭��#�JO���)�8���
��藗
J�}}�Yڬ.qv�nu�]"?�;q��mi�X‹ą��5
K�c�2Ӓ�:�:6&:*2R�TFFE�Ī�u������E��س�б���\��U"m���$d�rIN&�e�
V�#&Qm�ZEE�΄��	ǫ��n���,��
���3���7 Ru�Ǐ
ػsۦ�U˗�'%�E��{-v�?{��Ǝ1
X�d3`0�d� (�5v¤)3f�qv1���(�0�t�t����j�������<{�����ZZۘC	��
J_-8��&qW�	�����n��
�n�#��ް�䄕���s�c���C�1ٽo���p�bi/fi5fI�VE*B��|�<�%�EPn�`p�R�NHJ���T����^|�J��m<����%\ʤ^
I=R��L�g���d��fZe	K�b鲑���;J0K��R�!1��REGG�T1q�N������b�zȞ��U#�n4�A&VI�OV��U�ćI�&)�� [...]
�
�l
���&�;
�$�R"Fi
�RF���F�
$����A	~a%�H2��AuA܆\�v��v�OXs�J�K����
�`�����nK�i��0K)�uLTDX�R_opi1�%�^>~p*)�b4��t8S�mܶs��#'@���o~�J�Yb�5>o0M��G�Mɘ�+K��*g�e��H4�׫>��$K�Z�#�RS�5`��c	-�9Y�Iz]�V

�����I�ٹ��o)-�.
��;{�tߪ�U%K]��7IL,�+*�|��;R�'�P�	����B�b�>�K2���%���[K/�k�75B��N�8z����=�����K\��̜>e��1#����vv���vv��Pr1z��S�Ϛ3����' 8<PBs/�;�(��A�
��Ƣ��C��l�0In/�`��FF�
�%�
�
ܴ�?a�
LR�R79�Kd�=�nc��`� �6b�2R
	�ب��@_/OOO/o at iiH�2:��WmB*
=QS�2JR�u�T�/���
�&�&�G�LmyF��$�Z��LrD͢���Txz�&�$�&`��c	6;���,K+��fg����%h�(�6PJI���/\]�q��]�ХS���Ʀ�X��V��*I�$�I%*[I$XL�p��4�E�FP��L�p�M$]
L\�8�,g��N��P��
�M���ׯ\8s����;�n`�������.�g�:헉�FKC;::8�;88::l����&L�:��FP�A(e#�6m�t����K@�F	�DPb~��CɄI
I��&�@��}��q���L<����L&OX3.��%�3�>�����
Kˀ%�&6Z�
^ .y�����C�*u�!53�`uѦ���
+�o����PI�%#+��7�d�&�3�*���$�"ɵL:9\����Æ�|�,p�/,����bY*��e��&�T�D@)-N��lD�j��]��x˪�U%�.�a�Q��,Id7gb�3�̿W�^�E>3s�I��8],LB��ʹdK8T
�
~�
+"����[��.����:ZQ^V�y�ꂜ�d�:Z�dт��͘:yb�iؐ!�Q�IN#F����Jyr(�	(�F(����C	P�%�(	L"M����½���a��`���Z�6�`↕b�C*7�>�S,=�a)YF�A��SEF�� ���|}���J���X�.)-+���]��U�D���J�}W�?���s������$I�L��F�eod�#��[��nuf]w�c�/�%ұ'��=K[6�YY���Rjr�A�O��
I�)i��TZW��d���*�J�@%4��*}�a�J?�Jr0�T�*Z�y�b�E.$+
)��
�礞�"��q�p�p�p�8��h��p�3e���� S��c����ʲ(�u��(�"(���TVi����3�̄9@ a�J,�y�QA��Q˶��[E�����s�=wH��cg?��|�ַ���P����v2�N
>�H�RNzҮ�@_��?�]�tтysg������W`Ҵ�3\fIP��� P�(�)�t�
��à�
�z
��@�
JL�/ZP��&������j
S5�[k
+��m\� ���#ð_K�X�,��d��c�#B���K�ޛ7o���P�
	��K�TZUA*��E*��mTRb�߼(`���dIv��L�!�Ѳ���&�Tr.i.[�8�M\Ko9,�R,�`�R,5�V���
+�r�2ҀK�		��		�I)�i��0��˫��4
8|�4v�Vs��J���J*���J��.zKB8�K ����1� �v�|M}�#a�"��oA
r\��s��\��J2����(z
��[�/�;���R��6�
�V/_�Г`��i��)S��nʔ�Ӝ�J�J�W�[�P
+�����WXL�t�-%�^��P����Ll()��Q�
ފ"���m2T�Vc��IL;VÕ-|L!�M.�窷r����KN���

��\���uB	�RL\bj��`*��߷������L%�\���:�ƭ�$e�cDz�0�-�hXG���0�Ȥ��R#u
����%&���:�Ra>Υ�Ԕ�䤤��T]zf�>������$�ܸ�f�$T"29�䠒-.iA�"3��"����W4�R�G�
���q����G�3��%5�6����>���Fɯxd��c��k�.�9q�@cCMy�!'=9���M�׮Z����;bi�t'�ipNӝg��~��;�ҏ
J1q�iY�����(�(�[�Ҹ](Ycvn9�^
"�
+,�X��2�i
�� �w#�� �I;eY��%���,�>pXz�X��%#`)-9aWLTx(p�o��v8__?�RhDtl<
+PPT^���Z�B���ށ�PI�%�x8ɇ����i0IY�$�$��rN?�J&��D0���Ѫuֹ�M
K��C�Q0����+J���<}vfF�N����ӥe ��
+L%�Uu
����<{���m��n�P���J*��&��L��"�‘$	|��BO�����>��]q�]o/�X��
�E��E�E�E�%��0� ��A����c���c�<����X��
�����OkV,�X��2s������ȤYs�{x-Z���e�0@)	3Q����TPzŠ��e�ﰑ�Z�@�7@
I4�� �X��e��OP�WRC��F&�$0Yi�R��z7�,���a�Y��>3-%1ngtDXHP`����??� �Rx�θĔtت%5
�C
�z��]B�'�C��Jְ$��G��GZL��]�T�IƱ�
N,�&�V��V���R����Kj��KeŦ��ܜ�, SzzFFfV�>�`,.�����t��S�.�J�c��B
kSI%��J�7TR��j"�LBoѕ�H"D�Q�BO����~��%
�_c&R84abG�ń��� �%͹�t�&���>1��g
ʁ�p,uݻ�c�|,��غyú�˗,Z0�}��߻�̜9�����6��뇥�����$]&�2
+���P§����4�do�"�^0H��*�d`����`jP9�� �
��L܆��v��GK����a��h�g��&���D����BB�#cb�A��|cie�&��J
�ߓ��W��Z�җ񉜒I�i�Q�d�v$�����D���$���gT�K㶕��F%,
�`]
�`K{�k*�K���%=�	.;G��o0��W�6��Olr�Z
t�
T�(�ԑ���1�zK@�zX��V�*�������{���c=#YH�āI�%��\����(��
=A�:-l,
±Tj���%�F��n����U�%�yn�sf�›
Lr��P�]��L=@��nt���Y��16F3�6�d�k0��7D�3"�7����{T2�S�L�B��M�ndD����l7�������[�X�'X�E,%��






S	�*J ���I4�@��IQI
K��I�Ҙrھ}K�-W�����wo
�;�<�\�c��
�u2��X��}����ZX��=
�X2�`�8,�VU��
+
��rs�z}nn���XTRSiOS�'�\�|�V+����h��@��wP�A%[F�D#��
�ŘļE�D�y�
+=�~�X�f�]r����;�ł>C�a�(����һw�\m59,�X��)�R�0��cƒ��y���ڕ�#���溺�qu�
L�X�p1 at i
�RB)5Co0	P:u��U
+�n���*(I\�
�\
+*Z�{ֹ�|{I5�"<f�@�p�R�Ю<*���!�!k
+L"ɟV[�ݴ�=�aiLK]*,U��
�����x�RDxxXXXxDdT�θ�d]FN^aqyu������ZZ�
��'C%��&�-<Ye��dU�J��'49�LPL�9wͼX �n�;�y��TҴ�RjBs�
+��`OK݀���7)��
lnڻ�������d,0��
������꺆}��v�ة��ܸE��P� ��J*iQ	%a(ɘ$C�H@$LBtZ���������m���
���
���,Dwq`��D
�8�>يu+X��"�����K�l,�&c������@_�M֭A,yy���������~X�l�%����X�RN�������x��

J#J�J�JZL:�0U�I"�^��C�
�͢��ip
O�CPC��S����4�Z8��؄�N�q�X�)w��RA^Nf̥�؝�QQ�pQ�1�q	I��Yz����fwc�!� [���48i*}��Wk�IM(J�i�Lj��d�8���9�VT,�ֺ�.+����
���'ŰUSIMeKt�R�^>6X�Sci_C]MUp��d,�3���K�*�kw�mj>x�������-��l��A%�l�PJ1�����Lb#��D�]����ki�	w�;��҂�&#l��#��Ĭ%qI5�&�%a,���Xj�c)#%>&"�����\�rْE
xzx̟?��s�ע�K��(mbPJH(K J$�����~f{jJv�$.Տ�t��7.ޘ
+w	�� �Z�
���;�L��)�7�Tl���������k*O��?�3����^GWW],H����@H(Bh�� !�AQP�m]wtEf�Y?���+7�����n�J�˹�|ϑ
+�*��KXj`Xʻ����|3>�FԵ�W"�y�*@)6!)5#�N~���Ֆv�������3N���R) �T�䅒l(IMN��y%�$$�9�M���3D�D����^
+��˥5�%��W��[��i�Ҙ
K�&�^s�0?���{7���D��W�a*5�vt�x�G�Q柿B*�����PA*�����++�P�3�zˋ$b, �ʃ��������r�u�#��nE�8
���4N��������%�lW��W:�V��R��VK�W/�����~���w����M0����
��͔Ll�JMm��o�Q�����ZR��$%_&)��7
H�C�2xE�t:���
\
7ҩ����Z�na�i���O>X�|,�o�%�NSX�LKIL���u��U�k׮߈��OL���[P�3�j�m�
.���
<�T¸� ��������w(��V��D3�H�#��0�T�ìb
ȼ#H���Ғlخ�%�G���0,�`�,M<��dk�T�+
����‚���������b�R��S����u�,� ��T
+�A(��+߻��\�LBkqg�� 	�U]h'������h�
��p at .���a���\�-�s1����ձ��HR��ci1�XJK����x���#a���[6���&�~�����;�p(]��P���-Ԕ͵
Mm
�� P�셒jfd�G%&	�����F�e��NT�"�����xکsiY���U�
K�|-�Q�R5�R~��[�8��b�oD�݈��KHLƩ�W�U���?L���?�(����L^(}�ݶ���/��8]L1�x�r��Z��*\R,�XRXK
Kl޾G  �fK�c��P��-�����J����TTTWT\�)(Uҩ���������i��c4��T
+RiMP�
J�I���-h{h-�,���,������,
|mmmk�L�9�����\�-���I�%4�8���͡��X�
%K�~c)%!���
gO
;�Xڵc�֟�l޼y�d����"3(�$$���ͤ�w�x�&�N�%����"��%_&�D�5ny-�le��~�x25ڑN�*���
Lj-|}s�>����'Ks"����K9Y0��n&��������(�T*.%������
 *A����po�J
+X��
J+�=�w�k at 3�l$y%c�qt��8G.�:�V���M�`�BPj��>lQ��si-XZx��-]���O�Xr ��u�զ
+��L��hJ�4��LP��4�Z�
�
����T%̱ ��TR����Ci�'��$2�
�Q$���4
+�Vv�D�����h�Z�����6d"Z��Nф�"`�7�`L�D�8����:���6�Zmut,e�%�E]�t��K{w�ܱ}۶�[�m߱sמ��� �S
J�Yw JB����9MJj�
+�����]��I�s�|#H"���UA&S�^<�-xbܱ�#5|�nX6�D.-.Ji��c�髂%x�gs3O'ɱd2�i�
��Ɇ����x3!
/�fRrj���;y������j8t��瞿|�F��0�����#��LbHR�
i(j��:G��#�:�
+�4�ur.���b�˪Xr9�M�zK��T^�+�����
���F�J]�>R�&�΀J�J
A*��l��P�Dw!���I8�����Y�X��-$�P�uuKmmm�x��b���L��ÀMm�.�L�Ch-�|�KX��\bX��L�Eex�`	�g,�z1?351�`dƒ]K�)7c�G^�뙓GE��ٳ{�N�]����
=p��qJ�ť�J�������ߠ�J����:7ͷ�4��oR-h�h��P-?"WC�C�v
LdÒ����?Ҿ��Z���$,�zA�4F��,YK��Ғ¼��Y����D���4�R�݂bm��\Kk������
��J*X�$��0���p��1.T9"orG #�J��bɴ�Z
q�8�2.�P^)
+K�`���^
KSO
�? X�q9�[�`.�� &<��XaB(Y�Z�Wwo���xrjf�9����� ��TZ
J�����*i|d'a�oa��uC�����G�*
8����l6�*�*��'��d6WA$֢����]�N ���5r�qizfn^�K��y-��%�%��~}��
_���~Џ��ܬ��諗�v�̉��#�C���݃�7dhxġ�'N�%P�OJ�%A���D������;��J�l'�I��� �CD��Ȁ�$�d �q=�U (��Vw�vl2
�
��
&�����%�}���V�Ҩ���a.��RS�R��3 J��E����bmjs��}C#�XY�}�V�K���
+�1&��e3iT�r^ɨb(Y�L2�9D+j
˫���:t&Z�����)�
�:�X� X���lok��\.UV����\Uc��ښ�:�T���
���2q�A*�驤���W�w�P{A"r&AEGoyp%�H�D� DO����
�R���7�
xO�c���^�.�L�����S.������D���� XRz��\=��8������vڛ�X��LM���r����'�
>x ,t�>���a��#�N�.1(��i�+ 
��.7mO�f1
Q�u@)�PZ\@D&�΍�Ʀ*A[���
&t�Q9� I
��;�%`�i�-\�v�.,�v���o
K�O' K�r]Ku5�
+�NS\�����u+##
.##3
�TXRZn4Րv��ۏ��-
����[���%(�4���3��IX#F�*G%#
�)��Ub��;G�N%���ouD*2�.A�{-Q��a�ߴ݉5B’����aoi��d�I�zh��
����p��T
{����0��TN2��T
+R)�R����H|6��%�0ip ��d�6c�~���,�j5M	\19���h���:
D�	�UWom0AA'��s�1���%�y
k���}��˾c��%��������䄘둗Ο=}�ؑC�������8t���Sg�]�o� �I���(-(CI5�%d�+�$�|�"4Z�LT�rI.B9.ȃj�
z*�;L;��d2!�Ȇ%�ɷ�+̥߸[��Ebn�ai��-`�L�s)7�6�	���_������j��Id��BC�	2�@fPQDAm�'�
�dz�w�o�cR�M˾ン��z�ʿz��(r���j=�7ڻz���S�x$��Ʀ�҇o��+0�eҌ/!,c�
=B0��-j-ۉq�dD$�
.@Qe��2�s�u��:4?�VJ�
�P!��9�ԳU6���	����k�Y���K
+�F��
/]
O�mjb�����a1��-O�[(��w����O��!�$����BK�����#�-���f2%!\�.��J\��b��Y�;Ngq�˅T,C
R�2�`.䠏��ҝ{�+�K/6�GŒ�n���;�z��Lc�n,U�:
lW2R.��D��
9}����?�8y����.2��9\�Uu�o�w��G&n��,�lf���#CiG�\
+LL�4AS��FR'���zE�
�a5H@�L�C�II;��L�S����Ŧ��8L
�KԀ^�[C�y�8o�R�������.�
��)�:������J
^E	l����a��@��\ڻH�5{�$���R��m�ʩ��<�d`���s�u V��;׵V�KR
��`�Z'�B�[n,R�o��;�F(X���s�|=nk
�V̺N�R?�9>9
��/B�gk�q�
��~L�c*�ܶ
J�6��m(=ZZ|0'�D�
+���J��ΉH�+��<�,��
8?��CIR`�:O���ꚺz�����V�6�V�=��+�-��k,�k~�N>�?�Kn��Z^VZrB\tD���_N����'N����i
������(�u��F��
=Ya(��=�RRK�Gc�F�!�Y nd�Z0��SoJ-�
6G����W�^��]A�Q[�K;S ���`ҥ
������¿K��2����)X��v��hl�����r���q8�ـRu
�R[��?84:ɣ�X}�Pi�۩������L��$L[�IA���HR%@b
	�X9G��%��b��յ���<�&iڲR-3�D�P��c��Œ�^K�,M��Y�)�pGp�OG'W
��$oϱ]P8_n�T�
S�J���>���Z:�k�

ϤvF9����"��eh�������\�C�������\t���W���U���ܢq	8}{���Cn{({�~VX:x,�W���F�Y��+-�ݽ����ʲb{~NfZR|ltDx�9p�g [...]
��$5�FB�1��
+$C~>��+E����j؀()��;]�	0�B�ݘ.�d�}M
7�9��ъ�a鱆�@?a���z}mu�[�V�2weu��:�R7��𘔂�+�~��
K�q��f�T͸G`��ߧ&Gq=¶A�c$�d :Di�j
�d�:9&�H��VJ�kR�`R�4OZ��E:m���~�
Kf�T,ݧ�:A������vwuuvvuu{}�r�8��L���Z�ޛ�d��AT9��߀Jf���D��۠L\�G'�46�L�b&�43��D�u�Wp�-�B0;;+33###]w2223����9�pe!���]QUS����.Q�W3b.�Ukh�F,}�K�74�%��n,ݛ�Vƒ��]RT`����y!����!gΜ		9{>4
C).!I@��������

��$|��tW�S��~�a��MC���+O�R
+LR�
�*��SOKUě�,8��2��O3
V�� �O6QMZ�5�
Ki2�
qi¼�ϥC�����Z�҂��0a��
o��O��KG|gm����vL����Z)�X����N�#�E?�P҆����ICb&�6��$U2+����
�uD�`�`
�
�
�ֱR�la Q��MB
�%�k�z�3E�{���K��]`��'U����
������$�q�]�n��雐b�J
S�J_
�͘����d"��nN����["'��,G!���8�HOKMMIINNJJJT����������4��`�;�%:/R��c
�~1��(�wm�K��3z�|Gu,	3�
+���=�ݹ=�c�c���帖����
z�NhXxDdL���i�WlJ���N�phlrz��
��
I��>Q�sG��V�ӗ�eL�J+�S��|��]��f׫ dPT��;B����&�Ⱦ"�NM;�aEW��Ҏ��`n�"����Ē��-���ҬĒ���MT�
+��
�]!>��F�R��Œ�������J�u
ͶX�9h��&GL�ɨ�I:��u��Y8GXG�N��U	��`jlni3q�
D���*��Y{H,iz}�F�ְ��p{���ߋ����
*��^�"�rU*mk��|L�.�
%�A��s��P��.
+D�CġD������ LINB&��_��+��t)>>������^ ��p�Ja�rVk{���o0�si�.\���WJ���ل%�K*T"��������[D�MO�Xjkn��(uگ�f��$%�]�".���_�����PJLI��P��4�tx{��j�=�/T=�6��CiW�~�P^Q�T%$���s/@�q��
+F �E�hr$$�PB�;���N۰{�
�دl�VO߾)���-I,�
�����}�j���*q���u
	
r*M�l]�u�^���JVP�QZ�8�٢.��I�dT�dL$ I9(���#��@�Q�#�r��{�oA���%8��Z�vT,��
Xz�ֈ�te��
+.

�� ��C#c�-���
S�5}�t�O�a������w��u6|Rr�H{ɯM� Jȇ �
L�<��J	I��9�0�
+9K�^���������C�FEEE�� ����
�]-(,��g�^�����C�S�f��jSbI&�'}��d��_Z�����S�mR�ɱ4�c�����]Rd���JOM�
.��ͱq�RӳrlJ�-
݀�����w�?Xz�DxL@����v}�%��<�t/q�L�:���Р����D��x���d�e�H� ���n
D1��*�DکV�v{��-��W�Yb�2�
=��u��9��$?�
��s���������OC���{!1�a�UU
2�w���P�	M��y�x�Ij����p�+�Hb"������;'RGj%ĒZ�
+�l�T"X*9�4.MLM�a��������΢��%������*I,
*nM\
+|�C�#�czLꊦ�3��~y>Dy�A�ϻ�X�Fl��(p��
� e�^� mw�,[(����%ј�H0���bE��<缍݅E�I9����w��oF��㜨�n9O�/�J�@�w
J��h(�^ͮ��:�Cy)�u
+)a"!
+�V����Ԕ������INNNI��l�{�L�}&Lĥ�rkUM��Is���?���5m-�x��<���;��,9K����
��Am,�\<w������q0}��=W��}i̇�r,E��j����	JZ�-"����)ݿhV;I0I�I"�h$�R�xK׫ eHf6��!�`9���;�vʆ�����Eډx��h�
�J��7=�iX��ꡗWSe�VLe�8e��6�^K�x-#ו�������}�>w*�P2�[��
�j��>6�`��:$�oH2Q!�q��;U���:�wvC+&S��\
IuJ&�%j�]�z�P��������lXs��t��������������(������W�3O���JA��� �_J��F����D"
+&�\4�,���,k�v�QjJ2"0)11!a#N�<�3!!11	�����
���������\*)��U�54�[�:�zP���V�O�4�>hc�~ =艇���Qu,U[ˊ/�=	,�de�e{�#��
���
P���:����k(�w��&�|� S%�L;A߹�|{
�t��Q?�$��Fѹ�L�j���qHěH7�6�
 N=�
II ��qG f2qUХ���w���߅��)���tG�����

�l���
+�J��^U�K9��T��n#�5h�ʆ�YT
+JJ�xp_���m
�ɡF$D" m�ƁdI��#��D֑�Z�4�`�
+�r��nnk��4��?
+�Y���\���[]XLr��
q�~:x<����0u]����b(�hPbLj
ǃV��<��R*�e��=�C����Ƞ�(�Rm�����v҉"̤lF�9I ))1a#"06&�d2E���i��`.
"�p�t��K���1�\�J�\װD�zf��Lc�:7�c�!i8vO?�k���.�a,Qd
HOO�IO?`7s�jPjpz��>����,��B�J��Jwo7�f0I��Z�
�q��S!>.�e�Ǐ2
V��#9�
)�&
M�a3x�
;Ni'[x�h����s��{
K���X��X�x���8�K�Uv�
�n����kp8�F�^L%��&HB����f��R$D2
��#�:��L�A�6?/G'��~�Ms���❔T�
+�	��,��
+�iKJ)
�wQ�����6�N~
*@^��-{Ɉ%R
�~dh{��$NOo_�o`h�A�/"��O
%�:��P��z�J_��B�j2��Nʲ
+����PV�/'j�����dRn6y+��g�X���G�1&d`dDDx��������HD�	i{�P� &L#��s��\jtzZہ%_p,����ACC��X��z;Z=M�5����3�r�یCf���f3�9K2�R��Ճ�������e�P��{LW�y,�5���IJ�V�-m?��7J7��AR`�<R�p�	@�
2�P�9���ݯ�I
&�vUr��_�k���ٰ�Q���F,M��륥�/� �jkj������72��tv����>%
�pEa�O�Rp(��q��5��Oz�Z�y������!��{'K �"GƉ��d�t֡��u ���"��L�P"X���
ǴU����V|��r�~��y�L�؉q�7
(c.1���A��޾>b���A��!����5Dw��0O���Jz(�S��1�ҭ\U�:�Z�4��嗋�?w�I�C̤�������6�3�"#�7 ׮]�&,,l�z�Ϛ5k�����	����D=��s�i��\�V�U�+��*�D�� [...]
+�
z����J38Ai���t#��
��*�й�2;i�"߶o��DB�ũ*�
�
+�iG�5�
�G
���Di�KK�|N;��7�ޥ������g�j/z�O����ĸf9<:i.��������748�\%�>�JX���%᥎JA��s���ۇ�}U����
+�I���]�����H�d�d� �!��+މ�e��o�n�.�D�r�\*�\^i��ðmiS�����Ь�D,��X=�˷i.�K� Ӏ���������u�.��9m*������H%�p
%JlJ}݀R��Q�CI�6
+ߡ��I;I���q1&��z�ADક+W�X��X�r�U߭��^Q�„��d�������켣<I(�k
X����$��Wo�<�d��y,
`,�y�����Ǐa���d���ͳ�^8�B��#n`x��@Vn���O��i��J�twq�v4�V�*�.
&�s��Z �����ւ�Pa�w�X������ 9@�0E��(5�0�h��K;`Π{Tk���:n���[�����K��3�aitxЇ��s��v69
�|
MN��������Bz������4���P��V)R�+�
�
=Ba�\v-�}{v�&�PL'�s�uVO�*q����
+AӖDq)�z�%�:�`�e�����}��}#����7�b?���$�0

HC@
��J�
�-6���T��4��´���A@	����q6�U�_�ΞB"�e#��!��@RlL� l��bp��eK�.Y���Y�d��e˖K#{��	0�Zɩ�%��
Kϥ�
+[M�C��
`�u�h ���
+���x��z���ݽ�c����D�--�N����[���,����"j��	'�t�;w����ߠPRJ�!�e�nj����U&q���
#��jt�xDن`�2��_�?���z�U��U!Q
�#�v��[��;e
�
�3nោ%�K<�cid�������q�\N>.��������q�#y7��T
+ %����J|U�f�#J.�L�5BA�*�:!'�s�V�
���*�+ܳ�?4�P!�Khܠ*lT �P}>�?�Pa���4
K��R�l ,��.� �@&:׮��P�Q�����3e��k4�B��_�T�B�
J�e0��R%�|
%wJ��\
�KN�&mۚJފ��Y0�J����E�.\�`�����.\�h�7�0��갵�6DD�b1��K{���y.�<s
�U�;\*���1���#�	q,ɟ�^��ϟ��4���>o���jn��Ϟ>y��XaaAAAaᱢ'O��~���J�g�̾���(���&�5
T�`���h�51&[�!
+�(QAA�(���̈�PP�P ���1��Ȋ+j/ӫ���s��[(�/���½g߽{�Fߒj�C��M@��
�b�nTgC
�Jw	��錴T��}�ё�y&�|C��x�t#f#�t2|�;9�WF��v����`ҵp\C.����<�d
�5���F�%%�T,�⊥f��
s�����j-//++/�Z+*��J
+
�T�I�F���jTz!�
�A��֪Ӭ�0�{�`R\L\����!��t��H���8&�Q�"�p�#�@�/Q"V)�.t��]�%,ۄ�d*Qy�ŊP��!���6���
Kz}\��E.
� 5*|��}��K�

�8


�I]7zz����fS鵩�4J��s*=wM2��Ҁ����PBQ�΀�����#�.fͤ�_/_�9�!�5�xO!����|$����H
��h�C�Z���`b.mݾ#��ҡ�	I)�̜�3��0L����#
KO�&����b,�=�56��TnS����I8�&��s�4 at I7ߴ
4y 3(=�A鱄�/T %������\�ϋ�.�R���΍���-UA$J7��MQ��*�"�`9=>S��
�†�A���Zx
Z�n�v��t���X�|#ƸD�}o!�����N\��*++***+m`������O">���_�J�g��
J?���[<%�I�U)����"wT0)|���m�R$�+%��qL�CbM'�X�LK��T�!���T���G��Ai(R��+v�ܑ2kG�%���%�K�7�%���8]�I�R_��z��^��*�R�M��K��=
��
��:C�[��b,�T2
�}1Q�w}w�x&}�t�B
+CA$�������3Ew�2q�{���-X��s)($4lgDT̾�G�'��iX��گsf<T�f�󗤒Tq.2�%��匥��

�t2))111�drJj�%��'
^�@���z����y�Ǜk���!%Z
%Z�-N��t�JNL��p�~fwn%߀$jܒH�GH6��e��h8F9�
ZU�$��U�N��j��E�­�յJ
�1��G�k�Ý(7����$ 
,a.1��ԀLt���ںz
J������
+�L�b%Z��H�49�C��f��H3��}�I��F�dۨ��o�A�qT�ܬ3�Ҵ�P"��Z�f-*D�VR**:�����O$��de��d����D4k=a��}�U�W#.�
+s	\���L|IJ��U(�G"52��(��B*�ی
%L6 Ds#C�b	Z_Vz�Id"�Ҟ�
����I<�-`$͜�Q
�RN���3	g�<����g���pN��f̄����`".������[h.E��>�����-�D�B!�0`�M�62����+c�2�z������s:3ݒ������z*-=#+;�r�Bi��RK[=
CҰ�t�n*頤
a�R�zot!���
v~�
�tc�R)�MLڶ5$h#��72ߨqK")*���0��A�/睮*@�
+"�֩i'[���j
/
���䩅���3=�8�q#b;��mW[�����:{m�>�v0��lj�\�T`������*Tz(=T֭R$�*D��Q���%&���W��L�+�&k6IUJ����'�"2�D̗�n�5k׳RX�(v�\ T����L]���`I7�������>�%ɥ�� 
B
%@�
�� P�5k�F���L��p�Jo$�d8*A ��Lj
��e�RN�%%	�o,�-��3�x&�%$N�,�c[�L���� �o��/��EX��4u�?�k}6���b��Kȿ�q;!�Tr������	���F���T�ƒ��D�{<��:�Z K���٧33�-�4�Œ��	&a(�E焹U(��b.
f�w��#�Ґ~�0
���56�
J��t�D�����3i�ȷ9�?�%�k�@2x�
,����8��GVA���>���I�vZ
OLs��yn�v�>(�442,i��H,�ԝ<������:�
��I���V��6��<3�c$TJ�ݠ��)�D��>��E4nSO�
�mK;)xӆu\#H���$�Lir�#H6��9�J��b2�{��a0aڲR�T��Ɗ�*��T�u
+.jǦ4��+����:܋Ĥ؃A�K S�tD��L��A�e*�R�-��Y:�P.C
+��G02�j�RB*ZR�9�/&2��Ҧ
kW�b����1�f�J
+��0��T��Ǐ���z����x�^�.S�L��ϗ}���K�����
{�����
`�RYe�����N�	�Cc�!��|,���J�gr���淥D��4).*����2q���sr�
+��ϝ�t��P�F3�t���Y<Bɽg�@��: �䨯��t+�1T
+x����[�� �� %�H�	�6�
+���*�1Q�
+�v �<��C
���[t-|P���pi�/’�Q�V�^��%��F����hlt65_m�(u���Vi-�A%c�К�J�n�H�*EB��@\�(r��I\#/d��r�L5��s���
i
_l&U*L���TpHh�ΈH*,Tfv^a1UEU
fmKk;lt��d
+i7,�\���D`� ���[�$��Pr�@F���QiX�
C��p�X�N�����c������_A߮[�DT���>�bc!	a*�@//�wqޑ�~��L
7�}A&�G��g�K�.�B̥�-�wDD��?$�TP\r��V����N���o�+�.$�J�Xc�� ]%S����g�
+��rs����c(��Ymյ���� V��QF
�
 w��M��SJ���R�L��[��$�7�n�#w�1�c
�Z���cL;��0��ksi��b��K`�;�~�XB������\jo�����ijn���v���D[7�M���T��?ܠ��PjjԊi���l�o�d��T"�O��f
E�w5� �eЊ'�¸����i�Jm��e
�E(�%b�68�ݰd�,��vX,=q�����n��n߾��$��J
q8J���J&S�2 /�)�	J
�
+��������Ci��_��!���-�g!'!
5v��1c���pƌ���e^�	2�����c/�]�h)�\�mGDd����Vە���֎��-��<q�
�/ZKO���U��Zw�S����VQVz��9p��� ����
�t����
+[�XZ�R*�B�(��=C�{
����Vܽ����ҝ��ɥ�Ё��Ȉ�a�!A�Iܹ9�fR��qS�Vk�P���WUg���q�d4j4����DcWĮ�bY2VklT�%�����4���A� JD
C�q��
�Yk���i���h�L2�ky��/�ܳ�޿��h*�����C�骂.�&NB��T�-|�l�r.��X2���n��V9
�
=D�7ܭ�Cs	\*%0]�J�JL*+�-�T��I�S�7SI��u�f%��hE��٠�b()��X�&a�ΔM�m���*D?M2�H��2��V(,՘qz.-Y�|��4� T�� �u��F��*L�dwԚ��S,���
�{��F��L2B�8�
�1��JD*Y��2
Ԑn~�.C]�t(F0f�%š���0o�-׭^ICi���3�I&
��
+:�EY؏lՋ2�G�
���.���!�_L&���P����N�Sy.-v_��s���K���BãcR,Yy������b,=�
K�T2����6�
+֒%-%)!>.6&�"���K`�R���HBI�	�Dm�x|G(��Jo���g���D���t�s���ڊ��z%J��$�I2ߨq���T�2T�n-GO.
�����H5�f�-|
�p1����C�Zx�
��۰ɽ1F�
K���jk��*�K �87�I�nWT	(�c�꧒��{q�V�h��
J�
�k
+��H���9���l��ⅴ��IN�lG�m
i$�d �˃�O5�
Z���:G�u#�B0��.X�t�jO�Kꨟ���&X�'��t��RI<�VXR�s��DH&��Ʃ�N�?>����UFc9�C�CD߀�r2Ӓ�c$�J�7o\��HCi�����-�$a,��ݻu����c�n�2�	�"o
���.�
=n�Ҭ��s[�d�*������þ�RXąK�����W����&���Xz�m%xZ}�u
�8`
T�D!,ee��&'%L����'$�,�ٹ�W���
(���0�
+%S*YA�JM�2J�li�	�0SC�N(�{��u4TQ
+\犥��-�́4�B�N7���Ԁ
R��M2��n�����
k֩s鸝^g��_�
,����EK�n���T]U�`*�JK��ʉI�U5*��^	�/ԕf��J���=:�ѨP�JP�"

p����f�#�I�N��
�(%D�Kƚu5:Gժ�����a�*���s[�s	B�=pė�CDtl|R��麦�R�����^�Xa�{&��D`��<��$JJ�XA���6P�E;������
Tzc
�O��,�Ý*@��(?73=Y�Ҿ݀�O���`(!�Ə�LB�H""���Q���8�
|�P�J�"sLL��Xߌ5f���i3]�-�� Kބ����"/�%�e��#�ʩ�56����d��2[^jc�$��(�\���\JM��/)9������9�@�
�`��U؛J���E˷J*K�+P���y��S'��
�糓K�NJ�����$��LR�M%���
+��� =(�w\>��n0�X5�&�-|���4��0��
i��M�d���KM�
�wk� &ynW�I�5w�JM�Ʃ�[�dJO�P*�ĺE���"q��Q�8���q�p��c�PG
�撙9G���J'�WC�}3��Q�K3]����
�'��=��?��G��%�Z�4,���,��P�}�D���$��2����$J*�D_1��v*��Q��JB?��D6����W��eII��
:��{x���J���/���Ҥ	�F�LB
�� ���,����·��'E�B���ջO�������ߎ
7�y��s]����6o��9p�/ 0�|TL|r:�t�Z�-�W3Q�q#V����6���Xj1Kw��J,�b.Y�&>��i��Y9y�

+��r
������	�l�M�R�
J�Ԥ��舰�����G�����-J��P�=c�d�$%��x�t�bO��E�w������v����[��3���c���(XzF���?bM66ܭ#.L ���*bRm���4���2����]�drQ-V��:�K���u+���ߑ�{Q����
�D�5M�VR�>f�Yk&��bk]��b0�B`�R�p�2���bwj�/o��P�Bãb������b[,���E
��SI�%!�
H&�D`��M����L"u�4(��B��d���N���^�
��O��TB%E��l��D4_��dL�t!",��������ҒEn�\fN�P3
+�"&�\�[�Y�+vT�N��"Oǎ
�N��c�Wg	��zI.�\;aҔ���V�v�9p���3gãcR,ٗ
�o�ݮ����f�菱)�G��J���1���t!,ݩ�$,]+.��������a��ӱ I�9��
�_���ϵ��^�]�ݩd�o<Q�Rqa~n�


p�������!�J��9��S&M
/;7f�u-�بBG��ȡ�!��$Scڍi�
+[8��6��k�%�-@���k�V���q�0��a.��LD&:��5̤z@龀�c��jƾ���C�6A)-9!�BĹ�3\$��ځ�j�=;����� �d&��
�tb�H,C�#�|NBri��d4;9�V�ݸ���A��A��.�%��
+I���Z�%�v�f,�ְD�G̥gO%�@&>x���utP������N��
�~}g*)��b~��gH��e7J
+�s2Ғ�.F��>�GPھy�@i��\�S�'�PBK$�D��*��يS�:�|�@�(�`\0���C�
>r�x'
K�x��{��㧂�".\JJ�D�+�Y^A7����%rR����b�X�B��a�� \�������"$��0�n�ݪ��Q�$3WT�����%��
+յf�Rb\LTx(�������x{m�D��}�׹4T�5&�s�M�:4:t�W��P�U�κ�W&�KN�S���-๴^m�omῘ�p��d�K��'�K�1���� M5x�e&5�kR��D���Tz'*�\R��˰Y�[C)
P�uKE�g���M�q��A��@3޶�$L[,۾}zۓ��9�w��0n��}�J�9z��.�K�Ó�î=4kO�=�`���Ē�WO5,���Q�KB1�%�&��
 ��u�M:()_�N�v*��
+�����
+ج� 73=9>&�\H`�ߑ�
���Ν=cʤ	cᯡ�h�`R�^<�>�B���}ŖB ���p*~ ��`b.�W�{_93`�c�ƭ;v�;�{�tȹȘ���+W��b,Ց�~z,���`�c��_����ٯϨ��,
��g���%�Lu�FQƆ�hĆ:
;
+�&�H��(�ػ ���{EAD������]�g��Y�f�}ι����0�5��V\�˻��y����;I�o&ܸq#>
�H���&aQ�Lw�K%���V�J���~<6��(]<w��у�vm�
�a��e��f���{$�A�I]YM�����FSh"?y
��R���k��_���,�p-K�D�)�n,A]z at u���$^)�T!���J�﯒fh�����)���(
;��vS$��Asf����
��A�@�l�$ؚ����Fldƛ���&>��}�p�b�����!$
k�Ƙ�;��S4�[�%�mƄ�Y2�]6/KF,�SX�O$���D�9��&QQ�Ѐ�?L�Vԫ��d\�*�a���6&%�]�x��c���ܺ)b͊%
+J�C��ؿ/%�|6��$�[_�f�Z�#�X�F���� 2�&�D�P������o��a#F�wv��
0g����7Dmٹ��1_l|���
*Kp򞰲�/��Ԥ�U�����)����RvfzZJ�� ���߭��h���D�\AI]�7��l�7*JO9J��N�8rp�m1V.]�08pV��^	�Ǝ�L at EU��5I�o���H��y��X�_;,L�:kR�hH�
j
+_�fCO�x
+G�(�WR
+�����ե{��
��Mz�CI�uǵ�*Y�J���޾eS��U$g���\���̸I#�GFQhhl�hgռ�2*�u�%��v��
�A�������Ü ���R4�t��)Y���ʈ%
�$��T�
Xb.�zE0�L`�	$�I��k��V�҇��AUzAU�^
ǜ��ۉ�Ν:~�zt�ڕK��(ARw��лg(J6x�$Fm��x�<:��^�\�Z�Y�\�v��֩k7b����;cnp��k#��������!�AY��e鱦,�M%�$��y�� 
��s��.��"L��? )L����/(,�c�P�t����ͮ_
�V"����X��
r�2R�((
�<�q=���ysg��x��=t�#U4�#k������:m�>�=y
JV�2�k�Wq��%{�‡�>���S��%+ְ~@�‘�S���R>�N*K�K��^e%�d�S�<,�
+��i��$	��
�k
+J��"֮\�A���dwef����I��$�L?2��i؈��
+c]S1*�Pm�K x]r���5�7 k-��.Xڣc�t�Df���P+KZ�~F�H&�^"I�(iP�EE�r��W�����$
g�*UU��܅��~��8����l\�j颐��
+J�������R:l��@l�2{� �v!L�Z�/���j�ަS��1N.n����
��tպ����9x��ًW�nJe�6��;��Ԥ�>�"�Ϟ
�%S>�%r)5%%999%I�����ŢTTR�(=Р����U�޷�����0p��tKF)z�����-�3�o�W�	�FS�����ޮ{�.��I���X,���<��?��v

yT�^����Y�S�hL�"�/ѧpb);WM�%�Cթ,�XR����
+d⯊�$��O%���{��n�/,��a����[�}��ې`
$ԙ��m�L�@&�R��)����J��ulZ�d.�t�bۻ�����C×��X�t5XJ�d,UVU�R�� =XVIǒT��K�1���HҘ$Pz�E�^�T%�Td��΀=��z����ݱ%j��e�!��L���䬠d׭+��v�^-�')$�b�����@��A$�L��W_C]j��ڦc�
�������^>���B—�ްi��}���:��\�
R�E�xW�JZ��
x������RYI�]�%p)3##==---=
Hž��o�����JA���oߣ*�_����Je�|w@)A��P�\�j����|�z������^v�m�I�uM�D��MPd6�8�<>3�v�0�)�'K�X����U�jMᵱDu��s�%�	^�t��L���AI�J����YZ�#
��[@)Q��[
$��Ǝ1L;30	��7j��B;2
�&���+!ؤ�2�D]6b��	.n�Pkg�
^(�t����������XRr���P'�d�&����!���d�R�J�J���ZW�2� �_�|�����vm��X�bqh���ޞ�����u�dӾ
�tX/a�=�Yl�>�c���цLؘ`�`��.��ֺ�m�q��#�N��1ez�����+�F�l�}���3rY��ƒ�B.K���Q%�,��^b��n�� /7`��ė����&BQ*-��'�$V��Sk���BI���nң��PZ
:?p��n?LTCw�
�	ڷ�dn���X�f
+�?u
,+���
ݵ3H��kI�Ȓ�ŸԖ��Ϝ�ҿ9KT��K�
�L@�� Iz�
+�
+��*I(����$�\Lp�7�]�pV��[
+)H
�3Ӛ��D�V��@�9�Hs2��
+�-U[�TkHv `P�k
>r�������K�jO��w3�X*,*-�TJ������Sb��%���l�� I�$
J��ի���һ�S�rUJOIJ�~�™�G��
�n咰��3��Nvs?�
�
�]:�X�mE	׋��琉�������
+��V_),u��է��߇�7��s����aKW��ڲc�T��LE��(��*)C4.K���e����nj�����"t)?/d���$����Ҳ��{U�
�d���7�O	����9�^�(ma(-
�;������e����w��2��m�I�}k$�1��C�
+��YY5�N�p[)��)<�.)�Y-)�2Ko�%�b �K
&��$0	��%e.��J�*i�<4%I$޸~�"�tx������"H
���g�9�\s�$���I�Y�L�6��
+VH�K}���0r�x�I
^Ӵ,
<
+,]��������[PX\��ښ҃�J��.!L$�k� ��d�RMU�^�ߵJʅ4�JŅx
�c/���wǖ����-Z4������4��Թck}-���(L��b$�����c
F�E��1ե/��u�V
+K�

1z����4���B—���޶{�R�2YY�E���[�EU�w��
�RUeEyi	s� ???//�,0�I%e��U��J�$����2J"	�/����K�
+��''%��w?-7%@i���Wg��,t;@�e���j��o�y�M����v
���@�vM��k�M��jN�{
R8��ǔ��S�Ԅo��Z��%�IyO�I8
�����/��*�,
_$�N����l�
�(��(�
+���`#X�]�5��H�lA��"A��%b��-��Xf��f�����s�3�wa�ˋ��߳��o�*�d���M2	VoS�UP"�6П�D_{;^�ڶ�zӈ�����⨲"��V�%,�4(;�����!X�E���� ^Vn
�R።ۼ��Ո�X��E��ä�A��J�oT���œD���2tmUJ޷g��M֮�X�`N�4����~�=|ٯ�R{
+%,J�Ip�j������D����?K��
�\�


5n���-_�m�F(K{�e��\��
�q*�e�T��*�JK�!� L�~��"���[���Ҳ
+���P2U�^�~
+C�_QL�@�¹��9 �T�Ү﷈P�8v�����t��[�$��~"� 
���)���
+T�kgf����Y���[�Q,�@,AT�KL@&���C�$�D
�7��J���=$��&q$��-�����&"ѧw���bf�\�&glmĬ�Q�\jނ�������B������y,;7�����?�R�oR6���KL�L�M�3e�1(�P�=��vUU*����U)%)a����Q߮X�h����G���t(�(u(���e��_�I�\Il��g�N�ڵ�=��"�E�T�A��
KV]������y���Ј����V��\,K�!�%�GOi��1������Bk�K�e%P��n��L�


�ODReRy����U��PO��B��m���K�����u4#5y�����#�B��
�@�v`�ݾ
Hw�
+&	��cU�q�:O�'��
�p^����	�>w�a��+���s�d�\"`2I��L�L��3(i�?Ղ�bQ��M!�]�ШI
:��V�Ҭ0�҈a�nQ$
�l{t�E�e&k����+�p	ET�~*'efŖE�k���`pȘ	�6m�߽7)%-�x��3�LW��p�*��Q��h�
��rI#��I��j��P�B��L%i�^�l�U)�Rjr��-߭_�n��)nj
����ҿoo�
�)(ѢęD��K�
֪ů!�K�U
2,Y �l���wq��2,d�i�s.ce)��qȐN�]%
Q
��
�P~}�[D,ݿ�X*E.0�w�V�̤J
�^�����.�7����C�YS?_���},#�
���� �� ��%{&�m��� ��s
M�#u�p�:O�'���\;n�.Yۘ��
�‹�dᦱ$r	��d">R&!�~�ҿe
*������GRh�I �6Ǯ�P�:	�4tm�(��xQb��a02�O�:���"'E�-

+�����������/0x$�i�Q1
K�G`�����R+؃6&�B����#�
�H�$Τ�C��J�8���~�2�j�*���Oع-.f�ꯗ.�>mҸ�aC|
tu�koۣ� %�(�L⋥{�k��Ÿ�[%a�U����Z�����:p�_����Cg@��,�L؟�~4+��Y���"���~Rԝ�H�ߥk��N�R%�ҝ�H&�IZ&U
J�ȥ��}�~Z|�:�ҙS��3�&��
�UnJ�C'�		���rwu��j۳{W��68�f�f�iQU5Uv��!�I�4x2v�Z�X�ܙ��-���\"`B2=�<z�H�LB(=���zP��Է���d� (�]�P����I� J���R�`E�eF�D5BB�^dF����1)
�U�n�6�%w��
K3�BN+#�b��ؓx���'rN+J탇�
$,�,K
KZ.q2��Ȥj@��J��^�o�V�RV�~�����;~Klt�7�A�f��=<�o�� gGX2	J�J�d$���=dW��a�o��'X��U�������9�yz

)����-����̃��1���T��*)��`%��JK���"��"��EI�� �F�$�7�����^��ϟ��:y�Hz
+�Ҧ�ҒJ#���=�]�

�@�p�n�Ԭ	0�>�eS����� %�I��5l
�\�������C����Z���X�,	uI�!OI�I���T��[Eh�$X�]�z�r��4
+%�A�n�Ht�d�̌3�.ݚ���:*��걤h]�A�?�Z���XX�2��4bed�Ƹ�;ؗ��q4+����b(�����P�����'a������I�Ϡ�J�
�$q�҃{�m�U�:rUڴ�T�9_M�8f�� oO�/�9���Yuh�����g�(�E��b�%�ч�Ǘ�&�%�iK->oݮ�U��6v}����


�ei�T�0��S��.\
�����9h A���%�K�e@&@����
zc�1(��J/����.�q��
��O�8r�Ё�=;�m���D(͝ɡ4����dcݭ��$�M7�c��Ư}�s�{�
[���X�K=
7�%�K &B&����Pz��$�ۧtQP�hhg�O�<�M���J��s(�vKEB/��u
Ef,6�ב���f�����S,�>LD,-\�jMt�f����iDzs����ր=#�n�!.10Id��$�*C��J��TJ{*�* 3@�k�/�Ǫ�)V�y3�O
<������ƺ+
F�RS3%V�(��j�)���r�b������6
��l�
�xx�Ke�H,K{��N���t��XvWgrTc�(�s�%V��K�w+ L�&R9�I�$Z�J���T���D��"0�y9YG�&��aǶ��ё+#J3$(��8�����lفHws"�"���Mq�>0�>�@��еӷ��`�v���ƒU��[x.���h�p�[�	,��\B0!��#H��Db�������w��ЈI@���z�x�

(I"��L`�^d�-B�J�ʼ)��R%���f�[���Uk��n�~WB���L���.QڃS��������
'TC�w�J�h�d�h��(�X��$���vUĒ��æL="��� gG{�
];u�h�J�-J�^�I��2x
�n1.q,��` [...]
+���ZĒ�������:8o��

+��OJ۵���c\���R��
�vJ�K�dh���$]	uP��S����(��
�e�����))�h�����kK�����2�j2~�(�����}�1�9�
�>�K�jQ.	X��:�0Xo�H�qiY����ut��
+�IH�؛箘�x����3r�~arT
+R^�,�B,Ѻ�\"`zN��
�%H�D�B�E%�ت�E���˄"p�FUť�E'O
�ݿ;cGb\�@_/��,�L����I��[�I���H�^;���Y��6
��K"~,�T�Yb�u�nC�-�|f��t�%K\]b�đ�{�7$L��
Tj�M[h�vg�&R��z�J(X��R���L#�*Ȣ"I��p� ���Z+��|��uv��������ۓwf�R[Rv�������Aq�ZB�pI�~I5�:��
�$[7����ܻs��M4���'�e�*%�FUi���sfN�<a�����/B�
%�I���f*n�Kp�zb�0�!bYZl��j���[��F�'�C�y�K�_�����Ǯ��S�
[����qX�'b���	��=�@$	LB(Ѣ�
J:�R3� l�0򆺚�J��ŧ�
:�gWZR|TX���g۵V�W,%P��Ai(�JwON�;ub���$���>��
c�=[�po��h������]�|,�[���P�dX�D�D�$>
��I�3(�k��[��v$�Em
B��z��|�B��tJz
��H��i0��L1<�KiT2.�A,�Z;x���a���0�3��ek�^g���5 $"&!%=k���PjKϗ�=�ą��O
n�K5eIG]�F&��ҿl5�*�G*qG�_7p at z"A�����<]�wh����P�|<�*��X��T�qc
G
2�s�2��� %�/)��K�t��b��QW�{����c?�,�Κ�h���Z;'W/���ĴLD~�2آ�z.ǿ?�S�+��-�hK<� LH&D��f�I
���CI�����K�o����
�����W�\<W3?����3y{tx������
��|�)������	}�Hw7Z����& i�I�K
�z�"�Ob�f��������lOٙ��s�Xx��k���
��ʲ� [...]
쭌��73-9>:,�ϛ��ۅ�fsP2@(�vۻW^$��$�\[#c��Ia��Ek-`ib��xbi.���z�M��>���q�Xj�R{�r%�C�N{�2H��i�I��60��J�J���Dq�m��Pw�Z��sgN�=������V�i�&�6��k�P��
�� %q��o���ߒ
?�!���4a��s,1_m�����'0,:!5cOΑ'�i�
���}�v��y-Ò�K�L�ӌH�0���ƂI�'�J/I9���4޺y����|i�Ӄ���Sb"B�z�8٭�z�Ų���1�1u%"�J��~���ڵS��O
7�Z�=��Ј؄����r��_��¤��}@��9��u�%
,.Q01h⾖0I#��PIV��~{��vIZx��V�$��=s��)	�����ٻD�r�
�3�BM,�,��`���6nv��
+��R��7�0)��
�����,)`I�%�G�j��R����n�*O�U����`��<~������ѐ������%�J3`ь [v��^=��Q�(�q��X"�׵S�
�ƙL5��1Z��Ax��F�'�C�yE�.�$aMd�~���z��ފe��W�� LM�y�!�0�+J-��)7%�dU	�[Ӄ{p��j�+a�ŧ���ߓ�#1624���u��zk��f�SQJ�8(��)H7����}��\;M
����%r���. ,YR
�
܆�k��p8w�T59w\T���z��,	�M�O��H,��
J̖�U�Y�ok��r�
�C
��pu��@(A��b2^
+%h�lQb3{w��$E�D�"����>�i��y
��������3�Spx4)��P{��f��%E.���o�ʦ�J�4�
��v
G׍8�}�m���J
+1ج��q����[ Y�U�*�7
E��F<�ݺ*A��M�d-b�7K�MX�>�9��Ʋd�����ut��
��ML��΅cWRV^Y]S����MO�j��J�X�p	�D�D��!�g�P��AI�Jx��g��C�xc}��kW��~�w���]iI�Qۂ|��6o�`m�r��Jc�D(��ԥsgF�u�7m
�c�T[�`

�!�
�L,�x�iH
+V⻻���y�ʒ�.I�$�-/Jm��֪����o!���y�s��<�6m�L�	�ۑÇ
D�Ĵ[Q$$��"ӵ=ړ���AK'O�b6`i�j��v�.�[B`�R3v:U|VnX�~R�I��T�I��Tf�A%f�J�}k��›��u{H����b|���v$Ƅ�z�Ҫ�h�,S�*
����G^���:��-�S�`��F��A|1g�b�Ր���O`��/Ө��+
��M
����4ֈ���DD�� � �,�<^��A�YD@�Y�IDPQ���A�&��6��1�W��j
���w�{ι�Z������f}�e��}�Jʫ7�v�:{
U;2H<
+t���SIK�.�H0Ql�?�3�)�$JB�\�*�
j �)��`��s=`�M�5�
�g�l���* �jj$��}��{�����t+�;Jl��>����ܑ-<Zx<j�;��K+j뛉>0x���� pVX�����qt��,�^��4"(qU�ﷃ8�֦�Z&��� �I�C�%a&�����A�$�Eh-K���I
��-m��y�IC#c�Ӳsw��_^}��h�L{PU�D��IP��
g�J�i�qTbJ ~�m�Wq��P�*K�
s�S�����y�:�Z��#U�PG�N� �
��8�
�ء)J���qD�'qdIK[Wbh���~���&�95+�����P#
+���>�|�+����:l,ѺDr	��d�ӓ'<&)
%U�w�6�ӫ�`�gNv��
��,+)��Ʉ��D��z�:�Y[�H�4��a�$�tIr��l
W����s��+
��IHJ�ڑ�{_YU]CK�	(�x�p$K���SL�/�
�h0�~Ę4RUB~
��&�ۋ�o�Z��JvS��z�Ј&���PJ�"Ad�c�𢢒������yK�
M̭�8�u��'�6c[^��5�M��p��}��1%K�(!K�)�Q*�1*��fR	�$�ܿ�7:`_�i�6��]9�)�@��*Sx
�J3�c �w~C�Jr�'�7���	�,M�����s�z�&�

�)%��_Q{��������h��KGl�|*	a��%�KL�����$Jʨ��wѯ��k �0�������a�;�Ӓc#C�~^��m,�
+H�t�
A���1I�����)��
�ͭ Kn^~�C7�&nI��-ػ� h����>�p�nqd驐,�
�!Y0��D��P1W���(��c���aO
+r��<qh�$h�%��
�pT���"��XZ���t��&�m
]<|�#�㓶f�����ili���n�,*Kr�Z�4F%�4�
*�m~N?����A�~7��ٓ�%��%E(ׄ�� x��j�*Mê��VJrȜ�)K��9΃I�-72�Z����
����}�n<
+ء޾�KW��q]��I���K,.a0�h"�!I�IbPz��0�
��cR��}�ri�¹�����5�
�C�
+
��v[�����p9�Ҽ9��4��&����p
h�.���ã�6�dl�YZ[{����$x��K�,�!d����;&2%�$�b��Pz�W%���6��(�жg����{�J��Ξ�&�Q�L$(��	��f�k`,�02]em�䊥66!9-;z
��F�
�Q��6j?=�e�qZE}]L�oo��+	a���w��
+�
���q�����$us\T�����a����*a(�Z
J‘
+�NR	�8��ޔ��$4��u%��8H_ihT\Rjv^aIY��&8ug��^a%�7��$��K/X\�`��D	#I�I�PR���*}�T���PN�hoi��*+)���ܚ


����h���d��eK���Bi"�䁣J��1I�ډ��L
7E-���'08"&>)5kG>��C
GۻN����]��*�]�,ѿ��aI�L�0���I��J7�F~�O�má��}�!�T-�	�lXo��]��(d�I��ƏGG��4}����~�DW���̒�ڰ
7�dl˃�P��
��-K/��%��FI�ƨě����F�J�JBu���x�.<���
��O���ρ
+���lg
�&�ՆU���4�V%b��i)�&�P,Y"&��G���5p��hށ!�7m��Q��%��}�St�����?rg!�J�X�r�"�yF!	3I�xTz��V�G?=�O�ҟ��*u
k<\
ߕ���� #��z�:�Y�25Z������̝��p�
�}YG�N�;��
����O��%=;�`5�M�ǻ{�]@b��,	�76��D�$���PU%�g�o��k
�[�BKd��r�ILy���͌��	\,͚=aIObhlNHm at pxt|���
N{��;E��CqYRf����WcT�M���J�3����c���t$���D�./)B�&D��y�:�Z���\·�'�Ja)�&�P��$&��	rނOt`fV�N���"bS2r���f����s�3�,�Κ�
*�`��	&���L��_�=z��7� �FgNv�5��(-.��=`ㆰ�~^n��6�fF��K`��g"A�J�҄��EK����B�Z��.106��qX����9%c�΢�2غ������]��x(}�d�(|܆�{�X;�T	R�Pu�q����i��,�5A��E���g��n,(�Ņ��e�
J&�)8'�Ys�j.Z�CJ�����4�Cr�= Y e���eI4�a���1* [...]
+�X�A2����֕�4�c��	IF'$�o۹{�Ab���Cw�X �ֱf�p_8���M��`�$%A*qU	���(U��=��q��PU����9��I������.k�̍
%zJs���^J��{D�M|%y-
��m�
�@
7�s����
�����cמ��7��"Y����"YRx�Tb�
+����*}�U����1���owdAh1�>tht� �v2*p�)	����%��d�&��c5�9�ԚY��;C�[�q�=��̭�ɒH�ʇ!�EcTbM�
�~�/O酻O��*ڷ�8�
+X��̔M��o7g�����ŋ棗L�ҸqĖ)
%~��:1T"G��G���5�/�IZXۯu���F�%�f�����k�<u���ʗFT�OR�_�R�>q,.1dz�%����P��U��J�Ujm���8�� 7;-9162z����j
ӕ˗�,^�9�)��1()ڔ��o�ai"y��-|)j᫬��y�IC7�&nIߖWX\Z	b�։d�"_���ijRL&�?T�ꉩ�=�*���T"�ݖ�%1�7OW';k
�x
��YL��M���k(�X�r�u���3a��Rk�����' ���ytNw��t��
+:��l� ��K��D��E$�"�� � b_*T0Rk��$B���T�`,!�jm�R�9�:S��y�߽�}������4�����s��{����I�ʣ�C
ig�K`�!
K��Jo�Ѧ�`
#�^P����;

��ϐ9��S�e�ZT5?+m��@���e
jQ�竢������*��K�
nbnm��Nv����[0wQ��
��窱�k�I� �7܏TJcI�K\0��D��wE�$J�Q��ӈJ�5U;����]Q��p����)	1��'���;�X����낿�1��]���Pz
S���fw��BZxHDl�Դ��s���\�qK9�U{D��v�z��;9�$�&�_��z�G����]�
��-���65!&�/�$�ҡ�1����^���
6�Ή@mPXt<�=��P�큂���)����%m*	�ёR��s������zZ`SC
�̱f��y��gB�
+�8�����1Y���u�IX]ECI�T��(	���o م����ۘ�~A�1	��93
+�P�m;+�j�6�8	�v����o6��)M%�X�r�&y�$��w���
���n��T:Z��g[�MK͛������;~�������1�)�R��\(��vCII,��[�	�pWh�~��QqI)����/^���O��ػ���QX�;5bIɣ����/\s�T��;8���NOI��
+
�D�P����F4��PRKj�8�u&�!8"��
vC{�a����ȴ���M%�6�P�$OQ�Tz�Ǹ
��2���Ϗ�Bu�{[UR�s�$�F�{��6&#�A8Y�������ө��� ��F#�,m
Gy��
�F)��,(^�n��
{�@�>)o�RI�t2�De�_*d�J��!��W�C����;��yÚ�K̙�;
j at tX����hW';k\�=�oȧ
+B���L٣$�z�f[8ڝ���(/���ISR3sg.,^���
ȶ��|��X�)K�SIF.Md��~��J\s�*���D��
*1|;):<����c��h=�K�|(	�":ufu–���B-�h���0
f�lRXj��XB��g�cZ5����6���(��H���8�&q
��_6�?�T�u+����N��

p���
�:���Oof��
*�E=T�K�%��3�R���C7e��?953o��%+$�h�Zw������x�*߸
%�$7�x�$�H��$J<��S�L�Q��u��v�KP)
5`�q�q{
ӑF��A���儒f�M\H�X�cZ��!ڝ��i�!�����RX��`�.K��)m��$��U⑤J�C����Ȑ "����\�4^$���j��F����
+��� ��]2��1-Z��=����}��$�F�H�����=��
����gN�
'c����]�d�,5>*4`�����-�a� ����Ơһj���Tb�|��r�	4pwOXF$��y��J��w�;x�����%bsL��RI�2����l2��ͤ�b����2mk���^	*���HI��
+�0������
z�`}]�od��J<�����>PW��
�p�ў�~�a��?�F�R���������K2v'O3MF��D��T	�� ��HV/,��6��-�f.O��@�b:uA�t��}H������^�=��ҏ���L&�=�Tl���^�m�l�/��+w�K����$����6&#�98U�ADeR+��D�RW��?D�32��ܚ,�/(<61%#w��E%�7l����7�h�ݭ;��Tz�z*���
U
�H��o�r�
�!S8�&��l\�ri�܂险S&�w������9n
��S�yg6��y{�����HZ���
4�Q
 ���	SӲ�f�[T��UK���EX�
���w�Nc�D��%U�	U%.���oQ4{k
�Æp���D�$+��u�����=?���kAT{�҅KW�ӰDdj_XҦ�`
(��K�x��˨)��pp�W--*����� c����LD
j�7�?T@�
�PI�T������fVvN�ƌ�

�IHNϙQXT���e-�e�Z�nE�`R��$�Jg���x������D8� �qcܜ
l,MN
�H����B�-�����Sv�G������},��������R%
KgX���SY�S�wo>�$o�W%n\�UQ�hm5�J�J
߂hf�Fp&�����PѩK��>w�5@�������ĩi�yXj!g�&��aZ�e������Tz�T�|�
3^\��C��|�u��
��g�M�
�;���x��� "j�n4*��Tb��
��룾��ij	��c�o at X�$8�|�r��M�vTTA�;q��vU�rx=|-�w8uI��T(I���{wpۗ/�C���⾃��=G�:�Za
�g@?�pGl�n�PR����H,��ݙc����

���m��
nDX:wQ�ݩ�wo.���W�J����xc�
*ń�|kE�V_��.]�^()�%��^��
��큃�K�+�"� �����-�H��<WW�7�hSI���J������� >y�ʥ�Pޏ�)��J����˄�N�B��4�s#
���C�PR�J�2�cn�7�8��T��)�Y����l�
+����I�m��b*�kު��˩Tb�
��n߼q���

��@A�e
*�F��� �Z�����e{ ��N�PҸ���)bw�����C�E����@�����-�%bw7%v�K�۝D6>�
+��Y�JT�*�¢RNFJR\Th ܺ����򭁞P���$�2�õ��<�eۃ�
’����=Ha���Xs˩3�[ۮ�������cq�m���Dm㏞J/�JN%�Fz�M
xq�7�)
+r��$�F�{�EM-L�5�s�(��W@%ũ$��p�����gbHd��3�~��� �����6TN%9���#�u4��eK��29 ��A)*�̝% ��o<������>���x�����X�!
�n�>�elfd;���?(<N��%��@���`w�Zۘ��>u}�jw�h�e���J\�V	�Ө��-��n��D�|(�ƒj��`��A K+	,�kh:A�
���{(��f��$���TR'�xE�xœ���r�
���ع�������IO��
��hg�iڧ7x�N7�4�J=�
+N7�1������]���y���)-+߽�`}cs
۽o��N��_\��m�~:o0���$�7n�L@0����cGj�TZ.E�`@S�j��M�Mu�� WD6ε��%q���e
TŕF�Q3J%:�h��I���8j4�q1�q
ETD6�]QVE"��Ȫ��!�f���(�L�
S5����{o��~t�����i��N�s~w-~�T,�lA-K
���G�R&�%0�]���e�N�Z;�	�	=�?�P�
C	�J
�T���D��(�*�G�h]WJB��G�����q&#=X�,]Aǒ/��Cɐ�g�˪j�[HH�#��7�M��D�V�����3�G at +}��t����
%�I��x���
���b�����&�F����gtV+��_c�Ɉu���X��y�������C)'N�/$�
��N�Jrא�OgT�x*�|{��96��iei���9p�x�J>d*���D3S��Hئ8�t��,%y
+��#n8��Xr�c)���3yEeU(X�tܩ�m׷�@5��E�hc(�Y��L�@n*-�Y@��h�*'Z7�N�ZBz�c�`��0����+~,��X�B_�����lڻ��}��ն��5޷V� yD=<������ĸ�Pp
Hj�$�?k�����+t��MU���zv�eb!�tx��C��el���
�-P�����pDLBr�wi�e�Jw�ZI�����Vҋ��$�7rl� ��0L�ᓉ��SɊL%���|<�)�~6$�z*ZJ�k�'�$�P�O�z�XZFǒ7�%��L��w�����O�(w/$Z�!g�{b�8�C�-<���f�T�۾
�u�h�Z�C�������J2��`,EŒ�t6������FS
nZHI��Ѷ��ﵭ��oxJ��<��`scC
�
>"6r_������u+����� 
L��^A5��V�!��g �d9gbj6i��ֶ���;���Pw ��Y*+��ҋW.�W�?�<�|�V�|�4�l���$�S�@L%��0�p�ҩ4�L [...]
c��beM
���
�0&��$�{m+�^+��wT�%�`EI����G�b '���#Y��r�d^�����Ґ�PZ�גS�JDLh%����4}6����1��ґ�J*.]e���{1_���BR���j�&إ�Mhrl�J�q�=�Si:7���|�{S�����]_J�㎣p.�\c�qc�k
K�
ހѪ�#���a�=R8�^���C	t��!�����8�����Nv*)(����XZ���e��oPhT\bJFv.��+׾mjűt�Mv�*�����k�1ZI�[�i%��8E��'�G��Ŝt�Gx��GLK�}�JR�+:��>`��.�9����a��',���cߜ�/.G�|���=J���j%�\�_H��\� �.mil���*+B��'�0ݾ�a=\`�42�>
Ŧ�
o
�wp�w��^K=����E�:|$K�Uc	�.04*��]~I�d�=~"�.�%�jϞ�"]�i%�(��C	+6�L�T�ߏ߷
+�&�%	z�%Kk��8��{��8�����+*���khla1��V�Jj�ЬVjz�V%%�����s��7��V���Yi��
��r��\��3
�
�R(P�I��Z�s��i���/[e�i����t�
N���W�V�sȴ�@'���{�[3�]ZY�Lf*
�}�3��2�J3TS	ϭ��S	>��(:��Q�0���+K��>�;WO��x����!qǫ&F	p9�qyӍzꐓ�%"Jحp�L%C$7�T�ֵ:I������4�j1
Ka`�������M˜��_~��o�7���Ԯ�o%��� �C|�p:'351.*4p��훙����nj�1ٝ����Fo�J�髫OZi$�Sn&���U��vz�s��9��MG��S�u��1�K
 �	���6r�V�o�ŰK�M>�v#Si	N%s~*
ĝ�˷�.%Y
+�ci�x,Y�и��폣qW��q'4���8p%`��j��Pw�\~:'
P":l���J�8�&�����H�}~�*&�<=�S���3��l��Y� ��; $2�P2���|���/ݴ
+��m%��]+���$x�������{C,�����F��͂�3�ǍAxJc�O�����9h+�s�%��s$�f�sTQ�H�C#Z�Q7�1ϝ��x몋H YiG�Ã��q���a*5�ȹ�����[J�nB
+�_/�)����d,YZ���T��+פ��rq�!���m%�WQ�.7
��m+��-�Ĵ�%p*
�
a���h�� K��4����/\�lպ���<���ã㏤���H6m�K6�"i[���{�J�������m4)o^�z��� <w49!&"��۝�a��/!'	R�AL�
��ZIxt2�@ogW��}���)@��;��~�����7�i�g���>|.�~�|�\�z��:#wi��׎���plD �Jf�&��?�S���S����Ǐ%
��|+w�qצqǩ&������#/=)� :�
3���X�CԈ�$I�X�ci$Ѓ)���̹
-Y�w{ǭn^����{)ٹ�
+J+.]���ڦ}��ն��5ދV��w�&&eI�ٓ��s�{�v�pq����M�`�
8�WT��h�?q1����G����F�&���X�y68m����䝒q���BqM-�5���� ��#6Ki��K�[5��� v����Mv�����?��u<�.%	
+����� :� �>�����;4 w�"��瑢q��J�����R4yf���aA{��!*�ojB�� n*��ꥤh��Л�����d,�#c�c�n
8+"&!)���3y�ik�Zd6���d�m��k%��(h5/h4z�m��zJ ��S'����ߠ��8N��o%8��� 䠕�&A+YX�B�9y�G�
J���V�D�n�M[	��N�Vz.�o���j*/^8���vn
���a�ʥ6V�f�c�N�{���?a���%}����>#�V"���g�Yܵ���ww
+��p�>�=��R9`[n��d0yH�nO�<JL���TRH&���gj6i���y4k78��CN�E<L6-�V�V�Jҿ׶��<�����V��eE4)���A툠�nj&��rR���J�)�܃L��
+gm�|�������RB�Qޕ��Vj���������Ɵ�  x�����r��s��
+�[�mqX���rΗ��=x�;�����;���)�3�����"�oA3͉;a+	��m?1���V��ċ?
����y#��bJ
Q������/Ӡ��4
+O*Z5�&c*e���,� �@���M:�c4�U�D�EeߑM\cHPA�
�Y�2����X�LH��y�������	m��Rݿ��}�w�s�Z���ƒ�� 4vN�,/ߠ��H��-�m9{�2�i��7���S�4�$�ƫ�JbT�>R	>RiWUyQ^6��@�eK��9SA��2�� �����T�
��h*�`*YA��.6)5R����YR�$�J�2��x��;�if�V�f�%�EG���y�.51T8�FIf*
4���n⮈�
:���	�N���g[���� H���~��,tu�g���\��M���6���X�Jƒ!:��a��EK���DD�%�e�VT�������6�ӧ�T���Tz�T������N5�����


��c�BWg�9FЉ��.�*��j*��H%#SH%T��ˏS�B��]��jM%y��P����,-/��LI�Y����
��w���-�N%�c�wq
�LpW������3���ߺs�^/S%Ԏ;�j���A��X_��
=
�&4p����T	0���� UBM��e�0Iڃ�{�IKk{gׅ�|��/2&!%3���0ݴפ�i5�$�ƫ�J��z>�O`Qy�T��C�t�9�ߣV�Opu����#�]k����
�T�0�4o��a�1�)Y�p��-�f����K�gB��T�|��N��HN� c����
_䛋#>0��)�7�JJ��8f,)���*t`JV~�6�)�ڻ��S�
�h} Z?/��w������=NnIAvjR,1���y�s�V�� [...]
�J�%۪�@*�h9s�K��v�/��+X���*���Վ|;y�ȁ��wl+��LI���@f�=��H_��υ�KGKj*	�w�����&�h)�.$":.9-�-Ȉv��߇G��N%��o��lKn����kBWx~��5����{�J�C�S%���8�!ͤ)�(g|��q"��7mBJ��M��ٴ�TҤҐ�R/I�Գ��IP�z������u��47���:e��'��TzMy*�u,��T
+]�!as&I�/
���AS	��{j��R�q������W��ܾ�(7c���`
85 ���41��&ޙ(k r�[u<��8�8ܽ���pgm�Lp翊X������.]m����Ô�_�W��T�
��
�3��-�NM��Z

��c��<g 
��m���e"�a6��5d��:")=}�[*o��I�J�k��T�/ Vr���v��8)���y�������ߧc*�Mp
��,��b�֡�4�z�3�n�J7�>GR����-�8r|
�p�Vpi~�������[SYZ���

�l�������؀�-�7�����7X��9�,X�����e��W�k��z�Y�X��ՖJ�������=�����v��q��]���x�����Y3x��&�*!�%Y�#cIkݴ��6���5n�jߴ�T]cĥ�
���
>�W)���k ��
+�[ϒ�9�OJ��TRsЩ������7���yn�J���6g�A*��R	��]�DRI�7�1��*-��JI�Y���
����l<5- S&�d�[|��;3
� \���s��U�܇
l��ۭ���n<��A�>�
�=8p��]���:��+��u���0����B��ū
�ԧ��=k�{s<�r!%m|��Ȧ�#�67m5ٴͲM�+�M�I%�5FH*	Y�v���N5�_���>8`��ʙ&�z�t��ÜJڲT�R�܃�s�T�B*�1�����U�E�J7�

����8��caN��R�Z��Jb�M#�3��!�����MBVT�e�}ŀ;u���"���3M%2pwδ4ҁ[&��ڐw�F�:�ŕD}��d":�eH�ߴ���
+7m{���
+�M�I���I�A�����DS�����
+�

�r���e[rҒ�V�O�������Rd:���J�9�=��hcS��I�>���
�0�:�]�p����tz2��@�
+sSc�7ѩGK�o��&�J�pg��`����ʰȘ���|\���IY	�Q{	�
��!
R�z����a��U�d�&Ɗ�

��J���H�JbI���M�c`���#޴�q�6PVv"+�7�&��_�J�z'���4�G('m���ʚ�����$t�����X�-̌
tT�
zr��yN%5_(� p�=<�T�:��Mx����P[*��K�ǘJ��uw0���]QZ����'������O�6	�FN-��-�)��_)�����Y0
�\J^qn�VR��Z���L����S�-m��=�����G�߽��8���3W��

\IU	�L�M;�l�ܦ�lڽ�uGO����w��<�(��
�I%�5^�TR�&�J��T6���z���c"�W�y���
l�0�t�L�}�t��9��xa��j�l;'ׅ�JX�o�U����q]�=�?���SI�T:�^j��M���8?3%��4�?]�z��9�u���z��&�
��i�-���.

���SXVY�M�BJ�
a	—mXS�,�ĥ���Z���;���������s��k�p�J�J�tŴ�7m��M�A6m/�iũ��M�I��J�ϤR�w�dr�(��BVB��.H]���>��H%�sȷ��tҺ���J*=��h�����]���SM�Tm-��شq=��4�J�o����y�{��ݻo:}�D�ϼ�W�^���UPRQ�������p��R?�
�v��VYV����X��m�p���g�;x�Ma{`�5M�i��
+]�ߴǚN��m�y��BX�XҤ��# �~�R��wn��@9�����3rz9m,1�x�{c�
*USS�T�h�S)N�J�K�~�u?d[7���
��ܷs{y*�!>ːo`
��pi�J�#��SIE&
�O��ќe����wPUW
�7��Dw�����N2Qa#��Z�D�A�H�.�	�{� bYĆ�nDAi'�n�6�,;ꬸ���9����}��{睿a���=������q�R�p݆�`B� ��%���Z����-#)6"�����f;
\#=-�����q��\*}$}Ӻaw�d�T���!²�6�i��M;(�M���6�1*
��
c��uw��4�_8Su�PYaNZBtx����Id%����L�
�>
���5I�����#5�H���]���
����������2l
�q���RAQI,��MC%\M�0��M�v�9���pD���o��QV�5���=�D� �����\]b�~5k���+ �X���dV*���M���i#QX�9^}�bڴ=��FA%��+����O��lWZ������D4x}�e��J �Dq�
S͡�����lh݋�������+,*
ȝJ�����b��'��
��t�����m���u�`������
*�*�W��OiΙ��N[�,�X�8(���%��ѓ��K8ۅ�N,��#�v��^i���.-�N����
��1p	��
\AT	q*q7�梥hӚn!6m�h�
;y�J_w�
lZl/�mZ����Q�������x�9�Z�

�r
��<]p�jI���ARI}�"�J�mw�T�*�/*�����7�����T��������|��Z
ܺ�|h��
���4�px�s��WJ	�����w�rp�p�,�R�R��ݿP��C���y�����jN���(��J���F��J�|<p���)���L��v���������}O`xtBZv!��*\�`��ћVA%�F�J�2X�� c#=-��O�S���UsH*-Y�m��n/�R
+P��M%�2'7*�b��)�۽!��kkȋ���qs$F)��nV�M������o�#%�Tf��
+J8�
J���T	OJ�-:p�(��w,�qeH�_	�_���o�v��;W}�Hyq^FrlD����.��[ME� K��`�H��Q��m�o�u��*rӺy���B����4��
U�T�>۱O%VX>f�%*���3S�"C����3�X�
+@R����I���.� �L��������C��?�"g*�*�u�Э��$?3_��0JI�̜���$�|�
:�j�Gq�٤ϩN��d�9.�A�����w\�܂u��P�%�
�J��$�
>��έnv�T�%��
��p���زa����%
{��@Dc��q��$7-�b��"{�D�%g���M{��eJKr�>{��NK��KA%�m�J-#C%",{9a�ʠ�����:�"*1�r����)�J!<T�K7����uC�1Z�h�I��~���F/E4J�y�M(�>4�Dq'V��B�p��¢�S��$ukm��E����=�+��Ր���������\w�L��Ce�9i���8��7��1�YW]�k!S�ڴ鸙���x)a/
kO������b�i/�_�z��7o^�x�*�Ľ��N��*<
+�򒼌d
�.��7�5�]��D�n
+�dA����*���Ӻ!߮�4�_@�)+�IO�����l�F]4~)BnݜÌ;���cT�-mw�������_RQy�T��m8����ڻٻ����JS-�wiAvj|TX�����
۾]���7��|����Ӕ��!���@Q�,}�{�iie��'hotbzN�7m
�}�7�/ț��QP���
+*
�J�"*�
+���	Tj�DT�܌���`_{k
��2H����"�&����Tj'��/0*�
+ݺK
����}ܝH��,�����ƃ�R�/��(�z�n��~!؆��G�W���p�ڍΞ[`���C~��mC��
o�=%:[�����kkN���؟�����hki���H_k
vJS&#{�\yk�;�M;�ڴ�%l�5&���sr�	
�JH�.,=�]���u���Z�Lۃ�Jb�1���A��/�
+���}��Ź�It�g�%E%n�!5���I�����*(*
ݺᡤ��

�vs�ii�[_�Ѻ�Y�'�|�
�%�n+t�
-��
��{c��s�
>v�����W�wr�K$����ꕨ����v�M�����e&�F��y��پ�t�!����\U;eA��Da)�i!-E�卥��n��}��_�;]S�������?��RA%	��Ұ��&���!ԬSӊTQ���R� ��o��}�j�%��)q���^�C16��Z�X�O�T��
�j��
f�}�(�SQ	����J���ps+;g�=A�щ̇����J8<��!˔Jox�Dv�;�Ζ�����`m��t���%��c{�L��N�T�lډ��A�VK��x�V�_ə��T\�q��m�rT�RP�q� �
b*u����@�CeE9i���{ܝ���Wj����R�
���� �$��⼌�؈?OW�7F�5��oBlݜ#��cΙ%|��*x�ۈ�
���]Xz���뚀J��}�N�q�tǠ�;:D�8
� ������|�:+������B�{��T�	�J�Q�޴�s5(YX;q���W|����s._���s
���#
8Ϟ���R�SP�qc�J����w}�
m-�3UG��%D���;��a�������h5��4RjJ��ҐT��m�T�-(*
Jl�Ռ���bo��ݺ?�P�����sT�u����<

�y@%�7�Y�:�����U0t���hw������pG
vGiavZB4v�u@%��MSBT�����Ļi?�Z���V��
�A{c�s��;y�b���;�gP֛�
+*��ƻG%�;b��
+
�qs�i������
+j�(�W��RS2�f���R�S�n
+�JR7��u�Y��k
tp����r&ݺ�o�#���YCs�R-=#�[A��^�� \f~	)�ʃJ�%��U��҂����� o�
dg�w6�JLwHM;&��N@%N\.�Y��dӶ
vN�{��k�M����g�
+
�x�^A��B%���~?P	~��*��l-�6�kjp�D�)*��d��T��q ��7Q��N�ӟӺպ�>�dy�c����C���G�U'�p�~!؇��G�W��Ԁ|�C��Шԏ�ы��X[s�De�����8���FzZKy���l�Q���_�(.�M�M���O at XT|jvA�A�i�Z�ڻ�Ц}(�M+.��Jc�J��A%	�?����iTT���
���6)��n
(
+
+Ddp�}I�E�U�a_�]�d؅aG0�hæ��7@�h�(D=V��
MO{���޹�
b��%��38�<���y�������ic�Sæ��Ms웟�0*��#��*��J�R%R���*�����R�
+�3��n֧���6�D��

+B�DbI���Tjj;���z�@�
b���g�
���V����PuW{/�;s���TYR����(

��t��޴�
+��c�ty:h*q�K̉��� 
+G�,
C(
�up��

+�Iڝ�SXZ*5�::��/��+
�����Uz
���Wg�L���n%����J�F\%
B%���vr'��gpS��\�
�F����[�;;����a�hG8�+�&+Vo�l���#��Oޓ�W\^s���V�{����=\�
�R[sC}]m��@���
�����difd��C���n
M�Jě�����͖›v����o`8q�USޗ�J���W�uU��� ֖��1��kЀ��(��GZ%j���S�0�T�}�:\��]��e�ꮂ�~ga�pW�����
hd?�J�����i��]���|9��m���Hd\2c�Ϟ��7�&��J?��=��{�������YbQ|t�`���햍kVX����h�����n.�ĨK�pT�ЛV�i�,A%k*`�ie-�i��P_��}y�W�W�m��M���J
+m遷%�T�ݻS)��*�L
�}��ݎ_�%��-
��$����d�1?J%jp�ɠl���
?56�6���kgpD쮴�ܢ�j��-�J�7n�0�#l�cr��������B�[7�]��������<��>n�X�Y�,�ם��1s�'�UQ:&��XoZ��H%-
=}#�/���"�$_ZQSW��
�i{�@_����O�^ڗosV�J�_�W��B[��������A�� P	oKSԖC^��J��ΏPhp�.�;�A*��-��W���<������Q�cn����+�}f������;3g_i����h�������P>��U�ŋ����4��t��'[����/����MK��
���W�\M��:��xZ�96�!T����im
�|!Q��{���k
9�ԊT�g�l
F_�P�x�X��(W�?C���
*�>���Q[�*M��_�b�nc~k*)\�O�W��Ј�B>����f}r��0UR�6YTZl�T�j���
����SXZu�бF�Ro�Г!��t`��U�p�J}�J-H�겢�̴]���;�]��|�~�2sc��T�ꔨ�gC�X*����9޴&��W�߼m���Hd\2�q�*4��/x���=���ԃ��n�Ji�T�
����-A%Z[��&v�m�^`*=����n�V,4��y�8Fh�J/��_�|F����m�
+����@%=��f�Vk7Y�9{��	Sӳ
K���d��nsI�ǸJX�A%"�e�r3w'�F��rq��lݪeK�
̛�w��)T�aS�ũ�*Q�9�J�8�s@%cs�q
\��qbw�e��U��i�T��q
޴�8��W����J��J�
��I��F�$F*	@%[R%�
ϫ4Lf�~{.���
�*���]��ˋ���%�E��ս�vuk��T�����h*a�����&�J��u�
�L-�րJ��� ֽ$��R%V��:;d(�U�p�[�t�bPISI����75���c�i��1�Ɓ7�����_PDl��̜}��_
>v����l��>�
��>R�
\Ԭx��_�W��Cb�W{.�;�D*UH�%bQ<����h�e��&�J
+7<����Яn\�@�>L��RuYQnfڮ؈�^�6H�%���LQW��4a��>�)��͜����oD
bht�H,)�V���74�� �pC%V��p�"��e�G
�*-��HM�	��t�ߺi�
+7R	�M��2a�8��874������8��.6[
+*m�w��

+�IJ��),�B*�::��/���0^%���*�R�
0��PÔ�g�JQ�Jh��J�C�4�1�J��w��	�D�Iپ���I�A~^.6pu�J�os��[�yu�|,��Nn��-���>�Шx�8+_ZQs������w�_�A�3x��?�TR
ķ85�J�o^��{���t{3R���0;=5Q���lg
*Y���Pᖫ4��*Qs�1��Q!T�7-��g *Y��dm���.LL��.,�B	��w���*�*��^`*=!T��d��R���͑梅�I��7��eɫ��D�IWg�Lٚ�[�t	~u#��(��Ќ�`�1�!TRG��D�3�X�z��m�n>�!Q��{���k
9�Ԋ�t���J�JϘA|��c5
����t�ҹ3�R�Ѻ�ʒIzJ�0,`������5V��H%-<����}����&���>k�������%R����7 L��HY��J�JoT�+�t�>�Vl���yʆ	*�@*}ī�*��T�_�hMzq��
>PUZ����
���l��n�&H%XB%,4cG�J�g��gR��
?51�T������go^q�~P	VT�WY�J#SwJ��P�����P*I
$┄�Ѐ
�N�[6�Yaaj���T��R�=����	TB	�U�B*�Z2&�H+k����Q,̑|�9+^�Q��s�J�*�ݓ
��~�rscl�h���
ϫ��(�	�R����U%�٠�0<�����T�4CW7�&H�I�J�F�J�c�4a��ʠ��fhh��������<�*sL%h:�R�4_"�G�
+|�
	�����Ҙ9�ɪH���psnj
+*Q	��)�N�%��
+L��S�J�x�x�ޘJ�,�*
�*�l���_�R0����W-#T�aN��ɫ�j�!U�}���ދ�]�q�*K
+��S�a��
��)�yu�*q��f}
+*Q���������r,�rnQ��-'�={�r�Tz4dӉ��>n����,L�J�t�Ə&�fb�޴���>�Шx�8+���޴Mm��M�s
+�R�|��*)�{^��V�<���_}���(oo���v��^�_�J%��{��>��
*ՂJ��Pi����5\ݸJZ
��H�Ľ~c}t���~���t�q �e,�>c���j�FE�!�I���hID"�,d���� �I�Tk�K�
�Z��)��Xf��aڙ����=��M"��{���{��<���~?�Ӹ��*w��
Wy���RT���)�ٹb�nW����*�.L�W���h������d��W�BY%c�E�ԓll�,P¬�J�H�ɞ~�a�s'�J�ژ�U*aT��qTBs�*Q��P�k�/�=M�*��U�$QI���*=e��]R����vl�Y���|ɼ����^nA%'��}z�J�k�*5Tj˫4�a(����*�1*�ܳ�pq)�t�Z9R��U6�Jhe#T��*-��
"��W�esͫ$��E	kɫߴ��(Pi�_PX�E	�RA�m�JL�T2��YQ��7׬T�G�T�U�ݐ	*-�}=X���v���_[R��̰*]A*
TZ*�
*���Ծ [...]
�U��
*%�J�H�c�eg�+���h*�p���
+Rie<�
+*ᕍU��dU"+�Q����P9�r��9+�
����J/O�N�(���C
�U厪Tuf��C*
���Ji��\F%�3P�
3�?)���T1f���7�Rbr�z%�ģSNb

MM%�ne�b�<�JX%
��ة����t�DV��o`��XP)�S��t��DU�3�����������Y������Q��ÅTɒ�T��<�2��
��-R�@!��Rtx���5R���Uj�TjъQ�C�nH�!��$Pi��41y
���������+�N*+�R�L���*ٚ�J�KU�oZ�
��u��	
��V�df�P��Ju���T�Ĩ�^�*�p*
F*ـJ�*�_���|�r�d��Tb3c*5��ԎS�?���i��|�Ҧ|4�c'��Re�o�QS� TJ!Tr
	*1+��J:���
"a�Jmy�8
�\@�P)�Qi瞢�ťX���7ᛖ�DU2�J���҂X���>�*U+3z��f�W�w�R	�NY�Y��jST	�l�RT(�l��Tj�q���*5�d#Ui����T�Ϩt	T��Q�	���J���S�j��#A%����N�R}��jf�
(e&K�J-�J��H%{^��J5��mA��E{w�U��p����4UjƩdɪ4���5TJT*�*�(S�UI錩J5R�x�3�׏$U^���of�
�T*����*-�f�PɋQI
����
��
�J�2��@��J6R���J0��U:OU�*H��X�cJ*��o׫�����Jꙑ�tSM� e����J�STI}tZQ�Ͷ
*53�F���B"A�D�R>R�X)l2�
:'bXT%�4�_�|B%ow��H���J��JzfF�RE�U�o
*
�B�[�RUMg�G�J��Ɠ*�WP�>U��d�a��g$'r*M���Uz��Tuf^淒)��٩tϜUj�����*=�*Q�^�JO���Y���JKA�J*��*��J��T
+�C�T%
��V�S��T�רJ�S�ıC�v#�րJ�A�i�S�J�����S��J�
(e&�ό��J-LM%��TUQ�J��iH����S�!U�.�EU�O�
TzN�RA�M�J��J��
�R��T�G���<Uor*U`�N*��T�B������Uj��JqT�רJZPiu������J�$*��i�*���y��o�gT*C�+׀J�թ��J����Y�ԗ��|fT%
�����-�P���J�����*�s*9��J6b�"A�D�J�4������TZI���@^%
sP�VA�l��r�JT��R�U����Q��� 3
wmߒ�6-	T�	��tT�T���i��\��`�J��T����n`T�������(e����J#�'����D�J+�JH��Ҳ�r�*�JjgLU��Jw�J?�Rg�P����}V��H����P)
T�Ǩ4����R%��H�`�9�Qi3�R��Tz&R�{�J���
V��H%�tj*iqjj*u���Z�
**�NU��1U�v*]�G�w�J5�
��פJK@���^n�}<���,Tj�]e�J�{�A�	*- �2�J{��*�1�J�ӭҷ�O�`��J�@� ߩX%ǁ\�1*���Tz�S�=V%���O`HT,��"�t�t��DU�k��-�RIޖT%}3ß3�t��5g]z�rP)BP�����Y��kRuh4�(���T�vpP�T
+���P�1*�;�}�v��Y%h:^��ԕ	�R�\��m$*is� &S��T���Rfv�X��"��
�CU"~OU��J��|MU���p�D�Ҿ�;�nZ��T�1}����M���i���v�V�J���}B�@���.U��U��t�W�T�W�t��6f����ÂPӍ
5�U����ֿp�偝SSI����r`N��R(�Ϫ���p�IP��
+N%\9�Q�T~OU��J�-�J[�*1m�v��T��dFP��7)��֬^Μ��H��Xp�G�v����

��T�pmǫ�B�ҍ
+��JpӁJ�t��*qM���âMkS	%L�r<|Cg�J+S27���T"*����{���TIԖ�J]�J5�
��&W/�?S&�&��I#��k�
���J�,8�S�
�\��?�4�J�
�4�2h��`?O�tN��A:8��t��J�]z�W��
+*q�sVV9T%��S��B���DP�ɾ��UI���VV��Qi����ĥ
fG��vG*�5��k�	���mqh���J
+;xo�
|��
��*I��1�t�P�
,ܵ}K�ڴ$P)&<���MPIig����H�	�9��h�὎�J�\�A�$�+�;�U�@*]aT:�o�F�%T��eF�wM�J��K��3�&����eV�7M[%��$m�^�L�*}Wl:2
Ǐ�J;@��eK�ńO��r#��!���V��\�-[Ü a�]aN�
��
���~AaѠҪԬ�y۾��#%���T������_�Q�����rTڅTJ��Q�j�A���~����\8{Z�&)pMb�B}<�JH�.� 4o
�aZ�*)��[�%n�
���*c�
\�JW���KO�t�D�J8
C�����֙	wkY��75�9��U��!�>�l��_pX���	��@��JW���!Q�UI���QcT%�� ��j.wnT�f�T�_�J7��_�
*�,>\������̔��
c�B}=\?
;�#�����F�n���m����a
��p*�8zh�n����t̟1v�I�ƌPUI�x�Q����ANhNn����1s/KJ[�q��/

9��	
+���G�g�<��:�8
OVcԣ��H�(6��ʪQ&�P$�KQ��H��&M�"
)ҋE��Q�n���Q8�5����Ͷ�����2��������{��cXi̤4,+ŀ�<]
l�l�`cb+��J�t+i��4��0���у�?V�+��'�
+
�uw��Ƭ�Q'K3J3�n%����C;.I��b�{{G15F�C��J��]jm+�,��:�p8"���u��.�m`%Md%�ܳ���Ƒ��Ϙ��4��e�*���ܽg���c�S3�O|u���- ��80�P��V+�e�ă��{���ɷ�r�[	��~���7o3�e���q��1���V���V�AӬ���io���9UV���

��pv��S΀W!�f)�h�i��rQ�c�+�v�+�5���:YR���x8"�������l^��+��/���$Q7�z���s�L�IRz��ŐӪ50�
K=�w
�%���m% �R*X� i% V0�Z�7�M[p+y�V��/[��V�[�;C� 
Y��V�f�+��H���z�8�X��
Zz
[iشk
�v������FV��; �����H_G
YIY
pud=X��83f����O�PN�|`�3���3^x��a����N�V�If$3$HF�}��9do�R"�J�b+��4��aX�rʝ9]�N�����E
��V��	9iv��&���£ݜAh�=(��EE;��^�|�A��r߾~�����0;=)6*4���������@WK}�jU�Vb�-A�飏>�GRr�WZ�z�M
����� 0/]�u��w��Jt�Q��+�(�$�
Đ
�!���J������
m�V��Vz�����ݽ

Z{��5�T�=!�4m<Z�F;مK(�3�i�,��i'h%��C?���R{S}]���œ��#Q��������۷�r�ש�*+,���Q��.-��3��r���721��st����ML��*�j�5�� '2+�V(�+)��J�O4�JU�g�!����]jkĭ�V� +�"+m۲Il��i�_݅�z��7_�8��h¡�`?/׽��LaO�5���=����n�JSƓ����Y���.(%i׍h�'R+�x��5�J=
�o\io����,+��H��
�z8;X[�06��h|��?�i�`��Ȝf	r2��sr�	��MJ�.�rjj�|�6?�g�_��6+��J�`���"����NV
+ƭd�[i��J�J�=y
{�}ړ�F��ɒ������d�>�^V�P�_"'KX	�f�lQƇ�>d�n��g��
+ʪj�M��wr�
��MJG��f�h�_z=�
�J���:�ܸr���LMeyQnfJ\Lx��PV��C���nV���9��͑���-�s�P�
+�I�)Ĉ��9utq�9��V��}ﴒ4�JS�h�ޑ���Z>m���i7��J�J{�~�T�d�%�F���9�Y����j����1+I�V���,
푴�L
N
+��
h��уM��M��7y0�	n�XD'X��<�p��ͫZ�
��y�|��؈~��x�%(�f��&
L
r24�aa����

���� q^�yC�R�V�y�VB$�N!٨Zi&f%�aX���HX�����"���ҫ�/�������ۚ��UW�f�'
�
+
�uw��2߾�@���NMUYa�
��'s(�f#�hﭴÂ�������7h���[TVYs6�ʍ;"���PǨG¡��~^���f�~�sᖘ1}ڸ��t����/X��W0C������
+��K��-.���/@N�XN����5
�4_Z�d�h%|ʟ�J�#c�.d�V��~c��^�DL�����JO�
=��CwX������TYQNF��@������cC=6i�-7n�D�NR�PQe����a�����Ӯ�I�����N u/i��v�lw"�������ڭ���~�J�W���%BcOj���AN�/���������������̼�_����ӽ�2'aQ�H��_�l�O�d�͛�7��4A���5�J=
wn\���p����(7#%.:<���Zcl��FEqj��eQ(g7{ G}��5��n����4��z,�8�����Wo���
���~y.�CX�����v�5���:YR�������dgefb����VRƬ$Ŵ҇,
���
Iم��V�Z�AS��K/���`XN���wXN�����u0^�QTɰ��D'��$�����#X)��&h�>c�e%|o��E���YI����J�Jh�0id��G0�Nd���tyq^&~�y��w [...]
hʑ���*F�Jhb+��0?�
Z����I�;�p�XK�m[6�hn��[I~�BYI��ݴ'�v�h�������͇�C�:lE=
ܘ[	��v�z�n	��p�;�J�M�uէʊr2��D�r=�
�-v�q�~`V�]�l���J�~͑�'���%
+ʪj<�X�;���F�&�e�/����qN�b���V��k�_^���W�+MM+��L�h<+���s�O@���iVx/+=
��V��4Q�4Hk`�?݃E�EY���Ñ!��n�v�f&F�:Z�J��K�de���f	�K G{�i7�ݢ�
+��8�";���F�&�gb=lj�t]hEg�7����n�#�RO��67���,/��H��	�z��!/pF��.��4�8�)�RX�R�s
����
$p�s
+K8�����9={�+1��J�_��1+���L!) 1JJ�VB?RA+��@Z��P�0���
�Jhb+M8+Q[��u�ֵKm��j�*J
�Ӓb�B|ܝ�̷o5�娯SSUV
5� G{Bh7����z��@;gn`X4��M�@�����P�^1������~ +�?z�㽞Nd���Gyq^fj|
���M�ܲI[s��U*J�J�.f%��p�9M�x��$)�p����
r�i����
+��K������iPTW����D
c�*E��3���:jD�@
+�PFa	�,���" a�}�M���(�����0�"��HtX$n���R�5眻�o���*����y��<�s� 
�X�b��

�W� ���8Y	��}��!+ipY�4�J�j%룱��eV����a%Ƈ���Ow��z:��^j��8�Da^VjB����^�6��F��u��f~)����
�
Q
g�������V�YO�fba���
����_T\RZY����.�C����~
c���*;
�q�0�:';K�]�z����U^��|�p�9�z1G<�IK��v�����I��aN]������
�V�O���	+-�@<}ܭ���.�F�"�7���S���.j��2+MB+=�����۷������X[QZR\�������hkA<59���VT��1 
Q���@�?.�
�p�5u-]Ýtn�I�s�N�)��#hw��v���?y�L
+�c����݁;,��f��E��z:�[��ھEo�q�+��|��g[�+�?y�p���r2�����
+���
̩��-�ۻ�����i�VzDZ�FwH���<`\��
+�V�d��Y�U�u��̬쁕���Rq+u��J
�cV���h+} �����-VO���s�JC�J]�m�Mu���9��}���cNm
5�x=�?v�f"�͙ˮ!
�
������3��Z._C����E���
���`]M��SǏ�e��G��y�8X��غYGs����TE����˃�䰜�1�5�KeɊՈ7.}��"�R2����QN�DN�_ 'ɸ���P�8����
��
�Z�V�F�K����V�������/8<:>5+��	+	�>f+U	�t �`
�:���ˬ$�/o��XO�<���������*��Tg;+S8��56�]�b�"bv+�o�3�1~������RH;M�
��0%3����s�v����I�v�
-�{w�}�֍�Ϋ��k*Ο>Q����sp�^WG
�m����.\P�^�TNS���Y�ڨ���u�1�
�%9�O�+�n 9ut������CZ	�����4�`%
+e�n%�H#������ ���NZ	`��Xi��R
a�c�5I� ����V�+��d�{����R at m���d��E��y��[�}f�&�
�V�7�y8�OH;���	�)(*}�2A�/u���8��1=@
;z�O;�¥Ywox]���­�,-).d�'�F����`�h�^_�r̜�
���`���e+׬����7
G׽��мA�� G�O�o��l+
bVBW-�m%0�t���(+��&�JS9�$�:n%���Y��5^c%��i����2+M^+��
���M�ņ��s�O
��JM���������n
�����>�f7��@�y�v��vZ06�ol
ݼB"bӲ�
�K�w��?�v
�cj���
Xi�����rK�� ��

��p"`.\�����
w
�ʧ
��I4'7�`ë�k��D���w "61=[PT\RZY����.�7<��-�J5���+YA�à���|�����;
V�O`}��
�\X/)%���̣��j�V�k��1+}İ�;2+I��ғ_~�
+�
��=�W[/5�V�/).��NK��	������'�c�8hR�>cD;mD;��N(�ؤ�
A��3��u�v]|������������H1�=��D.ܹ".oB�s��h��
+����ޖ�L-�<|Ca�r�;v�LYU]S
��f���!:��/�n���U����%�R<��

+�x�h+M
+Mí��3�������^�$�Vu��F~���YX�Yi�X����7<��fw[sS]e)xk��}ܝv[��44�g�|����?Q�͠iR#i�i3�������oPhd\r��
��r�Z���}wH�=~��Th���:�
w ^��h�W#��e��G��{�8X�
/ܥ��?�/�����S��r"���LyV�6j�@ܘYۻx��Eťd���9uÜ���?�r�蓖i%tՒV�VB���**<�����Q�a%	(���`V+����U�"+��o3"� �����O�
+�����Q[�)�J�M�X��,��&���O��~���2bv'��݊����+�1~,ڡΔ�RSPT��Se�v���3�
��O��=z�Թ
���u���
�
��ҡ
��%�4�D®�����Yi	1C��9�Z��h}�.\�
��{���a*>�g+�SZ�Py�k��v��,l
��I�ʃ9�W7��n`�z���o��1�D�><��,�J�]z�D�sz�]�\o� �
��I�J�V�� �9 YI �T��ԅ�>$��
�Vz%�J�9�I�!���T0+͐YI�_�
++q���?\�&�ݹĚ��ru��f���p�������N�N
�fba�膶!����g\^�p��JG�
�ؤb����n'�pk+KK��P�ACЅ�5�pu�Յ�����TS��s��4�����Uk�Եt

w~���
7��nj/�^�D9
J9'�J#l+�"+�RVJ �Z{kb�ilXG�ı
&�Jp�}�������t���N��F�u�-�{���0+%+x�)H#b%y��$�獷����!av�j��ٽ\UX

��C;���+F��F��$R�Z�ac3��{�g
h>c
X��കЅ�
g'Ր#��E��z8ہ
��͸p霈� s'��\*K����۲}������O`跇�����hɉ�^��R[3i%خ����6GVB9-��Ŷ���v+	)��D�4�}�JI�9���g�H+]��w���cd���a]䣅V�m� ;=1&��Ƃ޿+dV��V�
+����m�k�=m�
kW�X��ٟ��=���T
Z�
+��t&�B�i��������7(4�hWVŵ
�D;�=��#�!�­��p�����x��y� ډ�p?�p��c<�NZEx�����G��w��

+��K�8R@����^!-aN�
?����v�V�v�gcV26ںY��Y��|h���B(A�-�)f�nR�Ҁ��>�w&�t�ᯱsJ���
Z�X	�F�J�b�4Ef%�@�+����}+�ٝ�
���lf�X
����k���_�c�$�n
�
QB0
���W�

����hW�h�
[8��P�{%���
 .�+�j���~�uu^qxL��ѶqC�F[�(�bő*Z�b(�j]
+.���PEpA�
�M)Hą�E
.�%l�èu�Vkk�:c{�y���5���p��/��y~?��y�pC����4\ٞ�/���tҔi3��N.�>�D����⒲��ںKW�pOx]����J�����Gb���J)	Q at bO�
��NK$Q�5,�fV�b�$;n�"Š����I�D��2g�W�j��YV��D��'�
�m��b%�V:��e%Ņ����������g �L�1v�c�� N�u@��
�igfnaie͢��:�-!Q	���WT�Z�
[�+|��:k�-�W�ϟ�
��A�o䇬�JS��KS�i�
6|��?�1��9{����K��6n
�NL��a��>{���tO����J��Vz�Y���~�(tډ�UP�Z�ԣC+QL#�[㠉bAr��)Mz�^�J��ۦ�3t�`h�7v[�kZI=v���>��{��
:
�����m�g[Z���N�^
���CKJڽ+�
�
h7�<�K�9�y��wf��
*-�W\�����[w�Th�\+�4\Ʌ�
w4�p��;v�(h��p�O
��Ξ�J;� Y9z,���Y��ܽ���c�0�-�<}�§�8���h�'e|`({���������Ct(����I�2C�mI��� _�Jx��g�
3��dɬ�@���[����c+���Vj�7{����������
+z�h�	h%�aB�%�t[I헷�J���H���R���

���
+c��s�
��
F���'��?�zJh7ȀO�D��6H��
���E�&�"펟:��kR{�ZI�p�k���{���@�p
%
wܘQ܍
G"o�mM���d��g�������:�pA�G�%�e���	#��v垾���k�v�2_e3 e&
�ެ��G݇��aA����
V������-<6�
��Y��Y�I�(Y�Y�@s�����x�<��+0H��R����Xn���ŹSǏ
9P�7+-)."xӆ?�kqXho����;f����8�'�G�������7llj��w�����㏏89=;����i�,�ݗ�҈v�
�
��67\�TW[]!4�(j�n��K7�	f	I��6K(����N�53g�\�t���u��F% l��,)���%X~�z���v8.�
��6Z�_R+���E�v{LXP�/�	PfE��gx[��pK���f�l�^�$9��ǣ�"p���,Y�cZ\R;n�-��(�*V�?V➬���ɬԻ�J
��ݷ�j�~$�n\UEYIqa��t|-[��y��\��w��V8Sz.�8٧C��,Ji7�0� ��v�qkhtBJF=������h�
5��j�+�ݹ��p��.g7>}*
����;��\�ԓ��C�'�J;�*-�f�*H�Aa1�;3��
*-G��_m$X��"��VQ��	�;.��R�dž�y�9Sx����'>�R����z�V�=	��J at u�L��{���8�iyd%v�A���
��Z�J�d%�Ld�fL����+1̰��Y�E�n+)~y����[���ۗ���
�5����yْv,İyw8�J�~|0$ڙ��2�yx���l߹kO�G�K�+O�� ��
���#�˂g
ׅo�Ļqc��)i�ZkI�&��|����+�)���:�p� +�R��=~�
��Z�Xꉕ�N
V*9P�
k�
��G��U�I���Q#8��z
�Y�Gpl�\Nc�_�T��ON�R
+T�������Ŭ��x&���޸��R2X	^�Z�n
X���V�rV�2�
\�O/�;SI�޻+5)6bۦ��\d��@'�o},K*�ê�h7���l�4K+\�������䴬��ٙO.^ڵ�>bMi���Sj�`%IíQ6\8J��;�&��+1�~�%
+��]Vi�-���B�]�v������
�JL�'�j`Op[�7o�mף=I���i1�hM��
���J��o�왰%��
�<��%u6���;�Y�C+�I�|���J��
��p8i	�녘F�����X�4Z�����Ë�NO�+fV-G!�R�n+u��[b%���~Ww
�#���bB6��x�_pZkIN��"�
4j8i7����yv@;g���6n	�J�7�Wx�㲊��:���^����#�
�W�@��n~N&
IP �p<��B�eWY.O(KB�di:RI�^iݽ���bwf��+:�%�+
-ׅ��=�m�G�J�c�'B���(.S�X(0�[��o�J,��I�Q�@+ur���NjH��I��W�>
�T��b%~���Ӓ�"`�2+	���������𱛍�K3�9
1����HI������L	8#]��OYR�]_\{�@;c�Ip���kC����


+�پ3sO>� K�
+���$�����\�p�7�,�ᮡ���p�>L����>K�X�ƒPiG"iL��Y�ETj6G�%�f���G��
�<s�g%$x�m違�(��o�
k����n�*md��
��?�
O�S'C�%��D��>+��ĒZ_5���/rtr�Ĝ�����Ϭ��n"���S]�J�y+�kcu��Rn%|��It[I��[`%��-
1�Wp�+�Kiީ��<p6R�
�G �ܔ�v=ڽ',l<�����6��p���ȸ�������D��m������iA��)���pY��E�l��+Y�x�-dO�D�p�
(��ږ%��zʪ�!U��?�J;�*�J��!Q�;ҳ�
+�K��������Ϛ��r�|,I�TZIz�Z�Y�����Pi!���ؑ���g�
���YӅ%)X&9�N���V�% n�&��L��`��J׵���E'bNC��E\�
Vj�y���ҧ��R%�%Vb�
+�T����1*����|[k�B���P���V�ZVc�x9M�p�N
;r� 7;=9>�
8|1��ӗ���]/�8��b��Ys>�[�d���`hT<a�]YEUMݥ˰2�5��"��[��d
73�$(���}�r��s��`Å�K�;�;�8K�kR�Jc"%TZ{�҆� *sj�k�.]ih�J{�^;�c�~X���(<���ߡ�|�RBt(����#ZI�2C�z�9+qI�K 4kj� �ݼ|��Ę�x�äp�K�ڜU�NV��
,�(�LVjRl8X�
�������k�Yip�����Tc7ͻ�3\\FJb��؋�
A�aY�_e�s�
'ڙ�~mc��a�j�����1
*-�'\��EN���_�QU^Y^�I�1�$q
"K4
�
M+��]`��(
�IQ�H�&E��" �h
+��K�� `�R5�L����������{/�\r��?g��>��j���
��enᒔ�bʣ��� <��ɘ�Gj���È�>�R�N��ԓM%��C��ä55�&m�����a�V��]�����$Zp�_Vj�Nb�=z�&-����Gȕ
+6d��h�Y6�3�2��V��֝�z_-�!��-,�A�\=A "��d�"�`�r�F�c
[�h��7���{M��Dȸ,�����������@��k��b.�*O
C�C���Μ ��@�(]_%����$��t*�⽌���	�9w���O |��)�YyAC��9�	3���
h's	n�"�0%�򢭛�3Rb"�!&. �6V��
�`�mc�iy �}��8i��I��&m���J��+
j����Ԧgz.;SS,K�E�x��e���"��2ZI���c+A&�llq���� d��S���V���o���H^��|����2I+��{�K�D�Ɨ��ܧ��^�V��{���e:��)̓ Ζ ��~2Z��DZD׎ƒ���r
+.�J��#>
5�
?`;WO<Xlb�ZJ���� �P
���&i��p
�YM�A�pA�!�A~^n��p�NFa<T�#]
m��0����J+=�
�	�LZoɤ�w�����U���������Jt��+�?#^�qx$OWH��)�p���
�A�Z����-�
<6��8u;x� E�ZF6�<u���K� ����?e���!�^U��r��3h+Ġ�v�ҫ�Jb��p���%�͟=�n�P=]
�͈���0��ю�J�L��^s��V�F�����
��bl��=1�0��]�[��������å$&�Y����a�|<0'H��0��0(D��XzK�cIr&ey��
0p�?
?&S	�
'�"_��	��-�I[USw��,&�5��p��W��Pv`o���<<RTh�����
�
�Z� ́螤����������#
+0�����f���8�� �c�������K�Է[�J�UT��P}4Ou�Vz������ZI������<u�pi�p���3�--��ͥc�7E��p-5G;
����v��ll�-tY�$^��۳���
�����&|�o%�½RObRA��)������OOW�y�ӦL2���06����EcI.!����4t���F�LP¤u��[�"vU��N�oNä��r���O���
p�P}��$9RvF
+$K�M�Iơ9�
"'�C
[Iݓ�[�����`°Q����<|�#b���ld�v���
��J��������UP_l��
�@���Dm.� �
_�_g�93P|��zg+I�ґZI
+��~����
_
�
9�0<��p,��*�ڱ��ZRI�
�����/P

ݼ��BV�\����0���o����v�����Vz�f�^���;�o�6����Iq��
+ow'{
��ɘ�G�X҃�c��d,�q-u�DΤr*A�3��8�<@�â�%��lu-L�����p+щ \	Z	���w�
i翿��J�	�sw�?{���f������
��J,����
S��oh<�0�y��%�� Vgҷ&���UPo���?W�h%0_�Zs2� 1���
N��!�
T�O�Gg+5����J�/_
wB �� 8Ks�X�W׸wK���ve�����@~*YX1�.
��ON���r���ťH���:J;8X{��p5�p�����1���ua^vzJBtx0�e�<[+qH�l,i�%Dgb��M"�TN��f�
\=!V��l�
P���y��8����O�
+Ѣ�WC`|a�1g-cg{
+�� 3C���}{�X�f+q/ޕGcz_p ݏ􇢪���,t���\��z
���CG`��� �v��Q5�_���Q�?DLxp��_ϟ��Fc��Vz�Z�W�b�n����%�2R@邗,&��6eK��X"�
}vMy��H|)	�S=�&O�����s�&����ik�&PD��
����vm�;1����r�夢�dox8
�����I�b"��aF����F���.!/%��JS��Ҍ9�N�Ehd\��̜�����r��gϋH��?'�Ϥ0�h��p�ML��-2)� X
���3�2�'�G.Dd���e�Ƣc:������<
EPhT\�\b e�	`�5�R5^ ^��~$�����%�1��
�U ̄q���@��r��Fg+��K�i%%�=d"s��
~39�Ȑ K���ec�Oo�X�p-�i���v0�t�T��h*(¢��\
+6o۵� �]��
U�N#���>!'��pIЋwAPr��$�G�-�t��XY41�4�]�;u��,t*��T����$8<&!%
��h��l�I�Lݯg�����wE0� ���[�����t����Ł؞��ݸ��9�l��ĭ�֏,�!F�?�T ��
ݼ�a����`j{K�0յ��7nq�T	u��ȡ�ݹ}�o�r�J��3R�[
�V���4����
�q�ԥ�����$K�]G�U���


�Kƒ�x,��
�ݝx���n�$��Ѯ���E�i}0 at 2���T�-��IH�@�� �
9~
+�_J�;����v�}5z4<�pI��k��!(�mݔ���b�R?/W;�Xb*��%��@�I�h�����l*��F�\S	0S���;��
�9R>iѤU�H-h&��#�:\�X{��'*����ua^Vzr|Th������,���F@��T�[I�XjQ+�`�\��M%� l8����;��.
�P�����R� �ĭ�z*�[�~��PuH���%�v·���	S�{�9r� �L[�ߌo2�t����t�VR��"����]����8�l,iki޻��Ѯ	~��T�풩4
+����LB� Ehd\��N�Š�Ϝg��{�����J҅K\��B�w�s��
(�Qa� :��ec����A�
�-]�	y�E��C&l*��TZ�
S	�=+��-�w#f*Aߛ��/��/��gRA�[��x����E���F�
�
.4�Ѭ?�Y���[���8
 ������
�a�� ��,p��׎�ML[��q�6��`j���` $
S�J�����;��w���
+U�v��V2
�6��Vz�Z��x3��E�
.�Li,�w�A5ޭ�ZR*%N�ɥ�a��
Q�J�`��v��KI �k/]�~�V���Ӯ�[�ʅK�B�^S�ݩ�GJ��F��HM��X�t�'��Y�X�7h �%��hm��J	 ���=��<�gc�5��u�
�..+�R��US�E�j*�2IJ�R$QD��:�D�B3��D��6��a�a�����|/������J2���W��s���y�����t�2��Ji0��6o�}�\���
��9�V�J�]r^%���Y��P����"9
ܳ���%_$ϊ��i�
i6a]��G��Y�f��vB�I"��m���3�D
�-;�)��L���s][�7�fķ�H۹���n�l،���"!^�<\F�V�wʟ�c[+i��{�JM4�w���#�q,�]ci>?�����ḻ+�nx:�\KJiבO��uG�0��T��RL%H;�JJ˫N����3 b!ȥ�v��J�����>.\�3 �y%��fg,R
K��B�[�%� ��,Z0<��2�L�d�Jy�7m�	�^QS��w�Uw�IcF�I� [...]
YE{��$/%
`�x0"�`���)iK���9��~����w����ޓ�)����l+�z�
�1��>h�Í��u�4[��"h�8����e�فf�z=>�օ�3!Ϛ�J�V"�$؈�n4�c�.X��rMA�]�x ��v)G �Z��J��?1�~�wߗ[�
 �sf��쌭d��J��Vj�}�Z�
�%.�N
��V\�c)��%���g8
��n�vZ��J�Cp�Sw@�>0�������R3�Hڕ�Xb���N;��-���
�g��QDZTU^ʍ��X���ı,�,ab�0�UI4�6x;2���.Z��)<8Px
+é4�N��[`*
��Ʃ�m��#��]ERH�F�g�Hض� oe�I	�QaA>(�`��듏�<��-��vB�q�ޝlS���
L0�I q��.Y���\q�h9�6��m!ž�]�zB~��H�Y1������b�^�'�Po�
����_y/Z������&��X�'�.?zp��\f,���sw����i�}�:�$)%�hU��	<\��Cl�庸�T
+V�J{�U��]�q�����~B��ח*i�Y�椚���D���g��
W���lmMexe�&v,�Xr�p�E�#��E{w��
p�v&���x���E�<u�����_�� ��Oڧ*�Vӭ�)�F��Y�x��X~�w�6����������Y�d��Yӣ�A�q���H
����|���C�Lhf+��D8�Ot
K{��.�0M1�f�KM�so(����H�����{
��V�J*W[��˥
�>Yy��ޝ[6��J�P��<\5��Z�w�JڊH'	
��F1��X�<vXKi)0�����yy0�mjDj�3X�/���N8���wPA�Ʀ�m�	�<}�C�~
7k.3� 혩��i����.�Nڿ�y
���w�:1����y8�V�c)����
(���
+D�˱͐͠�ESSJrxJ�a�T:}�ۺ��Z������fҦ��J�DW�W5Gq���n�8
�4��
X�����
��g�VR�%�[��SC.�z`�
h������
+�N����"w��-_�;|
�¥z.��)�{�n*)��C�J�B��
�K� �<;�v�
�\�wik����tJ<���Z8:p�t���X�*'�ٸ>OKaA��a,�F�P���g��Z��ԗ��� ��@K��F�r��0)xJI����T�Ʃt�������M6
�,!.\0;z��xME�!a,��X����ci�Pk��	��2�Z�����C7t�qo
�XxH�a��I�
����S	L�
e�ꤣF�+Im3iI}
�J(;
+��Y��ę�"B��=ȘEj��#d������W�T2$� 0"�6b��8��	p�̕y`�]\�Ձ+�k�����ިv��@7�$ݼ�hm��%
�a1N	��4z
Z��1
�T��J�����+��J�d�F�f�
	8�n�=8� ��c))aztx�do���6V����5���W|>�!�Z2�zշ�JD�"	n>x����ȱ���C#�����Lڽ����	�
]tz o���I�W(��ci;��\~,A����p��E��ux'��

�Ekd��nim���C,�J9y��yJ
L���e������{I�H�F�^����>��$�Μ:q��~���E
�b���H �<��ǔ@NYCv,)ʢG+�S�C
+$���Y��
��b�}

7+�$za1آ���4�&�҃G?���s+�����j��vo�\�&g��s�S���i5
��ޠ�B������l%u٦���[H�&i%	�=z@
B�0���XZ�l��ݑa�	w��-�L�z���j�	��䭢���h�A)u!�dlJ
�i��拊�O���:��$SI�vzĝ.�����2(f�|,�O���
+�l�������v6(Z_Sc5���fr����ݤO?3
����A�1x��n*aƠ�������ծ�<�e�ŤA$&�_H⬑������
��8��I��uv��-ۗOd!��
K��O%���
ȯ~�8
����79$l^jz֪����d�޼-$�Sa�
+ǖ_�<��pi�#Ԓ#l+.X�2s1VsdX
F�Q��ቚIZI<A[+ɿ�z���h�1����_P8��Tc)�p�T��
l�����1A����j�Z�XJ*>t��Q.��}'�E�̘��pqfv�
%�TB�Ѵ{ħ�/�SS�M�蠽�D��'q
+��Xځc);s����3b" �}�K
w���e(K�Ek1�Ԕ:I���
�
�Ǹyz�MrgၝJ1h)��',<0:iu��FRh&��5�����Lس��(UVz�93b��L�C�s���B��
�,�F߱��7|+s�< ���=,rZ|bJZƊ�u0M�
>Vy�s.�_Y�sE5�VR9S����j�VB�-�h�T��1%1~Zdh ���H��%�
+pSw�Jjk����da�XI��I��_�t,��r��noO�1Ύ`�A����zA-uk�Zb�N��:	�$ �"��`����	I)iK�V�-����R
�J�8�8�Ԥ��
V��+�.�@��t�R!��R`�����!���=��8;�ۂh��&
+��W���B�h)�|$������
D$������g�̃�8�8>ژĚi��
c+"(
*�� �����}	��r��!�
"EED���bc�g�:u�1ub�LǶ�6�ϻ�����}��C"�?�����<�|>�/0R
�����;S�UIn9��^�UL#X�+
g��]�Bgu	�^_�~���%���!5�:B�e������
[0ш�4�>X%�'��|2>��:��&�_�<���0R3�
+˪���X�1g�'��$��[	Å�L���o�
+#0�"d�C]mM
���h	�a��̐vQ_dG�>Ϗ�L
���Wޑ�^GI���� >Hv�dYz�ϕ%�vZ�k*J
+r3Rq��dr�����
$;Mu��i��ii,�$d
;RJ�!�gϙ�E�e+
�ݽ��#b�o��TTV�����+�JO��$�?��F"$e�Q�~	�,�BP��e��-K�%�'Ą�y�9; ��,!\��������Ci�E�a��
V��Fŋ�����
+��|RJ���I/i�XL#Ԓ 8<�'��7_Cn��y��\WUV���
+�!��s��
$=8)(
+sԠ�~�m�d�,M
��H)qU食M��
<74���wv�����_
o�������7n�U�̚:
+�+��i�/����F#�e���E���V���n��w�D��~�OQ Ǘ%H4g���
+T]^����rwh������������tu��i��#�Nj��pcV���Rz���������hjA_
���
�o`Xt|RjFn�ݮ�Ξ�㒪$K�WJ��\I�ըؿ���@

s�ҲY���y.K�I�Qa�>�!KX[�Ҙ,!Xڔ��mť��C�Fkhj�������?$"6�
��� �JÂ��D���0���D]�܎������ �������Ϸ�o�ڀ���������Eh9��Ng�,[�&ɖ%�H����
H�Z
�̗�=|��&$��l.���ֺR��s�h���� C��nhVB����Ȼ�/��^�%�d�0
��& d���d^y'V�����G��$��YI8�,�e��:8 ���2Q���rwq�]naj��4���Yt-�m]"Y�a7�*%uM��z�\��	��KLN��/�����q���$��K�*�iG��k+��.�5>K
1�{��g|Y�w��5�,��
�ػggmUYѦ�����o�4KS#��~9m��1�Ʈ�J�4I %Q�501G����7(<z�:
J*j��a�U��a�C��V"y���Ǐ�]�<x�Ա>�zpT ���d�A��]
m��c&CS��'Pd�����pe)��^P�z}��s
=}
k;�k~��)���U����
9q���-菟� {Af 9)V�)��
�F�Cr:رww}���| [...]
+�ґ�����������LH��=?�4
C��-����қڙLx �D6Z���fV6vN�V��F"�!<�W�Q��*ѭDݑTI�%
��h���H��g�̂��� ������njm\d��窕v�pQz
��n0��e��%UI��C�3����^�h	������; 4jͺ
Y��˷}���
��ɳw�����4�ʻ�=��b>
���
���Ԥ����x�hɢ��,ӑ���[���Jʝ�R�P�'�%��������
��P���|��pB�>�W9��X���-�l���o��0���K'a։�4���,u
H��
<,:>)5=g��u
M��
��Hx�������X�T'�ffxm-q��%D/]<{�����M
u��[6礧���
+
�������,���7�W���kIR�~��(���A�5�F�������~c����;[ڻIƒ��$k%���B�G�&���.�ϳ���b�
�G��Q�
M����� �����
jY�hI9���	�r�*14�х$`�
p

����QQ�c7��4�L
+�37�<�Ff%Q]����@?�@uyQ
x96�i�+�,О;G
�E�ʊ�8n%�+o�J4�Q�$6����V��ҿ%e��&w�q���0/s���؈`o';kK3���%m�p-��F'�
�:VJ�fDR��1W�S��������J����q��i��EeU�p{�݇��8
�-�	��fOډ���I	��nFa%zY����������ޱ���hS�����Ȑ oW���Z���,�Fw�*<(����Bx��

+�^�.5#�`�V�M�Px��N������rUI,%^IC�G�%-ɯ�lΊYڃ�w1�qSؽ��朴�D�� e'��P��uu�,�a��e�=�,)�cB)��/���J at sCH�@/��H�yFnai�Wgϑ�p�M�ܻ���o%�^f'�"�у?ޅ/�
��z�ۚ�ʠ-�$Ɔ�x���M
qY$��Hy�J2��u+�:���I���_�?
AY����W��t�
���m�ܝ���&:<��������h�g�
��a�!-�B�%j]�Qb9�d
Z
/�錔� )A76���sr�"��̼’���]�m���!�]�v

�EBYډ�.q�L��e��֒hk��t�
+���v�k�4^QR��q<&<���
-���h)^�:�%w+��ix at RR4�%L������6%=;��
�goGw�8<�������A��$Nb4����D񒒽���i
+O
?zȖ��#�5���'Hs���45���=OC}�L�,	�4Q�%#�����3w\�4� 
+ at UZ��O`��Y���!4����r��0ϟ��x���Y���Jd[T �♓Gu�kj��,-�ION�	
�q���b=��|WDi	����0n%�+o�JR摸�<��{Ih����͗�Ǐ
��}
r
� ���j�ʊ��R��E��z�9;�XfabZ��GjI�8��F'&�}�Ih'� �8ה@J�
@JFf�ֶ�.�^~���R3r6o�Z]װ���@o��3/_E[�T%	����37Y�*�,3�\K2Y�%E�^
�p������=;�ˋ�s�S��‚�K��#�$SqG�%ě��ܔ�F;_�h�\�цD�&&!
K+��76�u��
;un��A��'�F��pf����յ��Q��$,ѨX���*���b��HQDA�"�""�)"U��������"�&�%ƞ��flQ!7w�Z��}�LJ��9� ��:�}���R�$�v�����6��\���� ��tu޲R�b�\S#�4iY�ĖX~&�8�cL��̒0P�T�Q�&���-Z������{?�Z| [...]
Wk/�� ��LK��
+
�������`��ڸѪX���⪍L�Ș���S'
��(�����q���{|G�&�����<Ԁ<܆�y����&��$�]�&�Dz��Lla��$���8�T�P��gN�g��A�AW����r��E泍�,�
N�i
$�I�)`��j�I�ԁ/��v�R_�JC�*a���_�|
��m;w�= ����q�x�i,��7�b�n��9��Z�a�Y��42e�DANzr|dH��t+&�
�'�9ToЀ~�l��Q����4�$Lp�VB�VpI�,���]��P	ޝޝ
��c�vG{[���-Λm2c��D&��z3X�#�Qo��ӖL�1I��
+�2�F�?i�������%+֮�s@�{ 0$2��c ��.����Ĵ�_��|��k�J�,%

��G�
�Z(K�K�ׁ����d���C��ݽ��f�m
+
m(�
KJW62M��iPry��6ڡ�F��f#$h�PxtB�Ѭ�’��(�
���C
yP���(�L��?
���	j�%~B�ް���
+�������v��Mʂ�3QY�E,u���
K�U�_~dP�:@
�W�&�CvA?]�������D )-+����U|��Y
`
�� �
P_�@%�����2���r\D��>O���@y�,*�uő�F���J�P��Vrx0i�>y��G
���=�w�f��E���x��ܶe���e�̛m<c�p�>�*D
n��K��0�E�3	��]�n��`������
��+�M�Ψ��1����E'�P�5܂�#F��vɮ�d��G�e�K��+��%t��k��Ζ�,��>��
��ۃ�j�І�X���L��j���I��C7��
+��a����>�C�QqIG2�
?��p��J%�8&�@z%
�L�Kt]jynʩ���'LW�v���s�EyYiI����\
�m֭�\f�҈!�M}H�uѡ��:.������:c����Q>��J&P�����sغ�c�o`hT|Jz�z �ם{�b<�㫙yo���o�������K�����A �[
�*.Y8w�Ѵ��IS�H'D��S�}��'*��Y �o���$ʾ���
>>x�S�=��y��sgN
�<����m�����!���26��e�~�I_t�̛�KR.�Sʵ!�����I��+ at i:@i�B��-m�l��
+
F<���t��K��^o��������UI�I2m�t�w�55yYz
e	m�:�ޙS'��f�%�G���ȇ6a,����%Q]��n`�U�>��%���f�F댍�`Hd��Ԍ�����ʪ�+�7P
���ʪ�N�+J,�X"�B
�LL,�$X҂J�7��Akx��t����N�(�IOI�
<��a��5��eiЀ~�,�-t�\��R��ޟ��N
.x��X�F�g�9
��Zk�.WO���#��ǡ�^����	�At�^��f꽕�O]��<�D��\��r��P��;�6�-�5�1m��ñ(��=Q���mT�+��J�~e�@�&^씳O��Ҳ���E�9驉�!��tuqrذ~�ʥ_ϗ`i `�1�.�z��ă��djO
�$��<����	"HŽ��
�� �e�,m6n޶��ˇW�T�*X����ͪ��ƶ)eM$A$]��`I�,=��6~�F�������ₜ��ñ�!�⡙͚i8m򄱣h,uW�Y�wq	zT(%J� �A
��O�j`d*4��<�ц�$�
��+,)y��ڀ��C��@%��p&1DzIL|_"��K*�e��/
 
u5Ug�J
+s!�c#��}�\�IYZ–���
z�x}u{b6w���c�C��DOM
�������U	
���	SDU���L .޼��
�)<9z��G��_���w*� e��+�O��S��}��]��m֮�X`f�Eq�0B�^<�����ڨ�PI�&v�8 �!G@�[v�ԳO�����O�Ļ����N��e
MI�	�ݳ{���&;.�X,�
6���qD�e\� � �S�B��$ֿ1�����۷��Ab(-X�l�:�
����y�;�)x�I����k�z ��p���J(�M�7�y��
��hK%yY�����?��c�56\��D\"/;=%1&B�՚K`h�3
���D*.=3
��K���!�¨h&},�2'J��h�I���F��4���4�v������A
�<<�����?�k�@I`!�
8ϙ��$d⸤Kj��G�/�z�SDH�--��>�
z���V;�,M
;j���
��

V����P?
���!1��"����r����A
��٠�BUھ
��PXtbj����W���ݹG6��8�-P��&֙��7�L���q�5�}�
cC����Ě�#���J���D3I ��kM4�����d����nߨ���
:u�xnfZr|tX��~o���
7�b�-běŒ
b�1o�K�9�f�$�h���Om�H��L�u��g�>|�qP��PZk�����u�^߃�1�����]�|�:I�{���7�eU�Cc��Ut�*�*�[�7�/�*Kl�=�.�\�:��w�����
�
͞�9`ɀ��_̿/��+��Kh��"&a.vb�/��(I-dqiye&�-�v��hqע*�ר����$�g�!hq��N,���n
�i?���R}��s,#51&<�o�'[��.2�h�6y����`8�@Y X��c������C	��O����?q�t#S�*9AU�
����Wx������
�)^B�7�@I�JϘo����)���'�G�xR�n�?a���/����=��sf縬�$��M	%�K)��'��HBQ*�jJ��"$�h0&�ed�)��~�
��$���&��:����g�g��Vk����]k�Y������|?���J��@%���T�𨤀-<�G?�]��L
+.5K�,�ݍ�TQ^���
����e���<�?5iGlTxh��5�˗(�dmiާ7Y�Xq
Y�)�ă�)=��
IJ&��Ӈ���è���);�aN���g�]����?08lkt����	�WHڮ��vj�ċ�\d�GEeU�o���R��h�-�A�����
�F���_L,9
X��03��ۙS\�K��D�Ĩt�9��hsF�'-�5ڼ��Ew�!q�W	Y��۷�ZTIN%J�(&!��D����<�	�D�$�z,�R�pS$���
Pj��dHMJ�YZ��4�k�������mm�,��{���S�eX�s�#��^6
+�&hŠGB��
޼��u;T%�I�Uڄ���/=3�ԙ�9y7��4�K�^�.C�*���8ٗ��f����$�\8����
���pΌ�
���F7�7z3�>*i�R=���I���˩�lb`�
�>-XR/Klw�7t� /��wߞ<~$=-%1!&2<d��դ�x,��37%XŠ����&�L:�N��ˑD��M�z8�J�J�)M�PZ�@PXD��
�S�gH��.�A�����R%Q�E�NZ
l1����h��gc�$�ү–��5.l�2���w�n�]&�eJ��[�����X.ǒ��T�Zk�L�f<HAu�Gƃ��@i���D�Ңe+W��@�6y����hs�Q�-}D�C�b<p�Q=�~S�
��$�K�db\���X�A����›�� ���{
f_ at Y�
%�Ҍ�ܜGskާ���
K���*�����������8���
���a�MEUZIU)>1eƱ�a	\�Zx�
9
�
��X*	H���^ND�����H�ĸ��MkV.[0{�$�����%Z�����^F��6S�C��(�F
AR
>o�!����S;ɕ�ڠqw���v���KΞ>�#����mK��pKNpI��������uI�KR�5��$"�H���o�u8��{�1���7�n��p�֬
+
��MHJI;�)N�0��S\��1@��^�TI
���|��֊�A�b��$�ڣ�b

�xn�<�M֭Z�a�ؒ���(n��ݸ�ڵ��JYS����6�x�g��
�d7�@i� %������F{�mIyE���d��f!�A;��A��қ7�$@��ŋ��y��D��Eu��X��a��h �T�/܇p�d����$K��ދ�zM�tw
�4t�
L<X
F�0�:Q,��t�����%@���%(�����N
u� �a#���>fͧ����Ty��K������iwIe��?
��I����+�B�O<q,#m���[@}���<ǻ �mm�����ѭKg��?m׶��ћ��'RI�5I;� 	y�?�h"XW�����*�|w�
��L��pD��|�����&��j�f���
�m���K�7���.q\���Ȥ���?j�!�5�Pu�u
��p��(YZ�HeP��`�r�����Ș��=i�G�	s�_�{-�\�vZTI%&J�|��P�����D,��5x6��J���Bh��жn��v��e���bXB�,��Q���K�-!E��aI)�P��C/6
D(�x��������E0

�x Fˍ՘tCI%dX�ٳgO������P��bImjj���ڳ*�
N�u���gNee��K�)�҂�3�L
�kokceaj�Ө�KL�Z�
+�(JJ�1(⫷��7?�	�s��\�*}}�,Q�[��e��_�W�N(/i�i'������A _d�
�-,h�ߊ��fN�8�y���@%3c�n]��Z�r��L�?�J��D�D�T->�L� %.5KrY"�#rCe�0���(�r��s٧��f
ػ{g\��p"��,�
�G���!�%�K
+0њkTϵh!�984ʤ���P�:��#�����f� ,;g	J� ��-�1���;���q�W	{Pc۩RI����2�e�
��/�dO%M���n���U)�TZp�Z?��
K*���%edZBS��$N��t�Fƃ�8
0�)����FD��HJ�/mN^����� q�
㡖�%#�g�&(�	LB$=}ZUU���d"\B_"�$ǒ�����T�A�-�l.�,
�d��{Ѽ��'y�9�
�k��
V�R{����Nh�=���%Њ%	JF ����m퇌�2���KV���NT	��d�9P�k7q	��
O�\�n*5p}^# ��5�����de
ܻ;!fk(-t/,t�!��Y��66�j�� nצ5)t��i��C%uPbL��
B&��ZuX�M�xY��n�v�xD7������<�yh��
�i�Q,yM�4a��1#�l7��ڒV
ꒁ��qbɉ-GkNvZZ��-EI�D��)e�^��bיY��0t�(gWw��\���u �m_��J�{ ���+We
~���H�4�P���d���#Xl5���� [�X��n^I�݇�
+�.��%Aha��
�\��⊙�.��(�ڨFִ���
+LBQ2��+?

�М�)� �
+
��MHLaF����m�0
%����dP�E(���B&�H����񁿈��(L/Q� ������
+U�$8�j��'���ށZ˽�diW\tD��u�|�.�����q� 
�/8�1���
[
+�K����R
������F�������f��#�7�I�g�[��& x�6I�.��bs�R=����5A�ib�����a,ݻUH-�������!����
�|1��u4W�B�S*}�L��J�*�P"C�2	n
+��ȃ�L���Ӵ�
۠�ݯ��./�#�{��Z~n΅���R����4y�xW�]�D���Vp���՜�&
����'B�1$��cL��ME	�di�o���#B�͝,p
+�
��� ���Y���]��W�:�i>�TI�8���F�d�"����VbI7�TeI*>�R6r�i-=
B���
����B�ׂS\}!2�qi�F���ǃBhEQ(���������Ș�D0Z���h˨��x��{���P=#	J5J"�� �***
�M &�`�pI’<6
T"�������U���p�ݢ�t��R�M��_._2֌)ǹ�

o�5���
K�K�i�9 �|�r(
r�4���s�ל�K}V�h�?�e�c����̋�1�d#Q�cWa2-D��QHc�0
#&;�%K�Ȓ%[d
c�$RR
+�i,�Ƙ�����u��}���n1�9�E׋���������CU)��R�ehr�JT��3�vZ�*I�9�Z�X"}�u��Ջ駎
޿{���+��0��������.�v��0�ֹ�F��R�㢒�{X{8��A��#@z��	����'��&WU,�Z���D���,
��K0�R&�ށ
�����>��N�쇐��uI�%,9Lr��qUu^�x�1M�������7��]a�[X��hc���eG�4��fæ�I{�:�v�܅�J8�=~�&���*����~���|2�f��L
�$,�Ym�UG�w�-��-�e넶�'��\�%ow��CKP��Bf��
Xd
Ց�"�������b�
&��@s�4�F����b�����@czURA�
%¤B�����������TS*	�\JL��̛׸,mݸd���f�L�
	��t��0h@�>�fݻHXj��ϛ�\�������/
8����i���6v�`����0y��؅?��z�B���>,,f�!�FuTb�8~+ǒ$�>O�����E��b�"‚|=�����knڭS{��F�M�4����
��'�T�x�T!�B���
aҳg%%%O��%�p�!�$]�1�*T��y.�B���d�����gO
?�"4
�RX�H_O7'GVq�L�.�=a�5�K���D&Ztu�S�}�a�S�H�Θ&�L���C���z���m���`��Ý�i�!�bE(��8�~����T�*U%�I�S�-e���,�
���U�[�X��
� �=)&��C۷k���uڢ�
K��%;���
+�5jAJ#k�Y
�S��U}��B+����.�M{J�s
+��4��e��%q<��Q%5��N���I�Hyy�����@��Xz���T�eI
+���<A�%�޾��5�̜S&F�
5�����a���~"�Z�RhL�8��Ta�DPOf��Mq�P�����������!ᑓbf~�`������~��
]�g^�I%

SI,!�ɼ
�J^��q&-5eoRb���Dž��;

b����i׎�۶22lF�ԀP	�\�T�ǩ$l<�
%"J�yIO�>��ĸ����~5��;���i)��ˁ+�q����gN
N��ذ� _/7g^q�fL���c\R��
�9ʦJ��[]���ȥ	L����
�0������-�� �䃩�O�͸�;�_�9��v�@I\
e�bK�C4I\����\'��A%��q��ӡ["��,r
���e,�{{���+eֶM+(ACY���i>eT
+�mnȃ�^��"Ai�%�������R�J:PbLz D����s
�q�~.�I�%K��Дߏ*�$:�Y
L�R���
+#o������EO��;;����X2i�ʈ$B����g�L�
��r4l�?��AS��P �:���f[DԔ��K��lؼ}�G�Z�H��R�R5TRИ�ڿ� �>q���
[6�^�d���'��>ؿO�
]�j׶U��͚6n�ߠ�^]��B���?E%��T	�	�\9)@��Ǐ�郟��0a�I��JzV�\r�pD��
+�ss�)�ΝI;v��KS'�6*����e`	*�_��T�h�q.��MZkND}��E�
m982�sXt���ԐImLp3Q�>�������?0d
/;�R���� ��S(��3�������E�-�R&��\x�"
\�<����
+��Y,im	
-��v���w��?�])c)<4����Չ`	�W�/۶F._��I_������ID��$0��jG�b�a0:9��h���3�h�hm�P�C��c�} �ݻ��ݽ{��\�Œ�,U��[V�<�,�߽cK��q�̝3i|xh�����0��
+QX	K-
Q�$.��N'
==�(hDFz��J�C

�ݽG���0y�,Xm�W�߸5i�8��
jUz���J�����cR�Y��_�,>�
q��e��Ϟ
=~�(/���6B�7�>*}*S�_�T�0T�����uN����'=!D***z�~(F0Q.Q]�j�k�,������ϰ�
��˾}��/�/�;�vN�R����q�G�yӊ�h�u	;�p�e��|}0a͑�#�Ś��W�	��gwƚNf�o&Jd����y��

+
1Q����J)G��<{��_a����Ӟ��S~X*�eِ�+C�E =�O�^�Ti�2����;Ehp;�k�vHK���#}<ݜ

lm�����dԒ;�:�z�U�UCڈRRFƭڴeA�����g5�-���ENh����8��q	��6�W�+/WmU�T�@�(� I�w�de݆���u�`�]* ]"G%c��o�n:B=c�I�T at e	�����)�vn۴au��E��̘���
+�/dҽ+lkc#I`�44�3��(��
+w��M��=��P����13�.X
�bm��0T�q�JE�*���T�JJ��X
3��MZ燒wm۸neܢy��M�
����h7h at _
�n�:h�y-�>��?
����%d!Raaa<�����rI�%�*j�%qw�¸�w�6\�K��'X��0nL,o�8��֨K�h�!�ZK%G[��
g�|_�����
ID2ɘ2	��+��yo�oH�
wq��

��8y/;�c'� ����sr�U\����F���[D�,r��nnK|.��Բ����2�O��M����)Q��a��^��ù�.I\2VDF�W$&�&��UCjIT�
�x@&����C�Ћ6��Nt<�G at N3�P:�
+F��4��Ѿ�*�y#B	.���Q�Cd 	���{���L��ܼ�K�%��+��U/KU&K7~��q�$h잤č�V-_�0v���a���2,�!X�L�Dt��	�%0�0�4T炣 �M@<�C�.�L9��ܼ�C�#��~;g����7lڶs_
+�ҕk7eU*�T���$�k�'Ņ�y9w2o\��q&-5eoR"��S�ƅ�z8����47�ک�Ik#C��M�7��ǩ�I-�>*)TI�RYY)�R1ARA�Cx��俀& ��%��+5�� ySJX��%
�
�)7

o�R|
�ҷ1�#��s�t	f^O�8�%���8�X��qU�ȿK at b=g���,���
�m/ڵj�1����1j5jq at dvD�q@�#
+�$ 
+
+N�
�ш�A#**Ȍ(�́�5[�����~߷�?��b���
��Nj�������L@L2�dfn1ޒw����EK��׬��
e.A�,A)'�TY�^�Ǣ��m��'��
��(��8b���P �������(�7��
���ZYiqAnvֵ+_�?-b)"4����mɢ�RfcYf����K�`�Ȕ��
���$ �ND&��H
�'Osr&yp�fD(���%@�
A�BI�����E�z@��Ē����Ҥm���*
���ݧSVVd��.�\�cIȭ3cI�RB6�Xb�!�ҥs�i�ɇ��DE�n����u6��x���n:ؘX�_{�f�
+�G�u�����!C?iFP���:g�¥0R7z�m�ܵ'.!��@���i��c��r���yY�O\��T"l V=�WR ?���'R���Fo�:_ u�`mia6b�`����1��?����J�6�Ԓ�*��O�$�V�m��6!�����$�ߏ�] *��/�����QS+4����x�RdXp���h�Xq�.|.M
?V�%���Z񚃛W�7
�
�#|ڳ�$��D$�0�wT
��Ÿ	�m
��@�/]�����/�n�
��u�R!�:��FK
+�T��r�<��mo��X$R
S���
�\��r�EcI��d��Z
�K�w"�|�<�z�X�x������l�"���s.1��-OL�L~z�Qqy`��-g
%���a���\
<�	J{P��y��E�
���Y�"�ò�Q1n#�
=lkmnjl����&$ݿWZz�Ni�� �����KMͭm�s����(g��X�ᐝ�y�"��#I��v�
	��YX�Xr�X2�x�p�D 
+�?x�q�@av�,zʮ
��+hol��2��� Pr��p���Z���ۣb
JNMK�v3'����R�z*�P���7�D|�H�6l����쬫��ӎ&��F��m�\���<�)vT�CM����� ��[ݨλ���RQ)Q���T�'y�R�D���L$56644h4�OCc�6�ĥgϔV�X"
+���A��

DZt*-5�

����cŲ�
��qv"����
eƸ4ؘJN�9�Z����N~���+ 	kn]3b����L��mcCi�l�O��\�n�&���^v�
	J�u�F�䢣�{Lj(	L�ِ041Y�TԺ��{^o��<�^v�Bh0�;��2�\:�$b)n/`i[��Ϧ
�V�\�י�%�	�,d\�P
���%&D�::Q���Ĥ1�P���Ǐ�t������E�}��$B�]����Ru0	�t�����Oqq�] p����^�Xµ��g�lW��ޱ����c	,�R�=���/AN
KI�ۻkGX������+�-�Ok�
"S�k�y��Ufv�v���otU��N��?�r��
J6�H����`��㟃�efe���s���
���J�̿�2� �_\
�m���?fGX���:���Ξ1��j�����X��:�>�}�~6��/Y�FT��Az��_?���LB$i4���uuu�/����\R������XQ�j��̱� 4
�
�\���cw�'�Ɗ[��Ҵ����K��0	d���lz�����{aɱ�#"aω3�d���#FQ�YZ���m�]��z���}��m߹�.��g'��ɖRB	�#v�
�+����>(q_�p �F&
0e�8���t@��P鿺�&��j�ɋ�,�ZJ ,Em����u�ݗK�v��	8q9������&$�lB [...]
ܢ1�1�!&��X��z�d!d ��7�7|���Sf̚PZ�P�
���{o|b
+l��_^�/.��
�3�T�
�G�_

n�|�0|���3'�
>�m��g�Z��
]��;�L
;z��!�~�w����y[�~�E�_�J�
��8�����kcPj� �jkkk����LЀ���c�scI��p���n�RÉXʸp�ԉc)I�م��~���R�K�gN��H
Ǹ�%�J�9�9(:�ttz)��:��jn
�75��$k;���f�r��C��ekp�����q���b�IP*��lB��~�D~�CRoX@��ai’0�,�l��l�gR�>��?�Bk����ᄸ}1Q�a�[�l��K��\r���d9
��{i�)m\L��MH��}l ��$��If��&XY�BPN�\\�/Z����i�4�^�hU����?PR���O������
�TX����{�Nn^^~q��Ae��%|Qt�(��Ñ�A>��qƖ�+�퐕y���S`
`x 
�~
K
\]p��B"8�8��5�_Yb��N�@
+La(���2a������%7�5�^��a0R�m�t��͜<x�(m�涎�RTR�Cx�c���-�Ϲ��q��I�{�#B��7�fm�`mia6b��A���c����/�D*���J�)*��ī��1	�T]]E���T�\�,}�˱�ΰ�U��p�����$
:�����V�K�N�q�6�%�o6���cd"4����E�½b�ːI$
�7\��F�23gL���<�[J(�~�!��1���
=New���z%���C���?#Jl(�����€����%�F��}*�KJ����j*�X:����É��b�#�C��6���r��kgm%pIY?�L��22))�*y�A�I1&��CP3�PZ�F.	�<'�RN~,�J\�%�E��:&}P��՝
�c���ʊ���$ RNv�m:��9wr�Kwa.U���O�yU:�M�
/Ē���%�Riq��[ׯf\8s�#IA"B�X��hg��H��N�	b�c�2�ۗG at w����v�=(��y
J>� [...]
+:��@��+@�ғ��_fAU�go{��f:�N�&&&&5�5.���h\Pq�%�(
+⊢b4�KШ(("
+��z�/�E<�
@"�T1��1ic�>������d&S/�.2r�s������ǒ�ʵ4>�;�X*��LOI�;y"������~��|H�>�9�:����!��0�pU��谸��p\Tu���
�׎�#j9�>�H]	I�$n:�Ic�M��aK]G|�΀���!�Ǣb��lB韶�
(=�%Z
�:����M����67���.�X�H��S�Bk��,遥ب�����;�nZ�/g��:�e�󸱣G
+.�GdB�$0�c�QdRffOǎ�vЎ��ݤ�
�F��$5w�B��U�x

+	�s"(�+PjeQa(=y<آ���(]��To��2���JK�
����¢"������t�Z��3#�e��'Pe��W�(�&���2L<}ZR|4R	ڷ[��
,�4vԈ�K}�K�,��E
5�ٙW'Г`Q9�iMh�7Ci�6���P쁄d]&.�t���|�
+��6q
�E�T*� �Q���V�p-԰� [�y�m�W.������<v�p��}zv�����;�V�ү_P�����*Jm�}2���

��uuu&�Q_�pAp�u	h�%鐬&�K�4���h�Q��Q������������°���6�[�R�w�dg�%*���Y� ��*�M�&T
���C�# �Ĩ�d$����s@M�0i*�o!J��|B|���B�FF�&$�ed�)Pj���)H�������~T�N���%���QX�
�Q���V���G=v�[*iR�n�{������%����<z���ݻ�mްn�JEq�M�4-�\rT"�Q��&Ƒ�n
U'���T/Nj3�1N�'N�*��2�����`��%+��3
l!Ac*"*����U���
E���yx��

+�
�R��J蒊%�0mꄱ\�'��G�r#���J�PW��.%�MM���
;|PŒ��9XwS&Np��0�Qp��⯂Lj�ɀ"�c�!1i�P��'O�$���^����k�t�����4}N���olj�?��v_�J��x�_X��2��Y���2�k�g�
yY�����Ѓ{wmٰ�w�B��Ǐ1t�C�
�����������OT�\�ү^P鹡�F���λ}����t�� ����S[
4�7P�.]�λ�
�o��l�n�p_�X2�X��HMJ����}˧�K��̛�>�u�7��%7đַ
+&����t8/:0z:I���7�?�����ԋ�D��M7z,�DU�6�{�%t
�����D
��;���k�S�dJ�y=͡Ģ$3	�{[��X��f�c�I%[�$��8y�rK�*�r�Sq�Ǐ
9|p��϶
�]���s
Jp�T� |�
�"2�Ĥ�ԤUg���fQ��� �V0�y��tW��
�
�xX���m�x��=��F9��>K����C�z\�C�LTDGRT�O��TW[}
�tL�rss������/ ���0�L,I�C��X�f/�,�[s������%�yY�)�b��i��Hh)L�.�(p�/������D�#g���8b�p���T��y
-Y�'��?(������o(�
�o�H���m�����>���*�I
��e��M����\}Zb���Á{vl�d�r�9\�����uy��^}�/��K�P�7/��P��E	U���{����iB�I�5��U⩮���KԀ�W���`��w�]��f���Ls,���2�hy���<`�ҚU+��p�a{
_E%G�[��Ts8-�-
��ʎ���#���N
G�'�7�H��Hr
�CS����>w>�o���m;w� ;v�d\b�N��_���M���ߎ4>J�-�_%i,�^��%���h�c�L.p(-K�Qnm,Kl���Q�K+X��RNfzJb��a��?�*���l���5\��
(2JL��
����,���U�
+�o��DRZ0i��4�Y�s�(���߸e�g{�񀜲9�slJM���S
�nNv�$��A� %#�R��0?/';+S��gd���Y �T
]����
�A��<]��~2Yb}�\�LKqAn&9�K��/��D\�M��;����<x'(Yȏ�A7	IBT�I�Ǝ��gO�I��A�Rxdt\"��WTr�ˆ7����u�P�B��Eg�7���k�*�p�G��ؾqݪe��g��8;}4\�y�Ν^{�e*�~��w(sM������JV?fZ�_S�Qϴ^�)}��POL�:o4���h<2�.4�.)XR/ZӼ�m�o��϶���R%c)��7U\Hp�^�%���q^�
�Dɍ�W�`r�Ʉ��C����,�+�
Fû��� �����n�`�·�7�Ҟ}��GF�`�g�(e'��%��%M�}o�[�R�˪��_y.T�[�"�'�R���-�
Ӫ�+.���u,<4�w���
���p�
�
R�DON��P��
������#��’
t
<t���˴�P��^"(��΀��A!a'N�c<�9U�C���@�'��
�� C�
+�c�RQ����Hץѣӥg賲s�
�K��Q�zC��|L�%|
�)�ȅn	]]^�T�䄘GIXZ�jŒE
H`�C�ƛ�koq>�Y��@�`�Ĥ1N J3f�{��/�]�a�vJ)�Y,��j9�����?�C��x�ߠ*o��1�-3�g��"B�ݵu�Z�%^
Ϙ2a��a����|�]m�w�2A�_�J-����/��-r�R���t��B<��� ��S]�Y
sٖ�7�㓱�Ȫz�+Û��`�>�s�;5y4�K�q���%W��D&\Z�{�B&Qth:��D��>�Ј�
	'�DB�
LHA��I3f2��|�,_��=DiD)�xlBrZFVn���
�
A	ew�Jګ��j$`+P�/A	���4_T��~h+��[���ԳBҾ׶���~V*Yc�K/�����\(nRBlt��#��g��z/�7ם�4Ir\��%�zH�qd�����6�@�j!	�(	�`Jq�j���ǔ�`(%(�ZB�_����l�N
[��9�����
+��!J`RFzZjJrrRRRrrJj�\��+(*);S��ѐ=ܽ''��O6�d�1����F��%���R�!?G�&�$li�z?ߥ>^B�\&9���2
��L�p͟��1q�T*��2�TR�Lf�KԸ�
+j�4�
q�5�ˈ �⾠�� � K�4��(KC
�@w
+��n�T\�2�IF+3ɜ�������B3S��j�?���|�y���WM	-H񗪁SgQ����E	=uM�����;#�
(e��:S^U�G��A/+��

�C��j��'�
oz���
++���K����E�޺1����˧M�8n��!�>��w���7^��o^�#͜�\��Tz�$��Y���!2 ���|��V_�So��

Mԗ���]�`鱊%���K,ɶ�	,575؀%�ťj�{��Ҽ9���(}��a��*dFGۅ��s
��%xD+�Db���=e��4�t�s�K&�

ߤ��
cnaqIiE�doԘ�g(�\��
�J�9+�(�]l�a��Q��4ig,�t���Ǻ��H�;*�aɅ�nX� ,��[T����l㆐�5pAp	}I鸟N��,1V(Fh*�
�(�(:�� ��H�D��J�b&-^�b5	��{/l1�X�.<���tP"���
+�
��7N8�#�d�
� ���
+
��rshrs��
O�>��d��*��s�ͩ�-Knϡ�A�{�Kx$<
+
fD�',
',�ٱuSXH
+,�Ҽ���	.ykc�0-\5pJ0A(�ٌ�̜�MY�x���m�"���P*>S^Ym�w J��\�.L
�)��PI�!�*�M��񢷮�=[�
�Օ�d�)�cc����z������>�&�
9l�G��ݷ�OT���J/.�Ԫ���Pp�=Pji>��`�j�V��b�Zk���KT���c�[2�K�{�������l"y��3ҒE]ڽ�=Nr	;�&��"��^yM/Ʉ�b6��
!>
�%��\���a�G
$��	U$��τ�a�$�ևmڂ�-�RR�!+�8����7^��I�s�R��[{q�ҵ.p.��_x8*46�.��H�/��_���S�Ճ=e	d�ʴ� 
�K�
W�lkDxhp��Ksg
ɦ)Y��p�(�b�d�RR*%;@+�
+���D�J͓L�)���p(6�8���N�p{���g��A �\�����
Mu�V�M����
+��r��YY��,cvN.q	u�$
�.Ε.H��C��Z��6�SOe�����l
K5�R��̴d`)&j�N(������ ]
��n�N
1����В&h�*	@E	� =u����c(�U����	���_�7�VV��@I�Z�>�G��y���f=Wq�8�h8�pV
�rɂ�~ӧz�=b���;��7��������媙���
H%gU���ՉH����DL��T����lx`�E�L�_����=b�?�’�����Μ:�K�DE��)\�&7k&�7��g��L&�&fY
�c�a��'|;�p��(�0�H�s�$2:�$8��/�*Lڼm'�ogQ� n2��b�.���(f��Pz�
+��8���P���
+
�4Q��D?���D]}n*y����ı����G�5�4;x`_��[6���e.-��"�/����D&�(���)JA*��h5<L�$M��ЪL
+�)�P2<df�*��!�oJ�HՍN����v��<�
庶8�(N����2�
CZ�����i��P�K�gZ�;:��pk.qB#]G�ڮvv�Ql�K9���#1���]�Z�v
E��NƄq2'�,�pO��IjQ]�|g��}чb�RҍJ�:@��
y�&���V��UI��_!\���z�'//9����w(j�֍!d�sfΘ6�kܨ�C����y���_R��K���@%y��X�x��
+%[}������\Ec6�#0�����Xz�x�&���%68��]�t�"�e�kaq�gO�.�$
�;r0:
+���\&��$��;�mn2�
�ָ�du�/�
�H
�o|9��<R���A�DF���`��+V1�`u;v���D*{
p�[��
���+(�t(�[�甤@���ڪ�W��
+
55�
+6�$��� �����J�cI\<`ks
�+��Lԥ�}{vnۼ)l=��j��ŋH��Y3��,�)+Fn�g�I&5c�H�1�j
��3<PK�!�B�`�ɤ��b�"TzV��

��R�T��v�@
�;|m��LUT��c�L7���$Ӥ���3�9yE�$��B�_�vC��R!z*K���R�0T۴XB�ER��
AP�V,�Br�����,��.R��y] ��(�s9Pz

G&��>z,)UB�(1}�5o�5u��X�~t����eU"#������d��6�����
��ٻssغ�������<a�'�����}{��o��Z�����^�f���Tz1��o
����Ƿn�c(��Z���J��c2UV���X`�,)˭z����;,1�3\��-,���q����qĥ�֯�&�@���7��#��NG�<��C��?ƳǑ�9����DF���N

+&	���-��Ii+u����+*~���+�$��҂�`���$�$�EYz�F��E�g�R'ߛ{�v
�47f?\Pp)h�*��E
����*�Pl�TL�L
�����[	��Ԓ`���.Y�Ra��]�Qњ���P�
T)U�<B�-Q��^�~Pc;�^M=io�De�S at i���LOKM>��x�&1�DrjZzf��?`����%~��.K*"݋c���T��eHIJ8z�@��B�h��K�_�E�Q����sƫ��=u��KQ]KEi�v�Ԙ#q��<�)�T�2�~�\P�UɅ��U�.U%6r���Lq��p"�p���A+�,����T��cF
V>�����~}_�~�K���*���
A%u��ߕU��P�Z��U��򲲲�R�Q^a�d.�.5]h�6���K��l��X�N�%
(q�Meg(zggR����\"��´T���فX,?�9�&,Y���6l"-�
��/�aq�/29��$|�[����BB�6QOb�;���L����ly%�F��B�g��. [...]
+����k"���M%=����`�n��F{��L�%W\�`��R�F���%>d�+F�	ͤT^,����H �D���Z&mپkϾ胇I�����|2�
+Mx���ȓN�7�
J�!�Z
ܸ�y�*�%�S����c	��qqq��	���S
F�dK-mҰE��,�覍���	�\�bQ$�J�
r�H
+[#¡ǚ��%���0թ������`!I�Ų�nDQ�����r
����䳉u2�L.G'N��;131�4i�d�V�zi����_���E�(���˲�.,��"1""[M�m��I�i���}��=�B�?�~��t�����=v*����Q��yN
�y��i�S	w.�ҕ˃�z�;ښ�vK��DAnfjbLDXȖ�-Y4�ݷ�͝3{���gL��F�$�rW�OP闢��{��{�P���! �+��# ��P�4�;��j����Vmw�K�M-4�T,�M�ʆ�KܻU,�V�$"��:gk�%�Β���!�{�KQr!4�֯[Ë�χb�I�	I��B���~�?~~�pD��[�1���� �f�no�d�����Id]s
+x��LK�y8Ε+w<㞡�4'�u���B]}�Z�)�J��!���U��M�&��}:�%.���P'.ϥcGs���S.�Q%
R��2ńd��<,W�Ţ<�T��u�7�Ra��b�R���P��&��Q;�<���h��{@"R8!��6ܡT��&�d��HO�����Y��
�W���1�ܯ��%������(�M} ih��
�T_�O��Q�
�������	,�V
���KIr��W�j
%�v*���!߰W at I����q�q���6�����
���l穖�Z[���8�\���M������w�|�W^z�瞝6��'��)�zd��r��&���P��U�@Z)�Tx�,J�jk��RI�b����%JA����w��(?û��G#a����(��:s������7
���.%'��DE��ݳ�����A��9"�r�&�
���̟���0�h��`H����|��z�e@��I�t��u`�.-� �UU�Pji?��8��71J؍
+i�&�Uh���JC�����k�ͦ)
+Kg���h��^�l��I������2q	�<q���E,
���LOM��#����W�L&7�T�\g��j� ���|�g�$�F��~�$��y�}�Z]S�@_�(Љ/ht��J?hK
����ʵLJ��G@��t}jj
+��4}z�ùG
��TB������'/��;ޱ�O�
}?.Gk�d�VV�3�eg�1�b��~5!P�WY�{H
y���be�J&a��%�Ҹ���T	�@�����}*
�t��D1~W�q�݁
wT�JO
�;���7t�5>K/x��߽��˜�Ӟy�	$���OP���]�0e�?���\u�⨶UY*ͦ
+:&���.���q
+�c���Ē��!�%ټ��`'$�%k%g
�g.��>�C� �
+�ൈ9&�/������/Z�����?`
������
��"�fRLl|�.Y������l��ky(u�D�(}�a���%e�2���h(55�9kh����=��^#���-��3mԸ���F��w�X��χK���5Q23�t��A�,Tw���T���R�� �b"�T7�A�J�1���
=v\
+EC	��̰�0�N#C�q|7�>����\�Ā]�u(3=-E���H')Y�����-b��X��z�L7R��c閻t?��X�5��K.,9
�
�1��y��
!5�y�*5AՂ���_�S�P�Yv2��c��޲s�R'0��P	���pcR�D�&�[f�HS���ݚ E^�����]�[k�+���9�)	1�{B6�#���ּ�sfϚ����$��I�r5�'��P	߲�J#�����SI-VTv�%���TQn4����&p	1X� }��l�|jl�Ƈ%��ݤ�1�xd���\�#.q��`��`ھu3b���9��GI��#-]���C�#��^�#_R )x�
�DAG3���rDa����S�*���n�a���Ag7(!�{:;h3�;k
4^QLJO���@Xc�e}��4�qRi��t[���렉[V�pV����H�]��puЪ�� �&�b��5�g)i�����U��)��A�J%3�h��(.5B(�X�n:�<��a�:i/�m*�:
���\O��f�JJ`RrbB|\,���T
}U
�&�k�Z)��.���D�����4�~�F��=��z���
N(b2҃��
΢��\�#�+�!�C=AՂ�e�r�_V�YLHڶ#T(����%کv�R�JJR�Q�é��J����
\8�o����ʊ
+�d����ڶqm�߲���7�x핗^|���N���?��5�'���Q�/���;8�F����Tj�^�yb1�I�C	��PZf\�v��&�t�SM���F�boXB��F�Y���
u�v[��\B�������)_�lG�m�fZ���n%%
���냴���r�J8؋xD@"�mظi���;v��&$�LJLN�gd���8ꪪ
|r(�΃������$cn��(�7 at L���E5���\Ye���z\@�}&�t����R�ް䚸���{N��u5v��T^ZrRp�:Al\u�-��L��H1��P���Z�TD$!#I*Ei/�d0V���f�\��*��ӿ��42��A���/��uuP�ۭJ�$�z0)>�`LtNttL,j�.-
�X�=a�mhn��x�xW�>�X�Ē�oH���y[,8w,uR׬À5˹�K=!\��5�a�xh!��?���FB�N�ߠ ދ�j>%��j�Nmm�ԥk�R=�4<)�Bɣ	ȩ�KSɉ7�(��JM<�
_
�t�?����_}�7
��<��|��G&�$�(h�J�_a�\�����VŁb� �J��N�)*.1��`�ں��S
X�
�-���]n+��
qWD��\��������r4�0��!��, [...]
+���V���f�='�Rpp��4�y`��W�T�K��w�=�6-M�qV�K�'
+��R|,�������B�@��kT
�ZH!��
=FC��L��v*U�>-��<F�p�x��ON%����8b\���M�V�s��~��9�g�|n��2�'?���4(�����N��f
�Im�8�$��i�N�i3m��=�4=�6�4���D�eE9PYA�s��A at .AAAA�A�(ފ�hԘ�Xu�|����vQ�i|����j������|g��MM>C���JJ<�!U�a{��ma(Uy*���2z��&piK�ܻKg��z������t,�g�+g��3�%�8�KRry<�֢��W��e�f
+	梳PՑ�/Y�x�"z���o�b4
���[.5g�A�ITt<���\n�b}��]ݽ���P�s#
�ѽ���%��mb@���~gM������x*<
hB
�hn��A�Mc�]�m��9��>�ys�T�o,Al|&]�x�\�zdX���Q �J�Ɖ���$3�G�*wby����TRNfR�z)�y0r���~�
��wOOgG[KC�@)���8�`��
e�G��
+� �ܞ꺆�m
]=}Ch�┠�K^X�c�
����&��%��C���M��%�r�v��	
F��u=8Nc1�Ah�&Dځ��$��((��Z�Ќ��N5���B���7�T�����T�SiCZ�j{؊����~�ګ//D�?�姟|b��y�Ν3[/r��
���'I%�x\7��Q��0��KJ�)w�\�Rz�.���N�
z�
,���`=�HDAu,ݾ/,�g�c2���s�x.��륎#.I7WW��1��rtWR"]�)L�D��
eG'fy�6�m��(8������e�V�Nf�����
L��
��t
}y�7���Jw���P����]�Pڏ�J@��FC���f�h����.�4�4K���Mc����6
Ქ٦�J^XR��3�L\l����r��
��]��:�_b�L$*�*d��PDeעJI3-iz�0��#���y��i��|����uT�8�u�$�ø����m-�uՕngQ^v����$���x"���$3��Jݕ5��[���E��X�n;%�R�û'�,��B�`�N{?,Ds�V�+š4��cd���@� �((�$p&+�J]j��P������;��JW�wo=��_�Yp#���D%��{綖�͘Jק$�F�.}��7��_�����7���g��l
��l�J�ȹ�?5C��R�P�(0~QܜBf��Tjn �*�e�Ғ�"z��KJ]���
t�;w�xai\aI~r�
K抻xs�����K��+/s�h`J_���`�&\�WHppP�
=���?�O#T\��j5j.)=�!	3IP�Lj73IJJ��JW
(�r�8��H�/�.s9��R��E��+:���
c���{
�,���X�ύ�{����&.��*H�Ȋ
+40�%@&�����
+-��RY�kY�Q�#$郶�_�0��~��<�
?q
+�8vi|œ&��]-/����vh�
�?ؿ{׎�[�k ����i�k�I�\�!��1��
�R~���j�����={��)F���}���n���’�-�P�aiTLa�@_/��'T�KE�
&�;�|d|�`��
B�,���L���`(���/r��>�w?ɉ��u5��k]ЧR�n*��
+gaN�ڤ�� ے��叿���~��~��/<�엞����g�ǙJ����CD%?��
���h*���d������˔
q
+����f,!�ɰt���~L&�;�
�%�C�\��PY�-G`��B��eq�Mt\�TuQ�(��0zB����FD�y	����$9@�u��9�2.:�0��m���ſy(�>{]�	�T�d�
�4���
�H`�X���b�gz�$��6�����GGF%
S�M��c���=�&��K�9�<�B��=�#1�L%�Q�
+�;$0�R9�, I�*)fRo��Ac(��L

JJ���ک ���v�lom��\U���H����
]��C�^hxdtl
����_��T�������7�􎍊Sx/���g	�K7-X�ȑ�)
Q���Z�\r!�
�����V^�
�B@��1��Y
+�R���	�n�cS��]�[�}�����Tr��g�OI\�r�?������?^�ҋ��|����
�;g�#�SS�(�*��t�~��B
�x�~��
�

�Dj�P*��������˗�����iXz���
����?Ю�~�t�Kző�)�&ѓ�3q����j9ZLtXY� �Z��!l��Z����n~��18.�J�.,�N
D����/P��d0I�:�om(�����~�]g)��@�.���%R�&�\]��B�HB	σ�����X2���駒���w��'�����Y�|
,&v�t�Ĩg���U
����QI�Ak0��ұ�>�p���ڌ�B�i�^��Q��>*�����-�7U���3ק:W��#�B�V.��l�e�+�B�"쌥�̜��2Ou]���;v�����=~��Y-��
��/�&�5�b鼎%:"�PD�����$0bg�
d�O�v/�r/����V�	�T( ؛rVV
J���k�~r(�-ZT@,Z�R�e*9�Ã��T���_�����?��g���k���**}Ơ���g��IS�W=�2�V���M
�\����de�����gjB��C�Kק�%�yks���S'��L\���}K˕9qXL&8���+i
�WBB|<ݘ��? F�8G��
)�������CE���㝤W��o"1w�Jro%����PsV(�mm�B��Q�PIB
�\�S
��j����z��>�x�T��&����ٸdFs	-.
�5�$�Im�
��ȌQQ�����s� I<�,L���UP��r���kq�����s
��RA���:&*|e�@[�ҥ�гti�-pEphxTL\brZ����RweM}Sk{g�
��ѓgPo8g�o�A{a����b銆%��� ��㽄��O�ؙ�PO�܋Ü����q ���	�N���t�JԃJ�Lo]�j����^S)=5qU�������_{����/<�,M�����sP�&�J3Tz�Du���p�g�JG����
�T��,w��Cefdlذ!##�����EZ�
�`�(
]�tejXҮI��*W����8:)�%.9�*ط��
����J_��B�х%;�IR�MJIIMMK[+<��s��H�2wV�
����ԯ��
���mJ������@IZN�����C:�Z���i�20��H�4Gp��,:�Ŷ�>N!��L�J���.�gFs��ٹ�K�ƭ��T�a� ��K
�IhH�����i��"$�V1���D��O���(�~ (ɲ��� �> [...]
�KЄ<� �*v�E����� ���@XA[A�`��M
%�u�S��+��y��o��+Si�&P��J��1��ܜQ�o��5L�W���
h��6���uk�<5{*�Pi�Q���D�Ez�kk��*)���L3���.��Lj�"����WP\Z�X���,Y� y��+�@,}�`I���\�=);N�Row'JW�����pY��M|]��|z��a����&<""R�K��d��H��#$�WB�qgh���
�I#�c׮߀ �
J���(Y�z(�B��!��9�xƒ�Lc�����f
��jm�T����
�w	]f<qa�Ap�zТDv����ɔF�������3
S�����Y!*�g	I(D̤Z���I��!-�)U�甇�B�󚖇i�6�~<�����X[u�����fH��Pz��#��{y���quuqqu�������#o�X���K2f���U�6���%
��oSw�
I��sE��4�����Ϊ�%��Er�4���$�� Ď���,8
�@�K�>8�
+�I
B
+0�����;��d�P���@��J4�Ӿ�v��6��1��
�pٹ������?�ɏ~��w��o</[|͓��x|�-��=�B�eC%t!~��9���KS}uEi1M�TCb|LTl�p�pp	]hL���հ�#�z}��胻s`i�oO�%�y�*�
�C���%�na�`*-��c2e1�p\ɢ���x[���O
��ظ�x��)�N�L#�z��T[�3����2i|����0iZt�*��I�J�Ã�P����HM!&EGED���+EQRV	ٶt��_�<t���
tTz�8*����'�����d;�\��w��j�+	L�%��Ē��(2�ᨴ�dT�l-��*�I͜T��$u�N
�e_
%��=����pZ������S(
}��?��������
��nW7w���K'������,sAɹ��&KGO�E�;i|��X�W4o*s`�C1`��%�K�Є�r
�b��q�2

+C<"��L��VP�1I
�Qz������޾��/JJ[M�[�Co��ӞNK��T:*���7~���^��+(�o���=���/�[���cv��
+����nO����a|��la
�RJA)�LHpP```PPpșPp)6!)e��/0����9-
K�1٘7}0
���t��(9L�	&
jN��,ф��y�O�;z�C�%�p]8/Yr�r��9�$�\e5#���f5�-����n�uʹ�g��[��U(��d�
b��X`Q�%cz�%�����GT#=��?�K����dK3'�
̥[7a�T�ĥ��Dd�Ԅ
&�&�ivb�Ȍ���
�Y�<䋨��h&�QR�Ĥ+�I7��8'm�~�D(���mU�~l&�+��NOI��

�#(�y�������];w89:::9����g�羃G�~�'|B"bR�M�E�5
�m]��GPp7q�r��4��K�ꀽ��%x�@s	��4���|�,��&%
�C�a`}c)�8\
YA
3��F��P"Qŝ�3y�D(Ɂz�#��Ih��T:[h���'��+��^���J/b*}�����T-�B��M%�3䃩�����P[YVR`6��b	J����~~~��A�g�P��I��
�y�pM��;��Ҍ�S�zQ:.)%��
�F�L��\s�L��&�.�Wf�
�}�{��i(��
T
�(GR		#	G&����3I4�dU�m
�Ԯ[���%n9��J��	BrB\td8B�4N"ѐ
+A(�k�6��w�j��ᆞJ�^<��h5�9&�*��27'�m���:�%��K2�NLd&�J�*G�J���Q
Zn�
�x'�ZщuQ���a�PR�q����wSSYk�0&�E���e�N��۶ҳm�#�����X:v�t`hdl�1#;�������}�V���)z|�X� Ea�_/K.�&��0���db6N����� N`��gPNG3�����t	��U
���%�*M�ﲺ��T����T�K�3͘J[0�~��J_�Si5��B�Y��B��A�i�J�:ۚ�k�|�9�i�ĸ舰�� �Ӿ>>>����������X���X���sI�7q�K��ELJ�5���*��&j:��
��Í���C�i�r�8/ܗ�
+�
��F�$��$4��U�Ij�-���C��M�����Pʠ�*!�@� C	����OⱄR��}Q���Pi��%Ƒ͟�-�KW���(�YL�5�U6���r81��H
+QiYjY)Q�䠵a:CI2����av9>���R�$s}���U�J
+r2S��‚�}��(�����
&mݲy���æM��nsܱ˅���Q�S~AaQqɩY悒��z\���+ã�q\4>���'�͛�
,=P,�nǞ04�
���H���)bW��#�G��� G����+�c&
� h(M�@;�����wb3Pu
+�}Z~���iL�	��J��T���/�@
�a���^�v�Sr*=f*�Pi�P��V�c����DA�
+���1�ag��|}N�<y��ɓ�||���
���R��R{aihdLb�û�3|�,���X
�l.]�r���謨尘D��s�1�������v�w6�'?�h���}��D"�nni��1� ߘI���td�\u�����u6�aJ�fA�l�H��D��I�)�
Dt,���"�P߬��B�{K��<
�L�%{sI֠¥��<���.\�q��82��Є�U�&�g%��AKI�阤��h�G��8�٩
�WwGkS]�cV�!!:<D�����ǭ[69l��G<��y�v�]��x�;,
��	�N0��r�J+jZ��v��)�LAXR������5�
��"ŮZ;�����,ԧ��<�
���
+�I#�o<T���_�Ҡ�/��׭W�[o��,-�3�%�T��~���O����
+�
M��
����O<�j�2�V��L���gv��>���ڐ�
�g�JOI��BJ�N
��>v�����_f1Q�g�h�^4mz�4M�699�IڤmҤm*G�UA\�Zm=�zD�`�`X�}�UEqA�]@�zP���gq�
l�������730h�ڄ�
+��?�<����Ki�YK�K����^h�
K�JX�����d{.G�\�A.ݞ����DR��	b��d�A�"Q����)>@o5��c<�)G�Ds�"��$��$�3�G
���l�g�26P��
+�N2(��h�0!�h?��~����c���#�'N����r�T��K��A�9Z)�U,q��3�>'\�~�AH$�`‘���$��J&�1�U��Ju^!�e2hǙR�LR�ׁKG
��T�;S�H<B���~�����E�٦��NJ��cۖ��{�����Z�
\ڲu;�RHx�>!9=�����
���
]}���M��gX��Xz�p,=���;i�ޙ�͹
b�N�p�Z�~
!��V��H���:e�7�P����f��+�g�.��4h̪���r+Siْ?������'?VM��X��"��**��L��ы�����~?da~NFZJb�A��������bb
��$9�:�F�N$�
Kb�3�
!��`�`�d�9��w��Ƭ���Aމ�� ሽH�!�X�����H� >�`��Y7?�h�
 �R��(-*�z J��D�~oLN�zP\VU�p���i����!�Qi�|V�e�%��+riZ�ltD�6C��;ɵj���F� I׮�J�B=P
e/��B�@�vv0
�ǁ���gZ����T䤧%(mߺeӆuk=׬�pww��X���~�`��

��
�Ԍ\si%H�
s����Ihw !����'���6����OV�0:��!b�h:ä Z��~
)
+
"i�Jp��gҧ��*u�
��,[����&w�
||m���@/y�#k+K�9��|*m�S	�7�~��wĩD3��TZ��[I%Ii�s^VzjR�!6Z��jõڈH]t�!!1Ŕ�M�T���8b�F�u,ٲ��r/�s�g��KӬ}S0�(Ȅ�w{aց��0���O�`.�8��:�i�!i�"iRH:1��mG։���6���Pj$P*���4�&�
�1:Z�h=HNCJ+k����:�~�w 
�T����J�7˱�c�� �A�ϕ�)�Q)�%N�UW�T
d$�A
J���J�
%���E�P����Q�r%�܌T�!:B�G��q�ZO@��������pi�:��=~A����Ĵ���2ػG����=CWǮ}|���o��� K�܁
Dj!^@
�&ע��I
��2.X+pB+ �Md�c��`�?C����ȳO��&�W��}���j�G��۽S�J����E*��P	�F��t���69x��
Z_fZ�1.6:*B�фj4a��H]���a^aI9��yKS�h
���%9�d.QW��$��Y
���	��
�
�;wME>�_u��.v��8�"]S �'��Ib��J/��(�R�RmuEIa~v�	'+0	�A8iQ��
d暋�y�u� �ƀJS�E��Z
$�J
K�&.���Uw�K*Ÿd�R�Z�(��J=hI&.p�Z(�����`���B	�����7�V��f�%��PZ�����yժ�p��]�<�x�۰y���������dSvAq4�&�w�qf>��K��#���
��tb���\�\���jp1d-M�{�TЀ��mQ��,L�P��S��#�S�7�>;���p���t�o;�|��@A�)).Z���&�J�t*��r*}�����+�J���ܚ �

p�k�ʊ��S�� �pMhH0^H���s))5=+Ϭ�ҥaK,=�Xz� ,�*���T���
s$稹�]u�u�0��L>�7�����C�ј�@��t6�d�P�P�V��֡T^R���� ^L҆c9 � "�� c������H�ɶ�=��h��oS�
+�*�X&�U.)�%�ek�ɤ�bZ��Z
�4��
ޘI����x�]����;�3��ʊ�LI�1�a���� J�7x{�vwu^���i9�ӊ�ή�7�lݱs�o at H�NoL��1�V�6
>B�
^

���������ҬX
*�4��P��&�$-��E�Z�T
+X�C��g�	v6P�ϴ
?z�@UYanFJBl���_}6xy�8-���T��<Si�Jo�@k( ݴ���,5�f��
1����� ����
$b
�tK��ZZ� ���]%~R`�:j~,Y�K�h�	\�O9sRΑ�w��C��a�����?���[X��^$�x�Q�I9�mF|&3I�:�ko�		J�e(���S�`��H9"� 
�A�1Ŕ�WXZ����s`��+�J3���;�d�H2�d,Y�
B�]��	�b�dL)�V�!
1
Y
��$0���'
+��Y+Pb�8�z����x<TWS^
E.9!6*\�����˪�
�-[
+��q��U.n�=	�>ؽ7 TmHL��+,�b��b���;��i�- K_K/%,IsI�S�#����i�ϴ`G4�D�2o+�x�T�	�~|K(Anߧ>���jSc=�zVZ�A�S��
���u��ß`*��w��
���V��"��F*=VQi�P�������� '#��.2<48(��o��@`p(&�>>1�\,`�{n,����Kߊ\�B�؊���
�Aq�:08
=�:�p���uu�

&Ŝ�$b3!�TL�o(���~(�f�`e� 8��?) t�����\sIEM}cS
���Q�T���o�<T��F"���bPⒸqY�Ʉd�fC1I�A&���+7�@)�$�R
Z�ֲQ%Z�?(MN�G�z.��=Ղ�XQR���b���C���`�
%'ǥ�;8,Y�����e�N+��<<�7�l�ۇ�
�D��'����k�@�Sg/t����[�&.��{,��K��&�=�T�{�\���++v#D
+B'������k`�
+x}S���CI����!��F�|2=y�<{w'�
��%�����M��]�������~�[+S�{sM�E*�eT��T�2��}-v����z_��P�	�����g�
_߽~����
-�
+,u,�͋%;�-.��$���
�9b.,�u�u�0�1��W1��^�/0q�94��$6��L�u�A�\���J�P*(� JzJ��� R
����n�$��c�U�
:J��Q�9���d�?>�,��璂K�E�f�.�6Sl�*����4��gj��������q�q�iATT�B		!a_b�AP�EA�\@Tl��[qD�ml�ƥAp�
ѱ��v���y���YP�Ʃ��F����;����R��"�py at qH�
D�I��������2��u��cG
h޵cۖʍ�9iIqJA�W.��4g�
/OOOO/�Ҽ��}����ED�cR�f��P���]��.^���2�Ha�^|��%�(=�\b����k
� )����Q��&�
n�cZ�$z(������@	���Z����=��N�������lا�ёҐ5+}�Tr�0�&���C%x ϝ*�
l�� b���g�S�tZ�:Z�R*U�h�>>5�܂��2K�X��K[�$2��\bBlE�
2!�9d.�.
+N(��b�z{q��C��!��C!G
F�D�
��
+:�3n��dm�����j�֡Ԁ�TV�� 7˘{W5:M�WCFN~QiyUm}Þ��mG1�.�X�1�1�d#��X2��%F�]�@��bX2F3J*�V�<�d�z��X�
&��P�%T�!
{��N (�\(
K��f at i�F+d����%�`(����pwC��\�=w�"o���!R�R�OL3�+.��A*�
n�8y�M^�;w�?|��|�z��Zzgb"�!R���
�%
p����^��U���`5�
+
i�f��ſ\
J�J���<��cG9u�
ԭ՛J
s3���(�$p������o*MP�G�w
*�`�
��T�֖�
�j*ˊ��f�MM��k5Ѫ�(�(e�:&6.!���`i�<�R�MX�
��9L���d£	�&�t�/�'tW��?���\G�_H
"�����g7�l��&C��T �FĠ�5�� �"<WS�u�hJ%�K�iƬ��ȳm
�[Zێ
�<�^��D%3H�ȧ�.Q]�K2Qh�+FI�91�@*�g�1R1��
+����bP"�
��,��~��:{m5Ը�LCr|�Ai
����0�<��\]�ѹ��yx��X�]�*0$<R����[XZ^]�'/������K��0�
�d}-��~�D��=Z�!�&�3R0b\c4`E at D"��3����I�%q(�玡t|��
1E
;t���g�
+�����+|�,�3��=L����'��4A�O�JoyT����r����í�vݖ���
r2�T��D+��t�H�F����z�e,!G���ү\,�4��\�
&��h0��d"h��!���39�9�
���	�
II8訙d�I�A�%m5\ M�t�YJ �����LCjr�>6F�RF)"�p3��P
�7Vl�۱k/�l�3x!z��1��y(�&�ws�4f�1sɢd�K�5�X��T"Z�"3�O��6.Z�H��S(�t<����}M� צ
E�YkStꨈ�`�ysfzy��:Owrrtttr�����9c�����]�:P"SD�Ƨ��6Tl��rW�~�5l�!]�y`��
l"�Ǟ�Kf�D�HK��4;$т="� G��t+�Y�=��"�}�7��#���>
1�vu��9�����˾X4o���t�I�Cz�S��&Si�J��~{g�J��@�:�Ci��e
6Y�1-)^P�G�¥Rix�,"2J����%�2��QW�lK��
�^�7�J@�s�?�����G�D�
�&�1�;���kp�
$d1\����
:~��̤�t4�B�gѥTQVR���a������@&�b�P��$$��!�6m�
+qv�P{z!zh*=�*	�$���-`�d/�$E�a�(�x��yJ��
+K5‘Ꙡ=�)e�H�L���J ���_�o�	~A-.ۘ���(�a!�~> ��3=��

��sptrvq� XZ�ru�$"J�KL5fC��ͻc����;N�\t���=�L4�
X�ͥ1�ڱ���|
!Z��bP��-�_h�0K���p����� ��>yL�� ��O��']����k�طo��TZ������(#$A��������ȝJ�m*MP�ӥRG���H���¼,Cj�^�V)��0�D*��I��5�����a�?�Ro�c*s�	��0\�
���$樜�A�����

��6N8��
$�H,�86�L����j�#����F
%<V9� ��LN	��6+�����v������t�<��q�ćG³�%ɨ.���U�����ɼV�T���l@i���N��ͻv�m���=#-I��KJ�}�	�\��
����M�jggo��8����
��d���5�R�2F�����������qOKk�Q������k�7��FF�bi<sI�%s-�T
+�
�<�f���X
+�A	-ԟ.�|w�̩ǎ@J��^�a}~�!%^�����Y��p�LW�iS'}�W�T����4A�O�J=@��
G�R[U^�JH2�JQr�T�.$T"��J5U���c	;�>��m<O���UO�\b۷L8樜�ل�������7pā���L��q���0IJ��G#R=�R^�1=9A�ը�"#¥a�P8�����}B�!Ҭ��v{c�~�B�����'����RI�I�^s����~eY2��C
�
Ɇ�R�jEK��W
�@�0&�C�����C7��`ݨ�C:�ݽc[MU�KR
�cxh��ދ�͞���2��4u�dtS��MsprvEXZ����? 4<R��O6d��n�޺}gӾ�mG�wvu�����\��
�ҳqb��B|.1���)8��!GN�k�
U�6@�N�e�**�΂O����n�VSY]����S+d���~Kϟ����`7������T��MSi�J�����z{.t�9�����z��;-).V��(���Iq, [...]
k4qO)(
߹98��R
�b��ƴ�]�Z� &�Z�@.W�4��бs
+��*k����
q��d�ɏ� I�MV_�_X2=�#uB(�e�������`�M�/D^4�.%
+JW�` �cJ
����e���
+�$p�
+��|
%'{�)�'M��I�%{����_�AQeY
��v��Ӗ�X��&rpp�9�����4�ɡ�I at P@�����Yf�t@
10�s
GGWGA���QF1 ��l�����=����Tq�Aw�{�9���ei���I���


��������|��m�5{��7
;y��e�R��g�7���
��K�W~8��MU��7%�O/H��0�7��Ǐ6
�۵��6��kGY 1&"$�G!s��?w����Z���
�{��Adxk\�T��*��	*U�..��LOI������<�xz!��BU��	0�rK嘥]|�� K�:h�z���ú�s�����߬L4M�M��0O�����
}��8�_�`��p��ћt��������N&w#�  ����TT���8���T ��G�
���KLIςa��bc�������*݁y��*����E��d���1�2�P�U2�h�R�z�ےtH��O�
i�Ξl:�=Dv<
�V�(��HK��V��(�\
l��Ξ1u�4�b�� [...]
��R��p=���rcy�e��b`U
+����������rpI�B��LK��,�>kcX�cI�}���xd�
=�Ȝ#��:�`�Ř6���
�y;3�ȊD��{L�$�L�D��qJ�0JM���z�R~Nfz����H~�(x����?�~BrZFN���r�R]}c�)P麺J���$
Io��#��
'K��T1���%5
�H�L�%�d$F<����A	M��e�YT!�h<�R(��E	L216622661�,KSg̞km����

��MJ]�4�ʵ�6�}箽
i:u5����
�^@Ay,�W3K.�
S����)�sa
8E��'�nfM�e�E{���E���ffCm�
���j��r��!
��y�]
m�-gN�4~������<���ҟ���J�X�:Z��l�!��B�}�
�n2��L��.y���E��'��c�V
Y�	Xj�,=�,ᨇ��-�%
�����
s̜C�EM:�`������r�H�$����%t�T�N�#Pj�}�Ƶ+�(�!�����舰t�^
+�nn�r������2�
V�*۰^����ҹ�?���^g��o�7�04� gR�l�d*&V2�ZI�J�� �y�8�#�J/(]�P:X�Gv<
��$�D�BfG�q>��(d�������!�dj�X��X�7���U��G�r=��u
9~�
a�E��^~i��.	k��<�ZtH�K�$�LA�[
��W�
u�w�;�Wn�XSR��]�*T��
���)Ǝ
ejd0�J�atk�*
��UjDR�uC٪��K��&�E�(�==�e�.�p\\e�%e �
G�T�c�8b�ǟ�y�N�=`���_۞Kd]��i]�$����3�Ȩ�ZL���W)��)ǎ9IڮI�����g�Oy�F\���K�Ϝ�3nOM5F�������U����pd2w9���RT
IجJ�C~�J���h�02�rnI�&6K��)Y�d�:�b�kE=�.�A�b�h$����F��F�@�8���%�0
Sc#��^rW���0(!�
������A&c���i3��[`�$�����ON��]V\
+]��o���D��\��X�7�%h��n���Z�$��{���)�K�Rt
+��g���$�ͫ_<��=��W��n��'kW.�φ�T+��������P�Y�JшҀJ�T�sj*A�N
����\��
�q���
+o_
��R���"��
���C,�:{�2����y��)��N���%������M
+&5�Ps�6�QG���:�߼$_yM�8�n�a�t��&�Ë�L��'
J��(Ua��
���ĸ(U(\>	�� @&Px�݇E�&�,��+Z�v��mյ{�*=�X���>�����G�4��	��
�ZI��>J%n� %�ܒ��ݖ��E�R�TS
(��n�� ?o��
�͙9m2B�����7==C#Ss�%K+{g7�o@�*&!%=+��du�ƭU�5{P�8}
�tK�%��`�AG��0���D)�E��$����d�+*{��*���st���-��V�(��H[���
-�֖3�M?����H���]mU��J
�^qT�*�jj<�T�A�(/+=9!F��V�e.N��vvv���N.2w��UQq��R6����`	�b��T�
�S]�%
�%~[�aR�sdr�y��:N�����|���ݒ�7�4
+�4?n3�P�u�	����q�j�c�
@3�����(%'�F�B�|�r7W�
���C$���IHN��-dTj��Jk��#�A	_-gjqo�d���K&1��KF���{x�W�w<�H�Y8��5�B�
FiJ��*��Ⱦ�cx������~�����2i�p|F���702F,��8e�,Kk[wOe`(D
X|�J�Tl����ݳ���؉3|�Zy,��4���_��ҕ�A�H
���#
t�
qP:}�h��n(/-^��	*Z׎������O�0v�(Sc��C?�t�'�W�W����J{wUoC*�f�%�G���s�����
[;Ggj6��GAdO�`X�NX:BX�v�����z at z�
X���{<���+&�LxБIG��7���I1 �EҚ$�E�p
d�=F���-2�N� (}�f
Ai钴���p@���

+��	
��Q"@�::~aZfnaɚu��J����U%��sQbL"���Q4L<�h�>|�KP�^񊉕L�Z��J�_��l�:�۞��ZX��2(�[�ryA6��h:� J6V�� �q%CdҰaC�
�\B,���X�=w�����K��hIv��k�m�5����Y��H���#�zx���P���	NS*}(	��h�Z �kW.A�
m�����¼��)�1!�8
̛3c��q_|nfl�7�������jUP�ߩt�Q��T�TZS�TZ���3,�3���ͧ����b/Dc��Pf��K/R�*��`C4�5�P�XPl�uM��լA��J�g�y�[�޹���'���~��0�=s���S�1Q�!�~���M�P�
+%�q)08,bB�ּi�s,aG����c'�%l��`	{��QCc��[�%��4a��sL{��N�e���'
m/~��)g$Ib��A��I�p���(]fP*?�@2�(J�!�&'�N`R�'.J8�͇�GŨSҧN���~�7�b�T��JZ��dM�$Fm�alb`"�(v�w��-�vɞ	��P\��K�J���I:�?�ll�D+vQ:ġ�bɂ\X�`e�����&wr��àԷ���G��=������R����Qc��
]���~AaQ���1f�.�_�Ś���������.�,Ց�N�����Z�D��j�gAG��}؈*�
����f�5@�G�
+��Rr𥳐/�˙�5ebr|tD(^������Q#�ؿoo���ܦQ�/D�N��K�.��TZ�ժe
sgM�������
()�.p\�
+���R at phĄX`i�t���%���c'+ɦWU]S�,�����w=��Ou�%��7�I�ZD;��}�7�䇜�H�$�^rA����h4�p�oa�]�p����W��߻kg�f2��	JS'�%%�FAH
 !�9
�x`	.>,2:!y����BP�DJ�6�TҊ
�|�
I�"��i��/Z)M&&0q.i�$�I�&�b
�Lg�ڵ�a�$	Pz#x���"�L�-��P2�m/_�Qھu#)����ٰD$���TrgGDi����oxz�K� -

<�X����*=|��ã�S'M˞��0���5�l*ڱk���C��t�c�����`�3���Ng)
-��
N�w����m@��? ���e�p�뙄:
�f�O��T
+g[��#-��ID	ƶI���N��OTj�R���	TZJT����D%Ow7����
gg��MK�P���؄�4�%�(`i[ɞ}��:�J����S�����z�T�\W��K\cI��t��ư�<��^iz�L9�H�J�5��YC=6�T[S]u��#�����x�d�͛(e���A�`
��W�u ���:��69k����:����3�R��*�lPB�P$��	(ND&&�%��4	+��d�Œ,��Vҏ+|h�����n��HQ:ˢD��/�`��3'��>��pv��Ɲ}(�Ի���Iff���̈K
K�,F���qp��y���'��̞3o�҂�_3,�
:{�IK�Bu������}�m�,�L�6�K�E0�]tDT��	/��Jx�
rg}>-#U

���tq�À:l�~}z�����Ĩ�ԩ�{�ҁ��Š\�ܙY���p
Q	Pr�9�9�<�|�C�G�$$!K3s�CG!K[����-u����]����7o����̮ [...]
+(E����zy��$g'�L
a	����ĴI���/(\���]T�x��Ljm%"57771^6�@&�KqI�%����_2�k%�����*�kn4�(571{.�7�1(
�@��,s��d����
�d���I��
N��f$.��
��1V��r�׸�Ј��䉓�f̙�h�J`is���
K?J�D��q���1�y��`�D�Q�� �R剣帾m���;I�0�ƒ�}<��2{�

ؿoo�Jݺ���՘�ԩ����!�_T*+�
+W�J�Pv�E��}�ܕr@���
G�GwO`)�ai:�ҷ[�aK�W����o޺}X¦z���qI�ZZ4q�N�bRG��!Njdh��߁�Wn�3A��� (ݺ	k����(J�++�V��/!(M�HM���

`"*��� �X�ܽ|��ãbթ�R^~�j���èҥ�X�9�^u���C���3�$����cr��	ej%�I�%i�tVLg�$j�w{���|݄A�[4�f��x��U��<JKI� ����0����8�b�`D����̀����%�Ҡ!Ñ%;G���_`XdLBr��,h���V�݀,�cX:��e�
;HK�%�{��Jt�0��������n
P:@Q�zu��Ed��
+;��������r4����A�`h�t!(�:U��T�/D��=�J�P����Rձ�n>�*A�������\��]��=8<2&>)-c*��_��v
nz��+���3g/\�ZU]SKw�����ظ�v.Iɤ1�
��h���
�s
��߹
�_����p�RM5���~8}������)پ[
PZ�;PJOI��� �0��ˀ

�
(T�
�S�dL˞���`�ڍE;���i��B�JO!�&�6b���qCC�#r�E���D���KR�ULOɤ���V
<��d��'ͤf�
��Q"kV����l�
Jte��8�b��,J��>�J�DX�	,
4t��Qc��d.Jo,h�:%
�hn��嫤Y�M;�,v������H�$�ǐJt\����I���owt��r٢��2@��J��`k5��}z�̆�ԅ�J
J�*�*I\�I��ޮ���TR�6�+,��˙1-#%!�K��Y�`gkcmmeemmck.�*�<�������T�Ҽ��+����;v��?tY���Ru�a�ރ����ĭ{��f��[��î݈��wgLok���
6(=��[�?kk�W�	w�DE��}�K����VC��3%u܄�� �
��.`��G�%���Ј�F��Tjit���AcPk��&�_��$�����
x�8�0��D]�%��Ճ����E�I�M�J
JM��ft����Q��|�R�:&2<������ɁE���0
aiG�LMMLLLMM�r,��,Y K6�2W7���X56Ѭ�yK�X�B���

��
�@|\zm|��m�V�
�.�� w���ś7`�,��3�_��.�vVc>���0�� %�J��R� [...]
+���"ݒ�.(1�l��{_�73�
C�=f�޿8�9���}��O��������/�1��������%�U�B]j=�ĥbv*S�#��h�7�2�QF?�Y}m5��e��sAh7�R/''%�=}���8�ںU ���sg�x���`Q���B���c�7a����s�X�qkxD�Q��5�R1R��)�M���jւ�<�
�I�������Zv�Gd�&&�K�<��
+���p4�ߩ��(��2I`����܌rD.
%��x(�d���P�mc	�
�Q��V�<�I
;v$0�K= Ktt���[ڌ�Njz� ������N	KE,�(��X�K"k�@=�����u�ͫK J��kr(E�$�,
+���
�j������Aژ�w�ڥ��v�HPT�����T�h�ԠD�
	�'�F �V,
\0g�tw���
T%�����������������ֶ�%�*j�R�&�����ǜ�?�ҕk7nef��Q]��K��o��j��T�M�㥿��P����Pd�E��)J��9ٙ�(v'&ĂҎD�E���.��3������i���-%3S�:�1�s���ݽ�J��J)�Tz'�B��<��A�LB$����T�SS�h"0Acb��(�J]����k�VDҀIBk����q]-s3@);��(�F$�H�С�����KZ�
�F�p�0�6L� ,�_
���ko�KWKٹ��`��~Ɇ a]R�%�=�1�h&��Km^!
�����ܺ� �lA�,�džh�#��"�t��ڻ�c֩#[�x(�T�ޏJr�5�z͋���
+Hi�r&���O�
�U?*�_��iބފ�M��_�4s�f����IT:s��u���@%/��f�C�

������
�K��m���;��y���. ,1�ڱg����O��;�t�Jj�͌�� *b	ž�.�qIm�}���K��Lu_��$���
]^�����fe��.������:|`�0�8�Ң�sfy{Nuuvrk7ʊ��`�(�+;�i�T�~�K�C�l���t:>)�Z:G%yNi~�k}�N��
+EJM�G@&!����*++��UU�& &���'m	K�y+I"�a�;a�e�FGüP�r�9�Nv.���cG"U��7
�� ��<��(!�ڷoO`���[��6a��b�(�q��n
�g������X,�E	a����gTY][�j�KpIZ=mq�;�~��i ?�]�J)�-��;Ë36TSc�!�:�����E��>��	AI���j*Ea�|�ffN~�6�R�� 7�v����gc�
��Q�𱘸��7ng���QI„���>�ݱ��aqa�]*mX
��7�k����[���L�JzCp�KC!�[Z�B,9�AЛ=w��oIR���س��c�����˩i���
d�%��HU����fkq.)?����q������?^�m<�`�$2T:[�J��
+ at gwn�LK���tb��C������_�ryP���~�����9:�
mc�E���
��&(K�c
�\�x"��B�Ja@�h�J�S�+[C%�A�)A��7
+bRMuU ������
+dS
&�K���*sI�����G�J���k�����`�()�r�E�';{�@i�.(�9��5���#�v��B(AO$�k׎�$���={k��
4X�����j�K���"�+`)�T\X��q�N�k���S]�hG�_ըSY1����y�pLx�ba�@rR� J�!�qP'o������n]�t�
�NPjMUҜJ!k�o	����Tڷsۦu+�TZ�bݦ�;��@%ބD��^*R)�C�Ȉp������qcFYY
�4�2���C�

��=�������g�\�Ԫu6o
߽�ީ؄ċ)W�������+(,R�K\���&\�]��h�3M��w5_�hm"L�Zz
%�~E���Pg�ׯ�\LL8
�����{@i��_���A
����6e�$X�-$��\��I ��p6XO����*$lρ#,�2��8*=kx���/��?�
+�E��T�D*++-}�LiiiYY9�	�$��
��*x�o�]�5�R����Z�Xkd�:�
�-�#�d'��P
+���z��8�t�Sd��A	zR;n�K,������!,
�`i�?��M����S�� KY9���P@��F\�P;��ZU�[j���w�"� 
dܺ�,�T4����~3�{�9;2{'(i���գ;��N\U��RUR%��4}ּEK��T���x�����6Tz�R�����g@������J)I@���{·lXD
����A��t����.
�D,9�f���CV�[�öp�z�1���/`ֻ��u7��}�.�ԡ�~$Y�yO�K��/��*	L�IC����e&������҅������ޱ}3(
-n�<_�ڔ�' ��--�(�c
�š����þ�'8�M�*-
Y�~s�n�J�R�JEH��'�F46�
+y+�B�8��(��� H%
3��AI	��
;�I�%��j�R��IS$)�[�z+�F�����ܻL��
�';LP�AP��h�@IWg@�>�;"��'��
���/�t����^}���
b`l:|���X��4�Y
��-� ,E��/������a�+���fs�<��,ť���wP�u���@#�jT
��>
��P
+@�a
�wh�Z�{�ڿB�%(���
]�JRI��5��EǁI8�Ѓ9�j𴾶��T�J
�
>>*9Lt����iބh!���B�
:Gi�R��
�R��h���5!A��#��'؏��46�,Rw���:0�Kz��,FZC�s��:�$5Q`��k�o"M
�:~�Lܹ$U��;��u�	_��&���,郪K
���&ʤ'�LQ*}H2��t;�R���31�Q�p�÷mްnu�o��|gxy��L
o
gi)�P_�R�@ڷ>� sKk��$W���/]�R�����K�7�J%����g�*�B�(oE��%b��H&+��Ɋ��M%&�0	���2���R-�
+��H��̟�O��e��x3*��x�
+P�a����=*�<����e��u
3k����t!�V�KS*�Q��2D�F�r)Q�ߩ)�D�z�?=�s	�˰쎘����9��^~���=�6k~��_���}�����zC9�A�8����ѣ�0�>ŏ<�����C��j��N���QK)9��J KU�H�p���=��� �$~~Cu
�5����l)	,��c�d��˅s��b�DX���S(1S�O��J}Si��B*�_,�^Q� k�
*�lk��Jʮ����<�?��̳�Ra��rI�������9���鈨�ҭ�VY=K�S�G�݅���r����ysfN�CP���������D��
���f���j7�u|�l
+	; ���?���y6�����
�K$VO��E�K��@3��!�$v&���!&ѡmމ���Zr\A�٬���p�{���mވ+n��-�Ҝ�&Fh(���F
 X���z�B�ή�޾~�aQ1�J�S����-H�(�x�����5J,X	�:;��Z[[Z������
+l�`�����K�J_��U)ƥ����\��)�8��B
+3ՈD��FB���tڍ�P�r4 at P�P�����)��F�
K�����
X²�ꠈ������|� $v�M$@�븹D�Z�K�	��p	J2�o1&q6�/�
��
�(�6��Bɏ@i����KD0�ƌ	ǎ��"�M����T:{*9��P
����⹇	��~�}���<�r�RϜ�������J�&�T�>�����H%(�W�K��΃�=�қ׽��@��]�:Z�J7�]� TJ:s$��m�����eK��53E�Ӆ����D�	���
#H���%)W�u�>[��������;��
+��_x����H� Ud.A�
<B�'�%~���c�o)�����X������jS`��g�$To(et(!�#�����t&>�Xh�� ����<�^����r�dm�
*Z�
 
��65��^b������oGpXx�qB��RL�vD�GO���b*(� ��%��%��-:I-�MM�F��dMM�@&&4���+��{�s�
د�S*<]�C�-�F��2	rg0n�G�+C�(%\�:J�8(��4�y�XX�������7}&�h��"���<��Rҳϑݐ��Ie(@w�\��T�߰V7��Lh�O�[�Bx6 q��4I�6�@i�/�� %��y�
��
(��4l��'���r*M�R)`WX�JU����
�J�|����;[�jxT:���B*���||*���
�������yT�ihj�a�R�-!�����0�z(��w�loi��BT�!'
S)lW�6_oOW�vK�\`af2s���) %M

ux444��(�f���/�Zdcg���u�7ޛ���ڳ/��ј��Q�~8��
+�
N�K�i��\q\b�Ot0)��$�
w.�L��q�8w3��_����HM<

	A
��}
蟇�G�8
%3S�h(a�@�&`i����,�J�N.
�}�J��@�������:�S���"�A�7.�_�P�k��ۘI�@$�������~�74HeLh0.=f���%�Jj�KCs{�2��$�2�&���B|���3�i����P7b(�Q���(���q����QcƎ�b���j�ړ	�, K6�X����OHNςa,UV�5@�����撜0{����3�E�-#?�^�� ��|���ॴ����<����u�l��#xP��J}CI�4�T��1TB&x��
�J?���
�
�
���ǔ��J�ׯ\*8��Pi��
�*i�}\*�i
+���[�J���/])�䨄0�s�K|
o��!Ɣ&۱��T^Z\TJ����
��]����`��4�d�����Iښ�jjj�𣮡	M�;
�Ҙ`i���Jg����7A����
?t�8�^rZ�ټ�
E%8U�\�s�~7)1�+y.��>��ÅK
Il�+a�S̤�{]�� e�~d(](���>u����8h��>����V;:����mjd��:m|�j���

�A����;��{�l�.(�@䱸D%�)���6�R�C6!��w��7�� �A�
"+Tŭ�ĤF R]mmMM5~jjj�N�LL
�.qU��K��ܞ2��3��u��L5�u[#�(+-Aw�����=�v��J�(�r����)�_8&.�\�Ò:`i*’��|+��5,��� Kqgp���]+��B�^�����O��z�hu�χ����όegx(h�����l�
|p��V_�������tu�ѹ���G��Bi��E�	�|*�rq�T���O"T*�0&�PH%^��w�)������[
-���
+B���'�
�Trsr�SIe�ǣ�
�
��(�
=q&�P���^�ʍG�J����,�G�����ζfi�Q)/;-1�xTxh�?��
.@��V��i�%U'�GUUM�Υ�Ʀ)K륶�W:�|�	����;���(��Ԍ����K�*<��\"��r���.�dK�ʆ<[\�����b��ed�L�["C)'#5	��Xԡ{wb��f���*;%�J��T����3e��
�Y��,���q��T�s�0P)5+�|��2	�)�����%D����
+miR���k�L$�TWI$����K"��2�`1�`�D�q��GZ�|.)�ʾns������	!�C��]Z%����\<nO�G��n(yy(B	��!��P�3yXX�
aIU]s���3�LY,ѵ�fX:w:)53�])
+P�T����K��p�_V7���yxǷ�Wr6�Mm�	)
gi���(��PZd9�Bi2{�x��c�P���P����Q��f9�Ҏ��pD%d�ť�J�����b�O*���F��!��J�J.���T�H�%̣���J_�ؖPi{`�>L��sK�c*q�fJ�5�I�
�[v:�D(}�vG[SC���j�y�RB����Р
[}��]
�1�e4C�IZ�J**&���LTU�GX204"XZ���X�6�n�
�3$t?
+��Ӊ)�t.��\ۓʚ��uɗi1��D�4�]�<Z�ZE0y&A�P��6�I� e��ء��wpXH��/Ӡ��3
�Ф*�����q�qT�DT4�BT@P at VAvYd�D6Y�]A膦�YD�ɘh�b�I*fq�d��}�{�v�ne�q�o��s��>���������
+n���=����}�0
oz6� ���V�Ygem�����
T�-*C*5�ʺ�YO��<q{��P�|X�9(��&]�a ���%���`N�\�Սd0�`Rp����G|.=�ȥ��{���mF>�x��JP���h�H����q�������P��
�v��3�Q����{3gi��o�>�Rrz֑|H;q�L��K���K�ju�}�����hȌ�g�����6p��8%!��)�;3P��Y(�=�>�Qi�Z�J`�H���cǑJ`����o��-̅�}�yɗ"����4�y����e�T�T�,)�A*��0TZ��G���)��㑣��u
�|�*� [...]
T��fK��Kj.�;��&S�P���
�u�Z��./��NK�������
T�Z�f�����b
m,J`�L<@�٤+u�-54^f�j�ņ�[�`�<�|�B#��Sҳr��W�����j�螠����J�4�I}��1�U@$!�L"�'d2�7pnP?�7�Y]MeY1\F����Ȱ�@_�����[0i�PqFK�Pb��1 �i}#��-� !;ܽ���cR3�JUug�O��ƭی��])!j>��B�[~�]����{I�
�v���
���]hB0��`�\�
U�(<��5

�^jR�׼%�M��G�>�����j��u+aD�����(�ۤ�ب0*�J��Ci�
+�&2GKSxXb��Œ#`ɋ`)6!9=TR^U{����x�07�FU
@
�Ԃ��3��פq�I�����(l`l�l@����q��L���=\Y(�(-(�%�>�'��'N�APP	�G%��J��H���4�R9�`s����
+c�������`��ظ1i{LJxl��������	T�p�����
T�庍P�̄G�i�J�xT2YA���uP)*.�PNaIE홋�b���xd0ͮGnh���
�� EDJ��8�Q��T����(7+51&"������v�`��d!|sf�~K�L�,.�[bhD�D2����?($b�����ù��P�0U0��d�>:��r���LB2�����W
�.!��ә��$��	�JM�P:V�
�
������z�%$m�)T�>B	G)"�\4�鹰K��FˀJ��m
v�y��E'�d
9ZZu��E��x�u�S���5��&x|e�ػ|��t�;Im����X,���I�	�`0�\�E��!r�V��K��ݞ�2�`�}��3o�jd}����
�
�-zD #�_mU
��JP�9S�ܡX�bi2b��X� ,�E��'A��P�jO�9_����
0��E��u�ǜ�=�����

�QF�Ŭ�q���U�
�p���J��PZ�
�
Dy�
�{+(�Ri��JzK	�6� ���#bS��ʫ�[e�^fܽ7J[��^���^�Pb�?H	?��M�ζ�K�O�T
N*��*�Y*�+�4�CSi��J���J�v@�=��@���%5�/\j�vv�
#��L���s5�4��
��_���.]<SWUz4735!&<���}���fK
�FK�t��C�fAQ��
�3�>Ƕ�H-[�r�Z̔�����no����1T��G�JxsI�!���\�%��1�`�IM��=_J���H|$�j�X��I7Y&a��s�.��T�w$;#s
����;
�{�ŚUf�ƆK��h3C	�4�
梁��/M��IB��<}�J�)�)�'N_ O���
���&��-���?�xF�,���}N`�� &I�$��&���H����"�0u�\��B��G�J���%N���W0�[S�y:U$�T�����c�J�C�����|��DQ����L7n�(�P���JPb��(<v.!�~I�o�4�Xڴ�����' 8,2tŮ��H�^��s�s ��	�����X�QҸgJL"
݇o��rQ8L��
��;9�ma��!�Ҭ�3>��;
TJ~�T��+�t�~�a���_pxLBjV�Ѳ�:b����mp��ma6tO�
�M�󌄍S@��G��a�AGksù�5Ǐ�g�'
�*y� ��,�t�9*M��T��QI[�P��
+���T�<����_|���y�
]�W�!��L�둹�}��a��#G��A�
Ϝ�,-<��

�����f��Zs�K�O�3dҧx LP�(�)}�/M K��-�۝�vy��EF�%��g���U���'nk�D�$�bJ��%�h	���.e4�k���G$��wE�M
����wH[[�.)��_zJb
�,��{�����
j7B	��G��9�$r��=Cs��ց�21[�v�ƭ�N;w��
���SP\Q��҆�r
<�/�)<q{���R��1�-�
�/Q�
>��U��,j��P_�����K��&&
&�n��
���KOx\R�Z��K���^�oF�I�
�!��P��J�Q�̬["9Y�f0nC��G8a_���X�)�P�@��>�D��E�D�C	KN��>A����(vE��I�D-��d.
�Z�0�9 m�Nǟ��
���2���=bm������@5��ԃq�`�>x� %K%c��<(MQ����$�Js�#�LW����|��c�S2s
K�	v��6��O[�r	^���>�

K��2IS�ٓ��Ey�ic#��{{�8��̗*}�Q���B��&qT��P��
�d����
{0=;�Xy��sd<^
��
�%�4U��OR�<a?
�R��d*��]�����x����0�Pr��� _O7'{�M�J�
,�G�4����t--(L��Ys��u��c��Yn���߶c'��PH��	Ii��s
sI�"��H�	��-�)�b0q`Ҕ.��25�{ſ�B$�H��$�m�$���I���m��FLJE0��%%
���k��v{[�?���M�
�,�]� �?�0�\4�3�fK
�
���o���v�]>�!Q�'�L����8<�t��i�U�&�Q	��H��*� ��� �l����� �,�)�p/r��e_D at DQ�h�j��K;&�%.Ik��C�����ƌ=3~a�����{��{oV^1�~�
��^�q�.7"*���N�|�-{O�{>�,����z��:�[U-��Jr��[T��S���	�K����߼
\z(���'c��q-�%Ϙw'��gb[g.!�u�(uw�����T��Hd��I��6(���}��U�m~�
J�(�~&����`��r��f'Ww/� LPB2�]n~Q)H���^w�8���y>>�D\$@2�1��}�/����43$21���5QQ�l�m�@b�"(J��3u�D��_
J*M�4�P������o`XtBJzvAqy�\����?t
+3�e	Հ3r
����3nw�'M	�"�J�ՠ���hmeianFjRlD�����&K��R����O*Ay*,*Y�lrv����MJ��-<�Q	�q`���,�F�
�4��q
Z�T�����*]�x�wgF��;*d�e�yY���v�x�:n��051Z���������1}�������%�KstK
C�V��Ykaek�@\/ (,2&>1%m_Vn~a)�K��>н��1W�Ę\3.=��W>n�j�I�.�^��h�I���|���a�=֓�It�
�r�v�z�R>��݉�1�a�3�m[]
�m�1h���-1X�t�G�����C�4,e�� V�Yge�T
+��
�R�� �rl<��EZ��	y<vBȓ���J�#���-(]ώ�¢�����HjjT(�Q466���;�z�0
�`��s�.��#1�����x�
+�_���&�2!0���s�|QR�K;T|�@v�ޔ����� ���#��>{�ޖ

,�j�4���P�>�T��MN[�=} A;c@��3s�
+K @����D�N� x�;���d�Z�����c���
pL�
U���
Ȏ�
�
$3���7(��I��0�%1�&�T�
R���
1s�v�
>;¢v�	��	64�C�FF�a�S�-�5��p�M�?ai��
ەK����t��G*J��KM����ts���4�%l��P�}�J���&qTz�Pi!P���������/8"&15#�`)��&Ug��
�t	q�y�u ��$P���
F铃}�
��U
.:�or��Ѐ�۶8�Y�35FL��#@(��L�`�
s�l]=�y
@�
�S,�lD���������'�%U{������
\��&��xI��rS�
�eKB���ɐ�c�t_�$�1�n��`~�zt�RR� f	�Q����3Wg��6Vkט��[�x�п�X!��c��
:��:m�	1������
��F=�����<���) nK(*��S��	�5\J
2��=M�
+E�0�Y٨8Z/��duuu2�\^�AѤ0aaq��/_�v�ƭ��4x���|*r��Z
^�*_xq2��&ěQ�$��kW�j<#.J�n���s�P$�"B��R��+[��Bi�J�j��[�0.�K!sKk�M�[� AA����I){3�
,>\Q]+W(U�.
����Ys ����#��+e�U/ȀPPib���m �RW�J	q�C�D�l n
�ߔfP(���'�s��ԯE��!������̡	��	ƃ	�
�"� 2w��d
�B,���^��p�&�`� mdD��&K���ѓC���-
+YMyqAv�����@_ϭ��,�LV ���#�fpT��f�4��ү�J��JF&f�
�z�ED'�ٗ]P山������
0%ږp
d ߌ7��Q���|���ҽ��M����
+s3Ӓ�"C��]6�Y��1^a����Ū�P�6m*
X��1?��	X�L.72^m�n=�
����oGp8�^RJZ֥����֎��cC���.a�
�d�
+��x����%L=a/>¯�h�lq�RC�Sq�`5�$L�ID�:�TJ����
�â�Eigx�?o�-N��6�_gF7��
����Ξ5��3
2�����.���6_o�����?8"�xJI�y�������R��Î�ϋ
+� 
k9�MЯ��_���aO×��BMj����
���&��Hm�L^`jnim�T�ҕ����q��K�`�����ë�ʗ��1.OX���9��O�{c�>J�m����<����]�xg��:������9����x,��
K������
]�<���DD�%�Nۗ�[PTʼ�ե��u�n�sI(Lڳ�Z��HT�I��p���H�RU���f�`p�
����%
�J�T�DT���4�PI��3GLp��θ���A7hTu���-|���]n{�=��C6����ōN��u�����ڔ
uUeEyY{SvE����pu�hma
+Kx1PI���Qi›���J:H%]}\BFƦ�
]=|ãv��g��U�ʶn�i(Kt	��8M�9n ��?�P�v�R����Q^SQR���������v���U�q ������B�T0y*��-2X��h�oM���
��n��	@ًK�-�Ku�
+eK�j`�-1�%���¤&q��h'l��������� $a����b�-b�
L������A���\Q�
E	�;4(�Nj.8�?���F4�n�҇"�OE,�a���1!+W��������
���_\^-S4�w<�e	ōa����{\F�}q�[������ʧ&�j�TWUV��������ʪ��: S�R�%\��K_���*��x?ƪ|�^���mBs3>������[���X
��A}=,(��k�Pn�ݨ��tYhB�q�ai"��/)�>�d@�da	rيb
�����?'����j�uiD��K���4��1����q��x�עq<��l���ʲ�����`	�Q�!hp0X�ٔ(�&�h(	Tz�Qi
+R��9z�,Z�
2&����
��'#��Lт�>M���뼃��M
ɣt���5�z6��G��{;T�
؟�
�34�g�����:S���^fAU�g���t2FQ�BD	
+�/� �� (�"��.�"����
+(�a9,�專 (���c��E�I&3�Nc;�i{�N����~��
�N��ґ��}���~��9PI�����'�J��TZ�T�*�[or������s4�c�L^Q]�����?82���WO�C���^�-�䇹�%Bi������]��k+K
s3�S��
�
+;���N����9�G�
VB[j�G\�M
2ebfimk��H�ڳ�/0$<e��3�s	t�r542v_�%J������&1]"����V��.Y,Z|�"�#���[�I� a�m"���ݺ;�1dPoҡ1��
	�Âssqrt������[��Z�Θ?d�
1�������V'��޾�����)i�)5
��:{��F��XqC,�$d�{��	����� ���᷌�
^;�IM
�u�5�
+E~���Ze=��
S�T%ri����h�fu�9�r֛����.�gi1Jm�ߪ�g�4�$��Q���b5�_���
�q��-x�=׍���.
Jsa	/x
D������ $"*�HB�Դ
Y�y��2�:6��

Z�
��:!<��- at -;?�i��Dg�/E�N�9&��LP`�yho%('����z*1Ab҃������@��
��!�V���,1s`��B��3�kY�GY
�8�j�I5\ 41�&���	�\�Q��Kx�n_��֦:EYqޥ
g���E���x���676\���T�⩴�cSi1O%-��GCcsk[�
�>~���GN$��p9��\Qw��0=����+�=��y��@��
>����g_ɦR/R��cNFZJb|ldh���nW���6Vf��t�q*ii-���̥�k S��,�m����]�=�}��
<{�X�0��e����������[w�P�)X<�����ăi&�4��I5c�|Ÿ��J�0[�p	��#��I�`Y���0	2 [...]
���t�lk&)kkU�W�����RQ	h���o�*�Ҙȥ)�K�:�
U9�E���ߙ���&��N�u	���
1]�y�
%�Ɯ��i�ף�ӝ�G at 7ڊ�(@iɼPZ �l�l�1���;v")����˹2�Z6������p�t���ג����i6����̕�95��k�I� 0#RP`\�Υ$�8�6"�v�
�҇R�3��6Pi���f�3�0�s��
0s�����
?>�7<����M���NB7T�/A	��v�]k�i�u�LR��CaA��z�9;��b	���� ����TZ�T����G5�������c��$���e���-�iKPB�ƌ�t
<�4
��P�Y�0HC(��t��SZ�(/Χ�x4�`H�>�]�۷��X"��8+\���>*M�K�,S�%S
+p=���n��� {�Q1q�\ʕ����a�:�����\z�j��1!Z��$�KM|¤��������I�H$	�zC�4!a���T�-͍�EE�ۥ
�P:���k��l�&+
3�
�5�P"&IO�������r���vw/���#��S.��U�5��w�����ư��ιBa��>�X������k������JYi�\^��\^RZV^Q	`R645�\�42�K��o�
~֪\�Mj�=�M�!IҌ(
��K<@]�K�Jy�n���Q$؝��<�u#�����$���|!X2021��,9B�H��F� �>�~1
����R�-��t����I
���fu�w��?35^�q�'�/���m���r1����񐖰�@�
H^#�}�8*�͈TZT�b�S
�
3�h0A����,s� �O�C註�c�B�T>�
���۷7P���cCwou߼~���B^����r�XlT��=
;�i��2X�TZ�Qi�ǥ�"�JK�J���]�ohdfe�y��N~<��gf�TT74_�	cih
J��%F��;���{v T�|*��t�72���n��*+��x&����`/w��v-M�
 ��V�>c�R�K+V��L��742%�sptڱs��
��`�K	4�.fe����(1W�{*\"㛚
˖ &U2I�$
��|���$$K��X�q�Ɯ�6=E�7�I0.@�0d��˙���P����k'
ʟ��)�h�6J�$v�KK�}8_}H��&�m;�<����KHJM��),��ihn뀱D�Xz񒃁����A���&�0�^�˚�
�~K]uUEyiIqQa�L���/���"�j`01.��B�.�A\���իR�3|{��Y�3��֧�};F���yC��B�F\��q1Q(tg4nm�y�"1;��Ѐ��I��͙������
$��]@Ph�T�9�:��Kͭ�u�ã�L��}��)���V=������8��K4�Y�$Ϥ���;dl(U�
dC\RO%&
���Hm���d�&(AC"9����*�`,[����uL�7b��=}��"`$�6(���o�ށ-<z���.�
61���������-�����Fn�v��4�U�ip:�hLdH���nW�-\	�]�� ���oI�O�J+����P��8�x
���O<}�"aZ�����{{`<��W���.���@�<��a�R	�3>:t���f+R�� '3=5)!�Px��^O�
�
6Y[�n���@S	s	}�%�y����K�z6v��nwvu'كTqs)����K�{�
+E�Z
��G�b\���lk��%�I�LTf"�Āq�&�l������hA�(\B��^�f�/�!a�L"��v��eA���s�C�����
�����p��
i7?E���]�֨.z�����fG���)�'S�2�e�+
+eS덮>�{
K����p/�/>�Ipo�z��j*
&�0����BY~^nN6}9�������XLU*\ .1���M�?����R�?��ʹo�'���rypw��ԌjL�7:4���
U�-?��iݒH�pwF��T
J��L����8މ��$JQQ�l�ɾ]vpI�QDQQD1,z/p���"�""RԠ � *����cS�*nq��6�i��N�Ա���<�9�y���
��z>2��s�����6/���Kcb���	�����.!)9���^��i��R7�G�M�ޅ������ݫ��j���S�t��sV1	���`���nQ��ʍz�
(\fz*�ź
L����~<���)�4	�4���͓e���ǭLJ�n�����
�-<p��E(�%iu���&����?b�0n�$p��+����{�*
li�Um��X5H\�����D������ ;x2R�-F�q�G*�@�Jo!�&�M���A�1���5�����u��ꆦ��ΣP���/��>�p
b _�>Z?l���#��:��;��)mJo٘�6)
�cldh���,w�=�BX����$����wp�B�	���M�'�%�U���`����\
 ��9yj`P�%L���Y��2�tI���%&EL�G���0Yb�Q�� I_+�D��k���0s&u
��ֈ�m��zC�E	�ov4-8?������m8*J�$�D6^��6Oo� MD
����ٹ������P�N������h?�!����x�M�'AHz at L�>W��0Z�576����MeeF8ee��ʪ����F(L�m��Ϝ
.]��t������6�f<dR\��7���������b1�\ [...]
+PZFV6x��Xԥ��u��2.���>�\1l崿�����26���q���d #3"3	��
`Q�b\P�XZ"��
��� (�X*�	T�n0u�
G���_PhD̼���ƯZ�ݠ@g���aY:	*�	>p	b�>�������60�
���m��ف�
X��6�U��d���N�[��U\�ND%��O%��vT
A��Yy�KX��a�ּ�%ƪ�ƽ:w��%�XBN�%ݧy�=�[?K����q��9�KU	)]�+���\��H�1&B����*�S��0�m<�KT���������gY�
�J����KR�h���<d��E�H�0]<^r�(`�0)c��Y;�G�

�d��&e�	҅{M 	�E5	�~�S�0�m�1�I���Q���y�9�(�tC�b�"Bi����p!hv�IH|�./N�����/P�<eyšԌM������=��:P�ΜcXb/�.����Q<	��pW�����e�,v70	�d4��K�ї�e�U5uX�����#�z�Kx��U\���
�f�K��gVnr�cq{f��u�%#�2�'��ab��o�n~kd�Җ.(ͥ;
���r�
�܍/��ĥq�X�b	.�������b7���^�=�N�uiWcs
j]��}�X7�\bʮ
�ߥ�|������5 [...]
N�>x�W%%��
*�;:�zx�i��}�"195c3f�[��aЂ����Ж�#���=|��,c���_0k>`q5�i`܆΁
���PSQ��j����w���x��8�x���4�uQi<P��-!w(�AaT
��'�K�ڲ�������	0}�x�XB`��1�*�y��<�:�Gl l
�u\�JP�?��u��(]i,Joڐ�&�u�pM�����

+�ݔI�-Hg�	K�z*/��`Mxd
�
+�R�Y]��k;�	�.��\�����5�Deb�
�%�����I!G�%��?{f�#��L$V�(]�
�V�j�6��~�IG��4�v3P��SQB�F�#鎉
���Ђsv�a?}/J��J�E*9��zx��pOY�:%=+�
ņ���T�@����t[�+B~�&���]��,����̠/).�iw��juE�@����j,L
+.�".]�\��&;���6��f|k�+G�I�˳�=����	��B(�A���z{�����F��-��E��Q���~>
J�/
%K?
K^L�c羇Z�����F^WHu���a�^кΣ]���3J.1	�6��KGg��[K�?%"���M�q��	�L"&uc`���kj���Gq!��:76Ze��
J?a[XPi"���i��3!s�!a`�
�,[I� 2g�-�[T��,>t�=r��-�
�J,ck�3
+��;7Z W��KД�t܉K����dg����T
�S5�j K��$[�pzo��J?*M���4e��<�1�>1]RF�n�����%4
���O�1��s�
d�y ���<nI����_#��:
���TS^Z��J_��2n��!�^
��D%B�	?�9y]",a��.��i�0UP����A�2�����\���k=(�Dv}���8߽�$0Q���I�L�L$�gL���#����S,�#H�X�d$�cO�j��
`}�IG:;8�j*M}�NP�
Zo�2^��#������v4�t�K�,1os��
;=e�ڴ�����T�k�[W���͐�A at bO�2"4v��ɞc�X������b�vGaAA~~^^~~AA������h��Ĺt�WG>>�\����%
��|�_}eM3�|�>�Y�>
�����f|,6#��`~'�u}/��ƝT��$�jD_��
��Q�ut`
a�RP����
K��%{Y�Bãb�`��
+����J
���]�A�vt
=֍��du��.
[����G�������<��ԩ��l�ƍ�⑑��j�0V��
d3@�C����W
%���JoO��*9̡ͤ	.x?.>im��-��RSu}����N(}�U/���C�L#�!y��!|����
aq�i��w8p�,�=��
E��da5XΪAH��������t;5�������h	�yx�j�Ӌ>X��&e�q���fWSK[Ǒ.r�a�U��`�l
4��Vr�
�q�:�=�
�}'�:�o�]WYV�Jg�O^�b����;��rwu�ʆ1��S�%
+���L��7�^xT�
E]JM'�+�\��56���㻀_â���}%�x�8�d4I	��QƤ��q�ψF<X,Y-��8��t=bM�6�K�$�I�=�I�I�5��F}�_nNvVFZJ����erQ����zӂc�gNJ0I�.r��$���ǟ<嗋?\�����鿼��S���_�tjD�U�ij
(��
���(�	"Ⱦ�K at Tq�u$.1FK4��h:�M��L:m'i�֙L���{���.?~`lL����O�|�����+��v���5Kz�N���"�9):�Q��S���e�e���-/-.,�������������/(*.-�Da:|�ޘK�D.QHJ���d�?�EX��5�PV���&���nOK����38#�:��Kd
+�f���B	�ƌT�5
+^H���r;��P�
&�%�9�JA
v޾���C6lF]��Q�).����{�܅˭*�d_@��쏟�NV&5nü�
��U��8���I�8M2=t`�PA�NH(Q4Cr��C-^
40�Ն�!�&�>�ϠT�
DX��"h$��`w|Rjf^Q9�0�`˻誸se\L���ᑑ��Q�c��/�#�
xh�3���:�@3`>\SY������c��
�l¢��������
������ゅ�\���tlb2и�������^h�Xj��8����C
d��@F�@h
��y���y�MT�:�t�����
��
�8�1=�|�9z��Dui������=w�徨KAkC7l�

G���ͺ�
1���5��s�TE�3�R���&�M*��Ƅ��gВ���HV�+��G�� .�=�H����~��o�b!2	������`o`n�(yiEI
�^
+Md�T-�y�P��˼��b�䔐��vF�&�������&b��E�wR"#B"�I�E���|�0k�
�ؚ�
+dR~nvVfFzZZZ*�K�����E0��UT��
��Kf���$�� �3��6i�J��L���c���;��OU
T���t�
+!㺨�fk\㿊y�M�(�c���
_*�f*I�[��g�_@к�����������s�[߽���%6Gl��3���*����H�	>V5s7a�A4:�
��کg��G��E� **h��i��L/
��J3�f�ut�����6m
g͡,U��
+"�����
}�#@�'�
������!���������=R�E(5_&\�ܟ�;b��K�P
Ȅ9������T�fc;]��(�n
"���ED�!4FY��;�D&�Xz_�
A
"�y��
Y
Ƞ��D��@�Σ�ҹ3'�=T]A)�/!)�1DvG��<Q�4_e?�NMT���:0(U�u	�����KHJI���+,)��fk�\����i�ϑ��S��� .���&%0RI�5&mM��
�����ϕ��y$I�
�KD�~/"i�ӧ2�eM�u��5�ms&Ac�n$���m���EQ�E	�$
�uY�l̳�-��
�S���޳/5
eI������4��"

+�rR"�B"�h��a4�OB�޸ֆ�Gf͖A�����������^rr����

+���Ҋ�jC.��\R))��#���_������o�&M�4oϸ�i��%���+��OY��$|&g/�:�[�(�5���]μ.B	;���ˆ�ıD
+�`��m		h�����K�vD��R5�������U.����a�m���!�q/�>v�2�,�0��%sGe*
�U%�[�#�"	��be�?0��T�4y�Tl(8k�����Is;Hsʅ�O�=��E���4���޾�Gp�Ǥ�'O�Z}O�~��0
8��Z>�拿>�t��A6�����ȝ�6�Q5`���#���4��O�I*�~&�x>��R/�U�;���ӳ�K*�
=�tF���[��{)�i
<����D�-����
���IT�U������GG�qJ����Wg������)�T.	Q�=��upb�C]r["��jk�
�*-3'������b�,|�m�|���`⒝��E�b�����Hb�1��	��#F2��,=����GҰ������8����6��U&���}��-!."۾��*ӊ������d�F�
+�ɕ9e�2�U������e����
�Ġ��l��	��k�$���I���3����
��TT@������711�_�ޤ}�)L9yť�Z.ih�t�����N�U~�0�+�+�5mr�.�����d��H�8�F�o�'3	}�?S��$�5a��M���;�r+W���4Q,���
b�Wo�{xy���c���DXG�9|�X��32�4�c�<�v:4l&=�4�|�R���nm��(�,/0N�@;3��$�PM4 �#f���Xb�J�
JS̡�
�eC�j*�As.Js���Cs

�+�k�N 	.�Ɇq�������
R6�


|l~�e�������C�[g��<�
�
=TS�&�ޱeú5~+�=لQ
`�tw����$ˣ�D�%��*�c�Q�r
�*k�S,]�,	���	'�y��
�;��~9�.�LJ��J���j�./�ˢ���
FJ����� "o�t�i��f�ͱwpt�T%�_`кЍ����h�x/'����H�/��]�.��>��
m�`5$��&�/�'��L����N��0���T
��Imid�|�#	�����Fu�*Z)
�&{yx4w��b��{s{/�E�d���`?�n�j�S�d�`��9P�<�%^>+��B6n���D�Vu ���*��.��/�oU VO�"4Ÿ�n͞AE)/�2i���=�q��111���q�{�&Q0ef�Y˥�%h0Ë�4��ԗi�_[nRߧ���\������H�%�#y[d���>X�p�P���WɥI�P;�Vf���Jcb��O�&1ع�ؽ�h1�܇��������BXG�9�\:�璀T}ؠ nL����d��ұ&��]b�i�Z$��t��(
,2	�E�S�р,JC�)x�i`�X�򊚒�a�\���
�4�+f�pie��#
8sL�������>��I������
[{��==�ݤ���CY<��(�AYLU)j��M�V�.��M��<O��>��
��2M/���=DLoBL�&&�e��U����䜾"|
6t��C̃2�<z�<�S$�ā\�HM���ձ '#UiW��JoO��;�	%
+!� ��{N���*gI�s��Y��	Y�i�v�*:.����k�%(����-W���ڒ�iHU&�L�4�h����Hb�1��o��
O����k�F��G�i�-!.M]�Hz ����v�oS��c���
F"[{[!T�����
T+J�d�`mgH�Nq�\�bu�Z�[������k��*-mWop�S0��^�Hy$O�އ��8��& ��vk�Ȥ��^��Y�W�T�P�Xa�@��V
+(��$&!�
�f_�F�LT� !���B��� �������(��*�Sg�:��s�}�����Ja����x��|���(/+--�+--+�������
��
+��؞ ã0�:�6�Č�a��)|���i����iTw��՗��8`�)�`�$��
��,J%!-Jj���J����
1�^���%@l�
�\�@���K]�e��|ִmظiK�%�:�U
��鋿��i
�d�?�o�
7w3��s"��3���
0�6T?
�(�2
̙=�%�pL���)
��v�jnr��P�j�¯�
 K��
��ĶΞ���'��
�NPߵ������^�rD�$�;{Z3��E�@3X��L.*��HM����t��$5a6��F���9���ȑbB�ӈ�S�Ӊ��tyu]Ss�*1�m��
8H�%�>{`���Ё\�8���@�<�?Z�
z珄Ҧ�6T��Kj*J�*͏�5C��DvG�U%��#�#�9‰
+ao����~]���JRrZFVnAa���K�)�ֵwtnپs�>|ؘ+L�-
�Ͻ�d�%�R���TbԘ��-��)*��aY
����lI��>���F$
��)���
<�o7���3������ȝ/�%�n��ŠRT��-KT��g�'>��2u�̘y��mY��m�.�zS�wR��$��N��%�p��4֯�����L�,/+).
+�
+�B�����jQm�⦥ˆp���$m�� �����L72^���ɡ��m���n�o�ַ�
��Z��$���ŁI;�I�[66�VK��1E��8�Z#���>�	K#����	V@�u��K��R���jb
��ƛm:6A=6�Y�\f;
�6�o�J:C����?�͝I ��ׯa ��#�a�i�LuL�(�͍�\lp5���J�JX����Ns�,��K��$NӇ)���
}P
�t�r?����˗��ŋ}P�
a�=j ��PB3X�T_S	�NKN�?g�Kb�R
���
��I��
,�
*a R
G�J~4N�K*k�
iB
�%!�sH�Ew���Ё�G
�e
��{�z��x�@z�}���UeER���Aw�@�"
��y�^���?�&�QV1s��'$��ef����*�k�=.1��

+�j
`��C��U��w���[��E`�0H���Tg��~|���t��R
)�T[J��~��u��kI���F`�Q*�Aa��W�V,uL���&'Rd�7U�-J��|�s�2��@!�S�L{i���D
n��%�W�&Xڶk�r \�/�N
+ѓ�D.��$D#֮;X!�(�B�I��E�

�����,,
���WV�0
�Ҟ��P�d���Wlΰ���G����`���ۑ����#��u�%������o����뵌롂\�D%Z�4�4��� ����8��
KO��t����.��g����|0�W_{��uT=���G�x�.��:0y�1��_:?D�p���ѹ���ƨ��A��Hb?5a��
�mMq`�i�L�KZ�b(I���*j���
�<*=���׶8�e�J�[��v
~���.��t���z/D|����ܹ�T[��������K\%���pLx�1�hk������Ja��x�������������چ%-����έ;X�h��	�n
2����8�L
l�4�%��Ŧ*)�����@w
��2�t�\�T�ui�
d5m�˳����g�0�UV�:.��6o�A{�&
��k���
�}T��K�d�$
+��O�2�Y�'���TVGFY*-�-����@$�����5���&�&��m��)��4�ܘ��s�2R��� 2W�&3���9�y4|��*��h�)3f�ڲT^]�xi˫���m;v��8�_ĝ�'��q��0��̢��v�T�L
+-,�����Β���K2�ИP���r	���{6�_ҜA0}�)�9(f|�V9h�n��'�^��n9 y��ܫ�3���k;{�|�-�M��i\�zk���y}���Oz;��7()�~i��U�
vV@�Y���K��K��u�������o�s��� &��#�P�輽�'�0Մϝ@����㴠
�
�qL��Ҁ-J�lE5j	Kჿ
��?��n v�{�����Œ�M�Ж֬�#ߋ#��@v]�O at xP�i��L��ӃO��OQm]�<D��S��
�fP^�073m�T�iS�	�,>��Sɚ��b�eiAZV�5!d��7��Y/`��
��Ё
7�q��
�8rXMu'�ٱ�m
BKsS����P~�V%��s�N�
������J�͇�\OQ���̸hM{�q��b��AW��{>�ZW���Ͷ
�ڼu;
+�[��-
&�
V&d
+�vf&
+�Ġ1�23J���ET�F�#�#J˙��%���Fm�$m�zN۷t��q}���L�W&�Ii)I	��-��+JFgQ�T�%�T�ѲĜ�”�/Ϟ����WXRQ]�(XZ�ac���v�"�#��V"r���5V!ɲ(UU�5���dgf����KO������/(,.�Z.�6\کQ���X���n!�z��n��&�*ß|����}�@�Ĭ�W��9댒����,�̗,��!��(���8��������%�K�%��S�F1ש~bX��R�4֕W"45�K.���x0l� 
&ю'�/�B:���ގ=|�$7�v�
~����1	
���	yi@��TTF8�P
P
+��p�
��lYJHN��]��EuM��0�� dw�(��u
��N�?����]]����@O����h�������g��	�p&<ƚ����J�GԈ4�'���'�Sg�,%�dd�Z�bR{���
��C
������yW�L�
S]�Z�TS�ꘛ���KJ����I��2�G=��\b�
�5���4V�
d���.͂����S3ȥ"���%�-L|�0ll
V,�=l�$NvI����#���G��ЌĠ1Qe��J���TY)�����J�#�
m����
�5�$[�(0Z��L&U&!�Qc����6"����
%��>�PG�B�@�DpCN�e)��-?TZ�������ɍ�w?�
�"N~z8���#'���Ծn�j���ٜ���Ԕ��SR���<���rå�+�%{���
�u�)����!>�W�&�lҮ�=�=]�?�4!@
+�ć�
+n�+��M��
����T��&����
b�OA��쮠�!��%�D@��O��\g�#ui�ƺ"���SU��;CG��G��
�GSDy����������F|  � /�H���3���i�&�N�6�S��?��{��|ϹW$���K"����^�V�p��R]י^�G���m�ɚ���
?6�#�vJ'`�ӫ橭�G�]�d
H�~j����^���Vͤ�]�U[+�6}�i �ҀY�"9�A-o� 
� ��J�
*���ؚKHI�s�r�@p��@͝}xd�x��7q�
+�4�I�7	�21���!�
燇Ho��Xo�u�vT��o�
f�4�JL�Y/�JS�bG��(U�=������dB��C��'��
�ԣ@5�C�y�@�y��0��D�
J���9�i���8�J�aK�;���1T�g�e��%Zg��$q����἗�_��TM\����E
�z�T��4� .T&ľo��d�K�
+#:�DellA��3�d%�"a�Ѡ,H� u$�{��۷��I��&����S�ˆI[�Iy`���ULb��D?�(i��c5��%o#�ĬX��q�I�����Ⲋm��\�[���N!r�C"r��&�����"0);+3#ݟ���KK���32��s�
+
+�KۈK{m.u�����9����V�w�
�3~���V�z?Y���"ҟ��GG��vU
+���xov\��a�:��Uy]�,$J���q��an,�`�Z�h��u�.�#���3�s

+�K6WTVU\��+�
�n0��QP�T��)�+����jd�Ox�$C5"
�-
�0x�$���c���������e
�K30�_D��^W��
�鲴>���(XR����$7��I��
:7
4Ay�cc���]r>�������(���0�6�V��D��ES��(E3�ΰL8&����^>�4��)L�EF/�	�>.>��#��T����������s��##2�ib����gh��G���4�q��1=5ŢtSZu��͠"�r�%��]�(�)]%�26��l.��� ��"��T@�l���b�&�ȋ�%l��Aa��1��L��ȳ�Ϳ>%Q��DW,,�K�"��B$V����I�d�5!�
n8����fR��nٛ.J��̌�iUQ�b�+�%{����E�ʶ��"��3uv�E�B\q)�E��E|L�%"'���^�R���~�@�/�������L9�(L�%e̥��%ʒv��x����Lw���
�xG�x�WioRVi/S��{}:Mq [...]
9������;9
&.A��{d <��
��A��C�C�J��!�M��Âܬt�'ɪJ�B�ߪ�ꀒ�%[U���,<"
+q�u����k.��o��^��fO���I'��X5��d�^'+��G���4)?�����Ġ1��L޿���_$3cY�
��HYdi�"DBI�q����+�I^blFM:D�VC
+#o
d���DG���*��,J���A8s
+�%n�)��
9�%r&q�qѯ/Bą�g\�-�3]�$��Q6/'
Y����$'%%�KJJNI0a�n.�B%h�
�9�Sӭ�_ܡ$f(��^����^�����8L��~��}EY]
+�5W��h��~`�fRs��kSqݰ�E�v���f�w�Qh,�H�
����
ť�.Eq]�~T��|r�K��K��8��x԰�ԴQ��l��y;��Ԏ�l���H��5��0��i���ǵ���
U�gQzKE8C-:
���4%�J��݀��R��;pa��T���$����S�Lg �޳0��z�A����Al0�ӝ
�'[�k�p��(��
�
~ib�\��*��f*#x�T�]�:0�˒eB�EԖ�v�U�?v��H
2���y��h
�2�ft����JT
�b׼�2HU
+���P�� �.AV*8�x�K�ĥ�[*�v쬩�
��U� 0��X\�8�1��hR#��XcT�Ʀ�?���G�AST%4b
ieY@�Ri�3.I��ڂ$26+�`xtM;wp���S�LR�F"
_��&�[��]�B�#��s��7�����KX�����
ɍ����~j��N�ϖȩ�v�$���&�z��Ą�����A&O*-4�����|��t� e#e'G�'0�1ݸ9u�B�݀�qߵI^�?e���>v���	�oTG�{�
��Tp�~"i�*��9��|�Vb�>ш�����/%�S��S@��T]Z���5�X>h�y�D=��6�X"��`��i�2	��I��퐎)
�jd�J5v��c
:i�c�d�$�I������ol&�q�`��(EM�=s�/ #s!�Ht�9�0��.,Q0կ��Q]�0��d�m���ӧ����'����~�����:M�
��<q�h�N��u5;w��J��	G��L����
L�	Ӫ=zK��hd�\.��� [...]
+*�ŝ鶉&
���Hb
+OP댔����DŪ"�Ͼ���
��ґ@$)Ic#jC^�$](��`m�$(�diL��l	1�(JN�#��$�y�]��b~��]n
_Fa��|k�%��fD�E<� �I�Et�E�j�hҒa����J&$��[�vmll�ڵqq���' L^&�ʂBťj,T�I���=}6�&�^���J�&e���?���0a���
/o��:��Up�3
mVW��Z�$�D0Ɉ�����ݾ��Œ��y�$׽�u)ui�*;���Kȩ�\N�D<6R �iTi�E����[�t
���S5�j�#��܍GDBpވq,��u5�T�+����B\�4��4m��$r�C��v7 ͽ
a����`�x�^R]�a2b��D�ɓmm�_�)~��'į���m�v�h
Z�譎9]�b��^�&
`�*����<f��x>���R�
+�
�JT<bPj�y ��<��
�8�����p�lU��b%U
W.W�^HAт�l�*,�U�K���#��c��X������
+�1�MN0�ɆG.�Reb2�3ݜ2�D���Xcp5�tF���/��ǿ��FD#+��i⒔�s��5�W���}{�&��J���$v7�b-2+��PrL�j�%+��������A��K4=�Et��|�E�I4�D���{�?�x�a��XV�b�9�ű�d��%�H�A$�9!Z�*U�خ�X��vv�����0����u�������7	6�����Wg�����>ץ?
�ůڹ}�c�T����������zY
���=&ǥ��RS��/ef�?q���?x�3����M�*�2uw��S
��V�'Y�����\K��
�6m������.δ�����v�rL�2��r'�l�.G��a�z��T��~�Î�d�y�
�4C:?�K'����7��O��]����+��hTj��
ޖ�$a�5Ԍ4���i`�l8Ņ-
+��i�:uzV_�����0�w�ԩ���ӧA(��§����K��#"�~՛t�Frz��Z�RUyiQ��؄�f�LƏw
�	e'M�m�8-.tHl��d
��<&����1 ����IԯH;(Iu��Jgg͙=+
���'�uI��J�^ye�ϥm�%���01�r`���]geB�&�`f_?��D���H'j
"�ʨ��Pj�'�BR���'��
+K�����bGB޻�%K��+�ڮ%����k�{�n6&�ܐ��1q���Q���i9�13
+n9��NťU5+�%�M�@g�w�_�]D�=��P��"Q��L"]a�S� ���,����(//�+/� ��	&&�Khp�z�
/`Bc�u�B|2f�M�NnRW=�H����� M���#����i�P$��I����YB�z1�D����/�)>������\���R�u�5+V�Y�q���ԉGR �M9 d� �IG�*�H=�ܽ�K�����"݋D#Y�㬠j��oK�8i��c���s�7#��0���U�� YP[�d�C�!��>:1�78844
��H}�fxR

�AnG�wv�h+�X�I�d� /7'2a�EQU����V��VL�	�@>ڸ�v�p�<���p����y
��<ȣ���}�G�?�-ёlGs(-��,+)�},$���4-�*�S�\ܣ���B.6��L�ؗ.�2!d�L�}&/E�LF:OT��H�e<��j
+fFY	� ,:��������޹Mqݼ��U���
�ϝ����դ�IP��I1��n�=&�_��˒܊�*�K�E�kj����E��E�I
�D�S"}�H�JġV�|CUU%�TZRRR\\�?KK�@�*4���i��4l�4�
��Q�c���&u���!m}���dƈ�ݒ���}zɥ���[�_�1)���8f^9{HŒ���.�,ʵXWpi�v��L<:�L�΍��
hi���oǖ�
<�o�2v	qA�3�H������?��q*��ILE�M�6��]�
Os,Kta��(�Қû[�v�e58�F#��`�}}�^��c Ԙ���|��Al 䆖$z�Ph#�7iJq3PN4��O�dY�BF�LH���讐
�
+R�@z8�c��
���<ze
h�D�$
+�ׯ(��Xu����J�SS�Ҵd]�h��ω�d��Z�&��'��>�����3�#hz�ؤp�QcT�=��2�|�=5E3#�DW���/bj�{ו�,I��"j��(/56�'$���Da�Lr�6QQ��Sr
+/B˒������7�n��&.��]Doo������H�HD|#tl1"�������� �LU\(�r�p�.N��~�0]��+W�3b���G�I�e��O]�7O#ct�����4M
�W�1�$���"��f�Xcj^Yw���@@a�3�����u�OR��%?pؖ �s��kJ��2����<)��j��₹S5��Hn�t�jh�0��gҸi`�i`�\��Ҵ�,9f9P,���С:�	y���ƒ򺺺�'J^o��C~}���
��	 An4I
�5�q����	�{WMX�0�J��J^Yz{F҄�-�>�����
+�H��6��a7���yt�� ��5x�đ�֦T��JC�s"JUi��ʔU�+�=p� �Ҫ(^����j�`��i�;s�ϑI���$��Db��D�Ag�(�ēO!)z���fB#�
+�rʂ�H7o\�fDҒ4zrD}�H��5�wS`bmT�
L7&!�-$�$����R��&e�
���%�u4��Kr-)�zv�Et�L"za�-'���������&
�rX%�4��6/g(�.\��3`�O��]>�v��%���O��^aV��><miH�
n���Rܽ��.J�'�R����΋u�O)��<�KL��1�v.IH�;e�n�6�@3Ϣ���5���
��dG���I��
p�g�k�A���'����kq���g�
GX*d[�f���N����Px�mm��S�!y��O���ڡ5�/�Fދk�P̃׬rMI�47&<+a¿
�RM�mi�\�(�WH���j�̣c�y
��qP��$�H,�<�?
�H���U�-�J���.I�3.�KrɔE�-��I�60!b
��Fc2��nP_�&S��
�� 2 
+:�о�ւ'��;j�)UEYAW�8�Z� ��˗�H,I#C���5�I46ї�n�NS_��b����G��4բފ�������K����#Ht�[ߘ�����]D�^���Hڵ�'��JaRA~>~X^�b<�c	�D0��B�ڸd^�
���4 at 0�~x�����b���a�&�2mw�^����s@�~{M���~�;y"N��hL��,QT�/q}A�֘��W��T,y�n�_��|��`��
��@�0�dڬL� ��;S:��.��s��2
pd).V��8)<���t���$
ե��s�+J�JS�2]���,ҖJ�%��n�#�v�!�MMP^ss
��wP^k��C~} 
Zkj�'r�C�}��e[�H��BI�Mx�����	��cj`Bӣ��&�m	�q���
���H25�Ӂ�<&��c<����¤�ǐ6(Yu̠t�&ǮK�����!��Ƹ�0�� &8YO�d�Q�3��I��Ĩ1�
��Qi��ȳ���)�a����
��	�D[��.>����/�I

niE���cR��$�D��ŔDYBp�v��@�ċX�n�K*�E��?�BR.�EB�n")�]kV{��HZ�87w�����$S>J��j�J�
��$���I?f|
Č;��U��Q��n�iŒD:�Y���Wp=g��
3�X��u����Wt��~$��
���#\*��d�Ć-�ԁIb +r ��H��t�9�
�k�yshs��!.���q ?��i1N�5��w�Iii 9��|�
�r ��͎�A�Otα�l#�v�L
�������5�>�
+�R�߻w
D�ޘ�Tx�!����L�M�uS�ai�gB�
��B�ky�;l {l �n ��c�̃�<���Cd�
(��Tǐ��
CMb)�K�-�\*�m
�҂�Ց����-p�����=��}J&��Yq3���)��W�il
:���J�O>�w��]�Jd]AX�,=�
M-"��Չ�}��!i��\�6N���ԇ��¤�I&�Q�2��w��Ҙ��x���ͻ�z��q"�H�I!�E�Dbˮ(�4K&�-�qo!יG��B˸P�V���{$����%c��x/ӯ*�+��šFD�
q�Q��

+^DAA���NE��Y\q���&i��CV�����m���<��^��^x>�
�~�������46�V����O�W
�L��U
Ó�>�$:p��dd[ʡ���L����PZQuh���?x.5q���&Ƀ�;v�{���PUY(���������2���GSl�_i��3��[|^��(��F���{\�
+�����$ާ(�@E�
2���
��ۥ~m�t
�Jq
+�q�Xڦ]PMG.1�GO��wb�ɩ�
�Ob?��J?���jS����H�
+#ؓ�lP�/�ŧR
B
K�i��4Q��
+�`� � ��1M= � ��1�`KBg�
{J�ܐ�Sii�Jme�*�9�1FkY��3p�`��n���VN&�
d������Mp�Z
xB�I���~��
+���%�~C����W4�E����wR��H8�fo\�z�I�>��J��Ⱞm%LJ�_�C)�R8�X܈%+*���t�N7b\7b�6�	!<:g$�Ez���$CRggGGG{�����S�0q�{�K
h���u�i�
���ݼf�
5�}6I�Rg
�����sm�G�H
F!��?p�M�d<��D¤-¤����|ju����Kb��M2��%;N�	*�� ���
9�@&������
��1�sӘ�&��HJ
q�.r
j��U�
�H�}jg�
�=�ťj��9Q���b,�J�\K

�.��%�Eۍ��!��'&�Ob?{����� |�ɣӰۈ�M"��}��(�e��RSc�2z���ŠҲ(�D�F�
�%�4�G��C����^�1N=jd�@�ψ,�+�k��2(ŧcz*���\Z�s����d���Y�8�zN Lӗ`�+�x2)�
I͎�d�)��'I5�
F��5<�>���
+�b���`,ϣ���H�
�ukV����f��K��q ɷ��(}�6����y&���D��cI��Òkn��~#�⍨��JD �E�R��ϱ�@jkkkmm��	�
L2�]ƥCG��=`�����n��0�f�Hj�?�Ir�:N��8�t|?GmB�[
��:g�\K�aI��(npƤ͝�[�'�C��}��@��4F\�\��S6��r�J
00�w�d"��սȬ�t��w�����J�O�k��᧭�UNi�ێgR|��@Â
Ja���@��]�1L.ɂ���S�ʨ���O��l��'�h���@$�"ؕ[d0�G�҆��A�e(գBK��jxYBs���B��y9	���zD���޺�K������O���|U�%�Q�p�WkY��T0!�`.�2�>�I��>�&E�&��c�Ě�L��
^K
�&��S��*ƙ�
+�2g 1�H$�{<�.M�j�dH�g�D�D����v̤�n5
JIok�C
+X�F���N�y6�LM9���Tl#����R���� m�ׂl6Lz0�@]Ѱ?ʞq��t���x%Ӝ�Je���$m�~x2�l|o,_���41�[�����3���0�>���II]_
7���&Q�(���KI�k�\�J �f
��ށ���Lr3�V[�G�������n�
�b�隧t�=I�� ��8`	
߽���b��q��P�cWIa;�%5
���7\'�%����&���S�*��>���F'O�m�L`	:����
)B	z�\?
�zPkH,m���"�{����D&���1�z�z�` �R,�Pj�I)]%L�V��s�si]�%:K�@��Y=G�1�eR��] j�]��g
&����&.���~F���O�;���@G4�F���&o$I���8��ΟwHB�	�si�(}�6��TE��X
+�ͰT܈
���t#��()�"!����/k��^KK
��
t��ɸß�8�x0͠f����,�(_XX�N&i���?d�{��Sw�"go����I�d���2���ە
x(�P�?�>����c.�@�

�F
 �Lm9��L�k���xF��쪻�n�?�G5N� ��6$��V�Ʊ
؁�0	jYX�@m�d��`�ڀ%3��74�z�;�	֓74����q��� y$�	|��Q-~�hoM�.�E]U�q�xyڍ�k9�
܍�M�>
+=L������
=Ѓ�g7%B��Wƈ�e�Rl���}�K[c�Y�`��?�`���M���L3;��_j08�{�&��$�~����s��^�S��g���ytG��PS"M_��$퐄�>
�IqtWaR��E�'2�����zm���t#���
R�F����6�Y�[-�;�a��f�}�� ���
4
��1�Q����KZ�Y3�Mk��y:I�2~�9���������sÛ�����ܐ���
+L����*M��P�ZRu��k�
+�ngTp�j
 �Κw.��L�z4�<
�y�	�&z^� ��}.�
��F"}})�22�j�￰L��-f(N ��!��
Ē��h;�
�$֓4>B���>�ߓ���l`���`0I3�AK��?�*��:�
+R��onq���|�(�V=��
�>?GIQ�'��tK�(]�Ғ�s�3V�%�|���xK�$�(C�S2I�������g
4qؓ��L&��I���O�]>KE8�`+�J���
+@����撾Gw�F�$
����I�L�tI��a!X�����ҹ�
 ���	�ƍ��6���f���a(�����55�H��x�]�?E
�䈀i�����S(�:�d����(����=����|0�ᱫˁ;�d�x���2�=gR���p�X柆?|g����@��&� Q[N&���]b���:�<�u�%.�
�A�C�����þ�
A�<ɚ���?��DT*b��i
W�O
L�;Y,�
�^������˯��{�#��m�1�ܺqC��+bA�J
�]=�ި�V�K�L�!�	l�)�QU�Xr���ẋ��5� %$,���G��=��".�)�Z��v�~�Q^LR�e�}p��j�L@
�I�����1%>�=�גǿ�D�'��fb���
�����DBۻ�4&D��P��$T������
�1Ií�n�&�U�C搸��� ۻ
����8R�}��E�p�$@Z��hR0�
t�C�gp� ��3YͰ�dZ� m�6K7����Zh��Σ�ہ;�%�g�L�]bM���P�X�?y�+pIW���Am
+&U'��)���M�<�VxAw���~��
�8�R����u�L���X��
��^�SXM�$wy�`R��x�C���@�
�u�?
1�#�Y���G�H+�.��K
R����h�ޢ�6R�� ^��
����	�؞x="(��JŹ&u����KY�ޥ��B��\e���	�l
M32���H�;wa2q���!��?��,��h+�+��e�s$RM�����z�Jꎏ�,�ٷkfR���b�dX
+�
�m���
r$q�߈�"
Lm�GxJ�������q���a`���O2]�*�`���$m��=p��o6䢟�O�zEf74�&�>���

]bu��W9o�
e�q�Y����Ŗ�- `:f�����:��Eց�E����t��Q��H<�"�Q��v�YQ��L�.�Ej��!�s,�*�y�V&I,�I�$���
��`������5�v�*��ZZ���%�RJ
L�"�ܵ���9顢��P.ȁ)�-��e�]eu��4��WBI�`bI�THËA-�JWYm��Z~�j��/�{f���/���t#�qy���}ͮ�H�#�<�N/]J^Z/e�5���$&��O�c}3	^�&Z 
�Fz"?f�3"����?�C��7��\D2W�ʅ�-���#z$����gFI���Rs���1Sn��gh�\K�݈��7��D�����HI�t��h�˴fPS��Um�?�
^���yZ3�*�(�qY�Ib��`za|<�0�_B-��:���m"6������m� [...]
�ml$\ȼ�3)M�J^Ky
q
��$��
ȝ�@L
ȃ�<�xB��歔��T��˺_o�b��b�w��t3=�f��/����A(
�h�k��g��Pe��d	XD�����J�U���������;iX�	�ō���Ԍ�7�c��n�'��}1�fםm�$�"��_L�E�dy��y�>��>U�K��ɮ\�v�i������~M���n�:��
}���VI�?���^�I
����A�ZWx�6� S`��~�L!����7���5�7�����)�O�
+3����������dŸ�h	�i
K�yȜ�
ࡋ��?�Hه����7���\��Y�1ӣ%~.�R1�@�M ����P
tO�I[)�<��W�\���V���
$3
95q����~x�N
�(
�Έ4�_�ȿ��oނ�UTg�+���hY����Օ�r�I]zB�"!qs�7�x#�Nx#�Jd7���v+i����	bZ�������)ì��[���-��s6��Q/��H�����e��[i�I�]�+k]����%ঈ�Nb��א�T�ΟEj;v8,q>�,�M�L���
r���p���5q[W!r1�)��
e
?�1�]G��>X���M��E�4�0��K)�Q��R��G
�1�a��@�LJ��()9)./e �]�ɕ��b����d᪛������N�� �ڏ�O�Z~������V��(��J��F*��IR܋'u���^���%s#xW�nć#ވ���_�:��4/'���hhW�i�a�Y>?�]�{�L�
O�G~T�L�E�N���-o�'M�K~>s-/��v
:QM.o^�l��g��;�����2j(wߵ�dr'�u sv��-lw�]��w�@
�1������O�lD۶��[Һ
���ʣ�i�o�Cߓ<�
+dg����`%�}�#Z�R#��^Z���n u1�2c5_X(4Fv"=�e��4����5!��2{%6XB��NKFrtE��[�?��qRf�Y�,/�7bc7"w��1�xI����
��rȚAnzY���2ニ���G{�7qzG_x�fKi�};i'u�s��%vCL��SS7:.�<w��{�t�璚�{W�
��ɜ4��v�q�+Ž�
�[N�>�����l�����DI��>�<�\J�����
bW�H%��c
������nIϷiyi�x�Nzð�t	^h3��n
+���kB�d������Xs?
D�S��+�ً���)
+�I�b����2�mGX��U�4�
}�Q\	#xkCk�XHFŽ�fZ(��
ޚɮ<ɗ~�<�Wqx�w�����L�R�
��v�D��
|
+zV�r�� IۚI�&t�
:LN;�,���
+DZk��5��y&�'d΃��e0�n!�n7a'��
�	g{�ѿ�
ڀ[T� ��:��0�L -O����$�Șy�~6%[��F�u)ud2�K
v���/���.c������M"'B
���f 
���?�_KP1U��6�@V�4زF]񕴵���*�ᤁ��������ܮB6O��ڍHߍ{��]:QL~ѐ
ވ�j&�����7q�:�4<;>Y&�#�ޡ+���Ռ'|ߞ�q�K��lؼ�i��Zt�:tL�/kGb��x��ܟ �dž����#�)�-+�-n�%�ԃ7�G-����v��e,�2�?�o�#
�Ƽy�:xBy�.����@���6b
'	dsS}-ˣ�7fe�����RL־��ɣ�W� �?ڶ�N�1@(#�^�R��Ϗa� ڌ�B���B�Z�Ӵ� W|$ɪm��?��q���wR����	���nĚ��[(�b:j&3�b�1eK�]3x���|
'ɣ4�6�ǺM����dW7Jj6�9p������%��Žbڎ�쳙b��j*�)��Dj�g���Ps7��m�8�W�-'M)�:t��C�
����6�F
t���Y��� ���ˤh��G塪���0����?Y
����2�E�
+/��슊IVl}2��/�
}��
��� Y�,`���y�G�IE�"�@ۈu�F�J�N
lY#	]�kII�}jU�FB,�.'�ln�F�F�N
�,/�y�w�$���fܮ��i�<H�d����:����8��d$���l7�9qRv�^�<����H�w
:�":�stb��;d��]׸�H���w�>Pω�f:��$�;��	||����묣5R�E*��	K�������] ����P
�I
R�Ϥ�%�b�iE��.y2��d�S�0�� z�@j���	��T�
+2b�,"+��FH�-6�}$)^է�&Up����bK�ۙ��n��ͩ��qb�vx#��=k��hK?Iw�h�O�w��Qwu��fٌ��p�$�T���ja���슙8ͻxΌ�;
�^�fϬ
+�e�x
�
'�T��װ�0����1{r����[��
+�(�ͤ�ԥ�<�c�@\
�?yuA:�w*���2lI�q��ڇ2c�����0�S@,0 cAAQ�Д;��G�2�
+m&\Ѧ�F�J�N�RC��#i��U�Jj=��pR�\��9ob���@d5!�n��r��
�0͞q){�]�
>�i;�<�4J���%
��Q��ȍ/-�������fg
����ԝT��Vg��W��:��>t��k� �"�r����5.͹r��|�Rg��
3x �ɹ2褿��EHd$S��h&
K�B������8�˧���R*�y[@�@�g2�K��XL�2�}�
k6�
u�n€X`�Z�0#��Ȭ�#?} T,#�*��d�Ҥ�Pj����֩��4�j�B�5B��F8']�Nj��sՋ)Ve��e>I
e<����b���UR�Ϗ�f��S����= q'5u�S��~�^��|����h��Z�Le�~�Y�~
pb�&�~��~
������K9�@�-T�r�@�<��{�!+
��b�.�2�b��MB
�d�2p�)����.���
+T��,&K����
+%���
�Ą
�y�Uƺ�ݍ��/7�P�Ӝ��Ҟ�i�5���׌b�:Js�������#u=p�
�������!^��$1!m1����nD�#�S3p���n���r߳�l35[�H�_[�酪BK��%n-b41��z�Ί?տ��/
+m�[߆;�@��o.�c�@��@�]u]��}���*�mް�L��ď&�K夈I�3&�v����e"��
+͐ŝ&�^�Hu%���fjZ�����rD�KD�I��1�y���i�5#Β�d�
���3���^�M�b����K3��As��O[�g皚�mu)�Nx
��.b�ܝ�4��5��f��|_��x���o�Id7�'�i���i�4(�S�,}^r�?�L�˚)�)�r
+�1c��%��G���W�V�++UZi�HW��N�I��ܫd�7"�zNI�<�v�4��ʚ�[�d
e:e�)��qBj�C
�Soƾ{��'�:�4*:��+�Xl2j(��4��[�i%�C]2��襳�w���y�+��u7�y�
H=��@N����p1�f�|%�a�1F�e
Z<J���\e��d�}�@ВN��]�jw<-O���_n�m�P��v���æ@�-P���ɮ�۹��HI�9��$�3��P�g;"�!4D�� ;B�$�j�)��ܬ�DQ��\|�a|?�\�������+p5ӿKѡ���j���$Pi�Q���؅nJ�-Tx���7͜�r���56�!
 �)�&,��
i�TM0G؄����D�M��`�t��a�rd�B��
+p��Jj
+�'�3 at H�
�I���L?g�4�Df��O�
��?M�B��T�{��H���Uqۭ�c�}��3�}!�F��G�I�sަs��[���E�m_o2�\z"�Ѵ����$S��L��@5�y�?`a
��1WP4U���&�`
�>
+3
7҂JZ���^�fG�3�UIګ�s�

��1FɓdQ�������{��H%�-��F���������M�=g�}��y}k�f"�-Uz��8�2�ǹ�����i�8�uÚ \��b5E�<abs=͔9ξGؒ���e�<UV��b�B�	�u�
k�6�YDx%	�&���!>��Q�Z�H���p| =^�4q��Ȕ�����AG�
b������ͳĝ
��ܡrZ��ȓ�ۡ
9�3��
���}WW��Jt	����s�͔�d�+�VWX�,TH	.H����M��!� �u�37*�Yɓ�Y�?��٧�;��\��*;���`߿�����J�0yP�3W��Ü�?^:�q����c�1� ]
/ϗ,��!�%֐�ܥ�]��X��	-��k�J������\,N{T��(�$�>@~$��^
�[��S�l���]����
m'�k�8�����ԡj��q��� n
�
+�–�Ԑݐ����#p�f"� s�͌9�<fAQ������PG��B!��$���f�ݎ0��,�b1M����A�I���
F�H�J:�d�$�m�Б�.3\�=���
��Lvyk��u��!?:bL2?W\q�Q�a��
d�� 4�����D�f��Dc�4åѵ_,��;��	��`�껥4�c�

3�sIf���
)��>
���F~���\;���l�|g�8���p���YM �h��	�b?�=m3C�I&҅�i,���a�L �PF�����-<�d�6�K�펨�l��0�1�*�J9I&#��8����Zv��)�]��>�ݟ�����[/���6�~t5DYډ�2�� a�H$�)]��o�%�@Q�P#m]I�_�w��'�u���T�|�Ó�N�zv[F�\��H�|6��lg�/5���k4����������60D[��L�/,����R��3h#�G��2����1�j�#r��Z��>ʨ��EI���ӄ1ﻒ�j�Y��-�{�1�^���覽����
!��"Ӆ���	�E�iD�p��ʃG��H;ҵ�U�vu�
1I�%��
�k�qb��z��6������m������Ԛ%[{�6���� �
WS�PN�1@`@���+�Ef��H{l�mv¢u���Q)
32I�ħ��lMǕ�l��w����c���(Q{/�Vl}��X,���,#pO��QD
4ұ��#���ޭf�'Y�_.��f�L���T�
���<�����{
��~�W�I�&�����5=���:l#Q���֧�iDY��
O�N�[-��^�Rs/�

e��"�݀�D�P���
~�`kЕ�f.�������v��,vDt0K���fo�����XM08�e%���d�F#�ЂcFy�j|�^9:k�YJ���

��
󅺉2&�_���fڀ�V�
+ɲ�r���E5C���O`��3H�ڄ/JX1g�m��Z����GY�dI|O
^t�;J|"㇞A�
�i��Hz���{[q�*�ru|#�Y��
j���%�%�S�4�.�[�T�$�Ҽp�Ǵ 
��%�?��CO!�123�DƳZ��:���^�
j���2��,��AV_�Kr�W�&�
j��d��X����D�m�
�߹� ��O�
endstream
endobj
281 0 obj
[/ICCBased 295 0 R]
endobj
295 0 obj
<</Filter/FlateDecode/Length 389757/N 4>>stream
+H���uT�K�tK���KJI,��t(݋�4�K���%ҹ�H�4J#�Ғ�(H
+w���q�y�y��~�3��̙g�<3�� �Y9El
+ @� ]��!O��-@� � �\����+BVKK
��:�
OX�~�����WCa���iHKL ���0�q�Y���	`�5 �c����k��
+ X�] �x=�
��
�8����	�X ��Ŀ׽�>�.�f���#aP�����
�n�		�D^{y8�����	
�d�p
H��	st��:Y����׬c xc
 I�V�?S��!�:��_����
�9[�YbQ�P�~�+rA
+S�h�����Hh���t^��

�'0�߅�™kY�X��Y9�Yq�q�p��l�'���W����z�E����E$�%
D>,��^|t*K)�%/�`���\�ҫ����:���&D
�
���[�7��dplDa5�|�mb���4�,�y�y��{�e��5�
������������3��
�⚅,t+w��h�l���
��
��A

��
�	�
m
k
+��xYU��
�H�&%��Ȥ
+�q��O'M�z�3�K�T�@v[NUnn^\�o�]�a�b�Tr��t�l��mE]e~U�+�j�א�Z�:�z��a�q�i�����5����};�C�S��������[�\_�ۆw�����C�a��Q�1������;>�L$Lz}4��:%8M7�l̎��Χ/�}�XT^�]�X>\�Ym[���n�!�ycsk��kƶ�ʷ;��v{���p����I�s���0���X������ݯ�3�s�󝋒�&�$��W�WW�*��)���!�$�$�%�!e$c��HNOAKIMEq��������
�����ƕ;KL�w�@��Y�X;ؚ��8^�+�Dsp����f���K�O��TC�P�p�J%���D=��+�+���O%$*������������8�I�Z�\�Z�^�U�K�_wL�������"d�x�����]�}����� �����>�9�=�;��s���_G�8/�̹N!G�z�[<�=��2�|B}����P�Q�z�l�H0Wc(E�e�n�|�P [...]
��kJХ�e����J�*�+��篍k�j5���U���[�ZU�
��h��0�|�e�m������6�]B�@�`�P�p�H�����������?QM1Msψ�*�iϛ.��Z
[JY�Z)X-]��R�޸Ѻپ���w�������?��@��?��5� ǖ'v�N��g��
��
+��W������3�g����L�C#u!��M�M�M�E�vAms˔F�V�N���A���̝GL�w�A�̬,��l�l�ؿs�ݛ�
���n��ͽ����+���!B�²"��<b��4$����݇kR�ғ��e�d���k*�J��Y*/TS
'<�S�V�҈ԌЊЎԉЍЋЏ0�4�2����?M4I~�f�����s-�,󡅰"+�u�M�m�]�}�C�c�S�Q�\�R�Z��s�v����
������G��i��H����3G�F�FaG�D�Ƭ��č��&�$V''g�$�F���LG��˰�4͂d����j�i�kh��C�f%V�Ne��Aq�YU�ڪG^/�
�Ճ���
��[�Z{�Vڱ:�;�`��=�c}��n�K
�
���Fv�(ރ��> 'R&k?���3�?�4+:�6o���
���T�\�ұڿ6���������V����ʝ�o���F?L����T;�:�>�::>�:�;��eq�vx^sa���wݥ��ʕ��'�_� E�F�O\D�K�LtAnF�F)F�|���
�ԭ6�\�`�@z?�m+F�;�L�wiA h�y���͖������)���M���g�w�~_
�@���ZH_XA,�"F)�%�/�*9���a�Z:�Q���,\�B^_AU񡒀2�
+�*����'[j
��o5[����uR1u��h`f�m$1�xJgBdr�l�t�l�y�y�E�e$�fe�g-g#`�dGbwj��0���TOC9;��� �ܨ��ݿx�z6z�x��8��I����P��=A���!.��a�Axۑ ��ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������ �0�@�R�f�zƏǦȾ�����
�*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{����� � � ��T�?�~ò��~i��~L}��~cbA�~�Da�d���
��~t�y�~W����~O��>~\���/~���|�~���`���C ��x
������}%��H}
�1�X}%�z��}K�
��}��
{N}׋<_�~7��A�~��-
ψ��|���|��Dz|+��E|[���s|���z}
��^�}w�O@�}��-�~ċ��	{G�u��{D�z�{]�Ĭ�{��f�{�Zx�|[��]�|ϕM?�}R��<}Ǝ���z��]�Yz��Hħz����|z�=��{L�Nw�{���\�|=��>�|��v|ېI�8z/�r�
z�;�bz'�s�Mzd�6��zɬqv�{D�[�{��0>
|;�
|���
y�����y��a�Iy��?y�a��zY��vzݮ�[{^��=c{Ф�I{R��*y�߄��yf���Uy`��Vy���y���uKz��Zi{
��<�{z�%�zȎ���~+�~� }��͇}W���0}3���}HtЄ�}�Zk��}�=���~���z��ɇ��� ���}�����!�~����Єd�*s}��Y���<9������w����p���S�w�u�����������u�VrU���W��؈|;,�뇔��{���R�s��Ѳ��������;����:�8����q)�P�CV���
:4�.��8�����Ȅ���2������񡂡?�U�����p
����V�u��9S���
�����c�
�b�փ
����R�����.�ՁN��n��	��U��38���8���A�/����ͬ�������δz��6�߆�ө�n1����T\�e��7݀t�XT�� [...]
+�\��l�G�N��ػ�ځ��N�ā�a�5�t��N��zl�ߴ�S<��H6���*���<�a|��k�z|C�V��|�Ǎ|����|Ik���|�Ru��}26��'~2����F�-����B���*���o������������j�����Q^���@5z�I�`����ٳ� �$ĝ�"����c�ߘ���&�U����ij���|PJ�ˇv4v�y���V���G����.�2�{�������
�����萾hS�掼O[���3��Œ
�(����J��ьx�&�$�Ԟs�҉h�
+~�2��gK�>�-N}�o��2ن
��
N�%��է�������� ���>�w���֣A}⇤�\fX����M��ݘ�2,����
��K��Ԑ�3�����g���°����[��}
+�0�e��6��M
�_��1��
�?

���1ӣ���Ǿ���I��^����I|B�̯d��ܪwL���e1$���:
������r�W������]�
��1���S{��z�|di����L
���g0��\��
U��������{[���G{!����{	�ޔ`{&y�E{xbi�e{�Jr��|�/c�5}~
+~���:����f�#���������M�Kx+�C��a|�u��I~����.y�W��	ώ���әߎ��
�%�¡唘����[��w!�^�T`����^H��*��-�����	5�G��Ȩ�瘎��=�Π����4���r��v����_�ҍRG��f��,ދ̋������|�,���ƕ����{�
�����Ҙ�t�ٕ�^��1��F�ő�,;�'��<�!���_���������Y�l�~�J���J��t�S�#]����'FA�4��+����;ۊL�P�f�&��ɔ��ޝ������ը�s@�夏]�0�E�����+:���ևSS	𧠨��jVPp,<XQ)�XVl�(Js�&�J!����K{�@B��E�.
�e���WqQ䆓���~3��7���F�HI^�\�������ӡ���+j&Y���b�dML��
�{#�����)F���A�;q��T0��_�
^��9Iݤ�xֺ�ƢYFh�9Յ�hX;J���l�����n+j�ġ�(�m,ּJ�����(Va�V/���aؑ�@�Q~.�8_]���7]�������
��g�|�F�)
-�/��MH�|����P��8�%�oFx��C��<��R�l�
A�^����Q�l�
�z�rJAU�U����d*�
���N�$i܏�
#�v
b7F�*4ނ���
+
���pv�i�x֖�����I��o�����J۱�#�
+��W��h�ԉ�l�"�kx
wVjG�Dz���*��ߜx�W���:Ʃd��P���$�����j�4W�M��[��,]�ʫ$���W��$I�&��N���}�7¨
s������1@�9�TɎ.�E��zN�Df��*uwr ����	�
*�#����,�h؅��"�8=���N�
�%�=(�p���Qu�9s�Lӓ(�&��w�ھ�?��ER
�AHi.R�~	Ԅ�6�����:�*tД3*���۱�x#�m?r~3��2�+�w����p���6�yX
a�TO�#��
+U�¼<�_)�
I�(��}��W2S�X U��w����
M��f�_T�)����?k��YYF��K8��u;J$��þ*1T� >,��#h�%T�,�Qۥ{[��s�:��9󅼓�&^!Փ�a��@�!��"
y �
+��.��Jl6m�Hj�u�,b�U6�+s��
�hܸd�-ʥ�}�wi� �-s�un=0�Ľ�i-_�*)U��_ˈ�
���b$
��na+;ϧT�
;p�pA7����C�4��.*�Iߥ�a�8��M��m�.���ACi���7�\j|fi������ԫ)��]ޭ�j����ʄ���U�]�3(í�
�wh�J��c�h-�4x7���h׿*
P
0�H됎L����랇ڡu��Â������,�{�Bz}��8�v�g�g
�Ҳ�d[�!XTZ�Z.��vl�A���g��
+{;S�
m�`v��ؿ`~�?g�a.�
+3�Ì�{����L�^�������W�����Y�e�4��]�L�<pq޴���������k���!��G�
�]�
l v���:DeH��Xq��E��K4kHoS|�X�ֽO�7����o���*�*�+ ����2���h�`���?���k6ݤg���,�M{ST3��`�b5��XE�#*�і}�
z�#C�//��
���7��}��V;�9�T��
)?�ވ���2[�ُ�]�n�$�~�
���f�Ќ,�d���p,��B�AdrH��]`u��P��V�k�aEV�vYN��U5/y�fD.�ݡ\ �1����Q�a#K��E�:�|��N[k�=�&[],����1$��ξ�B���0Y�(�ߊq
$���]�!{Ik5�U�3�j�=Or���)�<V��
A
8H��:YjD!��L_��|O����l�xE{EY[��9��#Ev�x���2�E��as=�[R���Q��i��*��i����66�`�����ώ,��+�#�,i��1����A2��� @������ƪ�W���m���H�XJ�NP�+�)�̧�+��=l��$�zU�kb��]�i��[:��<�旰��A��r)<�� ���+e.��
+�%���ӂ�B�s�W�����ď[��~�}F.+}W����t�=�� 
+��K�e&��,�^��-��v�a�(0����

�t�tz�S���w�0D��6j��tl��.\�lVդ����)��-
g�	[ѭ�'��x�|�|D�D�ߵ�����v��wi���8�ư=�݋�bY��
+���TC7j�KI���X�7 о� s�{��W|}��&饷MR����Q��rs�%5
ԯ1�G��
�*=��V�DM� �鶢l���`JY����Ke���\
+��kl�=��ּ sr͌�
+����_L� �\�E܋ʮܤH)�B���"�nĕ)J�ۙ��3g��Y�i&M{&MʹI��B+!%��,O���=Y>7o����k����!w����I�~� Ir�a^
=�C�#Z��h��`W�u}p����)��"�z�7ff&�3����$��
�F�����J8Ҷ5���m�
+
u��R�_,^V��S&�aR�~Pf��LL_Dw��*��`\�-�9]q�����
�
�
�����T�I�6)�>u6	D�`e͢/���xq�Y%�9��ʜ�;�åO
��
d\˾�P�&eR�z��;�]����.�R�<o��Ρ�]�P{?�:�
r̨\���ʻb	�Ҥ�3|����m �s�؟���W�9����oZt]Rn��
Å\�c�W�#+�n�I&�g����y��Ajs�N�06�HiD����'@����J+
��a5V~�cR�I��̫�vwtU��c[3+?F|l(��i��U�����^+O�?R��s����� 1�Hqil��$Wþh����=���(�RE
+��1�B��vџ��n��F/��
Bs�G�����M�Y����9>�ܖ3��ȗqI��
ڣ��5����V��_�1ȣ�β��i��JiX�0�WV���H[8g�� _�/���
+n3�
`�	���38A.|�f|ј0I��6�b�v�%�&� ;Y��㿜�҄# �d��D.)��.p�'��3�J�12K[D�uɥ$s8�I<�R�i�m�J��8�}��f�� ���DJ�ƀ຃ws�!�ʫ���r��RX��
-\y^�*�̏Ld'�雲9?)

"�q��^��5�/<4��i
+��Q<����
+��;/��Ա�JB"���7��t͚��,m��Xdھ^�;촞��&s�`�Y�"������Y
�����{>Ɗ�.���z^48��e!��R�6}��vc����Mi�oz���o�0�'�=�~���i,3�:?-���?oS,���9���w������#��R�Oa����������
;�	?�
�����p��B����
+�֞I����O�
ݟ�e#}ԯ�N$�\
�l?�
]�,��
��y,��>&Р����q]�yh�0Aq��K)ĝB�F��ҍcH:��-h-�ǟc���f)�K9T��127]����q��EjL���<>h��;�|�U
+��������d�p�G
+ƫ�`�&!���8a
��l���`83>�.��q��ɂ�n������A�9
+;�
���`��H��B�y�g���
KB���*k�㰗2fF�=#��OM�
� �eT?
+m��Tm��
�_����OBۊV ��<ɆF('�n3u�G~�Ȯ#�7Њ�9��[��١`N�s�.�P..콤
'Knp��F�
�\�?
�B>���-����`����N��W�O�OW�B���l�f��x��W�^�<x==���Z/~�4/�.*g™�Pʲ�<*V-}&���ٟ�w�z��Wq=g?:��;[���-�(�Z6*<�Ȉ��`p?���2���eQ�yў>�b���-_�

x&*/��(�j����_�=߆󑊢�zF���`�Ld��E:���SN��ʔ@S� 0���3�|T�O�Ko�k��t��o}bF���z$4���-���,�.m��'j*J���|)J
�6�B������P
^�3ewܫpX���.��*��,0��7xP�ڳ�:2�X�
OT�21|"7��=<J}|�wl\��}vGic��Q����S�]�<�C�jȹ*	@8�-f�������݂={ñ(
����]�x�Ѩ�n���?�ϑ]�q�O��ˏ�ExyU���c�0��t�M�]��u3���
j �o)(Co��~2�s�Ѓl�����x��֙
��
�{��L�7z<��"�!s���[��H��a����*�{���1��l��1��,V��&I*[�v�$�#1/�� 5�Z���p(3��]�8��i2|(�2�
| z�D ��5 N�s֬����viV�`D�0Û���]���R)L�!'n��"� <v~�x��)�~�if��
+wnK�ܑQV�B�"�����Խp�� *�+ت�ED���*� �����(���o	B�'{p���wH؆ʴ*JѪmA-n��WjGE���ޯ�y~�~?r�I^
WO
��@�����l)��ƶ�W��giX��
�"�C�#�k��nA���
�˻�r���)b�!�U�ڲI���b=��>�0�ߴ���y}ĸB)H�[�����Fs�
��V�+���̯+Y(I���(����x&��9JAI���'tXm�y�G�=�X[8�TK�)�2��
<�
TSR�v�x��lȓGO�|�g�/�{�>���
4��/�g�R��F�ȶ��&�A�5���2�
uЯ*B<�i�� �0�g�r+O��A��,0���-�b�u�g[�\~�-����4:I>幃A��uF�Ǟѧ��u�D���)B�,�
*�?n�`
	'qQIz���K֗�4�{��
B_g�6�8�#�ʉ2.A�$69�!�̒�ub1&D�3Q�x��"�
>ɏn��νx�VG�&��Tۨ����Ó)�sx�d-5��Kx [...]
��P��mBU#g���B�g˷�)��-*�E
+ar���>�>Ƶrn�[ɭ�F �-I���ByѸP�=��ĶK�UC
w��G
�D��}�����"��vN��.p�]�]Q��8u�Y��{�#q��C��v}sa���x_o��y�iN�r�����(�
d8a�w�2C�Q�}V�8�UWO\�g����
��\�����yk�@��d���c��Z�t���9$��u
+p��-���1
���z(�=�f)
+�v��
�ě9����2�
 w	u��煼��ת��#����{P6�+D��q3HIi����%��B�C��
b�!���kc5�&U	):X�$܎���[��b�2�
*@�PkcӘ�d�oT�B_L1Uwi"�)��=�2#���pI9,�R�O>�T@>�;�bn�����D
��PuC����
fk���^�^��\��G~�
 ��o�L�Rc�Hqܮ=-8^5Oń�y*9��:-\�g8:T<��?*����C;��[���y�X���+����I�;��lRL߭�$D��vY�TQ6�Dy��Vm��fy%/sIs��mXP1�Lռȭ����vow)�QB�b����_ L�V�wu�p����eė���O*��|�+�]�(uH�װ4�W�U��.�{ �4�\�m.Q��w
�����R~MAi���Rz+%�B����K��z�?'�{ �� ��
k�҉
�a��a�{���H]��sX}d����a~�3��_�au���Qz�	
�������VM\ĵv5I0�L�M�)�DŽ�p���1��:5�
��,�&����4��
%���!$
}o���c��ޤ�A�]R^x���T◬M&/B�:D�wA��2�4�����?�c�d&g]5�b���4���a?������i�ǐ��  ��Ĉ��.OA
6�vfv�
s�d��(5yT��H���/P��=�(�a��;zUs�
�b�W��x�Da�)E�ʼ�	$�sg�PJ�r�e�Y�3 �w��`�c��F�o�0|U[j5k��.�5�J��&�����e�T��o�r	��È´��}I	l�p�jC���8c���5�J=g�%U��o�|L5��8E"
+ِ��
�[A
k]�����J��͆�VB�M�"{�N�r�����Q���ih Ц@�Y?��6��^߫ZWٯ�]ذ���c؋h�KSLj:>�O
ɲ���.���ݰ��Q�{5mm<ٷ?^�v"��}�ъw��9��O��&�v��X�7�km[	�,70nΒ7|��e��P��\I;<��u�^`u�!��$P����B
+ET9��ٲF��W��c����m$��="G
+}K�e��6�~֔G_���M�DԿ�s`� g�]
�v�p-9�\N�d{:�:�gv�H�_3fC;}�Ɠ
 P�� �N���p�H�
��d�U9u�;���9$8w��
���3�r�#�A�F�iD1�n�����
-}��t�e�  ���D��H�!5$�
�,I�Q:�ȖR���1�3��<�7��
�j�1�[�ЊT��m���WwzU�x��|����վ+ք{������W��>��p���:ʤ�JRqY���^���`ǯ�<�~�j��!m�r.�B�+��'���OyY+��fN*żt
�W�$��W\�2��� �M_�c[�g������jj�%WuU{{�,_��p�W��n%}P�I^�W�|nˆ;c!�p���u�cʨ�N!k#���)k��sd��5n�Ž�6Q{H10���U�
+�
�
�-�"{⠇TZG �R�,��ɇjࣶZw8j	ICF���:�b
[	
�\+�?�
+���oA
n'a
+
+��O�j0���`�%��|�^�/si�_�Xǣ�Lqi�w]�I�έ�D"J���!y�!�Զ�n��0�R�	z�WC��c�c�h���ūK�_R
[��*)!
OSo��u���Oշ�܌W���ze�W�C���a�����ϝ�L���/�QB�o�_��k�/cg���&MV?��֫5z�� !g����"?w��P͚�I�Q"����P�AdtE)q4��j���G�s���n�{"�
���}e��UM�rk��zvi89C}���
X�LB1W�".ꕝ^M
�����t?WK�L�w�DP]t�U
�揊1r�J���ոK��V����GM;ph�շm� �v>��-wg����FN�
��cI�P�#q��W�����I
��;�N�ٶ��A�)���H~�7i� t�hl�~��~dz�Y�
C����x�2>*c&�m�b����{9f�1X*�L��	�#>�
��
+
V@���g蒼]7n249=M����K%
�;��,����F�\j�
�1��kl�Z�i���؊�����ΐ�.|Q��9��а�$_.!
��;�̿�l���E�,����ɥDi�������}D��
3^�a
`Y5�
g{J=m��ɳ���y�3���C�M'�jM�-i�Ц�m��
�n5?	�SJ�E+U~ �;����q.t�Xd���~���~p*Q�eS��%�.��Ћ�"ư��Bs���Z�6-�����6[\d;�^z4�`;64藸����ͱw���
;����|�+&�A�f�LU�3���X�T��m���)l�F�'l
�V��ɺ�gcG�Ob�bɜ9�;v
\�C��L,�
>B?�KGC��e"�z
-@��E�����H���</�s�=/�ᑍY���{��P��w\L�1A
�|U{�_� ���"҉w�+Gm�
�$�#�n��o���x��N����+���}M�9�MbΥ�_ at Tܲ�'1 �,�q��$;��!�헁h1kb���
�����Bo
+�\��w�J����
���uY/|ϕd<w��Τc�~ώ�����
x�¡�#d��g3�����~����g�‡� xT2��ȵ��6s3�i75��ƻ�Z�E\1�\�ɺ�W�A' ײ
�� M	}?;ʂ�8|R�0S�#❣� ��CۿU��b0���L7ֽ`���hcEk�T\�m
�+	6�&�=����B�9)� �곌����
\�@�^
jk��a�ƚ��Ph�<��=T��6�K^MK�͋=�݊�$�Q����-�U�&�>ILp<�5������'��҉�����$>��8#�g�L�2�m�	��
c�����1
��c�
��F�w)�P��+�r�kC
q�p/��u8#�!�*
g��
°�Pa�`v�u��@��o�H�`"Ž��:�z���
_��Q<,D�>'Ӆ��WP��� .����`�x�W��3�|!6��	�
+�5���
El�["�,0�	e���[Oz��0~l�U�O��+����&x��kP��c|u��$k�.�?�{Qp""k������r�6��isV�a���=~�@�W�_�
+.<�7�
+��2�#h?c~�m'r��E�_�xs��6����a��������G�+���K
1��4���L^kUp�^^��_�� m�S^d�Ш���'����>���}��5�����$:τ!
E��[�b�Jx&�n� t�(��m�;Z��s�F5u�q �X�.�Ղ�BqKP��� *�����l���%{�ٓ{�'��f';�,TT,�b���h
�Uq�2Z
���3���;�}�����T9�vw��R�R;G
D�
+
K�*��/@hUv������$�j�!
�@�
�vyבm���,W�|-͢	�^�
�~�D�_��􆭍�"��ĉ����#c�禘�*�X/��Ϝ�e>�|�XH��;�:��)���d9gƖ�4�aB��
��Q4 
�E� �w�,C
+ۯB�U�#�>�SV�$L�-��5g�V	ϯ*�B����#��}�
np�þ�td�����U�$D�b&$^�\^�&Z"/˺+�-}��%�Z�
��:}��9���A��Yu��	��rT�lP0�"���~!	�͚*@5K�?�߫Z�-�P������=
j�>��܈�[��O?)�a5�
+�����?��W���Us����y�5^(ge�${C����m>�	"���G�գ+�$�踿��ϫ&��
Xw������
��8?��g��,'ō�=�"����/x����N����M)���'��������EF��q�rf�
CįQ9ZY�$r!���6m<YZС.�<��V^�z{U�S=
�P
+k�X%3�x��fj��n%^�����
i𴵻���s���3�0���q�h�$��`kܯ�
D& ��!�M����1��W�}훌1r����=2N��Sd�k�b�
�\��ŀ�p���d�W}^�'�S^}�+P�0iC�
�1�R� 0hDz[P�� �&!��v@�B��]P]V< �SܒG�L�O�
NgK]+&
��-A
+�2���#�sL4�j��&�D���i�b&,�A��MS���U�D��9���y�
+v���98�����j�c7MI�~�(�sL#�}�3���(M�^ N�i�E�K�E8�mi�	u�zI�$N�r|}*��+�'�4��w���{�y%��F $��8
��@�N�z��^G.g����-1Vfk�)��G�����]�u�6K"���K���1�p���P��8����r���>�)�4�
��V�9�k�J�$#��
Fь�X��٥�C��p�[��ģ)C���S�;rFP#�I�m�K�G<��h/��U�-,C
��O�
kOK�YY�;�MH-�t��%�^N��ξ�B���7"
+���O�aj��X�_84�V(N��-{D)��F�0�$�!�o�J��d�v/_�
�(�ǀ��U�H8�B �c�1����f�b5u��&�*�ҽ�n�2s���G4
0:�\=Y2�߯	�$bi�8亵M�$ҙ:ut�N�)��Eh��Dh��d�j�21|�*T��V�˰���T�5ȮM7-�^��S���84Te��hRҨj�[�U�G��U���1���K{�Nh6v�g֨�+��G?���`
lݔ$Rq-�.ަ2��S�e�8
pSՖ�k!�X��C�\�z0�0	nlh��j�<~I�����,K���r�L�)�IM����9M
�_���c+"vҜݤ�L���$>ɺ��z���j>>��X�9,�ZL-j��Ib�k��ȉ8�˚?v�t�����x������P�IO}�_ay@
��:����|Ve�6�����ubd/e�3<֭�z�t��e�a��'�c�LaM
+�lz&,f^�_!��?�l����2x2�X�y
���ń�3D���
�)�\ ?�y�e�
~��4��O�+ 9$�
�
+���E�V�D<�O0�Vbj&��mLB�2Z܈�b9��U��;n���6L0	�+��oˇCr�E.~�>T�
Sؓ�7X����?MM�!���Լu�O��t����P
Cbt;���i����ް��a��@gW��#�@��4c�9.D���o�
z2>M�5��i�~�u0�
�q�s
�wQ�9�ǸLt��삟�Mz)>���kɝ���I�;���io�"���U )��]$Y���L
>$����$T����:gUo$���UK���,�C�`sCMAJMÄ��K��C(��g]���ٮ9�s�U�G�0?����L�5���
�QM%��0O�l��5&���`�Ƒ
1,��x�'���{��k+�mY�}����-J�s#\��d���:�i/�N�K�����  \8�H�����stQ#��-�ND�)�.s*�Z���y�m�n�f����\�1l����{��(E�=�VGW��9��s�:��?���w���ǟ�Q�Z�sC��6��A�1���ƃ��6K�@�8��O�UY�^��`���7��������j6�@�9?,y����
t4&�}"�T��-
+�\Y&k���V��x�녣3��9��1ٵqQ�=�b�eMq\���
�����`/nņ|���2��͌Jkz�D�mͫ�IR4�\~5Nl��օ���KɁZ]T�C�3�l�̅��D�3jSS�)�t��Ww$IX�[�w�V��
+WT���U�w^P�eU����h�WE�^ؓ~W�c�h���s
�s��I��g�����`��w��g�s
(�5��� ��mr��
���]
��
�B`7Jf�A�

���aA�3Ɠ��G�����?{�O[
�?�x�j�/����Z�*7�e�x��X�z�
Ά��})��C���?`��K�c�M����Ռ��&)����Y�5����J]q':]$�؞�]Yv
x�(�����ı��H1��e�U����>�_0�b�?*񸨎�b����
¤،���
���D���;W�xm]|N�7U��13*�;��.�=��>���S�Üj
)��CM��>��.��e�I����1���/�Q�v����6T�
kk
+�Ɯn\\�F�F��V#���Xd���
e�&~�WE��7�"�bj��
��u��^I@�j@�bQ�
W��k��8���w��_�D
��^��z����
x�Z�KA
�_`�T}�]
+x�}�Ё�M0S�,r����V+	K��O&�ƈ�`�;�E{irf0 F�]�� w86f�

����fm_8���c3����V�<)�r1��p���� +h��s|p�
� !Q��P'�Ղ
��ʛ����2�r�Ӥe��j4Y�
r���,
�r�?4�
! U��q�]f�(��*&umM+
�;�1�
+-���c�8�C���j�L=L��1�TDJ���7���>����)BH�*�c�HY}~�xI,{��7��W����jW�ާ�ʇ��h�g�_���Yov�MKi��N>���
Q��R���ǧ}��A��Q�j^��G
�s��yJG"�?txt,L��>�֍p��_��>�Po$��^<�%}���K�D��S4�
+�*S�<ܖ�y�d;���éIJ��~J�M�n>��ȸcI6��u���ɖژ��䩊i77�_�5W�2'	9�
�t�^}/��8%wd�� �0k��)��ͦ�F9
����k����ih��3�Sh�
�PB�U�Lz��s���'0�$Y�/L3����o�����
l���|��f
�ɪ\AW#�si��S�-�O^�I��+�3��6���xas�� ���@M��
+�A
h��m�4�5 V�-��'
ѵ�1��� S+
��
~*�
�%~k� ��˝��ʉl
�*�
+�lك�=�3���_2~���OgP��s
+�C�����c���d���[�a�ے{<Х��j�A	{! ߲ۓ
���;O'��9+wEH�E�����&�J��V�?f�iӺ j0�5
瀶bhW�Zx�o=��ƺ
0���z���hK5�m���o��v
(Y�Ou���t�;���e=��R�*
��yMV�n�,�$v:��Q�ڳE��.�y�Vl�;��svn��,��Wi.[�����@�����34S��D_!���M���F�>J柣ND ��@$�Y�~�-����C�Mu
(+lBpБ��^��#$�~�2è
/@̣�6 3�n�h�
+�;������۪.��������3F��q3��\َv�Zn�Z"/��vNF����N�J2V{�#ΚV�s����e_쑮�T��a�8C¢�!Η��>F��L��\�
�M{���5��eH~7;F��	�	�A���������B?���V���Y�=۩��Q i9�J.sӿc%��FVb�dեiL��`�a)kD���=W����
���
��� \n����e�>�N�X7Ƒ†2I��Y
f-�to7���/�~��U��as[��`W��*
v3_�`~����:k��� 
�j�R("�E
+*���
+��e)DDI��ss��,�f_n6�"���:hm�h+�]Aqñ��Qq��S�a����9�{~8�|�~b�h6�G���ZĠםN\�h��+��(E3�0�~������k�
T�MG����1�:zk�a'L��G�����2�>����, gt
���X&�@�?e%�
+�����=@��Ih�s��
��)H
��U�OeX^m��7R7�~�,���,�
�\j�����J�Ԍf�ͬ����
�8!*�]�JR:��W�R�]�M�ɚ�
�P��Z��;��J�N�.8ɦ������,�[�r*�Α�]M��M"wa�X)Lbjd�`�>:�?����|:?u��>^��G���$��fa��.�
+
ʥ_�S��%�ED�8�
�J��=�ĕK���{����
�6r
z�G��G�� ���
��U�i�<����K�g
��"���^ �q�
+����I6����vP����W�y^,��u�c/ 5��@�:ǹ+
[��N��+�l�i�{��P�#^�
�y����v�,ñ������-��N���ѳH�⺣<֡g�x���V�<
/���
nb�
��6���󴳜�Ρ
 �+nhB˾�P��oT(�W��#�#ĉTw�ZU
}
� w-��v��T����-9O᭺HI�z)����� �z�9��R'�d�I5��a��Z��GS˟�ag��W=��.�P1ٜ y?����2��
��X�)r�4VaG������X����Be�`9�Q1��͚@8�5��
���������$���W?�D�}��z��2�*�
+���
��p�t�
+����;Br\ܕ�'>
���-��v�
�C�Neʔ�����L-ʌ�q��K�H���r
�7�I�
d<�����B
�gNelB^փRγF2��A�qCR�&�t���7߄��{"
D9����u)��C��w���1��t�}?"���'�[�7o�̩�~�1�{�>R�u*�
��ʖd�C��l���u�tqf�2[�l�~{S4�>�J$����.nQ�nl�P�#� x��])By`r+��w����LH?����VD:�|��iU�G��~ժ�+��&+R��b� gP��>��}�����W�Թ�k�Qǖ]WSk
q�w���Z
+�D�Q���d����V���d�24����K�G�M�v���U
35��K�J~�4 & j��w�J�����*��y�;��X�߉˔��O���@��5�hw)�񘴕�o�-9E:��_�
�̂�o����&�6#�V��(ѽS�-te$
�פp}�4�%�4m�rn�z����he4�KX*��KÃ����2�9�ʩ�~���'Ǥ�l|O5ÍB�
+�;�^��j�㛑Q�`�exH��;�J�\*�`l���˴K�h��k
+&����t���F|(��8Vǡ�ܷ�
R���:ϳ��o�G*UjSKk��nR�
��gl�
��ޅ-�
6���&��Nŗ������7O
�4��rGm��O[du_T��vY�{�
̏Iy�\�aR�Ky��&�P�7ݪJ)�l���"�W�5�{K�� ���S_����j 0WSW;�w�ix��F1�^l�О伴^�'�
1���b�%�OA�����X�hq)L�7��j�}=�9PX��=��n��`��ɗKX#Cù�A
*7{� �j��WܴT�By�����ufכ���d=�A��f��]����F���=�_u*`�q������+�_i݋\�^`BaE�|�S&����%
Z�
�a�8����+Q��g�Q�[�IK��-�j��IKr2T�cju�=A
�ʧ�Q�"7��{ٮ���ם*�X|,Y����
z
����ѽ�����}�ƈf:�jCo[>�]��x^���h����lhNr�ϳEDk��c�C���Ǫ
ת9��c	���H
�t<)��}�z��!�hE~DBӳ�2�S͆��i{;�o��u��I��p�??砃4�6ٺ��^"������1�R������<�-��65s��j�p�C�����Sjqi6dzھİ�紈��
4�1�.��$�5E�
G�9���:�
�=��o���b��쾄
v#��[��x�ﯦ �AF�+T�����
���(C at RQF��7�7�2��I$��^a$�Eq��>
�.�AE��b����
i����O0�����]Т�K5ΫPÛ�G���
���
����Z�d��J���*�$d����
^�}E�*֤�>?��������Ƅ��������$d��O���	�_t�l�%��$^7��[�K��S��ECq�z�"$
]�*���B]��}��W�
zT[Rk�"�����n�]�E��U�Y
v��FU�W\�B��6�-RB�^M��e�2B�4�<ZR�V��jV�y�~��O��
+W>��/w�ͺ�h�4E��k�5˖�<1�U���[�t���D��>�Q!�.kR��涧�7�u� J��c�>�c��
+l���/��i^��3;i�����ڐ�
0��s����Ā��Z�n�S�
+���q�W7�N��p:�([���5�6�8���V�
i�AFޜ�~h�9�P�ldüj�2�dO
+�+����6��1�--��1E���wv��	�=JCH��W�3��4܏&�x��8,���&�����#Rc�3D�vz�6��RS��yu�_N/nm�ك��vT����֥Y˼?��RFװKz�n��9����Q��4�g�C�^�5l`�P
\ܲ����G�&���ޫ`��
��9�P����ҞٲX���r�6���
+V4,��{�a�؄���\tcY`]l�ǿԾ�a���r�鴯؏=b��!��&����Y�b

�^[\�aYt�$w	
+���[��R�)���i��[�{$��7f"��o
���X��p
+��z�Bz����'h�
O|Ō4ǐ�|-�j��
+:���}̴a� %Tv��5��Y9QK� �d0
?�$��ćH|�#�u�D�3�
p��h���r�d�@,@Xm��VK
Y��@o��u��([���8#!OM~�.�7SoJn%<��I��dZ��=�1�D3�!P#4����(|:]SYd���_��kG�����Rh�+Ot�B���%�/e�䱖�&]�h��r5�sl�or��Q����
"F�,bՓ�*2~��:ʼ��i��[�������t��˦����~M
+�U�6�DU�e�"udPO:���]�x+����G��B���]��q:�ʥ�'�:�-ML3\�F$�7�K�3�
 C��*s�2��z�F�s�'����
�
�̼K���s�����Ӛ��w�ER��	�!`%aT��H��v�R�W��SP�ƅT���}FVArB�[��SS &��}p
�`�	�~����_���1{�,y��o�����
���{�30��[�b�
K���:w�3��Mn����e6�s
z/0<x� &�3�nj���@���_d
�K�Bٓ�! t�r��!�6<�
�rƕ�KjT�;ҽ�����.�Z������.,��68�MUl��{D
6v�
���@)tmp�y�_.>OG�"
+Ü3N��|��
�/�'��O��-R_�1Vh&׺
N�Pz8de���
勊ZTH;X����Q�6�}��+���'h��_� |ȋ��Cc�����u��H��j�BA�,�N�OS���{�3���	L��� `]���1��> A���
�� rxӴ�*E^�.��ؐ`����Q5
�v{`=W6뼟�\9a����vGO��Xc&
v��1���w�~��� �0�W�:ʎ~��f��:
0�/˵��%�m
�KRK�A�������c�R�%�	�P�#CS��ߥ�f�mD�5�oEx��1�7B����0����<&������Yd�8"1�
�wܡ5�� TaaJ3p��5��
��7�A>��+��y��I��
M���c�u��
Zd?�B��
k1���x-���r�sV��9s
�H6p]D�G�g�O|
y��5�S�$a�E�`$�Ls
+[��Ym�
�~u�8��p`6*I
ߕ�`S8���8s�n��9O3nX�OE
/7
f�^�l�bN�[�PB�F�O��.�9����Z��_
.�5�>�F	��
�S��̉�R�'}ΪѬ`_d�X�|�{�d��HXԾ3�QlZe7P�R��q�ش�O5����OkZ��r�x5u`a ǂ:��*`�T�)��,�
+DPQʮ���dߓ�����J�����Rk=H+
+*�#u)���h��) ��)B�6��s�9߹瞏��H�ZG�z�G���T�"9��3h�D�ͺ
��s��r|��b�4��y	�$��TK	���"�$��I��~
�$�v(�B��#].��qi

��?�C��N
�����~�ޱ�|��ܷ�LcO�n���T~������vxj��̦5<.��f\K<��2p�:Cp���S�y,
66��>|z�C
+���� E
+T )��f/��:X1�}J+��>���_���~ ���Q;�^��ㆪvs&�۸>�.�k�7��yZ��S��:�˩㜍�r�
ݖۜ���aKa���!l��.g5���7�Kv�0��!;ڗ�f����e�
��%�]"X�T�
�J3�aժ�lwV�j=v�姠�α���e=b�I/��g�H&���
�:����g,(y	27�>a�b�a�8���8f��VV
�q��ɌT���0��N���������ɉB�����`(
�_"f��o!�
�t}Wg��_0}H���X
�9�,�Q���x���=�~Jٹ�x�>����ӱe�9�M���2mF��S��)�Vk����-eZF�F٥bt�g0��O?�D�ǐ%7ey��ښ6��W��S
��C��y�e��US}�
�l�`a�8i	��g"1лJ�"�|P�Kڝ�c�,��$����+�&���P����vꖴGBoj_t4I
�vq�f熚(�e��C��!��b�׼�^�S��b�Yi1���¨;2��W�`/7u�h?4
+�
���!��z��@#(���T
���6��
^��!�R	S��#�>E/�S�q9�z_ 
/G%ӈ0C�9�[ۼ�@�(٩��P��
�,�}��X�T�Ok��p��QȫU�G6
��
�x�2�e,��> ���
-?�ϭ��QެYz�/�T���5�FL��^`�tީ��3�\#�������̬D�:�
,�v��� w[mDW�����)��TB��Z���`0Ֆ`3t�BQ˟kk��s4�1y�	�`�\�޸�c�V�#��z`X�Hhw�A��0�چFTy��qӵܫ*F˪�%��*����/>�9

+�g
S'�"b'zL=N�)c��s�*����b�R�����)W<�#�S	��癛)K����
��
+&���L�\��9W�t�W!Y1�������7i*�%�����wJ_����
��閥�n�WJ�!p�����-0�T`�:K6B�+��S��z�l��L,~��J#ZL�HBEe�߈E�q1
+ڸ��TD}�bB;��*O�TC�nՍl�$OY��Q��0m��z7�o��9NŻ�|h��DV�[V��e�֩b7���Y��ZÖ�H��l�����~I�)ܻ�J�5�����oO��ݑ���%(��,�h�Z��G��ҼmR�d���!��/NEWutV57z;�j���j��s���^�^lD�Ǿ0-a���_a��L�؁��w���44簍b^
��ppi������&n�X�	����uƻ-�݂
�-c�Y4��_�����
��g	?
�j�G�I�fH���
�%��J҂[��%ϩ�C6Oz vW�z��oZ�t�A����$�?z���;�
�ؼ���FT2�/+��0���@��@S<@>0b��S�uq�w;j4S�'�/4s����E�թ(P[����V�^�5ƊH��k�g/�ۄ�w����
0��*��֭ �a�j�yB��5�TC�
�J(�_��F�4����!�m�,
R��N�
�?S����9��
:״��O��f��O�V��"յڇ1���,V)S��@�._
+���#��Q�`�K���|ͨ%c�j��/&\��:
[��F�t�^Z "��q�٤Jm�뙊jMarח�`VCg
+��w"�~><��
�8�i����}�X�T8�dzQ��V
Y<��<�J=��E�ۏ7
G8v6��Z:�%���hBò�94^�ԥm!
1���OD>�p%�H���G�����/�Û`rq�;��N�m�~M���s�\��/���Z�h�:�(���MX�а^F�.꜋�.�Y����s}5�`a ����(�(X0�T�+JS��
�4�&��~��|iB!!
!)$�)ʰ��
��WF�Y]E��븎3x,��˽�}���| 
d��c�
+��|�i-��0�Ws��
+Q_G�pRj�y�0���׿�t����j��T̎�ԍ�
D1��څ�ڍ›N�:ka?
���7�e���k��_�%]a;�ז���F�=�9��-b=
&��Mm0-�vD�'^�j��+��/5(er�^�+E��L
F1�$�1K���WE|f��O��FMK�����m��:�:1`�ڥf��X�ЩM�*i�9��
+l?+Lw?-Nx��͈��wɳ\C0���瑃f	�s��
��M;iđ`��$����O���0z��*Rٹ�B9�@�"�k��5�����
v��~�.l�B?�u g�]�ed����
�8J�A�j���͹um�.��D�O��^^��v:�y;��ske��+,L�¶v� ��ŝ���Ҽ��خ�����d��_��5�Z����;
q�#�k>���� �MU\��J����{l*͟��ґ�3Do����y����"UDc�����u��#H�)BP��it��/	v�`�_�Sʝ�{�e�5mp�Ppy�=�-2��[���m�+v��6
*.�Wۿ��Sǔ��]
�
+^DMk��,2�.#��ɲ�\���!{�
^��I4�Ԉ��.~�ç�lDc�BU\b�"c
�j��v�����J�G�|�H`_��2�r����
���H��ѥ
�
��t��HH���BaG�	:����B�f��{�'�9
+[�j��a��e

+&h��z6F�d�y?�>g�ۑx&�l$����^���:����^���n����x-'-����]�O 5�������@S
� U��ڏy]�Tu 
�_,z�
�WPT�|BJ,ɕ}`8�ߴy?p�7gˢu��\JO(_��vOUue4���+Q����bi�?A.j����Cxy���R���J�駥�P��t㸲r��T��fd�d$ֺ�FR>P�a�L���'��
�v�����2M���*��׵�T�]`W��*�cD�*��h�A�e#�"�ɆKO9�J���KL��2��J����(
KgK3jԉf��Z��nL��5��o��M(�_���>�FO����ӹGi}<���@w��#Nd����h
oo4�Y�
̾�Fٸ2�����Y�A��z$�W��֜5��Copl�i�
�\�
���3�2�l�;��a�<;�S�? B�>�<A��a�rL>�z��p
r�j��s�m��1t�Z�c̥�
�{�s�/���J{��c�*�#�3��ހf� [...]
+�oe�*��
+�p���}����%��
+K�"G�*�
yE�%��S\�#���V�9�
�ۦ2�4=���ZH
�
W}d��UU��$�U���>*;�$;�d
'=�NY��
,|ܶ
3�4�����q�T�=�ka%���h�s��䬺��U�X7Fl��[��
o��1a�puxf�9��Q�Gk4�;e
+˸�7荇�5��xB:�y����Zd�ͫ,�`2��?_�a[0�~9iY
Fs�3���g��	�Ë9u����<,yx�87��� �1�����Ja���,O�@/g���O�㔛�
9�4 �|.]�1�6��'�^� �@1'��p:Xt������wL,j��V���Qv@�wl{έ��̱���\�?R^�UV�\�GI�+�����9�����D�0���3o��y�d�[R<� "�"��"
+.��2�}��"!<�4t�H~(��-r��2��5D�H@��l��"K�����濣,��/S}�������"+���~w�������F}V
dR�z�,��:�w&?��C~Fq��J}Jݢ���J��i���rjzE�gU�#��p]ZF��
�%��+���[�Pj e�w�Vjl���W�7��wR��/*��C%�%�j��G�x�
@EFH)&0_����Օ�|Xu�
+D���RNX
A�\0JS���H���30��7�͛7�3
C�Wc+��U#�r#
aQOL4E�љ?�s~�{���s�I���y�?�y>�ҒL��ָKd-ޣJ1�v �*fH
�6��h�����z�+~B�O�:I��Qq�Z��UՍ�
P�[�U��D#�BM�	��>$�	�z|��?��^�������!J0��W8�N�	��W�zX��f���щ@'h�
�<�
+%sd�R۔e�[�$z�,��Z�2�H5����[&Ht	L���
��U�O�
췯�<�u��ɎrE�ᾀ{i�,8+ןwM2��O��\��7I8
��i�l�2�ewkv"9k�r6±��U\�R��*�q��o�GCxxy���;�:j��Y�E)
a���ΰ!Xid�j��
q(���8�S��=���l�(�P��9Iue�&��k)���W1����=k��Z�b;8�zB�C�����4��ڕa�v��?�su��UuP���\Vf�>+�5�2��j&�P�6���uR�ɮ�!
+a�+�r���k�!�o�4	��`��ܗ�P)f��%��V��Q�T��F�(Z�]s���,��TR�|O)O?��h�o�# ]�6y�л�)��O�U�,F��٠����E})�g�s��ٴG�y�Ҙp/kw~˖��I'Y��;Td�
�g�Y�U���'��I8�@F�*�	�8
$�I��+A2((�+y�8O��ϋW��ȗE��
{բ�b�W�"@�}@�C׌�t�e�Y��gv�ֈ���H���o�fE`�ea�<o�V�	�F�
C��k2������* ]v%녦L�y|�KJ���3��P�nW�(��<� yiBVO��h�P������|��q'�9["�<c-�����p����!p��w5
�ϔ�r�)
�􁢮^.
,�8L� ��o����қr�7
��ȶǫ� .�@P�p� ��"��X�SI�3����I����k�TGm���W����Vb�u6��Gބ ����`]O����ZQ���&'l�T�R&"N�!�v�G{�%���^}T�1�v�:Ȉ�\������(�IW�f��*�ڮ��ʃu��*����lg��w\W�d?�'�~�|S6�|��ɖ)ݹ��E< �K��7���b�%����J�\�*\D�)
��e�
+��2�G��2ћBjx$Z-����aV#
s�/�h"���K6WZ,�ɳ����L�9�0�~G�"~4�
�5"[���K��4�h�����q���ɕ�����F���a��1U�_��K�Ī�)��P
��
?Q΢9�ޒ"��zܮi$��5I��0�]x��oܬ��UJ&�]�:QS{%K��z����<�
�~m댋�/7�ƣ��i_��y
+
I<G�d
k~��x�k�ے��1��e'w�7���۲���
��U�y��ʪ����\���P��x��V���nL"�
N6t�Ħ>�gbN�_�����4�!/�e%�
���O;m���ht��Wv6�������[���i�������yF�y���4ʔa�t
V�]��
au���
�#������Q�Ym3rM�/q{�~�
�tj��D��
�7���f�i
���ɷ
������� �.
=[�n`4���qSh��B�r�x_�5wԐ
�%��n�
Q����~x�'G[	�`
+qb�]Q�2Ը�i�=UGn�~���ڋJ�(�����Aݪ��d��
���
E�7��K�z
+M��]������!}��
j�nh-Cզ_�魺��������a�٭�D�fr�j�6�$-�4�n�U�Z�F)�Zp
��ux'
�@��]U���/�ٳ�ۿ�3�Ug`iU�}��ڰ��U�L��W���u����+��S��U��[���;u��������XJP�v��O�ŀ��{$�KF�,q
�Q���r�u��H��.���}i�m����fZ�h~a���t���M����B�b0*��iW�
��C䶧���jZ��m��n��[nKfi
�c�+.�&oV.�� &
ʭ��{���5�_�s�9�d�m��I�A. �*s�5:	�1���Ů�
m!�|f���l'�6#N�
+Z��>���\�oM�k�CZ8�)*���b EE@��(2���7{�I�"	$!��0a�=+v U�ZŁ`-x�E���JU
Ǻ
+����~��~�7�<N�z���Q���T�!w�����B,��C)k���E��+�
�+��#�6�-��)��
p�*㪝A �����Ao���c��c~�\_xb�5Ӽ�����z�g�Q��u�}޵�z�Ge��X~	>T�S�
s��V6�������i�1=�2J眆Jh�@ U���u�;
��7!�0
+߽�\�醮���������%-;��=.
��e�/�T�7D�$v�{�.ʫ�����|�Z�Ѯ�mcDֲ+-C��u�_��{�>�1�H�1]�"�D^n�R�
�ٺ�:����E3�
[�h9�������
��7�TJOW+3
v�œ�Limc
@�6'��[�c�`Ǧ8v���!���b�R�{��1�_ӵ��u���o��P��E�2��\@;4"�mO��
�����m{��
ߺE1�d��A����}C=W����B�}[3']\PJ�G5�V��mnY�G
Xy�ahd�'J�[U~	v��W�ۅWo�]�Wn�G�n�R���9H7�Ѩ��Au
�1�v�����Zm�]lU�r�
�T�V�A
+sj�6l�hm,M��y�4A����*0����v�J��
R�?�� �Ĵ>���2C!
*�#�q0�MJ
!:ŏ�C�����R�|�d�F�a?��2�
݂�c�h3��d
B��
z��SI�t?�%�L��m��F[�A��x�Y�G�ҏ0m�;GY1űh%[�sጒ@�9�
q��_8�G>
r�

�W�n���)jod�E��z�C�.q�JviN&�I
f���8b��g�
+�
�v|�
s��d��%:uT���f�����&�L��0���~�p����.(R���U
+;
_)�w%$��/��
�t#�
+~�#�u`u[�w�.��q�s����Y��_�-����*'̳ɩ��k/���)2*
i�9��$�7fU�z�fl���c�9}�]� �,툏WYC�
I���k
S�-��t�y7>�T!����<v�`tF�W�V��"�)��'����U���!��<���^��D�V��"_W��퇖��6!�{�9
JJ�j��i_U�(홽�c4*j�����>��
���26�����Kݲ�
�	m�&c<kQ ��Jln�
'�I�y�T>��ӣh����'
�..+�upC�6�&@j�5�t���d�����P��0���=��I�˂Ė����
+�</��BིY%�V(��q/ܦ,Ǘ	�9(B��0j�tI4	�S:�q��ԙ�1��K�h^��ChhC��F�����( �|�|y�0%o:TA�
B�Q��yPI\�;hVʓ���2J
+ĥ[�Q�r��_k`��9h�� "?7�<18�����~���Щ�
t]Z*7֡�^��%A�nj#���7L{Lu�7�7]ČY	L��L�;
+�i�\WkI��S����y!KC:�31hZ�Pf:�߄���0��C�>C�{޶$tR:(ϭuO��
R4����$=��jl����uq�1?פ��9��S�i|c��q�F!�_z^�S
��K}��`�d�%D�T	�w
V�>�; �<�'�V=�(�5H�%j���WM��V�#��9�Y�D2��֓��p~�����~J
��}�D�]�gN�S�s�jJm�n-�>,v�g&S�L�l�#�����>���^�i���8��ʞ��%��4'��R��JD��h�RN0hB�A0�(r�0K+�a�������M��Y��|"�E�G����E_R^�v���4�/�?��m[˨�y�N`�K/5[�7�1���[G�ؒ'� '�铯R
�G��hqꭁ�]��>���iI��X�
+5�'�\�GB�	��ć����d�^u��x�+���[�^��%e��	�֪�p��xE��
+
� �6�%!It�ި@�Ҿ #%��
����:��* �h$r��7ש�ׁ�55�׈��Ց'I�+6��*ЮwȰ��%U�#��zD�+J�t�� �B�a�Uؕ	6����}�
�uO�r��7��d����P����
�Cu}FEu�a 7�RV�"KS����T���20
E���N�{��^��lk��ƕ$vW��(�,�F7��b
ˢÞ��O���y����<"_��)���.k�h���[n �9W�?g��ڈ7��yș�*����Ӽ�uA@ �Op��I�R��rP�(�$e[i<�H����������/�\�t�/��G�inQ��a�@��q�I�a�{�Yʒ�]��e��?D��98ߙ����y��dx ,�8�?����Pe�1�N�W��wA�i �N,�
B��=�%P�K���
�~�҈�G�!Oʽ��R=e�"!�]:�:B�I�\��MJ1�j�G�K)b
'xL"W?D\G�ԝC��{���A�A
?u#U���������UJ����
ǹ�	H{�F[�5h���[N6��){((��%��
>�V�Y�R
+n��#����(a����F�q�&mq�3%�\g?�%�ӆ��M5������X�D3�b$ʁ
W�� ����ƿ��5&͔D4�®K���
c�
�Ꮚ
�.
+��1Z�o
+^`��~¿`�6z	�q���
��aX����ǰ�)��Ӽ܄'��84�
n"Db.��� �
�yC<K���
d��},��{�*h
�

+ڸ�h�>���wMv^
c��8�Iƻ�(~��j?���
+e�o��y
��l/��Dl5�����Żר�p�y1���ܣܵ�����^004�{
�����.��%C�A2��2�d�Wu�����Q�>�o�kL<
��
����5.ſȠi�f��fh�7S��-��|�^����T�jX[�wC�Y�*��sG^1�Ve֗�+�˃������L���3�
��/2y���{���
��+�.�;C�t��J �}��
���-��
>٫y6q<����
��<b�s�
+�bk*ĉ��_�
V���
�����T�m
�}���D5�1o��U� ��Q�u
�*�n��ҹ�
�D��U4���|>�W���x�A�_P�Z�?	�Q	��y�����1�>y��K���\.�!�O�q�M��

+0C�l����];�S�k)��=RZ@�[ɷ�5��
���JBe�ǐ$��Ni"�0
-�ú�R4H��~�9.☫|Dϸah� �-�)�r�~"��e�oM�����
���K�%4	_7�"�‘e�
+QD~�0T��.��>"x*
�O�>�酧��.Ey+HVy55R���Ws�����Ek*
�PxEGB����;(J�
X��(8h�iq�mh��^�
�0`���}���_APW�D���L��Z�‹]�<��4��zG֦`��oy��Z�R
|�u^��g��C�F#�n�r)��Va�
�5�ƪw�����9��n�j�yI���t��
+xI��1b�Iy�>}���-A��گ����OSh��KF�x���6xq�qQ

+�3��S�U���\ka��椚̩�Di�~
�?{�>���J�3m�tߐ��Z���t����]�Y���N�ju]�ɒ���QY�lZZ�s��
NѴѷ���W�>S���ݥ0�B��j������+�7��q�҄fU7���m�	�����:�8���^�;�#�eտ�+���*,�_����C�Y�3���
�M���S��U*���L�X�.jQ�Ȗg�_I��W�J5a"9R��'�C�\y׳qH)��V�U��
-Z��.�\+�Ѥ�/�a��en�/|F�[��?S��Pk r�"�
+^�Y��>����V�H9
&ya���I��x�Q�<�zU1\���
+ٽ�l�*7�}��hu;Twfa^���cn����YS
q;)oZ�u�G!�uT�U�Or����lk;�H�F�-�x/,u�	s�m��>fd��}�+]
+U�.o�.����=��q�-y�]�[��v
�i�R����g���k*�`/p����LBu���+��A����@
��[�)��&P���YQ�?���i�m/��K,�Y *g�u��(i�2�`��؀V�"f��JSs��=�RU@� ��7+���>d��ْ���s�m�Y�� �)�w�=U?ο��3D�����
qjv��8<��!z
g�)�b���^�[$z�RYjT����)�Ԭ1�c�?M�2q�=�@��?��ܣ5�ew?SIf�q���D7����
k�\� 
L�24A<D1` (T@@+���7{��d�I؁	3*8����:@-�m��q�*���8r����><�u���ݹ�\��id��Xm�m��J����J������"��U��
jb'm_�z$b�"�uO���
�b�M��q_'�is��ͼ?M#mp_=~m��=�İ���+ȡ�:�L��;48l��mb�
3�埒-m�
$�Y|H��n��]�c�k�k{>3 [...]
e
l��[I��u��Y_(i��&;����t��o���

�
�����5��k������Z���/��
j���j��p��~Ch��⨿���䦿�iR�s!G�-�����֠���5����
��
+�����&w���a7W��AƫX���U����r�8��+}E)�oV�ӃIÌ}�qZl��h�<�gw�
+��A��?�=��$�6-�ޡ|,)!<�*�ǘ*z!���8�߀ϸu��Pp� �D|�Ŝ�e�=s�m4'���Ң�ؽ�YaP�OZ(���vj?�VG�gxI=V
�
�-�
̹��u�MCJ���H_�-C�]����B~�2A\�8����*�E8P�T��Δ�To�
9/�w���h������������a�ߣ�b�y\��'�F,Ռ�o%��w�U/�ժ���n�M�*��T Ƌ{�5NJ����ԢT�9L��;y
_fX�D\���u��ַA���:x�"�)�V%�V/*��]1���#
���)ԋ���@�X�"�SV�Ӆ����4u�.�f�?��Uչk�%��Nj����;c�~?�]Pۺ˄�W��Ҍ=V�듍�1�
+E�	�
ֻqd{q�׉�;�
+�N�
������YH�d�fttc�
���#&�v�P�tQ��jd����1�o�
��­�R)�ʽ@}����<7�	�&���8�w��y�y�b��H�
�04���͂
@>� o`
�����~�M�<��a9����(��n
����c9̼4��<o��/��E1�������:��ɕ��7e��
�.{��Շ�Pi	WE�Y���x�ޝr��
+�EJ�7
�T����|4��'�r41������� n�s��#?�Cśhk�6
�/ϻ���
�7�
n
�
��HIT�����c6�߱=�z
z!�?z��_)��c�)�u�e�T��}nS�3��&iq4r����E�U�Y�X\�K���88IX�`}7yIi��
+��S��iG���r3�8Eiօ�$f
����l+n��.���*d}0Qe��:F����S��S�퍆��֯�SȺ�8��~�%; [ژ�l0~{��^��
KbV+�T
�s I��x)�oe���q��ra5),k�xU����Q"��YN�פ����ܾWu8G�Q�d�!H�9�2�'���31c�C\��!Q-�;U���9�
�d�Z�o�8C�N�T1+�hڟl-?63��z�,�=]���Aw7!�z6��*H��H*[|C���_@m���s2U�r]^9��n������0�"��PuT�t$�#:H���@�бjy�b��~�=�噛��*��ku��U��Q�m�9�]'pu
�
����d��SۖHgi۬��6r-���>`Oi#�T�2��"-�!NSn\ z��$���S�C%�Q���%;���O���z�c�T)!�M�.wf�.P�o�1���U=B��l1�F�#F0HD�\u̞rڜ*��u�jQ��O5��u8�E$�7:"��І���(Uu�AN�gulW�YE�*Z�"cT\���k���Tx�l�x)�$��<�hT��',ʷ�
�����y�={V?$�N�)�D��P�Vl������]:�|�d��̏��"���w1*��=3*gB'����|�'#�sB�F�S^PR�8�?
�
+$	m�:��@����l���(蕉9
Ea,�_܎i�ǀ/O	I��4�a��S8!��%UJ������8C�(�&2�J:�;{��Mጫ~J����dm��rFW	�jg�Y�?��;��s�8Ҁ�����Z6\Fq�D
,���H	Y'{����
$a@Q��k�^����r
��h��"j�}+�m�j����y��s�������әM���D]�_CJQw�)��/ʹ�5���״2�s�7
�v���}���7�
T�V���S���6~G���oLF
��
YH����Km�k�v���~�U��.+�j
p��o8Ɖ$�5�)�\R��������(��g��H�m}�w�5j�N)
++����������p�vO[n��Hj�͌%=h��
��4�^"��l�q:i����%S,��P����=�Ƌ�G����T����	�B�ULR8LW������$G�xLcLS��},�?�E�;�8Q��E�$?\.�e�!&���KK����J����G���7��|�_
��Ҟl8!>�8��(Y�B�I�Y�`[�}��.�B���b
��T���$��=U8O��ŧ
y��P��-x��$�]��0��_���
+�j
��(��sO�����H|/=�wKR���������`�
p�t�l>f*�ӡ����uU��<�=�T��s�(�&zpK��A?sL�o`N0M�q+~*m��-��~F7�^���5惬H]�${��|�-Ҷ9Y&�=X'�V�u+^�ϖE�m���
+��Y/�0�X� c����A��dP
c��_X��
�V�Rx�6���b�|C�6������^FeC]���o�-�F?f7���Q3�V�>͝y�Fs���y]�ݯM�F�����͊��k�^Nն��I�����#F�Z�.�7��Ɔ�Q�f�eϫCJ�n�;Aj�B
JF���w
+��mԗ��6��t�����(�I5�beE���l���X���Q����͌��
��
i,)�6QS �1zJ�ezVBf��
۹���ʹ�/���	HQ8�9�SnE%�o���-�4�NJ�`�`,��)�~u�t��yQ��N��]�vح �p����+e�"�x����N�6y�*������,�7�$'�x�\���C���QL���[8.d@}���C�ɏE)1���D?@晹���b��$�?7�
+	�Y��M���
N�|�����
_�Td'wa�}��0Z�������<���9|��3�����閗3~o=��Y>���l0Wb=P1��jmE� ��X�R[l�o�uv:.�C=���;.�a.��Bř�S[�n�W�J3�ǟN�1='\Xr���8�۲��:K�X��j�6�e	�g΀a�p� ��%z"��K�1��.c1�ɇzɭ�G�T�Ri�VB�e����� -�)K at iͬ�!�u�@_�`�&2�q��
u�p�%P ���
+��S�Ч|N�WP� !���o-t_�
��n�y��V|�ؤ��賐�e`Hʏ�E�=>\� 
�Tǀ�|��cҎ�k�IS�T!������%Gu,%[IR�'�������+#T�}m���3��\��/���df)��`����n2�#���\�M����(��CQ�d�6f��l��qG����v�첵).Z&���w�I�����Te{�������JQ�����ܕQ����E\m�`�p�`��Ҵ���\�z�[�v7OV�o9ݜQ�����}��$SSFMW�d��ny��u�я�:�	�*�o�[��3� ���
O	��
FRJ���0��ո�l����+��L+�&�
o�E�+d�-�
+�@�?��
^f�E��ko�o�\fy���J���8�z���ΰ�Xmi
����
-Nw�}����OY�p
z&�@>��g�ݪHc���.��
��]7M����z�#�f�����e"�g���\��a��@�\�qyºJc�\��3ܔ���
�����r�'W�QV�E�
D�|��P�L���s�\h_h�
�#��9�Z-
�T�d��L�>˼!���WS/b�n�iA�3���.1Fx@Ǡ�3UN�N^n�POZ�d��t<�jGLy��s=���>�vW�O&�-8ךs��hv���eSȉ���`wPU_�c�a��ř�=շ}�m`�<<�$�+��UV�6�6d�����o�88{��η���zkG}ڻ��<<�7�\���jvg!5M��!�w�&�GmpfS����g��O�3x?���
+wZs�LR�q�/�~l�K�]Q�V�����:�o��m��<Q�'��

�
R]�AMXy
��u��
�
^��ȩ����
�$�}�!� 9LH��aH8��h��ʡrTtD-�*��fY]]wu������u[bg���g޼ߛ����"���ȹ�� I7�����H�R�7�H�B�H�u��d�t�
�*�Ჲ=e���J��t�j�|���	�#T����I�/��W?�{�Ν��O�^��'�`�����v�'$�^��E�=7�I����TF�2˵���7-��^�'Z�"[�x
;�����[U�7�,���Q
yWrr�9��E��6c�y'�I� �gIR�m��2��� Z�Q����
+�{0K�,�^�H�/>�>G��@l`�T��=FZ����nZ�H	�ѳ$m�¯鵩�K�A�3D;w�����7����ŏw��^J<��`i$�M_�x��8w��U-,�/h!��pbP���1��|*�k
_U�;� ��N�45�����j��<?�>�X���_�:�]��$
%�
ͫX�+é�
��Miw z�z{7��`fOE���5Fo�h�X�}�fL�}��k%�J�q�_b��_ ��A�5��4WK������'h?�:l��TH�mm.	�m�&�"�X7�r��V7�����l̨b�]r+�
�O�pK�[�{0�E�uwrf�ӵ�Fa�jCCP�k��t�M�ݻ�Vw�[FR��(�Y�-V��E8����	�����P��?�)�p>��͛�5�	#��T��t�F%��
���3�	qhk����
�;�`�LVOp���Z�ۓ.
��j��&�\
C<G�P��J�qzK�md
+���A�>ʡ	<�*�g�!��r)J����;ȁ��&x�K0�N�\��B�&���Գ����$�bԍ7f��p��t
(�0��H�
2����3�ӲG1�d?ź���
+�b�Vֆ|�����\[�w+�tj�j?b7����h���wJ�Cm�m�#�b.^V��B���DR�b��8��E]4�J�
7LG�c.
X
d���/�a�&ڎ�
�@�顢
��zQuֈ4T��q�i˽�èb˕ 4�3���~,�y�moθ�[��0� �
+�l�}	��T�C�u�L�Bt
2��Z���W�>��Eh�@+[���y����0=
+�s�U"r]�;�û]���(��̏{�����e� �E=�m��a^2�'FKv�~.�Оm��0O�j(�e�s�ߺ���
�Pk*!��3�
I�B��
s4�{^�|{6��k\*
�}X�Y��Ǡ���D�=A
%��$�hǹW���ǂORV�����
����U�B��ꯪ��r��+C�a6���� ��K��ԣe�� :Zڿu�6&��?�W�&�k�).��]%��]�,l�b7MX]�[H"}���WL)RI�r�f�r?A��ƁY�&�I�~_�IB��$�{X��l��Z����X�E�&|�w�#����؆�`��_v�ߢf���u���3����f����m��8�9�?��9�
+̟��N�Վ��`�jz1*�������.�@��爎܋��`�o�ْ�J_����+- �4α6@��/DWE�jE}HR�Dl���;Y+�
���z���/������1�D�ѓ(z)oι&�;��.�4��aZ�#�g��
s�b�Z+�X�Wi;�<~�n�"�(�	���M�'��b6��!G
���lP<�^\��nM8-�-a��G+dyXP�^��s:����0q
\p3b����W�u.�,R�&�r��m��#<�He�ĸ�vQ�l���.ˍ���J>��қ�s)��lej�(�^ ��,�=�/����FV���6fj����;e���x��%�D�����k�%�!FW at a��o2QT�vs�
�5��h�0�B�{�U��H�i�GCO����zL'�pb�I�q����+'_1���Lv�
+���Q��A����%�
��$��[H~�}{�1�f��K�ٲ�:HmW�S
+��ëd}�2w7����
j����<� �O�����7�i�2�G��;S�W�ݒ�!�@Y�s�Z~��*���PƐ6�x�Q�ܡ��/9i�7c�G��HV�f�3��R>K�����2j�Z�xH"Z�"�)�
vH�D�}
�@���}	Y�J64�T(P_�(*�C]���mi���S�Jq�OZ�g�A��(n�y8}wν3���7���;�?߇�*x"D���6�Hae�Z
+�5K�	e
+tE=H�������\ƒ�W�8
��7��2�y��m��]L����y���	��1N<�8͍�@��������:�>
�>���6p������ӹ�<�AМ�*쵮�5M
+��N5����g���ܿ��]7�c�D�!\����O��6N�(���b���H����ֲr�t1g���u��N�'w�ߢ�e�Gr��u�b�J1��a�#�g�i�|��Gc��"����

�'x
��&�YH;�����4
�T1}�Ϯ;c�V*���ܲw��f����|�H2;�R��l��{��K��*��G��ZPg��׸z
*ۿ
��?ʗ���
+�ד:�N����9u�����L7�o����|j�B�jEV�QR��!Ū��;~;�Z�Z����xٲ�
+�(�񆜦q�����E蠟�V����7�:b��g3��h\y����g�.:O������0�7��Ң�
�b�4=�N��Hdto{�<��WZgH
�NR��
�RZ\��s�W*Zx�� ƻQͮ�l<�I���Ts|���X)���c?��p�\B� ��K��u��e��|0|/a�hB�|樕���sEG���M���s��M�d���?�*G,����H����R�g�[)|�3��
C�Q��{0b��Iט%9*��X�����R
�M��U)+�^�
�P�,�p�y*��~uR�Hw,r�~L���;�_���v
N���"����ۿ�]���//S{̑��Ͷ�^���0X
7�4�����㊈�#�ޒ{Y�<mg�$���5`��Vs-*l��ۻ�g��r��i�˕[
����L��X#DEhgq
!N-_����c	YP�a
�!w����|Em�"�����P�D�OUHS�r5�a�+[��
m���
+�Wh�*¥{I/1Ywû�Jy�׸j�k�@p[�����z�3*R�e���RXwq3�0���u%�B�AŒ%\N�C)�W�'5�꡵
+&�F+U
,��d5�gR
"J�r��VDB�SDO]V�[EסdyVӃ�1,+�Iev�"���`��Wrw�Ka��
�G��|����`��%+T�VR�C
�F���{Ys*���Z�5� ߬�R�e�s� Q3
+���j�QA�4Ӌ<>���$�.7�$C$p��
��
���A�)h����J��ew�T��*Fm���K�g-��l�m��*{��{�����v\ܲ�s�Ja>3_*ݑ���ہ>��V�5�|���WG_
�>��R��R_YL�!�R�F�jz��	S�5fځO�2��<�� `��}I\:��X�i�Zk�R
���H*��4����[(�x��X��$u|I9̺TkV���z����l�_�׼g�C��%�*�
�w�XR
��nY) N.�9+�wZ�[��E9�ľW����J%�w�p`Nj���[���.�b|JOsd�W,��R�~�#�*	Ľ�yF�dwC��p ���*�L(8�Oe��lL� �˞)A���
��v�f���F��ʹ.��Kn�d�~A򥾺]�Di��
(i���]Yʯ�J����ߟ�?�>�w�[侾
�7���KK�6�w"��!e��D�p� �5��V*
�3VEa{:KoED��cɾ���J�#�oOU4�
��4����l�TjF�k�,>�{S�?ý�Sk�>��Su�����=�|��j}�����T
+�SU�.nk�.����������m�c�Ů)Rx�b� T�<�T�V*y�Ù<+�`R�C�;S�^����0�-�itp��<ȗ�2I�Z_0�ȡ�VVKHW�ol���9�=�f
d�

j��b��%}D�C��y�{�s��I*�{ZL����1
������r`n}+�D�����_�*�Uz�3�����}�i7��7��9_�k��jx�L�+u	
�;�FxL�.�m�m���Q`sK�z�������K#�>����&����ޗxiB�V�^�\s�3�_X��X_�ر��C�+ҭj�|S��	�k�Ͻ�|j|[����X

+Ά�BL���.�?�\��D��C��q��ߢ7n�O(M�&���JO����������i�ݖw0�� ���I�J�LM,NCOYPoQ�R�S�T�U�V�X
Y#Z:[Q\f]x^�_�`�a�b�c�d�fgh#i3jBkRl^mgnqozp�q�r�s�t�u�v�w�x�y�z�{�|�}�~�ˀɁǂŃ„����������������������{�p�d�X�L�@�3�&��
�����֜ȝ��������|�j�W�E�3� �����תū������}�k�Y�G�6�$�� ��ڷȸ������~�k�Y�G�5�"���������ŵƣǑ�~�l�Y�D�.������оѧҐ�y�a�I�1�� ����ڲۘ�}�b�G�,��������{�W�3�������q�H�
������v�U�3�������s�I�
�������a�)�����\�
���Z��  ��,���
+






��������
�
�
�� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�5678�9�:;~<|=|>|?}@A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�c dee�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�|z}o~dX�M�A�5�)�
�����ۈʉ��������q�`�N�=�,��
+����ٖɗ��������m�Z�H�6�%������ؤʥ�������������w�o�g�`�Z�T�O�L�I�F�E�D�E�F�H�J�N�R�W�]�c�j�r�{ĄŊƐǖȝɥʭ˶̿���������������
�*�7�D�Q�^�k�yކߔ��������������������� �,�8�C�N�Y�c�j�n�o�l�d�V�D�/���  �h�	2
+R
e
r
xzzzyuph^RE7)4=
@
?
:4 ,!#"#$$�%�&�'�(�)�*�+�,�-�.�/|0p1d2Y3M4A566+7!89
: :�;�<�=�>�?�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�||}v~oi�a�Z�Q�H�>�5�+�!��
������؎͏Ð��������������x�p�j�c�^�Y�U�R�P�O�O�P�R�U�Y�_�f�n�x�����������̰߱�	� �8�Q�l�����»��!�C�e��ª������9�^ɂʦ������2�T�tҔӲ������
�6�L�a�t݇ޘߧ���������������������o�X�\�[�V�L�=�*����������b�/�����f����M���q��  ��	T�	�
+�
�
�
�p_L7!	������}tf
U
A
,   �!�"�#�$�%z&d'N(9)%**�+�,�-�.�/�0�1y2g3U4D526"788�9�:�;�<�=�>�?�@}AoBbCUDIE<F0G#HI
I�J�K�L�M�N�O�P�Q�R�S�TzUmV_WQXCY5Z&[\	\�]�^�_�`�a�b�c�dxeffTgBh0i
j
j�k�l�m�n�o�p�qlrVs at t)uu�v�w�x�y�z�{n|V}>~%
�ہ‚����r�W�;� ���ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������ �0�@�R�f�zƏǦȾ�����
�*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{����� � � �O�X͙�~ʹ��~y��~e�L�~�j��~�Q��c=9 ����~|�4�~c�l�@~]�̳�~n�f��~��C�~لOiZ/�gP����8�v����}6�q��}0����}>�ϲ:}i�^��}��,��~�
׉_L� p����K�-~~,*���~��&E()D9�v��yo�w�y���=�TS3�wI�!
�D)�J��%����OBv���w�N<i����_��ΝD�g�A]�3w�^�|�
<�~]�
+bʀ�}�S���W���?������CN�<��-Y�4����� ���B����Yp�z�S�)j"��{%�>6��4��;�
>��FVW���m��
+S�^�D�i��*��bPk������pة�?�%"�1�#!ϼK`���L�<�n-e��2*���+�)	X䥂C@�v2l
Q?����(=�0�q��
Mz�ǃI�z����7ME�Y;���
Y��@K (�-� �\��U��������&>�r���I�^���2���I�Me;Ya����"��V�N�,S�;��o�_
%s�
�D;��f�Ǝ.�����R?l
;
0Dq�>�
��8z��D�KG)�3o��+�&�<4��@n͗0�E��O�9�4��#��Ґ���n�W9
�b���_��
7}B�2�yːv���/ąJH삻Ȧ��p$�ȫވy;�Æ���ǘ�f��o虔�F¨Ls���I���,Kh�W2�!�A��jHE^�τ���� _�w�d�lX�g�g�Ωr!jU)�[%�B��\D��Cf�p�
�<_��\?�k�,.���w�Ȳ����i rJ����R����ݐ=>0�+cv���Z�{Hl�l�
L���VA��c�۠����
^{6o�Cҏ���
S�
��
م�bȏ���:sz
�
7�j�P@�Q����
��;[�w�g�|z3�0Uq`!�P����-~|���X�3�+�z2lIђ��:�_<����a�X��S5\}���E�^����G���
+�X��J4�^�Ƭw��/��I!5
+�bn�#�F���O��� ����`.ܙ�-�J\�!gZ0�
+)�ݥq Aß���O��k�V�
��^B���f8KĈza>p-F��O�J*����Yr(���".
��O��'����q�ä����f��rC���RJ'�dc~��h��!€�?�`���}W�zBd;�hѲG��ϲ�m�T
��SAi�j9�<�� �
+ߨ��%�@`��8xL��T��qė=�
,Mk
$hJ�����d�����x_�r�̰gʱ��h�t�G,�K��
ytomVK0����X�?R<�J%��m�q<UG]I�X��'t�9E��
+$Vt�� �������ܛ8�i�(�G�T�+��tԃ��]
�6k�N�*���d�$m[��w�_L��-h
��k�,Ȭ�
�&º����^>���=Џ
�]ٛ��a��`sʠ�7�
��g&Gr�ŀ�?>��r&�z`�b>&���z��
%��sx�
bw�&�{�~
�څ��]"W�R�%��c"z �D
����zA ����r���s!֝=jcf]��rm��A��NJl$�� ے�#ؑ
�>���wTf�
GF�F69�9<׵.�'S�Z*�˺#�-�Jl.��Z�Zx�%m*�|�����
�o�	�2�ӝ_T��W�K4
�eRsu33'jRF�B����Wl|��
+��F��gml0L�1�
,
�����y�+�Hu��2��f;�[�T�0BE��{�:���qn�����to�T�]o������kI,
+
��LgV_R:�Kϋ0�d�P?=	��v��E̷փ(M4�m����\��T�k׉o�����,�H��=����������Z��w/��E�I�-LQ����[����
�8�F/�g֖'$��?�[��u~f�g���h�X�j����ݚ-�	VI�m�
K��Հ,%i�b���Q���*e9�7���������W
K�����M�YiHt�X�T���BUD���w�-�4��9#i�ԗ/�r]�hGވ�/�
+
+lD2
h�‘�%TT�T*F���dw">���G��Y?�"��[f
r5��ʊ4��`��TAo��4H5�rW�S�8��Xy��;$Yr���'�q �vUP��V&�����4m�/5LJ��E�:��S�7��Hv�y..�� � k�P  �X��Al���`��
+��,e��:
E�$@B�Kr��.!{�A$A�,�C�Y[EA;|�
TJkU>���4�1a�Ɯd�cT.�����Us
R�&�Bc�h�R�)�����
+� Pd;���ʟH�b����l?1;_�:i�^��m�Mh9Ӝ+,�x�+(�‡j3�=P6u�>��a}�&���b�
(���0�=��.À<��2&�m�%�u9��_�~z�����L��!�S`(�6͟>թV��
�l��W䨸�m5y�pg�!�2��
<��	P�R%�wC�>��u
�b�v���b�F�.0���UK�$�K�;�؂�P�,�!�rA�5��%\��v���"�
+[2�g�w���dx��J���:��_�'�Eښ_+^Cژ�� ���I!	v��,���V7�2UJ������L��N�ITU�K�ɎIy/R+�=+(֨����v��6������!M����	��@P�B�%�R-��-�3��|4�-�����)#ͯ�
�w����.�ܘ�<�;�
��b��#��;*��>$e�G���
+�>�3�
�����"�
و~A��Z���$xOU��x��
�
f𜓜x;٥Q��
h
X�(�Z�����x=�`dš��
8�b�†i��d�, ϐ��!�enZ
+b���
/�޲��І�����2��P�0~�
�+��1�b��a�
�k��tT ��	�?�g�)��˧�9��
С�`.ޓ�`>'4��\DRd���Paxԗ��
����?i|�9�,�t
��Ĵ�q]��"��m-�9�O�D��'���E
x�>�#B������z6����N
k�%��tm���6BDzV��Q�G�
q,2�O:��
y�{i��H cy[]�v�a�Z��T�5 �Ȩ�R
3��4�5N�@q���G!�fYXr����{�3^�
��M7HX1��ey����������8����7ҙ;N�������P9��tn��/D�=����}*��I�:��2s�̋%�����G{��<Ie�d�X�w��39��5�I��ot=�ޓ�*
̸'��
��(���#^s����{�\���d�Y����dS�j	V���΢T>�7��a�b����� T�B��m�6ۺ�4JZm�I��
׶�F�הz�\F�D*r��E�y� [...]
+$Iⷱd�`U�+�����z�3��
8"}��Y\�E^�\Q��ܵ���)<&uZ�!
FM)V��"�ڟ}���&à/����
�
���5��
����O546�PW�눤0��
�f�GlE�bd�c
��'�ƪ�r��Ӭ[��{�K(��"M/y%���0=����zF�Bx}��{w6{Y5��0��%,��4�0�R}ԓ�vT��p>�K@�f�R�$�7H�U�(	�����/1��0�f<,��1�B�S>���٨RI3#&�&���p�a�5j����1��9#yT����H�9c�I���[��է��j���U̟�~��?�����
�+�7��N�zM�`k�|-�k�qJ�}(Ҙ2������S��aӼG�i� �;� ��b�:`uǤayU�}T��	2����Ftm�̔
%OpuD�����U0m~L-_������:�q��W��g�0~�huw�-]�
NV��rP�
=<�]x;Y���1�iw@��8,���n����\(z��q�������b�
!$zB��&5d��n��6
�1Q&�
 �&�
��C��u�Ўy
#����c%$7�]w'z\���0L�k{8<Oz	���o%4�P�˗�
+�9hz���͊��$�L�mxEFGO��$���Dc�����n�:0td#�*�v��T��2��.q0��6���v�g����Aԡ�n�3����l�'��H:�<@�I˞��8!�mR�S����s�^���U��g��f B�
�u�2L�> �;��f�G�S�
�Fx¬P�~���K�����m�%t3�M��� �c��cM(���bC�B��$
_� ��J�,���@��՜   ��%ӸZ�
;�.�6��B��)�P��T�~��~���:_��tH�NI�T�S��c��Τ5���_�3���b�O�6�-[o�
�7�$���c�n����:�zN�q��n�E2~�7\N��T���'�
�"[�fTT��^2F����
��&��+�����c5r~ԕ��(����j����l
4�8mW�DC]X�#���<����n�_	�T�� 45	�C0
V���~
m��&AG�A����7w����@�w����;����Q8� ��Q��
��?d��9���#1�y�ʕq�_eS]y|�d�*�&6Q��3�0J(�WG>�H���N� 
v���Ag��+�[�o:y1ډ�G�m�UV�'p�J{"�����M at 3��X���|��*�oƙ�ޞ�%sfJ�<��ߔ��[����-0R'G
��i�++q��NPF�\���&���XT~y�k�P�x�>���–����������~u2LX'��P
�M�O�W�	�rة
Z?q�U�����\+w�>-�q}y/sR�Q�Q�����J��@737���K�a[t̷�����E�8X��,��T����p����!��P���V�� K$��`�����Κ�׵�b�u~*L��lB�z-��<�R&,��+?�AP�]�o����L�K�ِ
'y����
�Y�?�
+~�t-"X�n�v&���?����VA�G��
+�
����7�W����h�K��D�Y��Z�%4YF�
g�[�
��� ��C_�M�6ЅLJ��!��)�9�
�!6��-��l?�@��W
���?�t`k�;�����p��}�
+P���>�f�{��i8Db����Mp/Ų�F
��_<`w�[�U�q��.
���Y!�'i7�L'� �R�z$���v]�c�-�ީ%HY�~�ٕ����
�鞀ws{)W�a��˹��ԑ`����{�[z��
���ϡ������Z�&
���z
+
-��
��U��@u�BP.8�jz
�B�{G�tϤ1�ޕq#
���^�o�2��N*`�D��Z�m錞c�@QY��@����O�����y`��ŕ^ ��)�H�?�?��s	%�����J�@�f���-���H�%�{#}ř�PK n@�u�5w:=�Y�X9����(5#p
�9#���A�v(~�-�"]�Qb'䠡�y����a
+�������'����£�	+��v
O@��%�7_�*Z-r*��~z Ց�4��
!��w�Bp����G-q.�a+��c��"wmqk=���WfB
+
k^����0����>n�pu�5� �㞃= �m]0o�����-1�:ǒ~��%u
i����;�p�V��O�/a3��;0�o��Kܼ
L���6��E���d@�ZU%�{
����^�
Ͱ�y�O��V�NHLm���u�?�u
M��B�EQ1\�IُO�u�i�@L����7�Nk\��dd��[i��|����lRܰ��3"���r
W^ ��
+�1��9�~�(�V��ZQjsf���b�5~N
l�,
$LAE ���\�����Y�v����3k��"�*��Ie����.�gj4u��D��k"�*T�~~���g�^�
�~��<|�1�c��Px7��
kF�84�K(/AI�\ %�H�
�G;�'��6�������`kK����
+���Z�J���A�Fq��K�q�$5�GT��#.��a<��C]�s�zO��9�����@yQђ�-��D�RP����G�D{��n�����o��^�7�P��vU�v����T_F"�T��e�
��^�9��^�9���(Zi����*���J�|1�"�]����.��g:��E�TI�FzN���%T�|�k&�J�l���I��3ʌ�+�r^�qf��SNM���X��e��
$��v�{�ꢫ?�I��B�-��-Oi�0iX�o�
�葚T\���.%kR&-?(�m��=���?~3�Jncu
�/�mS<��Ð,��Le�H:�
�i�_+MSV��a�
k�@  \Ѓ*��+w��qDS!h��e

+�4��9"(h�d}+ɗ�7��)T���	b�ǪԪhm��`Y�ջ��
�s
<��-�,@��͋������SCg�Zw��N�	CU�c��W�����-JGm\Q��A]Q�]�h&D��0���Zvnw�%����0��z
��MT�X�I����:��l���<�7�
�a�`	���5�P`��ݰDh��k?�(�b��	��
?�`F��g�����ű��y���=�4EJ���0	GvQ�O4��W����d� SA�nM�C���
+ұ|`�7ø_��vY���Io���R�yYqE�,D�;�&Q�\�B�xW��r���v
t�

�
[���\"]����U���ˋ�
����w�髐�<�
|Mc+�����
�Z�9�(W
Z�ʳͰ��f����t��~X)�U�i��?�m�<P����	���;��G��-_k&ڞI&��M�L�<�:��:͹�7�����Kƒ���KX����Ѫ��W[�5P7W��tt
b�E6ռ�z
������~0�i��W�űہi4
[$�k����i�l�$����VRc4ӫ���Gk~ʿ�YQ�:ٮHb�F�G�X
~�Nu�.�kf
��c`�m
��f��4�걳�qVP~�:�U�
#/b�E7K*�W0��]�q�=$ܭ��� �X���QM52ym�B�S<l�U
+�ZҸL�eD׊=�

B��kLBR��Y�^�
�#z�A�%�ڥ`r^��'UIo�Fg�>�;1
p�'t.t-SSUn;Q��Y(sў��*�M�8=���
+BHZ#
��GcD�S���{
d'�,U�t���l�=��,}�*��v�cr�+�]�(_�1r�Ø@?A[��K�Dl�v'”o�>=��ԏ������[���?�Q�
�
ô n!ܘ���e���o���i���B]�u3����PzP'ߧ�%
�4�4Qw� �	L7@�?;�gS
Vjgo�ho�p�7�sy���
�R�\7�����V�%xL|
3 �n��|�2Q|��-��Go�t��u�V֘��Gk�}��fd�'�̐�yQ/;^��+b�#��&�~����ي2����(��<��c 3�;�n`9��2[

�Lqzt�.��)�<����lJ�a�n��
X>��ɚ��p��Tֆ��)��$��Dr�u:5�z�j�,|�~��0T\~�>�*,6�Y
+�]�7E9!��7���;a����u�*��8Y?��Ң��#� ���W
�f�iA�~�\���mB\�$�O�wD h�E��16:_�����J��qB���R%��*X���3

�!��O���:�`I�����o��k��2�+��}�Y��'1�%Y
�G����PMJ{rK
�����w
��
����_��
��L�&N�����
�N�yA '�ճmﺾo4gz"�v;L�	j�e���
%Ɯ���{��N�S6��U'*���@�d���jNc��v�o^=�Bi
���7�95���l
�
€A��ⶫ62�7�I����C�k�y
V�_}B��.I=��YR2��U^�c���<z+w@����b
+�"���8ۺ?pG�Z:�Oȿ��7�Ý��T��ԐI���
��J�A�����x߹rx���n?(��؁ w�h���?���F��O�Gj{�D
"��La�W�e�}j� �w��*����62�y3r3O�(�1�;LS��P��p��a?��
��U��}��c��qT/+��~���3M�ҫy$�=IQ�RS$�@դ@&\�l+f���EI��1k��ڸ����v�x�}_���nϐ��M�fB��y��"m�
�9�nQpϼ
Ϻ�e��\I�2��Gt3y����)w���%�u�$w[6o
@&zܞ�Y^�Z�w�;<\��b���m�����"��������{���3
=�s�
SN�Ӑov�(����D"��i��dM�֬Lใj9��Z�K7_�<��ې���ø��9�74�P6��
�0,�R���?����D ���m���6��.�D�t���he3
+����>~�o��\Ƙa3Ƹ2���@e���U*Tl��m�c�ӱ����� �~� x������n��N��������U���)o`Iχa]�����P���F�ŚVTC&�ϣ�࿋Y�=�d]/��
�.��.F�BX�s+$��=�}buM�>�RWm6�Ŗ6ᢐ�FX �5�x{v*������j;�zv��<���_~���� A��VUJϐ��^Ij�Q�x�シu�Q�o�=l�K�_��Ց�E�kZ\4��s�qU7��vOa �J?��Q)�4C��^����\��k[{��3��y�~���M�|J��'g��4Ay,$�0�( j�H��l�:Q"V҉�1X��&e��������
�s)M�Z��(�W�
�|�Ϲ�\���8�8&�t��c�p��Ҕ��a����
�͔����
�C��C�
GU�$^�fb���|�8u����̸
����&���A֍�9k�e�7�;�㥦���k�o����Av���Տ0o5����y�'����������<�!�����H���P�4
��|y��C�{_�2e��lTr�s��*��Idg_��'
V
+Fv�z|"��ƞ��ҩn2=�3[�"s����t�	�}N��8����`
�����1`X�i��]�x���(�U2\�o[v1�d%JOO&rؗ��0ܵ9�Yx�ݨ \��
��D�m����]=H�j�ovfd���)�:�t��b�dH9\
��ϛ�Y�?�8��
<%�}��dV�ەh��nu�ӻkV��3�+��(+�$���
-������#��Ջ��QҰ�����Ж���X@��h-Nd���$�a��>�M3��q��"y���$�[Y�@S���g�Ó=ݎ��P����1�)L<�d�"�d��rՕs����W��	��DJ�
+t��b��
�c�j��*���!�A�q
+hG�|�3j z�O���� ��|�
N�
+��*������%2#
�Ǔ�H�7!�
;v����� '�;��
O����~h�ĥ�%�,v6�Bբ��Tx��Dv"Lt�ïK"N#��.ec�}f��˺��d�&�T���R��AS�;Yq!������E,������AA�m?~������[�7��[ ��>
\�!�B;U��!�)/������C$N���$�A�³u�e�uU}�,3Y'��/J���c��	.8_[
O�����N-<"N�����awG��m��_+�yj~P�]ſ^\y�
X��,r-�|�㒒��ܳ���<���L^T}��,�^eDR��,��n�kqց%��|r,�!g��Jx�����=~�p{"��\ee�E�N;��Þ ��=���$���{q@Q��_��\?�/иLe���>�u��#��M����p�'Y��n�_e<�q㼅����Ra8p�LB�=��(�YK��[l��`BK����B#4;c��;H�S��^��OA<�J��~�I4,���$"���,B\HV'&fಀ/pO_*���_�_�#���&l��Wc�K	B�Z�(��|Z���b��+|���KpT��
+�Ar3v�*>�����>Ʉ�x\�+�0lk������O�Լ`� �F���cfup�.���wlC�n���KJIi]����&���f�����XPA���n�1ک���F�TK��BoI!��Ӯ���Z�� f�
)~��X��h���y���9�
ݨO��C5�����&�|�T2���Ӳ���n�SLB5eD0��:��
yP�;��(��w��9m��Ϊn�Wh����K�u����{�`��w��k�����
+��kH���>*�ڲ
��1���
�w�p5�����Q����݌�$
�;����LvvJ1��f����3n�*���T�g at oO#9|}����?V0M�5.�ۀz�{"
N�K?�C�_$
P�&B̆e>�(
q��I�u���`���|o�b|�_�0l2�Wꂝ�sC��ܴLT�
�I�a?�f(/+���P�Iw��B
W�h�g��šH
 ��
Ei����(G6

+���
�
�" �
+"(�H2�̙�dfr�	$��x�Z�EP>�ţ��
�����C������~���E��F�:}<
�\{
+�����%����
rH�6N$(߫Nᷘ_%�1�����]�2�:$����o��-�8ȥ I-qt;�'k��TjJW^�}�k��fQUr\�u��
l�N�
kHn᫂�H����*�W������d6��
M2	*{���`�V%���VR�oJJ����`+"�yO|s8����6�V��y8�
�:+����;��9��ɨ�=�.q�q���ѝ=���ɥ��^ӏ�w�ld���G���;<�bSh�
	�
�� (�����%]�
�N�}uAܹ�
�`MV����?g�=�&�o:R�����(�tWS-{66C�S����������U���foEI��hzE�'�ܜ��&��Q�8,�g�]-2t��%��F@}S|��QJĜ�h&S콧�bor
2w�q�|�o�����/�$�
Ĭ�7�Aң���I�MXIc>��f���H^�2��`�zB�ȳ�
	ŞO�*�{M�2MoR�0�i����:�T�~%�$�9ED
~c�j<}
���${.�-��+P]c��=Vz��pwz\S�;!?���
C:�G�F����Iױ�q�Y�Ş
݇>;��]�����m�S�)�yr���Ez�_n˕�aI"l�|s�G��������vm��ߵ
���_7e]֭�>��Г��U�)i:��D΂�G�}�V W�5*��{�f��?�
+�(��$�p\)9D$ZY�r|�����(�4D܁O�H���ʳ
;ܫ��v۱j�x�Lr_r�
���;Wi��
nV�|�R��u��dܦ� ;�@������Y�N�<q�Iȗsc�E���^M|��K����ƿ��6��#Q�쀫��Hl6�\�r
��E��jJ����K
-�β+� �x��=��j1�(~ǒ�)�C[vQn1����򑾪�x��V�
���a���u� I[���
8��m���Y��GeLV��(X/�%W}��%
��
+��M]4�ǽ��A�ߗn�װQ�ԈX�tGd�Ƈ�D�\wQy�R�>�l-�Q���nJ��Ȳ�c�/�����14��
�C:�'K��&���̕BO�J{ߴz�f�sW��|F-��q2��
?���}Y[�pXd�Y<\��v�+�
�M{��i�r��8��~�LJޯ����
�vlL:��	?@���o�[g�`���}�>?Ur�ǛI2��L�k.�}GpI8�Q�RV%܂L0/PU���E��
?�ɹT��c�ۼ�f�H��s��^QM�C!��)�$
�;
�ej�
�uIy	�W
����6���#L��Mi9�Ħͱ��P�*���H��ʘ����F�g��]�m��ߝn�+|���X$Z�6K'�
�O�Q�J�q ���m�(B~�lj��Su�Z
�ť�bhW��P"��z@�U�
�V��J�΂\�,<\H��A�
��5���� �O�af΍�C75O
����<x�5�
��MKQ�����e%T�f�ʤ��6
S
sFt���TOU�t(���
�2���[
+ES!.?Ӕ��#��C�:[�6�$ߴR�2G�[�D��U��cb��Dx(M<����}��|�y��%�����}�ђ���Hm�zy�Ey�)�9Didh(Cp��K�o���Y�9_\n�i�Qsƚ��Ӯk�X3��6R7��U&�"c�T4E�ʈ0�X�,t	��:�T��/>Uݮ�x�7�����F���>Q��L��~:ʥ�#�]�[eTS�2��%��c�
���Æ~EW��g�9��i���%�3W4ފ:�}޼0�_�X|���-�ƣ�µ������V�u�8H{���Y�F�"qĔ-�F95E!L��/���3z���Lw@��
"���F���Rm�O����Q&�[�#�����
�Z�O��/�x��ˤ�r�~9�T0�0b��ܬ
�4��Pߋb�>_nMFY%��<�ip
+�;R�x���@��|���qj#�l�j�?Ape�  �[�ۊ�x�{�
+�s�H�t-bM�#���t8f���5�}s�c��0�f0

CcB�K�R�mc�E����k���ץ�JH�[�ۢŚ<!)�N�o�OC����I}5����2���
������0�9���tMب�������7B���0�؋��
����0��z�D�
K�
�Ye��R�U�J�����ѐ:N::,#��D~6�ž���4o1��l�`��q5��X��U5G�"����Z4�tX���� ������
��cV�u�{�_<�9������S�N�}h���%�{�nԾ�"V}V�"C�w}�t���)�b�3�zFj�oK�����j2�'��Q9
+]��\Bȫr1.8�C|��.x8�~��pG��m<�ϰ�"i��S�˨�
�ڠ
u[��)�E��k�+WE8x����5�
q�g<k~���[��0n�&
ˊڮ�c�A��a��
Jú�g���"�:�"].f��f�5
	R�u��B�Tu6�u�|�;4R�
�'���hNp�\@I!��Bq"��:*��pX'%O���$�K#(�
�}�vW��&��$�����n������x���T�eحk���U�^�I���kK��l��

Y�+H�;"�����^�\��#G_�Km��R2�y���fbI-�ب:ݐ$;8�$N(�Ӊ�x���a
+ ��1��"��*.d8>���MO�a��N�$ʡ˖~
&(��$~��>�����t�BM%^i���3��ϐ�Ef8UB	 �
���'`-�icIaͨ��+��	��دR���=�Z�����Ⱦ��Ł�=�5�U#��5H����R����>njky/����s6��H؃�E
oL��y����C�G��/��?QE%��F�v��MMz)=Z�B.��ϡƋ��/�•��3������O��8��5&�Y�����K�լ(�ST� e�ҝ�ZV�
��x'�xaV�4�Ë
�*H�]z~�h~
�i�0d,�K��8��CZy�{j��CF')�b�
|x���NJ>�V�{�0��e�#|S���E�1b狛*_�R��"���
���37�����B���oξ��(p�3_�<ݥ%-��t��ɫ�B�e��t�Ɠ��px H��uRuɵ)H?�m�����
�f@�Iz�͂qrgM_����D�|Ce�
+��ӯ_���w�CՄYK/��Ԩ	��佨/���Y0�����y��̸
7�.]�*ѳ���a �!�d��[�m��9���#{-�;�W�[����	
��U�$�mb?ci�3�ؘs���q�6�ĂT�
t� ֠}���
�dl����v��{�F�yt/ټ�t�����̰��K��Q8���
N��"���4�ʻ�c �'׸N��s6��I��
<�fWϚvЕ*�҇�T� 
��9�
�I#�{�	��mVx�@�.
��\�EyT��}��W�*�fҿS�ѵ:'��hP��of��ħ/7��n�
u�3֭F����c���ȶT���5��y�ŴѪ����L��i�Ӕ���%v
�I��G�	�ɒ3�m?PH-k�
�;?�v�bkk���Չy��^��4o B[�*�Bo���R
9���^F�t�b�Iyd����W��$ګږ�
�N��T3�VYzl
((�m��"U�a.\�vz��C�5H8�H�$?sZ�6���=:�hh�B�!É8
+`,�
g6�$cN���!L�p�<�
b<���Nz;�0y�%�
)�
�"�
�D�B@�
;�.a��$G=�W+����v�F�v-�����|d%��ݿǁ�gOŨ�
�;$KF���lb�u#�^$(�b�	���,���jdM�[s��kx�v�͆��c��?s�B��fl�S����k����Me͈Ly�i��3�TZu�g�v���#���V'{�F�,���8+�5��%\���Y`kY o���C��,VQ�"�B�k�5Wjؚ��


a�x����h�k�"�	�A�ƛ�/��d�X��!xJ
��(}�~��&�|�
����	�h��?��.��������XS ����qX�}|�#Ci�ch�K��VF @ d��w^��NH L
+jk�u�j����V�JE)������swm��^
��VQe��^*�7�c�Su�5�.�:��5!{3�A/��u@v�?�aD��UNC�k���H2)�
1�z%�9�U鱛������v򹰗�!�k��0>][#�?�w�sb���,4U��_	f�)��E�ď�*	uä6Go7�6ɵ�
���{�����'
C���Ga��+���RU�A=�@��5_�rgs1OU��G��*��ʚ�O�
&��Q͡�4��%����
��nl�c=�%Z� ��v�Y
�Ze��ਝ4�?
eC����`��
�

�_���wvĦ10�K�B/��*Br�v�4όwM��	0����
r� �`���$
����C�ܝ�G�a6;g-N_�&ɰ�.`	�`�0����M/s\�P���M�f�`p��3������ 

$��A7�	i��	���c���(y
<�N������6 ��e/�
�c�POj��m�+�YЪ
C�z��Xa-��
T��`ao�t�t�._
,qg��O�����I]@��f"�	�?4|T�]�T7[��r�5+�D4UffN�]Ϭ��'�Md�d����Y��%A'-�:�x�>�j����Ӎ
�5!�U��iMSD�-rB�FL��&����^:O����F�-T��4��w
�������T��3c
q]�2��R��d�/3���U�\;?���Up=���@�b�
+TYRJ��3���O�)*+ s�W�u�.��[��L6�Ǽ��A�. �귒�h���oN_�=C��|��HW�	Gz}��w\��2�h{?�U��r_ס�,[<���4�Dm�D��〷����C/
�F�l�
M�r_򑹾�g"�P\T�M�Ii�D��w�$��=`
��I�Ӑ
��}����6�.��jY�x^���h}]����"�]���l
+��8�"ӽ΃ǐ��
L����"�H�ڝ��k��:^֖T��m�������� �.���^�@1�~qxT���l�U����#U7�����5��:��L�E|4�&W2��5e��xz��*̖̆;�����M�0��do�^�lpm����aI�S�7�kD#���'͊$�"lL�?b�A���DI����N�mEh�
��8��Ԍ*�"vұ�E������
���݌5Z��5
���
�`z�~x�[�M N&�a� |�b�(��ǁ$�ch�
�����|cq�)M�_���Ɔw>bSО$
��	�D�p��
�z�!G@o3���
��
�a]Pn�N2);K4 U����"�p+q
��7b�������L����a�y�$�04��iC�c9��(�6�>E3a�{� R䏡�0`�?�s0��7y9'`L�q��`S��cLr &M���P.ڽ��,��_�r��u
����/�F������=܏��=1lt�Ŝ
�9>1�lם
+��KX_�t+	�
�=���#�ثL���
+u�uW�K���̹�
u)�F�@�������j�R��_$����YuBś�G�bQl+$���,o8�q�l����g�
!)
����n�2Q����U�>Yt�w�(���^�
�'Y�������
!�� %�G�U��9��� ���,� ��&>�YcwU���
�M����j"�
��Z�o6V��WF9�=�a��l
m�y������nqA/2�A�I�̐���i���
+q��AN?!9Nxl�b�O���{�e�i�Y�Q�̶�>S���Z�	.&�s���b��j?1_��ǡP���k���ٟ�
�x�`дY�!�n��6f�VJ�?ff�o���n��0�����6l�)�7�B�u�yMA�Ѣ�&�m�>�>�Nj��#4J%���&|���
E]ۊ:��i�2g�0��io*�6zX������h
+�҂��3;���1"��2ҍ�+O�?���K��ja����� ���Y|��n�MH�p�A/�LsI5��cu�*ΐDx�!W�
{�|m�p�q%��q�eh��r�Yb�Bt
M7��u�A-�
+w%5��,x�+
�z�!Ί}|%��w�pȩ�xe�Xx|Y��y$M�}y�A��z�5��{�+=�}5"6�~�{άq~�p^�Q~Md��~*XŸ�~,L��U~S@��~�5��
~�+f�2T"��P�{p�U�Ip �<��dG���X]���'Lz�J��@��ς5��)��+��g�I"ۇ���{�~�o��e��c��,�dX�؈	L;�o��@���}5��^�E+����#���zЩג�oy����cơz��Wܝ��L����@��E��5�����+��
��#N����z��O��oK�/��c����W����
K՘$�B at W���|5��%��+׊��#x�A�qzt���&oM�ɜ9c��l��W���K×���@V�� 5�����+�@�)#���� q���h�f��j�[Ű1lmPʪ�npEХip�;
��s
0�Xu�'���xzŒr{�qD��o�f��p�[ԯq�P䩪sNE�t�;=�%v�15�x�(
+��z� W�W}
q(��vsf���v�[���wLP̨OxE뢳y
+;N��z11c��{v(_��|� ׊b~mq�C|�fL�o|�[y�[|�P��|�Eҡt};O��}�1���~/(���~�!E���p޵�f&�B�p[Q�/��Pt�ہgE��S�;P����1��ƀ�(�Ā�!��ހ�p��,�Rf�O�6[B�5�Pc���E��`��;U���1���*)��^!�H��p��y�`f
����[>�f�	P[��AE�����;Z����1ٓ0�U)F�j��"0�΂op~���7f
��![B����PY�_�EE����;T�\��1撠�C)k��"d�j�pm����f�r�=[M�,�1P\�Ǒ�E��S��;`�Ћ�1�'��)}���"��
��Ρmf���n�i=��p�kq��r^m���to�lVu�rX w�tD
y�w'0�|Yz>̾j�qźjl�r�`n�t��p�u0�rnvgkbtgw�WIv~yCtx�z�0b{x|b��h�|~��j�|���l�|��^n�|�~pp�|�j\s}AVtu[}�B�w�}�0z�~l�;fׇ
��i�
+�9kD���mh�5})o��viNqꂿU�tX�BEv��=/�y��VǧeP�{�qg�����i卞�|l
��{�no��hLp�(T�su�SA�v@�Z/ryX��_d
�ִ2f}��}hƖ�Mk�/z�mt�Lgdo��jT3r��xAKu��I/8xσ��[c&��5e��[�}gܞr�Qj.�xy�l���f�oD��S�r
�d@�u��/x\�
ębp� �vdܫ���g%����iw��y3k��ye�n��bSq��@�t��o.�w��U�a����d`�R�f��W��h�-x�kk�emn)��R�q�\@?t@��.�w��Z��t�f4��u�h���v�j��xxm0x�yosekz.q�R|{itP?�|�w-�~�zK�'r�p{��s�qԜ�u#s
��vFtgw�wtu�d�x�w*Q�z%x�?E{�zb-�}�|X��p�z���r'z�ssj{@�(t�{�vxv|c�wy|Qy
+}>�z�}�-R|�~H�(o���Yp�����q݃^��s=��uPt��;b�vS��PPx
�<>Ay���-
|0���m��{��o���p��z��r ��t?s��^a�uQ��O�w+�T=�y>��,�{��¹�lu�S��m�� �oou���{p���sGr��latq��Ovk�?=tx��j,�{
�@��k��
��m�ܖ�n��l��p��rxqؔM`Ws���N�uȌ�=&x��,�z�����j׫��4lg����m�
��om��q�q0��_�s*�9N uI�_<�w��6,�z@����ja�観k��)m\�|�2n��q)p�� _<r��`M�tړl<�wJ�),zy�����}!e��u}Dh,�9}�j��
}�l�pp~.o^�~�q�L�!t";��w+��zU��{
oK�j{ipϒ{�r>�|2s�o�|�u
]�}@v�LO}�xT;"~�z-*��|L��y(x�*y�yr�
z$y�
�gWT�aˢ�ĮkTd at D\dPPp-HG��&]�30���;s�Cg(�� 1DE�*n�6ܵa�z�*�&��<��//6��

�O?��Q}�0$	8
_��{���[w� �/��!f�UmxrI
�WB���5�(����)2����.$
��5U��o�}Z�!O�O����q��m�����
��>�>P�3��ĸg|

�,�X񦁓�`���S$�>BG��
�DǕu��#�i��#��܌-�`
��xJ��!w����
م:��(�����`[H�W��eQ�2U��FD�����`�|���
:C��d���2��~Tv���k��dEeUb2�<o]�^j���j'{@��s�Jɻ�uiW����ŷ� ��o��Ws�%�PFU���V
6[f��
��r�uOC��U(5�?���"/�/��b��;��H���-O
+�o�_�%��{�"bHk�&9q\���W:���r��
�&�G�%2.i6�D�1�%~F���+~Z��C�?��
8��V��
+�2�#�⮪����
ui^#v
+�NL���؏�S���E��Z�Ln�Ö`���=l
�va�;(�>̽��p� ʠ������~��[��@��Qd��F!��7��H��$��������	����#��d�Lt�!BO�K�*��G-i���C��r�B�
.�U�l�mO�>�
�,B�2W�<+�3�6��7���ߛ��@��

�)�۠&KO�
0ޏ� ��O�
igm��82=D� �4FB[���!A�Ib4�~����Z�� 	*��fz\��O�t��F&�����ӝN&3x��F� �[�H��j���z��&3n14���b��M� �zB��!�
��|��+�
�

+/�hw{��V�\l�s��T�j�g�?қ����۟�u �깮�D�}û�.��5�ʺ�(wM�	��ұ=�L����j�e�o(u\���
y�P�X�����Ƣ8�p2�����23�2"uh�0
 �;�(3���-ybݷ�3����Wd��sF�@w�	�,��8#���!��H*9��)iF^
+��P7��D�g��3I�33D_����)�J�QNdO�m2�t�a':�=���J��.�۱�
+s�`d��+�uu�-� ǵ�i�ȵ\L
+�kw��/i���&G�1|91�:H�^��
�gW���@-� E�if�?Q��F?�/�Kv��ř�M�kz�݈u�N�0:ӎ3BJ]�PU@��׊VV�z��D��PC����9>R��Tl�{=E�Y^Sc��yjN��9����6b~mwj

[��
Zl'�d}��[�Y�ގM�:t
U9����WI�-#�d�=�sѣ�S
��I�Ku�Ʒ6i/JO{�s��{��c at 6o���P�U,�'9cV�~�M6���I�Q�1�W�wo��T+�ml��F0��\�O��d��?�o���i��4��M��4M�C%�H�f�M[�r0p�[�
���p�|R�’��/Ld/_c8]�
׍��
�YpF�KM(���Ewo�
@�jj�I0/���k�ad[�H�>��|/ѓ�L��
��|0�0S���VR��ׂV2C�æ���a��v��4x��,'L��82��'�7��&n���&
CĿ���f]9�-f]i<?h��_��]�ǿ�"��a���5!�	�+��C�Q�O�}D{�p����՛�x�էɰ��i��X1kt́K�M�w:�h_�Id)[`m���:��'1��f%s����7�^V6,��0���|����3���3~��+�䔓*o؜w�PPK��
W
��{�W���0�.��
���^�Mq��'r�>{���T������a��4EeNٟ�����ή"�V��_�ǔ3���t�f6���5��ҷ��,� �jP
���6E���x)ͻ��U��Su�@��6M6�d����������F�����V��SˬG���Ŧw�Ơ��u�y�@>.���TȆ���V�Odj�?#驺�syc���A)w,zl<��� ��ـ�B��*��7�i�j,\���P#���;}}�~��r4��fx�O�"Zh���NM��
Be�@�(7���8,i���A#F�a�N}����qǖ*�lf
����Z �ۋ
M��2�HB-����7�߅�,y�Y��#p��9|��
��q�����eے�NYƐ*��M��}�"A�튘6؈U�,��ۅ�#�����||���(qW�,��e��s��Y���!M�����ANJj�e6Ç�,��}��#��5��t�Pc�jO��f=_`�rh�T��k
H���m�=o��p�2���s�(��Hv� "��zbtu�5k#j�� [...]
^ٟ�t
S���uSHt�#v�=_�.x02�y�)B��{�!
+��}~s��<x�i'��y?^W�Ly�SV��zOH-��{=:��{�2�|�)p��}�!g�
~�s@��|h���g]�OR�r:GA=��^2��)��$�!��U�r���
hn����]��
��R��y�G��ƒZ<�����2�3� )��h��!����r��7��h/�ۋu]j�R�
Rh����Gv���:<ِA��2�v��)҈ƃ*"-�=��rY����g��<�"]2���$R1���GD�T��<�����2�䆡)�?��"Y�ׂ�r+�0��g��Ȗ�]/�&�R
�`��G;���
<���42��^�u*�څ�"|���/j	��cj_���e�U᪹h
K��$j�A��+mX7���pM.=�tsk%���v�
��\z`i���j at _׭�k�U֩im�K���oxA���q�7��ts�.��vp&(��y(6�0{�i[��p�_��`q�U���r�K��5t7A��<u�7˙wz.���yQ&��c{V��+}di$��w_O��w�U_�vxKk��x�Av��y�7͗�z�.ݒ�|&̍\}[ '�K~�hꭢ}9_
��}AU-�)}TK4��}wAd��}�7�~..���~�'
�v6 ����h����c_ �z��U��{K
�o��AO����7ԕ��L/���'A���� ӆ��h��ʉ[^񧞈~U�0�jK���EAC�ą17ה�1/7��D'r�	�b!�k��hn�/�^���U�u�K
�ʊEA8���7͔9��/A�O�7'����!H��AhZ����^��b��U�ؐ�K�'��A<�g��7ۓ��$/L�͆�'����!r������h`�JjNc��Qlyf���n�iMy�p�lf�sn�S�urq�@�x u</{,y��eEk��g�mE�j*o��l�p�x�n�r�e�qdtR�t
+v|@Uv�x�.�z={9�)b�v�"e�v���hwl�Ej�x6w�m0yd�o�y�Rr�z�?�u�|.�ye}S�i`��Y�jc����f6̈�h��vRk�yc�n�gQNq�Y?Kt�S.Jx�L��^ي���aɉY�qd��%�vgf��u/jO��b�mf��P�p���>�t(�o.w��
��]^����`c���CcH�l�Vf+�;t)i0�a�ld��O�ȯ�>tsw�[-�wn���w\-����_A���Mb0���ke#�SsShA�!a7k���O|o��>#r�
-�v��0��[D�n��^a����aS�h��dL�%r�g{��`�j哟On��-=�rf�v-�v��m�3Z���p]­
��`��܄c���r
f؝C` jR��N�n�b=�q���-�vB�w�~o�`^��q&cc�r�fB��ti
q�u�k�_�wIn�N1yq�<�{u8,-}py�mjy��n�lp�ptnR��rp/qs�r_;u�tM�w�v2<Ty�x�,|~{6��j�tn��l�uf��ntvT��pEwFo�r+xF^Jt8yZL�vkz;�x�{�+�{�}6�
h�~4�lj�~F�(l�~L�Fn�~Qn�p�~e]er�~�L:uM~�;sw�~�+�z���f��
i
���k�<~�m*�Rm�o_�n\�qǃ�K�tU��;w&��+�z@�ɮoe~���g����iю}�k��:l�nH�[[�pʈ~Ks���:�vw��+�y��Q��dX���f����h•�}j���
Շ_S ��VN�u��1���X�DY� d�0�@�/y{��e��`�@��=�P�����8�
+�
+���x��+����O��pO�T���+��g���xjZ�@���c}9`k`cTnw�?�+�^5�����j�䤢���
T&�o
+
�l���E��x9�
{�Xf�Pg at C_�[�G�=/�5��g�4��ʥ^E�*�z������	��5�#�p�
&��X��s�Y>���>��@?�n���C)�HKс�#�Eu��$�%������`^>[�
+�(?`~�^x ��0���� _�+�O��v&"Y��D�>s�5x'��]����~���-��i�f�~�>NF"
P����� ^O��G�#��
�ǖ����0�<�7�ӆ�7
�:
s���XL��!kݱr�
����x�{6�R�t�"+��@��q��*�7k�1��U誘Y�}(��~
\H��`J䞂��\��
+����5�2[{�F�;�On������ݦ��
�
*C�{
2H�
<��N-�S��2��Ur��u�UKm��5
ųBu��
+}�����3�!�J�H$�
�#h^Qv�0�q�U�Y:�ʫ�a�Z=V.���}V�Z��fs�y
����֧�M���P�8�:�x-k�ն(+�rީ�G�S�I�Э����O
���w�
�iι�9јy��������&��z�8,k�.$��x�=rmRM���R����u�Mb;d��w0y�
�2֤�T�{����
��WƊ�6m|�+�8�EC`��
�Gd]��Mm��"��W�rS禜D��~A���S������	��+�G6W#��jnA>p�� u�w0�D(�MHO�B$ ������vKѻX�� {���'V���'
5�c

+
+�sh�
]T4�I��
��D�G�ãTD�(2BNlz�9�eB_
 ݫ.�#�J�U��bG������ɰ������	�P��c36����߅!�3����?�o /˼�	��4Ta1l-vKWZ������A�p�ɾ���<���>\�Щ��ހk�a8�Z5$�G���d�W#��{{��ߢ��!	�e�8l&�V�
lu4��ʚ��@ԸQ��������WJ"�����
��쎛�����)�9(�6�g
f
�y�'�1?�J��L)��b���쭢���l��]4�L�kۘ�Pp�u�ﲹ�)nCA �Ŷ+2d���EH�'��H�m&Y3�u���ѷ��k�ѽ���ӭ���1��n�]�_Z�<ڮ�Rvӛ���pj� m9G݂������#j}d��A�-u ڠ���
+�0�\C"���
dhK>م�����ٸ�:IF�q�\BVhF�'$�[I�&3����B��t��K\ �D��'�`;�I
[�"��%�#���N���\����
I
+|?�a��8+�ş3�"-A��ש�_ZZ�K�O%u6`����X{c�ͯw1�
���$���+��O�M{�'���E�],�j�z6���+���~�
�Q��k	a=�_���/E	��q����bV�k��&S��7<R5�|m[N�S�<�
T[�'���c�֝"16`���f�i+m�Ԃ���
E��h����6��=��2%w	��\W��w3/VWx�G��k��	(�
+��K6\�G��k6ygf���p86�,W	C	~�����8
�y�q'
Sk���3��vI���ժ*�/��kffԛ]��_M����5Ɵ�$Ϲv��3����\�2
�e*��^\?����|�_��cj��1��xڶ+����em�[�8�
��@��r�1�
��3�4�6=���
�v�׶��
+�f��5�R���j�W����u��M!\��7c {1�
'a����`&y[8#��H���3��Ci\OR<y��0m�O�y3lN2'�\N
`�́QSL��'�}�)�R�찧�R3I�w('�g���V!��pG�Je�ضR.u��.��j�O[GC�����d5�a��L!_s��d
݂F����\nMͳ�&ֹj~*��A��%y   ���2[�\���f�-:H�Leyby �
+� ��}��s����-j������5+ڲkE���Z5׺ֵ��ޛc����[GS�J��o�
Ť��� ����+���unR�Ɖ�o���Q'�j
+���9y<�i;M����B�]
+���Y�5S�A
*bPW#�X�~$u2�ξ/1�a��+���` ����cv&�L/�0�̰��;t)H܄|�E���9�1��ݎ��j�Ɇ'u/���qvC��|���\l��W���ja���C�m�^~nc�=�=�7E�m+�O^�	|��v�d�,�<8L�O�j�%=���
Y0o�}�ď��vCB�W[�K&��I>f�g\"�&]��KOÑ:�
%ije�B>�%���j�:l=��T1e~��/�ߪg�
���I
0^Y��V)�<�^�ϑ�%
+�զՏQS-W��GpaθD�8�ߠ9�D֑Ճ�XM'�
+��U��J�]I�"��mt��e�uuE�)��-3`�Ҍ� SoO��
�� ������6Ju@$�Z�Z��ǚ����;���o������a��m>݄92)@m��{��������
���>�-�V�|���������WU�>r�$Ӳ]
�qّ¸��z�EYuɔ��>�GT@蚩
�\�'��}њG����9��mp.d. at L4
c�&,��r;b�
ӂ���d�l����t3�ݦ�]Q<�
b��-w
��
N
�k��	k�
b�K�%����H���@
j��"�W4�sf��|A�a{��8�c�%�J@b��W���\��E���':Ehs�ř�=�}��9fǹ��T��W�
!3ߔ�% 
פԘ�]YzĀ&X
I
kWdP�ي
�b�]�9g���bI��i�
����$ �O�1wu_)��x��S$P�)m/�UI
�.m
�psf5�Uwl}oy�h�
 4�;=DU�IKS��DS�j�j:�?�2�*w�0P��4��o���+G��4O6�j�eu��
�H�W)ϛ=���ݮȆ��s�51��
o���k���a�I�ӽ֒Wo�0�%>��#}?V�5N���_�����r}��%�7���
+�Լ��
{�!`�D}���K_�4�
+�!���Q\��Hҽ��zȔ�H�N�>�uA-^Ჰ�bg��%+k�5���8�W�	#�wi+���q��0��k�hc��uTT�[����`�5�Z[�`�J�	&���-��v�**��
cs0��� :�-�7���o�3
G�(�Z!�
d
�
�
�z	Q}v��x�'E����}��aQ#*��'���vi�Ʒ|'i��n����˵Y���;�eR{��E�1��v��i�k�Y��T�2����4o�/��;��K�
�
|O	c��
+Rr_��T��'�U�t�Kyγ�z�a�L�
=
z�s#k�)��|O�
���Ā�܇��:a�x�im&��&
^c���ŽoIѓ`�
+���W��8�2K/�ױϬ˽���^��i�����p�u�����O���:JD�:WtG<Z2��]uyy�+���0��H5W�?16א	~u��[4'�)B��rj�X��G���>��<�8Y�J]
+
Մ�y�iZP�-|xm
�4��r�Qe�`�d
Z�H
;4�S���X1̚�`��w����p�u>�7<dE,]��5�J�!
���T�%"��
�7%:�	-+�6\�w�����O��1=�zs��[ITNX��)bOIUq~�JY�����鮦�t ͆/?��w�U[j��+ϖQz�U�R�
�'d(�_���X�q��B�y��g5m���V�e�q}��J��sg[�\[���>�	H�2 
�<?\�`��L���8�n�/�j?*��BgK�ߩd�}��d��"KK{	�LT��k�a�(
�·t=no��4���i�H�A�-:��s0J�
ַYa�<Sebv]�
+�%�;�8;2�/+B�M��q�vs$`ى�Y4/�\ssi iUcd���U���a����fh�6ua�P�����&>�%�C�d>�zES�?��+��&��e�{�\�Q>��+)�
��^T9Z�P���F������� �V+�@������l@
A	��B�
+r�3���
�L2�$��
$���x ����*,^-�ڷ[]��<**�R�������I�<E�|N� �B���j��*�K�=׌���A
���ua�2�%V���/�.RC��
�v(ݴ�ܥ�Kp\��	t!w-<��
��ar[�fA72�:%�E;���),�Aj�&%yޑ$��xPM�E�@��Af�Wxx����M�%|zW�6�J�
i,�o�V�^>npdk�
ŻΫ

�:�������C�������>�
KXi��<�_�TT���Ֆ��q�cs�.�JmZ�E�Œ����:��^΄���hsVIbm8tS��X&^ a*Ɋ���n�^�m����=A2�s��^
�mICca|k��`�K��{��"Y١:nf�,ڱ�W	x�_n~�	��
+!f�睥��#�
��A�ɧo��
(u�
+gį�Vg攷���E)��?n�/ؠ�bd��S�u3�Q��Q���I�B`�\��C!���d�
+�P�,���2QC���[P���һ�n�`��
R������XYU�^��'�,|Y5
G�4-}�<���k�C���fގo�ۆ3 �����7��%�R����/4��!=�a�'��m���fUg�L���(CfU]@::&��
+�wo��߿���D[D$��<��H�׽k���U��*I�#;He6�i*��80C��
 �T�N/h%��
u�hvL�5'�ƭs*=%s+�:V9˲O�%����(LWӖ�s��w��n0~
~
I`����F��嵃v���&��K^U�*^�6U>,�V��{�:T�5zG�Fd������x|��4Z�ٲ�� �u�'�ʦ��"��Ww��[��f^�'0X�cx���������2��rK�J�J�D�������Jm��B�|CÁ=�55oc/�����h��N��L9�'0�jI��.��� ������ =$!_��3�s�^�>pX0�]S�c���Թ`gi�9��Q?�+�,O�|ek���kC)6b���f!)�,�M�����jQ����Z�F��_ ��Y[-�ۈfiv&���m�H�!�����`5o��I��xu�d
��P#�F�
+�P&�����h_2�n�nm��MsC�?�������w� ����O��t�[P�k+�j��n��A	��ǐ���� �H�ځ��Y�*�z��ל`� L﵋TL��0������1|w:4�4o�����(���%����j��̨5Y��J_���|��
�f�����
�y�l0���0����D��O+/�.5�T�"��$8��[g)T`MH��?�Ɠ��\�<f\o���-1�
b�y^�Q���E�E����*׺����e�U�.�_3P}7&^l������X���x��V�MCG| ��0A~�����
�
%_����o�
�À�c`�4]~rf
�5��o���{�/DRe�)��R��'2:(FQ�KL�U�Du�4�9��%���O�
�'����E��Gts���Ӻ|U[��nl�M�Ӵ��
+���/8*�;,��a���8�s�k�
��~!�!�@)�
�֧�&Ñs<-�s�Z�•�2�Eb��T�b~A��A�}D�ʺ0��S��{��{G�a�
oqB͝$��F8���z��*��d���
����:ٟЕLza:J��ea����
���q��
��T�*�1�"}�!�@��k���˳�߬�B/�lEy�~�eK���\�5��$���O�=h���Z����͓ނ9
����`�_��������ݎ�[�9�Ĥ���u2B�\s��
�u5=��@�Ό��p@
�z	t
�;�*+��.��Z�����a]�1��l�R�S���o�����
+�Кr��H�Y�K��g�<�`��7/�|�+4�A���*�K֨8���1��%�
�-1w������?Ɩ����)�r���~�K0�;h���+f��g:"&�6)�r����p�c��y�B��6 b����#�&l�:w����>fިÕyL/�\Z������j�@  Ν(�W�ڢu�����d>�P"Y��d'$�$�ʗ��
�V�J+W�>pG��[��^���Gڻ����2|M
5��k�ci{�
�ZJb��ILF<�fB>�P��C��R7<]'�w����K����QXb����*�
+��$f»��
~	^�̈́:�)�]��}�p��A(��+�R���X� zE����;b1t�!
���9�ݠ�B���j�`�
d�>�
��!�L7g���h
%<d:@dA��C�
�<�@��߈���@��.� ���
��Z�j���@pC䂻Qab!��
��M�b�q�q��z�b��ە�3;����@�A��K�$�˰E�
�N����T��
ۢ�H=j�o�n_a|�1��r(���'�m�r��Q˰�lp;�Ա�{�qe�� ������
=�^ՐYc�I$�ۖ(o%�
��� \�-�
Kч�޻����Α�v��K�W0d��ngXg��IF�~������X��QH��l8'Kr������gJ����
+*Xc�Z3}�E�ٓD�sj�d9F�K�䛉J� �
�I1{�V!xnK�-e>����7n�ׅ���
�_Qg1�R2Ǽĸ:@�n�\�K�X������)�'�WI�C0hݤ�!XL}����
4��l5� Vh2
��,��?��bLb#(sÀy�tk]:ibP�_"��2S&�F��
 ߆*:�/~���5�l�6���fݻ�	���Ӡ��v�<N�E���"A�M�B���I܆=��ӰD��!5��o�G�
]��Ml[U��Z~$g"��H�U�(�>�(l1���u��;8��q������i�7m�L[�@��Wxl�<R�s\�]1�^�>�g����	�Y<�#nMD��yY�ZO�E�X�;/C<_��IfG��u��R���O��M�++c�7�S��
+�4ƊaZ���ԃ�
�����u���	Mߊ]�>]o����/�m^&=�Nh̕.�g*>d_�$��
+]�k����oj-���]��w�z��`��g`�@�XR������
�SZ^6�u�V���^��o�����g��~X��Q��	�濮��a%{s
T���p4{���HLydW�)YU�&R?� �FD�/�'�g�H�7yO��G

+�S0᪄�g
:�po��)�-.XF:�
�e�� �*d�i��G{.㯙nwn.�t���Y���<�"��`����7�d�
�sSC���!�x$��g��:S����X 9
��Y������%�r_��']4K��
��.
q c�Yv�.㏢�
M
r��m������*ADbW냊��M1�Dq�by
��9���m��T'b�u�q�7�O�r�����
��}�y�XK�8���`����微�.;������~1K�}w���ҭ���rB;�ҏ�ޒ
&�6	�Rr���*?j���䆑lu��g�ICk���M��|���v����h�ZY�Hn8�V��z��Q3N?�?��֫zGP
������5�|No�(RG�J[�5��&Hs)qq}^�&2���n:z����ǰ�kFmP�03;7�N�s���i+Z�iӍ���	�^��z�s�7�T�m ,�
��zb�@��p����2�2{�9���6��ʄ��/�=�
�4�)�c���	x
+t&8
�3��B��-�(;�^S��e���dSy�7yG^�H@�Es��7<�A��Q|��h�[�\j���e��Z�Ҏy1|i�-��<C^ow���5���pc�
�P_���<.&n��;ˌpa��[y�y�$۫j���!�
ѫ�$E�42�˚v�?ݴ��^�wnYg?G��9c���K�+%�<qWŔ��z^}NV��]QvS{�q�8�ڷu)?
WV���1l��%�Wy���j�p���0#��>M�']�����|�k!���3h{�&��m��5&[K�i��K%�}UE���k̀��u
hT��[�*�F���k kO��Z �e�� ��e�v]
G
�ؼ;�G��L��W��[����d;o��o�
�3x����� ��Y{OEk[@��|�l��2��섐���^򒼗��F6a	�9�u�UQ[�E�m�'*u�WA���w��:^WfA�w:�R�c��$DZ9-N�7���~c
+�
+?��;�A�34VfO�
�����	5��*Dv��Ue_�Rqr�_����pM�v��]���{�қ[;��f�4�(
�c5ڑG����d�x�����E�jO����-n
+|�
�g8��
K��ٶŲ�]�{r3�J�(��?ұ���q�l��u;S7���qWA}�ǰ�����=��o
+�n��xg�|�GCT�p�T�aH���͗O�0�U`llڤ�C�lt��0�j�h�~��pڱY�_�,x��'�,�IU�jn�\�[M��
z��
���DB�b<Ô��]��T7S0C�o�}�2�%�s�F͘�MQ���
ś�!�7f�Sѕ&.!m����Fk����(+O�
���Oȏ��@
�W�1��f���G
�0J��Z����-#�=����q�b>@@
�g�IxFz�|�����޴\�E=�Y�g6�at�Һ*��SY�����5��T9vh�
��	�%2{}n���}I�90�v zRf����8kO�ʼ�
�jV�o�:*�x��H3�_	
6�WWx�4�\;�5ju���K:��:i�7�rʶ��Y
�Ad��~X����:J1<����;��e��
+(�;�M�s���rlڪ�U[y5�����vw�
(k
+-��Ol��
H���WeG㐣�݆L9s����ŠFp6���i&x���Иp0�C2�}�Txm�C���H#�ѽZy�ڇ�m{��+�E�Aa
����W��d
�V�Sy%�ې���8b�ש"SLL����1�4�$B s��&��B��j��&�d@��Y��?O��+82}����-D^�����ݒD��(��P��R��{���Ѭ.� �s��!�$��4��P���ڣ���o
\�i�(�����#�u"��D��8�
+� �:�]�C������>�6����ڒ������׶�*��
����m at 1GQm
�lìOrus�g#� tk-ۤ��<���v+l�U�w
+]�@��V9�9'��3ի��	
�P�?#�0eD�a���S���#�[%�����LY����ƉU��U�_n����F��η4F�/V[��&+�;�k�+�4e[D7\�~YCm[�D�����������4M��
�n/���9�0����:/[�o��`�K����(��
+��T��o��r
M�8���FECw�LhT��l�������
�;=���L�t��^r%���|�TXN��d�R3O>�
���^�
����G�)�
y����
ۂ�2��b�+�Pg�DW�B��;T��
+�4Q�v�����{����9輵;���!f��6~/ė|@�r~��E�M�$,<��`�2���+��oM�ҿ$ȵk�뤆���)<$�\nnu|�LX ������+z-]�:�r"���Xꗺ.KW�;���–YFC�	�:�Aǔ+�I�U�
u���+�U>.+͋�;�SN@]���
���L U������X�Kx�6
͑8=�*�U��4^q�ݗۥ>S韒�
+�Ż
�e�L��sf���	v?���m�!���'�粈�Y��v0��z�ْ2G����wT�1��e{B��H��M�,�
�&fr(y���)�%
��P�����
Ehl�%
+$EVDĶ����t
o��
\~6-�s��/�/���E���
2<뤪t�
���:���mb��p��V�����n(Q�7:�
�ziZ����N�l*�3��m�i��`��
��
s���nX
+�U��\�b�i0���^Kc�=�!!{pwp�y�
�K��H��&�Ș/�U�D
��
�g�#M@���
1�����&����yf_s�Ir����Ŕ\
�B�c���7�H�e�x�Xl��tbu�!��hI
+&)�� ֩�ršbp�s���;�Cu
GF�q�~~c6RbO��'l�"<͖����z
[��T���0}�5y   V�|E�W�r��ф �\�2�aAA��0	��/ɷW&a�A
+���AK]מ
�q\k�P���U�"�Jѻ�?�W���{��j#�'rG�^���$U��)~V�H�D��Tup����7��e��Ê⚊��R�"�I��^�w0�^�+m��O��X���iM��i�-T��5ȝ��'���N�]�~{e�� 
��r���5Ճ�-w��A������-��V��YF~�Ug��BO�Jt�8y�0���.{K��O�(��vlJ�	u�S��0��փy��k�^?��6W��c+�
+�C���l�]
��E�ko�%���ݼ�脦���� g}<p���?��j~�t7�Q|/y	�u�"-�Q߽����{ޥ��w
�iN1j2F��c���߀9uTE�����ڵ粎
t������
�;�HC;o�sTH#d��
����}�[aT���*Ч ހG�X�;Pp�i�t$V.��x�P
+��C�_"�>�h0�[[���tVۃw,���U���^|}�X?����4:a<X�
s��%���هU)��<�@Z�Q�/�[�6���
�.�	�
0A=��f���x�Iҗ��Q�l�3\�P�BoJ]Դ�\>[3��������?,���
ЛMOyI�Oi>�
�'�|���2��k��x��o��6��<J�c�^|5�ܲZz;*�,�1��M;]���U��� ���DQ$6*ړ��
Xz#���U��fZ,k���u���)jF��R6�:��*�hyY���p�I�~��K�SpMn�Qjm-+�y��ɽM�4q,��t0L$t�h!f��
��_�yb
q��X𖠕@�Fb��/r��hf��Z`;k��4<a�%� K�E�b}��9v_Փ�
���U���k��w�3��H��/us���k�`�Ǚ�;3��������$B4\+;�j�K�D�� Z
FF��v��
E��u�{qcʰS��TK��k�
+rS4�,F�S��Q�?���D ��"�u�%���Z�i�^,[U6Pw
���԰�
��S7ž$�
�!�E.����H
���7�^ü���
�u������m[E^����)@Y�MSP�)'b^E�q���c�?�'F����x���m����uym.͇$|��O�Kb�
��1�c���w�Wln��~B
���XfO�yDz��2�MӅ
�B�QW���ci�2�� [
�b},�1�E���w��^��k��b�)�k�,]��wH�ߦ�4�U���mϪKc`�C!��Z�ʎ�5�I�C�W�  �fQ��9�Q�|U���ά�2=��-�I�d����	2_���M��4� /ڨ��B��>oy *��Zo�9��XY��i�����fNP?��1�k�𾠣�� *���_B����u�p�ֲB[�
�
���4X����
��φ��}�����P����73�d"�d
ٮ&�<����ăT�>���x4�
Y��"��G��XF%N�g��t2��S
8.h��pq��܏��#~�
�2�Hl<hކ��
+�aG��-?�J1��p�m�����"��2���V�z�|Raw�~�l�8�
�����4����������
���E�Z�Kݸ���UG�|�B1��&T6���;w��W��ٝ]8���X��y�W���G-����%��r9���Pv��X7i�x*�L�(�u��==��ϲ�͓m
qqZe��&���߰�n�=jc�i�o��@��
��x/{Y���/�r�pՓ�-�k�b��(n��
�J;7��N]�
�	|ט
9^R��,��q��i-�j5I�~Wfǒ�;*~x���F�M��u��ò~�7�����S.0.rm���4�P�M��X��
+d����6���͵�N|b*��4u
v�v#3�֬ަq�V`i
2d%�

�5���0����7Ӝ
���jx��9��x���!K�hF�	bLb4�Ezcl��X�>�eҢ��(j
=����~�n$��
Y9P�K���C‰/�q䢘��&l���r��S�� 1��|�8��+�����ۺ���p5q   �Z����(
�QӸ�AX��!\�$$$C�srL2�$�L��%,���*OQ�u��Oł��BuUX뵊]�x��V��~�n�,��[�|�nC�
+-�bY@�X?(�e�92�"կ)f�m��6@>��_�|�Xȼ
���L
N�+VJ2�v&����ǂ��g�a:y�*=>�C�,꽅�zq����wΣa���V�bP$���Ԇ3H����*
+|�t�c^�7�C�v��f�C���UʆN�\�A�
X�)�M��Ȋ��Q�r�K{���Fۏe�"j��%��h��C�����i�24��.$�Ҳ�ɹ�D��Ӯ�?2�
���]HMt���a���PZ�+C��9�J*��_r%QN�H�4�r�{W)�	|�em}�^
�e
��ٻ
+�.�v���_.e'T�)�V4��(F��o��Ugzf��0�=�r��ƣ�[(h��GjK��Ң��y�}����%�]�ʟ%��(y쭬��0�����L
1���s�R1w^N�J�O�7�
��نy�oxõ��O���`�i0)�¿6T���@J���JL#��״��C ��[!�)��9!���w�+����@,�&T��Q�0GU5����a��
+�5\1(���<U~�� ��ڌxݷ:vR�Ȇ�qV���t��.	�d7J���<L���US����0ݠL��w�k^I�p2��Z���
���#*��͚i
�1�.�~��x�E \M;.�7�vD�5枤���B��l�4 �&ɷ����͉�Qs�r�k�d�
+�B�2i�N����ğ�'��:d�a����9�<o�=���:�O8� �Zq��]��\�(�p�/@Γ��H�+�nind`�gA�د0iJ*��eW}o���
߶�x�"omz�r��Q��u
�_p=�=n_��%�!w~~S]��Jѯ5V�Q��z�<�L/8#�
��+�������>-�9]���������s�4���1y
3���yʍ����/�	��G䇫~IĴ41��_�35g%@���.1N§�
N�̡�P��i'�7����4�
�@r�z�8�Z?�
 ��i�;�f�
+�c�E�N�O�ri@�D��
�����u{A�6.ѱ>1���_�:,� ��Jf?�/�L��C�N�N��*E]٭!�����mq�=p�)��
�ݍ�
+�c�F�M�H���?�
�b;t�%��
7�r�~�����L&�3>��ﰞ�
~6slD'9�?��6�
�T­�ϙ��^
5�;�
+k[�}����gX0^h�q$W�KJm3�qV/f�̔��&��|�}3����1���s�O[�9�"6��ε�6
�9�K���+�|d���j�8a�&�k��ɐ���=9w�U�ͩ��?�������|�
���0,����lug��z� �eU
,}*�
��e-���^u��G�S���oy��7��7��bC#Q����ş�n��[�,(
��l�^	6���! ���ʌ�>�"�:�j���<rB�a̪�� NfE��
�kI8<*�͒"�e�[�,�A��v
:ks�Cl.�\șc�+��5*�W
���&��ŀ~�\K�4�sR^�?ӕ��
x0v�>biq������2�$V1�\$���Ǖw��kGԣ����Q�� �%�[�����`�ѐ�J�
Ή	`��]���+Y�)�u�!*�5��(H��Id��a�oE�lw1��7�����hY�xЈr���M��y�A39S��cLYg�Bل*d��lQ���
���P/���Džm���l)��I�R�`i��?Ğ���A��Y訌�:��e���t��/�
�y�sn琸�M����>d�SG�&H�P���e*p
���:��v��F���ӫ�}9��|%*�C��d
�ڌ����T���m ؍��θSV��k��q�����~V�Q<
��f��
+�C�B��'��L�H
�?� 6���ǍZWz��jxA�|�+cs�h�i�#a�43���
�K�Zr?�'H:���m�2��A�Ľ
�e�Эd�c�M^��k�^�C�j#,���@D�L2�� �I~tHGǫ��J̀�e��
�	W `_q�Z�b��
+�"�p�p߄CH�� 	I&�d2�L�)x�ʪ��*j�XEtJ�J]�EZ_=@�X��Y�����#>�(�U���T��#tg��E	���U�O4E���]cD��ix`Ff����w0b(���U
+�
�Y��]sA��vj�fh�w at A,b��x#�i���u+����E���_�X��x˼U-�E�W'��_�@�� c�e2b1(��
h�^EN�
�
+�`V�[@-k��b���n�_P����e�:��60���������l�u-'\��j|D�me;��tH�GD�˪&����աD!ߪ�@��M��?B
�=�
r���Ε
t<�GH�8�Jd	��l�M��
�i�lv>Sw��o2�Y�!�;DL��ž�]��򮆁�����˶�R�����f;˷��-r�
�0�ۏ첸�R}�"��?5#��mk+3�(���(.���R���
xP{K$
���~?
uX� m��
���(U$C[K��Il9v���L�"�F���]C2q�.�OI�6�1�Q��x�	�1i��Q�Zxl��e_��)O&uZ���C�j
7$
6����} �A~��8zX�������m�b|�n�^i>�]��fQ����Bch�JDj^��
k��]�r�ou��#I���h
+8ЂTc�1)�ü��W�+�-�*�kx�u��e�I�~���PE�:���LR]
&��t-¬^�*$M�4-�b������B
����c��鎳�A9Z�u�K�Dۄ������T}��p�p;dz��x0w
+�
��7
? r���
�lJ�����U/�3B��K3h��f@��j�m1��R�זD*��p
����֓�2��O�(
Vv��
+n���d���mMAO���;�1�S`�M����
-a6��)��N�˛,��_
+�l[c�.H�і%�Ŗش+#]l��c�ٶ����$ �s�~
�&���b�~In^�Y�6-�쪸ʟ���/F�R��a`	�����Ei|�o���$Գ��h:)=�k�Zv��6���g|V'E����;�R�����^�t\"ZW��
+Y���nN'⢒���Li�K�[��!6b�
���jnf�$=�+
*�.Ӄ���
K�vI�chP�*%�z��ډ,1-�pGs���D�8D�C7x��&�X���8e�!j5kL��4�Y��
��&Xq�� �Y�LA)$�]�s�_g�^
.��[����fx���́{�s��Hq�
��	������o���݌�� K���Fa�a)1$Poגי�DO̐Ń��w�q?0
$װ����ޮxYZ�N��8$��8��
_ُ$�`�l�cZ��6��ݐ?�
ȇY�+�0�H5z�ቔkQ}Ö<i�|�>!���~QQ���2�&
P{B�cH��|��7g�z�9^sy��l������u^�A�
�;�R�ck
U�>�)����v�Q
�
8�:oV�c���s�K���6��8#7�>^nNk�_�<w�*>��m�ڹ3���"Ψ��Ţl�`����
D#����
����ޣ7W-��#���h��� 
<�L�qf6��6@��0}����ك�i���h�� ��
�ӛ��R�$�0�a�p��s���T9��˟�	sJЫ��lO�
�I�w7±A8j^Տ�ork�l��17�x�&��e���o��U��d!SQ2��b+��(k�m\5
���/ [...]
�_���߷,����c��n�$k��a�����M�=U�lM�Q���"g��Ɇ
5iЉ�5M�%7R�%
q���v�L�S�G�[]]��M����	vK�s�w��>���q|�
+�7�p�L=��#.��[��CjϨ��^w�UOl���Tv�Ce�����������]�j2��0�uuFf�ձ��ʪ�:�AƆ"E�*��S��'_
+� !��
Z�:���Qpt��4��7�rv�윽Ys��9��{�<����Fr��׃d�+G1	
F�~ /b�m1�&��& x��� ,�
^�
�LtZn��D<�t"��7�4�"���ף.9���m��-��6��Iq�5�����5.1g�)�j�����������!0��OD<%n�{?ns
����
����8�Y����F<�p	���r�wPq�D��!\ ���F���KA��^���Z�Ũ�ˍ�
�R���휃�E��Ꮵ��
l�a�������?��aZ�뵘lt�U
��t�W�z������s1��͘iea1�����M�1�g͞���v��w����
��x��e�W�m��O�V�����u�m6l�Ǧ�mav��ov�u��m�w8�������m�^wO/o�}��
��?t���c�N�
:|���s�/\
	

�u9:&�J\|B"
�D�1X

 I�dJ��Դ�k�Y����y��Bz���bs�<��D(K�2��T�*+���RWkjj봺z}CcSsKk[{���������[}��w�������>

z4����g�?
�x����7o߽�0���6m��3fB|=k���s�
�Λ�
4�|K��5~X �p���%�&�(�*�,�.�0���<��6��6�4^����
�?|�X@`P�sB�#�b�$ PX<1����A͹�O�3�l.O I�r���O�S��#?UB�P'
+�B�P��T;��}�
*~>22
+E�OL���_�~���[�������� g

,v�,�cy]
�zF��l�(��}FVύP�q㫪���J6�A�$�*�H���$���Ρ�����`v0;�
�f�×9�zL2���ٞQC|�Q�M5���x��zA�R+��Ԕ k*x��Gj�sH�%Ť^Va�ݼ����r~��Lȡ�3h��
5$؋�#����2��'$
��
+�,��F�P].����V!���fo��Dc&�2`* �_
'ǹ{#	ݰw%{2��>��aQ�*X��
SV*�5r1V/�
�\�����2���d��L9�x~d����E
�]0�
+��
�^z[�AKm���<�L!����
|���t䳁�,&p#�A�e* �aʁ�'pB�r��	}��1��zw�A���j$���
+�,��9�Kͅ|�-��7\c��L�
Sy�
r���Rꈼ_��bl؞�Ұ�U��KT�U|YB
[��3�@S� �J���Ӹ�!�C�2�)gO��|�dgس�u��
��zw��2P�W^R�d���\=M4�
+��
�z�Oh'�
��7�@�nOP��J�-�y���V;Lg�]f�Γ'�R���j�
^[(���Ā�
+y�C
�B
I at l3�o?� �q�M����zۨ{�6����T�և�*?]FW^V���|�.G�2 �T�!YHl"	Iͦ
+~���]��tˑ�ն��:6^��m5�������
+�)��U�
+�&G��͒�ҥ�U	�>IL�ŤSK�`�`�;��

m\�o����j��c{.]w�{]}A�][�U���T�5�䄚T9��"#֑�$-QJ֙
+(���R;�7������n
^���윆����a�:V�V�T����ST at e���&���
+�P�kL�l���vw���6�Է�U8{`>��5#��8-Eʦhc�5I��j�
��ɱUx�(EU��������u=X�U=���ux�}{tj�G
+�����4�a�(=���Gr��(n�Ë���qZ��T�i�����vU�肝���
F7��
:&|�ؾ����ĮȬ8CLNlG\nt{B��vx~T2?�]ъ�����?����:��B':����
����n��A���S�+���w.�"nG%���PB��RBz�^�ML�p�z�&*�T@�� �mH����h���؇��Dc���΢��&Z�T_ Wj
�5yI5���LOї��5��m
+ � �һE��/��`v0;�
�f��ˡp��;�ϙ־�A���}��U
�l��K��8��SQC#k�דtY�FU��VEr�AF̾!���b7���E�
|��{�e��
��w��Y�쓌�E��8�T�@V�4U4��<7�I�Ii�����������A(��R��@�����:
j:��8������v��ug����*t��E at EQ��
*�r �럄
B��;� !�rI�C at V@�]��_���Ӈ�Q����5��<�n��.>��U�W
�/)�a�Y�/-Ry%�F���2"�
	InK/i��"�t��Y�{�p�8d�|�Q\Đx �i'6ĩ/�U�Ui��5��gԧye�bLY��(k�e��&�\1q�(h��-����Ev;w��Λ�6 ��!5kC�(x�H��@����
m�՝�N��&ו�y
UF�e�a�f5n\+#�$�,�۾���.�w���A��ڐ&�T%_}ؗ�Y6"�s�
��9G
��&��j��
�ơ���R9a�WL����t~�-��m�
��A���Nv$�&��!	�2p��0t�{z$�?5Z 
uTj���]Ġ��`9��t�&	f,���h�؈!� %g�S$��&T<6
n�cK /�
�'z&��b�p��`F*��8b�(�@����H3x!}'�: yo8�I��P&\���P����{�C��@R�t(���ɓ�ʌ*rH1𵐗��&���d��x'�McČ��`�$f��>��m|�S�~䃱ؕ�$�x0�mq]P��e&�	i�#�eF6AWB~��8��QChi�T�ɞ <|�����]z��[u*�nz!�b�g��9�Ԓ�r3l��q
X�r3"���	>��4�SPh=m@����A�8�
{Ͼ�+\�Ǖ--�F����3a��@��4�M�6�;ҩ'�Z�
��8JԐ�pj��j�6 �
D�z�Q0�'����չ=��;Q���v��(��X����
�N#��0
-z���#��}�
��2��Ң��
���>�ƾ#�Ah��w��8Vw�5�C
�/[�r�:mU�5�f�Y���H�7H�����)N���6��S
P��X�'>�}�<��5ӽ�e�~y'NNdtO���ݗd�jM�
��Z��̓x3�Y��A��dE��CM&�-ڀjG
�o����ž�����>ْm\��-��u� �Z���T��S#%��xG�;�Ѣ�8]�0^�`#�Hƺ����b~ں�n��
��A��-9���*�V��i��TR8�
+��`'�yM>��a�AT�m#GђZVZ��˪ݐ��ETD������_l	�}�m�ϒdo�8�z�����P���c�)���Vd�jG�T
�*��:YϪ
�z*�M�� �S�qK�P�}���W7��K۫Ov*�o���m;C��z�z�q�t}�J���e��V�l��|e��ry
I�t��V2�j)�k��b腳��h
�����?��|��lIl�N^�mz�Qr}�\E���+������ݫl(�[�Xp��1ٔ�Z��[m at _Xi�䮠����
p�� v�f�y�?q�)����?GZ�3�=��@W���	=
T�����2lvsd�rڰ
�P챢�ށz��E



����
���q�5�Y�Tp
+yO�C�Ż���R�eb

&��l�[Ghm���
��b9��M�%��>]8��!p���~�{��g���k�l’�B�4�2?ȩV����n���I�����6
+�e%2G-8�o 
��Q����P6n�c���N/J/�F�Q�&=	}-9�>#,�
�+�>n���ƙ�,��Π�
��z,�
>3�'Џ�ԍ���I�����6�
M���o$G������Wd�o�s�f��ܐ�T:�jGyh��K�ڻ)k[��Le���ٓ���#�ceA>V�l�
��������o�iE�Ǫ�2p˪l�Me.{J~I�T��"��C�vn�c���5�3�}-���"Ðh�I'ِ,���kHM"D�[Yj�sUZ�CM:f��D˂�
+�)U�
+��N�a��a␽Zfk@��
	�0�,��"IBL�tr�AlĐ
�� N9�V�r�:��#�Q�1��h�a�
x!c��oD��jԀE�
����
�_�dLq�i&]8�N�L�S����NI��S��/�)W����K�lƜ5�==\�[jTv]�٨@�(��W�K�s�m!fwO��)�ii�L�ڤ���?鑓�#�tɕOL�=�?ٯ������9��,o�9̳��t���2����UA��P��@C6����-!d!��@ BB6�B�ĂQD���k���op��9��4����M��re���9�*��Ӎ������RM�d�0W�:�r�B�5*G1G�R�Bd;
�ib"P'd�h8^��`B��5yϕJ\
���L�΄*nW��2���b�߭�L�)�3t�*E&�'	�sd�r* ��i����@s��?��/=:V�h,~ߗ��;{���u15����k�}6�EnA;��xo��
bh�S$u�,N%��ɕ�8�j��
��'����q/�q�O=�`�S)����г
�,�T���ר�s���=@
o5�-z�$^˚Fk�3(�l�UA�?5(��!�4�
��v
��(_uw1�f�f:�w-�}h�X��Kvz�q��A���O�Q�� NϜ@�:&�z�$B/�
��$Gc�*�8�?���z0�;ߗ��]�/ZZ���V��#sY
]�X&q�zlK�NC���d
P<dՋ�c�1ƶ �ؽ�P� Ҹ�=��Ӷ�1��S�o�<X�8�/%��3Y<I�X�s�:�Hs�oe�vn��$�������
G���H�7�G��8`ݗ�$����1�]�\?�2^OdJ���tJ
�z}�eb����8B!���v���@�YN��݅4wBT_D Ձ}`0��Kw������ͮGf�
GU�
l�,&��3�=m�2)�
���(ʼn�'��qv�c�
�F��+c>¶�G�F������ޜ�
=��;����
�èj��!,�z�5�ϥ�+D�`���C��^����n��" [...]
A�
 (��$e��EU���
Ȁ�ӏ^9���������,�>I�oG�s
}YE�HBW����h���֯�յ�������YTw�L3�r�S1M�O�eS-��)*d`���[�������hh��%؝��j��ӣ��͓��\$|�[��X�RK���@-_��J���oЌ+כ�ŋ8V�"����]�?���/&�����������{���d_$]B?�,k�ʯ������2x�F5�x�
u�n#��
s����
+[�������o�y�D��s?����{h�ow���1,��8	�f�L?��CVA��yE%�
+K.?)-����amU����
[�5�[�ڜ���Ⱥ�Mt��M�0���o� ?�s�}*�Ϝ|-��.̩� �{JZV�u

�(�lIne�C�6�����%�F��Q������n�j̍�;\M�{��w
��5��6��4
��q at p�$��{�{�bK��XQVx�

�&�\^f��A{�O�
򒻭��m�����
.���B����0b��
���@��ħ/��d�?��4m�/�o
+��y0�
�w��A6k��l
o�z�=vV�tbd.R�
C�{,�DŽ4�� ��]@��Г

z�Ӂ4#���L�#y��,�xK|�}]Xÿ�C��
�>�A𵲇�i�6��p�D�1�|܎��,H�ψ���P�
(@c���
�ii@���Rq��2��[eaU^��FR��6J�z��!���`
{��v'���
��f��Q��m�)0}^(�6Rc�$5
(�r~P�,y�9��wM�:���(�^�։gDH�D��ϡy�l������"�0A4�t!5F�5�bl���
”#@��
+�)�ۚ�+Ou�`����;�\�
mqׂ�Z4+�+'�8���bqu2Ǭ�N� ���G��t$����
���F��7
�G�,)�������O
'�6��b��gSo��/+�Wu��������Q.ml���c`rj�($oQM
+��0��rIF?�i����#@���I�_�S�����>8�Z7g�W-[���ܫ��
J?&�[���1Ck\����B�"�mф;[��
+ ���7q��D
+�$f�Øt�;Sj͖%q�z��f�g,��;�-�^�
�Q`-}"Ҙ�G�H���v��-
�35Sl�.�J7��o�@��
��
�5�p
�Ng�mw���ٱ�ٙ�mu���*ꊸ����/#7H �NH 
	��@HB��\�$77!�P���x �E�.�o�v��[������O���8������bD>������������)Q���6A�Y�-�a�W�j�LGU-o��F<B��8�4���4��N�_ �
�T�%�w�O_�@����9{q�/��ߔ�`P�ɥX���h��{j*h�Z;��0T��J
�5R�+ ��
4x�|_O �9�g.����m�Φ��	�^p���܀bFl���Y\u\,R�ՍR���J�	��K5�d
�A䉆Hl���^js�l�x��9��:�c6:��-
�?��y{"38�\n����,9"ARU��+���J_��ʆ��Q��$��e6W����}HN��SA[�����2�:7�<v7
�=�DU��٭�٭

��ڀ�St$K���������\`˓�l�V��+ ��h���O{ ��/�y at 6�N�.
�D�OFN�eئ#��2��z�
���F�if��D_h$iK�8uyZE�A(9�peko�R� 8��� y� �g�L��Wm
��|!S�~q�`��`�l*��7��aڲ�+�QR�%_E6����̌�VY��:+B+��5-�� M����@��1�u�q���gq��;s'/9���?�lRě��a�$si�
��hIQAAt>�7k1Fj�@3����\=ۉ� <��'��#Gޙ�?�<t�cz�ЏC��C-K���4�
��v"��b$�Sj���ѭ�^��M��;�ڑ�R%�R��1Wi��
�u�%���������|�ϻ{��<��k}�
)_���=������M�V���
�6�(ƆkF�[��
+Ź��m�
��zw�,��F���p	h9���voZ����ͯw�x��p����o��=3��b����
+�$���ʨ����!G�l�0��3Dh�v��Yv� s��)�F��h�)�-� ��܀n�WK�/o>��u��ߎ�o�
�q���xeP
 I��h1�nzY���=�W�u
M��զ��g��ԥ��'�(e]-gCGi.�];^���ɹ�>�~��o�[?) � �oO�P^�M!=�a
Ǡ����tR�l69m^�rU�4��\�	O��%�%�-,O�]T�B��*s�;�?M���w�+��Pm���v{ւC)��#H������ܥ��O��)�i����h�\L�C.�!� K��'b��1�
����HQs�.�����w��{�ϟ��/�2��
Tp�
	�c6�#s6"���b�I��)���i�+��˰��exV��z�:;�9�

��s�YAn�S�K�G?��v��O������W{����$����a �R*��
��ը��1�o���7��l����	���˯�WC^������kh��+ ���qf7�	:�B|�J�+*�u}B�2#�P�C���Ѧˋ�S%e���*���:�g�
c�Ch�܁li��)�
+�`�Fm�5�{����kï
��
��5���!>s���^���sUX�t�9UJ厓���7��YΆ�-P��7 $*g�z0W��]y�����l`\:XA>�s9�
7<�5'&c�E=ff��ӕD�dyi�x	M8ZH�<Wa�T6T�چ�h��AgEt���
L�1��
�A�Cc�#�V��Evr�}fN�t
�1I#7ܤ�	G��ۆ
+�r;���a��t��)��Ch�H�^��0����
uΆ��c�p�.]���
~x�
^Lޓ(q��Uv�����&ro�(�Je���P
��<_ׇ�{Q
+c7Rg4�tFZg�a��CC�����Q��x�!��)(��04e�)
+�T����1�2�Υ�f�8��E‘��6G	��V�����^��؃R��(�E�֘��Y�ՙ�
�>6�.
����"4F�m	Iz���9��)�d�1��
ź� 	F+)mju�@a��7�g��DfFiUcԝR��ڊ�X�x�i�>6|X�G��/@@+$���k��a�����Qbќ0��/�n�M�ҋ��]%�:c!ר�ZTxY�
��jq4�F�ּ]X��yw�?����=5a' 
��v:�u�]��㌵��u=���,�"�@n9� �$$!�+���E�@�AHGBB�p��EA.�"(�hA�
P�뷙�ӗ}�Ї��w�
+oP�E�i������ԑ9�q�ͩ�[
�q)Q<\U�h.g�Y}��WS(35Q���EJ�Yj)zS
��h/P�k�����<�^~��'���?aS�|�� ��A�
:8}F�/�R�+�����|����cha
+�
4�Y^��H���j��ZU�7

+����[C��1 ?w�<}A�w�{�_�K�yē���]P�m�p\�+�ؐ-�
T�ź
ˠ��RV�YĐ[�t� �X;�-i�(i���7[�9GP�q4z� �g�6����@���0�=4kֈ�\�c�-M�ANTij
��*�A�+7V�	�|��ZQ�4�f��m�l��d/ �5���
�@��
+�ݽ��#�]�w̋���Usri07mN�
w�ˌ|��!W��Q�RQI���c�	fWlerU���:Gg���&{�� q?
+�n.���
�����|f�0�rg$u͚B���8�6���9�A�$�Vˊ:�bVoi
�L�,EU���J�@!Og)������@�v4�>4�=A�[�+�g�� $fy4"nv,9r1��gJc�:�5J-AY�L��
+:J匞Y��*��ϗȭy�5�Zg!W�����6��
���@����@6,
�G����D�OMBӆF`�+��٘^-��+*u�j���/i�u�U
cnC�9K)��7h�����s�z����� �5�]��N�������ٰ;��T d~><lt&a
K��]��VTUu_���;�����#�;st��x���m����-&ls{^i��
� 
+g�9yN�nZ�Ϯ^sw�s�9�
qq.�5
��4�̨��&��J���l��d��2zY
���.d����ؓj0t���=��#ۀ��{�:y�
?����ڈ���-w����~��B�=wB���(��z�?�1G�E����AR#�R�ƙ���6T�P�f�kG5��^C����� s��
��#?�
9z��	��%g������^���t!�̛�a2�Rx�c����,i�p�?T��
Л�VN
��W#�E��~���j7 s���Z��o��_;�wf�����	���.��U��/����`
+c�(�� N`+�G�D�+���:�%Z}�E�2u��>T�J
�4&
*��o��w��}��
��u��?���z�X�c���Α�ggS�+~��P2u.���3�M��V�&����*��1Z,�_e����%I#\i�P�pYRg/Pph������m�s�
Y��}��~'�kG��s4���T�j`�ޅ��X~>�3�e�n؈��2�4�"y��
���'�����ʸq~t�Zh/���5�����k���o�f�صO�a��8�s߸F�_�$����@3q˰<�R	�����d%��'���nQ�q����4f�M+���Ҩ|������׆�n��|�q���j��
p�Ch��#�/ⳟ_�c�bQ�G0l�
+�%=+�>>'n9;7�^^^�=1�.5?j���D'_X,�D,�Q�n�����?��t��/����J���\p�
��&��w!��ב���0؋���g�T�StZ�
*j���|��
�	D„=�bC�B
�3�WYx{�o��t}�5�[�,�w������$	���4LB�A#�oaQQ���\x�����ą�ʈ}IH��N��K
�ȇ�ߠ��
��K��e���'�s�}*_}�;v����$p��;���$p�\,��1~ �?$�� �
+
+�� �
��!�
+9�~��|?��}�S����R�
��wp����^@
��Y�H{��VD�rqQ�"�Ş'Vpo�TU�$�V�d�DױJ�tz�t
+�*�B��M"{�i��1�����a�=~o����ض�R[�� ��Q!��q/��e��UV.y�VH[(`��I����ʪY���L<�SJ�0Mu��V���~٫�@(���C��
[����=着0�#�?��/0�S.2s�C -3)��bg����$�395���t2C!��6+�ӵ�khC�5�Iu�?F�;��; ���?�z��{w��]-�SUԧU� ""{*(CF�
+DF$L�@	�;���/�d:�!��Z
u]�{��w����T
�*�� ʇ��F� �� �9xɉ��Y��9E���G4v����؊�?�Ƹ�@��ֱ���B��J�|��/7)�˜����b@Ջ<��*���@�
�;��€ ��f��e>� 1K�Wi��E2�c���9��rg0]����D��g
�Q])����ܚd��]ѯ�W�iMU}:o ��@�
:�v N�?ćѱ�@���F�q�?��.�[cT�(��y�1�o�M70œh~�8J�
��h.#l�QD���ҭ�W��F�[�����3j;�E���#@�� ��O���<��~����.;��YK��h�k&�qt�d=��r�T}�J����+z�PU��X}Ψ�9gT��z�<����
�#��8:���<1��)y/�%O$y����evU�m:�>Cn�^!R$��,�@�P��18Q�r�
�.���e�F��Һs&o|<�#�A��D
�1�@q4�7剜_���NJ��5yvAT�<��P�hx�0�,��w*
�\��^j4�5]�ͪD;��:�U�qZ�W �s��~���,�0PD� u������gڴ‡�lIJ�}����8Ma��)�BU��,��QdRb�n��&�8����mpZ9�.�7>
8a�@���*2
+hc�^�3~1��3�J�E�i�颸����r!:Aj$�U��^N��Mr� ��s!�����&����xt�~8���ۀ��>�4�@s�W�Ѵ�m)9�PV�-kQŸ��iP��8��
S�Y��FR��4���c�4Kl]
�I�C4<Q	��z�á�s�
��!{�2� Ѕ��f�NxfKH~�Jμ��Οu�F^4��܊����p�rf�J@�г:���6��BRBd����
+Am-[[��ꍏ��m@��Ch�[kd�+>�~r��`v��S�!��C����k��B�D��+Y]d=��a&���JD��
�;Dlw؛��7 c�_ �so����`
+	y툈z���6��tk4
6֗��7Z
��*�-��Kآ&%�ת#q�fB׆cʡ�
�2 G��MT���C?�����.�X��
[��Z�H�����5:�W�t6譥d����U�E��FIҬŋ(��ZǗ�kxZ����,����z0=�� >�=P
���~�
���?�Y�9=1��y~4����t��V$�a��i��x%A��!j�Ls�LdE�Զr��V!tZQ<����s`� i����	,{߸�?�x���Q��#/N�e��`%���z�yx+�U��nG��z)�xVY�'i��NC�V`�k��"��|Fy�T&�`y������'_ ��z>����#�n/F�\L���z�2���Cs/)��Tb%Ӌ�\8y��U	��B��+��|Ȫ/����:� �� ��{7Ӟ޸��h�o��;A[����,��8N����(��V�'O7������*�
�����x�Uzj�ޝ;�Wd�(aCV%l`P��Pyp<����}�捑
�^��g�Օ���B�
kQG5w�a
g����7�p�kŭ�Y�l���hd����˿L�^b��/IİK�(�� [...]

ۿy���7�S[��Z�����
h=(L�0��~l.}-����Z�Y�n@�."��@����P
+g�SDF�d{W���5��d�˸�:n�8� �
��� ��\���o3K>^��=ݻ_�%�%4��$&��8�� ��j%��|	���A
+oմ��Ķ�^Ƿî�:�f�Ԍ&��
��6-�L��zH|�

���b�?����ӑu����[}U��
+^��^��_��b6��Q�Y������U8��2��Tݘ��i�-4�3�4�o��'�iͩ��ZRn
+Z�o�H� �͟�s��ӹ��?}����W>ߪ�m���7�
+�b��#�1��e����n��
��?�#s
"*a�Q��{u5�k
�i�xt�JK}�
+��L�
��jH���
+0}�����0:����[gAM v
��t�v�3�t�љvZuծ]��u�C�;r�CDD ��@	!`BBHHB�
r�;��
\B���ZP�X��nŋu��
���؇}��f~/������76ذQ
����@Bbh�\�
�Y��u��un^�R!��
lQ�wL�s6���H-M{��#��R�p�R�ʒKʓ���7k׌M�rM��'����?��g�İk�S!"�	q8@&� 
���x�w���3�Ks�ޖG�!禼�:�����􊑟��� �%��� �X~H�<�齾v�m�Wka��İu�~A���D�
+(Dh>�F����,�A�C~�I)��o|J"��& ����x��ŭԤǮ03b��gF��}P����M}�3-�z���[6|�Ǔ�oK�@C��' �룐��A��
���	P� tD
`#c��{xʢ��
�H��� jl80bÀ�!s�'�<�jc�/q/Ӄ@�

�|�
+�8�-�
��QMxFeU>��i�HR�|��� ���/1����{��.�K<[�'�-<+�A�IgPW�7
�K���
�g�����
+��� N
���H]iD����/X�"�IY����E���M�
o��(���
+g�]�Yt�d��_6]8��|�pR~
=)��L�}�U�z�����{@�
yf4HsRA�:�VPR���X[CY�q��Du*ܹr��.� ��Y%3X�lsZ~=��*UN^i��\U^,��t{�gP�5�y
��- A�Er (ӣA�����eQq�����>IY`��<<)`?����5�Y�^2]b����+�0g�n�Ϫn]T_�\V�c/�=�˚�%>����x[@���A����#I��=�,-B-	��g
��Vm�<�Ǿ_%�߭P�f�ZewJ-�۸�?�{5��#��	�%��Sr�y���UC�� ��
��ݠ>���Ф'��X��ʂ��Rl�Fy�C���r�sT��I<MlQ��[T�p��o���|s^7�׍���
�/��.�v���?��A��bw�&� 4'��� �Y��4�y��h�s	��1�����b���U
+�I��I0k&K;tWp}��Q�h�� ����켡����E�
p��� �
���
���0�'#@����%'��U�������<F�t]�]"�JQ��I���e�V���Ɵ5
�L����:�cmvҘ�R�U�o=HB?M�h�> ��0%ŭ�Ґ���Ǟ���݌!�W���i��
��K�F�M�vW�Z��fC?�������]>jq�F-V��Ty�l���?d^�6b�#�Sl0�b�Y��K���O̹�4�KftD�uE5s����px�!�D�GS�vWL��v��|�j'�mm�
���c�U�Z�գ_��E�&Ѕmc�~0��
�֑��ܙ���y<wΆ��4*&ԔZ���?ȯ���
5�L��A׵YNZ���Sv}ՐCW=b�PG�*�Ǧ�y����
��M������5*`��#��Tr�+'{�
]x�\Z1���
RR�=b�������zScnamZ�ˡ��;�t�S^�v�#6)��U�kPo��࿂9�KpD�����+1v�'=�~��o�P�K6
�m 2�4��Ny��&�j�<����dn����L�C��q���N!��hd�ؽ�|<���5�mám`	��p�官��z"
���
�AN�)@������2FW
�gW�eF[�5��YҠ�5r�N
����
{s;��n;�~��U�����
� Ơ���:��9
�8p8tޝ
55��:ї_���{m������L�5�X���I�f��;Kc��%�t�6�u1�N�mg�F||�A�54n S�_���B����{<�|p!-�'+�������E��K�V+���P-U�j�����$n���l52��*mwVK\'%n'M4b�
Gl��� :�t���Vh��ÙC{�3�����݉���${�����/$8�p4�����R$b]ՠg�0u�&�Vi��[�*����s�TnG�|�N�yl�Z5H�Z�~��f�<�m�?p�3Oخ�W;oO&��g$
���*������nB���,������k���8N9E�i�՞��VO�:�c��w�+��MX	$���
aEО ��� *EY�dHeJ q ���.�{�1�����������wRX%*�U��X��ʄ�3��W���7j5W3K�]L8�(L6@�շPv�j�{��
5�m;n2���I�XKg(���Q��{8���$NQ#S~-I!����-P%_��e^*(�֔T�j���5
U�ږJr��Jj�n��m(���v�O��n�ص��Ю�
��QW�GC�6�{�}�:#�/�a���Dzj� �vB��&�ɸ�R�1�
��<���
s��
�x�
{�a9��n��m(1��̷C����;vNw�o
=��c�e߽1_�ơ ��di7���NH��Q��
Ƌ��化�|r����+F�U�hueI�����\y�Qi�Ggt�mù�[���6�����_M�y>��W���k�:nv}�þv
�sv$4��y4A֏�K磻��2��n������uJ�����UaDG�2��2��2�qwQ؃���R�pa�WPg�����M/�
�uL�nm�X�i�����vu:3��_0
%yN䍡I/�ɴQ:�8��nj�	��%b�P�,|�Tv�@�<x�֍���6yP�NPl�jL���d�a�s�������
&ۯ-Z�^��.�wv+����F�4�DM
�2�gfhɘ����	
7�(-bL�}Q(U��F�E�#��#׵���v@���W6��{��ꅿol�`btq�|ɒ� [...]
+�R�M�L�p�'ʸ~�<�x�NPm������
z�c�\�c����]�Ofy��lş]]��H���G$�;����zO'D�M�
{�BYL�������y
�\Q��F��є�{�V%�ܰI��e���'���_eP�[OÏ�s��,
�r��1

F� �
�\!��}�!C���
+�+&�w�o��F|���,ea��rq^���T�wg��t�\�w��@�~`�`��S��6��%�#�䀣�mI�눁`�(@z��;��@��F }�
�
�`O�x|�
u�,
s��s��
wY9���k��:�蕏����9�"0�.��2�� \-P�s$mC �> �������^@q���;$����8
ΐ��BOG�hO����t��P_��__����r��:!͆�i`�=l���i_(x� ��1����
r�a 
q��#��$������� ��
��$v�@���m��dx��8�$� F{���8�
+;��("���a��)^ST���S��

��7����
+Ә>��ɟA�dL�

�b�c�!�3쨠�bU�o����m`kR���S2i����@�� 1 �ȏ�l�r���>>��^��@=͚#�K�+���ڴW�+�lc�4�`}_8�������1C���Q~u��6�hx�F �0�l?
�	�y�;H� �!?��)|�$Y�"3?i�V����徊�H�!�fL��S��I̝�It�x�#
��{���v�MH��!��!��M@�0���c��r�?H�+��e.���%f�N�M�c�H����͐/dLk�����	�
�V-
�<����I��ϥ
�A����������=�j�2

!���}��A�P�t�<�d�F�d20��)䷩B��$9K�Tr_�K�Ӕr�dlM��N2��Y�ے�۝=���$d��>��I�9wȫ�_G� �7��^P�
�6P����%��Ȩ�ea�-��\`�X���L��)jY��F��X����|
ך3����"�紒�jro�/���&�ꀣm�j�v;!��Nz�A1������
+1�+�d�)��V�a�s��YV.o*�X0N?'�Tg����<'�T�Zs�{�ZI=yw)=�?S�4О\�������
�	���p�� �|��*�N�{���?(�ы
+Q#e�MeX�q�i��Jѳ�R�SF���z9���X�FR����w�O�M�n�Uzw�Oq��KqOV<mC��!�v9���~(�>g�
�Kx}E5��q
�cu��(�:�ʢ2�� R��^��P)R @JH��C�"BE0	A\��
���g��nև}����9���9? 
�^��!H�yY����z at -��F*#��1K���cH9}�b_�R�h2/s/g���f���
97y��7�
H���P������a ��� ���0����WRX�3a�A
*�v
=A)%�(����j*5ybf?���7��
�+�@\��MH�@�2�	��
 ��P��7��]���AP�e���B<�*#����
��q�
+r��|�h%�x�\N�/b�z�|VV�iè�-��
+5(n@��
+�^$����k�
+��$���ub��
+wk�<s�S�߉�MAn��#��6��kH���f�Ǹ��H�TA�t�VU�հ�	b��@)�Ŷ�e�K	��D����
�b.n\���
���Pbj����u��n@�i��f�?Z�_��x�
�w�))J_��zU�B]��;�Ŕ��F2�]K�D�HHh���R~DVM�I�D��Iԋ��q�9���@>��
�d�߁z�����f���������0��]1>���F��)�\d7KheR��U�r:[D��x%2Q5I%eu��aYI+��t�J�^�%�(G- ��i��l	\~ N
�S�y�U�����0��.Fy��a��M𔋵d�CPq	d��&��؜�
�L,�Q��d��J��)��B�J)d��B֋�$SC�
�w�N���yߧ6�Ʈ�6/���>

+q����J�hMI�l��m���"
Y�+�q���
&�WQ%�+�ŕm��������
+��T�����bs@�����
����@�ӞE��o�ܭ��
�-�~b0�������䤶�
�2'��rą�
>�U�epK�y�B�B�c^��3��X�VV��IqUz1�
>7����� �O;A������
t����������
�z��B;��~ICț���F-��LZ�,�8G��K�(^�4��#��J�
�]�c�z�9���@�Y���A�����}�O�_\;��������n�z�G�PLh�%���%l�Ʋ.�I�*\Y��������(ؼ
�X�%m�K�$i�k�
�^�-!��Bs@�i��
+�?�l�u���������?o��v����9�ц�w�D���%H�S2�{31�����|
+����n)c!��5�*!/�Q)Hj�&���I
A�� ��
|s ��Psp
�3�F��>�M/G�l|t�ĺκ�>�m�w3ȭU��
�
N��ӑ��98�żbt�,��B�w2�I
�j����Vs�:�L&9�Z&9�&� ����^
M��a��ݕ���ɤ���v�O�
��e�q'�Ey+�_h��bh�'�G���D
zCȺB(�k���AzE� �*f��5�Ό
�0"4ӌ��)ft��
Pnj�
��
X��o��]+o?سB�쨅手e��36M�$�Po��(u
+v�0�������2`�R��y=�0^G/�����z*T�N
�k��㷩a#3���
+s �r%�ۿ
+��V���e���
˴���
�?��s�i���1�ߓ��A�ԇa��q���I�w3�S��Y*v��5�(������Y51讆to�4��0x�Q�9���r�l�|��Wӆu�s��^�Y�~m�����Kw�|NQ^���#B��q��s���ғ�i1s�̈����9Zn�
0/G�Ϸ`��{�|�������{�c�n[:6-���2vk-��oV��Z�m-�F�C
��q�����4F�c����qƴ�(c
j�&��Rߕ��}�L�{#��}�����9����,��W�ϼ
3
�, S��!��VC�fi�}ؼ��þM�G��N�K?z8��O�.{—��`�bc?���[BD/b�>b��S�P���o�9����3)�{��J<��#��}�Yw:W at F4� �WAZ�Y� ۾��[h�Ϊ8, �v��
+] �#�xA�7���̀� ��}@a� �zZ�`C�?	�O-�"ܖ#�>6�5ڷ�;��2�"{��+�vM%��\
�-��yp�I^vq����2_gQM�g �9�=ǥ=Gg��>�(*(�Ȏ��;�H�����d%|	�
��,심���@EE�R�VOU����0��l*���w�o�{��_����;�C��i zC�g н����|_H���)O��� m�;�ݠ0�ʃ]�ʬ��_Y4���(��"6����5p`��63�q'	ܭ��c
��~�3��!�> G� ��P
��~�؎
�wr��+ ..��:���r�N@���uᎅE�c

��*�lظ
+����z
�H�MQ��
x��������zAԾ����DkW p���N�8t8�
@`s
$��@fk�a;P��Y�l�����n	"�
�b
H�Q�ƺ���<v�R# 9����;����PN�@<G{w>�
����oc.᮳c�ً��9
��ܹ�1�1���������?�`
v뀍5�}w ��G!�Bj�/�Y���D�}�鈿S
+�+�����5�wq�����������Y���.���棇x�c�y/q��1�4o(v�7��kH�x�� ��A�An8�x�|A�

+<A$���5��y�Ki����F�b\
g���]�����n���y���yʟ�M�	S�ḗ���i�9��X��d^�
��g�A��F
/��S��B3Q�SJ���*�bBg�x�7ۖ��)�����

+_ឋ&���Q�KQO”�
`}��v�A�l	��!��Oہ*�2�| �v$�S	�ؙ��d}һ�"�Rb%{�Tϛ��ȟ�k��������%S�1�(��q���7a2����
`c
,�A��
(=�����
=�H'P�AI#DB§�
��6i�^�\��s��u�����Yb��M��ׄ^�
aT��8.}��"��4��!O�nQ�e]f|i`Yi'��l�m�����`
w=��	A���Dx��"���S�޲L�7�R�+j�p��$y��t2�3m�x#>����e=�1��ı�.��$�{5p���נq�
+&+����0ȋ9	���55l	e��Ԅ��J�tJ{�U�K�?Mj�>��"��k�>��G�>EO�sE7�ڙ��+��2�<�b
)�׃��א��
�{�A���1(�r���hH<=�fDϠ��H:�X�
N��KS2jd�К2�SB�Q��w)������봑�6�HV+c$��i
���:����F�-P����,��SY��r	�g��2m�G�k�q#(B�C�8�z���B�]NEz7�
��ܒ�I���N����/3����au#kX]�y�2x�V���:ȶ�yΛ��k������?T�9���>�k1`�0)쉑Kx��P{
+�]D#��؄t
+J2:xՙ�&�V������"�_�����8C�j�7�1R���u�Ӳ
+�6�Y�
P��sM��ҹ��>���j���Y����,BO��z;[��Rd�:��MR�h�g7��5��V]=����{__�З�s���b���
�c
�kA��EN�Bv?k��|��?0�j7��8�H89PE
+�-a�o�Poꤜ�Y���B#k��
�����5�*a��\p�P&�k,�
+E�|�>O<�3�Kb��XC�㟡�m+�y�~�oߛ�`������b<
�&������Uȥ\5�9��颦�lY�€VɋTg�*uũ�
�6c���dJ�3��F�t@��6�cv����`���^GK�q��
;��}�^]
+��h;c;����H
�N�]/eS��
�
��V��Uf��Re�� ��$�7�e�MZYW�F�0W-�3����|@o�
l�1a
؜�u����m��%�]���V�;B=��v�B\pW-%�����\�g��KE�R�S�y*�ʐU��(������E�_0}&�7���9 ���@�͟�
+�S��߮\t�n��c��u��O:�>h�p�{+!�Z#9�RM2���Ǫ*
K��H�)��T*m�N��6���M2յ�4��\D�gB������9_2����?B��
p����%�M�u�m���w��������u��L���@#��p���BA^	��S�T���:��:��8���iQ�i�m��lY"��Y
�Y��9�}�^�Pd9(R�6�� �D�)L��I3�	%�8���)��������������|�'r2$E9)y���W
�ro
���
?(}S�ӑ���)�
�֩ CO���ǥ]����%c7M�5Y,�i�Y��!i��F�y�-_RM-ϻ�R�?{9,��Rl��|RRF�$5�t����YqE�������7
�
)�ɏ<ޑ��)�
�
Y4P��SF��5;��/
x�W�����g-���^f7�2�����.Ԋ��U!AyW��2*R/}8�Bfz��c�%9�gʥAgj�ĥ:�NwJC��rg�EC�zu��6W���zs����ms��w��~a��������
�5��e�
J�mN�� q��ȈԪ���k�Rb�
��WH���:&*���_V��/���+�w���_rDg�f�IkU�����[4Pe�1vGO}�MO���@�ٛ�K�_�o���mϕ���Y�'�	�Yw�������F��HN�M?x=G�_s���b��:�Uݔɬy�ɮ|�ɭ�
�RA�b/+�զ�tU�|�J���
+�W�mR}�m��N����W���)6'�����|�
�
��c�DŽ�6%ň��w����3�\Heܩ��%�w_J�{����1��
GV(�d�2*uT�n�V�y��xիE���5��.���vmy����N���5���ҏ��.b�<
�>����o�DrZ�c}[���-��U����$r��D���$j���� {�.�TB�2����/^�#
.SjПS3�gi�{ݒ>'��
O��
��q�b����_B�]�\~g��ݑ&ft�{w�
�t\
�ꨎ��l�t�z��9���)z68�D	W�o��Z�?u�#ꇗ�T
,��i���C�zҏNF�<,�i�QL�����?Л����O`��S���,�W��}��u��e��y�UL��+v��S��;3��$~�S'��� ��j���#*eߩ]�o^T,7Y�+��O�;'�=�#e4�@ӑ/�rdbO�,�B�
�&��xȏ����Y����h����u��X#w��v�ݗ�
+C3깢L<��F�{�F�x�A\�T:�����۴�����|��O'�w7�S�x�
[�ׁ>!r�L�:{NF��N&��&%�����S���T��˴}P<4�Mt���
+/f�V��wW��kS%*�4�ҩ��ǡ;�
�Ra�:6�p`��F~ �0�cF����n�uF��#��#��G
�!��
+E$K�s�@��9�]��0�������D�
�T���e��8�v,����`X�`�

�������N70�I��> ��~�� r�>ę["��
�fȱ2E�>��ރ�w��f6uw����	��� r�3W)
˕��
��
�0��b�
+�WS���
$x�9�[�Lkp�XB��A������{��c7$;��C#��@��!��M�O��/	�X/A�b��Ah)c�� �5��2�
+�E�0�"�Z�
+l��<W���z/kL�^��u��!Xw"u
�~R6lE���8�� z�o�*XF��[h"�n9"\tEق�.�- ��0�	�#n��y�YL�<
>
x����j=���ir��$�5w«�����
�/�U�
��r�c3���\���嬃h�D1w!���av%8���?)�b|������J��ؠ�s���~S�6�$�
o��=��O�Q��3M�����������Ad��pm�:���f�2�ɷ@H�
�q$�K��ˡ�S�
�YeL�T���~S�z���7I}��t	��_(Â�h#�t���!����	��Nu�M5e��x�uH�،x�1b��Cp
	�= Ȣ�{�v)�K�i�5�)�Zޤw=��@0A}����N�7�PF�,
���`Ȅݾr��<`&��O�l��X+m$9�C���iF�g�#Zd���= ̠�W� ��5���o��*o�Q+�����~(�F{.���0F�0L�
��w$�
sD��%
lg�gEw�:�v/@��2
ڿ�.���b�����ϰ��=��l.R��-�:�{R�U��p#V�$BB��	Y$9Y�$�0B�aod�����(PW+^!,E�^������y�>���9/��y��w��}�q�z
P�!��q��O���(
�CT�=��gd
���W	o#�oŸ_F� M"�#Q/I�ѯȷP�(7b��5. ��
0w~��B~`9P�XT?�9�; �
 <�q����
+��'j��p1�Ƙ0o�E�ר*���F�
��<��� ~�L!f(#Q�Q�P/i�1s�k�9���9�= 
n�mq����b��5�
_
4!ۀ��?P���(�}�c�y�J
MKB�$��g�s�f����2�dL
e
�N�E��F������c~c�Dϲ�1���
vK�} 76���'P�^4����c�A�-�B��ǔ�}�7bj�
�6Ö#����qr&�)�D
�Q
a���c����n� �.{ =����p��3�V�snC�sn
�>@X��\���V���?,� ���!tǻ4���̡Y%�Դ�jH�#
u�z:~��C�C��o��X}�:No\{�5�M�U�����?ͯ�O�+���r�3��n��w���f�B`��
����9����H�Y}L��p���u��D�
(0�9Z�MF�5��M.�t+y�&A
���	?,�'L�����2򤨈2%�����
`�u�M
����%�;��������sy�~���QC|�
��
%�'�bzjb7���2����zj���R�XM�I\I�-)'�K��b
mB\@�ḨO�H�8�W����w~r���C��s��k��
3�s�63��Q6���4r��6�[!¶K�&��~�������˙��F����"�D�]�?�L
�4�9.5��%Y�	�=7p��H��`�1��],��
Y1W|r�T��MO��w��eC�/0m�|L�"�H��
+Q��o\J��h�K�ٍ�
�U��}_����6HϵIӹ�{ n�����
� 
�O�
�O�?|�{��e/ʏ��U�{P
��u�''�L��٠K�T���2��^�fq� Ohg�K�
^�\��R����Q��?&�
+lLj��wx�Ѭw����݂�{��"��YMв֞\;T
�w�}�˄
nʦD֤�c�tB�5YN7)S�92� C�'N�E�E��C�,P�GI����1YR�
�P��J�[�r������Y��¹�}�'}�K��5U�v�� �Y��/�Ηg1c��|�I'�S�
CR���(N�Yd*�R!�Z�2�_ɞ*!hTAc2����p�x�3H]��}=@�����]�_��Y0���^���}�gwt�#
cOU�	E�ttAV����J�N��S��r�Y&U�+U�J��J�����E�1�Ha���U�@�5����i������
�kwxN���|ҹ�k�5��zC���������'K����Ԙ�<^�-�j3��$��/K5�u&��-Qp5
J�暒�
Qr4�rn�,Am�����@7d���K[�>Tluٰ�}�s��ë�
o�txՕ�`ߦ��*�P'�����B2�p��5	(�\��<af�(��+e��t}����VR
��Q9#uL��� { 
>�R'�
�G�&�w5\gZ׻�^��<|}���W�w��V�
Pr9꘩{.���+a�%��R��!(Pq9���<���c��952|N�<>�g�83mR�a�.���	$�r��t���
>�SWV:�rk���>��W�X��}rKEG�
K
2�؀9�ZG@$U�b�\��TDc+شB-�h��.Y�K�}�6(E[�%XӸ$.wBl���y;�
+�OU+��ڼ
G��
��r꽳ݳ��Қ�7����y(�

�n���)(A=Ǯ��52:�Z��Vf$�+̂�J��]���#���EO�P�)�=@��/q֯
��/qx���po�ӡ��r�Ο}=��K��+��3�F��NȺ��	:�VMi���	ӒLC5���vDS7����< ��]~�QmP.rF/P���m��`��C߽yݏ�:6��Ž�ў%��GVg
�� �
uDЏ
f��B)7��^^L�u)6�Z2>����u�䝆�c	Ъh](VED$
+�*���d��/�FI�
+�
��Œb��#ngT
-.uGܷ��0�n�
+�B��� �39��+r��?����%�R�C]9�˻R���z��U.y�;�w�;�l�`�W��q��y��-g��?c�S�_�
i���y����=*�|�	BKZ��JO6>�b��)MS�X�T*�4V��Uj^cu:��Zvc���tW�n��`>�ӳ~�˴[��9N;W/9��'��%j:f8�����#�m�ϲ�L�����viTv�:^ۖ��֚ǔ�.�[W���d�1�u���V#e�����ߴj�����%?
P�b�v$�k
���4����mv!�&��2yҶ��]7tG�۝8������
��/�t)�]�8IWN���0�׵���^�bvWrR��s�L�y��c��?��=����*��˷��	��/����m��
���$������K�Q���	���T��L��
�e��P�`F80+�c�_ĴŦXJ�U$&
U%�
�J�>�=r25j�"#�C##��K�n�D]�=q�=��ɑ���gD�Gw��>ѝW!p|!�ݲ7=�^Jp|��R��q�^��>(9!�Q����(
����H����a�Y��1!��;����BG.��;Q�ȞX?2�n
����)~c3:Q��/�H�& Ã
r"�d(|���!�/1��B������?���T��`���G�MG�	b�
��� ֶ�j��+��}<
�Aw�#`�
'p3���nI`�ǃ�Ѵ(ȦG@=#
:�d�
�R� ����y��=[���9��}�Ʀ����߷��� V��|���a��S
��t� �D�}
���Hp
G��P�'����'�C>i>ԓ}��<9S|P�6%_z����=P5uv�1�� ġ�P/r�.�
�ܙ�I�H�@Z^(�%Q�|
��D�J�/�&8�X`�a����:�$�I���!����a�
��x��a��;�{K����!�Ȉr�a��93aӡ�@�
+eq��q�u1�S��� y�n-��\�H�n��l��f����裆X�T?g�o"����a��H��i�9C�
+c�rY3a�aH
@FVҖEC�m<$�� �1�n&x� k��&�i�}�V3�
��#�~� {P�i��
	کaa5,
�>.�A�
C�+�Ĺ!��<��2 ��0�DC�:
���oe at X�u�
�Q
�S|p�S�\��(��n���D�{�;rP�o��,�'�!��6 at f� �A�
c�8�L�ש
(�� _��6
��h��L�j]
+䛙��āh���'��#�N�wY<L�[ȧ�򍤏염�̒v����"k[�6��A>���3��a��)X�<��
,��a�&Fc42��Q��)mkD��
��,�B��g��_� �ܒ��Z��T����O�.
P�&6+%��_e�- �� �/
_'�E���}�4
�p��R4��B�o��`,L�\�j�V���[x����
�~�IvX�%=!+9�x-���7+_�_)[��T-��=�YsSn�\V��/*G�5�f.
9s�Pl�8���P���Y^X#��*E�P�.r`i^|onI�)k-筮����E
��җ���vE���l�S�e�c�M�셦Y֓~G�>��A�^W�֯;�

����8"߇�UcP
���wG���s-�}�5�bc����)���pڳ�S�2�$�kw�[4�UՇ5������w��t��O�7T]�K���zu�ᔦ�p<��p,ctPY3dz;���/J�?G��	��ʔC��9}��~�kUa������O�^�i�[+h2VJ���n�57��^K�YEs�pI}%낺)�����3�=��=ƣ�
c��'���ݨ�6��^�(������aS�+6�L�X�4�}���7�o�FyP�:}�o�K��Vq�.[#���B~5wsڥ�
�
{��������S���]_QM�i ��P
��XP��2*:��
+�� қR	�ɗ� ��Ih� �%t!�Q"ʂh��x�w�#I�Y
�
f��o�:^�������O������ERS�"��H���N��
+8����LA�Ȳ5���,�2��_*\7���{�|�Ž�%a?<ˏ=���?� 
�
JI
���EޢĨȥ�
�ۅo�w�:����f�0E���4�(��7�*����H��w #��jc�
\	��[����Y��X-Tyl����f�"�n�(��<��=
ŷ?�
|#�jd7+'�T��J��5�k���r
��ZC�K�&<�K�:Z%IO����7�8�+�6�9��(8�.?b�\����̺�:�M/꼷�,
�Ք]r`\�sH��3A]i�ȶ+��&vAB�,IF�"I�rj%��^N��(�P)�5TL�х4=M@[�~
�̦#�����3�+�}�
�Xlp\�J�~Z���#����ʈ꒸s�B<�+�
Ԛ�)��
S��M�J)�W�Ť2f=��P� z��g�d�1�P.SG�a�i�!p2���
o;�:��ڭX�?f�k:a1�vz͓f7��~�V�
�+�9�,���PsX2^Z�$=+A��S+ȅ)����V(��b��#,^�
&/Y��L�A��z���X�
�H�f}g�!��������mG͞w���hs�:����6��^I�K�(�[^L
+�0"�1eY�af>?����VM��63�rz�\�?Y
�
B��r����s9z�!p2;i�
k#�|��r���[�a�[�!�g=�,Ʈ�l�ׂ�w�1�XW�e�f	ƫVD����)���tL^Nn?���Γ�8�rFJF7��q���x��g�3�Pr���|UO3& �S�5��`��їƽ���}�/�0~��_5�t�<�᳷�9�h[C䙆�xO�$�_TN
���r��0<AvRZ��t%OLc�4 at Pv'���fQr
��9Z-K
��::���
�I�=�mB���(�j;j�y��k�N��m�x���g��Sz��l8�h�8]��Q.��	�ȡ�b���rN<���K..$2�ʩTA
�T����3��Z�@���4R�a09�
+\��!ۊz�n�zyc�Y�
�������ɪ����V���u�a�������
y���Lɭ�˖d$�+���22^$�%�� LY/C��'��i�"=+4
������6�?��^�
�r��߳F
ݵ[٧>��󖻍\�g'�9Y��ߎA�Z�
-�՘
M��O����d%LM59���U}�v��!�5J�@��X�Ė�1f�G�y�P�d
�в<S��V��#����AӞ!�u̓n�e��������K���8/NW�E�5J��Ih��$�dc⚋�QMR|����P�B�F/���EbD-Bf�Y���k�'�j0u�
�����a3pG��4�L�
��~�źr�g�`0�h�:‰{;�<��C�I�ǫ!	�9�1=��K�¸�nIB�R����t�G�a�������Z
�3� Xd	f+���`�%P���ɵ�cr�q��QK����E�=����s`
G��
%�'�#�`�B�S�"���BՂ� �����<�o�7�W=���F�����1���ap���6�m�`De
+�M@Ϙh�Z
�i$�:d^��ic��
i���&C�)Q'q㘳�?ܢ~��"Ʈ�C4<� � �O#��(B|4���c#�^c�!^߆y���9�
a�����v��۷��r�4O��ڹ�@<gc\4{�<{�q=���5�W�=��b�_������<Cp
���
���0�;aZ��{{M+|<gz�
χ���E�O/�ݦ���:�lЌ M���5J�1P<4UÓH�U��ބ�=j��u�iݬ	Z�]����Q��v��1����)~�lG�|�i����
Z������9]����~
���Y���y���!� �;Q@ه�a# �4Es�@޻���w�M���[R�;nHz�%���K.���/�C��߇;���dヤz�u����ę����?�O9~R:��<�t�˄��g-�A�m t� @�A��)��c
�,[1����<�*�O��Q�u�
+��cK�_���ࠝ>p�.O8���0v�9���f
<
smO��v�c���b��8��fZ�p��(%-�$T�,��,5��K3�4��HDuQ�P"Kٗd�ZN<�9����\��v�updi��}��{����>�����������Q����

����`��>�7�ZN�HM���$R�C��Æ��Gda�����+2Z���B�'p��Ăp2
�S������Hr]������
+�j� ��
��yh��C�
_���K^�h���yb�5b�=����l���#
p�Q��,�
[��8X��G*�c�����E�_ �O��D�N�C��VN�š)�����i��8�
G���U;ۈ�����&��_�HfPHZ�!I��!q
�"��E���mB�"�~>"��p�g�#�!
��(Oh
g�����3a��N�Q�4��N�B�8k�C{�-�!v�,t���5�J�
d	
���@T ~�|p7���c1�?�#�H�KAo��*�V�����"t�@�'
�@�
P{��}dY�7�`
+b�� 
u�:�	Z�34b(�
���@�, �����i!�����֡%`��D�(0~���N��
�}����
��G6�9��?CL � [(B
�[�=�	q.Ш=�4�B�qq������%�
��x�g�`]��y��=�;�{���5���x��5,k  2�)���Bl��p'���0�\�Wx at c�2;�U
 ._
QM;#�����tp[�\��6s������������cc~�����p�����G���� {�Ü�ʘ�T�
�e
0�}���� �5a�lZ���(���~��'���gY�b.�cn��y�8=�לO�O�1��1�v
+�{*D̿D�[�!އ��-L�쑾h
�h�ś����H�� 1%:K谺8|H�!rP��6 ����c��
a�=��,���(������^���%��~�w
�Bx/�[b��E�܋=!��9��a�� 
gr�ܑ��
N6��C����=ڵQ�TU�nE
�/�
�����?%'b������W/�w���s�ᓸ����ے�R��ȬC
�A�I�Ƀ�L;�8b��Xɜ��!�|n�>�sZz�s~��Ē�7	ѯ4[؝����>�s�Q�SY���r���_�
�?ߓ�ߑ�ǷK��W��ҋ�a�y�u�!C�NF
+�;��ڢ0x��ǡ��<T��[(�����{��
�*#7���U��Mk�O
U�G�:��n�=uS�]�	�-�y�M�5Y�������GqI9�8�R6k��'4C
+k %������D�+t@��1����r�w�ƺw�V�t���
{���z?��u7iC̯��?
���	��W���m�ӊK�˪
�[�V�곚��f��nPs8aPݤ�r�
L�d�����S�o�
��_+���Xɜ��z�kg�l���A
+R�����ڳV������R6�^J��wc��\�~��qusB��d�
��'�#���C�ݾ��^�n����f� ��{���&c���𦐑=��N��_l�N{Z!�Fx��
v� ��f)`_�)��\ג�Yz*e��y����E�xŰ�x��h�2�1�v&�����	u��A3���l���Q�f�Jo�`M����E�o�"�=�ƚ��*���zU��5�ŗ�ҩ�+,�e�'s��G�*e3����5hS$�N>�ؐ|Ѹ#��i{�KcmJ�qkjobMZ��:�Oo
t��g�w%�;�y���}����w,p��>��z��ݭB��������/M�6小�\!8��D�߲^�7�ZՐU�����P�q̸%�5�:�=iszGRU�g���
cefobEf���
+b�,g�":�z������_Jמ �獡#�N����v�F:�u�n��rsԱ�LvSQ���p�xW�Zy}�&�6K��&w��*簩2��yC�����g�u9�I�r������r{�A"�r��YLtފ#�os����e�r��Ɂ`��{�&^�ɛu�6��L�f��JSdSy:�qM
���P\��T�ee���`KBE~Cb����2�is��jr��q��ؤϷ&�, ��%!T��� ; (]@���{�:!P�R�B(
R'�DD H�*" �
�������qw��Pag
��ȇ���9�9��ߒ�s���9I$�(��B��VK�	�S%>�� ~��"^��=�7��y�^a��s���`��&�E������T�S�Y����A������ʨcG�q�'y�3좂s�‚�n�Ô�/
.w��-XO�l�D�de1�%�P�D _����*�s�:�bhqИv��N~V�q�t��`�~��x�v>ǵ�6Ç_�TSq4������Һ�"މDn���W4��9z)�p�}��8�E���Gדr�l�D����@`�V�FExߡ³J�dT��=bH�2`#7��>"���
a��k{����?~л�>;���0����y��&6��)!��3)�l09�l:�`�
�9�e�����̒
�(�F�P��y�yX햅�#��`\���/�X˜pQ�������<
c���r�9��U�t(��PZ�=/2��*�PmC|zu;+��lrJ�'��&I�̩Zg�Tn$�Vl�D�t�_$
X'
ڤ�E���m�ۓJper7uj�Rzd�Y�g�g穾P��3Qֵ]���S<xm�~��y��-EYMQ�q��m�I���D�$;��D�����X��b��?Q̒%�T��x�)	+��pwBnL+��e|j���	�m
缴Z����"-+����d7� �'�3'0��д��Hv[}t��ָ�֞����,f�u��Df�Ĩ��bE�
i��-�k

�����#tX����99����d*%�a(�Nyh�'���E��Fcm�Cl��
g���q��zK����FFw�DEvwdž
���W�B��*x��!6�]4�n��5��������
�f�p�4
_�$z����l�ϻ�W���L��p���O���S]8�Y�����ђ@�HuH�HsxȰ`��9f����H��5���'f`�hȓ��x�E��!q�����<��7Aϭ�D�MZ㲵L���J�u_-����
L������R�.e:���G���f��������|�GC|�B�g��x_\
���5�-L�O�b��V/��Q`b���kTܣC�%hx��Z�������w�4�	�9p;Ґ}+�4�&�2j9�6b)��T�
�X��������8�������}q����G_�k�'�+>��N��A&&���t.�C�#I�.�^h�������z�-�;XO#v�>��c>N6�n��k�Rl�r��k���}����x�����g.+�98=�����7Q
�;��
pa``��4ݣA��RP.�F
}�C�ycJO��$
]ㅾjQ�P�pa�v����:M���aC/�a����o�,l���f���ʹ%�?wHo,�

�ן�DY \
�$��o����4(^���U5"kU���fJg��l�YsV�X�V^
R
x�_��m����d-��;]���:���f��ֳ{�l`�^`h�>jd�~��r��gc��"��
�t^hX�x@@��!��

���`��C��Ә��J*䣃t�'w9�O~[=>�*�~fns�������K�����;���jZ|����[���
�=8��t��
#�42B�/��kd�
@�s��u:pP�Q��D-J�S�ь�6t7t�䌞[
�_�Ce�!S�
+��"g�f(�`���*`��
�Tݍ=���.�n��e��4.��� �O�H�"Q(��D����'�P\Ј���hC�FG	
t���}Ja��FK�!k�.<�y'�l��b�a��&6�j`鬜:���<G����W ��
�
+������3���)f����hH1E3�ZQ��N|:�렻�6�о�@�&���1FB
�$T0����tE,�+`���H�c�H�dHA'S*z�|,h�gK� wi
RD�XU�Nہ
y��Z��N�z�x� ]F��7F�Q�����L�v�t�
m^�~1G�
�gs�E�o�/vh���.:P�ń�^$?s�c��4*b`�*��h�w�6z�v�k�>:7��ict�5A��=Ș0EƬ�_l�WX�i�?M�1�2�q�����J$��ވ�:&$���*eQyP�E
Y+:긺�
�(��#��
�~�������|��
�G �E������	3N:8ͺ��;8Oz ����@�5 ��!8����&�c�G��́�� ��
+|5;�Gk
�:{�nq ����#x�9��g��
��8����f�Ӹ/
�<���.o��u��[@�1 ?�s�!p�@�3��	�if �o^�9��-��j
�y;�Rf�5@nr�v' �tR/���2�}�e����_^��S��\?zq��fLxÞ7$���� >h��p�
A���N�AF\2��r6�h�jі�I���,[����t���;�RZq3~�.Ӿg\��^�3E
�&���$��ߑ����N�_���%�|��
+�, ����
@`i RkCٽ��V at 8y5�l� �9H�:��f����f�
+(w�Ĭ�Mқ\?����'���?���z��
u��:L�w�~v��{
S��?x�J�;�oe;���5C�B��"��/�oS����l�Kl�Yk3)N��d;����9����u�����t�3{ܟ1�N|ʸI�/���W
���
��I���s�	>@�e@��>�A��ngkJ����X��O]�%��i2B�ӟ��֯e�Ǥ鎣����2��Մ!n�	���1���!���k�t����k��k��:K�7�J?(}\��[ 0���G}Eb�=l
A�d<�L0�R�׼?��8
/��":��<�n($��_A�{

w��^��f�-�q�
^��5^?e�{�z�;B���������# Z�h]
 ��>HQ�@[�!�Mڮ���{��W{�z��n4��yX)��(6��~��;aj���<ⵠ���*�+�����6�E�I���>�9�?��nj3�qf��
�K�10�$H 0�<�_��^
ꝉh�4
]����\ܒ�\w��,_�!5{�o��mw�r�q�qQ�{/�3=.�iH}!徽�jϾ&�)i�d`O���ˬ����c�6�'v��M��U��� �E]s�z=H٤�[���
�<��E!~鰆d�[6�A���Zr���܅�ngc�<{�r}��Ŕa���:�߂�X��nN���Iv�� {ƫ
��=��V� �*8�����P~��
$�=�Q�4��Xh�����p��y�b�Uw
+h�e�-/�����#�{(ܺɞ�q���
�5��~4�&�A~�]�ɭ	;˯
+�&�
h�'�����e�y^�|�[�-��ӃH�7�P��\���lқ(ݢ���J���]�w����r>ע/Kj{F
�ܕ��XR�gk��ܴ?�ZWL���dUE7p�Q���=’�_Dő�E�Qo��Q3�C�:~A��W=�
���1��%�ޙ���h�F�I�i�V���
V��\-�[���SO�xgWV�S{z���T�g�*�|$1�Z�p�qXq�U_�-�khbO��c/�sc�s�^�r⦅��s��x
!��!n꽫Q�Z�M�}���y
6T�v�n���j���
+��Ҁ�'
�;���
��#���=��T>)��2U>�(���I���*�ي.Q��$]qW�V���S�4��)u߀`�_�vP��@c�MjM�給����`����:���IkOk[��
+lZ
+��ϗ�Ή#j3I%�i�Ci���bVvr/]�$8��)NI</Q%JTIc��H�4+T%�	�� �C�J
2����D�	6Ҹ{в��lep���������i�mZ�uC�ԡ�(�U��!��%�49����,zfF!+M]�MNk$
�'���(Ro"����"��Y�2uN���$~�A�	��t6td)��yv��
h�fp��y��FO�c����Vs��THvU�����D�k
+�9�d���
Zj�& )�07!�N��.���Dg\�Dg� ����YaL�� v��G
�c�Zc�q��^��f�)v��B���qɉ���&ʏuu�m�5"��*N��p�.��J/M�M)V�'�1�RNl�~T~�P�wF
�7�
#�E�y�ByΜ �
b���˱�CK�߫a��������+��'���t0n?F0ml�?�u��p��JPaTd�@B �BB"$@Xª(.��
+�U�Q��
P�Ƞ(
+n �
P�
��#������Z�*�K�M�yO�Nz�;�������պT��xl�6yo���q�Bi~�W�5�+�y;���)-4,�^
�h[E|fI�)��xҜ���9�?��[bؔQ4���u,̱,���%4xPɄ۵L�Rτ��6p������{��z�S�{��aam�_�����{��s����w��fUn�\�茝�����S���/������Tޓ��ݧ������ұ0��6��Q
���Aޞ
8�H��&+hhq�
h2�N��8�r(j�r+l���ק�V���P�t��
�����5s�m�L��a0UW�&�m0��=g�{��6�
�v�1n�X��	϶ܫ��{@���4h:A��V
l�{�x����(&nj�M]���d����s}�
[$^ؘ-�װ24�h�*�~�6��Lg��s��P�f��u�G�
Q�
Q�Р?8�P��m ��(p��I���
�.O���
��v?֦K2����+�GO�i3q���㵠u���3�SO�1����7��i.U���#�굺��ڈ�mDS�V{�?B{u��� 
� Wj N�4�$�6
+T^e@�	PtˍRxˇ���zō����΋�%L��C7�j� ��R��˹~���
훂#۷Ku�U2M{�\���~�x%W]�W(/`��<*�����U �� �Ԟ��D���L(�?

+
8��|Z� ֲ�a�
�Ϟ�q��ڙ2��9�
בō�XΏ���K�Q(�vl�
����
�h
Tt�
Pt�
+��$�3,��cܮ 8_
p�(��&�'�ϒ�4��ik~
y�)�m�P���̲qif�m�9zb���c��7/r��$�Mk^�V�7x(��\���'7�˞��g�r�?��s������a���#�_j�p�����F�W6ܥª�����^9S��Rӻ|�.	+�Keex
i��h�:e���<U�GEw���{�Ti�fא�27qO��7��|s�
����ۿ��
�����F�]gH�2��� ���YϘ����?�P�z9Ը^��'f��
ei�5�T�z+�@��| �V:0�.dp�_��&
�O����a��)>C5��Cǝ��/:	�;��/��1��
�n&�K�
`ŏ �� �X�4jFt��M�@-
��
+
a�P����B�zV �Y�a��L��Yㅘk��|kO�b����
X3�
�ٱ��~�&��6r6� ȻO�O ��G��6��ɠDW�
9�����i"�ӽQE����h��Ɯ�
,�0�b*�e9�,'�a�ՖS�����3c��3����{���D�Q�4H�0�)ځ�P�qE�
!
+�<Q=0�����i����`�
4L�O�t�=.��a.��ʰ�"��a��D��CE�����4T��Q�DU8
�c�P�f����([��
.R��n(���A������S�x���X�9���xG
r09���������A�C��ڗ�Z1�Jj
֨I�Gբ����8�hJ����*���\��'8(>M\���'��o<G����Q�`���G�����B�'t>t�
b`������8�d��LT������;Y�R6�*�q�~�u���F.J�=Qr����Nި�����?(���KGy�R������$��%�zQQţ��GC���1�
���0Vg�����်��Q�f��@e�;���b/Cxb�Qި�$D�*�,�,��
�
��]��彂w��9z��Ч[����0�OE-��z
c�
	�
L�Z`��
+�c�16���\0j��
+�#ڭ�aM��zo0|?@uDЧj�*[�>*/x}P��~�|�ݣ|�ݥ���B�Y��0��<
}����c%�	�\*�fS1��wM\���H
��t�����dr��t��q��ƽ7j�Cd	�n��]�
�7�{�G}^kN�ti�D/5�D/4D�j=�|���f���~Rc�5���u�ԙ�q�ID�Q��⊈ȾCHrsH ��� ���}��;�
+
+#x�Z�ʴ�i��Z�Աu��Z�>s�x�9�|���|�����񐊵n�.<��o �{�
�`��Z�$�����kT���"��:-�~*?�"Xu�9���"Z�{J��S��ķ���䱓�3_��:�'/:.�_;}N��<G���0�d�6�,I{�0t'
FY�!�"	�G2v�w���
oi��v�`�w/F�FJ?	W�<
�
�*���^���
Z�����
t�y
��2�~�z
}�z���m��1�B�k(�B�Q�r�b�m�c1I�
�ؿ��]����7<_ӗ��M�N���m"s�7���bDG�r�~��~.B�x+���lX�ˍ�.���A��!c��!�z]
��k<��H�;��!�g(�\�
�-i�8Hǚ3a֝;��ڇ�Sx����K���3a�#^��=.c�
vҁ9��l��n��p�
]rj�^�:q���jd��hD����a���I�K���ß�����O���+���q0�=�V
<�m!ڍ{�} �Jfk�(s^�(��B���g�V���ӜT�I���8+�q4^�r9V�~)���B���|T�_}0��~5���MB�	���3�%�BS$�a`�
+�il�8����;2- ̶Ľ�����8��r՗ro��و�
Q��?�z<�cs�˷�H��y��	*�
�λ+�ί=�5���Ghb\!�cfH
1Hu���jc'��BbU

�����`�9���K���
|��^����=(�5�/�X�O9qˤ4t�(�zX�h3�K��K��N���s��-l�Ϲ�j��9B
��XͼD���B��
��e�F.cA�&�+���8��z���`x���(� �Ֆ`AmcpS�fr]I�|U
l9$��3��d����g8��$n��<�z�ʷ&�<����c��4�A�4q��J�G���Ѣ�wHQ$r YɁ��`4vּ��;r���B3���
�,�m�����xB�鲒�ɀ<r_�,�h[�D���� ���s�*y��ڴ� ujm���J.L�$����[Լ�g�<�/��

y%��5/kN�z�1o
�Q�<ԙ��Jsp�� ~J�fT�񂊲�W��=�q�\N�]]v�c�X�J=5�|_U�:��l1�ׄ��{ќ��4m����
M�{�JxQ$<�`�K�8l��u JL�Ok�C�1�Wa�k6��k�x���!��Y����C��I}�N�:^��⨕�]J��<���| [...]
+^S3R2Y	db`����<)2��k��jcp�~#��߇��7����]N�֢	�]_B?TUo�-�8�(x.�r��"'�'GZ�-�EY
�@܉��C4�h��.��35]��.��"K�l�
�:�|�2
��\�0�7��=��F;��:��m���
+ڮ�ȃZu����(�9O��!͗�d�)2�eA��:r��
��.R��S4��>�5Y�M�AJ�"KA�	��5��
��*#p��L6�#-�pͶ��z7Ӧ� ���JWn]R
c��&����S٥�"��;�H��+,%p
jH��VJ�b e)�Q��a^b�(,D� y)��|�Z
)q�n��3כ
�X�)��a	z�mV�����o��R�G,K���)k��ȫ�vٕɎ��|��3�LV&�V�%��XU?���@�Uw��(1ſ!1Ő�(Z��e �W0Wi �
�x��6}=�A{�a��.'���M�6�eKȞ�&�!�>�6�!�$�.ݙ[+tO���fU��U�FW�#���ȑ�W���y���{R��"������wy �� p��ьÝ ����s�8��>�Z�ﵡ�7�"��f��i-hg
MoK�KiIuHl��7I�z�7�Q�����Ci
+n�

+�
\�+�k�{'�B >� �
��p��6�?�7���{qe�v��C�d]@?�ߓv>� ��e�Лb��w��8Gv廝��xw�{S;�|)
W���[�E?r�/~�V迒g9�j fjk`�����s����@=a�SN
3�w1_�3�"ܑН���]�QM^i
����@A����H ,!!		�	 a�Ȣ���
���Ѷ�N����jkkGfܵ"�hE
.���q����j�����3��/s������{�{�����sfW/�=�4�rl�4��:���&e����U�ԉU'b����r(�P�V_���}�P#>�N����W���8�,���9�u�
��>��K��~i]�ԅ�܋/����a坟Ýy�D�U�D�^�R�j�<�h��h�.�����2��A��>���
��NOD���{Z�\����
�����oO#��"�V7�Њw���X�N)iQ���OͿjr˹j�ʺZ��\�25/�$7��'6}&�o� �7}״G�m:
�i��=i�c���� l���:�;�wP^�����Ս��
Ϳ㌊�|Q�MD���
[�}���f�pN��ۊ<�zǷ�1tmk|cm_�bl��Զݜ��Ǹ����v�������
?�6�OvwP�;�����;��y��e���
*�pA�
Ld��R�ԩ�3vΰO�Ju���v�u�O��*v�t/v��^��^�ٳ�K޳�[�s�.�=͐�^cHz���a��k�=U�
�>���Ghùw�K[�w�@9�(�+J�c�Ծ "�_L��+)qZ;�@U=h��̦E�;ȇ�
#�J�$���p
��K���i��
+נ�Z���V7�n7�ˁ����p;���8��]~QB����i�8�
c>H7�'��""zBJ*'T����"}k��C�]dR�!�E�BXd/��4��8p�ܑ�~p֑
͎,x��
�x�5�q�u�oC(�'u"4c������
)��d  $L�������.9
t�?$�\0Q� �‚�̷�C��|n�	��
��
Pݠ�}�f�>������g�#�Ѕ�f !8w
+
+W�(� |�!����g�� 5�q���
̤+�$�a.9�N�	��)��B�r�=�H$$(�H��-�@����TP�i��w�g��p�Zw�l���!�_t��1 �����b
�v{���
c��b���h01�d��U!$Ą��	��Va�8*Ĥ�@=�	�>re�(>� �/�}K��

�����_����2AR�]�
`O��!�t��Z
+�WR`�H��R~��
�E$�b�P
+�ev0CK��q'��@�7���'���
�-
����r\�>&��@~
�a����
��أ�
�+� {X>�
��߀
8�r��ɀ7(q�VH�
 �pIj*$&���9f̙���!v�h���7��z+�bMD�b�G
d��*�FU'9oT��ת+��-Π��ӧ��<�����S���@������?��IH䓐��0�)����IO��0�M���_�=�_�3�[�|
��5��略�3���
�
�h���5gx/4�x�57x�k��}����10�=�c ���֟�.)~�
H���En�Z{�4:�M�L5y�$�҇�V��'�c�0l�{���nj
���]�^�A�n}��SwQ�DMЮ$�M�|�
���[:��A�8n����@��,Ҙ���HB>�#/�~|��qĒ�2�U��<}���̷;u
�3�+��ޣ���&��O�p/�Bh3���Px��t�p_t=ᙨ��*�р�K_�걺I��&�� ����(�NBQ(e�(�:\�� Ź77ǽ#g
�={	�U
[�Z�m��7S��H�!�zʿE-�����!�ƚ�+����ƛ��
�9��j�i�&"N} }	��{o�7s�Y��
���Rʳ�j����)�s�\�ΞM�o�BVkN�ŲZД���!c��R�֐��
a̻��̇$V�q�SmD����cY�i@~�<��4��V��J' �s<�0,b�K��%!dW����"����f��Ź��b��R~]�ʀs�>
���*���S��INf패��';�Q��̨�<�Ѡ<�qOy0�j�jo&��`��@9�=	����y�>�s,�A�e
Խ"�x�BB�Z�uh)M�ְ�B�XRȶ�[ȯ)\.<9���q]�QM�i��$�((H�*��"��@V,���f�5@	!�LK��@�����(������h5x�9���2��
�
��NGǶs���ȇ߹�~z�}�� [...]
�(� �r���9�#�'v�<�lY
es�$�a�����L�	N��X��k�]�;�]ЛYܕ�ڑ����ХM���ɍi�)�
J�r=
!է#��w"6C�l��R��7%xxQ���
+<<�r��U
���`�E)�z���Li��
�,�a>�c�����)��̓��*�u9�6������Ϝ �e^�*3W���uZM�?��Y�P��2��r}��m���ob
�Zfk�V�Pa�~�RM��|%Qz|Ǹ$~��(ŵO���%�
n���
+%ZnU��SOP�����j�8��=G�`ߡ��_ҥ��h�ܟ)�<���f�A�%���z�)�U��#�%ܫ��e�f���eE䶉���ò3���.��
��Ҽ�MB��Z P�+���ڰ�¦9��$�P%�+�2�-���%���&��Dq�� ��l��Z��`ߗ��+�	k��s�9l��3��k2�"Z�*?�﯊���"yo��u at +a{6�
}jKK��K���bA*h��u�E�!j	����iTo5���
����&�#YP�>�e�~L`C�&���ZSXQ��r�5\k���޸qM���>ʮ���SkM�
me�����CJ)׻���_V&	*W�"5QX�N��<�
�@��>B��s�oh\!B-"y3$���0�T`��½z��5�:<̶�ɖø��P��F�m[É�ZU�G�J�>EM��ʪ|o���HY�8�T*�Wy�-$����W6Ec�-�s�
F����F�*��"o�d�� �R�J,48X��`��f:�`�� ��-ؼ��b��t [...]
+BV�����&�*�)L�U*Cq��P|Ce���¬Aȿ!m�p �� ���Lp�~W��y�
�z{���ô
1���){��˻O9�w&�)�H�WԖu���㕧��4K3��!i��0��3"Y3JJTϑ��+�
r|�������ȭ^������:�Ou W��)��
���{�h
s�hF}p���|�f+<�X�?����p��e
`��
���{���~����䎆���v™���+�m�3bl뿈�-��b��}F��qջ,v \D�G� ����<e
��ݠ���VL��MR��1��N;�';g��\�G�R�
�*�J
��=;��շ���
�
zl�Nh��������
Ӌ�����
>i����� ��Z@՜#H��1�� �\�%w�c���홗��.�:3.f�$�p����㦥�NN�z
�j���
���5y˟>��?}�?��O�q$�6�nfDgpG
p
=�I=��@+��B;��D7�x�xK>ؼ�0��4+��6�g�������|�`��r��Ł��fڵ�C�k3��eO��=IW_zFο���C�#f�w�
��v��~��Q��i���r�
+o�s�+� k� ���c��L�V�-������&۞�˲?f`;Dx;�
e���jg�A�'�з�h�v	7|�f��k�g/]	���z
ٿկ{x�`���) �,@�
��[ �ߙ@�C
8��
����`���6���4���f1ƳG��m4c�5�ȵ�4��W+���jv���8�N�
Z]����� �����_;<Bvm5ߍ� ��=� Z4�����h�=��/p�f'�Zñ�N��G��1�gD,�Y���I�����f��l���|ˠ�r���Z���6k�?���:�j�J8��I��%��@Xe
		�A�
+Avd����q�ڣc��R��BQ,r� �V+�]Zƥ֭�+���&�g.g�A8��;�~������p+Y�'�,Y�U�GG���;��}�-m�h��Cc3X
��$�r�+ϓ~
�� ��CA��!��^	`Z�
�;e0���RuM��]Z��;�.�N�{��`x��֓�������l1����V3]ޞf:�me:�{�t��c:�����?p`#����q`�= m@`�

������@1(��Ȇ��dXM�?Sn�i�#q4�Tڤ?����̣�~\C����~ǰ�C
Kld���x:N�q�M� ���} �0�)�� 
��dh�:���=`*�
�)[
�BYbe���(��̰���B��f�i&x�h".�S� ���ߢ��M�>{
�z��
�
�LpA8"�4`��`��`�"��p��P,
�RFC`
+��l�¥�zb'���&j�A�'�^R
+��4Tx�P�������Q
�H�G�</c�h��m6F��&�Vj��r�
+��l�&���
��e�
+��#n�

#D����
+e��S��NC��CC�@:*"�=S���,��k�P��%;LQR�B��lt�$j������s
_%nsF�
��
ΐ��ـ�޻�9��sG^�x<���RH�?1YL�)ބ������/A}u����W���W�赍��El��k��
�UGɷԛ��Θ�]2�����k�/�6�9h���72��!�K����XߙB51UHC�'�O���c�qJ:���2ST�e�o��G���?}��?(�s���!E
oPq�7�h�W4����^�#^��5�π�
Z>W��So<U�u��x��O�P�@aY���%3�����H}�$31p����Ŭ��fS6p�O����/��/���X�QU�U��]�S�N�9�+U
���!�ÿ��X�oզB�~h����w���S8e�oK��F�u���hrQ

��0=�9��2~���	Z��Ҭ�vN+�
�a�|j1���2�u���a���:�v�YA�������]�+����v�գ�8�� tl�8ַ$}"֎�x
+�l���g齍�bvE��
�f?����$t5�=�+~[�V�?>�-�Tj}'��润�����
M��u�y�V�M���g���
/hF��5��D�Ӡ�DdEa0��$ L!g�*�S�i=�j���0���D�G3t��9�G.�ߌ���z�F������Zd-t��m��%m�Ӆ�Z��!?9�
��rN�����Gؠ
q;�EQ=QG�N�Z
�(��M4L�f���Ι��I��Jz{z����X�[3�ح	ټkqyV�cW�\�Yg�
��CS�ǟ"�8��(s9
~P�~��Tx��>좸6��xx����!IM8JE���o`iǒ7g�`Y��ûl;x��
+��ʩ�g��[at5#�}!Ugє�Pp6i����
����6������-
�)�>$����VG7yTE_�UF?�U����cP�=�L�xI�	��ds�0<��Z@{�-�ΑR�.�¸�
j���8�]�ECF��.-��D�
+ǣ�_:N� �N�&�!�Ƚ2~��"�RV
w�s܏^��Z�qO�%�����(ߓ��o�k"�!�dc@�1��3��E��4�w��кXD]��c�[lظ �]��lq|�,�ú��ՙ��3
+\+�ֹ�������M.�}7�מ���EI�R�N��+��g��^��3?*�I�1ބ�S8Ä́!9&��1��<&�_b7�r��2W�i��1_ì͍d
�I�U��Tfg����T6k��^�QI�ɷ�<��^�3��{{j�϶�:�-�畅�w�_�u+7���nJG��騘��=�C�<�����R}���ZVr�y��^)��.�jpdI�*/�W�y�`���v��s���-q-�[ �5g�d��B�V�.��Y��MY��2O(�g6���yK�.��om��Z
�>a"��^.�#�N�z�K�\��
g�8@����U+���b�e��V%y:��E�
w��n_�B�u���.Ϩ��<���PD� �H)#LQA�,�"��t��ІFpF�  �RD�� *�1X�Qp]��f�%'n�f��=G�}���s�����=�W�R���*�x��-^��nAIܐ�84�wQ�SQQ�;aQP�_B6���1x��C��T��T0^����,p�̕�_��-]��Q�ךnܔm^��`U��fW���H+v)O��m���R�����I����ޒ�)�ܤ�޹�oE��D��B�LH$
oA���26.�98�]���pf�n�t�.��*[;��h�Q]�&��8+e�6��lDz�BY��[�Q�+Ho�u�S�E��g|2R����>��H{-�H#B��K�&�E20�\�ߖ�p���Q�

)�qX��t)�*�+�4��W�֕�V�"�ҭ
�&ۖ�g:J��
$�\I�N^vN�WFv� -�h[�i���	��Q^�R���"�<Ln��y��3��:�dp�R
��讶gګ<9�;�ΩW�ҩ.1P�7���b,e%�6E��yR�sN��-�P�VP�_��wH� �\����D�M/!B��KH,�S�C!pY�W#4{
ԲѻK
u�L�.wvC��zMu���2X_��`,۱٢�"�Z�=�>K��0�T꺭�bQ���#����U�+�������,��
-})�.�$�)"
+&��{��d1pq�5����k7�٨��&+46r�5
�j����:�^q�:���(���X�̝)���,�dE�K�9wkE5/���s��nA���p���h��}�OQ�QQF�_�,���Õ2ڃJ�����w��f�m4����Յ�l�ț�5�{V��5�d7D����b�R�d��+�>�6�)���uSu墈�&ކ�.�u�C���q~h���Н��)�
+S��x��gz�7�.^�܃Z����Zi��>5��Pt:2e
^
i�RuI�*����K�n��m�7�rKs���=���M2�
�J���nHC�{p� O�p�C�p�C���
��
�:���=zW?��
+���-4��
]@e�*�{磤ϖ)�sg��.V��Y97�[��pp��֮(���f��)�����:�v!�;
����ikw���۪����n��{�����B����.^R�
��=��l�RMPz��A]H-�u̕I
r��bVύ>�u4Bc��uG�LB�d�
.X��P��W�v�
�ﰢ��qy�7N�}7
�{�;���s��&
�����9:�t����}��C@� �H�ĶQc$�:2������%���@��`�u#�BF6����_s*�p�p�q�p���5~'[-��<l�{�
底V�����"6>Lj�L.�
����7
�h�2h�����1=D�[!b܍Y?.b��/���Q����
��
ߪ�r<E�,g޲�}߱*������>#��ic�ؤ���#��7&�s���,1��7��]Կ��+�_6d��ǁ��
�\�D�U#���c�$�&3�+Y+&�l�������U}'�|�2爦�4SJM��&-��
m��)
��:�S��]{ [...]
+d�.�W��)6n�c�mm,�m
+��
���<x���� F0
���Y�wbX�;)l����\��n���NՅ��T��_����x��j���
~�4g&}�t����˨?���-�_��
+����gZ��Z�|h�C+�?r��'�
����J8?3NO�3�O��g�,�g���r���F���l����LP
�͞�d�={?�6��u����@��G�S��&��=`��\^���Ws8�j��\`��֯���?,^��ٛP���b��&2�r������M�އ
ּ#,�߯P�S��b� PN�P�}$�}�-�o����
8��>i���b1�91�	��q��B��G|�KV@���E�1��aɂ:�3j��Q!9N�����,vP>�'S�ߨ�־���� X�������ԤN]�O}&�gI}���D]\��wa�% 	��R�)i�~ =>BO�͂8�2�ٙ!.g.C
�X�~�خe�6�J��l��Q�*���\�iTS��@H.!�y`b�
�Fd�A at A�
4
aJ�"cD'(��
+�(�
P���ϱ���+������ �߱�}`������:{�u������I
,c��`�#ց]�����{I�|O�d�E��?Xc�����{�<
+8b¯�3�
7*��5��3�5�.ClU4�-��B
8۰::p�a��Qpڱ�X'v�1��e|�
2F9�#��a[ �lA{�̷S ɥ�,�s��0\;��
+"_
�h�@�	|9
f�рW��2:p�b5
��a|��'&�G�q�	b�{��̽D|�^'F��a� �7B��Mh���X�� t'�=��o�) ��<<�yb*���œ 
p�h¬$8*��
���u���&�#���@��
��~'8�="he
N2�
�7�n��{��s�sr��79�zJ´'$�c}$�M���6��3
+��oq���y�-��
���p�1q�ևo�����3�go�7j�q��|�\�|�T��©Ig��΀S��9�3���~�
V��3�^�i����;���N0��	
~���.�܍,��+���w�{>u��[c�}��[��k��
��������k���*t�Ϋf=�b��t���S|l�ù����dߟ{��#�׻-
�~C<fx]
F�b0�Y
&]S���c:����O�
8�2�x!��o���#��%0�<ӵ{=�t
��f�_�a�on��=n����ֿ��4����.��]:
��\7�ٵר����%�O�
�`v���ag�������z�9
�CC˅���y��K}4z��~��a��%3��*uo���׽K�m4��4��èӳ������
��<N������ǯ�<��
�l����1�u
+�½�X��.�P\G��H
41=w���N���vcY$�
Ϻ�D�����_mر���_������|k�O�6X��
�l�i�:�s����u�O��!�N�/p���m>��;��P
�,�I�F/�
P��ݓ�-�
�;j1�3"���:��wjY����<㶠U�Ǘ�3k]Ra�Xmu8���`�~��V���g����
��	xk�;`bƮ@��j���ƹ7���GhP�������XCt3���b�R/I��F?���m���o
���)M��̚C�-��o�ڷ��fop�m}P�]]��;�Nrk�~�����-��*x��5x[�w�@�;���M�4V�;A
ݓ�Lu%١
I���2Z{| �*
�=
�~st�Q�t���
���U]x��ΰ�mw�U�o
�ͭ
+i�m	i�o��)���C
�C?��€�1
fNKh�(h?/�2*�I��[�tԝ�F6�\DiKu�lI�#�e�Y���=��FuR�im��bGt�U�d5g�
v��*gTD���#�"�	�G�'�F�"K#��k"?J������A0M�@�i
B�Sp�Uh��t�����dX��L�Ғ>_�Y��ؗ�ڝ
�W�(5ܞ�dZ�nQ�cU!-�[j�!���.z��5�{
�%-d��p��_�jI��:��P
�w1 ���d_���h�
��wW�еL*���D�:臕f��J>�Y)�h��ץ��(��Sc
+�e&Ir�2��j}��S_l_W�-�����
T�C�|�)�<i�(W�D�;�
dn
��P��=�wp3��+)�#��N��X�1:�ǣ4���؝�Nߡ�gVe��7��0(Wę������fZ'�q����Չ��[�y�:AvB�P�pR���%�Lx$ʔ
;fʾ3e at b�� 
�gx��q�R"tg�3�V at G�U���;{T�r���iU��17eO+SFN_�%5.�H4+JO�T���(�v���������Z2#e�cZr�H��9K���,y�[�<eB(OR��ɾD!�D��sgW�|*�7�
Uk���h�*[�s��Z�v�mR�ho,X��6/\�8'ƨ0;�L��[�e)m�3UvYk��|Ez� 5��19�(Qqy�,��F��6.LLaR���û�W2�CBW��
�߮8{
\MA
�l���m+R7ϧ�-"��V�C��*�Q~A�iN^��27�:#'�V�]�M]Y>3I�]���'��:&�ͺ(�f��^�zL�d�/�.<�s���?��=
�|����
Ƹ��Ľ�3bf0F�Q�PI��.���
])��)��B[(%]�ە��n�v��Dm��v
�T[�UJ���:�꼴����5��|����{�y� �L�2��,�9��l#(�J�@��r�=��,�u�!�SM�ӣ�W��/I[`������I�
R�
bW�8�[�]9'y���j��s�ɭ�IO\g&
�D'g���|�����
�I������PQ��
��<'*;o$�.g�n�� A҆0�e��f�YsD���Y�g.��e����n
7'];<zm�"*�L5=��9"�Kx�5��5��[�T��L%ʡ:�3a9�E<'q��9��&���5x�>�XBV��J/��)�y+��n�d��)��˼h������Yh=w�2٬
)vQ�,y�v��i�%�)Y��aY���YW�C���o�a�d�b���τd����`����Π�� 6��Af�Ҋ�`u�
��؋M,��h����S�b�E	�n���U/�*H��,X%��%�.ls>���ab�Aǐ�SN�����7=p
��w
+�%�!9�kųx��)-v����bE8{�
��`u��,���=
+*�̃�/��Ŗ�Ŕ�	f�L7��=[�+�"|W�h�W+�Bw�K'�������
,:�������}�mD
��s���s���^R�
�(��shR��X\)���wPC�T�ffU�*'�E
L;mV1�$�b�ل��-�����m�W�C�_^!
S~\�[~	uI}�����������q-v�
P��߻`G)@N9@ΡK� �հSk
+�km �N3�<��:fjm0orm������ڹ��5�5K��֤��Uk�|��YxW�����W�E���NѨ���Q�?�<D��:�{P��_��_a~�~��C8�
���8��,~� �֋ �^�
n0���
+n��7Ld��c�u�bu}��
������F#�����5v��`��o7֜~a�v��	"Df�
/ 8���`~v��kO�Xt`n=�:σ�F�h
�
��;�i���@ʻ)��j��=��0
M���e��y���y��Ks��������;tGO��LO����t��#�'G0�o�|m@
+�=�@
fG|r��G<��a�5Spo����ܮk@}�\[��u��"A�C9�XD9�XE9����E���C��/gPm{�1m����i%�P�_��9��z
 �`�w���!? ����:.���]�ۅ��K��_`��
+�
����d�@��p�t���`u/��r)Qw	ey�����2�;e���2���N����4�_r`�y̿|��`�
 � ��4�
��	X��`X�
�z��E�
�?� �g�`�l<�<���Bb�b�L�W�@�W�}u�݈~�����c~�q���6D���
`t��6����������Lދ��
?p`�A��@�x�

�@���!Y��N��d���209��a�ӱ��V �[ j�v�lI7�� �� ƄC�1�<�3�<1��
qH�ܑ
+B_
��
|ozr�3�^A��k���DC+_��C(b9�&�41[Ba
+�B�h;ڍ��JT��F�ѷ�t�� ����~� �gF�Wf���
���4��^���M�x��p�X��D��&�d��rQ!ډ��~tբ�G�9惨��2��{�+�S��x�~*&L����zĄ7q�(��9w���.q
E� �&�&v�hbO�r���mf>Jw0�%��w�rf at Rɼ�
e�%ǘג3L���y)��<�v2O������C�ݗ��?�ET6@\$��+^�Z�FR�ُ"ʉ4q�A����Df@��y�e2��\��+d^r��
��}��g�rG�^����N�����G����v�{��[�v9��MN���	��_W�ֈ�(Y��k�t@�#q?4�w�it��
���B�jӫLc�(��#e>�P���@��w_��wOq�ץ��u*N�:���ڕ�yw��[�
�6�~���_U�%1��/�;�{�x��b �؅�>�����K=�
�������c���.�Ul�&�׮����V�sǭX�[��-u��Mu�^����u�Y~��%�U����4��� [...]
+`�T�Ri����y�Fx�s�.�q|��
r��۵����y����yo��띭}�w8�>�9�|nr�ol������ʖҵ-ˤe�=�UΧ䋜o)�
�����`������"�&�#��3��<#���“���QZ2��\���b$���D������+	m�k	ݾK�v��x�r�~�Kq���f(���/�]���p6��Q���4���3�`	(;�
e� ��
/r��
*<�EŸy�û�q�[�L�jfa9���
+W�})����j&-�Z��)=�����g�GN%

<�4I�K:
4�t!x&i5�X�Ð�䧡G��H��\ȑ5)X�KX�7`\w�r���>x�>	���]��.����K�<�
��^�9e>gx:��,����f�ٌ���
�M�`����tW�D�L�+�
�p��`����_����+����ǐ�5����|
���U���"wxP�
w�`EĄ+�͸EQ"�\!��dA�ל��8#P���
��܆���V�
k��=!㼽a�y�4g�T�h֩ȑ��tG�]��� �;z6�&��
+,
}�sQ�D���%��I���V%~pYJ��F�ii
~N�u?V,��'����Z������Bs�S`	�9�����}yt{�\T_�b��޼�1z��Dw�5Q]���_Z��|#x�~s�Kn)�$�U9	�48U��*��婄��\�C�"⁒R��X�?"����ZB�
����=��zO�ᨮ�Fg�yfG�*˒�V{�3f{�O��BlM�z�
4�e��ε�F�O��
�>pZ
�`J��U�D/�y:�Ľr	y��̿_�
�#�
���C{�-4k�-�C<L��ƣ�D���YV���,��m���e*Ƙc���A
�@p�/U�ޫ8[�	�Z*L����nƍW&�*2<
j�πJL�+�Sz��rCpgiC�����&�l�D�����IV��4�N�c��S+}���U+Ř�`������*ʿ�G�� p�� �� p0n�
nL��mX��a��z�4E��
+�S�
+��tA�*chsY3ͤ�lPأ��1F��(� ?��_���ߏ�ɿ��R���R`,���?�>F����(��^Խfjpp���Q0f|
7\���^��a3d{wU���ҕ��i�M
դ�	��0ь�]���}Q���N�bW���T�.ŪU����V�^�+�1�\��"��h
������:��еg=Փ�����p���>��j���
+�-�b�� �oЫ��*CH����׵Gh��(M����<�Rifc����
+�;��JͿ�J
�ZS���/}���t�ZE3��rϠ�7���.��g&��)
��7����x�9��n�z67�M�E�:�������
+��ԅijZ#ʫ��e�!�B�U�����c%���g��{��
+cɪ0�zO� �2���F�Z �� ������`�mg��}��-��Ԛ��В�cl. �$��,�Ҥ
V7ֆ�54��뭑���hI�f��[d\�)2�D>A�c�j1������:�� �Q� Lt ���wxBOg tZ�f݈k���Vߙ�^�������b��]�j�P��!�SXIsG���N/l���7O3��y��|�-0?a	L�YB�6b��>@�p��-3�(��.�����
7��R��F�����vs�նD��7ó������2?YWy�Īw6�vXhŽ������]��ٖ�
�e�ɳ<fd���nâ_�'t
��
Σ�ϡ��6 g�]H�
�<@��A�
m����8�`�[�`��r �K�_�#闐��2J�
m���.�������Ƴ�DdڎFrm���o#���=_�ӻ��wa�r��Z��V4��h� à �!�ƽ�{���n,4N&�;7��mx�3�P2��!x��}��r߼�_�H���f*��
��p��
�’�O�����h���h�?�'�c��6:�
h��P�� ���Q��� �q��CP
�@�H��~Ů7pE��r]�AQ�g
��� [...]
+m1�hfZ<�f	�4K8�j�eɖ)B�e�8�2WkI�N*Zd]�\Y�N^�EZ��zB�A���jr�.x���}�5A��~�J�(?w�j�6� �󁥅�ԋ�)RJ%�\�Ab�+ʽW
�X����,ښ���YB�u�(̺@
b]&	���Z7��w��[�l�[��~�s6~e��q�C�q%\�{�WGh��(?#��ƾ������#���@j%W��+^�CX�h���`Bm�k��M@`�4��a�u�_�"�[����S��~�hl�>ј�J�g��g]�ȳfP�Q�%���L���^`�}�a`a��Q ��PD�
0�÷Q	�)
��Fal�7��Ls:����q&�3s�ޜ��0�e
\[���%��%���I8��ù�	s>��p�ٴ���i���
+�]ʞQK�
@�	�?���I�oU���W�p����㠻6�DC{=�7f��f:47�Bs��P��	u�~�ڪ`�v��?��� lo>m�nV� ����G�A�	'��&���:�n��1�ߒBӡ��C
U�
��(�|�����
YO"$=3!�Q�2��
@�ׄBz��=H����f���X�
0��I��
F��)��_��u at wP�lP
( PC2��h��M��?	��tB�"��� 
�A
+������kS�R�s�Ӛ�Es�@�a�=�2`�8����Ȩl�3�q}��JC
��Hb >$�L$)�^��>�8������qZt^�w
K��-��u����D��'3��Ÿ2�q����'��v�A���Bp�aRN�H^ɛ�B~
C�
���X��H��P��C���n��n��DO���Z��u	T�
�5�2�^H����F���"�$��W�셺�=W�3u
�����G�n<P��W�Y�
g����k����J�H�܉�����g�sw��q�2����m`/t_�g��lH���j�؀6��k��m1{��`�5���F���
+��u�u��݁��\���?m�p/�#��8�{Q
ciMƘ�&3Փ
>j6{�ΆF.f�#W�'���~#{�����;��
֫�e=�֥?�:��C��ןd�����Nvå_��
VW.�D.�r�a����h+i���	���8������Jc�=�a}

X�a�2�b
���ak7lcwݿfwܳ�m�<v���nJ�5C�p���j�(���Z<��N{r�)O.i������Q��
�IC�فмy�ɄG�Q�����9�o:k�Y�n�,g׌k�e�B��K�q�p޸[�Oc�謱@�l<,:m�5�č�f�I���߇�:�W�_ns�g�|���D�AJ�Px8�ሡ���
1�#8mAq�
����wع�B�i�pƴR�dZ+j
�L|2`��D�N��{$
{��E�ڀRiM�1��FY�����jz�(3qe�ώ
Ãm)_
+
%�#m����E9�=�
�#��BdZ"��S�ى��BC�BQ}��ĵa�T���

�(�.t��ې]6�!Y�|yy�!EiH��$�AY
rIy0�۶(�0�NPW�{����
�I�'��Ij\�脳1�h�
���	�66M8���I�+'.��G�^V�'������M�C�mʃ�
[�9WUh.RD����k���-v{�?j������7$�
<�Q>ЗH=_2p5Y��Ir4'jqb�j�Q�<�UL�*�%�'�'9��@f��Ȧ0n�� n�2?�ۼ�/T{cv���dj�b��3c��{b��1�t������aG,w��l���x0� �O�~�
�g�4�J�C�
�SG����(�
��&	�ii��)s��S߷�;e�<'y�2k�JUf�Z����Cu�5}�q��K�o�\��
��Z������H!� @‘�+�����9��T]ī��u�{�����t��
����m׵���ٱ�?>3o��7��>���x�D�xG��#���G��퍼��y��
�1�3�K~{Է�o�f��Æ�_���$��T����T.n���T�wR7�\�v�4�3�g7���p$I�4���2��w�7y
�Y<���=�
���Aߎ��~m1��[b~(h��-h��Hh��\���`����%l�i<��?"ﻝA��tW�ΰ)�8��3�A�q�^�a��QY��pZ�Ӏ4ۥW�s�N)��L��jK��$��4%��Y���g [...]
+�K�<׭E��hJ3y5�YxS}k�]|�tDP%�VH�Ef�u�I�c�Q��ؘ�o�1�}�������c%���殺��9��Us0��c��lƐfӧ�ve�ٷ���͙.�J�[}F�G]z��%��W����Pt���!A�|BT*�˗$�� ��S�^�X�`E�а��t��P�7)�r>0O����c�
�m at o�6�S�m�9`ߨIv��V8ת�\����+U�r��g̬�-�l�/V�ʣ�B�Y�N�����xB�K��dń���3��_�
ܣگ逋���"`�~Ǹ�
CB��GGAӢ�ñ�G���%8XrӜ+����
wcN�g���3d��e7�
�}�|�aQ���$G}%@�~H���J�Q�bB���'R����y�"e���s�8B�a�+z�|tٰ֠�i����E�U�9�H��.%:��!_�Y�W�˫���m�ks{�H�=%Qi/dj� �)�Բb��-�����in �({�H�WF�G��'������5ԗ25e;8��a\sI�}iq� [...]
+���~VA� �`T��;!V�.J亻r�'�?$
+
K߱������!��u=�"�!�<J
й�d�&�7����|#*ʷ1��Pn�9�^oJt,0ɜ�*WmY�Gv��+���S�
�K/i���O���
���������ER=��K>�{�Ks�H�_[p��"�$�bP[�*���(�	b
�ݜB�~���xmu�Sv��%�2�MYY�^a�������S̃�$�0��(��8��q��KQ��[Q��&���'�]��%3����Z�Z:W
tCY�?�֠Ⱥ��Ywr��pnvC�}V}���^�8�v�
�w�֕z&�V�k�}�j��15�,�(�-a��W¨�/�U�	V]������u���T��z�>+�C4��-�(l�A~�*h�7#�};�j�d�Eqm��im2Gi��9�%�5���
�\�y���
��볿�_x�,?��:_�/�a���a
��ճ���`��>G�Sʹ
-�]��=m�]]@^7�^/d���ٿ
��A���0�����Xnb��>�/�!�W��[��cv
�����幷������%ޮ��B:��B:������㦉f�z~���t�.tV�.���=�Q7���!
[���@$�oG�x(3
͉
O�F���"Ʋ����
���9�
�u�5��ct�m��i�m#�
�#?r>����o<�Y��,�
�Q���}�h�
Pv	e��c@¤b��=%F��:�ފ��]�	gBgb�=3)���
�Ι
����m�U�?�nqxkz�q��	�7�/��ޜ��S��'X��c��@
+v��
��>ʵ���	 sH:D�&�u��9_�[��s�c>oχ`�|�mq��2o�T���h3q6٬܍�~��I����v�l����?ᮝ��n�9�~��W���c�����2	N �g��9� �ឋ@�e.�,x p���
��iq6.a��]x�j�_�Ǻ%�,e��%V/Y�UK��ʥ#L��yFr�6#Y���,��/<爯��1E�#T{'���t�����rcIIC�m׀�7�5�9`�
w����
+�ﮃ�����^��ł_��9�}P�V�

���)x=�χ���_�u����1>F�H}o��M����+@����
lzx�> ���չ�����l�e�
D��((`�W%���	1`A,H��@Dņ�(�<	��C�-�O1D!�ODQDĂ����g�0���;�=�;{���9���F
�9���P�Y��0�s C �Y�ҿ#�DH�N��b:D� �X
+AC��Fr�<�(g3�J��,Z��=�X�=�OZ��8����
`]
h��%�+"�6�!�j��&;��@�:5�ͣ�1� n�@h�m���
+}k7��j����GK(��]�4��8Zw }��0�`W�. ��e@~5��Gn���+��j�M
��	���:���k�Rs��G��?�:���=�@ON}�Do��G� �=�b{���� }
��`��]$7��b���u)��b�ѽ5t?+����� ��f�
5���(F? ���C��?b�>`�h�Uŗ`R�wŮ`0��o�4�H�%$��"�H>)�k�
��x�Cx�jt���h���(m����0k0���Q�����L��ɼ�L�Dc����O�WI%K�r��W��߀�|��Ex���N�
���������y��n���@߅�B�V���
��5��ջ<��RM�)O��H�D�ɿ#3�Z>
]�x)[��,<����:t�6ᑬ
��t7�J+�&�B��
Z�7pC���]h2ehT�sE������9塡|(��T������7��T��j
+:U3�P���Ÿ��@��7�Q�M��Ven)w�r��{q]yM��WՌ�C�k�p^øZsƝ{��=fK�m�`����f��9/��c� <��B��w����m"nh��6
M�ehԮ��Z\�n�%�6\Ԗ�^�,���4j��p��W�Ew�
�����ϰ~f`}�`v�`�*�j�
�|���vC���u!�����^���+
��9��[�Z��貸����i�z�;���U۔q�m��ٜ�z_�۶�l_*m�`_&�ۇ	+>��)���Q�Dy
P��+K����z?'\��z�?��#q�n����U���듸c��>�;����s�C�
��V�}��ҮB���ܾUXf�LX��D%L��3l �w���`
φ��1H�6G�[���g�\q��ǜ�q�y,w�y"��y_���s��W8-�q��;-�v\#,s��:�J�v�v:
;�9�:w�lqf���L����m|�N:�h{u�
�A��!�8�b��nq�m*���
+����[��u_���e�p�K��ؐ**2,m7�֛l1l5)0�.�7TJ6��
W��\:dk\^�V�2Y�g�`��(v���F�#9�
.�	%
�}#�c�w����JFs��c����S�[�ŋ6�-��X ��f��%Y�Z��=_�ڽX�����
U�9

��
���֥�
���t�'�+m�����Z#PM���88�>�(��c��E���V� ~�O8�qT� o�DѺ���k�6���+Y�"��ʐ-�ʑg{�fzmS,��m���ae��ye��
�/�/���L�:��}�
?>4sЬD}>͟��P�o����
;�`k�@�xry�����`A�1Z����ѓ�٣�L2�����e�i�t�,E���T�-��R�B���g��}[��~������=���h��(�1:��ӑ����� ���(����X2��

���d�
3lj2�|/N�&I
�I��?W��b�и�l�q�r�1_5׸S3�X��e<e���<���&����R}p���˴�S��h`o
�[t�ơ \���
X
a�d�{q�¿�

��F���/
+�$Y
'MN�'-P�	J7���Jܠ���<>�����j���f��<.�i�S��G�Cp"
+80(�ٯ��[�u^����ȉ�̘AȈ��Ң}��Q������XqR���9�Ӥ���'��S�
�E���
]��
��|j�
�)�ǻMk"�-&�1s��T�?p�jPEq����췍��Ҽ3N��Z,��ҿqBj�;�(v�<. at 0wl�pvL�8!f����)���xy\�
���ԨL��ȵ�"
��uyGEu�q�wgfd`����.誈�i*e�60�
U�RUZb�2�X�YK�(n�Q at M\)GO�-�h��k��n�Q���
�9��9��9s��{��}������b�<�31�=uO\u]�D��1�D�[~:s[<ס�='ˍ�y����
��kP�0e	�P�0I(��H��Ҝ�y2s��&3.N�
��#56Ci��uXS�h��vN�ޠ�G���Gp��>�36�o��_k�E
Q����Y�|��7��jd�Y�c
�?4�b���I�Q�4�I�\�t�l�-�4���
6)�1��D�")!�ΐ�c��/T��+�b�����۵
�\���z��/�N���Fŋ�~�>��\�3��T`'ٔ��uy�%&G,5�E^�rR�!+e��a򗤚����a6I�Ѷ�E	
+����$�}L�R�¤r'��V
aܦ	7�w	3
wY`�����%��Rf5�Q���|'��&`_��ԥ���<JҀ�t�f�9c(23=��9Y0e�J�2�J
�e��(۸�xyLZr��i������+
��u��bQ���ӆ�|�
N�Nl��
1�Ԅ�Duh�;��Zle�鵚����.f��I?�9YJ,6k��=��QX��%rf��ْ��itv�MTv�m�٨7����ʵ�*U/^��x����=�̣�9�ߐ{���_��: ]t~�Y����]��%�9@!��yF�
�%�H���w�
�#v��]�/�I#
+�da��6���KRAKr�������P5+w�����/���on���w�/�~9���;N1���\��,�k� +x\BҖI��U�+��ҡ�*�@d�d!��G�_ 	-�'
.��K�mJ�mg�d)�����W)�/��0�h�ʻ�09��.���^�\�T�fz�o�r
63��e��B�RL���/c߱��P"�R�U1�j$B�' ��[��)TIfW�KfV�H���2��L����i��)���&W�TzU
"g�^�?)�V���Z!�{-�����w}u��
<,�3�[_
D�=
+]c��'��Ŝ�a�U灙u��W���9��u��u:ɴ�ɔ�T��\����6�kkl=k����4�=j�"��
k�)<V�
+�U��x�A��J��
+�GRR�
НLwL
{����M��V{�ت����VOL�L�$��,��h	�[bO�"��b���IFYVIGZ,��&���̭���m�S����6n�����طӻ�mX��k���2��-�\��>;�I
2�ۭ���^�8cGbt�8��Nş��i
�kܭz
��a�5_b�[7
��W`=.�Z�
+���׆��]��4T[�]Mo�:����`+���@�.��
+L�
��p? ��f'
i�A̓0��
8�	׃S����

+�{�t�{Ȁ>-f�n)Eϖ:��4@�r��o�9t���
��X�r
0��y	��T�
��O�&`�R���3`�Q��19��*hZ]�nu�s�p2Nm����
U{0��C{2�O�Ay�
+v��P�7A��%����P��J^u��qW��}@w&cN��7s�G���80�
�u
+p>-�����*��ka{�l����(H/xAr��A$
�up�up�}�DwP��A;���6yD�t���3��=��S��-��i�w8��O.�ձ���]���#���Z�r_��`��HD��)PY
^�K�:_��K��F����n� ��)k��p��9�}�5���O
�=
�G��;�� �������pKŦ@
�؋��+p�
���By:��x�y<�K����I�d�;�B�$g��c�M|�
� ���W����
��"sO��^��-�/r����#�m�P�AaN
k���ɳ!��1�
�/Y$��^�������b�]LzWs7�� ����0"��D�KBI
I&Y����
Ux�5x��x�-���

�{�?|���3<E��<
�:q����>��DM?��} :[�K��WO2�
1�
�F.~EG+��#<C-]��c젫��O�j��ǘ�3�7�0uw������͑n�ѥ7硅��m
���!ʦ0/����3�n�4�Y��J�dL��ZG�f���vѵ��f�}7���"��
��ٹ�(.KD|��;����	���L�yTSgƟ{��$$7n�#V��j�FzX�l��$&� 	�@v������(n��R���(.�Եxlq���L;��T����tZ���y�O��w�{�?��=������#����r
+�O4~���%���<��J�LR���j|%��cI=
r
�ׂ�&|���\��
�]�8�p��%���'�.�W.+\���E��0TI��� C��Q�m at 0����x|ͧ�	��G|>�ɗ�K���
q�_���p�o�-~#n���
�T]��:�˪^�n�b���
��
+8K�!N��>�C�������<O}'��i�Ǡd�
��[�
��[�k���;���ϯ����E�f\�	��w���N�
rg��ũ!�p�/��3���94L`��
�"�"}*/�����@%�S
�������pk���6\�KÍ�8†�N�Q���p:�
+�jp2`9N�ű���	��
��

y��
y�9��t>`:G}�v���m��(/��cH?��5��'��Ip?P�;���2z4.����c��:	'�i8���ڍ���VW0��.�bf�z�W��t�[���=h/����
+���
��n{�h˸_E��	���zy����ɓ�Tb5���
�O��7�?�O����EOH�hq`�t�
�Dg���)`�Cʘ�!��]����Zv{�*vkp�hs�Ѧ�ŭ!��CΉׇ�7O�Z�4�gI�{��Y��*w�}?
�A�/�z�Pg&��2�S��:
�Qh
M��P3�}���:5��<���@S�n�T�6h�Z4u�u�q��UҠ�%Y���VkNq+5W��S�H�O�QZ*H�yY��ITꩤމ&�8��biޡ'�H�
��}�1
+�"'b{d86Gj�i`6D�3-vv]��m
/�
�%^
^%^�DR��[
��-
�&�
�+[v\^�'_�H� �{B�WG�7�&��3ҿ|�� �)�-F{� l��M��16ͱ�h�Ib�Ƥ2���l}�C�<�@�,�L\5G�$jW3�N�pZ��z�fyմ�yQG}*�.*�D=P̎�NQ-�x���yO
|JO�i�:D'�m���xZ�ѬS�Q7�u��O�g�
��x
�$>[T�u�j���Z��*���W+��F^���kS��
RΌ�U�i��gh�U�j�P��
��y�j9n��/L��]�n���s�!I���!X�2�)!�K	CmJ,S���,HNe�'e��%9ĕ��ىeܬ�Jiyb��L�R^�[�(��T�����Ļ���|~����$A�&�
\��9 �4{���I�F�� Ǫ�Xn
�Z㻨1�b�1��2�������h�![\npI��%\��BZ�_ +�/���7+�)ەN}��?����&���zAI(^s?�dN�~7�_m���S���J��< ��ñ �
T�MAeZ$Sa�2
s
+[�jfKS����\q����7�K]�*�Ӵ�'�Ԥ�1n���}�,�)�F?��?����2	J/�W��<�h��H�]���S۳��5i�禋P������1�3߃'#
e1LIF"[�nd
�3D��
�Ӓ/ɵ�Is,sevK�O��AaM��g�u��-�K�\'�Q�
�n��4A��۴���
����؁&�W��)��6
s��`V�ۘ��ҬPeE1�Y	��f`�l�Ö-��\�l[)g�ΑeZ��[�(Ҭ�xs�
U����d���d��ʔ�3��)�B�����u����̙K
P\K��|�gv��9~(u�D�c<
+r5p�F2y-�p��v�Y�尉�9y���bΒS!3�,���F{��`���ۏ�R엉�*��'^�-(_a�r�<?E�>袙�h!��kS.s(��N9�]Q��;y�I�q�#�
���Il��Ħ�3Ein�8�U(1�<R��Z��\��ܠHt�)uΣ|������Q����\A�����8��/��H4K�i�s�>}�
+$p�Gn�?��c�Uk���(�b,%	�����J,���v���-I..����	Eu������݊��#ʘ�O��ʘ����A��'�GHo���t�E�,���9g0����
���@X<�a�h`�D���2O
+��1�I
�H�q���K%q�\L�Ri���.�(�+��لaf���aQA��
׺<�T�5ڨE��A�	���EE�qA&.TD0j]S4�Vm�X�Zc4DM��'�>��3��}�9���ݓT�84ɬ�O�OZ�qI�P�/y��_,*��ʷ�8�
�o{P���z�N�����-gߑ���n���������1�>
c��	�ӧ#�%	i�J��-����,�K�RĦ�w�I�p�^��4;D������!:�g����k�{�R��e܋$�$ӻ0��
+Lg�6)C���8cl�7FgaTV?��
���x
�
�������B\�,Il�|�ଥҨ�ղ�Ye�Y�������&rM��"<�'"*�W�B
[��+X�IYIoR��٢M^��s=�����\w���D\�
C��5�`�0D�"�8�3�ƹB�q�fL��7�J��HC�vKC�viH�#iȆe!���Ԧ�.e�.��I
+�^�	̦{��~F`8[֘B99c@�"�u�(AxI$
%��_2
�J�F_�T��f!ش zS��۴N�e*Kv
+��PrQ�?
+_H
+���\
la
��d�5i
�!݉tO������R r+Z��JW��ޕ��eE�9��X��	0���e�,s�ò�������b��� ��3К�B[�m�(xuQ�!�b�#I��Y��}X La[8�
�� l�� ���
5N����
/���x�F��6�#�n�7�L����Ŗ�-�l�ڶ*�	�joAe}u͏D�t#�#s�*�g���1��6��J����ҿ�<	pnPB��U�N��P6�����t����>2�� �����kgB��C�����fQ��ttR@�Z�|
0�1��O'0��6 z?�� �
��'��Q@�86�!=��Õx-~�	�0h兠��V>��x�ڸ��\[
9��/��G��0�+��"�<��5`�#��H�a ����8���� �i��A�u#��y�㼖➼
��Ŝ����G;/"WX��_�B_-'{��9�ȍN2��I�{��F�(�;�޾���^�S��@y�\���|N� ���u'^�5�Mw6'݁�t�$�jV��;� ����.
�=
�{\��\��
��r����y��
�=��f��
+0^-�z���~I8m|E�&��w�͜<P]�G��c��;=�=����>��>�����ɤ���Dt�ح;D���M"�P2�$�ydI�O��K��
�����
ex�J<E��ߢ��'x��x��x����7w�3�Q�
Q�	Q��;��@b C�2���ӹ���t�q�L<�z<����Ltm��B�.����z��8Sv���'n��79��
�F�Btq��v��p�(�\�GBHI�{��-c�G�"���>Vғ�;؀��DW!-�tU�U�񭸆�2Gq��?�����"G�@ο����\�!����/�"��o™�8�9��i�ͦ�=z�Г�Q3p
k�Mrpq��UF���jF�g�
�ъS��m
�$3�‘O"�%�C�pb.đh8����!x ����ܒN�uY"����o���$[�
�T����Y�:����S�f����*/G�|�6�Eр&E
�:���=؝~@�JD���d� j�|�<\5x���]�7�\u�K�18��
Ψ��)�<���G�z��i8�^�&͇8�و#�"
֔��َF����8�|\ڱ��ln/`uQ�.b��>���ؐ<޷=��||���E�>8�6���p�c<�yL�a�ٰ{�
��P�
=�q@����
ا�{�&ؼ*`���n�:T{7a��ET�܁ŧ���P�Ey"�r��]���Y�t.�:ଗ+Z|p�G�{���(��M�^�D��ޅ��=��/F�2v����lT��b{@,e�
�By�
a��P�;+�~#���	�A�PD
+�@
d�!�XjY�?e�=���)P�� ��ƞ>Q�gv�ǡJ?�������
+���`�>e�
�T�N�X�I(ћ��`�Pl67H�CNI6�ܒC�HrCEIίx̲\fimc�?���p��}
a������2��l�E�a$��&�4lL�Y(6�C��OB�a��o�/���}���\��)A55�J
��.�{�]8����.�.�]n
r[�ۊ(���%��*X���ԱmSӦi3�δ�v�!m�Ӵ�t2M3M��il�/2f���9�����ߞ>f&m��J�`O��fO�-�'�_��Ʌ��ɍ��ˍ��
��"�ܱ���j�}6p/�{��V
p��\��q��z��܊5)��h�F��+"	ӚjLj��IMs"����fÙ!v43�gNsC��ܠ�"�\�4w�Y�S�e}���~@D���PC�
��� ܦ���+��;t/���m"�h��Uc*7'sM�έdF�NfX�a���젶�
i{�~�0ק=��hg�n�K�.�UEg����_	�	�y����y�����B��rp���
e�C��m��nN�S�gcD�ǐނA}�ۘ~������#� ۥ�悺�\�n�oӝQ���	~�+B�Y_٤�+�Ш�>B����I�N1�@��QD���,��6�0aL@ش
æ�4g"d�G�ٌ
��t�*����t�<l���m5vr~c?�l
S4#B��E�k���7���~A|��3�GYg�*=��1���a�V���4�(�P��g�|�(�1Z�c���$�ך�#V-�V:�V��"1��i���&K�hi�|�^��pD�)�ܖ��rYUc�E�
��E����*����ߘ�7���t�Y.�
�,B~&��E
�ǡO܄nq':�T��d! ��"�I,a�J�+:�z�����[��k�c
+�xJp�s�jqYeo��ğ�T����sT��M�
+�ܧ9�:�ި��@W�Y��L��1��Q��[�`��K��R�,e�QʃO2�^*b�r�%��Z��uJ͜C
+���QE�4!�Ҭ�B��*��#Io"�I�Qey�C�U�Q����j������y9F�z�K�"��	h���Q~^Y
�|n�0je
���lc�ek�9Y��+�E�<.��g����(� ތ)��#ʟ��ʨr��ʨ��Ϩ��H��Xt�<�S�O?����M at Su<�՛��˞�G6

�
�9J�!3�����c��m\����aE���`����د�
+�?&�#>UVG��5�U~B��$��Zʜ5���!��M^Z�{����&��Mp��ݵ6W&dw
*�&����]���
��g�]����
]�
+�+"�\�F�5��uWep��2��Ci��Ji��
+���z�E{R
p���qb����S#�u���Eu�S��nC�w�}j����w�ςb_c�٘B��5��Y���3��x�wZ��.	���
+��וy�w�������y�_s�j�J`��&F�
�O�y]���7�Gi�f�-�P�O�՟��
+f�"��1j���=��d���\��?�_T䴼��n��"��[���n~��i�~�-��J#0GL��Q;���;Z�� P�����Ž�0wn�)���
j��2@�eE~W9�
�����t��Y�V��2�s܁�wyu�6�
�5�������W�Gyu�7H��������JxZ)st�~P at 1�л����oA^�nhRqp@��P>�Cfd�J�	U!#�:�¤�z���q65�<�o`�M�>q�M���M���K�r)=k�Ju.�Ӟ�F�� �D�5�-��ʞ[��
+d��!st#2ƶ���
���c8ia=R�|+,a_؉�p���H�0�ç�]�
���M&)|�I��I�7�4
e��ָLZ��q��h�
�����c�q�=dL ��O ej=�N'��$$O�`���fb�I�"���
q��H+�FB���3�sH�\��3oF���H��2���8O1p���#�Mύ!Z�-�v�8�7	dRLL=�e��\,��'`��f<����
)H\8���شh���lX���|s��/�#~q�xq�o n�=<9�)��
 ���C�h_$��u������h
+П�fIH^��6]�p)��	D"�\ށ�����X�"vŌu+�X�E�J ʕA���|��-p�~I| ��gė�P�G�@��p�S�%gi�9����i�%ҿL�/��וP����1M���}�S��QQB_C�RJ�SN�����h������HER
!�|�dB�2�9>��eȲZfǚ��5�5�0��ż�mw�\]����������繟�њ@ҚC���eS�eS�E؈�x��x ��u�`
E�
D�994|Cݬ`����@
c�\	�0^_����o�
��!��(`���$'
���N�Rp�>�ٜ6�9m��V
��<Z��[9ɭ
�u;�
��yr����)�����ɘ��+ƫf����0j�RӢ	P6�����76�
+�
}�����@��R;�Nl��_���lL:X;��:8�

���u
'��F7yۀ��܋��o u��Q�`��=
�PS��y�����
+�*_��6���X�A��E����l�����<�������s��Dw�'
��L7�;� ��0�x��0�ZSלV�/R��"���ȭ
�N�'w97?��=�G3�s��Ǽ��BOٌ<�����݋*�%�_꺑���aуBF�qd�$�$o�����+�%��9V���)6�	*�5�����	Gp-�'.�
���o��
���
��Y]>�
C��+"�/�����N�y�Y�G(��2ꬢ�:�l�Χ���q�����&��9��[�<`_�G���z��)s��	1'�#�`u����Q/�Z)�ʤN�`u��SJ���Y���1��k����s�4r����.��f����
���~/Ȣ!��ӝ�7���:W�G�P3�ٌ�V"u�C����.�b�,���l�N%�3_�gp��q�oZ躙Y<��8I�� +� �᧾d���
��J�Q�ϟ��0��Ԋ�hI�>��K�\�P����\͜���E��140M\�ts
:���k4�2J�C斒��e.��F��`��
�J.�$�A�"gѦ��V�84�%�^:��e�^.���R
�/�N�Z�*
4؉z�z��u
u��a��w�c�3v�E����=� 2����,wwȍ>��6��^�X�㴱;�M��I(M"pX�2
ʏqP��ze6>W�N����bO�r����۱�t?��6�3�/QmvU揱���-�xN����,+?
bIa��J.��l?=��*q�|��
]?o
���쵘�ݖѨ�����)�n���y�f����Q�%*�W`�U56Y����Q1�
�^G���Xm����n�zxj�3�%�G�yg�{G�����Fhh�:�!�m3;m}Pc�j��Qe��v��l��Mv��`7v9Xg�k�a�}9V�oE�{�X�^�nA��+�'C�
%��bY(z�Կ���=�}�
bi���}z�5�
56�t�3�8zc��?*
ð�1�ӱ��#�9��J�YXR�<,u*B�S�P<l��dX�P8�^(�$,�'!������J�u��YЅ�,t�`����GH�7PK/��W���\��~��]ݱ��+\�P�����Q��!����-�n�(p�/,t+��J�\�uB��ja��:1{��\�
b�{����B��!��x�_P���������
�>ۓ�
C�������%��(��C�g(
+<'b�g$�<c�뙈
�Ta�W���'dy��^k�
�Jq��
q��)����:���2���w�N���o
� ���/y̔3'+G`�3����NX4�y*,Pb�J�l�$�UE!S�
U���Jf�r�4�1EU&&�6KI>��L�CR��i��mE��/R����.�����
a�����ǜ|�+��W��㬰@=�ծ��
�L�?2ԡHWO�,�T��c��N��iB�:[H�+����~���vH��ZE��N����һ\b�͡\�l{�����Jza���|�7���[ +�
Θ
�� _�!90
I�����B|��B\`��/�.�>
\/E�(�
TL
:��
��<&�J�A�ig�����V�2�9��Rz)d>rIv�!��cv�
RC��
⎙!c1#�	!a�
��ؐHĄ�
+ѡIBTh�0=4W�
-�������mSL
+�'-���kza�����R��Y�A#[�]d�����K��3��f��	�H�0�$h\��F�F�hM0�4ᘮ��i��Bdx�0%|�09<G�/�>_#M���2�������73��(�Bj�+�7&���
+"� �0#2
L*�8������y�2�T�2E���$�\�Ct�2_ۮ�f����F��m�o^R����=���|��y�ߔ-���}�����ԋ�RR���-�)>�Ϝ"3�
�*��{�$
��ef�Eim4%��wW^z�
�Q�M�	�	ʶ&�f�P��ndX�V�L#��1�Z���[W����,�2�Z�2���cI��>�&����6j!�<@<�Ms��L�)�.gf��2�˞�U9Y���,[�2m#e�%)ݖ���
�d;���Ӎ��bSR�ה���<&{�ytv�%!�>�ۖ��h��!Y>�q4�M�`,e,x��� �����	9���*#������f�T{�R�c�lO�8�MI�<c��e�q�1
��Q�J��s�c�9�q��8o���2��0���~�(����P�8P
+�0=}���6�Oּ@��uRʤ�JΏԸ�(%��Xg��8�5ڙ�QN�F:���YF�s�i����\o�q�2u
1G;ϙ��4���<t��
�H��|�
y�Zƀ2X �`*˝D���&��<5@�S�k촮]�S�
+�kdA�F�F(ޕ�8W���r뚬W��o
q��]U�(�N� �!8cTp�4h�w�3EM}�~Z�-謄%P3 2�OE����Q)a��F�
R\a���)���b��4�=L��
q���n��'i�{��K��~�5F_�v�����~ψ,�nD���g��j	7�UO�l�����3CW(��%
��L��m�xI
.骨y=5p^
�7D�=���IT_O��x��LSo�
Ex���Y�
�j#ܳN���%
Fx���������	��@!�'�=���o�4��h���k������)���z/Ž�s�@���
�Q
+�&+�kSwo�
��ے�겤R�z_P�w�B�'�BJ�+t�O
+}�g4�	�g�怋�p"�h'2�3�Y��R)�̬�g�Xy�����Ky�
��Th� �TĪs�hu�L�#���X�R��yj_Y����
+�ܣ��7X񱂞������i�̧����
i>�E�,���
���%��e� ��F��+�����am�ڭk��u!��u�
+����j[5Vm8���պʭVU��_�Z-�m�ߺC�[[7䷦A-V��s�y�\�۾HJ��1eRl�4�^kЯB��n��fs
��n����Ԣ:D~�aj^
)K�`���e��ổ�f+]M"�ˁ�샓4(���-��wZ^����;�i��r)	�㞓���nwF��[��
��Z�i&sMk.:��⽏B8�ji�j�pk�xj��u-���H�N~s���p��Rb]���05g9�#��э܆����A�V
+xE�{M\0p���v
Ǝ�4�G�h���
�1.�:�:6z
I�ù:bQG,���
����r/���ֱ�>����[#���>�A��VG%��h����8ٜ��h[�m��ӝi�h��ml҉GccPϡ_ON�It=���.��
�������9_��9�%�t
�z��uR ������g�l��f1�3�] &;Jw�>�%}�
�iB�PWf2�P�WI�U��̫8r��f`�Db���4�05�nt;�xZj�~��y�l�	����ҧp>�H��K�
o�[�ȝ�k�r�f�>�7
vߐ���@a5쇃L�� ���
�B,$B&��'f�����ѿ�H��i5�\��B��u��z}�M���=�ż���tC��:�~����5V����)�@ C(���M�44sћ��
��
4棱XׯuS�Dg-:Xs���E]�>����c}��X�+]`�F>�/
j�h

�
���
��� 
�<t
+��b4�o�񉖑�
+R�
+�*�ߨ�����9��z
����˓���x�6*���&|����ޚX�o�C��1�Hw*>M@'_\h��(Ac�{)�ezO��<��z�߬���M��7tT��~
k���a� ���G)��3͉s �v��0��X\ 穋���cg��h<�����<��S��ot��8DN���*�~�������D��F�4�c���Q�l�/�[~��n(1�����0�dt��Ł�SXy:n�]�W��%�,W-5ZCNv�]zI;�b��f��V�
U[�����f�>��=��l�K
5��9cnE��鄩�����z�j�>� ���^�TPnB�Hȅ�@B.�@!B�-	!"�BAQDT��R�u�κ��εg���z��������vv��n�ݥ]������9o���|��=��y���2|k���1��;n�m���m���W׆p%f.Ō�b�^������p��e�^w�������qb��p��GX�}��qQ,<s�<N >M��B��!���R�}���[�;�q+67�D��ĕ8
.n0���np�̆v����r|'�p"~����b�!
MX‘��8�p�����1��S�l�ӛ�+���,�e��
�
j�w���ѽW6����\ڔ�s�xi����XJ���$+���܂�d'wc.��#��2��-��޺��[�b_�7�7�
�I}���O0��v�G1�
QݟP{WH{���1jm��<OYΤ��d�
K��BF�3���� ׈n
��NLq=����$�{21�9����ؕ5�Ѭe�l{�m�c��}
�~���a ;����_Q�D���H��B`����,��u��m��l.^�`*���*���0���8ߎ1~F���w"��Pn;r�` � ��λ�P�m���
+~�����(�zB���Et�I���2��St�,R�Cہ�5�ΏǤ 9�UP�Q�
#�J

��Ch����B7��>��� �}=���]8���c,Px�u�b���'�k�����&����j~GI���F
�(�}��L�s�1�.�è(	Qv�
0 .E��
!q�bz���]�Bg���Nt��W2���)�Z�����XK�M於C~ʚ%���X�$���|@5敏��)p���S�=e�勔�Ǡd#�$�Jr�#�K*C at Z�� �Ԃv��enx�:�)
�-��f�$s��S�k���4���8?&"�fE�9�O�O5_��{Hc�q2Kc�^�2F9�)_�<Ay��)(�ѡ�]Q�VE9��*�(Mp+�Фt��l���
�;��|��Us�^��l��
��
����cQ���QfU=�
�|�ƌsd�L��3NY�)G��Q�F@�:��,x��p��hR��RW��€�
+

��WzPW�	[� �jƙEs��jN1��Ǩ}�|H�@��1j�O�'
Pݛz�49D&�N�7 at 9z�_�Ц��G�	��t��|4j
��JQ�U�������*;,:7�:?L�>fԏ��
��/1��*Go�6Gg�!�=G���r�O��4�\�Q|�̒�մoѽ =?ei�Ѭ�_�>
�T�x�
+`5��\�@m��j#�5u��iBu�c:�NVe�fZ�q�1^�T�r*L�#N��K�
�T֬`o�+&��&����u��h�<͔���zS<l�-0��`�͇�V��Z
�
+����VTY��Zڠ���aj�~��,�r�%����(�? ��(-�I�)�QVN�Z�/��#d�DH��S�fZ�s�e5��8m�Qmˀ�Ƈ���:	4u*T��PQ_
u�*���.(�C��'�̾�����~�I��O��LZeҺ(+#��h�!sd7$]�C�A]m4���
�
�jH��!��<�
�r�ܩ�ҩ��i��U��
���k ��	V�gb�9&r�J�G~�Dο3�3�čOݰ'ɋd��IirP}ɍN@�ݳ9*w<��d�[2!k�E��R���
J�V��.��>y�(�C�C��
x�I�e��_3��L��V�e�(��
%�d�tS�V�@uʹ��[h�UIѶ
+��X��6��#
�
D
(���v�B�	���/���
�?0���2���x�m�����
���Y�/��
��sd���?q��
� 5������i��ݧg
����&#?�E^���`!�!	rB*d�
�l�nFf���2�SH/!-|
���H	}�������z�+NR�i2Bz���'�6��� @m� ���W�7���Dd��;����<�GDH�Ȑ�DJĄ��$��#i��G�b��"6F��\�yTd��"\�
\�T.j:Z�S:*����
�� �+\���\REG'�r�IsL��:���Fs���q�<z:�� �p��{�����-{�\���-��2��=��3�� ��L�Váh�G�5֢]2�P�ŀY�O~+y8�u��<
+�e*
�{a��
+#�Z�~/c�`��˹h���fɱ�L�52�}�'2|#Ü���LyV-J�!
��w�db����R�,)r��'�?W�X�Xb''��
-&�%PKG�[̲����ZZF��%Y6�
5��'��R�vv̒+4Ļ�x�B���M�J
̐��&�l.@���藢���c��l+
eS�0��
w�/q�ƪx��h�U4�j��:��q�j����>灼����i06��@��0�{��]1���K%���5�e�dX+��aXo/m` ��ƣ�P�;61��2��������@��:X�v��p
��{���KO"ޣ�br�ϯ.��˥�*��4���q�~�d��%dԳ
ճ|�$�$
;�G��؍
�=��g~Iރs{�Ec
�����pnk*>'͓���|�]%5��!���qw4��V
��B�B%}l�N:��P�Bp�$
aI����v
g9��s��~�D�D�$�<Ɂ'���
=�����Q����%_BfjD�d{ =����YpN�'�)|FLN��3��,19�%]`a��
�B.�(}IN�P�Wʤ�8x��
d�8�D�u�:�1>�J�;�돟
�Ч�[
o��
��p���p	���p��������&����t;�1(�����{@}>��n ��p/���p_���b�?��'v�5Q�5M�+[�4[�R�
j��c��r}Ǯ{Gﱷ��EsS{�����^�
��=��9�כ��	
`.�A�F����hC+
�q�����r��C�H_i!e�W�k����2[�E�B� �;���ɳ�t���Uv�
Z���+�~�~v�uG�M���D�]쟀F3��A#�b�Î�Z̙�m
e���|��??�[�#(
F��XI�
���5��h�H��KS?����(4�H�
�И��9h��b4q�R<_�Z��ق���5b�.��@dP��+^�?��jF�
�ؤ���sb�guC�

� |��h4���)ڏ
$/{��;vk.�r�r�k���m���O�qR-Yۤk#�ވ�
��?�;@��_e��.hza}�D�����
Bc�>��
ر��lÎ�ر;ꔏ�<�-�zU�����v5��ZV��J*���T���
�)W�
��x�����+�>hv@��I��y
_b���h4���ICg�V)�B�^��f�U�l���l��F-n~T���Tj{O����Ď���\�봷�
h�����h{��N���C�-���U'���5v�k�}?U�V���0īܐ�e�-5L�bC��
f��a�J
�h��*�w��\��*v:�"��*p~�9.ϔ�bU��n�ܜoG����E��چ�{�[���E���h�s�V�Dh��������_��wTb
���-pM�<�I*v��"�
�j�[���Vj��F�toP��G�6]T��}e�~֟���h�<w{a
m~
-��*�e��AKM&Y<���u��6k�g/{�U�� ��
�<�X����^�땪l�
e��SF� [...]
�)
`���|o��|�j�o��|�5�]7�{M���R��@e�
U�_���%j�_���OS��&�����*%`����q�*9��݆�J
+���4c��i3T���Bl)Ɩ�� '�z(+�_A�J�Ҵ����Gi��498F�G(%8^B�5.$U�!�Jz�@��������E��vZ�þU\؏`}ɩH��L��
E1�c�ll�����wpӔPo��kRXg��u�����Wc�(��%v
�1
��i�FwJW\�<��\���*�����E܄���c�I`
,���b��%
�ұeJ��&w6jB��ƅ��؈0%FDjLD%D���o+."F��
Wl���
��S5,j��F-�;�
+
6oR��Q1ѧ�
��
kP���V
b��
+UPs �Qlz4�>��D�(9�I�Q&�1�S�9Dq�pŚ�jdt/
��a�44z��t���c�-M���h`�yн\�g�̣�:�0��+*"�EP�E�a�eXT7�(
+.ǚ
b���&Z���q_c���5֥�1�x��X�Ҩ�Z�M��D�?	����\�{����������0��t�^���>|߂���3��s��1�TG9y�%��41�W�1~���P�ŌV�1V��$ٍ6es�[���2��͔-�WJ3-W��A��MJ��`�?f���r��1�
6�
�k`T�
�7�8���b�Eq
g���O9�����+����h���`U�9K��q�&�(%a�,���p���F�I�JH�c0'
�+�
�
	�?�:cx#�%S�3�=�|K!1�'tTN��쉽���/[�P�%��5)J)Iq�$[�����d�-��`�.s�\ŧ<+SJ��M���2�Z����
�bS
�����I����	��Q�g[�)#�Si)��Z�d�Q�5D���JH5ʜ���4�Li��K+R�m���9��-Qtz�ƦoԘ�Т��K
�j��0������;1U�e
��
+�����v~�ۘ7m]���Č~2g
V|F��2��-c�Y1YVEg�56�@c�e��h�K�����oPx�v�e�

+��G��
+�r+^e��ti)̇��

��߶L<G3���L�^��魘
E�iln��r�4:/N�yE�e*ܑ�0G�F9��HG�B
+���F�o�C�N#
w4"�'����V3u��J��E�Hg$Oɕ�إ��v;�SQ�}9��"
+V0\�
+�5�0F�4NHa�F�jx�D�kX�
-�QP�

+,ڬ!E�,�V`�
+,`r���ȡ0
&��2�F75���C��1A
+����

+)��%�
+.	Ұ�P
-�RPi�KS4�Ԯ��B
.��AeUz�l���~��e�j@�~��~��75��
,v����)̃r4�!���Rr�
�:��W����^A�<5d����Ӡ��z�<X��a��d�3A~N��;
��,U_g��8����^�������|���[~]=��^�ܭԡ�K8���"�E;
ms��=��&�(���UtV�9^�7���T��we�zU������o�E>UvyWMP�*����սj4ʳr��U
S�9��9����~��nբ� f@	�p<d���v�t)�2K
+�.�ϕ�.�|�������\�`�����
+Q7W������e��+_�]���5W
\�����
�0���P}A����n�w�)�a��9S����s�l)�
+}t��F���?�\�I]j<ձ�G�k��]��
5|�k����r���RKS?�`�L���5���`?�u�]�	����<τ2G�3�ND;z�4j�4t1���].�<��Jɣ����3 �{AO�<�j�5
Dk��6�o���@�5�����<l��
�}�r�
�NU�Y���M�-\n\�3�4l�+�>���WK�X�N/` ^����

���@
���8���)����a3/�f���fl^˹-��~��**�uv��4�{����W��n�u�ٕ-thF�t2�K���`
���P��y;��N��� ����n
��{7��M.v7��7�\�ĵ7TN��(W�Rj�����g�p�G�˽_���&h'��?�m�M��^��!��A9�18�P~�!�0q�� ��G����BA���l��p.��|�������7 ݾ\��G��� 
�x����`K:�9:A��$'����1
+�G
f�:GM��h�I��
���ކ�* ���]��{�
�.���C�vy��H�8�ZZg�8
�U���|J}��'�|�/������F�����k�~��E�o#v{n�;tk��`�3����?M—Nñ��=��]��
|�m-�-��M<�
��W8�/��t?���úB�9sI�����m|��y=�C��魇
+Џ�
F��{��o�k��:��K�����k��O�B
��<���u:�����=K��[Dp\���џD���l�AOЕ��p�@���F�=+�1�ɤ�I	*�!q|@
#���q�8��մNj�����B)�����
o���d� JO�X��WGt��a���(��V2:�h䳣�:F
G��q�K]k!�����*�Wm��Wx�vjgv��
�B��������m1<�{�/�H.ΐ����}�"�1�++�Y
�O䱜L��Y�v�N��A
�Túu�LM��&�آM��G2ӤO����<����J���p�W0`6�`�`6`����
+$��&!Is�
M�4I�&k�f]zd=Uu������ӎv�6�դ�Q�ҺN�:mk�U�v޷d�������z�����{
>�I}�R��/���xW�%^ս���ŋ�7��Zʥc�:�������\��G����&�dQ��qX���<�pz����}��^��ݐ���s:�����D��v)^�V�Y
=�HӨ5�K�H:ҩ�	���.��f�ƨ4&�$��^���KcE�����i�;�
:��p\'zL�}L��5i���Tx{Y<��򔞯+�='�$�eK�D�Y���5
ί��� g�85��0w����k8�vǢ�}'G����uW9��I�X��c~ξ[�c_��,o��������S�����)z�(�]Qx��!�˷�'&�s�y�[Ʃ
՜����-
�����
��
p8n�CqS�7ρ�E���l8�
�yn7<�R�����_ga���4~�c�+�Th)����_���4
3	1��7r|S+�"-
4:8��bB�	~�&�;a���YL�fW�N��#�(ۓ�2�t���יI��t�L��Ƕ�O�J�|�kz���JA.�=��yJ-�爼
J6p 9��\v��XJ�b1���R�YH��#-���si#̦M2�>�t�S�	g�b"�㙏�5�;�e�����2��|�+
+�O�����	=.V�%?{�ewV,�Y	,de�#���l3������3��a*��pN7�9��nek�4�y
���g(���(�F�s���P�;���."7)��R��.��JŎ�].�%�Y��
�ˏg� �m��
K�(�d���X��ѢV���
�2X4Lq���턶�GIP��ݦ��2=K��e�6�ҿ���7�Q׾H���
�_��Ny�����5�K�/Ib�$�SC�rM6�MN�J����)�&X:@w�8]e���o���
�s�[��<����7�C�_�k��ҝ�6��G�
���Yy�ҾLh_Fͱ
��
���3��k6�T�mq�ei�oi��⧣"D{�(���U�h�:D��,
�xlO�}�fۯ�_��\DVyF�W�f��/����k\�2,����'X�L�5�����v�
��I��M���[��a��S4�,�d���
��+48�/Q�xK�E��Dd�'�{�VwQi�>� f�<��a��Q�S��@M
�5���x���K��+q�
4;\49�p�v�X;HC�$�u;p:�S�<Em���q
���^���?���pF����L�W�uJ������뗏����_�ڜF<�T���49����P_C}}Ά���6��h
Ǯ�ƵL��$�M��5}
k�wůğĿ��"�\��F�ŢKy��z�K�����q��䊧ѕL}SΦBj��p4[�7�Q���݁�݋�=F�g�J�
*Z�ci�O<����[~���/,��*J�R��:�M%Ҩ�>ѩ�6�n�5z�q��mI�ޚNuk>�VֶJ��
T����z�x���#��f(�-Q�[�仗��G��~C���(���7���_�eJ�������"(��Y�R���Z����
X;�Tv�Pљ�����N3e�Ք��1�[(���80EQ`��#.����x�����
�O~�S
+��U.��.HgI�*�1�'���k�*�j;����ʃ��(��`KO>�=&�z�(쭥������z��
M��Iv� Y���
=DF�ۤ�~&~OF�'d�D�wK렴Ĕ�DP�K�I�N���A����?����
�L!w(���"���d
U�9�@�p��A҆GI
�#yd�GΈ�$
?K��Ż$
}����*wJkY�����E�H�M%Zc�U�V����Q�[cȘ0�6�H�D:)�y$O��y����Z'�$��bcx�M��ćOb_O7��x��G�?#~<Š���i1"�
ѡ5�U��I�J�Q٘�U��!}z
I��$�m�8��Ms���`�/6���8�e�|/������������H��u��^d��D�~@��c�L��<�0�"�"2�
+*�
��
5�"(Ȧ((��	(8*
+�+��˩₩
1n�&�D�Qc��%�i�[5�Ǧ�MjԨI�4��4�>�99=�Ǚ�g������}����T�:+�+�
Hϖs��<r0K����5}�ŀy�o�ԣ�M
��Y��j�%H.��r�D���C��f�\

���2`�]x 
kت頫��g��ȇ,
IF;��9�X2���n at 5��k���E��
r��A1�x-��Xޟf���ʋ��g�ȭԊ!+Z�p��^�����9��
+�"��҄9�a	9��Hx<��:�W0���\h���t6�|6҈��)m���4
y��x��8�l����0f�a[o����=�oU�fd�I�;��}Ț�M��
�Q���'��f��R�gx��m��v�h
��?v���p���M�᳇B�C,�1�̬������n��s�ZsI�t�J��k��9r9�k�_/7K4�v��'
>�'�'
-
<hi��H��i��?:^�m䤍k#m� #��HG�&���4�xO!މK��yp��z�5�$�/���
�#���0\�!K:NL^'&'�I;M��4�o��i�3�tΰ�ϒ賋�X�%g۹O]���
J6e%9X'�n�L������
�%��x
^B�@��H+��P༫t��\"7�eP�?.Ӕ}ċ�
+�y�d_�A�zN�ye��r����r�^_�j`}���s���à_�2|W�܀�N�'��
r�1�|� G�������|`�� �y���;��x��`�<��g̘�)Wߨ�ٴD_3�=a�{Ĝ�%s�&��Lt�����t�S�]��?��?��?��'ܽ�ou��wp
.�]N ǧ|�����i�q�衦2)��s�˻̗V�>ŏ;�q?>Ə��q�)�S�&�ժt�����"�_�u
�~�u���y����z��YWz��+��TXG�O�~>�/�~������طb-v7R
�(�=z�B>C,N��)V|���^
�������)<R"f v��'��
Bk(:�hL�~��Q6�OIa�To��S��~-���]����vف�>�P+[�]G���9DF�x��!�
��Ng�u�%y��ab
Qh�@#
����`��5��2yi�>ZU��
Ə��q@���V��f*�%��cD�
��u��X;��;�
����M,�$ǩ�W���5Ġ1
+�㱟��LV���<�H����f�؅;�I+�����o�[����m${
���
+_�v��'�
l�S�#���8�
ia��� t�����N�r
+�3��l4�?6ᇍ�l�>UG$��o�V��*V���[��r�����c�գ��_�K�s��4��g
[{/�^���g���	A'
+��h�Ec)hd����c��)E�
+�����ZV���,""[�.�v���._i��s�wr�#�
�kG�>>wp���e���l��w�U�S�Vw	�J�hY�G��%Vu.�ZꚢZ�L-q��"�|Y܊T�V�j���Z������֤y�-*s?�R�wT��c�x<Q��9�;�đz�㽅WMظn��
+Vz�iew/�w��R��Z�1HC�F����$��LU��Ux�j�g��<KT�5_�^K5ǫAE^�T�c�
+�_�,�w5����������}y��J�'m��|��^-�,�]dt�Bo�x��ۤy�����8Z%�x'j�O��|�T蓧�"��P��b��J�{nUN���������S��Me��
+~{''y�
0�
+ at Cm
����S�/��]T��K%~�4ׯ����*�����5��X��NP����g(�?G���P���M�cUf�M��%�ئ���J
���A���smױ���Ā6lE�泊�r�)Ɨ9�2;�C���(?��f�����e�TV�8M
JԔ�Te��Rz�<�������+e@��lФ��J2
��J4]Qbȗ�
�\�Ն�.ڍ�iTC�s�_�/��2#��r�{hZ����Sfp�2LQJ7
S�i�&��+�4I�!�������8�RB�j��Q�杊
;�4.��
z��n�]���F��f��*`n��ˣ5�!.Yfe�z*=�W��>J1��l�D�%�G(1,V	a����Aي
/и�r�F,�؈��l���CuR#�~���=�;iAo
m�
+��1� 
+��ǽl�����09�C�"�J��	�����(�EӸ�ъ�
��Q)5U��kTt�FF[4b��0d��Ǽ�a1��|���`��!v�
�S\7�y�a&�po
+K#.����M	����̣�>�0�dQv�MvD�}
�}G�EepcĠ`Ԉ\ �Ƹ���5q��i�Fk��U�ظ/MjzbNs��5M�S��Tk7��IO��sf`f�{�{�����K9�Y�eI�PfR��II�HJWzr�Ғ���R%SJ���MJM]��j%7)��MG�`� �������A���,W�}��́z��@��y>�9���J�T�q��� ��d2��ј�T�I)&���
+`��ҧ)1ݮ��E��X��gޭX��`>�x�7�e8نV7�m\��3��0*��������ǔ��.S��R3�(�<NI�(%�'*!3U񙙚����IeP�X�
M�,T��S��+:k���+2�,���=E[
�l"�*3�k�6��5��C!X!���Y�
7%ey)�jP�5Pq�p�Z'hBv�b��5>;[�9%�ʩVd�LE�(<w��r�Wh��pH!y��Bs��C��8�
���hEc�hTB	��*��'cW��|_�/�WTA�"
�Q��B��
+-
+-,THQ��5(��YAE

+,zN�;�u����E��_�
+�Q`�C�E�
����Ī�B9���<��\��*1��U2R��
++3(�,H��"\���d��P�'��
+����1M]�&C�3�xQ�*��I�V|�Q�w�W�@�2���z��h��KUPy0	��"�_���:FbUB*]4�S�վ[=Vc�C4�:Z��x�1ȣj��)�Z��4ʻv��j��Y�~ ���<����k�C��,d����
+(��bjP*%��;&KQS��)�N2L!�z/��� @޶0yq�yڒ!S
��۪4�6Cn���:�b땳m���������\�%ܕ��jG�q�ـ^5�B
k��vj%�{]+�am����ly�=4����r���
)g�D
���d�j�� v~d��VjĨ6b��3|��9w�Z�V#5��YoX��h'���QX���э�7I�����]N
�����P��������J�[)^�lX
=��m�����|�!�3�]���
��rȣ���zf`�>}t
����j�K�4l)
w)
���W��e�
7�v
2�
l�
{Emg��6�k|�m~sn����0�(��z���8��E
BװH�~Rr_&�,��K8�p.�+��*.]���tq�������í�A�aa=��
�G�
���w1�]_�5
ͩPF�s([�\�!k�\�>�Z��
i�Jɩm�*si-�䱎<�S�
Q��
zt!��a�GO��>j��b��`;��6���{[
�V�f�6S�D�
E���V��Fr{���	��6xh���$��2����.�c}���c�����c����}
���ǹ�} 7TG�KH1��Ia�1�y
�5�빑�o�z	v�^x���2
+�� �� 3�#jr�K�� 
y�3�
6�
Y+0��;���g6�~��K8��N[�
���u�?��E�\vih
2 at o��!ނ��18��I��
59͌�#�
�
</�W/R�K
ե
�e_&��*F;�Dj
��ǒ�7��������pj���Y`��\��
�U�
+���\eN>aF�ї�2����gl�
�M���V�żu��ؠ�u�	<���=�w��'-�]U���'��m���u���}�����r
�uv
x�a���}�k���}�Ӹ�_�C<�ω���
<��74}t�WE�/JD3�|t*�-6�������K��A�N�w�}��e
�E|�y\�Y
"��qyW(���
�2�9�?9<�{�=�;�B���Dz�QD�J�^G�t�<ΐ�)��)y���|�<N�B�i�~���N��C�ُ�<�8�$�����
����S�%^�
+^��8��=�t2��a$J�*"��y�I_k
�[��X�����k�
z�
�*C��o�B�ݺ�](�Du���x8�}h��ș�y�k��!~2�f��]ʶ�$v
�m�=j"��.f
�k�Vj;ً�d*[�j37ѥ^}���':�<�����
�ZG��H�|�?�ÉG|#�-t9�إĮ�V棏9ݬYĞK��]B'����bB��Y��
�z�Z7���D�f�V��-7м8��
=���vj��=�E��E�⛈ja��_B�J��R�z��"~1[��R:ҩ���r�|�.t}�lc���+�78���v�ce�+ڼ���
Q蹡�MEǠ�F
��J���B!_�I4&�QK�ј��<v�T�C���	"�R����i�OǛ�����f�8͑v��u��>X��5�<�\�i�0w�|��G'
�X4��HG#
�|4J���=�ͫ
�O����[;i�$Nb'�'�sqbױsq��iR���M���6��Z�:��um�U�
]K+T(L\�Mh�	B�6��&�B
Ć
m0ډ3?�?~:�w�}~�{���������c�c/��
�V�0��]�b�
-�|Q��_�75���������O �op�}��������$��1�s�4WG
+
:�kѡ\����i5ϫ��~��j%?�L���
F�X0���i�*��\ъv�i���f�/hGɋ�*��ɒ�5Q�&����>d�
+���e�E���
��i׸?�-Ye,���-5j�Ԫ��J-����ЬyC��
=�i�j�׌!�
Ɣ��iM�5a<��Nj�Į1]ר鞒�ה0����F,Yڬ^F���z����Ч��}�c~��,lZ�s��Lf���1;5mnД�E����am��i�2�1˘F-�Jn\���U
c>�nzRq�U
Z�j��u��~���?��>�.�/8�l���>X�z
{�f,3�qږ�)�Q)�&��
��i��U�֦�-��������,�x���w��n�m~Lъ��k����s��xUa��
+Wާ���y��E��i�t�-��<�3�M2�s3���6{��f
��5dw*n�נݧG��
=�9b�V��r\��Ym��(T����O�����5w�U�:k�oÇ�g�Z�I�����"�r=I�8ce^Fː�H���_mU��P�Y�^g��8[��R�&���Au׎*X;���Eu�
T�����o��͉[�=�������?�kh=��R�
��io�ޡ�yd,}�<E]E\�]���V�U�.W�:���p��^ߧ@}B��I�5�R�g�ZO��xQ͍���������o��;|BVW�9��4�c@
+F�j�g�{�xr��)Q�cR�Ǧv�CO��<�jmlS�7�oT��!57���<'o�}'��]P���[�"w�w��\ ������i4`?[��0���e,aBGs��F��6��W!�ϩ&_��->�TckD�ָ��Tߖ�ۿG.Lj���j7T�2|[��/i�W��?�ճ�@s��u�~NB��/
]�m�|��5��j
���RC�%w{�j��c@�
��霑�sE՝GT���*�^���eٻހ_p�7����ά�濏�
�Y�jN�~�#?�����
y�J���
+ZU����V�n����T�
TeOL���CS�-is��CO�,|
�$[�[��&[�=��>Vy��54�И�V�A:��R��#Շ�}
rn1�*bQe�\�H��nU�����Ce�٢C�FS�]�C�;'K�̱{�M�b?�9�WY����7�3h��zϣ3�N A�ۄ%n�໣RU_�*�KT>`RـU�A�6
�j�`#�e
�
�)>s2����/�]��_SI�Ǵ��0� �:��
tf�|�0�^
B�-��'F��)ՃR��u�P��A�E�D�6$�dL�eH��K�ɘJ�	'w�(�[���*H^T^�r��*7�C�%~(�c
Fg���J� D H�~��h����O�b�l3��ɘ*QIʤ��&��*Lժ ը�T@�a��تuL.����EL�%�*P�l��܎������3��%
C��e{ˇv���LJ�m���<I
6����b���3K�O���$�����f���4/��	�xi��4ET��i�8�+�{�@+����A
�$�Vb�s�8��c�F���,ڵ^��ԖK�%
�2�~���P�p�g��3,l�?���
+Em�$P�f>ϳ��?�ݿ�}�"�	��JH��%�:bv̠���RѰ$�H����@����p���
�h
Ĉ
��`ּ�>�5&ym
xy��X{�g(b����5��
s/�w���)� 1WΣ���0JW�AJ�c6��ԔG1���	�#�u�ơK�?C"<˚�eße.��o-�q�3<�{>M�z�mx_Sh�B?��ʹ���
|���5�[By��=g��®��r�'����oϳ.�0�g��K��2{�9����	�2{�2r����{�������	�8�|oa�<�!�j��
]�q�����8zlk
=�?4��W�Ә�녘r
�
����D��
��
����6B���4-�q���EUs�wJ2�1�sg��
����t�@5y�q�_!1&@�� �p
7�" � �V�}Z�V[;�S�n�U�u��^�Z����Yٺ^�9�����g�tk��s�Z�5�a�
�w��/���������>�ׄn�Zr�1��x
v���� �fK�0�4&{C����Y����i>���>椏��� �~��q� �>�J��%?��A۹B�>��z�Ƹ%�9����j��]���
�c�F���2ur��9�A��Ca?/�~곟B;��i��8�'U��9@��m� c����A�g��|�FW�(ćW�$�
^�~�E�a{3ظ�!'���}�q��=/�X�Rl�
$�I�p�.G�&��&��
�ҝ���j�K�t�>�o�K�����O�l�H��1�������ӝ��S{���7$�

�ۘ~S����� �����M�̫2ґZ�v�>����
�Ϫ@�V�O�S;�tF=ğI�����
|�����ݞ�pOѩ���y�
�e
�	\���0]׹
��<w����2\R��@w^6��2�
R[��(�ד������b
=z	/��|
��Q|
a��xi�R��r��_��G�KV���L���
�v,t�rSk�Ɛ�2C
�K�����@�b�� ��~M!�t�����(ޣ�l"?�Z��I;��η���q2���n���?Wѽg��@Yk�@nj�����c�i}���ɼl�>�i"�'k�
���L>
�R��X���f�)������'Z��:���%t
,�e�v+�-�H�|';��!����.'v5���L�qTa'�&3�i�B/��mt9.�h�XI�dn9��L��?��E����v(��
,����r��5�^q�O�Cr1��/$v9�u���&�q'�����
-��[|c!.��yds.3:�
+��O�n1���.��̓�ي��
+��U2�E|�
��$���E�/�"|,��||���\�q7��˺������L�OgT��T2�Ce��O���8[�S
6��[���.��R^��/i8:4��D#
�<4��(G�J3�1�y�J}�P��\M曓����T��p�$�:���������`�v�� [�6��
�jV����
^?��!�=8-:q���HC��h��(f���S��wԫ�Mԡ�AS4>�.�
Y�����2�a�
ݩ�Ѓj
+=��!��v�A@{���ql5[�=0f��O�5�3\�6��;ܠIC�tg�U�aɚ�R{X���i���
�Tk�h��7�9|���u�q�
5D,P}�J�En���
��<�j�I�
\���hn8z�`�
�fB7�]<��K^:�C�n0j�!F��x�58�l�P�!G���1���X�:c�j��m�����Ue�����Tiڨ
+����I��߇�4�k��#�[c#
;zy����\�s,k��4G���
�F�I
�8ՙ�5�j�9K�f����U��Q�Uլ���E��3G%1�Tl���,�T{ ^�/�=���
hZ����W�L����
Z�1yހ�:��Ɔ��bT�%Z#-6UZ�Uaq�̒��X����*��Rq�ƍS����Yg+��J��U�m�r��);�%8
��:�0Z+М�Qt*��Nh�1m���y>G�BTa�T��,�5VŶDٜ*�e���/�Hy��&�)7�U9�]�N�%�}��Ik���2��*#��\�g�s��ó�֣���T�=����
��W�|$^h)U��b{�
+�F���ʳ��'+מ���le'��I.�;�FY)��L�T�c��
���|P���r:��#�x>�3��z��h�L�9��eHc�_#yV���R��!�:
�q��q�)ˑ�L�S�,��yJO-QZZ�R��L�#}�R\
��z at I�Ge��Ǖ��6|��W<h5�
ћ��<�X�uP�u9~��� /^�N���
�I.W��\6��R��pɑ����"%gV*)�A���Jt�(�=O��U�y�/��G��	���}U6w at +ј�f��y�PP�����ϼ�L���C����D)�3BI
���iJ��(!ۧ��r�rje�mӈ�)�˝�X�}�xQ�w7
U��
��������ؽhN�%i��� UPE<��r�{ ����H%��o�-?A�|�F�g*Η�X�__�b
+�*��KQ�2.���T�
����^pQ��C at KП��Dڑ�P
�P>ȅL���|�}�^��d+
+W\�Q��hŔX]����tȑ�_$�4��(c�,J�*�t=�T�����O��\�K�%7���ME�
�F4��
� �g��R]�AQ�g��]w�EЪ(*
+�-,�����
� 
+B��
m�ă�D3i�F���Ui;1&ͤ��N
k�
N�c�̴�L56i��֣�c��,�d�?�Y����罾��}��F�L+�����`��WJ�Q��dv|d��ȕ�Q
�Jv���\*��C	�~�;�+ιO��c�q��X�����^8V±����`>(� �
���*i�
��d�_+�;IF�YI��J�d���T�'[��y*�u)ڋ����'/ыp�| <�<�_h���&����q;(�@
1τ;�~$J�
~d����ʼnJ��**�@0�
� � � :3��"$�� �*�� ��!�y���U��Rx�P	J �l�L_��qÿ~L��l�u1JXbPt|�R.�Fz#ì�C�H�	��
��N��j�ų# a��K�gpK-��/p�
+PH�9ĜE̓}�O?���/��Q�_�µ�EgKO
�F+�k+:w%�K�����F.�(\/�Q��u`;ϰ-�D����M��T\~�vPB�s�y&1O	�_?��f4`��9��V�AZM.��?�P��px�s�{�E�z���3����
r
[d������!m��\@̳p}j��Ϋ)��$C��7�X�l�a�X���?X�6N`���LM6s�6�����U|R�M�y����Sp�w�+�TQ�"
͡|���ի^3uK	a·A?�

�XWY<���e0��":�����1�%7����	p�;q|'��q�������L~x�Թ�|���Ӊ9c5�=���m�p>
+�����q��/�O�=��r�,
�w��}�q�K� C� M~���'��q~g���<�>�,��O�
ڙ��zb/��k��u?#|a�g �D:a
 /�Caq0&�X���k����u�7F��4�(�8�
!��8��G��䠿���&M���������
s�A��
";`4"�hu��&x����`x?NsfO��8�)�������w	�/�:�r���΄;��M�6���H��hD�9p
���ɈH#��88r�p�u��\���,b���%�%
+~��O
+y��.����!��M��w�A��Q���j�@�|�ν�:���+�OQ8��|�����H���❧I~E?"�sp����h��B�p;�C�-�>�U�n�3o��>�$}����|�Q�X5���=�:�7j
��~�{��
���=Hj���=�k?
+�Ux���3z]W�]R�t�+p�k>�\P\f�Fi�3�
�[G�P'�^��uz�|���:��z�:~���C�E�
�0-��{/��J'i�
:
���A�� ���ƸE���+Z�d$�����,����%ض㷋�\D�����K��è���!�A���6���
�]T�y�xs�cu��9�/���pޏ#��N�����[f|�a
+Gb��]�m;V]��a;��l/�n�v��S����<��7v����#��dr

�E�A�+|2�����;�1�7bۊ�t�f���.�v#ʎ��^�� ���DZ��=B]��F� �yB�z����
}d�����%��,��ã%2v������b�\lQ*�'a{:�sυ�.#�U���{���~=�7Q�������By��
��5d��������f'�ީ��~�.�=��$8#��`;
ۓ�=�b��eد�~���
?:�C�ZE���Ko�����
+�rz��S�L��9���q,���Ǭ�`#�v
�����pF�H�o�~:��b&'2�B".��
+�8�p��@w���tұk�����uԣ�j�� �.�����3�H��x��U3 
2�_	Vq
��G�-*
3V�ÑG&
��ȃc
�e�T�� 
<�x����k1Q�舅��K�y�t7��͉w3	���ùs
W;#��k�#��w3�p�5&Ū1>Y
1�G�T5I��i
+De�=G����(�\��jyc�����m�+�U5q�r�
�?�����'�����L8����4��^���z����J���KXk�'�/S��IF-6X�3��k�,�!K.�l-H�WMb�����H�Qu�O��zU&����.U�Uf
R�q�JL/��tBE��p
|�'��6��\�p�-�������^~w[��6�2�UcJ�Ӕ�j�T�M3Te��|S�*��*7W���U��V�㖫h�jͳ���U����k}Es�o*��!���=��pm�`�c
m�zk ���.|q⛃��SbUeMR�Ţ
+�M�I*�NS�5[�ֹ*���Z����S�;�Iy�W)7u�rR��٩O+���f���L�9p��{HC�����
+���U
|��w�*�_��Ԗ��T��RST�:A��575Ksl�ʳ*�V�
D��Eʞ�T���5#}��2�.�5-cD��55�,��!
¿���4`��$�
|��e��}��o�Jx
 b	I���5AI*����;��œ��V�YK�f�n��V�b��UQ���y�U���ۺ�uն�]ﶹ��]����n��9�	d�
��'y����^������z|���*|�̍W�%Ye�ty-Y*���R O�G��r��jU��(��Ek�
+&-V��_v��l�4�~PV���g�~�<�mYm���j8!
:�h
0
L�ܫ�J�)��JA�� ��(�ͤB[�
6p���U��J����kRA�����s�R��~Y�;��|Vf�)e;�ו�%��?��
+�zX��]�
p
��U�[(�p9&��HQ�#]vG�lN��N(V^�O��S�k�r\m2�{��^�,�&ezv��yF����=�V���2��h���oh*���ց��SJ���|�w���I��cTn�I�"�r��e.r+��\Yŵ�,	�TҪ������)ݻQi�o��
'��}�ܔ��
���R��Sp� ���@)>”�߬�8Ki�̥��*�Pf�Y��I�(/Tz�T)
�j�hQjE'�U�o@ɾA%����;�Ċs2T\����*>W?�a;���R�ԃ�|ǤJ�
pϊ|�THپx�&')�ʨ��Li�ԪP��*����J�nRbuD��ŚX�Fw�lU|�^�U��	կ�+|�D�U���ݬ�m�o
���W
+<��w��L�F��j�V�����J�e�۔�wi��L������@�أ+�,�X�#�,�~o?�c�-�b���f���6WBQ9(.��ÝW
-��RZ N)S
24���`�⢇X��$H�)Z�Bh�B6��
�)B� �&ȖD$4�>������TP
*1Q
+<|.��HF3ńٴF4P(N�i�O�;�J�N3�X3��

.kᡖ&��lAĵ�)��0�(��4����1���� ��{���$f[��3����K���7�E���,^�m��f��v��
)
�
�#�#��ψ�v�l���/�
d��x��:��4�z0^o��
�Q&R1��&�J	ȵ	�����N��y�=/���亭�M�ԃ�
����>��������!�g����}�6blS��|�s>i�m��d�7yp.�]�6��E,`��c	5Y������Q�>����9�f�q/�r9br9�c/[��y�fg�0��%�� �<R�I�Fx��K��� -Ƃ��+��j��'k�cmt�e����g���3���~i� �'�җ_c6��QaR���k�
�����̫WFx
K���(��
&ρu`= ,�k��	,�����A��R�0/�A�A�n��>�.m��m������,����o�:�H��C���Y�k�7��f-�������Pl
,�`�'�&'ߡO�Q�!zt�~��
"�'(�~����sbϫ��5��*�]�Msv��,!�{_�3��hl�<&Bh-�TlDŽ�0 ň2���=r?F����(�8
+����a
:t�Pu�V���r�4�%��-���|��4.�F �&�1B�Jg蓳�q��\�����E?O��Ar�3��!pF�p����v�R�#<�+�;
�<�a�u:��Q��x
\ ��(�.�A]�6��������}f���J��#�+�{��^��8���i����
=s�yS~}������=*�:�+��G
�/�P]Wiԟ�%.��~J�~B�.�i\:���op����s0�^/�c��_������>Q\f�
+�4�G��5t̻j��L�?~�ʹ��y
-�J�<Cs?��D��P@��L��:�	�t
k#Dw��Q}�;1�?������R�1�
<eد%�Sue�2~�ƏS(��
X'P��84F��~����6�f

�s0>C��xЙOE������������h�4�7�jvP�}��hũ�߄�3�,j�i��0��)�(�'�
+���L5���{�� #u�̼M��`��pEW����h���T�՟W<~�`;۹�v0�Ŵi%��m�x
}�
%��rǘ��
as9��j�j=��7�{L`e
��R�5�:�%.�Z;�����}��Q`�O#6���Z�m/���u؞��{�݌�VlE�ݥ�����
�Te�� ��е/��i��Vқ��b�X��������1��\�G.��t욱k.l{�]��Z��쇰�V+�#
�]L�b��
+Y��<H����0�
g����?�>:��1~6
����ktv
�5bׄE
�g����?���R�X� 
a�2)s��n���M?ӳ��ٮ:e��05&9���(�F�����d�}�{���\,�XH.�&=�F�ڍ��c
~t�� 
!셱ۦv��,�n�/f��:��z43Ua��K����H}$A��+oX&�fp���:9/:��
jQ6��LC

8J�dR��r���u�a���ĉc;Ǘ�N�8N��vlDZs�:M�$m״	��K֭�b�BJ���A�V�S���
�V�1D��m0�؀�A	h*h�6&.ZQ��PG�'�e=:�����������3H�ì�1V�*f��젗���
�c%����X�z>���A4�lsG�X
㰔gKH	�����
;�;Ѩ$� :u�4���2�t���o>�.&�	zg=;�6��%ʯ�c�³�x/�U�|��8fw��
��cn
������i��L�"��.��|�5ը�\�nsL]�:�Yuv��0����-W�x�Z��(m٣f�A�,ǔ��V�r	�����v���M�{�R�a�� G^�{
���jSW�����K��VZ�liD�ҸZJ�J[;�l�WʺPɲ1%��(n۬�m����j�S���"��
+ۧ���:��\G8N
+6
+C��C7�]'��c�aV��DY�]-v���J��~%�uJأj��w�)��UԱ@
�1E��(llV��G!�~��*h<��G
+W�^�k���[�K�Bz��N<Y޵K3����JV%
��K1çF#�#��Ѥ�3�zg��C
+��(�Z���p�V��>Uy���9-�粼���u��7�
�;�\�MZL�3���v@�gi�%���r1O��5�m
+�
ջ+rW��]��'�O�
�W�T]�HU�+��ީJ�.U��q}�����\�Kry���r{oj'�荓��@.�pm�4�$x#�F�E���[��ת�ס�ץj�WU� D�J�[զ��~UT��㟐ۿA����
|EF�pJ偋r����P��Otk�#�Z�!��kR��]��'D���~��vy�*��婩��&.W0#g�G�څ2j��<4)Gh��/�ò��RY�
����cm����݆]
�
h�44O#��"���Ye�P�P�\u9��r�Wɨ�Uy}�
�4t�
�'[d��"kd�lUidJ%�#�DN�
*��\��d	��Կ�EسA�,$!�=���P
�<wG�r6����.G�){�R�h�ʢaY�	���T�%�Hű�*�oRa�^��d�?���*���*���vt�#�	����ih�Y#ԣY
~�}<�`�1���%�%m�&
�$=�$�U��SQ2&s�E�T�
+R��^��Ҽ�{��7��;IƔ|f����R��(� ����"P5Pų
+l�3A��4��lQi�M����
+��
���h6x�VLk+yt+^�o�Jf�%��b2� �cfF��{1u簆��	�Gc�r_ͳʤ�¶�c���m��������f��F���c���oՍ��Ƹv�
D��=d
�/û,��Ӯa��6h�&�5@�{?M������ �&��������|nc����� }1�G�x��a���)r�
�e��m 3���h)m�x7d!���s_C�}Y��5:%U��IE4O�8؇��9\�0}1B_����2yG�Q>
�ˀ91B�4B�6Lֺ�"��og4�� t@
mM@��m���ݍ>���T�𚱮
��ib�8d��6�cL��
�l�l&������q�c|-0'�3/�
�<~w�4\�|tz�����F��aɪ{Y�נ6t-#���Hb���3ı�8V�j�XC
�c�1�d�O��T��
+�3
�
o�c�e}~��z�����.hE7�5L��\�=5�-C�h,�I5$s��o%{sI�
��F�Mı�8�17v0&;X����T������V����f������H3׆A� !s���+��+�z
))"�ö[�/:@�n�dw�t/��
ı��v?��~ޗ��}�S��)
+�k�yR�{���꣯��s�"!����R�t{^sk^�n�h
+Ƃz��8K!L�t?I�!���q�8
f�
e�
ep��#Tx�p�l���C����N.a
0�U��X���R��|�������
�e��>oH
���]�)a�0K$������S��gX'�0ٟ����q��%=y�2����ղ�1@ۏ�k#��VR�+�{ ��@^��y3�xޔ��T'��Y{.o�?$�
��%�K��E&���<{ŋ��s�g�W
� �
�ml�}y��`�}ò{ސ͚���:Lm�`VKs��%O�,�~����c��c���l:W�� �{ś4썓d��ŧp����O�/y��C�/s�
�/d�"oG�G��,���~��~ͤy�I�K
��L�W��W��^/��}�_%Կ�,jg���'��ހ�
�Uf���yw?�6
sZ)�
+��:���2q�����Ӻ�{�Esx���q���~���
&̳�g��cۼ�8��m�~��v|��;�
׉�8i���M��鑶뵵��)�F�=��C��ݠ�$@��c��L
	��ILHC�C􏩈C�����$P��P����}�~���{����<$���%<����t~�n�+k�|>��
�
�ݜ�7�3
0�(_f�ѯ�=���M�gP^ <��?��QR�$�gH�GH��X��x�<	r�/0��{
>O�߰y
ކ����!���$�=�~7�V��!Rd
��c�s�e	�e:�#h�$���>��+x�y��K��+D�gt���������*s��B?�Lm*
���у�_��u���]S
�2�5t��������,���v��#Wȑ��q?>�2�S�{R�#��a����Cd�C����/6��k���*<	�3������ϋJ�\;�-�[Cw��6Н@w�Y4�:0
G���t�7��)T 2��d�	�V�9��
���-hm[���=�c��0g���!��X��=��G�G���
��x��l
'[�p�<��Sx�<���:Gϟ�#~���)�|��{�6��o

'��h��Vt�aE�.��U��F
�&�1KT���0{�l9O�.��:
�H��������:7�Ŏ������v9V� �]7��&D�n�,����n��_G�q��ɐ9�ߏG�5�,N�	2i�x��1��1v�1v�q|X��c
3g9򎳥-s]�y���l����.���G;Q��gYl��Q�� z
t'��]��C��óYI��Ƞ��o�p
�ͳU=���
sp��Q���ZyֲQ�M:,��������6rc�

e�4ԁ�6�ب�7��6f��~f��HՈj�x�2{����?���]��>��3�=�Ѳ�Єq��Q���ϰǦ!�[[��-&v�؉c'��
v�ة`�;����f�L$��G�S�\V��Y<�:�ށ���(�Na� ��<e�4���[)���3,�y
��[Tu�uU��j�-��-�n[^%{�����
�*8���ة�sI9�1u�V�u]R�u]i׋�Rη�R�u
'����k��c0�}�{�/e�Meån�W%�_EOPwT���r�.ux*ʶԕiU�;��w��}G���wIq�u����UE}o�{�z?�
+6�`o�Rc%�
A�=�R�]	_�L�:M��~��O9_ at Y_X_\i#���W�QV��W����Z1����c��)l^Q�|NA��#��_�_
�K��q{sQr�r�P後/E�u�K�!��A�R�G�d�TŒ(n&3;5K�kj
�(
l*ZT0tDfhEf����gᦌ�k2Bo�z��?u
+�7K�3A)<}Pᾄ/���
���Z��+r*�*�5R8
W(�Q0ܥ`k��֭
+D����=$#zZ��c�Ʈ�%�Uy�ߓ;�&ܒ'rW���{;i�`�R�ʵ
|��.����Z�����z�2cAbQ�c����2�e�u�&o;K�~y�Nʕ� g�9�_���;���\�ğdO��1��פ5j@
*P�<�dy�—6��-�ĭ
+%�2�.��>�|�ay�ji�ȓ*ʝ�ʕ
�3ݔ=�$[愬��e�pf(H��i����cc{S���P�2(�:x��$��!��(��*�n�?�/�UK�/w6$gGL����
���*���)r�
�F%O���9�s*�
r� �g���}-ck��l<K
�J��Y_R�o�(��f��g�2r.�tz�,�LY�H�.�E
_���"�S���DsV�Y(� 9��/�wo �K�}���>���@%�!��4����
+A�hߌ�M-]N9K-�u��ma���*$MG+],lj�
j���@���i�CeP���P�o�)�C���$P�n��N�S���!��6J�@e�����
4U6�]?M��S'hu>��[��w�4qu��:�@�z��J�����ʱ��{�-�hAz���<�2�Lr�r®Y�~���ΚE�~��A�!�a�h�66���@�A<�0ǀfq�&m�&А
��ឦ	]�`
ta/��)�q��
�ĮQ�<Hr
�2ā?B�;ꐶq��3�d��h�M���5��I<�4��ɉ����I��	���w�&�V�B{ƛ��!��]��a����6��)h������8�w�7�6��b��,
�x��e�s��n�Y�ݙw�]w4���Ս*a7�5I{�S���u����5�@�Q4�L�)t����e?~,��abr�a��0sq��q8S�
$'�����}���j�N
k��)�
e�A>�a�E{HY�a��Na�V��6
��3]� [...]
Pb
F
+*��e(P*�S�S
+J��/Pʥj-2� ʴ:�ڱj�
3���H�m-������ɞ�t���;��o������el?V��~��Y�pYKb�r�5�
c̉ջ��c,N����Y{���&Μ��&�38���]�p~�ᣴX���,�k�:g�HL6��}?�ѯ�'���	�v
?��m�I[�����-�����~x;g�r�!�q68�w�sΕΒm�
QQ]·�˨#
r�s[ � 7����c?}��&{�������v���dV��ĻH�����"��8���s��IKi�&x�A;�.G��d�#��#�h�^�e~��WN0?H�
��H�3�(�qe3~V�p��N�
�E�j'�[��ٜ;�nG��<�$�����H9��X<
�WU��~�H<^�W^ef\�.�
�eu�qD�I�N�
�ۿ�����^p�᳹��ϏU�6�K�<`�,�D$��+�5�>����>�ɿJ��Kb�&�>�f-�
|
+��������������Ol��������.>�I�Q��Aa�M���2z��
���2z���Q�{u��΢k~��8����	p
޿������z]u
q-����l�$.��%����~�u��9G�e�m�~<G���HOQ0'H�q�o���qt�x�=�;���x�y���W�V�w��3��v/�!^D-<��8�~8��9��:ΰz�A�4
+�)�w�&�>~|?�D�~�bz�":����'����~BiUh�
+^V�Xe��]��SNڟ&�h�q4�8Z�j%v�؝�lj�~��>�^�
��n��.�N�C)��u���}�v��!�~D�_�v���<���mv�\p�ǝ��;�v
�d`�IЈ�"v;�;�eZu&v��;�#��bl/�"V��c(��p<�
4�z"����%�kЙcp�_/;mu�i�G���:ў�؊ 
�@
�EN�A�{�;�ӱ;��a�rX��e��Q��Û����� ����r��W��+b� ���f����8
�S
�
a��@䩾"�;�=�}�
��ll�>B�~	���*Y�o���a���T�1�v���|*8�=���ط�{L�cz�\��c� Ql�z+�۱ݍ�>l`o6

�;������s�:��>G��NU
QuCt�
�~��1l�E��о��kپ�
Tc�	��~
���o�~���;@V�d
��jY�dg:Y
���G��-��e:������5c_	���;�~�σaWuM�C,��lr2�ژ��T2��c������^��y;u£��)TE
��G7Y���.���wm�k�Uh9W����J4f�<��i�S&���Tr2�ژJ���G��h���v�M�nY��m'�� ��dvQn��Kt\�iUd��~E&q	6qݏr�-e�/`5
3��
z�nz��W�n��A�A�
I8�p4�Q�^'����t���UR �Tx��'�y&@#5��Th�G<�����BV�a֟Y�
���:�l��<*�jU�TtG�ꊂ�
+���]9x
+�L�f�]e�\s�u���u�2�U`�Ү
t��<x���}Fu
a���V�B��/�|)n5�|j
+��j�E��5��&���(�̓���N��}J���|�T	����7+�T���,�Y�˲<�e���{�X�|xgq���ɠ�xW M|���(�*�+
+*

+�*�TH*�*
((
lW,8EVp���<��%�Lc�"ƣ�¡3�U��Z��E�
��5���xn�}
d�#�Q�Σ��_�H@�pH1#,ˈ��L##3ܤ(B�1��T82,�Q7�P�&뾭@ݓ�j#��U�#7��/�7�4�IhE�̻
�e@ҬQ��*�ˊd��pE����@��ht)d�4oW�\�Z�n��
�Yߒ�:(�uRn�pE5�
-��|��9�H�.�
+<7���%a����L��f at ufPa3$Ê(d�
+Z	b
���X���>y��$�;�B5�ur%X|�
	���E�Ί}��ṗs&�o/�E�̻,H�K}ܥx�#+�iժDb񠂉�j�����O˓�˝lSM�G�;lq�f�����܆i���	�I|H��bx�S�GdQh- ϻ|I�y"Q�X�+3�SD~��
+&��
y2�4Xr5��
9�g�Ϣ)���
K{��ca�q+�X³��Y�φ�$�/�"\C��edj(�f�s��I>�'ݲ�=�&=� #�U0�?�;���ӼMvū_nF�5#\�O&~���mX�fl�ؒ��!
|�|e6���;A+h�9�/)>�O�&�d\2�5
+����r73D

�V�:HJW	������xm�ǶA��lc�oC
��%K��"�K+>�|��pN�+=`hi�y׀)����ޅ��~�F5}fa��X5	�Z��Z�"�
+nUƱ�3h�:����Z+ne��J;�=��HYB6BIH�@���P� !Ѻ/��N�T;ն�K2��x:�ɇ�0p�=!����������?}f��^��L�R�p�φ��`@Vr����@�G�� ��A�w"0<����A! ��\�ŜԪ�X<71
1
�'#�h�G�����w_��C0"
��
5 m ṫ�`
�
�",B�",B�P�G�b��P
�!�BpS/� ���t���3�Ϟ���ߧ"�$�
�����/��0����`
%�����:�B�r�Xa`F6;X�Ap��ٕ�Vb�\���r>�i:��_PK�������
�-��:�G��/�Ґ�9�c+.q|�h"�|�X�
~5.�5��uб�Fl�
0�a
|x=��u��
��04��.z�E4)����x	��C�$����Hl-
�
y��ױ;'�jn�
i�\
W8tl�-б
k���؎�nA�
�pNlEMla�Y�6�{ר`�
+��Y�;���y8���0�
��_�w97�=�Ec�g�@Ҁ��=�	
�б����Q�R$Ή
�{P�1��j������`��	�<z	� ��aXB�5n���&s�;J
M���BD�q�
�~��Av{%���|�{
,����wQ��G
��\�:h����Ex��5
�~�<t�;�Vw�]�|()
��4�1�#�<�=��J� DQgP�
��6�X
@s �#Lt�G?�zj�e*��{���;�
~���v؝�;O�{(8C��#
�\�
+���F�س٨
)�S�"̌��tN�T���f`��#�H��8�00��;�Iw>B�΃�Vݕ�
�Y�k`������(,7U
+
U�+�'F|`���
	
+ ^�EMB����@n/����+i�Q���'B/ p�aT�/D�;��C!��X��B�"�0�c�r�>�Q�8�
8/l0݊���M��?�xy~n�0���7|��c�ǎ�0q��)S�M����s��^�(d��^^�2l�/W�Y�n��_�z��W�l۾���ܵ{��"�ވ��־�o|���#G����?�����>���3L6��ğ=w>1)�B����Y"�D�-��U�5�ڂ¢�Ci�����TS��ź�Ʀf����f�pvv]��|���nܼu����}�ŗ_���o��������~�O�����D
%�}�y1�<\�'�_ �g��K��<b}���ˉ�_��+�� '����	�HB�M`8 at 8��A�Aq,>"0X�8�d$
D���0Q ��P���p)#`�@�L��6-��F�8�n��#����m��O��@zH(=&����c̾�dݽ��z�~���x�
�F���������Eyy
��=
�
%�����
�G�	�� ��X �'$`(�,�K?W-=C�
��o"[	;��=Q�o�;p0�ȱ����4�Ï?�����!Idr�
�-�bX�w��AWM�1	��	�0
+��z��޻��}�_>x�������o=z��;x��ɓ�O��k�M�����uDT_�_��ba~Cٖs�J��:C
�R���
���Z	�G#������e&\Wf���HK��i
h�0�a@À�
4���
w�|��k��f�dKe����Uh�_ݯAų�s��94H�A��Se	�*�g�)�A��x�Ӏ�	���n�_To�O��*HSo�Tb.�W]���ޠ�Z��A
�Р�%4(��ײ3n����膆��>�n��E���$YL�!�`*�_mԝ�/Qs��Р�
4�y�"�y��SIf�uaƹ���gc,�i��0�,5���pCu�~S9Ѡriȇ��۝+�]��xW�Y��"��Z:��Ӹd�M�3�^��Dv
�9��7�V0��N6CC4��N��۝#�����>1tdBG*�������@C��'�ie$5��h��ͥ�o�t��Р���Ur�S!�\ʖrz$N�:Ҡ#{��脆�ƒn#���Hi�	Кʷ��kJ��
+�A�˱)s�Ny6�K"cwgI�=��q:E�+����6�
������Zg
+�U�o-/�4C�TР�a;�rV�(�Օ
�Б�u9'�_�4
��q��b���f��՚�
*ʶ��̅ڸ�|5ǢT�۳,�8��Ȅ���#Eƾt^�鎗�{<��6�X��jwУ-VZ��zQQY�kF}QL�Vנ���<V�Dɲ	̎�
�#E�r&�ٝg�9]|ak��۝�%m�[
-
��j���tg���p�Zנ԰�e*�5+�ٖ�d���2�
+VG����p
\9��i���Ϸ9��[
���2CeX�ְ�RUt�6� �N�e5�4̖t5Ӓ�b�&�I���.��ps�6v.��iXm�q-NzX��
S^������J���YVwQ�c�gh���Y͉VK��m x*����2��
G��6������A?^T��Ra�X*+��5���j�������$
�!A�nh9��|N'������h
G]ǰ��.چr'�=U��t�i�.�4��'��$������l'Nb;niP�� 
q[�
�RN
��RJK9 IӬ�"���O�l����i{�%�Z�6[�mْyKҙ�q�L�8=��\8F\���w�����ߐ�LT�e�$
(!�a��S�
Ic.4���
��3l'��u�߻x�=�ن7���Ӛ�VTR��L�z�"����_�E>�ϋ�I��h4��X��$�&�}4��9߻����w�?���c�W�{YE˫���}�?
���Q
�
+˱lp���WDL�|r���V\�`Ɖ��
�м
V��mӰi�4l6
��m��{�Pdž��g0|ǐ��0��a���V]ց�灡F!ʺ[Kn۹�l�{�`�����?�)`�o��h@��l��ǧ�"���sf
\޼�-R�tɌ)��N��m-���n��ë�=��
+�5��e�'#1=0h�tH���h�#E��A����g
"�F	��V�h�•��I�b�m�0;;�6
���������7`�2>���A
:�S��
�vI���QĢU�]1��W
B�%
O�Xo����L[��n`�	�`�Q/c×���hޫF'�J��cs�_��+�!��DtU3(��˗�����vj�������Yy�`xN +
1™�
-x��[�V
J�f��
��Aƻ�
��C)�,�ȗ��fjkۭTk���ë����K���
/c�k$f����L��<z��Ң3������AA�h��%��{E"_�(���v}Ðn���ѡՑǀ�E{�v��X��|!
��33Z�Ѳ]��X4�A�-j�ؒB�/K�C,�_)%������o2-�o1ã���{�z��c���[O�v�ˈNـ�6�V�Ԕ*tA�D�����@�]�)�K�����z3�c�7�
Z��f
�۳��{�p�~.
qte<�`7"e�
����Ui�9��
��!8��\$U����ij��ݱ�f��V�Xׯ�Y�!C}��Oł����)�	)
�ZU�:hF����x��T5Lͭ��������\϶���|�Up?G�\=)����D����9��3�}�[Wa����P�X:x��Efq-6�jɺ[�5�|=�홯G�޺�ng��T�~�N���ɤ�ѝ�ڐ�
l]��=!5��F��Xx�B�
+�Ǫ�����hC˵��}��;޼�kaO�F���#��}������T�YإA
{\,|4�1�e
��W؈���XÎ�R�Ͼ*m;��B��R�q
}����Z鳌�ٝ�9���b�Il��V�ȵB%��0
2���qȌO�[u�a��D�ӵ�7�&��(��-��k~����iR��N��PF
+
�vhT at Ac<
+ʓ6���;B�?[�"ۊ��T�a[���d�����dcW(��i	

i}EU��q%ݝ���� p�P��s�
��vd��c��A>�G�z�(6l��j�;^i<�)7�m�}U���ɰ�w>&�t�%4��a��S
�&�Hs�ĉe!�e;�l����[�԰�0ݸ/Wi<�k�Q���
%ߤC�����X��
<p�C#I�F̍2�c`7�b��T��L��8u��xp{���lh��=�W-������
�r��ɓw�͉���;��0@"l?:��Ǣ��H������./����#3>o�����ƮO�W�}�/
���>{�cI_ᜲk�s��,�p!�m�,�g9�@�O�v.�Rg�u6A��$Ⱥ[�5��
�X�=�ښ�Wǖͯ�s���l��w�rl$&��"���;$�� &,�aq��
���J'�=ʲ�[_vw�MæaӰi��7��X�?�ښ��c˖�9�_��
0t��JddD�'�%x:,&rA>'���>\0�EE�
h`��Nӽ���GW�����pk�z����^`x���� ���+W���c"R,��B���q&<$�Lc�i7�_uA�[=k��V�}����;��Ǘ�/	�����b$�fǢ*�	˱\P������W@�i.w�Ef��x΁H�m�j�i�HW���#-��]
��`�0�(̩�

�I��HL��`��

H��w��EĴ�ϙqrxsvB�@��E���͌����:yn��8~
^���I3���m��fځ�6MmҔK�
IJ�
q�C�wI֣�y�G��ﻭ�Ѿo�bK�l˖%[^ �p(t�4u�U}\�?�ɩ��k����3������������X�b�?<1�{B1
)
�����ʠ)��u
+�e;���5+��j�K״4Œ��^�S5�x{
z��
~q_=�a8���
�ie�/��Ŵ�xX��j(�Q@Ө����ʨ�V���f�
=[rS�PԤtuE�h�x{
~���
{����/���ͩ0��/��
���!=��k��[�8�P�&��ڪY��� ��V	$7�
yM�RU�LMo��gn`�#��#4�n�%u��b��D�@��tP���f
*haTI���Ț^ʸ����,��o���e>OU�q�
x�
-�"���8����g��3h.����P�ԗ����M��Ь]
U,*��WPW�2�M��~K(���d+\����+x{���ڍ^o_
=�N�i�o���Yz!�p�g�'�ئ�b�
+Z�(�e�^�ik
{�����d�E�DU�ۆ�a�}�B���{_k_����ӜB3�sޔ�J(6�y<d#d�؞���I
.h5`U���J��UPW�
+�
+]�_f���t�����--���}�
���l?��mh�tƛ�]��k1�m(�@SV#8��S�ZʂDC����"
�	�Bj��]���*�QT�v?��r?�m����c����
o����G�#'=c�3���#�
�F-��D�Q��L�
u@��Y�B�P���Q4�
+�-��^�u��ֽ��/[|���<�7�Ƒs�p%'
�Z�f#�,��՚���D�ɳ\���S�
8��2�C��:v������D��o��s/��{롽�K�����m�x����8dG�R!k�L����B���E�	��)3T�}@�Z�d`����&�7�+�ܞ���}}�}��}�T�UK8����=1��%
vBFcr�Q�p���X��L"�l��*���"�D�&��[K76�ٲ���m�~��~y5���L�
u?�=�Z��	��8���
��0
k�cw���y�b��d+�@�"�����LCӝ��]g�^�)5Ah���]@�Q���2���8����
�4�N���`��Y�e)68G�Qs$�#�⯜mh\�l���t���r��B3lH�a��O$�+a��FT�&�.J��R�L,�	��N(;�1�	�Q
�1���
v iҷ�4ްin���|���b��-dY��~��FN좃
��a��
/a����i.(����I
+JM(-9�"IJO�E�|�3�٦��J�/
i=�������#)}ȧ���l�
�1S#�8�N����
� ��0��C����
Q�=A����D���R�.�Z�;�[O���j;r��
`��aR�4B������NuK�
}���Ae�A�9N�\ˑ���(��,��$
�fh��w��&��}��G��
'�����E���_���y�عr�Xꂯ,�@.W����D���a���ι9���9*�l	�-�qWG_h���w�퇎�-?k���׽�ҏD�.gF0�
QI��������Y�0����L�,�I�\�(
)'��ڼ����[p��������jx���څb��mwu�Ve��9A��{���@RB
�H,ʡ'�L�X���!n. &��⼏(+�����Aݤ{�4�0�Twm^�Qw
8R���vW�~_UvJ�v���
oJB
+&dp$&��#|$b32A:3�9>
+��%��<$i�CPM�����Acqd�<���k[cݍ����G��
���ۤYѧ���ۗ��	9�J����6�"Y?�1ᣱ&=���3.�t�ET��]�J0L	�)<������u�p���}
�'���/%
��hT'�bj&�����H�Cg�0g��d�sX]���sF�aFG2M����P�`3�
n�c8޿ ?)�J����._J���ȱ�N��p�/��\ڔ�I�Ai�9�_�S����b$k�d���l��Sݳax3���`<�_V��夗]i�5_J��ov�+��À���
5
R!��ڃBҦn�u\�#�.��@33lp�1�%Y��K�ִ������_�[�l�6�$��4�
��_1�}Eo}������O(��E�"9_72����NƘ�ɞ��x%+,��C�T堶 �#��y�{hX��`{�a�4'�ĝ�7�PeK(�"��*$��}�
x�-B
+N
�h�J&.��F�%9�*J`mA
�G*����Z����]���i�;�8�EU͡��k�t@	�{d�K��م�)
�9k��~�a��ə��
��(�k
B�~���gx�l؂�k�N(�?��d'�i�i/�i
+Ŵ�xX
��jx�W�:ep��C�1u3��D�r~Ϝ�K6-�('�,�e
S��$̻챡�l�o~lP�����u�՝���xXO��u�`�.8��YN��J�db�=�5�P:��)'��4c�
]��
|kˆ���E�����+��؋�1SK<l��}FdХ�
5<�S 3rrETvp%�9�T:��VL��1O;ZI�5x�Ǜ�;ƭ���=iN�se��<��T0nk���Ĵ�
�tP����J%4%V at 3\�
+Kƾ”w�0�)F�z�.�*	�-���ה
k0�&�
��Ģ�]i��g�|�7�8�O��섌���ШF
�K���@Nq�4]����iD%�D�qX�-T�c�굘wC����w�	�I�q�#����x���q������A��+�@�[
�q5@���&}T�'�j��U�jM��0������5�o}
�z
w��Ҥ����[�
{4p �v�KX���L���@�
��Q��L�Bc��j��M�8Y+
#�U�J��Va��k0����w�VC*y��C��Mh�mg��p��jL줌�
+��,���:�5#,���QP��v��?v���
=�J‚K��Њ5X�5��Uܟz���x��?��7��c�
���M	���Rځ��J��[�~�`��A�
�&d��H&Y#$c�0�$����U"�W�;��[��e�7�u��C��+fsp�O뭍(��rW;*q )�
�tـ,���V���������� �� X����ދ-]u?�z˃�z�͑eu}��4[�u�*�/ �օ%��1��=���<'�r
`���4;���p�#Y������v;G�uV�\b����KV�
}~�����]t�;�Q�oV���9E��A��b��!���@��
&X.(I/��`r"(डT'=Eq2Rd+Erp*��Vͻ�[���}�n*L/|'t{q���

݅-����*Zkb�>��"mnf��:�p �~0H�A�\^�0�K
����Ì<�h%�����\�|l|����5���Z���س52���C�Rj��=wIM̶i���5M6��(Ƌ(�Ԍ�
I�Ҕ�-�&h��8�VI�l��G�,M�����%;%�_<����3��mɟ�!��
�J��-�΅�&nc��~/l�E�#����aj��!Prj��
�d�
0+j�o����U��7�*Öo��6���
�|��$�?6��:��x�_����󔺫����K`�L|b��
���>*Q��J ���82Eg
�`�*)=P���3�؏6r��[h�/�w`�}����o�羣�=\[����u�᣻���nj:|����Ͷ�o�Zp7ȗ|Im��K��u��:�m�lB%a�5�0��as5�ޱ���wDGI��^�{I��vx�\�/��$ٝ�����h
�c
�D�,IFI�d��B#mZ4�7�"��T�Ձ>m��3��V?1�Y�i
ޯ�-:B������}�K�y�/�e�
N(���^,
+�ю�d�,A#$9Z6��m�toJ�Zmio�=��a�����qS5�ݾ�|O�����ӂS�a�c�O��0��.v8���h�x�'#TQ*L�I�H�L��ʆ�t� ޜ��Yޖ~�0˪�a�
+��аm�=�ć��“�!A�)# x�B�1B	
3��QFg2�R!@�	R��`�, ��}�o�w�Yr�6[�iì+�a�u�c�7�1��'���R�	��9#l��D�����
��}�q�N��ܱ��qZ�ӝN�U�z�uu�k�@�zW���EAAP ��I�\�Bx $�����F�$@Bȅ��pAEV�Ժ9�;�m�-ʶ���������?�
��������������*9�M��8b�ɢv�:j�h"(VV��@��ߠ���T�e���i��4EJt���Lp����avw�k}n���䅜4~�����1+�=n�*�(N
U��
+<L���;s���YIN���iBx�6���
+�_�s�Z���fF�G�������ܰ
��Z)H�B':�!�T�Ur��_JD���o�t$
���H�\$�\���V����Q��"F�a�]|V��aG�
^�j
2��#(Q6�"*r�*&!i"�$]0��
k�
��A�]0ݺ�4!>�DZ�р��/�rz[I��V��-��9�~��`q�L4�5�z]E�����CmdULD�D�](Հ���������OICV�t�^�D�A$"�C�
V[��+�{�$��SL:��Q
�1h�G���	5M|CF�^k�ʇZ��x3UA��P��i/
�
����n҄di=�ۊ�~i��+�z�d��%�C6
�@��>k\��O�X�["�d���>�Еq]i��B�6gx;iذ��%
�
+gd9�	�
$*�M
M��//uxU
�����a�����k�f���R�2�ȕ\o`����*�X�(��
�0,OƤA���q�����.�<�1*;�
�O[�T�������{�j8lQƒ�
�.3&�B��a��:A�8�/��	W=��h�S
�g�� 4IC�΢���/�}ڐ:��=k�J�]�*�
��
*8�l�]Kh���-nH�6�j����	&_c�i�S
3Ҁi�r`xaؚ�D�y�]��Mݧ
1M�&��o
+Zr-��s.��j�)�kjT�A�
Ad�GO�۸7`�p
�HG��ܤ��M$Հ�!�o �?f�*w��m��2~\?h��2b۩z�2�ln��ʯK� �@1����'
��
TY�Y�0F��G)2��U���h�Ӳ4`^���2�nK֬f{�}�V�m�&�p�ҁ�-Zw���Zܥ5U�Uz(Ԧ��MjJ���
m�3G�r�A�
��A��%�h���4��
`Z�	�����lV��y�1>����g���<��X.t+L5�2hA)�-�h������D{��b��8V#�aU�h���%i��2������4�!�_]�+�.��
x����k��q��n��-1c|�Fȏ�`

+�ju�~X
G(ZF���
�ixX� Z�E�u���i���2`y/7e��Z{�~dU���b�k�"UW�Y��s��e]-
�
��5� ?�H
0
� M�((#DDYa<�	c��0E����P�ۯ���e���z`]��Q`����%y���$4�)l���	���V�n�b�
��:3��6�z&�O3��#��dd�
� ��
`

�cs_�Ǣ���|)p�^��g՟oM,��w�9�ԛ$Ib� 	�i�{����e�:'�ɳ��
+��e���;`/����L����l���Ś�{1f�/�
w.���{ɒ���}�x}c��뻬�2
+dw���6����M���f_�����=8=�M4�<d3�
Ypn��	�j\
[��e��bۯ8��
+'?�nu��lֻh�?‹�Do.̴�.�V�{�df]%{j	
���'^@��-��Uqu��j'�
�/��� ���).�ѕ�}LU���:��S�7}���k��#��p��r�d�jz�^.���"���*���`�N��nR+n�0.���J�*��Uq�G1��|]����0��?Lm8;7�I0y	Nc�
��ϋE���ƫ+��}�
V~��R�}���s������ߟ�Xr����+ߖV�S�9��+��;��S_c	'��'��"��OQȹ�i�c�
��$��jѾ�W�C�j��-K�r��[��
x�#��=P�ác�
?��8�lޣ‚�K�����±�%GT]<�=������C�H��A��—��eV��T����+���^��˹`�;T�v=
l�\>�~	|�y؟��~u���G<w���
xz���ي��Sg�M� �'�9�t���L&)A@
+mBS )`B���mh!1���Rc�ӒeY�u߷dIֹ�z%!�v�]iu ��pd0!L���̐�$�̯ۚ>�? ���ӷm�
�H�
��oz������ޯ'�|%:��W�S�����
8�#�^�87Ѐ����`�S��ӏT��]�=�r�{L&��u���~C*�gN�{�i��%8�
��dp�?�3 ����x����
�\�ahe�
eh�
��jO�y��`~���R�M�OU!�KrU��h��>���D�u���38lj�,J0��pz���T��~��ޡ{�&`jm��
�յ��k�˦�t˸��("�R�(H�ɼX�&�Q�oAq�
�q��
˓�2�,
�a�h6E�e��X=7e�Nަ
;63e0�u��O����ɧ4]��jn���H�"Q��RĀv�
ߌ帶l���a,/�1 
�G�#���
Œa���ܔ��>ehi�3~�1k<ʞ1tȧ���i�PQ�'5�D^�LRM�l�)��l8�q(˛G�|����
��0#x���eX �+)�z�
���9�Ys{�xJ1�?o�����'u�d^�H�2�k�����<k>�q2,9ʄ�q�0�0�|���h����ah
e�>o�
옵
fϘ�+&�; [...]
+%�
��h�>�鵐i���f�qf����b�5\��É���ߊy�s�&`�`���1k�{�ڦ�4�vT��ᢁ
/���A�ɩ�YL�"2B
��5��=�+	v�:̂*;\�q`r�!�=�\=�
���y�������c��ʚq
�OZO:���ᢉ/��)�,�du�
�P�bM9�7�Fz\W��j��z{Be7&�H�΋��	�(�����
���un��̬��u�yP>�8�Z?�]�'�[E(f��jY1)QU��oh"��^�jN^�l�^$o�Gs�4o�-��Ҁ�28��>u�9�Ƚ�yh�l�u�^s��K�O�3�;(j��zIyD.�
�A�s���\��5KT1��E� ����7�� w�>u�>����3�
��m�u
*��].�������NQ!iWcZ�DX���
޲=7�B��^Ut�pQ+.hD����2�-��h�M�;[���l��'�Ap�d:�d��;
,{O�H���g�����p�j�]<�5��jT:�h�Cj���J
+]QI�%�d�@�����
[����[ߎ�A;.}�߆w���[|�pRB�\�G;���A���-��٤���
��}S��KU��T*K�0)�!D=� eR�oh`�2x�o�.���cxk���{�w��t#;]�ds��=c�?�bv>	k6�`B��:��E�M��{M��DZ�"V�E�
+��Ӽ�g�w�o������2���o�M�{�
�ir�e��Ӈ�Ţ#�3P�S
+	��}���f�j��;8�wy��m��>3tE`��uÅzA� Q���ln �w��G6
{�x�����ϫkE�7���]�H��H ~������5�_8��ɯs��뜀g���q�+<k��k��z�ʰ�2�Iކڰ���
����ꚮO��'��6Lj�!�D��D
Q.aB�2,�� Q������1&d�1B�*�U��P���z����/��i���D���~��?>��>~���?�>].L�m����`�=a
���cܜ>"�ˑ~R�J�ai�VUXaS��/���%(\bxa��@�
@�Յ �e �nH����\�tz����K?��Y)�ƶX
�f�#fHv�uq
����Ҩ�Fą^DJ�
+��a]��XH:�$�?y
.��d�_Y«�����Ѷ<�����/����"|g����v��tȣ����L�eU���'���돉s����F;��3����
�����@^~
�\R��|Q{i��K��|�
�;��yw��p�Q��~��z�D74�� �(/�����	vj �H�R���twB;ڕ0�^L�G;��t=���@�A���rɊəū��K��~�5��
�
�
l;��ζ�Й����twfe��vu�V@D@9��\"�IH"$!	���"	I�r��Tģ��]ԭ.�㮀���:}^�E_|�^<�<�~�$���g���oX7�XMs���S�R�8JI�j��'��C����=�
r��[�k1^�	�}bc�O����7����_my~{`aa�G�O�?d��8V��9Г×��;��-%Pȷr��
�|%��jMk�
V��"H+&Im�Ty�x��d��,
c���T���
+1*S���]����S��wB?6o�?�����>Oo~~���������Z�J^]�r��rj�����[���E
�ۛb��.�A�\��Ԓw��ͽ����
xY�b�N���
�8�ww`�{-C����p
�lI�nF�'�L�Ǭ�/F>�-/��,zT�B�^������
��O
>{��.�����V�~1�
��v��tnYH�I׽{Bc{C�������:
>g�ώP���:}�$%_z��^���U�S~n�ˢ��e����Ϫ�������q%�k�ҔIe�?R˒�6^L|�,Ox�ri'�
�	���ޥ^y/���	>9� }�Ǿ��+���2�2AnB:@$����dP����������Ɉ�ğ?�Ǐ۠d�~u9;�3'��ܝd}/Ds;d~��>�O`��?T��.�@�WY���4�v,dG$���xPt2\���11 
ЧO|�	@<(�1>0�n�N\x??��G� ����	�)��e�U��Mu����ƥ�6�-�k8�b#S͢���v�횮�馐��J�~�Ү�����*��`w��o�2�`�i(�`���!�8)��:���W���@�K�����D�|�Ъ���j���)��{���g�3�Wzǫ��qd�q
�1����>��,��
��A�����y�-�"�8��Yh��f�NS���%�o�_%B�)�X7�o�Ƕ���;L������ye��T;-����

��D�A
 ���
���

�p�[�Z�T��	ͷ�4�zS>Kk�L7tD�a� 3��f��Y�`�l��^{��j��{���~8
&x@��
��� ?=
+�R7
+��E�Une�2�^dQD�L�r���9I����[M#D�%@P؆�~?V��N�����
8
��o��
@�A$o
�@����
(�pM�@��/6,qkً
�x�դ�f�u㍼�*d	�%v����k\C�n������\��ӂ�9�X��g�h�
�?�)lń(9
+��R7D��k�P�Pq������Kf9T�$�Y?���.
���c�(w
�5�A��3��x
�ی��{�6�
gsv��`�� ;���l���lH�k�lԪ��a	*�,�ђY.I3�����8�a���O��r� ��7���91f�k�p�oui�6�����ٶ�0 ��( KJ�lK-Xo;_�*�%/�K8
P��*��c�K3\iaY��<�
r��|^|ǐk
2�L�=�>_����U�SI�;��
6�mN��H OH�T$�+�U=Td���웒r�l+Z3! ��6?��9�(�zI�!7�3`�z�ѯ��P�^e��-'ڜ2�������a@d�#��LҖ*1��:�H�F�מӼ(/�J��	�pEH��y,���p��W��t��:����;��7
��^)���m.����3ȷ
'����=�Zs&�6��qg
+�6�q[�ͷ��O���G$$�_�py�
��"��!hgT���6�! !�E
f_+��Rl.���[�b��u��ũ�@���36��.��}"~�'��>�]W�6���
S�L�
+��
1�f񌒢�Su<*�q�O���h�fuqi6g���A�m8�%h?�w�=� �Oe�4Ĕ=1�a��$P����[���k�匭�sH_g7)h�v!oF�VϷ0�&9��6��g���t���du��l�`�5(�
_�YT8PG
]�����s߉�5{4�;�~e�l��H&{a�L0�Ejm����<,P���2�|��s����sz��l� �e�1�-
��
+��?N��٭�<�������T3���T��TN���ؔ�f�WZi[�y噡r�x �((�x���J�� ��!x$�)���ef5��5M����>�s�����׏o�P�ʝ~���w8	J��W
1�4G��u'��C����0��VЮ#�ԫ�%JFWV]� �R�-fE�`����%l�a*�2
+�
��&
7�Ym((C
U�5X�B��~�dgr[7h��~��
}���hč87w*A?������:�Lڞ�6�4�^or]����������҆
�Xѝ&j�L/RiY��vCA���)T��u6�Ae}��
+����{4�8=��?p�k���������b�P��Vg(3���]��BGi��K��{h��nzicg�X�e�TC��P��	T!١} ���փN��t[�>59w���#;�vމ)��/
)+F
�$ev+����Ӥ(󻒔�.�R��PtSj]���Τ
+eGr�Jc(�D
5f&P}�j-~�&s�w
�l���
&���n.Y�h���)�
Y�Qt���в�
�E~���Nkb�r[iWr��a;���=��VCjRic.���Tڄj��P E
��&P�)4����6_������.��K{OkV�W<>D��:�Ew����a��>r�:����lH�d(���qm���6�r[uKT[�|ks+Au��t�pP�.�0��Vh�a����f'��
,�լ��R�:!]:� �se���p�1"�@L)�F���K�%t��ەYݑ�@��	�29��
�!��kZ���b���.���zۖ���7.nޭY�����[��"B��>�ߝ�1��c�E��G���C	�z)�?�"�W���Wc{5:�
��D����UՄ��/
+j�DA�?��i�W��7l
Z��7�ʷ��;����[�����%���NJ�d&�Dr�'IY���\�hR�6�0r�-��ʺ6�W
��C�`}UI���$P�,1�oDAÖ/V:���e��ņ-�����`�,���o�Y/ݱ)�|���!	1�i���Tܽش��D���ι�t^�73h��
0!���-��/��
����]6(֣��5�~c#턉��ӗ�R05�n�l�:����C�Ly�!�
�a�1Q�_��sO�q!�)��%5�#�����03�g!����0�̃�T�����2��^6��:ע4C_��XW	�L�����:
�ip�=<��U_��A�ޝ�
�[T���X��+j��Jr��K&����x��?�<�pj��xrY
���
+��F�֠�uF5��1�x�n]!���L03c��y8Z���,�v�cAp��B���
^�G���ubϜ��>��'>�������s��Ca����@Ci4kP
z#T�=�� �sa�Tؽ��;�`�����f�
Vg��
�� �;`
� �x
�N�@vv���G!��	R\
!�p����
�J�C���Py���8��Otغ.̾���߄���?�m?.�N�����8���B���p�D
t ��=�~��8+[�Z�!H������[C�k#`�X
���0�- -�	�"<�A
+|G�F��1���<�SJ^�R�0�!Y��@*��'Ve�.������a������
+f»3�����a����C����6b�@

��F
L��r��p`E�eR�+)�1�h����
�"�0�Alq�<���T�;K��?C�L�ES��T�Z8q]41(��
�n	o�o�>dl2.b�"�
��>c	�@g�aЫ\B��X�K&=�ה��%?}�*���_��Ŗ�͐��i�ŢIb�h�X<��"��� �JF���A����0(�&~>� ����C

���e	���C�f��pc�/ش��LV�bJ�-?k.A�7_"���NDˊǣ�%c�ƒ1���;���;���A�Ͳ^bYgT������2Cb�!�,OK�=�
y����7�����D�vZ�C&�3O���&L%H�q�1�����|4JYq��Zy��-�����>i'�:�O�J�|�C�>
1d#�LĐ����3�ѫ���or���ٔ���T��Ûc��M'M$��c����ؚ�r]�0IU=
u�f��#��� �Ȯ���Z�T�!�΢�<�0��ZO��sj�Ӟq�ku�Qj-����"eA���`	�@XB$d%!@VI ��%$lj at A��A�
V��
G��;ߙ�uz��ݼ�</�W�-�D
4�P��
��Ƒ-���
�aX��kSҞ�d�h�����[dj���Z�
"Ox�� �ɤ��+�3
-�:�����]�VlW�1��U��V��[�T�P��Q-h%�B� 7< x�G?p��_�1g�0�����;U$�x�9ZB�_/�4
�	��9Җ�X��J�Q��r�]�N��l��8��x�Z�w��N������̆�P
��!��?�G@�ﺄԧ���)f�=�:N+eyʫ?�X��|A�U�DُS���VM'Ρ��8�Z�C�"84���<��&����n��@G
�}+��/ԇ솆�Ph�:�F��L����-��ʡ��I,��~��!
(�k�˓�_�i����o3hrme
bh&"zi�]'�wh�.t�{
�P
50Ps�
+o������𘷢��ϛNb
+�
��eR�YD��^Z?D��^)�.�u�ZB��5y��h5K/X��
6Cc��u������wC-j`�]�A�@�=H
���w��KYL�#Ib�dSj�O�l�?9���������-;r�6M��֜o��
,�B����f�!�:���:o������
X
{7�$pȃ��p�Z���Q�OZ�I�wd4Oc
�
+�,�մ��s{��.�`p4��b�+����6#�1�K=�Į�Ԡ�Z��D
�=ˠi���E�~P��
?�
Oy���N���9Wz���J�LJ{+�m��:�%:'�l��J�Vf��\[j32JmF)������
`�j�/��zhٽ���
:��p(��XҔ�x�D;lN/�Ug��R�X�'�72vu����sUU
U�&[�b��XMU6cUb@�{���ų������w�@��4�����4r �+,v�RL���S�}��b�>�٦$�DbR��f���w�9Wi��Q^c�UT�-U3�f5URm�J*��0P
5p�̇ƝK@���ޱ
��C�?�
+��
;61|��������3$�-�!��x�UF1�x��&����(��b��JfX,�t����f(�F�ނ�Og 5p}��o1(����f������������<?znFE_
�O��1�ʮ�!��ѿ��L�W����V+GO��d#�͖��\Ȳ�j=�a�y
����x�A�u�|W�qˆ��m[���w��w�vH��Dd�k46U;t*_ܗBc�d�˜Y.Bn;geR�
+s��j�l����V^h3���k��s
Zo
5p��� ��w�l\�
ٰ�٥����\빽{Ǖ���;��nE��G�u?&S���>|Sv/�%��V}�)�$;͚�F�.Meם��u�EmvC�'�h��QCݢYа�sh]��,��^�trx�77n������9�7Lw�@���,�Ddu,�B����
 ��%�k�{��=���e�ե:�u�S�.u�ܥʐt*�
����ڿB۷��/�����7&V,tOm��x�}������ 
o*�<�^DA�xbyލ��0��>P,8�Okĸ��D�T��6��.�HO:{��
9F�#OV{x�A��W~�%�=���3ϭ/?u��l����m�Wۂ%/���=J�=:�U|?�H���d�eP2<���EL���p�Y?���
h����1���
}
�־Fo��/>дp��y�7g�3w�{j�<���U���m���v���?�6
�T��Xq*6;��ϸ�AJ��S�+�$����<��u��	#j��6r���
`D
3���,o�p�H���
���O�m��\��ekİ~'��  ������g���g�=�`O?H'���O޽P{�\3A+���E��%,�a\^~l\�f/�Zvll�k �������sip�����9*X�U,_Æ�۩�#���߇Ec�DǧM�'%�HNIx���+�\̣����$l�/�ptl���%
��17�~K^�}
1d�N<<y�k ��g�:ӧ�w����G3�/?��_͂U�V��V������Y�
+Q������:�j���8
@ϙΔ���Zt�V[p��
+�
+J����,ʒ�,$�@���D�L�$ ���Q��U�"{A��(��"� "Z������3y�������nt�;b��7����i���\B�+11쥂txNE���%���!�fZ�s=�ycr�̏vi@��~Z�j�^��������֬̆M$�k
�ەA>d8⇃ȀX�
�<&(G��dl��1�?�Ƞʨ���1���3
?��
������3v��jjqB�n8�J��:j`�G'`�21|��
;7�`�&�o��P�h�
1�G a}C 	
)ȁe
���d
D#O�/����6������
�P{]�䈪�F�
�(��䠀�K���c�.#��K<x������z0C |s �l���~�wGy�~���4�����;�@�kdy��n�#���֊B��B匣P2��
>q��gK���hpu�
�?ŀ׊@ؿ� 
tAC��}��"��c_zA�W;���(v@��ہ��;�\�B��Pn�
��
:�w�#��-����y��a��~��	���C'��z6�
UC���_�����
+�
B
�9�t�
��;���{�p�?
�*���N��N���&�	n�

+n�������lw��
p��?�8_�QC��<
+Lq�;FV�k�)�+�>e�RƜ%Y8ω��g�z�4�Q0�kMa?M���4�7�q���1콌!�}�
�X�u;1pC:b`���!7Ey��!%x���„�Li�������RK�33o�T-�"֋�2��$��+�Il�l2�_� ;$���'�I��$�ʻ���厐������7�Fz�,

���\
�
GN�-M��"Eǚ���T�`�R%~B��L&6�
.dN�(&p
�G��~H9�8���8�l'
+�����]��m��E
�P7Ȍ�E
2��&G�rp��I/�9��iγ�"�Sz�x2�*}L��|DjP�'^81Nh�~��ʾ���}�8��K�� ��i���i�1��U v��p�9��l��	�Z$���N0g�y��4�x2�L6A�T�'�f=$7�< ��Kl�
#���&���s�)��'
�/S՗���
@��	��A�
+N��*��1h��b ���d��|�
Q&�O%x�ΗL��(Ɠ+��jU�)
�Q��S���4w�75}�M{Ҁ��6��D�6%h�'h
ĈA�D�A��
p��
���m|(�"F-����l��Tže
'�Z�8�8k�aV��m�F������wI��I7
+�i����~���~���~}�F�Y;A�2��	��Π�q����@���P���B �^���W��f�ΔT!���
sF������.��
Jsѯ���z��Jr����И�k8��W\��+�e^_4� 1b� �,o�
��B��!�
�APw�}A"���N�Uq�SJ�xBrR9���
a�C���۴s%�Ime]�+�n���n�Yf����SV��)��)���
��!c�H�ɽ_��o��C���P%���
�I/�
֔J z�P*�5�ani��Ԛ����>Z��*��|��a9���8�fkz����.7q{�ʹ=���O
@�d�A��
(F���0��a�D
Y0�
��H ��R'u
��J���P���
+
;�-�ִ�WS���Xm�zN����f���+��
�2~��D�]nt��1���k%��~f�o�2�
�0~P�y]�܊�?����K��
+��
Չ��LM�eQ���k�j�\��r�U�[k�תK�mV����H�aы�LzqW�b�
1�C��O@��s0���
+�&�����߷ua�s�Q�O���
ԑ���Le����-Zy��
Uq���R+���
+�Yg�ԕ�[j�2Zk�kU��6�N�Q��t���.�bA&b�#�Vg���
L{�B���P��z�7
����C���F7��}���V3Gv�H�wV�e���U�+�mŲ�.�5���[�4�m���y�6k���R-�4���UN����<W�e���q��h�w�wϝ�}򯈀�+����N� �LR�b�Ц
)�skк�8r͘a3�$gR"��
FB��0�M�U�D�)���M*�W˦ҡ�=��?0�^??�ߞ�	8��&�6�
�U}�|kY
�� ��jNve~fI-�[����4�
�
}u���^����6$䥉+PI UA
+R��9(1�B�N�7׆K�/�v�o��������u�Q{�8�7#�Ng��&�eTd�֦�T7&�t6%e�6$g�եd�פf
�RyC�4��%��ІT�!KOJѿ��5h:������.����qƳ#^؉a��`o ����t=�\E���ˢ���
�IW�㊅
1ŷc
������&��W��
�J�U��
�HG�І��7��XjMv@��o��\�ԙs�y�����(���`���;�0Q����\~S\~r]Ji�(�*J(�
�V!諍.�9U0 ����4\Q,��x�\��6����\�MPi�
���P�S��ϯF,~��î�)Ӂ	o�[#d������^ΙK�ii7O�ĵ%G�d
��˪��m"Và�p�*�lHU2\](���+;�_"�n�.�P�-
�����KW�X_iz��h�V��_�F���
Z
�+Ǩ��bV
o ,)�7&�D����.~	��Ҳ���唎{��kb�F,��W
Zv�,���Ոɀ�6d�
W�6@ݾMЮ)�a`���cm��Y�m����s���͸;�<'z�<��'�I��nj�L
���E�sĥ~��$�B������ђ���f�X	G8V̩+�2�HA��:h��k{d�v��̍+I?�U�
\4P�|e�ۺ`o.z�+��'�?C�'����~|*l*�
c215`��#M�e��f&��>#�rH��������|j�x>�A2�
9�1P��R����o�<�݂x�.��NW��@��Ʋ�5΅�ʃ���vz!0$l�Ŝ��
�KH��H"N��_Ԥy=�H�z�g���04�A�y����,����Ey���٬,��G} ���"}�b�g}��OX��e��e�K�'!v�D	_�0Y��ǩo�"ȋ��ą����s�^����kJ86׍z��99���`���t2~@2ȓC�B
yvK�߿靐E�?)�ԯ��&X�׺��5�\��L^sv:����F"����e��d?�	ƿK	�\⇻�)�t{]u�e�5�y�n4nq2�u�e����I��
1�@�&d�	��t�G��e��ɍR����R�؞Z`n�v��b��, �S!O��"�������
+���Hu��
r��K�}*e:.װ�~��v�x�c��O�ѥ���$Z"��o��
i�eLMo��ʲ�@[�
F{�^
ؙ�Μ�����
�.�z�D{�@���
�,����D۵r��Z����
?��
���8�r�D��݁A�
b������fL6�lL
�0V;f��`�K���dp3% 
�	d
7���
l+G�q@�#[8ko
�G-��x
+�,�
=�j]��
�b�O��r��T�!H�4�d��T2���-�p�Sb��j ������'�t��C>
���
Z���M��ISs�?���Ç 
k
+��L���DF�r��$j�@�#H�$���C��!ױAU&46Aw�'�(���vG�U��Nkp��+����o5S�B��!J�b�
�D
}��Ӄ���P��*��C�D�}��qI�E�3� a�Q����*�q�G�
t7Z��#`&gV[��VpV0wE����Jz@٦

�}�}/D�І�
�����.�ݐ��r%�`U
0���j(�6
+�pUa/S
��1f�-����u�%o�/&��|E�@j�� �R�|�i���A���
+~����9�_�y��"�
�-c���>CzϐBT0�Bh2 at E��jp
�B� �e�(;`�uz�P/�R�
�e�@�����SWI-A+�v�w����>�o��/��e�<{�g��@|˚�]b=�{ǖ��
lMi2� 4k��p/
��7�0��D�'���^�'��
�Rʚ���B���ka~�mg}#��|%��#�3a&�����ϰ&�5���==-�:+Z�QԣuTD+�ʅ�u�Bf!��
�H�,�'$!�Ҡ("e��(U
(�L�x at e��(λO}�����s�7�i� �/l��>B�G<s�g5Ġ�f�m��>/`���X�/Ш[���
D��Մ.3�#6'�=�0�]�	���3ĉ�jқ�:��k�����c�i�!�i�{J���FӚ0#N�I at Z�
+��݀�������������xr �9{�"=q���H�{\v�[laSBz
YF���
+�Hz�1��|��
`�D>e�1�̦����X�
5�Q5P7y 7����@��?H�
����@O<
���qzܻ�,�\>�5�F}�)����b��_d���

��<	�y�`ۣ�pna�p�E?���t�ݦ,p�8�����9 ٹ��i�$��,~�'�<�=E���3��c�h/qǘc�Ӭ�*�h䥄g�x�=�?1�x��~�M\��!�_�;�_�[�������
8>
 �yȷ/�5�
�Yt ��A�c�|bI�o���#�e\���=�;�0��
c�Ñ͢G���V\_�͘>�؇�:�Cɹ�>q%�y?�h�]����� ����z�jPo�4L �	A f�~�	�'�J�8=���le����C�5�Q
��Q�I�^�M|or=��񁬊�@v�ܛ|�ܛ�,`�:j��p���!u�l�,���Ap#��@�䐏bv�/����f<���#�|�`l��	�\� �Qރ�R܎�V^��N9O�J��t��Q��'i=
+�G�,`Ow&���� i�נ�8
��`ڹ��} 3�
ѻ�k���J&��DD
�0�
�G�
��M�I�T:�
�wc;��
����rj���ޑnct�3:S
�])��l�G
�en G��
��`�2�w,�� o�o~g���1����Ag[��$�K����i�Py�R���T��'5kk���CW�l�Ƿi�Y��<V�*�ݙ�,��m��
+	^S u�W��̀�-� w�R�۽�C��W�a�#��A&RXo�H�0����H�eNNZ-�D[C��W��ӌ�x��P�n��r
�ln�6�ۮ�$t���i.�B
��S@�޽��� w�',��_V�)޷a����B���<�V33�N���"�&i��B��<�0��]n���M��fS.����kA,|���w��6-"hW;
P{�+$�w
+h�	V�o �7����m��؉=�O
��;��~1���#��+�	��4R�)i��$D},1�pTPj:«�d��ZL�f"�gԋ�
Q�^'r财�g}6pP��q2��
r�=���Y`�<�M�V�ggv��8���<���	܁?
+ȸZ+�Q���'5
+Ea�NsDfEL����ƪ�4ei�w�jis�Zڂ��v�J�ХK�4�
z[pQC���
8��
�m�����e�����
��.�[�Zuxˍ2��ߏ���2�Y|A!�,�֪5H��(�,��_��[V��E�h6)�-F��nP�Z3��mZg�o��+ȿ�
��S�����{ڻ3g�V�4w�n���K�W޹p���}�J	زc4Zq
��mː�T�JoD��|�D]ni�[Ū;Iz�I��bLJ����Ɋ6��@�PC��ɐ��ū��Sk<�+���n��װu��aNJƋ����[q���R(��X<c�(YuD��Y2
��\3�x:�e�j� w-��f�@ӂ�v�(ݑ��֦u�g5��
Y2l+��T���/.��zએ{O���;�ۗ_��߷�.lwi
."�,�d>��jl|��(9U��ѱr�����fr�%
5���0�3����o�'�
:��M�,��s&��[W8�n�R�)UK�]^6�a��֖
����6�X~%dg�El��|
AWIg)�E��
+�	��b��	�K�1��F|q
B̳(�V=���1�m�xC��Y����0��;�̂�c��&���ε�k�����\�,�����č��
�`�rlLj
��x��cW���ʴ|�Y
u��6��NQ��aK
:|a�6.����ݮ�X:ҝb�M�f��*�7�C��IC�<\:�������W{}��w�/<�ص���� SS�~Ս�����u���q��uDP�QT�(��b��I�l$$,D�*0�:ŒZ;N�Z��:n��ǵZP*���2�)�UdK����9}m^|^�������K.�7V����z��a�Z�������j�BK5}��F_�\c<�\������m�zG��i�af�ӛ����0�ܻ=��|��j|
4�쳨�Ǟ$M�W?l{�������I]voqf��"k���[ե�m+��U�n����zZ�h|��:�^E�h[��m[�?���<Y�<���
��
��id�kMn��s���Π1G_F��}�
��7^��g�Ī'��AQЖ��n-��h-ϥU�+
m+��
*��/�?)��(�^{�\��|������g�`
s��v�}Ε\��J�
��}��y�����*!dCOZDU��[�M�t��Y]��U����g(�֙�][�u��������j���xi�ڝ'��S ��](��U���N:��HӉQ��
9{Õ|��F
���
���`䔿ڸ!�m��2�8n�M�0˦M7��"�-_&��R��*:���6վK��^��<�`Lj7����x�^�[^g��X
�F����tƙ�it&Gﺐ�
�
�\�
��U��ɫ�T�4N>�Q��IT��"�b�ŋx���F���R.��p\��T��*�m?���;��1�t�e!W�r�Ή
��D��y�jx,k#�]�!Գ
Q>ňX���&�gk ���*�Y>c�Ȏc���d�%rQ�
��)�#5Ңq��+�Qh�G��3bw�F-!?�&�H#!�����Ej��Z�Q�q_��qY����_��iR���H
�
 [...]
��sp1n
�q�
��9fG���!�~%d͠3Y	/�RLt�F�kӡ�\Ob�
��IC�o2�� ��: Ʃ���:K��ayU���4c&�Ϝ���Bp,4?��
�#G�2�_%d�B����R�+>a����.|��
s��
���xF��=�qs@��
݄Y0�)։AX���ISQ��-~�b��Oqp�?��;��"s�;�T�R4HH6�•%���t�0
	�`�Hp\�"b4�G��
�v�n��M��- �1��
3Vw_,���
Q�1_������@?�	�`g��]!�gC����zzt�Ph
+á.��r=3��'C�M*${y�C� ��B�EXtY
�m	��R�w2���6�M�V�/z/钼�vH�?��i�3
�lhS�`�¨DFf(�Ь\ �_�ܜ�v
���CrH �1D�%�3O��
�;r,j��ߥ��h at a��Evy���7�;�S���0�	�A1���lz�,�
+��8��H��A�6	�M�PnK�|� ��bH�-��
�z9DW�UB𘂠�z'
�~٨
�]�Bf���oU��
�A�
%�@ǰ���l�r��2p`^
cI<�B���W(w��8 ��V�)%$u�WT5�!zJ
_�6� �+
�_(lt�rH�
e�<p F���c����G����<��e�a�r��
KQ��)����"�z��~G)�O�!��@zU
�}ݰ���.y��
�:���ڨA��T6�
z�p����tg��\`
+g#/�
����H
�B5����]
eE*L��o�@�C�^T�i�<���N?"��1,���V�a
��;���V���>�&�f�|U7h�� 2}�`t����06
+c�P��2A J�
��$7�?OC�j!L�0lSA�G��~Du��AYgV\7��?��Q��tR��6�?�I�:�?���K���
9���4d0
�\`�Q�r�$T�OC�l6Vh��%<X��ȪV´��a������=}��NU�m���3�|�ۣ��m׾�m��Y���~2���h��;�ٗw�X&9�4��,�5+��bu�֦M�ZI(V�Q�0qQj塰D�>o
e���Lp��q��__�ӫ��ڣ���I7�?������k��� ~�"�-�ց�j�W�u��Dd� !���I�
2	h�����QP�(T�hI �
ǭ{{���̋��yy~��y����$�A��'b*�3��7Em��J��O%\�OŚx4C����<H�2
+�e����z��v��A;�{ೀ���M�yK��P�a��,���`�����Bхߠ>
�
b'iݑ/���f�
F}�KF-�%�:v2�2v�f�A�i
:Oǡs=�_H��`��0��Z�:�*�J?���,�m:�����	20%��	��q�qC����hm�ݨ6foT?�'j�݆��4�9u�	NU��<��*��А^�	_b`4���0�6YA���P��2���
�4���]f��2�e\
w|D�
x�����~j&��T�x�X���p%�=�6�s���@4�j�
�r�ѐǓ
+)�
[�`b�c�1�`	i�,�p�<��f;/���_����
+|
��A;�s���T�!5஘���I	7X���-	eI�$-�>�CX?�\I
j(c����O3 �4#7�6��N�0
�������Zd�{�߽\���m�l�׷��m#š�C�����.9
�!ƶ��˜LV
���]�Q[�j���6,�K
e�DŽ�
=�<Àd0��
�x�9h��@Z�jK���f�{�p��?�����p�j������w˓�S?�+�<ڕ
�ߡ�c�S�X�8�Z-P�K�j~!�B��l��0{R2Y:��=,V�G��r��
=/�mDP\s`
z��[k	��sB�f���jv,��t^<{���	��j]��7�w�Z�u�@�E
מ��V�ET�$����x�b%R��ν)S ���$�"�B��˸D�5ŕ�hڷx��HG��z�,߾ோ;�^5�Y�ovY��cS�%�]7+Î�j�~�jrXU�P�P��l�,S�.)��Du2qrg�H�\&餢�a�H8�,�	DO�7"�@����@��*�,��X�S�����i��y���}�-�z.��h�
um����ǟѨ�1y�H�J%e+�f�%�
b~j���ږʑ�!K�餈tX�HF�y�1_d��
�9��i�9%F��Wa`�F�����
���N֏o��������U��6�>\w1ҧ�"6T���U
�"O�e��!�<3�2%Q�*�f<�%��Ii#b�|TȖ�	8)
GjD́dtm���-��
��,_������tm���k�Ń�]_t_w]������|�`e�DAmLpf�V�"���tn��K��R��%q��)�y�I㲇%dՈ�znLHK���
+B���@
+�6�X���� ֬��6�c�7W�G��0}wv�]�:�����֋��5-a�9��A�ZR���N�V��
+�T��#��$�J�đ%�"\�hrL������ǟ7��J#�rn<�
����[���% /sڥ�Y�-x�g
~��5��=��?�
X���t,���S~g���Z����x�B��/sI$�4IŎ�� gj/�C����5z
����*4 ��F.!g�CȚ0
���-���E�m�-x�l�ۀ��l@�З�}p��Ɓ}�U��7�ܭ�>�"��Ϳ
{��IŒ�81�k�5��R�ji`����M��K���	vX��QdbF�0
��
�v��<���[�_o�7l@���陣U��eE��m�z�]~?h��n��/�$�%8����v��C�2��]�$���ow/���4��WԀ�W��K���կh!�A�b�;, å`��
+t�Y��
k�2�4��c��
��G��f��M��c��ݬ?�Q
��
�}#ف!�����'Gz6⼆�p��q^�o	�7�}�����:���Y0y!��`���X��NK��g
j�,e�UL��9or^!�p]/?��4��$B���Q.X=�㴞�0&���+��A�m���;���2�]�>����0�����Gz�b
L��;Z
hk� 
�,A�}kPd���k-��[me�{V�g]�1f=��Ϝt������{j�x�&��{���9����:����j��o�|�}�{��׉ϾGt���~�;���߁��p���F :0����Y��c�>:̓|�ޖ��y9�ӡ����7F�y:�-p.����]gQM�y�?		q�
+.,*  �l!!!{	I	�7�k
�KGw�KU��#-�X+:�u��A
=z�L[��8���
+B|潚��|�w�]=������hi�l�*5{�.]0���wp3�G��N
RqU���"֘[�> a�s�bOn
���"��)����{��>�G�6bڸ��-G�x}�H�Y��|HC4Є�aX(AQ���<��f`u|�$$c_R"����mJ
n�Ƣ/-H�'�<�<IQ�ϒ��(jOEm���־�V�U�M+E(݂�	�|��L�C4S�,r�pa
+�@qH*��tA<ֆ���E�<"�\����q+:
}ѡ@��9�FQ_^$�W)j�m��HQ�`Re�
g�
�|2

��2�������$�S� �cA3-��q�Έ&�"Q��5
�uv���en .�EW�\��A�G��
�%w���A�}��
�(h��i0u��^BӸ�f#��B#l�X� fF@>>
���a���@TN������q�
���G�����q��2͓�
$���ߡ(��2�)*%�`�8�z��
	d
��E!�;
q��L�
.}6D� �3�e|��4�|����E
s262'aq�h��/Ȣh���f3 �2���*��� (\���GA�i,�; <�As
+��R�u�
��t�:3���A��Ld>��
1�y���

+��J
�'�� J�C�ʀ�ÄF�
��KTaP�-��!��D��X
K��/l��d���AV'ɺ��.�g� Ivg�|���[x�bd=�xM��4d'ѡ`1�IgB'��^
 �9��p��GC�I<�ے!ٟ
+��t�Nf at x&�v.�Y�wg!�>Y��� ���/��y���B�	����t�&xC�Ȁ.�	��&E ����
�[��D(��@����/8�n�Bܖ�>��B�E<�����C���!�ρ��
ُ��Qx�� /(#hP�y#o1&�����BPPCU
�ꓠ�4
ʝ
�� =�G��BH�#�3���
�����
KG����R�<U@�@	��U���x��@/�Ҡ���1�k�
?8�`׆��
����0�`A�!
��\��P4� o�@z>9�� �&'}HN�J1&Q��O�n�=�[}K�Aݝ
��<Ϡ#
4��>��(:�qLT�}��å
+A�1���(�I�y
�-|�v��{8�TgP^R�W���h�ʟk�4O��w��y�����w�:�?�.<C>�)��4�½a#*�}P�2��3�L
�}*��Q�������hA�d��$�?�ҵj���}��������j��z�o������W
��˦QӅ�Q�9�g0��"7���x�&�����Xś�U�@|��e渱jGʰs)w�t��u�V�+�ne������E�c8��8��ᑾ�x_����~������aK�y�r�p��f.l���=��tГ|�{]Ċ:�&N�'��ؐ=�ա#��1�+m�W�U��]����G�F���&�
K��_�
+n�[n��Z��
�d(�0��[mmEC�S�C�-���_���z�l/�y�A���o�"����ؔ�-�Y#���z�Y��[����|���%��+���p�2\+9T�cqK�?�gK:-��;,�J/Y_8�Z4�h�
8N�J����)
,9��y���L~#�d
+ȷ�.��ͱLlK�2�ȟ9�(
���v�����mp�o��]_�J�SM��k{A�s_�%�Q�{k�7%�γ�����������fG��pY����eM��>��'( ���d�ȾWOz4̣a[4;Y��p��؛=��n������[�m�
.ѕ�+�
+��ۗn)��z��t�AG����d�9׉�+��e�U�|Y�y�+׾ʾ�ݮ~�.��
��'0�
�FfQC��5��&2�
����%��?�1��A�d���袻�[�~���mC�������?�h9�|{ɉ���Ǫ�]�]mK�:j�\����]���E����tm_�W��l�y8�yƟ�8����H%C�E�S��f_˖�
��88��9v!�5d�l!�Ҵ���eFi���K4�L��������������^���XY�A�@�����3A���������Z��6]M����D�j+���.;�
��f�w��9�&G�7�%��ƞgTF�.�8�M�<�m^�?�7���O�g�g9��9v:>$��,
+�%t��IIl�b�樒���I^�֥N��{��:���+�v�x�o��f�:4�
�kR��e	i�"anH^lYXVt/#��\Ԉ 5�=/%z*"9z&,9j649j>$)j�%�=�֓0�{��"_��B�4{Y��S�.u�E�p���@����
+�k%���Y�5_qO�f���Kf|��
��P�w�� �.�F
+�&�B�W��Lx��YN\�
;.v�%
+�#<���{�+���U���ͤ���Hߴ�z�rL���N����M~�jK���
+�O�D�dg%2�22YI�„)�x����䇑��	~d�7*a:<:~�7ǎ.�D��DaD�r����xY~nS�ћj�ᮽ�&ʷ�m�Z��_��s��2����P��"�wZ~ܙ������� ����*�d
8�ᇧOq#Rg�y)�
~�
[����&<p�H�,
�'
+�2��Ui�!
�{T�a�n�ޮ#�;ڭ5�]�������T�8���<.���)Je�
+sC9�ᬼ&
3����#/8g:"$s&,4c6��6�K]`���)K�������W���[
+��(�ݾ��=��oZm����b���ܦӖ�
��	u�151���$�<��,+�)��W��[�.ܿx&, ��̙ce͇��/���
b�3��]^6��H�<����}_��v�.W�g����A7��;=���4��i��q�^��b7&��g2��J���؞u�C=��ٞ5s�Se�!~�
������LQ ��!^�0ZE��&<�A�t�A��6J�#�ʯM7޳�ɼ�?��)��[
K�
���������~���Z�m���m=L�ko]���'./1=���^�ˁ�J����T*�-xVG�mT�E���b��T�m&W=Փ*6V���L~����^t�����{!V�~���
��g_��[o��So��Co��}�۞�~
���M������'.���!0�
�
��2�v����
M�iP�R
+*GUIE����W��S�c�~�Gm�3����t�p���������P���P���P���P����qW���'����æ�OO��?�
Z?� �
������~W�Q�z��ck �����w���wec�7S澵�
2~R'��
��A
c�C�c_;�e�ڎ[
k��|}��ś7V��}�6}���C�hq��z�E�e<'2������
P��/h�5%
�&5��hQ�tٰ�cJ�	u�	M�	��'&��&8zv1��t���Cf�5FG�w�L
O��
M����&ߢ��gh)�Q"�u ]-��M����2��� qIb�4�ܥ���%C�e�e+�eGu�e�-���Y`�X~��0]��e����h�T�����������h`���2��AÃ�"]�U 7��w�w rR^�N��/��:��Y�������߇e\�L��
��Uł8Ža��1�j
ƨ-0YS��a��^l�ٍ��w��]���hz �ڈ�{ r
$� ��
��IQ�䋪dwԤ����
�G#)34�6A;Y#t������ۇ�J{0ZYS7l�BUm�U��.�m8�Ig7m��[E��
PIt�{ � 
 �=���e�דlQ�l�_P��.���ш����zh-��$w����Ii!KZ2���_

�n�Z9U�߀�
+*���2~Z'���D�w	� �k �/ 
+ at h��׀9ʑ�Q�t7��Q��u)�����t��mEs1
�SCg�*zҔ1@|
��+�PB�%�b��,�H�b��
�I~�������ݦlm�#H�(
z�]T"�in%oFm��7�
E	
)�hD�GS�Z��ʠ3u
zQ%�I�!_��Ib�q(F�خ����<
+� �V�渶(.��@ �B� 	dO	 �D%���AFT8�+x�vpk�:�V;��z�U{�J
F�`Y���M�&<|��������GtN
+���Q�b؁ʹ'�

�8	3�V�CX�|��#�⌀
.`�]�OW��+�N��~n5|�w<���>�����
�`��
��A�
O��_
B��'=����q /n&��y�d,@؆%`mY����`�Y���n`
u���g=�w���4�{�@��7|I:�H��5
�?BH�I �t`{R��"�n>�
|��bf�/s/m!��?�삐OV"x���F`�'���!�,ɹ�
�
0z}��OX	҂A�g,�7��{Ɇ_g"D.�ǃ
+�Q�v��Gl���Y�MtBt�"�s��+]��*W�5�Fh+
!���:��i__�#�;?=�G�+b������� ��`>���7���ҁO=��3�@$�fA���b��"�h%�[W�WG���mtp:���f�}6 aי���
D� �@+��5z��q$X?�r'j"D���u�"֕
+��
��S g8@>
J�d��HJ[Q�+��<���:��
D�3q,����]b��k��,d�;2�{���!���8?D�s3�듀���U�HXA��P��AK�
+}�,�N�&-�*��unH2� ��_�x+l�ƴ�Ew���Æ�؃Q7��Q�9/�9}���p�ŀw3W�q>�&��!��?��{���ԯ��Z{d�>@V�#֊A�rAr��UU�=,7�J�$6�^�Z�^%�s^�[��%���*�7�!�q�+�C��;Q� 8/���DN&A�-��d_Ɠ|Ň����-֑{��@
w.

�lٲ�t�[����R[����"�WQ�T�;�����KRg��I�O�����{�[��7�c��!� �q�e
�#�C1�$WLh�b-���
+#�G��4�g�	��_4��egy?Y���H_κ���s[�+▲%��������kҞ�+�o.J{�I�E�eW@ܩ����j$���>đ|)�֑�����6�UT��N
-g��7G8���/yZ�\�ИN��n}���%�7�,ܫ��Q����=��V�!�Jy2������7ң��v�[��V-��@�g�_B��idg�'=���������6�M%sz_e��_-�
~6K]n�t^7
+r��
���9戞�����;�O���?O9$��
�w&�8�|[ٮ�]ٖ2�h�[�ͩ㲦Է�ƴwI
�����dg��Q at zlZh�R��jw��Z��OkCf>����VE��u��v�$�ٳ!�}*�$�\KlWv��#�Ir8}��`Z�j�Mk귚��}���#ꆵ���VE}Ƹ|{�[)!yD�m��H�@6o�<l&}���
ԭ��m��ݣF��yN��$,�P��}U���.��
+*�w����W��d�S6g
�4e��6d\Kٙ٫��N��
Q�d���s����qYU�DH$�[G�
d�Υ�‘2V���r�G6O�]m�5�
n6�;^�.�{vW��6g�?�h䷙6
+[
++���e�y�U;
�jks?�լ����}���0�RiN�0��-�1�V�U��0.{$�m�J� �l޲�T͡
�p�<߽�����V��ԫ{���5�8���xt�hWf�lY��Wf6�nI�Y\#�-lTW�O�0v���Zn|�Z^0�3
i��M�qTU�?�(˷��y�����{)�L|2���8��k�
�݃�(7x�_h
�{�Y�����G�Ռ����F6Z
+����Ě�*ye�N�fSkʦ��Ԓ�4S���b�:S��T4�1��L��
�	� �a&�.&��������{�S�͠|�>�r�ǔ�m��ݭ�%��"���J�};���u����ʍb��Bf�\�.1�M),�,ո�LZ^ُĀ>Ӑ�X:�)(U�ƔLV���&�Bٜ�3(CU��沧�i�F�uh:�'ʿ��۝j�[W[Ģ��x��=rzSS
+�nW&��./fk�I�i�ViqU��X٬5X��9�S�Y��׺�-C�u���yTe�4�\�Ѫ��u�����MBXEA��� aIX�E at 0�qW
�z��Z�D�
+R�EAPAܵEܗ#n=3�v
+c�NUԞ
�,�g�g��|���~z��y�}?�ѐ�f���͂1=�ŧo�A���4ӵV+����ok2?�mW{$QRYk�+;��.�b����}���˶���S����"{qI�����yy%�����w��,��>{I�@��m�˶��\6��E�~����у*!ݮ3���Ft�mu�M原T�յh'l���y}�Oq���Oj�#
��Ǭ;�&a��)�*>K_X�?+w�᜜}m������d�}�=�@V^�`�O�2�w
�

Y���٧D����N���6��	u�1�ֳ.��3�&������s�Ւ"/j�T6慮;�T��nu��Ûf���=��,=������sӪo2/�
U���YeCs�w��F�Rև�D��"�_I�Uǧ
M
�����%S��,��\RU\�,=㰽C�Q�>�wݩy�'G,iY5-�yc\vSѬ�c{�SkR�N�o�
/
��Æ�/?R�>�*F���GRGC���o#zTFt���b=�����t�G_]ҡk�T�%�^
1��M�m�D����d+/d�/>�08����g6��;���>�'^�:1��U��>���>��f6#9�(�����T��Ѱ�臝Dw]������۽j/qTyÈ��M��{�\�]���ۑ�ފ�_q3�m��,��k
|��V��S�\�1�s�6��zڌ���1�יӣ� v�y�Ŵ#>�3�����D�]�!�h`�?���Utr�뮈���Ӗ����O}�����[�8�:���>��
����
��˼����&<ت�}�;h�����V����F��B
y�Cx�]DFvAu:�yD���gD7�
��#jnf���ʯ���Ӗ�"��kNkzż��r�� ��=Z���kCO�]JO�xV������cz>�F��ȵ=U��͊�t2�T��8��w(C��@u7�5�2��ω.��4
>��/�N�����͈V����/
y�/e���TF�Wfɯf�Ox�dחa3�/�N׷�!�o�c���.���܂��M
|{F����D��7��$�/!����5Z�!���Dul+Xvv�'��_�=7���-)�_�3�{p��~���j�Z��x�����Y4C���
+�UC�l��w��~�����d�5�
�IJ�A�lbY?
�h�GX�a��D��|K��#Q�;#J��Î7n:��Z(���3
+B�H�c?d��`��
��l.A��T
��VK\��_��0l��_�Lj*�P�5˿C��)�<�?�g�D(��5E@�SÝ
�� �j�
Q)f�1K�
+����X.���"[���$��X���
+Ϙ�
LG�b3Pr�h�-�O�rz���ż#�Q(L(���?&�|X
2��$��B�9A�9@��A˷A,�
+I|Kd��c��
kf�.0E���Bc����<����M����|=����H��U�
�`J�'W�
��›'�
��
+R�x�,���Q��
[9B6����'�2��q�c
��=/���J�Gp � P'D@�~�&P,6��:Kȋ��Yfσ��
���e
+�
��� �[�1<~b�8�c����!e���N��f5(�8��auhBPG	/�*����h"['�{�dxW���=��
 ocg_t�����N��:C���3pf���/F�a?�������/��C8�#"P��0!Bg��I5CH�xXAU8�v�/��_��
��=�߳�P|��]6"�3/ܠxnj0�|��r
+��;��A2BY
!�
"�8����@"�n��d3D�L@��I�l�E�v{�uDP�3�\�jv���
�KS������_�!	X�
+��@H
��+5<��B6��9��X��C�'���
+��+a
b2,1m�
�k� r�ỜV�К���K�i�����N�'Խ�#�מC��~
<WC�V����7>�E��pVCԿ�.��4���Y�EjE���( �"A��%���	��#@��#r�
A(�"H�M׫�X��VG+VW��Z�]�gߝ�/��g������|g���]�ך��$���i	��V�c�jD�0��!D�
+hzG�[���C�q
n�@=������_�\���r}A�s}F}���
+ns���[ x�
+ϫA�y9��*Φ9�|���f��9D�Y@��D�B(�
��K�����
���D��*�׌F�!�.��mz
<���vl��i�'�k�?~�1K��w���Zl�D�i&x�b�6S �����a�
[nb<���
$^�@`1��—�	��x!Js�C���)W�<G�nz�n��O���1�y�5�e�uz믬+[o�
z��|�}�	>?2a�4;N�a�1v���k
+�ZC狰o��R 
�#��
�
� ��~�H�{/px*ٽ�_�
+LJ�j�ٰb׻��ͷ�=o�:�~��y_#��!�|�\�q���w�|��
	��$|�Q>P�@
��)�w����u�s�W`���Qn2���#5h�����y��R��/��ף5n3Q�-߇�/�5��u�M
��
+�N	��:!�x\�$hB�6&�P(��APo8���.S��3�)mO��EH��d�����`�\�i�X��f6�iK��'E���d�
R��t�v�阽�'��;'�����
:>|$l*���������@�zg���!�U
4S��
� �V,�
�=v�����S^j�R�
+\�g
�[���ͨ�.�Ǭ=�"w9���9)�xOHK���U|%i�
�t�
D0���^�y�(�ewE�&:b�h�
�F	0$@��@�)��=�Į%�Ω�s�?A�

��şS~+[ov�l��Lq���ɥgr"
�2�.G�R<G��>�IZ�YEࡄ�c|;�+��#v�l���6Knsc�$�S�A
+�j)0��@7��b�-Ǯ���ȳC����c��S���S�f��z�3%쥓a�㹱.#��->�J
�;�,�3���*o&e=d}�0�6�ߐp]P���W%n�
8�r �r`�d�0���q�����-�=�-@���Ѝ}����M��>�*g./�.�q���<��J�ά
jkF�Q��Q����I>��L�'
꒮�O���+I�X�"�) �]��E��7�!�=*��n�F��g�f
����O���NT�
F*������=ERώ���\�>��fP陕�
}z;�D�/�*'D�ˡ��9a~�5i��(��akR�e
+�-D�}/�
+=˷D�u��z�|�o�.5-Bg�7�߿�f�6x�@
w�qo��]�GSI��:m�u~
�<��Y�S�Ѫ[xU�0'k,T�u!T��H�R}�����R�lu:�@�B��L
tOKA7*,Е�y8>�n�G߶a6޲�z�1hQo
ge�!̩�R�^[.��*K�ח�k�U�
M/+�(L�

U�~���P���^��^Z6��j`���0�p�X�W����w�T���
�h�u
:y�Mt�5��2��-��&bEK�h}]m�[UM�6]e�_Q�*P�+��K+���njQ�@�
ɵgCe��"y�;��B����� ;9S w!��
�!tC���}fh����@nj
���Ք��UO�����g���uUMbW]C�Vm��7ϐ���N�Աu����/�	��D��{�X�[~|p��L�[V�)���D��B���w��N���c=fh��

��r��Ͳ��������]�5��gm[�Gn˞�Y���ʆܠ��RzB�����N��Q��H�
~T���
+Ș
+�Ht@Ė��Z��Y���pـp�{
���C
|i�/C
C.�_���
�-���+��aN���n�݉[S���;���mŴݭՌ��V"��0G�<E
+�os�M�8����"�XQ��4�=�E�j9B�a����7j����O3�>�)j
s23
����^;B|�3$t�oL>,u��'{�
R�F�j�+E��^O?��dr�7��
N0����7]X!�@*Bw�]�A�d
Bc�
������_ݤ
��t��{�+<�sA��!�(�s�X亄#qΒѤ�Q�a�N��:�8�?�&l
+��C ����D�aI��)Te�Z=z�Sm�:�g\j�
�j�=
��.���Z7w����:V2ֱ. ��VD�
��ױ� ·߹���?��>����k��/���7�����ZT_ks�7�6�m����Dna-r�[�;~����c�x|���D_|J��������>�KˎEћ�ԂEG->�
���
v��8T)������N�в@]��n|�;)������T{s�%��35�q0Ͷ����m@���yW���
��5�;��d�d���&��Gy�S�-<
D���6z�<m
5��򩊐��ꈲ����Wζ7���V%�}0������֨�j��f�
�e|C�q�����H߱

�H��'D��j�d���V
&ZrR@�𢙝~4�
E��j~��"�t����K�\��������/��v.�dw��f�7D���Ǥ�k��r�{���
��<��sHL�I�SP�Ժ�h�����`S=�{lV
"Z�vЗ;x�~��&u���+�*���.���;ˣ�����]>�vc�_֍Yc�o [...]
8=�
Tx��V{����
.
�\�;vh�H5�mL¯����.��Cw����C
׏���ma3�>����^g�sX~����G��[B���Q(e>����*�
�
��M��C��ra�x�a��
�yFc��
xGa�w$xKp�'������
l`3�v�o�g�&_$*�B��M���#
|Ʉ@�CBZ((	*.�\,�\
�x��H���`� �X&c���	�ࠇW�!���fpU3�+�l�?����D�
"� �\"
�Hų:� �I�x
+C
=�q�?���/�8T��
��籎簝'�c�??g5��|����M����˾E��r�b�(xS�(b
+D��ZD��hĒT�	
�/�j!8���K�"f5S��dZ�m�$=m2]
+{�
+��-��HE�bfy"z���} ];ҏ|!��i�ү� ��9ꏨ��bD�2w�a1�x��d�]� � ��Ԡ���kyX
z� �LVG�'zB9�
q
���h(��
�F���|�?��b��2 ?ɜg��fn3�~_�r�
+B,��#dX�,�T
��<�I���i�
�b@o�����i^;oTo�"q�	���P#F¶ (wB�+�&�x0�
�U�&s/	�]�
ND�P��}�9�0�	<�T<�5<,��6�]�0N�a�h$�.�n�?�
��� h>�zG����P��A}����1�a�4{��W#��
�"�f2���ς�友����#;��� @v��
�Ȩ�A�K�H�?�0��q}�5�H����pvE��,��U���O��
ɯ)��cI
+�n �e at t�	1W͈�<�Y0*Y���-�C
S��ph(����	{�r��!{�Y����<�q������6G�O���g��Y�I-Gd��n[�����/�<��a��˂���;
�g3&�YHe�ϖrȗpp2.VO)��R��lO���s�h�pV���WC�K�rޑ���G�b���f��蟳�b��_�{��=�S���W���d
V��H<�U���6���@ud�������
e��D�*%��d*�=�'�
�U�x�x^h_�I�c���pM���+��c/���]�k��hoR��'��/%v��R��?T�١i�C{$��h�B�gX�8���$����^LUp�6�0�,
��yߜ��멚xm����F^,]}��*�\�{ʳ�?J<S�%鴳N��ح9�8�mu��
s��:��
04:a�]C�xvC_7rX�	lי@x1�0S�=�����J����>�1�Ҵʀ﫧���4O�m�bEۄ?+[+�M:V���Hi��P�v}��>��� [...]
+*2��2XP�H��TA�D �@(��J���ޔ ��A�B�6��=�������sf��κ�޽
������������{��b��
O��MbCx-�'���I?&s�>���XߎM�9#�s�d��kQ���5���n�B���N
y\8��	��
�<��;�
�?Q�B�+
y��#��p�!������u�N��x���ʶ��
[Ÿ�]
�X&w���g�������<%ݫ��:0�/<8S�6|����n�:9@틼H뉸A�x�h�|K�D~��F!ZS4����.y}
+
+���|&������t3�I�	��l}�#�fr+�Ȧ��0k�4�f,9�nD$s�&�
J�{�j<�b���1=�V���7�j�=`��~f����Y�G�j>�U�wQ1�����
�k	�����n����$o
<.������x:���rVȖQ�F�"���v�I��v$�5�
+Js���t0k�울	Ne�
NE�O
U�{�J�X��( Z� �0D]	
+� (��� ަ�i���0��E&p���J�ה�F�ߍ�yǷ
ʣl�2v�2��&%ݵI� �ť�3ɵ�D
K%�)^�U
+��
+�/�
+E�s
+��!�B�h`���/	�
{o.
+���c��2���{WT�K��E�V}���
9�{[�I
����
rU���:]M/�6�
%}
���_��7[��͖��7[�|�Ē�C��_�dD[	:����U����7��JH�u�!ܪ��5���*�5�L��� �Ne莖˜=j�С&�K�<�\�YH)ʨ�+d
��n���Qnz�
���1����!Y*b�RSv�1���0��x��� �{�J�.7�[�$��5���;	��ל���vU
���<�
u�����ST�b���t��<%7GEϒ׳dY����a�$�8�̯~�Lđd"�4
1�2D���� �
+��Xp�;O�눠kX�M�a�щԭ����q-�5ǷUWF�R���W�%
T�
�V�ze��R�kYE;')O�'̝��{���/!�s[����Y��)(��J����"���j&	p���k��
0hk�Z���1�i8f��
���
�.�Z�U��*+�{H˔Ԥ�j����
�<�����|���/_�|b
+.1��]���$�[�=��gp�{W#v�V���vYB{�>bc'ٸ���Q�9jU��#���'�!�@j��YR��.:S�%���񫚙'+|�*'8�8�|"*;R���%��S"�h5�[�K����L��q�����f`34�&��w3T�1L�z���-�#�6�-�.Y��(l���5+ȼ&�WdC#-������
n��
+V�a�#Fp
��V#ZX�+*_ͿE{�Wp�
��`����`��� �#6��ფ�!��l��y�� +�@�����N����{S
��s\»J�C:՞A�=���q��;�
��m��Aԣ͈zL�(Au�y�{�
oq�`w0������
@-vв�u������q��1����Q
��-q��/x�l#GN�

��*v:��s9��>�Վ��i�q�
\r��@�
 �o/"s;ٿ}5�2 �G ��p�s� 
g���N� k�dӻ	�iWR��X0�o3�9�j�U���m�W�;'2w
�(��������t
��ێLݒc��}
9�. �ra���
� �� 
ut
 4� ��|�$@�MH�3��v�;b�=IQ�>�as����7
��[
�M��Φ[sf
+��fjv�g:��`K��ږ:�d�u��
��Ȏ���1��{\E�+�W�w��A'�@?@ίXΟH�	 �m ��!��f[���B��ਞ��_l쫏^��'�1�)i���}�g��6K������y+w��Vn������|�8x�8�]�M�����
h��_ο����-��3�'����p����C�"�Hv���Y(��9���y�ѡ�Y&�/J�9�hZ��r����u3�W/�
����~���,�=A��}�ny���;P��
��g �D. ~��gЗL�{�(�m��#��� ��a��
!:�
5px�7�?��ՙ���Sa�20� �

��f`F��P��"JQ,X"q%��Uc	jt�
E��=��.Y{�u���ƵG"%(
+��!��
���;�O��}�}�'�~�$�~���0Ofh����#��v^��R��+��u��BW
e{;�
��F��;�m����_ x�(�6Q�}�اD��
��֍"�j)�]�5GPps�`|�(|H�?��-"���"��)bϏ߈5X/v�~�nH�>6J�-�߳�*�
.�C4��'����D�����D�
�8?��(

+
+��
А
:��H>0Z�ArCO�Y�
+y�JL�X R`��
Ev�%�����,�M4�����/q�-�T�{�c���DA�D �3
8Ӆ<�Ajt"�����@4�э$H%��ΊB+g�l��jٛ������?�-�Q
+�=�����9ߧ�ȓkpg.\�3���D�\�
�$�7��1#
g1,�e�|�/A�b|���}�~� �̂"F���M�414�b�C=A�l[�*�p�ªdp�Ͼg?Ƞ�"���cM
mdp�k7��
�a߁!\@�Y@���][ELA�,�o1:
���T�4V.�f)��A���CS��As���=��5�V;x�O�LO(��?��o
+
,�*�l!$F��
bf��/��o��Il�
�ErhW��v�n�����gGОc7�3����G
�:([tph�‘W���
!�s-FQ��^�w�M�'b�3�͓ x��	2��a�o�2�_��MJv(X��#0�bW
ax��bhpl6�wh2��w#�
P1��F��
��o�
���/ ���^����"�u��Ce���#|�=�s0/r�i�#L�l�S��ʹ�t����s��_�&�}���
�w�/�p�3���������
���
!*�s}t�$�K�z��x�g�[w1�˗!v�]kt��C���:�szk[���m��m��k��W�j�k���zV]g�I��V������
�[������M��t��:���\BO���$ 5J��b�L���+oJ,��I�CC�)�/��V�vY��"a��y�:�g	[ܟ��v
��a�i�	?z�Mx����}-
>�㡽�.�Cw&��]�mqm{w'�♯����E��^d��֬QSzɫ�ly]j��y�h�'��P=�9]}�G����K4w�V{�J��u#qg���|�&
�x��B�S��F�ӉПHD�1�v(	��C�
�jx�m�<oe������Rk�Qx�)���*~�/]� {��n�0����k�'{\N���b�N�S���K�НI��:�J�����
��s��W����Ǫ�
�m
+��S;B�!�󳔄
^�|j,�Qm~��xp���d鏟�W^�)T��?��L�	^����
�3Gw4s��&se��J����A������}"���C����v�����󓛁��ݐ���L���
����^;� ��Б����n�=*���ő•�I�e)O��
4\S3p\�C�u�s������[
����Н�7mϮ2o�Sc���ec�/�����a����}a^����
���Y��)},�QC����P�ӑNt�ċ.�2
gK�JO�譬��z`H���p�OU�_�w��-oV�߄m�]aސSiY��#�b���g��<�-�i�.�A��\D.�EĢ\�/�������+�
Tϳƃ1�#�[cty�;�-
����

���;��K��|�
�G�n)
��4�K����!k
�6��_lY9hM��-�%y���;�0�^̂�7���6o0����`D�

K{���~�y�1ϝw�
+t�TJ���ѹ	�t��(
.���
�S����˶�y��F��,�_3bBЪaSC��_2da䢢�����
w��-87��fܬ�W�_!zfl�:��Ӌ�
2��Q�P�ux��9��/��/etr���L�����]�췖e�6��լ--�]�Y�~��σ����d�e��yQs�/�<kXe���o��Z\?��j�������ˢ�
��EM)Fd{�#�@��p��>#�TFtf��NL�P�ɮ��+����( �}߆}f���DTDDY�aVePY�M�*�X�&F����M0.5�9�Ѵ1i�h���Ks����������޼[ą3r
�{�����
��ʏ2h��nڒ�۪1Sb_��ǯ���*Ҫ=�R�D�n���a_Y�9�����s����MF���""�,�MB��0R�߯i��P���Q�t	
&�V�X�)
�������w���j+�\ټw�I�l�徼T�ʜl~Yv��<��s��Q��q�;Gr�/+}�_�~�?#��_���
	��I�Q(MC��0
+`~'��4�T�?P�L)�<� �j0Rm�|Vw�ﲶ�ns�z�����5�;-�
�mK
+2��d��<�gnn�(3��[�=蛚u�?%k�?9�_r��>)�(N�BQj&
+S�(Xla���ᮔ�^����;���4�>#�80Pk =u�L{��Ӽ/xE}�Z��h�Bg./�c��$�1�8�%���#�p�0��U�$��M���K�]�O�=��O>�d(N�GQb.
+w�`1�J��D}���P:��} 'i�h`A�=�h�cZU��4���u��
�kbMeՉV9�i�Ҋ
~���-��F�X��_r�'N>�+��+D����8�E;
+Q�� ��B��`��4ԃs5ԃz�{����vH�[���C
��je-�ZEM�+�c���-$u)�)�Y����$�Tz�U7	�U�xm�
�����]��;��xs�6��pk
+bJ�s��� �S�
5��P�H3@/��*��Ʌ�.3��re�v�.+���k_��ٶ�0��Ӥ�{,w�d��h�9�
(w���辩�K�pB���r_�����:l�E����X��
z.��,^.�����V�ô6� T������~G���K5��=���Z)G��v����M�w�[n�̳�>\��Q缮��kD��{x���������v;��a�=��"�z�NϤB�
4�M C���	�r�f �h�
�a]�
��';m$��gx�F�����[�b��F��l
�6_7 ����o����7䴺���)�����A�U�輺���ɡ�QA5h 8A����z�v��V�,��Ns!e��L83	��������G����x*Ng��
���L�бB㐱�U�m�
�
+
���kp��o��o���ȱ�>^����A��wP~�1�?O �H��1Ł�i=�����3
L�L {��յ3��OǨ��ޥ�zZ���t�n�T����!��AC����ӷy���F�sh"�D3���\p-�Ds8I�?D�������M ���y`�%6�U"�� l�BgE�
b���� e�J�2��L^��U++��fMOe?���Y-�k7��g�]����e�w��+���b��
 G)���F����)����O+a�5�X�s\�3� �)�ς@x+�܊f<ndz�nK�.w�T�w�U��
Qu�����
����
��P�v5l>�֟��b�t�����R�k(��j/���˔?
�'��O D�T��
up~�
������	

����`�$
l�F����򙔱xV�2���e������ы�,��?�xO��{�*��Pu�A�o����_t��?��_��#��?�����%��7j`��X~�����|0�^��@0��WA��Nx絔��A�h�ie�ޞ`�og�?���hΓ�����|9�g|H�t��7 B� |����{`���'�
�
zh�%h�p�
4�40�p
p�X%�B0H��1B��o	��F��ʗR��Q>�=���
��X=�Q��[�L���Ʌ�Cy+)��hE�ˉH 	#[�!� `����|E~\BA�Y��p�����S� 8R��B�7��(� ˉ
+r�o�	��}bL�	�x�`B/Hb� �͇C�<��h�Ơ�3���̕A#�z�
j��A�M,�H`�Z&)&5��t�>2L��$����U�)}~D^��
����K�K��0h�Ƞ
��]�̝ACo�
�
�l`��r�I�$���
!��	2A��%r�|I�N���e�J�����vv
:�2hO������Z1�[�•�X���B�\RJj٨�B:	�Bw����,��\'���u}GEugq �S
F�A�"3� �u

+D�PAd�2��30�
 ���"�,��BK�5�ZWc��M�=�hbY�-��b'���s���u߻����}9(z�y'���V���&�q_� ������N�q%]e�v�^Hi
���h�d�e-r8hQ�A�:���'��h��E��� "���[|�}mq��B���L���b�?�ǖ( z�Ũ�����-�,����rw���(
e�}
�
��o��w��?$kxo%
�7���W�
������C���gҋ�_�w�?�=�߷{'�+E�
;
��oKQ�ܒ��(�[�'e8s21�E�3�f�N�Px�pz]�8o���W.Z�
���?����Y�̬�
�Y�����	
0��/��2���]�7\�
+�g����'\e��
+�/�����p�@w��$@/#@oZ�P/��^���z���~>+���]�}�A&����ݙ�;����U�'E��b��;��w�>��3�_�q������)�0�J�Ƨ(:�@��3��8]��z~@��I�w�}҆��<4� {����~ެ>��;��ܛs����\�Z&��U�ٳ��g��7
'���d�Y�>��=��x�����5�qχ&G<ޚ~�f�<p� ���h�
�=��#�)�ͥ�D�l/����|'�3ϝ�� �����K�����~����?�&��3:�����z���������3���ȔA���}������E�>���#z}�b��!����\  
�C
�a�	�Zd�C���_��E
y���
N68�=qh~��y&sL���?�ݢ?`�xO�n�>�A�]�g�w�d�-�Mw N��6]���V�@�A �`�Wal����-� ��pM9�G2p:ҋ},b>H�.��p ,ݨ?$���E��v/�6߹��r{�Z���6�A��[��K:��K7]������`��'�Q���k�Ա�O��/&���f~�e��%<��疈�JGT�؃q�����=ѱ�����{#4�=����]��7���nm���tۯ��6�lM�%YK�#٪�w͡hO��P���c��8� O� 7c���q>�_'��d�$8�,��d�_��۝�P�=>Ұ;.AԵ$�lSl�EGt�����m�M�ֈ6�e��Y�˩1��sC�9�z��:��N�(#5hW
�ұ0���
e���7� gRYp"�
�S'�g6�7c{g�7�'u�pKJ��Fu��=1Ŭ-![ܪ�Y�ĕ�6/Yn�"�UV�ѩ6�����̥2�+yy�]���7Li [...]
+���Íx�Ae

��� � �Z!��3��|gVg�lnG��^[΢	���D�Y	f
i�t�MuZ��<�ʾ$�ɱH��ѩ���I���I'ܴI7�r�/�Z52ĉȴI�0. x82���L�cT�e�} �
+�AO�)t�X
���6���ei��<�q}n�YuN��"[c]�)�g��d48楯erҺ䚴O�2Ӿ�����[F�
yF2�)3

3SQF
Fa텑��
+p:�z@��Q��V́�t�ڱ�J���q���
�
+U�bM˖&Y�gZ���m��ڜzGMv+���,O��vK�
���|��<wUk�%Y���Y蘒�������m��:��ȣ
P��R�
�9HG�$h�����i���9�����e��JK�'-K0_Z�n�-̝���e��R��8��7��v������grU
2�\t��E�-�r��td/$Q��8��
P�>ʟ��P�j�=�����V��ٵu���ZaI�BC]U�(�Re�S�*�,˶I+-��K�
�5;�w01E���]#�.���Bd�S�
c
+PF
F�
�9P���g?���\N� ��ay��4;�ʛfq��+�
�
�F�����uj���,�Ě��q��Ҙ�FYd��NʊmLXŠKh�����LX9:�����R�����X�U ��[<^H����}� ݍ �� ��kW
���J�8�
+�(8��������g�����6NZ�`�jN��m���z���N� ��?f`��af 
n�MP��EES�����k�ٺ��n�]6�e��y���Z(�*�X�
+��)J��Y��Y����ػ�ہΞ���;0
��}����'�MZ�B��׋�ǽ�2��-�c��$�)nJ�jG���%��W�?ō�'��=�v��pU��B`�������J��56<�ցYki3�d�
^S`����gꪉ~E+��߷bz�	+


�|NX��c�.��ts�ȥձK��,i�)X,1�$f�=bao�y-~�
�������K�U�^����
�)5cFi(
ޔ��mJצ���JG��x�i����qoM�nx$p̆��;��
.X�$lhIix^IUDnIcD�ܵ��Z"sVId��ގ�5���^���u+�7�r�~v�'�l3`Jy �*�qE��X���[Q�����sl�$���S}Fn�a
��)k�ֹ9[����V�̭�����3ʮ؇�-��%$}������0�=�5P�����-g�ť����ʁi\�&TwW�QX
�����J�(W���
wݣ�wy�
2d�f3]/����ӪK�R\;-�]�
��lI���6h�
�)�wH��p�8���_�����\ɞ�
:��P��;`�
y�V���C��Nd����Q7F�׍���j)�3u�����{&կ�r�o7$
<dH���_{�ؿF|���o�>1�T�(c��1�f`�6�ɝ��.`2Wû ù�f6h��X�t$
�G��<�gS
��F�cw�A�
�����UQ�˴��2-��Z-���~�ˣ�Q��;"���ij�r�o`�R���?����
PT���Y�@Ƈ��& �c
�O�!g�|&�_$#�%��;`?;}�MC��O"���h-���ݰ}�
���`;+��BgD�i#�3~��n`k/b݅
��F ��I�'��3@�9=.�a� k[,m�03��L�v����^�N���O�й ^�6Am?t��uނvU����*�3N5���?�ev
�SO 	��Hf�l�o|oa�������1:w4�;p��P���A����
��7�� �����-`�s̟ɹ���2;�ك?e�[��V��`�'`�
� �x@�7B�d��Nq�L9ćᇡ�
�7\�.,P.���W/��{���r����g��̎� 
X� >
̽��o����,v�$'e�h�B| �C��G����{"$(��C�� �i���J0�~O��
z��J��cl�r����}j�O�]�[��B�
	��9� �<�9���Sb(T�/�yf(ў���:-��T�D�A�����@'��/R'����y�N�[ߛ�3?�;nD$�_��}�š��<Z��$%�?(1΢�i>-&�¸��P9U�^��x��<~4^��.�0���#�;ߟi�%�G��\�������
��)P���a�I���������6R��e١���Ԫ�֏�
k�괶��M��M�6Ѯ�����Ab���N} ���:��F���9�Ur����ꧠǕ����iE�`_����P��K�u�f�T��
��:��k�A��+��i_��
!7��!�q6Tt-����?�� 	A�$��b@�k�"q $>�����ǫ�
P�
�����Z��%���vٱD��X�}�ب]t�i
;�֨�ڹ����S���+
�D��7Lj��:#�#ݢ{���-����T3$���8��8t%����|t$�ˉ��W�ӵ
��k��i-Η=>w��qڹ\w�Y���s��s�����s�y6%6{6&]�jH���`���T�$>5���@����| �q��4A�y��@�+#
Wӝ�t[Z�F⋴��d�ډ��
�S��5���?���gc�b��)+

)���yL�e�K�g�Mi4
Hm5�M��'U�vSU�X*i�I�X��gk�<OH�	]�~h��/�
���d|�������Ɯ�

�?�?x�c^u��j�_2��z��׬%>{�����YjveV����c��<dݕ��u{�U۶,�/˒�w��m��
��#��v��( �
����
_���aAh*H������QZ͈	�}S=�
>��5�	Sհ�|w
��c����e����my���U��W�o��5��+
�o"�	�Jb�Z����E�(� ��K�!@��k�� ��@ E�(��޸�j��u�nk�n����۱��vv���t����;�ad?����=s��9�s
�����߰NJbMH	k��)	^
ك{�x

�
����s%��'	
�0!n%��&�,%�^JR�/�5���|Ϲ�R����3���q��S�����։ة����PG�2{4�!�x�W�!�s΀���e$	��k�g�����|�¾����Ct�� +J\V卵WI��*9}V��8���=�0�M�TL$[�ƒۘ�I=!��C�C����Y�=�2�/�.�H�����]r³�	זDظ������T�
�u�Y�c繥�ΕA��t_����f�MM�tf<�T���Dz��#��DmZLU
<�lb�u��R�ܞT�K1#�T�
֡�)�*�[SkI%��p�^��u�
^oOq���
�<�╻���l/Xв�n38u�ԓ����c8;�{0K�o��e��=�[��s8�Ϛ6,hUO	���D
���z�������4�
�E8��ᷘ�?d`�A���{.�>v��<��g�T�F�0즎�Ї��yj�^]�w�!�S[�lϩ	m�n�6gu�4Caͤ�&s>�*�
Ie�#�Y�BCDH�YC��B� �>�9��Ή�װ{^.p!g
�0e
��b	�GP���
5&0z
+�ޝ�,��}`k~	�I_Z��ȭ�u�s��f털\;')�Y��h?�P��[x���J�$
 |���s�×j�ߢ�7
�A	��R�7��
+��`�L��R�ʢܺKe�M
+���
��"]`��Ȭ3V�V�s͆v~Y�QaI���H?+)�/n(��|+)�1"4� �#�U��cpу���.��
�{�F�������[���U���QyнŜ��X��[W�]_]j6��B�Jj9%�m|cq��P4*��Ht�+r��ޠ5~#���0��t������`���a�B�	8Y0�O0{�
��Ͳ��ny��\���V�QS���
+(��2U�XE�j�����/��-唞ה^�d�ޗd�����3MD�1A���J^�W%fA��=X��
��4��������B��y#45�Z��ѫ�
�ޥ��~E��@C]S_kͭi�f����!az�S��z;\Yu�:\Y��HUI�Tf"P�	_]Ax�<K���
����	sЊ3hA}�����`�o�ڎ
���(�2k�{�5ų�-�'�U�k)
�i.gi�,�����q@��0)Li8/Jn�-J�&J��G�l!��:�O�%��<�9<�3��38߈g�
+0�ЏX��F��� ��	�򞭔��7���z~����Rz�ز|5��靦 ��ZVj����n�&���Ƿ�q֛a2�Yۿ�q���Bx�̈́���XEna���̣��
s�
Ѓ4
0����El(
x�(�Ѵ�8zf���֟ᥴ�|G����V&�0�z{C���cz�9�{��H{�đ�<�H�Gj#��6�������_��]@��v����v`-�
��}4o�ZGd;Ġ��c����!����P��
�
�o�h�� �HO`�#8jx��g�:�y�_��AŠ
@������"f`
��=@���]� П H?p��
�N�Lo���H��K���Qe�
+ځ�
���<�h��#�i�t�|^w��������|�1���Γd��	d���:f��}�dž�,� ��T�D���H��&{���C̼ �
�a��n�vI!ʕ@��RR�pe�v��n�\��
��u�]C�[]3�W\�
[\_0����s�
��4K�7�%>k���C���?4
+`C�z'f�,@�
��w 
+;�kW� �j0�\Ž�-���nؾ$�mˉ�uY
[�u�M�e��W��/�ة��)Z���x�M���*�
��u���]x��p�N�A�{&q38��;���p;�@�5��7h~�D��@t[ �ۛ �N�D�n���^>p�W��
B�Cȃ��z�`���u�P��	�y���2��cc }8�ܻy3��i����t�u�`�
 ���� �cOx �������>����>���� ޏ�;x}~<?�
_|����^PQ]i
��o�

0�P,�$�51q�T�
+"* �D�����(Į
�ŵ�`Y#Q��	QcC�

֛�"9��s�p~��;̼�~߽�3�Hu1~
�}�|8sȼ{�¾g��
���O �Ӏ�
`}^�oZ�/頺���P\�t�-@n�*���
w�����j
g&p�!pS��|ƟT�d�'���3�! ���1��$�vp� 䋀�@q
�-5ِ�m�f�
��

�Gܔ<f;�p�{—��
��xv
+��	�������w�N��֟�5���'sv���/3�k��cߦ�T���"-�mK�@MC����
��n�*�)\��DZD
؂I�{��OY�����2�p�mfl�_ w��t��W��q�3���!�!�DX�
�&ƒZ7�"�^;��
\0���O�[/
�|�����Dݨ
���M�i6-�%���Q)�2:N��.����sbl'�q
ݙ�'�ۄ�H�ԛR��)4���"ZNŴ���^��Q�F^�^���oI}��.��҈%l�z�*������!�F4%Q:e�����E���b��+��v�w
�9�'��c�G��CzP��zD#�n�
�f�0kۡc-d���a�B�6����k���7�\�R��
u!j���L]�j�F<Vo�CU���;�J�>l�Fຕ@��
�Cq�
 �� \��֥)��������b�J��r:�ɣP-g�<
�<ܗ��\�;�Jܖ�ᦼU��p��8��^�E�'��	霽��:�'�8����^vMm <er�f-7g{��ܹ���������2d��0����j��ˆ|\2,�E�2�7��¸�{p��G�r�"
w}"��	�:�&,���7�B4SCx����ހ�y���w�ͨj��Mb�[�$�Ꞇs�#��8����L��\�G�T�J:�Aq�s���a�������[��z���%T�i��P���#|���
+�O�h�k+-^���#o#n4�¥f��K�`��[7��C�w���P�O��O���g��~�<�}>�-��,U��)Q��٬���j��i�f���M~/������-߿-4�˩ŸS
��۟*p���-lQ�犓�|P�: �Ma(����U��OU��ϰ�f�Rn1MPm6MW��f�7�
+l0�Ԭ7m�\k�eYb����׭V��h��
�%���? Z+j�s�������l�g�X��gz
j��~���:J[�EJ��,6PnLW�
�.	�)�l�ڜk��\�]n^b�Լ�f�y�\d��\h�,�7W��9��� aS����s�\
Nq�+��H�
+e�u��-
?�?;���w
+W�t��X�1Q��cJ�e
�j�tȴ*
+��O�Y4K�Th;7h�.?��~vP�}^P�}n�#���~z�Б]N-�:�3.m��K����vʺ {:+�=TFiXC��Eq�YZ�X
�,
+�Sv�fU6�z���Y_L��.4W�:�~F�rǜ�
��!{����v�z�iB�Џ�dO�����%���⹷����7u�bM7g��j����H��wP,��,��ΏL��떢��u�͌��ls�d�v�q������);|�a\�N�����w�Yo
_G=9���
7Y��#Y.�{{3~,���K�`E=����^&��W{��^�����Vo��c�vJ�4yR�p�	����}��ب<���Bcfd����m.#"�]�E�tɈzëғ�H�P�)�`e8p���v$p��������(����x���J�����O�2'>R=9�����$���A���_ٍ���Cf�	��=s
�c�;��eH��~��kZL�tN�r"}z�p���p�p���c�-<w���L�x��h��I�1����k����I91��:�oO˱�	ڬ�d9�ϗv#��tȈ�F?4n�!=��yp�
+�A��nɱ���^�.c��
ɱBO�u
�
��;��y�f��d�8X2��y?���܁n�I����6���`�q��Y�5��kG��/g�K��4�!=i�>��4CJb���e��6�%%
p�p�j\�&#���������}�������YI
�%���)֘�ꌉ��!;�_3�����T#R�4�b��
J�IOd���e
���7	1P���,,.��V�:,��U��H�A@��*��`-�k1X�b]Q��QD���#U�ѱ���rԊ��:��k+ڙs���@��w�����Ť��,��F/(�GFW�ύ��8;j�SxT��QW�c��(a>_�#�

����}x�k�����+��$�|dm���8��IZ�%BN�(If��4-y�YrR�"!1�ba�\eLB�Ut|�M�,�9���"V��6:���p
�kv
+���<r���X��������`�A�'�uH������^4?U��t[df8#=�U��1F���c�(}Z���`�����h՜�눔Ś��BmH����IF�I�
��
�']p����> A�>0^舶�K��
g�ų��f��]�
��
޹�>-�)9���;
�r=$���eѹ~�Ȝ�9�aّʰ����4���<M����W��3��2�O����/���/M触	��T��Ov=��~le�s�۲�s�r����)y@|�
+q�XP8QE�$󊼤��&��
��g�(�
�X��(�S���rm��j&/Y��]R��YrH�����{:�\���v>�$Khz��:��
�w=}�lIV��|���(f�Yb����.sFx�
��<%!e�3˦�˂��K���Q~�-'-�Vy�[M(Yc�^I��W��ؒS����ڎ]*l��H!)6=
g�;ؖm^�!�I.�I�����}*$��BP�#�� `�h���K��W�j�lҪP3��y�U
�UeXxUY���RzVnQyT�W�W���+��>j�����
+a�^��c�{�s��2�|s@�鎭 �W����U[`�
|7�q8���P3
�k�H��̐��	���Y �I���{�6�+�1n2w5�5w1���l�m��xk�:�VX�X�\s;�}F�Z:K+��* ���<����m�o�Ԫ�Y��G]�׏�[��\?�M�x�,i�+q1�K�6�H��VȆ�jdCL���N���2T+䃶�^7�τ��=�{
��tW�
+�M� Dofm������]2
kP�O

�3 C����
�w��ǀ�P�o��sc�6.C�}�$N��K
��E���%q��\�[H
v	����l�#�z
���,z�a���
�˞�u?0� ��
�&5�M:�����0h��`�<
�c��=F�`Ӓ�rX��B�z�\�U�3X
�>"$d3��8�2�;�s��
`�. ��������00�(лв]�:!�e�
+mv0o�
E�2
+�N����?���!k���� �vN�}'��5����) i{M�'܋����H�Dr�A����.�.�����iT
�����5/
Z�\���/�_\Jy��C�2�h/��`��pB�/�������뭐yO���3�3��O��W���:赦��;���X�_�*��8�kx!v�7\�[c�ی���@77�����,�]N����)��K�Ogͣp4��x0m�ځ���=�jz/��ȏ��I~"�r��~���T<�<<�E�W
��y 
~
+n:��-Z�U�����C@(�4�nO�y�i��<s	P�+��p�%���<!��_
OEl	s"�6,�q�q� U/�`�ŷ�V�o��!,�!d|
��EƑi�CRɇ����5�H6�I��#�89C��"�����?�aC�5{\UoE_�f AƐ)$��'�$��2RI֓��s��k��8����Ё�,�&�1�x���n��g.z�̅;�&�d6�#i���9�9�J�`5=��l��������
��3��
|�n�6?y��y�
�:-�а&Ē�(X�ȗ��'�H���e�U@�rz��YK���-�l�i`q���q�������
+G���#�֌C����cŚ(�CXxB���3�
<���=i,����)�A��?��p]V�k���*�W��p�l'.�}���V��w�L�.t�?�?�h�8�|��kD_��X2�=������/�#q_=ݪ���
�������eU.�����T+qV��UFt���z;:��qR݂6�N�����l��E#Ь����%����
��Z8��;���	?i���;��z�& g��ѩ]�]N�2�>�/�qC��.נ(�+����+��7&��F���,(,ȲܖEv�v���rY�˂+

"��.!xC�E��h�&Fmc��6�If:i:MS�M[�vڴ}z
���<�_��9��y�>|e
>X6�����e��7���pm��ŕO�K���\@��$�
d
��X�q��u,x�F�V��e���
+��*��U-�]��)�[kk�ݵMp=��{�������aj1d��r��r��r��_w�~k�o�7C��fC	�$r"�����C�kK��Gm�o
�����Wk�q�Kp/4
n���R�Z�
.G��R��Z�pP���9E;}V�C�)��g~֬�(�b�}Bq�}Lq�=���=�WΑH�H���둄�CH���W��
�ׇ�G1 �7r�}��G���͛`!:�)3aNi��(-�)��>����)w�f�
�i�^�Q�g2z�{8�8w<z�7���U~�Q~�?�_���\��_����6�|f~�F�dܳ�pύ��J

�V���8����	i0�`����dB�pB
{\��S�r��n�!��7
���O
��	�
+}�	�T�����{TDгD �ق�@
zN
�?
����1��D�NzN$��%L�$S)Y�XJ>}Hca
kl�!M
w0��7���ߟ�WЧ>(�U	�Qϊ�귙.�=�C�Ӟ�OQ[2	�$��<�%�b޿�{?�@ω��l��sc9�ʅ�49Lføv3�3���
�@fk����זs��5�ތF~OF����-�L�/jO���J[���>���})iN��ؕND�"BW�O��_��z�p}�b
�0��L
+&tRݱ���p@G��t�>�ի/`wg[�]�6^�g@ێ��֬�@wV?Ӓ��t3�Fݼ�^wK���ZV��w�#��ơ#"$�9�p��
�7 \G߷`�=� `
+c���i`�@�J0�C�1��)�Q��0��󊸞<+ߝ[В��r�E
9{�NÈ�a���ޒWޕ�
��m�'2��H1���D�>���O1w� W��9K ����(D}�7��
+�A�)
����i�N��3X�&{���m.,�5V�4�
+ZE5�=��!��8)������Ae�_�������H�S�GD����瘃[x��q�z���~\�__� z�_�Βh�l�V���iI�]�lvcI>�Yb�9Jl5�N���-�,�+̃�R�aY��LP��Z���I���Xn6i��H������;����
�\��>�b�<���aN��<�]&O�p[#�ٺ�j�jhg�����TW���ր�r����ETZ�)..
��-�Bˬ<�r%�h����h!��"A��b��3��:���_C�y���~
ρJ��Xڬ,pۤ�l�4V���:�rT'��UZ��*�m�����r��V-(�5�+w3��$F�,�zRn�.��֟"��+���	�=�g|�}w뿈�s��wj ���� mO
���
8
+��n=T;���L���4��.�m�+�9,<��
PP� ̫��rj���k�����2]�%���'ȟd�*"ɬ"�L;atv"�ٖx�}wW΋�u�
��D�Q�9 at Z�z�W������
+�rW�����6�t�BW
;�����d�����B]�
��aX��0#ImX��4ܗj��(IqqJ
aR�(���w�1�}
���	���
i�o{
�
7,�dP��*�=�P艁|�v*ϓA�x�,}k!;�����Z�������+Ը���if��<���$�1�-�%6Q��nF�w1��s�?�FߋV�q#������:(0v2�۵
r����n�
��խ�2�ut��H�yK�����6q�wu�U]��&ۺ�	c��c;�����0��cۈ`��7���γ
�q��Gv#M� ���0�����/��WC�/
R|J��A=�N%
�D��V�*Xq>';���(}��-�ü��gyQ�ۼ���xQ}��z	?j��X�x�c^��.�=�.�v�v)j��d�Ґ0�@��+w(�
R�V,��� Ư���\�2ZBm��6���^V��������
{��������N�r�1糨{�{�i'҈ߕ>�j�@k��� �<ɃȣP
]S!>	���k�jX?���7��vy at E}ea��Op�}P,�	����
+(�q]����ՠƂ��ADET,�NPX�
�h
{,G$1�qu]{�X�ۏ��������{����
�@�x�g��y��gΑڛ�%_�>�`�Q2l�]f(2C����/�)���멷4�y�����赌A.��| b3��8~�Z��9�P�	�rx�ë�;<+"�Q1�ír\�\��p�4é��U�p,�2!9����V�3y����LYǻH�?���R�O	VF�*�gS�݀c��j���u#
`WD�ak���26�1�Z�CcI�ڲ*K%���\�@]+��!��=��b
��ԝC݉�
Eݸr��6�����ԯ��_��Ƞ��AV� ��h�6#G��
�de��Y�PV:��
���S�^���
�
�jO-�Pwm���.�߃�k=�?�
���CIl�3�Yw�8ߕ��F6eل\d�i�kbR5љ�
&��+"�CV!��V`z�m��DQ7��� +�|
�;
��R����@.�
Wtl��l�]��>�
7� �L�b��|�I�I}g'�&w!��h!�y6��
�N�(�F{;Q׋��� ]# �D��u�Or��Lh�v�/��C��?�[7����l��O���
��1yI#_ҐW���������h� �
v<x����ռ�mּE����xD����3��=��桍�i<���,���`��!Pq��k�6@���k�A�?�	$��#�dYM6�RDJ�vRK�!��u�/��+~��xI��!쨭�Pp�W����;H����32�$�t��䐍du�r�
+��.����2i��.
�'��W��G�����
�ƙ�5���H?2�|B>�N"u��9R�kC��:k��%�2S��Vo���>�~���C����G��7�A8RW���m!�
+����Gz�j���XjMf|�tX@�Tjd�������s�"�@#�
�~��I�
�p�'��4q7F�� \��hK_h�ZG��9&��ۇ��G�x�}L��ԙ�0&���H���e��%�r�M���8O_���ŠS��	��8�t��Z%�#R����9��ST��hgG�8���A��'5�qU�˲�h�%�|:����bN+�qJ�'�98�̃UY�ê
+4�jpHՀ��&|�����W��2c�j�AxQ�eN�W^/'������7�~��}�6}pV7�lG��X
�����3�`?���`��8�n��s�W�u�2�:�A�C=�84a��T9�F��@Y��Bz��7ˈ�����n.yJ\��C��;N;t�Q��w
��ð��Թ�G��T{$a����L����敃*�|Tx��{J����
��Hf�Ki���
+IA3!�!�Z��=��k,���	`�;孁����Pg���}��� l��ʎcPR��(�b�dl	H��VJ�
�� �TX)��Iy�'e��~����L��Y�֐՝�F�R�K�0���3O�v���@ol�
��=P4 [����Gas�8O��gHy!s��!)�
!���!9��!�5!��U!��쐣���e�OKC�"#TțY�?���]���8i��G,=�c~��3X��P7l��a(�<�`�G`�q���8AZc�"[eL�eʳ����ƕ�L�FE�q�2ݸS���^�~E��X�(\(�I���<	�ԝ�n_>�|r�8n�����U���	�=���+�LXc�F�i��e%-7��e�&�2L��t�\E�)E�jZ�L1�S-�0�FlSϏ8��gj��1=��6	�,�Pe
�<��W{��>��s� �:��W|j
+{K���ھ>X���
X�?
+����#����e��&��5E�
��\�������F3+�P�yd�vf�>����6�#h�E	��(��)Tm(��O|ǧ�J�x��
�b�c����a�@OdFwƒ�0������XiQ�G����d�c����NR̎��L������N���N�γ�]��
m�M��V71��.!Fh�����*a`+�"�}�����c�������c�
�buX2��q�H�
��&̏(͍��͎)K�#���"q�4�!��S�R4��Vh���u�GEy�a��fav
.D�&�葨(�((�"���0�
̌��
(��q��h]\Q0.
cM�h��4rZ=&�Ic\km�m��&��A����;��8�}������}��yI�ir��j
I�j�I�4���j{���'�J�x�U�?3��~��F[�6�a���>�(Ѡ���Ԧ����*C�PnH
��t��$=WV�^
P�V��O�W�5�
��Mߡ���Y�g�M�Y�Hc֋*�^TZRE�S.q�a�Q��ؑl�ZV���u�d��D��9Tf�C�i*�L��i�PlJ����N�]��Y(_�Y��e���ƕj�q�&˸K���ΘqZ��qC���&#CT
�ҏ����}m��f`6���9�x%�R�uԘTf��bK0ʬcQb����BA�<!?;E�k͔:�92��)϶��-5J�e��h^�1�۵if�No�P�j��M5���g�*�ԛDe�IT�r�������,ځV��q#�SüTpM�9:ۆ��

+�c�
ӱ�1W�;�$9���J͎\y���a�V��Uz�:u��UM��6���6�vU���P��-��Ee��	�^z����o!�c.���*Z�zR����,�U#/o��
�4X���s�`r�I��,��鐥9������
ʄ<�j~�vu|�M\�IrY��@
�PT�<��xʟ���1�.'����`�!�<�N��Q��@X��#�$
&�]�0��	i�d!�e�$�r���ق�ry|I�"�d�2�x�jv�����Y�ߨf�S�*�1��	�>>d��b��Jx
�yh�I%)�{�rs� ��~0�AZy(R+‘R���9H�LT�
�I\E�4��L6��-�U�]ު�^�WY�>�J���"r���,�J������B�����2`y)PK�8�]L�WA߳H^�FB�@̯}
�a�瞂��hĺ�0ǝ"ĸ3��n�d��X宖Ns/���n�O�}M>���<���<��<�Z�G,!U�|��w������K�RE���C��Z ��ާA�������!�n
��&`������ ҳ Sy�_�X�)
��&z%<��=
�<�H�<�a�?H�Di�ˤ�W�d��T�<�p/.��$�H.����L�6��XE��Z��́�hƤ�ј�f"��Db�w�{�׈0�c���B�^a�� [...]
+�	��~�u
����@�����7hYGo��
ڥŠ�$;Fc at G8;#�\<өG��
��]
+���	�����<M�
hw=�n�];��G;�65+���P���`0���^�ہ�N`�
`�~��
j��Cp(�C����!�EA���e���a�qC��1}������C"?
���6j�e������6ր����v�1�.���Ao�8��]@8���B{|a#��hB��>��n~p��s�y����n��u��󘈿���+�2�7���ԝ�Xg
&Qs45��9�=@{��?0�#	pZM�����3�lF{��p�3��,?�gyٟ�!�a�{(p�m>/��
����.�d/`=�
f�C���70���ԧ�'����������J��"�H��5��K��\�~���¿ƍ�	��b^?En��D|B]k�4�
R�
C�I�
�X�=��
+(z������%�-�B��R�&k�O����m���?r
w���޸�p��0�>&��?<a����������;��QWw�}I����~���%���(��Ӌ�\�C
�9Y�M��FM�^�"��ċ
Xd���Oe��D���
�$�H$�'�NJH�#�I3YOZ�+���'��q��p������w��S
�����!��

"A$��!�%�$�X��,"KIYI�p�
�m�w
`7�
�pwp�:=L�
��������QC�@�����E8�&	��x
���:�pS��������8�V�g'���y},�q�gp
��*q�3|˙z���:�t̅�o�
��d,�J͹�"�Z��Q��U�x�.�i��k9W
��vn�|������S8��<F����8�Y��v�Ey�q��^
�] �[�Q at PNA�c9V؅v9v��Z�e9� �'�x�b�z�V,�x�h�ĚX�4��Sg�:��i��$�f:}�Em�d��g�}�?��<���=���?��5T-u'�@�D����Ok�%k�)"�����d>6�2�j4�h�G���L����A����I�þx�q�1�Gx������P���R*Ǎ�+�G�sM�ԝ��PS��20�l<@��
?F-5���A�ո�
��
��޸�5��Z���x
WX�wq�+0"<���⢤��MT�8UK�<�y�X>�Ʊ���s�
�qW\���
�%����u�W7�hZpYӉQ�
\��ň�v
��¸C8?�
΍��3
n�&<ĉI���d [...]
+��^�
�?�`���ST�!��|�:��lG��
�<v�q������2�k�
����p>0�����

�V�#ӝ84�ߛш3۱�j웹	C�v`p���>�ݳ�10�v��%����%U�'������8V?	�_L�Hj�ȹ
�{�<
�3&�̬)8>'�����$��r&���cp�{T`��:
5cgP'v�ö�~ak�
�?���|^�
�.l
+���>�/�څ��Cք|�/����@܎Fcy�G����9���� �2����
�]�ұcq6�-.���Rlw�/�#�	û�
�º�]bO�~qu�i�;�����X\�/�=R}F���4�����X��Lk��6c9�

�b r&�G/Ė
��$�W����|��ٱVW.��j�ձ��*]�إ[/v�I
�!�-���;*��ޕ�b�$7��Sj�U�=c������;�3Ҙ?����o��v�$�/��޸ذ,
+��X���n}���+�Ra��%��=�W�.���H�	��Ƅ��'��NQ��?Rj�j�Wr�^�\	�E
�kp���4r�iӊ
2��)�I�~<�'����y�NGWJ
VR�n0�͐/�
B��Bl4ԉ
C��6���
�r��U�e8�T.j*
w4e�ߓ(N�*;ST��<�����Uڍ�fր�g����_�&k
t���3m6:2B��СŘ�&�r4s��Hp�b��F�66IU�N�¸Q.3�TJ3jJ2��qo�؍5v�ߕ�
U~J�*ٟ��D�2j^� '�9�1�M���5�2��X�Ek�
4g��
�Y�9
��l��l��+�
+s�Xn�HNs�\bZ�8Lەb�~M��O�馏��[��K�դ*�,U&�5S�l�#��5/�G��i763����+�w.֧�<	
9S��G�%չ��MEe^�P��/8��bIn���uKŹmran�b�ݪX-�4y�3>�u�
˯��
������lU�'��
j^,�^��h�71�n��F�Ș�yP��"\ֹ��-B�-΂d�,NJ�`/(�
+�bAA�d��Hy�ղ�֯dۆ4f�i�,�5�L��}2��dZU%3_����S�1�1׫�=W̽H;��X�x:O#c�㳪��E�p�FI�B8�1���(r��Б-�
6!�Q"�ګ�
{�d�w�Y�>ey�&���&��
M��CMZ�MZ����r��4�;��ej�\���A�����+����X�Eq�
��挄���2r˲�S�/d��SY���l���N)ݹINu�VR��5���5I�4���)I%����)R�C���m�|��Gi�J��%�i"���ߋ� k�$�UN��j
r�!ۥ�ɕ�,��]]EB��LHu��W���� �]򲪣r|ը纯�U�U��T�
+U�+W���g�`�/��*���!m�M��VXE�]
�k�#���ݳ��Fz}����IE�DŽd���A��yZ�8�Z1�~�����SI��O�r�Y��S��ZU��!�ϸ�\�R㻤�Ž@�H5�
5����� �IFJ�d$�LEb�<�[ð�u	⽉��f`�ׂX.�o��m���B�w���{P
���޻bh�'bh�*�6�FU
{��'��Z��a�'�|/�����^@�,�
�%��#�k&�� jU8"W-EĪd���Ģn+ºK��u�G�|�q����X�YĖ�,�$��&ni����TUk_�p�
+"��$�D�ԒPJ����2��Uc�LU����jj�:J��ϕ�:��Gr#y�����<꒕�Ȭ
�g��*���]Fh�I#t�M#4�4B3`�i	M7-a�
�*t�fpY
Sa*��gC�~m��w��@�^dQ�bOE��*<7P�s#�)7Fay�
+�믐��
+�����
+̟���j�_�v�;�\y�)`��j�cmAv�3yf�.�f����N5`={e!�/�b򥈥Rpq�/�R�?�-	T at i�ڔ�ʿ4A~��kS>��jm��V�����ҾU^�#�_�W�OjY�Q�x?���Vv&g�����R�\)� �"�K�/�ʥ�k����%O��<

���X�p���1P�
o�m�$5q���Q �c���XF��Tޕe�)�
+SM�4PI����Yh��x>]B
�I��ϕR�)�51�Jj�I��b�۶2�1
oc ����R
P

���RC�k(b
�Wov�m7�)�
��
+�	��z�rj���E���
�o��TK�;$�]�++�>v
�۽
���c~�ǏZ��Z}-ͥ�b�b�� j�W��#0�G��
��i�%�o���FɺU���h�$��/5?(���G��	~
ŏc���0���$~�b 9E����Q�:�����_�|F^}�I�;l
5���wK������a�
M�ch�JV��0 ���E:�\:Ǣt�%�B{�
�K��u����L�/������� �gds2y
��4]�!���T�=A�OI.����? �H+��X���MXPܥ�����
���q���>g�A*K����c�����zM#�c��/�v?�>�>��~���_�zN�o�:p�t��p0��J���Sjc� �
�&C���0��&51I�I1�/�g��
ה_���q0 ބ10f�
X�P+`
��-���6�P���Ol����s
��&\w��V���6=�
�0�a&��~��j	���[��Z=��W�^�u_���:Rt�����z�m���e�.������4�+��k�4�xƠ��F
+)O��<�/�~v��VW%qm�wڡkڧ�:G�6�|"gֿl�"\��N�:u��[�ז�j�D����+D1�����x4�b��j6�������plVcw
v�R����+��4�g��SX>	ίu/`�@��hȉ+������f7r�� }�!�>�w�7%�,g�ҹ�Y���n!�K��kt��
�v��>
�	<�����Z����äŘ�
>��<�r�
jr�sqQ���A</��::o�1�
O�E%��=�h�G#{�P-�^9��ح=څ'p��S��[���m/`z��u���܂��Ϋߔ\�"�D��UG�*:�8�o�1��h$���M��	X�N>�KP_�
٤����4�*�3Z�zC�Ǫljjm3S/`�R
�
_Z�-��
+�N����!����M�h��o����n6\[�������b�6��R��\�wϑ�c�*=V��c��=?�j�CZ�yF+�n�����{�>�@<���iGK
����i��O��)r��N϶��
+ז���ѻ��Z�.G��Z�z�ִ��r��Z�3]+}fk���}���Ϯb?���j�ԿV�����r�(���E�	h�!��¤ϣxz��
ήA{�ցgկ�6��h��*�ku�x���/{��*�0L�
FkYljZ�1I��Z����
�+'�B��[�0x���Լ�k�
}��P�
�����~�+OQ� �f�×u��6�Py��V�WIH����Ra��Z�i��:����Z>N��Z����5/b��F*#r��#7i�{�YQǍԨ+ƌ�G��(�HyNd7x���
�g�{�=Ê6�Wvg�"7�
*�l��.a����n	ZЭ�����跔=Js�'jvL��bR53f���g̈Ya��T���2�c?5�b/ScSbM#�I̯\%��g�ˌ\}�2|)�)�e��n�E1>���=�*��U��)��@��=D���a
���)�f�n$[�I�
c�u��huX&��L�;by7�q����3�q�Fz��Wh�D{�o�͌
������	�q�ڽ]�i�V�K
4+>B�	 [...]
�1�g$��b>��
�������0��{	KHe�
K�"�I&�L2If�LB&�$$C!���"IT�BR,	�@�!�(}��c��V��V��c]
+B����_H��g�3s����9�|/>����X�$��E�
�Ґ���cU�8E5IsT��@U�-wd�ґ�
+G@�2#�Xa�:�Ŏ;�BG�Y��n�;�[y�c��q��9.YK
��$�_�m�q�g�����.j��]��L,k�c
�a�c��S�UU�
+��TE�<��'�,ݩ�ӣg����F�s�Q�3��L����w[���,��q+��'+�y��N��+��fNj?g�8�I�K+��M��u��J,�����T����y��]̈Qif��3�ȝ��;Kn���EF����k�\�m�ǽ��vo���[��V����r_�\���GF��9�Ʊ
�l�M�Ԁxꉧ��,'�r�`�fE�8;J�9SU�3GK=
��q��ɔϛ�\o@^o���1��Mf�g���<`9={�4�cV��y+�󱕒c�}�fCV?��8�+��/�n�-��xB�R�g��T�7\��c�_-�o�r}���'��w*��Q�?_n���0��#�����b&�w[I�^+��Z���\����x�m&����}$�=��o��%�PF<����/o������t��
��]�̂eR�
+d)=�WZ�X)��#��H
+����̈́�.sA�x>0�
�7��f|>���x�����h��A
,�B��
eVVQ�2�#�*�Rz�T���Vj�|��&)�ԥ�`��-
+V(!x�� �l��c�
�4o
2c�������ؒ���bی-�͸"ۈ+��c��/bO�~o�&�j`��<��H���i��X���1J���E�ӕP���	ZJU|([�C��
+���Jņn3�ڍ١�Y�����������3������l�1tzJٓЂ���R�}e��e�WJ���>�C5o�(�]��k�(��F���ӜU���ʥW�j֪"ͬ����F��nԴ�nM�=�ɵ�(z�ۚ\�1��6&��gJ�m<��h����|P�u <ش�����Z�Ճ4�>\3���	�i��7�Ѵ�xMmthJc���uC�2Mj�ӄ�6��i����i|�q�kzC����z[Qk`�mD���#hl#���Y�����y&-�)
�tS�4
��<D["4�e��o�����o�I�Zjlk�ƴzu]k��m���uնY�m{���F��WD��l�I��I��O�ݷ
+ߋ^
TB���:�^Z�V�ŲNoA���
�Ȏ��Ή���XX��.
��Ӱ�
+
�lPX�&]ݹC�;�誎3�~AWo�5�n����lo�l$ϵ�Y�P���F�u+k�Y�k�f`W��ѿ����X�5L��"5�k�̮I2�8�8 �y�w��Yh�$�M�][S�
��
�������λ�z��s)9�[��
��M�Lt��H㱉��T
+���K2v��W�����C3��d//���`�������N��'�����
@��~:�s
�5PB��wK)���w��D��Ҩ
i������pЂ�
v�q�8

'
&�#���a�ˁ����ea�R�#$p���K�����ȵ*5o3s@��;�\'�E�Q���?*
�E�7p
~ۇ)=I=�ӈ?5Jzz,�0�቙��ٳ
��K'��
��'���x�5�Wh��+�-"�l�M�g�����x4#�JÞ�̧�<'�9�=��?��Wь
�1�9� �e��2q���8ρ�
+�U&��. �ר�k�[�m���H�}��+iޯ��p#�
;9��<���K�2�����M�f�]j�>s�!&���E���
:�TK�Xܗ
�.S��
p�8.�j�k�a���R�3н��A�W�e�4��ހ��Rbc�‡�/�L�>e~>g�|�A��`����fN����m���
��h5@��8�
+q�
�P �`%��:X������>��q���B��x_�]}���%�~1�%� ޅ���&��V� #�7B��%B������70v�ޯ�ե�h�>�g^�}~����$%zEs���`@�}x�ËWbCa�ADA
�z��,E�L��
+F���e�;{�v0-[��nr��t�#��L�q�������j��h��8���Чm�>G��u���lꖀ��i�E�P�0'o��eX�׈�<q�L
/�����Y�Y�=��-s�\�yL��ǿoΆ$@��Ä�!�\�0`�
��c�m
6l�aCH ��%9H�PҜm%�Ҵ9�4R�4G��֩��i�V�Ȧ-�4���e���/	Қ����'������������)���'t���pg����Sx������x�
Ƭ�Z��Q������N���
��0���]�����s��?������u������
���]��
W��4����#={���Ԍ�O�J�5�*�:t�0�#4q�V��N|H��5��*}\�.��I\�\��΋x�N.��y^�s\�٧'�y� 3
1��n
S��4���[B�x�S+�k)��j���9�6��.j�Rc����sN�u��i��$�
��c\�Q��4W9s��f92�^�o���:	|�sk�L*�n45��9�
+�����+���9qJxpB�q|N^�3��s����qL͛��y�ph�yLο�
�`�
_a�o�'L����1u��4�tr����X>?L�����0?g�pj���J��U�^l��b���Px;�w�@x�#F�7b;&"�aw�Q�\r㑗�#��G~�-Q�X��M��7�����g����Q;�O-����SQ�p2"G#q$*���q`i9�-���2
v/k�ΘV����#��c�ak�6���X��.
#�/a8�6��
���`�����Cj~���c>1�1�������_��Cq��y,�$Ȱ31;Vc��JlYi��$+6%90���H���A�O�P�KL=�P�IS�A��&ze?�Z�#t�I� �%U�oW�9R2y���WP�~X�a��Jy;R��U���496�*�pz9֧�1�ڌ��v
d���?�}��ѓ�ݙ��C��M��7�!�
�Y�'K�G�=2%|�'�>K���L!��rl/���碗͙s1��
�
e�c [���Do�=9
�V8Px�Wt�S9��ڕ{�QN�Uy^�����	g#�?¡���3���m>�K�,;&Y����g�ɸl`\�*cї���y��Ÿ_�΂j�
+��(��[�
+OaZ
�p�6¥��jJ4��	�ꚰ�>���ªzB$a-��@�S�f����4�(c�CO#��	1.��a�V-EWQ|řh/΃�D���*���.m�������^4��aS�$��E���������0�� ���u��3J$a"?���J�E>��N�ś�i�^�����t!:�Q�%��,
�r\�pVh�E��
v�6�V�Z�k�`�n&�AaԾ&
��E��Q�������H���5咸Oͫz�4K�I���='=駛q��f
ܚ%pi��Q)CSU6�U�hԕêӣAgF����&} F� 
���F@����N�����Z��O��IB[%��*%q���X'{��j��}�񻋿���U��Z����LXj�`�-��P�:�FC#j
-�1tBo
Ag
��}Bc<!ʍ�2�
�6�F�
��ZI�k$Q6C�$nQ�m����C2J��_K}����v�o0��R
S�
+M�0��5�Ƭ��\
��
U'*-
�X�QnE�eB�Z��b�;���PY~%T�I�L�(�{��:�ۢ�&`aۊ^��q�5���,
Q[��x�2TY�Q�X mc4�z��L(�5Am��փb�0T�](�
���D��#���R(
�U�
��K��z�2I��A m�F�V�
l�t���6���9��IP;2P�P��Q�b�ENT�F8��w��Z�k
9�W��zY����~��o�;$d5K"���%q�e�I2AF��O|���쀡�}K���
Uk
+[P�&C~[6��
+��A��#�c���^��dz�a��0Vy�#�{2�� ���6	i��-aU�����-�8YO�i��ɞ���m���@�o>r:#�������w�#�K�
V�5H���A� 5Ї��f$&�"p���|��wH�d�ꓰb�	��|����
�.�&�
7P[��M���`븪oR�#�����$3�2���R$uHYjA\���,
����iD��"*�cD�At������H8��M��
�E�N
�Lm]'{� ���L�wX��ǿ *��p ʐ%D�qE��ׁ��
/B
���E
��yj
��Ml���`֓&����8�֪16Mn?H����}~�~�����=��~���_������Y⦎%��(	��)Dn�(�/WS�:���`ʖ��@Φ%r2m����K�ʡ�
���|���2�L��h�L�cx��,� W����<�$�R�k3`��\��r2����#s��͡jg�Q[� ٙ�ek�,3ƛ���vs�Z+�*�P�b [...]
+�S3`���V�j
eSˌ[ۑC�h��(�u�:.�:�.X�n0g�<��̙+
��[�F�_sa
+�S�yH1g`�^.�@��U�s��$����z�
4���fp�'E��g

�
+m=E�������'��������{�x�����K���4�b�X�94s�퉮�j�#��M�C�d�;�s���rÎ]ر;���ر;h�(|F�u��l��]p�w��r��߇
{�)�5���՜��� ����݌>�4��A�p�&�B��
��4��hΏ{H�c_N`G#�I#ů�K��u�X4�`�;�1�'-��c�ٮqu��x-t��ɞ�%�CR[��1Y~ւ��}8��6�9��4�.�Hb�U���(�M
����m™&>�v
~�f���ت�����n����c8!�;ݪu.4@�W�	����9|������
��-�M��
���yw�t�{���>S������ӆ�#��I�?
�{�Y�r��U�
�
+n GL_�M�%݁{ց

0�=&&OV�ۃA�
���c��Y�p
��

��d�r��Xw�@���0
�C̄9P
eP�`�~a��Y�̍;���ټ'��	�K=�=⭇�܁���uޔ������_�8
� 
�l4r�9�	s�c�x�
�Ǝi���
��)�>s�]��u� ~˯�|�
�|
��\�K�68�
ش����
��+�/�����c�Hg�i�?��
؂�.c�*�Z��k�l7��ң�49��Y}��]�Z��Z9���flA���
M��O��Ţ�:#�W��Ϛ��d����D<��/W��2v\Ž
Z�s��.�$����B���|��D�*Vޅ�p�نg�O�S�-�3�7��V8~$`�P]dO�)�㘁F֞��\�.f�2
���VG����r���!���e��~�dJV����9
�]��|�
��
_|�#�ht�����Y"
f��Q��;�c�^�أj�"G��&�A,��[Y�
�6�M�Y��
��߶i9�l�숗�Xu— ��N
��n��N�a������F��
[ȏ�2�
�d�2"���62� �P
�Y��]�n�@�y�r��������,��9lk��
�tŧ�dX�"�I���h$�1�4429����J��B�b����*_T�*�c1�����
+ۧ*oC��{���S���1���ڝ<�A	����<8�~Zg�ն�Z�f�V�
ղ��Z�n�j�MRu���j?Sf�9��/Q��b�9�j��&-p�-��Q;]T��-��Ԉ�����ɏ��>eo{g�)��Q~��h��A�N^Z�
��0U��i��EUUn�E
&h����er�U��|�w+W��r�m�
�]�w?�<������
��5����n��k�0�I�!�vß���WÕ_�n/���*�}��c�J;�U��
*�4X�;��<�1*�J�
�,�{�T��\��,P�O�f��ӌ�o���������v����?)��E�]�����C)�!��*m�U2�a��.mT��AE��5�k����)�7Vy~��7L9�ɚ�?^3��kz7����
P�� �2VkJ�6�
Ҥ�3J
��&=Uj�E�����7%��g���a�z<+Ŗ���7�fn��^	��� ��
���jz�M�9X�=G(��e�JSF�,������B�W(5x�&��k\�A�
yOcB�+%�F�XZ�(.E�Q�6XU�
�<+Ė|l�%69���i!]55��2{�+�w���
��>�4)l�&�MPjX�&���
/SJ�
+��ج�%E�҈���
���C�E#�\
�0�6�C9�,{rh�a�
�V�ᮚ�ɑ�J�쭉}�5��
5D㢒46j�R�'kt�Q����@#b�jx�F�
�OCcNjH���,
Q-�����נ�\Z�
Z#mP��G�jR��Rc<5>�_�b�5&.R)q��o���%jd�%ŧix|���4,ޤ��5��^JأNh`�'��P�-�?��<*���?we1 $�� n "�"�

�2�,�0Q��NHAA�(����M�q��Z5q�4զ�M���6mz���ĸ�&��ƚ�X���a�9����}�����"Ρ���l����X?m�
_f�K1�S�U����@Y��(/i�r�'+;� ���,�E&C�2
2��UZJ�RS�dH�PR�>%��RB�NJO���
%$�Hr����T�#,�g���=
3�
+��b��oe�Ȝ6R��pe�E+#=I�t���s�j���L��J26(��\��M���G�'�qA��;�Nw(��4�bS
:F�
�@�Q�U<�Cq���l6�)c�22�Pzf��L�J5M����T%e���U��
ř�4�lW�y���4ɼK���`�nkB�C�&���0#�Oa4A
̂�`�
0eIFs�f{Ȑ㣤�@%�VBn��rc59/Y�y��ɛ��M���DK�&XZaY�p��Y�)��
_+4ϡ�\�qh\�C�R,���r(�)�J�
�<zn�?e�&�{)��_���*
Ӥ�I�X����tEXs4�:M��
+�Y�jm��5ں]#�����
+�~��B:��wh��^�0�J�V�E7�Q)��ٓ�1jZM(�TD��‹5�d��J"Z��%�)�����,-SHi��J��T�j�����P�
����FC�C��
ڞ�� 
�lP
��fю�2��_"�gT;s�F�{id��B*�\���H=Y�@[�F��4�V"[��l
z��&_�V����vnjX�C��t8�-s�E4V@TCL�\F4#�lyE��_.�at
���s<�_�-�� =Q
�ǫ�ɷ&J>5IVc�w�U^56=VS��5��Y�!���r�>��>�<�
��e�k�z��P ��� ��
+)�il���u�O� y-��P�0yڇ��>���
+7{���4�>]�5�o_����p��S$��l�7�SO7=ϡ~�z&�j��"��9�Ff3��A��(h
�
�����ܚ�4��K}�i~�i<���[�dZ8�Z�L-P
�ky��g��ຈ�m�
��l��y�h�*^/�|�3Xs"k�ĚC�� �7IÚ%�%m���,�1ϵ�x���XE#�����
��C��
�N0�1Ҿ���C�� ��P���"p8iF�j��z��͚
�� �5J���c�{��J�����j}?���@�?6��f���	���p뤰;YT'�:��p�������p�
z��y�b�F�cI�7x��Z�Z+�o��w��^B�m���x�B<v��.�������c/�>P\���w���F�z�w>�{��pbGs֏�

��ŜC�9��V�M�(���g���U8 ���@xu��������q
?N�x���;�A�Equ����O�/����
Nj[9���W��<��F���^��W]ZG���Mg �_��p��b x���%7�Ҡ�Ï�
,\~��gw-�������/�M�CO���H���9���;b?��%�=�].���;�z���Çp�9����Ae��W�Kä/��
+M��
��y�"��
��uj��M�穀5��Z��z���a��qi����ȥ���g�7�`x����a
na�
����w4������'?P��_���
\c�
+���z��� 
� �a:̂�`�&h�6��5z���=�}�o���Ôx�$}��L�_�
�6o�p���9o��@���
`
DA
+dca�~P���:�۱߄�V��_����?���4z�"�J"����<}��t	K=|�Yx��C?���KWL|Y[0�Ϛ��2�cA���د�j����������~|ʴ�	S�ټ�T?�QJ�
z�9"�>��uqN�	��?�%w�ŗ̺7��5f�/��N��LN>V	1,�v��b{%Ө���;��[��|;�x�R>����<Z7t�H
C�u8
+���#>prWJU}���s_�D��щ��T�MNΨ@�Ə7𣋼������:~
ŏ�Z��u
[����8�}D|E��
�Bm'�|��.85�go�����-/���(t"ш�Z:�s�_��l���خ��|l6bs����ll�2�9=ق�
l��ds����
�ۮ�����"G�'�#��$:��D����
��b��]P��r����\l.`w,$
+ϓ��T�V���W��UD��̮�������r�]��9��� �]���;��A��1���B���9
�(��h���r4*Ѩ�f
,�R����y
ZDd�+�G#��r���"���pvrԾ�ѿ�+`�ܵ^��
Gk4:��ı�T-��T�iL\�����Y�n0˰/� �2,�� 3,3��1��
���$��v�c���xK�ʭk7�V�괪*�R��R�U~���V��.Q*�J��c;R������{����;G:����	r�q���+Y�Ȧc�n:�J�F�d)���ﱰ��G}��Vu���Wj폴�~U��e�Zr6�f_T=/�F�|T
g"S8�%�S[K8]ͱ��lsrx[�����}�嘽,�Lr f���Äc�e.v���L��g2�=&�> �1�����,�wvi9Tk���%�?k�5�t2Y$Dq"nG��9o��r�j8��`!�E8��\���� �I�L&�1��B(i����K����{S
H�9#�3�j���J��Cq'_vD���Syʝ�i%S
K�,'�r %�pj6�i�L�U1��������݌��2���ьQ�fL4-0�`�t�ݙ�2�y_�
d�������2����L�G�_d}>'.�z�i{X��d�U˜j�Ɍf*3��Y&�w�/������4�i'� [...]
+�Ū���I�W=����f�8��%��K�(-����޲Z��<�.z*<tU
���b�e�e�6�Z,��l�:M���񔊧�#|�
+�ğ�bF�k�
գ(Ǡ�Y��gI�[����LwU]�V��
tT��v�n��i�N�b[�a[�ѶA��6v�ר����� 
꬟Rm�v��B��CY�cbAL���7�c~�اz<�(�m;pפ�Q����gm%muvZ�Zh����G�}�F�~����'������&��������=U�S]g<���]�[�Q49ܠy ��; ��߫Z�US�=���8�RhmȢ�� GcM�5465�����䥮i�Z�86�<Վ�T9.`qܠ��e�G�:~GYӿ�Ay�AE��]i�,�{�Iߡ��bH�.
wiۦ���
CSs"
-Է�ao-������zlmmXۺ�n�S�6��9G��(��(q^����B�(p����R�jP��7tՋd��" |�#\��U�K���
Mm�l�4��l�:
+��`騥�����N�:�)��C�{�B�*��s����u�
�����
9�� �� �e��npS�?��uBX��!�'�Dk;4(>ֺ���"�t�QޓDY���
3%�R�=V
+=�x���z1{G��N��]a��92����������k�=���c`�~�5��3�t��
�
�RLrH��[�
(�m
$`
H#Ϸ�\_!9�
+�}u���e��1���ӿH��4)��$���(~I���$
�=��5���X�E�_Z#�_t	�^���}�Wt,RT�
�$k$S ��@:;���I
T�h$9�")�Obp/	�yvO�L\�Mb��&&��+�#r��r�C�|ǥ�Ġ�p�!
Ү��Zj����B��VCq$������Y��!6�BL���a�CSl

a��Td��o1��'"����lg�qHL��ݢէ9(�Ji+"�J_�1uBp:�ع��	D�S��bs�����Ma}�a�ܰn
�Byw�x
f�kf?T#������VJ٭�aH=A�a�+\��8�9�J�I_��4)�ҟ���MD
��Z��Y��XI׃(O
RS_US[�Ƕ�\���[U�\=%���=���@vP5,O8"�Y=��%]�6�mz�I0�H_�)K����0l>.�wR��
�)���Z��L�
-v�j�����5�!���/����C��p��'�V5�4X�ք�,(z�۩g���

C���|D�' z
"���9��&5x����
ZpT�%���
-vz'�5�7�`
B�cㆎS�}���&T��y�i�0(:5�
:�� H�tR��w��K����c���)�j<�)�^�x���rS��긭�����
M��z���[����
9�����5�Yi�Gcݲ�9�S
Ok�I7���e��.���5��ӍB
��2��{2��ce���e
�y��
(�K�k�]XXXv�]`9DPEEE-�}�3�Ѫ�68ƨ�ǚ&5UcըʹM���G϶&iL�L�9�l?�q��g~�e���}��y�G�㣍
Y���&�Fa���V��[O�?�r��&�4ݑ
�C�ƹ��ߢ�����ԩ�~�?�p� Ҫ���
'�K���i.�g����]��l 穋
L�h���ݷ�S
c
���)+����C7`?��vj�	��$��ur.�{�gx��hV.37������k
z���nP�7�I7��M�����;*�D
2f;y6�U�+�6�����S�|���}�.���U�����Xz�M�|��;��]j�
sr�E��5�zH]< �t9}���"�
v�@	��Z�3a,�tS��|
��=���t��������}M��>��|�������\�sOz��O���  B�VȆB}�24F�QG��@�����Ǘ����9
�3���Е��b�A�\�Ru���!u>}��p�?��^0zݣ׽C.����RC�('~�n��>��_~�fb/�%||�������%��
+�x
����6
�O�t���k?������S�n)�qG�>���H^�WB�ԟ�q
��sϨ�سu�������8�Mhl�����6���u��F��*�
��ާ<�k1N161
��){:&�2�l��Q|���#�&�x
��!Mg�M:���c��
�w�����/w�E�cj/�v��wz��YΗ:��Irq�\
�.+

v��*
+��aڃ����I���$bNgkbw%[�z\�h3n6i#�7P����P]�I��4ou.�w:����h?��K.vi ��nE�A�\��G{4�XK�IěN�����R�j5�*"� �/��rfu)�f)�O�U������p��-ql'�e��Z!�#�1�Ѱ��Ɍ�i
>V�c%>V�����2�e	�e�摍�ϯ�il�JfSQM�����4�9�αͷ�
h��f��
x�%{�Z1�p"ơ���4-�6�o,P���
+4j��T��mnq<��Me>������_x
��������
y-���5
�+8�{w��n}W0z�h%��K���dhVW�fv�Wc�!�޽LӺ�R��8M�I~�T�c�&�X���[U�s���<�1=/���g���j�j�b(G�ˋl�a5�ø�p
h��� ?��
�Y�C���i�f5�iJ_�&��U}�M
(Q]�H��Ѹ��8C5�
T
�FU�[U�W�o�<�=���ߏ�2p�Fq��Z#-�9��3#���gj�Ҕ��>(B��lQmp����֘~
��+��~e��_����U���C�,d���lְ��ڪ!�T
����~ �

������q���
>O���������

И�U�Ekt�I�"�2¡�9*P�J4<�B��cU��sh�l����+v*�pX^�9y�n)/�1ON"Cm	\e8�3���
�O�o��S���x���ʨ~*��Ԉ�x
���4&]�b�44֣!q�*��¸j��+�8K^���+ǸC.�!eǟQV���p;8��6���\E@#���$����#�R�S��A*��ЄX4�h�M
l�Q��P^S���U�5��mn�˼HY���L�.G"�\�i�'ބ���}O�0�t ���\{��L�8�g5G~/�K)^�&vWQb�
+�B48)J^K�<��Y��Mv)'9_��e�T(3�VΔi�H���g�f�&�����SJ�^��@��%w��M�.���rdž�P��2(��b�
������4 at n�Q.[��l��L͔3�#Gj�2R˕Nc��� [�\Y��(9�yY�(1��iW�S}Jj���nt�s�\�N-ک��r>�@���)��;���҃�i��
��
��V�gd(͑�TG�9�du�(�9Yg���dr�F	���w�AF��2:�)��SB�}ځγ�$�
�:P����^
����,�g�3���_�Yٲ�5(ۢ��t%gg���W�k�̮*�\�Jp5��f�uoQ��eE���ຬ(�]Eg����S
�Wg�ђL�1P%P �����R�]e����`Yr#��+s�Y�<��9���S�g��<���)�;S�2Ez7+��;�y�*�sIa����SDn[�X��,4&r����P
^p��V��,�o���4� P�!2W����d��U薡�P�E#Q4N�E�
+-Z��E�'�̃�>�8�dY�]p9d�j
F�����Ev���Ǯ"��!�fR�zD�1j5�6�$�HӚ��1�Zs�L�5�Gڴ�4u�S�v���~��L�LJ=���}��}��}��J,}Z�җe-=/k�Mي�\!iZP[O��h�g
��J(�<�E{,�#��K�!�ʨ4+�iS�3E��L�8���
#�+W]EJr�ds���Z�W�,�͊w�Xf�Q�\g�.s%�k�=~�FG!�":�P
eP�idz�
UF��3�8��dw��
��$ٌ4Y�!J0F�b�W�1U�5劫���Ƨؚv��e<�H�yEg�
+_+�
TtuP��X\�~ �ZpA	��x�A{
��]�36:<RJ
3��HYL��Ze��5��P�w���*ʛ�Ho��y���	$�
R^Ɔ�p�`����}t��
+�����V@L��8�GTKC�
3��N�1��ϊP��X��1����}\�~u?��M�g���3g���!��0�C�1�����Ü`��v
.��tޗ�T�g�Yb�3��g����`6��F�����fc!�"� �]��7�f
��́v`�
0D.b8]�`��.�
Z��ЙM���"ׅ����ziX����dt�
$s�
���
�GJ˘+;hv:i4����ts���p]�f�.
u3gv��
�y�g/p9�|�
��G��� �R^'��Ĝ�C�x��Z�H�eR���&�4u\�!�c5~�!��c=~l�������uk�؈����q��C�}������ڠ|��S:N^��u�<j�U�\�>�~��ԏ0h.CM&
l�X��o���ӈ�`]~��񣇋��5顸{�	ٽ	��]��k4N�>��br�K	�$���B]�)f:[`��k�i8`o�g��g��~rr��9H}
�;¥{���Ev��$��
�9�P�,z�)Y�J\�B�c���U�?t-��=��7��������
L0�cQ�q��-��)�8ť|��<�B�$�$��!`=޺!�����\D���|�f)�x���R�����O�hX�ux3<�Ҫ_�;�
�

L
�Y����c��'��E�K�e
+�2A]�ؕKpS��9
��(b� lj�P!ݟ�+a�p:��+�5�
���pH�>�?c�t�$�`]��9���s�Mx�B���@w~DŽ
�q`�
+�a2�B5��
X X��Q�f��e���z���E�|�^&���W��T���_�?�xN���D��H�
x &@�Q��G�ՠ���oLNי�1�]e
+�?>Ǐ?�Y>c2���D�|��oI�9�d�
�8��8�>�//w�@<)�3��̤���N�L�
�?>ď�0՝��� ?���{�wg�RO�yN�9��%�x�%��cd�5^�� ����\���{%���e�3�)�/&�.lخ��ll��n应�w�E��Vو�v�ϓ:��^�<@��G!���������.���b(��?��h�Dcy���2�Ķ�uDڄ]?Sm+�_�qх�*�?J&v�����%��}� �
(n�C�
+�D�:\��fk�m�t��*�t��3z�s��<l�`ۉm�gb�I���
+�R
K9Һ�`�6��o֓�ul�����t��j������

3�
�I{��nYа���1������f���;����L�5b��J�q���a�����x�E�:�d'�ӁⲾ
u��#zo���Б��F�BWA�t�h
!�#����Z���х�G'~,#�O&Z�D���X�����\@m.�6��n��s
����;�w�ޯ]���{d�XN}v�&
��Qhdk�&�Q��,E��*x��
�h!#��#|�B���,֣������r/�!�4G���
Z�-�
+������u�T&b����V&ֳ��n���dt
+�)C�
+�Z2ш����%T�J� ��TO
�e�?<���
q[�Ƞ���}�Ǹ���X�Ƒ��`	������"�
mּ�6͍L���C4+�5F��7:G�1SUS��1��1����2b}r�.Rul��LT�i�*M��0
W����n��
�/G���$3����
[�kK
+-��Ɵ&X��d�W�y���͈���Q2���c�$��@Ֆ2UY��ԩ2a�*�,a�J�4�K��ګ�ʷ~�|��!�{N`8��NZ�u\���>�7�]
���/��Rk3ɰZ嶥j�m�\���L
�ʤ�"i�ʒ�U��T��ZM8K�[T`�T�}���wj��9M���
�E�$�Qnr���v�J�
ˤ������3i�
��Ɨ��R�
-g�E)v��8T�:Lũ#5-u���&�0�P�i���єA^M
Ԭ����I_�	�ە��O��_���
��k���x
+�G�҂Ҋ.�
�
�`��+�ܔ9"T�0k�#Q�i*������7�e�y��G�(�
�A�uY`w�]`�e�]�]6��x�M0�xD��⠉��h���hԦ:���M��4��=�$�Τ�v�I
��۴�
;���^3
�7{���y��{���wi��J>S�����MM�,�)O�"�t�]�-��)���n~]6��p��D�o����}=׿%؃��
+M|���!�.��oNP�9M�1#U3&_���,UV�S�SE���嶶�i] �u���.�Xw��zH���b=�x��p�g�ي�lA�
S���!������|��(^UE�UY����\���QY�M�29m^����a�,�-��<ٗ�оY�.��e���|�9�)�-�0�pv�Ӎ�*��-�M0	&�]
���*�pĪ̑,Wi����*-5��,���T��RŮ:�&��5UW���2�7j�{���/h�����*�u]9��r���Fc3��e.�K�FB��|P	e��;GY�l�i*.�RQy��V�e�(���S��^&O�F{f)�ӡQ��]��FV>�L�+�y��>����F�G������
��� ����


�����*^����3T�͑�[�|o�F׸�[S�Q5�SӨ�|3��kW�o�2|ە�ۯ4�	
��\UZ
�FoT��Q=F��h.&�
�B��
+}/��P06F�k��[��
���y��o�H�CY�2u�LRz`��
�X��mJ<���q%�(�YI�{J��*�6�-h������ �Pe`G�Z�>�-o
�cB�2�)�f(=�
&����rkxȧ�PPɡf%��*!�BCC݊�S\�b�o+6����zn��ڌ5]��
���0P
p�]����W�>�mĤX�6&*%���p��¹J[4,���p��(.ܨ�0
/�6�&|�f�,4b�96Dx��5�ƌ �@=���|��mA{�D�'��R�b�45AC[R�@�p�D�T#E�M
aP��������<��0��i���BS��Bc���a<�}P�{{�
�$�7��e�h�6�u��grј��?�v6ʜ��M�����nc�ښ�
0�m�x�9c8����GX��f��H��⽓1[s�)��V�)m�
)n
�ql(	�".�ɣ=���å�M�����$w�c:<_��O&��
���(���ӧ ����&�⩒i�X�
tS�K�(k��Rˆp�p	[�eg%yt2'�9d�r��cN��/8&s-�[�ֳ���j�i'7�U���j�����C�m�^0}ƛ�nr��
]�"W4y� �&걙zt�G7��B
=��V6�,�Ԣ�����\�1o��v�aM]Q�D��:�����R�o
ig3�tt�:��~͍�[`+<���(f�"�$���<��G/r/~/
��~�
��[��׸�q��}p�Թ�Zj�^LR�
Z(
�D�TL�棆ˋk��ś���?x��0
�Ajr���f��-�8F�
cN���Gg��Z.�x�;\ qS�Y��S�;�Z{����\���������ٯ��_X�bS��@H
ؠAx^������q��4�[4ُz��q
+q�]��C��&�9�����x��
�1�~�c��I��2�7e��
8c�~��!|D�^ �K��K
��X�}4Y���+]$��>���#�I̯e'{ 5N�����1�bh�of�=Cc@~	�W�ad

0�����*�r�޸Ξq�M�&�����:$�fϼ�ɀ�
$`8dA>ؠ�A��d,�-��=���qB���~�#�M����]�[}�wu��O|ʯ~g�
�	��r��y�AX����z�Ea���� ����N�
+n�2.�S��Y4��y����y]����C4���b���9�eh����'�{�̻Ja,#t�Z\S	Z����!}����5}L
���>�U����3��	�xG;h�^��ms�{�V���3���]8
+�����Je|�I��NS���4
hT�O[��}?�#ĞI�y��bZg)�W�*7�e��ƻ�
�j���A�r��z��}��}Fw�����ㄧ
Sh��G�V4\ԭ��~b��
&�Tb� n�_��}�ث�
�ѫm����M-v�,�ϵ�'`|

�/�>g,��ƒ8B-^T*�G���_L|7�{٢����m���Ӊ9����:�w
[i��ɨ�
�F���ܤ��
`<
W�;k,���Ex��N�T2yg?��f�ۈ_F��t���A�7
+�Z��9
#�9N��Z֓I�:Y'���
+��\��9�y������v��2�È?�����#�����K����B�h&�t�0�U� �jg���BF5��׏��p�����6���X�f��
���Ʊ��ZtR���'�e
��]��o��
;v.�p�8q��Nl�p��9�
��&M��N�v-m�v�JW�rT+[�v
�h5���[�@�Q�ZXA\��1&
+

	����
+!:�'���������}���<_+�Qˌ7�ъF�Q4���$�M�,�c�]�O��x��a��YEVW����^e�N�{��{���J�;��Q��>��!���ctM���
:^FݏN�
t��f6R�;�I��h
a�
�:fm��M����E���Q��ڣ^C�"��)R�QX��
�s<���
+��uM!}*F��jT�����
tj"�W�5�=�d��Ʋ7k��
7,j�pV���7�P��E�,+�s_�ܴb�%4�J�{J�CvJ.���Y�m\)W�eʘ���&��+W*ߩd~��
+Z4Z�HAD�˜��*��@#S4�hт���k��"���6�P��
��:MAZ]ƴ��w�R�IJ���fa��	����X��<���1ٔ097�4dnҀ9�~s�b�}���kIi�eF˜�,
�
W�rFA�e�Y�*��]��� �Y�z�����J9ZM�
`
��<�ĉeȖ���"
X-������V�����(b
��֣.��:�c
+�7(hߡ��}
+�
Sk�j.����7�-}G���\�ܓ�<:�B� %�C��YXc��)O�/�;Qb�-�SO�Y�r��ʫ�Y�V��I��6+��^U�rD~ǤZ
[��ث&����xF
Njr;^����
���Ɋp��h����ƒ�8$�:j
�0.��k�QmR��D�5j�q*P� m�Zj�j�����9�F�fy����|Bu����|A5�WU�|
� qO�P�ٍ�Q4�`
�z�=�^�0��>�E���ü�^����P�.�Z\�jvW��]/�ۧ��v5�GT_?(�g\.�&9=���<O��sQ��*�|_����Wy=<M���ۅ%��� ����������<y�jh���T��Nn�W���ꚺT�SMӘ�|U�W���|'e�]P��+���'k���߲5�e��u�v�7�
؈MK6����B�x
�fh��ӼF���Z�r�����Fխ
U�[��U��S�Xe�)�;UxT���e	</s��2��
����J�����n����@?�@�ڠ�w�{����rͪ
�T
t�,�R)��C�zT��^/Kx�����%�_Q~�6����`ZEp���b����ǡ��]?���3D�OiZޙ#{�Q%�VY�ˠF��GőV�#�2E�e���(�Y�=ʋ<���"/)���L����+�
8B��h+��A�h�y
4�]�vU�XY��lY�
+d��e��T�Taԥ��O�Ѡrc�ʉ���VV
�0����ˀ��o��
+�U��Nڟ�`
 ���+/��hנ]�V�G%K�L��*�����ʐ(Sv�M�`�&�$���&0�	��F)~0C�0�^e�o��C#����Y;��]�#��U��
�bƒ
g)4O�$I-Y��@Oqئ��)X����`]�x)�k
+Ә�����$yҫ�o3h$a z���ʵ��5Џ��K�����f�mٓ��)����Ý�7́>�A6Á2���3|43
�#7�96��4U��_�.��4&ab1��۸z�s
V��W6t��-��ri�bA�L���"c+Ƕ�DOb�I�cN�9T�YPs46LJs;�0�c`w^�@�n��w�Uf	5�V�1!��a�5&9�f6�Ԍn�&<�V���
<��cw.�,㱗8��������@c
�<? x��Wx�[�Ǩ���
�)��`��v3֭㬁	����5��O7�XޔF|
4G!��Z�IO0/G(Ǝ2/Ljc�w�ds�M��X,ґ� s�	*�c�أ��`��wi�Go������X7n�
ڂ>�لn�ތ�c+Z�$
_-xI��L|�1y��y�uz�8��c�}���:�`?G�gi��s��y�Ǽ�O��&�� �
�ٷ�=0��ۃ>�9�g4Od�N�i8�)���<|
.[O��+�q�8���O^a���X\���ū�Ú���RZ#�u}��g�\�����"ӿ���3��0���+FH�a�
��W�
���M���q�����M�7��-:uq���Su_��qp?��a�`����ә>^�h^����� �;
�s�͌I�.��1���
����
�_�^�	�}���C~w��=u�e|�������>��r��,!݆���!y��tVL�
X1K�/�W�[�����e�2c�̦Z^�ً@'�~��y�y�_��=�ͫ
�O�8�v?;N
DZ���%���n;7�zI��m�vݺ6[E�֪]��
��B��ҁ(�	ʠ�*�k�T.��T`�@
��`��m��2���sQ�S>����w�{�y+8�!h�n�	X��
��_8�wp at 7)�8���2��}���]c�^e��� ��?��̫��
+<߅o�7�9���|
N��Fb-C�Oo�c���\#�Wp9/�|^�u��¹�|�<~K
��hM�^�#8��0lO1|�e�.�c
�_��
ރw�&��2�؉��_�3/�^P'�=�C�%��i��/pZO�~���|���1��!��}
+�"�zA�RB��L�y���,|>����O��s�yx��4c�$c�syy�0���;���G{�	�W�=���hϳ<��*w�n�Y6e6N��Y���]ad�Z�yN���8�K�΋e�T��/·df���
}?�ed��N�a���A{
�)tg�"֣=�S�q�y9���	�ܯ3�
+����O�Tn���a���w����j~���	m+���'�`�6��@;�v�a��hO����0y
$���>�f{;�{��n2��ŵSϰ�ހ��a<�_֜��B~�c7E�E]
��
��
��
T���K
�2/{��]B?��J��5h�g��I�8Z��r�s̜��y��)��u����&x"�<���参�
ǃ��-h�Qt���1����"���Eo��2K�n�B>@6�X=G�����Rf��f}��6C��<��o�'�G���q�։J�e�kC�}7Ƕ�a��1���1��1��-��4+f
�:O�l#�������
<�+xr
����d���8���rD�.�w-�
+�2k�9�s�9Y�޵��XE�N�f'�;VR+��	��8WY�\N�c��o5��R�T� #߯� ��"g�� ��~��m0�a�{�i	��g���XV�
�q��;��H�V"����/��4�gt6���覲���4�+���dg�dG�$~
+>K�c�@�
Z�bK���I�~��hy�Y�E6�Vh��F��~
,	)��Y}E	���S�Q�iT]�I�Lk�i�S��;�,>�D�j+>�V�%��������%9��ib
"�6���N�&!�����ˀ�Xf�2e�z˪�c�U�9��9�Ty�:�;�Qޣe��JZV��2�V˼�
j�
Q��AE-��\R�rU!�u��9E�q�s
��m
o�hn��0��*��]7�t�
Ե�Ti�U)�C
�j��ꔴ��XS�ҤZ�n�i�cƄ��YE�y��
j0�*h|J���Tg�X>�E����:'?
'�n�݅=XK۳��|���ý49u�_;�-s)�(W�a��Q���V����+�TѦhEJg��ά�kpn��r��*�[yZ��srW^Ru�
pSngN5p�woc-u@[>C�
)�V���B.1W���ljtU(�r+R�W�:��긂��
+�����ܫ�uo���n�k�UsJ�5_���#9�ϫ�}��*�s:���Ļ�v|�O�A?t�
�bq�o&�F�xL
+y,j��+P[��Z��ޠ�M�y���u����7)��6U�>(g�9|'e�="���|��R�uޜ�p �-ĺ�V|e�:�^�$�Z���"��s��~�|�K�w���F�@�܁���rҪ
�d%��
�"#�O��	Y�_�%xQ��gT
xS� �J}NBw3��h�&h��ڡ�{�����P��a�\a���.UF|rFB����t�
�
�-:'kt�,�=2G�WY�!�D.�����5���Wi8�{��	�5سl�y��	�Cc�~��;7�zUS����r�
�cN1d�5�O��Qy|L��j��7�8�SE�c*����h�ct	��U���
+�9?�ހ�ڣس^�V>7C��Pǵ�Irag+Z
+e��ʖ�ʚpȒp���1�xi�E%ɔL��%�I$1ILY��(�	IpB'��P������o
�+h{��$�qh�~�\�r߅uc	�H��^"sʢ��!Sʩ%)�
+S
j���V�
`
����V�4NaRR�Rl�֝��Iّ�]hϠ�ņd���6h�3 /���/��<P�@�������M��M,�"ϰ�2�E�
�*���� &&C7�9ų�>LH/�S/9��t�5��H����u
��i࿏{�v�w�
�#�����A<��0��sqsc,��1�
|�rl7��mF1f#���+�>��i
�<>]��s��
����4�y%����lH*�P_���r�s�N0+8t&�ܧ�H�(�)^b���)<��v�;[�i[A�:A=A�8�m9d E������A����ĵ�$+"�o��<8����ߐ;�ݼ�l��dw���쒓�!� �SAn
+� G�@e"
+�JG�C�)��)R��Z��СPfl�ik�RA�Te�j�~���N��ξ�>���
���e`�.�ɐц��
?:񣛜���M�' �х��.;q
��+��\̎����
�
'���)'/a�����S�}��	0�Pc7�!g� 
��y�� ?QK9d���%�
.���� 5���u!�����}�0�kl����V���O)�^ތ6)��
�`�{`�5�=�0���XI}�Əu�a���K}���u\��kWr at n�zc�y�GY<�D^�%���-ći� �5�M�7�a��&X90��Os�� 6���&j��>괟d+�V곟Xl!y}K؟�6Sϟ����!�s=�U|R<�
�����/��hr�뭁H(!0�
XB��qa�C�*5�?�+8p�l�I�>�����|��	��L�}_c�uM;9`ͅ�9�����x7Z�}���� ��k
�-Ǹ(dD\,
�FN���
�?#'')�3q˥����|x���Cul���b����3׻�Z��>�W�]���y�D&�Qp
�$�
�U\0�!V�s��%���q���@�ϓ�s� ,QTg~)���!Ļ�<�jg�	۬������13 BM�� [
�I��> �����e�W�9�I���н�Fs�ƺFA}�p�C&k��@&0@>�r0
���u�-�y
s%�
��kT�m���r� � YWI���e����{1܏�-S׀�C���X�5�ȵ�G6(пјwU�H}�r���:~\e����������M�!
s?Σi�j��OZ��{���$U1�#�1J	]v[>�_���mpmu
}�)����'h��ЗQ*���
�8�fy
+��>��=��w��$��)
t��9Ïa|�$
���љ�Y�;�6�����f���_)������b�
�5خǶ��&b{�gb���x�
�O�)�5d��t;m�G/Q��'*;���������)p
��X��U�f{
&��wѺИ����P���n���.�N������Vjd
~����E�=�Kx�:\?דDt�O��`X	>��������-`��U�2��K��@	�+�\�g���Q�Q�����H/5�?����z
�OR��z��^N��l�߰�Ǩ��c~g��;h�$�
��i=��
��lYnl�	�W�P��:l7`{
�'�!��n��
-�n
_�%s�ŃtAz�����D��w�m��_P|�
�ت���]>�`�td��J�a���7�#u:��ID�Q��R-4�,M�GZYm�� �b�ÛV�͵�ǐy,�G���1�C,��E'9� '
�F;5:KQ���L����䥅�L�>��f2����H���6��l�����q�~+��9�3��=\�s
s���A�OǾ
�ٚ��5E^8BpD��J8j�����nV_����D�����*���P�#����
ĸ�c7|�8�V�3�p�w1���wG����6Q)pd‘G
n���Rx�੅�
�M؟Ld�4�H�R1è�:g(UW�^1DwA����ý��x���K�#>
6s���1�3:m���Ԑ`�ˀ)��𔰓��U
W
\�ᚈ�x�C����	v�~���nw��]�Al }����`��hi�`,�
Y̹��ß�I����)�&;U�����^U'�4$y��R�T�R����LPij���݊�.V8u��S_T(u�)G�9%�RQ�}��_��ι�_m�>�@�xV˻���JP�=Eՙ��a�2å�L��2�T�Y���rEm5�����W��EA{�������kߢ�^y��䶝U�����r
�F8����X�ʸ�
�HjF�Jޗ�O�����4�:���Vđ��,��Y�*�*U�� "�� �3�����X�|�W�F�\�~9���6> ��>`���b�:ɧ2��0ہZ��yVJ�)�7W�J�I*vf*��R��R�Y N@����9U*�!�k��]S���˵HN�Ze�^���+��쮳�
9�ALk�=�YH�I�;c �Q5�W�R���>
B��K�?/M�<�
+�*�ϗ'�'�;�<w�rݵr���LR�g�
�9<�e�l���2<?Q�������|�
lυk�1�
C@�"�S
�|�^PP�,w�My^C��\�������*�7T�o�
�f��3e��U�������Yɾ7��;�*�{G�ޘ
��� W�!��A
��yA������-��@��A��������
��-T��P��C-J
�ӆ�)1�B�&�a�a0�L
�bZ��N��0��uȣj~�@$�_@���u
ϝŃd�S��d�ʌ�*#�Uz$��H�R�ÔmTbt���(�"�I݉�À)��a���%�ى���>����A׃A��A���?L�
p�����ew�^�g���;���n�	�,$�$�\ T� ���
+����D��8V�^���Bq
�2��Z�N��6�#�2�Ң
��
��>��q���;���9����o��yn�'�[鐫�%g�+{ ]I�l%
+e
VP�!��d�"Z��� �"�8��<�<]��LpUq-��@�ԉh �ܛ_!�
+���c>
)�
$�Uc��֥�
&�S�a
+(��H�w#��)�<a�s2�9�C�>��q-���J��FP
��.�~1���͵�~L{�	��M�H��i�
4���
-J�G	l���l+@�5���c`��*�o�
>40E70�c�ۭ�
� +�W�/��p����dK��
,1!���a7���f�F3���bl����l
m�
��B&�xjG����؄��� �;@�� |�R�o.�����<���)��>
?:�c�m9�&'�4�^6O/����
��3�J��κ�s�ܺ�b��Cg\��o3@�j�i�y\g6��^g��8
���9�@/��}��o
��1DN��Q�C�b����wD�&�A�����z�kN#� 
�����-�:��Nc�nx
�_����`�=��'�d6���2�� !'#�FW�?���r&�e��R���
R�;㚅�ͬ���U�[�uv
~��&�v���6�IZF�
P�I
�`%XEn�E㮥>��yl�>7��
,f=F���5���\�3KT�h\��5����!��%�>��擤!s��`������1k���D���-
^[�c������s�X|��0��>��
�CMlFY}
�s
��$����A
�n–��Z�5d�||�X��`�5�?b
�ߝ%b���&&ϰo_`���a��M�<~���H{xy7����1��R�X���:�8{�WY����I��ň�%
@�#_&��A�%���WL����$��u��8�x�WX�Q>8B>�0uUJ
�&�^�p�Kd��|<a
�&iD�
+�ɷ��e
+�ׁ)Vޒ)V��p��˻�K4�w(�_��
���B�����S���4n;6Y��a�s����_����"����
xP�z^d�t�
+u
|L/�AN�Aù�#�����$^{Yz�<S�����U��)��� �[x30�I�PJ_e:F=��3��S��?)�(���G,�
�J�.���y�_� ?��`0���!ݴ�o4�-���2yV��0���~���o4���}6�{4���?��~�
���"~��:��8
��ܛ$�_���,�`x
pz��&C���k��*��2�����h�K�
����q�x��i�F��A�8E�8A�8��{?��'��i��~��y�X
ԟ�t��N�-�8xl������w�R:3�v�N����k��8Z���~
��^�i@�Gu>G�|Fw�UV�3�]����6�KD��_P�Lpo����Fp�*%���U~/N��
�)ڇ��GN���vSO����8��j�Q��v��85�mjd+~<L<��P6�A<�AT��N�ye�s
|
�+�E�ďX�`��8�M���Pei ����ZN˨�n
v���6�vh=5��Y�k��^�t�7V��VRy��0B���ږ�;
�K�[���Z�n��v���X0c�K{N9�.�v9+
b;B+m�v
vgSݴ�~�߁�T�Z�ڄWߣz�O弩��x@������j�X��l�f���a3�.|6@���b��rl5��]��m�*fc��J
�x�K��H��n2;���6�� s������tr��1��#�<*��]'�`;
db?�J,�~9���c�{���_Og���hgUmD����B�g��&�O���o��<O�2� :�w�E'�� '
�,8��(��� 
lF��v5�U�h7��2W�
+������t�0�P���q�5��;�@�H�1�q�(�N�{����Q@��S	�t��Ox��ZV1�j���TW��S��UE���_�m�^\[�Ɯ�$
-
�z�l��u��
�5�O}�
�8��!
d��
W!\��T���Fl��U"[�y�O���d��n�8����(G�F�>Ɵ9�D��!�Mǧ�)���;Lr+���j�OU�,U���*���.V_���ZUb�R�mP���*��Q��!�y7^��'�q~��&
��������>�@
��^�gU��cS�;Y))*wzT�0Tj���b{��
�*tT�(�Ѭ<g�r���q+˹Z����xJ~�!���ȗ|
�qm��2�˻�[�
�U�2�O%�${
*v�T����S�+Ky�<Mu�(�]�
wX��&ez:���W�gX>�j�-J���sH
�O�U�/�Zl���(����
"�Tr�
��O��%*�HV^�SSS����I�++5W����0*�7B�MJ3:e�K�1V�ml��xRS���4N�a\�ɑJ���b��1ǐ'� �A9�J@!���%7=A9�$e����(����ϗ���P&#}�����cr����?��8ʫ
+�o6��$�,��fw��I6�l~vIHBH�&@�J$
+�$�AkJJ�J��RZ�j���X��ZdZQ���t:0�V

�v�ږa�V;������0/��۽�=��s�}�o�
+|��ӷCy�d�}K���e+��
�{�y�3�����݌�s�lP⼫����`�M�2�|ey��*����
(!�Uh�+ت�`���>9�ò7��RN-�F
 �����6`|K�Zi�
+�����|A|�l�r�
:�)w�
r�(4K�P�
+�Q~�R�pB�p���N�ˆ�
/B׏܆hD��Ѳ!|���PN�c%|�a�#h�p���JF�0ߕ�K�<G�r�����rG�*��TP�V
���+�*��X
瓀�-� �c

+�-�[�� �1��!ʜ�ޅ���J� �x��]��%�oʀ�gO�&w�]E�<T�/��Ɠ-�Z�MT��D+`�J00%F �Q������(b
��'�h
|},늑���]�/���?���<�w�}Qܦ�Z�
u4�zX�;{�S$6ł:>ż�bxLq㤸S���n~ǐ�� Ѐ
(������%�������
�]%\a8��g��|�JH�l��H�Oq�4d�i

��X��6�5������|Ն�oexhE��0W�!��Д� ./�n{
y೎����Y|<���
�
��sc�Zl�ŏv��0�
��:r�� ��E�E��0��&���u���٦�0k�@3�������nI�k�%���e���
o!�y��a|��Hs�v��B�������!'K�A#KY�d>`�]�*Y� �� Ճr\t�u��L-�1G��l��k�� �Kx_
o��8I/9kA��!�h.\���c������ <�FV�x%�X�P�b����1����4"�sq}F
(�vx��g�U����m��xm�7�%��g�#rVZ���5�d
�c?��%DN�)�q63���c=
+qŴ���yּ#
3��6\��/5��������Q��
������%��,�iD e�	��$~l�6���[)��l&`�,�4�o�!��$>��2ꄯ����MS���~��w9Xeqrđ���&�f�������Nj�n��
�q/���X�6�,���a���o���������=puV?�&�k���y��G�C&g�
���3�d��L(9!�Qj� g�����ky?ۇ�G>-}����)��w�žk)�
+��!��#������6ko,c\Ɋ���A�(���f��C�~
��
�y�Cv��
&��ړ��{OK߹�F�*J������y�W��=烀%���
��qe�#3�p�H���\�΀���j�<9y��{�@�&�/|N:��gT
��"b�c�|'�k���u��4���
J��g-�_�-�_�_�߃?���[�m��rr��z��{ҿ��r��
GQ
+�-�@�t���%��"}�v�̨N�|S�
t�LF�8$P��3�\�P�E��M /3y^b}���"��3ɹ�#LV��9�����2l+C
+3l3�ԑ���)e�X��%�x?��<�>j�*��
+
+�-t��L4���&��qX�sh^�x_�xO�Nj�qJ�tR{�
L�(�������P��&˽�v�+p^�Z!��3��N�e�8�
q�Y�
�������S�q��u���
��s�a��(�C��2������M�~�]��
+�{mf�{�L��m�5��:'�`6�?�)�
=�|w��|_APŎ��L�籟.���L��i$_�y=B�z?
"
�k��z��DZ}���p_!B<DK�M`�2:~b��9^_�����#n����r�GL_�����Y��^.�=4����.r��ى;��v��
o'3��x��ll�y���`<g�����u͑�v�
*�49���9�T�
?n#/[��ne���
t����Lh�l�
+
�F����n$'�Dh�
�R-며���U`
���V�f�&�&L{����s(!lǰ]��v[a�`���^L��S
��7
+�U;M�ܧ�,����~x?
�,<f�ﲸ�U`�s%�v��X
S����jjcX~l��?�����m�nQ����p������J���U���=ŵ�[�}m�t��ڿ�
+6Z��0�jT�ql�A!vݠ�g?�#�����o�^vP�}Tʠ��N��AV�QQ��f�^�\N�\��Z]g���u�JËꘑ*F:t��J�3Қ�p�c?���R�l�B��M���fb���fsR0���$�<�7Af�����5��e%�"���H'#ݸ�� �(�'O�jl�c�I�xӀ��D���&�l-Y�����8K5��t�8��&\+7����c��H���T�û�H�>%��}'�]�
J�)��
�(<5�k�n
����t���b��#BŅ9!:N���w����p����CȎn��$���|_�)n�S�V��"xf���O�*x�l�y��x��H�%k7�
x�x�S�spd�;�I쯇o9r��8+�[@
+ԁ8�c�ҕ�h�C��|E�\
+;��{��Tn���������6�ٻ���4wX�܍*ɝ���yyr
��g�E�o����/��(�3�?�d�o�%3���$$`BH@���
��U��d���(Q�"��EED
+TP�M(�Ȗ��-��Z�"��"K��w�;=����
�4�s3_���s��g�}���ߖ6�(M@�rA�k&�Ь��%�vJ��^	;��
K���g�M@��	ú�Z|�
�u�9I<�9�v,�}��l�+팸�	O8:�C�_
�mk��<�b���$�J��.!�)A�-A�&�.~OHtO���H�ZsѴ��Ѫŭ�$N�V
��i�%M["V��x��sR��ܢ�x:�{u�>4� �gq�YBz�t��}N�}.ѽ
�z���D�Eģg�q�%��+ġ��~���Ţ��N��y}d8/a�Kb�rg��
�*bNE�} 
+A
�3A
���"�M�~��K��[4�[<~M�����
���[���[�%�V�A�[���r�Nj�?�����]༆��e�y |�1�G@(h�`�*��]�S�@�K�!M��>���b
G��s��)4
N��_�(|  �SC���,u%�7

�$��ђ4���ų
��`�6уv�-dw�C�a�آ
�ļb�1a1������1NS�aȤϋ� ��8!5F � -E�Sw'�:�{U�!�<�\>�y���0
���?�*>���⎤�3�&��C̙
"�,�\&57��K?�GӚ�
+�4J�C96g! -dSCI23!�rm�3��A��{�Z"���% �I�
��cfqdZ$-�*�
�<�|6xcw!^"�0�Å�("�q��k�N�Ƥ��5�!96"M�%�3��
C�s��o��#�:���2���������4�s�4�/���
�%���RLZ�Jk���M[����f���
+�ESjh���rٓ���\�gRG���������B
�%�xP�EWjI],-��V�I^T0�
��G����FZќ^IRkA#VN�,c.�'�Z�ϕ���W�:���g/�\��h��L1�$�i�RU�kku�RG[�bNڱ���E��AΚh˺���ن�TI�n}Rɻ�@S��3$�(����
�4�[f\��"��	h	/\4����D
�SGw��Ά�݊��+yލC�F�3��gD�v6gT��T� ��a[>u��
���������4UF��h���F��4�B@?�h�I|
b�aX_���Mb���H��������t��%�0>���B���S�
�.���z$�f*|ըj�@8�:F�F�0'�YP�y�H�`�pΪ����4���M
LH9:K��F�f���������� ��T{|���j��H���h#O S�4pu�d��d��������q'�q�m*i~R����R��B�7��
೛%l�jۛ
�Z�o�����Iq�@>CRM�}�jP�~D&�%�x������8�(���D�笚�|�9*Ŭ��v��h֘Ws/�w��QqN2��,����AI5F���(�SB�)RV�$��M����׍l�ux��U�y���d�.�/���(ǘn+��Д�<�np�5�K:ٔ� +�s�jU���dӨ��ݒjb��+�1'X�o#�M�����c[�:���>�ЬB�݆��j>��׍l[
�����{
T��3�8؂r�99��<��c��Bv�OU����d���
N�[����`(
���Y9�y�
+6izEq���e-Z^Yq�խ�暶U��_WݱS��v���7��٫w����8�v�C�
1r��1�7~¤�Sn�c�o��5�{gκo��s~?��.x�?.|��EO<�䩥˖�xz�3ϮZ��
k^Z�~�Ɨ7�y��m�n߱s�������[{���o����{�>��O���g���𑯎~����}���Ϝ=�ϟ.\J���������J�]I��YW��Q��dg+��/R�K��r��R�+��k��A��ݔ7)
nƃe�-ʅ��p��a�2b"NLUV܉w+3~�ܘ�
P~<�
y
G+K��<��+/b�:��&e�+8�f���M�y[�sP��>�|�
�
��T}�<:�I?(��)�.^J�
>�\ͻ%�~����_�_b2���lv�����ǣa�O���
�G8�#1<�\�|��LҚ�7?3'�
�t뮶;�f���[��m��q&O�6}ƽ�fϝ7��
[�x��e+��.j��[�ȤƟILiL�T*��N���h��j�~��o����'�G�~8��3gϞ;w
�?]�p�����ƶ��e����hbm���֮-;zW_�5����a��
3�Ж�����j�꩛����sӲ��Z�d���O���G.
54��PCC

54��PCC
�w
+����u
%^��]��/��9���	_ԏ�����-~k���w���e�
����ܝ�V�����O��Ѣ'�~�H�PG
�VF��ծ�=��Ͽ1���}C&|�w�w��>����/n{y�
/Mٵz�
o.���Ѳ{�_�d�'��װ�6R�k]�/�޳�̾�����{t�t� p|g��v�zf��fg�i;f��i�����N���д2/A� oF)�TLP.�� �
E�["-�����)'-�߶g�/������y�ޘᎀ�N"_�
+)�U�k�a�"a�>W�~�ՓĢ��
�?J!���&�v�e��zz���c��-̣>�$CkS�F��kCe\	��)�j3J�-)|��ʉ鱶
d(;���nZ���s�����>w�'C71}f�Dm<W�,�Q��d�uY�կ���b
�Oi�6 �
|� :���n\h���[��S��<Fǯ���%��wE:��!D|�%K���Xu���#	���?�װ
+�����}��~ϴ��v|�ʵ����M��4Yg`&_�`3�Ȓ;
+TEr-ZF�b��J�_
��6P���@ ��]T�n�m��=1�l3<q�Z��'J��7V�
�`��tH.]�*��G�S�¤�j|
VJ�[(�
�{V��5o�'���92z��ᴫ{˔�z؇"�
�����ȂD
��A��ز�z|9ZN��6P
+J!C��ճ�'׏���:ڴ�^tSM_C�Ƽ������
Dz�1$���$7��M��0-���,�6P���XP
�j���w摳�Z_8�l|�rE:��Nxc�����~T*�� v�2pFB6����Ŵ6 ޲
�v�eF`����5m�gw��8�Ȁ�Œ9�[y�ވ���X��DBGG<����3))���若[�زl^��ў=��Ǐ�SϞ�)v�����{7w�o��8�2�
+���bpO�8�">����X4	>J��6 ���3��O;F�.��
�^�h���
���W��}�F�]�υ�
+{��E����"�f(��/c�`�4���Ѭ����7�h�^!}w�>8�5��K�h�ʙH��AΡ �5�.-F\
|�{Gq�{���im=�/���Z��t��Up��
pdK*8�+��#�K����D0��
+�3� {���� ��7���1�7���@���A�����o���Pa��.
57�d0�~D�K2qH9�y���BCO�mHLU��1tՔl���2�"8���dX2,�
K�%��e(�
%6@d�u=
+�ם�����j����^A���\�ˎ�*����$�,!��2.�K
���Gv[��=����ZP
+$�A�=]����+�#��zw�^
�X�aF�*�b��Z*SR�D	�&^\��
��4��h`C�͏@v~'��x�<\�վ���A�G��i]8�^@(W�I��<�}I�X�A�-ed�YÍ�DV���a(�
e������
��Z�g:8�QCHz�,��I^���P�Q�%�x��I�-��0�2����,탡 2Ad��
j����k.s�[�g-���H�Q���$Xi}y�J&��E|���N�e2��
�@ZF��� ����O�
�A�F�#
zw��/؄9Ќ��ވ��0RYe�J($�9J;�C��`�M􂜇����}0� ��P��/69������&�I��l���됼:y���*LYT~?W at l�ͥt%��SY��Bf���a�C�*�Pn�;�ӑ��W�_�ހ��}��]���M��*��'�(�b��N)�%�O2�qbzȅ)}���^K���g
X
$'��mo
N�_u_q�
�

y�[�r=�P�"fU��dV���p
���=!�:qܴ.K�``�ZJ ������s�^�9
z�����5��-���&i	*ઑ�9u(I�#O���bD
QHnƖP
��VKE��2�j���Vwn���
'�\
G&���Ǽ����Բ֠�m0�NJ�\���ɰu�U���H
Z
�
%4Y�@�"� ��5P
��o�g�1i�p`䉳���ߦq/�����g����(M�Eɱ��Z�,��T"�V $�K�M� 2T��jA}��)���Ï
���9;g/�(��Ė>������Ȝ�f+Z��5�b�� 
m ����@9��� 2v~	j����l��̆�q���'G��%���7B�#~�̇��ސ��t&�
�n�磛#X���B�.�
��x��ю?�S�]1a<�u��톖)����/�W/�z�fn��N�cSG��q�(j�9,	ߏO
�%���Ɍ����j��1!��@��πt�/��,7�]i��u�䁇a\ŎU�q\�3:Z��:.g�
+8g��:
+ElA��,DBHHB�@¾�- 	�@�%1,	{ 	�E���"
+ZD���|���>^�‹��w���>��L�p�P
8:H��"���O�l at H�4�@D E> E�ߧ���h
�x
3�{
=�p��~�@��bI��b����)���y���`o%��6������5~)�
+}
�Oz
t�Gr(�
�y�������_
x�	�{�L|�@�m�T������+5s7*��N�
ȁ3GR�]
x��څ���)�
�|9x��^d\	\dy��b��.pP��d��m�k����k���m_� ��"8��'�q��*�����)�c {&��B��?P�|��5
+b�} ���\����hX�L3���5��j1|����%��/h`�?
�b��!4�
��У( 
���^@9�	�S��a��6������
���r��
��%'����P�b
5��A
�(�=�)|F����I�S|F�!�'����AcI�n#V���4j�Bkn



�{C.b�E
����aԞ���=�����a�g*"��t�
V�P*GhHL���f)��sU�Q�͚H��%����P�Y����~5�[y�6���V�!�zgkhpw��K

+L�y}\DM�3
�3�]W�����dk�i�jJ���$��#d=U$y��A�����
+�7B��-P����%P��_6�`
ׅ3�$����}N��+5A�IL�6�2�U�<C��TE.3�Q*{�Y���3�7 at 9b���*���� �>���`�#%�yWF�SE�
E[V\Ks2�[��nh`�Ա�Cb�x��.�
蕽�|Đ�
+Cű-����N�����V��>ߊ�=j���Vy&	����ޠ�e����=�����<S%�tX+�gJ�y�R���3!鱿A
bhv������W<���Z,�2<�_
)�*��4��6%��S�K3J2x&a�`8?A8�ͮ��bK
��� �� ���
1�8ZA�E�7]^
s�������̈́<c]DU���T�1��v�$?�P��
�g�G�S��Ӹ�i\���~1 �b�?Cbh��
4�Vo;/�/�<=��������h����JMm��^��V
+�z�E\� ����N�^禗p�$Fs���
%�A���A�h�SϷ�
zO��}�
��G���-��rc���)���.&xũ��œ�B��W>�ή0�ۯ��k@��G�
+*���h�����\���̰O����^LA�� m��(U�4�2fw���O'p���xa�0��|�YPa47(�t%��1� ��Ο;�
\0^��
vw���
vgԟ�g
�oB����� l�����;�e�^��cdUd���
���~�Pb07(��Pf�
G?���^��;87�rz����ĸ~�_|�)8Wх�����5�S����S���r�I���Td������C!b�@
��As�/��<�q�v����q���XMCA�R
F���ӯT�bkt-�#���sU���V%�U�}8Y���@������@yd���;f���ј���/�
Oy`��Q\Gg��Cٝ8	��P�&*)��&b�W�l
�M�@�fv��
#b�\MG6��l�O���?����w3.�}��CU(��&:����҇+au*�mDYD+�6��Z�Q�(��������~ʌ&s��P��cP|��M��
3�[�ǿ�3������E͋KA�IT�`

�9�IK0�s�
��^R��
��E��`J��2_m�
�M�67n����Ձ�/t�]w����I�}�Y�S����Խt�N��xh*w
ǼIH��
�N
�d�
�r0�� #��oH,B�S�}���ĈA���7��ar�����>�=s�߼t�D�[g���n�y�QA��A�$�L�N�'3	c�8�
FB�m}����.)u#=�g4��b�4~n�o�����U��c[������Q8�� ܾMYBy�͇�f�BHOI8�t�8�:K
+���
|�H�{�
��Ƞ�Ld�
T�}ū���o�ݸ\7�gMӫ�[e`��
��G�p=���ϡn��O�"��@E�d���Y�s�@�\4�yj��lf��lV����/�o��.�=ٴB�j�:
�*����n��%}�
���l��Nmg[������S�e���JK��n�/T^�����P@QQQ@@PA/]�,�Yi��n��m����������������y�Rؽ�
+��e��[
+���C�>
�yE@��)H;����a���#�s���sE�fK��ϖ��?��,���?_�V3|�~l����EfA��x8䌃���X�H��?B�� ���r��
_(�{
J��h3[��^^0_�S
�3`��
p^A�����kO����� �o� �t�7�$磐����dm���Ð��А
+P�+����6/�
+�f��^

G�p��1~��)��$�T1�|�RB���.���玦�T�M��
I����千�����.Yo�A��7�7�7��SC�kCɦ��C
��?��#4
w��PO���?�N���fo0��qZ�bNY��Ln���~(�VbOKm�k�Ze�u��8�M�B
̵����Օ�?��?��#Ȏ��,�kN�D�s�:#�:'�>V\�9Oe�
���t�̚R�2'��L�掞8�N��h�mנ镡1�!?mb#�~GP
qEfV

�	7UO$��K.�R+��
�\f�9�\cL��u%�u��M�Xy�
ߪoNhkG�W���F
5�A�k(�9���ԁ������Z��$)9��3�Ε���4��R���f�i��Nb]�6��*M�Z�I�nAӉ�W�2���v	�-�&Ġڷ
���6 �[�ɐiuL�
Ye�>�3��YK����@e����6r�U���/"4�
S�jb�
M�C
b�"5b�@
�����Ї�IUB�EI*w�:S�W���.+Է�[i�>9E�ߔ+�U�K�r7Se@p^*6���A��3�x��!�Y��!,�!*y�-�vAN��E�M&A���Cӫ�
���c��uԆnv��C���$e�^X_/.bm[rĠ������yb

�g� \����)�ƴ&}
I��Q�RV�������m��z;��hg���y�n4�6,
bhغ
;WB;b�>���t��
v�/��KWt�:A`jNm��g��\}CE���Ŵ�6N��Π7Ҥ}�4E��
1�1��1t"���/,�1��Aa��O�\4Fٴ�C
A���J�d��2�ȫ(��8
�Um�3��R
�HaD���� ذ$[��n+A�����?�
��
+
��cSΙ#
ͺ��vU�D֜�Zא��
)F�������/�
+(�F;�Lj!����
+14!��
+�r�f���ס�^w�������
Y���]1|�6�Q�HUU5gv�Ź=�uts��ԚSͳe׈2xRKFE�MP�8��1H�| Z�Og��k��1�
���5�zq4�`��.����dz�X�FPV(3�Kd��&Z/��a�s��b��P+�K�V���P��B���
�CǎOf�{�~4�������]=|�RP���IZ�-��`��
I-����|M�����)�z�圾�Ђ���x��M�E
�������os�
?�߻���Io���cA�����?c)ґ��]�쉗RtI��ZbA�e��򺣕E�HE�)B)2��*�����A��W�8/�1�����/o\��
#�=�s# �ǒ�F#�l{t%�/N�Փ %�	ʸ�tM���~����a�B4|}���M�G
�5
��qtl^��������4��4r�a������8���((>��
���'	�)
1�tIDIz��*5+�
��@}������;�X�p�gӻ�G\�^��k��m'�#����!_ٴ_D�TXr��R,-s4�A8K`��qq�Y��9UX[~M���6�®���QU�A��۠]��t�w
�\����ԮU�G��g<��<?x���_(�>6�`**9{".#u<��p�H��,���\x��;Jg��g�������h���j��_9L��q���4�ku�˽N�s�w��y(��ϗ��dyI���K���;�N��$�'s�OM�g�]/�
+��$^���y9h�:�жr�����L~�`�v�@���
	��( W6x���ϛ<{�q&: �YBH�Tl��������)�؇������Kc�����ǣ	����ڻt��K�_gaM�YǙ�q�ZG�u��ֺUjQ���V�n�����,�!�
�Bd!
K �,d�D��PZ��q�:Z�Z��g~�y�:��E/�����7\�ߙ���}E;�Y+ /W
��
+��C�A"��f�?�O� /8�עг�����V�:�sMx�
#��L]d�ƨ��ӯӌy����.��Z����rp_��O�F�����6
ߙ
a����^��
�c��P4�
���#�@94�p`���X(�^��<��|ͳ��º�<ض�
�J�smxoƒ�k��B��i�팄�Á���}��C��3Ȟ�P�'�{���$���N}�s]�����
+����݅T��f���
�V���;�pd}l
������I�m
�t����?�n;$T�Ǡ�C? ��E}����e� {,��k
�|7�(���^������^���B�|X�λ_�+�'QTy��Zs'��1��]�%��~"��0�����]�_��,p��
��/
��P�X���� � �/��O '7�'fi�w�Ԭ�u�Ӆܲ)���5��6����2]ɞH�iO���Jq>�
7
'8��́j�');�m{��k���&h
�ho'��'D�X_���A!NW1K�)��L��Y���[�Ff��Z��y
on��: L
��㆚�
��P�
5ۗ@��+ at t� =�	�
 �򆶤�YIV�S~AƷ��ST*e�\W;^��^'��c���F�:�/����n΢���w���t����@s[\d� ���FP�� E�t$�H3�>�eOs�J�0)�/(��k�
�h�@>�Ӭ
�n�
f��v��hN1�{�����vg�o�'���h9��_

��
��>�u6�EgZ�cin�=aq�W�u7h4�(�N~	=�"���l'h0SF�I7��21MG�M�l/
4d`��B�
mȠ8�4'<@s�gV
��;5�Q�9�Ts�
ny�����*�r��Q�(����FR�iھ�,
&#�{Zs�Jg�K�|�ݶ�� ۷��6@����|ftgB��&'=Te���H�[��H}�����U��{˚���6���˪���Zs�}�I/��S9�K
�� ��'h߷
+T7�����P���1!O
I��=��;s�c��Pc��ƪQ���m%�WY.��(�I���M���7����ـ������� A�d�
|L��g����GX"nJ�Vx�+�9�J�%rS}�Z�d5
LV%��TH��d���Hm�/6��%���^��A�fdP�]	=��{�}���-*�[[|�
SJј*�9(#6a�"��[�R��)����|����Υt9Xe*�\of�{{���8
�o@��eЅ
��փ�o�s{����Ȑ選�	
WtE�����i2�ȕMe*ic�A�fa<&�ZO��ki
*��QC���P�:g�Zd`"�<�A72�����`���/F�L]8�|ÖT4dHc`JB�FF��%%*��R�md`l�ʨ�k��JF��L�a4����g�!���MP��
�}ޝ��n���I�#���\�I��H(t�S�M�@� �Z�E�<	Y_'����lkW�On�:JT��
KI�I�lP�
,d�.92h��0�u/}ݾ
�t�ZX���i�������ڐ���s�M�J��LGk�6WJX}�"��P�b���y�

�Ѥw6�[�� ܺ:����y{�����G�=�~b��xH��kQI��q�F�ډ�s�B+GC�+K��U�b9#���2�� Sڲ�uAd�;������ ޺�ܗ�����<r�uz�������D��X��bbu��ȳd53MĎJ}��X[��S�L�P�-i�.
^�7���:g�zd�C����z��_-��?
�Zs���-w��yޘ
+
�0
o�C츚P%��R_;�!���Ȋ�]D
Y��K���lC��ɔh����$-�q6ଜ���@�e>�/zn߽����ʯ'm�y����t����Sq��ф������̚�t^����s��4{�g%w��Q5g,lm�E����ڬJg�d୛
����m������
?����g��z�������݋N��P��*��|3�I;��
!	R��ʼnC䖸
5m��ke��y����_goM�i
�#֊NǺ_��ъ�b�Z�Ԋ"�(�	D�	K�!
ـ� !!�@BB� 	���"ua��(nXQ���HU��^���h�?������ܿʪ�
�@������-g���{��~��o�٦�w7�i��aݯ�'�^�	E�Q��G����	���T
�Y���̂ȟ�Ea|1��Hx]&�����]�-E�"͚�`^?�e��ܡ�����aWtL
�m�qu�~���)~�?�;I �_�)�O�Ԅ��i�_hY�=�A.3���+�ݑq�+r�nW���-�n����/��^2���禰� [...]
+z*��)S��hS��es��
s��
+�����)[+�,vU%8Z��y�p�s�� 
�T z��;v6ُ�.3 �-#0l�
�&��.	���.

x�
���D�
���ꞏ�|c��es`�"5�^Y{�����JO�D�'"�E�5
2p!�8��� �;B� 
���q(���7�n���\���v{>F+,U�y�v.��5�ก
+.�I�-
+v�A��@��Dl ��
������8p
}!���������:
�.uXb��,15���(`ռb�Yȅ�K2��U�w
�ׇ���	���_ �yC�7^���R����
@�qX;� o�;�w
��]8�|�6s�\��F����V[�a��4��,�/� ��A��qp[��k=��;�\��ȯ� f�+�7�@��!H��26:C6�� pm� �m��l
��O �+8{��q�\ׁ��D!�P at r��ԣ�a��g
+B�dI�R��&�ԉ�q���MYϢ�hc�.Ɠ�ޜG��{a�87Ns���o��5d�X�݋�`�J#�o;���A�
��c�c�x�⇿��L��N�HV�<O��xF����62G��F���_��#��yCaC���[yh�����}!��D?�١u ���� ��(�� ���K�d&�̒�=KU�
'U�
Qjx#$�~�Yx/����h0�_|%|@t)� M�F
Ld�0�-�/$�m/��ߠ��	,�#]@��N����4��<����r�Uſ�P]8Ln�"�e�1]�}�}}���I;�"41� �7VP��
���@
�v���2���~o�i�E9�����ќ"΃,�`8U)
J�*�A�W
�Z��1]���
U]�K���WN�c�K�����j"�p��k����~X�
u{_��F�L�UB��	s#��0]"
L//�j��(��+$��7���
�S�ӭm"]V�Weh.�/X�m�kg❟A�/*����vPs
 [...]
g�
F3�Lc
�L�.�S�I�TS���<��F
|d�Hw�*��@��4 �7v���l�

�%�=T'�eY«�,��<���%�n���5g�
��ڦ���fmR[��z�A�ҭ-K�U��A�i�"��2�=��n�gM^�iS n�)<�q},��&�q�,]xQ̐ux*3�@gd����
+cuvu�&�ѤHom9�v�(�8_-ͼ�B�"ΆyP�����a)�!�f���Z=
��p㭡��є:
+�2E�)˖���*�����kX�F%��Tƨo�����3M"ZWM�M���,�����S(C
U�K������i����s�����໦���z2���*h�gʌ���0O��֗��e�
+��]k�[�F[� ���TN�M��A��Ag�����6W�鮣�//
w��
�ER�
$zGu��Y�.�-��*�\]Y���D i,�W��y:3?����i5�
z
�[�&����1T oe���м���g]l^u����m�;8h�=���Co��?�P�"ՖgW����K$��BQq#�Pn�	�f�����[����
~�Mx�Ab3Ԉ�n�����m�����#�Ǯ����

��F�4i�
+_���(�J���'�u���q<,2��Z�VP�\Q�JUd�}�=�5@ !a	;�D�HD���Ȏ������
V�X�� Et�>󞞹'�s1����{�����.b�X�ܛ�|�mz^y3-��9���D�^鮒d 
L���4T ���~����m��8d{�嘳�����@�_h[;�V'�(�����PJ�I��ki�)%�F��'�\��WT��on��u���wWI���e����U'���z���+�fjo�l���
/���c�}I�����6K ���m�+Ψ�U\�f\�V�����nF����e�o����ÅwE��*I���> ���fh:��֥��ݰ��˧֚�.����n�&���(���������袔[������1��Z�(�>D$h
��$���k��+{*%��KGu������S[��o�{d�<5mq|셽q�������j�?�?�gpzB9��(
��R
�F/oeV[�׃����Z�E�-M���]5���rI@�.i��'
�7��crk]:�_��Sz��p�؜�����q봋s��d
�

����2h�D��
���Ӌ�����>n�_��ҧ��ʫW\���[��1(�\Ax*�P�&
��e��~�Qa�ў���w��5�rr,��`
����)||�dh2e"� [...]
�֭]�,[����y���
+�)u�߃����
�'/RBHo�ƒ�H��g�����y��Q0��	��
+��L=��E�D��]
+D�I��(�
>݂�]�+��Q�[�W���_M��[�f��1��-���c�C\ÿDa��)��5:6`5��������\��,��+���E$�Eq�$���r�V���7�z߂jZ�'W
�ۄpN%�4X`�E�3@D�߅P Y �&(�����
�N��v��
�/���W�m�����
��FI,�ˣF���9"�/*J��~����
�?���*\8

�'C��|�� X
d}�5��1RL܁i��
��k�|s'Z8B����$1�"��۳	u�
��od����8��:;��r8�
 ���8
�����DC��+D�8C��N@;�)�/S�
�~����l��
�ZC�D�ݑA5�"�*{&#U�d8p@>�3Nl
�]80��
�{�`����
��
��m��a
�CVs��X@�s`
5�Qd�
3��c&�?.��n)T�C*בֿ��$��\�)��/�]���
N`��,w[���V6/S�W1���F@�g��
 JU�T�C��
����4��$��"1�� Bg
$�*A��H�P�
'
`�jAj�9H�7Z�
$d;A,
Q�^��j�C�>�Ak�6�*���8��$l�(|�g�<�59��jC�o�_j at nE��
Dio�K�� ���0W�,
`{k���X3�_�*��y���B��J�Z���J�EZ	n
���$/F.�D��>���y
;�5?�5�H�oC�IH>�,�
�1S��d{jC�<��, 5���uj
�S� h5�<��:y)�!j���@�Ky4@��ݿ4��$i�g�>�3M��M�$"
q������:��y�;�*C���a���Ӈ,���.1ҽ?'q��L�.�\�|Q�&����$NzE�s�eP�
�O����N��M%��O_�P��@<Ґ�� ��ֻ��<e��h@!Z��
�jY�u&�o5�C\�D.�S^GU$ͅ�`̐n1���������p��=����p��
�S�����4\:� ���9�
x�� �V��a
��d���Yˤ~Hg�/$���'�g�K�'�d=
i�N��%

���t=�n�?e5&S74�!i��
�HC
�������J
�9�@��ї����^�\Z�;=z���4C�1���O#�
+
��
FI�%��>aOЀ�~��9x,�&i<��4��А͛�l��G6�8<d��2K��^�QM�k �CE�u�:N�U�b�{ӪnE�D at .K��� !lH0B�L�ɞ
A�a����V��b9�*x�Z�����{��������s���?Ua^��W�^�S/OU�&=/����ԇDs(KPٗ.w����F�%���vB��1���.i�o�
3�)��� 	i�C�[���s1����ZО�̞��7�̯����Œ��L"i��J�'3؝�\A{�D�JP�[𵪦�uC�Uc�u)t��"��V�����o���Y
dϒ
\��k�p�����yW��icvR�5.M�ss
+�d��V¾[�6�
���ʺL��:�֐a�)�V���+�f�ę�L{�j�GJ6;o�
T
X
+ڣ����ƹ��o.yM�G`��bF)���B+�Do�S9&j����+3%*M�F�̹��g��E�� �[���W�>`��H�7K� ��
+�A��Nm��ta�Ls��)
���J�M���
+����
+
+���.�QY2%Y��")u"b����b����]
+q@�$�8�@��50���E�ڿ�����p�����������0̿b�����v9��Y�C���u�7D��r��V��,��8d��I6����Rr���<ĵ�H	i(ߴ ����׵G>��trÛV�
/,أO[C0L��]5���SI
��=��V��
E�
���fKt
��XBk����US�
j�OL�~Wi�_
����	鶅���	�^9k>���=�퓝�#�ۃ�͑Q��q�Mz
�ZA(VI�Xb>Y���ʙ,uIr-
��Rz����V]@�j
+齒B� �
� 
dW'`#g!��
ƽ���ß�o=��Uǹ���C;�|{Z#"[o]M��I��j��RE6�')�
oTWV�(
���V�X5�
֝�
�U�[�+�+����h(��\�A��j��|l>��m��/^�����7��K>���fs,�ؐ�'�N��YJdXʮK��2_��f	dz��h�
�F<ߪ!�z��A�=P�4��;A%r�@��Esw�]���k��ЙM?
_p��8�#,��-:Ym��+j�QY��ņ<
YK���
G�*�h�ez}��I�$�jp�^i�x�o\GJ�9���t[�i��v�O��=W�{����y��{7����Q�UmqY��d
+݄/�4�s�
+��b)��R$Ī8�V}�pKs�ة����U��� u_8�t�#Tov��������4�t���_�����6�=s�
�ꋈ�w]�`X
��Ҋs�dU������4a|S�$�$�E���#L���M����aT��
�!
LdN)�σ�M�~k�������c��K�_o}vvo�8�~,�x8<�⻘4j��������̒�by��Ɖ�_Qy�"�Z4���`k�0�m�z{�i��4����hހ������&ǁ���qܵy����	����9O�"n|�@
�F ���'gR�> ݈����6fY�M\d�2m&V�p73pp�,�g�n�W�A����8���vx2�
5���������c�/O�O����p�>D�962{"1>m"
��S^��gEYQ���ϸĐ�҂����z���6
+v|��y�l��@�j��G�r��
j`b�C����o�+
o=]�ޜ�����������3a�93W�g�C��3"㧉1��Ը��k�xI!/���)uJ�Tm��
s�E7
��C����j?E�X�z���f��?l^��s_)�����;��x����ً
ٳa'�f��K�����f`cf����K��ʂCgy!�$a�~W��������}g��{�e(]P�������;#
Q7��l����a��
+8��
+�����`�� ��x����d�( ��
y�B�r&�g���
����p�>����;~�`���}
���j�uB���R�*G!lu)���)�6<ק�i�x��
A;/CԞPH�
i� �=H����1�=�
bPz\ �Qoh�<-^���(��e��CUM-t��Z':�-"��%�,���X8�.
λ��� ی��-~����^��m灴�
\�qJw�֮� �ud�O�~�q���|�2�P�G(
��a�c>lpN��������j2[�Ke��8v
GEłH


"
��
BH)$$��{$!�H�*(( �X����.l�"(�3���{��9W�?p.���Y{�o���fF���0��
��� dI 
_���} ��R����b/�Wx"x�W���]�^�
�<�������|�s�8ųq��0}<
�N��b�8��!��
���cV x}�
s���<O86o7���	(G�s��
���
�
]��p0n�".��K'@22'0.@t��gC���:���u��m�t�vHzI��π/9ت#��;
+��
���!�:��	��.��񑈾�7შ���Q���l���uXk��@q������ 8���
�
2�.��y ���?M� ���*� {&0
a���5�5�sL�CTW�H䓘�����㞇
������R�L 
��� ��S��18�
@p�	����I�
+,�.`f�@�� ��h
����1\M�פ���ċ�_�ſ�mC�Dwaޠz����{�q"�&ޏF���
qH�� �-S��c�9����C�A�
8�=�����0�냁��obI�������u�1M��諸��6›�.b?�)�'��|?�UjG���o�� ��	���
�?N���S��}H�
A��	��� �uA�^�0�Kpt���Jˋ�B.B$T`��Τ���HN���&��6s�ރz��:��hG
��F�&\���ȈqHC�Y6қ"�� �tu�h�6�2�
���@@�e��	�̒G}��ߥ�G���?�մ7���W�-�����1��ۨǼ�Q����}���W䋱�D[��a�=����<�S@�6�{��9�n ]���
+����|����W�(�m���j��$2_�+�ϒj�=�
��7ewb�ʯ�t�[bs��{3��i��l�E q`��B����3@�{
��C�ag0���I�y�&K��<^R���K�e<"�ywqE�Τ*y{b��V�e�u�mus�]E���.�Iv
�9�Tҋt[@�@\m�5�@��;� �g�5,���z�y� ��C^��p..蕒�\�Jy�%`ܡ+8�
э�|�U|��%���ۤ����;��Ԟ�ޓU&?��zY'qϙ���@Zel�yeH��N�ι`�^:V|`������~�yI�ϴ��n)����0o�$��t��9ͤh$j�	�������)Wr+q�e)]�bB�Țړ]��˲P2��AzS�� ��
+<�@�%�e�׽+r*��볢C
R�
*�U��q�+���RH��s�����*riN9��$��XD�e��:5�}���k��m4d�O[i��A��K�F��
J���y�Hu��������6���(���̌�WˑJ�XUä+N/2X��L���<3�f��ڡϡݕ�h��Z��-�9А�"Z���y
+��=V��CM�����]�j�|��bCڬ؄#�ب�3kel^�P$-�*U֬\�9�j40���sf-�E�h�U1��
+�����g
HG
�+�@��_7	Y�@��Y��{�U�z���֧u�>w���[�1�,b]�Y���H���Le����l�Q�uҬ`�ZdY-IV�Q¾�gu�DY���@
��<	␋������
+��_�x:��[9p�ˣ�!��5Q�-e��'��&
+㤞�-Pq$F�D�k�
+��(���ܚ|
�9�ǻe��nkx�n1��P`
�#���|"Ȝ���̍�
������j�]�w��{M����E
�P�[[�L(�'1�F:רgK�j�J�P�ER��+.4�ŧ�3�M7�X�N-Kt_�>��k�DP"ga^c�'��q���q���K>˞^=�Sgs�ו��G���Ŝ*OJ)*J���S9ZS�X��W
+tr]�:ǐ�,ȣ+*,4EC>UuӜ��Х��K�e�"[ q`/�j�,
+�����I�g�M��k�@���76޺|t�Ŧ��ڳ1ѥ�|~y
+M_La˭L���Q�M-àͥ�XL$}�9U�Bȹn&�;t$�=)Y�-�0
���e�p�D��`����a�nj�{9v���Zk�g�oaG��Q�u�dC
��� g	K�v1[F?!RS
+�z��dH��4%Y��0��a�N����8�������u��)�H	��d�9�s
�8g�
�
[�lI�JŴ\u]I㚚�G�1�h�h��js�P��+]ռ��\��}�x���n�~����sDr�^���G{����TA�PI�
�=uz�:ڬ5>t�k���7��ͤ﾿Mw/uk�
zDs7�u�#)y��)�6YA�O9e;�푷T֦�P{@���!AsS����w�ZCRs��?
U
O>�R��j�&;����ߨ}�����M[����Z
+W��}�^�w��76��M��U���K,�Ց���=�8�RA��by������ڰ�s�ԁ��
��֫�	�u��TqZ�V��"���D
'�(�`A��^Iyݿ�20d�u���Q琯U�P�������i5w���["I^OjfƵ�<ɕ�awY9���*�����y�;z�Z����]���k^
wi�T���4��ل�ݔxwg	10dB���V��I۰�ՙ�!NG�|�=���x�a��~i��w�\p7?��W^��)��m,��m*��m+��w�4X��Ƌ��k/
TA�!G�Rpn	��.q�.qst��	[��q�3c>V�F
���n�=
R����R�L{��
e���"I�bw:C�/��8��hΎ��C
���B��h$3b�\�PpJ�x֮C�����y�K�2c�~�����q_vd��r�T�]��p���t��Inp����<!�I�ȍ�N�0Y{،�\��1~�dsR�d� �}�0b�(|��(ltT%4���4��_��+����g��Y���)���F��i���r��M�2�!s��:��ω}�� �27��,	e(�"������G���7EG.�C]�
_����5-��;�F���E
��K��xW�h_L9�Z�a�x/��wa�E|-�j��h�$$8r!��B�+Y
tn�E��v�xE�7'|��_��B���{Ax�R�9�躬N����5��_
��J�
+��ai&ܖI�m���UlDZ1�XK�u��ZO�
;rpl�@�}v;��nS0�q�) -��h��._�t�� Z;Ո�^
+�8�N�a�ZVh�a��
�Ep6�b�)�f1��D̊p�V� qURV@f�
+_}냊5^�Y�
��z��4[{།.���N!�n��Q=�A)��Z6�4�X��=&
�cຄ
+/�"���˼���6pͶBh��rwr,�"�����m�گ7���8���T:�M�� �Qm�
_��a�Ά�&
�:T���q�����e�_�!l�
��8��t����C`d��
��G��-
+�mPjb�jR�J�T�F\G
������ 2cdD�##a5ҥ�H�߈�*'��Bxr
-ې��
�e_p���s+ 	}�`>F�"�S�p�
},t�66
�!l"F���M�l��� �I�
��3Ff�9�X��!�A�N{H+��R���<!:�
�y?$���
��`�{C���T��3�#>ƍQg�S�����w�y�*�w�lHڨ�TG=��
��c��ps�dX"[��,G��\�Z�	�$7@t6�K�H�
��
+/����������i�m�>MK�H{
��
+D6XkB�A2]d� ����(�["O@~bN�{@��i� 9���Z� �F���?x���9���	ϙ��a�c<�M�
��c���y�*��K"ِ�^r��۬�"/c��cW�������Ȭ�>iǩ���F�9����ݬ��ۜ��{����1�H�H��@���?�������!i�&R�i#g�.���Q�i��@sTn�B����z!�<�y
���1v>��
eJ
�?�Vެ�#�Cb�h�w/e�=(}�z��,~L:���%|H�Şc��d�A at 6��}�Gn�R�Ũ�j�=˱�j�*�
��n_J2}���r�cf32gҎ�$M�I�ٔq���Q~��7���ל��G�᜻	�v�fOJ�s�E]�Y�*H�P�����k�P�N�����a�Z���n�Z����we���CI~�T~%c"��7*k�HN����T$�����K�c�͢ܧEw�/
�sG��x�vt�'��g��@B6$�7���ϰ&�5�o�T��#�G��
�:�� i)E�
�ed�� [...]
+�k0�
x��
���Q�bF
-��&��*�E	��jQQDkbaĠ8?R�9�Q_�3��kỵ@��`������ �ܦO��_,�Z�_�t86]�a�ɿe?����'#���a
<�R�N`V0epIt&����+�٤FI�7)��D�F��P^2�)�$9enUH4 ��q�!
�uL(�n�_�َ�+�;Wc��T�����]v�gGjx at c5�FȢ���LG�Ŧ	1����RI
+�.IN��迈��<	�E������d� ��^m��d��F�1�Pa��]�{f�펎��_
.�����h�"�&���%
J������L8Y��V���E1�F*dޑ	Y��b��S,A�
u-�3А��Gr�k���uA���K�[~�0z�d{d��څ�
+��
U�{}.ο2�HP%G�s%
F�(
�
�1/S��UJ�p��
��`������)
��F�V"�Ѐ�̥ɑ�����+O�����湖�vN�Yz��r�G}ú���M����dG��ҩ��X�\ʇ��@�.���KX�
+C�,�
��c	L�3��EGD��s��#9�h���h��>����dë�
c�V��[�L:�<��W޺^^
r�� 
��M&�31��\_.�s�)"�$WB�I)�
2��_F��	���0U8M_
 "X�� 	��
�=SvXk��Λ�����n�ky�^��ٖF+u��kQE�ov1����J̥��
+��������)
+11�8)<�^JH�'�H
F�'���阵�(�|x'ȑ,��Р����+��=�t'��n
������L}��eY��K^m�wZ%.DR�/��XJVlt��K�I����*q��$X�-	�b3'a\�t�Z 	���
�
�޹������
��/���}tzc����Z��OUw�Z�a�2�0Һ� AMx��B�.g�D�Ʊ	�b^HQz|��P觪���D~Śx�3N`�4}-�b�	�Q �_(Pf�Ziڍ��3BMh�����4�
1�w����~�
/y�-���`?v�@�$��P�\FpM"�O����.�c��/u��F�x����,��Z 
��m(��
5ۡ_;�@��
Ѓ�=���'�5ǩ�
[S���Rꠇ������
ݍ"v�;tbP;L��*�cZS��-,�5�zk�z����4M��=KF�V���)[ P��n2�Fz�CC�5�z����_�Z�~nf���:���j"
u��>��H�A
����������p��ѽ?��گ���i��4��T�޹(�΅p���U�&Pl��������}�k� j�ۯU5{j��ٮ�W��%/�{�z9��JԤ�#�)�-p���
����p�5���4�X'M!�����0�M��x�w[�^}�[�Z@�4�҆
��B�:t��a}�~~���
�o7����K�ha�]�9
��ڹ�y�e�|�e�<��o���=�p��㹺�Iܮ�gx:�z]���8����_�i�f����������V��{��Ps�T3���lE�.�.��$\������~ڲ���e���%�3�K��}�p�7�I��

��8K�e���J���J���J��݇f{��6�;X�����B�ECM�ZPՀ6T�у�>�@ [...]
+�5@;�
��
A���_��m@�%kPkj��~Cf���eK0���Jjn at A��((�g4�:�I��?|�kX�y�I*�x� ��$%���Rt���
�f��f�fjj��3Q*jS$�b������Z\�ua�b�'��q�(�����������\�}�������
Tp0��zS��s���(
2��A��
��h���B�mT�‰c4�탱�!�����]�~�^�
��q��D:�M"��!��#���M)���
X�ag�
+'�d��&�n,�D#fa$ȋ���O0�K!��G����>(��B��'j�����
�m6�s�+.\�I�9��M������D*��9�N`�

�
(�7����Fx�!�$�f���ツ�^��� k�x�]�����2_K,GT-t@�B{�,Z�����_��]��$���$��)\�N�a��8X�E=	�Ì �z�s���\2���N�l숄���^
��
RMVBd�2�eP�ڠ���fV��*`�u�}P\����\c�B瀿�
<��Jm�Qۂ��
�G0�ց~��Ӯ�^� �
7Pz<����^O$��B°7��y��i}>Ǎ�hc'|>�B'�:8��<

WC𼍑2�M�0,��؀�oN�X�ׂ��䣮�w��v�
�k����ʯ�H����H|�;�������č�������WH^:
�4
�.�x#=h�1��, -G�rR�:"����
`
q�'��y�q���~�= ��@$=� �&j��	ڐw	c!o&���
0	*��r4 ��b�Y�0C�FsȒ,!M[�t�=�N�U�"��)������3`^D��`0~폰I�𱤡-Y�I
�|�89H�
 #D�:��#e�DN3��a��fȎ\E�%�+�!_q�
�U��7x�w�܎ pN��}!
�k�H�)
+�'�c��-uh�&���W�؁�/1�(��"B`��p�����7Y����ke�9�⬐˶E������TxAT����GLr�o������
c�?��K���O~K�
R�S�S?�{i_��c�#:�u6ᐼJ�U��O���joS���p�
+��'r�"�
�R�q�ΐ1Qc���M#����)'����X���
�kF/�%m��G{�~B�?d�%�K����D�.�����
�v��X5
�u3Q�i��`sl��B�E|�q��볢0H+��z/��}+�K~�?H�
c�d��`v�1n
��O���
�?dh�=L-�6k�q�=N�ƙL�R�
+=d,�G��J�fb��	*`[�%���ƶ��h��>U^ذ�l�`����=�>��ԧ����ٝ�G���0od�g>��$�n�ޤ_��_I�\�2�s�)� �p��Fn��[lu4�v����?5�c5�vw�ֿ)�
eG�+
��˙�%5���oD��H��:2�p��~L�ξɹ��������Χ���}�⏰O��2t.��K����C	�7������:�y��,�
������T�z�d��V�G��[ʾ��=�VF����9��P�i�s.��)/�����w��"�`8�P#�~�
}b���C:1�J"�n!���ȼ����=�sS�bMs���F���])����c~.SPnrn(�W��%3������ʓ���N��cž�Q��[��������=�T��
�,�BBx�y���ɮ�ht�9��e��5h�p[Ԋ��˓v��ja̭J9�j��s��T�}�vi��.�|o���C�#���$
+�$��Z���-�����2�dA��C�.�q� ���{���'�i�:��
&�C
�D,{ږ���^������;2(+r9gJ�'
+*�GU�Y�s��[��eu-�Fv��A��dO�se}���N�6�V�
�	��i(&�A��;}�_;c䰛�p�����­�s������}�V�t�*��Y����IVe�˯W6嵨��~[T�s�d��Jiu���je�j��e��kq��@H[2YD�,%�!�i���AG�
�F��>s�:j��h��[i~W����#J:Q#g�W�	�*J�-e�ٍŻ�uM�j���*Ugi��rY����B�?u�z at Q�
���5B]���;s������k:�� ~�#-�����4)�A)�ԡ�Z�	�I	-���
+��*HDP��]
@?����8*��~�Yѳ��}���s��s��v�:
��
{�:,��{�����~'���Š�B�zj�Z���ƲԨ3�Y	����i%9ՙ�����
�p0W(��D/��D�)�췉���y�@4�!M?a{g6�-—KR�.��~��4�q��j4�h����^��\����:Y]�_^�+(.*N�/����g��d�����)��Œ��Ԍ���
񟱒@�:
�m�C����y�S�n��~c��+���
�ǯx��`���q��_��8ΩZAd���
+ё���TaiEfF�aj�Ŝ�¾�#E��%/���KiG
�$���I��;8����-88�
w�>\��/�~�e*=3rp��AO��^?۶�[cK8������!)��Lj��F��U���^Y��\Q��/?/�/��[>�_�L���RZbٛ$���8I ����r
ԫ⾶oý؁{q{nv�h�䘽��a�����^�k]g�O�hV��0q�ј���Ĵ��d������L^M�0�TW���õO��5Ki1�o�xU+q�@6�\E
T)�I}�QFˣ���{*�޴!��ݖ�17ݶa��
�L��jiO$3�#>$�M��r,�ȅ�#q��)�MU���2C�u
�6�d7�m\N	;��~��8I ���j�����<z<!�
>TD��fl���\��o�,jo:�
{�F�e�DzS{�“z�bb���#;
���W
�ק
j�HjNgv̦��_
�-�8���$�t�%d���i�F4;$��ݑFS��h䑎T��^Ŗ8��6����_p��&

������������ׄ�!�q쁊D���$���߁!c`V�7�61��=/�{5J�qP)�^^ ��>�;JB�f6��gdt��m�B�᱃F՜�A�Cƾ��,Ǵ�PO��hޝ����6wBš(����
����w�h�ñԉ9
mb%�~�c����PI _}8-��ۤН���
<�F=�Q�+
��߬�O�8�������)�4m�i��u�y
��(�<��4'
�+d1�*9��s\�\g���h��'ع���_l�{�$�2ZhBh���F�I�+�D�>/�οQ�������Kr�k{5��.���T���@�%�u�R�=w1щ�������X�E_��R�^K
>
KC
����
��/>�/�i���E��%�F��o��Zg��aAլ����
H�k��U�-ɫ���V��"W��CW9F��H�����Ք}��B[�Z�~�Z����
/9�}����)g�O�rv����e��N�����fB��8�2�Gu�R�bE�|� �|�#�5���l�YwT
[��`��w�i�}
����ӣ}x����=���{�ɏPc�M���e�C�0cy^a�[I2ކP_B-7:=�P�
��&\h��Ά80����d
��WP�h���
�'�
bp�N'��t�<��P�m�u�༮-t������0�y�'I7V�:V��y�D�8t
p|P�G�."�IL0�a��<
7y���+Д��_��*���bTm���ҷZA�V
(�f��M�Q��4L�_�nHt��
��	�#�Dd\(�Y�N�m"
In`!�
�2�Q��䬁"o�d
`n2��M&�`��� Pԇ�ͻ!��+iC��4+kB�Du����d- �_F(
+�
��T�n����R�����7X�5��7��Fp����.0d�!PF8�;!\v��j�@ndʩ�XNNȫ�I���C ����o�@+����!W2�hJ�Qf�:d� ����{R�v�O�>�/ }�hc{�6m���@]Ĭ� ��	P��e���t
�7�|� |����ϔA�$��� י
�T%���OX黀��
����>�]4�.#`\5ƨ	�L��Ϭ�_���9��,���P�-�R��
,?S�����@5�� "��Ib-a�d�V��p��'E��BP�>0O���]�QM^[�T��zYuQ����� � ��Ɛ9!		I�@�
@ �� �A@��(rUZ�P������E�
+*Ȱ�w�;�����9�]笇ظm�@�X�
 �o#D�� �/�����a��$v�l����a,�|��Fk ~�
`W�e�0�
��;xۜ��{!p	.��B
�
i+�n�	hk�rx
�[6����?nn��̀ Q�'q�-���[F�Ö�8ā�� h��=н
�����0�	D�
A�q1�O�#pR=���%�~�h��@m�
�3�@�	ҵ�@�<Ex�}��!�3��)j*t�o	��5`
 .��*{`�^������A8da
A�uI��D+ .i5p
�]������izK�$�T�J׎	�c�����g�����ȷĩ�${A��'���[�$4e�=p<�A�rȽ�Ŧy�
Y�=.������
+����4�/���qN�6KLM�(�)|��1L���҃
"_ǽ'=�zC|KxE��N����
+�i~���� ��h/y�kJ=
@��+H��
����p
�}F��@��-��af�G^��ANE�;V
���G�43�%�<�9�j�S�]�C�k����w�S����΀ȟ����	�� ��-0�
Bw{P�� ��
A��5��}�˴
�>�ez�$�|�e�[IZ؀ w�s����*�Cf���V�=zG�
�%v?��&��W�0���e�
�'�w�aO"��w6�x��� �

�	Æ9�
�<��c�X�^�O��;-��U�,�iBr��3p�F�m^�V�!�uv3�։ث��ˌ>~/�ϸ����n��l�$��;C8���
��T7[�ځ|�
��فa�䮛
��N�!�F���#{�4��
i�!�U��!��_�ٔ>���oA%��W���
�;�9-<þ$�`��O�Df�hl<�%n�|T QG����
�wN�::�>r�~�u�.��;Z�m�`�.�W&��<���AȍԄȾD
�W�A��3�JJb;D�|��I��o���K��I�yO�����%�^<A�Ok�3k 
�\!:_�:o���P�z�D�������[��
�ꮉ�w#���j�4�V�?����Vf�N$q[eqG��č�I��SV+�"�>��H>�J�����3*dS�
+�4��p�1:?��,�y��7����s������_��pyP�]y����W��~1G
yF���ԦЎ'XG���E��6�&�Z�,���L(�� %�;Hi�{I	2�+F,,�jB&)� &:W��n*J.���e��W��{;�i�4�IsȒ�����VI��T
|�(�0g��-�$Z�.�U��íN2	+TU�%��	iC
+�nE>rSiT��՟��՟�y�	z��
���߾�C�7u�27ۉZ���5/[|��ٲ��[��
Wj��ʙ�N���[�QM�*jm��U���-M-�4�cR�<7�U��>�4���2�_%di>
+35������L���A��,��t�y
]l����rx��O�g���wۂ_;�CO=aC�A�ֶ2��fS<�֨�T�hX%��B}�0/�D��=$ק
U�R:U�)?�R����H����ӎ1t��hk �uN������f�����	�G�kf���,�ںkyWS�:s-=�hU��R��*S�� �Y�����#0d
��e
���I�U��+*���"�0$N��%�ǘ��q�5���@�:g6��t1f��_��Km^t���?��p�#`���:�Ἇ7R�4ԲwVW	��e2ra���S���(�h��r+��F$!ˬ�e�����H�P<�3�Sd[X��1�5@�� ����c�bf�q�݉Ř�]K0��W����4��t���
���Qr��FVXY
_a���S��֗�pRK
q��b��\&-�O�+�=JA�]��4_8̗-,�q�i
��O��
+�1P�=�
f��<��^g̍K
v���;φ���ڻ�p;iSe
#���ݓ� &��ZJMr��`:/�2O_^*���y��Ni7�.���*���a^\��W<ƴH�=�;a�f�~.�a�l̽�s0�W�0}W��u��8�/l_�t.ҳ���Wl����:�j��� ~IH� �("��
;�BBB�@aG(���Vԩ#.�u�Sw
+�,�0Et ��VEq=�c=
���b��ʎϼ�O����;�~��������|}&G���P��n�j����'��Stbo~~́�����Ս����Ҵ껥?
eU��e��>6��
�S9�G��g?2ɃV���Env�K���7���r�k.
�^H
+��/u��sYq[[
7�s�bM�FuaӶ����9Y
��k�
+U�
E��
����┆�u�9��&��NMit����
���t�In�3 �.3��^9w�^Sǰ�V�Ց|��פ����Э3�7\X%X�Q"���L�{~�:�ܮ�Զʬ����y���m��dmC9����Te�Zl7$ch�I-��if�+�
�q�A��3$M��S���c�CV�����{n��
�Э	_}#/��zq|ε����I��JŕJ���*-��A#��HO�r��{��kJ�x�BrA7좑���ܭ����t�~�NZn2I�##r�ߒ
�w���Y���Q�۞�7<�{�<L
���Y���ȴ{�x)����}"I_�D�W%�5&��u������}��zR"�Xp"]~�$����ҤG���Hs���a���F��%z�_���	�_�r���|���2�U��^���~���AɃ�B���%�����h�`U,���숋}�;�&.v`��o��?O��]GH�O����#'o���LR9<�|5bO�r��ܬ
�W�
7/�򬳵b;�6�I��tSh
<eڵމ�-��N?���������#?G�k
��
9:�"�ݻ�v.��:�� �B!����B��^=��)�TL��m����Mz0�'��r'�Lӧ��S�������H�RmEӹ���bG�t�oz�K��^�ș�ܹ35
�M�᳝찹
�
v���	�.5�B�A�EB�"�DŽl� ��Po
��������B��
+Mg&��<J�h�����K=@±aI�۬�
 �8h�v�8c�N�-{?�p��o:��L��v���	�s���~B���B��e����2�
�
���#�0�Ƒ�ϋ��$

+��.B�Y >7�ú�
��{c���D�����f�k�n�NS
�2��K��R2LH.$
&zrX艨���Y?
+^��3C�� \�?bY>.�Ԉ�d#h�ݐk��y˰q���o�oLlq�d)jMlp��-:
�2�{��-O)zIH�8!J"����HX�>�--�t?x�9��g#��0�
��e�e:@����i��5�
!�e��96�̰�p�\�C��8���h��Շ�"	`Bʂ,�R�)��!*�B�k�� �;[����s@\�#��/�x7)�������{�4�<ǃ�.�f�q�q�!�cB��E�1�"S�T�,B�%W�"�=�U��^�jo�3�v��+�w)�n࿡��
�)
+>�H���m�W] �f�{�!�և‡�� T\c�M�P�C�j1de6��C��
!>�Q�
D��Hhu���
«
���)�5�Qʤ�L
���� �@�J��M������
����0�&�j�Tً�����H��	�C��ָCR��6�� ��
Q�r�
q���	Z�لq�鄏�	�� gL�Qغ|�A�A��Cil2}
�
f�l�)2�HϠ�Y�
�_8!e�+�<�8��!������v�C�K��ľ��ā�I�p��1�\�h"G$���wH
+�.Hp�A�F�ڕ�Lw�8(Xa��hS�-��^��dlt�f�'��,��r�w6�&`FQ4%o�L::!�
�Az;���׈Qɛ�o%�Cҹ�7I{-G�K�+�
D�4ȝ��P�*��y��L�a5�%B
)mP���1o��L�6�Ɍ=~�i�ޫ����Ԇ�&7rG�Qo�1�I�yC���W�W�/dc��lL��g)�B�CBt���!ő�,��:飔�c}�!�"LPƷ�:��̚
��bϱ�M��r��6s_���`�k���c�N����8���MEqk�K��Xܪ� {H�
���� @ b�	��B�-@"D@�D�
+A�^��VP���ֶ�^�u������9ߞ3�������)�1�	ŌyD��>$
�< ������{��>p�}n0���	��1�[ n32��+�����$lw��}
���b�:������X�ۯQ���)G
�r���U`�0kq��&�L��x��O��������1�
�����Q

f#���@O[ a#����O}k�
Tm���=�0���}ډ���}�B��s"oףX��}i��$��6h�W��������ѰV�0�+�
+s�~�1��e<c�^�{�w�;���‡޶@2���|)ҷ����ld�9��
\�:�ز�s�W?� m�U�w�N�xL��yZe)~W#31�������ϫ��p��ݜvf'��eaO�γ��f�_�f�<�U�-"�,���@*2��̏Azo�h��	
�;��|��g��%ϋN����o����5�z�%E��O����Hs	]:�E\j�1[��&~7��7n���6~k����G@|m$��D� [`(2W�
+㐾�^�t�
hX��ݫ�=��)�p~\���i�)m讱
����H�^e�WB
+�]�Il�.����
cd5�N�ĩ[x� _/��WJ~	�����e�T!��r
�2�=H���@��F:�+�C���
+7�gU�Tu|�L)f�x��J.ǽ']�yA
�oV)��D
��K���1
ѕ�Ji=�,��?�',��
+uҧ��X�K��Str�G�Ð��H�S"2��(Z���l#�7�6��u{
��
]v�2��ξַr����e~�j�>9�X��E�T2K�����^Q�9A~�E�6fL��H������@�S@�V��@�((C�^�
+d�!�o5����n3�a�N����KǪ�]/�wt������9Q~uq���X��N-Q�1��J8y�j^NB�03�S�
?*��?g$����z���$��� �{�� � ��s����羚P?�l��l��e��w]O~{G��I�=V��kȉŔe&ti���r���:Nf���Q��J�8Y9$Q)�JRR^�������y�:�m�<$�H�X�
|�\^ԯs����v-�K.O���}ݪ��7�r�V��>���VA��N�fgf1�Ӌ�jMOu�^��>/NPJ�Է$��?�I��I��e��H\ �@�\�k�
�����X
+�:��G�.�5y�io�nm>K�W�g
�(��K�����ɔ4m#%'���]ƍϬ�f��e�iƴ$:�7�<�-3.�#%.
l�b$
�zo����b0[��=���\&:7�;�/�j;�E�	�����W_v����_�U*є(�ɧ��B-K^P•�Djω��^�H;)���ʋ*|˔|�J� ��d!���"���5. 7�
��Eg0ri=��{��v��U���M�-�ݥ�
��:�gv��_c����Ąr5-�4�uF��x�b����$�[�ܒ�\A�?LQ�G��l�2d����
�=��iv�'p�o���ٻǩ��ѕ��7���w��
�6q�i�D>�YP|]>�&�
Q�*4�q��
�����w���	
���m�������WB�-P��A��;�?��k�#�t ���{h5h����0ph����Uw�-������uHy^���/;,1����

+��0�i�dҌ�,���M6��ɍO�h�oht#$1�a�-0�	��p���F;0r�
�]�����m�3`
�fouw)
�^�
�l��w+{���/�J�#�E]���
J
˒B��'Q:*(�v#-��3�>�xJ÷�!�a�
�m�� ̝`�, ߷�A�
,�h�r��O-������i�
�<m<`��*a�|��7r$�]8$>~%�s0ɇv9-�t9�(�a�x�@!p`
�9���� l
���, n�0a�ߌ�����@����v�;�(��ݎ�[G�%��];��1M�ο��Þ
�Oʾ�\O<J����Y�1�
+� k��������5����o�k��z�2[���A , 4�P}���qy��9W�z��A1��
=�R�0x-�'�a[i;H���v�E5}�a ��"e"�}_"��	� $!�H�$h��bQ�tܦ�Z

��[-�8:��Wqj��v��T�TqÀ���n�|3s3���wr�s��{���S���|��Y���Y��ճ-%�gO���Q��v�@z�a��g(Uz�m����r����tG��w��NB6_a�5��d�Ս,��3k�ќ*k���*r�eUxXs��Dž�
�l��*(�Z��6�ɭk#e�-Q��]1��C��N���-���/|��/�C�-�5ұ����4�
!�.��_
��
�r'�C�̹C��ҡ��‰��Lݰz�z��
)񒏔{g�,�"��FWL�n�K��2��<��4��8~?0q�E`��k����� �?I�/��!���q$pg�1�Y�0��

�
T;ʡp�A�,�L!f���|R2�'��cVz��ɱ��5
���8�
�.�h�R�6���Do��<!+���&!�)�R7b ��E S�(v�8b��	 �OA�C"��ap����|�v�F�S����!��
�����5�8O]�����Y��+4����{��Fh�
�™(�����"���(V��ӑ��#�'
J���0�> %��(w�Ɓ����f�dl��fG��m�r�ޟ~�n��^BL�	Ѿ"4�	
I\��dL�C��pfb���c�!�Ń�5R�lOh��0��P¡E��
j9Nh�8b��#��M�N� �dB�B��gC�b��r�Dd9CV�I�;���h�d���F�
o۸�O������@p�꣞Sc>�����k��� ᳐E����N�C����P�@^ᆌE
���
�gސl�B�����@|��<�:��S!�
R�Ԩ/Do�/�G
�[1|l��
�h��f�;��
�U:A=�*�$(j=��'o��s��背f
2�N��/d
~�~C]��'�^ �O�a�M�)^� [...]
+
�|
:���a9���z�� [ 
gBƄ>�c8�i
�8�0�	�:W�=�7�9�>Э�vc 4ۂ�nA��P��Au,��l���ȗ��Q����!��ѿ)^E*�T��'*�
d#d@�G��4�L�X(
aaV4�D{�%1K튢|O��"��Ə��
y��%��~G�nw�v?Dsdڐ�T�
���߳���`F�������5�}�E�=
�z������ &L���`�dcn�=�
+'�\��y�0���.��+\2lZ
�b憘���g�M�Os�N��=ɪ�H�ӞK{��*���+��y&��O�����\�������0�TAt�L��i�/���v�NuĂ
�7�u�cżs����J>�?.\�0s�}��Իy���m��9,��?-��w�n�og\�?�]�
}oD��|$u�0�R�.`�������a�̥�S�������.��͇��=�/4���[��/��[�$����ɿ��(�*�n�)�1w�����Ǝ�K�N�w����=Rv�
�<[ �7E�)F��$��z��".�5��,u�L,��Xo?�T�4�8˽o�����Ґ���17*�f�hiH�R���R�F酒���EM�s�-�3�ԧL�4'L]�c�;ڣϳۋ�d
)�����!�J~r}�E����o�Y��{|
�_
�y�"űo����2������k�s���k.�_��Y�B|Ʋ.���͊c����/5�K���9P|>w�Ϲ�%�V�Ke�
d�Z n)��J [...]
+b}��_�`߻F�ܽR����|�~vL�U	�k��,��W����Ty�|�zߜ����_��);�����q��c�����2�i�@Vs%dM�}Q	ỐOs���ڷ��YVp���3?
c>���� t��F�}i�1�\Ci�������
�`��m�r��kU{*7iw��<狹_��(o3~n9��h�2m���:oH�Xն�f�>��L�0 ?I����8X�UA)ғ`B(�@�(� =j��j�A�@P�((�2눸z�Q�	3{f��{vV|��
����>_���Nn��MF
��*�1&�8��xx��ot~
|��N��Ό�ъ�X��Qu�TY�٭���9�.}|�gWF>U�VJoO��&51�/�'��&������Tſ
+�NZ
�� ��4D��#/�C
+��
�+2T�Vk��r��R����tLg����ve��뢰%1Gz
�;ry
�r)R~1�)�ܿ>��Y��ƪL�a������&�K���E���ļu��s��->��T��C"�{٘p#�W��7��
ư�nA��:hO6z�I�w
V��zE'�:J��
�<ZY����$K�_ɗ0��!��Nvq�`Xa�
n~�na�?C�3��/�F4�\���U�(|ɺ�r�pz�*у_Z��o2}�NfF��xDk���h���S!	��Uu�]��"Lv�/⓫
�rA����*fIvSHA����y%<�?���\�fg�����=0_��#�B'�-��͙���:xwj��6
X�ԅG];	��Úc��Z�;z�-/I"l[+c
�ʼnn��yd�0�VZT�WTX��7������p^�Mnz�<�'�;�_����"�Q1�*�
�P
����E�&|I��с�˦��nk�a��a_�	Syk�^ic�MC�c��	��4o�8�D����[*�,�c��ةE�aI���Ģ9nb�2'E�fz)b�J�?�RDU��p|M�$T�W<mՀ�
�0ק��&0�wP�j��A�����b��
��hq�%�)^�5�>9U���*���%�Ie��Q'Nt=��h��/��L�@��
+�T���P�![
�� �ד`�]

tk��
�5��]�R��wҗ]&ok��7��B�ۣ�K�q��-I
�M���<zJ������W�Š��bGWs���EV�e���1ck#���IUJ҂/�� O��0'S��^5�5H��#P
[�:���J�zm��c�.�a�/��
�c
�.�u嵧{'_���ƶTD77E4w�š��r��C�M�C›?D� ߨD�nFU(��(ƿ�`�oO�Rax� �qC�� ��
�iq7����\	;��w�>�7�9�'��LW����B�Ȏr�0y��L
,

+�M1e?0Y�~�rD���#CdU��V��&z	0��_�@�]=h����x�V�r⸁p��D0`ƿ�ޟ:es�Z���d����j��J��h�*d���AC1��b�)VO(�P���
�T��{�k���n��~�x{�o�eF�g�C��5�='ݼio�s�~�)wC,��D쏹
k5�t$��9ǐ����27��zO�1�7ml��36E���|blՋ6�<�ȕ~
W�N�P0-��
���7��HP5�	�#(^�C�}l���g��I�q��LO΅�s��d?8{ ��&`V`ǘ9�f�
�32g�̠��촋�������#�
:J���R%����n�+Wq�
���g�C5(~��/���r!���Z�
�����Ɯ%�	�Y���g�f~�������,��"/��|&��x6d�t��m�G��U����nߣCnO�6�p�`��s���Y9P�@�
-HU�Y�.B�� )RyL�����R�7*�71�[h���P�)���,SOe�Nwe�n��6s�e����w,�~^�p\����O��;�Cd���e�.|�-���{ �2�!aYb3������V�������]5�+
ꊟ��J���J����M�Wӌ�V�}(���������>o;�6kb�������6ە/����a+~*�p�<@���� �k:����>� �}�K��ې���
���_|4���kC�:(r�
:�k���!��T��
+5�C����^���pZ�>}�w ����
<H[����_ �H��h�
�\�~�:L:�
Iv�M�Q�"��
+ְD�{P��9J�ڍr�w�2�
�I�u�|��u���
&�9��+m������8�)@
�g)�k ��H��
E�	vȜ`����
���d�YT�g������;Av�5&@ �$$$6!�)6�7�,����E*n8R�A
[EQ�}k=ť�ӊ֭�Uq��3_ۙ�x�;�����}�sr
pig0
 b��ɴA$�
+�ZH�2E��1ʴ
�J� Y�e�c������'6�PT�9����I~�������(����“��F�p���
[83ؘǰ�'�

h�iC���z��u����%�i�cj����&�v&���O��N�߃�Ѓ�`�O
B
�J
�π_�.xz��ǂ6p����0��~b�8A\4��u�
�xg���3��O�>C�|��x\-��,��@�0��Y��ï� ��
�������{M�;H
3��)�W�;��=%��w�Ô/��x0�ȃ�&��|�<B��D��d�,H�:��τ(}��
 Xi��ct� `�)����$���
�����-
�?&^[�?i���	>����T��h�\H>��D����,�Ku ��	Y�
B�
!�2����m��@���½V
"�i
�Ekn��ٓ�W����B�_
a5
�W���\R'��H#��ݘ�ZX�c!F���](�#,��2S�֛C���M��ʆd�͔dp�G����#v�g�&�W�߉�ڏ�ux!�px.��S	l�H`�8�G!�ք`gr{Qv4b�gم���D�)t�0� 1&�*4�����
_c3�f�E��;�v�7�{�^��u~%;4���
�s�I�\I��>���{7s~���c
+��R�V$4���e�Pͦ�2��4/-��!E:��
>&����ϵ|3
So�"j����9O�=���w��60���
��G=��/xߑ���I����;����vM	�+�3	��"�	��
D[1�`�@*��&��
��
�D3>�+�ߤ�L_$������~YT�|?����V���.���z}nF��s#b�{=b�wUy�wTy���ߥ�7�
Q�>��
�v&��c�	a$7���d�;3,�!7�#���ў�L�	�{�g� c	�N�r�����Pչ_Kh���ȹ
���&v�߅���s1��D
<}Ip"���X�ˀ���|�ăs8�Ép'�4!��
�ι�t�l2K�
%��d�s��o��bɬ��&?�$���3��K/�w)���|�*Ι�������=G�
�
:P�u�i����㟈�&L�U�w(	��dx
��C�I�b��̀B�	�R2�
+{ƛ*W�I5G�neЌ�eJ�ѢD����Ng���N�˽����
^��w0�5�@r�p_R�hh�
ɠj_Ȁ꘴?�lw���w�}��K�o�p���[b�
RH~6�[EFV�Q��lƯuN�������V+�.��Y�*Ns:���v(���@Vo���?��,�r���=K�%}�;�;RC��
˷��W�$�V���Cؓ�/��
M�7&wУ��(#��Qo̩G������0�6�N�X'3<Yc}�"����۾�|����sk�}ٍ�
��E��6��d�~�ޯ�Zz �s�)e����/B;�E
Y�́_g.���`H�"�{�dd�:}�e�!u�Ō��Α�m3�u�Qb0Re�U��qhE��/�r����y�
���5u�6��rڥ
Y=�̾�V�>�Z����Ȗ�gaks&%�C�>���_GT䷫I�+&�gR�V�R�ZfQ�6�Q�mv��>��-"����{�9�צ��U���[^��RZ��*^�Q�$ސ�A�.o��9wGxS��#V�D5�\�j�}�\�?!m,DPS��O��;��!oQ�z�R�[3���~:�����7
��S�����o�h���U��ڻR��]���\Q�o+��/]%n.Y'k*ڤXU�MY [...]
e��Lm
8���Ȣ�TE�g�Ǚ3=a>����~��s����>9
+�f���?pf�ތ���=!)�B�3&�w��7-
�����:�í
�T~!3߷���1��
ײ��~\��bt�q�j��ZVWdx�,Ҭ�d���X�]~a����t���,����^��}w:��}.()�;x{�����B�r��%Fe�T�
A�:�']Hx�
�uE:����L8˄�M|�j2��$�Z%�������&E������Ź�;���i���
tK+��L)(�I:Z㟘�
��
�7�5�Qp|�o~	��^���B���D&���}
��8��jh�]π�4\n�AG�	��b�y�эWY�oP|&lm��M�95q��U;
�U��.�p�u<�c{i��G��~[�b�.n.�.zS��7�dAW��m�(W�I ?e���ϕ@:@��F
+�� :��@�yc��C̪ns�-9竟�j�s6��@}�pom����)Ҥ���	5�q'>Vn����T��Uy�?��? ���Ȫ���=���us5:����
r% �j � ��8Of��.-��lH��a�^t�tz/��Z}�=b]Z�f��x�
�;���:ƞ͒G7(���=�����:}B��|B�F�:�V7�^��:��{�N�x��
+�۵ W�:?y�O��^T]ׇ�^+F�5);�ǃ�ѽAO��ﺴ�4�B�U\�ۘ�{�>�ȔF|rT�^��^��v�=���#�}�#�mJ�6'jE��V������H�]r�.�;h�H�O2����pl`)

0��?�c��Wh���-K�j�э��c�ǚD�&Zn��*���Q��<������ZG�+
2�[2��Q���)'��9�O7��^F;uߑ.> g�_�E�̟d�+��?Ā���p���{߆���L3�N�p�p�~����;	ơwRL��2,��X��
+�km��
b��>�����E��
!T�*<M:���P�
Pq�` �RGذst9$��Q�F�1_�iF}��
	�

ٴ,hd�~�j�*_վ5^�\#U�Z7�WU��\�g&��L�匩�_ߘ:���Yl���,y� 
�����| ��bB�C6Č�`ӘD�	�q3dܓ�a<��7
��
ߢ�
��s��w
�^./zO6qr��D��tↁ����I��Y�p�����"w��
+p�@U/ɿ�.?y �!6>ք��!�>����8�^��L�I
�d����l�T,�q*�+�N׶�>��~�LW4Ӡg3s�'|:D����x����	ꩻ��D�a5�`� ɿ����� |
 �9�_����!(_�S�W"�y֑v�uc8��aڽ���԰y��e=�c��\���\
�t��m2��Y���Y�pO�'������-�B�a
��������-���|P�&(P�q%H��ђ�����BW�
=iS
`��0�F3
1��
+Ә+��{X��Y��2kY|�u�S�����}�.?�@���O �߁�2����`�`A�a��1
+�5��Z���JTP+Л^��4#h=��up��,��08XKt0����Ļ��7�5L�U$�;��x�
 �#��0�%�u���j�}4��d/K�
�P@領�F)�AWJ�)

�(�� �t"�� ��E�ƖF;�R!��"�Jh�`�8����� A���hy��ǵ���H�s��q��'�*.Z��o�ω7r��,�ɖX��D8��(�g����?�E,A�66���0G
��\� �Q�J\ �����Y� 
?ψ�r�ȝ�/j����:Y��B(�>\E
t�1Q��B�0M�Ʋ�!Y
�2���P����ͺ(��EQ�K
���
�
�g�ij�oĨ;K�����x�
,(��R�fB�Ҝ0�S�D%
݂5�%���;��_
�t�߸
Jkx(i Z�����G�>b���9<��J��/$/��%�&��Oߒ"o�
�?B����zQ��o��3��4
�oh""�� U�t	%����B 5�@B
��TY�X8�V�
;zг�c�X���<��?���~��y���qY�A�:5[��tMި
�D
`f/���^	4�>��
�z���
}�����z��3u�����<�
+q�z�������:O|I��~`��V=���.h�`� t
"�7�N
�qQTM�
ֆ���AH�
��$2�Ī3�l5�c� ~�[�>`��-c����5��Sf��e��~��	���#Ɯ�}Ƃٽ 0����L ��	Ƌ�B��F	cJ���j���H�}�1�@LIJ�Q�z#r�߇�zVM�#�����ٳ�n�'A���F���}x���iۻ������n����zЂ�L0X^� �W6���!`�`���U8ߐ ���4|�3���-��5�
��.!q
��1�GQk�G�,�7[�޸��V�N���a��{��r�q&��Ր�ΗB�;_
y�4
����F�=֧#��TX`̿6��M�{�W"H7B���d��]�沼5_g.}ʎ�{��f�k"��f|����*�k1�vW�Z
~޴��b�.��#��"��	�t?>�1>K�g�
���O.Q�x,�ŀ���^
�`3����8�x�ػ,�|�+>I�q������峜D���K����m�%�8��op��ks=���}2f�43J>}��p�Iʡ��^�~��3 [...]
+�� =/7A�*l	7�)��Y��Q�S��ɜ,�#��9eN�2$nc�z�?�Z��N��5���ӟ<Jݙt�֓tƿ;iֿ3��3�gW:xt���+
1��T�{ܥ:h�T�顇U���]�"k��X�Si��DQ���L��y���9B���"���Zr��қ�ͻ��Kݑ��֞~��J�b(�fZӟӕ����
 �e�;ƹ-�����{�B���抵�#��#Y�nKuь�
]���OI�:�����Lƅ�V#��`��iW^�[��ܙSOٞ�����k�2�����Pd
g�3/3�9��YR���\���=��;��@
���qݩ�D�����V
����wQ���-��:D\
�zwy�e���"�S��ح�@Ln��(-�M����~�>z
w,��;XýȒp��>�I����dY>�-���-�\!B�Eݔj�o�BW�h���N(�Ԏ�}��ɂW��D�+�,z*2m;�x���B�a����"4���hR~/C���)�;ªțf���c��?���] [...]
+�	n����OY	x����b ��- �;��j����p�:��D�U�ʎ0��\2�������ck�Y�,ͦ�&k�\�w�U��Eb�ʊ:������NFQ���� �_r*(��VP~�[��|���(B�0
�l5�g>B�U t]������*�щvut�c%�߱�0�N��kc,�l	3R5n^�Ԑb]���P+�u�H�<D5���ZoaU������0y��,�h*(Kt#�+~��U}�ͫ
+_��@&B/�nc�V����}�4�I@��Оn+�@��fw���m!��mѦ�-IVҦ
�*E�S�\�^R_����ڋ/SPy����Ҿ N�����,v�/�
�+���oV-P�e@�ʀ�=�������
+�N�����ً�o�.�3G��\5��RuZ����;6���'XT��m�ڲ
�����%�ܦ*
+��އӠ���;���d�qf��3Y������7�(l��Ѓr�f��nE�v��8������w�u
9��zk��WHw��{b�J�S��:���;�s�
ݳ���
U�Wj��7I�KKP��c����ʫ�X�
Z��/�%x&�	��=�
p������6�&z�����a��G5P��j
�W����:j�L8��r� !�
	��!�H Í	nA�x_�N=겻�Nm����ƻ��T<PT���
+��V�.`�j���-�>�d����|&3�e����#3�0���x��=��Kv�H����U�=k�
�i;m_
<e�*դ-��OزE�m��e8�i0���,�)<ۀ�
��C������	@-�?+��m��Z���I`u�'��6���@�pqu�����
�|�'�QU��޾Y���'W.
ȭX��޳.$�ܠN+�
O)?�/o����
K�m
+M-��2T��n� � 4}px;�� ;��� �?� �h���WX��ZtLÛT+�U�.)>��0�p�t�n.��>��'�n�_Zm�}�W���
+���>H[�4�@o��Ƥ��`���G�Lspf=�1Z��e _��L�Rs��`6�`a�(�����nQ��5��
����S�≧���
3��JӾ��U��_��z�k��;�q�olc�oLc��9a�9��1
�5Rk)�C:�{��P��W�X�����\(n���vW(hd��Dzs۵����
�DQ���:�8[�3.�O0�8ĵ}�ݶYٶG�1ֻ�5]ƶ��D��\"ΡK��Լ�����
+��� ��*�/=
0���"&\Bֿl!���:�!�#��ԑ��ufq:'��:�	�;#;?�����:�k�Xݵ�&��$�F�$��W�1h|
�~��z�
�=�}?����o����� ��?
 ����n��3b{˜��XFӛ̊�
�V��sB��s��>�)�K���k�
����~���ׅ���By�
�
��yV������?K�v���@��x ��D?���
Ÿ����B�G0�qL�d�0�%�c�
Mc{
���x�g���u
7�v����+{u�+}u�+5=�J��p��
_���A���_F�9 �\��w`l7@�0��Jt� t�T��a4F1n�ed��8��
Y�8�e�bI��e��I
���52@
�cs
�'��?2���5����P�@�
`
��EԔP�\���

��1l1
l0�1���LF��>�b���a�



���c�<iǚ� ���o��ܧݢ���  ��r�-�i�1:��E�� @?�X4�� &�
RD��F�
d�Ojށc
*
6S�P�B�6��p�+��
3�辘��+�g�K���.��
&'x��B��:=�&���������~
��X�BE$�9��E�i\�^�CϿ��s-��G�m�\�
U��
#M�<}�ܥ�
�!��7��[�G@����`8��3�`�z,Cu

ʦ1�p�>�/��j����w�JRC����,�Hn������!?
����۞
Fz0�E�Y�f�&���\TO�a�l>/�r�*�	Q���D�('U��
�DE���
+�尢��O�\�\�D���E� �M�‘0��Qn
ƹ2���8_B���X=�&�P3]�
�^"°O,ߨ�[�Ve�J��ڤ��
RU�UG�/T��g�s⧪+⇪n�}�Sq����[��{j���VwF@��/eP��`}��\��z�i=u\Ԏ�c|��p�<�˘�VtS�~U*~���Q�V�@d��o�}v�5uv���^��
ͥQw5����y2�F�k��H����Wɕ(���a����z{�tG�h.��
�R�0#�3���{��g�$i��n�u��D�;n�ݽ�����ov�%n���=N7c��o��K;bOI�Ƕˮ�ޖ]�}$�7,5ƣSk<:�O�Q����0����-�m�H�8&� ���d��հ�d'�
d�X�dY�I�gs3e�]�~�õ�5NW7HL4�\��r�A�׭][�ަm}^���9�U�3�~�fݐ{S"�6&��d2:�HF'��6�Q7���t�̓ М���ЏyT�b���q~��t��[]͙i{i�B����έ�\Υ���M�8�t���2�& [...]
+u6~3p:�����7���?�M$!�q6�OF�ƒ��5(n?�`�L<��h�;��$��g�/���坳��'9}��r���羜)�XL�x�s*}���H3�-�)�������䩠Q���a�#� {�����d_�O��4��{�`�{9�5(g��}/���go
+
�[�#|Yx �ˏ��Bq]c�@
ﴜ�q���=<�+��QyOfk}�2��G2)��m���
Z�1zW�
�3�~pGڳ`K���ΏA�
`�D$K��x[�.��9D@|"|'!�K�-|��
/�{��⣰��]�k��C���T�q��<��@�=�W��x�
n-�zNsP{V'�-k�y5s:�9c9Ԝ�q�)��0S�[�)Q�����C$��5��;�x�}�5��?�l`K�
~�q���C�BXRG�ͫ�;�P�]�d��C�>q�w�HE��Ӓ��ԫ|�9��0��������;�F�zx5�Oռ��Q�Q��B�g�C$kP��
 �|��sKM�gZ;���

�>�
���
��.=�w�$�e@�q��<;eb�6��tU�!�ŕ�FQ=�.��Q#����U"t�G�r�
V��M�N��|D�#2���f�o�+)�
�;�i	�Dok�vp���a�2�v\wz�`Y�s�:�P{q�G�2�ˬ��6��d:j��H343���!Z�HXi�\�:�!�$;�D��0u��t����
�[�8 ?^���|��
W�A�
,�
�9�a��i;d8��;�^�r�ji��&�������F��7�Q��*�Vnbh
+�CJdC�J�,K!�)��.R.�>�H�_�R��T
+DQ!�5(�{�A��W
�i��e$�J
�����/�����wwT_��Z���I�q��<�xu�اB��/Wk(�%�����R�"W�K��Y��{��O#��o�
T?1e�(��Q0dkP6�	�;�`͈���"v��&'3{�@�x�1��Z}�&�e��j��*���BtB�/�S��PTZ}����.+m
�h��D��z��W?�䫿����)*E��2D�� k�~[� O�p� Kf�]- �{`��t�R�m-��泎u��.U�il�R�л�ZJ*�R�%�Ɠ���@���M����Fd�>ae�������-�Q�(��w���=|����kXh�ރ�k�}tw
K���
fW�vzoUk���%��ƜyTe��7J|�
E��ueTam5-�hf��t�d֌��W�	�R��UXz͏���eDL�5��
����;h���ϴ�`��!@[�+�{}	�=L۪�_9�w^ܧ�Hr+�p�ڸ��V�w�U9)�EC�i6P3�&�����4�l�
�6m�&���l���bB��&�fBdk�*�=�[\����?ޅ�;`�@���
���I�v0ʾd �Qџ�\ЛvPԓ}��-<��zg]/&q:+ȩ

Tv{;-�}�
߾��ԾΈ��f�[�%X%�
�1~ּ���i%� wpϿэ;��h� 0L9�n�(h�(�T�m��i�x��p,م7�q0k�8}D�:��b�|��.
Z.
Q���<Ƽ����
8߇�/�!�ך?��
� V��������6OT�b�����7(\����7mǻu�!k�S���ԛ\7�l���YőK3Zϋ3�^���N��
�==}�3�F:5��tj�O�$:��@^�<�w��!���;�;�j���� ]����'pW	��D�����K����M���/nEx�Š��ܲ����S˭G��<���<"��<Y˯<Xw�z�� �":ʺ�K
�o�R� �?���� ��P~@�=T����Cʆ$o�@�&���E�ی����h�ɱ?��s�ِ��(v��0��hq��w	ݸ����y����+s
�1���~�j�`������K �x�5��'Hxf�~�g���-�l1��v4!z�!j;���ɰ	�چ�(�;:{��i7m��!���C��G{��w�5uoq ?��$� �� !�	j8*���,�ɢ�Vi
���
t���Z7����V\�֊Z�<l��":U�cQ�Td+�y���8���g&���{���{����l������ְ�{��o��hG����J�_C�K����Q~=@��� S9�o
>�b�nV���>h�����0�-
<��m[��8�u{\��<Y�9?Y�9�W���<���<�'�<���}+��[��G��6���_F�����_ ��D��
0�w�	�F��B
ڗrp��WZp~�
N]�cWؿ�ew*�����0�/Y�&֪�[ֲ�
+��J{_�݃�E����u���)��
�_����; � x5x<p��f�

��R�ݐl��A6�X�/H1$8
Ę�8D�)#�"�73Ƹ����H#�7c���/����_��_"~�0�����w�!�
�5��%J)�ơ
+�P��cԃ ���P�uB�!���4t��Р!5��g�?w$��=�!�_
��v �� �/ �� ,�1�t�ƔiB�jaPN��"�%^d2�$Ʉ6�1�F�t��rl
t�2��Π;q�1�gP�Ϣm8��$��9��sh���&I9�$դ�CI-9K.��L:X�xC�	�#�ZuD;R��
BYT&p��͡<�C�<��$�d+�+�>r�
#?��
Z_#�3�M/�e�Ȑ��o�e�wbp��8S-�]�Y��r�N��aU�y�,"_�M|Tn'U��ԐZ���\&M�a�Sހ��ׯ��T��%=���

O�z{�U
z9�g�IO�1!�E�4�1�C׹<t��s!5�H� 5[I�K	�4���ӂM��/�-��cA������
��3
+:ȟ���@=eOR l��A?ꉯ'�?}�r�O����T�">z.
銌������hԯ-�iw
{���=��k�	a�������C�,�C�R�D�NئC��

+G<z���Y�([� ��	�E�7��i=�b�AC��\A�O��k�B�+���/��w��L��w�<��1}�?d�D������UEԬ�]�@�iv��Y����BQ�鍦7ރ��`A�b�0)`�$B>��g���s���Y�g.��/1n�_n���������ߘ�7�wϰ_�d8"i4���6�[4�X\3<����oq�%�P|�ǝ�C�s��ɔ;e
�T3�(�#�j�nC��Lo�7��>
�嵄�

��3�7%_�������A_K�n�^
,��
Pi�s����c�
?��\�����t�N��� ��
B��`��hD�SE�oOu̐ &ʡ'Q
�<��8���H�1&��FT��ȅ�?G|&�^(=7�ت.�Dv6l��t�v�S!{lO�
VԆ���!����������a���P~`*Z��p�����ӄ�qt�L�:R͠��L�Cs��R|�I��_��Euq��ӱKO�,���^&?����u���-�Ñ���
�#�w�6�N�/►*♺2�jw*vE�ME4ʈ�hn
+�ҵ�Пƃ�L#�#�Z3�p'S�2'2�����h�����,��ď,��Q ;��mu\�ݾ�U{��w����+��ig�a����ˣ��l�ns�ۧ.���eqhW��D>F�� ` �}��l��A�
��mst��l�6+Bx4s��Pz�d�\���y�ʔŊ��B��b������5e	Λ�]7�w+��w_��cmB�KI"�K�PU��v�v4���
 t�6�L睦y
4,����B�8��,pc��7p5�aFr�D{�̔�=�jG����|Ŗ��6�\�!u�Si�z�)�k����N>�*�ve�]]q�+���aM�LtX��*b7�2�)�:��F[\�B:��qP��?�Y@���P���U/�bT5?F�37Y�-g�UYv�|cV��t�b��Y��k2�5��X�2}�ۗi�
�Ӿ�-K;�4�����N�ҌA����^6
�r��u�	К�H�W?�w�|��98�/�#j8��g�>	�̛f����M
�-K�e�Kr?R|���Z����9E���5.�f [...]
+���iՅ�g�$Y�(2m�y
+qAn�$/��I.ovɒk�ҳ{=R��d)��=�����uM�aND�����J���T�C
́�j@ك���`g�>:k��Q;�k���i�Z2E]�\PUnZV=CU�`Q�J�V����$Y�N��M.)��g')v�'(d�s�8�]ٚ��&�3��&I*`�F�ga�4g˨�}���=�@W�:�Eh[+�������W��V��(��D�����V�erی�"�ԒJiRqì5�M���
���h�'
*o{D���ZŜb����'z� |K}��jp�v�A���H{W�A����L��l�:O^U��niC�a����n�4�:vf�Gɖi�Y6I5�5��تz���v�����++�ET�u���
Q�O��L���9DU0�D�R�/i?�
WS
(���l�����
BԶ۠r�W�~>���oJn�
+㬖��u1��D���
���m��R�U�j����Nau�g}Pw�5�n�|�����5s
U3b7�
��%z��Ct�}���v�=7�[�*�J5Pjfq�o
��Ez��
S:B���L�6�ψiO3�ڐk���6��V
��*Y��%]ֺ�)���s`�7΁-�
�Z�òf&^��l'��~��L��	��!�߽�PvK'�^�e�.=ӑ�#Af�'����O�Џ�l�=R�-�4�+Y֕m�Yd�bk�u��f� M��_���Os�a��k�%[F�~����mf6�
�z�����
P��(�h�U��(��(�H�"y�5�������E�/��_��f�m
�7A�|o�i���=�3�z���j,}{����=e��{��g�����7�>=���
f>�yz��

��
��Lwo�T���y���#@��D
��rH��!O.tȇ<�Tg�`�n��J���8��T��y��ʦ�
4�.8�e���}��GO����������y
b"�����

�u����
��kh
+:
d
������lX��a
��uF�v����m �H���~��P��;_��7W[<�K[g��&CO�
#�����ٯ�<����~#p;�n'�p�c4�}�����S����
�
?K;�9��0��	�]������<^W|1�J ޹�y^Y�y����F�y�#�:.#��#��NW?�K�~��^y�w�4�'���K.N��毛�7R~�A���}XC���(��{���������THoX at zS
+Ǜ����C�p+��WC|;�wT����Y���,�
�,������3���3����nN����A�
�_z
����|J���>e�|��5�r���
�B�<�����x�
�G���hf����L{
�'�0yZL�A8�
�c<�
+���0~2��$�o��򏁜a�?O��
@�
([�@z��0����F=7��
3��������0z�
�׋��z9�cQ��-
�7��ö́
�1j��5򄌑�����+)?W
$��ïK��(ۍ�
(��
0�`�
+2=�1
�	�|f	���L<�B��_�!3z���3:�B����$Ք���D�(�+��;`.e��
���3e�э)߀z����]" &DD,�=q!^d1	!����5�.BC�NM�Ĵ[:8�e��1
O�M[�1� �	"8f��1�

3(%u��c[��K���M9AΒ��w�>���m�o0���8qLJ��8	��ƍc��
��Gg	����0��H
YG6�.����Y�c�
��\#'���+q/����?d�yTSW
���K¾� !/�@�	Z�*�,�ʾ�H�HXH�Ը����ТH݊�8
�m

�ک����^EN�w~�
�����N�������r���Oq�w¢)�^/
 �(s�Hl�Cb�� h&�M+� _�
�
��<����8�	��x���K����K�O >�
��N�c�t�f�'
��HbG���Z dAC�6�=��|Gw��ѽ�8}�|K� ��ߑ���g�cr�?F>�c�!S���M���A�\�=��iO�c��Og�#��SbH����5�|'.���5Ԙh�Z��z%�B��S�E]�3Q�Dt�
�
�NSEW���G�-��M1f����O����	u?�Ax��
�}aM>n�ۓ�������O��_�)��S
�'
z��R�C�*�}I
�d+�d����[�}̛�~�?$'�7$�XW<
�.z�6�0��s�;pv*f}
�p [...]
+�,�I�����K�`btV
�`����Y.u˻��w5��2�U�&�߽6]��n|ѳ���
��MF<M�y~oz���I�fC޿���Ʀ���76�#�
u�Am��a
��G�����������-��Ƽ��\%��9Z�y�%F��jM���0=����f�a�v�o}����O��O�Հ�)�c>׬���>����~?l�������������\�Ȃ�
��a
�h<������N�;�:
�-4�	���˘'�����כ
�[

0X�4[���>��a�߿���~�}�'l��_���o�
0��
'([wb+`�5�
0���@hl�FcY�q��e��F9�
�3Й� �ۨ(���֑p���<�
u�}��ֽ�K�{BVq�
+n��n��
���
+��+�og�Y^G�-�=�w[�k
�
��[?�0^�c���_�t-����
:�����a�q�F�be�=��-���V���؝�՜��v
k���
��No
��o	;(�
6�1�'ǖ�g���;����͑ض9
+�|�/�=��7S���Ѕt�>��L�C�O�!�l�/5�ѓc�;)մ31�bG�ں=���[n�[��
c�m\�L�_�&X����'\=�*�����

1���X� 쁭!
�Bwa��0��$Ѱ���ѡ
1���&��T�,ҨC�h�-Mfٚ��ޔ��$��7'V94%6ҫ�V�ovZ�C�,n�KC�QQ}܈�.��K]¸c]"��0��I��i<d ����^�y�`�
�"�!���rF�Y3�]�yT�"�՚g�Q�f�^�`�MWsVK��
i��S��Ɣ����amr�Ku���o��䳮��w]�SƄ�T�קa
��I8
+�����
�F������s��r-P�Z�v���s��-9!���E�k�)�rkCFg�\k�tq�C�����-s�L_',����Iw�K�]uҿ�Io���q�ɰ@���p'��؋i��qꞀٳ� ����Rc�viy�]+!�hf�-yA�&u��JU����t�YJN�2ϮJQ�P����d68�f4	�孢By��V��M#vϓ�t����E��
5
+��*08Lz
�пd����cE0��`� ]Eƨ���Z�?A-E3ɦ�@�Anܘo^��fU�δѫT�KT�ܒ�r�8�α k�P��I����R���(�ܳ�7ܳ�^�r���*�s�1/7;Lz>q
'� 
A��R�����
:J����m(sEM�^��ğ�P�и�(Ƭ� Ų\+g�j�m��܂�RZ�W#P�
BU�QV�W���-Su�=#�*x!�Tc'�
�jLޤQ8�'� 
•�\C�T"�	��	�R�FM.�P1�h��a�,	1�(�6-+I���d���,[MQ���P�SV	�
+�;ej׻ȵ��e�=nR�q�4�ew���8]���,X\�i���P��%�28Z��2��
����X��N��vQS�K髂X���&�	�Z��:�\�Q-Q�g�9(J+��F��u�i���W�I�cn����(Y��S�
 ��üIw��y����pB{�a4�ܷ
����7X��FU7��(o�E�42
�Í��b�rkS,�k�lE��V^U�M�*�U.$W4	*�\��ݢX�q��0�����4��k
�3 ��!��A4�(AD�q���p�U�֩�Z���
+X+ 
+8"8Kl��Uk+���.D���:��Z��u�}_�Z���?����y���}r��?h��
<Oz�w��pf&p�{������|Πe�I��SaNJ >L1+�'Ǫ�$�;LZ�_3~�P�ec�^:A?��i�Ö���8�g��~����&�h�;���+�Wƒ&�^��I�>��7A�R9���
��{��u{��d�*`}��¬4=f�15�����x/��j\j�ѫ;��|�v���
������G
��X��{E�wϔL���m���
n�5�l�����%���$
ݓ�W��o�����y?���8�lJeҁ�5��29�e�g�a�:_�_�q�ڋQ�q���=�C�8���9N�w��n�����X���ۚ�]2�xu��j��8�
�Q�
��gCl�s��4و<�+al܃��?/
�b��, q=0���D�Gcr5����04/��"�����~�}T�s��{�r�e����.�r���,�E�v�ܜ����GD����������7H}�z�
Q�I���;��q-������r�i�9����Ѩ��
}�>�mm��V
⭱��5^t��Wt�S�Y����Nq�̟���X���b�ߢm��_�6����*m�管;�k莿+��g�s����'� 
��v���}��8 ��
���.B�-
��8D�z �6P��F	�m���m���m���m��dۤ�}���h���ͮny�c�!�xP:շ��n+�9
+�d�	;�������H΢�l@��@������Ѻ��EA0[T
�V%=вdKƠE�4+�+J�D��u�I�U��>%�K��ſ+�
+����T���
�O���ﳿ&3{���_3�[�������_�
�
���wE
.�R�.uC�K�ɗ�������"�����ۡ�r��AWY
�E	]��
omb�j�/e�?f�SX�hf�?�� �
rh^�U�?�����mw���fp����ػ��> ���p���b��P٭P؋!�v��I����/��3x ���G�������@�� S`�
�
+����j'hj��X�U�5@��¨#񥤆���5��kx�k� ^��]zB/�Hf�����
,d~Љٖ�@�ˀ�O��&���|P��:�t^��;5�o
+��@]
��a��\��:$�d���w�X���<sc���Ϻ�W��� �[�����g�Cp�$�S���HO2R0EP<�EY�,��$�<D�ߐ���~�!}ȳ%�.�9
R�R
�hͥ%���2h��N�K�+*��t�~��I����M��ҟ���#�e�!��Xb?!
G	��,�r6}Bɔ�ȢM��v�>���NR]����%�����
+RJ<Q�I��
hB~l!���u?B�����3LH�{B�̤�)��
!����mY��p>�:�R�p����U�u~�ߜ%
�H���x���]��/d�����Ϧ�{̽� �j�
	��~�O�9�^�D�.U��e�纍�.O<��Ot��c�
��BT���Pw��k`w%�襸M��t�
�����l��V�GK��f��#d�<3#�K��w��a��5,Ն�!]�j��r�}�v�a��2
v�7�Ἰ�}[��S-.��R\�
+�@��!�nӀ\!Cu�~�a/Z�lE�Y`<
7"
���{���n\$n������
�q͸A�h�?�����J�	�ŀ2Ey�uŹf�)�4�S�6��b*�B:U�l�|�
��	2���������ۚ�0�#�Z�ŭ���	�i��4�UT��$�w�T�9S��i��̴MuڴWUb*P��ԅ�J����c��
������
~�
�2W
����:b\Q���q�}n�E�%
��󖱢�2YQj�PYl��:e^��Ɯ�>iNs8a�r8�.��h����v����O8
2��
0��|a���j��|�t�m����GF8BF�"x�Y����;��
��ը&(�n��1�P
�O|3Bq"z����Q�t8
�/ǃ�K��G�h�E����2
j���Ī}Eb�'
{��c\jl!�B�!�$K�@$6�Ib�ر@��
�8��X$vl'�
�Y&��v��L��=i�&�I:M��m���43��3��{�y�9��^�+b?uU�L�$�L�(��8/~�?b.����J�Ϥ��T���J�>
�F�I��
��l��
+|,���Ki� #
ޖ�_���LA��YB	e"�d�D�
�G_���vQ��
����e�
sI��Z���OKB����/yȝK��3��kFJ0��}�n�3�уL̽�{T����
+���r��r\��9��f�W��
9e�AEE�r�5����� ��z���!֜l�=+;ŝ�\��2��S�����	����cr��0G��Y)
kX��P�!�J��E��Bl� k�d��J'�+RR��D�.0����ԓy����	��5���
���L�G
�a�Ÿ!�5�G�h@�h@�DЯ$���a!�0���\̜��
/�񨻍�(#AḦ́˚Ͱ�y	�4i�ӥr�)uQ�L�6�Wl�zU�DQs���=\��
,�
+����
{����xw�/\����:
	>�ul��G<�>G~���=<��𞍄��r9
��8��	�z1iV�I��E
זƌ���3�SZ�
P���J\ܞ���x"�Y|RԡZ�oS�'���&��>Ij)�{|K	!hQ<��� �0�*������A�-3�^d� h��E����0cJ!M�����aCq�G_N��U�{ʭ�.m#۩m�v����4�B�fFԤYJh,]K���N�i~�ɦ�[���ڴ߮%�'�7؇�� [...]
+ӏ�J!@xU&��K���>zpu�6�͘7�9��o=Fl��c�
�61�]�A�SF���4[˩
�
+���ʪ�n�X�;��恸J�q��ʟp��|����&]ՇȗIz�"���C�G�/�_p�3��
u�
8mx��
8ل���ǚ��y��RH��G�"��^m��Q�lF����Y]g�Tֵ�L�}q��q��:����4��6�Z�G�H�X�#*�qe�_k%xa>�}� g�6ּ���: �:1wv��w
�Ҡ�Mζm�֖Ljn=Lnh�G�;
+��-����Ze��ij�g[���nAYè��>_b9Qe5���^R��s|�^���b;�Gxa��}x��&ּ��+�?�1s ��[ܮhhw���~�{I6W*�֕I�v�FVvǘ:˩��
+zy{-�����ns�[��
+[gD����<G(A�x�sB����<!@x���!��=��������0�
 
Gܽ�������[�f���
5�HU�R��Oa�-�*�-�)�1�������U����uy�J��8�{I(w�����E2�g�,׿��.�/w�l'�	���3r�,��{a`z`�Dl�e��x�����$��!�v$��ɏ(VG
�c
+����A;=g��%�
pd�)^�g�/=vE��'�
�� }�	/}��J�	��z�:�`
�?7�
��8^�`�f
+��T,�||������
(�I*�r�/���+�PNi#��*��&�b3&[iRoC���yة�5�A�[
��S�x�l�8�:8��0wp7z��wa
� u�O`f 0��N��IP8ς�@���2�
��!�< #�y䌀�"�7DH�-�i�����1�����߿JK�ߡ'����}G�w���Ef�rÍ
`��X��`b�u
��� �����dc!#�i�9H�����Њ�V�IW
+IV�䔕J��;eߊ+bop$rO�T��२]��Q;���v��.z�2��,�c�)!��+���}s � @��O�5b,+�<*_8��5e���
+ ���wu콚/�$�'���!�
+�aG�J�
j#m
yH[C��C��/l�A޲�	y�������_!"�[{�e�_D��}d{��
 *P�t
 ' y
`�� ;oQ`뛌��]PQ]y��7}fPPi�
(�
���PP��%G]O,I�EWE#Qlh,A\l(6tQC46K�b�z����.�ݏ�wO�w��p�w���w
<���(v'
܋���H�>������dZ�$�E�,��,�si
�J����g����|XH�CBr<(d��s
r��뀯��hf'07��!�_��R�����:�W��Ɗ����2��B_}�(�VM��*
6U����	M�	�
Me����0?������;�ϋ���gns�e@�@�Ӏs%`�����-T�MP^q��7�W;A�T��(���ĉ�ff>X�x�kU@�c^_�� �c?��\��p/0��Q�z
:��U ��� �e@�+ �n:Ԥn���ZpC��͐7�݀��3��!��/��o)�ca�؉����?�DZ��ڏ��CK���sw�ُM�>��0U�﵀�&��Ѓ�
)yo
�c��������ܤ���Q}�E����.>o9����G윸�����x�~�Q` ���:�ϞWX��x�}�ͼ{�~��⦆��5i`M��󞬉�"��C��FQ�
��l�`��.~ �� �<_���
��@��]�Q
}F�i
+ͦ��Iٴ�6�6*��TL'���;<�wx���Pß-����l
�٦-��/����!�9M�J�%��rh
�S�a�޷
�q�%��Rճdo��6z�'D+7�l9�����/�6B�B��Ih��Z,����=�eB
3�2��X�'(ar9��
��!^����H����3DG�����z��p���t��s<l9
�a��4	��3�F=��@:^���\��'���WmB�� �T����~�mU5n�
��5jmjt�6�����2��� њ��.l�?�%��I$�?�K�Qxj����0
�
�����
�qǰ�
p˰7
�Pk؏�qT���!�ۿ��@�IHT� �ӍLMD{;���m���
^
�hp�g-{��e �;�m�1���j����)�N
q�i).9}�
Nkp�y�:�@��^T�
E��y�lyW*s})��
+鈛��݄�p#�?��(Iё��e=>1�E;w<��;
A��&W�
�E��8�>
U�Q�1�=�H?y,�NxdJ�<��2�u�Q�-R��.�����i������OeE�B��v�W��jz���/�+�/�
x����=�K{+�~�rK
NX���2Z*�L��-��!K��e�l�%]�ϒ%���#/����X
+�|�*
+}�)v�\Ul�Sl�}����M
�bc#�?4esZ
�4����tU���
��\q��/���Q��]�}��IE�cd�����O��Δﰦ)�[+�ZW(7[sU��ͪ����
�#���s�5�����oP�t�U]�*������60�>��k���t&T�� 
��Q
�?w����Q�=F*N�m

%�
4N�)h�"/����_���W�f�Wdkr6h�vج
�o�"�nY�o�̠6AB�m�А�c���̿���B$�Q��~<�)p0�
Ea
�W���
���HiC�x�ڰ��ܰъ��_(�{NV�
��^
���
+]d��L��k�$d�>=�H�(�aAh�a^�S}ZO�#��=�vn��4ݛ��jfWpj/�s'Ϡ?FJ��׀�7�G�bCdr#�H91�������Pf�
��蛤^�'Y��g����i���3l�z�2�	�h���8;��8�������R�}J_�#�6{�܎ ~f������췏��l��:l�v�ژȉ醕1aRVtYFt�b�aʅ������&-j����i�ّ���"�
)+�G�7N��i�q�4%�Cr�c��G	;ғ�=�F���� ��Y���c�P�'p��Fn����XoEF|��
�O� v�"-6Q�͠���hfL�ΈI�M����=ߐ
�e�
��41z��W�
����CR�[c�@a [�5{�砚}>�������)8��	
+|�`BV��
����`)-��,5!Z>���ʔ��U���L��M����
7]?1n�ݗ��bW����q\�>���r�{�c����
;ғm��|/�����#Y.��h=?g�o�ÌX<�5��/�e�����
��
�GAk���!�
�#@� 
A����z at T�Bt]O������Za��]��-3�um���n���~���L����
_�|���?��~���i����扫t�$���))2k���89ǹ0��Ւ�J��T�2k7�gk[=Lڃ�Y�S�L�^�&3iH��$���%Q�S�����{��
K��r�ٻ��>�5��`�:�d�1�U�K��k�R���$iAz�c~��97�⚣[�X��Vu���

����'4i��^�ԛ�4�#u�NpK�	J����?��sY�Ij�����e�C?��1���4�Lӱ��ظP\���!?k�Ԝ�s���r2�\�
V�A�Z���w��mꔌ����5I��^Z�
��Iz�-Y/(�b�k���ی�8���(b��q��1;�¬A�y<��/��
,���Ź9�$�9	RSv�,3��_nvI_^,י*�)�
nZc�:Ѹ�#��M��&�����x��`�D1̧���L����ڿ���bI��c���HQbQ��`
,��-�-�)�,Q�L�R}~�,=?�15/�99��U�W�H�]��������k���=O�yƘT/6
*��5
�a�pݝ�'
��恥�.���8Vr
Vb���k}9%�`*	BfI�H_�P�f���Z�I�W�ɖ�09%[\�K�Euʘ�-n�E{�#
;�E�<]UG��
Q(�"
ed����\�g��S���V�k�z�e���r9�*�a��GF�4�*CD)��⤊E�Ċx������L�ūr��*q�*��/,ۤ�_�[^v�-��,��-��*�TP�[�
+m� ��
t3��� �[k�7ֲ�!%u����NH��@r�Xh���v��或�E�c떈cj����
iDm�lA�
+����sk]C�[�WQ�T�YR3�YsW�Z�א�眧'J�#�o�n���
X� �L�m!�Q�%�#�41M�����pQD�"т�qx�N�hrm,���X!
n�w�ݰ�yf�a���^�
�̨��<c��<cY���<���:z@�-��[����}����,m"[\����mc0���lA�k
E�m!^�ŊBlI�Wm�,[�$�V&�޲�aZ�M:��lJK�,��#Y`�w��m�,`+�"8s�9?B�6����n�f�
(�	d�҃�@�^`n���J�n��,��쁘a����9x�
�i��0u�S�-쳊&�k�������O���/�Ƿ+��g��
��o�s���~��dܛ[�wq
��:hg��X�1� 0�0{��RL>�¤c>���	
�x�c&�;�b|G�:1�S�����Y�Q��1��
#:�����������A�s�9�����|�������

 ҩw
X��=|�}鄓���2�v����
��q��~	�� x�́GO4�=ˠ�5½�
+���P��B��E�E(z�<���(O=��޷��z�]ɸ-��w	"N !���
���t�;��<���
��J��i��7N}���7
��PH��I2$�9��CԿ����p���;�����7�q��BƝI��S������
��
0�"��@�!�tI�e���Ko4pe"
�WX�0��/�#�t�pL���.���#?�o0�5�w1c�b��z��x��;��~����~	�3
�' �M�J��p
�T,�=�/^`Q�|9��Y0�y������\t��$o�>r�|O~|F�!����Dϵg�/P�d�c��E]� c���An�ArKĂܑ���
l�X �� �Y,?`���/�G|��b‡h�E��E>{F)�[6S�Dϣ�
̘.c�	x�6o�>����&��w	-C�}1���<%�ă�=&�Y�E��y<�����N��
�>Cp
�m49q�42�,&�$�� Ud=�LZț�N�r��
����qO�?�/
�
+����z%q��x:�)$�D-�"d�%
d+�A�Pg?u�1��q
+��
�x����k������%w~���A�E?4���t�N"��|G҉�X�y��8�&>y;uvQ�
?� u�R�8�ۃo�>�?��pn�A��+r�7Fx@�q�nT
�\�9�C�41$���[���1�j�l��f�4�h���:�Ӆ/��u������<��;����H��T�}Pem�:�X5�$
�p
1$�$"B<��x-�J=pQ�깞�jkkն�V�c���uW����m;�
뻏��:��3���̛���~��۴�o�7(S�韮W���_'�}Ք%�CC�P>"�QmCT��oB
+~�Z���C�
�j����]�����
����FҊ��6\�l�U�~\�
�_��qQ�
�
�B�Y��OU"��1J����� F* �!�zR}��/��&4��� w�
|���kuW�a\Q�Ɨ����#.hV�s�|�يs�=���1|��
Nw�'#
��k"�uq���
�
b
���
$?��-2�z����p��۸�%W���b7;>��Ź�U8ӽ����z4�Þ�8ٳ'z���^m8�k��:�C�O�`�k�����O�]�"���_�ǘ�٧����1�-������O$.E������&�꟏Q�8�Ñ� EO���g`�
f_�BfO�r��2�lav
��lp��x�ix�m��7�1Fd7�w_A
B>
��'����

]��8\�Q�|L|4h��9�'�6{�6���`���ٮ�f:�S�-ڙL�v.�Y��ݤ]�n�nb�kwr���ܺ!g�5C��V��_>T�-È��G
<&�w銿6��Z�Y=��[|0,��Ga_�p�ҍ�6�	[tyجs0�t%�z��m��u�:vMl�*��[��/�m�[b�J���,ѝ�.�ݒ6�x,m!J�?���
+O��?���$�[F�M|@���380J�]��b�^��q��!ވ��,fM\�2��]
Wʶ�UqK�����i�B}��Y�HҤ_%��o����5�O��W�����̸��񢔐��O��%R�k�L����!jy{�Io$(�'ClH��&���$�%���IfQ��mN�pM���<C��c���6̔6$4�f&,�'��OK�!�O8��3\P�
(�$>�$�2BZ�
+��
�P
��)Ҟ�s�=�n#ڌ2��tŪ�h����1hNMa�f3sR����N���a��C��1,�36
+��K�5����e0��j��*`��
+��G11E٫�` �S�g�����~+�O�fz^��b�)K2��9s�G�1s
Ӑ�����c���
7_k*�ԘҐi��:�A�/�OL_��LoWU�P���Q����*�L��,Ch���>��rp:���>�i��B�z�eE6�l
�r��1�M4侍��>'������d[�P�����JY�Ҫ��2�
��ܤ�W(��6u�y��8�Ɠu��E����^�W�(�6ҜN`g!�XK-	�5?O�Y�=1#?��o�v����`��
��UyvΟ���-R�%(�Z�B�e�“�LU��Q��ݭqZ>�8,�;9,?�
y�™'ʝQxɷT��d�8��Gڳ�����X@~�*P`���ڢQ3a�6=�$��fb+
+rٲWZPėX}�5 +��	.k��a]��[׫m�]���NV�M�_j�UTXE�
�gܤ:�![G������-^��]4�:��u����&���r�D�����i�י�;�����

^��Q%��k�}��j_�
ooU��wj,��\�u��b�����3���^�

��w��Y� �G���r`���C��3��}Q�ye

��1L��ȸ�f����nowKlE~���F�/zGn)\��)\��*ܮ6���,��x�2�Js�� ��KtNR�S��*�4~�$�'���j�+텒�x|�Q䋃�7�q�2�	���t7���畖Kr�!Y�w���]���Q�{;Tiޣ�T�ď��Q�V"�_ <�3:�S
�P��4v�������N���O�~%��npUF�Q9�F����X�Ҙ��l�Ri�r*
��J�$�?I���R���F�*Er�Ve���*�I�X�P�T!*��E9!�{�:��;)��`�Tҝu�i
�/>���aB0�H�������1șld�B�Lf(�5�
\Z��O	N�$�I��2Cp�0��]
<��^P�U� ���T��$
+�Q��S���o��&�7
h"i4�L#�UOs
��:
��{�\?��a0�G!=���p:c
�0��66)�a
�~nL�>���\�yT��Ɵ��3,�
+ʦ0
�'�-Dk�$F��5
O46�5"�eE�
8���H�pj�%�����&*.��TӨ(1�>
+&������y�{������E���
+�9�^��٬Iθ�I���&9]h��Bm���^��]�u
�
KY�+Ǣ�V��w��dX�'���!-'
�Y�0�����0������g
#Y��T����:Ga�f)�r
+�/�lV&�TƜ�Ҙ�Xe\*T�%�R�=PC_7f1�&��y�e
Vr���� ��d�ia���=�����H����>}��BR�8�Ο,�$�}�o�ɽ��X{�
c?&�ؾ�c�~RĬ
�v��yw��R�@�Դ���`5�G�Qk�׋�W�I%
0��PCi4�K��+MA/�@�t
C�c4b
嘆HG�;r�X/us��
�����Rغv)�XH�k�����}/�q
�;�z�8���x���@�M�i3_�pz"©G�3�*�ViDhe
+B*"�r8�*Ǣk�$T͆U����[U}���V�<��B at _.��S
}�YԞ�qp
+5�Qod%0�0o��6 r'��Է�%�\:�+���2�A�v���k
<]S��ʄ�e��Ue]#9K�@U����
�{!�m����y�`<5��X:x�k���7 A�z��>�
��RS0�\$1θل�y�Y��<�n&� �;��|�&�y@�/�a�����r`:}�@����O��=@��@�A at w�:(�����_��h�
ʹ�8C;��2na�oa�i�&o��-\��
���?$O���9_H�g� ��F��W� �
���c��$��9�ϒ����j6@��Wz�BW6���
.�Ao�
������ʢw����^����Kr�����N`���'��N��f���nu�N�_����_�o��JV\Wp(y	��es̘|�A%��zp�v�ccp���>��&�7V
lc<�.=c6��$�z
�=�0��8�����WO]�
Թԩy��$�&ߓ��Bwp_��<�v
�1=H"a�,h�`1���0肉�g�0�P�B �D�D�*N�@�#3I�"����2RN��N�@��I<�7���>F;~�v���[�.�vB���-�ӎx�J���d"���%����"��SB�
ԩ�N
5j�{� �q���|�˿�C�?��N��?D_/����b"���Od
+�fRg>u��
�p6�Q��)����\s;SU�[��wh�W��p��}����+�\�D�� �Z��BӅ9	����H^!����M�?Ө3����m��&�SǎXC
56s�jn�ݸ�X|��8���%�:�U��j-��
�@o���X� �^�z��XH��o2�
L�7�7�Z��3�����X�
Ȧ�
+��󸮥F5*p��hf,Nc<�Gi�a����&
���U�nO�G;���<#pW��
+
.+���m�W��s�)hQ��窏pJ�'T98���Qu�KpH�nu5��uد9��
����:��P�#�"uO�
+�v"©
�A;����*<�
��h���?��p�{ �}���X
�N�!��pkg�I;��,��.V�U��OuEh��u�]����.�)l�����m�
+p�-/ XbEw
�(�K�e
��*\�y�>'���Y@*������o�1�zuAS�;hv�cG�bl
^��;�C�Q�	��T�6`s�Ql
+���n?J�p!���!��
"���'��,��Y��<���
8�}�h�HBm����cj"G�:r<�Q�Q�ʣ>Ħ�
l�Z��D����B�4z�T픊��51n�(�T{G�����U
HOi�c�{��W����T^o}�kd4�h��g7��P���i�h�2�X8
Pbxņ���
iuB�T��#�'�I��b9/a��2a��"a���xF�q�-EN�cEv���:Y��=��k�=ן��@�|��U���߶�^p�Ħ�X��cBI�Xc�զQ�7���4QZe���k�!�0}$-3-����r��P�e*S,1mU,65*�N*$�Pf�)盅"���J��C�ơ�q�s5�����>��}{`�%v��,iȵ��2��j/e[&IK-��Ŗ兖
y�%[�a�)�-%�y�j�ť��e
�y���ޙ{D
�K]
�q�D�pFf`��f�����D�
+5.�K�q-�5z�X��Tk��Ĝ4�mz�5m<96ij4Iۓd� 1��w�=�<��������/�*�&~,�$~#�$����h���������he��3x��9[/ �
��)�I?-�8�7��`�s�l�ِ'<kp
+��
q��J��4u��4�����]R����՟�+
o�z�WryjH"�>
�|�z�e�m�A6�G�#�����ulI�����1kLs�lJF�ɄU&��3-���X,V��U�ZM��I[a�(�w�
c��m<�+1�
Vl�
y�+6��"SH"���?�7�w��g����:x��u�H?6�#��<
M�Xm�E�%��4�X2�E�Z�
+�S,7{�2�
+�ۼZ[b~^*6o�]���B�e�Ka�?�����L�K�^��Z�e��}%�s����4���k�ah�E��I�٦���*�
�t�۲�m�Pj+Kl�b�ͫq���ֵR�u�l�����:��l�sm�/�Ԭ��k�Cz�����u��]˸9��D�q-빮�l-�#Q���W��
+eʔ$�#J�L�HY"8�X���r�]���+~)W�$/U~��Q��)ʅpEy'<[���!
����܃�Y����ż�1t7����|�ۊ��Q��B��Ru&����T��@�
j���:�\�L��5�
�IRԀ�Xݭ�R��Y���Vx��O^��YՐL��ܢߗ�u���J��@�o�/��K�} J�#Pd��c:�9��p��HG�#KP
���X&.q�5َ�,G��jo�2�;u���q.,�q3l��>�����P/�����^����0GO�4l��^\N�G�V�
G�3
+���w>�<�\��$丌X���]9�b�C��J�L�Wcq�Ҧ�6H&g�lt
ҥ�^ե���Ou��o�4gH꣰�+y|'��{������X���[�r

z��TB^i$��1�qO�➉ŞdyRa�X���,�|!�S$.�T�FO�&ͽNkpo�R�
r�����F��I��II��>�KB�^ޠg�S�@-��H �z��������dW
BV�HX+' �;
�<��)XTe��ʆ�U��VU(�eb��NL��,�n���
��{OKqޫ�)��ڸʐ6��'.��S�8\�>����8��4�ʕ�]
�
\��n �
��~
�OF�o
��}�H�Y��S��s	>�����Ź�͚پ����S�X�[�����hb�B��ڟ8�
t������f`���5�
���|?`��
�4Hn���X�<	�S1�?��$��0�o�
.f��0��f��i�������8�Y���c��c�
�1������Q����u@�fύ�C
PD�3I&s[�1�ef��ƌ�hLo��i�q�ڪ�3�fL	(�
(@L�
с<
؈	�=x*�)����`|�W��
�~���K����wQ{s+=��o�^�[��6 �Q1�L�Lj��ۢ0�m,&�M�S�X<���`*�30���`1Fk��Z��ن�;�aX�"��FԎG�=�a��֐��Q��e�۩�B�F�T'������%`�^ v�����>�ۣ0�}
�ڣ1�}�t�'i���;w,Ǡ�F
�؂��
h?���[?�
�
�C����Az
dݛX�'�$��b��_f�1G�
�	D��qrº����+RW,�]	�Lz?�]<X�j�z�bNt��x��|�M��=�|k��[=�tw yG��_ )����h�I�
;
>
�� ��|��d8pa
�D8�vs ��0��C���K77[7E.��
̹��3_�oI��
�}�^��3��v�i=�E�W��G���A� �
�a�:-� �Dr �:���0�������
3�G�_�l�����]�B���G�>Z�{#=�`��7����ԧ�_�_��	D�Q��ԾI�@�!�j����{����r ��a�C�я
 =��aO�p��a���Ȟߓ{��G{]E�
Y�bj���٬5����
{�����#����|D�c��1=�GO>
�g`�|C
�x���/y�=dO
��4��
r��j��b��E �20�*��;���o����!���"\>�'u�g�_���K�H�
���2�������kDT��}
**	��EZ��n��nh���YDQ�A@����B"2��b�M0�1��rRV&N�RV��8ff\*5qܢo~�T�����������{�=缤O~���l
d�!�H����u��'3�en��� ��D���ٍ��^ӉYD���d��d�"�d3�Av����t�S�"�oq?���x�W���?���"�

����~�
�1�
1�t�K����l�F3�`'5ڨq�s�s
��g�#>��mj�
O9z�<&�ȿ�?�eg7�N�
�&��qd�OT�@���E�ꬤF5j8s#5�P��{8g;���V��!}� �i�_2�:���2����G;C
5��ķQĝL%��_AԌ�3�s�Ө�C�Bj��F%5j��H�-������_�'�Q�B/��/�� }� �M�oq�~�$7� �
�/D��Ác�
��9}�r]*|=�c\|
ur�QD�UԨ�F-5>��V���9��w�d4��o鋫��˴��
���wi0Z�"��6�;ٙ0�eG'�\�;�k��B��q�5��J�N&gͣ��p
�y]U�
+��D���h���9��Y��ВS��G|��k
w�ql���C�y�e
����
����o$O�^17�����x�
��Ұ,\p��9�b�u,Ǚ�U85|z�6�S
�9�G��#�qGF^��Qߠ��1�]��
s�h��!ȓ�����x吻|��!�+�ȍ��p�y~���.��
��)�D�pM�1�lt�-C�[	:����jt�mD��6
to��O���$�x�m�
��}��qo�c<��6�WL7OfRߛ� 7�0
L.Ot�%wW􎝆��|�=^��	�����
���}��`��M.�k�:�-S��cJ
�O9��S��y�l�v
M�=D��+4x�B� y�4�����������O3
��:
+]�&��s6L���*���g��sf2�ϴa��R4{b�W��*��U��Y[Q?k�P7�S���+��}]��s_���\��u��S^���}�)����ZO.���;�
��v{{b��s��%�}4h�1��'
>Vl��D�o
j|�P�[�*��B�o��ηUX3��P>�G\=��X6rޏb�|Y,y�P<��\��{-��]�~�t���S��\ `�<Wl�?Mz�a�?��T��ӡ�ψ*?
*�ұ�/�~�j�R�̯B(�oJ�w�E������}bA�]iY�b~�<@����}��6�/G��d��&�8��o;蛦 g��G�B/�*h>*�a�R��J=ʔ�X�LA�Ҏ"e��BY$,W�
˔�b�r����+-]�--YtI��#e?!��,�C�G�߈.1��0�vƲ�1 -Zָ��.�	U�c�6��C}P�U�T:��(P��L��<U��TU �ʄlU����$�U�%[�)=�"-�"-��"5���.�#&���5��
����C�����4Ўʈa(w�ʈ)(��F����5�U둣�G�:Yj�`W�	6M�����4��U�*�h+�"�*,�_�(̑o$s�,Y�!�sG\�{��k3{
���|n�{
��kEG��0j"�^����m������`���� M�.��r��
+1Y�V���%�n����P�G�Q��o(���D��1
r���q�)jw���ge��g#߫���v,vF��qX���L�l� ��C���D�ހd}"�
��Ő-$�
	�r�d���
ۥؘvEL�i�!�B�w�Ȓa7xP�#����} ������v,5�@f�2�Ӑf�ո ��`X�j��#1΄����)�	�q�D��Fԛ�JѦ�
+��G�5]SD���2��X��{���sI,���βoW�Lj9.�]��Þ��7�$L�%a�#!1��p�%�`4kN��l��<!�\*j��b��YҘ�Kj�	E��sE��>y!E��_H�����^����X���<�j���
�#5Y�%�	�`J�c�/bS`H	�����D[��ZӅ(�RAc-"�Ub�u����B�Ǥ��+Rp�R��9����_���P�p��|�	l6�
+�
iG}�dc͝>
+1�c��x����@k[�H��b���[f�B�+��:q��#1��&.��헥��{R���h��2�q��<��3I��+�s��#k��v���x�a�>�Y�=�D��lvBP&-~�����,�"d���%�Ğ�X��VjI �5bԴ�c�1�Z�i�C��vZ3�\��o�1\r�{��y��{����lb�>Kz	�4&�Vq�.�]#�4"!R�hX�0�&>������'����dӀ��~��M}��̽������5G%]3G%>4G%��V��hd���e�T��>`
+ 3��8�E<�gTJ�&;iH��bR�48%LS�h at j����T����6Q}Ҧ+:m��Ҳ����+���3m�),�)t�USh�Sh��d���Ar�Cc#����˰ 
Js��z��2������gکO��zguStV������_ٱ
+ώS��	
+˙�М��SP�E9k�S+��c�͹,�����2L����/���R��X�ݲ|އB���}��0��	����f�8*��]A�
+,
V at a��
��Zƨ�e�|,3�mIU7�"u����e�<-��\�Ga�<�X����|�"i
z˗З�Q�bjP"M�1+�X�
a��F�J�Ե�C]J}�U"ϲ(y�
�{�H����k��r)O�sy��)/�S�f9�
�C�y9�~#ǒ�r*az.nc[
5(�X��hda	�V�>���c�F�g��W�A+%��r�:���!����-;k�l�q�l}Q
�3dcMW���2U�P��
+#[y��L���@��^�R�E7�_W�?7Hq�؃�R�)`+�5�o�
k��Tg/S

��
|�!��adg,���@���PՑX
��uw\
����xº2�����s���/���)k�S
+܍>i��
ޖl�oaHa1��~R=Ci}_�
CP
������o���,^�Ç���<�OXI�-�A�	��Gh�Foz�<�^�Òs�dwT2G��vN�I�8E
�a�g0?�:Ǚg
+�hrM�@-�H���|
-�����/�:'����
��֣��?��<!9�׉���s����������E
�%o���*q|�`�	N3
�����sѼ��&�'����gS���y\��1)�
�OI
����ԾU�C�l'F
h��§p���Ĩ}�j�0,����]��o9-4�^�W
B-�I
�|�r�v�w������뇮;y:\���X�J��gp
�_۪�p��{f遭�=5�����b0�
)�T��@��63��8=��
/�0q�L�Y0r��C9�+l�����n�׿(���O=ҏ�����w�v���Wrnǥ=� �
#`<L�7 2a!�/�c�'�Dc=Pڦ�[uPt�s��3���?��v�V����Fk
��������"`<���g::Ih��;e��EEh���*֯`�M�����b�Fݤ�u��r[׈���>��<ŕ�l�d�l��l����j֟��%��hMFg&����9��G�E�q\#���d������G
�
�(�+t��|�+e���`؛����
�=�vE��Hr��sh�@
���:s��t4���C����j�Q�N�F�i-��
9�c<u�j5�Y#
+
�Էc�b��z���;��#�w!�`��sqQ����D�ʪo�1G'��
�8N
�!�#Z��kuX9�z�Z��{���K�B����A�S���y�[�x݈�:��5ud]hA>�֋]
DN��g
:��C�GaoA:���N
:K�(g�Jm�5���b>��
�i��-m��P՝
U��|�Ǵ��
���U�����l';���c��WC�(
�<D�l��v�vڽ�Z���n��dm�����
�ѡPV�bU;�U��&�wܭu��Z��;�r��r�G*u6���P�S<B�+��������� �'����I��N���U��	��~��2\�\Fk��
�r��
+��Z皠�n�Z�6_+��T�[�J��U�^�b�Z-�8����U�ק�ty�������k�şVۓV
ɵ�׈`������z-wV���6z���k��u���F���X�vQ%ݧh��
-�N��T-�Β�'_>���N�z��M����=�~W��O���2��|�u{�7W� �� � ?w1Ԅ��Z��Y�����?T�}�40VE�q*

�����
zM
�f*7h��+;8WY�E�Y�y!�
�GsC�+-�)%�)��a��_�ڸŵ7�+x(��0fl�#Yi�k�͊P-
��%,@�=#��� ����^���+e�O���iJ�WZx�R#2�
Q���>�����_�
+h- Z�E%�Hy!�@$� 	�$�BТm����������N�!��Z��ҭ�͵
{������3��n�u;�֞vN�Z���!�~��>��Ͻ��`͊�O= �S��&��'�,V��
iw�� �$���uL�s�������0��^5���K>[R��)�G{Z
+6�g�-=��X�a�ڌ
+��pŸQ��
?|�mX��
��
+o�^��:"�Y�D��X��\�f�!��U<ຒ�����X�`�d?���|���lΞ���H�)�E�k�Ӱ:;�9:�rLh�)GCN�9u�����]���Q��-\ʰ�Q�j�IY��̡�T�P/
*IT�80��Tf�?گ>����8�b
팣E�5�yhV-�O�

j����
Q��`e�
�<�y
��[���v���&*�w
��_�4#2��]Y��&��H�4c�O�79��rZM;렂
��Ʊ��	�_3
��9�j���&c�6.�N�
�:�t�p�Q�����æ_/��'EY�QZ�'�
�̆wd%��["�G���+��
���?X�u ;i����&
}6��0�(�
�Ӱ�9
�lT4�
+a+,����ƕ(5�`1��h�(.z^��ɊLC2�iTVh�#��H��Ec�[L��y�B�~'���Z$[��s���8ܦIp�f���
+�b�L�a5e��X���X��0��QR�Bq�*�[`4����(0z�Od:�y���c���/"ɴfI�����J�G�=L+���s�����3���Y&Pa����0�J�R�
si:�K�0��PTf��̊��ʽЗ?]y��X���}"�z\�lo�T����Be��(����me-�r
��A/�{"�z`-���]c,�M���b{,��KQhO������|�+��U�A[Y��J�*WC]���[�:��l�1�p�YU�D��+~����g9��� ۀ}M���.�G}\��fN*Kq�C0TGB_
]�"hj�!�&y5*��P9�P:+��Z�lW3�
�tu�
W�H�=*�gDj�U�O!wIB�
�F���s�/Qw�Z��ǀ'Ɇ5�y���0�(�Ȑ_�{��8���C��A�G�L�	�V��;�V߈�� Vx��2oR�/#�{Z$y� ���H��D�G��qK�U��(���=�C�$	�s[�*�e^
�O�o*2}QH��GZ�"țR�ڔ�M*,o6`Y���UHj�"ѿK�[�'���?�����m$4�CB���$�!�s����;ڹ��'�Z�g��[#cR3���	Hi�@R�
$��bi�,i]�G[Xܪ���		;�u�
�Fl�
�1��1m�an�%�
�¼��"�EB̺1�q�}����~��ux��@��s
`�3]�9 �;�v<���Y�휋G:㱠3�;���ż�
-�������
!2x��Ø�����cf�0k��}6J���s��l���O�\�<�N�DI�d	�%s��"*���\���$�����1#d��SC-�ڊɡ=��}
��c�ӟ��1�K��mc�q��[���g���<؎U�`
�4��
�H�v��f�'`Z�
L���p
&� �4Ba�����{y�����,�0
�`=��z���
+�bc��'.���.��v7u7R�j��<x���d�����L{�}h?�o?�p�l�����
�
���3��`!�3��
����n����pHB������\�}�C~�F
� �3�0��G��y
��
+�����da
C���8�8��M�/�
�#<hFXH�L�0�����o�M�	/���s+���<�^f
�9�ZF��!��0�0�g�~���?lJ�2�Ǜф�m�����(/�Q
p������a�AF����
��{��|�gn��8�N�_��I�fs	g�&�EMN����8�/�%6I�f��
���s� �_e
����K������Y`�9�ϓ�ɗ�[�3�M?j8�b�NS�,돚�Ԝ��q-.#�
�²b���G�w��2�)�
��&���8�o�M�-^|�x~��w���ͺ��I����3��s���G��ԍ���M}�c_�����3�I�B>#%L-[J������pm�c�r�����6��0��%&^��J�����I$�"��|�H���L����8��x˥^ȩ�I 	�@����@ 	� �\*""^��b�2T@�W=j��>gm��t��]�3�6�v[�����N��vݦs����T��|�?D�~���;��K
�N�H�#�H3i#ϑm���%��1|�I�1��G,�C�����y�|G
���3��y~�g_2��)ѐ,�O��"Ưg�F����Cld���b���O��aj��W�L�� ��#��>��[_0���o�6��9�aOƒ	#5	&�$�dP/�:
jT�ι_������72~�w1�N.�~�v�p���:��k��ߤ��0ڍ>$���<x�0z�
��oD2�D|�Z|	
k�F	��5��Z�o`�&|B7���q�ܲ�� W�8�_�U��m��/��-V��
+WțO!��S
�\�Qs2s
fN��KƟ�/~�l�Q@�RfV�_�ǻ���e���}��Ǜ��N؃>��%����q��αRg�r��r��
a�ga�������oj�^ԓ2�4j������Z����}\��
�q�>���)t�vpg���p/�/^�_ğY�op�j�G�7�0������8����=]���O͙x�ԓ3��I�<�87+]J�j��bf�@�F�Rc�n�)����C���\�v
�
V��{�k�4���W��y�?
��C~9��wy�D��)�B�8�%3���/
D����Q���U��^���j���M��
]c:�u�t�=���'�y�e����&���I���-`�S<��m^i���:����?_���
���|px\L��މR윤B��=�Vt�8��ǃN�2t�T�9�%h�]�g}���w6�vc��>��
G����c���h�"���x^�Q��y����1��H���}^���
�Y�:9?�"�� 56�qj66Lub�TZ��GK�B<�kW�)h
Vub�]X1����e��G��;���Kf	?�6��I�:�����E1g
~��
s�7ڧ�mF���eV
+����5�f4�`Up>V�.���X6��!�QҌ%!�X
�5���0�<�_Eu�g��x���G|L�w��
+��d*g
>��
�I��ǚl���)X>�#��"B���T�GP����\,�S�Es�a�jTϭC��FT�mCyT�G
@Y�̋ �Q�o�
+O��}�����؂
ձ�!�|�u�
iKd�煕Q~X=u1���cQl2�jP
kDe�
qN̏�,�
��Q��⟠H�n�
(��D��
+�•�
�>��.S�L�
�>{H�h��%��kS'�F�$
$���Ơ\*C�4�	z�$d�(�OB܉�(L\�|�2�d�p�:��F��8�7`O�9I�a�0��x��'29g��I���i�gk譞>�'�B>e�`���H!�[��B��IF��lp&9�H*F^r%��K����)�)w"KyU�Ȣ��(S���`����n�:ظv`�`볎>V�G-}�+Ǣ$�
�t(#�R����#O�
+�J�
�٪\�Rݰ��#+���F���¤�QsD��yUd�� _Ad�� ��s����6x�����:�ْ�>�����(�}�T"O

+�:��X5)�h�ĄLm6����KaL�A�n�6�tۑ�?
���Hc�N�A�F?�V'�.�����w��/����Z�����d=���F�. V}0,�9�ԋa�+`ԧ!Ð��
+}����Bk\�q=�L�H5
��|Q�4@�A�4	"� F��'��Aj?�xK1�#�M
Q��2�����g��L�d�L3�a���

�Y�t�
+Z��L
ԙyH�!�RU�2�d�"9k����^���>d�{|~y�0���B�c�{?�wp$�(�^ �J��5�ř��i���� h�!Pۢ�f�"Ֆ
U��lR��H�qC�Sy�R���H�o�Ծ��s�G�Bl�$v��a�3�#�{/u�+9�Tq/𹼜��<����\z1:EP�yC����YH΋D�#

+�
rGd�
$:m�:�!q�A�E�k-b]
����g��|A
#�% �9�i�?��wQ{�"��>�9*V�K!G���%�=
�B$��A���

�;��y�� ��@TQ	��`NQ#"�7#�xŠO!��m�9B�
!�H@���+9�~/�;9�_
+4��s]�QQXW
�e�u eߑE�=�-����f Q�(̸ �`T
0q�8Q�U
bզ�A�lVMM�`L�6
{b�CRc4�h�������o���w��{
xm�c�b-��fJ�M
�`�P��W��`Ř��Ք�hSE�(�4\������l�dZ��R��[��_����yE�`��o�جloCk�i�Y�Χ6B��}�3�U�XO�|)�uF�(<�K�9]����$*0��r��?w��rS�%/C�y���{I�y�dȫ�W�{�̻$C�2�0M�icv�E�F����C	� ��������]o�Ǻ����*_���c��%N�Ӑ$O��,�L�[��f)��e�\,{�d����39�oɥ�.�����߸H�\�y`[���t� C��H�H okG�[��j�V'k�\��r�v����:Z��u�
�$��M�ℵ�D�
���\���C��-i�
�`�|91��]%�^&*����YH�h�r���U6/�֙

4>6����V��v��
+�dά<Ȇ3D��$��ͭl��J��a�b��WS�2��m�zAWڄ�f�_��0'��xn����i�]�'�
�)�vba'��l�uPC!d��|�R��[Y���p����
�1�5��6��v)��4�0���wI
w���v ��j�Q�:jXG

��.@�Z.�Z�}-����K��b�����na�14���,��tt���N_tb������\�K���K��3�4@
o�/u��a���h�j�!j�6p��EN�c��$\bq�'-%��r?�=	��k�g�Y,zA����&Z������@��q��.�I����X��4i�Á=9] l�i��x��3�o�'3���#MF{���-� ~FK.�w�uN �Đ��v>Q�@$M1p2 u��1(}��\�����4�׸�7qț|�m‘��3�}�l�d�� �I�ƿ�>_{
�
[4�Ү�)���y�W�P(]���%|
��[��6��]?�>��F���C��#�c6�1��q��F�./�l� ~
�`0��)`�
(�b��J��zآ���~d�|����i�s���Y�;}�/���\��p�e�d��Z�
���AwH�0���Ŵ��}��k1�˰_�}�������-��
�:��5���5�u�]�|g��u
N� �����|�OC���x���̹7T�}
�c�
��ضa{�.0��.�S���0��I�
����v͏�C8	�Zנ������"�ZI�J��a/`߈����"ih�~1���/Ƕ
�����\M��?�
�Ч<~���b*-��a8�k�7刦��NƠ��A�Bc")��}�gc� �f�cߪ���^��N�������*�ȎSD�2����P�-�T+�nK�K���_�������ϡ1�L���4ʓI�g
�#?��EhX�����
rc�;Y�v��O^��}�5��1%�;J�U���<�f
�ȋc��Q���?=�IBg~�E#�ih���4�S�N1�ehTh���oֱ�5���HUD���R�n�|O��FI���7�c]O�;�99(o4�ыկٓ���p�>�h���i�#:���cFg1v��՜\;���
ke��ҧ.���]�:6k	�8�q�W:Dy��{�+�e� ��Pvw9��]��
�Ƨ�im��Z�q��
G��i�V9�h�s�V8��s��\
+��e�J]�*�T��N���u���A�2�_T��=z6k�\F�����X�ᷔ��a�w��͆����SUn�Z�
�
=�̣����U�9R%���3E���i��I�
�
�*4,�\�J�hX�|���~C9>�5��f��Sv��Vf�s������p��N����_Fъp��uQ��������7N
:���s���<�y]Fin��*�KU��t��ei�_�f���,�e�
+X���m2�Wz�J:��w4#������^o�c��Z�ן��཭���R�$��x�(0 at s����]��}5'd�f�
Ӭ���
MVF�TCӕ
6[3�
+5=|���W���F�jJ�Q�F~��Q�59����6>���h
@
h;��3�bʹvK��|�� �]9�ʎ
UVd�2���1��fF
֌��=Vi�)�=MS�f)�k�Rb�5)�\c7+9�Z��h|�����qݚy�����}�;����`s�آ��#;�E�Xo��jz\���kj|M�V��*%~�&u���nS5��Q�r5.a��t_���7�W=�hTb�F&6jd�ѳ����m
�/��
u���T@T at S���2�
0
�]`H�䲨1�
`y� ^�K$�Zf*h�Y�)=�Zֶɶ�v�:��k%�ִܓ����������?>����y��}��}��˚���ƎL�
��}%q4�bb\9\�0�
�-�_E��U
����G$+7ª��\eGڔY��Q5ʌ��5�E���J��Tjl�,����5����?N����ܛE
r��a
#NJ
�+��	q��-z�
+��)?z�r������X͎1*#&U��,��*-ήԸjY��
�R)��JNإ���2%�Șx~��)S� '��F�N��m���[�q8���8�G��E9�^�2LT�a���J3D)Ր KB��	�JI,Pr�\%ͪ�iV���'4˸Q���2�ː��.���;�� ��?�^���b���9�1�1�A��a�a�V٦�0�Q��G����%#�d��ɔ$cR�f%�*1�D	ɏȐR���fř��E[*��|	w��)�<@75؇�
����~
��gא�2jSH�d����d�8�̓d4*�<S	�,�oIU\j�bS��6_�i��ި��u
+�nW���fZ�Vh�<��))}�#�`/�ߎ��2z��3��2�G)�)�NVb5Y]�`�R�u���͘���(Eg$(*3E���Y���e�9�F�Y�5#k�B��Qp��
+�>���<o)8��O
(�^`���y�R��̳�1��μ�gyĘJ�
�#���
oE�LQxN��r�437N3r�4=Ϫ��|��SP~���55�U���K�+8�)s>�yS~�N�C@�S�K��o���ޖt/��*z�XlȤ,bI&�X�P�,��cR4Q�E
+*����(M+N���T���V�)�
+M�-Ճ%�4��CJ�ɧ䔼K>�yC�6�&35‹���JzY��Q΅Zz-����X҉oya�+�>J�
�+
�)��5�
�I�0=h��D{�&�3�SV$��_V�q�Ojly����ʳ��<��˳�:8�e�
��,�\��~Zʹ�4\�S����H�l�2�y
1�����!�P�&�JO���ոJ?��
�HyU%ʳ*Uc���Qe�{�"��n�[�F�V�KիU��F.�w�Z����V�mh�Ƞ�F΅ǩ����zr at L���I�����1Z�(7�T�:B���(G�F�e遺
����:
;л��X�_�m�Qg?��ߎ�����I�~%g#��=R��b����|J��
c��ʥ�UÛйM�����\��\<�l�F
+�H�-4���9xp�!̖�bhpj+�ވ�V���Jx���m�
H25��?��F���5
�m
[m
�m�����%��E��%��fn��WS��,b5:��.�_B�冴��O;�o-�W��e�9�7�6q&m��OI�0|�3.O�
�o�v�
0�na�`��� .��6t�#|NA��������s4�5�{��|��w9>k�1��>$mI���g�iໝ�S�Q;�v���M
��G'��$]���0�P���`�C@�uQ�N
w
�����+

+}��|7���[ً���O
+�FwJ�]��#y�‘���PR
���������a�#>
eԥ�8�
��t����4v7����1�q�z
��j��iW|?�<g>-/҃�
+܏�W�O�
��1xN��A^�S�I�AN�$'g����R��,�Y��
���h��m���y���׵�u/`ͅ�3�5�
b
���%��Ұ��>�Z����
҅�\��Opn��!���p�8>c���"5�ec���,�ý�K��K�f+�ų�`�����ߐ������o���O�!|����
z�-�Kp��\uC�ѫ��
�7Rn�Wos�ܦ��Hv���;��;�
������PeP
h�fh��(�M����EyEև������b�7:󺮢g�����Kp>���5�HCax�$�q`�\,<���u}��[���rl��w�q�8�%�����̾F
^F)^Bg~I� A��gX�>�?�Y�u
��!�y�aM���Z�����
��`{!��`{9��)E
����h̏Q����h�;�:��.�i�o�f��p^��'Ѻ�7/}���J3�G�����~1�`�9U�~
YK
m�@k6Ӣ?�ڵzGOѺ��ѩ�l�S��$�8A�Q�n<
��r_
w�_pY�X�;�|�r�"𓈏4���-��"el�
+ֱ���c�	��X�:
V;�؎��t����^��
*ׅ����5��
h����
9���$���
�	V,�a߆};�plՐ�Z|��	�-�]�����ɳ|k������yF�;l�ݘ؀���m����@��a
n_�L �b � ��-��M�&k��k�^�5�SWU�v��6Ҥj�Ti�ViӤ�ݴn��U�NC�����}�>�}��}.Wy����%z�"Y/��_{�O�b>
+ۻ��3>wi���J>EO
OUE79��𓣛
}��!\��+�q�~��F�6��e�������;K
�0������"�W���ҽ����M�y���ޑ��`���H�R���sxx/Yڱ�8]����c�~9��X�ze

Tt����OҢ���Q�B|�������c��29w��
x�z�����8�-��R�L��Sγ�hqy��i'Ooi=�l�f�f1����s��
����c�`4�!F�?�јop4V��c�:��W�y,=��|��`oŔ>1
���D�`1*��u���`6Ǝ��jL�z��a"Ώ�n
��h�F�0�pC	L��Ò{��_����CI"����%�M��{�M���l���b�dK� ��II�%�LTc,Q�cI%�:0,�APڀ!i
�H;0 �E�l�dcds�I^Ew�Ut����m�DG����{+�3����
w��L��YfV
�3�7C;���1"�#���#)
��/ՆC����Гք�6t�w�`z?:�G�Ϙ��2�іy�Yw��z
^�ω?�9�B���
x��6`���u��Kl�fi�q�'�
��L)��
�(��R�‚@v9��N�g�Ѧ�U�G��ޜ!4�L���E4�?��-x�o���	�s�@���Ïy����<����m��6���6(dᜡgm�G�J��*�*%��������V�@n
�rјۊ��.���>
u��Q��D��\���,���
Nݿ��{x�m����t
�M���c[:�o���C
�x�hd�j2q@�F�V��
��
�Z'�
+ܨ-�Z�K�g�1TΡR��av�+(7~@�����N<�_&�-7p�%~�X��	�R� u
d��
�h,L�G��z}j�T�p�p
�2Ԣ�؄
+c;
E즣(3�@�y6�uX-/���>��K�%�"�Y�����=r�`�w���
�p�s���:���T
�:��&9�&*M�p�
a7�Qn.C�ŅRKl�m����$��iX�ga�]�������GQ��"��}op
�K�
c�m�*q�-�$�
RG7u�2V<�U�5
�
��
�Y��f��j-B�͆b[,�n�K}0�u��l��
���ۯ@g��Ǐ�u���W�9D�($^#�
/c������H0�u���G'}�c��1f����I(���خ�ٞ�݀"G	�
��W4��2 ]� 
+�&��ZB���w��|j�'���,r����<G��������^��q��q���i��j诲�H��9�08��w�Q��A�2��Umu5򫛐W�GnMԵǡ�=���
P�}�u����W>�P֊�&�E��&�.w��m�
��
l��i�&��I�X9���㡭�BS����
�5�u�v۠�T!���ӆ�^(F��p
+��Ho����"��!R�䳈�=�%��.p$[;��x���u��w��I�������E덂�99�r(���ݬ�«C�ׂL�
��:��|H�u!�7
y�I$�lB�r
Җ�Hl�I-_�Y�̷�۴���?7�7��s,� ����i��jڥ�Z
�Qn 
Y�8���H��!ů�ܟ�d�2��pA�ф�� ;!	� !����3�
����O��q
�F�_|�g��|���
Af�Y��㼓#��VA}�FK=J�}�	io{eD$�
+	B�
�
+�
+
D
��!L`���0���!J���{��e7�#b�
ɽ6ɼ0�X�a,L�|�q��zJ�]
PSSm$;���8D'!b8��
+��-,F�I>�

d0�� �1�y7ȹf����{��5�"�I
q�
[�\9	���N�����98��<j���%"j:��Ùn������}H�WdBLl!p���!C���m�8�݉]^|v�c�w��G�x����K�zb�����%\D	��~�" '$D߱	,��[L"8[.�	[d�_d�]d�]�-�
t�B���F�d� {�����,J�&�Dl�a,.s�IJZeN�HڶΜ�Al�\�D
+!�{����\�	T���/�
�"�
;�
��
�&� 
+
+AW���F�&�%I�Ab�q\�
����ZkԘ�U��$�K�xHjcb��X�N�Ԧ9�{��,�޷|�{�������


+# 9Y�e�����4Pl
���X��&p
�?(�^�{1�O`b#=iuH�h�2ë�ϵ�+&n9̠���H<6�&�&t4��
-
F-4�fP3�h&�M4�����u���b�C���ɗ:Kf
<�pd4K�Ͱ	�͒�V��6�~
+0������r����C}�eHn
�
N�s���B:@<@A�_Ơ��}G�{|�|�>�|���_%~
�/
.�)
._��\Z�!�,8
]�u'0���B (5
w�N��
�FO3��朜�>��d�P�g���<��Y
�]��qp���
8����{��N��
�!d�†�Թ�^Z��>\Ҥ���}j�Ct����r�t��\�\�ȯ�k������K����8D�??8{=�<��<����w��rx\��O�
��&5�y�� v����h�}���q�����-�
t=��!��� P
F�j0��ؔ��f�/���T�d���V�
[�=��v
�]�������K�u�_}��K�7�펝ץc��+� XA��S
����Z�Q
vg�+t�B����-��l�7�?c�k�n���c��g�����X����>Nth��o���+|�������+{n�*	��^�k踂�?��t\B�{l��u�m���29�wt�t��"w�7�1p
�����y�����G\Vx��塿ۏa�
+��]��x:�
�k	%�
�^��i op���tDoq�>!;�p�
(cv;���i��	�w��|��-�8�8,����~>^���rlWa���د�����@�Z�=ZA�X�f8Z��_m&:-D���`�k�wp~
>s������
�z�K?�"�'f)X��~�v�c��N^��F[4E��т�&tl�2����!'���*,4�2�"�^��q�6�Q{�r��ר���_\1�a�#b��P
G
cᨆc2��p���Ӝ���
�.E����(>���;�����F��v��f��|��¤��n��
���3�a#<�H�#�8��
�
+-F�"t<C},�\=�;�:�':�4��:�����S��p�Wh��������Ͼ�8��ֲm��;Vʛj�g�?&xlx���\�G�\t<�Q�T�S�Y��
^M�ӈ�T�5��M�!��m*�Sպ|��.�G�H;=�_:
����)DZ�H�������
�>��)��r�k�K��w�մ���Z�)�e��Z���T�m�j�����KU�}�*{lVEσ��F�]W��=�x���
���2���u�ndy>�у�����n����Oun�5�W�&��h�{�j�3T힫q
CU�1Bc=�U�9^�=����	�y.R��J�x�h���~K��m*�
*�qt<O3~
6�+W<Xma�`Z̕7/����L��Z/o��
�*o��z�j�w�ʽ���w��|�ԧP%>��S��>T�g���Y�B�*�ݨ|�V
�{Sy�+�����0w^����s�6�|���;��:rT�
+?O���j�_�J�#5�ߤb�*ꛪa}sT�w��+?�\C���o�������50h���v++��2��*3䞲B
��#����u
��
j��v��}��L��$7���T
��A*
2� (F����588C�B)7�P9!���_���)�
��t�2�1����RJ�q%�ڕ
���P
+x
�w�ۜC
�^_ ������
��IqD7��g�� C�"���De��(#<[���J��Ԉ
+�DNRR�l٣���Z�w�}L֘K�p(щCp��`�<�9���k6��d>��F�B��r�<�
�̨~J�2(-*F)Q�J��+):C�����
׀�r%���j���"�ǭ�ٴ]&��gzWq��2�
���}���6��1�d�Z�ʧyo":*�1
CБ�T������Cd3F*�'k\���T%��b.T��L��j���e�<�XK�b�*:ᨢ�����::��P+�������֣yé�Ԡ�

E�� r�f�.��S�_%Xe���l��)!Aq	Ɋ�f�h-Plb���)j��
�@��۶�`?�P���-^;�m�&�-�¸������z��8Z��2>�΁�kJJ%�<d��(� �-T1�(E�͊�������<�'�PX�XR�*4e�BRW(8u��R)0��ং�
�׉����ˣ苌�X���CK:J�7�8eS#vbbJwSt��"S��������v� Ey�a��f��]NE�1j��'�
KXuw=pD]P��h@���<�� [...]
+ˢs��h�o]!��l�0=r-,������R�e�����"�w���E9͊t&�d]���p�(��2dp�➮`w������"?�A��Ip]~�/�O�N�)�7��8OZ�5�,E�`�l"�$�\Fy�^3��$2O���d�5��T�'F��Dzz(���=, �g��B����5=�:����to9tq9�s�o���\�Y��{�\�W��m��!TWj����e(
U@!���C������r�x9��l�^��E�^^��Ǜ��MC75�"�k�C�OM�w%�U-a
�x����Ԁg#+���ޝ��H&r
���Q��ex�2��D��R��*��� �R�R>|�
`jK0��~�a||��}�X�z�f
��X��d/�,`0��o��JfJ�j��_5�����	����	�T��E��
+�WQ�%+ at 3��T.¤Vބ�;@_K�ڕ|VK���H�	���F�7�D`a��Lr��_hvȣ�<ȣ�<i���F�F6�w������h
�e
�s-��*
�*���1��2eX�I��3b3 I��s�m2<h~~�泙Ư�<Zȣ��pk{SFS�]��͖���5����e��ģ����*�Ro\9M�G-��mR��R�
�3���p�|�a����kG �A:@C|}��G�hcN��p[�E+�J���s������3�bƖ
��1�<OWb��
z����x

�o>���Q�"@�z�
cn^��N�VN�����$��)�I&��O���/\�T	�yp��ײ���
~
��
��h��
+x
�Nw�
8
^o�7h�:9Ϛ��Q�L3xm\� ��|�p�Z��+��>V�
4�X�9�np��
9�����
+�� �%p��b]7������9��E�|�F�k�.��=tq��ߣp_���	 ~ @�z�! 8�d�
+�%8�b&q�O����,���	�7�G���;��[�s}���F7�}
�#8� �>��oD�X�
�׏x�o��b����E�.!�}F
���'��W\�G��8�?#���}
+y
7{�//�x���8x����B�/��?���x��x��d!�]ʥ?��8
+��J
�q�q`��2ϓ�9�cʚ�v鷈�uX���i�<��^�^G����
~_�[��'22�8}@-��1/i��� ��z�]@�"b�#v9�1��:�:f�)d�̲�%�8
�)=�`��A��}`7x�#vL*%����x[f���E�A�>���N�lb��=��Ӊ�e��2��į�~�xV�a��v�];a�A-����63ڧam��F�n�f����:��i�y�Z
�G����1��c�W6�����!~>�g��b��E,C�
������%�F��3��QV
��
Xn��8ױ�wl=���>t�
��3�m�I����B�6�wh=�X�)p��1�b8�{�V�
��e5�����YЕ(�އq#�%��Y�/��>�`�ݍ.��F�(��$��
�p<
+G
+
68
��jȣZӴ�<�G��	���UJ�\	#��J��7�a�́{6h�^b{?�v�[�!�{8v������
+!J$�����D�
�@�2
�-D�ʂ�	�x�P���W���`��k�, at 9��G
�Y?�[�ԟ��0G�^��m���8r�К��.5~a��_\���0�A�
��O:�YT�	W*�N���.g���d
�m�$�VM�{Mn�+rޓ+����}�GXo|/������D�A]�U
�9fy�;kf��T�W���5-h�r�,�lSN�C��ݚ�;d�\�%��X�
��mh�#��aǕ~I�w���w��[��~
�8����:Z�ڲ��E�7*H��Fy�b�����=41��\���	�T�3f(�8NY�ɲGNWfd�2"+�
Y���&YM��j:.��,�/��>R�+�ц��hkk����nт�ҖQ�|�k�9T�(�ƛ�m�,S/�M���y�2̣d3[�n������\�F)%f��ĬШ���W#�^��w�h�

����8��ӂ�%m�h���Y��
y>��̠NSi���kTF��.���+�_���l#�
0
3� ΰ�l
+(0.�D4D�wq�;hc��9�&٬i�&VLlk��XS�i�&=i��Zcܲ��U�t��
��
�=�����}����kPq�QE!�
��0ԩ��,��+7l�F��SNx����1W�UJ3nU��K)��rF�7�r+%�.^��nr���n-d
��<Ffx<Bj��B'e1R�i�
+�A�7�)��
�M٦$e�Ҕi���QJ�,Sj�K)���~T�r%�7+)�)%��Dv�i%X���_J����"uw�w��&|m
#�2,�
�E�f�J�
�J�Q`�U�9@��a�0�f�(՜����1YrX
+4�R��؉J����ڨ�2��6�f�#k�+��;���+��˳[6����~v#��R���Gy����84R�^s�+�6T)�`9�aJ�F+�jS�-Yv[���_���dK��5�^��%��o�9�IE'��Ȥ��eE%}��$7�è���l�
+l�`��|n�K-<&�Fehek��V
���h��
�x�Iq�X��&�(6)G��"�$WȜ�����T$������N�;_T�����;�p�e���Nrn{ =N@�`!cp\��1��;�Y�d���T�9��0��P��,�3^�N��R��R(S�XE�NVxZ���(4}���?!C�g�	.ʐq�w�>����߂Y?=N���#�_<&0��ҧz����s�+&�OQA���1#RV�g&),3]�Y�
+�*հ�I2d�Pp�<�(0�C9��?�(8/���<39����A�M��֪��l�Ti&�Sy?����;�pM�gq�$*��r�kPHn����Ȑ����P`~���˿�̖�qHA�>+��#�C
*�B�
ܼg������9���G0���s%\*��(��E��Y�X�'bt��T���P%�b���_q�����q�-��OI��,W����Wҍ�1	%���g���حN�ՠ�:iV�4��x�
���i�|��U<}��/!㤀�A�+
Р2�|ˌ�)�h`y�����r�\�r�Y�X
+0�嘵r�CƠ�S�W��.j�B�����豉��4��/Ɩd�%���ӛ B�M�������
+��0wE�=�\
�.�BD.���"��c
'1!Mdb���6��1�;��-s8��K�pG`O+y
�
ɇK*�����a�@ȡ3$�x��
�\�
�\�5\t5\@5� ��!`u+�-M�_M;��"88Lu�m6{�������&P��
�\�����	�U
����jb�ib�h�[6ҋ�P� ���@/�D��G=������l�����y�C�2�����D��-�\X�:���`
+���X������X� �
G}��
��3�5ã9
p�5��X�ᲈ�XĢ.$��ml|��|��<���[\
+nm ��5��ʡ]�ֱ@!H]/Y�
��@�
&����
+�Vx�ҏVx�£���%����R�Z��q.|�j&�UL�+q4+�ZO�X�9Hf�F$�|�6K[� � ��w+�(����݋�����
�
<�����
d۹x���vzю��(���8�r�96����5�]@�:r��;zgA���K2>A�������b{����婋�t��}
����A=
�=
�=��u�h�
�$߽���V3u�"o%9Kɓ���FbvI9V���� ���#�=� u̐�ǜ�c at E�?e�
b(�E���a.�^z��
��C�U�>_��Z�>�QA�\�%!��Կ_p���5��5AG���y�1�~	���[�/�	
g����?�>�q��&8Ǣ�%�Yzq����]��9@��"g �5�7��<Ǽ�=f�
/΀w�9�Q|P���5�X������r���*���
��.�S�
�8��y����P

 ��q����
��-��M\�׸��p@�E~��
_�).�:
x�~B�>�G����"Q���U�mp�����A0�ҷ���x̯5��c�=��U����
�K��+<.�$���;�?�1?R�>@��k?���e�������x�
+^�?
ni 5�3|�5��ezqA#�_L�
+�^.��{�8
�3��w𗿂���8�#=�C=��:�n$�2�
��y
�?t�,���Y��?8��Vr�����E�r�?�أ��8�
G��:�rX���D���^��]M���2m���~��A�馲.�=
��ݠ���&�救GZ���q�+��YȑL�LV���8��D�D��RK�������X�%�_�"6�c�v�v'���i�P�6Դ��
� l _����+u��:�~��G-rE�.9
�Ϣ�B��1į �D�W��c���
Ğ�2� ���Y�N���y:
�߰Z_j%yWx�=�19��v�-����{�E'{�Cf�$��I�l��q��1���	�B�jrԑ��d�kL����7���6�`0`n&&`CbH '@B(�HB���[Fi.�K���@�%Y�e	(m�fi�6AZ�N]5mӺ}��m�6MӦM۪}ؤj�ڥ�4�G.S�	=z�?��y�9�9��『�w
f��
�8�����$7e�l�{�W��('ߡܿ�$x�q���Ö����8���	��1Ua�#��f<ߦg��3�q ;�������cX5�#Df��=�
��	��M��S��w)��h5�����졅p�$v1�i�L.x
+8K)gY�B�D�i���m��`���
��$���]v��>N�K<��n���'���2LY�%u	)tY��='�e��*�����\v/�<e�'O��7sKZ�ꄧK�{�lY��s���[Ȩv2���o�V�R�Z��
�˥���_��^�mOa�
�h������4���
��rx�܎\���j��Kmq�j�֦�iE㏪9ႚ��!����Ր� �
�
x��ږ����Y>�q~J�����	�M5�+ɢmI�ښ�Q{r�ڒ˵9%�M)aES՜USj�6���1m�"��Z�~D�
��XR(�j
?R��/�1~
+b����:m�:r�"8��+GS ����I�ږ��V�QQ�U��6��`(V��B�Z�7֫޸Qu�6�Mݪ5�R�i��3)�yNU�
+��V��UX>T��3S �����KH������'�bCط��E��ȓ&K�"�L�3�Tg�U�\�Z�_5���ZjUm�(h���ک��_��Q�gͪ,��m�Ub{S�����g;>S�#�{Lo��
&����Yg����{���(�C$;I!�Qk�,��ek�ͭ*[�*m媰W��^�2G�J
[���SI����3�9O� Q��sWޜ��������w�
�6�	�%��3���3�Icu�KZ~vl�F9�{��IW�3S�N�ʜ.���*��8'�"WH>�涩 �G�y���v?�<�U�<w�������+���\ޘr=1��Ht
ދ̳�[�p �3��h�
]H�Vr��|
!�)�*v[�sg���E��T��Y+�7"�w����*PN������(�"{�m�|�+��[֏e��� ��u
�
̲'����4�Gx���:�q�j2�#�%	�f(��,O�]y���-,���T._P9�z9�Z�(�i�JƕUrT֒K��_����L�_�\�O��
�g���|\
�e��-�#����m�'J�֓#�Ħ��䗥)�oR��*��)��+{i�l�3�4,kY营�_��}2Ú�2V�*C�ʨ�%�G|G�U��9�8�1�x�Y����:؁�fT���[�s
�Z�O��;�$G� [�YY���<Y>��ʬ����Q�5�`�
�Q�)-����[J��&���R��Vj0������vƟ^�Dw��;�X҃][�K>	�'������d�MSf�I��,kr@�
��ʨ�Vz(��P�RB=J
+)1<����G�C��
F%��-Ÿ*.����E8O#��wr'E�Xw3�n�y~i��jl���q0:�R��ި���F��
�()R��H��#��k�����/�� -�� �	�+`ތ���Y���tdw�������S<o�/u�(@||��Eܬ�Ÿ)Y)Q��4�(�%J!�r��$n�b%�Q�
� �ME��PԂZiF56� �c�
�yx�&F�)F��~�o���]̞���/
be�
�K�LR|'
m�	dI
4�^Ť��� �:0���'��)�~�M��v�[;~h���^r�c�6;A>N�����0��u�R�;���Hfb��M	���~f�/��w�
��_�ዾ�K�����ax���
���
e����"�'q�
!�a$
�|�:�x
�qb�M���G�#���a���{i�{�s��p�� �m�x
�A��Y�2`��͐���ѐb:
�	�}�0q8�k�]��A�(�n��bL4�n"�L���vLa�vL"�&i0��b�K4A<&��?åC)�{������1���ǎJ���w��
ցJ���9�>������c
;�c�ܘ������ɋ9.�
�?7Fҳ���B���_H�������x|
+�:;_ ���U�:G ;0�������\|��H��v,b�b
��,R�(2
$�y
{��8G^��~��;��?��o��س�Ei㗩���W��H*�_��%p
p
��Ǎ' 67��%�X�,�e
+�2�X&��8�ҫ��>_{���Ŵn���a�"�r܄���*�_��a�
�|n]������M�>�g�V�c�B~�P�W��
+I��ʊt�����9c/g�g�TW6\�ۏ�_ݛ�¸� �o�o=^I/�G��!�R6��\�{t��
Ɵ�6�%inmzK����4I�IKK�EZ.��E���\�1AA�Ƞ� �
�� ás��)�`�e2�q2&��s��ӝ�Y�iO����s~�/��<�������Yz�,��G���G��>ۇ��;�h
+{mf�5�*c?����,k�
���s�
5�����1#�ꋚ�
�b԰��> ���_�8?�@}^�Gn�x7��u6v�̀��/b at 2�(CAw6�ڦ�q-gҿ����������u7�g���8�?R<7�{�{B�G�e�E�R?.�������j���K��?�w�v�T����=:�u�ч踂��8��9,�C�%t���z
gz��@�{�཮kz
_����>���/�߈�M��_�p�귪һ�ܷt���ɜGG�8���qy�qa��6��W�qR���6��K��'H��z��
��0�v�]_�p|ܟ>��ݛ�����,�:��:���)��t
G�s��c8��8�#����8��Z��ܬ}�d/
��_�R@��m
!B��� #�_�y
\�����b�3�e�'�"֯�M�z���G<����S�q�������?_;���Wh���
���
+9�1��
%c��يP9��`-�	���ђ�o�c-��^,p9�=�R	���B�N<��Q�?��[92���t��d�n=L<��A��ȑ�]�Xe����\�h��E������x8z��'��m�H�2�G>
e��k=:
B��t5��J�R���=pt±�n����ѽ(\��S�ݰt�*�O��.r�����?��b�̘�C"�f��'���Q��~��m���m���I�G<�4�����v������PAo��� �ɠ�y�#�y�����n��s�mE��o
+����
�8�����,��� OU�B$�����P���]����*��,�����Od�_ 2��\�G�{?v�����X�-��s^tS�sd�+�\x
+�)��c�:����h�������_�P��
+~����/k$?�f�O��yF��>Oq�m��r��Ѻ�
!.s�Sc��>;\��䱧"���p᪇���pMd�pt�v����Z��f��^��w at d G�\��ȝ�� ���
+�-a4��u�AL&c�jHָA��9�ʂ�͞���*
P}LHu�ª
4Z5�����9���_'����`�K�0\RE�-U$Fp�+mw�����_�ղ����q���lI��&&c�qjHNQ8��:C�j�U���`b��+4$�JUI�
+$5ȗ4V���H�%o����U�q���O��xB��wU`��BSDE� �O��ƮG�� �m%�
#P1i����(��bP�ɨ!F��t��9�4y4�T*��R�j�����ܤbs�
+�
*H�W��5r[�)��\�ʱ\��zD�
���$#F���#ϯ�w泥��8�!7#kȍߚ�
+�Y��J-*���R�BK�
+�U�X�)�:Jn[�rm3�/T�}����R�c�����xG�i�3-»�����[���1n�Ō�s����JnFS'���R����*�U`��cO�۞�<{�r
%r9|�I
);�AY�㕙>MNg�ҝ+���*{�^�2^�5�M�l���
�����k����H��=S�l-~�@�
�F�����y2���4+�iS�ө̌\P���
+93�*=+�4L�={�l�]��< K�7���#��L�_�O�̔ z��vx75R�x�eXՅ|���v���ꤖz
P#����6(�e�3Ǣ��49\��#��L��*Y��e�k���.�{�L��ddHO��*�sLI�s�#>��|�o��
�#���c�`�;�3	mc��HrSCn|Ĥ����*� Y�|���vY<���TO��>�
+ke,�K)EmJ.����+�x�
��U\�Q���y
|�;�r���Ȼ
���� ��chiCG3#�t��2���7���^���R�L%V�J�e,u)� %�
VRYH	�2��*�ۡX��x�K^n"/����˴����2K��-p�g�]9�� ]m��	�
�jF_-CF2�֓b�$&�@��>��*-J�L����x_�b}^
�SH~��gC�� ��c�c
�~�c�U���E���p>4��q*=�N�s�����aXF�h����11��+)���`�b�

A� M
�h�P���i`��0MA
C��?��V��j�)x6����{�Lz�Ӑ����أ�VB�V7�q7
�������$�K%l\xa�0�
���t���\x
��
��
Ǹ�cB�Huh�c�C��걓z�CO�N0yy@�0���"�d��F\��1��R
��
��k�RivHM
dM4p��ġӄ�&��4���5Go�L�Lk�.K�hh�h
�k�\��ni)![�
�9�<tѓh��24����2��<��ù����.�ˍ(���ϐ��D
QA��`�	1�X<�i�1QH̡�
3&��Ĥi�f�vjb�N�1I�4c:�Iu��-lgZ'�<.����y��}��{�C<Vrc`k*c��.�rɗ��rQL.����i&�ԣM�<H���"
�\�ٜK
|b��ӣpoA2Mk��:���
�f[|v1���TR�&Nۉ$_
.CXL.q�W3U1U��JtQI.*9<�ԣ�VT ]�`�
�0�c�0͗1�����#�Z�	��2��hB� �x���D�*x�X 9S=q,'��ı�8�I
M��\�r�j�G-�e3�Z�$�s	F�!�a�
���V�_s3u@�5�� �7S��wv�d���p�)��
�
�8�F#�[#g�]4r�8�
$���7�	aj�aT�0կ�����&(���/��\�$^
�����?h��A���F>�<�� �h#;�?�;: ��6�����
�+X���y�#�t��p��
��30hs�1
���;��� 9��tG7��&�4�nrх���U]Gy�,�A����U���Epܳ���:^J�<�a�<2h6� �ƺ	�����gG��I '�M/u�E�賏F�G.�Y�
'�ṿ�����;
�1p�a0�p����{�Lߐ	{%�W@�Ca�!W��қ��O
�
c
*��r1@��� �_R����qpf��
L�tL��R��l`���u����t�
^ o$6hV�Ӑq�
�-��8.sf�p��>�rF�qخR�+�_W.0Y��
āt0R��οgj��s�;���������pH���}�A��#�
G�G�s�"^�@�� ������a��G�>|��T�p
��!X��4�T
|�p��Ʋ~k��g8��8�K8���G����<����
N�]<�E��D4 ��(�y}��Y���Z��Y��;b�6�� �ԮO���}�<�
+��n�-���qS���M�8��z
{���S�x�8Nk{�M)�(�3H�4�z�~=���1p
�p;��T���_+�}Xኁ'	�,�?u��
+��q�@>z�S'�u��/��
>�z��:=E;�

�N*ңn�<�7��U�#��`�
:�.�
�_�OR���ܠԍp���/���h=�k�!G��!�^7���Y����J�g��z\��h�����Dt�*��bn���
6���^
��489x,�؋�h2� G���
��M>:p��6��N
�v4����#ԥY
��E�f��U��R��0��we ����
�m���X��u���8#�
��t��e����D��
�t��2�!�U�e�/�Z"\B.j��(f��mV�]����O{�

j���ȭ7��\���~��t�� �\�χc
�9��)���2x�Y�ŮC-�Z@�泳R\	�,F}������9�(�48ĵ��5��x��W�:E�iU
5YJϨ�.&�j�$�
+���n1
�Bx��S����(fYj�C(�����i>'{��og������G;k�}+�l$n9�C�5���r��xx��K<��s�G��Ή��x*�j�]�r���~"}�nwUL%o� Nq�
O�*c
}��e;W�&�YC��%/��
P8�f�fc_1�)
���	k.\�p��� ��ṕg�����t���SO�Y:����o'��`��Q:9 -x��w3Ӑ���Q�z��>;\�p%�'/\�p
�k4\5�h�r��#{#PN.
+
�i��dgqe�d�����Y������1 at 3��z�MaL$?���
r2�
�C�&�X5>ȡ1A.�%jTP�FgiD�
�a!w+'t��C��V���:��7)5�C)�O(��
�1|!O�w�D�t
�.���X�m�)��1���PAN��O!��ǁ紆*�dT^�U��r
.eGx�����
�G�RZ�y�S�b��dS�<��J07*�����
��/)�|Q1���{�Z|z��x���-��k~�k��撧��f2�KmF�•i1)�
�Ts���8%���dɐ�2\	����(�Z(��L��%rF5(��.��춗e�]_�[����}��vƭ�I�����m3��l�4
�Lb
���
�	R�� �͢�(��b�%�e�*֖�[����m�%��TvG�l���F��òD�(S������/��t�N��𳛱��A
���4�8�6S��42��dS�w��F�8�r:
��v��,�3��木������Hf��\���R��W��~���M>��d�{�����<
=�Z�Q1��]!��2�Y��Q�,j�LN\�r�,���r���Ni��
�9~�L�SeL��Ȅ*W*,q�B=�9� �
+N��UH�O]p�w�L��,�X�ߕ|VLl���)�f
9�#'��CN��PEyL�xl2{�2y�eLJUD�0��(<e�BSf+ĻPA^
�����2�z6����$�����;�݊%k��� K=+��
NǦ���
G,�h6��GN
١���f��u�u}����-��m
�r��
-h
��Q`
�r��*�1n� �"ʘ�TT��W 1��h���
���۹�-s�n1N��M�O̘ۗ����������{��sE���H\��Gʐ��i(�
��P��,;V�e��
Yb /9
o��
C?��p6YMw̕��8Gm�7�;b��k�R�'��џ~z�I�ѩ�Y�i���i�?Ҿ;R�)�KZ�f���̰ef�2ݧ�Qj(5O���Y6�l�[�_�s���A^��-�//}>�-U3�Ui0��v�|:ɮL��1v�
+ͥB+�t��r�)��D]᥊y��
+ݸ�~0)\�*��ָɽ�û{��Xfm�հ����2��V��|�ߵ�=rů�Ĕ�T��M�T�۩��jE�Z��
W��j�^v�q��q�*�B�˄ΆKZ�[µo�5�c[��_�U�`�8,���G�� ��bK�^2ٓ:��hh�5�i|1�/j�Z�V<ji�V k�P��V�bi�l��lZ��sBcCMk
���U;.���n��X�G���j>XA>��ך��_���,N�7Ѧ
_\���[=_�i�u�`�x��D�@�yy��_�2%ʹ��x�
>r��؏{�Թr��`j�f>��+�T�e$9
`c���U:�
I
~�%���
�ٱ�/袁/��h��
_��s�)q��q��l��������� K�3[�j��
����M��L_�>���7\;ֲc��4��Q�kTT�((k�x��[��w
+�ሕ������Kk4��U��@���{.�J�1P╢
4�
�ŗqE��` �Ǝ���U�n�\���ɼE���i�]l����'$��{.�y����ǵ��1�Ja}���
�
�!����Ϛ�:mfG3m4�I3]4�E35q^��
'��$�;��i츎[�u�
�r@
+1�T��<ȸѹm�	��a���-��߉MKvǀz���(j-|�BL�9���~���3�p.�Q3
xԭ�G�n�߶d���N�;�|ܛ�}��6��'Ѷ$��3'�qR�<%&�4�S|qJ~�DzR�>���ދ�x/�9���f �|�ʸ'y��j=	
k�âٱ
]��0���!,�
�ڣp~����ӳ�q�0rN�<����Q��ٗc�;�ޥ��`|��<�\�����^�\e>����P��F<?W��O�cq|��x�
����i�o��r�M��_�a�{�	�u|	��=��&R��K���忚��6�����W$�dv��}������*�1?��X߶��i�{�#_��\��Y��3Nmc}�
���6�>��|d������)�]��;��_��_����
/����9�Գ
+�3���%�Ol�OI�'	�<!=��1�9��G�c���&�}/��>�3d,��mB��=�E;��bW8{�;�
+�,g_���^��U��*Ilt�B��t���l��	�x��������(����
�$�/����g����� �:{��'�iv��6�l`�����
g��v�;�����8hûC��������Q��O�)�͠s�'���I�=�.�
\�x�������
����
��)����9��)#+����y�J
���9���ۉ�xs'5��ۆ�
T�x>)�3�tSI���/
WB�)t~���-�v���k��~��ƻ�Fv��NZ��������M���s�Ep]��z>�Dk;��d�����dI8�,y�b�
i�|
EN
���b��W�V��f{�c��r�Vրco��5�(������X�e1/����s�SG	j+�G��Y�v������ꎣ7�b
%8�pTȊ*J��3�L<s�,r��X��y<3�/.��:j�M���o&�
8c$|(K�UV���u�#�%n�4���xzȂ�8�(�eY��O�L��f�d�'g��t��*jm�L��c�*R����o��	�]�;
+7i����]��Ɩ�q�Q�,�.n��/WO<}�
�S���2�c;�:q��&yb"
'�D5}V�d%Վ�=c(�B�U�����r��բ�����Ξ
F�5��T���2g�{��̞���@�%��
W9�*\�p��5�'��"�-�e]w�H�e��
�ϡ5N��k�Z�>�JY�–�ٲ�_h9��
+uk�<���q쨔+c��v��0��
�j
�k*�z�/jW�PY2����@�8~�R���5�3~ަ�

n�0^i���5Ə%F�9F�|2�fƥe��ƙ�W���~�5����U��b�S� ��'��RYo9Z��Rm
U��N���uo���ֺ��{={V
1��I=�L3�N���9)1�k���%��ҩ �����Q�2$���(�"�t
�ӦGQ��(L_=�7E���(�8��#/�|$2ގD��#�U��y��l�u�j��6��EW�m���lq�b}'6�t2"�s
����D��D���E]zG�.�Q�uX��::zdVEAfm�g]yY�#��1r���H�d�����|���8���Z���
#���_��y�)N��RlF��0�)N�EQnf��΍��yQ��3��F^��H�F�����;9rr�"��������L�.�Ñ�8��#-�*|��ָ
ߍV�k�Z;'}�^k�\ʖ9[C����k�(�)��=;EaAz�%�p�Fn���IAq���2�������Id"���AB�(�7Q\� �!	b���)D1��Q5
mQ㫚�ؾ����UZ�E�
JI'���n���[��z�^k�{���9{����w)�ʢ�c
a��eZ�2��R�[Xh�	s��q�����$z}&f��D�
U�Y�������[S�F���8� 0�*�\�L8������V[F�8�k'OaU�OX�
�u��s3�qahuaq��u�1v��te�u9�2_�<��;�}G2
��KB��#�� �&`T�q�&��I%�Yw���4v�6���NX�9
+
7ga�V^h�a,��ӽ)C"��G��`C��������A��N
�yb*��c�4Z�̲IhW�G��V
�L�gMb�g�Xޅ8
|�DIQ��Nh<)O���z�D�D�F(��73��@t�i��iN�i6���3OLf�1�;��CuI�م�Q��|��{
b	_��?Z�j`&�ޱ.v?._�Ə
�������ς��(3��8��яWҗ�>Tz.��?�����.��7�i<�
�%�oD,!`R�8��\�)����`.� .�j�ȥHB�@H
�1�%�폎�@T��
Xb��/&f:���.c�K4�#1�wsb��=�8|��L��f�Җ���xxC��Cx�t������	�$2N��(��mt
�5&j0�T?�Cp�mG2�a���E�
h
�9K(�U/0q&{���@�Ak ���
X�
=������	=���Y�&zfͺ
�u��Э�>H�V��^iPfPwމ��Ћ������������������lxH9,4�ٲ�5���f`�
,�x�8�08�!�q�M٠)]I���
l���"�1 [...]
���>[3�F�5�b(
�A�b${��i�z��з9�&� l^}�p"F;b2!�{as�E���
+D&�x�#�8j$,by�b!p,d�L�Y���]ّ!1���C�H�l�p��
��������\q
 .�������U%N�LH��-R��dch���
+�^��@�D����3Hv�gx�q�|�D�p��*�жhc��H� u�}��6�
�7j�ʌ�
+?R�#�3I�3<�� �P��S�,�>����� ؞�E�q�����\��=�-�R'6���;��9IA���zɆٜI6�|XdA�,@��W��־+Y?��[�ړ�C
�iB�F-����(�ӊ	�-A[(�
�����o�q@ j�	��ȡ^s8�
j$,A�E$�h�~?�Xhڊ����>�ǁ�-��•a�0|�!�St�+�R)5�D�@*zm�ah�C�F��nl�V7q�m�͐p�n�y�Qњ+�{��O�#Ok	��R�>����5y�]��Nb��s�0
�;P�^84~��E���J�c�
�i<r�g.��	�8��`�r���E	Kkےv��
�h��]\˹{��������W��*U�ר�
��n��z�6j�4�Y��Z��l۾CTtL��q�]�&t�ѳwb������������
M
�6bT��1cǍ�0qR��)S��e��YΞ3o��E9��|���e��X�z�ڿ��|��M��l�b��]��|�����?p�Б��rO�<u曳ߞ��� [...]
H��̿ DH�I:�A���D�0$I
�%�Ab��b$XdH02%��1M��d.�,��|$1Y(�$*����V	�N��RB�Obsp�KtNKx��
�� tEBtCbt�
H�~�0=�/HNL�.��\�}�y�

+� �)��.doF�X�^�Kh4ff��``i%Q ���JفDiG��:��
�"$`(�,�B`
\z
�B`�%��,%*)6�kB�^�I��
J�6j�����L������,�x�r�EVˆ��X��k	8QH
+�$Y�&y�(��ꕫ$��uҽy���ܽ{����!y?z���ߟ����������UQEUTQEUTQEUTQ��!�`�y�
�����bQEU����o����n��b��}S�V\+����e�:<=�c�o���*����oW���gֈ	�����W���G&��;��D�›&
N8:<�͂[��ߝ9�qt���O�	����
*Ʈ�*��Gr��~���\�13��Ǧ̏�.�K?j�a��`[ᖰ��=7%��¶�
+st�P"M8<�[^�R�6��+;
�k�
��k
��ke�U	�	�lY�j�9e�Ks��b"<��.��RE�?��<wx����c�c�e�0e�;����Q���_�/��j�n+;���P��|V��lLu��`�]�:kfp]�
V��"���C�]�C�b
w�Ê
��Qr�[�+� ,|j�w:����e�Un�3c����+:|�a톣�<5aUE��"Wv�M�qФ���>���l�)���%d�t�U��[�PY����#��Wq���€rF�t�Gz]����(9dj_8�`���]���భ�K�J7H��K�ws����ؗ1TT�..�(r�ۮ�����ѵ}
�4f�>�z��{�ϟ�ࣵ�L�A�����ϻsƌzf�zkfL��(�ք���C�
~�h?�j�}�CJ��3��E�%�/c_TV��J�*�p��T�_���xE���y\���_�^H�ڨ;Wi����
Y�A�"�ҭ[���l�!�I�v��^يR�9�$�V�d2���nq�y>��=/�����<�y�;�s�����+N��w	$�
ӟ��mWy0����\�*c���<0gל�uN��@�B����!���
���+��
G[Y��u�?R�
|�^��rr���H��/�
坑�������,�~$���K�]�Kn�`����l����=�Z�5�[7�q|g�Unr���"~��F�8�ߛ-cY����
đ\ೖ-K1�Es��� �)�`[����<pb !zٔ�������z�{t��@�E^�~˷Je}yU����-�#iږy��k��p��?���0Z/����j���,�bh��}��F�u���D��R�����%�H���2 ��
����� �v &� � �e��u	�Y�N N"�{B��^��{~ݾ�V
���>�>��zy�H�����]P�F(볫�ܤ;�dq��F��V	�Lk-��z�PߔJ��K{�w�W�y~��P�'C8�d,ߴ.����
�
�:���J�@7
�d�z�qF�@���`
�V�"��
 6X��  �#����#�
��	Z������e�W Ŕ����ԃ��N~�a�~�qfu��#E".�l�йy.�?Xϊ�
��;��m�
HK�=�`(tu4�G!g��n� ��_��:�� ^!��B@�� zh�C�L Z8�l�$@��
+��+ <j�e 2<�QQSS}?�4i�ǀ����(;�jv�,����_X��?�j�_�Xr)z��XK=A��T�h����0�B~[�)��ܦ�����bU�q OՆ��
Fv�
�S�����@���g��6��_8��1 �>� 
@
�e ��!� O� �����Ax
�C�8���~ⷎNs]=�/��I���֣�3ѡ��M*{q6l�j�K~!}
9Y�����m!���!��_�
7�Hl�ް�(��Qp�p��j�`�0G��Xs,D� `+�� ��
�/x�G �F�
@� ҚSШ
+�s�=�t��##URuM�T��������?|�����zq+[:����s����M�n�ִ�������䂹3���3�o�\P��7.��B ��<�L
0
+� wz B��F�1��2
+�Ȇ�� �DG�r�
<�6� X��`3
+���83�|6
�~!�]{=i���5�$��>�*�OE�t�O������1����o��,N�4����GO\ٞ~��pc݌
)��G�R��0X�
��
QA�l�(f�4�� ��M<�Aoc0 n�`��� ��"��0E��>���)h�@<׹L
"]�N��JY���s����
r�,�'��%����hݹv
+��� ݆/�U�)�
��|���J��n��P��W��
+�x ������k��F�E�Q��`0|�=t�[�
1x}� 
f�p��c3��A&��� �ŽpJ�� �~
��7%�1
�����,۰�PRN�D�,^�H�U
0u�����f>���
��7웻ñ]zQ��ZV�����q��6
S�
��d` �0��XA#����G�V�J�[�(���9
+R�
��WvH� o�^0�x�3�
 bx
+p`+gQ��(^���1�����ױ���>���9��ږ�騬��*�^���x���#qb ,Y2aHwc�VM�O�b�/f=-��ȁ/}	��-�
��`=���瀾�}��k��)���
+���4���`"��
C �!�)�p3 : �m� �u�@�X oQ�v� �����n�gn3����
��w
:s��+
*�����q���BV-
������M$Nre�O{�} v� �R`��
�8�3J�yM�O�4�)X� �ZG�y��Q�j{�<E�T ��I���v\�5�Y �8�F�a
���j5
�X���+�~6���yB���UX�D����C����j��*+�j�߯
�X��9�q�x;�aV�,�;�`g�\��L�Z����[�� �6�
zx�GP��k0���
ܢ���@+8MA\��Z ��T�����g����P ⚖ (�U Ͼ?�4
�;���Ic@�����S�l|Q�gV�e����O��H\����GI���s���}-:�l޸�-�P���
4T/�數H���1e
�N1��@
+���^�Sp��|�v:Q � h	 Z��1
+��VKȘ� �1�>DM
{��_�Y
����̸�Ӻ�|)�we��Uef�ᨈ�����.A�]��]��dci��I~\w���<����
8�/�t��
�P���g�+ ��e
>*7E`S# �
��3\�G��HpχH �n
aKS[��K
5�u�k;�mɶc���V�ރ	iE�HD������_+�߾U\�'�9GVXJ¬���9M�<~̨���փ �I+���q���ij�L9%��A�
��0p��cF"((�`�77 Q����#�' q��� h[:�-H,�n#*Z_YXO�
+=�V�y�!�p������
�LY���zY*K;�x2��}{"w��7�e�r
��"Iw�:G�S
y�\�V[�<�6'R��չ
n%�:溬'5�m���Dtb�Z����L\�&$
+��ܾ��~v���ן{��}߻�����<%E��&�g������IN�
��DH�J��
"�NƄdD�]�	Q�!�c�@
+�d	*��>7
�8P�W%

 \� h�`3�^l:�9�3��
c<��xWo67��!����ʺ���[�ЈZ��I���4�z{z?c�vT�g���C	|ޮ���X�.�qDh\�1�y�X��C>�M|; ��egA��� ��:܂�8XJ�[7X�I�|0|�����N�7
�����w[{�Ekv��c�JȬ�����i%J-��Q�#�u��|FB���ѵ�<~�ԠV�T�w<k�F�K�};�#9a�X!���ЭѨP5w�8G��ĥ�eb��5�@�
+ݡP�
+�`(d�B�
G $��8������&��{j?��S���
�p䴥��W5z��N�K6�
�V��i�|Q�Ah
����4�ݪ��(����d*��i��sZdD(k}P` ͏��Gg��墂t���5R�LT�c��+ʻ�#��
!� �
1M��e�+����ƅ
��xoBj�0�ǻ�8���O�U��N�������☤�"ţ���>�|���_�JvV��{J,�͓ɯ)��l/`�
���R|Vx��fm�
��96���pL1c����3Y0��ߜ,��/���N��P�[@��Q�t�+eK�T�e�9ۏ-p�
+�
Ȯ|BpW����$�
��%IH�O޿y���:�~0?_(g��D��,�rE}K�
cШ+)�J_*=��I,�?!�
4�
l=Å�[�P�ծ�=�Ğ�	[������ �}g���
OZO$o�!xL��=�5�dbBC��)		�O�մ�>�R�I�r�\���r"#;�@V�2[��k������c��lz��i5a#*�X�m�?�;�6�2.�#�:ĉ֙Li���������_ �8L+
endstream
endobj
292 0 obj
<</AntiAlias false/ColorSpace 281 0 R/Coords[200.832 326.766 200.581 446.121]/Domain[0.0 1.0]/Extend[true true]/Function 296 0 R/ShadingType 2>>
endobj
296 0 obj
<</BitsPerSample 8/Decode[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/Domain[0.0 1.0]/Encode[0.0 63.0]/FunctionType 0/Length 256/Order 1/Range[0.0 1.0 0.0 1.0 0.0 1.0 0.0 1.0]/Size[64]>>stream
+YGH ZHJ \JK ]KM _MN `NO aOPcPQdQReRSfSThTUiUVjVWkWXlXYmYZnZ[o[\p\]q]^r^_s_`t`auabvacwbdxcdyde	zef
+{fg
}gh
~hi
ii
�jj�kk�ll�ll�mm�nn�oo�pp�pp�qq�rr�ss�tt�ut
�vu
�wv
�xw �yx!�zy#�{y$�{z&�|{'�}|)�~}*�},��~-��/���0���2���3
endstream
endobj
290 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask 297 0 R/Type/ExtGState/ca 1.0/op false>>
endobj
291 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 0/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
282 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
297 0 obj
<</BC 298 0 R/G 299 0 R/S/Luminosity/Type/Mask>>
endobj
298 0 obj
[1.0 1.0 1.0 1.0]
endobj
299 0 obj
<</BBox[1.73404 42.5696 75.7419 5.0808]/Group 300 0 R/Length 69/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 282 0 R>>/ProcSet[/PDF/ImageB]/XObject<</Im0 301 0 R>>>>/Subtype/Form>>stream
+q
+/GS0 gs
+74.0078095 0 0 37.4888263 1.7340353 5.0807957 cm
+/Im0 Do
+Q
+
endstream
endobj
300 0 obj
<</CS 281 0 R/I false/K false/S/Transparency/Type/Group>>
endobj
301 0 obj
<</BitsPerComponent 8/ColorSpace/DeviceGray/DecodeParms<</BitsPerComponent 4/Colors 1/Columns 1686>>/Filter/FlateDecode/Height 854/Intent/RelativeColorimetric/Length 215908/Name/X/Subtype/Image/Type/XObject/Width 1686>>stream
+H��gWTIF�%v�DI"B�Y	�P�`�
���?��9Uu�n�n$\���v�֬�f������͕d��L.	"�%I6'�>D;��9E�A0�k��/� �!�p��m[ٟ��xI	A�"�
��!�$�%�"����(o�:Დ�Hb� �%Y|
�R~��'�	��xEB�S�!�pjb��-��<�i_�vIA0�%�

)C��%{�N&X^D�i]�F��D���
)�I��,
]�85!�ډt�%#�!��jHy Lb�P�DQ$�̵�r��N�.!�M����7�o1D(b�6ɵ�8Sy:����F�"��v�q�
+�"-!�"��S�z�����=ϻ,]J�	�M�!e����I
	*m�U�P�6�W$�5�R��I��I�.��U�,
�:�!�܄b$�8G8�'�֧:�?�o\��xZ�l]J�3	�K�&�$�
9�"UAEt��0E.��?� ��(�l��oF6�Z�'��ϧ��%ɒp)��m�!�M���9�!U�Lb�P"D���&I��yVg��
���g��ΎA�NH��l
7)�32��+S\�����;��p�$囲�J���sἵz�v!�D:�2%�$�$ϐHEr��1�֌7;�����n�'
��d��5x4�ľ�T�w^�t�D:��Ry`�yI� ջ�����&=ݸK�\C�"#6J�p�oJ6�X��9O�s��R��3a��H'$�/J~C��ͦc�*�4�gH�"�(yM��©"�nJ5R�����O�W�'-�?ݦT���Z�����Pj�G�k�I)6�Oщ�8�
��2�L
���
�Mb�od���������6���iRڹ]"�*$KB⸆x�T�"n��$kH�rS�7]&S�K�%���a�j��}� �j���h�td�<� [...]
MR�
IR��s�:tE"
���$��B�R*3Q��M"��7e��:�.Ýx�7�JAV��;&��t/�1(�	���K���g5I�6U$e�	��)b
i3��p�ؐ��!WC��"B�R�q�$N�F��kJ�npWѓ
�����%d�`
��"�0�5H]�1Β('\4W�qf7�V�6)hH~��uQ�҆�q�(L|0�.�s).KI5A�s�;�%m
��&)ߠ�Ƣ����L_
�C�V��c�X;���K��z
z����GJ��(Ur��lK�":IT�N��ʐ���
Q��!�mz��.9�
7��*g��3P��fդ6���D��f�L�>�W<�G���c�M��#� 
�Ʉ�t	��d˒H'\�Q��Vcf�1�� A.�ߐ,�8��׆�"dʄ�)`�K�%���b��Q�JQrf�g\[]I��H4�400���c��
v�ܣ6�2uz�56���\�eI�� f��(��
�KA���C��!}�4�|�x�͟�2��QD(hQ*E�kR�IR/	��f0�&Fr����=yH�y�α.$]d���pB���`�L��!�z4��ߐ��!���]nqY��&<q����q�$��~d#�FG��1ø����������|d��&��A+����9�tI8�T�R
��x�Q��jcC�z��!�!Cbq
!E���L��x�Q��\
+
�rnBQ�?��(����M�I�nÔ#�l||bbb��RLG��wxOB>j��� [����%_��S0�'�
+��FQ�����w�6m)��9��kȤ2d
y�6�!M7u/�\�!
�P�ʔ"R%��	U�w`Uu�7�8�$�u�
M�g��33O�S0�
z�Ogff !܃zHk��C�x
*�,U�,I��
ƩRx�546�ن;	M�jӣ
��FڐmHE��LQ�<Cx�q�:;�\r�
nR%�p�
�U556Jm�l
�@Ǿ���mP
������/�g��H��n~~n�|�m"�H;�����%��f隒�=��:�����"�(�9Jf�Q�
"I�H�S4�(D'7d^E�!(O7����Ҍ,��YC��ƭ�فוr*Jzb�N�3��419=�=�_ Ŗ����W���y�
=ZY^^ZZ��T�٧�
��������RT��SP����\J��RgWw�=�$�6$��E�#Rd�q
�Pd�Q$	�id����s��MgI
�
o�*�
h��H���&�!I3Ofga�"�F������oll�0����;�l������Bro��;h71��%�,��RY�����I=��qO%g��(ݼ���y���g�УZmS�\$V)"C���dSd�!CVؐ*O7�-7�Kw:;t���&��@P9g�9J4{3�0n#����g�V���4�����������y
	��7�[[��d��:�G���>��ut/
�t=wy
�,�)X��I=��	�J�"6J
�wh�=�ly�3iz�)��e��:RC6�3�B��!k�ޖ��h��`�r�r�C��8KM*Kl�/Kb�P����w�QN]J<��q�$���`��M��vvvww�����7��Ox�����C
+no�<J��������K�CZ:�RsSC:Ug�$U.�`���V�J��ij
M�j[x��̛�A�vH�|
�gCHǐU
+��4
y<<48p�����d	í�"U
+
���T"�[(J���2ָ�yn}�t�
������÷o߾�~�?��������ۅy�[�aZZ\�.�
f�7u��9�b0U�N���UUյu�tCS3��ޅ(e��69EM•�|m��5�����3$�"�!֐M2duyu�Υ�������pC���w*]�S��
D���
��}��f 
J�I+�$�F�

�4���O���>3�F�?


��GH��}�aZ��ia���(I��t�����!U_3��zB�4Dﶺ�G�v;]J���A�mS3ܤյu$	E�d;8D�H��
�
4iz�a�.�r�gtx��t��C
��n�!�!Ba�8g�����Q��C�
��P"�I$���>���T�d_����~��c��Q�H?������(x�޿;<�v��7_n�^z6?��!K��,55��s4�J���m����T����UE���461��FM�j{�zw��M��ʐ/Ɛ,�x�
[C��v�馺�sib����Cd�ni;�*H��P�h�ʨJzB��Fށ�R���Ԍ2����kJһ��
9�i�}����ϟ�~�������_�~����
���}>�����aҽ���Ę���h
+�45���sT�2��pA8�x��Ԩ��z�����44�xlr��ܳ�n��ޛ÷�?P�H4�3$�"�Y6�1���gS��F�
+�K�b�7��HA�I�%�)�B $�.�����r�޹��$�(���e&3����|̚���ښ��r"^B�%'>��'hi/܈n{V:ƭ��io�9�@�����'t`XD�e`*#�9�������G�`&��dr�B�E�}�ыB���e2����xM"`Wͨ�����$蠥���B._<���#��S�c�[�ߑ�>!֩t���K���m��l)�'$��ef���Ie�U�P���D6��JBE�L ���$j�g�V/�dg��$&@K7��Í�7!�J���
�d7���Bãb���Rz������� \������h��]�J�J�V�5M;��	���T*% T�e����	���TT��4;3-%QXK��a���c,q+�;����C��S�]F������Rґm���ITm���Vj6���=BAĎ�n"D��Afj5���K(7̥��������l�����@��
�?�>�\rԁ@.�,u`xd����2�1��K+��&$��S
+ܔ*50������tz���݀�	�����z��FMn"3��uՕ���\�N���ب��`��~HAO��������TB�yQ���.�FD�^�NK))R�-(*)����$q;	�F�h�6BAD�!�6B0����
^B���de�&�Z�an>�/7~Ny6���$L%߀�A@
��I)C	�5b&8�� �N�
���a���^���
�������Ѩ����5��k�Z�s3�JLdxȟ�9X�C��_<�/����T�

B���ۮ^�y'�abJ�TXTZQ]� j�j�)`$M#��J��_�/�Vv+�DH
+����<��(�b��C/�pcc��7+qD�9�9Z����s4��b�
+
h�Ry'8⍄4�F�F�i�l
�?���l6��LF 8d
��z�5S�D�
1H�1-%?z@)x�� c�g�9Wn%~Gu�[�u�?�����TB�]��y�>����$���V����FզT�h{u �0	�����@H��OۣVvɥ
��R}Me�UK�	�p
����i�
+7n%~N|�V:��bE�
S�?���K!a�1@������
�2���S(U���fk�lbbrjjzzz��
�>�ujjjrbb|
�G�]���Q��.�BGZJK~)
r��u,y��������8+�Tr�n�@�����{���{
%��R*.��mhjK:�]*��W�?h@��Fa"!� 2�a��!� Dߧը�%I��ڪ��RzJ�C
+�ب���t���]K6B8"����BRr;) ��t��
g�Qfd	R��P�H���$���6ئ���ܜ�2?����	��-���,zP��8l uj�B�A�AKE�ٙ�I	���ֱt�۞���J����t�Y���
�v���u�ҭ��	�i�Or
�˪j��m�.�Fۧ�hC�!3!�"�Gȋ�i!CH7򒬳������
kI�����p6��1�l�����s�s���
� �\�����
��=+��aR"���a����$�4k�d�KK���+++����.---��y
ț��7�F��}=�n9A�P[YZT�4+#Ֆ�K�Xs
��J.�J���
���q���T��;�&�fd�AJ
ͭ��n������<>15
Y��Y>���?1�c/u+�qsc-i)�IfZ���nֱ�Gc�9���­�ω�!w��J@Λ�;��\Bu`aq9��@"�0
�&�p[\"�VW_���y��;�>�y����zu���2�[�̽������Z�R-a-U�>��y�.� �RX01�/0��)77�J�8r����Y�J�����v�v���{
�dd=�/*��mlK�
+eO�
NB�AIs����p�@ȡ���,23516jʭK&�`-�S��$>���R���=B(�!
~�y{V:q����5	���"��TJ$�
+�˪�D-m
�@"�8:>5%��� H{����������������������o@ޫ�%`7Kԙ�
�}=J�`kS}uEIanvf*R��Rd�>s�6�Np+�;����	k��{zy����w�m��O�V�`)I�]�
]��9����!�F6B6%d��vm�Y\��t
1
�j��ReY
�K���4����x�v �#��9�7+1��
b�JɄ\Q:�E�)����
#&�Y ��
+Fz�@ڇ�;;;�����]�no��~
�AM�IL�s3S�f�� ZP!m.��.�LO����dǜ������ĺ�/ ��E�mqB�e?-(���oj�ȺTZ����LNB�!� �
 b%d�PBv![D����K�҄�4<�ת�e���
+�'��{c)��� n�pD�9��[Ɇ
B�/ !
}��{�r
K��
$�~���
�����`i�>}����ׯ_�}��_�×o_�����O�>�[�o�V�%�,b�8<���:�[�J���d���Ę�t��J^
�9n%~GrVra��{x����-�6�r�ʪ�D�ۥ$��ad�����e�$D���m b%�
#� D!_!���DȻ�ׯ��f&�G�
�^u������-�Fc�Ƶب�F��o"䔛�@G��s�`��Ǐۅ��_`��K!a�1W��C+r�u"t� %�����"��v}�����O��0���Ǐ�?������/�~�������+��3mn�{���^L��HKJy��R�� 7+#c�f
1wY`���/ϯ��5���:�PC�^��&�WAAD�"����T��4*
+�4�I]@@��{�����I�8��O�]�u~����ޏ�����Q9r��~Z�(�������
EAIY��`�n��stt[|b��7���k�q���jC��>2�	�L��^B:����G�k�+ʊ
ne�p���p
�c�����H_��A��()�#B �BHD�
ΉXIrO2u�
M� 9����
+
�[X
R�{���%vROo� ��B��9��q.�;����q���X,��CԽ&��-�eg���\8}*,��������'sTsbb���
�D�$&�V�WPR��kh�n�����
)i�2s�j?{wRGg7(iph��"���-!�&����ҋg�j�U���ʼ��-&*<������������������U`%1�J���I�Jǎ
 ��B�  ��)D��9ť��
>z���9	�
}7�j��)�������4�›���9l0��� �R;�i���ܬWR��X���vwq��<!`� EVF��1d�a�������!G!b�`%Y�����CSw������?�d�켢���4�|���	gRAO@�>�`BxB�!�}�=�ܚ�45��T���Rr:�|<\
m��M
���
5UeE*"DJH�!$"��������qpq���8}!���w�����H�U+��?4�z��p��G�3|���������� [...]
5��(ܮ_IM���
+
��ts���05��a2�4d% ���C�]+
?��J�j���v��
>������
+KrMp)���
+DNG�� ��������ߋ^�������<��v
�����\Ku�p
+޸
+�0��u�30�JP^h�㤕�
��Z��J�TEU�S������$t[8t[�%���e����Rjim���
�j�����,bB�A��	����KPn��-��������������3����.6�'�
t�4�i*�
+��J!���
���J(�
M
}CA@��/(<*�r %��C#�I�)�
ᶴ�~eeeuuumm���emu�}�
p�M��X��=���
=�E)�RZJ0B0gA0�KP^NVZR����گV����+)���Z��m��.�>!���RP��Tܫ{�Rk{gO�����;95�#		Y���&d��K���`?�%
n%Eyp,]�����hkefb�����������$�D�P崙 ��d䐕htSG�B����8� �\K��ì1��$4 (	�oe@[_�������(:x���X_G�"� �3��q���`��^<m��_Yz;/�ƕ���\X�/b�3'(A
+bN\L��������JRҲy%U�������������o`XdL\b�����eU5
MO_�FR��65�%!#!B0"��""B�""dj��~72����[��ₜ��KI��F��z�9�Y���ik2�T�	B$BH+�;���@N`%i�`%
������
 �z*Z�gЁ]�����8p��
���ӧ�����nk�ӧ��;����I�nx�����H��;9�s�A~^���
Q�{���#�#�ON`�#�XIYUM���gdjnm����
~:6>9�Z�’�{��O������6�
T\H!�� �#&dmeŸ�Mp�XC}=�D��c)����)	��D��{�t��175��a2���JһV:BZ��a�orB+��A���5�t
�ͭl��<}�£ΞO��N W���
b��1qव�H[����wvv�|��Ut��eg�z���u������i
��Ro7J����ʲ��,s������֘9\�
+T��
XI���������J2���2M����7:aa����
q�܅�Wnd��.��}��YKۛnBJSӳ��$�$!!ۘ�}��l
�@���k7�j�ʊ�3��&�E�
+
�qwq��8a���ԠӔ!`%!!GH+�;��c%�]+��kj���[�9���
�8
��r�����e�5��˶���!����'m�������۷?𾋎x��
����!��/-���&�Zx
)���ú�������/�EG��dNP�T�
XI����/V� +�Q���4:CK���������'042�|b��̜�;�Tz񺽫���
�D(	�KD��������!s|�һ�A
np,�//)���~))�ldX�������������:MY	BZ��!�^+I��(�
+ʪj
������=��ȩ3q�������TB�
����4;��CN�@I|����x�
�����̴�rp}��2��=:��݁���%�����1Q��9�Ƹ���I+�;��g%y��
+����k`bfe����u6>9���ܢR�m�-m�=ã�	
n�
�J"�KD�����Kkp.!-q����Ame��ܬ뗓bO��y�9�Y���ii��T�!Ғ����
�a+
�c%*X��`j��Z�8@�FFC�����
�������V�SZeEfd���d�V����M�[���I���J�TB�_��s����~��Ư�ϳ��r������u�^���!�1�UzX�:>%�"ndt
+�����4��ǩ)`oc����-55�@
+�e�%�E�
��rw��45$�[*���2�FV�FX�o����壬D�y�6d����X�qp��
�JȜVPR��52���t��'(4�JE%��k��::�{�^
�����OD��I��QDH_o�RC���Ң�������`ߛ
���f�zZ�ʊr2������
�,�� B��V"��Doݍ�JL��J�`%�Ü<���KA����!x72.)-+����kAR�
���	%!�ffffgg?2.�33=0������y{K�`Y1<K�	QaA���;�[��ib�$�9(A6�{I�h+�[��f%&d�=�XX�8�y��$O�)*�i��[ۻx��
�NLɄn+���ojm'�44��D��]����y�R[s}Mz�2Sc�C��o�:ؘ��k�)��;))&,����~���v�J���+mذ�J��JG8��
��K�RP��B���oPXTBrFNAq��'�MЁ�SB���w��?� jsss���0.�ss�
�Gz	�%�-u=�)XQ��9ksc}-̜�*�#� [...]
���v��򲁎��s�R'D�x8bٿBZim%z�t�X���J�J\G��D%dN+*�j��Y�;C���$�f�>(�W	�{�
R�)%a�>1.
�9�3�t�Ђ/{ ��T�si�b#� s��6&ڈ9(A^nvV\�;i+�[íb����8��ENH�ʟ���cp���������Qq��9��m5
�m�:ѧ4<:��m��6��ª�`Bp�}��|��p�C��܀������Q�A>7ݝ쬮^�P9wFV��� 'i������QV�HZ��J�`%^~!1	9Ee5-}csk����+*�W	�����
FH77O�hqq�3��H�7�qA7�v|dh�JAx���
���%h�����$J����.�Ji+�[����F�J��J�s�
<..u��9�K�W���o��E'�d�G�V��
+�������8�m!
��U!�
23=���
=K���Y)��a����;_�65�ոx^ᔴ�q�cG9�
+�������%+m"��Y����W at XL���
j��&6�n���,(.\� ���D
�2�"��ڗ/_�2._0z 
P����x;62��׋����ʒ���Ԅ� ��<FV
+� �ad%f�J�h+�[����&�J��J��JB�ťO�9���khj}���-���Ĵ���R�mO;�z_����p��,����!'L�Ǚ��~7x��<*+��NK�����p��63�Ӽ��pJF��X��3e�M����-[i3i�=�J�`��'��^P�1�li{���'04:��꺦���}�Ё�)MS�!� �o߾}g
\�!���н�x36<��e��-
�������`T�V�F�4Q	JA	��p"+�����5��6SVڋ��V�>�p�����������HDlRzv~qyUMc
���1�)�l#�
!�mUDV2�q���5�[{KcmU���{��wn�pu�17��RUR<-#.
+V�BV�GYi3m%z�w�Xi?
�XIJV������K;'���Aa1	�Yy�8۟wr#co��q�/_1l?~��'������[�����P_OgGkc��������� \��ƺ��P��`%(A��~�J[h+�[�1Zi
e��JG��D%dN+(�j���8�ܸ
p'2�^����յMm�:{���ې��l�F„��&�+&da~�n
�ۋ�gmMuՕ%r3����x�:ښ��k�)+�>)!*�ϋ�t����J���VXi뒕!+	���ΜSѸdx����[~�᱉i��EeU�
-
�
�Jo�MN#�H'}ǰ����_���O
��E�[�D�uc�*
>��q/
�����Y�`%!l������V��F��J[)+�b+	����T����m
]=}�F%$g�>(��n{
+��
+��-Hi�#H� #�sUD0!�1!� �fp��g�����'�J
�2S�C}��
�,L
�Ք�ʁ����Xi+����J+m[��al%q������L��:{x��D�%���?�kj}��������	ԁ�8BJ����8;�n%tӐ�#C�/����'�%����o{�:ؘ�����+A	�V����S+�
AV�+)�i�X�:�y��F'�d��>�ihi����G���4Hie�F�
�܀�ϟ!��ތB��v��4�T��g�&Ą��t�fgy�@[�XIR
Y��}�J�h+�[�c���%+q� +I�+iꂕ�]<���D��˸��aEu}s� ~��ȑN"��̄���+��f?L�g��km�A%�������hkn�%�('��ĵd��L����~���%+qc+��+��X�]s��
+�NL��/*��ml���}502NvH� d�H�#B���25���]
mM��ˋ
��cƒ�n�;]��l�V���V�^�m%z�z�V��_���;�����PJ)��c���j+=Z��*XG
-R�P6({�7a�f��M�
I�ޛH-����v���}�g$����������*=�R��*��7hȨqSf�[�j���]aᑱ���!�e}�����(��v������^���s��9+��Rv����c�%�c��5�̙6���{��*Y��]%�t�Ԏ*AO�*��T������V�z���4q�������=x4:>)�LZf��n�~Ju�l�'r=�D\
���
n�g���(?���3�I	����
޴vŢ�3&�1x@�J/uuU��=Uj�5���[�*}�[��wrU�7�*

=~���KWo��{�ᨸ����+,)�0�s��$�����ՙѹO��r{s���⣭K0t[���
�*}4��J�%hUɾ�*��JP�J�Uz�T���V��cUiъuA�;�
���O>y������Rs�]�r�s��"���s��7��T^V\���~�drBLdxخ�M�V.��4v��J�_3Uz�[��T	w��U��7�U�կ]U��λv���Z`Ui�=�D�
?a
�9�!X^i&W玒���3��VgF�>�*J��]�7gUɾ�*-�;}�U��}�rU��'|�ԁ*AS�*u�V�'�qU��>v�&͘�xźM�w��G�$��:���[XRj�+W�<g�)Rˉ8���p�?Ke%�y��N�$�D
޿{�f�J�fN��Է��ғ�y�ԁ*�ײJ���s�3Uz؇v���ٸͮұ��T��/*��2�s��$�3fv����ܧ`u���7�aUi��u+�*�1�T��o}�tOG�U���
�*u��Ҁ!#��UZ�~s�U������2��*����j]��l3Ej9�rsn�g� [...]
+ټ~�bw����ݷJ�%H��G�����қ=����dՆ-;L�RϜ���/.������=��N��[�RmueYqA��gRM�vlݰz��J�z��[���O��&U��O�����*��w("&1�[%39'JN������Z�]cC��˟\�V)�x\�����*�
9d�_��K�*A�\�>�W��CG�s�����c�I>U����F��f��r"���>ܬ��T)9>�����*�
6ȯJ��*����_�Wi��9�|�t*-#;�������tU�N��{s9��UZ2�d�*�.A�}�U��G�Uiʬ�K�U:y6�BnAIy��n��*ٟ����¼��'�UZ�`����Uz�!��6��*���UZ�n��]a�T��D�Iҿ���Y�3�kj��kY�{vlٰ�y�\� U���z�:=�T�*�޸5t���U�khl�m�H-'�\n�íe��
ݶqM�*=�x'��6��*=���T)<2�����3s
+nI�
+s��%�;�J�:?C�p�|n����-@��F'$�:���Wx+�T���q�TJBLD�*���9�������zK�RqYeM���%'I��gfg�Ό�ZSC��˟||Ѿ�*�t]�T	�ύT���{��TZQe�Ʀk�����D���}�Y
�t���T��;=�x�*�͹�*��?x��*�5t`?����F��oаѺU�p���R%�I7\�I3�.^�~�W]����.�5�*��E�4~����}�U
+Z�|�i�ڬ/Z����G�%��I��[xK�T�go.9!�����[�� 7Q�m;�
��IL9����_tK�T���v�Dbldx��`����KU������frN��$�ן���:3�O�56�]��Z{sT	w�/]���js�5]��s��"���s��7k!���,+�J��B� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� uT	Q%@
UDT	PG� U�Q%@D� [...]
O�ƪ�p�^,�t�.tt���[6������v�UZz��?��?=Vꆪ�w��vi�‹��آK,q��?��o�J
�2ޗ}�gm8֍Ti�v-�
g/�=;v�|r�a��|칗�
W�Vfz~�N������*�nW�Y���{�<W�;�A�����7Z��+s�Q���<׆���J�G��]�^���7��d��a�E�_a�=;��x'��*�
����9�pm����ώ�Zu���K���,W�Uo��]�.ٳذ�"��a{=;���m�L���7U���y�Q�=�k}������G8�3��i��J��|�h��5^��.���/�h����Y�
�<d3A�^a��<7��� �rk?�T):��a
u�K�f��$����r>�\�0�Z�f�*��k�]��*��@e׆[6ܱ�
����ߪ��/�ұ�����~�[�Rt�� �G������2X�Խ9�Z=֓~�S]�0VY�~�U�W�^�n���ݬ�[6W�5=�3F#*R���_�������N��m���Rp���
�ht��+���.�Bw�}z�'�8���i��Jw�*u�t�v�U�V�f���
~z7ܴq����̈́i�|}��]m��P����.���J��
��de�Ӌ�ozz�gw��x|����褻8ѥ����[Y [...]
�}an�չ��Ox)hG��*
G2<�3�Lq|�ڌN���<����s޿�.�}��O��������珻*m�/��r�^�v��U���^|
ߘ�5�l�c���0O����
v_�x�S���Wn�j��,L�V[�f&��<pe
•��Cmm����B��~q�e��>ϩ�����8d+���?~�Ui�������h���*������g�e�׬\��w��]���\����A��s
������n��	f/�����*5ߖ�aԓT�
Ree£
o�c����[�Bw�G�r�v�.����K��x�a
7��Ti�s}��/K/�
i�_� ����U�Jw>���֭Y�e펍�4\�'د��7I����{
�iF0�r�]nGN�Uz����l���V�az�Ӎ�Mp|���y��B7������t�m|=]Z�4VR�f�*�o�,u�ѫ�~��e�^�ru��[�ϝ/����u��l�d�2�a��r֢$U�t�O���~�
�e�d����w���|aZo���m/�望�
��ݍV�qr���������׾W$���I��~_
n�B��>��q�uK���lWQ�n�6U�,ݟU�d���~=NRW�2H�nu��]��[ߦ����o[Q�b��2�6�;���/�A\�$MުwߏvwX�U���x�K������/�����V�]�e��R;�Z��+s_[��ӕ��L�6��M��i_��&M�����z�=��l��0�p�iL۴�K+��n�~n�n�u���(��+R�]�n���_�?��
�]�f͊%�.�nł0��K���=��39x��T�~{�}���x�����r�����y+8p�����}Q�v�
_�j+�\�~g���
�hm>ͮM%Lgz��O����nߌ-���w�Ut�6�ӧ�(T�i�����b羵Kw��@3��f�vo|�z�۵]�f�ڵ���/[�V4��[�gݖm�l�c��_�a�[K��H�୺
R���
����*s/�^ν|q���糮*}��XTi���M�}�+W�Ky�?O���6]����<\���
�$L'-N�I�
<��'�i������u\^ŕ.
����]�Ӧ���Ә9�+����W�_~�Ti�t>�ۇ���KR�_�z�A�.W�Z�Zmo�߶~i~�]��qj��ݱ�L�+�늻6�T_ϾU�T�a�����#ӹ�W\�mo��;��r�?�ݖ�ڪ��sY����v�-�T)^��Q��fz|����~�7gz��Fi���
+n������2�\����ȝ�8L�"}�U�__�����f��7Y�
��?V&iX�f�6˵ݭ�f�K������H���l6�]�͒�W�f�ve
+�4:�+����N�t7�"�������?
t;�N�s����O�w���vwp��i=U���қׯ��`�5i�������2w�3��x�4bؗn荭��A @	�4IH�v��U
U�S��5���l����؉#v�ĉ�#�����������;5S���J}�w��ܲ�
�2�2�����*b�Bl�#
�1���f��
�ngs�
�K���Q��f�)�c�'S��,1Z�J_��J�H%0�@?�̀%���OgG�$e/1[
�%�83

>��D��ψM�cl������:7IQ�V���>
�t�I�������6���:��>L';���ʖJp,���Fq�>�"y�T��c��6���i��]hfm
��.����:���,a
Eq�UNl�')�j*mH>�N&F�cS�F2��qkR�?���,�֖
��G*��P~ �%Ē��]��B�
�Q)@s���W���0s2�f��#JKt��\fL�
c��ô��_Gr�^��
ŤI��Q_�	a��j��`�>��+�k�4n�	0
q05�p�J�ۘJ]�H%��d؅�>y���b�eh�3z�j��8�>��/��
ݥ�r)~�m�I�o����F���dE��#B��d���P�X
ˣH�������\�#F�R�G�J[אJ��J��y����E6߽��K�/����CmEɸ�>��D���N�eh2��8,	&\Cl��R�I�3)�$E$
����/4�{99Nx%����T'(�d"�{�=���<Piy��6�RoRIB���II�NU�|�L�Ur�H{&�
�/؞ئT��u$����~��W�]Io�qFDzBS���X
+��7�Ʊ�H���S#%FkR�g�Jw�Jsӓ���q]�4,|�{�Y:�$���D�q��p�BS�(\6�sE>Y��(-�id3v�1z��
�)�R[�q)�m֙��k��
c�U���Zh��j<JxOv_�D'�d�E�;
	Ǹ����6��1���J�%�Rۧ~���8e�ie��:���G�[
lS
m�H�;
�2�D)�C��
�oM�ÿ�g�¸�.b���	(i����&Q�=N�
j�
���ݯi���TZY���UGG*��P>/	$�yHAX��LT���(%�Yh*��kkk�8W����%���
Mh���|4�

��
�f�/��z[�X�`��%-��II�V��<�a�t&��Xh�w#
'��NDz�tKuW
+�Y`:��t��C���4�*uñ�!��
�P�$(q�fշ̼���`��m�<�����j�6�Lم���\�`�'
�Ts C����%�dJ�n�&�pv��B4;��9�x$(:���]�W�t��_������S�������Lmbl�ǒ�L �E���w�D% ɘ
�E���ظff�7��|Dq	V��	��c����d0
+������T�Ir&u�	�ݪm�ͪ
[a���V�ɱ£�,���b���
��o]Y]�9.�7*�J�؊�!�!�-��L�'H�u�m�e`���d�v��e"۬[� ����m�B78�X]F~y{����Oaa!0y��f�G"���f�ϥ�A|J�A^���=-5z�)�{�T�Ũ�?����3��|T�{ss����������J���c��q�e�C6>��
���N	�2Q���u�̭h�����>C�AF��cd1h�
���Se��I�N�Ō��:Lj�Ju����UӅ�3lU묅eo��QÏXw'{��r�T�Ln�L0%jw3\j}*�X*�T
�r}��p,�/��`�tzg�8B�s-3�-��D�e�����v�ms���Dl����
+]��8).�[Z��k(I
+w	��pa�B���ӣ�~k�#Ә�8��g{-����PN' 
C�B�*���Q�n5*�Y�􃯀J�v�޼~������q8�J��|cp�"���'ɘ
���BWa4޽{�
�}5��|@�	^3FC����d�&
+HpX

&`�lQ2�5d]�gƥ����jBR!ժ1��	H6�6��(42�uF}�c�Gݝ젻�[�	ft�F���x�B�R=.e���T��&T*
��wvt�({�L
��k��J�o�
��[e�e"��뻪m��`��A*t\)�ťL(��-1��E0�/Dl�����K6c
s�(#�L�%-�RC�ԕ�F�j���tA��Kn���֥�?��
+���J�v�ݺ~uuyqn�V�c�\,��E����`�/��d/�$X
3=������������_�t�|�q	V������cH�y&���RF0a4B2&���I=&}�'.�r�&[5e�
+ݡ6�0� �@�mz��~��Y0����d�C����@�ۄ�L(�;W=��|;�K�Js���TJ�A�D���p��2�L���D�\�,cvip�rǮR�i��l�ش�l���Q�
+C�`���K�A.%�����Q0B0y+0�nF�F�
��2Ʊ����q���l���#K
�y5b���@��K<1Z�J�*�]��s����
ܻuccueq~fj�:f���QL
+�$i"Y ��Z�Y�*�ƽ�Gf��1���0/�k�3����d��I�%\J����R�$לB&Iw��#��V-��w��0��
+��B���q�xCϴ�,;�n��mk+�"�h�Z�N7�
��RZ����W�J+K@���Ra(�������7Zh�2f�G�F�U�2ey��mm��m��B����Q4ƥ��$o�Ha;m��vf̛q����G9�NB&w�yI
c��}ݍV
g�A��I�`P!�ML�V�t�Z�w�P�_�J��߾x������֮,-�NON��a��H
+��`����Hh.�8
|������Ӄ��gј��#�K�54����ɡ�-��!e/tW�*KQA8m,�P��,���ϤAL0�CӭZ�d3���	��B���a>ZݑSq�oT
+�:���w����B*t4¥�r�K��B�u�Rut�\
���0=�<=��I�l�#�<ЫT�y�&�
�o�g�Dl
+l�U�r0�8O4��:���P���n��
z��
+3�g��3�iNgdB~�E(�c,����r�]��ƨ�QmJ���A�b5Ӄ~
�R�H��	5Z�J�*�����޿{�l���;[��W./���&��%�$eK$2��%��	ܵK�2�ˆ|��xx���K�Wf����!��1���$e$��,&��\ʅ\�Υ��R&�\���d����bIa��������Y	��z
�+�ޓ� �J��6
�^�Y�I��
L~�n�K�K%����M��L�::R.���%�:����ިݧ��/ql���#��CY%/�Gls�����ؤl���.ty�K�I�D\��tQ��v�a����-	2��
1[33eg:=�s���32��b��yI����6~J�V
[?#5j��1���85��(ڞ[�8�k)<
[�J�
����������}����϶��ܼ���4?;�X�o��d
f�D�"{1��G`-�H����o޼y���;����?���C�K�5c4�3��>�IY�
����
+������s�
�ڈI
Ĥ
d�-նU��d3��L:~��
+M:��_�|�#b�Qw�����}�A�	|2`R>�jw̥�%�*��C*�*��TJ���
���6����KLRgU
�'�S�)
��c�Qj��1�7��=I���I�9t6�
���Z'��@���d%aR	�
����c��~�:�(�Һ�
��%�~�;

0
��0\
v|�/
�p ����
�6���Qڪn�^T硩�Tj
��>��R#5R+Ej��V��gt�����;�
`
��Of8H���Z��)b
i�d��
����y�i|���� ��8�
,�����޵�J˪���jx��j����:��a)��**��?%*���G�Ο>љjn��VW�XҥJ��dv>�$�
a�I��pD�"c�TƁ�����K��'��
��>X
F8�d���bp���8�|\�hp)C$�ً�2&quRf$��$�H�0��ΰ�
�{�:_��F>��}�
p�
�]�9�l2'�ٺ}�{��p);��zS����()<�w���=�rsw��F���n���$�I�P�z�O 	��8�p�G����6ywz}j}��>t�3^�$[��<���w0��ک��:�p)lj�uV
�����aRҗҵ���SfL�=��(�I	�r!�)����=T{��������!Q����(Uj�P�Д��Jqh�aa�w:~+K��w�J��3��#��.�A�7�Մq,ɫK >�#�Aw>TxF�j|��v�G�^8�|G

]�2<<<�u����\A^�k0ی٤=�C�#�9`B6�hT�򶥍˝Kk�b1i��I[�-��jIV�nn	�0���B��Z�2����"���>����G��/ܚ���d]Lރi���J��0˨��6�R�ٓD��h$\QZt4��r�ΝoҵDo�6���V�I�PA�/�i-S,ӧV)��U�qlîѶ��P.T�s���Ԋ�B��ϥ
��	�RN@
��1�c�%H1�#���"�S���c�<�3������
+� ,�2*��d�A?�R�T�Rj�)5����&�
5
,e��QT���K���������/^�*؞L��q,��7�����É��H�#���w	�Gp�0L�`
���
>Cd�mJ���I�IN&
���?�_�&xn?p7p.��2
J�����.��
�D�Ӫ2
8T:Ch�yLd�Fs�7�T���Н<�\����[c
'��B7��I�-�KK�KYJ�E/��B�E���g�� 퐖A+�V%��W5
Y�*qz��GL#�r�]�X�3�6c�m��Y�s���:�:u0��^J*�5��8�)�9y��*�jL�r�O��p�Ly\��_��@�%�@p��
�U��m�pd�[P2ۊO�0�Q�bj��F��(EM4�O/��-4�ѯ�J��T�S�)Qia�έ�����9{�����)ZWSUY^&_R���"��0fCL�����${qT*sGd-��,u���7&'obn��'''����d�Q'2��Y��
���q6�_\ٱ	�K[�hsY�Z����K�&m�;�����+)�
+{Z�
$%�����5z��&uoc޳�?�YwPJ�n�!ܤ�L
&q���n߾.��"f���)*
�J�ɦhmU�����r���7��5Z�!
+
}&�������mk��WJ�Y�eh������:]߸�@�������3
+]L�J.t|�F����
��å
;�-(�
1�כ+Ep�[S�Djkk�0��
?EO�� �)�M�ŚK�>,��x�L�
�%�54��jTZjԽ�Z
RdR`�RMH�F3`��S�<�O�s�~��G?�h���׮���;u�3���G��!Yx
�$�3KK!�6�F�u��%ً���$Y
�"W!�����
����'�4=5��$���8&DŽMd2�Y��Q9�����l��	�(���
+�Wr.-�$��ˤ���9�[� )
+��Z� �ž���O�u�Z��ϴ3�R�#;���I7O�uu�R'�&X� 
��y���K����JO-*u�'�
�Օe%�G�#���r�H�v�+���J��6�b�������5�*ӖcL�L���(Y��ɰMz-�^���cu�b
ޜU��m�['c���
�x�I
S�2I:���Fhb�X�LS��/�
�F)�)�)��L�)�$1
K�m,�*��h����}�!����h��`1X
�i.��%IC
�o8X��W��J��Tz�}�Tz���o_��@���'��'�
u��\���R����Χ���Dž����R<�d!"���33���we�Ѩ҇333�K��6�$�@r�x
y���;��	�/�ů�Zz6��%�K�Υ��R�Q�n�W����3I��*�M�d�j����:O��^��
�
����^d���S����
�A_�Q)H%[4�jT�!�^u�f ��<��~��"*=STJO���;���o���,/)�/�+�8�{����$^)�
�
�h����Սu���
�R�Ҷ�=c�md}؟�>s{�Wp��
]��N
L���k�m�s)Dž�'��I
�i�R�L*�Z$p·�)
O$͘�����g�q3%ri
���_I,��%�}��� ��Pc�JD�"[�(�1V��+��� 5�L�F�*ة@Z���)��e��k��L*}��g�~�����{�w��`߅3ouuб��h����e��!I�`T�5�P��^��]��c���ߟ����_XX��
�d�~17�����;i�&2yL,�;�����e�
L�����k,m8�VK>&y���z����b��I�-E��H�#�h�N�9*
�F��Zt~@��7�T��dg<Y�n�=�L Ss���t'8�{�?�V¥��s�J7�J�;Z���pEi1� �9q�g��}�Ҽ<^)ZF�
+gR�1��"W#��y��]F�U�2e�o��9���,Z
w:mFz
+]���5����SW��Y��˥
���w��t+�wJt�&�������	Do2��ښJ��dڃG~I����d�L�h�W`.�$��ϋ�u� ^�1�缾~��hQ㐡�P����h3��b@
!�	5n�s�@��YZ��h�^�F*�WQ���s_�>��<�?=59>r��;gO
�lK6�K['�
�*��*F�JL���$�K������K	99K4"c-�R>z����9�����G�
�np�$�,=�
�䛉O&&d#L
���^ĥ�!��p.⪼��Ci)&�R���T�$
+0X6��"�n�t"���0�>t����=k�#�u'J!��'��i_'
�p�G�A{:�4�t��Ԉp0��mriK&.b)'����,Qi�R����;S���HU��)H�o+�_�IG�2�(�i���R�
Ǩb���K�A$:�x��eh�X�w��1zu�mP2��I��������\�q�
��K��Nc)J�-(�ٻ����h���r������
�
<�;<�����A�L��L"���
��K%��V��M���������s*eP���Pn���X�]���m�F�p:
+7Vc�|<�J],���-F6P�_��������_~��}�����'�
+N����;}�RX�?�����}��Ei]�u��Y�**
+h�E9	*<r�3r���炢���V@�bm����ڤ]�&��m�nY�%K�,Y�w˲,��뺿���ypn����)��y�s߿��\S�����+TѴ�)�OZ�}���,w�UR]�G��E��7vttvv^�eG����%��xj�i���Db�
�0�#�����������m��jK�����e�dä�n&ͥb#mMb�_g��
���Nյ�aM>;�8��|��Y�h��2]v��z�v�g�p�'���|�B*SvV �}A&��Cp�Y���L�O%�����W*�	�:O� �v�V��6�&���.m�be��% i6�4��
�.�/)�E��H�9U�k��9d$�[�ҥ�QM��|�zDr�
/(�mB�KօI��n�!��#��C�%��>i����چ�X
�m �ƒa�i�_offf ����=�����e2؄a���׏���Œ��
���J̢cmc�J�]"������F��F�� ��'.#�d"�D��@������&��q��[s ���쓟|���w��v�?u��eoS����¼��Mi)�n�*6v%&�Md>�IJ`��%@��jjfGz��V)�:�qt���=vuuw���\���۫���i�['}2;eD�� I��&(��F��pk~n6
Sچ�$7����\gz��|�
+K��(�I��in&�
���M�\�Cu�E������y�O��ѽd�ݲg���r��q��[���.�&{wP6�57�L\�S��Wa��&� �K��KO�>*
�JgN
nٻ���� 7�iCҺ5�+��Jٳ�
�3gN8ʚĘa\)#!Q�����|���j�S��"{L��>�W2����Q��|q^�dd#hB���

+tN*�/���M��Kr7�ق���P⽄J>F5��(ې����xsrrs�0����G>�rssr��pdر����W('��Xz�?B �l�V%���S��f�6�z�a"~���Co#�l#W�@�N`SbJ��15"�����9�n�ig�N��=�Jw߽y�rW�`�憚ʲ���-��� qqq�W�? ��D$Q`�"0Dx�$�%���@K+�EuqGTdw����ᅡ��>�}}�KqJ�IQDF�!��LL�L
+Le��<)L�K�PW$�$��֥g�y
X
+U�<Lb`"�~�gR����W������
+�gh$�ba:U�1
v��aba�sϥ^g���5��=#�����{e�]U(�gen{�ܸ����b
�

LD�EE.`2�s�9�B�%����P�T:"T*+�ݲ9-9a�1*�Ο2��H21�YXRF��8uP���F�S�������9�#�k�v"�|����Ψ�52y]�
+��4
�x7W]�b��S~.MTTRP�UI��n�Y�Z-�������sJ�
~�����Ȱc�	�O�_������ψ�*�����
!�����O�6�����u ��ed0%�JJ�S�v�Ĕa�#/9�Tr4�OM�?�J�|�՗��ч���}���o
ܿ{G]���������4F��u���k	��"����$
+L�$����[�,�"Q]�#����7^�~}`��;z䏁�|D��SBh�NVc��ᶃ��LpG��
`���>.�����ISt2��|����4vQzZ�T3ij&EFI��;�kRjC5
L��
+U�\�Z{�I7��͞��gY�,�������޼�]�~'�����7
skU������b��)O�[Zjr��Xmo�K�o3g��[�����d��J�5��*
\��A���겢����)��W�._&o��
"� I�I�1�8)lG.��S\�F��=8�qH�ݒ�-�Oi��&����M�x(��@WZ���d	�l��T�p�	I��d',Ȇ���CB)|~Dd��%��ն5�A��o���������o�T��y̯���������
a�$��?A;����6�I~#~�P��c�*M��mL�64��mBs�S���߆,�\-�X��'dB1Ư5^(XzY��[�����A���T��7_��g������n]��p���C���^����%�+���^&11)�HB�
 I.�$A_G�)"�*5�D[�(,���888xs�3|��P�&t���"��`� ӱ�P��!`�(/.m�o���p�po]�I+(��/�L2Ei2u��äg�����wt��&�|�C�X�v�Su��~��W��������y�o�~�'��'�ɓ	\�o�nV��Z&����tU��({[���j���7{���ݢ�ҳ�O�۠҅��GZ [...]
t�r�\��4�
�T]�a���0S���(�^�
>OA	�v�����<*��VTVUUUo����Ԏ=��_����3Ӑa�0�<���ĬK,K�{AF
f���҄��?�m���Z#k��o�Q�mT?�6��
J�4�L&j��
�;
+���
qJ
���	�J�Y*��B�/>�����ॷνy��eoscmUyIa~�� �����I�Ҁ$I��>�I��
=��~V�RIx4 4��h�CC�����φ��������t��hL$�
+Ce:�ڢ���^]Y.�Oq)%�]]�j����X��KVZa:+|���4I�)S�f�R��+��mn���P]��Ԥ,̝��y�X�<���]�H��c�x��;��Mg���M������nnr�� ��[&�Җ�K�..9��r)�.ME��O �.�Jo��knؾ�xkv��
I	kW���xQtttTTTt�"�$���$JF�8��]{����o
;ѮB���e#��wJ��]g\���}=�&}��%е8`b�ӅI[��@���8�K�=u)�%S�Ćg�(-T6�*��
�Eťe�Q5̷���������qfg��G���Z}}]]m
�T����y�6���oX���O#�2%DYz�Tr��o+�
�
��4"��F��lC-õ
��h"�MFW��+jے�:�':�q|��oM��)*��׿��?��ǣC�o\�x���#��w�`Y*.�;oޔ��&���q6�%ۤxU���I�׹�"/X�xt����FFFG�ݻ��̇j�xzot�n	�Ah���-#2hL$��A��
٘���/�}���K�F\
�ϳu�-�G�%?�&x��$壟���4�ä�U�_ɩR�\�W=�
ө;�{���
�g.z�Y4W|?���뵏p���;�w����|�U}^a|��mL�$��D6QD6APTP�
"
+.��{/�zAY�b7TP�Fm��
+Q�km���d�tI�t˴��Lۯ���9�}��rﵒZI·Lr/r�y���<��j�V���*��b����W�b���܍l`08g�Ӱdأ3��ƕJ?�T�9p9v��@��̾��`c�%5ye"4��'4$x��`Ԥ���Q�1q���I�E��:�pζ�N�L��d.k�|W��u�
��	�����a4!W���J��V��\�$��nZ�ӵ�R��x�U�i�y}���/l8P�p��	x�`M��߂'�
�-�ZmvLqqq	�^��-���j�+�ٽ��dڤ���O��,	#F?0�%~j/�J��:Dq��g��ב�z
�6����1o�f��Q{N@Ӗ��t�,�"A:~QL4a	ל�G�Q0��BF���5'��׿�J���O�JF�/��
��lm���(��,���Z֥��]��������f�ZMK�\��IR`�$�%_�$�K�u�<�Du�������M�[r�?���� �%�F:����~֘"�P�&�/rF
Cri���K�6�I[�E] [...]
�v3j��A^� ��B�S&P�ơ��*��J�p7�����\"#.M�\zU;�9
L4S��D�7ƉJ7Q��޿9p���~��Qn�SX�����fU��h`)<,44&j���8􂄤
32)e�EQ�8�U3�ZZ�p��,�SB2��[�F@�Y2�Lc��v��,�z"W]�9ЉH!��K� �9��z+��%�&���ܧ�{z�����H�FO/
��,8*�햖����W�T��SVZ
+_.�ȍ��(	�r���W%��	K��G?��F
F�ms=x�T�u�#oP
+
+	�����_F�`BK��m`c�F��Fo���4�($0�Ҹ��4a)<�\UG2A3��.T����~��㇣#CW/��9q�`ہ���R{Ѯ�-�T3-���Ry���Q49�h�i!	�B|�Y��%�$ ��&IY$�۷��GFFޗs�F�+>

f�$���N�&�K��	R�S
����E�y).A]˖�
b�Ki	eyxx<��Z�$�^����w�L���:��
L�d��D�7�P�0J�L����.�
&-̰�a�g��]��VOk��$�����lnD�����L
+L�n2vg�\Z��Hи(s7�`08����$�4�iTZ���ҿ�P�w��LP�
Q�R���C��u���o�ز)'3}���K��Q-懋AKZ%���^����EeMR-��Jұn�L�yOHfH?�.9&��'���Mr��S
����6;�:���B�H����
&�l
�I�ɋ��

����?`�����t*��.LHb��}+��
��555�0��}USS]]��� ?F*�등�N�Bg!,��H#~��)S��3�����3�? 0(XBi9j#^1	z/�(Q�p<kb؆�QUI� 6٬o�)iP� �W&%Pt�
���(�2���D�/@�_|�1Q	Q����^8{Y��a���Ķg��-�x��R�E
��$mܤ[��IF$A_g�RG"�@���&	F���wGGG?��s�
_�[�QBg
'!��d�/���º���߂7��*�KK�65.�K�-&Qw���,�"�AZƘ�R����X��+JĤ���jL2���$�T�
s��DBE�sž�0m�wyϴ��<L#>��������n���Lp�hn

+v�a�2c7�$c��q�K�T��}˥.�'*��7��P��T��>��\_SQR�s���,Kj
+Q�
QQ
"##"""I3LL�I!����MI]G�$��\�%3$$3b8�������e#�'"��M?�m��p�t9N�\�tD���.���%9Z������3c�9s�����
`Ö�ي�x�%�e���5��ں�������F�&���-�����\8UŒK�6��ęTK��%g#f*�X�0�4>�?UP�0V%.�r�h@)Ymc�3���6�x���r´����N�,�����,M�j��7E�O?��u�{�\<w��pgkS
�R�u����Ps7�dge�������ـ�$��d�5I�����,!/	$��l�"Y�9>|��C�G���
�Kh�u�pb�]������'�D�B�cy�H]��&%,%S��.���Rʚ��c�Nc��S�����3����9`R�+�TM���($51���d�V�	���F�=?{��~��h���N{���~Ӝ	
�v
�� ���)1p춸r�r7uV
��ҁ�p���FI���ҟ�~�'$���.��
��hi�W�׺k[���4�?���1
��h��$Ԥ��	���H�&�$�<��$�\1Kfĭd
9�T�C��N��l��\A��|�9=�I0��D�C�\�í".��D��u�5LH0M [...]
+>yt����w�����8�v[3�R�^{�ӂ�Myss7lؐ��%)��$c��L)����}]����%�%�t��i���
?~�������%����Md��LBaL�G��
+���������p�|�.�IZ�(*<�\��%��4��&�Uzz���͜ &K&-RLJ��P��y������la���iǮ

���Cbϴ����0�#�x�;�]�}Ԝ	�������:y��Q&��U�0r�Fa��t.�܍#��9o׺d��d�T�x�T�)����
���3ǻ:[�U��vo/�����_C�hq���	�W(&�H&�`:�(�$#�z�pN-�i��f4�<r��~:�l��N�M�
�
+
O���@'�SY�˱���З�W�tp�(�H;~z]�꒜o��4ET��^�Js�B�u(��������	�G�jn����wttvv
ļ�9d
��������ho�#N0�Z����NuI`��AD����zY��`|���t23z�4.���j�W0�r�6�$�q��چX��N� R7""J)R� ��V._���4����3m
5�m�6�[\��h������ˢ��b�����ྡ�%n���(�*�Q+��h�Z-Q�1�ɤ��I���v��әv���<�����
7
�@��!���x����9�:��˒��񘨤4�/R�/���?�����T�(x��3'�
>X]U�s�f���
�%d���Ԕ���)M!I��-Sj��B��#G��,E^獸(-
+���%655��r�8��uF8i�2!�#��
��Z_�}�V�m"%�i"�%%�m��F�[u	I]IK'>�,�ҕ�
+K-_��(=�(�E�{������?`����/�5&8�f2ujz�ɐ�P-=��%	V��tԯ�	�͞oZ{�����z��ڭ�_vf�����1�ce*c*(v�I��,eo��R���������2x�֪�R{S�,&�	���BH�������N�J�۷lX]�d�������(K^�y�!�Ac8ADRXD��퍎o�4]1i�b��
�\#�%��D2��[���-{l�H������lp=���J��r:&}�<
+^
�C�#ҁKr6�.�a�Iu5���ĚW��~�
{��cB�]�B)�UT��֭'���o-)ٶm��
����?ڎS[�R$lZ��<>�5{:
+����RTx�mĦ,}��wL=hs*�嶗u�*=ӥ��64���6ȤB�
Шېe`%����hZK0����)ӈ%/�����}�������*��޽u��[Ͼq�H]��ݥ۶l\�z�R���3�gf�������gdff�$1�3��d��IJ`
+I�W�I��"�D����+1�;�wZ?���Ԡ3�L<Rk��9H
�
�	�����3R^�Fq*�)���
	Ru�HK��KY6�Zז�<R��D(9�Rg�.]��x�W��~
~n���_�Su���+5I�+�#�$��+"��dz��0����}[�ž����z��ڛ��iw����L
+X�vW8�ͨ�����
$�K^.
�+��2x�:��.IFpR�����J�O�^WSU��xÚK�Ϛ��:�e�ԍ



�����GDF�u{c�t�x��JFR��ILq�$�$�K憟SZ�4�S���{[����C6gϨΤt#�΀����[�P�
ͥ��r����1�lv]r�G�%�@��D1GU��`���(w�8%T���(���#w��~w�����WTT���;�#~Z^VVV��\B4mڰ~-
�r�Y,Җ�����,��
��O�)�|_�0��q��Ͽ�m�Gy��Ĥ�Ln�����U�Q��m�r 5�D0�*\�d��BZa)�;6B���!�6gt{��E�+*�]����Dt�߽���W�<w�����+�w�,�]U�T�ev���YYӧge͘�=Hʃe"�/�/�i
�~	�|��;�ԅ�'<���+e����{����_Rj�3�L�
��:+��$�j��],L[6k.�|�8�5>6Z�%F>%-&�.?21�ے�'�-(IQ�м(u��l��}���`Rx��I`R��������j�TM"IE��۲�w̞e��ͼ���`��׮�n����ך�[#��HC���
+Le�$�.��
{˰�$}I��a��t��bե��u�	k�E�O��R����6�b���N7�^_�Tڸv岅�ٙ�&O���y�]Q�� ���D�0i�fҊU�ME�&�b
+�X�tG��B2Z3�S��t��q>	�tv���@w�'Љp6���-�r
���$�O����D;ì��]�G���K��Qg�UiTPh���	�l��`�r�k��w���W��]Y�gϞ���}����O�Q�M%\����f
/�+��cA�H}eJ��P�0q �(~�tY��$/����������pn�
=n�d%lc�Rlc���ܚm�2��Jlp����{�<���S�'�7��b4�`秹��
�
�+��)T�
���o>���߽���]:�����U�P�6���X���ɛ={V�̬ٹyhI�L.p�	}�&A`I�/�,E^T�ڢ��+�8��|ҎI�AgJe�h
�?JpG�c�7R_�}�K�7oD쓷))!�J�4Aץ1��DZ���ueLT,���I(A�x��|�R����
2��/�4|�� 0��`R���
Mj���P]%H��S��RK
�k�|_�Y��C?c/޹v�w�	,4isC(�)*�tЀ	�V\$}u%�@{���Ҝ\b� [...]
�t�ӊ9l�t�<�ŕ���}��q��V
��h�d��˾���:&\Uw�
+�K�驐�6D:��v]������.	�l(�
�
�r0&$�卍O��
+�V�͑LR��

�ݷ����������A�Qkkkj��aʠS%�x�v�֭�,]����jl��
<z����>=�wC=�z�M�o���
�t;t�>
���$ۈ�O ��g�6.[AB��ۨ�ۨ�"�LB���Ι����4y�TǠQ�с`tF������E��I����y���ٓǏ���CY*)��
/���+ȟ3'�3'?��-	��b�}VM��Oj$�-���.%�Ee���1��3��P̒B�)��ƴ�Da&
�H}�Kw����Kf�LK}E�ԥ��#^��T��٣�`�sk���}��[��lY��
$E�L
+	�t��c�YL��љ�p���
ՕI衖�9R����}9���=�8>��
�
X{�Gwk�	4�
+	��
+L�ݶ:c�\r)��R4��4r�28���U�l��%
�d�B�!*}���E��gN
k8�owi���V.��?�eI�{\l�����
�7:&6n|�ĄLR��S�Q�q���9uΫ�$s׺e
�8O�s>#��8e#��	tǬ@�H����U� �f*�H��2N��%�	GǕ0A.q��ʁ�J�aQ����fdJ
�X�


��=p������������?�;t�
�z��I�
��ZJ~��qh���}z��#F���mJ%qvy��Jݟ�
�m���前�$���@V�F
5�߳�u�h0� �jj�# V��!"f�;��;���uE�,��<���+��u�Tj����fT������W?|��;Pݕ7ϝ:q��e�l�֢
�N�z̟7o.f޼�2_�AU�Y��ήQYM�I��آ(bÊHEzQb�� �J/b%D�k@D�Ҭ��Ս&�dbI��:�Lfw2������s��~���
$f6�{���x�y���<	�k�%DMZ/C�.�&՞D�H��Ty	 A[$-֕p��r
�Q~U,��&\R����0	�S䍤/rFɥB*zi��.B]�<��4�e9�1��
��B�X��)�~�yv %.J21ʢdie=xȰ�̤	'O�>��u�;Bu@�¤��	I����ZRZ�0�{(m�,촖HZS,L��/5K~�P74�W�n���3�sk�ʄ��0��nL\�8v��$%į�[�p)@�ntV�=
�A�.��u��z	�BU%�Jou%��mN�6A��W/�k1�<v��}e%�
+r֦&��[��D��������������
�2i��I�
\T*��	��yqN�5U��4ҝ�tL�p:8�榔͵N�!)��
+9���C:1�#��|'���J]�KaB9ɇ�$��Z��r0�֎ˁ���_PhD4C)%
6\�aS�V2�={��W
>r�������s\?��������\�Ht�����B�y�������`�N�EY:x o�/�J�p�
�
��
<�f��Jns���B��)���|h^X�
��/�
^m|��1�4�f.m�H�6�R[�]
��1�U�%�w���hPɢG��*	�=��q�S�����M��,�*����=+Ð�������fMRRrJjZ��
Y�6�зW�I,0�$�K�� kK�H��#1_)#$풕&��	�)d��$��
���%�6���4�&A\K�[-꒧�,W8�d��0D�C�_��_d�9�:,J#m�Ǝ��4����������ߌI��<���`$���=vV�,���	
k�ge�_�F�zI)6856)�@��CU&c�ӑ
+%vsa*�Ǔ�����7�0ә
��E]z�!{�R�p
�(+��T����J�>�ITj5��
-߿k�����f�%�^��$�`�����7D�
	
�01)9Ce�Lq�
��IE�U3��Uoi&���c.�|���F��8�
��Da��j���X;Ύ�.q��F��
�JnOFC�^~_ذRP��
x�Ν7��U	��d�b%�#y��a���'Nb�0��CџN�”	N� Ӈ���K��%�ˆ�,���yw�5׃�}�ߕ����uT�
P�ꎅ�q�j�}�X{*��J�6�
�F=�R���#/�
^m|��1	�
3J�㚌��K-�
��rw���ٍ
1l�`�h�=^}�F��T���S�'-�(
+~�ݷϟ>y���w?�y���δ뎣,
�S�}��fge�5���
k3��seMR=�\�$)0I���*	HB[,,i���iØ~S�R�$d��(�I��`:��L�I�>�׳3ҩ��-����
��B]rv�6eℱv�C��w^K/%S�W����yQ�4e������9^`Rej�2D��L5i�nYC�T$�jS���=L�0�=���D
�gڽ��I{3e�y��+�{�L
+��UQ�z�ؽ.?Wǥ(����
�ndp(�
�պԏ���RO�%�C��*�.��O
P�)����7�|�|k���v�n�\��eHAY���BC�� ������aĤ����._)��GL�J��w�)��ZZ)b\�$ΩHF
<�yh.�6�hT�9��tf�1
t�pp9$
+Y7�K�,
�t�
o��n\��j"L���%�F\"0�I��Oq
U����Qv�&N� 8,r�{�V&$�g������(�ꈝ y��a���

F��Ӥ��hlhh��)Î���JJ���Ғ�[�(1�FG���� #
=r��AJ=�{yT�*���:������C��6dU
+	���m ѹ�ET�S�6j4�h�lFeuD�j��0��,޴�����1$��c��
���֖��h
��cQ��_E���w�ҳ'�)
޾��kW��O�,
ڇ�,m@���������dfee����5�{��L0I�$죋z$A^R]B[,,���hT�JpR�$%f�G�!�Sa�3����T��
+q%���ʼn�Ζ�em��Gn��g�%I�W:}�Z&�Ҿ(YHe���!�(M�8y���3g����

	�	�LJ�r�׭Wj�>YC����$����ܩ�I
k�秝�i�m��e(�f��zs��ʤ����
������(�d.-$.��S8psAi�[_����RwɥnJ�d��T��;��CP��
P�tөڪ��{v|�e}ANF*�o�b���ya�sC�����A�P )r���ԓV�NLN3H&Q
��LRR
j��$:��f����T2�l4��]�:o��N
+�.�NV�p)� �į�
c��Q�
"�Q��rɂ���1�JTll�L�4M-��,�OJˠnP�m;vr�]��W

����������z��immiin�'��u'k���I����l\����`91ʒ����I��F�6x�e`��k�=z�u�*u�֝���7h
�h�
�FhD�+V�6
+ %��>���
�/m���?h"V�S>$0q�(�D[�4$'Ru�

�'FO�l?�
2�
+އD���9���B��=�
���;�~r���g��u��G�2��߼q}QaA~^������u�7l5��s�&�c���T"!�
u��XY� ����v�gϤU�΄� 2h����RaB`W.�Ϟni�riAu3R�%�҂�y�HZNӑ�Ǎ�
)���Π$���(J2�����88:��r���

����]�L�$�w��L�yb��
+�.K
S��1���){6���n�W�ٻ>�ӑ�*-����֯�ݰ7�-�(w�!�lp3�)xOT�5!���%�K��h��$�,��J�T�T���q�Ƶ��4��V>����֗�.Ϣ�計y�a�4a��""��c�3�R
��y�E�$��C�tRV
R
z�2�S��$Ӧ?��d����F^O��8�.�A8M��0Q��\ڸ�0/;wKX��%��i�„r4�|4�%�^���P�p99z�����T�P�V%��J�e����Z�p���=s��s���\�}�?�;{�
;�N�˫�DC ۢ���"��rYl
��ٮN��

Q�Ao�x\���������0a�J��;�`�6���:͜��
��?ėwT�g���MlqײbGQ�ee%�b��5T@����@�*���,�X��M�h��15��X�f�l99g���7�

FM4�
�������/04,��H&5��DR��a5X
Rp�L��aC�tR
��LG���=��"F�kj"�c'P�
���o��{MTjj9�s?1��u?����'�
~ˮ�y�ڕخ��R�����������

��_T��5!I�$��Ֆ>$&LIl/D�J���*��o
=]\
+����d���GL��<���E��v�Ab�o��s)��*�=�ōϚ�5t�!,�y	,������P�P�1{���M�P��P�
?i��s�η]����]�N
�j
1ikTL,�}���R
柗�T�����/%XS��3���+�$t�J�_H����L<��0WI~��M�ź1b
q�{76+ʁ�<�VQ�Gj璉�y
,QE�5�0���
+*
jB��_�Jd�m�}���R=�q�l����ve�&�Eo��vUp�������e��?�e.�n
*/0)���q��hu
1)�v�W��0�**5��J�*o$��
�e
8e˶���67��AW��8�N2��\J�WG�K�P��
8�<�&M�
c5b��t4�K�\��u�(�Rw��C��-��N�2c���4�W�۰9J
�#�bx��ü
	���%KKK����+
����Rd2��c���G[0~�h|
��:)��m�͞>y���Æ�J�ݺJTj�ƨ����il��6��԰spr��
^��CV��D�?"��E�(��K�&�	%��Jƾ=������["��B��dFO�fF
�ϸW��]��ֶ���_�J?<y�=�t���[7>��������|�����?�Xّ��V��Ĩ���D I�I�E�!&�҇����d"��bwIޒ�Ei�����J�fZ4Q at r�S������ǥ<گ0�b.Q�ck��M#,Y1�	,�x
�^`(����v+��O��E���q_����4v����f�~��v�K
����}���5b'�R�2�S+f(�-��T�תi"�6�}�Β��?絠�����v�p#�u�V|�I[�weg���b��
������+��3�x�#�s��h�"�ts��<@;	��T��Z��o
���w����W/��T�^(>Up�Pޞ��dN>���%O�����������;����BfҦ��1q�;�D�A�#��(��#�d�M,����^�6��
]:Mey�L4u�����41N���J'�%{[6�D��t4`���|4�K�:��ԭ>���R [...]
Go��е6m��OJ��	5� 4�����@
��
+"5�t�(]Xp
s)o/�yr�����+��
���ƌ
Ό��[,G�J�~+*�t����A%v���_R�r�V��t�Lщc����r����
I�	�A�䔴�L�I�I���$*}����9/�_
��G�d.�X
��Z|ڤ6&c��Ũ���$�U.�\����~�k�:�
菦��x߬�S�,+���̐���%}(�"(��I�4�-{��ӷ�n(��4k�<�E�
�]=�|�V��Y�d�P�T��$�o�Hr��Wf��?絤�7��MK&	LU�n%숢BQ�����H\�B��w��|)�h����t.��[�sI<i�b��T����=*���]�����ǧO
=���
��bK�/����T�<<<T*O i�@��P�IQ1q	;Rӳr�L�Z
.�����E�|M�2Wܲ�e���?������W��˷�����R\S���/���ȕ.�Ϧ�K��Ə
=��Lt	c�F��u"(�T¡0�Y`�N�>{������Si��-ѱ�)�
�+��c)2�JC�[[[WW�wI�џ��jk)�5�T�V�N��K�t
��K
˖.Z0wִI�0̆
451�ս[��
;�A*�kמ�[�n�즂��&C
|��!kH��$�AP:Bj�-���"j�A
��	�.�|,>]Hc;Ki4
##�$F��Ǐ��07�i9���X����1��u1�������b,�_�P|祶�w��쬌�Ԕ�d���Դ���]�I�
�o	5^*}�`:��DT������z���%���d2��I8�
�l�r��R]m5ۋ���M�`��x5y
������dz�l�ҨͰ��e����[���Ũkw��>����
:,uvq���[�L���]�$F�Q
��qVi�t#I�jL$%���L�-=}�u��	o0ܴ`�t�(&�<A�F��p�p?8�.�ӧL��dIsi��y#�K
+.��	
+a���
��߽}
Tj��*/9w���Grw	�o�)�2p���������"0(���-�9����U�ItQᘫ
+$�}U�4����1P��8L|9������ݰ�\�z�|<i.�yfL�<��J���K`.�K ^g���J�`
�[Z��0eƜ�v��ܼ����شM�����;��U�
�kj�(}/�]���Ɔd�b�{��'1����D���,�tut��y0
��/
dگO/8���y�&�Ԛ����wۻ�#1ZV��㪵6G�S�A鸬��Ѱ��Q�j���j�1p�3�KG�۳3�1Z��3��r|�l�@Ӿ�=�#�:
+*��
��?�JϞ>yDTB�u��1�*�J�1��3�K9�Y����YY9;��ܼ���k�D5�K�
&�E�Ol$�.a.�YR
�`�)�R��d2xLX��Q��/$#5v���'�QS�ݝ������0<l��B㳷�����K0�^s,����XR
%�6m�B�Q���ڡ4|��h
���g�?���~��27���A����o�ܲm{l��IJ��
e}��$Q��
�
*d~� �R�gz���O�t�
+/�����
�k�t�(�j7���:.�R�	��swq��-N�KCE��St���s��D�
	�R�
 *Y��~�*	����P��[7>���NSq��٢���3_�AY�i�Iv�1�����QQP�b/�W�J�
+H�M@��
T�GAAD at t�E
�u�8&qW����Lf�}?��5��I�}f����s��\�����7i��|��yz���sw���|����Q&��g� o
+�LB�����j����5�6f�FN٘m��)�S�԰���tr0�r�\����m��$Φ̥9�Lp��gk-��]s���&1�x*!�����#��N�:��i�JWw��H�����;��b(�HR�C��F�޹s�^����ޡ�G}���\*����6�LA�mSLD���������<����w��];���
+*}�T"��	T�XP�S��F�LͿ�r�I
��sI
L�
�Y
Bt~�PM�
+�^[
}9���`b.�E����I����zk\4ƒ����Ѽ
��r4$*�j)�#���I�7�
��H*q|�C]�*1�Ξ.��#;3=-%9������HI�$�IyG
��1��)ݨ�OLT>��b/�\jciG�+�ƥ��M
+�4`�����>vW�5]�K�DT� �u�����p��R��`IR�!�>jJ��ы�PS$S
+(����Ci"��lJ�V������
	���ۼuǮ=�I�����
��H�_C}�
�I�::�z�ӡ�V)��O�k7�M�N����j���$�vQ7�f

���h]�L�{
%�$�KCi.�h7o�K�%~-%�s
+*Qo�Jw�J�ߟJ���
5pǕ
g�K��
�V%s�
+�F` ��z{y�������B�"�$��G�c9�R�$5��?��e����چ|�H���8��fZ\��JOK>��J�s;Չ�P1���\��0i<�]�Zv	3�Gp	`2h�P�h�;uC
c�
>j��i��2g7Oߠ���J��'&�e2�JE�\�,@�
J��Ꚛ{x��>�������>�
+a���O�?v$'#5)A�eCTX��'σ��#�
���ݫ��
�;���J-�`7�dfޭ�eb�q��Ά����J{�'&�H����SgΝg�K5�6�F
� <�+�S���<Q����N�c)6�^�b�9ӧL��hcճ{,G��)�~S�$����3��z1�n^��T/X����LW���$''�%'����ҁ$�$���`�S�ϥOm0�_����k	3����1�t�LZL
L���/�}��%v>P2W��K��|d-/7�p��Y(|ㄱ4X26B�i
Ko��_%��η�)�I3j��������4Ci:
�EKW�r]����a��
;��W�� _�+f(�+w�&´[�/���BWg]�_�Ƅ��]^nO�תT���ׯ���.�ލ͊r��N)�b.���4��woK��qԼ;`.��\�Z�Tk��Tz��T����� *=yT*ݭ�q��ӥ'
+�|���Ł


��������&m &�ܳ7>�@R
+�����0I:��1O�����2���v��
+��`�.�s�w
-;�*]B���T'b�h.��0r��͙!�6l� {;�>�%��u�x�N�f�]�[X���7pȈ�� �-wY���S�PjF�%!
��6�/�����xt�T[Ky�4Q���3p}���l
+⽻�o���[�f���i�ƍ>��mK�R'cC��m�J->�Z3�L̺t�����G�G��_�|5����m�ȁ'I��������P��D�2��U��H��Ù���x0:n}h����8�a"�#rϪ/G�6��0*U���]��W/�
b,=��T}�Vŵ�g
�������HOW����T�t)+�p�|dfQqI
L�x��N�>m$�_�����8��[��i�el2i18�ґ��
��{
.���࿐w�:ϥ�[�b"Â��=ָ�\�h���DZ����'McI
%fC��6���;���<��m��4d����M���`���+]�xx��F��ݸe��/
����.�oS�jڡ?4ժ��⥎�����ӧTc�nR|9W9!�`�p��\��HpI��$z���(�8?/�5��"�0�&�3R4oqܼ�P�x.I.�j���Ш����Jc��R���3.m��UUV\�t�LY��Y*|TrGDGE������b&��Q3��RTt�B��
+�pR�1`ң�lB�O�[��;YF�5�4Q�p�:6
�[�
�
��~�[�!����A�K4r�LP�]���2qy.a/�32�LQ�z�����0�a�\��+]ݽ¢6l�T:����=Zx��b�:�Ǫ*���uuh`�`��~���@��
P����X:AA������96*����e�����O
?z���v֖����T��R	߭��I�.�-���2b̄)3�"�]�݆�p�5��#j��V�ASj�I5d9�d,��Hciۦ��`_O�UK��7s�1�r��hD�T����J/A����J�0�jk�nߺq�������r�dggeee�_v��$�L*+?s�
v�z<g&"S3�$	{�ݥ��N$���Ѥ��H
�$�~�`��H�(�Sy)��Q9�P��ZQ��>�kW�\���q�
��`,J,�mK�B�
(�3 at n�'vP�ccg?`��#1��L�J�Q�q��}���+�����C��_<��R���V��z:�y�kDw��:�@]
+�V��vO&j��K.j��W�8��\r@�
�K
��D��	�ԡ=�$��J��5��T��
��
�x��!Q����/����������fĖ�b�GE����ⅅ��b�6m�LJ<�����
U�I��H��,���\漏m)t<��KJ�#.��gg���ݣ�K���Kr���.1|� ��|���<��%<c,%S�e�z���?x�H:��WK��<}�£7n��S)'��D�)�a�NJ`���x�t�T�e�N��՜�W/]QO
���H9��έq��h
�X�4gƔ	cF
���ʢ[3���0��-[J*��Ϣ�Q	�к�A{#��َ��0��I��i��}4���j5�5�Q�
j0�e� 
^�Z*/=q<
��Ҏͱ�!�^k\�/�?{�䱣�
���-�����/�(�+����n�=���*�;H� 
+"�;kA{�],(
+�
����`C�^
�((*J0(vE�5���D����{���f�tI��=����{���=��J�6>=�Pu��^<��i�ҭ�k�5�K`(ȥ��SY'�d!�rIŧ!�	L_x&,N��5���.MU�i7��ƫLM&
0q�b\��@�����K�`�UDJ%���l���v�2���]gM�,�%���K�Va�W�L҂����3(QL
6Bo���������8g�(-Y�j-�m;�%҈���D-�B&՜���H5I��Vn�"iI�a�Y�Ȉ�]MZ���U&�0aX;/��[�A8B9����=��Tu���q�
Y�����@ueu	��ӕ�ԋ�4d���ǡ�[5�^<�������ƫ�/��)��O
�8���U�e�ݒ��]AA���AA��Ia�rEL�
<jZ��c�YٹEpTm&�E[�֫BwMm���g.)*��h�F4б�t�����ܬL�
�KRHp��֭�PꙎY�U\#��X��K::}��D�741��
3�e�
�����^��-04<*6qU���Ҋ3�8f.|-�!VH�ǚ�����/�WGLm��?K��9q,�@Jb�<,$�����V-]4w��I�
�͌G�
6h P�'P��'�R��:�

N�>��y2>�e�=��n�m(�8f��6*�i�+��m�`�%	
+,�BMuT��S��hE��
>�֯]���:s�
5GC�C�9���'P��ǠҫR�˂\Y��/K-X�n4����D.������
+��+��5L��&<$AM�Ĉ���#����nD�ƋL�L��(��p�*_��RS��ể�}�l�����X�X�BX��saYҜϴ���=�5u��H�4021������2IX��6o���&�G�%$�KE�:���G�EL�#�¸�,ՏUHK���Ϟ�F���֞L��tK
�Y2`\�c�:+gp��@�[6n�%H�`qp
+Scfq��������%�nT�@ݰ�!��O*�*DM��$�g�㏭�
޻s�������g+1�CYJOۏX����I�vKBCCBBC%@�,�gRjڡ�G3Of���(��I���yJ��
q�1;v���9�x����T\*�H��5�u)�\
J���kW-�XDY�U\+
ScC�d��ȥ��8%�J#!�YXۍu� V��}��M>�A�">9� U%eyչ�:�ҵ�h%��[Ȁ[!�i
|jen
db��:�R�Y0�¼����'�c=��`�����L���8����`��@��@��<�:}D*u��%R��N?|��2�����}�wI"��$cq��m��m\�m�l�mC{
�
�
<$
��T��+JK�sN"�b�a�;��9����8�i�����C�G����K�J�>���R�]�cT��૗?=G݁�?,�u��Q�\*0�),**.A$UT��̇�YO��~H����F��Hjm	�����Pc��T`Bo$}�؇�jd⢺T��H+iOL�,,$���{���V��Kx,�Ą
�TwLR�ǒJ�A(aQ���
��z�706���
=v��	��͜3w�"�e�(�n��;<R�')��W;&5PZ�j�L1$	����޹g�_|;w�cR]9{p� �
!=-�
N.
���﷕ե%���䍧��03ƈ X�����k�K�%��|�?�d�A��o!�� �^�x�gP����ܺ��_�t�ܙreQ>�5���=q1
+y�,<\*
�J��@Rtl|B1)���r�
K�etT��תNq��7Ɉ�M{��U�v�T`��]ݗ�n%E���t�t�&�B���l�ZOG�,���ގ�
*.�%���o?�&3=#S
���'N�5��c��
�}w�E�$���NU������A	`}�
����k���9���U�G-
����T�b�=z(u�h�� �M�k���w�1�������`�p��R7��.Pi����4G`���;mc'l#6!� �\����
��)�6nwdmm�h���Z��ː˫ʕ�y���qQҐ�m[�9.��8q�X;+3�Q#��������[F%��K�,=y���
]���K���R��t	7���R���5��.qA�L�$�I 0^_L^*u�
�֚Zd2��@`�j.Q�k���:_����0��X*k����
��%����d�a	:!`�+����Xz�z��QH�ehlfamk���<q��Y���E)0X"����Oܻ���
��E%<�.�LԤV|�
�D��Z{͚{��{G���C�:vs`j�nLk�A
W��\**����<V��
C�;$HX�(y��9����431B���
+!�w�^=�/�`U�*:@@����P�$*)>
�(����Z
ܽ�܄R���,���f
/*%)!>6F%���ˣ IP��I? ��
?q*'���tYEU5ǤF�)c���q�h]ML6��d�ҍ0е�rns\��|��V�Ě����%��$8�����b���<VqU7Ê;���3 �Ģ�������i��-D+��3D*�Mܗv�x+�/�742��:�/X�Gs��SF���З�q�u�ɈO�d
�8���k����kW�/p�9�e����������!��sT}L*u��R�?PI����v�ӄ���Y��[�F l#.i���ǩ8��� � (���6�Mj�0A��VW���8r(59^!

���n����fO���`gmnd0r(�p��<�:��T�e�*KmP�4�t��T`*/++---+ UT2$A��T��h�-*&�c����RW�
R�'�"SI�_�4�Ԍ%�*d'�.壴 ��M�SDJK۶"�V�dc	iOİ���^
K@��r����g�y�e�QF&�6vc
�\&M�1���P�V�Q�0�<:.!�+��"��I�ך Sߺs�!_�`�T��}���0�;UMG�F�L��̓�	��}.vkq�:+�08���U]Z�
���qcG�X���#���}�.�pz��?h(R���S�_B*�:��8
ܻ}�:��@��Ae b���C|��圯a��s]c��5s샤�T�R*��k�*���$�$[�� ����Vo%�}�JhO��i̹0Ɯ�fw�,���-��]�����u��{��}��L\�i2�qg��'$&��i&]�TZ^USw����zk;
��]�Ib��Hq�r%����
�z��!Ёr$�D��؀q��2� �%7�оH<Z�_�5�] [...]
+�
��
=�g���|=ݜ�̌�u4y
Uf�B*M�@Si�_M�1
�&"��J��ź�ͭ�ݽ�6R�8u6)5Kx����q�q�1�:�@6=c��%��T��	�R�c�>�{[�&W
�ez�j@%E��$�Jc>�h�Ѳ�%ȃ��{h,uu.]mnjjl�����Dj$��wtv��i��<�I����b�%%�?F�*㒉&Z_
�@]�� u�
+�H9�����P�{��9X�C,�*�X�0��_|N�]kŰā���(M��4o�*OCk��������������Z��M������������UQU
�Z�I�d���J�H�I�#r�E��������%���Xw����ȥ
�K��Օep4�T�gN�u)$�$obq+�M�
��hi�����rӦ.�` J�� t�k�BL,m�J^�J��J/��꠨4<48Џ�
T}MEiq!b	>%%)�\B�Y����s�����$!0�������2$
�I�e0�X���
%#-
��
�D�!���.]oi�8QQ��%(�&����Y�T\�f$J�-��;�p	Gq��2V%U��6ذ�
+[�U
>�7�n+;v*>9M ,�T^�U����v߽|�/x����z��9Z�Xe{���6�W3���WQ{w��y�9�[�/��Y
T���1C��H%���Ti��Cst�^Hm�4n#�����Jm�4�:�@6=�
��ҝ[=�m�Vk+K��3�'ĝ�>�%��WG[
SC�%�@%e���J�
�JޞJ ;QY���g�:�f�a���t����B�6D�$�|}�T��d�H`��Xy��I�IL$0V_
.
=
$q��u	"_5�H^N(�ll
���@�
(,� ���Az�0E�4��!��$QL��J_N�>c���Q�����t����
+{G��k�}�7�n�+J��‚�b�D��0i�g����*��LLj��eF��H��g�8����������ڪ�R088�X]�
������}��J[+
l��ښP]�#���H]�<	�L(�;*�h*9�ET���ݷپ
z��Gh��
+�9���T~JrRR"NRr2 )-#S�C�TRVY][L¤��ӋAc
�Tv��EJ2/�@2��=б�yL�4@���q��d�|r5&ܻk��Р��k���1Qou	�D��UIm��%zˌͬ윰�n���@���	)���K+k�IU��?0�M	V��/����!���O�<���VwG۵&R�����S���
���{��Jk���@�yH��_2T�
�4���[��|����f�
2z�6�F,l#�Q��h�m�c���!�ˠ
���_)KW�ˋ
r3����
9�g{��
k=W9�Y�.*-TA*Me�4�R�S�~���
�.~^�^	�ȥ���7n\��?�m�HMBӔ�$*��B���FsH)��$�0L\z�|j
,��UYv�0?7+�|R<b	�Fc�����Ҟ�&Ou��l%���
,}Ķ%v��4n��I
(�!!.]�����v��*wO�
��[�w�ދE�U����о Rs���5�p��/N�����G5�W.��7�
��[�D\b����
�y>	�X�b�.탺������������P_2�:&o�Y
+�t].�J��f̜�<���)M���J������1���񣇠tR� �\��,��fge������a��Դt at Rv.ͤ
+`$
�I���AАdW1�s�p˷9�(��4�H��8��(�K�)&b���v��
��c��
%t��f�
� ������JP��5 ��[�;�y���y��	���������+Wo�c9��
?y���v|�b�?QO�J)
��h�כ�*K/�g��$�>~x��m!���]�J�@�E�H�,�>y/T����<RIM�dba������%��ȅmT��6:�m ��a��b�m�@�
�K�,�� �/]f�&�=y���
a��<ݜ�,͌�J�Jr�J�oL%Ye	���g",aV"\�����h�����s��6�$4M"0�$R0)��j�H_��zc��#0Z_x6.��
>��X"J
|��+H��N
�������.�����&O
?�
r*YX"P�HJ�((A at T����ohlfim�����v}@PHX������IQJ�g�
.^*��"5�$��&���j��$�D_�a����ܼd(s7Z��\z��%�KW��*� x��
+��I]�:@�7X�����.��6+0zCu� �C,)�ĺ\�d��P�.'� T���[,F�
�J��ԁ�ȆT
��e������9ق�̌t����,Av�0����TU�Lb�Ɲ�~r�aR8L�Q2��qR3��F
+Lb�@�C�)p	���%(�&��N
?�?r�6��x37��%%4xj
�.͙
3g��<�J<�g�F&�+�W{��
��K䃕�W�7��vP�`h��
�т��L������]
P�ʊ
+r2�'Ğ�������`cal���TRR`���{��g,�	���J����j�Ѹ�3�
aaqy�e�F��6��Bi�e����	�hR�ڮ]m��,)��%ş�*j�έ��^nN�+�J:��J�
i*}�釠��$��e����K�Mbƽ����ޛ==��]�tCG��{�B�}&ȣk2���	;c�՗lqI��&)-1q0�q���.u�xۀ�?)!N
+KV�g���j��8���;�2�1�H�E�i_e����$�$-�JEiʔ-K��Ri��v�H$�R�Ɖ������;�;3�>����N�2�����y���y��pU&���5T�L��F~���aD�zb�O(���ҨϿ3v�xeU��Z���,�ΰ��o���e��/_����[�cA��r����/&�u��������J=�ԃH��X/s���ߕnoejw'_�q
�(��A�IJ�
+H񦺴owB����0�8?oO��˗:.��X27�����P�����\"ߗD���J�,�<�J?�Ά�
N
sOJe��z�*������i�RSR.◒�z	�����W &�WV�L������XJ��3����p�[���QP��(�R�
X�K(�X��ҠKD����ָc�`
����tIG
�D>�{
+���-tZ���!8<z{�ރ�N_H��+*���^Y��v\~6��q<��-���űA
.�ڌzp�je�87���SG����9����u)Ri��O��~0*	r}2Ri�tk�Ko�b��ӐT�4��4
�{�&�E�D.@��޺Q[]^B��xrRb\LxH��U.K�J3����@T�)K�{�4�(.5#������$)�$z`rL�Lp_�����8.�f���Ϡ�3��U_A���/����,��]��ڞ�
\�9bIS]UEYi���pɮPla[K�7DJ�rP��>Y[W��ĜB�~��R�����6��E�l�O�͊Rzfv^aqiy%TjʤFEL��jRO$�a��Q�WX
+dҭ���.y.��}���:����b��p�KG@��yC���Y�z�r�%��m�zO�b�*����:q�2`	���X���J�"cs���sT���T��+m�8�'�i0�Ԋ���
�RQa~nNV����4��32I����Rd�Ua�h$�x�
,U�zA��4
�����r^��!�o���Rq!-���=	qx>�~>P%\����H�02��jkii⧥
P2021�2m�� �@����
����ӳ!ʪ�ݸu�������?���p���w��+z�� ����=��*+��L�p��=�l�*y�F*ͳF*��x*
��T�SI�P��ڕ
>��a�;�«%�(��i��iH����x��4޲�Gb��3T�G��ݮ�~���0'#�܉�I��[����t*��*�jrT��Q�$�%
K�d@�@]"\055=�����"�0�;>4�
��.�w$��|�qa�\b�� V���E\>��y���,AA�Ahl Ҟ�>Ie�8�Ҩ���*�R�P����C�=��~���V���
ظ)<j뎝�{��D�@\"����������~T%�HR �����f/&�W��c"�F{7�ҍښ�JIiQ!�K�y��FGl	����ps]
��LpWSc����U�Q� Lc�P%f�&}P�潩�
O�7���x��RKS�;�n�JJ���y9��Y���"����J*8&1[��=�*dR��I�:{ns0V���R����!�`oO��tIRe"3=�v4y�
8�������}<W��:�Å*alh�'���2i�D��ƦV�g��~����}��-1q�Iɸ����۰��GR� [...]
+%
%S
�Ҽ_/rZ�������yKtl�7��
<|���
���+$��B�~�L�>!��c���T�HS�
I���!_Z�={Y0��Ο�7�������&��3��g��s�.�:��;1~{LdXhІu�k�W�8-v ,��Z���jkj�M]��4?%��@�44u�
M,�f̡�M��c��+��>(Ƚ�,�
������bq!�)/�|H$qQqI����0�6
�UR�p��N���"R����?\"�)��l���� �v��c�p>;��D����%��dc
�kafbd�\�������*YN�a=w�����^~��[�w%
>q�9\{��{��
w�*�����LG(�2�ؿ�j&���v<j#zp�ZRR��~��/a{4R�c��S�J�>4�F~�S�̊�u�RLܮ�d�����R2��8�'2��f��s

��u|��'moij�S��x�<Pi��X��Z��JS-T����JK,f;IQ�����db��vJ$�������
(%�yb2&å7
�8]�ӂ@�˂�G���a)*
���I�d7o�̩��F��Z���KP��SY�4d+J���Y)20"�pμ��\V���Z��=>qOҡ#�YQ**�TV��޸y�2�����b&�Ф��w�����CW�&Y.A�f���r�.
��۵s�֨�M��=������P�`	t	�`&)+�LTU��*�ZL��Q)x��_�J��b.
e��1�
+j��
+	p�H,.���LR^Yu�c6
n�t�]]2�w`-��B'ht|���\V���ji�åa�8|p�,2,k�`	z����`���KF�zz"�H�@��hv
����6E�������˹�Ҋ����`�A�*��~d��
�<w�Ǿ8�\\#��
�^)G*��=~�
��C�4{��J�?��P�v)���PB%:
x�8�����L�D �T��9>l�{���JTJ�p���Ҧ ?J���T3��@%��r�A�|�IG�T����H$Dդ>�$w`�����b.q�%�����@�{��`��0O��X�R�zO7WgG�s�gXY���h���(�
Ow�x�
�X.

�B�O�2���W %Z�
��J6��

���t���
ظ)<��̗wP�g���Lv6�Y]7�fM,���{����QA�*�"�  `�	*6��r�
E�M4Q��$���-߽߽�K5+�3
�����9aQ��$��g�:s�"o(�J�q��aדn�0�I��QI#e�X�<�x�vc	@��@c�weyiq!̥Kygs�y�����
�

��ߏ��K:�j*���
I�K�%�fϙ;OB�##�T�d1��N�J(��^�6���8�����
+o�*((���/ "a$��s+1�P�P�'�D
3>5�(��r4H�{��.��Va� ѠKd�%#�P��Z�f����r;�,\=4�TU�����UT�5�QG3��ut�����
w$9=�tޕ��W�7�v�(C���%
+3�����p�
~�b���JU�ŷ�_:���?"�R��ƜE���,T��ʧ��B��}q�J�%�jL%t
���5�F��{^�㏕2�P���(��L���=����Y��4�S�J�����P��%
$�}}�0��M����}d%�����&��c�%
ba��P�g5��Rdx��-���z{�,[j9h 1�$/Ñ�7�;��i K"LbCi:�Ҭ�����
���ghbjnmk���c������m���#��&
M�8~"���d(�ԑ���a���
8�&љ$I�H�O/t|�~N�K��Ki�FK�?�NfC�%
�����`g�B#}
Mu%Yi4��Ksf�CP���+�hh��Z,AT�TJK�7c����c�5��� X�� .� ��
+�+**.$�q+*�k�0��i<x���*�IC\�I��E�� ��1 8���U���h�.#�d��$
���D�.`���^��Nv6���꣹\RQV&��k�T?XX�9�xx��
+�$9���M����m�:��{�P4��<��b&��?q
mMu�J��iI�(��ݝ�T���g���s�Tr�\E�t�\���]t�>
�?��J
�a9�4�*�=���@��z�� �fO*�ƒ0��0��L�׏�D��2�k�L��c���K�������
�X��c���k{��u�.�v����:�Jr�
�ַ3��1}��H�?,}�g@�/_(��
%e
+%
k[��
^>k�7m	��g_L�����l:�n��ԏ
?��!*�$����6�������Q�fלp�x�+-�M�RNVzJґ�Q{A���!�=ݜ
!��t��U��d�`.��(IrH��76E�v��ۀ���T⍥��c	P��j���JKK�+--+$UU��546#&�CLb�
+���D{��
3	MG�r�ѱ��e��s	��J.���9�{4�*���
��%[jcinjb�撦�IUU
CI��x�����e�� SȞ������3��,,��4�0�J�<����qr���R}5�����3T
+޲a� �8��J���vӶ�
��5J+D_�-s
�sP
�я*�Ju�e��.��/H%��S�JK�
+b	G9�
!H0�M�
b"$Af&
��$�������%j.�-d���>쬎�-M,,���HM[E��
+
+� \���hge��HO[]EQNz��
<mgL�������/0�DC�#-����	�}������������7oݾ+to����Rҳrr��]��t���V\���t���Ϥc����k|�9Wj�A.
��O
f.A�>w���cG�FG@�������e��E��Z�ʊ�h.�$$�͓@P�����106�{�v\�^��J0��_ӱ�o�>� hm�G\����r���� I0��(�:aU��>㩊E
'�&)�`�%��K����),�4K��ٷgw0K�%V�f
��\.ih�khhj�袩dn��~��
+�Ҏ�{c$�d� *��
n�{t�$Q6�z�
H$��A��?� ��~�y�n3�J�c#Ä�� �٩$�(D�p�
*���k�����|��F��ҫ�
�=�hmdQ)�@��A*)�KO5*��%�9�����
�D
���I�.���D-6:�&�Ѹ$<��0A�OK�Kq��;�Uk|V�99�B;7��RSV��/���i �%��I⡤��dic������vC��
!aѱ�
M�8~��
��ݼUt���v_��{���+�ץ���I"n/L�x�K(�z�i�T
s�7��Ϝ��LKN<�2��ߪ���P���5�T��d�9
$%�Ó�\ %-+�����k`bfiK���S�?�H��G_�����榆��ښ��*x�𧺺�������0	�:��
ä!,�GL�a&%�8�����\"�A���[��t���3P%Ra���X�|W���/��0[�撮��z�J0�,�m
��V��ݸd�9���y���k�E�d"s��0�8���qT�y%�tN� [...]
�7x(QMǸ�>�uFR�%�0�K�M��R����X��4�*
�`	$c������bS4��K������K�{�^�ik0�)15�$P�����I2�� �DB�]�5�Ҁ�������������BQT�Xd8��ddj)�JEe�
8�'E����{mM�U�wn����b�)C�����XXz'�"��L��By?! =A����Ťw"Ss�.������Pv��&?�4�8���<h{�)�c��~�?Eq�q �
v71���eLLE�C�o����[�[D ���� 
+*�\��
"WѬ��kL\5�>��==���0@���>?�4e1C?�<��{(!vxp����n��1
�j�
+2R��7m� 
[��5`��PN�������������' (4�@lBJZf�����SU���\�����K�I
�f�з�"&����~$Ͽcܯ|]‡Zp�s��Mƥx�]����,/+����ăQ�a�����N�m`�!��T�e�!.I����mC(m���UPV����z��LR)�T�2�~�
�ċ��yK�_C\
A0
5�D�
1���	�I���̮��J��Yv�D�
��]t�9*=.�<"����pKtw��������b)
�
X
+��K�����P�%u��*�K}�������%n� X�q�Ц�H�:(�f�<�'ʴ/�����P
B�w
S����tթ���0����O��bOu���:���Tr��X�*q��%
�����	d��_H$I|L�F�A�o8a
��'.��&�����.�,�eN���

��rs��63��RWU���.!�����B��~�!�.0I0J�zx 
]=}��"�&�
���/*)-?S][��jK[獛}C�G!(ݧ���8'5�$�7��
h%��^���,p	/8����%ty��6_�t�|M�i|zg��&�EG���z�9��X��j�R۩��㒤�֭��[�JHn۾C�8���H� P)�T�~�*q����D/�
K�������\�n���H�&�M�&=��>#���̌@�V���^	k
_�~$f��
�4�Ƨ��
�
�t
+X��&Y��	�djd q	\Rg�X���Z(*�[��;��� ��A��
+��WZ;�����7�=��{.M��� ?�U���HD��Rldh���jV�w�xA["�%
��C"Q$�Mb���R@��F�5\��E.�e�X�XWs�����HVZr\tD�
_O[KSC]M����m[�|�٧��_ׯ[��C���
�(��A	-I%'WO������C�YG�
/;]Y}�¥�ͭ�ݽ���#cDPB'5l�o��kE&-����
>��'r��[
���8��
��ZqЋ+�
u�΢
W������?<d������-����k�2�K�%I			I������N��������Ï�R�rT���;NXz�#u�<�4=u\� ��M�ưH(&�I�\��A�{zPz� %amXI���N�K�^1����
ٴ�aq;��)Q_[u�ԉ�KaK���f�(.iij�����302���sp��
�
k8%=�X1V�jkGO��ᩇ3
T��l�W���t��x������@��Ԭ�"�
3�Δ�gNZ�*1Y��p	Äd��B�}�I"c�DDI�������������=�%4VM�Re9
{���I����x8۳-L
t4Ԕd�$�7oڸ�����O8(	@IP�������?:.)5=;��'+���54^�v������;�'(Ѷ�Ka&	}D�w�ʛ��a|?��K�8 S+:�g�qih���ζ��M��>s����hNfZr|́}{��y�;;�Z���ik�TU���d�wHm��]
+�������c`bac���~� :�W��/�9�%
� �K ��q� $	�$¤Y�I���ֲ&����NTN۸q��;�èg蔸t����d):X���KŽmifqIWG[
J�db�����ߞ�Ș�C���
+i[;A���{H%b��>	S�g�"F*�E<������G���[.7Ծ�*�䈟�]�4��Y�J���c�7�ښ�kV�J
��'�LX&Z��C�$�4�&�QZ٘�h�8�Ec��O�fɴ':�UksS�y��E�9�c���{�9�Y��i��*�Io���sx��g�>�,�K���%|�Jf�6���B)&>)5#'���ĩ��su����uܸ�70426>q��?��D7��2L⿝����`~&����oD^
+�K���]���,/-)���b�� ow;k
S`IS]MEIA^��c��������.-]C8
@��p4!9���	�&��3,Q���
L!��MD!�0I`�cFN���
+J+,�Z�K
�:&��n"� �
P9�RR
b)���
������@_OWWGGWO����������PV�HA�I�xX��b����h�W�ƃ?�JϿ}O�Şj��
���w*�B�,�w�D�D�D�+E�B�(�x����	/a.�Ѣ��x�d	�U{��Ɔ�U'�
�NO���

��tu��25��d�(�B˶|�٧�>�x-f	\���J�>�����

%�>�={�J�i�9G
�K��T��_ljni����

Y���(�
J<]�I�� 
�H,��4���>r�Kx���%X��8.�‰����N츚��eNj�s�� K����Ķ05�����ک�]���������
�
�S[W/�Rʯ�OX"�"X}X�g�U�K&HLP���SS� &qL�sj���wKP�����M�
�O�qӦp�o�vw�]���e)#�����������\2Ї200265�d�9��{��ML���
*�"U����ۅ���W��JH�,1]"a"m"8"D��0����-U�͘��E�/^�^S,�`Qii
����SU[u��� /+-9.*bo����=��D_{�LFJBl����K�*l�Z^�I�� %w�ҁ؄�����’�����
�.7��w����=z�iޠĹ�E0�gA�a��&����o�ǍKLMN���

��wcC]���'�
;,%
��|<\
�ؖfF�Z,U%Ey9Y(9yEe5uM
��m
A��}Q�R�1rݵ-[%:K��G����KL�@�i$"�2�쪠�
+Bi���7:›�
��%�fgpą��,� 5�G���h�R8���ޖm�\222����Օ��o�Mlh��F�Fc�Q�"��8�
��{TD��@,�� ]j��=�&E
]��f�.f��9wʽsϝ����O~˝<���},,,��%��P����."j�����EV"9
�{x���G�T��T"��\���B���/_2H�&�B��U,����9]����\��s9Kh�X�6݂
����|�䣇�����!�m-M
�Vh��h��9�f�����%p	�Qҡ��(Aiρ�G�N���>[XR^U}�jͯ7[n�#�~�%0鿬���?D3כ�9(	C�`��Z������6���s�E�9�i��G�G,��K�pz�l��M�
�V�@.-]�d�R��J]}Cs+;�@��*���*�Yz�������l� ��>�$E�8�K�

%ai��(�.�Ԩ���d���9)K�%,m�X���.	
�<;[k�ll%G���_k���U���t_qs�D-�1�>&��b�!2]�¤�^�H��D@�99o�=҄q��j��E���f��F�KՕ�Eg��S��
��=&2|m���ȉgcal���t���sg5}�4���?& 	L�|���Z2��e��v������I'�2r��\^uP��ohji���
E�p�(IZ�{�D�oꦠ$
Mi�rI~x��7j�w;�Z�o���������������Kp{K���b��;k
S������rm�e˴�%�JF���B�'R):��}H�lN���T%K���~��0rip �$y� E2��8�?�&Qz�J�5:����谂�������x
+?n	\q�)�t��R̦���@?oW���������Ξ�wpr�y�Ɉ޶s����R�� ���@�
�J�P	-�1�>
+�����e0)��L��f�s�ސa�X��p�Ҩt�P�.���.؄M0UW/���[/3���ă{vnۼ1,���U�`gef��R{ɢo��z���_~1�4\�>��q��$Cik\�^@)95-3'����܅��j���jjm�@E��o`�ᰤ(��\�Զ�-)��H�+%#�
+ɱ�sx.�K���)��o77ބ�
+,U��f��JA,��X
+���;#�,͌

�K::�utV J��f�6<t
+��m��������U���*�X�.A_z8�e��� 	��"��$=5��%�SN���
5d"�6ʮ�O�-!ͬ����"#��!l-���&v89����[�wt��zx���G�@�=t�T�sE�D%�{��lL��I%��1*��ג'�H&��Q <�H�&=��1�K#��?�v����s�;f�A7
�p���\�x��� '�t��FE��z���Z���]�l�w
�͙5�_R��}�2i��J��B�`��������Ҋ���R{�fcsk{'B��`�!�(in�H��!�xKLC�ԨK����z
tw���k]�U(�e%yY��QK.:2b]��������������@Ow�J�V���CU2��[@���
W���}	X��R�{��P�dߎ>
}=lhT��L�{�E�$A�4�ЩA/JD�X��bpT��>L�ܘ,����W\KM��+�,�b���}<�]]�%G>����(���^���"6m�
*%�� �*�/נ��T��U"��t�9 [...]
V-_����sg5cbi҄	��q��O �&O��J)��Y��e��_o44��n�������phx�
%ZQ��$�A��9
f֚�Dt�^�
��4��C��&��TU^R�K�����%��gkeajb��@_O����j#3Kk{�����?d}d��]����	)��*5k��,IYB��]B0� ��A"a��&�T�
%��a͞���i�q��<�K�cBRq�)�.K;cc�6�
���p���'x��H������!jkܮ}����.ċ
�D�4<�ҧ��%�K
+����8Hb��0R/�
s���
�t�_���Ж
��`>��y3
�5��K
��N
O<�g����y��|;KSC��?,����gϜ>m*bi��&BQ��1Q2%�t*=+�������՚�
M-m
�����ð�T%�Hb��f
+
+i�/u��
+��u	��� uzw��•p���e`	/�Ә�ݰ䀥� OW���gk
u�\2���
�LL-�lyB��O���M[�@���J
,Qu	��a�$�-%	"e�DG��sv4��ktH��jxH���Ki]�X�D`鄄�-Q��@?oOw7���=����U�����m;v��r:3�����R�Jc*�7��&<�"�Ɗ1S/V0��g� �f�I]��ßokS��ګϕ��f�N9��WܖM�k}�EN<
�պ:K�`ޜY��)ZZ�&M��I_L�6}�,J�%
�3Yy�%eU����ֶ�������70�p��,J�h9�c`��\�)�A[wJu>�P��IV�#`i��u����͍7Kh����@,
�O�����"t\cgceafbld������������ �vH�r@���hݵi��_�o����
|;r	�2��c$"�2��$YQ���H����
��
K�8bC�F��\�n�(2(������.$����*vqq�]�=�|�C�"6����s �؉�̼�Ҫ1��TR�ҟ�yQ[$�X1V�3���D [...]
�}�~B(eJ�U՗�����jnm��(�
�<��I�hEI}�8H�J�w
+�0Ґo;��
�#���A���]w�o�HY� �r���#�6���z!����.����3153�����"7/��Ј��;�J�gr
+>T������K�K�'�&�IJ��$zQ"��`G�dr��ub\u
Y)�ùXuI��|J�Xʓ����g����ʶ8��%3�Y�����
A�Ej 	��^�v�*,XPA��yb}�����A�{o�sn�=�%����[p�Vr����޹��)�6N�T���A���)��1�x}rzvފ5śK��+`
ן�|��&�J?�J<��.}�J�Y��\��"!�DU'�-W\Ȩ|��
Lf\�c�
�f��;��!T�ݾy��ųu�N
9X^V�y�ꂜ�d�Z�d���~�0v���mm��.�B&
��Q�%Di9���Tq��ɚz@�Z#F�џO��|�����VӇ�%&I�$�B�D:��k�_���찓vIx.�Z�������%<�j�O`�J�ғ�q�ʰ�@?o��p.-p�?o��y��;/pqu_��

�IL��)\S��t���
�RK_U�D�D`���@"u~�1I��
ɖuI�
�f��ʂ�I�6
��N�a�,���V�eg K�j8����PTa��(U�VgH�;ۆ-���UTV�6�J7�*YU�ĺ��d�M�"SE����f�1`�L��[���Kd�TKϟ�
�2u�|C��c���ٱu㺕��i����� ?/w����:i���NC
K�����gd�@[{�!��%g@�70DA�T TKPj�}��C���7�>4��Qb�^
%I�>P]�tᓰ
�0���g�t؉���\�".���
+���<��ٽNK���)cX��⁥��>^K��\] &�
]\�{z�-
QD�j�)���J��*=�*�_�=��>QO��䌏�2I�P��d��G�[�W&vs,}�XB�g���Ԥ�M\
��P��+"""�T����䴬܂U�6lݾ{ߡʓD�;��S�JV�,q.�0��̮��B�#j ����\�h��0Y�i�>�A��<���^:W_SUY�oW���5���)�UDh��ǢsgM�2q��NC��A
�߿_��ȤA,J�J���X�R>Fi'F�P�xP�s���[@�P�Dku�%�I�F�����B��.Hw��w�V&s_�>�z�s����=:^	Kw9�*Y�
+�K�H`)�����p����"��
p*�+Ր���b톭��#�JO���)�8���
��藗
J�}}�Yڬ.qv�nu�]"?�;q��mi�X‹ą��5
K�c�2Ӓ�:�:6&:*2R�TFFE�Ī�u������E��س�б���\��U"m���$d�rIN&�e�
V�#&Qm�ZEE�΄��	ǫ��n���,��
���3���7 Ru�Ǐ
ػsۦ�U˗�'%�E��{-v�?{��Ǝ1
X�d3`0�d� (�5v¤)3f�qv1���(�0�t�t����j�������<{�����ZZۘC	��
J_-8��&qW�	�����n��
�n�#��ް�䄕���s�c���C�1ٽo���p�bi/fi5fI�VE*B��|�<�%�EPn�`p�R�NHJ���T����^|�J��m<����%\ʤ^
I=R��L�g���d��fZe	K�b鲑���;J0K��R�!1��REGG�T1q�N������b�zȞ��U#�n4�A&VI�OV��U�ćI�&)�� [...]
�
�l
���&�;
�$�R"Fi
�RF���F�
$����A	~a%�H2��AuA܆\�v��v�OXs�J�K����
�`�����nK�i��0K)�uLTDX�R_opi1�%�^>~p*)�b4��t8S�mܶs��#'@���o~�J�Yb�5>o0M��G�Mɘ�+K��*g�e��H4�׫>��$K�Z�#�RS�5`��c	-�9Y�Iz]�V

�����I�ٹ��o)-�.
��;{�tߪ�U%K]��7IL,�+*�|��;R�'�P�	����B�b�>�K2���%���[K/�k�75B��N�8z����=�����K\��̜>e��1#����vv���vv��Pr1z��S�Ϛ3����' 8<PBs/�;�(��A�
��Ƣ��C��l�0In/�`��FF�
�%�
�
ܴ�?a�
LR�R79�Kd�=�nc��`� �6b�2R
	�ب��@_/OOO/o at iiH�2:��WmB*
=QS�2JR�u�T�/���
�&�&�G�LmyF��$�Z��LrD͢���Txz�&�$�&`��c	6;���,K+��fg����%h�(�6PJI���/\]�q��]�ХS���Ʀ�X��V��*I�$�I%*[I$XL�p��4�E�FP��L�p�M$]
L\�8�,g��N��P��
�M���ׯ\8s����;�n`�������.�g�:헉�FKC;::8�;88::l����&L�:��FP�A(e#�6m�t����K@�F	�DPb~��CɄI
I��&�@��}��q���L<����L&OX3.��%�3�>�����
Kˀ%�&6Z�
^ .y�����C�*u�!53�`uѦ���
+�o����PI�%#+��7�d�&�3�*���$�"ɵL:9\����Æ�|�,p�/,����bY*��e��&�T�D@)-N��lD�j��]��x˪�U%�.�a�Q��,Id7gb�3�̿W�^�E>3s�I��8],LB��ʹdK8T
�
~�
+"����[��.����:ZQ^V�y�ꂜ�d�:Z�dт��͘:yb�iؐ!�Q�IN#F����Jyr(�	(�F(����C	P�%�(	L"M����½���a��`���Z�6�`↕b�C*7�>�S,=�a)YF�A��SEF�� ���|}���J���X�.)-+���]��U�D���J�}W�?���s������$I�L��F�eod�#��[��nuf]w�c�/�%ұ'��=K[6�YY���Rjr�A�O��
I�)i��TZW��d���*�J�@%4��*}�a�J?�Jr0�T�*Z�y�b�E.$+
)��
�礞�"��q�p�p�p�8��h��p�3e���� S��c����ʲ(�u��(�"(���TVi����3�̄9@ a�J,�y�QA��Q˶��[E�����s�=wH��cg?��|�ַ���P����v2�N
>�H�RNzҮ�@_��?�]�tтysg������W`Ҵ�3\fIP��� P�(�)�t�
��à�
�z
��@�
JL�/ZP��&������j
S5�[k
+��m\� ���#ð_K�X�,��d��c�#B���K�ޛ7o���P�
	��K�TZUA*��E*��mTRb�߼(`���dIv��L�!�Ѳ���&�Tr.i.[�8�M\Ko9,�R,�`�R,5�V���
+�r�2ҀK�		��		�I)�i��0��˫��4
8|�4v�Vs��J���J*���J��.zKB8�K ����1� �v�|M}�#a�"��oA
r\��s��\��J2����(z
��[�/�;���R��6�
�V/_�Г`��i��)S��nʔ�Ӝ�J�J�W�[�P
+�����WXL�t�-%�^��P����Ll()��Q�
ފ"���m2T�Vc��IL;VÕ-|L!�M.�窷r����KN���

��\���uB	�RL\bj��`*��߷������L%�\���:�ƭ�$e�cDz�0�-�hXG���0�Ȥ��R#u
����%&���:�Ra>Υ�Ԕ�䤤��T]zf�>������$�ܸ�f�$T"29�䠒-.iA�"3��"����W4�R�G�
���q����G�3��%5�6����>���Fɯxd��c��k�.�9q�@cCMy�!'=9���M�׮Z����;bi�t'�ipNӝg��~��;�ҏ
J1q�iY�����(�(�[�Ҹ](Ycvn9�^
"�
+,�X��2�i
�� �w#�� �I;eY��%���,�>pXz�X��%#`)-9aWLTx(p�o��v8__?�RhDtl<
+PPT^���Z�B���ށ�PI�%�x8ɇ����i0IY�$�$��rN?�J&��D0���Ѫuֹ�M
K��C�Q0����+J���<}vfF�N����ӥe ��
+L%�Uu
����<{���m��n�P���J*��&��L��"�‘$	|��BO�����>��]q�]o/�X��
�E��E�E�E�%��0� ��A����c���c�<����X��
�����OkV,�X��2s������ȤYs�{x-Z���e�0@)	3Q����TPzŠ��e�ﰑ�Z�@�7@
I4�� �X��e��OP�WRC��F&�$0Yi�R��z7�,���a�Y��>3-%1ngtDXHP`����??� �Rx�θĔtت%5
�C
�z��]B�'�C��Jְ$��G��GZL��]�T�IƱ�
N,�&�V��V���R����Kj��KeŦ��ܜ�, SzzFFfV�>�`,.�����t��S�.�J�c��B
kSI%��J�7TR��j"�LBoѕ�H"D�Q�BO����~��%
�_c&R84abG�ń��� �%͹�t�&���>1��g
ʁ�p,uݻ�c�|,��غyú�˗,Z0�}��߻�̜9�����6��뇥�����$]&�2
+���P§����4�do�"�^0H��*�d`����`jP9�� �
��L܆��v��GK����a��h�g��&���D����BB�#cb�A��|cie�&��J
�ߓ��W��Z�җ񉜒I�i�Q�d�v$�����D���$���gT�K㶕��F%,
�`]
�`K{�k*�K���%=�	.;G��o0��W�6��Olr�Z
t�
T�(�ԑ���1�zK@�zX��V�*�������{���c=#YH�āI�%��\����(��
=A�:-l,
±Tj���%�F��n����U�%�yn�sf�›
Lr��P�]��L=@��nt���Y��16F3�6�d�k0��7D�3"�7����{T2�S�L�B��M�ndD����l7�������[�X�'X�E,%��






S	�*J ���I4�@��IQI
K��I�Ҙrھ}K�-W�����wo
�;�<�\�c��
�u2��X��}����ZX��=
�X2�`�8,�VU��
+
��rs�z}nn���XTRSiOS�'�\�|�V+����h��@��wP�A%[F�D#��
�ŘļE�D�y�
+=�~�X�f�]r����;�ł>C�a�(����һw�\m59,�X��)�R�0��cƒ��y���ڕ�#���溺�qu�
L�X�p1 at i
�RB)5Co0	P:u��U
+�n���*(I\�
�\
+*Z�{ֹ�|{I5�"<f�@�p�R�Ю<*���!�!k
+L"ɟV[�ݴ�=�aiLK]*,U��
�����x�RDxxXXXxDdT�θ�d]FN^aqyu������ZZ�
��'C%��&�-<Ye��dU�J��'49�LPL�9wͼX �n�;�y��TҴ�RjBs�
+��`OK݀���7)��
lnڻ�������d,0��
������꺆}��v�ة��ܸE��P� ��J*iQ	%a(ɘ$C�H@$LBtZ���������m���
���
���,Dwq`��D
�8�>يu+X��"�����K�l,�&c������@_�M֭A,yy���������~X�l�%����X�RN�������x��

J#J�J�JZL:�0U�I"�^��C�
�͢��ip
O�CPC��S����4�Z8��؄�N�q�X�)w��RA^Nf̥�؝�QQ�pQ�1�q	I��Yz����fwc�!� [���48i*}��Wk�IM(J�i�Lj��d�8���9�VT,�ֺ�.+����
���'ŰUSIMeKt�R�^>6X�Sci_C]MUp��d,�3���K�*�kw�mj>x�������-��l��A%�l�PJ1�����Lb#��D�]����ki�	w�;��҂�&#l��#��Ĭ%qI5�&�%a,���Xj�c)#%>&"�����\�rْE
xzx̟?��s�ע�K��(mbPJH(K J$�����~f{jJv�$.Տ�t��7.ޘ
+w	�� �Z�
���;�L��)�7�Tl���������k*O��?�3����^GWW],H����@H(Bh�� !�AQP�m]wtEf�Y?���+7�����n�J�˹�|ϑ
+�*��KXj`Xʻ����|3>�FԵ�W"�y�*@)6!)5#�N~���Ֆv�������3N���R) �T�䅒l(IMN��y%�$$�9�M���3D�D����^
+��˥5�%��W��[��i�Ҙ
K�&�^s�0?���{7���D��W�a*5�vt�x�G�Q柿B*�����PA*�����++�P�3�zˋ$b, �ʃ��������r�u�#��nE�8
���4N��������%�lW��W:�V��R��VK�W/�����~���w����M0����
��͔Ll�JMm��o�Q�����ZR��$%_&)��7
H�C�2xE�t:���
\
7ҩ����Z�na�i���O>X�|,�o�%�NSX�LKIL���u��U�k׮߈��OL���[P�3�j�m�
.���
<�T¸� ��������w(��V��D3�H�#��0�T�ìb
ȼ#H���Ғlخ�%�G���0,�`�,M<��dk�T�+
����‚���������b�R��S����u�,� ��T
+�A(��+߻��\�LBkqg�� 	�U]h'������h�
��p at .���a���\�-�s1����ձ��HR��ci1�XJK����x���#a���[6���&�~�����;�p(]��P���-Ԕ͵
Mm
�� P�셒jfd�G%&	�����F�e��NT�"�����xکsiY���U�
K�|-�Q�R5�R~��[�8��b�oD�݈��KHLƩ�W�U���?L���?�(����L^(}�ݶ���/��8]L1�x�r��Z��*\R,�XRXK
Kl޾G  �fK�c��P��-�����J����TTTWT\�)(Uҩ���������i��c4��T
+RiMP�
J�I���-h{h-�,���,������,
|mmmk�L�9�����\�-���I�%4�8���͡��X�
%K�~c)%!���
gO
;�Xڵc�֟�l޼y�d����"3(�$$���ͤ�w�x�&�N�%����"��%_&�D�5ny-�le��~�x25ڑN�*���
Lj-|}s�>����'Ks"����K9Y0��n&��������(�T*.%������
 *A����po�J
+X��
J+�=�w�k at 3�l$y%c�qt��8G.�:�V���M�`�BPj��>lQ��si-XZx��-]���O�Xr ��u�զ
+��L��hJ�4��LP��4�Z�
�
����T%̱ ��TR����Ci�'��$2�
�Q$���4
+�Vv�D�����h�Z�����6d"Z��Nф�"`�7�`L�D�8����:���6�Zmut,e�%�E]�t��K{w�ܱ}۶�[�m߱sמ��� �S
J�Yw JB����9MJj�
+�����]��I�s�|#H"���UA&S�^<�-xbܱ�#5|�nX6�D.-.Ji��c�髂%x�gs3O'ɱd2�i�
��Ɇ����x3!
/�fRrj���;y������j8t��瞿|�F��0�����#��LbHR�
i(j��:G��#�:�
+�4�ur.���b�˪Xr9�M�zK��T^�+�����
���F�J]�>R�&�΀J�J
A*��l��P�Dw!���I8�����Y�X��-$�P�uuKmmm�x��b���L��ÀMm�.�L�Ch-�|�KX��\bX��L�Eex�`	�g,�z1?351�`dƒ]K�)7c�G^�뙓GE��ٳ{�N�]����
=p��qJ�ť�J�������ߠ�J����:7ͷ�4��oR-h�h��P-?"WC�C�v
LdÒ����?Ҿ��Z���$,�zA�4F��,YK��Ғ¼��Y����D���4�R�݂bm��\Kk������
��J*X�$��0���p��1.T9"orG #�J��bɴ�Z
q�8�2.�P^)
+K�`���^
KSO
�? X�q9�[�`.�� &<��XaB(Y�Z�Wwo���xrjf�9����� ��TZ
J�����*i|d'a�oa��uC�����G�*
8����l6�*�*��'��d6WA$֢����]�N ���5r�qizfn^�K��y-��%�%��~}��
_���~Џ��ܬ��諗�v�̉��#�C���݃�7dhxġ�'N�%P�OJ�%A���D������;��J�l'�I��� �CD��Ȁ�$�d �q=�U (��Vw�vl2
�
��
&�����%�}���V�Ҩ���a.��RS�R��3 J��E����bmjs��}C#�XY�}�V�K���
+�1&��e3iT�r^ɨb(Y�L2�9D+j
˫���:t&Z�����)�
�:�X� X���lok��\.UV����\Uc��ښ�:�T���
���2q�A*�驤���W�w�P{A"r&AEGoyp%�H�D� DO����
�R���7�
xO�c���^�.�L�����S.������D���� XRz��\=��8������vڛ�X��LM���r����'�
>x ,t�>���a��#�N�.1(��i�+ 
��.7mO�f1
Q�u@)�PZ\@D&�΍�Ʀ*A[���
&t�Q9� I
��;�%`�i�-\�v�.,�v���o
K�O' K�r]Ku5�
+�NS\�����u+##
.##3
�TXRZn4Րv��ۏ��-
����[���%(�4���3��IX#F�*G%#
�)��Ub��;G�N%���ouD*2�.A�{-Q��a�ߴ݉5B’����aoi��d�I�zh��
����p��T
{����0��TN2��T
+R)�R����H|6��%�0ip ��d�6c�~���,�j5M	\19���h���:
D�	�UWom0AA'��s�1���%�y
k���}��˾c��%��������䄘둗Ο=}�ؑC�������8t���Sg�]�o� �I���(-(CI5�%d�+�$�|�"4Z�LT�rI.B9.ȃj�
z*�;L;��d2!�Ȇ%�ɷ�+̥߸[��Ebn�ai��-`�L�s)7�6�	���_������j��Id��BC�	2�@fPQDAm�'�
�dz�w�o�cR�M˾ン��z�ʿz��(r���j=�7ڻz���S�x$��Ʀ�҇o��+0�eҌ/!,c�
=B0��-j-ۉq�dD$�
.@Qe��2�s�u��:4?�VJ�
�P!��9�ԳU6���	����k�Y���K
+�F��
/]
O�mjb�����a1��-O�[(��w����O��!�$����BK�����#�-���f2%!\�.��J\��b��Y�;Ngq�˅T,C
R�2�`.䠏��ҝ{�+�K/6�GŒ�n���;�z��Lc�n,U�:
lW2R.��D��
9}����?�8y����.2��9\�Uu�o�w��G&n��,�lf���#CiG�\
+LL�4AS��FR'���zE�
�a5H@�L�C�II;��L�S����Ŧ��8L
�KԀ^�[C�y�8o�R�������.�
��)�:������J
^E	l����a��@��\ڻH�5{�$���R��m�ʩ��<�d`���s�u V��;׵V�KR
��`�Z'�B�[n,R�o��;�F(X���s�|=nk
�V̺N�R?�9>9
��/B�gk�q�
��~L�c*�ܶ
J�6��m(=ZZ|0'�D�
+���J��ΉH�+��<�,��
8?��CIR`�:O���ꚺz�����V�6�V�=��+�-��k,�k~�N>�?�Kn��Z^VZrB\tD���_N����'N����i
������(�u��F��
=Ya(��=�RRK�Gc�F�!�Y nd�Z0��SoJ-�
6G����W�^��]A�Q[�K;S ���`ҥ
������¿K��2����)X��v��hl�����r���q8�ـRu
�R[��?84:ɣ�X}�Pi�۩������L��$L[�IA���HR%@b
	�X9G��%��b��յ���<�&iڲR-3�D�P��c��Œ�^K�,M��Y�)�pGp�OG'W
��$oϱ]P8_n�T�
S�J���>���Z:�k�

ϤvF9����"��eh�������\�C�������\t���W���U���ܢq	8}{���Cn{({�~VX:x,�W���F�Y��+-�ݽ����ʲb{~NfZR|ltDx�9p�g [...]
��$5�FB�1��
+$C~>��+E����j؀()��;]�	0�B�ݘ.�d�}M
7�9��ъ�a鱆�@?a���z}mu�[�V�2weu��:�R7��𘔂�+�~��
K�q��f�T͸G`��ߧ&Gq=¶A�c$�d :Di�j
�d�:9&�H��VJ�kR�`R�4OZ��E:m���~�
Kf�T,ݧ�:A������vwuuvvuu{}�r�8��L���Z�ޛ�d��AT9��߀Jf���D��۠L\�G'�46�L�b&�43��D�u�Wp�-�B0;;+33###]w2223����9�pe!���]QUS����.Q�W3b.�Ukh�F,}�K�74�%��n,ݛ�Vƒ��]RT`����y!����!gΜ		9{>4
C).!I@��������

��$|��tW�S��~�a��MC���+O�R
+LR�
�*��SOKUě�,8��2��O3
V�� �O6QMZ�5�
Ki2�
qi¼�ϥC�����Z�҂��0a��
o��O��KG|gm����vL����Z)�X����N�#�E?�P҆����ICb&�6��$U2+����
�uD�`�`
�
�
�ֱR�la Q��MB
�%�k�z�3E�{���K��]`��'U����
������$�q�]�n��雐b�J
S�J_
�͘����d"��nN����["'��,G!���8�HOKMMIINNJJJT����������4��`�;�%:/R��c
�~1��(�wm�K��3z�|Gu,	3�
+���=�ݹ=�c�c���帖����
z�NhXxDdL���i�WlJ���N�phlrz��
��
I��>Q�sG��V�ӗ�eL�J+�S��|��]��f׫ dPT��;B����&�Ⱦ"�NM;�aEW��Ҏ��`n�"����Ē��-���ҬĒ���MT�
+��
�]!>��F�R��Œ�������J�u
ͶX�9h��&GL�ɨ�I:��u��Y8GXG�N��U	��`jlni3q�
D���*��Y{H,iz}�F�ְ��p{���ߋ����
*��^�"�rU*mk��|L�.�
%�A��s��P��.
+D�CġD������ LINB&��_��+��t)>>������^ ��p�Ja�rVk{���o0�si�.\���WJ���ل%�K*T"��������[D�MO�Xjkn��(uگ�f��$%�]�".���_�����PJLI��P��4�tx{��j�=�/T=�6��CiW�~�P^Q�T%$���s/@�q��
+F �E�hr$$�PB�;���N۰{�
�دl�VO߾)���-I,�
�����}�j���*q���u
	
r*M�l]�u�^���JVP�QZ�8�٢.��I�dT�dL$ I9(���#��@�Q�#�r��{�oA���%8��Z�vT,��
Xz�ֈ�te��
+.

�� ��C#c�-���
S�5}�t�O�a������w��u6|Rr�H{ɯM� Jȇ �
L�<��J	I��9�0�
+9K�^���������C�FEEE�� ����
�]-(,��g�^�����C�S�f��jSbI&�'}��d��_Z�����S�mR�ɱ4�c�����]Rd���JOM�
.��ͱq�RӳrlJ�-
݀�����w�?Xz�DxL@����v}�%��<�t/q�L�:���Р����D��x���d�e�H� ���n
D1��*�DکV�v{��-��W�Yb�2�
=��u��9��$?�
��s���������OC���{!1�a�UU
2�w���P�	M��y�x�Ij����p�+�Hb"������;'RGj%ĒZ�
+�l�T"X*9�4.MLM�a��������΢��%������*I,
*nM\
+|�C�#�czLꊦ�3��~y>Dy�A�ϻ�X�Fl��(p��
� e�^� mw�,[(����%ј�H0���bE��<缍݅E�I9����w��oF��㜨�n9O�/�J�@�w
J��h(�^ͮ��:�Cy)�u
+)a"!
+�V����Ԕ������INNNI��l�{�L�}&Lĥ�rkUM��Is���?���5m-�x��<���;��,9K����
��Am,�\<w������q0}��=W��}i̇�r,E��j����	JZ�-"����)ݿhV;I0I�I"�h$�R�xK׫ eHf6��!�`9���;�vʆ�����Eډx��h�
�J��7=�iX��ꡗWSe�VLe�8e��6�^K�x-#ו�������}�>w*�P2�[��
�j��>6�`��:$�oH2Q!�q��;U���:�wvC+&S��\
IuJ&�%j�]�z�P��������lXs��t��������������(������W�3O���JA��� �_J��F����D"
+&�\4�,���,k�v�QjJ2"0)11!a#N�<�3!!11	�����
���������\*)��U�54�[�:�zP���V�O�4�>hc�~ =艇���Qu,U[ˊ/�=	,�de�e{�#��
���
P���:����k(�w��&�|� S%�L;A߹�|{
�t��Q?�$��Fѹ�L�j���qHěH7�6�
 N=�
II ��qG f2qUХ���w���߅��)���tG�����

�l���
+�J��^U�K9��T��n#�5h�ʆ�YT
+JJ�xp_���m
�ɡF$D" m�ƁdI��#��D֑�Z�4�`�
+�r��nnk��4��?
+�Y���\���[]XLr��
q�~:x<����0u]����b(�hPbLj
ǃV��<��R*�e��=�C����Ƞ�(�Rm�����v҉"̤lF�9I ))1a#"06&�d2E���i��`.
"�p�t��K���1�\�J�\װD�zf��Lc�:7�c�!i8vO?�k���.�a,Qd
HOO�IO?`7s�jPjpz��>����,��B�J��Jwo7�f0I��Z�
�q��S!>.�e�Ǐ2
V��#9�
)�&
M�a3x�
;Ni'[x�h����s��{
K���X��X�x���8�K�Uv�
�n����kp8�F�^L%��&HB����f��R$D2
��#�:��L�A�6?/G'��~�Ms���❔T�
+�	��,��
+�iKJ)
�wQ�����6�N~
*@^��-{Ɉ%R
�~dh{��$NOo_�o`h�A�/"��O
%�:��P��z�J_��B�j2��Nʲ
+����PV�/'j�����dRn6y+��g�X���G�1&d`dDDx��������HD�	i{�P� &L#��s��\jtzZہ%_p,����ACC��X��z;Z=M�5����3�r�یCf���f3�9K2�R��Ճ�������e�P��{LW�y,�5���IJ�V�-m?��7J7��AR`�<R�p�	@�
2�P�9���ݯ�I
&�vUr��_�k���ٰ�Q���F,M��륥�/� �jkj������72��tv����>%
�pEa�O�Rp(��q��5��Oz�Z�y������!��{'K �"GƉ��d�t֡��u ���"��L�P"X���
ǴU����V|��r�~��y�L�؉q�7
(c.1���A��޾>b���A��!����5Dw��0O���Jz(�S��1�ҭ\U�:�Z�4��嗋�?w�I�C̤�������6�3�"#�7 ׮]�&,,l�z�Ϛ5k�����	����D=��s�i��\�V�U�+��*�D�� [...]
+�
z����J38Ai���t#��
��*�й�2;i�"߶o��DB�ũ*�
�
+�iG�5�
�G
���Di�KK�|N;��7�ޥ������g�j/z�O����ĸf9<:i.��������748�\%�>�JX���%᥎JA��s���ۇ�}U����
+�I���]�����H�d�d� �!��+މ�e��o�n�.�D�r�\*�\^i��ðmiS�����Ь�D,��X=�˷i.�K� Ӏ���������u�.��9m*������H%�p
%JlJ}݀R��Q�CI�6
+ߡ��I;I���q1&��z�ADક+W�X��X�r�U߭��^Q�„��d�������켣<I(�k
X����$��Wo�<�d��y,
`,�y�����Ǐa���d���ͳ�^8�B��#n`x��@Vn���O��i��J�twq�v4�V�*�.
&�s��Z �����ւ�Pa�w�X������ 9@�0E��(5�0�h��K;`Π{Tk���:n���[�����K��3�aitxЇ��s��v69
�|
MN��������Bz������4���P��V)R�+�
�
=Ba�\v-�}{v�&�PL'�s�uVO�*q����
+AӖDq)�z�%�:�`�e�����}��}#����7�b?���$�0

HC@
��J�
�-6���T��4��´���A@	����q6�U�_�ΞB"�e#��!��@RlL� l��bp��eK�.Y���Y�d��e˖K#{��	0�Zɩ�%��
Kϥ�
+[M�C��
`�u�h ���
+���x��z���ݽ�c����D�--�N����[���,����"j��	'�t�;w����ߠPRJ�!�e�nj����U&q���
#��jt�xDن`�2��_�?���z�U��U!Q
�#�v��[��;e
�
�3nោ%�K<�cid�������q�\N>.��������q�#y7��T
+ %����J|U�f�#J.�L�5BA�*�:!'�s�V�
���*�+ܳ�?4�P!�Khܠ*lT �P}>�?�Pa���4
K��R�l ,��.� �@&:׮��P�Q�����3e��k4�B��_�T�B�
J�e0��R%�|
%wJ��\
�KN�&mۚJފ��Y0�J����E�.\�`�����.\�h�7�0��갵�6DD�b1��K{���y.�<s
�U�;\*���1���#�	q,ɟ�^��ϟ��4���>o���jn��Ϟ>y��XaaAAAaᱢ'O��~���J�g�̾���(���&�5
T�`���h�51&[�!
+�(QAA�(���̈�PP�P ���1��Ȋ+j/ӫ���s��[(�/���½g߽{�Fߒj�C��M@��
�b�nTgC
�Jw	��錴T��}�ё�y&�|C��x�t#f#�t2|�;9�WF��v����`ҵp\C.����<�d
�5���F�%%�T,�⊥f��
s�����j-//++/�Z+*��J
+
�T�I�F���jTz!�
�A��֪Ӭ�0�{�`R\L\����!��t��H���8&�Q�"�p�#�@�/Q"V)�.t��]�%,ۄ�d*Qy�ŊP��!���6���
Kz}\��E.
� 5*|��}��K�

�8


�I]7zz����fS鵩�4J��s*=wM2��Ҁ����PBQ�΀�����#�.fͤ�_/_�9�!�5�xO!����|$����H
��h�C�Z���`b.mݾ#��ҡ�	I)�̜�3��0L����#
KO�&����b,�=�56��TnS����I8�&��s�4 at I7ߴ
4y 3(=�A鱄�/T %������\�ϋ�.�R���΍���-UA$J7��MQ��*�"�`9=>S��
�†�A���Zx
Z�n�v��t���X�|#ƸD�}o!�����N\��*++***+m`������O">���_�J�g��
J?���[<%�I�U)����"wT0)|���m�R$�+%��qL�CbM'�X�LK��T�!���T���G��Ai(R��+v�ܑ2kG�%���%�K�7�%���8]�I�R_��z��^��*�R�M��K��=
��
��:C�[��b,�T2
�}1Q�w}w�x&}�t�B
+CA$�������3Ew�2q�{���-X��s)($4lgDT̾�G�'��iX��گsf<T�f�󗤒Tq.2�%��匥��

�t2))111�drJj�%��'
^�@���z����y�Ǜk���!%Z
%Z�-N��t�JNL��p�~fwn%߀$jܒH�GH6��e��h8F9�
ZU�$��U�N��j��E�­�յJ
�1��G�k�Ý(7����$ 
,a.1��ԀLt���ںz
J������
+�L�b%Z��H�49�C��f��H3��}�I��F�dۨ��o�A�qT�ܬ3�Ҵ�P"��Z�f-*D�VR**:�����O$��de��d����D4k=a��}�U�W#.�
+s	\���L|IJ��U(�G"52��(��B*�ی
%L6 Ds#C�b	Z_Vz�Id"�Ҟ�
����I<�-`$͜�Q
�RN���3	g�<����g���pN��f̄����`".������[h.E��>�����-�D�B!�0`�M�62����+c�2�z������s:3ݒ������z*-=#+;�r�Bi��RK[=
CҰ�t�n*頤
a�R�zot!���
v~�
�tc�R)�MLڶ5$h#��72ߨqK")*���0��A�/睮*@�
+"�֩i'[���j
/
���䩅���3=�8�q#b;��mW[�����:{m�>�v0��lj�\�T`������*Tz(=T֭R$�*D��Q���%&���W��L�+�&k6IUJ����'�"2�D̗�n�5k׳RX�(v�\ T����L]���`I7�������>�%ɥ�� 
B
%@�
�� P�5k�F���L��p�Jo$�d8*A ��Lj
��e�RN�%%	�o,�-��3�x&�%$N�,�c[�L���� �o��/��EX��4u�?�k}6���b��Kȿ�q;!�Tr������	���F���T�ƒ��D�{<��:�Z K���٧33�-�4�Œ��	&a(�E焹U(��b.
f�w��#�Ґ~�0
���56�
J��t�D�����3i�ȷ9�?�%�k�@2x�
,����8��GVA���>���I�vZ
OLs��yn�v�>(�442,i��H,�ԝ<������:�
��I���V��6��<3�c$TJ�ݠ��)�D��>��E4nSO�
�mK;)xӆu\#H���$�Lir�#H6��9�J��b2�{��a0aڲR�T��Ɗ�*��T�u
+.jǦ4��+����:܋Ĥ؃A�K S�tD��L��A�e*�R�-��Y:�P.C
+��G02�j�RB*ZR�9�/&2��Ҧ
kW�b����1�f�J
+��0��T��Ǐ���z����x�^�.S�L��ϗ}���K�����
{�����
`�RYe�����N�	�Cc�!��|,���J�gr���淥D��4).*����2q���sr�
+��ϝ�t��P�F3�t���Y<Bɽg�@��: �䨯��t+�1T
+x����[�� �� %�H�	�6�
+���*�1Q�
+�v �<��C
���[t-|P���pi�/’�Q�V�^��%��F����hlt65_m�(u���Vi-�A%c�К�J�n�H�*EB��@\�(r��I\#/d��r�L5��s���
i
_l&U*L���TpHh�ΈH*,Tfv^a1UEU
fmKk;lt��d
+i7,�\���D`� ���[�$��Pr�@F���QiX�
C��p�X�N�����c������_A߮[�DT���>�bc!	a*�@//�wqޑ�~��L
7�}A&�G��g�K�.�B̥�-�wDD��?$�TP\r��V����N���o�+�.$�J�Xc�� ]%S����g�
+��rs����c(��Ymյ���� V��QF
�
 w��M��SJ���R�L��[��$�7�n�#w�1�c
�Z���cL;��0��ksi��b��K`�;�~�XB������\jo�����ijn���v���D[7�M���T��?ܠ��PjjԊi���l�o�d��T"�O��f
E�w5� �eЊ'�¸����i�Jm��e
�E(�%b�68�ݰd�,��vX,=q�����n��n߾��$��J
q8J���J&S�2 /�)�	J
�
+��������Ci��_��!���-�g!'!
5v��1c���pƌ���e^�	2�����c/�]�h)�\�mGDd����Vە���֎��-��<q�
�/ZKO���U��Zw�S����VQVz��9p��� ����
�t����
+[�XZ�R*�B�(��=C�{
����Vܽ����ҝ��ɥ�Ё��Ȉ�a�!A�Iܹ9�fR��qS�Vk�P���WUg���q�d4j4����DcWĮ�bY2VklT�%�����4���A� JD
C�q��
�Yk���i���h�L2�ky��/�ܳ�޿��h*�����C�骂.�&NB��T�-|�l�r.��X2���n��V9
�
=D�7ܭ�Cs	\*%0]�J�JL*+�-�T��I�S�7SI��u�f%��hE��٠�b()��X�&a�ΔM�m���*D?M2�H��2��V(,՘qz.-Y�|��4� T�� �u��F��*L�dwԚ��S,���
�{��F��L2B�8�
�1��JD*Y��2
Ԑn~�.C]�t(F0f�%š���0o�-׭^ICi���3�I&
��
+:�EY؏lՋ2�G�
���.���!�_L&���P����N�Sy.-v_��s���K���BãcR,Yy������b,=�
K�T2����6�
+֒%-%)!>.6&�"���K`�R���HBI�	�Dm�x|G(��Jo���g���D���t�s���ڊ��z%J��$�I2ߨq���T�2T�n-GO.
�����H5�f�-|
�p1����C�Zx�
��۰ɽ1F�
K���jk��*�K �87�I�nWT	(�c�꧒��{q�V�h��
J�
�k
+��H���9���l��ⅴ��IN�lG�m
i$�d �˃�O5�
Z���:G�u#�B0��.X�t�jO�Kꨟ���&X�'��t��RI<�VXR�s��DH&��Ʃ�N�?>����UFc9�C�CD߀�r2Ӓ�c$�J�7o\��HCi�����-�$a,��ݻu����c�n�2�	�"o
���.�
=n�Ҭ��s[�d�*������þ�RXąK�����W����&���Xz�m%xZ}�u
�8`
T�D!,ee��&'%L����'$�,�ٹ�W���
(���0�
+%S*YA�JM�2J�li�	�0SC�N(�{��u4TQ
+\犥��-�́4�B�N7���Ԁ
R��M2��n�����
k֩s鸝^g��_�
,����EK�n���T]U�`*�JK��ʉI�U5*��^	�/ԕf��J���=:�ѨP�JP�"

p����f�#�I�N��
�(%D�Kƚu5:Gժ�����a�*���s[�s	B�=pė�CDtl|R��麦�R�����^�Xa�{&��D`��<��$JJ�XA���6P�E;������
Tzc
�O��,�Ý*@��(?73=Y�Ҿ݀�O���`(!�Ə�LB�H""���Q���8�
|�P�J�"sLL��Xߌ5f���i3]�-�� Kބ����"/�%�e��#�ʩ�56����d��2[^jc�$��(�\���\JM��/)9������9�@�
�`��U؛J���E˷J*K�+P���y��S'��
�糓K�NJ�����$��LR�M%���
+��� =(�w\>��n0�X5�&�-|���4��0��
i��M�d���KM�
�wk� &ynW�I�5w�JM�Ʃ�[�dJO�P*�ĺE���"q��Q�8���q�p��c�PG
�撙9G���J'�WC�}3��Q�K3]����
�'��=��?��G��%�Z�4,���,��P�}�D���$��2����$J*�D_1��v*��Q��JB?��D6����W��eII��
:��{x���J���/���Ҥ	�F�LB
�� ���,����·��'E�B���ջO�������ߎ
7�y��s]����6o��9p�/ 0�|TL|r:�t�Z�-�W3Q�q#V����6���Xj1Kw��J,�b.Y�&>��i��Y9y�

+��r
������	�l�M�R�
J�Ԥ��舰�����G�����-J��P�=c�d�$%��x�t�bO��E�w������v����[��3���c���(XzF���?bM66ܭ#.L ���*bRm���4���2����]�drQ-V��:�K���u+���ߑ�{Q����
�D�5M�VR�>f�Yk&��bk]��b0�B`�R�p�2���bwj�/o��P�Bãb������b[,���E
��SI�%!�
H&�D`��M����L"u�4(��B��d���N���^�
��O��TB%E��l��D4_��dL�t!",��������ҒEn�\fN�P3
+�"&�\�[�Y�+vT�N��"Oǎ
�N��c�Wg	��zI.�\;aҔ���V�v�9p���3gãcR,ٗ
�o�ݮ����f�菱)�G��J���1���t!,ݩ�$,]+.��������a��ӱ I�9��
�_���ϵ��^�]�ݩd�o<Q�Rqa~n�


p�������!�J��9��S&M
/;7f�u-�بBG��ȡ�!��$Scڍi�
+[8��6��k�%�-@���k�V���q�0��a.��LD&:��5̤z@龀�c��jƾ���C�6A)-9!�BĹ�3\$��ځ�j�=;����� �d&��
�tb�H,C�#�|NBri��d4;9�V�ݸ���A��A��.�%��
+I���Z�%�v�f,�ְD�G̥gO%�@&>x���utP������N��
�~}g*)��b~��gH��e7J
+�s2Ғ�.F��>�GPھy�@i��\�S�'�PBK$�D��*��يS�:�|�@�(�`\0���C�
>r�x'
K�x��{��㧂�".\JJ�D�+�Y^A7����%rR����b�X�B��a�� \�������"$��0�n�ݪ��Q�$3WT�����%��
+յf�Rb\LTx(�������x{m�D��}�׹4T�5&�s�M�:4:t�W��P�U�κ�W&�KN�S���-๴^m�omῘ�p��d�K��'�K�1���� M5x�e&5�kR��D���Tz'*�\R��˰Y�[C)
P�uKE�g���M�q��A��@3޶�$L[,۾}zۓ��9�w��0n��}�J�9z��.�K�Ó�î=4kO�=�`���Ē�WO5,���Q�KB1�%�&��
 ��u�M:()_�N�v*��
+�����
+ج� 73=9>&�\H`�ߑ�
���Ν=cʤ	cᯡ�h�`R�^<�>�B���}ŖB ���p*~ ��`b.�W�{_93`�c�ƭ;v�;�{�tȹȘ���+W��b,Ց�~z,���`�c��_����ٯϨ��,
��g���%�Lu�FQƆ�hĆ:
;
+�&�H��(�ػ ���{EAD������]�g��Y�f�}ι����0�5��V\�˻��y����;I�o&ܸq#>
�H���&aQ�Lw�K%���V�J���~<6��(]<w��у�vm�
�a��e��f���{$�A�I]YM�����FSh"?y
��R���k��_���,�p-K�D�)�n,A]z at u���$^)�T!���J�﯒fh�����)���(
;��vS$��Asf����
��A�@�l�$ؚ����Fldƛ���&>��}�p�b�����!$
k�Ƙ�;��S4�[�%�mƄ�Y2�]6/KF,�SX�O$���D�9��&QQ�Ѐ�?L�Vԫ��d\�*�a���6&%�]�x��c���ܺ)b͊%
+J�C��ؿ/%�|6��$�[_�f�Z�#�X�F���� 2�&�D�P������o��a#F�wv��
0g����7Dmٹ��1_l|���
*Kp򞰲�/��Ԥ�U�����)����RvfzZJ�� ���߭��h���D�\AI]�7��l�7*JO9J��N�8rp�m1V.]�08pV��^	�Ǝ�L at EU��5I�o���H��y��X�_;,L�:kR�hH�
j
+_�fCO�x
+G�(�WR
+�����ե{��
��Mz�CI�uǵ�*Y�J���޾eS��U$g���\���̸I#�GFQhhl�hgռ�2*�u�%��v��
�A�������Ü ���R4�t��)Y���ʈ%
�$��T�
Xb.�zE0�L`�	$�I��k��V�҇��AUzAU�^
ǜ��ۉ�Ν:~�zt�ڕK��(ARw��лg(J6x�$Fm��x�<:��^�\�Z�Y�\�v��֩k7b����;cnp��k#��������!�AY��e鱦,�M%�$��y�� 
��s��.��"L��? )L����/(,�c�P�t����ͮ_
�V"����X��
r�2R�((
�<�q=���ysg��x��=t�#U4�#k������:m�>�=y
JV�2�k�Wq��%{�‡�>���S��%+ְ~@�‘�S���R>�N*K�K��^e%�d�S�<,�
+��i��$	��
�k
+J��"֮\�A���dwef����I��$�L?2��i؈��
+c]S1*�Pm�K x]r���5�7 k-��.Xڣc�t�Df���P+KZ�~F�H&�^"I�(iP�EE�r��W�����$
g�*UU��܅��~��8����l\�j颐��
+J�������R:l��@l�2{� �v!L�Z�/���j�ަS��1N.n����
��tպ����9x��ًW�nJe�6��;��Ԥ�>�"�Ϟ
�%S>�%r)5%%999%I�����ŢTTR�(=Р����U�޷�����0p��tKF)z�����-�3�o�W�	�FS�����ޮ{�.��I���X,���<��?��v

yT�^����Y�S�hL�"�/ѧpb);WM�%�Cթ,�XR����
+d⯊�$��O%���{��n�/,��a����[�}��ې`
$ԙ��m�L�@&�R��)����J��ulZ�d.�t�bۻ�����C×��X�t5XJ�d,UVU�R�� =XVIǒT��K�1���HҘ$Pz�E�^�T%�Td��΀=��z����ݱ%j��e�!��L���䬠d׭+��v�^-�')$�b�����@��A$�L��W_C]j��ڦc�
�������^>���B—�ްi��}���:��\�
R�E�xW�JZ��
x������RYI�]�%p)3##==---=
Hž��o�����JA���oߣ*�_����Je�|w@)A��P�\�j����|�z������^v�m�I�uM�D��MPd6�8�<>3�v�0�)�'K�X����U�jMᵱDu��s�%�	^�t��L���AI�J����YZ�#
��[@)Q��[
$��Ǝ1L;30	��7j��B;2
�&���+!ؤ�2�D]6b��	.n�Pkg�
^(�t����������XRr���P'�d�&����!���d�R�J�J���ZW�2� �_�|�����vm��X�bqh���ޞ�����u�dӾ
�tX/a�=�Yl�>�c���цLؘ`�`��.��ֺ�m�q��#�N��1ez�����+�F�l�}���3rY��ƒ�B.K���Q%�,��^b��n�� /7`��ė����&BQ*-��'�$V��Sk���BI���nң��PZ
:?p��n?LTCw�
�	ڷ�dn���X�f
+�?u
,+���
ݵ3H��kI�Ȓ�ŸԖ��Ϝ�ҿ9KT��K�
�L@�� Iz�
+�
+��*I(����$�\Lp�7�]�pV��[
+)H
�3Ӛ��D�V��@�9�Hs2��
+�-U[�TkHv `P�k
>r�������K�jO��w3�X*,*-�TJ������Sb��%���l�� I�$
J��ի���һ�S�rUJOIJ�~�™�G��
�n咰��3��Nvs?�
�
�]:�X�mE	׋��琉�������
+��V_),u��է��߇�7��s����aKW��ڲc�T��LE��(��*)C4.K���e����nj�����"t)?/d���$����Ҳ��{U�
�d���7�O	����9�^�(ma(-
�;������e����w��2��m�I�}k$�1��C�
+��YY5�N�p[)��)<�.)�Y-)�2Ko�%�b �K
&��$0	��%e.��J�*i�<4%I$޸~�"�tx������"H
���g�9�\s�$���I�Y�L�6��
+VH�K}���0r�x�I
^Ӵ,
<
+,]��������[PX\��ښ҃�J��.!L$�k� ��d�RMU�^�ߵJʅ4�JŅx
�c/���wǖ����-Z4������4��Թck}-���(L��b$�����c
F�E��1ե/��u�V
+K�

1z����4���B—���޶{�R�2YY�E���[�EU�w��
�RUeEyi	s� ???//�,0�I%e��U��J�$����2J"	�/����K�
+��''%��w?-7%@i���Wg��,t;@�e���j��o�y�M����v
���@�vM��k�M��jN�{
R8��ǔ��S�Ԅo��Z��%�IyO�I8
�����/��*�,
_$�N����l�
�(��(�
+���`#X�]�5��H�lA��"A��%b��-��Xf��f�����s�3�wa�ˋ��߳��o�*�d���M2	VoS�UP"�6П�D_{;^�ڶ�zӈ�����⨲"��V�%,�4(;�����!X�E���� ^Vn
�R።ۼ��Ո�X��E��ä�A��J�oT���œD���2tmUJ޷g��M֮�X�`N�4����~�=|ٯ�R{
+%,J�Ip�j������D����?K��
�\�


5n���-_�m�F(K{�e��\��
�q*�e�T��*�JK�!� L�~��"���[���Ҳ
+���P2U�^�~
+C�_QL�@�¹��9 �T�Ү﷈P�8v�����t��[�$��~"� 
���)���
+T�kgf����Y���[�Q,�@,AT�KL@&���C�$�D
�7��J���=$��&q$��-�����&"ѧw���bf�\�&glmĬ�Q�\jނ�������B������y,;7�����?�R�oR6���KL�L�M�3e�1(�P�=��vUU*����U)%)a����Q߮X�h����G���t(�(u(���e��_�I�\Il��g�N�ڵ�=��"�E�T�A��
KV]������y���Ј����V��\,K�!�%�GOi��1������Bk�K�e%P��n��L�


�ODReRy����U��PO��B��m���K�����u4#5y�����#�B��
�@�v`�ݾ
Hw�
+&	��cU�q�:O�'��
�p^����	�>w�a��+���s�d�\"`2I��L�L��3(i�?Ղ�bQ��M!�]�ШI
:��V�Ҭ0�҈a�nQ$
�l{t�E�e&k����+�p	ET�~*'efŖE�k���`pȘ	�6m�߽7)%-�x��3�LW��p�*��Q��h�
��rI#��I��j��P�B��L%i�^�l�U)�Rjr��-߭_�n��)nj
����ҿoo�
�)(ѢęD��K�
֪ů!�K�U
2,Y �l���wq��2,d�i�s.ce)��qȐN�]%
Q
��
�P~}�[D,ݿ�X*E.0�w�V�̤J
�^�����.�7����C�YS?_���},#�
���� �� ��%{&�m��� ��s
M�#u�p�:O�'���\;n�.Yۘ��
�‹�dᦱ$r	��d">R&!�~�ҿe
*������GRh�I �6Ǯ�P�:	�4tm�(��xQb��a02�O�:���"'E�-

+�����������/0x$�i�Q1
K�G`�����R+؃6&�B����#�
�H�$Τ�C��J�8���~�2�j�*���Oع-.f�ꯗ.�>mҸ�aC|
tu�koۣ� %�(�L⋥{�k��Ÿ�[%a�U����Z�����:p�_����Cg@��,�L؟�~4+��Y���"���~Rԝ�H�ߥk��N�R%�ҝ�H&�IZ&U
J�ȥ��}�~Z|�:�ҙS��3�&��
�UnJ�C'�		���rwu��j۳{W��68�f�f�iQU5Uv��!�I�4x2v�Z�X�ܙ��-���\"`B2=�<z�H�LB(=���zP��Է���d� (�]�P����I� J���R�`E�eF�D5BB�^dF����1)
�U�n�6�%w��
K3�BN+#�b��ؓx���'rN+J탇�
$,�,K
KZ.q2��Ȥj@��J��^�o�V�RV�~�����;~Klt�7�A�f��=<�o�� gGX2	J�J�d$���=dW��a�o��'X��U�������9�yz

)����-����̃��1���T��*)��`%��JK���"��"��EI�� �F�$�7�����^��ϟ��:y�Hz
+�Ҧ�ҒJ#���=�]�

�@�p�n�Ԭ	0�>�eS����� %�I��5l
�\�������C����Z���X�,	uI�!OI�I���T��[Eh�$X�]�z�r��4
+%�A�n�Ht�d�̌3�.ݚ���:*��걤h]�A�?�Z���XX�2��4bed�Ƹ�;ؗ��q4+����b(�����P�����'a������I�Ϡ�J�
�$q�҃{�m�U�:rUڴ�T�9_M�8f�� oO�/�9���Yuh�����g�(�E��b�%�ч�Ǘ�&�%�iK->oݮ�U��6v}����


�ei�T�0��S��.\
�����9h A���%�K�e@&@����
zc�1(��J/����.�q��
��O�8r�Ё�=;�m���D(͝ɡ4����dcݭ��$�M7�c��Ư}�s�{�
[���X�K=
7�%�K &B&����Pz��$�ۧtQP�hhg�O�<�M���J��s(�vKEB/��u
Ef,6�ב���f�����S,�>LD,-\�jMt�f����iDzs����ր=#�n�!.10Id��$�*C��J��TJ{*�* 3@�k�/�Ǫ�)V�y3�O
<������ƺ+
F�RS3%V�(��j�)���r�b������6
��l�
�xx�Ke�H,K{��N���t��XvWgrTc�(�s�%V��K�w+ L�&R9�I�$Z�J���T���D��"0�y9YG�&��aǶ��ё+#J3$(��8�����lفHws"�"���Mq�>0�>�@��еӷ��`�v���ƒU��[x.���h�p�[�	,��\B0!��#H��Db�������w��ЈI@���z�x�

(I"��L`�^d�-B�J�ʼ)��R%���f�[���Uk��n�~WB���L���.QڃS��������
'TC�w�J�h�d�h��(�X��$���vUĒ��æL="��� gG{�
];u�h�J�-J�^�I��2x
�n1.q,��` [...]
+���ZĒ�������:8o��

+��OJ۵���c\���R��
�vJ�K�dh���$]	uP��S����(��
�e�����))�h�����kK�����2�j2~�(�����}�1�9�
�>�K�jQ.	X��:�0Xo�H�qiY����ut��
+�IH�؛箘�x����3r�~arT
+R^�,�B,Ѻ�\"`zN��
�%H�D�B�E%�ت�E���˄"p�FUť�E'O
�ݿ;cGb\�@_/��,�L����I��[�I���H�^;���Y��6
��K"~,�T�Yb�u�nC�-�|f��t�%K\]b�đ�{�7$L��
Tj�M[h�vg�&R��z�J(X��R���L#�*Ȣ"I��p� ���Z+��|��uv��������ۓwf�R[Rv�������Aq�ZB�pI�~I5�:��
�$[7����ܻs��M4���'�e�*%�FUi���sfN�<a�����/B�
%�I���f*n�Kp�zb�0�!bYZl��j���[��F�'�C�y�K�_�����Ǯ��S�
[����qX�'b���	��=�@$	LB(Ѣ�
J:�R3� l�0򆺚�J��ŧ�
:�gWZR|TX���g۵V�W,%P��Ai(�JwON�;ub���$���>��
c�=[�po��h������]�|,�[���P�dX�D�D�$>
��I�3(�k��[��v$�Em
B��z��|�B��tJz
��H��i0��L1<�KiT2.�A,�Z;x���a���0�3��ek�^g���5 $"&!%=k���PjKϗ�=�ą��O
n�K5eIG]�F&��ҿl5�*�G*qG�_7p at z"A�����<]�wh����P�|<�*��X��T�qc
G
2�s�2��� %�/)��K�t��b��QW�{����c?�,�Κ�h���Z;'W/���ĴLD~�2آ�z.ǿ?�S�+��-�hK<� LH&D��f�I
���CI�����K�o����
�����W�\<W3?����3y{tx������
��|�)������	}�Hw7Z����& i�I�K
�z�"�Ob�f��������lOٙ��s�Xx��k���
��ʲ� [...]
쭌��73-9>:,�ϛ��ۅ�fsP2@(�vۻW^$��$�\[#c��Ia��Ek-`ib��xbi.���z�M��>���q�Xj�R{�r%�C�N{�2H��i�I��60��J�J���Dq�m��Pw�Z��sgN�=������V�i�&�6��k�P��
�� %q��o���ߒ
?�!���4a��s,1_m�����'0,:!5cOΑ'�i�
���}�v��y-Ò�K�L�ӌH�0���ƂI�'�J/I9���4޺y����|i�Ӄ���Sb"B�z�8٭�z�Ų���1�1u%"�J��~���ڵS��O
7�Z�=��Ј؄����r��_��¤��}@��9��u�%
,.Q01h⾖0I#��PIV��~{��vIZx��V�$��=s��)	�����ٻD�r�
�3�BM,�,��`���6nv��
+��R��7�0)��
�����,)`I�%�G�j��R����n�*O�U����`��<~������ѐ������%�J3`ь [v��^=��Q�(�q��X"�׵S�
�ƙL5��1Z��Ax��F�'�C�yE�.�$aMd�~���z��ފe��W�� LM�y�!�0�+J-��)7%�dU	�[Ӄ{p��j�+a�ŧ���ߓ�#1624���u��zk��f�SQJ�8(��)H7����}��\;M
����%r���. ,YR
�
܆�k��p8w�T59w\T���z��,	�M�O��H,��
J̖�U�Y�ok��r�
�C
��pu��@(A��b2^
+%h�lQb3{w��$E�D�"����>�i��y
��������3�Spx4)��P{��f��%E.���o�ʦ�J�4�
��v
G׍8�}�m���J
+1ج��q����[ Y�U�*�7
E��F<�ݺ*A��M�d-b�7K�MX�>�9��Ʋd�����ut��
��ML��΅cWRV^Y]S����MO�j��J�X�p	�D�D��!�g�P��AI�Jx��g��C�xc}��kW��~�w���]iI�Qۂ|��6o�`m�r��Jc�D(��ԥsgF�u�7m
�c�T[�`

�!�
�L,�x�iH
+V⻻���y�ʒ�.I�$�-/Jm��֪����o!���y�s��<�6m�L�	�ۑÇ
D�Ĵ[Q$$��"ӵ=ړ���AK'O�b6`i�j��v�.�[B`�R3v:U|VnX�~R�I��T�I��Tf�A%f�J�}k��›��u{H����b|���v$Ƅ�z�Ҫ�h�,S�*
����G^���:��-�S�`��F��A|1g�b�Ր���O`��/Ө��+
��M
����4ֈ���DD�� � �,�<^��A�YD@�Y�IDPQ���A�&��6��1�W��j
���w�{ι�Z������f}�e��}�Jʫ7�v�:{
U;2H<
+t���SIK�.�H0Ql�?�3�)�$JB�\�*�
j �)��`��s=`�M�5�
�g�l���* �jj$��}��{�����t+�;Jl��>����ܑ-<Zx<j�;��K+j뛉>0x���� pVX�����qt��,�^��4"(qU�ﷃ8�֦�Z&��� �I�C�%a&�����A�$�Eh-K���I
��-m��y�IC#c�Ӳsw��_^}��h�L{PU�D��IP��
g�J�i�qTbJ ~�m�Wq��P�*K�
s�S�����y�:�Z��#U�PG�N� �
��8�
�ء)J���qD�'qdIK[Wbh���~���&�95+�����P#
+���>�|�+����:l,ѺDr	��d�ӓ'<&)
%U�w�6�ӫ�`�gNv��
��,+)��Ʉ��D��z�:�Y[�H�4��a�$�tIr��l
W����s��+
��IHJ�ڑ�{_YU]CK�	(�x�p$K���SL�/�
�h0�~Ę4RUB~
��&�ۋ�o�Z��JvS��z�Ј&���PJ�"Ad�c�𢢒������yK�
M̭�8�u��'�6c[^��5�M��p��}��1%K�(!K�)�Q*�1*��fR	�$�ܿ�7:`_�i�6��]9�)�@��*Sx
�J3�c �w~C�Jr�'�7���	�,M�����s�z�&�

�)%��_Q{��������h��KGl�|*	a��%�KL�����$Jʨ��wѯ��k �0�������a�;�Ӓc#C�~^��m,�
+H�t�
A���1I�����)��
�ͭ Kn^~�C7�&nI��-ػ� h����>�p�nqd驐,�
�!Y0��D��P1W���(��c���aO
+r��<qh�$h�%��
�pT���"��XZ���t��&�m
]<|�#�㓶f�����ili���n�,*Kr�Z�4F%�4�
*�m~N?����A�~7��ٓ�%��%E(ׄ�� x��j�*Mê��VJrȜ�)K��9΃I�-72�Z����
����}�n<
+ء޾�KW��q]��I���K,.a0�h"�!I�IbPz��0�
��cR��}�ri�¹�����5�
�C�
+
��v[�����p9�Ҽ9��4��&����p
h�.���ã�6�dl�YZ[{����$x��K�,�!d����;&2%�$�b��Pz�W%���6��(�жg����{�J��Ξ�&�Q�L$(��	��f�k`,�02]em�䊥66!9-;z
��F�
�Q��6j?=�e�qZE}]L�oo��+	a���w��
+�
���q�����$us\T�����a����*a(�Z
J‘
+�NR	�8��ޔ��$4��u%��8H_ihT\Rjv^aIY��&8ug��^a%�7��$��K/X\�`��D	#I�I�PR���*}�T���PN�hoi��*+)���ܚ


����h���d��eK���Bi"�䁣J��1I�ډ��L
7E-���'08"&>)5kG>��C
GۻN����]��*�]�,ѿ��aI�L�0���I��J7�F~�O�má��}�!�T-�	�lXo��]��(d�I��ƏGG��4}����~�DW���̒�ڰ
7�dl˃�P��
��-K/��%��FI�ƨě����F�J�JBu���x�.<���
��O���ρ
+���lg
�&�ՆU���4�V%b��i)�&�P,Y"&��G���5p��hށ!�7m��Q��%��}�St�����?rg!�J�X�r�"�yF!	3I�xTz��V�G?=�O�ҟ��*u
k<\
ߕ���� #��z�:�Y�25Z������̝��p�
�}YG�N�;��
����O��%=;�`5�M�ǻ{�]@b��,	�76��D�$���PU%�g�o��k
�[�BKd��r�ILy���͌��	\,͚=aIObhlNHm at pxt|���
N{��;E��CqYRf����WcT�M���J�3����c���t$���D�./)B�&D��y�:�Z���\·�'�Ja)�&�P��$&��	rނOt`fV�N���"bS2r���f����s�3�,�Κ�
*�`��	&���L��_�=z��7� �FgNv�5��(-.��=`ㆰ�~^n��6�fF��K`��g"A�J�҄��EK����B�Z��.106��qX����9%c�΢�2غ������]��x(}�d�(|܆�{�X;�T	R�Pu�q����i��,�5A��E���g��n,(�Ņ��e�
J&�)8'�Ys�j.Z�CJ�����4�Cr�= Y e���eI4�a���1* [...]
+�X�A2����֕�4�c��	IF'$�o۹{�Ab���Cw�X �ֱf�p_8���M��`�$%A*qU	���(U��=��q��PU����9��I������.k�̍
%zJs���^J��{D�M|%y-
��m�
�@
7�s����
�����cמ��7��"Y����"YRx�Tb�
+����*}�U����1���owdAh1�>tht� �v2*p�)	����%��d�&��c5�9�ԚY��;C�[�q�=��̭�ɒH�ʇ!�EcTbM�
�~�/O酻O��*ڷ�8�
+X��̔M��o7g�����ŋ棗L�ҸqĖ)
%~��:1T"G��G���5�/�IZXۯu���F�%�f�����k�<u���ʗFT�OR�_�R�>q,.1dz�%����P��U��J�Ujm���8�� 7;-9162z����j
ӕ˗�,^�9�)��1()ڔ��o�ai"y��-|)j᫬��y�IC7�&nIߖWX\Z	b�։d�"_���ijRL&�?T�ꉩ�=�*���T"�ݖ�%1�7OW';k
�x
��YL��M���k(�X�r�u���3a��Rk�����' ���ytNw��t��
+:��l� ��K��D��E$�"�� � b_*T0Rk��$B���T�`,!�jm�R�9�:S��y�߽�}������4�����s��{����I�ʣ�C
ig�K`�!
K��Jo�Ѧ�`
#�^P����;

��ϐ9��S�e�ZT5?+m��@���e
jQ�竢������*��K�
nbnm��Nv����[0wQ��
��窱�k�I� �7܏TJcI�K\0��D��wE�$J�Q��ӈJ�5U;����]Q��p����)	1��'���;�X����낿�1��]���Pz
S���fw��BZxHDl�Դ��s���\�qK9�U{D��v�z��;9�$�&�_��z�G����]�
��-���65!&�/�$�ҡ�1����^���
6�Ή@mPXt<�=��P�큂���)����%m*	�ёR��s������zZ`SC
�̱f��y��gB�
+�8�����1Y���u�IX]ECI�T��(	���o م����ۘ�~A�1	��93
+�P�m;+�j�6�8	�v����o6��)M%�X�r�&y�$��w���
���n��T:Z��g[�MK͛������;~�������1�)�R��\(��vCII,��[�	�pWh�~��QqI)����/^���O��ػ���QX�;5bIɣ����/\s�T��;8���NOI��
+
�D�P����F4��PRKj�8�u&�!8"��
vC{�a����ȴ���M%�6�P�$OQ�Tz�Ǹ
��2���Ϗ�Bu�{[UR�s�$�F�{��6&#�A8Y�������ө��� ��F#�,m
Gy��
�F)��,(^�n��
{�@�>)o�RI�t2�De�_*d�J��!��W�C����;��yÚ�K̙�;
j at tX����hW';k\�=�oȧ
+B���L٣$�z�f[8ڝ���(/���ISR3sg.,^���
ȶ��|��X�)K�SIF.Md��~��J\s�*���D��
*1|;):<����c��h=�K�|(	�":ufu–���B-�h���0
f�lRXj��XB��g�cZ5����6���(��H���8�&q
��_6�?�T�u+����N��

p���
�:���Oof��
*�E=T�K�%��3�R���C7e��?953o��%+$�h�Zw������x�*߸
%�$7�x�$�H��$J<��S�L�Q��u��v�KP)
5`�q�q{
ӑF��A���儒f�M\H�X�cZ��!ڝ��i�!�����RX��`�.K��)m��$��U⑤J�C����Ȑ "����\�4^$���j��F����
+��� ��]2��1-Z��=����}��$�F�H�����=��
����gN�
'c����]�d�,5>*4`�����-�a� ����Ơһj���Tb�|��r�	4pwOXF$��y��J��w�;x�����%bsL��RI�2����l2��ͤ�b����2mk���^	*���HI��
+�0������
z�`}]�od��J<�����>PW��
�p�ў�~�a��?�F�R���������K2v'O3MF��D��T	�� ��HV/,��6��-�f.O��@�b:uA�t��}H������^�=��ҏ���L&�=�Tl���^�m�l�/��+w�K����$����6&#�98U�ADeR+��D�RW��?D�32��ܚ,�/(<61%#w��E%�7l����7�h�ݭ;��Tz�z*���
U
�H��o�r�
�!S8�&��l\�ri�܂险S&�w������9n
��S�yg6��y{�����HZ���
4�Q
 ���	SӲ�f�[T��UK���EX�
���w�Nc�D��%U�	U%.���oQ4{k
�Æp���D�$+��u�����=?���kAT{�҅KW�ӰDdj_XҦ�`
(��K�x��˨)��pp�W--*����� c����LD
j�7�?T@�
�PI�T������fVvN�ƌ�

�IHNϙQXT���e-�e�Z�nE�`R��$�Jg���x������D8� �qcܜ
l,MN
�H����B�-�����Sv�G������},��������R%
KgX���SY�S�wo>�$o�W%n\�UQ�hm5�J�J
߂hf�Fp&�����PѩK��>w�5@�������ĩi�yXj!g�&��aZ�e������Tz�T�|�
3^\��C��|�u��
��g�M�
�;���x��� "j�n4*��Tb��
��룾��ij	��c�o at X�$8�|�r��M�vTTA�;q��vU�rx=|-�w8uI��T(I���{wpۗ/�C���⾃��=G�:�Za
�g@?�pGl�n�PR����H,��ݙc����

���m��
nDX:wQ�ݩ�wo.���W�J����xc�
*ń�|kE�V_��.]�^()�%��^��
��큃�K�+�"� �����-�H��<WW�7�hSI���J������� >y�ʥ�Pޏ�)��J����˄�N�B��4�s#
���C�PR�J�2�cn�7�8��T��)�Y����l�
+����I�m��b*�kު��˩Tb�
��n߼q���

��@A�e
*�F��� �Z�����e{ ��N�PҸ���)bw�����C�E����@�����-�%bw7%v�K�۝D6>�
+��Y�JT�*�¢RNFJR\Th ܺ����򭁞P���$�2�õ��<�eۃ�
’����=Ha���Xs˩3�[ۮ�������cq�m���Dm㏞J/�JN%�Fz�M
xq�7�)
+r��$�F�{�EM-L�5�s�(��W@%ũ$��p�����gbHd��3�~��� �����6TN%9���#�u4��eK��29 ��A)*�̝% ��o<������>���x�����X�!
�n�>�elfd;���?(<N��%��@���`w�Zۘ��>u}�jw�h�e���J\�V	�Ө��-��n��D�|(�ƒj��`��A K+	,�kh:A�
���{(��f��$���TR'�xE�xœ���r�
���ع�������IO��
��hg�iڧ7x�N7�4�J=�
+N7�1������]���y���)-+߽�`}cs
۽o��N��_\��m�~:o0���$�7n�L@0����cGj�TZ.E�`@S�j��M�Mu�� WD6ε��%q���e
TŕF�Q3J%:�h��I���8j4�q1�q
ETD6�]QVE"��Ȫ��!�f���(�L�
S5����{o��~t�����i��N�s~w-~�T,�lA-K
���G�R&�%0�]���e�N�Z;�	�	=�?�P�
C	�J
�T���D��(�*�G�h]WJB��G�����q&#=X�,]Aǒ/��Cɐ�g�˪j�[HH�#��7�M��D�V�����3�G at +}��t����
%�I��x���
���b�����&�F����gtV+��_c�Ɉu���X��y�������C)'N�/$�
��N�Jrא�OgT�x*�|{��96��iei���9p�x�J>d*���D3S��Hئ8�t��,%y
+��#n8��Xr�c)���3yEeU(X�tܩ�m׷�@5��E�hc(�Y��L�@n*-�Y@��h�*'Z7�N�ZBz�c�`��0����+~,��X�B_�����lڻ��}��ն��5޷V� yD=<������ĸ�Pp
Hj�$�?k�����+t��MU���zv�eb!�tx��C��el���
�-P�����pDLBr�wi�e�Jw�ZI�����Vҋ��$�7rl� ��0L�ᓉ��SɊL%���|<�)�~6$�z*ZJ�k�'�$�P�O�z�XZFǒ7�%��L��w�����O�(w/$Z�!g�{b�8�C�-<���f�T�۾
�u�h�Z�C�������J2��`,EŒ�t6������FS
nZHI��Ѷ��ﵭ��oxJ��<��`scC
�
>"6r_������u+����� 
L��^A5��V�!��g �d9gbj6i��ֶ���;���Pw ��Y*+��ҋW.�W�?�<�|�V�|�4�l���$�S�@L%��0�p�ҩ4�L [...]
c��beM
���
�0&��$�{m+�^+��wT�%�`EI����G�b '���#Y��r�d^�����Ґ�PZ�גS�JDLh%����4}6����1��ґ�J*.]e���{1_���BR���j�&إ�Mhrl�J�q�=�Si:7���|�{S�����]_J�㎣p.�\c�qc�k
K�
ހѪ�#���a�=R8�^���C	t��!�����8�����Nv*)(����XZ���e��oPhT\bJFv.��+׾mjűt�Mv�*�����k�1ZI�[�i%��8E��'�G��Ŝt�Gx��GLK�}�JR�+:��>`��.�9����a��',���cߜ�/.G�|���=J���j%�\�_H��\� �.mil���*+B��'�0ݾ�a=\`�42�>
Ŧ�
o
�wp�w��^K=����E�:|$K�Uc	�.04*��]~I�d�=~"�.�%�jϞ�"]�i%�(��C	+6�L�T�ߏ߷
+�&�%	z�%Kk��8��{��8�����+*���khla1��V�Jj�ЬVjz�V%%�����s��7��V���Yi��
��r��\��3
�
�R(P�I��Z�s��i���/[e�i����t�
N���W�V�sȴ�@'���{�[3�]ZY�Lf*
�}�3��2�J3TS	ϭ��S	>��(:��Q�0���+K��>�;WO��x����!qǫ&F	p9�qyӍzꐓ�%"Jحp�L%C$7�T�ֵ:I������4�j1
Ka`�������M˜��_~��o�7���Ԯ�o%��� �C|�p:'351.*4p��훙����nj�1ٝ����Fo�J�髫OZi$�Sn&���U��vz�s��9��MG��S�u��1�K
 �	���6r�V�o�ŰK�M>�v#Si	N%s~*
ĝ�˷�.%Y
+�ci�x,Y�и��폣qW��q'4���8p%`��j��Pw�\~:'
P":l���J�8�&�����H�}~�*&�<=�S���3��l��Y� ��; $2�P2���|���/ݴ
+��m%��]+���$x�������{C,�����F��͂�3�ǍAxJc�O�����9h+�s�%��s$�f�sTQ�H�C#Z�Q7�1ϝ��x몋H YiG�Ã��q���a*5�ȹ�����[J�nB
+�_/�)����d,YZ���T��+פ��rq�!���m%�WQ�.7
��m+��-�Ĵ�%p*
�
a���h�� K��4����/\�lպ���<���ã㏤���H6m�K6�"i[���{�J�������m4)o^�z��� <w49!&"��۝�a��/!'	R�AL�
��ZIxt2�@ogW��}���)@��;��~�����7�i�g���>|.�~�|�\�z��:#wi��׎���plD �Jf�&��?�S���S����Ǐ%
��|+w�qצqǩ&������#/=)� :�
3���X�CԈ�$I�X�ci$Ѓ)���̹
-Y�w{ǭn^����{)ٹ�
+J+.]���ڦ}��ն��5ދV��w�&&eI�ٓ��s�{�v�pq����M�`�
8�WT��h�?q1����G����F�&���X�y68m����䝒q���BqM-�5���� ��#6Ki��K�[5��� v����Mv�����?��u<�.%	
+����� :� �>�����;4 w�"��瑢q��J�����R4yf���aA{��!*�ojB�� n*��ꥤh��Л�����d,�#c�c�n
8+"&!)���3y�ik�Zd6���d�m��k%��(h5/h4z�m��zJ ��S'����ߠ��8N��o%8��� 䠕�&A+YX�B�9y�G�
J���V�D�n�M[	��N�Vz.�o���j*/^8���vn
���a�ʥ6V�f�c�N�{���?a���%}����>#�V"���g�Yܵ���ww
+��p�>�=��R9`[n��d0yH�nO�<JL���TRH&���gj6i���y4k78��CN�E<L6-�V�V�Jҿ׶��<�����V��eE4)���A툠�nj&��rR���J�)�܃L��
+gm�|�������RB�Qޕ��Vj���������Ɵ�  x�����r��s��
+�[�mqX���rΗ��=x�;�����;���)�3�����"�oA3͉;a+	��m?1���V��ċ?
����y#��bJ
Q������/Ӡ��4
+O*Z5�&c*e���,� �@���M:�c4�U�D�EeߑM\cHPA�
�Y�2����X�LH��y�������	m��Rݿ��}�w�s�Z���ƒ�� 4vN�,/ߠ��H��-�m9{�2�i��7���S�4�$�ƫ�JbT�>R	>RiWUyQ^6��@�eK��9SA��2�� �����T�
��h*�`*YA��.6)5R����YR�$�J�2��x��;�if�V�f�%�EG���y�.51T8�FIf*
4���n⮈�
:���	�N���g[���� H���~��,tu�g���\��M���6���X�Jƒ!:��a��EK���DD�%�e�VT�������6�ӧ�T���Tz�T������N5�����


��c�BWg�9FЉ��.�*��j*��H%#SH%T��ˏS�B��]��jM%y��P����,-/��LI�Y����
��w���-�N%�c�wq
�LpW������3���ߺs�^/S%Ԏ;�j���A��X_��
=
�&4p����T	0���� UBM��e�0Iڃ�{�IKk{gׅ�|��/2&!%3���0ݴפ�i5�$�ƫ�J��z>�O`Qy�T��C�t�9�ߣV�Opu����#�]k����
�T�0�4o��a�1�)Y�p��-�f����K�gB��T�|��N��HN� c����
_䛋#>0��)�7�JJ��8f,)���*t`JV~�6�)�ڻ��S�
�h} Z?/��w������=NnIAvjR,1���y�s�V�� [...]
�J�%۪�@*�h9s�K��v�/��+X���*���Վ|;y�ȁ��wl+��LI���@f�=��H_��υ�KGKj*	�w�����&�h)�.$":.9-�-Ȉv��߇G��N%��o��lKn����kBWx~��5����{�J�C�S%���8�!ͤ)�(g|��q"��7mBJ��M��ٴ�TҤҐ�R/I�Գ��IP�z������u��47���:e��'��TzMy*�u,��T
+]�!as&I�/
���AS	��{j��R�q������W��ܾ�(7c���`
85 ���41��&ޙ(k r�[u<��8�8ܽ���pgm�Lp翊X������.]m����Ô�_�W��T�
��
�3��-�NM��Z

��c��<g 
��m���e"�a6��5d��:")=}�[*o��I�J�k��T�/ Vr���v��8)���y�������ߧc*�Mp
��,��b�֡�4�z�3�n�J7�>GR����-�8r|
�p�Vpi~�������[SYZ���

�l�������؀�-�7�����7X��9�,X�����e��W�k��z�Y�X��ՖJ�������=�����v��q��]���x�����Y3x��&�*!�%Y�#cIkݴ��6���5n�jߴ�T]cĥ�
���
>�W)���k ��
+�[ϒ�9�OJ��TRsЩ������7���yn�J���6g�A*��R	��]�DRI�7�1��*-��JI�Y���
����l<5- S&�d�[|��;3
� \���s��U�܇
l��ۭ���n<��A�>�
�=8p��]���:��+��u���0����B��ū
�ԧ��=k�{s<�r!%m|��Ȧ�#�67m5ٴͲM�+�M�I%�5FH*	Y�v���N5�_���>8`��ʙ&�z�t��ÜJڲT�R�܃�s�T�B*�1�����U�E�J7�

����8��caN��R�Z��Jb�M#�3��!�����MBVT�e�}ŀ;u���"���3M%2pwδ4ҁ[&��ڐw�F�:�ŕD}��d":�eH�ߴ���
+7m{���
+�M�I���I�A�����DS�����
+�

�r���e[rҒ�V�O�������Rd:���J�9�=��hcS��I�>���
�0�:�]�p����tz2��@�
+sSc�7ѩGK�o��&�J�pg��`����ʰȘ���|\���IY	�Q{	�
��!
R�z����a��U�d�&Ɗ�

��J���H�JbI���M�c`���#޴�q�6PVv"+�7�&��_�J�z'���4�G('m���ʚ�����$t�����X�-̌
tT�
zr��yN%5_(� p�=<�T�:��Mx����P[*��K�ǘJ��uw0���]QZ����'������O�6	�FN-��-�)��_)�����Y0
�\J^qn�VR��Z���L����S�-m��=�����G�߽��8���3W��

\IU	�L�M;�l�ܦ�lڽ�uGO����w��<�(��
�I%�5^�TR�&�J��T6���z���c"�W�y���
l�0�t�L�}�t��9��xa��j�l;'ׅ�JX�o�U����q]�=�?���SI�T:�^j��M���8?3%��4�?]�z��9�u���z��&�
��i�-���.

���SXVY�M�BJ�
a	—mXS�,�ĥ���Z���;���������s��k�p�J�J�tŴ�7m��M�A6m/�iũ��M�I��J�ϤR�w�dr�(��BVB��.H]���>��H%�sȷ��tҺ���J*=��h�����]���SM�Tm-��شq=��4�J�o����y�{��ݻo:}�D�ϼ�W�^���UPRQ�������p��R?�
�v��VYV����X��m�p���g�;x�Ma{`�5M�i��
+]�ߴǚN��m�y��BX�XҤ��# �~�R��wn��@9�����3rz9m,1�x�{c�
*USS�T�h�S)N�J�K�~�u?d[7���
��ܷs{y*�!>ːo`
��pi�J�#��SIE&
�O��ќe����wPUW
�7��Dw�����N2Qa#��Z�D�A�H�.�	�{� bYĆ�nDAi'�n�6�,;ꬸ���9����}��{睿a���=������q�R�p݆�`B� ��%���Z����-#)6"�����f;
\#=-�����q��\*}$}Ӻaw�d�T���!²�6�i��M;(�M���6�1*
��
c��uw��4�_8Su�PYaNZBtx����Id%����L�
�>
���5I�����#5�H���]���
����������2l
�q���RAQI,��MC%\M�0��M�v�9���pD���o��QV�5���=�D� �����\]b�~5k���+ �X���dV*���M���i#QX�9^}�bڴ=��FA%��+����O��lWZ������D4x}�e��J �Dq�
S͡�����lh݋�������+,*
ȝJ�����b��'��
��t�����m���u�`������
*�*�W��OiΙ��N[�,�X�8(���%��ѓ��K8ۅ�N,��#�v��^i���.-�N����
��1p	��
\AT	q*q7�梥hӚn!6m�h�
;y�J_w�
lZl/�mZ����Q�������x�9�Z�

�r
��<]p�jI���ARI}�"�J�mw�T�*�/*�����7�����T��������|��Z
ܺ�|h��
���4�px�s��WJ	�����w�rp�p�,�R�R��ݿP��C���y�����jN���(��J���F��J�|<p���)���L��v���������}O`xtBZv!��*\�`��ћVA%�F�J�2X�� c#=-��O�S���UsH*-Y�m��n/�R
+P��M%�2'7*�b��)�۽!��kkȋ���qs$F)��nV�M������o�#%�Tf��
+J8�
J���T	OJ�-:p�(��w,�qeH�_	�_���o�v��;W}�Hyq^FrlD����.��[ME� K��`�H��Q��m�o�u��*rӺy���B����4��
U�T�>۱O%VX>f�%*���3S�"C����3�X�
+@R����I���.� �L��������C��?�"g*�*�u�Э��$?3_��0JI�̜���$�|�
:�j�Gq�٤ϩN��d�9.�A�����w\�܂u��P�%�
�J��$�
>��έnv�T�%��
��p���زa����%
{��@Dc��q��$7-�b��"{�D�%g���M{��eJKr�>{��NK��KA%�m�J-#C%",{9a�ʠ�����:�"*1�r����)�J!<T�K7����uC�1Z�h�I��~���F/E4J�y�M(�>4�Dq'V��B�p��¢�S��$ukm��E����=�+��Ր���������\w�L��Ce�9i���8��7��1�YW]�k!S�ڴ鸙���x)a/
kO������b�i/�_�z��7o^�x�*�Ľ��N��*<
+�򒼌d
�.��7�5�]��D�n
+�dA����*���Ӻ!߮�4�_@�)+�IO�����l�F]4~)BnݜÌ;���cT�-mw�������_RQy�T��m8����ڻٻ����JS-�wiAvj|TX�����
۾]���7��|����Ӕ��!���@Q�,}�{�iie��'hotbzN�7m
�}�7�/ț��QP���
+*
�J�"*�
+���	Tj�DT�܌���`_{k
��2H����"�&����Tj'��/0*�
+ݺK
����}ܝH��,�����ƃ�R�/��(�z�n��~!؆��G�W���p�ڍΞ[`���C~��mC��
o�=%:[�����kkN���؟�����hki���H_k
vJS&#{�\yk�;�M;�ڴ�%l�5&���sr�	
�JH�.,=�]���u���Z�Lۃ�Jb�1���A��/�
+���}��Ź�It�g�%E%n�!5���I�����*(*
ݺᡤ��

�vs�ii�[_�Ѻ�Y�'�|�
�%�n+t�
-��
��{c��s�
>v�����W�wr�K$����ꕨ����v�M�����e&�F��y��پ�t�!����\U;eA��Da)�i!-E�卥��n��}��_�;]S�������?��RA%	��Ұ��&���!ԬSӊTQ���R� ��o��}�j�%��)q���^�C16��Z�X�O�T��
�j��
f�}�(�SQ	����J���ps+;g�=A�щ̇����J8<��!˔Jox�Dv�;�Ζ�����`m��t���%��c{�L��N�T�lډ��A�VK��x�V�_ə��T\�q��m�rT�RP�q� �
b*u����@�CeE9i���{ܝ���Wj����R�
���� �$��⼌�؈?OW�7F�5��oBlݜ#��cΙ%|��*x�ۈ�
���]Xz���뚀J��}�N�q�tǠ�;:D�8
� ������|�:+������B�{��T�	�J�Q�޴�s5(YX;q���W|����s._���s
���#
8Ϟ���R�SP�qc�J����w}�
m-�3UG��%D���;��a�������h5��4RjJ��ҐT��m�T�-(*
Jl�Ռ���bo��ݺ?�P�����sT�u����<

�y@%�7�Y�:�����U0t���hw������pG
vGiavZB4v�u@%��MSBT�����Ļi?�Z���V��
�A{c�s��;y�b���;�gP֛�
+*��ƻG%�;b��
+
�qs�i������
+j�(�W��RS2�f���R�S�n
+�JR7��u�Y��k
tp����r&ݺ�o�#���YCs�R-=#�[A��^�� \f~	)�ʃJ�%��U��҂����� o�
dg�w6�JLwHM;&��N@%N\.�Y��dӶ
vN�{��k�M����g�
+
�x�^A��B%���~?P	~��*��l-�6�kjp�D�)*��d��T��q ��7Q��N�ӟӺպ�>�dy�c����C���G�U'�p�~!؇��G�W��Ԁ|�C��Шԏ�ы��X[s�De�����8���FzZKy���l�Q���_�(.�M�M���O at XT|jvA�A�i�Z�ڻ�Ц}(�M+.��Jc�J��A%	�?����iTT���
���6)��n
(
+
+Ddp�}I�E�U�a_�]�d؅aG0�hæ��7@�h�(D=V��
MO{���޹�
b��%��38�<���y�������ic�Sæ��Ms웟�0*��#��*��J�R%R���*�����R�
+�3��n֧���6�D��

+B�DbI���Tjj;���z�@�
b���g�
���V����PuW{/�;s���TYR����(

��t��޴�
+��c�ty:h*q�K̉��� 
+G�,
C(
�up��

+�Iڝ�SXZ*5�::��/��+
�����Uz
���Wg�L���n%����J�F\%
B%���vr'��gpS��\�
�F����[�;;����a�hG8�+�&+Vo�l���#��Oޓ�W\^s���V�{����=\�
�R[sC}]m��@���
�����difd��C���n
M�Jě�����͖›v����o`8q�USޗ�J���W�uU��� ֖��1��kЀ��(��GZ%j���S�0�T�}�:\��]��e�ꮂ�~ga�pW�����
hd?�J�����i��]���|9��m���Hd\2c�Ϟ��7�&��J?��=��{�������YbQ|t�`���햍kVX����h�����n.�ĨK�pT�ЛV�i�,A%k*`�ie-�i��P_��}y�W�W�m��M���J
+m遷%�T�ݻS)��*�L
�}��ݎ_�%��-
��$����d�1?J%jp�ɠl���
?56�6���kgpD쮴�ܢ�j��-�J�7n�0�#l�cr��������B�[7�]��������<��>n�X�Y�,�ם��1s�'�UQ:&��XoZ��H%-
=}#�/���"�$_ZQSW��
�i{�@_����O�^ڗosV�J�_�W��B[��������A�� P	oKSԖC^��J��ΏPhp�.�;�A*��-��W���<������Q�cn����+�}f������;3g_i����h�������P>��U�ŋ����4��t��'[����/����MK��
���W�\M��:��xZ�96�!T����im
�|!Q��{���k
9�ԊT�g�l
F_�P�x�X��(W�?C���
*�>���Q[�*M��_�b�nc~k*)\�O�W��Ј�B>����f}r��0UR�6YTZl�T�j���
����SXZu�бF�Ro�Г!��t`��U�p�J}�J-H�겢�̴]���;�]��|�~�2sc��T�ꔨ�gC�X*����9޴&��W�߼m���Hd\2�q�*4��/x���=���ԃ��n�Ji�T�
����-A%Z[��&v�m�^`*=����n�V,4��y�8Fh�J/��_�|F����m�
+����@%=��f�Vk7Y�9{��	Sӳ
K���d��nsI�ǸJX�A%"�e�r3w'�F��rq��lݪeK�
̛�w��)T�aS�ũ�*Q�9�J�8�s@%cs�q
\��qbw�e��U��i�T��q
޴�8��W����J��J�
��I��F�$F*	@%[R%�
ϫ4Lf�~{.���
�*���]��ˋ���%�E��ս�vuk��T�����h*a�����&�J��u�
�L-�րJ��� ֽ$��R%V��:;d(�U�p�[�t�bPISI����75���c�i��1�Ɓ7�����_PDl��̜}��_
>v����l��>�
��>R�
\Ԭx��_�W��Cb�W{.�;�D*UH�%bQ<����h�e��&�J
+7<����Яn\�@�>L��RuYQnfڮ؈�^�6H�%���LQW��4a��>�)��͜����oD
bht�H,)�V���74�� �pC%V��p�"��e�G
�*-��HM�	��t�ߺi�
+7R	�M��2a�8��874������8��.6[
+*m�w��

+�IJ��),�B*�::��/���0^%���*�R�
0��PÔ�g�JQ�Jh��J�C�4�1�J��w��	�D�Iپ���I�A~^.6pu�J�os��[�yu�|,��Nn��-���>�Шx�8+_ZQs������w�_�A�3x��?�TR
ķ85�J�o^��{���t{3R���0;=5Q���lg
*Y���Pᖫ4��*Qs�1��Q!T�7-��g *Y��dm���.LL��.,�B	��w���*�*��^`*=!T��d��R���͑梅�I��7��eɫ��D�IWg�Lٚ�[�t	~u#��(��Ќ�`�1�!TRG��D�3�X�z��m�n>�!Q��{���k
9�Ԋ�t���J�JϘA|��c5
����t�ҹ3�R�Ѻ�ʒIzJ�0,`������5V��H%-<����}����&���>k�������%R����7 L��HY��J�JoT�+�t�>�Vl���yʆ	*�@*}ī�*��T�_�hMzq��
>PUZ����
���l��n�&H%XB%,4cG�J�g��gR��
?51�T������go^q�~P	VT�WY�J#SwJ��P�����P*I
$┄�Ѐ
�N�[6�Yaaj���T��R�=����	TB	�U�B*�Z2&�H+k����Q,̑|�9+^�Q��s�J�*�ݓ
��~�rscl�h���
ϫ��(�	�R����U%�٠�0<�����T�4CW7�&H�I�J�F�J�c�4a��ʠ��fhh��������<�*sL%h:�R�4_"�G�
+|�
	�����Ҙ9�ɪH���psnj
+*Q	��)�N�%��
+L��S�J�x�x�ޘJ�,�*
�*�l���_�R0����W-#T�aN��ɫ�j�!U�}���ދ�]�q�*K
+��S�a��
��)�yu�*q��f}
+*Q���������r,�rnQ��-'�={�r�Tz4dӉ��>n����,L�J�t�Ə&�fb�޴���>�Шx�8+���޴Mm��M�s
+�R�|��*)�{^��V�<���_}���(oo���v��^�_�J%��{��>��
*ՂJ��Pi����5\ݸJZ
��H�Ľ~c}t���~���t�q �e,�>c���j�FE�!�I���hID"�,d���� �I�Tk�K�
�Z��)��Xf��aڙ����=��M"��{���{��<���~?�Ӹ��*w��
Wy���RT���)�ٹb�nW����*�.L�W���h������d��W�BY%c�E�ԓll�,P¬�J�H�ɞ~�a�s'�J�ژ�U*aT��qTBs�*Q��P�k�/�=M�*��U�$QI���*=e��]R����vl�Y���|ɼ����^nA%'��}z�J�k�*5Tj˫4�a(����*�1*�ܳ�pq)�t�Z9R��U6�Jhe#T��*-��
"��W�esͫ$��E	kɫߴ��(Pi�_PX�E	�RA�m�JL�T2��YQ��7׬T�G�T�U�ݐ	*-�}=X���v���_[R��̰*]A*
TZ*�
*���Ծ [...]
�U��
*%�J�H�c�eg�+���h*�p���
+Rie<�
+*ᕍU��dU"+�Q����P9�r��9+�
����J/O�N�(���C
�U厪Tuf��C*
���Ji��\F%�3P�
3�?)���T1f���7�Rbr�z%�ģSNb

MM%�ne�b�<�JX%
��ة����t�DV��o`��XP)�S��t��DU�3�����������Y������Q��ÅTɒ�T��<�2��
��-R�@!��Rtx���5R���Uj�TjъQ�C�nH�!��$Pi��41y
���������+�N*+�R�L���*ٚ�J�KU�oZ�
��u��	
��V�df�P��Ju���T�Ĩ�^�*�p*
F*ـJ�*�_���|�r�d��Tb3c*5��ԎS�?���i��|�Ҧ|4�c'��Re�o�QS� TJ!Tr
	*1+��J:���
"a�Jmy�8
�\@�P)�Qi瞢�ťX���7ᛖ�DU2�J���҂X���>�*U+3z��f�W�w�R	�NY�Y��jST	�l�RT(�l��Tj�q���*5�d#Ui����T�Ϩt	T��Q�	���J���S�j��#A%����N�R}��jf�
(e&K�J-�J��H%{^��J5��mA��E{w�U��p����4UjƩdɪ4���5TJT*�*�(S�UI錩J5R�x�3�׏$U^���of�
�T*����*-�f�PɋQI
����
��
�J�2��@��J6R���J0��U:OU�*H��X�cJ*��o׫�����Jꙑ�tSM� e����J�STI}tZQ�Ͷ
*53�F���B"A�D�R>R�X)l2�
:'bXT%�4�_�|B%ow��H���J��JzfF�RE�U�o
*
�B�[�RUMg�G�J��Ɠ*�WP�>U��d�a��g$'r*M���Uz��Tuf^淒)��٩tϜUj�����*=�*Q�^�JO���Y���JKA�J*��*��J��T
+�C�T%
��V�S��T�רJ�S�ıC�v#�րJ�A�i�S�J�����S��J�
(e&�ό��J-LM%��TUQ�J��iH����S�!U�.�EU�O�
TzN�RA�M�J��J��
�R��T�G���<Uor*U`�N*��T�B������Uj��JqT�רJZPiu������J�$*��i�*���y��o�gT*C�+׀J�թ��J����Y�ԗ��|fT%
�����-�P���J�����*�s*9��J6b�"A�D�J�4������TZI���@^%
sP�VA�l��r�JT��R�U����Q��� 3
wmߒ�6-	T�	��tT�T���i��\��`�J��T����n`T�������(e����J#�'����D�J+�JH��Ҳ�r�*�JjgLU��Jw�J?�Rg�P����}V��H����P)
T�Ǩ4����R%��H�`�9�Qi3�R��Tz&R�{�J���
V��H%�tj*iqjj*u���Z�
**�NU��1U�v*]�G�w�J5�
��פJK@���^n�}<���,Tj�]e�J�{�A�	*- �2�J{��*�1�J�ӭҷ�O�`��J�@� ߩX%ǁ\�1*���Tz�S�=V%���O`HT,��"�t�t��DU�k��-�RIޖT%}3ß3�t��5g]z�rP)BP�����Y��kRuh4�(���T�vpP�T
+���P�1*�;�}�v��Y%h:^��ԕ	�R�\��m$*is� &S��T���Rfv�X��"��
�CU"~OU��J��|MU���p�D�Ҿ�;�nZ��T�1}����M���i���v�V�J���}B�@���.U��U��t�W�T�W�t��6f����ÂPӍ
5�U����ֿp�偝SSI����r`N��R(�Ϫ���p�IP��
+N%\9�Q�T~OU��J�-�J[�*1m�v��T��dFP��7)��֬^Μ��H��Xp�G�v����

��T�pmǫ�B�ҍ
+��JpӁJ�t��*qM���âMkS	%L�r<|Cg�J+S27���T"*����{���TIԖ�J]�J5�
��&W/�?S&�&��I#��k�
���J�,8�S�
�\��?�4�J�
�4�2h��`?O�tN��A:8��t��J�]z�W��
+*q�sVV9T%��S��B���DP�ɾ��UI���VV��Qi����ĥ
fG��vG*�5��k�	���mqh���J
+;xo�
|��
��*I��1�t�P�
,ܵ}K�ڴ$P)&<���MPIig����H�	�9��h�὎�J�\�A�$�+�;�U�@*]aT:�o�F�%T��eF�wM�J��K��3�&����eV�7M[%��$m�^�L�*}Wl:2
Ǐ�J;@��eK�ńO��r#��!���V��\�-[Ü a�]aN�
��
���~AaѠҪԬ�y۾��#%���T������_�Q�����rTڅTJ��Q�j�A���~����\8{Z�&)pMb�B}<�JH�.� 4o
�aZ�*)��[�%n�
���*c�
\�JW���KO�t�D�J8
C�����֙	wkY��75�9��U��!�>�l��_pX���	��@��JW���!Q�UI���QcT%�� ��j.wnT�f�T�_�J7��_�
*�,>\������̔��
c�B}=\?
;�#�����F�n���m����a
��p*�8zh�n����t̟1v�I�ƌPUI�x�Q����ANhNn����1s/KJ[�q��/

9��	
+���G�g�<��:�8
OVcԣ��H�(6��ʪQ&�P$�KQ��H��&M�"
)ҋE��Q�n���Q8�5����Ͷ�����2��������{��cXi̤4,+ŀ�<]
l�l�`cb+��J�t+i��4��0���у�?V�+��'�
+
�uw��Ƭ�Q'K3J3�n%����C;.I��b�{{G15F�C��J��]jm+�,��:�p8"���u��.�m`%Md%�ܳ���Ƒ��Ϙ��4��e�*���ܽg���c�S3�O|u���- ��80�P��V+�e�ă��{���ɷ�r�[	��~���7o3�e���q��1���V���V�AӬ���io���9UV���

��pv��S΀W!�f)�h�i��rQ�c�+�v�+�5���:YR���x8"�������l^��+��/���$Q7�z���s�L�IRz��ŐӪ50�
K=�w
�%���m% �R*X� i% V0�Z�7�M[p+y�V��/[��V�[�;C� 
Y��V�f�+��H���z�8�X��
Zz
[iشk
�v������FV��; �����H_G
YIY
pud=X��83f����O�PN�|`�3���3^x��a����N�V�If$3$HF�}��9do�R"�J�b+��4��aX�rʝ9]�N�����E
��V��	9iv��&���£ݜAh�=(��EE;��^�|�A��r߾~�����0;=)6*4���������@WK}�jU�Vb�-A�飏>�GRr�WZ�z�M
����� 0/]�u��w��Jt�Q��+�(�$�
Đ
�!���J������
m�V��Vz�����ݽ

Z{��5�T�=!�4m<Z�F;مK(�3�i�,��i'h%��C?���R{S}]���œ��#Q��������۷�r�ש�*+,���Q��.-��3��r���721��st����ML��*�j�5�� '2+�V(�+)��J�O4�JU�g�!����]jkĭ�V� +�"+m۲Il��i�_݅�z��7_�8��h¡�`?/׽��LaO�5���=����n�JSƓ����Y���.(%i׍h�'R+�x��5�J=
�o\io����,+��H��
�z8;X[�06��h|��?�i�`��Ȝf	r2��sr�	��MJ�.�rjj�|�6?�g�_��6+��J�`���"����NV
+ƭd�[i��J�J�=y
{�}ړ�F��ɒ������d�>�^V�P�_"'KX	�f�lQƇ�>d�n��g��
+ʪj�M��wr�
��MJG��f�h�_z=�
�J���:�ܸr���LMeyQnfJ\Lx��PV��C���nV���9��͑���-�s�P�
+�I�)Ĉ��9utq�9��V��}ﴒ4�JS�h�ޑ���Z>m���i7��J�J{�~�T�d�%�F���9�Y����j����1+I�V���,
푴�L
N
+��
h��уM��M��7y0�	n�XD'X��<�p��ͫZ�
��y�|��؈~��x�%(�f��&
L
r24�aa����

���� q^�yC�R�V�y�VB$�N!٨Zi&f%�aX���HX�����"���ҫ�/�������ۚ��UW�f�'
�
+
�uw��2߾�@���NMUYa�
��'s(�f#�hﭴÂ�������7h���[TVYs6�ʍ;"���PǨG¡��~^���f�~�sᖘ1}ڸ��t����/X��W0C������
+��K��-.���/@N�XN����5
�4_Z�d�h%|ʟ�J�#c�.d�V��~c��^�DL�����JO�
=��CwX������TYQNF��@������cC=6i�-7n�D�NR�PQe����a�����Ӯ�I�����N u/i��v�lw"�������ڭ���~�J�W���%BcOj���AN�/���������������̼�_����ӽ�2'aQ�H��_�l�O�d�͛�7��4A���5�J=
wn\���p����(7#%.:<���Zcl��FEqj��eQ(g7{ G}��5��n����4��z,�8�����Wo���
���~y.�CX�����v�5���:YR�������dgefb����VRƬ$Ŵ҇,
���
Iم��V�Z�AS��K/���`XN���wXN�����u0^�QTɰ��D'��$�����#X)��&h�>c�e%|o��E���YI����J�Jh�0id��G0�Nd���tyq^&~�y��w [...]
hʑ���*F�Jhb+��0?�
Z����I�;�p�XK�m[6�hn��[I~�BYI��ݴ'�v�h�������͇�C�:lE=
ܘ[	��v�z�n	��p�;�J�M�uէʊr2��D�r=�
�-v�q�~`V�]�l���J�~͑�'���%
+ʪj<�X�;���F�&�e�/����qN�b���V��k�_^���W�+MM+��L�h<+���s�O@���iVx/+=
��V��4Q�4Hk`�?݃E�EY���Ñ!��n�v�f&F�:Z�J��K�de���f	�K G{�i7�ݢ�
+��8�";���F�&�gb=lj�t]hEg�7����n�#�RO��67���,/��H��	�z��!/pF��.��4�8�)�RX�R�s
����
$p�s
+K8�����9={�+1��J�_��1+���L!) 1JJ�VB?RA+��@Z��P�0���
�Jhb+M8+Q[��u�ֵKm��j�*J
�Ӓb�B|ܝ�̷o5�娯SSUV
5� G{Bh7����z��@;gn`X4��M�@�����P�^1������~ +�?z�㽞Nd���Gyq^fj|
���M�ܲI[s��U*J�J�.f%��p�9M�x��$)�p����
r�i����
+��K������iPTW����D
c�*E��3���:jD�@
+�PFa	�,���" a�}�M���(�����0�"��HtX$n���R�5眻�o���*����y��<�s� 
�X�b��

�W� ���8Y	��}��!+ipY�4�J�j%룱��eV����a%Ƈ���Ow��z:��^j��8�Da^VjB����^�6��F��u��f~)����
�
Q
g�������V�YO�fba���
����_T\RZY����.�C����~
c���*;
�q�0�:';K�]�z����U^��|�p�9�z1G<�IK��v�����I��aN]������
�V�O���	+-�@<}ܭ���.�F�"�7���S���.j��2+MB+=�����۷������X[QZR\�������hkA<59���VT��1 
Q���@�?.�
�p�5u-]Ýtn�I�s�N�)��#hw��v���?y�L
+�c����݁;,��f��E��z:�[��ھEo�q�+��|��g[�+�?y�p���r2�����
+���
̩��-�ۻ�����i�VzDZ�FwH���<`\��
+�V�d��Y�U�u��̬쁕���Rq+u��J
�cV���h+} �����-VO���s�JC�J]�m�Mu���9��}���cNm
5�x=�?v�f"�͙ˮ!
�
������3��Z._C����E���
���`]M��SǏ�e��G��y�8X��غYGs����TE����˃�䰜�1�5�KeɊՈ7.}��"�R2����QN�DN�_ 'ɸ���P�8����
��
�Z�V�F�K����V�������/8<:>5+��	+	�>f+U	�t �`
�:���ˬ$�/o��XO�<���������*��Tg;+S8��56�]�b�"bv+�o�3�1~������RH;M�
��0%3����s�v����I�v�
-�{w�}�֍�Ϋ��k*Ο>Q����sp�^WG
�m����.\P�^�TNS���Y�ڨ���u�1�
�%9�O�+�n 9ut������CZ	�����4�`%
+e�n%�H#������ ���NZ	`��Xi��R
a�c�5I� ����V�+��d�{����R at m���d��E��y��[�}f�&�
�V�7�y8�OH;���	�)(*}�2A�/u���8��1=@
;z�O;�¥Ywox]���­�,-).d�'�F����`�h�^_�r̜�
���`���e+׬����7
G׽��мA�� G�O�o��l+
bVBW-�m%0�t���(+��&�JS9�$�:n%���Y��5^c%��i����2+M^+��
���M�ņ��s�O
��JM���������n
�����>�f7��@�y�v��vZ06�ol
ݼB"bӲ�
�K�w��?�v
�cj���
Xi�����rK�� ��

��p"`.\�����
w
�ʧ
��I4'7�`ë�k��D���w "61=[PT\RZY����.�7<��-�J5���+YA�à���|�����;
V�O`}��
�\X/)%���̣��j�V�k��1+}İ�;2+I��ғ_~�
+�
��=�W[/5�V�/).��NK��	������'�c�8hR�>cD;mD;��N(�ؤ�
A��3��u�v]|������������H1�=��D.ܹ".oB�s��h��
+����ޖ�L-�<|Ca�r�;v�LYU]S
��f���!:��/�n���U����%�R<��

+�x�h+M
+Mí��3�������^�$�Vu��F~���YX�Yi�X����7<��fw[sS]e)xk��}ܝv[��44�g�|����?Q�͠iR#i�i3�������oPhd\r��
��r�Z���}wH�=~��Th���:�
w ^��h�W#��e��G��{�8X�
/ܥ��?�/�����S��r"���LyV�6j�@ܘYۻx��Eťd���9uÜ���?�r�蓖i%tՒV�VB���**<�����Q�a%	(���`V+����U�"+��o3"� �����O�
+�����Q[�)�J�M�X��,��&���O��~���2bv'��݊����+�1~,ڡΔ�RSPT��Se�v���3�
��O��=z�Թ
���u���
�
��ҡ
��%�4�D®�����Yi	1C��9�Z��h}�.\�
��{���a*>�g+�SZ�Py�k��v��,l
��I�ʃ9�W7��n`�z���o��1�D�><��,�J�]z�D�sz�]�\o� �
��I�J�V�� �9 YI �T��ԅ�>$��
�Vz%�J�9�I�!���T0+͐YI�_�
++q���?\�&�ݹĚ��ru��f���p�������N�N
�fba�膶!����g\^�p��JG�
�ؤb����n'�pk+KK��P�ACЅ�5�pu�Յ�����TS��s��4�����Uk�Եt

w~���
7��nj/�^�D9
J9'�J#l+�"+�RVJ �Z{kb�ilXG�ı
&�Jp�}�������t���N��F�u�-�{���0+%+x�)H#b%y��$�獷����!av�j��ٽ\UX

��C;���+F��F��$R�Z�ac3��{�g
h>c
X��കЅ�
g'Ր#��E��z8ہ
��͸p霈� s'��\*K����۲}������O`跇�����hɉ�^��R[3i%خ����6GVB9-��Ŷ���v+	)��D�4�}�JI�9���g�H+]��w���cd���a]䣅V�m� ;=1&��Ƃ޿+dV��V�
+����m�k�=m�
kW�X��ٟ��=���T
Z�
+��t&�B�i��������7(4�hWVŵ
�D;�=��#�!�­��p�����x��y� ډ�p?�p��c<�NZEx�����G��w��

+��K�8R@����^!-aN�
?����v�V�v�gcV26ںY��Y��|h���B(A�-�)f�nR�Ҁ��>�w&�t�ᯱsJ���
Z�X	�F�J�b�4Ef%�@�+����}+�ٝ�
���lf�X
����k���_�c�$�n
�
QB0
���W�

����hW�h�
[8��P�{%���
 .�+�j���~�uu^qxL��ѶqC�F[�(�bő*Z�b(�j]
+.���PEpA�
�M)Hą�E
.�%l�èu�Vkk�:c{�y���5���p��/��y~?��y�pC����4\ٞ�/���tҔi3��N.�>�D����⒲��ںKW�pOx]����J�����Gb���J)	Q at bO�
��NK$Q�5,�fV�b�$;n�"Š����I�D��2g�W�j��YV��D��'�
�m��b%�V:��e%Ņ����������g �L�1v�c�� N�u@��
�igfnaie͢��:�-!Q	���WT�Z�
[�+|��:k�-�W�ϟ�
��A�o䇬�JS��KS�i�
6|��?�1��9{����K��6n
�NL��a��>{���tO����J��Vz�Y���~�(tډ�UP�Z�ԣC+QL#�[㠉bAr��)Mz�^�J��ۦ�3t�`h�7v[�kZI=v���>��{��
:
�����m�g[Z���N�^
���CKJڽ+�
�
h7�<�K�9�y��wf��
*-�W\�����[w�Th�\+�4\Ʌ�
w4�p��;v�(h��p�O
��Ξ�J;� Y9z,���Y��ܽ���c�0�-�<}�§�8���h�'e|`({���������Ct(����I�2C�mI��� _�Jx��g�
3��dɬ�@���[����c+���Vj�7{����������
+z�h�	h%�aB�%�t[I헷�J���H���R���

���
+c��s�
��
F���'��?�zJh7ȀO�D��6H��
���E�&�"펟:��kR{�ZI�p�k���{���@�p
%
wܘQ܍
G"o�mM���d��g�������:�pA�G�%�e���	#��v垾���k�v�2_e3 e&
�ެ��G݇��aA����
V������-<6�
��Y��Y�I�(Y�Y�@s�����x�<��+0H��R����Xn���ŹSǏ
9P�7+-)."xӆ?�kqXho����;f����8�'�G�������7llj��w�����㏏89=;����i�,�ݗ�҈v�
�
��67\�TW[]!4�(j�n��K7�	f	I��6K(����N�53g�\�t���u��F% l��,)���%X~�z���v8.�
��6Z�_R+���E�v{LXP�/�	PfE��gx[��pK���f�l�^�$9��ǣ�"p���,Y�cZ\R;n�-��(�*V�?V➬���ɬԻ�J
��ݷ�j�~$�n\UEYIqa��t|-[��y��\��w��V8Sz.�8٧C��,Ji7�0� ��v�qkhtBJF=������h�
5��j�+�ݹ��p��.g7>}*
����;��\�ԓ��C�'�J;�*-�f�*H�Aa1�;3��
*-G��_m$X��"��VQ��	�;.��R�dž�y�9Sx����'>�R����z�V�=	��J at u�L��{���8�iyd%v�A���
��Z�J�d%�Ld�fL����+1̰��Y�E�n+)~y����[���ۗ���
�5����yْv,İyw8�J�~|0$ڙ��2�yx���l߹kO�G�K�+O�� ��
���#�˂g
ׅo�Ļqc��)i�ZkI�&��|����+�)���:�p� +�R��=~�
��Z�Xꉕ�N
V*9P�
k�
��G��U�I���Q#8��z
�Y�Gpl�\Nc�_�T��ON�R
+T�������Ŭ��x&���޸��R2X	^�Z�n
X���V�rV�2�
\�O/�;SI�޻+5)6bۦ��\d��@'�o},K*�ê�h7���l�4K+\�������䴬��ٙO.^ڵ�>bMi���Sj�`%IíQ6\8J��;�&��+1�~�%
+��]Vi�-���B�]�v������
�JL�'�j`Op[�7o�mף=I���i1�hM��
���J��o�왰%��
�<��%u6���;�Y�C+�I�|���J��
��p8i	�녘F�����X�4Z�����Ë�NO�+fV-G!�R�n+u��[b%���~Ww
�#���bB6��x�_pZkIN��"�
4j8i7����yv@;g���6n	�J�7�Wx�㲊��:���^����#�
�W�@��n~N&
IP �p<��B�eWY.O(KB�di:RI�^iݽ���bwf��+:�%�+
-ׅ��=�m�G�J�c�'B���(.S�X(0�[��o�J,��I�Q�@+ur���NjH��I��W�>
�T��b%~���Ӓ�"`�2+	���������𱛍�K3�9
1����HI������L	8#]��OYR�]_\{�@;c�Ip���kC����


+�پ3sO>� K�
+���$�����\�p�7�,�ᮡ���p�>L����>K�X�ƒPiG"iL��Y�ETj6G�%�f���G��
�<s�g%$x�m違�(��o�
k����n�*md��
��?�
O�S'C�%��D��>+��ĒZ_5���/rtr�Ĝ�����Ϭ��n"���S]�J�y+�kcu��Rn%|��It[I��[`%��-
1�Wp�+�Kiީ��<p6R�
�G �ܔ�v=ڽ',l<�����6��p���ȸ�������D��m������iA��)���pY��E�l��+Y�x�-dO�D�p�
(��ږ%��zʪ�!U��?�J;�*�J��!Q�;ҳ�
+�K��������Ϛ��r�|,I�TZIz�Z�Y�����Pi!���ؑ���g�
���YӅ%)X&9�N���V�% n�&��L��`��J׵���E'bNC��E\�
Vj�y���ҧ��R%�%Vb�
+�T����1*����|[k�B���P���V�ZVc�x9M�p�N
;r� 7;=9>�
8|1��ӗ���]/�8��b��Ys>�[�d���`hT<a�]YEUMݥ˰2�5��"��[��d
73�$(���}�r��s��`Å�K�;�;�8K�kR�Jc"%TZ{�҆� *sj�k�.]ih�J{�^;�c�~X���(<���ߡ�|�RBt(����#ZI�2C�z�9+qI�K 4kj� �ݼ|��Ę�x�äp�K�ڜU�NV��
,�(�LVjRl8X�
�������k�Yip�����Tc7ͻ�3\\FJb��؋�
A�aY�_e�s�
'ڙ�~mc��a�j�����1
*-�'\��EN���_�QU^Y^�I�1�$q
"K4
�
M+��]`��(
�IQ�H�&E��" �h
+��K�� `�R5�L����������{/�\r��?g��>��j���
��enᒔ�bʣ��� <��ɘ�Gj���È�>�R�N��ԓM%��C��ä55�&m�����a�V��]�����$Zp�_Vj�Nb�=z�&-����Gȕ
+6d��h�Y6�3�2��V��֝�z_-�!��-,�A�\=A "��d�"�`�r�F�c
[�h��7���{M��Dȸ,�����������@��k��b.�*O
C�C���Μ ��@�(]_%����$��t*�⽌���	�9w���O |��)�YyAC��9�	3���
h's	n�"�0%�򢭛�3Rb"�!&. �6V��
�`�mc�iy �}��8i��I��&m���J��+
j����Ԧgz.;SS,K�E�x��e���"��2ZI���c+A&�llq���� d��S���V���o���H^��|����2I+��{�K�D�Ɨ��ܧ��^�V��{���e:��)̓ Ζ ��~2Z��DZD׎ƒ���r
+.�J��#>
5�
?`;WO<Xlb�ZJ���� �P
���&i��p
�YM�A�pA�!�A~^n��p�NFa<T�#]
m��0����J+=�
�	�LZoɤ�w�����U���������Jt��+�?#^�qx$OWH��)�p���
�A�Z����-�
<6��8u;x� E�ZF6�<u���K� ����?e���!�^U��r��3h+Ġ�v�ҫ�Jb��p���%�͟=�n�P=]
�͈���0��ю�J�L��^s��V�F�����
��bl��=1�0��]�[��������å$&�Y����a�|<0'H��0��0(D��XzK�cIr&ey��
0p�?
?&S	�
'�"_��	��-�I[USw��,&�5��p��W��Pv`o���<<RTh�����
�
�Z� ́螤����������#
+0�����f���8�� �c�������K�Է[�J�UT��P}4Ou�Vz������ZI������<u�pi�p���3�--��ͥc�7E��p-5G;
����v��ll�-tY�$^��۳���
�����&|�o%�½RObRA��)������OOW�y�ӦL2���06����EcI.!����4t���F�LP¤u��[�"vU��N�oNä��r���O���
p�P}��$9RvF
+$K�M�Iơ9�
"'�C
[Iݓ�[�����`°Q����<|�#b���ld�v���
��J��������UP_l��
�@���Dm.� �
_�_g�93P|��zg+I�ґZI
+��~����
_
�
9�0<��p,��*�ڱ��ZRI�
�����/P

ݼ��BV�\����0���o����v�����Vz�f�^���;�o�6����Iq��
+ow'{
��ɘ�G�X҃�c��d,�q-u�DΤr*A�3��8�<@�â�%��lu-L�����p+щ \	Z	���w�
i翿��J�	�sw�?{���f������
��J,����
S��oh<�0�y��%�� Vgҷ&���UPo���?W�h%0_�Zs2� 1���
N��!�
T�O�Gg+5����J�/_
wB �� 8Ks�X�W׸wK���ve�����@~*YX1�.
��ON���r���ťH���:J;8X{��p5�p�����1���ua^vzJBtx0�e�<[+qH�l,i�%Dgb��M"�TN��f�
\=!V��l�
P���y��8����O�
+Ѣ�WC`|a�1g-cg{
+�� 3C���}{�X�f+q/ޕGcz_p ݏ􇢪���,t���\��z
���CG`��� �v��Q5�_���Q�?DLxp��_ϟ��Fc��Vz�Z�W�b�n����%�2R@邗,&��6eK��X"�
}vMy��H|)	�S=�&O�����s�&����ik�&PD��
����vm�;1����r�夢�dox8
�����I�b"��aF����F���.!/%��JS��Ҍ9�N�Ehd\��̜�����r��gϋH��?'�Ϥ0�h��p�ML��-2)� X
���3�2�'�G.Dd���e�Ƣc:������<
EPhT\�\b e�	`�5�R5^ ^��~$�����%�1��
�U ̄q���@��r��Fg+��K�i%%�=d"s��
~39�Ȑ K���ec�Oo�X�p-�i���v0�t�T��h*(¢��\
+6o۵� �]��
U�N#���>!'��pIЋwAPr��$�G�-�t��XY41�4�]�;u��,t*��T����$8<&!%
��h��l�I�Lݯg�����wE0� ���[�����t����Ł؞��ݸ��9�l��ĭ�֏,�!F�?�T ��
ݼ�a����`j{K�0յ��7nq�T	u��ȡ�ݹ}�o�r�J��3R�[
�V���4����
�q�ԥ�����$K�]G�U���


�Kƒ�x,��
�ݝx���n�$��Ѯ���E�i}0 at 2���T�-��IH�@�� �
9~
+�_J�;����v�}5z4<�pI��k��!(�mݔ���b�R?/W;�Xb*��%��@�I�h�����l*��F�\S	0S���;��
�9R>iѤU�H-h&��#�:\�X{��'*����ua^Vzr|Th������,���F@��T�[I�XjQ+�`�\��M%� l8����;��.
�P�����R� �ĭ�z*�[�~��PuH���%�v·���	S�{�9r� �L[�ߌo2�t����t�VR��"����]����8�l,iki޻��Ѯ	~��T�풩4
+����LB� Ehd\��N�Š�Ϝg��{�����J҅K\��B�w�s��
(�Qa� :��ec����A�
�-]�	y�E��C&l*��TZ�
S	�=+��-�w#f*Aߛ��/��/��gRA�[��x����E���F�
�
.4�Ѭ?�Y���[���8
 ������
�a�� ��,p��׎�ML[��q�6��`j���` $
S�J�����;��w���
+U�v��V2
�6��Vz�Z��x3��E�
.�Li,�w�A5ޭ�ZR*%N�ɥ�a��
Q�J�`��v��KI �k/]�~�V���Ӯ�[�ʅK�B�^S�ݩ�GJ��F��HM��X�t�'��Y�X�7h �%��hm��J	 ���=��<�gc�5��u�
�..+�R��US�E�j*�2IJ�R$QD��:�D�B3��D��6��a�a�����|/������J2���W��s���y�����t�2��Ji0��6o�}�\���
��9�V�J�]r^%���Y��P����"9
ܳ���%_$ϊ��i�
i6a]��G��Y�f��vB�I"��m���3�D
�-;�)��L���s][�7�fķ�H۹���n�l،���"!^�<\F�V�wʟ�c[+i��{�JM4�w���#�q,�]ci>?�����ḻ+�nx:�\KJiבO��uG�0��T��RL%H;�JJ˫N����3 b!ȥ�v��J�����>.\�3 �y%��fg,R
K��B�[�%� ��,Z0<��2�L�d�Jy�7m�	�^QS��w�Uw�IcF�I� [...]
YE{��$/%
`�x0"�`���)iK���9��~����w����ޓ�)����l+�z�
�1��>h�Í��u�4[��"h�8����e�فf�z=>�օ�3!Ϛ�J�V"�$؈�n4�c�.X��rMA�]�x ��v)G �Z��J��?1�~�wߗ[�
 �sf��쌭d��J��Vj�}�Z�
�%.�N
��V\�c)��%���g8
��n�vZ��J�Cp�Sw@�>0�������R3�Hڕ�Xb���N;��-���
�g��QDZTU^ʍ��X���ı,�,ab�0�UI4�6x;2���.Z��)<8Px
+é4�N��[`*
��Ʃ�m��#��]ERH�F�g�Hض� oe�I	�QaA>(�`��듏�<��-��vB�q�ޝlS���
L0�I q��.Y���\q�h9�6��m!ž�]�zB~��H�Y1������b�^�'�Po�
����_y/Z������&��X�'�.?zp��\f,���sw����i�}�:�$)%�hU��	<\��Cl�庸�T
+V�J{�U��]�q�����~B��ח*i�Y�椚���D���g��
W���lmMexe�&v,�Xr�p�E�#��E{w��
p�v&���x���E�<u�����_�� ��Oڧ*�Vӭ�)�F��Y�x��X~�w�6����������Y�d��Yӣ�A�q���H
����|���C�Lhf+��D8�Ot
K{��.�0M1�f�KM�so(����H�����{
��V�J*W[��˥
�>Yy��ޝ[6��J�P��<\5��Z�w�JڊH'	
��F1��X�<vXKi)0�����yy0�mjDj�3X�/���N8���wPA�Ʀ�m�	�<}�C�~
7k.3� 혩��i����.�Nڿ�y
���w�:1����y8�V�c)����
(���
+D�˱͐͠�ESSJrxJ�a�T:}�ۺ��Z������fҦ��J�DW�W5Gq���n�8
�4��
X�����
��g�VR�%�[��SC.�z`�
h������
+�N����"w��-_�;|
�¥z.��)�{�n*)��C�J�B��
�K� �<;�v�
�\�wik����tJ<���Z8:p�t���X�*'�ٸ>OKaA��a,�F�P���g��Z��ԗ��� ��@K��F�r��0)xJI����T�Ʃt�������M6
�,!.\0;z��xME�!a,��X����ci�Pk��	��2�Z�����C7t�qo
�XxH�a��I�
����S	L�
e�ꤣF�+Im3iI}
�J(;
+��Y��ę�"B��=ȘEj��#d������W�T2$� 0"�6b��8��	p�̕y`�]\�Ձ+�k�����ިv��@7�$ݼ�hm��%
�a1N	��4z
Z��1
�T��J�����+��J�d�F�f�
	8�n�=8� ��c))aztx�do���6V����5���W|>�!�Z2�zշ�JD�"	n>x����ȱ���C#�����Lڽ����	�
]tz o���I�W(��ci;��\~,A����p��E��ux'��

�Ekd��nim���C,�J9y��yJ
L���e������{I�H�F�^����>��$�Μ:q��~���E
�b���H �<��ǔ@NYCv,)ʢG+�S�C
+$���Y��
��b�}

7+�$za1آ���4�&�҃G?���s+�����j��vo�\�&g��s�S���i5
��ޠ�B������l%u٦���[H�&i%	�=z@
B�0���XZ�l��ݑa�	w��-�L�z���j�	��䭢���h�A)u!�dlJ
�i��拊�O���:��$SI�vzĝ.�����2(f�|,�O���
+�l�������v6(Z_Sc5���fr����ݤO?3
����A�1x��n*aƠ�������ծ�<�e�ŤA$&�_H⬑������
��8��I��uv��-ۗOd!��
K��O%���
ȯ~�8
����79$l^jz֪����d�޼-$�Sa�
+ǖ_�<��pi�#Ԓ#l+.X�2s1VsdX
F�Q��ቚIZI<A[+ɿ�z���h�1����_P8��Tc)�p�T��
l�����1A����j�Z�XJ*>t��Q.��}'�E�̘��pqfv�
%�TB�Ѵ{ħ�/�SS�M�蠽�D��'q
+��Xځc);s����3b" �}�K
w���e(K�Ek1�Ԕ:I���
�
�Ǹyz�MrgၝJ1h)��',<0:iu��FRh&��5�����Lس��(UVz�93b��L�C�s���B��
�,�F߱��7|+s�< ���=,rZ|bJZƊ�u0M�
>Vy�s.�_Y�sE5�VR9S����j�VB�-�h�T��1%1~Zdh ���H��%�
+pSw�Jjk����da�XI��I��_�t,��r��noO�1Ύ`�A����zA-uk�Zb�N��:	�$ �"��`����	I)iK�V�-����R
�J�8�8�Ԥ��
V��+�.�@��t�R!��R`�����!���=��8;�ۂh��&
+��W���B�h)�|$������
D$������g�̃�8�8>ژĚi��
c+"(
*�� �����}	��r��!�
"EED���bc�g�:u�1ub�LǶ�6�ϻ�����}��C"�?�����<�|>�/0R
�����;S�UIn9��^�UL#X�+
g��]�Bgu	�^_�~���%���!5�:B�e������
[0ш�4�>X%�'��|2>��:��&�_�<���0R3�
+˪���X�1g�'��$��[	Å�L���o�
+#0�"d�C]mM
���h	�a��̐vQ_dG�>Ϗ�L
���Wޑ�^GI���� >Hv�dYz�ϕ%�vZ�k*J
+r3Rq��dr�����
$;Mu��i��ii,�$d
;RJ�!�gϙ�E�e+
�ݽ��#b�o��TTV�����+�JO��$�?��F"$e�Q�~	�,�BP��e��-K�%�'Ą�y�9; ��,!\��������Ci�E�a��
V��Fŋ�����
+��|RJ���I/i�XL#Ԓ 8<�'��7_Cn��y��\WUV���
+�!��s��
$=8)(
+sԠ�~�m�d�,M
��H)qU食M��
<74���wv�����_
o�������7n�U�̚:
+�+��i�/����F#�e���E���V���n��w�D��~�OQ Ǘ%H4g���
+T]^����rwh������������tu��i��#�Nj��pcV���Rz���������hjA_
���
�o`Xt|RjFn�ݮ�Ξ�㒪$K�WJ��\I�ըؿ���@

s�ҲY���y.K�I�Qa�>�!KX[�Ҙ,!Xڔ��mť��C�Fkhj�������?$"6�
��� �JÂ��D���0���D]�܎������ �������Ϸ�o�ڀ���������Eh9��Ng�,[�&ɖ%�H����
H�Z
�̗�=|��&$��l.���ֺR��s�h���� C��nhVB����Ȼ�/��^�%�d�0
��& d���d^y'V�����G��$��YI8�,�e��:8 ���2Q���rwq�]naj��4���Yt-�m]"Y�a7�*%uM��z�\��	��KLN��/�����q���$��K�*�iG��k+��.�5>K
1�{��g|Y�w��5�,��
�ػggmUYѦ�����o�4KS#��~9m��1�Ʈ�J�4I %Q�501G����7(<z�:
J*j��a�U��a�C��V"y���Ǐ�]�<x�Ա>�zpT ���d�A��]
m��c&CS��'Pd�����pe)��^P�z}��s
=}
k;�k~��)���U����
9q���-菟� {Af 9)V�)��
�F�Cr:رww}���| [...]
+�ґ�����������LH��=?�4
C��-����қڙLx �D6Z���fV6vN�V��F"�!<�W�Q��*ѭDݑTI�%
��h���H��g�̂��� ������njm\d��窕v�pQz
��n0��e��%UI��C�3����^�h	������; 4jͺ
Y��˷}���
��ɳw�����4�ʻ�=��b>
���
���Ԥ����x�hɢ��,ӑ���[���Jʝ�R�P�'�%��������
��P���|��pB�>�W9��X���-�l���o��0���K'a։�4���,u
H��
<,:>)5=g��u
M��
��Hx�������X�T'�ffxm-q��%D/]<{�����M
u��[6礧���
+
�������,���7�W���kIR�~��(���A�5�F�������~c����;[ڻIƒ��$k%���B�G�&���.�ϳ���b�
�G��Q�
M����� �����
jY�hI9���	�r�*14�х$`�
p

����QQ�c7��4�L
+�37�<�Ff%Q]����@?�@uyQ
x96�i�+�,О;G
�E�ʊ�8n%�+o�J4�Q�$6����V��ҿ%e��&w�q���0/s���؈`o';kK3���%m�p-��F'�
�:VJ�fDR��1W�S��������J����q��i��EeU�p{�݇��8
�-�	��fOډ���I	��nFa%zY����������ޱ���hS�����Ȑ oW���Z���,�Fw�*<(����Bx��

+�^�.5#�`�V�M�Px��N������rUI,%^IC�G�%-ɯ�lΊYڃ�w1�qSؽ��朴�D�� e'��P��uu�,�a��e�=�,)�cB)��/���J at sCH�@/��H�yFnai�Wgϑ�p�M�ܻ���o%�^f'�"�у?ޅ/�
��z�ۚ�ʠ-�$Ɔ�x���M
qY$��Hy�J2��u+�:���I���_�?
AY����W��t�
���m�ܝ���&:<��������h�g�
��a�!-�B�%j]�Qb9�d
Z
/�錔� )A76���sr�"��̼’���]�m���!�]�v

�EBYډ�.q�L��e��֒hk��t�
+���v�k�4^QR��q<&<���
-���h)^�:�%w+��ix at RR4�%L������6%=;��
�goGw�8<�������A��$Nb4����D񒒽���i
+O
?zȖ��#�5���'Hs���45���=OC}�L�,	�4Q�%#�����3w\�4� 
+ at UZ��O`��Y���!4����r��0ϟ��x���Y���Jd[T �♓Gu�kj��,-�ION�	
�q���b=��|WDi	����0n%�+o�JR摸�<��{Ih����͗�Ǐ
��}
r
� ���j�ʊ��R��E��z�9;�XfabZ��GjI�8��F'&�}�Ih'� �8ה@J�
@JFf�ֶ�.�^~���R3r6o�Z]װ���@o��3/_E[�T%	����37Y�*�,3�\K2Y�%E�^
�p������=;�ˋ�s�S��‚�K��#�$SqG�%ě��ܔ�F;_�h�\�цD�&&!
K+��76�u��
;un��A��'�F��pf����յ��Q��$,ѨX���*���b��HQDA�"�""�)"U��������"�&�%ƞ��flQ!7w�Z��}�LJ��9� ��:�}���R�$�v�����6��\���� ��tu޲R�b�\S#�4iY�ĖX~&�8�cL��̒0P�T�Q�&���-Z������{?�Z| [...]
Wk/�� ��LK��
+
�������`��ڸѪX���⪍L�Ș���S'
��(�����q���{|G�&�����<Ԁ<܆�y����&��$�]�&�Dz��Lla��$���8�T�P��gN�g��A�AW����r��E泍�,�
N�i
$�I�)`��j�I�ԁ/��v�R_�JC�*a���_�|
��m;w�= ����q�x�i,��7�b�n��9��Z�a�Y��42e�DANzr|dH��t+&�
�'�9ToЀ~�l��Q����4�$Lp�VB�VpI�,���]��P	ޝޝ
��c�vG{[���-Λm2c��D&��z3X�#�Qo��ӖL�1I��
+�2�F�?i�������%+֮�s@�{ 0$2��c ��.����Ĵ�_��|��k�J�,%

��G�
�Z(K�K�ׁ����d���C��ݽ��f�m
+
m(�
KJW62M��iPry��6ڡ�F��f#$h�PxtB�Ѭ�’��(�
���C
yP���(�L��?
���	j�%~B�ް���
+�������v��Mʂ�3QY�E,u���
K�U�_~dP�:@
�W�&�CvA?]�������D )-+����U|��Y
`
�� �
P_�@%�����2���r\D��>O���@y�,*�uő�F���J�P��Vrx0i�>y��G
���=�w�f��E���x��ܶe���e�̛m<c�p�>�*D
n��K��0�E�3	��]�n��`������
��+�M�Ψ��1����E'�P�5܂�#F��vɮ�d��G�e�K��+��%t��k��Ζ�,��>��
��ۃ�j�І�X���L��j���I��C7��
+��a����>�C�QqIG2�
?��p��J%�8&�@z%
�L�Kt]jynʩ���'LW�v���s�EyYiI����\
�m֭�\f�҈!�M}H�uѡ��:.������:c����Q>��J&P�����sغ�c�o`hT|Jz�z �ם{�b<�㫙yo���o�������K�����A �[
�*.Y8w�Ѵ��IS�H'D��S�}��'*��Y �o���$ʾ���
>>x�S�=��y��sgN
�<����m�����!���26��e�~�I_t�̛�KR.�Sʵ!�����I��+ at i:@i�B��-m�l��
+
F<���t��K��^o��������UI�I2m�t�w�55yYz
e	m�:�ޙS'��f�%�G���ȇ6a,����%Q]��n`�U�>��%���f�F댍�`Hd��Ԍ�����ʪ�+�7P
���ʪ�N�+J,�X"�B
�LL,�$X҂J�7��Akx��t����N�(�IOI�
<��a��5��eiЀ~�,�-t�\��R��ޟ��N
.x��X�F�g�9
��Zk�.WO���#��ǡ�^����	�At�^��f꽕�O]��<�D��\��r��P��;�6�-�5�1m��ñ(��=Q���mT�+��J�~e�@�&^씳O��Ҳ���E�9驉�!��tuqrذ~�ʥ_ϗ`i `�1�.�z��ă��djO
�$��<����	"HŽ��
�� �e�,m6n޶��ˇW�T�*X����ͪ��ƶ)eM$A$]��`I�,=��6~�F�������ₜ��ñ�!�⡙͚i8m򄱣h,uW�Y�wq	zT(%J� �A
��O�j`d*4��<�ц�$�
��+,)y��ڀ��C��@%��p&1DzIL|_"��K*�e��/
 
u5Ug�J
+s!�c#��}�\�IYZ–���
z�x}u{b6w���c�C��DOM
�������U	
���	SDU���L .޼��
�)<9z��G��_���w*� e��+�O��S��}��]��m֮�X`f�Eq�0B�^<�����ڨ�PI�&v�8 �!G@�[v�ԳO�����O�Ļ����N��e
MI�	�ݳ{���&;.�X,�
6���qD�e\� � �S�B��$ֿ1�����۷��Ab(-X�l�:�
����y�;�)x�I����k�z ��p���J(�M�7�y��
��hK%yY�����?��c�56\��D\"/;=%1&B�՚K`h�3
���D*.=3
��K���!�¨h&},�2'J��h�I���F��4���4�v������A
�<<�����?�k�@I`!�
8ϙ��$d⸤Kj��G�/�z�SDH�--��>�
z���V;�,M
;j���
��

V����P?
���!1��"����r����A
��٠�BUھ
��PXtbj����W���ݹG6��8�-P��&֙��7�L���q�5�}�
cC����Ě�#���J���D3I ��kM4�����d����nߨ���
:u�xnfZr|tX��~o���
7�b�-běŒ
b�1o�K�9�f�$�h���Om�H��L�u��g�>|�qP��PZk�����u�^߃�1�����]�|�:I�{���7�eU�Cc��Ut�*�*�[�7�/�*Kl�=�.�\�:��w�����
�
͞�9`ɀ��_̿/��+��Kh��"&a.vb�/��(I-dqiye&�-�v��hqע*�ר����$�g�!hq��N,���n
�i?���R}��s,#51&<�o�'[��.2�h�6y����`8�@Y X��c������C	��O����?q�t#S�*9AU�
����Wx������
�)^B�7�@I�JϘo����)���'�G�xR�n�?a���/����=��sf縬�$��M	%�K)��'��HBQ*�jJ��"$�h0&�ed�)��~�
��$���&��:����g�g��Vk����]k�Y������|?���J��@%���T�𨤀-<�G?�]��L
+.5K�,�ݍ�TQ^���
����e���<�?5iGlTxh��5�˗(�dmiާ7Y�Xq
Y�)�ă�)=��
IJ&��Ӈ���è���);�aN���g�]����?08lkt����	�WHڮ��vj�ċ�\d�GEeU�o���R��h�-�A�����
�F���_L,9
X��03��ۙS\�K��D�Ĩt�9��hsF�'-�5ڼ��Ew�!q�W	Y��۷�ZTIN%J�(&!��D����<�	�D�$�z,�R�pS$���
Pj��dHMJ�YZ��4�k�������mm�,��{���S�eX�s�#��^6
+�&hŠGB��
޼��u;T%�I�Uڄ���/=3�ԙ�9y7��4�K�^�.C�*���8ٗ��f����$�\8����
���pΌ�
���F7�7z3�>*i�R=���I���˩�lb`�
�>-XR/Klw�7t� /��wߞ<~$=-%1!&2<d��դ�x,��37%XŠ����&�L:�N��ˑD��M�z8�J�J�)M�PZ�@PXD��
�S�gH��.�A�����R%Q�E�NZ
l1����h��gc�$�ү–��5.l�2���w�n�]&�eJ��[�����X.ǒ��T�Zk�L�f<HAu�Gƃ��@i���D�Ңe+W��@�6y����hs�Q�-}D�C�b<p�Q=�~S�
��$�K�db\���X�A����›�� ���{
f_ at Y�
%�Ҍ�ܜGskާ���
K���*�����������8���
���a�MEUZIU)>1eƱ�a	\�Zx�
9
�
��X*	H���^ND�����H�ĸ��MkV.[0{�$�����%Z�����^F��6S�C��(�F
AR
>o�!����S;ɕ�ڠqw���v���KΞ>�#����mK��pKNpI��������uI�KR�5��$"�H���o�u8��{�1���7�n��p�֬
+
��MHJI;�)N�0��S\��1@��^�TI
���|��֊�A�b��$�ڣ�b

�xn�<�M֭Z�a�ؒ���(n��ݸ�ڵ��JYS����6�x�g��
�d7�@i� %������F{�mIyE���d��f!�A;��A��қ7�$@��ŋ��y��D��Eu��X��a��h �T�/܇p�d����$K��ދ�zM�tw
�4t�
L<X
F�0�:Q,��t�����%@���%(�����N
u� �a#���>fͧ����Ty��K������iwIe��?
��I����+�B�O<q,#m���[@}���<ǻ �mm�����ѭKg��?m׶��ћ��'RI�5I;� 	y�?�h"XW�����*�|w�
��L��pD��|�����&��j�f���
�m���K�7���.q\���Ȥ���?j�!�5�Pu�u
��p��(YZ�HeP��`�r�����Ș��=i�G�	s�_�{-�\�vZTI%&J�|��P�����D,��5x6��J���Bh��жn��v��e���bXB�,��Q���K�-!E��aI)�P��C/6
D(�x��������E0

�x Fˍ՘tCI%dX�ٳgO������P��bImjj���ڳ*�
N�u���gNee��K�)�҂�3�L
�kokceaj�Ө�KL�Z�
+�(JJ�1(⫷��7?�	�s��\�*}}�,Q�[��e��_�W�N(/i�i'������A _d�
�-,h�ߊ��fN�8�y���@%3c�n]��Z�r��L�?�J��D�D�T->�L� %.5KrY"�#rCe�0���(�r��s٧��f
ػ{g\��p"��,�
�G���!�%�K
+0њkTϵh!�984ʤ���P�:��#�����f� ,;g	J� ��-�1���;���q�W	{Pc۩RI����2�e�
��/�dO%M���n���U)�TZp�Z?��
K*���%edZBS��$N��t�Fƃ�8
0�)����FD��HJ�/mN^����� q�
㡖�%#�g�&(�	LB$=}ZUU���d"\B_"�$ǒ�����T�A�-�l.�,
�d��{Ѽ��'y�9�
�k��
V�R{����Nh�=���%Њ%	JF ����m퇌�2���KV���NT	��d�9P�k7q	��
O�\�n*5p}^# ��5�����de
ܻ;!fk(-t/,t�!��Y��66�j�� nצ5)t��i��C%uPbL��
B&��ZuX�M�xY��n�v�xD7������<�yh��
�i�Q,yM�4a��1#�l7��ڒV
ꒁ��qbɉ-GkNvZZ��-EI�D��)e�^��bיY��0t�(gWw��\���u �m_��J�{ ���+We
~���H�4�P���d���#Xl5���� [�X��n^I�݇�
+�.��%Aha��
�\��⊙�.��(�ڨFִ���
+LBQ2��+?

�М�)� �
+
��MHLaF����m�0
%����dP�E(���B&�H����񁿈��(L/Q� ������
+U�$8�j��'���ށZ˽�diW\tD��u�|�.�����q� 
�/8�1���
[
+�K����R
������F�������f��#�7�I�g�[��& x�6I�.��bs�R=����5A�ib�����a,ݻUH-�������!����
�|1��u4W�B�S*}�L��J�*�P"C�2	n
+��ȃ�L���Ӵ�
۠�ݯ��./�#�{��Z~n΅���R����4y�xW�]�D���Vp���՜�&
����'B�1$��cL��ME	�di�o���#B�͝,p
+�
��� ���Y���]��W�:�i>�TI�8���F�d�"����VbI7�TeI*>�R6r�i-=
B���
����B�ׂS\}!2�qi�F���ǃBhEQ(���������Ș�D0Z���h˨��x��{���P=#	J5J"�� �***
�M &�`�pI’<6
T"�������U���p�ݢ�t��R�M��_._2֌)ǹ�

o�5���
K�K�i�9 �|�r(
r�4���s�ל�K}V�h�?�e�c����̋�1�d#Q�cWa2-D��QHc�0
#&;�%K�Ȓ%[d
c�$RR
+�i,�Ƙ�����u��}���n1�9�E׋���������CU)��R�ehr�JT��3�vZ�*I�9�Z�X"}�u��Ջ駎
޿{���+��0��������.�v��0�ֹ�F��R�㢒�{X{8��A��#@z��	����'��&WU,�Z���D���,
��K0�R&�ށ
�����>��N�쇐��uI�%,9Lr��qUu^�x�1M�������7��]a�[X��hc���eG�4��fæ�I{�:�v�܅�J8�=~�&���*����~���|2�f��L
�$,�Ym�UG�w�-��-�e넶�'��\�%ow��CKP��Bf��
Xd
Ց�"�������b�
&��@s�4�F����b�����@czURA�
%¤B�����������TS*	�\JL��̛׸,mݸd���f�L�
	��t��0h@�>�fݻHXj��ϛ�\�������/
8����i���6v�`����0y��؅?��z�B���>,,f�!�FuTb�8~+ǒ$�>O�����E��b�"‚|=�����knڭS{��F�M�4����
��'�T�x�T!�B���
aҳg%%%O��%�p�!�$]�1�*T��y.�B���d�����gO
?�"4
�RX�H_O7'GVq�L�.�=a�5�K���D&Ztu�S�}�a�S�H�Θ&�L���C���z���m���`��Ý�i�!�bE(��8�~����T�*U%�I�S�-e���,�
���U�[�X��
� �=)&��C۷k���uڢ�
K��%;���
+�5jAJ#k�Y
�S��U}��B+����.�M{J�s
+��4��e��%q<��Q%5��N���I�Hyy�����@��Xz���T�eI
+���<A�%�޾��5�̜S&F�
5�����a���~"�Z�RhL�8��Ta�DPOf��Mq�P�����������!ᑓbf~�`������~��
]�g^�I%

SI,!�ɼ
�J^��q&-5eoRb���Dž��;

b����i׎�۶22lF�ԀP	�\�T�ǩ$l<�
%"J�yIO�>��ĸ����~5��;���i)��ˁ+�q����gN
N��ذ� _/7g^q�fL���c\R��
�9ʦJ��[]���ȥ	L����
�0������-�� �䃩�O�͸�;�_�9��v�@I\
e�bK�C4I\����\'��A%��q��ӡ["��,r
���e,�{{���+eֶM+(ACY���i>eT
+�mnȃ�^��"Ai�%�������R�J:PbLz D����s
�q�~.�I�%K��Дߏ*�$:�Y
L�R���
+#o������EO��;;����X2i�ʈ$B����g�L�
��r4l�?��AS��P �:���f[DԔ��K��lؼ}�G�Z�H��R�R5TRИ�ڿ� �>q���
[6�^�d���'��>ؿO�
]�j׶U��͚6n�ߠ�^]��B���?E%��T	�	�\9)@��Ǐ�郟��0a�I��JzV�\r�pD��
+�ss�)�ΝI;v��KS'�6*����e`	*�_��T�h�q.��MZkND}��E�
m982�sXt���ԐImLp3Q�>�������?0d
/;�R���� ��S(��3�������E�-�R&��\x�"
\�<����
+��Y,im	
-��v���w��?�])c)<4����Չ`	�W�/۶F._��I_������ID��$0��jG�b�a0:9��h���3�h�hm�P�C��c�} �ݻ��ݽ{��\�Œ�,U��[V�<�,�߽cK��q�̝3i|xh�����0��
+QX	K-
Q�$.��N'
==�(hDFz��J�C

�ݽG���0y�,Xm�W�߸5i�8��
jUz���J�����cR�Y��_�,>�
q��e��Ϟ
=~�(/���6B�7�>*}*S�_�T�0T�����uN����'=!D***z�~(F0Q.Q]�j�k�,������ϰ�
��˾}��/�/�;�vN�R����q�G�yӊ�h�u	;�p�e��|}0a͑�#�Ś��W�	��gwƚNf�o&Jd����y��

+
1Q����J)G��<{��_a����Ӟ��S~X*�eِ�+C�E =�O�^�Ti�2����;Ehp;�k�vHK���#}<ݜ

lm�����dԒ;�:�z�U�UCڈRRFƭڴeA�����g5�-���ENh����8��q	��6�W�+/WmU�T�@�(� I�w�de݆���u�`�]* ]"G%c��o�n:B=c�I�T at e	�����)�vn۴au��E��̘���
+�/dҽ+lkc#I`�44�3��(��
+w��M��=��P����13�.X
�bm��0T�q�JE�*���T�JJ��X
3��MZ燒wm۸neܢy��M�
����h7h at _
�n�:h�y-�>��?
����%d!Raaa<�����rI�%�*j�%qw�¸�w�6\�K��'X��0nL,o�8��֨K�h�!�ZK%G[��
g�|_�����
ID2ɘ2	��+��yo�oH�
wq��

��8y/;�c'� ����sr�U\����F���[D�,r��nnK|.��Բ����2�O��M����)Q��a��^��ù�.I\2VDF�W$&�&��UCjIT�
�x@&����C�Ћ6��Nt<�G at N3�P:�
+F��4��Ѿ�*�y#B	.���Q�Cd 	���{���L��ܼ�K�%��+��U/KU&K7~��q�$h잤č�V-_�0v���a���2,�!X�L�Dt��	�%0�0�4T炣 �M@<�C�.�L9��ܼ�C�#��~;g����7lڶs_
+�ҕk7eU*�T���$�k�'Ņ�y9w2o\��q&-5eoR"��S�ƅ�z8����47�ک�Ik#C��M�7��ǩ�I-�>*)TI�RYY)�R1ARA�Cx��俀& ��%��+5�� ySJX��%
�
�)7

o�R|
�ҷ1�#��s�t	f^O�8�%���8�X��qU�ȿK at b=g���,���
�m/ڵj�1����1j5jq at dvD�q@�#
+�$ 
+
+N�
�ш�A#**Ȍ(�́�5[�����~߷�?��b���
��Nj�������L@L2�dfn1ޒw����EK��׬��
e.A�,A)'�TY�^�Ǣ��m��'��
��(��8b���P �������(�7��
���ZYiqAnvֵ+_�?-b)"4����mɢ�RfcYf����K�`�Ȕ��
���$ �ND&��H
�'Osr&yp�fD(���%@�
A�BI�����E�z@��Ē����Ҥm���*
���ݧSVVd��.�\�cIȭ3cI�RB6�Xb�!�ҥs�i�ɇ��DE�n����u6��x���n:ؘX�_{�f�
+�G�u�����!C?iFP���:g�¥0R7z�m�ܵ'.!��@���i��c��r���yY�O\��T"l V=�WR ?���'R���Fo�:_ u�`mia6b�`����1��?����J�6�Ԓ�*��O�$�V�m��6!�����$�ߏ�] *��/�����QS+4����x�RdXp���h�Xq�.|.M
?V�%���Z񚃛W�7
�
�#|ڳ�$��D$�0�wT
��Ÿ	�m
��@�/]�����/�n�
��u�R!�:��FK
+�T��r�<��mo��X$R
S���
�\��r�EcI��d��Z
�K�w"�|�<�z�X�x������l�"���s.1��-OL�L~z�Qqy`��-g
%���a���\
<�	J{P��y��E�
���Y�"�ò�Q1n#�
=lkmnjl����&$ݿWZz�Ni�� �����KMͭm�s����(g��X�ᐝ�y�"��#I��v�
	��YX�Xr�X2�x�p�D 
+�?x�q�@av�,zʮ
��+hol��2��� Pr��p���Z���ۣb
JNMK�v3'����R�z*�P���7�D|�H�6l����쬫��ӎ&��F��m�\���<�)vT�CM����� ��[ݨλ���RQ)Q���T�'y�R�D���L$56644h4�OCc�6�ĥgϔV�X"
+���A��

DZt*-5�

����cŲ�
��qv"����
eƸ4ؘJN�9�Z����N~���+ 	kn]3b����L��mcCi�l�O��\�n�&���^v�
	J�u�F�䢣�{Lj(	L�ِ041Y�TԺ��{^o��<�^v�Bh0�;��2�\:�$b)n/`i[��Ϧ
�V�\�י�%�	�,d\�P
���%&D�::Q���Ĥ1�P���Ǐ�t������E�}��$B�]����Ru0	�t�����Oqq�] p����^�Xµ��g�lW��ޱ����c	,�R�=���/AN
KI�ۻkGX������+�-�Ok�
"S�k�y��Ufv�v���otU��N��?�r��
J6�H����`��㟃�efe���s���
���J�̿�2� �_\
�m���?fGX���:���Ξ1��j�����X��:�>�}�~6��/Y�FT��Az��_?���LB$i4���uuu�/����\R������XQ�j��̱� 4
�
�\���cw�'�Ɗ[��Ҵ����K��0	d���lz�����{aɱ�#"aω3�d���#FQ�YZ���m�]��z���}��m߹�.��g'��ɖRB	�#v�
�+����>(q_�p �F&
0e�8���t@��P鿺�&��j�ɋ�,�ZJ ,Em����u�ݗK�v��	8q9������&$�lB [...]
ܢ1�1�!&��X��z�d!d ��7�7|���Sf̚PZ�P�
���{o|b
+l��_^�/.��
�3�T�
�G�_

n�|�0|���3'�
>�m��g�Z��
]��;�L
;z��!�~�w����y[�~�E�_�J�
��8�����kcPj� �jkkk����LЀ���c�scI��p���n�RÉXʸp�ԉc)I�م��~���R�K�gN��H
Ǹ�%�J�9�9(:�ttz)��:��jn
�75��$k;���f�r��C��ekp�����q���b�IP*��lB��~�D~�CRoX@��ai’0�,�l��l�gR�>��?�Bk����ᄸ}1Q�a�[�l��K��\r���d9
��{i�)m\L��MH��}l ��$��If��&XY�BPN�\\�/Z����i�4�^�hU����?PR���O������
�TX����{�Nn^^~q��Ae��%|Qt�(��Ñ�A>��qƖ�+�퐕y���S`
`x 
�~
K
\]p��B"8�8��5�_Yb��N�@
+La(���2a������%7�5�^��a0R�m�t��͜<x�(m�涎�RTR�Cx�c���-�Ϲ��q��I�{�#B��7�fm�`mia6b��A���c����/�D*���J�)*��ī��1	�T]]E���T�\�,}�˱�ΰ�U��p�����$
:�����V�K�N�q�6�%�o6���cd"4����E�½b�ːI$
�7\��F�23gL���<�[J(�~�!��1���
=New���z%���C���?#Jl(�����€����%�F��}*�KJ����j*�X:����É��b�#�C��6���r��kgm%pIY?�L��22))�*y�A�I1&��CP3�PZ�F.	�<'�RN~,�J\�%�E��:&}P��՝
�c���ʊ���$ RNv�m:��9wr�Kwa.U���O�yU:�M�
/Ē���%�Riq��[ׯf\8s�#IA"B�X��hg��H��N�	b�c�2�ۗG at w����v�=(��y
J>� [...]
+:��@��+@�ғ��_fAU�go{��f:�N�&&&&5�5.���h\Pq�%�(
+⊢b4�KШ(("
+��z�/�E<�
@"�T1��1ic�>������d&S/�.2r�s������ǒ�ʵ4>�;�X*��LOI�;y"������~��|H�>�9�:����!��0�pU��谸��p\Tu���
�׎�#j9�>�H]	I�$n:�Ic�M��aK]G|�΀���!�Ǣb��lB韶�
(=�%Z
�:����M����67���.�X�H��S�Bk��,遥ب�����;�nZ�/g��:�e�󸱣G
+.�GdB�$0�c�QdRffOǎ�vЎ��ݤ�
�F��$5w�B��U�x

+	�s"(�+PjeQa(=y<آ���(]��To��2���JK�
����¢"������t�Z��3#�e��'Pe��W�(�&���2L<}ZR|4R	ڷ[��
,�4vԈ�K}�K�,��E
5�ٙW'Г`Q9�iMh�7Ci�6���P쁄d]&.�t���|�
+��6q
�E�T*� �Q���V�p-԰� [�y�m�W.������<v�p��}zv�����;�V�ү_P�����*Jm�}2���

��uuu&�Q_�pAp�u	h�%鐬&�K�4���h�Q��Q������������°���6�[�R�w�dg�%*���Y� ��*�M�&T
���C�# �Ĩ�d$����s@M�0i*�o!J��|B|���B�FF�&$�ed�)Pj���)H�������~T�N���%���QX�
�Q���V���G=v�[*iR�n�{������%����<z���ݻ�mްn�JEq�M�4-�\rT"�Q��&Ƒ�n
U'���T/Nj3�1N�'N�*��2�����`��%+��3
l!Ac*"*����U���
E���yx��

+�
�R��J蒊%�0mꄱ\�'��G�r#���J�PW��.%�MM���
;|PŒ��9XwS&Np��0�Qp��⯂Lj�ɀ"�c�!1i�P��'O�$���^����k�t�����4}N���olj�?��v_�J��x�_X��2��Y���2�k�g�
yY�����Ѓ{wmٰ�w�B��Ǐ1t�C�
�����������OT�\�ү^P鹡�F���λ}����t�� ����S[
4�7P�.]�λ�
�o��l�n�p_�X2�X��HMJ����}˧�K��̛�>�u�7��%7đַ
+&����t8/:0z:I���7�?�����ԋ�D��M7z,�DU�6�{�%t
�����D
��;���k�S�dJ�y=͡Ģ$3	�{[��X��f�c�I%[�$��8y�rK�*�r�Sq�Ǐ
9|p��϶
�]���s
Jp�T� |�
�"2�Ĥ�ԤUg���fQ��� �V0�y��tW��
�
�xX���m�x��=��F9��>K����C�z\�C�LTDGRT�O��TW[}
�tL�rss������/ ���0�L,I�C��X�f/�,�[s������%�yY�)�b��i��Hh)L�.�(p�/������D�#g���8b�p���T��y
-Y�'��?(������o(�
�o�H���m�����>���*�I
��e��M����\}Zb���Á{vl�d�r�9\�����uy��^}�/��K�P�7/��P��E	U���{����iB�I�5��U⩮���KԀ�W���`��w�]��f���Ls,���2�hy���<`�ҚU+��p�a{
_E%G�[��Ts8-�-
��ʎ���#���N
G�'�7�H��Hr
�CS����>w>�o���m;w� ;v�d\b�N��_���M���ߎ4>J�-�_%i,�^��%���h�c�L.p(-K�Qnm,Kl���Q�K+X��RNfzJb��a��?�*���l���5\��
(2JL��
����,���U�
+�o��DRZ0i��4�Y�s�(���߸e�g{�񀜲9�slJM���S
�nNv�$��A� %#�R��0?/';+S��gd���Y �T
]����
�A��<]��~2Yb}�\�LKqAn&9�K��/��D\�M��;����<x'(Yȏ�A7	IBT�I�Ǝ��gO�I��A�Rxdt\"��WTr�ˆ7����u�P�B��Eg�7���k�*�p�G��ؾqݪe��g��8;}4\�y�Ν^{�e*�~��w(sM������JV?fZ�_S�Qϴ^�)}��POL�:o4���h<2�.4�.)XR/ZӼ�m�o��϶���R%c)��7U\Hp�^�%���q^�
�Dɍ�W�`r�Ʉ��C����,�+�
Fû��� �����n�`�·�7�Ҟ}��GF�`�g�(e'��%��%M�}o�[�R�˪��_y.T�[�"�'�R���-�
Ӫ�+.���u,<4�w���
���p�
�
R�DON��P��
������#��’
t
<t���˴�P��^"(��΀��A!a'N�c<�9U�C���@�'��
�� C�
+�c�RQ����Hץѣӥg賲s�
�K��Q�zC��|L�%|
�)�ȅn	]]^�T�䄘GIXZ�jŒE
H`�C�ƛ�koq>�Y��@�`�Ĥ1N J3f�{��/�]�a�vJ)�Y,��j9�����?�C��x�ߠ*o��1�-3�g��"B�ݵu�Z�%^
Ϙ2a��a����|�]m�w�2A�_�J-����/��-r�R���t��B<��� ��S]�Y
sٖ�7�㓱�Ȫz�+Û��`�>�s�;5y4�K�q���%W��D&\Z�{�B&Qth:��D��>�Ј�
	'�DB�
LHA��I3f2��|�,_��=DiD)�xlBrZFVn���
�
A	ew�Jګ��j$`+P�/A	���4_T��~h+��[���ԳBҾ׶���~V*Yc�K/�����\(nRBlt��#��g��z/�7ם�4Ir\��%�zH�qd�����6�@�j!	�(	�`Jq�j���ǔ�`(%(�ZB�_����l�N
[��9�����
+��!J`RFzZjJrrRRRrrJj�\��+(*);S��ѐ=ܽ''��O6�d�1����F��%���R�!?G�&�$li�z?ߥ>^B�\&9���2
��L�p͟��1q�T*��2�TR�Lf�KԸ�
+j�4�
q�5�ˈ �⾠�� � K�4��(KC
�@w
+��n�T\�2�IF+3ɜ�������B3S��j�?���|�y���WM	-H񗪁SgQ����E	=uM�����;#�
(e��:S^U�G��A/+��

�C��j��'�
oz���
++���K����E�޺1����˧M�8n��!�>��w���7^��o^�#͜�\��Tz�$��Y���!2 ���|��V_�So��

Mԗ���]�`鱊%���K,ɶ�	,575؀%�ťj�{��Ҽ9���(}��a��*dFGۅ��s
��%xD+�Db���=e��4�t�s�K&�

ߤ��
cnaqIiE�doԘ�g(�\��
�J�9+�(�]l�a��Q��4ig,�t���Ǻ��H�;*�aɅ�nX� ,��[T����l㆐�5pAp	}I鸟N��,1V(Fh*�
�(�(:�� ��H�D��J�b&-^�b5	��{/l1�X�.<���tP"���
+�
��7N8�#�d�
� ���
+
��rshrs��
O�>��d��*��s�ͩ�-Knϡ�A�{�Kx$<
+
fD�',
',�ٱuSXH
+,�Ҽ���	.ykc�0-\5pJ0A(�ٌ�̜�MY�x���m�"���P*>S^Ym�w J��\�.L
�)��PI�!�*�M��񢷮�=[�
�Օ�d�)�cc����z������>�&�
9l�G��ݷ�OT���J/.�Ԫ���Pp�=Pji>��`�j�V��b�Zk���KT���c�[2�K�{�������l"y��3ҒE]ڽ�=Nr	;�&��"��^yM/Ʉ�b6��
!>
�%��\���a�G
$��	U$��τ�a�$�ևmڂ�-�RR�!+�8����7^��I�s�R��[{q�ҵ.p.��_x8*46�.��H�/��_���S�Ճ=e	d�ʴ� 
�K�
W�lkDxhp��Ksg
ɦ)Y��p�(�b�d�RR*%;@+�
+���D�J͓L�)���p(6�8���N�p{���g��A �\�����
Mu�V�M����
+��r��YY��,cvN.q	u�$
�.Ε.H��C��Z��6�SOe�����l
K5�R��̴d`)&j�N(������ ]
��n�N
1����В&h�*	@E	� =u����c(�U����	���_�7�VV��@I�Z�>�G��y���f=Wq�8�h8�pV
�rɂ�~ӧz�=b���;��7��������媙���
H%gU���ՉH����DL��T����lx`�E�L�_����=b�?�’�����Μ:�K�DE��)\�&7k&�7��g��L&�&fY
�c�a��'|;�p��(�0�H�s�$2:�$8��/�*Lڼm'�ogQ� n2��b�.���(f��Pz�
+��8���P���
+
�4Q��D?���D]}n*y����ı����G�5�4;x`_��[6���e.-��"�/����D&�(���)JA*��h5<L�$M��ЪL
+�)�P2<df�*��!�oJ�HՍN����v��<�
庶8�(N����2�
CZ�����i��P�K�gZ�;:��pk.qB#]G�ڮvv�Ql�K9���#1���]�Z�v
E��NƄq2'�,�pO��IjQ]�|g��}чb�RҍJ�:@��
y�&���V��UI��_!\���z�'//9����w(j�֍!d�sfΘ6�kܨ�C����y���_R��K���@%y��X�x��
+%[}������\Ec6�#0�����Xz�x�&���%68��]�t�"�e�kaq�gO�.�$
�;r0:
+���\&��$��;�mn2�
�ָ�du�/�
�H
�o|9��<R���A�DF���`��+V1�`u;v���D*{
p�[��
���+(�t(�[�甤@���ڪ�W��
+
55�
+6�$��� �����J�cI\<`ks
�+��Lԥ�}{vnۼ)l=��j��ŋH��Y3��,�)+Fn�g�I&5c�H�1�j
��3<PK�!�B�`�ɤ��b�"TzV��

��R�T��v�@
�;|m��LUT��c�L7���$Ӥ���3�9yE�$��B�_�vC��R!z*K���R�0T۴XB�ER��
AP�V,�Br�����,��.R��y] ��(�s9Pz

G&��>z,)UB�(1}�5o�5u��X�~t����eU"#������d��6�����
��ٻssغ�������<a�'�����}{��o��Z�����^�f���Tz1��o
����Ƿn�c(��Z���J��c2UV���X`�,)˭z����;,1�3\��-,���q����qĥ�֯�&�@���7��#��NG�<��C��?ƳǑ�9����DF���N

+&	���-��Ii+u����+*~���+�$��҂�`���$�$�EYz�F��E�g�R'ߛ{�v
�47f?\Pp)h�*��E
����*�Pl�TL�L
�����[	��Ԓ`���.Y�Ra��]�Qњ���P�
T)U�<B�-Q��^�~Pc;�^M=io�De�S at i���LOKM>��x�&1�DrjZzf��?`����%~��.K*"݋c���T��eHIJ8z�@��B�h��K�_�E�Q����sƫ��=u��KQ]KEi�v�Ԙ#q��<�)�T�2�~�\P�UɅ��U�.U%6r���Lq��p"�p���A+�,����T��cF
V>�����~}_�~�K���*���
A%u��ߕU��P�Z��U��򲲲�R�Q^a�d.�.5]h�6���K��l��X�N�%
(q�Meg(zggR����\"��´T���فX,?�9�&,Y���6l"-�
��/�aq�/29��$|�[����BB�6QOb�;���L����ly%�F��B�g��. [...]
+����k"���M%=����`�n��F{��L�%W\�`��R�F���%>d�+F�	ͤT^,����H �D���Z&mپkϾ胇I�����|2�
+Mx���ȓN�7�
J�!�Z
ܸ�y�*�%�S����c	��qqq��	���S
F�dK-mҰE��,�覍���	�\�bQ$�J�
r�H
+[#¡ǚ��%���0թ������`!I�Ų�nDQ�����r
����䳉u2�L.G'N��;131�4i�d�V�zi����_���E�(���˲�.,��"1""[M�m��I�i���}��=�B�?�~��t�����=v*����Q��yN
�y��i�S	w.�ҕ˃�z�;ښ�vK��DAnfjbLDXȖ�-Y4�ݷ�͝3{���gL��F�$�rW�OP闢��{��{�P���! �+��# ��P�4�;��j����Vmw�K�M-4�T,�M�ʆ�KܻU,�V�$"��:gk�%�Β���!�{�KQr!4�֯[Ë�χb�I�	I��B���~�?~~�pD��[�1���� �f�no�d�����Id]s
+x��LK�y8Ε+w<㞡�4'�u���B]}�Z�)�J��!���U��M�&��}:�%.���P'.ϥcGs���S.�Q%
R��2ńd��<,W�Ţ<�T��u�7�Ra��b�R���P��&��Q;�<���h��{@"R8!��6ܡT��&�d��HO�����Y��
�W���1�ܯ��%������(�M} ih��
�T_�O��Q�
�������	,�V
���KIr��W�j
%�v*���!߰W at I����q�q���6�����
���l穖�Z[���8�\���M������w�|�W^z�瞝6��'��)�zd��r��&���P��U�@Z)�Tx�,J�jk��RI�b����%JA����w��(?û��G#a����(��:s������7
���.%'��DE��ݳ�����A��9"�r�&�
���̟���0�h��`H����|��z�e@��I�t��u`�.-� �UU�Pji?��8��71J؍
+i�&�Uh���JC�����k�ͦ)
+Kg���h��^�l��I������2q	�<q���E,
���LOM��#����W�L&7�T�\g��j� ���|�g�$�F��~�$��y�}�Z]S�@_�(Љ/ht��J?hK
����ʵLJ��G@��t}jj
+��4}z�ùG
��TB������'/��;ޱ�O�
}?.Gk�d�VV�3�eg�1�b��~5!P�WY�{H
y���be�J&a��%�Ҹ���T	�@�����}*
�t��D1~W�q�݁
wT�JO
�;���7t�5>K/x��߽��˜�Ӟy�	$���OP���]�0e�?���\u�⨶UY*ͦ
+:&���.���q
+�c���Ē��!�%ټ��`'$�%k%g
�g.��>�C� �
+�ൈ9&�/������/Z�����?`
������
��"�fRLl|�.Y������l��ky(u�D�(}�a���%e�2���h(55�9kh����=��^#���-��3mԸ���F��w�X��χK���5Q23�t��A�,Tw���T���R�� �b"�T7�A�J�1���
=v\
+EC	��̰�0�N#C�q|7�>����\�Ā]�u(3=-E���H')Y�����-b��X��z�L7R��c閻t?��X�5��K.,9
�
�1��y��
!5�y�*5AՂ���_�S�P�Yv2��c��޲s�R'0��P	���pcR�D�&�[f�HS���ݚ E^�����]�[k�+���9�)	1�{B6�#���ּ�sfϚ����$��I�r5�'��P	߲�J#�����SI-VTv�%���TQn4����&p	1X� }��l�|jl�Ƈ%��ݤ�1�xd���\�#.q��`��`ھu3b���9��GI��#-]���C�#��^�#_R )x�
�DAG3���rDa����S�*���n�a���Ag7(!�{:;h3�;k
4^QLJO���@Xc�e}��4�qRi��t[���렉[V�pV����H�]��puЪ�� �&�b��5�g)i�����U��)��A�J%3�h��(.5B(�X�n:�<��a�:i/�m*�:
���\O��f�JJ`RrbB|\,���T
}U
�&�k�Z)��.���D�����4�~�F��=��z���
N(b2҃��
΢��\�#�+�!�C=AՂ�e�r�_V�YLHڶ#T(����%کv�R�JJR�Q�é��J����
\8�o����ʊ
+�d����ڶqm�߲���7�x핗^|���N���?��5�'���Q�/���;8�F����Tj�^�yb1�I�C	��PZf\�v��&�t�SM���F�boXB��F�Y���
u�v[��\B�������)_�lG�m�fZ���n%%
���냴���r�J8؋xD@"�mظi���;v��&$�LJLN�gd���8ꪪ
|r(�΃������$cn��(�7 at L���E5���\Ye���z\@�}&�t����R�ް䚸���{N��u5v��T^ZrRp�:Al\u�-��L��H1��P���Z�TD$!#I*Ei/�d0V���f�\��*��ӿ��42��A���/��uuP�ۭJ�$�z0)>�`LtNttL,j�.-
�X�=a�mhn��x�xW�>�X�Ē�oH���y[,8w,uR׬À5˹�K=!\��5�a�xh!��?���FB�N�ߠ ދ�j>%��j�Nmm�ԥk�R=�4<)�Bɣ	ȩ�KSɉ7�(��JM<�
_
�t�?����_}�7
��<��|��G&�$�(h�J�_a�\�����VŁb� �J��N�)*.1��`�ں��S
X�
�-���]n+��
qWD��\��������r4�0��!��, [...]
+���V���f�='�Rpp��4�y`��W�T�K��w�=�6-M�qV�K�'
+��R|,�������B�@��kT
�ZH!��
=FC��L��v*U�>-��<F�p�x��ON%����8b\���M�V�s��~��9�g�|n��2�'?���4(�����N��f
�Im�8�$��i�N�i3m��=�4=�6�4���D�eE9PYA�s��A at .AAAA�A�(ފ�hԘ�Xu�|����vQ�i|����j������|g��MM>C���JJ<�!U�a{��ma(Uy*���2z��&piK�ܻKg��z������t,�g�+g��3�%�8�KRry<�֢��W��e�f
+	梳PՑ�/Y�x�"z���o�b4
���[.5g�A�ITt<���\n�b}��]ݽ���P�s#
�ѽ���%��mb@���~gM������x*<
hB
�hn��A�Mc�]�m��9��>�ys�T�o,Al|&]�x�\�zdX���Q �J�Ɖ���$3�G�*wby����TRNfR�z)�y0r���~�
��wOOgG[KC�@)���8�`��
e�G��
+� �ܞ꺆�m
]=}Ch�┠�K^X�c�
����&��%��C���M��%�r�v��	
F��u=8Nc1�Ah�&Dځ��$��((��Z�Ќ��N5���B���7�T�����T�SiCZ�j{؊����~�ګ//D�?�姟|b��y�Ν3[/r��
���'I%�x\7��Q��0��KJ�)w�\�Rz�.���N�
z�
,���`=�HDAu,ݾ/,�g�c2���s�x.��륎#.I7WW��1��rtWR"]�)L�D��
eG'fy�6�m��(8������e�V�Nf�����
L��
��t
}y�7���Jw���P����]�Pڏ�J@��FC���f�h����.�4�4K���Mc����6
Ქ٦�J^XR��3�L\l����r��
��]��:�_b�L$*�*d��PDeעJI3-iz�0��#���y��i��|����uT�8�u�$�ø����m-�uՕngQ^v����$���x"���$3��Jݕ5��[���E��X�n;%�R�û'�,��B�`�N{?,Ds�V�+š4��cd���@� �((�$p&+�J]j��P������;��JW�wo=��_�Yp#���D%��{綖�͘Jק$�F�.}��7��_�����7���g��l
��l�J�ȹ�?5C��R�P�(0~QܜBf��Tjn �*�e�Ғ�"z��KJ]���
t�;w�xai\aI~r�
K抻xs�����K��+/s�h`J_���`�&\�WHppP�
=���?�O#T\��j5j.)=�!	3IP�Lj73IJJ��JW
(�r�8��H�/�.s9��R��E��+:���
c���{
�,���X�ύ�{����&.��*H�Ȋ
+40�%@&�����
+-��RY�kY�Q�#$郶�_�0��~��<�
?q
+�8vi|œ&��]-/����vh�
�?ؿ{׎�[�k ����i�k�I�\�!��1��
�R~���j�����={��)F���}���n���’�-�P�aiTLa�@_/��'T�KE�
&�;�|d|�`��
B�,���L���`(���/r��>�w?ɉ��u5��k]ЧR�n*��
+gaN�ڤ�� ے��叿���~��~��/<�엞����g�ǙJ����CD%?��
���h*���d������˔
q
+����f,!�ɰt���~L&�;�
�%�C�\��PY�-G`��B��eq�Mt\�TuQ�(��0zB����FD�y	����$9@�u��9�2.:�0��m���ſy(�>{]�	�T�d�
�4���
�H`�X���b�gz�$��6�����GGF%
S�M��c���=�&��K�9�<�B��=�#1�L%�Q�
+�;$0�R9�, I�*)fRo��Ac(��L

JJ���ک ���v�lom��\U���H����
]��C�^hxdtl
����_��T�������7�􎍊Sx/���g	�K7-X�ȑ�)
Q���Z�\r!�
�����V^�
�B@��1��Y
+�R���	�n�cS��]�[�}�����Tr��g�OI\�r�?������?^�ҋ��|����
�;g�#�SS�(�*��t�~��B
�x�~��
�

�Dj�P*��������˗�����iXz���
����?Ю�~�t�Kző�)�&ѓ�3q����j9ZLtXY� �Z��!l��Z����n~��18.�J�.,�N
D����/P��d0I�:�om(�����~�]g)��@�.���%R�&�\]��B�HB	σ�����X2���駒���w��'�����Y�|
,&v�t�Ĩg���U
����QI�Ak0��ұ�>�p���ڌ�B�i�^��Q��>*�����-�7U���3ק:W��#�B�V.��l�e�+�B�"쌥�̜��2Ou]���;v�����=~��Y-��
��/�&�5�b鼎%:"�PD�����$0bg�
d�O�v/�r/����V�	�T( ؛rVV
J���k�~r(�-ZT@,Z�R�e*9�Ã��T���_�����?��g���k���**}Ơ���g��IS�W=�2�V���M
�\����de�����gjB��C�Kק�%�yks���S'��L\���}K˕9qXL&8���+i
�WBB|<ݘ��? F�8G��
)�������CE���㝤W��o"1w�Jro%����PsV(�mm�B��Q�PIB
�\�S
��j����z��>�x�T��&����ٸdFs	-.
�5�$�Im�
��ȌQQ�����s� I<�,L���UP��r���kq�����s
��RA���:&*|e�@[�ҥ�гti�-pEphxTL\brZ����RweM}Sk{g�
��ѓgPo8g�o�A{a����b銆%��� ��㽄��O�ؙ�PO�܋Ü����q ���	�N���t�JԃJ�Lo]�j����^S)=5qU�������_{����/<�,M�����sP�&�J3Tz�Du���p�g�JG����
�T��,w��Cefdlذ!##�����EZ�
�`�(
]�tejXҮI��*W����8:)�%.9�*ط��
����J_��B�х%;�IR�MJIIMMK[+<��s��H�2wV�
����ԯ��
���mJ������@IZN�����C:�Z���i�20��H�4Gp��,:�Ŷ�>N!��L�J���.�gFs��ٹ�K�ƭ��T�a� ��K
�IhH�����i��"$�V1���D��O���(�~ (ɲ��� �> [...]
�KЄ<� �*v�E����� ���@XA[A�`��M
%�u�S��+��y��o��+Si�&P��J��1��ܜQ�o��5L�W���
h��6���uk�<5{*�Pi�Q���D�Ez�kk��*)���L3���.��Lj�"����WP\Z�X���,Y� y��+�@,}�`I���\�=);N�Row'JW�����pY��M|]��|z��a����&<""R�K��d��H��#$�WB�qgh���
�I#�c׮߀ �
J���(Y�z(�B��!��9�xƒ�Lc�����f
��jm�T����
�w	]f<qa�Ap�zТDv����ɔF�������3
S�����Y!*�g	I(D̤Z���I��!-�)U�甇�B�󚖇i�6�~<�����X[u�����fH��Pz��#��{y���quuqqu�������#o�X���K2f���U�6���%
��oSw�
I��sE��4�����Ϊ�%��Er�4���$�� Ď���,8
�@�K�>8�
+�I
B
+0�����;��d�P���@��J4�Ӿ�v��6��1��
�pٹ������?�ɏ~��w��o</[|͓��x|�-��=�B�eC%t!~��9���KS}uEi1M�TCb|LTl�p�pp	]hL���հ�#�z}��胻s`i�oO�%�y�*�
�C���%�na�`*-��c2e1�p\ɢ���x[���O
��ظ�x��)�N�L#�z��T[�3����2i|����0iZt�*��I�J�Ã�P����HM!&EGED���+EQRV	ٶt��_�<t���
tTz�8*����'�����d;�\��w��j�+	L�%��Ē��(2�ᨴ�dT�l-��*�I͜T��$u�N
�e_
%��=����pZ������S(
}��?��������
��nW7w���K'������,sAɹ��&KGO�E�;i|��X�W4o*s`�C1`��%�K�Є�r
�b��q�2

+C<"��L��VP�1I
�Qz������޾��/JJ[M�[�Co��ӞNK��T:*���7~���^��+(�o���=���/�[���cv��
+����nO����a|��la
�RJA)�LHpP```PPpșPp)6!)e��/0����9-
K�1٘7}0
���t��(9L�	&
jN��,ф��y�O�;z�C�%�p]8/Yr�r��9�$�\e5#���f5�-����n�uʹ�g��[��U(��d�
b��X`Q�%cz�%�����GT#=��?�K����dK3'�
̥[7a�T�ĥ��Dd�Ԅ
&�&�ivb�Ȍ���
�Y�<䋨��h&�QR�Ĥ+�I7��8'm�~�D(���mU�~l&�+��NOI��

�#(�y�������];w89:::9����g�羃G�~�'|B"bR�M�E�5
�m]��GPp7q�r��4��K�ꀽ��%x�@s	��4���|�,��&%
�C�a`}c)�8\
YA
3��F��P"Qŝ�3y�D(Ɂz�#��Ih��T:[h���'��+��^���J/b*}�����T-�B��M%�3䃩�����P[YVR`6��b	J����~~~��A�g�P��I��
�y�pM��;��Ҍ�S�zQ:.)%��
�F�L��\s�L��&�.�Wf�
�}�{��i(��
T
�(GR		#	G&����3I4�dU�m
�Ԯ[���%n9��J��	BrB\td8B�4N"ѐ
+A(�k�6��w�j��ᆞJ�^<��h5�9&�*��27'�m���:�%��K2�NLd&�J�*G�J���Q
Zn�
�x'�ZщuQ���a�PR�q����wSSYk�0&�E���e�N��۶ҳm�#�����X:v�t`hdl�1#;�������}�V���)z|�X� Ea�_/K.�&��0���db6N����� N`��gPNG3�����t	��U
���%�*M�ﲺ��T����T�K�3͘J[0�~��J_�Si5��B�Y��B��A�i�J�:ۚ�k�|�9�i�ĸ舰�� �Ӿ>>>����������X���X���sI�7q�K��ELJ�5���*��&j:��
��Í���C�i�r�8/ܗ�
+�
��F�$��$4��U�Ij�-���C��M�����Pʠ�*!�@� C	����OⱄR��}Q���Pi��%Ƒ͟�-�KW���(�YL�5�U6���r81��H
+QiYjY)Q�䠵a:CI2����av9>���R�$s}���U�J
+r2S��‚�}��(�����
&mݲy���æM��nsܱ˅���Q�S~AaQqɩY悒��z\���+ã�q\4>���'�͛�
,=P,�nǞ04�
���H���)bW��#�G��� G����+�c&
� h(M�@;�����wb3Pu
+�}Z~���iL�	��J��T���/�@
�a���^�v�Sr*=f*�Pi�P��V�c����DA�
+���1�ag��|}N�<y��ɓ�||���
���R��R{aihdLb�û�3|�,���X
�l.]�r���謨尘D��s�1�������v�w6�'?�h���}��D"�nni��1� ߘI���td�\u�����u6�aJ�fA�l�H��D��I�)�
Dt,���"�P߬��B�{K��<
�L�%{sI֠¥��<���.\�q��82��Є�U�&�g%��AKI�阤��h�G��8�٩
�WwGkS]�cV�!!:<D�����ǭ[69l��G<��y�v�]��x�;,
��	�N0��r�J+jZ��v��)�LAXR������5�
��"ŮZ;�����,ԧ��<�
���
+�I#�o<T���_�Ҡ�/��׭W�[o��,-�3�%�T��~���O����
+�
M��
����O<�j�2�V��L���gv��>���ڐ�
�g�JOI��BJ�N
��>v�����_f1Q�g�h�^4mz�4M�699�IڤmҤm*G�UA\�Zm=�zD�`�`X�}�UEqA�]@�zP���gq�
l�������730h�ڄ�
+��?�<����Ki�YK�K����^h�
K�JX�����d{.G�\�A.ݞ����DR��	b��d�A�"Q����)>@o5��c<�)G�Ds�"��$��$�3�G
���l�g�26P��
+�N2(��h�0!�h?��~����c���#�'N����r�T��K��A�9Z)�U,q��3�>'\�~�AH$�`‘���$��J&�1�U��Ju^!�e2hǙR�LR�ׁKG
��T�;S�H<B���~�����E�٦��NJ��cۖ��{�����Z�
\ڲu;�RHx�>!9=�����
���
]}���M��gX��Xz�p,=���;i�ޙ�͹
b�N�p�Z�~
!��V��H���:e�7�P����f��+�g�.��4h̪���r+Siْ?������'?VM��X��"��**��L��ы�����~?da~NFZJb�A��������bb
��$9�:�F�N$�
Kb�3�
!��`�`�d�9��w��Ƭ���Aމ�� ሽH�!�X�����H� >�`��Y7?�h�
 �R��(-*�z J��D�~oLN�zP\VU�p���i����!�Qi�|V�e�%��+riZ�ltD�6C��;ɵj���F� I׮�J�B=P
e/��B�@�vv0
�ǁ���gZ����T䤧%(mߺeӆuk=׬�pww��X���~�`��

��
�Ԍ\si%H�
s����Ihw !����'���6����OV�0:��!b�h:ä Z��~
)
+
"i�Jp��gҧ��*u�
��,[����&w�
||m���@/y�#k+K�9��|*m�S	�7�~��wĩD3��TZ��[I%Ii�s^VzjR�!6Z��jõڈH]t�!!1Ŕ�M�T���8b�F�u,ٲ��r/�s�g��KӬ}S0�(Ȅ�w{aց��0���O�`.�8��:�i�!i�"iRH:1��mG։���6���Pj$P*���4�&�
�1:Z�h=HNCJ+k����:�~�w 
�T����J�7˱�c�� �A�ϕ�)�Q)�%N�UW�T
d$�A
J���J�
%���E�P����Q�r%�܌T�!:B�G��q�ZO@��������pi�:��=~A����Ĵ���2ػG����=CWǮ}|���o��� K�܁
Dj!^@
�&ע��I
��2.X+pB+ �Md�c��`�?C����ȳO��&�W��}���j�G��۽S�J����E*��P	�F��t���69x��
Z_fZ�1.6:*B�фj4a��H]���a^aI9��yKS�h
���%9�d.QW��$��Y
���	��
�
�;wME>�_u��.v��8�"]S �'��Ib��J/��(�R�RmuEIa~v�	'+0	�A8iQ��
d暋�y�u� �ƀJS�E��Z
$�J
K�&.���Uw�K*Ÿd�R�Z�(��J=hI&.p�Z(�����`���B	�����7�V��f�%��PZ�����yժ�p��]�<�x�۰y���������dSvAq4�&�w�qf>��K��#���
��tb���\�\���jp1d-M�{�TЀ��mQ��,L�P��S��#�S�7�>;���p���t�o;�|��@A�)).Z���&�J�t*��r*}�����+�J���ܚ �

p�k�ʊ��S�� �pMhH0^H���s))5=+Ϭ�ҥaK,=�Xz� ,�*���T���
s$稹�]u�u�0��L>�7�����C�ј�@��t6�d�P�P�V��֡T^R���� ^L҆c9 � "�� c������H�ɶ�=��h��oS�
+�*�X&�U.)�%�ek�ɤ�bZ��Z
�4��
ޘI����x�]����;�3��ʊ�LI�1�a���� J�7x{�vwu^���i9�ӊ�ή�7�lݱs�o at H�NoL��1�V�6
>B�
^

���������ҬX
*�4��P��&�$-��E�Z�T
+X�C��g�	v6P�ϴ
?z�@UYanFJBl���_}6xy�8-���T��<Si�Jo�@k( ݴ���,5�f��
1����� ����
$b
�tK��ZZ� ���]%~R`�:j~,Y�K�h�	\�O9sRΑ�w��C��a�����?���[X��^$�x�Q�I9�mF|&3I�:�ko�		J�e(���S�`��H9"� 
�A�1Ŕ�WXZ����s`��+�J3���;�d�H2�d,Y�
B�]��	�b�dL)�V�!
1
Y
��$0���'
+��Y+Pb�8�z����x<TWS^
E.9!6*\�����˪�
�-[
+��q��U.n�=	�>ؽ7 TmHL��+,�b��b���;��i�- K_K/%,IsI�S�#����i�ϴ`G4�D�2o+�x�T�	�~|K(Anߧ>���jSc=�zVZ�A�S��
���u��ß`*��w��
���V��"��F*=VQi�P�������� '#��.2<48(��o��@`p(&�>>1�\,`�{n,����Kߊ\�B�؊���
�Aq�:08
=�:�p���uu�

&Ŝ�$b3!�TL�o(���~(�f�`e� 8��?) t�����\sIEM}cS
���Q�T���o�<T��F"���bPⒸqY�Ʉd�fC1I�A&���+7�@)�$�R
Z�ֲQ%Z�?(MN�G�z.��=Ղ�XQR���b���C���`�
%'ǥ�;8,Y�����e�N+��<<�7�l�ۇ�
�D��'����k�@�Sg/t����[�&.��{,��K��&�=�T�{�\���++v#D
+B'������k`�
+x}S���CI����!��F�|2=y�<{w'�
��%�����M��]�������~�[+S�{sM�E*�eT��T�2��}-v����z_��P�	�����g�
_߽~����
-�
+,u,�͋%;�-.��$���
�9b.,�u�u�0�1��W1��^�/0q�94��$6��L�u�A�\���J�P*(� JzJ��� R
����n�$��c�U�
:J��Q�9���d�?>�,��璂K�E�f�.�6Sl�*����4��gj��������q�q�iATT�B		!a_b�AP�EA�\@Tl��[qD�ml�ƥAp�
ѱ��v���y���YP�Ʃ��F����;����R��"�py at qH�
D�I��������2��u��cG
h޵cۖʍ�9iIqJA�W.��4g�
/OOOO/�Ҽ��}����ED�cR�f��P���]��.^���2�Ha�^|��%�(=�\b����k
� )����Q��&�
n�cZ�$z(������@	���Z����=��N�������lا�ёҐ5+}�Tr�0�&���C%x ϝ*�
l�� b���g�S�tZ�:Z�R*U�h�>>5�܂��2K�X��K[�$2��\bBlE�
2!�9d.�.
+N(��b�z{q��C��!��C!G
F�D�
��
+:�3n��dm�����j�֡Ԁ�TV�� 7˘{W5:M�WCFN~QiyUm}Þ��mG1�.�X�1�1�d#��X2��%F�]�@��bX2F3J*�V�<�d�z��X�
&��P�%T�!
{��N (�\(
K��f at i�F+d����%�`(����pwC��\�=w�"o���!R�R�OL3�+.��A*�
n�8y�M^�;w�?|��|�z��Zzgb"�!R���
�%
p����^��U���`5�
+
i�f��ſ\
J�J���<��cG9u�
ԭ՛J
s3���(�$p������o*MP�G�w
*�`�
��T�֖�
�j*ˊ��f�MM��k5Ѫ�(�(e�:&6.!���`i�<�R�MX�
��9L���d£	�&�t�/�'tW��?���\G�_H
"�����g7�l��&C��T �FĠ�5�� �"<WS�u�hJ%�K�iƬ��ȳm
�[Zێ
�<�^��D%3H�ȧ�.Q]�K2Qh�+FI�91�@*�g�1R1��
+����bP"�
��,��~��:{m5Ը�LCr|�Ai
����0�<��\]�ѹ��yx��X�]�*0$<R����[XZ^]�'/������K��0�
�d}-��~�D��=Z�!�&�3R0b\c4`E at D"��3����I�%q(�玡t|��
1E
;t���g�
+�����+|�,�3��=L����'��4A�O�JoyT����r����í�vݖ���
r2�T��D+��t�H�F����z�e,!G���ү\,�4��\�
&��h0��d"h��!���39�9�
���	�
II8訙d�I�A�%m5\ M�t�YJ �����LCjr�>6F�RF)"�p3��P
�7Vl�۱k/�l�3x!z��1��y(�&�ws�4f�1sɢd�K�5�X��T"Z�"3�O��6.Z�H��S(�t<����}M� צ
E�YkStꨈ�`�ysfzy��:Owrrtttr�����9c�����]�:P"SD�Ƨ��6Tl��rW�~�5l�!]�y`��
l"�Ǟ�Kf�D�HK��4;$т="� G��t+�Y�=��"�}�7��#���>
1�vu��9�����˾X4o���t�I�Cz�S��&Si�J��~{g�J��@�:�Ci��e
6Y�1-)^P�G�¥Rix�,"2J����%�2��QW�lK��
�^�7�J@�s�?�����G�D�
�&�1�;���kp�
$d1\����
:~��̤�t4�B�gѥTQVR���a������@&�b�P��$$��!�6m�
+qv�P{z!zh*=�*	�$���-`�d/�$E�a�(�x��yJ��
+K5‘Ꙡ=�)e�H�L���J ���_�o�	~A-.ۘ���(�a!�~> ��3=��

��sptrvq� XZ�ru�$"J�KL5fC��ͻc����;N�\t���=�L4�
X�ͥ1�ڱ���|
!Z��bP��-�_h�0K���p����� ��>yL�� ��O��']����k�طo��TZ������(#$A��������ȝJ�m*MP�ӥRG���H���¼,Cj�^�V)��0�D*��I��5�����a�?�Ro�c*s�	��0\�
���$樜�A�����

��6N8��
$�H,�86�L����j�#����F
%<V9� ��LN	��6+�����v������t�<��q�ćG³�%ɨ.���U�����ɼV�T���l@i���N��ͻv�m���=#-I��KJ�}�	�\��
����M�jggo��8����
��d���5�R�2F�����������qOKk�Q������k�7��FF�bi<sI�%s-�T
+�
�<�f���X
+�A	-ԟ.�|w�̩ǎ@J��^�a}~�!%^�����Y��p�LW�iS'}�W�T����4A�O�J=@��
G�R[U^�JH2�JQr�T�.$T"��J5U���c	;�>��m<O���UO�\b۷L8樜�ل�������7pā���L��q���0IJ��G#R=�R^�1=9A�ը�"#¥a�P8�����}B�!Ҭ��v{c�~�B�����'����RI�I�^s����~eY2��C
�
Ɇ�R�jEK��W
�@�0&�C�����C7��`ݨ�C:�ݽc[MU�KR
�cxh��ދ�͞���2��4u�dtS��MsprvEXZ����? 4<R��O6d��n�޺}gӾ�mG�wvu�����\��
�ҳqb��B|.1���)8��!GN�k�
U�6@�N�e�**�΂O����n�VSY]����S+d���~Kϟ����`7������T��MSi�J�����z{.t�9�����z��;-).V��(���Iq, [...]
k4qO)(
߹98��R
�b��ƴ�]�Z� &�Z�@.W�4��бs
+��*k����
q��d�ɏ� I�MV_�_X2=�#uB(�e�������`�M�/D^4�.%
+JW�` �cJ
����e���
+�$p�
+��|
%'{�)�'M��I�%{����_�AQeY
��v��Ӗ�X��&rpp�9�����4�ɡ�I at P@�����Yf�t@
10�s
GGWGA���QF1 ��l�����=����Tq�Aw�{�9���ei���I���


��������|��m�5{��7
;y��e�R��g�7���
��K�W~8��MU��7%�O/H��0�7��Ǐ6
�۵��6��kGY 1&"$�G!s��?w����Z���
�{��Adxk\�T��*��	*U�..��LOI������<�xz!��BU��	0�rK嘥]|�� K�:h�z���ú�s�����߬L4M�M��0O�����
}��8�_�`��p��ћt��������N&w#�  ����TT���8���T ��G�
���KLIςa��bc�������*݁y��*����E��d���1�2�P�U2�h�R�z�ےtH��O�
i�Ξl:�=Dv<
�V�(��HK��V��(�\
l��Ξ1u�4�b�� [...]
��R��p=���rcy�e��b`U
+����������rpI�B��LK��,�>kcX�cI�}���xd�
=�Ȝ#��:�`�Ř6���
�y;3�ȊD��{L�$�L�D��qJ�0JM���z�R~Nfz����H~�(x����?�~BrZFN���r�R]}c�)P麺J���$
Io��#��
'K��T1���%5
�H�L�%�d$F<����A	M��e�YT!�h<�R(��E	L216622661�,KSg̞km����

��MJ]�4�ʵ�6�}箽
i:u5����
�^@Ay,�W3K.�
S����)�sa
8E��'�nfM�e�E{���E���ffCm�
���j��r��!
��y�]
m�-gN�4~������<���ҟ���J�X�:Z��l�!��B�}�
�n2��L��.y���E��'��c�V
Y�	Xj�,=�,ᨇ��-�%
�����
s̜C�EM:�`������r�H�$����%t�T�N�#Pj�}�Ƶ+�(�!�����舰t�^
+�nn�r������2�
V�*۰^����ҹ�?���^g��o�7�04� gR�l�d*&V2�ZI�J�� �y�8�#�J/(]�P:X�Gv<
��$�D�BfG�q>��(d�������!�dj�X��X�7���U��G�r=��u
9~�
a�E��^~i��.	k��<�ZtH�K�$�LA�[
��W�
u�w�;�Wn�XSR��]�*T��
���)Ǝ
ejd0�J�atk�*
��UjDR�uC٪��K��&�E�(�==�e�.�p\\e�%e �
G�T�c�8b�ǟ�y�N�=`���_۞Kd]��i]�$����3�Ȩ�ZL���W)��)ǎ9IڮI�����g�Oy�F\���K�Ϝ�3nOM5F�������U����pd2w9���RT
IجJ�C~�J���h�02�rnI�&6K��)Y�d�:�b�kE=�.�A�b�h$����F��F�@�8���%�0
Sc#��^rW���0(!�
������A&c���i3��[`�$�����ON��]V\
+]��o���D��\��X�7�%h��n���Z�$��{���)�K�Rt
+��g���$�ͫ_<��=��W��n��'kW.�φ�T+��������P�Y�JшҀJ�T�sj*A�N
����\��
�q���
+o_
��R���"��
���C,�:{�2����y��)��N���%������M
+&5�Ps�6�QG���:�߼$_yM�8�n�a�t��&�Ë�L��'
J��(Ua��
���ĸ(U(\>	�� @&Px�݇E�&�,��+Z�v��mյ{�*=�X���>�����G�4��	��
�ZI��>J%n� %�ܒ��ݖ��E�R�TS
(��n�� ?o��
�͙9m2B�����7==C#Ss�%K+{g7�o@�*&!%=+��du�ƭU�5{P�8}
�tK�%��`�AG��0���D)�E��$����d�+*{��*���st���-��V�(��H[���
-�֖3�M?����H���]mU��J
�^qT�*�jj<�T�A�(/+=9!F��V�e.N��vvv���N.2w��UQq��R6����`	�b��T�
�S]�%
�%~[�aR�sdr�y��:N�����|���ݒ�7�4
+�4?n3�P�u�	����q�j�c�
@3�����(%'�F�B�|�r7W�
���C$���IHN��-dTj��Jk��#�A	_-gjqo�d���K&1��KF���{x�W�w<�H�Y8��5�B�
FiJ��*��Ⱦ�cx������~�����2i�p|F���702F,��8e�,Kk[wOe`(D
X|�J�Tl����ݳ���؉3|�Zy,��4���_��ҕ�A�H
���#
t�
qP:}�h��n(/-^��	*Z׎������O�0v�(Sc��C?�t�'�W�W����J{wUoC*�f�%�G���s�����
[;Ggj6��GAdO�`X�NX:BX�v�����z at z�
X���{<���+&�LxБIG��7���I1 �EҚ$�E�p
d�=F���-2�N� (}�f
Ai钴���p@���

+��	
��Q"@�::~aZfnaɚu��J����U%��sQbL"���Q4L<�h�>|�KP�^񊉕L�Z��J�_��l�:�۞��ZX��2(�[�ryA6��h:� J6V�� �q%CdҰaC�
�\B,���X�=w�����K��hIv��k�m�5����Y��H���#�zx���P���	NS*}(	��h�Z �kW.A�
m�����¼��)�1!�8
̛3c��q_|nfl�7�������jUP�ߩt�Q��T�TZS�TZ���3,�3���ͧ����b/Dc��Pf��K/R�*��`C4�5�P�XPl�uM��լA��J�g�y�[�޹���'���~��0�=s���S�1Q�!�~���M�P�
+%�q)08,bB�ּi�s,aG����c'�%l��`	{��QCc��[�%��4a��sL{��N�e���'
m/~��)g$Ib��A��I�p���(]fP*?�@2�(J�!�&'�N`R�'.J8�͇�GŨSҧN���~�7�b�T��JZ��dM�$Fm�alb`"�(v�w��-�vɞ	��P\��K�J���I:�?�ll�D+vQ:ġ�bɂ\X�`e�����&wr��àԷ���G��=������R����Qc��
]���~AaQ���1f�.�_�Ś���������.�,Ց�N�����Z�D��j�gAG��}؈*�
����f�5@�G�
+��Rr𥳐/�˙�5ebr|tD(^������Q#�ؿoo���ܦQ�/D�N��K�.��TZ�ժe
sgM�������
()�.p\�
+���R at phĄX`i�t���%���c'+ɦWU]S�,�����w=��Ou�%��7�I�ZD;��}�7�䇜�H�$�^rA����h4�p�oa�]�p����W��߻kg�f2��	JS'�%%�FAH
 !�9
�x`	.>,2:!y����BP�DJ�6�TҊ
�|�
I�"��i��/Z)M&&0q.i�$�I�&�b
�Lg�ڵ�a�$	Pz#x���"�L�-��P2�m/_�Qھu#)����ٰD$���TrgGDi����oxz�K� -

<�X����*=|��ã�S'M˞��0���5�l*ڱk���C��t�c�����`�3���Ng)
-��
N�w����m@��? ���e�p�뙄:
�f�O��T
+g[��#-��ID	ƶI���N��OTj�R���	TZJT����D%Ow7����
gg��MK�P���؄�4�%�(`i[ɞ}��:�J����S�����z�T�\W��K\cI��t��ư�<��^iz�L9�H�J�5��YC=6�T[S]u��#�����x�d�͛(e���A�`
��W�u ���:��69k����:����3�R��*�lPB�P$��	(ND&&�%��4	+��d�Œ,��Vҏ+|h�����n��HQ:ˢD��/�`��3'��>��pv��Ɲ}(�Ի���Iff���̈K
K�,F���qp��y���'��̞3o�҂�_3,�
:{�IK�Bu������}�m�,�L�6�K�E0�]tDT��	/��Jx�
rg}>-#U

���tq�À:l�~}z�����Ĩ�ԩ�{�ҁ��Š\�ܙY���p
Q	Pr�9�9�<�|�C�G�$$!K3s�CG!K[����-u����]����7o����̮ [...]
+(E����zy��$g'�L
a	����ĴI���/(\���]T�x��Ljm%"57771^6�@&�KqI�%����_2�k%�����*�kn4�(571{.�7�1(
�@��,s��d����
�d���I��
N��f$.��
��1V��r�׸�Ј��䉓�f̙�h�J`is���
K?J�D��q���1�y��`�D�Q�� �R剣帾m���;I�0�ƒ�}<��2{�

ؿoo�Jݺ���՘�ԩ����!�_T*+�
+W�J�Pv�E��}�ܕr@���
G�GwO`)�ai:�ҷ[�aK�W����o޺}X¦z���qI�ZZ4q�N�bRG��!Njdh��߁�Wn�3A��� (ݺ	k����(J�++�V��/!(M�HM���

`"*��� �X�ܽ|��ãbթ�R^~�j���èҥ�X�9�^u���C���3�$����cr��	ej%�I�%i�tVLg�$j�w{���|݄A�[4�f��x��U��<JKI� ����0����8�b�`D����̀����%�Ҡ!Ñ%;G���_`XdLBr��,h���V�݀,�cX:��e�
;HK�%�{��Jt�0��������n
P:@Q�zu��Ed��
+;��������r4����A�`h�t!(�:U��T�/D��=�J�P����Rձ�n>�*A�������\��]��=8<2&>)-c*��_��v
nz��+���3g/\�ZU]SKw�����ظ�v.Iɤ1�
��h���
�s
��߹
�_����p�RM5���~8}������)پ[
PZ�;PJOI��� �0��ˀ

�
(T�
�S�dL˞���`�ڍE;���i��B�JO!�&�6b���qCC�#r�E���D���KR�ULOɤ���V
<��d��'ͤf�
��Q"kV����l�
Jte��8�b��,J��>�J�DX�	,
4t��Qc��d.Jo,h�:%
�hn��嫤Y�M;�,v������H�$�ǐJt\����I���owt��r٢��2@��J��`k5��}z�̆�ԅ�J
J�*�*I\�I��ޮ���TR�6�+,��˙1-#%!�K��Y�`gkcmmeemmck.�*�<�������T�Ҽ��+����;v��?tY���Ru�a�ރ����ĭ{��f��[��î݈��wgLok���
6(=��[�?kk�W�	w�DE��}�K����VC��3%u܄�� �
��.`��G�%���Ј�F��Tjit���AcPk��&�_��$�����
x�8�0��D]�%��Ճ����E�I�M�J
JM��ft����Q��|�R�:&2<������ɁE���0
aiG�LMMLLLMM�r,��,Y K6�2W7���X56Ѭ�yK�X�B���

��
�@|\zm|��m�V�
�.�� w���ś7`�,��3�_��.�vVc>���0�� %�J��R� [...]
+���"ݒ�.(1�l��{_�73�
C�=f�޿8�9���}��O��������/�1��������%�U�B]j=�ĥbv*S�#��h�7�2�QF?�Y}m5��e��sAh7�R/''%�=}���8�ںU ���sg�x���`Q���B���c�7a����s�X�qkxD�Q��5�R1R��)�M���jւ�<�
�I�������Zv�Gd�&&�K�<��
+���p4�ߩ��(��2I`����܌rD.
%��x(�d���P�mc	�
�Q��V�<�I
;v$0�K= Ktt���[ڌ�Njz� ������N	KE,�(��X�K"k�@=�����u�ͫK J��kr(E�$�,
+���
�j������Aژ�w�ڥ��v�HPT�����T�h�ԠD�
	�'�F �V,
\0g�tw���
T%�����������������ֶ�%�*j�R�&�����ǜ�?�ҕk7nef��Q]��K��o��j��T�M�㥿��P����Pd�E��)J��9ٙ�(v'&ĂҎD�E���.��3������i���-%3S�:�1�s���ݽ�J��J)�Tz'�B��<��A�LB$����T�SS�h"0Acb��(�J]����k�VDҀIBk����q]-s3@);��(�F$�H�С�����KZ�
�F�p�0�6L� ,�_
���ko�KWKٹ��`��~Ɇ a]R�%�=�1�h&��Km^!
�����ܺ� �lA�,�džh�#��"�t��ڻ�c֩#[�x(�T�ޏJr�5�z͋���
+Hi�r&���O�
�U?*�_��iބފ�M��_�4s�f����IT:s��u���@%/��f�C�

������
�K��m���;��y���. ,1�ڱg����O��;�t�Jj�͌�� *b	ž�.�qIm�}���K��Lu_��$���
]^�����fe��.������:|`�0�8�Ң�sfy{Nuuvrk7ʊ��`�(�+;�i�T�~�K�C�l���t:>)�Z:G%yNi~�k}�N��
+EJM�G@&!����*++��UU�& &���'m	K�y+I"�a�;a�e�FGüP�r�9�Nv.���cG"U��7
�� ��<��(!�ڷoO`���[��6a��b�(�q��n
�g������X,�E	a����gTY][�j�KpIZ=mq�;�~��i ?�]�J)�-��;Ë36TSc�!�:�����E��>��	AI���j*Ea�|�ffN~�6�R�� 7�v����gc�
��Q�𱘸��7ng���QI„���>�ݱ��aqa�]*mX
��7�k����[���L�JzCp�KC!�[Z�B,9�AЛ=w��oIR���س��c�����˩i���
d�%��HU����fkq.)?����q������?^�m<�`�$2T:[�J��
+ at gwn�LK���tb��C������_�ryP���~�����9:�
mc�E���
��&(K�c
�\�x"��B�Ja@�h�J�S�+[C%�A�)A��7
+bRMuU ������
+dS
&�K���*sI�����G�J���k�����`�()�r�E�';{�@i�.(�9��5���#�v��B(AO$�k׎�$���={k��
4X�����j�K���"�+`)�T\X��q�N�k���S]�hG�_ըSY1����y�pLx�ba�@rR� J�!�qP'o������n]�t�
�NPjMUҜJ!k�o	����Tڷsۦu+�TZ�bݦ�;��@%ބD��^*R)�C�Ȉp������qcFYY
�4�2���C�

��=�������g�\�Ԫu6o
߽�ީ؄ċ)W�������+(,R�K\���&\�]��h�3M��w5_�hm"L�Zz
%�~E���Pg�ׯ�\LL8
�����{@i��_���A
����6e�$X�-$��\��I ��p6XO����*$lρ#,�2��8*=kx���/��?�
+�E��T�D*++-}�LiiiYY9�	�$��
��*x�o�]�5�R����Z�Xkd�:�
�-�#�d'��P
+���z��8�t�Sd��A	zR;n�K,������!,
�`i�?��M����S�� KY9���P@��F\�P;��ZU�[j���w�"� 
dܺ�,�T4����~3�{�9;2{'(i���գ;��N\U��RUR%��4}ּEK��T���x�����6Tz�R�����g@������J)I@���{·lXD
����A��t����.
�D,9�f���CV�[�öp�z�1���/`ֻ��u7��}�.�ԡ�~$Y�yO�K��/��*	L�IC����e&������҅������ޱ}3(
-n�<_�ڔ�' ��--�(�c
�š����þ�'8�M�*-
Y�~s�n�J�R�JEH��'�F46�
+y+�B�8��(��� H%
3��AI	��
;�I�%��j�R��IS$)�[�z+�F�����ܻL��
�';LP�AP��h�@IWg@�>�;"��'��
���/�t����^}���
b`l:|���X��4�Y
��-� ,E��/������a�+���fs�<��,ť���wP�u���@#�jT
��>
��P
+@�a
�wh�Z�{�ڿB�%(���
]�JRI��5��EǁI8�Ѓ9�j𴾶��T�J
�
>>*9Lt����iބh!���B�
:Gi�R��
�R��h���5!A��#��'؏��46�,Rw���:0�Kz��,FZC�s��:�$5Q`��k�o"M
�:~�Lܹ$U��;��u�	_��&���,郪K
���&ʤ'�LQ*}H2��t;�R���31�Q�p�÷mްnu�o��|gxy��L
o
gi)�P_�R�@ڷ>� sKk��$W���/]�R�����K�7�J%����g�*�B�(oE��%b��H&+��Ɋ��M%&�0	���2���R-�
+��H��̟�O��e��x3*��x�
+P�a����=*�<����e��u
3k����t!�V�KS*�Q��2D�F�r)Q�ߩ)�D�z�?=�s	�˰쎘����9��^~���=�6k~��_���}�����zC9�A�8����ѣ�0�>ŏ<�����C��j��N���QK)9��J KU�H�p���=��� �$~~Cu
�5����l)	,��c�d��˅s��b�DX���S(1S�O��J}Si��B*�_,�^Q� k�
*�lk��Jʮ����<�?��̳�Ra��rI�������9���鈨�ҭ�VY=K�S�G�݅���r����ysfN�CP���������D��
���f���j7�u|�l
+	; ���?���y6�����
�K$VO��E�K��@3��!�$v&���!&ѡmމ���Zr\A�٬���p�{���mވ+n��-�Ҝ�&Fh(���F
 X���z�B�ή�޾~�aQ1�J�S����-H�(�x�����5J,X	�:;��Z[[Z������
+l�`�����K�J_��U)ƥ����\��)�8��B
+3ՈD��FB���tڍ�P�r4 at P�P�����)��F�
K�����
X²�ꠈ������|� $v�M$@�븹D�Z�K�	��p	J2�o1&q6�/�
��
�(�6��Bɏ@i����KD0�ƌ	ǎ��"�M����T:{*9��P
����⹇	��~�}���<�r�RϜ�������J�&�T�>�����H%(�W�K��΃�=�қ׽��@��]�:Z�J7�]� TJ:s$��m�����eK��53E�Ӆ����D�	���
#H���%)W�u�>[��������;��
+��_x����H� Ud.A�
<B�'�%~���c�o)�����X������jS`��g�$To(et(!�#�����t&>�Xh�� ����<�^����r�dm�
*Z�
 
��65��^b������oGpXx�qB��RL�vD�GO���b*(� ��%��%��-:I-�MM�F��dMM�@&&4���+��{�s�
د�S*<]�C�-�F��2	rg0n�G�+C�(%\�:J�8(��4�y�XX�������7}&�h��"���<��Rҳϑݐ��Ie(@w�\��T�߰V7��Lh�O�[�Bx6 q��4I�6�@i�/�� %��y�
��
(��4l��'���r*M�R)`WX�JU����
�J�|����;[�jxT:���B*���||*���
�������yT�ihj�a�R�-!�����0�z(��w�loi��BT�!'
S)lW�6_oOW�vK�\`af2s���) %M

ux444��(�f���/�Zdcg���u�7ޛ���ڳ/��ј��Q�~8��
+�
N�K�i��\q\b�Ot0)��$�
w.�L��q�8w3��_����HM<

	A
��}
蟇�G�8
%3S�h(a�@�&`i����,�J�N.
�}�J��@�������:�S���"�A�7.�_�P�k��ۘI�@$�������~�74HeLh0.=f���%�Jj�KCs{�2��$�2�&���B|���3�i����P7b(�Q���(���q����QcƎ�b���j�ړ	�, K6�X����OHNςa,UV�5@�����撜0{����3�E�-#?�^�� ��|���ॴ����<����u�l��#xP��J}CI�4�T��1TB&x��
�J?���
�
�
���ǔ��J�ׯ\*8��Pi��
�*i�}\*�i
+���[�J���/])�䨄0�s�K|
o��!Ɣ&۱��T^Z\TJ����
��]����`��4�d�����Iښ�jjj�𣮡	M�;
�Ҙ`i���Jg����7A����
?t�8�^rZ�ټ�
E%8U�\�s�~7)1�+y.��>��ÅK
Il�+a�S̤�{]�� e�~d(](���>u����8h��>����V;:����mjd��:m|�j���

�A����;��{�l�.(�@䱸D%�)���6�R�C6!��w��7�� �A�
"+Tŭ�ĤF R]mmMM5~jjj�N�LL
�.qU��K��ܞ2��3��u��L5�u[#�(+-Aw�����=�v��J�(�r����)�_8&.�\�Ò:`i*’��|+��5,��� Kqgp���]+��B�^�����O��z�hu�χ����όegx(h�����l�
|p��V_�������tu�ѹ���G��Bi��E�	�|*�rq�T���O"T*�0&�PH%^��w�)������[
-���
+B���'�
�Trsr�SIe�ǣ�
�
��(�
=q&�P���^�ʍG�J����,�G�����ζfi�Q)/;-1�xTxh�?��
.@��V��i�%U'�GUUM�Υ�Ʀ)K륶�W:�|�	����;���(��Ԍ����K�*<��\"��r���.�dK�ʆ<[\�����b��ed�L�["C)'#5	��Xԡ{wb��f���*;%�J��T����3e��
�Y��,���q��T�s�0P)5+�|��2	�)�����%D����
+miR���k�L$�TWI$����K"��2�`1�`�D�q��GZ�|.)�ʾns������	!�C��]Z%����\<nO�G��n(yy(B	��!��P�3yXX�
aIU]s���3�LY,ѵ�fX:w:)53�])
+P�T����K��p�_V7���yxǷ�Wr6�Mm�	)
gi���(��PZd9�Bi2{�x��c�P���P����Q��f9�Ҏ��pD%d�ť�J�����b�O*���F��!��J�J.���T�H�%̣���J_�ؖPi{`�>L��sK�c*q�fJ�5�I�
�[v:�D(}�vG[SC���j�y�RB����Р
[}��]
�1�e4C�IZ�J**&���LTU�GX204"XZ���X�6�n�
�3$t?
+��Ӊ)�t.��\ۓʚ��uɗi1��D�4�]�<Z�ZE0y&A�P��6�I� e��ء��wpXH��/Ӡ��3
�Ф*�����q�qT�DT4�BT@P at VAvYd�D6Y�]A膦�YD�ɘh�b�I*fq�d��}�{�v�ne�q�o��s��>���������
+n���=����}�0
oz6� ���V�Ygem�����
T�-*C*5�ʺ�YO��<q{��P�|X�9(��&]�a ���%���`N�\�Սd0�`Rp����G|.=�ȥ��{���mF>�x��JP���h�H����q�������P��
�v��3�Q����{3gi��o�>�Rrz֑|H;q�L��K���K�ju�}�����hȌ�g�����6p��8%!��)�;3P��Y(�=�>�Qi�Z�J`�H���cǑJ`����o��-̅�}�yɗ"����4�y����e�T�T�,)�A*��0TZ��G���)��㑣��u
�|�*� [...]
T��fK��Kj.�;��&S�P���
�u�Z��./��NK�������
T�Z�f�����b
m,J`�L<@�٤+u�-54^f�j�ņ�[�`�<�|�B#��Sҳr��W�����j�螠����J�4�I}��1�U@$!�L"�'d2�7pnP?�7�Y]MeY1\F����Ȱ�@_�����[0i�PqFK�Pb��1 �i}#��-� !;ܽ���cR3�JUug�O��ƭی��])!j>��B�[~�]����{I�
�v���
���]hB0��`�\�
U�(<��5

�^jR�׼%�M��G�>�����j��u+aD�����(�ۤ�ب0*�J��Ci�
+�&2GKSxXb��Œ#`ɋ`)6!9=TR^U{����x�07�FU
@
�Ԃ��3��פq�I�����(l`l�l@����q��L���=\Y(�(-(�%�>�'��'N�APP	�G%��J��H���4�R9�`s����
+c�������`��ظ1i{LJxl��������	T�p�����
T�庍P�̄G�i�J�xT2YA���uP)*.�PNaIE홋�b���xd0ͮGnh���
�� EDJ��8�Q��T����(7+51&"������v�`��d!|sf�~K�L�,.�[bhD�D2����?($b�����ù��P�0U0��d�>:��r���LB2�����W
�.!��ә��$��	�JM�P:V�
�
������z�%$m�)T�>B	G)"�\4�鹰K��FˀJ��m
v�y��E'�d
9ZZu��E��x�u�S���5��&x|e�ػ|��t�;Im����X,���I�	�`0�\�E��!r�V��K��ݞ�2�`�}��3o�jd}����
�
�-zD #�_mU
��JP�9S�ܡX�bi2b��X� ,�E��'A��P�jO�9_����
0��E��u�ǜ�=�����

�QF�Ŭ�q���U�
�p���J��PZ�
�
Dy�
�{+(�Ri��JzK	�6� ���#bS��ʫ�[e�^fܽ7J[��^���^�Pb�?H	?��M�ζ�K�O�T
N*��*�Y*�+�4�CSi��J���J�v@�=��@���%5�/\j�vv�
#��L���s5�4��
��_���.]<SWUz4735!&<���}���fK
�FK�t��C�fAQ��
�3�>Ƕ�H-[�r�Z̔�����no����1T��G�JxsI�!���\�%��1�`�IM��=_J���H|$�j�X��I7Y&a��s�.��T�w$;#s
����;
�{�ŚUf�ƆK��h3C	�4�
梁��/M��IB��<}�J�)�)�'N_ O���
���&��-���?�xF�,���}N`�� &I�$��&���H����"�0u�\��B��G�J���%N���W0�[S�y:U$�T�����c�J�C�����|��DQ����L7n�(�P���JPb��(<v.!�~I�o�4�Xڴ�����' 8,2tŮ��H�^��s�s ��	�����X�QҸgJL"
݇o��rQ8L��
��;9�ma��!�Ҭ�3>��;
TJ~�T��+�t�~�a���_pxLBjV�Ѳ�:b����mp��ma6tO�
�M�󌄍S@��G��a�AGksù�5Ǐ�g�'
�*y� ��,�t�9*M��T��QI[�P��
+���T�<����_|���y�
]�W�!��L�둹�}��a��#G��A�
Ϝ�,-<��

�����f��Zs�K�O�3dҧx LP�(�)}�/M K��-�۝�vy��EF�%��g���U���'nk�D�$�bJ��%�h	���.e4�k���G$��wE�M
����wH[[�.)��_zJb
�,��{�����
j7B	��G��9�$r��=Cs��ց�21[�v�ƭ�N;w��
���SP\Q��҆�r
<�/�)<q{���R��1�-�
�/Q�
>��U��,j��P_�����K��&&
&�n��
���KOx\R�Z��K���^�oF�I�
�!��P��J�Q�̬["9Y�f0nC��G8a_���X�)�P�@��>�D��E�D�C	KN��>A����(vE��I�D-��d.
�Z�0�9 m�Nǟ��
���2���=bm������@5��ԃq�`�>x� %K%c��<(MQ����$�Js�#�LW����|��c�S2s
K�	v��6��O[�r	^���>�

K��2IS�ٓ��Ey�ic#��{{�8��̗*}�Q���B��&qT��P��
�d����
{0=;�Xy��sd<^
��
�%�4U��OR�<a?
�R��d*��]�����x����0�Pr��� _O7'{�M�J�
,�G�4����t--(L��Ys��u��c��Yn���߶c'��PH��	Ii��s
sI�"��H�	��-�)�b0q`Ҕ.��25�{ſ�B$�H��$�m�$���I���m��FLJE0��%%
���k��v{[�?���M�
�,�]� �?�0�\4�3�fK
�
���o���v�]>�!Q�'�L����8<�t��i�U�&�Q	��H��*� ��� �l����� �,�)�p/r��e_D at DQ�h�j��K;&�%.Ik��C�����ƌ=3~a�����{��{oV^1�~�
��^�q�.7"*���N�|�-{O�{>�,����z��:�[U-��Jr��[T��S���	�K����߼
\z(���'c��q-�%Ϙw'��gb[g.!�u�(uw�����T��Hd��I��6(���}��U�m~�
J�(�~&����`��r��f'Ww/� LPB2�]n~Q)H���^w�8���y>>�D\$@2�1��}�/����43$21���5QQ�l�m�@b�"(J��3u�D��_
J*M�4�P������o`XtBJzvAqy�\����?t
+3�e	Հ3r
����3nw�'M	�"�J�ՠ���hmeianFjRlD�����&K��R����O*Ay*,*Y�lrv����MJ��-<�Q	�q`���,�F�
�4��q
Z�T�����*]�x�wgF��;*d�e�yY���v�x�:n��051Z���������1}�������%�KstK
C�V��Ykaek�@\/ (,2&>1%m_Vn~a)�K��>н��1W�Ę\3.=��W>n�j�I�.�^��h�I���|���a�=֓�It�
�r�v�z�R>��݉�1�a�3�m[]
�m�1h���-1X�t�G�����C�4,e�� V�Yge�T
+��
�R�� �rl<��EZ��	y<vBȓ���J�#���-(]ώ�¢�����HjjT(�Q466���;�z�0
�`��s�.��#1�����x�
+�_���&�2!0���s�|QR�K;T|�@v�ޔ����� ���#��>{�ޖ

,�j�4���P�>�T��MN[�=} A;c@��3s�
+K @����D�N� x�;���d�Z�����c���
pL�
U���
Ȏ�
�
$3���7(��I��0�%1�&�T�
R���
1s�v�
>;¢v�	��	64�C�FF�a�S�-�5��p�M�?ai��
ەK����t��G*J��KM����ts���4�%l��P�}�J���&qTz�Pi!P���������/8"&15#�`)��&Ug��
�t	q�y�u ��$P���
F铃}�
��U
.:�or��Ѐ�۶8�Y�35FL��#@(��L�`�
s�l]=�y
@�
�S,�lD���������'�%U{������
\��&��xI��rS�
�eKB���ɐ�c�t_�$�1�n��`~�zt�RR� f	�Q����3Wg��6Vkט��[�x�п�X!��c��
:��:m�	1������
��F=�����<���) nK(*��S��	�5\J
2��=M�
+E�0�Y٨8Z/��duuu2�\^�AѤ0aaq��/_�v�ƭ��4x���|*r��Z
^�*_xq2��&ěQ�$��kW�j<#.J�n���s�P$�"B��R��+[��Bi�J�j��[�0.�K!sKk�M�[� AA����I){3�
,>\Q]+W(U�.
����Ys ����#��+e�U/ȀPPib���m �RW�J	q�C�D�l n
�ߔfP(���'�s��ԯE��!������̡	��	ƃ	�
�"� 2w��d
�B,���^��p�&�`� mdD��&K���ѓC���-
+YMyqAv�����@_ϭ��,�LV ���#�fpT��f�4��ү�J��JF&f�
�z�ED'�ٗ]P山������
0%ږp
d ߌ7��Q���|���ҽ��M����
+s3Ӓ�"C��]6�Y��1^a����Ū�P�6m*
X��1?��	X�L.72^m�n=�
����oGp8�^RJZ֥����֎��cC���.a�
�d�
+��x����%L=a/>¯�h�lq�RC�Sq�`5�$L�ID�:�TJ����
�â�Eigx�?o�-N��6�_gF7��
����Ξ5��3
2�����.���6_o�����?8"�xJI�y�������R��Î�ϋ
+� 
k9�MЯ��_���aO×��BMj����
���&��Hm�L^`jnim�T�ҕ����q��K�`�����ë�ʗ��1.OX���9��O�{c�>J�m����<����]�xg��:������9����x,��
K������
]�<���DD�%�Nۗ�[PTʼ�ե��u�n�sI(Lڳ�Z��HT�I��p���H�RU���f�`p�
����%
�J�T�DT���4�PI��3GLp��θ���A7hTu���-|���]n{�=��C6����ōN��u�����ڔ
uUeEyY{SvE����pu�hma
+Kx1PI���Qi›���J:H%]}\BFƦ�
]=|ãv��g��U�ʶn�i(Kt	��8M�9n ��?�P�v�R����Q^SQR���������v���U�q ������B�T0y*��-2X��h�oM���
��n��	@ًK�-�Ku�
+eK�j`�-1�%���¤&q��h'l��������� $a����b�-b�
L������A���\Q�
E	�;4(�Nj.8�?���F4�n�҇"�OE,�a���1!+W��������
���_\^-S4�w<�e	ōa����{\F�}q�[������ʧ&�j�TWUV��������ʪ��: S�R�%\��K_���*��x?ƪ|�^���mBs3>������[���X
��A}=,(��k�Pn�ݨ��tYhB�q�ai"��/)�>�d@�da	rيb
�����?'����j�uiD��K���4��1����q��x�עq<��l���ʲ�����`	�Q�!hp0X�ٔ(�&�h(	Tz�Qi
+R��9z�,Z�
2&����
��'#��Lт�>M���뼃��M
ɣt���5�z6��G��{;T�
؟�
�34�g�����:S���^fAU�g���t2FQ�BD	
+�/� �� (�"��.�"����
+(�a9,�專 (���c��E�I&3�Nc;�i{�N����~��
�N��ґ��}���~��9PI�����'�J��TZ�T�*�[or������s4�c�L^Q]�����?82���WO�C���^�-�䇹�%Bi������]��k+K
s3�S��
�
+;���N����9�G�
VB[j�G\�M
2ebfimk��H�ڳ�/0$<e��3�s	t�r542v_�%J������&1]"����V��.Y,Z|�"�#���[�I� a�m"���ݺ;�1dPoҡ1��
	�Âssqrt������[��Z�Θ?d�
1�������V'��޾�����)i�)5
��:{��F��XqC,�$d�{��	����� ���᷌�
^;�IM
�u�5�
+E~���Ze=��
S�T%ri����h�fu�9�r֛����.�gi1Jm�ߪ�g�4�$��Q���b5�_���
�q��-x�=׍���.
Jsa	/x
D������ $"*�HB�Դ
Y�y��2�:6��

Z�
��:!<��- at -;?�i��Dg�/E�N�9&��LP`�yho%('����z*1Ab҃������@��
��!�V���,1s`��B��3�kY�GY
�8�j�I5\ 41�&���	�\�Q��Kx�n_��֦:EYqޥ
g���E���x���676\���T�⩴�cSi1O%-��GCcsk[�
�>~���GN$��p9��\Qw��0=����+�=��y��@��
>����g_ɦR/R��cNFZJb|ldh���nW���6Vf��t�q*ii-���̥�k S��,�m����]�=�}��
<{�X�0��e����������[w�P�)X<�����ăi&�4��I5c�|Ÿ��J�0[�p	��#��I�`Y���0	2 [...]
���t�lk&)kkU�W�����RQ	h���o�*�Ҙȥ)�K�:�
U9�E���ߙ���&��N�u	���
1]�y�
%�Ɯ��i�ף�ӝ�G at 7ڊ�(@iɼPZ �l�l�1���;v")����˹2�Z6������p�t���ג����i6����̕�95��k�I� 0#RP`\�Υ$�8�6"�v�
�҇R�3��6Pi���f�3�0�s��
0s�����
?>�7<����M���NB7T�/A	��v�]k�i�u�LR��CaA��z�9;��b	���� ����TZ�T����G5�������c��$���e���-�iKPB�ƌ�t
<�4
��P�Y�0HC(��t��SZ�(/Χ�x4�`H�>�]�۷��X"��8+\���>*M�K�,S�%S
+p=���n��� {�Q1q�\ʕ����a�:�����\z�j��1!Z��$�KM|¤��������I�H$	�zC�4!a���T�-͍�EE�ۥ
�P:���k��l�&+
3�
�5�P"&IO�������r���vw/���#��S.��U�5��w�����ư��ιBa��>�X������k������JYi�\^��\^RZV^Q	`R645�\�42�K��o�
~֪\�Mj�=�M�!IҌ(
��K<@]�K�Jy�n���Q$؝��<�u#�����$���|!X2021��,9B�H��F� �>�~1
����R�-��t����I
���fu�w��?35^�q�'�/���m���r1����񐖰�@�
H^#�}�8*�͈TZT�b�S
�
3�h0A����,s� �O�C註�c�B�T>�
���۷7P���cCwou߼~���B^����r�XlT��=
;�i��2X�TZ�Qi�ǥ�"�JK�J���]�ohdfe�y��N~<��gf�TT74_�	cih
J��%F��;���{v T�|*��t�72���n��*+��x&����`/w��v-M�
 ��V�>c�R�K+V��L��742%�sptڱs��
��`�K	4�.fe����(1W�{*\"㛚
˖ &U2I�$
��|���$$K��X�q�Ɯ�6=E�7�I0.@�0d��˙���P����k'
ʟ��)�h�6J�$v�KK�}8_}H��&�m;�<����KHJM��),��ihn뀱D�Xz񒃁����A���&�0�^�˚�
�~K]uUEyiIqQa�L���/���"�j`01.��B�.�A\���իR�3|{��Y�3��֧�};F���yC��B�F\��q1Q(tg4nm�y�"1;��Ѐ��I��͙������
$��]@Ph�T�9�:��Kͭ�u�ã�L��}��)���V=������8��K4�Y�$Ϥ���;dl(U�
dC\RO%&
���Hm���d�&(AC"9����*�`,[����uL�7b��=}��"`$�6(���o�ށ-<z���.�
61���������-�����Fn�v��4�U�ip:�hLdH���nW�-\	�]�� ���oI�O�J+����P��8�x
���O<}�"aZ�����{{`<��W���.���@�<��a�R	�3>:t���f+R�� '3=5)!�Px��^O�
�
6Y[�n���@S	s	}�%�y����K�z6v��nwvu'كTqs)����K�{�
+E�Z
��G�b\���lk��%�I�LTf"�Āq�&�l������hA�(\B��^�f�/�!a�L"��v��eA���s�C�����
�����p��
i7?E���]�֨.z�����fG���)�'S�2�e�+
+eS덮>�{
K����p/�/>�Ipo�z��j*
&�0����BY~^nN6}9�������XLU*\ .1���M�?����R�?��ʹo�'���rypw��ԌjL�7:4���
U�-?��iݒH�pwF��T
J��L����8މ��$JQQ�l�ɾ]vpI�QDQQD1,z/p���"�""RԠ � *����cS�*nq��6�i��N�Ա���<�9�y���
��z>2��s�����6/���Kcb���	�����.!)9���^��i��R7�G�M�ޅ������ݫ��j���S�t��sV1	���`���nQ��ʍz�
(\fz*�ź
L����~<���)�4	�4���͓e���ǭLJ�n�����
�-<p��E(�%iu���&����?b�0n�$p��+����{�*
li�Um��X5H\�����D������ ;x2R�-F�q�G*�@�Jo!�&�M���A�1���5�����u��ꆦ��ΣP���/��>�p
b _�>Z?l���#��:��;��)mJo٘�6)
�cldh���,w�=�BX����$����wp�B�	���M�'�%�U���`����\
 ��9yj`P�%L���Y��2�tI���%&EL�G���0Yb�Q�� I_+�D��k���0s&u
��ֈ�m��zC�E	�ov4-8?������m8*J�$�D6^��6Oo� MD
����ٹ������P�N������h?�!����x�M�'AHz at L�>W��0Z�576����MeeF8ee��ʪ����F(L�m��Ϝ
.]��t������6�f<dR\��7���������b1�\ [...]
+PZFV6x��Xԥ��u��2.���>�\1l崿�����26���q���d #3"3	��
`Q�b\P�XZ"��
��� (�X*�	T�n0u�
G���_PhD̼���ƯZ�ݠ@g���aY:	*�	>p	b�>�������60�
���m��ف�
X��6�U��d���N�[��U\�ND%��O%��vT
A��Yy�KX��a�ּ�%ƪ�ƽ:w��%�XBN�%ݧy�=�[?K����q��9�KU	)]�+���\��H�1&B����*�S��0�m<�KT���������gY�
�J����KR�h���<d��E�H�0]<^r�(`�0)c��Y;�G�

�d��&e�	҅{M 	�E5	�~�S�0�m�1�I���Q���y�9�(�tC�b�"Bi����p!hv�IH|�./N�����/P�<eyšԌM������=��:P�ΜcXb/�.����Q<	��pW�����e�,v70	�d4��K�ї�e�U5uX�����#�z�Kx��U\���
�f�K��gVnr�cq{f��u�%#�2�'��ab��o�n~kd�Җ.(ͥ;
���r�
�܍/��ĥq�X�b	.�������b7���^�=�N�uiWcs
j]��}�X7�\bʮ
�ߥ�|������5 [...]
N�>x�W%%��
*�;:�zx�i��}�"195c3f�[��aЂ����Ж�#���=|��,c���_0k>`q5�i`܆΁
���PSQ��j����w���x��8�x���4�uQi<P��-!w(�AaT
��'�K�ڲ�������	0}�x�XB`��1�*�y��<�:�Gl l
�u\�JP�?��u��(]i,Joڐ�&�u�pM�����

+�ݔI�-Hg�	K�z*/��`Mxd
�
+�R�Y]��k;�	�.��\�����5�Deb�
�%�����I!G�%��?{f�#��L$V�(]�
�V�j�6��~�IG��4�v3P��SQB�F�#鎉
���Ђsv�a?}/J��J�E*9��zx��pOY�:%=+�
ņ���T�@����t[�+B~�&���]��,����̠/).�iw��juE�@����j,L
+.�".]�\��&;���6��f|k�+G�I�˳�=����	��B(�A���z{�����F��-��E��Q���~>
J�/
%K?
K^L�c羇Z�����F^WHu���a�^кΣ]���3J.1	�6��KGg��[K�?%"���M�q��	�L"&uc`���kj���Gq!��:76Ze��
J?a[XPi"���i��3!s�!a`�
�,[I� 2g�-�[T��,>t�=r��-�
�J,ck�3
+��;7Z W��KД�t܉K����dg����T
�S5�j K��$[�pzo��J?*M���4e��<�1�>1]RF�n�����%4
���O�1��s�
d�y ���<nI����_#��:
���TS^Z��J_��2n��!�^
��D%B�	?�9y]",a��.��i�0UP����A�2�����\���k=(�Dv}���8߽�$0Q���I�L�L$�gL���#����S,�#H�X�d$�cO�j��
`}�IG:;8�j*M}�NP�
Zo�2^��#������v4�t�K�,1os��
;=e�ڴ�����T�k�[W���͐�A at bO�2"4v��ɞc�X������b�vGaAA~~^^~~AA������h��Ĺt�WG>>�\����%
��|�_}eM3�|�>�Y�>
�����f|,6#��`~'�u}/��ƝT��$�jD_��
��Q�ut`
a�RP����
K��%{Y�Bãb�`��
+����J
���]�A�vt
=֍��du��.
[����G�������<��ԩ��l�ƍ�⑑��j�0V��
d3@�C����W
%���JoO��*9̡ͤ	.x?.>im��-��RSu}����N(}�U/���C�L#�!y��!|����
aq�i��w8p�,�=��
E��da5XΪAH��������t;5�������h	�yx�j�Ӌ>X��&e�q���fWSK[Ǒ.r�a�U��`�l
4��Vr�
�q�:�=�
�}'�:�o�]WYV�Jg�O^�b����;��rwu�ʆ1��S�%
+���L��7�^xT�
E]JM'�+�\��56���㻀_â���}%�x�8�d4I	��QƤ��q�ψF<X,Y-��8��t=bM�6�K�$�I�=�I�I�5��F}�_nNvVFZJ����erQ����zӂc�gNJ0I�.r��$���ǟ<嗋?\�����鿼��S���_�tjD�U�ij
(��
���(�	"Ⱦ�K at Tq�u$.1FK4��h:�M��L:m'i�֙L���{���.?~`lL����O�|�����+��v���5Kz�N���"�9):�Q��S���e�e���-/-.,�������������/(*.-�Da:|�ޘK�D.QHJ���d�?�EX��5�PV���&���nOK����38#�:��Kd
+�f���B	�ƌT�5
+^H���r;��P�
&�%�9�JA
v޾���C6lF]��Q�).����{�܅˭*�d_@��쏟�NV&5nü�
��U��8���I�8M2=t`�PA�NH(Q4Cr��C-^
40�Ն�!�&�>�ϠT�
DX��"h$��`w|Rjf^Q9�0�`˻誸se\L���ᑑ��Q�c��/�#�
xh�3���:�@3`>\SY������c��
�l¢��������
������ゅ�\���tlb2и�������^h�Xj��8����C
d��@F�@h
��y���y�MT�:�t�����
��
�8�1=�|�9z��Dui������=w�徨KAkC7l�

G���ͺ�
1���5��s�TE�3�R���&�M*��Ƅ��gВ���HV�+��G�� .�=�H����~��o�b!2	������`o`n�(yiEI
�^
+Md�T-�y�P��˼��b�䔐��vF�&�������&b��E�wR"#B"�I�E���|�0k�
�ؚ�
+dR~nvVfFzZZZ*�K�����E0��UT��
��Kf���$�� �3��6i�J��L���c���;��OU
T���t�
+!㺨�fk\㿊y�M�(�c���
_*�f*I�[��g�_@к�����������s�[߽���%6Gl��3���*����H�	>V5s7a�A4:�
��کg��G��E� **h��i��L/
��J3�f�ut�����6m
g͡,U��
+"�����
}�#@�'�
������!���������=R�E(5_&\�ܟ�;b��K�P
Ȅ9������T�fc;]��(�n
"���ED�!4FY��;�D&�Xz_�
A
"�y��
Y
Ƞ��D��@�Σ�ҹ3'�=T]A)�/!)�1DvG��<Q�4_e?�NMT���:0(U�u	�����KHJI���+,)��fk�\����i�ϑ��S��� .���&%0RI�5&mM��
�����ϕ��y$I�
�KD�~/"i�ӧ2�eM�u��5�ms&Ac�n$���m���EQ�E	�$
�uY�l̳�-��
�S���޳/5
eI������4��"

+�rR"�B"�h��a4�OB�޸ֆ�Gf͖A�����������^rr����

+���Ҋ�jC.��\R))��#���_������o�&M�4oϸ�i��%���+��OY��$|&g/�:�[�(�5���]μ.B	;���ˆ�ıD
+�`��m		h�����K�vD��R5�������U.����a�m���!�q/�>v�2�,�0��%sGe*
�U%�[�#�"	��be�?0��T�4y�Tl(8k�����Is;Hsʅ�O�=��E���4���޾�Gp�Ǥ�'O�Z}O�~��0
8��Z>�拿>�t��A6�����ȝ�6�Q5`���#���4��O�I*�~&�x>��R/�U�;���ӳ�K*�
=�tF���[��{)�i
<����D�-����
���IT�U������GG�qJ����Wg������)�T.	Q�=��upb�C]r["��jk�
�*-3'������b�,|�m�|���`⒝��E�b�����Hb�1��	��#F2��,=����GҰ������8����6��U&���}��-!."۾��*ӊ������d�F�
+�ɕ9e�2�U������e����
�Ġ��l��	��k�$���I���3����
��TT@������711�_�ޤ}�)L9yť�Z.ih�t�����N�U~�0�+�+�5mr�.�����d��H�8�F�o�'3	}�?S��$�5a��M���;�r+W���4Q,���
b�Wo�{xy���c���DXG�9|�X��32�4�c�<�v:4l&=�4�|�R���nm��(�,/0N�@;3��$�PM4 �#f���Xb�J�
JS̡�
�eC�j*�As.Js���Cs

�+�k�N 	.�Ɇq�������
R6�


|l~�e�������C�[g��<�
�
=TS�&�ޱeú5~+�=لQ
`�tw����$ˣ�D�%��*�c�Q�r
�*k�S,]�,	���	'�y��
�;��~9�.�LJ��J���j�./�ˢ���
FJ����� "o�t�i��f�ͱwpt�T%�_`кЍ����h�x/'����H�/��]�.��>��
m�`5$��&�/�'��L����N��0���T
��Imid�|�#	�����Fu�*Z)
�&{yx4w��b��{s{/�E�d���`?�n�j�S�d�`��9P�<�%^>+��B6n���D�Vu ���*��.��/�oU VO�"4Ÿ�n͞AE)/�2i���=�q��111���q�{�&Q0ef�Y˥�%h0Ë�4��ԗi�_[nRߧ���\������H�%�#y[d���>X�p�P���WɥI�P;�Vf���Jcb��O�&1ع�ؽ�h1�܇��������BXG�9�\:�璀T}ؠ nL����d��ұ&��]b�i�Z$��t��(
,2	�E�S�р,JC�)x�i`�X�򊚒�a�\���
�4�+f�pie��#
8sL�������>��I������
[{��==�ݤ���CY<��(�AYLU)j��M�V�.��M��<O��>��
��2M/���=DLoBL�&&�e��U����䜾"|
6t��C̃2�<z�<�S$�ā\�HM���ձ '#UiW��JoO��;�	%
+!� ��{N���*gI�s��Y��	Y�i�v�*:.����k�%(����-W���ڒ�iHU&�L�4�h����Hb�1��o��
O����k�F��G�i�-!.M]�Hz ����v�oS��c���
F"[{[!T�����
T+J�d�`mgH�Nq�\�bu�Z�[������k��*-mWop�S0��^�Hy$O�އ��8��& ��vk�Ȥ��^��Y�W�T�P�Xa�@��V
+(��$&!�
�f_�F�LT� !���B��� �������(��*�Sg�:��s�}�����Ja����x��|���(/+--�+--+�������
��
+��؞ ã0�:�6�Č�a��)|���i����iTw��՗��8`�)�`�$��
��,J%!-Jj���J����
1�^���%@l�
�\�@���K]�e��|ִmظiK�%�:�U
��鋿��i
�d�?�o�
7w3��s"��3���
0�6T?
�(�2
̙=�%�pL���)
��v�jnr��P�j�¯�
 K��
��ĶΞ���'��
�NPߵ������^�rD�$�;{Z3��E�@3X��L.*��HM����t��$5a6��F���9���ȑbB�ӈ�S�Ӊ��tyu]Ss�*1�m��
8H�%�>{`���Ё\�8���@�<�?Z�
z珄Ҧ�6T��Kj*J�*͏�5C��DvG�U%��#�#�9‰
+ao����~]���JRrZFVnAa���K�)�ֵwtnپs�>|ؘ+L�-
�Ͻ�d�%�R���TbԘ��-��)*��aY
����lI��>���F$
��)���
<�o7���3������ȝ/�%�n��ŠRT��-KT��g�'>��2u�̘y��mY��m�.�zS�wR��$��N��%�p��4֯�����L�,/+).
+�
+�B�����jQm�⦥ˆp���$m�� �����L72^���ɡ��m���n�o�ַ�
��Z��$���ŁI;�I�[66�VK��1E��8�Z#���>�	K#����	V@�u��K��R���jb
��ƛm:6A=6�Y�\f;
�6�o�J:C����?�͝I ��ׯa ��#�a�i�LuL�(�͍�\lp5���J�JX����Ns�,��K��$NӇ)���
}P
�t�r?����˗��ŋ}P�
a�=j ��PB3X�T_S	�NKN�?g�Kb�R
���
��I��
,�
*a R
G�J~4N�K*k�
iB
�%!�sH�Ew���Ё�G
�e
��{�z��x�@z�}���UeER���Aw�@�"
��y�^���?�&�QV1s��'$��ef����*�k�=.1��

+�j
`��C��U��w���[��E`�0H���Tg��~|���t��R
)�T[J��~��u��kI���F`�Q*�Aa��W�V,uL���&'Rd�7U�-J��|�s�2��@!�S�L{i���D
n��%�W�&Xڶk�r \�/�N
+ѓ�D.��$D#֮;X!�(�B�I��E�

�����,,
���WV�0
�Ҟ��P�d���Wlΰ���G����`���ۑ����#��u�%������o����뵌롂\�D%Z�4�4��� ����8��
KO��t����.��g����|0�W_{��uT=���G�x�.��:0y�1��_:?D�p���ѹ���ƨ��A��Hb?5a��
�mMq`�i�L�KZ�b(I���*j���
�<*=���׶8�e�J�[��v
~���.��t���z/D|����ܹ�T[��������K\%���pLx�1�hk������Ja��x�������������چ%-����έ;X�h��	�n
2����8�L
l�4�%��Ŧ*)�����@w
��2�t�\�T�ui�
d5m�˳����g�0�UV�:.��6o�A{�&
��k���
�}T��K�d�$
+��O�2�Y�'���TVGFY*-�-����@$�����5���&�&��m��)��4�ܘ��s�2R��� 2W�&3���9�y4|��*��h�)3f�ڲT^]�xi˫���m;v��8�_ĝ�'��q��0��̢��v�T�L
+-,�����Β���K2�ИP���r	���{6�_ҜA0}�)�9(f|�V9h�n��'�^��n9 y��ܫ�3���k;{�|�-�M��i\�zk���y}���Oz;��7()�~i��U�
vV@�Y���K��K��u�������o�s��� &��#�P�輽�'�0Մϝ@����㴠
�
�qL��Ҁ-J�lE5j	Kჿ
��?��n v�{�����Œ�M�Ж֬�#ߋ#��@v]�O at xP�i��L��ӃO��OQm]�<D��S��
�fP^�073m�T�iS�	�,>��Sɚ��b�eiAZV�5!d��7��Y/`��
��Ё
7�q��
�8rXMu'�ٱ�m
BKsS����P~�V%��s�N�
������J�͇�\OQ���̸hM{�q��b��AW��{>�ZW���Ͷ
�ڼu;
+�[��-
&�
V&d
+�vf&
+�Ġ1�23J���ET�F�#�#J˙��%���Fm�$m�zN۷t��q}���L�W&�Ii)I	��-��+JFgQ�T�%�T�ѲĜ�”�/Ϟ����WXRQ]�(XZ�ac���v�"�#��V"r���5V!ɲ(UU�5���dgf����KO������/(,.�Z.�6\کQ���X���n!�z��n��&�*ß|����}�@�Ĭ�W��9댒����,�̗,��!��(���8��������%�K�%��S�F1ש~bX��R�4֕W"45�K.���x0l� 
&ю'�/�B:���ގ=|�$7�v�
~����1	
���	yi@��TTF8�P
P
+��p�
��lYJHN��]��EuM��0�� dw�(��u
��N�?����]]����@O����h�������g��	�p&<ƚ����J�GԈ4�'���'�Sg�,%�dd�Z�bR{���
��C
������yW�L�
S]�Z�TS�ꘛ���KJ����I��2�G=��\b�
�5���4V�
d���.͂����S3ȥ"���%�-L|�0ll
V,�=l�$NvI����#���G��ЌĠ1Qe��J���TY)�����J�#�
m����
�5�$[�(0Z��L&U&!�Qc����6"����
%��>�PG�B�@�DpCN�e)��-?TZ�������ɍ�w?�
�"N~z8���#'���Ծn�j���ٜ���Ԕ��SR���<���rå�+�%{���
�u�)����!>�W�&�lҮ�=�=]�?�4!@
+�ć�
+n�+��M��
����T��&����
b�OA��쮠�!��%�D@��O��\g�#ui�ƺ"���SU��;CG��G��
�GSDy����������F|  � /�H���3���i�&�N�6�S��?��{��|ϹW$���K"����^�V�p��R]י^�G���m�ɚ���
?6�#�vJ'`�ӫ橭�G�]�d
H�~j����^���Vͤ�]�U[+�6}�i �ҀY�"9�A-o� 
� ��J�
*���ؚKHI�s�r�@p��@͝}xd�x��7q�
+�4�I�7	�21���!�
燇Ho��Xo�u�vT��o�
f�4�JL�Y/�JS�bG��(U�=������dB��C��'��
�ԣ@5�C�y�@�y��0��D�
J���9�i���8�J�aK�;���1T�g�e��%Zg��$q����἗�_��TM\����E
�z�T��4� .T&ľo��d�K�
+#:�DellA��3�d%�"a�Ѡ,H� u$�{��۷��I��&����S�ˆI[�Iy`���ULb��D?�(i��c5��%o#�ĬX��q�I�����Ⲋm��\�[���N!r�C"r��&�����"0);+3#ݟ���KK���32��s�
+
+�KۈK{m.u�����9����V�w�
�3~���V�z?Y���"ҟ��GG��vU
+���xov\��a�:��Uy]�,$J���q��an,�`�Z�h��u�.�#���3�s

+�K6WTVU\��+�
�n0��QP�T��)�+����jd�Ox�$C5"
�-
�0x�$���c���������e
�K30�_D��^W��
�鲴>���(XR����$7��I��
:7
4Ay�cc���]r>�������(���0�6�V��D��ES��(E3�ΰL8&����^>�4��)L�EF/�	�>.>��#��T����������s��##2�ib����gh��G���4�q��1=5ŢtSZu��͠"�r�%��]�(�)]%�26��l.��� ��"��T@�l���b�&�ȋ�%l��Aa��1��L��ȳ�Ϳ>%Q��DW,,�K�"��B$V����I�d�5!�
n8����fR��nٛ.J��̌�iUQ�b�+�%{����E�ʶ��"��3uv�E�B\q)�E��E|L�%"'���^�R���~�@�/�������L9�(L�%e̥��%ʒv��x����Lw���
�xG�x�WioRVi/S��{}:Mq [...]
9������;9
&.A��{d <��
��A��C�C�J��!�M��Âܬt�'ɪJ�B�ߪ�ꀒ�%[U���,<"
+q�u����k.��o��^��fO���I'��X5��d�^'+��G���4)?�����Ġ1��L޿���_$3cY�
��HYdi�"DBI�q����+�I^blFM:D�VC
+#o
d���DG���*��,J���A8s
+�%n�)��
9�%r&q�qѯ/Bą�g\�-�3]�$��Q6/'
Y����$'%%�KJJNI0a�n.�B%h�
�9�Sӭ�_ܡ$f(��^����^�����8L��~��}EY]
+�5W��h��~`�fRs��kSqݰ�E�v���f�w�Qh,�H�
����
ť�.Eq]�~T��|r�K��K��8��x԰�ԴQ��l��y;��Ԏ�l���H��5��0��i���ǵ���
U�gQzKE8C-:
���4%�J��݀��R��;pa��T���$����S�Lg �޳0��z�A����Al0�ӝ
�'[�k�p��(��
�
~ib�\��*��f*#x�T�]�:0�˒eB�EԖ�v�U�?v��H
2���y��h
�2�ft����JT
�b׼�2HU
+���P�� �.AV*8�x�K�ĥ�[*�v쬩�
��U� 0��X\�8�1��hR#��XcT�Ʀ�?���G�AST%4b
ieY@�Ri�3.I��ڂ$26+�`xtM;wp���S�LR�F"
_��&�[��]�B�#��s��7�����KX�����
ɍ����~j��N�ϖȩ�v�$���&�z��Ą�����A&O*-4�����|��t� e#e'G�'0�1ݸ9u�B�݀�qߵI^�?e���>v���	�oTG�{�
��Tp�~"i�*��9��|�Vb�>ш�����/%�S��S@��T]Z���5�X>h�y�D=��6�X"��`��i�2	��I��퐎)
�jd�J5v��c
:i�c�d�$�I������ol&�q�`��(EM�=s�/ #s!�Ht�9�0��.,Q0կ��Q]�0��d�m���ӧ����'����~�����:M�
��<q�h�N��u5;w��J��	G��L����
L�	Ӫ=zK��hd�\.��� [...]
+*�ŝ鶉&
���Hb
+OP댔����DŪ"�Ͼ���
��ґ@$)Ic#jC^�$](��`m�$(�diL��l	1�(JN�#��$�y�]��b~��]n
_Fa��|k�%��fD�E<� �I�Et�E�j�hҒa����J&$��[�vmll�ڵqq���' L^&�ʂBťj,T�I���=}6�&�^���J�&e���?���0a���
/o��:��Up�3
mVW��Z�$�D0Ɉ�����ݾ��Œ��y�$׽�u)ui�*;���Kȩ�\N�D<6R �iTi�E����[�t
���S5�j�#��܍GDBpވq,��u5�T�+����B\�4��4m��$r�C��v7 ͽ
a����`�x�^R]�a2b��D�ɓmm�_�)~��'į���m�v�h
Z�譎9]�b��^�&
`�*����<f��x>���R�
+�
�JT<bPj�y ��<��
�8�����p�lU��b%U
W.W�^HAт�l�*,�U�K���#��c��X������
+�1�MN0�ɆG.�Reb2�3ݜ2�D���Xcp5�tF���/��ǿ��FD#+��i⒔�s��5�W���}{�&��J���$v7�b-2+��PrL�j�%+��������A��K4=�Et��|�E�I4�D���{�?�x�a��XV�b�9�ű�d��%�H�A$�9!Z�*U�خ�X��vv�����0����u�������7	6�����Wg�����>ץ?
�ůڹ}�c�T����������zY
���=&ǥ��RS��/ef�?q���?x�3����M�*�2uw��S
��V�'Y�����\K��
�6m������.δ�����v�rL�2��r'�l�.G��a�z��T��~�Î�d�y�
�4C:?�K'����7��O��]����+��hTj��
ޖ�$a�5Ԍ4���i`�l8Ņ-
+��i�:uzV_�����0�w�ԩ���ӧA(��§����K��#"�~՛t�Frz��Z�RUyiQ��؄�f�LƏw
�	e'M�m�8-.tHl��d
��<&����1 ����IԯH;(Iu��Jgg͙=+
���'�uI��J�^ye�ϥm�%���01�r`���]geB�&�`f_?��D���H'j
"�ʨ��Pj�'�BR���'��
+K�����bGB޻�%K��+�ڮ%����k�{�n6&�ܐ��1q���Q���i9�13
+n9��NťU5+�%�M�@g�w�_�]D�=��P��"Q��L"]a�S� ���,����(//�+/� ��	&&�Khp�z�
/`Bc�u�B|2f�M�NnRW=�H����� M���#����i�P$��I����YB�z1�D����/�)>������\���R�u�5+V�Y�q���ԉGR �M9 d� �IG�*�H=�ܽ�K�����"݋D#Y�㬠j��oK�8i��c���s�7#��0���U�� YP[�d�C�!��>:1�78844
��H}�fxR

�AnG�wv�h+�X�I�d� /7'2a�EQU����V��VL�	�@>ڸ�v�p�<���p����y
��<ȣ���}�G�?�-ёlGs(-��,+)�},$���4-�*�S�\ܣ���B.6��L�ؗ.�2!d�L�}&/E�LF:OT��H�e<��j
+fFY	� ,:��������޹Mqݼ��U���
�ϝ����դ�IP��I1��n�=&�_��˒܊�*�K�E�kj����E��E�I
�D�S"}�H�JġV�|CUU%�TZRRR\\�?KK�@�*4���i��4l�4�
��Q�c���&u���!m}���dƈ�ݒ���}zɥ���[�_�1)���8f^9{HŒ���.�,ʵXWpi�v��L<:�L�΍��
hi���oǖ�
<�o�2v	qA�3�H������?��q*��ILE�M�6��]�
Os,Kta��(�Қû[�v�e58�F#��`�}}�^��c Ԙ���|��Al 䆖$z�Ph#�7iJq3PN4��O�dY�BF�LH���讐
�
+R�@z8�c��
���<ze
h�D�$
+�ׯ(��Xu����J�SS�Ҵd]�h��ω�d��Z�&��'��>�����3�#hz�ؤp�QcT�=��2�|�=5E3#�DW���/bj�{ו�,I��"j��(/56�'$���Da�Lr�6QQ��Sr
+/B˒������7�n��&.��]Doo������H�HD|#tl1"�������� �LU\(�r�p�.N��~�0]��+W�3b���G�I�e��O]�7O#ct�����4M
�W�1�$���"��f�Xcj^Yw���@@a�3�����u�OR��%?pؖ �s��kJ��2����<)��j��₹S5��Hn�t�jh�0��gҸi`�i`�\��Ҵ�,9f9P,���С:�	y���ƒ򺺺�'J^o��C~}���
��	 An4I
�5�q����	�{WMX�0�J��J^Yz{F҄�-�>�����
+�H��6��a7���yt�� ��5x�đ�֦T��JC�s"JUi��ʔU�+�=p� �Ҫ(^����j�`��i�;s�ϑI���$��Db��D�Ag�(�ēO!)z���fB#�
+�rʂ�H7o\�fDҒ4zrD}�H��5�wS`bmT�
L7&!�-$�$����R��&e�
���%�u4��Kr-)�zv�Et�L"za�-'���������&
�rX%�4��6/g(�.\��3`�O��]>�v��%���O��^aV��><miH�
n���Rܽ��.J�'�R����΋u�O)��<�KL��1�v.IH�;e�n�6�@3Ϣ���5���
��dG���I��
p�g�k�A���'����kq���g�
GX*d[�f���N����Px�mm��S�!y��O���ڡ5�/�Fދk�P̃׬rMI�47&<+a¿
�RM�mi�\�(�WH���j�̣c�y
��qP��$�H,�<�?
�H���U�-�J���.I�3.�KrɔE�-��I�60!b
��Fc2��nP_�&S��
�� 2 
+:�о�ւ'��;j�)UEYAW�8�Z� ��˗�H,I#C���5�I46ї�n�NS_��b����G��4բފ�������K����#Ht�[ߘ�����]D�^���Hڵ�'��JaRA~>~X^�b<�c	�D0��B�ڸd^�
���4 at 0�~x�����b���a�&�2mw�^����s@�~{M���~�;y"N��hL��,QT�/q}A�֘��W��T,y�n�_��|��`��
��@�0�dڬL� ��;S:��.��s��2
pd).V��8)<���t���$
ե��s�+J�JS�2]���,ҖJ�%��n�#�v�!�MMP^ss
��wP^k��C~} 
Zkj�'r�C�}��e[�H��BI�Mx�����	��cj`Bӣ��&�m	�q���
���H25�Ӂ�<&��c<����¤�ǐ6(Yu̠t�&ǮK�����!��Ƹ�0�� &8YO�d�Q�3��I��Ĩ1�
��Qi��ȳ���)�a����
��	�D[��.>����/�I

niE���cR��$�D��ŔDYBp�v��@�ċX�n�K*�E��?�BR.�EB�n")�]kV{��HZ�87w�����$S>J��j�J�
��$���I?f|
Č;��U��Q��n�iŒD:�Y���Wp=g��
3�X��u����Wt��~$��
���#\*��d�Ć-�ԁIb +r ��H��t�9�
�k�yshs��!.���q ?��i1N�5��w�Iii 9��|�
�r ��͎�A�Otα�l#�v�L
�������5�>�
+�R�߻w
D�ޘ�Tx�!����L�M�uS�ai�gB�
��B�ky�;l {l �n ��c�̃�<���Cd�
(��Tǐ��
CMb)�K�-�\*�m
�҂�Ց����-p�����=��}J&��Yq3���)��W�il
:���J�O>�w��]�Jd]AX�,=�
M-"��Չ�}��!i��\�6N���ԇ��¤�I&�Q�2��w��Ҙ��x���ͻ�z��q"�H�I!�E�Dbˮ(�4K&�-�qo!יG��B˸P�V���{$����%c��x/ӯ*�+��šFD�
q�Q��

+^DAA���NE��Y\q���&i��CV�����m���<��^��^x>�
�~�������46�V����O�W
�L��U
Ó�>�$:p��dd[ʡ���L����PZQuh���?x.5q���&Ƀ�;v�{���PUY(���������2���GSl�_i��3��[|^��(��F���{\�
+�����$ާ(�@E�
2���
��ۥ~m�t
�Jq
+�q�Xڦ]PMG.1�GO��wb�ɩ�
�Ob?��J?���jS����H�
+#ؓ�lP�/�ŧR
B
K�i��4Q��
+�`� � ��1M= � ��1�`KBg�
{J�ܐ�Sii�Jme�*�9�1FkY��3p�`��n���VN&�
d������Mp�Z
xB�I���~��
+���%�~C����W4�E����wR��H8�fo\�z�I�>��J��Ⱞm%LJ�_�C)�R8�X܈%+*���t�N7b\7b�6�	!<:g$�Ez���$CRggGGG{�����S�0q�{�K
h���u�i�
���ݼf�
5�}6I�Rg
�����sm�G�H
F!��?p�M�d<��D¤-¤����|ju����Kb��M2��%;N�	*�� ���
9�@&������
��1�sӘ�&��HJ
q�.r
j��U�
�H�}jg�
�=�ťj��9Q���b,�J�\K

�.��%�Eۍ��!��'&�Ob?{����� |�ɣӰۈ�M"��}��(�e��RSc�2z���ŠҲ(�D�F�
�%�4�G��C����^�1N=jd�@�ψ,�+�k��2(ŧcz*���\Z�s����d���Y�8�zN Lӗ`�+�x2)�
I͎�d�)��'I5�
F��5<�>���
+�b���`,ϣ���H�
�ukV����f��K��q ɷ��(}�6����y&���D��cI��Òkn��~#�⍨��JD �E�R��ϱ�@jkkkmm��	�
L2�]ƥCG��=`�����n��0�f�Hj�?�Ir�:N��8�t|?GmB�[
��:g�\K�aI��(npƤ͝�[�'�C��}��@��4F\�\��S6��r�J
00�w�d"��սȬ�t��w�����J�O�k��᧭�UNi�ێgR|��@Â
Ja���@��]�1L.ɂ���S�ʨ���O��l��'�h���@$�"ؕ[d0�G�҆��A�e(գBK��jxYBs���B��y9	���zD���޺�K������O���|U�%�Q�p�WkY��T0!�`.�2�>�I��>�&E�&��c�Ě�L��
^K
�&��S��*ƙ�
+�2g 1�H$�{<�.M�j�dH�g�D�D����v̤�n5
JIok�C
+X�F���N�y6�LM9���Tl#����R���� m�ׂl6Lz0�@]Ѱ?ʞq��t���x%Ӝ�Je���$m�~x2�l|o,_���41�[�����3���0�>���II]_
7���&Q�(���KI�k�\�J �f
��ށ���Lr3�V[�G�������n�
�b�隧t�=I�� ��8`	
߽���b��q��P�cWIa;�%5
���7\'�%����&���S�*��>���F'O�m�L`	:����
)B	z�\?
�zPkH,m���"�{����D&���1�z�z�` �R,�Pj�I)]%L�V��s�si]�%:K�@��Y=G�1�eR��] j�]��g
&����&.���~F���O�;���@G4�F���&o$I���8��ΟwHB�	�si�(}�6��TE��X
+�ͰT܈
���t#��()�"!����/k��^KK
��
t��ɸß�8�x0͠f����,�(_XX�N&i���?d�{��Sw�"go����I�d���2���ە
x(�P�?�>����c.�@�

�F
 �Lm9��L�k���xF��쪻�n�?�G5N� ��6$��V�Ʊ
؁�0	jYX�@m�d��`�ڀ%3��74�z�;�	֓74����q��� y$�	|��Q-~�hoM�.�E]U�q�xyڍ�k9�
܍�M�>
+=L������
=Ѓ�g7%B��Wƈ�e�Rl���}�K[c�Y�`��?�`���M���L3;��_j08�{�&��$�~����s��^�S��g���ytG��PS"M_��$퐄�>
�IqtWaR��E�'2�����zm���t#���
R�F����6�Y�[-�;�a��f�}�� ���
4
��1�Q����KZ�Y3�Mk��y:I�2~�9���������sÛ�����ܐ���
+L����*M��P�ZRu��k�
+�ngTp�j
 �Κw.��L�z4�<
�y�	�&z^� ��}.�
��F"}})�22�j�￰L��-f(N ��!��
Ē��h;�
�$֓4>B���>�ߓ���l`���`0I3�AK��?�*��:�
+R��onq���|�(�V=��
�>?GIQ�'��tK�(]�Ғ�s�3V�%�|���xK�$�(C�S2I�������g
4qؓ��L&��I���O�]>KE8�`+�J���
+@����撾Gw�F�$
����I�L�tI��a!X�����ҹ�
 ���	�ƍ��6���f���a(�����55�H��x�]�?E
�䈀i�����S(�:�d����(����=����|0�ᱫˁ;�d�x���2�=gR���p�X柆?|g����@��&� Q[N&���]b���:�<�u�%.�
�A�C�����þ�
A�<ɚ���?��DT*b��i
W�O
L�;Y,�
�^������˯��{�#��m�1�ܺqC��+bA�J
�]=�ި�V�K�L�!�	l�)�QU�Xr���ẋ��5� %$,���G��=��".�)�Z��v�~�Q^LR�e�}p��j�L@
�I�����1%>�=�גǿ�D�'��fb���
�����DBۻ�4&D��P��$T������
�1Ií�n�&�U�C搸��� ۻ
����8R�}��E�p�$@Z��hR0�
t�C�gp� ��3YͰ�dZ� m�6K7����Zh��Σ�ہ;�%�g�L�]bM���P�X�?y�+pIW���Am
+&U'��)���M�<�VxAw���~��
�8�R����u�L���X��
��^�SXM�$wy�`R��x�C���@�
�u�?
1�#�Y���G�H+�.��K
R����h�ޢ�6R�� ^��
����	�؞x="(��JŹ&u����KY�ޥ��B��\e���	�l
M32���H�;wa2q���!��?��,��h+�+��e�s$RM�����z�Jꎏ�,�ٷkfR���b�dX
+�
�m���
r$q�߈�"
Lm�GxJ�������q���a`���O2]�*�`���$m��=p��o6䢟�O�zEf74�&�>���

]bu��W9o�
e�q�Y����Ŗ�- `:f�����:��Eց�E����t��Q��H<�"�Q��v�YQ��L�.�Ej��!�s,�*�y�V&I,�I�$���
��`������5�v�*��ZZ���%�RJ
L�"�ܵ���9顢��P.ȁ)�-��e�]eu��4��WBI�`bI�THËA-�JWYm��Z~�j��/�{f���/���t#�qy���}ͮ�H�#�<�N/]J^Z/e�5���$&��O�c}3	^�&Z 
�Fz"?f�3"����?�C��7��\D2W�ʅ�-���#z$����gFI���Rs���1Sn��gh�\K�݈��7��D�����HI�t��h�˴fPS��Um�?�
^���yZ3�*�(�qY�Ib��`za|<�0�_B-��:���m"6������m� [...]
�ml$\ȼ�3)M�J^Ky
q
��$��
ȝ�@L
ȃ�<�xB��歔��T��˺_o�b��b�w��t3=�f��/����A(
�h�k��g��Pe��d	XD�����J�U���������;iX�	�ō���Ԍ�7�c��n�'��}1�fםm�$�"��_L�E�dy��y�>��>U�K��ɮ\�v�i������~M���n�:��
}���VI�?���^�I
����A�ZWx�6� S`��~�L!����7���5�7�����)�O�
+3����������dŸ�h	�i
K�yȜ�
ࡋ��?�Hه����7���\��Y�1ӣ%~.�R1�@�M ����P
tO�I[)�<��W�\���V���
$3
95q����~x�N
�(
�Έ4�_�ȿ��oނ�UTg�+���hY����Օ�r�I]zB�"!qs�7�x#�Nx#�Jd7���v+i����	bZ�������)ì��[���-��s6��Q/��H�����e��[i�I�]�+k]����%ঈ�Nb��א�T�ΟEj;v8,q>�,�M�L���
r���p���5q[W!r1�)��
e
?�1�]G��>X���M��E�4�0��K)�Q��R��G
�1�a��@�LJ��()9)./e �]�ɕ��b����d᪛������N�� �ڏ�O�Z~������V��(��J��F*��IR܋'u���^���%s#xW�nć#ވ���_�:��4/'���hhW�i�a�Y>?�]�{�L�
O�G~T�L�E�N���-o�'M�K~>s-/��v
:QM.o^�l��g��;�����2j(wߵ�dr'�u sv��-lw�]��w�@
�1������O�lD۶��[Һ
���ʣ�i�o�Cߓ<�
+dg����`%�}�#Z�R#��^Z���n u1�2c5_X(4Fv"=�e��4����5!��2{%6XB��NKFrtE��[�?��qRf�Y�,/�7bc7"w��1�xI����
��rȚAnzY���2ニ���G{�7qzG_x�fKi�};i'u�s��%vCL��SS7:.�<w��{�t�璚�{W�
��ɜ4��v�q�+Ž�
�[N�>�����l�����DI��>�<�\J�����
bW�H%��c
������nIϷiyi�x�Nzð�t	^h3��n
+���kB�d������Xs?
D�S��+�ً���)
+�I�b����2�mGX��U�4�
}�Q\	#xkCk�XHFŽ�fZ(��
ޚɮ<ɗ~�<�Wqx�w�����L�R�
��v�D��
|
+zV�r�� IۚI�&t�
:LN;�,���
+DZk��5��y&�'d΃��e0�n!�n7a'��
�	g{�ѿ�
ڀ[T� ��:��0�L -O����$�Șy�~6%[��F�u)ud2�K
v���/���.c������M"'B
���f 
���?�_KP1U��6�@V�4زF]񕴵���*�ᤁ��������ܮB6O��ڍHߍ{��]:QL~ѐ
ވ�j&�����7q�:�4<;>Y&�#�ޡ+���Ռ'|ߞ�q�K��lؼ�i��Zt�:tL�/kGb��x��ܟ �dž����#�)�-+�-n�%�ԃ7�G-����v��e,�2�?�o�#
�Ƽy�:xBy�.����@���6b
'	dsS}-ˣ�7fe�����RL־��ɣ�W� �?ڶ�N�1@(#�^�R��Ϗa� ڌ�B���B�Z�Ӵ� W|$ɪm��?��q���wR����	���nĚ��[(�b:j&3�b�1eK�]3x���|
'ɣ4�6�ǺM����dW7Jj6�9p������%��Žbڎ�쳙b��j*�)��Dj�g���Ps7��m�8�W�-'M)�:t��C�
����6�F
t���Y��� ���ˤh��G塪���0����?Y
����2�E�
+/��슊IVl}2��/�
}��
��� Y�,`���y�G�IE�"�@ۈu�F�J�N
lY#	]�kII�}jU�FB,�.'�ln�F�F�N
�,/�y�w�$���fܮ��i�<H�d����:����8��d$���l7�9qRv�^�<����H�w
:�":�stb��;d��]׸�H���w�>Pω�f:��$�;��	||����묣5R�E*��	K�������] ����P
�I
R�Ϥ�%�b�iE��.y2��d�S�0�� z�@j���	��T�
+2b�,"+��FH�-6�}$)^է�&Up����bK�ۙ��n��ͩ��qb�vx#��=k��hK?Iw�h�O�w��Qwu��fٌ��p�$�T���ja���슙8ͻxΌ�;
�^�fϬ
+�e�x
�
'�T��װ�0����1{r����[��
+�(�ͤ�ԥ�<�c�@\
�?yuA:�w*���2lI�q��ڇ2c�����0�S@,0 cAAQ�Д;��G�2�
+m&\Ѧ�F�J�N�RC��#i��U�Jj=��pR�\��9ob���@d5!�n��r��
�0͞q){�]�
>�i;�<�4J���%
��Q��ȍ/-�������fg
����ԝT��Vg��W��:��>t��k� �"�r����5.͹r��|�Rg��
3x �ɹ2褿��EHd$S��h&
K�B������8�˧���R*�y[@�@�g2�K��XL�2�}�
k6�
u�n€X`�Z�0#��Ȭ�#?} T,#�*��d�Ҥ�Pj����֩��4�j�B�5B��F8']�Nj��sՋ)Ve��e>I
e<����b���UR�Ϗ�f��S����= q'5u�S��~�^��|����h��Z�Le�~�Y�~
pb�&�~��~
������K9�@�-T�r�@�<��{�!+
��b�.�2�b��MB
�d�2p�)����.���
+T��,&K����
+%���
�Ą
�y�Uƺ�ݍ��/7�P�Ӝ��Ҟ�i�5���׌b�:Js�������#u=p�
�������!^��$1!m1����nD�#�S3p���n���r߳�l35[�H�_[�酪BK��%n-b41��z�Ί?տ��/
+m�[߆;�@��o.�c�@��@�]u]��}���*�mް�L��ď&�K夈I�3&�v����e"��
+͐ŝ&�^�Hu%���fjZ�����rD�KD�I��1�y���i�5#Β�d�
���3���^�M�b����K3��As��O[�g皚�mu)�Nx
��.b�ܝ�4��5��f��|_��x���o�Id7�'�i���i�4(�S�,}^r�?�L�˚)�)�r
+�1c��%��G���W�V�++UZi�HW��N�I��ܫd�7"�zNI�<�v�4��ʚ�[�d
e:e�)��qBj�C
�Soƾ{��'�:�4*:��+�Xl2j(��4��[�i%�C]2��襳�w���y�+��u7�y�
H=��@N����p1�f�|%�a�1F�e
Z<J���\e��d�}�@ВN��]�jw<-O���_n�m�P��v���æ@�-P���ɮ�۹��HI�9��$�3��P�g;"�!4D�� ;B�$�j�)��ܬ�DQ��\|�a|?�\�������+p5ӿKѡ���j���$Pi�Q���؅nJ�-Tx���7͜�r���56�!
 �)�&,��
i�TM0G؄����D�M��`�t��a�rd�B��
+p��Jj
+�'�3 at H�
�I���L?g�4�Df��O�
��?M�B��T�{��H���Uqۭ�c�}��3�}!�F��G�I�sަs��[���E�m_o2�\z"�Ѵ����$S��L��@5�y�?`a
��1WP4U���&�`
�>
+3
7҂JZ���^�fG�3�UIګ�s�

��1FɓdQ�������{��H%�-��F���������M�=g�}��y}k�f"�-Uz��8�2�ǹ�����i�8�uÚ \��b5E�<abs=͔9ξGؒ���e�<UV��b�B�	�u�
k�6�YDx%	�&���!>��Q�Z�H���p| =^�4q��Ȕ�����AG�
b������ͳĝ
��ܡrZ��ȓ�ۡ
9�3��
���}WW��Jt	����s�͔�d�+�VWX�,TH	.H����M��!� �u�37*�Yɓ�Y�?��٧�;��\��*;���`߿�����J�0yP�3W��Ü�?^:�q����c�1� ]
/ϗ,��!�%֐�ܥ�]��X��	-��k�J������\,N{T��(�$�>@~$��^
�[��S�l���]����
m'�k�8�����ԡj��q��� n
�
+�–�Ԑݐ����#p�f"� s�͌9�<fAQ������PG��B!��$���f�ݎ0��,�b1M����A�I���
F�H�J:�d�$�m�Б�.3\�=���
��Lvyk��u��!?:bL2?W\q�Q�a��
d�� 4�����D�f��Dc�4åѵ_,��;��	��`�껥4�c�

3�sIf���
)��>
���F~���\;���l�|g�8���p���YM �h��	�b?�=m3C�I&҅�i,���a�L �PF�����-<�d�6�K�펨�l��0�1�*�J9I&#��8����Zv��)�]��>�ݟ�����[/���6�~t5DYډ�2�� a�H$�)]��o�%�@Q�P#m]I�_�w��'�u���T�|�Ó�N�zv[F�\��H�|6��lg�/5���k4����������60D[��L�/,����R��3h#�G��2����1�j�#r��Z��>ʨ��EI���ӄ1ﻒ�j�Y��-�{�1�^���覽����
!��"Ӆ���	�E�iD�p��ʃG��H;ҵ�U�vu�
1I�%��
�k�qb��z��6������m������Ԛ%[{�6���� �
WS�PN�1@`@���+�Ef��H{l�mv¢u���Q)
32I�ħ��lMǕ�l��w����c���(Q{/�Vl}��X,���,#pO��QD
4ұ��#���ޭf�'Y�_.��f�L���T�
���<�����{
��~�W�I�&�����5=���:l#Q���֧�iDY��
O�N�[-��^�Rs/�

e��"�݀�D�P���
~�`kЕ�f.�������v��,vDt0K���fo�����XM08�e%���d�F#�ЂcFy�j|�^9:k�YJ���

��
󅺉2&�_���fڀ�V�
+ɲ�r���E5C���O`��3H�ڄ/JX1g�m��Z����GY�dI|O
^t�;J|"㇞A�
�i��Hz���{[q�*�ru|#�Y��
j���%�%�S�4�.�[�T�$�Ҽp�Ǵ 
��%�?��CO!�123�DƳZ��:���^�
j���2��,��AV_�Kr�W�&�
j��d��X����D�m�
�߹� ��O�
endstream
endobj
276 0 obj
<</Intent 302 0 R/Name(Layer 1)/Type/OCG/Usage 303 0 R>>
endobj
302 0 obj
[/View/Design]
endobj
303 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
275 0 obj
<</BaseFont/UZCPCH+Helvetica-Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 304 0 R/LastChar 149/Subtype/TrueType/Type/Font/Widths[278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 556 0 0 0 556 0 0 611 0 0 0 0 0 611 611 611 0 389 556 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350]>>
endobj
304 0 obj
<</Ascent 1159/CapHeight 720/Descent -481/Flags 32/FontBBox[-1018 -481 1437 1159]/FontFamily(Helvetica)/FontFile2 305 0 R/FontName/UZCPCH+Helvetica-Bold/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 140/Type/FontDescriptor/XHeight 531>>
endobj
305 0 obj
<</Filter/FlateDecode/Length 23361/Length1 60324>>stream
+H���{xMW��Zg���M�x'N�9W�G�J���}f0�W3�A?y'"� !^��]E�N��ԣ�N��A="�V%!�HnH�jD�;+��d��7�~k���^�}~g�N�(�E����ow�	��KhDBX��ā F߈Yɦ�6����I1	
�C
���c��Dgu�R�}���ب������g�>�<���ۜ��؄���7�m||bD
_v`�
+��IKm�?��>贰�(�� ��ę�
;= rRҌ������
PD

@ݢ���h%�	_�@�q�:�g;iΌ�`B��.
��A� 曀�q�0���ո
_aQX�֛�
��G�Vz�_�G��<���G��g-�X� z7�+y�I<-!�
��gҰ9���q��2\��q3nÝ����(~���>�jC&��~4��SM��E�i)���h=����v�E%\ITR�4e��ZY��T�)���I墒�<T\��+&�1Gl���w�8/*�#�XE�E�!�վOuԛ�M����n���z�>M����s�S���-���
�a�1�h�ɘh�k,0>7�g�KF��o�2�?UF����2#�Ds����hf��#�1K��X>V�߲Y���VOk�5�e�֚l-����&m~6[���m�-��!+��]�{�}�-�m����
�+
t�
���խM7�!
ގ��U�Y�zJ���].���~�^n�&d�b8����W�&܊;p7
�#L�$���X��Ԗ:R�����b≔J��Z��7��H�)S�P����&�Vy_�Xٯ
f⧔KJ�R%@��q"\$�ub��.2�^qN\�D�x��2 [...]
�i�k >�Xd|a��8k\6�7�B�QiT�L0��qf��l�33�}�a�K
��[[�,��hua����L|
�ҙ�fkֈx��80�f��6/��c��1�)ݠ[{8�
>?�Y����q��G�g	g�=>P7`��S���	U�q������
>�U��i��t�G���r�=��Y8��Y�{hǘ�l����$��ֿ㻆�{���l��T1
�"�"���W˳˯���_b=�4���3љ���qF;����g�3�9���,�����Q �� �p~+�Wٛ/W]�A�F�`��)i�<r����
+׻3Ԣ��„��=
z��)�]|��h�?��V|�xDޏŧ�η�����.̝�
�-����q�������i�S��q�'��S�f�n`���;􀪉I+�"�~F᪠�J�aJ��V���M�
޽�r�
��1�3�7�S���m
n�s�5U]�f��>R�s�Q5_������ܭ�
�����.�׬yy<��nߖ
r�m�Ѯi7���z�UjUZ����u��WՋV�KQy������cXK��&޻�`-��
�	�p��<H�
P	a
l��p
+�'���#����|��9���� .B��
p.�eȂ�
9�
Wy���x��w�=�B܇S`*$@<L�
H��\[f�LH�d���
Ra.́y� �×�B,�{�8��
+
+TQC	��9za|_z��G�Zx���
0

4�Bv� �cG܈`'�
O�삯aW
�ŜWWaw�
����7�7��b��!ؗ��
�qg��8��8��[p�p
�K9+��_�op��1��C	��W�Q�1�2\-'��j��_q>�\
���$��/>Gi͔��'W�7do�M}(D\�>�W\Gp^�N��G�t�nR��T~F������nS	��S
������]*�
+��8�p�
��o�G•ڷZ�
�}e�
���~��
 �2M��)�p
���
+�'�D6���rdʹr
�W�i�N|+r�X��(m"�S{q@��e��$�Wc(��5��j�� S�,��S�h�@Ar��Av�T��L�L]�5�M���⠸�ƩSE�< 
+�-Q(�kY"W��'Q)
�*�H��*TCkh�X)V�ۢH�Z�X<OE�xסH��R�e⎸�_
+�r�
���
+*
+�x��]y�?�r�LUUUS�J��z��(�����_
�UVi��s�9�OO!�� ���J�JZ(ҋ.�˺���du�
"��e��{�A�YB	���K��`�����`ggdgǝ��d��޿}��>��1<�G�[:�d�8&��o
+p8���ܒ[�P
��y��6�
+Fc
^���;iC�����\��xiI�#
��{����W
�w�,S��T3��0>�W)�QZ,?��1~�HY��Q�T~U@T>��*����1Y�j��b��*_�'�ɪ��Wz��U�~�K�S���2h�85�2�MST�𧼜?㕼B'�=ҧv��<E=�}���
�}���1���l��He��v��j�X
������5i
�H�E\�u����
��%�����p
)�����+��
]w�=m��ɿT{ަ�t��
�e�9�b�گ�,��P.�q|�G���z=���$�=.ȅ�}��~o�X���\�>�.�@&;��{؏��(x�u)
�a:X��!��n�鲺�ި7�}z���u]�)�֕te]E�骺�ެ��� [f]_7�\M��9�N+��S��u�
���D:QN[���
�%=[���4�q��
��m���~]�i+�ʶ�
�o�i�m��������5D
�n<@
T����V�T��������&��D;�imt:9]h:�X��U
Z�ګΪ��*���
�
TͥmG�(�LE��z�ݶ���F�Qz��a{�Zj$�0�MS^����ު��F�j*�2���d�q{�`�r$Gq[n�ܑ�M)S��`S���#|�S�$����yN�s�����i�̧��qzp��3�y�&����
ؓ������6�t5/�lZ�g��j�zY�4�MO�@+Lo�3}ԇ�ɻy'�U�s��V�崜������CZj���C�dES�
+J�.LEȇ|ɏ��(P1
+��T�JR)
+�^�B����rJ�U�JT��PU�jT�jPM�E��եz�z��SjH��15��)5��Ԃ©%���Ԇ"(���-���ԁ:R4u��ԅ����u�
ԓzQo�C}����%�X��
$�
"n
&&
!.
%6
#&
+.��4F\�5���$��1�kbQ�C�������X�����d��
���|.�'����$�`��>�8Z��K?XD���K��Ki����j�4��
VK�X#}`�׆^v��z�Yܽ���v�A;�
R�~��~:@�C$J��B�CNo8���Iw�tRr����N�TI�l<O!��$
{
+y$��I��#��p�D�5����o>��H��f��ռk��5��	�T�!	y=�I�����O���1	�
�p%	YB��C0:	DŽ�Gv��p�	�
�$ ?ʄB���D!1����Lx$�?ءb^&�W2�1	��s$�`�/i���Ϥ1��[E�E�qX�����c	>�R,çX�ϰ+�
+����_��c
�
���[�$��H��
���B��}DRh
�"瑆t\�E\�e\�U\�1	����
��E�|�;���X�F2Na+�a;v`'va7�{��q q�8�/�%����w
�Q|�c��#	'pR��@y���(xh0lN&��ԣ�Ҳĺc1�Q�bP�Q~4��2���	(�;��	���ʨ�MBET�΄
��:��z��Zh�F��%
��	� �֢%���4C+�Fdv&D�
"��x3�ڢ��N�,�p���{vO��t
}���/��n��P:�"��L���T�̣`
.�!7Y�g�vu3�Q��f��z2�r�w��޵2�͒�Z�X�|2�
ԡ�r�a�<%w�eֳ�%e:WqWظ&���Lr�7ݱ���d�
+#|4�k�d7ѽ'}����`w�P+[
-DA5�]'
��l�&�8L�n�{]���\�/j���9a��'
e�h3�"a��^�ϋ�9��Unw��.S�US(�,GKC�L��$B�'Ý�Αk
��u[
;�A�i!���� 
dd�����4G��U�B�c�J�\��֍u��_Σ�
�%I~�ܕ��&,��<� ��]U_���Г���%rn݄�%�T
��>'ʐ�@��*�"�%�� ]�U��T5[%�LOmO�f=˼e���Mr��9�����<����ٖ#.{����]��٦R*��Gث�� \��D�+ɷ
g%�.㚜��
+Q���/Ǜ�f�5*^mU
_O�g�'��⹫t?� ۿ�/�ئ�;��sv
;����y��kǐ�ylj�\�$C
@m��
	
+l��H
M���0C
��`0	MM�hUtI�ɨcb����"ucS��M���X�A�4j{�{
�!�?"�#������;��9�s��)�(J������O3����YX4�hj�P���Ӱ.����
Pٳ������t݇+���i�*����W�P�<{�����:��@K#�"\�6"F<�,:C\��hH�\E��^r0��
�"�O�NE�	��3�y��^C?CG���)�'����w�{�RŴbF��2G٨<�Lc+haa�;�����~�P~Vu+�5Tov�8�]A?��(MJ�Y��
Jd��j^F?&_�g�kķ����
+�g�C�ZX��&T�^娰�x+ǖ���X�&#c(.*,���yu�*G��)�����QV���T����|

�E��Ȃ+�4Fd�r�4R��ݏD
+�Ha!�X/򺜬�g�9�&p�?�+>>̊I���I�����
��8�cE
e�b��X��A�K<}s]N���r��XD]��1#tR�_4�>�h�}�5��}�!���qa�S�]���"�;�����K�c!t s��{$��f�9��ΨdņB"
�DT�C_%2�Od�r����C�|�E��b�� �9֝
F�Q�8�zYHK
�D|8�!k���(�<�qVT��X|<
+�Q_h�,��|��@h�$���y��bP.�ֺ�J}g|1��~)����
�����
X����
�)��X)/Z[�����a�
+c��=��K$��H�H�{b��༌ؘo^ܸoVe2K��
C|4�k�i ^dz���,������(�ϑdJ�PBp��}P#Mg�Ǥ�;��F�"���s%P��7�T}���N����^�r�v�\%�
L�
�
X0k ���`�l�g$��1()�.�pa4
�`�!��6�8Q[��p��TKy(9O<
��3�� A
+�j��pW}���8峈�/
СB���+�N�0D�.(�~r�q^s
h���>�er@�p<�
�x%
�ĥ��
'0z�!�;HN  x�O�4�s1�s +,1m�~X@	��d�M�	�Am�L�y��,��gY�[O�
4�J��O��%�۟L�c1a�vȄ׮����Za��	�A�O"
xz��-!��d�=�	��=2��"�a9���"���7��ᾧG�	�'
\Lx3�
�	oY!�[�C��e=�p4�$‘‚ED�	O=�8�mK�=��b��A���|�
+!�.ylY�w>
�.мSB>�D>�9
��"G����#V��ъR�
N)KI�KS�$I�U
+e)F�
�[�^���j�=o0�ݨ��7�KyQ�7��u�
zN��Y��s����'���0do�|B�P;����脰��hr?����?�����6�ͣ�[h��cUQ]Q])9(��j18[˕��jg���0��խM��f�9hq��Lmޟb�P7��d���$H
��{�nݪA
�9��0��K�����hkq>V(�E��zw����nj��J�������)�L1W�
�[+���ͅ�'��Z!���o
:G��ɺf82ZY��N��M��w�
#Ȓ��/�rɶ�Ё�~n˛��}�J�c
=k�����on�j��w�:�n�/Қ��-��*�V��j�ѹ#u��wY�5�T+pT��Z��BO g��4�N.��*Z��ͽt@��
����sI�
+��
�
L�y�0�D�7�����fﳺ�8�;J����>%4l���~YKj����)��Em 	+�fYˢ�)
�1ۈr�2o;�uo��N���A��f�F_��s
�d��f8UW�&���0�՘whJ>� '�Dz
j���}Z����
+�Dʠ��
���̫#ǿ�(}��*"�0>��g����}e�su��66r
kp5��j�F�Q��ˈA
��&
DH;������1J�27�M�M�:��d4�����߇T��$T5T��#W�ֽ����,NߎȮ7�\E�?�9�M<���K�߈P��k����q:��p�xj������W�DȚb�vP�+�h\����cj.�)T6 ��r���f�^��_��I�ޓ��z�
�y�
�Y}�P�
2~=}��<����6ׅ��PC�RV����͇֎�f)��f{')�Vg�c��(R�>#
+
+��h�j��H&Ϙ�;��m�"�ڦU�9��1�s�z�ɜ��](y�%�
y�y� �Y��-���
fC
����bL|v������$Q����
�.�&hE�k���\�833�;�6���;8���
B ���A�,Ay�E�������+|�ݻwa���wd�7
�qD��h�1
+�V��3�*�ik���0�h��X���-�N�i��6:���:j�i�'I۔hLk�1c�L������Qٙo����9���9d�斓mn՞
�p��N
-��NR��M���ry�~�6����
 n�\U�a4;gaA$�匤�ԴQ�Z~к�s��|�-^
+��\����ߔ"r��!��O?]��sU٧^�}���/����m~r���+3��gR�)��u�,R�rx�zJ�,uE�B�{�<S.�-1��n9̑⊎9%5��^o���e��oV5 at z��*�
7�����ǎ����c�<�O�)ey��J�$�?���/�1rO);ג�@��2�C%E�6e����.����B-����Xb_��'.ʸf	�OJ
�+�,���z#m�7�������UI��l[U�;'��³�*˕��}�1�" �߅
G��
'�2�JD,����(5HN��p��4���ٳ�XO����cE ��Vg$�H���������~��ҥ��vY�����+wS���Lm���ΰ_�J��&�f͚�r�T���~���s��9c礯X��Е��
ۢM���❺�MKKs�N�3�9�Yg[gS�6;�ΰP�59������:�Ӥ©��i�*��H_��U��χ��U��֣^_QA�d
�ؽ
+"R��δ�{
+�I
��D炶�/kr��J�ȳ
�On)� �:��:+���z������2�K,g�^P�f��E�T�5?D�2D�@!���[�.��7�I�m �a�����
v�:���'E������55�1�7m�����
§N�j;�tx�W�^E��rڙ�����}4�����c���� 
+�0��c��
���z�+��30@�X.�o�V��V�c��\�yV���b�) Ƃ>�-��-h��e���/\ n���Xs��=by����v���|� P�����W}T˲�N��sD� ���^����Â��a|�b�c�k�E	`0��8_�����^�W
���cY���p.��2��� ��� ��>��o��E�O�ˌum�vC�0f F!�`���=p6�W
����yT'�/d��,_ ĝ��w������G�`/�ljW���|�
+�VZ��0�c�An���½c�fZ�v$䬴� ��J��ڿ���%�]J����
�r
�~M��m
+SS(����3��=��ػ��>7�o�}��g�e5m��A��-�I��
ض�k�S'�<lw�{���z��q� �N����	؃�{��~'�]�
��e;�
+i�y_&�
�;��g��8s����{��vR��`�[�o[��䳟��`�H���]]��v���b�j��{��(X
,c����f[�{����&�����S𘹬�_�x��DZy�xf�{f�����zmز�$�z�[�)2; 
t�T6S�{y�v�9Ƭ��/o�}
+[�1[��%�z�
�?�7�
�+C�1̱��/xx��.
�������c9�3�qP�W���2�%�
�ݚ�n��r��
�� S/���Pp�{�������_}C�Kw�v���U�lڋun��(g~f�x=��2�r���\�=d� �
\4�B_�3�O�ܯ
 � ���sY���}~g�3��Er��ub�jE_�(�a
[
�َb������|��g�$d�A���_�ϲ
��S�
+���8��	��:���Vo����'BW���~��t1�J%اgw��
u#��N��}�S���y�;�[� ��;a�06{W�
��US��s�&�*X�Lm92�m�rbM�
��6a��Vh��9���}b��k�����w��9)
+
����l��7`���5����!�	��.��w�b�
�"��X
�<��/�>
-r��V�yy�M�ֈ��-����0�@y��m��6Q�:�� ~
Q�!nsny��8�I�T��q��;��:�#t��;EM��Ͽ�w �S
�
`
3�k��Wz�o��z
�n@���g����n%+�'b�rl{���
w�4�~w��#�U�e 5�0j�a�2|���
���y���� t(d��]L"�F.eE(9����9Ok6"�?)rz3ƛQC|C�ANj�#r�f�T�R��O�\pn��
��7�y�
�q\�oֆ\���pn��
��
Qk
��U
	�{L�;3�/_�E��*h+�m��8�(^�
.���zF�.5�����'r�dc����5�=f
6���\�g�C�%�G�
E��k`3F�ߋu�4�
G�
���g<���X=q���
�h�P�˾������tt_3��o�3�&\�o��G�
�>y4O�
91&���>���l�V���:�y@�
�fN�Y;;�_g�e���:!O¾����|��	�K�뙇q`�s��A�=�7P'b��d��y
��7֙<a��ݐo���c�8��}||M���k;E��	k����|�9p�hg)���������������q3<��A�|�8���0
�_
uY��Z��� ���S��1��?� ��9��˩uA����d��RU��F���&����=�����Q���/�પ+��}nB0�Gmx�� �E!
6�J�����"��V�G
bA�'��Jm
��v,�[��t* *#8�)3P�*S*�4���g�K���W�'��]���>�����b��1#/�5�
̌�^����C
m?�]|Ѥ-
��f-����A������eޯ�{�<�?�ZQt؍,�����f
��y�o7��T�Vs\�X!�jj�*���
�9�Y&�2���9��/��5��=sD�.#r6��r��f�v�j�7�3 *ĵ��̍z+&Џ"jf�%
�R7�d-,ǭ�͢�.�u�ק3�ܛkH�����U��J{���
�Օ�w��T�K'�Z�D	�~��Rd��<�%����

��XnU��ۏQכ����,̐u%�3&|��@?!�K�Ɵd�ÚE�x��Ԙp��Y�ėR'�kr���١l��Փ{��rlJ��X�4n���N��Y�����.ϟ]�/3���nj�BP���H������:Q�ߣ�Wr�jZ�؄��L�=�ɼ7^Q�
�^
+ђ��JP�xN�m�6f��������mq
I^w_���>���F�zZ?~^벏��vʼ�����\[2O
�3�.[���/����\!�~l_?]��یY�Aۑ$I�Y�L����k~��7k��ң��[�s�5üǩq;�纂1`�֪+��Oݧ�yo!���m�W����S����
�e��%�X.�"�Q<b�"�ZsS�����;Q9�����2�}D
��d�Ġ���%��6<��[����U<�c��6��h���B<�'e�&Ab\@���䠶�;
Q�y���&�Ś�.�:*Dv�����������ۢ��X���+�f=�F��Ed����N��cK�
~�
�:�g]
o�j����}�G4���%}�j�� ����+�:R7�����؞̸�
��X�p��N�ɜ�d�K2�%�u)�5%eu��ˠ��[ݿ�%
�;���O�b�w7\�Q����h�=�pM�BZ�y�+��Y;D���c߉���m�&>�r.�y�����e��cL��c��.Ǽ��b܏�g0���'���H��_��&j�UX�b��W��e��]���@/k ��t�_�.c���ߝ�i�h��K��j{�Z�ϯ�
ƛ��{j��s����p�\
+�Ф�A���P�s�9����]�k�#Qb��\��$�˦�<��ރ�r���78S�]��Dmp���5���gP/�c�hC��D7��IԚ��産���c��L=�>���9�f��8gq����2U^�7�.��>t���Q;/�v
M-�L-
�Vn��YK{�G��A{���Z)-�N��L��0ay�)=;��X����B��N��~�Q���yy��
��Y�yd%�<�q&QO��+mX��|������xw;�z \C��';�κ��8��>�ޢ}�4�̏ԥ�:����U����U�̌kP��5�/ї�O�.P[��Pk��E��L�{w��_�k��]g��z'%P�J�{:T~Q#����Fg*�j
P��o
Y?�P辀w$�Y�b���Lg�:*��+�0��'��6D�QCi�}�-��3���2�
��YV%s��8�
Q�t���1�L�V�f�F�q����a
�p�na�5���͒ 3�
+3��)�<�#��"23�iLcn���~
�B�}���A�(]ߞ���l���vʨ�r���XM�?��v'�I�x�����B��F
݆��b���A?{;�x2�ь�[y�<��n{X�=<+˙?�8'ܧq|�>�^"
m�T@�k�7۠�L�8��@M9�6E|
7f����P�H��!j���N�T��O��I
ý?ڭG���1*����oʭ)
��ζ�P��?�}�
r݌�H קX~�
� ���
K��n�8/0�{#�m��|����M��y���"�ԡz��5��a����&���Gˆ�{�X6�x�dY
����)㵺��k�
׉���BU/i�OgҦ�|�}U�
+�ۿQ�󰉎��Ӊb�i�GKY����
��֥m,���5S\�9��!�d{�\?#8os0�����C�:����� ���f��ʹh�_;_e
cr���!�Z�&3��'Xw`���:�����r3�Y�/�qb/C_����9���$s9&ͼn���@a$)(���}�J���J�"��e�9Fry}/m=m1�@r�Ė���R�JJ��lZ��]�y���D��|�m쵏����x��S��!]1v]���E�����A~
8�pz�ޚ����SCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB�O1��
DK��D*����ɍ��.F�Qe��v���]�&k�վ�L�׾��X�}��oҾ��F�{����Oc�ہϟNh�`���}�u:�o���C�6Ҍ��w1�oH�q��0ʘ�|S��k�C��=�[,�e�Ӿ�\��m�����=�i�wT�m��0�
��e���&�
�Y����|C����
+���� ��O�rU�{H?�	���+�;H��Z��a��5���]k��=���J��S��
+�(�(���!x;@q<8\
+X��f!�
���R����ݵ�݊{q�;��
(�s`������gw�yw+
��5q�>��)N��6qJӾ�ĩ̘[M��ĻM����M
�p2�3(�D�d�,晻>��S��|8	���L���}�P
+��X����#
=�
�5�z5gxݷ_"H��p����
�B���%8Ho��wE�x
.��t�jD�^G���+��e��V�� K�-�*��	�,���O|�~��ѭ�۰;<�Bæ{�V�eu��]m�.�ۨ5
v�7�mxToQ.��e
�ZuZ?��p��]�.��k��i�S��tyԶ�����C"�N��#�m�ĭ
�W�q�*�}��ۆE�<����~�U
������p�n����Nã7��
gg�
a8U ��#�U
�g�*�
�p}��m��t���!���
��n|v4
�MW�یHO��8��:�S�b�[WE���P���;&j�������f�
���~M���j6c�Ҋ��C^
_ڸ���Ո����uDFlW���7��V�V�WLV�Fƶ���HG�5���v��s4n�����nǭ�^��u��SRE
��O��U� ��1&r�w�X%Vݡ�VOϗ�糗�r���r߲��5��F��S�0�����9� �~������
���u|�����A����}s������P��\J�|Ӝ洎g��j�&��j^&U��\�EJ�&�%��� I'�%�d�L�Y��Oj��U�Iv�U9$��ܒG�J>�/�R@
+�E��.�"RT�Iq)!�RRJIi)#e����
+���$�U;�RU�Iu�!5��j�����ԓ��@*RK��M��4W��BZJ+�fk	W�Jm�h���v��(q�-�

EG�� 
��tR�E�J7�.=����^�[�H_�'�e�
�A2X��P�4r���Q2Z��X'�)}�$��2N�i2]f�L�%�e�e
��Y(�d�,���L��
+Y)�d�����N���(�d�lA�&�e��]�	�H��^�'��
�CrX��Q9&�儜�SrZ�(M?+��\��rI.��*��ܐ�J�o�m�#w�ܗ�P)�#y,O�<���B^�+y-o䭼���A��G��H�d$)�!9R %R!5� -���	��?�g�ȊlȎ_�9�
��y���(
�P�QEQ
�Q�(�R(�2(�r(�
+��TBeTA(����j��PuP�P
���M�+����7�@K���
��
p�-�!Qp
h��
xe+b��N�.�n�
���
��}��1 1�1C1
�1#1
+�1c1�11	�1S1
�131
�1s1� 
���K�
˱+�
+��k���	��[�
۱;�
����
��>��
�!
�
�1
�	��)�����8�󸀋��˸����븁���pwp�p���
�	����^�^�
��
����G
+AR��џ�	�����I��ə�)�����i�tL�
��L��,��?SgVfcv��
��\��<��|��@`AZ�B,�",�b,�
fI�bi�aY�cyV`E��+�
+CY��X�5X���ڬú���l��l��l�_ٔ�؜��[��l�p�h�
팠�mَ����.F�=����Ʋ;�;�
����{�w�bo�a_�c�@�`�P�p��H��h��X��xN�D�I2��e"��N���&�9�38��8�s8��8�
�����K��˸�+�����k��븞�����[��۸�;������O��^��~
�A
�a
�Q
�q��I��i��_<�s<�
��K��+��k���ɿy��y�wy������1��)��9_�%_�5��-��=?�_~�D�FM���x��_K�%�i��$ZR-��\K���Ri��4ZZ- at K���2h����� 
��7�e�-n�j��l۶m�ڲm۶m�����C|$@B$Bb$AR$Cr�@J�Bj�AZ�Czd at FdBf��,ȊlȎ
ȉ��r!7��O�E>���(��(��(��(�����J�J�
ʢ
ʣ*�*�
+����j�j��
���	����Z�Z�
ڢ
ڣ:�:�
����z�z����c bc�b�cFbFc
�b
�c&b&c
+�b�cfb����9��y��X�EX�%X�eX�X�UX�5X�uX�
؈M،-؊m؎
؉]؍=؋}؏8�C8�#8�c8�8�S8�38�s8�
��K��+��k����[��;��{��x�Gx�'x�gx�x�Wx�7x�wx���O��/��o���R�P
M�̀a������Q���13�
��q���	�����I��ɘ�)�����i��阞������1
�2�3s����bn�	�K^�
aL~`AbaaQcq�
�,�R,�2,�r,�
+��J��*��j����Z��:��z��l�Fl�&l�fl�l�Vl�6l�vl���N��.��n��
��^��>��~��
�A
�!
�a
�
�Q
�1
�q
�	��I��)��i����Y���q6�p.�q>p!q1�p)�q9Wp%Wq5�p-�q=7p#7q3�p+�q;wp'wq7�p/�q?� �0��(��8O�$O�4��,��</�"/�2��*��:o�&o�6��.��>�!�1��)��9_�%_�5��-��=?�#?�3��+��;�~Q(�DIV�0
+�p
+���H��(��h����_K�GqO�@	�H��DI�LɕB)�J��Fi�N�A�I����(��)�r(�~�ʥ�ʣ?�W���
+��
+�������o��*�R*�2*�r*�
+��J��*��j����Z��:��z��j�Fj�&j�fj�j�Vj�6j�vj��N�.�n�
�^�>�~��A�!�a��Q�1�q�	��I��)��i����Y�W�i��h��i�h�i��h��i�Vh�Vi��h��i�6h�6i��h��i�vh�vi��h��i��鰎討�N�N�����.�.鲮誮�n�n�����
�
鱞詞�^�^�����>�>鳾諾�~�q(�6L�v�0�p���H��(��h����_
˱
�q
���	�ȉ��I��ɝ�)�ʩ��i�����əCR��Y��ٝ�9�{HSr9���O�u>���.�.��.�.��!���%\ҥ\�e\��\�\ѕ\�U\��\�5\ӵ\�u\��\�
�Ѝ��M�����-�ҭ��m�����
�ѝ��]�����=�ӽ��}�����<Ѓ<�C<��<�#<ң<�c<��<�<ѓ<�S<��<�3<ӳ����l��\��|/�B/�b/�R/�r��J��j��Z��zo�Fo�fo�Vo�v��N��n��^��~�A�a�Q�q��I��i��Y��y_�E_�e_�U_�u��M��m��]��}?�C?�c?�S?�s��K��k��[��{�G�g�W�w���� T:@�@�� �
��A� R9�D
�уA��� V;��
��A� Q�8H$
���vU��d�^��{Ƥ�����6��qS7٤���6
]Y�Ȋe�$u��y����i������noF4�����ޛ��I�F8�����p2N��8
�c�� 6b�[�۰
;p&���8��<��!��.
����
԰�����BLb
+Өc?�"
�
.�%���.��t`���&,̡m8p��ax� �<p],�
+\��p5������܈�p3n���
��܉�p7������<���ix:��g�Yx6����yx>^��Ex1^���ex9^�W�Ux5^���ux=ހ7�Mx3ނ��mx;ށw�]x7ރ��}x?>��C�0
���>�����>�O���
>�������/���
+��������o���������~����	~�����~�_���
~�������?���
�����������
�e�(ZN+h%�P�@Dy*P�JT�
+�R��մ��R?����hz
=�
G��'��I�dz
+
C��qt<�@'�It2�B��it:m�3h�6�&�ʹ���6�N;�L:�Φs�\:�Χ!�I�h����Fh�h/��]@�4A��=��a��&i���N�� ]Di�.�K�R����Q�t2��,��$��E6��!�:t�<�)���i��P��
+��������������n�����n������
�����z����!�
��P�{��Ѽ��lÚ�-
��m-�\'�j93=�.
+��
KO��u:�{$r��z���!��[�i74�m�{�"���
jk��:�b�jxl��H`�5]���Ų�K�<=l���HQ����pMי�
�uM�4"�j�%��q$�BUz`D5��b���
Y$�#J6��͈�ef�FtfX��������a��{7M�W�ih��&����6XΊjI!V"kI�V,���.��{�s�h�F+Mc,J#gG���u;[���#Q��ْ��؇�O}8���؇�h
�<��d�H�p��L�mq#Q�h���ya�� �Zn2���1'Ә^s2���b*��ǜO)��
+;ө� �2
�=���iѓ@�
�$�{RO��*�qa$z�
	zB�[�/�(T5ԓN���~@�rA�ܕ87׸�Œ��bKS����D�UeZUE!���3�ݠ�1eT�#8���
ST8�,2W���<~"�
C��e�ʀ�gD�جdPH�!b��p�ﻶe���:�;�<[�r+�=W
J#j5������*���R�qUqTeRU<����
c������������.�
������J-��ؚ�OӞ��<z>3z|�����n��c2=�h�����m9�龈r��~�
+&j�ChEbE�1W0�_&\OЛһ
���
;Y�K8"ᰄ�
g��<��R�[�|
-ȖF�
Vm	�:)�Od�}�wՓ���t�!_��Y���,nqڗ����TS�Z�
�3|��2+
d^Vb�了����M"��e��%
Y߼�������xQ�Q�!鷎��%c2I?��3I��;�7��3I �庤���(��
+��B�������wU����g�C�%��$5Y����ȜLɔ8_�P��W.W3$�:(wv3X
S�
+
W�#qA1�&��}�])P��򏖂�Eœj��R_�T�%jiXy�J���i��#��b
mY
���5��x�D�e����g�M1
+�#S��tc�_Ӂ�V
v�*��t�z����+:?_=�a9F(�GN�v���Lk[N�Z���)�KGXj(�9�*K�ɜE-�V�љm��T�_r�g{��j�xЦj��d
+�F��8����Z)�kc���Y�IG}���
�/+��ry�(_��-�;n�9V4�m��� �����q��:������yWy8k�|
�ٜ�]z��d
ƹ����v"�XV�"k���J^�V�%�
&�e9�M�����"6��qVpB$��!b�b>����n,�����~�v�(8u���桕��|ݳ:A9�I�"9�f���9E��A��)�i~�	\�\Q��=u1�{B�[�w|�W�:����2��C�K��2��V����r�j�=qm�[Ǐжf���w�
׎/.ݎk�o���lN�+w<�������7�xjQ�4�y%�j��K?�l6˓e����,l�+a��#�75w,�?�
9>8\Ǩ�"],F��S�%�l[���cZ�?a��xeӶ¬e�
?I�f�sg-��&~�O6
&rw"�'rG"��3��Z�֍[�
fhs��Ļ���;����g,��v�u��+�H�p�I��/��N�h�i�MCWv���%@�.��6v��돬I�� ��xf�it� Q��LjW�#�
w6�-�.��;K��L���
��?�ƹk	)d�9�13��cT��o&6M^����i��7F�=��ՏqzΝ�E�g8ߩ��b�����p����6q_brj�FA\Z!d�G
 G��zt�x�h N��&��8�
j�>,2�f}��3��a�|��wjK�^Bm��H>�X$,X�޹��
��'���~���6�܈��9a��4֖�W�q��9|���=�cH܍���!��^��@C+
[��eL3 �x�e
+���-���g����s����m�%~��q���y�#���+B�����2cQ����
�7�{���ъ��w�J�_k��<k����Lbva at 9�����L��jj/�ڋ�v�����|E-�th�Z��6Fjc�6��͢C|^泸
��#��p�w��w��]���p����.�C� �
� XDZKya�+C+J�M�]\��QZU_E2�T�U\��W���L�$�W
~F�H�xnX(
+B�+�g
�
`�Z�-�]�6P��Kj��PZ�`

�c��b�N�-��F��U�IJa*���;
+(,�T
y;�)5
u��ϭ&I�KEPa�#h:b�"
1OG8鈅�`*b��`�{���tD��X��HE,�QJ-��P�0��n��LjW�׈�q�h"Z�����
�.b��e���ek{������� q§(Y�au���D>
*+)U'��_])�1]�
�O�4i��Z�Թ7:��roTnS��(���l��f���d
u\fb��4����4���lV�1�,�L�Q-7,$&�A�Zu�{����Wh���-�F{ٺF7�F��n�>�m(���
+�(�n�f'�y����������7�
l����oz�vJ��*OWJ-e�}�M��[�I�3۷ٱq3��w���������z~W|<��N{���Ny��S3�5��,3?;k�΂W�i�	vY�&K��ErҲ��H�`�PJ? �P��g{-�k1���W�
�H�gF*ȌԽ�G������?����A�T>�CF;g�{Z�P9��3U�j>��O���Qw"����
�0c��P��Z[&V\���2�7�Λeb�DZn-����V��K����TO�H��.� ?aּ������W)U���V~�̯��������r���O��]��g]��Q˕g��Q�����E[o?�l���t����yp�B��
���̆�؎���J��6480H֐��Mzç��J���0&s��L��˄�d~I�!��G$!�]�B;�l����HZ�8����l�IR*�JI٪����_�S�Y��2�f
V��4[u�T�驪[٪�lխU�y[u���(�_ne
%-��T�BG3�n��:��Z�l-�j�N�b����bq��D-xo8���HQX�]”�VE��R*Ĉ�!F�
a��5XR�w)E��R'�����"-.5�H�\�YFi�K�2�,�)�QR+=�V�O�'��]q~����Zy���s�_]��T��y�E�O��4gO�A��O�����~��X��i�>f
�#(��ԏ�ܞ��d-�y:c�I뗜C6��]<�Mǜ�5�������y����,r��@�)�)Ot�n�iw��e-��v�oIy.�Be�NY/�'����>=� �Ч�ƚ�1�-��ü� ���qﻳi�h�{�|�А��#U��!�����������3�zfq�G�K���.~#�=)�o�!��Q�.*�r�
ωkW���۬���'��#��KHu��vΦ����T
�BK�8��R���?AqS�����b�"�c�.�
+vN�n'ع�]ًD#?*�9e��U1��'nQ�g!�!�=���?�YL��$YFi�Ⳑ��!X����=�Ƨ��Q���
+�N,DqV�2�r����P�FX1r��)�3��%��Dݜ��ȣ�1�s�?4���S��7�k��
F�O7
�4Ȟ
€�mʵ
+}[��nV�p�
��?&�bXD�\�ku#��")Et�my�wVL�Y�
+��9ӗ��H�%�
+���h�?���I~NBi�qNjE�.���{��+���@7�,
�,9S}��T�P*o�3:��Fg��k��T�Q�җ�r'�����l�0����^�=xq�{� :C<ˆ��ǯ6���N�F۬�h�=��Eik
�Zk�"A at 7Jgi���_|qn��
s��s�?�9۩�[x݉��7,Z����Kt[.e��MD
q�Y�͝
�S�/�>gg��E���t5ؽ� NP����C�>��C��G
D�>�v�e�	"�
�3,�"�70��|�5����&?�U�&��}��^!b�#�9�""�)2�bF������Y�?�
L���?A�� +9A^�
�?��)�O1~��&ƛX�����xK�ż&����,�g���o��3?�9�G�:���u{�P��`�~��~��q������fR�3�e5�"����,���09�\��.�b���3D
a~�c�8E4�ݑ̏�Ƙ��1������5"�7������c{cl�
+۹�~_a�W��\�E�0\����
{�3��_H���dUS�M%�J�~I!	K���3��OC?H�&_�r��t��@7�q�;�
�|�߁��w�;�
����@5TG��<[�W]Oh�(mt<t����i<�#����ͶNhbr��ߞҢȋ��������v8G��R�Q��8��Y<O�l!_{��?7_��Ysu������x[���2Y
ɭZo��a��"��,K��7V�W�,�n㬔,��8�4~��CZ��V�����\�s=V���T�j����Z��:��z��(��	��	�9_��|_��<O��<





��i�O�����i�4xZ�c|�����u�:|
�_�������u�:|
�_���7��
�|�߀g�3��
x<��τc�o6�������������������b<
��X�,�c���?
�
߆o÷���m�6|�
߆o÷���m�<�ρ��s�9�
x<�ρ��s
�u�
߅��w��]�.|�
߅��w��]�.|�߃����{�=�
|�߃����{�=�
|�߇������}�>\�ׇ��������������M���N��?�w���)�S|������������7d�C�C�C�C�C��Ɵ~G�F�F�F�E�E�E�E�E�E�I�=���tq�<��<���Q�U��4��,J�â
+^Z��O�J=t���¶_���v~�����~����*|s�37�;��"y��f�<����".�(���d�JFo��Y��.�YR��2�����2V��i�O����<�U����4~�J��Ҹ�@՗�C?Q7��g�m%8�?���u�j��QJ�.�q�v����u��^�װf���~�}��?�5Q���}��rC��M��TG{�����������p�Ѻc��;߅���]���MͿ��n�۪�_w�^�]�޳�[sy�IU�����۾���0U���C��cw�Ԉ�n
M���|��T�|l':�4�;u;�Ԟ�A�G��̰���^��^�{���'T���������A�}�y������*��xo��^�{c�T��W�n�ϾS�^���*~6R�^���*~6R�n��:?��Y��g#?V��[񳑊�
+�~X�T]�L���e|7L�z
��⇩�}��*���+���V�}��oU�����Af�|��j��	u���D#���㪌M�xR??���n�yӃe�Y�E�6^�i�����V�
S�P�����?U����:�o�����U(?
�C�,w���9�g���W_^�,�n�d�y�g>��~|�ޝ�ρ:hJ��ꨁ����&����S������hp��:Y&�"�,������H��ב��H�S<�=����0����r乑�瑾lGr?��e=��c3�I��{��/ܲ\��=q��������ԋ�PG��G��C��E��
�n�,�w�ϟ���x�΍�p�Z
��z�ms�2�����r���f�걟�f3�?��7Ǧ=���_��>���w�?'�r?�m;�7�<܅I7�/99�u�=�fu�%_�^�υ,�y��=��	o��~5߾��������-�wi7���r��
+�����x^����01����jiK,DU�&�U�� ���i���-���L-����X�Y�σ��n6�
+TC-�Fy�7�mr�ȫ����lV/Y\T��S�|�K˔jA�h#�
B!bj���
PuQ�Q��)�fP�����_��G.�>�|��W�3��s6���ù�ufNG��?f0^#D���׼ݒ
i�H�G=�B��d.���d�e�TH;��_e�O�>��V�
�
)�b��������\]p���_���/�I���y��5��V�t>.�q\%�s���*E�,��";���j$�7��
��'�P
5P�PuP���?@�h�FJ|_��|�S���F(���ug��,���uN]�,�bH�ջ�-XpƑ.����N�i�b�n�{�ȿn�4�(�{�+�XVd��l�X���h�{�n��0�
+��MV�韆o��?��Ӥ�냥�9�7�~/�
%\��8�;�|��mk��j���n?|�:>��n'�����r���7���`Y��W��N�'�Y=�
n���c���
+4Y�&+�d�� ��+_�/�@m�A��Y�x��EL�̉� ��mb
�Qe:�y��ѢxyK�"W	�׬�di��Q�~���jC_���g��5��y�6A��	�5TG
�D-�F�h�FJ���uP�P
x
��/�
���/��6G%^-��(�jEL�	*P5Q
�QuQ�f�6��Z�$��3l�A�(��S��=R�A�
zd�#��퍦���e�F��dLf��P�&|�	߄o�7��M�&\�	W��E��_�/藠_�~	�eq���}��O�-|-|-�m�����m�����k�k�B�(Q1c�&N�`9v�m$�ijِbYNb5���ӭ��cg
jN��R	5�^(�^�5��T	n
9!�H���Tf�n��9b����y3�7��gg��&��	��p�'�Ovǥ��J��5�^Gz�;_v�#��Ǐ�ب�zE�h��~�a��Y���	��d�V������Q��������w�M��Ou3�VonU�R��ƒ���%�5��V�v�˜V�p0�t����4��˥5��ݍ|bj��
�٨W�\hn�k�e�^�'؝㥸��w��
+�#^�5�N��r�l�a�&[}Z:C�AU�Y=U͌��I�%�����u�h��G��ؽ٪�7��T�ޤi��
���@'�s��\&w��������l��h"� 
M��@�@�AӠ2�)�	�
�4�
h���\)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�)�U��W��_�
+|�*�$�g�,v72������lT`���d1�"����*
+����0����_��qt���q��Q�[m=MV[-m8���H�bD0Ex֒nOZR��3�y,9�
)>Y"�e�l�X9I���$���M�"�J��{6�;y��ʰ�E���
f�H�+���+�Sy�|"?E��H'�l�| _!�oC�{Q�w%_��
n��
��iA�3�U�.mC�Z�ڵ=7wɆ4H�l"V�sR���&�b��y.�NGn��
�Pڡ�K��SvD��
9�ࣕ�$$�&A�����/�L��}�
E%-����m���cU�V#_��,�ϣ�vWfk�W-�bv��
����?�F��6�4�K6^TF���
’�b°0(<.<&��_������#zE��Ā}�G%�F��^n=^�^h�z�2a�<X�g�݃^{dk�o�?ylB�
 +������������™����v�7��c��G�f2_hv
ͽ"��t%Lu+�7���گ�C��^�'B�C�+��5�%��
���^8����<]g;�H�t����
+J��K��n�j���z��Z= F9L���9���Z9^+�k�<ԊŨ�0��  X��M
endstream
endobj
280 0 obj
<</LastModified(D:20141222134947-06'00')/Private 306 0 R>>
endobj
306 0 obj
<</AIMetaData 307 0 R/AIPrivateData1 308 0 R/AIPrivateData10 309 0 R/AIPrivateData11 310 0 R/AIPrivateData12 311 0 R/AIPrivateData13 312 0 R/AIPrivateData14 313 0 R/AIPrivateData15 314 0 R/AIPrivateData16 315 0 R/AIPrivateData17 316 0 R/AIPrivateData18 317 0 R/AIPrivateData19 318 0 R/AIPrivateData2 319 0 R/AIPrivateData20 320 0 R/AIPrivateData21 321 0 R/AIPrivateData22 322 0 R/AIPrivateData23 323 0 R/AIPrivateData24 324 0 R/AIPrivateData3 325 0 R/AIPrivateData4 326 0 R/AIPrivateData5 327  [...]
endobj
307 0 obj
<</Length 1104>>stream
+%!PS-Adobe-3.0 
%%Creator: Adobe Illustrator(R) 17.0
%%AI8_CreatorVersion: 18.1.1
%%For: (Howard Butler) ()
%%Title: (back.ai)
%%CreationDate: 12/22/14 1:49 PM
%%Canvassize: 16383
%%BoundingBox: 1 -46 156 0
%%HiResBoundingBox: 1.7343255633059 -45.2158203125 156 -0.1337890625
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 13.0
%AI12_BuildNumber: 446
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%CMYKProcessColor: 1 1 1 1 ([Registration])
%AI3_Cropmarks: 0 -45.3500000000004 131.809999999999 0
%AI3_TemplateBox: 66.5 -23.5 66.5 -23.5
%AI3_TileBox: -312.095 -310.674999999999 421.904999999999 265.325
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 1
%AI9_ColorModel: 2
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI9_OpenToView: -864 487 1 1866 1032 18 0 0 78 133 0 0 0 1 1 0 1 1 0 1
%AI5_OpenViewLayers: 7
%%PageOrigin:-240 -419
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments

endstream
endobj
308 0 obj
<</Length 5861>>stream
+%%BoundingBox: 1 -46 156 0
%%HiResBoundingBox: 1.7343255633059 -45.2158203125 156 -0.1337890625
%AI7_Thumbnail: 128 40 8
%%BeginData: 5702 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FDFCFFFD25FFA9FD60FFA8A8A8FFA8FD17FFFD05A8FD26FF7D2727
%52FFFF7D277D2752A8FFA87D27277DFFA82852522753A8FD1EFFFD05A8FD
%19FFA8A8A8FFA9FD1DFF5952A8FD04FF7D20A87D2752FF522752A8274CFF
%7D27A87D27A8FF2027A85220A8FD1DFFA8A87D7D7DA8A8FD17FFA8A87D7D
%A8FD1DFFA827F87DFD04FFF853FFFF5227A85220FFFF7DF87DF853A8A8F8
%52A82752FF7D277DFD1EFFA8A87DA8A8FD19FF7DA87DA8A8FD1DFF7D52A8
%FFFFFFA8277DFFFF7D27A85252FFFF7D277D27275252527DFF2753FFA827
%7DFD1DFFA8A87D7D7DA8A8FD17FFA87D7D7DA8AFFD24FFF852FFFF2727FF
%52F8FFFF52F8A8F87DFFFF527EA82752FF7D277DFD1EFFA8A87DA8A8FD19
%FF7DA87DA8A8FD24FFA8275252277DFF52275252207DFFA8277D5227A8FF
%2752FF7E277DFD1DFFA8A87D7D7DFFA8FD17FFA87D7D7DA8FD26FFA8527D
%A8FFFF5227A8527EFFFFFFA8527DA8FFA87D7DFFA87DA8FD1EFFA87D7D7D
%A8FD19FF7D7D7DA8A8FD2BFF5227FD2FFFA8A87D7D7DA8A8FD17FFA8FD04
%7DFD2CFF5227FD30FFA8847D7DA8FD19FF7D7D7DA8A8FD5CFFA8A87D7D7D
%A8A8FD17FFA8FD047DFD2DFF7DFD30FFA87D7D7DA8FFFFFFAFFD0DFFA8FD
%07FF7D7D7DA8A8FFFFFFA8FD27FF7D27A8FD2EFFA8A87D7D7DFD08A8FD05
%FFFD09A8FFFFFFA87D527D7DFD08A8FFFFFFA8A8A8FFA8FD05FFFD05A8FD
%0CFFA8522752A8FF7DF87D52527DFFFFFF5252277DA8FF527D5352FFA852
%2852A8FD19FFA87D7D7DA8A87DA87D7D7DA8A8FFFFFFA8A9A8A87D7D7DA8
%7DA8A8FFFFFF7D7D7DA8A8FF7D7D7DA87DA8A8FFFFA87DA8A8FD05FFA8A8
%7DA8A8FD05FFA852A8FD04FFAF277DA85227FF7D2752A85227A8FF52277D
%7D207DFF27202752A8207DA85227FD18FFA8A87D7D7DA87D7D527D527D52
%A8A8FFA8A97D7D527D527D527D7DFD04A87D527DA8A8527D527D527D7DA8
%A8A87D7D52A8A8FD04FFA87D7D52A8A8FD04FF52F852FD04FF7D2752A87D
%7EFF7DF8A8FFA8F87DFF7E53A8522752FF2727A8FF52277DFF7D277DFD18
%FFA8FD0C7DFFA8FFFD087D527D52A8A8A87D7D7DA8FD067D527D59A8A8A8
%527D7DA9FD04FFA8A8527DA1FD05FF7D277DFD05FF7D4C272752FF7D277D
%FFA8277DFF7D27277D277DFF2752FFFF5327522752277EFD17FFA8A8527D
%527D7DA8A8A87D7D527D7DA87D7D527D7DA8A8FFA8A8527D527DA87D527D
%527D7DA8A8A9A87D527D52A87D7D527DA8FD05FF7D7D52A8A8FD05FFA8FD
%05FF7D7DA8FF52277DA8F8A8FFA8F87DA82752FFA82752FF2052FFFF5227
%A8FF7D52A8FD18FFA8FD047DFFAFFFA8FF7D7D52A8A87D527DA8FFA8FFFF
%FFA8A87D7D52FF7D7D527DA8FFA8FFFFFFA87D597D7DA8527D7DFD05FFA8
%A8527D7DFD0CFFA820527D5227FF7D277DFFA8277DFF27277D522752FF27
%52FFFFFF27527D2727FD18FFA8A8527D52A8A8FFFFFFA8A8527D527D527D
%7DFFA8FD05FFA87D527D527D527D7DFFA8FD04FFAFA87D527D527D527DA8
%FD05FF7D7D52A8A8FD0CFFA8525252A8FFA852A8FFFF52A8FFAF52537E7D
%7DFF537EFD04FF7D527DFD1AFFA87D527DA8FD05FFA87D527D527D52A8A8
%FD07FFA87D527D527D52A8A8FD07FF7D7D527D527D7DA8FD04FFA8A8527D
%7DFD44FFA8A8525252A8A8FFFFFFA8A8527D527D527D7DAFFD06FFA8A852
%7D527D527DA8FD07FFA87D527D527D527DA8FD04FFA87D59527DA8FD44FF
%A87D527DA8FD05FFA87D527D527D7DA8A8FD07FFA87D527D527D7DFFA8FD
%07FF7D7D527D527D7DA8FD04FFA8A8527D7DFD44FFA8A8525252A9A8FFFF
%FFA8A8527D5252527DA8AFFD06FFA8A8527D5252527DA8FD07FFA87D527D
%5252527DA8FD04FFA87D58527DA8FD44FFA87D527DA8FD05FFA87D527D52
%7D52A8A8FD07FFA87D527D527D52A8A8FD07FF7D59527D52597DFD05FFA8
%7D527D7DFD44FFA8A8525252A8A8FFFFFFA8A85252527D525252A8A8FD05
%FFA87D5252527D52527DA8A8FD04FFA87DFD06527DA8FFFFFFA8FF525252
%A8A8FD0BFFA8A8A8FFFFA8A8FFFFFFA8A8FFFFA8FFFFA8A8FD26FFA87D52
%7DA8FD05FFA87D527DA87D527D7DAFA8FFFFFFA8A8527D52A87D59527DA8
%A8A8FFA8FFA87D52527DCA527D52A8A8FFA8FFA87D527DA8FD0CFFA8207D
%FFFF207DFFA827522752A8FFA852272752FD24FFA8A8525252A8A8FFFFFF
%A8A8525252FF7D5252527DFD04A87D5252527DA87DFD04527DA8A8A8A17D
%525252A8A87D525252A8A8A87D7D525252FFA8FD04FF7DF87DFD04FFA827
%52FFA82752FF2727A8FF217DFF5227FFA82752FD24FFA858527DA8FD05FF
%A87D527DA8FF7DFD04527D527D5252527DA8A85252527D5252527D527D52
%52527DA8FFA8FD04527DFD0552A8A8FD05FF282752FD04FFA8277DFFFF27
%53FF52275253A8FFA8F8527D7D2727FD23FFA8A8525252A8A8FFFFFFA8A8
%2E5252A8A8FF7D52275252522752527DA8FFA85227527D7DFD0452275252
%7DA8FFFFFF7D52525227FD0452A8A8FD06FFA852A8FD04FF7D277DFFA827
%52FFA87D5227F87DA827277D527D52FD24FFA87D7D7DA8FD05FFA87D7D7D
%A8FFFFFFA87D527D527D7DA8A8FFFFFF7D7D7DA8A8A87D7D527D7DA8A8FD
%05FFA87D527D527D7DA8A8FD0EFFA8277DFFA8277DFF5252FFA82727FF27
%52FFFF527DFD25FFA8FFA8FD07FFA8FFA8FD05FFA8FFA8A8A8FFA8FD05FF
%A8FFA8FFA8FFA8A8A8FFA8FD07FFFD05A8FFA8FD0FFFA852F828522752FF
%7D27275227A8FFA8FD0427A8FD6DFFA8A8FFA8FFFFFFA8A8A8FD05FFA8A8
%FDFCFFFDFCFFFDACFFFF
%%EndData

endstream
endobj
309 0 obj
<</Length 65536>>stream
+���}��f>{I��X¬�T�b�`w}lʪ�	v@c5��[�jL���Kز��U��1Q�u/���vF���s�
�Q
+͹h��^�sKo��Kn�v��/��'���i!)��OXvg��!|_Ǩ����
��VքO�e_�blH�����O[S6E�H�n�s�%�+@ѻ��Ok��M3<qÌN�sқ��LD�D,\��JC�����}j����p��ɿ<�Vq
��O�.؇ކ�-�o�-Uo��g}�;�=u���~r����/�L؞�G�w?XPԾY1!�fU��
�j�����)9,r�K��e���9�x�À.
3�mŷ���?Bh<Љ4r������k�V��S}����lN�}Ф��]uO���U+��l�@����Q��O���PBz\�CP�x��򱿧������>ݪ�<Ʀl��5kfJu�@�^��V�ԲE��(h�p��K������И!T�o}��Nh�Y��Ovl�d����Ԃ��w�t at S^~�Q?��u"u߃��:FB}���N&*d��Z���&�!��l1|� �7]��%
$*4z��n|
�Q�X?�="+�$*���JPن
Y`dĞu��/��*��%����]7���8����ᬂܫ!����mӍ*[�4ƮZ��+6b�_��``}�ˑ�J^G����$W�m^(�2�8��]��ix3�(�h��Ҳj����
+B澛\�k���
�
+���`.aݭaV�_6F�y���X;��
��!��9 N=�ېsEO(�;&��?)ixR�ޭPف�
��֌�9i�J,X1�S����E�b�����y�N6b�hO
>�#�ly�U#�xZ�1�M������~H�/&r�_���
�����S_]��j����^��qq��a�
*�4�$����Uz����Bw���N|�Lg�S;뺇�pN�����W?�Ig�܂�i/�
++����	:�5�w�
��%C�L� ��͔��]Tu[�gwC�9+1�����y\�x�H(<�����ѿP2ߜU<1�
+��_�@$>���2�w39�����+ZXҊ�6=�����K
xy�]'��ݲ
"g���qN�\;���<lU24' ��i�m;�AuC̢�.zY�
�5�+�f¦P�jbε�~t���eԽ
i�z� +
_�W|���@e�q�>�
��
�`s�ִ�@�)��,��qi}���!Vm�
�A�$�',(1�
���]���W��v��+FFMP�A^5�
P�&zaou��*L��Y,fE�(߶��6�����#B���JX���B&TΜ
��$��01��;�`�t잟K�p���J��Srg�y�J/�0#�y�mFe�1	�jd�� 8r�N,[6`R�\��u'4}V��!d���Y�u3��(G�����'A�Y�v_(����$�����m��%
)w�D*��آ����\6͏IQϏq������14���ѼC�O��ɮ�;%��#�<u���ؘ�G�E�g�_�������-Mgz�%�Ҏ��^J�
+��*�=�Vxu���큇��kt��y5,����0������^&r�N(�e��|ޞ��wg�G[�P�W���9&y���SPr]M̻ �T����"���6ӋoIޟP"�O��F
���b�V>
�F%�`QG��*>�9�U�~BR��G����0���rs˞�����vc�
b�;l~�/��g����yy�㠪��Tw��^Ы}�oNxZ+�ʙ7��8�K}��t7�WXs׌/�[�*�J�~w�$�zX�
a��n
��ŝ̊�{
����T;��
U��
�Ź74���Š'��uM�sZT���q��V
u�&B�]亁T�k��/�?2Sc���_5��d��7S���Y]세&rQ
+{�,bI�oeg\�{�󂌒5Ҏ��u�RV!�F�u9�Ϲ����G�i;Hڬ���1;.6�/��Y0U 
��}� A����~L0�+FD6�an.�a�v*d]����cϛI�w��Ƞ�$�&��D�e�bU�mZ5��jf킊����$Z6yn �18�K�
���؜np���×qN˲��x���3Jn�b6���}?�;�@�>Rph��6wi���HKʭ�P��U:}�@�8I���X47��x0FE���ވ-��AbV��u�L��=/��E��0@�6W�9L�>��v
�`����>���}?
�J��,��8��c�'�w�I�:J��q�Wu��5���z��
Aͭ�a\�]BH�a�
+rn��v^��|i��Ŭ�ᕿ���Xg��Y9�l\�/��!'��������AEӛ5#"g�K�
�y�ֿ��6�Xu0@�Nl��"
���}����-lx�uA<y�A�^T�W4�d+��z7,�tGc�I���\=�
�I�ɺ�5EX8MQ�VHDP��X1Q�燠=��
	��Bok���.���kZDꦉR�p��>b�X.��~�o�F�ڙ���<4I�����7*\�

�����#碞�sN�7W�
H�Ijr�enѧ㔌�ǰ�o�aߜ�%�?�/J:ߏ����I<�-�9�"e\c��M���]O�=%C���Ħ\u����
is
"��Ͻ���8�_�
���h~@ӻ���Kvz�%�hr�TP��򬷫.��(�� �Ω��
n���wg%u/~6`b��
r�U	ת�
��%d=�2�sBJp�������D�W?>e�����(|Q��*|f�/���
�������*�4��,��jl�iEӧ~b�s92ႁ�z�B���OڵaKBjD�
 PZ�����
3�� �U���2�մ�
�a݀˝���Љ׈Iw�)��O'@9�}�o��G�{lڞ��4rg�M_�Sa6^��e
2m\��t���-��;ىW�*�n[����˖ԐO �_�Խ;�A�&T�D��XG��e54qӂ+�s2��
��x�kDʦ
W�y�A�6�`�3��;�����N��_�Y��s���,�z�����8����~v���Aog������d�o�TMQ_Lj�~5gIM��
2Vu�ڠ�6�S}?�Y|m�����
;��dx;��fz17m<�� �W�s�ߚw�-Ⱦ����l;�M;n.s���
�|2T즛�K���x��s�+�죡ם�
�s,�9^��U-�xNEȚ聿�p*o.�4�Y��Rf���{yWU��5��
��
ssL����DW��Eem���X�>� �
@߭ �����x|eȄ˚���Ot�_.��j��<lܾO�_2R��l\�S at _3��L���An�����DFL+i>5�ȇ>�����N��T&qZ�����m̦�jT���排Rz��������ѹM*0I
jY�͙̃�[/6�����Y
~�smV]�: �~8�8�i
��i!U��YNi[�Treń�ٴ4�����y[�.ʡ��z�N�ɿOtՅ�R��rc~s�ϰ��OW6����;~n�%��iZνc��Og����FR]���҈�;v4��#��x>іw��J�����q��4���g<?K�	?��GE�!�]亐��� 2�wN�����'Ǧ�%ϵ���
o��S���y��m+� �&8��W�@~��>>�%�^��xM*zq���}����������A�Zai#]���gg5�Lt��˙/��<#�?�eBʊ��E����=������Wa��ϠR_����}�qY?���o~.{�K�m��E����]�ҿ��y�ʨgଗ�׬D·�N�י��Y��7����U,>�pb��iO	yϖ���E%$:�E�l;�EnTο~|Պ��fc5�̺@?�Ӻ�ۼi4���{��qq�]=��
�zf���u�� �;j�N�ԅ8�u��T�W?
�-���z�y#�tBM�Y�
+�K���	��w
+w\B涙P�cBgzU[D�
����a�
<�z<L-��[��Us�1��d{΃=��r03JT܎�\��—~�P�'i�
?�9hBd��W<
+i y�.|���j�ʁn�8���h�<�ov�t�:�Qg���m?��:���
iV���"S�����Q
+48L�
@F�H��
*N՚E�z47cy��5Ӌ�hҥ����娌+��������Y5�xZIL[0���&h�Ȯ]01*wG9�����xŎ�4CS��nXw��|
Ԍ��=o��-[�{��~?��e�k�Xh��
�Z�Њ����Y%.�Ӈ~��7�5s��j0Y>q�C=)튝QpoT
{7�OʚR0�F�x9�>^����y�a�M��K&l֜���������vf����_0���fe�1��2�[�`������魆�sUO��Ů�4R�
b�(��UP�qmS<�S�p����t_sԜ
�:!ť��(5[
j���j�T~�f�j�w���9U��i��4��R�O�)0��Ie��̘�q��3
�7=��s.v�EoKEx�����[<c!;����o1�����Apĺ[�b��j᩻ ��	�^%4���Ly��[v"��,q:�;C��w
Y���@G�����~ln��''k�]�
!��X����+���@{�U+&�̾��^�ӧu��
td�ʨ;��#�8��#=e�ߴq*
��Ē�!ji����W�b�E�
��[�AcW���%=�p�*"�8�[Cn�t�����%���J<���.j����| �V?

վZ7���t��zŽ��sc��
�OS��Og�E����Y[n&f�Ī�
���y��Q~�I�Xuኖm��iecĪ	���F�:��3T�����T��/��iu&Z���Z��A^L]0&��j{K}����e�'�2�~9���ԮX��zbV�lf��z��f��N� 
��e7'�K�+k_���{�_m8h�Zn�#
�����7��l:��}���h����Ԡ�1��7,�%
^�0�D�
���
+�0 at A|�$A���
:wo�X
�gœ�>�E%o�PY3�794*h&���x��B
��^=���f���%�lf6,h�+6x�K�|��w|<���
Zmk���9G��k
>m�J�
Yp�!
<qˎ��r�H�V��Q$b��G/�2bʢ��;=DH���'�ūnsJC)tu��-ک
F	+h� \�V5��&�kqG{���Pw��ft���tT�� U���Ԑ���q�f��u
��b@]���s@\
+�%�&l���T��
�܀���`e�V�B�N�uਯ^�J��z��wNг6��26ԉ�k�
n9:fXR�xF���8ʁ�eq�ТmKsʦU�f!�����e]�!&���
Z��4�g�qs���6V�y-&���ry
8O ;A�fF͢���7	�! ��X��%
�j~���EG���E
�hL����j��Qೀ&_��VM�: �4l��l\��]D�4uR��Fߠ��Wv���:_+<fY��ڴ�k����Q5G�-�­M���M�
�I�i��ᖔK��EW��E����l嬍�x�
2dc�V�٨'
�Ҫ�l��

�"2V����!B�q�qb��lز�1kfæ�ּꢀ팆+��
+�DŽ-�~�-ԣ>�;.j㞇�aa��Lؒ��3ч�\
bT-�`w聧���xW�
�k��U�F
��
���ߜ��'�2��vRu���ո4���h����
��~j�'Iڼ2V�� ���t���L��0� o�a�[���m�p�G��v��&���A=:��O�y�%[NB���_��X5�'�a��Z�Τ�g��c�\̶O$>
I��{ˎ=�U��SkM��u��gTќ�쩊^&�W�4ĺ�Y�k*h�. :Dͯ�bd⦳U�``Vͪi��zz٬�R6gdC�m�yG�hZϭ��Q�&����a�m���U4K��4Ȯ��8�h��
�D[G5N�m��I�x�Co����Qz�� /y��
?���b!
���crTފK@^6��7 ްb#U/����f:x��ַ>�1���-:���6�ބ�s�O���H���'���8u4sՃ��g�U�}���m�U�yJ(������f����|r�W���6]�oSbMЈʘ��� �c��9"n�+�9��������s���4�!kVfZé����y:o&帄��մlng��z$[^
e�
M_sP*��9$�h���w�P��i�[uKT!W�2`� �4���>V��ZP�ig��J�E[aZK+Ҋ��:��&TԲE����D��f���X��_�y�
����`����!lb���V����
�V�وM'�7�d�zI�#
+|��n�B"�4B������g����
��<́�y�����)~ۆ�	�
i��
�6|;�'
A���������YU�i@[-[�8��Z0H)�0'��f�#�4���~�+W{�@c��vR�|^��*g)UA#|T{�m��:��
+��\̂E ������-:$=3!z�.$��\ʁ�A��bn��Ӣ��f���\LԪ_�0�	h��M{�����������6�GZk��U���>ڥZq�@
tYޤ��2�%��-�
������T|_N:�` �6FZD��fp���4P
+�

�2�������x`��*
�|x}��g����	S+&�o���ЀJ&�4
�je���
�|A��^6`�=
�O�Y�p	#<��l�ck�+��lN�*����;s"��$���!歔��)70$h2��)<P�@�Ul���c,₅Z��cV�l��0�&�e�7|��1ES�!|�po+�f����M�ۿ/������iА���
�8f����!b�
����;�kٟh
�k�.���9+!�E�_
�m� ����Q�����9��<��.�9M5cjH���A�g�
��=����faW�􆣜�5��lX���v��Uƀ�\���zb�D�
LH;~�!�P&u�"���㑰S}*aTx��.����A���{�Gx�
 ��^4��T�j�����CIq��=[0 җ���e#�~��'L���
�_�
h�9��ܬQ™���gMܦ)"~f��0�����Z��_�q��d-
v�6
fH�'\0w2�u��%s���1"h��@
 ����
^s���ȹ�Z��0�q�C��r��6(0D͝3��˖6ڤ���o���i�կ
���nn�ń���!R��ͷ�"�Q��q}�OE,�KV\L享�u��B�upR��mY^u;d��%^s��+4 �E�[�
��q�[
6iAK���k��6�>�H�'Zz6|\jh��Z��A
�p� OX=�9��
��b�X��;:8@�
+�f�l
���I�5u
�M�ݖVv&���ҤV@ؘ�6 �ߝm7�ζ��9t�fK��ʍQ}o���
�W�;Ĝ	K_��p�f�ݫ�2�u���U���T�P�0��Yi�^L�1K�]��m���x[�Τ�3��6ƙ��I�zgJ��]�tmM2h
&xƼ]�rHfv������&T��u��C^6z�ɂM��1�do�˾5�n\�ɂ^�`�L(^t0�!_{���[�?7`�V���t��8
�;!Vo$�)-!g�Hi�
oWo��;�lڂ�V=6�K�s�뷧i��EVǪ�A\�w�[d�c�֝	b�n��[qw�}�^��_��t���Y���{9.�ͩd�)7��B{��$MH��D
�����Rh`�9��ñ�θX���}z�C�ͱ+eh}�"J���;V&5?��l�q�[7�
ļ�_�wTY�}�z~o��ߗ%�0
`K
+�6��tv�6���Ug�nL#�9d�0cw�}@��תZ���Vi��׈
Q�ԞAˀIja)x�J[�Al$�'�!
u�3^����&�����S�� �8��LsEG�B�m2�����!/�TԺ�[��L̊i
&y�L�Xw	8+�_�5b������$>��2
+MBHҔ��7�`��|LpX���)~̶� Cm
#��x�Gg���h
Q2K�"�sw�)��t��=m�!
�1r=b꜒^��M{>.%��1ٳ�ĢM��
�-<ȴ�
>��N�YUK>r�F��~֬�Q�Q�7�j��MV`��,u�z����:�L�4��Y�n
����I
�=��w��-
����Y�(� �]r��}
�:�%B
&|�
p5� 7���Ye^���&��m�%
+��hY��$��
oT�V���D�S�[kgtBH�!�.{Y��aJ�������X�`1WF��%Gg�)����X����2�Sm�u�O���i�S�
u�+��J�u�|:`$��1�+�B��h�nc�tw�Ӻ=�&ߛv}��w.���]�H�(��	v�8��q.c���>i�m��3R'�������U�
g�E�Igi[6�'���
[�
��h�x��GM
wq�F�� 
���c�.�;���{/�H�U�*�!����# %w��[�Zޛ.�*��ޓm�h�

,�[Qk�~���p��'2J�rL&��J�� |�����I0����6u�S�]�A5���~�-�C�|(/�^�LG\�������S��S�\}�[����6�[�ɷ�z�C�z�L����z0"�!�GҼia�ӺDM"�-��|]U@�\]@��)	y��ӂc�7��g�����Tq�U�]Jh�L(�
E�l�p��Ff�P{_v/S�E
��f�Gi��ZMgw�G��5�%cFu����A� [...]
"�K/�������G��hC��)�w<����*���f1�Υ�|�~l؃�O���Q��{�8��
4a����m�a
c�H��6�*<&�P�����T��vU���T!�h�Y�6�#�~�-h~�\JyV��{���^�]z��{@ȊT�[ˇ�H�����.�*�Kv'�-_���
��L�is�ۺ��Vθ�D>��K��ɻ䥽���C=���
V&�JQ���-��~f�����
���'��EW�Ц�wʕnv�l�-/VcȞ�
M�+��*���|^:�Tb
���L�ټR�/��®��9��m���L��{O�ў9���LZ�a�M���e#�x!�&�/ s7RP�ct��&��K��oc����Jo��t\*/�=�W,9� �<����������FW�X��Q/[quI&���1m
̭���a>�g�Ş�DPf^�4[�d��ZX��GY����ޓ��`�����
s��R؍'�a��}
�6��ti1�<�wK�.I��	��.
��h)�w�K:�\6�
M�
�`�3���`"�C�`��YdC&�Q�G�����/oF��G��V���K����:��)�ip��.YX�-O�:�Q�[MfM�ԇ���
��M]=+$I��U`O2
�|�5�@r�W3OU�`~���]�H��~�0����»=YV/�qOA(��@��:ՏH�����;��σ�K�˰t�ꆁ� �]u"��a�B����ϟ���+��S�{�ɋ�KWS®��
+{O=v�Q]��(�	
������1
v�{;{��\�['�
�<�
}s�p&��݊I �z���d|
既2ř�|���?Q��Z�6�p,2�}���ڰ�Ḱ�r˯�&�u^�L!�i;��F��l����PJ��
?��>WJ�'4�w
+�.W���ց��	?=}Rt���谇���^F@���Qv��ݰ�wS�U7��|Je����귴t�߲���ਸc��o�˥M脍.��ۤ�I��#=}� �K�ƣ
�2�x�}z���z��9�UWw_�~Wu&#��GJR�_�yw�-슠U��w�����g�a��sq�������Z�o�������5��|Q��_o�
>����=x	�r7;,5y�AT<Wt
��;����l�JI�+lDA���$
+�Ù��M���H�Ť�֟�~���%���e	~z�H
�^�'p���
+�A�=��
{��sE��Bo���!����]�y���o��T�彲�br�?�
7q���#���[|����J��[�aw
ՄE'0�={O
+��iS؝pxXd��XD������o�Yga��J���Gg�]�t�zXz�KC��u��G�g����g�����55���ç�a�_��Ja�
�%<�Ǎ̰_~{���Ұ��谿n�
{�������5k
sI�����
�rD�4�$TM���71����#7��7k���
+%'?&rN�du����>v�Zrؓ���ϫ�.^O;�6
+r���+�P
:Z+6D�#���*���1��8��R���D�O=y�>�.<��!��M4�Kw󏽌B
��K	���<�i,�Xr��dV��w8-��e.V���G%���n�٦S��ϐ��+�p�t��W�_�/�<��
�ĵ{e�n=���v�E}؋��/�'���'�j���缶@A�bSk�cC��93��#'$ȅ�|���şI/fC������R�'�;

�9�*�v�IC���5 �a�“�a�#��/= �t�
�xB�◌z��E���"o���/�P�
Fj�K�^�#T�����q�SEh�hx#f�N5r�z)�~.5��G�`a�#��_}$
;w)9�����g�N}L@�-�����z�s6aH�[+�`��Hn�d)Y4�g��W†�$��~�N%��H��|�A���
+���7���b��xh�Y���Ȉ�V!||��1�"g:Y�j�����a����t�#(Z{�j���b�����a��S�e�_c��'_�N�$3�����qҧ�vλ1%=eVGL�h�
>r��m4��)2i{F��fu�bi�����8�(�Vu�u�ק���D8���9�Z����Ar������(����\�D

:D�ks�o�9֩m���K�;%F�X�l`���
���r[{��:�,
+{�i���c�����
{�����!��^$
+��K���A��d�#Ǩ��,�:[�Ԩx�
�ʫe��Tz���[�꟮A�n��f�W6Y/�7��H/j;}�va��;%a_B�n<�
+��wvX�{ı�lщ�"�
i��p_Gɜ�Q�d���۱oM�>���fr4o��Ď�|({6��RX+�V�����J���0z:"v,)�2���BjU��&��k�О�?�D��;!�V����=��?b� 9�
� �%�Qٺ(2E���R���J
dV��I+f��*a݆1�Q`��#�i��T1Z��ʡ�z�����3����	y
>}d�Q�h�H������J�h0�T<�1̯sj�nDg��u?��˵ǵ�^�aO�u�_�w��YF}T�|��4��
���eJK̚
�{�b+�G������ںT
�@:RK�����Q�������J��{/��9����j ��G�B�c���'���f�A�-XZpN��ˤ5�U�Zl�T_���(�m
�9K
z
�
>���o%r~������ϿU�}�ah�m;ů1ʗ��~@�G��������d��
�R�Q`$]�YT�
ʼ�M�7S\e���i�g��֫(������k����<y���<�S�`���y�u�#��
;:gQ�K[��3�Rl�U&(���!r@*/�vkJ�:��
�6K�{
C��#1=���[�P/�|���ORJ�j�
+-q��G�t�H~.4�̛�ҡ�־n�Q�o1��C�xggk,���
M6?�C�
�u^���:�R����x���d�����㟊ZN%����ݨ8&��{z��a��uT�o�iР
[����l��p;Q�'L���JmUL�]
eX�'Ns>
��2��.��:v�N~؛h��ɨ3E���aP�
E��"�/�
$gN* �fR邎Q�h�}:A�RB{�?����uTwJ,�]�Z�TS�"�'���h
�,0A��ƿ��H_�%��
�`�Z�Wa��B���8
�}�N�w���u�#
�R�l�~�ިm�մ���bUWg���=���']:���*t�ށ�j�D_ԣt�
f�Z�[��@���Ӌ�m�]�Y�q��Go��f��
����%�F:3�Ne:u/�ww
�W�(�� $!�� �	���xp*3��޿��x�O| z]�yH��:u>dw���Z�����ueG�z�=r�����������{HP�{/J�2F k�e��$
�?��.K`�K��{D�ͽ��ݣ��s*����Ǿ=�/Ǥ��T�w�}̻ޫ�5|�TJGzS�5C�㐮>aa��"��K��j�$c \ͯ켑XX�0���my�# +�z
����P)����9z��8��8݂[u��ڡ���J���멚x�5�1�5�)*��UL|����Dh�Ak�Ֆ��[��η���T�VoN0�w�*������#��kK5�%���TQ+A63�16>Y=��/C�ݚ4?�Z������>��e�-����=UӦy��.�4
��<��Ձ��^�}����.`�m�4B���ɺ�ڂ5Y}e���6�Ov��oMu�
��˧�І~��=�4���P��y5-��ښ�
�vO����6g�0�vP��
�Hڈ���"�?_6�^:�q�h�}<��^F��=��JC��'
V��چ���'�:{S�>�H��;��s6Ek㮘Uq�o��5�p�1Y
�O�������a���<��ՎA5���
�n

E�ȗ` �%&�s���%x|h,����ܝi~�KŨt)��c}]��䍲)�7Mg�U�(�������	yɆ��� �c�,u���5�ԓ܌�f���97�O�IZ�&�Z����l4w
��
�n��)�'F���������z޺��K/h]��ip/�u8t��l�V�]�Xc��f9�lg�]�)k#n(6��<�Bêᳶg�E�J�"'��Qo��/}:6�|�S�
\kװ��2^�Q@�7�1�
+V��|�t�x/R��8?]��
�G����Ec]وٚo@:��m�[m�N-�Ҧ������';=�í^�g��Ǥ��)FK��K f���n�h�<-6
OIk���
�`�(����Y�Ֆ6�rc�I �\h˾��[�%����n.�''��Z�{3܊�q�CWɽ垪G���
+��
��-
�^8�:���O�L���<~f�_X%���9j֖��=�ο�ه������U�
����S��z&ʦaA���`���@���X� z��"��
ȉi^
�«aU��
�IL˲��U�.�)��\����SK6Ɖ��C�ȵ	j���&jS�,ڞ��n
���20C�*�Ǜ��	���o�bC6F�Q�n��xM�WA.��Ш��C=�RP��e>]-�*�#�B>hm���:J-ٚ$%,
 ���Q�1z⊤�� �BF��֧8�6y��e��ͮd��3Uov�s﹥�|����d�����1z�3��d�'�QnE
٧on�-44��5�yz��|'�(�P��z�u�¶E�p�\�&��w��<���j��>M-x��c��\��4)�Н�h�v�L���x��S�:^�
+9\�5y�y5	�7����QT�WE�;|:dm���-s��\�S�I�w����0�F��(H�_6��Z-sE�.\p
O��
�$�����'�
����;�}���yJᑾ�`�0������3��%�5�6T�p�c��́����mԵ|Y���h��U>�l�[u��ܵ7
}�֕{{���i����
+
s��2�Z���9�?�-���

Rl��DI��h�
� ��t��Xa�?o�]
�
�Yv�U�E�V;&}��r�F�s����`Aׄ��!�h��5l�vwo+�fy}��
��skN���c=�p�$���g{
򝡊N!5���Nb��F�#��U`��IqI�9�qJ��!f}&����J�.Y
i_H���EG����#��P]��?		W�f\o�x�7em��K
u�
�r�T�c�p����� ����Q�>M#�:˂����s��GI/��I9֙������}`�v���f!9����>�0 
��@�I�C���!��N��8e���!D��
t�,$����R�"R�M�
+]���u�����NJ�[�c�S������w'�.9�5DI�
k�v��!�il�_FL��SL#���ˣ���z��RS�������R�:�-��$�d��Y�0R�6S�� 0Gdk�r0�9T�����x�8/�l����J��P��s+��ux�41�:S�R�S=K�T���j���Y�0)^%��2�|c�,��ԑ�=
��̡�
*)����b��
%˥���"b�_�@�Y��Rx �'���_�4�׭�z`��
�f�o��ͭ��y�UR
k�⓭��d�����S�L܎ ��t�S��Q@~
&�#�g
����D�<9�b����zC�i
�'$�yU�l�o��B�{��`R�c�н)\쁔V�V0�}
+b�e&�\Ϭ:�2�>�>������+|�3R��O3��|�Ͷ���L��,������Fl��d��s]*R~`���Z=�)%e�
�E�b=J"�t��?[�V;���18tmgS��k-�_LmG�-��z�Kϫq�jʎH��u��x�<�^kn����ޓfa�_�G�A�c����
�yl�W
��%BD
�`c���/�PQ�Ͳ�_�g�P����cn"�oA
�Ǡ�,���IZ�R7����k��w�n��X윃G��%_�7$~��.���$!�-�l"�[�8�e��o{��N"b6��"V�+�uB�:Ұ`GZ6�2

5
e^�
Ϳ{ ���e5�>��3�K�	Q��9.��xh�kA� ��
]{Ν���[�U���O>bb~���:��q�-ٿ�Rc��$D;C��~�%���9��iD��
=�I�r(�B�z�}
+
�7Z��ؑ~OӐt�В��Jg�
��Q�+�昁�lWǺ���	d�}
bT�L�f^��D|g��^hi9Q1��
�,�'\[�sͧ ��h��G*r�WF.�pp*�	Y=���rad��z&�?3z头#mM��($h���*`C�V���CB�Ǫ^��o����R�[`��
�7G��z�|��靫�rK��ݳ���$�>��w��<֓�'�;�a�bl�W˂yTԊ݉�����{k}��W����,jlWE
i��'jJ���
6�HKm�=��brΖ�Z�2zفo
��ا��
��
u��Cv�*���
`����Q�^).}���m�*vw���sq�!T�MTD���=8��9~-s�'�{4�D�
a��	~=�ħ���'��OV���ku<���ޝD�]�P��9
���k�W�k��X��E2�t��÷�#;������|n�Z����ʗv	&�1��K��!�����C%�WQK��	P�C
Y�ɿf�,�}{�:�!dX'�I��� �
�x��h��u�|���D�\~u{y���,���^)ӧ��;�.T��

4�D�N��c6a�OT,衜Z�?��H�CmS�O���S��;
+��a������̜���i��
��ER�_��ߟ*�֙��Z[�/�#���aZ�J���;�~�'@%�O���'�C�{AwW�+_�����>؛��"��Sr
~3�/�k)�å٤��ٖ�ø��N9�|�������I�ԵI�

���G������u at Gi��ҷ��;]�#VʟL�����2~����D��<X��-%�� Nݟ��Y�\�

��̈D̗?����;�U3�2F�� 1kw ���j-���ƻTՉ�"�o�r�o�Z�.��&�C���	��o�߱�W<�5�]�e��h姦����̟wǐ>9��<� �3
2
�=�
J_^(�'�W���¦9Y?Z%��#�Q��Mc����i��� �d�s�<2�l�Sw�<Z�X�y�C8���Z+����c�L}Y7�S%A�\���P��_EF��Q[����#�&�&|�uo
�w�][~9�յ�7���Ρ~Z�AlH���xEB��^�K�~g�&��z�>
+�Xe��n�6ye5yǪ�'��K]�׷G
+S�

�;MHv)�����d�����
�g
k����s�S����<�_l�p0Ϭ>�Ѫ��H^-�§&^ɠS
�`g�$h���Α�C
+�L?�4
5�+'el����H9.9�)%&;D�P�de��-��,5�_�Qr��Gt�R{�mݻ���M�׌�Ї�aB�y��;B��6���}f�½u�oM#��:R^lK�yg��#�%�)�h��Y�3�z�Qӝ|����!,{ꕂcv�@A�����k�~sɘ��A�˝�+�<�)AE폃���A��F�1c��+���o���.	��!�d�F�!����Қ�ow�+�
�GY%7�I��_)����
��%�G.wd^Q5�]�c�_�6��=s��
�
���锐3=b.�5IK;�1Kl��9n��S���[�� �
nVGkZ2~:�F��:�&�z�kL��ћ�|_P��_vo��"�T��mv6,u��-��`Q�*|��
g��4��>������:����
��@��
��\S��IRЏ{Ci�<���TZރ��o�}ul�����iZ���ԇ�P��C����e
p
+�`s

N���j���v?�bs���׺��*j�|?J|�Oݻ�_�"J��Wt]�	:�4󎕌J�
n�K�:M}��������vyW �q˰�����:jձ����= �m��H��"n�3㚐�tէ�)�@ެ���f@^�U�[&Pn9:uO�I
����P�_@/g�d��͡�G���G;�>;E�h�

+�o\�}�n̸��!�տw���U*
�痁9����h�rn����� �i?���r3:Y�2�l�6���������񊰽QP�g��W"��f�ݠ$6(�!dڧ�.�����%�)0��V����]��;Us���e�_
��R/��
;�0+}���~5����
��3RpK��m_���3��n}
�I��^�)��;AI�
�G���)��o+��*��?��U�ݛ"'��*
i�򮹤���1R�u
��7��j3�>
x��R{���sf�Y�iT�jo�eC��o՜�-�g_��4�"�~��
+�l�i���Y��$-��w��o�A/�&eg��: )�+�-���
��X�,���M��ؙ������$-������0�3��G���˦���!:�9MHs��6!.�!ǘGK�Z.zk�;Mͽm�G�
^�4\�bg��m�2�!��T�&_�&F|��AЋ͞�[c��_G�a�����`Zj鑊Q�9�y�o���`n���BT�c�*d�#ﶱ����0
�qZ��rc�c�&wW�	7������҇���[���Vzʟ�EL�}���uB�mt&5��J���q����B{������E��RZ�k�&��`�cٳ�������'=�7�c��iE!
my76�����Z�����<7� �_=
b�@��
EE: oa�=�E��l��g�%�	j�冂���w	%�{-�k��H�
��]u�5v���{���=�"�NJ�9N�u/�g/粚�~ٯ�r�C~�Iz|��WZ��\um������͉�+x�؅e�l1	v)!٧bB6�*�o�?��-{e�L0?r� [...]
��!����Ӌu{����儔�d
�7�K����>
+�YD��]S5�CfyU�ܛ���k��oF���P5������4AK�	���d]>�֑\@m����

�
o~^nϾl�(�u�
toG��Ѷ�=�FE��a��:
+�������p���
=��g�o�Y�����bmK�����;Bv�VH̏�ؘk�=��)B�7��43���Ib����y<�o����� ��c�
�]C�Uc'��t�
<�G��=4�C��2l�3��ZO�u�X�}��:�����0�o�w�
�s.u>4����>����kG��6
zڍ��~���m����Q~�6R��-���^;��k�2�F�������[�
+2�3O*��V�y��胩�7�^e��o+�
+ot�3oMԤ�����o ��8UR������>X���������?C-t@�/���2�=�4��\�)~t
�!�����Zt
X�~
d��ǯv�Zn˼llK�Q]��R[�/f������*���

���8*�HK)p>i�}�eC����O采�e\��
%{����pM�u�{p�V_u��2x�#8X�R�����^\�o�:�4���3.
�1�6;�
�Ǡ!�qh�U��h�E_7�%84<Ž��i(�]Ր�l�����Py�c�<��"��
&�<��uə` �
���.����Js�o
M�w�[s�8E���4���S��~��=Qu�M�H
+d�
/R+�Zt�Myu EF.ր>o7�{�t��S�K���ύ䪃���)(bg,���`�=��
+=]��q��� G��Y,Қ��o4GZ>�P�,�u��8"x�����*�* &:���Zڮ���|�toO��r��*�Ŭ��޶
A�ϖ[���<�	S7g��nN�uo
���NU<쮄�-kɻ�9�Mޛ�g+�
+~S�Ӓ~
'E|7M������� :�-���r��9����!�[�= ���~��Uu�2AJ�D�<@�Ҽ'�˛���;�Ϸ�/l����QV��
�|���ͱ��o��'ئ0Ѯ�9Ƀ�Uo����/�����
�aru��ؗx�7�����=ҽ=�BGoM���� V�^qK�Y�����/m��\7���b�y��ROt\�v ���4�/
������26z
+~[}�we�tw����R䥴��nUʳ�!��_��Q�N55�9�۝���bJĥ~����ZE���PI�ʣ��M�T��BG{D�/|��^q�
M}��S���w�]�M��Y@��臽���9�w.pI��y|P'���O��I�����.t�_�13~_�Y�d�$�HI,9d��8�Lu��#��i�:b{�vg p21a�>�������Ǣ���o+��4}7���G�k�,!�:R�p�#��J[���ޒ߭ӈ���&��[��5O�9	��kk����D�ӵθ�k]�
B�CF+��U�. �]2`R?/�֝����:i�5��}~������"�o�Lº���n���&������s����N���qƁ����˖x�|K~��+7ȭ���
���\��5z͙��/p`��O���GEX&o
Jơ�
;�S<���� ��W���c%��1�*2
(�J>�2IJ\鬼�����(聮-�}C��&�PΫ^�>5}��:Qr
1�`��.��.�Ͽc����=�
+�I�i-��n(�a�xb
�����c=��"���k�.y��Q|�;O�wɨy�Iܛ�)�ۅ^p��������S
�;�,\���4��&y�qB�i�j�=��i��
�'���|�eT�OAC�'�1^Yu�������Ͽ>C��i���㑢��P6�WG))���_����#@�
j�%s�huS�o�������,bb�m��b�F�L);_ln8�p�����ĘŜ�+��� ��:_hn8��
C���Њ���=��>L��
�R���#1�[e�”r�T�c�D�#�Xi�y������YT��pE���se�O@�B�դ����;��Q�7:�*�v�@/ܳ����Z����P��?��{d�$CG�͉����ʖ»�6�KYK�㊄��M��
��1��=wWZ�Sۿ-4�^[�X�ȥ�)
�Ϳ��������[��;Բ�������w��g���]v{k�zS�}�M���=,�{���2
+���3И푒0��2¯D����l��[`
�;D��c5:�HY�{�X;_a�-BR��]�C!-��	
�?[�f��Fo
W�����>FK� Eg�.QkN��
���	v�U�Y��^m��j�@��IW�2�f*�
�1�h,�鿸��G[���i��P]�W�c�F��-
>ٜt�,=�˗v!5�#g��Tl�i
�ŧ8���G2L�C��^��}{c0��F_���QjS�7��/,c�7@�����'�;�1��<�2���� ~{�o�;e�d�4��CHLZn=9�!e�����Q����Y~so��▲˶��A�]�wZ��sb�@��SY�u�=K+�P�7���NyD��^�Q�8�Չ~&
��iB�S�/��ߚljI�:ү$�\,���:&�&DG
�&!/�"Bʾ���OH�)0#�.�fZ'Q��q�c�hoCO��)R���9r�.�
lR|��0"z��r��U�?�*̀�sɘ`��O
�I.�"�산�nhڗu.��
��@�z�py�c�W�Yt]�Ʈ��ЧBF��@��R��W�C ���7�>�s�'K��@V�� 艔���9��x��OFB��-ye����y�|��w�RǽX���*d��x�S�@��-��3�%����b�SN�:��%>5
�Kl��}�
EK���޴�O
��c
�h�c�C�04�H����l�GŁ�
<�z ��&�{)7��M�.�G��
o��3o�(���C5��>Kʔ6��R�{l�y
��<T���
��Jg��s��l�U�4
���
+o̒��
+l�e
k
.� ������'������ဇ���3����1+<�:�[�(�
����Iק)1W<J|�_G�
/3QZb�CG�?]e}z*�t�����4�����h?b#��5��l��De�F_�u����.����Z

lⶔU�
x��x���^�z*�,@�����8����a���)?-wd\�
��:�r�

m��f��ٕ;��Wv��OV�0�����O�A�� �"�l��o
��hy>)=�>���(�Gj�.!��| ?^z_r�&��l�R�-��n�V=���F$t�
��� 2�+��
pq�!��E6�`
��C�S��. at k
���'*�#c��@��_��J<���=�Y�3�
e�"|rr�SBH2x.�f�x�b@��K�E7�BT����j�C[�c-�jOHJٙ"��7}j�u
+�����,)�;Ϯ�����hu
�6��r+Z�=ʶ�}��vm��g�_�@��R����=��ozd\�}�&�1�K��)�it�E�������u��1b�b,l�
��
�7
VƟjP�_6�U'����������#u�@�ŸԔ��U©@%[&˃}sȬ��H1����SF�����}����մ�
<R�{sM�
�a�,
�_3��������E
����/r�.��2GN7�TG��
fa�LS�{�/w�8�6q-�+gC|
+B�e
+�1y
+���#-�ʭ�U뻠�:Jo���L�������T�W�+�JQ!24��ezK�Pt]S�sç�~����s���8���GϺ3�+
ٜbWl�ѳ�?b_�Z!��������F��m~��uѮƥ�+��Y���6Y�1&y
�C
��>�X�
��x5��>�c�84���e�t��˭c���7�Ә�]A�󕞴�-#ٿ퍔޵Nѳ
�:�y�Y�/�g��ڞ¾u�b�U��

>/�S6	.���'��Cn���)��1Pt�6��;���ki�{H�2v�{�x�腶��ڦ���� ��=�xx��]-S���n.��#�{��J��
������.��^\��'��?
~��pQ��g�e���cd�H�~%6m{
�|�~���F?:x����K�O?ѳ��Vձ�R�W��NT=3v����O��{��
`R��
�xu �#gy59�f�C�
+�(�>[��������v_��NT��(�%g>��`��;��h��{̧�<�7s�W.�s����G�5�� 7X�
��2jc
�~�Pϲ
��VA�s�h������>�ی\���<�}�{��r�5
��<׳ ~5&m{�������w
�u��a��~mi�������-3��L�CR��!�3����;_���vEM������ 6�X�g
��#

�æX�*B����
)1գo��4�ߕ��{�l�_�A
jh�K
��
+��/!��� �Y�GKm݁�>���l���
�݂-��
+�WQKW�/V���:&J�N��cիK+�E���A�yL���p��ظ
Ԋq�&6���ƭħ�%0�/˞Yf�v�R7�w���in�UM7!�4Sޛ���z�9
�[(
��"�\B��F�����:}oe��tX׺�E&�b���X�WO(��|f� ?���p����3���͑2�zj����7MN2����3�4���
T�l?�G~
�wޟ�ߟ�|Q��')v(�G���>%i�2�JZ顑�qjH9N:�:Y��<�����Oڈ�+��vI-|}���3EɱɈ�"t�i�|{��9���!�g'��N�|➐������^��9��a\ү��AN!!Y�PrK�������'}=�1���λ�?�+����c�M����!T��!��OM��,�ҷ�!�=Y�,��\�NÂ��귇*b�OŨ�J酻"z�m��P���bx��H�=Y]���ۦ1X�g���X��8d�d'PK1)E�TxMӐxio����4"t���ɡ�T|��"zUL�OU�:2p�ۣ��͙���y�jR/o [...]
+����̂�`��r���5��J|�����u�&ǫ�� �
+��(e1&�5G�
�ٿX�����IV�-E#(ί����ȕ���6�@O�E�W
"��:�
+�R��jSۮ�&�l���*���~?U7f��V|��35ї�!�'k�=fe=[�Zy{m�� 
��&��d��M�k��6 ��JJ����~OL�= ���*�e�E����yf���8�ds�[�%l�m��w��gK
,���c}�gS�ė�6��:�kW��vŔ
����V6�x>_�U���*-"X��,ɿ�]�j� ]�+�]��]'���
s-�x������5��lh��d�C�y������,.
���G���s���6P�d�;���2���?��
��Z�k�<��84l��<tw
�j�a�,s=�fyO�Eڈ1OQ����O[s~��%|��$_9Q�r�������/{u���=NO�LR-�hUsƯ��пiX9�]�跇Jr�ym��f��H�KctmYW��O����?�Mo~8[e�
:
ac
i�"ܲ�<��"$�p�\e�rO�o�c�O�* ��M��)b��$:ro��i�&e�5����l��k�BD�2�oU<�!�
+��B�����&;Ԑrw'ʢV��nm��w ��>��P��ү{Ŕ<�s0VꚆ&ئ�q�uy�:+n�ϵ<T
�m*�m��D�O�=s̀_:D�d� ��x4�Xp�x_�,%wm���Jo郕��vƪ"�rL��2���; �4Ipqnͻ:���8�
+Մ<��S�H��a�YT��2�1~�;�N8]�Q�zr�g
�f/��Ppw�;��	%����=���)�
+�Z�q�>%�ħD'��F���c��=�{�������m!%{��9FL\�
qJ�y�>ӿ�Լ.��nL�c�>տ�D��0� �f��4�����&��l���h�:��v�/j���\�
����(�
}sぺw�8LN\�?��lm�O[�M� N]l�8��T��
+�p��e��uj�ÂE��.���ֺ�Ϧچ�u&å��:�5%�e
�l��ݧ���##�|�JG��r����?�����
%)ӯD�{e�1���8@��مU��RBƙ��r ��m�C���g\�4�^��C��x�e����P�ùU�
�,�L�Ytg��wmc�O�ID�[�Ѿ5�F6K���b^��+�<�}�p�m
��!�DZE��]a=�$lǚ�m�}��2I��b���{��Y��/��l��;c��}1�ʥ�E9$�Dc7��9��xM䕽��ǧK�*�����l���t+U�㕏,ª֙�������Ze`f▐��x�W���V���{b�T��Ĭ�Ah��`E�CZS�7��ӵ#
H���Z�!�$�%Ȉ���k+��7m��p���0��meϷ�i��Z�M V�����~�kL�Yۜq�:�Kv)�y䅪�"���@�树���&(	?~@E\�.��x���Ћø��̟t���}*
�d�Ws��%�T�b� �xK��^�ҵ�������;��Ju�й'�
"P��9 [...]
&�d�Z����|Y��N�D at k��쳸,C���8���9\a`����C#���O�y��[��#���R��id����@������d��ŭifإ�
�
�6Ptk�����7r^��̣�A�
�d����;M����"x�Gyy0U�b�c�u]��N�8��@��(#i{�&~��2�P
~�?���o1[H��;ﮱ��Kր��� ��a�F�*��~^�-{敽�xe��$|�e����6�!c���:�����m-���g�r0�
���d
�s�	Y�YL�S�G���㶆1��!��
�W3 o�#
v%w_y�Q`��z.�)��2��?4
��ẃ�
��|����d�wʭ��
HQo?m2p��L�CN�0O��������	b�s�Q�Ӳ�v	1�H�Ƹ��4�
������
��~)�H���hZ'Xɗ4��/�Ɖ�^)��BO(;Ց�ߔ��W��2C-u�i%˽�wl*�2� z�l)� \|��C�Ԋ�It��#���8�����.�l�M8��2����5������M��ek�3��C>����F��踹���
q���O<`]�%#���D�Y��
�^׭�N0�W�4�T><�PG�:]���
�D��B��s4�k
�@�
����)p�]����`��^�bd�y%����
�?&.�P��83KOu��pɳ��p��km���_��x��<
뫹���VCױ�
����C
���f}�[�Dn
�CV{�o����tHq�
5� �_دF6�P�+�`	�6h�
+l��x��ͮ⻖qX�[]S�1��@/�.��uV
6mq
�[l����1��g!0��ȣaX����;Ґ
��H���K�V1=���@�ZqC�T��������kw�~RU '
cӲ�Ŵ쥞›���o4MI?^�
+}x���Y>�6�+�H��3��}A�-�\1P/�7��S.�:R�
���)�h��Z��49�)e���l�[F���'�
=�~���!*�t����5��fX��.�:R��h
��ڛ~�К�{�:��b�dm��K�ߞ��P ���T�����Vc�>f_5v�^
��}��X�V��Rl�2�T�ɺXdW���C
�|�����
�˱�P��SKm2B�GN��ʉ��Zz���R��s�D��^|�kmڛ��
�|6ߘ�`q�;M�s��{�X�ֶ|c�:ʭ�<*
�.���ɺ=I~��45��CT
x���Qj��
��Ѕxx��"�ƪ�
�y8���`�m�
�q��&]��t�$�
�w�V��i����@
kqY6a�
�H�5�<!
x?��bK�SSO�2����c���Q���
L���P c
�
��		���Kq	�::أ��}
+bֹ�X�i��ݗ�A��x@�S��7�{w��k�A+}E�A/�dP�7b�����r�ƹEi�$�)Su�D,} �|,yl�b�T���k�} >[u�V�������1�
MM�E����B|zr��ں?-̓{��m7��E†|�l|�ߖ�ί��o�"|�?�1���("�@�Ԡ�'([J���7���i����
+�H	�t��ڝ.z�7�����il��)�ꗽ��N�b5��ȴ�1�3���i���S��
͓���qJ�v`����.�Gx5���
ٚD�^ ?���X�f1~�f��P��9x��
+]�ϲMbݳ�B��' t�+���G��9�����1�,x��h�s��:ѧfC�G/lb|�
����$*����X�p�(E[����b��x�ccg�/
1:�;�M:Q�
/
��S`�=��
�
9��
+�ꐡ�8f=������
5��l����>-씳*����M
~u-�XτYg��
2X�M
��q��*
�T�s�tԲ��,`���>*�&�x�W��M�h�X�����	L�EL+
+p�K�(�J1.�
�������z>��zK��"�攓ҁ^,�*(�bd�k��X��5��Z_��}@�ەL�
+��
��\�
+�#
�u��:���[��d��"į#��7�?\jn:Y�c�.44<�&*
�c��?Y`�*:̩d�vD�"����S����y��Vj��
s���:� ���\��%k����j|�u�*t�7�����'~
��y���p�ϙyWt]��wj>�p�O=2 ܬ��4
�]�F::{�f��w�XZ�7+c�J@�с�!_)0���͡�T�	��ɡj{�=�c�����y��e�|��8[g��hH����	�ehz�Y�c{5�t�
*�={�Gf��y����^hi����Ŕ��5��`1�&�A�q�˵���AA�_���
��6q��yl� �t����v'� ��8_%B�5��U<�U�.^/ms��*c�伪E
�g�#��|�CŁ��q�IT�&P��Il�e��j�`g���O�i s�*R�˱�R�]�)��rK�"Z�MDL�
�!G
�|��\p0���
�)�i��q�4�=>j�:C�
Ԗ_ˆz�l�Zv�'�y�Qqf��� *ho� �tT�e
+
z�e���3
1�#�'�d?�O��9D���%�%'�:�pI~-
t�H�
���
6�t�PnC� ��s��6�Yi鴈��g�
�GS�p����s�^�u���k�)�����t�
+hCX�_�x�B�>陈�Yon����ujhdZ.۩����h� ��.���OT��$�x�Tx�o�kyX�+��s5i��:�/p
f�j{8���H�3	?�2��_{�
��,�pc�&�H��t���pj ��T���犖�+����3#�i��ο�#
-r)�6�s�䖣�������W{���C�x���q��g��Y����O˵�c5��PI��*��VqE�i�4(p�����պZ�/:e���)h�y����U�b�M��I�
#��Y&½���3�s�@�
.ձO��Ϸy��E>�(d�h��!�������t���(�e���X���+t������N�K]K�
�z�#@��m�w8����\�ӑ�]���#�O.�0�;D9�cϖ�Ol��s譣U
ͷ�F�~��B�a�m�����]���,0�_w������
-�An��FRɟf._�Na�}��-I�k�����d�}��< O���&�G��Q��2
��#�~b��8U
�]�s*�E�<��&�""��Ӌ�'o�Ǫ��BhD�<����j80��
�H^M#�|
P�̒���cᐳ@�Bt�F��宊��=�'�)b at o�:���ΧF>�h�Gd�
� [...]
+�������9G��ݩ�f�
���4����i������7GrX,�3cw�q�V9ի��Ζ�[�ńd�k�T4�GI{R�p��JK�S�@9���9��9.
��T�g�||ޱ��������� �t��]a�k��x���t�ʩ9�Q��4�J�
+��W�KO
�̯\�c�Ew����lR�=<��	J�
��~���d��
���
+�r���z�5�ǁ�[���<� �.:Ž�Ĝ���0�
���o��1�
�Rpjip�
��#���H�N@��-�'7�
�+��r�lS���Fs��m.�X����>O�t�c�΍4�sC��tϧ%W���k���
.�h�M����M!9ɩ$���~��_{MGK
��"�y���c���y��=_��T��]	&ީ��.�����45 >��Q
+d�<����b�^�_�`
�����n
���=:ů���0ig
��E&�LO-���_+��_�O�����l�!^��\
+.اl���)r
��Ѐ��*��'(��Ub�\Jb�GI��d�Q��l��u���t���kh%@
�TMd��	�R�
��3OH�*�� ��;���s
�e�XK>ígT��uD����)�Ad�.�4�|eaߺ�<�y�;c� �$<ԣ f ���:CH4O�·F���d������B
�&�ɴJ�n5
��z �3��&}m�zK��|
����Z9��wװ��JF�CN�r(H.%9g{
+�SrN�y��UF��`����ǎYh�y
+�ڧ&d:?�3�(0�O���)�U扊�(�����^�m�۾����93g���s�w�-{[�lK��%Q�)R$Ŝ#H�3 at 0+˒���r�`�D�F"��ϩ�/fV�νS3U�a��u�˅�,5�^߷�/4XS?[Y�E��i�b�ދ�[�cV/�w��֜�Ք��jr>!#������('�ƹ�9o�ʹ[��O�
_{W���H��ŗ���S]�(pM�(D����E�̀V
+i��&���
��(�ϾG�����ׂZ)���V��z��Ǭ�C�n[\C-�L�.D���@ۮ�#��{�q2f�W'E-�����L�r+�	���u�:���h�˯*���݃�f����}�Z6������;n��V����o4���6��Xu�x��0	;I�L��dB��ߖ%�);�z�]�i�Y�yO��i	�Y5�>nj
k3�l.n\O'{U�u=��K�+&�":��9�k�
����G
<"x��)�T���V�	�;�/R>�(f�4�MP�i6��%q'��a]ܽ���mN�JF>x��������u�1
)���je�zum�������.��4�
�S��AG at -nٚ�^[
��s=��|�eÁ��V�q��r
ZS�F�ݙ2�.!<&!��gX��B����?ͯ��oI�ń��Dï�}�phs�+?n�6�l����O�5s{hm�<h�i��[n��3�/�[��
�}��V�.��W�L
+k,�	?o6~	��۸�y-8ͬ]�����Tw���,N�+�'d��r��i'� �*�i�-�dk��0�Hq��{u�_;��|zy�Y����-ƕ��Q�ՠ{��3�J�ZR� g�O��aW,�&��c�MQ/�
�֍1V����VԊD��=N�>��f�I�O���cQ
�
�&q�#5�]BM:x�PSͧ�&vcx�W���|6c3�n���B�›��7&�%������R�����Y���O��K���FJ�>k�qe�Z��ޚ�ե ����}�yD�S��Q�O�
���T�
V�im��,b�P���v��>�p{N*ߘ���=��'>^W�Iy!�z�����Y�D
6���t캘��
�꽞2�;�$�뺸�������������p�Y at B�2���
QCk^�B���R�6�:�,����_Aw�'�b���1�ɁqR�﷪�s+�����כ>�;ǃ�>�)n�\b&<�y�@�#�ff�ݨG$ܚ!V��Wg�[���8�(�
+�J�^|�v9��t�x��.6.>Cm���X�sn�����1J���U��X�1�`�m�~�t׹�	��MH�[��]��m�k�.lN���9�m);6�q��
+����1���$�l���Ǎ�K���C[SM?��vf�
�$���������!-�qs
+x`�V� �
��
Ns+���m
�/&,�ڴ��
5�@�n�%�����Q����K��R�4=W>[}]{0<M.�
�miD�K3���aY��)��n���{
6�{�~~.d��W�XWW��U~� ���w~����I�^�̳ݩ��?���0��)�L���'�����҈U)�>W�6B8��n?�����	j���>�-�h�4�8�<�eW���WV^t�-��:���x2�6%�r��[�%�o��5�Ւ
+c:⥰��ps�����R@�#��{�k�ċ���_'iE�In��0�����3��$d��V&XW#V�,l
�
�܌ؔ��IJ��^ŏ�ǵ��m}L�i��th�
�J��O��FbE`�p�s���	q�a���u��f��@�����D
����
y�	ҕ��R
2�*�:veX���*��8�du�r1�+Q�\���Q#�+��UEt�ʄEH@}�ߥ<��r�[*ɺ$ܘN�O��$�5�%��?o:4��n1gu��DD��6�[�;S�6�,j�=�p_u
+X�*�V��gؕ�5��������ߌ��?�>������]S��
+��BϯQ���>A/]x����A���oZ�CJ��ڤ���.���E���WHO[Y���5���n5
�{YձOq��V����!�"jd�v!�'�<�������q⹭1����<�3����
/�����BjFIh�W�4	q)��U��&~kL�iH��
�U@��u1�)�a�
��	!*�6;#�6ݭ�:8�(Mۄ� `rҨ�&-�k13�bĀ��y�Ӳ��������pJ�Z1.��6�t�"�݊}Λ5_��i
��{h�䐾��+hQ��1�n�q:�R��T��M𲈍��:n�,Cw6fDp~��9<h���4��‹���
�a��Oz_߯�Q���ȁ1nCh�Y
#\�ǁO"��urz�0п>̼���p�z��s����A�$��8`A\����10!nAL2f��o��8�w�λ��jY��k�^ҩT�
�ƠFD���Š{9I3�:<�v*f`T��f1%=;�
��z��-�����FA{h�Q����s��GإK�ؗBS2��0��ܳ��W��������k����º�$�%�v,3
܏��D�R
�i�M둵��sA-�*��v�g%⤣�v��-� =	���.��NY�]�R�
+�vf�W,�Aߤ\�^Ĭ��<}w�a�bF!
x�.������ 
԰�R.eO��ݟ�io�]�)'�Br�%`&lj86l!_ݘn;��:�
�^X{G��c��
B�{�b�ߗx����������~���q>b
��7	:@�������[��0'��95�#�'�g��;�D��fL?F�����C����^���y��Mѝ�Z��(E�Jz �T��]rQ�.������_4�����Wm�-�4���}r���\���0h��D��dש��x.�gW�f�zN������S�L;�̄���/����VN�{��^VT'�D�bb0;��V�
�z�,�@mRz������1�ῷ�\�Oq
0���
�A-�ek�_�5*n�xG/��)�b�������T$����B&�rN!	�>�g��m䲠��Xp���ڻ�q���[��\��fV�
W�e�Y��[�gS6f3��Z��˞ׄc+��
+�j=a���q��;��k_'
�k�3�g���t��������Rw3Bq����to��G%��ak�q)	> ��z
g�x!m���0*�_U����+�x�Ѥ�ߕ�=�[zUa�,
�`�C]��͡ɦ��� ^�S�4�.�ۻ�����U�מ;
Ihq�SvZu�#D�R��$�,�UP�>^P��_!���)���f��m��?�^�K;�{�L���D�����삘��qpkÌ�!��+aS�Q��=�����}'Z{zv�ifVѷ=+�O�8��~�2� �TCI�|(n���nfܬ�$,JE�+S|XVހ>��K#z^���L�p�Ia��jiXèL�x]�^>=�b��
�ʥW-�oM.��)��:f����sO+�]y�~r���T�ց[1c��&�R�-e���@�Ұϝ�a���6��	�^E�̦��CKXY�+#]':NM��k�ŝ�<(��|��pL-j%_E�Ă�i�&"�JiƩR�
��Ӧo�7��E�{�|��q�-������sr��wb�_F��FD�(
M�
]}���ʫ֟�S����S��vfe��CL����4
��Ћ ��� ����O𶀫��wx�V
��ʢZfM@íYxG��}����[¥��ݲ6�t�����Ul����9��a��q+�
��D�hE�1j���Cj��O�T�Gm"
+�V��
�CA���6C��8\48M(
�w���q��&;/���/oi�ԠA�G�Jq�#�c�0�=m9�����9f�A��*�'�g�3��מ�0�3��_�~�W����t���
+d��ia��;N��	��N���7���;���UE_Z�>
��N�Dİ�W�{�r�u�l\�Q������䒭IzEX�k�h�a�?jum�w�u�)�ӄ���6^6
Ǿ(n�u�
��������҆�ߨ'�m�+�B�B)M�$�`O�ݭ����8k�Žŗ���7�3��8�zvͪЯ'efE܌��:�p�vn[�)aG
⮠�[��_�
'�u�B�)�fg{��n����UA
�*a��
ns��Ws�t�����4����{E�G�S;K}O"f�#���/�tV���I�Ĵ�s�הS5�QJ6'�O���
ۜĝ��qg3
ZCn�K�Ҷ�\�h?Z����{�}�Lʊ��I�
+kiײ^.!7/�fz�l"�ʔ��L]B˩	����]�lZq�_|O�l̐A���R
MC5�{�zfsw-�q�f}X
d��bⷤ-rvڮ��L�&�s�1�C�ώu��~��0ϣ�<|�# '̼���5(X��U�9�������k�q�"SԂ��t9k㴤�Br�*�B�b
+�/����;. f|I��l������c1~k�틎Ck/�,�h> uY ޥ>a��fa����D�e��
�k��@���mN�c�n��7��Ư5ʒ
a
��曖S;��9�j j��T�O
�F;��H��p��+�
��&:�%
��⎾�� �H�S��(�<��c:V��X��I܉��t9	��s�"j���
�`�-�\BǨ���ZOnGlN���E�+#���gģ�ۭ�� ����?�,���
�Ү�M����5�����T뉹��߯��<�fW��� ��ޠ^BX|G9?������3��R�4�+B�[VF�{}	gbZ~��[^�i��+�!|
)���..%��*
�)�Nk�*&�lC��ft�⩅W�c��-�jM��Ƨ=lJ��j[L]
ŝF�RA��kY�<�9�u::C-C���KB�μ�;d�1Wu�2�{�{�o�柵�l�[sh�y㹸t�A&^xCȷ<h80?L(�-�TGM2��+���'�����t5�R�{�N�`i����$�8b0�
�?�~گioO���n?�1�y.�)�ɢ~[��#e}bE�%�'
�ʸ�\���6!>`u4쪭Q���G��
7K�s?i*�?2��{P�=OHyڡ��Bf1';��KY$d��i�MS
+�Vn�[��X������1�Z9ik��
|
+u��K:�Φ=����ݑq�hY[o_Lͩ�ie	
�!��tF'i�
�˿1���ܝ���ZjI�)�f�ݪ��߾<�r�������I#�0k�f
br� ha��>	����:Om�BM�S.���!
�.iS��#�QWXü6���``�Z�ZE$�*�[n7~i
����XT�^�U���<�9�x�?#�\�5$�*Q��+_
�^
��x$�W�K{�
�e�����}�;��̿5h�k���.�i<-�*��1~L9���a����2j���
�����Sko��G�}����I+�ܫ�'�k
/���i^Kx��o
<���W�6FڏD
���I)��'��	���Њ�
u�
^�bR^���
ڙe�a� �X'_tܮ�*���l����ݞss�[��m�*��}L8���E�[�C��֘�\
k��!a��ؾ<����mN���^Qσ�#�Մ�qC���t�)����VGZN�t�갑��K�3+�Z�嘅Y���M�K��)s�٭���I����x
+<�
��W�.1g�'�&�J����
\�7��䋠_�~AykgQu7����ү�>V�-�f��i	Lu��Ԟ\ş
��)�B���ފ��لu
j)�)' Mo9�Z�u	��+����žFMܶ��Z���@+�s�L\��h�k%�oig3��YD��z�<~ 0}c�z�?ü�ށ8EL���cq-�~��-��%]۠
�
�&�儥���X�	�'��[�5�.	j�e;�<ҿ��;K����Ѱ6�qb�y�O�)NMlF���_
M.�
T|�U\�t�a������=p�f!�>�wD�����Y
�5
��k�t�ΰ�E�R¦Z~�]�2��7�w
��ǰ��	
�⌓���&���	+�#/�*�����g�/I�D&���f@1�(Q�S'��VDD-}��H�#
������a{���ܬ�F
+�(f�$
�V�B��
.:C/[�n�V�aV�LXٍ������Q#�>�4���u���u�"zR�{�R���7��k���>Ƕ�zn�-�8�VRFy�f_�O�'�E[���
����9�h�#d�O�Ӭ��V�O�{�
/('5��?�J?-y4e�f\Jb��W&���'-G��u�z+#���4����ǵᎼ�MՏ��v� �f�`8�2��"S͇W_]�����O���\��J�V�W[d
��^�1*����S���T���P�g6&��f)5a<O[�ۄ�.�z>�� /Y-�>+�n���w��u�\
�\�>� �`�&
|���^����Xd��V\��Q��'�G"&-l3_t
�V^��5��?z~��	1���d��b�b�)�q���^1�ٕ��o���}��)��
b���T�W��^�}�8D���k=Ob&r�^r�5�K��b�/iY�q3�����8�2㖰�}
+h�k�����Ӌ_?$|�wk#5�'��&!.k�fm����Ӑ���Q+�"b�:����ޑ�V�
+kC�!e�-������,�2`h;a���3�jAƤ���ύI���4`��.�M򫶁�2Njj#&	y�)v`�2�:���=�������>Ƹ�׌݃�]__�dͿ%�^yM���u��
\r�I�
+h�.�\��ܑ�Y�,풰��䂹'�V_W�G��ʜY��8€�[�Xe��s�V��w3jt��4
XzQ�/8I���(x�>�u�*" 6ag^ٟv��)҅��U�5��د�s 4̶���WX���Q���>,�z2.�8	^;if5l�4��w��l7/}���q�qv)���_��ek��4��m�R�������1�ɨQBN�$���S�3�_7XzU�?�\�v��Wy-ص� 赨F،�Em)
`��~-fd�����rQ�%�$��קh�a�����9�B������-
���%2#��*�m=�����Mߧ]|�΂�'3��I�$��~��G�t�ѹ�ۙ9�P
4��>os��T¤�$m���so���nEnA�Ҷ�z.���떃a}ǩ��T�������+���D�4��
+��4�����
ϣK�^�\�.����~�"\����(����?{���x�����o���v
���^Q���� x�Y�u���+3�ᢆ�ǃ�?i���S�D���>O�J�����
���5�m������`=�|�:���,��G5��_,�/�q�u���Xb���A���	�{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-��m���n��Dv[�%��b/��{���Kd��^"�-p��A�|�� ���
Y��NA�'�ş�Ͽz�����/ �>)�d���<A/��Y�<�<���?
=���jb'c߁�r�>8h_�J���/k�
���¡g����}G�
��_� [...]
+#�F)����IEq�����W�^5���ĨI@
+��i�T��S�J�E
�% %
r���nj�⸎r%i��"&ZŎ^�%a�
�s��vn{�H�51�P�����Rv-�TʓV!�
�3�Q�6�ljHW�f^��um�%����[;�Y�R�z�U!����
:���]�A�!���i�г�������]D�x�$l�u��nN:x�����s�Zv5bS����I�����$�Yeo���ǭ�
+�N��Yȥa-�ps�R��Y���� ��S&���eb���Y�8�J�k�Q*7���3k�zrI�Ȩæ���Bzv��8���$� j�GI�C�ܪ�jĢ�&,�Έ�\֐
+:a����Z��ۃX{{�:��_b:��D,L	q#�2�cU����M%��ŝ�#���Z��|�;���Kjei��+f�
w_���^�Ћ��Y����[ys�O��U�"&�ՔU�C-2b�1����sB�rv�*�&�)�ZI��mM�y��\���+�v� j���C3�ڤI؁@�&	g�_W�w�V������[9-�Q����[\xX����? jҥ��z5�g\��φ��/�Ag�.��p�g�~�e�WI=�RRO.@kP������86��ęn�O5�v��	�����x{od����
��ȩ�j8�	5�&m�5�m�ƌ�ݘ��j�~c�,�&��ꄎr5c�Z���i����K�)�B�r�$�rnH/�E
+bU
+P�\���	����:�z!��{�[~��~,�S�I���I��̬�:6�'�KR6^{�ʨL���2.RY�C��X�������6�.�$ sb&Vm���θ��>f$_ٜĝ��Ĭ�����ˤSHie[Z�����0�I۳}��w�)���}�~�}�5�|��i1+�<j��E�|\���2`
Ii��u��C��zx��-	y���:Ĵ��݈h�I��Θ]�
��x�t��j(��vnL5��>����T����z���)o����F���_��Ib>6�z�a����j�%�}2Q���B
"*�$�RH�n)�
�����	敐Q��pZ&J>[}C��6+y9Goo��jZy[�������:A+�#%�RuG,b��
� 0��i���MI#��?�;������4�8b��V'��Oq��_�/��D�15�ZBG-�̐/��t�b�Y������Q��s�6�ێo
7
�k	�i�
1�k�8<���iG������(X	��5ia�d���6
+��>a���M�ΤE%$����	1�HI�ys������ݸ���_GG���yc�����v!��z
QS�6G��~>���Gӽ���[O�&	+ؿ9N8�����D祴�Z�6�/�Vj6�  ����y��sn�l�''m���
�
sX�x��q+�-it�l2�����d�n�I��(8�p8>�mJ[�zC:Jih��u�Y;>��o�ʁ�[�IXE��U���^�[%��E�H�Ϥ�Vћ��
J�v��=2A�#b��)E~��������-���Ϋnf<}���ب�U���
�l��y1�o:з�a�/"�I���Xy�i7�u�K�
+`tǩՑ��vs�q�I��w#f�ns��jHظ
	��3�U(Q���\��<���^&�=�Q���tR��NZU��ŧ<\r�N*��SK�:~��
`��w��R�ߖx��7
ڳVӶ�t5	�6�	�/�g��RȀ�:Bjy��l���a3���dG��A�7+OɅ�ݙ�QN��k����b��i�X���r���8��Q%mJ~�"c�����^Ԟ�X��U
�X{�����!i�eළM􊰆P����9;6�N.�Zx��c�F��P7�InE\ëM��I6Q�^�X�]�S!\xK�s�o�z�5���s�������
�28I��%�
N�
+b:vu��i�n?������<.K:9�a=�beT�6V
�uk�	�a�1�P�Y%܆^ߙe��baXי5�
�&zy�=j�6�4���20���d\
Lt��|�r00�������Ꭼ�!�
�����1/���eK��3���g�o��k�
i����+����z��k��{3
��Ww�[z]���H�w����
�jԄM��F~s�.㧝
+i���
�-@��N�!$&,�&�*���$�,�e�N�Ⱥ��I{���T���
%(���X���d��m������P+q�嘉ך�J	��� ��-���p3
���T�zebԫ셾J:��j�'�m��U��RifV"HA�l�
<�x�*l�]DG+�9D�m����	9�Y!+����zz�*jbUc�&�V	+k�0Q+�1.�휶,�M����{�I[�2�r��Kq��� ��
ܶ�]е������JӠ�r�}�2s����T {\���5Y�23kF)��w����gż�[.K�l�*��|bc����8�|�)��f{�����f�}�e��� 
k�~��Cp�t!mfT�\R^f^u+8u�;l �m`�G�����0���
�ů�nL���e�(�'�ڸ�x)0�~|u����UGL������O(�p�
+5i�#ZNM� 
`�E
��U�5M8����H\#��q����)�&ZYHO�60J7ƨ�7�h��w��"���;V��
+BB#'Ŧ�%���u������7�M�* �8	x�4h�`L��q&�i�)�m�)�m�%�Ɵ�[���Zn��)t$hGʶ�G�}k
�	g�j����x~i���xߕ�ޭ�1eT�bFv��x����_->��|�I͗�ä�����
���M+ܶ��)����V��:�#_�Ғ/�L�<5���
=�
��O��kg||J��'&�����)��I{o�
	��;�.F��y1?7��g���M
���8����������<�1�
kZ��Ԡa
��);�!�2n)7�V�G�P����(h��i�¨[�U	�3�1�^	�
�[՗tJ�i�B�=�P�_P�n�I�y�(マu�/�ZN;����{iﭱ���Vn^&�̉8(�)�_-j�u��bF�&��
������q�p�
���	+�&��^A

+Q����e)����������Ŧ�l/�{2s|:�c6�DtN"�;���g<7^�_R�M&��1�>��s;��
@��\�R	x�z�ʖ���Ց.�u�˜�v-ng5' 
P�����]!
+E��{�?�U����"fZ��Y��	��M̯&����)3�-mg�DtmgV���]�ݿ
+ؽ<��t<'�[x�y<�aU��M�-�Q���7��7�%��O�Tl�GA�ؔL8�L.��}뉥WU_,���9�����>B>ձ�"z�
X�͉Γ�/����}y�|��������R\h�Y� �
O��Ff�W�3����tBO-��WbFze�)��u�ɮ3���
═�pas|�LW��ג?�o����o{�]����V䟡\����r��h�1�ӆ�F�W���ؤW=�*�&��4�����/�1����]'�RO~�Ӛ�
�0`%58�&��bV'��N��6
W��e��2�1����J"JA�:
+�͞�Ѯ�]2qfQ�C
���o0
���x]	+�4
�f�]�w[̲�G5�p��RNN{��j�oO�@�X��13�$��d|
\p2�z��n%��	�rn8ɯ��L���J�H*�s$�,�U�+�;���O" �%΀f��*��L:�Ը�S.H�NB}OP�0ۋR���΢�7��GͤBlJP
+�7�TH+���o�=�ú#�)�fVMҎM:�6E�̪�G�O���O����9���$3�P��e�o��g�)���Seg���}�L��J��	���
� 覭i�Y�""�
r��������q+~L����
+�N5K���{�5��4���tBf��w
�T����x#
:jĝ[~{�˹'%؜�<���VԢ��ƿ��4
�녭-�"�f�o���`���O��
�^���$�S���)V	�%��H�ѭ�ƃ������#���#q-VC2��,�o�?��na�/naTϿ���u��3�����W����z�Ye�W��ګ�c�6
.m�6!p�#m?���ۿ���|,��1	�2N!%��wF��G;��7
p<(�����c<��4��$xxl�]X�*k%[�3�)҅��Y��q[�f��Fj�s&^��H�aǽ��o��
�&��=h�9��wn�e����"|ʬ�e�*E�.e���<4�ҬK�ޞS�����%xnL:��3���Hڀ{4m'�&RIz�CD}}����!�n>�
�֙�<��
�
�"�2bNf3�,�x�
�B�M.<j��ͳ��/ӛ��g]JE��{=��<`�"&fU�ʮ���8�r0
X���Y��~��ؙ���ՈzʘC�o$�xz�P���r� [...]
�1� �|�YT��:�숉Q��K�nU�����Z#:X+������Q+�Ã��U�2��@_&�E1
�5�3"6aך�Y�|ܲ�5�<j��S�
�fEtJ��OH��^�+�F�
����cG�'��.�m<�.!&�v�_}<r�<����Nt��
�����Z�
�p�6�(�Izih�V�jY���װ����v�^}�;�ьhi������Hx�
��3/�nk�z)e��AwB]7�	%�&懦�%tm'2&ba�B���͹����	�%1�����i���GHK��
Amˑ��ב�(e�If	�gMT��@��zTϮB��F��TǙ�wMQ�����
�(!'M"b��Q�:'W����6��Fz��()/n�2�ށ���Rc�ªKXD��D���P��W.Mz��R�N�������y1�$�b�esss�/f{ͺ��1�(��"7+`d�59������z�k�صI�Z^�+�?Z浤�ٰx�������1�J#�Y�Va� <j}��.�鿓��ɨ�Ӗ�r:R�O7�����M=6�W!Eݷ'Q�)O�
+t|xS�Ī����[���ڮ
�Øi����~�!"���&@SP�����ކ�e�v
�=�(�|�MC������i��y�㸄M�@@�b�GAk�e��9�8㕉�v
��m����`��\}w�go��}}wb.v��$����?�#J�oOd at g%�r~�r�U���v�|3
����z�ʔ��'n�Q�J�X�TI��	z\G.�А�7'E�YBK;����rl�߀��3*�Fھ>ů܂ZZ}�vdk���2�٠=.������� ����
^y�~,0�(M[�┥�?�6�w�щڱ�JQ5����?o�4
O����su��7m�S	-a��b:r���ʯ
��!<�_ͭM[����F#jO���j��S�b�u������D�
x�呶�k�:�fl
+I֩�o-F����M�Ƭ�����C�bb��;��^]��}`��D\�(G
�:��mɂ�ٚ�]	�/̚��
� �/�a���`?
+"FN
65<�_�
J;�?F
wFQw�ݴ��F<A<z�"§=}w %I���4w����>1���P7�);���̊�;�=w OU�]�ȡ��A/��ܙU�d<bV�!e�@/�̩n�\=�{@W'-J>j�`�����A%�R�S�:(
���qk�$�
��2-n[�d]El���Y�h��Ò| 3+bǝ�C
݊��WM4v4�r�^1g�j�neҩ������t��E��8�?N;T���[1���pI����9�ǬW&NZ�� �[�PgOOҥEA�"�'鹾;ص�9�<
+�2� s/!vc�0�|���x���
b: ���g��YWwO�(f�O	�"���aӯ#~ラ���p�%���ʵ)j�N!ش�΍���v�Q���LE����v���ԩx��%mW���x��~�&���4d at M���TGM=��w���4�5�Mʦga���(6��M�7���Kq+�e�1��
+��Di���vt˓v�$����O��N��3��E'��y�5Q5�8cî�	)3�m�U�7
Oj��8ma�1����x��St�P��=�YE�������Ӗ�Cjv����C�aʥ�Y��-��
|딁�Ԯ�w

��E�E��㌲�C�zz
j@��Hؠ��kS�'�6��TElR��1�����2D;tcr�ٔŒE�J�-��ʿrݹ���$�j�$�Z~C:UK1c�"��
�դM��[�

��G�4�Ҕ}�^��76�ɨ�����@��P��	�ש�1�{q���څ��[HKy�ܼ��~Y,��,".z]z����P�
Jq��s��S.�ƾ�W�J���_�i[���K�t��-�jk{�x�w�X�}CA��w(ez1��u1��d�2~�'�!6^k�ȬJ��̼���r�9�0`ⷅmR.�*���q�S@�Y�8Ж��SDI�����
��d)g�����y���$�ܼ��?=feA.�wc���Q���r�
d���g�^�@+a��s���
�he_|�|���s�]��7�쿕�ʄY��[)��H��5-��擆۸�~�Sk��Ogzy�z9
+:�
uH�	��
6
:���$l������
p	�}i�����hUܕ	vI��;�=�
�-�I��7��1��+���Čb����a�ոs�ݺ3
���; :��ȘQ
������!5�lu�P4,(�4��q����lBB�$舘��[3��巄���B��c��O7�Pʷ=J���i�Ӹ�Q�1�r�v��?�?�܇�ٍA-�r�e�IT'&�-F�����Lv�\xV�����Þw����?���,�q]_��<ZDϮ	�p�&JY��iw?�ߟ�r��/ɔ��G®�"v^��4���8�B�,���㍚/֟IH	�o3�
|��߆q`h�We�Y������QR��4��TOշ	u�ʽ�������ߎ�J�Ȫ^��<�W�+Q���V��d���p�9�[��;ø�&"�5��FF�{�˯@K�d�moϭm_ϭK�A�N�M��X��{��
���
�ה�]���x��
=O{��`\�5��',�r�(�$tJj����~n^9����ٕ"�?cv	ki�U6��u>c���sA����bV-�i��
0sq+��a��0	��2nѠGe�O�X�n�9$,b��qˡ���5�==>�ْ���K�	�)��\��(���:�!�&��}=�S���켲zD���e
�fDz�@B�;u
��>M8�of|��ޡ�~{����
�ֹ��_��ö��V���eu+`�Qdg
e}2EX�iݜ�%��ƈ�^��qZ��{Ӡ�2��(�z�"���o�p+��oo/(�2
".�J�d��INK�>�XymK�'
�6}�d��f{nFL
+FĤ�|�;
�
��1IȰgW������z%A���a�E��z�,�Q�)n�z����KV�u^Ů�'l�_b��
�����'��“�k����Jh�޵��O��Ϳ�:���[�
���U3����S6
���=U�伪�!
�>f嵧lr~��ݍ:q�!u��wj�M��9�<=���2/%LrA�1���	�)��0��W�	�Z�4
���ҮB-��
*AL��F�D
�ia{T+�韵
�V�/�	�u�z��Y��ð&i�t�r���
[~˸�I��C.��̈Yɏ�%�
�^�
�0����+�:��[bF�����MXĔKDC�{@>�w!b��2��k򥗢K��t��@�w�m�y{8j��[آ_�3�=�=�
�
���":NU� �B,RZ��n�z��4x���|��߿i��LR.���9{Oo��nB
B궷�A�խ����0r6���55�li�r)dgG��n1�
|���خ�9%����
jY�'�&�-f����q{�
�+�F����G��z%<�	�⸨vi�W��(���R����s�A�G �?㑉Sv���[��
��5
�J�9�q�7�
��ᵻQ�"ffT�
"p�$	��*�	O���g�I��q�Ip~T�-S�_�)��Q�B��x�<���Z��q� t!�+�w��)��Z��?l�S#f)ySǬ�n�98J��񛠎Hq�N1S�0~&
���䐆]�5�(�S
�a_K w��Ϭ� 
�h�Q#�!��VEu���ZP������VpI�$"LG�A����*9x���V�
Psk�ZNup�r-���&{������3�����<��:�w<��m��{@;
+���GӲkcZ�3�"aĝ�9(��S���3�J��n'�=�Iƈ[@O��l�
�;�
����U��^e�r�9b�7��n=��������/;~�=c���']@]���U�Y���~}7�}�:z��vޯş��q�$�Q�vNs����?7�h�{��nu �le����5w
2qt	v�C�v�Y�q�9��3�Ѓ����?ž�1L�x-
�?j�Fl7��{P�O������9-۠�r^nb'45�'M�ƌ��F[����|���=+��<b"��}����ް���@~�ف�I�j!�s	�B�	�s��<�eQ�� /
6�9�W�*�Gb�\BJ
��_8c���;���v�-f�
��W��Y}wP�;A���&lr
���t��u���l߽,��뽓����;z-jc�e<�f�`K�#�[�R>��
ʡ�O�K�Ŝ�S@�H�)�T�����������G�+ק���P���$�;�ʶx��3�:cC�.VDDQ���;!H�'�^���{�$�A�
JB�{�{�ۙ��|	�d�������>&]H9Se� ��<�fd�Ng�֛����c-
eP�"�.��h9��Y��xV�c�rQr�(�A�QL=h�t�� �[7B3���&���^z��0�5�I�7?���S%6t�'�z�1��jS»}��c�L8&M��|��$kZ�����OU�ԟ@G�|��5��
S�'�̍~V��5����o��	u���~M�3�%��1r�A4���4
DY�:��nw%}8>�D�D
�)qc䘃	&b8?s$��;A��k����Amc��Lܙ	#�
��r��tF�2EI:�D����~Gr�T%d�N�sN@�O�n�pS�{���>ro��|� ƜL��#�8)暰
ć�;"@Dz@s
���P��ГG*6ִ��/e�
J䑜O4i�#�%�
+B��ۡ�kTP�L{Ӛ��ɜ�����=���#e~%�T�s}2IO1�Q�@�U��#uN�	��������Ya��)&�DI�9T`�jɰ_�ء�=�
ݛ�O4� KM�}��C.�HN�
Hɱ�J6���͑T�}�0}:�lW�#�UB����
�gPa��UTؑ��v�x��)9Ѧg�+�����#9�0N[D��
�������
�������M�
��V���Of�J�f��@����"���sN�	�@s��k>�ڴ��s���5�a��e�u`�A�D
�2r�*6q_��
U:��E'3���Ys�8g{>�[w6�S�\�O�U���ۀ�^��:�
+NMcъsL=�*
+tg�I���sN
��@�cOF�7�C�}w�pho�>��/�#LcݔP�f�џ���_�OԤ})�U?k���Jד�?J�?Vpp
m��oI1'�
���z��0�_?�tۛ ����kE�Ib�l��$[t 4񾌇���V������
�S`�*.I�w0����L=zj>}�3�3���(!�T�%
�(���S����(�O7�B���Œ�`�{S}'X�3�ǝd"
c�DӞ�Q�ƀy*ڑ2�v�����!�����Ҳ�f���)rҞ

�7N�8��;�\�^?�;D�8T�y�iH@�p�G���Y�pCB��
+�G�����t����!���y�s
��/����N[�ɟN���&�y�R>�H��
�ɉ�*Jҡ���k���5+���� �HX	�)#ô��\�S��S5��4�JF*�c��Y.�l!��H�]nZ�=��3�e�3�"�3�$&Rݷ�c���a�A��tc��
	{<YX}�ɯ:U�
w�X��1.rs�
�9��iP��[r1gxK����軓EQ�Q��k�ǡ�C ��rl�S\�AF�9P�qg3��_
��Yڨ!�
��ч�$(���㩲�Cm��`��lf��b^�?�y��
��c-�u�ᐏ�=�M��Zq��*U��#5-�TK^��ԍtяC������Ͼ��a6��d6��h&=�H�e
L��\����<�ˮ<�N�8��Qs<��o%|>�x��C��G�t�
S^����?��sN5".x&�Q�#����s�T\�)O�}�g�_
%�Z�`G����C8��;Q�
@�EƉQ�L�,��\���:#���v��~�g�O��/^<�k�
y@���L�
`S����#NJ+wF2X [...]
��삽qb�F_�׵�D+�`�ӡB@��$m
��N���5�U�S�@� ���Jf�Ѵޫ���Sp�z	-x��3��bҖj!���НIl�ș��
��_h �bT�|?��k>��

���u�d�Ϧ����fM���Z-�p�� ��c"�#YY{9�����
��̀gr�'��1N��0=�h�����aZ�~0%��Wej�
+��sM�_|�!��%��}�q>�S{0�$�M�����].h_��<�6����/�6��f�������|��������3����:�00�	�׉�
+�K;U��Sl��8�������qM9�'%��#�
N2RL{(�o��4B�&��d6��d6�q��p�G7�����t1�e���#�Xpfz�}���ٕs1 �� �
 /�|ع:3�|*3�\���K��N���c��?Ng�+��E����!ʹ��4�qe\�\��tv��t~Ù:��\��{<)��AM�K��T���
o�����b���f{L�ؑ�Y�>j_�ŝ��O�);r:j�pO'%�"��D�!�	[C�P�ŀ��M�x>�.�^�9.fo�����q�&'�P^�A��lC���Z��s�X|����6�邳�ܪs��窼�����i�R��
�(����?
��M�Z�xg<�G)�mi��/��	�&y�}�	��X�B��O��%�%lM�R7&���!j�O۟���(٘c�~>å��c��6H~$|Oˆ=� |S����OܟࠏYy����������
+�����' o�zpAsM��S�G�l¯6�|�E�Ǵ7=�����|&�����
�#
 Vw���
�Ό �<P�t��'�&]�>L�;���+J:���r�6(��}0��i�����
ೲ����惩ґ}Mv���Hx��v�t�n�q<�t���2��ۓ�i�;Lko�����Y��
�?��Y��ą�@�Y�����ù�N�TV��8�%�a�5L��ir��)j�����D�u�-�~�a����
�;�h��~�穚?���|ᎁ_9���8����S	��禵qS�ˌHlZ�=Z�@&��8p���0*�C5���x���d:q8�N3H8i�ct�m98S����C8
b�Ҡ&���|���P�s!=�xF(4o�?�F
��S!b���;T	X��b� ��i2���-wc]�S��:S� �
;���;�
�� -bw4/sw$��/� �H��ԛ�io�s:���5-ΜmI���G���3��t�9��_3\��

��E&� g��za�n�i� [...]
+O�9eg�?g8�])6�ԣ	tڔ_Fe�>�8	���|�5z�
�ލ�8Rᣍ2��i�TS�z�̯2�k�'hq@㟁8
��d��6�c��
v2;�P�@��>7��1;`l�*r�A�
�U�cL�#���3uv!е�G�
�q�)�ϟ
<�9��;΄��Lk����d�|
-�x
+`ȹ_
���.s8�Yd3O�L쩆C�9/.>]?_�(=��(9��s!���RF��@|0ͣo�R��
irJ�TBƮ"+�X��
����΀&?P�sN4Y��w�2s
��2���w_S�}��,�
�T��3,�\O��Z��=^��UVHwԙ�@W}��=[ �
tٙV(0�_9�d��LVI4y�@� ~�3y�}-y[��ّ��崤f�3���Q��V b��
��s���|Tv��RΧ�Gjjҁ�ky�ә��
%#mG4�\A�OP�"�I�l9�bbw�)a�>���=�4���PJ��
��l�'8i�^j�f'�M�M��9%`
�95|�0N�7L��AΠ~��9�u�=9�+��9QN�"ꉌG8�������}w%�����5J�Z��tR��Rb��(9b{��1@����[��K
�m�?��;j�O���sR,8V2Q�e��ֺ�	�"�ޘ�S�!��\F�?s\P+
��o�P�~�f�Ì8��D��b��/�������3a�0P/�jFڡ�w0A��
�GXIg���cu��W��������1�H��ؗ3S�T����=��qr��:���&���D�3�'&>)d
�3�/�O�)�SB
�`Y@��@�'��H1�
+��|⡒7���8
x]��خ
�5��<U1����L{a�k�U,4�&������
8g����M���
���{��㩼ړ���'3
��yr�?�:U#O��s���s
��a�υ�����Us0�t��:�=���=�� D�&���� �0p@�	����9'Stԡ���3���i ת*UFM��6�� >?Ұ0�*l_�	ݗ
9�������u�c�@m���ԝ̦g��C
�t��3M}9���y��|&��t*��(��\*�-Ա��v��t��4
�s�K�(��B���J^��bf��
�-�@AM0NRb�TT聂���5�#
���� � 
�;R�bN5�$� �c�a�ց���N�Xj�|����
v����8��6��J3��R}��!�DN�
J��c�
c�P�%�PJO8������q���Q&b
N���|o�
��7�� ��P�v�~���V?�}k���M�_��8$8�]	����89|s �%�
+���{���\H0NpL��
��Ju:��b�G)�>ZșTH�x�3�χ�OH�;��^��� ��HF���e�e�k���	v�� %d��h�c-~�'��b��
u<!�����/?�G+L?'G�"���ɟ����6��D�/�A^zov��3F�w�I;�2P�Jj�q�� �
�D<��O
x�S�i
�8�C%9N/Is1�C���$S��L�I��	b葒 <)◆�=�d�
��@K ��c�΢�֥�愂s����cZo�>���	L}7��tІŻR��*�l��?�����=� E��
�2�߹�E<7헁q�Ne��8�f��xF�ɳ�`�`~t�
Z
� .'S&
f��	DGj�{��$��:��h�J�9�ʭ\��t�M8�a�3�e����m��7$씥^J�Q�[hTd�l����_�5
�	��&ߵ;J
���P�#�J8�+=̈3�ρ�9�d�w	~R\��~*e�L=��3Y�G3Y%�u��ٜ�3��I
�@���Q"׻S?/�#>/�!
�o���Q%d
O�x��C1�Ǖ��=p��>���,��r
�A�G�_iE;���v��k
x���d����+�з;xoәu���4߄��;@�?�R�
 ��Fq��Do�yE}=d���3̈Y�&�,գ?�{I>���m���-��j���Z��Z+��q�t %��� �.w 
vFHA{c�@�8)L�G�[��j*aot����qN��8)|�7��ݛ�y��r4N
=�P�7{	�
�(;���
+{��
��0��9���q>�Q|�a���E�����Gx�q
jo����6����0�V�Rl�;�vF0޻�`�̴vEK x�:�$G����4��Q�� �#�L)d
�؈35e�kGGI!�r(x��=0�e
K��\�0#�8�F
L�Rv��:�ڃ��܁��ډs�_�;J����1��Q�1��u|�F'�a��l
�'�O�g�y2�%GI�ar��0)h�
���o��7D��
�¶�y)�\�Q�N��!yota��F���j�8J�>�`�O��< �����w�&ؑr1�rY?F\O
+ݑ�M�90�y7���i��L3��J��l�
;��%l�ზ�P�{t����?�8�C%�d��;�b �d��-��6��l��B
�y���-́Y���}9x���Q��:� �l
PC����6��� -�j���}����;+����2�M�hw\D2Nd�w%܅&f�ΰ���K�襅
�Շt���
�}�!�L�o�p�NUY�@O���
�F(�?��j�����ւ��X���h#y�636;9+M4/M	��T�b����A�]h����=�� x%���~�/�s����Z+�Y�I��� {m����U�6�|�m����S�-7#?��c�i�X�bi
B�GS]�����~!R?(D��J�}��1�M���m8�#	#�T�A�Lg��(�;��PPϞ�݈/��w�MIVˀ6:�>.w&
+��-7@��el��0!h��ք��
0[�ϻ �
����	
`B�a8
�=����g�NW�Z�K�,fkS�ikRޮu�
Oe��3��A�{�SB�'��c�'aAO��5�)����#9+�|F�ږf ��#�G�q�K��v�]��{��k���F��.Z�a����%��zH��hǵ䧙؛�����u�/�
Z�������Q�u�8��N�9R�Ǿ��Ѓ�]lN�2��d�G�;]+�e�.�z�.��B-��F+�Y��n�� �$y���*��)���j��@{ct���h#���~z�J�{{��[%���}�����zQNz��}@k4#?����v���Y��
�������Է�Ҹ����'�}� ���O2��x�	u{����Fp�*N}�.�>����;)�W�K����u���B��(�Ǔ��
�ٗ:�_�屏��	�6;P��^���lױZ@ߕq��~f�
��v?-��
��z���4��:��B
�o\H9�R��
�1|ȱ��o�mE}Y�E^o#�{�
F	
�?vg�
	r�]ׁ��َ��܈�Ք&�� [...]
$��J��z3�y���|�a�K/#b��
��Nt_jL�0]��?#�V� 얦<��r#�i�$���f��R�q�*��jC�sM�����dg� ��Ɏ��#�̸���I�4$���A�z1���ϖ[�ߖ[Iޛ�� }9`�9�f�
n��Nu��"�N�!>���\iHs�)PL��Иh��{�Սr��A;�@]�{)�}���6�WÐk��m����^s5יJ̇�R��Bm�����7@�Zoǹ
Mpq�r(�_
iz��i}
+����c
k��%�J�o����������M�$�֖��і��,�b>m��mu�|
����.Z�z
�q��u�"�9��7�B��f�ۑ\DߑpS7L睁.��z�v�����>�T%[NE>�fy\Q�Yl4��k�-��R?(�㞍
��
��h�R^.5������؃Aܝ�l��]�3�~��f�E�I�c��Ԍ���E�
��d�q�]���m�8��6_�l%͍~�*Jx2_��4�
}�.E���@
�	+m�oڪ���O�������&���Z��v73�8����Dž�7` 6��ʠ/F�A7{�>�ϔ$Xȋ�k	>��).?���[݉6:�m�:R at nŽ���T��v_B�9~~W��lI8)�����4륺4��ꤷ㙡f�˜ǫͨϚ
+�c�0�Q׃
=�d��Ղܗ��vFΫ-��s�����fk�i�e�6�}��c���=H�XmJ����z*+4k�:��m}��x��b6[�vXn$���S^h��-�0T�)������Inϖ�?�Q�
N�F7;b�
�e�	i?Y�`";�|�*�}���0/��N
#h����@r���}�'=[����#�b�6�~�����\�#BFrE�]���Z�;U~�
Uv�muN��:/�l���Of>Y�tY�exi�R^/7�ج6��,5�X�Ja/���w��	/��1n��(��!!e��
�����]A�}Y�K{�Zr� �
�w�Z;+b���՝�[m�/7S�f*a����q�%9a�zE���z)�� �6��N+�(�5�m`6ڪ$����GҼ�3U������7�IY��{��k�-M~�T���j��z�=��wk�X��nJ����f��J�N[�`�
+�d,3��j;�kkH�Z�%�<��[�����
I��5��`.ύy8�
tGY
}Q��5�i�
t�F;�c2'�q-�j3��j��j;��t5�y���*I~��G���v�L�~A|
N��9��@Q����g09�(��7�iA�nZ�b}�{Eq��aa��A�-IV܃J����(��:��N'a��8_��� ��	�8���:�
x��{�L�jOSUMtY���v0"�q�{(޿w����Hs����2[����qX���TY��(�{w	tO��~���)�x���Ƅ�1e���U[�z����\U
�d�&��0@
�$|������8��X&N�!�����-�ƽ^k�}�-
1[��{e
�E�����q1�@o�v���뒭&�B�允wG�n�g�<.F9�(��xe��9U��x��t��zmDs���s��z�G
t
���Da�rZ]���D?��7�d������^�<�%�<�Jq�{��
��Ox$�UU~��jm��0?�N;��"������.��;�W����xI ߾��í�ʠ��ɯ�9������2ܗ~��*'Մ�_�0�������'m�
+��_��$��f?a��8�m��B�]m#���b�,5��.6�Xk+b_N���g�ݟ*�9i*ȎKM$׹j���f�)����'<
�?���\i���\j�z��Q|���'���f��Л#��d���#��u�}����ҽ̷��HP��Jp/in��da�C��z8>�0�n
+�?����8��.ק�.��kL������r����x���N��~���SB6 )K��
UX{��Է��H{�/m�rc�o�h�As5����^�2��D.�$��l�k��e�Y����Q�R���;���xw�w��,7����wgT�}ƿ��X-6҂&s�-f��_'�1�C�X3EAҳ�ṙь��@�˓E@����9�w;(^��n*��
k~�,7���q|�Ha�*���Ңd�Վl�t
�g(3�e;%�A;)�l�
p�����bc��bk��F'��@��{�kc^
r]�
=�֖E<�G�O�B�k���ù���b���`:�`���
$��7�?/��mjR��*�.G�kj�ѽ�hKEi���8%h���O��(rc_��'�эc���^n�j���Bt]h��L�H|1��X�
l6�rww�7���)C�WQ�Ƴ���"������S?��-��'q_
]�e���	�4U��}B�����~��{��M�-��
ȃ�H	������f'#��~���yy��{U�r���u���~c�6�N�v
���,#��L&fot#�����(
+�
��C���z\
I���6Ot~�ۨ0��R3�s8+��Dv�kYv����� \����\����h�����?Zm#�.7� ��فڰє�=
�݌�r�
+nsqX�k��x����R�l��l%�z�	�y��IY�l�9�рt�
��;m-�#�Y��Z�R�c���jZS;����	�S�Q�x����E�Vn�l
4��ty��R
�a����
d�G3-𕮓2&��.��3SF?�zߔ�{�[�
�Y�����K
�n�Z�z�Q:�-��O*��_�Q��5}���Ե����>�ف/i!/�,40"�%�O��w����ԧ}YnDє%�Д@_�V�}P���5�i_v3(��¤�F���,<΢��#7��R� �Q)��A��|	�xy~�3Y^��
v���$�?XAv&��,�I�/	�� �s����G���e�;�AS�{g"���D�uk�6�K1>�(���H!��C��܈qZoN�^��=U
����骶<�jw���F|�*��� ���K�]kƸ,TA_.5b
&����~�\���hw����p�"/� ��r�vw�܅r�Js�A
~wY]w_:ZU��l�((ܼ��vc���3 @o�p���1a��<��D^��A�����[s��ϷF�������Ġ����zA��$��hN��^a���t�E-��l>v8W8SG��G<����J��hKS�,֐
G�`/sS [...]
+B�f~ �7�顣���5H��F�\5�Uߎ���$#헔��J����xn
�t����ж3��o��8�
V��⤗;���Q|�pq�[Vػ+��T��\�M#��aQ��|�
�g����v79X�E�Ǽ�T&�ov���,��z��\}�ǹ�4��QΒ��3�(�jf��jjг�6��PFܓnV�>n��
v�VZ��6N���������;�r����qJoz'�sڪ��S����!�檀��E�c�^����b�8�x�б̀��l?PG~�y߮�0>�Xj�:l�����Dzc�
��#9��I�̋4W�[�
���}^^�Ls��(A�e%Xq[���5�	�.��F�u�0�����J���|>p 
�
�z���3H���M�oH�V|�x2�=��n���lĺ���>m�����h����֫MP�͎���۪jӾ�u���Œ�&a�����e^���s2;��v��D��:��w���m"�L
�YS�`�.�| ���b^�E�^Җ��ۨ�c���g+�>
5
�Z�å6��uiN�CYa"��q��
+�ם
�8*�,5 �:������2��<;��� �^/;�N73��L)�{�5�,#���R>Ȳ⟎e�ݖgG�]k���gDM��]�e��v�y��V���
i��I
�� �͸o�☻qf~`�Ʋ�
�rc^��0C��(۹J��Z
�s��ڄw]oe$�8D�0'-#��U�g����QZ���}�@}/�kg��7H
��fF�K1N���o��B�X~���I�Ǎ���g}b�����̖���ÀEa�-�⢏d"��8�;B
��;.T�����vu�2��ᘐ
+4|�Da��V��d1�ٰ �f�����5�;�Oԥ	S
�\�˝vv��ހ�����Ս�Zj��Y���(�7[��a��U��;����E�u`�'�'X�Vǽ_nNu��K���?VT�~maޕ�A��5x��&����~N�l+�}0'�]� �=��D� +a����#��\���,W[� >�R�'��+�?�W$y̵�;�A/�Y���jR��� ��}�@�n��#׺Ҿ��<��V!�
#���.��r��HV��Qq�و8�^����Rs��p~�׌D�k3-T�j�M��|E򻱌��-h��[�>wd��V[�v����$�z2w�ɉ
MQ�+mԠ�v~�^:ioH�]l�:/��t�"�J
)`�	a�.����F<X�x$��v�Y	K�4U�qw8?s{HL^� x�Mgm[av���.��4���ƉL�
+��J���;�q�0�i�e��,Mz3]���6��z
�mIA�U��6k���6��r
�y��i�
+��J]e��D	]�� 
="�|:*�~:.���^�u���@�kp
�"����t����
�x�a��xfЃ�f���Av���F���>B𾔃?Pg�Ƴ�K]�0M���~�k�-EZ�Z9	+���>A�mUI쫵vj ��hF��A~ؽ��$��j�'ȩؽ�tڡB�ߓ�);�EE���Zė�H�C�w�3���/K\����N'�6<�ߣ�7B�M�T _>��0��:�	��q�z9�o�;���!.j�9�jx�-�{������v�.1p���^'��
f,?�Y'��UY����]�0���Dk�1	�zv�˝�,x��P&{�<镪(�����F�ۭ����
��v-r��䓉t�5P��a%K��43����_*�b^�D����y�*`_:D��7�0��
�����w�k�η�9�7�}���z��Q�������G�Irū=�My��Lu�]�(�Q;���Z7�c[.�OԑR},o)�Ҽ��X�����v��r�ex�>���f���
��
+S\�Ⱦ�V�~[�����,�z/�;�L5����	Z������>�'
�m�y��qo��j�?�S���T����'*>��\n��8
�Ԟ��@�_v ��5���7�h�+ ����P˨��Y���
��C ��e�%�����B3�a��g:��6H��oH�[kB|�.���
c�7����c
|�j/'v����*N��b? ��y�
�0[{j���
+�UV��RB��H	3_j&�u'KӬ{D!w�x~�e��*�ˍ(��>f�l3�[Z��zgP�\��{)KC
�Ҝn����V��QKp�>[M��) 8|G�\Ʉ��X�C
�/�%l����k��S5��Mc=��k=��^R?��_he��g�>�{_��>���ޫ��_�ນ�*v4������K
���6j�5�8�G�
�R�`�k��mIs{(���΍��}��v\��������~�u(��&��J+�g��_�I
+��O�"�V:�A+
T��!ro<��9�C�w⽷��庉�� �P�� �
�t,/���,��V#�d�pn��>a����_�d�.�#�(�#����ηR���1�=Y��6V��
�q��
�,B�O5�1��@�Gs����^��{m����,���M7$�n
+1+
D_m5��b}����$۵~��^ʂ���܌u�w�w��>

I��2�ۘnws�>(�zf�
�9�CY̭�<.�U�F7-x��^^��n�
�e���7UG�:V�g�w��g+Q�eh�V��� )l����K�瓪Q���O�VZY
���}c,/ky��m�9M5 ��$�Vb�L-���
������+]���5�SU���c^�*�K��
��9�Ɍ<%�G[���,'G����P�>~�j++t��ᣩ��� ?
�b>Ꚋi+
��2��r���Z+=L7$Bm�	J�y�>����Glvr�[=\�ΰ�9�I�짆/���VZh>Km�����$Y)o�*Ȏ�
���N�j�0Y[����_�V�}Wz���&z�h^��
���J��V'{4������,�&�iʣ�k�R���3�
8����'팀���g�b�'u	x�\R� ���{C]BN8S����6�S��Sl�Z�^����qv��0%RQ�b����W,���I2� 
��@���
��ˋx�,EzJ�\D�^w��n
Od	��$��N+
p��Z���^�����ޒp�}|�Z� jʃ�!ha����/뭰��`sY��]9jo8���a�
�e���3$|-@�vSW�I��� ���,�^���
�c�;�
h��f��n��bz�r;�m�	�e��;,f�
ӬT�Iڒ��zr�A���
�P�:��pN��.V�A��c�ge�u[���P����W��X��Q&��m��� -��ڗ�,N���:H2c��#���㣷�ԝ�t�n��
�=i����X�b7"�����+�$+�x�ً0��͔�K패���� ��.V��a�I��:,��5S�h��N�3��ou�SW�X!K�����f��.��X;YE��\�o���j�%DzK
���5S�
gr�X�
��}���5L�E�6��(��~G!,jw*��2���z��
���n��J1v���t�	tc,��*��� 1p��
�=T��ޛ�\j%�~
�T|��@?P,�T�.:ֲ�x�*%�F'
~_���Z����1�gZ�N��Ǖn��<�F6m�##U��	���:i��_f+�^�2��x�CF���l��
��JMz�J
?t���4��XLe�m�
�������b������¢�
t蝽�
��;�B�zg�"靮�3]�
1�E��.b9j
+��K?�#t�9ȥ�����l�^"��8�h�Z����,L\j�~�lgF���t�Hy�n(���φ*K������⨙���:;n���P�
�.�M�p=���
+0�V:�Y:��BL��l�L��G��O�Ӎ��w��,���qOYX�3��I�?�v�/�膄HU�F]��|�n�ֈr�j#G�ts��MPy>�q�,3\�ZL׷��k�!cYqO�

7(D�
eA��hm�����ǎ^�m��S��b��_�Xh&��W�Y�;��!!f�K�Z�
+�Z����ȡ{���f����U�Ok��q2��0�_�'���
�n
0�&22�����OZ�Is[hN����Z���m�I�p�rd�11�z�����W��ٖ��-����0|�;�H3����d˕f��Z;�_?Ȇ�rS�Q��Y���n7���o;#٦YI�k;SEZo���>�H��VҼG�)oG�)o&�(
������{�[Ue��A%�9�)
8��oZ�&�(�Q.k�,ᶢ�۠ɫ2������HQ�
yE܋�~���2=è�)^�!��'�⚣�﵇҂ҍ
����
um��a��Aɣ�4ݦ�ay�ϵ��;�Ŀ2C� �������B�{;���gw��ܸr	���!��ܹ@
��g� ��b#��D%�
i���af�H�c_	�Co>�m��G|RIL������d��_�]ȏ��]�w����5��7��?˗K�1��1!3�6�
���.
\[C��VS\��Q�jQp_ݦ��}^ND�̓���

����������8��
+��˥��.x�~qznq{�u|w�
}w���ڑ�^�����d`�4�	Pˊ��Ѽt�6�i-v���v��Fz�H@?��%���}3���⻇� �n݀x�|z��y����\R�u���Q�Iz9
�2Ȅ�*Qv��	o:�;c9��nT� 񠏏~6�����9

1��i�s��/�}�.�Y������'���
+�����B|����5�%����^J�B7�s��t��r� 6Y�p�g:�f��;�(�Zr���;p���Sܿ]�j����&���㋬ w�JR��Q����=�A�F��
P�K
���Z�nD�ߓ�h�#�8eU��pF��<��x�KvB�u���
pG�
4?��8�/�)A.2C���q_r�xx!���
+������+
���1ms4���!L�i��(���moi9�NU��V?�f!,~`b�W�IV Wnfć^a��_��y����? ��ev�
+���
H�7��;�ɮ�ʌ�3�L�(1Z�c7VheTq����!�%���r඄��1$@/vpg���|�GVj�S^��_9����n$8�^�L�5����E=�6����3�4](��˙��Y��+줸KI>^�w�W� Onހ��w���-��+�C
������dw�
qS���0�Hܒ�������<P.�nɦ[⯋S"�p��/�}\/��{r�	$��
$��
���)���o���
���ǐ�W.C<߀\���Bn��5Y	�G��`4�FU��(8V2�OxI�а
�..�P�ϐ���7��|����	��#3���@~�@ ���
�}
b��
��n.쉺��Y��	Զ��G*D�9,�2"����;y�

v)���@��h���{;H����9����7 �������L���|)�����V%� MS�Y	�!v�Ґ�4��
nϥ�+Ƨ�M�
���v��vs�`=�A�,�B�?4�X�߃ܺrr�K�w�C
��q{��r!��l�$��r�c�=�~���3U����"}��¼�a ��#�����<�!��!�֯!6�w �o߂X޹yq�&���k�+�.��s���x��`f��=��k���֏��{R1
��z=b���9\L�P�����z�N��mg��{���m��ӧ�W�@�oA�޸	��wbv����� ���~��p�}nK
+ɟg[2aK]幛��Y���vn�`1�M� �(
y��	b�v���%�����G���!����|��Ƴ;� �/�ygv��v����d1V��b��mO�&�͉�
��\m7/a�]+���
�_�	Q��8�x�-���oA�_x
~�	�	W��o�nC����
�;��;���9��/E5�}���#��/�X�;bl�Uf"�212��/�7G���ݸ�b���]��O!��_.��cn�����N�J짭tS"�k;�኶�ԡ�����t�<��耋� �
(�
�Ύ��OB>����[��W����br��������o��ە��G�����FF����m(��~���y�;ߩ��|򝂽�G���'$��lkq���8�|
y~�
b��`��{f�G�oC���Oȣ�7!ߞ���܃�� ��H
	n�zV���"�ό��c;�p����� ����P���.{ھ��4 � yfk~������G�7nC���zdf��
���
+Ž�ܟ�y�2�KZ�@���Ϊ�d��~F��K�8Z�
h-�}�#�̓��~syo	�l�h�
b��!�񟐿�
�����_7!o�?���9\��p)tO]A�\�c�Ϸ��g��n�
+�y9�[��Kz���݀zz\��dg�}o
�z��ץːW��x܇|������o�7 ���/ĸ~��&������ż
�X�-R�$<�\'-p�񲿈�!�z��z)��'H��5�es�
P�w����!��=ȝkA�q�}������g�W��ɡ�f�����
����̍��\u-�w���9^Ms)g�>��x^r�~	�~h�fy�{��k�.nB^�Z������̡��ˇO I
.�`���b��7��4y�2.a}<�9חM_)ȟ��ķ��/2��W������X]�����<y
+�v�w�����} y��!��e��/�1�7s1Q�U(��1�ƛam�
��\�}{~�G-]`YAd<��	^�b8��a��S���Cᷘ��[��"���:�dm%s��;o�/��	<��D~��hA��@6q�Q�Y�uj�c���sms1�G�h���$�%;��(�?��/�:%2�9$�',�Q
g7Rȋ�6Q�k���$ϕ�l��`.GۙOU�}g�5����7
0	�;
+r*s
��X�Kj<�
�'�#���;����@.߇<�� l�|�}X�#ۏgF��پ�]¤��,�rO^�$�fa����v��V]��OB��<:ǂ�B��
x��++�s���n|������t��������+Bd��!�����9��Z�¶��=If�A�S���\
�IZ
+R���fR�O��������������
���;ȭk7!~]/cc��,ɲV���)�:k�
8��Ņ�"��Z�MG����f۳���E��ʌ��<�]����f����8��m��
j{�Ҧ��I�4�0�q
���l�33X233�3Y��b&C���w����[��
�aKK{����k͙����i�������=��W������&e�
^�x~�ʲ.tP]Rj�KL,�8���w5�%����r:D5�M�MS3'��kh�UV]÷����%%_�
+
+�z��忞ݸ�Q��ge�L�8�u�?�=}�?uEE��ۚ.m��v�X`�����c�bF��2�\3�g�$em�w��#��NT�yxQƧ�/
R�.�_���3E�>���G�~������os�r�,������kv}��~��>���A��6y=1
���J���q�;����h��
�QQ���������U�M��:-���/^����
�~�1����d�OsLb�i���XА���\�l`�0��=���n�y���D?^�o�c��
�������F'�+Мb.�.d6���O?,�:��J&�&f�
r.zW�oKY`�zrs��
��hǘ9[�c��i���8�<����
ΐ2�&8
+�_�N�H�5n!�ſ���O,;�=��b.�P*�
���$-wg�Wa��iRL�7�f8ҩ)�JO�2�'i�L��	��j
+����/�]����}
Ai_OP��	)������h������=G)4��Rw���|�e�_/�,���WKFJ�z3D��i�<�9"�'�@w���'��|8-�l���v%
D��
sI荶5r��8��kS���g%�a�K�w�Bt�j�Q8�K��ߞ�84T�2<XރC\�����fL�9��$�lw����-FzU�怡���u�{���
m�t��5zx�������쬡�ă���G��s}�
xY�紖�����!6��\'���u��%��>@O��
r]�)Yx�g:ht�-}+��������7����6�jk	���O<�J��3�g;6W&:�s�͊	B�f�V�>@I�t�qK:>
+]n�RͱK�툀�K�}������GUD��2<eg��`�Y�	���k�r����<>co
எ��s��3���o���2������P�p�����o��
�>�G����C���̳
uOb&&�dw�ԓ�<2b�O�!�IXm���6�T{��0/sc�+W4D+��i�-�1ԫ���R�y�f��$�g`��j.�!b�-���%h�î��nD
����T��Y;�
h�*6K����͗aT��5l�S�L��"R�R W%��
�n9�5 �N;,��֎�=��MA�C���%���h��
+2}w
Uh��};7���e�@���\UDKh�K��n�)��
�wqR.�!c��7�p���P�i�5|�k
�q0�y�=K�8\`
 ��r�p�
���mܝ!�x��ֈ�G���=�ڻO�C�#]�T at A�TT�GB�s
+�M�%fmH�N	��
���
+�:;]�n�G�ͳ�ͻ+���t�c�Pd_��$��4��2ί�J�6B[]s>-�j�WF��a��5��Rxީ�'�)���C�;��ƞ�]U��rhrO>:�'�m��̋ܚ
a'�&��E
đ��81p����y�l��A�*�>5
��w������#:RN
X at Aipi5�N�sfc��9.�jG6�h�ho�HIf�nG��u�ս
Q��ߣB�DL��1˰.j�
s�����G���� s�����
��*��:���#������3�����_�����9dڎ��+8��O��\7/b� '-G����
��$y�-o!I>�<�`B�2F۱����h�R����{���t=E�%�w�w�+^���n�"�"�iJ�K���ր,��
�j*|g	�����JҞq�#����'����������5yd��":6	��ƽ��$�Pů�S����,��{��çeb�F.;����zbCP�)�K�y�Eг����wy���L@:6�
O�UA%��/�:V������bL�v��f���}	��ZGg��ڀW��r�*JKHA��q3Ic���x
mrN%��.��؅�l�_!(���ɸ��1��M��G��u,5=v�����k����%r�"��mQ�u��T��EߠWƄ[F�~ٟ��k�����Jĝ�,U7��#j'9D=2�I�V1-�µڐ�9�~!�@�Eu�n%������鰐��VuvG�Ԡ��|�˴	ےcF.7��s�
��A
1��'�4���9��Q^9Ѓ��ErYD�7
Ғ��+-/��!	@>
�1�I[֩��8�����W���Ql�wͥ���zF=��n�����K�rzKH���L4�_���x�ۈ����u�fDuL���J1�a�.�ɢ�d��P��.��/+���������	�SC�C����u�M
#6�6`�vGv�W��&����Z쐞غ�Ru7d�4D
���Q�1�
���3 at l1#�|
k��
Wr�Ps�`��FDC��-��D�*�8��"BV+�'�<��\jR������"�5��5q�A��n�SN���C�f3
�r���_���_G��&��Ҡﯼ���?k
��
T 
|X񱞄��:��
��en�%�=��Z��q%
	*o_��ۜ�dx�֘��u��-th����K�uD�3��`��rB�_�̶�4<1
�_�
R����o
�5l�
+�z&�*6�%�y�[_��A��K��Bp����a�����*�(UG����
��[�'�ga/�����y��z��8�Ʌ�Et�[�J?�k}b�kz
X���<��@h�c��;��uF44�{`�~;� X�+��qeA%��`��7���Y0�w��$
��Xf�n}XAf�(Yh��
�b�Gх�����u\VH΄yD� V�\Bt�OFj
�8$����\h�y���n)�c
+�2X�O�t
+[�
+u��L�T�9�~�q(1S�\�N�[� {��E�����ɪ���{>%�D3���2N�*���0���Rj�WN�v�������x�}�=qo�-
endstream
endobj
310 0 obj
<</Length 65536>>stream
+ �KbZ6�������d
05'l���ڙl���৛=s^a[g4���G!`�d
$��'F6-Σ
)2'ޟ ޳�+�՘��|��
<� �V �������o;��Y�z::�
�H���i�M��|N!����"}�pxQ[�S�(����=%�+�-�՚G΍����B�
o3y1�n�P3����t8�[��uG6!``X�(�j�a
�r��w^H��狯
b
+]bH�K�*v�Q^%*7�'6�6�����v�9Ġ�C>12I'F"�H�*�
/�<������v�HCl	*ٸ�E\�O�uCBG��"�Zۛ�Y���id��*,�p
��-�UE�
lHM���;�����V�Dt��wl
7y]>5c�E&��xOT�*&3����j.-�c�F���N���=NOPCj
+�HM1ː>`읱I�`��T���������������e�8%Tp���)H��
+^�{@?��[_{�n�
�\2w�]�i��XF���ʯsʞ}
\"U
�ډ��,̉
�)��+nx�\*������[��
���������s�*tAD�)IQ�ED�}��l��V��	�!!�Ȼ�J�Ϡ}k��T�c����xُΕ��>1�b[X�6���E�K���YL�g�Y�`44�KL���ޱ���51

��b�:6�`
��� ��D�l�9�>���vt�h��'jDnDޜ�����@�ؖ 	n	��0�J�Jy䰶�;��� ^���Ĩ|�,<�����
����9
1t�4�j�
���W
y �%�����J>+Կ��zg���
��|�*Bh�s
��� �G,:�G$��H�������E5NH�D�E袃ٶ�	�޹�˝��~�7���?�]
���NC�-p]��
8as��a�HE���Rȱ�/�϶`�
��{����s�":d��R��t�C�26�p�
Q2`�zAGTɥDTLD@̟�V�]ta����
���*��g� �g��tjf2~�f�O,,�_�@
nP�Ρ�f��{Wi���=Z�sD�4	�ACluϵ�1v�}/�f�ݛn�>6�8űܖ`a^@ͥ�U<b���F�\�?ɟ �F����9�S
���^%	�
j[����ZY��f&5��7���&�������8v�!º~-$7��
1
�o����L
+�C�aS�(���
pXEm���͞������
�<����W
+�Q	�),�W���
�|@,��Ż��7#ؔ3�������n�k� �v�jo[�jnoN 8<S��O#��/���r�/�́r��=�d���m
 9�;��d�����z � �
���%�
,˻�ϲ�5�4uU^6t����o���kz�]#�*�����n�{�}�+�4y$LTPA���:�:8e{��s�9!����R"�.ZPEl��Pya%,3��f�m){�5�v'��d
lP�7�S݂�;Vb�#2B�_�.	(�En*ö�L��������U�r��/B2r�s��>
z��^t��"5�4举f
����W��=q���
~l�����0���S��
B�е1#�P�=bLY at Fj�m˼k�
��3�
+(�&4��s#������Bl�������UhQx�m��P�[�b*��2a9S�`n1��!B�xd��c��x��-��{3�
5�������m��s��k
�����2�*:�'!V�����
+�,�lۻ��I��j����X&Qe�=kG�������P�N���:@�
 �G��a�Wp��5R����摡��c
�|w���s����WlO�_z���S+��d�N�0u"�%��W�8�D���M#x�*�D��x�����+
h��`��.8jă�*p��l�}�H�͐����x�c#�rd�}j4��Jc���0�n�/��n�5�sl�-����+


)�ۣ!&'�����6˿F��:@�搩�%\aLD��i��n|h
��#�e��sҿ0v��?X�i�Z
Y��
�W�u!
�^g��@����ۅ�rQG�/{SЂ��@�z�q\ 4�2,M�/��9��D��|�Q��c
��"dh8��̢����o��r����!S
K��V՝��?f<��0N1��`��X�ޚ,��8�}ɳޒ�� z��
��~tOX
����=s̕��˸��9�;Ry3,"7�6�m[��W�u̧j&�Xť�Ą
+�"�6{�J��
聨��6������#�?X@����9
��ջ���6[���t��#
�5���<k���~	�ξ
+͌lb���$T�.��Ӎ5=ܙ�gG�L�	�/
bb�u��^E��� �f�_�y�
�e�D�� �Yº�����b��`
��:Pw��Q�]`�-�9גb�ox~l� ~���/�@v&��8Z��'ko�'�o���R��'&�`,^����}�I�����7 In!,�'��(�9>�G݋-O����:��追�)�A��6N؝�'�&a��HE��(���{ԫb�����T���F~ϑ�{�`����-
��|���w_H�Q��^�z��{�0������+mi �d�̶>s��
+bF26jD�Dt�*^s,^����J���@�э�ݱ�!��:ܧ��F�,ꉵ��#G��<�"�/�UF
l��"<%���N�����
S�M*�#G��אi�w���d��Xc�h{n!�Tc�eOw@���d�ꨆ�
++�><}g�ꎚ����D�#�`��8�>���6��@�m�l�3�
S4�UrR|�_󈜫'ƮQ����Jm�����{���
-Ocjӣ�1 
*�i��S
��-ڱ�Ϸ7��쫺jꩾ�XdTm��3�̚��Y���b2
3�W�-�
�UW����Vhyg�����3��w�0[3�W���r���\C@
p��T�=����Ss;&#��=�vf+n(��_��g���7���#���:�
+"U�_w�6
{�]�溗p9�|��4���$�3~�n���*�T�6v6=����b^�e!!�S
'�k�*�g���{�1�TKF̲
+na�n}!bW&���l���ձ��]Tߐ�9�w�8�r�:^��[�-=\F��L�W�iM�P8W�����)�_t�?�X���ѷ��]E��	�Y��E\�NPwU�)�V�)�ZHz��,��?u]ɗ�8��V�5Әt���'�!�����@멈��C=�s��7�U�A1
��HGh�*p�Q�gy����_���^�I9^!�3�L�/ R���,�*�6�N=����v�߰�4�qIh�8��5L쑑M���c-��S0�A%�����i�C�ţ���*�i�
Je@��ߝ���=Zy�/�$E�w���GjA�y�`ޕS�~K0V!˼���9"ױ
���7z���E�[��
+������Z"��� �
+H���
h��,�iD�d
����MAw���1��
 ���:<�
�n1,�-Ŗ�\���A
�����l�w
��\��5�T������
Wt��޺4�"&��Yt�:T~�>��\��>������]�É��<2�w�E���q<BR����xN�7���y|����{
_u�ɢ
�`3�� Owǚ+�L4>ؙG&ͳJ ���[X�D
�#S-��?j;�.z��i�u
���Gj� ��ew
��5r���dz��r��%[�*��#�|�AH�!$�4��<�[H.��(�
�p
+h �j�K�g�����W�X�Z
n��>6t7��Y��F彽�uZ��(��":�ߴ�'�J��S��9����P��!�_l�����Ѓ�G6v���u��w-T�6
T\[$�_�
F
�Hm�y�w�J�K������bsRTF�D O,諸!b_�jX����#=
u8{u0}�G���h萔
+[&�_�3+����H�0�����T�Wbr���K_���	h��2������yO/�fHȘ�߱?Sv��O��ԑsֱ\��t�N
+kY�)z��~��������p����G[
��+��ˈ)���/�z"�WG�Y/���א�
�W8!
�7�pO���f���gbf�������v!��M~�{=����[��6��:�'�
i��7�.!�8,�6�5=���/(�Y_-�_�c���������?m��EF�/���7�F���#�}l >g�孌�|�<Tz+��@�&�%��
��r�J8�c��5��0ak�-S"�x�_�
�t̅-�
��P
��7���"dAP��:6�q>5
�R�j~��"
v�����r&ԻJ�r.a3����T���%R�c��mϿ`���!^
A�N��h
��ݑ�ʹ�m�����見?1���H�V2�xY}������H
����h�a0���	�Ȩ���	�9 at .��A��b�����p�Y���SqÿD��,a���o�6�󮀓��%W����#��Nu�
�5X�i��e���y����`�S��bJL�}
�m_$��f�
��"
+�(ͦ����FʯXK��-�:�Ķ���u6^;�@�
Ih��EX��乄[�SOc�g���M�2�9g	�K��_q��>Q����&C_�~Ѓ��~�h
��3�L�}����1�P�_|�X�$�Zx
9��U�ڣx=g1��`��~TEC���820	A�2�db"rBupU|8	J���k쪾�3KX�V?�ռ��3~�Z&W�����*6;���9���)ګn�5����[�&,氃br����������Ts�{~�c�}rZ�l���#�F\s���j�
+"�9��U�c�1Mw
��۫���Y�����J����=$Õ
L7�j�o|�]CDT��?i��	�4K��9x��[��Gj�9_�`*��B�=�B�c�PqH�5ri@��������O����g���'k��/w���
+u�Y8�S
�N-��c)/���M
+.�BU��6>�hQ�
8S�W�[|�o�~rK9e_�ݝ%\^�Է�
����d��[F�.�
]�
�P������e�K����Z|���z�����1�W�� ^E�L�2��c�}�ea�5l\@Dot� �٧jn�������"�m�ʿ��
�Q9��x�[i|�VF��['��֩�A�Sb�B:X^@Ӝ?b����
+Rpb���H��ޖ�j�4C�ǀ6=pֵN�v_P0s��p�n覰��������~
+��`���;��ן�������R�X'��9�hJxo����ڞٖQyn	
���a)�,,m}�\�y��-�l�C�|0u
�y<��b�m/�+ȼ�S�:U��u,����N�"63�ga{��}W��@*�pj/Ih�g���s
+v��)t�wKĜ�w�ڒ��Z^(xEߋ�?-��o��׽xh�:<���L3��U}E�>���VN�
��\�}�B�����A	�-,VXGC�Ÿ���
:6�:<�wۣ�7$���5��o6koYg0i
-9@on��:ޒ�:�+!�;�
��?�4>>�.��	9
�����M�����
i|�SZ�u
��l��R�+�2tnXI��+Xx�22; &7� ^2^��+=���6Ԕ�	6����
+n�mS����
+ҹ��IqeQ%��X�„T�R�R`�k�%����0wM��������>qK�������V��z�ʻN��i]"�^`솾����X�
�j���ZK�g��7^�T�H<��ǯ
���=�nK��;�AX��7��/#�h�j~rKh(�iD�
���y
!@<W�u/6�	I�5�g'S?1�!$�d����
���M@�)@����#���b\�����MJ�R�
:��G>ӹ�J�*��>U��s���G�""+�e ��c[l}
XGd�ܯ 7 �##&�׮�Xภ��
+� n���֎) �'��	��֗%	{��5ql�
N��	��d�m�jw�h
A��ʮ�'@�W�y���3K��~�����9R�g�P���}bv�v /�Z�'!ָ�*�l����~��:�է!	�4f`��)ޞj{~
�f�����8R��]+���zW�o
˘�uv��
^�O���C1��m�9�L�l����z��Fɻ�?2VΏ6 #p�ϾmM����ILn at Dk�Jp��Ֆ�P�
�ۋ���3au[�_{����a��`����l�SqjaЎ����w�JQ�f��4 at o�=ݟn}�7
~�YG�$���L�����2�K�8;�'����(�S���ݘƦ^����pA&�1��	h.�ݭ�vGk_���`�1unas�c���_
h -
�i�S Lx�Y�WFT<�c�b
���<X{m�Zt�����#��睳�t�L�Kz��s�5lCDE���4=7���b��j/��7>���fEt<�MH�*�m'���߷y=Q
���[���Yrn����{
��3�
ð'!�
�	ew���@��O'@�?���bd�_�d��!{�!�4�k�}�E�~0v�|02H�
��=�ȱ\��8�u�4�u��V{�4���yN!���$9�1��
ttLIj�[SgJ�W�_�����j�N
5�w
Y��W ��s�-a�r�_|�S��K=X�����&��ߧ�x Ēm����xŵÑ�����=
�@���r�Ḡ�VQ��UT�m��B��
+dNPO��u�Q��Z��;{b�=5s�?X8\�����W�S|�v��2*�O^��Aw,}M�hx�緇k�9�Y����C�ׇ����i~���n	�}��ݹ�Wֹ�Q
��p��:��#�5��|�_����19>2�pX��qJᙎ5Ta��jP��LxH䷚���:1ۜBh�i����4<��Ao=Xg�6��)�>z��
yOJ��~����\P~S�Wug
�yF̪{�Z&�[F�
�
+t�5����c�-��/�sl�Dt���Ex��
+&�Hϥ��
��&�rd�B�_v�y扪�^i[�GN��1Z���#���[�s�wf+���r�O��|�7NܚC�
�S��jxp�e"j!��8H���|�T�#e{��
�L�Cpk\똔�����DZ�Lߛi~���~q��A���P
�wDIk��m�5�5���r.��3.d
��,*_�+���@�x�����+�~�_X��>\%U�\�{�^U��X��T�C�4���t��x�.�L[�-���
�`w
S�B/�%a�^q̂S#��#�1,�B�f2�Ɗ
[G
+<�S�1=��?
J؛)��?Wrcs���bc��Vl�O�#�1�*}<�+�s�ճtlj���E�+KO�7���lͫ?v9��)p��J�k�'�w��|r��4��S��"��*
+4�ɢE���u�f�
+*ݱ�Ns�
+��u��J/m
�(c%��Wte�( �B��4	?���,81(�U��pͧf<(f�b"Z.;���c�v��A���һ
������L�O��
豕.
�B3�x;�/��^$U��yJ񹾚��T������}��W�*�@?C�$��4IL=�� M
+J٘���
kpU1=��-|�$"Ѿ���$���b�u�����@^�ay�m@�[؜#_ ��
��91c���Q�50p�Եޘ�\oJ�
+�~��`�T f5_�D��<ږya�%���w_�6&~���8g���_!��w�=�Gf�ݝ�W�D���yt�}�< �v	���v����逞���kCDq@���iX���
X
��c[����G�e�
V�w=>
T^`
�眃%nO�D������_�M��0�։և�5T��,,�<Q}wo��[����
m{+驺p>��N��I�^�_�ז\��8� �.	��<�H��zX�bŌ
�W�)6���,e�Q
���8c
(�㓓@���;#��o����P�������N䅜�<X%�8Č� tswS�;^C=��C��Єx]S%%�1��
�
O{�9W�\?��q�*�+��%�M��t���*��On��O
s���:d�z�:���; n9�6��=��
t��bq��T�󝹶T`<�#�Բ	!-
Ӱ�'J&�O
��
qb�Avf@/fqY �҃���������v~P�&��q5�F"�U�R���\l}�\��t�]W�UKw��\�m-����`�-�tۓ�Id�:/����v&ZO
t�{3�5f@�X��c�C���R3��M�'F.��ȡſ�Dh
+�ϩ�6�ư�)�7����uVկ���/����
+f�K7�e�����Kجo�	/��q�ǚ~P�#x%�u��7�ut��"�-��,`s�}���5rsX��h�M�Wܘ�� � �E�X���G��y쐆�;6��F/޷>�4���p
+�~0�~+j��������o��,2���$"w�����`��uZ�n��%n������Ql�=�s�ăEp��"�i@�|��G�q��9�vL�,�!���'L<�bpO���#K�\�$�
��Vk��}��*�<��:w��Ӣ���r|YDB��� 7+4
���;��ڹNiXfW\�vT�
+* ��f�}�����e~%��-��AOD]�O�f�d����*�N��##��l1� �c�rz�}
��5~��oIjpKЅ;Ӑ
c_�񖤃��<�jkʡ���.�y����1��n9�ƾN,wI��

�3��
J�[� � ���90�L���^	�ʱ�L9�l{�;z�;ɲo0[���TbE
�������7�������f�_)�+��Uo}���wY�۫�
�@�]��;1wO��I�#c[�WRv�z�_��'�
��'����19�)L�[���7��4w���C��f��UЌ����Ur�_�j
+ʸ��ޕk����ZAg[��
؀���]�
��
�`
l��5�|�@������ҋ��C�g8�>e����`˓Ol��B�
+>�+��4�����tl��̝S�M�`H�D��Xt�:�0��c �Ayof��j�P�jv��ZwG��̺�:��~��*�X��'`	ց����쳖������	������#5
�]��{����I^4չ֒(���Q���־�����Br)� ������K�Y1-�3��?�Ķ��z:�#&W��s@�%�՝�^)g�&L��
���s뮏"�.uץ~k�Ee
,J�FZ�C��!2ϭ�r/�6�U�
rs��;�+8+�l|�p	>%�5��7F
�ڐ�%*ϧ����tX��1��v
z��ܷ1v
E�
}���[&A����w
CM�S��~X�y!+�g�2��9�x��e��1R�6���ܞjI��g�]�ދ�ϵ�*4���1O��9���P�����;FO�%A��1�nq7'�
�n�zJ
0VPo��v�� x
W
��4=#��-B��η$hz+�nM�]bRÑ��i���ͳ𬀎ˏZ�~-��1�.���N���	�;�=�N�MB�	(��N�sjh�����er��"�|{��o[�G�_���}������
�+�Eva[��L�S�`�O�
l񞐋�.Қ }I<1�wx�����
�7�Xg��x%�Ұ��c�e��'�o=*돝^QDE�k&P�@C
�y=}{����Q��!94hH#�șp�������y�xV���5b�o�P�^������:+�ZF��}��3�謯e��k+���Yg�9ߚ�jn:V����{�QTV@�#9%4HX�"���3���)'�� �ߞ�$
����
�W�ư�k0��%���믍���gw�ӏE̒�I�?%������6�/����l���XnI�+����NB~���`���e|���������(�%�s�u�����[O
��õ��~9��7 ��v�����7 at o�˵�pzLGCF�tl r
�5?����u&R����ߘ�]�����~i�h��`���c	�6�x��4���&ݽ�nݙl~��(�(먾a�����@�nN�*<�N�KN�vo�
+�r:*�cQO79�#
֠��ѧ����䶣���&�ׯ��v�Y{
uO��ַ92O;
K
��^Uv��ls�*KۃEd�7�M/���]Ұ���g�G5d�d��9��ɗ�9:(���
�����A%�:��T���>#��*DfNP
+~ꃼ�t��55�oD�X���ޛ�{�X'���b@!D
5�G��g�&�m����-ė:��)�5[�QI�����[+Ħ�YDQ@��
j�����
+o�:�Z��TL�GɄ�4CK�kl��"�ܯfSlbJ�����8,��42��`��n������x���9��8f� cz�woҨQ3�
R��Kq
��L���^0�S����^5ᐒ�mR�
h��Q������R��D���e!ӈ&b���6�Q�
��!V�/�n�j6:oi��Vr�t�ʠ�s-c�
���{
�������_K�%��X�?����G���?8��������֑�[�S�wm�շ}��l� �Wq5#���~1�ѯ^v�G睲�Π��:6�".�2�J۞% ��*�����UD��0���^��
+��
+p�n���� �8��l��,#��FK�N�_Uvf}?�x������Ĕ���
�t-O�ZӾ���J}�����P
���JH��b�c�j���|�c�\YLI���D��8��r�\���
�N��ڝ�������ߞ[����7�K�
n}h�)����DH����ᗼ���腗��ʛ����[��l5�lO�X��qo�k\BD�K�=Xm|�[DH��
ʨȐ_oV��[,yn_k~P��B'��V��	x����{
�9f���Ќ��A�ڱ�Nߞ�?�͐�\.u��
+\��lK�&��9r�O@</P���fiu;��"�
�U� hr#~d����$x�l�S!�*�u��}�t�c�%��l�_ʦ�֑5�Ep�s�%ǻ�,_d_�e�ޙ���-a�,�D�$���2�.$�N!����\�zwӣeN�3���+�t��68Y떓��@��-\�_��k�Q��A�+�����J�^����S��U���U_l����L��ɷ��m��<-�ɢD
\�}Udpα^�ұR�
R��Q=�c���	i�G���j>?b����_\')
T�!�b��
+�ѫ�C����MvϑyH�ێ`,޻ʭ!�B*��&×�FA/Py�>
*�T��2^��>
}�;�|s���GmO��qj����7�>�Ͽk_B�I�
/J�y�XGn�O���6�>R�!A����f�e_����� ��6��c⨩w���i������[��L�7=dU��v��-?,%�z�i�B�e�T�
�#�4\�3�n8�e�>�C]g�E�b�����5�
��,@#'ږ!�[sM$���7�h%
+.�m�������A�UR󩖂<�3
1<˱z
Q`+�bT��*�m���
�w�j��s������A$_\����3�I�5�V�|�A�8
��W��_��2~��iz0�+�R���G;�
�aq���R�K��QЃ���_]�Տ�+u�|"J��T[����Xꑁ�86�`G&��B��X�P����%�7��QM{���s$�/
Qb+\�-��C�H�Y�w��o-3��ij�
yg��d�<���yB�5�?e��L(��˷���+��c3�pl"a�MḦk��M>
㊯
ߤ���0�Y��46+(o��ff0l��/6���i�
��M�<	Ka�^ī�f
D��n���"T�e�ᑡ��睙�_��	.)��#�b�.}�T�Uq~-��9���cV�
+�o���u� �Ұ���4>}s�t���H뫳��O.��
\�%}ч*}c^��}*"Ⱦ�)s��`������x=^)��+ŗ��A/�}5�
�w
-�oW��v%��gd3
JJ�]Nmv�y���\Ҷ�����~n��#?l�;�8��L��	�W�
+ /|�ɐ���8�㾀V�Zc�
��3�}-�V_
��}:Җ��D�7�EJ��
6o��s�1
I
+1��
Tf �op
�}���׏�g忸���eP�7q�!��c�xH�&��\�C" ,
+PI��Yv�1
Q�i{����q�s�-��3���k�ng
��l|�M_kʥ����+��R���w�Y�_���n�aI���7%	7>_%���c�{=��C ~GU�*�D�CyW�����A�m�����*�7S��)��cJBUX�-�o��ms�כC-�J�@7�������m���y�?�
�����2n��ݍ��
�~잇gh��n�:J�
a�A�>(�
����w�����njz�n����0:���B�\�P�z�
U|d�4��G���k�%,DL18
�t0<bJM|݇u�쪮����9(��Hj_7������

i
E$Z�Z�l�
��8?�e�f���^lI_����d~�r�@G

B�� ���>
P#Jv@��iſ@���_Ϧǂ����3�	G
+X�m�������4�տ�F�/��97����EW�:4f�7�t�*�y��!�W��J]
+�`�ZP��5�p�I�����7PaG@���T���.��h{9C*�>	N�����?z*_~�_����`CBDJ��#Jd�e7���s�5r�c��uD�G�,�H5 �������
n2�v%&��k�o{w��+�n	��jέ���&F��i��&iB��I�F�������>	<ñ��do��nD������yx��ճ�mu,�J��0Ijv��eT�'rZ��L���qp���᮶��O�/ݚ�a
���5\s�<\z�`���V��x�h�������Ȉ����
+Ģ�k2���$����^�� 1	�;�I��þqN�+�]-wW0gT�⟕���Rv�y�ꇭ1l�O��z���:2վ�H� cp��kH�vf�����ۤ�Wgu�59G��%��X�3
~u�M	+U1
�&�B�{��
+}��iTّ�{�%α���*�o|��=�Ou#���+�[!7�_Ϭ묺��~��p�ӿ�@?]�~
X�6{���F�+�_�;��O�4�W��
+~��s����S��2�ݝ�{���mg����;��}����ӹ�g�s��#��o�*CrX�q��.���|ޓO���-$���ֱe�ӭ)����b^��ҿ	�B�]�FCg�
�
2�/$��6й~1��/&B�Rb������ds�M�D�_��*0e��Y0
VѡQ=�x�B��/�rrCTG����j��?J89g��o��B���?���Z���_��y�3��g�H��n18ٵ��&���
+��`���*b�AH��
.@҂2\�{��iϻ4~�����v2�Z��럎"r/�!��=J�����o9���W�
�$}���悌Szk�W� 闳5'����� �^B$��B:B�M�.�̵>����	y��vV��
<�'f`�6�&������
�����	u
`�c��m�Z�[}{g��ZB�٦@/��MI�����F+�,��4�¦�k��k{�(`�UWE��/��^���T�y���=��m���a��>���'�mo>wΣ�ݫ�5�𚾳�{��_R~?f at Uo��'��~C�Hǡ��G5\rDAi
nK�k�rCO�-CG��
f�ᖴ���}�^���S�̯��ҫ�H�[n[��
���<R:ȯl�D4�F�����=��:3��͡�_�KȌ������'��FT팰���#3���l�E��G=2
M:հ�Q��X%U��lRXɧۗɅ{����4ܓ�n�{A�w&/��UJA�O"f�5jѭ͡�� �P�W��mMS����/����&3If&��Lڤ�^LLb4���{C���A)��J」�`{7}~��?y��ps��*��Zk ��n�>�ۚk݄o�
h�?©�5�o��
���0�~%�>
�
x� ^G�I;�&�K��6M�}C�>�@y����'����O�oN#
+���5
<a���������������+G5��'w
�|
��)�6��� �~Áo�ˮ�ȯס�1�����PËM;�k�Maj^�7Ӳ��w��=���5@#�{�e���������ui;��U���Ȣ{�.<h݆([ӁS�J@��W�L�����,:7&j|�� �m���9�1F��k���u�J�v�����Mӣ�ړ���W�cvR~aII_��
+W
���Y�a��M+`)���۳
+T�[pVP��Rtq�W�`AɊ}���S�v��6�=����с��W7
]%
���+����t�E�m�X���
�a
���YEC���o3b�v��i�`���B�m�;���U�
Tۄ�-s͆jތ�"���`s�qaͣ#T��kt��Sui�����Q
��
���JP�� p߂,��O��m�����Rd�o��g�iQ9g�T�o�e����#��{Qyœ}7��S���<)��|d`͍�^s���LԞ�Mذ�*Wu��e
<e:�WaQ�}QG������
/|���B�i��R������|�DH�s������ܲf&�G5�w��1#���
��Gkښ�
C%��u��;>hޞ�����"�[Х�fH�g/�����r�J7���ϣ��M�l&�ic�ٹ��Q�z|�T�#'=�7.�T��.l��)1��5��Ϗtw<^�Q�'��w4��_95O�K�_���7ޘ탽]R2�f��Z9:��d&oU�lYQAS7M��u�|)f�Nl�3�e���m�$�?�p���n�0��;C7�Z
{x����үs\źS���L�� ��ð
�+�t�Sywˎ��F�ݒ�蔻X�b�׺�Yة�.9Y�O����>�P��8�7
����KE�}�:�C �?]���[�NJ*/{٧���k�fL�������^&Ϗi
��\�#�~e���NP}�茨���ݰl#�%�<AoJ��яE�{���
‚����s��+�Ύԯ�l���5PJn�إ7���g�;^l������
l�37��0���aK_���<81&��
��
 [...]
�:L���9���'�����̭��
GT
8��ה
�3���[��>
�3���][��5SgҦ�+m�
+���;�F���[�b U-��A�5
4�����z��(9;ί��g�b�֌S�-σ���ՠ�Sz�����غ�w�����
+�F�T�E�*nEM�W,��Y�Վ]��"�f|��
��jg�w�-�g�)��S@�Zl����|L�b��dlXJX����
B�����`4��?�Y���AP��1q�� 0{��$.���
�0Fc�`��
²U��T�u����[��xi̯�=���t¶߸f%4,�
�:t���X�`�6�9m�>>�roD84�%ia9?��?�G�	
k��8�1���K[S_�(e>���¾MQ��H־��y
�$A6=Tز��dc7<�f�7�m�4������u�W�Z��M۳X<J����'
�<�uZ	��pBK͔�S.Zƙ ��FP�?)m���A+?�h�

e��_���L���>X���-y��Yq`��}�-p��G�
��qE����O2_��O��ÙߕK���ӊ�;����)=�I�o�8������-����Mm��y=
��6_q�*�tP��p��΍
����`o\�����Y'Z
�15���7'%�������&XAx�덎TzeF֙�iǖ���YKfDႅT��d"��٬u
�Ĵ�]���0�F8�U3�bZ��Ef��]����ݏ|şC���	w��ue==3+nK��������!A��Qn�%����'']��iU�`YND��_��fzk�������ߤm��hz��	�~��,����ϸ�����X���Z����#xО\U�>��V_u��"K���ך��
[t� ��ӆ.9��0c�����?�u�?���޳���J

�����_��+>��龖�+zp���)gYW���p0�"�z����[����:��Ɂ	k�5{����Z�M��1�ڴ��]�ڨ�5iAќ�d�L�r��v�T��0,O�-�0;��$�)� [...]
/��D5/[`�s2@��۸3JE|�i�A
� DF���
/
��"�z��������3��;�VX�� 3��f��'l8��K&D֖Q����j:�,[�%{>x݊�8<#�q�F���,1��.q�_b���$�u�:�
��E�hł����m�
+Ј�!&��_�m���-Ġ|��v�,jD�/X>�wh"
�I�=)��V����}/����Zuf�[~vv��Ѽ�1>M��=3�������i
*TzX\su�_v~a��Ł�ҵ��6F
��y
8����C���
c��G��5'�|g���
pX{A�����j#֬��59"cB���é�����"�� Ud�(_��+�HZ_SB����S~t2�n��`��A���yh�������4܏��/C�_���?}��{!>��l2�% �D�$�H,zsj�
o���ߍ��O�U�
 <=6������Z{9�ᥣ��׿N����p�[ѕ�`e�/�W>��w�t\���GY��翺~�z��0�����
��w���K:L�)n�c���?�:���
6�j�_�����{	�u�b׎*Y��c%&�>!�}�j�WːUϧ
%3���	Ac‚�z'v���;=������!T�(� ��j`���qтO�}n���DZ��
0{VZcІ�
/
�"��l���
���N�@�����&(�3� �0�4��]'�������Xqy�"������(G��x�%�v���X��0
jSD�+Z� �cZ6cn�6�Eem�Y�y9���=���\��S�ѽ��lzb\7N���[�掤
�s?�b�) �b>�
ch�Y�8��h�;�ʲ�����3k–Ę�tՊ-�SC�
���fcvoF�OˀI+F`ں%�x�������C����\ͦ�p�u�:Q��t��0��1HE�I��
S���>��o�,޿&���c��
�bՀ�Y���� 4��i���FU:%�T� 
?�����^��Z.����[��o���ݝ�3�CRv�T?>mYO��?<�=�p;��x�f��:����ƇAi���q&m3��.
+`�C��i؃P��	��𻅍ts�ҕ��"4,h�+:D��Yy�����-��rmn�\2&��W!�ό�:�m��W�
`|T��]�j浠�1H��L����{.F��X��Z�C�6-���;Mb3�Q�<�폃BP⮓
+=<�&i}8=��\�ʾd V���a��Lؽ����:ko���t
��,���QB��#Ȍ�Gi�O��^�d���1m�-L;ŬI:���^�V<�ـL�ňI>!�&��Df���*�0U~i�;H�� )��	3z>�������S����䌿"JX��Wڜ��Ԉ������ ;�D
��̢+C�/OI�}oB$��Sc
+�������U�ɿ�e�.+�v��w[���B�A��Nb���1�B�'��B�%|�c�������v
xa����l#���vaZ��~��PM=m"f]�J
,u��:���H�\,@�H����;
6�
l@)XPa+c����!�oXȭ�&Tє�N
O��M�vD	M�?9
(�
ly��9<�G'�������kN"��*����f���:Ow�%U�k=���p��m{�����E
�}��Ru�/?��U
�r��r\��xIJ۴�j�<T�0���E���
���DU~
�࿄(�&���2�ߦ��t�i��
���V��]�����f�G�a~�b����\�����Ţ����ql[PA,\��v�\ʪ��ՠ�'�n�{+.L�+..ɡɳJB�H/��� ���������q
+ή�2�=Ď
��d��հԀ
���c��E8���>����|�ӕ�c�%��ƪ���'U̩0��]����ˑ���2T��`�k?��܂�X�f�c|V�a�L
+��_��\\P6=�rak����0��J
������-[P�����}�԰w��U{~:j?�e/�	�k&v��!�YH͋j˨�Y�$�s�B㧕�Ҁ��gf���0
�
��G
���6-��
+���:�
75���#��kJB�Ujы4]Y��ۤ�
1��Vx�* 8��"P��j͓Þk���gay��i�aOc��M�~��G�H�-\@�
�q�֖4/��1�]|FJ>����$�	q󓐚X�Q������ޟ�Ѓ3B��ׂ̌�,�g?�
+o
��?e����PқS�
�U���q�1���P��ڇ��NZ���w��yUO�����܇�H�O�}
�_F���^|���04�Fɽ�ܢ{G�����g�o��0
+^A�vFWDJ��s�
�|O.�{D�I>3;T�
W������f8_�8}_�H�]?�|��
���brN���y�g�
]�~F�ر���ʫo-+k�/
���k}p�Sv����rck]�(~r���7wӻ�&�[���d��F�-/�|�ޒ�D�2
S��A{��kv,��T�����?�<��.��?��
�[
d[_W�=5�������&.�!��.d��V�� �~ņ�]s�:�Vjsx�~����t�4����g!A�u
�䂼+��to˳e
��'j�?�����El�8Bl�
$A��)��
+r�L����
�
⢫�gB�D���
/��mŔ�X����-$oǁ(�q��1
��Z����L=����6),���e�vbF	{���7my�U_�$��Iz'H�Z �c��;�:`�]
<]�3@����m=�;��]�
Ө3Fh�v�A]uSc1F�U��f�ЬE;�l{� ���-c��W���'�~�&�9�������
�Rb��WG�/rX�	i���^������j��JlvĂ/����3�)b���1�C��Q\����

Q�u�Cj�
P`3FL���X�d'���� ��b��b#5��@���T�d$��*Q��A�k�����pgU���nq�眔�c���!\���Z<:�*�
�
+�T��?	�e�F]� ��tЬ%#�l�JnYu2+^6:�������+�W_Ʊ����[�uWg�
/t��󊮜߽��+Q3��$���r��9Uo�܈�P�퐸���`�9:kB��\u��Ķy
4kՂ��2Mg֜�x s����1�����,�p�%���=S��Y�3��gD����߼�3#ݵO¢�gKdŌ���-hK�
�Q�bv7�n�_�#KW��Y}W�n�cv�l��,|z�&���-'�?�
�f����Ckb97%,*�:.��;2�,*}y�x�g7Gq��YC�x�%%,�9oG$�����cl�\3�OX�S�c�_���C=e"V\v0j�.뱕�Zb� �⼍��h�K��[2��W͈�E#�l��íx�=�>�t�����%�a�J0k
`.��%c�X.mx��mz�n�J�3P�ɵ7�����
�"���S}-�g��w����[>*b�Bk��J�|,�����ծzQ�KX-~�N���*V=�,mڄ��qj
+�9g����

�a�Fl�
!�b\L\�P&��gwK��8��i���4��~:���!4�ر�KFlѢ�T�d���/g儂e<��ǭ�<�Wuw^����):
�ox��"�虵wl�G;�����"������U
�dEmm���a�)�Ȉea%4�C�J�
%@?�	�/�8�Aո��a�b���S�_/�aX����yXz��*wc�x�K�
��^=����f�̶E

�d��FL���}o��2���X䈕	X�
�l����5?�4g'�-�PEˆ��-'�d����{����k66|�D���a3t��i-&{L�ϘP�+V}<ꔎP��^FLBb�,�E-�
��gT��y=*�pM�
�nL�9b�ԏ�8��Yw���tⲗ
jճfr���ܾ᥀��s���lFV�Z�%�
\��
S1���J\v�N�����p��a_��
������
�m��{\ۋ
+긭>9<�-i�;����
����1���m[g�V�f�4ͪ{�C21DK�z��J��f�o�rܜ�������
�rJ��<���X�,X)�
f6|�
.�rɊ�	\4P��ո�� <!,��Z0���U��!R鬞�
��6��#zL��
�1����܈��5���&-��\�P��A��}N�l�t%-ɑ��6|Ӻ��9�"
+���MY��0�Q#�$,m�����kz����
_���b�<=��Q
k�O�.;��7
��wE��5�`�H��!�+#��Q-&�ڕ{
�l�Lm�r�k6j릟Թ�% ��ֈ�X�r9����� 
�-��>�;^b۞�
��!�}T�S81MX�R�L�vp���p7$�c�G�ʦ��	���%��:��{c��
l~����0V��c�5k7��m�	DFk�T�>M
��g����\���H�����ئm�~B��0j��}������-�z��jb���Vt��8a�E�ؙ��/yY������B<�?����D
�*)�:��
v����Lљ��O\q��W|$Ⱥ׾lG׭���'��u>@�6==܈�Z?�!-�ճFB��������^޴�����M��a�0��h��WuԌ�Zw���&��D��^���:�q���v'ق5?�}+Hǯ�Q�3.J���
+��I+^�D��8.��x9�%+�b#�
+\Ò[�d%�o����"�Z��_pQڶ�|���w+��xqM�a���
�6u8sՏn�g�G�uVd�2ӣ�8ŕ�����Y �\vX���T�j#F.x�+��fX��

&�K:��T�w;#
暋K�
���
�zf��
\�s�:F���끿�|R�J�Zi
KV!}��/�a6G at 9k.B��4��=�A.��5��n����>�j�ۧ
�D���8:H˙�p��BJ欔\���`���r=���rBE�^�r�~DBh�:����
��)��l���59�GLi�iј�_���W�=�e7���C6=����:�kU�3L��'&0aJ�)9�FJ�^�
��3�KnF���O��8�b�7F����
��h���a=�(�z�ڞ��kM�U�=��i�%5"'��	է��1��q��pg¢�<�
+n�4��m�e;�#R݌�P5#�kϿLa&��%�qb~.��x�d
.I���
_prq�N&� H!���vN��~���^s� [^*lՎ.�h;b�/u���v^]|}A��z��Ș�ڌ���.}}L�Z񰈫�
�eœrl�
_��t�D��nq?��&�=���	��歎q��1:j�D(]r1 K1[�q�!��-��
Ԛ����#lʼ����� ��
�

+�d�I�Z=����F>x9f��`Ʉ,��S��c���l��H�����i&gc�ӽ9ݣܚ�w�x��I{�O���	5a-�(��tX�L �tL��n���q6b#6m��+#td�Ml\
�tm8}㊎�	U�5����

�7�~]�
�
X�@�.t;$q����Zlu�~��l�n�ս?�3�5�#]�R��옒%/�eu��]p`ˢ֎7��C��p�� ԫ�X
a1wJ�mu
qJ���S#"D�����!W����3�k1�ٰ�K�}"�GA�� 3��ş?�c!"&�ᝠ��p�ryPN+�K�Y��	(���9�撎B�
��GY��X�?�Nx�Lo�R����ZO?!�'l~1Ar����%3�e���L�8M�~BP'�u��%k7j�,a�9��Y
�cT
+I�Q�[�VȨ�;�d��;Q݋�0I�ˆAn��K�6�
+����DZ��
+� ߷��5�3��-�HU�nrۮ�в��5G
@XK,���ۗl|Ҥ
�
�7]۴�Z��t����Z�RAQ'�mR�+������;�b���DȒ]��B׽�����12�}�����
�<���
+K�����;+VTՖ���豵v��@dz�p�t{��#�$.�Y���a��M]���=���n� 8�)'�Y{�c�a��<{h�kOZ�]��>�e���Cϣ�U�5��`6&��X�ߝZwg{��A9f�USFJ����7I�l��
�.c�6(���t+�ÔyPl���+{���\I�{�����<��V�{%���^�N�?�3�鍎��!*j{R�ٙ��v#�ޭI
+)b�ʝ7�K�#
܄���
"gz��a:{=���#t����2��[�<�޴ع5%4�����3k�T,���倰o+��[��tܪ]�5
+��
����fXb��c
+�̈́��P�
���褈��0�Ee�y�-��$܇�h5@���r�;�ݲ�qn���c7LF��D��r �
ҡl}��[��"�
�$C�9��<*e�غIO}����aI�Z��k�<�@w���|��ve~vBي�����.�Щ�����+Iw!�٩Ēe}o��Wг�c@����\To
��:�`>A���,�NMl{���mxT��AøN vɆ�澡:簴-�Wu%í�
i�c�
�x5~�m�"��,]����Ŷ�n�!wzk(�4ȡ

OS���o�h8��a���L�ᬐ�0_�
�"y��W����)��Pk�
��E+�v��a���:�tY{(o�T��� ����O)I��nĜ�������0_�mVh��l�
-�0��=ܣ%��gTI�4�eX��T�<c륯���e�= ��%ج9%�2c]�0$�儇�jl���ˈ�9�y
8m�w��xM�FZ���
]t�[bZ?�D��k�m����J���U^Y�m`��&�Q�F���F��
�t�
�����m"R��B,�9���.zȭ�
+l=�%��ԮE_��<
Ԙ�8���e#ӐC6�2���qيD
+^z�!9�j�^�Ϫ�
]{��4������\��f݄Ɲ)����������QWF��Š�7���>�Y&��
�78e}-��>�M���@�!�%Uq\21*����f\MP��Zqs�c�������L�}{�/ߛ�?ͱ�>D����2���r���ûS
�z�I���
+'��v!%k�܃
[{H#rٌ�Gߙ�1���i#�b�-m�m�c=�i6�3|f��$
c��1�W�'^
���XU��b*���a����5�+�&�s1^�'&��D���aNi��[

��C�q� Ϭ�v*�&�L>���ǁl�晌�K��-v���#�+�J� ]��z���f�lojJ��r �A5�?���?+H��5�zk�wx��'���l�];`�I=��?�G7e�p���g��7���;�h���R�نR�_�ӡ'��/=��R����?� �	*���-V������1X�V U2S�����!ELT'�ц^餺&]o_�_.�Z�q�FljU0�o�X�C^'�N{z�O
+8uF�f.�%=c��)~Lc��
��Wk�����
٬O?�Vk�z��T��&�X��>�U0n�s�������e�՝Djn�M��=����"�o#��?��#G�bڔ�Vђ*ƥ�i%�ݫ�r�Z)ԭ�zr
��D�t�l��T)[(H�=4�z���d
+��b,Z���s�4z5'��tE>�\c1�
�ye��/���)g/{)�m�
\��2��^��h
6�D
{
��/䐴E
�%�v�t�/V��O�S�/("�frܭ�o�W��#vRn�S8�
r1`�*!�9��7�1cj���Z�E�����AU�D�ʗ�Zjy
}
+
#{CG�2�@�ۦ�λ�U������9���U����si	JvO��?��j�}k!�j5�%��������ikgFlٜ쳯��3>1/�R��
+5J.�W
0Do����)�3U<~�u�;�:D͙�t�����@����:
�^��G���9������Cq����Q��<���SQ
�Tq����/�q�
}��ᇊ<�I�yC/�tbĤM�p�
�vT"��B(�H	��_�gnd�0���N�e
�p
�e���>��$�\])���b��
+�����]�V��J�
�_��[Bf�l�+�L9
��n�� g+5n6��F�K�f
5v�����TV9�ku��璲��O^���}�0��kđ�opq��5��t�a܋���*����W�BI֌�����06Ew�\��q<Et�3Kp?�p��(�L.g��A4��b4�ixS<,�TVL�������/'��$T�\����i&>����)�E��r�m4Ė_�Y��Bv�U7 
 ��`��/�!�_�I�1=
g�bJd�	��I}�Dm!������
�N��0��z?A�?���P`j�+`�?M
A���|؉�CؒP5�<�u�R@u
F��ol՞~���Ç�Nj+y?V�p�QC�_�3��]ʏ{�B<r�NsܳW�c�����(�oQ�͏��O;��A�R��=��9
�;�
�9�$��O<|�x<�
���j�ɜ�����ܼ��"	s$!�~��ͦ��OPq%5�� 
�$��B /׋��cJJA at I�v)�PI��Uṡ�N��zY-�l}��|s��Lj
+���ʏ�;�w�fA��xP��*��
w�z֑�Vչ�Yԓ7�������[&
���	D��݃�#L҄�����,z�T�����b��̙ʅ��7ap�-
���r=hh軐���dn.����?sӊ�˻�Q;5�AL:9N4hm���P���V\�VA���<�Ѵ\�w/�u�]~T
����n�*�{�B���
w�zA\V�8�x�ik|������Rb�
+�����s���g
�Э:��LzI�w/ނ�ޥ�f�s�{�F����1��ص��(�{�
w7
u��
������Bs�K.�YŌy�T
���M*àl�/�֠&.�G~-nu��R"9v?��Ǖ��kw�S)G
����}�#�ړ���LΑ�t��{���_��N�c�*�J�g\�=�N�g�q�������{
B��̫�!>�r,�@�SV�����uq���Ϥ|���=�를�~������	�?/Uy��+ixo흵�]s6�p��'��� ϓM�,7�;-
ԥ'���Kmбˍm�?��$�ߦ1�g拎ſ�9s!#�ޓ������\�>���(	9t]J �vuC�W
���W�'֖���w�]�O3k�g�%�O�{
?���=�����y"컿��
y�
+z�}��dB܅[5q���G2�m��=�t�¯���j���kiL�Z���:
J��
�(\)�bLǃ0�����%ս�
�l?v�F��+Z�n<i���%��[�G��c�
+��򛬧A��,~�t��tht�q-�~�Ji��1�r.���xJ��
 J�qQ��wY��1�;���8�4w�^k�����X��{�����>�׭��n>G
M-V�������E~[�Uϻ��
,+b&�{��~�2��?V�L��IcO������U��߲
+D��y
+�{��>��-��oe�����#)y�oS᧪�W��䜃�����2X8
�2{'���.���:��\j!��,���t���o
��קq�
5��|����
��F&2<:v���
+�	�c*|�GM+�(�
�� ����@�5w at p��:���\v,��|XWP�9�W-�)�@p�Q懤
�M��kX��J�x9�$g��9Q�!bcC'��6���)�
+s{e�vZ�x�d{� ����;�M���R�?�����ṯ�|Ʊ�2�省��]�
��5�����.2J��G��;s��d��
Jkz%f�@�i��<i����E=??O��x�
+y�~<0f�G.�.�{��<�,�
w�Ak�_�
�(��R�9Q����\�f��{���3���x���#zz�Je�sFjiCӍ����ú��6�9���\-�;�2��c`ܥ[�q�]�r$��w��\p��S�t�*猔�E��(D�����AK;��{AΖaE�% �lR-�x��Ir��c�
 ���Y�w�v��d��b���
+�����
8�3
+י14쁏{��.Z��8��=�=4ja�ZW�
i�@5�nx�'��h��]�����[y�=ײ+���+iW���v��-�jI`�TIz��ޥ ��%]�.!c�@(�3c��:tΨ�R�r3�}�!S
��N at Sw��¦�K���?o�"�x�nӑ���S�E��T�Q��\M�S
+S��ZK��cd�ME��c���/��Ⱥ�Q+l��z_��9��&<o�
�:��	9v�����N�ÍGmGN����͆Xln9����
!�tK�����-
�u�<�آ7	Tj=rPj��]�l�#�¶&"�ڻ`��^H~%�����t�������
�.�!q�:�|�#
��o��`�s��z@�5��:B"
�'b��� �Y:o�����n�\��m;��9C+������.��T�ņ&�pM�N���6j7���*{ш��I�	v��hPS4ZtX*/���*Ž�
+S�����7���;H���+I�Iފ��ҕm�G��F,��M/w������9;��yͺ!�Y��ꇻz{{����p��~3�q'�����Lڱ�Ҟ�^���'d �O)a}_�}"���ׂ6����� �m������>(�DVG
��� �0�b���l�X�գ�@Qőj$͟�E�<`]w_�Q��j����J�'v
y�;Y^��
��b�m���I5>oR|��"J���8uJ	��а�Y<�j������&�TW�-��r��l�ȗߎQ�l���	�Gt���_�.�hk
�`�.B�h��d����s
X�0
�f}�Ѭ!i��+T��ly�0sp�?G:ll�*
�����Xޯ�`MV�F?Р��O���t��A,9�]�^��%�ym�MY�2��|���Ӧ��0���p�EC�R�1�#��F��Tu	Ӏ��dL�=�m}G�5�g�5�"����qZ�}����'0c݋lۛ�V�M�=Kc}�U֫�Æ��Fa���?҅�
ϗ����: [...]
+����J���A������k>n/�f|
���^X����fX\scل)�Vc�f
�ư�>�!�L�y�	���׳�5���
+n�e� r�6�]���w�(%A-:-b26�2۞�M���l;���η3��w�J�м�
�O�y�Q-�̣��eݕ���2i�2�GS�@��dk<�����钷�
U��w0cX*)��*z6�rۚ��X2�j?�v�|		5�36�������K\{���oW
�RT�U����gh�g
Ʒ6�m����.��ϔC��B�
��
:J��S���6|���߸��}���~yダ�Q��6>�7f�����qQ����j�9)6�(ƾ��(i#fnK$�!�������S�#�2G�|
"�?�Q�Ø�m?�vր.�����v)w��K���7Gzxk>.q�π��I��N\Ղ_9k�Af�R鬷���cV}ܼ_��&4.;�e�:@✢���
�mN`�:��݇o�����j����5iɅ��p𑱜P
+I�<.E�CG+r+�o=zV��K��v3�sz�f���4�Sn��uknD����y�w�Üؿ;�� ��Q钓K�c�p�2 at qD@���Ag�3��V�Ra���
+�]ϭ
�a�V'ټ��
Q7�
+���ĕ���MO����=�E-
5k��7cŠ����KzZm���*ɕJ"�іU"�	R�����EE��EuãU38eÆ̛��������9��
pΎQ��D�bk>\㼃ڼ���}�텩���W,[;�m8!Y{#��=�~��1��V
��/�ķ�e�Ե�DV�(!ɓC�WS*d�� ���
[6o@����.l�a�U����3e>������32��i5�xN	��s��kh������m�p�i���ꤴ-�)5S
+T�
Y1����K۞�K���
+tꄙ	��
crfѴ����
�-;�u7�h��0\x}��U|0�"��
���?���s5M�w\T��(���3ל���j�!����W�i�
�/捴�u�s͊nX�v�x5{>d���
�]O�9̌�:�iAM�^1�d}	���F��M'�}r��Y�����Is/D�-�c�F͚���<���
�#������c��6K$l��Y��«�=
t�ov]�����;Sd�_RK��q��̠��������^f�����{D��Qrע�`g��=o �m�	�s��GSC��B}%Wg�e7�'�n�3T��h��1��$��u^��4�FuMo���WB’�eݓ�h����8	�i����U���4��a�\PU$��
�F�5O�Q
�L`;�=Calh�_��!v�O�5��"��
whk�NYqᚦ���	=�leL8�����
��
�QZ�G����x�Ql�7���(��k��\����G��b� �~ŀ)��cĕ�ka�fd������J��^XIE��
�
+]�#�g�
�vL�
D�/�xE�����9ϫ}|�M.y��q:�[ ^��-��8�~�P�p�ޕ��!����U
�1j ��9�]7�z�
-X5�>_PT=\��т�vQ��4�o���4��uV`悢��T��%�͖
U69��bLXseQ͘�2׍��55 ~JP��\oمپ�[s��,jYZ��K���m'	87��^�ò�۞��:���=$#"k}�d�)����2�˿�3iF��u
(����ٱ#
+����=7�6 k�2P
n
��l���6'}p��

��LE	_�a
�>TŁ�����$�Y�

�A�W
U/��-���d��
1��-k�{nT����MXPy}�_|}���v�x���(���u� �ڰ!�}��E#$�`��%�n��Fp꾣3��a�sdZl��6�,�~����A�.Dͪ�=y�
+N_�t�︡��vp��nA���K� ;A�
��E�Ζ�������;x�?L��i:7��x�we�yh��߂�
]�;`�����h��jA�VTŎ
[����'�|��tv��I
+o/�*�����^�����E��
�jgE��y�
t����K����8�f��Q���\�6E�lY��SCU��Ҳ�]7��K�B�:�l�45��05�O����<ȧ)��?���4��
��GI�
��SӶ��4�x��U�ag��ݛ戢��^�-O�
W�����8:3��L�n[6
�ɡ��G<��S|��
�iDŽ-ڳaJg�
�5�YT4�_V_D5��qQۣII��}3
􏗉���[���#��?G�?�s�/lh��v�$������������o$t
ΝlM�
�O�
���S듏>\�G?
��k��
�[�_�06�ܱ�r�=��](sMx�c#��Ա�'Gdm�b�xu���긨���Vh��n0��(yK
~b��eA&��t�=i�'�
d^�r�׵&��
o���g>؉M;ft麶#9*/��g_���Ό��~�T\�6c*�ԝ��{^7�'�غ2WUm/֕�����$-9�� 0�Td�%��6���0�Wz7Нrn�/�ܾ�!������ڳ��{8l�i]�v���0�co��=z�Ь�~X������@��U5�qnj����l��W�O���ˑ��1��
��[�i����ϳn�{|�N;3���B)��@�w�ZZJ�� !�$�
���Zk{����|`�B�:�c���%�Q��sk�
+�@E��\Ա��㚥f;$��
,�4R��2IL�·�y���
�v�1O��I.5�T0�{�Ч�eWV��.�tW\>ZᒍbD��$$�<U�ԧ�����z&��u
˧&C6�ʯ[fp�G����U~8AH0
!
Y�`�bLl@ï�*X�;�+#�rR&8f�C5	.	!c����y�*n���m�:2�"A����k����ߣ��ZR�S�N2O�"�`��9R�GK/u����e
+�
�d�N�Tq�{��蕷��m3�X���ο\_{��%h����v�����+�o���u�"�,bg��e|��Y���@3�	�n9��+g@<
+Fih��0$�:
�SpN����V�u�[h%'ou��
����1Z�y

�a�݃Q���w�[�抳[���~��`
�E���,���8A�>Q�OT���7A�]�E�
(�p�<��`�i?�)��Q��Ȅ���B�ǫ��>��N�O�9&䣞^q�@)�(k�*��y�-��^?!j�����u�p�
�7����I:��

c
�uB./wT>������b�t!��s ��\P�����������YB�YBL�i)��GH�1��>BL\x�v�E������u
9�
��
��ik GL0���m+�\d�Vz*n
Ӓ���f~7/�����?���{	%�
<�`o
!�Y&�X�4�`����s�GMC��9����,��]��C���I�s��\��
+Lҁ��`�ݭ���
�u5�}�čw%��K~7Aoiӿ�a��������֬��ё�y.tw����N?<l�}�M�H��

0�ru �d����i�^���qN%�b{nx�~�<	��V�uϡc�
L��=��»���>ɯ&e�Z+�(�{�׶���[�JÂ:B���Pq��������~Y�Q�|�yx���+�ذ��kbj��r
���\s�?���
�j�H�'��4)�[�0�۝^xM6r�5���{H��
+��y���%����B�����l�^
�щN
��7NJ��D$���=�P[����Q��[F 1�}yח^���s��׳���p���i�U�E
+ԥ&C�JR��
Ԑ
w�J�V;��i���>M(�0
+\�̍���.%�.���$����4Z�iK>5È��q���������y�oʦ�sK
���}���J�^?9V�Pxz�
~�4F��Nࣷ�ˮ-����Ж��� �SBH<����iN�N_�}���a�&&
N 
X'�o�$�ؽAH�|}�s�ſ٥
�F/��N?�q��6]u0���U}k��;��;ӍM�z�

i��Y�����#e}�)	5��n��
b� ��<:���+a�_���*�b�SC{�EC��������e���G�F�u��e��e9��(3=(唚�k��
+�
cD�Sےs�{�q�j���p

�:�<RuGӘvv�3�����Fw���7�GAի�ī��vR����Ts���x�8��Rg��nB�o1q?}44��9V��g�MOΎR�~��~�9z^���̿�_s�y�:�2��g&}KK��=���F���6�����
+7�1���_�t������W�sF�n�v$���>�v���ߚ�i?���
���U[uXP�,��ٕ1,b�+��8��WRa�ӂ�S{#�X���{QpկaT�u ��"���7�T<�OC�^e���$�u+��[#��V���f�~p0��0�D:�i�S��
b�
E��
�r�]�/�x_zc�rc��M����� �&Xf�1���3�o�
����
�0����)4�,�]ݔ{�h�K�?S��x4#��1� `Z�m�K`q�y�LC�'����x�G�J�s�ǔu@�y���-�G��y��/5��K����E��q�uT��Fќy�o`Da�,vB��*
"��T�g`=JZ	��B�<1e���5��.̍�Ӈ}��� >�-��i~�սaz�� 1r�qG�TrIV_pV.*�i�����-Q���n�?g�P�)	�A�3�,6�f�e
����Egŀsf���ȕ��S��试���,���؏�xO��J�
��l��{�ݥW�F���>�~��
ȽHx�?�� �O�^�^��D.�*�"��8��*���(3�w��j�pᓢ����S۽����8)�>�*4O2�Ӱ�݁�� ��l���y���ѩ^���}��vz�n��+ì#���)ߏ�#�	��V/��ƛ��������O�_lL��)FD��e>�r��L���k� [...]
jY0�
�x�
4|���L���B�{J)�8����~�&�<��*MS�<em�1d|n�w��oe�ȯ,�q_69$����Vp�7�*�nt����,`|_�4���e�յw������jr�JW��
:1���
�?o��!�����"�b䓭q���O?^{1�Q1!f16�.Aƻ�0v)&0
" <����k]G�#/�G�
�8T�^��1OJ�{��$6a����yލ�
��}��s�f���a����Mѹ!z�W�)�O��E?�
f�L����g���(vPۻ�����K��g?^�Zj/�y�5���.V����f_M�v��j{�ٵ�����{�IB��M��IF�Wk�`��S�uKᩅWe�O��~m���a {n�
���)~P���8'﷽Qr��
z�
��Nԓ�&��k��/MC�٥.~f*���Ȩl�L�d
�����U���7y�ˮ�%�8�[�����h�Cc��9_]�����袦>��[�C��Q?��Anwࢾ
�$�l�#'n�W\5��\sL@·��,�'\U5&�l
+ʹ�'J¿a$\��hp�
��5��wN�c�0��Zek;
+.�ۊ~}�ͺ8LM���d�g��"�rz�k�^�х��f�~{8E�>�dA���w�-e�^B���ϯ�)��y�)%�/�_���GƂ���	+�%
mY����~P�G}�ؖqz���$1���ٿ_����7T��SӋ��'/�,�%oH���pJ7�C*�9��猲�~죦��}	����D��×���e-�����vb~�j���a�S1/��1����⛖A�#���iق��~��<Ѫ�vF(	���
���;��������񊈏
��/�
��81�>ρM<�
��4!�_��9��r.Zs���
����n�!&E9��Ř
������_`T���D�����
�]�B>n5�p�Y�)T�[I+�cS�;^�U
�VE
J �;��77{��xT
xP_KuHi9�#
<�Y,jz�
�O-"ye�r�����P�k]�׷�k�L#�$ۜ�3�Lߛ�Ǯ���]l�\��E�כ��+�e�����G�֎[���(�3V6'��ߏ
��i�A��7Mɑ����ǧ�O�r�u�?N1���b&�0D��f��9?���
l�C�/��	�Sd�p+�ޓ�̀= w>տ��Xx]��q��hFg�!G�^���
��[=�{�Qb�� 7C�uw�
�̯l [...]
+�{�1�[=Wֻ�����ߎyr8�G��3��u�A>�j�mŕ�7�74�!�7�cc6GI)}�
�ig
r��%�Ë��7:sYj�;m�˽e�@�4�����
d��s��G�
-o����7�����?�����]u{�����
z�*��?P�WO�h��A��9
���ͻ9E���v���_�Ę��5��*�~��|S��
�W�sO�sM��S���4�{���wʹ�k=�{�݈��)b.`�B�4)�1G�ug����'��&���5�� '���{��:ew�:�''�
�f�+�(�$&V۞wf{�Տ���AO&'��眝�&�����#tne����]^|�zh�!��ˮ��g���V��Fg��8�G
򾊃\ꬼf���Bsҵ�T�
!�2\r{�U����Y׬Ӥ��Y4_Wua����n.��bm]@��YŘd}k�5�˂�K�UwׇQ	
���=Q�Y|
��P
?lp�l�xlq��h��P�ԓ}^בx�8���k)�T��
sh��n
���0�VYԣ%*�`�@_�%����?Ti
&E[��^5q8EKuJ����@�F�s�4��Yj�����r�8JIZ~Uyi�]Օ��5M[�imC�� .�;/Ĭv�oo�C>�(���~8N��L��/
~�
�?��\7M��2L�ZvN�P��R;��n�y��
g�'HyK
��
�%�\s����o
%<��F�;aa�Uw�ޢ
U"��$�h�
1�`�	�9*,�
"Em 
,�(�u�}�m
�'�4%ŧfW
��

�c]�&�z#o�
yMQ_��$+��9~�>Y�*o��
�S��%�m�
ȥ^5��p�&F�T��|m�yy}�o�)r�y��j
Go��/47
�إΊ�}�����g6�`a�y�X��p
��s [...]
+wzr~_h��e�U�����';�!�
3���޻�̔$�%�=
+.2���8��d]{��aj�wS��_�-E�Um��Җ���īߌ�����7���[������y�Vߕ߰˨%�Wr����w��N3^5c��ot�\^|�}z����f?����Y%��KD��V11�-ayg�)���ح��'���H��&Σ&�h�"���bS2�Jl�O��;^�"��9X�%M�
z}�����4��`���;��Y﫺7�J�0�L�z(�fԠ�Ӱ>�J�%�5N�
�دm���c�������3
����'��|Z\�R?<�|�?H��
�4��B���_|e�����(ȑ3�P��-�
�<�®���	�b�u

���bt�ʻ�K�Wֻ�ל��2�=g�}�8���+%�3Gΰ�YzSz]�I�f�-,�X�,�II)�q�3�9��r�p���g�ڥ���
:�W���ɩ	�|�=<l�u��������q���D�[^���c�Y�?B�X�„�d��uʩ�6	&�#�e �L����lb��M��
"'5|�GN�=Y`‚�<� [...]
+t��P��ݞ����d�gc��9�,��t�<n�����,������{���k���

�¯!��+���O�)9���r*��NHP�T����V"(�h���
a#t/�.��g�_{[q��"��
��P�$��e/�2^�� !z�}�5][�1+���W9W�u䊣U.u�7-,�t8C+����aX�n_I$��ު[���_:�" �Tw�2/���s�Ne
�!e�n���ɿ��c�8��l��U�7pj��|��R\a��ZFMp�C^Z�=��[ ƪ���K���5
co���zW�/


�2��z�Z�z
yK�-�̈́���2��e�uՄ펠�,����p

�;�x�nN��Оyfo���O-�:5�i����U�
�<� �>��ӽH�I^���\�	�*�h�Qd��2��V�e ��)���\�e����vs�e�y�=wk���n)�y���诇믫/>���׃~�0�F��w
<��,6�:�|d�?����S�s
+6�)�Ad�!��/*
z瘥�BR@
2����b��#�H�<��6MJ�z.d��U����__�j����C>X��ҵ]��U��ԝ1RBh��[�(5���;�~䜡��xPˤ��2͇��c�V{	QYk�S��
�6	?o���5�|���v�i�R�6�G�����wJH�85�:FHvNSM���DM�y������ɹ
�OV����x�voeBPU��i�\0� �7%��UG��
�C� gW�K�V�(��&�8Z�Eg�����v��I���;|
<�G�,�A>�>;7-x�i�(�w��K
�]��.9^
��_�
+N�q���=�y��
��
kg���Љ��7Ư0O�ָ�y�n)�8��\_}��}��U�
1��������yb��2곁�ti�&	*�8�~
���
zK�P���.�W�
x�R�'��
,�s�O�be�>(,{�1ƃn��
��4��W%��_�M7O���/[��k\�EI�8�3�4�Z?lpY�S��5�*����G�t\�	`��V����=�����\kz��pI[5϶�qQ{#Uw�ߤ�d���m���i��m����r�Ĭ
�,��1|�c�W��N4��PO��	�U=e�~}����f�����+�Q\�o�^|�fBC��X��2�\-�K��-���)��!H�I����C����7��R��\Q6��*\A�kZ 1
��1Q߷A�}?�J��vۣԬ���w�_��g�G:�S�<r|�� �n/�~1���z76|V��.%f�\�_ŭ�+�E�)L��p՝��������8�H9@���/P7WzQ�YZ�KF���8U����g�G��
Yf�'+MM�9�
���#��0�Q@�*=R�HN����1����:���Q�����@C���3|s�"/��<��GG�2���\�2�4Ry�8Pvu����[rے��Ӌhs/��4/k�l�M�!E�c-�ڣĥo
_�����g����#��WpO-����"ᑁ���p�i��ŷYWկ2~5�-����"�Be��W�z�Q~����ph>

�ŧ�Ơ�]3������6
+&
.K[�"\r
ڣ棽*fEp��?^��ɩ�����,e�b[G躏c��c��r ��
ȗeʣ`�-���-���z4��i^څwU�_~Q|uw�2�6���/rI����=P+K}ԸP�{�|�CNL�L#@_��1N�,
+ʮlb�LpK�gU
����z��(+5�m��S
f�A��U���z�K�Jm���2\���k�o��9Y�@kviI%��w��aw�Zҩ����ͳ�L��QX���iɻC�x�$-
�|�A� �x�
yt,Hh���8&�`	�z�=]q�+EF��in�m3�
rf�w����(�6)6�4Zqs�}�o���nI#�#{!�L�"��h);c�\���y �Fm�G��z_yS՜wVِ�
亀VDޟ��,��_׽��m���S!�祗�0�)E�PzQ���a�m՝�z�u��ޗ�`�loq�8���
 ������o�;�V2��Z�V_u�����
/rϙ��	&ګ g��J��U�'fe��	V��4����/�"�K�i�)��� "�9�D�,��R\�
Ԓu���j*:�jH�~����8��Jw�-��R4p�.�V���t�� �9딶1�guCک��̋6ӯ�#���*Z
+N��w�=O�:
CFئб㰇c�G�Yj�uNP�|��z�J��MB���'4�|�$�4>w����v�y�dućU��ž�:�P�L�� wG��m����P�yW�a�
���L��\��� �Z���ˍS�$�,9/�����y8ǣ�rK.�!�
���;\�t�M�o�!�İN*���|��h��mo��q���a�fV����V6f�n+���Ij��������7��z�����j/��GIǣy�<�Gˣx�<�h�MN�.5��O1�Ϟ�0j>mp�7^
-	����S�1&(ܜh#��J��XYG�|<8���R}�����O{mb��@`QҊ�����f�C���v���
�Q*�bD��"٣'BN�k�A.؛�욗��M�NvkEf�$n]#ϥ	���*7Oß썖^wHPOjfY@ǩ�� �����;f�)T�jO������я@���lx�ձ��rFqh_K`��!���7��Qi�I.�8��uw�M�Q҈�
���u!o/�枞a&~-㧜	�yG
M�=q
 [...]
�?l��-�i�����Jۻ��yS��rJ�G�MpI1��IL<ȳ񖉪	)�H[O?�&�o��(^f�S5�}o쮾}
���2���
�f�y�_�yU��0)����ͣ�8�����lmw�	}0%,;���w�����Y��OMb|��D=l{�~w��t �G)q�#���Ί�=Zw���{�}��a�ÝAB�����.���N��:�����
Q����˻\dT�A
2�0s�2!�!cWm
U�0NT�3MB�mt�]���O�zfeh���	Z��
+���k����'.�D�:���^x�F/�UB-ٟ��k^��
N�
+�j.�*�%Z�ё���_d�7�TF��|��;[�V~w���W���#�p�(��$#�Mc�O���_M����W=�����~�c��𧆎�s�����D��b&�Z{
��P
�
}��!v֏�W�w�
+!%�R�
�[A)�
A�
 �4)Yv֥͋>l�|s���Rl^��&�:D
���]��
�x�}�
n
��(��n˻`�?5���s���E!�hY��#[���w��1O�_��n�|���s*}
�h����mW¯�
!�SB��[؝�A�3��R�,}8KL�/p	�7_����h�P���Z�?�Hs�q)�ԩᡷ�pI

��d���U
}��Ł���������	z��{ă�Aح��^������
R�������ZcRj2��T�e���{��>�z�Y���l�KK-�.ѐN
�"�&�?�5�8d���
GGy����z�ϭ��CK�C�̶H�12|���b?��W��_�
#��;P��Ҭf��8%�@LN���O����*K�E��]p�O<
��
`'o
P6�+üS�g�c W���&mNW?�w�_^�|`�6�M�*�_3M��Dz��;�︤��.i���i�8�y�?���J9����'ff�[+��E9��Џ<��,�&�/2)�6���IE��Z�f.|�=�y�أd6�}�F�EJ�;������=Z�&�fo�\��˸j���[�n͋W}�CV�;��D�`�+
�u���;V}0EN�"Fm
�cls�R����L�S|*
�.!�[��H�{7^&]�NU��((Y>U#שjm
�|�j-��?D.rI(�'ZRyPC)ܔ��Uu�8�(s�3K
��;6��k�\������j���
�Fj���n
@�57{���2����l3���U>��N}�ǵ���a|����CΧAV��xX�6~�.�׹���-��gօ��J��?�k����]���a�������� �?�jU�����A\�r'<�5˄����|zΫ���`1)"ެ��v煰�1v攰44k.�D�@�϶@�U3�t䲠�P��Wz'�̧yך_���S��%��z&0
��nS��͆�~

�j�Wî��Q��PpЛ}�G+�%��䟷JiN%������U��
+D�u&�P��:�����q�ԡ�B�:��dKTgR���#��
�
��'���:��} ��Nh=� |Y�S�
+��<�[ɇ[$�B�+w�]�5u+�WeS�y}���������МtB�i��}0��Y|St~N�)��%�+{�ew �U
Έ`�1a�S��D=>)��-��s�НzJў��F�S���i���
�Ӓl^�}�qH)9���bc&�1��n}8Q�
\h:5
��In���UL�7�W���RW:3.�Z�v�b�
+
B�V}{�-&:����&#O

�_G�w(qI��r�.u��
��
\n�s(��	>�p��IP��>Y�a|ZܫbT�vUܖ��N�u�2��Qf�����l�<9ïfUyD���n�%&Y$����i
�do���\cֵ|䯮Yx�뵂��:>8��C�(�B at q*�8�&j�?��(���㌈�V10^[�� #Q�yM�u�P&@oV��wg�/��No�%�<63����,����ə����պ��-~
�W��e���3���H���о������3��w�[�ֹ�S����8�CYM�U����Q2�jNu�����հ`N%
斑��u���@‚�tA
g�
�7w�͒�V�a�]��7{!��Z$t�ؤa7'�y�C�b����=A-Wt�F.���/�+�i#�|
+\�_���n��FY
�$�W��Z�̩��Б��Gn-���fm�����z��y�8ͫ�������u�>��Q�h�~w�]c���Tʡ��A�(o)��iC������ϛ��/�t�O^�e�,|�7^|ó�c��oo���2�~�o|��~���Mn�[�N���qk�H�J����RV��(9as�����yXTd�ԣ\�z�]ū�
E?\�]�!�
�rKvG�	k]�'fpܽ*�h�O
Ud�e
'�9f�Ef1!v�QlS�w�rt�WZGn�{�Se
A��
�޵Nc��J^�V?�y��`z����2Z��Y�#|\�e����L�q�
�1Tys�U�i�6�5�O�iE'�Zb��s��鞥�}\2�Қg��'�x����T���Y�/�1�j�6υz��<
M

e-֯� L3�V)"�<��l�{����d�<��Q�y�
�1>�-��5O@xdD��
X at U��k�;6�q��)fq�K�Rv�K����z8
�=�y�1?��tDL�<%�b�KF/:�B��g���r���W��n��n�s� �YgHy
��%&����2��C���GC.:^kz�]ln
+,�q�
�
�L0��¾���=��R�69�#f;���m��K)D��2�tM�u�&ѯgUby5�2�,!ů=��P�Q�L�U��;�~[������ͯ�k"����_T� �)ED�A���7���CeQ��V���ՙ���G���i� �����N������WK)q�zU��dU�=�&>3NӲ�!�o`�
�	�Gk<�w����i��T�uMϝ�:�KE�p���:f��-:�x�w��աoi�sK��E�7uX��Gaa�!���΂�Ƒ¸?���=����-���y�#�d�O��S��7Z�Ku��
+�
S�C!D�$�r�z�5MRN�y^Xu(��q��h��`U���S���њG��wG�1�Iz��0/�1ۈ	.�3�
l
+J6��8�$%�"�[fe&13�,&'Z&Џ|zJ�KC+<����
�����e�����+��5j�de�jˣ�U�z�H�(?֒�s5�#���5a��$��5��1��#5�'e
���N	2q�?�er�*FE�H�<)�6KH��Y���2T��y���Ta��?Y+7����\nye�b�
�d�
+�\$�����|^c�=*r�U��>֓��

�
�=�h�
�A�A��Z�?�Z_u�\��rl*�@^��
!>�L 

W= }��?G):�6��j!
xe�e��~�T�u�����
l�\��/�3-�?���S�GoͰ���)>mKӑ��!�����䭡򻲖�3֙��GK��uu�!ɷ �X���[�c�&�%�$
�C�V?������v߂�m��BB׃?j�~%
ꕓs\2|�i
+�=\���e���d���r�MJ)����W=��¥���F%%Oߏ
ߙ�

MM�z��w��Xkh>���D��	v��=��L+"ҥky\mj�fY)�Ɖʸ�e��fm����i����5Pusgq�Y�nS�J�Z�[C)�+�>�''�k[�b�<i��'
X��<��:�y˷"d�yX�4��"�e���<G�׾�^r�qa��ٟw������D�C|y�R�Ǯ@�|Ke�}��,������gc��
+j>��K��u*E at o�P�&4À	,�X��Z�M��
��*��|聘��=BM5�)�s��aҳ���0�<2t.ϥ]*>�!T;
�����*�4t�կ㡬�\��6j����5����-�9���A�*�v.�ؾE!)4ԫ!�;�1@k��
����]
 �4��6�q(�i4��y<��S�Kv�1�
J^�}�U���vP��#�M�E7�R��,��}��
+)�-���Fw�ii��l��"M3���J$�1l�q
�r�h�Q�7�.ޚ�D
���"�
<���SaR��*��z� ~�i>Y=o����B���#���q�3�v�OMbZ�K."
�[�H)����
+&�)gA��g�[^�T
��Y24'�2+@ �N=��V��Z�m
������r�&*���I'k�M�>ի���T�J����Q���z��u�X�zO��;�0�����y����G^��S��R|։�Y�yYH�yx��Z�=��l`
�!�
gW`S
�
�њ���n��/��6�<.ǩcׄf)��L�S��ڙF<ޙFG�@N?Z�{n�
PW<�!�lӫ�zsǧ-ϯ������(Y�9|���i��C�
+rŭ�U��/l���֎@�[��MJN��-�&���A����M=�E6·����
�Z?�ǫ
ġ��7�K�)�5'���
-75 �8��C))ߣ�V���0�>N׃��i.��P1��
eU�[�K?ҳ��8�#-���?�?�66
":�ԭA���Ir�]&���MLO�bh��
�>��
��_q���v99�)��Xҿl������4pk<*f)��"���f�6�r�)�9�Hi.-�y�UB�8��V���
Z6Ԯ�#�����y!�PJ�>�����Lb|�CF���3
3�";e�L���IR��pM��@�m���}������1�Rj�i���PraN-���v�Ԍ�����S�i���ce�vWq�
rv�u��m�Q2�rZ��.�:O�
���6f�7�i��u�dw
�Э$e� O�̲
����n9�jwz�8	s���leqP��}е�u\
��L�ž�:�[�G|ޠ�>�Ӡ�Z��M.��FC�W��^�!<�I�ş7�_}X�����'�ɒ�)H��H�C�
:�x�W[��j��!�#�J.EM�M�����[l��y�=�MB�s*���Rv�ɷ}��{.�گ �z��/�<ȶ����a�S�"o���{k
}\�垬Ջ
|ʧU*���[�K�G
��hh�SPK$���*���K<�k���i��k���3;��
�r��ԛC�EM�
-�r���\�)��c4�,�͓�;@���+j�0��jZIh
�
+N�YƯ
+��������ű��EWO6�ܣ

9��[�����(3`w�2

���dI�5N�Ҝ*�����M
ϧgT�g	I�bR��<5ۿ���e�7���bY��-0:گ�&�������91i�P�ȈYf1>)tO�]�I6MA
���\���l��<�
:z�����Hŭ�ER��Ur��u�Ȁ/�c�K������x�*��V`����2n�}�]
+޿�D����'
+v�Vo�=�4:ɯgB}ګoi��:^��M��@�	�	f�� .r�u���޲k�yf!�%����Rn�B���x�~95�9O-�R- �X�
$��U{���l-|sL���@�Z�C��l��	qhjq����
�tk��8Kʹ�}�%ݧ����b�{*�2F!�Z�W#�Xf���c�{�Z�
1ŧa�gh��q�3��
jx(�
϶�_���wHᏽ��8����2|�$�$ 
-sj C%8�*�
����Uf��~��)_v�%�E.mw
��P���h�����Ɠ���9�T՚���y�%Л�n���1�{ &����fYe'@ǃ����>T�����43��v/,�M�jo�of1*6�� ��‡e.�˦��e[(:�1J���I��Ϗ�&1.�:߯�WyT,�� xX�{�����e����ǫ�/O�lDPC���Љ���p�
�,��Xw���n������j�V'x5�h�6=�Hȵ�!b�$�����5����ޠ��wHp��=Ea۽a��?��^��rw����u�|�|*��|������D
��<�M�-^�*���Yz�PB���)�εf_ٛ�N9Zf �X�R�Z�#�2b�z$c�w��{�A� ��ʏ
�r��j�(�n�G��t K��"��_Ǭ�+�	�٪����ꓥ�
xJ:X�t����b�CJ���Ʈ�kk�
��{�9�������3����TB�}��f�����l�u���� �
t�g�uA�
�k
��k
�W�F��;�
�M
ɪ��Y&����hES�9�Xi�{
�a�&e���}Y-bK\[i�^f��ů�V��
�?��t�j�s���9v�]�����]��ɣ����Qц7�쳔����|�^�7��ϱJ
��g��z��<���
(�8#̣�BAͱ=�1,f�G)"�%�|��^�ǧ
#���я�cا
9P���	R�f��� �W�K��n:�*�J0��
�&�G�\o�`7��/;��
��Yd��Z�R��y��Z�fiY���Z�b�K�R�+���g�Җ��]�+��kx$ˌ��w�8�ʳωj�s���[��$�wA���3�ƞ^}
�<���ͷ�98ݫa�Mc�h�,.ݣ!仴���^�V�s|K��&	5�4MH<������E>ݫ��}jR�GE+
,p1Ǜ/'O֛_^oh��&|Z0}*^M@�������ܝ!�-��9Z�3L����&˭�� ;���Z�R�T`��w�C�HE���e�������R� [...]
�
q���z��2��u(h`���~� �ʩ�B�&��t��W�s��.�4�H[�<Z �$���5�
MMB�	�����,�]�����*�H��	�+����*�
x���P��.uë�#y5�Gr����/�rls�V��A���Jk�o�śC|>>�\
������������;�z?i
+n���jx萿��;f��j�s�`� '��*٫i}nS��c�����
k��.�|�Pӊ�@
��P	 �Y~UPWK
h���)D����_V:�~�*i���ַG+�un
�T�>}�^Ƒ�Z�VG�4�"�A��O���6���s���1����
�KF�q̓�f at -S��Qz�k���$f�m_0M��0��

�����2��]�sF15u�=:ܫ�@M��a��	|�SI+
+,3�����
ޅ�!ȓ����{/&��R�M�K��D�����~}s���
��1>��t~�ϧ�� �,s�������TР'��M6��l�6�;�+"~`��?Y�P1 <ֽ��:��~t��:EL0Ob�g(�~
���F]���8Gt�y���9D����{�m]v
�Y�Kɨ���k�k��s�3J�S�g��F1"ܫ�W��G
:��3
+��
��ͳj������}:B�GCL�z��J
�˪�w��'�$�����{eWl�Տ�JL��5�˦H�eK$<^�`� �fa�n):�#����c=�
б+��s>��V�Ԁ�	q��).5�ܩa��&�}���U	PA=���R0�}fyP�A
�d�wCw���RN�ud��L�W��:��*�
��6͇
N�S���^4��j��F����'�\��X��>�{�����T�=v��2O���864��^v����վ«[��mX쉁Z	x�xk����^ X�ɭ�V/wAnnt�]9��>�(��Ze�B�m�c6N���(.��4�O�o�8;-H��&�$ȁoMƙ�&|0��A=�RP
+���?{��
�u
�����
�{����$�&p&�m@���E�	�j`���:
�!ʀ�AaUl9v
'�m)�e٢
+)��"J�$J�D��*�y7��/�[e�3���3�
�3�D
N�k����kO���}��k
ť�}-��>���Z{z���s �N���]��|������mj_�wƑ�
���>���ܡ��~s휿=���wa�R���e�]?8T:�}E�'�{�Om^�qb��œ[���p]�w��d�_��Ѵ?���i_^�}u�O]ܷ�t����?�c�����`��;�K����tj�P˅=kW]Fz>��S[��m��C��ڡ�Ov��ǯ/�������+�@�}�ҞUϞ�9�sr���w�
��k��ko�\�����A�4��3[��vx��
���N����#�7u͸z�����}��t/:�-?�ȋ
������~~x����t�:�9??�>|i�c'��k.�����m��ǀ�μ�b��O?�
���Th��=�.m��zyg���;z�]�ݓ�p]�ubK�̳;�
?}e�ă?���;|���Y�w�?tqgn�Ч��
��ؿfŵ�kW��V�{������
��[����~�_ [...]
,����?��o�����.�*��6�rr��9'�wN=�Zۤ�[Z���~��r��^�hc�ѓ[�������������I�~:S��q�?\�{�Ԗg�9��}��My�W��Ϗ<�ܙ�9<G��.�Kve��m7�ž�e���_��_���[:
>�~��񫋌c��sf��{�
\6�ƻ��?ݼ�9��bl���?�3�1se7�;�޼l������xwhŵ����=mn�
���
�{g�~u�Ľ�N�������<��
���vn��#��߿�ٙy������t�}+�_��=��F�A^Y�_�ѷ��U��{׮:�c��/d�=?_z׾�;��߿[��x���~��~agq��������=��L?��o���9����8�!?�–���{z\���~iw�彃�.��wvkǃ��X�݋;�_��=xr�e���m�~�
��_-i8������W��t9|�9v
d���_���c��4�z~|řG_�����c�����D�y;�/��vӚ��l]����^Z�~2���k�v��O
^Wz��7Js�n_Y� �	�#󎾼�_��p��%�^��̏��{��'����w
u
�0��W�O��u0{nK�c���H�t�R�䦶�K�{���>���o�M��Kー�k&�yNmX�

q썾G?~m`և��g��9q���k�S��Ҥ����Y߼�+?�ھ�Om^�������{���܃'6,������&c��0�
+�;w>��ɭC�����;��#�
ya�ċ;
���s�)�[>\�����m�[��o������o
�u�um��^��~`yǙ--����1�®ޅgw���y��������r�{/.5>~y�yaW~�շ
+٫

�w�,�d��,�.�_Q:�����u�ث-��7�͗�w-�������
z���b�G[:���#��S�������w����
�_�w��-`7m[9��K��v�l�
�������쎕�G^l�Α���y��9���K�����O/�,
yy�������(u_�Wl=��b�����۷?�����'2�^g�j�V��շ���b��wW_=P꼴�}��
����.�
�ӟ=�s��Ħ£������Ŭ	�~��?������?j{֠,>�\�ݛ�]�S;{�^��]C�w��=�Fǔ뻗g>kh��ݥ�W��-9������Um�nx�
�)��һ/�_t�Ճ
�o
,,��`��=O=}nc�s���/l*ν�q(sv��G��崿߾V���?y������W�䯿���K�����_>��'_���K��￾g��k���n+=~
+� ����ސq��4�Z�}�7t=xj��ٗ��.��\��k����_����_�=�vy���]�<�ov~?���90�ԫ��^]6�������W�9��\��x���
��\��Ԫ^Y>l��k���=P��v�e�S;�/~��K�����끹����W<����x��
���/���ʾ�Ώ_��srC�������
-�_��
}���Q&������V�}����ynp�{��u����Z'm���?���w|�n�~f[Ϝ�;�
|�nٔ��/�wa�`���-��"��?��ׯ��C�Z6����m�K���~߾~��6u<xeO��k
+�o��<��k�������8��V�žU�ZQ���wṭ�œ�}��6���sГW�>��7������x�7��w~ے�N�1����=_�h��Ԗ��No���Љ��ӏono:��{�ŝ��_:��.�S;�����K�J����<��5'6v>t��`���
,���c�[?�u瑟M�?����������ޚ���9�����W:�u|����/��]pbC�����r>~%{��-�3���z������y�{������1���b�ؤ�^[`\��9�¾R˹���
.Ú�ݱ|��-����V\u�P����
������]vω7�
?�s���;O�˕�C}'@��>?����SA�/�����_-4�o^>�
O��m
j�
�B�K;ښ.�j��G�>��
���o\>��
��On�n��P���|X���HO˕�]s��[b}�’Ƴzg�{sp���;:�F��?��7�WO�ڑ�Ϲ���?;���~�@����%g�.�suO�c����l���So.�N�Y�zf��c��_)��������Ԥ?~��&�|����,\5xma	��3�
XY��o���������߿���}��_��g^_�zf����l_�qu���i7�.�z�)�ڎ�[b
�}��7��~v��qh�?]::�g��K��/�����W���}������[����Z����¼kK
���k?��wΙM�yWv�_����~=�.nmk��kV^޾���KK����w'�c;�R��~[|���5
�R�z�7����;���??P��?��>;��s���7z��m^�we�+��U��i����������Wv=������u~��}�[�-��c�|��-6���o
���o
}y��W��}� n��we��Ʈ�Q�\�޷�̆ǵ�^|��󳦯�?t���/�
Z�z���� [...]
+-��~����S��Ō�~���~f����;���U��ƚ�}�7�֟
��Y�w����ʵ�h����bO�k:?{{�|��=����㉉qvC����
|vdŚ�[z�W���⾁�ώ�h��>�ܹ
�s���i��}��K�{���ٷ��=�ZaƵ��
+��S� w��]s��������[��������'_o���
�K���[x}Oq�՝�s��n����}���sioϜ#�k������:���5��Z���w��u�8�m���_g|��K�)�v�Y��
�{_]1�/.mC�R�vn}ߣ��??���O�o����t�]k.�]}~Kǔ�/4������'؏�����X������w?��o۽�9�?�3��{�ۯ�o���Ǿ������9��C+V^=0�s��)���^��o
�pqcaƍ��z��_�b��Yw�캶��?�v����Uj9�n�
G~�X�����^ٵ���;kxq�@��=����晫���g6�}��_>:a�Z�n���'���l�����?��k��Ã�����kV^_��Ξ���{��wE����h�����o��
+����8��>}-そ����kJ��_Y<�i�C����>�~e�вK�z������o
��ȋs&�8�1��������{����/n
Xte��]�S�m�����W
�8�j����7,�����%w��xk�����ٟ�tS��X�r����{
���{����G^���}������k��<y��P�̷n��Ԯ'�.~꟯
^��9��>ސ�����Žս��<�3�;
~)������~���E�v<���f��Oo]���� ���u��o��N��ן^q��_�
~�Ms��������_L�S�コwՊ�>��o����u���'�g������������9�v~��W2�y��V��_���
� �]����V���C��\�춖)�~��_m~��?=��s��G�z�ꡡ�CN��o���?��'�
,u^�]\����/2�>��0�:�E�~1��^����]?���G3[��#���7N>KG{ _�'E��>)"��I��O�H�}RDj�"Rk��Z�����'E��>)"��I��O�H�}RDj�"Rk��Z�����'E��>)"��I��O�H�}RDj�"Rk��Z�����'E��>)"��I��O�H�}RDj�"Rk��Z��� [...]
a�+��wu�n�,Ͱ
�҄Qߍ�n��
+[����v��.�H׍F��<�uL�6�"Cǻ<Ow<x
]]��b�먛[�S�h�Wǝ�����|�ysq�&��:fdJ0%=�d.�V�Q����=�


����
+��nZ/�E��O3�<�|��]�W����Mm�Vh���Т|�&��1���j�a�-��\�
�k1�"ۑ�j-�z�����zJ��?����w�6����f�� �	��i_:����k󭥎�_ܓ�ka(��o�2F
�|{G)1J��ǩв,�-M.�����&��"�F����c�g�Q��ВI]�
�%zR
�p�08�5#�Jr:\�xqV�4
��e �!���í1Y�/��w�z���S��&�
���^�F�J�OK�/��bny?LBrr��5��f���0Z��e]=+ߕK./C��8�")j=��ӳ��@�oqĐ��V���w%����$�
���d蕵Q@)�f%'�1�d�kx]�=ÐgPE�#Ne3
��l�b��#�M�VX�RÍ��I�7W̔
+����o5�i*t���*x�v����C�kJ��~b��
F�
X�q����H����l+f��V���3'0q�%�k�L,'S0�S0�
����Aj��q�V��X��1���u��ȴ�A��A��Lƭ�Ċ�|��F[����_�Z��B_�uJn ��U�
+o5
�L__>�3y��E;��&���!��Z�����\ix���5��jM��n
�O��{|�k�eso.�ߕ)�?�[���$'���#o�W�dS�����$�7�8��+k���m�lN��&E0tS*�� \�V��C[cO�w������BW�x�`ǰђ�ᷢZ�ǒ��|�N���S�r4\O�\j܍��@�K��o�)2���)5W`�=���L���`{��-�j=�P��I��h�4�R�2�j��uy��9�L�I�h �X�w~"b�"�2?�|u�!������fd���ƞ�I.��
d�"�b��ѝ+%睯�
+
;~t�!���(���\�=�39�L�j%�8^��7������rzZxT��G_��'M�B��b.�2q��v
�� �Z�
'Fd��W鍉w{3����<�.%�z\��%Fd�x����L������R��OHs��i"��
��B{ba^;n�8�n�F���]X�L�Je�H��㦐w܈�ā��"˒c4VX~����
�M���#�
+�q�6��
$.�
k�Z��?cE3%�h�h��ܵa�:��L�n+�h�AHN\5_�5~�OKb*3B,1FU
���m%N5udzzr]3s]�l5q���#��c��D��d��QSGS�}�]�l�;�S���
{:�;�J�N

�R��Ey���X�Z���>�U}M�9}K�_��kx-NJ%ބ��&�(��X�Z���"$�cT��^�}�#��V����⮶|WW5�k]���m�Bwrd���
�OI��}��Q؝ғ�$.��f��S
�
�7�|mC�`fE�i^����|��ۈ�qj��ݒ�8���'�l/c�~�?!���F!�ѓX�g������k@��n�ݤG���A.�"�
,�Skk���b��F�3��仫 �۴Gel��kpӲ����l&9Fc%$���|������~�b<T��m���$�-9�
+g��p&9FcE7��™����(����j�pf�(��+�I�Q�'R�™�p��t��+��B\Ժ(��3�W�p&�Z�K|L�T�
�.$�]�Lr�j�ޫ�™��";�?U�i�2d��r
7+���.]��ۯd�����aܴ���В)ԽeIu�/�&��iH
.
#͒�e���34Z"����-�|����-1�|K�[*�Ɣ|����|K�[���
j*�R�V�tK��T���-�n�M��FK�K��3!���^�0e�*���*3Qb�S&J�(�!Z���1ڏUQo�c�Ͳ��i[3�C��]�K�ۏ9��`1�]n���I���F��q���N.I�I���{�����$�L��M\n��h6q������=�

d��\�4�
+��c�%~�>Qh���j���D�?'����ƀ��Mx��S�8ϔl�����]��j}�@�#R��
N�o����j\�e
ݽ�>0���#�ƞ�n��v��I��X�
UZ
�.��:�c�9�$�v��
"b��V��:��
C����Gyq�]���`����*��H��/ut�J�ͷ��*
;�[��t�-�#�?���4�\)�\]��4���G��
�4�\����s�
�&�
��&Ve��9��4��o=�4Vbai�9�9��BJ�D��6�3����v�ʭ�����\S�l��R"v_�����
�Sے��5Պ\WWa0)6]�����!��pc�mı��0�Tr�h݆.˵�-�a.=�7
��!�/��k�4���F+�����b.�3
��D�8�^�8�/t�J��։�b�g�dt�Kt_�)�&�gV��KÜ\u������\�RU (pǨE����oF�7ʵ3S�Mi�*x
2@�`To.
��x�P/(�*6�G!�_-�U���7��_5���)4��x�K)~�M;i0'
���4��s�`N�)�0t��
١�N̉n�I�9c!�3�nӻ�=25S�_c745.��߂[\��������
5����˃j^.$o������P�-��w}���
]�ҌL~�����8��'mˑ���Dk]��
�jM�V+�k]����Vja��V�
+
/*t�T�}iW�[��a�t��j�~�ّi-
~��
J�	S'qo�t��hqR��@[�FK��4�Ժ,(����JHP�\kURn�H��d7�2���(J��d_)�֩t
;
��8#�
;�:q5���6!)��[�(��W�|��H�QG���,��L����mh�<¸4�VbRLn珆�_
&�MDŽ�c���4�1&�
;
Ժ���ړ�?������G�*�4�Q�r=
��1���9֥LeC�1��V�dK��i�|�m"|s�5Vo�����]~Z2}��s��s=���u�G0{�J�F����R��
&��R��Y��*�����l�j؞�����U��e�0qLr��D�1J�i���KU胶b�;9:t񈣓v�J�T�M���%����K7G/m�t;e~�S�J��MaPI�)�|�"I���-�] ��l�q������q/7�2
<n°�6�Ъ�(�B������q�0;��@%Zrb��:��x��*�RB�m�%0�q���q���5c-�,w���dʦ>`����[��^`�O,��z����>M����c�z�㷐-q���
�M70��n`��n`��n`��&kܹ�U`����
u7pn���^�$d5�6���
��q����H�cW��:T�բV=���F�`t$�������q����R��޸�"Ӿ�~!#]]ͱ�c�W�B��M��.��x��[�2�Ή�
*�f��Ҋ�����Vt%OTȫG����h�=��C���z�:�J��Q�#

a����i�m�c'�]+b/qG_�-����f��E��F>Μ��惒�
+=t2}rS<z_��Ҭ��
ݓz� .�
Ul�����!�� �mđ��񱢎�=E}���э��"�2��_E*ҿ~ė�Nܝ)��T�
�1�x�8�nF��Ԛ�'M�\MR�6u
��r�Y�ݱg�%�K�N����Г��@��X��k�V`��Gr\��!8�
A���g
nc}h͈��zc�Sj<�6�i�c�z�Uַ �k]㎤2���4�~�CF5/k���t�6"ä烈���ȸ,tM�wsepu�Q1K32��bcO�$g�az��D2�|��;W���
+�u����hr�����Ե�A�/L�AGE�&�
gt섪�C%k�2��*k�,����#���i�7½�DBm[�㿩��=�/i磴��hH��
<*qo�� ߫��Z�~��}�X�Aߵ^��U��C��MߒKEu�(��]���
X��c
Z�y`�R��9�!�_R�=EF$�3�8M�ۄn_s�Q�c�
ǭ�Z�,�6fk]0`D�j�Ht/N
k43�n,1R�}�c�����[�R
|��j\�ym�����Z����:�2-��x,�<E}���>��HY��k�ߓ}l�	�qGl�N�V�� �Rr}rӿ*�m�(��?�]f3=}m�O��
��],�
4�;n,ئ�\#b����4r���j�I]]�;�rbZz
��1��V&=�kK��i���B���%�
+=3������s�������3L����-���;
�[@��Y��O���
�\]]�d�
+��a��
@��f������V����!=W7�Ѩy�[�]��\��!�>���kȿ��|gOy<��FM��z��q�[���kЭFG7��v��y�chZ������_��(LM�U�g�ϧ�l�v��F�s4��{�������\M��hY���u\��	�h7�ªo0=�rᙺ�hh���p�9z�i��gX���6>�0

�n6��_�:F}
������鍺c;6N��h�8y:��p�z�it,���,�~N

�!�5�Qz��Oa����Q�MXf���,^#�%��� �^�s����o�	��|5
�.�F!Lߣٖi�dž�8�R�����:L,.�Ө�:��p�u@@�	���4x �.�x�gZp
a��
���
! � � 1i�p��8>��\
k	ˀ7����	��(?�%�a�
ׄ�p-�4q�c[6>��
��4
�G�Y"\�vq���PG
�
���Hd�|8qHS@>0
+X8��1�y����zۚf%�.���&4"-a	�@�<)t��`Z��s�M f��Z��� ٘B���7y\
 ���qq�F
+L5P��9 5�� �=�a����
�̡�
+Кf  ��4<\���q�L�
�
�\� ��q-f at a���=iM ��p��A�
\�����2�A$aY-:L���h@��"��ZU����R ��#H��
� ��(k`D��! ���aeL��cښg� 9!Ɓ���D��F��� �W3x�e{�,@�5��TG��MC��[0˸v@�� �aJ����Mdo��u���R_��_L�@k�1L�F�{&��,z1̄nkD�p3��
d˒U�k����L�%18��@�
�d4�=B<OCl��5Jr�+����д˓dK��?�:C�
~]d�7Yqx�G4�pLD�&��Ȳ��F~�Um�#�(�$�{���H at xH�(
�sP/�:D)d�X�)4$�:��V�O7lW0j��

�
h�:O�pq
b�g�*�O|#3
�a���H+�� ���@�FԇRX�
�2rN���α�ɛ	D�Os�M b�@d�oF��.�t����`� 
Un��dԌ�V�p:/
����I�E��	��h�H�h �(ju���
�I��i�2<�p�#prЈ��;
�8"Z(x <�%	��꺅#�5I ��ԧ�a��&�
+ou
B�E2�N=>
+`.�
+&�d��s����:�Y��,ZU�
I�r\W�p��p���G��Fg��/+4��
P� ��XK1�*ftE-�,
�
�r�F$`N
�o�UE}����9 FI˴��h)ta�\��
����1
�J="Cۆ���X���+$B
8!`� 	 �4
���4���ṭ�	�NV
,A,4���Њ��&�H��
�LF�+<|��Ѽ�$1����Yq�*�hl�#+��i(.o�Ⱦhh�xt�Nd7�a�͊N�'���$�:��
+�+(�FX!���j���hIL�� �P�\s�	�%�g@�[�`A�Iv��B��YA��x�+���`�Kuh�{< 
{6[!D�
�#�|��A�@�m� ��B؀8x*0L�-.
+#�m牔;"8��AS����D���^�6:Rڤo `��7��ن�1�
B�jش��Ij��D
+=�Rd �Fp at J�y9u2�M] J�TDق�
H�^Gz3l97D���� �� C��NO�m�$��UL�AGq푾�*��M�
L
�/��`ź�3
40�(�D�h֠7f�Yjn�H��� �$�,E�A�g��Gv�A�f�X���o�P�����3��iW'�Oxl:X�F�<����T�v�a�w#��+]�D�d�ۮ��<J����љ�����@�q%�ä�����xDp5��z��F�#�k����:t�,�5j�z��6$�&
+ Bo҉��{�7
+��u,�8`�@B��X3l2�,�J�9�����[M4�
K
+� B̨N�#cᙺ)=��f�i
�W� �2���p
��	� ��
V�B�� [���@�
+�%{�$�m��b���2�4҈�
���2�mJ�߳0��n�:it6o����@,��^b�X#:*�R$��M�
�.��!��1V�]6�K
f��"�IR��	&���
�
(vQ����L�"�
~�`�rK#�
~�@Rs�$
i�#'bxc<S�tp�P0�� ��њR�a�x��&Ă����a�d/��$�#X~���	�N-�?�)tvktt
0B����у�
�L>���+���O
E*
A�
��{�[43`A"�3�	�V
9΄��;A�jG'l�fHwM
y�U0�Sk�vɩ��q��
9]�0
�uc(��e�E	pv�5$�C�BIǠ��%
+��&�A���k{��G��08��P��<������`a�%�
�ʲ<3t���`�5
i����5r�t
	�.�	��ʿ�Ê1;T����h$Y�^O
�s5��W��$�A��q�q�K��y�
���QF�&����p8�c�IBsMv�E����р�9GVEyK!<�ڄ`
j�T�;H�	�Gԗ��Z&�arl. 
���Pc1�x
֓��8�ĭC�P��”WV����w�2M
+й�#c|ȅ _o~
�e�C  �
r�m�
k�ق�0�F��%Qh��@Yh�L�A��@�tF�1�
�"!�B���k
�l]l>b3��l]�x<L

+�g���#K2I���s��ע�&B��2�CCQҁ�H5e�Gb��M�;����7�=h}�{���FUA� #>.,!�)ƟP!��! G(�
+dα
�����,21 G!�Դp
H��+F=Mu1k�L�!
����X�:զb_H�@�$H.���杊e�%쒇�
�!z��5�F��рu,�MRM�Â
t���Q5��A4ckuS�+�+��B��+�l�͕�ձ�vs��w88>�JYΕA�2Rb���{u�t����h 
+p]4u��{�0�؏V79�n$ӌFǿM�� ��]��V�M��,n.ϊ�d�]�3@ˣ��OaN5�3J��Л��!�=*
��"��B[l.��	�JIX�փI�qĄ(�a%H��|�B�0"ϊ&��M�%�?�����[P암�F��C\�|6	��	��F5H��� R�(�A
A�'s	-6�F�.�.!��JR�@�͵8�'Ȋ�{

+�������� �9�A��l9ryԋPHQ
��!���
kQ����d��|�=&�@�t
.
��oFk��{t
���Xv�$����h�i��
+��|3)��\J4M�R
+Y�ژ�
��8P�]� �$Br�d�h�%� c�T�F!+�T"5p���(�5W���t
�UʑE�h2R��V���@
y��X ��4�n�e@)
åy�)d�'�&����ݴY
E�Uu�Z��W$ɔ�u���8��
T�V�tO���ht�e��~�
��i�

+{"�j�M��
�c%��io�K��)a!S�������xr,��i���	��0����J�*�3'2��� r���,�BH�8h� h,�2ހ�
+
��98nA�yx��"͔� ^�2(���,Z�
T8Tт OC"���Z��"��W-���YT�0a�d�`
�k�E`�=���@q%=��1�
�D%kLYG���(��ˣ�˙���"�ҹHE�0}
gJFg&>{�9��J�#ڰ� �)r����:xL��,
Ŕ#�t��H�������	��W�
��������q:�8�R�$�*7�ő-����j@�,�
W�aS�����w>eO-��ܰ���5���de!��v
��8m	�@	g4s���ɒ�F4M�B�+��)�!ڔb5�<[Wa~�s��,%;L!��
�F1[,%�,��<A,.?@��f�V^�hRv��B�6�ލ%I��\e�H��
+
+hzRl=o���e@�Q�ql��FZ��\	-�) 
��Q[Tœ��(�+�	�nV𕩡���*L{M4�5	[�j����VB��v�n�X����ٺ
+I�X�;�
+�RZDΊ�v���!oŲ8��&��0��D�#rCq�I`Ɗ��*T��j�)�l]<o
OmWH�����h"Hq
+�=([W!�^!'��7U��G3�u��do4#̳IF�֕�ڮ4 &\L�D�H�5���@f,�KO�n���R��L��)�Q �OW:���%�C�s��?��
+�x����(�'ȃ�%5�
f��b `0�pZ�,M�L�R��A#�\O�H���I����j��!���X��L��x�?�t۳_8��鑅��UlE�u��%��:+�H�=���$�Y@`.�
�A̖h�{ƗPJg6 ��6�P!b�
���ўC��i�/n�,�02I�h��8�^�_�QC�|[�|r:�ަ�s�(L/Ö��y�IX�儧G^�
{^��hq�
�8.��_
5���t�
�1i�S� ��3gP�@&�c��vQ��I�;T�����X盈@

��8
KT�MN�A�	*�ą^��Ƥ�T���QފtVd^Y���>�8�� 
�
�
��� �]&1�P���F�`su
+�M�����`�.ψ�oDj<x�*�`��C�Q�A�(��R]phU=�,H�*LL�>�HTy��
X:296
Uӌ��e�j���0
�֍���9�8��L��„�T�8#X����Ŗ�A��S}���#,�%���H���HiF�x#R��K�'e��H��Y5G�9\&B�M�,i4Xv�R�G`�
s���簵�Q��
�\��3����
!CN���c
�81����P�¢(i���Tm�ÈTJ
�Ek)b��*r
�줺 �M��# ��mI6.k5�V��
�
�Y)p�1�Ф܍�"I�ux�vli��r3 0%���8Ǧ4i*x�NzҦ,3�"���B�gY��jF֛ɕ���H
+�L{�H��DJ}b�@�%��� 3��
+���T�K��S��]��a.�P�4��u�-Tt1�,��\i�I�k�[�ъ�6���X]L�t�癹��]BH�$���'Q㕠�.�M&G��T}��
t]ЦF��x�dhc�DC8S�4Dz32 (
����b�q
]��� �d�X�A�@tMH�Rbb Kc
���I�"�q�|1�
Lˍ���.��p���1�U�f
+�i�B�B4��2�LQ̐{�A�X0�NѭXME;#e?� ��CRH(�#D��rt��� �b�
S��@
+�؇�3$2�]�]S��$�d.��ƺe
+�#�(���W�MW��(Vf+D�+e�AY�[�Ӝ�������C�	k�iۡ,��܋�3.�h�š����W �����\�T��J�`
-�@*��J\.Kc�
�tƄ��� �Ǒ

��c!6�l]�QG�
+���'�	���ɔ� ,��

1nG�h���ȕ
+��A���q
���Be`_PAUQ
Nj�<��h���d>�����rr�g��7���TSu�%m4��m�LL�~ـ)�	 i)Fd��
+O�T*�T�E�΢eiY�B�)rh�.�H�񥻱B�l]�R�h�X���)Vn�ˁ�Q0��ir8����]-�"G�l�!Zi��
]��Ja�
+����R�2��X��ڴl]�z-Z�.~�b	�K��P)!�h��7
ޚ�Z��P�4)mB�z`�X-դ��բ�l�z7ZG�\)��pğH#��&
�W���B���(�<-Y�x�I4e��)�p_��%Z-�K�b��
�6L�c�
+� �QTي)�!Mu��klR\
':<���>�Y�,� ���L�jG��,�\��tlV*(�����g������"�rM�I�I�#�:%8-��uc��3� �ip.�h0J�
+�
+�r�X�C�&"
�&+ft���-U. at Abݠ�<N	c�:E8-�����H�y�< Z?P��@p���
+��3կax��ı�"
�{ֿ�_��O�S�)|��få8�nq�zU�����*�l]��B�^�&
��m�*�b�_Y,?�8�!�[�
F#@��D�q�X�N��'RdC�
�B�X�N��py�#����=69�T��V
 �
$_��S�pK�ĥR
L�j�xEM�V"[W��"^u�̠�j� �	��s�d>����k�yj6[��,�v"ӟRL�YR��D��$u,���@���
��uM&�ؓ��7�x4�(�$�8�I�UJŅ���ƒ	S�Ą���ܡ�B�nG�
F�I�ƣ�2k����lC,%KZ���2�g!�N4F�mS�(��[��h�8
T�{ ���t�r�
�
,����A+DJ�!3���%
�;��ZҼ�F��H�)��DQ��#��
+��ph��ˣ��#w�PX ��C��V�'�C!�9�XG\o���w����Ķ�d뢎oW]E�8�@Ǽl���'�P*��] �!ѹ
��Q74⊡؎�v��	�>����Q�y�:h��]��g1`�d�"��cիb;S&[�fi�.n�F
۰UGBh+Et�E������
��
T�L�� �S�%
�k�������훳U �~R/|���C[l|�-�Q�� �2�R�c��G�vH
�ʠ1 HIA�2KXO<b���E�
��p'�*��̦�96tQ�̬`O�EA��E~��!����K8G\-"�f*�j�tK�6H@�(*
��6S��J�* �c"Uۼ�A at t.�c�\�Dxs�_�e��'�e�iH'�@���X�g0�&�QM%_E�L#Js��P��X$l��j�����b�/F�8���x�l�Q�������6�5V(pܓ����<�x��싫�S��!��������%�3��\C�i}�pQ<"�p��&�&ܖ�Y0NG&)��s��Fʑ&W�6
�WɝKQBEWl6�
+�Z���;7W���
ʨ
�ZƀmJ
 J��p�H�8}�@
���d�-iK�)O���
�c�_�Eר�� �
�m
A�aP�����8.���H��� 5`��F�����R7t��ZC����П 0�p�n觙*k��,��ao
�\gy�!yJ=��'@Ap3���)
��
�B-��Aj���"8e١�
������F�=�$�_Ȇn._��j�`�yR��X
��_�?���;��
��a�D�A@�%�b�f��դ�\��S�!�TS��5�_.}�4�"��S���n�
�=A���$��e�#�(,4�y
 ��
�����7��сӹޞRޞ�-"��C��W�J����-�]�?��I�o._翥��iLB��X�nV,b���0��h\�Q#ޓ��-U oU��74Wxk3W9[��t��s���bA����eB�Ie؂x-W��B����W4��*�b��X!Ѡ�p�3Vi�������T�&U�A�!�3p��J�g)�F9
n�b
T�a�謊2���t^YaZC�LiԆn����o�a`n�㉼����
a��"��W�T�P�h3cD��}�"����
i:�N��P('��蓊T5��R.)Ѿ�i��hd���e���w��VUddr�*�(jB���:��5��C_ȕ,��}!��}�߫.�_�\��Ԏ�#��AL�)#�Y�ٿ	��CځAG��w�k
������
n8�j��2J�a��
<��˄�����B�}-�,%�ԍ�U��+���$O�G��&,�kR�j�;a�D�߿��6��Vh��PWWw�'Sʵ�O/fz�s���]��_�
U���Q1���KԐ��M�``*��%���8�1X�_����\HHC�ֆ��@������'���<L�˩%(��J����q��
lU�Z�^̴�s=�zS�I��
遳�����Đ���� ���� �K:����!��ׂ9dc�,F�FB`�C����u����C�1���Cބ��_�����薇p�'g/�ll�`a>ͳ���(���� Z�
+!#>�6pD��6
�rС�i�(��oð"U�X�� �m��n�E6���`1٘ߎ���Y-��ŗyTA��3\-��'O�
+r���\y��R�m�#a���_��!A��
z��y�Q%C2�`$Tw����Lg�Rp>_iԯ
�̞
I��A1hCµ�2Xh&T\xW+��qhCd��[y��!z`TL�
p#<*�*��L`��$е��0��Eh��Y`p»�[{��=:��z-�=��
V�P�
ԴgU�\,�\��#,�

}�RBn@����C���w���޵I�q����H�_G6AT��R!h|�_������T���]C��%���`qN�
�9�Z��4��ri
?��T��qz�
ѻ*��!6���X�4�}O���2��..�*H���i�
�A��:��V�5Յī/f�7WzCl
1��)�V3gz(�h�5/�����%͠]c�ʖ��Pk��G��!�3��:��JL�r@��6aI%����Q���֐���E’[��	KzP�N���w�8:�N��n�ȔJ�b��C��bi�<�e����ɅBW��
<���|+��S}�aF������?�˖2=�]_
e�2P[`l�����%�?q5n.���fs{\**	 ���[Rr	� ���lzjC��uF���Y>�� T�!!�X�*?6��(�I�w�zb���,��1D��
ݢd^��
+�$m�c��b
RӢRy�&�*<saPOt��h"�e�򨁉|R���l�vIb��f�E�0���w��b`�i�h���
�]ո�&o��=�N��/�hȂz�a-�	X�%F�~K/3,��L��Q
+���<ʖb��$����0�e6��m0������i��� ����ޔ��o���W��M��zx������ѿ�w���n`ʢ�ȗ3��sj�H �ȄP�)&�A�Mu�;�UY|�a��qO��=�aU<Wcw�ZR��
����h���U5-"$���t�n�<�����l�IΆ���ɽ�1V�(4b
_�{�a��4�ESD��&�����p

�
.����	��a��C�

�˪�=&Up3�n��J�$]T��,��(�_��
J��p��A���g8E�a at C���h�� �2%��wr�R���
+BG���u�!�L Hp@
+@��S�U�Iit�+���4ɸ�U�����iT}@cV�k�������0���A��Q�4k@���)�n����U
�ʰ�JF��
���uǪI���|KK�g8W�1��#��~�T��U\e�x�Xg��T�ԷA�
�+ȹu�
+���n4i#ƍ
�w�Q`E`��q����\
{M�;�����IF.��
��1d/T,AB�i�2�x�u�Z�
�q1���]��qHPS?�y���`��}D����Z�8w����-E��(=��	*�c4xw�fa��j^h;w��YsM�-�r��TX7�]�iS-�,葩A��-!Զ
+O�1�K&e
W��*�2�M�|��l�i��_nk��\
,��rP��zH��ꆧs-��ke�	��-j\0�������1h"��
�ez
�Q/�f�I��,�n$���b��TN�w���c�
�#��1B}���~wL��|(�̎LonrW�����)�Xw<򅗔y�I��/��)e;f&��
+Eu-���0y�l����B)��
���hx�����T�Mg�tp�KG h�Mj����c�U��������I؆�6��i�r�0�|B�܎�$��������
endstream
endobj
311 0 obj
<</Length 65536>>stream
+�)@`TP�
�\<' 랩�.��q���� 
l��{�%a���|:�����1��2�@�L{�u�z�ZN܊������I�Ű�'N
+�ҧ�����
�v�P�%�^C u�=\0tA���D�
���x�
6t��~ܗ�'*1#َK=^X]ᬑ
��|B)5W�

K�\���{�Yq�n|,5ڟEM������"���%��'{�f��x߅-y��
wrQ�6J&E�V��܎�O'��C���ڴH.r,�s��@.vM�}�
�I'7SE}�𐉰�A��w5�X*�9>d{��V<.��m L>��4�����f��s�vN#Q��WP(n���e��"#H#��qo��S�e��N��`	+7��3@H�k�E4���,��M<��ATL�t܊i�iO�E֑n	:/���%�\��u����
�M�������i�8�����3j��
X��M�j���yUp��I��@O������h(Q��J�z'�L� �)�q�K�&Ń��ܫ����7ؓ�8�'�&����R;Zj4�bwp�tK'6��xxx"�XD�:=���q7e��\I���
+��7�괈�LWV��,��v<�dL�:c���iO���p�'ֽ��&�9M��%�<fQWM�t>PM�ۍi�La�����C�Hȉ�e��ZĞp����@,�)��`
I5�>DžBYl�Vw���<>�
�h	��
O��'y���j
O�ĺ�%k��0��m�|5
!�
ͤM
�q�,
'�7r\����Y��]��<D�ֹ뀆U�(���'�l����l�����Ҝ�'d���I�O�
�u�B�ݻ����X����"V�mn+���,8m�)��{�(�/��1�B�1<�G����p+pt%q[
+�%l!�np�o�`T
Gh��.�.�5���n��K���!1�Kt����y�C�C����� ��<�m�ڎq� �t>b���1%�a9���H�[tF���0��I��i��=�
�a��A�#�Mc��Q��F:t��6��{q��GF�R�Ig�Q�[�D"�5�c�KF�iѦJ
��:�8��
+n(���G��&K�'
��4�#���db#<���([
+�E
+�zԮF
�{���V�.
۰�
 ��:B��1ꤑx{ ��wy˙�;
$)��;��rL�,��S	�d�X��Sa�R�[(
�
'3
+c��K�Nq�L�/�8��#�{"h�O
�'��C�\1�CR��?�u��aR)�͑�0��W��
QJT*.O���Χ��"�#���V�X�D�o�\à-������r���nSDL�i3܊���:�J:�A�B�z
+]E�P�@�բ;
���N�mAT
TÛ�m��0ٲk�'-q�L�À��P��^K��-H����A�rx���:�r�8���֩6Х,>���!�
�M�Ŧ���u�ᨽ� 5�S��M5s�-�恤��=m�涌����O��=Ǖf���Hc5Ӣ�
��<UR�(�+��)��vgn��W���~���^�x��i��S(�K�
I->��LO��S���:l��Tӓ�� �;�OCpt6�,�BΎ uJǗ8�
I��chҭ��QH���@��%�4�
�g�]������
��JG�ד[r�KAPP�0�6�(�I�؂ǥ��8��pQ%xt���N���T���थ`��*\M�6����w,���)}N��Ԍ��}$4`=&Gj����<I�v�lD��U<��<O
�I�Sbl8#i��	�9�}
�
gl@��R ��1�X�|w��x;)	8ݓ
�Q��J�֬����_,KV����+����6۬G
��,�
+�gs��'�fE��6LvD��;��1E���$HՕ�$RP͘�
� 2���k�0�*�{��ؗ��w�����l�MSg�P���� �
<y�˥-��]�~�o�Z2a9��S�]�8
{�	��M�
Ċ�jؖ�+���w��s�B�D2�q (�	L���w��ʽ�M�
�r�B�[�G�fNڄ��:앺ض @��P�ɦ��J�8�V>Q���r�yd�{���2-��L��H�H��]��}]��
��a+N��dL"8�uY��e��^O2S��
���<��-��A�ѩm�E;�5���ѩC�%�[��OX~:�Ԡj3�E���tGĈ��b���n1zl�Б�Թ�P����8"#5�dj�~=�
b�ڠ��
+�jX-i����L���o�����D�;��Bԥ�OMb��p�=�=�*�<7 �����#z #�C�
m����NY��r�
�]-�
�7J�Bjy��äP at Q�G����
Ƕ(p�,�
+i<���l�o� �GM���v[Y�3��W-:sV�b�!\�B�aĄ����GHgב�
t�y�b�|���(c�ھ��`��R��Sty,;nk`��	��:��L�<�d�.��ʃ�(`a�LJ�/Vϸy	�9»���[aM"9�C�e1������]*
��1��]�d+ �sD���3Ƙ�S�I��=;3/S����j���yԷ���*��})��s\�z���� �\
j4EzF�����1nj]M�4���cv)D��Y��A1z���]��A7���4A�w��1W�)�*���5�͉E|D������ly~�$��.Y������9�a�`#���ͫ�
��lS�
��h,qh� pp���R��,�@��I9X/���iZ�<U�{�Ӌ
�A[X�́z��X�	�T9*��fn���	v6b�mRdL
�~ylO��88?LP}R[)WT��/)��n*8�n�ؼJ8�rsP�`<%����U�w�O�;���1�/u�{
3�����;�<Y��t���{�L���~m�_�����E=T���w,x
F�W*�d-�2�y o�d�>(
|&��=�8۠�Wv��_�SQ�M
ۨӃ��%z��/�4� �u�
z0յ��}�����?ؠ�1�V���F��`�
l����}�z������zy�����{��?�f�🫗�.�0'�m��:��򺕗���2�]|���_.�1��6�=|��'T��X~��B��3)#��O�0����P�����W��.yA�'�G�?vSf�Y��>x�/�
�N*��t
��L��W�
�!O�@ ���H��Qن��۵2��~�՝B��=B(���5S
_��z~�-!dީQ�;�1��
+�N���\;�)��!�%o0Ѵs�FC!Gj�ň����)E���d3Hw�w*�W��2�C�4l�����P'R"D�vM��I ���r�:n��SJ��H�Z
���%������%e�tӿաD(M27DV(�l�Q ��Q�cshZ�*��|+y��
�r-IO�����
�%�4QSN���u�2�n�>vV�2ZIz>��xȗ�3Nd
�;-l��3ٙ2��f�.�2���Ny��-�
+>��5eU�I
�"+Q���)l!���n�]PT���[����uسP�+
+tV'C��%�8
��@�|K �_h
�ZR���lT�����	Mq"7yE�
���)��@�S��j��U%�>ȧ|SD��ӧ�i|�2q��8Cm�3�J���A�,C��h�?I>P
�ES�k	O�Ӕ+#ܲ�m9�$R�QM�U�e��u���'ɓ�Km�x�m�4� �jQD���4� P�~��K[�%]R��)*ԉ���Yre�=:9�n���xI$|l�Nޝ�� �&AŒ�hQ�M>�`9��~���b^�.��b�SB�
�<�
K�3�2�f�2lA/���/�)G�
+H�)��:�Qr�QO��cJ�oQ��
:� ���%�W�UC�/�������twp�
�x��.	�:(��ڗ!�ـujF	�,pH
9�: �dx��j�I� ��`�+�PL
+z�n�&����
�����U吕D��>��x����ć	����ZiR@`�+��!
+
��Q��)�"$��v �D�1P@�;	HX0J�(�
Qi���8���
%��"�WJ
�@�
e�)�Q��j
�EuhG��֊d6B,×�
1F���j�h'�(�qye�"U�Z�nuQ_��O�<�-�,�lK���&�
7
+�^ږR�r�(fɯr�4�O7'lB�"y-�xTr��|�px�Y�;gԺ�Д� i�`���OcG%N��Be
+x2�tU2��|`7J>�A��"|���[����uB�<K0
+�p�M�E�F� F��W�.!��BKʟ����3�qc at J�V
ےkf��d.-��-�X/�e�����H�JTd�O��q�Ku=B�J�hݔ��8�䊛03�
,��Y����>��o�&C\m�jlb~e�P!%���q	b��l9�\�
�I�HƎ�.��t�̤l���I�d&�
��=
"��x|��Ā|�y@�cɡ�D�
��U ����I�)/�� ��JA�T^�0����×zJ)L7<*�1M���U�(�AY'����&�ڄof�8���h�<01W�"L�"���I
=c臭�fe����,5��
)i2Q���[O���s
�Z�/�����`c%�p��Ɔ�2�� 4_2��

+h
���ֲv���	d� �j��� �0J��_J
�����?�C�%H�JWSw
RDb�SD'�W2�ʃ���#1�,���M��
+�� 㔁��S=LͥI����ܔ5���1�(7��&���O���0�1˒�
����|�@bvdf'�AJ
�B�c�EY��c�b��(���@�+� [Wr��&�������I��I�c�,�q�
+��L	%�ܳ:
+4�4���xW)!ɇ����4!�;����J�*�\&�
�'�
+�S��td)�|����ZT:o��׎��.�i��-�*��/T�a�ZN��*���kf	�4
"� �
MI4�}�/����By�t�9�
-`���
`��ߐ�!�R.n�v0��1 �zB�þB�eg���L��r���>r
+�sR�s�
V�`�����Ǧ���""����05pRm�#񄡖(�,�"�M�p=m�s��z����W_-�tx�/��h��˽@z�,t&�3�j�����v&�����h�#P�ɹ�
+!���>�T�ˇ���ؔ��qQ5
%:h�1
W(ӌ�[��34A���	 M˿Sg��𤍗)gjT�
�2Sc��*{Ve�W��2Pfj�c��*�"��35�z����i<k�o�r�@��u��u��\��1e�
��5xB���R�y<8��A�&�[N�`}�ïP�� H&j�F>��,GT]>��35�IWN�J����ѭ�2����q��H���$�r��w�''�iP�J's5>�
�j@����D��->�!�T��.G�J��<�d
+�bg�)��
_��1�O6��A�XLDej���N
���QF��L��]L��Ԙ��F����T}� �l��ы0��1eu)N��X�"Y�|·��u���<ߓ����S-��'j�m3yB
#�5�JԘ��?��J��@���'�Ӕ̓�y���Y��5��J@ͷG�:�@~ΏϘD��,c�ˉ���`:~ƒ΅)���i�::.��&�$�LG�p���
9w2Sc��J �LM T���@Oej,��2=?ScI��X�����
��Ҷ�d�
A2��T
������
n��ce���J&��(�1��
�?�j�49P�l�I��Ka�Z�H�@?��Cue�i��@sMn��	�74~�5![�(݊<����!�󡛕^T���#��H�2�&kK-�.�T�G��J	�d��ѕ�]Wot
�'�2��*�%p{6Cd$LHgM���o*�B��R�{�S�`#@N�* �,CIdK�����,��T*��G�,0e�1�W: T:aW�G-m�#�
r�(��B�~�XJۻ���
�r��65���j�
���M�<��� tu�����#��Jr��`��
T!":�	~���/��t%j�I�,�/D����Ɵ���p�L���E�����,��Q@�,��G�H���aP�r��I��NW�G� 	��f�
�2H9SJ����� �F������Veɔ��T��-Q�
+Uy��,��p
���QW��7A��F��&*
��90�kIV��ﶢO����˔�B4D��-��1�|ӻ�ӱ���q�)��K��(x�`?�AyümJs=��ex��R�	&:|���r( ��ǂ�(��
2�I�mB�I9XRy+�1���
�fY���fZ!�qx�	� �a;�+Ln�P)��{�DG���@?��+�TNt�T�R�j�r at u�PW@��r�B��g
/T|@[%�7�&/a��[�#f�C�lȜ�C�CF�#��
(?�1�嚔`��4� �
Wp3?r�j�%���%Q
1
;`�){�p&!1 �w�i����$�za (�x ��u~r�O,C�O����
+�yqB�/>e<t3�cʯ����n�	�A�8�"dj���)r/�lQ���U
R<F���D��69���� _s�X�|�P�a
+{�a��ysd��N�U0���D�/�
]@H�y|c at .�� _x����U at e���q!N�����:��B�/�A[��|
��ȗA��(���~����ov��%�
+���R'��#���s��KU��P.��|�K�#B�|�i��	+�"I���
\?��ꃔkM�>��
�0�P
�q0�Pi
+�O@e�aX�߬�"KVv�h�-V��N�Y��%@ M�ͺn@�V���Ε4\~��F٩����q��p�%
�P��`%1C��{�����'�yq U<VĢ?庙~P�v���#l
��f�YO�mA��P�%��H�j�R���F�䱐ܱB����B�p1� ��	�I�|s�[�Wxܵ"�� �|�w�X
+ھ� '�
��s�+ ���ό2 :��*�	���cA��skc���BC�����1 y����
3�p(R����%��u�?�e��
+*��̒	䀺��P��Ё��*�OK����%�vB�瞠��d�y�fN� �;Ki��bs�I���6:JA�g
+�F��2�T�,jw0��C�P
:�BD�
��IATmxJl���2$��*kx�f��^Ju�*@��Q� X >�k����N�:��֌��.ƶï�)8�g�<dCք
�B�>P��+W�*�,���/��Q{1B+蘺�p�t�C,]�Q,O�<I�D��;�V �@�.	��;l��|�ؐ��;ءB��m�2�*ק���*�d;dղ��~un���9������0��'%���U+�̝��f��
+��!�t��
n�d}C�xBV�
�A���>A�^����3��0d�1�d*�XX�lO�g�M` s���^T -D'~PQ)� �
+vC/f�"4<�ECH�_Ɩ��I��2��Yi<�J��i��F �I�she}��/[х	���!��~͈��H���Օ��
Ƨ�i��u4��5T�7 at OA�?'A�/�����Y^����za�="'��B���>H�@PDa�5
+
ʲ�v�;��Fyk�Q�������������
Šw+V�!�Xq��*w+Z�!�Xq��*w�������
ªP�!�Xq��b�
ªP�!�hq����
�y�b	.��m��hCX��aU(�V��CX��r�%�T�!�Xq��b�
ªP��Ζ�-��+R�!�Xq��b�
ªP�!�Xq��b�
ªP�!�Xq��b�
ªP����;�+�V��aŊ;�+�f��aF�;�-�f��aƊ;�+�P #�—��aƊ;Dp�,�f��C���aV(��cOLHD[f��C���aƊ;�+�P ��m7r
w�1�r8O���aƊ;�-�f��aƊ;�+�᭩\�!�Xq��_EM�¬P�!�Xq�0c�
¬P�!�Xq�0b�
¨P���S�Œw�pU�
Œw3V�!�
+�
Šw+V�!�
+�
��g�;S9r��_��c�1���SM���`��`�L�%���#�첋�{/�\����]��j�F��4I~��!��;��A~��!��;��A~��!��;��w���� }�;����z�{٩;;����
+�;�5
e���,�O�
���΂��
�;�3�Sw6�
��Y�Н
�������;C��mȦNl�����œ��
�فsSw����;;V���f�]w6�&�2�
��l�v
��n�j��;�� �ӝM�Cw��
�N�
�
T��3��θ+��3�ӝQ�s�θ����Y4p"��[H ����:ug
ޮ��p��8Y���@��pGw���ԝ
Ka�ζ%3ug�š��Ydӝ
4�tg`Y�t�
@*������1I�w���4Pwv̖���l���Έc��+�ԝM�ġ;;V֚®�CPTwv��=��L��՝mݚz,oGw����Nl�'{�;�ن�mc���c
lc�՝m�*lO����IP5�ow
���f��a�]w�Q"�m�[d�����6����1
D���2
!��Lq��T�-���մ�f�1'^4�fLj�H_��"z/Ċ̚�倣�����b�9
S��E�
ӛe&�BP_ݼ8�Yz��P���4Ҝ�73uJ�z��a�~^5�xZ�����[m
��
3@�E4�f�E��E��l^��7ӬZ�Ⱥ	���j3�� ��X��h��2�IYz3Қ��l6DKm�i�,��f���b�s]��/Zj3)���Vm���D(�T�j�ĸ�+�SѦ6[�v8R���W�
��Қ�9��ҩ����7�5[E�Mk��Z�b� 3�f������֬@�ă�5o��-uXa�̼���U�}�v���jS�)�"Kk��<��,�Yf��hZ��*G?��f�i�ܓ�PKm�ٓ\(��f�IP��f�|�wՖ>
�i�"�𩧄
�d���,����
����j��(@����R�m���
m1�2�zd�k�,S�`i�r��[(S�dS���RKe�Y�{�
en[��ئ1��j��3GF#6 at 0kv�*�lަ1+���a�1l�i�
+3
+9�	�}����Є�L_�m5f�P45f�`�1�Y1�'�rGVS���65f�\�҄m�a�1����n	ex�Ųi�<�8��Q�-�Y6���Ƽ{��ט%�i�
�:��Jt��q�-s���<���8:`�GzFZz$MLe٤�W��xO,#�3��
��Jy{�'��w�{bOo��cg��v[ds��Z!�X
:[�'��
a��h�Ģ������6�uL6���3"��|�������&�R�o��0ָU�N�qwS�b��M[7ݖ�*��Į䙅ۘO���|R8��
�I�͚��6�쑛�K
�{
'+68�1��d[�:�Q�ͽ�7qdw��ox{h
�t��ొ��u�Bӽ�jL�`s���м�p��Mv�u��l�R��=�
��Q�c�u���u4D�
�d
(��O���_�L��``���ڃ5��{�=����"ˀ�p`�S�2n[�qyg�'K�َ�^r���O��#��fJ^v���N�Yx_fI �z0�
��q
+g�'SӶ]b)&�RO}g�����-���@M�� dE��
�W,B��5�:��uc���e��[ߺ�V�|�P�p�n�"j����Tl�uV�ݷn[hJx&�m�u<;C
)�
+�cK�����R�j_jV���].
N���Ï����(T�����y�V�<XV�q!c&+��b�]�y�m���eV��]�˜������<e���~��]��tn�A�S,
۶���q��/�l�!����=C��_`	��R�+��t���0�޹N�
+�����0m!�0/6��ۤ�f���!��l,�Ҷ�vA`n/�ƶV�[��mp��^`~��m)�ؓ�-m^$8��y��8cy��vA�+���/h ېEL�ᘘ��.&l
Mi�jl+r�Lc�Lx�W,	�>�u�9�y
�_Rwaǖ�گ�
J�6K
���QHO;�f�e*����n��E�
��ͤk��&�m�ͤ�-��G�4N�C��0�͎��=:"�br�<͒�9�q
+v�n��
�3�lm�4�m�
��h��K�n���1gku�E6����|�̄��UW3��ͨ�馄ΖL`w���h>8���S�M�h$����C&��%��)T�]s�/��e
;��`I�쓥1�
(��P�-����
���Y��uG �4�΅��]~��AP`��}u�Sh��V��fu��mֺ! #�9*/����FL�"
#�B��mc[�Z}ڗ��k�������(h.')�fn�Kn���
+��q�ق�w��zD�4���=D�b�����������(;�pҢhZ0�}�*��h�RZ��ei
>�
+�%Gs	Z�;}q���wL�
%�qŝ2H�h{�JK9��}�5�x�S,_5j5�@~W�^b�L���4J)�A�� &�t�;����*3�)�Y���3^ޭ���n7�1�b<�}��
2�
+�y�
�
q~�s"+q��,�!�lm�V�j}������
����;�2
�/�҃B��A!�.9gb��[��~f!
$�7�ַ"�cX��&o������D�h���d�vB�7�t�b��!ꄩ�e�1�Ķ�H�h��-��RM�R�"+2�j$,���JH���L�B��h
e��l+2m��b7���q�L�YE��[�[
+J6Ȓ���D�,ٚ���{
+#��'��1��
�
fg�M���;��6T����}�n!za��<���aG�
��[H��&opSb�񦡈I�2Ú�ȎT��� �����qVg��]I���+F\��&]��/���T;M��C��.�cߒ�h^�ک$]�&e5���ۭ�-�N~[����
q�ͤ
��
;e�p�/�̰f[>�� (ьv�$(� ��KEqЖY���Èbd��ف�)8I��C�Q������ic�j3��5�p����0�r�F�Ff��[�O�x��$�8v�r��C4��ĵ���+�ȹ��*Ye��c[j�0� =���3��X��Y�g���~���y��4���*R�guz� �HV^-�SE��Z���x�����aNf3�I� �8/V[�E���b�,}�	����4N���m%nَB�#+4�9�2ӳQ�L� 8�r<%({-�5=�!&gre4 r4��y��	a$��\!*(Z�w�+#4K���
*���\�=�`Q��܋,�[e
���d�܋�=e#����X���20C
2~�%��܎ [...]
+�d��n���y_��l�g�sv�>9Jj��B�U�%Q�ռ+�VU�?��#tXgه�����~'�1�͋2�!�]��`>^
ɤ\�����ѣnV�e]��Sj? ?�����,�h�8F�M�vEplS��U�
���R���Q��>>�я	R?���A�? ����kW����9�?]���
���
����[�
���>ވ���ն��Cڧϻ����
�ɖ|?�w?���Ȕ�>����<�?ؔ���O���}�N�y���wr�?��R"������!�O���ڭ��.�o?$����
����}���|>��g�������y���r
����7�)�]��l��S�X���r�u1_���-
�딂D��f��O���xh�(g����_�I�X>�u�i>�^��(���[;nl��*�H��q<YGA$��9p$�tU�T��]��>$��ћ�z���WR�Ѹ^��FeЛ�gϷ��0c���oOwy}�fc�C�p��lH���n��l�J�u2���Eژ>p!�k����l
�!�����N`~#?��R�7 ����h�A
eϭ4�$�E���+4+J��"�h������e�Y+
+b
�M'e��^"��
R"R��ޢ{Od 1�MM~�F����
T�vQTpM#ꀎ	`yZB�=9�� ��A�@N$��S�"MF��;N
�
�饜�N�X
^�`^�s`ؘ��z3�%q�J���
+��݃
'|I	�I�Bh��_�A�5�Á� R�P��`p��0nf���:xZ�a&b�&���)྅�xe
+|
�bUU ��׺xӤ�T���	�p/�!8p-� �P?����$���a�d�b�>	R0B�ƞ�������D
��a2=�hx�i%��cbL�������Q��/�Җ���I���c4���;�ӭ2rR�2�9�
�8ݦ�[@�(F��t�A

���3#�|R�eփ��3˴
�=�y�e��W��[�cW��H�\���[X%��S����1`>N�r�
�Q�K�,���52\8��PIÀ�-�W�o�.d�%Ӆz;]�
ت}�"��^TH
�b+������hZG 8
�A&RV ��BX���
�$�������#��΀XBF�����x�TLЩ��Ʒ���R~@m2
E�u���"���up"ۃg1��F
�,��f�� �C�y�Ԑ5���{Y6cݓ��A���@�
+�ރsUv��9%�7��W���7^9S��U�:
�]h�
T��:�.b��9`R�$�J��"qd{�� ّ�
+d3��$ѡ��+e`�d�dlMVh�Obj�`R�]Mj�ԝO�[i���U4J�}�L���L橗֡��2o
+�U�$�8;�$\@�.���$��
+�����#9���/��
]�H�D�'D%�(�d�$QD�SuL�	a'D$3�>��௯����
+x��,�w�X���*�
�
�
+�A9�m��^� ��jr\��*��X�
�|�GJh�
���*��7�>�Eu �!4*s��h���1v����0���s�?�0�?�)�W��2
p��� |�pM	��� p$P�v�m
�'0�:B
��RH���M�<�H�jF�7g2�n�8�*u$��^����_�D
=�ӧD2�b`�a�
B8����@�)��(�ްc�p�a�4dB	
V�vh<I�˅�a0w
xё�*��TR��1���&b��av4/���B�iFW����<b�~`P�
$)t�A��%�q�s���bɌ=.����5�I6
�ϣi��5ʋe|���S�Cc�Q �Dǡ^ \c
�fpq`TD� �E
"�>�!l��C
��@
�Y�S��#��h:"�M��`_�
�"�ފ�^�@@��"͈X���A � ��ѣGE���6d ��ī�AbH��up!�P(�Q�ڃ��J�t1H
+2�[�B�Gܦ*M��B8|�
I�*=8���'x![A�5�G%�o�Vp�
+�b�G�Gc:�J��q�i��!
+t_��$)4|)
+u�i�jhW��A2Ř��\gU�f��$J�ج��AS��0���"͏ 
��iCs�*ⶄ��Ӈ*P���'����L#�k�)U�����ƀțu����:V
r�Q
+�d�©���
��b�!�x�v�Q�R���eS�B�O�+��v!mJT�%*,)[Uh�7�0��3x9�i�	8�9
O�1AC�'C��˘� T����1
+{�%�l�2���1�(0V� �@?"W�A� ���"+SP�8�B�!
+�
+R"�ԁ#��s�z���ٹ5xx⬣�Z`��PO0j
OU#8
i8�F��JE9$ p�
�`�=�2�����0��NG�;P7��e�F:'��}�"Rq
�U`i_�$�1��4����7�P�(H�� �(�p�
}p⩨S�l��p@@]W�_�,)鎇��*
L U��C j
Y�B

�F�������M�@�" �
�XL��  	A�A
@jG��B������E9���P
p0�1�����ш*����dc ��P�N�'�ƀg˚�AM�g�D�ؑa�@j0P�v*fi at d:�L��X(V�
���Ë��>������"� ���ڊxz�g��n�����lq1�R�V
�M"��kT����2��͖�܃,I�`�̳w�GeT�3���$ix����$��\�F�'�a���ZTda<� �7��Cx(��`��#��S�(��UPi��
�N4n<hdB400�b�u�z
�
+5m�3S��������"Ĉ"
�zb�!�jĸ���>&{! ��̄b�,Xyt�;D�x����BC��Q������C̈́��3:@
��]<O1CEG�d٦�q��:��'�45��&��Y‹x���o$�&C�i"�l$<�%&��u��R�4N���(
rpS���-瑷Hج& W��Pn��$/i�Q�(i.�|���N3v*�@�E��B�I"=����a�&6�(��h
 8��D0E#	n	�Yu�y��Z�fG_�R"h��A_b����!W%G%s�C��nf=�!h �t�&�Q�0 ����<�
,�
�"
���Q��R0�Xˀ�aP&������ 3W#: 4M�XW�)[�r�z_�Dl�̟����@S�f�7H��ӳ�t�c	K����F��
"
\
�7�*�#x+�hYcb2leL&�n�t�4ܨ�J�	�֨݉j?4��f#s3�h��
67
	,�b�$<��0V�$0�RvE���B#S��E�R�&%�J���Me+��tg� �͇lfP�X�{
V����Nc�I�*ɲ�V�5pw�pn{�
R�Ȱ�N6�V `�d��TZ�c�a�ݡ��4$��d�i �N�����3i�ꎐ8Z���F��<�dٌ�)Ҡ� �&
�O��*��`�$�1:{�J(����
>UAv�bijx`��Hˠ	XO�~j;���uS�2
�&NE����v#�ӧ�D!�i�x��XA3�F�h
��aw��A�B�;�p��G at s���}
X;PT�7�44/�4
� -R��
+Y)���P�]���<�~4�m�:
�`" P��	ɄlK����h��E����&�#+,S����9�u6�S�s- H@)`�A!���x	Vb��@gLj
���(�1�9)yD�*���������c�
+&���u�+�l�yaU����ă
+D�Cc��x<��`�!0'2t�+2KΨ����4̶�`�d����]�v����+���P4m
�8t��o�.Ȅy�
���ӡ��(��
D
�:����?zZ���Rd;���������P77
�p�4��D#y��g�h䙜e�#
����)���,��)jf8� M��j���e�
+J��O����~K"�p5�J,�)��x��h���D �l*�
��WL
�:��1�.ذ!/��l�f���֭+���5��ކ�L]���P J/Q�a
�<ܼ�F��������ĴQ�H�)je 
;Y
�	����W����A�' ���>�s�]Y�&^.��3���Y�
X&�MHd�Oy*���R
wt��
+*0���
+x�=��R
ugQ��Y��N/�
5ϲlߤyYD
+*���aV$d��$d��yGY�`�g����@���
��`�ٜ����U��|�J%�t���@t��
�9^݊;0"Xv*���%
+,�	�A.�E���+���
�ڭ(�E�"q��p��;8�k�@���HH��R�pE44	�./\
+���6<��|%zKo{�k�F���`��.Y
t\�+�3ɉ�S�h
����G�
3���N��;��@V�2ޔ�p_
+b��d P밈�L��QS5e��

+ȉ�qt�8p0\�&�@*W8�}�
+���T�ř"
+6$�+���8���b���oVX�/d�`T��
'
i�flS�9
���xs�dCl(}t	� }����}��?�C�����6��t`�\¿�
��x+�;Q�"
I����	;���I`�#?��6�^�1����0� 	i0%�O��-�n)�u��H�A�b��T%z�.཈D�2�Pͫr8�� ��
+F0
�p���+r�Ho.smU�>TP�����u�� }�J�	
���_h���c�xU��e<�_É
+v$3�R�c .��A�.4sj��C}Dk�@��8�y�_E��6T&�����
+ ӂ>�jtW�opU�I�KRl�2�������HLp�
$@<�߶/��3(Ax��>� �0~��K1�(`e���/hV C��g�	ϒ�F�@H�����|�@�� �
�
+KɅD!�������
+@�<Ym�ˠl�TՕX�{��F���]�ɴ��� x�H�WA��k6���Z
uG�E!��\k��
	�j��H8�nA�
+�� 7s"5�������#�E
+��%b
]>M�SY��j��Dk=YQ�8��
�
+�	y7wD��=�N"�BZYR�x2vR�=ZƜ<PAf6m�
+K��,2��ȠA���h���\z�G��&�f
G=�|�sx��Jg	�Z%D�f-4�T�&�� ����pa�8�fG��y<|������+L�����?!�j�1*
Z0f�F:�kq�g���d�j��l*;��\�����쑹i@Ez��F7�S���N�*��F-�[�W��J0�/��Wd�?�'��ěgp��
�
,�Z�DLѥ�o`�. љ^ *��1 d�.���S��Qs��Q`!�1숀X@���׃Xd#�
�B�~��т
,A��a����+�h#•(ޤC�N���@��1$HPE�x"�a
p��	��SB ���vPCE�@%jE�.f�'B!�U�f£�_P1A>�dž�)�JI`�PP��N5^�2$(��
+�Lnp��p�j��)O��ԅw�:B��L+6�WE$$�/��V���a.N"�!�9Bd&�
�`� >x�(�p0
Jd:Z����h9���d^���#��	�
f
.z"���~
���
�]QEf���]����_�j�$� �!G5 at I�jڣp�S�/Ϣ���
�{�q>�T�)%?��X>xPxd&j��`YF`�b2oJX�7�B�	
q��UĤz����e

�7 {8�t�::����z�A�F͂8^��'13� PǴ�����;��LJ:p� w�
+�j4[�h~��L��7
�:����҆^�ĈH��Le1��
����(b
+	ͥ�9
,��
����2M��p�0�4�
+�"JD �gv���+�F/27�tO`^L�D>�5�DT�Ą#`�%�F'㙌V&f�]\S����+ŵ�t[�\y�7����T�; ���8jm�`vp��2�
x(q2��PM ��Tl؁�n���U.^Qa�ˑ)���,Q�a��K�
G�L��p}I E�!�9@�؅�nGQ��C�on�z͹��b��
]�Qoa���as���>��_�3�D��'���

">� �i��9����ҟ�=.��n~>+.dz5�
�b�)���/�F�'��B�� c�
���+�ܬF�\o�{6���rh,}_sя��d2~^���AV	�C.ٵX]e ��{X�+��uV࿮�]
l�T(�қ|���
�M|�����h��?7��0fmB�Y񑣗訷
̱���p%
a,���B���7l�	��/LFi�e��SW��MC>W��!*����6���0��%c%��\`��]p��""�Kq�S�Ȓ�lj�5��>��h�@�]�D������[3��"��vR��@��_Uę1I�_��wu-Z��
ɏ�m.0L�؛�?���~�n�b�����?R��\�S
;
(��d�

�.�x���|?c2����
��q+22����
+���6����Х�\��hC�j!��L�g�q⭿8��.�w���q2��38
+B�]��0�Eix�

�
+\A�
".΁�``y��~9�?re>��0k� �t��\,;��D��E%�Ƕ�!�����B�_�BWֿM��^(3��k�?���
�����Љ�
+����2�51��<!���Eh��Ju
�(��x5&%4���ʺ7x��"��x`�|6܌��S�|�*���Z����W��G!�Ia�*���:A�|]6s"�#cxt��T|� N��w��'�&��BΕ���� A����
�_��tn<��]{.��#���]8.�}���"� ��$������X�p���g����ޘ��!J��`��u���2tş@I!�����Z��OP��G�75[�A�����s�ZLz�џ>����QaV�x�v�
�D}��5�/��-\P���,���cb��m
���O�@ �?�n\[�_�Ya8�!�m1T����.� �PK�O��k

+DF�
�Ukt�}���G�s$bC�5���F�/C�Si�f�y�g���
+�s�"	 Z�">�����
���j
60��u?��\�*�_��~�+��?�g2
OH�6!J؏	-���[R
���ZL6�Sf��O4���HlDb*Q�����\N��!(���E�3���AqN�J���O!�w
���,��i��s�ۦ�����~��)�W���\�!Ӏ7� �����	�"k:xۀ;8���,�*E�Ϳ���+�[�~�!
Uo>U������%�y�	��	
6��BڢH`*
\}�
+p�"����!B2�0���>� ���e�^�o��?����'�,1eC��=H������|᪌z���~
���C�﴿/��!�rgŝ��}ʝ�����)�����3��u�#�"b<͗��n,Wc�F���mVF���L6�O�%ef�?�6��]
&K�'��?�

cX����j9@�
�3e��2�:����+;�h�/��
�,�YY�������Wr�
P?��?���UG�aȓP1Wxx+N��Y��'�#�eo�",u�5���>e����[8&�������@�9�L��Ř��K�p1����Fp3d�p5�M�d�h,�����֧����^�+��J� ���xf8���uomtA�"�g��1�D��;�ZOr�5?*l�o��l��q�x^�s�ks%���gz�O��Io���}���ߖ*�	2��c��"�ü�<�:.BBX
x���`��
�?	�����7;�?���P�
2�h��˒�Ct[��3R�G$
@�fU�ʣ��YwY?Y�O����
���d/�}�2����dn
��y]2��
��P~:��
ErH("���"B����3z�
+*��
V���?�-�.��'�,�ɸ�lto+?o.��7���4I����6��j��,�qA r)��Vt�u(+�ş����
P��d_
��we*��?Y�O��m��i��G��?�a��g5̿�I	��
��O)�΢��6�{�T�
?�Tm:�W&�3�K��׬߻�1�kj��)`�q�C:�����X�\�k���P<r
�k	A?�v��k�������nj���z�=q��7�����?�۴Iio3Y?ؘLe<]L,&����I�t
��;�m��@���p&�6�D9 >���ߣ!Zy��m��� K�\�����x��ڰ» �Z�FX�i?�Fs���l
-`{y˘L���O�Χ[��̬/��K���w|�L6�ս�C��L��
�G/�a�h��KR��%�u�s�
��
-Bi2k�,@�.IQ�r
�cu���9�dk�"�j��w
�"g�A����[�7�B/��8�
�v�c���i�i34q�Q�Z�&N�"���u���2��7�?g��
���s��sf�
P�K^�
�~�M��S���B��
8�O�g&к�mp<
w����Qr R����m��R�s�l02�!�HI\���!n[e�z��fa��N���
+�� s
D'���,҃����[� C"�JЪ$�}�[2
��bek
)�
��	��QP`���0w�1\�ۆ+Y�F���M�ZCP
�!h���4�x��龰�A��--ځU�^[@u��d��Fj����S���>jG~~�
�e��/����6
+��왔3���Vv���$��:{vU^�f6PV�<��
ze� �h��u���38����5��//�v�r
+��Fo����{�����E��~���hrB
+��3���{8�	�(M{�9�hM}�:�d �`p��{�	!~2z�	&|2z�	�2z�	�}2z~L��S�\��r�<ZoWl+]n��
��
+���y ��9l���g��(�
)��=RƢ8��o��:�U�K$5%����%§]�v���P�w����
=;�v
��j
��	b�s�����?��r>0V+2����>���y��ꉴ;����d���g�5Qv(����#�a��+׽�_��ȥ0�н1���D ��˾���v�
��?�C|l>�L��
�{�������
:�n����������t2#���z9�o�f^�PxI8���?�}�`4�
�ƌ˜o̯𯵕e�{4[u�-W�P�v�_z��PX(_}`��d�����l>3�1�����߁��W<i������<N���C�A��b���5�1dp�
�����6��/߽��/�h��`�Zϧ-'����l��
�yd�}/9������6C�_إ����O�x�@����2��YWyY���
�l��1��7W����B
BBf^��5��*���̄�k�f]�6��|MN���.mz<�������NbC
+���K���L�zN<d��MR%QUU�[�������B.@�X�o�#v��\0 ��_=����
���C���
2�����
����4���C}۲����GlZ�W4Z�Ja���fb,�,�|��2��XhB2��rݟ��C��
���2Vs�[����,�ˬD��#�?gV�9��6��1���t at 8��|5���W�
#��U�
&�Z��`����u7!�N�D��Exi�;�&
��Y�uW�D�`>�/]����V�eQ�
��!إi4��,�o�ٷȉWDM�@MkZ�7����0�eb�)�w���X�b��ƯkW|8^����x��{`��4�ݙ�t-�j�_���{��+
&�fx����=��f5T[.u{�eo�6��_���ߛ�fsG�s�p�����j>�0/�]��Y6E�Ul�q�6�_�l�`��3V#W�0�7�$�z�5D�Q��Y/6�o�ᶓ}7�lo���=��|�Y�Qm�x
���%/i~U����s��2�de���^�%�	�@�.����aq9O�o�
+M4���	5�����|1�“�3:?�Aj�}�ę�ɜF�Xl&+;�mu�󅭦�<UWe����~�U0i�q�
�l�)�xK�'��c�X4�`��8���j1gm��9�Eo8�i�7o�p�ެ�Y}/
����	�N�H����z���sB��˹I�6Pݵ����j<�Lz�w$ ��葃x�if<$��6��uL�K��E��X�- �
�{	q-
�뷤�.9Wz�#1�ϗ��l�������"�W�0}�p�T�����:�Ru��� �v����4�G�;�ކ��6���i�٫�LZy�[-������I�׵�M�me��lh�Z1��jM�����o���r��*H���g�,��g�a5�;�ê��:T��>��{�xgVq�<c���q��z83W6Q�X�Ic���!ퟫ`�^ٙ�KA.��Dlr�$6��yH���+c����_m�ۭ`��Ə|�)y�[!�:
+\27�6oc�����E��p����)6��7[�]��
q����xf�V�2�z��G�k"�9���|���#l��]��
3�Y�f�?����-AX�b
�-����p���%�|��m��M��JK��J_�ڈ����|�h�
K���`�v��(����?"�N�Gٱ)k���D[	���"��c��M�S����-N�1\���!�����D�q��&#���>6�E�8ѭ�[���˲�R2�r�����[�7��;�� k9��0�]�-k�1�ԖS�x���&���v��˼���
�ϻ
+��
|�<}
�A
�?=���-��Sp?��?����� '��+S[�9����v�H
^<d&�Ȼ�V�IpH[Dm�`����������b8%�'��
�b�ݍӻV��GKMT$���;[V^�pa	��vC�?�����gP�)Q����;!�s��Ⱥ�5�r۽*:J
+k'P/�5r]��\�%ٿ˯Zٮ쇛g���ρ�H�����C}��ػEG(T�>�>14V���*�. �>�~�"�=�;�z+ʨ�kO at -�r���d�Z�gD���0��1��
h}�	�'|�
�h�J�ۓv�&ㅙrfk�؅Z0��W���>�$>��;��.�
0��&�/_�q5XL�}Ε(�`���¬�B��4|6?�N����x`p_�
,c��W|�V泱oR.�S>���S����z������@	�E�ɋ�8��3X�� Y�:�=Ϳ���
�V����{����(���w �mS����1h;�� ���
��a|���f��p�5ˣ0���|���զo�G�5Z��Zj�ƊH� �~�Ы��x�m/|>�گ?�#����&� 
��������Qoh,�/�@������[sB���_A����B�����F�#�������)��K|��[8j��r2��e 0��}���?�/_pX}��0�|.���^��.����vZ�Z$Y��o�'���
��(
+�
K&U}��:��̼����A}K�Lm����]
����u½��(�}�_�o(rS"���Ï����*f� >�y�9�������Ӭ TC7�XI/��	���<�=y{X
�jL���v�y�HT�p�uki�$����IZ	�C�������w���'�/V~�+Z��}��]��������3#���p%�Jir� J��������>��[WWb�tqt��ku�P�����mm����{nf'7g����9���U�M����=���O�����=�����O��Շ�	�ý"�:��Y�R<��s	_����Ʋ�C�,/��{�Ǒ������
���A*ZtD�O
�
0�'�zӞX?I�ꨍ?�<In��F�4����p��a�x��O�7��Z"jlN˦=�M�<�vVas���&��D�����ʝ���U� q��r�D]
k�ų?rR"�&P|�K�=7��LJ�H�)G�=�D
���`8=lO�>�+K
Q���?�����!�����M��
N�V��R���
���A�s�Pτ���zO��ޗ���W�����b [...]
����e�(}��O�?�.��ChU�	)<�xY���7yE��41Xp߈Ʊ|-%"�W��]�n��x
JX
>��^c��K�v��ں�/��u�w��SH���>\���ŬV]��啰
�^���l7�v������a8���D"����)ݻ
5z3P�������Cw\�?��Vu���V�����}۟�W���L �_�R��������8�q��i��=*���V�ȩ���܋������p�S��榥��|���O
Kɫ��|t}���ϓxE��*��(�[�{T�C�Z����q_�Oc�F&!�MP\4�7�֍�r�ڤݾ���]�yڪZ������P
>�ծ�0��o;�Y��
.Ɓ�s����߭z���y�;��������7L��u���n<��ӧ�(]x)5�y���yF9nQ
�{<�ή^2�i�5�?�^�R�=I]��� ;
�~i�m�/s�1���;��"ǥo�B��[B2��e�q�\�v5��y����=�{)��-���\,�!��0��Ձx�
���_���7��
��ש{_��D�U��}�{�75.s�<G���~%�����'�@=�y~
��r���w ܲ��<���a~���
NtKَ��ɪ���^��1��3�K^��ks��?���bZ;�8=Ӛ�qH�}^}~�ptV쎏υ�pz>>��.��{i�sy��_\��۫x��\�?�߼��ܼ�=��m0�z|�"��pdY|IE��b!�xJ�ؤ=�����J"t2�%����m|גG�c_�>И�.���=Oꭗ�K��Q�϶�2O����ד�ǭFs��g�מ���Tl
��l�x*�������tS�H�6�T�\�>�*�y�[�|��˩�ZH�ukO	e�穧��8
W�F�Ll�J�Y+��>�F�n�p�yh�����,s���s�!�Ix;'��ꌼ��ݒ7��xv6���u)��{�R?>Z��yc�
��=��n,
���^x:�_3OO�b�9�M�F��2��c���b�"^�I//���L>����äSV���\l1]�^g�S�2�|��y?�|]\�7��D���<oD�8�


��ꁺ�^D�+_���Q� ��|q�_G
w�8|9��{<��@�ӈ�
�d�nq���Q�]��-��-^�j>�"�����I��]y���
��|`�4�6��/�������ݣ`�
��ߟ�
t=ɝ��ֹi1o�k�@�NJp>ȉgU��8;�CR6u������鿝)���ΞGy�<sj1u��B��6��+z���;��*g�Յ�\>���.�/n����Q�ظ�;sWZ�Z��xz��tz.�x��s7���^X�ޭÓ|���/�=O�{`�w��}L;�=�^n����jk�8,</��4�ߊ����aw:J��A/���R.UJ�+�m�~�>�h�E_f����s�zn?2���!9�
�{�|g
�Φw���F�*&�_��a�vT�
c˲�����Ȥ���*ypX-�Z(X������
V����<hT�hSZ=��/	y�ʜLw��Sw�s����S�����V��&:�����
��n籓Luッ�Gr�>>���^�t��Kb��_�����"�������i���9�>��G��<�WGGW�+�-�R�츴�^�=��}N<���d��*O{���qq��s��E�L]�ɽ�`y�4���G�\ޔ�����E�8�����r��(�K�_E�����R�+>�>
+Tb7e9M�
O鳸���VW�th�Y��������&���Z�J���V'�p�l�̝j���ԡ�e��r-5
+
+^%�{2J%.����5�/�P�_*�*�0K�{��y�w)�SꜨ
�h�"��T�%ru�+j79�Nu;�ד���<���䄈��������3��n�O��R�:$ge�h�
%��k�0y�h���cZ
N�7���q �

��:>�U�������X�kK����]��Ɖ��D����|��>��⺗)��;y�;�_]"��tޒq�3
+���wo���L
��ɓ�mD���d=*��ME�^V�Arq�j���lR�?>�����<=
+�
�q,)�������^?��'/�d�
�~�ߌ-"h?z�l\>��F�*9�.o��)P��d`}��|�'����`+�?���V{� 

���;���3�P�.�l^ܟJݣ�z���<Ɇ{v6{�_�F#��!yP�պ���s�%��I�4��{�x�OsB2�M�+��br|K�%������4?:��r��峱x�US�缐�4N��y��b)�z���
+��DA�\��F׉L�
+K���s
fE�&?$��a�!f5._|��<ֳ'�H�[S���T~Τ��L��(^�����Bn?s����n�3�lF�
+�7��_�
��y:S3|7�n:U�_y�ӌr�+�	9��nOqz*
����Ҹ�e�Z����kU�s��������Ei>��D��_����x_�^�鉧��x���ݙ�,=���3�GO�Zt{2����`�Qu%�K�\V���P�U�q��8/����I)��s�j���qo摬�b��^��
^:�e�}��J�ӷ�����4h,�>�~k����2_�
�xھ�N�
�bi�N'�OGϾ����]�������o�3���p9���=O՛*OZ��f��F��X�}R߯��j+��܁�2T��dvt���T��{��Zz|V��כ\�0R�t��&�=~���B��MZ�ԇ������
{�t`yT?��r����9|
u�9O��uV�tZ�˕\����V6����Ut-
N�'�y1퉽T�Z�m�=��9Ño�J
���B|snm�/��_�H��r����;I����\v!ߟgڣbJ;7���c�(����}�"[h�.��F76��Jw�|j3;*GF�LF���s�\�0* [...]
+OV��N5�u&��>pVz^�
���գq�n�>�_�'9#��
�֟u[�i}�},j)n��Xo^O����H�M���Eds��5o�é�?����r^��
��{�1�ٛ\`�E�>�{��b��4�o�G�1x
LȮ�
��0�HV���^�q�φ���7�^�r�Wu�8)ʣ�R���J���g��U����/Ԇ���{ny2��L~-\
6���j(�������E��e�k�9-��
��˃RqՍ�Գ
-9z�+�Ye礚� uy�/.��S�|sR�<�“�TU��H�����
_�*����f�X�+E[���;���j��Y�6������_�����C5]�mzN�yo���cg�b/us��
޼9�:qP��?Fn�!�=�_�o2�Z�N*�j��G+�^�����%e�S҉`_�����yZ�
+��R>��7��e>���q��
V����q'����·�n}�)ͤ��n�i�Uߩ�_TO^r���|���Y�a|
9�	�%�197�>�Bb�^�|����q�ػ�z��
,�F���lU��JzU���'	=sW2�D.�'�}�|�6*��n9��
�s�S.3v�ܥ��]��t)�߅O��Hs�y)?l��4_M�VW��P�ڏLrem�
N�Ew�?��$]8���.��j*)W"�쵝K���(=�?݉J3�̕ɮ|k�תrWU���C?'߭��W��}�Sꟗ���I��"���}����t|Z�oΫ���]�
f��,S����R7�l{��M��&;}|�zx>I)yM��o��J)�"�<�H�+�f�!V���d��͔�/i�|uM���i��"�2�;-��ǽ�&�~m�$���:D��a����n����4���2�n���sR*�6��@�s�HW�'��|q��R��r\��ɽ�"6�r�Ԥ]���؁8^gJ��һ������
r�������5�����T��3����@�Y�N+��ZM�����[���̓�����{����&�m�x;�{KKB! ����/����
U����E��̗��))| �.�����Q1�7�i}Z(�u��������I��ӛ�'�u��8^�̃����5G�ַ�ʓO?.nz7���amR>gF�r�|s:Y��%i���Kם�=O��s{w���<:�B�9�h��áR�L8�,�� [...]
+1.K�'w�ȍ�{���C��;���D~m\<���Q��󹷤����m:���#/%�P3P��y<g�ϥ�d&��e#�{�_6���z:,��I3?�_��2Ec^y����U-
��ӵ�Q�i�v�ܣ47;z��])D�������V�z
�&z�K�NZ�־��Vn�Nb9ax�_������Ȇ�ɛ�A�p��3w)3��e�����o٠���'���:W���~Z��I%S�w���k�v�&'�\�wq)���H<
/���9���`�CŸ��T�f>u|]�Y9V��jӠ�I�
����t<��i �?���B3�
�z������x,D5��0x��KA�����F�b�`�D�
FJ5�(n��zGe����O�sB��~[��!�t�~%�e��vx���M�*���٨��2

��M
����T(~Qʇ����������tC�~R�K�Ŧ[\����q�0���G����e��xK��I"�����u���U�\\�˾�#��ғ���8V���_��2�U���=��8�,�j [...]
��gZ=�h��_^_��yί��<�%�3��蓽Y�\̕����C�x^�}��Mg|w��V�vlBd���Dj7��w�K��\*t��B�����l���e숯���%�gMrr���˽�ݪ~�_5k�o��<�ȗ��K���:��o��te䊕���7Q�
��a+߻����ؽl[�qk���Q~8�uon��G���~��ZY��'�����]���
+7?y�\u�d �!ȱ�Nt��\�
��rRط�i�r����
�蚯�=�O���
��8�����_���m�
����a,]�_�
w�D~(GI)�����B�ニ�t�ihG����K��s}X�T��_9�E�d(�������D���O�~��i��/*}�&
��/�?��o�	�� )'C�x��y{Ix޺��d!�T�GC�p�Kg�x,�ڹ)�d�<�ⓖN����ƫ�:��A��-4�;W����I/�:*<7�=�����4�@�k��Ө�.
��lB���/+q�����g�G�r˟
���1s;ɉ\�
����"�餟���;^H��t!��ãb<�7_�y�<
ޅ�Z�,y[�E��A�V���9r��~�
5�@�gd w��ō�I_��[:y-��Ç���ˋR(
C'��c�-����{^�U�Q�2~���u���V
��+W
������
����Fl�iM��̙��K�����"�Q�<A_nx[�[�ڦ|�&CY���4#��;�N�&��ڪp�l���u�9�V���f@��I����r�dj��J�HθOrw��C�}�-�w[W�׋�x�s�.��غS�o(Z1������xL�
}7J�rtw
<��S�u=6�����@��8��N�b�҇��}�98l{���}��Ӭ�/� &%^Έ�Z_�R��������mv���?�s���,ӌ�ln_/�w/���>w�r�> Z�e��P;���vT<h������O�ɓ`��.�*��@&2U��D��v�L�����H%B9�s�A(����w���^����]��ݲ�����
+IO�"��&,�2۔l1��^��`�
Kμ�F�^�-�
S�+�-�QLF+Z�`� e�%���i���v1�E�ձѩ���G��c��>��J)l{щ�U�Q��ž����
��XE�#}�ȇ��w�K���fbL�%��v�ZQ6��0RZ pJ`���m�����t�l^cTI\,6 at fQ�4A��٤oY�:����h���O�
���ʼ��g���~A��ʡU>}��}l_�����p+�6��P|����}�k��p�<
H�-��nauҕz�\�&
+��x�����~�K��$�nD��s���ὁa�&�|�z�`ƒ[�F� ��܀
�
�@��]l�ɲ-�v���/�iӳ�w,�f�"#}wv
k��fM@�F/U+δ��)�<M�M7�߻g��u�QhϸyZؽ��"�w	�t�n3�mU�dU�<P���_B����[������.�mI���/x#!Lw'H��J4�K"����O�.��
*��q�o$�)*y�">C6�F�1�J��uX=C8��^H�
4���
���֤�
I���te��V���;b�a���&���U�,>�<��x��D���>�+��&��W�`0���
+������	�'�-��U�hd�.bS�҄��+hb�I�"v��~��ü^�p��J�F������{�?��(7 ��i�[�;��
�s B��v:���
6�$��mv���92����$4�@����=�ϕ`4�C�q0%t@�&xޕ�C�w��Ҍ�����?ևbxoR���*�<�/
^�ի���pH�ͤş���W��^av�¨1H8��A<yt2��۸K;kc�HX��t
W���&4���&̙-F
������Ơ4J;��������>�tM�h�|����z+��|����eZ���t���p�tU
��x
pL 5�`���
+f?��勷�'�
�D�+ݢ�
+�!� ��Dr^��4+�n�)��N,S':���s�3�#�bˑ��o��%�&�RqS��;Wb���e���u��
`e:X\ec�n��mC�xRrem�>[�/�ʘ6
+�Z{F
ԇ`�z���
����S�زB�����&J��k��e[;�A�Ũ<"�
yp')X?�b	/\�&Ok�(e�>���w�ط7U�b�
�.�U�Q�R�w��Pz�5�����f�K�M��^��w�
+|ZZ��a����+�B�)4{f�G��&�} ��k��%�'l����iBP�I��.:�h
$�#�V���	�
.�=�Q���&�^,�%Y��>�7e)��>��d��%��Ҥ��ó�m�B�RK�T�+-��
+z�Vߐ�����HS��CY���pҸ2���]2F��$�uP��~�
+������[�Tk�T
GL �7Wg#H"�{G���M�eRe|�q
�@s:]�{C����'\0
+�m(��ů��9��r��B� �����lx�f�`�Ȩ�hVy��
5U���ԫ>�P�ʧ!�A�W��4ɕ�����#��dK��}C�2]
j�A}#�i}r��O�N~���V�I�=��I����]Kz�fk1��_DU�T;�f!�5��šF0"�+̪Л�@fUFv�j��d)d�S������&����
u�
Ԋ����Y�,���߈~){���^OT4�������I��>�t?}+O���d���@p
�fjL���+)Y!g��@u}�\��`_
�7��S6IJ��Z��^�� }��' ��`�+"����:=��[~ �{|��6����Y��,���`�PpB��¶X�K9o���R�ZCW���+U�m&��z<�H���U�������J
_!��9��<�b�̻�r3�
O/7l�����G�,�cK�f�,R�j�s�3�H��yG\�����B=��\�.�h�^jɜ�B���8�c��d�j��͓�h���EǛ��u+kaq�M;�-���`"-<��W9�����ߝ=?��ڱ��'13�W�
4�o��Ա�*[�6}���(w�ӕm���:�v��a��#�4,� {&A]`e��Z;*2z*-n��1�e�J��Er˝��
���K�"�?(_mG�����(i{������n�Hԏ�ϟ���_+[�y>�-}S�v���)q���k!����� O
BwA���nC�
��fؾ�gC(�Qԑ�+��޽�h��>ƣ�����F��F�f���]
(<�3�Y����u��`PB�2�L[�v��#�b���ez��
�
�
�2P�膭ޔ�^������8$k9�0����(
��f�:��>:D�4Mr�#vqM,~'��z��kI���@)
�i&3�a�h]��]:Ve��h�u��A�زjJ����|�S�}��Ɠ��4�^At��Z��
����N�DA��Nv��,z�iH߳���� _P�ӹ���t5n�7l�Ud�WSz��Z��ʅ1����k�f�F���7����L�ǚQ$��jz�6m����Z�U�\���?8)pe��v9��������
���Oz��C�V�S�?��� ��y��!R��fK��N[��E3��NuI�Z���͉��;/�/e��>͔/]��fK&VX�w7�
I�Щͅ5@�����'��9�d�%�{K���چ�
"�4�)�Mr���ga�u�FQn�~
�o�PR�%DЅ�$���c|<��m�W��A'���|��Im���
3���m�ȟ���ŀ5 ���p,���t�W�q3ne����B�*l�@0�3v0^���?�"�?ҷ��
����}�-.n����z�>۵�{�5�:T���20⩎�Ԭ@�΍*�Z�3��5�*:�
i �+8������;�S��4hc�B+�^�ҽ��yޕ.v[��/QtІ����D�ӷ�_*���
��l�n�
�TC�[#\���������~o��c#�pn>��
�z�4� m���j�7���
�K{���Y[����!o�m�qy��II�����
��l��=���c��FG���F�T���@��O��4w}E��LqSh$�=+
H�F6c!MɅ=���]M:PB3P�ϋ�AۚU��׊T���:�;��g�����T%gk�;�3N
iZrw�W���@���>W��&���̋e0���!:�Ə��_ ��нb���+��o�g���J�^��»O#;7�
G
מ?�W3-�12�6��R�N�#5.Cs�v�p��XW]����,mݝ

���'�}D.���,�'�3��1?�+�iK��B���{}�m������G��q�B�|ڏ���?'jn�r��PO���\mt�O��u�n�#7�[���v
�4P6[n_ۛA_2�ԡQ)x�S�4�,f_߅�V2�!e�mU��ay޶���m
+D3�Ap�
+������j�y���=Fj�+*��e��
K�yT�y���d������F�[�c>S3g�v����(�z�GJ��_�9��@�쨾:���/��%4O+g�ѻ�fhŬ=X,���
�4��E%j�
?��H(7��D-�N����G�Lf,��<�
�vY<���-���4��v�o�u�c�f#�|z�_�sg�
���;����v=tc8a8����z{��]�[�rX�斓�;��Jc:w��
(�8*�s�6������;Y�Nq�$�W
+�t��7,��gO1#GCu�d_�ip�x�����Oo�4ӁY��5��|��F����H��M�y�]�a����)z�M��}~�"�(п?�{eQu��{j+
+7Ա��r��[>��]B5� �z*��h���G��Ґ���<1����� ަߓ��0�qq�X~�V��y�un��Aj�P�*�AVb��j�(�0�>�r��ϏB8]��6�r�J�{`�f�ӇmIެ��}����јY��R\�Y��۔6۞�j��M�� ����vf>4��*�+��
l{�s5GY��`}��
+X�b��$��R{Sc�n��f���2l�i��{�d���
+o��F�Vm<��\=�惇�mjVVk�Sb� 8�G���5#�/zI��kD�/T�u��]��|�
�� ����/��r%kF$dc�;� ��
+�`j�(
��N
��+�Pd��*~����/*�F�EW)M�c*��i�:wY+W/�Tw�"��/�%bWU�.V��~}�͋9H��A���,j��ˊ�����%�V�3����:�fA֚�[�tzQ
��9��u�b�)Gh�)��n��b���h%�U�'�`
����n�Z�k�0U/���O���W�Fz�K
��u�w_zF�(�ٌ�5!:fֶx��p!��CɔK�<hX�qk��u�H
�U��`���T��
��H��6>}{�c���"���d��D/�Լ�ѓ�x+�֮�%�g��!t�x����
d�M���e�O�D��F>d��sm��7�B�J�2���zϸ�O��a�V�3�+v�P�2����p���د�p�ꇨaH!0�������b��
���U�Q�Y�n�s���W�T����jP�{?K4(�/�b=;�{�x��Qs�'�KKkb\��g_�c/1( gv(�֠�Ԣ�$F��)�-�䞘��2��b;=�[`{��"1�+?P��YuЭ87��c [...]
+��-Bk�W҉}a��([T��k'�׫��₯2RߙR+����K�yv�
m���mr�H%�ʵ��-0

�1$�J���F!-�5�W~A.9�#�/
�}FY��Pgr1_��{��Y莬��"�PM�
 VR��@G�"��j������]�E�=��9�63%Q���j�T���Ξ�S���:v���^�ƕږ���ٸ�[�%���]_`���5���w��y���wO�e�s�)�9�V��J��tR�bs`���C��c���JWk�;�0�(J���E^�K
���]��ʖ�
okq���Q�?ª��mw'ʝ��-6�a��a�
׭Xҫ�P�-
+n<7N'��$DC��A1{�D�o�m�R��>P��
+5�6�<�c���M���:�F���ʂ��?oH5
�RV]�.X��nH�P!g�)V͡U��\��M�Ꜳ��Us�i��u�[��v����B�:�[���vi�bD
��![ߴTS=��
+�z�>��y�z',��,���)ۢZ>�����`�G�I�)����AF�w��ITAz
�p0�yZE��)�K"�G��Yos֪Z�W�Et�u����Yf3�[�� �.���+��4��+���~����K��%=Z J/�D2�R�w�{�z��
��:]j2Z�_��h����l�y�ʋ�7=b�����^\��A�JS�@у����L-�W��6=Bxo�9�
+уs���A��!1���uf��b�
��
���M�#O����X�`
����C$���w�w�_��q�jt.�����!X��G�c�����:�1�g�=�d:�(T n��\
+&<v���::e�PV�ggI��k 
��,ĭZ""��˴�ҝ�l���6�,$V�
��6������ [�{���U�M�=����ᆊwP��y���;Je��)�+����*��Ȥ�{KyϜ
�2�6��2^؅��(������W1�<7������|2{K�uR7Օ��� I+Q��N,���@�V'E^l>��|1����\����Zk�"C1�
戳�(7�8�뭶)}j�����X4�������|]�V"��낋��&�I����}u�kډ`�����Mm��Gn��7����K���
��PH+烁4K�_͵Jx�Ca)�q�]W$���l��&)�~Z
��!�༜�FS����w�8�5(xJ
�2��ׂ!<v컻X�w�yݏ�*	�`���)�n�
q:������c!�Y�Vl��|�ɯ�4�)N�a~)k�5�p��M�"Vb�	��kh��*�ϥ�F���b��oS��'�iN��ޢޝ0%L@�T�Mu[<����T%x7��M��g��=չHZ��C10'G��ϗI7,����V�TB�� [...]
+_լ�~b�Fm�^5%Ħrp���c��@i"�~�Z�G����\1ѕVD�p���4�!��khy���|�uJ;��I>
EOv�
�!�44Q8��
�L�~C��P��QB��N|��Zzӫm�T�
�g�P��Z����lȩ./U1��m�}���*�����
,1�C���L��>���03 �w��
��m)c�?�0�#��p4�{P>+W�a��n���i�b{��q�M�_ߛaَ�]�ErBO��b�f!��G
+G����nwO�l�� �I7e��Z��.}۾�:�c�����+�W-�f���^6�O(E��g�A��V��F�ڗhG��%�����-�hx�>��h�
/3��!Fԅ�D^\,��:
�*��q�+=�L`1�U{'h�	ߺ����fT���E��]#��%�Y��Z+�A��<+��k��Msdi�ڗ��oX�3a���d}7�:� ��]0���O3�"x���
#��x�(��m��
����3�E/<���L
[�6>���Y4o0��-��ְa�����oX
��H��N%���?g�ԏMN�P�ڲ�`����
+�v��	v�2���Mm�'q%�d��Fvk[?|��8X�*�����C�^��弳�U�nt��'�q��g�U&Y��'�=�B��cd�z�&*���P���J��n�<#�G�2��0
��*�-�U�2�ե1���Y��MTo
���,V��g�=�)����ZҐU�Z�i���lS��6�7y8

:zy~�9_�{ ^V���nhn9�T�l��K+�]�z�6^�̭����m�3��
�i}[�'����w�ז�ҷU��Ok���|�s����X�2&�T������%71z��f��y��늦���w7��KЛ���O[�Xu�2GAT�൅���rb<0d�ю�3���.���Z�w6
��4
[؎n,��7f4x��s����=�3�L��fƱWT=�p�"�+a�_�~m���v[��O�R�Eض
��'���R+�3��W��u���f-
+��QЏG�>�ƨ�
+�p|*�5]2�&Sؙb�2a-IŻ�;V
̿��.4Im�e3�a�ug�
s->��������J�j�|�� �&�´�	X:f"#�'EG�]�z��B�նs
V��`Em���FL
nkJ�����L�Bք��Y��5m���g6,�(��kr����� ���N�s�&{jG��*5

qR���&E�x\[�R��"��AS�^|
,�j�4�6���%
]������r
RMW0փ�1Ѻ�ml���賟��\\�
�Ƀ����ե�Q��h����ew*�K
�f�4�`:�e�8��؟�
�
J�]�l
��lb�ͪ�_4��6�@��)T�ycn.f�?��w[�[�X5���-
d��{�j9�)p���+�)�I�8
'60^�?e��Y�
D��sҤ��N�>�dž
+xL�
��.OR
��PǦ�:;�V�a%]���
��Y��0���q+�݆w��6�������bᬔ�l1G��0_鳤\v_�˹Hu��Ī��R�����B�A�&,�b���
"��D�[�Y�ᵱv#�ɫSL��\�U��'�1�g=�i��-%j׶
�?5�پI��~
���ݬ�~7��YH��)U҅�\����&3in�Ha)�vNNm��Ϋ@i��m�25OI�c|TP��������R�v����^K�RQ�kWk幆�m�����Z��eϗ{�F��V���~�V��V�,���:����{�=�G[i�%-Ј'�
 ���k5֟��
d؃:��i��旨�v��n�!
��fϘ�y�ڶgX."o�A��[�X�lb��k�g����8�X�q��E����뢾�jW���~
��pk �,��uq&(T�D3�C]�-i�N��
��I4�Z��Tۥ���.���罇���_Ѻ
K�Z�E��o{Z̻T�R
�kR�s.:����[�hTz�J}�ՙ	,���<;�6�h��� [...]
���_�*�?�������5�V�hzl�p�ދ/]Y�w`���|�!��a�yc�)�j�[��5�dFϊ�
�x|���B�H���d����������I=G�s��
��X�nm��>C�
+xI�z�p��2�SIQ	�+
���S�'p�c������j�-��>-�H��L	>�+"cZ$��h
��ڄ]C�/R��w
Ҧ̺
��>�^�ҟ��������@
+��/
��m�4�g�����*/�=�XYy�eSp�� )��CG�v�k2 QˋE^�����N�����Ο���[��TLW�$De�gsѾߜ
��� ^����bQ2
����5
H����r����f���g�	Qə��(L튲���T,��X���$�a�fISӊ~�
�Ÿ�"�s?z��Y���#�9^��('���C��!�
/��lV��hwU"Y>i v<a�J}��)��;�H^�O��n��W��
�z����5�f��u�0g#j~��^���� #�o��[��y ��1�?���?w>������*5�.hϺq��ʴo"q8��@��F~�CLS�qS��mؑ�9����)vDmJ �[v�Qk�'UOY�cv����A�A3���ze�D�l�c��?o�e�Q�Pf��
��c��
��3
V��Ǫ�|��t�<��c�p�r
�*��H�
��
�F�~+�Q�z���C�Ѿ�]���ktc?�
e���JW@���v���PJ٨��S�ƕ�
�v�ɮS���5�O!p��ĝ�
��K9�v�s,'�����x�
`
+wRӭ�G��P���L�h+���Q��Z�X����-�
+��O���$��?�[��
]�&�	��$?�7j��
���e��@�To�䁀��V�	+��j���hv'���U���em���zTFas��|��d�*��Vh����9 �a&J��Vp�f�F��"',��ټ]���ּrһ[b8Ue�C�|i�d�{5Yy�p{���	ر>�e�/��#���!��Mj�϶�v?x�F
�˅k^�r��p��U`�|e8���d�U��m�/��Z�7w��Y2�!Y�Q{Yb<�����3E����9亗'C�5��+�+����u��\��}�/���_�+�Vm.�Q ��~;s��qƊ��&^��޲c���{3�	���̃¢���T�:�?�׌���:�N�ty������śL�vVD�T����������*l�N��"ޫ���������
}>
�?���C����j0�q䈝wC��
+*����ڷ��-.�5��
�?'U��xB���K�,���@;f\�4�z�����bHc4���0�8	��I�����e*��
��
+,!ccM
y�
��r�
��M���1�/��U��0o3���Wj�3���ZUЗ8��Ӭ'�E�&<��U��W#4 ϛᔎ
+���87�H�|rs+�]Y��m�,�8V�d"��s�T��1+*
+���B��2�}O�
+b/�
⮥׆�D�(
i�([^oTl�og�U/*�>��&kqZ_�Aa�D+�NB�U �Lr�l��4i������YT:��E<�#?���Y���q���_y�gv����VG�{q��D<��
��w�L��e�
�G�-p�*nG�#μ�|����A�q֡=>�y��?��ܬ�;7a`����F�/y��V.��߆(D.���rtJ���y��M"�SMn9ܶ�I�����$�
�@bIu�d�,*ة��҅��^TKa\�\��bcIm?FL�
��{Tنc�]?�η���V��������ډ�9p��%
_�%�skI4��9���R��#Iy�B�����n��E���ՋC�
++3e9����$HdŜ�߳֫%�Vl��bo��^N����0w���<_q�z�$m~�Qe�
lҳ�x��
��mֲ�o����Y&���4���mF������5�<E�3���͒(�cV:�O37e�H�VnSZ=Nޏw)Ҳ���1Ȉ/R')&#D:�f�ZLpw)d{5y8
�)$�l�Ӡj�7���$.ЃJ]�4J�
s9����|�K(��'b_a��$��*�{�"g�*/���샇X2�>_Ջ-}���[�k,:��pe]
��y��ZփnP�a��Q�%�䠑t�ܑ��J
�������u�2@����W��9
�`q3�=�#�X5*�2ϭ
+�R�����
@�cXc��ؒm�D�/��8�(���(9
:$w���2�kѽ�;���\3]�T���[���y).���H����E��@�fg��&��Wx�qr��~ �%'�Õ_�8�������NC!�����@�gUV<g�(���XD�18����])\l/,�j�7�z������x�
S�U���ՙ�h_J���妧ޅ���m��|kU5{*A�ͣ�
������mE��T�tN�S3.<O��F�Rv&la��?�P�{�7 �}���
��y>C�QMD�)�����q���A'�A��]�ʝ�ZȞ_�
�33%\
��,]���P�7�_O�R�*N+?�M�-Yy/e_�N��uE�Ҩ���F_����9HQile��WQ)�7�|�4�A����6
�t�U�L��I�:
+�G�iP;��4��,߿w��EN���(�����
+����*+)L�
��$L&J�e=y�����I������k��p�%��
�;�ݑ��)��N��=���
+����ҜX���z�N�s����dzIi��^��[�ޖ�
��g�.�H�U���g`l֡�8^��Z/�
HWy��6~��^� ���,KU��PP�?~�\�$9bFM���S�hA�{��<�[�$���JXS�ѽ���{�Ě���?l���}v
�7�0�m�6���ʺ7�w��=�T�]�38�/��QV�!-���+��jc#8ˁ�p˂66��;����-���`,�<#�]��Ѓ�x��ؤ�Ӈ������J�Y�� �ԟ��7���g�����ہ��r��|�J]|�a�I>�*���I���LJR~�!qEZ��wE�~4�!��^`\}tG��|9�;�߁�������6�(�k�
t���7=�����ʜE��?k�
+���ց|G���jdx[u~>0e�1�
+��^��ܛ#k�[�>�����θ�А�F��Ԉ��IB,7O#���E���TuE~���
l��{�r�G|��hm���O�C_M��
�R�tq�L��� �͒�*ӽ�è���_��/$���'9�
��{C����K��
?Y�s��ն�_����lC)nԢ���b�GӇ��I��[2"��P�kZ3�3��(�^Z#���]{��PvBʗ[��0����L�/�a��
ˉC\��o��Y���O��@�L�]�Xb΍zV���g��%[^��ģ���@>��4� �~��)�r��C�07ьiO`��b
b���;�W�j�_�څO��fy��$�"�e�,�'��r�}Pa�PT6A߸�C��>/��\��?��?{������c*�C�?��f�cu��=�Lf[Y%��
>��E��W��Jp���������҃q.���`��8�s��Wp��$�k��CYe&�Q����p�۫�IM3C���n�H4J�c�}�gʙA���i��s�@c�R&B����{��
~c@�X�
����ÿ(�Cr�]�j���
FX��쨽����h��ָ�֪B�r=#f�~	��z��@����R�ϐ�ՎG�$s��M��Rqxe��o{�"F$���
��p�1��p�kb/W�?�k�]�

�Q�<��{ݿ�۠�q�{��ƨ�́�E�R�}|���Y>���
+�׫, ��`�\4�8��
Y��-Z�����Q��
1����
$���@�V�? 
+��X
�
iާ�{�pz9�9-�X�vK��V����m��o�~����~d����?l��_i�'H+g�p�e��:��.����|��&�z(�үeWz��T\M���f
����2w�ի^wu�7+2��lg0��c��H�l���W�nW$/�/�ؚ���H��-��-��U�2��;�ê9<�
+Ճ��h���Wep��{���m,$ʴA��4�J�v5�XSZS�t+�
섆

��C��D�,<Ш��5Y۬?=3Q��?����{�[y
?��u<O��z�ps���?�z�i�K���aMWxj��

U�9v��4
+��M��VC:w�T�WN��l��l:]wе�V�
�:Fu�[XP	)w���AD�#M�� {?�������t��fl=e�E���<�8��&�j��j�?�P����(����
~
���& *m�,>ؚy>����ST���N0�{l���o��X�
T�Z^c�#�
+�3އ���s��ǯ�-����/-�s�M��gQG��?>aI��PϝCly��0%�C?�E��TZW�/+�������J&��BwV��?��-r��/�!�(iV
��p����Ħ��뀂�`�0"��������N�
��	�,����
+�O�>&���8z���G,��� �w�)Κ���k["��23ç�5iI��������{oM4�+�]����Y�5����$]+ �%���_�x�oxC����a������x��A�
���i9:{�?��kqeE:���C��Y�
n��}Yn>�aF=��f����ܒ���cv�&<8�g
�`D�7��ww��#և+# �En��M�	�F]����
+T�`
hEy�Oa�zǨX�:�����8���;�e�D��Hf!�v�E1�W9���ˣ����͙y�i�' ��;��
��.,+hlz��tP�w��\�578�i��Q�4ӊ[���\�z�Z�I]�2��f!'Oʲ�+`8J*�!mF�װJ�k;��*7�B�5~�z��sC�
���~��R��W���󗚋��e��D�V†��.x+�=H�v_�i� ���
��v���-!(nC�%���<G�kpژr�/�R9#����He�����a�p�A��ݤ�����`���y�=���fD���Vp����)p�ޜ��_ؓ��k�'�~/��o��g�}r
9
�"�y�W{�
+�ƶR!�g�Z�Ey�+̲�����i1vo���9�
9�r��n'���G�cn�}կͨ&�_��]�z��fΩ'���1>��v��i/�
0�:������D��U	�ֵ���yd�~�iz����Eܨөue��R��M�ː����`���
+�Y��UyJ<�{��$q�r�3��8n&�~
kv�
x�LR�b6�����5��7)���af��+��j�8�LEk��+�c�#���q��]��>1<S, So<�������Du����X�y	΂=7���YRs at 0|aQ�^���q��[�+I�O�B�e�ld�bff33��_���g�~?{��
*%DFee���	
��պ��Q&�K�¢�`?�"oU���l�#�dh5vۧB'��Y�\v&��Y��q1\t�۴��c7a��lO����-a3SϤf8���U��{��z�S n�.ZA׷����ﲒ4BK�$���@l(�!/���5�Z���NN��NJ�P����F1�r��:���j8�@?G�J�_YdG]/�/�Tt[
����:�הVO)�-b��G��L&L�;Z+������ҹ4
��e��GT����
��3��PW�e�#{��4Z?#T
s�v�Z?x�ޠ��꘧YI�
�
�|��
��龑3%�4}��Q�2�M;��9���I����*ł����s� [...]
8BaG_�"���U��B����q�+�,�5��՟�7Ś�)�/j%�ÐP������x
n
+�]�i]o�����n��?�]Q9,tk��EƦ�@#�ϦgE�U�yP���Y����	5ܪ
B,8w}�¼�r��ao�����
�M�s�d�f�L�jE?��x�"����)[�k>�_OU���
D �C�
r�_���ߘنCRzo�k:�y���SޏmΌ�T�I�}NI5Zb�
Nٻ�G�̱߬��W��d�ƏXq�nO��'��\�
_iƹ��r���FJ��0��t�S�ˉ�=���\���jm_�<+�-j�6��
v�B�؋7��RF6Ֆqc<=\O�D~��5���A�;k��hfU�@u
�b�M"�������°6|��I��ޑj �PK2q{O��q1VY<�iU��Q�Cc�|+�be�w�X
6��g0�&ɰ<��������J��VO�m���̲�M�ﶡt؋\���lȦ���ba8E���Q��h_��ѷ�x�ML��+kqA�i��{F,	k��1�a61	���@%�P�
<+�hk/(ර���X�G��Z9*3I��9�Z
CM����bo�0ܭ���N6�p���5�-�A�}��r�w��嚬�=�I����9��Ճ0*b
+2����B��
�c*��*��ޔg"�t̽��Z4<���;r͘e��c�8Ru�70��9��:Q�<�
+W�f�;�
��'��n�n�=������w���F��K�	�O{�X[�l�ʝ��l�Q�T>� n}h��D��r��
+m���쉗
+
u}8�$a��.Jt�d�{t\�x%4g�F��!;�ȖFL>�L�<ʱY��Tʶg���M�þ1WG��/K_+@��M�����c�@�{4G+�V��'&`�rWD��0�t2�h����z9���YM�9	�f=�
����W���_���_�
䲬�����8^�o���/J�����9��qO��
� w�i �b���j~�;����Il.��5B�׀D^m������̐���T*ei<��|,Ж����j
^
���}������ڂ��jNV�5H#��Л�BKy#�o^k�A���.�d�VwxU�!�:�"��� o�l4�P��YCp<�h�MZ0e?��ǔt�ߘ�2�.\��{q��Ӛ1��,>��=�5�H�(=���l�u��
�K�,a��ϭjk�T0�|7��e�W]k��
e
`�J���#Z
@���_��L
�U�D�6��z,�%#��?UE���r���ґ�_w��a ��ć
���
4s��J���K!����fK!w{'�ѓ�
+��_ ��QZLmW��0�[]�u拉�n����q�w�Ɓ��>�~k1p�Y)��M�~���z�)#}�^Fax�o2[}�n��5d��"*��IoVn���88�mA���/�r�.��{vK��} g�\v
/�
�Ik�e����E�k;��UǬ<��̳��� ���
+Ў)�^]�KRԓ��9|�/z�=y��O�#��>h�(/?��ma
��N��v���j�B;�����d��(�RY�v��)��.���Z���}Z�2

�Y�
H��
�����^s�~����2���G���E7��]�KWЖᇄ���J�_'�}z�迅�b���T:
�
�v:Qނr{�F`[������v���Ɉ{/ѺBw�
�ˣa�����7���M���m����O�
��Sn����!;{Y�E�
�`P|�v,�$kz+I�j��1f�R�6/��vO��f���%£�[<ؖ��]��Շ���U��Oi_]2��w�_ h����ƭk�YP�q��2jcQ�R�D��#�V_�l��b��J@£����MO��k��ǃo���k_biM-��s��d���^ͣX.t��e�2]��)��7�|�m�?�{N:D�L���=�
E
d�w�y�hr�"�1��I������;_���cb]��
��C�7��g6��`q���.٣t�r�w]��fK�)]�d0��ި����;��&�������8�^��¿�r��bA6k
�;v�-�]��h��
P/ͻr����
��5XZ�?ݯ��fkO5�e�;��
+�uT}����4"�#��&��YsY
���I�v���9O�ϏWͻ7�P#E�
�}��o��蟇hɨB��4�
�j�F���\l��H9�x��.d�4�#K�����HL���Zx��rV�:��Q�󜴝�኶�����t�_
�bƭ���s���h=�3��.J�Y_�TkNA$J���Gv ���]�1����:��p�D�Ul��\��4�s_�&/1�y�`G#j{2��ݽS���4)��E�����$qͪBѝ�8+6� 
Lw�
ii��i�#�#Ѿ�I�VmΏT?�,li׭�+}V�J��j:�̒=�Gnm7�z_��b�s��N���:���	g��(չ�����?@t��
�
oc�������	���D5�q�}$�n�!�\�Zc�ޥ
Z
�Єk�)/,&��*'cWK�F��.'YQ�zY�({�{�&Rn����
+l�A��% (����B)�!]YlP-�"��kÁ�����
���M�+�;�iV�VZV7�J���\p
�#m��:X�!y~	�d��m��Mi�C��|�0�t�����|@e�����~�Ƹ�ܙ˱�
+3�s��q6��`�}�;	D���M��jϴz��sniJg`��	��֌ ��%��X�:�V���Ҥ�.
;vw��W�&2��m"'Q��I���*V}|����1�B�<���ר������j�ց���x��E��[[��z�vy��Ya�[R�t���9�Z]}��vZ����כ��u�F|X�&�<ZzH�^�~I�i�^�gMJ5�����B��]`�Gt�Z~ST��V�o������U
˲郅q�H��6�I?F�>�,#r�� ����󶝊�Fi�(0$��ޤ/UǛ~r����/n��99Q��=Q���4u
/�Q�������cd�y7b�����s����|"��
E-e����
+n+:[ӓ��{��IP^��6f�bT��Gen�C�U���̴T�}~e��xw���t�J9�,P_�����r��G
�iowۍ�������e��S�|�"��q$)�}�^�r���y���$�5v��*���.=25g}[�ET�r(m�J��rI���x�D��@��ZfV�4�$��N�����rbKoa��s`�
���L{m��⦇j�uG=*�&����Ĺ�W(�cާN�ରt
+��A��D-̷ʥ��F>�w���z��"����jmZ��
���
r,=Gv�6�Z�c�/�=qar�x����+b�l��_�o�r��bPئzd���)�e^'���� vR����2ग़q���-�_u���lj���
<�D��b}�Mc}�)��<�t{��s�y���̀dC��ax��]L������A���X�L Bzwq@
�y�(�_M���\|}�l�R0FZ���a��J���-�s��+�iw�h�\��+�������w?������3
���{�E���I�A�H�+�a��X$.5v��
	~��}��ۇq8���p���1j_`8�;Ȧ/PͶQ.X|&X�͂��;��i{�<�7^2�.�rϏ��ʧ9j,O�6�q�W�BXCAi�P.f)̵O5�g]͏�}�lK;?Ӻ���`�#�E��U���Φ��2��V�F�<��,�؏-
%�4��l�U���}����/�ws8ҿ�9&���
����w
){��t��zM��˯�g�t� [...]
+�z������/�>� Z0~vô�Yg4@�q���xas~Q<�`[�E�;�2ث
���-���3'�H����eq<%����=�`l��ޫ��ty
�*,�>y�������ԕ�f#^d��#�����KL��yv����
9q��X6�
+�Y��f9-��G�oG3�;��ܨkPk	���n]fO\�b"̿���>����oe�|�6����K��v~_�8��&�k,y�O���@�t%Zb��?G�㹨,%y�=�͍��K�}+�Z��1����7�X0���?��6�����Tĸ$aF�{l�zDA�{�k����v�[���
N���>��y�g�O[���Nj� ދW�s����hU�'�{
+��_G��s�W�`�u��W?.[
�ݔP0-|�c.��ٮ8~��x� g�T���G�BY
6�f�S�U�Nc�e���0��>�w�
���wσ$��U
a舴%�:T#�������":!�4�Ҵw Y3�0�r9NNk/�11�H�r6��%+"�?�9�
���8��������w��|�E�͞K
ǡRm>>^�QA����
ԏY�Rq�X�+�/w�v�/[ո�9�!�R؂w�VM�_�aI
+`6�W��}��w}yĨ{e�cn43�<����fm*�Ues��¶dS�
��u͖�D��-Y����"Q�C,�4
H��M,˲vX�?=��gv�^�I�\{�0��&�0r��Iʤ>��#�5��v�M���R#�&��z�
b'�Ѱ/�Z�v}i��˄���H��l�5!�12
�%%b��6�jl��9�2��L�+�O�r��`�}�i�
+�m�R�z���pt�­^�s��-y�ǀ�
�	�0,+t��!�k3tJ��Sw��#��+L��;QP�Ú�F%8R-WL�)4ϟ�O�C���y-����MZ�_}�&g��l�c�h^����dt�~n3�+�X+
{fUR<��*�];�`c�:ҲP
ç����)և2�\1�
�;����g���-�.'�ʘ�/�B
?��Xj��p'!��g��*U�{k���lN1c��1

+��j�K�����MQ5O�W�rEXo�M�,E\JF�T6��ڵ���I��L|�S@ĸOL�)
��a�8I:�ߖ��wE�Q�g���j�{���=P.1f덼R�'�j����qy��f�U=;��+���
�y4�KO{��4j.\�@���7j$SZv��i>��K^E��M�_�r��F�����>g9uX-u�ب��2��}P7�Y�T�%��m����'K��O�ݟ�ϲ[
�J
?J�
Y�j#ʾݡ���j!�tU�
�!�o�w2=��s�6�׽ҁ]�
m���ӥ�nO���n}Ds�^W�m�L�ʂ�JW%X��e���
v��� Y���tF��Ⱥ�帤@�~����x�>���TO���*
��L�i�@�[����\>q���,\��m
Yj/m�[e:U�Ηm
��ٿ�_�������Y	�gwД�^S����C�5��]{��mֽ>�����tid���Uc�Yx/
���J$��60^�~��<��j�R���(��6[�DoN7G@�"��y޿��Z�0�����a�o��*B�A��%>�.# 
:�Uz��
+��t����*�~d)޷��Vrk�7!)]A�`�6�㒘��y��K(v�W�e�#�'��_4�F��Zc�2z��k��q�յ
v=��a3����ҡ}��6�3faZ��{�N��z=h�l��n������H�mu6���NhM�VYU��?N�Q9Ӝn����m��+�L�x��h���_Ik5S����ʚ��
�ZC�m��
��5Y�5I�
 

}&v�u--Uo�r�2M��>�_u��U'A��0�d`�T;�x��ߕ�늯S��� ?��[�CC�}�����
+��ek���ûC,

_�HdSո=5���p��mu5j�U��I�*�o�eܺ��t�����7+$JA�h�¥:��be�
+�љҡI��VST
iO���*d�;J�{������>
���@<�W����4/,�쾧�<Kv{��a�H��1���z
ٍ�^2&|5��K��
mZ[�@���K:���J���ZcX�Hr
2?9����yf0$�c�0���
�b1K�(w�2>��v����)�8n^�W��#��0�a��Q���٪�d	JX_
�v�5��DŽ�ܥ`���� =�מ�Z`:�c�x
�8R������Qs_ѕ��5g����˽M
j�v��L���*��*������є�

/5[R6���	�?��Y�ϿJ�ݺ�A��XfM�wd/�u�Hz�<W(�l��
��ש
F�`pS�>��Ñj����
�O���
�M�ٞ$��ȗ
��o:Zm
�G��Gu�~�_�U(���`�M���L5P��7���!�_��Ϫ
������
�\�f6�:
+����_���`���D����5���an�N��7
��dR:w��`jS�ֽ���
+���'�=j�b�ƁQ^���� �II� J�[�j�df
��ssrut���t�j�b��A���k�����%4T�D��\��[4�_�%�t-�yl�ZIV?Ȫ6��ţ[,��Jn��
���K�2jLd�F-��t:�י>V��&gJN���^!xt��J���*p��(�
��9�������p��˩�j��;,�=�ì$hޤ��{���b�Վ�F��\i��n�h	��ѯ�g�a-Sܩ#��
\H#�p;��_<+�S#��vk�
���"�o�ۓte�B�x�{�Nۥnoi���Q��i�<���u��Z�
^,�aBk>#慚-h߯������z{–/��罋wA��F�
﮴��o�
����
�qR�g.\E
v�U
?�o����`PS'�u|g;
+�Z�_�K��#���3�=����:��jx�Z������V�3�[�:h}�H���N��X)"R�ҀV�屝�j��ךYڨ��Ӥ�
�]������=����%�$������>n��y��s0+�+�/���E�|V(d��s
���،��B��d��Z$OK>
s�0�P�

�+v<�����<y���%��U���5�@�����O����vxOy�5�t�P����J�
��]����+��!_P����_��-wb�g|r�⭽ᷳ�Tp
��k��R�J����++�EjS�/��”?VJ�	�[5�ž�Ѫ�c���W��n�ɰf �1�~���&wC���|�l�c�#/:�iX :�ƈU�W
���6:&-��e at G.����W64̛��N�z��s��_(~yA��
+�
�7��}t�W!v�d�Ш]��ށ�f8~�陜��
� �N���e٣�2E��Sy1�޸�����>�ٽ��ϝ�Z��nk�:�L�h�(�id̓H%�b�I,/n8`K���B����N������Q�cRv�ֺ�nR1���P�.��BN�m at B��>rR���e�{ݓ� l��js��ܠ)��r�-��jd��k��5
��f� �'���##�ܙ�t��ᨍ�R�U�q����_�r���/��'�R�
�~&�L6�&��
6�����y뎪�R���Q�@l0��Ŗ����_����K$��sv�F����=�b��j��Þ��`=��5��l]#t���;
�ݰ��M��X�鶽E�{G¨�2q
+q��h–��ʇf
��D�	ׇ=������H�W2��B3{��-4)�ܭ�fy���B@�_0�t(Ä�����&���x��>v��������v���s�<�4���`W������Ґ�rwҷ�[pfZ��
�؈�C��=����cpq`;�����?��F�l�͗_��K�4���wes�
􅡆�|,�q��f�<�
��&M��ϟ��_d*T�=���V���*���{T}�9�:�qv!�'��m,�.yȜ����a��C� |ʞ����;�JV8S�@a����
y�.��GO�Ahd�a#��I����f���1�<��iG���8��Z���|��󠞙��nW��M����
U*��X:�x-��+Ynt�
~	�%y�Dv6�Fs
(�
+f��)2w����� %�43�-PS�Pyuo������qhe�^uBąMA�
+�>eϋJ�"�k%EY��^�g�F�9a���O��_
�~MѢ�I�Y:�Զ�C{\4�� ������lt�l'���>81
綰:�G�
�i֚l��1:x����`��&ܑV����W�T�T�5
��o&���͟1>���۱:K��*�B��$h;&�*��ir�3���!�m�<�N���"�en�g�_{LG������%��A��7��/���bD��+�
+�����A�5&?[�Q�@Ɲ
=a��ʷ`�}�{����Q
zn������+�
GGz@Ʒ��WSi��w9ދBcrt�}v���sH�˨)|�5����a�X���ET�
B�F /���%4��!�,�W^��#�
?[�.���ն��A�BO�
+�?�pA���Jʘ.*@��ҋ�M+�[1��'������.�c�a\�M�n%��|
��-W՜�I%r��L=Iև�
'R��^~ᠾ'Ok�����؎-i���
.PT���tN�
A,��a�O��_ز"���k��`k p+�f���
nu#x�1]6����rki�ga����vc�Bю\�gz(4����?ݚ�3���jW�ȷ!��h��q��
k��@�J���*���߆	�xK�ez�"_�"8�M<���-�<���e#�1_b�r#�z��:
4�a�c�'O
O��E!��Y�F�#�wU�_��
��w��`1�
Ԣb����&Ӟ�z0
���bG��
i�93�����	��}̑Z����
�(N��4���-vSz���*s�����\/�|�u���g1�}�T�5�8һ}
�/�����o��)�]��'uM5�J�R/�5�N��J

�{G���R�\sn)?� �{Hmj]~��L��~����Uλ�-��P‰�J<�9�8��rg���mR��^Q�] ��
�$���Ɏ��U��})����;vD�/���X�h��K�otl_��T7�Q^2���U�X��zJ�����:p�B���)�3b� ˬ`�/����T[��������
�흳�C�#�^?��w�C�~�e�ٝ.l���D�W��*7�6t���w?`�~{�0� ��;�V=����5���\�Nmy\
�
���\��l������C��Y����9��cc��D��>c���X9��ƣXن�iq�vKaG�D�+���nWw5��V&5�������i�K��`'��>����Ǚ}�UA�7�3n�R��oc��խfh��ۜtA
OE_
W)c1�w��=3���*�a�?�A^�7��H��ML���/Bx�

�P��
JR
��5�t����Ȏ�ݎ��y��	���q�ȿ6��drV��1�[�6����ܒ�f0�|j�)?�����)iI�[J�4��
+Ґ׶�3K��ЮO��@�+�K��'P
�*��+c�z�m��*���,<�~;�gz6<;HN�8w��[�}&��Ap���P{{���
+g��=�s����y��蠒���u�JP^K�%θ�UM��/ѻc�;_Sf������ǂq���[����~"ԢK�n\Z�=3� �2m%V
 mw����� >~�
k
�1���
+w$�0
~k?_i6g��5��/���D�ȫ8_���]�f�Q�m��,�We�D�}�	�h))���9I�Ձ�nl
��

+�j!��-D_���W��ޯ��g��xR��U��4��ʍ��o����W
+��O�3>OS�'��W
a^��/�ЉX�+ݳ�

��(
�H�i�W�3���y6d���f�!��rz�P�GVy�U��Q�\��Q�w��|8c�iv�N����xi�)h��V�y�>5���7��ʭ*q�
+�g���y4&r!����Ot��'I�����.�1M�$~u5��#�^�$�<+-��#M�W��ʒl�4�йRgH:�T�?��5'Y��ZLmΰ��߇<��
�nW�Ȋ���2ԘO��N6�a���KmbL�Z��+i�G��%�/m��OJ{��r��
�6�+���Y
L�u�4;���q��
+ |1�����k��K���+�E�%C�����~]�m��5�;K�7%�����g
�ڸuf���èg;�9��hbR9�K��vW��~��.�a�ǰNW
�d����Z�] ����;,��F���I
+K��?*��V՘0@���Xr�y������=|#d���O��������-��1��9)��k���P�㞌�E�3�>n�"G��W#�2Dá��k���HŒgA]��
sr�ڙ��v�B|�
+�Fo��!� �va!���i�Y��V/ܜ�1ˆ�*���X
?�ƞE
�
1�~:"
`ڶ0t/%�V��rR8J��t=���VKȄ$�Oچ�_�BG�!�A�8;�@J�׻,E~�ϩ��N�
+c'���sxc��`��^e�2�JU幄[:
Iz"�Zj$�~6$�q�$%�ڠ���]6����`�W�7�����h�y
�<2
�)��k���~��U}��X�:j�����5}�s����>�L��Kg�Hh��'PL��GƼ��sb�5AVs��E�����<TU3x5��h�����v�մ�my;��_���B���(�}��5x�ɰP�1���h~�w����%;�I�-�mkuT:�S�(�6F�OM
iܢ��;�`���}a�V+�k�
+�h��Dd����U��F��a��՞?��q�9�T��^�����x=j�24���4�:a0��[�L��-9�W�&�J
���@9�ZFW��,ؑ�;���C/EDJ~6 ?UTY��}a���a���!0k����Gk�EN$%��f//���%Q"�������0I#7�̺?�m�Ʒ��NAϚ�%�a��\(�+x�*j��%y����c}��E
��R�l~�5e�
���,X���cnc}�L���|��
6�VM�^����������y�V��wH`D�
1��1m�FS9ȕ?ѹV2����L�'R��8s�x鬩�(�V�L_M�ߓJ�Dt���~n�p�,���Ʃ̸��Z&

9y��ʺ>���ʽ҄f��2�;5�}z�ô��"vZz�]�qo���g�����k`���'�М���W[�R=�v���
C��.�rW�sa�o�W�9��n�Vo��aU	�4�l��ؠ0�_ϱ��K�k��!9�\B���?}7%
?>��>e0��4��]3O���<� {hW2'������������s.sr)\/�؝Xkx�&1o7�t��������U�?��Ԟ�寕,�E�{3T�}Z�fO4�ڬ��M+�
�_�k �F�
0����N��#���
��Ϳ�Qy��F{䮆���{!��e�j]�z*]�^�튪
=�D��d�|�����=e�n�zio�|�?�G��s��}�3��P������K�
js�y�r��,��$��ZF��N�oՉ�Z^��=ni(�Ne X-���5���m
+_�L�4eQ������}z�Gu|�����ޕ���>�^
c�
�آ[�!mh�0�
5ɽ2w��)�����U���mۣA'�S���w���b線�DX}�\������os��ބ>�H����3�
�~���pcתLN�����C�n����ա���e�7��O����OE�qͮQ�1z!K��&�	g�V�z�{����v�3sxu�x�oJ���r<aq9Д�?2�,��Q=cv�tW�9���p`�YU��_��{���?��P�ao�+|�aq
����GO����^���<}:�*��wyd
+�e�akP�
+�վ",���ܶ_���I8d	�g�SX��C��!�C�搸�G��S��u-�0$L̃J;�I>��+��Ѵl��]H�һ�[Iz0Dldb'�82��t�d�+�&�t�+��
S�;��u�����r�ߟ�d��hjY.n|C���}^h��;/z;7I��=YQ��W�Mn���Y��G�[L���Vk_�-|Im]�+/8T�ϵAݜ�9���նT��'�o����{93��ٜğ%�tu���]h��b��rO«��w
z���"����2D�-y�}���$Ǹ�T.v��a�6��B�ڶ8I��N��y� �gk��I�[k��,_
%-@#�s��
�n�^x���?P�@�^nko�
d���(���j�p�
�J�dƌnr%�>��
�=O揬
d (
?<pxF��	�
+�Gq�ʚ�M��o�`_�~���_ }>*$��l���'h�R<��^�Q��~'S��Փ���7�L���vf�
�؉���)R
�@b��
v:��Β�H�������7�ȭ��}�{��9�
+��̔D�Ѷ!M����ZZ
QXZN����1��J�2a�����'u�w&��}�:¸�)�i
D>0r�o����y��Ҭ$�I�h�/��?+
��
�ֳ��&3TE7oMQ>��*�Va�ѸO��;-f�^q�<8��,��ʭ:
�{��Aa��A@��v���9w�Cr5������?,y��ˁ����h���Ke�[��� 8k%
�o��_�3�L��@�ਔ�<F@�����^qƭ�>8wyeQ��?
'�RH/�gSˤ������%���)�Eb�g���Ƀϋ��Φ����P�TY����0@��T��$/%�
掂ɛLo_���Zb3z��}�QJ�q��
+�>��'�
+���|�;7hV���I
s�A�
v5P�j�Lů=
��'�:
3;��T���R��<�"{8I2)�XJGPK(�{͞�԰5��-�M&�d�ܾ��>оe��zC>dn�A�#C��5��6
���t at h���p��"�c`��,�
���G�u��N��W.e���+V�
l�8Ȉ�4��
�� ��ؾ��]A�V�8;�
ۊ���
+f��9�4�snI�&.q��XY#}���ڧ�ylїq��kV_g
j�{-G��,U�#�E�
��T��Q�eJ�5�l�L�Q�<
+��Y��0�T�?Ӵ&x��Y6����G�������U���Mhצ��e�~?�ć}
a�A5m{���k�3���Xn��w���Q��u��u��PE���
L3B�IW��Z�H�{Ar*��̔��k�o��U:�Y���R{T��[E�M��5D��'X
��
+;��^��C�nf�Ǽ\����Jkd��1X�Q�.�ͤ����a�,Z�d�v�ͅŦ㈌��t8yJ\���DS����6�E�>�SƄ6M�Ď�X�y�F�/�9�o}F ?X�)
ԹX

��X��qK�"'e�'�໓�&:�۟�/\9
읕�W��Z�:��]5�>LJC��eG|�!�+$���_�
��M�'��պ|��[Ly����܊���7�I
A�
�k1~�^���7���w��y�[��Q���ںP��� �e�������]}�N�F'
��ߘ��*<ic�'C7���;����Rc�k
"#.��j̬8
�
	�<d�]E�f&Hyea��{^��{��͒��j]�q���ͧ���Mx��_`)�mq�OYR�@"��#f��
+�.��_ X�^⇭��Z�i���7Š�;}�R��l+A�����~�c��K8�N��$�p�u�E�
�|܎�2X�|�B\����hn	���o�rn�
).�ҕ����_N�x�6���v/��e���m�o�Gr��DM�*(��f%����E��C����4�֢ʄ�V̔�e��J�k����
d��&��R���w�-Z��jo'ݫ�Z{�Ɋ?$��X��ɻV��S�j�N�����N�
+�Uª����x�����ڑ
 Dږ���wԊ
��a�f�
: �O7�}5
�S�O!ZO�.(␞^Vľ�y��p�>*]~ɰß����V���L�Oٗ̆9�5���yR+3�?z����F40A3/
��<,�{hW�����-�8�mRa�Ҭ�I�˴_
�E_
+����TFM��Ӧ�.�$���'����;�П�8Ʉ2�PP�ZY�\o��S���r��Yﵦ<l
_�{L�1�`�s�M�9�ɾ�߽{f�7�t?}�P�J��*�J�����k���r����Y��d����^-����X,�ī
0�,�DE��-�p9ͷ�ז۟ڗ�M��I�i��SB�

�Z������G"t`�����~�����ࡾO�5�l>�j�s�)��I���
�O&;�Q'�ιi���Le�\w!���Cys���wE�0_Lu�^��bM"�x��24���
+�#
�i�Z�nܬ�����GN�@�<}&3�UԺ5�Rɒ��r��0�[���T�iHK�?ϲ����D��1��NI.�L�������G;���@
6���༲U����k&("
�ʌj���4���5�������CTV�H���t"{QS8�z�>{@�]sn��⫤Lq�`�GE��=�^�ӯY��u�hEv���+&0�"	�>�%��e����� 7�׫o/���Ƿ `UlmX�	��e��Y�1�.�	!�7l6��aݡ�DN��߅�g�Ɖ6�Q����k��/mؠE)������?=Xu����Գ^R��u�'�b�FQ�I"';
+��8�J�]@���$��ɛ�ߖ
\�x��8��7�%��:�J�z�#r�ۺӻ�ࣻ8&R�
�g������n��-?����`�M����p��#N�fԌ"�,��F��.�
(���
�7O��U�T��^'�a��2��8�`����Z�
*��P����K���
5�f>9m
+E��
Z
<��
-�B*�5:E�}��n��%��:N_J_GC�׊�b�\�����U0WI]�����h�j~�W�v���7���5��i�A{���˒�j�FdE��iJNq��Oi�Ԣ��$f�Y�ַ�^��_9X����
P�
���;b;��5�W����[n��܎J�i��f��!�p�
g�?�����>�OhMuʗf�q��r�h��$��i�Mݲ�W[�;�T0��#�c��k�5��He�cq?>.�%61�vO��5��
+j;\:�J_�6��D�v�z��
m��9ذ*�G��0`愿.�xɉ@��N޶1�$+[-j��=�|�%�R�
Y5-����)d�M
�V��SZ:,zLZ�n򱴮��/�	��>d���R�?N<��]-�~S����r�� (��%b(��P���A�|����D}(;�c��/�Z�y�&�c���[?����=>]�+v�F�WnR�z��M�hpDs�9*�L����>�a�
^˒~��<8�����z�ެ9���RČ*� uv@� ?%٣ٷ��QĆW��[�E����fԸ�����޺�W¨s��LS�V������V1
u$���u��t���W����V���_���d׺լ߿�9�uF�5���3�͎�
�}@�^�D>�>�~������Ȱ���� B�昈�j�
+g�ļj��L��R
�g�X�d��oAMjPάG�
,�濲k�]�.�����47�Dy
��
����}`��1�nN��
FK��@����I�
��Va9Tx��#��}�a�/��e
h϶l�m#S��^*���匒X��0�Fn�	'�

� k9�w.�v�ma�ɢ ;O���G�"��'uW���هx
�?hR�4&�P���*�I��+͉������V?�
Qk;,�
J5E汲�P>F�oS�
M�!
?�f�]ä*�v�������'괮.�/q��1ۜ/�_/�����W7_�c���sJ9�U��J���V��Y��P�2&'
K��~��54������߿
�-Q�;Ni�:Q�[�5�V�@w�_U֨��6k���a�V��*_���o��I�J�f>r5)��V���}"�xp�JZL,
��-d7L��89�]�� ��+������
����n���6�Π���J�<�f��A�L��xW2cQ�}C������ꕗ
�)\?
E
ǝT���x�ᅴ
��7��ޖ{}xi�Z��������/SV�N��.9�!o�Gw[O
��k�s�G��iY�6�3OcL�+�?��
��'7����6�	��*-�s~��Uu������\��s,2{ƕ'��O+��߆������H���P��o����ujSNr����m�
u4�0�gY�6�-�W���_S����p�9���sW�
W��ד�5A��t��A$���]0bRH�
�<$���pg<�����X%��+�>��؎T�ɾK׷|�<i��˦3J��̜
��!�w�H;�ss�a���ђC�
��M��J�c�����`ba��xi�������q������uM���)�z
�
+������>��yy
�j_�٭���L=����d>�c���l��،=�z���O)�9t���^1��d��K��n�� g���\��
�j6Ҡ��L���Z�
�ˎy�����X�a6��)���
U���D��'a?}-���l\Ow�^@��ռϮ�mXh�K�'�e�OV!�,�D�3_T�ZcD�Л����s�ˈr���c���y�J�7b)����\����h�^N�J��^�B�����lM�k
	:�Z� 2�W ���q�d���(��
��
+
���e�l�Ջ�o���;d���G�S(������
>ڀ5�r�~Kf�Z���b���>Ї����S|�H��sB�n���X7���9�&��6��
�`�mH�
+�����]Tj�/r@��
T�ԇ��r�
�o}W��$Iz���=Ĕ����X�M��
X02�eEm־���Aq�(!����G���.Vz!����=|�
�]�:n
�-B
+�ܿ݊fu�=Ź�\k��k����Cz�54����n
vB��jc�l��i&������
�3���@������ׇ
^[/�qCt�#�5��;���gsy��,�����v�R�o1�B[�\�����`�Z� �Kk�{0QL��0c٧�:p5�sԈE�Y�;MPB�!�l
+�a�TI>�G�[�$n�	2+�>2�5_y�
y��M&�#��$��S���K�i��.��:��A�}1\I
����V)ǀ+ϲ9-������
P�
+�򆜶o���*���6�م�U5hM<���o�Զ���G�:%)��T�Z���F@�84�U������U�n&��W$��y���z�r}i~s���=$-0>�
t`�i�Zo|l��ZUW
���x8�5X�U�v�;GS��0	�,�_�V3�����C�n�8#M�[��s�J�˵���.�����
ʱ�ԍ�3H�O!o߱ۖ��>S�@�-ӽ9�(�@�qQ�v
�-:��3 ��Nf΋�(�'�uF��_锔�-^�?��M�M���X}����f�ߺX�HIyWBj�3�t�_X4Z�X��E�����''M+OwxX�u��
+!��W�i���z�"wb���j
��G�ށ�W\�n뤱-`X��(1��ܑ)���
Ҙ���4˃{���9�B�v�ѭ�;ճp1���F��D^nLό��j
+
@��mRN,�$�A��?S���>���f�O�ם�{���ɍ�^������B��
���`�����3Gp5�n�
+L�"�&���sî�
���<~�O���{���8��]e��QY'�!Sv�%�_�O��)w:-S��*�/|^J�_B�ggvGpa�`,�B]��
��G���$
+�sM8ϘJ�ɺʝ�k�[�
�k�2��P���!����c�p��=1~c��נ�10��An�@͘v�
+����V��Js>���
+�L��?Et�
��F�
mɄv�6�xܼ��7@�#�
��n���Y�e���gQqM-��U�I�[X){12��u2��e����9:����p"EOM��7lS�1R������;�
���
+b
{��5=���|��|c�5N�}ߛ�)�x��8��
�g�gƊ�[E�6ۮ�1~����
'���7�o��G ���
��wg���rS�Ti��U�b�����9�G�&{~j����\��uy�J��3H�����\�+�o�G�؉QB��0mh�B(�t��jX��V�M�`�Ux��%*�ۧ͗A!�w�
 U �&���j[H�f��Uφ��߳;]؈[|���ѭKFgV`+���<Ͻ�
��7��6ʲ7P��g���}�\��O�MI2
�L)�ہ�w�LJ;"��M�^��ɮ�D�t�ZC�7
U�fPa��;��vy��e�sm��4�S���5�R�*3�
�c�r�/�m�3�k��d{�"��#{ ���O�k�z�F�zLBL'�W)����)���Z�P��2#s�4�ؤa�K������Z:�P�q8�@%4��۵:
2��[z�㍑%풷u�a!Ʃ��m��L� �\ ��kbU�-��9w`�bU��ԧ2
��i����(q����EY�t��ǫ�����j��x��
+ U�����P�t�tf%6g�0~���mp��Ur�@��,��1�~ޫ�u�w�����X�>�<��]��)�Jb�z;�^�7��[����"oA���k5�_V��k
�=
J �{Y�+���vp��2&� �����vu������a!QE<]
�;�@R�OM	:
��F+��7!�b�y.�c��V����6�R�
7��ԗ@����T9�'���~�5�'NB΍��w�5�~2���JU���2>�6I$Y[]�
G��2hMj�&���]
5|�
�]��LWJ�V�:��L�2���L��S҃3dqop
��Y�����*���oS��f
�#�qcN�G�؀�-
v�X-[�c��"=;dL.
o��b�P�[[��`��n
��������
��i�{�
�����>�ѬDu.���{�Ê����D�6d�";a%�c��AiA�_V�o��ޕ�1��ن�[/e�r���b���R�#��
+�%���3�,Ng{e_�_�r�����5�|j:�x�fӜ
��nR�ί%g�W����j���ˀ_`0�1�,��[��6p����D�͜�q��� /��{��;2�=w��kH���)�b��L,e���@t
��"!��YZ�+�O__O�f�N�W�
0�b�o>W|����֠�br�u��e�5�H�g0,�V��JZr�� 򓺊]�j1X�+�
Y� �ZiL���S�D�M6��
�US�h�Y�
U��
Q��6����K�t�CY�����X-�c�G�f���y�ati	�șC�a
RJ���l�H����}*N��ʘ�k�k=�%V���߮����&����S�W�hW	���x
+�������{�[L�����yoٽbg�a
�����a����#�����6�E
�{�`�K��m>~
!���h��ܗ!CnX��H
_8��
1���vy
#��
+})4
&Y��I����1����RE`}�'�Qн�l���� �#���Z#;��d
��_>&�^��b�W��~�!M$���‰Y�o�l/$m��4P^����u�1�jU^��rr�y'&�MJm�*�8��L�8�ŊJ����K��Q��jG�\�YC+L'"�-�
T�������8|E��Bo��u�Q�J�$�}���Et_H�`�('+�K��)-�����`�W�_���M�����Җ[����m�%�aS^�9�>��b�EPEo��:��C���#��߮�L������@
[9�,���4�b)m�D��$�
�)
"���{��υ��k��Q���Z��~@ֆh��7��G��K���뛁���
���}������b��ZW���?��ժ{f]� �E+�'�Վ	��}��)qh�����+YqXp_r����9p��N�W���!E�jS�0��󺋺/�ں��2��c�-��ك���ч�Į?�e�iX��t��_2q,q�?�E�r�g5���y��W�ΗČ� [...]
+�Nn��dpT�4�c���8�QzӾ�l��G$I�����T-�vU�ZI�`
M�ߣ�8�l~M)�'F<T׊:�}
9؞����r��P�݄d�ʚ\9q�o�W���������¯��.�3%� �ԪH��DksW��f�rެSYS\��DI{����L���w.�k��
e�������˺��b�^���2�+�/���O��'P�_?�ei9�ED�M3&�d95Gk�
���V�S*��*��~y���Y���Tvo���c��jFLƘ?ڰ6�]��97�s�څ
����*oų*������N�����l���k|jbK��]7�WY=`�3_9{f���h�o7Y�~
�^w��S,�Б�th|��\oNƔIe���F�ۃC�
+�
v���'�������IG�߆t�v�q[�8v_
|
_#���JTu.��=��V�ݵI���X�:k嗈k5�����
+L�K���*
�W���"��
C�^o!�;9�F��CF|[b���@d��)bl�E�K�/A䎜k6G0�L���Ϛ�<K��nH���;���|�1�6�_C@��S�ո6wF����T�N��3�+����+����3��o��V�8���Ӟ'Y�6��C��t=�[о����+��V����%�M�2
�d+���	
m�HOW��
i�M�OU?L�w���;�;�� ouv��}K�x��W�~�K�ey�iQʹʂ\����@q����(@Z��fJz���Z'���oC��m�Ep�$���J�����6$�T~̀r��t {�rm�sX7q��~�s���j���4�˳�w� E�T��!�5����
G8��t!f\�l�l�Z
@ʆ���+֠��0�^87������v�2����xTzz
��e ��G�!翅�aẛn�sh�q��b��@�__�t�����w����[�et�9!��/���;'�1 at D~<�=�m0�`\���8zM�un����nN��� [...]
��8跮}����rP
C���)��[�� ���ي�x+k���h�U �Wv8�
+:�CN�:Ҥ�zjyw�]/���]
+�e?DX+��������/��
��#f�Toy�����)`��LïNRs0�������&�
+�?dx|Q�'��~�j@�R������h�^ ��h~\(
+��.���ˇ!x)
��';Y��&7�Yj��Z�xX�T�FE�
��Kk�@,�)b7�Xi[�bT��
�=D��M��ټ=��;�m��No�z���Q�cz@��X/Q�����(N�71��}�]vI܍ɣ��)o?>�=����ƌ��S�Ɉ�J֤���z��{�[�ٷ��^�#Qb�]�=io�ϲ��|
�|P�����7ՠ�(j[S�t��GF=l��%@�L��V�2+u��MR/ž���"�x�n�����ꗀ����1�=��?`p�	����PTen4��Ϙ�o��:���bz�A��9ƻQy�O���B�ԑY[
���:�٤[ʈ��ggq
endstream
endobj
312 0 obj
<</Length 65536>>stream
+����2�����$��)��pz<Vؙ6ܺs��g�Q3ߠ�ݩ�8$�T���*~o�j B�u��
�7{i�|%ڼ�������k����tߏ�������ѱ�
�?�1����2�i*E�3ޛ0�m��vݜ\.�>��&?��n�������=,�=0

�m��D���9sT���[�׈�c�J�(�X^�
�ZSa�t_�S����t���8��e�?
*��5�,�U�u]}+�6���:�|<��f��
>i�Vs��m���2��಩��I���b�´��j~�
;���c�}��^��d
+{E
�V�
��ۭ#�;�V���oxq9��?��	���'Zy���[���(�O�e�X�Os���"}K��oP��{b3ΞK�\��a~��A�DQ��4-�3��u�-�!/��B�v7��kս�5
�Emu�ĺH��$c 	����6��hb
[b���0����N����9�~/t��gたM�}S����O
c�U
�
�G���d#��hgkX5�T	��$���~\u��<Z*�5`�1ZT�8��~�b-���ǣ��:�?&��*M��3=�Bmf݆�9�8B���
s��������������Y7��t�
n��в�b��v�˵�y0�}��t��t~>8��?�[���X��'ksM�pq8o�x1Xxz���}=t��
uO�;����q��>
��-���N3���Ґ~}�s���n.|�H�
_�㺔�[�~	-��v�	[@+�B
+TN�4�S�P�rƤ�l"�?`]�čFQ��#���,7/�UY�Հ�
4�g�3�b
���!$ ��6��P{�~�
i?C�"f�С��1��:a�#bw�5��5��=�(K�1Ņ�o�I�ڱ��צ�����I~�P
�Ӥ��E��	�4�ͬ�Dc���d��qS����
+��
��I��Tė���S�'�� �/��@q�{���GG�֧��\B/���>��W��+#�T3ؤe�m���kĄ�
�q�I�����^�Qٳg���71�j�>�_Ӏ�d��E=J�G�N{;>LZx2Ovj�>0�^w��l��Itd�-���4=|��̫���*�������>��R���Y��Kg�*G̓�
,H�0[��\�cle	��3���%��&;b����tv�����@���Kvh�O��R���ߠ/'�˰�ɥ�?��r[��kM/����R���>���4���f��
+z���U
�n-}J����*��ל��wͬ1?� @?��ð��7��<��9O)9����E�Gy��
)�.�O�
�>
$�6����]9֥��S�r`��!��*b���D!fk��8/�N���	՚��:B�΃? r��m��B��Wz��PpP2.��[���l����Bp��VO�ǸԬ����̐h��:�v��/N�5X����*�-]��hm����LY�l��" ,��
{��4�(_�?ޟ�B�}��+#��@�T-l=)�ʼnLTn;��qwE�ӗZ��/u@
�
+�/�f~=�Bo��-��J3�C��lD}͜\��E���u\'[qā�G�	[]؅K�;�C3��f�w���W�HP�r��;���-�@�%ڃG��
9�(�Y��

B�_:\�#����1:��{j�/묉���jY\��]�T(
���Y2��~cV����L7�ʺ@.�_�L�-���Xa�x�z<��9J�8�O��F,��ުH��� ����eb;cn���>	�e��V��
8��K.������~T��i҇H�v|v���U
m+�sk�^����!��zں����eM��D��0�A����y�� B���i�j��X"�����Qn�슦;-R�g�H�E��vb��[�k���+���Pk�
�[�Ѥ<�´�ם�3<t��<�F�t6WH����*z3���
9�RtA�1
볈D�+@{�DEc(����Z4v�������hD�_֟��7ݞ7B@#�h4�fì�x��C`e�XaJ��(s���xz���Zk��PO����Kkd	���`�z~�{�&�#�
+�W�;]\z��<��{���"��<�3u�]|ҩ�̰��
�W'��R�Y�O
A��������Q{F^�fl�!��F6Uo��O��EvR�����_c�T�������KN��V_N�� }�T�Iy��Ȳ���t�W�w���~�ء��
�i�mf�<Jc���t5iT�+���6��g���M���xh�Đ�ݧ��
A��^Y_���Z�lc�u���j��|��7��+,�阌��St��7P��\��o6���U�����MEj:4/�� �lm��M��Xj(�
aI�d�co���<��ZϹ��M�~7���ٝ��;s/��ӆ`��{�
��#_�O�� ���g��*�H#I�3�s�|l�טm�$1��˚�/��؄�n�ւ��m��v����gث���W���­�Gg����i���x�iy$r��E��\�mUZ��=yR�%����%��
�f;ۢ�6GT�юb-��P���6G�
��<
+Z�Bj5ٗU$��<G���n���3
+�.�y�.*;���hZ��v�K�j6h��V��w��}�
֋;�L��Ņ��^�;"�\��Ğ����w����ϽMΟ^N�ʨ�k,K9�C���usBt��1�(�c�h������U���eNh
x~M|���)�0�p���i���^�ϓ��-N�{�n
+��v��e6<���lo��%)$�h&4��5M8��%��t��^$V�uN�6�wq
GQ�?1+GՄ�ş���
��O��I-%�Oh��Ç�d��_}�FE��=�O�lYt!��9N��&n������:�SPٛs>�.��xݎڭ�bm6(*�b���ZK��cc]r�^G�E�,�k�
�B���� �p[�
>o�(3U��5PK�=��
<���\�yf�b�N�
+��
�
G6yv�c�`y����Һ�eF���c�C�Ýl�d�t������"H��3n��pa����LZ��vH�_m�?0��N]O';`��"��
�wRa4L����Y
Na�zD
���o�
[s5�ϗ�ڝ�dN���NN��e��7↑]�F�+�Te�/
+�О�2�O��� 5/��v�|,�[��­�
�o�c���
+�K������6�
+���.������Y5͑�sf99���h����c]�
���4
��=��z�(������$��R�9;�
jJO��S��``�M|���
Q#}g�7���Y��.Heos���� �Pu&��-r4�4~��u:Hޯ9O6�2��pݰ��l�`�%�iH[U� �I�
n@��#7�M>i���q+��0�bvIϼ�๵�$�a ��pK�ݓ�jD�}m������Z�P�q|�ܰ�Y`��{�"�9��0�\��o�A�U0
��;�O~�*�]̤k�D0���;�\0y��:�p/���n/�Up3q��yN����+��R�k�_���-�
+�%'��C2�
D�>-<�A�2��<�Q�pht�[��;!���^M�f-[��Y�
��c�X"OD�e
�������9<�bNjH�\�u�%���͖
�\8X��=\��Me�t��_�I�z�||���x��r�S�"���I]uJ-�F�S�`�d�n�{`Sҭ0!Kf�sH��9fx��o��+֒çn�r��H�BR�q�L
���Y����h
]��:�.&u?��
��g��뱂�3Y��+ߞjetN�0�pT��S株��[����jMJ��^v1ԉ��铰=�_������|��0��Y��"&(X٩�� ����5��
^S���l��,�+j���{8�]���K���au��j�PM��r
RvA>�Q-B*V�j�^O�음�ӵh>� �+��vr1g����
+��@2&'Oj^��c�
�7ejb�W7{N��k䖍�9�K�)�f�+������M`;*���ݢ��w�8ɟ
�r���
��j���U��AR�|
+����C6��㸷
��t����4ܵ�84
�����{���`W��m�m�:�|kL4yʧh؇���&� Z
+���G����70³
+xB՗�O_�y���K[��7�c��
�
J��;�
��\���g��L�'�w����>C�ŭ
F�FS'�%��n��Z|�)g
ш�+(� <h͛j ??�B5�^T�d�뀅W��Ϲ'?��`}�m՚ۋ���k�4sE�(�}���;e��XL?E�~���86]��~�n�#�Zo��k�v<J���3���)GՔo�J<S[���}�9%Q䛣C�o� -��$9�~�q;9�y|n�7]ܾ���轍���W
�'�A�>G
&*�t���5d"���
}����_�J
ռ�ΰ�+ə��U�M:�y��!�^���Ka�T�J���Di1587�;b(<f'�;
���^��ۿ
G2=]G���SX_�I�A���96���C�3̕"+g�5�߫������~��5��#9�O��6?�5��
� �E%d��
�;��Q�����W��
w�ڰ���-��f�!e�xl���yK`;�t��އd�Дo/� Х�O�;ҝ�7bG�Q�߳[o�#�O��~����Kg
t��
�h��}q�/����q�M
�I��%�	ۇ�g��0�/�\��+�.b��M�d5�l=�pIb+j��
S%���B+.9t���^�-m����,���A�{�9¢�
�Т1���6?��F���`A b����o{.�a�Q��V�l
����K���1��a
��Y;��tX�k`���
��Qi��z��
�E�I�mkڑ5Z%�"���ngz,����
�A��B�w�����Xtn���
KF�d�>q/��	X��ҷ���h��W����F���~�/��gT�����;����
�̂X��
:�TG���^��[�M�o~�X��7\�^���<��
�� ʁ������>U>�jc��(5��@RoE�K�@�q���fc�)��q���
�Ï-
���]������
��
e�c�o4
+��딬�Ú���3X|�������`��!�i�M�o/٠���0��n|b����^���ޯ
�X/��խZq'������
{⴨?
����`�A#qo1���9h,�����7#;��g���
+
�6bxlL�Z��V�lbټ�+�r�.��ʦ9Ol| ���5{�Sݣ��x`���E�q�����{�y���ݫ2�A�R�;Z��d=���ͧZ��5�2��g��� ���yƑ�@�(�Y������b��^Vf۠É r��� һU

x ��y��Ro���{Z��p�`,�\r�9�-[�mL������RYk�z�^��äp��3�3�Av<GFR ���m���t׈����1���:m���6�"��MO)��w,�4`cW��	ᚗn
0
+�!(�v�\�c��9֩�~�J��������V:\��jYvy
��q��-g�U�Dž���Zȋl̳�Zn�;���b6�
+A�4	~�•��ۙ���(h�? 
�vc{��^��~�U�Y�]9��B�����<��z�)���p�
�o����`x
��fߗ�VΓ��8;h�
�K�n�t�s�B=��I���I���5��$�t
�m2-x�?(�xmFtK���I<���T.�G�ZMw��F7k�M��a��
ˢ����<�T'U��^���l�i���ȁMp��䳭�y�I��x��7�鄇x���sZe���ԂW/�G�{w�-^�;�t^ ނ#r�
�뢍�k~:�ƌ5��Q�up��@�EC�q�h��ɪ
<�
: �w��L�۵ ���ќ;�y9hF��bU��{��R�Ҟ���
�Ń:޺��g�ΐ�ޫh��V��A���6�2���+�(��jl�ƻ9�O�Fp�+W3�٣�
+ۗ�G��K�݊����N���m��3��^�ڿ�ʼ�η��+��-�B9 �\&,�Eu��J�@
_+
���mn��&0f�UsC�[s�~��aO���=�K[M�}�����
Tj��LF��`����
�E�f�C
+FN�~u�r�r*v
���,���iA���7�Yp����9�%�
�h��)?��t��X

�"Tb۪�@Gbو�=}�d�]��d��m
h��ަu��Z�
�G�k�V��"⌍�@�z�㖹��Uu�!��[i՟͸�-� ���؄Q��j��g��|1I��mtQc��}�+���U-�M�V��E���S��2!u���չ"��p��8<�5o?��#GK��(u����0��`��(�{ҌY�m�	Թc�yy8S��:	�+�O��D��
���ڗ������n#��\}��A�+#�O��B��Z��������o����O�����;	#���*�Y����
Y�|U'l�=�M��U�S=��?�,{f��ChW A~>n8)�j�O�p�7���в}�����F��%
�����WᆴK��>z�S[
t,�=�f�p��,�� ���^|u
+�
�Y
��g���y��Ԋ�6�x�D9��

+�m�";��U�Xn?j(a�熣ٚ��>����&we�/4JED�}'�l��*����w�կ#��1���`_/��z��(4���W�k��sR�B��B�xF
+[���q(��h���З��l�_Բ�
��]�m�+7ߕc;~��7��7
Z
�����j�p�D��>�h<U�٫6�Xa�5j�$8��k���NG
y�˴!6�I�\lk��c�j��
R����"��ܡe�᮸X��������(�
+�U�(���[�P�c��
�����70��gX��$�k��]'����2�����~)%9�'!�%ݹ
f���ki(�
i_n��<�
~:�
+&�����E��‹VW>��P����Y��'J����Á�2ia�Q���VTM at -k���ok塚�$���֢�͈���M��ƪ�o;Ik"�KҺ�W���*9$��Ӑ�Sל���6����˪&�N��
?��~4�����2^�n4���1��~މ�j�
��b�
�R4������q]��
E���N��[�Z(_=�w{;���n,=MV�
r0��E�ZHS�
+��q�DӠ����y�	��ݵ������t��MlCLJ� u΂��r����sJ�F�
+r�
!؇�HM����:�uT��CU�/=���d��H�*/������i��/��l��+�Yy�q����c�p��=v�<G*+�>���/��qvRՋ� �����*�WN�f�����ʨ�H��M�z��y��Q+�>�������]���q*i]�=`s�/���ן��u<���ml�������u���m,�$�N�Y���.�kICR~
+�k�e�9����\
ve���9F��
�k����d��Y8�Q��45�s���cW�v�ӓ�
d��T�چ�K
X
�A�B+�
r��w4�b�}PC�?�(��V=;[=>�M���a^�����l�1/�V?��j�^RQ
e�7C)i�|��
�.
7zd�
���G��ډ���j�[��?v��n�~��pP<}~ j���VYq{s-��-]��h[��=腖�P?m�6nn�4O��S�/��U�t-,�F ۮ
=��~zWμ{��k�����oe;���. at c�_�ʹ�w
T�R�����~&#^[���&9\Ȩy�:v�ݰyžT^/�ȴJU�����7Y �R�X���jK��A
+��_Nj�����൴����{n����,S���X��@�l��p�/��+a9iN�P	cSuTӬ�qӴtd.���s�OuoA���_9��+0l���M�n�#GP.���_o���z�c�6�
�#eA�uH�pbU;um4�v��77|i�QyD3n
?hD��lB%Gz��.K�*/��cb��v��|���iG)(LG�ʌg<�|@���R��/�+���F
�2c�Sszd�!��%�
+j��q�aԈ��M�UX�1����и��i):��
��5��e��}��_X�V�"�}����j*��K����
�0�QaEu�@"V���_�4,7CU�?�d7�r:�nG���'��41��
*5
A�g��מ-���~<w������|!�x�x�^�Bj��{��վ��{��>�c^9�'
H�m���L��T�\�:;��.�o	
-'`�Sފ�� .����L
+~�t�m
�@lJ�=5�.�5��}��펿\]�C�x-ϳ���oY6w
������k��ՑF�Wt3���Mv�"�Q�n-wH
+�R������9��ƽ�'z�����fQ��y'7=��%��oҜ�����M�
���q���v/(��y.'��"
����ٕs��^����A�_|g�e�ҷ[�z
[$�S~N�GZ�T�xw�#��}��m�ǃ��
:s�95����G�
+�2=Y1��eɡCs���^)*h����UX�3�X�v�
�, gvE�2Ƙ�Eq
+��!
oI�n
���!1���ϻ����v����D+Os���@�w���q���3�����YY�~_F����Ӎټ]�� lw=�����t���d�%oV�yX����Yƌҍ�d�l�����-F��묈z<s�(e�
�Zg*�((]�g��g?i/��r�W�dž���f�b�������/c\>P�H��

�։�O��sg<�S�u�t5k
w5���7�&���x�_M��]���b9� �v]��S'��}��J
׮��˿za�
�v2�5�����h�	���!= ;�&�x����(����"��s�N	n�$��:8�Y��U�Y�w�欤�:��Y�{NeK�P�U����گ�R:�:a���#�_wG���ehV�a�-���r1�rT�ݚ��ʝѹ�J�_P���ҩOC�e����-Z���/a"�ےS��{��`].HϷ��|�5��ߐM�-:��>
R��W��i.��ؾ�Pu��K��~gG?�rg�6fn37�b&����(:n�H���Щ�t�c��Q]����|�F}Q�(�F��]�S�
u<;( �(��̏�_�W��ّv|���@�`� x�쾌j���/�	fjHl�
������޹R¤�~��WJ
+�14Wn���[��
te�ZIu}���`�3�N���.���!X�������U���rd6knuf�o�`
i�/ߥ����V�t.�]�D��~r
+\��{��_�X��=$�:1�е�+XsNȡ���Tw�����nu�!}�!6U|٢�`�WoF�k��}U��z;��:���
?(�
C3"?
C�v�N%{���n�)�շk�
����kҌ*U�p���oPo�Jq�r�Y�Ȯ�.E��ơ�6t�
��@QW>^sǠ�I�Q�)����"&G��z�c?�/���f��
5<� �N�S��>z���x~�վ���D\
�	��і����SY"=k��OB��0�k�c�0S.�{ɸ��_����8�J�m�)/}\S2
+�����/�*��`�������Е,n��ڄ��Z�����}�k����3���F(
’?
�p�r�$'��WS����``�Ҹ�k�6l�T?87xU4�:]�^\Q�.ZЏ����g�)"L�Wkݾ
ͱ>�� �1ż�l�-��
�R�s;E�
n4:���6���`>����V�G��n�+���{6!�;������
�d�����"w�ĽD3T���3{'���u
�����W�*'
�x������ ����/w�m�s`t",�g�T?�7
�{�A�0��t�q:�_��#�}�j�M�k]��B��*�_�w�����_6�VQ"��>��
+�n�}�)S~Whhc��@�Bw>Q�2\��r�ً?���k��i��w��zL}q�MG���(�}��g9����%�X6rz?Ǵ�'�A�$^����3|7G�cY�K��lKiq�y�R���b��FtֆHy�j�#��
�*�ʀw!���Qˉ��NVmf������~��P+v��~+�E%���F
b�u��Z\O��8��Hw������͉����v
+�2����W4��*'����DϬ�����}k�F�SJ�G'va���0�5qU����"��w�ԷU������3N�K�Dn�7�p�yށ؃��z�c�psh�f
Α?���#��#��

��&���"���K�>6�߻�%��k(��^��e�?�vѸ1�U��i�ux������S����O�}��{
��͠T��
�32|�8��)##�����g�Uzi�7���fY���-����Fy	axK�4K6k.D��Y���1ew��'��ng��L
f{�rT᭎���ъ�ҝ��}��HT�'�UmX�Hs+���~��vy���XǨYbb�:���n���.b�(�A1��,R�E�4{��g�}�t�j��h	6�?yj>'h�	配���gx-ɻ�Y���*�ް��%%I��U��c�r�"�2��]�:B�N]�X�2�kn�)XP
#1���8=
+��	G�r�*JL�?9K��n�3���
H�]��-4;����ݭ{�$ɪ{�X�vH^���ƣLiea���3a�g����Z��G C

�{
k����{�z�w�����:�r��ף�M��“$H)�·����M_�����e�ۖ-m�h�_�_�[�'q[�mvk��LZP��`2'������I�
R
5�|{�����p#�`����	�_�~\�9�ܛ
]a�z�x�J����h���^��3-t7�(馍�v�n��4�[����e��s��s���M���a���^$w�ö/��l�.S��;�6N�Y�Z�����Qӿ��a�
�G{ө�o>�^y�$�ǵ]�d�*v�Yqh
����NY���[XIJ�X~ Ebʙ{]�%�5����p�Ҫ�8K��.�X�&�:�z#���e�����v/�9�j�OYg-v>�:�4}<�K7:f�oD���źLz��0��=V_����
�I��
+���d}���uT+�1r�=H��&f�����͒����-���7�ڀ�p3
�ꬻ�Z
+.���F��$���RK�G�ש�q 7��̄��D
�O[`�E��*
�Qs�!4O(1�U�MhQ��41FU-:�,I5�]HIk�m)�ٗ�
\Ȥ,�C֎����N�����H�J��l�q[n	b�x�RF���Z�
+��I-N��ϣ�Wml+d��^��
3�b�з��(�y?$�j n;n�]����o���몸��"ז���+�{gG[�3�ժ��j
!�uU(�©���ވ���'��0�[��(}ǥ��/�r
X+��#�:��۞�HD&Lk��nԅIjV�)���z�]��(�O �<S�k��'�T
(V����)��]?���c��=g� ��'Ť���y��^��!RzY\Aq�T|I�tg��:zw?
�%�?o9��i�j��q�sR�I�����wW$JK��
[fb�G/�by���2;0�Z�c�"�	vj����_��:^v
+E��Z)4ǪR�� ,D}�do5<��ĭ�*w%]���
d�,Uu��J�s���bz��|�q��Q���V���W ����ޛ��d�k~�n��2	v���l�R������G3�M�W�ؕ�2A�
�ḿ
nl�i��AG��#��E��
�R�n�^o���"D!r��N����e�8l���C�T�A��.(֟o'��Z=է��mf�{
'O�����O�;k�C�N��kPۙ`V>w�	:*z;��`�R�/�D�`Ã�l��oQ���Ǎ��+�����C�h�S������ӝ�ne(�B)}q
���pު�Y[���yz�RAv�M3�uLj�n�K�X
���?��m*��aK'e�q0´�콳�N�QփR��W�
W+�
Q��J���E�P�)�L6�	7d��i��٭5Rx���waMab�v��pM�bC��
�3�T
�[�t|W��U�(�qL�}� ��'
�"�����
?O�����;�k�p��)�����sE�Q�j��{wr��8�^�j��tAa�������픲�����C�,�P_����!g�\|���^���\;
�m�)����4K�`Z���^i�e' J�	�
�&Q�1�V,��Mrw���g�J��U;���<�=�=��5�l�hr�%��%�p����md��+c�kS)�#nzh�k�`���jç��D 4�V���`�0� ֤�-��e�������6����S�Y�'Dk���R�ʴ���4�Ƈ���m����j�Mw��
jw��K5��'�2$�|�ܘ%k%�>6bBW�/�z]��Tm7�,�/��Ujp�B]�n�M�+��i��xM]��?~\2��T�!]R7<CO���Օ6���c9�+�\�۳�O�����}_
���jT����i.2=+P�}"�&�3x�ʬ@
���1VOH]�	
��Z�O���u�F��+�d�2�&7��?���y�YC`���M�i��{�������!�
�X�h) [...]
�ƕ�: ����q�o{_�`z��w��\�t:��y"ǎ��7�;M��[�����f ��v��oCk�6��Ĩv�iޏ=��n������{�
��A`[أ���
��:_�
I�*�	�vv�I.J�h�G\/�T�z�l��:��
+��Y;�';���������܋��ڋ@���Cm�X
�5
ۧq}���`�
w-�z)��A9�v1�6I�<?@
+;��Y|u�KN�W���O��llDm�.�X�`��Z>�ӷ ��*�(N�+0M|�����ؒ������֫�?�y��LzK����TN�~��4K�[�?Z�f--��$�:�-���C�¥�v���V�ĝ
�
��"
�(��ǂ;�uF�
�U������qI�� 5٭v
;a�V]7*��{�6
�
w }1b�u��]
Q�F�[y���娭����
��|�^+KC�7���i��N��D�#s���*��k�E�p1
����[=JȪ�v+���e�<�[2o�LM�!���-NNu��8v��C�:
sd�)k봟�*`�F�����$�ύ�9t=��tr2?6
SX�+pA����,�1es�r�r�
�fǼ/�\+�
��Q�ao*���c_������]�ٝ5o�1C�c����s�,�gԲ�ӝ�q�4���k�˝3�<��wtͯ~��n��&v�/A|��]���c ��[-x��y�u;�ģB��}k#A���P˻L���A�����K�	�-��2���O\s�q��e����$m���7���O�zo� pA���>g����ʮH��,��m%�j|{�~b�!s3mI�k-8n��?�S�`ޞv$w
+G��z"�#3
�.�j�&Z�k��}^�zP���� ��� u���[�Z�l��2+@
+ΐ5iN+}b����+���i۵OCs���/�Z�
.�
iK�[D[;!��ذ%��+�[D>S(��ymEf�^��I�� ��
�t29�: �-�����s��~ػ��e��}��̀�����ha�
�?��N;�9�R�
ʧ�?(����
����O,0��q:H�mE`F����j
,g,��7n2����;��@�vd�U��F����w	ni��a�0T�� ���4�^�
���Usq��x���ks G
+�z��[	� ��t�9��\
�)M���Yy��Z;�V�(��BP�S���lA؃B��04w�wW�:�Ԗ�7e$�����.s�*I��t�{��;W~kٯ
�VM�z�%y���Ϛ�;Mr��ɣ��
+l�Jr
�+ʋ
ܷ�0��@
(�B%���k�i$wd5��;W��E]0I��v;��@�˰�j
J���2��u&�,�8��[���X]�ӭ��U����Z�����HBe]�VH,��6�;W�� ���%�ߛ(�H���Ɋ�R�kYM�?\�"���
�=S�7 8n�D=oC���^��h�
�=�zf��7'{a�	�l9��"�=�Ы"k�R�
�
�Y[�57�|F�36���L�U��Քdx(Dm����'�6�O\�UZC��W?�t<�5X��GR��Lg���{9"�Q�<�ZL���r��V�1��|=hwV
��
+=x�i����D-��A���8�����
���]/�_k��wb�_"c��롎��	�,�"�'���xI[�l�qי!o�
7'���zv�r��-
�C��
��RmlޒsuqZ��3׆�lvA�׼��&�up�B��y�`�W�IzXr�9�1
�[��B��b�ϥ2p���%�9]�$�}�0�~fC�<n��(�^���xCL�b�P����c,[�PQ�gկ���k�Ae;�/j��m�c:J�m�=���/������d%�
x����[���3���,D͆�i���.�J�X{[�cpE��ܩ����~}
U���~4۪N�FK��HM4�}2x�@
�@6z�jGpT�6�����[�s�O�Aa�c@�O
۟�]8/�2���RT�l�B�M
�4�E
^B��KJ)��7򃋎�V�Эط�[X�z��
5��j%�,������ w����^�t��}���T-
wiO�c����������
?p�zs}l�C�l)��72��~ȗ���V��俛�5y��o�������}��s��c�&ٵ���w��=�����\�~sϦ��P���
�]-�z�,�/%~f��
Zg���W�r��أ�p��\V凤ڂz���r��M�����o7��8
^��V���;/$]{5Y�j�}6�V�{�fj�


����:<��e���z�����LI�@&����jx��+)E�=p7�7���
W�tf�ݧ"�'��\w� �(��D��ke�\�q�LF��r3Q�4|�m�:A��]Qe�ÿ�`;�/����t�W�EڱS�fl��^v�Ν�@��_ط��
����E�J5��,��9LFxz�z����
fѤ�MFS��\G�Y�D���:̔����]�s
=^�+�J����F
]F]-u}�^y-��+S��ة~ߖi�]�
�յ��RN�^1��}z8�����s�J=��F�_�!y;��N�F.gmz3�Po�d)�17g6<V����u�
Ǥ[�6�K��̊z십I��6l�\��M�����|��4�Q�mU�o��;�*%���R۬r���.^���k���I����L^������Zrl6���BW��n��ړ�Qo���_�zP
����W1�lD����oi�Nn=�`vx�����J֕4�y��1��
le�Y�3���f
3QP��
�递�㺢�#nx��KG�����i� ������$VE%��dOe��L�=�*��c�����h����ش�,���C�‹�(B�Ս�:���R��X��:�Z)�:��
@�gZ�V�ʩB���Ѩ�nK�	�{�݅��F�'��R}��M���@<���0�E;�e{7��s��|?����Y,Q��K�?b�G�3o�j�
Smq>'6¨.
�K�9��W���<�#��C��Z�|�B����Fg
]�J��
oO!�lZ"n��
+�M�r�������z&�peY��"dL��
w�yg���
<�X�\6��w
}R7��`���Hqgص��M���|f������v�+WK���w�:)^#"
�
�C��F����;��-ĴvG�3��7n�����DT�}Ե������������o���<[����$?L�<~l~�
-�Mɗ�KmԷ����zbK~�6�FK�"�f�8/|A
�Ψ.\�\�g��zF�}��;�C��N͋2r�\��=�T���0�+9
῿��+�L��eM��S��l
D�TILU,嫠�V�o̩%���S�����_K�^�|n�MP��<ڍ�`+&u
e��|��*j'˹z��RR�
a��X۩��Rk�{�T^|W}��)X���0�[���䶲c��O���]{ȋ)sb`ɲ{E��2�<~<��3�� ëP�s/f?W϶�q���y�,W��S�wܬ7k%ys�,�>ӆz*Uq%X ���_�R��5Q ��!�ړ4�~5i�;:�[�n���Ӧs���l)�ISǣ���b��Z[�c+b�5*�W���ꯝ�S���|
f�[�L�}�2���B�|�	�$����~sǧ-���ýT���I�Jk��E���r�r��"[���F����I\��9Q���֬��Q��y�~b<o������R��k�l��A��q���
+���C-�]ʨ:<#���n�=C�ۚ�

+Lj����fC��F��Eͨ�V>=Y��NQ��yH�9���3Җ�h���x!E��QCRs��ŗ��Z�z��E:2f"o��P�5g)y
*�"��#L�v�:�z*����1u5����u���94�4,�8�
��sbF]ፓ��Ы���4�,��Zo�/҅����!�T�X8�a���>OT�9?K
uM�h�U
��$�ڞ@����
�u��K�X�p��!��k���Dm�$o �g��>�c��D|����mK*�;�z�?����lB��w���,�S>�� ��N�����m��]M-�1Y�/e�r�}���%��00������y8��������"
ԉ[��д�$�։1�ױ�=�8��Oo=J$c���7"�}{�OT?����B����*=;l<
���X��
}��4}Չ�y�X
��r��Qp1qz�>�Td�|�Kɀ����(8kә����CA�1��Lwx�i<�*+�.��v�0�
�U���d�z<q���h.-.�WAwk}����cY�5���� [...]
#P�ɋo���q�����uN�u1��
,���^��H#��b���jq��h,���3F/q���~�iY߿�j��g:4�������X� �*�A
���E��}D�&�\��кM,����yO at fIf
9�y�~`�>+/��F���ft��LV&[���
n�!���8T���i�љo�M��Ad�nj�O�1a���=�_�
�o��fX���ֽ�V�$�۴�=���NSM��ՓQ_'��i��$��
/:�%�ެ;�Ռ����q(L�2�8ᅄ���bA��c�j�:��
�"�e4��NW��HΆ�U�O5�+fƺAuqRP�ȕ�?sm>~�hBԫ��E&����yII���nX�b�zI����>�^iLt �?��;�oBW^��MiE�sk3�Rj�����Y��Z�C���}�iI��0e����??9l.NeEU"���xy�5
+eec� Ӄ�5ά�C�=�Y��U�tT���w��'~
9�f`��!$o�rp�4���,�z���9A����+
C� ���O��"��$�
���
*�>�:�^��:
�(����1��x���]����8��@Ƈ�.M6�6�k,���)NpHy����bֵˍ��E2�Xz0��B�=w�_��Z�B��<]����
���+���%�g��������;�J'�?��������^
�&�8t�u
�nU��s�ڽ�� ����� �-��-�^Ϛ�
��˿o����.�1bXA�,�g=*�D��i}��q�`���۟�Ǫ���f����d+ߨ<��b.����
���F�� �Yʹ�}�#	��p�����������8o=łO1<:��C\��]�Q�
��Qj^`-��
>�*����w�ޤ�d��(�bPn���)��ZG��
�+�ww�;.&�=w��>��;�f˂�-�U��x�0rm�XJ��IO��§gM6�	�
e8T��h���#)KӁ�RhR�͢SuLT��_�UuA�*Zo���8Q�Ζ��n�赩w\%s
�+{}�2�El.V3�x�چ�R���u�^�P�LR!&9��b�J~&�@��E�Y��[����
+`G�0���Ï>_�Vi��;��_fWu4����{1>
+���0
�s� �aQ�L*�uS�,�S���V�Q_t�֜�u���z�/JA�5l�XU\&���Z�B�ج��F7b ���q�����
�T���`x��Ly��� ���q�Tw�����K�b>����,�4d|���;�v'����������������z�BO�Ÿ/n�|������|0!�Ŧ
Ҙ�nn~!>��N��k�Sk׃�
�>��操ZU(�%=�n��Dd�5����`���ۅ.esѲ&����mU�p����@�@1%���
��F-D��K���� &���^5�s|�3E�>P>�
�R���@de��G��7`��6���姚��	WP��w����e~�d�7�ƨ��M�/5�8�Xx�9�q�Փ&V�*�.�8�A�c�
���A����uZ����yś��PC''G_W�~i
�~o��щ�|	L�W�/��¥s��I�#�=�j݁�~�Dg#�9����Vwp�5i�lD���+�
�6<:(M���(U��
fM��,��X��m�m,���p	.wA�)� �
E�����X8O-�����%G���Í��a�RfǁP�/%��!#����i���ۃR}ۈ�a�1sX%�y�Fp�������m�N�d
/��˧V��pm���y
��P0�a�s�����}h�'�Yp�+��5�cJ�w
�ڴN�����2b
H�!^_rK��	�E>���;�;�
��4�>��i
iT�K�9�y�;8����\�@�����
Rf�L�D~2�
+/6��˄)��y������Zi0Pwp"9�,{G֙#��"����d
�%��,���$"��ڳ�A��Ʒ
E���/}٣-, M�W�*ʰ�^;*٪�?�ZYmS����e��Xm$�/)�K�1_�ru��o�f����@R������U�
#i�6�T��N��W_�J�!7C��6{�W@{H�K\�yz�G���x��^E�xM�K���/�Kj���6aҏ�k$w�'�FK}�c���ZcU�o�-�M�Ҁ;�W�XV�.?�
���P�3�vf��|�S-כn2��1��l��3�K7����"�IJe���>��ګjeEgY�)(=w>�[X����"�����o�\Ƿ���B�-C��
)���#ww>�\a�{�W�*f4Mb|k� G@��p	w���䞜gq�EШ{$��zh=:S޳�n�Wk����9��lkjg��
�ޅ�X{[�Q�ru�Sb�V��{�
+o�AM\���M
�"R�.��
�FV�$'-(�x�#�~.)���y�R(�����vSp���ֺ��4�艸mWp^����&�N�k͹�Ov^A���̪Ou���@-V�
?�4��u��b�%D��W#d�Q;F=H�LoO�Qen=K6�C������恃��:�[v�7��%ɫ��j���h{�%\�J��N3
/�B��O*��fN��������d�%pT��������;�W��(�0|��
+���{22|}Y
xO.�5��� ,H~�O�}�g]���e6ͥE�l�5�z������2%�̻*��2g]=���Q(�+��
+����A9l:'�嵎������n��
oa=߈�E����Wd��pP�q=���k'Q�	���q���}��fg
�����|��Y�:9��CQ�瀻v���ҙ���U��M�uۼ����[� ���v���8E^m�QP���5�r���w$1������PK I>�F�AS�qjp�Y��udGDU�������z�/�� �*S��� ���a=��Ļ��Ԭ�b��
I�� ����-�ݝ,slMʌQ����c-�ȇQޞ�Ee��c8�K�S�m�A�P����U�H�2�7jMW~��X�Ŗ���Zl�~�-�T�NR�ԉqݫ����3KU-��#��0`"
+( 9g�9�����g��%�S���מ���=�
w��7UC�+)6gK�!.��^�@W}vo_�s�JF��6{����~.L\�+��w5n�Jn��0Sd��!���Q��
���
��aU��Dmu���[4z�d�Wp-:�B8���
�m}伣��r4��7�J�8�5�7
�1��9CM]ku^=�=�x-
эM=i���)�v�Q�J8�ݳ
�v�s�R���rR8.E��
����OAȁ�i�~�mr*G�ܪ�Me��f�zt������	A�I��
�������Mz��˄��Z�����FJ�(�o�N�|
O��,n4Z� 4Tx�<:("��\�b.c�0XIhܫ����x�H�.}QКf{�\�&V ��x�T-Y�C�\����/,�y�4hA����u���滋�?й���C��
�i����
��6�+ՓF]�;s�"K�ԝ��J��O0
�
�,u,�V�Ȓ_Lz1D�����wo��}�l�H<H'i!<��.�jP�zf(�N������{��ewki�vY�Ɵñ���/�@x^������}Zk���˙�(������;���~$�1��폕Z��1=?��w�Vu񣫿!
ŃC�i$��}
(d@�w\�DG�ż3sY�ě�R%A�a|��L\��:'Y��CZ��F�,[u���
���
��Ϥ��\�97D�] �St�|)`I���O��
���G���~ ���`�H���dߘȻ�7�k��
�����=���8�y���4��
Dץ�
VD���x05Z3��oi�xlOv�*9}z�
�W*)��M��AҒu��+�&�ݳ�Q =ksg��F��P��/�oF��kaޒ������#���nu<z:����&
���q�4v+z�\��C��O��wdM�}�Ѻ����{��u �������s�xu��騙�V�d��	g���n%�^e5���#�/EI�Mb����|�<V�h���xy0�.���S


�͊��m�RVܺQMM?Z��P���l����@��ն����ij��������9�a��ǵ���#-��Ԯ�/��=����z�]=�
2�s�"B�.���|����w�kkk�v�� �?�}��#+} ǃ����Z(y����W�Ӵ�W
�F��
+�Z��N��-����Z,��%�R�{ѫ ^ŨF4��K�
��L��߫�7��K`
\v�
���O��Q�^�Z���j���
���5����sj ��/in��ƻ`>��r5�jލ��������_�3F��û��N��4�R?�@
+�{>Z"t��ZN��s��\S���9ߘs�H�	��C&V̥y��Y~X�+	��Ji[�d����<�n-�R1Хn�v�>A
0�p/���N<�W����UՏ��;�H
+7�fD����{����
�簆���7���:'�L��|�
Uwj_�ź?w3d���� �O�C���ĩm�j�	e���m <
+��N��5�#8�n>�F�P4�z
,	����� r�v�����`ً�����e�xǫ[��+�c���*ҐW�� ���r����pO��I����v[�
7���U�Z��C
+���1��F^<���Xg_�Eg
ߚB��R7�A�(�Pg�%�}+wf���p��([&��u���N����Yř�F�b�X�d	q<;�0�ʋ,����k��{�|�j�W�PZ
+
TI"�����;0����Mp�2��i:�i3�2{���
qokyc뵒��,s�ևr.�^s!P/��4�)���WZ(p����m/g�{�{�;[.��vg�B]l��Bbw�d�G�>ZsF�"�Ac�y��`����������֡ ��
+�'?��c��%X��
�{�#��U���
��/l��OZ�Ҏ2����R�5s�����{o�"GXoz�
\�n��y�
�-���;6�ƌ��J����)/��e��R����ܻ�єT1�3�Gt�&��
J*A׼�J�6�X+D������fJBo�b�\��
�L�.M��׾0�^փ'�m,���s�t,�=�~-���6���&RE�����
}�6S�lu�6��
$)O���Z���2��(���M�l8�
+C�H�a���[p�o;%��{|D%
�_��\�$.ͭ>�j�^�9���v���00�q���=�v�zɕjqP�B�V��O�m
���/��㉍*t�&G{l}� ��[�r+}�-I��gz����b�����=��L�S at 8XwAg�
_��/Lg�k�}_�U7=�X�� 
�
���v�X�G
�a��x����z�c��/
��^q�r.t�ٗә�cqXRf��'��F���(�kkj4jE���GE���`���I�c8]���*���^ٱ�烕��&~��w2R�w�u3���oo#�����ut��'�]�����][���h���ͱ�2���VZ�$���:3��j�gUk�P��B�#���ք��ثu6+W��
M�n�9���<
C��nE�M�nx�Bl/�v�Yh���6�wlG7Y�<���	5Otn��f�Tw1�޶c��]3�ߗ+������ �mS�)]�U��� �x
�
+���y��o�1g�Zڳ�LD���ˍfɶ"|��qy��U+�-��
K��bt�x(��P�hV�	�
�|�kk���K����6��������+��o��S���#��e�W¾(���Y���
�l��h�K��a�S�a
+�x���xgN7���pw~���ź
�h�WT�sBޢ[�4�,�-��!	F(��(���o	�6�Ɔ_/���=8���V&�<�6�Џ��*���ĕ�I�f�4B�r4��y�Jp1��Cb��#�Uϖ�>h�'YǗs����
gN/���j��
+ڛ�K� w���*�+�P
ƻ�ȕ0�kX�|
+�� �ޅ2ڻ����&\u-���v�[��K�B�|r�>�Q�h ��
+�-�
U-���'���
x���
ڠ����ʒ�k%�=�}�:�k�{WO��)�ۧ(�S��\�t�Ȕ'�+���h�3[t�N��cM�b
S2J�e!8nq3A�H6��Y��6|���q�
����&��� �Q�Y�XOg��F
/z����Yb�s�
9��u[�Q�!d6,�<rt
�Hanz6�kR.z^׵��9��o�����l=�Δ�E�)��S�ЧC(*
����_fn��!'�>^�m��,-��M�;_�;�9!~v�k�j�>[�m���
���[N�؇�7у� q�����[6�ճ�ch�ē���?�5
JV:�|
���O(x)����ڂn
\�Uߺ;8J��<���8�{ﺖՇ"G��
�I� V�K� 9���)�t$�wb��T���k0s��2p�>P��	���쌉���X~��8�3��4(�MT]�I�<l�KǓ�f�Y�� �`�4�>&�6�I�
��=�#��B�L�]��n�G2�
׮㏾\��
´����e}�TL��
}xi�#3F
+
L9�O� ��1�C�.
��Lc���ae���S��w������� ;�K�v��P>�Z��x��Q(�87�D�o�e�YӁGT�`�b��6�%w�Ṽ�O��
%C{�]8�[�X����'���fa��}�
i��k��5/��"�34�Aۮ7Mjd�s_�Ū�4k���.���B����g���$��!��g�u�T��lM*�]��@F�
�sYvE��oG�'�����N�����8�³(��ȳBcm�	{ӂ
�l>1��e��?�`;�#�SW�.(���ˇK�Ͳr1'��r���^�w�ST��[��n�ҽp����2��?��g�<0�@Hܮ���m��N�W	
.�b8��n?�ƞ�^��j�㝪��e}f 㯴�Zy�Q.�0�;�]�O��E�DNK�cGUG������s�
a0�d�.�8��ei��)�����'��k�Nq��\a�1��;ю�X��5&�U��[80�ck�U�sn��Y����(G�"�B� ��|0OW��1�o!������`L�
C���~
���W�0˪Z�_��ئ��(~=)ށ�b׹US��Ĩh��ʍR}G�Y	�P�zUJ����5zM����:�n��s�&<��vo�Uןr�+
RIA�*.���uO�%|�i���������
��
�ƄoG�E����3�z���
��8SN�������Me4^F7$Xwʏ����P��H��f(�zt�WJ
�&�Ⱦ)vN��'��
ߪ���yB�"<�
�(3a@�CH
+j/���4ǼA���R�����k~�����qГ��SP�|O�����7��ib��? ;t��Q�hW�NiK� v���n�d`8��{
_DGZ�U��k��|��у�0J�7<�	 �����P�>
*.]2���ɢ�e��*c
9�緳kB*������"V+�}람g��T��K��VV�F�i0�};���р-
���*	����,b��qH��
�cy��\�*��B����+O���Z��Q���WP�4F�2�
���Εn�v7����6�������<�]���a�V<7�����u�J�eA#�}��~ٮK�����,��d
r��7���3��u9�����Æ	H`?wa�Q=�UY��
+�Z�-J]�*CN��L�
pߣ1
�2��� )�o����?�NTÕ��=�l1���u���at껻9�^N?Z�r��M�{g �T�5��F�oyS���J�J�����,����"��B�`z����.�n�TO=��G�-�\���
vs�������?����7��&��)�Ľ�a�<����^��P�6�.��
	��D�dm����R1
��G�I./
|ti��
�_�);0���I��*0��
��宣���y݃���^4Cu�x
�N�xv��q9tLө�{y�Fg��c;�W5o��:��!��Y����cW ���i'?��G���D�S�	@ޮ_�/Q�ל|L��^3T����
�Y��_!\��w�Q��C����}4t�
+��A4���T^��0���]b����4)���cr6��_d�?O��}�|4��6&f��^V+�p[���L1��b����ZN��ʚ�*}�:9�#��
�
u��x�כ�3�������1����n�����~��w#1�S��
'�c���w�)y����OuI} �@< ��-��4[I��,C�B��&���s9��3��,{��`�3�Pd�A�:�zIc=��x�1㾚i�~	����N �3���S}�q��
o�N�d����#`���7�H���U�q7_b~Yv/��S5eH
���X�cLiQa��:8��-+fn�����J��N�+�NG[>���CS?�k�
J%�ѷM���c�������k���:�]؍
����ږ`o+-*�]�K%c1{e�
ڤ��++j���E�6�T
+{C�m|<�h��w��>{U�Egi�W!�z3�U'ylZ�
Y�^�굱X��@j_{�"��1���﵍-#�4�q
s*�ֲW�t�񩙏�i(��7b�W���s�A�K�2k���Z�7
�������ߎw���iYlդ�!�P�b��K�a~w����f5k�����^�I۲�9o�/p/Z]��Skr���ydU���~vL��r�C�:�f�o�[��mHa\��zh�
+z�E-���g��Cɨ�r�ãH���wi(��Mm�NWw��=��:�FE�h�n����
fa���2;9��=t�sF��!�t
&/4&r?��*%`����	zl���57[sg�9�%���
+���sw[�ʱ�w��Y�֕������R�9���N�{�_�D���h�.���;�[�5��w�[��_z��!��_����}��סp
+?���
w�N��-�
G���{F�h(�n�|ס��R���;������&��#�!9g|v캣�L�����z���V�,ކ#���K�O֟�����~*��rt��:��sm5��
��.�[c
+%���f�T��-t�핎�g��=	��F����vU�z�����}�Cz��_hC�	K{�
��h��S̶�4<����1gp�
7�8�5Ld�Tm�[���f��
[2'r972��
���лL��P���l-pI��ƭ�ݜ�Hi�l���_�Էt�٭�6&����i��R����qkhӥ��[�jw�6���}�����d�jG�iM�u�or}����5��Wd�3� �z��.�i;�s���������}����:t4�
ӳ���`2�L��=�B3f����s�Bֳ�L��:*G�+T������X�B+�\
�
{�&����&�ZL%.�H���^I�<�p���5��:p�ֳ�j�Y����i�*�{�u�>���E���1ʹ��_���"��9����NѬ�V�}Z&�Ytd?�
�r�׈, �ou�*�*|Y�&��#Q�#d��j�`]�%��U��w������1���iW�~��GH病�&T�C�ڈ�S�/����C4쭪F�Y��t�5�ӊ����9��x�UT<ij#�.yuꝳ��Ӈ~�v90\�I�al��9M��
b~D�j|;�7f�O�������w�3�ګ�n���ѥ���
��
�ZΠ�uЈfKV;
�
��um.<aV�H [...]
&�fd]`�v��
���K׃�n]�����9Emޅ]���w2���M�q��z�P�)�����"s�
p�����y��l_ą
Թ�
�
=Q�K4e�x�~��;ϱ�MD��N�O��> g�7���T�]�=_O���"�b<l�������;����%�R*�Ԝ�s����
� �F���|}o�����Q|�ή������ȝ�9-�-��I�p����N��������f��
�k�ߑ��������]tac���_���,����>.
��\�R��R��������j�^;�

�����¢&�u�d9���
�����lXP�z����)�~���z���)k싄�Kf0F�
x�~tSuO���.�Rn�,������AkY��������C�g�Dg{l��_�9��".F��hz2Xa)�"��g�=?*�ʕ"�Q��ƹ�/yF����аf�2�t���
�|U�<�Z
!m
++V�D��K}��G�d�-4����M�6{���˛�-S$��ӥ��͟�����Ӕ�g�~�7�H�m���](f46
{�{"�F�&�
�^m��x�p~�_�+�bw#�LF+H��{�����Y(r�>�p�zM��� ���R����K{d�Y��wL�1+�1$�
��tQa���H�)A�g8���X=��= q{��l�?z׭��C'��TN%��
� 0�G��+�]Y��T��]`d��1���w�y���H���:��WC�3ފ�,杖ں|A۽���0� �m�y\X�%�>?E�C
��uLm+�fP[�o�z�V>���/I'��G��sV�e�Tk���Y���P�D��S�I׆�pT��u5��hO)��An����f*��{ܒ��\�
�uS��F��:��~��7G�8�����I�6̳��G{� ��_�*��JҾC�
T��B�P�+oѽ��T���͂c�ϋ��/׽Om�
ك̗}��r;�)&r\��^�Ŭؖx���Ls�R����.5-ǂy
>?a��U�bۈ�w�:�b]БoJ��H9���
L?���q���,��h�G�A�\�!����
��Y��N�4�
+�(u�a:N4n|�܏���X9�Uצ�ɤ����K噇��\����qq\
�#oײm�i�$�����U����
��T�݉�7�_;��3�r'��9r
�ܫkH���9��R
�F� �W!�؏��%w�gXPyb��@�2�7���x�7K1�
�n{�����mp��k�i����z�9�`BR�/��z�(���l���koӋ��>�	�,B�����zf�Z��ٔ$O��sM��,�o?��D�1�*z�T+4�H�|F(4!]
|��
+��L#֦��C�e>Xc'��G���^�	q�4���gP��8W=X>��J��? :�󇉬iŝg�.�p�iT��f����L����!�`>�$'�
+d��Y)�:�J���IT�F1Ai,	|l�Ϭ�`�B�*�Å�$߅=�=���u��"�~d�3گ������ ��@�4m4w�]i-Bt��k��o�'�%̲0�
�oc�L�S�J�F?X:]�~��=#��v�A�i ��q�ዘ�O��S[��`�.�t�Ny������}Ҿ���6��	����]q�a)����5��d����������-��d�hCgo0��
 4*����)i�]v:(����.���<w<�m4�V��� qMZ���'Tv�k���%�E�\�
+o�m��'����C�L��,�>�m�Od��33=��L�e��tn;J�8Ϟ
�W�V�S�g�Z=�^ը��j�#
��f �GH�����W����HA����`圯_��-bw�NӶ�\3o1 at .��j��G2

LV>S�9
�2
�o}��I<�ּ�i4�	�d]�+�k3V.}���t���Q�)����$�{�
ҦH�&
�58=�����L8cI`��ͼ���B�a��o�Q
�����u��,h
#����Si~P1丟�?��=��?�Se/�8�Nm�=v���PM��m|=�s��
�
�t�6�Ԛ<�؃Gߛԛ���b
#n�Vy��6��p�a�
+�~���ݥh�<�x�+��
+È���0[/�ʯ6��؃P��T�]��
+d
�U
��6*

_���] Ǽȗ�j}J� ���{��]��l����Y���/�qP���L��s���K���N�!]|8
+u���;�߯X��m�S�|��[���Q�}�8\���c��%��7v�'���8Li�=+��wI`�Ӎ�{5�|�F�/�Y
ka|5ex�F�?"
���~3o�_C�Ջ�pC��uS����%�����.)���.d-�M
-3CzW��#�4biH#3�v5�&#J�
|���X��Ϝ����4ɲQ(~p1TaC����b�
���uWB�
�$����i%SO��րD����*m|5��4Q��4�[Q7�bH1���}V��$�A�CԵ��	��Y�`pvI}�`cO%���v�m�Kr�{k��rc�n�'���t�CѡԸqp��+���L뛅�B-���sEzu+G�����b֢���F�~ &�hyX�%Z"�ᠠ��
��6r	GOd�
�OL�cN���?�m9ib
n���^7��M2D)_���Ҧ��~�����RI�w�z
+{v�aU)L�{�:��QJ��8����V�'8v�F%d���d�q�h�oܯ�s&d�O[�iG,�TP�[p#��PT���X素�^�ɪ^�S�o�!�a�^j��+H~U��o>'�N?I�Jk�?�5}
ȱ�Ƈ'ٙ�-c�h�4��?���-)m��t�ji
Z�B
�<���]�
�_�W��,
�����^ٰ�|�:_�a�����aǀ�c��/���Uk���җ-g���j�=�h���Y
}<R�nGQ^"u�
�0K�k���?�n�7�^~�a'�`6ySE����[ah
�+K3�k�(o*����{����E���d�/�����:�B~]L��K���<F�J���X%�z��
mk&8���z/6�}����A���i!�8��5��~�J�1k��
&�����:
L�����������a��g%S�T?Ѥ�����\�e�"�I����B1� "
�퉾�h0��(>,[n���
���� ��%�N�K�9{M<B����TYa˄
+�7tp�J5���{K@���O�nyg޾�-�tך��KRĉ�dp��MI;̪f����
�i�b��m
�P�.��|TX(^�> �����O��t�@�R~']�;��AStDK�G��$�صyY�b�9�#%�����h�mp�,����ٱ�(X;�J����b��)`<�A��������oU= �খ;�
1z��3��gf0�nX&�0Zzw��!e�ڭ�%����u��\5�Hcbߢ�rx��ܧ̸���֡k�.]�ZU5 ʵ��ῳ���i�~Q�xN>�\���1[2vJcm
�R�va��Ɵ�Z���4��Ui8��!:��
=�6��&S
ٱ�&\�g�Ͼ+��++�ʚq&�>�
��
����'�0�V�����zO#�nɌ�vK��+{~�Y:e���8d�i��V4�
�+�KY�-|qN����nw$Ƈ�?A}�해�Z��	̳����nm�(�'�?Fo�d�ݚ��Üϼ뽆��q#�"c^���v�$-ؖ{
z��<E�7�ڀ�.K��ȝX�x�!̅Cةߋ"�m���#�][��*�*��!
gd��\|O0G۾�	���
l��t��;��q���(o�~�D%��
uW�G�
�@�I�����bg��G<���ɓ�
w�O'U���wd����Z�e�?i(%&�Z�*\5��Q�J�X_շ�w�4�:EOlr}��ׇ������Sg�9+J����V}��S�[o���Q���Ղ��X;�չ�\���{�A(�E�E�����<���I_���|�u�E�Ќ,�!<���h�ĥ��kcz�4�>I��񩽦�>�#�<IïݼU5��#�i���8�@Inr�ܳ��I��
��P�3suڎ��#>�FV}�p�54|E�uj������^��V�~�c$�!h���.J��lt���i��I��6
�Q9c��`M��Ԏ���/���)4�;Nd�5����
#��	>��?��L�q�M}j��-F_�
D�]���Z�� �'����V.�
�cw�a��ץ!���;�ؘ�?���%p�~� [...]
+y���^!GĮ�Z���S�u^V]�x���u��Z=��1?�3r���R6���h����ܚ�
�l_O{-�"+��R	��9�
+\o!Q�9^��a�[-�<t�s�y�,��X"�ǝ;
�^���W�i��?��0�_�J��-\������K�.�/����7d
�Ϧ�z$�Kw�ތ@��֍ɳ�	�na����JB�m÷3fς��S~5>��[���Úz��;Խ|}�Pw5�X?n\
ˍ�
_�O�Ύp����<Z�g̺*�ӡ&���
l�#�a�o��;}��:�A5���V~o��;�I\��h\�]������D�h&��i�ޛ��j�u4ġn:{:n�_�<5��{�]5U���g��|൨ډ�}��1�@_WSvk�>��I�{���y6vq$�|L�����L[�����̂�7SF�80-9��]azЛX��T�9"M�W���fv80
H�ԭX��K#](�fj;�Э�������~8D/_:3@�t��O���
�O?�MMH;��̞	i����-
OC�.]Dq���
3���*.c=j��]^m��US��͜����ǀ'#�t�����﬛m�����>U�wH��Z����M�{^��DC=����lb'x�t [...]
+��6���
v�툇UA(M{���B'��f��ʥ�
6�f��)
+�yчx�� ����d(�:5�]�_���2	hVvC���ēz���PCGF
+�{���{$�לm�����
<����6y��w�
?t�}������Ά �:�g^�/�	�:e�D�7J��?�����~��x����L��N
��;�6S�6�/��b�36�(	��jO��GK+�Y��^�m8�Z�
8Z�����]o�9`���A�<�0����t���s�_u{_�{�g0�
W�Qn�j�D'=���o�;9ᄛÒX�
p�Y�3}�����'��m�B��n�9�
+ޟ�&F���½O�Yn"a�JFH��Bu�	s�����8?c���
,D6=	����91��"��P.T�GT7�`���@�x���s%�@�c��q�����װ}K����l[Ċ9bN���)�W~{B��3� �)�"1b�å>�>����~+*E_s��$�1�叽���w
+ǝZ��*+����}�lw�

����􄅔�0�թ���? cB
�M<(3	�kUװ�-\����|����1�v��V��R��;r�G먊e+xd���g
�����V�l�O+f���A/����m�[�~x�]�
+/i�)b��DjÖ�8գ]D
+����J��*ȡ�`�ۖ5� G�<�HJ��k�.��
��>l�_1y�y�D��C��z8$�����8��z
�Y������q��+*�^cAh�m����h���	o|W����#[u͵_����8�R����G�G3q��Xr�ȑ!���D%��99҉���?�9�B<����$����o��ӷ��"/fIZ�9s$��hai�_���)��ҟ���_O�NiH|���*�b���"�b�>�ּ�{�+L��B 36r�-p\����	������d|6-
+�ԓ�w%!-����W:�3�js���B���u������.��Vi�>yS��^}���
�B?�o��p�+g�
m��c����]c��
mb��Ů��82}rc��ӄ�V���Γ��
u��/�����#WW�
�.�z־���M���ai�n�g���]}�:�2�����.�$tw�d�H��k3��W�=��%ۣu�[�����E����g��?�%�kK�ܨO{�w8�2�"s���q�](%��3!����x���RBe����X��
��m.��%Xc��1s�����o
���B7A�u��P���jӑ��)�|�$d��r��=q� ���ꩭhK���p�a��o��ɤp���
{�ڈ���w
HZ�������(��>�B�uِ���7i�xI�̛�o�:�.��
)
C��KH��T
���
���	�%/,�ԐVT��reM]J�o/�Sxb�SU>�j���1�����䙽�?H���+��TΣg/�I�|�Z���W*#��o�U�f)?��F�~��=q���a�
��Ō��>/�[�JV#���ε0j.�
:r�u��݈3�%���w��1�0g��P��9���F2�����o��u��
�Fݗ�sB��2x��z�x�Z�5�nGT�
aY�ޣ��p�ni]\瘡�z�h�q��W$UW�ǹ�@�~$�G=e�
�ه�u��6��lov�����{�"}#�
���" *}��
��{?���wA]�3Sj/2g*M�Z�l�8�>R����}�֢���x̂H�A�EAQ0`@�Ϲ����>ㄷ�OuW՟	�퐹�\�"��p���YWC�d��
�x��,��Ӳ�y\\��l��P�ɔj���^.�Ԅ����L��|9���W]��J�S�
��4�" l����[�?a�݁E�QR�~g΀^
�h�
�{�^�P\P�����B7�5��e�B�'
o#�-������-r-
q��[�Rffih
+D�9�T^ѱɤ_�r���;G�NL��Jsݍ�����jD!Cx�2����|��<���Q�P�o��
���b9MN�Ǧ�r
\��
�g
Z�f�Q��b��%��J�
���b=I}�Ӣڞ��Ȉ�՘����'��n�-e+S2�ى2��ɕ�����
Z
+�\Q{r�۳�0����bR�RG9�|s��	j�
�
��ӳ�G��e��O�S)P����8h�i�����������v�Ev���R�+q:^�I�����0��T�M"�*��K���c��#_�#Oz�.�F���yQg|2��dZ�eeۮ�����n^:�<����m[�T4A����+u
�����IT�cv䞌iήyi6^�G4j_����zJ�;�^��^e�-�l�{��:4��b�EY�(�0V��4�J+��=&����ʷ�O$P�v�ǎڱ�z�t��q�tF
A����`�V
5b{Tq�X.�|�%W	>3�3$!��
+_yo�]��%4X��¤�uw�?9�s�������I����0�� �����i�]��`/ݕ=��\H��ћo����īx��U��:��)󎉧s{��
��W�9Q|4�
��VA��t_�m7���Aa�A1��y�~=�/%u�ϪM^��g�V���{�n#�5��sO��^V�z'�nq}~[���
�7���L���Sɫ�3n�%Q24�

��t
�"�]��+���#�S�ᆉsl�����Y��Z����PXk�=����_׾�/<*�G@�-wł����J��+u)��eU��f�����J�����f$�5
+ee���`����ݑ랶��Vy6v_Çd�@���z'���T�^�
�\�F.^dE����>q�����_�ʒ�j��,��)����
��	]���؂�ݚ
o�V

����c��SL��?��Q�55�������c��*�Td3�ב�
��~�e����J�Q\��R�,�<�{v�?��n���]�O�e�w��M���&ܞ<|J�Ur'�q�q�oR�N��@�;V�
i��Z��
���ATqP绨���%M��b�?iMl�V�1C��k�l�N�|6��,�;mfv�I�\N�:��L������
-a
Oa��	�1v���_�lN
Ѿ��3~���i�p˜�?�ôft at K��WGP=.�,L��k��k;2�r�q�ʗǮ>tսPS�2��Fm�y���[��)�P��Թ5Z�������;[��{��K
u
��%@��Q�����NY ��=��N��*5ʛ����B�
۸p�!��bm�Ca�k
�,j�:�>L1/�j�Q:-zpI��} �<��cBj
���l�O{��q��������%j��Z�[�,g�цr[3|�Šk�Gv�(�sa�
:���J&ɰ��풓�PMҘ��W_�.���z��`�2
�k��t��B�M
*F�|�/�`�4�Vd{�P�+A���}[�e� ��;ۑzOD6�+�1�k�}E�ɫ�$�k���3��n�R.�-ڶ�t'�Х6�
kTX48��b�V^�1�
d�kb�k���j
�XG���
FҔn�:.N�s	��i��(��o�}��d$�x�XbMl9&�AS��Z\�g�N3�
t+��9`y<E4�j
��Z�|ߋ�d]/h�H�{��:ci������*l&]�������%6z�#|��Վ#N �N'm���0���ͅ��;�]�
{
+���ơ
�
��o��'�� �&�:1�Š���4G�VD��y>&f����
�4�ǥ�����>�CYW�z֚l�B?���x�,�I���c�pY��\v ��P�=�cu>�h��cw#�o�
Zd?y�O�Q��5N"&ӞЬ�v��G��
+���5��F[^����1=:F�\�*��ߵ��W�%1̧ϳ��8g��3��zS}����V՛˱l�1;�ɝ����Td��X�S��כZ���\�[`����������±&
�ROY�>�]��]P"�����p6�zxU�˲��Nٹ�H�(2�;\�[�k��ɽ���L�qR�W��&{d����Y~�;�r��c���ќ|� E�`�,VJ,3vkKɼ܎�,
��lns���~�
{O���6��”�����\��oe�b0�Hizri��#�1�AE�@N$��OACH��S�Fǫ�V툱���^�iof������0~p�\���U�k}�
+n�de�L�U�œx\�b���;
m�D��h���ZNdhHo�-��.0���N�é�M�lO����v�,_�&;��
�������F�N�b3O|�]�b��(�h�@���#�hM�<Zv�FN���s`�
i��>���W������sy��㠾m���L,�i6.��ƚ�SK at r�YI(
�VՍ$X�BhߢC��(.n="�f�Y����,+
�s�����ȌFM��=���RR8�v�o�ppƲ�ƘŸO� ���2�W��?�ҩ��6
��':�S�Ǥ>\E�o��Ƨ�;*g+�āiv�5[dw8[��ȭ����]��ӝ�Fʗ�O3�*�M7
��GS������?0V]�����|;#���)�0G�(2[��2ܖOeQO�`��ά�C��v���s���:*�2��-�̧錕��,�ѩ[k',
r�U�#v<	|����^�F��^�#^ޣ��[*�"!5�_��g9��W
�k�����H}�v�Mx���������I�]��F�+�)�C{8D�-�l�I(
�ܴ�+K�d-:R��L�b
�|y�\%XY����H���[���r$q�(�����[�raq�z�6 at c��'�,�@Z��&UO������1 ��k0%~3z��j�p�b�
+�~N������@@
>/Uf�
+x��|a���ψ���~��mx4I)|.�c-(���ɚ��{a��E���K��mA��I�����X?ݢ����[QJ��:ea�<$a�b��^<|��s�2��U';��z,�������ϭ"~J���]v�Z�ک�J+�4ǥO0|p<�v7wD�
�Q7io����Z��4�[������P���� 5c��0A9�ɗ�>B���6)v���GaX_��V
�k�ݍ�H؃Im���;X7��x`�ބ�T�ڼZ�������ן��By2�l��
�i�ʼ�2�"y���4
M��
����*$v������C�` ����x��ƛ��*FiNw��SH��fm�3�>�ۥ
+��Ok1.���4Y轪lr��]��e���|FK� ��
��堥�lݳ��e]����=	[V�9��g>[~�)<%�ӰǸ�
���?LG
���ّؖ���_��M�����Y�6���[���/�)-1pT��"�0�7��
R �Ǡ:�5�.�

y!�͕��u�����})_�Z��I
�
���vR�г�5�Z��V�"Ճu��
�
+(���h���K8�`M��?��ÿ]��r+Im���SOl?TtS

���kB�b+^��u�1��.!O�7
���@\��D���޻�qQ���ֹ�>��#�\L�w���P*�Q�k8�}"N^m|��K��H��~�/8�(-�i�%�@o��g�?��i���Ik��3z��kt�薞s|��dV��6�#j{M���ꀲ���\g���u
g��u3�x����i]r��/'�^wF��ŝ�-[M��ơ��ہ9����gpO��9v���VL��W�59��9��0�����`��:E��;Ms�Wժ�����>��1?�
+��tmc;Q]�'
��n��
oJ>r����XEp���ŭ=o��~�� �s�-��Aߞ��K�YX�!��I�,��-s��M ��U�ss(4���t��6�.g.���Y{�׆�X=GF��ҿ��̭�����b*$c�L xK�r�a��`����lM��QL
�
�]I�G�[7��

+S+�S���Ėc�ɯYA
y�neLJ�R
�!1���|
҅￙G�%�~�d �]�a��B���ܵC�4
@�w�ܟ�6	������"r�-�m�
x�χ�T�,�
j+iE�B�7�_W?G3�М��C����F��'!.�bd�\��'�a*w�ј�������
u��"�x�A�+o�0�n�H��7)Q�]��X0�<�,���F|�o��}8f �����1'��k��u(j{9�),�J^h�#���
ĿH���ֱ��\'������'{�Rn{� ��.������INJ�
L������:���֍�������
��Xs]�O� ��4��ͱ�W#��R�:r��s�S��%�%��.\��q��O��H1���Z�W� �[*
�׿8��B�=+-�U��,xCX/�]O�	��59��Gq�[���|w5&'� �VU���r 5£x��+�u��cU�!�$�1�
���?y������\'��lf����ϵd�
k��J��Ѵ.����&V]+�ڰJ$�r�Ϳ+Ju�p��>=����J�
�f�`�r��^�R��
��}�	�
jo8�f��M�V�ה$�dhe����9��k/H�p�Z�iy C$�c��x�v_'pt��d!�߰-��Gg�Fm�0�_P��q��&�u�M�ŏ)�2�q'��o���J�;
�+��1g�`�	wf���2q�Z�kQ;Ğ
�x0���e���nz�Te[Uj�u6 J}��qy��EK�
���uxG¿�Ŏ�Uy
ҭ�r�.'�-�K��ؓ�
� ��U��N67]�J�"��C��'�e��1𜹒�I�-�,��S�1@��l�����[ᝯ9�!7A��V+�	���
�؏fl��
C��ù��-uDUƐۥ*�W!f�9��MG�%���5�<��xP�f�O��ܫt�qj
��!!��toF^�ܓNf�ݜ�H8[W�[Ӧ$F˼�`�3�b���^-i(m�J
�t*G�&�k��cr at 7��~���:
1�Zu� jNn�jT��9�꛾�;�3��U �S�
�G�=��~o�O�8$�yNJ��!�4��k��+
���R*+^�M��:n�A�}}:
w
�q��/�)��&6�gԭ^׮��b��]f�`���#,�
��a�+�
+2~�y: �|�fP�c%���
�{��e�Hl����Z]H��PrO8:���G�
j1�|�L��#.�ݬZ�V�&;n
�'ٛ�?�
�h =k�ph�.:ޔ�!�����
(�h��ܙ�tr.
D*���i+�I8yz�k���
�e_��::
j
+z���F$�WZ|�#�yd z����y�
�6�w��]�� X�4�M�k�Z�S�S}�[�k?�M���3jub3´�b�ݝ�'�+{mN��xRX�v�R���aN�\��A��N�������"o�i�Y3
o��)��ZK`~��J�T�!�t��G�{��N��N4j"�ZOc����]j�q��#�Nүk�&.�,���D
�GS�������'LÎHEa�i�Í�X�
f�C�,�e�tT�<�4��
1x?1y�n�Qv��{)jvq�EN�|���Cp�c�|��)��m�ފ���B}!�qro�]T!:�r��+b%��s���X�
Bi��Iڮ�ܣݸp��V��Xc�1� �:��Q�lx
�ư���pwP�9���s<z|=��
^���\�1�jY�J;�L-�2�E�fN��0�߇���ʴ�!�%����?����D-������ DX�]N��X�iVGc�vP&"��f
B���xN�ۆ+'�G+(����T���u�x����<uȫ��zC{�rt
�[X�=i��#�yX�RL�l#=��kyp����ȒW���s!藭@$���R��2�k���+�~�f��Y��IZ����櫄���Z	�Wʬ!Pl{���O�w�
�^F	i�G��}m�|�YZ�W�r
�a��Y�����1�<�ɉ�3��v�s���A�0	f�Q�Z��g�ڠ"B��8
l�[n	�9�n��z��ff����Ml��)Fa*D�����&%b��!cT컒��)�
���2���+�b�m�'k�Q���!>]~�n-i/�B�v(4�b �&�
�+B`��J|�W�(�2��+N>��Ѿ$�K��
�[�>പ�z��1���]��`�|:p
F�l�`U̎-��:�
+���
����ڰ�5Ǡ�2.Ua�D)���P���N�
+9��q����b߽����VZ#
My5�اw�f�&ұY���;�7c��T������T�*R�
~\Z&�ѓ��ґ�Q#
���?&�M���>
�'��B
q:&�E�3b6��
�2
F�]�=vֺꌁ0�>�"�d=b�>��J��d�&,�]�7��/r�C
�4C
>CyWٲ����
��/��	�p}~��{���أΚ�=FCa���d���bb�A5�$�1�����w>�x�p��cҤ.Ď���"�N���"o�,�~K�
so�.�=�p��4�#�\B?���e;�u�cZu����j���+���B��j��!
�\���4�k����
+��u�p�=��<:KcD�9Q���'?\�5���"��tr|(�Ѐ��Xʔ����

�o�;R�N
���D�\}���To�z%��h�ƘMb���Tn���bnYE�Q|�Z�\�T{��v3�F�T�z#J��;!�CoT5�
������5���X�Ӏ��~��޸���H����z�P���
^�7��Ó�E<�.�
�[�$�o�n*Ց��K��A��r�=�)as�G

!xm@��rQ�q����}��Ko��kT�f�W�$
+��W�ܹ/ث=�o�rBU_
[�y�2��.
+�JvX���;���8}w���]�(�wt���Q>�����<Te*�+
H�
�0��ԭ�k���p�sQ��Q���	
�
��g�E���Ӵ�\��6#�Gu
(}-�Þ�*�
�
���M�g}����+SXr�5�-��>\��<b��?�[>E��
��zZ����\6���5<݄w�0�?oUD�����^�v����z����@sn�1-+�xb�b�<�ոF��
�
Ǖ��E��590=����M�fo}�2g��6�5]j��>7s�*�1�%�X�����
P��TW�WL�i��?�h�V
+V��zg`X�����f�N�):���oY�ǵ�|�d��� CLC at +���S�+϶*:�Վ$6�k�Y�Id?;�Y�׮�9��+-A�7ao#���:�2�׬����?��x��iJ˽���%�&k�^C(�ڤrm��Et,�zΩ�mR��?V��ҤbWC�M�0X�b`�@6Mr_�

�_����Q�S�	���C��̉�U�X5$��}��.�1���5�S�
��Dӫ�W}
L��fb�#-�#C
+�-�;"{/���$	��mP�!�w��T��B�,�f��GK���’�ms�����~	�}�A�5�]6�zw�t�~I�.K�l8+�a�Z�$!����W����z���������5a_|��P����Ï�w���'�����Uү���[�׳4�r��ؒ l
+�0�Ulr��p�n!`�^�1�
b�68�ؙ
1�6���$�p�w=-��4l���j��#r#
FBp� u��ʊd�#��~����3^��+
���,�4YZ
����q82m��
�iX��oJ�>�+�E��آ���
�
3 at w��������
A��8�+�Ju(�{7"�N�Am�o>Y��K2�I��޳�i#=�䐙���&
�0��,�˨U�
��nO�~�W�N$�u�2�r��VK������8M��
�����,����w���R�\��ͭ�S�`҉)]�.[��ɚ���F������A;nj���Lc
rP�7���ܫ'䈙
����WۍF�s8��l�>T�T'�tm�H.�n�~��R�
"O�����2E���IJR�� c�r
��i�T�6��r
���
�5�%��&(�
2�K�FF����� �I��+�<
�w�����~�W���(�j��jS�*��I8lnEїK2
��i$�-��I٦tk�{u�/YS܁s����^,QQV��ަv�q�GD9/~��
N@D�L��T|ϠEs��e����$���J���-������Vu	V�bϗ�d����\G�?�	���j)����?� �4�r����
������>԰���\�C{�j�P&k��4�3��7��
j��FS�P����J���7]̾�zK�-�q�
�>�q�� ��U;!��GI3�L֣����I�7�Ojt'�ε�ԃ�$����m����}�wq�@*�9��r��.���6gm��p��&���lȚ��잼����^J�
ه���Kl��R���m్o��׳v��:��}��V��vt9R
N=�
��9Tgv�{���
��[c	73���*��b-���k�/���U �x��/)�|ZUa�[��Ձ��*������K�l�><j���V�7V]E�P[BU�>CW�ã����,�@&�%5���Dh{j`w
=��Cb��%�p��W�H��i6ʌjim
D?��4�d�\�v�
���Y�m����ve�f�tD�NNk�<���m*Q9vh
��|2ٝ�@������|,}�l 
�F��:�T��:���z6_�e*��_;�$��}9��l5��޽���(�E�K����
+�xR���O����Q��3�����ULg����g��~O��U1��c'�o�~��n��޺�p�}ww!wP�f /�7�n���7��8�wX;⢰r;ռ����̽���Al�MHc쏚���w�� ?L�;hf�&�
4�D��%�
43�/6�O����F�o+���LG�_k��v���~��ߗ�m��]/I�
��;}��zf�_l����/1����43�/6�/��G���j���/��������� �������~��������'��|���vٔ&����u���RBd���M����n\��n�:q>2
�7�OyE�Ly	^����a?����:d�?oO���	��R=?i���>׺�.�Z�
���
���;_
+�V�\��b7�`���צ�g��W�W<Ħ]�/�^�?<uR�#z��?����`9|\z��Ɨ�}cRPvrO�z�Mt�d�e�b��{���<��Okn�����Spo2�6}|#��n�'�
c����Z>���:�`�?�x9��x�m���v��u
zυZ�ij�bw1�壯���ڊ
+�߄
�M)�c�7����1�ۯ�ڙ�O����Xz��τ�͡���ʞ�`z�B��h�{ ����Q��n�����{�~6$P���yfi�t���c1⒈9�J�i�����!�#:N����`�^�����=�d��gh�絝^�hg
+	����
�B���?�ͥ{����
+�׭�/���F9�r�Z��A��b
+/�g�̆d�h�
�7�׷��wm[U��\~`%�G �����)����s��7�����w՝
;��F���͞vӴ��X��eol\�իyw=���B�����;\�6�4���h:�1<�����
 ����g��}�@��3y�Z�j溳��>��^T^k���P�Ǽ��n�?��
���??�_�@½�@E�L�5ُ��
]%۾�p+�l�������Vn0%��Е�1�4�Z���_i�zlO�
7WU�h*����!�LҾ��2┨jIs��܉Cn8�������4��5�nu�:K�x��]5M��g�p���
J[�m���g{�~�.};K����@�\;�r$>c�N�$ϧs%�]:�㡰�e��E��VY��?U�.1m��0m5�S�[�U�  U~��<�V�����
��I3Wn'��A]�wޟ�
�T��|>F�3�`"�T�]�jocBʣ4)&��bsb at Jv��Ih���q�Lp�C��@��~�Dkͻ��*n�N��[�Z
?Y٨KM�c�+'{��)W�V [...]
�2ԏyv^�\&��e���
+�en�$���K���]�~V���B�?fg0�
�ώꓒE?���}���d$��,->P.׆O{��tlՏ���
+3 ew�g
+]��TOCf
K���O�
�m�N�f9�{.+�C<
��=��/bυ��) 6�v�12=Y��T��o�;
9/7:;�tY۳�e�t��n._�ݡ�� �6?
N3����w�w���� ?L����Y��
�����
=S����h~��K��	�����k��_}��R�������/5����Kzf�_l����g�����f����m���h'��ӧ���
p9��P8 �����c�5<����8�G��ض��:8�s��^a�u�\.�p4
vY���SY��&d��:�Q��'`������O�[J��C�)�
a���Z�PظZ�
+�fa�܌�}� ��c���}U\^�v����Nl�-��s��i"�}|�Oq�O����>���)��o�w:,
�zZ��&/�D�參�t��bVl{��gـN%�
O�S��i�����)Q��=��3 at JT�>�vPMi�[੗(�����{�ט�E�xm'{� �}ym�O%�L�Qa�"��R�F���c���:	��
��<���$�����}T�W
�'�r�ǕW�}F^���o�Ks���:�I�@i��*E��gs�����(��z�����P�/?���
+�4�����B���i�t�Ń k�t������������g�)PZή�����<L{\�=Z<����P[0�9|�Q����U�i�.�ޫ�R�6����<w>�A�n�#��
+)_<
㞛\��� �:>*=�Ev�n@�ԓ�ld�z�9�/?
i%��I��i�*�TQ���L��@�R.b�l�|��0��B���=d��
Wl/..`�2{���+��-�kE㒹4�Q
�}4�q���!c�Kϯ+�\۾�s��Xl�|���F�(hs|z�u�X���;���j_.;�歽�Ú~��r4���;o���?M��MqB�/��C�N�n^g��?앻Q��qg����u�A/���
�s��;�")x�, ��W
�Z=
�L��.~Щ.�#���W��S��i�BP�I��=g� {'����'ȱ�'���-��8�S�f-����ۍQj�����K�x�������r*�MA�_k �s�oBN��<�O�诒&���}s��Ub���~'͓��_�z
�����P�)0��2Z~�e\M��`�Dq`�C����E�G��/֞@��u艹�H��[��w��lX�ćf�ڦp����ص&�fPk���18���LkX�4�T��3X�uy�3S)[�*"�^~$P_��K�I�]ي�i
^��qs���e�����bi9kEu@�Re��q\�4�w��2����Tѕ�i��R�I��lE\����b�y�/A��R�52i&[���'1(��M�0\A�a0���-��|O.O��{[�n
D�J6�ܻ"/��K�J�I(fq�z��b��`��V��d�?lJ �TJ�쎞cD�7s�x��E]�Ch=���
�N;�;�<6NC,5X
��4�Ƣ�{��*��2Fy���I	��{��5��� �����t��
O�]tY7�G:�̑ �u����s'/��]Z�&q�Uj���
ޗ%��� L��	Ğ�K�U·�f����������9-�o��
�P`��=���߱���$��*oHN�\�t�Js�� .MAc��
^l'����x��'����m����
�P���ݣ���;����6:\/��2��v���1+m+
U�Qc�Cj�e���g��
��e#QH�7�D�ՙt ��u��U#3��`���
!@�ժ&,��:��?|��X���E��P⦐�3��ɠV��$7�ʜ,�
K��k��ָ?֝�-�}t�뼇0��=� ���ux�4>�(i��t&����g�7|=�^@���v�֓���Ug�F>��5�Z���iՈp�>��>ބ��ϛ~��:��\'\#^#���/A����w�� ?L�;hf�&�
4��b��w�L����������� ���o43�/6�/��#zf�_l�������fz�_k�7���k��~�X�
���/��(X��S��yv�)�+����z
�Nh�/���~�,-/��
�ɷ�SJ���`s?E�Ƭ,NN����L�D��݉W�k�f����?)M�M$iDǔ&R>?���9ȶr9j�J
+�b;�Z�^��k����\u�n����z�>mL7J9���3�5/��]z���!^�`�8̮�?�
����$j�z~N)Q�vz�����;�R�>�>�j��>u�/��#��3:���v��]�k�
|�o
c�]�F�\��Z�p|��
w�]
�Ï@Z�S�o�&�D��u��j-�{����/&�k�
uN�n>9ګ��]1v�N��d�8�]xm�{s^�㺶�H���|��z�8�m�l��o���.|��M�F4�6��=�� ���8���Y�r��9E�)�,��������s�p㝌g�N?�m��β�~�1x���/�����f�d���ΰ���
����?�^��ZA���h ����l�;��$x
M��_�w'&�ٍ���v�5�修�*W��*~�����a�@'ƈ�x�#��������_�)�s�k�����Z�u�jDM���-
1Ϟ�;P��|�=�Ȅ���_mv+���kX��10���Y/�V8��7���7� ���K�/��%�	����z�?{�
1�j [...]
��.\���.����?��t��:������wbݷ3�)
�w>�_�IL��F�h��V]��5�A��D�JGZ�NMA��^Z�V��
^,쫼PrB�g�;)�P�=H������q
+'8i�,��(�2�;�`{�f������ZG�S����T
�M�'��
�
��D
!\��+L�ïU��M�����
'�K*�5�7!|�$h�D��׃�K$�)�w�T�E�O۾���,O�;
��j��oeH:U��-i�Uzb��B���<�5`��/�9q��b;� l�6
�` ?	��
iT���|�X������FW
+��g�v9�uȮ�J</��\I���3�	�'*�~���`�T�f�Qg���ζ�a�ѫ��[O!�J��fL�1d�?o�	�^�b�<�72^y֝���Jn2stUқ��TY�%�v#�E��
��ƵZܝ���q`���E?U?���M%��������-P�1^$W����h�%�E��N_Wkq���'�h���SZy��T����6�f�[�Q�<zn�}�})�$���N$
[gP�
�V�+A�؍(cô�����G �O{ľ���Nm+;������:�h JGKl5���:�x�:�Ic�$�����&*��
+�ik��}��W�
0�������'s� y��9d�?oO��{Sd+�����F��gu�r�Cǰ �
���h�TcHj�0D�
񸀿D,�2����
0���t2�u}�	y#�Doi�F����G -�c�~ç����R�wݾ����x
�V8��E(����~QDž�)��	g{:�nw�^�<q���J\�i�T
��x�^��u{i
[�P|�,��	߈~ʹF�Q����O��D��f�a��A���_j��R����f����I_~���h���Z���v��J����]�
����$`���/���4��&����7�V��������^DE@��E��
��}�N���V����F�#�c43����H�3!M�޼�:��M؊O,��g�1)hy8�B�4��}֯S�֗v���t���OO�
+A�����OI�^M������'���Y!��Q���!�W˞�~t��j����9g�ɤ���[-Ө.��Ύ&�*��E�؋�5߆w
1%<
+�1�'�a�՚ ��|VG�W����A�t-.���'��WV�[$�txze���t��=�/��Ŝ�{��&���O���dT�7 �1��ޗc��]�kL�
Gx�'��(g�a�>���>fP����Z��'��xJ7���.uKyا�s��-v����y�����N3}y2j咣78��Z��g\���y�>�vb�Xrd��͍w��!��
�4F���a�n�����~�7����0���0vji�-r�ߝ��i,��������x۫��c���Hv��yӪ5t�;J������-��(��g���-��q��Ƴ��.=+���q]l�;��\��}[�t�x �_�6-c٘_4A���::�1�t�yW��o�-��`m
ׯ�q��H at _ Z=�̀
�>П��-��I :�&o���P�b׫6�k'�Z�oC���+j�4�\�ֲj�`�A�Tiwn���emxZ����5���;�
�������&]CJ��T�ju�=�d/��noӀ�ú����!v�.1: [...]
:[�kvI���z��wQ1t��tt&��ꒋ��_��?Eu��(�U��>O1uW
�r�	فo�޴ˏ]钲��i�U��g���&
+�*l)�H��CZ��?u��Y�aU�
�F�
�j����DL��4ŵ�lV�ɨ�����}�l����-�'
mk�����i]Y��.�FT���ڊo&/��	�"ˑuم�Ʋ#j�eg�Q�	��?ztN���������zyzp*m�r��:�K�v�-��.k��B�M[�Z�3>����
+�6�����I�
��I��=i��l�Lll��!�\���[�G���^W�k)͎kf7ɹR%,�׾׼B�K�ήO�,�>
���.�"'ŗ��M�,W+���].������8��7Ǚ��d���3���%�CS��k�ĸ6r�'�w�;:|�}���|��d|n�e�Ř��fe���=��U�p�ݜ�]�>_$����8����
]����EߟhZ_
�
	�/?�u��
�^o��#�|\S##��a
v��|ÞLaԸM7ԁlݧj���$�f
m��7砏m���ٓMz�5zV\��ty>�������^������sK5�ǵ�=9.>��{��Z�5�h<߅�ZG(��Tn��%ly�d�r�r
+g�=Y��A289���x:+�{��75�.��<]V
p��:�>@s@�O�
+h��0�q*
���_X�2
�S`��#Q`�	H�uA�;oX(��*�廬xڎ/��2x�@?
��lz���\ٓS'\O���f���g�����}Du�Wo����iHUJ���؅����V9?�@~>�q���
#L�+_\>Or}��V��X0��B~�K@��=٧��3��E�||�R-�$&7���C�^9���\��t�*��u�u�ݬfTʜ�P���%m��=]6z��Г�E����t9�c��g�R-��eI��ekr{�I
�G�E���~�q�ѳ�|��d��ڕ���t`
�f�Vlo%m��U��ge��y7~�<&��<gg�H�
KOW�L�
+�^��4���4_&}hZ"�
�]�J�:��w���T *�<�!^�‚V��0}?k����-�Kb�s]`�ݕ�9�0�����b�;m�=�����d������D��=A�%e�E�2Ed�Vz����1�Tr�!�j���/}��'�1דFD�� ����pDy����hZX2�Ns=[0Ku*��;����!�'
���|m]�*9c}����7��&6
�S�Ҳav>�$�?�=��q^�dJ��j7\�����,P��J�1'��l�gV�N��'I��@�
=xM�OyLu/*n���5�#[��J�L��U7�������~��[H@?���#z]��X���
�Ih�;�koaģ���(�ahy�?&D�`h�|+��
+0�1���SV(�Yqh3Z�G��h]��Jh�$�����0:c�ٗ^f����
+����.�
$g
gQ��^�&���7��CsK(����m7l$Ύ��W>�Ç�L�2)M���l�������l���	�OH@�*��2JKq��x�p�
���V ���~.3��
�B��xݳ�-ru���i/
Ζ�
�&�G{N���@�2�7���h戃~2<D�#�|*ܘ�`��a1z�׊��o!}
���74�?��&���S�oh���"�
��_n�����_�����6��f�/7��Z���
2������h9b2	4O��j ͍4E�y�l�4��ѷ-���SN�OǜN�Tt>�.�o���j�~_����R�ܙ��Q��r��>D��\�=�5�H\�W�m�N۱X���-�
���&I���⠝(�7�s
+�
�F��l<	�YO���f��C��y���L����ԧ�s��U�鄥g�Eg�p�ރٟ���[c&��)_�4�s�x�-H��f
}
OӾ����4f6��
��w�Кx���ۘ�Ì��K$���(.�
�����h��qeX:�j�־����a�?Yݮ�lm	G����N�b��ur2�W�J5�d�[[wzmW_��%��S���/*�����B5�i}�C�m���P@)�#�-��m䕫{���N� �
����ʪi at K �Y��s��;��E_<��^���A�g7`���E�b& ١���#.o�ʗ(��W#�I
�;�
m(
ݶ
�L*��'�Z����Xd.�(�λ;�Xٽv8�A
T%���i\��`�����;�u<��W,y���
G���G�U�����(�|������j��?�}/{{�R%�o��g����S��ќ��i�V�

��4~�����JߏF�i�q��:�
.r���R�G1�e�����v�!v�k}[|�- Z����w�t+�8^
|X�	��Y.�^ﱱ�1
d$k�T[> �BݍK'U5���2�S�\GmK�
+q0�o���$���o!.���C4� �,>����:������ګ���e�[��$]���ڻ�/�%�����m}���˞��
+�̒��i����&��HT�PX)$P�o ����oq��d at U�@TԂ�j|�F�9_�rv�9�0�v
��e������q�1�
��X�ܛ�r�1��_�IU~�.�ur���T�|ԑ9sӔ~��l�?O �>ف�g���o�}���=���s���lϫ�yy5�Ksf�
Y2�ø:WA�:��gh.�p�YcEc��sV�/��S�Y1j$�����o .�6�V/�I�}6��Uf��k)�}6%(sO>�rP�4�./e'6$q�dx���8,ק[30(��'�` ���Ny�J�A$/ٕ���>��@Ԥe�h��"�<��hC�~6��A�ϕ�֊�Ǻ�J�p],��ҾJ��ĢGR�(r�}B�j�x���k�����"Vu8��_Y�@���-9&^m�E�I
IY���k���$w>�FR��9��A��hcDq8�l��j�w�d�܊���"�=3
*w��HD�׈���hU��e�S��6;������镩2ǻ#�I�I�'@,��
�q���~�N�m�5+T\+�7q�� [...]
���9�b`���p��4$)~��H��y P��`��w�e�#Lz<�&�Aӛ�|�Xu��yF��淐��q%f	� 
/�-�9�D\�:���������J9��i:N��
����BN{�Gt��p���}��쿩����Y��~�_}���>f�)�Ԫ��Sf7��������O�%
�N'0�
��޼�d�<��l�[j㐻YME�@M��
�mt��ǭ�d �ߢ�ڙ�׃��V�p�~M�Y��5�O:K\�ЯJ���R��`GSq����𙣏[�aB
+"9����g�hz������T>�%
GK�3-�
>�,�F�6/�T��V�-��O���B&ݠ;&��`F�͚������[t ��|v`�㚺����Z��
��ڸ�
�`��@���H�6/��u��
��a��SرH_�Zy�>
0Y��u�C>�pG&�N#^�rFl7�� ����?ֵT� �r��/��u�:� �/�ScyT�z�r�ӕo,zWv4�T�?�E+H�N��LWR&Gu�ja"�\�T�
+�}�˭.�&[��1���B�ˏ� n�yp��CP���m����anF'a��
��U��D����o���|O0�ѹ�3����+����X��[^^d�/��P&3�.��L�T�Ry�˗���t�*+�Ͻ2<_��<r��UN�£<���H�Iy���ڰɮ�0��~;c��9��3ս���@	\r���^�݈�{��N-
�z�����|
���� ç��5/���Ϙ��J:���Sc�#6
+���$�ﳩV�e�Zm=���
+u�Lu���=�*�#qs��9ο)7⊗�����f�U��
���'��g���ŵ"LJ��<�*Ʀy$��F�r�'p�J|�<�-�9�dJ�nF����6x�%���%����u �~sK
~
[�",�X5"���
��*�9�
�o��s
	������b�t��g���m8�U����{y�U6
+C:��(
+in&$ě�xzB(|.�il�ZsԳ�%�a��J�0Z(q���0��pw�a���M��a^j7GK���ކծ4�_8^(&56-
��eb@�P'j��Pm& �*�����w1��!(/?��[pAG��n<|8��Y	]|VBsd�&��Z�I-����6�
	�W��w$�u�l �Y�
+�M�8�u��=�	��Dc���5���}gG��
+�+#oM�!;Rj"is��HϺ���
� ,F}� �>�#���:$~1<����Z
��\k8B��\�t�su�
����d!|#x#�b���ح����ѝ��\dVaul�K
+vOm��FK=�V�p�w����3R�B+��� ޟH���'�oh����~���|����f�Ǣ������W��5��w�i&��r�����C�h��V�Gz
e�b>�\�Q'W��
dk>���1y�f>�[����xeG�
oK�\:?فr���
h}dV:Z�LŴ^��
+���l�r3`Jt
1���^�
 � 
iP����Z��O���D-���Z�]<�
�0@si�㇋˺�l)ܬ���9#�j�g����R��.�
%�!0���K��y����~��=bX4��S
] :c�Ϫ-GCh�!P
i"w��Հ(�{
}���������|jq�Vc����Y�����;
�?4+M<�VzPw�m�_�lp���y���"}
~�J(8��K�Y��W�y
�G�V���f
D�VǛ����-�3�(+����s���s�+־���c��$ ���YV�����+����$��o!�p�?N���I�
��X�4��uKp=�����^�h
��Y�u�B;��`����ꚓ�}�y&�L"��f������#�	e��"����Y�UJ�?���T�+�Q�S�AU����s.��Z���̟���ҬBЩ�7yԭU�#d�e��2=��(Rߚ���p*�hS�����f���]��P3�s�����c�[��+퀌�
sC�D���$�U\1z\q��������Z��P*w�S��\g�O��
/��~ne�:o���Z�]��1�,�i[;��4ZK����Q?ʵ���4=V�-�QS@ʠͷ��S��O��W�{pG~6�r��,��xJt=[ؠW��){��h���gF��2ZK?.2�
�՚���*��Rޥ�o��I��X7La�'$�_��D
ߞ0�x��J��?�Ky��z���sI>s{��rP8�[�[� ��kV>Wč�����>���WT�� q>S�ƒQ*�-'�Ӳ,�'z'nĂ�V�@Z���ė���DwH��\� 4w~W��!�
�0����-���r�_�
+
9���4�#m]cF��{�n��)�u#6>�R�������ɯ�k ' a�VD�	k^/���B\N�)�ɂ���"�� �f�L\7 
�'�{\!��{�[�f5�o�{V�t{:?������r��@����C�
�5�]L�q�X��L�L�)pt��t~���K��?����'?p�Ic��U[�=�=Ͻ'��=(���{*5�W���b�<>�Wk�F[���`��	;zWT�gO8����`"���Әc�Tij�[��~?5?���� ��k��`�R��!<��
��7��g�Wq��XfҮ��V?�񶾅3Ú�ZUjb�
AkJm��{�ZM
.�ÔX܍�bqW>�z^�]�[
+�����,���|�I>�\�
��8
�Z�E�c�d0�=�>N�{%���Lbam ��a�e�}�*�<�U��r�k��r��^DL�ǨEc��:=�C���,�
����?�6�\\�
@ԞO��S�j�j�,�n��&�A��
�}0�o�F���D��>��"7�0����/�ҨΤ�G{�E��>����
+yvF*�y���
�r��Cl��ׄT;��6ԓCs��0�l��N�\7�<�f�:�=�Kz�w�Y��YYq?�fy���@
�JnS���L��\�24ӣ����jZ�
�.F�:����
����!>�ɷlƵ�|tŐ
��i�ʱy����ĵ� �?fR�Ku[~Rz���`B�Ԋ���
��Kω��gµ@�>_��I��8#��uIާ����
˿G�Sp���U)�~vN�6����wt���5a�t^/�h�W�S7�;S�H���cmp�5��s�T��9o��ꂞL�H3Gn�L�POlg��El�3��xO�B9�V���̣���*n\���`��*�k3��s^f�<�kQ6�X2�uU��H�G%�k{+\�9�>7v�]�1�>�i1_9"M��(�
���fպK0�ܨ8�}���:|qy;a��a]���q��ncᕻ>jzVQ��_	�<تm�r����N|=n[�m�x���u���pnD��ً�v�̘X�
+�a�jx.�0낏�z99�7��~��e�_~2X������1.F
�
xg�2�F_†��5S�“�rٳ�7��n���Ü��:�(�g�{�:����}�	
p�O$�‹�T
���
+V�*m��(��U��W�U\�N5�+;N`-�;�������Tt�ȅ	�$�
n��¡`��:
�ǖ�mY�ܞ�&0?��	A��釘��ܱ�6�F��+�������J��
�_H@?��
qe��AU��}˒�rn�v(�݌"�
�D�}���r�BW�����Mc��D1�5�ժ2�ݻ����p�Z��%C\���,_
�\�F<��G�����n�H at _P��œ���K���FT*�{�t
E�u�"�cUN�,���;L�
����1UO1��/�T�\ᳫ��.oi���<]-��(0?o�
	h�
uҝ��.u�aϫݐ'�y��Zs����4����TA�M��w�0R�-��:_������qb�ĸ�!�ZyOQ�}�������;��	a�A;�p��+H,uv������?!�i��	�O��%��WC`X�����I~
+8�6�T�,`X�ϫ�M�v�2I�獱E?�xU��X�i
��lOޣQ3�����C�.L�-MP
+Ss$u��C���@�P��-L�-���n
��:�+}���8nˬ�+������'�L|×y��Z��~ܳ��nW3JّB
I���g
�3 �Šo,�a��h�NC�gM�do��O{�a8�-�
F啮>EX�s\�)Ձ!��\:�SJ�
f��AN%|Q}lQ��
�^�@�ZႤO��(�A�`�{���
=k�{�f�}���L��V��EW�w���q�}��B��?!���'�RC-ƥfg��G;�s
�K�x��
�D�i�t
�C-s����m#��v�'
+�ț8��\�EL\�
��ҽ�^m��_�qms�p�ݵ2�t皚] ���]}k[?��ŗ&�)�S�oh��?��f�Ǣ��L@�X������
��������K
����� �wX �m/�K^|E��A�G�^
+G�m3Ȍ�}?�P���H���hn���-��k��׊Z��k�|p�v��y��ůJ��Ws�
]����h��(���ËK9.g&  )˛���5��
���
� �&=�}�x�1�ڬ��+s,.��\�s�jRr�Rr��9����0\<����&��m�I��+���/J���
�%�X�%�p��˻�Y�%�2v�Zqs�?�~������rkP�
x��h:��z�;�ku��q�]9��H:�ş;�
�օ{�o�A�']*9:3�ͣ�z
����z帴�-A�l��9S��X�L	��f\ơ��Lн�?�íPoЈx��sg�0�.���q{1�4�����k��8��m^Ϗu22�{�ՙ5m���M[ڡ'���Qeł��z����E�[� �:��}��X���]�&�	(ܾG�FO:]0������sgU��
VE�v嶶����
��9F�n��}����#��n�����H@*�Kr�o��
+D��%�q���}
Nq%ٍ
��ݣZ�
�u����g�Pܭd�ԵF��K��WvO�
+�
+�.�+�Gs�N9�%�^�m� �^s�% UV�)}�'�6.�*��|�Ye�|��l������B����������������5���]�YUG�����<%,�7����g��}�:\$�-ߏ�;���(s�f�kU�a%0��
_�.~��
+���g��a���q�O+�?��<������F���%p�\�b�iGF�
�Ӿ�G�1o�Q�k,���)O�ԙ�#��z�%��J!�"_�/i�:m)l���#�<���D�i=��;P�<��Y� �����Cһ#��#��dʫh��>���2��U��uv�n
�A���O��s[�g=Yx�j�~�+3!��x��(�#V7���������<rq�}�����qE�
?�&<�˸��
�{�u��|�ӏ��m�x�
9nޜ7%}����
KU�hN�oIj)g���K�1�p��DZ�,����:y����e��0	���
 �b�(ꇟ�fK���
>�p2O���ߟz�
+s9��J��Hh%c���yS�\�
7�gn��3�m�W��J�T6���E�����:�h��לł'7
���� D�ÿD�ŃQ�����@U��(�\<ύrO�_ZPTy��Շ�s��	�[����!yU2[J�d�j`�7m:]��,
�
�[�:
v9��
s%�<_�( ���>��
`X��p��<�MV.|�-{q����Gg8�nX���sn{��υ�9�
Eƪ�>�Hm��X�,����C"��� a|-9�W�t�bYf9Z��ip04
+��/$������ � *o�|K z�ϢMr*��,�zl˶.�����+���mL�>��cjn�	��S
�
/!�ג\�@�U/,�n���S=F���ϧ��z>XR���ׄj���i\7�@T�fA��:q��L��|�
�LJr:��t�|����qh���%��
��P|m�7�T�;W�1��F����L�#�	h��˭����h��9�hM�I��. at U�1,e�`�׃��0�����MQ
�����|F+	W����%O�X��{�9jm�\�����Y��s
�
��E�3�n���3>M�����,5��J�
N�}BS�I�2�? ���O�!z��`
u��Z�f�Zj�xt��0����|u�'��]oǭ�5�vki��z�3����r��B�}eޭ�7��w����U�B��V&���'T}��s���
c�ϽF%0�Fn\���qm���_Դ�
+���
̙�|�z��{cr<(���K���ğ�͉
ע�

{��f�ӋFzT3]z�R�$�n �b�w�oÜ��aB���]�0C���pRE'���s裏j��x�-{ͨպ
$Df��pZ���Ny��(��~]���_�������T8M�wdOBꒃZ�>���I\��
8�D:x>�Oq-iӠ�t�O ���_��Љ˾�����çEr������I�tت�
L��2��K2�ь(/Y�Vz_Y[�ݜ�|���no�M�(2�7�9���j;��M��2k��V��2��+u_��"�m�W�Ovzu��q�#�pmlM�l�%wY}XJ��V�F(��BK����^CX�:9q~rK
+]ϣ��f(
�=R3�9ɻb��)BO95�6<jڥ^��:�UO
5��껈�)�ڼ$ŵ�s��du{���ʪjmK*Qv?;��$
	H4VK�
(�D��|3�r�;�|������8-`V��
��#��Oo\)?��u��yHMy+�WH@�*���7W���H�$�s?������5���,N��6��h�=.伬F�s�0$vA�S�)�3v�[`�����Q�6/�{?�E�#�V7��6^Bf�A�E�.@��#P�S:�G�N:��s8f���,�51bI��XH5����]��O�C�6
�<d�ϻ�V�>��%��#�s
����<������}�	h�c��V]����ڹ�3��V�<���v,=ee�=�K�}�zr+��rlm��.��QO�8"��hL<�Wnm�'5�u$z�]��Í9�W��Q��"Iox
०1�
:v_A�x�_"�� �|�j��ᬩM��՞UXN���z�:�V�e�,�Q7�D)�s� [...]
+yR.a��_�4X��#	12CS
+Ȏ\���I�����b��S5lس�>֛��d��t�2
2ݪ1�P��`����R���)��Z���Za���
0�Y�ⲓ
�D�
H������<>�+��UM����qx}�9����?+�q7��"(�]t���+oJ���y�{�l�S�-`g�~�o�H�lF�1-�u�¾9�(�
0-�:�Iz7h�a[�
+�G��� �
5
��OUk\o�L��!�t���v܍��4^'p�o۳�г�K�~�Dxa�yr"���]ą�ڏ
Q�3���k\�0��>��0p�rq��
�h8�r�zD��+}珇�M�Nj�CD:�@)
�W1��>M��s$����#i��7ڪ����ī[4��*J`cw���
���74�?�����OD��	f��T��]
��;�*.5/n\:̀�ga��?=A�?���^N\�VH
��w�rt=���N�҃@
�h0��d���3�|�>^H�>�n���0���f�9��t��hY��y�����Z�d+.��@i��?�����1\�
+qɄ����zg� �r
���6|�q
���H��az��
��#w���e�g|��4:�=
�u ޿V�Y���:s猓��� ��"|��=7��W
b��*1������-�ǥm�{V��3Z=��{���sJ7�w��	��}�:��7ǩ����G�;�#��}�r|����o����J��'�l��Fi�チ��v�fg�]s�r�0���꿲�a���!��F
���Ya�ψ��[_K�Se������
�����@{$/�^
>��I�h�i�
.���h��Oy.�i�	�j���|!�<�~�b�v
��"�J��3p�GZpY��V5�
��;
G�~	4�G)TT�
�z�>/� @}��M<�_1�����t!l�R�rv
�
-�u�Oy5�kW�
nGC:�j��
�E4��-�8[w@���Q�Dg
p��y������;j���-z�J���7����ٙ1�
+y�tK���ZY�+�>�e�V��`~���+]c��� .��n{��;��|q����(����Z���Q\��&�2д�@s����Y[�nԩ�7D
��q���l��΢E�qN��ޏ�gڏ��B&�È���
# CNڇC�����y,�Faͪ������ ��G\�i�����~ƕ���g��U\)֏Q���7�x��y��$�ly]��p
j>���#Z;���O��v���֨S�c^���	��G�Ԃ@��E�1����;���/��
"���7[a��~�qX>��K�o�c=� ��΄�_W��Öonl��-y�pF_<����$��]U�{��wv�� ݥ��L5
��ة�W�I`Z�T��o 8�q1p1�( �]>�+
�<��Y��.���onh���Ŝ,N��t�^��YD��}i>ξ����o]h�i\
������|�x\��ץ$��L��6�V�4�

+w�O s�_��E�
D�
h�cC��A��/�g����j���l�\�
ee����s�7�3g/�2yv4��{y��������ʼ�Ho����¢R�����,0���]K�lv$�
��7�/�R3��1�(_�&��2�O��+�m�fA�^���joo��ќ>�'�k��EG/��G]Uz�2��n�-�>�ͼ�Z�
+���gr
^#1����1�%��n� �� �y3�KTq�Ө�|4u���_�E�54�e���/����
�w9g���qs��}���
[2u
IEw��ӡ��
���3\�5�W�7XU�̘�fc�]!��H@*�!�*#q��|�a�oq����8�ݟ�?
s;��{Q�h�hT��lfwH���vJ�4�k��$q���5۟�1���88׼�W1�^��Ta�
+��m�b��z=�|�~�k�_q�������d�Y!��rO�![����J5v���
cCU�;�$X<*�&�&���,o��9��z_eu�p\su�������,#F�Dh�
������ߍ�01���A\*`���Fqy
n�y
��1=�U��u��WN������4�2�zh}�G�Ԧ�z����M��Ȅ���
�V�Ж�(i1qaz��6�pF�Koڐ�0M��,�@��8��c���%��������@�
+���C=E�|1$M�汞ٿ�����ڋ>�*��n�*qJ��
+b�Da˜��t����mU��6�T,zZ��i�0Բ��S5��RNKLg�u0�<��
ĥ�4�caW�}\�6n\K
�	�� ��3:��Zm�@
ƅ�Lu
�bӿI�5�\�ܢɬ��� 2۽'�t�O�Su��'�5#��1C<�v�\�"2���A�x��
�%dD:g��'繲��
w���
��3��es�:�0�Cw�1$��N�% W�
_IחlG����7�g���zI�c�@���E 2�ѝ�����]�CI�Bn���G�:ĥ	��˩ �&�W��9�t�X���������yc=�6��=PWS�v�6)��$��V>�����dז�%��u����}�`����c��KbE�Z0q<{����#�@\��0�a
��H�k�X��v�ה>Ͼ�*u=��~JK�ʮ�
;�Xi
��፮�4^�rf�\z�*���7�V�vQ����b�D?�L����gr�"tu�(֩��Z~� �:�=�������W�����
� �

[�'�)���^�xO������$��p~�,G������bS.e����9#0~�čx��fbw�u�
5�A8t65�Ru$�g��yN�3>�>3�q&W6�$�׋{*ȓNJx#�@=��
T4v�i7��Z?-������r�9ܫ����
�/��	�A�8�)��;�G��
�����Q|��;�T���멵��j>x�(
|�u���[
p����#
ɱM0x{G��,��:$ y�4����q
	�.3ϜW����"�E�;���vy�&�J.F
�& q-�E���i�
�A_�.�}�8��ܨ�����'���
����
+q%w/�~YG�la
��f�~$g�`�7f��
+��ܠ�գ�~,t�ͮ�2L=�x��h�>.q�N��5�0	�y�B�0���z ��j�d:F?_����!D�)�dz�T��=:�o ���e0^ ��A�a
�J����Co3Ʋ3��b�J6O�br��gl��PJ��#����/r
�L�1�Ag�8���:K�׽�_(�W=z�P��v][Y��LSp���u�s+�.��dk�,js��Y�GE
Le���0���9qQ����5
�%��)�\�tC�;
*�"��H"78ҝ� {���T���Y\����]��ӎ���U:�3!�����
����g�����Yen�?
%�K��o>��v��
��P��	���c��n�F(+�޻�G�Ƿ18N�s�`��'CՕ�ެ)<����ݭ>�O���i�7ն�mZ�NF���kId4mI���8@�T
3XqR�i�m�"��3�
+�靫��#���
##��-`�aZ#�A�ڲg�2\�"x�n5r��jp�v/G�,�~��f�$����0J at Me꽚��#�x_���n��%(�HV��tj9~\�yՄ�����A�#�e�ר����zPߘ���Y��v�n����`

ڝ�kԒ�7��4�dS�|��>���n�X�n��/�N4
�z6�
���'$�_�� ���<b����B�	qq>���5����I\�D����
����=O�r�8oo�G�b"�oV��g�PT齻{3G�c��f�6�7�p
T��K�����ˋ'ǩ��7�'Mp��������"
+B�<W��B>Ս��h�W@�
�⢘���^h*>.4�`���s�}N����
��G�~-F�ܡոm�����c�fU���fn���1����*K�����A:�^@QTl���O��{�=c�y柇��1�׬.3-�H=\2�����9�foG�`�2:ۋ�::��
+��o��
��b0�dj$I`�Lw`��"W[|\�����kb���z9�q��*GwfՌj�z��3'��G�����6�dz�ԧ�s`Y�?6��˝��G� ���!4�I n�:���w
�xهB�&HF��_z& b:V�oB�t�O�o�K����U%��[+|rS:\�S.l���3Ny�3
+�탦���OOW	���r�|��އƿ ��z�a�䡯��I/�w� ���u�#"\�(�
�����ТE/D��l��eQ
�[�
�%�}�47z�����;��ኧ���v
৓�-l�~y�ޓ0��?�_e���=�����D��C�����x@��h-{�B��
���O�*
�f�``�:/�Bu�u���{
��gG�(���z���$Ӹ��Qy�eA?�����8A�4�g�G&�JP�h� t�A��}c��C�N���:d�� �f/�����0���H��z{R�O��,���6t*�zK�>����U�0��s�8�<훻�k�;A���A���� ^F�в�����@هB�U�M/!X�cYyij�*�z�.8<�l�ʇe��{�S�Ѱ�������F�Z����QgN�Ο��jxHy��GSݩ;�bS�`fnG����A�< �! �y@)3���7
*��5McA���^s��Em��~��f�ϗw',ֿ͔Kty�k�`Z�������}���+�|r7����vEyjl��^�L�<5��IX
3� ����	��q��j~�	~}O7��������U��K���+��0k:Z�W�p�N`y�
���Þ6�{a��R
��
+8aN=<U�Z'Eۯ�lnnW�t�&���&��
����πB�О�

+]w� �lP�*������
�n�|sÐ�-�z`�_�E�ڸV7'��a
��O������i�㻝L���t_)+S�af
*��X���:o��p�/s����X�_�V��

�H�~�
+y�{� ��T|G&��֎V��D���>�
��s�O�v����D�����	�����޲^��D����hu�'��J�
a��lK_�dN�ힺV���2
�����b�K�>(����7z�_��Y�닩�:�w�����yw�O���߾G��mv��6ֆ�Iw5
��Qw�z�U��N��V��yYMe#f��8���\R
����������_���7������.���Ś�(=9?��/�F�ĝ/3�_��m�͙m��9
�#��\O
�n�b��j��c�-���_����@�+��#�R���A�=/�
�8������c?�S����Bc*OP*ah��8�1�/%�^����=As�]����M�-�LOח�D6��B{�K��\
s�FMG�������
W2r�vmJ��ܛ������3�2���{� ��3
IutK�֢���H� ��ի��m�PZ���r���T3�M�~��3KN�D�$5�;.x�����%Wv�N�[�m�r���5�� &
	�;����o��	�U���1�^������q�$O7C~�ד��RR�x$
��[N
+Ԗ��S�8����
���� j���{,�K��RZ܆Ƭݫl'�7v��,�[gGL2�J}����	[�W��+sdc�[����[Pj]��S���,
��$J��u?HB��ʩi��
j}"���þڟ��q]��e=+J��D����6�
Φ��z_߂��n�?�AM���*����/ 'O���	��%?�U�%5�D)�rι��n��	KZ�����#��Y�j���q.S+��7o��R �}O�2��M���_	�ݿ7��o���ʸ�6+㋶-�
?���DF�}����s
���L�/{f̽���x�
��7=�wE�u ��Zi�u���0������R{P�s�-*q�y~r��FA��
>_%kڧ%n����A|*�'-�� �W� �&P�L��kBkb�q��<������4����%����5�a�4
p)�æQUf�֐t�jO{��+�V��K�v0Z�Yq� �™�g�e��c�.^?H?Wm���N�q�ר�/ ־���!Aqx@�V�Q
endstream
endobj
313 0 obj
<</Length 65536>>stream
+���~{%]S/A�����:���L>p}��+D�1�(zLQn�\uj;�H��&_v��QS3�����l�{�����Ɓ��-������gZ�_�A�V�~R/�6G�d�N�O�
n���K$�[v����u��z�[W�,��99`�,ӭE����ǭ_

�/�����(�z��+��aUg$O��A�ҋ�\��q at 1�x�`f�E��{���_�Iq�����R���)�;{m��'H+�[x�{J*�@^s���f�g���l�k\�0Lb�2�D�f\{ѽ��1�r+�ikt#3<t�
w;�4�Ǻ���+��/ ��, E*_e�B_�m69��wj�~���ņf�6Z^wT�U�Jzp?���
 �e/��

��"9 at F�r�w6M���ӌ�o�h�Dͻƭ���U�H1v*���L�9Q��
���2�?��
+B�YQWoz?_v�����n��g����5����l�F�8�p���0�;)n\졽˒(�Up����{�u7ٻ#�s:�T�u_u4�uPb��'����e���Y'7�L�� ��Uw_;��elw-

�'�d
����nz��$
�s���3
o{b������!��'
�*�1¨F��)���,զ�s��
�������9M�UT����'M97.� �ʡ=��N���1ҽIq�9��}a���X����<�(-���P�4�v����0���v�7�K���.nދN�§k�;��dgtG�m!̶Z�
�o��ج>�Ʋ5����x�Gk<���NB�����8�'=�y��h��dE	����ϴ�JE��;��Lh܏ʨ��j�Q�{�Z`3zWp�7�Q]�/��
�Q�꟦�R�o֒��ȝT��pC�;�}XK��Ym-ִ]���n'L̳����,Ϸ���/ϗ�%S��OfXT��!���n�2�z���k��w3������b-�l͚O�9�Nfc��N=r�c��ڷښw�M���5}c�^�,U3�V��(���y�3,��t�5=n/'V�#����l��^����>�Z4��Oϟ粌N-��5(�;��[j�U����������'��ݾ��p\���I��-�*�<���gy�V.e�U�����_ F|I��-�H�J�R�>����1
d�e�2�V [...]
���']�"h �Wr�%_�/
0F.�ѣQ:�.�G?�����b9�O
��V� ��
�"%���
��
$I�0>�J�oF�X$֫�����Gj���=��wA�BR '�(��Z�kk WP�d纃�g�6�٭�Q��t��o���`֝{�`����+�o��7zu�Fcp	@������ [Pf���*@��
P�t���^����B�E
�eJP��b�NF�=�B��K蕭�TA�p�=�
���;Th�㼶�g at +V�o��ņ
0��8�@��a	�[NȻ���a���$h�؀B���~�F�c�;"i��N$�f����V#&�)Wx	������+�DU�{���.�/�ǣ��:�?�?Z��h�
e2
(sX�"��(v΀@f��(}�}\� �2�5]
���
�R��� �)"�^,��8[�&�To��X���ޛ�+�Km��wϨm��E�����.��b��Os�?�_�
+m� �gw�s�2Д}}T�:� b⦠Z�p٦ �0ư

4�S�ОF|h7
���� ɸ���Z���T�z	A��
�
O�x>�ã������u��Z�>uDt�Y`3�g �م��p��x�
4�D�I0�Y_�a����*�N<T��a���W6H��8I����Y��/�Ϡ�����,\����O`$~Ͻw�L'�4S��%y?~���
��X(Ԟ���}���, ���q��� I��Z��O�	���:7�5�K\)3Ϩ� Ts9$l���S�3�G��Q�Z�r������a
7�X?
��|7�͉[�������� F�6P�� p=�}ӡP��Z�s������ք���D���	۵`��n�����G`K��	�&�����LJT�'�Z�&n�˽��
��U���ܕz���y�ƶ�]� �MM�ў[
C���@��D����6k
�;I3)�z/���qh䋓g*e.����G3�
$\v���4At~z���Z��E�H�7 [...]
з�+�+`'@X}
�r9�����;�����I^*��.4�
C݅�ֿU���0�x�D�r{a�?"��n*X6�crgvp$}�j�Nd�RL�z����
�*��l�hC��:z��Z�
��&��E(��0Pޏ�dH�-(@g1��
ܚ|f�{�~�k�m���s��e�
�
�?�w�3u
NGٶOW������d)�D���f���ko����b
Y{A�鍱���*�PW�R����
+
+
���9b&�E<(g>��U��O��HpxCA�:R>��=�cn����I����������h:��|3.ߴu^��W��hgT'���ؙo-�u�j�o4�9}����pX����U��P��|O��6�@���Ů�^�-~"���>m٫�lɣ;��J��.��ֶ��PV�V���J�"���K�b˥�����T���[Z��c��Db1h�k�ޙW��`\V�W�g�1�� 
I��y��U�{֡
��������?�
�U}�>��\�#�W|W������,n}on�*�Y��
ƨ��f�ւJ{
i����gme�ѷ�1q�s�Ь�W�+�<
���j���W8��(��MY߾��1̴�K������Ќ�;�}���ub�;ˎK��D��������*���9����`������s�:���]�x�R,$R�u*͞+� �~q�
?ȟ��ߗ?X��Z*SV��o���s�{y�9_����i9�5*Lf��
�<�j�uy�*��fTQ?�}c�
;��M��yQ��2#89��nZ�^љR�&������]`H�>9�z�� �m@,�3����
(s��D+�[�ْ�5��Ӽ�Nnur9�s��I���
�̦H?1Cm�H��J��9�*b�ٔ}��J�.�MW��01S����C�vʛ!���$~�`�?`�
+��Оڸ�=�QHn���ȩz�N2�Ո��oֽݳ�{l{����}z�(��D{���ҕ��"��<_+�Yt+���hˈ�
�Ѿ1��k�/�y
_J��9煩��������wQzm���|��Aq���1=���
+��yˣ�ᆆ�Ke�W���ڟ������ʑ��
KLV�;93���4���E��������x&&�h.����1:
�v)5�
|��M|\Z��?N��- ��;(��P�.-��h+'���4��C� �}=�̭
�'�p��WM�i�+
+�_M�����^�1�VӤp B�/�r���1C�ڏ�+
pK���V,6�_
:l�����ǯ ����Yi�%�����T��ݥ�E]z��,j�v�U��f�n�
�W�)F���
��s�
��Yr)�&N�G�c挍oa�0j�Qu�Z
��,�>Хގ�X���
{�^����R�6�πsR��S%_�"�9K�D���'���7��)
�O��ov��v����_�Z�J?U�үJ�3
U1�iv
%©J��w��
��A
�fR�;����z�a��^b��\�탙U�+,��b�g �4� oG/P�ڕ��vk��9��9*{P�0
��,��Xa<Y�+^���U�JǓ�T�:��C8���X��dh�fz�&�X8L�=2si2�ñG߷�����u�y?߻�`[�k�H��4�?�_��T�� �Ԕ�p�ߎ���
j�&:%lR|4��
��fe����Y�w��*�pٰ��{|�>���b�)
>}|"��
�.2��o�
���j��Jʫ
�z�j�����H�p�}U��|u.����?ȵS��#�4�}c��
�$ܭ��B�Q���۝�-�|(�[q��%e��
��{
2��s�O��7+�n9��0
]J7(`�=�Ʉp���ú��W-?+���b:����g������8��Gc�5;���h˼9�e�l㬞�)���	a��}\����0�y}��g{����kozY?Y8ٿ����T�@YH�EeF<��
��޷RV{�,��8'����´����
?��*��ٯS�i@̕�:;H�\�/m�JiN�;Y��AM���ޔϬE�v��G��
��t�/�r6��/
Ӽ�[v�&��ԚOQٓDtЛTm��M�5���u�U��<�7+t�5�3��3�l���k�	o�����T�2�oQY^�*�Ci
<T�ָ��,�=^kgG��;�p�4Tzr_И��ЫY�v���H�rk��˨�/*�V�kM�:��`
� � u�3��mk��%�.F�ơ1�6�1�G�A�YU�-�x"ͻ5��k,&�¥:N4�5̹<
���4�؇*�tb�Ӯ5x(Ԁ��v��sZ�W�Ь~j�Ʋ׉���J�oH��R�Z3����1_�
��,t�o�fG���m��[��5Lj�J�q�r��r�y��
��Y��]���8�S�B��|@ �F�=��ei�M�P�����*�hf��ze�ښﯪ֔�V3>�䞓Gy�n�e�塥�:])�t����TJ����eEa�Ҍ�v�o>���d�\
�r՟�[F��N?�Ԁ��\�Z38�5���4��R����

��5閪�[�VT����`KG�;.�ߜT,g8�)���-�ީPC����>�܉��q�Ur�}�ք���},����n
m��̚��(�s�V���M�ƧV�W���#u���t*�~-��\P�lrQ��ν
s���,�o�*�O:m"��z�ZG�
?�_e��f2@�s
�>.@'Q
+`�E`��`��P��t�e@l� �	h�c�2�%@.�	gr ���dv� 2L���Pu
 ��*:>�C8�k�f<	h3\�N�c�g�G�H���[���K�ٵ���EE۷�P��J��A���P�+�QW1T+yP�}�j�/�HX�e
+P�т2
�\M܇e�HI���%��A�mB5��;\ܷ�Y� g,e�ÖP諴��,e �	: 
`���Z7�]�
��L�b@�$�'��ؖr��
�*G���jc ��B��T{��ۑ�P}��
+s+�������*0W��tY������� 9W�B)� h�=@cv� {�)�W&2�1ׅjO�����2@)
+
��[PP&+�P���
�P+� ĭ`P+_���qe�]�)��&m�g���F�d�n��:
��G�����W��՚C�^V U�
4���Oz7�����
�U4����P�* u�=������ж**�W(9���%�$�!�%ػR~	
�
�u[�n��ۻ��N��?r��kɎ��o�Y��\ǿ�B�d
���pt�]', �)H����c�w�(�JU��� �*Rr�$�y
/����S|�[���m�"��MG�q
�V
�s��o)����?�L�K������.

5:����W|�X��a�����#�gt��vjS��?�o% �mphY���n�yYD�+�@�j�f����yF����)p�c=��G�=�VC'� �?Z���n�Acq^v�s��l&�����kV�e���
+�f�
+l�	�C�
�l:Ч� ��wSp�q��{& �	��T9z��V���ܓ�����󠏮��[_n�(7���||���^t�������Rz��N#�,ɋ;�:�w�g�S��Al���~@
(��}�w�
 �a�{>��k�k�C�
+H����M.���x�t�8�K�>���/�	��G���~�ճ��V'��M��
S�������঴�~|;��Y<l�ᑱ6c�c���i"��w �����&[���W@
� ��1ȗ���e����3q�r��3�֐ �&y��iV���9kn�>��2�m��pp㏼?xGuw�כ]�n�]��ܿ��Y!�}n��M��������9Ӫ�&�V�W �- 67m�G�� �S�KG�{��&���K�w/��Y���`޷�F/-D�
��+z�R��?
j7:�+��#�n&ۖ�*�q4���5vV��f_T
+
N��IT�r�]�5��ןf����_ ��Y�7��8��A	���r��&~��C�j.��X���ҋ�.m��>�/��oW���:+��<Z�A�:���\�-�}L�|�lF魲�s�:ӯӪ��3F��Zh/����-��n5�|p�W�G&�
�w
+��H�P0��Bo
����J�ݽ�
N��bw?:��� ��{WYZ�E�ޤ�y+����~�h��j�}f`�ˇ�/$�i������E��v���|d�m�'���� �sPh���]}�6�+���򯻾�Bft1ޫ����}���:�<�(��NN��ic�����)sH���a󫙝���7�Ƞ��:�rK
E��
O���9/r�WF@��G���E�����r�~�����
+��M6�C��"*p��	8��X���%�k�l�C�������DG�n�[?2G��{=������Oћ�T����a

�*��[�x.v
E�ة�<���r�=!�1_=�/��`D[�S�&�z�_���%�ɣh�Ƨ<;��U-�Ϭ�U���r�g���
�j���`=���X��D{�fi��R���)��Tu^X!m��L����Lg�`h� ���I 
d��,���g�u�� �a\8��(���w��(4��0�K��5ګ������HC�1���r��iS�׮���Z��Fj&��ň�d��Z�%7,J��Y���3g��0��1I��s�z�3��JCP_0�`d��V�YI�B���y

+�K���s{��{#�
����X�Mw
)�o�Ǘm�ZrX�W�Y�(�M�U��b�x~���0ޯ��LcĔ�w+����qc$
O���M���G��)a�AR��>��I
��
�
��
+JR�A�pV��O�}{2��ɥn0�h]g�
��.�mַ��-���$8/��?���Szة׬
���r"�eJ�_|>����QI
�
���jfj<����<��<�_?�`�
+
+������\%Z�����+���#���v*>n{SE6�� �Fli�@�-���ͯ��"=��}
+�n8���[�ۏ
/v
r\��������q2���v���p��Qu��G���
?�_e8+y����G��? +�rȞf%�>3rgD�r�W
�Y�@�'�S]��ny����V��ӽ\��黟�L�
�!�L���U6?#�0ÆM�.s`@S
�����P�p)�L����
:U
:x+� �B�q����;�
>��x��� ���
�7��i�}qۿǔYl�y#^d��<�E�D��j;��~���*ף�G��Xn�a(N��
+�!
�4�}�)�zí8�a��
+�
� ��TM��.	�����p�cP苾��FLE�q!u��������Q�b�|tPK���Uh��z��L��
��i���&�3'h��
+y{?������=߹�$�}'�I�F�2	��Z������dt�wȔ�F�%�ʇ%Mh�������	��=nu��f�H�s���5�.]����sOo��JY�
���{
F�7��ކ��
��!��͸ޱ�!U*
8[����)<᧜:�#�;=O�Z�I���J6�����ݦ.�݇�f�j��@V�-(��	�v
���W�=��H���q$z%W��
��ձ�4�Z%�H4QO�n&���bc�!
��ƭ]�s_gv�zO��7�H[x��85j�d���,���e�蘃 �A:����
�+`�{_|�SnҔ�J�.9lz2�ı�n���1��!P�r;�(�yQ�lO��a��
�{���2�������r�'�&.[
Տ�3�ܻ��
��%�Q�r���)ڠ�e+z��f�m�:��0(,�ؤ�+�l�l��y�Ƈr��4�Kv˯ba'��8j~V�+
y��X�@N���̍
������'}�
/z%��b�������]���V���v�흑n�G�ɸ�W�����g7�y��ͳܩ����&^^��[0��3�N��װ�CX��zJ�
+fNPK�הJ�M1]
Z�͍�>ӛ��y��)������6����
'�o��;�ۄXA[�Un��*�,�`ָ��۸OF�ƽ�(� �{1*��#�'�q
�tp�FR�[��Ct��1df4��� �B���%�
fUꟉ|�
�#E����5�OmK���
z��V�<�
�71�7+0�i��
V=�^�fKk�x��Vn��u��������?�E(��e����yk�j�vǒ9)1���N��(Â�;�r�7O�1F�\�ݏ>�Q?����m�F�[�VjҜS�y�a�U=r���@��R��DX�f�t5s��G9�+�:��"݀�ؿ����%n�*���
�4b�S݂X=���ǰW�1Z4���oގmģ
Mgr匏�~�����m�F���_h43H��Ʌ��z���[W����J��^�ǭ�]:��SI�*a)�9���,g}��?����ڛ�*^��r���&������

&��I�g���H��Ό��}�6jk֘l�U at 9�f�������bxx��
+^Pq$�>e<��%��'��ͥZ�N���
�CC�/���o��KFgs�+�
�!r��|�>�\���8�
�9�՛W���O
�Q��q���&S�%Ͳ�d��W?^4�83k\�+s���3�$�E�8�i���
�PC:V~9�@!�
�.d�0~ki��?���ơ�g�T
�~@�� �X�' GE;�{m? -�j �p�[k*������{�B�h�
@�ld�id��d���LY�e�,/
!�O g�,�[�
�B�x]Yq���9�$�>y>����H����@�����y[(t� Z�P�]h���d�A������Q�uZ�ZW
@r�
+~�O�
�]�f
%+'�{��J�� �e�!�����r]/Y��&�ø��_�_�!AS:�ݶ�[��<8�
5 ��x�6�4���'��#
 g
+�v,@�P HS ��Wd�}���Pf at A���<ָdX���u��x–�a}��=�&ܷ���W �L�͛�ӡ-�h���i��OO � @;E(�_���8T�m@��z q�!z}	�����
��
+�J*F!�P��/~vb��
�5�g��?�Ԯ8�#�t|���/� ���<�a���CQ{q�� �yQ 3��ء	���
Ё ��H��ܚ Ǽ� �/NQj����;�w�b
�_^|�<_�vK��y��*Z�
+�����:1b�I��Gµ���0F�_��@n8W�)sk-{����w�F�NC(2���7w�Fг@g���[�uԼ�+�6�xzҤ�G4-�W�s.D��
�[��F%��F�Vd��5Ї�y��x^X���������;��ꮡP���V�n ���
q�\N9 dz~�_�׫X���i'~�
��|'lRQ�
>�H���

5���&`���M��=ǔ�?ڮK��ء.�N��F��2�>�Ǐ!��(��7� �a�����m1B0�Rw���< z�
 �E�}]��W��3ԺI�I:�HE�R�ݠ����Y,���eOo��^� �R��.���=/Q�z��H�����K3�~?Fw6��G�i��~]� WiB�b���A]} B������l���5;Ze�\���r�}��)��U�z�TJe4�_7��Yw�#�VG���O��[
�l{�߻���
�����X����|^3�b��q+��� 9i ��	_�@9� ����-~o��iJ_D!
V [...]
�]�?f�ݔ�݊��N]m巭V�)�݆��f��6��쥢o�e���Y2�:9Lި�/\�O����d�W���C�c�tZP�
�/���~
}˨�Ȏ
�t�_z[��h��)���A
��k?���~��D!����c�
19��o�a������jb}��
iHFe��u�T����a�
+o�H|�^�3K6�I�
+�6�)�ւ
+ۜ? �:x}ӡ�W�9��T��
�>�ը�p��e��@K�I�rTނ��
h�d�(�7sN%Z�3XMW�!�=B_
;Mk�;�K�T
+
��Ɏ�e��g\g�Vv�uJ���W|�L�Ph�}�6�����7
Z�b�P>܎��ћ>�����/���nư7I�2]C�m
9��)�7�n�7.	P��.?m#-����E�h��H�g
+^s��c���种�|)��<�s�_P�1xɄ2.�ys ȟ��ȩj�+����K�~�ӳK#w9Z��c--��R�۫
+��t�������)F
g]~+�	��G�|�!
���i���R�����Of�W�ٲ�Ŀ��
+�<(4��@
:
I��#��bCދ[,Y
�E�C
+��}S�oA�-Z�TT6���V�\��At
���;���z�@ש��TpcyfNS�\��R�֦Qx榝�O;�Z0�A
GH/�"�p���o���7+� ߏޯڼ�>v�	z
n;�=�ô�]��fl{��]����е�BS��g�D6[�w�ݼ�4.���?gj����������v�ˈ�'\X���M�g
+�؋�'�; F�%�G����䷙w[�L ���ULJ�8���.Wmؕ�[6;�P��
Fs��]
-��eo(�V0囵q�z��/�}�l�^,��uF��<p
���f<YcN<??<x~��a}��E�}�/���!"_� r׹�B��7����h7<[����?�i7�

����3����f��u0Y:\VD~ �Jٗ�+��N����O2��Yح�/����`���l�*׌ �>�����J0.��� ؾ
e
+}��k2���~?�A�q[�Z�Z����'Mb�5�6�ky���ƐS��),�L4��Ӛ"5��>���Ft�ۭ0F����+�#�����%[�;�A[q����tڃz
�
U��+ �d at x���ҏ���q�L�<gѪ�V����yh;/�ɛ��)фhi�r�]]n8�
,QjͳҔ�����҆@ؚ5�=���}\�vr��)å�h���f�~o ���	��k1�q��?�_� �6d���i�)
��3cG�NE���
�ց���"
�g��,ROa��r\Ow�~�ڗ��l<e{׉8��e����Y
Wdn5T�9�{��G.�8����?=�Y���g�k��g�;�
<�w �|V i���y�a�t6��
��|�4S��fⵍ��qS��H���FJQ��sK��z�79q\���
�&�G���]�3���qG����>�G�����?}�{]Z��W��7�6#C�8K?~\�05�J���r5�8�����g�-���f�y�m�W���;�{z�r���ZN+S��o�|�`�r4�
#��|1�z.���a�f���ef��ӵ�1�.U����HQQ�i�>/�η^�Ʀ���o�x
�ԸS�5{�:�♳����T=mj$m�
��q1�[��#��t���Ea���U,n���
0�נ�kj0���;g��Ҋ�9��rW�U+%�w�Gt6/��0���a��I�ʫ�:K�_����
D�{8;�$/��?��f:�v��T����E^�=ݖ
�|��%
�?�^a2qc�MO���&����xfސg�#�v�m�n"\;��"i;}�hr,���s����
��־�MZ�
��7r�=/
�]
鶬C٪��^Cg_D{9i��<\��>�W�~87���A�qI
�cㆇ{�w�I
V�)����Q��	��
��}>[
�����:�j��)�"�w�y._�I�.��b5�y;�7� �O�{��'�a:��Z�㢞���
��U��f��'b�]��ڏ���
�ѫ/V�,�k�<�L�5��H��Z=*�~�|��j�
7x�%v&��ecG�r>�6�
�l�
t�x���
���������ی>+�����
+
���		|V�)�<�b��(c�%�a�v�q|W���a)b����O���q��Z�p��6Y�ZEv8mVC��
�
�O�zKO%��5�p��_}/R���
�f�{���y6宊錉���=E$:J�������OFl>=@wL�ݎm�mPy��r����L͊:������\kz�Ȧ
�+�K��Ѡ����kݐW�V۰����\�h\Ʌ^�k�V���뼶�e�5|�"�lNE��J0�����n�����N��`�|���*�f��F%
+$�o�>Y�ZF�vB�b������3)�g�(��[Þ\�']�y��lz�0�a�hQ`5Ϊ����D��eP{n��jr$U6# ��%�{zg�B���Ϻ�	�
g�ad��+�P1���;?���	(��*5���mI��J���~n��8�{S��f/Mf+��7�v�G�ӷ�5�=I�����bOh�����2
Q���8�I�/�M�T(��[��S �
�D���YCܲ��z�`�$(�3�y�?�e$��A�9)P���FJwn����d�����J4=Y 끎P4�9����X�r�r�/��o����b�ul��e;?���m��:9
f��T̬�ќ���Nq��Cn��G���F
;��G��R����-�LB ��K ��,{�[�a f?� ��hú6@�������h�8hFh 4�wrw� y�g 95���s��6���"@v�@.l;�N�L��	&�7��9��R��(��L��2��=�+} pj�}~O�
���
�
�P�u�j�	@�8�a�PVj�jqP�u�,9h�YA��"�@�
��m1	?�w^�(ӎ����a�i<�
��
P� ~�ÁBՌ��m�������Y8[�A�}(��7P�{�Z_ �A��A�|�e�3P�ۇ�_���*@;���.���FXy
�K#��.�8/�u*l��)���۪��nF�gޱ�
+��S��K�_�> 
+7x��C���Jx���� ���o�>
0|�'ٰPw4 �� �@ͩ��:G/!6��2f��N�Y
+:�C������ܖ�k3쵊��
� z�������p���{F
�Ħs�ͬ���g�h�B��7
�B�t7
���K�E�Nȡ�~���-6�ؿZ�X�]�q�zo��qy�W=u_h��m��W"�v���U[�`��/�_����[��`�+PhD��ٽL�& �� �5��p�L�G�0� J�C2���8I���'!�b�Y|��:
c�zn?�܍�?�`|�ID�����B���͟^ᦖ�����n5i\N�>�������2n�HR������O9#���8���2t)@Fd�[�$�gC����
+�������i?�DF�[�L"�j�ݙps@�!�Bǁ� ������b���}�s;�{
E��
�}�ݏ�]bwz�� �܇^��ŴD�p�1�jJf!L2��x6�`f�x��Ɲi=7���>��
��;�>Y��;�r	D���o��`�����^R�O��<m���(:�Wz� ����y�I8��q�*#�?�_ X���ǀLU@���������/�x�%WK�ޣ��Ʒ�
�B��.��l/���?�2����=�����1����q�Á�u���� [...]
�ĉ8YPφ�az֯~�n^�j����l?����
��A�K5�ܕW`�y�
߉����Nl�����G�0wE�d�q{=����$av��й-K~�1��e�7�^�����~��� �y

+�<'�j^W C/��q��84�{����x�d/ц��
��p	�
�]o��<2Ӎ~[hN���m�X�,l��`�O���:��?V�<�YN,e��\5j�s__L%s���ecͼ`��n=��N�� ����"���d������ ���Z�D�B�s
�zjkN���ʡ ����l�
PY�l�LN-\�hk/�]���Yκ�k��m��Y�Xዴ�f�����[�7�LŔ�Q��fp�o�w��u�����p:������g��I(8'Re�?��=����i'
O6��9%v��Ζλ�6z��������t9g��Ao'+���6�O�Z�*�E��a����y6��g� o >��Xţ�L
���_����ЋdhѠ-C��Y �Μ_�z>�m�kP���)5�nn��R�ʵ�٬�l��S��92��t�
��a�g~�`;�BC��	��7�νrϟ�s��4 ��ie�*���dڈ�2�����@�B�p��x@�·*6�AvU=����"�/���郷���AN��ְ�A�T�t�Fmu�W��8��ʂ�R��.gJ���s���`����^��"z����5�3"��B��
�N>���
�t�
�����+N
+��Ώ����Eߜ���v�L���2�dž=����k�$a������&�)�z*�p��8i��x+�]�,��U���%��&<&h~���N��5����� �B���_���4��P���B���
+��#���ỹ���:\;���U(�v��� ���[��
��m�aS�2qw.UF�4���ⴒ%f8֡�R��5�i�qt���(��C1g��b
��l ����
@��C@��*�2������(�����Z��8i�W��v�yG�M�U�cPcY\���VV��V}.cN{z˗9��qњw'�>F)c.���|�
���"����@9����E����
���s�����##�C��N�mp65�dN‘'���X��mR�Y��|�p
��Ż��ө6�
���6������5�$|�����	�(�F
y�%c�
��|3�����q%�2O���W���u�F
�Z��o���
��qA�|K;�Ա��<�;ž>e�M7>�t+�3B���M���R�'���u,J�R�E�o���vw�gn!8�@
��o�-�ϦX��}�wn��In��=n��ѱ�u�n�k���P��d��q
+;�wʵ��ݒ�^�ﻛ�G�<T��z.�,#�q�>W
ʙ��gt�D�m�̋�+�G�Y}xyጠ�A����Q���=�N,9�U:t��z��h;��7���l�
�h�`&>�nw(]����4y>�c�lp��{�\�}�Ϙ-KUZ���sf)xJ�eE[��=��^'�i���Y�N��X�@�
�
����W���ɯ�m����Cn�楮���
�ٱ�z+`�KmGm�َXZkG�Ֆ-�W�-W]�7�Lv/�`��S>��Ӈ++5������l�����U�zo�WT?q�y�B�ds$�E�ނq^�a��Тƾ]�SHB��ʚ��a����"y�k�&�m��
��Q���
����#�Y�V҈<�)>~�kڔFgyU���]�5˷���\�,]�����:��
�"�N�8�
5C���^$�et
̟£�~�bC�[;�#KI����t8�X�7��Pct�����JyD��h^�鈖��^��䂬���i~Cp�h���Ž�&%gK�sfI0)�]nP
�E�y�όɻ/s�;�x:\4���Q0�a�۵ԫ��,��Ɨ6�-��{�ϵ�3s�0��ZhY�Vi!����+�����S
aQ���U�����ԯ��ѯ8%-�t��	�a6�V)c��&�dH
[���k�6)�H<'O�9)����ݻ��j��u�7*�Q�2Y&
�<F����i��b�I�8�B���9H����Z?X�V纘�R���D��'G�/}������
�
+73D���g��k�/��
Y�s!5�(
�Q�����ѽ�������h.�\�Zr�~f߹Q���˳�V7i�k��V_���Fo5<|���wZ/�o���]Yߵ�hP�ݺ�iM=���o�ꓰ�{G��_�=�FΦ
l�Ԃd���i���qY)a}5*�.3�L����*w��]c[�o3Nyyl�h��<�����;�T#�3�R��i�j1�Ec?����Re25��NX1�,Z���&���y%u<���o�����4��Y
�B�U�c���Q���"ד������ow
#�g�k(2�QZ�,����i@�X�d{WZ���>KIjLT>ظP�
+z���]e�������9%J8E��@����V��
�V~ú���;��jw������i5���兛�zX�)����92
O)
�Jo�
2]��+�{J�S���N�*K��v��t��Ⱥ�����ݺ�*��g�{�*����~�JX���M�9m�9��9�������`�^���
��<�voҶwGU �|��;7Cڵ?����hNJ�L=�+Zc�j5�yt��ڭ�V��K��Jԃ勹�:���e�R>p�J&�z�NU�1a�����Od�)[9�����V�=r�<K��7(SW�Ɉ�
FJ9�"̒:Z��e�bn����>o��5��yTY�T���S:�G��Q���$��"W2��l�Y�LrZ�3lQ�Q\Uj��ŬC�/}@P���{v�d<��;�G���4Q����:@��6@��>@ugqWj�� �z�N	�
� �� �ߧk�r 2����Խć H�X����@�� ����� !�7��ҝL6�O$xm�}��������w��	�ByS
���`Hf!�!�1@�V�K�	Ё7(�Y �sē. �71T}K��
� �e����`�� ��&� <z��ɖ0��!
�Q���^��"��I�7 dvj at S��̓�X-6�ouT�\�M���I`�� �@{ϊ@��
��
 �sz䎠4�!_�@X
@�k ���,�-��_�Q�{R�
��=e�@<��7���ߖ*�`�GP�δ��
0+#�m� N!>���۶ 0����h
믾��㷞<s#�
+�7@�
+�j7���ַ�	/���(���p^Xē���<���cn�����ؽ>X��{��
��G��A��+�
@�X`i�0���-	�ӛ�U�
�M\x��u v��)��M(������^G��Q����4��"�,=/�'���
-V�U�p �U���b�u�������#!���{h��5��
��7 T*@��
��w�
����*�VG�8
+�.���&��$��3.\q���u�ۣ&%��A��1"2�W:_�1�L-	ۉ:�<�ҩ`삢{=���"�r��t|��`'Eր�P�/�]���z<v���?��oq��L�q@���k��gy���Ҧw#�/o�����b9y?J_3Qا�W���t0�
��eʅkV���9����B:�i��^��w߽��'>�<�q��;�}�����/�Q
ॸ
t2�_\|ϋ�_ at x�i��=���vo�j;r�P��r
ˣ�u�0��f���y]Ot{s�um�x���x0ǧ`�j��7}���~YU���Yp���M����p������7 LQ��)���
A��% �oն�b����x�q��j.�7��Տ�K�qN�-�;Q���v��z{�ӆw8����}N�|v�^��u�mg~u�Q���ԶG{���g`_~0��NNf�Y�~�B
+���D�I�f�=��M&���Y�
���
+��rv�%@��S�׼�r�r1d�?
G���O^�l'{K}Ċ��E�����
���ĔR6�����|4��H����⬩�+o}�W���[�
+��o�=�Rg��
e at 5����P/��
+�;{�]�a�]�
+���Ru��u��n��}�1[ۨ2�oKl�,Gשm6���d$�B{�I����P�?�ʋ��*_�Kٞ
�}FuV;��-{\���~�D��o 8� �M���Q[l
2]�{���1���u��a�p��w�|���*����
Y�ߡ��i]��
5\㧼�ݭ��?��e)�vF�$��Eю��N,Z'���-d�u��RGu��j�J}��� ��ۺ��+6�l�.row�h�
���}zY���q�?���c{�'�`��z�<�xu=�<ZLbdnY>W�f���X�ڂ�kʹ/�م��~��2�%�,�������g3�
+�3;Q����$@V���ׄ�j�ɘ�b�v���Za뚏�F�c�s:�T�
+7L�{٨a�͡�#Wg�.,�$[3h#�,���i��t�����b����j֚g�����İ��^k��t�8´|�. �
�� �
o�@�Km@
+��6'd���l8�e8V��)�.EWx`���2����
N���y��Q�.�n����n�aq�fZCV5F�'Xo�w8;=6��5�Vr�v2��IVP�Y�rR��b���?��������P(�E ����e�]�����Qǁ�<��1׌

M�N�]
��Ằ)��5NK�L�S3*�"�?��ɝ�y��i�
�6�E�٫,Ĥ]qĶ=�L��KM�{�=A�
�YA��`��qPfR�
��~���ċj��K���\���'ț�&0l|_ڭϥ�e�΢��*�@s3��X����57����#M�>Ļ"@o��'�����x���?:��dD�=r/q4�

q�?o����%yɝ_gT�qZ���=�[Ǽ3�������jzp���;=�h�V�@��X��g~j��YY�3�#�,J�ه;�=�"m0&�<ʌ��pr���O
�
zeA�ԑ ��
��!\*� 3��^��������zk�
�<j>��jnfޯ��b6�r�ĝ�����4�"vX�K�
��}~.ԓY�vӲ>�� �l�����=i�FF�7G��P�	m�
�-w��_H\�_ȕ?�4��1�!o�7 at g7�=O��3�|j��2\���\�P�o��+��;�ͼo�{TZ�Ñ����F�݊��Y#�U��S6Z����S�o2c�<,O�<-\M�3P
�!�Sw��Bc��Zp��YT���L��ޣ�
�Z�s��@���9��KDo
+޶Y)
.���[X��&�T�ָJ�W��̩�.0β���g�8S�Y^�»��
�	?��G�N#�2]�	���Ϟ��W��Y�3�6�n���ҹ��
���.�+2�X��}�������g����i5�d\�����$������%����eS
���!��w{9�懭���� 3����s$r�[U
,J�̷��\J�T�l�м�u�"u3�ݪ3��~'_6ӝ<��N>CI�|��u&��+��w�y�{pv$���22A�`����
�b�B�t���7Y��3��Ion��g����yT��#AeV�A�̦�V�����ڒ�f�b�S�M�l�d�mE�v���?X����v
M&���������
+��m�h�[�뤃9
+b'���S��ef�o����M�e�
dq{�B�
{������ʯi���4��R
+�z���H�e��Y�v�nMF7�Z
����jk'���n���Ϩզ��o���4af��Ƽz�~
��M�5�t#>Kc4M�L:V�V��
��,�ɡ-V�p,.S�P���`)�[>��ގ�n���n~���a݇ye��\ʌ�tZ�5�V��&g�vM�u{5Q��hlo�Qck��ύ��p����1sؖi��5n�?+:\$�

?��L��}��i�ɉ�*�F��g��O���}�mr���u����)'���ݩ��xX��s���޻4h��]~����ʳ�
+��V�6�zv��	u�ן��n�K���U��n-3ѹ���\�~4mW�p�i��hn���.Os��iP��*��
W��u��Ӣ37-����c��v/
�k?[��J7y��i
�Z�s�z>��hyJ9t��?�Rۥ�R�6��@��
�7�`�R��:���^�
�۫�]-�Ԙ�^&ޤz�O�+�s����O����Խ^LG�=��f�[�
&�^mZ�b�5��8l�>*�K�{��N�j-R�nM�w���n�Tu��W�!S���
_m8��j��oؘk3m���`��]��p�bP!�z��F�+r��>W�
�n%V1�i���Z�
W�q-<����xޘ��U]��7tp��t����`��n���z�Qa��A%ŜeΫ��Tw0�(��̨���o���=1���>�
�����F!�w�}r`m:걲e�2�nw�c����<>����nv�e�#X�6�Mj��T_\sYy*v�u��
�elk}Jd��ϱP8mzA
�B��?�����_�T�7,�G�/����>M<�4�ܲ���y��$�ҢZT�q��D}vM���Tk�˳��S�3_�ètP����\�
+2l���%w; ��6����_�����d[ž�I���Y+�s��]�߰ �j8[�Y�&)�����\�ڰ��]6F�4�b��=�]y�Z(�D� �
Vƃ#U�J�p^
+��f��*��9m���Ƹ��$��aK̄�j
���S�ē�O
�̋v��]���m��Y�
�Z38��
+�B\,o��؄!Q3C��tMZj�5�q*�J��s,N�W���9?�6�\�HG�V&���a
�'e�6	�ܶ)�5�2�{ֺ�O�g����Jdn���}
���;�v�D�v R/ϰ� �]%}wu�)6"�7
�uM�X( �@:� Y%
ҏK���6H�1H˶�@z@�!�g�f�;�@$�����U
����`�\B�;��T�	&�׾ ί��?}q�
 �PaU���H�� 
!|
 !��qD١�{���Z��C�g���w �
H��W�	����W	�/A��^wd��:����P�O�;
/�r��Yo���؟�/��[�ޭ�Sj�g
��
8� ��=@[�
����
Y�
@�	 
�����1�º}�=% ����P�g�G'�3Y�%�ߣuf��)i���ƣ�c��\
�v�Gv�
 iK%�b�)e��	��X��9Ǯ ��]���u�e��`B�|��Nf �+�� �uM��~K��>y
�^�%DO�EiT)���V�[��#��\��G���[���Dr/Ѻh]�v�����hJ�
5�k Kw� 
{ s[3�E[`��ؤ� �.g�
�'��� !T8���e�O'�w�����\�����B�͕*�����]���{�to�Ne
��m3D3�C��*��a�9]����⹶�?ؿ� ���n�-C�#��7: ��P��C; �g�Wf �k��kL�t\��g��>jEtz_
	�;�s[6���2p�Ef�~�R0�
�� 
���vLܼ
9V��$��B>���q��~x��b��� ��(�֨,4��M���%�MD���^�&�⢅"5���fC����a��&�pM�{��d�l]GJaw�OY�R(���tX~�����W!�7*���Ʋ������C��$\g<Z�~4R�}6;6�
�i(����Pm@�����: |u�d���Ix7��+
��	�W���iM��3��O4�����v�J��}+[�휶����#6<��l9�Ұ�Ϯ����x*��65�[9��a�����_�`�^Cc�� '5�ǥ �@dU07��=��gw{7�n��݃�/��s�����f<6�)��4�}��
��Rػ�������Ie�����,�����ᒸ��9m�]�E����f
��uǏ�� 0��2y��ɷ�X�$@
V�,���{�3Y�{�n]
����X�/M|�����F��m��
�'z[���~�cՉ�
U�n;�Ҳ^���|V'�������G=`
��-j��*k��T�@��� �c������&:�*����=�����b������n���c���y�`����ج6����j��Z�2&?0���2F+ϐ��
0�K������F�u>�����<S��4�П}1�0R�6���2
�h�O��IWzɩ��f��q ���5_�.��h�܆�v�I�m��N`[����ԏ9���zĔ�+1��.�x�2B6��`��q
���?_�&�Z[_S���d�����=c��`��׳������`�����& g�w/�L~�.��c��]ٴ�
V`LwU6�tw�����3��Y����sU8�i#j*������U�h�5�N��=2=Qv]RS�mg;�il�{��H�_f��%�
+('N/����_ ���B=�d@	q0yo({d�S:�}󐣏#u�݅��dӊ����e{�~u��.?ز��#���^��O�5�qquC[yeOHչ���ls<���<�.,S�44����k�+=�Ǒ��'_���i��
+���^n
;�_�R7b$$���Fq�9f�Xł���<��J��
���«g��o�\��������
+9;m���:K�?�
Mn]�1����G��*/
E�ZD&�գ9y�{��������_ r���f��e�^�s7sb
��nu�F�
�a�
�;�d�Y�')�
��bYC���:q[;�����B=k��y�Ӡq@�[e���y�*��f�Ada��|�1?�1��^c</� ��l���o� h �ζ���.�#B���
?����> �I
+N��O����h�ڊ�

c�J�:��?�ܧk�L><�i��?����]�|�|q�Dc�+Do$��ӡW��aN�oÜ��!tn8~G�/��|
��!���o�?��I�������ZB�#;z����W�(�l�fw�7�ݏ��f'
up����{�����|w����to"�C�	�1��s�L�X�����d�.��
�E/̥Ca0��,Č����\���K���k��A�t�M
sD������f-2�M�X�[˒[_ֱ.����X�'���t1�Y�Y�d
.`�|1�����<GG��
����<P(���2�ǃˢ�����2�g!���p��6�/z�P�z_%��y��S���y�޶2������9	7Ī��U��
ik�h.(�jJ����B�Q�)~
+��[O�iw,���Qvc܄+�'�����U+�_h��{�=���.�^ͻ��G�^;4{i
��:�⯀>�VC�m���7g48f�!���r�8|X���R�t�`
+Ta��
��z��~�8�Q�T꺜��
S;|?<��0
�p@��q���ҽw����Q���8�L��B�7�a|�Q�wIoBw*���_ �j^���xX���g�I�Y;��u��U�����s����~0ut�k�����[J��'�Z�|�mKJ�����7�֥�^��=.8�xP]js�t&Ʊ�NCf��݆-nw[\���{
+]��O��	^Ξbq�>�K���yh���<֗����/�L���e
�W�DA~]̆�>3�	�\'#�#ͅ��냆���{��]?������F�Q)
1{%�)~-��̛e����,��,�c���\��"�q�͵�!
�}�s<�S�`��Ħ�EK�`�8�q?���rb;���2�Ǿ�à����%>�}�~w�-{8�:
�)�� W�j�W;�_�W���K'�?X�	:��{
ZM�vx7�
WnZȖm���.� H�cJc^�m"2�+5����I�W��|?5^Wr�h$V�sr~��
l_,�~�Ou�ao����p�-��
+kvJ�Ҏ���g�y�Vrx����orx������E�
��$
|���ֹ]?�n���8�����
?M����_���4,���#��I�p�ƽ�F$[�5.�Eo�b,��
�|��ﹹ&�����ۣNYN�ڄ��vcP�f\u[
>6{�һ1��L�x��l�h���hѨ<i�
+t�M�Y������8[z�f}�Ǧht"�u�.����f�Tu'a9�U��z���6|7r�}ܸ��ܨ���˝��eXzo�d2��>S^i!����?�ۆ 3������$���^���U8[�*��^��RT�,�bUuǍ*ݕ:���XGky_>��_��yu��j:���X
�q�M��	��SM�z��Rmc)�Cq�V/�1�ݔ�7�*'�}�U�y��t9=<�ɾW��
�6j�re��\�i!j�M�.��ɔ����&������k{7�+5��|�4��Qr��ft�����unh*�J���7[x�=6�~4<�6r�L�.E�:={��ڍg�}���jde��HƦ�N�K��ࠌl�li+�
V�޻�����+��B�iB
�a]6���պ'��7�rgpߎ���y��>^r"n(�W�.7���1��}]~rg:䍸v��j�;T��/��9�7����)�/0(
��x�K�b��9qe�
��睟�\._������YNIއ\�xEs5�\�����_�?�tVΏ�+���n,)
���@Sڌ�K
��
i�5����ը~�X:����Y��e<3�KTc�-�ڝbA�Ft>ȏ�|e���Է9����I仙i��>�qm at q�T��k��ݜ*�|{l�<˼ F���i�������Ƨ#��8W0o�"7r�{X}^��J�Q��|�/Q7�X���s��
��yw��i|�5F�w&9�h�-�$�Us0�!��J��_�1l

�ٺ�O��
+;��`��J��JYt Q���R,�'YбkM]q�tәwf�s�5�c����@O���S��s��n���}
*0��)��\�B����G�3
�t�v�

X	���|x�M��ic��S�E��b��K�Mj1�B��)����H#g��
+��\��n�5�ғ}�{��

�^�R�T
R�R�e"��
H)U�F����
+��1
?3�� ���t
Q���8q
+#�k�a���e�־X��o��(��B?�<@�qb�H*= i����c: -�
H7� ��)�5<����
+�H��
��!>6HE�H��3�������'gu_�6��66������h��,��̃��/���PW�� � 2���*x �� ���^��}
�t�
+ҧ��7>��
3���A���⬂t+Y�4S�@�=�U�8o7Nz6���h���}�r��c
+V�{���w�1��ؽ�
���l�
+���P�ІB�:��˭ ��-/7M�xl $,�bN"���i�Щ@rl
 �6H�-M��
l՗P��/��ٱ��񸅜�,(ޞR�	�ŴA=*��y��8�J��՜
��
v�-���z����� �6�}�0r�2 m�� �h�>�}0蹾�1w�:�J��밉
/*��qοw�2v��uJ~�S)�QY˻
+ݝ^U�g�;ߚ����E	�#Q{_����s>�'WJ
j��9����X9��)�.���.	��L�XGlL�w/�s���0��~��h4�|ƒG(�����-��:Y����N�vI>J!�$���y���
lM�
+�to=lຜ����dTΟ����EC�Z��Շ��I�����O~@1	
+u��X(,�1 /��3��+�F��C����k�#�9 �slc�n�,\��\��s�v��>�Y~�'��������\zK�z�m�욄�>:4U9������o|ƻ��n/m�W �� �D����A	��T��
��X������-#�,�!�|�ױh��֌O�#�+^�#�1s���SsӘ�
{��;�lst ��l?bv�>�Im���Ճ��r�l
m8�e�o�oB��&�L'�w���
 ��P�Bf���* �z�z��[C�
����K�z���`繀�~������Ǿv����w-ߝ�UvWW��,�77Q_�ljkUp��J�_=װ�	v����e��w����zp/�֤S��
��`�� �y�B�r�?��	�����=����ս�R�j�뱗2Kʑv��d���Jy�V�G������_��ګ�AYt^���nn,�5��!���a�r��\���u	SҸFݺQ���
=�
]5���n��� ��xk�D=��-��i�Wa��ެY��F���Zn/ �a�Rƻ�T6w�5�ej���Yѷ��'2�V��cj��Mb�[���t7i#h�:Fe�u��R�ų���5��֙IIk�gV�,<V�6� v�R ߚE at h��ˏ�̣��t(t����S'���^>�
+��6ڥa4�$U�;��f�ﳹ>�������ҬFF�I=�j/���LD,
�QԒ�~�N�r��l呩���s~�v���#�L>�����؟�_ 
�)@ ~	��mܬ�E]�U�sV_�dzKN��
G�]��jN�Yul$S
�B�0]�Z�b9=�LCY]�z#?�ˁc~ͤ�XuJ����*�B�s��p]i��� ���b*�iI�9���r�1��V�� �Rʤ/�g��䮧�����
2xz��:>
6�d�o|�j�E	�
�Zn{+i��=��z[Y,�K��:nv���
�n8��x&����EӲr�4jr5:t�E
��`R=^��x/�ť�*��y������w�P��M9
.1�U(�\������屭����d�Ysh��<�`�d�LTЛ���YqYQ����M˞�3��L�ڧ��S�����M��+W*O�D��tF�d�����������
z�}Q�0��5��
	/U
�M�yjFv��J>8L^�ˮ�����N��?A>**΢
+2(�

+�
"*�N���X�t�]�N��B+��&��
;I�
���c,_��g�e��tޟ�i}���V
.�t��3U:���.>KY�� 뱹��L,~�]��
+©	���qRb��mZ�n(<��P�f�0�Ӥ���
G�ҳ�햳���&q	*�-[#����Z���$��}�|p1s����;wu�q�4z���\��VV�x뒉���.q+q�#��*�EB�C|x�1(s5h���0l�����嚏�&v*��~������ΡI)v���)�}❟�Λ��
}T���;;z
[j�L�T�Cσ������r2\Qj��p�QH&R����@����\��I)�p�j�4a��wq<-Tۣx<�Fz�����!
!
�G�K�?�~�
H�W	ٜ�<$�~
x =�g���{�.���	#��.&�;	K�F���莨mI"d�+2����'�da=l�<�zڜ��? +��Svb�#���G5�>R�iۜȴ�ϴm��t�Z6�4�iɽկ����/}�m�A֕��n�Z}���>��B{\s��}��A�̈́}���ή#ϧx�^Ǥ�BtV���W`ƞ?�b
�
ot�){����:@s�JQ��
+�`B��z��Q7�Q��ST,7�����`�|� �]�/���8z��\h���X�s{&nu+F����Q��KI61�1��lL��O�OsҼ �*{V�H�0F�{���&��s���nB��le��ް�����fX
��!���2������`z���p{0n'+Ї%s�v
,z��1��X�tᤆ��%?y� RK�̋���%,9�7OvdR����F���b�����z

+v�IH\�//���֛�ab��pWNpU ��z�K�a��z�)stݴ���s���	i��i���'�쬜5ꊭ�vF /�I4�ݷX�J|�f6�0��h�@0��0b e�S��@!�R{><�
![�=>��� ~!ࠇ�p�\�G}�[�}s�'?`ߔR�o�J����8_;�#໕�������
��
^χ-ΙMbEW�÷.���rR�'A�O���,R�#���@f��a4�X
��6a��VwB\�m
��Uwp��w�X��7�䱡���\�E���[��-�Qo�,�
_��7�g3�m
�޲=<���٩��e�`����&�
�L��$�l���q��%�R�����(h�u��n������a�<������A����H

Qf����m�X�J� �`�Cv���V���׫�Y�J곳˙���`��q˩�/L�3?N�s�*dc�s6UG�ʷ�;��q�S<|���gP&Bm��o�$KA�q�"���>`w%�`4tt�x=.
��C�H���^�ʟ�U��֕oI�mID��v�"W�\�/�H=_��;8[����C��$pd[hbeB*,ڗyz�	X�z�d�SYU�:H���X��
��ʎ1w6nc��E76:D!`���/TE$�w�*5�w����A�j��}x>��}�_a4�s0z=U�/ή�a�?W���Yv1XB[M��b�'
1 V{�]%�<�C�=

����{u�_��U��
�X�s{��<���2ԫ�Ң�hw�i��<�tz�̀��a��S����lT����.���vjQ���*T>�V�@p+f�l�`$С��R{�������u���0RO^��
��<�SH[���Q[�vg�˲�ݷ��yo|�`�M���
+�C�N���v�9�Vkg�*��e����i 
�*�5�g5nԏ��.1p��K^���J{�X�o�x�.'�Q��4�1~N��׳� �%z�����
?�Xl/M|�Χ���]�*u_�����2�fe����Tm�g\?w/�z���,��k�p��H)���E��He���� �P�|���h��`���v:%*�T8���E��3~�V�a���=nG�B�u���k1���ܕ0�Y�1�ј�N]I�u-��C�{�����=���U,�S�޷Z"i
+�6S.��,O.m����z��I�rq�<cE!���v��f�ko%y�������t��b6F4r�k8��	�����r)�����k��c
�~�*D��BT;^�}-ޖ���P���k	zE������Ay$6
�`�/t�6�3���!���I�ԬJ�ԫX��gk��/2�^��e�3Gd����CK��Nn��:2l/1���Y�z���J����RN�?�����̗���"����g��L;�z�p�,�|�W�|�>[��m%�f[�qK �7�2�( [...]
~�Y���N�rs�|"IL>���|��:���%�&�I��1nf,zg"��)�|�V�	f4Ͱ?����c�L>
+��bI^�W��O�D�O6��'�4�+)೟4�W3�e.���B��QM�'�K��ʤ�r�S /[) ������ �O�
�
��q�'�{�����a���|
p��EI>�^�ܧ񬔊�G�[#�;D�e�1yP�V�D���}�%�Ӝ�iN�~�f�.�F�ӵ~�^�4רNS����o�}
+��=����^O�l-�|���:�(g�KR�L�nn�����<�n����E�~&��-��ȭs����d��O��)rd��Is�<
s����
i
n��<����Q�5L�6��n=�y�*�I��[&�u&`Ǩ����
.
�ɫk�Y���D<�F���ϗ������-�G��ly}�([���z	�á�!�^T���PW�{#/���/Y��w�oGj�O��w�B%��u6I��a������y=OOA
��q}~g�����{����"�չu�7ߵ�0F9&z�
!���i�vƋ�
:�0w��f6 ϻ��}�:��QE˃�6�a�����wWC��5���ʥYx�&���hƷ�<��
�g
���t\�o�|�c�;��n.
����٤r�+P�Z���e
6�
���x�:0��

�Qݭ��(�w	٬��
Ƞ�n�ʣ�e�޶�
�O���;-x�B
+V�z
+������[O�.�{����ՈHH3,�	���|���)}<�ӹ�9�W<�:��ޜx�]rY�v��O��
� �
�lG�#�T�Ja]�:ٺ�o�+���
tVS��:�C�i�U�5Ɵ�D��L��kwt�wM���;������c[��Q��
P�`�p�e�a�9tymפ�ږL	�}�������xw����|�zgWa�:]u����k�?�!�i�.0-7
~7
*���^�M�μ)����ZJ+-�!����N�l~ZWH���r��O�aE�n��l�
���iy�����6�^V3K�{����О
.
���i��x|x�
���v_����UmK��D��Ҭ�7��=~� ���մh:�W=7lŶ[,]� �
{]��[z��v��M-�h_Mj�J��
6��KK�=ו���
��䦱����.O�����ű�t�KJ��NO1�^��kE&5�Y���M��C"�fYWn���Ǖ���)��p���-�:�B��>�{[q���4۫ [...]
+���:���5n�f��0�H��
��Z��:j��=���+���_�g_���=H��r�*$�E�9]@9��"W�#9#ɺ����.v9�ף�a`/6�U��ow�}�Gs��zʼ�U�ڻ�W�
�c��*>7�#m,Z+Awr���`h���F|3��,��/��Z/�rJ���䫻�˝<��Ky/骑H=�R�VG��K��>���kU��ķ��q׻���;��/�����wW��f���j$㲩5�-�Enz����`&뱵�ᧁx���xk�u�w��io�i��H��M�Ͱ4��*
1�ڜH��/k�!g� 
+����K
+&Ar�����LD�w	�
���]_[��z`EgI��2��՜S/�y�r��N�XW6��{B=�MF9�G�
>��t
�s	���ɠXً׿���GrBac4�5W���X���c��c��_I���;�r�����
Cw����}�7<�cϝ��y�)�N�z�r7�����e�8�抍i
�a�Y�09r[C�nƓw'﬉Ckm	�2���grA�\��-�O�`'��`'[��3Vّ�m�?���k�x>���:`7��z�^
+^u�?�]�Eg�~uJ�f[*LkR�ה�w
�0�����H��
N`p^��
=�v
+�Ga|b�E2VKh	ml�c��(2�$CH����d;j�<~=�ݩ��������=
_,=Ȝ9��M^��z>Z��gg�d����d�Q�{�(���$9�mq�=�Gi���]��׫"{*��$��1<jF�3Ȏ1摛�
�:)��tR�
���p��7�_
Su�4(��c
z���V��J��{��R��`��X3�"���Z��'O_�n�T�={���}VDj�h
+%�����q�ڛd[��wr��H�"�1;Q@��;�>�f�Zv,�"�C�"��Z"�{F�>z1��5��v�E'�L��jx�
J�ҳө���y1ܽm3 �鑹o����etI>&N���`�+�GW��ՅYy��w�m
��Q]�̢h)��M@W� o��H� d����ۤ��!�ɐc��ڿ�<�V���c�vs���b(8ٌ<ޟLKEJ�9�Xm�o���n*LX����q�.�X倫:J�k\�
+�^��ѽ��2��5��M��sV�@���҇�|O;��1���j����G����>Q�SQ?�bR5�r���e�W���y^�
��\��xV�"i��r��SS�d�t&T

+�f�_/|m�?�+Mc-.�F�|�eg�
�$�bC�ɢ8?`lFH=���6{
D��9����{^Q�����m�:�%����?���Z���׫g����v-5��98�^bGJ����X�⺶�
\�]qg�<�
��GO��2��φ�]�1j����"���#,>���@o�V�!0�>v�
���@
YC
�f�+f�F�:�?
p�mZ���
UϩM�i�����pTV;Gx4����˥�vT6j��8d)�.]h�ީu|��*'
[#��pC�%��
X�R
11�$7(��w���?`o���޺�ٽ5X9������/�����
|t�Z��D��ζ
�Y�����`�61�1�;�
&߾���rs
+��0s¡47^�:�����B���5��G��!��P��=�$�Ȏ�EH�T�Gy�u�J`v�x��=��Gw��n_����5n=�{��2
+y�tDY��4e��Dq��6&�>�
j�)r*Kd�O/��!�&:����6�Ӄ�O��-�x
��p��DKel��1"��iW�����x�t�2��tZ/��)?
8^��p,�7X/�Y���օ��f�s�K}�)լc:����G�
� #�w���n���y2Xl�J�
Gv?׻o0�ʝ���|G�T�ݫ��"2�5��K
�u�Nu��0����j�Z�C{N��@+g+�,��ֻn-g���
e���d����Q�+�s���+��a\�?�lv����;�߹|
+���޾4B{B�d�S7��dDz ��mwZ�Ν���;�����f\��j��!�o}V*ע�G���m�xT
��\�7�Je�؎O�%�$<�/�/Y6ޚ���c���Q=/d���	�4/������4Y���"si
^@�F���������3iy�tޢ���������Yn��Fp���Q�c�~�ޠU�vi�^�=�D�hX��	�����Tg~��vP�s��V�N�;�YF�oi~�
t9^�2_�@�WN0��Ux ���
V���^�������xb5�S���Zny�����9��+�6U��h�@��6���d����LY+�\ �������h�ܖF�����RKYOL1�hS�8m'4ˆc��	l�<��pV�:p?,7v�#X��L��tHe�����gy24���mj��QZ�n��xU�w�޵�_��X� [...]
+
ho�/�W����2���!�A�H�s���2E�/��d��Q�܇}���F�y���J�n�Kkd�.��X�X��mP�6h�v��x'��l���[0]����
U�8�i��K&�ɘ5�0+��C�z+��w��%ۖ>	�!�$�-�q��%��)��>�O�PH�w���W� yK6y��Y��kN�}���(c�dl��X�ܡ�W��n��}��M bed�6�p�_��=���ءT���z�R��da2��]�ͿH>)�&��*%���N>�d�|j������O�e�>7�[����.&�K��A�3
4�0L�W�M�iKN�g��/��O��@e� �����j7UK���I9����`B߷�om|[M�A
I�2N'�h.e=�q/��#�W�:�9#x&�	�O��6���j��C�����WQ
�왧������m��-+�q,�I�0�Rd��z�8�Zh���mjH�G3Js58�h^�
�>�
y*�9
+n������
��⥦ ۶j9ؼF
���F��YA��c�Ps�z_-�|�R�v��M��v��t��
�z�=^YD}�v
+�!��j�2�V�Y�v�����r��+�Y\H��g���~���.I�з�
�p��wx����kS��O�t�G����vS�o3N;ķ��hc�����

�}\	��G3.E�J�5�Z���eL���̳��x>��a��>{��w�d[�-l������,�7{I�+J�������
2�����S�T�:�8�_NټY�?
��r�u�~u}waK��y7�����>9I�C�x!���
j

���M�y��w/co.W<mW8�l�VaSξ|����Z@��6�_�|Y
���{�����P�[^κ�@�ڏsn�z
�p�����B�t"���x�,y{?�W�d��v�6>������4��*��[f��l6�
���9|�/)�����"/��>
2/����^�_��Y�V�ys͂�������.�������‚�d�|�o
;�Wgo����0U:�f��
I���n���Ra�k�f6�i�
�Ć��R}�:3��c����di�X6���9��ϧ{v
+���
�ۉ]*�_������K�1J
�;ʂ��)H��/����ݯc�
���k$��Pe[�Z�~9\���/��*\p�w���=(m�h���}�u�����P[�a�+��=:��V�l
,�z�.&9,0������
��*�}>�Y����GZ�GaZ84�5���g�Q.��<W��Fݽ��oN[VRki�VѾ�e�������u����&#D'{��S+�'�Ъ���b�d9�y7���󚇧Wi�m�a��c����`l_�wyӜ�2ֆ�
iC͎ɺ2��`g�#?\Y�윮���ȇ���5l��Ӊ�O{׋�������ې���-kw��Gw�/�c�C��kݹjܥ��@��nU�@{ӛ�6���Z��j3���?�t����qr۫;�}	U��^���ِN'�p��x��j`��4�jEu[�,g~�",��;�������,��>5cьXȄOXs�8b`F2Э˃�>P�k��Pg��:�n�؛B��A�ͻr�q�"	��|9[SY��kƕ뗋C�����k�s�<�t����=����ɦ�9p�����ӛ�����aq�Ƒ�q��l�y=�� ��қZ>溳�?�r�
����
�S��*M�g��XK1&_%��~&�a�5�VQLdm)&J�$ڃ�����>G�� [...]
+j}xF��
��ԡ%�p����i�>��->���z
+<��1��b�*og��?��/�?��>�qn}xre3
�t�ܦ��f������Bm���]�<cpt��
+ ���U{d�X�v}+�`Q����;W�%�]dҿ4pсڬP]E(�?r�[.�;1ǭ�%��%M�6M�Щ�����%�a�F9�rT��;b4�V��#�H\��q�FD,.��x~h��U[[��zV>gG�T�C��pO�; :�'�^��K[��
Ư�
��X)<�\垥��{5>Ϻױ�u���c���E]�
�m�g�e��;�G��X�h�5���z	�\����b?��E
c�%R��fs>�ď�J�2P�|���V<���Kt�cN�#��o���ZL���,�6�
+[u6� w9���cl�o������;�g�h���!����4�z�`
i��y��\�Rށ�(���M�H柡�?<��'�*��
��Z2����<�
F��7�؞�<T��\�W�f���L�?҈ڈ��̠/֦-x����+�\TkQ.�����x����1�_DK������J;���W&h*�o>�T��#�#:������z����8S2��r������U&1'ֺ/V.A��HJ�}4��@�w%@W�	��!���ɀd�Փ,�X�,v���.��
�
+�	K���
�Z_Қ�٬�8\p3�M ��̸W�U�^�7�.H�QK�|�{#�>��W���k�p
����V�F=:.1}|[��޲KQm'}�����a
�rmC��F��|�����? �g�͗�ZU6�\=j����W>ڒ�)Şt�D{Z+#XU���`ݗ�W�w���w,L<Vq�`<3�٘<2��3hl�a��Qz�\��0@������D}f�p�x�𖌅��u-�v�B�_�-���[����i���� ̳�˪�^5�t�g3��M
�<���W��-�>!�ݮ��,��L$Ny��˨3�����ˁv�UH������YV��*PM�1"P�͏�o
v5U���i�G��3��� �ʻL��f�{�c�&���:bMP��},w���E��g)EӞ�I
��H��? w�qv�+sc�
�L2���ǎ<:o�v�VO$�k�aMa�DS�pxԩ
��@��Aa�D�1��;���N(��9��[J��:J����߳�vE�ꮞU�t��Ұ�|aj���0�95R���6/�Z�������'�L�kH�.LW:�sgx��5q�k)L�w4�9�ɝ\�
��>�:�r�#�BE��F��@���
����9�pH{�p���p�������aZ�Dž>�FK�Tm�E�rOCq]5��m��g{*� �oPe��'��'/R%�i�'��<�H$��M��
��]�z��:�4{eb4@���}k����\ (�(��t����(2:�(#g�i�ƪ�
+����;�$�"F�����T%Vrt}��Jwd!d��
@\

��D�6�kf�*���u�}�d����
+�[�}o��_{м�@�k%�=uz��%��
p��f��\��գ=O��<�v�mv뮽�_�˿_v�Mŷ涝�Zeِ�AX���,Bw�4�"5b*��}b� X��A��t�ҼB���/�*[]C&��'���X�?tf�5�oz�½W��^��v+]�d�x���!���F�&]�M�>�4
R�h��������K�4��^��fj���p���#NMB���KgxF�Z?
n�
��n�����R��vF�4�~�
�m	����E��$�9���۾5r�il�@���GX}��.�];>W�d��4�ٚDF�q
�?,��w��Ӷ�S$�C����-�ON�<X<�
+Z�*�N�^�Z���w⍭uO�J��oL�.V���v.V'5y;�k��bY
;�:˵n��jV��[��
)z�b
�}9]C�rjU�r�.�r�vF����?�@гf
}�I��*�O��A�!y,]��kym��:z��n-��QQWqu6�o�����a
+�˹`T.��=\Z�>�Cb�0k�J�X{���s�+n
�G�ݴKE���=1��=_ۀbu�����+���X[�]��
V�hUu=���}*��C������e�Tj
���No�[����*�HX&������q�
�"x��(ޗ-�>�����
+J�
+�p��gã����}�я
Z�@�B@�? 0�d`P������A��dD
+0�7�(�e���
��RBoL��U�z��\;�OM�\���M�J�u������n3-�����$���_�f��
 o��
��H8 obS �6K �7N���vF�8�t �c����9�q���m˷�7�?�y
+F�)]���
�yYT�egW�� �.4�Q�n1X��a~��o�y} {��C@r *�VƲ��M�o
�
�2$)�b��dx1@��RF��+ ����
 ��BS�%��>�$�Jk�������a�
+�D?`�^f�$���I:m�I�MG���<be���1I�\��M��$�
5�,��f��IJ��
�I��AN ��
+"u|m"��K�r��'�~F�z�!��b�=���������9$oC�%o��O��R#y�~�^�Y�aQ�`�0���-�딤Q��1N3���#�8ZTO�G�~y�\�E��s펅G௭�!x�n�t��aXH�$q����.�&ѽ�~��`��.��$�+��B��h��5���+�T���}�Z�{������O3�v▎�$�G��:^^ �?7�\�,��l�P���f=V���}r��{c���sP��
ꇯ��
^����Ǐ+	��!�G¦ f)�L�)Ф�쭽K�ѷ���>�'��mq���#Ʉ4!�U�$ғ�C�C������w�@���
9�T����C>cm)|�GA��ڮF���	�}��~�tY�W��v?��������G��J
+W�	�"v�%V�,��2
t���\�sLsy���̧��*L�Onk�u�#�
���7�
Qo�b�Z��2$�������+�կ��.#�O���nUI�'Q����t4>t譹{B�u��
��X�� ����-���ŵ�|����:�� ���K�����8��f�~����^7�Ak�
��xp-\i�R����rA�S=�jG��.�b�<tރ�� �=�篻�H�f� 
�O��Q5 N
tK�ʦ\M��j�r�'��qu�����b,�Yp�6�9�:͗�C�h�4?>>^P�|ޢX�Gx5͎�+x��� k�Qm#���,vw�駿܋t�b�EiKߠ�4k3~!�M�b�5������T��

5W�x�z�W�\����ZT9[W:o?���h��%��6�������柗(�W�-��]H
��� �%��dΦy��E�^�@z��Υ�jW��o
+%f��*��ꊧ
c�������mܤ9=��t�t>�B�!�2f3A^��#�Z�DnBo5Z�!ͷ��4���߫m���
vd/JI�
+�A�<�Jq��O�vP`��;�F��jr�~l���b��@��t��|^mʡ�.g�z[���am|�{��"�-
��c��qs~ݗ#~R
C_�k�7�}��
�����*�P
n7�c]��K>�cL<����:�-C��?�������y�\x���X�ӡ{㏽V��Xժ�H{1)a�y
"����<�i�}B�a ��?��^_���rlY#�ej�a�>��[�Sه,S���`��lwc���›�6��I�Yq�We&X�ٔ�k+�����K6�K܃;k7�.����0/��3�:zaޝL�����??"�(ל�<Ҁ�)�h�7�k?^M�e�;=��"�W�HQx��h��j8H
i?_�R��?��
+O�v���Sy��0�
,��K;~��m([H/���L�A�9B4/��:�~��+�
+��(�f��nL�\��;,�ժ
����T�
V�@�m;)"�OI����.C�dޟ/2V�M�֗�/iA�
�����������i��x�F��!!Ψ��-��q�5(f�2�鏥'��J�,�{-�M/�∈��KTa��+Ǥ
ɗؐa�ѓ4�MN��P�`��.Z��q�

�ҁ�G)u!߬-�|�̒5�_�
�^7���'
x�����q'�2%܎[��-Kt��9�.i㉚�n�S]+��֬Tk��~�w>+���&ñ����^����Ab"h-�瘰,��B��<sj8ܶ59ql8H�
9h�O3�����
����p`�a,��t����i��t���9���D������걳�RW�|�i�u;p�UV�
�wRO
^&�q�&�n#�>T�)T�GC�s�d�6#�"��f��i��2c�Vi2��u9�3��cY����wOS���U�g�^:au�q
^(|�4Gᴡ�7t�~��i���V��Wc*�&cSB��;��H��N��3�n��|i��p�ɲĊ�}{|��,�I�M/���`k��Ƌ��
,�0a�GE��}�����D.�r��;�V���2�3㮺��uk������l��:�j`
�H�宇J�^�D�q1/\-��Q�p���sՊ�e�l�_c�
+�p)�G���1�`;���gF
+�O���A���G�[E��/�O���K����ς�>�8޳�5�t4��dU~����)h`DC�jZm(�����
�'�r糳k�`��|y�X\u��؆�܍�t
͢ύ��J �*�
+���z�D�ʾJz�g�����$�k
�6�\�bFz��_��
�;*B?B	~I��.�Df~K[���i
��x�B�?v'�zE�y�e�Od+In�cf�d��cU�����2�(>2X��x�R.+S9�I��!���h2,����<B��n��2^�ay3�}����k��P���#/��V�w�`�X2����o� �
(���-�8Y?g�)���\��z�fRS�p�1F���0X��i��=P��2��<�|�E�����$�@�5�#�-.�&�9��aRÛ�ƥ%������˱Ǿ�ͱ˞�/���G�5�u��5~@��<|$s>DʌsB�O�ܡ���!4
O_�x�
c>Om���|�
Uh�Y�ʗ!'�B�x ?
u��`��~����N�?`�W��}}�Q}������cT~�OK[�o��$Oޮ3��|�&3�y��Fe���|WJ��U.�Û�����yA�g>���)o������rIt��
�&&
u��B��
:/����3[��#�ii���t��TqM��l�4�^�_�
v
	����e��
+�Ehw�F.��s��M����Wy<G\�1�����^�vu�G�"In\��Lb2��#�h�W��?�:�]�nt���G/����֕�SL�����8]#���
��@l%���N��Fj�
��}��5��V�nQ�.�U�w?٘�������kvJ�C���%x("�!��
~�:e��� I�f�$ZK�F
�cU�(��=扂ȶ=n"��&�³�tk��s‘l��8��W��:;��<f���S��<�
��M�
�7�T��� ���
��Ӱ�
D�8�᳦R���z�.���>e
ا:J�Vo�~��/
�ʺw'�.�9
�F�u
+pxV.L��n�̦0�޾�M�}C-�}7�<B]f#��
+��u�E�}h#�{=���l�Or4]H
�b�����]0�7{`��&���r�:����3�W~.D8J����f��v�Q��#�y�a$_I��
�^���,�.4ߧ��|�����ݦ
[��
]����M~qǢ�/�y:�}
��C�$`
���Rc��k��I�_s/
Q�\�#��+����su0�3
��N�zD�����^��e��Pm��c�������r��7
�n���n����m85�ּ�9n��u�Qu�|�ԡ�N�źD#��x3ev�_y��(aW�a���ؤ�������Qlw������5ık��F�&M��&X�k?`c}����E�2����S��\Ԏ��_�\�K�����r�6�mcMV�bgV�n��J׉k����{~�C��%�bbI�iԕ���vg8q3�HV;�{�/KM"��rX�od��b�W�&SN6�c8�V�x�h�
V{�B
(Bf�Ӏ������O�m�!��f�>����?l�疪��(�+��
+fTr��EA%�0�z��=�X��y�{�1x��
+/�%X^�=q����r�	P����pT��
��mp�TW��T�6��
���`��I�@ON�M?xwDA0�5� ��
��`�´ Iö��>��_��Q ��.��|�z���zӬ�����vK��P+��u^�U>,�j�G�3g�
u�
�{0-`q{��|�̛�sU�29���s��?�o@���SAC镬�qcF�Lb�p�
���rW�
ݔ�f����Z�","�{(L���
+U��= �� *�W �0B ����� ��\�&�'��Z%�_4 at K�@��ی
�9!Ў��e�RƠXY�o�;��nL��桍8�8������R���C���R�RX:Tv���� ݭ{ ��' mn� �> 
�� }U �s� L�`�Mt���˟|�s�L4/ L�a s �
|���֮e����_4]N���o~?���S�q�p�
�q/4w���6� 粟��`"p�?`1�o1`��
@��`���?�Jg�Yp/�٘ �<����
��X�� �?� �H� �8g�����oQ�qȹg?�^�*�%�����cyN�i����fٛ�,��#o�l垲��eY��Vs6X�	e>G�r�f�c�eb+���i^��a{�����5��*��S<
j�ɐGu���	��ܵ���
�Nt��Z
������üF�<Vs�}J��'{
��{����R�f�*�Ͳ�Y˲��C�@=������<P�36km_k����^�����*�����^w��,�2]���	��N�E�
���b����������g����˾��
�'M�m�[������ݳ�iQ����,8J�X��/�nk�呉�*���S�&�#"��>�ѣ���w����#~�����u�|��eV,U�O���tt�Ro�'Ob���V��ƥ������{�%�:%'����<��$���̾hs�}n�>�̆���nVj�@�<�ˆz��c��;�6r���R��WL��/�2�^fQ-o-ϯB)<�=�!�@�%��+-�L�$
� [...]
+��Z9m˥�{��v����?��'�$��<t���7|>[[����{�#�����黀Yλ�M�w��l
pe�\��NK��s�Q�fg��>~Z�K����ȋ,nm���ֶ
yئ_��Mm���9���3`�#�dz�y��LQ�ַp}Y��Mp����:���
�����_�!I�w��Z�B,���{v�L��eqS��N�δ�ì� f��<�靿��n����9�w���V�7�.AK��z��wV�щX-;��h/�]5�y ����u��&Y*�r��G;�hﭲl�Oz2?m��|,7�s�R��?1�����ai at B�Q{H��t˟_�萡�(��2����=�t��v�
���)o-�u9���n�9�(:���,��\$�Yh~��PK�[*����x6G[vm��>�7,��t�4L�t44���?o"�~6����S��a����ޚh����M�G舴zw���~ඓW�z�Ϋ�Bg;�p+^�v3{�'��w�V����ku�ql#@����4�՟�b��\���c��$X%�I���cu�ǵ�~�>J.���w��p�4O��1"'L>X���
D���k=���q=�f�
+䨋�g��2��fOrg3����Y�N�n��O�x��=Y�lZ��DJG�8B]n\��ԑ��ᑣ��H��p�?�a������@�Կy���s���pw��B&
r�*l[>�\�53�A.�-՗u���c��Xh�K:���n4�č�4�
&�����yב�u��������h7���NX���F��??3W_�k���ް��'=�=�Q�rG�[�쟢�ވ?{��6�.����

t���]�#p~9Z3�P�oy N���6�:�x
��ָ���|-x�q����``��6�7������?��Dx[[�F+�~_H�>h�w�j�R�1�R"dUir��_�O9�'V�"�)w�t�!�َ�]�!�ˆ�=�W.�|�֦|�ALh�a�	rG"�����ظ6���Q���y��WB�
iG��G���B|��¦�{��4@~"﷗�lLNP�Č�|&n�7鿈���9�ݏE5��Ϝo�?�j�j�K}�.���y�2�ͦ�t\���
7�c|�n�y����P�����P�ξ [...]
�t M�|jh}IqF��[��l&�ҬXy�[{)
�w	-�K?9X
��G�2�-ٺ@W�^�޽��zٍrA�Q�H+nnj��-�΂[wk[ܩ7��L~- ��&��~�*��p�>����
�L�	ݗ�aOU�=Y��.t,���4y�xk�H���`�M��ny�
7yR= ��|o
,��=��ι��,֯J��/ǽ��DP&I�m:�V�`�/N�I}���ǔ[�qt���`��E$~���V5���ƕݵ���cI�;�r�(a��!Ό�Tx�OG`���犥c�,d���FX�]�n9
�\��/\�5�n9�r9'���_~_���������5'�i��Y�Q�=
X���V�~S͇�G_��K���Q-�����i�Ƌ�B$
/q7g3�u=o�{/��Av�������^u���Yaw�Hd
a���
Y�J��֘�y��=��aG
�������Ĝjժ��E��E�
�M$�}�Z��@e����U�k1j���GY��V�
ϙ�{�_漫�
��3f��͍�/�"3&�-��4{�e��:Sv��SԮ���s��ĘN�q���W��S\�}�[�t���ȭ2iP�Ӡx$���ZҌ�֢v���� �Tސ
\a��zP��N满�͟�nu+ [...]
�R
�
K�9)N��"C�U���5�����i�^�ٻ���$�-���-���p�����	(��7� �K,:-�n�������bO �3�j�e0�#гM�O�*�bxpF���
�� ?q�ZV��$�~WV�>�\c}�Y���5��KW��? ��`
+����^ȋ3��Y�t���X ���6_N"|��E^�n��
+��ꞰH�sg�#
`pfU��-Be�=E�҉'W�=�}�X�
Q|M�mTY��
c
����:����ؕ��Tv�1}�q�� �ʕAF��oymjή0R~}�}��
��%o�5�^��|�����c�d��PY�m)[������=����R_��po0�j�D,I}
k��	:�ݗH������5��c���*�=�m}�m�fm�8i��GJ��CB����^@_vZ�����z�q��
�ત���]\>�_Mg[Ɗ}���lF�3���@1��e��
o��J��h�m! ���9�3�F�U]�ڌ��[�phu��/�]�0,̺
��ys�
��M>�hǹln������
����5��i���燨�U-�$��I�މk�f1�
|����
U�C�ܺ�'q{yH��o;{�V�&��WR�U�m
�I���b�U`H��M%V�ͪ'
�Xy6�y�n|+\�e�Ƶ��O��E�j�l��lS����\�
+*wu��Rn���ʹ��"����w�!w�_[sOl��E���v��\�vvcG�~���#Z:�G ��ِ�P;
^�f�O���m�z��Ju��*Yh���??W�r,��)�,�<(w���-��eenۣ�2[���ԇse�@���.d:ҲAUyMi}�G�� �����~�~/�u3
+����$����5�ϲ��e�z�L �
]rvoHd
+$����
�M TtiV�kT�_JV��������1�a�_��c���X&s��/yk����h&6$]�����!
��l��R�~a�)��?$6c���#�Ʈ,�
+�����y�L�š��m��P!-LR�U@'c����sF}�J�
� G	�͗��?��Ĺ��М7�����0+:�� Xv8Y�(a��N<��O�j6�7�`��Y�ӭ %�����U��f��x ǔ��� r�or�9 d�} d���i� 5B9�
PK1(*����Y;J��	@��('yTba9��QH
��k���Ԣ|�T�Ƌ���N��!���'�e����[���(����/~β�� �� ]� ]_\ ;� Z#A���-�N�,@����*�r��
M`F/�9�`�#'�䤍_��'��1`,3��^Ai^�4�t �ڽ~��8��S�����Miq��\��9��Б��� �O��|�O�4�S��/�,\`N%�gM/8�V�j ;�� {� �K W�H�U�Z�M��v����M}f�#8��R�gY����
r��,�q����aP΢��d�L ��0s����*��k]M֯�
Ϡy����qxB���"�ǣj�������s��lC�ߩuk�/�5��';Zz�Wds��E��	��Ӭ�wpҲ��w�?�Ƴ<Fl��^��*��A3�Hf���}��Yz�������𡜟�{���w��v�
��ߌwi{k���5�r�+�K��-�

��]�gj�Zi6�V����R6���"�X�$�����{�hߣ�${w:y���M�i�����R���Wo>�a�'腸
�=sk-O���{�����_��}x������T�3��Wi���?`�
��i�1���
ŧ@Bf�
��h���h�o<���-n&�>Wy�G[�g�$e���%��f�;��������]�(�M����Zm�O9�L�L�U�M�FK8��r*�q�(����)�P�xg��X7�}r�/�u�h<�����c��iU�z	ߧ����2�%�"}#�|�<�k燮�d��:/���u�u���2���дg�m�ߓ�q�Q��ڡϡ�~ �|
��m�N��$��vL�&�ķ�p��eE��ڍ����}n�O��l�8�
��\
꫆������}�3#�������w鍳���>���y����5�ʹ`p��2�����M.R�K������3ZR/ �D(\��FX���o0��dn�uLiSz�
vy/4Z5�7&��K
��z�r���9��
%7H�?80-��}_3-�/�r�g%d4x�����n�O<���1>�b/5��3������'؄�+�TO�S����X�oأ�^�a+�D���56е�-��㱗�ay�ȟ����Y�M��
>3dY���B=�z�������{מu��s�o`v
܏�?�
9mD>�
X�M�l5r�������!�?��c�<m���X��wk�Zt������3����q<u:��]_n	�,�Rz�� iQ��=��
C�e�A����ôu��]k� �;��o��}	S�+��
�s�gg�؇�Ź��rR��e��wl[��=~Ť���:v�Wo�ܲ�����`��������
|&����^�q1*�.ұ6âgǺk���U�G/�0�2<6W�2
G
�������鿼
utr�'�1�U*��&^�$U����l=ŵ�%ݦ#&.���ܟziL=�n��h>>����3|��y�m������l~����B�,rXc"z6A�+��p��8o��	`x���p=�a+<P���T
�_
FS��Ev�팇i��JR�n���B����sY+�@{h~Z�
�3��t-Z�(Sg�L�`�=�0���;����p���d�,�t�3�kxX��a�8niKh���������ͭ��[��i���m׵SM)
+q����Լ�Q��+ �.�tt�
�1��ͺ𱞎X��=�cz�BN6=�;)oy\[Q�hP�Fã�ZöK-
����k��ʌ���o��ͅ��ƥZ>��{�i���ݴ_
+�u#m������/mo�:���_
��Zi��2&�t7����v9X�r���3Zn>Y}����<�r8��8g�h`\�
f�`�?_�Tg�d��V�k���
l�n�hQ��TX�6	��j����^���%y0���E@~��
��t�%�}���? �Q���B��c�b�8�s+���	.��8��ld�{��SƔR��
��jI����{E�}��
��j�U�B�J�K�R�'ypv�2l�k��A�R'H4�"qZ%����r>����i?��L�N�5��jK
��9>����sbד�}�Ǎ�!���՘z��`�}��e�����xG���U)�8�iJ��dC<ΥS��$�^ދS�~�8dB�|r�
+������Q\�|>��s��Y�h����j~#ڷZ~gU���E�^V�v��8���F���<��Aw����Q�0�j^b!.7ժ�G����qgX)����LM�ބ�� Ka���^ƾo=vV/�_r����S��p�����c�����
��pi<�mR2)Ϟ�;n�w�������K2N��r8���� O� ֊O��/W�o�V��f�����&�
��%�/ؽ��˶`>��qUx����-�k��n ���T��\h�=.���\89Y�
�V�

�/;�l
��ܧ����,wt�<[ow����Q���3����:�q�����F�A����<L7ir�B��ZՄ'�l	���{��g{ ����>�K����=�υ���<�
V��9����~�m�Еmr6��N���K�-�B0�0r�bg1�6!�[�n㝮E���|��H
��i+�>��GT'�L�L��n�	ϓV�
+LU��\݀{�q��Bg�t7ڸ�-�}���Mvg^Vl�P�1ǡ�b��U�>O�4m�mə>φP>�	�0�ݡ�K@D��[�:�n�<bc�4��h4�C��<�}��G�`r�J0^���)^�� 0����]�?�_B 
��FW��7X���.;�x�9յ�O֘/h3܆4֯ߩ�^�(Ҹ�=2�Wgr�H-�L��5j��꿄��{t�!���#��'�>w��@ff)����^�)�����g��z��<�E~�n�{֭��%NӊUv�Zl�]řq��җ}C��>��*?#_��\^W�"%b��0����7����7�X�zubEе�l����.�N�� ��ŗ������ķ��%ᰢ
����Lq�
�_�[��
���#{��lk���%�i�A�k���J=fMQYQ 
҈�
��K�� Y�p����:XH�Ly�#,l�XXiְ�\�!�]���}�����N��mn/��p��O�S}9mc��^��ځ�%���
:��9��5�Ρ��2�B����I��wA�t�CJ@����o�W/��fSd���Տ�/r��p�]D���9�
9����
c�]G����iq��Aܼ����KV����:�����
4U��B��H
ҽ:[�k�G��Bآ *R�������5��+���Z:DFǪӹtĤ�M�Y��l4ڳ�Ϸg��מ�j>�m�&�s��gjT�e�
�H�;
���E�^j��0)��� ��z2f6����,"���6��Om��7k�54�
������"�v�5d|A۝+�Q��c"�t0hS��n9E<j����W�o�WS�׃���

���'�c��9��Ɏ�j���>u^�~�{�f�3��g����Z���v
+:4eAEyԱRs�!&;��D�I{Q ����e-[\��[���
���Ҽ�67�:���e�iD]�ި�������O�;�����R]���_�	,Y��G��Tt�Zɔ�+=
+��n�m����!-�!z
F��CRu	�K�>
�^�|-̛
�qo�4��{n�7�W}��u�������k'�ثu^e�zY����*wO-V���P�?���MZ!�z>����n�2��k�̗��d�oi�"��פS&Q�0͇�Q��:�5陭6H$�3�n�V�VQ�Ej��W�.;�<|~Z�ũ[�[��X��ϱ���aJ��uO�2P��y32���t�� 梜��t��aD�P'�l���ݩ�0�_,q����R%u�u���gO{�4
+�\����⚁�|��[�t6j�ۂ^�I�Tv�
VC���V��Y�^
��_��R�5���w{/vP�D�0:ͩBgR���
:Z��}��
ؐ lMr>' S�&�LK��n�m8�&�
��.�iX�x𤗯]JTߟ��H��Ģ1������
�
+n��Tj���LU
�mb��� 
$�o�m�x���
�/��� �u���K�(O QA�9W ��	@ d
�B!����~�L�+@��ѥݫ��YN�d99ߑ[��ZB
�
�v[T�
lBA}l��ыm"Q:	 ⵑs�ĵ�ȡ�?g��c���� �2�TO�|6.397=�f�d�������m�䝜T� T�zT���E�2��?k��e���,�B���>�=�K
�BQ=��u���6$��iIό1p;> ���L 
+�L�"�K�.@`P�p��� �b�и�h���u0h���k�w�;@��&@?����˜`0`㕣����1B�Q�
_��At�Z<[�k|�O���g���:��(�� 
+��k�-ퟳ��m1p���& �+�dp7G���� �!� #���-���,`)d�������
��� v, 6�� �n_9��O�7?d�a�e�"f�`��[������<�x2��Y֫sF�?��L���m[}������|Mz������#�L�?�ы�<��0�k��~;���f|��kި��I	\�2k_��|������އK
�dY�
�<�+�G��9?���1��
�'��d������⡎>�v�~TM��'XW�7�L�v������5���0��U0��z���D�3�<�i6`�){:���mj'��Z9��T���/ǀ���>��O�v�˲w1/�Ƀ�c��?v
#���
+ɋ���$i�q�n���x�k�B�?�YW��T�.���v鞩�S�A�){�Ӻ-NNES����O	�q�ׁ�y7���]+�I�^�dR��dwQ�� V���p#�b5��m�L~h��S��@�� ��?�W�
��Og*L�8w����8ށG�
B"j��m�+�
���wr���&H�c��Ӣ��4#��\�f�C��.o״�l��Mo��Eos�?d�$�*�9����Qo��f�
a����RMK��"/}1;J���'���Q7J�=�O��A�-GxDO at xG�g�7h�Cg;o�@u���t����o�̧���,�Y����?�w\��S+S�s�&�E���\
��g�����|^�[�[K�eF-�S�r�����OΎ��3�F
��B��xj�p+0F�٬��F�� :��Ax ��9����mx��x#�b֗�XYc��\�q9v_ҧ�|�d��>0�)
d�K��_�o����;/��,q��^�U�w����C�￉yV"fõ��T�7J����}�����Qg
����Y��hu?%��
��+o+\�,�-����+*������ؾwQ�t�vc�U�Cpޞ��F�Y���/�W��O�
3�؄Oe,����-��i�8�Vt'�?`�e���F�Ś����z�#������7S��8.�}^/��{�Py`���g[�/ [...]
�t�[ˁ%��Q$��Ky+|,�4�Ӷ�ߋ���p��v�R%�YQ�آUo
�\�+5r��k[�i��vc�ʴ7p�U��>��W���DEDz/�x
+���D�6��DS�����Gb�-닊��ޚ�h\ }�,��R_Լ!�Բ�N5�9��?��߹�t�f%i�P�
�5�Mc�Ùh6��~9&q�E�'����r��~أG'������p

��y�͌�����i�X_��E{�ϙV(�
+}�ڗՍsj���V�
�w�#��$
��@��L<o͍�U��0��I���3kʽ绱�-��3�[�ɎV����S~ٟ�4���'؛��2�����\���4�'�l
�_R30��/
^h��~���AC�����)��R���X�᱘����t�
���\���r���^De�c6��Ȼ�Mꍜ������='�����eGJ��(,�kv���������LZ���e?�18I:s�Z!��v�J<�n���~����*�M�K��
/> a.e
��T��Rk�=�!J�j8
��v������“���*�0r�SXi�)
t�Q>��u����
��9��/d�?�˔�j���%,cګ�:�i��*�Z����`�|�,�z�'!����8	���&P�黷<�E��9U~uOZ|�J����z]����+s�*�!�E�m���Ш0̡Ysr��m
�����9d�D~uA��Ԁ]�@���c��к�
S�4ճ�^��Y��V��$�T�&��T�:EG�qh���ƮǾ�3���O��S�n �P^bP�7�Pu0��
9V��*�H��Z��n�+=��R΅���Φ'�}�'�,��t
�C�4eܳQ^&�r����i���g��hj�}*����ɭϤ+^E�M��
�y��5ߛ\�np�N�2��qa��p5�]bw Wg���a�K�b��Z�'�똺��em�Ž"�b�|֦���,�����(�?d?�~zm����Vs1����^?��Q���b��!+�ÅÊ֡M��ݚ���Ɨ&�Ͼ
+2�:\$L6\�޳�qze��k�
g�"�~����6[4z�IjF��\8C��\
��;l��.�"Db&�.%9�'ᶭ��
���Uoۀm�d}M�u����ռ3R�3Hg
����K��ۭTw2ן#v�,�YX�|f�H1�ѭ�6����Fᗚ]v��|����o��0h��T
�
��

(�Af�a�/����E�6�]�m��
���/�e�1�|�³���ƻ�<<S��M{�-���{n>��n����}�����\}z�{&�7�.5���!�rջ�,?̈U0+��q��!8Tx2�"5U�Z��Q��Fh��?���>H����U��v�E�N�����/뷺Ŗ�b
+[��ud*һ^y��[��H���
�(��;(}-�0�.82�*ɞ�a^/_wf���E�
���vƥ6��B�
`*6���|�FYD#C�&!�;=�L(;�����ujm���Ւ��U?_���3��|�%�+���s�0+��n��b�ߎ�
y���޷J�v�1�u�3����dE㒷��h��VLt�aKt ��ܹ{�88^�Q
x#��~�D�F�6���	��S���Ї߳�v�
�t�
�
x
��E
+;��;������l���
+_�o+
�?��9�Rّ2�߈��N�t����!��+���δ�v��i֞W�n���a�eu��%1������?�W^�
.�e�)�6FܶW���NJ
ͯ�Q�=�Fſ��ʰ����yoT���ekmPS�9����r� o��S{���6�v���3��#�"�`���L��vk�>��~�`���f@��M��ϚP4]5�J	j�ujT�g=��R]��f���ڐ蝹v񸨦�ޡ�Vv@庖���3�*��쫈/<�Ȝ��2�c('O�x�4��Y݁�P\��_~�y�ؚh�J�D,�A��u��s� ÚeC�ԛ;���H���_C�zކ��Ty̪X����n|T�ͦi�$����̪���Q�2Ý��1�Qu%�
z1����kB�5�A�|��@���UJ
lxs.Em34.�iaχ:ת��q�W�|��L�u���۔�Y;q4R����-�H��9��d�ء
��Lf9�5(��1��k),�@I�<����E-��bC�
+��=i���,
+-��-������]�����ڃ��*�F���,ӌ�:�y�,�M�Cm&���"�Z�J��Mr�^�P��&��}��gi;]8s0WP�h�
]�XINvЃ�\џ
<d =U �ݜ 4�! ��,��_@W�C����h�m�5J?��dԣW�#��ݐ"e�����v
+�q3��z��0�
+}KyH`U�=KT���P ���
��sT �]�Hs /
�W�; �y��̷�A 8WPs\�����r
��
�=c��8�}1��U�
�,x
���e�B���
;��m�^�]�������mu��gUp;N�R��{���d�~f�X ���r�C���)@�_ tv
���� ������ Ȇ�d���I[ 	���Z�l�lv ٖ
�h���KK^���I/1t�z����yմ��Ҫ6U�V�7��B�^l7 ��K�N�$�� )?�?g#3��.@�� �Z�=@��;@��E�z�: ݬ	 M��B
b
�"�h��pf ���8' � ~�]K�
]����O�\Q�Bf�\��~::�R������R6 ����O*y0��.^����o�
@��
����/��t�g�QJ���
۵0k,�I �� �
�U�a�5 ؉xΉ��d�
�Y�%���	��
�e<
���,���	��ն
����~�+;�UԎ�3h<�'4�
a�>�Kپ'xɹk��o�Dt3��ᖷ��`�H 4/V�/x\����럩���~��e�'P�?~��6���(������S�<^|�Oq�J�j���������{k-��u��K���K�b�N�
�yM�v�5;SI�M�&�9}G���_��1 @�-�A�l��ߌ9TW�I����K���<L'��p�џ���]Q{}Ec�w��PNFx׮�ӭ��nWd�d�8,���Y_��N}�:}

9�N
T���m���RŽ��CO
�Z����$^���,��cP��Η��+�����m6��,le�d��#�ڿ���
+)�.��5�K���mN�6T^��`�����;:����P�7�}�]\v��⑤�,K�p�Vm����c�}8��1��S~w/q[\֍���;A(�o�
+����ݵsΈ�(Q��{�%{,{S�ZN�G��y٪k��0����7S6^�Wܞv�	E���W�'��xR�F�!�C���!{���:tm�vq��t#�@n�
��VT�^��!��
T
�Z��]OZ���NV���vn+�0.����������}���X����g�xC��1ʟ��i//G	_�!
bK�U";w��lGnK���)�;)P�G�O���$�S��|�^�y��IRڬQ����#�����r�Yp޼Ws���:�BW�B��^���m!
�Ң7 ;:��
������@}��
- ��\�r_��wH%��.zK7���
�{��W�M�Ӹ�w��_�j�*��W� ����;�r}�9s
+ur���`�7c�b�E���3]SUY���E�
+���t�
+��(�b�w���Fͱ��g=�ԏ
�'�L22�0�
J��
5w%8���o�j�({q���Oa����)6@��b������&�y}�>{%�B��_<�6���j��&�\�.2�:�����>����1��|�Ծ�P#��`1A��B�^0�E��-Z��U5��
��G
+�$�|.�qJ�n��}��`\�
?�#nV�@y�7��L���į o��/���N��Ѷ�=���
+<���I`w�V���tF/>��^~>X��!ڄ̣��s�l6�=*/U�г���lqݨH��-P;q?iv ���d���B����l�b�9��x�o��bf��m��t���m��7_W���]x���J�ԡ��XZ?g.�o��Fn8��7�#�=�捠`�a�S��!{s���˻wFR��KLFp�B��?�W�_LWt{^�v�qU��hy�o�sۍz��h��7�-���x�S�

o#[�[��G���������H3�?����vY�
�7I=�1Lw�A%��~�|�z4?q��m/���Q
����7�c�y9߼
s}{��w���ĺVku�٢���q����NӲ��$h~��a3s�V��ʹYZeY�]��ŀqٙ�����ƩU�+�Β�Q��YF� �|��t�/#k���Jz �9�m럮�v+c׏j����
Z�,_��T}�/��٢e��o��6�V����)oi�K�\��m��gl���@��Q�S4���6[�:6]v��.�2��������b+L���6�.ļ [...]
+�JZ�Ճd�T��r�]���������e�vpZ�c;
�}Q;ԉ�=�_&C��L{Q��S�:q��XT�n%���vgߙ�_�w\
\g�tM�iP�N�Tu�V�{��rTchrue
���{�
Y2�"	ɏ��z^�v�ݥx�.�0�	��h����U�c��%
p�*�������M�럌������*�{�݋��/fGͬ��
��3:�
�(�ݍѲ�WL�(:�5Q��|Jʗ�J��12l�d�\WLq�Ҟ�FjO��ۣlİQgV?ɓM=�<.|��D�g���#���&ץ
+�7k�;�_�7Ah�;��̷כ�������j=�,�J�y������
;
9Q��W�&
��~��	5DEI�a�{~X��s�
z\<m�
+8�t�A�ԩS4=�ӛ1�Y���
���E�Ã}��96�6����IN+�)��.=�
Z��g�I��O�:�g���_L�W�2D�񻛴�k���{�wuk���$i!?'��}D�"jâ3b�l�p�����g��d�<�
Zܣ�ks��Ǿ�Ҙ
I􂕁�g&j+e���K��c�6��Z��լ
|�|���m��e;��mc��[��y��!��rb��r(�	�W�`(=;E�^���
6g���+|7�T��Vh�$VWT�p�<ϑ)�	�
g?����>�1�T�5�j��?�(ܦ��(m�ɝ��F}Rg���'k>!��D$��
.���W�
.��K�8�/�Ғ ��?��{4��w
��y;��d�c�Ԯ�.(� Ė�"���
�F�ln�h�Ti���t�K��M
+-�.��h=���#c�
�x�
P���û�n��������B���p�.Ն�o�6��q�,�E�d6hfKz�ב7[%��8lES
D� C���[ឋf��F��0�̎�^�X&N

'Z�	*�Y�P�5q>�������O�:m�k���R���OM���j2�Ն��������أ�1�Q]���N�ٹr��:�翈.��^�S�����|���̆|�E��i���PVIO%�H�
o�أ��
��
���3Y��U�:i�jU�5�j�u�V���5��
-r_YM�{��n�Jc�r+�k�Z
+�î�F�

�v[R�������̑�).~�[�}
�G'�e�f��������B��V�2�J3��������0��\uJ�9�t���-��J�ӡˮ2�z֑�8���;I�q��J���\b(�
�Z����~!}
nk
x89�aQ����
��PO'�s�.�� ^t�p�km�4ű�R����6��_<d>��8f
w)�H�5�{�Huz�@�
��~ $������+�֥
+�+9*� ���R��RT�à�N��
��(}B����%_�碛_~�㼕pi�
+?h��V�r�a~9]���pZ��k�vۙ��u���uG.wf���
+4v��"�|��'���ի��w� 
B��6��:.�)Z(�c,�&wL��~�|�W3~�\�ɹ�ڰ�G�<Ķx�����
3
3m ��s �`Q�?��l?C8��݇*��b��=|4V�Y(+f�ˍ��l�i��5��f^�;e*ۓD �|U�?{���\���.�
��Vy�j� �ϊ��pm#@��"CtT�\�S�*���
>c@!�P@(*WTyKG���
�%���<�2�L�
��;����L9,���M6k��)��v/a&:
�gҽ�wn��V�}�ȍ t��f�@S-5ä	h�n�#@w�@w��Ǜ���p��c���f�=+`��
�m�a霁�e�%R�|�ɦ.���^.֘���P�bʩ����D�Q�O|篞���4``�
�d�B�K�q�:`"��Lof��������mX���ꢀuKR��X��l�f81�
v3C
WF�
�
׻��Z8���Ez��!��NKf�Kkk�n����#\4v`��5
+v����_=Y�6����X[`/�
���
�E�����p'�x�X |Ԣ ?/�?,�?��?u^
�� �=
+��.2���|����Ey��
O��%gB�+t�)ǥW
+`�������ۛ�g���p�W����o��o9��0����)���ԛ�3��A�T:% �UÓ
��?™N���T��@D���m��~����(���о�z)P����p~�S!.4kϤdPϼ��ھ)ݗxS���u��m�f�z��u��k]�x5��ғt]��佻�p�z�[j�
U
+���:�)�N������_%4�W�O	�������L�������<�ߛ}�
+�=G"�ID�)���%m��?��w���QI�N/[������_��
�swp�n��~�����
��{�Om�bN���؊p~�95K���O��
z�?J�{&�6''�
��v_�+}��TNw�^�Nq9�
���yT���:��Q� ����|
�;�Ӯn�J��b�6�	�
a�6����U�]��W��-�[�Y|�Fm�ԓ���Ց����^�����b�w��b��̛ ���
��Y�}a&F��2��1�
+�v!�:��
��� �N֩9]���x������?,�˘Xܖ����"�4��G�R�k�om�Tf��xe���doW��<�����S�R�/�^K�O
�?`��k=�Qz
��2�GzNi�%��N
�^�m\X�x���v��"��\{o��@gf�b�Q��ԁ��do��	��vIPe�	yp^��F��:���c�r��$?��M�a�X��A�0|�"�q�Q<����V�K��_����ُ�t�j����j�	ٺεG�33?.<u�.:�&���6��;�>�?������F�[#�:t���\G�D<&�|�\
t�t��&��,�_�oz�z�Q�~�wV��ky�y��_�Vt~��e��R:�,���گv�bC��U
��
���J,
�&�)6K��܍ÉrEG��i���S
6�NmX0Bj��CnP�.�Ⱥ/��
�v�y�۽��D�6*f�Ex��]H����u��
��:�G����2���)���?���ã�Ց�s>�}�\~+�x^:
�ik�T'+���a�
	�Ź�7��B�ݠ����"G�~k:�#<�{��^�3
v�o�{���.��p�#L���ӊ��|�,�)�:��@{��d�t������yh���@�w�6����9,��g�V��Y����}����b%��PGmD6�l�1���H���
9Zu����y>�׎(
^�x}�y�g�k��U|��a�ťƴE��M�cy��
+\���]l,mZA��Z�B�t������̰�#g���x4A6���1oF��x
�l��cEΪ)�=�H��t\���C�+�V�x�^�?�=mK/�ͪr�2����w���1&�:�4�EI.�\��uXu-�����@�Zi��`֔���n�&��Y�q>2犲�F����X<ɥ�|��'��cCS��?
+�{��
+
+ё�
�o���a�k��������LZ�S�;ٚ�:��?ك���l�6GF�k�D�X��
�T�����L�X����Ͱ�7*��;�,�5����ЎT���ڱ���bG
v��
j����h����j�u�˜�ݾ�n^ͫ�T��mέ���\[�z�q~3j����RW��5_�ؽ�</��!O���rFe�#��
��K%��[#�v_�ʻ��䅇�Ti�q;�F߷�
��_��w3?�X��\�KA��\�Fv�!
+�xX�B[�����3f��-�T*g����i.FE�Dr�а5|h��4��@_�
4�\4�����p�W�\m�u���"]y�p�)bv/�_�v���,nJ�^KN�呬
��?H��d����$}o��$尮P���{}���V����7��Z�`M�LĒYm�Y,��ώ��ā��Yȫ���Pe�I�n<�
>-�WH]���?�w>@�ĸRr~SU�Yz��~	~�gq�d*�rE���
�D\�Ι�{X·|.�O�s�ܸ
t�jW��
+'	i��i�G��i�>������=.���
u5t�F�~�X�:Ax��c�Ii�
+�w�rC�e>�\(����
R����Y��Y���:

+�=d���j�f��	��d,T�����s� Ə}�����uܳg�N}�٪,��Y�m����@�
Vٮ[m�#�V�w_P�<V��tє
ڥ-�g(;�X\��\l�Z;a��R��P=h����u�v��sT�~2/V�o��e�̡�w,��w$u��/~K�����o�7�v�u=+⯞l�h![���G��+�ƀA
ʨ��I��Ža ��DI\�.���-�8�Z�:j�-�N�uf��3���|grAxZ���
���!�u�
�d�9��**��^��V�9�E�� ���M�6�]wt���53s
;�n�̨
oy�:�_
�^ߔ
��|��GŊ�!�Vrℚ�W��#j�	�w�
i�|�;
�tr\�@�M�\��>٧߅�!y#Y�*�̧��2c��d��a�R^f�O?`��'f��m����,�Z��t�h��b���ě��u�>��B�󔧰����+
='��S��U��_�ۍ���{��;y��X�>ʀ
�3Vv;���]�q��|����EN�5�զa��YKjqM^�w��Q�ϰ�p~
њ�
$C���/^e�E�ۺEG��!	g�n�j��6�<��t�Sa�@nu?��M`^,p�^�x���d��xuV����g��mFY�=&o3cz��kZ��/Բ��R�G�R�x-���Na���q#ѥőN��H��F�}6����q���@=��-|�R�8��P����j���*�1$�r�{DR>U�Y��ٓ����|��"�x�l�<�z6�$Z�=�.������#�����t:ځ������e‹�:~z_l<�1
$�&8�����nb��vL�1"E����=���mej�ƞ`�_�[��dN [...]
<�~��No�Ög--Dѩ<�R
�H�"��
���g˔Qs�Z��D�2��8<
�0�"~A��g�l:4N�+��
�=�-�ֻ�!�j�f��~Z��:���j��j.PttJ]��zk�Q(2��z`MT�G�,
��~�g��ů��ȑ
�5��xK)�V�7ϳ_�łwr��p�D
��
gJ�+�3�gmMAMԟH�[*a��c�J�%W���D��s���
=[/s

+����7U�V��F��.�/�ֈ�=��>�U�(#emtY8zT_6畛�����Q#JZ��J�ӻ�q{�f%���Q�
�
&��w&
Q]�o��xV,�.T�X�\ޜxى?|�*��!'7o�� �v��syS�:ޣx���bx��"�<�At�p�*���eC���Y���E�򏻖P.D�v9��^7��գŚ7Fy�y��@�䞏�x��5�;8��Qi_�L���Iַ�8��7(_����#S)r�I�O��Ãt�ƒkŅ�I3�>�j��j
+��
�U�0��NA��I��nu��
�߲
�š[�
a�h+k[����Ӛ���=EZ�-��

k��7��x
�Jѧ62�Ԉ�rmZ:o����R������
�baVEj��3�mK�%1��H��6,�y9��ف�p}��� 6�zQ`. ��� � 3jN�o
��²�VOg8��h��"��lO��C��
�
+щ�bm\��P�Q��Xk�
�{\��Rcw�
+��/G�
d��

2x�
K
�w��`jvm�?� 
+�=  9���L �Z ?cq����!�<ieg�k�IqhϨxab�V��n��T�q�B�1�>M���N��Z䤈�K�|q��>0�r��1x>rn~� ��}�,dHKY+d	�ePh@S�"��`ti^g���
� �
H�lR�do4zO at r
H
w3�ƀ��E��K�Aӑ�j�^�FQf��h��P�d-`�̠+��#��
+-���. j� NN�
�j
 �e�
6
+���sd ��	��	�&#P�B�[���e�B�#�R�p�

րz	 ��"
�w� �c�3��9m�S��~��r���t�Y�`xS�Ƈˤ�E�r  ]oayg���'�;����8�zY#3�r�{2�_[
0E`�:�їc�
�
`��7`b0�O0�A��ṡ*e�K������
+ �f�]��A�������3�a
�ι]�'�
�D�8�b	2BV��Fs������W���W��=$��@,ST k��
�n�v���SӁC�9��p�qpg�|)�
��%��;�%� |���0�.��u҆�	/"�l9���S��5�w<�`+�
?#ۆLs���OU���R�궿y�Ʃ�\���[��\�>܈�W�GPo�_��@��Tėi�B���K��
�l
&�����K	��%T���|���b���+��3)~��Y�V��
�������6ԓ��7H����vu_%��D+
 ��D�]BH��wӘ�#d�;����$
����cB9��
��?��duf��(��"�
����f��+΍�g��Ǭ|\����xC�az��g�bpI��0�9G�yz5C�W��uc�O+�X<dv�q�{��7�Kwg7��+�ƛ�I
6�&E�iK���cW�!뒄d�2P�?:�W�ȇ���?�mC�랩;��f;f����
����o�7�{���������t��z��Wx
֩5�����|�;f)�7i�p%k���u�����I�0[�obfAo���������>W�)9\�g~�V�	�����H_T�
@�
9��kf}�~�U���e�/{K�|�	�O��f6���z��~f��e�Q_��Ws���"lk�IPK�q ������{�~gp�Q�k����Z1���۟^��?��~����a
���+��V\(W�6מ5jf~K�t�(�St^jL��'';g%ZqǩW��!N��ѽÍFm��W����� 
&��3�Os�g�
���h�LV�Uy]2|����l�)9ح�_ko��^w!��B��ټ̖uq4ur�b���!9Y�m�����������8f�J,>
l�5T>7�)�8��|�r�'VdO�������=2�y8�	O
���=�uӨ�tC���2��$�`��}ܞ?��7����0�0�5��ۋ�~Wf�.O��U���
ݽ���!&�y2�I���\��]�?Pc^o}ts}e���Z	O~�
$�uӐc��C;�����K�v�`���O�ˇ_
�=/3N{N��m�&��d���z���lU���i�
]��慴�ζ,�
k���x�&�1;(�c%*;�V� [...]
+��6ЇZ��Ѻ׭�wH
�
��Z��l�7�*��i�lp���G����EY�������5��5��O��$�ul�-b~�9��
:�u�ώ�6U���l
�"ŕ �+��za�����;,��k9)E뤗�w�E����܅�B��y�l�3��b����=�tA(�C����s1!
[�8f�K���ѣ�}�7[��l��}�5���c}�z�RVn��hjw�6����ȥ��7I��;�B����Z1�Ŗ�
o��
+d��(�C��v6}]�j�A�"��� ����z�X�Z'OE�tԢ
67��:6қ�ӡՔ�s`%�G�jd�Ĝ-�3S���R��9w}��e���,
�v(WYͻ��z�N
�k
�Z�ލk�#4�ݞ��1�οX}��u҅��Z��!w�� �󸷽a�(�5�^
6�fwr�.2o��U�F�a�9W��ⰦM�s��F��VU
�C�jY�0���|�v��Q�3���9��By|
�"8�'��D�p�<z��]L�G%;�
���)ױ������t��Eh��k]�[�~���
mՋ5rs��_��&a}{QjzMq3�i��Kq����"�_��:��3lpQ)V��TV�V
WZY�
�����4�G��
���:����hr(�am�&��b���-���q���V�e�˻�֪گ|3��]Gsa�Ά��]��{�Ԉ�
�]l_j��/��syFj���0��c��d��yr��
�io1�`���A4���j����
+��3��b�_���Sݽl����F�u�/6So��N�������j;��9�!�6�3�3͡|�w��Q�;�Nex>�F��ȇ2�Z�[�ʲ⇸4M#FҒ�$.
'M4�_[DL�-lH%��L���b[��ܭ�
m�?�G�$Y�)p�s�T�q�̩q�
������$
��A6�$
�
���
��
�~��&��F��}�~�J��Nr¾n�L��%8�gE�P���
�������y�
�u�8�i�v��@b�"��^�.L�<�6|�}���2�]�
�7l}D�l�sj��.���M�Iԯ�g���'�k�Dg�%�o����j��-mܧ�N���J�?���\g��F���ߺ��u�ޢ|0���~pܵ�+\x�-��m�!�� �����>1oo��JfD05F�,d$t at O�%=Q%z��2=��."��������)��Ê�<ZK���=�=����"���4/xK�Z�+�Q�?#�fS������U�\k#�#���5�Y<$�=-��Hc[��=��	=�{Z��
��j��E��n
e�{s�D�!�t�2��󓽶��_�sv�	럸ۮ^��=2
�l�FI�4���j'i��k�|a��_g|Ǻn�^k{`�Ǎ$�a>���%�L��$�ɱ�y��:<�4$�Z <���7�J�͚\c؝l����P���C��)„p
 vj�N�8���d���&a������}�hN6
Ҩ�D�R9���'1s+%}Uo�����ф}r��1;;FN')=eW/Z}�����!��8U��,�;2i�s��<
mb�`��kKC�?n%���֞�I^kb��s�]��v��Y�$%
'����eG�{i��U��;۲e̋�v?��O��"����V\~�XƌBr3.�l^̶p$��F��ޗD�L��
J`�
��B������x��R����Bu�1��T��\-"��_���\���ߺ��}���^�
+��Z����է��̯�V�#�ɬ�ΘzK.����^b��:�
^\���dNO��1e�oc]ݖ�Gv�)ʝ�@�^X�sXشK�9I����f�DQNΜ"ڪ���N5^
�Uɦ�U��49T1��NT�@2=�@��h���h�9Rц�2�dt�BR�7ۭ�tx��nTk
�cHZ���l��J�ǯ�Fyv�ըLo4�q�?��
���
��}��[_�#���J/�P1SA'�M�jy,���E�d��W1�ְR|
��ը�,7�-��+yIF��	CZBw�l���
�\^6�_����
�R�BY<��FUQ�v溂�O��3
r�-];K�:���uꏪ�l4���|2�ue�(�J)t��5;����
\�
^Udg�
�"���6�f��|’_�g%�M��@(�Թ^�o��"t��X�H��B��,����n'��4��R7^[�*�w� x-��E�م�s�
�j4Wxg��ׄ�9F��wX�����͢t�O�9z����܋a�2�"3[f
,|o��pD�:�_�>��>�P�GH|<���9�
+ߠ�
endstream
endobj
314 0 obj
<</Length 65536>>stream
+j9-$�e��Ul�7
�7�M_Ş�<i�v͗Y%yV�RY�!�j*/��l��������Mmؿ,���e�t���ڛBo7XA#,�e8��tο!��
�	����-�
�~���u���o?ʭ��:�̫�\y�ɮ8U����~�6��m�gPΨ:��	���z���f�&�P��
+߄��ϵ�-��Y|Y�3WjQ�0�)�x'	$O�l�
P�sk���*
jvf#.�@m3�@�Z�28�
�j7����{+�ȃ @�5 at ma
Am�\Am�Q��q�

�iش�y���Kk�֕w����|�W�"=,~a��}�"�T�n��R��n�/!�yZ�X�����Q�e�� {. {�
�a����sx��J���68����@�p��ި S��vO��w<�
\3C'0]<�k�%�e�[�������-SU��\y�j��_ލڷ�?ϰT��BI;���k
�k�8� QA�� h+9)�����
c
I%�Л bR>g�À��u@�� �"ڭ1�f�s
 �b�����
�~o��w$p�ܑ�+P���<���H]޷K�ĺ�7,�Y0ڗ{�u�S@�
u�H�����/��$|a@�2 ��Ð��)��ڀ�}@��%���(ݩ �@�
��
st�$%1�&�,��z�����ά%�8����"y��hx��^��J�?�¹y���_=9�����ſH���S�T����m5��
&�W�?,�G�)!{��/`H��p3 #�ǀ��`����պ>+e�.z�e����_hRx��0��J����J�c���/��\��d�R�S���/�
�������
�����m��i��2��v
�/N�y�5
��x�0�S
���\�[
p�g�n$�p����۴��~�UE�;	�p�
�P���ۇ��K��n��oK����K��S��o%�a
�>���yu����ԴD�@}��@��>!����6U T�} ��*���
�B��*�����b����6�3)��Y��y�n�#����[���>yu�]&=�>��߾tI}����nL[g~�N1��~��͎	�
�������e���
�Sm�2�����������
��s��T���жXx7��������bt��c�taf��_���|�
��k�
��1�?�C�R��%� v�gNm�ʶ��fe��ujW;kf�LW��W�eI,_!�,c6/�@�����)���cV�Vn����'�`.�Ԓ�w�c�b��
�m��_2���~=�[
Ǜ���n��n����Zݝ�~Uw�嫽��
�{a�����A��R�2���(�St}xL��P�xU��_�/
􎸏�tIE�vW��A;i���
[,)�7�J��v�]�< .����P�c>�
�

^ݙ�=�3$y�S��L��c<��"99�mB
��8$��u�ۂFs �׀Rc����{�_������O����f�:�s��{$��֩&��V)Y(��b��?����ݦ���b���@ɩ�Gr���S%��	aF�#���q̡Y�O�&"���
f
?
���"�J�C�@��Su+��_�{
�
��+�	O����=��w
oh�<���i��F5gWQm��=m�W�F ew
V��("�q��J��7���[:fr�>�s�;Zj�\d�m���Z��wʝjo��=�6�“��C2=�ݴW��̳>�D��
^�&
$����%����w�W�ѿ�#�kz��vvg�*�\�a�o��
�6�ǯ`J��
f�Y�����v]��==�“w�����ꦝ���n��=�];���^��7�r(�'Y��M�gV_j�۵�yK�����1s
�pu�ۄt�;�������KOm��K��%����NJ��k���)
&��节Ó[E�i�S�{�:����@A�Z�w���~�ۺ���g6����2�
]ǻg�K��-o,�Z�
�N�?I�U�
;�t͇S:4\��
��FS�
+��>>Z?����n�e�e�Ʒ��Bo����)
�#������.��>��  "�+��!��7�{��Ju[��rk���jk�N������GM��������cs���M�Z���]�rś�Wl�����\wg�n�(
*���_lR
�N=b���C�|뼚z��~�̻h/��m�Wou���r
Z��q:�5f��
ks���|�*zS8V��ǧ=KN鎕
���
+�؄潥a�&}ݽ>t��am7h�k\�,?����a�P�ɷ��ZWh����+P��茺Q�c�w���E�s��­���I���a�����kST�_K�_�9� ��Ժ<m,�b�0#S�7E���U��������EO=��K�F*ӧFX|�{��*Q]�z�ܒ_kk"ǡ��%�2�������"��jm��h��y?,��A�uz�(m��]�����kS/2ê0W}�7�:�
+��'��zʌ���|#=�F�ߵK��M��SR�ؗ�;�%��& zH��]�
+�+�1���;���-�3Z,n0�/D��{�ɠ��ͮN�v%���-�r�;��q?�_�&�����l�
�x����R�����_�aX UT~;8!��'��.I�Ӥ�'�Ź�	D���CY	M�{*H�Pߦ>Uo��l��5��kZ���:�aӨ��T�E��ң��(��԰��%[x=^�B̝��ί��$���E=n�
v�
��Z~_أ,+�C�̜��K�>���jT�ΙV�3+4# 	�zU�[o��
�OS�}�����.m
���_:�P�pL��e�
Q��-PF��m���ͳ�#(J9��
+����Ӱ��Q����q3c婼�xN�ie;� �����,�i�*�
+��4�Xwa取A�~����u�p��#��\Wc;
��c��,/�o�[��
�df�v�=�3�?B��.eh(����a��Ho�ڋ�_�6ͅq�Nx��2�~�
����s�A_�n�Xz�&
+�E�mu���8Hy�
=�`k
�nx+���e����,0/��3�t�2�:���pM'��V^^���_�Ώ��,�)ꆚ5���dg'e��?ue;_KUݓ�$�I]-"�մ�핗�,�<~��\�/��Z�������Є�~K+�I�#��ļ
���%;Lj�1B�;�N�Y繠��v�+���D�9#�bs�,��(��^����SU�%���
=�E5�E4W�w�P�k���[�\�>㋸�H�k]
*NE$yt!5�H1K��7���]�
=��F��8��ӹ�
⡆��P���
+�͎�pf-�^Ϥl��mC��yW���#��c��k�s|
dW~_e>R
;��W[���sY\
����실Sk
+�>{���_U��
�R�g�.{���ST�5���
Ʒ�ם
v�[�oȓ���
������d�\WoD�Vz���V]y)�H�ד�aa,ͨ�B�D\rӓ<�O�
b���*�P�*��lG��\}�fhu��F�qE�f�
q͐�8�Y�e_����uN�Y�k�y�j6�p4�K�g��~
r�r{�N���
+NL�7.TG��GMe�^�r'�R^��CD
+Sb�
Xk�%K���]Fw��N /hO�;a"�5���Q���P�m_�}V�,7��P�L?
+���}�\sCƜ��N"�Y��˱k���E$>�]�ϟ�ׄ�g;ό�&s�O5
yw��Si�(O��X��-{���u����0�Neb��{:a�i��v�“�>�y����`��X'K�����G�w�v����.�5��Xj39��
��5�xڟ�/�9
T��"g��6��j��@X�dk�Z?a���6�]9��Z����w��>�e�t��
�:��o��i0e��zE�۞
݉��l@��j��31Oy��Aa�U �E
�I��WbmS$��M�S7"踔VD�N3Ě���k
�^,�K�7{���i�p����x4ٖ�Ү�d�@�SO*�H��ou�,6*̳Ǘ�qڐ���P��(
��b�H�q2(�'��b}#"��4���I^7S]�5�HwFxcG
Sl3�T�t�B��؅�ϸ�]�x��)_Tkg�P̝�wjPg䠿�֫2q4D�7B�2�e���t�i����d
5���7Y&���F��M+�k/;��ve�\�Dž����?�2�}c����
FHѰ1M?�?(zY}�7��P�) ��f4�uV��c��iu��&��hχ�r����R��r�t��z��ˬ�G]�e̶g���|��t��'iѓ��VT�
z!.��u�c5ۘ�����x9E��k�Z,yH<��~�"���E
����(��v�`��,�����
+r���Ճ2�f����B�'SB��8����ɏ0�hL�F#s;��"��q�<�����/�
1�6�i�M�}�k�����g��@�a�ǵ\���Z�ʳt/���@�ms�
x��b)��?�IQ�q����YR�76��8�,yzn�)R@����m��q��Y
9kwxqJ?_�
+�#|sWj;e
�
)BX���qܛ�`ޫ#bA�|�
�4��M
�(�R
7��_g�"�'Ő,�()B/�'���u��ŵ7`3��b�����H��
�-g����v���'��h����5��?�w+_�0���֚�s��2����Փ�c*!�`O�>`߳i��
p��h
gu�).(��K16W�K)�=���$�\84 ����>K����7���{��߁�.Umg�nJ˗���%�� �������ZJ�
!�{���P�)<����!���,?K��E{��g����_=�#A��6H�oo2�o���, �I��x�6�����"��?�ҷ8��m뼟b�șq��WVVүW�R�]����|�W�L�1j��τ��� �$(|R�0���l����9B�8a��z�[�?�`Q�I �� ���b�
+�8v��`�)�_�w�@\q�K�����
�m�b�)ƽ?n�c����q�
�\���t!� !A�'6�
������~��x��������-��` �^HQ���*�B@&�
��{�?a�=�[]�c]�JO�d��
96�mݤ��M�q�S=��\-��)g��+C
gM{W!
��9
+qk�ךL@���ۯ
��+ �)�e�o�Cei��7t�<P�Tz�j�,�]o@��(�n5'ū
�[r �}�n{X�ǩԧ96����b��/J�S���9���
+n��<��E�7?y����w(0�ݿ_���
�d��x��
+��N��~�N��w�4z�V_n����YY���A_)N��xXƌ�W]�ǰ���~���m��̊~�~��t��ӊ��.R�ۂ}��k�����s�ܟ�o��̜�э:�]�?)�G:��~�W�}x�D�`%zi?��.���%�ZqB
��m��M�C��������K�?��uF
��W���3ow,��nD-
+�tk�:����`|�b��0 �U�)�o�p�?�3sN*yۮM�����gS�����C�o
�eW�*�.�Z�g#[X
�Y4�t���y��

��,���C�:æ���Ug����c:�+�xs��a��?��S��;��r����o�	��٧�RV����z�,�m0�4��s=��p糞y��.^d�KLL��4�
l�;��ks|�(ձx���*\�F�<�Gʵ����������Y��k�o"
+�냃oV���]
+.
�̝
D̼���
�0];'eJ�'㫎>�ny͍�wa,n���r�Dî���57
�r��
���
NH/�d���x��(�E���˺���?#�A�A�B��2�V�cA��
�\�� iO��a4>>˱�!�#e�]���y<#
�;���&���7I��ϥ�/���лn؝u����
������0�M1��k�ي
�o)�k�y��_��t�|�
�IUf���U�����E
72yu����` C��XG
?h/�3՞�v7@�Ag]Ц
zm.�UF۴�]v5�����un��-�V���n'��_#��
�Ԇ
CN}�
���7;����װD�U5^�A��0.VnU�ӭ����A��Ӌ�a��
5�
+�w���!�	�lW�P�\��΍�i)�A�����Ƴ7�g
�?�u����øϒ��o��O���"�OUbG<*뚍T�SH���X-sw��^��vV:�Gp)�ijIE�^�ݲ���=*���c�)?h?Gz�Nxm^�
Z�:sjv����W}�}�u8��5g��(hUb+ەu%�_�C6('�|��]r���.GaCk�K�~{\���x�?h�@�G����&zb�n�e��4}�I�	"�j����Z�_��>-���Ék�n
��{T/�I2�֑c~]�;�Mz�J�Ώi�_�o���ABI��R4����וb�dE�Up��R�v�R
�?���4* ��0��2�<�͝�">�|�Dq^Y)�
s�Ts�Y�����_�Rm@�E�@7��Ork�ャN���M��|�
+��P��eY���	q���,JmG�{U�
��#�� .L�Q@�.��-b)�o��{�_^�_l?=�҉�W
еܞL?�j���=���m
2O�j�H�C>
Gۖ+�GU]e�&����)���ʩ^�cq�hu���-�FZ]|��R��ϋV�3

=l�CuP���i~ΆK%�;�w���]<v�Cs�����	�sO)�-U2�kOu�����UT��KI�~߱yZ]�z��
gĚ�u��}�´��¼
da>/�P�/�*O�;;���k�W�'�^2��6@1�/Q�_琖O�Mo���r��f��Ѹ,���sn08;�Dze��g��\&k
��=����L'�cK��haM�iPcl���XW��s��pz2rrz���z�L�RL�4���ds���d]�.��\[$���5�eF�<�8L��f�r�լ���*�l��W��
xى�Y�i�PLlx�>[q{��2�kz����2�z�JFX6
��ھ^��*:�}�HV�Z��y�/�Ջ�9j�wԶ�{�m�Ȥ�j�h
+�<�Z�Z���zD�i�{.d����j��ؽ��
�g���!y
�@�Vm7�����g.���$�ׅ�������S��^� ���q�^'�����%�dն�+���(�:�H{1Sl\�7 ��%�^K
&����Q�<�i��FrB�b�|cr"���
����~
��2'���ӻm:�l�M��}�h��B�$wN�(
Nڋ�Q��
p}�
��J��Q�^�۳�n����CJ�+�����Myx|���(ה!gKS�8K���о��s���l�$��=!��
��~�tj�e��������@a^gO^=K,�ǘf��vۚ�������Fy�zmET���SW��'R�&6P
27U̎���^a/���E�.F�T�7L��#y��J�v��*Z
Fs"f��(�VMT(��*�̢*��� �*-<ŞV�tʔ�M�V��\�2�O�T:
r��m�� �0�+1(�%qZ1�]�N͵�^;���
ʊuy��;24��'&���o+q���b!g�E�B"�
(au�$�4(8m��|��V����~P��j0w062W!W�T�`��
�>�E�вUN�2E��z [...]
��w�scfc���H�wS;睲�Oyy,�k�#.
+d �K��@'�*���6Ͻ�w�1�(EN��#{N�i��F=IQeY50�;����f�6��_��E�Gۃ]����%=xǀ~�4�EÛ���V'��o?sQ��˺j0��k��Ƨ���VJ9������W$��-0���yp���I�K����.�v�1s��%�Ã
c,�W�ռ@�P!I:
�
+
�ģ&y�A�2�����N
9?r�n{�3�SHRx�HH*��:�jߴ?Y�w�H/���m$�|O� ��2H�P�s�'l������5��˶��ӫ�?(c�:=
�":k/4.15ْ*W1N�U_��ː�!)��l�%VСJcgBP�Dž�j
2�e'Sސ�̖|�	*�Dq�%�ժ��M;�pw��������
+��D���"k�����d�l3�+e�#L�D(her�3d-v�̼=&V�͒(��=A]��e��"���l��H�/!^/�C\�Z��X����j�v�����^�m�|�n�7�$�
O�,�>o��ޗ��S^�VS�
��_=���\��1�f>K;
d���>K��k>�� S9]+.B[�A�x����⬽�����䓢Ha�z�����]m�CӚ7IqK�W�٬kȳ�o���?�� h�D�5��<����.�r7�����4�S ������
g)`u~�ѣkޥ�d!�7�F��bQ\J;
L�vJ)�u��?:h�D�Q�e.S��K9����� v�,���҅ݱڄ7YB3�{A��#@�`^���n�o�#�-�
�{r�O{�oЉ���.fS�]G����Z�.��M�J�9��мG�㷃�NZ��y��-�DU*�d�o��ʪ��)�o�(#k�; (}K�0��
+��F
(���8s��F���
+P4�n���7���
�
�u6�N��tr���{ �E=���E����S�teR����ôV�A��ȇ��z�<��I��B��(u -�&���u��%��"s)fY@�F=�shm�4��zGi�*:�o�
���E�I;�i�c�w��p�U>�޿�o���Ԭ�T��b�-V
0]D
�G��a��/�Pw��~z�:
���)�`�t7�a.R4w)�w����R���R,Z��
k�d98�ULZ� �	��am0h$��
K�
��1����Ț����_n�lo��i�6n�Xj�˲�>��
+2
�e��C�\[`�}-ŻXZ�Vɍ �g�-
����
`�M����d=;q��"`��>`ct�b����ot ����m�<`���go�&y֣3q����Z^q�v�^Y
I)���P�C��w%�� �f6 {��d[�3k��!�j����
+ps;�>:�qx�Sq��c���� o���+�6��c�LL~�^j{<�R�ȅ�̂S D
��D-�#wj	
7�K��{s��=Oёܝ��:\o���'��t/m{��?�+�x���%�' ��!
 4���]1��y@$�
 �`�b�"�@��z�w�
��@x�T <���K�Mϖ
+�ß/v:'3gr&�[t�w��u��&�d�o=y��RN@��_Gp�sbw� b�}��@b
�?�'H�l�`W�u�B�8��d8� ��@F�n��H�
	d�u��JjF��x|#����t��//�v�n�$�`ʩ���;������
+�c�k��L�ȿ��h�_��@я
P�|�
�*��R�^@e;P93 �ANR<�m�����Pp
+)��6tPM*?8�{��("�n	-�(\������
�7U�__��~��
w~��O����ee���ߥ�*�
л�xg}׍��(쀁�0p�?��!����&���w�'��:�l�?���s �;�1��ܽ�|y#�핎�?Kf�ߥ�)���I���������Y7���b�a'
��o�VT�$� �̓�=g�1kq�i��
����ZW�	���u�&
c�g�X�%\��]�$�˽p]&<E�^;<
����?�
����Bɍ�kC�n�lf���r����Z\P�UDR���>��^��"柨$̝{ߜ��8���a
��+&�K�ű�������_c譐�۹��ݎz|�������c,)\bf�X
q-�
ey+1��YE�uDr��'���
���_��~��ʁޔ�#�I� �C�'cqg_G�Z
)�#;쪆3��x��﯃�����������
mK�{�k]�A��=���lG�v�݅KL���$�	�x�cq�ࣈM���?sîx�������
X������B��p�^�ꭞ��G�E~����������:��m����߮Jn��E�~�=��1�M��R�u7�i����߸�siW
ު����ܵ����b������_x��%�kg
 �NHR���3H��
+Dt�
L�sr�
��V��
+�[�Ro�f����a�T��?n}
���K��0V��k��y{��
;™���0�����9��O��	�	�Di'śݮ�t!:T�J$
�F+��N���ͮ��ρ7���&��>�y����[-.��5�X��Ex�Ğ6*�z�P�ϫ����e��
�2���e�e���7��'O��@
z؈����{n��V=��nQZ �w
nXo9S;Y���e��5��-�nuQ��ĶW��+�j%��rҘ��Ui7(s��4l�`�O�X�l�Y�M�x���KE�s?h0ƍ���M�(D����j�:o�p�|vrD�����j
׍����.��j�|���*����TNj��]
+F��
K��ҹlj%�M+��H4�]�r�g�{������W��q�\j5�Ǖ�2����_4��W�'n9�[�@�
���
��H����jb�
�n(���
+�ƛ`�
E�+e�4,Wo�vxv��s'藔g8)v�h<'�}`��Ka\?
+.��8ܠy�9yl�b�E
�@d4o
��ꅪ��%������]����n#�\\I=�N4�d'Z@��6��Q�C�+�NA2!���Js�f_���U��	Oa��?�q'xs|=�Fz^��==
�v+�&	�b��+oÿ
�|]r;�j���8�q�x�r�cSt.͉�h����c��5y#�_�AlG�Ɇ� �&�-���\�S�r���Bm���I~1��wF[Tx
S�KYl@��L[�$���܇�Q�r���$l-�;fZ9Af�n�#O�+�]9�Ey��:Zоd��5�S`��-fo��Xɚٰr��o��Y��
������(��Ǡ�>�o�t�Wt�b��+��߽�>fhJ��
��d���\|���v�����i��
����w���
8��
�}�Ұ�Q�kg
��skj���0:
�y���þ���B�����GL�8sS����k�H��B=}��Z_(U)7\U�f���>R��/���*5��˒�>�ț��&��R��t�Rv�+x�'�I�1�)��6
�����f:�MB�:F�K

�c}�r�zeY?h�~����K;7Lm=?��,-U����_u��cy��ϲ-�2��̤{�>q,�I��˶�!�F$ւ��z���/},�
�d���f-
�Ӣ�1����2>0�u��3�����/i�F���K�V��x���Q�<SU�Vҹw��r��� -�&1)۹�$�bVr���d��8��G�OLīC�k����['�?��y|��E�b�Ew?�_S�ݺt�Y9S�f�J`�k���ԫS�hG�����{���
	��7�htd;22p�3i�
6�;[%�?ř������TX�kC(�JI ��h;�l� �\lj<K�
�
:�	�o��941�|\� W{��d����v�����H/,�vu��꥾L�>�
�TŸOlyh]�&)OBq���b
ߵE����e��
E'=Rܽ����P<k64n��\m]�rB�ذ'-��OJb�/&�aؓ��S�?�P�FN^��&��Li�͵�h�
񽶕�*F��~�[
�ݿk���$9��D)W�tq�Ȗ�� [...]
�:_!6�/�=��e��AUٖmF)�#V!wK�{��1
���1������/]���I��(�5�=
��>�)�_
�ѳ��>��A}x����G���/k��#idͧZ��B�)��W�
ޖ��P
%
+%o�^c|����z{���G�`���anľ�t֏2���f
+�O�嘶�˄�^Wj,eʹ
9
+� 6{Q��q"&�e�J,J
+M,B* �
��AI�\�I
^�}�'/W����ʎ���\clK��
+eU�t=yt�mq�.�|�`�9���X�VO��9�tz�l�3+�qmT�\a���|zt�8ʌH�ͭH
i����!��FdZ�f�&̄��8N
�
�}H|���
cnf���_2�}�YV�
V ,��޴�����?���E%T\חb�e
k'�r��^d�r�c
��i;�D���*9����6����TZ"��#������e����w�����
^c~�J�����
��!ִ�c�5��P=�5�v�
#��
C�Qz*m�O\��
��i���+|��
~eoq�;�|��{!��}�xD��9��8��M��f{�2����w�O�
�".d�Z�V;A�)�L�-&W��[
m�2R�a>=$R/�y�<�EzO�B
�6D��%�`Q�&��!�E��<e]�:7�JZ��#|�����

Mg��LgEO�P�HG��i|�u�4�*X�
��z�<
h��i��
�茑�a�F�������[
u5v�]
���%�9�7�]���4�hK�O��|
l<o�
���w�Ӑ'ء�K���]i�e�EJ����B��%%����m��Z�*�vɮ�
�PG�}Ղ?����u	vη:kp�Q+��ygb� Ćˤ��i�Ols@��,E��4�����d)�o,�c?���)�.]��U2r����\�s�x�0�2)O�j�jg����H���6b�:�X����F�)l?E����d]���$�l at O@Z ���I
�i�Ȉ� 2Ld@�WM at z�m����]v�˞�?;cwCf���J��j�+�P�5S`
�^��u!K�ݑ��3��E	���b!!`3P�|!���F
+��y)E@���gީ��K1��
R?)
,��MP5���T�� *���)
+m at 9�9E���X��a����L���_�w�N�9م�>IJ���{Sk;���>g�S�A�}��S5@:���oy@�D	ЁUt����:�PX�h^R�@��"���K1�]���x{@w�L�����Z�t�$���z�\&��
+
+Ld�_�7�|�5z|BB������Q>��V9䝴\�Zѳ���ף�p���
+ ��+�����<:���`��0��
�����-��S�K�y*C���0�-�S� ��=�ƆS�%���i'����Z��B"n�/U�.�e�-r���zeL�k%d�BEhq
��3-�
����W!`��
+`[h
�#�
�Uy���e�K�Y�D��w���E(�x������ࢦ��[\�X�x��؟ZVh����6>��|��
3��RD&�f�#aF�W�ArD�	6o����J�[�G������-���_�c
��|�s���n�Ir��x �
+` d
Z��b[B��!��P
b�J�d�Puҭ��sKAl��4/���0:��x��O]R�ve�i‡1f#=HCP��zGSV����
+���%q�����P]}�8#p �=H��7�W�R�@��o&U�7 U�,�j�"�
+�
H6x���@�y�<7 ����P�6;�h�%����`V�[!�����o���@�H�_����n�1��W���~[���f�_�-�����@��!Pf�.��|�ePl eh$@i����P�VE���;fJ�o�3�"3W$o�/���'�ՓC���?��u�F8����c��J��Eh���~�ڳ� :�r@�������*f���AIzSS������~�n�s ������8(t�9@��/���=)����/��wݬ_�hyp�;��k�=h�E=,I/nrK�j܆��������[i/��`�(�'\����/��կ
�?��A�@�wo5��k>O\*�,w�?���l7W˒�����d!��-=(�7�Ī��9�XE
-o!�]vn�xָ��:q��X�s���f��y��fhLLcvbs�+�I�.
&�.���Y
"�1������v����؅G�=\��	��M�ݸ�p�^)�2�Vr�|,	�,�(~��3�M`E�)=���*��M�Z7h�׿��Fʑj��<<;���z�O����](+��X���<�MQH��n����?��Ǜ��	��4V�|
�?5�<�:�JL
n�4���$������Q�<�îp>���}`����؁��:���
gwxχ�tw�]�n�#Jg]��NH~;���vZ�v��t�G�չ��]�mE&Tk)�f�O��_��Q�����EKs�꿞^�̏��C<s���O����=l��u��#�ЫS�����6�<��_�x|oZ��k)7�Լu3����ލ�PG6���ϴ�����ޭ��L��S�auQy
��)Wa����߸��97/ą�]J���ν�쬽ϣ]%�w$�{���z�6l���ҽ4�c7����|Pw&��y�Z�3|����N5��~�H�q%��y�>��rU��e�|†������R���%;�[�>o��X��k�Z��������
; [...]
+��J���rR
GaC��*�ᠤ<q�6�7E,�sr�6z~>
 ���
B��2��}������@4,�8������(��iZ[ro�
�	p9�w%�w%�t%��v��
���ȴ�n��|�&��Em5	��C��N�J�(�
�����8oV
+��l�}:�������6��p�ro����9�t6�\U?�����
��q%(�8�,9*�5��E;�5�M�~n��=�t�����9d�s귬q�m��y��c��g���L$��{-�,���a�`�I���^,����������ϊ��.��jb�
�J�?z�9�����Q�6���n����Qb?O��jZ��m�4d�gb�rk�B��i�c(0q��1��}e{�a���o�uQ��
}Sb�)r��
+3��h��uk5
��n�+�z����A�S�e]�
�yZΥ�t�w��d�$.�C~Q���iM�s�����Bb:6g��2�|ao����(ʭ�AA	�ob��Y^״ݱ��j�L�'�8W����ʵ6������
g�b{N������K�]a�_�R�;(Z�ܤ����>�=*��
uI��
^�&Gɴ��
�����-��i�Fq��
ʮ��-���$�j{6Yi��m�	
⪞$��ʓ*�\�Y��+?���Ϣ����;�Hi����(��Q�;I�y%�Dn�E�T��]�q���Z��C���Z9+vb�\�lҎ7JZ�5J�PַVS��������ӄݦ��j��*�.M�!=��JEG��*���N���Mz���<#�H��{8�z}(�?ー #L(L��P�����?�6�85����¶�{�Q��^6�/r�G�5I�Og~=�\$���Y�~�HMt)Vm�2�r}���;S~‚+��l }�lY
kM�i{,o&b
#k�Ƀ���Px�>�7b>��O�t��^�U-�6jr�,���8I�
뾸x����&O��ۆ�
{�v3H�Y}G�֘OD5�dF�u�E?�3�@�sҧ�$�Б�~?���胭+b�kAXxhE8�ůf���g�2���s�J�x}#�G����2i�R�Y3���>՘�1�2�ݰR%:�H&|�3�=[�}f��dkV(�2?�j�
+���,(F���r���S
�N�8�0BPy~�WңSwL�K.�|FE�:^U9�
u�#+��%�x�׬ԟ��K@���ɱ�}q��7h�y�S�e�I�V�L����N��������G�;�ܱ���æP3�k��׊U[m׏�b29!���pKIH��D���0>�?)ng����	�V�?&s��
����[
����^��iS�
��}�s�����EA$Y#'�x������ s]L s=�IN����ܤ^�B^),���ٓ-T5��ך[�V
�F��y�g�),"Ɨ�5����
O1�\nŴ�]6��ﯮH��
�6�7�z�X�ެ��V:�ocr�A2w*>I��%����D9V��ܟdV��%�
+�\fU�׉̨��.	5lr�S���A��r�Zs�Z����W;�d�o��H�U�VX���
���Xy�}-vQ�<��n��ѹ�<uB��zc���'�C��7��(ȥ�J�v�Y��-S�+X� ߞ�%����3�i!�sz��W���&���F�gl�}Wg
sU�W����0�
�j�X��
�
<2�+��e:���U�M��8D��!1�G�ɰDa`�a�Ff
n��Y�2t���N
�g}�s��;dkP+k��"&&�!&����D�BρS��%:I��ST8�N�E��1��VYS�ؓ��)���ռy��(V1��'.D�^ć�.��4��
�D�ū�K�yW��\�ST
X���a���a��-Ш�9�є�Q���
��)6}�;2v���1�p�y�;��ە]
+�����Sk�ͦ�b�)��a�h��QV��9lje�b:��Ɔ
��� �D�/<�� �qL�
�;mg�2�&H
Uת��ð�b�Fz
����(��5}�Y@�0����ē�Pۭ d�!�
X��ң��7�۱"{b�99�Φ
*�"�I�nc
+kES�H��C�i�
��]]�� -���
�Cm��8�ȴI�,5�MEx�lt8[�;0$�49�uu}0�K���
d
+���]�7���ۉg
I�h��Zc��p�
U	j�]+�.i��Emc�I�U����/��)7�	�HX�� �
?3� C�Cv�"	yF�ףX�
+, ���'���b�f�)�=@��% ��-Ň �I�	�5 ��u�2�	2�J/�u�
e���q�K궩
���o
+�����ibqG�R�
Zh�92��T�����q�n�1�6�YM(�0r �&�eY �q��x9�8IA�F:��y����Փϫ .V�;��
��0Dbo���Wg�, ��1 �]v�I�&S5�7m*�{�^���'��(H����D�w���c;=]�WO
�
r	��H#O��q��n$@v_ {�ș�r7.����w�)�;@
�O�9
�c��	�r�> r
�o5q�.	��������w�J?jC�̌Zr��+�o��s�w'c��qK�TV���;k�"
�'.��
(xHJ��rP�k*�f������V�El ��)N
@C�9�
+4�^4|) ��p��:\�G�k��P�60�#{�]��H�F�_��,?(ce��ޙd�2��"j��<+�d3��J�@�%�i-	h���[���r�)��N��V0ܩ���o&)^O���қ���e�J
�,���R Cת�a�;��a�ic�i��D�d�皢Z׵��b�s�(�	s�bN�P����������gt]�]�Bšw
�D�������:�ڱ�q�>v�ƫ����,�}��9���'c9��R6`�9�㲏Q�7X�{��&��N<�]�{���#�=xJc��O�]��P�*|� �
fwv�[�ׯsx�K�k`���(;��Mm���b�)���U��J,!Q�Q�֓��Ĥ�=W�-����m���q�6\��N<������л=~��К"��,\ "�)��o�Ò��-a�Y a
+�b�*Z��ri�]
+�3aȱO��B
z�f|��L�	�
t=�'h�O=��	���x��7�Ml��$��� 
UHυdT,�2�~�%f ��ZҶ�ҭpҞ��4_*r���wA�N�#�r�h�k���lm
1�2�;������B�@���D��X�s
��`�$��w�ڕJK���N3�f,�9P��;P3$
T�*5� r_@	X!/���y��i�D��uO(3{��&����v�w���줐����/;N�m2��/���ûX_�m������@/�@_C�XF0��#Чx�B��l�}^3�����/�M��d�����~�}��[鉹A�Q�z�;?
��lir	ls~I�͕��
�s��N��ǵz����?f'�fI�)�U�Sr3���z,=ҫ�����k�K�\"����+�[�f��A�ߴ�V�u6��-�v�z }�Z
����O�k�.�����V���k�&u�
+�`�WQۨ�r���Rr{i���[���#��r᢭c�!w�3��C3�s��eM�^m9	��h�
+Sp2
k��^����?�
�
?�
z������ތ�7�1���f��O���y�XzZ��?z�pa
�

�����h򛿊	�.�(��E��
K��:i����+U
�2vsϚá��V�u��]�ǭX�������s���O�J�����޿�U�Zl�訰�;��bg���SOk&m��t�ez����d�	��(>
��̢���]�t��%�3��Wg_P�?�x�%�l��U���̛�A�Wn�>�~kl������ڌ֘ݜ����&��X������f&���<�C�\�ހ'���]�W�C���o�έ�
�
4���N�ho6�Z�(�6gV�hZ(�i�+��pH�Z_���^b[Xm�X
5���c�R������G/��ǧ��O��$a
x��V�C/m?�̺u�t����ϭ̻}iβ��	/&Q,/��`��.CR�<@ZmW#�5�G��c����
-�~���-]iTn#�S�f�fU�<���R�|>K&)b�h7T��*[*Z�mQ���ejIJH'���L“%(������h|�4��ԫ�L8����m�-%�Vn�T�����3�� kBer��ضȒ���b����Y���}+U�\��Egݼ՜����]/�ٮ���c
��ͦ� .^]��!�
��dI���5�%�ŕY�ʭw*��Ɨ���⬐��m�]�*�a�a��XNg]?
���ػ���u�*��H�?h$Ͽ	��'
+k��y9w[��\מ;�`}�gem�5h�d�G���Z6Ǎm�
7'�9nqP"�hv�:�r�o��w��<)5K��
��2�u_�
���6sDz�c�����%������
K�W޹۬3�iH����&;(,Y���f��>�q��6M�A2���`3�X��^g�M;ZKc���X�g��i F�43F)kOcy����~N��y��u/OlX��}�)�_v��R�V�ک�{�r�
++eQ~Ь�+�pC�測9�I[�̬f�2_jg`��O{��8�ȳE��6ƺw;�+��vc�rM׏���aV�bC�׏��*nZ�"�?��r�z,��֪2����=�t��,����Mg�	�;
+3͜�`B����[�X���A���v2��Ƣ�f��tڠ���ڝ�ŔۘT���M����u!wk��I�krý���,R����!5�!���M����sJʓ�,Or�H�T���$.�I�h�x+߬]�e���3&�Jz�:��6��
��B
:CP���ä�̃�O���
���]:PF���z����sW��lSy^�e؞ϔ�r����c��^
���� ������B��XX��b܆"Qҋ�\�"Q�W���9UR"9q��M�R[S��M=#]��r��*0���O��g�־�h��(�"��9Z�kA�5UI�:����99ۛ:2��V��iI�57��Rv!��H�N���L��m�?��_S�C�
�#w
�w
>�?(w
U<��/�
]>�f�?��i��
�|��)��_$=��1�:X`j�������V2��-FGH�J>&C�#)-����e$��"���wI"��8B��U��o��a�׊Ě;�t�kv��t�g����v�r�UK�-�%�	�Z�	X�Ǫn{Qm��h�ݡu�9�y#>��T��Q�X�V�M�g�'����%-n�C��\(��I�B�J���)1|�^x�����6����pR���7&�c;�t��K��
=�A��u��aW7鱶oҙ����Q�	fҙ��Mg>��Uw�M��Z�\�F [...]
+�2
��6=.��T�;�Г�y����A�^��n�G:�]H:�c�tj��Jz�״b ӵ��B?������RB�ԧ��P�����4�~w�z��������������n��A�z�ǣ

ˉ����c4��
5��
+���)$�%�ې����x���Mv�"ʰ^%(�4��7���V
+ߛL����qJm
M�K������zj�{Hs�Y������D��>ko^�b'�gWVf���[O�\!5'���ne�\je*��H�{��WT��4�*Q��="ޗK|?�/x�z��F������Ok��S��1
���*�p�*v��F%$�Z���s�N�����FU�"�I�T���#�7�����x��+���g������A.gȓ$X�MlN
L�i�����?
�NOY��z���'o�5^�����^MIF;`[B;Py�*
r��-��rWAۯ��-lR�"����
AK)QqMu���r�|eō�#N;���y���-�?T�J�_��\�#�UO�x�p
+�~
+qn� عaXSUXL
���3ɠW�
�R�[�J���DG�q�EH�	HJ�8�+���ߜ�Q�J���� )	�:Us7�~�r;M[jQW���L��"��+'
(
�ϗ�i
sJ'�a��.���ҍ\��v�'���}��^>0��|�7z������(
KZB�j ��&����0g��1<�BQ{B3�����3!؝����[���uʂr^�n���73[i%�!��
y�����^�7'q�Z���~d��g�{R���IR���ޜ1ߘ_�~��^Hp����?p�/`x�:��)x(zpd�����Z���8M-b\ �hx,a�H�p4�8F# ǩ<��n��Z�R��W#%�Â���^uY���7�$���
aF)�aj�"�+�s�+���vYސ'�|�l���r�!�" �(ojԡc9Hq���鸔u�
�3.t�,c�� �m� ߩY��
�
����<�S����~��Q��
-�֎�s�i�T9Y��:,w}���t㳒�m��\�g!�DF�]��ލ�
y�O<�-C(_�} �)! �
+��������X�9@�.. �� o
����Ӏ(־O��w��%�yDvCB��o�2cӞ̇)_����
;��r$dޗ;
"���:J9e&���]\+D�Kᅼ�O��B��o�%�oą�0 �$M0�T� ��t,O�9�Hu0���c���y6��
H~8���A|�� I�Z����V
�ݴ]�A�Y�d��uBI<��x����ľ�#�(m �2J��S�7X�� [���F$y��[~�E@�
P"�T��N���^Pf
K�(� %�@)�"�T*~��_�B�2 _�
 ���L���� T�I�X��RY�\i$Y�ζ(\\S���y?7�:��g�����q
�v|�<��OPO\4k��ֺ�ݰ�jj�)���� �v�ÂvN.�Ӄ՗�f\в�4��o��]�WѾj
�����_���)z
Ud�"D.�-
P2��:NC�tB�Ք�?P9wa�<�g����Έ7u3�����V��u�
�3�%{�e��V�b٧�s���K;�,H�?�r
���ў/h�� Ӕh�w|���和r�T4\�B
���� 67����B\�!���#�Hnb
�q����*�]l��
�>���
p����`�8��\��W
;��SC�9�pƕ�8)��� ��6|�#��Z�DZ&��l��>Y�Mt2��K�a�R�j��ONPro���۟�������+d	��u ����D���
�˪	�Fv�"�B����
+�
���$FD��p�
�f����2~�:�
�~7�x�H�?%%�$�	EN r����0��V�Cpzz��@����"��X�e?���4aI �CH��HZ�$�c%�~������&��K��C�U�;O��[�o��ך�kH���y������*����V!_j��~.Jx)�mvc	�@��#��R
+P�h
(��
(�I����'�Y�fd]��0�!
����=��/O�u���w�[���W�n�
o��wj�7/hS�t����z�{�rf��m�@W�1�Y2����Q ڹ��_d�d#��W�7�\�������Q*�k��^o�~	�ώ?&���
O�X
�jvz������E�t�����z�q�pڤN��z,�>���K/�KlZ�z%�.vE�Z��DX0�6?��D��~2��_�v�
��z�{��zUg���o���s��<��#��g���oa�:l�uƟ��ܽ�/=��^b�r�+F��bg�

���c�ќ��vo&
{�iW�l'A�}�A'�@�Ǚ�P
�r���B���l��j�C{ǖ{J���n��c{�Q�ў���MP<7יS�������SG�%6Xl.T;��X��Ag-*w�v9)�M�=Iݘh
ved�y
+�h�f�Q��C/��/�ձ��r��3�c�W�U�o�
])��m��w���:��ipz������m.	ONfd�r���`f
>�?5�Wy<��(�]���/�G�Po
�9�
��O���Q�XyM{��趄�+]
�NW�
~Ў��\ڃ���N���5ΪX3Z������Wz��!=��k�s�$�z���Ϳ��5W����6�BHbV�<��g�_GDׯ��]�\w�R騷
�����^�V�sI7g�K�	{'��9�x���[_���z�~�k�ڻ_s|R=�)�ZW����ݻ+�s��5�q/VѠR�<�o���.�p{V�������y
I����W��c;�T�M
�F
lU��ɝ��\���2:ט�!�
���_�Y�nK
	Wz�L�kD|E�`ry��ԲcF)��\��y�m2nѢ�V>���?o�u��;%��;d@��npi�n:zٻ�/%␯0�_�9�ɝ[c�Iʫ�̬��m�-�I������ؚ�J&����}Z�V�h���4��򭀝���nX�$�a��6p�U��j3A��K5Ͽ�˟"EK��V���9
��`[G��Ie��,;���lp�a�����T�p�L�m)H��D�h��t;�⻘C�R�veɲ���䏽\%�~+_��<�ڎ�Vf;�����f�]�k��9
E��Azd
�~��.��c�Bg�S_���l�qմ�
ƝE�ѩs{��4��i�]��O:H;��/�o����m��Z	 ��j���[.o��8��M��`D�췒5p$��AÍU0��R�5M�^��j�v��[�
�Fi���ӎ�[��{p0�}�j�!�J���r���AZ��vU��T��M�:���RK���Z�\|,~�k�����,9���~Ӵd�d�9�3M�A�@��žд�xiG|�i��ƺK+FIS�LgS�a�N��r)�|U�8�5�zn��x?�2X��i2����V���JR��U
�T
q�P
��T
Y���C��r��a`,��FYUz�n�@�����c��Qe1��=�؜!Ԡ����j�r�
�b�$��Y���5!1Z�N	�����.�T�*�J���A�_R
nU���+�[�D6��F��Ûd�WH�ì(z�������N;�����\���Owj��b^ʎ����W��H
kt��
z��97��� �5��x���9T���G�Fͷ�$�Ű,H~#%��ǧ.-��� q�H��1%Y3ؒ�)�K�n�Ω?6�'�"�,P�v���W�v�g}�˝Z�
wj�1�Ա�X��ص������V�,��lT�UFoV�X�rP^��KI�kwy�yrK=�I7����	�<
�%d�Cⲣ"
ȴ��P6
E��A��o�6_-��s�����l����l{;bY��X�C�t����1�Gb	��>������J���Ry)��
YI�E��T��(��s�f -�_G��zǓXx�c��."��݅�bċ�ٛ��'��J�;S�k��'�����,�[%�aΚL?n[� [...]
-7�C�Y*��nb��y�+�Q:�;�)�Ҍ��Ԧ��3���0K�����B��=򇅼�k<��5{��%�‰{��^���e��
1�fe�R�b�h"ү�)E��H��pf��6�=*�	V
27��{��9�X��QlW=�X1"���ib�[WJ0V�Y�ԫdu��O�nDM�?�bB)8�!�B�\2w���}��[���z�/Y�
n��i~`R��D���+�Q'��?������@�,�erq�eH{z�{1��6�f
�l>���Q���3�
mq�
S�;w
g��r�N��m1���z�jR�R$$�g�P`�ፋo�'���w�
Sw�53@

��K:3�o���S��
I{#�$�.<cb���D	F�<�W�]����l��ǘb������&+���	\�E}��ǝE�uz���\E��QLb���_HS�k�r�!(�ˊL
�vO���۷'�Ή	n�
c��5m�e1Ќ��В��Ď(��=AA���w
��g�&�
�-����o�6&��u��t��<� [...]
+3�jx�p��62/�u�V�����w�Yh�(�"�ݶ�����j����;�-V
�X#C�R��h[
1�<T~pY�h�W�g_��k��Y��a���4s��i�Ӈ�g�
��\�=l�ͷ:���dT;Հ�:du^F�E\�f;�
[������HO�ӎ��u|�9GbAP��
g��9��/V��ڡ����*��y ���<@�|��_�H���kN��b|)���)x/��t� P`�� ?e� �
�������|/���A���g���S��L
+'��c�}�#��D���Ï4nv�RX��ī�C\�|�Wn�A
���o�<Ҧ�N?��3||�iC!h7�
���]Y =��7�� jW�����P��t�9 t�r�
s�w����o%�ty>y�b��c_��hF��̰U�ғ�p���͞$��?��
+k�s\c��BU�_��El��b��i�
+�\���b�X*
+�ܗ
��7�$�� Xͽ�.į;��B �L����by�y�ZM��kKMw'�����7Q���"|2�R����
�偠��;O�M|V^�5��$��
��6=��<�Z9�3��r},�X*
��s
+�R�e�8-,cY? θ,�މ�1�k��p�%$��t3Dq��
��S���"nS#�?[���e�/:{���|%�9�Q=`R;�G���ø��f��8��	����
�#�;/	_� ���T,g྘��W��b��~%_ �z�k� >�� _�!�T����m
�bEKafV�ż�{�0�>��x�D� ��� �~�yo�cһwF�P��S��K�=���# ��

 B�C at T� z+
�
���������s���v_һ�} 1"�X
. Z� ʥ�n
Vf���|Y�(ʔ�
]�
���qa.��\�O\`�;&ן_⽼��~�
+�2}�n�}��R���{�	H�� ��€�B �"�IU�f��*�Ro�� 9˝b	 @��* ��: ����d�f2s���J
+�ó��[�[S�
7���]�,�� �G�7� F�˼��M V��
�r�����eH� ��Q@��=��%��/O^")@=�|,3P/�Km���(��jC��; ��խS��K���;�佢�=�Y�U������4�OJ8~:��SfK
+ Z��OQ�� ���  �H at 3K��7�T@��
�o^
0dTL�҉�0L���2
�S�oz��� ���Asw@�|�#.P�[�Wf�,�_��_Qgޣ�H�7��uSM�D2�=9�2����u����7����;��b� 
XL* ��� �?w~�q�d
8 i`�}��
X?� �� v���ٴ ��J

�����g_4m�69҈�$1
�z��fz����<����e�ua)���q�&��7���ͻ�
��W�
�wBJ@��w L
���k� �
G ~�؀�ǀ�5Ry���*�.�懰�4�iGFG��@���$��<9	�HJI�H �_
pK�F8$��~o�b)8��O�����ؚ@jf@*>��W2!�hC�7�x<o�x��y^7���,�{3�`�G�^?���SW�w��:����E8|������?�ۿ�W�#e������&@��ke�#��m�-O5;�M݁�/i���~�9��X�׮"�M��}{[�z�����m���w���黉��/���n#j�$�!�JHܶ�u��Ѷx=ݬ@@Wh
�������B�6�R�!��ܲ�zEy�==�Dkf���Z{T�H��5�e��Lf+�܉�����~إ����l�v~���U��Uw�p3`��z,2�j���<��%6Ʉ
�(a
�)�:-�g~=�'�?h2
+���]mw�	�>"�XW��Ы:�o�iY'�
��Ϳ
vZ���>���md=�9t�����<S^�`�ܔ��+o$��x_��1k�#sz�M��*��}�
���h������C=��uiS���1)����}2�z�<��l'?t����xڤv����;�[���
܅
�����
g-r<����7I]��x�:�Q4�N��ۼ
��o2���m��:
�w��g�U�W�z��mI�s��+
�%�ۃ�`�6����v��2�EL�Z_7�nm�9��Y��6�4M0�$�U�Q�
�<
��:�Q��⠄��? ��w�0Nׯc�t�j�֠uکW�k���5��^�B�m�+���C�
���Bu��5W���k�������o:PbYM�O��U�9��y3yD>1��O*��{��Q��U+
T��̻|jβ�kӂ�a,׸��d}]:0urj��U�1�^=6���'�c�~��-
*�ҋ�W��Sfʨ<���R�\^Jf|gnA(Z��)��۲�I6�Z��(���!�$f�w,�Nq]\��%���
�
�o
WzX�J7eci�c�m+jx;����ϓ�~X�VOP��;R�wo��U��p�P�β�$-퐷�m�Z����O���g��w��j�Iڒѳcɸ�[r|+N$y�?a��LXm�Xw��5,�}�'[�7
��
�9g]�?-;������ŢLlW��c�[��)e����������2�K�0w�����N�l�:sY��hf��������G�Y�{�X��d��ng�g����j�w"qw?��3s5NPrR^\���m X�P`,���n��s,h�X�l��Xƥ� ~�n��9.ﺦI��Lt�}�
�Z��X�I{m�v��
vh��c� �#��M�L��N�)����q�Q�z1���u�H;���[���i�Gɒ���:�
�e�
�h(3sOQ�b?X�k��_�H���n�K!m��՜Q��Nj7�Sn��ϰ��ˮ^ϝF� ���dwZ����۶��j��dT�u2Jp
+ʠ�\)��
)����
:�L	��Ur,��a�)
*�ܽ`	��.��%����4�J��[�M]�q|
����t����Z�VyM�2�z[ۺ�-U2�F5-%؏�ʠ����yے���P6eq)E��Y��N�J�9	O��M���M����r������0U��]��,EǺ�Bݜ,�\:n ��>�e�4�޹��R51:+�6�(�JxS
&
+��c�`y�0q�-J�uLV��R��࠮��`l���sD�
Մ�T�	�\m!P�����w
g�g�B�g)*^���gҌ�_���thzke_bKI�@�JU�;�־�����M�����
28��
w�U6�i'��
g�Ii7
ͧ�
;�dVa�m���'
��7"Ϣ�w\�y�^�\N��=�?���m��V60��]:�vUZ���۝�c��J�5��k�4��&T'��{���>�썿H���(6�V�B�Z(א�P��N�F�������������ə�/�7N(��E������Lg��U��
2�0��]��M�C3�G���s��&�j��hP滱��O����a��֮Xʞ�dl�-���W�e�#O����
oga[vv��+�-\�֎e7\q��X��e~Ͷ
�-s��{��˞���������۽��I�?�@M�y��V&
+Ґ69�d~x����b�
�0o����p(AC�يz)�
Sq�5�tI=`�h�zK�]�.l7�xm��lj�53K��v�3V9��/SF�|f��A=�E�t��XS���&oڧ��AA���\@
��
��_Q��6AL&M|�Cf8}�_�^��@0�&RXMJ�1nw]a���b5���5�S0?ױn0z�������m(��&0�֑k��k��m/�~��Я�kDg�툚���
����Ɲ��ks�7W�*?�Et��������W�
�����
�
V��*�c�1�
�m����4TR#���
��� �xQ�7��0�j�ڹ�&�[��K��5A��M����)?�GWtBE�vH�X�Oڦ�#�;�#�:9ķ�h�W2�gHi�
v�VskW��=��=��0���-���4�6}��J�� �e�=҅��zl|�0���QGp?RB8������
�j��V�J��]�%0��k�Ɓ	�y|V�a!=���gB�v@b��%�s���3�[�m�C��S�W#m>�-�B�TZv�ȭ�#ȭɳH7�L!jt.��\��7YA�����[{2i��!��;�!�й���O�JѺA˳�%�~�4��n��32\љ�2�r����(���B-�`�±�����ֹc|�0�
�
��m�D�#
|�<�v"ب�(��22d6�
���E�9�f�@�U )*˱aO,��̙���)�w��	�r|0C�ې����	�Ǎ꒚u�9�նcbݪ
����3 [...]
+��>��y�~�da��aC�
^�w�`Z�K	�IV�™J5�D0{�����w���I�>L��8�3=����h�z��
#:
͠�śBYe0���(6���*H�XZh,� P1g4��4S�T�
�\��U�2�	@Y�
PR2��gu�9�c�HuQb�N\���z�٧�"� ��0�ݽ=��4@/͸L�$G���c�#
��1eg3�����U,�
�
��o�� =IR,�/^�����!�ytCſ�&� t:Z t6�ڋ�:{��Q�ݲ(#��
+Uv%fof(gz����u��I|�.�}i1�N����S#T)Jq�32�qL����
�� �o+���
�*9?�N� �e�OpcnS�0�� ����Y0�$��� ���&}��;�P���>邸Y��a�4e�4X���S�4y���_Gwo:G�sm�����,��}��
, 6%�
\3{�}*'���{,����Rcc�� .����{ W�-�U88�� �t�l
G
��`��=0ʐ�W����u���.T�q?[��Ź	��$�Z���]¡T[@3-5�MN�
��s���yI�p{�����B at p8��G��Ʋq!h#@�� �
�7 ~�t�ߜ�X� ��v��-
g�����G?(�Jݞ4T5�$�=��S�cRY��2�q�,����R����������<zDU	 1�~���o�LJ���4�X.��R5��d� Y�$�c�D��oV���w at l53{�$|��ԊK��	zK�7�:�w���/	�F�l�
O0���*���Ȏ?P���z�k\O�H��di�%���ƋN
+o�r.�BP�R9��Lj��(�HJ��b�P���������k&c��'�Dg�|S�����z�N�yN�w8[k� у�JJ�rk���ą@������'�4��hKKz���v+�� ��O�@��>�#@{�˥
��x	�b
��� �./$r�H	��,����i˩cĞ�ğ>�v��J�o:\^HwR�@@����_��8����S���93 ����l���
X�����~.�� vؠ ��3�-z-���`�
	X���gE,3�
��$ܛ,��$v-
	�%
+y�,�g?%%%<�[�$yroW�4`�(
�c����+���f{�O����8 ����)
���	S|y;|���e%��T��
~�kA862�]�qŌ�k�6(������tz�'���&���o�o��7���M��w��/�4o_�k�
�4L�b�@�6��BH ?q���Xs����!
Ѕ�/�
�I�����@�V����}�X���m��������$�!��� �ܐ��&��/��kvM`i+�Jx*|ݶ���n
������@��5 �� �����?�
�����V�|~��;�+���!9�&)$��q
_j����|��
+MHƤ%n�o���v��ތ��>Z���ҟ@7�,Е^h�0�<�6
�?h�t|�	�%��}��3��4��	Y����ܝk()L\���q�;���u`�d~��Bg'-�ŭ���7f\]��z}���t�K�%6v&^	�W

��ur
�Z
BOo�nn���$
+6a�����
�KB���5!��Χ���_��q-��}�}�W���v-?n�8r]���}�i�W�Я�
C��ю�߹Y-* ���OMճ�M�Q
�]_g��9�e���I�!��ǃ���]��~�ޱ�2{�
Yu��s��ІW�
whR�?���f at f�K��i
f6���rb�Z�М�*sg�e.��@8�ƙǤ;ʅ���3ۓdZV{1(��UW,o�̮��
��ǟ��nK�>;�N#��o���
+���2�B�9sN�&��?���Y�U��z=>O���&�������L�_Z
k�$شϬ�W�߯?���
�خ_s�NW���@���f`6���j�,�Є����
+x��m�f}]��u�H
�ڮ��k���V�J����u�Jo��t��lE��^9XV�$f�4v�\��~�D�)^Ɍ���5&84q5��EuX/���w+������|�1��Z���wn�+>^�
���o\9�b�_-���(�
2W�6L�8+gjE�P���+`�ꔔ&���A���n��m&
�������=��exqed��_��/Mܡђ+g�K�˰�eV�����'��t���!/ϛ�뀧��'
�P�npx���O�K��f�k��9
��Ay�����1J�ṱ3C_�����0��:�ݓ�]?hBk˃L�.x�J�)���<�,��?��V+=HDz���V���n3���Zj/�!�QvPP'Y��,�pk��q�v0M������`�#��W�L{���ƂQ�X�QJϷ��n>vS������H�ON`wil9�<rbX��6f�k6M
+�2�*�}���T,:KA�e���繙v����n˂���+FI��
��l�v#�O�j�b"m��-s�
H����
�������Ro�TG�V_�/
�}XU���m
7�$�t9��I����Bƕ�m�#�FIE�]�|M1���KB��O���gy<�
�
PQ��EM�:T�NJ��~F��yU��%�o]eP}���Gr�g��5<˦��Hѣ�K�bK�1
HV�y���+/Y�r��{
:�[�H1?�	(6���K?���֪����mU��6J�=
�A���!��C1X�
��ㆆʦh�RtuXi�qE�R[����
��������G�
+�is.�rד@!9���w��2�
�V:~�}�K�N��l1T�wmI��
+�
��==����z'�XJ�
2�,�2�2��})z��F���>�$:)�"b���c3J�	(#�n�&y7?�y=��q
L�^�J�@�ڬ����V-^���
ce��fnW=��1��ven����
+V)"�Dz��@���*���j��棻<�G)�Էb���27���L~���w-z³=�E��RYq����"{�AY���V�|ge�
2��f��3�h"*��U7b���A�҆殨�=�����x�+P㉲���2I��q��4�
N
�ؼ���
�R����V|u5�s�Yz�^�Ѐm;�!+oV��#�N��L�_�ҟ�A�\ЃqMZ�=m��
+�5^�
�i�$��􃒳��$���Ʋ�c�	ϻ�������;��n<�N��'?�1���������K���/�Ҏ��N
'v�VBCFo�����
ֶ{t��������v���bk��/s�9g@����s��L\U�z���oU�CW��E�s�:-3i�������*Υ�|VJ
�e
��q�N�e��
�^H2!��@�v�X'�y�%�6|�
��z����89~�;`o���۾;Ȍ�6��������[�
�F
/�r�j�̝ИL�� �==�IG�q"5= K�L!�J�;�NN�
+�L<�\I�EJ��=1_6ωLn������||�.Z���@�����	��4��Ɖ:}��ڸ��:�X��O�6��f�+f�c�R2��<���
9���Fpۥ��JG���
xR��X2�QX�,m��ܜ�L��Ǐ�.d��W
+��W���c�r.����bHI�䐒X�J�Y
+3��'�z�
b��r��x
c�e%�8ݟ�����2�j�ϗe��s�/�
5{�{b�%λt��'S�J
ONs
+�0�m��1���`�u�����4�`� E�D�DJ��BɰC(&��
��f �bT2vS�J��:�X�dѻ�֣,u
��V��x���@��n?֪4��|���"�r�^p
k�{ȑ{I�<�I>-�
���&��D�ۢ��s	���*(r��P��ְc�8L�a�e�L��nu

+̌x�5G/��X�Cl
+Ы
+f7��_C��M�bm0��u(V���XE�X�	:�V����g��j8A)5����P�g�:����;�5q&��d*������%p�?����[#8�Ca'�Q�6��s
��a�Q�
�
='A�Yׄ��ց�W���V����1�����z�b�Ÿ�
��!=#�X{��Ku�;&*��1(.���/��}�i��w�R�k&�y%"a�{<�m�����a�B��FW*(�Ӏ���X����.b��$4((��Cuey� 8��yt 8���+�@� ����@�&s�Z��Q�m�l�ݘ^@��%W{�f�k���;�M���%
�B�O�-
/�K
���vQ�Y
rX�U��(�wx
��$ �d��e ���
�D%
+��R�`��b�?�:�9ptЀ���
�'L���w��/��l���W
�n)��tKC%
;:`f��g#&���T"��6q4�ŐMm O]��*h�E��(�����V�瀂�xq�+ �hR�XR�z_��G	BJ�>���D�'�yB�p��zB�/��;8*�V��{p
�k�{���5>;g[�L�BUN)̙G��0���
�!7RYP8\W�X4 �
��!���f0�,�0(`<�*o!��
d��MB�ߩ9�!�����r1 �A� D�o!���!d5l׶FJ�
�P'�%��|�LȆ��
!��,vq
Iш��(�b�I��� ��t�Q��� �.
ţ�g��
'
{(.���Ѹ�܀�k B�K�)i
ř�	�o	(�zC(>�x(�Q_�d�ڵϙRz����?b�uا�E[M�.���
�\�'#
�v��ؽva�B���Qu@�1�6
'�h<$(�,hP�4=|�
��=(�& �8��e�	n��D���aһX��Ġ3���
%
+�pQ����w1�ӣ�^C�hG/
q�jS!vߗ���x�f��:�
+
@J�+�~$���%,� %�
%yJ�&O(y0�@�ٯm��Jn8��
%��JN�
��hs(Y�5(��P2vB��{J㱰��#�FJ�c2���8^y~ͼ;���YJ$c�W���5T�^~��T�.ED��
�
6�U��](���@J�5J����e(Ŵ�P
+-
�TJB�rgS\���/
�(�G&J���*,�Kb~��x��	�9\
�p�Pah�%O��/
�Kp{a���2�D�
�
e(}
+e��ʬ�"�>/P�I"P�X
+)/��H(��5��
�����
+��d�d��W��I��:e�v�o��Є��>|�@zG��!�B���^�!l�
_�
�.���'���wx˺}(��,���$���\k~�r��ʕ�<�}%�PֽpPVb=(�^T�츍.�u.�X���˅��w��$��
��Ч�w��n~G�a������8|Y�!LL�E�+��۶m+PAXP��Pa�KC�.׆
+��7ʟd��V](�W�|��(��~���ܖR,&8ï+r�M�ɓ����(�?K8|P|
oߡ��O{'��E���D<\�V�A�v6
���&Tz!+���IPiU	s�R#(A������B��:�r*���o0v3������a��[�#�~#����»������f��»!H�*���˺��r�����΢���!�^�%T5P
����5.	U�~�hI���N��ks�|W�@�W1\!$�s͏�}��|�?ݶm��r�ok6�A���J�H�h�e��;�
W<�gl�����v��
56B
jTm�~�7P]��������-�Q���0q�Y0bӝdjuʤ��3�t5�	'����$�J
�|������j;���	��$�
�.�d��_�ޘ�kH�V��婌k`9�T���rP�-�lj�����f�<V+1��_�G,�C%�S��N���������[�eSKK�ݕ�)K��v
ּ"�46
���8��:
���ӈ�.�8�:�����:��������6�/xy
�\�!��k�^�
�~�k�{��n�"��|�
�E�Ϝm��Z����+�E�Ϟm��Zy?��B.m
_����S�80��X�;�&�^�����8����{3wˁiE���d�W�7�x%
Ĕ�@p�5~�%?\��g��<�M�}*e�ݔ��3�J_j���™QC���L.�D~�=y��
77
��SCSo�6�M�L���\$��t[ �*��S0
�SpN1=�1ݲ��vw

�,
�<:
+�!�
B�	y��5E(#�z���zmk���۵iE�!����d�GNr�YO�2�47�Φj�ѹ�ǯ�^�����!w�
5�����i^rg�
+��
+
+��[���uy�M#L
V
rF��D�\��[,��v��י���F�l�5���V<>�Q9%���x\3�R*y��{��@���Z��Z��۝uK`.�Scp���b؞i܈����9ϣ��*ϖ��x�ߟ��-s����
Ρ7s��˫*�A�	��;����$=l�M���ۻ���ڤ f�&
���&�|!�ܞS�}���:�1F������,b�~i;�1�C��|(Y„��5e�N=#<��U��7p�
|s9��}>��{lr���X��bW�~�)��]�x�4�Ǐ�w
�`(9=x�TܘV�1�9�]e�Bz
l����*�&��9��V�*뛓P�k¥ֽ���n��M{m�O�٬��K��j�8a�i���	fe�قR�/��J%$/��݆�aM��r	����S*8�w����u*�v��s=R
+O�ˇEH��YQ����ir~@�ͅy�xpRb{��
\��� ���
�T�6��z^���G��=—�+��O\
p���==~�����
�����
���{>���V�x9'�y�����
������n�B���Q����z${)Qӗ)�\��]�K�8��g��E�\)��X�c3l�0��
� ߶��}�_�Č �
����$�'0A��l��z,�����A�p�?,��'�W���9�?\��U�O`F�?\�O
���T����A�p�C�?�g�Å����7������¿1����ת�C~F�?\�9��}��#��W�?[�����eKC�� Њ��]`*+0�?Z!����J���
T_Xԯ ��%�����0Ɖ��EH�Uh����G��%��mG:�7r�����&�GsuZ�u�Qq�_�G��_ �S�nR���8�zN��9��f��)�k�S0�b�_‡�('�����]m;3��^F؃o�cD*�j�L
dq�~Iq�K
���I`�)��}h}������R
ڶKr�@�������7�
fg���'�_�\g�^
�L�{y�.=������\�i�+���C��j�ݩΝ�ܧ� v�=A�m�=�ou���K�S���u��k47�>��˱g�)�=),�4(�ЃXg}}�n��c{o >�,�7Z:�
*���D�oۿ,'8:�ZV<Z=x�9�G
�8o����;TEh��K��-��ܷc
ޯ<�ꅿ����m���D�S�R�����A>��GE�uNR;w8I�j��)�(����nDQY�=M)~��¾2C�B�{��	~��
+�e����s�3���#i��=��Z�o��~8����	�}�;��!��+z�p�(�����4D�a}!KW���,`k�۲�����E�b�#��.ql̴͹�V�I�ێ��c�Pm���8N�Nm�
ld�qf�
+�k0R�!칾ǣH�źٺ�kv	�y���I�@M�q�\���ku	w��I��
�G�uL�
�0/,*&��d����d��ř����s����f�n;���Ē�Ҕ�αE�$��Fڔ^	
�z��%�
�3�q�7	m��d+�+K�,'����Sk�J�%�b�/�Knn��L=3}-����Z%�K"�4'lpv��$�0����?$��{��Wݒj}��>hD�&2W�-|<�6֘wdJ�
v[�ra��dODž#`
�"��^�
~^�p�-2s�i�Q�~B"ȿ?oZu�f�`S��~�,���$��A��n��n��mP�m�k�q'���-)h5�m6ye�S�1x�[�(��$�1x�w�A$;���dGU�Q�CEa�Rf
��-����Dn�:��9"q�G�q�mq
+�h��H��+(7���8l�'�������WW��&O�N��^��6*�OZ��6���K��$�c�QnKd����epJ�S�����D9��A���f->���埞R�
�P�F]JF3��'�&u@�,L�1���[�uVd��l7�|�ů�,��
}��Dj���G�j�
+
+M��@���->��m�;-��ؽA�0w^(��=t/���s�����6������K晩/C�˓��&*j�*�
��
�Sf~R�Ǜ��_�k��$�|o�'��'0#�/�~B�,?�	L0��U�O`�9�-�OW������������¿1����¿1�,���g���~�Qߟ-��
�)�󧯖?�'������`����
��c�s����?��fBL�
f���,�1#�FN���������*��+o�7h�g�e�����#�#M ,�߇g�-sqp���(�s�	�L:J�x>e������ZG=1�N��
�q��ԑ������\��g+�{�����w�*@�_9 tT	A��!+���ڄ��v��c�Oi8��$������t������=z��/� 5;��o� ߶R>0;y��ys�����bF� 3#G �q�N�
��k�%!��SL›�0/U���w}�5��P���kٹ�Tb�����J����D�~�.� h�d.���4@��3Wr姓��6*ji
���L��s�3�rX��Y{�'��v��%�.�x�
�
!"����� TX�s� [...]
+�g��1$�lw�C?�m=�(Ó�=f�7� ��C�E���'����Ԙ�;�[ S2A�+��J �^r�H�, Py��J\X�F�ϓU�u�rlw����n�<��?(���jS�I䟟���2�	���ٹ;?vCP-�_�I zn��/��j7c�|�R�t6H��s%��n��s{χ�3���J����琙���{�:E�K�������`=����=hY�2˄�UIm�= �u�a�+8Ν�v����}{&o
�d
z�͞IOĊ�
7����7	����	q|a���%��w�w~k
�e�
07y�yo ��Ė_�"��8t�I�(P�k\�W�
/�\Y���
�c~ll07��N
2\�|��:��2�ɯ���R����
 ��@��L��mQ�j�-ǜ,ơ���浻]�۶�O^���
)m�ݓ
��"��Z
+��2vK�I.�[��F���6kC0KZT{s�qRF�ОiW��5��Y�y�Fz���4��~�|��o�&�ĺ��6x9-�a�1-^�����?<��bq�]����U����iS�P�&��7ѫ���@;9��q��Ɩ;�a;̫Q=�#�5�T1�ǃ(n�籀;{��n���mb��A�����t��o���GO-w_�����֣G
+d�����:wQ�K�f�-W�δ�ttjzZ(dv���p�m��.���:�
�����޼r�^�A�M�9�Kp��3��яhKL�
��P����i�*��� i�ޗer��
+�7�v����y��5����D�� ������Qe
+'1�n�
<O��d��gKݻh<�:G�r�_��mP��-{z�ɇy�~K�a��n.�0�(���.�ms�0j��h�V�_p,��>��=w
�v�Q���dQy��_�j��mf>�B3�f$H�?R���&}���c
j
��SK
+�.[ւ�Q�G�H�
���r���~�-C:���
ώ`
ݏe��G�:�����(#U�ȥb�D���n*��S�Ba��!��`@��.���6�Y���H�(�����/�&V?�F5���Չln�恡S)6J�1�M�
sE
7�<
���nSa�4�&S���e��Z�A���@����Ji|-:�Kx,������N/�yr��v�n�J
gƘ ࡶq�ElCn�چ,��M�`VxcT^a펻By�[��
�D!k�ZK��j=LVVk�̭WjZE���/��+l�j4����Y�L~Q&�c}�w�sP,Z����V
+P�Pˬtj�[�'��2KV���	.�/q�<�u�2/w��̅��̹��Ic���?
+��
+�A�����.��3�)���ɉ^J
w�D������zp�)��ȕgϖ;{�
A�W�~��]�"��,E�-J7�����#>Tnr�� �
�	L0��U�O`�9�~ʱ_�&���-�3��-��
�=~�9�-��u,����g
��
��G
�k��!?A��l���X~�T�O>E�=� �����#F>� ��9��*�f��o
=�u
]eN�
�%���Ws)��^D�Pmqx�
M�"��
B��x�s:�}��
���?PA)��F�I?k�m���ٯ�T�	�Tv�1�,)��D��zWI���ۥ
q������'Wa����䲆�c������D����P�Y�p�ж@���J������/�-�ݤ���
+���q�p��YR#�+�ɖL�sk�W$(,�Y�L{b��@CGBz�jU*j�
5y��m{��]������f��HB7a��oBj=��
��l�,>�
�Z��n�q������w�����@{3�����5�
1��L�8?��ڂ�˰�x�xy�d�.�3�_�w��-��]��j
��<Y���
���m�a_$"(�� 4����@�Q ʌ����{D��뿤�(Lm_b�_Bڄ~y���鱀�b�߹Z,^�v�
�/�Ͽ"�a�;H��~0~R����6�x�/�(�0Z�E4���^�䶲
sۨ`X��$�Y�	s�
�b+�i~�.qZ�>���65F���$���S����h)1~R�# E!��?w�U_I�Y1���"�<�v0�2�	��<��mٶ��ӫ]��Z-�~�]r�o/?)`&
>���a@��6�S�%.��R2�Su(�V��e�*�J��$/Iq�m%���&8̋»[zmw�s at K۲GM橀JfZx��������yTg4��Ӄ�m6!�0� zɿ�Z��QԦ8��NLRb��`
r�0��ă~4�Fk#��l [...]
�JɍF
粺=�w�P�y��˻ߒ4�{�ȳ�0�U�6>��
˝����;�"w�:\�H��<?�[/
`n/c�9�ˬ��Yҵ��JW�?�е�x��)�oY�wa�O�HM[Y�8Ҕ�5	=X#؉(��)(;���0����
���7�
��}��Z�֖��Z;���z���
'%ź?I��I��]�3lF�g���M�|,[�Ha��%	e��n��������_Oh�f`��6�'@{���iZ�M�a�2ɪ��@�O
-�f1��L�
[��s����N�5�X�|������bͱD��A3k�8d��uoA�?)פ
�z�s��w������;�>�X%��n�rgeA�
+6��z�{�>l�bb�AͲ�L��)~s*;ܝζ_�P�J����Z���u_�|F�c����^�*x�r����i���rf���5�v ��A����zג}n�]�%ޤt�.��1.�hl�)�E&��טƶ�"�>��v��{<�
D�_�C�R�~�H��c�[|��
�z�3�뱍�����9#U0���+�
�C��{&O����l���4�3�R}�E�/�*ao��g��� |z��mg��I�
�j4M��&Y91Î\�'��2&O
ܑg��JS���,���
��^��d5�a�H�An�A�X�
5Z�?+�D��
�

����Ecc�,_�NLbf���=�3��؉
*����h�d6�L�t<Fa��B�;/�&�a�lv^�k)Y��	�Wd��O������$����f��0��kdy��}���q�=�~{T�-��H��~��G�Fv��j����+�_���`9?��efmǸ�a�M"��v|B��q�
p��G7��j
�'	���Wx��ސZkՒ�����*�w��b��6�د��-���+9�fjjV�v�'���1�L��In���y ��I����f|9�C��ln
j��V�T�!M��3/��'y�-��]�1�˜���q"t��$��q�?����:R��m4�Z`�7J��а��v>I<��_�"A�2Y9\��-�	
+��	���k:�b�j,�#���#j� y�*j�U)����[�0w�R�
�,�ť%�p�$��YnO�]�
)0����	b�7������=�O`F�_����X~��`������� ��?X�_�3������X�\�ߘ�U�l�ߘ`��g
����������_�0�A�k��`8W�+"_��2]5r�>� t�<h�tU)[s�ؼ(ͳw��- \,�m��ҳ
]$ްm�',W�e,/���H�
�t��I�s�g�p��$�\� �
+�DU�J,��E��iD���m�j��\e{�;�C�l�}Q �/Z��
+�Rϰl)Z�
)U=Qbԇ����|ڿ��(�ߟ���̾�L�2��ٮC ��bz�	1��_����Mi�}W�Xז^�2�4A�r)j[Q��8dV�8\�w!�����r
#q�'�Va�gp4�lВ~E���1�ݚ��^|
Y���0^N���|�u[xrw]I\�l)6�mQ�
GD�+h��'hq��
�ۍ�L8�#N��O
+ �/���
+��恟rUw5:��6��ص^*9l�Ib�3~�m��—��{���+*m��՝#L�Û��{����=�뮪4�mÈ��]"�?>1P��
��fZ_@����+V�����K��fL��K �
d^^?$��z\��ĸ}
��2=bW޼4|~��DY�-�wU��0w�ub:�e��W���V�
zl��P1���C�W�P�\)�E^anHò{���t;���z���M���)xW�M=�
�l�y=
�~C���P�
+��^��i �D�3�-�0���T��?��;�BT�
9��6a����>�Ğ\*�;�t�1�qӧEȽP�}{�F8j|B�\�;{�
4��a������-�8���NI7�*�R�kj��Q~Տ�8� ��+
L�LPS`zЋ{�8�\H��<�Sw`�� B�+���/�_A�C��䙎��(^���
+@'��
��	Q����ܗ>�
�]���/�-)z�J�����C�����׍�D�o۟�/����_0���Q�
JF~)Ot|����M�b�.��:��qhZL��	>�L`�ʁ�|�����L^���f�I�\��X��i��E�A��㯠D�nLmݝ���(Ԭ—8�Fp�Bz���Ҏҭ3�p��T�F�8�e�KO5띃�W���0	�9a���5��D)w�I���!f���=�~q�

��!���m`�{�E��{�"D������A�1�ݍ�'��Խ/I(��I:v�
l�6�mO�$��mǿ�WPl�������8��P�8ţ=����:�&Y��Ob�?}{��·mg�>���� ��"�_���V��;Oh'#i(+�/(���H�t��6`��A�
��Q���h[u�W�q�����%�`laO��^݊�����U����_�0��ͤR��L�/_�ni&��N�k�r��h���[��w󠔀 �� ���������e
�yNc�՞h�
���
+�:�i�)-���nJ��
+�%��Ƿ�kTz~��Z��+z�g��D~
��H'��I����IP�� �
 m��s����s��׎I�k�Ew��Գ%�J��r\ �1z\FTr��E�pp?�-�~��
+@�4��W�J)L�U���?.�X‡G�;�>�3C�A�l�˷��:�}���y��_���a������p��cڗ�K��~�j�������C�?Z$�D1�+eM���eN����X�yoH+��@�ܣZ-���A�
�_�/��>��#����K�NL{�5]���	��=�nPN�m��o���A�ƣ�w8�OO}��m����\��N�I\�z���_��4�W�n�{���9K�6���q�����M��j�����{d�
o������r->��r�~V���y
�6~��8���-�DQ�,W������'��un�l���L�Ӱ�r�7F�%��c+4x�h��Y���\�%��XK��J%
��$,V��u��r
��݆�pI
J��.��-z�?
6�=��k�3VU����P��I��f����O��
��ų[\f�zy�>A�Eat}�_V�8�V?�/�+Q���y�%������\�9��NQ}�cs���
L6S*�̩�
&��zL��y
���,c/0�q���f�����/� �]EN[
�C���t�	<�:��Xt��`YJ����
��ڮ)ƅ
+
��}kf���d#�Z���l�����F�fۉ�M;��8�s/e,_]s
G8s���q�tǧ�I�/�E�e3V�f��u�N��]l�r����
�
żҽo�� %k{B��^鎦�WaU����\T�96}��zZ/F�j
+
��
1��
5(.�m߆�\�
�J{ �\���(����E��ճ�C�S*���O�22ׂB��y�F�	
��c��Z����
+G`�ɼ�z1��k�y��k�n�sR�Q��V�������R��-�=uV�j+tn�(4�����%���o��8�A?�A~��aB򋠟@�����¿1������	��g
�/���¿1�u���������Z.�kO��}7���%R!(����(��z�iE�- �L`�S'�zvOʭ̝ZD������Q���U��җ���!ue����$�^̆	0/Q0�W�S�M�&�X/ǝ}��CuT8
zq��k+ik��yQ�h�Rk�`d���EYJc9;˾U��\��Z7y�lݥ���DxC�o� ߶?!�~�s5(
Ϡ��'}�N�c�e�I
ڦ�V:j�y�H!�F�%\-�@{�g�˿,��*�|_��0Y�+�r;�p�ֳ2ھ�v�?G��g%�
��
�$ �V
+ =G���
+���l5M#
�:GV��w]� ?�x�V뙩�l��Y��Kf�ݳ�ޥ/R�	��z��>
 ơ���ș�=�Ï�_1W�7&s�b�{q�Y2u�) :�&�:�<�4���Z�;*�8���:a~��=z�;p�,���"�z�+A��]������
^O>��,��&�o;�Q��
�/��8���R�s�}`���9������[���V���{�
+�/��(��݋�ы$`p�\��a��M
��'?F].������[�f��D��`�|��4J]�ɓ�v�fz��X��hv��x����h#~ؽ�ʜ�p�
��h\
�]�Hs��s#%�z��Ή�N[�N�̽�P\�b��/��$�=�$�?I|��f����X�3�/DUo��E�����ΐ�G�� �
�a���&$�ɋ=�XwGx�����L�p�i!/*0{��޿	`L�•�<g(�l�~
+l�t/w+f&u���LjN9���A���'�@~f��c�
_T��+�=5L��w.�;��P�~J�I�N��)*���#�k�+�t�}�L}�,
�{�U23��H?� t���U���C2��c1��?�
�����f�خF�әy�?�����A�S3���c���+&�$��L����f����x�A��%@O\s����ܶ���j ��
,!�J���b|������~�G���aV{$ST� ���B,Դ�=� ���[ cf!:<���&B�L�vuL�
��� o.♾~�L/���u���C�)���v�$�5y]�-=|�Ҷ�S�h"e�!r��qsR����i��?.��4
?M� �GG�gJ
�z�Y�!�5M��5
+��������Iy����,
+I!;L ,9�>����\�l߽ Q<�V[nO��j�o�@�7�U�q�y�gz0�O��(	�lwnn���mZ��S�I+�hs����j�<w��R�&�gK��M4�ޯC��Ђ�9O���
c��3Ɣ6F
�#F���������`�C��\�?�ʿY��;�_�w�$��"U͜aMt�Vadi�T��ct�
���ư���>\�r��a�%��
�[?���v�����h[�莱�@X~Vx�]�g&(0y��r����88ӵ|Pϭ�y܏J���aT8�X���Ε>�񅠆��B���-����ڻu��I�X�_NJ0�W�{��q�U ڕ����L9Oݩ�y��o���Yޡ�(��j�u�G�p�,8�m�����Z���R'����|�Z�
�&�-�+%>٭�L\�9�\�g���%L�w/`l Й
+@��tP8��G���n2<�:���el�S f6�2Wͥ��]�Jm��-m��eR�>�'��~�Ķ�
��e9���j�葫���.gi�_������ s��Aq����G�䃘�
w�u�i�Y��
��8�<32Rw�3�j��*B��!v”���l���-�x�"���ެ��\�
�]�ӒA�?$A�� P� @�L2(=ԋ�e��X�Z��=���ö_m$hu��[b΂���JS��t��նa�%.rvY��I™����R����3��p,��#(^V �a�A����c�c=����b��X�O��TC%j߱r=�KĹ��	�3�66��M�4~]�~����b�J��Vˁ��Wj&جk�X��q�xaZ}��}�A&f�U���_�I��c��Fsj%C
Q�֦
[�p&�q�';�n�Qa������F��`5q*����˹|
,3#{�X��h����sL"�o� ߶?!�}x��
W��&��p�[�ٞi�����l��DŽ�\A�����L3
+�0�Y<�J���2�
�h���_�Pv^�X��;S�ځ�O��0�"�Ҵ���ը~V"ȷ�S�
�
�B��@M���<+��	�P�76;�
bp'��S6�]eG=mq�?s��X�Ʃ`Mw��e��Io�u'Qds�c0N
ï�}���`4��Q�J����\�A����I� �8�u��B��p��y`f�gb�ձ>�/KU3�_�k��.���cG:�
+��Y������"�
N��>X[]sP�Z��%Y9�q!w��E��D����G1�<c*�t��*I�z0�&����4=��eK�؋5��xf<2[���)�#���{�A����Ā��U��z�
����l׫���/BwkIݖ�R;A�n��D���"N�
_��2}�e�i%�X���qz\�X�5�<��$�����̨ޯ��f�q�n�U��n�M�:9�t��ټ=
�my�ZG�0޴�A�l#�`�Ҫ��%�O�� �"� ?]D��K���q�J1A�1)\N�Z��M6�C_�w�����G
���y>=hحy�0�|�J��I+>bg���.���l�.?������
�
+e����^�{����A?�A~�&���	��ˠ��� �����T��>�c�JX}-�N! ʎ�i��_cn�pA���i[����ak�ع���ɣ^h�'�L,
� �Q*Č�T�u-՞�oLW�+1?�~:(ל��[���C���6��
(ȧ�i�����6
s�}4)�c�r|���~���2UR���y�.���|���Auތg�R�������VD��V�{�B��M�Ɛ�=	�m�� ��W��9�N^ 4,��
|ꔋ����^��x�ȑ��>~�#��kzNZ�%�\

U�)���J�ݣJ���Zy�g��:ʵ�� �>L����|G_��I�W��7��ӄ5p�,��g �� WME�g;�j
9���4�utqW�b.y�6E����:r�R���\_��\E��9�U(����s|���xP!��
i
HBP��=�d��ώ	
+�~��
+��$f�k
�D0� �nS:J�d�8�[�f�U�:���T���<�(ukv��	����������#�s
�%�|oo��ֵ/��*�&_ at k������^=�Ǯ�͙� uT�I��C�Z��\Tw�>�q��0eT�#��Mr��+�����M�@�Ok�#k����\�!��, �̰�S����O/j �M�ζ�
�A04�ti���M��ZeuTj�_>��Ƌz'�g)p W���@HH�
w�n'�3�@��Wni� ��y���

NS���u�B`�3��������At,y�5��|i
+��G�b��f�.p[�U-O��Wn�6-��]�w�VG�6zq��
^ҿK�ێ� ����/1_AA��'(��y�RJ\JD�bp��@���M��f�3�z�2����p0]~�Z)J
��R
���/	�
�t[�H������螦?$_1���;0��4�~���o���н��d�
G!W�s��ҭ{�՜T�Po����͓�G�*��b�,�n��:z�[+udX�'s
+�;s2%w(��P
�^Ç�������;OӿM��Α
���GaYo�fs5���*��i���5�*ly��%{�X��z�eЂK
+nO��L��+��8��+�)��}B"ȷ���A�Q��iJP�<�������ь�/�,�?����>�QgF!=����T/�9
+��!I
Q1a��bl�.R�J�'������r*��r2�Ps"���y"�Ns?$��y~r�
A�]���
���$���'鉁TB��	U��ū��Jqq�Pl����q-"��nԯ7�vB�/�/������6>`��b���w	
+u��
T@5�y�hwr��n19��(���]bT;�
eh�ڳ���j����Y�1���%ӟ܎<���}=`�~��柖�QGC�ܛ%`���>+����J=O�B<���n�z,*����2g&���b���<�˄" �NLq��a�۶j���w��Z`z�Z8AG0�*�q�,
t�]0tWPE�o�IP��Aa�~6x�yv f�$=*�*�#{]_x��X+c��z�8����%���V�����v�S�`D�ޓY�,`^
��}�G���tMU]m�=�:��l AA��&z�;֜k���o������n(F��n���<	��̎�e���f���`ɉ�c�����Y�煿���G�
��V^�ǟwTTPY
/�����x�״���U��F}|s��f2X_��n��s���������#ۏK&���'���篞5�
�� W��

i��3�4�a��.,}���A�8����d�	�}tb�o���Y�Y��d��F�3��E��la�Y��[:3�,�sSU���q7�3�9��O���� &�PS'��t��k�*'iy�O�u��6�_��8��W�	�-����4����F>K_���o�k'%~����[d���M+:��I8۩�
S�?���
���`��:(��0���c]$G�e*O�\:�Өah�4d�ŢM4�+v��,��;^.d>���_�gJ��\X��[L���i�I���"�
2��r���`ѫ�=�0]�z�l�CbѼ��:��;�B��
+RW��tm#2X�~R�-;��`��;IzȽ��KR�9��C&�L��E�4�1�F��e#�9;]0����P) 
P�3K���֧�W�
����ֶ!�a�4Y�1R��~1ఈĒF�ݺ���wTehO��g�z}Ʈ������ZAiOV̢K�٣��
?lr0�̙���Q���I�
*��i�w:#��� l����uC�
+Cq��3�[���TI�X�
�l�ӻ��z�*[�C6�L����
���ev�n����.�vb
Qh�2<,������G�i�<
+*�Ͼ
+�a?(��pӃ���r�Q�7{]�'�F��r

F��
6�O#�7&�-k�x%��	�
�۪?B��e8��h��Z�`��b5���0�������}�?��(��y�߁�r����]h�2D!S	xh�8#����:6
�@�(LU�M^�N������� ��u�	:��G�~� ��P��~��dԯ{d�P��n%�G|�[��W݁���f��zq%�!w�rY��U��&�w��l�>��(��4rD�brX���
7GTո��˷=!�:�B���c�G��	Ś,�^��Wj$�Ll�hm{��u��`�S�
��F���p�
M����\^絹�ּ�s���GH�9��6IJh`H_�d����*�J�
�}<��]o��G��9�
F�^f4�t
0�w�%�v��+|!�ە�#�����]@C����
kS�ּv�M&�3���4ఇև�_�Y�λ�@�R��N�koT|>�&{Ov�����5ߙׯ��Y�6׾�����n�{�%�ߪ'�����r���
��g�ͭ
�t
%�A�ǞA�Hŏ�FÊ߽���_
ՙ�(U�]uV�%�૊��5�j��/�N�����]�:T,�:dC���5�"��>
fI]_��ӄ-�+�M8z�oE����ע?������K�k~J��Â�� �f�p �bUP:�������MśǢ
e*a/p��c�=Kgt�����@��Zyk����:�݃5���l��9]�'��_NfÍOt
>
�N��:�����
~ �&3O���@W���f
���
+b�?���q��f����O��X]��JB�B
�ȶ�ik�qo���=�Nٵq�,Y�T(�\��Ӿi���i�{`p��� .�Ѿ۟?�g�-< ����+l ���(��A�΋{�!�G��@��� S���-'�.^I���$�6�WwV.��O�
+4,h�e:šk��}�1�#��
F��C�c�D���
+X51 
��?5��:��+V˃cda5I�D{Q
+'���<}^���^�=,3[k
堣�?�Ή=�hܱ
oX�
.(���n'�?����������X8���dG�u�� (�|��G ���G�
�%��{~�<̲NFF����,W��`cg���r�D�h����,�C�X
Kgc��FE�DF��
�+�|�I�;=��ȑ
m� O?�_�)�h؇�Q�qE�5C(�b�1�K�prp������"X'�^d���?gAʗ�m���f>�'=j��(��wVT��L��f���6Փ�Z/��w�w�_��jڱ�X�֯/$&Z>�ܬ�/���|s'\�V���s
������ �L)<��2�B�~�e�����Nm�Q�|��,J�A�ț�_�B~��
 �
% ��?��
,�

Ew[��r
� ��^���W�%�']У���<�V�1�M����%��٨�5���D߳	ѡ���
�.�i800�iS�m�J#;�ei��� ���OF1�Ҡ�/È��V�

��I���g�=�����U�K��^Z�:i��B�ܼٙ�B��a�{J�?���m�c�H+��Y4��g���� Kˎ�~$��7x�?ŷ((WW�Y��g0�o��I���I�d4��D9��U���
;�[��
+�R39�|2.��a��?P*�������ˁ6�\i�V��Vz�U"7�*%��
�����
���ԟ��*����
+��PT-O�^~��&��hF�<g��N�F;�ꜷ���1���d,�F�Yk�e}�K�ڴ�
+�F�f�'�K�㰕����������)+�5Y�j�6��|rF4�L��.�A�����	�td�/��
�6��n_O�6=����FXS�Cw?��f)����Y"�Q
���ʘ�F�0b��ג�֢"A�
�^��(�k�xF���|8X�} +���
��F]��
Q����Ԙ>�UUr�jl�Sď������g��s��I
�r�e���8�ι�*�����7̮!
+���
������3(Z��|�����
`��0W���D'
S���*q����:���ڨ�RC_�E{�\����V���1�-���_D�i�ד���bO�k�'�B����"� *�\XsP���w鯠��5�z���=�������z5
��rI[K�G!��e��a��OZUX
�#2��bMT���b�d �� �u�kJ*NJ
+w{j��oe��B윤���(���B�
b]�
,f6���!ݐd<�]4��\�
�7|R�˻��Hx}y��z����6b����n����R�ْc�
I:0�u�eɺ��Z}����d�;�����P�ؙ?E�6�lʟ��CP!���A^�[��EБMz�U�fc|�:�bs����#�]5gRN:�]ן�
?o=g1E��W]����if=�ÜF�-���F��MHc��S���
`����

T�ey۪�rQ��q��
(
�|�������H�[R�p�K�L�8I/82=g��{���[O����\�9=�
}6���<�l����1�
+P
�r���P� ��[T�ϖ�G�]�Z
��p���9�;������Ϸ1&�(-ځ�.�i	��~�虩1�T��|:�3�8rSO��'������fL�9�O�h��������u��;����g�zT�R�j����O�ZБX
����
+��W�O�6�/�|9���}u���]v�R{sk�������i�a�����O�iI�ţ2�-��X������m~
+X�"�������2
n[���KO0bK�Q[n�'�������5ކ �h�кҋ۹�����|��*��rO��Ҥc�?�
9���1�Ҹ�V���~�h�}j�~!߇ �����F`��/�g� �K}�kV�
Bh8hnW�/� ��(rǍ"t��n�<�`O�
��W��`ƽF�i}ғV]����8&��hG5j��Rm�������yY_� _��`-S�}VXk���`m�6Z
��u��M%#
&��Ze�n�^r1�a�"s�cĝ��+ҖK����E�ă��y
��2�
N=��<�4�j~k�(T���^W�� ���t��[r��l�^�5E����/qTk&
׿����2�0��4̱������v��<�2�5��9w0�F�*݈*��{�/^d8BR��dCk���ѫ�
����wX�^�l��Ft$U�m���mh�}��Q���Z��` ���ch�ϱ��L���M��`�8���We�B	Z_P&�7�	�����w��n�Bt@�������A���#
=#"���9
����F�U6��dї
�k�>k��\@�ʴsC;tJZ�C;e�vI�)~X�W�`D�QuB<�C(/n����%Nr-8�Ǔb��OĮ7 �c��'��C�?�3
�w��+��„$�4� +1?���؟�sd��mr���	��_G��n��jq>M�6Q�x�L�
+N�F�0��{��w�Ѩߥ5��$1����Sb���Im�
m���˅_pxM�vI�s9S�U�`q�4��y
t��%Aө��
�$O	�͚��چ Ro
�����ҝ`¹��Kg^��4�������
�TK��l��^��N�4EJo5nG��Sl��p���
-�&+-��e0�O�v�9�d���,yS�2��z�i��5�İ3��&�xb��]ZBO���V�4ž�k�ұ!������R�NQ�(
o���k;���)@�lP��(
+�	��8] �"7�����[��<*��}k�
������°n8�������%_�O�Y�5���#t	�7��_^T�<m�=?IX��[�ͻ�A�
5�/|!�\�
?����_��@���[�h~!�עt�E^K��:���$pA1Y(��t\�����n�����%��^�k�����Lu/�h�7�Yk滷
+�c�{�
+$�/\��_w^u�6�*�� Ļ�`���]A�_���U蘅���9�����Б�@�rc at 1�Ow�yܗP4V�d9�I���<y)��aP
+��ϥP�
0�È��U<���>��i{^���a\�sì\
�9�Y�� 0-�u
��Y? (nP��{P3��W�>(��*(U�
(���ӵf�޸j���+V��w.�I�{���f���iΫ��p^9���f����]��#�s����گp�oZ�u>������ CY�|\���ٱ0��
(euPZtxPR���\ݾ�MⒻ�v��!�M�2�dz�'~e�b�:v��b]��c�v;tOs
��с�:�����fZO�r
��sh�Ls�9pǿ�������%��@�BPEMP���Oz����{S��;O�Cc��/E���0�)�;���re���'߆��u���O�;
�p�7}�v�
���t��f;K�/�aG%�� ���a:J
�s�}f��&@��°���M��]w�v%4..���Bf��C�w���r�gr�m����:�}q�T���l|;֎oo߹M��������隹�j? 
�ȇ��(
�(U�1@ӵ�'k�t^:�V�����q%��g���^�x�r��ҹ
���$��Ʀ��n
����|�D��zڥ��<SΎ"��6[��
�5���Ym��sP*��BQ���hv���@w�@�	P��R��ĉ����
w.�(
,܇��
M_�6%�?�h2�����$��1ЛW�y��ۃ��Zo�*:O�6�U�� jN`<�z��o�����'7
,(�G���~��LL&.XxB�Vpv����
��"$�t�������ݘ�B����s
t�"��HWN�S�
7���S���&K����6ٗ Pjs0��n	�x�܌�"���'�C {P��n��"@b�R��1>m]P͂}/�f���$'y�7�x��O���9���{N��#G�Ut�:*��z+K$�Y�ݚ��u������|@i ^�=�V -��O����gl��w�
0�c�.!7<%b�����X��e�g���YtR�]�r;do�1n�
�pķY���|=�۵��o��V$�>��d͖D=:�?���{
+�Ss��`(�ϛ ���賭�����d�ܞx�r���6�a��H�}�1њ���1*6e}�K��\bl(�?��q~+i~����-���,��\�VʭVco��B��(1*l2�I�yM��O����g��"��`{��
�d��|
��l�ܹpAw�ɫ
%Y�Yd��[���t�U��c!��5���Xq����h��
)ii����,W �?Ƨ��vP4�0��:���'(��
+��"�/P)����x��
��M?&ā3.�c��i}�b#�[/Fk���7qb!��U����Ax ��5�R��	�"�����Ks^�U���� ec�I�5������AeU9�^�����љ
��� N~�O
�ݘ�ΔLțVL��
���'m�uMM�dU�ͧ�Z��i�3Gau
������7���������)dƳI+�\��?����mT��q�N�9��y�O��ٶf۲�0:ݠ��.?o��e�%�}�ͯ�l�M�ejf�%� �5�`�+Vu�%׭KKN�h'ח
w�� J��yV�E�����r���aq3��
+�{�y�^��^����LK�S}_.�G�zE
��
���pY�j,5U��=���r� ]�gS�����1��1�݃\�	�dY�=�	@�\��U:�7�>D �
YPY*�G{�\'����z�t/U�b�����na�Q������k�%�eإ��-+�dŽ�&#�j�t�ˉ�򽸜�"?;�ʋ��]e��Z���Ɏ��
��|��&�nUX��Ϯ���s��j�Pot.�tyx�`��j
���㝻߾7�C.)n"�+�\�
a&�.?��Gl�xWۣ~57
�W�f�8W�<˭����O�ʋ��I��x� ����eP��I
U�
�3
f
�^A�,S��k��)
+���;,^��{V�E��G�����f^u���
+Z~�G��(5.�����
��Q"�
�+G��
=����V��Y�g? ,�������-?��O�8�
�s�p\���'qE4G����؅����E���l�O�l���2e���!��l�
Q�rn8��*�I��
+)��J�Q��ȃ�4�)��w�;�_��]���U�~�f�ٵ~g�������I�n�a,i���b��`��w]nx0�4�T��5�ִ�b]��F��n�o�1��+���T�����^�u��Oo�������S�}��`(��e��
��=X����9��I�$.��!7�ܶ͊QU��M������\6�9�W6����h��9�����5����*���~�K���)W"�q�����(�F
+q
�e��9� P0�|\㠢2Cw�A��,&irvqW2�Yk����b�.�L��
����
��X/̈́Q��^썪R����Ƅկ�Z��ИX��	�C�y|�g�W�G������
��(�	�ُ�;̓�y-���ld�Z�|I2}ǜU4���]�(���֙���x�N��
O�C+K���*�
߯{s�
![���j���[81�xx�H�z�p��3R��z�݃V! P>Gɳ�#'�I�>�p��>�
*���
�-߿
|v���y��J��T���
���Ż
���o}�����&��I1x�#���ԕ�F���ׄ��u���)�_Hg*8�N�p�� ~
u��2"$}�QVj���kx{�����X
:>ǜi\�5/�CS	��--�Bإ���[���}�8�㪽Q�jtM��u���̋�q�
�6�$�mL��VP����V������/��ӢVX�4��n�+~*�ä����"�v�
f��i'.�ƣ�t>8�>ߏ���0
���aj��&+��<h�)]'�6�
=��6�`�$h��bS��z�vT:
y|�7�����g�@?F<��و����P�/�G�7�2��sL���shO�4U��<�yq�՛��s�t��o�Ei����iK�1L3�N�f+5��h��?O䮮N�F�펝ڎ]\j�ܫa��B���� �[�k����,��e������)*�h��pT��D��
Ne���ɤ�N)<��@�`
kF�l���D�����:i�jo��֨r�RK��fuTú�Lԡ*�Vs\���
f+�
++��
���=����ߊ[��{6�s~��c�ry�IA8
���� Od������g���6�ܫܾt[j�j|u��X{׻��_�zgtU8
�\�:��@�_G�w�G��<�i�|��q�˺i�R{b�
�ׄ���V��_� ڶ@��ʃ�b
+E��	�
+�D2�ȫ�
�O&������o���*�*}!qܘ����Ӿޟ
��+��%:��%&���*"
Z���������,�*A�8�Zְ����{��RU(p aD=� ��b
+
+H��ɂ�6��!!@���i�����Ľ���Xaq���W�u�W!EF��E$��F��
u<GI�^�w��߸��Gޢ��
�/���h�����(�P�<v@�^,��Q��€�W
�~>��Dh+�O[�̯&oQ�-��%�]7�Z3z	�^�M�Q
ơ����-?+̔0
h�c�
|�8�Gݱ���hZ��֜���|����A����t�ޏ
(8��
8�,����2�����{�7ҷ��(Ɲ�z�;X�
���'�Qs���r
U�2�6������B�����|;�T�Sn����L=.�M�� ��@�D�$���ꡠ�z,(L�	
+���E+��b?�>�@�݅G;
�n.zU�z�}��~w��Q
_�!7�����΂LG�c0��/_�y�����/-Ӫ���u��-���l�P��uTjR�2(H�(
+�OzY�@����R��}r�!�?��� ��TX����T/̴vԅ�	���MA�k�|��,E�[���&-�5-�7�<���㳽�q��v�d}��/��_ 
++VӾ~���k]���#P�oUP��sP:�;PZl.O,U{��"�Jq�����f�
}�����Uw�2��e-���b��-�Bh��Ŵ��:��y}��
+����J����fpM�=@a������S�"��"�I�f��-Vh���@�nO��&�ͺ��{�
��U;��o2��C�?7[��U�+�/��s���n[�Ƨ���
��	�/��B���H
1Ku�n,�ұ�� ,� ��x�`+UPTe������Qq3����c��rc�}��\��$�V'�����s��j�#�W��ލ'��d�9�����M�mf��U{�[m��c��Q����˅o�B�
aX=(�5P|�@K�������v#���עP���_S�|��5�yx�/V�����3��v�����f�>����z�ѩ�n�Ho�I~�ޜ�ɕ",��,�Yn}���l֦�(�t�i]}Px�>;��:�5 at g��g� �x8��g�����������e�:��B�{5V(��Y�z�1:MHlf�k��X[؇ݎL몽k�J ��,���
Y��+"5��9��`�{�)� �^�>y���{@�
�ܼ��
�P3X:�u/�=�8�5��Ԟf�J�-��vT�h>�4�³shy	B'�
�=HcQE[�"_�j�d0^�jOVJ�F
�w��q,Ы�B�_�/@1w2`0�P�]��r֠�ze~��x�H��\?VNψ�}Ëh�tt��{�ZΚ��QMt����v�yտw���e�9]���J"��B
�v��x�\n4]�,j��κc�(V=�F�8I�`�
n��[�������� �W�n������u�0,�n/�m�[1a�5$�'
��]2��U;�zS�j�
���X�pK+G���2�Ra"0�ϛ\�P��2�
� ���x��6@�����`H\�,
%
Q��n	YGŬq
�O>_ܴy��@}�xw��{潩�ۄ�6�̊�:E+���08�!��"4��"TO4�!8#��7��/�sP�]�h
�
*0���'}7
6L�@%)��J����Ճ���x�᭧m9����eg^W��nk�*?V#���d5���0f��,�LX��͌�#A
�Cn-i��
�8��@��GFu �r7�}1.����"��֍d����"�@��T�l�����U8k��d����,s�zgI���g�~q�tW�lrO���<7bRQu��ߍ���`�y�d� E>a�"ݽ��u�}��>�#x���J>����b+���cO���	w��k}؃�OǓra��]
]���
�+V.�٢w��2��8v��*���;���Ӎ����f��՟��
	Q�g|!�P�dmhK at QW��|n0�䂊ƽn�z9
��E��Ƅ3}�8��XJ�,��T13د�
��\�I��Č5/l�����ב�p�2�&Xs���qۏ��z?�T��n��.9��||�d_���Fjs��l]x��נ���i_	�X,�
C_���n�X�N�mG����]P�ZI�
��Y�h�'Yԙ|68LV��=zqd402�$5��M�8L���՝
��v8 [...]
+�y7V��i`j�K�l�Rd�-���b�͔j��������}}���-1�|���<+��
J��'�8# ve�����>
C�N�J�L����Z;�
�aKyoQR*)��Б�9KO%nVK���˼i�ܮe��Y"$�
B��A�

n�5!�Y#��~�~�}���il�A���(�'
(I7 �w�U�="��R�5��9
��U�k�u)�P!Z�v�-t�%�5��hV'�3:Qr�	�ך�ɨ��ĭRy��"�����qΔ���%����M�
�A�^�����?����T`N�w~I^ly��� m���U]����� ��K\8���u����2�i�@��ex��s�ۜ�~�8Y�REǟ uq�A<z;v�륂{����ֽ�v��n\X��@��7fI�
�t�?�eytN{�`�ZXcv:��u�J�Սn-eZiZ��0��ۛ�em
�΢
����N
��A
�qm�_�)�NX��"$<��ޠH���p
!ݬ��;'mt�ɀ펚y��O
�
��@�w䋨��)P�����ܼ�ag=&�j:��
��7�}<gb���Tb��3�H�Y��
�-BMp|
+���0�u
��9�P:���h�絙�
��u���;f��p�e��:�7�����u_�vAV�mc�m9��+�7�Jg��-eT,�O��fwS��3��nK�GծqD�������x�"
+�̹U��/�V�W�m�ӝ��Z5g�iF�j6E$�4�f%�l�f�q#����
&�� �O~�-f#%��MD�z���9��̺�'j'1���t�[��|tV��<u:�]�匎-���Y".m�A=Z�w/��A�q;2�F7'u?�--g\W�E�@[J����y�=�J"���SԕwW8v��*$ߏ�6kS�h&bѓ�s��8D��~$�yB�e��mvM�w�5�jcwf�G&T����0X7�ف��$(s�Q��?��z��fb�Z1�$1����˅ol�Ӯ)����2�j-�n�2^��!RB
S��&���=u'��>�NQK�J��H���<�?y���Lh�V=�X���j�'	:�l�3��=V,��+���
�\I=�r%�D���N;��eYƸ�|_�䓙M�4k8��
Nv��v�@�;�y���z��ٴ�E:\��c��f��rS+�2�+�80�y�l�Ϫ�9"���
=�:rM�"3
?K�U(`ś�j��1�
 7�,A.�WA��M�
<�����{*����q���.�z�Ϸcg�z�x��%�w���K�̮Q|��v�I{��3?&q�~X���Qj%�;�K��=ѓ
Ô�Ѓ���~����p(Z�gYiE�T�� ���K
r"R 9��C[���:��cC��d��7t�f�)>��\�
yؽb�1
�$3}�f�pgW�V�:�U�,Oa��:�&���[�=@N
�@�>�Y�-�]g`o
�V�1Ƚ
���;�E��
�V��i�Nj
�<��,^N='�d�a^�Ǽ�l<J!�}����~��;{[���r1��^�·^6a�����q�{������(�oA�Y��MX�a�_yp�@
�bЕ!��5���
rH: Y��|N"y8�8��sq�f��y�$�\37�c�6w
F�[[͊�����z��A^w[<�����w�B�:9������uc�
9+�|o<y#a ����L�B[
V��k��8�\;{y�6Y�pf1�@e�x��n�^!��-p
��	�pr��e
-��U0u�-
Վ�
o�v�;ʧ쾼�=@.`����u�`� wږ@��|�B�k��@O³k�����W �(�жu}�����
����G�m߸	�{���8
+�y,N^��m߳�<��)D�N�v�
1Olre����� �'E�-���,*a���mA�lP��Ӡ�Vڠ��� ���A~�:=-�{��%�~���.�M�V�gM؏b��%У뽰᯲
j1�yAa6t���{�җ��,"�x��:�}��1�ط�
@>��`�;X��\:xP��.(N��
�Eq
+kam'��]���{$�ճU�5�l5��~��)��әE�=�u,�ؼd�+�m#�i��@3��F:,�
�?H��m���� ��
j�\&}PH���X�B�S��m򥬐E`�����Y���9'&�=���-�d���a���:�\��Hkc\��q5�l�r^;�B���(��z�����&��~��~!�J����퟾+g1 �������.|΃�����qm������BM��&�mu��q�8�_{f	�H�6��S�b�ࣷ��{���׆ʾ}Q�]2H3��;N��b<ް�
�{|f�XV:챇��
A!:6@)c�@鼾 -� ښ�?{d�t�

�-���v�wo�#��3�p��K>�m������@�]I\�l�:Y_����и�v�;�jݧ�
k�
+ﺔ�z����O�n� ����I�AM�-�釟=J��c�m��`��5�n��4�����8
EO��i繰�v*��'�y���;e���7ˉ��Ԏ��\-O!��f��r�ߗ�z�����_�2��/ϳE�l�e\C���F��y�xVQ��)\F�RJ

���p��n:

����"6���y
�D��\*E}c���~�j��6�Oe�����&%�)������ǟ���#� 
+%'�g�
�9��C��g[�<(�9�����8)\8�*���;�X>�N�?ٟ�
��>{ߎ�UB�gxq�eg=9گ����ֱ��@o�H)grux��U��u���� �ݗ�<5g�J��\mP���g���#����K
2�us(ʟ{om�J5����&���xeO���x}ow��j����ձ�R�SB,
�nOpF���dѶ��
+�o|!���?E��v���B����2.�!/侾o����/��a��V}n�o.�w�нn6�
�`Le��A���I�:
��崱�	�(K�J��½�/��._���|�po-.Υ�{��-	5�Ϸ���(��.(ג*(���
0$q#��\4���ŏ�
+���y}c��&��^Uop_˷K�J}'uXZ�����h�n�k?�
n]����A�rkD�p�CiAhMN���
+�
|�Gx�w� -F=X+���u�!��=N�z�<���=D�eO�1i\

�O-�s�=�
E��4�
ť�T����sN������~�I��m�?o����k1/{�d^;������
���7��SV���6@��< :��^6d�I�u-ƏN��-��M�݇	�x�F���B۠7bq4[�{evU�2p$�7*Y��j�6ϒ�9��F4����m��Y��h��j�1όs��pQ����j���S�F�����Oki��
+Cz�3�/�XWzF�Urg�;D^�<��k��F��S/�>%Bb$�]�G��n}1�)��da��q���葏�cIX�hṂ�p�}}�&��Ԟ>j���Q�=@�YU��������O���;N��5�ׁ�!w��'A/������[v9h*�j�'��S_X�!Gp��|R[0!i,�
	׆�?� ��=��|s�.�u�nnk�`�+�
+f�
+�Y��� �[PX)'Pڧޠ�l�O���%K���7s�����7�,��QNme��z��M�o-z�����S�R�˱G!��s��y|CM��՟��Tn�{�Y���I�m
_m�6R$�:n]W��
[P�]l�6�$���Ɵu�7��,ۃ�%�ƺ�`<��������AR֩}a�F߭4�I��S>(��5
�D�R��J&���"B��"V��\��^�ޭakI��Uc0�ͪ�$=,�
�`-tP4*�g�(j�:^Ϲޜ��x[B��1�����2�Ӣ�)۽��BDwE#�/��1�*�*�]���Jgx,-)j��pE��i8x׶�=0���[y<$�ǰK.�F����Z�F����
��
^�
�1 e���rϵg]
�a���H��u
턴z{7e����D��D�SZ��,������8aC��6)V�S�j�Ϳ���6�7��z)b�饦�E��潧�
�5���q5n���{�bV;�L]��q�����f�mu
��#��*�!�ۀ���H\]ʁ���Nn�۬n�o:1k&���.OUv�*)�
+p��%&=�
+�n֬���U|�����L��
bꬫO��/�G�t������3�
����і��}�����r�$g�.�Qj�8jK>�%u�hϳF��~!t��݇�J�EU&Bvғ����=T�Ό��mvZ�$�[5��j��ny���^��COv��ѩ��_���y��M��NXC�0��E���s�a�����e�(�C�(`����=LJA���������nu�SV=�5�B�S��+߻m~V��i�����0�F�P{7���X���Y�+�ƿ��Nʌ)��H�t_m����x��?|�麢��{�"�^���GPlP�E�FQL���֚{ϳ�ScՏ�,˧���"��T��O��/�����Ԡ�L��)�\��=6t��ޤ�Xq��gw[
+"m؜;m;�q����d�*�K�y�L��`ȱ
�,��	���E�-�Kc���q��st��xi���}����R�	��MDX��j�7����^���9���z�u�>���2�u�X�}�������N���
+���e�(/�]�K���w�����-��,����5��( ��M�o��=xU̲�).���0�y����g�JɓW�-
��+������69�:�۸v��
+��e~VK`�.?�šr�(�C&[B�<[�o��'����ek�g���?�O4
e�}=���V��T*��7�� r
��1�ӷ���
}������.�������D��
�
Ν�b-G���XM�<6�J��,�&�Upf�]�����=�����?IP<�1���ҏ3_���̼|g�y�*cN[����W��
+MM�+�2倐��T꺒SlU�s���H�s�]�,^T�a
� �rɲg���������j�����e�Y��z�>�8MF4�Lfs<3�O��P���%wzx#E>�!�u��X��7 ��~�����`��`����D �Wx@�-����Z�J��� N'2�
�
`a
������6��&���"	���ڃw�(q
+�3��s�~���:��
�r�"j���_�G(���
+p�XA����hԀ��WD�{Z#Q��v��j��[�����m�P���nB�6|l�� ���5�zA�j���g���+6�x�?�n�a���7��w����7 ��A�W{
+���9����Zo
F������
+Pk���
B�5
j�� �,�k���%���s�/B���$^���I��l
*�ڷ�>\E/���
�L~ �&4�s�ݓ�
;��
�m�$}j�R���<@\�TQ�� ����	�5�͢����`ϯ)�ej�T�ְ
���x��x�=sQa{ק
+B���w
-�R:��C)
~ ug �9& r�3T�� ҂��<
M@��W(����H<�%@Lr
��	� Z ��.��T�|<�#�v�)�hJ��H�a>�%��+�q�������J��m�ʩ]����[���
6�
:qW�X�@�W
���(a��%҅v"�9jD@,������W�5| \��o��kY�W'��a���7�%
Z�ŷ���|���0o�
%39����#�i��~�ޯ ��B�� �|~�+TɌ��'oK�g2�t(��Jj‼5ˀT�=@�K�t��=��s����^��;����?/f
�~x�>���Wx���
ŭ0:(���
{\wǞ��� �
a3}@�t� gX���o��Y�w 34
 ��g ��|w���%��a�EC���H�%��L�NH6�˭�2
�x�o�i��i�*�p�yl��d�vѼu6B~
+=�i��/~��� ��@�u�-P��L���{vhv�2@&��`��*@�bSz��6���
�G��=춄�U�����+���u��k�<P�.h�
���';8ț�nt�t&�X�g~M
+�گ ��5ĆZ ���*
�;R3���ө
+�r!�@��(Yk'W�<Y����^�W����t[A��GHx�t�1ό�
���´����v`�R���&����`�zl���ǭFH���o�W ��@�g
+�n� �
c@��߬�e
+���� �_�����~��{3�(�.��C�r����8\"�읓���5�:ur/��c+U�_�f��1P�m&�1O�Ys�{�ܲ�GU���Kz|�����o��B�o
<���{ �akP�w�<r�q^��&�Y��B펴z��4����qy��y����~���
`t��vW�De��Gj��E���P\yV��,�}^�����J����O�*�
+ at 6� S���7� &/�9��j �a��$˥KnJ���9Ci���|����
h���
S��~:k[#�47uus����e}��y2����#3�-L�T����Wd~)̻3;'�+ )����fi��BG�]9�y}�D�ӍF:�[k��I�K��2
��� 
|������i��#K���ζ�U���[�ꏺK,^�
+��ޗ�\d���1����+������_����vY��گC�� hIy&�o:t���b�z�:�3���eU���Q}�A�w�>��[��\�m���4CC�<��k&��m�O�����9�qy����TYW
���ԱG0j�C0�̯�2KО��d���8
�
�� rŷ��%�*���|׉����+���q�M;~v��-��Eڕ������8j�I=��7?�N�M��~�NR�h��d�;�&��B���]=�ql|����w ��=�����
�B�s
+]�Nj���3��AX|�.��>81[	��S�l���,?
+���u3��Z��7gt���I�Q�q�h����7�^b�����#�ڣ ��>�+���Rag_A���0
��u��/�Sc�ܝD����Z˴΄�<;�)��~�Q�:�mba
F�yA5�<c�0�Մ����a:��zQ�Wt
H}�

foZ�Ɍ҉HJْ9r�j�"�+���P���f�N��#
�	#!��<�.�(	z���
^�������~�u�
���̠�@�ĭ�
�[af9�/L��:j
��"��b_a�<�I[)0+)y�2}��e�'/&d
�I?�@J��_Ƞ�JOLؖ3p���4�-���e�Ѱn
>'h�3��L��7����|����}����bW���7�nR-?����$�5�:EZ{}�ħ��E��=�gM��n�)���������^p@�qI��Kz`Т>ٙ��3
�m�� ����=�Ǡ����rii�D�1˃$4R��s~N�ߪ�3���n��D��{-��W/B�=��;[����:��C��ӥ�k�K�F2 z����**���� >��'k�t��;b�&���p�v�b��vj��`�����ӵz?n�w8w�Su
Mgf�1n2]����C�D��i>�m�Z��^K�/�����2m)��t:Z��\�IB��T��
�^��8�ȼ���܃[�ִ��{��i<�ݝ��;��ֵ"*+^�-Ψ~���������
+��y����-c
�v���*����m�F�y��Ga�nY�f� [...]
endstream
endobj
315 0 obj
<</Length 65536>>stream
+�� �F
���
��a�.�J~��S7Ӊ��
4���D;�7������=1Q��g=Y���P����tD���^|tw��j�jU�ҨX�X�vsM0����v���_��[:Ә$�9�$��Eu�W�L��=T�?����B�9�*:۵�@��+��*M�Z�@�0�O�9W���֋�bD�C���A��KwR�����Џ�F-{`�]!��
���n<���|����Zf�s��c��k�9�?ؿ�2Qgyo/��v��
v<�o�xZ�.
rb.��z����BQ0z��sab/���$Ծ���ݝ[]C���q�����W�5����y��w8G�/�
f5�tj57�v8"Iq�n�.�P��"��
+@?��K��c
v�l���-+O��+����L��VD��t9��	� �0G��~���:�x�9o�F+<�6�gh���>�,3LqG���?{��`X�J�2Oi�V)����x��T/�)�h)[����ү�k�w
j�]C�8+��Ֆ���/�R�=�Ŧ����ט|�h�T��$����x8��N��Z��6��@v�ݖ�
�嘅v��E��e7��Q�7ؗ�P�F�s.}�<[�YU,�
�Ua�<_a�[�_�g�?8c��ؽV������e�}/jY�_TWz�6vꖫ���t��u���Kw����7��&�M��"��İ�>g�|�u]�
�x`����
��*�f�|�7��̋V�z�H޵�RO�jqW�*��P����%�K�:c��
}��E��px�H�JPXJ��d�u�i�=-�Ǧ!pН��b�N��:h5X�dEk��v]��62[���m�E�f�
+��[�O�͍��3��g�Ҥ�e3򉹝o��
;�&��rߡ�Ɩ�4�
��u��ͪ �2>굃I 69А�m
(��]N~��e�YTK�\��xÚ��)���+��AP�+�G^�[�ܸ)��iW)2�l4icx�|��ΘS��4�y<Ө�z��ћ�~���粈k
����%HT���msӹ(�b�E(vH����q
�

�¾�.W�F�(�v��
b�yr.��,����
+U����ne��ݡ�ȝ���8�g	g}�r��@�K���Wh'y��4ƫ�@mP�
�(�֭���F����2�K��b��6��>G;)�y�]���T�|�YY�L�PI�����9je){Z)RȽR!�'Ϊ�%��4���|�gQ�����`X��=!|+d�� Xxm�y� �� }dt�U�;���
`�Q�� �� �}OZ��@*}Ԭ�:U[ �}�6�)@��
+�(�	 �����u Pȳ
+o�*
+@��(����1��{���`$�����n�c��
+���=�>�7�)�����K�v{�jc 0<OC��*�:oC�'xg9��_� �
����7w�V:@�c��lj�_���x�N��GJ�˙��I��+ B(�B��}�P�;p .M�E\}U .� Ϩ&���`z�0�k�P�����X�@g�by���	@[�
h at qUb�T�,�g�W�rc��`7AMK!&�ڿ����=ehJ
+��K�?��! 1U��Sk
p6�3i���XW���y��+�u
�L�
{��� j�i��7�m(B�@���d��".��I�0%8���u��5��b ��j�*��
+�I���zp}���
�l���M>Az��v
kcƓ
��[��
@�
�2�� =��ڷ#��;#9�
3�W-���f���D�mwu���JA��8)N~}|���
 ����~1@"i���p8�>
>ۖN���_Ұ"��
+`��J��W(|��d�
*Ӄ��/2kZq�ݍ�E�g>C��Y�����A�9N���
+��x�w���6�'
�:]��a��m�����D�1 
�D!��DJ ���z�
7 G�pD��1��9��{
�d������8��Q��Z��v
m
#�~�w���k
����� _� _�߻���g�s}
5���w�{��.UOA+�� �
�gMx
�� q/�,a���9N��G�a��$cI<ߔ�{�
�����?X���5���'���
\�k�V��<�N�^��� �������^&sP|�2h� 2�gd:�77��)>�V���d���o�*��9jNj�܍5�����3�!^�"�yN��}ߵ/Ӝ9>!qO�_�jk[�/��δ������i��?��6I^�u�V�))
F��P�}
2�wO�: tƶA�
�IA��
Z�������N-��r'8z
a�a�<���Kӻ3���$�W��/7E��Gq���
�t�q�B�O�<Z��j8�A�a�e~���y
ς&YN�'��N=]�e����&Ń��Iķ����ֈ�	�µ$
k�d}h��WK<u:��HD��dv�}Ȯo޾�����م���f�ʭIrͮrb.gD�O���j��+ ��=@d�! ���R8���&߬m�{��0	؏��
��[o}
�$��|!u�7�"q+{�\�=x���/��6�-�����7��ةwZXv�7�V�]�(��Af��WH��2��b^��`�����8Ph�.@�2;�� �q�gO���H��
-V��
�zk��gK��'��y��)�g+)f��{��	!�4gu�UkMz��I�m��l�eё0=���E����V�Eλc���I�q�W at S�P�{�x��]m��o\@�
(tk������G�D�r���hy�L����zP��cW�ޛf��[�u`Lw])��3nY���2\�v;S���DC*�af1%f�LƦ��G��Φ�
�|~ �cX���?ˬ3Qx
vy�,
����Ӿ�Y)���eY��%��)н�[��M:�>�'��Y]��dW�{��}�����
Χ��\�L�긛�&� ��tOA<S����F��p@���Č��ږ��
?�׵�`���"8{�����]��
sUt��:�æ�B.k7GD+U�=

[}�==X
��ٙ|��š�-��wr�k�
:�j���Y]�F���
a�G�u
+~�?2���?�.��go��M%����w�L)ʳ��Yn��`�
��f�m�-ے_�i�6��$�E��<��LM�g����Sa\+��!�ty�,��0�.����������6��{؈�/���}Ȑ �p��d��D�S��e��E6���2g���N�*��j�Qa9�i^��~Y�L�
���s�������p at G+��
�:S��x���F���S��
���5荞��~�J{#��/�`�������]$h�6
��뗊����A�}I���Iy��j;��"fn��
�b���7geg~T8wZ����Z����Nx�`
+�x��k�`6�RQ�Ұ�����-����W��
����@�;P]}
+��~
��.|<oS荇y��]�Z���c�pf�if�����z��6ݩ��r^iR-�N}w&�{
�N�`pd��|�4Db�6#>
m��Ψk���hH�w���$?X�
�R)7yJjm�
+@�\(���^���v˞�� ׽6���q]�}n���F���V����l��h���z�{�v�~���$
+ٯ���bρ��R�ͺPi�ڠ��~��@7��%ݗ+<E�-��Լ�
?؟
 �/�nT�
����쑇����M�ű(恫�+���ݒ쪶+�u�b��U�����i��<6�|���4}��+�Z�X'�5��hrs4���7/~ZLj~���b�i/s��登�
+؇�
+l�5=6�h�) ��b8t��~����8݊��.#�z�tB����|$�mU/���-B�
+�k,䙸0{K��w�WX#G��he�U��|�~�ؽ���6�"
uW|7GL������l
���W��H�71|v�v\�
v
�(�v�\��P�[�
+���zV{g��@˖ڌ��kcd��ѫ2p
9��jo���.K��A�pj����Q�䴐L�� �x���g�y�H�U�^%����PL�H?~�w�LƷmt��ԵYw<i��T���|ü
�ҲYL�}��h��(���;2��2d�|��^c�
tE}=m+
�lN��Q�P0�78Z���)�(��q�����Oq�y.ç�'�_7�)��w^�Ε�����'z�;��T��Qc�
+>�vG��6����-������qN�(y!�d}�b{�z����ν��漶1�=�	Vo�]f��BT����\(�W��,Q
Z _�T�TM���SⰭ��Ed��~���gmy�ȯ��3�w�ui>),j*��-���j_l�Hf��D��2�˻��`�;�j4��]��J��=��f��ڙI�Z,f*akѨ̲�®�T�N���Mi3�y�븗���IVa�W����Xͮ��"��Iͦ�=i�N�Q�Д��Z�2Z
{�u-��j�n�Ѭ��\�ʀ����M����k^�8����]���KY���&�Y��
Y�d��k�RnpxT	\5�5�<�+�C��nvD�1Y�G��a�RRG�
�*�֨���
��;�ft��jO)��4�ݨ�ٕ���C�s�=]Wg�*
�J�w�<1
~���%$X;E����w2
+��yׂUZN�
+�������7l�]�1����*=�	��h������Z�y��ʭ^{Z|�
�v�����9�x���1;T�f����F���L1)�sy�{�)�]�Z�+B���t5��m�%�w��Ff�L5g8��W��T�7��z�%!#�c��J�IDq'����Ql\X������t�v�y�j饶�F��E�K��6,��eZ�bG�3/{�+��]���
�I��6�(�]����s3%�^Pծ�B
+ymK�n�
�
+��M�3U8%#q��x9��2��zi����5�
����8�T*9͚�,VB<�9�
�Wj�\.���,�+3U��<��F>jS�4������-�L�y•��g�\�8K�
�Clܿ9��[�3_�
���v�c���hl�A������U���2O�ϑ?q�
Uux��ߵ
s�am�^�i���.I�F�U�I�B
�UH�Y�%������(VP�6�H5��<�X�^q�M���L�D�
+��t�8� l���U~� �;��6�8h!$ JV9���}��/K�T�@��;@P#
��K���~��k �to����5�@�p��
)x����
��=���BBmg�'�� �m��}պ �.�L���`7 ��� ]@����x9�V �Jg��O(y?˾r �U�`�.��M@�%� 
�C(���ㄆX�
+s_�E'e�	�-���\��S%f����� ��5h�\Z�'¿�� C2
q
0�� Z����sF -�@n�
@l
@�	�!
�N���J�>K.�$��C=�%G�&����!��Wc �B-��a�Q`��{u���xk��
 �kP&W�2��
���w�>6����6���d�v[ ��n
PI
 J
> M!���\ �Q
�S ��u��CY��"��#��?X��z
�B�$W�p#2��Ǻ�� �4
�QjHo�P+;�{������Go����Sx`��
`��w%��`�8|P��\
�2
N��VI3
��\[�^� �T�g��lA��J��.t�Y�Y�����G�Wov9�����
M؁B�f`���' _�K���۟e��;�Wy� � ��`�:�8�~h}����E�	�}��+����~�u�y�o��U�x�v�4�֯^�(�ubI��.M
����
 +�8h�	��&d��	 j��]��X] s <���+�ȿM���
��M pZ�U�j/	?u�{$��?{zX�~����:�xv�f�5-�ބ�vv��E�л8Yz-�
�-���
��7�`�� �i��J���* �
�&rmQ�e�
@��c@<
㾟�q�`�q�C<���ߊWZ��]7��-	oڭN����(
^�@�nE��
����Ǯ�.�/E.��uw��`�i��aS��/��Ph��T��8#S at NO;@�f�
�@�[�*���7֏�
�2��|T��R�'��k1sg>�>���V���B��?�5ߺn����9�G��t��H����V�܆ψ�e/��Z
ho�y��o �z)���ǟ��d���H e��_�m2 �=���ŏ�I�}�%
zw�spʈ7(�K(�p��s�3/�+n��4N��G:�Yd�8�������}��3�j�-X�Od��`��`+� �I����9� v��a��v �}@s
P��	F��2�>�Ʌ/���
N�P�_
?.l=ݨ
0���SGk=�ě@������Ʀ�
kka�J{i[U�چW���ؤ���Ր(cF������x�R��Xj����
a�=��;��
ݝ
�afP�O^C��<j�2{�$��L�'�Q�Obn�q��i�{�`7�d
��2Jo�֖�S�`��H�f�U���9{5�B�,fbL_
�酠��Z�H--&�����dU�
[%� j�^��u>Z����^����dÁ[g���ynF3�xܬ&���f�ko^��h�������<uv��W2���:.�����,5_$E/��
+��oy̱��5��9���4�޿��
 '�P��@{����4	�?�h��׀�Drg���=Μ?�T�D�t�R%eWk*�MJ۬���7/�L�<������,����1���״��
k�m7�̱?Ϩ��F���L���}�>�Ŀ=¿������pMP��d�=�j�KT�}����=�J��eY��'�=�;�����/y�^��E
+���
,sɮ��n�v�E�C
1
���È��M0��v�j^m�'������K<���>��]4��� ��+ >О�
�9�'�I��~�{<��5:��_n
��ܙ��c�Qc�U�[���iǢ�e��jĵ��
��:i�0'��e�,w��H���(1��v%���b=�%
���m���hh���
��
^׿NB
��7���:_o�'3^b�v�\���u�x�?��0sr�n�%�ye��X�I��t5Z����4l�X����F�^��	� ��2�'���B(�3UU�Qz1�s�PA�(��
+ʧ�
+���R��v�,������2t2t]�鳱=�$�@?㘹q���
+�`�%�����R{`m�Q��5���3����%���l7|7���Q���̊H�&
X��P���bx������ח~?s�H���^����&�C�
�&���Wڸ����7)�ܭ��V��~�q�����=�Zͮ˲���ѫ;�6��Z���1��a˴���o
�
J��?��{���ze�z���"�[���$[\��?<�9���.����M؇*P詼�&��@{�v�wbZ����Ů��l�cSu����7

l�r���m��nF
������
��PZ���I�0��n>�f��|FZ�����ꙻ�\�xc[�zeWp{�O��7��>����%?×�rը
�����c��m��;�'����z
,
%L鈑c�L�ª�"��۹3�XEy@��H.R��[\�
F���d�����D�����&�֡-��k��N{�O����
�vWK��7 ��k�Lz���v� �|���oTaר��^V��
2_�j8��`��8M���	��Y$?6�jeؽ��K:r)7�8�v��kv������b�
�6Xï�B���f�{��6���8>��r�w������� ru���S�7�\q	}T:D�zu�\X�X���I|k���gj���V��
+�t�~���P�^�(��~M�g�����`��"�mؖ��b�Ʈ1��~]C��z���C�7£LF�h�3���?7�x��
�i"�d���W
��N~�]�e�m�YȚ���/�
��w�1-B��7����$㡔W�}�w����ur�u��J�Mӟ~s";�F����u�<8�R|�d��f&��`|J�ż�#�[��B|��z���@�]�/Q4{�L�ܾY�)�2��
�l���,��t��>3���v��/����6���#��؊�LG�m��KQ��1ӭ?ʔ*�|ͷ�
�]
>
��W9�9��(|s���~ȡA���A��}���/~��74�T��t+w���;KQfp���z�ƴ��§���
o�*;��yZ�5թ
�J0�{߮��Z|��f:�*�
�X��r] �LHm�Cn/K��q�rk����Q�Z=[�r�Q�0Q��X^�LJp��;}���+
�v�l[J��n1���/i��Q��h<���t�#�j$�ȋ��ʾp��Y�d@�%�	�f��
�:G�\c���:N
��4�~UJ��VJo�,k��Ȭ�;��吽���2�ٟ���n�T���*�
P^�5z�~��n�

9<�ϫϔ���j⾺kwέ�]�?�/����u�y��>���];��D��=+�[�=N�竸byy)��
Vj�2�R��
J���;��Zlo�K��j���s9���u�{�Ҙ-��W�ʍ��P>87Y'���|:�D���]���hB�[�},��q�
�
���N�ԟ���h��9S���f���J�Á/vo�A��tV�p��
+�#�ٴ��."��.������
�o��	�|̆�vԢ�������D_J�w��t�N�ܚ�H�l,�u�Ы�r�ܨ]��nu�E�J5u���|V��겄\G�"

�$�y��\!mׯ~����
0U�[ӏ��A�
l�4_��3�[u�+Vs0K�v����D��6����{
��
|��D�8w�!�` ��P�k?Ζ�A�cE��-�2������?�N�E�2S%�#�\s���Ȝ�P�c�"E>,��[	��MB�P)�J�]��7�`��ǿ��
+�ԍ�HBw�/��Xot���`_-=����]J����<���,����=Q��4O�ҙF�¨6�dH�����`0ܵϢ�T

N��N�^���$���~ѦY
�r���

e�r���r�:i
5��+�1��άW�D.r0�\f�M}�T�y���'�
)V�
!��W��v�6\��7|t*�1�
� ͗4ըv�PH5j�8��-�~��R
��!�� � ҮĂ�g��
7� { ɔG }� ��A��>A:ߣA�u@�H
 d
����t���s)�{��|�@ܲ ���7�hR��
+b�@\/�
Hm��NgB�.W�/lD����j���
X�� ��X
�,dڟ �],��� �/��Y(�� �Bua,A� M��zw�
R� 1h���Խg}��~tA*F�����D`�/&/l�&�A��
 Y��Д#(sA��\
�xO����\M����!A��@�a ���T�]`���1i��MV��R�1o����A��P
@�__]3|�Nz���n���K���o �a�,Ye(�:��/��tV:���E㛮� y��X���;H�Bt}�dW��Y� �@�'�*ġ
ү2�
+O 
�w�e��^�_��
O$��=��)u{�sI�	��o �oA��_��-GE(4��F�� �4m0��Y� ���Wz�@K��O���*�} ��(�n	 �U
�
�E�-����k�+�o>�9ÞJ�G>�Lƥ��E��|q�z^�(��
 IE�����{�T�
�<�^������	`��wٺ��f{�[`����d�`y U�'@�<|�F7a�^��j��Z<H� �x����1>�1�
�߬<u3N��
z
�p��S�Y�\~�?��@s~�?/@��Dq2��D��Y����Կ��~
+ op
���������Z��n���pi"��I#�G���q�s��A�~��{
Y�zv
+Í�J����1~��ҥ��!'���u�o������hOp���R�"���.����A ѕؗ,w;ϋ��#0���r��#�z[��3z/��/�p[�CL9���������i{�����sm�O�–N9��|]������s��vb(�߫ \�
����5@����\1ǒ��
��wU�}Y�[C/��y���9�neq�^�~|�c��ͧ
~������
�֩�tj����Ԃ�i/������<2������1Փ����`��� �
YX��š&���Ce�{o�TarK�\�
�K��Yb�
ra�?_;��ŪW]H�b���d�o��	�#���CM��ap�f�� ��v<�Γ��1RLl��W����r��yy9��F�7w�>��
�* ��
B_��j��JԸ�$�Yӏ�w�!��'p;{��s�y%�7�
z��X;�8����ޅ��q{'����<7|AG�m�,{L�׻�ym:������
�z�v���g�}X���o X��a
���S°>�fm'�ǽ��n�����~���i��j��bN�,��h��Z����d�<�v�;YV'�:��D�M�6JV�U×�⫺,h۹�
�'�z+��E��
+WμS�v��^����o`�

�g���h}������+�����nþw�_g�����y�.z(��ܮ�L����ݴ��.�Ӗj�D_�.�˲��'�\6#���?
!f����k)�m��ܛ���qz��)-���G�� �搅�'�R
+��d[���,���݇���l����I��Cq ���͚ڤ�d�"�#�T2H{��17������BH�[-���slr�g=�&���9�W�J�d���M|�9L��n7)>��8���� pb�*U
���(�&���¡5��2�^����������O�IK
�[�:���xy����n�3�E#uU4D�Lg�����Ń:s�D�wS��K*��2��+=�4z��a�[�fĵ
+����s8��B�(</���j
�C�}��f�bd{�3��
q�}�-�6vʉ-
+y�V~��1b�.�R�i�̾9'���Խ�cu\��5��v3zt���K:%���^P>���|����|j��������x��`:�q�L�ԋ��غF����3
��g4}�O��=���m�
��q_�؃e����Z�	�������#iOf��W��tr%x+�q�=w��;�?�;�������;��5��Ks��g˿�{Hc(T������8Ȼ�n��+N!�7w�Ie�AM�Z+n᲼y��nV�4���A��I^��:)���h�T�aΘ���Y�������K ]�.M���4)�m�*u6rVm�e��Y��J0����@���?��X�sFr�躷�S�^
+����o��b�5�X�����\�@��{�i\
$�?
+���mq�Vy��eȲǏg?�4�D�7sƞ�8��bm�ꊋG�c��{�,f�fmr�
L� ��T����褳^��1v_
�*ۢ����$fL�$Q$)
+�s�,����)������3/���m7�*��QҥE��r��m+�S\�-���-�D'�٫������k5n���(�$_�[ۅ�W	��!xX֥|���SC���eސ�<�v8��o�<��n�[��&n����:
~��\
����!�Nr吻���~o3��Y��c��/�k����¿���;9�	��g��`y0�~|7�9�-�PrDu��T�u�ʷ�Nw)�.v|掠E�1��m)��j��:�Ry��6��ؙx^��I�O�t�
h/�pP��
��ڙM}V�h��yS�,�Y��Tz"h���9|6W�fo{�#h�g���Ōܘ�Eɽ1��%���ߔ�ʞG?�Pzޖ���#���2�<H�@é��#OLmҒ���o�^jܶ�K���V�����ۼ��즞�����$��MP�R���]4o�h0`���9}���E���g��
!�[���2�b��4������yȑ�c�N41d��B�M�i��{4e��Yt
�c|�״��$���ˠ5��s������o�L�_�s��Q���
��e�ƀ��w{�mi�.>W��"�t��:
r�n㖎��k� Tzh�{d�uV/p�ڗ�
T����k�h��l6�p�7g��0\���7GZ�F(��Ì�b?��zǑ%�@�~�
�͈~���1�$)L|�˫R��o�U/��*G�a,}
것�p j��M����
G_*���,���L�^��3���(�R��ѤT;�)�Z�4.�ƴT���Z�O�� +6��g��#v
��qѻ�w�x5f��U/��
���LLʘV��q,tVAk�k�q�p��Pol���C��[)#rJ���
+E糎L�Z쐧�v&
oX%
E5�^�k�6Y�1
\ƍKuh�`6�8o]?
+x����T�h�
+�w�vL�F�,
���8�.a�:�r���zG�]X`��0�i	�����V䲳�q��1�wjf�ѓ.�}�*��Y
3�ƈ�G
�
�ѵP�G�M���Ss7�¸愘�ol�*/)�k������[U1b|��Ŷ���M{���Zu�
	vW�x��'���g�ղ/5E��zOs(PXkҜ��
{���W5.��ج�n_�.�0꫊�!��G�]E	iT��ͷ���1�����L�.�_
�9�s��5(�'CxS{���MwZ�,�c����r�VH~0��0&� ��1CP��A�Ȇ:%:�u����flsY]�Z��� ���-�Z�Ɣ��I�LT���%�s�ˡ�ejP���RՃ�?�`��0=��/�Ǣ��4+��Y��k�n��B�~.�WE��<q���W+�T�Ĕ���
W�F�����YCN_�Zz�&�����4��tKu�^���\pz8T`�v-�S)��g~.��ln�-�YΉ̺�o����>�����i��D��u��e�2�m�u:�}�
��z�rε��ܪ�D�N%D��D
+g���-<w�r�)
�y��7sb���J�]�

�yhd�%���2zgZ˔p^�N{톝� 5�
;_%Nv,�~b������j8�3+2��[�Ы}z�*��I%�����̾kD�y����&�ms���0w�f^��%�0�
i��V8�U�z��B�;fh}�Z�B�$�!��ϲ�s��/�����ׅh��x��Rt�sF*A#��c�j�U���s2 qe��scJy_���|@�Y���rj�����i��u�����3������^]@<����,W!��H��
���D��������O�結�b���z��:�5�W�K�A��@Yo���,N��9N�]��j`1�[7N'%���i�Y ��85�O����	�Iq:�����
����醶�����u�y��(L����D
�O�hG<�u�$��c'А]%7�%P
C(߭|�%FU olp�$R� �1 .$��c�[e��
�l�e�@�;���2F���/�\��֞ P;M�r�Ԇ��y �p/$���MO��n8=�*�:�.	4�� �p&	d�	4���
 [...]
+����s��/x�0C"� r�HoYO�M�L�~��t����i���1��b���8+eX�f

N���Rm��
c	\�T�w�X��e���n�w�s�?�wsx����ш�U��t� 5��e�Z��x�-��	��6�3���y��x~� 7� �
� 
+N��)οO#�s� (�J�v,	|����y�GƝZ�y�4m�4��|��
�!�e���H�w�lm��u���ws���	)���	ھ	z,�
V�k��+R�}��]��
�2	�*�ͮ:	r���J/�q�Ln��n�������髸���I
+�`4N�	!��&V����s�
�q�7�W	M�'C�,�'hH{�dL~���OPz�}�&L`A���#�������}���(�D3g��:�D�y��YY2�Ȍ����+�5V��v�!3�Bw?<����B�@�ܿ���?���Ǻ�l��m/;�9��вׇ~����\�..Ec���$3�KIf���e�;�9��|�
ݷ��cB�͐
��]pP��Ž;��O��Ņ�EU���a�F�R<�O�X>62�N���^���]�*��]�X�-y�]'
ڕ���e�� ��>
���@o�J�1�T��
9����N/��zH�uu~~0u�u���u�l*m��g��l�D;LZW3x;��I�r/
O��2�;L̓|�=�����եSt�w.�-�u:�Xə�������/�=�	�[�L��
cU@���o�r�͓���]�w��

+J~s�?����V�
�X��~.A����[��P6����/k�&��ŪV1��]���Y|�~.Z��2gH�4�v�/�
����/���
?��S��{�H��zcKIf��&�-}�m�J��e�9jͭ��D�ƪ��n�7�G$/{
��[5��6%�L�nň�~��[��q"���p0Kǝ�u��U�;���>�sC��A%�ĥ�:�aa2�[{k�Á�[5���
P�Q.�T���
I1i$ٜ�J�ۢ�^�*�|
�v���0h�������(���l�Y��>�NrHLr*�悯�M�; ��=�tǹF�ک�_&�����2��\�m�&ۣL
�5v�Y������ZƘ EY"A��m��v =ɽԹm7,{��
��E��|e5^�|~��|Ƨ�l��N9��=%��$[���	h�rhM��:vk�iOK�oC��a$�mȒ�8g����
O��`�a����٭��|7�/lZ��-'x�P�>%2���R�T�Z�\��J!�w*�׷~}�t^��\�ʻ��M�ީD����:df\����1[�?r��a1۱ַ�n���,����\P���٣U��.54�=�3�K�G�����
pi6
+	����I�^��;�n��\
� p&�ϲ|i3�Q����Ũ�LU���y�脻�1i���N�6ZޏEk���&��a��ȃ�90FX֟������*���R{^gg|���x�����"�"��B1��u1VC�~բ(=����S���>+%�_��I�L/Z�����Y#;�����y8�~�t��-���(�Af`�١�Am��
R۽8{��):z��<hˠXЖ�l��k�1�i�^C�:������tH]��+Dђ-\*�}z�f�{��W�
��z�3����͝n�}�2taӟ��|m�����
v����V@�̰���g(���{��V��[A���d�Ut��(zv$*z
֕@�T%`?�T�Η�/@�0�I�������l�>�m�a�ףm����ex.���i��ܐ
�&�q�NSZX`�
/��u��?Q�uY����gu�NU4\Bi� %
����
�]sYLA.f�j<`�uo�^�+�MW� ����dN�"�*�k@"Ё�?����<���-}��W�u2է��g�3f��.h/�.YA��/w3 +�S�k�
����&[�Tu�**�����6
Qz�w���M�
67v���鸪�v^Ӿ"Q;M��,����Z�[x
���
	��˒y����@�����O���d
�n6��)l��
�oV��PHw��
�N_�-�#�x���k��K�׭t�z�mϲm�
k;Ol�Żؾش�$H�f��:D�=�[�dI�&�[�|�d��*��z3�5i������Y�)�=��<;nB��=$F�esf5�W�g1��*H�6˵���R)��n����|��v�WK�*[�[[�!�r��ھ~������&U�}K-9�E�DZ"&��/�\�7yO��B��S�K_���
)\��av�|��n�ݹ�Hc��9lRԀ~�@��
'�г��X���L��3�.�ٞ;�X�Ű�� �����r���m�3O�3g��g�O�3W�7а͟�@�����y���?u��
��<.��������rͽ-OW����0�P#�wD�z�0E%��P&������E�����Fo-�����Gp���*5�-���L�MJƽ�Ɲ=��;�J�k�m��~.�����l;$��{s9��B��..��h/
)ܚW��0��k�_��gת��ﰺbn6B�Yw4	B2f[ⷮ�{�+�d�GެV

y��L�b�fڧ�f�:
4K��+�����Bw��C/�@l
+�����/��F �G�?WN
}�v���k�f�	�Bv�A�+#aݩ�Z٩V�G��%2=������X#s���'�U.;
u�0<(�.�P�'�vA(�]�b(�~֩|dn���T",�&�{�C���Hꊧr֜��vt˭d3���B\
~��Γ�N�Gť�
8��ų��H�4��s	iy�NF
+!Q;�an)>,;"7	
���҈i��Y��-[������!���Ѹ��1<���p]+����X'�f�99�ޘ�|�ѹr�����P4����8�0
+��v�^�^�R�~0e�ɶ�X�Q�X0#��I3�!?�ܫW��dHYh.R�u����������d%�/�z�M�c!_���f���Y��N��d�U~���*�
�����+�J��X�W�9SI��җ�іo���>��^נ}e$��2=�-�P2��96�٨m���yIku����+)B8���	m6�J�S
+�Qo.��m�mu^>�Ȅ�U�L�U2;�&��EJlK4I�
���`|YS�\�XX�����5���8��
�`��[��Se4
M:+�j	�6�c�ڥ��E!���~�iPG�Vw�zR��^�=��^,���v
b7�ʇ
�˵��c��|�*U�L�h]��b��̋
�+<N
��X���X��ߩ_�U
�N���ϯ�X�7SF��t$5
	���%^��%�
�u��i�ZeuV]z�me3wϕ\��$��
*�
^�>��胑�g���c�U�\2�ss��!'�]�8��|�.��{{|;ޔp��V�˗M
�7��/&�9w�*��鷵�\	��ב���o�hn��B��XM#��dWE�(>� 1J.�R
ޯ�Tf�/0�������-'ֆQveO>�ֵ1<�Y�2z+��Ӛ��Jv8B�A6 at M}��r�F«�!�% ���a���ր���{�v�w�2�reؔ-Zk�/R��b�)��	]��[��ȶ��KJ/'V#+��!�0��	��;-

ft�%j*����;C���~�`��t�
89��V�8�i�!��J��{���1u_+u8~��է���4j�TV�;.�&v<���U�s���r�m�d3Me�CeJ�a��h=;��(�0Si� �At 

0� �)ē�w�v�X�,���X}��?h���g�꟧m��/�B�	��P9&�@�����8��8-��s\������G�]��w񇭆���W ���\�f*
������G�o��|Vx��r���}a��|�_���H���	�\}��}��w���}Dv�̓h�8��q�!b���A�"K?���=@}�h��ʀ6	�� %�\KC��ş8g��c@��?��=�����E�/�/2��^��j��"�$.M`�P�B�u�$p1a��r
&��2�+���1�w�7��'�!��q9�� ;.N'�w2��
pZĩC
^
�n� ,��6e-���^,�^��߀��Ϟ�R�������%�N�[�@gW��;�:���n�X�	\���.�Iy�Mɻ[�p���L'��oD�:�����8�	D���[�+ �H���
�o|��_y�h<�r��oC�� :
���~y� ��0�O$Aj4Ad���r�w�yC}��$�	|p�	<~
�q�9��x��R��*`5�^�֐e�k�{}���lŇ^�=��z�
���=�����aH�����]�����_1
UJ�������;�-�m��%zr��;+Av�2AT�� ��j��_�ޛ���n�K�@��q���D>?�.���0f��o��c$���d\/�9Ngoj(�N�6/r�28q�:���FW堩y�~���	���1p��2��cj	V
	?�=��	�(�r��^%
���F
��]|P(��,���,�y�ڿ�%���nȔ��+a��f���ek�ع
�c��v��W�����yd����H�f
i{
l�����.�� �!�`�w.���O�N���d0Ջe��_��΍��
+�{�
���
3��"�K~
7��+�O�=�
�S�

��:PV�Γ����!-WٮqB�(�"���~9ɫs͑V[j/���������SP�bܣ 8��d��wz�$��Ҟ��@
��۸-���_��s9,�{山�F��i��O���
�Aeז��v
�Z�,:P7j�5ׇ��_�Q�t]t� jA�y�
+��l���38�
+���e�=z��FJ�
(L:M0��鿱$#Y��_��e��4���ڱu�
[�s�#:�y9Y�:��q��Z�M��K�.gW�F�X��-z���^郬ν�h4����L8T�i�}��2T=
}�^�
��~u�95�՜��"���A��
I2�*�d��j��%�]��@�
N�qU�q��X�t ��ý�`�����7K[Y�=��~MKgs��g��
IQ�l𢷿�W,���72g8
��!�	)� �
�
g���is�-5�cf�	z}��5X<�!���{[M�[wQyC���lՋ��kX]�'�h�,H��-j�v*��g_������=m��s
w+N�6'd8��Ni:��!����
�D�o����Y���Z���M���f
Ek���n�I��
��T�+���1��O��s;NZF p��ƅ��F��������1қv���_`�{>V��͇���~{�_�=b'�eކ*p���.yK�5s{+�f��xu�"�%��
ΕGs`��b-�ƭ1���?u�L���3��5w=�X�̶��~�A{��"\��
���Zu�(9~�cW�חx˹�_�d�[�Ƭ�=؂ָ��R9��
3�r\�r15�s�q�[�Q>��c�.��
�٧3��}7��kۨ�\�@�"��#(J� ?\*�����ˁ3��>���:�ޯ�g��d�F:G���4_
+�
��;�8��qm<��9ܭNG
�Z���d^4,��q/��~��}�e
+=V�������et���_H
��/
.
˿H������'�c��Ȭrܯ��n[�ћ�yz��.�	�mh����mΫ���C�Ik�{�j#�im��5���
��޸��k?:���{���g?�OQF�&E��۹�ݝ5�6��}R�R�~I�ٙV��4#(��V��ϐ����
vyLݬo�g�|M����������û�:�
�2�����l�Rvocx�G��쑾A~�u/v�����C[e�T�B����)�X;wA*+z2��|dB��dM�Z`�,��&!��Z�I�x|��{�^�y� �m�9��͊�7���禳l
=�A��6�yh�1�%�U�RX{8�L�A��
�k�͆�
�8s]����g�����D>ye�{�5)
�Eɮ&c�| o����25ɮ���HY
+����?�f8�.��4r��v1ݭ-*�^|��l�g|���}�d�	���v�g�,M�և�.�I}v��������Se��Di����$W֯�� �H�U���o'd�o���j�����=����A���OD;~ϋ
��*�"ɬh�5&��G��V�
v+Zz��
B^L�T"tJ�	1 �W����ƆW&"�'ѧ�\��֗���eo�P9v�y�>���`��hm�?���a�+�h|dZ]�6Zݖ
��"Sl�m�"��C�bj�~0q�3
���'�j��#@n�a}����Lدg9���j{�
���i�����/0PDn�O�}j6t���@2��3��
+���H��~�k��v��^D,�V�*g��aB�}��~����,��]��,SԵXvg>���K/��C;���u�h7��w&ˍO�ҹ�H�3��؁9`io�(�õ���$1
_DŽ�C�M�&�b�&J')���|?��C�[J�>�k5�C�j�a�c��Ga�F��څ$��H�̆d����|����/BAz�>)�7�
+3+�N���v)͟���mlV�{��2�/<� K�a��U���G����ܘJ5ɍq�#طN�N���ZBO�}~�i�T��Ի	3L:�6�EAiN;�+��Ls�W�M?ɗ�	�&��~�?��\���s���q5)	�<���=s�YN�
�Y��74�Y_��@ъZ:V	���m�{t�;��3h�ݙ��b��r��J??�=n4i��f��d�r��lՄ�)
K4��J�Ưo���bT7*��,��>^�_�����9_����S=�g�ڋ�"��h�ݜ!����*O�J����̤җ�{�Y�c[�O1�/�\
y�Ԯs��ͳL��ex�:l���GKC6�]}��`�'K\d�3$.�#�4��Xl�|�A�h�A���5N]V͒z��3��K}ҕ��+�Y+��~+�
��'P�dqEuM���}`�`¥����.~�"��b�Fe>V����r���e�Ύ�U��1Y��Uc�u�a��|�Ԣ�=�E�~Z�3W}=�l�����F������קrΞUnm'0�,,�v����ni�!��V�+�Ŷ�����i�ʹ�{��Rʳ��
i��>��;��i~,��
F�z�Ӫ�z�_{�U���*O�iBwde�Y�+ssW�E����!:#2\�Œ[����_��\[�+:5|�
Fځ�@�pS�v6]txr�d䝡�3cR�Gd�����i���޸����OX��H�:C��*ll�J����k��n[��w��UJ��4��J���^�]3X�̝��9��@��_��vr� ��
��l����}K�^;�=d��"�)�)IV�Rc�s�ؼ�c~B�(��]|��s�\ʓA�t�%c|���L�X4�r��o�
U����8��J�%#��MEn��_1��!��'$�~|�/?؟�;�t��,��s=�t����o�d�A�p/$+6q/G7�)S��j�r9�6
+�j
o��Q
�

�k:y/�Z�>��k��Gv�%Sp��p��x�ə���e4�w��F;�*v*�X�8e�>3G�~�A~1�du��
~}O��5b���"��<�L0�I��W:�Q2H8_���B�[�ĜX���ըd�[��\�w���4�N��3:��n�'Z���*�ʰc2<?�'Z �
�~g�j�9�
�<��YG�ns�NX�\��9�Օ�#�񵸠SD�l�z������З
+�{�����
;-`��Q
�g�m�*κ0S�����du
poO����H���>�7��w��=6��R@�����������V:ƀsg�F
7�v���fYw�j�en�Y,��2�M��|H��u����0;�y���� �5@@R
�ٔ�%�
 oD�= ����>h+�j+��ǂG�ǂ��/┟?�t{����|Ʃ����zv
'�1���d�"�Ĥ�8�
5Nd
�W��9NZ��&9��X�(�  ��7���:�I������)���F�?L��oR�%P&Th
�����c�h�h�!p"�d
>N�'-Nn$8�m���;|���Q�p)�I�Ul0nnz�<�<�I�I �|�<3�� ��iğb���0��I�C<� ^	�#/m��)��6�o/�V�1r�5�4p�ğn�$�c&��X���8H�G� ���'��s��Vp<#3����4���Y��xm����?�jQ#�G=��Y85�a���W�8� �w>yFJq���qJ^�qJч8-Y�)ݡ8-���*`ڌS:i�i����\Ĉ�;�3
~u���9��6�N>�����~\9�z
S���b$�0�����@�K`��%Ы/$���H��	Tc�	��^(�����b������ҫ��� [...]
��zⅵ6JrI������{��=6I��2���(4_���}<�uO�O�&������Y�����ñ���
+�@�����c���]���^s'�ki��&�m&P6���&+�|�&�+-©U\؂ZXP���3D�ŗO�/	�]����D����A�w�1�L-��J+���/��C�v)�8w�L�
�.��~�7ƻE�:߮[����/��4�\�Q^���ܪb����g���RY�1��`s7�g�%�L�Oi����/�F�?xʇD�����%A�Q��m8�Q��{(�nY�]�f���s�U���i�����#��Ys��������.|m�����"�!��g.sw�y�>�<Z��t���S4��+�
ow�
��-���3�w��gvrϜ�/�q�7��e<>H�_���@�{�)���x)G�9�
�򹴽nK��hC��~.
+�R$𵑏k�P�r����ι�h�ZR}<������A��g���W8�O�_�"�E��N5P�ɨ����PZ���9�ώ>�:>��yl��A��
ݠ_���
	���,��wdr?إTy,����
�<݋��jshl�+
������9T����&�
+�P<�<�F�;qLTXLBV؏�$}7
6��]'3J
��!�-ky��?��y�7S^-2� �_��v��â%��S���%Ae(/��h�KpƗ��Yv���d�����`�U�'�
Vνgm�%��L+^���΍��Ƀ|k�W�bڠqFi<Y�ĺw���(�94
�maX\����i=�:n�
�~�F=#_�~�y|��|�� FJ��O�G���}�El�;���"���d�GHkSVN�Uch���of��	�²
��G!�4���]y�=�4i�&ȞՅ2���3�6<T���\�/�
��z
��)���^�I�1�r�'T���/
ҧ� ���R�u�^�S�������5{wpM��eG������F�-�Rݚe���_�gw���d���\qR-����X0��
{�|0��aƢ?V���v�P��=H�;B��`���Y��z�k0��?_u�e_��_u���M �aos\q����
n��f�������[0q�ud�Z��F�)Q�rtJ���
Y�m�HF�O*��
!O��Zk۷��~�?�.l�5���ۙʽ�
���1��|y�Z�<���ـ����P<�n{h��t��zx#�E왃�ʸ���l��9VǓWn�
C��}$IՏ���L��<ݟ<Q��]]}v8�қ��U���\Ѫ���/ZQ�b\�n�N7��]w��8whɗw�����/	���b�y8���b��f�|ģ�<�@�:ͫ
ս�>����
ǐ[X��H�l
��{X��a��b�i�
=��mճ��VV5%�XK>U�i�Z��R��a�Y裠ۍ�v\9��q5��`�F$��w�r�ٙxd�X6�
�@xг
�h�"�N����yb���z"����u-�	�K0������{�>���sU�
cZ�ˬ ��l�{M>�Fo��~6����t[HE1?��ȱ���r�b�"�|�s��ڙHL���,=G�K����
V���
����hZ�V�n�l�c�$9k� �Oh����A�ܵ7�fb��<c�
�����^`�
�ޖh���Ze�":ܜZ�ڜri�����Bު
e�zy
+�d��J���������Р�V�ߧK&�YWwlo��]P~0k�?����v��
�c��赜�m��C�L�/6׽ϳ�4a�T��fB[�N�ɃVV֦BA
|�ݼ��<S��Q��c�
&6�p��q���K�
�⾀�K�ٺ�����.�K�L
ks�D�n`/?yX�M�A�7���Z�=-_p��ik\�:�۾�b6�Ў�\
+�ycY;Wp���#�f�'�愫��-;M
L�BrL���L�v�0Ey1^����*��ml��/W�����a�Ŋ�
��M-���L
��qϰ��'N 1�t���AY���5�__t�7��$�W�^0���n�2-�*��5x��	\]'���F�9�Vs��W޽	e���@��yM�e>�A����4��r����(��S ��v̟�
�/�l�V�-��z
�b0����$�e%�D+���N���t%n����A$��n�WM�kx��v�fX��i
+# �NkFu���EO�T�C���Te="�a
dd>(�I%��&@��f5f����o��pd�cq��̳q�
v�J������ڬ���Ƶ����du����
���c��B���"�L�\��
�*��x*g5�hqN�͂���~���BՇ!4��D#��A�T��+ 7�Ŷ���M�]�7��|�'g�O��^j�.��(ې�l��Q�7C
g_��2���$s��h�m.�ޚ^k����O*
`��
�A3&�)ѩ=�
��Q�lUu���޵*���J2���\+���Tx��?��r~�Hgjw��x��]�^�N�d�Vg
f)�<!�8�e�u��+�
y
�*d���I"c�Ce5n��U}4��L6�ZS�A�uؖ+i9e+-�Ӊ�c9%2���|J�ͧ>*˭���}���^�?Xi�P�_�;��֫w�Ÿ�Ȼ�$���ԕ��H���Zea�`��S�s�5V�,\��&Hm�
�ꙥiՓ\:
0P�򎵃r~<J���z%�Z<B�8����m�9��/XR~X���]�!؇��a
���~�W�Mpé(S���N��/���1�+�@�V3,'^+T@<�u[.�q׍K��  [...]
4.�Vg]�0��C��X�^������F͢Ue�;���Qax�#�����eCo�~��T��b
��?����ee:h�����y�#0J��n�L��h�\���I���}c��'�q��
�q�)H��׭z�v(�6�8�F�mp�2T!��7 .ڻ�,o��^t
�1T��w ~{�Kf$ĥ�
�@|���Ő\�
=?��]v�k��J�����'�^�
+�P:�{�
R�4��7v��t�b$��8�<�s�o���	���&�7�m���c�'��yt�[�Ύҕ�w����L�F
�s�5 N~�,�p�hw�ƶ/����q$��牮"�s�DDQ.�_8��Z1Vn��p$���(u��g����?!����Y[��G��h����`�NA���uR�x�2 ������C�y0�8�� P�ǟ1��?�m'��1�g�k
�
I
�����q�Q �Hg18� �
`>�8�H��M�ؓq�-����r}
�o��R���Һ�T�C���
�Za���w�|
�d�?��F�8t�A�f
��.`:N�8�p[��
8�@��8��
+��e-��@p��g%���N������	�N(CP
�M�ۧ8�� Э5%P���6���C�)��8�LA�[�'���Q�j���{.�� l@��~�q�5b@,�7�
�� � �Io�{/jA��^���
��npC�*{����6q��"�=�ށ/�-�V{�}
��g�f�O��ş�/ğ�S�?87̖��1�d�`��3�'�bA�j�\�R��n��c׃�
��Qo_�<'���-U��a�W���9���$Y	"�b�����c��:���;�v/��X̚T��
J�����6P�r����"�p�f��p�ٗr�������x��'�ͬ�|�� ��:��i9�P{�$����bn�}�t|zV���C�s�G����-D��T��o�᝿����]}wZ���g���W�g�����_��^���_wi�v�d
���4Wg�i.}��Z)���kl�G�j7����N�k���u���ufW����:]P�s?;+�}
2
x [...]
+j�
+S#.�J�c�U
+�V=��tٝ_�׮����~d,���U���<.qb1�C�	N벰x����
���[ ��@ܔ.A�K��"�����l�|��J�zH������3j����v�������k���v��|��`�Ej�[�]j�OnooH��K'ކE�~Z�t��J��f�߭񠅈��h� ww/���г����'���i4��ň��<�Yx�:-4�Ǵ0��^�g_o}�ڝ�{%:6��y7�^��Y
����a	t�je1���| 3��<y
k�͇�

�����"�����7,i=���%'���
���]�-/�hi��Z��"}�r�C!}g��� -����(����LOL���
<d��r�ܺ|q
���u]k?�"��K}|n���?X̑�C�� �W]굱�Ug�;��9�7��ߊ�U��'W�a
�)e�Y�5��bl��4{*���a6��ݿȎ/�M
)|U/����q/���.'�n��67��p-T�n�b����5�HjU���NY� 6��P�}�%Xq)V-��-S_����ƀ�
��R*Ͱq��o�����A�{�Vi5˓���Ƹ@�e��4����
�����u�z�9�!���c:\_Sj]�v�rz��
��[yy�?:a�}��Q-�[$R�:h+�-ͩ�B
S*�f�S}2�+��d�P�Yc
�n�<�֢XQ�*��� Ƕ���}m�EvBN7I���弜>�Ĥ���=�֓ɓ
N�[�i��>IMr�����ko;oC�ż��o�
�3g�4���M�3׋ʘ��-'�Q~b(���+-��^EV�חt-�u	��h>־��s�/�/�/������=n����1��XG
+��z�%�y��_ sK�%��c��ްtt�2���q�v�����>^T�7Zjt�a
ʧp��]�H}�f��'Ψ}>�
+
����q��ݎ�l�d��w����CZX�ח�-��;amV�D\)�6��"��۾[�"����Y�1��;����Wq�m�G��誠(�y�[�zK�$�:B�9��&)NL&@��	�<;���y̅�w���+�����U[�/!W���՗�)�N�E��㳟��!�
Ġ����&�y�}�������44l�(�ra����u�ռ����!�� �^I��j͉�����݇B�������q���e����2G^O������,�2��c�e�%���ë���sqRZDnÛ��Ck⿼��D����-87�xw<�.c�[c���ߖ���$��
z_�R2y/�a�y��
�lyW�M�mJ��@�=�~���E�E�m�
�7�
��ˊ6������n�?�/h>�#��m
R
.�d��ƭH 1��+=׀ʔ�K�^��cU����yP��л���\l�B�?|f�<����۪uzL��"�p���(�g�Қz/�;卤Eu�"K��
�3СO�-�����#<���n
u [...]
������ Uxj5�t�t��aB
gK���`����
��z�,z�D�.V>֝�
�E��/���6�ej,��B�JJI�!D~@�}���o�;���	�9^��'M�8�Zw����>F��
}�u8ʽ�^�Y>�o�v�J��a�ơ��z�1�™���d�`K
��M���F0���Q<d>��������,���Lsv��b
n~��`B�lSh���E��nSf���c�/v�dOg��h��A�6� ��
��	?M[O�*� �WkH"UaQz@�d�4��>}R�~Q��~�$��b����<��i�πG�/?����.W0#���'�
�S���2�
��PJ�
�G
�4F
:Qq�C1�Fn&
��>�h|��*縎��A�#tNΈ;|d,,K�A�)A���'a�%+�
~]fo��k,�a��
��C:r��3�t���/~o
�n�c:{���Iא�����+
f�UN�X
"K#G���5��Ӟ��{�s3�m
}m�,��4�$g��Na0 o���7X�D��� ���n�]�#
�)�p;08�A��C~@�Ώ���]��6d,�&����1���Oթ��dM>K��N�!�
��1vh�I��1�^�"���1(
/�~����q�|�G��
�w��v�ݡV]m69t�O���c�"�R�N�Y��6P>�E$
[��B-
+��|(ΛA�g6�j����>AÎ�b��9��A}�E���-–,`���u���T��!� 
:�v�A�;���K�a��~��t�=R�p]��#nAk��?`s]&M漫7�pwبY�Z�cȦ.fٺ�äzs���c<0j�5�a�fp���gYrל�lQS�5U����_e��Xmg�����(��}`q>�A/m}h��JT?��S�5�?�-O.�NdԮi�
+V�
i�z���ꌭ��~E<V
�\�bz��"
��O~��D��3}g=L١��?�F_�f�b>4�w�zi�e��<X����hU���s�i�9�	���3��R��
q|_o��M
�ai4(�~��*�_��:I������n�V������K
��N`-�J`m�

{�o�a�VhՄQA�CvaɃ֗�
�(YY��1]���
��B`d�]d����S�a	{4�
!�u7QTv��?W`
zF����p�]��'7��*��6]��4( �ϔ@G�e���Ҵ���

 t�e}X� z���
}ߙ�1�߲7�]�������V'�^�|��4��:Гci�Mv`V�����%f��2����b��^ �f
+ V�5
G1 SO 
%���3���2��]�+�
��i�Ė�������_�I�	
&��s��P�7�柟^�k��v!����\�\��Љ�8<�f��@S}���
���U�+c�����j
��� ��E������>�3��R���
�+#T����s�S����lIc/�f�
��H�2p�׫��5�j�j�S�����%V�' C7; ��c�����(��K�F��S����ٶ��wY��?m�D+�h���K!`���M�������+b�$o�J�n'	Il3��$���Km�$5F��qʞIחt�a�2����"���2�fF<Hf�d<�_ˎ�'����*�~_��lߋ[�b�:��ɻ�XI�4�,��,�Ze��,�f!�hg��
������3���U�e�t��dᵲ����e7q�92����Z���y�Ư��=�4|�����C򩖂�Syfa^7��`)�H�co�E�e
\�7I��Y��;
��g
��u���O�V�
r�O���S��_.)��}���O��#�~W{T���
!��.$F|�;��v�������^f����
)ӿb}7���Up�}ORV)$i���֓�
4I�	�)I���g�,��o^G
���<?KM���T�}��2xo4�ƭ
E�U����VX/�O�?�;��}�9���y�K�9u�y�Yߌ�]���N�ԍu�����=��ɻy,&�bJ�[y^m�Y�t�O
��n56���Ļ)���oP݊�����^���8���y
d"�'r
�-������~�	���i���p�S+��_d��ѵS�U0R��zr��5p��%gqJ>�k�*V��C`F�[
@��e3�_�{�8�Nsƻ#���~ʽ�y��]??~xd���=������-�iEW��0[��074\�
�ü�[����)`r��<{T�S�>q2�e��p�Pap|L���z���s��N
�F�ߩ
��Ng8ԑ��\!���D�%.o�Er�E9��8;i��C�x��aa����_U
H	>�X��M���/��n�?d���/i.g-�\ml���p���q
��2X���/�t��,b���������I�w�,mr�B3�%x���j��W5����>?у�X����	�=�����=+j{/�ݷl�nNg]gt��hV�(�����⒍4�F��������q��U�=�<{�׺ld�Sm��
+��X.D��z
$��^�r͢-��><�u��^F����S�u�����o�6�6������ʈ�@�P�fVk�8�z��_,��
���6��w�N�8/
�;F���V���4{[|��������Xv�X�x��>�'���
+��K1d��p��ksc	�G�D�9S�dz93O��75
:׽	�6����J�f��=�닩/Bw���w�c�g��+:eԸ����y/�6��Ui�\�Rw����SS�#���
��޸�a�3՛ut��վɠ�f
�κF���?�l�X���r�������~g�SO舘p��n���V㞥�Ԛ�e�������4�~�G(�BZVvf�m��
+Y��}�[�V��������	q�i���Rq:oya�q�<bc�z<f�w�L���4͡�gXc��n���z���Mʗ���$+.U�.u����l�⽭ξ�_������(��q?XJ[oIQ��
��d�Z$�C��h٩���\r&�ymʒa^esf��8�.�H_
�����Z%��z*+Ұזc�@����R�#ʢ�w��k��&6>�
�6<�2�V^��}Q�(��Mx��;����	,��D��/��r��z�['|S7���%Q��.����Ⴃq�t�N��"����e�P�J-
<_�D�[v�ѫ���w��B

��F!_DӔc�3�U&����_~)
�X�x
�9�q���Wn�h
	����
wZv�6���:�ǩ�x�ʳ�T����j�mj+Y��\S�w�BP�-F�h�������ytJB�\o��
�r��2l�M5�����Ab�L+e��n�?`�A�/�����q?�N��{�-U
��
͇
���n�Sl�۷�`<��}Ls�δ��V��r
	A�G=]2؞��s�����;���,��ɗ�C���a���O=F�j|���
+
=��g�/�zt_ڈO�L������G�W9�w-
O
��y�������id��
8�7�\4u��g�ۛ���
{ɓ7|1����n�|�e
�ZU��M�~3
++��:%C? }�[���E���ϩtn
)�!�
�|�/��4��}�p��
gGSe��~�	���
:[��{� z�Ʋ���4��|QɲdRjO���hB�MA ϪΗ����B|�6wpĨ`�<�?�m<K��
�6�7�G(B�p��L��
�z"Mb���$8P��
	6y�
��/�?\��ӎ
�~o$���
A��4�4������$���.&�G~��`H�·%��=,�R�2�sL���x��������t����C���*I��`kUz��8}(�>�a���
k�;3�EMq(T��@�p�c��i
��m���Yo����W�^��������noV�X��Ix6�C3�q�s
�?1��G
_W�~�N�(�%���-�wgg��[)��楡p[u~@��|RxK뫘z
�X�\��<�05x�_&X��	_�?�u��B��u#�e�=j�m�4�ݪj��zO>� �����&���
�h�9�����:C�9q�Q�8�4�*��9�LB�[R���A����饴��g5D��TD,��t8KgI��䱹d9
�p�<
+���b����U\�M���:�VsdZ��W�"�nb*�ϭ#{��-�kh�� 
>4&<k#��
P�
��<*�eղ�k��Z�&R]�V�b�Ѹ��Z}#��>H�"2 ��0 �c���Ś$����r��� ��A��"@� ��xv�Li~֚�o>�B�1}����^��R
+Gdh�z'��HVj+��36����o��]^�)w���o+�V�� K�^��R.��
��0
o��v޵{��j�	�����iFU�z[�e��AE��=q���`

����E_��Xe��)�)��T��:�I�~�a�%Ƹ�nR��������K!P7X�Y��`�r�A��{�1�����|�E
��
�A��.���i�5;��t�Q
�tb��tl��tT$�w�5����F��*te�|� ��Xk5'}�+W�C)N�d��jk��nln���u�dc��`C���V�� ���H��K/�.�Ldݗ�[�cj�K�=vz�9�
��_9c�����.�������H�Zn��F'�P���;�Luv�j�n�ɔ}L�?�_�}!T�
+3[zojY�!T]�/�V�8�xW
��r�\^Ӵ3]?*
�ku�G��!���� V�vR�[�!�H߸5�Uj���l�է�`����	Ԩ@,�(��q};���[!�_����S)�
4�%Ǣ_��\�iW�\U��`rCmU����z��\���
��y3H���•�z56�*��
\�Q�H}�>�XF�zck���$����̻z�s�j���
�%qY���z�6�Ǖ�9?���$ùf����/N�����}��y�^GB��
ƶ �I�
�0�7|
J
>�j�����5x�fV/8o�_�[�1~]���W�i�}+?`ɛm�%rT%Kyp"e|���4=i�U.�^�ü;C�P*�U_�q����wb�tS�Ɋa"줼�.����)���q��L����c�X׍ڹ�V��a�>JN/��YaW�{��Z叵�!/�G�
̷-ʝQ���傒�ne�M*w�hD���
�c
��G�_��u;
�7�_�V͹��7��fg]��v7f��	ǟ�&��<H��R*���얨��?A>w�叧l�c��90�%��`p�. R�  i�� 2�q Q�"��O
 Y�w 	����\!�D��˛�e��?d���h�
+T�|��s�R�
1�W��Ik���b���ָ�j�4ؔS��,2���p��M�x �2�vq4�� hM<(�����}��޼��`�P�!� 0�vˈ� 6�p �� �; 
r2�Y��V������
W
��;a��y\����4/�Z��9�s
����:�>�%�V�
�� @�b�W�k��1���a���<`/���� ��"���

��	6������[
����� ‛\���S��-|/�%��
��_��f��U#�%�q�`��������_!Y�1{��>�֖�?��U���0�)�r�ٶ��$�?���N�
U�h��,̊�O�6
1~�o�9���(�o5I\u�$�$e��$!{��-I(�[��C�G%�����%��J�q%�AV~g���2��E�g����W5֩|W9�ϣ�Ż��ɻ�ӓ4x�IZ��,B�Ͱ�,��w=؄4NY� �!6�3����z�v�..2��`����v�~��S�|��^^���蕗��wᓾT/��z�!
\�O��L��0-���F]rY�E�F}9Y��.�����g��,��W�:�L���e-�EF���O��4N�'}L���\쵕ޣ>
+ޅ��x��e��qk-��Vxm��U��?I�׹�'/�o�
��
gѮ��m�J���
��:x-��4_F��A��
a�ݣވ�
wE�
]�I�k]OC߻j�nu��λ������a������2'�dM�Ewa�ycb��$��\O>^�b-s���ɻN��N�9�&)�n�G�}��c��
���=���Mn��k�ځ.��??V4qF�����p�M5^XK3Χ[�8&.ၓ��>:���1�F�3�L���з�g�e;�1�������M���KY��q��@Y�WB���YȆ�	��Q^���o���ܼ����}r�30
��ڑA��x�8��~��ؾ	j�Na-.:_9�gs{{�� G��W��
( ����Vl��-�N��
�Em��I>�s֞��׻Xct�X��]%��s�Y�m��Ey�g��M�e��A#��BE�y鲽o�����U�wʷC���a��"ִyfW��TZU�j6�
������l���J���d�Y�P������������
 [...]
��W�,O�v��)�?�0���p,��񺖶�
T�.B!��J�w��j�VFA�ё�FZ~O���,D�����7�=@�X�9gY�J�(���u�ط�R��o[�0�i��o���4��	m}��Wؙ���� ��/�L��4�k�i���W��?`\�N�
���O�mr����TX��X�7����h���:�����+\η�`;�SQlI���j� `�Q�d\�1]Q��Q�G3D�pj?���/o:��!-h\�ZQY�j��/��nY�i����xELN���f�3�)���j^sA�����zyN�/9�����6G���D-M�v�Mm^u��W
+f�|5��h�4u��c
+�9}��+z>Q m<�q5�o�Z-�M%
+ý|���r��)-R��$���n�HsǺ>�����N���ݕ�d����~�T���bW������7V��y�����l�+�ԕ���s��v|�1M1��
+��j�?���#�������ި��Ma4р�p�
K
�0!]k����?��S�/�z�]��}�}|�ej�p9
�+���|
�/��;O<XP[|��+�0'�Ns��A��i��KQ���P��őc���!����s����T
ȭ��aHp��Pȵ�����ނ�2����Ǭ
+ė��
�1V���h�vک�O���ʲ�V�-�~Rq��!�7���ԓ�zf7��i6�̲x�βq�R�eFr|����iS4u֛��l(�O�Q ��_��<�a�c+�݊
��Ŷ��5=a$���V�
~����@� ?���{��я��s�A�Wz
y
�Z��Yb�s�e�@_F�A�0�K�{��|:�U(��C.2�Dϋ|�хE���Y��0|q�ɮ\�����9���p�X݆
}m�
z�n4�^ �0�
���!�|�r}Bs}�
N�uԘ�����;��j֏i��5s��^:�R��V����M���'����2r�H�F
���

k�F+�a�om�Ȥs
k�����H� Y萢7г��CJGjX�Z/�rF �����������[�J�Dt�ӎS
���_T����S� Y���!�f��ID���dx�g�"P�a��(��>�1��s������X{�Kzv�F�g���PI�SC�m���mHR�X!����U�X�d��2 
�5����9����%��(���E�;?n��+�چ���s�rŧF�w���_�*JK�&.��ݵ�0�CJ0T�ƽ^*ӆ��繰�Z,ݥ�(��8��!V#�F��.:�qX�E᰺T�Ճ�}/?E���C�������ݕM�iS��������Z��Z��t���'��H|���$W8��է��
���1%��`��
�6+�6k���.���V:�9Z�����m����r� ���
S�Z�bJ�1�E�/�x������ۦ��vj��e�*d�x�;P/��M����$G�s��3vo�on���cx�d#
����+�
I�"GAB"X�1�����+1›��
��� :��.�{�
bR
1G���O���
)�C{�zƲ�����ӉU{�#9
�li��3oႪ�AW���o�Jy3g[��l<��<�j����w��_�U��ɀ���P,cD%n��I�&�r��b'�F�Xg;X�� V��
�
�A�?J��/*�\��_��O����#�=u��{cfy��(w�q��{Ӣ��k�u��a����7�%���,M�Џ��x݌�M�O���.
'�u
?b� o{�
����<�����

�汿���~Y7�[#�q4{�|���RcхK�E.>�<�]x�p:���I�|�19��>4�ޡ�M�f^B��}+
�J�MQWU#x��
�u��K����~��m%�w���C� /t�"�nR��	}?�>8�]�1�Q�w���
P+]q�]~��N;��t��	�9zr�s�rP��}��4�~?�q�*��f�Ԍ
+'��%��į����74V9��u�"��T����S�d��&<�n��/o�Z�HWzpXDp�2��=�g��4��s�,W����BӘ-A0{�͛���}�h�ָ�6��N�D�P�l���_۔u�+�Z��E���ݖ��eN(��+ӛ�j����/�
I���/^�I/:6�^B����we�z�'�|���j
��t�v��٧ȵ���ѕ�h9���Pu����f�
L�N�4�{��6�ejf���R���!l��d���
�j9m���̳�ٺ�>��n��8 f�j�h
'Ѐ�ֻ�L[���Z��f�R+Gw��eK��Ӧ�u��X�a��9B����u�Dn��%�Iu�Uk
sl5V��j<�ոZ��1P���������Ϣ�2�\���;��3�G
87����I���=�]��5g�!���\Fo�^�z�Z+Xj���nW5�V;>�\���2�r�J���ˏ�
/[j)˔�hGsKɭr.9FX)
i�*%1(~�b���ϝ�]���s[�̧�F��;��|g$R��]�R����G�̿�p
iy? �`�F3pt�v,��J�ܢK@|`�`%��ծ2�|��;�����`a���Bd�F�j~���bpJ�MF���
+���.͋������y���6z�PM��0ML�'���s<-�ѡ=4_"Z�!A��x���+���ⲹ����cj9{[
�%�g�J%b�-ƚ ��X����1 �:- x�2� ��R�
p��2� ��
��\�?���sF��G�_L�(*���k.u��!ʻCF����K�\�V�o�7���C^�:�k�q���$&â��*
�Y���I���
�� c} ]�
�^���oo�l_��� �]
�x�����s< ����R���)L֊L1�P܆mc�'U��F
+��Kܬ�װ:k>��b? ���z�}�d��9e/��h �$� 20m _+ 1�
��
�� ��:�N 
@
@w�
+@��
@�
�>�*�����6���Ʒnٞk�����Gcv6������`6��f�d��Ѣ��<�nP*
u��ϗ��ݗf b��w@���<�P�X��I��R:� 
� LQr�p�YpP� ��H nޗ 
�/ _��ǜ�'|�)R����t���~�q�1�2���"4�X�,�����ݘ|�se���"�H��S]\�
�oPf�w�V�e-�*��n�S�;�Ϝ,�]��I��m�Z
a9�֓?��_���!d"�+0D���k��@�.'��R��d���[t���ӓ��-3��$�ʹߒ]������"��
����U�������X��Ў�S��	
�������ߵ�L^��P��(&�N�0���
5��xg���%
��ՌU/
�D�S^v�����I���W�q�/Nѻ�>�2y-���+/&�g���Ϣ�
as���?*��|������w���e���Y�a��و��b5�o

��?up��8�
��0g�En��+?)IO�X՟E�k= [...]
�x�{5�`Oj��
7�y;
�ޭe��U�x䵳�2�Ya?����z��/�o�˫xe	z~��G���
�73:T������ʾ
(��0f�?dy�w��ge>y�k*kV�N8ų�������_�ƃ�����/���;�������*�_'� �G*�b�T�
�n�},
�����q�� ��
�qtbb�٢��>
6��� �&���%p�	���b
�=���Zc��t�g���.yL��1%��5���5��O ����2>9^�ɧh
�[��Oڃ`'Xi� �^O����e���6-lБW
���
�}M���0LVc[1�M�q
��1;.�F�G|�k�~�s������ө����F���C��g^�R���u즴ϝSJ��ǒ,��#�Q�s��Q��Jf�eH�=b��,����S���ڧo}��\�/�B���u�!k�-��=[���}�{%��a��y�^Z��_�m��o=��#^��Ʈ�F�v�� /)����sw�u����Q
�KZ��m,�YJ�X���d������µ�hF;�7V��
?��'u����
�'�
�<�m`E��3�
2��m�8�^���)dh��6���K�y�L�G�덍�Sᾪ����{��"�&a������!��n⟌Ay1S���R"�:G�u����a��;�@@0�.��ڑ���rj
�s�TJ�q�6P��Ȯ�7�aO���+{S�?�N`uH�������-|ߏ��8��Z7U^�
9���-
�&�
�mV
��Ÿ]�nX���{
[�⋰��w�>S�C�qA��s0gv��l�3�S��_�X���^�\�s��F/��@���l�qQ�U��ڤ%K]���[���׊��M��-�<
Ziw������V
<{y.��}{�Ļy��~��S2�>Ҟ=�:M:5�gS^�����1{����ъ�e�����D���T�����ԐN�5"���(^��N�W+pb�o��@����x��/�ݳɞI�HDOP��|/��y'q�����;B<��ꫳ2�p�&��G��5���v�R銩
���h��F;/˲^1�ӽ�I]^��D:����N,�P����C����)�
������<�}�����rW�2s؉��T6�P�|�s�3zd�
�1��h:M�
O_���6~�*_B���7e��ٙ��9��6��,L���NЏe	.,`
�x�ܹ��s�!k��1b��:gv��bD�3�׫�4�K�?�~��B�ߟQ*��2�j��٩���a)h3{�u{:|�m���j [...]
+��c��n'���φ�;�
Va(�'V6*:��6&{
+���Y��G�&����dQ.`����{ۢV�/�ݞ+�3?��Im(�����fB��������c�"X�m�^�0w
��fB�RD����BCߪ�E@��!�f9|�O5���\Li���Y�h�n7��5����ѩfc�J����a�����9�I�^a
��
��eW��Ԍ�~�'.��qUG`��3���!�櫼N�!ҧ�>����N��+ at 0��4����aM.�p�\DZ8a��H�~�l�ؙ���y���������;���u�]�~��B����<��e�n}}%A���b ŀ�b��#��o�~z=�z׷�\��h�B��c2�����N����6ܔ0�0
�}`
���~[�Nh#t�]�E�\|�
�0�ܒa���wFD}��3Ol�-��F�͇Z���?��°sJnw��t}�
+�ļmq�%���aG��D~�%2�)F*���G���G;�/>����x\�������6�t��n4a�XmT�!�e�*Z1&CA�+ɺP#<�V]Pj+�b/T�/���
z����۸��d�M�1�t8�
�T� �+��
�xt�O�*\?���f�UEd�uk���%�1��>`��0��y0=fZ�8^�}F>ӭh	^���X!�Y�F��3�*�!j��$g(�U_�;�qI�5�Y�{�������1=�
+�Sr��N�Kw���,r�Q��֠���J�����nA�w�ggG]�J��h앺d-@]@�M�/�f������Vւ�>�}i�ͭ4�k�\WW*��˵eL{gK�<P����*͇̗[���-S��Y�n��뗈�P�
[{��l~؇�fj�1�����tZ���\��M�'d�$�c�����o�F^��Oy�ɾ�z%���j����y	S
Q��ځ���{��t�^W(~7*j�IK�.��
��0!8�#�Hd�J[���_�n¾A��L���rDƕ��
�˝T/8�
%E<o<Z|

���<b^�L�*J�l���֤�����w�������/���ClBz�ξ��ΎD]��+;ޮ���;JF�rg�QNfXG�K����N�u����+m���Q}�u"����5��5���s7����lC���
���ݲ1.�
f.���6�o����2bJ�f��d������+#�[�Ԝ.u�e�h���p��L\>���01ˡF*M_
+�
���G�a'�"9tl5��B����/$���rz��	
;�
+�6��߆�(�	Ԩ�
+eU�\6b�z
1{�5��3��5���9�?���B���h����Q�T�E�$7rAmb3����ũ�ۚ}!�ﴘSRԒ/)˥�g/��� ˡ0����b�BΤ�C9sWM��p3�

8r޷>�]'���T�9
ؾY� $8^ �I�m��OW�v$��@�>蘣��Q)�p�>���R�G�Q�<�
���6;
�R7�f.���,�Jfz(2
Y�K�bK\��7_W �H7 wt	�s���3�3[��%xT�
� �Wo�'�d]	�
�|��<��	D�/Z��W\�
�V��S�0�L�M׻IP���(�
QC�7��`�ƮĦ�N�hɼ�bj��U�o���Q�w
�l%�ց@L;@�
+�:���
�)���Mf�@D��'�\[@L�o fd
/��
��d��dS��6r�4#����i�D�rNlZ� �
+�:śu�a��d�% ,�e �S���b�\b��1j����D@����׷�w��
=u �z
�Ec	d���\B4 7� �;�g���@nq��JF�˽�"����/��gL����cR��F�
I��Sj�j�O��DH������^���n?
+n�8�b���y
+mA@)_�@�:PQ�
T
+YU��@-/t�6���\ou8�:����*��+��6�
`��������]f��e�Xmn�jk���j��/?A	�z����m�
y�N
�ԯѶ^�O��@�
�D���d�~�8^����%�uHO���ql�F	�ߛ�?J�'��RB?w��˿�'�6�O}��h;k�&/cu5�?�\���{�*���7�?�f1���W�~o���.�O���*���Io��?���w�.�|͢S������ǻ
+Ec��P�<ܧy�~7�
�6g�ĭr!���;�e
|!���a^}�ͤ�OTJ�ף��ڟN������qR�eaF�
�]����ns�fްV���\W\�~%�~법f�
,F�v�����9u�����[豇��C\︇������
+>8����_��Ӧ?e"iW��ξ�K��?��x����.gw���^W��r�
+����l�33:`�t�o�{�7��7��nQsR���Z��3�|w[��dF�8�\�]$�W��������<ז�����"~A���Ipq
h�9�4,�G~:��:�r%�Y�|�s��Y����E�𠮳���g7;�
�X�x���}�֯����+f~–��5���^�B: �<`�R����X�����3t�çs3�M�ȓ��
���A�"*b��Bd�4�x�LVtq<��4s̞�� 9��znol+�vΩ�z���ʃ���_��
q���<�ޭs�[�DP���'v��u�6��40Y��̄�w���])�N8!s�D���	x�ޮ�̰7��˶�Q�yè��M��3;n�N�w�Cut�!�����⅜*���`�g�n��Σ�6�2����
��^xc����#����R�w#aV��t��

����`�VEF��g�G�ψL�g��HW���GO6L�_��Q-�_�
+�ܯ�3^y�g����4��vj	��x�l�_Hx��r��s��U���R�Sv�/�f��DP�$�=�ޘ���x�[j�{��i���-��օ�~8
;�
sm_��T�_Rm���'�������;sRo�������n��X<�x�q0����)n4��ɲ�#	mo��etL��5@�w���l��c��U��_�V���_H�ˍ�ι�:
Y�o!}j�9�݊w��1y� �=8��if���ݨvz�d������cw��`���y�p���N�x�z���
��@a����6����ѧ�ij˶�Ӆ�����rm��SZ�ּ��S����WL����'�2��
yod���t��B�<���4�[�Z#�U�
��\n��/�VϦzL)��G4š�{x�_�������t���Y�˥�Q��*�[/һ$�%��=^q��4��%��0߰AZi�c�t�l���B��d v�
5�

_�ގ�����(��ׁ������ԥ���u����y�ҩ��[n��ZH����aA�E}" :>C�εn�G�_o�����n���`� ��ݭ��d��+g�L�"k�S������E��cy�؃�Xo�[ƴ��N�飊��xe·F���J_�����V&�̵LtR������Z���	���2ȶ3��޶��v<�X-c��=TE�����\7#��X����Ź
OG֯�
L^���p�
+yтqZ���J��&�J���W�㢜#������������dK�S�ӭx~N.�����h
i�'F移荌R�s��h4n?G^˛e��f6��\���:��NM��{�<L��!��=��~����δv��
r
��ue"�s�.�F�j��=�5[�5+^:�cQx P�>
+tz%e
��~5�~��/|!�9
*��푛��$(_�S����Vѕ��z��]jZWk]��
9f*6X��U,��j�-+���T��ԣ\`P9��X�J�y�
����
)v��J�AD^Aq#c��o
����=����֋���8�A=��*y�`����<����<E�����Q
Ҩ���Kw��R9B���\���s��)��뜌�uؘ��ѾԤ��yjo�&w; E_>��0�
����T*��t��>����*i1�2�=�.�]�
Q�\�I_T>��qT����.��qö��lÍr�Z�!�f��k���Q/�5_�L{�؊�H�؊����إ��혧�;4���Hz̟�Ǣ�6���؃�7`�Q���0�u�=ZŇ
uK�j{�\�\
7��*��
y�*�L���
?P�Lx�`%?��86mJ61���qS{s��L��:��ը�	��	fJ�iZ1�G�T��N�(m�A! ��
B;���.4�_z	�m^-��vX�A\�
Q��iE!Wq[���Lf��U�LV�HE��<�s��i� u �(�o�����&�y%�]
+��Cz�t���vs�u����6C%ߥ�L�t����BP[�;N׌�&t����Z����Q�ޱ�pJ����r�|x
����ԙM=���Ǣ\P�>�B�_�`�Kj!�G!h��B|B��v�#�ȍ�����#h��׺A�վ��z���<��EYkP�Wh}�.*z��W�����J:Pk��
E͝���z��_rK�!R2��$�x��P��
U�͇��L��bf���ip�bc��>|���s��
/[�0����l"���b�n���~!�Y�N%�
E9��F�����^�j����)_Ph�\�Oа+����t���=����7������A�i~�:�_��r6W^8}v�Z�XkZ ,�`��!����3�
�c�-k��L�ԃ
�T4�
o��\;��&��~uQ�8��27
+�2�4������vV�6MF�,>�ײ��+��ž0�[�0w~2��x�J�\���R����ЗX��T�z=ס��΂n��'u�ny�}
�Ӭ���ԩomizWK0+o>��=X�7�ѓҤA+��
�f�J^kۦ�
z���ʾ�'%���w�:?ͣ,�$����*W�6
�r��z�uDz������U�o�>0�E�,u�J��
٫ɳ|�����1�������Ao�����m>A2����lUR�d]Y7��U~u��S�bF����ͮ(�È�*�s�F')�/O�G��g�f��E]�f���~@	�匼�^[R�з�siC������I��\���9��
e�z&��$҇J�H�-��^"]�&��k�<6�Hr��Ts�z�_��<�U6�r��#�1PK+(�NM��Os
!&��a��`�h^���s9�z�U"*�
����D����W�ⶶ|�D
+Kg7�&�%�k�/�)�i���v�͜f��95+���d��у������A��LF��=�vD�b�cwV�(�/��r�`J}Z��r��2{%&))�es���
���#=�yF��Xh�f��g�
�tT##Х^�v
+��^
�r�x�Ox�C�H�Q�rj� �X#�C��[�%Ő�D�3{���z�]e�A�R��ޚ�c��<W׈;Ojy��u�����KB�F�l��(i:�rS�"p'
f2�vF��
EƗS.��_
�H���r)����� ���
Z��3��0�ڤ�d]��-Q
�	�F��(�=�
�.~oS5�إ�S�]�mh�VO�8Ec+�:¼�T^}�497Dc �
q�
+ԝi*yxq��<�%�
���:r�
���
D4Ghލ
`�6��^L��&h� ��s���`�.
��|zz��Y��Y�Ln��M�k���
Lop���\��c!f��a��qSk.|
J�����N�N�&]�#�����\���C
��G=�r�,`�Q>��
����{޹�8<�
�Ng@�

���eai��J>0
/��	pe8�%X��<t�SB^ٲ �c�z�v���̒1yiB�/���T�k��n�3�z���[S~��6JӀ'�
�%�O0To޿m at 9��5� �;rxrB^�$8�@���ٶ��%)l���:4|
�`��]#k|���Vm8�\��v��n�g�����S�Hh��^F9�m$
JYf�_=Y������"ڲ���
+��
���"��XiN�8xl��v_@*�$�zOH����r �\"���s
�����Y�gz�m]�RipZR�vfd0q_
m�Gr��#���t��7,�j)����'Gh��\���o�
��[<?�No�[ /�?!�*�e0� en@9rg��p�X�j� �p��d�8F	.���L B
.����9yT68��'_�'�^ף�?�ɟ�|��_����J��
��,�K��$�&���Ʒ��n۟��}��)���;���2n%Xw�X;˿����c��n�������q�����֟�?	<�>V���#$������E�~�>:��\����GQ���omQ;H�����M��ӯ#���1�~r
�J�F��xW���XU����4N���;��6��[�
ݮ+�����G]��d_����|("��;|�cX�QG�K���U�(�n�S�SۍOz�G�m� Z�az��O�M�6'���m��}ً���W/���<�W�̄���\�['>���� [...]
��w�����h�"��Bv�C���A���v���/��Vj�}�g!�@H�nu��O�"��}�E�y�\W�4��}lufF���O��2���/��p�
�ir�v���҆=��
��+/��-϶�/�m�X����N7a
����l�
����i��'�8��P
	��C��U���e�Yԙ	�ұ���C���
j����t7D����&\1�d��`�rqs��B�E�y@/os�t}G!�F���>J���M熩OV%�6q2��xk_^cr�c7��~����?��x�!?�
�o�;jS�S����o�}��Y������^�KG|q���< �r�;c6�:X���{ט�
+��ā����cr�C/�݆�N��:t

o�av(��B(%{��� ,�Im9(���Ь����9�����2���}�ٮuL���t�6
Õ�j
iM�#�Z��~�8�F�x�-APx� ��6r�!�d�7�y�4�.�
�]����uo`��~Z�L�%����+�������2����~�=t�]*��;����ie{������rMþ�����.*m�+����
ޙV��
okA;d�i8�Çu��s 
�5(�(�?Sd��^��ET�^��~MK~�y�u6��҄~!��k�ڗgtmwG�z@��4Z}o�ew^��愸����v�}LИ�0�ۣ��k����Y(�x���a�B�!�Ț��vw��2^��~����p�Z��k��mą�s�֠�tid���l���z
.JKͦK�k-�=Ct��dN�����|7���q�`Ӫo��N���R;H��Hz��my��G�b�����Smv�Q;��� �դ~��K=�D��~��uڑ���5ipk���g�vqsj�R_Hݾ2�y�7��Ȼ����9�_�o��N�� [...]
+�zx�����~T�9��
ץ �ve��Ǭ���e�(�Z�4�2w;�
+v
�eG�F�\�-�.v.Q�^K���k)[��=�p�WjA�!�&R�
143Z������0q�jӝ��L��A��l�Z17K��HG
G�ŚA��k�h��z����V�*#�ץ*Yr�����ri�S����W�&;W�nv�/
+���������1dټ�%I/<��6So--=�ꢸ��ڦ���V�6<S��s���f�`������t7���l
ﻢH��q߮�Ju�~\�*��Xe�sI�b%_��"g��V�x�NQ�.�B��
��/��z��v��W�X/:
X�편�a`^�:rQ�s��Rk�cy����Ƙ�ɴ�5eZZO���M䆹��'|�
+�����v����l}�ɖ�Z�P�+��K��	2[�
+v���_e�%(ec��F�<���9ёXh�@�L���K��V�Q+�ԡ#�KwM��B]:���7&q;� ^���3W���Z7�0��>�s!��/[��Ę��&�X���*�L�J�8���3H1F|;g��1�1�N���w��au���vi<S	�Q��I!��Sn�T:=-R⹾,���%�4��VP
/Ϳ�ÿ
��A��	1��>/�e�x8ht`����^Ev�u>��Z��A.oZ;�xu"��f
`�n�[��a�������D�TU�WC!�\O>��쥺K�l�wI�u��]�U)Q���E�{�
+o\a���Κ��2™��ř�Lș+$�&��/Ω�,���24���U�Ѕ�S�J��	��Ԝ�ɂ��4ݜ&mļI��sZ!����i�(�ٺ����#	�9oq*{=�@\
��:	 ��0�gx8��R�*�����fY6-����Ս�0��iĬ���Y�6ɖ
Yl�MNs�i ���f�
L�m�ܨ\!f�d��� 	R
m�R�dq#]0����I�˳
��#˂v����]�p
yx���
+���+��.�6�fw��1�A�:
�n�pD
��:z[�:Z�:���:r�!M�	�����x��]��VI�Gu�Y�,46��a)��'(�ZVf`��Nޒpf
�Ѝc~<J#<B9n�ux.#:�x
��5�,nK=fC�'Lm;Y!�ڜ��)�N�����D!�
+]'��p��{~��F�K�|.�{����F�J�Fx4�9~�
��fe�eL�sˉ�8/��
+��G�n���;�������7C�>J�ǻ<ݬgE�!�u:��kA���C��'蔔Lu��ɤ�U�8�{s1g���<�!a��/�@X&L'�	S���ŃL
+����A��sz����yb�K���{*-��w*/�p2-�:U�E�탩�� �JJ�
���B�Z�L�޻��
��B���Vz

1
݀H�A����	�6K���<��NW-a�������c���1�v[�kLض=O`�	�^������T�R{�^X��Hü�g����Z���H$��;�b�fS�.{�k��H/���� ��L��<��a����V^�hΪf�ױ�i�����dy��<�[��dq�A���I-Ti<�ȋy�QEO7ѾU�}]��V��u��ͺ��
#[+���,�mIǐ�$��KJ5(������T�w^g�;�)u/ؾ�
�~gE��
D��M#�`$ ��RGF<v����)<�sG�
�0�� U&�a�4I-_�B �)W�J5@Q�
`�@��u���G��G�3{��)�+)��%��f�p|#hNΡ�Q��"0<�׺�{Z�xs�K��39J�m�SN�B;.ā{=��������O�Z*�>,(@�
+��L�v*T�XT
 U̍���\ƚf4_H5���� y�su+R�����<���@�ߺ�ع�b�2�Jˇ�3)�8S��A3]����Ҁ>adS�ki�������o
6��%��
��� � ��*��9���!�g����F{��O���2��Rs�P�Qd��@�ب	�Ԩ/k͆8��e҈�-�����'`aJ�f�k���<`��ؚe��kv�MlO���o����Ak
ؠ�vX�$߅
-�
����T�Z��s��w�zP}1
��l�Z��	����.��{���4e��䷏�r�����KQ�zr�����t�
�e�=�u�S^�r<|�}|��&Xj�Z
�K���<�C��x� �_���
t�ɔz
s���%�e��O�Msգb��cR�:O�����
+/s�N��+%�C	�ף
+��]�?"��U��@X�] ����f
D�z�7,p:��
ē7V )k�@‹
 ��
H�T��K�j�J���Ԍ����YHV���
��g��D'ނ	�g~Z�'�F�3��G"m��|���R���q�J��ȸ��u�yi���PPԳ
m0�UO�]Ӂҩ�2������V�2�{	����
���줥q�y�'C9��9��q-q�&�!|���&�uT[	
��黋r�Io�o�vG���\�@��p�^�
+�8�	4^��>0ힼ'�@����٪��?:�G��`��u����_��ƙ���?��N�8�c��&��
�q�n
�:C��%�
��W�~Rb��yb����>֏P{����#�~��>��w�n��f���$#���D̄ǻ��
�r]|@�ݺ��{��6��mN�z7�M��+^��D���ԟ��
>ѳ����ӹ<�>��	
�h��Y���Q��X�
���hK��
�~��G�]�}���x����3��e�W�B—�˜*�;7�<s:x�����ǎ��Y<JK�r������8���)wZ�О��b��!�b���ŊY���
c?��o�r���r��	�E�����z���e˗��Av�S'U
��<;�ka�7��ng����\��6���Xo��{MN
��C_���J�K~�
�
���س�zY$=��s��!��J)Y�:��~
�Xtd~��O�Q���/{p�C>�K>��\���9F^o��Xy���,�eh-�m��*hE�V�G�5fS)���x��ε�n [...]
���

N��u�Xo�l����BZ/Nѻ�xFPg�L��$;Y#rBL'��MGrx�"=d6�9�Kk�Nnr�
��
�+>
��@�ޟ7h��|one;=l�Y�����!�.��#�{�ŭv�ڍ}�6�|9��%Y*L�ҭ9!��^x�l'��sX
o��q(��{��n�A(��4|b������i���K�����,���N���^���f
�J��g?���6�4��m�tZ=�<mɐ2�����������k
��z9��ҳ��5͚�<���l���tT������>�T-=,*N����Uw���]�޺t<�w��jw�M�-���q�%���,�5�^���E�T�5Jo�k��Fõ�(tqd�o|!�L��
�Z7c~3K��Nخzš�l��#bP��~�Q9��z�Z��{�[�ni���G�R���N3G/��\���j"�7f�&�42Ҁu�Isq=c�k�b���wQ��d�5z��
n�jؾ
l�y��
����U
��<|y��B�� z�
=<����b_H��u����ڢ�ޫ:7����n"ɵӨdѾ��2�z�b��$f�k͎��1�
v��n�0���U�h�B԰�AjX}W��j�-&ߥ2�rv����t��*hP���$���2yܧ5�9�RX��
�zGm���^�3
��a��/9�>�b݅�bͣe�9�����7�o��Ԗ��Š����������B�
+S])
oZy�v�:����۔��5w°l6�g&��oR���g� ׭�����kx
�&}
�
q�,��7ٰ�
�:w�UߞtP�zb��
��O
UkH.��n���*�a��2)L+��Y�-�=�q�K���BJy2K�
� ����kk�u
+W�>/t�wAl+�ѿ-�F;���~{[��(�Wn��.3�}�i�����0_��
عT������z��pu�L�U��
�LQ4��޲�x��,��3���#��{F&��m���v)ro�]�
�LA���1����4�Q
�ꆸyj�`�!���;����+�V�v�n
������ßV�rjJu�[�9_��Qu��ND�\)��ﲝ�ӥMB���F6�eOw������*�2V���#�gKcp�
��z��
���fn���6dW���P�:�MY�E��L+A��؇L���Ru
h�R���w����gUw;�D�W��q�S�9Ҹ��g�T�ϐ�l��؁�\��օ�t�u#
�,CK]]��Żz�*#
:�3m:�n�tj|Q�W�[�M�9űj�����Z ST|�gT��β)yΦ��ȓ᾵��
����?f��7�J�[����w��N!�2�����]
�
��k�W_#ΘR��U�a�^Ҧ�����eK]d�}���L�l]\)Nl���}�
����ɉ;�Vŋ��¦�����z2�%/�VR���D��{�|�B#-��n��7-D)ׄ�!���Y���7��z�Kឪ� �����<D+=�+nQ�	��%
eݕ�_�R+��{�]ymF2��"������e?Ȉ"s�~W,	����a�my]/Ѽn�5^�M��	����
�9s��T0�\�
�^u�19�eJ�sp�Ű�-Q��p�'C�����-���*��R��J^�0rc6Wd�|3�C֤�YmI\�>���D�˵0�RWAYIu��r#�O5SE�x��
�M��HʑlD�6��&;{�
��&�PXcJ�����o�)�m�OЦh��+�&E�x����T�Gm�z�Tk6�$=�oO�r:<�S�w���]D�
Q��UaP:��Jc]�uRC~�n.��mr�L��搗A�c�3��d��b�,�wC��� n~!
~9'#`���	�P??�����[5?�>F�R�� ý��;(��t+7��Jj�
+{�oUoB������o
+0��)(�1��I�Az��������m��)b�b-uǬ�A�~���OC���ɥ<�<������A�L1͞K5���N=|�=�o˙E��Ҟ�⦑�b��eL>�d
�ϼT��2cx[�?������x#'nZ��\)[D����c��c��EeV�\�q�Z��e�.�ւM��5���b�0�_��������8/�(/�f^J�|ϩ��^��l	rmd�r�g�s���6D�z��/t!����[!�Y���-�^_�\��%�J6[��\�{�w��E�o$MS�HRǂ%P쮫��ƢBv�g��l?�(���c2
�PN��װ
+Q�O>���<J׈�)���Da	;D�J;l_m�Y���UíV�7�<��*���
�o鼼��`���~�bj9%�ZmdAv��>�H�/�����+-?�{q27���'L�S�ȥJ�E]�@Z�
����gv���Y|�M!)V�Q��bE�6���������������
���������]��VZ���/D�.Ge�o�n�W>����z�_Q'����hBL��%
��;�Ҝ\p����+ at f���H��b[ĶȲ���Fz�^�yF�O_����4?̪�M���
�P����R�ӼX�E^���t}q�z8�f��)y/O-h��Uo͌�>����7�:d4}�n�1�,�i�����U�g�^�H_2�6�Y��`�/��i�w;�h�NJ�ܷK�SY6���-l�P�ax��D�0/��
�
6
.t�6
����Jr����sZ��r�DhWq4rL�w4Aʌ������\�����>��vyKL��2��+Q�ſ'h8�"�d��'�j�+�X9 E���� [...]
+�7�1�WWY��|����\d�̇��=���m��l]C�W4#�I���0�1d܋I�q��R����
�KTM���9�y����������9�y(��d@
�j�Q�'z�`���;��B
�,�� ���
 ]���-S�Z����k��`(�
焂Fl�]@�����!����K�����{x���_H�9̗�Z�[@]�
���ЩB
+�x�4�	L
�ƾ�
$8n]l@�6	�%�hy�4�$ ��;	�%�Ag�AR��=~[َ.���T\u����@D/�4嗪x�

���  ݋��2w8C/���$�I�g�P�0��� �A����I�z�>Ṣ�&�'�E�3`�2�����y���@���6�vpM��?�`��V��<
����dq����k4����,�P���(,�� ʧ���A ;2R��$-V�R��`C��N�<" �Mq�c9pZ� ��.��ep��p��pg4���x0
��ޫ�ܭ*�� �X&�
p��ބ��ߚ�̨�
�H�3-�\�Orm�cRN�M�EJn�J튯�
L����c��H���
fC |�+��q7;�l	P�>l�C�@8/�@&D
����@�{s z(Ŧ	D�5b�N��Iv�[�$g�K2Z��RN!�>�����U3J�]D"�ա��.�i�f��Q��U[��V��s
�o��b*�} �N�oO�F� �;>��n@��Woȗ�(�
	�� Jn�J���J�dW.��(Ͽ�[*}�Jf�
��4g
�L2
2';�)�oG��+��Q���C@�?�~��#ݖv���
Psk��
�+Q�:`4bq�0���51�&���64�+M͎�Џ���g��M���o�mk����(��F�ϓ���O<��m�i$Xu
G��,V���f���X���i>����嘆qns�1� ����8k?��m�uo�����i��GO�ȡU�Ok�w?a�G���͈ͤ~#���E�nn�6��V9���+W��o}?7�۾�A�>h�d��
8�����ı�{�Qڢ�!v�����:�5U�5
_A_D��H�9*��"�Y�9�����}�<��5�-%PP�zV��ʴ���s�ěگ4�������{Yu�
܇�����`zE���y#T��R���A�y�c'u�:~� �}t�C}r��6����m�F�n��z���56�D+r
+ϗ
d/�UU���w��8�_�W���������C���ًv):�lw��}�W�}i5v�
nf<�Y�������ro]�Qߒ�^�����W�~�K��}�c���
��ԸI�$V��
,J��Q�e1�{H�
c����W"�
:���8�_-����v��
�C�^
v��>o�g챪�Ωe#�������=�+~�n̕i�52&�}���wˍ��:�2��hS��G�b��˷��/��4�\a����K��{tp������Ь��?�j'.o��x���Ӊ��;c��,�z!�K�]85�����q��I�4�R��

Cf�AH
���	�}�4${=a�vߝ��
*K��
l�Nl��<�������h.�
�>�65n�ǣ6��2���(l���?�k�_4�k,���Q�I���}��ͭ���{�`��ۓN�xl�
����:l#dz8�=�pmm���j��+
��\�`�y
+9�
+%-�v:n �V�F��
��� ���{�W�V�r�_�g2[p<��Ӛ@��t�Փ+�h�e�A���ޣQF�Ɲ�;�a����6e�	�>�́i4CN��k[
�C�=M�74PL6o��uj�kqq��9�)��*0�ħ�.��J;ݻ_,�*\c��!_�}��5�������I
fl��c�7{z���|��U��jm�Y6�h�~.�3�d����\7��U���R-��u�s�~���7�T�(ZT���P��כw(S���D�%岘CJ�N�
��[j�&�}�M1#7��R
�&^RW~
�8�u��<5����
�=�x���]�h^f*P�ѵ�B�S�o
+ɽ���j����(U�WP*�q`{G�S��YR�^�B��Ne?P�ng'�.̮ܗ�
]��x��V�ˬG�/L5�.���YT�+�,7I{=@
vR��`�_�bu���ʃ����7/)�h�N����{5��?�W�T׶���4��
+�T�2
`��r��Ta�����r�b�T
��Z��Vaz�z��5q����)����\�&;����ѷ��V3O�cf��G޸Φ����i��?|�/��
Lz�{��}Jjd.C��'���V�����Z�#|�(=���
b�[1v�Pr\�#C\^�e\T
�i���0(�~��[�ԥm5���b
qn�����q��]s��t*����*:(�#m$�Yͼ����
Z�n8_�@߇����{0ꠡ[^�T�׬�|�����Qa�*N0~R��ꦐ/�g��s���.-��1i�-[-��Q1:�f�2v����u��6��F3��A�nN�\PQ�I��2�Ji��Ը��:�8�X�Ҷ�
+�3����7����nz�|��2��kv~�@.T���Rl/�J����ci
vםy��+B���]�P���X�����S-��Yw��A]��N��P�-�+eQ��
+�3`��N9�Lj�H�[�����Kb�CE<�O�x�ol��,�>��
���4u����P+�0뵏��;>��r���w6��Dol�76�B��_����-��i�0��lS���D��b-�U��
�ⸯ(��nʛ
ӗɂ1����Qb�tZ<	UF�;G[h��� ��� �51A�R��P�����z��3n�m�����ٞ)��\D��d&wwo�f�����$3�Ӵ��`C۫�M�"�
R��3�`�,+�%��F3���<k�@⩿�L�k������#�^�kr�r���ș�9�5-n�:�ifL^���0� }���iգK���~�B��MαG}6Ӎ->�����"��L���V��L���� '�҈O�-/��.
+%� �P�*�U?��~�k}x������c'Y^c��:�-l���1s|�2s(o�Y�
"k�� :� k�gw��nD�.�SD�>dЫ)W��n��T���ū]���Rc�_�gqu[�'yR��DF��uT��-��&2��f�27r����~��T��ݧ�̼�#

+�
+�7k4�W4�*P4~<t�~�t%w6�r3OI�%w��k�qg���FV6��Z��%9��V��̩��'��Z]�%�}�6�f��Զ|?�\x�<>A9�*�1:�NN5�-�����G�-M���]Y�NԎ�a����%+dp����J�d��1=1�õ��7��M(�zM��v���g��.Rf�����c������[=��:��>F|�LŜ�E���l�Uy��� Ô��<�n�4���]�u�&��GՍyH1��l�=�����i
~�nJx�ޞ�@x����n����~)A`i�8/h����
+F�֨��E��Q[�����W�g-'�7rm��
+wK������M��,��>���	]m/�4)�O?���/�>�a�)5q�N9�oU�*�E�����Co��^���㼰a�Ic�W at c����Ρ1�jXZ"�93���0n�ȕ@��1�����m=�[���+|KM93�u���آ�`%)��6�&C�PgDd�B&���[��^��K8 e�&��v���gD��+��l����d	C�����\�Ep�
!��V��p� \(yd�VZ��qZ#��������
+f��*�`���q�%�<��e.]0^�ݡ�c�Eܐe�k�����x�e��:1�
Z�HW4;)��\#��7�
+a�F!��4빚�eC�
�W.�A

n�B
n�������eE��W2N��*�)����d�

��4	T��^�0�����|��3�!M��=�8؆�� �
�Nn���\=��~�
=�٣=�d� ���E�K�1p�[�x�*�=�w��m!�5�2��(e�۪���-3 �\���
+�D�/n�1���T�iS���h�Pm�c)��KW��4������m!5&E���z�����m"dԳ|e
���Ѕz�y���<�n	��=3W������XĴ����G�fʅ�)X��;����p�aW �
+(�b	,���B���R^���}�(�� L]>��$4��J	;����;Ƹ�W���"�����
+(hB��*̘�m/5Wj}PI��Dži�����=A	Np` ����:���	��3����_�0Z������m�x����t�lT��v���Q�s�|�҂�_ol�A
�f�����Ev�(wH���u ]�F��{�k%�b�&�|fp'��[;'�ހ�g����T $ZlK-LS����
 �A�q(ˀ8����r�([�y�9L����[e��$N߻�+�'u�dNH'�J��^�'uw��1�Z7FiD���̻���Qv(����
%^��P�
	��HL��@rF���BuF;@u
Y@�P�wP��
+(Oq ee��Wd�_��rж/;��+gE��;�0K� �u����S�Y��`ub�3q[}���0iԹ14;[Z۬���>+���o@�0�_i
09��r���
�o���+`J�]�qI�� 0��
�^~�ެt���c��9�0O�ԃ.���c��F�(ȢKAL*�v�3q�j�k�w��=�o�~����m��,��5m�����$`�w�+Z
��QQ��q�����p������=�N�%�c�3�.�}
J=
�����oWn\J�������]r%6�;�A�f�OS<>�"��x�K%�Y��#��
+
x�&�z0�e�_� 6�9>�b�>�e��[@��ɻ�%��:�d?�J��0H���T)a�	�,�W�V�p�i�֑�����f��B�yu��6�7U�����G��Zn�_���O���]�dH�b
���r���u 
N���%�E�	�;r�J�a��r�i[�5�t�=dw˨M�p��R�i)�WNVfzƯ���J�����s�~��������g+�B��ێvj�j�'�mׁs+�n��;^ �ρ�E2	��r�������1���3���Z�?%�;�<
&�NP@��7��p�o�mT��(���q�n,g�{ڻ.n�.����~-��+�B�K��� �`���_@�W� �m��z���2�w��W�ZD���~�o2=���{���>�.�=]�e�\]���~A^�Ƒ���G�/���H9���O��C���
�?��z�ß�ݻ�RwC�
���/�	_���xF���Փ��V����
<���aލY�|�WHpE�p������^~/�aj�>\��a�pg罺��wCb���L?���Qn�\���jY����}q�Ȏ�ũt��������
͈�Zi��h�~�5�~�����׺j/*��ԩ~��#?\ir���nlcjQX�jqE�Ho�La�/��<�
���tg��1���t��ҫ����=F�ff��
|�q7�\K�a�B7?А9,��)X��װ��i0����?��	�����Q7���r��(���do��{>�
��c���2�X8"q�5��KcJ�@����F�+
hW��`���kcQ�'ݫ���^���M�C��wӣΫ��)"���J���E֧�׫���#��֦�m���o3~��gn�{���r�C噺%��
�c��Q��`�@�� ģI?��U�LJ��;�.�t߿w������V&r�V.Bf#���'LkSYIu�V�o�^Ȝ�V�Ԋ'M���H���V~��='7�|��m��7[{�\�>Zm<�2ɾ��D�Z=�=��f�n�[�;�iEnr��^n�h�ؠ
��q?d�q39`�&Y��HZ��q�4z����RH�>�����\-��f
^ݫ��j�}d��W=n������)U6��'Ϣ�?\�48�c�fOuPm�3ߗ�2�5n�G䦙gk�>A������ăk�d��Sn��U�y���|�
5'�7j�m�.�v}d���
eΪء���\����۔אq�|�;R9�7��5滥�����bǹ�%g���Q�
&��4��gVO� ��:��a�-/M�ցt�o��~i_O�K�<�Y�sU�h�M}�U��@������GK�\�e�u�K�!��
�s�B2�w5��/&��w�4E�oGj��S�3{�׎{~cN)�T������n,@�鸧���=���SmJ(������J��/Y���/.�q����;���٘�����:�s��u�#�`#�ő_,3ϪW��A!��v��&5qP��٫C�e�
�j��X����cn�5�0�~ �"���šl��_Q�3�kr����пW����k�r[�{��

�E��/*�vS
|J.���0%
��kx��`��
s�Q,�kk���t�X�\��3�4�-�or���h/C�Y�[� [...]
9,B+�_��͉�!�Ʈ������/�)
`� ���<c\V4��k菂_�{������H
+d2��ҝ�Aur��
+/UFq�EAAv�H^�FY�ӳ�/�}���A��Nxs�YK/�����Z���i
s�=v��ٱ7�[�&��d5���
��ܸ.�!��M\+)]sZ9
d'�6<�x-�=5�⶚udO�g��/�Cy�![��o��H�-�`�}1 ,Hdw�dl)��9+Ё�W�sܙ��R����?C���9�����xdj6)ݰN`��B`�A��k��X�����%%�D�<�*Bʼ�� �$�h%��rE��2��R���K4��Ġ1\���<��8��{6�����+�
�/`��~1:�QDt��4 �
+wl��^iC�ɩf���M��q�ϑ�|Z

�_U-�ȵՂK��ٚ+�X��kht����-�WV��Q\�G:'6��"rI?.Ń/��|��������
4!�`��c��c��b���Ea��'q�:�υ�b������*"H�h3
�0�'m��~[��h]�����>�?�\��Ү����*n��P?�M/x�<>���$�E��7!�ݡnr�L��
��6�f�)k����E�c�]Of�i�˔r���
� <�����`�D�^(�-ۯ�fTi�$�����*^���h0Wk+��&W�zE�׊5��jG"_
��f=��绯܅W���j2��X��gc�����s��Q
+7��˚p��c�6!+R�m_��G�F��5E���E���zv�
ޚbV��G���?�䯞��
+(KIiɤ��œ"yµ�U�Gć��5z�{^�p&7Xs������׃u
&�f�6ʸ�2��сL//���D����>E��D6b+M�΍'�E�J��D��:��M�s�"����,%��|6gxש�]q��N��^�z���,ofb[
�*�<��/qf�
�@l|~�٬�
�9��w���+�}����E�w���$A�`[ n� �R%�m�K�`���(��T�����a�B���UÞ�gqyj�?��!�@:����^�-3XW�����ܩ�G}���Z��T}Μ�J�s��L��|zU�5i�=�R��5�h"�$;�@u�Frj�Y/��^�����w�T�ή^�^̺��-z�����z
�B���O��-
+�o�p�@-!�Q��p�k�%s�E
jXz}RکsE�&����b
��x�>��2��;.U[�.܄:q)�!��y}B\������]!}�^
�
Œ\H`��^Bm
vPh[�Ez
#�P��@HY8b�u7)��Z�̭�0���%����_4�M�Qe��f��u�p�b��W����e�� 
+�1h��QuDp�K|ppU_yI�?X�X�<���3?@�<Ca���g��%_
o�y���H���k,��\�r����
d���!�
�
f 
!m7�H�2��e��E�
+2ό�uFo�Pi+9�s�=��(��w5[�Ҁ���(�uj7
+�5�uq�?rP��|
*�W)��h�s~�?�Q�j�ݟ�6�h��(�Z�4|�V8
��,��tC�](Z�w��3pr�X(��b����T�	4
�Y�"��kk��S����3"g��]E'��t�3�+��
+]�m�ں�I~�Tp-�,��U at Vy��
j�"�*_<X�S�buj�0Ag)���y���L?�r]�I��4Ӗ����:K��3���3��~����;��B&E�U�
]r���[���axzWHz�/�̜O3Ā)�m���4��D���PFV�R1{��lX
��(󊏕�8�i�2h���u�*J�X�s
P��#�R�7��� P ����	@��@*�� ��K^.� Ot�!=�?-�@r�ܿޅ�
:���l/��ÜuhH5�j�?�a�Nl
��F^�I�.,1P1���4ܟV �7>���� {�F	�d�������r�p$c$� �Ks��p
+੝
���{&
�],l:��(e�c��k�_㜊��S��p�9�ɂ��љ����@�a
�:�F�y�נ��W2��z)��(|=�$8 �Bm@�� ��
�yS~$�ga���l%8n �
�?(��fl�Z��j� �ԋE|����
�z�9�����G�d��"����[�񱨓t���s��
� �s���
+�|֬'sA��j
H�Y����@No)@�M��-�iW y8�y
��<Y��B��  ٱj���N0M;�q�J�����7��晼�;,�ݗH
�'Y�ُ!���H>�K�b�T�9 �E���&��u>
��w at s ti� ��}<��kz�5�f�
9@�Y�� t'�t=E��� ��׀֖+�]�\=w�R{mcܬ�ATxv8�
����������
��䯔<G��8C�ʸ���-
6cc�Ż
`+9
����q��`����0!�?tS
���'
��gd�6�`������i�%���|4�.G(���3y�z��rO�C�����x�Ӑx��# ]���zp� ���~e�o��W��+<��x���� �[x�`p��L�A���'@���B^_����e�h���"�j�݀���a4y��yؤ�v1.ٍK6E���F}s%������D��D8|E�f�oxB
�8m~�ɒ���` �sH�(ҽ�����@�v �#���
+dP�)|�4��;_�E	u��K�sז+B�����N�A�i��6��_���������~�op��|��ۏt�dW[�ԜP!�*�w�*�@uZw��Z"P��'
X�
�7�*�f-��U�7�ן�
��e���ߌ�������h[#��Cf>���z�\�(WE�z"n������6F��[\���pY
+88o�:�C�?����
+��W�j����G�+��Y���~��O���8	������C�k�{�d]o����v�d��k�عz���^��3,��0S6����
�E����E{��_��K7���.Ħ�
+����׺:M�}�W��C�?%�WmVG.uOM�{�y-n{�k���^������A���Kfe�ۘ�͌?������S��ro�_����,���K�3�1wu�n��4�
}V���#\�ᾆ����
=2�_m��~Y��ˉ�*�C��
�w�ޥ����>`�j�Fܒ�8��Zf������;�8S��I,���}|�
@8^Z�����#a�ý眆�6|B�������#Q�
������������F�2r�j��GO�.ߘ�mLh��׼zuS��������8����:.>/�16^�F�l�2�a�׿z�ѿ��
�}wz�_����8�G%��0B��a������w˧�b�<�:ᾅ�~
�k3T&��:�M��5d�)&G��S����I��
G�d�
B�������z\��}�[a7�
�^فG�Q�B���,�6�
v-�
�}�v
�c��<5��&
#�5�Ё��F�
�w
����f.��b/Tk�5xǷ�gF�����-����MK��ɚ�j�}�{=6
:������˶6%
m�k�
d�4O��\[�H�^��S{��{�k��Lԩ�'�����g+���w���G�Ƚ��B��izD������P��y�S��*(	���™l��yP�1�{r}�f:��6����Bf���=4�g�\��W-���g;�w����܅*��+���
�}��<�N�ʧ�����+Ef!.ə����wWC�8�:�T4�|�����B�8e
g����H.ΧVR�o
�n�h��yh G���V��ϊ�a������I
oߔv
s5.�P.�~�ҵ�C%9�#�c
�GL�=����bz��
q�].�{��,�u�s{a{��bc5kmzkѢR����ݣ���,�I9f�ި���N�UF��j�M�κJ�#�p�;�s�尭�J�Z�c�����h2¦�ک��8wg��<�����
+������8�~ ��R�y���xEM�l�GF
W���6L�
�d�g8-i��m��ۓ��Ks����
�J���<�c\su;�.��#�(�_p�5`-[��Z��_�L�A!�HF��khW������;���_���A$fL�)�ּBb����HՕ�Z�I54�����~�B�V���)��Q�fk//,1�@G�!.ow�o�o��7`{�sY�
f�؞����
���T��t�hQʳj�T�l���q���!���������E{�FOm`�2ZjzD�q#G�Й�i�`*ԯ���9��������M�=(L��N����Ȕ�p�K6y���HJ@���ڛKN��<����{�j�F3�á�zF�o;�T1,��t[�T��#--�ƪ=y-U���Ⓒ(Hh��P�dl�ŤMa���%rqWŽǹ"s
B!T��>2W/C��=��9�
��8�a�1�C_
� ]	�jR���TYʾ0���u��#���z��?�6����>>t5�Ȓ
+o_A^|(/ž�c���ٌג
���y����ٲ���&��J|�<:�<�\?�s�y
YsQ��L�k?3�	3�0�@��LU�Eo$��f�,3�Z�J)(�sv36[�g��:Q�2�vI͆�����.{�ؖ��Ɠ���.

�#�ɐ�΁�����o����؋��W����ʳ�v�`-��3��8`r�hO�7
D��J�V��Z�Oͧ3�(ip��};n��a�T��8�
�6=ZƆ�ۚ5�j��].��dI�~Ck��{�(�Z���A
�Je��^�{���؊�{ƑKi�;k��
U6y��{|4�\���ҹZ���CU�Җܹ�4I�Kq�=��6$=����m��h����)z%�w?�,���Ƽt��WOVsӝ/Wq�$�����\����z�xeE9܀�J\����q1�6���7�1E�erw�B/�ҋ.�~�Z/c��zo���x�d�v�h�RK�[o��CY\��d<�Ky��M?�_�Q�,�6�_ٵ2����t�~s��'kv)h+2�%�F\᲎,���U [...]
+�A�ɭ��~���>s_�r�,'E�3Zd�
�
�[�>�H���Kٯ�[�����GQ��B^�2>[��J4�zZ�%[�pe
%G
�!��Il�41�D��dކ�O���z
����R�$��
+�6�[�G-2�H��w�c���3HŴ�H�a�
f�^N�Ut��nu*Ng_�4�U��U(T�
d</��Z*�
���Nm��,��1���#��n��{���WS�U_$��
�fo5�;?̌�N����@i���V�&`0Me�����
��"��.�|��|ٜ��	�<d���8�9�
�/��'��e�1\?+���/l0����k�fsA�F��DH���Ҷh��N�Q9C��M����IȀ�UK�=
���AX �p�*���q�����L�@*+���P�Y�/ �xi���Pn�(V� 4�A�(.
+��,e��f��7�D�'�ϯ�M���t/3�~!�gQ3GM:�*���
S
RN��{,�C���L�q �O�ƪ
�i�^��`�~H�  
endstream
endobj
316 0 obj
<</Length 65536>>stream
+38"�� ��6f1��00�h��� c�����o�q��6�bZ-���tJ�k���#�W#2��l��W�%�_��"���bae^����9L�t� l�H6�`� ��U�����K�ѓ}n
�x��|R��ٲ �:��ҝ�#��c����7�����W�&�%İ���;��Q6��Mx��5�bL%7��'!D����&[�
G5����1�W)��d+m�D�[���B
}@�� ��
 �����|$3|Rñ=�:S$���I>�R��$� ��}�sj%�MԿf`�j�6OW�R�&oܤ��ҴBL�f
�׬�=�����A&��5 at e�JZ�@뀤
�g+�N�����@r�E3 at Y�P��	Pc�	���4���
@�V��
+�P)����)
 uTS�Z�����/~ 3&�R
���O�Su�#�ø����9Z�A���Z���Ld��*2
��+�{� �������?��� �lROoC ��Ҁ��5��
+`��{Xrx,���I.Hj�%`��̥��>}#
�E��KRUB��+y���J�\���BC�_%W�}]�iԷ=�V8��H�x��q��o�9�?��
�n��O����
��J�O�X>�
+n! �r
��ٌ /�2�'Fa���O4��9_��0SI#,:z�:����qq��'�d��?.��[X���_��W.�Mo����o����x����'�ԥ�CH�l$u���t{�t���Q�*�+���d�+� ;c�5o���
�d\p���ɿ���Q�4ொ����������n�O������߼����Z+��,&� �� 5a at E�U����
����_������ۯu����7�����
����H�#V�o��:�}���=�e*7{�m�
�F,Җߌ�S#u�
O��=�
������͆�ʡ�u�~'���q��9���~���d�oF�.����H�[�b4��w��|����������,ub3��g���Y�)���=����������$8\{��W>�x.���8U�o��7f`�,��
�_�����,d���-�a+��O�R>�֙�����A}7�+��>*��r�5�{
V�h7Z6��t"����wsi{������M��#;���g���H�k����2Ɩ��"����կk�������ߙ���}y���vg���fƼO��߾�e
ҋ0;�ͥu�Mߍ5�E��gj���aN
{Hm
+�5"Pq�H����O� v�W��zR��{�W�LqD7
����}��M��
��u��|��������~���a�����><Ý��w9.>fձf���:�G��=
��lя�x�{4���xFI�҉���qR�d e���M�����ml�T[>��}�l�̹7l��{\{Q.��q�RW��ٱ_7��׺zڋ�e��@�J���:���.�{4�Dw(T'V
!�����z��,t��M���~�2�j�r�apm��@z��G��nh�y������Ơ����G
]���e��L>S��¼�]j�?������פ�)
���8��W����+rS�S�\y��._�k�>�C?P��І�j1u3
�5'[Q�Y�b�.�*V�ՠ\��~��it����;޾�z��0+�z��, �U��>Z����\���Jť�au���\�����)}������_��0��jm� �2�x+����O۱�,�����וM�{������7���)Zfˡ|�J���*ɩSRW���Cr{��s�.K�WL��F�!���_�
���r�¶']ۓ'u{m.6�	k3l�_$/{Բ(��_����ݧ�-H��@�L)5�.��Sf�kpB��?�a)Ҳ�۳2W��YqX�7��R;bϽ��rf� � �Z�^6;���s��D+���a����0�d
c��86�y2��0�G
��Q�0�e2�H`e~U+�WT���w"
z�{
�j�
+m��=��:2*G�.��B�A/egV��?���_��qP�ڴsc�|�f�G�͆�
��H��Ux�����8��Ț�
+H�4B,��z�TML��ٿ*q;�+��ԕ,
m��RKz��-����c���"�)�9Wv�����z��ԜT
�	��xlZۙ�[[ְ-�"
�U�.��!��H�d�C]�t�Z�
�4�;�@I'�_ՑI53a`eR��J���y�U�ьޔ*��D"�*n�[\�U�U���k�v��?
�bVm1��;�Xnߪqք��Ձ��^�6�����L���L�o�����˂�;��::����ĺ��
�Bl̕�S�ȋl�$���CZ���DDiL��/���%4�KrG�/��mju��M
庂�s]��$_��ؽp����3�#9x��L�G�{wX�Fv{6�P��zO4,�X,u�1yզ2�j=Y�r��Q��ZA.�NEZ7�@���N2�ٌ���1��3�$4�797��$I�#���
+;X��l��v�x�207/2��_0�P=�1�q����0�l�
{ʶ��NC�����=��
���,�yY�rr���eL��R����=r6Eƻ��H��K5���u�iļ�
. ���;N����PͧY���L�
%޾]�e�
9�7�'V3��L
+φ3
+{^����O_�}k��f�-(ˣ��YiÁ)lj
m$J�
��S�S�(�̉�b���E
+�Y�뤦�2ݱ��q�q�q�s ��p�Y�fΘ��n���y:�l�Z�4���=��oX�"��`E4�L�`G�F�ca� >���H
������_�D��
�v����B��,�yf��6.	����P'y��¸�
e9`R2�57��f�B�q��*��wz^�v��
��
��*�p��g�I��I�8��
8����&.b�
���'��]	S���4�v������
\���K{'���
+�f_Oqt])

W��{�p~d$�,ׯ$;*-PfҞ�L2|�����(���Յ+S��U���&k�΀����"�����+~�*.�&�Me����<TU֭}}E�9H0�YŜ�(&�����k�u�9ߟ�w�n�@�z��2��s�G
���r'�fL^�fl
O���>ӣk��N�$_��TT���m���6Z��F�����f�o�%+�EQ��􍓈|�i���kG�O��η�e���"ב�5N��m����l/ל�)t�g��(���GCϝE�m�Aa`ϓ�R�z�5,�x�A�lj\�� UB�2��������"N�f�eb%��w2�{rL�y”�M}�	u9C�
Ip��%r�} ^���I�`S�z���Y�
OM�j����C���$���l�L���"!�,�m��j��
�S�
�!�w����>^��O��ٝ&�
}�Y�3�Ϸ��&�1v}���M�3�J�`��Y��RE��}0渐�)�n�	&��
c�?=1"���M��@�+�*UP�mr�/��c<�#F��Q� [...]
+�oe���������T,�,���
+z�0�!�;��Ng��� ��[
�v�R�
�k�-X�G���*�J��s�#
"�T�S��߿��.M��	�V>Ѥ$�(������ç��ϊ@O�0K�!E�z��.N��.š)����R֐A)k��S��U�g؃͚����K�~���YI"⚱<6�8/@\>U@�� vt��3_�ќ��]�¢�L�e��7�^"YA�sF��P&-�E��G
Q�U)\�4�]<q
�l���#������/�RhƲ r¬�
���H at N7& g�6 ��
�
���
Xu@�G@��G"ŝ��3�^�lQa�_����T�)�������y9zn4j��$��^qX�9
�S2�
s8
#ċ����w�
+;%�����T߭�rhj��c��5D�X:4�Fb:�GP�y (�c U4 U?�⣈p"����#��,~P]��
+�y�|��
�q��t� J
+��"�=��T$

��
hQ �i��N��I�^T����2�z�~;�ӳ��s��e��� z ]=d$@���+N�'�+
�̑�D�cmrp���R��P.�$W��l�
�i���U��/O�"
��
+�H��P� CT�H�	+�ƁK���Yu:���c���-xq̛Fc�Ư��X>�\O/��6)�
v_��,0�I*�
��s��S������=�7���Q�
�~�8��
�
��Ȼ��a
|�jJ��S`��2��K�4�T
��N�˓���`�85=\������T߱�瀛6l���f,�5��1
+�f7��7\����㲽*`���U��c#m��[�kC�� o�E��v�8�0�D����yr�T���ꭷO�;�7k]��}��3���-P7 B.���s�X�oR��J@� 4g ��,�j��
d���<F��[hѡ���NPҧ3���o
�w�m$�Z`�F���o!_��P��ִ9����-5��q��\�
+�W�$�C �����e����@ZQ+ 
W/ �=
H�NH��H�:�%��g��7���`�

b�z<���&�$�
z��Ȭ�L�͓������������X��&h$��7����y�	(�f�8^���P�@y��߆�
Pv�PzS
(����r��B�凐�t��^�׍����g��)6K{Д�y�߁�-*�'9�	;N,��$&�$��/�M��%]�~��t+5 ����J� �G����@���D�
;zӱU|�p����4IC�����\M� 

���j���5!�2����OzCR�x��n�L�ߖۤO٨�&�>�)�X`Z^�N}
+�v��N3̉?����s?��r��X�m���XW�l,�z,��?-����EY�%�"�#k�W��o<�J?��3��7��������u�ܮ�k=z�C��+|����	�z�K�a�����k]�Uɑ�����u�OS����R�X��Ț�FO�Y��+���m���ZdNa�^.aF���&:��,�4��&<N�`W+
W��b���l���m����}� &(9��	JN�Kphb��
+}N����U��rV�+��0H��Kh��AT�r'�q*
J�����Z�9��	Kps�n���g>��P���v4[f��f�������6�Ŧ���
.N��
��%6Vo=l��Rp��;�'�1�w�7O�mC��ɟ�C�sΟ��c�u��b������Ր;>�����Wf�m3y|z(��)�Vى�g��Ǔ����(ue���p�K��g`��O��/ ���*�N>���^�C��
v�$
$��ZW�w�0ѿ�Ջ:�/�r�Ր����Ϙ�+~��K��㰲.��ù1�7��к
�L���
`��W���'��}/������
v�����I�=���۾�Q��z�9w��6[��k����盻��$�-x��'��ƪ�x�m������
Dl���Aq^z>�5&���2�Oo[0��,]~o�^Poh�xvG������Η�ZN���8��$���E�o�갱�4f
�n����Tg���P)���*�V�J8��*^6U44g�˵���b�/���{&?�&/[��![�Z���WgO:^7n���$�m��<zh01l�
=j8T�oku�vh����j൴�����IW�w'_����/�?�3,컎M��Ҥ��K��,Λ]�.e����^��
�����IbR��o����3a���p��R�̤֫U
�N���=�WQ#{X���ܭM�g�F�Ҥ4�JY���#V,�W��� _p$ Ȑ5�UM���l%�0�^6G���͇�pq�3Თ�A3�s�d���eG��|�6	y��>�j?�
�~���R9�1s�O�\)��S,��jaU6
�@t��6=�W}�;���ס��
��0
d]�|�ʠ��x������//|ڠ ݎvf޶�n�������Ђo8e�w�f��K?����x%P٧��w|���Ů֬J�uzՋ�&W(8������J�୴
�X�Y׌��p�-f�̽���M�E��6fh+�Զue}��5i���\������fA�S��'e�1��vtrS�Ln�b��S?,֪~X~Fzé
�êsJdd2߹��Aסey �^�x�Ur'���*�(��͆�~��o���v�ZK�M�5kR�YV�{�-8@�fAF�&ve��jj�
'�LRۓ�JU[�C����ޘ�@rFs�C]�
��z��@���Iy��U�7�R��j����Ny��}<�m��X���ūOKyw?m�i�q��X3jwis�k����³&k��Զ�I��~!�>�;R�c��қ���[j����BSXg�v�^�����'��YG�Gǰ"C�5���%�P�EIhjє�Bc
���r���Չ�,�S9"�x�\�"�VVu�{�>���E��f7�R��H���K�6o*�eQ^o. I����/zFS:Œڽ���]�YX��~�����Ǫv�!���R�5"�e�����.
+�B�
�&s��,L�u=���)���=j%�{v�u
R?�����<�6��\)oa�0��KփR��B�Fh
�����L���Q�R{J�U����X�,%����3nC%��5i��R>_
��Um&���N���W���~uE��_9�5+t�
7lg=AY����/lg;��!�^pR�l!�I��/a�d�
�Fb�5)�j�n-i^�cT��!��]B�	��I1��qIR��/姖"a��%�N��*���#l�KS���r�op�
��gΕn�
�"˪�~��mܥ����o 6D�x�D��)
-js&~�,�,@��\؁� 㿸�j�d.uT��v���/���B���
/Oo	
W@\y)��;#T�Q`IF�[��^���z�s��6'oC�ۢKV��'�?�_?(�Om{�I�ؤ�{A�?ћ\@j�\�Иʎ�95���-��~���~�o<?=��5��|r	OV^YT�󉖑^	�p�Eg2��cBu����衼��H�Y�

+{-���?V�H��䛌q����|3�GE�@����rL� M(E�Z�(k`FP�y��a�����7z�NI���;��r���:I簧�KͨY-^V���圲�%<�pa�
 ��,���r
+,�۰q�q6(�?�
+���5�
��9
=�GE:�`���,u�\�2&��lK�ە�����
�
�*v��yi<��v�Ś��
+��
�
o������ZZg��k�Z�f�Ts=��1M/]u9A*��H�
�s�k�S/V��L?���wG��
!h�'�T.�%
+
fS���d�Z��M-h
�tTZ�u{|�N���b�|K�$�����h���vCU�j�*��
}0���i^��_�"mH���O��F�U�۝.�.�(n�-p]�.������[�xĠ��0t
+�Rk����#��w�&���,���p��ձ@
+}�u���m���� Puh��ݾ��Ԭ8���
޸
+>pI�:�x]�;���
��'��L�_ݮ����_�A��T�߂�w+4��a�S�>�X��a��+�z'*�l�7�
��"��f��e!b2�H��h����W�+��z
�~
�YyK:�QX�`[
h2�g �s�@A/�@!~r��?lB�@�j~V���k���.l
�y�VS*��(���Ŧ�a6��(�T��.�g"�
+ә��M�r���Z�.h���:@��� ��N }8�"Ƽ����‚G�� �Հ�j�!����=����u%>a,�{�����{S
��
�fj�H�͒�����b\G�\Ȳ�̯՛��D���3l�}��� TAA �=
_x#t��
&��	
��0���*�H���< R�K1
ˢ
��b��0�0�	+o�{�� T ���Xf�D�ge�~:�3yj4d�����|�˺��n�>U���A��Y��qg�
���6�B����

A����,�k\&	�B,e��`�E�0^���]�k@��; �Ht�k 񲯀x4@��I|
�H�+�O6N�Ӕ��:�pU~���L9���F�A��ij4�(��i.ZGS&
y�� 
��Xao�m���k
�, �m���ȷP��ь%
���r� *
� ��%�0� �~� y<��
�����Q"�&
���8ѵE����*�Q6��o���e:�ex�.�4.����

k
��e���۳�2�/T�рjL@�gP
$�G6
hdR4�y�Tf�F�G at c�S4>*�����B��f��گO���D���
��
�N�~q�)9,��:���b�3���q)ﲨ/
b�8
�>��
Q�Vw
��@ �'���6,@��
`���m��
� S�V�Ԯ��@x,�`�Z09r
�C �ǯ!���
G-�9٧��b���SO�PA�W����s6��z)\f�馨mexZsD���<.�cȀ�`Z��[��n�W��MU���/]��!ppm8�|
k ��8���,`#��)����^ �f݌�u2��I'�`�'�G���.
��Bk9i����P�-�p�ҲP���0�
RJ�˓�薽u��
+�͈Hn��ǃ˽�
����-d��sF@�m2������
MY?�]� ?��ߋ��z|��gbxN����a��s�dަֳk-	�@�ʥ�ڕx2=��)$A��v�����������
׭O��{'�T�(�<
@��= ��H�
�x?����0 �{?��a~��O{�wg�	�ln}BZS�Ĥ
�J�?9.�K��z�����ܿ�!�_b��M��
�ր2�瀲f�XVK���P<FJ�����~��j@~�V�
�[�����?��p�"Ιh���k���;D��귤�@�/E�Wz����K��=�}��
����&	��{��
��^R at W�y���h��A|��U{
��Q���/�+U���
������ʒ!J��g�r��r���lHj�����&n�oʭn��۶,΀�z��$⻛���X��Mp��J���d�
|&ϧ�w�A��5�$#|�2b�d�4q�w�L�X^�߀k��i�٘�cΤ��H[�
�*�b�zH5�0���K�[��w�Q�&r�M���<�)T��`�/�� �� �OFl�fr	^~N�R��ew�%M�
[���/
�ڞ}lx"gx�AO�Z#<�-�qļ�{�5x׀9r�⊸�蜵N��ʺ��2���<]�V�7�LN��T����]�&�w�5�&�o��~���_:�:|Q'K��#�9T��V�
?���X�{�άS����Bi9Q���<�7ؐ��
 
fUT�M��aT��:�k|t�(}�zJ���z���P�����N�_V���u�� ��I������tqWQu�]~���2s�-���tN�6��\'��z��Z�5��l0J�2
j1��5z�yB� k��*dm�\�N�Jo;���yA;�;�w�~��.����&�f���v�J6���j���7w��C'A�����&
#w&
��R|���`���}lr����������6�e�
��������6����n4<�\<?�I�$Z�*#7
�8�X��v�
��$w�o�j5	ժ��+�pzv.�9[
���]��jj
�7D������0�\N8u<����3�h�
"p�~�p�f�oM25�ϛ�foڿ�Ur_.ԫ|�\;��z�!��ՠ����s4�x�nS�OAX�se��
]
Ǧ�r�W7�I�.Ų�~>���]O
��-�7M�NXmG�t����4j�J�W�V�a���Lj
�\������R��V�{�YQ_�w�Og�U	g�wh��\�4qr)K���6L
\|y�ZQ�@^�A~��l����v��	�d�y���+?h��?���|IrZ� 7a<m�ZQ���3����gaVKYBo��
KsP,0�Ya՘�
�y��o�� ����ܡw|��'����f�4Ag�'f�|�H�W�b�w^
;��
{X�-x���l|�<>�-� �i1Y�����xت��o�,>6�9��Ψ�m+�s��񏭕
�A6�Q)+}�z&�H팆H��}a������&�����޶��ٚ4w++
�_`�,��db�^�p�g������Ej;��T5��j>��es����rI�r�["��NJ����\-�}&w��jV.j\F�Fx���);Z�x{�L%��֤��?���9
�c�]�fbW�e���g8�60�ga���M���'�09<�F�B�`�4�tȪ�.�Q��i�z�
�j«�j�|�z��:��w.�w+'ו�+>
�c�ɉ�d��DU�ө
c�4n.�d�{��.K�p�e��
���7%U5�)�0z�z#C�u�
-��uM������r_����r߯w�� W���<l�e�V���i��R��XR�n{������<��g�٠���c���C�BF?)k�?x���4�'NH��q����B
х2	k�
F59�Qj��,EyPVJ���bt{E��/k�}vd{ō�)�/��
�
�D|������~P�
e�Ջ���$~W|7��d��]�8h���kM�T&�eu��v�z�Ψ�j�`ʥ���.~
Roe(R���]��no�[�C�c�����+q�F���"QOL��KՖr�|AB�zE,V;-��N��/��O|m�~s'��r�e-�^�G�m��=s�}�����o�m?�~���VR<,0b��I�R
+j���1Z���T��(��y��R�*�?�PNo�O����
��Z����Y�����Q)�|��z�;|�P?(�m*=���쥱߳ʅx2=�N3�M��ݦ�j?4�י*��U:���Ĺp>�a�
T�jZX:���Җ�U_`�ųq.
��񡸜��$
�"q�
¦�� �n 8��2˝�Y�k�{ٻ��ۖY5�q�ވ��_�V}y�>�JR���$gw������^���%��C��d�%�Ԯ�o�}i����Mm�;��:L����(��J	���[\UKa[�C��� 9{��{!`������eCy��
x��=��?�r��J���uK�u
6��~�L�,ɹSIlb��gt|�jx��-�C�L�̱Q«��ŷ�ȭICb[t���f��b��+[?�;Y5OZ��UD\����=Z�Q>\�`�8)���g�'�>ծ�_+Dtt�~�a��Ѷ5e���(Q�)0(�cs��T��#�K�G8�vFP:����� V��t\ń|z��k
C�D��	�������~���Q���);����՗{���B� "U
���(��1���/�N��;��=��= jJ"w*��^RU`r��)�9bm�U�y���
+
��m��l���x?bB�@h[
eT~���uHO~P�����Y�ڙ�Qy�j���l�Z�kO��c�놕�oy��Q����]T^ܹ��k}
2}�8��㼣rDC.:�I��+Q.,�?(A��7���^�
Ωi	;��&֜�K�Xd]��ɎP�����w��͉ ?�T6��4:5�Л_[�YpZpd�쵲�X�V݉�"]�TS+KҢ�"��$��f���(�3��{�_;�D��=I��
A7�{��j_�S�{�Zt?�����D�
�юQ6P�5�#��
�X
+f��ଡ�z{�2�F�Yc��&�t�� ݕ
���:��
����E�q�w�rU*�J^6�tS%"բN;������^xgL�z��d�:�K�x *p{�s����\�vf�+��kO䎵?Ho5Ð�sa��
R`����8*:l�� ?�N�ϞV@�X��
`V3>/ ��6�ۍ�񒖌�t�t�ڑ,�O��v3$�|
N�Xo�
+tz�:���N8/�
+��
���1��
�)�0��O>� �[�0����B,]�>�e
�� {`�X.C��v��T!�m`�� w�����87%�����^��|��ܥ�B؞j}��p���z�JlBp���	���ꥋG��C��,������	�R!bY
+ �F,�R,�oV'>�.b�� >��O*���=x�Q��#�?�Y6Ef'�f�liwhUP`vg$؛?�R���҇�]�O�l�7��<._�,,ΨVn�1˝���\ �x��@� 8�
�� "��Q�Xj�X�@4�^,�5 ��ī�M�t�t�}		�-�r:�#��fM5�
r��3E���~�wj<��̙���_xÓ��7T{]o������<�K_ 1M�^ �`�~y2�&��y@��z,�
 +Z=���Ui���\^d^�aP;@�H���0/���jGz��4�O��Usg	���w�/��'���k���ci�I�7��Nߎ�t�W@��[�9�@/q�k4���7���&e�_u���rՊO'՚}�"�@9
P�E������/��	���+���d�ݡ�_JM%��%�w6/;7��G�g�ď�b�v� �f
�fw�
����#=>q)

����\�>�
�@k��cz2/ 0�X�}@_O+@�ҷX����O��
�����
S���%@g�>V���Sm�8T_�+/d��L�fM}�RK��S���TG��q& �)���9,��K���
��e�?�VrT�����7��:�@r �w����z������'����
�\K�-eK�u��f�XM��y��OS��r#u����tΫp=�����&�D���-��P�yP�
�ŐY���}������_.�ܻ=��X~�=~�}~e0�
��]r�!��W��9P\�
 w
d�C@
�g/���ou���֘,�-Gdcc:�1�
�())�&��?����-�	�Mr
��o�$���`�4q� ��kZ=$�1�A|�����E�Dr���x��9�� Y=�^��.U�^�(!pc\���wtn���B�D���;�O�
�
����_p�Xn�%[7�2�9 at i>P��(�!��
+Z�9��@

�@����.�^rO�4�6c��k��F�֨�k���''�� ��
I	;N��vM�Wf�7n�o�mBm��ح�1�Z�
R��	_�-Mh@��]���5
+�J�
�hT��c
+�`I��p�$)���9a�
8IoHJ�����m[�~���_�������$%!�N�m�X�uLB~�������V����1`4��S�,l�ay���?1��W6B��i�r��h�>Ų�'��O�<3�'��7��՟½<��V���!���+?䪡4U:�{ɜQ��&��
�W}��,Z	�H���z�k
M���W��dz,G
��u��$x7�,֌,>a��K���1�y7

op	������΂!�.N��s�=�����5O� _�nB��^�k
b�f�r��2�����W��'a�?hBkP�k
���v��q�7�^ڟ/�
􄉆R�}���w
��-��wķ,�P���� ��u�cש�B\YA_�&
\��"���K��I.?�"��A���R��Fw:���a�{<�Q�
d�B�_ �K�ԕt�JphbMXm3��/6�/~�\�,��{gv	��E�|#��99��fU��L�R0���fto��7�����o\�W��/@��_��O�rH�J���~�.���K
O��}���w��4\{�B����2j	M�L�.^;~�U��7uu�yl�>6
b�*�����K>� ��
���
�;�{p:��Pk����F�m�
Z���L�Q+���x�4����pX�Y�6
X����ZCc�ՠ�
U�ύH���XV�a������2�\s�_���%�ڄ�v<q�r��X���o� [...]
��%x�1
+�:��.c嫲�K�����C7_�e����A/
����M3^v��h�f��/.��A\B;�B�ͣ*!��h�֤9�,�rɛs/��3��1Vðf������G����BLNr2�	�-茞gB_�}�Ʉ�3���t��ւ
�v�=tκ=,�iۦ��5�
e+�ku
l��P��]����3��'��v�:��V�H�@C�F�!���i����ܲx�d�f5�u����[ͭ1�D4����}T���2М����Z��-��e�/s�l�L�҃�Ug��:&�!�')U5�z�yC�~�9]����Ū�̖&����U�k�~ ��C������a|�d[���cv�>W��5�m�$�	O`Wg�x�1�K��M�ҦJ�r5q�L�?��{�hy�������������[
�+4��V5��)�
,+~����DZ�%�d[ʔ�O�jIoٗ�:���,�%"�@W���Z���(<�����}�"���h�~m]鶽N��~�3��J�r�)c��'�������\��<R��!|V
5������F��m!zK�
�HY�%��2?�8�eA,YM�^
[X�&E��
~;�|�Z(���zs����f�c�˺-�κ��b�6_M�I@��x3wJ
��X�ec��Q?q������S1��PNO�4���R�0<H9|HH�=�
��x�pּ��`
��&��������1�P�������my�c���A�n�2Z�!�Ǩg��
m����W
���`�P��R�Τ�z�zV��v�ϐ�d��V>��ԻK�*y���A$F�V(�	噼�R�vhL;�5GyN��\�k8Q/����l{�Y��H1�
�e�Q��O�K��pA��놂rs�̭$�D��K,���(��Q<��X"�S� ꨰi֪���LR>
+�����`�e�,��R#
�J����yj͝��"�
���m8���ًv<�Jwan%1=��}��?(=�r
m>�*56G6�~_
r���$�(L��
+�MUF�
+ؾ�obuY9`u%'b�R�/V�W4��+b����i0����
.O��;��V�t*�����Ǝ�J�ۙ�笪�f�m��1)"�����
Tj'�b�Wj�"*c�a
+z=I2��xc��i�Q���k�>��w'�]`�J�xs���	_G��s�Jy�C[�c>�s�y�&~N��
k��j�j��äyi��W)̕o����VԖU'�%�#�9
�ʄ����J���<^~kr��{2�+�7b�4?���6�a�J�V�CY�b
�]���c����G�� a�Q�
U�{s�����fQW���fQ��UW���jTS�L�_�}�/�%�+��#�~
�@�Kzh�g�$�)x���xD��ˊ��e�o��#^ͣ!�bb�r
JH<b
�Gc�|RP���Q9��"Wl�#ZY���F����/B�Q��¹E at vN4��](����1�Y�خ
]Ӳ"+O�T��z�7F��K���'�-=췗�d��(�&��5
�;P�l�7ǎ�r�	��.��u?�;ڦT�w%��"��6�p�l\�mh��fR��?90�2���3#��+@Z���O�Y� -RGZ�U�A�҂WQ�z,E�{ۆ��G����4kK
+Q���o�r�#�X��g���n���5lm���;"����)���ޤ�@�jF� v���P)7����
Y��^�LePdF-� ��:��n��6R�
+�94edBl��c1�aޔ|�G�uGM��,ܹ9Q�nS��vF��U�h{�Y �Ok
��z73{(}�N`�f� ���Jt~  ��X���D�� ]7��q
���
��f�.*�r��=��.�v�u��k��U���#R�7j���0d�5�)�À�qG.*�Q6�9^s/3���M�ڛ!=���-���2Ek
0���*
c�׬�:� ,KR�T�X.9��ҭX�s���
[��dS�LB�C�5->�܌%�I��f+I�V�۩*-nKF�!�)>b
��J��‰B�ŎX�sk�v&�X��-�Nn9Gz��
�����঵�L1�q�9 ��:��C"��X��)�˴pZ[

+"�Ó�<Zq���	`���z�KȲ��ҳ�1�U�Mj�$���ҋ��5Cـ$:�=^�
�*�kT͝�Hj��G��Y�y�Z\�l n� on. �?� ?)�X�x,{�˓Ό�� ���b���\���BL���|z�g����'�g�ܴ����-�Ŝ"�р��c��=F}���Ȓ����}z�z���=���

�nh���q������
� ��9�	�Z���
�
bb1�XF@��: �! �p���
IJbbU���'F���
+��~
��i�
+�JM�\##��iU��
��4��
+���rރ`&�gu
�_�
�x�!�m���Ňz
�j� W������ �yc�
)4 _]	P��!m��d��`�Xz@^%"�w�����k��A�H��Gi�u�"U��g��.h�w�<��l�Ֆa#�������oQ��;��
+�����k�
����@��誟�%�}l��Dz� :oF�N]8@��Eo	�O#~�uY��Ƈ�Ө�b��<��yq;n�����"�]
G���~�g�x���%��;bIQ��ɇ&hfA������
+`���!VLT�6u�+��XF��7�a�&t��Y{��2ܗ�6�.`����fSvN�?�3j�%���3�e�H��q������yrRͷ��ۯ
�E?��ۑ��&�4��蛛[^|� _ʞ�
 /k�C
p�� p��������#!IoPәz[�
��,�m����?(.�"�

�/����s�O=#
������M`�7��_�6i�v��Ԗ����ˈx!y n⛾8��@��@Ի1��s}��IB
��Y�gIY��MP��g�e&1���?�Pۤ���餻\b�W�	n�������7�6q�~Sn��#t�@i�&PҍP���]���r�x��^�a ���`&u���5�(:�`|+B�Q��t“�`[Щ�ܶ�Mm�̆�&����7�6a�ߔ�_�뗓��t���6q���WͷZh�1Z�ƁF�
�^G7�tSC�a
+
��v.\̖�F�ן��S2:߁��')�o�m���/�mBm�n[]�W~�m�����&
�'0�)	L)�&`��ؽ���!�W����7�??�������8���&�I
���mc�m�m�

���9�G�'\
C��A怒C޶r��1݁|�#�&��E]lj����>Mns��{�
+����U�'�����/jL�L�=�
�������dz"�E�����Ț��s��ҏ�vR�m�j���r��q�|Ͻ�`H�{�̱�?�/��~k�]ܦ?�?Q����gO��P|���L.��6'��x�Y�~k���&�%]���g�4��b�P���	
M䜚K�����ğ�t�
1�
�A������^�>�!O��Lx��Ǟ���3f�͌�3��>�'.ݳ�a}���qe��^����A�A����/���No[
Z������	�ƙ&�6�ğ�.��
$LtV�
��!{�'Aq��%�:qI�=�7��0j��'�`�ڍ�s{:�W���'��M�J6��C�t�c��b��2k�v�����[V���̏���ޛ�jXJ�Km��l�h��h�҅E���+�"Jfet�Gp�	Q
@Q�P�?��%�9������c�FW�MU�7�R���(���_
+�~�v�^��ޡ�8�q�4�v#�)�
��
AGITh� �>g��ϯ�~9�zV�$��]�n��^���a���<�u�o)�TՕ���.]�)e��|[�{���&__l�*�,|y~�?�hX
+a�O���T���64C�`6
SW�8�sҡ�\q{�Bс.?�W'������Z���藝��L����_
�Ed����ԛ��W�$�}݄*}���\�<Y_��k<
+�0W�������(��1
�4
+=���j��i
+U�l�K"�=7�V��n6�hBj���ڬ��kf�;�ڪ.���N�n��띪�޻U��4�\s�2�
ce�J��V�\z��JI�0�R��܊����>�_���G�Qh�C�ka����.���
�V���$�v��v�
e+�
+��d�dB�Ak�}˒�y����{}T4;p�\�\��x���H>w����s~3����sD�
����e��c�Ⱥ���vE���*�,��� L���B�P1)W�f_VKz+
-�������x�
�p$
��
/���oFl:�ʤ�9g*�rr�P�ѯZ+�ΕN�G5�YS-�6v�L�Nz$�t�
�)��&SZOo��
+
a��kM>o�a���!���^�a�Ck�=ϔ�x����|+�]srn}ʺz���A�
:��6yB� >�I�H<��G�Mgbx"���LJ�����&�~��,%����bk	s��ȣ�	��F�F���(��7Ko�oV��Y����'B���B)��cՂ����i�NV���*y���K�g}����&�t�]R�jG�9Y�77~�0W���,��(%X�
+�|&)�A#Ϸ�r���FM�s��'7���3����J�2�3�)�ã,ϧ��
���t;��9��T�:�:��B���p&��o�i�;&˴�$jD
�+h+X��d	��v%�ݖ��v���o������p
�FYw�%خ�dX���9�U�IL�m��Q��3��#�_�|\�|j��5m��k�X�ڈ��)xs�h�ϵ0I� �adV�^��C�$�i��Fi˷�w��

�S�=���ʒc�ź���v{�兔
�+�s�eT��1I�y�/n/�G�9Jg�&��t\���� 1���"� �#e�1��V�"U��gT�AJ,
+�ݮ؞N2�:[�TJe��?�Ʌ
����;	�@���	��ؾ�`�Q�`r�
V��%�|aK�:xY�8�X�
���C<��X`�1�,!�rt���#��/S�IQ�fj7#	�t ��J�5OĜ� ���O|W�'!r�r?�V� Q,b�����K45���:��x)Uu�ck1�Qۤo=
�+������4>��g��~=��s3�—V�ܚob��~O-��U�`w
+˥���)R$ٚ%;�(� �{n:��q������R
�O5�aB��C��f
"&/�ʄy�
�u�d��>��φ�@ց�tx�9;�%};d����<���ql^�LbQ=7�E�"
ߒ���s
+� �qK��ၰE�FH�����;lE��㼄�7	�
=�w;t�kF��~O#���Er�}Erh�A��c�a��rQ���4ۦӓm%V6��x��l�L��[Ɵ$i��ѥ���U/qC
+��CR��C��?'�=}�����XxGN8��1�'��9(�(�
z~W�J

��&�c�!����3�Ѣ2M�7���|[�@��P`>��4&�*p��qb6
fW��7׹�.s)޷tnZ^ċ��LfUW�Ï���$�y	i�
p�܌��Nqnx1���-��
�b�i�^
+�+:"u���C!9����B�
-�g]`f���Ww���
@T^�@�x��f L��D��,֭F&L��(
�o��4\�m7q]�.bf��S7��M��
2<x�a��m�0��Lыe�許���fw�h����)�k�#Z�7P`
и_ (-) e�@��
����S�$�!��0�\
+�� ��d�W,�
o����`l/�t�Ylbo[X|��q]��p�5&d�9�ݞ9�6CL
:�83���z4(w��
-��>ڀ�g� U�+@�(������g
���K��� ��)
Ў3 h{�p���V�ϱT�3Q�J��{*W����fFzƍ?��&t�)kr4ȍ*i�h�]]?Yp!G�
�W8_@�]k5��
,�����
Bw
0�= ��|2
+�� FK�=�Q��b�7��L`5�]��8>�p�'��E�f��Jƒ
+3��S�r��Iލ�z�M�*	K�Q�d,)M	&K�q����~�C�:t�ȴ�O��V�,�� �
�6ѭ����8 ���	a��f/��fU�-�60�
���{�}
`ʮ
��I)һ����d]vH�9�__l��.�~���tC+)�lm���+S�?r6("t<� G�
E�[u)U!��� xܵ �zo.�:W��2EA� � Wz�����x���q�k��~�$��|q���A^��r��Ԅ���0ߛ�7�x�`�E���P�%9��=�c`�uQG�oz�|O�`�h�O )Ux{9o��Av��g@n@(�>^wD�ւp��<��K�H at 0� 0a
��l�i���r˞��R*ZH	B��#�3)����ʞ:�.�Vx�j��;Y��D݌�� ��3���� �s�&�]!A����kf0��䎒�Nšd
K at h�N
@� 
���&Hj�$0
@܂ ��2q��z|1��B�gw
��y�MO�����c������&��8[E�Lq	u�>i�i�l%m ��
��~���+@�W�	��� �
%5��#50r��M at I���
+P�$�-k9x>'t ���jM<���q�
��M&��"A��N╘�ST"v�=����H�c;�b�-�8�_)��G��ɵ�o���o.�F;b�V �;�q8�q��8����c�1/@l�H��q���\��=Ǎ�08ie>U�T��/�qz淐��	�3(\
�
bt�'@V�nH�+�o~�7��K*��o�;��c�~ju��hO�BXN �%׀6�
��
1 at K�2���
��$ ���v��a ��{PhWH3�1DŽ�C�4jl��H%z}�>�G��.�J�
������Ǽ���_J8����+'�_׶g 8,}vM�^{�b�]dҀUBo��,7��'`I�
��ï�����sI���Ip��oP�͹�H嬠_}���)����eK��/?Հ��������	�z	��@� l
C:	i)���?ܯ�__S�oyc���o���z�����q��^"����Y�I����E����_��To�� 
���ߥ��)��\��
ӏڥ�%
Rj�a��2�=���$�.	��t
$�
H��1�X::;9���F�W�Tɣe����E�/6{X
R�O����a���'�C�mX#!L�팳_}�а-�=�]M���1"�� sc?�$f&�1��Ҷ�i�8��!�����w���X���
fK���_��w�B鋓
n�&����i��mV��O�헲��,��Q���X��� �po�050P�YPH�}P ��s��
Ƚ��|���	]���Ge
c~�nB6���h+� (���h�
�m�v��
��>�ћt-���#�\�b%y�T��I#�f�n_="���!�u�W-,\@��
+m�o�;}qB�\����3�!�?������"���0)���8v��D���ē_�=�j*G�Gv\���ܒ�u�ZQ�/bb��en��
��M�s��~Y�
�N��n�k�^�����Md��Br_���Rgڡ7ZmN�[��vhXm�`���+^�َ3�\�]�U:����������n֦ <�N%�^��wt�m�x3�
5������]�Y�xWff1!O�j}�m���đ�����c��ءva������m�r����<�iä�p��V=��(�$�����wL/� (��=IIS��u�z�Od�
�]��Ɯ��G*�^
/��z�����
+������x��(֚Wz�>��6�=@z�j�ֆF����[.�h��T���.C#/�#+����Ɓ�
;���� \o�s���ݲRx߬���� �
�%�V
Kw����^��t�њ썱��x�
iTFm�,��yt�k����U��h*LKD<��
��
�`�$	b�'��a1����*�ߥ�~���@�Fp�nBߵ
�N��y o[zMދ��UJ�~ى����ϓ����Z�A՝Ⴍ��.]s�h�ƽ2rU����$�
+��GVF�]������"�C��'�4
K���!�O��yM|��ԝ����	���R��c�
+!-B�:5�!�U�(�+S�VFվY�W
��5'v�iOܒ.��R�~��fNjU�.����
ͤ�~��7�-�o��z>}]�����3
�kC��v!9H��� ���z+=7)�T�a��{�ES���|��b�5�E中�U��_v�|+�S������4u����<��u�[��o�?2�H�2IjTH_v�Az���t�/����S�Y[��aw����5�(�
�Z�!�/N�f��r��x��ϙ�u������n�l�� Y�(RY>Zd2޲.d�x%��l�\z��?����S�2�Ry�<H���,YJf7��ո&�	K&��])��$��fO�Z]�ip%`�zVM��H�*�^m�!��!�0C�ڥ3��Ii��J�����K>]���$�^nI��|&K
+�|C	2��<#XZ>!4�
�1��U�H|
AF�c�-Nn
/�c�N�c�r�uw�ź{/˺����~(eh|W.�{����W��
/�M�
��*a�C�ƽ���65(��§�,�iϷ�w��p��jp��x��Z�خX��<�K0��*0�D&�V�����*>�L�Nҙ4֏�w%��t&�����d�
+s���;]2�����A&y
��F�r���֣�s�%>��yȺ�|�v�1��)���`��kŨRt�$irO_\�D��?��������g>�O����WZ1]�Nb�����o
�L�Y��e|M��8	�Z��[ ��W��
������LMgi/��-�VN�.�
��9Y�1}5:*=N�U:3I@�s�����qߣ�qM��x>���5�����:Vʊ;����)sf?�j�Q(�q����F
SH���l�wbc�DKFT��
Q��a��f��4��Z�
+�D~{�b�T�vO���oGck��&38`S:�
��}E��p�3t\��)_��.�$dgUwD-PO�Ц3��^�+
+ߐ
'} 	Y�[FD��lj����;j&���Lmuę\/���Ls��3�^&
�$�B#
��c���9�^#�GmvK`]s���s�
z
�'�²>��7x�Z���U�.���=ru��d����h@/mLl���hW�9G���>����V�
�4;o�%�vp�
֓�"&��=��#:h�(4E�h�O�h�@hrU�j��X*.�;&�G���k&]r�݅~rh%�g��*V~&T�vq;�:�+$ٓ��.Ѷ�]".�zD�R��{�4��:��FkA_bG�u��?c°�B�i=��g�r
d����G���`�ţ��Q��f�yT���:����:9�3C��NF���o�9���#^�ؼ^R��'��C�͖LHd���|� |g�X*�j�.�{]�O�CL�f4�<h��-��m�m�#�|
�>
�����
+xYuT��D�9�f� ���
D'�SC���������դ
%�U����Ngڋ�lp�Ƣ���.~�$�BHBK�����wq��!/
t0�tг~��6:@�qb����
�t�����r>�������e���Bp]H�e� �6� zu� z�� ���K��:"K�f�G ����zx̦'��{��)UoqR��
�R����S)uq���~��`	<PСzR
�HN�����i-��.��	�
@��� ���!l� ��� i�6��񓋧@��
 i�]O��Y����L����N��a���/%>f��#hA��{[��
��bG��
�(d��C��\�G�ʶ
�k��� p�#�\�@�<$z�z./��
@��2@��
+�{y�G��Nj ��� ��� �sE�g����'Vb�w1�myL�r�Ƌg���y��	�`�xg��b
�T�D����3�_����b� s6P��s��xA�k m1&��
Pս|<�/��t��T���<vZS� ��@��;@�[
�T��w��D��.lF�GX:����6fJ�I5�ɔ��ǕwU�4}�����./��<!#�z���b%�1�
+'� ]� }�4��y�lA����>��N ��j ��1��0�cz�t>m9/�=،Y��㱅�*�;8���0�;
��m���L
+��S��q#��m�8��zX��vБ�T����n�5̀<�
������ɏ���vsV|`>���'�A�{%
�,�؞�K��e��i`#���Y�\)�O��
:a2z���\��J�
r���Y��8_p�j�*:F�}$$�Qp�+��V�_v�
�
��[u
���\|�p n�G� ���?~���|�� �8 _j𼦦 �� ^�G��|�YN��).L�fOC��������V\��Z
�>�	6�c4K��苗�,�|`{^x�4xY� |`N~�� i
��
����1��zA�҂� �l®�m~x�< 1�3��_S@�X�9̻@�yr�}��2�Q6��
t!V��`�u�}���â���Κ�4:oX�M���ִ�2��%�T_�Iѹ�񓫏# ǩ ��7��P)�T\�B�6�TG���eA
�݇\w���{s@�

����H4oG�K.��E
a�ju^�;r��
��%�+J�he�_�
+M�/��R��L��忒o�o�
��:�+��P�����~�7��9�����*�C�8<�0+@
��f�e�� ��
'�}<̦�-k�
I#��'�)�=��(ʈ�/>�G�����O}�08Lr���	�n
��	h5�tk6t;� :5~x�	�W��E��T��<qdJ�.��D���o�~SԬ��j�p����y��t��OKK�lº�a�Y�k���}�t
SnC{��
 {6�
`��
��.�l�X�� �{� c����2
�f�w�$�'߱�b�4j��>�Z�~��w��'��BuB>a���"��һ_��Й�����y�� 
.�J�B:W r�~�؀�q��2"�nipڱ�^K�t�F��ːX�z��Fc���6�C6!�W�����l�Û���o)��|۰J·���O�
+�mKA���
+$-* I~���r
���S��q�%�/<�i��u��O�/�ɟ�}�(�CaB6!������?���Y������O���+,���
�=�
�m������
d�!JH�y��J7F�_e|�.�:�|-�
V���sC�>~r�ۆ��C+9�[Y۰HC��~K���#YX��w~o��(�;P��'PD��'���'@��J��
�A~_D@���������t����~
\�38mۜIJq㔥�����>��g��E�
�#�����d�[٥�LD2b��
z����ۢ#o�����+_�M���HS�g�K�BK��[Rc�4p���
W�^Z�4�^i�dis
c7��
�QՠΓ�O��S��\�J
bW
.��[�>���qn����
��nk
�nmM
�Y\��F|uV�����u*�{��4oT��0��
�G�������n?[��g��l�"؟����E���~D���Wۏ����j���[(CD��w6�!��QB�Ʌ���z �Y#Jn��D
E��G�1=m;6scfON�:
��˂���I<@�Tu~���ښ��b�i��~'g\!~,Q��_A1�ʢ`6�/ПԳV�i
�d���ۢ]��n�mUZ������NA/Q�I���.XTQ��i����
�c�$�&�QV�f��6�/BO���ѭϹ���U?*��nbm���z\o�MZ���Z�>D%s[N�f���%
f����r�rz����h�?��v���k�1�`��v�ye�.��K����a+�35�\�����
�~���r��:����g��Me�b
 [...]
+MϽt�1�?R���`�����Z�B��h�J=��<�3Zy��(�Ό�2}O��F��g'sj��ҽ����=P�O��@�c�+��8�!Ae�]�a���G"oO���rc�
&sP'�y|���M�7��s�I2�\�l\)���ԭ�~�}2�i�ܗ)�xT��^�o�qz�.��?[��g:�l#؟���U�`��7���X�
v�>u�B�7�a�ϳ�K>B�槾�vݲt?�;�rZ_����(yYF'i8C0�L�a��2K�:�φ�&���(���~��wЌ`?L�;�o��sҌ`�8�!M�_���?�Ά~m���-?1�!��/߫'���
����?�3�����y[~v����#=a�m��M[�������K����4?������m�=#�/������S���4#�/����#�D��=�+ m�A�u�gZE����,O����F���Vĉ�
퓾Ub
+p���;b`�/ޟf��m\�s��
�L�C��4.@�Q��
�g���\�AWW�d"u�[���
������H-O�j�R�
ב�v��3��gG���f'�
�y����9����Tu����ko�N��V��\O��y��fwF���S�n,��ׇtl4�ܱ��!���ynV�Jt�o�!�Ge��D��M���#�85�w�;X��J�jϕ�l9˜����`�6t��ڿ�Nwfݟ
!�0��"���W�����!��cR�f�j����w����ɴ���ʬ�zj�
k���F��PV������F����/O}��2Ձlˀ�U_� ����H[��jR��P�N�@�E0�C]�h��97F��K��,+zy�ֻ�R��f
�f6/�K�`y
+��E�ǻ�@�mjw=�,odA&�	Mn
ޏ���lf��֝���a��
�1T^�r��了t�D0�q#���t~:\-
if���<���>�=��W���
�iF^��
+�t5�
F�^��� K�G�uUT��N�Wxh��Xqr�g۽j��K�`�/!�2
|�X���<r�Q�ڎ�f�_ڼ�:ڰ��zoI5?���YiZ�C/?��J��l�.�Pi�6��zq�5D'?�ώܸ	��x��'��� _<
?v-�Nϸe��n��RԖ!;<��B�.��ycJ�:"$�}E�	�
WI��G~6�nЇ�&�}܆<�.��>T��}갧�kGs
e�K�J��0r��:�g�^���:$�Ge%s��OR	�F�h����!�}LJ� 
Ht�unVR
��K;|��ˇ�~��Dh3b
v� �́�CvԫCI�@�Jƣ}>�����
�3^|6�Q*�a�m����

���9�����f�ܣ��[K��Nw%�������j�ץ;r�׺��5�^Z�ڸ���pi��赉l�p���Dx
]��2�ѣ�|mh&���Rm�g&�&��
�{���gc����4���v�d:⫞�ŲN웵�n�X
��I����{?½�n{{���F�5
� g�΃
w3��	#���l]�v�N�%��bp�wdY�z��욍M��hP
+��KGt]�E`�
�T������T�M~ϗ�~~����X���
��x�-]z���
�K���
�ԨӇ�Xs{;��vݪ7\�jz1!�}{����N9`�u?`�
p��i���w�wUx\{1��bn3�S�;k�WN3_Zn�~a���j�f7���lA�u`?��	�x�{�`�����wЌ`?L����#D����+�#z~��K��m�a=#�/�׶����������]m�9zF�_
���'��4�?!�߫'\#����_m��
)�����4?��������#=#�/�ߴ��D�Y'�:�X�Ky%(�
���|�����:nX�����6Q�l�ov�����ص��ݍ`fm���M���
�����W��^
X�`
�I3
��jr�΁��ӏ	�U�d�]xɝf��ѱ�A�YF�cM��~�v�Y7ޜ|��K�i����g����_B�6���D�5��R�4m�
�.�pt��I�
]�k{}
�?�κ>�ζ�nr�]�@��y�y1/��m\�X	<_�	�~Ot���~@�Y�D��-H`��#W݌/��I�r�5�����vϫ���,+��c���P�d:�X��
��������W��3�6�{���M��L������
)�uf3�8��=���=�o��n���蜮��,��IYZ?Fč{
9�K�`���Y�+��؅+��F
�����K��Ʌi��Ө�
i0~��R�m�+��݌�M���0�·�]Fj����U��#����J��
��DS;6
+��������lr>ڴ�s���%�l�^�fE���q(Q���Y}
ۡ>���?����,��9w&��ρ��d�p�l��@��p-�L�g�;`��u;״�0J���ڿ�s��޴��5�/��P���öX&;J=1W�y��=D���P;��F4{�D� ]��G���>�Ҳ��M�\
�؇iroU����s�)
a�ɵ?�
;���e��Ԕ�b�v]rМ�޿8�!��/_��^� ���Q)&<�">�4}���({Nh�ԵЂ�O��"��,�Ez���1l�a�jض��B�+ Ŗ�T#X�����u
�I�sI�[YJ>r�7�5NO/�]�����@՜.^�����fx�AO��G�#�B�6�-��i�Xb	�Iɖ�}�����~D���P�
�u8*�G��[PSM�f~Խ(K����X�����_�Eܢ:���h��S���e���Q�5�b�=��m!ӧű�0�i��|fJ�3$zư�n��\N][ˌ�M�y۵�e�9��m��,D#�mT'�u=78eɞ>�0��e�%cG��*����o��	�1�d���	�>����.w���i�\.�,{��ԣ���������N#�����3�u�e�w��J|%��Fj�y���p
m ]�^�m���#�
��A�l�qaD�p�V��k�X-��ǒ�	ff,��1SH5�אn�� %�o������NI��x��Wc!���U��I {� ~�F~q�_K�C%>���Z,�jgJ3U���N
��!�T��齇�û"�����v���ħLޚ��7�T�ިw*A}����ܮ�~d�I�x�F��[^V5���/ [...]
+N]*
v�����:i��s���l�Q�F
�ıd�g&��
r����+w
�ȸ�.�w������,��Ʀ�H
jGt�2
Ԛۻ�j]�ո�]���	������
���UẪ�Gj>B��
Q�QbcY=+��Ι����y��v���(�Ӈr
�*
Uo�MU���\4�P�r%
ղo��e�,��
"؟

�
+�
+�
�tG�k���t�l���i�#�#��S��sB�Z�����#%��ݼ�,���ݔ��6�-.�8&����۷�gjG�Ҭ^�����������D��&\��(���~��w����g>�	���6�!������D�_��~q���-�$�!M8&����4?��������=#�/�����Ҍ`?5�Rޛ�\������
�O�f�Y_z�
x��5.%]q�x�����lN�UN�a�E����ņ��5?�7�d���F��yQ�j{�,e������C��h�0�9$�^A��|�K]���w���{���]ZtB?��co��C��Wn��q���qk5���V�N�K-�
���blVp�
f��c#��0o�z�>Nπ�
�?���E!�*~���X��8���b-R+;��
g��۰�
`9��fg?����S
�~~O�|��p�y�4ϛE $��'۶h�}c���n
��b��.�f�d���%��Vn�9�ם9.�6��:-�����h٘eM�;}�����<�G�f^�W��f
@�iP�+zob
����?�^��2�lyik;�7���cg�ي;�+�����f��\���
z�ɣ�ٍ˳�r
K����'��,��\=�
+�
+Q���
+��F>�EW�+4��Y�v�`


�8l��[e�}����<&�������xW��3\�bˡ�A���K���l"
+ivx�s$��D�O�-���
8��+üy:�o�k\������eY�/���2�Q��ϩ��
�O���7܈]w at 7
W�; �����W���
+�"	�N� ��
$:����qC=r�F�Y�����ɍ^�7�M��U^�_�
'
�㐇џf�� _�?O����8���j�W˫ŏ �*�LH3�'�&
�ʰ�ۥ*�yz�L�-�^Bu�FХ�I�ծ{��_7�{�\d��9��,ݹo'��c3"�z��m����^fiX��d�!�}{���7�u�Yap���ܨ��׷��eD�զܸƬ<\�y�<92q8�
�� ɲ����J��z���֠�x�����tv��1��c���B����(
�`��5
�J=vv��
�s�{)��o���8���Ўǭw��ɶq䖫i�O�cBxL�25�`��S�v���P�Oc��[[[����� ���W��
+�K2�@hn��Ʌ[��C
��ӭ�)�b�{rY߭��cm�͞>}4��8b
���^>};�x�%��,�ӹ*���R��
�D�?
��J��o��s�������ߖ��n�$zN4��û����m��yb���c�mv�AO+Vz�7��Q2#ɣJ��m�������!(Y
u;�?��;�_V�e!�	$Z�n~����o��>?�sw��A��s�����ٍL6��BM���Ś�~��;5m'�q���{���2�{\3���Fi1*4 at M+�l���\��C�!C���$���a��
���pN-���EeIMo-=;���۴�WG2��V�#��-�>��J�:D󑦨��t���B
��� ���ѿ��m����
exif��m�$���=w|���}���W�V5�Q1.[<��Q,�/B���
�F)���K��Z����@ﴄ4��k�O���%��!�}{��~
NA�n��t�GZ+�ma�
��m���U�T	��(pӪ��G��'�3��;��
��1�Iz�2���(�a� [...]
��χ�"���\��})�����N��l;�ت�ݔ�{Ye�'Hy���76▫��8]�
+�
T�6�U5ݮW~[�\4E���J���~Y+����@ۤ7�zI�郮��%M����#�u[�ؓF���f)�5({1�u�޶�����(�{�}��Z����
��0���ڐ)��!_|��ɢ)N2
�̲?}k�zi��~Q�z鼅�<�8|�
8
�>�� 
�A9{WE8s���Y<7U����
�c����a�J���Ur� ݛm/�������z/������翃�wЌ`?L�;hB�~��w����9z~��K�E��>��~q�C������W�9zF�_
��i�O
|H3����3Q9������8$Nԁ+�p�U+��&��M$`OJ�0�xE�j�$�S�c_IC�~C����bv��qi7��f�II�-U���
c
��0i� �/�y��0q����T7`�qHӋRp=�3}�dCXO�0��L�+��Ի#���'��|Nw�-j8�~vn�|���ӫ
����KY�
+����'7ݚ&�Y�
w�|%zs
+�$�����K��8�O��O�bO5����u�,%[�q�{M���2��ؘo��>4l�k�?ZG�U2��Y�f�l�Kq{��ΖA��濄�I�~�������<����4�S~�9�(�<�Ӻ����L�4�0�
�݂���h/7쩸X�
��31{yo2�EPA�FK�g��3g|�2���
�e�^1`*uH��v��d���|M���ǵG�n�
���ɑ	�k�4��2k�enm�֞ke/��0^��|�Oo3��\j��e�ev��A����D%	����#�8
���

+?BB��h�Ы0;��ʝ��!�vӣ��jd̎ˢc
̥
;�Iπ�d}_�ݴ,З��(��墬�K���|�9�@=���c���[�0��9���{���u�iz'����Aܱ%�����[8e��B�6$O�g��˙��q\�g�Q�L�#����"؟
�3�J4~�D�C��c��
��y�m�)�%�s	HW��\x�-��Y�
a�\�j[3�^�gm�˕5Sk�J�hi=)���d��{�
$>��s�`���®d�p���>�����a��c"7�򅮕��nc;��p�
��j�u�x!3�
�Y]�Γ�����f��a�\�� �&��m��"}B=��O�����3��O`��̴��-��ܚ5�y���
���z�
�uj������@�x���mV���X��S��rʴ7��?�����$j�_���
��o�@h^�ϴ(���{#qmuŻ�g}����&�}��*
{��ʮ6�l��It>
m���%?������`�	��i'����>��oD���J���X2f��s���,	��Q��S�6z��,�if�|Ϯ�<�����jU��V��m
+���~:锟}�V��J�MM�%�`��
+R��|t�$�<gR�a�KL�07���gA�+�bPo�\|�\z��q�-�Z���1!��G:=T�u�흪�7��,$C����_B���_�J8$:c5���@ ��G��7��
.
$#x�좽�ϼ�:��}�u6Y�L�
fp�m�w_;Rg!����{��dᝃ����.ʪ�Ʌ����1��h�
�2
>��E����e|�W���Dߟ.y�; 2[۞�-��
+
�P_SybU���h�J��Z�*������9�:5Ō���B3o��F���y_��	�����閪H�h{y6�(�}G#�`"�*(��
���ì�v��FU�\_��τ9��i�O�z8�<�4
�ʚE�T��Ag�H��� K2��η�sx�.�n�cCEӒ�e��n��ָ2ˤ��x�)�������}�\cl:U��&X�����������
g%��
T��8L������;}���@���Ĭ�y��Q�G�-��a]�������_��c�����)"��b�a��[�w�ߪ�1��� E�.��`�~��Bz����+�ܝ��ę����m�c0s����u6�`RU��mo��Z�85�jr$g��������J���6Ō��Lo��
�M�|#�����#�
+J�h���X�g�_����3��QSpY�o��T��/Da
frY�
����޳�K�'8��������,
l
8�3���"�p��M�\��H����/JAI j �p�g4+j�o�6g�����W��k�U���|��3	����+w"`;�[ioP���u�Y�w
+�}�dQ��L�߽�#�����_��(�O�+f��g�43<t���lT��*��Vg�=ZV��b�����d>�ܪs���y
���k��������f���c.F+`����� ���K|�����) ��:!M�
�
(����xU�U��ʬ��X���`tK�f�'��9=�
o1L��� cN�}t���q�?0�
+0���y�٩˵77�6킃GK�}�S����D�4�9Ӄ��>��|{7���"�h�.�՚ͣzן���k��찗�W�\�Þ'��	��2�<�?�UCe�9�]+��hk����4��$���%�����t+�����Bd>�I"�
����q�	�a/�����n17�������꘦���B�T���Bu�:�- �2�.I".M��Q��
���>
�ς�����G6�U��W��b�����m�v�vP#�׃r��lIS��
�]�����
����D괺w�������q����tL����7"������ ��$A���0�Q [WaH2A<(�pΪuaȜWΠ�?&A��O��Adֆ~��M�C��;#�-ړ�-=n�����'0���
�^-������֌O��u�u������N��_ȿ����E��?���5a��w�[����Ն�y�����B��
��g�]4.�AAlBQ�E��wQ���5
�^�iPl]��e֣��X
y�3u����[�hc��|��D�ϭ�v�R��M�/_�50�ޥ����^/�����<�O{���$^7%�� %[?��:7P��l,�
�0!�ӗ��
b��\�ţ�]K�Z��\��E����q�x���NS��Vb�����!�ǿ��?���D
+`�rB���J�U9}�R�m
����\�Aɡ��2���b��O����GE����ԯ�/�Q���+�ϩ��xb���:^%�8+4&��8���: ƀ��_0�YX[e`�t��T��� ���0]�}���r$�%6��;z:��
����d(�ߜ{
�=e�3�B�U�
۩�o�
}5;��m��nk�8���Y�'^��9;�A�􀚛�d����p��ioXը���A�m,���_���\��zf
�ֲxio�8������@Fo��.��tm�rUu�x��_����w�v֧�}C�
�?��WZ�}�xƵ���d�#�=�SR���9
j�^��?�<��d���Gaָj��̓�ܥ��I�`��}v��+�: �ʧ?��g�k�%���7���2��8Z�}-$���ϼf0����
���l
���2�1�99�):q�1�����I�x�^���'C�M-
����
+
�O�en`� �O��i��
)O�Z��?`ɑ{����.ml���
��щ%��؂�i�Zw�N����`[k�9�W�F�K9���[�E)l����b(
�
�9+I��i
+�_�]\�߯�U�k�@NrN�</�o5�O�#��k����r���p�kYYm��F���ݺ�
�%�ˮ�ý��JG�u��9UA���[λ�9�Pt\�J%ԣU*~�T ׼q:�
�e"^��xn�ent5i��{�VlO����X�׸$��"�[_p�~�(h��(��ƾ/���������|Kj�L
+����'�VFF�j�L���r����p(��:�O����ljd���}&�� �DOZ�����,���J!���
�S
>58�VX����>=<PvG�w����o���S���+�ڏ�r�
�X�vh�
m\V
����@N�6�_��c4o!�毄F����ƈ|8��_�jn�c8����DA~K
��Sz��_�ٖ�p�f�'��?�����k���+m�be&l0R��b#A��	��Ҍ��,Q*�3�a�o|!��  
:��b
N��ॽʔ�����o=0�����ڝ\���J���5����՜�4�p���/J�1%V�fOh9;�f��)s��#\U&�wr1�%��B����M�7�Rn;��9��rq����]YU}���N}:�^�G�m.�:�gP�P�Z���p��̏�]Q��]>^?�Y��(�[�{d0
�7;W�\)|-��39�u�b���y]B��u�P�
��"��<�p�
����
+��|�~.M��yh��7a�T��-|���t�M���Yzq�L���;����py/���\n=�^����?�-@����JU려�x�5����u�0�e��]�K��2�Cg���u/빂WU�T��C��6ѭ
+
�ΐ;Y_�Ck�*�aKr�A���w��Ԙ���Fk�K�B�/�Xe!np��~P^�78%2�9�7�v��f�;�ġ�8��V~;ՒBYHy9��s%]*�2��rv{��'������Υ�OV'r+�Nø�;�f
s4�ݯ)>{�	��t*��#`��ۖ�
�Ƈ�kt���Ñ��`ws��:,g�s+���:��{7��L��$W[�S����
�'ٌ5Dz�6��od�D�2ޤ��v�'|!U�'��b��
+�儵|F+�����c�A-%�������YUF�����T[�iaG6_�����U��e��@�į~�=y��g+ջpA���'�rF�2�H�_��	����	��Nm��{��D��彼�Y���!�j$����>I.�w�Ը��8���l���O$���53t̜��w�;p7��s�
]M�1J�h�_(� �K�}�5�o�ky.�? u2��_�p��첹�j|�xI
+xe�K����J�'�3v�Z
8V43}0M��r��r�R�L� ��kW�+O�].3�r���
+_����p�7�Ob������
���_�wՉ�lR���|ʨ.��-]��a�ˏ��l5R;ou����/d�!;FmeM�]Ň�_{��l��
-���"����Ze�ԯ��G
�b)�
+�Ew�ݽ�]���b�Z���W��{Y�fg�NLĢ����:�Q}b�1�l�$8��<�W|�gK�u�^4�[;� �
+5F�T'�8d�?�_��PWs�����Ըk�l����q����2�CY�ކ[Xc\�x������E�
��r=��+A)���-jM�����_��*[�d�"o�+�|K�[|!�#�
�7z��ݨ�btY�sC�FŞ`�_��=����.��2an|I����Z�
�
'�L?
����3��+&zh�M�Ιtט��n����;�wL�]�*D�סg�
���
���1)����BFe�I�F�;�˳g�T�U�j�j��&�6L�HY�~7s]�;#|-tP{�l�Ecݞ�L����}�&ߎ-�u� �[
�S�Ҵ�L�� ���{���dQ�� ��PL'ߠ�\u�� �1w�D|��
v�r\���s���p�{��uw1��T}�3/ɣk׵�ܟ�.��
\dx�:���<J�]���[|!U�K�?��B���4a��[�h�u����4?�������7��&l��b��4�i�?�ƌ1m�IP��]Pd�p��ԯ �)P���Hpnd�56X?���J���`�j�청 [...]
�l$��I\.
�������C��*:�1��{��* �9����珆��eb6m!��Ӷ�D��m���ц^EV'�����>���[���Z�>�ɺEÞy\�Ƅ^�u��s�K����H���dyF6u�*�竣�x��'[=|}����M3+�C唾ڔ�ۅ".���B�T�W ��2�����=�����m.< �2EPNe?�����L�_�n)��a`3��"��Z׆�2eyb���P?��(��>�k���l4��
>�ʊR���usV���L��%|֗?DgK8���%(
�)m�'�"�<?;���?��e禎��j��|���+v�и����"p;d5�h�2����.m*����齦
UQ&�g^N���/"5���5u� ��jF�����n���j�_
�%ʶ�/v�)� ��o��#Q��{Bo�¢�^�AS9���
��+ŏ%�k�i �gR�2�	_�_��(������
z5���se��
��V�O<���#+`���NO���)\Z�Q.n�#��5��� [...]
+�,�V�ܘo_�_�
���.�x�p��@�ck;g3�m^�E�?
�BF�pE�ǣ
z�N���2}b�l}^R�4��L\�
���_\
��|���sViϴ<қ�K���p�ɴ7���=�� V2����|�*\�#f�hU�����&�|sE

��DWcSN[U��IBC�EE��j����&/a5�0�w����t�v���c˽���:�B�\37[��� �� ,���9���1�
eN}�u�����
y����z�~삙�c��J�s�nZ�On�՞�2�%5�ͽc?������6>�7n6��Gs^b�.��Qʼn��G%��-���*�]�],��>�|��@ٺE�M?��#6�w��vO�r����-��-�E
+Q��S���L�ך���۲�\v\�]ё(�K�f�m:Ԍ郤+
��K���� 0Ɔ���
��Z�?w�B
���_
+��T�1�+�9]��v���c"�<�C,�<
/�c'�_��5
f���$�R����
��T�Sܰ���a��K`�Nk����lI�% l�8'�EP�G#��M��aUϽ������6/��*Z�g�����I��Y3SƓʗ�{�Lͳ�
��1�2�

�c�ΣĘ�G�wn��
�f��sP{��B�g|!*�+Q
+C�[�L}
*٥᛭��ѵ����j泉M
#.o���
�]C�,oh��m��������k`�{�ɷ����^%���4}�%�.�VeJ��:TmVSN#�� �kb5PN,&�n���ץ�[����슑�t�[g[6d���K��/�J�,�k��t"��ɇ`�r�A�0��!�L�O�J�E����� \�
�2A�Vw8^�/?��I���&(ۀ�0�\�;t
+
������m�eE/5X�Z
M��}��`�`7�"�5^�m�̊�0�T�~�T��|�2����H?AWߵ4��5
d��5v�� ?����m>��3�>��9�rJ>�fGg:�-�p����奝�7ĸ���
�㦳�j1�<b;"�>��α��v�;ܘi8���ޣ<z���:[xQ��"d��1���*�P:`�`�ΔΓ"��n��_���u.}_��\(y\
+�w�Jzvfg��XBk\;4��G��ٜ��Ky�b���]��
`��\��;T����
@n�G�$�����{��z5�u��� ��i_��Z(L���F���N0:�ÔG�'.�p{�#�p�9�i8^���y�i�gKT��h�Z*Ԩ	�IRs2�2���F�M� v#
�yy��)�OG-�li�v ��n��n7;�Wcp��?�M�1�To�xD�
a�9\�̍��^5(t#.ݨ5Y��x_$�4R��H��pX"Rg���t�ɸ���D7s߰
S8M:��;�%
����
�)�q$�|�G���̣�F	��
�V��E�=s�fO�ͻԚ�h�L�FD/����'u3�����}u2f�����I�j���
�n+"j��~���|�i�k�|���g�_a�笢������/E�Y�Izp���d
�g���I���E��r�����Ψ�ۓ����nK��ŸѴ�K�Y}Y����p�%}�5�)g^
_���@�wr�
D��%��2O�o 
/O��A�VFk�:�
��77�0��
+���7=��,�φM�Zo&�f�a4'��Cn
+�9R[�.QV��$�!��Qt������ɶr���I
�h~���R��_ȿ����E�	k���ߚ0~�w���Sw�yH�@�{���А���a��mS߭?�AA�^@��@ވq�[1�W{��|_����aݽ����o�o
�W�1���e9Ye{��}�.���O�B��� ?>�~ͧK9P��I���fj����� �K,����\� �]Z�Z\�l�iǽ~�ɉ��ݽ���o����ZT�
���.3��
7g����t؟����S��t�õ��|�t�G�O��+��'{�"(6O�
� ��\��
4�6�VT)�L('ң�S&>q+
->dW�7��tgp�]mN�ݛc.��y�X8Z򥚅�q�S���E�vM��[�-f�PlD.(�78(�^poŔ>�&�E� ��Oc�0h�٠�>p~�Q�]c�]8&�^٧m�م�w|LAh�+33:S��e�j�ݱ4d�m��_�
����E{	86<�f at 15SO\F�eP�W&��sP�.���a��䘝 2��
����ۺ���<n
U�?
rws���V��������A��
��P��S�����$
cdt�}������\i��Q!(
_UP3P"5+r�L�l��B��z
?մ� Dx�"��2�^ߖys��*��V)Y']�8�k+u4$����Ձ;�
�f�-;����:�>'��Kv��E��-(U���R
��<�������p�h�u�;���i�Ӝ�Rë2��;�
�2=���8�Po}ę�Qn��n+k�-;_,4t�����M�_ȟ
+@�}�]�a�n@	��ݗJ��w�r��"jLe+$�H�#�~��L���3��V=tO��0��}p�
��RȎ�5��j���ї��%%;$犭�V����	�w�� E�|K4�2�t�[��~.��hj)>���(�{,�~م��	�'�LJ�5� %[{`�}�Eo�rr���������-��+v�z�s8��:�p�S�.�+�~�X/�m����2��܉�
X��3=�yD���g�������
G�6/�����졲
l^5�r��6V%�E�}���D՘���
�	95Z�l���B���(�����N]��s8����I����>���<`P�t��M�h��y�i�
�2Ɠ����b:�E�%L-=g%e�p��n�jKO�	O
K�Am,
�N�����r��O5����������p��k���$�>������#�3�F���4���C0~$��CMoG��Vq�S��"j��R'����ũ�`������-;K�f��0ߗ �yX�^��{b��ƈh�'5�t�
)��{�&s��b۽
�д�7
���n�k�T/���H�os�,�G>�8�ZQ�q\}>�	� �p9j䵁 � +H\��`$���.�&a�^�5P��f o}�oYߧ#�}�&Rf���5��
����
�����J���v����d �Y��X1���
+�+���T�����ր�G�?S����~
+8o�]�:z�bҨ�� �|����
���b;-��8�
��ү��<[�<
�J:;4rݍWX���A�U
+���5�J��	�%�l��l꓾����П;������/���-ڠ0\$@�n7�J
+p�gO�� H�%/
o�*c�I#�]׎��X]t$��i����}|��|���,fLۛ�o�p�j��H���m下AT�RV��"p��ePb�y���������E.��Qeۜ�DA�O����y�ݵ�U9�#g����`
ΛV�}]�'�*��c�p���M5���,�«���q���Z{ö҉tGC��dG�q��S�¼wk�5OX
vMFeM�<����Λ��m���9�X�2"�z�a�*;8���۔.��5���O�n׉'���.xC�@���
S}�yc��l�ٷ
L��8���l����?�	p�$���Ii8��.���"^,�K����SO�r7�@��|l�Ԥ���{KU���NFU��5g|!�v83'��hq�ٿ
�� n@!d��T�9���K�u�&L?@8���O[��}?�R�
��!A�|.×����غ���>��j�S���d��*���jP9�b�W��vS���s".
�k$q��R��f(*��F��%��3�˱C�+jF�X���mf�S�B���H�9�7#:v���G��D�� [...]
+�ɷ'(�	
F�*3�tR��k��=&��z?��P��Rj=؊�e��+b��v�\>�N�*3�d8C
�����`�։�2S�����
6����-��PpT����IhUbH���S�₆[#�Q��Uε�J+80U��{l��nt�^��)I{+������l�T���(��{CzV
���?gNJ�ff�þgcΕ���C7�Ój��7�W���%b;��D�F����W��d��-���eЃ�����KU���-W���X�K}S`�|���r�DD÷��
2G�Ğ'Z��	2ճ%a���>7�@���T��X׎��^n�ۼ{D/�"u-�ƌ*��NE�L�:Y��8��B4w�7��5���X�O�Q"&�;&��x�
d`�b7���
١��
Ӎx����&O��m�$���#E��`�5&��r�n�Q�>ϼW)��z��4+�l�;�j��_��k)"6K��
;�U.\��aj�u��D�����5AOH�GK�n@�D�D�>ƞ������*����>/�L{R��6��-��j�p�`��F�������@g�GV�$��:���qzzs:��)�ǣX�ٷ^
nWSt�i�H2��W�t [...]
+kJs4lj������Z-�16�o��q����&�,�V����)��������n gQP�^�A~����y(
��
|��4���ȗ�'�:�O>
�XC�\h��Bې�uj
+r}|j��y�LV�3i�AS{�=�+���t�y�v
���po�� ��@Q�|8G�/2P��@�4TP�h4���,ȇ�
+���+�w6oX��t�5Z�z�I��q�4��Z3�Ĩp�
��4�e�i�`�i&w���������/�6? @���PX{���а73�~v}�Y ���izmgwhk��m�҉�x
��L
���=)>+��:\x�}��XOc[G��
.���[�7��g��X��]�B�/�
��KP�܂���
#��'qY
�\��#�	X`����-tݺ����/
��0źًp{�=���,lT.�`��6~�W��{rӞ{}LS���$�9�V6V�ZY�֬$� �>fԏ��R6 at C�
+�
����am ,� (��
�
6S�uO����#+f��N֞51K���e�OS�'���rI��K������<.ۆ{���)m�T�k]�a9��p���f��y.	
+b*�1
WGP�Uޟ
�ɦ��`
߄�͍��t:��C�׺ݮ�c�=��i��S�=�
�1u�ݽŽ.E8\�y�
�sve,��>���~��q��B���+ �ւ�}�s|W�������P�(��0�{
P��QM���]�]UR
�D�c��*
�Ůؾ����m}~��\�f'&�*��̃p
+}�]K�ת3���h���� ��^_x�z�4�2�OF01��.�A����I���[�-��mn�i�� �*���� ��/�
+ٲe��9ި��l�3���������_/hÉ6V���8����ijî)|�?i��l���$.?���v�/�Db at 9��e����WLx[������	�2���sq�/ꡦU�1˵vo���R�<ӆ˺������ko1�%
��
�S� �����t��|
�5?/6�J�4�n�粑��!�=	~��Н���ޛ��
qXXc
+�
��F��'�䵒ޥ�T3�yI=K����K�b/�ӵ��F�Ж�2H�iY��� �1j����ˆ�� ,��*�=I�D�;�ۭ�3�Kݠ�8��	���Nf�]���
����7�w��
�H��
�NsXrS^y������1ګ�ݘ|!2�|�{$�[��R:����h
�<Px��|�7J�h	p�n�v�A�8J���z;�+r�jln��9�N�u\��Y���3ʢ���o3�!�:���2��d�rK&��J������	��$�^�C�
a�_�_��|C8�<��p
%�(�B�an��ӎ<��
���������

%���
#*W�}Zz[�Y�^6�g�s>�Z�lyˤ�%�[)י���P��O��to�(��\�z�y����&�ϱ�
Ϣ��[ҟ��Okމ��V&H�n�--��"��s���
����鄫o����8�F�
�$�j��t|�����*�\1��\o��� �
�<I>��]~�ζ~ X�
(�K��d�y�5��'-��}�γ�W?G_kN59]���--!Ֆ�x{WvLJ���zo�F]]���d��x[wn���q����f��&3ݾ�����%�oB!��՚��K�����wQ/
E�>�ɷd`�/��I�ܐb
+)�^+�o�/9s11�ٔ��xa��v��؉͊:%5ɺ`;�.}�.�	���}���I�Qx����8
	5ɦb��O[��a��`�+'8y���(��|���	�a�l�0�����n�N�C�4�[�Cw���,�%��N�\�}�
Ύk�!ت �5b�
����c�8\Ѽ�#��AG�`�
��
/\Q�7�ɉ�	@^Ҡ��b}W��; �О�Z��hĶ�u��l�o������y
�������}e!-��LBZ]϶��:6[;��樢J�A�H�u�e���6A?I�
�5������
��
䷇�ovNHI(�ՐNd�.O��Gwqʝ��l� Rjwn����V�ٛJ%��ϛ��|�s��d4ܯ8�RP?�Ʌ�z?f�g�=��lj���U���|D��D����O �'�
����+S�-�
E�5�|!��n鏧Ý�hM�Am_���D�@�w]�]b��p
��1�
Ǔ	�*�\�(,��Tr����Mo�v$���=.m��˰Q�q��Lj�B��#j�  ��/ [...]
=
l�+�
Yk9Fw�^��w7n�R�J[
�\uᎼ�@�{bZ at u�[P�` ��OK�9Š��u�PN�{!��  �=C<G���"����? ��;(#p/jމz\�f+m5�=#�Ry��
�v��xe�JJ�a���>�陲Z��@cZ�djʢ�����JW��#��G���&�B�ݯu��
+��n
꼫]y�
���3 &�\sb�]�
+�3�=LY�FF.�g�`Vmw<�
+��O�@�O�����}���Qa:&�X��9f�K�^�+t-T
��2�#Bn�"���|�tQ���u�|�J��|4Ӯ~�������
-P]j�<�$y�>o���( A�:��C�
��5�N��Q8;
�Z�l\����kD7jќZ��
g�p�'��փ��iL�ZW�˪�V73R�,d���n"�<��a�yJ�<�(곋>�f%�6k���H��G����puD�kc�G��<��
_~%z����D��G���E����/�H]*J�_�
�����UQ�[��Y�;��B���+\���pP4n����������I�>ks:̵��!���OS�{�=��q�_݈N+��>�_I��gb789D�t}v�q��f�)�3����;�I�e�0J��n���_I�~��M��~!�q��m:lܓ�L�-���)�1����Ij���t��r
�ϋP/S!U��$zY���
�~g����Y\�m�_�Z7�ص��4��ƻ7��8�B�
{7�
����^_�6ę�v�!�ٴM���x��
��o�u�ė֐~]N�P�~N���e\"eޞ�QI|�'�)�⛃|S�vK
o۪6��V��z'˰5�cF5� ��L��=����l߬��D��������lV�rmy���`��f�+n]��AF�={�
+T�
(��;�}����kVAݨ�z���R#Q��í��װү��JƵ��Q㆔�0,�g%U�']�Q�m�n��	b8�@��* �g�Ϲ�^�܂M 4�� t ��y�V!x��=�|��˄9��96u�v;������	�jH��(f@���l�^F��[��+�4V�Xᕠq+��xt�	����'����?��B�A�26@�?AQk�h7W��
��C�h�TM Jv(�&D��:ȭP�f4
��|���wfc�m�
Ȋ�!�R�,ηQ9*��:��M����ߎ������#�Pӟ@.�9����I�Э�|�΁|��y�A>S� j�z 
���r�OA[��
�2��4Ȃ�d-��G�[����&��4y��{�Hۺ��`�d�u� ��lEg�qI��krps:�NA~��A���@~�+CW��N{�<���m���m���2�5:�6
�\bk���ǵ
:����;��HRػ��n��9����J�+|!* 9q���kԪ��h [...]
+PvM����]
*����
�
�9��SC	�em45:���1
9�1�ۛ�+��N\� �k�W��e��b铝���]P �9(�o,1
+ܹ
+�v�5��|���\�
��4��g��X��gE��pq:L�z�.��
m�r����Ϋ����֟�d!!Y���@N]�nZ�~N�>��n�IP0�����w�)Px�Z� �xʣ�/$��Sܬ�pY�f���*�����Nz����͐w�����
N��_��g�f)ց�$3o�fa���_�� gn>�I���E�
+
�4��|2�W7��3�)4�
���������z�`�t
�s�����\LEƕw���q�_[HV?�@]5��i�xfԻ
n�\C� 9[��Iua(��|^7q( ,��}���X�b�
+7�=:�ʘ|.��4�K#�O�-�
��>?���f��k�tS�
=��Mt�xbt�n
�m�j3�X��
do���
eO`$�E�
� ��E���O(:�1��n,(bs哸� ������
 iL<c�P
�c5���p��W����wۮsʨ��<Et|����ü�+�kz��}���]RMp�qrg���@ofpǽ�IZ�o�|_~E���'��d�� v}g������M��p��;>��s�
+ң����Yޝ.u4/�t>����XvxWo�����O~��߲C��
��@�*���+=���놆�~ �f�[8��g�5���E�߉���F������3P�ـ�gZ�h�^�_I�<
��,���P�
s���˶��zB3R�
�e�
v�K|ˬ�5�����#��M�s:
+/�
��(��a��ş7�V at qL?���x^U�psj ~F
�L���8M�Y�ɛ<]������j�퐛��!o���p����Iͱ�n���Sm�du��ȉ�\��hW2�LS�/���mf�?�Y_�l����{�-e�%\�
+�"l��Q�S at Q���!��O��5�<{�Us�?eo6d�I& {��o�g��]�u����sYe2��aS�ܥ�pX��V�^Z`���Yl�����G�8����ܩ�	
����Q|"�̊G�r�
�m�9��v�:H˪�c��� @ԟ�>#���~:���<�RA>
z/'۽� �D���ڲpnT��h%�z�6����Q�X�ﻧ�nNG��hog�
+��(�X�(���Iهiȕ�i�s
�X)���ɖ��D`�������/�9j�����-�Co`j��w�o�;
��Q���v��͠Nq��4��\'��'OY\�$��1��ш���_>,��z�6*��uP
��~l��A�r���ޣԏe��"�� D'^�y+m~rN}�[VA~�Ii=]>����v���K�n���.��F}�H��B�����Ӹ��q���F�[6-fs��[Pf��P\��7~��P��^��?Rz�V�z[�Jz�=3_��
���(8���:����BI-f	e�F����=a,vZH ��^>�"X�C��{�Ķ�
��^g�;�=��d5�u����D�l�
u�YmU½����*q�T��[,���B���� i8ʼ=N�5�3�s�k�[��a�&w��au|�
�O8*eP�O����V�Y�YnL�F��*|�Yő�1j�V��I`m)����\��]�Wv3Y���U� !y0����OB��'e�;KR�t�]��ð���эa��;3������89�
>Phw(P%�� [...]
����B+�Ԉ=�V��N�U��&�.谳�
qu�
D�8��\j
��K�E>��?��
+�Re�X
+��q��Ƌ#���;�Ej���{��r�r�R�V�t�z��Q���f����@+k$r�� �� ��3$�k+��!LAv>���]߷iu�����&�7+����� h�]P�� �F��.���sO���Ω�\������0{�.����?ݧ)ml��Ț�S��^�Ҩ�T�o��ܝ�d]Jo�m����Q��
ל���ɞ����G�t��勍��'+_��
 �ր&�`�M�Z�h�!����wh�6T�Z���j�~`+�Vd��0sg)\~��랷���b�L����k��ɳ����ȡ���\�����d=嚓����A�q�kl���ܽ���K���
�\�z�rd���^����c�ޮ�H^�~��ԎI�T�6�]��\gm
+"�`��ʼݪ$C�{ƈ{��
�&
.��Jhq��I�Z�,� ��:��
�+1ߌJ�
�ey����Y�5CkS;��Y���)�vҝ�s�:)��z�Rm�#I�*.
�(/
�{�]6�m��
�@Z���6\r��sⲎ�n]��4��No���������N��f��ju
[��upgo��
|(T���!��BZ��͡zS
�O~d��x��]C���UŰ���c�i��j��>U�٦�:�2��-�F���6�l/[�]*|]�&���o�A�>?מn[h{�J�]��p�R�
�6�r/dT��U�g���0mũ�r/�����D�ʹ����iEn1�/�j~�D�)
����z�C�
�!�n}?Zu����4��
���|�U��w�4�뭼�ٚ���x�`3I��J��`�7͢,\n�[R�t�q���m����dI��O����.cq��3m�tU��}]��o�Ӥ����Ż
[N���}Et�v�c� U���|�l7��Ӫ:B
���̫a��렯e{G�.Ͻ��v4��J�[ܪ�-Xc��C � .�B���+�7�9����%~�j��Q�����s�r���e����i�.-�$
%�r�W� ��\p�Ӡ0*�Vq�ϒ>�6��؇����!4�N�i��M���F��u�vݳ��]����^�V���@�Oٕ�L�sP���J� E�엊�}�(��L(���h��b���O��������?���
��mV�{K�;ԁ�@S��vs)n��L�:��(���d�W
Q5�n�=*	41.J�dZ�
�E�x�W�V���{��
�ә��Ӎ.#IB�r*M��B�tt�@6�Z��s�w �ޘ �� ]����`�R���*�8e� �M� p(��9
�^����!#K�~�=@��
��
a� ��*@'h
��R���кj&D�d���Ȋ.������߻�%t� 4f� �v7��� ���\-�s곹;�^]
�
j 3�B{�
���C��#Ԛ< �b� }X�zb�"��`�I]�j;����[1%$֋��aTj[�gUj����{(38M����z���(����o�
�����\�`ݞ ��T��e���
��
/ ��`e8D�r6%�
@��
�6�����1eG�(,:�s	������~����+ &�@��l�ZI? ~]`�(�c
��B���� �S<���>�ko��v��aǰ��d
V:o����t��l&M;ֈd
�]{���ɣ�M9���0�������G�]��7>�|^y�p�a�
 ��	�
���@�^�?
+"�ǒ�
+:�^ ��Y��
�Z��o��>��^4�A����ѳ�[f7N�RIqBY(��
 ��>_�7
��
� �	r�y
��r����!�����	{��@<�P��l�,�(9,D���KA�����—�>�(��}����Z�0G�g��|5>�;u�`,�����	���\��!
#��[4��/�<���
z�U!
ru�
+�p Bv��B� �B������*r�L4l���|�K�1F6��S
��ؽ-�����;Zu��*m��<;��"��; ��@�����M��i�] a�d�,}gXO�g@�4�n#�eIy���
ݫ���y

q�r{p�-6��<�'oYկ\%g/��(3�Ѕo�ʓ&���
���Ʌ��ΧZ��(l�G{{e
V���;p-��z�
?. A'���|r"բ���}6
Ѽ�{�4'��ڠN��ro]ⳑ�gN�}:wd�|h�j�>%�-���k�O�A�>ʫ�{$zq�����ڶ�ׅ?�)����
�9(tYK}g��n@I����#��6M4�XTu�}
��
��/���F��:ċ���/��i�=��m����v頛�k_\ӟ���U͋�DZ�롰X�
n������$F�k��̓��)�$��t|�˨��F^R(��ы��Dzo=+�ü��
��Es�w�-!2�
�GAp�;�֒�ճ.ū�5D��3U[�6�_����
��������k��};�s�^�
5>�7�nGe�Y!X�zY�
�(|���޶��� � o�O�
+�ڋA��US]����3�h央�7�x�e[P6�N�u��U=qw�5�o�5c�]nZjT��h[+O�J��� �� 
R	�hr�B�-����;�ևB�~?1��*�
�����k
˓g֦*{�ԶTz�7�.�^~����\_f>��2���s���7�����й#aکZ�Ƥ~X�c7?)���`/�3���L�yz �{��i�������ڈ+����Jꇛ�=ŗQ�
<e at o5�V
+�����Rs�Jy���]WuzE)ñ��=q���ح�;��|"[�]��|�Q�H�����ps�R�hCu�7��^C��z��w�{�U��-S�+���l��m������3~�N��U�b�;���.�QkZa2�d��ʘ��m`�V�VC�߸X��X��S���2o��
i�+�����9��&��
 K���p$����K.ʹ5sr'Dp��׃���6��"A����
+�q��f!ua���M��۶�[��K��u���g��U���0_~�N��h�Fr������
+�&�S���iBoy[\�g���7ZD���=q�E��k�Y-RMl�
rn�W�;ѼW
��t�Pe����]�F��q�L��]1���4�O?�<�~���}n���
�+u���[>�!�h�ʁ<g�Z�����u�GO��y�;��!�O�K
�P��jLN�	��%vPj�k�9�iT�x�?�4��
Yڪs�4d[�i
N���1%!����_��9 ��A�m% �D�V|
+�5
x����g������oʛ�e���x����٨6�NޅffD
�[�6-wXD�|]�8��nY>��p�l(�מɧ��h�<��Q-��3]L%�C����9��x
(q��6� ���OA)����
��w$;�E΃|Zz�f�pCG���$}Ɲ��
������97��5F��벆��
EsQQ.�w�W.e&]��l{eyM�9���"�02Z� ]8e�(/I��g�������*���U�ܶG�Ow��B��;�?'[�^Ԥ�2oo!;��SL_�Ҥ��̂��3��P;���Q$.�v�Fuә�Ji�?I�5A�.�"����������vN��%:J"�x�Ϭ���.�v��"IG
z��๷f����Ֆ�,���D�t_�U=�09Lw���=*K3�;��Ӧ�=ٺ��
1��k�o�S�P⊸�t��; �z:І�����wr97�^|dN�z
+
r���Ǝ���_~�����tی{��yX�7���z`%��}�ٺ����)R*E���؝�Vٛ��_Z��8i��[��gcR ��A�
~�U�.�j�	�
��9
+��C
��S�n+�:�ӽ�R/��٫6
N���1gkk$e��G���Q���C����
W��*��E��aڇ�^kÓ�'��|b
�9��1_����,2�����
 w3�+�ѩ�54���`�b{?�ڱJ;5D�
�I�9`yG�k�輩N�i���Һ�QO�<�li��E�Ց��[؋&�f��<�2l3R��K�ɹ���5�#�s�A�K�ڬ�ҿ������;�7�pk�v�, {���j
+�ح�
+�';�Kд��3������T�ص�\;�p�.D���
�>�A��~�<���R��w�KӕQC�z��#
��
�u�
/�7����� Ԙ
ε���h����tM��f�+ye:K���D�)���>Y�׉v?W(�T˜���Mκ�d�wrH� ��iI��e����6���p�ǵ�e�W�!�쨾9�A]�T���Pl]�Fݺ���Gh`KuOt��4����	f�e�m��d8�7�x8��HC
SE=�h��x
�z�b�+���!����=�o=�Α���{�]m�iI&8D�J���m�w�H�A�䜙֎��\�S}��?����(�;�k*�a�\*RT�E��M�yK����j*c0 �$��$
ھܜL�֪�96��ZOl՗%�o��v�}��9���66R'l[5�k���N��Xc��}!_a��Ѹz��۪-�2U�[,����`Sr����gO�\
ov^iX���F'���S�*����2K,�h��-�
D��p'����<�+r���
�����H�N=��ļ�ZM�eK�P�}X��TD+'{�Xv�%_��� b�;<I���'q͏7���X�q��o��f��+7_ۙ$c�B͑��河9p�a��&��
X������W�՛�4�t��*H��9�Œ�Ծ��wGE��y?Ha3>�
r={�P�"��
8�x}B�]��>Qdrj�������'�굫��k~V9�C���[c7qȆNqR�[i��@��2O���@OvE����mt-��Q��ɇ���Z�<
�"�.c�@ݷu��ӦXr5�~�\�t�o̲gMD�){Dn��$#IY(��
+ϧ�"���B��N�l))U+��zڹ�R�d	�Ͱ�a��B/r�j��J���E݃T��f���������"v&��“�D��
��Q0��; ��
+ at F���5�
��r���
`HϒR���-�t���<� � c�&@3A 0�*Or��� k�
��I
 ��.A�x�R�SrLNO�ב��_�b�?BQn	�^�S
�-
 �S�:*
��QV�x7����oYF\����U(�� J7�h{
���
+P��H�, $�p 	K
��ߦ?�w:�
�{%��,)2�r��A�>���E
+5�3��[���O�
�8Ģ�I�l�x k
`E�$
+�[V�.�%
=t�j�B� *8�:||�R+g ���'B (�T �F�����N��l��h�v������P�a�
� ��
�
�wv�b�7�T��h����
+,AрU��� �g�_�Y�-�r Pۅ}C�� ���@�_h�������e���o>o�l� �+��$w��g���+ �m�V�V%:����1��k���-�/t��y
p�� �S ���|r��D)g���+X{(y	{������ :vj	�+1e�f]�Y
��7�m�>��˘J��Z��w%
+x���C�݁+���0��^ �b��}��;� A�v �Ko�k^���KV�%[�$�͟����'�c�f����Լ��T�iS)��`r��������pcW�M��.4��~@�����f;
�o�G at H�A��
�=	��B;��e ���5{c}1�_g8~��2������.O�_����<H?w��֭���W�H�CY ��`83����=`���}
�_�@�F����2*P�+�9aZ9=+CH3��%ٯ�H�z�=)�|Z7x�G
�;�w�w�U]ݖob��QxE�{
ʹz���ʙ9��~q�����!k۠�7
+:�6�Ͱ�+�|�0� �%#��+�~g'.?X@����2����5d���E�����3DF���*ں襳s.p���r��
�y����7ѝ ?�[iU�n�����5ɿ1�z�V�j<���d
Ɵ������w>0H�P���^Rr�>�רi���"���\��#�p9�����.��p���U�y��p̈�f�&�� E�5�@���IX�p�ǻ��:����X�����M�W �ei �Ua��P��z �w& �h
��A\��O7���;
/���=s
� R�gV����-CnC�51�

+�+��g�<�^�`�q�u������[���9��<�D�<;څ¬�b�_�����t���B���a6����
D?rf�����Uˉ���i�Ck_��c�Ђ��v����yݛ]��ra#�E;��ue7rw�n��?��6c2CvZ*�%g4W�(-���m��a�T� �i�lJ1�E��3�㲕hϔ-�~��Ry�.�9����X ֗�=�U
� ��K���
ԟ��}������35�HwFF4�<�T0�ӋxR�c9����������?���	�>�������3

+�H��L+zy�

��fxa����&���޸l�I��O���k�FzL��[�s�J�^R��	�:��?N�r��He�δ�Q�x��|��GۤF�M
e��@44�}����Nbn�� � V�M'���yl�7���/#y<=�s���>8l�y������r໗ozz}D��~4r
����<
ؑ$O�C�fȖ����<y�֢[f�ʞ0�d���#|��Q�W l�����n�
����?W�Q��!��(��i���#�b=
�7�yvrZ��suO�!�޶$�ĽAz�2R�(�
ɡ��J=C�f�F$�l��}ӽ��<g�r"Ⴧ��N��
?����Xv ���$��JOހ�G̫���{o�6�2�~{�o������{�[s?��eV�
�D�E�L����z�<c
�E�4�gިTW���:j��8��V!��n.�����y,������2P��=��;�Yߒ� ��a��V�Q�l�<E�ͽ,u��]hث��_,��g=�ΰ��\+��PR�
_�	�f�~f�� [...]
YxiM��?��>�2��#����LV?����>���p`���.o�T
+Ŕ��x�p���I�Ok��v�:���-]
+���yw/�YZ_bu\CkQ^%�����^���z�{|T(��*T��Rԁ��p��A�q�Vi ���
+��P���+G���+r�UZ�~{3�MٴV^��Zq4���|��7W;�|�����}�
�R��[�
(�㒽p:(u�#�խF�!E�Ѧ{"�^9�O�,� ��}R�碻 �h����i8�m��m����<���L�r��B��^���$i6F�]oط͵YM����;�Hո������l���2.��F�$��I)�*z�����-#5�tJr�-9a�
+ at 0}����a{�Y�v���1�w{� �jy�]����B?���u����$k��#�N�L�������(�8�TA��%�r�N�~"q;6�IK���&
u�[J{W��ZX�Eq�Έ�!��% ����94����Տ��v>OTbr����髌��wԣ�1�`�
ǔ[-�9'���;��c��
��.��s&��g��m��ؒ�Eb'jdbX�Z�z�m1�-�a�����nS�4�V�w�����_r�ۆ~���\����O����l@����剿
\ߓ��}^.�Q��w*��4��j����q�4V.���{b��F�ێ�
��vd>�zAJ�
+O��ˡ\m���^���/����
_��r��/�|������&��}��o�Vv������:����³;��_����c%����i�a�rڋ�65%
ﭞC
iI��s��N��V�����|�iN&>��ܐm|�%��8>������”�f�Gq�6'�~�?����R^�=��5���
+)-:
f�Pg���vV��z�J�h8j���z>J��F8�
+:R�+-5I,����
��x�a����s��F�K9U�! �^Z7�ޥ�~��
�끘�Y�-4��B�W�z��=��nk}���*k���e��S�
a�?�'�`�ǭ��������Io�J��.w?�zKB�H���h��������L��
�����ҩj�z�4j{��4B[մ�����S���G���8��^k�0n%�IunL����qn�㇬Wu��
�J%���1��\�HA�N�;*� B������Tь漯M9ϒW�`��8���$�Ej��*��XYc
�lQ���b��T�G�P���⯀�
�x��>�Si~�`y�}��m�
fܯ���My:��޸�����Q; �v��&
�l~0��̐|�C�� xA���l�N���s��l���F#��Z+U�^(Vꏶ]�?�rҟe ���bTZе鼻bΦ�8grM3��_q]�����}���$c\ 2�۾M{g��0Η#А��L��O���Y�W��Ŝ�D��[i`�A�U^���[���V
+�t��h�/Jl{�}�5�_�؏�)W$Q���1g3Y�x\"r"prWJ�4q�/i�j��|Z
rR����y^T�>[��;�7-�*
����
,�R�|J�K
޾ԡ
2۩0���P?-q'?�u���^�p�� *诘���7����3�{Z�>#�z���t4�Tm�G�ϧ�U�ku� C0�>�l��-'��=�/���Q�
����O*Y��~�ӡ���zy��`�SL:��K�ɹ����%_">��I|
��Wػ2�1��
h�^w�m�%\�z�O�|���E�N]�췏�>Rq+}vt�(1g� ���b�D��Z�.g+,��x�tT��%'D$>a�#�r���$=�ф�a2_
��]��P��FPMc?
� B�� ;� ic@n�
��}P�t��B ��W2��)@:00F��
 �
+�.�,�|sY�� {�`��R6����� {o�!
",��#S���&]�T���y�����?y[܁B{���h�Ǡ����Z ��	 �!��/@x	Bl�0� ���!�� ���X�w! 9���$8��x{��b�hU~@*s �o�O:��q�f�����"�2Q(?���h.�4�:�8�@�1	����m�
<X�j�[��� � M����(,ߔ��G�������jхb+ ǖ���o ��A����W:
�.��X� �^� �t 
�}�΋+�*���c�� 4#6 �aU�q��|`$`� �Z��L� �FA���O�Xyݻ/��t�������xV�W�W�G�"� ԰��
쟼�xt �yC�y�MV<�$�X� �o�
�V�j� Z�ÒRW
����_����8�xg���Ѡ��2*���͡��*�u
�վ�<��}�� Q(�M� }m��C�
�]� Wzi�]�m�pJ
�4�ζ��`\1з�&U�׵x_0�1����)=�_�Ip�.�9�J�J�YeZ�{��Z����m�[�'
+W�&��=ٿ���@�[�
��
�Pc	�9
,����2���.�w�	���!ٞ�w|�s�s�X~�5����>�
���ƕ'k.�	gn���v�PI��Q�p
��˾`v.�v$��~�x3����¯ ��,�^)k �2�d�����
S踈@�A
T@��Y|�·W�G�g��>^�$�M�jX�[6��]%�l������-.�I����
�J�G
�LP�'A��fG�,�Oq��6H_
y��~@�W`Y[��$A�
|�G Ƕ��u�1-
,�Nd+��1�ܮ?�=}뼯�Bq�\�}�=]��h���qG��
����2���n���"�ȥ
����v��j�ଓ%�:�Q��b��?�����S
�	���w�]m��0�r�i�9��/Y5���#eޖ7
o
C�r��R	I
�a��/	��eq��ev�d��_�+4�3Y
��<��r�b�X�{�7���:U���̲e}����gt����	�L&�����Iv�ィ�(
��8t�tŸ���b�O�cC��{!�ܷ�{?ِ�l:�t<ܿ� [...]
+��"0H綝N��g&ϧ��o���� �3͙'���s���
+]�@u�<
M�廤���^H�IJ���O6�e�
�`�n�\N���#w���g�x�NMM���3����9�q<��1w=M��n��.7|�t�^|.)��
�_mH�2-ʌp�D�(��N���wy�
��
����1U�{��S6�9
�43��u~�̾��\����9��V�9�S�
'-/k�!igr�ʨ�:�����9zn�Dz�1T8�
�E��E�+���$�o�����W�g@����#�����#B�rc��cT��i]�����%rM�9�V�3C^m��Y:L�&
�H-�n�=��f�{H�<	8g2���^ck�}`�3��9��o��yF���|��.tH=vNq	ۼ�
�T4���M�"�K���uY.m�����O_�2G˜��t<3;�3A���M�6�X#�M]�
����L� ���Ɂ=4���y����r�.��`\6?�qn�x�
+h�.�Y7M�5�
ls��'��lq2�2��ɧ�A�w�Xf֕a��J���B�4��p!���p���ǵ���
��cm���	��17H�o<>�·hQ��
A��TO��>_S@��J���C��+ v�� џY��P�sM
+<{\�5�~��
���cҟ���2 ��m�L�Sޘ���
��i3
�za^�sߨ�j�~,�C}�ؽ4�t3jW[������4�� ����>��b
Q?�_p"��-H
�C at r(���k)�n��9<%��a��ԟ0N
����*/�㒟
��4��fc
5E���|̌j�{��)��3��Q]��E��]�>��z&e�z�3��]�|�j�Ban�����
+��>�_Y1r
+�/�z�.��
?��
�nۂv��J?��r#t�n�Z
'^
ű譔����_�/v:��jq����W�u{'���3���;:e1ire+R}xR��W�w�6�W�7��
��
�9���ބ�Fd
���:��5��?_�o��
 ,h�"��W�Lھ���f�*n]Ũ�9�鷺��u��r�
�`S��%��:�|Ȋ�U�(f�+.��3'�KjXe��� M�	e�Z�njg�^Zٯ���=�^Ʀ��c����>��s�8��U�e�[�Vm�����������s�q��lϺ��g�y����m���=h���0m2'�me���u�D$�ŢX�
��P_�]Sw.��t�ٞ��l�aE�[ǖ��e>/���2�\�3�
94j��1�>\_������ �߳󫡔�I�=�x�:\nۻ�����y��9�E�\�`
,�6Uʁ��Ğ ����ȥW�g3O)G�)͝Z�k6uV^o",Uvҝ�F;{�g�	�'��e�B��}�MU#k��|=�b��F�D�?��K#A>~�6-�!�5^����^�
�9_�p�j�����i���\�+ at n~�/��m�J
#��=7�V�=U_
���V�a{�"3�+�Q��Ofy$}��c
�1�H���V�t��=v������2
�_yR�f-�B�{�?�E�e~�F�%�Fz��
.�l�
��q����ǻ��
y#�n�ᬶ�,���В���˳N�R��<]�
�
adr-:���e�7����q^ƻ��U�HG�&
r�v��=��Gff4���p��
��,���ݧ�1D��I���\7u�8�������Dž�	ǔ;�3��	
��J9?��0
+��Ys6�D#S~
�����R;��%��KZ���R`�y�5һ
_'�����3���7�i Q1��
kjk�b��w��;s��Ά����o
+���;�֢���>ťLf���68��TIb
v�1���}ٛ�ZASl�U%]/��v�}�"
��W�Q?dy�1%��zX���Ր�C�.߆f�P
�qر�]�U���\��J�(���i�a�ϕG�T
�
��@�Ζ&ݲ�B'��
�|;;����_E�2�V�^��$|<�
+�YA���2�K�Wn%JQc���;[!k�i�X˿
�-e
�:F�y}�+�*�/�|�UnJ�\�S�Z�Ž��۩����?��}��`tε�Jv"�g�y�R�j�U�'޽���%��"s���(�|ڝr�,y
�Boj';ubC�u���׸�.�J��v)�[��T��	�RQ*w��f<]�z�T �����h���hmf�+�̾�qR��ghO0�VJ/�m^?H7sb#q@�lۮ6�<�:s�D����z5&J�ջ{3*������)-5sQ�_Do�@D�
�5�Q~в�t��)��&5�m�([����P}���$��̯p�����)7�zH��qk���ˣ���V��U�P�h�g�n����%׊��(�\��b �ϵK��[�����vg;��n�/�քPM]p�a.5�9
�*�Y������9����5X�Їr=�W���-���q�E�VטEȖ����Ȅ��R<�hX���8����M�3��b�
� �h�g�XZ���
�8gʘ�D��~I	(���Ƞ����^f-5>f-���e�L�
+�E�5�E�߬�
��k �� $��
�ɿ�l@�3cPY.�@�T�A��� �y^@6U�A���@�(��
2�2GC�Sց�6�d�(��K��
xx�|��
Y��l��>�
@�)(T� i;k�ctH����٭����Y�3��n�<r���� [
��<Ȓi�I�kALU��0��C$���� �G������5@��.��[m�����/�3���;�,� ���=� �0
+�ƣ)�^�[��T��>���ˁ�A�' �tE���jn����AV#	����t��x�Id,�D�[�_��2�� �
+e�y�ť
�&q��o��$ r�4 2���� ��G�0�7a?˂lr�A�,�^�Uy
��!��
+
�=�>�r:��,�t+�_t��G��"�s���'s��v��_	{䖕�վ��hиw�8� :�� ��<@�
��� �� �� ��w*d�� "�8�4�D0H��y
�U�
�Kj�Ș
���
��ܐy��]�
׸�}����,�"�`��sz��-+ }��Ī��:؄� ��)

��C��+�7~O��E:!������
�����+�����Q����[M<� ��g��s�zk��u��1���µ3!ž4�~ls6��
+e���h��$ x�1T�� �\W������S�$�V>x���%
+�[��}VG>���n�Qo���l�K����nmt?���hp�C�貓����m��%�S�;aaǪ-e� �~�C�����T����0�R�ƒ
p��U|

q��p6Q3d�u�]�Q�P珗Q���gr�-�����co�����o�>�y�Q�AA'���?��w���k���7�--��d�e�_��e�ƙ_���x�F��'
��
���L�:X�z�Z�s�3�uĔG�'��~�O~l�%��,~�T!T����V�>�J�'Ⱥ�\¿��gM�яIOo����7Q.�ð��N�G� ~}P?�OY����}5����S^Z����Z����Oz�fy�V�S̹d䔣\E��-.��i��`�{}@`ئ���lW �p�S	�
���>�V�pD�=�:��Yx͢
V߰�^���Sc�;`!z��u����{W��pW�fG��������V17�<q���a���6�Z��m��F[ܾ�1��? i"�b 0 3Ɋ0�{�A��9������R����+K����
���M�}�����!����b��N}��������m��g/{�
�v�cr�е�h�Ӧ���fNw}3
3ߌ^f��+�X_�H��$ lc2)}3$q�9�ryRy�z��ܘ����t|�����޿��n4�JNS���ɭm�θ�0:�kv��LN��(�R��r���l�:�����n�GI��ƱM����Yי��7�Ι�Bo��%X�f��,��B�y����
}�æ���[>_�������0�瀳�YI���Q[g���:����}cQq"]G�X{u֨���%��	j�I���8�@���j���J����?����� �C��ډ�mn)�*g�M��9z^o�\�z���#�����wy�jE���A����c�^����\s�Tz�f [...]
��W��P:�����>���Nn[+Ԏ��g��v��,�{4Me�ӬZ].��Nf̞���L{3VD�-����N��鳿pD�ş���Vt~�jvy7�†V|���O_x_�4v��6��`�l��|}3N}�?-'���Z�w�������f���: 7��N]
z�)�5��:�l��W�5��]Y����J��&�.�^5�wմ�y��m�-t"��$�d���.�=�:��?��o��9�64�A���/0`O����z�{��֘/���3��ݬ�8�Xv,�i�e\YL���"����V,A��a,Z
+-
���E��
+�;>��g������"���[��ri�L��A09΅����9 at cw���Bx6&���s2�T���l3��N\=��7�em��a-l
�"
oa��"j�{VlO�˕�)#��2��_��x�Uu���lF�H82���0+�RbVFs:���]$ŀ�uZ{�V���d�hryK�
&a������A^��l
��W6��`k
���%z����� y쩎Ked^2��쁇�)
q�
��W�i��&�b�"��L�����M���I<pƠ0�n��^V7?8��>R؞In��
 sN�I����A�5��5=q�w�';[[E���P���\��hg��Fe�6?U�o�I�qh�����sѢ99�r�h�|�1T��
�
�������
�,%��1��怸j��;
vC�
���+;��m�`�2�c퐋�ڮ��6�v���9nT5/{u�\ʒ�cb���IV��C�wDL�
��saRӘ�������p����^���t��[R%���W�����.rQ�پ\���R���qxԑww�vM��J�F�w�ty_�����
BL�Y���g���Onq�K�Q�wE1�H��'�Ud|��2lwE�;NC"�vi?b(iX�
+�2��r{�޺��" >l����z�7�~pR�n�_�~���N�SG�V<1������I
+�L�6��w;��D��(�Á
�K3����p��Nf��X��>��+���Nnp���ti���9�&�"��u׮�t�Lt�
�>�j�qgs��]�
��T�uCt���O'�®1s��t��1��6���w)��VZ5&7�/Ǎ��ʬ l�
�>�6,@�K��pB���iI�����$i����~V�E�
-;��������l�_\;��X�
���o����7
W޸�������2����6��9:%Nj���
�}�<Q
�U���/��Yd��L��m��y���彯
�ٓ:D��w�����J�ms�x�w�m�4�ܚ��
+�.WhΜ�ٜҾ9�$8W6g���7
r�[�������C����rA
�qSMG�r�] ';���R��4���D
+u�]V}C�d��9��=�q�4X��
�(��j���nЌ��Ԭw�VC5����X�����c�uCJ�u�M{�O��a��x����Kc��
���;�Cܿ�ט��,�1�c�AW(�z����'�6�\�hu�#j�.qTؚ
ٸ9Ox���/���pը�Ώaͪ���F����v���Ly���eRŽ�V������{��U�%q{?�lj����y�h�����q ��9*�<��7�
7d���a7�����6�V���f�Y7:	���9�X��̵�ș�����J�I��BoA�
�P�U�T���w]j��dQ���?�>Y�`u�mt�>�Q����Mڍ�Ȍ�^@���A�'z��1�)\�b+��Z��ʶꉛ����6�:�
��}���+R���j���VEe�n
������R.�K�R#g�7&ׯw���u��>L ��ߠc��,�&T8��pFn�݀ɶ�~��
+��8�9�O��ּ�ȸ�E?���;���t�V&u1].�z�R�S��^.��W-�͟�9sz�em�8Ȣ��I�^
+1��?x��pAZ�IZ`z�t1�l��s�����7(�B�2MˣӤ�����9��
���T��n����2���,V.<{�bde���<N�nnu��K�svP
endstream
endobj
317 0 obj
<</Length 65536>>stream
+�/�Q�v'���+�[�wZ�������bP���QU��1GB�֩��
R���C�_��-�@�|��m�	N�L1s��U�[����R�
��Nh��� aڀ���#@�� ;
���@a���{Kx�
�ӽ.<�b��/��8����O��Є��P���a
+���1w
`�X�@�Ի� ]�� ��@�7	���
+����������(~�ߝ.�!�@+�5��A����B+��$[]��ŏfn����)��ףŵ�У6�#v�A�<�I~
�^� XFh��ߐ���9@������E�j��O�o2\|5 :���@�>l
	V �D�$����1��V�>}fr�"���o��^X�B��u�
wp:58?1a� �`a?
����� ��am�V�+X��� ��3���0�ԅ��9��T��_{O�W>*q|�F��R���T��P6����o ��Pض��/���/�?��������'}�O�.���
��&�/�y��`� L�Ӊ[��Qp�'��&_�(Ͼr
+7ō�^x��)��rCh/7�-Ƿ�U�}��_�k��~�J�:��
�yHW���
���w��e�lT�Tg �`1Kv�

a^����m���׳T=!��3q��T
�Q�z42���n����s�\���x��#r=���;>R�ۙ��s~�
+���� 0�
�rb�+w(4
M`l�hߝ1`�'
o��1�N��d�c��S--����%���SpoG������{�aWj�f/��
[�2���=�&Q��,� �=����pN�@�ؑ�Z+G�I�O�G�o�FS�2/K(s��1�y@�;�W�
��=/���/�^(��{߽?�	{3��ٕ�=��
�h�k�������Yg��U�d��FV��y��W�
��%�ێك��h?Vק|�
,��_Լ
��o���]�n���K��~ߚv� f�W)���kdn�K�vqW�~�[�ǡ�����x
�z`�M�7����&�������X�`�C ��B��s��Iq�my��ud��-�Jo��8��/���ϯ	l��;�
+���Ȧ��P����D
o�X8�n�@��Y+�2�h�\��S���s�q�!���OR+��['r݃S���m��?�ƨ�0;�
e�<Q���B���2�~�O����6k��ؿ��
�|b]@|�!�$��݋�9ty�����r`5�ȿ����x`�����bP��M@��ݜq�*�m�y�=�
�oZ�5�P�Y?���*6'�-��w������07_/g9�.g

������*�o��nB˩t�/}����a���л�����1'/ld+��I�^^�=@we3,:M�Q߬F��n��ph
�&���̽}u%6}k9#̝1��g�Μ�����3ڒ^i���m��?\k/r��� �#���ׄ~��]v{\|]Z�����;�c��`���=n`]�
��ƪ��cW��m�a
�Swu\��\�O�9(J� U[��/0�TSOp]
�
6w�{w��#y�s�z���悩����v� ��M��^��@y� w�ۏގ�/D������q��f��i�J�O{�<#����1
��T2ݺќ>�z��
�����?�-�eC�g%[�N��,^ė\Zd*rɯ��L
��+��|�,����@�to�LV�B�� r4�>����3�ҹ���t�����[;��7Թu�2�9X�r�-�~V7�K��F�ܼ���Fo��r G^>>���ח�5��&��O�	���sv$5gUR��!�Ĵ6�ݛ�o �j�
i��
���q+�M�r��9��y4�}ȥ������-�wv�κ��i���@��K� �����U�<��M� tr�cV�M:�i<l�bB6�#|Zt(X�&л+-|�OE4�!&oG�vٛ��
�� ����|�
R����hv�j���Ѓ�ʳ�q at a�b;�h�.�`y=?��k� 
�x�
�3J�8�!Wgu�ّZ�4
��'|��"��ӚO_>Gn�d�ܤ5&y�>�x�����$h¦i.�|� B
+=���
3���p��<S��	Y��z�����`��
ɚ�*�U���[g����b\�>ʑDp�*�\z ��t)�"�9��Y
+��D�r�����7�.�k\�ǭIq�'�j
G���u�v�
������a�?=$��;�B�줲�,����=��K�..Ʋ��
���Ş9ݔS��ȵ��t�&��-
+ۢQ�Yk��8�;���?��s�ȵ�|���}�.+�o���km<{����T~
�G
��f�H읋����
������j�y��6�mYy�8^5F3�����VGoF�}�[5"����?�2.0�>�g�����TZc�JQl�
�Gm?�3�l�VmpR�z�!	�c^a{1����m�<�~��?�V$��ul�
������)��\)붛��Q.�œ^լe6cE�%
V�y��<��Ҳy����0��-�����A���
�My�FF) ��g���r6`,o=HZ�DZ��96�!�@�C��V��%'�hCJ�J
��q�Hg<_�^Ž/�Ė2�:�(Ĭ-ۅe���4q
~�k�u�H�Z� n�M�{I����;0�X�m]RY�Ay�ɮ;�9�k.Q~�T����R��d��
�9��^�:|O�
 ��zQ�j���������w:��̹�2���6�ǁбܹ������,�D3L�)�
�Gf��|{_���"
��~�������"}(jMꘙ���3�+�d�/
{��%M6�C^s[�?��&��_�{�_�a4���Q�d=�8��6����=L��q�R=y/��ZQ��
�L��Zw�
���(f{����i�/L�C�+�����t��������[S���+v�FhtI�
tI7Gt�:�&�������o�L�c�߮L|�
r�f��#�)Ї�"�S#��]�6���5�`��u1�j�|� ��3�ٞ������
3�����f��ݯ?C�l�/�.0�^7��s�A����H��l����m���
L~�:��ȝ�
���p�s^!�bN�s����e̱Omd�n�*ݼH�fG�?����
�\��ǝ�
��#:hH�}�
+�vCE���_�;�#^=rL�]Zȕ;
���|w�:�T�U�|�V��B�0lR
������?���
|fl�VH�.)`���O
�]��٢s�ށq�b1
?�nĮ'0��C���I��X�b
f}��d7�=*5>v/��}�+U�
6ʵČ�j���6+aVk̫�1'�Lc����CԦ����uQ���]t%��P|�Zw�����>�o�G!��
+��a�dD�aw�q0��1-��4���*�tWT�CY\�I��m��u�/-��Smqn�U�լ-�������c�d�p5�%ri_3�G�f�.�^#�E���T�꧜��vm���,��gu�.��ԸQ��)�FUwxȬ
J%d���4�d?��=lMV;
����ak֮��9YVw�^þI��^�?�֖�T7�OT�l�Yq��q%�|��6?���\�lP���i�������T>x&��.�w�<��U��	=(g��x��β7<
��L�I���'�:Gh��P�V��Fd��OL�6N|u
nJe���Jv�ٔ
�l�$��(F��.֢�^����R��Bga>�R>^*oԊ�߰�﫚c��l�R��
+G~l��������i�Hߚ*�y6�X�S�
0���R��^	�e_�j��j�*F��-ֱ���h��o��)�z�sy:�A�~�8�
Ɍz�Z&�bo%�w���
�ɐ�~�����UW��/��q�d��g���ņ8k蝍^�x�m��^eR����sv*��ܥXG������3��$�9_?�A-�3�V�#��[9�[�fZh���^�X+,���U�s�)"^��%������7Ți�v|4ܳ`�lS���lr���-%���:;�V�[�����4��1I�~1Zfѫ�ʤ�IdA�J
T��Oۖ�K��)��������a*e�="�o��~��@��T�Sp!���7 ����׊ ��5���,�� ��X�h% C�9�{'��n����� e^� ��3��WAj
� �(��#��Rj){W�M��oq�A* �_�����_�h
�Y���⛼=�*�)���c��8 �f
=�� R�R�� B���
"�^��6cb����H�NC\� �Q#�
<=�ZBT�d�(Z�P����~@�l*���9�?���"f4�C��t� �R{�6�7�"k
 GP�Ӈ�n
D<Ȳ���w ����
+9L�f!^-�(��n��	�dK��׎�9���y
Ɓ�䳛����� �A�;��ҹ�i��Vcz lD� �
|�^�����I �o}������U��R
o ,xf�qh�� g0�-�T�|7I���m/�g�\[qy�t��n
5�g?j��}�U���=���L&5��-�>�m���C�7s
+�

`'�0#I �v��UV�;bz+�S+q}���;8�%i�x{M2���Q��
�³�[�T=s�Z�XܛoĺuQĽ�ӫs���'���\�l�E`ڣ
�Uk�c��wY�w����%
p=|�� 
S� 
O�����g0r�gq�����2�y%���{�v�sF�}o1u�f�G�+�9��>'0���T�<{x�9���&ޱu
+igy����`UZ�#8��n��]�
����t�^��>#�Ϊ�W���~w���"��v�OnKۛ]�30�T5�\6���`�F,>"b�N�9����9U�k!����?��� ^���m������)��-���#�}��&�P���`l��m����d=�g%�>�h���]�pE�x3ڭ���0�M�c_����v��:�
<�M'h���_
���]�����{�E�޳?�q���
���N���-=V�s�e��? ��ez=(Sr�L����H ��W�X�x.Ň{7�Wl^Q����r���Ш�	=�
�Knx@����s�����{�?�<w�%"�,t�N5ܔ��[z�]0fv��
{�e{�<I6�t�� �R �ʬ�_*��
g&5(�\���[ڼ���{�.<0�}����)8
y#S��s%��+|Jm�|zSNͻ����q�ѣ��N��&��޲"�j�9]3�k��"g���lf��dfAJ�����oZN	
+��P�P��h��~w�^��X�']eq��"�OU3 k����iwLUb��9��w��l�H�d��Oò�i����c�#���3_�R�^�䰔
+��Iqը���Q�e�F}��{���w�7�
 �� }򪀸	$��������o�H�:�er�TK|�o�o
lsW�{��YF���m��#kמ�7�W�k,�γ��(Oƨ�AWw��f�wKx多� SSu��͎�;�t^�k�¦�h>�" 
+���Td���:�
Ν�H�U�c7b����]�SQ����؟Q
�0V�#�o�+�S��TK��X���^C�ժ=��pf��eĹK��9a
w�O%wp
+76G
+'�c� ���P9���_�� =����*��6/��n�_�b8'���>^�u�%B`��-�7�fc��oV�Y�
ǥ������W�I���#�"�Ci����>�Pr_�w�c�T�ʳ�hY�%�D�|���k�IϪ�������3���_����2m��
d�w�T�D��l& /'G��s^ޚ��Ɩl��\���K7�r�Zֻ��n0ݓF�ϛ�����.f���2�QG˳������6�m��W��Qx�tV\1l�_qj4�Е�T?
�� ;�
m�FT��ڭ�Oq;�J��>vȄ��N
a��j
}S�jL�cj5_�t�/����j���p����f�`���t���i�I5��H8�HƂg�ώO��ooN֌@G�@��)J�9�|GK�+��٪]�p���	�7�V�;�0d_nx)G�k�
ڢZk~�`V�3)鯮�kH�b-آ�S�f#���#����cߘ�������P#����
�e��ل���0���]4��7��m�9��
�h�P�,4#�/���6���B��.��c�gUM[{6_7˦E���5���
�vY*nj����ۓ��4]���wѧ0X�':A��ս�X��q%��"V�<]�c6�
���#p~��=^3��?�6�r7���i�H�
�<�'�3I�� b{�_�u�q(/U���d
��4Ӛ�
EW�kh�c��۹��j
�H1��
�1>�>ώg�Y��gg���i<�d�+��K橜*#m�����عP" �{��т�>���aWH�]�HO����������U}�]{=ζU�b0s��e�:W%=y��Oi��v��Ǖ8��G�>>�G	;��#�ր��,�Fw�>��C�����
"m�4��dz�m�YW�y����\岯�X v
X���6�V�����ʝ��j.���l,7iBҧ�"�Q�erҳ9T���QF5�����H��k�(ťʓI�yth��`;5靑��-��Et���ӻ}�7`�i�l�V�7$�_�EE4��x3~���ܚ����x�jV�����Ӌ6| [...]
+���'����Ə��MaЉi
��hC�jnOM�Dԯ5�/�Y~�N�]��ݱ�٬C7r�](
���;o�@v{�&
����?8W��
F��1���&���j�z�uZ���f]7�E��
�<�>�pN��;���0��l��hH�{������[w�WŠC����ԣ���3����B�m�
H��c�kM��ڻh�M`t��~v��!������s3x>����K颿?��Bh��s�ڊ��6'
re�u��d-���g!3
7�� �D$u�l�� �l?�j��nY]*�x�!�_���iq	[h
�Xc�Җg�q�Q�i��d�q��F�f:����kkދϵhPW�u�BuB||YK��)ޜ�\
�-Gv��
�ʉ
�R�wBZҧo�ޗ���P��@V {)l�v��@�����UN�����Ty5���o�]W��Xo�:n��#�Z|ݵj�u�Ռ��?�������ey��|l
��^�nN���b��d��lV
E%�B�Yź�C�f�
��Og7(���h��U�XcrWP
J2돭}�����F6����a��t��UQb��"�c��2�ʶ�&+C��۝]��"��4��9*J$|��Z��9��M�'#�\^/�Θ������48�*]4�K4ZӠT7�{�)��b�:�W����+�f��+~�s�I�$�Np�,��R

�R
�|�V�vQ:P��`V���N��q^a
OB�����zd��A�	V�YMh��k�l�]������|%�Y�����,Z�7l��9s�2_��J���*��%[�UC��PS�|�
�|��_���*�Hդ��!�e�t/�Zɫ���j+KS����-���4?=�������5�:]�
�
r����|`��^aP�7K��>{^%{�
˅��Z�z���$?(�#
����%G����젾�fFm�!��njȥ���ٴ�TQ�������i���O>������|i�K�|�jأ��^�Չ��ql�,�M%��j}�F�#�-���\T(^+�
����:g��MvP��̨y�{�Yp:����O��W���^F�頋đ�!�Fz������2
��w�b���i����z�⎟����~�+�j��.c��f=�
WG�*��UP��q������`2��>�f�uw���9�.�D����E;VAo~OE�j��k~��7�.��
�)8H� ��T�-I�~'����]4�E���� R'H��d "�
 i�� �f� �k� �ѧ���X%��'A{@���#R%�e;�
*�0��+A(*�����Ϩp����3�� 
�<]γ�Ԇ2����2�2��6+ )vZ�L�S���,�Ը����|>�
�R
B�&�{�I>������/�O��V��?��3�<�Ha�H�U���(&�q����eK�_�
��X�
+�C�4[� �F��a��ۖ��� 2l� ��-H��3H� ��Y������y���!
	"�@j�� �=�����!�
+Hiy*�V����'W��g���@:��O|3��
��
+i��$���V
�&NtB� �i@��=@�� ��NPH�؁�T����� ��
+�q �
�����ͭ�������[2O��cv9J�kc5���xo�c����o ��e�:i��r��|#��M�|�}
M�	�u� PN���]����B?�=���aO_c�Y�2�͟|�y��!>��Q\F��q�:��b�tn�Nzt%���Ų?�
=�	?x�
��\����? 踀A�c(T\e <� �s]�`
p47�ӷ&'�U��ߺ��7�R|��V\>{��Pj��~��^��A����^�\�pp�|f.
9-�u
�s�P(���T������m��u(������;�1q�<u� �kT �$���	��������{"ż��޺^�W �J׾wl_�m?r�-��x��ϋs�t^���rO��>�����x��(�]v�=�ב�A������ޭ����"���|L���yX��-�9yg�Y�H�
+��� K{�y"ZpL~,d׾�X�pE��%b�krΓp	�J�8��@U���k
�
RְK
RfW�����w��qϦ��].�n���l

���Cm�M����@�~�� ���ࠝ��l k}��6�*ң�=~i�렊,��~e�e��1�}�3�HP�x������!�
wz4�c��s� �8���^	|�mpm{��o"�E�2vo�nYV�I[�
�,d{鮷��Zo�῀UiA�^&�]�.�K�(b��j[:�����-�+v���b��-�V�T���ҷ���Y��N��ݑ=
l���(o�n��MO
�b��G>a�`i8#�;�v���V|K./�᫻<�2��t����s��,�H� �~�
+�*l��-C��6�d�A|�_z�m��<��O3X^�;�;��}[q.�c�U�
�������
+W

�d̀'b�av��ʪ0�t�� 
�(ML�ڤ���jqY�h�nhF�ik]�n|#>�[W���W�Gm͠�
+�g���dJ7��#����g1���Ms7�QC��>
+�ބ^X�Yl�Y�v��|�����_V���P4
���;�ŇwE�bxW%���鶼��3w�Yj�sv�s����pH�~Q��Ϳzm
(��7ʭ~��	�:-�Y�]oɁy����U�l�ʮk���p7�L.����L�r���&,m��.*X�/5%������hK֕��!e��s?�, at G|vJ6�Y����jr1�W��[�����d�ИMǗ#���	�85����q���^��}1���8��ϑn|��jL�N�`���3��Z�ڪH�U
+�_
�G0g'���
W/9X��,T�¬:-�~�FӻJ���
�L����j�V�>�<}��������
��+yX��e�:\���Iߠ���@4�h��٭/g�fM�ik��T�bU�-k���\P?Ū�خ�|܁v���
��)N�f�[�&���{�
0B|�Ū�&��@q�$ ���T�)
V�WަX�"�`�,a�X��Kf���Fƌ��80p�
��ѽ��`��KW�3P���
�7u#�h�V�E�;O�#��iP3f��cK��͛�W������M�ǵ�ñIz\�<m��w�p�޶���W�O���� ;g}V�L�|�ӏ�_�����~�U���iw��
R>�kng�WUv�՟ѽ��'��ނ�ތ"�2'Wr��t[�ԩ�4W�IL����}~�����^s��0?)d��x*��\��r�OƧ¸0),��	=�'�N�_��� }����œP
+w���}�	
-,y+o9VfC���JƆ�$p�JmJ
V���`}��JČ%
K�iwa*b����T��O'��e�hRA2.�H���xm�f��Q� �Q�G7�e�_`��*�E� �0�\���u4������{��8���{o�	�1�r�[6G�U'�
��/.?χHC��2)iA���ᄍ4�x�ki����>��c)�N�rp��
p�
�C��a�\���>k߆�m����'�ɍZk&� �{�K�}��xtދ���ы��A����
+�R-؎n6�Pu��{��J�,{��7��4[�۽��*c>3��\�I����[���z;���,%�6\sSd�a�� ۟{��q
+���e0�	��F>冩�';�:��_�{�
����S��.�:����y�3k�軕�F�n�+��Du�*�
�o\�a ,~6���\�$�f2�1n\�3�Y\��������7D�Я§��Q���n�X.M�G��(�YǨC�������p{�ZB�^�
+
} 
m����$6��0b�TY|��Ŗ��sڽH���3M)��@�Q�
�3�
9�U�
;2k�!��b��� =/�tv��¤���"�%�ݢE�&y�w�Wے�C�(#d�eV%�S��W�{� UP.��9
7�^�����T��}���+�\l(3
ͯ����m���X�q%چc�x�
4F�3�1k�
���(5�'�aPE=��W�H��̳ג;��q�[ݮV:��]�B�ς��h)�E�����z
W<;��
�]=�.Cf��
�^p�ИuǙ��˚0^�
Γ� lLL2#�C��vi
v�e��"KM+Դ_=�dc����ko�C����
��`�-�j���*�
�[~{hƟ��2�v�������n�v��^����Ẩ�|����T�Q_��'��Y
5�'-|q|'"�}��ȼ���`J�{?����P?���E�-�1�u�U��O�V����̧}m�
��u��?'M!'�M��~��M?/e��4}d���ҿ8
a}�&N洼�iOc��?�j�9��p.L�^#7b�zJ�Z=�Vʑ.
�Ue5��GA��^�}�^I7�
<W�������i��,j��iTk�J�r�������s�~��
;[����~c�6P��`}�y
�H)�$�^T�(D*��u�Ͼ�}����Q���l���Ӭ,�J���K����~�J#�L���؜6�K`-/��>��E(3��1+~d�g�|T�x�q��$���|����KQ?��e���V�q��a
�\z�1���tQ���
��ZJJZ�iZk�k���+Ns�i��^H��B���_
ȜqS����৺#�� *��^p8w�n��9���x !��J�a�t���y���^F�\w�sGd�z;�Y�����F[[
!�i�7i��u�p
�WKϺ��xGR��~fב��]s6E0��Mj1 ~��V2����cO+v����U��
x�*��� ���Q������
��C<i~���
�F3���
�akQ#�s��|S�ov�v��V����|�j�F��W$m
W�T�Ws�������]�S(w�z�/�Ϛ|^�
�o���_�r臐��a>'C�2*i��_	z�ݡ�6��
�(������h�z��S�Ij�������+[���ҮDt��tAo�3{\G���� )�JnP`�/��6�h1\@�W�/��u�$�q��^�='��5��V"��	f��!z7���o�~r���EM�+,+�_�g]��Y�D��f�*�]�*>��0p�‡��I
+yaxl�3&���N]���Vo�v�^�>�)�]I�Mv�,��K����_,�1i�F�����͆.dL�
�p��ГA;�o�\��5
\&�^�DV�A�jBc�Ao\ḹ
+��ޚ竐!���|d�s�m�s�s�v����7�o�AdG �
D���w��� �ϖ�	�`���9䮵I
>(43�,`2|��X1�a�/�C6
+�B���6kEu�("�C-��v^ �6|�},XZ?�p�~F�W0h/}p�D��� ���dm��o��d�m[ �>
x�)�+ ��	�/�_�H!�2��qP������O��ǩ�q��L��;��f���� ����8%�6`ҏ�֖��6�� iq�Vn ���,x�@���⻗��c|�I���@�/	�H���pH�q�V��|��CL��%o���>��up`���S�V�����w/����c	lsdd�Q�Sg�q.�8�
��g^t�}P������"�.�8�t ̡�E����o��<�	$���C:����T�?���m�̓����ʀep�cН�� ��}s��
�<b�YA�f��/Whu_�I���Y�U9�z�</�K�/@�3����n�d\�~|�X�a3�P2�dr.�@>"'�b`$k\��dz'Pk�m
���
3��cj���
vٿ�$|�-*�z�y-��P���	�>+��Յ�=���~�?� �]�d�߿�?IvAg2k�$K�`� �fIƘ*Ifz��
V�%�:�G�y������h4aU�u>��k*�A+��U��S\@�g�����J8?���sDž\�6��������=�1�@�u�/�Lz����|'Y��
Ld�\Ϯ|���Kr�1�dUL��m�G�c�>��k&n�����wsW;���
���`c�
}�n���݆�x�x������R��
�-��_β�DO���y�:��g���3�տH�c��� �&���8��c,�=�qlaW1�����t�x==��v`�w�G�G`��4��z�/nW�+�*�˥��zA_"����ϫ�9;�����9����6���?*Ǽ4l�f�좯T��b [...]
�6 ��*�^OJXx�I��q�Vv�G��䪵�|dD�o��.uęuzE�yI��p�9#l�5��:e=�E}[����"��� ��8
�N��?3Y��+�XKxv�B����_ki�9oږ�j���m˻�X�-{2{��)��̫��&��
��1��}�z��h���%M
!�j��X�}ޠ��c�G�H���wN�f�"ɭ �����g&�3�r�7�f4ǐڃ�<
+��-��S��z
�
���+�o�Z��L}c���[~�Z:?���9=�C��Qa�V؏�a}�frخL�٭��l�L���ʀz�*l��bn#��/�_|��pb��(���G��c��wjÿn�z�#��
u��s��������I�{\�᥽Pi����u��\?<n���m��k�,Ʒ�wrݵga�����f���^j�WD���i�e�&s��3Y{
�O�"�A���x�O��s���W#��^�z��p~`7�@���/�&Z
+=ѹ�F�l�-j'���v�DE���f����/>c��
r]�4��
���X����CT:B���
DS*���ʼn���eq��>���_�H`n�N��0}$���?�V'�7����<2ݑ�
��m�
��,Եb7�ZITޗ�*�G8���^Ǵ[%������J�8Z[2#̖�;�"?l��DLV��Jm
�r.Q�ͼ]o�6V���t;�K
���/x����&(��ͪ}.��[:���@w��WmOa��<k
�\?�A��3z�#����vg�xB6���Z|8�
�T��͢�
u����\��`,6[yf<��Qq�_v{B�sA�����XHVN<�����_���W��E��.�
�X��#�=�,��ͯ����i�����}e9*�m0�+��9ߔ�C�+��#��
+-^Sf2����Yxk(�^�}����YP��7F�
��������ɸ�:N,
~�02~���H\G_��������_��t>
ɥy�h�j>��ƈ��"���oo��\��"'^�
^
3ي�/��E=��~��]k
fO%7����0ō�,
v�ʏV�'
+�sC\�۫���J�����zu����;���K�I
K>w�L��rAݶ��G�����A��ZQ�Z��[;9l������ӗ\(��R��
b at 1���6:3lvŦg
��h��41'lw��\qb�
?��ψ��x%�Ώ�\%�q
��
΋����
�A��?Us\/���,<
Ol�0��bo��c�:��|��
�o��_rSW
g{I�x+J�y����wm:���foDL�-��Nղ�^X
�
��A/LgЋ��aS�1�L��m|Kcb�ӯ�
}	`�c؏�����;(�
��P2l{�?����z�s\��d����t=X�6���G�
��x�w�y/��NU4D긮�Ѡ�OJD��U+�m�q;�IL'v�t���=�	��~X�(��Qك��Z����Z�٢��~1��Ee���Sǫ�_O-��W7tg��]}�������l3�R�6�a�<k޼w�S5ͦ\W�s
��)[k�b��
/
ɬ����w�H�6[J�����(iX�~���{���D
8�<�� [...]
���\
�i�i����]�����˘
�����%�
���^͵�Z:���Sߞ����2'��<15p�
+&3��'�='�%w
N��-��4i>3#Ju�T[ԇ�6�
TkĀl;
�εx!�~?K��=s�`�D:����{=�1Z�ؾ�ܱX2o�m4ʳ���h�K�R��el���neնK��h�,S�&^����qfY�[���=-��$����21�a��s��W�f�U��p��m�}�ٚc����۵�v�
w�j��\�pM����սk���/?�uה“��`[�Ӛ��ė���%ey>
���
N$��cl�i=�!�8����zG�
\P�B��$
���h��:UPb�n��e��a/��]vNo:�R>����Bg
+_A�8:F뭆��>�;Z{H7t���ͱj/]CSSg9-���R�n@�=�)��p�Ԁ4�?�au3�
{
�\%_$���Ts�ɺ��I�aԣ��1Q��u�V�s�����2dц:���ӶZa	[�d�ɭ�;eZ�������{��oa����qu�ٮ������^j�F�����&s^3jmK���ߔ^��9���
��l�.���l�u�ݱ[~�~gֿG��ƙ���ڝB���L����y����U[����
�l֠��r��׭>�����5���w��C�[˜��4$}Y�ʜx>�|u

c����ɵ������~

���V�AР���i�?5�f�e��>ƮM�d������>ju&(b5�Ms5.��g��U��g�Zu,�Z�M�r����\y������~
.�MZ	L�
C�y�5���G����K�+�"6���TGo�Sl&:^�#�{�:Þ�j-�����:��N$Wr� �Jk��ʏ*�/�W�Uzy����r	;��⾶M�D0����g����O%�@�����V�X��ik����I͏�}E�܇�
+v�{ǻ�B��k�����5
=�ʏ6�/E��`K�
J�٘-��8/B������@r^�+X�UT(�g8�8�V~�<2���na/���W�����2p��l�֎C������tXt����|�̩S+��{\���FRkй^�Z����M?E�'���x�>6�y7�1y~�
�
K��^osA�:�Zz����\zf�� ��>�6�"��"� "�N"R���O�
#�����cuU��|�a7��bT<6b�mҽr1��ޛh_��/WZ�.�c�Sg�4ϟ�
+|��<�|<'�5"��gdF���_b
D�� �W�A
��HR��5��5���@���
U��82�H�z��Y�ln9��Y��:5#"M�^�C�v
թ��I����B��L~��)\��H�]���ݲ^��)|�Ҧ�^�s@[WR�����
y6�Avpp~�;ѶW q�.�


+6���?���;6���eo��=N{d��6'vX��}�'���	�q2���>�d�& >�J�g3N�H0
�%�5v��%N��0�a���f��K�{a�ۿ�����A�����-�����4/q�&qrk���;�7��8 �J��� � � ��əa�?~�xl�3��
��������e�ſH :�m>��Я �l �u�i�t������Ի
�T)
+q��k�k��|���;�{,�
�S�p�$ g&Nɪ�v���\߰T�_n��{�w���#r�s�Fȳ����o	���䢟@�"��l=��	�?V�O����E�~!Ɵ���?U�L�QU�8��`P}jx%
.�F�mM���cI���-
��u	h��*�"��G���_}�o�%r�
�œq�/���>��H2�z�d���d���� 28A��O2�V3�"�H����~dh��	�B�8WE�w����X�N�Q��6x�y�ɥg����iw�6��2�̣;h�w��o�ރ\/���
.\��_��M�"\g0���4�]���@P��>�&Y���lssO�l�d	��d�4ɜ�A<�����n毩��<���h���
}�o���<x0��+%s��=�p��� ��Ø�:V�����≊睞��돌�K��QC>q�a�dz��/�Lʂ��2@��������\m���]9��~�]��g�Ȓ�l2w��
�L�H�bv>�0��컞��^���r���;4s�}𢻣�
�ȩ�����|<��������Abz�m����ߨ�b�ݒ���\In�S��l�3�R4�u��*����ԃB�m嵚燍0'e�����}���d�`�H�w�>��]\?��	C>Ve�B�94l
�ц<H��lt΢�c�s����K#�F�~N뻪
Sp��.��d-��}>v΀o	\��[/�.
(�ѭ���S�k
J��^U.��
+�<Z�<fs�O����(
n�����M0�7V��Q�
+GO�O.m�R��7��~�P5���{F��
�x��}�[��߶Ս��n���C��y�(W�����=�!.8����8?�t��"�x�Q�uS��8�4�x#�h6�v�x6���.�C-͟Y-3u4�併�����2w���۞��c[�'E�6�J#R�x�$��:<κ׫�Vo���|�V[�s�C��� ���Y��o�GU�+�����gO�]�
*�f�ꕳ��⧱���n�}�cD=
{�=�M;;�y'�
g��y��
9�n�O�;�{�'�s�����[e5޵�� �#/4���\��9�J6Ü%{.�~����'9�ygz�j+��z~}<�!��f���z���Sߛ���}�=׺g���Q�![�<�Dw�*�U
ǣ�eA[)kFv)g�����-��V.
w;�<~,�������=�,�G����������?E���FH�[5�5pVW�$���ur;�LW�h��!��	1PnM�Y
>�u�<WdOo�TQ@�L�ĥ#NҋӰ/,*J)�n�:й3o [...]
���
�Z��_�/�/?��"��qx�LO��6�tw$jk�����E����d��ud���ޢ"W��zW֎+0L�.Njl(�+A��,Xl<�Ҽ
����L�0J���Zl��(�[�9���0��圬��8
���b��JRV�xq�&�����r�C̖�ϛ�X
���;�̯��Y�;
m�F����k�"�3~�Nde��	c���ǟn���_st���z

Oq�Y���
��&��&��?�J��a�
�
_���XD}��)��
7s�n,N��X\w��5
�_x�����xR������|���L��
v�2�mK$�u�/�WC��\����� ����s�w��xLwl�4���;���
p:��r�	K�5�f��Q��;d�'������ѽIoH��Ɔ^��~��������~v��۪厮���p���'���O,n7g2�{+�t���]0_\�{El���L)��)a����nC>ߜ&�b��r�B���˕�xA��?0#��~�;��{Gk#���t]�(m��)�WTzY�#��F;�d|���u�rS#�A�b�JY�O��?�לvw����@h.9�"�*3�2%ϔ[C�B���M]�&\st�
+�f�bf,Aq��ߗ*�"^�Q�}Pԧ��R�Ue7<\��a�i'�#w�yR��!����,�T�Q�/���:>���T�/مr��Yc���iq�ي�`�L���؉z�Ѕ��v^���9���g{���c��2
�o
�;	K�
���
e�#������L����c3(��)t�7Y��Yy�iS2�g�m���q+�&��2�jI
Z1 ֔�2R��4��3<=X�ȭ6_���4���P2�<�.W�W�ꬨ��1��
�k�w�
ޣAQ�R��P
��9p�����ׁ�"������BJi��K��
�7�h�s:1���_�Ӯ�:���fw�Q4K߯v�0���͉����|3_V�=y���}.c~�c�z�'���ڎ������Ѱv(�(��l��
\�CH�C�	�Ab�
e
����:x���Bl������N�w� }�~O�/Z}��
o��Y���TC��:�V�m�-�Y��Is�EN��ryr6E6�-�]y����=��35�9W���vu�+..!G��
N'D0$a���V�/���b�
a�$-zZx1zY�u�
�G�{���^Y����� �Q�p�B���g2?��v��fC�kQ.�4V�
+!f��8�+0��?U00ha�Q}�R��F�|VT���X6���t���P��d�-a�n�r
9����!�;
h��	�s�UDϙ�GO/q�)U,���G��э�I�*/���Ki�W��/n��x]���F�Mz0(1�e
+O�Zt!���	д/��Q�o�ba�Y<c�B�ޣ3��kӍ|�%��N�`H�f�����l�Mcxm�gE�ugj���ܶ��������޷n����j������Zwe�C��rZ����c���L�o��&u,=b�7�~�9H��'-�s#��JB���^>�~*����ץS�g_h����ҨZn=l��|��ٯ�J#��sc/���~��
�n��h
�`�ah��a��M�h+�?�,ĥ�~�x�ޮF�T�t��5
V�=��[΅I�ւ
��1n���l�s�^�
��,����i~l��{����wC�'�F��n�G[i�׬��uީ!�N������R��־:i������v������fqË�!,N8�_����\7�z?EJ�.�������
2�Yo��t����ׯ
�q�ˌ�Z�3v��,��B�
T+���a���RdYbNb��
��つ�ǹG�V=kS�ؖZ��Tp�|�v�q�����d5���l����� V��d���ܾ��u��Ѭ�A�pXN�G)t;�b��ŭ)!E�����Y�X,xDM�2�k$#��¡�B��{�*�������g�;��T~
����R��x�����͠��K�u�9qp�+�EV��
Κ
'�W�+�b�uO��UnF�����zZ�G2����|��T
>yR
�`A��p���rׂ���ݲ�k��W�օ�ٶ8�~&l����BQ��AJ�࠾SS#
꫸�����<���3)�f�3
�$�u��~���?�p���|�v�"1���B^�}Xqל��󹦷�d�R�lJB
zO%
�}e���w���(��[4�?�{���"2�&DTF+@�BD�z����
+�[
�5��*3^r�N��~��P��z ���Ȕ^U/F�f%̗J�-7
A�0_,�f��Jy�8�K ���߽�"�u�� 2�1 ��
 �Z�W��xX�
�=Cd��}��߃H�XB$Q2� 8��r�f�)UYY ��}ع^���
�ju���bl�i�����f�G?��\���
������[��ۀG�?Y��ٶ��	�"����l��i�+�+�p�Ϭ���1����O�����ğRՎ�Uh�iα�d�:q|w�8�$��Qp��x.�x�,~`�x��nY��px �q
3�,`Xl�g?��8
��,s\^q���8�������^8�D
���RW3N�g'Nv�0N�q6N�V-�O	� A�����Cv @���p��Q
+@#�c��`ùߍc��
��t���Ef�|E
BE���Q>e�����O,��9;��b�ZqB �u���`{�+Na���Ќ�=EĉdN�dY\X
`� �-N�Z} �<��ĉ �#2&�K�m4����
+�WI+Ϫ�x���u^}�b��	�?I Lq�^�`M0A�m=�
���@e g3�JH���V�b�A��c>N�5 at 3��Rx���$
�L��z����
7:�h�ĐA��k���_e�
<�*<
��H�������NnO�Aʎ�@+�
�08����`�1�<�k�C�#�6��@��+�
+d&�8R9�LN���]�l!�G�9^D�|VyUJY�9����W�p������
�.�ޟ���������iнT�	�My{=f�
��7��a��"n]έ}�;=���/�L98&�b��$3x���k���'�=~�E �A�]���Π�a�(

�m��+24�ů�*�$�]@
�� ��>C����H=��_�����u�
|B����U
�����h ��|��k[��c3���.�s���$��1�y
�,B���w�pLgu�5�s�
/�w��+�q(�}���/g�z"o�?�y9�g���.O=�߹���p��ytT�:�L�y
�d[G�j�'�}/c���C�á9U
c�O,]
L��B�d��OF� �q�L����fGc:���—��N=�A
�OG�s=��;ؗ
m�j
�U�?V��Dk��jf���ڜ
O�����C3	�X̸k���T����[���NU����l���G;��e^�eg{C�I�Y���X1�l��otw�ҙҟ�Z�o���
+�﬛�k[����|t���fe�y�
���a��IG�ER��)��{"�oc��-CQ���aOG�y�ߵ�
�Y"�Ө=R.����?��&�������i���_$�-f��M3���K�9��k��	�k�5q�?;���U����K|��"-Y
Z
5'ʕxϸr{�]f��\�
����(׌�P4�
+��n��2�W��t�W��

+t'���*C��V����$���Jr�
j�=En�ϗa��4c�M��ʹn{�Mh��
/��q�juTX(�zXx?�^��Q�����}i����z���V��
��ꑓU1�d�}��
U��e�:{J�f\Z8��.&��fQ/�x~���䪲�
u�_T��é;�$�X,���Z� s
��=��UZ�W;���:�;�{�]��s�z��TN�('^aqyh�
�F�]	���I�LD����ڬ����r�7���l�
3��-g����������`��"��0�
����>�H^8�JՑ���C'>�������hW���J�ݬ_����WO�<tW��6�Pb�~�/�g/+zA��fc�������f��d6�[Ex_CG Z�7���
��)�y���מ���x\u���XP���_���1'��KFF4/c:�����yln/O
߄%�[����_�ݒ��T(�U(����
�[5������5ޕ��{h	���^�X>;xK?0�G�a�g�Ǻ�&�>�	�~
2��%w��җ�^�z`��H=%���X:���d���}���V�����f�ntVɮ
�b�(טI� Y-������֜��Ӭ+
�i�
��VKx�,��lR�L���z��9+������]�s:-��L4
�EI
Ϸ�4�D&�}��� ��S�ڻ���5�&�{h�4x�a;��+h
*��ܵ)Ý+)M���շ�|9
�gk��M�\���������U?<'�q��^`��_�/rܘVF��
+
��3�
+g0�z�#z��.�p��ȴ]�{�޼62�3�������~`]c��Z������5~Z�dP�i��{�O��
����H���޸
���6�
�W.�w��HP9���t��ct75��v�Y��#<�;��f>��!$�7q�7r��F�y��x=��l�>����!J�v�MF�Kk�߼�RM>l{���3Eq1}��v�+����
w��7y5A<~ϕ�ā�uw,�+>��B��-e��(�p�ۡ�
3�2
]��9�;�xw]|82ֳ�:�_fT�
g?���{�e̓Z����ݩ0Q�
>��_�i�.��a*.�
<{�ڔ��0!�ˣɱ���)3��پ�wؼ����#��?@��*�cD4���&Qqx�C�!�T��̉�;;$��#�o.z�����/�佝
ؚ:�C�U
�;��y7��>|E��0��?����暒Ⱥ��La[���E��0t�1؀�f�,����q�o�N�Ri�~2G���oC�
Ͳ�
�gV~P��!A\��Q�V��Fʭ_\Z
�. <�7%f��/����;O��A��0!�k
�̦��oRy�zo����9�L�MV,�8�*�p�0�b<���Q���PFvo
�d~

��uP�3O�ڞd��t]å����h�_M�
��_��e��n���+�|��k�~�߅�
z;{֯,
���Ւz�h�6^�
+.��I]
�פ�v�|�˳Pf���Ko&5R#����"��|=pn�:(��������R��/G䧿f�e,ҷ��B���]�7(>����j����̬��o����q�T��h�K=G����t��zgd$�����5��"�Xf/>��.�Q�F�([m4)Zd�!+3�?'��wcd���[�
4
�Sj�}
.؎�=��!����vi�:��Tu�a����A�S�3�e�O;v�.|��pteyc���R��ۋ-����{`��T���
�1�\;Yz/\�T��
K�3&F��<�.(� H�D-L�.��ʾ��Ⱐ�>�ݣZ�k�関�Q��;��E�΍i_��U{�^��y����n�
[h�B��?�%��>*���/7�b�
���b�%�f3��m�����1$�%���
��H$���:��"�
X��'���ճ�
��m�qoF�\�@
�5sa[䛠v�6Zh�J5�r[j�:���ƕFdϨF�s�F�8��M�p�*�����U��B�ŭܢgж�q��>q:�^��o
�Y�
-�A��{Q�}�����Ne��љ��h���ڋ�(�
����,-��y�A#�W?
b9�Ե�EԇJW�g��];���\;�6�M�B��
 �
����-�\�u�u\
+��0�['�/o��C5�5�<�j�㞹}t��
[�5{mn�ͫٷ_`��H�z�A��nZo����:�r=�ǵ��Ug伪�|���5V��K�J�y��W%@�W|6,��P���Pn
g�?�/�`���LL��Dq}r�d�lg=��7�JJ'&���SM�=���1���\�+��y/��ϧ�T��`V�r�� K�{�+�2�,u�
�7r-bcB�"�Bv�C�5����>�YHo�:3��
����lWcX�˛7��T0fҙ�/�M�vA��)���go�Wsǹך��:�`B
��Vx(P�s�[��%o��<�d�ݩ��(�cx�$xR����
��.�hJ檯���n� {���U��J
!W������$^ˋY�T�pS�h����3Л͸�b�ޫ~���<j�G�+�'�#��"#oYk
.kk+�[p�d[������wF�˹Lg8�At0C�VZA�]wna�E�n�)��K6�=
+0ԇ�	��;����aY[���S��&�ic!��z�������q�	�����zr:PɆ���������$��Q��W�?pB��>P_����vC����!���`oo���"�Οy�����7�
+��pӰ�0�=��䒞&�`t
|���\�F%CET�L+ׇw�l��'��إS�qY�P_
��Sغ�ҏ�A
�e­3��n"�� "hP���n@��
!��+C�;7�H���ȼBd��|��M��H<������Q���7}�<��%
+Up����J�ѳ�G�k�A���/P�6%�0N���+Dt��_(���'
�
"�(�O����
�l���J�X�A��j��a�ӂ�c�IJ��`�췾3�w�?ĩ~��te��;U��`��&���*���Á
8�������:�g�
x3]4 C�>Z����q̴` _�`�12l3�lۊ�E) ���̾?�1y��}���?%Ȉ��M!��8��8�r
��-��i�������d�P��������3`w�/$&
���ˋ�{�ݙ�l
6}��Q^�n/�����9�~�������
�p�56q*�eP�M�v��	n���~���`���7��5���i
��� ���,�]�?
{{��32k|�:��̫��JO>:���nȇ���<�7R��>Z��<Zק{�����XR��.R@��
�������V�S�|�S�����d��ㄸ����+6ޟ�y
�N�7����x
�B�b�J���)��kxy�
a�����R�0z��'��Y�@���G����9
��݈��Z��?$P��@��M�?
k$h��1NCƏө�i/,ę�Y����2�
�9�[txu�I�,���rv]��ර�ڡq��9�c�K� u4�W�#=n��6��$纪�
��� :#�[�s����v�K�%�f�
�k�d�@t�a���Ay��ۄ��ˍ�I�{~��)���^Ԃ�@��u��ts3�ڲ6���f�y�B���zFޜ3M;��>uȷ�n���h�z�
j�m�GK���7VѨ���^�B�2��.�!��s�]�$S��I&�7~s�
q>d�������
P��v�t���6n<���[+U\e�m�jD�IQ�Q���C��m��l:ǽ�)�e��|`
+�*{�_+��hk4����J���R�;��/j2ɊH2��@�IF]m��c��ȱ��&gh�XK�P��x���)���v�����?�m���r�r�<{b����A����
��r=���=���*i���j�:�i�{�)W��#�ڍms�u��|;y����m�9���]�'���.���
�6����gy���f�8��d�hÁ`��hczǦ~X�ѓ!/j��Y�^�n[N�4�?t�皪Z����/s�@�9�A1�9'����ܽ�:��ym�#�U��E
1p�4��d3�q&�.���
K��<X�+kP�?F��t6~����`}g�Wݸ�7\o;�\��(�xf���3���
n�e�������l����y5���D;�`���aL��ޱ:
"[

����y������٬�8PE�j	�����>��Rnl.қ�c�	��ԡr��=�z���^3�%�E�*����|m�Y��=�c�vE��Bn�y�h�Sn]�
�
t4�,���Xt=�|���=;���W��q�pt�H���)�
�V@�
�æ�%{��� z��#���/�f��+�n\��P��H�I`�ԕ��Ϸ	3,�
�#g�
m56��|5�ᨇ����g�ϸ]f�24ؖˤo
 �Cr�����m7��i�
X��,Q�
z���֫��oSgW������f	�
��
�u&Zz_�δ�e��}��(j�

�p��w
vp�du�+{/�r���
ؙ� \
��T�
$`��/z�s�>�>v6�mS��gZR��zj��F	�vZq�m����Yen��ͼ���(i�n��J�t�5��P)��+���.�YV������_�Nmjx,�kMڑ8�ާd�`��x2H*�\ �Aw&�z�\2vT�`�t��vP̆�JO�nK
�,8C��Bm�K��H{���X	�nF��,�	.��-YR��@LW�A�.;
q{����U�>`>�q��t��o�/k���69y���H8_��=�<8^^�wh�l��{���cvY��^<���jɨjj��L�
���L�|?���C�$�[��(U5�$�nG86��rKA��WU�͋$1f���/.��
l��j,d�ë���i������ۥt���B�x�i�*�=�Ju�=�P
�޴FY����ZU)0eYs]i=��Vtgb��w�1�b����x�)4�8�h/LL6=�l�aE6�V�0m��)���{E~q�W���ß|�2?
�9��<8@~��(��-<RϿ6_�6<~�sQ֞᢭N�	�������
� �&�vO�
����WY�-\8��ϰ�qPe) �ɍ��K"&�' ����A���u���/fV��'~= ~2z6�@-1
ߡ��;F8��Y�7�
���u�hU��ה"J���R#��
`�f�����������{�`Ύ�H:�Ln#�i�#ta�S��M)�e��ӃSlI�p��8�#�[
+�Z�:ĕ�J�.	{�V�9�Id�g�_��F���]��{�j
(KF��{�'&8��{���=��ƾ�����	�eĀ�~G�S�A)�b�ܼ��O6Y焀8��7Y�v
+'
}R����/vG��~��>�%?��
5�r���Ҹ��qv��Sm.���N2�]�mPp�A��
3�K2�}��Էd�T�pj��|����ۜP*;ڐ���F
�7�h�+-�<�y
.�}
.7
�&��<���Gƿ��ݡ���c2�|�[j����}E�^�{e�l�[�Z�9-�\��qDd�d)V��Vl�lC���1�Be�4�
���]���G�QT�����8
ͳ? �3�0��{%���k
�

M��X
��j�dz�Sg�q��!D�?��WT6��[VY�/��-Ǽ�矚Ë�����	��*E��!Z:(�A;�O���܊JX����碏���
û��l��Ln���hz�=g
�g8��u8�fq$W�c?�A��׉iR��Q����������}Eecp���m�z���ە)�|WtEo���2�9Tɦyhv:���b?9�݇������⌇f�b�p6��EOL:���Q�
+����f{�
��^��7�
���
v�/fyݝ���6���
��Ϸo�`���ih���I=�uᲙٌ2L�'.Y/"`a���f�c�dž�Q�H����B��VL7�ϓ��Y�q��W�m#��#0���~���%?�6���i:c��t�#�t�5�t��E�=��h	=�oҷ:g�7�B���5|�zc��ْp�� :�������
R�Wo8u�K�����M�D;5�g������~h���!h^)p�D����B�Ie����
*V
��
����3@�z��������ʵ�h]��ƚ������q�$�Ly��F�p
++��6���u&��S*]�7
~7��Vl��	=�K:Ǡ!���	�7Ƭ�52��ν3�ڜ�r5)w�TW��T�24���TU��Z����b�
X��������w��Y0
h���ׯ:?Jv9z�.��n�d{Q낸~����u�����ܢ���SM��g�������Шj4�Vk�@�춱���pP>��M�r���%�A?`�
T�B\�%��+���㾀c�B1l���gAڰk�P���Q��>,
U�ʬ�n��m��rܾm-�D��aMiO��|�4�jV��G������+��Vx!�La���z6@
+��2=�·�K���-z�*8��
(>� ��
8{#(8�P8[#�?����r�ZF7Q�!j�q��C��ʝ|�t��,:���}�>vm�Q�2*
ˎ���7�5��-tr�`<�i��4W�>�ٝ׼d�����P~[�
�$�@ʴ+w���%���4'm )����-�T�j���I��-��^�C;r�ፉq�i�׉��Jt����Y�.P�A�������lX`��
.3+;��T
��} maA
+#P�P�sPk��Q����g�Iq\���+	�� z����
�

@U3E����
]=�$�t	N'�g����
tnl����>:<T��dQ�`�������A�Lynz�3� ��� �� ,�l l�� <s}x-8�� �K	 >�� �q� �m�<�'
��~��C�xb� ����?��Ȱ*[�6��.A9
�����vIh�ǵbCɶH��<_
���!�' �Y�o�' �4��[|�,ҷ�
 �X��`� a.K=y�� �#� �
�2K���^ 9�� 9g� �h�R\ �\:
�\�f�����u|���4u
��vb�Q��I�cb���T��z��Ft[|���u�\j�
:d�� $�� ��� 9�>����N�N��)
���!�|�;�ѓх��6B)�"B��"yո~��u���?�I�4�$�%-��M�3O1�&	�S
����QG��J(VH�4�&��r�H�q��]B���Zfo=���)�GQD:��{������[B����X���S����R����pV����W	�&y���x���cR~~�G�(��QC����Ս
z
�<{��doklz��I�p���?H^k�I^.a&��KM;5���$�������f��O�1��_
|�N����n}�%��`֬s�j���ﻓx���b��68����ۭ�'��.G��^Z�[?_D~x�W��)V� [...]
+��4Ըr��{�
�s[��7�٩�i��ޱ���cV(Q��b,	�u��?]d��q΍�Ҭ؍�2�J�Qy�Ӄ�~�i�1���'���' ��ԧ�gf¬�����1�z�o5s_t���A�֝�>[as�$�y��N�<��3?�<����p��J�G;R�<�r(sN�
K�;m����:ԩ���(@&x��\�� �dWW�O�ҟ��ђ��� ��B�<�{�yƉv�Dn7�ݺ�h�݊G.ʑ��Оɬ�G��a��-����0m
�u�.W��ˍ�mR
=�,4�F-l�RjH��?�p�?�C��r
�|� b�^)��Ԃ��M�2��/��L���T�ֵs��p`�J2kl��y~c�pv9�ya�7�z6��q��@����7&�7���8�
�y ��ۡ��N����! ��w���Y��
r2�5E��۫]��q���?*ogXrZ�K
q{\�0��;�k�{��3����0@�sŸm�$��@=��Y����%�
m��s�9.��~�2�+=�Ϯ�`��v������=�Z [...]
+�'��
yЛ���^�^�L5ʢf�����.���"��{�u�)���9���
[*F)ڷ�����, at n�l�
K3���:�YB�I�ގ��|�p�h��Mŷ�z}bERef���mO���Qi��L�9,vwζ�m�A:�.��4,Z�
PБ:����?h��1Y�N��V��m�\��J32�4EM�=����8�	J�Y�
��e��F|�z��-��fH� .���+;�ej��u��t!ۘ�������#���kR��4�Q�d(�Ԓ�(�j��Jqj}�Tr�2����7�6�K���ƍԣ0�4�ܤ8����pU�|Ϭ�}�vr�����ĸhӨ�W�bԬwb��Ď�a[;U���v?D�ϯ��P}^�J�ٽ2�U�J���e�[r��%E�|�R�R�C��͍�>h�����v�$/.���Zު9~���GO>
_��<;��i/t2,���3v�U"!�=�Z�8rK�Y�=t�R_=�S�K[Q��U@����K�*��*]�$n�SF�;�`�r�*������^S���Y�4��Ul|�j�8��to�A?Wg
+:���(��n�?=xg
�UY��qn��`�����|�c�����g���-^1%����$,yi5�)R5�4E��{�a�
�V���

p��]�<��qX�ﲏ�;��;S`�ܼ�A���u4mN�g�\�n;k�	tl$(XV��B���,�GK���a�S���1&Qg��v�JD�%��5��+m�j�h�R8b4/�,Z�y�*�\:ANWl�z�,������0�R��RݦHrL��k
s6R���/+��]�	�Dm����(�
�V��R7�Ŝi�>���;4 4����l|�)�b�.��`F�2E*���=Z�e��x��a8�}�l2�,Uj��D��Lv�?ӑ����
Ѣ�I�)]/)
2�����oT��/�86r9DŽHT�F�!�
�K��\t�
��m{�P
�SO�e��,/͕�ݦ��,_�
��!Ȼ�q���!���f�{H�i��3�x��Q|v���<F�T��.�,�5��}I�}�y�59�~P���A�p
#-u�iwf�\<�`U�[�S���U2V%��t���ڱ��
D#��;{����� e8�eّfԙ�)������8����h���y�$�%L�{�';��6C�x'W
�W����"}
��?(}P�b=|^�4�0�L��
�n��y![u½��5���GOΝ|i�?¹
���e<��Պ}I�
K��/&��y4�-��&���(U�24��$�8T�
�4�n�k��i>0���R����H|�<��E(��V��/V�m ��Ո��3>����~Рj�\�s]���(�x
+穣s�5i�c��p,͘|vx��������g)�)���.� P	&zv���7X�ndž�am�C�}o��
�2��"��
��
��{C2w��d�����Q�/�B�R�b�L�:�q�%J���H����s.ޮr�|�>���
Z�

j-�'T�Dn�nǸG�{,�`W����|.��d��P
+ȧk�pp�΍,���΂+����C;��b��
+{�ƹB�B�Sr��/ffzL2'�v[s��_-�)L��i�EP��ۛ�����ئ6W&Nm�$�S����
G��#6h�w
�jYt�Ze�
�}��
X�_��J��������9��R6ׂ�j�yқ���<�y���橱/� 㞂?���S
� 7h�s��Y�҇@�x�o�Z솱pC�%#�W
��"
#�9
��e	k�����t&�s2�����Y�T�S�	�Q������n�k:������G��0�Vc�|i�a�vh
�)�\g��`3��b2�-Š����
C�)Z
�<���Πۼ��1�nBk�د�8D&�WgR�:�w��̴�n�rQ���w-
�ޚ�}5�Φ�D��#
���7�5>l��'��g��WM�V�Z~wPj��s_��`-/�
@��/F��T
�-�!#1��0#��ZZ;y!>�wf�ĵy�����n�:�E�1�A�A�Q�
̨>�Ͷu�u��A��fS�T�i�V�dU�kr�Rv�����J��>˦7���P.7��]�s��t2�B�$��p��j
��,���bL��1M0��Q���Sf��c��!�lɠ��:#�
����y���%�|x�������Zߔ.U�Rrv�W	�KŸYo����d�
�Y���U�Oʰ�gBb���l~
uJ��_�|�R47���UJl��"�Ȧv���b��
8����h�+���d�
ɢQ�5Wr	�� �&B�}��<�
pƵF)zKPW'P���`a��sKy��J'�a�c�eu�f��,�1�="c�`7c��{f����Z�U�E?;�kv
w$�9�(e�7;Y�+L��f	��ޑr��m!�{�������
��(Hr>�_xPj�Ŭa�Z�U�t�� �A�"Y 0��S,  ��F�
�2����K#
:z0�� ̒= F� c���6b�N�yh���ͫ+&G���j1����M�D����B)cU�g�q�W�C�l����rk9�
�fW USSLz)���.�ۘ ��٤8_��� 874#r Z͹)&k ��Y ���/@��B��Y&�+}a^o�?��b��+��4� �{��(�B�B�ۡ.��y��^��{�郋[he���f�� :ϛ z`< �)��K ������J��)�5\Nq
��G��cX��:��> p1:x/j�e�)��:x��۞\�_uHԝT�U`g[�O߾I�e���{7�R����^
�\ ���{���_c �+S W�O��h��
 ��
 �i	 z
��
�y' �B��У����?H�� �R��Xџ<X5�"��B���Z%orB�]����ͫ�i9��}��K
�
����_��z�o��W��̕��n�5"�;@���n�T��w�H�+�~���:+#0��O3j)���3z�S�$��L��%6)Ezl'	S�R��I�3)�F�+�$
"������<�T��h[璠��r�^}rG5��/�6k���]�́���JN�'L'	u��Z�Km�_��L=�3�O	�r�%�W`�ٶ��"�R\�e�0	��2!����Iٹ?����G�]�{�t%����ok�[|%���v�W� ]���$/$�&�x.$Ϯ��(5i�H��FF���L,S,ou�>���)��7�#���;�;i���b�
��Snj\��R�����x"�ˑf/�V�}����r��w�+;�t����1h��G�x}qx[��d�WuΥ�*�ɳ�G�Ċ����
�_
�><�
+}�
�}[��­ڗj�Ɛo]zo	=_X�<�9�?Ţ#����8&jh���?L��du�}�/^�k�/l��������i,���*��uks����.J�K��i�bp��ID��
&5Y�DQ�Ǜw��th׆
�z�>���tL�]�
���u`�ܞ�,����n����~{ӈ��*���EYJ+x{�.}�0X
v� �28��Bs�
u�Yd[�L���ŧt�.$��K�U?��s�C65y.>rFK�՚�L����^+�}d���:j��R
זWY�� �-�@�Ĺ�}�+��c�����?�!js&

,Z�B.*��n�ݕiX;P�)�5&�{G���

��θ?��cT�w�H޽4�7��� �J�Z�"�@.�2�~��y4ӀXB֧�D��z^Z</��"�+��`1�D�F�]uUpx�#�2=T���ܺ�ɹ1�L:ֺ5��79FCF

�� w��04>��
��Ls Q�Ơ��� y?1y�	��1|zB��1����
}�E{u[���ǒ��9_�h���a ��ֺ�gZ���co�����H�o_̀=Yѿ��,���@�����`i������6��-�u/k��Z��"H����l�O���?`�=���Us�}�R*����\>����r��]އ;+��\���_�P� A�0C�oJy�1�M�}m��޾�L<����S{�뷧�t&�}�q�E��
�:b?�'�
a�Ě*������̳*=�˽BB�>(~�K�|��s(��J����s�dV�'�p�Ϧ�	1�G�q�䞝�`�e��n�
Ϝ�Hߞ�{+I��j��
��i��=צ����0���E�]o^,�=q���Uի����n��ӭ��ѫ��o�ܟ
+��\����
�_���"��~�޸z��l&A,���[j?&5bp��d���;
�K�9okE��
6#D��+��ͷ�WjD��Z
ݬ�/v��㐔fF�����=t�[�8߀5L
�j�mT2�?��@�ʤ�����
��tu��+��7f�$
N�f5M��~(+��o��^v��@���f⛕_\޽��^0�F���m��O]��#G�.Y�xR�4<Yj2�*�˟�
+uqR�Z9#G�P��f�K��y&ɜ��d�����U���TC�

�o6�������cz{|
W��އ��Ľ-˞� ��
+
(27 ��vTlX��;W��X���RGY
M�2�R>O�g[�
�Ȗ���D*+���m��X36%a�
� �� M�����i�?`�����I�~EgFfX�<�0�/&�A���h��Ğv!�'?�v׬�C��-t��?itz�t� (S�V�g�!�-��uՐ��"�Rԩ� ���`r�?�
�S�^�� 9�>C�{2���wf�,�F�������c�c�U�
!Q�a��
f���ᚊ��

�׃��V�k��d	3��� p�f��Zy�$�
�!)&#n�|A����`^�&�FZ0o�
��5C�K]c�} �4�c��r`F���k��d�Z���=����^����{���sV��t9�F��������]�hG-24ଫ����҉�M����a5�*��V4��E��
�
��y��*��mv����J"3z&�Y���f64�/j> ��Dl4��^l�R�R%=�O��bk�v��<��
,b��[��O�d�
��N�)��eI�� [...]
+02.",�a��@���3/�w?`G\��N�e�N���:E�|�����
r�b}r<���a=~7�	�W텨�f���Ϯ�c����B�TR��
�$��J��9Wm��� ��g�>^�%���wUK�k�,4����lu��;�)A��V��
�-��߭��[
�3l5Z�C��.�Z�2p���6aɑ�Q�����;�6��ƽ޼��(�.'�g"����Kǰ�
G��� ��!l�s�ȳǰ��p>��;�Q��)gj�Z��+�kyju��<n�R�2(�
��t�I#����8~y�x?�7���ڈ��/�I��]�I{e�
��n�'���G�f��/�i��
+��S��}dJ#l2�;
+(�M��z��m׮���O�er溙
<��-m
���
���U�+hcЛ
+��5��G}kY
���M�qt��8X�ո�}�S����L�X��ә7jm�F��l�9�J�so�gC^���[l���I��m:l
�<1��0V���P��	��W|����3z�gSߪ����U:���c����*�
2����^�>�zy����v�ܖ��x���|��$�x��G;�b����;�����l,�	�=��)��Y^8{�eq+�A��V�а��l�t��^˕��ݫh!6��x5*����]�n?`RZْ��j���%�WՋ�h9)��Z��{��b��K�u��������0����-Omm7��g�-Un͋B���� �t��J���o�m
+��|�L���!esSn��	)<4�*
k�X �B7�2}/?&�(?&�}�~;�|fr)�!G� �$\��ܜ:
rRFO��\1��\q��r�!sϥ��#7{�W|k�ثg�6/=
Ӣ-אګ����;Ք�{��ϳ��JÉ��k5�t�r��
I/�γ�=��e���uhSY����Z���얐��*r
��
��$�[N@����v�X���
��hg�1��zg���p�i����P&��KT�ȓ,u��{��}g�3!������U���|aTwIp��\� �9��@G��X�.б/��q�����N���ä��餸o��7�
_ ��@
+�N�NRl�)n�/�d����HE_�m���ʴq�8��opMyl����U�IS.w��^�ì J%��6������,�5 8��� @r��Ԇg �Z9 ��- 1!���np S+��`?J�
� D��l: ���/��y̩��	��
+b����?���E�
���⛤\򴊕o��[���i7
@
<Ź+�˕?9�Ņ����$6О����D��)��~*l��). ;�c ;M ;��
3 [] [) �J�/��M�>�I���Tk�,���u
��IR���A^Pv��fjM���'cu�0�� �?���_��R�8m� ��_|��5�T< H� � k�"�Ē{ Ĺ��w��"^$  �!; ���_H𵏳��hĭ ղ�i������%��t���qs�ma��֓����d��O{�G���?����w�= �� ��� �#�<�쟧�-o+#�@a��m�m��l��ɳ �I"�x�PG쯶�M]u�$a��W�Kx��'�
�$\����~m��l?w�[ ��O1��-����m_d����Ǥ&�����~�w��rZ?�ɳ�f��3���.��k�7#������S�祉h�OF0{'�&�~K,�$ �Ä�'�Ǥ���&��G�������=���_�T<p��M}x�uG>&_I�ژ�7�#��)>����g���ӛR.��Om�vhj!�I�
��%
�*8�y�9�̪ݣ*���]�����%�Tn��4�;̴�F2�.Gj4�X�fv�p��^ ��_F3�D��G�(�I����;8d�����{�E�
:y�X:�[Km�j�e:���
�1�;�=*��xQ��o���v5����H�r�
�.��hW?��]�(;�<��
q�4��!k
�=���}�[�}�7��;Z%�n��Օ�z˸����o1����/�W�G�����g�*&�qR�����v�_
�܇s���,g7y'lQ�
�zn~����n�[�9:m���m}��ɺ�fVny�_�����!�Z[t�vo̜y?��"R�{?F2��Qi�o�Zi�յ����i�q)54L�I��R���t:�+g���
Ѩ
�]�I7���7��[�X]�꺻H��� O
>��󬷎f|�[E
긏J��%���>�ɹ촱��'V�j�/���ז?�7��ǘL�l�
+A���
+����6_$���&/�l�ũV��
���~��'�:
�[츭�w��e翗x�.�'
�	��D�P�Bm���}�V���7'�y���t���h6
ݻ��?���� �rC�`׆�s��L���=�+�1���Iƫ�A��Z�/�w�L�%9i]�ݽ|���kk��
+!�3�����.��h>�
��p��S�道�Ы�Q�k����Q��AF�!��k�y}�{۾�j��~eZ_z�
���N��ֶ���t�q
n�9�e��$��lR��ֻ�K��!z����
�j
��a���u�y,��q;/�7�hu�C=V�8#�����,(�󋖮}���~U��^�	:�^
`���f\�p��X�uǯ�
;�M>���
�'���޽��U{~c��j35�u�j�ѭ��
c�*�1���
ÿ́��l
���#6S��Oƃf��Gd������d�Ax�뷕u������S�
ת
p���
sho�.P�B���ds��Y

+vW/��nm}Yf�t5����Sg�;����
{�ޓ�M
��p=my�P�s�廫��ꅼObڎ����
����7���?y'�E˧�=�f�t�{�G96���ˬ�u����%��DF�!:�V�㛜�4

�\u�-L�W��)ch�R�3��X�6L�ϝW2x�\�y�r��,I����'7]o��jnz����s��l��ޑ�z�Ǜ�=�7
��-sev����s���R�_?��w̧�yNV}$^Q%)������p[\�7Nη�4��C��Ζ�*)�Ī�/	�
++FLFB�O_�G�;��K=�c�_�`]�E��1;!��=(��;��VS��t-��\��m(��_0��b9
��>_���vP���"G��!
`6#-�|A*�K5q�a�z�{��͞$4�����o��'�_9i-I6�F#6��G�O���PZ��2����^��cql���ơĬ����5,�Dj�t�T
+�u���}9Z�&��-�2��Em�_�}��
���S�-�m%�q���n�e�c���
�'S�2T��@�|K���i�K�?��A��
�5t�\��)�w�_Q��9��;�{�5�Y�k�gN��T��4JR�X*�]S�
�@�+��S��q�ۍˎ�Z�C�ɝ�{�
�'P�y.�C��6�Js
أs����*fVM�����r�]�p�T17�}�ڮ��,
���5*��r�u�}xn�p&�3�6��7!��mKJ犈��c�f����js��=�PJ��T^2/P�1��=3�V��+H�(P���G�"����b�����F�G�N�m�G�
h�����,o�X�z�N�L�ʘYu���o%D�^on6š�
m�KWeqPn
+����k��<p&����`^��e��=���3�AXRs:PRN�S�Y?C��i����
¨A,Q߻&�#�!�|�<�V0�ov����1G(��sm~��\�
�\	U�O`��>���Z��e��A��5xN4���e���
+̌]�a2wQ�y��Q�� �ǨRv4&W�ӂTM`Glυ+a8�
?�\
���&v)�)�YQW'c��7�(f�HB>t$i"���?�O�/�A�5�6�O�q�g�~{�}�=ҿ�6noe ��@^0'��M�%�
eW-:/���<xR��Y�i�0�b at 4Fv����*�3v�	�B
�m.��P�6���T�|������Du�0[*0[����
t��mW�ք���C��=���
�
��C���
%���{�SS���a���Y���ˏ�x<��e�v�U|�
�Cxs����#���;�,��eT*��ȡ0k-�Nt+{
!=�:�ʶ�E^l/ޕ4Oq�)��!��έq�H��Oh�X�[�L����2�r �}Lb��'J)Y�D@^����R��몀�y��z�Ȉ|���`���n_��a�C�S��ᶂ�Bk3�;-�bW�z�5��<��G��U�w��Ͽ�ƶ
,�K�w2H)�a��YU~�0���S���X�AFe��'��q5�</e�U[�ڼ H�l�07�d�^g^

q;�
�n+�ʱ]q����{�V}pn��M��d��6�!�^[@���ٸY
�qS�A�F��Pg�Ia?�_LF�a�[G��x����~�[�X���^^�jS
;��-����MOd�a�|Gb�r{���m�;!�U�ȷ�qVo5���<f����
��V���.��
�?l�皪L��{}%����"*
+L�0'���7Mw�����?���)%H�S�5J�D���]�Vz�<5xkMJ�C�S���1UQ��S鐣h4����L�	F0�
+}�qc;9�@�֧2��/���n#���S�ݖ�GHSQ�WAD�!�F�;ʜ/w���HJ!Gߞ�2�[�_0�V>]ꕥ�T��,)�tO��yd:Od�Y��h�]�.��8[Y��l�|6cB~6#��l�*β��A`�u�{�yo���7�+cqէɵO��V�%�t	
Lr=�
+В4٥�b�#�.0���8�D1��ܿ�	L�X��'׌�Ygf�����G�r޼ �X���nk?� ����4z{mL(3L���m���#�V:��Sjg)�i\U
w�zX

�%h��(zM�;x�h��/���#��glw�
�z��UY�|�m`�rVAoջ��f�*;g�<{�	4
B����?c�
��y6
�
�,
��&l
�
���
���E����r�칓]�K�u=�f�D3�)�8ʯ��\��Į��|��P�<5~��솻dq~�M#��
�'�Q6�-�oN?�xKς��.�~K�'�rZ�AY$x�6�
��R��ŧ
�W}���̹\�%�̦2M����2�܏�|+ >��R�{}��+E�e.�e8��y�t����@d���
�=��w+W
�#�3.
�����1�E�Yrp�, \�\�
�k3����^�ٶ8���p����&��
p
w�a�$���
|�WT>��	S�S?�^y���x����(2
�>�&.^Z
+2��q�L�N�C�����xˀ�h���tl�_�
����
�򉱣���L �T����~�)G�
��h
�u������#*������/��(�'�xz��|��{�S at L������N���)p?��ci�~U���oOo�����o
�8���x�
+@���M�e�cx���;@��w@ܲx�N���P���V�*W
��L�
g�2��.3]��
fbW���a�0miU��P���~�d)u�ID
 dH6o�s�@-\ ��.�>���t
�|rt���vt�`�
����-�E
+(|W�P��"JP�
#*��T������n�C�=���H;2)�g�c?	��+�褢}���'��
+��Q�[O����9$
+�65�� U���Q ��%
4�1��#:@��v at kOQ�y��5�2Z��Ƹ�@�έ�����yV0�)D���=-R��1j�.��Jt<��p�;m���Vr���m�?�6q�&��<���6�n���[O�W�@'��k�W�r¡��	�w6����8���lu�o�4�۫�����ߪ�d�,�����m���o��������J�oP,
�(�ct��x<�c�
��W��cL,G���'
+�|/���?$6�D	=�������?�3A���V��G�v�ʋ��,����h���ܷsX�ꏏ����> ��Cr
ޑf��-��p����x�J�
�R��օ
��V��L�a�&��;� ���XW_($%�b��Q!���P��H�1��u��������=̞2���nx�$\��I���k�R�J�(����I�~:��w�l�
>�,s=��:����ḁ��O�=ҿ7v
=���Ѿ�u�~�? �f��R��I�G�c2g��=��|/n �
�Ybp]s��R�+�37�O'1$�Ge��� �B�O=�
�(C�C>��NFخ���%F�܆��u
Ck+� ���̖ʉ��s�
��o��矏�P����U��H�mL���V��(���5O����
of�x�v0���n!f�["8
6��0Ys�y\��||�Zޜ�~��W�E��n�}ύ����3;CF�!�M
ԪNv��pB���q�9!��ʌ��O0:��X����t����^\1כ�}]O��q:|���
iU�f��蚛�����"�/�7叅Y(o�3d�wB�oNׅ�7%f����
G�Ⱦ�����,z���7�y�xvj�
|F�
��h �Ĩ��{���>����|C4���
��s��}�
T��7���p��e����~��g�;{	����JHz
U���oqz$F?��
<;�
��
|te`|�F?,�~�Y�^�ݵ���d�tv��a���yf����
�.
��u�B��}��u<�Ex��n��n��2�śZ
 
���lLv��;�[8���>r�u0��wV��}tEfzU����MO��KR:�a���V�o�{
_����i}��GJٷ�����F��o?����\�1�6��p�,�ڛ�㙈=����1��/s��fVi
�����
�Z-st90�`^�,�;�
+&��5��4���?U��w�eޞ|�B�Gam퓧Z��ɷR���N�â
����%��_pOW�
�
������(�"j;�q�r��c��sX$�D�1w@�<�|���,�s6�҆�אk�-�*�v�����_����A�
���pCQعHO>5��vo��h8Y���^�NG�W�Ƨ�sޖ]G��C��6��w�����\��T�o{^)���\)���?��R��x�(=�\�:9
�v8�c�vx���kc�n$��+ZnJt�E�if�E�A��z���k�G}�\�n�t�y<��wg������P���\��z�$GUk�<yV��C
����I����6/d^���/Z�0Ad�2�JoPؐ����D��e�X�&=z}n��n��N�
��l����ȵ�a:�{P��·5{T��sXM��u�
~�� .V9���*A�걑-m��P�]?�⡤�3���NGE�$D�ɻ⦘>~�
+�c�������	d�,J%���y����:�H���.d�bsu���<C:r�dl����TMM_�J�aּ-�v�e�X	Kۅ�*�gW<lz�"G�����BL1��
+7P�
+�ɺj<i�g
���Ї��f)?&� ?ɏ���
N
l��@�6�95�W�[�I�}��
B��^t�%%����)�Oq�W��IZ�)�נ�+�U��~��~��y.l���O
��+�-
=<�7��t5��1��,�kw1_�
�\�۹E/r�������/����
Gz%�
�<���zg�f\������#*w�i����۬��U�&k�
+�L���NX�!��bK{��y�-n�l���l�x��́��4_(�W�4��r��uϕ�<�/nmV���r��ל�z��~���eWW�J��3��
,ǷCv*z�aߓT	���[�0�5\\�گG(Z�+
�i6���)�vv<G6��� ?2�鴒OO�\)z�9���R�gz5��i�b��ՐSJ#�,�6���27PW���Xi���"ബ�T;F~��@�<����E�f'�
+��I�}j�fz��X��
�2���)�Ŕ1T�p~RE�|zˉ�2���e�(ꙋek5�jh5s��(����}D�T��#�xi���䑕�� ˝�Ė�4�
Bt���H����+�X��?��	��l=3�Y֣ؗ+A��=���n_p�'�����r�T�Qc�=��0B9Lq=�/�6�d�2!Cm
Ke]���8�WڟQ|bƇ�|5�,���p�������eqd��O4��AL
[��ZY�����zb�}�'���
� �f��Q�S�t8l�L;
9�,߰�~E6��7����]�Ε�F����J_�S�O[��u�+�]rd��[�co�A?����v+�F�htX��G�Pt�E��>oM�-oM�,o���[�n�
���w��<=bfX�r��{��.����6�l|a&�関SA)5����Su��S���o,��Oe��� Kz�e��Ң"��[S4VxW�<c�
ś�����/4���b��}*p�^k���q�6�%�6�]�ݵ�
����t7x&�4T�{�>�丼�[�q���pZ-{Z+�/��J�u��~�[��I�����aZ,(wR�iA(�y]@S�"���j|����
�
��K\pdފ�}j�f�B2G��1��r�؉�Jڿ�!����&��A:?8?>�8C���΃������t
ۃ�a�&��0�B��ʬz��!i�.�B)���2g>3�a_0�1'
G
�2�o�m�L�e.�&s��zL��M�wt���i��e�~�S)M����K
��}�ñT$���C��O��Q�|���0|G�/���%�����:�5��<r��xn�w��8��
JW�P�<��
��/,ۼ<���
1񰘥��2Gw�
��gK�z��5�x�|���++Ҁ����* D�$��E�FY,�߳�q��ZX�˖ߍ�����-?��k�vf��P�ﺪ
���f��u7v�RkI�,}ZH�_
�7��/gJ�U���U{��p�P��@w�N �Z9�P�ͬ����`fjij���X������"�
0��^�`��L
k���E*�aC����b��t4�X�V�F�k�F��E-�
�e�(�fYK��0��^�ו@��)�

�
P�/��
o�™�TĎ�5��i��^Z����+]��w+/���)D}���kD��q:�CV�!5i�/��!���ڹ{=qq~:��_����x�VP\��oea\Y�<�N�qMNy�<O�	�~�Q���3Cm�#ڕ'dP
�
�
�0x�t
[�
rd�7����Ǘ�ԝ���%}��Nž�\j��[��X�lB'S6��R�B߇0���0u�U�a�BX��
x��[�b�N�*��P����%������
d	�'

�-�oHo/�7zB�z��v)�"���rV S2�+05�19F�P��~��`m C��Y�L:o��� }?	�Y��܃Kr�'Z#���K���9��&K�w��R�5�K7[���H���G�_�i$��>��<� �{v��Q�a��x��
�"`W�B�w
�k���p��o���
�}�βG���`[�6`+�<F�ln�ID�8��bp�|�e�;�K�r�:y!������K�*���,��e��P����Z�€��ހO��z&�M��':�)�
x�����b��o
��1�,���
+���$����R �p���
c\_1ޟ_Q�ZeQ�0{�O]�\2�l�ww�T���2Q�0�`�K_0\
+'
DN1�.}K��J��J at hUs@���\�EDL9�=#@��2y�
� ����(�4 J����Ku^@��,��MЋ�4��0��Q�&�Nu��9zJ͐��9��*���x-�N�|��Ŧ��L��v�zԿ=�_�ب��@� Hko
�
� 2�"���@62>���
��:�ڨ
�n{�^r?���?���x.rP���K܏�me��f�\�i(Mm�J��}�)�*���r��8��_��W��:@1Wc�L�5PS�P
+��"|�7�[U�^�1P���R
h��n�F5`�)�c[+~D����L����z�
��Yƛ{H�5�$�;@ZU��\�ߪu��&���Z��O��|��h��
��
z�%}�8 a!��ȑ3�����)�>�}��m���W5���j����-�n��/���d��d��W���-+1�&��=�/
�'�Eq��m��_@���
P~|�:�0��5��=d.��61�.DpNL��
zTv�$Y��gXMt���r!&��G���0[���ۘ��� �Q
���x��W�9���dƽ�|�4s��:�7�k����?\vjx���rnA�����:��;�I�M�`��b�6QG��_�69'��UB�P>����ٚ��5O��V�߬H�{�$rಓ��
��9�-�̍-�䧭�I���c���iw���u�ȁ�~��HO~��቏–~��*f��;u`%
���x��?�g"�&`~��1W�;����t*W��[�
N�?=�g���0�
+���{�W�;뮁-1 M��/x
����\�����J�
-�g�j/�ˬ;7��~��謔��2e�pQD����x>[
��7k�y^��,�.Nާ�D���N�+�G�خ���'��:�?��;�����]�-����xuw�Y��gH�<��t����{J,$tBoTjܢZ���>k_�H����[Wx�3E
+��J�����\��yw�F/��E؞�Q}vg��v-UV�D
��j��x�)h>�1|�
Z��_
�$Ov�knB/�渕�Z�s�����
���<�� ПX8�� ���~	
@���f{�fV�빰���KD�!Ag�r�	��DZ�
-���R���Xl
�譹i��Hϝ�����MvEz1ne��ȧ�˰�� �����G����d���R}$��E�Wz�R��]'�+wv�J�CG~�o�w�<���T��^.b�jjTo=Cl�
+Jظ� ��G�R��B}���au��EJ7g��S��[||�qT�凷F�
B�10��N����
+ܜw
������c�I��~�9{{��
�$q��{�l�eXl'!��Yq
���>¸�zj�X@\)5�2T�o��A��z�:�����!w�^�֟M⬝�+�9�^J���| ZW��Z�ԭ�]�Ü<ǻ�^ۓ�y�ք��
n
��U+�
��Y9������,�����#�l�#�[`Ku�
j�õ�x��x`�u��	�]F-U�]�:ȇݪ�
��
3��b����Q���Tm4|-w~�b��s�Ϙ/T[D[

+\+U��.<�&�
�
����_�
Mk�-�Sx�:q�}��'�a+"����O�ET��B��NP�bxV�
+�Chg����m�\�V�0��A��WD�� <��x0���
Uz��7�9�A⚿�Lҍջ���wC�澖��g�e�V��l�nW�<ګ|��Q�@3�
+�6V�/D
+�g�bn�rA��*�%�_;�Ɣ
�L�z6��5
_��{�0�Ѭ����+<�ύ��OI� ��qo��<��=Z���+5��Rg
����#m��7Q��P)L��5�䒅�߉����tK��K�tgXܗ;�b[�ͣw9�m�|����:�X�q�l�ϋ�����Њ�3��
�����uרC3bL_�~�[V
TF��;���S�U�Z�rݕQ�~ �gebi/�,�p�Z���f�
+������y�<�VUS����+���Fj`<64���.�����G�w:�ߙln�.
9�ͷrq���N��-yZ�-vu�z7�a�a��4�C���>y}��}v�ӭ����
��aw�2�o���N�5<|���B�
+]�G�ЍA�(��
��72�F>�q�ܴ���c��T<�Vjo
Ϝmu5u�P�uu��Bu�6�~6�X��j�b=m$X�y<5��[P.
w�}�yo��w��e��f
��������"'ا��i܍'(�����
�E�瞘+���N���
>��[���q���go���Vm��]��uL�Z)E�.e[>O�8��#��[^��V��_hFm��"0ֲ�렺��=Wx�^ju4��^�,��j:<�ݧ�,�h���8�d�k�
2i��F3ںL2��du�rjCl�T�6v�(�yJ�L
��W�����qY*�tOw�w����N���+�ė!6ėH���9����ums�(�Ӣ���qx,�� o��8#�m�|��m��P̏�
ѸhN#����
QaC(�酓/�]�/(c���T��vϕ���/�!b.�;�$�]J̝V�CI��}��oi��Kj�O\�
&r��`�<k����w�
ޛ�2�U�=G
n�o٣�m���%e�M흛9�V�r{��b�J;+=�K=��;t��6%��I<��4p�O�-��z�.��VG�s(L��A�S�7?�A4_n�
Ө.�|_��
+�R�E�[^�����eB{r%�?��^
�q纎{��
��%nӶ�m�\r��x����"�{��Jo�Ng����E�r�-�3�픯i�����0�/�`�� ���3�Ǘ7��un[���
_0�
B��V�<[�
�,���Cs±����Լ�:ܲǏ����������K��ms�~��>~�TQų��2c
ce����s���~��#��S~3���.��C��[)��p��sY�V~;��Ҳ�ngw��[̀��ƒ9��7��8��T�[ԛ�XִhWZ,�e�K�/��|�� ٞ1I�����F��}.�
�K����U���
����PnR �K���k쎳G�#���S���K7Sq��D,�1�Z��F�F�ıK�{fFݚ�3��^0�
�2�D����������
+0+��x���8������uL�%�Ӏ�{ߢZ�Z��J+�*1�(]y����{��{�D�Պi��}>�7�o���
��M��[�RK)�|�B�̵�m�	1�1�.�_pv�1B��ZT��cO�hm�ɢE�Ȗ�C+[�v���:��
ä�
�<�x|��
+{N�%��CzX��m��Z�9���I��>����q��}�T?W_��I}C�a�H���IL�'D�<�!����:��-��RC�ff�(�,������)e�`�W��5G�c�

k��
��%����_0N��߷���;P��?Mn��8������o�m���-�����+���(�\����"c��&��s'|�,>�:�q�#�`�0��-(y�K{6z�?����
�z^ޑn'O"�|7��3���Bv�#
+�(!]����0%1�/�q}��
������w�X�V�`%�9o�9nd7����`ܫ7E�Tc
c�Cn���5�Oܭ�c�;<тsb�Kn�0=��.�g�`(
�s
+�my|�PI%x(l��i(\��7�c6Ě��)U��j��E��k6�/�F+q���@�X����f�K9Žg}�#�a�)�Y��Je��3�#4۬P��� �f��j� ��|`�Z�\��
b���R=P���x� ������T�2ct+������(�"O�LC�<`���O�D�6�:G -�(�|�ӕ��2�%,_�;�.ȓ���1�V�oA���zP� ������{7
�$@���E7�u
+h�v��f��
@�z=@��5�S �fk1L/����A
�6�\�J}8z��rn��հ���v<�9����ֆB,�(��N��*�.�(�����`�Y0`��#~VH�21��B�
cPl��� 
3�G0�de=�2&�9e��Yk�l�>`&�Y�0������u��.�<~�o��F��X�mV.�e�<�(�I�PȻ�B`x�Ruc~�j_�=�%/~^Z�Ope<�����ʀ뿋����1�#�-J�/pq%��� ܘZ��W������GO1�צ�f��^��ٲ4]c9�Ϛ<0W��l�}l&���o��X��銐ʀ��A�w�4��E�k�À ���d dL����ސG= ��<�c���t tX�t��� BcQB���A@���_Q����9L����
I�r>go}���J���c��Ka�J�̱���g�xP@�(�W���� ߪ���Pb�n1d�@�5\ ����H
��ɜ��,i�
��G
�J��)i���
��@:NH �H�GT. [...]
+�n
��R�W@��/����w
��q
�5{
Ԯ� �'�@�g�1n7�,Pn��8�kIi�
~��=�PX#7Ļ�E����f���&7�G�Mܶ����Oo�'�&��D�U_�ٶڬ
�NeH�עB�Cw�@��@���H
�O|���˦A��?%4�?�[įX��%����ou�'!I�M���"*��
+��'1��3@��S_t/�qf�z����p/F��
iwf7�z9����
N��I�>�
�dW�?�j�&rh)���?	�M"
R�??p����� m�O��=�UM��D3w/��{�#�Y�f
g��Z�����ػ���B��9��37u^'9��[�W=*;h�/
6�j�j��ȡ2-�JĻ�m���"�D7�O}��cd;�7��-��WŸ�O��:s�
v�
q��vq���	Q��)�O=���\ڇ��I���:����o֑uC����ʧF�Q?��s��Su����	
c`w�^f��q�_��D?s��:��c�
��֦s�8��>d���BlϷ��\m)y����a�-����ȏ�&���@g��	s���g���s�s�5u�69�9U*�<i�yr
5�����n�
Z>��q����c_�'�[���6�O�Ys����ټ�x6s�ig�9�����p��
�	�N
SbN���-�9��M�6O5h�'d��g��>�q�
+��s ��Ǐ���s?��u����佻����"���`�#�`���8��Y�=�֛zN�IM�%��[Y��ԇ�܏0T��o�*���u�2��t�_J�~oQ.�z��[}�����i0ȏ<O�[R������k�E�l�����Y��$�9G/�[n
��|xP^�{Ȝ!ݠ<%&�긅��(�9􂧗��~������y�-�䭇Ǖs��P�ήF!�%g����;�Eϗ����߱��{������q
���
�^�Y�7��m"��'	nUl�:j�vڰ~e���.WPi�8��ن��ٚ���)�E�2��r��iņ5��)h[O�ړvO��g`�[A�;ij���;���h�V ��z�5*䍭�]\�g�RkH�F?ص�jQY���
��5����N���Y���.��c1=�;�eZ�;J�DS��&:�ˈ�{�n�����l���VN{i�xM���q�hYm5*+�S߈���ܜim�:���wN;�
~{��
5�W��
_ղ��¯
ު����59�
�9�8\�����{�:�m [...]
+�tT�,r
�y8��83���������/ֻ�I�.��]֮&׾"��r1���
�t�
'���	"���jv�V�hz
���6�����ޙj��~|'�b���71�i���m�#�V���P��E)� ���k�H_Ί�2?F�<��
+~�p�ۆv�^���<������U�On|�R�B����tq��g��K���K���3a&X�7�u�Us�!4��F���*�:����kЙ�Xr�yU&�զ��o���ؚG<����|��A��]gC
�l��T�|n_��A�/�
+���K�Ξ>+�C
��ڲ9�iU]�hY|����PWk]f�R*O�T�l��v���Q�ǽ"�
,�T��'D�%Ps3�ը�]
]
-�;
�q��YANKK�_���C�t̓[�3K}$�KB/W7��e/���e�ZVe♸�y�,�=��~�J�����Sِd�}8�p��e�	�:m	d��������(�2�����:2����W���{���;T�S5J�(ѥ� �
�|~x
s�t����%�V�+>;W
+�ۢ��u�$�C��*n�-+�eS�O�WU���'�Ho"u[σ�% >SON
��,Iԛ�D�
\�5/�-�?�4rM2�{�6��2haU�l���d�oe�G�<�C�#�c�R�c��Ugjݬn�üW}���
����_Q�zRwN�b�5������|l�������c�x
�3dh���ІG|���G�kh�M�K0�0�x.�Ư}�T���"���'�u��(W'��P&�t�.x�\�$'��=���Y���8�R/-��gY{�f�D�4
�w`�qS�BZ�c�����y��%������-6��P��e���]�)v���\F��
������5٨�+��҃8n��ey�֝�*U�
�%��B�`c���z�D�
+O>z�m����t*��J�
�P�W!
�>

�/5<�G���-ީ<W�U.c;�L�Y��ߘ�2L��f��c%�l�o��i"�$::ӄ�Z��;���������S�62�'M��v�g�r*�z����O��U�y�B�����
݁PXZ#~�����v����%==q����e��n�b��e�
Kn���,�����q9��m�<т�Ĩ�=�Q���M��Au�)>��R����Q�8�Ѿ�`?�c�$�����X�n9�]�T&X&� �z��d�l(v�j��>ake�R|=b��ѝivv�a�F�M
C���(
�����(��|/�-�i��~��H
�D�>�#y���[I at j[L
�A���VǓ7��[wS(.�
�؅��,7�Q&��0P\�7>���0�[�ø��K�����������3���/�1������NA�>(yb4�#��Iy�-��T��Bf~���5��23?Tf��JY��٢>�rO$�r��S���߭U�UF��t����,��s$��
Z��g�,=�;T��ꐃS�G�#B|�p�c�| �t%��
+�!����S�f�M�T�b%������%N��/l�X�~,-4
+�k�~E��*"�+�"N�,)	��_���Ɗ��
n����U�I��~���V~7�x�`)τ>3�.�"�H�V�l���3�c�����i&����M�wĝ����%���(O`LۑУ��+%�u#\��3�R��H;Q��n��>U�#Ҵ�#R��C~����O���E �k���wvO"����3g������(������n�����f˞����Y=>:>�
�TЏ!r�M���lzD��1�Ag8�9���F��/Nң�����tJ���}@S�=�L���O�+;1=\ܤ�CB
²�U��Z`����3�~���
+UE�
OL�/����D�)��*
T�;���
�;�~�C'�QF��*m� JC
����
�{&���ZʚWl���}@��6�9
��@�Z������y
+\IH��3��X��o�Og���XI
������ܦ����fj�҄H�R�	�>f��5G/���"��ΰ����> {X#?������ �ɦbtH@�i-F����‡1�G at V-
�6e Ҹ�aƷ-)�$@*x�
�=4��]&�~�%lL�.�[̝=MX8��0�cOg��?کlvX��
&��5��γt��`۟
uNbl�:�m
�
���q� uQ��PH]����P;��}��lcj���p@���tS�z�%h��Y��9fџp	�H�L(�������Ɓ��F摣��Og�N9��J����Q�FS�5�]r!`Lu���ыb,.�lz�P�=:�SLɪƸ� S��o�1c/�����kW����5@����
+�<�K*����뻨��Cn��¸��
��@��~��:��x��YI��
Z�F���{�.���9�����
�H�ط!Ƙ ����1�2��[���1��z9�ފ]�ޅ`�	f�B��"Z��
Jo�T׎
��J\�oJ靪�����
3��
+ag�*�-/)x�x��=7R�
�ϯ?0	��B"��B��� ��t�O��//����7�
#$�K��'�2/��2�W�(�㚤7�_Qy���*�����:7b��{���n�%��(���\��t� H�@X`̟�[��=��$D�^bCm q
����@�H�J]��ɭ��J(�8��M���S1�L��R�B�@����u���j����'6[���p��QRl]f��������&���"
�������\ �� (�c�z��P#��O�}��� ���
+Td�m�@�J[���
R0��ޫq�����w��ff>6@]���	�i_�u'��wz�ݶ��W~�7�O�m�����'ﶹ�^��療��; 
��@WN3��f�7�*��^�A�
�!��=R��������'a�ɶ^���nY��6�
H��W<B�=x������ �/�al����{�`#n
�*��n6����>IAH�XW�v�@���\[Yq�T�O��@�h"/rI�m�M��J���g ]ޏ1z�P����o��`R�
o���Z��D7[���z��q�r��4�'
.�7k
�� E
�O������&��DM��'[S��Jh"�&�x'?>��|@�vGj��]n|�I��
i��t6��x+>���,>�(�p��^�Ø�dP+C���YT��4�i��򺅑���v�+q�\�=v�$Fڟv}z;=�i���	��z�_C���^\5SW�H���㊟��=*���k�x�o{g]W��.Wwבi�knn�W>n��7�
+���Z.���?�}�7������
.������"�ɮZoN�]�0n1�'^��h���y|��'���O���*��Y��vC�
+q�:�r��jB����qa�Y�A��Bg�麀�Sb�&�2U��+�
��1:7Xo$
���'���[���
�s�T\ 	LY��^%ۚ�=|{>u����?�������Qg�~]E�"n���]��Cc����x㾭��p�+�qT!��s�8
o.~�>��{��c-��7I�C#C���z�T��*ot��jut��G�^��.���+Ĺ}
��������{�~�a��
b��tn
V_�DU����u�k�j�־���!��$ IQEQ�`�9g�����\g���y���
� �>Z5Z�G���.��Lƥ������,�݇�3;�s�c]��Y����E�#r�MZ.%,�}C؆��;�@��U}��R��G��zz��y�iP���l]l�D����j����M��t��Jfm����>n����w�'(J�����K��jg&�.��x�4c�n1k'�{G	ijc��ݱ���֛��5���j��n��,܁;��S�tWu�
�ky�1��x
+NVO=#W�R�r%6�VEɬv�%���:D�:������5�����lV���
�]
Zx�������/~,���=ϯ&4����^.��qur�k.�Vk���c�']��S�R��Z�Q�ఢPt��6r��j�,�0y��[+���d�^�i/c.3�U� �VQ]+���ů�
]�á�X?p�b;^��r����
^�<l�:��SR�r\�T=����]��'�^���`�����V���_��h�䚕R54	��/ռc�+n/Ĺ؈��qD.YßW,C���B�F�
Qz�+䶛aq=#�q-;�U3
+��]i�uA��e�j"��I�6N��ƕ�h�T}v�
ϭbk�/�;������$Z�L�v����rŝf���Ќ�rJ���:������	��;Fa��ҋ��o�^�=u���h�������Z)V����ay�
�w�-	�V̤M'��ry�B�K�z�����
�^٢3m����f�`V�Q�1��:.W�Q��<T�M���O��P������gI=3�V�ۑ:#պ2g�0�AIY!�_!��]�
Wl��S��]���ʨ��KQ+D���Vt�Q��|M8��J����s�:,1�md�=5*��|?ߕs��mmu�O:��>5�ޥ4d�BU[Gi��,�e-�����fwh�nWOV|���r�:��e��$���+���Yja:���Ÿ�8�ހRG��5����Z��2��'
+�[�&},��rdH�V��=����1�2�q����\�-z�8K�Pa�)�7+%�� �
����WN:;hAjI��$%�
+�6�ע�/���sBo�T��8�z[�L��~`�7ɱ_|���x��D���z��lV`�\���Ty_�hy��.Š���{���e�QSY5J�B
�m�!6��ø3�	��F:��'�U�'5����x�j���u^xeF��;�!TZB��\d�[���O��jc����5?�O�/�,�G١xQ6�9*L"��p�{�Ć��#��v'��:�Ո��\/�k-��-�s����	.J���3Ո�
����H�,�g����Hv$�t����Yx�.�
{<�lM~`n�ǯ\�:!9�2K���\�뇅p��f8���\��c�O�ڴW7m�jZχ]3pwZ��tR�f��9Y��½�k��f]��sbM�=Ƶ�j
��/��3
w�%~3�§낟��
o���n�[�W� �#���n��e��ܐe�Ù�+����/�	ï0���f<��.������T��Bn
vr��g)N�屲S}��Uy��b��{��~�Rr����#��N5[�H5~�V<��I��v�\uO9��ٰ�T}l�-�Yf`g��3��Ft���k�s�ѡ���:�Pq4�(E�e��]���N$i�.P��lcnLσ~G
4�/�ӹmd�����*����)
y2��@s�Ȏ��e�
y.�i�-�ye�̾o����,9>Ч��A�m����P7t�P�I��O)j�=�����>]�I`�eb(�mb(�_$�>R_"$���D5��(p�e Y�Q�<ĝ�u�nV���Yf��Px�UH[���|�o�׏��U�u�vr^�üF���G� Ц�15�n�2��gG)���	���(�c["��L9��O��/�Q���`�9r��� ����'�H�1b{۷�'��M�>m��n��
�=G���)�PxE�F�JWYT��0*�"���+t�oY�*�m�����^�
�y{�#S�sB
�Ԛ(Ffr����}���
��
+�Œ���������
���'J�G|�I5�]q|F鑉�����6S~
î/l<�Ԝ�~~9t�Ҫe�~��
���Z㪛��ѣVYk�谼��(���D	',|ZC��]Th��a�Nk�U�J
#޷
Z/fn(C���n7d2M/�gx=n �3A����#���	��P���sBD�Ő���Et�O���횫eUo]6�jq��-����bX��-�;��h��
O)�>}=u�$�n�1'}1��>�Y�}u]�x����[����r�e���D
+�*
[Vh��~�N�t׫_��"�A�(C�[f�֩-���E�f�k2W~���Ŷ։���ոu����3�qX���ͩ��;;dv��G�I�W�^%s(�J�4��p;S���r���g��=Q]������ ޾!��P�_�RehRNe&JT���K�J�|T� |�y�
+�Ȁ��g��6�����
���3`
��
��??�E%x�YL
�l�gt�Dw�㔘6�1���u$�`+��U����)
�k)�[��Bo�1��׀�o	@�sb�����Ĕ< ���<�Ot;E@��9 ��$�'
��
+Je4�Y��
������_i��,m���u)���̅4��
s
�.r]�}X�uy^>���TKx	� �� �<�Lp�<�[�'���=��� rLۀlgW�lRx�8���
8�=g[�d��_�k�HA�R��
�+���CQD��,'��
U�
�8MOW�\R��ՆP����� -�Q���2LЛ'��-e�	ڙ�K=y@�N�
$�$/ʨo@���׶��r��)
�Q���d����a?U���{9���s}5��R��y��P;'{���--�[��{�!�Ӈ���;�>'�v�y��0
c� �f�� 3ө30s�
+��4��~1y� � &<���?��R�e�FU�_3�7��V������.��_j�Ƣ�3r��e�\��&KPN�ď�6��S���V��p�`	��l����7��
��8A|$�S���p� 
pզ8� g�c���u�3
8y`Ni&?��o�a��[�${	�u��#��z�tj|Hj�-ޘ��Slg��g��;A��m��t :��*H���x�t�ټ>�������@& �� ��) ������6Y�\���AV�|:��6 �-� +�U�%�u�ݽ�
���tK��*fw�K<��:��~W���f���I��<��]d%,���l���x���b}�����ZG
+]:
�YM�ce��6�h.@,��@lbX�u
�^;�^���>Ybhy@���J��T�\�B�?�(���ɒ8`���'6���ћR.=W���1|w�������~�?�>
+�W8����M�Ӵ.�M/+ #} d�( Y�j@��y�d�e�_��


@㜁v����Gq���
���qn�7�ӕmF��N�
����=dcu��������ɻ��M�C���PQ��q�6V8P;��}!�; 
%h�a�Z��h�84B���Z��_M��d��#�>��
�����͈�v��9���u��b�0[��-�z`J�^Xڭߠ��6��n�W��8_�PO_���p!;���b����7�����^T_��o�<�����a�_G�1zhcu}/��[i�ޯ�^x_�Y��-;or%��tJ�i��s�ăAS?���y'��!F���Q�w�ږ��\��
�-��� ����4�
��q�oO��˺������hr��R�]��Q�,9�v�_��x���õ�
�;;ٽk�bW�Q�혧[$�.�������rS��ro�����"$r�<f����k7~�v��Ӂ��8oH3�H_��k]��Cc����1ޡ�y�,���ԼW!��� 3�†g��O���6��^������ai
��={�nm�
��t 8���xRz8��Lw�cl.G��7��>d�Ox��Y��-�wm��=���}s�]
��`������M�O�
+C��ӿ�P	�/�T�?�ڵ�KW6�©x��n���˩93C7#��`���N���s��ǫ=��~��U���ݪwZ=�@�N�m����F��h��PDnw�dm6o�����\z���@|��m�y}��C
ɣ͌��T�~��O��L��MQ��W�F?��Q/�AW���@aW�q
ߵ�~�m��،}E�A�M�˴\Z%�}3υ��"�j���j��
�s��iv�QG��[Z�Jc\����YW������`��hg�mNz2��0t�*ջ�wl�ݪr�V��vZ�G�7[.);�NJ�88�r˿FLۏey�=���Ӂ8o��i��cclY��t�kS]��l쳵M��k�T�9������ڽ�\��U��^�/~�T~�W�
��aUG���z�B�������
��ƾ�C~�K�װ�z]�F5�Z�16+r���M�J�e�f��}�V�x~�Ɯ���r~�v�{rɇ�jQ�n���O[�r��^%ˠ�Vy܌{e3�M��
�M K�Eq>���p�@��딷J{��S-z ̶�}R���Vr`R�ƝY�}ݡv����^�'n��S�Ǫ��DW������d's�j�g��e����Z�d���y�����y�����M�L]=����~DT
Ϥֆ��`#�R�_,E���E4��޵�A�C���,:��Y�
���[)�F5�
�����Vb��ݢ>��������+˦�<���O�8�Δ��	Y�
++���n�"k>u�;R��
�f�
z���X��\��?�WZ�͒���s=��S	&�_�Uv��ץ�-�3'��Z��Mils��@.�[
���+j�
�bz
��B9,��Z�D=��b#?\���h��Z8�ϯB.���������/������W��켪[�P�"�T-�6��R��
���
+1� ����q�wkb?n�~{<j�ڸ�־��8RˎV��Y��M��T���:�B����wk�Ϋ��P�SǙ�j\�ڈO
��[��SCx�V�ʨ�$��*7�2五��Lz��5-|���IZ:�
���Q�/��3�����<�R�(��a�

��GK�7�Vm��WkR��K�{�e�݅��N�����?
ժb���b�V��<QH�����^f��%�'� �ׯ�Ē�<��x͏,1&�H����Uٗ��g!�^^���|�
+�PJ��PصF]$�I�ʈ߆
���#Zr-�%��ɽL�ֲ(`�8�=/*2ޔ���,ɛ�[��Y��yx����M_
+s��$�K�:cblk�o�)t[��$
+ )�����iA��������g��g�щ�t(�z�xs�AY���e��nI����z�v�d�9qG�md�}�
[]�N��|�`x�(Ρk�.nH���
NWE��4�'�DB�d� ���0�]e���M7�'?��
o�<77N:W����.#v���,��I�&�RbiJ�'��lR_�ecҦ�*���2�V�~��z���e�^��ɯn�o��k�t�ʜ��Ŷ4ׅ
���Eh�d�����̶�g��>7�)W)�[���
��� ���R,�vUf�F
�s�>}�q'ڿ�qZ��,Z��6t�&�X�U}�G5=C�Mcv���~7Lf�J���3*T���˫:'gt�Cv��ڱ)]"� �-��l�GY��U|��B��֢b��K������c3K��4N
׋��V��L���.�ئ"U�P2zܓ�e%;��Iv�pIޯ��
J&�w�l��o7�A��m�FKDʴT)�<�L�r���:'=�f�
+�~?����R>����e���;�j�"�d�
+}���|�A�G��vN]��=E���?�
ٙ=R��&��1ѿF[*30>F_|�������(̡�"�N��Z�s}��q�`�U�yd��
+�-�)��Bo=�h՞�>�>�
�
+o��*�;�>�#��Q��b;������_
9�';w�Mj�ʘx[�51�W�pΥ	h8��q�*�Ⱦb3_\a��Oa84�0<}�`vq��f��/ڵ@���a0��e�m��g�鲯�m%�y�ԨBj}y�k���]@�'
M��9��N���L>�D�iM%��f�4�U��
:�#|<��i��x���1�q���]��:J��̖>�3��ʰ���a��a�=��̖w(ey��	���n��Ks֭�� t J�,�9�K2��1�Vu��ɠ=�N3LR)���֠ڹ�L[1��GD�3���V��k���q'@W汇R��4��
+�LCl=3���#�IME|
���u��y%?�V�Ip+��������@�DHK�(��U`��Y�RN��4��j�O��m*~���XN+����w�=᫾0"�,���:��_��֢���>fJ�1Kv\�${9b��V�`1F����x����s����WW�t�2GЫq�@}>f�~v
B/�K���=�A�Gr]�7��-
�|[�UP�K�X��1�op��r�h�&�΂i5�
��"��HWĺkh���H��"|9�2
��W
�K��~ �(ݙôf��Л �P!�"$�8U���V
`����40���K,��`�o_C��*uܸ���;��.`3(V��(�V�ơ�Kys�W���M�LrOƜ������l)�R���d-ah�Aﰔ2�n5�Io<0�"]�c�4A��,�N��N�����pʡ W� )0� {l?�>�q~�|�Ԭc�}].��jih����n����\��Hą���sܶ���Y��W6�F�H�e��)h��S(ꀠ�<3�������0Ai�`�C��1@�t�a�=��%8q ?� �<� ߔ���o	�{�o���i��l��Y��1�i���;
E2���L�A?���� m>� �;y']�L��� ��	H
�$��ԭ A�
��e
+H!�O0|R��C
����(��cHz�$RM�,� q�^�8eh@,q��)M��p	����.�^	���0���+���D�9��r&���%9F�D6N�Z��ޛV 5��	F.������������	�7 at 5�H�UPM�L�eG[@UJ(�
+�(	� EK@�9�C����;�YE���lݨY
���-Z�]�D�KQ�}aM9�G:ed�.1z�۵0h���P�lU"@��n��(�v
+�7X}4XL?%��8� T�Bj	�@_�@�h��[��Y�=�I&����^���]�)�s��qz��zk��D1�Jǭ���H���q
'�}o�B���6
�����FJ
+��>�0�	�u��!����J`g �>e�)�\�Njs�N���9<9�v��O��
�՝Xc��H
�%�J�^,����߾9c8��C�X�����s�
���;�r��p���
 ��N�m����
+�l�xe�|B����G
+�B5��
���|/�Ip5 ����oMT���C��ھBnE�.����o��B�B7��f�H�x�!�~�a��^J���7�'�B�7�
�G����a��s��~���]œ��'@8Zw $W ޯ*·9֫
6��u���>d*��3_3���rRS���1S��k��|���-9�O��|���
���
���w��	_����������$�uZ�{ �]v �0�U�*����;`N 7d� �&�Wn��&�.T���i6��F���^�Z�z^������;�����m
�	>z�7 �?�	_����6+�{;����ܓ�6�Վ&@����ԁ��P�u
����fR���*�ߨ���O[�o6�7#���ӂ�k���mR���rK�-�U��mL��⮜댽yW, �e)f������չ�
/�}���<�d��I4����׺�y����W��(�_y��0-ϔ~���c����&7�6]^�|���a�|�����^�O|�>�� =��%u�3Kn��l���>��0w��շ��o�Gs�&���jS:j������4�
����^T��@�!���s승C���3
��
���j�wo��o�\>��D��^*D�ɧ�#�b���҃_���zm�*u��4��=�|z��
+�t 5��X�d@cN_FK�M��j?i_���Z�>��_���W���!���݀Hn��'��d��^�
��B�O����p3m���sK��s���Jc��[���;#r�7�.�Cf1�<r5�����-+}���
�՞��[�QOfk~�QV<�b�o�j�oQ�?q
��q!���W��gɏho�pF��p�G$��c�WM�/��F���±�i�޵�?{�)��v�,��n
+��
+݁�
+�
�\�zlg�r��
܈\���OBOЎ!y��\;��_�q���2�@����:�ݯ��ՓwP͎�
�Wf]�[�Lr���u�'�R�
	�����o�ؔ�FƍZ����-�
=����!�A(
+W�
O_~ʐ�͗��{T�2�c�^i k���LoQ_�-�U'�q�_�UW1��F.��"M<�ǘ�IA��OůZ[�;�
��g�.�s��u�
N�"�ז���]/y�[���d�݄&R�a�٠�,�k�J��t�q�a�em�{�s�
O>�?p5��r
)Z%.-]�1��N�뽹���ݠ�
�ou�
W�q�.��. �
I> �wB
?%��i�Z���D�}̵� Sw�:Q�4�l�9��%����ԫ�Y�\��UQ�ȱ�f�i����T��؅�e��̙?BM��J�Ү����P�

<����Eװ����M�'�m����1/6�-���<
��]��&4\��KG
�\�:�彪\��mE���Û�5�6o��npy�ܰ2��Q?�9k�y;���2d�y�̢��uc�##
m&��L

�E���
+Mt</y�)���>}1���h�ܐ��@�br��+&��+`��]��Y�A�����=�k�<�@ka��ۦ͖�%G�OK䥲*�rmo컕�����p��BX
!��tJ�l����:-��A���������xh�U����
���y�T�����
ԨϑZ۾��Vv�} ���lP�o�畎0���ӫ�x}a7g�lx�Ϻ�pz�͂��|�-��Z
��W��A��Ն����]�(oH��1\�WKY�Dy����2��
r�%8�8���w�$
��\����X:��c���;l]��.s(��:�,�c��
�GUq�+��ۥu_��Y3��`���YІ=���TXW��A����X�x��B��\��:Y�K�!ט�
�i阝Q��z���C���l��~e+��{:��W��k�f_���
A����xŝ���h�C�/Hk�A<�s)�ɝ�
�/s��{�,���;�������TvÜ���LV�\3���ɳ!|:���/�2#�^�I�:��]а
���-HK�M����%k1�l��M/9���f�����_���:n���Ʃ��!�V�gc��ٔ!����J��`Xh�jC��PA���B��YI��d%.F���(Bg��ͬԳ�L+��^;
	�?��%_+'
1[�������:ЬΒ�Ҙ�4^7��v���
ƭ,̦��E2�� [...]
f��Ww�n0l-�Z���_����B�p����%on��#����s.�^"�^������%U\�ulb�m��e�g皻]�JN���쉻%M6,>
+��c�̈́v[�m��x���M_��*b$�UO,�߳��D:;~�Թ���W�R�+���b�%�:#U�r$��u��MU�Ha�"><1^l=��`�4si�py���S�Ň���D�^2#����W���˅p�QG�j�ʙ.
�
P �{��ļ�;5����q�GGk���
F��
N��&oϘ'۽�L��k�x��E�Z����89b)s7�G(�Ë��
��;�ҕ�N�!Z��J�
%.Q
�����
=
��V�������|�Y?�J�_gt�ʥ��0X��E����j-u
�����]�4K�7AvX#��D�����'��@�K����RǦ�bV>���t�V]���l�g�/N�0�������F�;<�4��*�gs�
c6�_D�Yg���L�_
թB%ͰH5+��ѧY��� |*ݶ�HH{�
+�٨9*����,�#r&Y�a�Ec�N��(2Z]�J���&��3�G�f����/W�#
+(�_�*|��&
��
��[
+�p�
K�2��|~
�z�M뒍����H��F�†�ب�|�GI2
5�-/�)͂���
�͢�M�9�5��I
+������
�D�5nl���
��)y�k:��
��~'�

�,�FgX���t���Ҋ/Ԡg�6�����B=8�@O�^��(�	��؛�ᄏ_��Zޯ
�[���9J[z�
B^R[����uk�ҭg-O
���F:�
�-�d�nqC:�M��7��o��n�l���1��13(ϗ8m�T1���}m����<?��zfA� [	:30	�o[��J Gnv��
�m�>��"�`��5ʇ���8���A,�'ʼn�(�X� d����u��
tH��P�lPP~��B)w��Fj������3�8
tm� �S�O��:k
 :7n �K"@V'�e�!�
��n٤nڬ�+����-N�U{
�R�^�������a���T
��i�f�/�n�*#�#d��\�M��	�C��_�
������,��
6�����V$,R��ן���������`z���v��ܶ�5
�]��

�¾��B6������
X�M~`r�
�Xͮ��y��gw)@�! |��
�E���J� xé$�y ob��U��
�^
��j �
� �:K��4��d!y/����9? ���#f��.�����X����=S	�WV,m�4�<�'�ͬ�x5�LP�9�F��PI�T@�t1��b�B,g& C���'M 1"��� q�I�.��'�mB{@XK
z�
���B A�F�L����?����5��[}_s�x1����,UU`���τ݊fhVq�pw�nB��\�� a��j��
�G����x
 �T�	&W@
	�'� OR��S���
��*�8�
��0y��0��
ѕj���b�_.`B�r{;1�ʰ���^!Q�uF�ea���\/�A/�����7*�:���� '(v4�	&s@;�C�
h�@�h�	�M@��eM+�ԟ�`,�4�?�(uaT@���Z
@��Y�̋c.
V�*�}�.Z�Z���͓3��FO�p��eyYw
����b��l������_���'��`a{� <$X� �H�c��l6���6v�y�0��
��{�
�̄�L���c/�e�d�F��z
+��dj��sgx�S��`�l��t����� ݿ�i�G����Uu��%A���
�
� �F�1���
endstream
endobj
318 0 obj
<</Length 65536>>stream
+���s|*�
"]��Rk��a
+p{���p���E�3��&F��p��W��
S0�=$��7�R�`q�/�����_�F8|l�_A���>2��'��aA�[	��+�4$YB�����W ��~���G���[I���
.�[�g�-��%cmb���1+)�נ?{���#����fߏN���
"x?�޿
+���
+%�V��>]��!��
�V#H�9ȝ�f�@ڕJ@ګ�K$_����7�Yv�m:���x�E
+H���b�j�w�uۿn�of�_�k���:�t��VeJ
+
�_���/g���X
(g(*���J�>�Ҟ>P��������m�}�)���뛌�͈-�~��v�G
���ۘxQ7���3��ց�.K�3.�K�>o�{f����v�x*n�Gq��1~�z��M��j����O멯�?���7���?�`m�W��4�3��/��?3�urj>�c��o���p�g���a?�{mu�}�wP�T}[$�1랖�d����4e/=T!9[�c.Ŀ2�7r���+�������6F��Ғ�S���|<��}�wa�-��rG�ƺ�˫����}s��k,B

�W����κ
2��d:-\��d���	�+��v*DG2�.���%��
;M�M�5�"
��}�����M6�
�Bi��|����r_H/!������:}7���X��3����~?9/#r
�C7���yG
xD��O������]�E�'�wAW������;�0j�p?
�8-��Z�m��5�~�W����oz�o����C�fM�©2ƺ��pS��9q?� [...]
��
� ��5����^W�?�Uy�
�M�jdž�������.�
Su�{ȵM(�5�֏
O+&ur�4,��y�[��W���k�v���A��� �ZWcb
-߼�S�~,U����栐gcS�<��6�����e2�ɽj�6^ѩ1�b��rŠz���Pk�*��pi?&�'�dk��i
�N��q�l����4g�5m~1�q�+:�1���|:��'�m��\Z��!7�yZR�4����Ŗ�mmӈ��>h^
����Ӆ*q��T�TL��R�Z�Y���@��U��0�qɜ5g���N'���nq��EW�ތ�Ì,
i�Ӭ7,��`�$b��bޮ
�Qm4+��~E�0���w�y���38+�/����7Y�WŇԶC�o
ʷQy\=����6m��7�#��
|�8>�EWAac�C1��
L�4Rł�$ˡ�n��c�
t����{�=k?�k��j&+�q|���v��+ݯ���a�gAl��7���{�|h�j�S�W��t���9�l;����j�<n���}�[Q�4h�
+R�9���q�9�+hg�w��N���E���f��d
B��U[��y�e����t��6��s�A�smm���ͱxa3b��
t�R�Mѹ8P�7���D��jᰞ5�ήYɯ�"k\��ӷ�|lf5�[�
�ʚ���:�؆jf�@E�F[�sF_���Tv4o��,ǜ�\_?������u<Q<cK
W�X��^!~�2�2�:����V_
$Sv;��Tn	
�x�ރvk�<儏��6Dlh.��f��F�����
�UV5�yN��� ���*S�|!�U+�
�h8ҡ�nJ����s��-L�ۂ��y�>��t��Ns����j�0U_r�������3V\yN
sn�q�^
s��$S�
�5���s�-\U���ʌ�I�UA!�#SO]uA���T�O	��E�xIE��+u$�L5A���8���+��v�)
����ř?��pǕ���.�"�V
�YW�&S'
S�ތ�k�
}���'L]���B6�����������5�|C+���^&Lyn��(����jg)�{��	�}5�H6:a�H��|�e���8
��
�,�مS��U�0�����5b���������yZ����R�n�+���hS(�W)ߥİ=�D�u,�Z����А3�M�KN�e��Z=M&SZ}���k
U
+
�L��[F 
I�)}I)v��Q�$m�Y'�6ð�D��<��]�4_e\�DZ1\�Jl�{2F�)R^�y�+�,B�g����<������%��	
�
�hW�/�����p	֔���(k6�����v��R�k��ѕ~��T�ɦ
b�/��0��E7��w�*O��l2��׺�#c�3H�1��9݊6 ta�! D�pÌ<��%�
&1���:�C	˔� 3G�6��~��O�5�|�O綷���
����9=��>R����
�AQ�m�<��10�.�7z�y=�oRɵ ��ieliB��"pV�g�ָ��KP3��%����5�G�Bfe��L�cw��3���eV޴���� �/�a�oX����V�����pi���(�)���5������P�
+'K(Hs���ImI�U�E*+�N�S�1鍧�<�M�
+������7�L�":o�u��j�fj��%C�o
��#
i�����
쏷��i
�d%��e[H�c�٨M˕Zn^/��Geܸ��C/����+
)�Zv,=uv�\��%��o�Ol���J���|KC(�qhf�*�?p����
]��
��&pZH㶟 \G>�6��^�`�B��K�Z�#���/�}
��,��V�b6u��5k�s?�K�.�ݺ���P_���Ho6�a�Hʱ�e͡a���%��K��%6�[��Y�3���]�f��($�Z���qO��l�"'	�����
Ӳ��%���v��;[��ނ�N�Eۂ4iC����;��Y����v
m��l�}�M>���7�Lk�
��o�s*����ߕ2}��"	�1�c6=x"{�|�O�����#
�1A��fQH������R
����C�� �@ ���{7��O at Vw���댵�^�]_
+��MB"b֯u5��<�Q�
+����Xߝnb������Q��cC��
�{4
ѩ�8v�w���kk�Y���7?�8�N�ָ*)����B�s%�N��6az\kp��q�`Hn�x�$>��p�@
x��tv[
��L���s�	F�t��q	y�Q[�� �ZD�(��� "�� �:9�{
YyX��~i=���k�Q��*Y�qK�M_CBO�e
�,,Q/�5\��B�6�j��ٔ�(���Aޣ���"H2s��0�
$_D!�4�S��[�
�
�
+D0���)E e�x��gHz� $S' �L
�Ds�H�=��}cTg�A��ӭ�8[Z����ڵ�$E
+F]Nܕ1�YHb���:%.��
�$vɻ�5N�؋�{��p@�c ���1v ���	q�
+͜!� o
��d
�{b�` �`���'�\^��

��}
$O����l��覬�;�
*<��q�t!�a�>Q$7�����KE����N�,��Y M�%���� ���De�{P��
+�� 4(�s9��}P��	PcOT�O���*j]K[g�.�.��
+85hg�|�����6.L�S&���j���b'�G�G	o��
�#+��82`�� ��Fu�
�$d����:�?�8���(`���G+�;|瓏���z� �D�u��\�]b��
8
�ʱ+��-ͱYV��{]�5
H�
�����a���S��,��9��n��Ȃ=܃�
��3�a�IrQ�V�Q-�M+�{��-`��mx~��0����%>*�?܀?:`>���nU2��,�{2
x���;�cI4by
+>����ϭ�;7��jX�8T �u���Dv�����;�mt ��X ��NC���L�/*Up~�
�[ No�_�B�,��t�:I��q��9ŏu�7if>:݉��°Tr1��ܸ	�PB�� B�������0�@�@ȡ3 ��
D�
+�� !�:�B �
 !c,8�����B� �m�)����=�*5ڤ&�����H���+^��z�
EjF��9��l�`�K�;p��)�������{�ώ���7.{ )�
H�R�%�/��0U�%<�PG��	�>���J>�$��� 'gg�B��Ѓw~�ș�T7biv�eRWI
K�;(���/�߇z���
�_�۟�o����[��[N����[[{ ^/�A�Aw!�Go69o�vi���q��M;�h�ا�
=��R�\�4l�Q�X&:�
�9��������~�1n����G�����Tt��EhH�4T��G ��4c����K�&MU�ɽ
+����]�6+#�q�sk|fI�)����_���O��Ǹ�-����Ʈ�'��n�'������4�#�=�
`�fW`�u��������!����Y2��,s�����)녧��A�������z�
+���e��"�!�pB��ֺ/��vQ=�_E�pt�Ρ����%{��疻�_o��݌���Q�~�)���$��r��o�7	�Oz�&�^�v
QQ�ۄ�3[����C�|a�Z,��7q�����p�*��mj�.6#��S��[-��q�v7��0��~ ��|L�]��13v��4q7&�{�>
%�8�����^�t�
�N��Y���b^h�~����I�W���K���Yپ|���ё_����PG��HӜ5YўvD™�*Dv�:��	Ҡ�_�8s�����#j v�fN뜷���җ7K��
Ⴞ����{{��
|���IW�����5�N5
��p�)�����˾����֬I��ibK�'H���
��0��O�����~����S�M�{)���q�
��֑;���h��#�5J-�>��
�6
?3���zx�
��E�~�
�+cU.���[��н�w1�����$���C
s "ُ�n���+n��W�N�\��H'[��Z.(t�
�
4��P�e}
�7ua���")}�ɇңZS˱ʥ٦*�c"F���*�]2WFf�Z�e6�p�ГF~qQ]G�@
�?��/,�u� ~���O��� ����C��-�7�
���C�k���Zܱ*M�v�{��F�����
����FY�^��N��
e�~q:�"����P�
�]c�
+���Ԓ��of�y�>S�^������o�UG
Z�
~䵣���
�s��8�_��;k���U�Q�

�N�t)�x�z��>C��
W�9)����[ï���\z9'o"���q����v%��O��Qq5��{l�zJޓ3��\�f:�^��u:t4*-�6������F^�4zZ�̴�M��`���W��~��I�_
8a�*��_3��|��,�N��!ɽ&�cΡj�
�迲.�E�i�K��4f2��XȰ�����K+-<AƉRb1u
y��FL�ɦ������ٝR1�m����8�������&�&��+�^o��
[�\r��u���h� ?0�B��IJ�{����W"��ZfQ�Z�u��K
����uȹ�*u
����1��e�ܿ��I1����k�
	Gj�	�p�Z��W�i�;1�D�fR�G�X
ٶd&;����a�|t;�j]o���ڨh��A
�ba���Y�
+g}�#��.SMf���J
�c*u�2�˨�K�D3�;�f)�Z5��~q�J �~�E����3sZ�lL��:�M=��@#�0݌k��%�E�_�����0Sk�*P5q�U5)�)�Cs�FӾ
+GOk���q��~CCÀx
5h����T�����%ꮥj>-���XJ�
��Ӫ���fzZ:i,Z��>�9}���0U��ݨR�"w�U���X՘�J����b�Y,ީ�席jY�uY4e�Jld'Q��(�C�n�����p���*Y���2R�����>.�θ7�Nm��X�K5Уa��%ge�6�2���*��,��q�Wk
%�-k�唱SϤ�����\��Ł|�]�=2�N�%wR���x��S��
	|4�Y��C���������\}�ڕd+/1�K�5q����
�^۩�L��/igY9���?����S���?/��r:ZMVN�
QF�SUʲSS".��8k��H?岰��;����ʟy�*܁�-N	Z�ƞym��w
��]�e�y�=��Fk�p�ڹ�OE��}J����r�Dl�)՛���61��R&[�Z��c��
>d̼_�le�r^�W|��A�(�0�y~��2_Zi/=��ܛ>�tvU�����*o�[� ������t
+
�ظ�S�ΥSB�B���js�~�v�:_X97���<���M"9J��C}=���b���ƾ��*w}����y��t��

+�W哀=��ې�4��2s��M��&2_���+w�tʦ��p�ߩL�ɮ�%s�CR*w')�I����LN��rc�q�jbZȔղY�"1�<P�%��dlV�[L��0]���t
+Z�֊7����9�[�YCjm��ap`j�L?/�'�=1:��Y��
+5<t�T���)�1�dnә�T������ ����[�
�Ca�C	M��ҨD��u�!��·�j$��ޔ�ۥ��+w�jigf��Yt�@k��D|�=s]�����3��`E�kI#�W|Tf&�(���B�9M
(�C0���i�X��
�>�|ݳ�x�O��4��	�W
,n��X<�4��W+a�g�\W�v������l�[�nj[���1�mb�=����+�w�s��"�+@��i�;3vk��\WY���\��mCE��~�P���}���1p1���>.VN,��,>
�S֦к�J�ڱ]C����6*
+�]�Zg����#��m���#݇�J��[U��v����4�0x�e��a��>��ݑ�_�}2���j�������{���,������J�[%TA�>j{�J�x�t�X2+�c1���bIO� ��ؓp��G5��=0����{*���89S�LjTr8�X˹9�Ou�]
/��-H	�����$������vXaJb�^�+��=��
�/(�׫,r�W*bM1'����X�4��b
q
��n
`]SX	!
�
�*̲ k��C�ʷ���y>b�)8�`�����<�����H6W�9^�1$I���Z�!1�蠤��x��ߢ�]l���-��&���z��zm
+��^��b
�\;p�|�K��V��(n�Q��M�V�p����ix�B� g�j%}��K��/��|��C�3�M;�'39f	��^7�q|b&*��ڧ�=��m�i���D�7�X�28!��r�9�|\�q �|x��� �0�����(� 
}���=�/"qO|ӫ|[��v�wv�y��٢
��f3�
�<�R�[��j	�a��$��	3ʱg����2�����2L�XT��ʥpE�h+��Ҵu��vD��v$��
"G at LD@t0"���W�u�xx�� �f�Q';�(�ᾐ�����r90���0[W*
�O�R:ˆ9��U��u�ү��9>]X#1����2�R
��ㇻà�M
Ab�������* d��@L@, ��QJA�
+�
�����I�Rw at f� s�va Ȥ
��e ɥz�Eic������~������*7#�J���%�
R�ӳ�i�c�<�j
Q�z��
���Dđ��rwzjC�eH�TE� �OK]x��.�|�
��*Hl�c�J�
+�2JP&�J\"�"�ׯ����!<H�,xNkÏ8'���w7V.h�m{'��w�y�b�~��©3���6}0H��}��^/E@���(����ȂKb
+"�!�u@�S��	�^� t>f:9� :U� Zs�������c2Ql�� ���<u�Gn-��S���5k��Y
mⒼ�N

'Tq����6
���;�M�`eO�ʁ�~�`��[ �IAL3�Y�<�,�2D�
��y	�a
.�F1��

uߊ`���pL�%&�U �j���`���w��*��cg �+	q�e��ы�%$���as��vf��b\u��pE#��;�H��vd��/2|id�Ux�Ў V
������ģ�#
+�(�
M
n/8�Y��]/ۀm���~WR���\�6+Y�م�+ԟV=/���g(�JZ8p�	���
�ϙ2�R��^�
�}E��v>Tޅ�ƣ?j�y7��S��JxWv�-?Z��o
\����`F�O=�
�����伶m��
�����L�*�/�0��=�Ǝ��տqo�l�
�

�)�-��
W
+������@��{�x�d)q�(��� �zր�Y5�ۥ�xid^�lM��}^l
s&�L<X�et_hV�
%������m����ǽ��Ͽ$�?	��
�� 	 ��M?�ǧ N  q�@�<����܁|��C���U��f��UO#&a$�J�ͯ��f����w	�'c�I�7|�~<~2�?I�܁{kz�B+T��C4[@-e�@-

P#,�
+:j� �Z����L�녙�)B[V���˕�iҀ��m��?T�S��-���� �$�?:ߟ
�_=�Lݾ���X
��F�_�qC�1Z�}z�ͨ	���
+��� F�� F/<��L����S��b��0��^�y��x��eʷ���ۜ���xZk��vZ�DZ���1���C�/�B�����0w{�
+����
��tW�n�!^����t��<��-]���SQ��ȭ��53��*�+�����r���_�oס��mj��6�_]�.������;�]z>Xȓ�x^���%�©��
�eڑ)d����xd��1ޛx#j\�
*M~��ߕ�ӽo��['�Wy�[z*���A�m�����mF�zZSu���-v��k��
+��^L��W���.������g�a���!;��AHJ���W�%��ZOݧ{ݦR�w:���~uI������]�?���>?>������O:�ӽO:��60?�υi�+��*�GS����
��q؇Ԭ�n��q�:
um���jY���F��Xˍ���43���t&4�U��
�d]؉~-�{�jM�+�{��1��:�[�S(��0�#]�U(�N7#�n�
t�%
ڗ�J�k�J�U��m��K��~�m,�e��Ϋ����+�H��B��kWkJyP�4��q�gѽS]G6h
��t�VF&
�
+�#z<�e?Wd��fA���3��(I�A
<�IW�����L����F��C�}m�hNS꽾���Z�@U=V����D�_�4_v���|5���Y6zL�).�i��|a
e
�-�����v�뫯�$�t�[�>A��B�s�`f吭
e�x��Y}?Y��oP�{��Ǐ�v �%�s��X+�4.�j�R-�˯�4/��aR�ު�.��P>�ſ�53�K7��f, �N�c޹> [...]
��fVh'MR��
_
�6��'�ab�@���5�o~n"�gLc�yiKd��p��EB_j��Ӣ N��e��iq
Y|�W��Ʀg�.##,�%�S�?K��Ҽ7�Gy�gGy���Zq"+�R"j�}z����J ہm�� m�ǥgz�,0������������ԣ��(7Ӣ��U�s��jl
S.4��R��ߏH+ީ�vq[�(��ު@<zt��j���T5

����[a'(p��oW�����A�|;u�L��xI�,F���2����>��1_�v��
�픪э�rYN|����}{���x�'���\v���
�F�-&@W��`����i�x�4駅��\��=�7v=�L���ap��ߕ�
�l�:U;���j\��u	7����E0��֓�C�,R/��l$�)�Dܖ\F�W]Av�P�F�А\����QN���Q-!psS~=����7(n��'������̭��).�'p�•�)��-���5�����j�K�n̷���o�Z�TuW��L�$�J7vWZ�q���� ;I [...]
�|�T9ĵ�z�?�kEG�wO������������u�o���7�-�om�\ź>�S�c�O�:g	L�U����'���nS���-�tێ���Z!���O�iB�E��x$I�d�Re�����Qb��\�
�
���[t�+��;vZ�f��q�sJb���Is��8
G2������27��3������r����Nv�1jk�Tzu�(,�-2�O�H�2�>"N	f�~૒'������v��g��'��p���d��ue�!~���A���mNv���
$&��dl����
+r�)����"G��~�X����7�����������K2�Mv$99��}b�Q1g�9�T|5�2x1��p?��rŻ`�*�c��p�j+�A��6�
���,Sk�f���n��~g����D2��:��h��%rE�j��WVm
g�<.��ȕ7�8����\R8���֫M�	�G��<�W��
+/֪G��t��vXN��ۭ�ɑ�G{<@k1^�ȥ�g��:�{�j"�1��h�%��{q�+{�[��R�o�B�
�X&��.)@-�֢�o�G��+��Ò��9�y���
����
#=����ҫ�
�K۩/x?F�Dn�ɛ�=�^ZK�Q�$rYbE����X�}��l�E�����S\�@
�C�����ml�p�L�҅�̰�)e��$�>m�Gr`#k+�z-��+r�2��qa[gI�f
�tZ,�0�c�#����k�
������e3�9��
1�S,�p(1f�V
�&>p�d
�C� ��q�6`G�ƥ���8� -��3]�%�"݂^I��*�b�Φh5�LG�������k�yU��F�L=��U�y�.w��V�
&o��6/�أ;
ƺ��<�d��t
+�6��)Ч`�
� ���i0�����1�0Vm�� �a<kyѸs-��#�
�����ge#:��Kb���ܪ�L�adKI�HQܰ%�k��
�/Ob�̶�ap��1T?�g���O at z��8�,D`/��
`��]�(� �`!D���v�
p �\���=������'�
�yP*
�����$����G��p7ʞ�ۇY���Z;��SgzW*a�f��S����h@/
i
{9����)�S�R�5D�1|\C���
�x:
A\� �Ԯ wm���8� .�q���Of��Ƣ���!��>!�����=W@��ܪ����7�����-�������`u
\�.�l�;n�a5����{@��#��J� �<��my� {q�+�@����2�=� |�?��R�؍•�T�OF6SOy	,��D�1�Ax�8u���U
Y��jvq�u�Q��=b�g
 �&?
:$/� �)@�R1�6
q��L�x�;�
 �

+�#e bq� b9���3�c
%cF�<��n��x#���u�۸A�׈���[I�Nz�ݲC���~
�d�^'�X��@y�+���
P�	|I�P@��;�z� yf���t��r�*� ����
	�m;�i��n��j\d���ٮ��a��tǛ����m/d�&�#��|��]�ː,?b?>8���5m
���B�hWAmZ��4
Q�e�ԣ�@<��z�>Ģ	��1�q~�)�jE���F��;��Zۀ��)
B�Rhw���c��n�R_EI/�9�%?��
�j��aq���h_���<�`˝�'�� �_?9؀��p*�m�x�f�^
��Al7�|0�3bV �6��{מ˹�
�v0I,��2?=M��h=�9�&�n�����q���i��9���Du��M}!�9�{%�
+v�K�·@xgv����
D��n ����;�J��*C����ش������ �dx�+.h��{ܭ�H'��ج:�
C0C.�:
��;��
����zH�V�>�}�'���k�1n���@����ЛԄ��!�+�k��$ ^�����E�����
��Y듋ne��LR�gZ���^e3U#�>��b���/��>����&�DrSg�K���~Un���
oM�;����`
1:�0�>k
�b9��O�H����1�waq l�E����{�1]��@L��N�����5��vF�5��]�����Ǥ�/�
��
��ۓ����������նr��r���g�s at N�E ;��i] ��l����Լ\RM�[��&��Ζ�B��|x�n�;_�I�ė��
�qj�[φ�����	r�Ϸ����^�~�6�-?�r��@9�@�7�"����n�]딋
5�֩Jz#鱾�XD"U`���?%����4�i�%�S����
?�
o���dp?�>����v��) ���A� ��N<}��7����xۆ�';��F2�WF-\G�P��T��V�S��z[
g�c�:���v��ׇ��[_v�������)��M��
���5��`��G��|asu ��,����3��q��t�����:��7^q����=���I�vL�ヶ�=k�Wrɕg��l��YD�ś��`��w�ɮ��=\ק���=�+��xd�fc���GԐ�٩IB���w�Tԗ���w/�n ��}
��HW�'�R����Eu�>��˻��S9
/�Ot������Xv��W�r���m4����"e���R��./�}y%H���*�K$�1�5NB��э\��ΕکW��9�Ys�c�Mj�c��~Ҵ�0�?F�9ѷt�'����'
��[o���8s�d���¶�A����� ��%|T;
e�j�'8W�,G-,a��ٲIMƛ�"�<4���R��.l�H-��T�Xc�ʥ�X�Y�"���,7����P%����D�'#Տ��G�z^��w���C/|y�Eb,}�C�Q�j#�ݜ�lc�N�z�t�Z$4�Z<r*�z�}gGo�ua1J�jQ����ed
�J�l�_��q豣eq��u��(�"3��Zr��/#�7�6�� [...]
+S&7���H���B��Յ%;�%-�����Zr$N{��H#թ��NGfH~=�Y|�#8�s��n)�n�F��HbJ�r�ٲ[~ľ��>�<�;��4;������y�[i�'�Q�1�^���;���pTL�x�_��Av��,��Mr��K�v���]RX
��7q~=9�|�����Z���A�=n�3�en��t�f��aLS�2�U����� �t#
bZ�k�|�(����7��
wIG����~Y��E�Z�^Zg__����!�h%��י8m����]X�CK+>���HV�\�W�\���Z8�YM<s������Z)�~ihۼ����[SN�P(Z���D-}a��%O�[���z� �hp�İpI�悻�Y�Mf���S�0[�Q�rLv���jXF��r�(��R($�S^l�C.�_��Z��c��z��1��pΘ�jCwN�#m7�5�e�rve�B��Ifc�G�R�ȋ`A����UM�
ꥈs���-\�	i�V�bf����r[��`�r�s�H��8e��Z�XȮ��6�! [...]
+CV�z�c�i�p�Ԣi�K�[vH����&�-I�gb�8��Gh|y�i_^h�]���*VZfXi���	��\�h�9ߢ�W�A�b}{`�|U)
u�����
J:��1j�칳�5�ʾ��M�a��M��<YX+�
W
+�:�����Y��^�N0�N_!�^X��pX�;l+�nX�9"0����C�;h�;�Q�V� ����%�nCӋ�]a����Y���+���]Z�	�PK�/
p"K�gu�L���żzE]zI��RD��P�v�'N=�gt�<o�9�UË�]�J�G���8\�a���@t�衲^��{AU�E�F��CB���Y-��[���	��
j�=
 �Y  aU�����d���G�G�����;W��K"mh�ϊv>�3J
+mi�
/҂D�
�ճ�tn�Hj�6p!V�Þ�PUA��%&����"F���݅�!��"/�J:
H���9?R
@��. at Z�@�I
 
:��5H�!�J4*�N�}+h�#��
���ǜVrr��\mf���К�+� �5!��� H�������L�����F
�#�:r���ؽj����}�Cǧ Yz[���O��mx��L�"� �
9��\�=�"�� %�@��w��5#BW2ߵ��B���v
�X����:�)N

�yȕ8)`-���_$��3�%g��e�h�=vbݘ� N{_h��Z��
�, G�V4�������������&�F��fc�RO h�I��|:WTž��
��V�:�z�xx��d
�|9�,iR���~^M^c�5I��ڕ��S��!b5/=�.�-��b
�w�
�jS��`{�1��/^��4��X�O�[���"� c.e�![�

Sz+eK+���ͭ�#����cW�T�%>�{����9�Q|�>�X[fx��ORg��)E���0�A�r{
C�� �� `��`����Z=BTaG�`����l��C<�!�1
+�Y`l�����	`�,|Y��pۮ
+pp��L.�]��V���J)G���]�bjKG�M�Li
��:M#��Ӻ���
�Ov
�
����=c�jf���V�W�;
+�Z���X �K>Ĭ�x�&


�g{m�'Zw�ۧ
����Y9��b�ȴ�j�u*�
Zʹ)�.'���l�X������c2��A��h	 �U�H�� �u��x�Dk�Diu�8_ �#_9
+b
�'9ݷ݄8�X���%R!
��B燀���q�kS�
�V!��m�=`l6ݺ�$)�QOd
��].�xFn���ƣ�M��թǡ�V��ry�-�4��I9 ri�9H� Y�?Y(�
��dF7 9@�\
b4��ƒ��HyU $݂�b-xV�c�MqZhEq�J�l�����j�\pb{3i���%��]�\�3�q�7����'?e�]�`��q@�d�����n���_vߞ��P�����q�eP~� 1� *P�(��:��tPb|
(R y�[�ę]����
+�x)53��/��dl�wA��~1��J���"'�D���Le�'cdN�>�Y���
`�%
v��!
~�N��om�F�� zL�^ЭE�1��

�H at W����t��tj}��P-(x��Ƿ��ܱ{|d[)����ZI�T
�b���Y7>���^�a�#��rgN:�O(��r筁gs5��ˑX��C�\��T��oB�怍�0�&
�Mg �I��N�L崂�XҾ;��9q!���3H
��>�3Zoǥ�Kc
zi
�}_c�
ڈ��g�����7���_��?�)�����5����l���@\5��;!��pyx�q�$|�m �OU�P8��O�г��=ԓ�RJ.K/��m�Uΐ{����b�3{��V�������[��?�c�P����V�:
�h�B�
[-���G�2�n���Jgn-n�d�a�H4?^<�,��t�O�6쵩nc������ԽI�~�w�0kx�7�x6|~��'����;K]!F�๡B�} -# 
���QH�jH�F
H�G1EE�i⯪4[98�좂No�1�'i�
+���W?��~�~L~�����g����g�^����3:��a�{�%�f���}��%P�
�^6�l���)�$Z�C�)�C�[�����Vn��Vڷ��ǩ᣻��lxgp�l���e�~��*�^�	�i�tF2ߚ���5�tݰ�n(������좕S��S�I�
5j

ƞ\���l�*�Q`���H�ո��*h�`ߵQ7���)[Br8K,��+�6��ƗB��{�\���ٝ"J^ਞ﮲���b���*5���
t*�?=Ԉ����7�i�A�u!����E*�
z�= �Nu8���VF'�n̢D���*��r�߼���I�&t�������E8��j�y�H��s�{���at8�/�/;���}a��vԾ����;j_�����/�?
m���}a��h��D�
�OG�  h�������K[=�
�����'��#�IU�Q�t߱����bΝ��]�vEN,V�Ii���8�@F��;��nzB~GQYx�Y.]k-1[�:>�M<5��Y�	ʍ/,���
���?�p-�{����{�y䏕��
�s���T�H	f��
+�0��`dG�ꌯ�ut�Sɚ�k�
��:?�ˎ�_=�a�'�d����Q�
ӡ<�d�2����Tm�,�fq����%=�����c�!
��s��vF4l�kjeu����;��9�P���Uo��rzO�k�
�/���Q���`����q�NrheYh`��^�,<���)W�Yt�X*�k�4�>�[�
T
�ó*����L
�Z�uՙ2�ț�X�X]��{Ȗ��8L�����l�H�T����-o��4���=l�P1�/�
4��Oo�z�v7�B����#�
��L�,�r�Ĩ�8\Np/�z�l��4oC��V�¶��]��j߻^�����b���b�
�4fIyz
Dw.
+H}���uz��6�l'�����^]'g�};n�=3���K�ai
t����hϲ��6��
���0�s����[����
���-/
��r
+�\��;��+�M���;�Jm�����ږ�ͣ O�uOA��N�oU�=��/
F�Y��mm{�Ť�u!��K����L�hfŶ0�ʻ�4��
��Q�����#
�C	��Qb"5���M�$�Ok�#5�M�тKV_�{(�C�un��
8
���
d�]�~��AYZ
���x���i�֔s^}%/�\̿cW��B��"N3x�p���q}�D��o��ߎ��wq�oG�����;�oO�����n��?�!���?����?����?����?����?����?����?����?����?���[iO�/{﹦<�
+_��L4`r�`r�s���{��k��l���ۙ9�>�04.KU��JRI���v	�T,�nc�
�T��b����
��;*R����k��Ϛ���hC�<?�Ec��I˱:�oaB��M�_,�X~��b�}��U�O0q�XF�x�Z�=a�a#hx+�g��2���KlV.�X�e�dO���Iyӊ���H56����#�5=�X}hi
��_q^~��b���w��R���>ڲ��[�B�KD��h�ڡ�!vy����l,�@�eU�,�B�Csa����I;�,��?���)���>��LF��[��Li ��T
vV^��Qsk�|��
]����x��p
���t5`Y)��þ/v�U�>xj���׳�p�.���/�0��
�w�.^P�E/7����uc��|��y��!r�J�m��b�R���$����H�m��~ c��8��~L�%��f�hmcM�
`T�ƛ� �߰���\��%P�4�#�/�
)�8K���S��r�(?Y
���Ѱi
ס�8��� ��v,�	;�l�!
�Hl��D����
����������R�ք�ݪ�h���
r�m�cAC�]煢H?Y\b1�a�Y���H�'����FPoTMkz�V��Bg�ү܂�_񫡘������m�u���ח�0v
+x"�� 怨�
�A�e�fص;ag䫹�8��5�}�^����B�����>@
 �j��b�
֕�U�*#���T&o��#!��c��S������VV��������3��/�_,�Gm9�xM��X;tչ�^�d��-���a8�J
�A�P�<q?���)���c����
!��(��}?!t|��Ĉ�!�h���

����S�]@	�8�4�d�P3���6����Y4��<C���b��Y-�$���H��o'��GtB��P��E�scwT2~�h��K�g�ؕ�#Ӿñ�0�*)tr�
W�]��
�d�X6�ꈯ6�*�ީ��5�%��/�_,�t>
7��gX��Py�1
�<�C֩�C�ٗ������gVÓ
�p�KS
:��%#!Z|�(뉋
h`�k=U����J* W�O��
��ZPx(�~4���%ċ�~-�Μ�f
+�[���J�	#�&�̹�����Y��ą� ���Β1ћ@h���^
'���1ٺ�-����w�îP��@�F�T������BٔH)O�LSes�ݹ��?Km5��.��
��3��F�
v�)�M�>o�[���AL7��u�
+ at C˩��y!��
֡����EPƠ&S��<
��rr�2�E�o�2t!¥���	a��\AQ�����g�*.x��
�_���_�p�o��ِՀ�l�E�]fw�#�-��
��l*�&=:&AS��M!6�k�9�Zyz
+��
+�
��-���O`J�<cjT|����Ξ������I�p]F��H������k��������ř1�>�=3۽F��M�J)�Bcy�V.
�D�M]�i�
���\zc��
+?|Bl����d�?��*��C=�stxfV���7}ju��1��/��B�S��\������1��з:s�B�l�"7,�5B���6D�
���MS��v��R!�����˿n:[?#>4z���%�?�B]B}3?Q��S����
+�)r����TN@��-�\�C�-S!w"Y
!�]q{ME�;�x��'�b��
�~(�ɰ00�����n�&_��H(�m��'\��}���H'��}��>��x� �"�����c�ё�����`T���5[�͛ B�FȆ++�O�Cy��(T| �V5�}n	�X%��Ο�D����#���a)���fJ/��
}X��X4Н�qΡ�&��SzQg5�퐠
<J*���;����&_u&m\^�J<�k�Q
�;��P�U���(�r���K�
�l�y�N'S�a5��QQ��_�o~��t��Z���e0h�E�֭�|,ݚ�X7�FH�g$|�v�4�-i�N���G�+���u�n���
_.?����~��p����R��X�H1��J�j�H	�ҩ~�_X
'd֗�?P�-2��j�+�?J曮������R)l��
;g�Gvv|r)��WHG�Z��v+�#%Ey��!�x�cg�f� 8�x8��S���9�f� �^��n/���ȯp�����Gb7�x�L���AӚn�
‘��
��B [...]
��r��
���,d�ЇWÎ� J.�:�z��d<��qR
��#�=B�0����@gĕ�VO�-�O�ʆNȾ�33����<ڀ~�FR�
��CT6"u���7곤�J�厣:�ݤ%�*AGH6��D��
�
TUZ�X,�8��/jH�?�!�GΌ�ȕ��ݤN�%�\]��[�tI�i�k�WR�
PB��Ai)�
�F�ת���AT�o�}�a�w��7���ً�����n5_�vy`i���p��sOȕ���`y]2�$9�דC�k��3��7�)a7�c#���br.�Z��O��O'��KH��~�]M��M�1n�R���X��t18	uHyn��jD��@(r�Gq�q��I�Jn�D��#u��7���*�#�s�_U��䡡Ɗ��A��J4zVEǺ�IIPW-JRڛc����3�����W��
�U`��z9(��&�IEL_tL
A�a�����f��{��Ĉ��鬐���O�������ă��
+�L4�h�L#Z��F|ϳhsJ�x��9���Y��}�2�s��4�(F౏ܵ-�s|9m�+;���"r���v� Hʘ�M�5�v�R�`������
+�57p!�1�H�%���e􃚈����Y,�&�}?.

����c�|�A�
*;7?���Q�󬁦�E��Yc�K]uϥ��#�3�$�2ۑ��<����L$r��k����W���ߡ
+�	fHi�
�[�c+D��3��/�
��
�'���

���ҟBW��io�mϽc����XU
�nb�X�C����P��ɡ���4G%�U�9�<�
(�\�
�M![)
�,�Oȸnrj.� %Dn�t�����0��	��"���Տ؊������s�X8��vK���R&=!
�Fe��F	x��������J
ZS�
��+E�f%�3�5�~Y����
���-hI���6��)
�=e�'�%l�E�9��=�b(aaZF:��CR�9HJ��V})
��n�7��M����2djԦ~2����
,��m#�WIZ��
+*��d��3HN�sT�GȘ{z� �}�V�4���ϔ��sL_
�	&��Z�܊ہ0X}ܬ;dX�)5\Wa�W u
�i�d
��:�J��]Ջ�)Q#A��~P�
�,|�g�u�� ���f�zÔn�-p����b_�q������Ws�I�؞���t
+��Z���� ��RY�oR�����\u�P�	n���Snt����\�jq���6�"P�Ռ�+�����@�|+,G:�$T{(����oƯ{,�iӪTl����P�6��GE���j����
+u:�
��Y��]�`NPq�e!��rc%a��tڇ�Ʃ�-� �FaO�2l}���l,�םXGB�/r/��{�����M�Pr\�b����

����"@b&U�C�B��	9���D12O��QNȝ/�u�e{�nJ�\�ȳ�zE2F2q1�9d���qEV�0�oN�ί�YOT���]4�V����n���t"=E����=㪤<__�S��
�u-��E
vTL~�`b���~�W�by��Ӂt����*��:L�
�W����0%Cܖqw
+W�:��fo���FN�/�V�R�N0΅*�6�r�&Hpje�;Jy琡ؚ�a%�~y��0S�ʤU�n��P� �|��Ub;.��a�����C�K����E��Ѵ�}�3T�y�`(������
��׮=)�ݦ �l
5~�^]͌'��g�H�>M�FU�L}�U
w���
+�g�r���YIܧ
�mZ�*C��|5��Z��v�Zߵ�����r�/���%�/n��G�5iQ67��.�*�ti/��.�v�M��9W�d� 
h�b���pR�
W�8���ʕΙ�bԨR��
�(m�LF��r����1�=�H�BN)RY^C���@�j��q�}教$'���&o�R�
�R'I
+�óV��� !����1Lle�j����+̽,��R�+�|.6��&��;5� ({��䒏��s�!fͶ�9�sǯ>�9Z��k��F������X�rX���4>Z^>�����oT�e�1+2ި��qc�+�Je�^���
w�M��‚~(����~���e�9i
eg��[\�=��%E�\d���P%�����g���	��=7$���Q�]�[�֖�ʴ��#Jr�_�:�j\�
l��*�VN����HFě
p~�1�8�sz"���m�@���̬��h���^'���j�5���ć��q�L
+��c��kX���=Rc��c��|�寉e3����� Q����_���.9丸5�`u���E[�uW�L��
!8�#�KJ��q��Vo�jr��ǥ%���a|W�8#�ǧ����tl~A`p�@|b��Ac}!�̢iwo:���lԽP��$�P�����9L
w��Ⱥs�H۶�9����'�u�����*xC_�͔c���
N���l+�N�x�������ʮ�X��˰����?K����˶�
Y4/*�4q�V��q�^�z�9O���'�'w�p�z�aʼ��njD��fo3���7�+*��4��@5Dd-���l3n�+�ܔ��#�
+&R�6�+�ib 4>�m�d���<��S�N�C��h�X?Liw<�(� S�
l{uZ�Rz�.Q�X�������e�옔L_���#p��
+�f�@�V��E=��7��{NM��ϕ��\�J�����������������ؔ!���z��p%��q�Q
�I�c�.Xz�;��B��:L���8 �8�� )�8��1}���zrb�"
��u���Ig��H�	�Z1
=�U׮~���1�����!ܷS:��
gv�=e"�$9:�D���J`jd]�g�R�
3�BГ�0���E�=�ո�她i�`�4Z|ٯ�S,�o�C����s.��
+�ଠ��0�M�����_,�X~���
͹9�𣞿4,Q�[���=���k�I;�I_�}�
{S1�ih�MFU�9p|�
+"D��=
d��Q@�
����- Td�Υï�b�|�򛜨��+�j���cv�J
EY�<���9�/w�Zw�=���d�����
�U�/�6\5�W��8�՞���.[���	6.	�%j���bl

f�.��Ǭ�_,�X�[Xt���G}����9��Ǖ�f�{[�' �Q$i��ܳl�7��~���g�.��#v�Nx$ܔʏ t2���m��˔�ʍ^��D�z{��Y@�����喦��)

+�|�K ,�]�)�{a�s'
cƄ��͎Z�7͜]l��~oi����IT:��1\Sڱ��^�p��	�_�dAm��~�\aS_����/��:INK�n'�)���N��-}|�ɐR�o
z���7����
+��f���t�=is3�k��P��:�
U		���89�&Bݧ�a�@M	
t��<ϵ��0��5?�
��S���݅y6�
"�_�h���>_j���ns׊��N�3
+�ظ�
+�y-u�1l�C��<�W�
U����_,�X�9X�����Z
W��g�V����J�Ճʊm嶧�.�W~Ի�r��/������B֭մ�nVQ�\�[w�u!��G�~z�b��Ǽ�%|5���9�~
�"�L��M���Z?��B'�qܪ�}Σ��`/I���os�?eH�X�>�\+(���'ON�?h
�b����p�U��~>t��j���n��!�.�m'M�
��\H�[՜�$����^[�~��v�v�� Z��x`N���4����_wv�KN���h�i ���6�Jd4�/I�#+ ��w^,c|���x�
<������ձ��
E(5m%쾶������U����.�B��~���b����ÂN?7�Xm���b��襭�&\%���o|�-C��a`1�-w�C=]�v�\�(
T��F�r崿�[[e���z�wP����Q�!�Xl�9�b~l;{�yP���׍��ʥ`�x����_���W���d,�q����H�oP�
|�����'��\����O񴟯6�?��e����&���t�1��S�ƕ�׌ll��v���x��#�X:�v�g��t�Cu��o4�Q���c4|Jn���N���V[�Lg���J8��p-��C�\W������݈�nWb�9�_��*���a?z8��Y�Y��}9���(s�.R�\�o�Ub�@p7�4
�ܴ��8�u����g/ [...]
+����pE7�M�;�./���ma�c��O,�c��4H8���X�߃o�c<=MˣF��*R1*wd���U�x>��Ib�(icK��� 6�!��
ᘦ��fW}��Q.}��h
��
�ynIb�`��R
��~f� !��d�^#�����
�2K�
q��pd7�l
�����v+��|��"�I�bX{-w��x�\dsif��
�zW1�̯%��Yt�*n��rH8��+	��8�yIw�ʠ+����i�k
+{��
+:�J8%
g�Y�A:�k��H-��4�Yz�|�<�q��}�X��A��B4�!�X���
A�O}�7Y�y
M
I`֖5
�n3�	�-�F��~~􉙼w�+D
�(��w���E(�F3;�C
�R�g���v~N"���!>7g���H��:ǵ�?#���)�&�H�j�q�ZJ�δ�hC�;��U�X����{c:�n����Ĕ�' ;��J_��!Y�$C=jof��鴬ٽ�F��!�cur��ӣ����g��9p:�ot"'��!>C���K�8��#��H8A�x�U/�H5s�rIɚI�o�<��o@
�M��Nײg�k�]l�,�c̯��N'��{GHr܉�KF
����!95k��?]#���	uW��l�Џ���<��,���M�-Bx��A2�q��K.Ў��� �2�bV�'��
�*����asoc��-��|C/Ƀb��|�E|��~
[�WN(-���U�L�
��ͼ�-��.��!�ignH] �l�)��'/��6Rf��U@�� 暔3R���z5=��RS��
X�{'�!��?����m�9�z��Q}C at 0�fD
+fuG��1���7=�]i��Ocw��zS$۪�dM�ߞ�U���
�Ɩ�W��M���q|��/�a ����r�YO�ه�׌����
l��}�N���`��
8m��H
�b�Ui
+�&�M��l6e��	��x
+Dz�����|�n2�	�U���.wh����3��h�jXV�M��i�Z��[��o� �m��fYD��|�C�
Q/f�����O�M�)��޾! ~#?�
�
����8�6�X,��{�
�eg��u��Ff=�S�!�;�X���$ �?u�
+�����&�e.Ҝ��
�B@�vB��3��4���G'B'%ٸ�Q�_����g[�q�ҏ��˜(��}a"X�@��>Vy�F,�Q�y'x��
d�ǟ�z!V���1��\2�"eJ���n�����X�Ƴeі��z,X�Eқ�č
�1�ƼD%�m����y�I�Cể`���.1�N���H�y����œU�v"�G@	>V��_�
@_��X�$��@ji� y3H�d08���?�!�p{kk��J��Y�}#�A��tv(�i��=Od)�Y�Vf�
#R�gwx�bYː$�
 �ġu�t�k	��KU�aE�!Qo�n[�QES'hZ�J���!�a@�/`
6�L3�,٨ST?]GКr��9<b[�2�
�
��0d�{��\	#:�dz����%:�EʻJ-R���	Cάe>��ar�e���"�;�c���CiW[a�
+�0�Hiʆ�7��#�n�
Ϝ�C> G���d%�'S=�!��0;Q�_��v�t�
Lⶃ�� ���� ��\��,�����K2q����ͪ�C���
�C�
+�FZ��H�6�է��o��o�@����*O��sƇ~D���M�
+�d
+�?ɲp����`|aԅH%[p��&�4�b�U0��I'�-��ބ?
a a�sPL�HmJ�<ȑk�Z���� ��
PLm�e�����?����,��� �'[�90�V̚���`Kr]�e��k,qC;,��5C���U7M�
HX�T󐂫�W���ʅ�{z%��]�VijuS��GU��5�e��b�����
�k
��>*u<���
<�^����q�eLJ����9X�k0/�eW�5���me�L`M��:o �}q��Y/��kk@�xpw`��v��Ej���n?�
�����Ә�.Fᾱ��T2���
A��e[
+`>.�L؅H%9��8Y�5���bګu�ܜx �Xhy���)�
+��G D��
,㰯�1ќdV�F�_���jm��
�m�7)�]:�
2ij��s�c���޸�L"���
Eq�ŬΈ:>��*O���Ƚ
��q]q��㎶�l��\��|�
�{�����'���3s���Sc���oQU���(� X|��q��������y9�!=�T�� %A���m!v1���a���6 u��0�sڎ�Xwp)9Uʣ;�m
W�yj�{�8
)�I��3�!Ď�G[���wS-1-��/0m_|v(�u©�ٕ�7k<[�+
�]�M�
+6��*1�v����ː��_#�p���7:��Dy&�T��u6�#�\�����_>=�H�l�yW}�
�xC慦ސ�Q�
VLN�n
��f6Rk���������� ��5�
&K��R��)�XUu4�ڽG�zd������
+��a�n��
��u��Za��c��j��t�K{�`#��w:
�M��8�ik��̹�T�#Kt�V�1+z\���҆�0���"�|"0iv ���r5|�
�9�
+��a/���!g3���Cw��I�/.�j҉�'�b�ް^8�W��恕pm&����R��I4���u����<�P��.����J� Eh}�|�����ש�\�����>05o�g�ZU�Ju���M�?/�ɥg�G�Z��l�H���3K(}���TԲȑB��gW`���x,�*b8�r,�V
w�!�[�:��F\���cF�`�QL�	�F�T�wh���l�J
+�������S�EךK&jo)j�@׮�4RJ�c@њ��:�̏Ğ�w��
����uؔ�Dh{
 ���׵��H�e�Ґ���t�A�g�gZ �
��C��Bx?\:h�z?� ��c��{2��X�B<��ɏG6;�e�0��(��3w�٬�L�j�Rň',s-�	mh�䯚�<�:��#�
m���u�6�2���x6��i�d ?z-��0v�9ߍq�
� ���X�؆�
CnX�^�#�KW�տ�]���E�Mo#�e�C�Nj�
+�
�@�4f��-ڶ?x�R�����E��E\e,�K��F��
l�NBgq4Jظ<�\G��h-�=�{P�X����h����Ɩ �J.j�ͫ� ,������~Y��-'1N%����]�w�{�8�se��*�nI��`����Ɨ
��V�qF	�dg87�~ڪ
:�=�סN��`J�7�a�o�ԩ#8g�F)���>T�0�9k��m�s\�Mz�L��RW	l"��aNZ�V�b�*ܟ4M)�:
o\��_,
���
+�H�Z�r7�)�ޮ�`ۊnA7N|�G<�@��/��9%�t�t
+�go�$����I����K��iEtkP�6���i��&���ܞ��w���
e> ����ʝ���Ȅ��<i���z�E��(�t��M�ɉ&[�HPSb��,���i��h�8<M��F��hK�F��:-�a�\�6�U^s|,�ƞ�S���HI? ;�dk�������;I?��� eR�~��W|طn�������Ei��9I[w��������y�^�`c23������Y���
x
d`ϋM����>��5����Ț#�����B�
5�g]S�fz����W<&����v�E�@|t�N︠��6|���T
+\zF<��U��qN�QH	s3
�`k�n�M&��j71�F�C�bI���ɬ�.M�)jJ�\��2����x�>x����t:�O9>���q��<q�m�Y�=O'��I�Ip|�{�(�6���$�A�b�U
��x�!�%K@����.��gU]��FJAaA\ W�V���
RR at K��C���
�z�
����W��)��"�}n�

uk��
i
��s	���Ӻ}8g	b����

����9+n
����aH��;�P�>9��0 �W:O�T�>! ���(ѥ�w�Z�^�z�;kũpj
���ͥ2���}d��Y?�#Ė�#9�����1\�^���}�@��x�ה����w�����H��s?f� h����.�lU�
���Z���r�SM�Y�6�0�X�x��ft���LF�dzFw�UKI?�~ ofT�?��0�K@���$���w�H
�)�1(
t̛�*1�SEа��_�
+5�����
Ow�����H5� �s
+,l�q�Gf��s$�6�
�z��k��Z�E�
+���&l��8���3T��N��p$�\�;����Y5��ք�5/wӑʳh�@_S��f��V��A?9�1�qGl�yLo6�V���8	=��������
+��j�;��洑�~<�S�����yv1}��{��r9�v

�-L�ry0z�
��#�N��Ϧ���Oyv�o��q�
?���oF��l7;Q���Б����N���,��O�Xy�"��o
8b���Ol�=lf��]�T�M1ZS'l�]V"���
�񵁸yqp���j7�:�_���V�0�u��:�?n
���� 8٦<:_f's}6��O���h7�
 {L��I�#%�.��
_M�,S���Ky6ٟ��)�L�i5�^fg3X�&�h��.���4�0?V
+��bv��u�nv^�cн�x���D�:� a�38��x��

�r�2��k��e�mش��	)®A�M���?����-�>
�L��5K�V�Ae7:���r���j:c��*B|-�qד��n�g['V�?�����E�:������e5^mV���ۭy�
@���
�F����;��f����;� �fW�)���oJ^{�4�e��!������А|���UH � 
��/�U��
�:�"��6��^!:��^�&�׈�|�Z�7_&%�(	ߔN��~��,O�팏�vQr�w�Ib����0bH	�4;�G�u�?��@1��+�F������ј���}ʄ_(��@'�A#�˿��un6�����;�E���~K�;&F��u
_��.e ���)OiLU�e���l7����%��@�����l��|��@��p�P*��
v~���̄ �??;/���O����5N��5��K��{�I{y�T %��S�ԙ�H	��{�r����1
��"��~<��F�[��kV�5"�&��l������j"��Zi�j9/���/�
1u�W��=<o?֛�wɵ:6�]�A�	�z�z����MOA?V��M;��	`
���u��D���g�����\����M��b.�͖�vO��Ej�c��!�a�I���<�ހ�|�������-b�ÈPWlK�����Ǟ&,ƁM?�Ҷ
+1���2q@���P�����0�$���0����m:���xP���'D��C"dKtt:K���⟷el�"� �n֠��
+{c6��f�����
��i�\��?��|t�\��m���/g�?�ѿ ��vh����8:ß��)�	i�8��L`��_�
 ��[�\�j�b��� ���c�s�C�ٟa���lF���X5�����|�,a��; �W��
�mh����W�?��z�I����V������j(Тn:
��q��O�h��&�}� >�����9���_�<���2��H<�k��Xo���4�_o�w��ӻ��
��4��Dž�!@Q$v�[�,��-�Al
;��=�T��›Qk:�.C�>6cfC�h-/6��j����������g
U/��ܓ\����(>�Z��S�!Pv.�ڎ^%G�͖
�&��
��1�!�ٖkU
-|�4�r
�SR���m���
*
�Xj�	������&
�\#�M�+����|v��q�N��C�A3��+��ʚS���3bq7*}Ļw�c�����l� ,�m֔A��~��푣�x4��䆫�G���3ZZb@R�9Ot��-궹�m�M���鏧2K
f��)G��G&����a��m{=q�10�VD04�3f5�g�2�r
��a�婂�,����2��!��n�@�T�����&n�qV@tw�R�������[�=s���w���w3�+Z��>��;�4m�V
^��`W
+*�z1},
��Z7�H��reLJT�@��So��h�HC�Q�x����Ҕr36�	�`^�c��;ge�U�GZ
+h��X'����|He\�K�*d����jb8���"U�S��U�}�!��j#N ���
�S�+���!�T�k�H�ư&=65YH���ϑ�kQ�aͪ�w�L	�`A�̥�:����TǝSS�
��
ļ�������H
���"�tt꫑:
)ŕ�]|��i�6^��H�&�4e�wZ{~�~���q�O 
�XOס�iC�
R��W�S�<^�.R�����g�E^+���K|H1|��"U�
�$����ޚaɒ��?�

Y����u`!=k��y[F-���B�u
ו2�4�]�
�� �K{l��3����GCv>�Xn;��d�} u����>V�*�H��v�dڟ
He
m%os	"�%�Y� Ҏ
��+:�׋
��
�X��e%��:�0/����z_| %�븣�y4u��#ċ�a���6"Z�R�
+��6���#=��O�Z^���"/�t��h2�p��톰~?b�GZ0(z �y�mM� R�h��f������	/�!R�i
+ְA��O R�-���]�B�����0�
��@
+v{m�1R]���_)��Ԫ)��e�4|f!��8`�K�����Lc�]��x(a�D
�HM\A��53����`c�€�� ��,Y#
���������rt���Nn�]&)�B
+�ɩۺ�͸_�f�l�N	�m+/nYO�VOz.��6I;2�!�o��W}|�%�S�����J�\8չ=�s|�\
�<�'�O���囅��y��$��p]
+?��=��x�/Qᷫ�}A���Zo�Z��#��5�����f4���]��6TE��S@����y;��
?m;:᧽����y_ko
+��_�g�O��

���)f�׍#��yM�i�c��P�����.
�>��^�a?|*Wb��'�sU>���=f�>��o�O,

����USVR���|��(�3*G�0e���%5gq�,S�o��6��W�-Y�&�7���a� J�c�Y�J�*0ցiT$�D��擄jE#�{A;�6ҠҦ�3[B�B;�E���y�N���n#py��|H�D�Z�vR�Jr*���{Hy�VW)Pm6a���a�d�X�Jh�,nH�:R�\GGj����-:�4�S�ZI ��$B�����@�XB�ÏԮ�	#U�#C���
���
��P ik����*@�I��o����/��@�	!-H�+�E�l])�)�KI���oFJ]����hi�a bC�7"�N�<Z��C^@'��|�˸�:�LГlƬ���d��<x�+�J������Ny��o�7�:t����A�|�C�A���L }�m��W�
���n%��
nM*a��	=,�@��G�V)�@a��@s���l���]����8?�w���<s`��e�Ҥ�f���`�>����)n��h���fA���u�>�g�C�DV��ɉ�Q3����d21B�ʗ�ݗ����dz��(X�w��3��A�ix��W��GzH�g�}����
���׍g�$-��%�;'Yt'�0��,�I�<�֘����
0�y��y�X,ѓ��Lѓ D�S�	xj�/�F
=1x��2J�̊&5��qi���tZ�7��H�<z�
�<������w�f�� W��3�Ќ
+�������B�R���:5�CDG�W�C�Ý��F�̪���Y�n��c�_4����Ά�u��ej�.�~�[���G�
��j�ețoC'�:���mOF�]�c��H�40�go�<c�I㻱�*�w�ҋ�
d

�W2��@�|B��2�
�Y8K��x
�f���ӳ�Mǻ`G��Up���� ԯ�>�|JHM�1%Iq-�!z��
�[�iҢ�~��
+�s�������I|~�A��Wֶt�ǘ��s�)ɖ�\b����\��S3��^��FJ���V�
+�;�
+o
��T�dw���
��σ�>w��&V��c��n���3!`fAP2�e`�OR��s���$�lߣ�-S

���6Ռ�V�L�vl�6�l�!��
+ɱKH.Y����E�i��+/!Ջ�rQ�Xc��y�:�ިY��;��f�AM��P
�@���w�f�ݵ
��u�	�>:"�[���t˷:Br*!�6��%ɳE�׵�R��lCO�1��� �wb���΋���H�a�n�u>�|Ƶ�iM,05X�SG�=��
�� `�� ���r� �\�
!5��V�3�!�P����o$_>ݑ٫V@�O�z���<Gf��k���69X�­Ȱ,�'�]|1�^!�3\
P&�Xܒ9�Xܦ�
�ύ4a���C��0Y�
_�M�ժ�z��jTd��;�#�����
S�ohv���;8;�ޖ��2D�����iR�5 ����`���d��]�(�D��W�~������$?���džO0<
LU��R�	��!�T��"P�m��A��_���<���
Ő����"����м��C��
+�sr%��P
�|w�g�}O�<��O���|}�
N0M��1ڛ j5�)�0�u�,g�ZɒtYxXŌ�(��	q����wP^_�X80*�`�}Rw;�{��/��X��m�ܬ�~H�Z�Tĝ�MOħO at a��NE_����0b{H8�>� �0�=�])u�c�
+�z��"nqx̫e��7�8�<
U7i)�����oo7�]	��m��3>ARVv,R
+�
]�h�=W��ߘ���^�h�Q�D��¿��8A�K4"N)'�8�"�����ۚR���Dc�>���h
+C�	���p^�hwK���%�$�
�~�Rz�����	��a�"��!��r`$=�
\�x�.~ �J�U�uxӌfD�	}"�
. at P��R����Z=f� fd��t̒�vy
�W��Ni߆�qi1�Ȑ�H���p����z�	<b���l`�
Y�Nt7�
��!���RLh7r��]�/�H���⓼�GS�֘��p���>�$8��o���1��7w1G@�ip���9P�^�<N
�_�g/$#T%�
��P|/$)��
�<�aSB8��^�Ҕ'�ݐ
�%a�M�K1N�=�+��X� �1�F��mj^$p7 ��������* `k^/��b��`p>��d\Nt^Z���	2�I�u--2�~�;%��>W5�����ؖ
X��q�B��툤k}��5��5����"N@s�NxK��m��Oo���ds?�!�%���L�}Q�p.͒�o�e!�b�y�6š>cE�W��ķ"�+�9{��K����K��*[�5��]2$��땰��%N����
:����F�+���?�Cg͠#)��
::x��O���!}d�Q:̷s��3�;U��CLJ�AG�/�ϡϠ����C�O�[�@���9t�����
::n&���k9t��з����б�Y�5#^	
���t�N8�eL2v�W:��RL<�H���^)�1u���U
O�s:	ضq�n�����G2�*�qfJ�6HQ�'˦��37znh荴$�ʎy�����,KIf��G(5sN��h>�8�s%��|]b��H&�ϕ(�HL�U��˕?��N� [...]
��D��g6�$�?�^!�S���%	)��H�'I�c�QLIz�8cyz�D�8ΘnC;�g����3�U�&�ɕ�n
K��f
��x�I�y|�'�/p�j%t��Ȋ���\x�R�K��{̟x
Ӄ)p5��<>�!��
J �`N
M�|��-\P�����-/�
� 
U�� �2fޢ��Q��{r�x��_��/�#;{&��KV
Et�K��,c��� �e�= ��]B�D8 �M
��D:G�G�LB��c/%h���.
�3�*�z.
� �"�i���'�r��
<��3U~�X����3z>7�hv�,9���!a`��3>�K�#y�:a��x^,[����3�+�I�ѓ�8�ԡ+����	���5}�wAa}�%�O�s��J�'&%�A�&���0w�5��˙q��'	�"��^���.��Jf�^�Ȉt�}��7���#��\1:����T�����H����מ�GT^ŷ�DbͲx-=����UK�]HH�Qy-�ׇƲ+��o{d`����}J��=2|�0
�
";�u�ݛ�qHMι�/�L�y)9�~��-^�y���$�F��
t9��s�"�6=�Z����ܑ�%�������(J\�ޒ\R�c}rs.%�i^
=h�}7�
yu/Į
XI�0�RH��b@ڸ$�d�a�Z�s��������Iȇ�r_����hgI����c����ý��^̇�P��|�oG�Jʇ{���#�p�l��f�����HK!`�ȇ�e�����r>��=$?�G�
'#���Z?r���W�n��{1�|�%L>����aF���{	��쉢
+Ő�uu�CB����$��sf��s8���3�G�Q�ӻH���ݦ�z�s��M��ݙP0�@J�i�!�r�����(`?Ɔu�7�
m
��u3����]
�6P
L���J‘�)rw	�W]P��a���0�cW
	#�/���x�U���pΟ���d�ZO.Q���jQ����f�Zv	:�ӌԑb&!�F\]h�PFj�2R?�������'#�V�y�w�X�@3�AF��
,6��b��70�Ѷ?�
+G�b�d��"z��½{�k�p�����~ �F1)����p�v�O��	z~4��c�d8�p�C�a����n��:���PZ��W����� `?Tx��!�.2��*�t�$A���'w�]��Fo�nz�m�KVV��[1��5�x���L�(ry^ȍ��@���	�1b�ˍO�3��o-9���0�ٞ���r
~���
�}:լ�}J���ق�
�13��
+��ß��W���`���d��R�ߺ(	 u*��æ#T.�-�awV�bv� R�%3�g�MŲ��RV��r9{EvX��v�2�캖 R@ހp�
�{�>��z|孵/�w&�aw�
#M��:���`�B��LbHs>�����ZP.@`�R
���Y�yn�o�D�b�閯
������v��Sy�'����
Kb����IG�K�yi��+
�p�$V�-�]jL
�猨)�I��UQ����Vѯ Y��;�F�.1U�1W߬$ǧ��oo�~%��
{�P�<�t�"�,
�E�
�\<q}�u�~��\P��
S��|O+�0�'�
:��ր�.���yJt�Kb��/��i
�`�Ui�g��2R8��Oۖ�Z�ʻ�l:>���w���r�n�|?��/ �7F�[�t�=��E�y+��E����t�+�G��J�gGA?��oH	��t|v3O�7���r��^�Φ�w�K'�3�V6
_.��{�$g���.����l:�\:�zI�ɦ�˥{��?�M�7��9?�Mǧ	�5��g��"c�~2�NP���l:�|��)�T'|�b/gӉQ����r�{�~4����huy~(�N(�g����P6
_��z�~6
_.
�,���t|3��`"�N
+�?������ɦ�˥{~��R
+���%��3���;�ML0���M�V���� p��״�����)<O����Չ��{V�N*�4|]b��J��sł��W��K�~�']��@�N{�u�ӥ'�,{�S�4 �.1$
�dv~֥��+Q��E&�"
+\�L�zv^)�
�v�;:�
ݽ�����I�3"D~�e�Īe�
ݽ��}3>Yb��g��D���)e,ߎ�zV掯҄@��7��Q{�x����2w�˲�o,o�7��<
[�撐�JS��y��,_��CӉ�*��H')�P<����k��$g���!O2`�d�e��_
+"{��0�PZ�-I�D���a(��X��g��R6:�
��ףӋ����~*���
%��1<	k�����Vr/i�p��ݬ(�3ti)�zo��$�T'��A�$IK���:�׬�ୀ ��|�D
�L�0���X@�Ĝ������
I�Dx3���
��W�xOb"C�vO���)`{{2�gQ7L`�J�J�`x^
��J�Zľ����Ƿ�Q���8�%���-
�J�`t�S\��XUB��a����'����q�
��Ȇ"�^ȯ�F�;��7I��J��oi�+�=�|��
+wTn�����T)�m[�U)O�
�U�N��3��%U�{�Vs��T�p9�39�����[�ۏ%�6��j=w�o�O��|4�@b-���f�sE�yŴ����p��X
���
�Z~;,�'|](�"U$�N\6����d�Ә4��`��'IL<��W+1�KB��Ğ��K@`�f���}pz3���bΟ�+�L֍/ؕ��)5�I&�S�
+��W�����h�ed縲C3^U
��~��c���:y5�5�\��*i�p�r\�Q�^ME��
+ �����ôX�߫�'�* J��X���
���O�>v��;�ƐP�LS��>
����*rt0���Ո~+R�}ف37�.j�	����ݼKD��*wJ+\��]4ctz2��iT�}��eN9�ڱ���[���4ъs}��?
�:
,��6~+t���B�}�I�Ci2yj�<W�4<��y�
+����ùKazA��F�	y�r�mj�ix���� ��'��Ȼ��;���J8t*���>B:b!%��;�1� ��y�Q
+"�w�Κy��kZ͚UȚF=�햂y���#<$�eA9�QQ�%�;]k�I(��9j�u�ۨ��u��O�2�nǪh��V��-+p��;�F�Ë!C��?��j�ṲV�zZ1&0����Nm�Z%���u��Z8��%O�S�
�&
	)J'��hS�Yi��V�$��e����|� ��b{`�����.qs�@�L/]�K����^#����E~a�i1��l,熐�c���1�Pv��>؄T疄�O�ķϭ��eTH�Y�
M�.�W�c-��_�Q#5эK9�}ZQ��YfKKiY��^B˳W��ԕ�����H-�}ϙ���?B��O�%I���y�!��3���)w�Qs�9p
?��71}*n �4ɺu���/5��-\�W�
�8_���D2�
9)~��KiQ|��~%�+��x	e�65	�8�S
y/�
+�<P�<_r*�N��u'��TΧE��@�fp'
����YY7P����b� k	��~�b�ry^�ؓ��W�o�1`3A���������+�=��,@�9��o�!%P�|'
�
�Y��% ��S���,@!;��9��%���\%�9�2����o�Y�R�I��f2�H ��,9
Pj 7�N4
��
wT�E��5���/��Y�O���)�ǵ,�E���p?Y�O�H��7��ݴ��nQ>q/�O���ɢ|�[��;E����(�;��yz7�w��=��g�����P�u�^��ͺ~�U�މS��'��Փߨ��7����Y�O�]&�_�B]?QWF�:;v���
U������~?����hEz&�%"�T�{�~%o]�W�����c�OfU?��
���{3B�ź~B3$

�B]?I+��u��7:�>�~]?�Yi߫��81�������߻QЯ�������D=��	���}���
�w9P�������~�.1@��B�R]?qKM ���~�U�$V2zZ�� ZՏu��v]?�hU?�F<�A����Yi?��@��'�[J���mޗT�O\
���}?�a&V���z|?P�j�~]?��ʹ�ޯ�Ǘ����x�[u��~c�[]����{���Sl(\�OX��V��Um���~�jFU�o��X\�i=����A�����~��/��"�ڋ��{�F�7����L	�~]?���U�8֫T�4�����#���~�Y�p��D]?�,ܗ����b��{��
+'
���+��~O��y���~��9�i�����
D����t�bΓpU?b���~�f;o�u���v"����E���nW����+��U�O�K���tۼ4�P���x���~��2��V]?�X>}읺~�BU�{�Q�V�O<!�
F������v�7���W���|������	��˽�8~[gu��{��$|���q�v�\������b��E�%
����Ȇ��Pe�����"���}r,AGq��(���o)�Q��&ц
�V9PM����F��^K+Gv.�\��p�~_)ɭ�J���x�p^����]j������D�{��D�e,�v�\�=����	��4�2E���x��5�%V�Y�X��Qa��8��
+�,ֻ��� m�aC}zH����t�0jN�H�y:�����{霕���d˹�Tf�b_
:5�|-�X]ڑfVT��ՠjw2�j�}�V�nE531�xQ,�gNý
�c�Iͺ	�+��Sb�aڛQ~Z��Ha�/�>�ӳKu��Gn��K�����]%��o��� ��%�|;x
1�����r_<�ݍ)�Iz�H�몆��HT�T�9��ħ�t��}�7%Ka'���>����j#�	�ۚ�0�>J�{���l��3�|�)�G
+�b��>XR�(7��}H� ��م�4=�sM�#�U�p	��يl��s$�h�
q���T:
��m�:Y��-�8TP� �{�4��S��=�?͔v�4w��Hia
�
���:)=��
vl��R�L&����lHԛ)؛�-T?Dc��ق��v-���a��:��2��(까¾��h#@s���������<���N����,YdABh`�d@� �E�����J{0R��iL���u
�X: A?��A�B�i
��W8/������o8Ao=`�Y�X6P ��q�)�@��^-�q���VoSy��g�f�W�6�nf��~%|n L[����H�7,C at eg�7��j�b�������*o�r�f��8��}d��
+�6��.�m�,�PO*�7�����q'�fV���T�+_�r[6U�c	Xu��21Y=���~'�`�x����?Y��v���0���&f��:�c!w{�o
z�V0k���mj' ����e#�>�*�l�o���u����{�@)�����6ڃ��6 �s�?"�X�['��آn��7��汥/D7n��qk��pK$�� �Yn;7f�4Mw�j�\��%i	k�����mj����2������R�����U7*��0�x�Mۦ
�]X&ip���9)�lbJ�
+q�({���P�T�������%�+H�Q]�JHP”���ԄZZB<��h	�	�ʁj2:�X����vH,-z�
�4e7�	��g�3�3�ґ	�s͑�|��&X�ay��x(<Q€��?m^5/&�#�B�b�-�aĐ܏рp�Ȳf>�,. W�.�}�{�o#E� ~�kZ
�E`WF7�
�@�s�S��:2�K�W�F
N�
�,���b��u�Y[���6aI.�b&�ObI���xƿ� �F
+R��N֬�D���&x_�Z�]����
YQA'�Z�(�W�f
��5�-7>ϱ;h'ێ
��CV
X��?�a�
 9/��)T�V��_���`q����!
,���i$R���sx
�1OK��9�&�9$Y�;LS�Ԏ=NS������V���uƍ$ 
q��
�J�@b���ʲU�i�

+�B
%�)���y���h�@����'�c3����l#w+-Ͱ!x�UrQ%�>�M��X�J���d�D:
�߈�Lu�k�<���m/\hw@�|T��+�����B
3f
+V�k�
wqyƈV	VV'
贡d9{<��k̰���U�����;`��r�ҷ�I��
<�T�2A��.k�]���5Bu'˞C�ޛ
+�[m����u*w"\;�;��+O
4tN��^
����OxG	"0˰2K� �^E#A(v��#���I��qs�mJ����%��\�5E��"��7���
��X�7'H"���΃�����:��iTD���f=})��0����:�����(��) L�a)2� ��l�O�4e#�Z`M�� ��DMti)8
[���R F��EBd��|B�7N�c6Ίd��c����(��o=�3s��I�]�Z�%�
��JH�
��
˄a�@`�-��<�/�'����9���z)Y�ږ�.f �eY:����:U�z9��kO'���%�cn���v�[=�5�v�k��a^�\c[�����==�)�~�
��_"��Ⱦ�YB�pej$6yE\�U�鑘�3g��b٧�8�h\K2߽�+������f�d�b�o#�
}������������&{�����zy,O����I�	�
��5��|
I��>�E�}�{E̚-�g)n�
�l�}X�oo������$3���S����k:D7ҿ�Ƶ�_73��F���H���Ut�z�OV��_7��xa�]\���w����g?~��gW?�s��_�����M���/}��E=3���U隤�_�'���7��<��'w��7ᄌ:�v��w����O�o��oϿ~����g���+���������Y��/�8���ӕ��y7S��.��`f`o�q�,�=��9\�^��˗��?�A���P���C~���}��voІ���tO��Y���yC_/_[�3GyQo��_��
=-�������g_�
���^����Po�/�,i{m7~�Z�c�^w�L��W7�?��Y�;����H;����h�Pʮ�i
��%�
V���ۋc�������q���ke^�f�j�l��,O����*z�>-׋=�����%�4�֮�&]��O�l�4t?��|���3��X}1����j�^�����/����%o�^�&#���ϝ���C}���m�r�;��
�M�M�2��Y��ퟶ�~����+���q��r������9�B��3�T��	^:�n���
��"��,��F
.~�͵�[���
?��Î� ����:uHn\]�5��T+n햊�����+7&�O�x�ڿ~�~'��=�F�?�E�������^�]7�����oܡx��e�~��	m|���߾[�Z���=�FeC�c�S�/o}���M
������"��,�O�yn���{O��=����:c�������W��t��ϟ��*��
|��y�����^y���6�Y�dS%��P��
�?�ϛ�x��O����7�}[E�������{���|���w��9����*�=}}�
+�o׾����+����X�b�6�3�����?_�,O�y��w�|}r�Ϟ��歕W��Y1gjol�5>j�����{}��k�w�d���[���ŭ{/��M�Ys�{�
��r�hR]=��|ϮN������q3{�����ds�tL%���3������"�}�üN�1�W��9��A�
������7'w�^zmr畷�M_c�Si[��LM��[W����l��>??~q���z?�o�x�M5��[�
��Z��/m}���]��[�;oO^�,?�<w��)�%w�|1��l/����^��t��_�_*z�W~���Y�ˬ#����/N�qf�o
�H�-I3Ίb�g��c,o�~��?�f|�m�d���i����$��㟿xQ
��+�Ƌ��h�hwr��?������⫝̸-xqH��K�h���ɝ�~n�6_S�{u�{���Z�ow��7yF=��k��)���&{�~.�Vf/�[	?��?�U�&��v���g�����_֓]E�g?���JV��kEβ#/
�ޞ��OJ�M�a�J�[�bD�:
�^�'�,kPR�;9�L�*�h�ve���������t���g�>��eU��%���Z�j���-o!�ٽώ��=�������e*�'�Օ����ڵ�n�|��V�j��wi��=
��C&�Rm9�!�l=���;f
������������]�Dl��T
�~�鷟U�����7�E��
~��;r�C���W�Ro�;�_<����/
+ߟ�����xC��-��g?�#������^��J������c�u�D�U�	)�g��\�7���vava��� �~M�F��+�C��[+�"�>��IGQMHM��L�
�^����e���ؿꈩʓ?9HN�`��Wn�pN~v���r[r�MM��`S휦[�\�˔�
|,y���ȽM.���#�9���������_��$ySUkW
گ�ZG͖�J
+�[t�f��777o<|�j�7hM<I��ΖޝDo��w��;�#�(Dy���
+ֿe�н�W���V��R�S�y��d?��w{��������3��k����G�����o��1Z_xn�ڝ�[[~���W?z��G����?}���~�-z6�v����߿u�~��Q�uō/n:�ny�����C�e�Kw��y��{��^���7����0[�����{
Wh���
�O���WߏW���N�H�&p�\�_U���/m~�yL������{�Ͽ�;��}!
W�/emr����
�i{>��h�
ze��__5���+ٽ��s�/z��3W^���ǯ>������_y������_�z����k�~�ܫ;���y���Ϟ���o���>��{����r˱��n���)����g�}�DŽd�3j����fz�:�fz�4���Z�b�30��&��V�e��C�WGmM��|����l��w;vk�7L��؁
+	�?�����V�yO���~|�jͭ&2�7������U�ڴynS��2�D
�d�<׏�
Sl��9㫥�z�

Ȑ��W/��߽����z�>��]��_����v�Ը��q]V���������F�K�����w���7�q?~?� 7�ϼ�Γ�O�}i{�ޫ�ˎ�#{�w�|!1���Yz�ڧ��V���ߗ�{��ߡ������u��}6�u�u����M{��cC��w�}����q�\���OJ���SZ��ǖA�?x*��ib�t]���~���g��+
��m����S*S��;�z>�8/��/����7�{������������l����;���Ϝ���e7=��?��������(���}���>ݲ�v�ַ��kדW��o^ϻ�~��G/�
�Z{��W����T~�������zu����_8Sm����‡=�\����ś+�.��}�����*[>}w�s���&o�����[�����w����‹��,���˟�>�w����4�*�ߔ]�z�^�A�,�z��___�N�~��Ѕ [...]
��=ZF�}�~������i
+���,�4ZR�w�N�)�ސ���
�����sʻ}}�n�3�����]��O��Ϟ��S��/w_Ǵ�!��A�,�v�wB�|�@���=��^�Ӄ���o'A�|�[I������L
��c�@��v��.k���ۯ��`��Qt/$ys�垂oj�^����C��k��S^��)><�۰�}
+>�����3��u�f�w�������	���|�Ŭ�|�ѯE��ռr�
���)��5�Ҝ|���cs���G?$O�yﭏ�J
���~?r>����rw��^c��x�k��o�z���'>�5������>��0�W=���EO@���H|<�m�렡L���?�h|�߮
Wf{���
�5���`�>�����:���!/�~�u�C���Yo9C��{��>
��&����L�"^��_�O����
�D��~�+{��9�T:[�����z�l�����
Щ
z�K��u������ׯF��_�Gf����i��c2
���O��N����_~~3^�ÿI�~�i;�<��ݤf�y�cy{�W
�5�W?�<���遼����~{[f�Ҟ���i�z ��hyU��ߏx�sM/k&'��+��
y��}�B�t���������d��.De�&� u���:h�
o���l�tW�_s'�����
W�f�s�z'�y�(V<��w&�e��ɕ)K�{.u.\9�3κʹp�0뜳�r.
j�s�UN���@뜳�r.
j�s�U΅+�Y�u���t
x�s�UN�|���sκʙ�䃬sκʩO�
p�ӳʩF�3?�ǯ݅̅+W�W���ﴑ����_z��w?���?z���?����͝hk�V�}���
��V����Z��
�ѝW�|~�����~��o���㗏�;z����[o>�7z6��\��sѪzI���G�o�����e~NO�������Wz��96�k�
+K�����/xt�ǯ�_���������߷�k�sw~��/��ݗ�~�㷼����ߐz��Vy]����K�'�ڌފ>�t3��~�{
�����Vע�A������_���;:l�~��G�:|��_S!T?�}��µ�����z���/�;���O�ͫ��'�vn\�ٹ~ck��MyQ�՛;�[�7�omG[WoN�oN�#n�l޼ml_�yks�
�y����7�O��gn=ݺq�^ᅫ��y����?ܒ������~񦺎�}���/����Ovn]�����s�3�*'�Y^���C`����l͉�*O'�7���u�� �t
 �4�m�'����'�
4���!�
A��[� �j@��'�A#8��RSܖ5��aT`=����CY� ��o{m2��t��w'
2ڛHG�]8��j:��g��T`�B۝t` H4�C��"l*�I��ES
������Y����N��v��:dw
+�N:6t�*��
��X��b�]9ﹶ+p�I���W��"9
�E�菩�U��u��vt8e���]�u'
 菮�%�$�IFGdM���k/�%n3��Ik�y�����p�C����"�`T٧C�)v�\��*t�1\�nY�����	��\0�t��R�b,��Q8��@P1�
�i��Z�i�.���*|�k?c<m�i�;�0A\Ma�F���(,��ZdW,
�K'
&:"y
�0I�d̖�VuJ{�/e;�K�
t*�/�,�4��f��CZ	����B�	�\$i�Y�
Ͷ|�<>�_����
+������ԞL�-tH��
2�dړK'
):�&J�p�$�͘lss#Qa�•����M�@k<�
��Y.�t�I�W�1�$Y��l���!�C6�C��xKJ78:ۚ�8k8��M�&>
+��=�<�ZP�ϠɂIW�0
tZ��Ү[��J��Hb 
�C"����01��t�	
�-y�d�$H"�M�mb5�Q[k4��Í�z�&&��\�頓��8L�����a�Z�	�C&S
� �Δ�L�M
'Db����BMV�5>H+�]�����f�N�.�/9���T�L�X�0���-�w�A,��pJ9dl����I�
��=
�Lb�����g
+PkJ=��d
K?�~����$�s���(�%�$Uh�o;L"$%
�C"]�i21�,�L��@gM{8���
�~k6c2��,�.NW�w.d�ń&&q��RR
�x'
2�%��{�X$)ۤ���6����!k¡}X��!=됶q��θ2�{`�d
��D�c����h�H1�ט(lR�O��z�x�w&*i�$� L�U2q���6b�TmB$q�>-�,b
�4L쐡uȮ��eW_O:jtpΔx��v�0�
��Fn#���V���~��l6{��RW��VW�G���}�#lB��r��LR
��Lc	��NB���%������6.���
t�/˵�s쐵��OS�,"��	�Lq<�	�p��K�K'
5:���K���qܗP�c�)�����p{�
֕�C<����C]�'WVVW�W�v<cb.����t�%X:	��d�ĻSuٶ��H""�b��
�!4Q�&��ᒙ.E
+7�)k�J\�
+
	�B�I�&���������l!W�t��Dd2`2\��9��,�/��JR�K��˶�)یC�EH¢�C�X�qHG;d�
��Js��Ch�$}��
��U��҄�TI�@�0
�	Il7e62Z��
+�Vk�j��Vʹ�ot��=jQ��}�zd<&S<6�
��xs�{�l	� tJ��'n3A��i&�Cz\�Eb�>[d8t
�H�,�rH�hJ9�Vn���X:
*hN膹��e׀�$e�A���4"��u\�94e��H6�L�|;-����l�Θnhj�K�
T�ru�3S�e�a�8�,��/��Efw� ~G�DI*7K�
+7�
����ݸ^���"P#��@Rf#����p�#���e��懩��Bp@�#�)2Y01��LL'M�\����Q�v�.ϔRPⲍ�$U;DY���C�9�x-�:�,��4$2�E�t[W\�钋%.ܲ[UO:pt0A)�q�@q�f�F��o at 8R6S��Z->_1p3���^�
U
+��Z��l��Gl"4
G�u�Kz��`�)��rP��Y�4�"�l�yWm�!d#&���@,�wHS
R��-Qlb�(0Q�F��PM����9���xKP�A�B�Q�N�
$�

��p�n�
��#�Y$���t9u��e�aD
T���N�����t�Lg�xn�
T�J�c�|�m.ۆܻƪj�m�-E�!���
2��
�_
+L��\��<],�C*E=��

D���^ƭ�'Ja���"Pn ~#�I)�U
}>���q�G>;ߔ�:��qo��K2]b���R����7��Ur�qݖ�Ҙ�D%*ۈI#jq
��A ����
��(��CT�ƥqIUn��@�K�~�8�g�T2u�nN��{G�S�$5Mb�Ea����R��:�?P�Gj䥿�'	�tT?8h�Q�Ǿc0E���O��X2KK�T���]g��Ž�xu�0)�%"��H��"��!1��q���<�r�*�zK撪��t��x���C
�!�<+G%�ӡ:1PRe M���I��~�l��:
�X�3�^��0�B�[�lǮ���\
��K��T��JAP	*Q���i���uZQ�m9Z��mtb�+�EԌG�g��!-vH[
�c�(o�
.����r���ƒS��w��t� h�r<�.*�)
��@P�2��w˃�L��(d�)���hf�����R/ۯ��#�E��P���K+�tAh����@%�\e�4��LIAiH��l�(&�z-�\�� [...]
+P�'���`Iqi��MG-�1ow��@%�de�d�6�}�Pk(Iٶ�����|A��n�2K��i��;��p-b
�	�t)����w�Vǂ%:ٗ8T��]����*��F����X͔��8�����ٍ��L����RPZm]	*0�Y����:w��9�&���
��
T��u[D��2
�^�����r�˶�1�Ӕ)�M���"I;�uH'�	q�g
+��q�n�(�N8��A���/�'vUig21�J\R�N��1M��I=Bϕh�D~j6��klsHK��6؄Mr
�N�n����
E�Q��,�����r�x*IY����DPZ^�	J�Q�ʶ�1���WO�w�"��
��9DY��źr��c�ז�p�Ѕ
�9�K,NjJ
�!͔�"�9�'���]��l*Ӵ��,�&͈L!�)�A@
�f��� i�v�t�(�K���JA�����U�J�;;n3!��
C�
T�6TL
+	I�h�5�
rHC��C��G6�C�=E&*݈KCU�){��Pa�nv�uל��C���m�?��Į��Ѣ���L��4*��Q�t�oA����f��Z�ݨզT���z��W(4�ڪ�(ér��KC�.)&�l�ۓ�V8�}�]{|
��J��k��8�=��x������4�E�J�j��N�J6�9����T���"�_���
��=�0Q�F�h)�
��L����m�~�T�IG���d!wb�D��6-*�+]=M�2p����\��!���mܕHU��ɑ�
ӕ 5*�xA@`
+�ۺ�‹��t4UZ�����x�7�

O�&�d	��J����mqs��
�x0ZQ3��a
����;�m7�)����s����n}ťA7
�����ͽ:�*ٜ��
��\)*%[
d
WՁè?\^v�h�gǙ�]���n�݈ڌҖ�)�Q=H\�vT1�C�R��4�ƹ���MFz��A%ɥ�X[�ZܲhU�m%jݩ�q٦�KT���T���&�IY�I`j��!O�$��Bw��Åۘ
+7��9+Kp4ϒ��w�+ou�MᲨ���~�
�%��:�v�hu�u���D5Q�t�S5��f�Y���
���b������p��C��{�l2J�,�t��3�����*v�CS���R7�
+J����bR'l�������

2�"i��v	5aR\�"��H�Ե�[�w��
�'�4�b����
+�������\�Կ,u�wg��W`��v�9єJ��}q��t3�Wz�Ԣ&^+�b:�cbRLKK�2Y2�s������t��J��'*I��7Ѣu��F17���n3��"ܼkT�E�{Y�:D��a�	m5W
+z��V�,-Q�FKK�\��d�f=M%p	�K���X.�-S˜V��c�
���(�u�I�7n��j��\����&�*���Q4��&���b�L�X�T
��7�R0tV��+��JPY�R���-n�*Q�ny���pu�5�lk�P��ݻ�-RK,b
b�	!�U%,
�*ܖ��	�T�ͳ*qϼ"
<Z�]c��-+.
U(P�*�u�qd8!u��p�ru&����jl;v��NY��F�%��u�oN��h�kP��T�RT���o|2G�^w�fBD��)����65�.��"ɥ?�C�q��C�t#.)��;�~7VX�6wo�B]nީ�&KrfI�@%hne�$S��"��
x�r+����9��I-�7i9���.]�R^�ďY4?�~�lG����T-HM�x�
.Q)8�#W�AA��
+l
T��_�L/����
���ej&Da�U&	:�^@e[��I쐚q����,�N␚�nM�.��T��n�x�
�/��ګ�R�8T��Qi*�J�X��T��w�KaoS�N�D�k*��x1��L\��mR,.V0q1(����!u(F��K��uiP���%msP	:~��$;���jDg̓��M�WP
���4Qj��M����q�x�!�Un
�.,��-�f��HO��F��NE����9��_���;�"�^D
�ԝ��
Ձ��
u���vM��&fS�2�ŋ����ŋ�.�i��mWo�m*	Kj���+
��Q�l�+K�95Y�xsx��\P	:f*�#��.�m�S���n�f �{�K`��
��Z�Z%��avȥ�!5rH�֦�BSc)�p
�L�xe�[x���
5�������V����	�J7�*P�w�H���e �ԫը7��.WM��<5]I�B�m�lV��u�B�]�{xA�
�K��2msP	:f�T����CZxM�^�%[@̈́��%4�Ztm/Z�Tgs���E.�j
U�5�tl�i���A@�[�v�.
x
m߈��JP	�[�T�O7���^D𺁚*El�@��N���T��w
�2��TiwQ�<х����A<�b4�5:Q[k3�Ԅ�6;��h�d)
u������:���,�v��0��^8�-��Mq��]J-vH�^#�\�@�\��"�!uvH�
b��Q�%*��d�N�E�NH9T��S	��冺�7�
�X��~'�:PAI:x�j��얘m���A�L̥Ƣ�*�v������{{.����m.�������x|��	C�&PO͒Ե9����n�P����{ר7k��"I�6�E
�\��.V��@QX
+���pk�p�^{e�Ў�:���J�|J��KM��B%�[��'�‡t��*PY���S
H{��TҪ�F��^4*4ߢ�F�gQ�`��괶ĥ`��j���� ����s�lw ��cVB%^V�n�d��ǵ
D�ag/u�X�m�
u��m��.�k�9�wK�M��!��I�[�N-u�<Y�����:��;@��&��
���?z�D��v�����b�K��U�t�����E�	~(m��$\�/j,5��xi���Wچ��
�sͶ����
+���4�*�����M�
�Q�u[���ك��6j�S5H��8�E�M�
��Yh�Ug,��-���èu�����pl�*As,C%�]�_t���ҧƬRoYY.
d-'e`�Zӆ[�|qA��^��r�E]�
�4��c�V�(,��s���r��`�=o���mn���t�3,���
�tnnn�XxKtRi��=�m�m��EW�}'g��eaV�,\4`��Ej�v�;�
+�NЗ�RأS}||B��CZ�qz�T��PET��Rz�
�pԝ�5�����e}�/q��v�״�e]�0��>QH�%e:U
+�6�O��s�&k�sr/<P	*Oy*ѝY���j^c��ZݐON({(]6�b�E.�d���"�!����촹��m����N�׸���T��\�J�-Ͳ5�Bj�)�u�r�6��qJ�o)�;w.c9��s�i�q1X�/��R��N&KA�gؕ��s��r�Ig��
�\*��tG�x�<^�Q��
��*�h[x���
j¤�b�X���tT�
+��.��T�u��УvBoe
��t�����+�ͩ�T�{�qoQ!t�n�pt2��P��6i�D��K2O�[\�+��ӂ�:6]�V�\mԪ��*y��<���H<Ǖ -,�"T�JR�Jj�D��B��I����9
3�S�H�F�U�n��0ia��b��2�>7?q�Ӡ�R��f��
�Kr�O�ܓ���
+*As��J�ݝVK�zY��R�c.���D������qb����s%W�vK��q^m���d�͞�rp(iu%�I���|GP	:~��T�O=n�_�x-�e���	�9G]�R���u��LگEҕ7�j���[��d��&L�
O�
o�7� P	�S��
X*q{���ֻ1
�P\Pe����S�:Yn�J��ro�.se�_��}A��w`�Te�ч�4�A�<�y�Ѡ;�э��T2�w��ΰ4�
d�D�Ӽ����J���=5����E�R��t���x	�j��!m��J�"�0
��
�(D���>�KU裟*U��Q?

i���ɨ���r�}���멧��XN}�s�z����mW�Su`��=ǧi�}�
U�m�4
E�T��Q�J����z��Dܾ�-]�5���*3%F������C
+,r.K'�K�P�=
+KUU�I���bQ7��.���MxzC9��͡
*�X*�t{��
�Uؤ�]SQ��l��\(-$��Y-+�^B%�����"y���`+�)�u�s���O��O�J��+C%Zy
�
�JO�	���	��D'�&5�k�K)��?WP��-�n�C.��Rm�i�	� ir�M��Fmg�*�ͫ\*%�	:��E<W�>AH���ZKYnѵ�v��� ,��SB���E�>:�i�)4u���A�a�+A��%P	*QET�tG.��a����&��t�a��J��H3[Ēi��x
�p�)��̀
+A�7�&7-����Zܖm�P	�g1�v
*�C����=
+:�����Z�Ζ���Ă8�SZ/�E�#����%ݡ�̞�cKAG{��
{���DHTj�;��J�1�Pi7�D7
o����MPHP`��@
+
:w�PS���L�pI�t�?5�E���K
"mn�����Nh�¦���3K��:/��CvA%h.�������0�
�t��	T!��4dg��<U2kJ�
+d3[�WZ�ےj�nQ\�

}��z�:M���p并��O�ƠT�rT��
���J#���NK�@�n��OCO��n��������
1�J
rA
�
+�F�Z�e%ZX�:�q��x
i�P�*A�-��d�P�9���
���<+�
*ktS֪�܅s
ܛ�N{j���H1���ɒ�
���Nm��ݧJ��M�<ZM�	�
�*M�~ �R�+��Q��������U�U�
S�]b�,�KZ	O�h����
�.$�%:�GTjH�[/��:C��1ݟUSi*As�
�h)�?Ƣ�[
�QGD%S��T������.S��?���U�.�]ZZ�^U<�f��%庑�'�ǚ�JPY*�R����v����(�E��^���[�h,b�w���u�v�"��P�D���N4�
{�J��4�2Tk*�Rn��Dvk�=A��nI!(T��PIw�L����J&LN�BSI{�Yop%����T�q at T*�A%�9T*����'�ǭ�Ԡ����h궋���ls؟E��:��$�[]7�[�ˢ�	{��
�"�dOT�gY�J�
�R�����D)⍯m�����mS.2�.$�s;�[�;�<�t��z����%�J�I���R�+A�O4ہ�RT�ʐK���R at T��W>f.+�
E�M`�h�$+E��H�!�Cj�ɭ��ku����4�m��JP	�[%T�4�ږJ
�r�S��
�h�BP�:��=�&f�\�Eqn��*y��;4� U at T���'�#C�T�JQ�J��҈��UT�w+h7i?�����	��ѢR�{7�E�CΟ��
��u�����v��
+K���q���
܃�4�*�5��ݎ�RKnN�CT��ĥˋ��;��T�c9�;ݢྐྵ����B%�xCY=l&�	�h�RT��Q�J;�J��^ym�B����=nUX�
xr�O�t0�إ�
�~ir3�:
�G{��GD�5C�
P	�c9T�X*D�V��D�}�R���/_L��:�����V�z��?��/��R� ׂܟ��eC�	���
�&�J!S)
���'
+L%�&(*i�,�9�E�C�"��MK�uچW��6�A�T
+A%�LȥR�R)b*��J�2�M�j��:T2
�}Y��I��)s~�Vs/�JPo
os%H��k*Ae�K%ޥ*����a�F���/�^K�dM����;�|�J���[��U�,��s�-�Z�4�JQ�n��
�h)�Z�B%ނG�����
w��<����g�q�˹��[0�`�ަ���Ԕ�tͅJ�1���,���
��.Q�N\�
w-E%��ה�g�?��{�/^��D�fC�Iё�4�Ơ4�JS��P��Tj�Bn�m�$퉅���
�=��I�.��r�wY*����b��c(*Q-�p�T��9Si*A�)O�����R����I)*�O����k��s��J�t���^��ޔ#}D�^�R�
4��9U�JQB%����RQT����{��J�c�+���R˹��.������qB�>���*�*E�J�:
V��J|���	�e;�Sy*��"ɖ v�B�J�@�%T� ��yW�Jt�P��*����z�J��*�\��!���9�4�	:�Tg*鮹P)��2UD�0��R%*$z���m璃>8�����P�rU��ӯkh*�:	�BP	�{�4r�D��D [...]
+�Zi*�A%�|�����T��aY����qg��_�S�r��MP	:#�R��LS�pQ�t�T��3T�;}e����T��Q)����R���4��a�#��4�Tj�A%��h
+��
���^�J%�^�J�k*Aek:��^��ҥ㤒z�<��^ *AgHS�D����҅C����J��Q�
*A'�=���UH�
GO�
�,���
��-�E�F�S�P���yK����J�.d���k*A'�Y�Dw?IS�:�h�t�
�R�F70����٨$��*���_��J=��{T�NZ�R�������RI9$C�:��M�N�z�Jշ�;,����\�t�/*�a��J�EG%吿�5��%�
+
*AgW�����
b��R���?
�r����_*���ӦP���4�e��%���eP	:�:���ݬ���G�[�v�t�u$TJ���A�CRQX��?���JS*A�c�Ҭ��?�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�y*AP�� �+P	�J�A^�JT�@%�
+T���*A�W��.P	��� �t�J��A�
T� �@%*]�T����I�2�@��9�cͭ��T��%�G���'Ч4��r��T����S�?
+��i,��:d�OU��U�Q�4��ͥ*g�J��l6��6Ч#����pT:+�ͧ*g�JGm.��P�擏���?����As��٤�q�˨�:�*#�'w��
*
�%:��΂*g�J�pȓB�c3h?AJ��AJ�{I��/��S�Cy`۔0r�
�r��4��
̤Y�vBCwr�!&�
+���^F��[9�T�u(�~���9U��PiOkM�Yx��`1���ƛ�v���q?���tF�t�L&l
�*g�J{�k��85Y��
�c�
c��a�z��O��1F^���H�=��0#���;����U����Twy�5�.�Ϧ{���4uT39l_����	�Utƨ4�X�w(���Ǵ
t U�J^{y+�q��NsL�r��(�y�@O����	̥t��4e0��̔���f��;��V�3I�'9sy\U�>��M���'=�G(�X:@*�a{zjܧf7�:��r:3T��23
��wZ
�=�c�:��pt:�`
4������
E�^Yk�

(����2
{r��q���<��)l�8O���((7��w{6������<�PN
�������n�q=f��V�@�.�9��.��E��8��GI�,�#�S'��j�sQ��j���O*��w|���h�e~(���F��Q��ˌ�w�h즍h�:�wsX��`T�Jz�������\o9�a/M���-��M'ӱ^R�(��e�T�â��r4[�
k�Rf��]�;�<��`0S8JFa˘���
_�m|�wc�̓б����G�2TjT��+q�q�c,73�l�!�Ֆ�4�$���M0��?���\qXQ�
T *7�9q�OMpT�0�T�6����
e�c�q����M�\���<I
�:�Ny0*sF��Z�S��H���G�����^��flVq�TL�
��g�|Uu�
sŤ�ִ@W
M
{a��ȗP�s�A*
�e��sm��)3x3���\��s�
쿯�A�u���:�h��I�x�sD��bB%ua�S:�J�˺�z��U��e3fb3�#S
K,v���)�
���t6�y�=�JAr�
/��	��d���2)�ԋl�3�6��=�]1I���4[n>��sX��A5�5�
���(�ai�R��:篌���
SE��F��"�l�f�d�+�
�����J����Tޓ��N�(
�l�)�y�#��Tv۫&8�~���|Riw�������R�e�C�(�a��7sAw
����Y�I�S~���ϡUv0�ʼP)
+
*�di7�֓񗲗$�-�+I��D���%ɗ�i�˴Ǵ����t��=T<^reWվ
6�:�"O�ݸ.�
0���I%
+J�f-Y��ʼc2��
�3z��tG9t�kZiZ��W6�~�����5/Ѩ���s�J�
+����ot>J�K'K��5�qVb�����~1�M�,1Y�L9���
r��_mIDj�(�
�8�ݞ�\��&���VXP�
�����1��Q�˶݂udzRq��V�2��P9��6��K���5�P�y#�
�
�>5%!?9�
�(TF4��8�Wz��$�*)��v�?x�
]��,�
�\ �����H#V3/��Ⱥ�҉]fL���u����0��b$��d~$av�\
�(�lܓ$���ƽ:sr;"0���&����
�
�"�2�"ˌ�)��6R�
��tGc
_x�����x/푕��i�o�(t�ȳi�hTN?���Ja�M7�ٽ����\�T�'D2���Ʋ�q�M��hb3�d&A2��0�_�SU��+�\��J�5�氾�#����@�:x/%�Z6�M�ߜ얪	�ɤ)[$U�Q��xw��dn�R)5��"��2m�2�3�ֻ�k2�	�ڦ LGĥ����ts�1KjN��'�}3G���L�JGc�`TN;�aB%>��L�R�aIE��'H�؊O�K���%�Ҷ�Ը�*Z��P��V�YR��3�[��U���K��ϋ��\Um�j�:�q�{:�&�A�Rq'P�
��]>��Ʀ�����"�w|�J�h���;MJ#)C$�2mw(빡,�MO��
� m�aaA7�wY
�*�
Y��X�Τc7?9�{9
c4<>T4*��J͖�Ұ��6'�Q2�Q��
+	�/A�������%IRl��P�
��WM�d����e�d�c���k�T�%�U�K�5�*��:����8��8g/�|�u��鍳�Sl&�|�L�����(p�4���m�Hr��L�P��
_�_����7���-�a�¸fZ��Xd3�
cT�#�g�d<��|P�
D'
�,��?�{���JuK�ƀ��7'7�%5]�h����4��]d.U�iiSE�iFd6���f�6��$}Y�Hi�2y�t��T8>S=��D44Q
�
f��
�o~A{6�&��`�.Ux�T|%�'H�B�e�Jt���n�]0�!��2k=�~ˤ�/J�.��;��n�mWIݛXD�]�&���n:N�b�
�P�ݏJ��{sD'�L��hd_�i�R]��P)VTZ
��66o�K�Z*A��C�c/c.m-6�I��F�X�FäK��L����i����t�K�0�]��*zE{!)WU;Eu���t�I���J�݆=��Mg7OM`c���&L������R�w��L�����"��Y���ʩ���m��d�J)�f���
��)��M2�'����D�h<�4t��i
.�ݢhz2�O=�ݾ�R
�ƣv��9�
+�Z�����$I�d{q�4@"s����L��7;J�/�%a��>�)Ki�i�����������WYe����unI�iUu���@X�umc�Jv�/ٸH	�N܋j�Tr�i�	ӌn>�Du��RK��HV�3�$=�z8y4�>�4�e��e:�
ۘ"�
_j�M3t�)�>��j�.�]��u:u��X��K��d�d\ٻ)yd��G@�F�c�
ƌ��1�G���0*��J�6SiYQi-n��y2�
Y����/]�\����<bk��$3r硗UgLS���el2�%�rgG�`�_�����.S�\���8K}�6�i웖Oh	nqu��	{,aod�[>�%��;`ʛ����)T��J]�M`*�۟���N�3�$I<�z4����Hz<����nj�m�����t3v�sq]ڻ;������eM�s�'����B�x0[4��hd��d�5�n*u�JQw9��b��f$�q}��l�H��^�M�]l.ɛ�,6�
+�x&{~&��K�=ɖ�4��f�2��d];,�
�ƖK�sWYWiָ�4)�
���U�PG9�}�"h���[�t�uܓ���^PX2��A���I
qʩ�������q�6�ޗ%�t��BR��s,�u,�w-g����)��3�i�mӛ��;X��{mK�K{'}ξ��J3ʴ�mF
'G�v�|+�����:�"��a�d���ˈYH�/��QI٭j��	{�J�(��Vi���o�|��Ms\�� ��Eɒ�R� I�K�$9�9���]�u�v�VҥN��g�21�B�$Hʏ�r'�Q�7
Knd�y�c�T�r�$�n����_XU�TUK��)�K�c�Y��T�I�
w�q:�Iv���AR�)�F!�9a��j*�C,���c�I��yR3�\d�Z�Eq=�(m�Nz(��P�l30�	S�gF�imc�T\�u�g
����f��¹;��+|s�ܘq����t�B2��v�9�l,z=q�N���N�����f6
��Ҿqu_�R�P��TR�
���a�[k��U�Wo�{����E��<e��@R�boI�dS�z�m����I}K�%Y�|�lf�$
�ɕ;O�L�Sf�t��T��
�I���0WU;Q��b'�5u��@�0�t���밧��/�	���j������'���C%��}�\��'���L���3H��4��5�i�X*���P��Pf,��M�چ�dG��ĶIt��й
p?�f��=Y89� 	�s�3u^�1)Y=�0�Nv�Tt
��
b���ir
Ѩ�ۑh�t2��hTN�.:T�5�J�;���aw%�{QS���;���_���dI\�i"��(Q����#�)�T=�Ɠ���oꛜ-�i�3v�HByL�GU��$��R�g��u�q_��+�\��	}���FO���3�$�5�&��@��:?Q��ž�{7Ut����ԓ>j!�*e���$�;�TR�T
+�J����c9:��g'hD'�iUq4�f8l��k��ƒi$�i�-�L�
�����mN�&k�a���tu;a��K��[O�$
�
�)o$���w��*��R�}Hr'�P���ٝ��2����MOr�p{���(

�qa4f�t�R��PTR��
D�h؏�˱�,
��h�߱��	�"I�%ۋ�H$e!�;�-�����L�j��8M�D.#�1�$A�-���DI'O2��%��u�hʴ���
FEU5簎 �氞�sSs�ƙ�[����L�t�)�&�)6��Trs�ng��l�r���ަl<��:�TRq�������s��D�h���=z��J�^����K[�G8�C�L�6���Ii!�G�&C�\A����t�+����6�;��I�DJ����U�v3��}ɢ�=�t2NRq���;&�>��XG��F��pnv1q�;ΰfݘ��SD��Y*u��~�
�KQ��di-����
�
�IT���/����&'IvgG�
�Bu���eW�J�L}��"hb2ɜ�a�$�rN��
�tBӥ��ȵ�
�
�j]���
֔y��a��d����[O���{���7�{�&p���L��BE�STx�L�1T��G��UF|N����w�J���$]ŹH�Ѥ�"��QcI��e��b�$�Ƕ!6�
������n�.��
L3r���NO
���$l8�kcM���ˉ|7W
+���Ϩ�UO�>Mǩ8�REk.K���E#9��hC��
�f0�a��c���`TN1��]�R8
�ΰ;��
+K�q,u��hd��Yi"%@���Y�*u���O�^���@��x�9ҠɒI
f
���pi|�T4��I��
�LU��A
�yh��$�6�
h��ӗ�|͍�;�]�H&����^NU�.lEZ?���R*5*5{D�`y<�
+Ǜ|�\���
+U<���e��e�etAѨh(�`:�W<|��3hR�&���tu)��w�p�{��4l�����!����m�����[+
�;,9�X�t
���2a�G��t)�.��}jި&J
�&��b�ᣡA�tR����H�K�ų%��O+��L)��*
��qwy%
��wm�������(�$k/��|B�b_qj��Qq�G��i�)8ѳ��	�,�i0�
{��l7���;�k�Ӽ�lqؙ�� }�f�HH�#�ƾ�`�T�g�+���%��sQ�	�EAj���Q��d�Ttyz"wZ��4T�3�":;���91R�:6
��#��$���q$��e���Y&m��&�lJ�&�t��

�)硧\��9dj at W7eaY)�
��Y�cUxG2�keo�%�X%���F�%��f��_[*��ORP����������шL4��6m*�iCi�y����;��+?uTR��NTR~W/�cD�v4�-��C=�2��f8a�|������2�j�ϕ:�2>��ܹRK|F.�
�h23�р�v��^z
�=�u\צ�II
U<k�$erIx�`߶GM�S�u^&�N�ö��Z��� ��lv3}ԍ)"g㒱��R=������tv�N���)������$�;��d�d�3]� [...]
�<��nU�&��
��
Դ�*�e�\+�K��)�I�\�N&�<��2����}�Ѡb����F�`�X�DΩw´Pz�ܘGA���̖�d�Q9}TZ��R�$��Z���	��A�e,�;�}N����"I�Ք�]�dx$I�c�|[����l9��i����XL
�I��咞�g��α_��+t������
��b"�s����$��}�e���=	���aSQr�dʀIW�Ee�>v���N5�����u��|�O�'7�?Cs���4I
I_Aϑz�������
e�m��fm�7��*���9�tܕ�Ծ��$P�K\�Uܼ�L�����ʲI�N�*�.���S�J�+������Tl3�X>}�`�$�d��g4���l0L4��5�0� �sǂ�%��O�._����TT
+����Qoiy�ҋ’z��ui
�v�]j>�$�dMM$m.e-1�X�V�RfII��8g����N)4q~$�1�T�N�љ0��6#J�.���$w�!J�=$K�֨4�N��8׳q�:Uʆ=wxi����N��7�
s
|3sI�rڨ$*5�Jrvb
�M��9
��'�֫�$
Ѥ�@�i�
+�"�
���ʎ�LzY��F���g�ߙ�N�)��Х;�.���:�EW�$����@ga��)s
+N݊L�XI���JZ�Ў�3g�eJQ&�%����R
���B� ���ѐ`
MD&��<����yj��T��F6[�~�vGM�K���U*qL[I�4`$Q��~�2�q��z�#�,v�uSQ����hl3Α�c�U���h�D�Q�K��u�d�=�K�ya:nuzw���
$�nUm;�n�0�8;�������
{�Y��1�-��ں��)S�L͘�&�ț�K� �**]r�T*�:��D��?�9f?
��f�I2�]��I��@3^��`�eZz(�ZƸF
E?`]�N��-+���k���1N�K�N�^\J�a�ޥ��pr#���R�7��~�l� �j���Ĩ7ZZ�� �d̵��%=]�`��gK��?q�i(���J��T4���l�h&�h�h,-���n4\,�yH,��Q9T�����\CQ�EG[�>�3|�����bdEv!v�JL�$�_��e۴"�G5m-c+J���š�$e6���9h2ɔ���DR��	S��
*{iwI�N#��t�.KǬ�2I��'E�����,Ia���
rX݉s#���z�������EA���	��~�Y�L�:��09��
+n�Q�LO9��QGM��V��'�@���zYNZ�{����*�gI�W�bN�8�2�3
�P���&?|Y���ق�-`J
+�t|
+���%��
��߲4�ˆ�Tԅ)Z��k��pK�s�&�!K*�\r'���5���>o���Y�즠$L
+��ٻL�#<S�r4��
s�L
-�v#�+��J��C��M�R�-Ms�$5S
+�ђ�I#}.I�J=2�nF��(Y6u��D�08_��t�ν��Rb71��I���X��#;��#��r#��Jv�R���V*ӽu
e���3)YNʯ=�=�
�p��NIrX���w��]�7wOr��@�̖��Ɠzv��>�$9�T
+��ɉ�U:�G-�-�1nK����TZwl�uS���
+I��Lcơ�
_f��]StM���^V]Qd�4C��I��in`��SŤu�’�U��ދ�oF��sm���1����*\Z�L�ÒY�r�/J O<P�h�i��s���;��+&**}
&�
�z=�%�SD��*��%NTj����Fj��.Ү
8��qY�ׇ,��I�&Mɕ��	��[�X�
ו���Y���4��d�M؛�a�>�F�0Qf�Ę�R��w�X��>Ť��w'L������-��
��Lǹ��r����Lg�Lrk4uQ��
����u
+gC�;c��KnO�STR&����[��"]�C"m:�B�2xD�\�Qc��S�d���T�T�)���k���%�
;�i������sfW��of�0]�jjca�I¼ߣ3��E4��s� {�̗hv@�"jT
�$��b�� �X�xKv5�M�G���
`�wn4�QڍF�
ZK�1�+A*
��p��kN�
�W�\�i��FQ����<��	�ԅ*��C�\�=U
2{՛�;��
J:wT�9H�ۋܥ�%�JL��Z��5S����ʹ��c
��ʏ�H��Ep�G
	���^������t�(�ȔUӛ
���L���nz
*�T����0��2q.�0I���W=5A=[v���IyA6���Gu�[Pȥ���Н>*�K�*��A<�����p=�3"����ܙ/��hD�sg�D}Zz�"���)�42Cِ�4}�g�S×���+�f�lAg:
z�$�뜍�;�Υ�Nú{��;��)��2�Q&
+)�&w��sz�N('��������b�Ґ�KY,��VG�y_
+0�6[�](c�F��F�����15oT�)
����%jj
+���7񢤣�$�F�P���Si��F[�U)���
¨C�d�$3�ш��2��E�5�I�uI�
�,�D��%������2ْ��mfMF
c���X�)��I9K�F�0��(\j��\7X��=]:�
�5j�yg��9L��� Hj����~+��E�Z#�<�r�����V��Z<e�
��K�)
+�ϧpi�U{��D�}��
+R�9��u7�!խ;ei,�@J7���N�2Uc��\�e�����[�۴y�]�)��;�+�����`Nj�wn�(-��I*$K��U
+6w�0����=����}���&��*S.q&^�[�h~�{�G�!_
+Hw3
�%������h�{E��FùI�@ȴ��pIM��Ҍ%���0�Iv
O�J�2T���!�'z��;
(���m��yUR/up��f��D�R�ʴ�,��\
���Vm�!��n�Z�N�:��H��8��#O�4��f�U�G�úĥ�p��H���qt�<>M-(e����C���u����尢8��:�_u�^K��$�'���Ҕɀ�'`2}�N���.���K�K����RI1I�
-mw�P���}���RUe���*N
I4Ir��X&Y�2��K_C�tU�6-_Ag�c;���NCAI�6gQi7��^�NSu��,�<Xb$�e�
�A(
*}#�n�?U�>9%󵮾�=w���MP.V�x�\ҙ��Vz�D/{g�`{�Ѱ�0�������hD�Q>�L�h$�l4��\��6�m⒁t�����1?���J�2n�xkxK�s�s�8T�
D\���^�D�fL���,��6�d)�"
�?jg%F�\���C��e:Ej����a
&ʊ\��
+�#��#.u��E߆�����
+*���
S>�Mmr�L�p�d�

endstream
endobj
319 0 obj
<</Length 65536>>stream
+%AI12_CompressedDatax���r%�u&����p�4��L �R�1ܼ�=GR+Ԓ�>������U,�X��O�o�
6/]%
+\��jr�XX�[����~�ͫ�7w��~5��]�wwv}�pw���|�����㇇{~�_�tg¾�I�_�o󉿻��ps��g;�fo��%���?����������������������_�������q�����{b�q;�37�~�
�p��OW>���
�8����won�}��w|�{�Ɲ��o�O7�����~7X��a������m?���W��
C�S?Z���߽�����ï��^_�pvw{w��g�����~q�=��������ݟw�[�eu��ݻ�z�����ՇW���7��������O�7���G�_^_��~���N���^��^c��^=���9���oon������_c������o?�yw�Ώ÷_��'�\?<`��\N��/���Y��S����믯��2�R���;�߽{u�G^.�:�~��f [...]
Ï�4���{s}������������,��~su���h�����X��%�������~��7w��w|G�s1p��������!bV���f�7ݙ��]��V�WX��o��y��W�q�̔H��o�,�.�dX:�1f��d��~��!��`���|�� ���p�.O	���+�����c�x����-��� h�
��������|��?�������x�p�����M����W���'�on���͇��{|}r�������������'�|���>���֝�v��*�r%w;�z}sj�����O��s��Wr�����rewr�.�^]z=_z�n�ιY�s3��Nnߝܥs�ҹw�s��s�ҫ|L�~L�~\N�N>�羹������7x���ט����
Ň�פ�����~8yu�x��\���ݛ��b��]�noN^߽�������7�d'�
�����=���������`~���C���y�q9�����w'o?�w�����7�]�V7���۫�?��r�>�O� [...]
W
+0�duuZ��W��I�"r��k�iK�
ݝ�����?������}9�Ǔ�W���ͅ�f�?���H�E
�
+��x���X�g�o7¿��z���d{r	��Ӎ�
�mw���x���_?�-����x��''���x�5����r8�"]��ǫ[�1�ܼ���������	��@�Xu�љh���
n�n��|��	��V0�����7_�?��䴸}�N�~{��ծ3�?;�nޙ)�\�����b�'�׷�xָ����������;�P�|�M��7?�����'�����4��b�J�
�~�����ۏ����>����ww�O��������?��?�a����[`��	��t~y�����y������y�|M�9��o�gW��"�n^�
��~~���<���z���Y����߼�El���������_��‐���7�����"�
8
+`׻���|�3h��=A̟���䜅������ٛli�w;�G����W�����x�i?������
�|w�GNڛ�Eu|�����W/�>��M�����<�υJ~�N�=�5���|x����_Q<����� ҷO����;�c�*�Ӌw���{�ڌ�g������}��?ں�`Xn�����;r� 
�`W}����z�=wo�����W�e���o�zJ�Dz��Qe�����������ϕ��o���O���~vw F���?���?tP{�Ggv���>}Љ�I�qH
+���b���4hz�>u����N��w����u��y2ʘ�����
+�ﳥC�>��|.��1��n����������pq�<��̙=�ܙ?��Y<��N�����.�.��ssnχsw����p
ϧ������������Ea.���]�
1^��(����?��G����
��c��G��Sm�W]�q�!�8��x�g�<^�˩��d'7�i��D���t�Φ��b�<�Oͩ=
Nݩ?
O�i<�NOO�g�������?��=
w���0
N�4��E����5>\�I5���
�
[�G��!�p:
���|�.�h�Y78�]p�M��
����]b���y�G|�?��a_�˱�F3�q���q
c
��t<�g����2����c!�)��C8��_���Gm
��������q��
��)�	G�p��
��1�8
�����9��f��v�8�.N/@N 8춀=7b�y�?w1`+ZlH�m��آ���nƦ=`����y����?�yG��?�
_H~���22+l�|3���
۰?��1����1�`���2G�%b��Ss0`�朳m.y�g�g��,(̂�,Hł
,�������ւ�ZY.�w&g#��`�O����qu��ǎ<�̸υ.ȼ{�0p
Nx��"eE��S9Hz$A^���˾�9dr89�
�
!Q�)��q���N6	���q�<��YS8�Bo!>��� � ��O�Л(@GP:i���b܇ѭn����}-O�&�<
l}�8�����sz�s?�Tkg+��c㾇�Z����x�d��m\���/AI�||O8z��C��~w�=p,�i��wx�P����3e��ʹ���
�}��a2,3��2��i���uwt_���
�>s��ǯh��
~줗,�o߽�z
=�����`b:\����<F9|>�
�
��΄{|ʑ�����*��t
�U�A<&9b>�
�
^��A��T<�t��t�'��s9�򑞑~&9b>�
�
^'ǐ��T8;�
��Gar���I�.� �<���g�r�|�
��8%����\�?�+O�
 Y
������� �#@�뷀#=����Y8t���]<0� eB>}|s��<��#p��� e,�^n~�t�Y>`� N# ��CIg|�|u��?ފ�]#����q=D����x-BZ��f�B�A*C��2
�r��
��
�t�L5������=�j�B G��B�AdZ��x	b���
A�1C�㽀!�����y	�8�ah}A�
O�fa{t���<��q�<2�w�|�5���q�:����r��UOA�!ѬI����:	�d/��x�?I���do�D��
ɨAqXˤ�{�F:Mq�6.��Yg
;
��p�!�>l����'�f��:;�{�!$8����4�>��}�sv�Q�i�i�G�
t�Z��y�&���7b at P�����cl
`0
�Y
�q
갍#�tf�ip�D�աw�j�t�z{
�ޱվ��-6���,���U��i�ל����>��})�(�(��@:�F�D�����
+
�Y@]���L�:B'���*	+��$���J/�Ņ�$�"�)�(���Kb�vBM��&Y��	r�L�TKr��Md�ě8��$��g�v�t�uI�Q�%�G�'RO�^�|�~��,�hq^�;��Nȶq����� �)�� �%e�e�
+a�YFRJ&9	I�ea��*[g��B�E�E&�B��Li����.�BZr�W�T$+�A�Q
>�$�#.�
�LQLT��
a�
+"�
�� �`Fb�^�!Q�A``��������ŝ���3�S&�g �Nh�3"�N��3"�N��3"�NŒ���>�a��
?����w/���k��n#F�応���q>g�q�A�]����K��{��ݕ�]̰��ݨX����0�e�i��g�l��
[��v�d�>&p3�|�̝7�z��
+����1[$�X%�1e��X(�q�-���Z)Ks�%�%���ɹ�ve
/wfԾ�n��8���X���}�X�V�#v��H��V��,z�=G�;��u�2��D�Bw�Zɱ�}n��'^�c4�$6�%��A�8.�
�~�����\-�%留n�� ���=����4��!��~G����D���s��ü�O�h\S�q�+�M�_p�[�|�S��ޥl6�
�x���_�>���
�b�O&� N���ʎ��Օ�]���J
����W�{���{:��c��%ة@�3q 
_vt�	���J�+6
+����t�Cv�}���+�^G�:t�p�:��>Ņčŕ6�;�T\j���ٻy1���9j
I隋�g�	�;~m�ٚa���ْҭ�'E%Uq�8�0٢��&3�Y�O/\]s����9�E�]��,
o-��?��p��/G�
[�#�#6��ut�O
ڄ����)w��x
�s�6j����x�6�5�ǎ��putO���Q
�sO��~.��I?�J�_��kXZ�

��y��!I�3�|4z鰎_����/�ϛ��s�T͋`^�r�/�<�D 
>yy�I�>yz9�F|Ξ}.�x�����
�}�b��4���
�k2��������t�O�a<��,���,�^��(�"��S�����<M���V��5i�	���~�J
��Y�
��0� k�u�.���=�s.��ǥp�^��N\�ɽ�%yaK���rc1������
�j
����P����V��(�GX�:Hj��(�g3�zPg[ŧ[���[_�];ا���ҩ9Þf�*~��h�����~�l��xK�D�o/q2�
��W���_#�`�(5���D	E*�|;�7�{[��/�&=��k�r
�����MH�K.�4]|l��#���J� ��x
+2�0
�r ��;�D�AltF*;��.���
+%U
HQ�'R�'%u�7 at EX/R�ԓ��r�ʔ�I"'y\�q����E/E5,
+�lb���
�
+<�3���
$��\�j.3X2}��	f��C����
+z:�w�\0ԅ�z�7
N85�pl/��G�]EAXS�)�G�OS���,�RX_?� �8�t
��$$��%���qPLA��1����8,G����)!�;\�V%�̣�}��V���v$�+v��v|�au��ĉ!��v��̒d�!3%	�Wl�B�� �)������� �(钜K�;��"�x[T�Zqب
ݓ1�ZqXT��m��̻Bh��e at 6C1�1�}-�k��:�
+�r3w[�
G���!�3a8i�_v�����
zhs �ˇ��`����X�/��P�98�l�9_
ks�
Ut��j�2�	g�
�:�eȔ��f�͓� �����$�ė
��N�<7�^rt/;�?�
s��
=�u	��|�Mq�0�@3��F�sN�K�jƝvnF���Y�*/O��A�؄��������/j ���7�7�7�:�����n�
��������?����
��N�\2;���iq?-.��Z
Q�s&_qG��:�E7�"/7��~
�Y��MU
U>�fwU��Y������aNe<���.� �~1�t|�|
+����*6����9�rZ�_��m�0g9��|������,���t^���
��i��i�!wIɏ3�>t+E�"c悑��Yg+��۴�˕�fK~I�Oi�I�[�E�[��$A�����Nf��tI�l�:W)uӬԝ�n��
]C����)��E<I���soQ��[�(ċ�2+��<��
|O�ݍ����63���
��q���3��ˣ�������'�2od������XD�"gd�&?C
����~�\���hݣ��\�i��iQ�hQ�Ţ���ǣ�����<v
~����G[�'m�W�n�U4��16��8���Y�Ɔ�բw}
�GK1���, e������e��)+��{}��?mlP�ʬ�?��m�Q� 5'��mR��IA�j�Te�jڣ�%*B�
+!lK ��R�@��RꎕW노KF�!'�MݜP��<=�J&-���s�^I�+){KҞ��u�����[���\��7��us_+��h
ߺ�6���2�~T5�9�o�_�Fk%�}?r��%S%��Nn��񜓅��}�$
�`���
���6<��Ob�Y�ĚM\I����Z�ZKa�8`\r�
��j�>��2��z�}��~=�
�)����Jw����"*�#T�w�,�b�*r�+�lj�t�2*u!�RJ%�ʍ�TYUY�n1��R�/�+
w)
�*�2s�nS{e]��
[���`��S�P�͖�m��Y`צ��2?��?~�x��
�=
�l��cG���}� �f��'��y�N�)�ۤ�u��&q|I
/��K�xI /)�Ӫ��\�`G�x���
B�JK�3W/�XI���R� 
�N�E�,���
��
J���`0�r<W19I��u
.6�
�zqU�`��͕
s�q7�������9�xUod[W�*ҩJ!UI�F��5�{tG
z<fB}�nGw4�����q?ً
9�g]�q�_;�[V������;��a,���A��y��cWYx�}��
<f�w�y'�	��~c�Y9����mL<k#��̳6���~��t�/������
7~v�wG����~�ݯ��&G�Y���CXL�t/�_F1�1���"x
LЪtM�L�jo[�m갵��=���X=�i�
��cnjj��	]<utO��>.��_[_]]4�v��;q٥R`Ǫ	4�"s
6����h
=�9''�U?IO�HΥ��É<{1Y=��\:l0�v-p�¬Y�2�>��T���T&|��̎E{��M���"74�n����b��u7�ua����z�{WU3
����G����kp�a��`�v(Z#W�;�V�}���z���k�
?
ԥC����Vtq���AmmH[��A\�˪d
Y�2��*k{�������IVk���C�^

�hXT.��#B�
�~괧��Y�QM]+N�?M��'D|���n��L��<�Y����;���c�"�O?�l�Rv�Ᏽwt�b\i'S�^��EKY�y�.��*
���b*��N�(��w���U���l*_�����)�Q���(`���&�'BZ	���i���w��ѵmҵ]�Ge����	S���)كR���1�ص�r�dbX�_���R�
+�}����Bo/��=Y��{~��T�qۗ#�K��R��T�j�Pzq�N
���an�r�K����
^^ν7s��8��ٶ���px
+�_��x-����r��r��f
���~ۼ�.����rǃ�V3��Oi,x縹��l���J_'ׂ;
S)4i�Ьh���?��456�%�K̗�/	0_`�$��%tӿ�~I��� �c8˗��Ƹ�$�|I��� �%�K̗�ϟ ��}pf|�_�\�%&��^oVA �Й�#�ųU*��h�Z�o����E�Ϫ}W��[U�0���\zin�;3B3�	7�V
q���.L1�Ŵ�׌q�7�c�*z��I{W��l�����/Lqa�q�n�Yaa�*X�t5'
�l���C5���H'��v�Uڊ�&uO������~c
���a��k������y��y&��A9�M�Y���A�%��0�E����n(�b-NgYZ$�iW�NZ�O�Q���ʶ8(+��ָ�ojd8uϰ:��(��q
�
+�X��B�
+M]l�Y�B��E�

EV��P$�*���Xs��b
�a�׏�j���q6ң���ſ4,����H��f��f�֮�
���G�^{�����jm����i"�q���/�3�b��p,��eץ>Exq���u��m3�
+�
�+W]��}ɧ�f�>}�i �=��j�un4PWɰ'��Fl��ӥؖ�u��
)v�����yr�u3Z�BUtbS:�u-���1R�)n��
+
���c^����'1�XI�' P�y��Q�i�N���V�
��m���6f��Yy^
�-�5z��-u�	
��Wh��8I�"
��g�!M9�2�A ]
CA+�X�"��I���(=����@�Cu�0�:��(
YA�b!m�8H@6&ٲ�����(@�L��#��g���}
�
w���Kw���:�1����6���3Q��Ya�2&l�҈��$�(N���K4�H�?���랇�	�^���K>	/5k�F�%��P��?O����/7�r�/7���pqߔ8��Y\6���H������Q��j.��*d1��:e�m �*j����n��-��%zq�_�#���8�M$c�e,ь%��D4��#|Z�5.��D<��Ƌ����X|c
i����T�uB���G�Q����㑟�/��F�+}t�;����n��<�-�cG,mY�l�Ҕ����%�,�8�Ґ��:��E�Y{H��EgX�^���S���z<mmi�]��������ve�t�t�:_�[�{��}VN��f�j�����*Kg�uW�uG��M�[uR��P)/uהV��Uc�NwCQ�O��\��q�<�
g�S}�O���Y��3`���p�(5wLѿH�
 [...]
��Ry�5ێ*��{l�F[����[e��b4{�ͻ�Am�n�f�y������l����g��z�ġ�7�dѺ��*m�J[r����J����|_�sUO���dV)F����Z�	�

<r�K��������w�۫���n�\;/$U�<��M9E���q}N�;�iq1�Ĺ�
��L����I���x,��K)�s)�w*��Z��ΏW��.��X���
O ���\I��kw��]K	�\�SU1���b�e#s�Ȯ�y�fdU2�h���9#�Q[�m�j}��p�(��(�oy��W�7�
n�}��Պ��_t�|�o��ͯ�

��߁�/�no���ŗ�vƍ{vԛFp�ѹ�1
:��4�������� wn�
�
+_�T���?�?����������_�>�3�d��ݿ��~�&]�kr��
�G���'_h���Ye<?o=��/����NN��o^?�ܽ���a�3a�'�����ON�����ś����o�)X�oss{��_?�t��������}�*�.iw�,�F�b��1�L
{l�4'C�� B���F}� d-N�Aw����|�ֿ3��L�O�G3@ �
����;
�`�\;���!�WEl5^Ec��;��>b���d��<�)�
�'���
z(8#2 0�7��u ��������"y+(��=W�	��Yn
�Nn3��&0:�M>qN��g
V
�ج�
.���0&����~�;�W�
�0E�4��)�Z��
+'ٽ�_��48@����t����
{0�`���q 
=&8��g�=��
6�@#2/���
�m��5y��Mz�
g���U��}&��Iޗ��&�q˜�$��
46f
�t�t=��Y�&�
+���ʀۀ�1
���1o�`���U0C`�T��I k��{:�0�q�K1$jp}!!V~�C�
��m �
>�G�g��
�N�]I�&#aՂ��9���m^aM����Ƒw4B��4�A��	���C����
��Y�
�g(+�\�?&`��^�I��B�9x��8 IpxH
�,t�=}%у!��=�����8��.�	$��"(rX.���pm�`�
�9@	v�.�k5�>�|@��$[�ˏ9�H�`
���T�
�IC��A# WN�ƌ��%�
l"hŒ؞=��b��x�S�l��@C"a8	�8�
{ �
@��`a ��.�����Ƃ�!y8ρ��ƾ�t���&�����l
+��!����H�N ֊�G�L�	T��q
΃I\ɺ@��wpH5`3pC�3���o�4���z
Y©�*�8b�NxP/�+�QljLp�
+�4N��H������aO�?���Q�
������˓�d��
_���I��Ԁ���=7 H|�݋��$������A[е�9|�7g�<*9#�z���'�2�=рwYc�Ƞo��@X�	M:~�1�C&
+�|�>�cc±x���
f��`��g9L�;Ō��cٰ�q"C��uLp%�8��#A�}�$
��������
�� r� �8j>��,͜�:��q��u !!��
+
S<+��?��H��MWC�bw�̗;�Hu�:L�D�
���!
���D�WqPdd��
+����䑀�	8�D��

}'���� ���0
��
�^4p��nH>��{A1�w� �
�
�jєB����C �ʘ��k�55�
+�#m����쀭��0p��^a������"�'PY{����{�E�����	�`�����`<;2Zl�H�4���|����b0�
�AN�O�X9O?��+ptȈ`h�$��@��!Ba$����R�ڂ��y�W�E��
d�
�K�iŶ�86�����T�8|Ʊ�q@{$���^
��#`/�xĔ��`�á
�O��N~y� �{w�������(m������W�7���w?9;��h>�����m�*#g��7w������[��7? Y/������B��3�w�W�9�Ǹ��Ow���<��>ʘ���( �
���>Q�nF�B�=�V��(�
+� �b���b�C���Th0v�n�Z`;�`@�a�*Rw1"Xi� 0<�'��=�h�J�g;�m�G܍
�% �k��R��� ��<8�j.����DA�ngX���F�JZ�@�N^[`2H�nK����o7
|v
�n
��\�YQn �����
Bܐ� �i[qʃ��tJ�	����
��1uH�
I{
+��)
�h
��7�!Vz����f�?쵰��c��Yh;g�`�V��r30u2��"qH��n�%P
�ɀ� x}CG�߁�O�m�����C�
�@tzǽ
�Y
�	s:�EP�0?X�>�`���a�ՠ� \�ӛ
+qFL�x4��H����2b<*���ְ�h���:�%E�t�s²G����w��3AP��� �0� ��; ��k:Z��!�<�
�J�n���
��КB�
���~4��AP(��4(B�aМۑ��}�	`�
�c{�
�*n�%2�V��� ��
+f���m�9�M1qβp�܌�3�[���<�I�#�@�(s���e���@,
����?��'"�vD�ouML
+42o�{b�ռ�"03n(���L�/PӞ
^
�5�ׂ��Y�v��
  �
�(qk�I�]o�uE��;�/F"Ypyy��Kе%N尡vDҏ#�ہ0w�ԏ�NC�ؔP
m^�!�1��HM ��ĭ<�Ԁ�1���4�
g��#TX��{�����c��d��}�TO=�:!�i�z�uAe��;z;�8�Fθu�|A��N�
��
+X���Q
�
+�S;Gv��'�A�{��|be�I��{ٌD�nXĴCpʣA+�`'Ѓ
Q3�<�
� ���7`���=�ޒ}�&�#
 6;���`�{ju�
` ju��I>�/Flp|r}�,�:`�|�2D�vBf
�ҙd�'=�`hؠM���ԉd�`�|)��X���
+K�^ ��+
�"�`@���h�M� pBd�/P���
�Gټ9�nzJY�G��2���
��1���@����ۈ�1A�
9T�q����Ʃ�P7su�P//��R Q�v�eoSc��

5I�86J4.�%�b��q�ƞIօ=y� �/
'w�������YJ��@���Op�1���y���i>����"�e��<���zA.�uHqrM��HP#�i��[�{3$�	��(
+4��T��
���i	����x�����, 

�'$!�xG;��
�İ
�C�w�C��J��,[�#Ul(ؤ ^5��x
폑E��{ :���f� ���2�-�,6%���N4
!��)��/e��������
�8
P��L�n_�~%�e��� ��< KI#����$�b ��17ӕ��
+���'� �W����b�
l�5�w������ͲԞ��|A�0!���&
ڑ�Ag������\Z�}�
���8����r��lLm���+?� �|
e ~���#p?hT=��f�y��@���$�V��4y1��
��8��'��mX
��F��,��[z�h�!����C�}0,
�o���9כoN���6��=!�H6$l�|~OyT/��k
���i�*
�'[I
���C{�)�I,@�~��A�t���g�b�EuXG6pV ����Sm��j�+����@��sV�,��V|R��E�0�6;!��H݁@m-y�gJ��q�$��	I�l�Y���H[��@aCii���hO�a���x�Y�����$ Ɔ
��h�-�`h3pH���;��S�>�2P�@$
��Q�$���!��(�f`C��v�L ��3Jo
�[c�mp�0>
*�q3��v�}��qS~��7<FB+9ނ�
+�����IRg����FA��
'kf쨾X#N�e��4��l��©
+�%��
��m`0_} d��|�Й�@^V����峂۹KiP�o:ʂ�9o�"��(U��_��/Ѓ�偌����
S��B<
 d:X'%��� �BY$���fց��J�=ف����I5\^��@��Z�������
�0�j�
����Xޢȉ�D�H��z ���4E��(�t�pr��	�$�d��V7Z�u#�Y��U�xz%!�
+��$0�\~�ԟ}��E�3 at k���5
�
;
�}�i�
�
�)��7�=��
�NH.C[,�����{����� 	�3
^���F
+:L��
+�]���X
�:��0n, ��Q>0�X�&d��pG�&�;K�v
Φ��~c���0�R�a��lҡ49�i���l�0 �$[��*fe8�o5�Op���73|YZR�K���>G��
$w�ik�����(
+ /8��b>f���lmk�|Q��S�$G��4lz^|#�\t��k�`z;��@���p��d<�&��4h�1���[Kw
P`�qa�1w#ɛj�,�#��$*�i~����T*~�(���=��c�;�h~
���9��k�q$5�f��DF��c�i���},+[g��v0|� x��djI�t�8��@�,��"�#���j��^�
0������V=��$Li �� ��$�	�
�
F,�K�(�9�E9њq^���pFYYQ��A)�z�,͈��%c�E՗[�ئ�~�%�#YO�Ez��
+�g��͙Lr��8��[M�
���d�=��$6	�tTѡI����� �� �:L�28�,
�%nʔQS�@W-N9l�=�������3a�7h�g
�#x��q
^�������0"�(���k�/��H��46)&�����6qޤ��N�������
�!
4��V
/�:�W��
��
�o8����8�7řT̋�?{G�#j4�e`2Ǟ�j�	��N�b���m�
���jNM/:=hB��@�
�g���D�U�S���t��F
�68ʬl�&
o�pk��r!kyF�u��W	AC]�oF�7T� /qO���=w%|
i+0y�cV�n��p$�x
H-�yw-�V�$�-f0 �H�q��4^M�.�<��p�%�$���#�q���
+A%�@08
+�1k`5��f���
6�ŭ!��4l����;\!8�.����'(7ͮl��r�؜�(����k
B�R�Sx��[_`f�R�������W ��@�5
D���C�-�C�gu��׌L�dB��i�������;]{�Nd��<1�P��cp x �#�V)
Ֆ	_y\0P��5u���7
+��OV��2P�f�C�/��s��2�����5��D�3�2�Ϩu92C
+��1�3S�UA�:�
�C�OC�4��!]�M�
�	#
/Xw�T��2�-�������t��JX%6�tJ�e�<�=�^��,�ֽɄ
��X&l���3$Rų���P��OFOw�֘T�
�I�g��>[[3�72fj�C��
+F�:2~���AB�
6�3I(�6�p$�K
&�툱
+���+��b �-2�����61%Atx9�p4�%�Uك��h���F����ޏ����'������̢c��H�����/$L\��0�\�3zlUʐ������D��
N)E��
ut/L�
�`��̇%��lF�k۠qI�w�<�fk"f$�$�1�E� y/� �����*&^Gdam�d\&��x8�۠M����@@֖���� �
�dH���V��Hq��
�Ԗ^�
�2���`��N��`���C=q�21'b�N1�F�-��*>�
+Dd��ھ�pT�=��u)�8�"ٸj���H+�h���;��=���)�1`bȈjS��e2�Z_jG �!N����@*'W>�V���i��6ҵ��r\0�h��x�l��
:,�
+2	�y`4�DŽ�>�k?�	!Q��0�]{iȥR@�	0
�w��v������@=cOGK�Q�\�� �ō�0���f�R�
 OL�#��a�m���~}Fk@�,51��OOn�;<�H�p,+�
��(�3�IS��Y�c���t�<��͠��jK՞\�+�#���޺�
oPng�V�׺ɞ��[�9�/W�2;�[|V9��V>}��UH at Sr���Z �X�,�tCK�� �Z��ЉZ����������W�

+>�@�&
Qq&
+ΔȔ�TK?� ��T�LFp*覉�T̎‘%ʧ O���Y+���^��`�䵪(&�KܓB�*Z�� �P+�G�(-��� ��N�bĔn��˔~��h�i��J�+�pJQ�C���6�N)�*f�9g4���Y�ڭ�
��^E*6�~��RGH*���l�2Rtf�� Ne:Q1�M�
+!U�
}��As��ʈ�"]�
J�*3���mZ�T������^e��A�-˞�1��*8�UHs�
���1S�P++h	�nQ�hme�-��ʌ���[�`Q^L�u�2B� ��	[E�+�
+�WFto�4ƫp}e�W�������}y�P�	ʱ�����+:��v��
���g$��E�HK���U$�&:��t����J�����l���j�N���h��~��	��%D_�r��4��K�M���_{VZ��n5ڝ'�6ybHf=+� ��h�l�.�ڵ�	�#m
LUq
�<�cL`
�Z�����s
+��� a�/�{�/
bXcbO���j��M��)����V_U�w��k�@�j~ݜ��e���v}K�x�,�o^�f�n�4�r�+Ҫ���:K�"�u���%HAo�:���*�w�R[%^�LwT���>�K.�V����&r@4��ODΖZ$k�H*+�`C��ŀ��t�F�.;���ϐqC��	T�@^}�>�3%��+��W��p
�B��V����L��^7�u��ú��v������g$�ǭ��X�Y� @�w��
��e���r�1`Mg ����Po h@�o�g9��;I�Wv)�M4�U���J�ބ����Q��"�(�2Z�UgT����6g�|ϴy7�=ka�
�
L3KN�
/:��C2HA�#��1T
���lKt�V���?�q�z.��<�&��kh�fc�)2H,�/%�"����V:�^ _M`t�xz���N��I�̺���
*��YL�w,,�b�z�0�>H����6lG_]�O����#i�=#�>jVkv�^�z���i�rysU_
��
����H���T
i�ͽ�\U�����۽nn}�8&fiJ��d[>@=/a�z����)��sd��&�1�2��1Q��[!cc�r �K�R���"X�:H=<9�,��j�
�~k�$���T�0��
�
+9Fn��a fb�E�e����
+��&�0 ��,� �L�]��5q"
$1PP ��)��u�q��q��g 
kx�'��{�d��(��ࣝR��)�"���Y���}R`��H͐j��G*�R��1��9֋UWF���� �b\P��crOPR��mV
F+u�i�7,���3X�gdW:k�3ׄp61���|٩"�a�?K{��L
������+�GmN0� �k���&:@SL�_;�����*��q��(SR�B���
A
�e��i�-{�ly��Cl�&�Q8

G����V�gy���H
+B���
�T=���B���[��Ԧ+> ��|@������\��c�3�&q��Hi��S<�֞,k�]�8O�+-��t*w��������B�����T��%�R�Ȅ��
��z"�( 
�D��h�cW��{�ok�d���%�`���`ü�j��
K�����)c�#K �X�g�������u��mY�#��mI�%��g���-Rb� �$�)�2\(o�x�a��4�
Ţ
��r�f�����۪�Do�g��چ�ab�	�6��.�N� ,��>�7���%{DW܂a����W�kV�\Tq��15�l��b����.�R��z�p��@
�z��jQ�x55i�YS��M�\	�z(
Po1=��Vհ�����1
D�"XJ����v�!��]jb>���^�DZ������W!�?[
&��r�c騡��2�YU��o���vK�l&�U�FO��m��d!Cד�|�I0�x�p���Qj���
hYR���q? ֽ��\�Va�:X���{��
� �}��	jAG�0)��U(	�
�x����D����O��x����UF���IƲ��2�J�αvE`�)[,А
9dIk��8���+Fm��:���Bf�
��qtT�_��Yq��Gv
�$L���k�	a�=��h�fi62�+FVH/`�C

�4���1J-Xt|n10���I!�`��oG�T@h�EӰH�AX#���
+�btÈE�Ja�.?�%��$U%�T�����)1��^J:2 �l`<��t��xu
��j�16� ��� S^R��hEs��G�y4��bi0pK���H�4Krz%��h�K�������AR��T~q��z*�̹���5gTܓ��{F�5̛4y����$�B_�
��Y	)ǰ5]W���s�'�ԛ�+��c��z��Ԛ�
+5a�z.�n��2T��S2���<��
������I��Z�Ҳ�
#
&ޝ֗@
5�>L/}
K�?���4�Y�Φ�j˥
�
�F�
c�'��a��1�P� mc�jIֹ��_`�|``>"s2#�#��?C�����?A��q?���D��?v��	Sz76�>��a�� 6>)�A�718�l4b
�
+�i(c���o��[<�L���t�*�4�: �{��
�
�~Pʤ*��	
�i7O�
 ;QȀ)S��Ƞ6�/���N��r?�d� +�`/�
RJ���AxV\�:�Z2�F��i �S�y1���e�
���{{/wp$��t��8�w,�lC�WYL�
*�
+Sҗ�i%(��~l��
�a�L\:2�>+GxZ�I`q�5&u��Ȅn�K�3��֓Oo
+-�؟ch-
��%U�0aqj,?�!�x6B�b���8�x3�L9��)��.hO.�LH!�r�0#���6.��e�7��
�π}"����z &f��,�uj"D�`�ខ))�y3��&���ȫT
5�����2&ʧ���I
�[,�S�$o	���m�z 6�ɤ`�*�
,�n�d� Jz���1�Y�vO��̀=ײ�1����K����a�>�&��R����jN���6jzk^�\%���b+���E���i>^�oCT{���?rD�kT���÷��~}�p��bq#��(+�s�Yŕ�(QR�Z��	�XfP�d
V��i�T�Y.���T�S�xn���Y�w$�ht�k"U�
P<a��q��E�Nt�2ʍ�ׄ��+�3nM��fAz<�J
+㢜.-�¬�A��M��5^M�Ax4�_G]��4%Y�U�-먇�.v�az�l4M4�T宭�)b��rm��u
@�޴�][��Q�
���]�\��zl<����vm
�aS���mD�a��H�E�y_ ֞�%~�5��3J$�\0t�]嚳G
�a��AW���}Int�k˲
2ST�8��j��g�50
+)�b�Rs^4ى?Ů��z�RȞ�
+�L�,U�f�sL��U�-͆4RϓZ;�=��\�ٲ�9-���E�EI&2H�ۥ�5E�ےr��L�b�
 V����c�"�܍�z��� 'ƴ�3+rb<�Ds��זK��P1���`ClJ��sG��/`�cq��׃Dg��s
����NR���^�C8�<����}���u��$�D| <w�[�d�*!� A���2w�Ј�ׄA7��<��[�
��21�-�6L
�D��A���9K�陖Lɻj`#)&���b�m��
_�� f�'�v�4-��f���`st�Jr�t`C^[
lhyL�*�(��Yu��TA�Q��Ǝ���
��;1Hdzm����
W�EA�Y��[�X��`*u�h�6
CJ���'�i����+b��P�^W���
%C%��G�{�YV\A�O�����F�T��KpԺO�
l�Up�{�p}
U�
ȧ��
l�ct��IBtݱ��IXlL��s
U�y*m����a�a�e��hFyݪ_
^K����v<ү���@��_
�c�w�����p:1�B���h�_
Gǀzէ�v\���v\���>5On�����'6�6m��
؅F�3�@+)�e=���\�l��
L���3�S�O���y��
�,Y)�
گ!i+��,��~
0+ 3Z04����xdb�(TY�5�{�$�Dv�	���ae��ڭ�����ez��`近� b%�^
S �g0S3k�F��r9�+/�ƫa� %+.�L۫!Y�$
I���j�3�|�}ֵW��beƴW#�s^�&Y�x5����55���^
n�9��i�^
+�H9��&:��`6

hL�
B��j<�5~�W�y����4����I�	�&V�z���^
+6\�B�ZkT-q!�2��
�\�8�=
�|o�x����c����f�|hP�*gF�k���q��\�E���xWF�=��)��Db�v{�5��i��u)I+�h=��H*a)�N��_p{֥ڔ�$'�.e-	�XfP��!�\�R�Pgb�VFF��g��J�M���V�a���e:ɶz��~����'o� �u)A�	D :��KWA9M�L�Z
��v�n0���5��X
:�5�G�͘��t�Z���F�H$K��Tɲ� }��h披4)a��J���M�V�&��Jm�T�Z���&+����=
�(��j&�mC���RL�7�R庳8_j>&S/�a���@"ftb�\����
y�z�K��i��
�b\��0�"en.�w�f	;'�CjZ$�z)���Q.�`�O�t��Z�J��R”�Iq�̢K�6�
mjV�6%���VH�)6N,��	#^a�d�RY�[g��UY��=&�N�����R��VOz�p_�]
+@�MX,�@�I��UhN�` ڥ849��-)�g�r�3��X��_&ݒ)�,tC+��V-��N� ��b�æ8�,�aN"�E\)%���ۻ�GL�{]��|V�z���srA,�Q����lf�G&����s��
+�e�]:°h�$�JhOGZ*R.���$�B���ê��j�w�M_#k��z�T�$
��K��\A����J��5�¥|�co��k'|
D�cY�m
����R��\^ޜVt�9�VK%y��
�%YĦ�<�gP�1s�z�~�]I�r�T���+��У�6��E^�EL�(� ꥠ>���tX��[���ND�
��=�ʬ
�S
��*�"�[z����Q��K�%�%X���� _X�:�M�\�
�d�Sf�Jk�ܱ���VĘ.�/l�p��p�{!H�Fu��tOඤ�\�Z ͱ�
is�4��#%C�
YB��t���/��7��@$�Fݜb�/�#�j
{�t��Kk����m��M*�w!�(Zz�Jg
ꇬB��Тt�OCxݴ�
C/��D���Q�n�9�v���/��`�
+Q��1A�l�{�M��Z~n	"w�ϙ�$e�R
�X)�4
+�ɯڎ�^�3�
����F%J[.�M�pI<g�q�4D1�rbR��R�&�rIBB*R�ۮ�/��Zԗ���2�J
�K�Oj�:���3�8��1�$� �2ЗR��fe.S킔6L��?޼S��<`���e�8D
:��Yߍ1��ʻn�z���
�."k9�R_ji #9%���
e��J�|�܋ h�+�� ���K�r&���0mbCb�+�f�W
a�h
+&�a���d*�O��M²�rr`~��7�x���B��NdZ4�ˮ�9ͻ�8fg�YA
���@�b�fci#�zQm
}�Ӗ?�rRZ8̼�m�ݴ4��D��ww�ki�L4,��(��M�.�u1%�6_��ia�q�m
��h�3Fot�;5$���C6Mˠ]�g����4K9�q#'��4
OSP2�\R¼�[�{�
�H�

�4�O��Es�[��u�&,�YH�kB)�p��^a
G��jN�{^�0f���\Cu\@��R!�#�~\+�Ĭ ��-����Ta$V��m��3�#� �!w� ^���Iy��H�L�]��p^����N����ט��rF�
a1s�bNӌ�YWhd�۞��q
���,f��\Ÿ
�wG	C^�\��X��Ϭ"J��M0�Wh���3,�G�������Vd����3�:�~��ȯi���#Ƒ	�q��&_��!V�zJ�fF���Es�Hs�Z�Â�gQ4�I�?��1R��X���(-u3�^7+����vfe6JiJ�Q|�3�s�)T�{��Jq�	�uoO�*�G����>�y�� �֭`{Ů��m�H���
+B�acs 
�\�b�N�����E'���X7̍���uZi�)� ;�ҵݥ�����k��!�mC`�	�\1a��ʠD�(���03�7	
դLU���憥	��S��4 ���w�!;�z#���
�V��|��Ǻ؉ȧ�Q��#�i5Y2
��!��H��D��+���$ahU�~�6�V�����
 �-Z�?�w����n5��S��{���� �+�l摗M��H˫;wdZh�>�t�
+'̈́V�\�tڪ�4��*������7O��T�i�fUْ��U޾�bY�E��Va�(W�͚^�Ǩ�`��bb�om
+�%Φ��e8�9�\��)#sTUY��^�#��v;���U����KŸ"!Ze�0)�銰���iQժ�W�*���*�Wdf��_���ɪ���j�
+��5�Pei�ST8F�eT�Tt��S����[���Bj��z͂�
+'6�SALUZ�qF�Dg㬪�gč/*�,5�P��X� |]�T��*��ϪK�}CUmUZJ���RrTY�
�J�Y�j��-�*�[�4U6���=+�^Xj�*m�ٳB)��rpVZU���6�]x.j�4e]9���"�Y_J/'
]�h��|��sR�u{�b"P���9aS�:
T�b��
`�V�V���䑫nצ��\���4�~+���
^
9��x���ʖg��t^
I�H�2?5��+�*�^�]�̻��5�����1�lpu��ڀתu��u�|m6�*���f�~e�TE�����P�fSe^U�	�ٶnp��h5J�g�Ve
�V����
[�F�՛�3�#Rg�����zvk���U���"WnM
���Mf��Qk�Q�^;V���v˨�W;t���A�_y�f�Q{�4��|Wm�U{��SN3�5�ϭ�r��N1l��S���ۢ�v,*�S<�YBi�eK�i�g-������ۺók���ʙ�Ľ�7��r%+�����(�u�(ϷBD�i�!T�ho�.�W�My�
� [...]
+e�@���PYQ����P�\oh�_�~�U�:tD�
9�D+)勦�S��5�:�E+Yu�L[Y��n��W��<猖ީϪ��*�H��u�R[��c��}��(�֫0��y��Қ�
+u\��G�aam�F
U��#u@�6��qmkM��Sf
5�MC9֮iPRz�
U��)C��l��T�amNS������[F;
Y,}*~R���˦e��TvI�L�*f�eU�ŊZ"S��Uų�l�*V�uU��2	��ۦAYE�*{�
+�-l.ܴ{��k�y�OVvv��4ӫ�he�ׁյ�@h��
�R�J
������2Xc�5�
���홙b��+\��͖H��ŠWQ�	��v�X�Y����t�7�:�l�(�iO��
+	�
�s��"Sj�qT������WU��$MH��^
%o���R�B�ͬص���f��I���m1�\;��sj�������jߢ��V�5�ɝ�צ�~�5n9O�ԮWEm�W��u�حI�8��&���OgC��NdTb�`��ޱ��D'����F�&��:��N�˯s�H"#�0�e�i��Y�Ndug��!@�4L�%�Hzp}�$�/�����+�끴*��	Q�Q�ZW�?�&�J�KnE����|Y5^�֨ԲA}�l�p���Μ�
CW|��Fs}V�d�rn�r\EݨA�c��/�BЄ�fӭ��)ԯpd�_oև�W~ڶx`w�TQ�n��t�Av�qg̑>$�m �憩ѵaL5�7����&
����Jy�vז<���y�5�g���&VMԗ�9����NA}�n���Ui͗�gX55�?�
$�z&轶�� �rU=�s�LP�GZF�m�@KH�Ѝ
�0R�4��
F�(�N�~Q��v�ujۆz
+[n��R�j'�N�*ļ
']�ڬ�A�
+e�<�J%aIbC]u^*
+QuŋSX�O�ݔԻ!
i��\�瓤���y]]�?��,���<�ڵ��>r�� Q|���g��h'��G�х�nĤ�jK��؁n�N͢@����|��淺!�&�Vc�%^AFP���X�3 ����U��z��ئ��erx�
#��&��Ǣ15lL��l�'��e��L
��#�x�X�e�mc�-�}��M�t�*4gSe:�nA���:
�� ��^��wK8��7���}�9��tl�XG����bw��
��֭�� �o���0
F"��}.�V<�)��1v�ȚB��ǯ��W�`Woݪ�_W��X��
�R!��E�
)���k2j�W��k�+j����M����Ti-�vcݔ@o�Vs�
Jo�WJ7ŖV-S�/�����N�o�زm�����r`3�J��5Q�H-�iM�P�Qј��:�tn��j�(��6�ls�*����Q�S#����;.Lt�8
+a����q�e
��פ�X,6
+�
+s�dU�V�a,u�iT�2
�Ji8U��Tl�����Hl#P�eMxUو�et�d)�Cg=.�ߖ^�
+�^�8k�5�^��e
K�gF(��caJ�tn���5bb;��-6M�D
+n�
mT���pU�ڐT���/�u���}A���p���8 ���
Ɛ� }]�9��_d&��N�I�
vH���
��s��D-�5�7VL��E9ᘍ�v,Lrp`�Ñr׆�At��
 �F�kq�M��\�-�w�>�Dy�mK��EU�_��\�
@�찞��|��˺�^�V%e��UAfM
+uMgMQ��К0�Ӛ��:�zo��]�-�oSoR�*�^o)35#��ԓ�8Ssm
+cSK�x���[�T�x��V��k�?&
��/X�Z�>�
�c�_o�Tu�3P�e���W
����<�g at 7d��	l�
l�/���J����$�Yicl�bTB�P��]u� ����c�Ei�V��Io��F:�i�
�"�[�S�`ؑ97�S=�;M����=S=�|H^��qg��#ȓD��-���˓<�E��
A��X��r��G�Ƞ��E����˓T� �fh>�&0R5	bA21��0���$����3�`�_�jĘE�oh���~A�h��:C[I�qC�i���Y��:�>
,���X _u�(x)�����A��9�>�s��
�}�=��L�4����e��޻T<�nr�.
��11�gd̔j
$1j������U�?6��<�@hk�qz�[�
'k�b���5;��U���{���ˇ(��"c���#F��Pw�lC,����Y�:���X���|~��'��$I��|���}����p���Ƿ��{�����|u�j�L�Mc	Dm��l�i�L�_h��leٸ�I�Q"i#CB��&���$g�&Y�����V��A�{p��` d�6�����ʓ�ӆ'��
I�&�!����1�"� 
9B�<�a�
s�p���-+���-n���@h p3�������40^4N�80J���C{���Y,Ŭ�I�h�	��S�����Q��]�g
mdȌ�F$��(�!�yM��0�uCO:�+p(^���!=�ۀ�b�D` � S�'�sp8C�y
f@@�!EP�>|� �	!�
C��
S��1�4>VpaW���|V1��;�!���a`<'���~HL�aiΑ6U�^A�ݱ�7!���H� 5���Y!Mb
�͸�:�sZ�
+|���$�U�j�-W(��"��o�V����c�T������5�`)VF�ҀX�2ii��'�

�b���J,K�Yɛ`02ږX������cK0���؉iW�����\LB��[�����1_�Lw&���o��d%��He��L�1�f����,{��`��gV��v0���GV��� �3,'2Z��4lQ��Y @�R�
��T�ƛ�B�,�J�������cq4�+��
��n���,��â�!��v1�#F���X���p����T��Z1P��H�[����M��e�	QB	b�b�~�Rw���c.8
�N���*�Qլep�8&]�E�=C�� V��N��EG6j�a���L��3��k��P6��D�?���	��a��ޞ�[�O��(��Pߤ-���"��'� 
*m��Q��3M^d���c�֐�G���������bZ��Y1�2.-�_4�����4�W�f1TvC�s$�
��V14�C�
C`U�ڒYG�2��+1��^J�Z��� NL�
�Ô��Ϭ[�1�wd�ˤ��s��
Ԃ,�F�Zr;�K0�N�b�c,0��
����R�J��g����
�����|l�$jo�%X�ԓy`�eN��|"ơsϲ�%c���l���n
lՑ�'YpVgQ>��9,~/��K]�_T��H\�%4�������ՠE�����{�m�p��8��>�Ӳ
[ш��'�+V�Q���$�:
iQF�K�� �m����{�ӧlI��?
,Co�wHu��bd:Ci�<�/!����cz X��ȗ 
���
�(ђ눯��SX�˸@?'�m��w`��-�N���~
�~��tnH50����{<�$�l !7lȕ:Z{ZF�l8ٌl
bJ�����ۘ�b+���`�pZ�p�17c��6��eؤ�
+)_�@<���ڂ��
�
Eh�%�%s�'6 at Fa����3G
�c�>{e'ў����պB�m�t���X�TB�
�j1)����ü�ؗ���`41
�X
D(��"+~3�j��t=���{���g^
+���7�:
�U$�4˒f
����f�<]j
�x�h�1��A�,��
�/�Ǿ]Ԗ�3c���c��8vd1&�
#J��M�4:�|��$�#��و�di�X(��-;f	�e�*.���g�,`Gh�Fj#C�gO��ҏ ڞ[�)�C)�L�BX����,�D8Nc�D�: (K�a�N�����t��z&I��<`�6�G)c�(1�2J�y`s��X����{�Xβ���!k�px�S*ɢA!�@s�K=ە��#.�C	��EcE��N�	
�1�2��_�9T��T�K
�{,kh
�PXH�pD�˭X����F��9xZ&��A�����`!�
x̀�����︥=�Ql��
+[Wr�Lc/�i�U��#����mP����E��l��Q
��*��D�'~�:�
�� ?'S漗$��\7�M�6�V�9Glwǻ��
M�Le��c��2H�t����'�q @)�9FɆa\>�_�!eź���@.v
���D��'��\�!Jr>��Ea���s�
4"a����v��L
�����e�H~�Rb�=�$�
�P�h#
z��F����:
R휯G��cqd%
]�(69�UFHQu��"���a�@��[�y�(M)i<��G:�����z��[H��(S�XĐ)=o��=E��L�/�A�+L����T��N�,�I�&�J
�g
I��:FᑀEb�eXErP�ie���As
���_��������YR�إ\C��}���GJ�6��
Tʦ^��MCe��I�r��;��޳iQb Ȗ�*�/��bcm�B�,"�eHo�>Y�?P)��	���jv��x�ѥdL�#�s*�>�
&��N=�)�&���~��a+Ͷ#]@�e}M���om�ڝ`�2S�d�L�W���h
I�UO
{��ÄW��<��e�]q�x� ��\�ڽ�����yO���9��q
��פ.O{�ܟ��A��-?�
��U��{f������˃ �{��gi�%��i��	쐧��خ�{<�~�@ehd���t�����4؍g"&F�Bm�Ͷ�K�����4�����
�f�^Z��jG$�\��2$`�r���=��%��ه"�����HN9���D�KR�x�k-�h���8����D%���=a���M��wH]�j��Y�
+fΟׂٳcҸd���'V�ELx/�d5L �K
�'��j��w�k�u%�tF�xƋ��7�8S�Ї�OR2�`�����H)��HA�6��}��X�Ykd�(�Sq
ads<���Rc*R�aѺ&�������*�+dꋲ�Yg�=�ni�c��H#�Hm�lj�B2(�#i���ٞ�ߩ�X��W��?�;��A�9���ܥ4�D�`CiЊCuH�f~|C���,�B�Ѹ��B��G��}��2R������Fy�Y�.yV�<��@#m��h�M����Y�>I+-�_���tRr���˜���h9\�iN�JE��Ďx�s�����z<
�P���vp��b�.}́tش)�)���=�d�aE�)�9߰n0�'����<b%����|dz��Р.[�
�Y�B�i<k���X��1Ms�F
L`z
h�f#奯-Ob�,1J%���SL��{��e���!��+˙gX66$e)f�γ3�p17�n�-y�֘n2܁ҿ����{�j}�݋)��5v��s��%*+ [...]
+�r�gO9'Kg����-:v�?��0W����<�����\_�I�N�A.��	��ĸ�Ɋ�
+�7�A
���� �];
�t������G���L/l)q	$�}�M[ܧ:=+�.
��	lɘT#�;:눨X0��1
�Ȕ9�3=�>��4x2
�F�˓���$���P��=0ބ�/.e2�F�$9�=��8E
��p\Rh��ob�B�
�zi�q3��S4	�2
+hױ��cJW��8(K����D���x6	���
v�]bH�S=�'sE��$�S^7�d�>	ܙ$����h�`��O�
+I-��m�
1�N�2
��	p�����#!��M`2��DGKQGߧ@3E��
�Y�p����7j�w�AF:���p���q4Y1@�EG�zF�jC`t�o�c��5�
V�4�>��zeY� �
+#<g��HE�3���1���Pn[s/���!� ���|�86��c	R�D�A�l�ъF�#�t����ێR��o!3'��
�饏�'ŭ�
�uV��k���.���ֿ��������a�n�
7B�1�B��O��؀�
u,:�XG�s�*))�$�����R�0w
�6T���5
�fEI�Є��� ~t`�P�Ex#�+㈑��#���VC!�*�X��x1�Ր���N��!^U�`$�dn&ڑ�Fpl���k��X\
�'1���U��9�:55�h5(u���imclT�	��v
+�		j�h��L�`�4C(|S��ɣW��QМ�P�CfG�V�{R%�0�R0ZM�P��Y��=��r��F�pR&��
��P�Jeq��饀'{����31%�c��*�H�A�̃�s�wJ
sR�)r��
kmN��:k>�P�'+�\ZF�2.��%�'�L���hx�&�S�IQJ�>�֝A�R�U� ���otp2Cw,~JD��x'e׉�%y�4��Yr��`j��[�R��:���L���31 ��zm� �NYƮ(o���ܙFlv%c
�2��
�)� 
+Dy�T�X�.2}�g�E~Rm�q
��E��9(�Ġ֎F[�
sbH�
O���c�rl�aX[Nf�k+�$�O�̣�S[�
=vNBeE2�E|t/| ���ڲ�Xr.�&�W�߸��,�\,1K�����M�}�'���Z�Fگft��u:�Ub&h���<��,��QvW�!uL�Jw��~�;@
%��L����(���E�%:��Rࣰi��-� Q1y n
��1ۑ�Ez\$	�-
R`��
�F�m�W��
D���`�C���IN��$���W�}��i�Yn���
4DV�R]Ў��ȕW�ύ�[�z)�3Į��}&Qx��C"oDŽRתv�ȫ0�Al+�/M�!�`�^�Zʓ��DZ���R�o����H (7>;�A���Í�̟%,"��Y�w��r�$���D7��<�p���o13��j�>��
+���޻�ز\WzO�w�?��V�3����[�

�܂a��1E��CPG���ߘ��jŌbmR[R�[R��]+�1oc�q���\��ʝ��Zr(e��$6?��{Kq�Aaɦ��y���Z̧X˓
��V�\�����Nv;IM4k���,"�S��zmF
Ypj�y�	�0j}ʵ��Qc2�}yrjk阀�^1�l�t8O(c�[�#v�G�W�����]K�OG���{�=n��v�L�B�|��m�Glg�Y�U�"5�J
��wV�3p$l
{6��a��Q
+��tM6ˉ��n���� �7��!zc!)ؗ�b
+6*����.����
Ȭ`n�kk�P,�� 6[=��Y�:"�
�6|���{�I�^���/�r?��	1��7�1����owH��&Dfp��]���m�A������8! RC�@�!f	��m���kй!
+�#v�\
�F�7�8�+Jy�>�Cp��_0b_oF-�y�~��~A�o��
ϲb�C�"b�7)�ӇtI ⇔K �oS7�1 ��bo��Fz�&�P��aMf�成
M�lZh�Y���2{�qd�!
}'!�zW�eh��f:C+MȘ�.�;�z����k����ލBk.8tmSʡI)d��>����R�$yh�
+��аu��C��6���B� ����Ch\�.�yf�#t̅�I�ۖ^B_���&���{	w��q�,T��^1[JPzV�i��j�-U,�/}X�%��U,�
�O�[Xb�ޯ55s�>ᣙ+�)���A��چ�-����W��5���N2�r8x��8P
�{
=
x��Z���^<,�9��9NW�2���G�T��u�
+�
u�͍�C�7���M���X�v�l�dն�ϳV�㽬���$kA��������^��zh��Y
��^K�q�� a��ȃ0az!�����lV�D\y+���n`
de��o��g� �[g��!&��ѵ�`�
�5
��$�z�(^��2���m�!6:���8��>an
DQEA��W�!	늎��۲����p�/�WE�#���.��*�Ᾱ�u������y�
��,B��^�_������&����:q�6W�ㄆ�8G�f��vm�Z6��0�_�{3b�J�}��%�K�h�0�ǕÁ��?�I��Q�i�b�;�-n���	#���Os��S�-�M�K��E&���F��
5/���/1��G����+m��(�T�7�� �Γ��6��m9I}��\��ҩ\���;s�&�7N���)
�lG��<͙������q`�U�A
�����w0w|�7[B|��W��-{�����j�v������U>m'�M'y�2���q��Ŵ��2�^��
���y��m����o [...]
+�_�N����^j��w^��lȴ�g2[F���3��\J��㈣��8Cm��
+V%�w�q��C��JTg� ?ӺpCZ��L���H�mh�d�&+@���� dQL�mtAY��eS�0ù�:���i5�Ɋ���
+yƦ�BJʧY�TN�k|��74*�4o
�6���q������ҷSy�Ѫ�!\3��,,u*�)M#���рd���<�,tt8u��c�8A�׬D���M��B���|��N��p�}'̤��Z��ei���I*ʝ�V��݅'��\�*��������!�wiH��v��j$TH�c�~-g�+�%��?I�w�
�>2�
f�����
�$3�Bb��@���Oz�y����)d	���:���|wn��3-A�n�O�hX8[���0
�9ɫ��jZ&։
�g��ܼ�h�
 ,DǗ
+�z
�	�EH�!K;P�Z����vkX@q�DzĽ 6 ǥp;}���k����
e�8��
�'�
Y�kL7���Q�>o�\:	�Q�!���21�;��xl>�.�	�Q���]

+l/q"P�!��`���ԭ�QIh��
�CRF��D���L�����D%��A�$Z&
�^aa��v�t����I���$Grp罐!ՒW!���e���>��h}	�F%;I��$��a�����9��^-��&�9ϲ�[Y��탄�x>~���7wہ틏fd�~��S ��
��q��Ѹ.�9��m�,�\P�5X�b|�ݒ��ʺ#|�������-��n�,-R �iQ�%|���F��d�
���>s�f��'UȒHw|�"��9�ɶ�QJ8����N�qX*��}��j�B���CG��p�
����?3�Dk�P���|o�N		Y�@R��śX�쾥']`��~a�����4O���|��q+���m~Cdi>SA�ז(5��ʊ����S�z�+%:a��#��|5�:O ����"�Dp���z�D��-f!<nn8m����o�;�(:��
+GH
I|B�������a�7���0�'�
�Dg0�K]}Щ8�z�4�\)�ϓ—��~&�Ts�
��[3i�ң�0���e�)T8)�CPE\Ԥ�BN~w\1O�`��$ь�eVRT�p��Z�Ng�@�*
evLT$��=���U�
x�U�ZH�
+L� 7�V�/�dT)�4��a���H����㥟���:_��HJ�ڌdJ`�Rv���]��y�wWٷ?���A�'iƉ>��
ĶD�ˡ��k���Ds	S��I�\*�6�k���@���o[�0rf
+���p>��T�O�[~sP�E
I�Q^����"Q{��t�Pk���ܾ�ĩ�\�'��"��}!�CG��P\7?
�fR��Q��i�
_��0�4�ӑ�� 1ky|�#A8
�HM�g����&�������g�+��0�+�ȶ�Ůt�ڢ7���:1���B6�w�-�T�=tn�@ ����Gb.y#��<�
�FUPU�Q�B6	���y�	7�[�~
L��v�<����@}�luQ����Y����E9̌�{���F��1���T��	~��;'F�֋A{D�Tǒ|X�U�IW��Gp%2a�g��'%v�,X�K�:fv@��3�3I�(~�����4����g�*2oΔ$�[��qy��
D.�-�D1�먏<�
 �S��<�' c������8�\��o����=
�Ǧ��R�m'�"7o�6w���>�; �C��<�q�#&B�C�5��u
+��I���m��A�~�T�BLR73������Vg��i6w�,1���r֛�
NꜴN�Z�I9hh����grd�R�?�T�o�p�R7�Er(ɳ�Tsę��!�?��J�M���1n��<�?��nٓ�ϓ�(j3�`��f���T����̯��i����a��;N�1�e3�cQ� O8o-���
?_�e���O���M�;M|�뎵�*a�
7l�a~��7N�����uc�����<���8�#� bGҔ����@D_=4��8H?��>��w'Б�!�sIN�� 읔^�^�7h~6)�&�[��
��O;|U�U�� S���|�����q%a�\1��u
�2�Y�ruV�)�r�j�j���m4�K��e4Q�mJ���0�:M�5�R���D��/t��
����i�2�+!���aHuW@�R[�`Ot!������ �0�
��D�S�ȶБ\'VJ
P�Ur{��o�Ȑ[cK��
b˵χ�n��T��8���
1Ps]&	J%�W���i&��1�
U�f�ǁI��إI4��VT��ɒ�%�D��Ջ�I*ņ.a�4�?�_O�JQ���n��'�\��=�KlQL��K�B�IPOq���
ꁅlY�jhC �vZ�=/�mԴ�`C�<0'c ��!X�x#�.:p$6��"���y��EoN�?t*�Q��2h�	�
���84��x>���Uۻ�b�66�9�� ���
���U����Le�
m�y#��O�
k��L��<��89�O��Q�òj�|�'L���no�R'�i�|�иJ�]J�սɢ��
8h��u]�4|�_���d�#�$1mk�[�E��5�ޑӹ�XGUnKA*+�.��} �DBlo�T4KP�δ1]g��y�tƍ��2�^�
�H	J�,��aIk_��mL�If_`H��S��.�٦G¡;�;���i
��v�ƚY����v�+��Z����c��Y;�.��]��5���F���v	���B~��m����Q�bۉ��@m0�,��  
�k�bϐ
!�U���Y�g�)����f}�t�`�����H�,��
�׳��E'�l��<{����{�5i�Z���%}i��q�<���吇������4�u�'��3���<^���x\.�R~u�����v��t�O�.�aB- ���@.Uf�����Rv��(噜���F;~�‹tX�{U7i���M#eW���;�.jb�
�Y��j�
S���!�3�V [...]
4
y�j�fG;�[�8���D+�h�=� 
����:]��6M�g���T��r��(I�����2�4�^4�w���CP
��KߢJKn
�J� ��Ǒ\֦�(
+��"��(D��"���ԛ�V�fd��ƹ�n]�z+h\˺'ۛy-tv�|�ԾR��G=��w��xD��eo�$t�mR}���`��޿�M�=Z��Ń*ܠȆq$�;h��hc7���Q �QIj��u��짧�ő�}�-���T��EW�]�1�mU4t��<����&��E���N���L�}Qe��Z��_�lYN
iD���8��$ z�ps����
��=	�L�8W�&�}���;3�۩��
+�	`
�R�A,��
ݶ�
�PL�㛙�����(.&^��暜�c��3
���ġ���'���mY]讳
m}}��;��~%""�e;���`H۔`�=��~+�Q٭\��*Ym�P��!,�� �Y"�3�`�&��@L)���D�E�
g�M��%J��d5�U�a�k�Ǽy���44���	l۫�R_>|÷:��4ТÛ�%�mk%
wm�9� ��ki;l�j��
+��éb�F��x���Y�n0�V�,�ƕ��l��JB��ϩ�pI�z at 7�x,��z�n$Іq4����*�Bm�p�]#
,�/�iѭ5o�xk����z��<����8#}:/p8
v��L��,i8��F�}'�1'�9��'�*%^64� �_����c�e袆�X��J�,NUABT
�La QW��
�,M� �E�n��
=����P��V��):R�$� �A����iZ7
W���r0�Př-R����B�Վ��q�������N�oVv��d.DG�N��2R�õJ%��Q�hQg,0���� ��\P��59Z��. �����z�@ɇ���7�B�
���{�
��,N���r���J�(�oZ�Z=v5���O�s�sb{�&���A,
�nP���QG
$��=G�. ���{��k����{����W�������I�xu�Q&�5b.,Ų�s�bA0��yԱ��y6�T���M|��[M�2���K}���9�^:"K��nL�G��K�i8��t�E/�ޓ��x�	�ȭ�^ D�B��K!z�\I�ٮ��ጻ�t-��7��K�5
+Fm;��K/*!�m��zx��ސ9���;/�
X����ݎ�K/ �/���������
+��д�о76
�o;c�
u3W��J}��݁�-O���.���7��m ��|����C:���
Q�$G]�*m>�7��
�
B4z~��0I�]ȉD�PJ��J�J-+?{��U��HR5��g\k~
�fn��U?�ŶU���l�@���b�������AR�k����1��
+��蕔'B��歧n���|)B
��z�M	y\
[�l��S�]:2C���=�F� l{v��Qo�zJvY~��Cl'Ne{�KA��O'n�x��9
��O͞�^ʲ��m��4TQ��}9�����Oo��f���e�C
�Ė5��
�t(���n�:��.j0�� �E��/�h�Du6r��m7��ڿ]u��. at Lc#w�:��G�\�40�CI3����6|T")��?�O�:ꚨ~�M�zl<vF`��� g�;�T�C�:�Ц�s;�Z�̮c�8��TQ�b�D �:��!.:�q��aY
�:����~
oE��V��
�2
�Y�_[��R4H���6;$]GTH�
�a��*�+��qP�;3R�(���
vx�����/��OU��ٶa�|�Lf�;h7[
‚֫� r~��炰y���GK�ȶ �"��� �ٌ4x�:������_��1�y�Vc�W.|#�U��N�˿�Cp��;Զ�_�N�� S�G,�r�
��D ���/ȼC�d�Lʾ��
����X��c��o{���
45��_��;V9�����U�h����_��5�� ������8b�M��<�v���g��5�P;*
r��[�=�6p6��K�W�a�p
X�B!�W�
��}S��t��B�G��s%c����QoH�4�Z�<^��
嚙����-��qH���z�Rlx���rT��kx�!�$�+�k
��
��l�|��p0\�OH�$ōWY��_���:�qB

���q�w�l���ݏ�Ua�d��X��L�y�j7� �v���
�	�
ڒ��
2��AMr�,lȄ�<l\f���#?��u/�ٽ
%`�Tx�?�P5��V
��:�����t7r���h�M�;��w���0[	fc��<�io�T�Z�I>c���R�Zq*J{�R�g��O�ې���2���	tŴ�n���@-����s��w��n�	p�@��
����H��:���n�B�uM�
"'L�m�erI�	��ϗx�&h���$��5���8�
+���M��vϟ.z
����Cf��U�r�>�����F�Ę	'�
��+�b�5#��XfgQH���e��.x�1nc�o_uj�Sk
<�#���}
<��$OJ�yp����}�8�}��j
�w�m��N�Q�_��6+��r��ͼ�W�X*1������mI

r�m�!�c/ԾF��4لo��3 at 9X�����V�rӾf�~��6��Ay��goݶ�O0:�a
+�gZx PH��D�ym
|��&g-l<q�F���.\������ϓ.O�Ǯ�D���m�@�e at d�B����� t
+h�Y'�� 
�}�>#e@\dT`����#ک[:�i��bs���}s�]2t'o��ȧ�l 僢q�~���@���zNX�6��1I�x�iO�.e)H��ö&�MV��P�
ZdQ4f'���ڳ|��
��Ҳ�fB�
��'����[IJ$7��
l,g����t��6�!w�"��� ��cT���uyh��D��R3��$׻�#�x�Xܡ)��`_�ܭ
���J'ʰ��(�0
bj4� �@��3G��Mt��n=�GŘj���D��?����6I�Q<t 7�r}��D�K�S�I�{���ok�x`���"�C	V�l�0�����7I��P�V
q�N��0b
�
�P�t��V�+��~�w��-�B��(��\.!\*�WrQe<_w\�eڌ�>P�bʂ���ڪ�oo��=��8��24��wlϣ;[/ֶ���уT��-z/��u��j.
+tDb�M	�d�Au����3H͒���	�(�
+��WF��|�X^�6")x�T/�JN��+{9�i�:�P�U���d���tJ��/<�(|3�*j�+}^ ���G�G
D�W��X�ύ/G�;aP��w
+�6�
L��BbN^� ��$6��
ZS `+��-x�A��A?�].&�"�q��U�&WY�
�Ѳ�gvrR62��i���^jn}9
��O����&gSMj�d�5a�������n��
���]av��xj�foC�֒���u,�G�B�a��3�Ú\��vr�m/�>�;[�%G�Z��B5a�k{j`rh���ct�/�R�z��N�mJ"���g8u���xmv
�Q#J�
�����q!�k����X(�T�v���o����_ui�vO��v�D%G�Ї�0(S����#���BiA5�?��+	�m�2���Ĺ.ul4�#L]�o:��aӵJ��7#rAm�5g�H3X�~D4�y��
����9��ö-*Uh�٠�����"�;��jmcT��
�(��R��՝+��=&����&�(X[nC�'`�j�%U��@�=�
K�=�0���d��JR%��Ft�Ģx7��q��&��$�d�R-�K�ʦ�æo
œ�8�T?ظ�p]L8��#���l#'~cm�� 

.
+�W}��~
+�@wM�(�9Co�y	
���%����G�>
���(+���t�M�B
ڦ^�+Е
9N����bڄ����$���NN�0�
>@���$��hI�;��
6�o-�#ϗh�ƳJ�c��.u��
pn��(��5�2mB�fҢ6�!>��9[���K�f�����&�o�{���}[�\�(�g$u�:�!9�����͐�]|�䓍D��\I#Ȯ�
+�|M��S��t�~B₯8�)��Z�tI�C�I Kjٵ>
I�F��a?�R�
�Z���ͭ�f»9
+x�\2���<�G��n4k
v	�A
"P�`}�4eS%�s�>�O�GRd���8X��ͼۋ�31�YP�<6?�"CRΗ��͕È퍇Q���&�7ھ�{n��6������5�(6R�
e���&j�)�z����lNh|��$l3��њ�	,LdH���
�mD/"��J���E�C���9~qm"�kou��R���D���ʀ�$��B�Z��lL���A���H�q�S�����q�ttI9l3�������g׍�2#
+�FTr�fO�
�F:���썆
����IĊ����ؿ.1\�b��/��3
���A���Ih���
-H<��B��\��n
+�������"�O�x6q�k���E	�rEߢ�6m��F�P׈� ����������!���H�)qx�xh��<�R;[���\m
+0z)W�M��J
vJ�Wt�H
�Plʢ�z���2+`%����Yg�ms��0���L\V>�f�‚�����fҰ7щD7�
��v1Ӈ�[ݧ d�ȅ�.4]�*�)�^�ظ����|�:�!k����<��k�5��A3"����E�xm��
��S�CM_ �,M�O�a�["
�?�x`��Qw���A��BT*�P�M�

�kw6�:Xm�L_ބ����ت��!�d�&��BH#�R`W��
+a�H-P�\����dDGH�%t���p
XkY��&����
B���Kg�c���vwi�Q��T����
+�ޚvlA���3l�^*�O�$���
+��R
��,<x�mz�"����U��c����."��k�
Éz��e�2f�ߺ��l�
��x=�K[Ԑ���
��
D���9�:�q�����D*g

��JE1I�����Mg�-�>K����

������eS�P�H�l�� L�-�u�
S�bP�XS�� ���^((�S�� �XX*�*5f�A�'�
�y-f��):�)��ϖ�u]@)v��^����r��J�y�ٯ)Ϣc�Pi�p~!�X���Rd�jG�~�NBls[���Yk
��S0�M}��	��7
�I4(��z(���MGpPY�`7� �kG���XQ�w
+.	DJ���*�(C����zh�k
�
�� qQ#	���Ӝ1M��%R(H\š[���7̃��ZA�4���^Urw�Ds]��bm��#س*������-�
+�����
+݅-x\�R]W��
�8cz�}z�ͷJ£F�W��ݡ����l/���J���^��Ro��<u!�ۄ ��5��,�.߈�\�~h!�V�
Bצ�m��vz�!D�����v6��yl
��
�a�-4���P.WXĻk��m>�Q�

�iT�Dl��fo���<�49t��,PP�
J��F�>���z�xCҰ���
V�>,�����3�K�ɀ+��×3z�������1<P��ag��z�x�
��󂖉�8wQe 	`����k��nOj�A�rZ�e%
ݟj�A�8.F�sh�=�尨i^!���]oo$lT��;"
+�j@��y���l�a���u ~kf-���Z��;IeHnR���zQy�P-Hd�ƽ�@7�gR�C}g�EM�()�������
G��x0��"�i�kۦ�
|\����J.:�h^FKb� '�0��5�<�hȵ�����K>�N�S�:��=3���uR	~m"����Ŏ�
-E������T�*{; ;d�\�D���꯽lO�
�*�����>���hg��)>�Ճ"T=�
2]g�e��̐�sLF��_���͡宵��n�Bn�}ˋOI�:��|>
���d�l`�u�nA%ycF�r����|8�bt����k��L����z�㚧\c`
h�Bl12"�o�T��{G!���,�;z�a�$	��v���C�e���<�=ð�i����
��0�#�%nܜg�P�!P�G�	}7�5kV�r�cXl�Ŭ�&��O�kXN=C���{J��>�S{���|!3 
He�:���g�Rho�
l�jw�������P��pFtJ1E�­�@���#�|J�����������a��*�o�	�im5��3�]�G��<�&�
�#x�;a#��昶�j�ʢ��q������P,�� 1�ƅ��E?4��
�q�����J=Xڐ���.I@��4�l��_�Y�R�����OLΚ��fh�Ͱ�\gLk:��鴟�g��DB*��A���S��VB�
 ˽��ZFБ}�JO��Zm
���<�,��
D!QNL:�E�&������%y͊Tid9�k\2
+/����bjA���ʹ�$<�̭h��
EO�|AɬP�g�^�zۗ�ɩ��΁>�8
�lb>���l��i�u
�F���Efs�:,�&� N�GC�%�TtM=R��K2���y��7lL|D�6�9�|�*?��t@��r~��P�KT鵻Ck�	��\(W�@��X �e/>�ZC���m��3���J/"�XJpj�:�9e^O��<^J�Z���E�� ���w��s�*�e.M-Z]�:�6�m�T�]h��^� �eֺ(�4�P��ɚ7#l
B]KY���jx�P�}4��
+q���%�>�ݜ7�ʏ�� 
O���}0<�Z'�/h����ohU
�i��'^���"Œ[�
qҮ ���_�q�x���
h���
��u����}���M'�[�V02a�[�6�]3 v�M7`}�6
0C��~�
�F#`��ݹ�O[��S��
��`/xkkw,�� $
>@���u!�-x �� ��zC72/8S�
��	�:v+��v
+(1��+�1����@���
��&�V�)\fp��38�����4�
�C��
aV6�Bf©��݅eq���p�xh���F
��#v��f���p��� �}��b�c���!`�۔F�ï����Y����%e�?�vBC��
+���R�K�0�v���
+���Wl�X�h�1cM���7i���fc�ɚI
-*ی����U&�FC����j��	����s�r�^�]8v�y�ح��c��.�
{���xh�
+i�о�Mχ6��ݏ�dk� v��*
�<k�"6ǭU��d����f��
+��JNl
�U�ڔv���y!l�,�Ŭv"h�cuJ~��u�Զ�Ō�����կ�2��+�:�����F���tW�CjT
+\�m���cяwO-���㊅C�r�ٵ�x�h�WFa����6 ��k5�G\�k
T
�A����^c-�)�fS�@��j�Z��y�'


Y�]U7�e-�;Y
���B���Y
ޏ�����>�Zv��v��?fƮ�'�
+ ��s� �9��2ĵ�b"�z[a7��L�2��M�����Ӊ��:%~9��B��4t��Q�� 1�e�P!��,�6�L
(�:$K�;��	���E�Dp��ÌOs"�(��8v=�W�
+Gl�2�Y��~j��\^(�X(܈�>̒�*m
l
g
�s�����"/�-��R�����G���&����D.H at I��hE�WnW�A��*�sd�5g��&_ at f��9%�u�D�~`�H=�����%tQxd0-׋����L]=jՉ��-�M�o��y@��:��z��4� ?�^Q�Gi�$��*��_��-��G�����JL/�a �Ȁ$6����6Qj�%���Α"
2dC��:ˈ㲪�ǁ:�~�����Dh`���<�
+����
v����C	��,K7�Ⱥ���6��������b~�e�3�&���)�3�Q�J-
��4�V$4q+�9�2^��_�VZ�����j���
�#����6����P�8���ʤ���FƼ��'hCY
�.���G3����?�ox�����!󳭫��D9cg�̄��!e�B���w M~:�s��ük�R�V�EȘ�
��L�����z�-����S1	�lV"�뭤<�n�Z-m#���wi�XL�-A�	:��N#۽KN�b^*�����
� � ��9�V��}��>���$�̵=�6^rȨ�
�;�d�_=os��0��n�W,���\�fy�OJ�˙�/�vk�=�y�����tU��%�2�Ԧ]�����7�����ʀ�d���Yy���v8��^C�,l:�Hd>�?�0-*�B,�������Ԥ0\�7�3V�]R�~�Q
�
V�(����i
S��0�^_�Czb}�����DC��{̲~7���(t��o>��	�N(�ߛA�r�9ۿt���'�U"���
��g(Ϩ��{�(�Ա
����fq�� wN���c]��ݭj�+N��f����$y��7Ĕ��Rڬ��d]ўހ��}�p#(&"�+��qn��G��B�:sI�u���Q�V_��J)r���H��J��Z�WJcL٬�8K*��D�4��k3�`ɢn�{�u϶��Ml��'|��2�a��Y8�{���m�����T䣅��)9_�ڵ+)}e�� �� �g�)�G��3���*T4� �����H��ˎ����4�R������y�
?��za�>Ƚ���6��.���~���O�Z�{R�&p;��%
S3X�uv��]$�9�-�a��O�]���Y����|-�11<�������g��9$!e)Z�4
{��v���GX4;��I�O��)�*�k��A�L��oX4��;������|z�;^�����4�[
��Sx4O}�ь<�;
͕�>�h��@���oX4M�ʢX�߲hr��E���.)��E3��͕�>�hR�-�f ���7)} �
��["M��왁�>�`z�-�f��ߜ癞>�iz�-�f��t���>�iz�-�f੏t�+O}��\���4W���N3��:��R���
,��N�f��Y4?^
߾YFOR����f�i�ث��ě�y�m��
+��&&m�G�-��BL�5\�t�U_�Ԍ2"�⏎��l<�`w�:�F�5�[�(
ϔ�"��%�ses�޴e_���
j��|ű��~Q��k*�+"�+쌫�E+�ׁ>f��U��{�=��4�Zn�WH|����F �[�}	��i�E ��M�t_��E��n
+&ݨ�
+.ax�G�Ⱦ"�)K52U�y�U�5w�lZ�J������M�V@(
�_�~�U�-�d[��o���K"bf� �A�6�,h���a�
�xl�[l^�6,�� �[c~o�a��폾�8�(��NW��k�ڐ'iXz/WIS��M�WqX�p#�t��]P6��v�U
�,p	ҭ�
+ȡD����
ڰ��[��XpM%���	D���a�Z�jÚ7��O�Ұ
���X+��-��- ��'{(ê���\�)�����S�}oZ�W���u䦢����E����E�����ĭ�
�������M�ĭ�
�������E�ĝ�{�'�fn�O
V.�'n�\�O
�.
+)Ns�w�.�'��.�'.�.�'�]�O\�]�O\mY�Q�Y�(��Z�(��Z�����vQYq�vQcq�w/įd����M>"ڻEcѢ�g��3���gY@%Yn�����$˴w�Β�¢u>��!��]썾b�}��6h�H�<Bn;�E@|oO>��=��+�R~5w�
˫���`qE �ꕻ�
�k����_ޛ��X;�Gv�c��o�(_6/J�Ȏ����9಑
��O�n�by�ꎙ�gMu�;�f��?ȍ�^��rc�����\e�c���OB�֞dHo1ȍ	}�vq[��-
��ђ����Q�Ƹqu�'��6jc�>� �h�[�1mʅ���f��ڔ4��k�6�P�����*��m��Z�W"�W���jy*�U�{�A���ژHԗi+��(6V'�TX�gÓ�=T.ixvԽ�7	uo
T�h�qq����Fձ�"�"�e�� �IoD}�Dj�[K+∽>� ����w���
�,L�7N��
^�Q�
�i�pB$bS���bN��%zc�J�Ip�N��������H��_/�zw��W`��`�1�$]��8����TF�
lE��'�s��C�Y�d�-a��mz tN��E�R[iqR�ݦr !	Gp{D����45u�8�AH��Gzx}�B��
d��
�+�W������58xUo���
�b��Ӽ(K�C�� [...]
+v�&k���`j:�QE��
+�~��J$rA�ah7���c���9M���4JV
��M)|��§(5�icO%�1d�ߎ�!��B���ݥ���}����Cx��-@�&k|�����\_w(A�Ku��	�d��5�����/�
�mY��u*�-
�,�w�;3�\���������rn��ͤ�'�H�=���(ݜ�1�m��.=�z+�f�d�ê�Y�y���S=��䤨<'�_�;E��
+��ʁ��
mK�{�_��OK���>Ͷ�qYgG�|D�A9��̲�CI���KW�,9���d�"3X&7E8g3/��Ź�^E�D�	�^��
+?k3\?���퇭"���˄Wv��'	�^��a�
�#��of׽o�)��uZd9�rP����D

+q�*Ma����+���
+Ƈ�]��7r�|é�Ed�pѣ�}�
+3�>.�LL'�T!4IS�^�3��9m9�A��ʒ�|�ZS��mg��(�3�����{����3ۓ/tX�N�����
+�g�/�D�H9�5x��:y4���á�YB
 �.�=يX
+<I�Y3��$mr�C�y�4���<�N���_jE
Ձ�I*��ʦH9V�A�,(!
�0�,��Y4���B��ï�)V��O;Ѓ'.�S�@�
���-��Ϊ�|e���	�o3 )�^48	]'N�&�=Oe�q"��ܱY��×f⢇w���m{z��W:���K�WON#1P�$@�y3�75By�"�st+��T�Q��P�Ӣ"�j2{���X����v
���v.�w���~ۑt�:���|�t���5��m�ٗ����V��s^�8���߹+��z�-�oV_��/�j#�Q�"<:�]a
d��E��
��D1����ڛ�����
��M�oj��>
ipۗwb̒´ӟ.q�4�C
o\/Pe|:��P@����?��q9�
��Od�`�
�5ss�����?��:/M��?����_���~��?�����W���S��GP{�Sf��3]]��<}�=�ϐ0���j%�?,>�t��Rچ��*�[jb)�4�ҡ7CØ�W+�M�-y������a��Ӭ8��W�SMN�mkf>�(�i�Z��r�ܸ�L�1���
e\�i���Y�	�%��
_t��)^�X���܃I�ٗ f�tB�b����yR�p`\��6�[�
+2�M���|&�
+��:��<���£"3��G.�����|I�%��Tzf�޺�����,����`37bk�${��?�,B3���,L
�9l[< Z��r��
�k�&ڻ0d�w
���던��Ďk��@I�u*~���u��ur��	�8ZQ	�T�)脫S�)
q�C��}��WM
e���7쬮"dS&��0��|J��
N�>�
�r���˿|/�zg�E#�)@״~�s�Q:��2�L\�dy`��d���X|t�n�DV���%Ȓ��J$���zɔѶ�*T��'��n�,���V�0�Ys�
H_&�Y��|DHTf�9��O,x�u�I�)7A<��ZT�b3�о}誖&i��Wj.!M��)m��ᐈ��
���S��:��1�ܛ;hc�N�6��I��yM�P�#�	�I�R�� �Y��Qf�Җ�@��k%7+�&�u
�Kq�嫉

��Tu ���d�#�b�5:���iЫ�W�es^�L�ڂ
+�ф
��2�1�u �,�����ƦEc�.��t��_S���W�V_�M���PD/�Wq��bf!	��������]`'�i��DT�
+N��VB	�"�H�6��M�ܧ ��p�"�*�@�nj�yg��!�!�T�T�
fIK\
+DH�C�ɦ!n�\�(�k��\x�$�c�
��x������`�%v���9��˩���-�w[�d�._#>�
x@�Q�T���;�cx�;J�$(B�bu4�I�
+I"��L�L���42d�
+��|Qѩ�����
+%�dui
۩���OB
{vZ�n�cL��-I9S-�
+k��W>
qQk�+q��Q0+�rx+�/�]�K�1�2t�a��cӒn��ty5���m2�H��9�Jl��6���}�@�Q
�&F�H�����jer���61��2�u�b��ήJ�4s��P��"�D������/��7��(b�������<�b@�؝H������:'��;��>������N�[�O�}
����Df�}e�!1-�pJ0�� �ѓ9g�&��B� ��r��+#vͩ��N��Dv
+��IE��2W�'IN��m
<D�]!o@M�,/Ax��
N�$�2��^S���>RS��D�� L&��*��$���F	��UV�{�2�(V\�����
�
�����}�����wǖ�dg�R�ۤ��u�7?Ya��/4}m',�W֦�� �q:A%Do����mb^�M�M�[
�7�`����*�	=�x
���Sa�HA���O.s�.i��9�*���P�?�%��c�غӤ
��$[õ����Z㩢*�
����?0�	��W�rQ��:f�t�h�LǪ
.N	㘴pYOb�}b;�z���C"�ͩrlG�z�0�l^z�`��Y�>/_O]��*��v)�I`������L�Z�gA��73���%�!j�C#�{	#��F�w������ژ��ے`8�
6���Ns���J_b��Ф%��d%ة�Ba^�Ͷ��F��

Y��>�46��B*A^��͜7� Wޢ�J�]:�H*C��n	��(�e횗�o�����
 ���@�����5+G��A�Ϧ��=J��e
+`�֝��~�=TŁ����S�G��3��
�����?CH��
����
���0�xm��TR7��::(co�PcUk�j)!˒@�bc)b��pc�կ|�hߕ��8���}�N�2�&a�7B
+�fR~rd3��{?h��j�F�k輢f��h���&s����;(6/�&e�8����Զ
�;��׆6S��-����!���-�����	��U�M�m
r=ױu�a��n��L!�B[���tk�k�aE�#і���NrU)��ȳ?�`,
U��ˆm0F�X��!������	�`@#w�&&�l
�
��������
؄�aP���Ԥ>p�N�[��5������$�Un��R��
�7;��<�mv~����N���o(� �
U xyc��LM��ձ�}���IWI�^��P�b��X3�&S���O_�#b��Ј-��V4�cR(�ĕ!�7r�-�#1�Q�g'��$��)H�f��7��Y�g9M< #�mΣ����]L7rqk��>���}���&�Lc'�J��MRCG�q��D�ݽ�%jNu�H1dR��R�S�զ�)
蒴EC��Yӽ���>G
5��,)f($��4
��a�<�!~���~�,?c���
+97���O<=�������4;���� ��a����Ǎz[}����� �hs�bh�O.�F_����{m�Ǽ��_��r��U�I������j���@+�M���`.��a_߶k	B��$(�=̟��*�Ta��94#���¦�vP��1 �[�F��_UHi�t��v6����W��CX ��^m7��.O
��j�1iX��j�$Rۉ:

+�W�ѭ53ǟST϶:s����
+(
������l˰p����� �������&�h�vkRa��H��������+
+d�-2n���U�%|�D��l[�_�n� }�%秧


у��{��O���:U��<�C�΍.�}[��<��ٜr�l�E�}3����$����c%��uq�Y����A\ ×l�9�x�7���(�̳ݫ�o at d�J �l �.��"�:h��xZ�hW�"�!ј�{WÀ�/lN��x�E��@�ȼ��O�zn[����j"u�K��e���Ւ�}V��\�H%ہ���x��
��S�\{��6ͽVC�^���͝��߿9���� �
�sZ����B)�;�me8���m��g�اr>��8�M��&f��>	�O�@@~�H���L�,5�hamr���
��6��c�x�y�	�E����I(B�j��vn��́=B��ɷ�xЎq��	~�
(" �@3yt_`
'��{�L6����u!i���Ցb���X.���t��TlM=��'��)nb� ��$-�!�
]����H�kye'ZI�������=g(������LW=�TP��I#>O����ޜgq���p1�R%��+� #/�P
��;������>�爨%
X–�,Ӡ�n�L��������K%ZM!���nF���"ha�_�PL�2�⓺�
��nA-j
�A���uJ�a��!e;$�vB!�PX_�YF������#a�	OH2������Y�36��82<v]�S� 

+��,Dp�����O�>�8(����YLH� 1�QlP�jM=�
B^R�7�-�̤E�K��P�Nt��@UYa�[��;;�A�+��ΧH�2. ��Y�x�C26�
:��$���
�S�tqy �u'���J���z���dR�R	�%ս��'�7h]�BY�Gƪ��[h���֙i.Hى�Ї�S��y�f�%��d1�#�S
+��%݊�

�$n{��w&�M�����~wB��Ի�
����a�X�s��Ү�a��A�
%����aw7�Ӛ����hӣ����2HQ�E�5��˵�����d���)9l�69�0��y\���!���BX����4;��
���*�
+&��5�
[�����‡,��8�����f>��
�FߧDɠW_BB
>�l�b�r��Cmbf�א�����o����ւ �k�|�ֺ�T�
Y�M
�����j�@v��#����f4��p ���Q�S�j
.��	�G�9h��4�0�A�]��B�T��y�
+T��0b�LaTx7kU-�ߵ:��u��^��KQ�1'֒�~J���83��f��k�t�J�rk\lk�6.ص�_�K�8nk	:�8K%{�o���u�
%��o���v�
%��it���ߘ��&a"D�21
��֒(E0��lh at ul-�
+	v;�IV�`)[w!�[�� 2�O	P�7�M ��(�}�3�b���X�
G.���
`P���v��.�
+�
+��o'��	�
�"v��_�u�N-���C�2�)V�]�L&V/�2��m$t
��
+)��؊L�u+�1�+F�
Fl��8j�s�g
�W��>�^A��<+�5����"��ژ�X��1��b|���+
�*n
R3+jy�ᙘ�5?��1�4����T�j���
+�	������<��p}����6p�!� �wr�k��s���5/��Y�����w�CH��m8ta�
r�߸�Ρ�c���#!�
:PB�<�ls��<31�̈́
~h�� B�N������vu��]��¡*�Z��#�J�L�r"L���+~æ�RD*�j#"���hCk�H}*6��rr
8+�q�s3��")K��]�R\c�I�'�y��
տ���ǵ��^+\�c���Z�������pex6o�V��+oE��+��@=�t�o��v������`��ZU|��Z����)�
+f|Gk�o~4A�O�z����V^�g�n��Y˾a��q��o���*XK�q
�5��x�U̐��_{3q�ϯv��f`%���Q�{�T
+o����jBE�y
/d��	
�q at Om�Mj

�e�>��`�b���f�y�bL
����\���d�?F
E��ߏ�x]8����*׾��u�O����y⛻�������wS'M	2������M�_>
4c��ݚ�����TE7#�~*g�
~~�M��Q���z�p`���3��<
+֊7��"hĨ���mNQ�䚉h�'�W
�&���G
+R�%`e(�o�3�]��w���C[3���
+:���������
�+N���ă�S
�A��X�Ny8�j~gv���W���s9>����}�����.[û�e���T �K��ۃ����Hbm�?G=v#.�t;�7?���z���yw�߬:83��b�T�#g�tb�.�����n*�j�jL&���Y›
��λ�g0��Q6���3��9	�o�Ѿ(�P� �,�F:��
+�2���1�ZO;�/�g�;�M�g��Q�/O�0
���2
��	��%wR��Ѥc���$��E�9�w� a��1�߂ 1U�G
�l6B�JJ
+p���X;l�	şy��!�����@1�I�O8��Y|k3j
�S����@!ۖ�����9�-'� �� 

+��Q\5J,
f#K'R%e
x3d
���e)3 �`�OFY O6ub��=���U
�d���F�D���58��TnͿ��s���G�

�,gɞ�
��	Z�#K��Fd��w�5Q=:FB���@Ǟ��EoE�����" Hb��~rq�M�é?4|�:\��"�\��V�\�����lƛY������<���.x�ܞ-�V�Y
յN�|	q��jf_u�ۡphY���mW4�bd٩�B�6�3���uӅ����=�ϭ�č#n���Yo"&S�H���@x������k}-r�.��;e��F)�
�ﱋ4�wKQw���eo�M�j��{�K*��h��/�Ha�F�d�”
Y�/h��$	
�@�b
�ʣ���V��(޴��2��
���ӝ0�@���e #.N�_��
�^��m��>�)�L�������N
+�]<Ϻe�[	;���¾}��{�op5�/
��A��
+S"����
+&4��`�׉}�����^U�g
2<�va&��A�Q�P�B�}�N���t�!F(X�^
�&�&����������p�ӫRD�A�d�ܞ9�T�c���z?Ha�eQL��$��S�U��؜�ι*��d�S2B�5�\;�9�j#8��A~
�-7��h�l �i�6K��ͺL���+��m=MW��'��H8tu�d�l-��ѹ��

�8̡��.Q�����3f�.R.�
+�'����8����#y���&��t<l*��Y
3IW3mU�r�F�<kq��*�AW8�����螛q;���$O �\�d�Iz�ua�$܂1��84�
%E{�OhQ�y�4�~�qâ+M�yOm�
Ʒ�J� ���y�nKLH)���l�T��K�:d�1�7��T�Y�����̂���(��ޮ7?�
�S�[�R�/��K�H�vG����K��&���-��fήɓ5��w1@�O�  �"搖�:�+��4��q
���Dͅ�)�XUm�^m�K�
��+��d���tD�
�
[cj�T�u/�ڨ�>�I�8^Z�
y,VQm�f|�K�q9�]���:�u.b�<Vh{��I%k�K�%��&͙��w�H��
��"���r��k�.^����*�h���r��G�pXϩ@_4ǒ�T�
D�i#y��
���
O�ti�W"?�M��i^���$@,Y=�޷���P��
+gڨ�ɨ�^�#8�l9��=�!����)rW!��:���l�d�82{�yΔ+�
+�
`A��f��bON^Ze���9���&ۣ(�
S�0'�^���[�V�T�+�����)���������G��ȣYd��Ǩ�ʇ��-�'g9ˮp at C�d�/��e0����Y��\�(Y��
N���
�D�)	0 U�hR;���9O�ķ�M3>�v�j�j��A�ѯ.�dk
+�Ss}1 ��ԩ�_P�HجJ-Wn
�`�V�1A��á�w�
��w�
��⁂�2cQ����A��'����Q%J3G�γM��I��\G3��rHC�
n��o�������ٻN�-���(ۻ��q���y!Ŝ��
+
+s��w��Ѹ�v�n�=;��U��'e�L{7��K�e(�	'E���>���]y��Ce��r�������eOf��
+.=n��
l�r�u��“
�.Ԭ
v��]�d?,��=����
-��C�Y���.UM������K>�%��"�ΏL��i�<
�t�_��+~j��ڼ�b@E#�0��`�jô(��07��9.Rv$�$F
k5`�!���L�vdB��duv��	�i7A�y�]\{��u3����`� �u���"��჻��8�d[~ǍĢ�C��FQ#pͣ�2�.Qb��)�-�s�2!t�#��;-叟���I�
<���^ua�wn��LREG��<5`e��P�ux_�@WO55����N�XE�0}��Z�=yM	��ފ3ʏ�H�ϗz8��~��_�]ž	�ؓ�a���L
+�7��;C���p��<h�n/�^��7�ѥ
 .>���U��wrl}#b9q`;"����*,�H"YZ��9�J8����­���:�IM
^�{�&hS�<
�_�L���tyi���y����j���[��c�K�d���P����U����,�����9���Jx�a�~�{{
�2l�a6ču3���
�f��������c�w2\��O~���������O�����'�w?���~��O��g��'������zr������_���o����'��o>������4���O��
j
�����ˌ���������p�?�������_磡��Y��`x����/�j��/~����ˠ�^�
��������?���_��'��3^�}����_��'��o���|�������|��_|������>:-��?����O�}Ǥ�˿�I��w��������h�~��߽y�_�b��G������~�7�W����mg�����?�?��_�l������~��_Ϳ���?��� [...]
���nTx���]��Fm���/�k���O?��LML�~X��7���?��oJV�Ͷ����t?�

\z0�r��@�r
Ĝ� k�=��R���ms��r����/`u�,Z
��Z�c���B�/h�2��9�������,}X5{�
��d
+�
����"�_��-�o@�@�l
+�j�d �v,!b�۷!���F�����{�D�?	.oF�
" �~J)�2��{"A���>f2F����M*�;�#n�ܶq�`�n�
ȋ� ��+��5��q�&p>���x�
��o�)��8ЅSmVܠPI(�O,
]`'�.���.��t	�K�is/
+4�y?�̀� ḓ�E�|��`���WvУ���ȩ�r9xrq�:�
+ଣȝ8?�u 	A%�L⧪�W�ՠB�
�A�X��ϡb�şS���x�(�֥�v<Nߡ��U���Q�沉�4�F����~�bPcj��e"���t��ژ��N�'<p�P���P��:����(`�E����H\��N����:koN�,�
+��![u����E�U�IP�
ѼG��X�7

 � �i9ߝ�]BA4#��W����
���\]*�j8p��+
^�3ve$��
1��
+ݣ��vC��aTVV0�ܩQ��Ak1�#*o����֛�&3�/U�D�{z�_��xt�0�&D�
��
+P����u�V<u `�D��$(�}O��[7�-Hs���9���O���1��Bg؇�
��*�ջ��,ك8��v&�ǒ4�+��ȟ�JSs��o�:8�*�XQA�Nqxq�H[�� ��0�g�}��$P�8{=�;���
��P_�&�}�~�,�c,���`h8-x�t���\��d3�As�����r�6��a��p�����s2�05,ڦ��[=�p`��!�]��+�kr�|ŋ�O�1(aT�	��EHi�}�Fx��
%�wy8l�FQO�(����K�ZN�a4����� �[
Pz�B���)�̕['�(H��Lu
�`'�FLϡ0�r̚:b
��|��#�!:Y�u��t����ڝ��)��h��r
)� ��㺋�$rw%M�Aۼ9���͆��'S�*�2�B��[ꁣUkE#G��&^�
�Ҡl��
���λÛ��S���-K
�/��i���H��
@���N��� <	
9f�������[K�6���v�
+RU#�n#��hঢ়� �]���Rq�S畆f�ҕ���FѲ��
l���#�ڈC��0����
�]0 
�����eӃW���0
�*��Zz
`'}����J��$�x��$_�����ag��c�2�t�z�����4�ʩ��4�)UT ��m�K�cn{F)��f�G��]��

xkb*��`;����xAT#�E���B���Q�Ql�$s�uI���M�OU
�O�!��/�v������5Y�iJ�p���rȌ�~jVC��a��
c\�
�}���[�Q�����Pd�T]�"�ST9q�(��|���ȝ���#cw̧f�	*9_D�:$�NR��As���
�E	��7G2����z��Y�v�|
4�d�l�%��[j��!����
�L�����%n�Y`!���mWݳ��Ĵޟ��cɯ�wܠ
��,��~���fwi篒�
+�
Χ���nn3RM��R3%x[����	ز
�+�~�O��WZRv�H�KE���>�*|�9�rH���g��
+R.�`<�G��5ͫ?&.]<%���2Q�
t�T�R&��HB6���֨Y�LK��&HG����y at Hhlt�iFj0���N����	�@Vk,D�ty��}���끎��17�p����= 8���?+�?pIn�M7�B���;{�Sة�Io~$E��R�d	�K�{����|���Ix9l<��+в��S�[�����D2���OM
*
��~�� ����C�0
�H�wr}�K_���Zɩ��
4���p^:p�r�q��O�G]
��9+.}|�d�5��
�`p��2p���:v@�?&�r�
�!<����!-��,����m�q��"�}��u3�H����m�U ��Bm��`N�B>�
���O�
�o�0��$��W��ڤ=ա^��f�~���Y� x�h8���kZ~vN*3�OCì�ӑ]
��2�ND��[́��ToD�S&#
[!&�F����.y_n?Ig)Fq�k�־˷m:�e��� >b�"���ԃ���u׾�
*ڝ�'k>��
+4�
8`
Ђ
����w����>l}�z$�Cf]�}�Z����/�)�<�
�2�+åԈ[:�mf<~��E�nlJGinP���� ;�u��K�l�`Ϻ�rv�	��H؈0�
�z�o��%s
"��賦m���}b����L�Y���	��ԯ�c�j����p�p�*��t
�?ݘf ?I^�	hui�:
�]��d��R�s�נg��(�
�$��†�d�\��)�ZX$:�
+,���)�&H)̀
�Ќ��,E�D@�`d��|`��4z����'� �s
�1�,
+
�Ћ��Xb��~��C%>v9�,���%mnR�׿yc
�������`9p4Q��tJ��,%k��|�.��{��K�����u���c`��D"p��
\��a���/͍��"��q�. W-����@<O:E+@�B+əZ��'1<%m��'�@�3���+���V�Sd��T�N%
+:�6���"r

+�� �x���<�$�|�z :��,
��9
��O�_ �"B�-���
O�C\x.


+���M�(6� pFXDl�����:��A�»S<�����#�)��'y{��ss ��\�ӭQ��
��t��I�]��xn�|
��<��<��_��4� -����W�Ue�
��7
*�~�TA�X��m�0S��-b+�f;m����.��h,�A�|�N��قZ���+~�
�^Ё��:r�t�;YH?����\�-�L�X����%�J8�"={�B-�1�j
��!�_cl�p ��
�p������� ~
Ϛ�_uM��xd��[h.�J;��4�t�8k��ા��
%%�B(���I���5����r�_��w�D>P\�}$�r���fAu6x
���G�Υt#�"
+���"�j�L��{,Sx*
d+Ԅ�k�#�R
t/�t>2pi!��8�
+���G���W�阻aK��j����Z�B��g���v��f�͎�ݦc�
 �{*�C�m��z�ӏ��������hz�`$�ݻ�%I$B��<��_�:�~f�}o�J�zc%B�4_\=�{�1H���v��>�� �K�k�|�<����ٔ|��kN�L���P,;��� y��
��A}�+�
+6R���Ƹ�݉�z�1��O���O�n���4P���@${F"���������or0h!�!ȃ^����@�d�&ir0�|
+wFՁ�j={d1�~��$��Q��X�Pg��X��F���X�Q��r@�4�4'���D��v{I䀏#�	b��	R ����(�Ȥ�G�������	;|���n�i�9��$�L
��,�j�>{� ey�D���
�6��q��%-~@Dd��>H�Gt!��"���������7
�
�
+�Kj2�P�^O�W�\�k".2pɉ
H�;��>�i*ۘm�u�|C۞��$�<�J#I�qy�}�r��&uL�&qXVck�J��^o��٠<�����v
4�l=��42ݿ��8�RI��`��I$JYw5�(A�t��4����He�������[��vh~�|��24ŝ�ґ�E��t@�/3&�5��>
rW�
�-�p�;�|w���xU���P� C��_Ć�=�E��6�Az�������˩ ��ED�SA�mq���,H3;
+c%DGԕ�攠5�o�A�7��
L^:@��OM�	I
P���L�qP��
l�
GB]������43b.`:��"' ʗ4n<����AQL��!��\s�
��p�1]U������|3�v�[
+
�f�*1--^�J��X�2-8`U
Ү�D{<��˱̽fzm���9����JmV�$5 �̔�÷��O-`*	2�gfBw]'[ lm��t%[Gb�e׀��ĨxR��2!7�!]����Le�k[��T
�rM�E�e��Sæ�l#*U n%���r�Da1���ؽ�����.��O�E
W��(�Z����s��S�b�����>��lb
ތ4iR��<[�	�����l��**�"��
+3Yw
(��$ dy]3�����T6�
g�P�8t
��uz�|ٌ6�C�ޗo#������'�=��Au�!��9�U�ڵQ0h2���ƫ_��:O9��;�O� �� T�ڠ�S^������^@��4�JRy[]��܂���@�~ݞ����y>�KI�<q��^�mh��)ݛ�u��^IP�ǘ�Dd�y���i���yH��u籜�\D!����*���A �*0<�f���
sQ.q��o=��2���I�j_�.i�"�A/�hT��
+:<�y�~��Q��զVag�CM��i�추�L�s;+Eߡ/�S���]�d��
F�-ɠ"��S�;�
�w��
���	���){�9G��s�:��:n��g4o�n�;CKe.F�؈����
�� �`0�.<�H��^g�r	��*@�kFf4)b�!!8	L�����yZ��������?y�HM
h&�EboT;�����Y�uF
\<
-�Ҭ�N,��:��r�^rL�k���Û�g�_)�cP+���@&؛M�^�ZU_իFC�.r�f�l��/���v�g���Dک��
������
#e��;@��
+�9���
�����t0��"�8���1��QQAKR���
q�F�B+���5
P3aD��o���yx��I��xA<G�1t��
����܆u6��-��t"�x�.(˘�<��6|�b.�%M� oǀs{LG�_^z;ɫ\Ng#n;)�;<w~�X�T�>a( ��Xaj���r��)��؀5
+R��ƅď>e��:3�+!�!��!m�0��tehb�G�Ɍ��
�|��C� ����n�b<6����X��p��G���
�N�͕]����d��#
�H[�$�
e<�O���w�ҺO��п�\;K��H�Pd����u��bj�(b:����.KZ�;��S����9υ�s��$���]JF�V|\ȷ�;�~(�C��:�
# �br(Y`vi�fN�rLM:F�)��x�f�BC:�+�m��h�%��sZxI���D�-�H�p�#&������I
E-�%mjċ�K��d��h��N����%�3
�i״��Ð�_ϒOi�2��<�2���D{����[�FB��c��&"���]�,���%��{b>���)0�bx���܁�J��4p �4�3��(�{�Nib��ϞuA��h>��<،=�|H8B��0���M[�
:��(1^��' �!BBo�VR5.��&������
+�:
+�/l� |�,2N^�`�8l�
+tQ��g�T��Ԉ��K؄�ےl�9
+Ve��1A5>l��v�SJT}}���̆��g5X\�f�S�47lO}h<b���y��/�F��I�e��.�d�z�4`�yf�8(vހ
s@���<��^ue���S_��O�x
����#P%���r��R��ꝗ�
�>*�9|T	�D��I�4��Us��:l�N��ٰ`����I�MH�x�%��U��<�
��Ƃ`��q�_��Q{�k�րˉ���.\ā� r1�6
g]
�WtnF����
Z��m�F�և�"�1
B"�UkuzH01N�4\�CrI5�؍�C-��!s�y���b[�PgO@�Q�Bf�#V���:�7�o�^�KlJ��5	��G
+0�x=�R��
����6Ua��0�v]f:}���P��-����y4M�1��Ai��$!�C��>5ȑo��&Ԑ�J
��(�G�P4p�����$�	C���
斑 ��Y��/�Do����мA�
:���5���K������(����͓
�r���[2�@:� ��O�?�� T�� �3
+q
+(�����!vj^Q��i-|c�T	;�[�8�
�G�P��V�.�j���l�Ku�s��b_np�鞻��[;'ۛFB%�%�D�{�ʎH1��s�g��@оyc���@D��i@�
jM�!�6'D�\�R����-e���{�9�Eh?5v��!���� ���j�Ȧ���4ϳ�͢�
؞B�KB��q�6���Qڪ��N"��s�qi�y
��t1}�c^�^�Јz�^�KF-�Q��@�o�]�^P��b2����q <�
D at l
c�+����(gK!;�j8/�y˸�
�
���C��7擞� #����S��^�l��2@�i�%ԙ�,�L/W#y]�D�>�^��]
`Gkp-�
+�+@�PQ��I�A�T�}�p�=F�
F+��
�W���
+�.K
Iф� �}���5
�>�Uۍ��Qo�
C�"�B����aR��U���v�4JH{;(�3u���� NV���^ҳ�������>������y�e�
��6�����͋�bH���IA��`�!�8o	�sݑ85R	���`�$���]/�>�
+�*�(� 7�(�4���l�3
+1���z���+�"��Wy;����@���K��~ �P�2���ps���ݴ��:a�2�
M��pbQv׫�O##¾�y�*�i
i�)���Q-&�E�t"�	�d��Q��
��
B�g�J���
e|@��f
��
{*�]h��F��MS���l+Q)|ش���/$�9�2�������Z| �Nh�Œ��
��l>'Y[Y~��P9!ڠh�����j���l�)#�2;�[�|L��ᡬѢ�zS 1
��ͨ�;�z�å�����-;�A-~��Ş	�<�6�Z~�#���ݎ59v�w��<�
���q8*� 2l��:j%�l��G���|�E��*w����й�
;�A.���ĚƱ�4r�OfUѝ���ƙ�>RQ3�����lC�K\�(g}ը����&X��-�R�d~J at 1L�Ud�B}ҹ}.xG�$���蓈(%ؚ���g?�%u
��&���	$ ���Bbt��[����-�U��Hz
)�X
}:�H�
UJ͊	��'�0p�,�L$9/
�<�
W�u��1�|c�	���գ�A���+W� ��0mbbRT��0uz�9*��p��N��W��_��)8��o�
�O�@2�3Ҷ���S&痐���>}n.9;�@%����Z,u#���)I [...]
ت������~������.���'��d6���}�`�*��bf�4@`�z�
٩. F8z�'?����o���Ң�r�

���0�k��n��h�1w|ٙ��xuZ�
(U�,��]6��$l�HB�q���d-vH�*󇏾��VVO����71Z0

Q��B���
~a�۶G�Ô�	��[�U�#���v���M�',����(�Zv6�7�P�|N�#B
����|�g��s���L=�hԽ=YJi�f�����q���`�o���B�~���P�r���O%��{I&ca��L���#	�B����y��H��e9JϩzS_L�H�0K���"p@�=O�=�,�æ�
����3��z��\
+3@/~��+�4�c?+��"��=��H9����'��aX
�'�제
+�J`�f��L@}*���=@(B�,�?�����:�aa8������n��i!�
��%N�{e$�w/H{ыL��Cl/��X5�m��ƾy
O�
z,�]�P~n�(i|r���ث
������Fy����P?�z�0yk�L�ڣ_
ft
,Q+�D0>��P9mxM؋k��,�q�
�<�t�LV��\諆�z�	�0�zƈ��� ���,��AN�{݀�J"
���,���K�Fʎ� P9�`d���&���p
+3��L�#u�$
�
�y|n8��7g����*��aBLU�(Y�%Bʙ
�\�_�a���覉�a[�4�<�>r}{����S
�R�Ը��p�w�@��{y�g
Y�'��w�}�����ݽ�aI~|�v�����u�kQ"��$�g
��gw����V����aw�$�/ꍯ$�h{�K�ɽ$�{�ꗓ>���ܸV�i��]@
;I�K�B,�bހ�
+���G;%!��b�ѧ�݀6M��ů�b"-�UnFIX�l���j�dW���b���<�Ov��$��u큗gٵ+Gfus99L�HX����
���#{
Y�%qAQB)o
�?����M����a������(�j���ϼ���. ��8-\� Ie�.�
�qi�c�C��y�f�8�����S
ܗYɝ�v�_�8CZ0+Ȳc���/] 
�Z�#k�ɠ��>i^U��e���!D[&ۍ�o��r, ��,adD�f��^��"��*�`댶6�
�f��(w��\��1
@,.8m�J��_�־�jb�z'�z
+�hs�x0�(�u�9�G@���1�|�˻{������t��s�$
���a~n�1�!

d7\25ht�`*�g�q� <��^�+��!\
��K�NA2�əb�uE,�o�4��&@o+
x��M
��j'f���ل��G
+SRb��N�
��`q|;�'w��}��q�Fb�F
*4��T� �
$A�/?l�;��}�x
n��d��T�9A�K"鞧�7�3�a8M#�q�c��>a<���Su�}�,01��D|��9xJ�_xf
�"�[������D��j��t��'��%h�l�����T/a�F�5
�X�Q>*~K�nH��4,�
F�{,Չ����B\���+���~K20e瀺�ކB(����8/S�!���ީ����:
+�H&&z��e2��w��ª
���:�Fy	tC0j�ZC�}���SH�dဩ
bv����e�h@iI?�� _�u�m��X2���Ӻ�8pꫦ �L1��g9C�`�N��'�/X�e��PB��Z�8g�^�0!���
�.�e�=��5��BpYW��C�s�$*.Q"�hU?�Mb��>Kj�`�o��5�2��Z���B� hH��\����s&�|�
�ߎ�V��D��lX7�Iy�r�0*������TG ��ؑ@	�UG��g_�>�f�j&���!8f�<J#~9�4�h��j�=�ؕ�,L�;
n���!��R/h��T�恶�d��3O�W��E��f��<|{��s{���'_��f�s
�
���C � *N��F�z5�;@����_��X�d�Qw4�L�8�J�{�pǡP���h�^a�
sd
�&*O��'�"������{�D� � k��9X+��7(aV�I�f[�Ix�����K�&D�'���	<gP� �(ϡ
�&p"{�!3� 

�Q��T�:��A�-���Aze��J�J
+��{@t� =��+SC��Vq��d��ORz�c^3��C�1����0+�ԅ��+NC�9V����.�����2~R�?�Q�|#�{
0"����<�e����!�+����f�p!Da���{�$��s@j	���S����D
�f�P�~�Gp����M����!p
+ڋ|�!ڎ� ��I:�`�$��z�Z���j��ё�G�d�ڱ����5����ޘIp�+z��ӣh�!�b�
y5A�~����>l��ZeS����wC!D�s:"T4���,'��c��+V�{8
+Y4ؘե/V�
�[�
*6DCi6�0>��1°
+L�wK����M\
+�8ʌ�<hP5{��Z���A���
��>B"t}�*�����ɉ@B�-7�JToN�-�pbB �鄪Z��01�0��X(��N"�'�&*�,
���Yt��Sc�u��o1����a��Y���p��\苰?l*5P���m�ҩ
l�U�ɉ�|��.���pSIQ��c~�1h���B�%|��H�P��9E.
0 �d��=e�e��
vz
�+����[%�	)�*'���[��0M=
<jB�*A�#� ]�� �i�����)p�oA�Sr#'0�
	9D�fq_���]��$H�iX;�l�R3��z|YA	Hx �<J����7Ud[;Q�> n��.��Ա���.I���0#:�t;�
>�h{����
=����>O�:M�����KKk
A!��g�+P�cN�G ����Èkm�F��H���= ��}� xb��J
L	�{8G�
a]z��^��P���-��7�3��:̈́��w���֢HŪ
6����L"�
�{)��	��@I�$߯fQM�y.!��
��?{$�V?�T�.�t&�4D[K˯x_��|
׈b7�ȗ����

W'�rI#Y�mvt�n�Y� �d��
�����^�
c��J;CVɱ
m���e	o�@����K�-��
h���ڭτU
��"@�һ).m�E�	�
#ql1���9LV��"�B3]ƭpB؏ 4P����3d^�"�J*���
JSw, at T�8 r��]_D�WI�N�^s�>�N�
Ѕ�դ��5���y���^�`�r�?%V�
'
�W�
+?ϒ�O�&�	�D�GLȔ
��hQX��h�Sg�h �D-s��L��r��O3?z��,����$t`�N��[UOP�P������	�
+H��|�p
+^������5�ńw���`!�G-��jd"8�
$�Z��-�7��>֫���۲�e@&��j
��Sx��������
��C���9ĻEE
>� ���<�a��"6S&Qt F�X~�v�q�6QCլ��r���L�>�,��L�֐A�>�m�q�/���4x�g��?��w�CD	�U�q�$C=�ˍZg�bg�+��
/N���I�VX
Q���)E�q��iն�&��V��":�@:�2!1���!O��H�"��+�У65%�"t�r��H��
� V��)M�������#f+�pC����m��ff���x"�5K+M��X��
��#\U)
+��}g����Nj�
-#��L��g�����q2
]U	�r��t�^����ҥ�	��8M͏��N��W�),�e~� ��y�����&�gi
��8l�
�x�ңÊ�G_+��!�����=H�s���c8������ٲq���!Ydb�
*3�
������:��
��
+2����;����g�e�!>�>I.6?��e_ŻG
e��eP�bK,�VP�#=eW
l.ײ�{�
FL�͹#
,DU=���'�d���=C�%�e\���>�Tq�!��rC.�E�
+��Z��Odݕ
�j���@I�
9=���6Ү>!c��P����	��b���\aQfZ@�zF��:d�F��Da�#7
vF�8����q��� �]��Z�E�L�g�-{���I�c�Xy!����8�y����h�h�T�F�8�/��]� +7G�D�5
p�
�
v���Xh�^Oe�c�?H�����
+
��I8����DY\"�{�����D1��>>
+
+���
�û��
+3"�HX�� ����v�Y�I�vbȢ%n���N������I�}�=U
+4A��������	�^ �{��^�\x	!�qti��LxAxg�l��$����q��Qn#HEeH
+ݎ���#Cr��']-�0Uf��x9�;r�N:�)1Ԥ̇�u�/�!8I#�̼�l0����
��>��sz5+X*��>gie��C�F'�
lm�c�Zف`�c�
?�s���V!A�u������؃��
	T��a=���q�'��C���lG
,�+]Xu�*#��PB�K���x���{z�5o�*�텊��
�U@/
+��tRgM��#�׏� ��!��\�̇Ǵ(G��M��L^�>�#'�Qf�G�_��'3����*�k#��V����{�*,����	�\&D^�])�p�
�+�4p���M(�
lwӍR�~   �7 ͧO�,�%��<�^�/Հ�)f�I�H���夐�%�l�Ȭ�?1�il�E����ZY�2&a
�x���5�����=�1;�W�y�4�ߎ�w,!gg4�#0Z�d́B�Aُb�^�ơ��
������
��Xn��ͯ�[.$,S E݋�@M��&m�d���d���_~�t�`B�
��2��g��]���)!�)P� *\q z��=��+��	����/y����X��!5Ex��7��B
<
+q
�:N���w�w���p\�zW�I�2Ay H$g	|H�O v������,���8���H�  �f�Z�	�@3��0DY�뙆鹿(V2�u=�4�T2[��^H�z�����P���"�%��иi��(���
!��ֿ�R;2�RB�||}�&��uxr3vӝ<�v��X1 Z�?���<R�`ѐR�tF���I�܋�5����2�0a�5�X!M�,����El�)5
��
+�6|PCpEط�$C�
��vH�j����M��{)�Q?DJ%q�d��D�=OXq]6K�j�p���t��a�Qu5��|
��	u-��r��T�
]k�M��o�vN��U'�K ����7'HP�
p�R��:FY|�4� U�������0�f98{8�ET�Rt������Wx��F��~'�w�j�¨�"�
+�mE�Z��GZ8���Y����Ad���D%���m��T�*�բT� ��	�����}���'��w���ś	���(9��c,�_%�r@�!�2�l��k'�
�e̚9z���UrOb��i9�>鷼^� 2o�yq(�e�tj��f
9d!�:�D=�ޭ0�;��Z��X"Ӄ���
v�Q��Nߘ��o��x�K+��JS)T~�����4��'��9���n0�I�s��H֚�����,W�s�"vp�;��C�d��G T� w
�u!`�43j�̹�]�nU����C���?�&���
�w}�
�L>a��Uwxxk�H���3�K���N
��XCP��Z4r4r���\�H�#qMM���n*�������8���m���A����f���
+D>��J�"�BE2��?-�~��N�{��J�0	v�5�X����!��`��<�_2kE��~�3����d8J�om��%{�P:���!�%�S��r	�����
�
endstream
endobj
320 0 obj
<</Length 65536>>stream
+�����\k�U��,��8ל85�U'��OT��r5A+�G
�	�L;�)��.97ܘZxWN�xC�‚�R�R�N�Qo����|��U�mL�J��e�Ri����Y�F��Lӱ�bҼ+
�B�,憏&NMNA�q
:����+��x�����]S�4<�Whj�
�I*�Rx"N���e�{̕Z��d�(!�l��q�qJ&.q&^^Q�%w~P
���Qբ�h�8�^��h8�%
u���h�+/�+`��ᲃ%�Ѵ�lYϝ*]�xq��١^STj�x�C�U������m�ttkh&��s'K�d�%���e�%��fDG�o��6q���I�
+L����p��K�]��H̕���t�
+���(M��F�^pa�
e���8��`��SX.��Rد�8_���w�✸�S5A*�ɔ�S�Ɠn3��8����/N��Q��$t���{�--��O�@�x�g"e�/oq�!�ضS��x��etya�G�-��7r×ئ�
^�����M��;��ߙ/�
��^�%��>��tVS��r�DYxDI�s0e�읕:��7��;�%#4�dL`��K:�,�l"�L">����5ѨVy�
Gc5�����h�h8�0�c1����
+���aYZ�4��C�q6�SG%�mvTիfĽ>�O\�D��#�����(��8�w��t�t̥��6�tiq�.]J�fഘK�ɂI���%_�us�<��6�K���ӥ�]��_����wt�
���=M�M�Ҹ��um����0��f�?�nܧ$���L
�Gm:�����s����
���J�>�ǻ�Aw�'�߬��(Rf�;��ĭ;����x�]�4
+-3�P��3�1�Qum��M�[yMc�����lĝ�||l�K��*OhtnE���MÃѰ���ဓ��
��
��޼�9/�2�Tΰ��䅃n�S�JV���	�h~`���+�J����Ɩ@i��&JK+�$�Ft�h48�dI�K�!Jx[��(���3SG��v��tΡm�kIb��h�Min<
��)��4��u�v�TK!�%9C���J,4M)���������R\j���Դm�d��G�h���'
;L��
�t�'���F�z����.A��i�(�����Ea_���nٚ )
+�4e�^����l<�wZc.�w6���=]2q��<q*�;mu�ѭ
zAw��9�qW�
�:
Q�����֝S��䗐�H�&��2{x�h�.�&囎
��0�������ȶ��ӥ
<(�ߩ�="(Ŝ�G���I�A*whr���QJ���������I�b���K�����#,-�Ɯ�'��ұQ遙*���AtW�am���4��cj�����ţ���P7�b� 0���x���X��T�Z�Cl���
�
hrӋn�K��@/)�4�
� )��J��K��$/N�ɖ��,����a�`���K�x���h���z�t)c���Ra>�6��&�dߝ�$�ڃ��6����
v��)��~)��Rɭ��Q���i��An�	��Jϗ�c0�L�,�Z��J�kus������Ι�V'}�|ǝ�RO�����U�
�K$k��z�p�r����t�8�je:��t)�φI��;I�#�o��PꪉR4�m qԥʫ���Ϲ����J������������d�T
�ĥђ��Q�����me���1�'6�L���.[
dQIA�D#�h�
+[6��E�-��0�`	L��U2�]�1�
��.±^Z�u6���$��)��E�K��	O��ݢ�\�ީ��I%9�;������ߤMɕ�\ig]�K���e�c�b䰚k0J���c{%\sq/��Z]Jw�r�:<�2�
�R1�l�'��P��[��
vi�q��=���&Ȗ��N�N�L#/���ͥ�`�
7
+wuY*UO�J�\*]6Tj�ҫz����oy�����3L���d��H���Ԗ���~�2=|�詧��W�t�l\�K}��.��5����L���H���J]����n���a at YX��}5פ�йl��;���w;2��J
�P4Z��:�r1��B���r�����Ͼ�%��wv�g����J�I�.
�
ECq)�BAR��h��h�C�Kk�`.	�{<�ʝ��NOoJL5*N�J�
����j�Z��IaWzx���*@b���<��E��kyI�_	�s%��0UY�]tФ�#9LϘ�?�/nH�\�z��x�\���N��.�-.Aə(e���,�s���<���F�ARM���a6^������V��j0�u
+�~.�T�KE7��N���Z�J�IR���O��s�+|Μ��4ʉ�.o�T�B��L�$�����Y��>Fr/ۘ��t��'&�K���K��;������
7em?Ӛ���QL7���@7�Ӿz�|Ö4��ف���{z�֦3
+4Wj�\I�b:����t�o*��£?e$
oV�D|�T�`M���B�)�h�E5k����t��;7��,ѨQ4t3���'-M⒪�t���h�����#1zȷx�1�$*���@%e9U���T�%5����ų�� ��?D�J��K�Il0�$Ζb/���-�B
^�}f=f-&���������D��+��ˮ����

K1OO�&鉒��!ͤL�'��FO�H
�_�)�ް_��
|Qr�g���t٭s������xf9A�@2��Rt"T�`���,RM�3��09g�O��C�k%lq�!��tװ}��k���c9���^����s
+:]RHE�pI:�C����Ț�,�Jv��E��eJ�0�T�EFR�R�s�L590��Ya����r8�sqئ�~��Q�($,I�j=�����L��JfW��8r4��Ϋɍ#YԤD��}7��L�Ę�:��
�}�����?���V���2m`fȕ�geE��D旾����7�R
�����K>�d�il�i`&�T� &E�А�-�x%ھ��#�蟊J
����A��^l��%h�F�
+��ҽʁ��~���էYx��*�iNF`Z(ۨ��
+L�%h+*���x�[Ԍ'�x�Z����$/P2�;\��{h
���ڃ��-�W��ذN
6�y:���=xa�K��s�[��H P"�r�,�j���{O�ʫ�TĨ��'��L�5�Ѧ0:�|����7ۗ��
���Tda��@���3�;
%I'n���	��Wm��8`R�[�
xF�V�����5G�}c&�W��X)(
vPS\
 P��@Ya@�n�و������Y�
=7 �\LJ
��;T���wH[Q/����Zqe革dǗ�ٿ@/"C	r�["tnN#ӧ}m�4��4 ��d¶#e�k���B�Y�J/Љǡ�����Jw�h�z�Y��AM ����l��Z��AD!���X��z���g ��&�
~S�a�%�"JH8\?!Ϸ���S��$.���	7�D,uB��Rt9pA���&	��k�S_�^��ˆ���
�	�q�cG�@�ݲ~
p�nl�ۺ|*���3PIO�AkxEs�-�����힟iBF	&e�Bxq�wI�3U���S��C�"��
xj3�:^��t�Ⱥ
*�,5��K�7��j��u�D����PpC&�F-� W��Y���J���D��x�‘�X↱�*,���n���K��������G������_��D���
�4vx�<
N��a���
�aq�tO�������ѯ�)�����i�Tz`*a.,�`	�� yG�Ӹ��-!�8�d�$�`V��zu���O�����f���|0)�P"O���"R;^I�O
+�ڽnz����R�yۛ8�@�
+J����bߝϤ$�=�(i��U{6�?�ip���N�O0s�����D�"��'�p�\�a�3?t�KZ�*��J܄e%0�
ýcv̼�a�Lij&�0��8�0�cU���
+l��cTm<�1)p�;9�K��?P#+z�3�`������w�ZH�5����[�����
+�>�L��n#[��ZQBk���
���Մj��K�gػQ����%4���_��w~Uz����8�i��4��
���i0�ƞ��?
��Pt��ok�ʩ�1�W2��	͟�Jw�ww@%���J�dM�R��k*(*�Ʃ��%BRѣ`Z��vI�¿��>�1�T�B&��P��&�\*�;
N�Kn�%e9�w
����aE	G��҄�)(��,��<�L��q��9�Ы�ٰ1�
?��u���&/
dy�K�w�pC�v�J�{Qi����&<�~K��3�=�=������I�d�rI�WIR�1�����W�f�2Ӡ+�g�k���r*�"\��ÇsW�C%�8����B	{�!��V�F�͚��X�E�1Z���Z�EgS����D,a�
+&�w�۬��ߋJ��DF+oG��=��i��F�Fr�i,��H�i�a�C���̡�����J퇟�J�\*͈Jk�`���r���07���
v�b���g(L�d����5��gN���q���b.��vmrR�
+w�r��K��C{H�%z
���E
	%7P��;hr�}��wg��>�[{p�$R�Ө
���`ǜ�$b�8��;O�u����
��
7do,�#��߄J���M�SIϙ���A⾢1s��~��aW1)LZ'
Ly�ĂE���ٲ
���73z3��J�fd
�K�I5��Y��I����
*Aq2V��_����r�Ҍ������駃J+��R�kX��
TSj�\*v[�6�C�����!*����!�C������~��I�-"�)���X�Ɯ�J��r������d�tx��PXz����dB�0��S	�����4q��f2'@Z�Xť�����:1�8C�V�f�~	��W����O�

3`2�</A�
�"v�� a�x^q�`i\���Um�������
698L���<��45FS��Z���
q���pu憫6
$
+|97�I.a;�i�
+n�)���?8T��8*M�Js=g_*��J�m��C2a�����II�$7L�$�9F�}�
�&Л�Ȁ�ב
8�,��ae��Oo� [�]�J

�ա����D	�,5�m����&k�q��E4ύf+�
ϖ��=\��
1K��>s����7���料a������PTj�F�ƶ��̐�sNcs�i�/ZkJc�TA�`I�G�9<ho~���AT�����ҝ�<�0p��
)b	B%$�~�����.��9
+��g)�-`L�\%3:�*�F��K��.�*��m�p�.g�������:��A��
�66yg�Tg
'�c]��C2&5ډ�
ku�O��
�[�q��p�ī��K����x���L�h,�e��!_߆J����N��c��������z��@�Q�|e�ڦ��.��4} �ҙ��8q�&t�PqPf.�6&^�4
U��8��>]}��o��?�*���	�U�P�� ����WK[+Z�4�e��J/�HS�ĘŃA�V�՞�)T��у��{}*��-
|s�U�����S�n!R�Ӡ%.�4�'��
%��4՞"�����:V��a4�����w���T�=x�B
h/�K*ѓ��[�X�a���[�(���ӥeFŴ�Y�B����˦�(\�f<T-��LD
��
$��;j���I�Q��ǘ��b
�� )nü3:�رǭ[hܦ0�_�Љ<�7�\rn����~B&�$*��T�ޅJb����d��
�{��F9��O�As�3W�F]u1	$*
҉�*3^�����Y�"���m<��=�;aå=)�lz����?��-���y�u
 c���ݶ��
��� [...]
��)(����H�������q��N�$
xW�N0��g��M����~q"����x	�|.���=g� !{
�Dw�d�nsp%����;����D��k���8��Ǟs�}�}�I��^���6���K��%
��{s��
7!�6f*�?�J��R@C�^0@߶���ى
�I�����Q�;�1Ƌ���)�
�&�:t�R��,g�
�
b��ҁS�v��o��
3�ҳJ
*�M���2V�7C3�*3��R��b�6v��eڄ�ڤ+�,a�֥`��O���PYҵH���T�ߎJ�U�$�pr�C��TkD���.��:�4V�_e�\�*^��x;�Q���W\1��`��C�%�A~1��3Q	���o�0�[8ԇ�U
�Ǣ��LLZ�?
�d�Kkƙ6�U1�@.��y+�� ���x.)	r����!8wԁ��(�C$PB(}Ձ�a�&���
bu�s�}P{�S�Q9��q�
�i���7c�\���Z.Q�q�;���
��p%G�
��H�5�GS�.{�����E��n�
xt����.����t�H�R��(��%G���
�`�,L#��&hvI���"�d&T�����PIYE0�
�|��g�7���,g���}��͸3����P���Zm�Fb�Z�`����I���î{
��/���}�����@4�F§�8�4ftz	L�ι�Z9����X10zs�M�
�^����TZ"���	��	 ~��z(Lr�k����1�L
���#�l�I�.Q�k�50T�ťc�t4���'�ɡ��R7��!���Æ�|��/�JH&	&��d�
L�K�8�x�){M��W����[Qi��Tzp��hS�|=bI��ެ���'Ew�zq�w��������w;�2�ҙFV��iz�B� 7C$�e-|�����@Fh�V��et@�d�tV���8�Ȋ
+�bu�˵��0��륀t C��A�J������
ފJ���7���x �L
�5�ߕ�N����>�4L�
�[�'�h�vq}�n��������.<P����Ē6f?
��8I��RV�4qG/#	v
�63�$&��ԋuL��L�W�Kꋚ�!E.g�RhG,m�bi�Ibr���ь�(QA	��a#�d�c�
$9!�����}�@���xB�x�K��
��K�'t�x�

62)�F*�� *�+����
�T����y��`R�j?]z�I.�.N$_x^��fteVp���X^�aUUf�X��6������7
���B�	j胆"
+����#��ۉ���1��q��c0�ҡ:�~L��A��މJ���7\�G�L8
*�x%���g����;�6^)�&+F��1�l܅���~F*�f,�������
n����i7`�����"iD
+�&��T1_�\.��N�%�z��R��LJťj�B���R�u�]O4{G�
(PJ0Pڗ����M����/
u��i��9�����i
6�l,��O/�pۺ��	�KJ
���M.��C%�*�@�
3��O��� [�
>Ym\&��ј�q��ҋ9tRqb�I��FV3��\
�\z&�t�ĽM�u�*���RK9�ʚ,���/p,X(��?�s�'c�ctH\��
��iC��\�c��ק��JZ���;P�ÿ����_^ ������iP6���H��X
w��4�0�+jب�U�O:�"
�Z��y�5괡��XB��%)��J�E�1�p�m��(���;c2��<�F��Y&�%4�ĥ�}>�(ժ
..��w,ud�(P*m��w��#&��=Τ�� Mؠ
�
�'�9��q�W���O��K�ݘں
+��+�O����ÿ����Q�S��T���\���	�VM.v�)�z���-�Z/�4	����9�G��
�2 �^�y�9t�p�;��J�N�s#��ז�D{پ��׵�~�m��*\QQp��(�`h@�d�F�L�������R�cN
s�����
�8�!V�Ֆ(��J���a��ty.����ޟofhaz
v�����z���ݪXN9�
ݩF�^S{>�ƣw��`�G��i�)뵆*^�ۢ�*2��I}c�C���Y��㷷��O�8�>3���	o��C��*1X.� M�T�\�
+6��I�H�4��3l#�|.͌ӷ�]��ja/
j�u,5�z�iG@�L�*%�6���T��;d'�Ɂ�9P���\D�<�DO��9✻�}�SO�%�x��
�
7�)���3���~cA���P���h*��N.l@�5M��$��V�>����d�4
+Iljr���]�K�_�M��S��%E	����d�_���P)�^H��`�+k
*�%��*�WqC��s��s�>��
h
.A��0�,m�m���y�
�OL�?ߍJ���Td{y6�QW؊��N){�4�q�1[�Y���l� ;�h�wP�>Կq�Ƿ�
K?
�>+��'*Az����BX�H)����^u��{E6s>��~$�U�W��T�nc�H.-�K"\ª-�V��%�S�vK��YX�%%����
�9����-2�R���]�a{
e���
���v��ࠇ�����da��֋�*/q[�ɛ��vٴ-�,�%6[�M�杨4	vrѸfX�>�Vj2�����gR�:ht���eˀ�L�hd�p	f�t�R�/
͛}���xJ�
+ZL�M
�u P*2��uY�Rl�d�GҽW
+s��
c��EKke�a�t�+C��AY?�!i����� .J��S�US��k����~�"[�T�i�y�Y
+	���W��Ӑt���X,q�t��kF�h*�A�X�
+&M�ן�J�V�4X�@e9
+{��
+�d������k�D�֭cV0��Y���>
3��R-S\�a�v K�@�#{�m:P��;�)[�D���$Y{��o�P
z
�F|�us�4�h�&�A��xA��)���)�Re�T�)�~�P	��Q��7J���
�
�S�RjVD�1i�/P_�'	�Gm
�n8�7��N#+g�K�|(�f�á*�oFI+
�$Y�$�6��
+��}�~�?�ϟ���mMXZ�OZ�d�������yyݗp���QI�hv�����5l�^<�O#�Ncz�i8�F!��3g�T.!Fg�ƒ1Z��
+K�J�9�tT���/�’z��Ki�/�D"�Ω_��8}s��,١bV�|.�\��m�J��!�R�o��%%��A�C(U�
a�&3im���;�'
s�ɏ
W�Ɠy�%�p��
7J;���s=���d��pA�������9N�c�T�L_��;�4�E��ш2	-J�4/�Z
;t
�L?��id�p	��x[7���%�%&���2�-|K�}����J�/��xͤ�Lj�
c%�LŒ�
\*C
߮<��!��%��aa��z*}� �
��a��zž��>


se�3(5�i,�?��5�d��
F7D��S{h�%���J~&*�[*��=K8Ε�R{7�t�L�za�M\�.c!;�rɖ���dT�`,a��Ǖ�b�n_��XI�z�������?w9��
�.^0e����ts�
�%|�9��u�s�#\�m]d�8\�o���4TR�Cw�[S	*��J�b'���9/?i�<��O`�|8&���B�}��H���L�Q#�nz�,��u|�,�:���.�
+�$.V�a|JY�V��G�$3�B(�|�c�{�8���ϰ.�C��\	UdJH

ؤUN3:~o���[P�?D%�7�Y��Z=A����Ox9����dcNc�O#J�q�1�>!0z	SK�}�2��4�����m߉J\���T�,��U�5�Kqu<�UW�si�4�2)�_��㠩��0�^V��p)��e1a�bi7���Ғ���D��%(�!
�L��M�9}�̤0
�9�cl��9�DT�Sī�ȓd�n��1u���漟лe���̿�r�tW1��J���
R������4��O薗��xw1.,fR�8O����
:_s�Vn�FV��3[R(������T��//�� Gh���SVi�̙r��^�ߟ"%4�dXaWth��~�4ň%�M[b}׈��@�
�P7�Wh�[���1��
�M�{ja�X��3��O����b�a�xPM��Jrp�TBU��
�%� ��T��2p�����#$yc�E�#��sS�a���
�:�L�wZ�"�2������ӌ [...]
+.>�4��EW��a�W��]���|��C�O�J�L%�X��5��x�"����*�L
+m������F�%7\»GS\žj�Xj<,�)-}7�wNI	'gE��(aE	�
(P�KIM=��I�0���g��������:\�i<��S0��`n�Y<�
�)��M�7T�ޅJC%'������L/?��&�1L�B�E��
�H�$,LeV4��[R(��¥���	���k�R�r��J9
�`����C��3�6���Qv����/�PA�b��t�=T��ZQ�-�CA��'��������)lv��CyP�,���tf&Oc~�i��i�И?R���"�K�hL��t��۾��-�	��I��U�%��7���8��V4-���P�
[ʸ��v�//�n�Z� A�-���%�}b,9ӴCPr�
�!���a����`�J��DMO�IC
$�^��!~�<G
}o
5L�Eڍ���4�y�s8��f�?�J�N.�u;���\/?Y�ƻ�&]�H
��r�:3�2�B%ndMm#k��-)|�#pi��W)�@��ׅcY�:�����Ac,��t	�h�E��;�'�/y+(-����	\b}gYQ5�!�Rʗ'�g���T��VT����+I�����O1:Ò�3�4���mx&�7o|	�=��Rf4.�h�)rd*eD%�
�I��8}Xb.���y�h�CȤ�H���AS9
&�]&�g�%6��� [...]
��</y
+F��wf���_��o��D{��	8�oL�O�&r'�^~�W���ۋ�zҜ����Q�=‹;Y|cD7\�5Mk�1��K��+�K_���� J��;𸬄��'p�Ҥ�݌Vʠޱ����}�	ֆ�b
+�Ão\]���5~��2,-应›�ޓJ�0\Qi����6�ŭ2L�C��i<�z:�Gu6�&
an��F
9>�
�*�6?%�
�r?�Қ
�5?�z73�!�E�ͤ^�:�HF��KZ��s���=]X��n��(e��
�
�����&{�m~EI'�zx�X"
u��̛����
<.��ںx?!N��^<3�����?�};
�4
���L*�˹�Q	\qP
��"%��$��̤�t�*�1&�>�%D9No��5��
q�%�ť����^p�@	B��;pYIRRlI�� V�
%m]��0�
����Px��L}N��T����
�ߠ����	���
�􍩴*�_���a��B��
+����sOc,=�͌@o9��th�mS>�6
��q��w���.{�$�*=�T���V|���d��!%1��A)���2��
+��%K��[�A�⒎�J�%�[��/1Mۋ%�#<^R��
e�pF�J
�]��d�4\{�'ҩ�<��G��.u�u%f
+���Ћ'�;��3q
���M/J%�qs�D;�
y'W����9��*q�\Q	��@�	'��P�I��2
���LxQű
����Xh�����u�rI�饪��u�R�����
�x
gi�d�)�ţ.*�|�����>��@b�y+�~
t�
+�jhw�D�nOTjޟJp;z
���00n,�J�4�\�w4�;}��ipo7���6:r���L>�����dTB,=�`��$�ď��c�(�(إme�~y��K"�$�B,�h	�Kp�R�����;
bP�
�TR��Y���:{�J+35��I�rR
Ioɣ��vG�[��K�K"��
��]�m
+�m<�����뗗���r���[Q	7E:�Ob;�t��w��L�v0�׋{k��g�=�N�K^�oI���!���\�� PR�Ҏ�J�/
�����@]nI	�G�X���
����}
{l~�i�F*A� Qi�I+L\A��~��W��3x+*�j*��JE��-�-� p)д'`�/w�ě�i�k*�%1ņ�FŎ0T�
^�f��돧�m
�lܣلN��J0������
&�����WD�X��j��R"�%,і����cK��!6L�oL���SJXR�R/{gZ�,�,‚�a�?��vq�IG�n#��`��N��,
*tW0
g�l&l
�����f�nߞJ��\z�	`	��ra�֟,��L�P��[J�Ct�3�^#+^��x�~�B���b .������5*T�>�w�
+��S���8��vX�P���\�g*�Z
+�HZe�hg���(��^p�҇���M���**
Zu�$���sN��Ӏ�ߣa���ȱR�
pQ>����
D�?�J��HQ�RxH%HQ,(Z".-�y��t�w2i�~uJ�?氆9�q�b.�⒏%�� �S�6�鎇؎��DƔD���pr��Rns���H޹.u���?J2J==����[��ݝZvO�軂�p�N/
�ә_�f�h�-N�f@�͹T
+J�.���~1��WE�N��s��6�$��y��G���u)�4�r��d�ö�'q�K���"%� ��e�m�ay?e%e��
�	+���<`�?�HS���ĵ
`5%��;���6+`��{S��T��h�f_
p�=&�#²R�4�N>
s\f�q>Z
�
�U6�R��Ծ7�b:G)�
+�
��K+]O�P��;&<m|�@��IgZ�.5�撫[
�fK��RAXj�L#^ߎ��DƔ�gy疔l�
�9PE�	�8y��
0i,�Ɵ��s���oނ��ԗzn���e#
+��%��h�Mg�v5�R�T*ޚJb'�Rbi�䂑s�������d�%�9Fv�\r�	jV1����J��]��~�pIq	%�j��fG��U�e%�9�*�����
1ÿ�����0��C��a�
+�GS�$� ��
��U/��҇w��M%e�rE�
�~��?�<:��<�I�iĨ�{�J�9|���\E��,�U�m�"�
�~0����T2���M�	�������3���SC�(&]�T(X�vqoJ�4k���K��!߶\�n��Ғ��"P��w<�Tn�l�w�v��m�<�$%3`iz���4Ƃ�ţ���n񀩿�
o�2M��`4s{g8s��K���W��3~B*e�I%\~��ր����+�h�|I�O��6�����
+s��"\����5�b��lI�7�(�
���W � %*A_x��2R�����̋�
6

�<;
q��-���`��NI+��D��w
��
���
��*
�J�h��I��
�4�opx���g*��n@��!����J�
�
,i.��J~d�b'�.n+��K��p��9g�ij�K�.�PX�F<�� �iq왞pv����w�cKJ�{g�w��s�)�y��4���<�?�.0�q���k�g�R;���3�����{��<�v��[S��i����Z)Wr�h���3h�ͤ~����Fs�	��,ޚ�
vK
+mkm�����pط;*Ao[�2�R�X����3�9�{
DM��h;���
�ZC
KtUx����I�Y�B[��1��w�ҫ������JL�m���|�iP�
���TZ��/�Ɗ�J۽��k�#�d�1��ͽ������ռNâc5{��Ѱ(�b�(.-�*�%��)&Uzl�KK3g�V`�{lv�4�a�L)�E${�+J���ˤ$]��
}�b\j�L�8�K<�I�_h�4;(*e�J��R��l��K,A���;�ɵ���cs9j��I�&���Fq�����x�%e�3Y����V�KO[�%| J*Tj�]�W�WP�K��ˤ
���[��<�S������a����rd)R�A*�-�6�F%kוǪ��ygH�)*u��-��T2��TzD*�g�(��.�%]e�ɩd���~t�;ui*�~Mh��.cˀIok/��KCX"W�[•xԈׄ�%��~��Pj
����
2���q�3x�@�H&�7�:��c��
�R<\Z��:w=�w����x0����y��LXdɁ����N.�1�
�lc
^�"�����,���:$md�v����a�}r�*,���y����}VP�=
Z�1�fIh:ST�f�wB�
�6E�N�
�����k�T�&�t���p�����R�[*�ޑJK�-R	��4ɛ<8��)��Kp|t:�ɑcb���J��h*y�%�҄f���$��~@�%�n�L
+4�2J�KL�
�����K*�OJv<ȩ%K=P��;�s������읙Qr%=��H��}
����s�#
�f�gO��Y<�"��
�^v�3ु:�
+��u�8�M��
S	wr�-�pAd��w������'���+������xɩ.�q��RlI�-��*4����������x;�� �@���t{/���a�c��|�J"iET�@��)@����k��T�Z*�L�
P	Oc���D���5<��L�h�����R����G�͔T",=Po�Dsi&��=�4�B�{�^.��R�x�V���7���-������K�I�IJ�ЁƔ����
�!\���@i6
(��O=��s�o�)�%��a�3�ÙT\����a6���_af_�
L]�� ���R�)rav����}�7�G�á�qL:B'<
�s�H��d��;�]	nū�BE�]��txz:(��Pi״p۟n�K�of����%����4� ��UAT*sK��T�J�V�uE�52N�Q��ݹT�TZa{8PI���R�����deIc��4�	2�{P�J�(����S8l�/��
a���p��`KK����o�y�1�(�����
��R�
+�
t�C�p'��>�q�)��.
?c7�0�y����������tk�
���R���b��]���r��c�K0�"��\�K'�	g

{
t+
ޣY7�� �� �����
�T�ං�� 
����v�V� �|�
�l��
+*ͨ���X)��ЖJO?�J�������v��0��� �J�
"*���R��P)
,,ѝm�I�$�[W�4^A��k��u��K��K8kG�x�JK�=
����������E��ZA	;�M�
�9n�
�H�4&N:��
�
��wpI�si���DqIN���b
w��㙇�n�)���w��Y~bv��J�m��xO�?��^�� �.&ͣD7ĥp���z
=��fKɼC�xm��=?5u�;�;hƒ��v˴B;v�X�#��'�
N6�і
K�DP���*m*I�2!��l�������QI�37�J�(KS	j�?�J�~��Ƀi�����
K
P���������+�-�Z�]XB2�p��*����Z��d��JL��%���cJ�n�
tI����@)�����G2i���1���}\rå����w�)�m��k����΀�
�
.T�_�J4f.Wr-hœ�wfW$_�i�$7=��Yx��'�����u&���RJ�f�J�I�K�KO�ϊI�����m�7�sc�*�-xq*���n;l>q�JP�W����T�
~�pӽ���LH�e7�N=
���g2�6�ڟ�J�z�ҭ����&:
q���<��*v�.��XG�\ՊaiAI�d�%�7��0����<DX�`�䮾�P�Y(%x3��{���zuJN�]�W��,�����?o�K�t���[�u��]���px.�`g�^9 ewzB�j7

����X�>Y��H�r�[�x�	�,���l�q��(~���u at l�N/�2tbK��	ݣ�<;X�*5Ms@(5*Tjve�-x�JKc�:�p�;8��J��J�T���H�¥\��Lc�eN�Ri����QI��?	�"�c�p��(`�?�u����X�/�J�
+�x
�h�C�ܘQڤ4�%�
��JK�%x�(�R��
nc��YQR��;��%J�ɤޓ=���s�!H�B�*6�Ù�����;�����E�D%��E�t#�4�󅷑
��#���DN�G�:�|�l���m]�E¥�8����Q�PI�\����*���<��
�ћ
x<�T�s� ��n8��֧lr�t�i�T†�Je��7�"�y��û5��Q0� aC�R�
D��_��X�q+��^\
�!�%�Z���K�(&uC	;±�W��(I���ٻ������Y�=��lK�w�s�M�����!� Kpg�
+x�����T��]~�C��%cI��[������NP�Q"��u�~ːK=s��V��M-��V��P�a�y��
�z���ͬb@��4_T��?����4��i�T���F�Ji�sP)(,�X2\r(}�L:J1�8�G~�@����+ޗ�� ;�,-��pq�`�O
���	%�
(Q�Ú�
��Y��q�t1&�j���]����å�[\2S0v��
wٴzg �J0���h��T2Kf��t�Rh���Ġ�^@_�u�o��Lt���
�j\��
��<�f_W��\��-x+w��BT���J���g�-
/*�|*�L��@�(���`)�H�u@�|�p��l.�RKr�=6mli)��=
sx\ZRX.��훆�WJ-A�;�u��-)������Q'w#5�[��5\:j
+�np8S�KO�3�ť4�	-xp�u�d�J�
R�\ɥg�f����"�34�P
+(.
�a����p)��?`�0KT\�p���pO��n�j
��k��B��
oD%�:%�@�>*�bVA%���;�J��y�$�0x�%]^�%�>&]
+J�)��K�n�`�Q`i�YP�L4TEV�
9��ÿ,ᣘ�
��,lG��R�%����C'�b;�/k��q?=ƥ \��N�lp
+�z
�����/q�M��� �ҷ�ҍ���T���p��.@	��VL
+��_�.���	Kt�EI�
+����Զ�
+rx�Q)�
���ܚ�Q)�y����4�/�Ũ�W�H*�y�dTr���K�K���y(��wꯓ�5����z�JK8���!�^��d����@	�
���#%�sجdI��w��@�\&�x䣎���c��pɟ�YFۍ�&�p8�v�@b����.H���Τ�G�1*MD��`����u�
�7��ɿk �,y��s�����f����V;Z��ݷ*A��ׁ���|������
�Y*��9�JdǙJ���禒�%�K�%d"��c��P�~��_��~�.,͗��ť���sx�%��6<����R�`v6ɸ#
'�J#�wᱎy۷�Q�6��n�
�����4���+[�P+���3�����G��J:�G�u���$�
5t�h(u���Dv��
[�1�@��k�3��
��r���o�a(5�-zk�%��N��?X9	�w�Q`��Sj�� ߨ�V*M,��(��
M%:�[s\����K&ZX��c���q�s��o���%��Km/�K+���~
��WJzLi
L)����@iě����ƆK��Ǚn76
�m�ے�����:N`i o���j��Sk��T���rQ$HP�Kb����u@��}�P'����s���{�����V`j���U
�* 4EE�o���R̒�}Z�<�M�t�i�*MN��0�"`�L���@�#�čx�zȶ�s�gi�@i	�t�^�C��Wy�,Ք�`LI/��
&Q(���w;W��
�
\�a�f��Rƅ{O��ȷ;��
���n��]Q٭���R4X�e,M|,�p���@Lrf�{��(��m4�K
.A�Dt;�せ
���J
�����J��������s�O$�IP�
���OD�,Mu����
o��
^��,mSP�K�X��=�L*}(��]�Ci���Y���'�°�so���A7ae�d�3�� Xd��h�
n�|W*��%�7HJg@�GhΨF��,�U�fU\���TmK�R�C���r�ÕJW*�_?�^h,yO�I�B�
��Ѭ K�������*�����,-�Ã�Y͎���|�2��t@	��a(Q�
O)���]�T~�0���`�wo��ץ� p�xg@�w ���q�Z�VT����evDN�2�'�đ��A(�S�?HX�G�	
�Ky^C�T4��
rx��k�݁ZÙJKC�^K6�U�J����T�a�Y8ہ��
�g?�~��V��ƒ�x��~a�<}x%́t�E
�%�R�������T>�m�ϺP�0���lJ=��K
Ï����pɞAǥ�p��
\*�
{%�z���m
K*m
ϴTZ���/@�`1MYM"σ�[�[�G]Ζ��d[�����KJ\X
TH*�m�%l�m�M�W�9u�Pɸh1;|��!{��_E%�����$�'�L�4�.�_�fE�)-q
���E���^�X���9�$Ť�J������6�u@)8ԋ
����z<�`
+F��=	 e頲�����,
h������E�l��P�#X��6]L�{�>���E�se��F�K,A-
�
9��Fi3݂w�ҕJ��{߽ �yމIU/�z�X�Ғ��K�*��^��rx��W������J�xc�
ٚR��
Ca�Å��g���]��%1㧄��tdRU[�[�4���j<�IV����ϡR�U?��Ȯ���
��-D�-�N,M;�Y��P\*���p=LCKO
*�he��J�x*ű�ɥ_�c�t����>�]���t<�9<ڇ�a]	rxM
X���O
+L��S��~y�}P2j'�4�����-�qҼ���3����fD9�Rm]�
����Z�/z���c{�ϢR��yX
+¥A(
�X����bb�|�XJ�
���(сP �� (��
�h�JSA����T�PiKM�:��P���6q@c
�)�X������K��_�`�u��t����QPj](�H�:���ù�{�$z%{��r�g
!�
JcIO������:�]u�6-5
�YA��ϢRw
+�\��Xz�%g/Wwbv�s��N�U(5)�N,�
,A

�xy�5���J)�JЄ���)4�.-�
�T�R���F��#TjX��0�ȏ�-���C,���u�C
��C,UM��˫B0�<�/��n	��w�P2%�����/}9I�H���&�gA�K�k輍�n��-l
�BsW�GO���s�:�
�ȇ��m7ђ�1P���NU�Ў�����eSm�ʁP�j�J�� ������JW*ُ�����L�L��Z��;�b�*����a��9�����\1)�Xzy�t0i?�� �.
(]^qq���5�%{+#b�;�y�C�@ت�D�lp<S��� �yT
+�%������n�U�}����s�^�.�u`)5�R]�M�,)&!�
+hwȳ�&Ya~�J�+�����xR%z�ԣdj3��v���#+Knǃ���=K/� -6<4����^~��O=���	�̅��Biz$��yDZ��v
H��)?Dgσ��$�aZ���<(+A�qƮ��j��}��4=�J�~/�wc?���vE

���e��"�IߧPj�CD����\c	���R��� �C��|8�	�q%lK1�Y�T��S�]
0Z3�{U�am�y�k@
��r���H��9<��Ճ� �
��~* K�).
�� Lzi�}��~����B�2�ٻq�%�n�
+��*?Ro_���
�[�zI
�zi �WK9�w
�<���E�f�h(��:cdu�w*"���y��0\�
+�L�nJ*%�+��T��A��ť�Z5��5�b�%>��*��:9<jxH冇B�Km���T���������L2P�1�r�.�w���0�N�nY
-�N{w���>dh��XZj,�YV��.�m�KtY	�<���­���4pًܪo��-�tO0�1��sa�-�.�"
��
���Y�2o(�� � TR!m�
�W*]��B���R�N�t�cޯ_R,�Q�Ri�ҷb�

7<�
��Fвmv�Aa��%��^�I��x�&�lG���&�F���m��w���,�CT
�[;����х%������Ù*R���`k n���p<�T�U����=�sIY�'����G
��ZY!��@Y������J�+��Tr_!��uhKT��?+�/�Tt*�^Ѭо��2X���
 ������%T��~P��S=J��t�[ťq�:�qak�8or)��c�W��.�R_(9���Jگ�a�gQiKG-���(�9Vs�:e��~
�LH�����b�f��S�b��	<�ӮT�R)�U
�y1��U1Ŋ����Uk@,C/Ò�� ��asx��.J��m�? ����{>��iˢ�R����rZ»�$��\�

+cX
�U
4x=`:�s�;�����
2x����(-4
�6r�D*�sx"�'�]`<��7Ԝ7I78{K+��<UND���SU����T��"�tw�ҕJ���R3��>�c�4 ����’mx����� �

�mUo����]�����}��[hthj
,�Q�B�{�S^'&�3�X�
k�|��d1��X`�.;M�BO�� %J��.�5�
OO�R0���e�R��A�<:CX��RTd���%�"����`���
+KJR.�&D��+���T:�Kc�$���hXT��V,��=��7
s�

�U�͛����}}x~F�
�@mwE
@i�����ҙv�F\
7#��-
��u�鴏ߏ���z�Z\����pñ
+����ސ0
\e3D� K
[����ұ��)��F���o�/�c�D�%n�Z� Sx:T��h��`����J�+��oڱ`�C��Wf0б@�B�x�A�ł��
�@j�u(+��Qߢ���s����bR��˹5�̠̻@�C��B`�z=�ӹ�~|���{��-�0�Be���� n8�y<s��K� X�?�$S$Z�8�@s.�8=��Aǣ$�!�N,����
(��LB(A�C� �f���J�+�b_�#���$W����F�|�
+k�_Ub��(���R�
4<T-`�y޵�}]��m��
�EϷ&Rr���@���^��!*�P
+'�(�F�����Ioы%�3 at c)ۨ1�g���p�3/C���
���4�8g��֛ri���%$±���/��9TڬbT������҇�Wu4�:4�4�����|^K��
�]�'Fi��T�
FK���g��z~j ���+�R���\QI�
+��t�Kt2�bDr�����d2xrI/
�pɎg�Ǐgv}�,�l�w��K(���ٱaS'���RKrӅ�ci��Y�"��R�mxP��)Z� �JpS�ݕJW*�o���c�E�1�W��\:K�\���)hxp��
��Z�	��>4��SL��͝�R�7(P���OiJ�r)��}��
q\��u`)v��ƒ����Lj9�<��d��3ϥR'�B��*�8�|$���n剎N
��e֋����R�d�"�� 0A��pI9�0���J��
�*�R�9��R)~��4�������#P��֠�ܛg�r�ri̫E�TbI�h��ѕ�Ŷn�U�<�Z��PL����tٳ�}���!�z�t�y���_�y\�����=������v5zi 4wA�B�g.ǎg�R�c�s�
����\�A҉���_�@f}X�j,-`N��>K�*0���ň5���&W*]�{��w�J�j
+T���.-�U�׫q/���R,��ޡ
V���b��߮��v�J��wO�}]ъ��t2\C1
��n)�,���ȹ��X,��p
��6K 1
ZKޯ�^�K�>,
�ݶ�I�D�uoF���Eu
�|,���������fXJ�rzT�[@�?
+�TP�R�J���	_�\&�*�箖u�Vȥs�$5JP��?
+�p����9���px:
Ť�V�Sy��ԬP���ұ=ʤ�P�~@
�8�r��R?��#XR�
�U�
+�3��~B�1�W��c�!�
*�X����&R̍8Qd
���[a��bi�L�r�^mR ���\T:P�v�4ѡ�LP��J�+���R�\=H���i
����Y�Z�~=�}�
+	���Th,U�����p/�v[�� %w�]�>���[@�KQ��
��g������Ճ�����Ҁ�*K�4�����x&�{��Y��Q��t��I]"�?Bb�����)�/��XZ������p)S*�Ip�����`�J�+��Wꥒ�^��խV�V�I�~���.
�~�B�2��\W�V,���
������-ޞ��TP2k�/
+�A&��[���oQiXs7l����h,�K��j�4�w�M69d��f������h*}p�$��2�Ǎ��ѤWu�;e��B�
��
\C*!����

�K��%k\R�J��w���(�~��b��N'��Ch
+�60�VǼ�}!�P��!,���DX�k�s+7�~�$A��܍���R ���[��4|�w��;:y�bɽ Kc	.:�k/
0{?ig at F㙐������
XS�?�I|�>��4g���;��\"�7K�Ekͥ��xyA9<���J�+�ƼT�\Ut
b
IV���~3(U̳��f�\:Q�>J�
K8��Ԩ�<�v�r�⵺ږEP��`��$��'?���$߼�;�q�]G{1k�]�DX�]6���A�@�C%���3'gS)ƥ.0��n��bR ��x�M'BX��
��2�ݍ�cI)t�+,eY�*]R��DMxX����K��v�+��To{ψE�2�Ѭ�ã���e�P.W�n.uS���x�DLJ6��SX�%Cx-7ޝP�ܕ
%��!�_�d�+�@�}�\�
1�� ��X����vdžKq,=��L��XJ�\��� .)1%f<s9��0��?�J�X���¡k�CG��GqzE�δOV���]�Nƾ�,=(#�W�A�,ѓ�
%���4�R�J��׊�f�O(�2X[S�i�D4���X^�t.��
N��+אI)aI�Jm��o�{�`��6��ݝ���)�ͳ�EJG���W
+i<
+s7�. S?��|�~,�4�`:s���̈́�R]�|&�6胏
�
��>`#\�BU�.7".�~ʼn����[r�Ò��c,-	K��K3z��PR?�Y�
*݃�>k9]�t�R��{��m�94D���L?�N��*�*W�Z7Ѩ�X��(��KS,��	V��V�"%x�:�
(�JJAM��;�I�_3m��w�Le�.b��[��9�%�4`��db�gF�+���|*���GSI2)�R�Ȧq��
ՙv�*UOy��X�#*=**���zM\Js�@�CIQi�������JW*�yb61�]��
�r���$
+�rry!�>�x��s�%C��b���Ƶ��Wp+��ӷ��
W	�P�EJGB��+�oS߼���#�3w����W
��Ôv�><���n^PPo�g���W�
���
C%�I�a]��+���ќ��&�i�K��cX�X�Oc��\�>TWʕ���D�����+��T~�(��Lr�$�*j��h����(.
�ZB��`	7��m>�����-\�^�2�WL�%(Q��<
T2��9PrL\�Ia�*��<r�s�De$�]�F�tV�ԇ%�x�`	���Q��%�w� %�F��M6��u�N�R����$Y��t����
GT��..E�����ab�҂~��w<�9<�Z�	b���JW*�}\56��I�b��h�t
m����3�T��3�|�	'OK+�0�Xj�[{�
��V\Z��(Tz(Y
�TcH@r�>�P
l��n� �.�%\e���K��wT��!���5�
r�m9
��
�D�J2P�0)�$
$ [...]
+K)v;$6TR�C�OW*]�������O1&�r�j�|���j�*�X<�Y�X��f�b�
�|*�s��.T��W�p�R��@y(��	k
����.�0y�W�}�n���5r�8��s�4�
?#94K�Ҁ���i�3��ń�T
+����1(�d�'�+'E&�KsH�s#��*.�� ��)"���M���{��cI�،��VSXB&)(�=X��j])�JD��+��TzE�H��Aɉ�H��f�b͵R-��!
����?���(�O�\�&�7#?����8^���^�!� Rr�X(��s��@�#yϞΧ�y��A�C�Dc���.��;w�,�%I%�4`�K2��{?!�����-�Jf�sTE��d��
@i�I"J:Bd˘��!EeB�K
+�}�_�"��J�l�S�60L�Y<(ae	��|m)W*]�4�	���`�^�D�
i+�
ky��[uûX���f:`Ҋ�����z�%��u2%��L_�mn�&%J�7�R(u3ɵoڼ��f)l�Ǔ�R��>k7�X��
?K�1�e��$l踷��3W<��R)2�y���M�J]���ݙbR 2�Ȋ,�9Ru��f��:ۆ����~�$�D��d��m���LJ�{��+~sK�]9u���ϿR)~[*uB���r�7p�5
�p�8�Q���8)�i��M����Ly�K�+�y;��
ȸ
+�L�X,����&P���	�:
"�Q�?P
+���7#+�>�D<RF
�Sp�]/�:���_��ҝ�Μ���X��3yF�8
�\�J.}�~<
�|G.�x�"[�P
V
+,׫�ܺmC�ҭ��L}�5�;�'%(��/L�G���J�+��^�k~�&�A��˪�m!��6���3����d
�L
&��b�
�l���P�a�]|Z�r�����M�*%뵄�J�3�%��	(
0)�oJ#�Z
+,�u ���ʈc�a�>�v���!,�t�]�&9K��˰���3��!*EFj�
�L�df�+�b�-���D�vT���҄X:�`]���.��_�&}����`��%��LJp^	�SP��Sx]���_���ߎJQ(Y
#��Q��X�Il
I��[�	�>�!��2�V
&R����t����Y�%���
Z�ʄ5l��

6;�����~`��{9���?_J]N����.���G
bp�a����v���uy��%�"X�
��KRgg at 0�Is0]-�'�#��R?��֕3N��X��6����F{8�rI:�����p}�
��f�ޘf��
+��Tz�R�J����ҽ
�$��n--�@ɬӗ�v)iS�ʅ`�.�pɏ�NL�}��I�1����YC��X�^�+�
+�M�e��Ro\�-*��&�<��&j�@RXE��IcE~@X;/�z�Kű�Og.�ҀL�
���g�%�K����9)a�W���&^h��ћ>�q���:!+�n����p�#q�ET�]�Sl]i�b�C�s'����&W*]�4��:�e�{�5�
��
v�W�Y�Ed���;%��p�(���
FL�K:\�x�
�vKw"X�8�x��K2J3,~�����e���H�
U��� )qŐ��/2w�ڑ��ݣ���v'�:�T\`�3���x���|��>�o�R$�5}w�I�FX�m��x��

;�ڗ�2`b"ƥ7��~u
,���{C�9Gx	~tͤ
%&
*�\��_N��[Qɷ��8{g%�$�$���r�
w��1:z6)�a�3OA�P����m1��e�iK���O��wk�DK���!����4�[�	��e��J}m&��v��rJ!� ���0�XYkgbX�\5�.,Zܜc�B,�����ә��f����τ99s!*�N�P����2	��]@IY�Y�9I&u� ie��]�mh
+�X�Һ����[l���$*M�T�Ri����YJ�s�ĺ�H�"�B�R��
q
ƃ�P�%C�BK��m	0�U:�W&\r��m���ޝ�����_�̕

��)$e��|��
%�
�J���G�4���J������i�����X� ���^x�"K6kSYJyg �g"�oA���M����d�q#��RqPs�꘾��D'++#*
��@Ra���X�U�3���)XR"P� �����D`���<1��K�5�n�T�R���C#t
���\[D�$
�$�f�^)�Zo2]�t
>Խͺ 6i2��d�1��åi����ǿdH�G�t[a)�H��SW�Z�>-$#����?b����қ@���[�c��fO�.��P
��8�Sh��*�n%��m���K�’��Mxi��.
0[(����g>���7�R�IC2�2�ZdKC�L(�,�9�֞�Љ����
��bX��J9g�Oa	�Jh)
ɇ��%��)9\�@T�\�t����
AIW�f�I+��Id
��ؠ
U¡�v
Ԩ}B��B�5m�Yco>�’���`�q�u�HSi����D.���NMÛJ��N����D�Lx
���Ǎ�
�[<")$Z
+�|X��
�)q�
�iX���%Y]���`����̕
��� 1�� �.
x*P�df��'�Y�"[[ʼnkNA��++-*��Q�IK�CP�]�])"X,Q�QP	�H�i+D*a���?�J�<
�~
�d�w
��f��f���j��6�a�R%d��S����h
�zm fJX��K:�g6r��n7Ai���4T�`���z9�������
+����l[{C(��;�=�zLB�`)�[��)�Iȶ�Z
U���@����HNl�<k��[;�
��4�\K�4`��;ށJ#�4�2��o�l=��
�'�9x
oJp2�Ң�����=��N�ꒃ��Vx�������;E�5Րl#
��/he��JW*
�Y|C�%(�Ed&�n)� �R�j*�Z��CwO���(��*v�
,�i�>�E
*ݑSKM^P��$4���
�]j��*]J#�n�$�׮}C�{��R�b�B%+�
+
�AS��	.���s���
�?��0]�be �
�Tz�Y�v*uA�Cfs�]X���L
u.D�G4��*�د�
x!E%��ۆ��.�%I�ϒJ*��--�H�h\@��J�+�Ƽ�s�CJ8�3��
��L��d
Ӓxd\>��e��I�M�\� EbV��>p���d�z�r�%I%�W����G,��2�N�D/[��E�#~��29�3�$���}�H��T�
+i!�@I�C��M�̭��#?a�������.
,��L��K2�3`�Xڝ���T�C)�H��e�z)�
�F��J��p\�$��i}֭S���M�E��7��aIox�I+�$\� ��J�W*]���b�P2ٻ�3�t+��"�@���u
����*-c���l��S��V|��-.E���P�VR	�
�T/��3�l
h+�`��]�ɋC�q�1D��}n��<g"��#eͲ������qőy�Z�d��]�
���T.
�I����
�� �/���@�{ JOf��^��)��y��cD�N"5�"%�p�D��,����
J���s��b�z&��4�a��
���G��JW*��W��!��|���
k=p��DR��)T<��n9S�s�D�n��a��kRW`�N�l��Y�(�nN�M�e��/������d�� v
ao�R=
����/��q��"{*��.��Tɼ�r_
+�(X�8 P9�;�*(�(k�����i����O�v��Ǹ��Ҁ��4@�
���٘A���
+�u�?���;�m9�7�	]+2�Yj$��W%,E'�����N.��I
��Q	�4&�hjI�X�h�0�6���'�R��4��T�L�5�A&&PB&�ͭ�S5�=�I�R��~����2�J�M�T�w�%}��J�6�@e,��ܱ��%�n
+,����w8�!&��
�;l�P:��D��9ݺ�Q8�K��Z��I1LZk�V�?�-@)�j�y�@Ɋ��G��&�L�bC/\�Kƒ,�,�ә�]H�x�C�.'�RT�A)p$dv)����!��u�h��N�~DƉ�֩�	��&��mC�`���0�2��Q����2L`,�T�Ri�	B%�e���1�:P�{��
2v�2B��nH�T,mw�%v��l�7W�d"$՚K	�KJ�6�(�<u�P�t�����K���4�Iu,]��XQ�`��P:᳌��l}d�A�$�sk� Vc�����m�����Q��&�VU`*<k��^�,}2әzi�����㙽e��
P��w�Hh�QAI0)]#�I�Ȍℚ�d�u'cYa��ES
+������x�B�n?빛%�

QI�ǔ�D���tl��P�R�J����B�6:�]��;]R"��
3	5
4+�`I)��}��������`w*)�0�_N\���KP\2X�lB
sxG�o�JPM�`��R�zq�s��G�0T:B�����tS�
��&�}3�ꖭ�HI!u��Eı{g\k��.k���/�=K�4��[�I!Z�X���q�����)3�$�F0�j�7Vq��j+)%�t����
+�ɢR�&[IQ��
k/-������
��J�bg�B߮KdZ�,��T�R��d��F*���P�P��)JE	)G/�B�B[��P)T�4ʽs�	l��G���["�IY�
+��
s�����{����\)~�뻐J�ⵠ�b��df��B߀w�J��҃[ЛY��$��ύ����<np��[@RȬ�n��CY='�*Xk�U?i햦���:w`�SbH�}t�L�ҀMlg����3�
+�P��̓1�@o�ހ"H.�����[��ò���вRN�#5\Bq���f��ıt��aQ�ts�_\I��-IR	 	r�&����t�R�i�=��J�2�$�Jx)�
+�����0I�-"	l�
�j
6P�|{x����S�
�`JU���T�6\Z'KX����ε��S铳��;���5>�YrD��f��;\zZ�4 %QR�N��8ݜ=UL�0��[�����bp�p��Q����γv��v����~�$[����Kw�Lg>��Sr
+�3���3/��#3�G0�rJx�Hr$�:Zs�VR��2�֕��Q
���@�Ҋ�q,�j]a���
aiBXz�%,�=�U,JW*]�y)y�C�� ��%%
+��-���I�G$�b�!<
�N�D�&��1�2�&�]�[��)�Rږ��� sV�@��K^i�`I&�l~�����66���G�h�&L�s�Ի����DfO�+���e�d
��y�f�P'Z
+[|�4@
,����d���K����n�r�$g~�\s�L
K�x�F��Jv;B���A31C���I��ޖ,2"�/�$q4�ʪeY�� �(�.m at Zi�κ/��Τ'X��C��T*4 �+�zN�oA���	�;
$��
�
n��X�$����H�V	Z@(Ҷ⡚-�̕z�r)0��)�)TJ1\R��P)յ%�����
�:�ė%����).����,�~9JGAI.�D�eeOپ"�uC��K�x�,
�9
�*�����kW/��C�
7�Z����������c��}13�y����q$<�A
0L* q�A�
+����4�u�Ȋ�U���8���mt}v)�Y�K6X�ڑ݈���PJTX�	�+��T������E%�Nk�6���@)��2#&){��5���J���sC��cJ�@��n5پU\�v�5�J�S]_��[�8�(-�,	1�.ZL��xɷ<�ek8 H�޴7T��@i��tC_�f�Il�Rc���m�� �A�7��%b����t��.
��e�����
,�]ti�3��әc�3�q��Ai��+ٮJ~D����L܁�/3�rU�Y�.mAul

��X��YaWJ��n��R,X�%,M5�Pd�9��4�P龏J�ӴW*u��߁J�;I=3�l9}��P�@)U5�$�\�[�ow��)U��ꅟ�i�ߪ
+tl�P�`ʷ�%�,e)d�4����K��\U������9ޕ�^���Y
�?�gd��J'�:������8��ԓD����])4�X����<�U0d09�.����
�p�[)�<L��Q{���;�a�o?�{2,4LJ�P2���ʌ���T�RԚrOj��
�T(+��ց�t�%�c`�K
N��d����)%@_X:X��
��c��4�q��P�j���W*���߆J��;	��%�R���v���$�-Ҭ��������C@"BYD�aJ�L��þT^�n
�}jK�P��$���
�#FK%SJ_.�6fFs�k
X��
���́�'�+�2�y�W�0{j�[b��B�q��B3�L
�8�W���7Al���F���KK�
�]�

p1��3%���饡ty*����#�7.�2�����$�5�\�m:4G뎖�Ֆ�

J*�J�<@O��
���Ga),���
�m���
�J��=��p��?�J~�ts#�L���[q�Ni�&O3�*�*&5[
���I�W�R� >Z�
�	��\j{��Ue�`i��F<m�ί,��]�C׬����&(�B!�>:^�}��
|
��/�tۊ^Ca�@��*&��X���팫��.	�
z��
O��
2rv٠��9��Fw\�J=B
�47�t$���0	�
�Jp�/2� Hdq��d���K���lRA����J�N�9���������%��u�$�>�Jt��?�J
����
S�J)��n2����gȤuK!�iv�VdM^
s��A$2!��K�5�U��� /��*�`'
b�;
FKG�����,�������֔�]e�J�Nn�4r�O��b�Z
J�p�;ݐ���e�I�����K��
)Iıv0�i�<�����tGoo�4,-4�4��
3��S�-X�B���7 %0�:�Qn��8%�
1	݈PdH#}�d��RV
�L2߀\R���,�K�q-�rWJTN�aIĐ�û�X�#%*��JW*��ou��3JPRR��
�b�?(��L"$�f�%��y� *�R���4k�p� �Ԍ�Tc)��4{�`�Ī����w��k��A�
�`-�ݼ�K�J=P��	�tWX�#&���}�n�6+��_�n�������ڽkw����mL���/.o�,��܉9�$��E;x<���!�u���d�[̸�eFf�$Jx��'���V�; +J8�|�A���%�+K�ohm�x�&�R,X���{���A���J���9ꏻR��H�H�d�w3�߁�-�J%�R�U7�KW�FʵQHR�z�VP�6x� *�0�����V[��,A����
+JK6X�tJ[���*Q!�L
m�j�#G�"����
�JXR��]�[u"��S�$r
�r)}��
���W�
+h�m�R�v���e�:�ב
:���,��4��\P]�
��u��
(�d�*�Tk&��6,2�Bt(��V�
+��oH�KX��4��
�J9��hotP�)��[�!Fc��2I�Ѓ
��T�R�}��PI���,)
�v����-��I��j�b)��Fp�?d�@&piߪp�͛�ҥj����F.-�e���4�ť��9�F47����{NI�P���
��%�	RFN;ݘb&��m��D"��(
+���@��c� bB/��^xI^8���

,�K��/)�$�3cT��r<�k�HP�j�Y<��b�
+mw֓K�ȶFoB�g��
+�&�7 �r�6;hA�Kz��X�r��0�`�7L���d(�P�s$
~��?�J=���
��hW��1�����;H��Z�$����N�^N@��0�]J� bR��\s
��ES�T��4J)u<�k��!X
>��
T���^��ŒYu���J1�����g��'z��KJ���N7�E���綑*�G
+����׃�n���NdW������q/��ү���
,�
�.W�����ѡR���TŅR �I %�HP�.a��LB7��a�ׯ��՜���#+L8����K��-�J�)�����Ħ=��\�Xr6��E�;L2P��JW*����*Md��J+���}�P�����(mA��I`�H�
��Y͐L[
��P��K��S
^Y$/��
�����ү"74��vg��k&�ԡNc�{C�%oF
�L`2Iw� ��}��[��� "�+hk��Q"Ox����j���so�:�
�	��s0
%����	��'�^(G%����UQOκqIiY����� �o�å]���U$��R-]���3%K�C
�[̔3�D�M�]��O��'�B�Ձ�w	���
������f&�
3I�!I+շ�C
+��._Ub�T
��%�M5��!

��p��X4H
��!n:�Y�!�}�e
�
�b���v��g��(a�	8��eb���1oڴك�S<�<2�*������U�^����M��a�/V�a�{�'��0ǫJ7����;�D��
N�A[
(�'���F�M��x�I�
� �%A��
c)���A�=#+,SZ�5s�ѹ7T
+�t��?�J����a��:
��S:V��-A	%f����ZZ�����hQ��K[� �g�T6�.-a
���`����	ut
��	}�U�잾��P�J�!��f�KJ<#�3N��$��!( џ
ϵ8�t̝��vU�����|�
?9XBC��<:EtZ��3����P�Sh
���n+�
ʥ����yr�����ʊ
+�:�%L��9ŵ<�W���~�8��.-�.�)-�pɀI3��ԑ��R�J��9	*�����Uy~��R��}��*J*P"&)�"$1�b]D��J�@�P�-�K_���N1	v�e��;*X���ŝ:���+�Jpir��t�P���4��҆�D3b),� ��w۝�$a�ȼ�q�c��
�'�+X0�^���
υ�e�κ;X��j%���3o;a�V�0Tr�&r�(a�n�b��$3�Ft��W�K��€�%}CZP��PSX
Br���,A�1���	,�'�+��T��J�Jz���m��RRV�j�#%�R�|Q���DHR�%\q�y}�0�^��UiU��X�Kն�
�S�
:X�����#K� �������
��
*�=���DJ�<Qf	Έ��
����2a�[D��|!���G
���U s�v腧:\2;8:��H�t���K,��l�lN�R�Цb�b��d��%.�b��ef݈���u�|�[g�����
lYP�H!b����K�\�����w�9\�s��
*]�􏣒�-�3��UC��\�R���B@�UJ�I�bE���K�UK�Q�wJ��� ���၂%rĕ�9�����gZ'9�k�u�q %
ΜP��5�>�ύ���}(��A�
���2�'Re"�B�K�z�]�
�O��Os>ن㉍���Lgg���0�	M@	��#Q;�A2�m�Y��̢"IQ"<B
��,��_`iiwx��79�{����q	�tg.�(u�J�P�R��4�T
+��Ձ�wPT*3�d
�m�4
��a�ER�
�����K��*B,���Ғ��󲀆��`���Sx�ȂJ��7�8d���t�ܽk񎲱��b��T\BP�S�
w�B;>;ݲ�d+�۟�-�A
PH&���\��}��
���Y^xG�t�g>�I%X�p� ̩B�B�7�`�n�)W,�\���f҆���Q"�Ee
+�()
+��EKa���O�Z˵���s:
ذ���JW*]����pM���wXTʷJ���}���^+ׁ���~0H�j���r} ��\,)�W
v͡�9<]W2���l �7�ݝ9Z’����qzJ�d�[�>�{�fnF�
��<���D�d�t
:�?|\s�vc��$�§o��3ә�x�T�Wo�xG�J(�pʔ�[����-9�̶Ĥ���-��P�^�AD��x�B�����N<skY���R9<��ҭD��RW�t��?�Jݗ��*-�KPT�Ne���#(q�DLҪաSꍭr�b��X�
+�%��a^�`����,Y5:=�'��&q,���P騪R�}�
q����pӎ���$��I�}s,�:���1���m��3�l�UXj2���c�����1�Lb��A��
�lW���P2����Ǥ�Ȇ�#*#)�Ϻ�2 �
+K�(�̭ef��	jO��E�dos�B��`��C�ɕJ*u�J�V
��&��ہv9P�%�^�$G�:�!�q�`�D,�/u��e�)ç|q
+��
��w�D
+�K�&X-ǚI%ZE���y�;�>���4
%,O4[�	*��+`�#�oC<�D�
+���	��K��Q/<���
�>�]6K4������Pi� L��"�0��2����%�lCOn����
.A��lbi��
��lir�gz
_q�qI���Jn�4�;q��ߝJ�P�Z
6	�﨨�֍%e�A�5�����K�qIb������
L�D��X�gu�	*��������b�GPꮣ��#}���'�J��]˙ ��L��������s�eb}�����E���^���py�GW�k����A�A?<�Ǐ��T\3�İ�v$
��nD@���(I�De%�	
+�xM�bCk�r��xz �:yA��9<=��pI>�%�"��(�\���3�>F%
���Ձ���+AQ���A�L����?�/�Z
.��}�K���Zlx�`)���JO�������d�:���8v,[R�޲�F�
�S��O���?��⣊�W?ԲZNv����.
��RxmJ�''����M
+�:�J���-��cנd��[��ɠ��W��{��џ��^�ޮE^�(�/-���IXRݙP:���?l5�U��
:��P�	�(�6���0野�2�g+�Y"\�
�i������b��%��4#Im�dɃ���`R
�>4�ЈJ��q�����T	���-�O�}�=�J�t��r�[�.YX���ʄ�u:�h�Xa$K�1�qx�w�;�
���\Y鳷ᴅ O��l}�wYIP�Y���� ��r���[�{�O��]�Q����E*
+���Xi�e�Ԫ=S��U�p*e�&�!��r9P2��I�����ˆvA�E&E���*O�]�P\��T�`���%�frmY?�D��� �
(��|QiD�8*�
[U2���:�;��
�_�(��
&���]���?SZ2:��K�JJ�H�p���Q*��С�"���\����r���SA&A�]V�A	�\�<L�7����GϿ5��w����*3��rQx|�=� �G��
�3�V��R+uW��&�[�)P"�	i� �ښ��.�� �0�5�R`��r
�%g0�J�Y�=*z�’�%q��J#*���҇�a�,���:RR%�:�Fg�;(*�A}��D�]
q
�V����~��Ң��*0Yrz�	h�%jK�IT��#�c�l���m
q�pgv��%3Lc�B.S�0�(�>`�ä[��?1oG�?S]ZB�t����Q�uw������%ڞ)[a��X:V�y��$Y�٭�jV$�1�5�
U�l�Ԏ\H���/�P�
:8Xz\��
���SUZ�!z�H�<`�3J�hD��ӸtT�%�W�R%�:���f�6 	_������,�Ëa@
n��L��0=Kf
+(��
Ą�ؙ»���+�}0\S��ϓl����[M
��]V3��d$�
J�	rAwO�M�\�����ݹ(|�mKF��JK)
^T�]A�k�Q�l��RT�M�Dz[.xV��(W,)�6;�T�(]z�|aK��;�ך���D�)Xb\"d���4(������I|
zH׫��Ҳ�h�O��C���� ���-�ca�rx6Y22��:d�3����W���)1�XP�H
$t��'
(�0
	J��c"�޿��W���Lj��D���,��$p�S�;S��ѩR2��F�Jǹ
+P�fb��(I��6�wl}��T|���aiI����;�Ғ��uK�>����å?c��҈J�+*}�?		�\���J�H

g\���Q}gA��k��XzAX2�p�,��ғ
P%KfB+�
|
+���R8��aI�RmW�
�o^}��\
T�YP�	O �DP����p���S�B�hi)L�:����h'
9�V�y�&F���Ί�LId�.��`R�F�U�Y9~ai�_ŽgW�
�w�GG!,i\�#I
+�>6��rO�
�R���sY]�dx�*�IC��u �����~�4���%#��U�$��ܵ,)
+O5�6x�KژJp|m�Ib�~b�q��
��{T�+*���2��%�����nv"?���l(��qƒJz��l{��x��F3�II$AI$JqL������7d�P�A��A������ӎ�
j�D
�V�
�,.�����@iD��2-���:YyG3�x&U��w�m_
(]�@)i��1���%K����
���(<h���Lb�Ԡ�5�J�>����T�.X��͗{�[JP�ݹG�
��Q�!�o7��*
���W��H�,,5j���q
�Y�n����A$a�g5(�@"a�#L%
�i��Si��,�zdzHj���߹��.���O�҈J�!*}����0�Z2m�^� S%�:g�J J��YS��M�~p��u

P� (<�H۩cI�
�,	XJ��9�RQ��raQ��'�d	�\1P�;A��o���U�K�(|�}�(-9wG��#�]
,��3�̀R-��8�9�n�FC��
`ljJ��
D �J��5
� ~���`�X�U���Lrxm��x}\
+��Ǥ�҈J٧q٨8IݬT=.��W�z+"UB����@)kф�Ɍ�,�
o��zA�C�
+KMQ�xa���`����
�r��|����
h��[�X(
�$<J����x�-��\��9
f<Ta9<��;�&KVm��3=P��A�
*}
nI�s�m
T7�����Y�P K?��
�g�%�x�����"T�Ǧ����mq�c�H�{?
++5�ЈJ���^Q��x�uXoʍ�*F��J	P��4et�MXYڿ�K�$$��Tx��R�g�!�,e�`>�L)��q�����߉�R��B��siPZ,�;&E,���K�/dn9<*Y�,���j���>���0���e��"	Ho�b[_����o(?\�v��	��
��Ɣ 
�j�i-�7Q��S���G��,�~���FT�<�w�J��Z��q�e�5	�(Uz����cu&MY�%K�$�ޡd
+Ϫ�K$��]�
,�&�Þ49y����
+W5�R.X�8��	 ���Q�ҋ�
�;���u�p��`f�NG�ջǮ��dk�i�,��3���v���F���ۈ�H�`�7(�k��PK?4,�`�VHj�/
=4N�
)
~�:�҈J��q���!cU۬d	<�:T�Ìu0�D6U�5i��TY�z��P�� ِ�
�Y4�?����;�qgP�I�44�
��m��L��[���[�B�(�G<
+'�W�yM�,Y��]�O1ߞ�n��+E�6©�����/�[1�ب��UB�گ�"���ْPܖ�Ԯ����F���?$��C��k
J#*��E�Rp�#
+< �P�1�Y!UzԩR�ڡ�M�H� (<l���
�,,9Xr�Ň%�KQ�q�ƨ�����Vn�"�y�J~�}�o���2
+�ik
�ÖF3K�qxb�}D���96l��#
JM/I"��֍��ӧ�b�H�[R�A�
$N`(Kط��njK9�Z%�+OE7���������J(��4�R�
gx<ס2+h
V�|U����R�jfM��8��@K�
/Taɍ�Kݟ�SI
+
��XBRZo��igR��
+"}��� �u�j��G�vKԦI[��x��υ�b�	Q
4�W
,E�3�ߤ�k�9�/�ѿ�^�ē"M���rg�J.���ҩ@)Kl',�W{Jj�6�)OL����<
��~��qFT
+��{@�Pn	�x��
�
��3R�c��&�{���Kb#햞l���P�g�]��%/�Kw����������ҽ���"}1/X,Ϩ���?R�t�SK�
+Iwg�p���7+��E"Y�{�ɩ�6�>v�\�$��b�HW6E\���e��1�o��-c������C�����5�%���[gD��ӸPT���DMh��j�]�A
�W�5���I^2�R{Tr���
+i���
K^�RdMz3������cR�L)�*݈TɌRST����z�`̓���ݝ�¡�d*��s%
/Yj�
�a)۞�����%YW�*���wl4(*���D��;���v\+-�a
��
zH�"��Ƙ��<#*e��%�R�&�
�B+�݊>�5H��Y4mx�$Sx�	����:ֱ�
�ҰQ'V�uH����J�
+�3��bW��E�(u�fuG}����(�U�i��<�J��ɒ�r����ed���I�����EC�M�,L򍶧��ӃR�X�ϊJj�ó��L���3SZ k�)�]m�3�R�i�;TF�^)< I��4Tcs�W^qF+��ta�P���.�%�C�JM
+K�
����K��Xx�v�Ԡ�D�Rr3D�p�>�R�C��WҰd�<�Vҋ��O������)9\�빼��5��x�0�ЪI�*A
A�]�h'$"v"Xҥ%��vd$�{A�擥��/�L�ohm��§�PI��Z-�HxI�CC��-Ϧ4��i�w��A���}N���
,��;l�Q���B�ϑTi�������o�)�|��
D��̌��P�7/t��*K
�!嵢nΏã��K�B	VM:Ux1��Y ]F{���`ז]�$~^���:z��Tk��64X���<#*�KTr���N-��<��6Scs�/	S
��t����a�G{/��i��a�iL��l:UrT��$����^}":
��k|�)X������Lɢ�!�Z
�Y>RK�z&K���#�^�A�J2�eѤ���hV�Io��N^i	�Z�
H�0wm��$K
p��uFT�>��D�����J��'I-�H�͙��M�����N���
Kf���Gr����e�iX�'�>�t	K!.�b�,��<����J$ [...]
+
l��K�����<
�0�K��%D���N�B�;a���$���k�I�3���ârب?I��H�Q)�4.��C�tY�,�0Nrg	��Q^
�"�<�V��/�4Z�
r]9L�3�&��.P��Ra�+����E}�
�]hO	K���+Y$�����<Ș�ZaRײE<�P�Ҭ���6X��������Ԋ���d�V�no�9m�d)f�
@iD���x�$?�M��dt�l�r	-��*��JZ�d����,�����x.ҿ�~.I�D��(
�ۧt�DUs�:H*�m��#_֕����Bۃw&�ݓ����iM��8
ZcLj�ׇs^���R �;�	�
�-#	�N.�

E0<
Ex"Yr
�����!c�c �jD��ӸHT�;J-v�n\!�J�
/TV�x���Z�
�t�U�gi��IxW��؅���mChp��K�W��®�_7��::�nG���¹�V�咥��P�Y�&Kӱ�/n4�fN���K�T~{>���`�rxU�P /��7k�,M듥�P� [...]
������=��5|�D(�ZǺ� �R�'�~bS��3-0�WTуM�fv��9�ψJ��q�;�߉-ܭ�
+ ��ǖ��PI���8s�nIo*
W�#�\"��Q̪�bR�
��b���zEL���Ū�*
u��|'턶�



P�%+K���gg�j��R��
B�/*�H�Jg4��<
=\e�%1K7Z l�Ӟ����y���g�qe%ѭ�񻕎++ՠ��9���Fc�����H?�4
���>joG��:|�{�W	�JkH�T�|��4�5�-Y�%?�L���R��u�X��j	�0���ҒR�����)g2��@��A&KN��{���z�vM�?#*e��%�R.�=���tC�lYi-�J�%G����&SBi��n�F���h�È�R���x5�M)K�Wi+�J�j>�N��%�
���dIpC�8�3��[��ԠH�p+P�^%J��R�ފy��2
=0�꒥�K��
�?�^ψJ��qѨ�@�5�Tݸ�ㆎC�����O<	��.�4�XTj�Ӷ/��o���r�X[U2�R�
+�}�'?�
���A�4_���7ww"Lʅ7�,�	T�W	U�T
+<�Ѵ�T��vɒ���>,

j�h�^�gD��Ӹ|T�Mv��Ж(vx���N�Jw��U�C�g���ywG�й5Ǥf:�S+C���RP�R�*
�����:��
��,9nh��q��w9T�Z�8	&5"�P�0'�X�-�T��޻R์�>�G��diI��;] �kK�g:#*e�ƻA%!�
��#]�8P
��\�#��_{�
K�J����s����J�q���k��0/}�m/�W��R�
+*]�d���c�xp��;�b�;$e	<-�|��ͅ[Z?vD��
x

T�
i��
�ӋY� 8H
+oD��ӸtTR��
���@p�YM!�ā�!xǢ����a�B����P؆�yuyT��Qm��䑩����[j���r�X�T�T����7���{WY���be���d�GD��.
J��<?�0�+
+�8U:DJ�g2��
le	ex0KwQ.��~r���2O�
���t�d���{h��b����h�ִ$�\m*�,L�
6,�
Kw=���Z`
�e��d���\�R�.���#�ƫWY��P��"
�vБ&�����ߓF%�}L�������
%�h�_�
��3�p����,�7�diD��Ӹ@T������b��;�mm�&�5'���x6m�sl�-`�E���h�����{�f���A�q�����z2� R���J����J n��!����א��ËxZ�@���
�YU�͔J�H-�@nx�+5�E፨�y��ԥ�H�0u\2h{��q���h+@�P�l��P)h��J�a���Ω
o���@Z.
��JÐ:hcI��p��]R�"����6���N���ylj>o~+_:L�6�R-�@lx���uq�3�R�i\**��2���X��D��d�C��ik�E��}�Jգ,p�Ì�;L#�
Rqw��ј�(�
+<lVR
+��j��R4Y�t����Š��]{�j
⡄��g4'K?�VK�V@�w�%(�A5Ҏ��y�J�%x��'D���
*U�4�wH�
:���R�ߥ�t��d J����|�?��3|�#�ʫswS��YyW��붎�T'�	.���L�g�*�fr��%� X��H4<3�7�vD���xw�t�S���X��H���gZX�)*��8�8%*5¥f�(�㺒�lVr��Qh�b�R��Q���Bﰡ���›4�^x���bQ�#�l-�t����QϒPK>��ㅘ�pވJ��q��	�H�H�>���0'}�G�G�JE0/�J
�ŞN/�TӮ�F;Va�
+�Z�!�Jں��
��S
��~�Lp�ǵ�5��r�u(��|y�Ӫ M�R�dN;<3��>��G�X O�0���ռ����5;��
������20����:��
[h-��,��E?\����#ލ�xp ��o�)�I��':�w%��r��p���l�� C
��io�ӎ��y��J����W]��&&��xG��B�H�T���S�H�w���ĕ��N@��\�h�����?����ݦ
Uxv�p�;x�����&꛺+�yQa�`B	�^�z��[
+�2r��2O�BQ)�+�l�`
+
�3%�ke�ƨd��s��
7�u�p�b<�9.Pڿ\�\xO��Ek�t�#�O��	
+O����!��2�N&�R�G^!j���:�f��������iGTJ�����t<*%���X����5;�ғC���6*���K
m
�D��(�#ߐ��eIPx<
o�u�\�&�{��VN���x�%�cq�²�v�$Qx��V崟��ӎ��y��d,�0a�|i?����)P�~@)�xV�y�[eq�
��Jo���U�o�Վ��c:͑Vɻ^��>Tr��Y�&��~�x�	%�[�4�p�ZDrڠ�4��vD��ӸtT�g����Qa��NN�;9*���IT��oow�7�
�'\b�Tx�f̶~�DG�#��“*�6u�y���-�Be鸄D-pfR9�^Sx�ӖaN�R��)���2O�Q)11\s�0|~HH��Y��^5*
�*��[e1TT��aY)XD!�EK�t�#?m�£FZ;
όz�K���J�Ӆ���'��
+%ě�Qx����3�R�i�+TҾ���p�̌��0��5�C%|��JF
x~ٜZh#�P��w�{r�Ux�B��f�Ym������iW*+��⹗���`ր����Uz��i�XN;�)
#*e��ţ�� ��9gvb�f'h��cQimQ	WYx��n���Q)WVR�kh6{��k�Nxě�Ux�'����-h��
�v,����	�_V��J8����4��~h�~��3
Q��ii�f^,�ἰ4�R�i\
*}�G%ѮN
yTz�xTJ?h�J�S�ͩ�g|:o(��;�]y�Îw��:z6?/*5;LT���|��
xC1�k@��,����N���9훟�2O�2Q�c��{,d���
�[Z�
�p�@��*�^��*�
+���7UV�y�/��sH�=��FZ7
����L��b�3SCuV�hWUV���&��}�r�ǝц���I3	������*Ŝ�D%�l�RnbxKk֢�/\��Pi�h�+�/�DY��e%��eh��;�m�AQ4��8p9���l~.j(j����l����A�WV\(!>j"�]���y�s�/C�i�Q)�4�
*]'>��c�ڕ�0�k֢҆V�#�pA��s�qjnޠ,�ǿyG|r��m�-,ͣ���؀gpw��$o5�]�L��
YV��'�
�j�s��~���t�Xj.�Q�����E%w���e����0O�� �
+���J�X�C%���G%X��oC
�j���
#��e�GWV��{c��N��Qw
Q��[�]祥��6|=2��s[)A���t7�ӊ����<fSLgD��ӸpT�9K�v�e�� ���c���:ͭ��"Q�Oڿ���n��Ju�����qo�Uh�E������y20��NpS���ۭ�j~խd����d�s[)�����R����/�Q)�4.�bM���O6��&ړ�����P��#TRC>�劃����ޙ,,}�MRw��OZ)�}�jh(����1�C����4�׽��,
Kr
+������ΈJ����PIP3l�,0�J�Fb��Q	W�_2*%��z�R魱B1�P��w�[��� 
��<��<*wHQCg�Z�I�!�B� h��t����>,����imǒ�3
2�:�R�i\:*���P��hW�&ڞ�I?�
u�T�
����ED�e��Tj������bl�Y#����J�t'��F쐧]��?��̱o&�U�rZ)�h
Qɝ�����3*��[7�!��'k�T��o�Bb�
��ǒ��%�X
¿yǾ7Rwq��P�G�q�c%
�sw9T�)�ο�:����L��RB�L,<+�*ΈJ���Qi*��vh�D;�R2�����;�����cߛ���j{�����Cj����W�ԓ
Đȅ�}
+�a�}�@¿�P�0LވJ��qi���et�5�v6
�З5�T6@��A�R�cUID�y
+�_�O�Ǿ9i7^ר���j�ὡ�r��_�=���A1w�����P)���x���A�R��5YQ)�4�*���܁�ܜ^�/k�Q�oM�|s����\�����\�;4�Aox컋�
��Z�k$»M�ó���
�O�Ł�V��bt���q9�e��κ�utbaL�0�R��#*����CwʚY��J�OT�T *!����P)>o�F������
z�c?=�Ѯ��a�
PC�R�W/w*)	޽?�d�6��h�sۇ��~}C���X(Ex�C፨�y�
+�����i?�
8dG;kַ+��J��A���J�9�J�~�K4�N�
�{��<�Ӌ 
�
+jh���L,!«��=��j�	܎�A��TZӊ9m	˞ec��
�i�gD���x'���7_���1*m	����"Q�ڢ,W�{����߼�oORC�
� x�����q�!5�vV��tu��o�y��@s��������%����
+�\c�ZfQ��<�R��GT�
�pc��<O

�:*sK�J	s�<���u�%�nZ�sG����
��
~�N3�s��,��tj(�J��Ղ)x�=��j���,���/!wЍe�fZ�Q)�4�
*�pV9o��k5p�Ĩ4� TJ
v��F�j��� ��>��"�T��پ�7tw�hu�|S����[�/ ���V/��1�M�FT��?�RWTJxK5�����
����d���9�
�����!#���0����j�m���[�d5~G}0��^G;�R�i\2*�c�id8������w�Yc����'��R��./����WQ������$��u�@����f{��>9�qf�1�O��
����9��Q�?T��ٜ��n�pV{���
Q)u���`�
�ز?�w��� �$!���
K��`�
�<�$7�{�I�R�{�<ǚ)��
���i�m5���G�pdx~8k�
hl��
������i���n}�c�
7�Ci���PF�NꉺB��M\*�
'˴�������tT��
O��uw��5/�rA񨛹��-�
��;T�� �l�^�Y�a�le�pR���p�@�j�mBHT�mu�7aZq�eZo%�:�%�#*e�ƅ��{�1T*,*嘥�;�Ԛ�*�M�����Ţ�g�
X� T*�P��M�T�/�hY
+�J�i
�Ѭ���(Ӻ�3�0��c|�3�R�i�#T�Ux�}ݮBe$c�:	ވJ��{�hs\�`�n��[�-Ge􍝰6�]i��ۗћ�+�r~(�f������]�w0{5�aɯ��{���\�?m���O�=�RT��,�Q)8-��I.�j��Mz��r/�h��h��o�F{&�e��\t݀�T*
5����4inXC�uD������'*��+��l���'�J�|T�\�߬lPi�\�w�-�	kwQqW��
�>6��R�
C%5ir�7l��?m���O�]�����"���<*�+S۬\x#4.��`�8������b�_��oj��pң�E�5!P
�ծ<;�?Ǵ�
w8��uD���x��[��
Q��i�Ja�b��tA
+��[|��,*�����J��f
���m�\I;E����������trT��584�R�
+�ޯP\
*�8T:XT2{��#��R�F�7�ZCT�

�5���.�v����6ڈJ��nP)��6�^o�^iD�V��M�]"*
*
�Qi�v���t�q
Tbz[���k�dvn��G��Jw(��_���ozFT�<�w�J���0�R�i�J�f�#4q�=:Tҍ0*�,*�Ax
+��ݞ��4����
+��.�����cZGT
+O��GT�}�A#Mp�����*��?��;�P�xW��#�JŮB���C�M�xց��}�F�4���3n}
�՜��p��I�3��_�X#*�F�$W����OT�Us]F��;�
���=s����=�P	��ww��Jiz{�x���ri����FT�LT
+�~��݊�gwSwgqX*�oD%w���ũ�������C�9��Qi>�Cí�.��ޞ%�D��.�!;]�*%i���*�.�{�3z���́�R�*���q�
�Y������
*
g�gO�t5d���BU
+�g�{�W�������J}�����Pi�ҿYی��
�^.��,V��
*
c�g+Tr�
���‹B�_+�T)s_�2��w��?�R�wn�qo*Q����J��
*E;_�-*����KE��B%�.x��Z���@+9��zf�����N�Jfj��տ�?���9����c�C<�Jv��%�RXt����e��z	Z�
+��V+U�����J�@%�e�7Ȍ��;#*ePi�;�Rm��L��G�b�
+�e^�?�R��#*��Jf���7˚Q�LjJ�����uw#*]*�&Pi7�R�EN��GT�	��h�O
+��#*�ψJ#*�'T����߈J�C�F�{B��hR,kT��ͭ�{���Q;\4*5S;\J]iD��.��ՈJ���+ՠ����
e�����{�R�O�.�4��M=ޡ���+��%*�j��3������tBT*
*��2o����J�l^
����d��e��;��U���2<|f�����FT�
Tz�3��
�F�.w^q�s��4v�F�Y�d�D����WSTZEP�Ζ#*5E�w�_ɟ�:�P���
��M�ġ��J�MP�iD���
��]���Jr��C%[E�4*)�EQ�~���Em�����t�z���s
*U*
�!�п�3���
鱭��!o���.pm�J�*��,FTQ�=�ҟ*�s&T��e�sAL��Q��v�
����%���t
������*;�[�FT� T�ר��ruXĘ�����&��	���%*���ř�����O�v�7���t���w���*9U	�ҝ@�H_�?�=�	�TT���*]��_��G�C崵˹�\ΈJ�d�D�ӡ���*=��Tw\x_�J8o�����!��_3��Q)��
��Q�8=���dnXe��q���ET�
+�3
Q�=���~��J���|D���9*�v��@�2Q��SFo��1���]�Jm���J�A�ҕg's�^����v؁��Ee�ʕ��
���Q)�4�%*#*u;QT
+�O[T��T�2�:~Z
���ۭS�n>,o�I9�ר\*m,*mV
c��R3F���I��G���J�wC��@�ňJmO3TJ5d>bC��Ę��98u�
6�v�ay�*�ۡ��\
\�
�Ш$�D7��i�v���t���ۢSTR5����tD�&�t�Qi=�R��
��/Fd�i}��S��a#o7���kT�s�݅iT<;Ѹ�r�~�?��a��0��Mh���JSW̙QiqX�u(��#*���6'�J�֗@d|	�sy�
^���Q1�W�C04|�F�v��v_��x�rv�0HTJ*SΏJ��i&�D���FT:���Rn���ɹ�wx�ޮ�w�5*\
\�j�ϻ��j�Nv0
ѭ���`M�
G�J35i�¾��nD��Q���D��
�,�=gF
����oP�8m�톊JD
Mj��/��2��ӕk+��v8�p����Y;����P����D��e��IŧD��QP�?�R
c���P)W8��ڕWa�|}��t%��8�o��X���gzr��@%��u��Ag��N���
��P���v�:̋@���P)�M���=�ҵE%����M9�RSc��;�R�p��hxk�ܙ�A����v��7i�L��]�����>?�aPF�����|��R���NuR�KB�%ɉ�J�zG�;�JKD�݈JM���;B����R�%rjh�}|�z 2h}u0��W��;���y;h��
�O�hn��4�pT��D%+7.��_��̻�;�4Ѳ�b�΃���UT�[T:�
��
��`
<�Rc��[�R��va�moE���<��
~{,v�ڕ���7M��E��<oפ�x="��%�ҏ�
��c[�nv�4k+�(T2�l�Г%�C���C�Ϭ*����J�����o�J���ʖ(�L�y�4 �������<�axM����V��*���E�d4�NZ�O���ubme�N�`'y�@���K��!����6�΂J�E#*57���X�Ǩ�J@
r��98u�����

+�M� �+�#����G�J
�Z�n˻n5�:�
׳H%�W�rg����`����T�υ��zH���+
+FT��w�J��d�tp�JذD����U�z������P|2h8N
���v��C>|]v�
��%P)»>ޕ)�u�����R�Nχ��r������7���0��
6*Y��D%�T����kQi���
Q)��	*��.|"�_

��}wN����qk���
&Ү�Ǚ�]�
���)�5#���Rvz;	��ڕ�l��4ͣ��DmS�߇{�GTQ��&�"��X���k,����;��7
o�����6���=<+*E���𮻔o V�oǗ�}C	�ۂ��	�`'y�PIo{���┨�J�Y�**U1�y��BG���
Q�0�Rc��
P��Da����
q�k,��:��}o�ݾ�=1ax�
fX�$xW�)��
Ļ���
�h�N\��?ߘD%x����Ą�����S��7tT2[�7���2CA%Y.Q)�#��RdP(
��kxN@���Ա�M�
�����p
��5�%���|�/�S#~
�h�N\�3vr�s��@*9i&J*�iT*q�H����
�Y3%�C��ɭ��:-c��7T��1*�6)��J�*�FSE� ��_�����(v���v		^�b�I�y���7�nQ�Ͼ����s��
m'U���UL�2 ;�������
���'G%z̍Q�c�DwTڌ��5����Q..
���
+�?�#w���
���qo-;�<C�/��K��@$xu��]�w�"<1	oo3��웉�bj	D)N�<�,��0��M�.�

Pi����G���~�뫸8R�ߚ��-˓����Qi>�R�G�;*��dLAg[��g
3�VǾ3i6�7���֜�Ү�I�Z�b>k�Ijޜ�w���j��^��v�;���n�t��%F�M�@�{�Z�G%�u���y'��u��UYO�J��z��cD�܏\6*E
\��7�d�
�KZ��
�
��Sǽ1����;XiW��΁J�Xb���$<'w0���P3��N?��'˹P�(e83t����Dc�l�s��.��G������hQ):2�Jm�F��(*}Q)���b"�����nu��
�\Dwsl�b�Ay�<�i3c�C^�~������H�ϛ�w�
�8wY�
�&��ʉnV%���l�?9*����t뵨��6ԠR��W�ՈJM���{F��$<
mv�z��;8u�'����-3b�3{���!9	��
�u��K�Z�N��/�%$x�G�D%CE�+7
��g�f�?�%*��A��
f��z+T�3M�:f��J/
+��ŷ?����w�J�܁�uð��N
�����\�$��(o���*�7�]m�D~���
+ǃ�p�;a�
v��De%,�-�i���N6�s�4�[T��.u��L����;���;t��9*y���A�fn}+7����5����iP�p%H
���nWX��Sǽ-W��k,�"zN�08T�o �r!��g
Kg��x#
�*n��d��!,����Nv�Q�Q� �$�ܮ�F�*J[Ҳ1,��u!���F%�
�߈J#*��A��$
K�E0(��xW���n%YV�=��������Z�r���_8�
W��(���J�b���;��C�9h�}T2��O�J��IJ�:T���M�F3�n�hy[%'�8GfD�܏�TJ�Aa��}�{1�
���
�:�M��~��J���+���ŝ��p����/t��}<�=���ې���e��O��N���KT����J��o�J+��E�X���e�J��jnυ�R�����Atp��+Wlò�Ey�0Õ��.(�o���v����ޕ��]Y)!�;�ʿ������r��C�� ��0��'V`2*-�Rk]Z�RC�>W��4�R�1폼oTJ� [...]
+�LV�� F�D�.
�����At���P)1��
�Ċ��삥�@���\�N�7nA�q �A���^)�J�JR�3�R�1ݏ�?TJw,���BSx�rp�ȷ�K��J��n�K�+���Id��J� ��C�[J�J��v ��)핟Җ�R��֠�t��1*�DR��,��W�ժ}��d�v+
��?��W�>p���U�-P�I��aD�̏�TjرD�sZm�Sx�rp�ȷ��*v�%�

����p':õw\Rx/����g��H�&�j��
���hoE���`i�C���� ��Q���Nl
N�,f��>8T�a�E��<�{���f\���z���D%�#��
K��q�'1V�����i�Np�Đ��szc9\mx�Ξ����p���)��
+���g6�hV��2Ji}�|�H
�;}�O��Œ�L��b�C�+T2)���ȡ$Y%�K�*=W���Z
�
+���+�[�+�J��[ᜋ5�#*�L�~佣��2�6
��e�b�z�fBe)�4�W��jQ
�@P���d2܀³�tQ<s�$?�cmR�
�*T
+<�kz&ZDj�LubIAD��p7�ui�ً�C�˲J���7�a�N������𓠒
t�P�eD����CTJ�d�m���
܎'
1Y�oEC��-�����E^Y��t�(<�pI�'iRT��S%�:$Sړ�“����
G�D�٭�_#�N�J���-
j<��T��ӧ0?]���i����#*�n��ݶr~���:,1
E
�_0�����2F�
VnN��.�TH�W�r�
�r`��|s���~�?�LS�0�-H���m���N5���jQi�
:���{D%��ff��V8p����J���Ө�Ө�
v���_|�#*�*u�2���i��������%K�T�EC���y�I؜1DTJ�����)<�Hkgᙡ
�
x�XB}�_�,�j
��L(���
�� �:�\�nMs�
�m�y��O�{_1R�h���բ.���wU #c���:�FT�T�#��-,�*<����jCJ��IC���{PvQ
�#�\V�JH'�
)<�H
�c,&۟��j��T	�o��b�Me!��7��N
1��魕j�ً�n��\����R�-侗P�o�]�J��૱���z�n�ˠjQ��	h�(���C%z�#*�9?*�to›��A��:8�w���

+,ɷ!��l�%�v��7I��QV�
:�UC
+��,��Z�`p�0b	��~�!�,
��?ج䧴� �uJ��y`�k�)m����<F7ٰ�*a��ڕ
�mە6��
�v8���8T���d�L�PI,�Q)�#gF�
.���r4C��e����8��Nt^�T�L���EZ�
�/8���N�
i���Kg�N�Bk�M%�������R`'
X��?����)mK;�B�F.L��T�����6,9_���x�R����JΩoq� mf�?�
��G;ԠҽD���T��rD��O
 ���9�睦�
+7�rpv3�b��,�7!�J6U*�b�C�C��z�R�hy
+oj)<V��r�b	��(x����Zh��)�^����nQT�w+�F

K<er�T
\���r�I��̷ja������b���C/fht���G��0�L��+�
Qi�����	�wt����ށ٠���~5{��=�#FR%��Sl�֡��k�J}Y)i�t�ل��Yя��ꢰ8�o���%��a� BI��W��H�D��Ii� �6�(N{�5oXB#ю%
���������d�5����
�؏��63w,��G�ȫ��WP�_� #*�9*5�rm
^��}	
��;0d�����,ɷ�v���%6�h���T�8����Ѭ
+��8Wה�a��H�^Μ,i3%R%#
�p�r�����	�k|��vFkְ���&E�$MK�[�R��{,L�F���Z�b�Ȭ��Y�z5
���
��7�J�#*��\���˵sx�
��;�8��tX:W2���|��W)H�,1d(�@�u*�k��ﮡ���@�����sM}�_�T�%�,�U��Yi򥇔6�D
�������

�pf���AK���u75<_XJ���3�%$x�7$�_:a�72�ԏ@��*ZF�������U�#*y?r&Tj��Z�;�����
ɒ
�0 ��|��_b���*�l�DM0n���]/
+��픰ZB�G}��
���^�t�XB}�W�%�N�Pn�$��R��6���IBR�)!���#�x�=	��
Ro �����H���p'
�&���J͖�EVю�����Rԛ��
��f��	��
+� [:���<\�1��DG�t�D5�%�LXޮ�C
���)�5�P��|�N>�d�|�~�Lz�J�@(��?�:`�t��rw�c��k�W�|	i8M��W=W�t���O2oF�57q����A�7C��!%
�.v�Yd�H�W�yxQ)�#�@��#k�	
��;`(c� �,�ixg�%��Z�����V��2Ub�C��}l|O�Ն�f���o1��(�vR$K�T�tXRf�?
<�T��u���_ה6�M���ZC�%Dx!*�"<;h�h'wH���C�.
��

�K�&�p��1��"��.�(=��ϫ�2?2T�AR��>���][7qlf:Y��%Q�8?�'_�UW+h��J�1�i
�
<���
������5Z��z����,Q(~�XB}�0x0<+
+�t�d8�^���u�WK�s#����M�Ex4u���$<"Y��!c���<u)v�Nb�-�
N+��
l�Y�YGT�~�
��qq��rp
+/`��d	�}�7��-D�UV+̰pC���*��}��P�\�o�����F���l����%G��G���I
 x`I
+�JR(�����~�u7�}���jDx�ס���*JZ��̡�����y�8o'C�\K5O�f��k��
�Zʑ�qkD���R'�uym
y��A��'K�H��'_X��$�n�a*��M�9�۵�u��j×q=^�E�&u���
�׷�%�L�>
���Bw<� /�*uKi�Coc�&��J���Y#r�6v�C~�R�Cf�Q.��.=;���q�Ng5m
����>��#*e�̨��
�����-�]C'�%��U���nP��?�3Ò|Y�Ka��1U%�*�����\
��;|�h,q�ɒ$^�K�����:�����@�4��ឃ���}���+j+e��/ׯC�[ճ�9�X�`�L�e�O���ɐ����
Mg,���+����c�;u
����`�R|8�Jޏ�5*%ݜ�6��5��#�<��d	<�]�-9�a�eB��;#��=�	xܫM�D]�b���6g�p����d�
xP�+ܗ��%�IDFk::������xV��VF��J
�i���C��TWM��R|��ʞY�
+�mp�q�>��맿�<�Ons
lm�+�b�����&Z@%z����R��?�ƨ��ϩ����_\�,.Y2

� �n�:w_&��5��
K
̰p�P.��S���� �b��Bp�r�>m��8\&KԳd�W��
��M}?�%�$[

*�x�:��a�fqH�������dg�u�$��
\aIpWi�$^>�m
��;q����Uxb�>$x
��p8��KGT�?��,:�+���|�=��ʒ������3w������`��r[��<SE��J][3���VGt�%e49߁��N�����
JK'3��8j��;V�����J�P�����N[(�I���Z�Rt�kԁ��WXJPx����z�r4d��Td�J4� ���^���Z-�Q)��F%�§�L�K��h�Н�s�pYY29�f%�n��H�u.X�/�*y!��1S��W)�*��v
+Zj!�Ch�n���p]�%K�x5�p��-��h�N���a

\���Wg'�d�]�Ӟ8,���@`#�J���і;ձ$
r�.���6G�qY	;�mY�zhY�:9jma8�v�Zl�U��y���?r.T�#@� �<W��?�?_

$K�|E
+��5����Y`I��%��j�
��f���������b��.:��2Z�
��%�R!��'�
ȭfo�-);�-��@�O�C�
�M�<����w��
+�
{����t#Q���46
��?kF��?g��$�g��a�RPV2�
&��T��G;,x
��wSj��C#*y?�$�U
&%��{�>u��d	U�P�0q��g��?�R���K�:��l�2�
�±�]�T
��œ�.�_����d�U����:��rx{QZzX
+��e�����R?x��Jͅ���HqH�����6򲄛/FG`���*��<�p��+i���'�<�J����n�E��t�b���|m��k����xQ)�#gB��j:��!�4D��M�O=d�nTϒ(R����%���,���K*
��k��]u�X�_�� 
+��I�6��R�d��$�d/0�)m�Ig�V�@\��2?x�7�C��
(��.)+�"���z{YPXr[X�O���k�,%���/��Nѷ�����+���J���p#.`��B%�]iD%�G��(w���
�\��/�,Qǟ��A�@

�A\�x{XR���+�܄�P���n��n��t�v
�+P����R�ha��īYJ���M����B;(����H��?P�G��&��5"l�A��Խj�J
+Ot,�6ܧ�~��3�k��X�+�$�����g���*I��ɵ+yM��U��7
�0���#gA�(� 2�>��d�&���
t
XR/�A��B6��L�V����d�T��oJ!$yI���cP)�,�JE����z�6گ2��P���f5�����ߙ�I�E�p[<�x|�BE1���-��ϙ(@%'w��U��p�;^�w��<غo�Z���ZN�p
�7���^�R�R�&Z؏NM��k��G;�O1����s���D`��(�K�6
�%Rt���Ƭ�3�%�Rx�tr\R����%�LQ�Cpj�,}aWwo�*Ҫ�xN{�dIu��xc	6�w0��S�Q;
Œ��w��

zH����(�;1X�6� w
Kw�c	W
mŖC��q��Ϛd)���R���
�'t�sZdu|YI6�&{��q٨�vD%�G��>x'���
�7M�%[��B�-��

dJKе$a��M`I�W��E���B�'퉿[�j
����*5�vPjT at W��䅮<��g,Y�*�
�\z��Q=Pm��)n�N�DFK�;[���ࡣ$%0��O&i\�'K����E���(�>�%K?��R�SO���u�ZG��&���J�v%�D��&�M�D;�R�GΆJ>&5%�&١8��%]�

�A�J’��NZ�`�q J�
��4f��ұ�.���$���`��
F�$KL��j�&끬x@ߗ��
l��%ቌ�g
G�?%u�x�N��g'k#���2�T�2Q
+Ok�g��C��.zNn�O>ܘ�ģ����'x�2u
���J�
+�#�JuM�#*y?���
������RX�;8�,���px,�B�1��A��)N�K�׾��A	�g��U+z�v����H������F
�%G�s+�����@6چD�����f��BP�-*R����;�
+�%UJ��${��
+�U
ycS&wB�
��p��
+*Y��R�㏟& 0�a�P�y���]<��n���J�D+ڕFTJ�ț�R��Ȯ)����7����[o�-Ӕ����i��������;'�����'����s��J6�
+=k�o�TJ洝P)�,Y�F<��@�����eK��t��E
����hiT���ԡ>xh�J>(}�O
�ڣR$Q�Sx�HK��A����KG��j{�l��Z\��
+����N��m�
�tQ���?�D�ە�&���ykT�e|\�K���)������Ғ�R��S�$\\߸��W�s���
��
QQ	�wQ��� O?C��R)�t�maI�^�x��
�<0ڳ���-]�k���,(�LIe��?�r�]�\���cS%a&�(��'
+K�)�?�,:2��2�
�M�?s�F�/
��ۃi�J���:,J�B�<o�X{!��o݈Z���kW����GT��Q)ة��y�ΰ�I�8�&o�(L���L�bآ�3�D�%�S`����c���U���XP�
+:+�����p�$w{���D-Sږ��4����:�d=pWnW�g��$X�S��q)e(<P�f3�=d�B��:�*E at I �&2�Q�RPX��;�(��B��
hN���j�`E_:�ҫ��x��73�ᙗ3{K#^���.�N��(���v���ɠҪ?T*
J���?mIp���q���͐Z�m�bB<�KXr..�K݀)�-�D
+�RF�D�P�J �3ĥ{�Z�uh�nvOi��R4YR�+�'�Q�=��I�xA���1&��
����;�ђ"��w��K�Jm���	P�;8t���,�Q)B�=�q�j��71�������
��bqa1�"Uښ�	\�T&�c��	ޭ�c��خ���7���#
Q�8
+��b����UT'�.�T�,)oa�`S����ÕK���t..N	�vC��*_G:rv JTA�/	�'=�J	Pj��jc׾X���dI5-Q=��������t����-L���;c�i'K�ڌ���v�Z���_W��P����`�O?Tii�P���(�)�n��I^nuY����H�v\cr�R��n��g_�ց[h�ޱ�$�>�0��\zۮ��ڈJ�A��X_� )`�����'ppqu�D�A��0��,,=",I��w��5E��۶�����1(=C�¸:�u1׏�K��'�d`ID#��z�?ī��
+k4P<�`�6Ž��B�f�Pa�p�F4��hA&�­J�A�s_U�((]�C�3���r��s������d���^��&ǟ	�+�J0�ak����]x\�'���
SZ���+��tFT�J�
������DU�
T)�kS`"gai�ݹ8s�jp	�{�"����$s����_L��͔L}�ڒҡ Q����z�V�O�+�'3Z?���Զ�&4���l=�3�J�1�~��xmO*xx1��Q�R���T�$��6<�U �BYL�����
)�[����[J�v@��F����̈́j��9K�)�;�U�UVn���_���^��;���p#
_�0�'�
�+_>�� P)����n�j$�t���x��9Xz|6-0��9�Fу�q�898���)d% �o
+��[(V8^(��%�]�{I���$��&2�v�Ԁx�:<g4�U!��%S�b��J�����|8x��<�L�\&�
+
V�Ѳ"E�wǧJ�
����V
K~�t
*}
+w��R&K����rN���#@	�����G�(\H��������S����o"$x,
,}	�v�W#*���G�ݡZ��]\�(�Ɓ�XZ2
0�x����̄ț�%G�Y\:�^=L2^�����A: (��L%ח�
+�;�J!(IH��Im K
+�:�R�x�

�
a��z��p	K�͎1��$/QBP�QM�%�YeF;������XU�.T��(!.
�,}�^��|'� _�-X k-����-pI�����]�:U�6�
E�e��٬���G�
�GT:7*ٿ�xdg|)�
Xpw{ɒ JK��,����!���#�å���$�I3+T>b��%S�@^��8�����r��Z�R�F�P)�,	�
F<�LeS�LF.`	R\i�+�^��%�}�1���
�NJH������horſ.��J�D_���^�/�	(<�,M�digW��JK��ҫS��A\�֐���pA�TR�&�� U�A�x�����nL
��p��#*��B���Y
vz��1Y��A\<Ggo�%�򀑷)Tp�M����2	H���%d��ǯ�����
�'�T���p���6U��a���^���
�������ӥ�1����d�z�bC�pIii�Jь�9�S�J`��J_�AX�	8<~ɖ������%W�*`L��.#X�:�"V
��A	���r�/�J3예Ά<"U����٬&ȅ����0|D�7B��🈺D��|�\]�c��ڸ����� �L;�3D�U��X<�q�$05�s�"YG�c�:,U@�
8�=h�K��SQi���:$J5m:Yj�P2����)-�zƇ�
���$�׵���*0Y�Ŕ�b��^O>(9���Z��_�$,���(	X��j�J�FZ;��m�,�4�!X]�
/�%���S���/XT
+������!�u�^V�N�[̚J�FT:#*�'�]"pv�H�oаԖ���ݶ>IU
+��$,�)�g���Q���&�L���7����N��A�:&�3{W�R����Li]�]۞�!
��M�>��.`Y�j"���4�m�h�‰

,�WS�q�E
��j$xp�Z�����T�u9(��R��wL���bP�k�����g��I���+�)<��
���|I\7�[���"�4���h=@����1�����r����)�f����)x%�
�o�"<����t
Tr_J�J������<��C:�v-	��d��K�����
+�.��伜w�r�!��$ru
�An���a�{2���֬4u�d�6϶*�K�"�Du�/����CGT��7��`��%Ȗ�y�>>=
�M����ژJ�P��
�4c�P}'A�h�P�r������2x���}����Z��"�2��.{4�
�����?��B�Ic
H���Pcb���eZ9V�*�9�;;p�M�[G���٬#*�����v��*��7��
إi��RJ�Gt���1,�)�-D���=b�m���Õ�r�L5���釀$�t�ꨢ�.�9,O���U�@Y��

���JDi���K�d��u�F���|�AU	`�
+�ļ�����X™,{�R>&A�

�-�V���8�.�*��%" ��QDS�T��;<����X7�[�,q��Rg
X��;��aW=���j�R9Gߒ۹1����"�伡�
�M��I��w�7�ҙQ�H,U�tg���OQ�����A�J��R�d!���N�$.y��n�����C���!&���aE��:d���Cu�J�U�����@	y�~B�D��D]��1,eL���F�c�{N at f>,).�x��2F���0ɲ�&x`��	

�N�y JR~$�
��Kc����(X������K�&^�d��r�l���[ ��G=|a��>2(}����IC�=��/�[�0_�z)�
�$x�r����J�T	y!�I�Kٝ��C�Az8�%�-m��Y�[�<�L�¤K���%�䬗C7��V漼�$��aN�8OZ���u˝�-ֻ궑�!
J�>(���YP�"b�%K�R�Q������DJ�gai�)��ٷ���ĥ��d�LeZ�$�(���ک�:Q���hC�]�T�S%6�dro����@��%�K5\|V�V�f�u#���7��␵Ƌ
+��/P�?��_�y2g9�T�J}x��j��>;���J�*����RW�!w�Ғ�p���*UX��{���
.10��#hJ ��|��eI�����%`�@��*��%�

��b���sJ6��L
^Jl��bī��E`i�$�4.�=��D���04Y� x�Z�(�d�����,ͪ�G�V�T	�5��T�	X����kE
��d���
6
�J~	KBӺ���(��|‹%;
���B6��R�c��d�b.�Ov�F�
FT"*7�E� Sr���p���<X*�&��!.n����Y�89��~^9?W]���2�p~�Ҥ�~��{������ |[�:c��
(M���A��T�uE�YJ�r^�+a4	KX,A�`m��R�{m2k}^����g)a�0xX��8P
+2�4w\�$@��Ø�AX�L0�CX���di�V�캑%�yfXډ�s�W[(\9����oD߁�Qnw��!�&�ȓ�R��ZXV
+&;�n�
mY���7�ҙQI[բ���
Om;,¸;R�`�J�Vs�t����ӥ��	|��99�����
��(zt���U~��3J�
&a�
��=����f��@i*A)�w��̩�Ϲ��%���	��JK8Ɛa	
�)�yU)��^1�U&s&a�\y�$M5�	-�w`(`�V
<�[��1�]'Բހ���&���*uiY�c�D��FJ
���;b���u���!�"��N�}����`1ob+��uȕ��r����[D;�ҙP��C%��Ġ��n2��R�
K���
+�*�P�
.��*0�fG����\,���̉߮+�������4�I�D�
+��*��_̠4��z��,(

�FQx>����
��1dXB��Mq�f;�񠼴\��)��'0�Jh��CC�����

b���G�w�V�e5ֺs�T�qM	�&.Y��g#mf݈�C�D��XuaB���_^�;}z�9P��.%<y�:&��e,��G�*+��iI�<&v��
��t>TR��++Y�B�
s��$��v���t�"K�N˄�Y��3Z<L���Y\���x9ps�����w�'�7<
�r�%C?�=�a����݂�* �CA�/��$2���t4Ǣ.��)HX�EXJ��Z��g4�����,UY.0���).�ɗ8a:h�I��g������Z�If��3����rv�ͣ4k:��J��l�ߍA%�&�!X�3�ɧ��h�J�8<H�hb���n�xK_�j��-

��̓��N-(�<vp-���¤�T)_V�k,eL��ю�4T��C���E�wP6t�g
:$K�JA������ŭ̈́5J���\2
�#G����?g�y��y���t����<��$S=�D�����͢;
JwIP�B�n��J�G�)Q�pc)��ָ;*���Kf^��f��g*	r�뛌*~	CIS�GdK=y2,��H�����4kǢR$�p��w&��jX�2�)�,5~�L�t�
.��g�
oUg�H�o�
q�2����`�Y��-b�r�ଘ��.7~U��\�LY�{h'��62�!>ohD�!���IT��҃����e
���q�%���H n#opqՅ�ti�>p�ԗ�ɡ��n�b��_�З��� �$$&=!&N�J��K�_
+���Q�BY�1(
�*��˶��X�
����V�
+KG�R#��jX‚�e^1Ņt�q�I���X��Ŝ��?����%a����I��4٬a�V ������3ڄ�0U2֢��A�irX�3�Dc9�>��K$K_��뾬p�`ɐx(��K��1���w] (
+կ�����g����i2U걬b��XmV�7MMvb���J�*�KH"X��ٿ�wX$� Kw����b�a7�K�+����?"�z9�L��Ŧ�1_g@"?g�;L��L��`�wۍ�_�u��C��y�' %�|
���`��ɡ�m
��)�-�����!K�yu).R��$hp�&L��2��bF{fS�E��	������e�B��RI�$K�@�[�v��)��T���$� ,�
+�y�Q)�,�ީv2ëD�
����ąSd��Y��BEoVd��LI
�'�N����g�++�
Z��"#vQix�D��[�5}w/TC�oll�#�g=
����g"of� ]Z�K�K�əkEn��Y��"O�Y
����1 ��{�$Og���y�R���|^��.����5e����BY�Qx�O�4?����%U����%���,��u7�X�i����<�?��T<T��,�	�1�X���YSR�ࡘZ��)@�K�x�>tx�l53�rg��B�/ITj�,�n�
�/���ǧg�
Z�����1��ߘ��<u��4���K
�����-U�/+�
Z�΍����FT:*yσP�/�J����͜l�p�E�%KqŃ#�@ .#o`�л�B�-PB�K�89L����"O����
�"�qH��U~��3RwϦL����}]ڒR����tL�$�ƈJ�'�’I���$j+w��j�&a�1�u���D�
+�T,A�����;��v_]B�0i!%<�%(�T��
��!X2j�/�3���΅�H���<�\���z�]�`w�C��m�*"�M��b���D
=I�
��J��^0�u��J�C�Zc1�R7TZ�%*���;4U�������[�-IXBG�Ҧ�_�q�K����77$?Gش&o'���89�r�H���4ieؠ�
\�!�J����V���+g�*���w����-
�
$�SN�k{t��Ѩ��
�
+�y�R��ri��+¥�3�S��bMX��_0���A%��I[4%K3<�vJ�@)4�'B%d�
�po�9�S�S]'s����\]Z�ե�Ԡ�$W������f

+q�h
���	l�6��ۓRm7Px�ڡ'Tv%�{b�G,vK���R����J�C[�s衍�
FT*A��(�o�"(���ʆl}����[a�U
+�Ļ��đ72B�
�J������.ULx9ts��U�=
��:���
 Ϳ���n8:|�����X�Ŧ
+1Qr%%��T�ij�YilA��n*�9T�,DxǣR�hqX")
�xs�!�g�kS`�
����	�	g3q��V�
�
+-��"L"<��TT����S JǤJ�#R�FP2�?'	�x�F�3��*����p�;��
,�K%��*��pi+��>��p]8(�˽_.
�K�Y�k�
�E���J��u+=p�����V���ÈJCA%+
���px�H�f����
�L���!�-��]��8]bgp	�oL���!24������{��|i�� YDGW��E��b����]�$�;��uv
y� ��[5e��\�#�x��L�<F�{�w�1Z-,%R����W�%m�#���6���^� 	��b�!��P�(�C�v�
��it��Z[ d�V9Խ��Qx
��莘Id�dY%�\��I�	��̫� ҚM��W�Qw�Г��[�L|1~���W9�v+�<�[�{h��
����J�:FT�*YD2�N�
DwGpxIX�Q��Ł衬,d|
�:��"�
+z�*e?g�!����_���_��{��"��@R�&��#L� � ���u�&m�]g����<rC��lfg~��rF��`I3�h3L��@�\2d&LL
L<��5<H����Td�%b�w
+�O<�C��'N��-(�:��f՟]�p��h PI�R�d���n\�`����b
��
�w\���g�����)��>�h�@�N⺣��wt%M����`4�
>�����M�4u�d�ˆ�WS�R����J���;	K���|�)/\2Nn������C&M�MOFr+T���	"����1$U��L�4��bRa�oN�( 7Q�]��uR:��pL��|��/B3�`	z�npu�����,9�R�fF��Lʴ�򒁤�5Z�h10�sh���T��`��1ɐw.Q��C�N�A�!>��H�С�c�xX��}���0��#�K�� ��$�P�FkB;����i�꿘˲e5�n�mk:0u�Y�m����-_'t��f�C�h4k��4���P��C%K�SlGB/��C?��B)���ۈ�
���%��Vk};`�~�i���':���W	^�0�HU�o
�I���/��
+�L�]x8j���s���@)��ٖ���4�>����J��t#�W..�6�!�
+y��^�d%�������ڃ���T��Z�M�X����SFˢ��8P������ �
+q�8�ix0SE
�,EjR�˖���F�� ����
����l�յMP߲����-U�#�|]���w+�e����&�Jwv��n��ˆn9Y
+I�v�����o�Y<�0��K�K�ə���#���j��2���u��
��V���*�K��;V�ކ�3�n��.�ä�Q�m|
�+Y?�9S�R%�4�
Β
��2�d"P)
a���[-$�n��+���ƫ ���liLfb	
+&�Ş�bl3i*��jE���c#��0�8Ņ3T��(*x@��T	@	�ҝ�F�7�C�
����p�P��N�&K!,M4,ͅvhck�&}d���>�9�l k�%�ܐ�"˽�m�����^S%�!o�����[
����J�v����JP�x�Z8��
�^��uN�r$� ��š�}��o3�%tr
�0-����nE)�sp(kZ�
V�0x��-I�
{:�I��Sx��˞L#��j���iQ)K\�).h
�W�R��MQ��O%X̸C6ٓg)����HO`��	*���n���
j*2ڄ��%�J�W�t��L
���/�)��ݝъ�G�6uC���JK_&��L�4s�d��b��WL
�Y[Dl@&��W[�C�#
r��I�(����<҅W=�-+��4DT���
�HAI
�p�

K��Uť	�x2]��x<���D����Ȅ���t���-�J
��W_�<B@D�2$- CL��
a��U(&ػƠ�)U��j���d��9��>
*�-d^�w�"\2�9�L�M[��^
��T;T�pM�*
$m�R�����?�(�n���ѠI��FP�b@	)�&|�%��`�*�3�����F�O�/SF�p-2[�n2�Cٖ>� ��má��l`M@�*�m�T��&�lg�|T��Vx�
ߔ
ڭT�6�ɲ҈J�E%*\@�D�	uY��w����d�ei)�-y��.)\������Bȸ7B&tt�v��w�Po�9� 
�+��d����co��A=�\�L�+DcT(u)V��b�/��D��4��_uI���4�ԀyR<e�Jq!_�
נ Z��nOC�m�����_c�`�H�0�5�$P�P�X�Ym�p
(�S�O�*��
�
�x L�K�#Q�ơR�R��䚜q���r�K
&`dW
+d
�����5��X`k
z�ޕE
+�����J���xeA��ʁ�n���D�wD���AځPɕh�r�K�ȡ��|�z��kKT���{
+��p��5�ʈ
*/g�%����Uw
�i�[�rq�
�]X�]!
�+nn��TOb�:fa
endstream
endobj
321 0 obj
<</Length 65536>>stream
+`���Ʒ��G�!E�Q���t�Tg4���gm6�4#�m8� _X��b�dl)2� rX"$-H�B�3bR��C���۩KF+
����Ɯ�B%h��kT�x L�1�p	�o,,u��
"��X���K�h�W�
�V�Z��MP
+�9Q����$(��ߌ�AxS��U7d�J�7��yQ��
[T�6M���醄��x>�����0����`)L�̅�N�y}/
=�dBhl2��:;s,���W�o6��*d��[[��F�&�e���
�{pv��;���dFm�И~�썓�R�X³���,b�
�
&��b�dl��le �+�XWd)�$�04�
"�ґ�.��
��Jp���D\$SQ�c3E_"��2YJsx��~���.L�Q� y��Q}�	8Q]�����@ JJ����X
-xz9:l��|��J��8'*�噟Q{lD^0mi��2-PE���B{#���
��t	�)��;G	'd��I��˱�?��`�������wH���_���%KH�
�лD0�4ia¤������X�#A)&�B�1�҃
 ��8��N���j��%L��:Ǽ�9�X�Ō7�LV��B��3�Zy���L��	-V�Cł��@�%�]V��0���,ia���&c�n��}�ԉ�k3����
�W�l�p	�&X[�)�[�}T����7�$

+$�}/3�
vY�S�
�W�IN>��E�H�A8�Y���Y�ą{�Rϰ��硏3�d�\� % ����s��ә�T��͖ �3>�89�HI�ѱ�
0	o��n��:� ��$�_n\O朋IFl
��S��v��G%~M��qF#)ޭ��KL���4��d�����b[�)YS_�Yp� ��T9
+�IQ��$�I�L}��!�
(U��\!���?=�e�`�
+��&��R�w
	%H<�8+U�J$x��
�B&K|_(O
�ұwJ�8(
�*��J>�WZ]�7�����҈J�C%ߣr��xs'v(�󣐜�>`)
>đ�
��0]r�d.���
�� ��-�tkH� N���2&��HpU����f�
A{:�$��kJ��J^��-v�Xn��	 �qA�.jq�1���R#X����z�	����e���e���@ԾZISU�<r��d��_�e�'xH[��JJ0Maj"��T�J�]��\*��)����!}��Xݓ����x*���ҡ`�օ	���
t]�
JIU��^Qy�c*S�6L�O��f%��G
+<I�
������GT�������1��C��b�]Kw^��S�g��oLz�,	у�q����lƴ7g���]p�����꿯��3j�
���$�p�
+�I�	�D�&��	g�I��o�
�^
+ \2����j_OK���h���Kq.�d&��3&[�.Z2U�
7�TKc*
I3��͓
ywPJ���]h �P��:�	�
+����!��%H��h����d���
��M�
�P�,� lQ�,/�Au]f��:��ro{��Ա����
����
+< ��CZ>����@	{,���c�p�S�d)�-	�1������N&�W�f��Є�E{��e3�X��xW���\u�l�d����&�	e�((��
e��:cٓi�}O	(0]"��qP�wT��%/]b��W0�2��%f�b�d�,6�]���$	�Y�$���$"�eu���H�(P
+��O J����yi�s��-�b�
@O�
�Gw�*�`�fK~����� &
+����
]���9QM�d@��ڦJZ�5+U�|f[h�'�{�����J�X��.�R)ZK��9X�tZXr���%vrp���cdBh2�n����*Q��p�NnF9�9�$
�f�QL"_��W.
J<( �U
�_
,�)*5Mq'L�N�I���X�r��b�d2W"[� g�d!ɤI�Mhm�m���!��Ru]�@ǰv�>(���z�;��d�
�pUK�1ݓ���i
w�}Y2*���R>���k�����b�3�$�W7�aD����-��+1&avt;�-��g�;���O-K��i\�\'7�
��$�iI�r<�J�5�� 	��
9:H�<LJ��c"p�R�T:c���ܧ�הԔ9X���
�A,���"�6�q�&�^'.�%�����8;g�y�l�j��!����B���$fYkA�L)p��J�W�N]��(�P�*Y-@�03���O
+�%�%�'Kq���$���g��XrdǶ����/��E�!0|�,��&ǃR�ď�J�M�G\�
�Yx)]��J�D%���,�I6.G
�K�P��
��{�%�.��#\b''�	�	�i�a]��%M�Qd��
��z-1'�+ƈ���
V)L��I�� %�3��;l��A蘱��z_���#��"6K�x��� �l.MX��n00�;��h�R�j:��BL�%����T�;� �
+���b��lc����¦�%ȕ�M��u(���$����0�ma��Ue�O��6x`fa擧7�D�^@)�*�f%P�/�
<��
;��4,T����:��
+P�&-�'�W�<�`	T�����T�$�%tr�����$O�՗X��d%O�+��a�� 	�$�n��^A��U���^��p	E�j]��Q)K���s\L�Y��-V�Ҷ���l&Z�"-۩wP�dA��f#�|V,�e�١ �
0x��-�vo���t�{���OZ�:q���Ug6��i[�CA]��iH�Nj���}�{�p3�r&�X-�S$�����Jz�;a����2�-,1.�K�t�Co�K��ur�00ፂ~
rt��d���9E�8���
���A�4�W�d��_�lK�gגI�o�w)[2�0(�C�wT�L��ٍ�%���ַmlU����Vs�
��Rw�'�'JǁR������*�
)�0��d��ҸS�O=��%��&Ku��ٗI^�9�-����HTC��I�X��V�*�֡X�%0�[hsވJ�C%�k��u�A��BV�G
+K�q3�[�M��z�%��)'׊��t�9cӔ����`8@�|� ɥI>&���[�$�hP���� �������	*5�%/�u�+%L2���X�lʼn-B�Nh1OJ%J' %� +T�!P��m�
d0i��	��ULk��#R
,Q�#`��>��>2T����j$L��(�
�6��Qa��c�{�D�$e�u�f������
+��r?q&Tr�%�J�-�
��
(��jaNiE8����

.B��`)��|'w'��!��N�q�
�cg�U!#��$L��Ƙ1I����u%9[�:2����	 ����
�P8�C-ȹpn�۠�K�p����%��b��V�<��V`�M�PG�R��3�f_3���R�Zl��R�^W�d`�X��=�|��ޤ�[Cf�bT�&��V�6Q�JTL:jB����T�z�{���a�|
+Zh�e����Jԭy��4+��ϵZ,�)���,u%�#�K�b�$�I 9:tut�"ǥKs$�c�笣cO�0I��q_��� 	J.R�|G	%�� R���B;��
��'*�a)��J\G(�)j1ci����2��S�
���&M�<)�(�J���
���kL�@�1"�V>XX��
����R���=b�l�	"L�Y+M���@E2|
��A)2�A�J(
��p0+h
��-l�
g���J#*
	�>��J�q�'}AD���Mfv�|�t"sɇw�e�`I��������^���
����r�����{�O	���a�� �����3(�1�9����qs9Rm�sf��G����N�J,Eӥ�a�;a���"�ي!�A�G�F0�P��etk��(Q�Ta�j��v%J�V����u�*Y��%Y
+����t�/�O��g�-�
� ;Oe�S�J�Ti� �ѫTiI������oD�!��ЄV �J�!K� XBa��=��b�~�WXʱx"���D^/_-�+v��#�� ���l;�Y�ew���8k�y��"�[�Y��/���|���� �ȡ���nOb��
+ bDŽ�
��ȁag"=
�fқA��@遏d�2��(}�\2X�#7$��P�㞅X
+sɂi5�bk�ڥk�.�t
F��'G���/�%�-"�3d���sx�
�����	�%� 7AE:K��R��Հ�u�I������@!59�!���
C%4�x��:��Jq~
��I���2��l� L)���ủmVcX:m��4a�K��	3��E��#ںu��a�y
ãG��'#�Vr��
�$m݅�tg�K����d��〗��� �t�.T�X�kv
\3�dl
+͒�+�
.�Z��_���.�<�{d��

ͽ

,u
�u]@�C�K��-���`m�n�$��	�q�����Z���Z�+�mQ=J�B%pޜ��סj�E���T�1���=����Q))�
q:���G�q&���z��!�;.��ɱs�]�CZ��ٸ�Y&̜�s
&�1i��]J�
� ӽ'���DX�Q��w���}_*����mЗ�X1�q�J:"��
Ͳ���
u^[[��g�����@�K������g,=��^&X��Tx���p�c�
+/ţ��B�H;��]J�n�����u��sX鵽���I��JׂJ؄
��'���=_��J'-.���p���9�����dB�ҦNk��8/��D
+#i��t��CΈ1'2yA�h#U��K
	�3=���{�҇�����a��k&��~�KЊ�ł�,��]*I�".�hO�Ю��P�P	��0��3EA�TH��

�JK���ĸ`��X��+����n�8i��<[�ͤ���|
s�n�"T�'h�"öp��!tX�'�~<*�
S	��
���PJ�X:x�)���A�K�N��9W��4�z�Je�ok��Α���NΣ�ͼZ��4@�k����$BbL 
��f�!(EЃ�r8T�~K*��}BX�Βݻd�W�_�ѵ�+%¤Q&�����l�>b��Ճ�P
+JJy�,���(��,��,j�%��8�KK��Z�>vu&�nK�q�Vr-V�Y���r� �R����w~��"3m�u�Y��!xX�'�~|*ёM�Cs
�.����KϠ+�L᧻a
��6]K\����
��
�@�b�/��# I"$�o[ʤ�A�ξ���
��k�g�PY)��5��J�����?K.��%�%��+fV%��+�V�R��3#Z�S��tc�#A	���R��Y!w�g�r�RFX��ю�Dw�z�ҩX�A׾u����n(t���d����A�;�w4=*%2T҃Y'+���G��4I��д�
A	��et�
+2��n/��A�撱r��c4YS�1��;	$6s�<K瘺m]ȟ�U
+	%Z�(Ž;�!`]	�O��?���oM��BX
+q���/�8΂�5s��Y����L:�����lQ	����7p	�Z!�fU^�E�4EQ�P�HKЅ��c��]�
�E���p����Z̭�x��̂޸�e�D2wB%�(�n
���s��~R���{�K�vqLP��,��Kq	oi�?K��O?��\����
�
�F5L�@�5s�IA&�(�B�
�D(�j@7ƚR�$>
W�8��R)$Krɂ\�hV�n|�x�(�]ɥ��^*��^(���C��v:��d(aU)WH*�V=e�(.ei��`I�G�ûP�4?؝޸�8܍����ǔ�
+��2��w�˳JJ
v*��
�7�u0��'�~T*�b��QS	���
/e���h�<�q�Q����q��S6�o禸�X��[K&�\��s�*�w�������J�\���=���
��\q�g*]�f��QiI.��3�d�/1p&�V,�Vw&�
�X]�����T��)�k���f�R�UuQ��L��U��T��,A���r7����F�4�W��_��5��oǷ�b u�+�
��\���w
�:��ҏF�_=*�!^��M�E��R
+lx�������t���q�I�yh��k���DE҄�;) 
@�
V�PZG4Q-"i�@qI�
jv *=�XL���E�4G$K>�B1�X���+殕�TÕ:�<�@�d����Qi���:�K�@�T�)Z���
�	O��n�K��q�&V�f��Y���%�D��'��Vn�*�P)��F�JS�?��cRI��K*��L)p�1x�4���A,=:X�H�4�f��f�ڹ�[���?w�����k��
�&����`�
+cYc�^��͝��k������?NS�x:-B��%�K�������@
+;f���
(=`����ۘ��(����]�u]���o�]������E�����n��Z�:pg���
�ߙ{�64��J*�2T�&|<���J?��y�S	Z�q:���g �~g�-�M_>�n�<K^�4�|[3'�

���/R@�]��
~ť�ȭH#w㎮��P�k���j�RЍp\	�Y��YL��yl
����Pi1�&�4�K܄Wll��
K�*Ȥ�@)XT2�$STP��B!��{���uתP)��R�%8k�9���h:R��H��kX
+L�9�^����IrPݮpۀG�R4
�Fx?��R�C�
\�&|2��
+�E�F[>�>���Ns�%��>4r�L�rYs7x�2�
���1����@&A[8�0S>���ț�/D�c��qɀi4�
;�%~y|�FV�t&M
T'�LQ����*oʪ.���n�Ϻ*��*�<N*-��� к��9<�FR�N��G�ƒk1�,�
+Nf��(�[��aá�6�&T��Ѷ�T�gP�.���;���)���%}kp	�HF,�F���;=\���C;w�v�wහ~�6t`�	P�A�Cg�B��XJ�J�
�r���4��\�Ϣ%;v�>��D?Nz+(
;
�>FJ5T�����]Uue
��F,E�� ��a���I��q�CזL�k1���2o��'@u[
h^
+WX@�
6�u�I��VH%
��`҃�x?4<��������ҠZ:�_�$��~]��3��Bi�֣�w�$�Дx8{ҩ<�suq*���>�\r]��%�]���Ǘjz��xO
+��
�˖7��!ƪ{
PJ PR�����i���+��V���H)ڙ

b��¥�A�4˥k�&xk�q�"���S�/߸'w/'Z
�^%��l��l�T��O*��T��ȓ�p�"�Jh�2�z�����K���u�t��7��,�����)�o�?b����}<i��t���@y��7�fi��p�Mϥ�
���Ē�0M,�Ċͮ��J��P�
(�b�.'��gX�N��"KM��Mg�ʶ-�Z
���X�������5��2XZ\��Z��E��
�`J��N�:<b�!�.F��җE��O*�=T2�9I�������2�1��`?��
�����G��ݛbi�K�XSd�TL<��4���L��PZK(Q��kz(R�.}�<��E���2&-�Rp��}�R]�y����t��Z/�S�����^($��(0yU��
�rx[/�7RZ� �g
�}�J�'����ͭ�����Jӡ��%;��J?(��M�qPV�P�Ȕ�W�9?��NX��ܕ�c鬫���
�ӥT [...]
+.�8��N�
A)()�J}��g_�e�d���}���KJK�bi�K�x������d-��*� <�
+O�+\O��<*���������b�B%nón������H�tb�=d�ހL�!��@iJ�>�
��� K,�<K
Lڽ��}`G,{��"��ƒ�cV�u�^�3��0Rb(���a���
��R��SӶ]׵m����!mjp*
+(-A]Ɏx�c���/w9GJ�g�iQ���ϞZ6���V�:�Z��t���~U�'����
�d�<L��J�
TX�p��<
_����6���
�ai��10sl��C���g�)P�
hw\�ӎ_�SUiO�/@%񅁼}$���
��\1�Ts��1�-�d�q�P��k}V)F(ey[VOy�q�S\�U��&5d�vA�7f�C(�p.��K���Ep
+pʻ
��;�߉V<@�U��E��O*���&��
Ku]6M7�d����Y,ݍa��ҕåi0i�:^����20s��=�Ic%�I(=r�	�hj� SE�KPXz*�0�x.9?�_���jv���la)�@��t �HP�J{��ퟞ���i�/����Ba)/�<J��������S�G-ł58uf�d�J��G�D�
��"�WI�U�
�~R釥ҭ��9
�ü`�W˗<gTY�

��%�na�"\r
�/����0�J$�HcH:�?wJwJ;��)���Jps
GJ����d�VH���$�x��x�8��S|Ɋ�.Yh�,�Qm�f�P�.����Cy#�q�{��Y��u�)&�

�m��	
+K`�PX�S(-aϴ�JK���T���L��V`
J����wtT	�v��p�W��0*��ҏL��N�B.�
�pzU��c�!&+���GC,�-�����3�qa;]���grOg��D2��A(m5���X�e9^
WU�R:Ȣb�U%��R�,��T�߭#�_��,�����[�K��5���?hh��q�R�B����y�?5m�a�����AV�6��"��ĺ}Q,ͧ�/��"��l��A��﨤S
JnuH2�5�W�°p4޳��O*��T��T�s���\\�4��2���h��Xr'
Lڹ��$Q��M!�D��n��9o��^���35c�7H�ۓ�d�<L��3���f,�;�Vj�V�+u���c��g��+JI����@���U��Tg]�b�
+]�%.u�%8��gM�3��ᎇK`i�
��RL���΃�~7�3p���v"Wd�:خ�P�'����G��
'%V�m	>�M���� 
,��e�2,y=�߳<4t�,�m�
f'��#���P���
+���G�!�W�E�>�
=����*��}ƹ4��A�yX�G���R
���k6�����-w:��<�
��)k���痗��R\� KU�W)���Ғ9M{),M�ij)���l�_|g�V��L���ߥM,Z
�,�~R�A%���j�����R�㱥�L��H:/Xz�
kK����%2�2Cw���L�W����;t�DG�Ǡ�Wl�xB
W!�u�i)<��;�N�yTr߫�$�L��Ƙ^�3�lr��]��5��G;�Bi�����
SsrBP�I/�>uݧO�Le	Xj�*ɱう����f�t9.��Kp��'�t�M�����(N�V���]��B��T�q���<�u�r�$ܧI)<������ ���S��(�N�����
��ƞ�f�;�Ź{M�� J[
%�l*N��:Ӯ�+z��<Q����Ɖj�PI~}h�CL`��l��|��:s�����p?�����ҝsx��Z��F(�
+J��������+���o�;
�t78��X��8
��Kp!�{�28�L]�1�IY���nu0h�P�I���b�g�W��|�&&���H�JK�o���F��a�����7*ߑ(�Pz�P�C�q���>�J�
O���D,n�
�B昙��\����Z�`����=5\��%��ˮ�������ԗ�K��9����}�ʞ��a^���2��t1-�
��_Ks`Z��kpƻr��T����!���
�:x��?�4x�aT�HS&J
DL�B�l#d�`�dt$����Ls�qj5Ƣ��;�M��*)ݚ���6���qx�vCU��zxǶ�d��p*ɷ�� �$��R`q�_����|�%V*�hޒy+6�	߬E�]\�J�/��g:U�\�}�<��
;
 �8���:
sg����ǭ��s�%pފ��h�dky;=���
B��T����B*m�-1`����
.���E�Ȥ
��
L�Y��d�tӹ�R��ߡ���3
+%��uo�D
�8�	�؆
�rj��xi\]A�C�ĊJ�#�P�_
�dr�K�2|���BWM��g�P�w,eq
+i$�R��>>���g�`��*�R^%�IЅ��;
a�,.-M9
�o$�Щe��mw�
����nu��~R�@���R�.;\��M��k�������
GK7SX:�KA0�a��L�y��߮�ɒ��GJ�%h1.�/l�/���m�6�t{<��goXB�!���-�t�N^��-Tp��5��O��Ru#�b�j
�>WL:
�xǝS���"�:�x�.<SZ�
�?��u�.���
�
����Cr��(
��|��
�:L6����?�Jk,��%�9�u��H~�Ə=�	:�2IcI:z���	,�lQ.a��ƹJ6(y&/[��g#�;
P�;W��0�Ԁ%���,6TZ�J%�9�P�L��������@��ץW*�j�
���
���	G(E�PR�Q9��8��Sx�q��%-Ue�*,)�RPZ���` 
u<�F���������U���G��v�S�\T��6'�y]�?�4#��JR�rx*Tj;���y�J0�*A�ai7�%Q\��w�/`U�
ݸ��k�ݼ���-�� ��f��˂��0XRaRK�&m�@���[�� q&�Ŀ�B)p	߇�K�piɢ,]�7\�в��ч�]J첓u����:�R��������
�t`,�i��i��v<�����m���.ĥE�蹤�'"%��!���8����T�$_���J�*=�"rD�z��j�M���+�4<@N�3x<e ���Z�|,�E�d>�����!�F�
�P��9:��/�
��^9�%�����y@����XI�� �Hr���M��>K5�j(�O;���R�= ���RQ�.!��;
�*�Ғ=L������ʳއ�!$�0�n-�ĩ�m�L*?7���J���q��1L��f�+�RPj��0���`��]X�X"O/Њ7�Ż��.��
�	��Og�\(�7b�
TJ���UH��Q1�t܃W&1dO�J�a�
C%�%����t���K�jb�FJd
w�d��`
����
���B�|��K܈��i��!�j,�e�I�Kc�
幨䃂w��ީ�X� [...]
�R�7�I�G�{�&Ǜ�K�>8�Yv�W�����K�v��t2P�%%�4�j8׋�rK~�L⪒��p9OU�x��)T�A��a���t{��
���	��=X�q)�PƑ��M��Ѝx4#
�d�R%�	G(5}�̣r��ھ�l6}�5X�
w<Е*�5�xsX+.]F:�
+��ǽ� ��3Pbڔ�J�
4t~���-�~R釧��%�u	�V)�i���
./���&KӚ���$��M�\zC.ɏ�.N�������p6+�q�(�J��(�?�+,�E���z9��T�o��fKX(�
�d�d��Kׁ,�q�~38�kg�wP��tOx��M�k(����n�`j�
Ka��x�XZ�bi��(\:^��.�����_%:��O-s���<��4��{_*Mlg����D�)Ֆ�t�r�ħj�nJOMӶy��˰E���[`i.-���s
!��@iXR2ǔ
��_�ߥ ���
�:<{��
+�Ԏ(
���Qi|C
�wcP�X��/.��:
�zw�B�v�J8'|J
+I���DX�KM\��݈'���ai|��"�y�5���������DW_e�
F��^R�#����g��w�v�t*����Q���H�c����U*�,�_�TZ[*��j*�e���e�)0A2	N���$�%s�ţ��h/`�����3ͤ`���s@��AC1�TR@���WBϡ�Ԓ+�W-DJX����x�Yi*�Z*��l���]aN��
����s���a�z�����p�w��ƑH�9�l��/�Чg
�0P$%I�`RX�KMUtML�x��������\z�u8�IGAI�ZN뱢����,���e�>����Q�9TbL;9�JF�|��C%��b^ߔ�^A���)�K\��s��:�`���\<��V���Ҡ/�V
��~V����W��4(����&��W6NA)ISl�WHꨪԵ����<8}��1ZM���X[���;b��C�A%�$��;�,,]�t��%��)�3c���0���,
T�������^__LKЈ�Y��?\`�O�yť1`�g>O��?��xp��>�)(E6B��ҩ��c�����㇋P�:z�H*=
+*}�9�J`P�'Q��G�� *50����)�Dn{��d�H%�׈*����F�x�6�;�K^
j��<
�P���a���磘|L	'���i����$>%X��i��%"r�#D��S�nfGL|��p�t��鞱��0�f!�ް[��o
����
�6���n.
%v�[
%'��Gq���G,�Q�X�[-"N90��D�Ty�4.]x5���Pa��2�}"#%
�`N-�)���%����"%�Jw�s��ݝC%l��q��|)�J�6(t:�;�$����
+�T����Z��#�j�(�V\��<TJ�4�@�v
-9�x�,^ �w��T��2�$'Pf�Čp��u��r��2S�)�x3:
+|�uV��N~�t�Jw��@�iu��H��V
�`a-�t�t=e+/�Pg�܅����7s�6J豛ӳ�>=��P�8��7��߾).��|��m��
�{i�hIb)��pJ��s�6f$D�/#%%���'������y*)K
yT��:����E��4l�Q)R�����zS
�V���V�Jp�P)���)�'e"�m;���%��9�<$9�J<�u�֮
�@�n��R ����T�l
;���WzL
�L��-
Ci�P��8\8>۴U�w%zXUyw*XR� 4��p`�R	w��T���:T2P���G|V��P	��,���,�L���
"RB���ʼn�V7�<*&]]aa���r���x4zH_�� K7��s��\`����Oy&RZ����9�Lj������P)��!��'xA*�>��T�PT�� ��/I��J8����E^@kxQ�����q���ڬ~R�{]%MƭxQ���r�8�<��K��4b'(��:vڏp^9ˤa��-�n�CGڕ�k _��O p%��ۡl�%d{*�3��f�/X:�J�
!�w=(=���B$�_����S�ǭ�ҵ�j�Ϙ4����Q()��x �+���t(R�4�),����h���Q)��ϩ�*_w�7�@	�7��M��-*��N�R���ZoޖJ8*�R��*եO�
_\�T��}ZQ����4o�����O�f.���Z�@d.�L�y���X���� SHc�y���;�$�� �wTR��[��;؁e
s
���)2���Vymӷy��Ō�N^eq��Y�JeM�N�0��y@$i,]/��1\Z�b�~z`��)Wߑ�U@��b%1�a��J@#�],�
+K���cK)�v,=ΔgG�x���g�:N�K���>٘�NP��,��I�S�wTJK�J0
��e�tm��L�-�]*u0~��R�ކ���SoWSI�bT��h�[�R����^�}
P��g�Tt�՘��=�[K�!��%���Z�Kgr齕k�
CLr
+J�}��;
2D�w�`�
+W���U����'hKM��`�F�@
P)��˩��������Rx�.�6����~��D�l.���M�ۈi�Gp�M�5�J��&�=�
�KN#�>�M,K��-9d1%�7�qb��$�f����Z(�Q�vL�7����R�{Tڬ�	�JS���ST��"�J��K�ƥ�$"P�nCT:V ��:��RB����Y[>5�s��_^^>���+e)��W�2%,a
�Vv�_o*���KG��͔k��|&�w����| Ȕ�Y�T5J m��3
+�y�s�MV�H%:Fk�$��
���d������Z#in+<
�>R���w�GV�M���?q�I��7z�J`
�Űy$��aqIA��R
��t5-ޘ�Q}��d����Ϥ�¥
��Q:b��@.-����w���)mZO�N�R�J*����
���[l�I�Ğ�T�ѿQ)�e�J���G%�iA%n�DZgA*9g�
�ZPZP	��7X�@*�EV��?��O���}���
�R�/s`RE� ղq+
���ci�K���t�Y�7֭�o�ou�In���ޙ�w���c
~���_>�>@�\��,��k*m
��
�#�9�#
+J
��}��z� ��Z������������e��QK�۸i�
������H%��1����o�?
�j,q�$.-{����KG;[�XfaL_��	%y篖{a�������0T��XS	B&7?o�&��`��[-�VL%?�R�P�����8T�NJ�!*���G	đ����p8+
��۬�n�ve	P���7��zS�V�}V�%P&ъ'Z���xo�K˪o�Z�<`�/A&�D�
�8{G�����w5K]������-S> � �k�
Q+wAiI�T��B鞡d���G�=ܛQ0��riI|��襛c��[��3]_o��F,�ҫ}\,�F��O�:X�
y���t�Rq��gf�-�
�"G���J'P)T��RI$�����xC�t�#|M�-��F�%�R�
+*�U
�N%Ji2��.JkBÃ�ATf��ȿC��)/��TC1����z.��R*Cy�s��;��meV'��C+^�p+
�6���K�����hߺ�Z����Bq���
e��.�ݎs�UY;���x�)y ]�T�U��*vUƫ��C*�v�9*
w����e*!��5��;� �t&
+L�+�%�?�K:�i
אw��k7X7Z�I�
�1�փ�wz\,9��]�`)M�]��Cc�Ҝp��.�CF$?
��]�k-x
%� GiXg PT��ҀJ_
+K%���v�J�.���!3E�ө�n
QI�Q�JY�T�SA���S� �D'h��T��땶A�ϤR�֫����%Û,�����S�R1��B˶N�&c,��S\�,�*��	.M��7�0�
5sȤ@�d�w^��D^II�9p����$�����}zVq�S�V�s+*�?�+�DϏtx�wĄ���৐P�����gR�l��pj���;���eZׂ�-�p������ѱ�A(�
(
�<����-xl)
ǒ��̎�d���6�U�Q&���ݽ�
hN@	���(
G�'AɧRo���H%e�w8拋~�J�a*
����]*]3��%���f�
+*5��R��Tj-��FR	�i
m�Y�\�(K�{��D*�8/����j�B��W������B.5Ϙ��r�o����T�$�j�K3WȽ�3E����`���;���@I	�w�s۩���@A���C��]�J�<x;�CpG�;�؏�?:TB(}d(�V��C&E���%�5�]����.��z���(�F�%��#���ཌ)��
+J:P�C<
.�r4|�CK��OXZ���p�����~YO�}� ;(
�|�#%=�i�~wBQi@���R�T2v�J���v�{�#��s��B
+G�]RI�Q��I�@��@*�����}�d��NE*aSb�ޜz�ۭl�r�t�@~���f��]������}�WTz����$l(R`R�REJP��Aa)�a�*T�j)a����6���4
�7׮��
B~$N�8d�is�ٻ��s�%%e�I(i�s�����wM��e�8�*�[Yz�v��
�#,�hi���_!�{vIq���#6�щڻ��F�����2s�S��HqJ8�K�P�}(����%�����Ҥs�4ȃ;��۹���ɫ�ԙq�s�t��@.�{-A>��q(
M���R]��Y��
��
�'
hAL�k�
���o�m�H�[F�tR08 *U�J������
+�5�*�RC�#4���=�"0=�L` ׊^)�
��
�����S��n��%�J������NLe/a4�Td��������	�<���R����t�C�_Nr�t3(�@��E1���톒R�ٻ��IJб5�YK}�\�Z��1�hH�Sw�����=�Ajq@&�p�?PY����\��BG�2�y�e�L�
�KF[ݚ��;h�S
+@�䑬}$.��TyX���[֠hX�
�I?�Ko�;3J3!���v ���)�AC��pl�Υҫ�R�TʀJ�u�'�J8��R�cx��4��ֵ��<���!*)&�qC�>*���I��*�*R��DlNmJ�"�1'�0��<���ƣ
�[�@ݔO-$� T:t�}���}���LS���!1=��q�h�KZ��i<���)�]�T��/�B�(�n��AI���}a�g�%(����Ky�R�-�;���TJmCУ�Ң
�~
+L'�P	Rr%�I��P��>�L��"n��W
=�K��e8�s
�l����5��J�
����`I
[�K ����=d�3
�2�0.
�ս�0��o���[�i 7��XS�
D���P�T�f�Dv:����'#�X�
זJf�Q9���}�����no���<LX��#+����G*U�J�ދJ�4�*�R���j�F	S	�ӵ/����TZ�fd��0�
�
 �W(k+&��Q`�Z0����=[/�7
�N�҈r��`�?w���L�q��(�d�0T��
�
�9E)�
+K���>�4�J�O;�vtG�'�X&Y(A����Bic���	<��q��q��-�n1�ď��y�՛r&�u[�/�Gp����&:(mơ�~��a)�nV9����!���!�)'�r�^�5�*��|�*{[�`��@�ϊHI��H^�p���T�?�
E��Ʃ�2�{�:����t9�Z�݈6��tP��R�Z<����ቢR��bM��}��j*AJ�Ro�s
��t���
�`�=S�D�HJ�D;"���`�|�PIEJ�Vrs�����g,�B�C
=9���g��/
�V���.�O�L����ϚER�I�c�r�yӭw�	�vz+�M�
S�ީ��A�9
�; �_J8��4$�K��S;���3�#������CI1)&)T�%	d�L���'nn-��;�-�¥�v&n�����ޙ$RfGp`�������a;�<,�
-�g{c��Y��t���Q�#�fN�
}q����X�2R��������J��R
WY`v"�uй5��=Vs�O�Ο3�����@U%
l�-$��mZ'Y���
TJ5��ރJW�JXh{Vo��
+Ji�}:�rEe��ȇ���%$���GrQ�y���R���P�ҕ���
P*
+�����p�Oߑ��=\\�,�R,r��p�+/y\�� C;�c�v�wy at r��aҀI6y�+J��f�H��::�V7m���w�$���’B?��}}���U�-����8�ҽ�T=zGH()*=�%��(NJ�$ɲ�L�c	`��p�p5�M�Q~�	�H�:X�[��]��w�m
@)7� �,��85o��g�g��Y����a"oq��҂J�}��d��

r�9�!���tp�t`*
�J�	]�
�Ű��:�r��׾ʍ<�S����^
+
vxRf��*8PTRFx����
+M���S頩D�6E�}��@��
����L��b�C���Z��R�o Vk -e��Tq��GH�
:���
>�%.�'Xž�*�Es�dڎ�K�\� �����
�� L
+1ie�wn�d�wzk��/�U�D�'�T�T�Y����%ѭ�Q
���j%���vĵT%���
+�0PRL���i�'���g�	D�%4�|��%7�t��q��
�$/Pr��(��
)�Ƹ鏂�(�*=�G��f
f�
;��-����6���
)�Io �,owъ9�(U��P2Tze*}*a'tM=gxD�<���W�J�äU@���iߑ�(d/��Œ�NW��"�}[>wP鋦��[S�US�
mϥzu����
.0�TB��#��˃;�2vĻ��T�@�(p��Y����|��sI�K�y��%��x��6=�Z����K��tq���H
+1It9�%]��6�xN)ْd� P*F�
+K,��O���	j
G?%��uhG|pwDG�4��*�%��
+gf��H"&%y�C�����xj� ��։\�.|�Koh*���^��4��_7��t�Hmm���0
�%X���c���|ã	�V�]C���M����7�g�";�+w�[ �S��*
�����#H`1���oo�ĭB�~uG��_(]uw'�;���0���{j˗��
T�ߛJ����^���R��Ƹ��@Qi��Lli�i���m���$O	��Fǎ��xh�Û=0����^=��h4U�ԒNE}�&\\2Y<<Q��L�����P�§A�@��D
+!i�IN���({���;l�%d�Ґ�g	�:8k	MxY���R�ShGp!�����&v�I�$�ҭ��o��]+ %�"�( X�f�0Aw���

�pi�bx)S9�v3��u׽@I$�t�
��󘡥P��
�@
��YT������sq͙Q�1����#}�]*�+�0�N�t�T�B���^Q��z�9k�'�c�x��VXO����y#l�a��a������f�в"���+_Td�*�J�ߖJߙJ���)��h�����z��jz�hc������
������Ď܂���)7{T�@��4�w�G`5��W\J��t�Aئ<���\Z�0�Nӱ����>�^�0i�IN��J���	n�SJ��-J��_{�p�
+XJ���kJ�!�߄��,����
!R	���Q�0i��U�LJ�"! a�<��-pi-�$W�f��E�r�B.X�9�8�M�Mc*O;�1%�#�6
%��+�%����!
;�8W������.Y/`ޫ;Vu�hͨ7٩
+�5�;:=a��	@)��
J.�Tl��P(*Au?����,%Op���FK:���j����P��G]T�F��
+
��oV�]��?��@Q)yO*%���
T�6�–�4?b�
�^1�MoF �?>���DS�
�Z�Ze� '��+G���f�A�F)e�v���f���%��@i�1.
Tk
Lh�U���
)%Y�6�$�����EٻJ7�W�
:|i۞��@<
+c<?Ca	*�=����^)?呃��
1x��O?ha(�����PP²R��9��L������m8��å�0�B����<{��\���Θ���K�<�C�J�#���oK��y�"
=d��t;��tg�.�s8���)h�
D���
���J�J*}QT��~I:G��K�sI
�%+���zp~P���q����"li�e�!4H<3��}ݗ����^�J�߸1��9Ml�O��C��J�6�
��a���t�36����9_<+�8�I
+
+
�H�)
S�H���Q�
+�*����Q���}ߪ7
Y<,.�R�pC-9{6\�j%�x.�T��� ���������H2��6���N�Q
|n(��Y3c��N�
e�jf�w�;K�dqa	g�$������M��;���
�n
+~�= oM�@	�#
���,s�w�6q�̓E�ײ�����Ҩ��6k�0�>XF
�|t����w�t�Ja,�����!��%<���i�`א�RH�o�;��,܎x(�I]��
�E��$�P:�JPGy�R�
U��t�kL��Z�s�=�d����&�.�*G�D$��Fx�>�B����

����#���?�(�����h+?a��4�o�Iyp�fV �@�<V<�WSZō��
A�CT�PI���e��K{joE��,
��å̄K&��6c3`
+�}�r�4D�5�Q��e�6o"P“�2{�S�NJ=�L��
+�%���C��T�
��
��ۅ;�WP���+�
URNJ��T�`�"Ç��Ә�c����G�S9
 ���Sk7X�&=����-`��/	~������RX�넃�w��|C���d��!���W7�;�֚)�	yq6���kyv WIw�H�������wC%��@�k�� ��*�9�
�[y-��Q<�a����5_ig�tg�Џjy��t`�a���Rm��>�W85�����
�	cJS��l��o<�K������

u<X*�@B���q-e���G�wDJs~5���yCГx��&��
;��+�,�B7=�p���*�%0
��hWxT�	:�9�H�
+!ɦ��8��&#t�%�پ�5_:��w;��A����%�~7�������������A_&6g���I���D�Ǟ��Z{��� qHHRd���]��<D�m��2����9�f,]ȩ�
/�p&����X(���%я8	JXZ��R���ع]C����qiګ
���&�4�̂�>��NՅ���@.!�KB�/�†J��/�t�2VPG�p���
P��"��Ǽ�=%�<0:
�MX�{:
�E%��ߩ��	<

+

�wi��+
B�~�>T���S�&x��

+�Z�����kmg
+d�29]�
 	���
�:�m��XgC*
��)��5��ܱ���%.e�����8y{[�B�pI$��.��2�^�Z6�m
�D
+"��I+�$SP�.(a&(1��w
(%F�h���B~F�{�`�hoG���Jp�5��T��LUd�hI��xI�ģ�]h*����ڹ�7�r�~ImMʕM#DIz�{/:m<
+JKz&^�Xj������HO<�i�߫Q�_��4�;GhM@�����NS�7�
��_JH�?
���+d�>��U��%�s�Cv�5 g��W���|GP�b�>��4��K%��94�˧�|>��ܥҟ����F��\vO�N�T�-bO"`d�{r�@���0PR�a��
�.�~�
3����A�H���=�t�p	�Jf�d+�%'��t���!������Q �aӖ-Ĥ�aR��;HG�@�����;
� u��.!��+Si�3D��O��%H'��vG�h�
��\D
u��J[��S!1��k���)q��i��Q.M��z���t�ƽ��e
�Mq�%�E��_�r�dl�2(�`������|C��C�kh;�piTy���N��R7��Hvo�d��@��9vI(	*
�C
�w��t���=��Al�Q��Z�M
:�6I<�3��4�h� ���+p�����w��x8�pW�
��(�i��[SIaZ��
��:�����14&����{LyY�kf;4-�$ҽ'(*)˦~��4&�T�����b�4$��l*��7���R�T;n�)���P�ܐ��4�-/9V��rIL�ӵ�r���Ѫ&��$�/c�l=	�*'#��+͒
��&PjL�D.��
�6WR�n���
!
+K�O��2���

��lLaG�{�#��~��^��<����1h��c�D�R�@�T��J��S`��-+��K��.�`�F�.�s}�MɌi,�~I�s�ƥP
+b�և,�`ɴ���!�>�K��lPy��s��,����Yxp#ԍ�6�;
�UZo`J�S�K�
0c�A9й-
���9������<G�F��y��W2�*V���O�v�_Sh w	U�~��������Q	Np�z�
��}K�&PC����,�z���}X
��7��{�ׇr�9��r�J�i�
�Im�]��^�͚�T_l���*.����-�񰼴��bI.
&6%aF�8�8��J��hH�^�a�a��l�
+kr
(�
(��;L�)&� ��"K�QX�pO��Si�`DW��x
�@�THp��J[��e(�I���"SC�R���	:�\Z {K�|��Wo`g{S�i�Y�诋>
ܞ�1,q+�).UNאs�����4�sT�(��qC&=��
��Tr��8vY(Y*�
�C��w��@�A�bd�t��p���������"Јb~<���v�OaPe

Ah��F���tkC��pq������Tz�T�J��',,=��U�t�9M����0eCѤ����A4�c�FH��d�W�1���ر|��&$�^!�	ۡŷ��|�J�-����)
.�:\wϔ��xi�s�Өr]�gC9���>�;X��zI�f5lȤ
��Aɰ�!A-3w�ړ�6P�rD�X�)��|@?�RxyI]vܔ���v䎸�1�A9n�
�Iax
=j��)�
+b�z
<.�
�%�r�J.X�1�8dң
U(L#����M�v�ð�S����=��,�z��v)�N�r��d��x%N.�� ����r�
.� ��
K��
+V�B��0ꋱd��?>����.���{����"����P)+��C
�04;�����wh
O*Q��ߎ]���-$�2
+��
� �R�xo?eX ww�@�D0@	G���%�t�xjI v��%�^���<����J�Y<�U.�)��L1n�Yϳb�pL�i\���Y�j6x��0F�A�D�Q0�a���D9 0oua*J�	�w�{�m����
+,�r
+��	�u��.�<S&��D��Ύ�KO���w���k
�8P����%fR�v���J
��,-��&��F+�S�r��f=�_�^��e�Ʒ�/)Mc�ˀ�HpI����q۸Kx
�9�D=��K0�7�5�s��}�L�Ay/R�ł�v?�$����g�`S��<�.%C�﯇�����Y!6h+ҹ'�sd��
U#Зyd.=R��ϟzG|.�G\P4q�>�1�U���}��p�bYI���������P�/ݔ�x������'�L#����y�Fh�9O �B�cy`���.Jw	4: ���J�^nx�p�
6>WW��J\z�Y<���b3
��4
�-/�x	5�I�y`ZB�q�v�9s�� i��cӦ5l�G]
��D$�2��Dm2{ǁ��,
+�6�W��b��S�A�R��r;�PF��
!T�{�7�J
q�+˶�����<W�RV*0
�������<{�<ob`L��(P"Ө�[
�떔N��8��-�qS\b�4x
�6ݠ��
�
=�N�gg�t��,��1�ݸG�I!o@�>�K1�k�7p<�\*}�:���is�9�KF+
�vx$����$�?�Yi
ɪ
C)�E�C�
+;
��	��[2˜������C���ѹ�tl��k̕��Raю
 :�B ���5em�R�)M��(�	�
�s�hB������R�,�
���Y1��oK�%7^��'/`��e �(Ҽ�,�;�n\�u]>&����LJ3�1�K�ˁ[���R+�
t�t8�s��;hH̽����.�#ą�k�	�V(�*A�\RL�!VRh,K����2�
%��t| |���Лpr��7k�reӈ�w%;NI�
(�XrZ���?�k��ٮ��q7�RX���t���� ���)'�S(���A��E��T�Vh�RϱA�u��%��1^~���

�`�{X�gN�V������x� �"<=�4
�(t8�8‰Q���T�p@މ�n�˺k�
+�ڊ�`d
��������<'2�P��б��R���xܐH�}'(�c�%����8{{�VXU�4
�{��\�1�VN���׮��/�ɼ��$�`0m
]����Qm�
bSQ�@If�P�V��%� �NG��<�9&u1˝��*����k
�;b�F��@?e��]Q+.�X�k�j�f��<y��*VR~|17q 3�����b^z�>Nx�3�8ڛ�%0��[,�r�>�t��X�M�P;�5�!l{�	��.�w#���\T�S����W��I��#T�
P��O��g������
@IP���b��;_���m�)+�Q ��s �
O'6j��`5�+�
+����2�
���0��`����F�SO�X�QVzs*L����6tµ�t���

��k@
G
+��A����Ð
+
k
+�r�4\�G� �
xT�5���U�� �
���S�N/�<
��]>��Tޭ,������)4�N�Q��&͚V/���0�2�I����
�w��PPE�����Vʹ��r�~眮ҐV��Z,�euc��
+�
���#L�w|N)�^�L���z
}���R�J9��P`�9<�K#>�Љ
8~��D8��޺�oUl���Jɠ
(��>��^�
���#]C����B�ف���^�
�h��;��
gM���R�
x��]����C�+{��\�u�p��9d(b�= ����B�G&��Ǜx�ex/�#~�&�7��C(Qd �溦#�Gh;=oC�
�F%��0�uu[K�	�#cF	|�H���:W*n�(�F��@PR���
+��O
xx]|oB%0���a��5�q�*jz�pɦ�P���d��K�!�� �`���k������Z��H71@ң�Rj���Y&�	%((a�
(�X�č\)U��
+nK��=e��
�	�# �W;���
1�!\��;d��*X�
��V1����8V���,!�€�r���:`�l��R�,�Gϝ����`�5��PXנֻ�=�,��K at I_�`[��a�5��;�����xi�e|0�
�:
�>��ݎ�q['�51�n(Ճ�\tzbB�A�R��#:G�'U�Zt
+
�9e�R
��c0�=XѸ���E�nI���
J(-B{
D��:4�-�CQu{m�����X�-� �����UT�� ��c�M1B�d�R
v��G'�@6t{�ce��j�9�*yh(�4:`ج��}��:v�Q߯���\29(�>�
�T]2]؍9`�/��h�`r�$�˳D��U@�D֎���Hb��i$��1� G�
+b%�3JTQ⡂N���w���i9X��qk8� ����v]?aU��L���\QR���o`�r_��)��TB�t�$:Y|~�V�
���]�,޽����:��M��m�F����l,��_�	c��;�'��0\BIS��E֞Hxu"�0���T'�#؏
�q��̂a�==Q�"m�ހw�o�8JD%�tFAko�k���(8`_0�w<���ϴ>�~������
+9s���)3��}6¿Q����/����7��>W
�f׸���ۧ�
0]A��t��P
X"��cv+l�'d��l���;@�P��Q!Zy�O�H����öp
+��t�aL��œ��{�/��)�%S_2&V-L+�\�LR����g8$��;b*Z�D��R+h&"n�K�<�nJ:{g��j�G�@C>+?���eJ�<3;"�Bo	�"�
��%
��S\�M��y�����
+��e%�a�X<��
 �܃�'�|��;1���ƙ�u�X��V�%W���mIi���/�_�CfBv�_�v
ut���J�n����0
+���ê�+���f"��}9�$��M���݄7p*�<*�W�s8�
/��J9�4��Nt�D���������FY8�-�0O �~����
�atM�?��^���F8��{P	1��J��v/%��Ro���Q!�s���TL2C ���@X
TQby0�4����r�aP-R��t�3�谒M�*}DW�
��qR+(��4
���2\�+�8�� L"d2�y�1u1m�^qksv�HZ�
I��s�$�IxL��u��
�S��@�X��J`���3�^w<
��7�)0
��Ȕ#M;�n��FEvFE�i���`�C�E����I}���U=�J�����ť�*�c�Y? �v3Ƨ$M-�\���9�ѯ�~IJ���4�e@^���L�,�^<y���2\�q[�e/`5�
�:Cy{�1�E9��=��Y������Ϥ(y���ɮ��d�DMg�]�1��35��V��

���.�!�
&�;�[�E�
�K$'��H�yHWUE[=�
R
���o� *]��қR�
+KW@%���/�懜f
��V�B�$����q��Y(l�C�eϘ�5yZS>������V�ʱ㕀�Օ��*'\�,�N�uĥ��\�~<۾E.�1	�գ�ؘI�
+(XX�&_u+-��-G�
�6l�6�Z�`����a�݀ItD��
��%n��%��tťF������-_����T��Q mv���
!U$���d:VR�R�����F>a��O�4jϤEӐKt�f
+��d
+�ʅ���r�<o��^�u�b
+	k�5�5�]�1uʀWc���q�%���f�D�PF��k(�
.�W���<
�Q�.�֝#� �4��3@��8
I�'�NU��#}����I<2+�(,]�c�iW)+
�}r!8@,)
��x	��j���Hf��
|M��ı6��Ipr6Q:W#���"���3��\Vzc*a���46�@Ʀ���W��%T���6C���1�
���AA��'A�'=.�u��|h*	��p�mz@����#���s�d.m�C�ҙ<	&m���QO�4QNQ+Gڤ�	�lִ�m3wڲq
+��9&QAI'���QEI�9�������
��h�C��3���"
)ύ5��
�U�;Bn	��
+�+��A&=���羢���R�	�IRñwť4q+����O\ɑ�����&L�5�/��Ӹ������=�@6
^�bV
+w
%�=�N#<�$���u'�:wG�Jݙ#3%x�Yx�F� /��<2�;�x��w�@ɣR~���p���]�V��c��)��p
+$N����gaG����
�
:�X�rh*Re��R��A��.h�ޏJ�d�>a�ءj���W�N�D3�>�F
d3'#�[��a
P���Y%�=@i��*��9�t�u6*���xB��
������E�Q�LL+K� �
��?c"��3��I��K�d�D>7�$���c�f�w��;�t[=3X���fpx�-A��۫�
+X�
���
��]��O�"����Y}�����{�oMӨH�i���U`��G�.AfV疜̬5���n��p���z2��+I;^9��#ʹơޔ�䔫;�]F�'AiK&��q��î!�R�dҫs��ug����
+(
)���:��:��sz"�
KJ�������dt��h+l�9k�;U�Z ��Rr�",1�g�>2?�/O0�3Qnb�\ %HWQ�.�F�w�J��c�r���N)X��
!�1!Z�<^ebG\R=�DŽ@\y(ɚ��e(q�h(̓.lU�\�8�*?\��ʤ�t�:|�%J��t"�8�&qr�%����~DŖ?�G�;O
"� I$�X������� �к9�;����O��~�W���
7��fG��jG$�;b7�#��(���R RU3��T������Je�vL
`j��L%s	*�ib
L���	�C��ȕ
��M����L$�I:��iW��F3�����B]Cp��=da��6iO�lw�I0ݹ����q�6�Y�5�8B5�7��,�.b���	
��b�

�������@�������
d)�=q�S(P�

��f(�<Q���(��w懟��w����h�^�A�8�d� ��SZ�8y��3F3�L�@	�
J�:V�6��ĥ��*NB�p	�=L㑿W'���b�N�9�<&��c��԰�Z�~�V,=�T��N$�^��~EَSwX�H�m&q�)(A�
t9
�W7Pb*��B?�3!���T���+�e8����
���#L���D
�;�A�nLzjڗO�??=��p*)6u
+LY��K^n���k��3n��J��o�xf��a��u at f�כbR�l���c��K������Nw
I.Qpj�'���HHw\չ_&�Z�0T�
58�0	T�I��&�����Ya{N�+Kl�!8x�:
��Q\�2�NLY<d)ߎ�sc�G�J�6P�

��6:][�R���ó�*�~}?*�_��t�Fh_bgb��.�TL&�C�P
�p&Sʃ���"O�/JO�}����}wX�	Z
+�\*y����
W�+�w�Df,"3��й�R7=D��YO,X���&t�c��A��A ��{|�@"ɆI�Ite�Ih�p�X7���
��̑>�O���!�쎀
4'��
��
�*BL�(Vz&=+&=�|��jH�u]�I�Z��TS����(�*�"3�љY/ ~
,�)��80�f� $��1��3�L2�z�4����?�@ү���!�K֫��l�z�;�W7��rչ�{X�g3
�`R\��
(�˼��Ya3���%���
+����`���ѦH�
�
+ʝ��#�> e*�"�����@��7�hA����0R*md�
xz���
ޞJ
,}��R���!�R�-P���
#���9e���#�B���h������<c
+
�M^�J�ؒ�JWNӃW]�Ey��!D�K�Y:�Gv����L.o��z�4�<sul�c�U*5�xX�h$Ț��=>6l6L��
jX�Ihݔ�=(	,���O�
��b��
��K��-̎�r�#b�ђ
�J)PE�mk9�;Ť�b�������	����L�I�j��&83[r�&`��x<r%��F7��X˨�o
���Ά�E�4�Lc=I��:�kH��r��8.���%�.�:�r_?/�87��L���jy�¦���
��X΅��&r��S8��������	镹r�"����ڕЅ�dQC`��,)(������T�ގJ����[¥�T�����n�3.�� ��u�1.���<��H0�T�xL��?�H	��t�M�E�.I��
,�*�^g&`rt
���0�8h��%&|<�τ:y4"�2CJ��H��v����>)��p� ��9w��>hr �O��v*���:p�,�`S��>�
Q⎈GwD�?�
��ZD�H�"5�n%��U�$ [...]
+(�W1�<L։��%��<g��&�a�
��2�L
+ɺ�c���P
+biA�P��Y�\��x>����P�3�
��qC�YOeBL���
� {5����Q
ZaNY1�
-uODJՀK��@2��b
+sy�OJ/CO0������
��"����;juF����F�wi�z-)a��
#��o at jjV ��GD�<�F��% 4C	BǘZ
�	ڀs�`ɪ�I�Qz��kVL��ZR�c��#��q
km��߶\F�l��
��:s�L��9i���ǯ��g����$�qR<�B^_�I������i�&z�`	
 ��[�
�WtT�=7ť�
1�!��xG�X	TDHypĤ����0��[�����'�����`�pA�
o:Y�V�vY�)�c`)c��k7X>
$�0nݥX�*�T���v��m
S��7��ݬ�%
�j剤WGyp3�cDu|��(���<�K�A�ݸH:"N�'��������z�9Apa����߰�����0r�� LH&@h
�	��x~`�|%'��
��(!N�**0h��!�~����qi�������t��,5�O-p��P]�TL�H��X0|�@H
�#��̀I%C�e��ġ��
+7U��%
�KN��Ȍ�u00���C�\���&
�a��I:!fn0���^l�I�S>�[�\V�H�0�Sw��
��%���~Ӂ���8�D�v��^`G<5숮�	�vG�i�Ȏ �
�D*�LzV:���F&)$u���z�7�}d��Le���a���^r��7c5Xɕo ��,��G�1z�2��n�D8loʗv�i<}X���`�÷@א�f�\r� �N�ȓ�
ֶHuV!�����)�R�j���L��p�����X�ufʹ

^�ҵ
p	�pFI<(��
�	�|%�E)�
%}��&0	lpE\L�i(�~3�����$��9z���f5��`�
+
Ԭo�I��A����GV��*ҥ����C��i�~��� ^".��YhƸ
���B��n˧Bc�]Z�X��&m06j�>�/?j�2��I+w�1&�I\�@oy^�^�I�Ϥ�ky�:n��>��Q�;".�8:�#R�Ђ�$��Q�T��I�%2V`����=$W�I����x�O�ٶ/.(�C���.�����1�S�Ă��hF�a4�� 犖�Rw୧N���$�l�ti(�e��n�]Cȥ������xV�A�n^u���i͈���I� ��B޲ƈ�tb9X����ǖ��9(-qΊ|AV:��a���[G�w`���*6���`H�A���
��4ޛJ�BߘjK��^Y�
h͞1&m�k�H ���S+e��( �4C	��JK��i(
Ԋ�*/�f%`�P�(`����#���j�}�4ĵ��}����_/�?�M�2]P�� �E�͠�
N�8`&{
��q���y��8,i
�
�Գ�B��G'v�b
qv���I�"�%^�I�3"������χ����Rd05*`�D
-�m�>�Ӹ��
Y��Z>�kW�	p�ұedo�c��/9H�����1�	t
Y.qpʉ<<$�^���$��v���8����К�u��B��H?��	&���� {y+�4��EK��A領�R�<i�m�v�	B�:xE2����m�n�ҷ������]!0P�ҳ���N\n��T2��n�
+F�
��ip��Km��]���$�b�@R8� %�.�� ��%�
J"t��$Tj%����7��G@����-
�
��vi
����P�_��\qtg���8ߵ��l�t��
mj[껳HB�B�F����X�
&�d��dK)
�Wt�0Z,���;"3;��;bvC�
�@"��}�*L
�+�$�I� ���~�%'䓘K��A��&>s�s�A����J��q�|z �6r
c��n��\���2
�L�:�]��
�������?N���\¾��� ��Bip�.��h���NH�Zk4�\"�qF��df�� {���2�9� {�W�J&��aI+�2��%�i���x�lW��`�����
�p�+U�^4��76iѦ`A�C���`�{�s�R�EW�����.&��<������������j;����
�b�E�h��'
���+t�kt���ȃ
P��@�PT�;���b�Ì1u��Z�Dۃ�h�(�v

lDL�\p��}t:T΍'�0f���^�a�=,�,�U-2j�\QFAR�vM#I9�&L�rfǩd+�tt�N�� 
7���0�@;"��ټ�P��*B;Bm	�TS�}&
 H��o���'���&
+�xAeŐ}x���BnF$�2���3\>�M"\�9%�X�9W�7eP�x�$Ҥ��tC/��
.A;kMʓr<5�C�
�{m�:����w�K��Ji/��9Sn
+��d�((
��o$���!]A K�ty��A�TT�v�w�&��t$4��/ҷ���h�KT5�wp� {w@I�����:r`	J	�
+��
�XL0D,��䑒<�H
+I��
P���P�q����s�K�K�������U��"�(�!�ɌŖlB8my�����
S⃗�&i��&M�H#� a�bi$�aSH�j��A�"l�)1i��������pG��������#`K�hqG��(3���O��
+d�B���G�
��~�\�Սڇ�
+�	��Ͱ�d���"��d�_�a����T�(�[ Rl�.d�Dg�l���T�xS�8�?F}�/tÅ����ʣ��Y�Jݱd
+�N=��ݸʳ	|Վ�����8�4(x����(��B�'� B
yo%���f(�Ԓ��sރ���<>:�j�����q��䃓��K�ul YN8GLLB��**��le��
+$
b&K,a��C��V@��OV ��<f��͏�G�y�����4�1�@��kM�G�G
�
�*��6Z�Ў)&�D�L�}�]����Щ�)Y_/2vm�A?��H��}ڤ!�Ш�r����c%�$���0�[
v&}c
�p�btn�0inpT(��gG��G숔wD&v�H���YV����*$���Ȅ`2
GC��&�ċ��x���R�ы�ɴO�qI���Ӌa��	p�el�3bR�7%�I\�
�~�k���8b' F�I�UـI��������'h͖�����
"Y���S� [��Dqc����@h
�
+L� *���4�1���-f7�ib��0|�+��3�[
,�J݌	F�C
�֔�w����|Ŗ�4[!�!�(#���!���#&y(�`������D���7�t�v���J�:�� ���RŠ�h�M�
+[�-�dP�Ϣ��I�
�K뗾�a���둬����pIk��v��;�*
� ��j����K�I�LM����踙h	
���p��j
��t�LX�#r�#Z,EA�$v�n	b"�˗��Q��dʭ��W
��%>�&`���RN��`���.���--

�
�9�ʖ1ǕC�Hu���|_w=�?�g��v���F/ ��� N7 �vǫ��r����CW��$|jܸ��ʪL�1ii���$�/��”8�a�DJg��3��ޡ�56R�~`�>��@�� $�o�$�����P�>�E��
�KK��)q��b��!��M�xL R
 ��6�
ijt��ԓ�:`g�^y\Қe
L
0AK
�T��2t�">
�zi��qo;�bG̒���M�G�Y^r@�^���A且��H��m
&���i�D�m���
W�EK�
��Q9 ��P��RiG4�
Q
�#
q0	��>��$�^�&�IpI;�÷�g�03k܌�s3��
Lf�voBF'��ބ���q&���!ி�i
���}
s���'0i�I�L�q�3.�mX���16�����~�Y�Lz��/~���c�����;�:�[O(.i,d��^3��O��4I�ڵ�7j��!��
�l���zSQ���wN�8���DjE&���B��pM�9J
O�K�@z6@����R��!��C���e��<�:"u
Sy�\J�RM&�:��X�X�h�n�t�����
�E�&-2�@
�ЬA���$B�&i;̤i(����%�#��x;�[�!��!fG�*BLRa ���Cz �|S���h
�
���L��-^I;3)�f��ŝc#r+���X�Ԭ\.�u+SH3���!�>��!˥Xg�����S�(0%�a)K�N�N$��Ϋ�/���
� H�oDf!6*�%�D��N��P�����
d�J�\*����X��R�h�T+�.I��P���
�_��C���>�����
+���W]B1�o���
�O'e�O�|=
X
�%
?v�R��
��+
y���
Pj�D��Ѣ���zz���pI7y�<��H�L�\2I2��)�)��0<
-Ӛ6|̗����
+
5���$��$�R��M����	�@�F
�����2�#zgGt�;�ē�#�-�L$
��?1��	JL�ѐ0��:3���L��Al�~����G
+�aI�,�]
FL��ڥn�մ��LZԛ�v@,�:�\2���� ��u�s�M�M����'��h��Z�8�dlS�Ǥ�A���.��KZ��x�*^n ��8Q�?:G��������MmH���]h<�Ó���I<��t���
�!HKIg"�Q��y@��;L�ȑ"�Ѧ�O�Uå+��(��r
���D��T
�X�̼7�K;R$r��l7�k�Ξ!j�N+��C�
+)C$���Hr�$4mF�t=�&
�(
7?�;"�;��
�-�uxG("�`!��I��d��BEL헁��<��̬ [7���\I�d��/�v�w'p��N"�ZF('M0i�`ٛ[���
��fM�6P
#&J7��h�I���
�=%�V�2
`�J��Ĥ�B��A*�6ìu r��h"[�ʇ�7�ة�h��� �0�d�l��>�����v�%
��`2)�@��
+x���L��PRi�
��tC��c0Q��d�%�؞� @<�C:��:p�t�IM�o��i7��N��j	ݒD*H2a��c�4+B�!�d
�#r�#�wD��
+n��HR��?D��.r��H��,Mfv����V2������Z$	��x�G����%��?¥/�lC$"�܄L���dL����ԝ�;�2bg����&H�֙�ә��6
'��
���)
+�
��
`�	t��ؼ4�ϐ��S�xS�M�O\�Ux���k�-���d}3
+�l� 0x���_���%�i�+�
=�<:�w���@*H9"�tXl �G��`$Y&1���nl��gq>�˥Wk�&`"�ҩ<2I2�z�~��Er)

��+�O��ٽ�g���ZlԬr�Y �v8hӆ�;�IJ��:;�|eoG�fG<O��G%�J�Z���#�K�DD���r%5������j:n�
J[��+9ṇ��W/�]ț��0���4.��4L���
yf�$�-&;�f\�󌪁ր�M�{B�cL�<=�.����
~Jg�.F��p$h
��~&��5�%�Q۞����t`&
��}���%7|�IVw&�sq�@���O��PH���GR�qJ��$�W>�x���юiC�+W,�Dh��p�x�<���Fx
\,N�kq�N���Y�Zh�,��v�qm����(ak�IL+-G����N��"�d�w�����~c.���
��?���Ay��J굔�g�O/��f��p�뵦x�� �}o&M���5d�$����v�4�:��}�K�G#ZC
F3
��Yp�����k,8p�����
+�w�1�𬏔��O?�e�=tMΕ�bB�P��
����sZb��Q��f����(��Qyd!�ә�}�dy�U��u%���`|>�-��0��1Z3�/>����X�zw��4������+pO7�
�H��ri�"�B���%�$��`�R��X�����;b�%xGĴ#t���D�3�1��LW߾��Ƅ/݌8�LS�����i!
��{�W��v�0NX��I��3�
�m�����2������<$w#v-wH�I7./‚a�Af��v&M�(�Fk��՜
��������ѯ��8Rچ�f��
+�X�<[����
����� ��/��l�x��^
��
�8�X�f}{u
:��p�z���&�B��h�ə�Th>-��(�����%�h	‰�[�nI"���:J⚄�l��t�݉L�u��m�]7֐�������H��ǀ����DAP$�Ar��ɰ�Q@0�,����s�at�
�̙3�̹���_�������Z��;�������wc�
�~����Uk�������&y�O��L���T
�፝�H3y+�j�qbr`���s���坞%���5���մ�

���X�=��%������5՗�*�_.bT�(w-3:U��8֦���26�)nj�N���XЫSKI��B��.���IG��&�
+]7c7@��2wr*�ɘe�ژ���r�d���-�N�s�Iq�#x���.Hu��*^=
+S�z������/

�R
+��mɲ汀�T���TC�}�h�$��seD&��E�j��4��׫T���Ϗ� �/jz��9MOj
.o��ZmSI�e��On�ʙ�J��OD0!�~ R�D\e~"Z�eR��4�L�8��+1�x�͐}��3x��#Y%xKx{�*�i��Z�J!�F���kϵB��\�w|�wT�=1������r�U�
G���x�a��Rc�]���o$��
�6N�,���YȘ�³p�4�
���I5�]	}�^��o��M��#S�Wʚ��c����史o[�f�n�k<U�)d=ԡf�&�������
Y��e�c�`�
)j�+�%�6����W%}·TQe�1��ժ���o���;�M�J
��:����hUQO�U�ҕWɻ&�g�}�I%%�8E�J���hYL��*�O�LH�IJGj,[�
����T�o3�"ڌ��H���;������
�M�'��ݖ��������IQ���������V]�Um�Lj�$WM^���Ճ���m��/;��Qw����Ws�,4��YȠ��U�ۿ�G?;�j�J���o����ۤ�:S��T�\9�6W9'��c�G�vj5
y�VjR)z=��jE�NJ4��-�Xx��
�!&��'ӥv�ϖ���ըT]ɩ��T��5z�~�g,��Y;y4]���ܵ��]"�t�x���sRx뮐�,���K����O�zo
�<����S���ڙ�l3��Y�k�{
�e�{���ӣW՟u���%�D���
��Y�&�����T׌����ۢ
+
̌����U���Ƃn읅�
�I��
}T詖��<,�D3q]�j���N,N��5�l��
%�uR��HK�K��*��
rMa
B��F�C�?z�BH
���w���-5�ɩL�}�
��ʗ:�Cˉ�����:��cCf[�%
+�f�F���҇�9��ztG�{y�]!�*ɵL*��"+����n�>I?vDTB�?��e�rѨQ:�f�^ �G��zmF%�f���#��DY+�o�j
��Lx�"M�&F�W.p5�
�bŝ����ނ�ndvTtj���B)"5�����	�6.Px���U�9)T�p����q�*�� 5y)��`g��t{_Bg-e	�#��iHOD�
+R�z�GNrV
+����6ߚ�`�b��R��yjR�ZxG��F�Ok�X��1p�ռ<y!���QM}��>���'$�p�����Z��Tt'E.�l�	)�OD^�I�ll1�������
Ks(����Ƃ��<���yџ�kmo��n"rf�
'E~��px����L��lZM��D<P�5�
ή{E#5���§mg!�%7�as
���XE/p�s*x��7i�
�x�"am2X���
*H��$\��~��!��$I�����i�Ĥ�2��j�G��t�ܤO��'�Ԓg��ThkQ��䩌ܩ�وtTQ��x��&5�H!%�|>DEMXt�B��x��}"�Y�3"ޛk��R!1��ϐ�i�zl����Ci [���F��2���
uyv�UN��8v"Ĥ
`3���.�]w36u��W2S�P�����M�w�Y��\�'b��[��DnC�$��
��[���;�LI��i��S�P�W���r� ݬ	(��Z��-��2���5ͤ&3�h2�1����S���*��/��yO��ShB3�%�4��EI+�����+�')�����>�c{R�H^8"�I��x��f��e
uD	M��Y~�H���o�_�P7aL�^��+3c�A�L�gn��6�[2��ѩ��]���p�������[B҅��rڸRQ�@�T>��f��3zy:x:zF�R������<#oI����#� �Q��)������EF��.�L��<7�g쨌U4�I
��_V+��2U�0*
,J
)Ϻ)$�JJ�L*���Q3k�,m��R�'�~{��ϱ`�ڙ5�f�Q'j$k�
፞�Z��Y��
�D�n��[q�(<�m��j$:�H��@j�#8�<#%+|�U>�c�۩��TJ퀗jo�2�����Λ
\~f+�.�WC��P��z$*H�j��
I�THL�L�92_~��3v�d�j�Ӱ��*�Î��E��F�]�;������ӂF�o����I��q(X���H���?FԼ�D����x
`c�L6WF��5�j����6���<)�Rq,p
7pŌ�ڑ��-����o,Lt�u�m�F��}T�J�4R��6.��eS��Mj;�&?{���g�f`����6
�}��
+b�#�T\o�TD�_��q{��f�դ&�P���ic�TM��
V^%�l3[u�Ҍy-
ˤ%
%$���PD"$��
�1�z����+�W�Q�
>֑��U�g�B.p
;p�N�b��v��r;������
+�u��QP+a�.��n��H��;+{����Z�
�-jY�
�7
�2]��G�\"���Ώ�XR*�h@]SMz>��n��UP����}�N�ڵ-
I�9�6Rb%�"��x>f������}x��P���
��PV���Bp���]4R�7�g� ��T0;��r��
��+;u�s�=T�xڸtV[��6S {����̸eQ���
��Z]��ȏKK�w�6�t�J�7>{���O
�a
�����9�y�|����ԩ;�I;�G�������b�E����D�"=v����M<u�C
I=�5�ѫ`��<(�=c�u��b'yx�j[�)LtT��*�������'���;KNE��+�?=gSA�z�� ����G��
��e�<3]!5ղ��O�Q��
�<�XD?V��
?Y���p��J����E��	IgD
)M��sex$��^�
>g7�>8v�u[,W�$.v(;�
�N����uPEuO����$"I���p΍�~iΏ����
�i�G���(��D���b2�d<-Z�
�N�:dGn5�7���|�b [...]
+� �G��$�!����*C�h$���Jr��51ƽ�M�ZGf�T����)G�O���U���ڸ���Ė�b���6s�p>N��_����
�G��]��H�W�L5y���
(c�|
�Դ�Ƹ)y܎��y����z�4��ҹLJ\�8>�2�1��hZ�i��9��@F�d���
+�1zF�g��F�ŎΎ��z�������W�e7cS9ڸb#��;?"yE%?���
�I�ӥ� Iꑆ�D�3��t��2���@�B�P�݆Z2h�Qp�yo��T�O��O7�3ZHH��ͧ��[��J�'"%%����t���6�B�HC��5|M�B��_&xi��'A���/�]��ꞗ��6.��gi�g _RȐ�?�����t%$)ף�I�
i*���L����);��
���<�K�Q;^���
�������+m��h���H�߉z��F��f�PF��5�!
��ܕ
��,p�J�j�̔W��R�pl��q�W�T��v2]�Lׂ��
��"Ԥ'4u��Z�$=��?v�<���Q
�s~�R�m>��Y�Q
+��%i3J�se��@Zci�

��n"��UΌQ8&����L���D�=T��>�+�0	�'�o?L�/���w��:죔/'�&)<j�:�@�!!%�k>��$3��sL��mFJ#1|���D�Ę_ු�8�Ǚ�R~����N�uw�q���J�aH/�~�nJzA\?@�skML7�8䕒��ש���&}̎�Ɣ���2��J㣐?]jmF^���4��~�}LRt;Qط���FiTD�
��(x��x-\�ԌJ\�\���m��L����z�~��sZV�"N���
+
��ޟ�����y����JV�I���)X��T�-r,�dh(��K6|�^z�)���W���띰�)�&��+y�w��b#�o����8��`���p�����R��7��<�"����̮�P<?Vh,�#Y��K6z�����
?}_��D��0��tɊ
�, �~�E	�����z`��Q0��S~�ֆ��wu
E+k�$�1O���8	�2���
�����eηY��I55	n��t� (	�`��ܭ[D�)K���^J,$�+9	3�Hp��F/��³�Dى�����Ħ��t� (�L8͠�E�c�y�o����J�CY��t_�?%�.R�NQ�S��d�: ���
+f�͉#J�X%��U`R�*�dj×l�2]��Sl�)`���ƒ��ğ򨄥���?�C�
�;��
�L!>���?�Rl2] ���x��
��ҿ��R�<)�dz�/�o>~R�P69)N��* �
Rʗ��$I+�	��V�S������
+��Gֻ(u?�
�
+
+��b%��������ƒ�$�Āы�4�ug7VI�3�(x��=����̐���8�PBpV�(��
�e�$ MZe�j�2] � ! �H�i�u�H=x�� Q��bMHDD2]	 � q�
+)���ԁl'��� ��y
��ܢ�(zH
�b�	}�� ��#pɃv^
+$M�+v��
+ ��Ҙ�s�p��XI
XJD/2u�.
 �ȈD���rn�L�(�$\8k��P��C�@��<!�5!�Ą���MD�"��G悢ʞ;�d!N'YB*���rJ0	�d�Mg�t�d/;�d���z�
�9"��BbBB@�%��%YQ�0�E��+{^�x)�%g7�	��ݴY2*hB��N�y�8;p:�2��5?Je
+F(�^�L1!t �p�mfD�#!e
+�tn�$�8#p:o^�T|�Fq�M������S�K�L�	��$p�R����F�L0"�L��";�L�	�b" %�8�I2o:lv�.)vu��^��@V�n�̄\�ud˧�	)�		g	���N2������R��R��~?��B��A�d�p�vRDB.)�������J���
+
+I�M����>�a|��@/x
�P�:�
DJI;�W���Ȉ$MH9GB.�͛ߺ!!�d�8q^�8o2l~��{TH���^e�8w����:�-��tn�m��B�̌H�"#�I�n�%�\BB@	�)%3p^�d�t�***���v
A=ΝS��:�I,)El%�Q=����B&�|j	�5Ja)yN*�N��&�F��T��j���#�U���(w*v~�\Z�t��ن[J����("�&"JQ,'+!e��k$�
�}` q�$���M�UMQ=���$r�d�L/�{��$�wz�t�P���JŒ�*�}Sfb1��-��F��I'��q�XH
5�DME���o�?#��c5i1��	/Cgj)�%g���6�� �6�$ٳ����
+���T�R	g
��	)%/q�I8ΛLM�6������
�2�
=<�;)&ji�$�A�d��KI�m�$ٵI#Ʉ0"yVDtBj�Tf1qB.
&�<�'��D��] q�$�����&#VWPOR?1����r�D�D�DG�b�� y�����97Q;�z/A�m�$�ڨiF
+&$���3""5�R��Db���\.����Px�}�%%�8ޗ�㼉�Q�8h��74d�H�F�#
A�
�c�+&�]_�f�
]PK�.8�����K�m��
�$2Rm�!/"O��%�f
պi/�%4n�d��/%nUXI:�獄DY�5jԨ��JI7�;��,�L#�EO�̤Ť�$���ZB�@L8��m�źm�	�Ba�	I#!�UB("�a&�f
+$��K�(y��-�joB��^�jԠU��	I���&�Դiӫ��=���_���Q�	� e��$�T�K]�
+���咥%ddGߦ�N�	�GB��Q0"W��pB�hH͛��s���n�Õ%���tnHJ��jj%5d!��Q�D��4'Z$���9}?��G�kD�3R
+]��2]8p�%��A)i'ɄPD���������4������KKh�@��
�MX�#')%]�Ba���l�JКh�ik�ކ�M|{˖-[P�(yM��bb/q3�N��B;�.
8[�߅VJܶ��d��	>2���
%�3!!����6�֍��˥Pㆋ��dܿ��@�8�$�$��#�Y۶�ڵkOt�t�D}��O|?�P���Dj��)�NyI-�,-�[�L�-��6�� #��6^'qצB2jcD$Մ��	i#�Dn�1Q�&�Kb��
+!-Y{x�.
 �#d%�˔-뵁�8�$
+
Ǎ|Ԏrֱc�N�]]C��E|k�N�DE�D�8v2u�K�
��yZ2v(`%3���}[�
+U�&�I�I�kSM�����JH'��$�ҁ��%�[7�R�Z�\2�l�`%���nuЛj���T�&'��@8�[۶�65��nݺw��C�S�+�E���ݻu� vf7Q�(v�:�\.q�|-�KK�7���! �r,%ݶ���^%�$�Ծ5l$��'��L���L�0�n�%ѹ�
���r�J�T�RJ�
]�X'�2��Ԯ}ǎ��=(b�{��ӧ��������}����[d��Ե
��tM3�FW4��R���� 2Ҏ�o3VJ��P;�n��I�kJ"#��
QDzSD��DD������bjќ�$:7�\�]<�J^�����ZJ�
���H
;��PR��]������Q�
8p��^;H3��{]|ϵ0@����KO�NĮ][�:�%j9tRKtm��]�`��J>�R��ی�;��P�۶f״���CG6GD��2�NH��
��PB�rBz���u#/Q�&�K��'�d4nH(	#g�t�I�����y׬�h9pݺs��� �&�5d�СC�
6�	I|ϰ�C�
�^;��G��ֵs'�:Z/]M��]<�
*-�{x�7�X*��Eė�%\Ѹ�h�Z�ˤ���p�և}4P�H$dHj	�	��pBP��[�nԺ���ܮ��BKy�%�������\Ŷ��Ǒ�+%n���#'����-�&�6x�H���ȑ�F�=z�fl$�%�=�G�9�"8l�H
��o�^=�w�"�Լ�
+
k�o7w(`%/A+y}�}gJ��6�$ѵ��ٻ�l
����T2�B1ҏ�$Z��"!�h�w�x?���CB@��dE�Re�}W��F~�v��
���F:-26n���&L�(��L��/җ'�o?~
Ep�(��aCEz��A^�f0�%�TZB�@<h+yK�ҥ�(.��]�F�<!�F�e�־9I����v	i%d��q㼄$����q~B�PB���%L�VzC��T��ո!! �	n���w����yu4�6�J�I}II"o�q�D�D��L�:u�iә��M�&�q��H���ʝ�@Z0����`K
+��Ru�q
�����A\8��i3��T�&��h/�ڶ��I�
JF-۸��E��2=����,&�wn���Z�kKԸy{xfB�AB at nbdΏ
_T�R�O{״
%J
9�7r�����"j"d3g͚5{�u�9�\�"}��ٳg͚9SDp��ޤ��lj؍6d�b�Գ{W�5�E��D;�T7<�J ^�}ۅ�fo߱�ڴ� �6r��چ�5z�8j٦Ȅ��	I/!���L�ލZ7�%�\jצU�fW	-y��q�U=?+����3�W���
]T} �蠤ԡ�Lܠ!�F��&Nq:I�3w޼y��/X�p��En�W,X0��y"���ɛ>m�d�1�E;H�%^.�k�WK���o
ؠ�t�@�'x�E�
棾�j����XJ͚�jӾc�n={�e'�
=v��I�IH� /!	"��#�	��2u�	��RB��D�֭
�ⱖ��M�
nZ�װ�Y��J�yV��=�A}`���XJ���ı�&L�2m������"f��,Y�t�eˉ��W�-[�t�%�/Z(�G��9C�n" [...]
+%� !��.Z�X&dYJ	Y"2��4c�Tn�F	/
�ߧW�.���R3�q�������N�t� (8����RE9�1����:w�ћ'�$7}Ƭ��Σ�-Y�l���+��~ժU�W�^ì��/����t��+E �-]B��;g�L�b"/�6���}zv�"WKM�ƹ��
.�`%��������D�FR+%�Kmېab�D]ی���P�&��KH��	YA	Y�p!�i֌iS&	/��M,�zu�ک}�V~�&��+K��e��ɫJ|���w:�愔R�>��Bi��q��f�p���"n+�_%b�vݺ��7lظq�&&�F�(��aÆ��׉
�^En"3͟˩�8^4�CQ褖�jB����K�
+��	ޣj��.*5l���kh�Ե��Ҡ�#F�
/�$�4w>I�l��kuBDd#GD$d�N�2a��u^���A���ѕVK���-�ˍk� G	?���*і9��5n"�@-�!b�$7],�D�D�D�D�6lۼy˖�[��#��lݺu˖͛�E�6�_�f��+E���͚1u�
��Rk�CQ7�9<���W������V�	W\I;��;v��[Hi؈��&N�6c6umK�	#�^�	٤�5ńl�	Y�rŲ����ܹ�
9l��5ntiI���[�L+!" ��d^U�V��JtQ��@%��(q�I"p�7�f��;v�ܹk��=��H�+�w�޵s���[6�oܰn��UbŴh���D3H�c-u�ܡ-�PP+Xø�D������noq�뮍�6kѪ��R�~)ڶ��g͙G]��Uk֮� �e��L���C&dӆ�k׬Z�|��󅗦N?Fi�K'ո�׍m'���`%�˄���r�ר]��ܿkשk��$%��BI$n���II�"n;D�D���a��
dn��/���߿��} [...]
GD@�a]V*]�B9�O��@��>�w?)��b��`���$�H�.�W����M�
>|����-6��#G>|��M"�"zBM;wlے/R�j�%
)tBK#��߇v(�lL�dx�
"ҏa%k�/����׌6���3`�Бc&L�>S�mK�_�z����Դ���rP&$aD���x�N�VѺ���,�?g��)ƊՒl�xO�rӵW�~�D�"��d#ȑ�Ƒ�����R߁���7��D�M�m;v��w��M�S�n=z�رcǏ�-����W�
=z�H��"y��ۻ{����7�_s����i�Ǐ
1�ZڡP��X,�
+:T��6G�@���$w��+?���m��u�̈́ACG)M�5g���+V�]�����{��? |t����c	r,��
�6o��/�;k�d�Ҡ}zv�_�bIߨzх���`%����8���3�\��9��ěb��m %n�6�D�D�n=JA���;���f/�uםw�y���v��H�͇�x�}{���7�]�r�ВX-�=|�@��D� _Y��U�7��.m��ȁ����#��n�׷5��e��y3a���Ϛ�`�k�mN]�Pҡ�7�r�p�LHˆ	9&rp��=�v��m��sg��Ҙ�Ըu�ҡ-/���R�J��8
�0���J��kשEc^*��
mNL�1{�B�R�v�ڻ��P�-�H"l"i��{�}���<�`$< �z�}��{��w���v����M���۶lZ�f���̜:qܨa��ױ
-��E�9"Ҍi%s�|�J~�֊���=n�X)-X���56ma'��n=*�$l�r„��	���;)!��|�Z�=��o�߰viI��Ə� [...]
���[,���;X	AD at n�[ɸ�7���k�riw���a�������i�X(
����"pBI"n"l"i�?�ēO>y�ĉ��z�i��S'N��>���?��Hރ�w��w�.�t�&�
�ؖ�Ahi�|ڡ=|�@�7o՜3W��Ȝ<SE_XB�@
XVҗ��
����K��CF�f�u���6om�����rL��D��������<�	��'�INȣ?L	���;n;v�͇ްw׶-׭Z�x���Ը
�-��WN�$�6�a%��H+�k^V*W����:�
x*r��}����}
�U8��{��G
}�q5���<�̳�>{�ԩ�l�+��}V|��I��"y�	3��=w�~\����{v��V.]4�Z��C��MW�Z4��;�w�^x�w�"Ҍo%y���M����^3���m�wQ}��i��-Z�Rڵw?�mw�����DŽ�tB��DD�򌙐DB��n9|��}��oٸ���ԸM
/���b��N�w�
.��\Ʋ�EF#(��E��R���D�j�F!�
���m줇}�	������N�>�b$�O�����?���ɓ"w"v��;e��
+-�_M;3�N3|Ȁ�t
��2��
�n1B�@���$�VR�	��G�������3�,\�r
Ii߁���zL����!��'O<}�LG$iB��dB
�_x���Gn:�o����\�t!5n��ݷW�N�Z]s5o'ԨV�b�r��WX	�,�7��|_��S'�^ێ]z���]�l�ڍ�����÷
��.r��SO?��)6��μL���+�ڈW^���y�%��N���O����Б��n�
�y�����0�Aq��\���9���LW�`�m��ؗ�.�P����}[�v�����}�
ѷ�X�>_���t�������2��DB�	9�N���S��'{�a�܎�|�X-m���Sh�Կw���T��� R&�
m��@�����Ҟy�^����	�%+Voؼ}׾�BJw�%���'�:��sϟ>M>z���^{��7�x��H�x���_{�WE�^�{��3䥇��
�i��
�C!ZA�X�
��]:�iq�����
K�������u�K�>�o�%��Uk7m�)�t��mb���#�?q��3��FzI&�#�4!gdBN�un����ݵ��E�fO�+K��z�V�+��Ƴ���{������
+��G7�M��[�O�;$VJw�����I/P�^������o���;����وW�}�
�շ�zSDO�N��y���>t�ВX-ݰ�[����b������Ud��ʜw1W�� +��cZɻ���r*W���i�Uێ]E�6T�mӯ}ۚ
[v��/VJ���УO�x�ѵ�xFI'�mNHDD8!osB^�	yNxItn�{��BK���ܲq�ʥ
�̘<~��N�;��l����ȋ�K���Q�VRg��k؈7�h�|�ȱ���	)Qx�irҙ�E�(n�������|��وW>���U�>=�;����N>�ģ
-
����}�
+��Ҝ�SD���]#3ǝ ]X��"X	�E�J]ďN�M��<�zr�w�A�E�F[ܫ����X)�^�cO<�̩�O���+�	#鄼�	��'�}N�[^B�y��ǥ��q�_�Z,�fM�8vm'���M�AZ�ɭ.��J ��$�2e�����$A��4l��)V�n�뾇
y⩓���%�
+%����D�>���O>���O?��|��'L���r'��^=��
�=�����
ڿg��
��/�7k��ܐ}(s�9s����5��@���t���Mg�T�Z�/+5����;q]UZ�q
o&
����$�m/���P���42"VBަ������}�k�6j�vnݸv��ѵ�!�Ȼ���+��heB`%��X���C�*�c����G1�����X��U�>��h)q�I�p�(l�}��_|�e$_|���q�>�؉v��W^�{���
��n�
+n۴v�R������
K2s�v�J���LW�`�!x+��'yu��@
��
��g�Y���u��v�f�
�H)Q����k+$��H��|�	����)!��r���O�<����ƍK��-�;s��N�M�V͚����M	)�Y	��$�)x����l֢5]�
8t�Iӯ[ #wEN�O�8��
�8�?b#}��W_}���_��7�ڈW���k�U=��O>��o���+gN?/VK�>D��{wlY�j��
m��
K
�q'X^>�.�
�ҏm%���T����б[������0uּ��Woزs��÷�~�}I)����o
+'��tB��DD��J�G2!b��©�^㶏�,�X2���c�.<��ݸa�<��}�>˜�kX	� ��.�TMmO�lӡkϾ�Ex���ڰe�^������N�<uZH�'��)�_}�ͷ�}��{��w߉�}ͱ�Խ��[��z�E�Zz��
+
���vm۸f����N
3b��9}��e��[�a%+ѕW��]���M�ԍn;i���KW���K��w���RJ��.�6�$�$���	����g�ʄ���ҳO?ɍ�ro�_w=m'L
�or�C��V�hܦ
++�\Ŵ��=A�b4�Ð;�e��'�FpɊ5��Eϊ���oR��I"oBI����~��h#_���=2�W_�v���{��t��gN<����Xڳ=�*��;r0g�n1�NP݄+����݂G'r��-Zw�ܽ��!#��޲U�7S�v���x����y��3���hۄ���dBFD$�{N��_��>�%���q;z��
[6�vŒ)�G
�{���+ԩ]C>i~��!V9˯�e%�J���a*u^ٔ�V���1��
��{�R�ǟ}�X)	)Q���[V�o���~���F���߉����#/}"B'����S�|��;��ņ��͙1e�̜�	�����
�Iz�+J0�J���c�ժת[�ov�ХG_��D�	+Voغk/�
z����N�y����}��O>��˯�Q	I��UB���|��{���ϝ<��C��u����v��y���&wϮ
�Z�^�{ᄜ
+��IJ��5�,F�+�j޺
�_$���nٹ��#����Ǟ�{��$�@��o��J�����O?���m�+?��GO�����w�z��D+������
��n\�b�SǏ
ʙ��
D'���q
X	�D�Jt?�qת�@?:A7�N�6k���۳��*���O���)�/�"'ɄpD~������uB>��Wϼp�iZ,�~�0o'\�T^Xԯ�|��QC�	OZ�bX	�6�RϭV�'�Ի��U-Z��ܣ�@jgP#�q���r�]�?��SϾ��i�D
��|O=�����/���?���l�+��=<�%�\���;or+��F�̟5m˜a�9y�ܟ��c���#r ��V:ϼH>f޸�5��v�ګݤ:]�&��{P�m�<��˯���~���_}���DB8"��'�gNȏ�K��@Zz��W^|�Z,�y�ȍ{wn^�j���fL;B��дqCu�	��fi��`%���D�r�M�6
���{������"������y�Q�T�{�]!��E�D���a�����6�?S�~���?��B��ע��=�
+��³'
�;v��};D�.�=}�X�ňOT�o
��@\DX�2e�z
�}��1vҌ�.[�~��n���]������3���6�������D��;մQD�
N�n������|��	o�v�4-���6��ۺa��EsfN
7rȀ��;��7�_�+�\G[�|e%���7�7��o��7hؘ	�f���;�}�q�T�{���>��Kje�~����_������E�?�L���7�~��gS+(K~�lX͝�8~v�S[�	���r�J��J 
+���D��?Q{ܽy�{�E��lغ{��[o�����_|E�m~��_+�6��?sB""��7J�O��
%D7n�Xz������wo�M��E���Mxt�	������]��" ³��Jtb8�r%�iދS��	��H6��?���S�E�����@ju��]F����l�+����Q�~��7�|����O���9����~����[7��`����pڟ�\�������Jh+U�(�ҕW7o�';

5nʬ��W�e����q�C�Q����O�	BJܶɄ�E%$""RN��?�5n [...]
+�X��TZ[��R�/�Ԣu{z�|�(��^�r]����
�󾇟x�mq�G�����m�k���=2"FB��ǟ)!Ը}"��_~���:.7��v�	��?i�BݦZ�r�AsX	�&Vҗr�����#�Y�E��lܺ����t%�Aޝ��J$%J
E������O��?)x;?t�C��G�Aq���w]�ݾ�;�)F
����?�

�
+�x��t��
�����{-��0{����oޱ鍊�ɉ'�y�%��D��')�����	��'�o��?��J���R���;o���M7�3}�&�
A=�t�_��Oh+]+�
ư�E���!Z���7��.�퉃���y�C�?�����K�ᄃ�_����ۿ����������b����Ւh)s�r�|䁻o��&��̟=Uu��%�p�wm�J ��t��R
�=�D��
3a�u
��ڰy�
�n�ہN����>}�o��~����LG�_������q��7Z,���kgN?��c�{�����ڲq��s� y�*=�T_�.
X	�>���xV�c+�o٤���Ӧ��u���񈼬��K����rw��@J���V������3C�{�
+~�ŧ�̽�³|a�:�-�W��|�d��mZX������.U:����+��-�{܇n��J�N�����}�)-�h3�jۤ��ѝ�H����)!?~��עq�-�SO?��}w
=t`�֍k�/�3cݦ*XV�[۳RX	�2��.���'O�\~\In���w�ͷ���#O>�™WE#�K����)'�Pd�����Db���x���~��m��r�u�w�z�n|]���'�����]��ᓰH3A+����J
�J
�	+�;q����遾����݄_�{
>�[
�oR�	������K�q�=�x���;o���s'�x��;�
>�g�4�oS�߫[���wYh+���@Nc[��JW���!�	Sg�S��j{��˯�F�3�T��2rZJ
������?m�+�M�S���li����?�̽���t�����wm����OV�`o�\
�
++��[�R�J�.U:1��VZ�i��G���J'���7���Ͻ�M��T�F��ȈpB��_�q������O?|��W��&��w
?rp����+͝9��`+5m�Y�{�
V9J�J��V��^�R.Yi�R�1�Э����cO��E����o���w2rZJZI��F�N�N�N�����2�ɇ|a�nw�_w
+-_8GX�:���i+]+����徕�����V��h���z��f�^z��>��o~�������6i�pDt�7�N�-o'Ѕ%��~��7߸WXi��y�1Z��5��.��@��=���Ԧ[i4�ʿ��6l�uo�?��_yC4��^9-%���e#c'R'C�ZAy�ç�9a%����l�Ļ�ǎ0vͥ���J N��T޷��fa�q��Jk�������'�y���|޷�� ������^�&�����T�fl'Ѕ��v��oVڱy
Yi�xi%>rHY�<�r���*V���J�-�_���6��Jt��{|Y���AFNKI+���؉��ЩV��s'H� [...]

:z��J���m������6i�pDt�7��k��&�ư(i�b�����1Y��0��@�I�JSg/X���-�n�J$)[I="�n+
=t�.u�+�2MA��j��]�K��ԡ\�(��J��W�|��O���X��
���>�X	d��ҝ�.�w�l�b��7_x���\�(��J��s�2rZJZI�����H�
����o�P�`%���Jt�	�m�����m�H���M5n�m��8��� p+;� N`% bV�	�@��J 8�� �
X	 '� �+�V v`% ��J ���X	�؁� p+;� N`% bV�	�@��J 8�� �
X	 '� �+�V v`% ��J ���X	�؁� p+;� N`% bV�	�@��J 8�� �
X	 '� �+�V v`% ��J ���X	�؁� p+;� N`% bV�	�@��J 8�� �
X	 '� �+�V v`% ��J  [...]
+R�,-;��!��&g��
+?E"h���Ϊ���p�Z)���$%�JE�b��[��(;��g��J��ܤD[)���)+(�T,\眨����
+z(�q�@�RB�T�Pb��y�����^E.{�uW�㬰Rq�d�
�MJ����L��

YvP�)������{��|+r(��J��R�֯S"Քeh�2G�sXj�N.�LMn%�J�e�_�G�(%�JIÕ(KᔃvG,�I�Ub7��{�+_����X��l�PXJ����+��1�d�$c
ʴS�9,�B�^�x'�l�4E&<~�F/m�r�`���r&�ĸsvvF� sX�
+����	J��R�L���=|ggl@��u+?��r���h�I�
+Y�OXb#EOa):aݳ�'(�VJ0��#�`(��Im�}�@Β�V�˥p�B�r��0���CvV$,���aI
���	g�Df*�w_���|0
9�I�/[��Q42���b.Fa���V�Ϲ��v�+-+K�#�[ eI#V��
��%Rx
+KV�Duw7�Nn�M�+�F38���TR�<61��v�y+�@�#W�$C��̗��@�� ]� "kv�쌕L1?V�ڡ�
+�j������xI��k8#��
���/z��u�&��zZ-,i}7E%K���V�B�.-Y�2�ef+������Dfʥ�do�e��9,4K[� ��G���V՛�y+9�3b0-
�2qd�
_��"ͧE"-o��dq5r�Je.2��?��|��2�13�)��^-c'-���Xb�x),D/p����2G!*sz�����[)z<
FJ%2��s_x��]1|����b�Hsq�d��~�
��e�\�[I/�"���ϖ�����q3b�,�L���笸p|H]]�Qe��L�B_b���u7+CS�J��V:'�b��1|fl�W���x>Х�uY�'�b{?E$�jD��	œ�R�r���;ϼ�
���./[F��y�� �ӏ��2+c~�J��
��
Ѩ9�lD��eQ���[���&&U�����I�x02;#c���؄G/��.���E#�ٸ�OQI�
�_��T#��T�J%�J�%�C
�W ]^��P]�s��x�2#l^�̐�L�e��1����-�u��D��kvK�$�܊�{�r�Jr����$�H��""�
�`j.�
>s�Rn��#
1m�MaJ�2/%,G�Q�j䌕(s���b�\���@�l!�ly��Q*�S^a�d�M�L�Le,`&;`i�W�I� [...]
+L��
�l�=^ʕj䈕d椕�����/5Y�xy����#UAS��{я�Ι����bʚdBRRR���xU��о7�Y����P�ͺ_��	
MA�)w�$7�^54�VW&�KCC������=�W���`�=��$��
Sq��N�q��X��J1��mNXIg��D�V�G��}~PI�H��d�t�8H���a�*yi3�d��4��0=.��/�Ob*@I���_�s�7�E��E���$��~�Y�KR�܊IL9j%u�UZI�"JI��Ȕ��L�pd�2㎍7z�ؤ��s:)4GO��'#ɬ�PL}3�A�vS�^�+���TA���,��J���eK˛�:�&L43#dz��s�)��]���?�Q[�.��r��՜�^Y�o��Q�Ȧ IWPЇ�s�J����BX�l�"Sь������
Ħ|��D�����J
+��	��
��25�sqVx)�
E�FJ���F�bd��:���B'�,qU��d���O�K���%��bEY��Ԉ@~E�M�L��C�3�?�0?`��B(�ꪵ�L��*��m���e7�nޘ��NL�OnY��e�V��K5agF��9��BC�)s�*ر�4��
��H��v�9&�{.��� ��ӱ9Gx��Y-
+	c^�j8�9y5�l�[�o�J�����9Z��+}��?_I*_2^��8\2Z2V<�bj����R%M�I�Le�0S0`f���KN'�7z"�j_H�
fֹF��y�uWS�7����	��[��	��R
�\��q{V��%�6Us at M%FrG&b(�c
>{��+�M15t�R��
8�"8�^���٘�CSq��p9�FPL�$��V�ֳR�:l%��$�D��P�T�m$�.
+g���BE�a
�n ���/e�T�(dj��z�L1!˼�8�a%�	/D��*W��0���B���
a�=Xv]���=��楊�)�"厕��V�
����J��LU/2j(ݑ��/�
�j:6�±I��28)5[�!�{Q�M��d|^�{Ɉ�����j�5e�)�IW1��J8s�JW��(tt��Ԓ����.�0�$#^:\*Z
,=9�'���t�Q�I7�S�Sx)ar
J
+u�FSmk_N`��F�Fb��+{���j���^�
b*ڂ)ǬTճ�<�X��<cD�Ƃ������4�2Ad��	
_Dl
+���L
+�l�y���
+�=)��84�J�C�"��0:����
_
[Q���9%Z?qvZi����<+�����?F�[xJK���Q��zJ�|q�x��B�pQ�8Wrv��h�i,����$gKN�L�L�LeLEL%�
��WR/���� ���J*�x!j���v�_h��̕
�K^ݍ����&��b*�N^.Y��6e%���9�LR㩆�G��+2r(�Ci
�
5|r���E�^�
�y��R��
�m�
�+c
��`��#��C�
3EoJ�<D�#\
�G�b�X���j\�F��Fd1��J
<+uh�V��
��R��/�T~��{/k͗F�d�8]��x��Xə�	�4��fL��LʩN
2Θ6�HX��.���xe��"��L�P�a$OHA�:ۅ�Ž*��Fٯ𦷨���m&�*�u�I�S
+��+]�v���5)�#�2�T���ّ��
�j&�3�������TI��E�4�Kџm�uR�	p�P�bNˆ���~�R�
:�)T�Pň�FPLV5����VZ�[�
[�Q���kV�ZY�����s|���$�//1U�tq���(Y
*1^-hF\c¯4���ْ�&c�R&B���J�%�����6/�c�Z&E\��\��RU6�0Yg��~���1
+o�ݮ{DO�)���vP�1�	+uP�	�J�{ǟ�
�
�&�RR��3"���L����O�_�@l�c�JCW8/9�$g�Э;�S�R�:�zX8�bc���̤���Me�D��FL���uVڿk��J�z���5mԠ^^M��W^�@�z��(_4YR��T)�$�%gIJ�J̆-Z�hɴ2���/��RM�"g�2��O�4?�ΝF���d���F^vh��$����=�W�쮚WH��
,��:�B�P�������]�q������MAx?�*�L9`��]�n[I
�_Vݤj��k4�Z�R5q��h�ّile��P�b�Š�7|z��y����n�B;�z��s-'�N~�$	
E�
�(@�����9 �����~��x�wN��qY�e셰K����Vڪ�4|Y�m�ft�P�Z��W�����3Q|%q�h
��ES%	I���%�HU��mm�v�����.)j�33�&�1� �s�%���S`��E^J줨k�&ꪽ9�
+ck��l�+s�H��s�U٭�7��	��[��]�s;�`^�5+�_��
4�����m-����J���FSG�JK���l�
e 2�ش�b�r�Fϋ���U�1t��+�=l)�f��S��Y�Qd�`�h�BrqTs�p"N�rȬ��qI��q�u;�5��jd���<zx�ne��c�J];�my�U�֯S�fuz�ֻ�}�H��|w��$��T�8]4Qr�Z�9�B%��
:tt
+A��/�lII�q�h�$5Q�dĨs��$�vٲ���Z��
�.'��=Dw�r�d�a��:����v�t1P/���e��ꈞ O����Gu��}�IJ^�~+��xV�QM^x��lY���?�Cc.����J��Y�#�Ќ
�%�HF�]02���3c�΋
�I�ɋMC��
�)�(/%��ܔ����h;O
��*�c�
�T���$���#��ƻZ���Q
{��pը�F�P�p5�I:۬tL[��d����v��hP�6-��T��߱,`E�0=%�ْ�EK$)$.�'�S�Sc׮]��
��9aR�D�8f�2
+�IN�
嶄!&o'��K�^r_��V�N���P)���9���7����̅f�:s}{D����g�`O��l��
|z+Ϙ��7��p�~�[I�m�J��J�]��軈�P���^,-�x at i��)�o��ȴ&
�C�L(6��2c��Jo�B
���w�
�%���M m�K�'���
F<�,xƒ����88ĺZ2�aTCK)x3�_�ʅ��q`X��}����aՃ��Vz�ɇ��V�#+
�߫[�v������h�T�re�~+�7�zJb#q�8^JH4OR�x��L��ѳg�^�z�V���)^�%���%E�r&b&R�!�c35Vf�b�{�rj��2��2�\
+;ɾ��}���Z��
�L�C�9��0����=�нd��0}�W���e�"�7�{�'0'�:zɤ/T�/��Ɠ����;Vj��
+2:�D?:!���
^&�.�T�
ͦVd�X
+
YC��J=����	
�����M

]���
po����"�Zn��,uY�Õj�c��d?M��|��Xs�Z�,�����FD1G�x��7�!-�c#[��:Y�m��l��#��ݭS��͛5�-��Z��WE�%��C��L#yB"Q�D�(U<7���_0 �x�_�~<_R�d�HN2dJM���b���^�l���R�I�&��=�
+�j=��P�P�u�
+ݏ
M�
�\k!_3��Nuӛ��:t����FWP1r;�p�ϳ�J�}+��@t�*�T���N�|v�b5��VJ52b,������R�
<��u�b�ڌM(7r�A/�BWfS�R2)�O�.��u��:WIy�R-�`2����֝��[&��k)����j�Q�`�S�j(QgzxbRê$
�ZR?w�X��J���Ǝ2�w���۴��)m�թ]��}�LT��
wyV��x��8\�-J�j O��
<x��E�%�/E�8h"g=�M��T�\b�hī����7K��xi�l&�]����Fĵ�o��9Lj�g0��T�U����^��S4���M6������\5�Q��{)�r�k�I�J-�Jt�Ce�IU?W\�
��Do��
*)`$�����m���>�������r�n
+����U��d��QёC�XJ��M�n��Y�x��>�L
�T'�|%�k�I��)����e�
`k)�я,��F����!S�W�;��?�����1^(���M������J���
�̘4n�}��Mx�\ue����摖���d��|������KfKD���!<7>B0R2J��'�:|8ϗ"k"h"g4K�9R�IFL'L,�rA/��M���N����&��TRpSU��i��|-��(����!F��[eL�l
+xv�
+�)���U��Gu������J"!�J
�.�Ft�P
u��Ԓ�u��./g��7�z8�&NE���
��z(�`*tl�����G-�t�5x���Iwl�ϸ���k(j����y��'d�s�
�����w�c
u�RM������Y3�CK�~���z����P5�R���j�'�T7w0.����P���K�,���+�ٶq��EsfL
7�
�ұm��W7m|E��S���o+5�$�%㥄�|DѢ)�"5z�1cƎ
;����)^_��RdMM��4@�Ɉ�L�/&�������X���I�[��$��m$o��,�<l��в�T�	����/Uy��*���TS0@�w�'�����P۝p?(\�,�R�n
ճy���>���xۗ�Gq.���e�l1�}=�����b �(j(�����
�k�bÃh��v��WtBV�R:_J�[(i'�w�A�	Y�,2�4�h�wG,�S,j�;�z&.[�Ғ�>HK������u
^�`1���Y�ƨz�i)���;�Jw
?"��IXi���|hxϮ�ڵnьK�����;�k��SJ�|�d�I�K�H$K�BE�I�&O�<�F�2Y|����5
+�����G���Ds��`
+y���r
��I�{��W�m��rî�1�
��<6X��4
��,�.��q<������g7�Lƒ�q�I�x);���6�R��|v�VM:�����Q��.�-��ʫ^O��h⸇�:"���M
;=|����ᣞnX06ݻ��
4t

;�[;
	v��s{��Ӱ^�~γ�~��*Ƀ�QG+)�Q�����UN�>�L
�R�/-%�RD5j�j4(\5�����#=��Z���M-E�hf��>���}Ӛ��Μ2~�0j;�o��Z,ɏn��5=u�m%���$��Q�t�xy$�5��%rE��6m��3f�$fy����O����FA㘱�t�8b����yb��QM�*^�n)�6^�>�QN:/�$׵�j�2��3j�a��^����d�u�gK�c���˲O�e��]�رzv
Mn]���
|�� ��$u/
+�eV��6a%���R�g'��\��~̾\9��R�$T*I�+Њ�F�L��j(ed�P��béѱ���B�t����ڊ���
N�K)�0��?
�ݻ����ICg����!�-p0����>���ج��U
��ױ��O�*D5�yS�C�y�th�

-e���PV:��"s�nߴv��y�,D+؛.,�b�����U�ܸ�����ċ$1YR�d���XG��*��̙+��^�3��LJM�
3r��&e&�d�bj~�l��OY���A���G"b��&-���Ta�I�yd��6֡��u�s�h��3Z�y�,�|���,<���΂"=QS0�*|hr�����'�d\��L���
�a�0
��=h%:��A�<y��z�X��zy	��wO���x�$��p�&N��ۈ�r�?�22�=tl�x�1��=o𼆮��l��v��{��RR��q�����<W�VR��%��:a��<!K
b�ȻR��d.<-'�b��
c�(�)�R2��P5���
+R
����zP=-�.�pt��m�g�J7
+�]�d��nj<�O���ڵiټY�&�M�+o�$��Ԛ&������O�*\�#-r��Ԃ
.\�h1�Ā�{ѢE�b��Rm����ʘ���9a<;R�xn�|q�N#a{)x�ӼG4
^J�I����Jj�tն�T��:ϝ7�
��
-���Xf�/��s��R��F�
��l
+�>-��7�$�Y1��Ye%�۔�fL�g'�wj��x�O��T�����zH�=A
��C�+��l�F"#ƒd
�%j8����7��
9|����3���k&w�+La/��n[),%����=��w�nf�EƇ�ɣ���e
L&��oH�8���D\l�M 	�D�І��ej<��@�hi
�#�d\64%}��n-e�J"s_�����oܷ#�J�Kǎ
2�o�n�;�m��u�_S��oW^)/�ˀi%Q������*=!�yRD��%REs���+V�XI\�A�%^]�|9͗"l"i<MΑn!㌉���Q%���D�hn�
&����R�=�iZ.%q���B�z�u�Ao�v��|�2������+���*f���oU�@ٹ+�{�[`r��W5�$�DQ�/1E�ו���`g��n����N�n���y������=�� �L�
4���u76
����\a%ƌ�r
?R�
>)'#6c���[
VCז���
���_�Iy<$%s�O���Y
���V�Yd�d���ȼӕ�|����d�}�SzI��rOk����x�$�f5Բ��]����萬
�j��M)O{���E�!�2���
V#�V��a�W(s��vn�_�t��I�F
��_��]:�oCZ��B�{��J��Qϧ�D
7|"^�.�El#�"iz\�z͚�k׮����)^\�f�j�,E�DЖ�YRt�"e2c4AN/�GJ��A,&��:s�'�0�璼d���˥��RTP79D;)��+�IVW�+��s����ً뼆�L5����,�jY��IO����694���� -��jv�i���sP!�K	�K�~��"+ݭ��b�\�KuȀ>=艾fM_!�0�2�U5��W��uǛ�<�JI��@�^�����K5�vd��������
=�Wp[a7tj�A-��F*;��Xu����
/
�,l>�(�7VRG+���1OX����Xy��EPK��Aqd>j
+0
�o	7�TSV�
+���3�V�/� ��@#=JI˹Pn��;��b)�V�ٴ�S�=x���t��-�W-[(ZA�ݡ�X�؎�$�n�����x�hᵒ�}�x��R��tDѢ`�Lmذq�M����7ۈW��6n�ْ�F9[�B�I�LdLFl�J؈�RL��s�\0����R5s�㑺��R�IQ�we��C����
��x�dt��
�UYj�e$�
+-�E�5�*
o���d�n�׾?��
+���SD]?/����J��VZ,�4��
+2~��
�P�%����]

R�u'"ӡ#m,�*��Dבtg&�%�(4�r0%:74|i�֭���{:
V��Ѝ
7t�:�S�&�+��x�K�x��7���0�މ�mdJA_�߾#��gd��JƁd�{���	$��P�%5W�3�--����#��n�V��Fm���q�=�U��Y
�6�	 �{T�7/�VQZ�;���v{�A+�IY��wE�N	+�CVڵe�j�5|ʄ1#�
�۫{W�m#������Jh�5��#%���5uڌ�
/-$�'�
+�`�S��nݶm��
�N��۷o߶m�V�%��INي�1� y��K&%&�y�Ԟ~T���R�C��X.�cϵPJ�$�
���Z,�x��ä���ThY��ʻ����,<�]X��8�Oo�C=���<�MT���d�b�ҹ�������ާ���L���c�Ǵ���]��F

ط�|������	>�W[�Ɗ!��Q���Ƃh1��h8�L%#�%�1�4�[��ԉ�CgĆ�
o�do�R�
��x�:

��i�j鴖��Tڒ��ɥ�^4��7���J��J�8������J|��w.='ܝf�z+Y��r&V��@�.��B{��n+yK%G5r5T��j�I���j���Ϧ��Y�����d�k�\:o�˼������}�O=��C��q+����k�&<��4�ZZ,u!-�SК�+q�05cr�ǫ$�$�/ڂ #����%}$tDɢ���={��ݻ�����S��g͗4S��6s��)2��s
'L̎$&��]ˍ_a���Kꠤ*����-�	�E��&X(��2J']n:)���0�=(%ɫuFW=����9l�Ӳ��w��
+����9�!�[U�+�N1ñ���M�)0�ɦ@��b��AF�];�K��`
˥�ZI%�ߑ}[���9E=�ב��C�ԦeMy��z
��
1�r�#wq4�bի�$�S6q
�Ȭ֑cJ#1^n85{���
�I�<x���_�ɓ
&^ixWf];ॣ�K�;��yהxm-
�jt0�q�GY����h������J|��:���>Â�qv��K��G�_W��d�һ��T�^�U���ԥc�,��1XWC��O>�A�|;
���Ȓ������u6#{����/�J����ӏ?t�
G
ؽmӚ�K�Ϟ>y������C���	��S��7�ɭq0ڸ�Dӥ����FZ���JN���ݔ+�

8x��o�Iq��!��ċ҄Ia�K��6
2�11A��h[B,���hKb-�z�����R#y$�
W�Sdž��|�t�:nD�
^��[����[@[u%[���u:��q��!H�`����nw����ww

�W�N�I�}��U�l�}�=�by��c�o���{Mj��Y2kV��AC�u��Zǰ�
�#�� ��Ev�LvV&�6=�Ꮷ��'�����������~pk(� 
L1�'�D�R\��?*�%T��Pi$�T[5�_�ZŲ%!`�'�C�H�D�^�sCq��b [T�8j,$5m���$�;��yLzKyJ�e�9��v�/�:i�!h�^=^(��㔀���N
0[/�
�#˥?G����°*
�j4�h^m�5p��DrdZ�,��`U2#��
+$��X��Sp$No`)^ ����S*k�x#����y��)~)����5jhk�ZXe+�Q�6g��T##`���4A����=�ˎJ_}B%:�7i�JAwh�^�J�� �Sq
�ǣr��1�G�T�Ɲ�����_ݺ����wi�Rp�Rn���3gΜ���އ?Q�ƌ*\R��0I^��
>��? 2w�L
L
�S�TZp��ByWF���l��N݅���B)�y�lvkL��)���H��*fZ��d՝u
��a�`�)S�YC+�Ρo�����٧��'M� �pp�L�
�o�� ���$�G<y �K�j��;h^nTz
=n�JSƁ�څ6��a��H�|�Q	������\XZw�⤱��Ԧ-����~a���=�u�9���m��M��cpɯ��I#����BBǎ�t��fp)����K��Y���q��
ù���OmX��#9��nH��V�YH�Db
K����K�J��т�*�������#��*-���M�^!�/�yD ma	Y�.
���2����o��(Tz�䑃�v�ٿ*
ҿw�N�Z5kT�V��˕.%+� �Mc,˖5e
��$.��@׮� *��]�G
+��Y!Ul�7o���
�[(�����
��R9�4'�cp�~}{�Bɤ��r0jI�C�W�b� .e�g���w~��P����1����=�5*uhc.���Zb�P�'k;τ�����а��-R�����dw2�l�(+@�:��	Rp��i7�QU�ԸSu�n�x��%���	h���’A������R���׭\<�B�!�h&4k�d�!�7wN�3g����9�Cq(L�;�hU��$u꬞S�8�]�p]F�e�)��X��|>�z�&y<U�z	
:
�u�č<��\�|"R��)���ߩ_�-���} =�U��MՈRE���8�J�V�/B�Ldɰ��u��
v�K�5,݉�W6_
�
��R���e��!:[C#4���f��EZ�F#�6U��b����
+TP�Œ��KG��
������J ̄P�gN
=�o�V�
5
t���[7o���j�������T�ާp�;�!I�׀��H*T
+ �óc)�B\\�x��-�>���73��)O#t�9C�
>��B&�%� :*kG�Ըa}�%j��,���i����V�}t^��y�7Om$�I����Fu
�
+ER'7�
"�?փ����bh1�2|˽��H
o̾ ���
*����	n�r?�����*QēlL|0����\2VdT���G�%
+�Ə�܋6�hϼD���I����e̔)
�}U���$/�$�
��I��e�-F
+����.��N�^��fE�
=^���7��53	�~��|\�
�[�R���$��a�V��Ϡ�0�5�LK��
�,�[9�������RC��P�T}*�\B� �t�m�@|��D/*�)\*q7�6":�5
fk��Ѵ��5��TB� �)Gσi��j��jG�%t4y���
74/*}gP��W�p�k� �
طg�m[6mX�v���%T�|L�O&0#��!����%��}�J$£��F��U�+V�\�rU�S�rŊ�����hN�g��q�T�Qy�*���#`RI{�&4a�θT��
endstream
endobj
322 0 obj
<</Length 65536>>stream
+[�fzP�x�t�v��J�yw�
�1I�yB��
��8��Y��P
�;/�y5�5����
/f_
+|z���7�&������Dt)�8�΋
.���`B�t� ��ڍ>�3/���IP��Yˌ��.&U���&�1
;����?]���e�k�QoxJ���s�&�|�멪I
o� J�zZ`BBW7�g\�&
pJ�|�
�\�*Jך�

��
�0��Q�w Z<FZ���V
+ɑT�D_�9�	[��C�__Ah�8�$��n�(�.6*9�;����q�
��"��@"�h�Ŧ�58��IoVb��G���(�䕎�����E��>bT���֮X�`���c�J�խc;Kuk�;�+[��>f�79%��2�!�w_@���cƑ{�P�I��Rx�J�Ԛ5k׮[�n=}����t�ڵ���ה��/�N�|�\l�Xx�#*�n*6¿(�{9��L��7��Z�R�(J�3K�;����=4�:�iZ�@�q�ư���
C�����7F|bz1��}%��R���n:��3�
}T�:u��d�f~΍T�����
+��}��^Tڲ~�r��׆�����E�Y+�'"%�
<��(7
$��
5z,�̴��,3O�����[����F�o�u�&�W �P�߸	�)�\\�m;��Y�	�K��������{0S�0\��c��O\ao�0����Y̢��V
+��&�V%��d��v#���Q �#<re���Z]$T���!�;����XC�:J���k
�͖�5�
m���N��䋥i���̙I�D��B�PIa��yiP)�s�J�}�P������.]@t�!���蜤��F花
*���,fEgr�$F��¥��&	"����[�#�T7nڴy��-�m������͛6Q�T�?Sरi��1�L�a�ؿ�c.�B^�=�Ku�r�x�K)J����8����y����IɒU"M��aȧ����7�����">my�}�}=�	�
IA '�����������-�v�
�\�BPF)2��A��=T����W,UB��C��N{浪UB
O��yힹl�[�J���fP�^�6 I�+�?�\f���-)(�]f���nc�o��y=�+��n���qJ!��K�ϘA�$��.���@�P
�}8��80Z�I�
�M�;܅�� �$�d�G�WŠ�Q��	g]���Xh)��jn[�IF�����EF%�
+ׅ#Y���9r=��@ᢰ!��;[C
M�d�
=
�6�hc� �Bi���Ye�[�tD�1���J|��4�c�_�l!����۳k���[4��ju����"���j�L�� IʿT������ $��$<
N�m���;v��)�.|���?ݱ};EKJ�gN�M�c�b3g��40
P��'�
�Q���%�]o8
].�]��g��&Z(�村^��T ��AסU"��1l��a�
;og;��w�>cz�};�}
��kw�n~p2�
5b8���:8�Ț5�F��K��Fx;3$�kP�X�T�B��"P�3�3*��݉��&�
��̱:Q���fnGN9, �1B/e0IZwR&�*��
+ht�kz.��]f�}�
�a����}>I-�m��]p4���N;��/�u�uJh5�R
LW_���L��2dD΃��q��=����lj�
��d=��׏T���YWh+i��gP��
���m+
����o�@|�Q��w�}�2e�&�T\����L��3l��S�F�~Vl��y�Rf� �R�3彺̺t�\ynh��P�
X:|@��V��r�გ{w�ܡm��MQS'a�c�H]vP��2Ʌ$�_s�FB�d at R΅0	0�O�޽gϞ�����g��B��@������l��E
��M�
+`=R�F��ip��%H�¡��=����Ki��%R(i��
�� ��$'~����
$���ZI�H
ð�!��y7���Oߓ��&�����*�m�v_�s�enp��`�
�%K+O����<.�L�"C:c�K�Jv��Ҝi�ȞyS�3�nvdd�<7˙ю��I�I��H�
��I�Q$I�\f�u���2;���ٿ߾]�m��8��n��
/2�C'��{�$���z{h2��%���i������	PR��
+�UkԪk�k��1�$j=��"I��(�@#J���
u_E��( K�j5(7[ޟ��ݐ���ᩒ.
��
+��jk4M�Qm�D����

+HW�ڑƟ8�̧�bK����F%H5|���Ϟ6q�!T��)�M��ԓ��o5�@�}^�h��Q�$�`
+�T�T�E�R�� �r.�I�Yp+�
����_����5�3'r�
��Ŗ,V
6wR?&�7���]\���6�%�{$��Rja��
|(�(�x�$X��
�����HFr���j]"`�C�
c�'��dߧ">cxkv�}���?'p��TU2�����n���ƥ��w,4��G��ڗ�>bTz��QٝX8g:���5�Q=�� �U���5�BvDX��~R�e�2��8I3g�s�eV�.�#�e>�����i�YGy�'̷	� L����ҁxF��N&����)�L���>��]�
+��*�nHi��{� �@�	�����d��䨒
1�(҉��fp~^�,��zxR,Q �RLO�xJ�����TB�kdV�ȓ�A�B�j��k���b��iI���!��}Ύ��Ճ֯
�.G�f,�e�
�-�.	*E���J��L��B%
'���6�]�d���Ǐ���
]:�o��*>�
+=�M�]NJ�9d���1��$���e+V�`��K i��r-8������h�����r5�g '�&�HA&�0�iSTlT��
+&{tsp�F�ʨ�
�l�ݣ�x�K���߽s
���:;P"m4��iL��]���C�
+a�U/���1L��
+a�E�!�3L{����'$�'��ٵ���9�nK(�͙5�|�l�j:y�����K�����ѨT�⣒ޝ��>�gN�'��D8�;������_��$¤�
T�Q/�2Ʌ�
�s�$��2��.c��u�|
+����Q^�
O�ynBǎӳ;7��d�J%���w�wy�Y�\���k=V83�п{؂�
+��5�o�c�n
Cx́`ƌ%=�(u%�$#u,Z�A�4���<��O�*�b)�»����L��n���;�F�Ju�
+��b���蔬1N����!Y��h4#�Z���@����#���u�^6Tb��7P�
�5Z�J��o^�j�h�A�ԫ;`I�
�]bc�aC��ӂ
:w��Ie9���U�׮S���k�v.�


�B�'N���(^���g 'q2�L*s_�~9�i�L�/��
�O&�i���.�TU�?������(�C�?��B��B�i�et�F
+?f1�N=���ك�$��Ik��62��k;3v>��i�?�[���ws�͛Lp�>�*��O#�&.�L#O(Q.����

n\
$_hT��!�M *}���][7�=��ɐ�o٤Aݚ�X*K�$[]���Y+�l9
�Z0&���Y�i,0$�Hr�8r�}�-�.s�~�m(͐�S�t��F���xT�RB7�I�T�$/ס}�ip;�/=dZ
��,�ӵf	�-��?���(�+Y�<@�AcU�A��|�Q� i�G��oM�4ɕ}���^j׺XZ5K%����L��f�V
����ۙ7�r��5��jk ���5Hj*EkLq$���^���bԞ�nX�TV���4g
44=��ˎJ�tL�۱e����Ϟ6iܨa�������M�4�kͬ
+�4e�,I��Ɛ�ڴY��NF$ �$\
~E��i�=���OS���)?SnF1R|l�N�b*sW%���\1����F^�~�5:N�K����%
+w��%��J��#
�
�B�_��5���aRE�$I��$w���:.���`D�Iס
�`�
F0�i24
�,�y���ޘ��7�n&�v�����t�[�xB�V<\�™�����[0x
��vyP�n�ɞ��!�Aw��I���'�mW
�)��c�f^J�V�0&QYЃ��E�LBG��"�����
�xJ����m��N��!�;�͎�\3��,q;
H)�r
𲼐�?�d��%&%�?�JR
`�R�t�J
J�4��E��Wy�xWr�Ȃ�d��g�|ˏ�~��#�R/�b
+����)m
�Q,�Zx\
\uQQ���F�pD7C�b%�(kԪ۠IsXm�Ak�S�%l
gߝhH���s�fX�P�X�t|�'0�Z�}�
�~eT���tL�ۻs�Ƶ+�,�3c�*��L�ӓ�1|�T���2Me7��2��!^�p�e�J��^�]*�#<R�������Ͽ���G��F~/c'S>��k&�L*����	���B�4n��^��&2�+'�/������R���~���;�P��݃ZxEth�NR��Pr�NN�$��fZ�RP�l
�O����v&C�����3��.fg���v��S��I�Q�,f`�n��'�4��D���u	S�ng��`��c�G$*5cTs�PI�m��ѷ��5�:�o��I�~�~_Ă/A�m����|��`R���U�=��$�I(��F�r��)�s�n�<%H�lFG��	�:/�#lj��5
�bNϛ�R�mΧ+���{��/�б*U�bU��
+�(
z��y��s�E�JX�W��J��A�QE����6�
+���]Q 4kT�v
^&�
�
+�4���i�]s	PIȣ�˥�S
�W�\��5��5z��;t�ެI��֔lL
��ه�]-�6�[�ze]:�U
�=�����D��s�ͅ��îm���7KK��,�8�-���HaP��O�I��4$�ڍ`I��B�T�ׂ_qd|�+�G$�����
NF>�\L�GJ�U��O�F����&O
?f�J��IY7U�J�Dd<r-����*�����_h��
S�B�4��ჃI�8����w�I��$��Y5!Ҿp
�����bg6��5�kvmw�h���}T
�	0�'*�%р��%Op#�܈�'dAF�Q���D%��{C6�v��?Q?���'�H��"+V��m�J���*�l�K�Ƥ��%��Y�!i�.�b�̋�.㺍�<R��m���'t+uB���v��t��^Œ�̺��KL�(
�
��t��V�R�v}TJ�$�T�L�4D�
+��dK�E]i���:�#�
�\��\�By�0�
+�d��;�Y��ҟ/*i
�뮣�`�)���� D�n�A��}��u�
+k,k�ӛ�!��E �
j5�t,�(ctz�ѷy�l_jT򆹟	*����4Xڱy����bi��Qx�$��C��h����ʹ��>S&)۴Y IEK�^ʻ(�o��ȫT4|M}�G|���(X����8F���������[M���8m
+�ʙЍ�*Z���P.aw�t�D�БN�p;8����J�y��;��7����y���$��qs�j?�iԧ����
��I����R/�?���	��l�@��eNt�']�K--.i�
���˥҃�6�D��o�=sQ?�ܫ['Q?������
Ʃ`t�=L�#Y����xO�+��<p���[�\�}:����pJ���6����	�:��!��F�0�ip:�U+q�/���==N�p	���!�����R��w��תרYKJ�{�40��
,�h9��+V���#Ӫd+H�e��� �=U/
��w�LriukQ 櫌Y3gx��R����
<ln��:-Q�B���
+��d�`��j��;?1k���P�h��
H��ҌdԎ"iZ�bْ��b)wNK*�iNbh�ҢR�bj8�
^xFy
��V�X�>y�ؑH�H[����۽Y�N�
�ƛ2i�f��3$)�2�ŀ�|
�E~ő�|o�����4���d�ZdR
&������(�4���5Z:D��FwCe|f�d/`�%&,��yF���z�
%����4�@�+]�vY4&�iϭQ;{��Faa�5�a:�9v~�1�[o{�[��٭�_��	�����
�	�����UI��񸵝ƥ�ws?(���s�	otW�
0i� ����J�Gm��=�uXX��ڈ�	ݗ�@�A���;��ug
*�@ͫ��yM�2/3yOi�u����<'ns2fB��S
+��;��ב�T��JE�i�;�Q��ՔJ�8����T
�*[�jͺ
�(����H̤���)�ޱ�E���#Jq��+y� �g��< ��Ԇꃪ�U��%�������
\䧻��{�O�1kv.�J��T�f]��.�{'2\��$۬O�F�M��r,L��i
�҄q ��>��Z5�cy�!�b)k�59
|�����;
��Dw8}�Zx\,͝9m�v�@��a�������iAi�)������b@"�0�����O��;.�������idR
&���;y�ƍ1��a��M�B���p+%�(,��I��]T�$�;&9��U �h�kdh���ԡ{Lk�8����!,dgm����3��8�06�@LOI�>�10�s�i�4C<�𹻏KD7f�̰��-a҃z�kd�/�ܜq^tT�!b�|ǖ����7^�OT�ą`u�����t��Y9�]���$�Ӎ���
$
��+�-.���F?߫a���-�Эt:����S�ʆ�j�C��w�P��� ����u;]
`������X5i�&�s�^�"
�I�j�ZQW�,�J[c�+A���GV
+��U�K�	��>�@L�R·�f�,�4Z-�K
�����%�B;��J��T����
�����X
+LB��)�bY���<h�2I�&�R��m[�x��eK)�Λ��lY2>�m��8}Q���Q)�F�$<�;<GK{vl٠��E��̘�`	�:֗>l�YY�/���2I
LC�v/�J �9����������R�r3�d�&��b���ݍ���>�K*]<@�>�7nX׮{S��7��Jb��(�w'�4w838�e��P;�47�4 at z˓���j�5�d�Գ
�0�v��|����kw
+p�lN �g�#ۣd���n��>������F)�����~�Zw�z��	��'�>V���/��u/�Ѻ�'̻e�
�&�q��,�
&
&M�F����؅�
ޓ�S�
?��#v���.��9^�<��t�	$t�q�>CwL�R����Z�'�Gu�K ���E �T�:��	x\
�׺}�n=�
2B��)�g͡���u�z�
+���?�����
+����d�¥��1z ,!chմQ=.�
+�@,|.�`钠�����ڙ���J��5nk(�
:|4�F)���l��=�5vhkh��U+W��ל4~,�R�.T:֮Q�|��E�1f
�/.*��*Tj�'�`陓�T2�k�&U,-Y����N�%lO
�>^5&6Ck5�;.����q�B�r/�.�-r,
?��L�dOcp��$.f��CTҎ�IEF�K*i�=��~�D�dޠ��m�z�?��ċ�I��w,���R)��y��5�3�
t]4gԘ��ك�=r�˪�1LBX������?�v����	^��1U2i`ڶ՛S���f@��%�~��"�9E�>��ҵz	&�JY/:*���o���K,9D'�ϟ5m"��@*�
��@���H���f�KI�a\'Q���Tgq��Ր�累py˘.c��y>��P�F&t�81;��R�'��#��i¥�I:Ӵ��|$!S
�cճ� ����P6Yd�[���D~���k��^�v�
+x�\�M䭖
]�6��R�+���g���N��iu�%@%�V�
<`4[�8��nf��]a�
+�`���ts�ؑ�5 5��(�0;vesf�0����ɽ��t�	54�
��٘���
.*��Q	���פ����-׮Z��`i�:Z0|�P��l�b-��$'�CĄ�1$DR�;{|�<K�'�}�~�g�H�$?c/SN�|
��k�a�`ǎ����=�]\�
PE1/�>0Ey����,�O`��b��U�c�]z��$�w(U�^
K�����0I$��a�NwZ�"ҫѰ/L�ٚ����������	^���8���i�0�D�5..!��1Ӻ|���>�ƥk�f捂J�\lT:Ǩ����t :A���*�
���m��	�Xӹ6�l�Bd�>�O9�{w��Ɠ�Ǩ,�
�np���
���7��������:�8�t�!�.�Y�G��n��.��|�Q�>}k�V�3�;o���J�E��������$&P�9G���m�b����RW2�J �
a��Y�*�-"j�B�[����S�T�D��
�4XR?.�<S���T��ݡ�
+����?�b%˩_n����$u�ѧ?Yc�a��H�5D[C������6n\(7$�Ǝ�4�;`�74
9
c6&���G{qP)�r�sf�����`	-��G�B��y���KQHj2X�f	&޼6�Bz�d�>1�`
$�{�PɁ�%^E1�φK�3x9��1H����`�F���� �Ə1�ʥ.�JV��J�:V
�ǣ`�T�ҟB��v��p�]v��[�|�
H�6i�K�Ի
+��$��仭Q@�I7�ł}�`A;
���w�����	ޖ���A&*��0c2s
+�vOg���%��Q��� 1v7�-��)ۙ׉Y
T�@�n�� !�����޾i�ʥ
�Θ2a�������ma�s�AԆ���h
%
�J�I�I&�Se
R%����{��|
�݆�ۜq��lBG��c7�4.M�>
w��VC9����I.A��%���.���^�|+^�(б6j�ĩ3���ZC����
E��
��Wm%���e������W��ı�>�'��v�J�J=^�Zx�H� ݭ�
}�PɎ�hȆ
Y�F��M[��ԭW� �@	^��!�X�	��IM�܄$c颅*
+N
?z83sZk��Aat�
�k�S/*��*Tb}V
���w������غi
���_Ǔ��8Hr��]N�F'}*bR��xI���y���8���>+��hB�����ӧ�_
.-C�Jm<S.!�#תd��s����ǃ�
+�?�cg��9�
](,,ͻj50P�"��&
J�)�g�
�=
8�!�k�R��N�;vC�a�O���`p��mt3�J�Ҁi��K�tOc��*%�.7G�z�ނ1t��-*=vQP��JrʂH�O��
K��Q�D,Z����t�[A��l&�y�T���-�
I��e>���3��q�w���9$t'�
9�u�dv�r�q����ukWg�Ӣ��ǭW�o�z����4��P�j�z�T�ԥG�CF�%PZ�°2��}�T��x�JVK����o'E�U
KT��ݽs���p-��y
�`�>�[ѡ��J�hT��n��v��fϙ'?[�c�]z�
8t�؉Sf�Y���z
Y��k
N�,����o��_U.-[��s���ܫ+�cծ�.\ -<M���t��B��e���
���d��gO�P�Ҿ]۷l\G�0��O%�)H1���9��4"��!b>��K�/
+�ʽ(T�s�cQ(�*�g"%�;�\
ɟ&���G�(\Z��yP6T�'
*"6�[�
��ʴÒJ1�w���I)�
+P����$]ߢu;��7�`�� ���F��>�;6�}�ư;
�e����� � fLA��R�E.��:���:�Zd�z��
�Ka-�c�n2���b�ҿ=T��Sr�e���
fS
+*l��ۉ�	�OZ�<N�.,
3��ISA
2�$Y�z��ũ�@�~Mq�O��
���p��1:����BZ
x;�С�G
��N�BDV���Y�2GI.�������4�+U�R�ژ*�R	����Fm�z��ͺx|J��Z���V��X��uL����ھm���+X���Q��|����<����wޖ��З���^N(�X�1�0s
P8v��֘0EY��
�ؽiK"�x�v�i�K�^�XvnW �jG��Q:�G0�0�HA0�A������(��t�Q�K����ґCO�٩��.�0sI�b��i���7�D}�'Q뎓>v0�_p/�p.�-�Q���l�d7'#2�����؈V�ӧO�{Q��i��U'��o�#t-%�,&��R�&^lX�?R��
�
���wu�7"�z�{��I�B��gt
�dժDr�
a!;��
o��>2�`�ē��x���b�D
��+�Q�l����Y�Ըķ|�ne[.*ɹ��xu
}K��c��Oڵm�F}m۵K�Ŷn,h��Y4;Y�a^�=�e��O�˄�拰�D$t�R'/�_F
p��"�ў.-���.�*�.)`R߿���U
�
���Z��ܣ#�M�6k�K J�*G���;Q�pt�\q,Z��j�8�{�o�M�Z��!�����6��[x�,��
+]T���!;�u��s��֠±g_t3'OW� (m�� ��Fȼ�����WR�b�*�֯Y�l&��0�L	T�9�gΘ
��[@I4�[�
�
�H���G|���G�D9�dp{6�Ι;�/7/[�g��I�u�$
�����k$�.v.�,	��E}n�7'S>�.��(�$��"#
���m�(]�9�x��G>Ք屄�@��L|̇%�d�B[J�HI��w�B)O�J��A7��@�+�8Lr!_�
�$���H_8f��A"׼�{_���xv7���D���W�覉'
ވ	$�4~�nt�*�Zp��)���x�K�jf:�����ӂJ1/������&�U?��	��_�h>��1�����'
��ׁN|�eM\Q�
+�ʊU�Z0���8�I���.��T�y6�e"�2�m������N�^SO�ס�δ�t��I�U�A�r��0)L��˘�:
<jY�hۡk��A�8�:s����	�v���!���PWzYĕ�
+�nC�C��Qe�$M3^$��`�R�'��m�J�
��.�{�iD�?3*]'���[Av��R�|�G�Z���M�J#Ɛ5 ћ��5T&z��޵F�
b
�-��վ{w�ئr�K�Go�P��ܔ�lL����'ʳ4��C��S�J?
*Q2��p��ԁ}�1�d��b:�=�����J3���q�Sz�YN���8�#���8��/
.��,4id���5�(�#��A��B�K��@�)d|�qoO3ƅ����?E������}
J$0D�����O�;!9
ֻ,�I�A���e�nܝ9cQߋa_a߳�)|
J9I���u�n
�10ɜ�%��oHpi�$�g��H̆�	�>a�ʈ]������<�2�8��P�ô��^��d�;@V-<�ǩW`/����Y}]p���q1�R?j ���M�!	��iB.�v��
�
��7�{�Hy�7�D�����Yh�Q���xF%E�x�K
+�n��f}q�~V��h�b%m˪π!�TB�j�*��
H
Uʪ��BYV����g�,��S��ٵ��-��9v�����u��'��x�t�]��&$�K�J�$ɽ�̒
]�dيՕ5Z�Ю
+GU*͘3�rXcǮ��
>�p��r|�5^�

��|r��[7�_��#�9|��y��5*�/M�c���2�ȒJ /+*j�3X�b�=.��{����O2,��c$�Hꀬ�f-�A��,�q�S�֝-�>4��݋�K�;ӏ1>��������
`z�=��}ʽP/�w�(�k�K*U=�f�]:�rs
ر,,��'�#a)%Pr�o��w��#Ի���T��V������ҭ1�2H³�$�D$$'���˳�O�ex����6��u�U���Qi��i\�z�8��s��2]ʧ����?�2�p�
v
&M��S���
��jr
��\��O��M�;z��ѣ����u2�OF�ҙ���c�|��$�3�c>���<M.t�k���нe
���s��
+����,����JE��j(⸕�p��[�䲜���򕩁�ԥg�AèTzb��5��,*�0�CKZŕDK�G8�_�����A F �1e�7�=&�,�lh����ѿ�咡����3/����kֆ�1\�J�߭\����8v���)[�MZu�
$$����(�uӺU|�h��!t�E�z��T(�*G��f��Q���uaP酴��7X��	��%���b4�k�+�C��r��5��Le<4"8�s!I��v/�]ֳ~J᳞&^FN&.�<
���

	��D�X�CA�.
�����O���8�%�tuh���;Ks�
%�(ˡY���;�m
��N��e1I��=�+�61��=;[C���Q**���_�U�xB�<�K�=P�m�A=�tj߶es���
�
�������`n�լ} �J�E�7��>��O���5��M.�#p�0�_�>��ק]�
L�㵸�4di�o1I=���Iܸ#H�"�e~H�e<��n#�SoG�<*��~%��
\BN-Hd-�Qĩ\R�}�nS
`.��ɏAJ�*5�5�^��#ƪRi����o޶s°���||����%�J�J�<�&�����S?:K;��Q�j��� ��n֨N���Iӊ�
����B%��M���
zͮt�*5뢝٭w*
�(k�Q� �V����X�X��)i��K,q�bi����
X����V,[\W���kHx���@%��S�қ�����Ϝ>!1]��Iq�*�?�ȴQ�A�Z�����`�$
I�^ƻ�ky!�g�"#�#-2	0}*��y�
+���C�����4Y��-����k#�Ї�`���nX�ئ
aR
�Sb
��hs`�_(
���$�
/��ޝL�ʴ.8{�ʪð���)~v���r�� D<9vDpi��%�GӺx
����<��iw3��Ҭ�����5v
A
�� H�HZ�&�~� &�
�UB.��B����6	
L���x��_����i"kc��Z���#��nS�ҝ<U�x�ժ߄xCG��B��ڍ[w�ُ0��b"���+���{����W)�:~L!*D ֬ą���F��y�z�;#�CFh���
7*]u�P骫���M7�84����֪��8t�)3Q*��5�4���1^��a���:!epA�y�ݹ}�\q�8�Zx�[7#�G�b�;dˢIx��'L��d!nG�\�
�}�����j�S������J�m`I&
���4e��
g �3�<����v6�e�<`�b\�\�JX�3o��\k�!����Wqp�1���ٱ�ʡ�ҟ"A�
:�=�����c�J�BIXļ*B`���L�B�=�s�$'��1t�mw�i�'����ON��>���i]�\r�`��Z:9��·*=�!s���J�h�&�M.Z3ߴ�hrM�
�aC�

<h���
U��hD:�;��AL�5�
I�A�9��KF�͏��D&t\0Q�y�N)���ҹ5MdUI]m���K(�.�~�m� J�h��X�)`�
>f��Y�Tھ{߁��Jv��V�"(����'$L}�9��GX`
-�M�0j��>=:�k٤~ͪhZ��R���7���^�h����6m�ԙx��Q��ݾ����W��5>t��&�<v��*
�ctΌI�F�߫k�6�֭^�|�Dž(]�t�ެP�o�~H�������0YB�^��a�����V��%�ڭ$Pe�$��I��LHbD�����#�K�}����G&q0J�"p�'~R.-^H�9H�w�.�<Ć%"%G2
�/ N1
5o��Yӽ��-�:
�w��Z���4&�i
1H�*鳘Yu���9�
�87���)
L�3��Cޭjֹ>����OH[0��g�3���3y7S��
<OT���J?�Չ�&�*��-�����Ǝ
5r���Æ
>�����Q��&Q�7�{�I�~�Ğ2
P�����&�X �ʋLf�M
��������c�.A��t�
� J�-�
+^8)�� �uR�^�����p	�J{�<t��)J/�dZȈV�"�����j�P���#��޺a�
+,��<�ʃVM`c�DQC�SU��o T��"��ՂJ��t��D�S��^�:�ѡK��!#�u@�	�x
+�x
�xӱ�GF�%`
�&=�x]ՎL�>�o�6^���1ۀ>,5B�X�qH�e�
+�pZ*���u�Z�>_T�4���L
O��ãוJ��9:
+=Z|;v�;s�����8p��e��$��o9���E���c��
0!6�q��z���ʥ�\.��7
dA��

P�K�K�� ���M��仨��t��@;JM�P��1.6��.&�5{B������_��C�-��s��G<qpi�VbDJ?ȶ�D�]o��`�
p��s����[�u��/(*�?�~a��׾&׉�O=�w�6���`M��cnj=z���"�%��
�XoD���
�`���>�Y�7is���%�6?ߎ:L:��z� �y2��n
+����*����O�r	����λ J�.Ȧ�J�4jަc�����7�eT*�?x����	�X����f��JZ��Xg����C�T��_�����^8w��#'��ԺY���+�-Y�P��g�� ݣ�䨄�*�3fΞ3��
FW�ې��v�ԙ���q
�q��ɧU����V"�8{�M
Q\�
:5��{wl�H=m��a1Xj�����4R��d�$=
+*�t�D�"^Aj��A�v�������I����{�JE���f��A&�0�`���(룊���h������Ńg���vt����
X½�t����k�a)(�v�g͞��w���S(��
q�����n�I�Ac��H?������_d��N
+l�-� �P#�F�����"_pÔKN/p+��t��r�^���\���
��V�FI'�Ҥ
�J
5�K�Ʌ}>�.�/l5��0a��$U&i-}b���U
����w�'�	fq��L�բ�����q�@���'x�o����u�CdƐ��Л�I�%|� �85��R�V��x��/^�f'N?��K
�]��'�>�U���ޣ���)��mްz��y������V�;�,&�C���G��z�5��Ѩ�/��*�7D��� �c%e�i��/Y��
+ǧTI�,A�[�$b�ϽI!�2(H��GCs%��
>�(�MԪZ�t��
+���P�L��~�4*]sQɶ�X���%�܄��~H��'�ڃrCᔞ�S"o��I�����e�+����Ɍ�i`���Ko��*�V�\�VdС	5�E5K�
Xb�
� ,�ڒa<\��?�%�R��R�{G;J�P��;&3GK���촎 �F�@�'�UbX�e7_����C&7���$s
+i�q�����9�S.����ɠ�ʵ�\��L(�:6�p�Q�?.*YM����G	�.�A1�pkr�A�3gk�H�\�%��5&y
��~v]�ߩp��#�����Z
�EP��S�:z�6z��p
�eɤ�%�ҽ�(L��>��X�¡�ݤ�
+M��@ŲM�v�S���g�WxMa�m	XM
_�K�
�zI��W�[<[7�Ey0u��a�t�ئ��`sz�_�΋�J�jT���f�3�<Bb��-۱5��\�j�&L����5^�5�K�_z
Y�%�[ݳc���˞�7cʸC����<�
��	�
����t�eA%�d�%�RO`I���./�?��94'bw&�w0I
��/�^!��=��e.29�$��q����ʥ�*�P�Y��?d�\���(��X""�f<\
�%��5%��%�C�9Kܻ
+��1͡mR'[(��
�
�7�c�[.�$4{�1 �1q?�����נ�1�d���n��}�4�D
nXZ������k9��r�M7�����%9�,[	��&aT�5yuP)Hw����D��$��?ʼ9�ɥ�Z�k�>4�UW��I/G`��^w.�.v���N���áN�$m�
�<"���C����2\r8��{�p	����b9e�T	z᭰���Ҍ�O,[�~��=(�бz�3������d}����͉˃���<�
ڿ[��
طG��-�@+�3g�Ԩt�F%R
O�InU�V�c�&�ڳ5&���o�k�dk(P� k|m&�^,�"�=��pl���#������2%�̟G�l��Өt���Җ�G%�£t�/���a���|p�d��;z�
�{A���#�I��ؿ�{�W��\�:��/�x�D�&��5�ʳ��`I.(3,aXʬ`��B�%�?[L�:�'��3R2�;�
 �Х{/�P������A*D��XȘ���Ŵ|���'�
���.ƥ�tޭ�A.�k��s7 [...]
+�H 2�#+�*o�CF���A
+5�
�R���ϼ�JI�F�_z/��DȄ��gg9�F���sO���\��4vĠ~=:�k٤
F)�) ����M��_.*�E�)���=�~W����֘���v�.X�4�񆶆��
���1$ ~B�]�9�o��MkW.Y0kڄQ���ֱ
�oє-O��3hY��ݿK�J.
��%��
jQ�p	:�Ќ��:tk�Ҝ>S�$N�� )�\�"d(L��=LS �>��
����r5j�
��W�ի��R�*H�!_���h�%���%��X�d�w���Ke��
���
:u��'y 
+%a9P��k�Yn�:I/$
� �)�b�
���ݤ��(`2��%;�dZ�V��5a
뛚-�Vp`9�pIa��
x C&A���J
/,*�b�"M
��%�%~�/�$ׂ�"�&��`Jo��$�c�s�x��y�8	]�.)
�qm�Ĥ��1�*)�e�H�53p)C���3 �������Z���
0VZ��x'N�8P�A>{V���v!<���?����9��ZԵ:~����[7�Y�h����F
N�QJ�Z<�$�CD�6�t�%A��
*��0�Y��Ӵ56�AvP�X����o��@�cm���X�;�_�
*�X!k3�����Ч[���9T�Mٲgֲ��v����%�~����7E���P��*�P��;0g��l��l�d����4�H�Ŵ���aL����طTH$�î���%	]>
+fa�r
�,@�D�p�xp�i�
+��5aP�
m)�HI�w�޵jۡs�^}�
6�
+��
����2PbLzQzwng�I��
+b1
�?�/A��/��_؂��R/i]+�ֱ݂a҃�s7�ZE��3ӥSȔ.
mg�����\(T2��`Id��X:|P� �|��%�ȥ%�V�E.�7z�,��Q���y���t���,�o�=]��n5
5����:zn68*)�m�3G�lY.e|P}3e�BZ��
+.我�0t�<Vھ{?ZV\
������VHX��	�/�0T��_I��
^<�����ҾuS�.^�`�\Z�T/�^T��������w�J�jK�?d�KV��D�̓�x�0ɋ'�4�Ŀό$���Sǎ��
+KsfLQ�;t�֨RN�ң� �
�W��H�_bT
+��d��=�/�EK�/��gM��䌇��Z�j�
�AS��\��v�p|�$�.���K��0ݩ�G�%�95K�˔P^�kKB��GK
,]�;k�w��P��ޜ��]�.=z�8�N�T��

���(Ih\@�XA,��3J��'������3�����.
�s��l.�r�m��.���+TzT�R�
�J�`I��S���)�YgR���"E.��Z� ���Y�]cҋf���	
��"�2uO�6	��Q���=�r�����:��!��<��E��Y.�PҮP�lŪ���w�1�a��~�=O
>vJ�2)��Z�8KĞv귘�k��[o��{�Oҽ�%
fM� ^W=���B�L��v�Pɉ뙁J��ܱ;�3���5�
P�x�x;ak�(�"	�T\���+Gqz�#��#��ѹ]���jVa&���GA�`�D�%
�߱
+^�k&8�!u��a���{�d
��4E��.�:���ou�@m<)�X����<,��+
K�[�����W���"FK�%�]탒�}�^��M[J
+�hsV�w=��4t��Pˁ�w*�v�<L��k�L��=8�c�Ȥ��n?J�䶃4.���C��oi]�3������w+�%��a7�v|w�z�
+d�J���'����n�X"�Nr��)��Z�z��k� �6m�����L�J�Q#0)$]��"�6!`
+u�)�{�Yu
��	YG�
���RQ/A�ɕ3�Cٲf͂/k6J�h�*7��l�z���VoP����㧟}�׹88��_�8v��W�|JD�6T���|�ʃ�t�j��C(Tj�
�T�P)GV�J7^BT��E�l�J�mԼm��}�-;������5�y�;m���X�'
��!@�%�"y��1�?��4o&ַ@
ǔM�?�ŠK�_FTr�%
KRd|d4�ȫ�w�"����?�g���ؐt��1�aa\�m�?��u�N
3���U0��-�T�^
kK.�!x����@��
h���Yt�н0x����L7�������a5FBR ��Ω�}��v��t��Ѻ�:�.�sb�`4E\o.e�k��;$�	u5�����J�ӌJ�R$��t��n���Oʵ��ڸa��u�ג\�́���
�\L���9��y!��?�:
��
\�؛�J�$DVYG���g��0��'�=�;��9
ʞM!S6J9r� sa��*�=v�t������;�JSNJ@���{��j��@�Ι7�< �l��UK��3m�h�thC�o�J�-*�(�R��?-*�u%��
+�:��;Pa�yO,[�q����5��S�����ݍ� �MgI�G�g�&�3gM7rpr�.@�ZU	��洨��ˆJzc�/�\X:k�NϜ!�x
�x
�=��{�o{��\�>�IȽ>f=��W��\bעHB��۠V���-5mX�fU��~xf-٭%����fHR�dAIW�
gJ�sBx��N�n�$���U�`�Q��8Zo�І�FO��:�#~�%a���tN�_�7��|)��b6��`j��9+G]<Ҳ��.|w�-G�d��7���
�JBw�K���Œ�qD�b��mP��D�f+�u@�6�(�yRTw�)����.��Y���{=��>c����T<��(�?o��9.=�=�C�x8g.7)Q�B��u�<XS�6nSq�jY�TBNJ���ާ�N�{�V����ݷޤ�������n�(eڤ1��-P�P>�J7_jT���J�
�T�!e�����&kP�=�?jk�!��ø�DZ�𳧎3�a���T�LL�	��pP�ˌJn
OzxNOq�NwЇ�
�[��(��$	����*J��b��y�d��R.iu?�N,�0�D{Km[,U$~83
�ђ=�N�t�պP�%C�c��
)��H�;�9L�5W [...]
�Ԩ�D<3Z
+����c\��
J�ꢀҝ$7�^�w�9�H�t���;JL���wQ���b�SF�D����R���t�㎗xN�7Jν�.�[0��ɚ�h=�����[rqQ�4�R�R$zx��pi��=�w�ڵs��]
+��p�Eg~�{U�i�Խf�O�甎�x�\:͗��x��*)f
]⸓�r�<�s�̙3W��y
��hA�h��::Çz
��
?��
�����
t�~����k:��~1�-z���3Ҵ�Q
+��X���jT.��]�_T��A%���P����	�`
�nѐMY?[e��S�ƿ�Y����`I�ґ����IRX�*ծV�A%>7u�Q�K��w�)1t�Dz�t����p��
�f���ä󏖉�S�:����K#�
�ӣKR�M��W�DQy�t_p�İt
c�
JZ�Z�si�
m)1!�{/۽́�wT(��(ްƤ0�1�B4�&N����N����E4��-���-��1�`���%�K���9H��qك���1Q��Q�?.(�R�#��ȵ߾���ʥ ���#�r�kn��`��/���x���_=\�>8�}���
7��.͛mTR���D/��(��%�Kyr�V��7_��J^�R�Z��5�	Sg- ����Ͻ(�<��ae
;�b
�h�@e�EM+A���͘,�D�C�����A%��bP	ו���5��5h����S�J�U����'�V/[8g��Rkp?
T���J~σ%�%���R,,�/�|��S�I��
�2e�O�\�;Xo���
KƌܿO��I�k�C�Gra����<z8�ҵ�|�;
J�^�R՚u4nު]�.=z'�{��ݼ���P�m
%�h��
G�c��4�75���P��]lZ�)o
�t�
��w+X�?�e�
�
@P��������J�^�R�ӧN ��:t����J�QO�8����y�y�i
���4&�����sϜ6]<�[�Z�hCOV��7>�r���
+�
y$/�R���K��P�:Q���^��*��
t
�RI����;E.G��Q����2�gT�ףS;��*��B��x�ԾK�d�J�I
!�?kk�!o���ZNXP���C�i�&�Ի[�����@%C��`��
�K�󁭏���'"\kB�>U����XLsq�7(=͞���|�Ry>���*�b�Rv�d��4ZX��0)�hM)��|G��M����wԽ́v��P�V���_�oڣW�lY���7�<\
+Ӻ���`��؂��Lֲ�h@@3�
�n7���S� *}�jT��Oz�,=<�G ]m���#G~
+���,�E��FM?�y�JL:χ�L�
pg2��)��1䬣�J�,X�'�R�\���Q.)\ʟ?_���(TXT�j��g֕fc]�"Hg��A
+�� S�HPr1-:K ��ݷ�i�Ҕq#P��l�
��H���
5*�C��t���� �P�Hd	F�y���qPi��1�
rQ)W��4T2��4����
�9+����ٳF��k��MlSƤ��p)X.}n�`i1`i��გim��
ң� =
�$�_��l(#��w
��hӾS��)Ab��wLs��J<�6�����cD��\��}J�`��u
�r�r�
��L9
*��IK0F3 c&�P�h �]XT��I
+ƧN�8~������9��Dʅ�y��w!LJ�a��S�Ka"���Ֆ6�]�L�x#eq�MKh�ר��ʥ

+�W�T�d�j�m،�����bA�dd
�(��������D���fQ�0������ȣE����&`LT���C�%�Q	S�'�P�`�?*�`�W�~4[�|�R�I��Ǧ�0WϿs�a��i
������"
����O6��>��5-,�H8j�-1�AFK�
�
� X��_���llP*[�2�w�s�7 #��ӈ{'4��qo�
�7D��JZ�6E�Vj�xA
#�O.�h]�-9[0��-h��Mf��J�\X�� :�Cۙ3 sF�o���(*�-��R��t��gY*��S�N{2�g�.�Ӓ��;y��
�:�^�W��C�]<��N�P��ԓ�L�F�JʖF��p	_�"�}�Div�F�A
�GK�s�6�u��:�q��A�HP
+,� i��Դ:q�hg!T�)�?*�!�0*�#b8�
>:/T"�ËϞ��E*�N������^ �ɮA20�9)��ؔs���`���j/K��pIO��-,��=��Ҧu*ۛ?{��q���M���kW�����
+�wzx2ZR�ĸ�:)(�dP"F8���s��o FJ؜}b�r�ށ�p�J<��w)bR–K�$�2����H\�p�֥�`�Q���LGw
�)�V�Rvhd&� Z��_�(��XɆ4�����A��8ɸ���������O�DBZ׻��y�pg!��������K�.�=`$åݼ��*)��dĞ�>-
�/�r�X�NJ�ﱢ�
/Q�
RU�������!�J}r����"
c
HK ��J��á�ʥ��C�O�5s4�5~�n���16*5�S���J^ρ����_9���7�hup����A(��
�/�
���x�D{KK��M?�O0
ի���bE=<����S����*K��;�9
��m�J�� �
@�{EV�B
��uF1XZL��k���px�5�K���g��;�zc�D�Mœ��
�Ě��)��%��J�ҎJ�ȟx�,�\�J�,��y���(�����i�}n���rq�*��E�R�ȪCD�7��F%�K�L�K� [...]
+T�P�,ў��ÿ�8
��L
*A4���Z%uO�R��@
Al�GF%g�����f��P�:1��B̰0(��.�����iJr�	KX�ݺq�Ơ5u"�x���h���"zxK
+��&�����]@�q�V�s���0l)a��l�ӽ;q
+;J\(�KW��<0)���Lj)?����SlZ�3?�-����Mf�O�~�tcK�y9��l
�΢���M�JD�j�����R\��/-,Y�H����2���λ���̻�u���>],\r��c�� >�G��cq�a��R����W��r�d���(U�ly�(nڲ]G�+�=!��?�%�W^�,�J��`I"g�B�UK̚:~���4t��i�ϼh��bѼ���c��Kn
�ǯ��W�����b`R$�c�Zj
�x�S.��6_dۄa	n�C��ʥ*ٛ2�<Z��%������%��F�R
P"�Q���ڳo�9�Hi���ܽ;t����zGI
+��6O��(v�:����E�D⒥u}�u� �������� �XN.)T _^�fB3 B6���I
|W_m�y��ݣ
��[�H��
+\R���W�L�+]�aRJ�RZ�4yN���&�~f�x�u�5x2����>�2	
�*�r�L�R%�W�@�rU��'b���
+����*�+�F%_���@����Ҁ��Q�8��
�P9�5��񧟧���~󵗞{����H�C��K������
���=~

Rhߜ����i��≬�TK*EWn�ώ-�W-�3�}{vIjӼ1���
�-7,)\���HPb��r����1��2�x��H��w��{G4�(9
�\q�T`RttJ
%��g�U0�EӺ���(\�r)+�Q��I�*
�K��� 
ț��*��ZS95M�j@�=�J��	�"�"���"���$I� 	
��]?S(E�
����R�ť{�u�
X\bX"�!��mX�v�jU*U(_�l�2�K�)[�|�J�T�E���=�����'C��R$�4"���������m�s)Y�?��m0���u����

}/�G}�Q���T�j@"4�h�'��a��+
.YAt��>X�[
ܿ{��
 ���R���[5kX�����]Z�� K
+����?��
�噒JXS���!#�:;{
�X1Rڳ�t�B�3�5���RG&:� ���H�1�����a\��'��9*8��G{�1_���4H4��l�1�˪��D���P)P,�|ΨS۝`�z�Њ��������{�F4/(�K�k�z�T�KduCB���ѷ[X?ZD�ڷn�[���W��p�|9��/_�R�j5j�k�d�
}=A��
�J��>��3�΂�,�~��+QɃ%�����ß\H�q33����R�Ľ��� ,��^]-�B�t��>�U�W������:��

���˓3{��cXR���0�� (=*�D3]%!�͘=���x�Dܻ�_|��
�Rh�߱K�I�1#~l�-�K!�E����o��[$�
�7��飌f
Fe4�.�W���
��ͣ
�z&T?*a������iF��dI~E�z��D)RKE���Dz�0#�5(��9Q���ҀK�r�
�a䭣+ڲ.�i�
+d�5�[�&p�b�
+*T�TY�R��<k�
+b8�hEb�I#8Ĩd��oWP��
*E��/���ON�;�AR�
�D"`
+A1-��{�ᅴ<��-,�������ʩh�4lP?����#

viͩ%�%�K��	J�
Pj�$�D�;�
�n�L#�#ǜ�S(�4zH
,�[���1R��q)���n�
7GW1����b�eJA3 ��?_>�,T�(��b�OҢ�Ш䵂]��
����N�Z'2x�9\(E-�����y����o~��s�ڬ�˂ž��f
,K�M�f�֫S�F��U*�RU�R�z
���<آ��Jo�pLT�@|���P����>.i`
+~?;��bR�$������2.y�e�aXz�$�÷n\ˣ�q���
N=�U*�.^�P�G at x�����
�tӿ0)HR�t��n��_��@�s���J �au<�9
?����}@�&?��`�ZL��o��B��H-4�¥0��*Db�
e�����|)���i<�(D��R��3y�k��r!aeLT���P)����WP.�J�~���m�.�8�5l
�I�k��uBg�-��笣�	��Z�H�5�m��M�W�R��ժV�Z�Z��j�mИ�ʻ��?x�X�vXe�Y_R��^���*!_A��
+T�K���/?G|����k�O�t���.�"\,�^�8WD��ϡr`	gX^|����xX�x��i��r�m�&�K�x����N-�nQ����&�I�����1#��w�s�ҋ/�jiR(�XfI
ˆ�
1^!��H�V���͎��6�l�F
eԼ��z�ފ5�+W,W�dq¥B�
+�h@��%E_�	iQ�B���@�t�Q)
+��T�DJ�A�H��wcE�F�K�y�D\'d�~���e����C��>�vC,��ҶU���ԫ[�V��j֪S�~�&�i��� U�N�1�d� �j�`�
�~��J�M����d��������_�K�
;�#���+E����l�����ˡk��� "
�ׯZ�h�̩��KjӼQ��U+�)Q��9��a閛�&�~�]��P�R(#
�;�
H���lΚ�]�PJ=&�B��3D>B�k���@�ʥ���<p����I��M����R%��f���e}5,¨,|�s����ӄJ!Y}��!
Q0�
E~F���D�ȩ�[(E�R�uRp��+q`
+��K?G�����K*����v�Юu�fM)\�S�V�Z�kשW�a�f-�1u��Q�Hځ�Y�H�T�?�JѰ���1�#&
�\*���x)SZ`�{����U�xض�����G��
�xKK���t{�t�*`���[�)P��{�y
��|'<
)	��;Ksp
+��aR ���H�����S$.El����`4��.b���x]ͱ�DkeJ�(�84&'%�Wk�J_Hp��h-�T�Rt�����]<(GE�*WL���
��|/���_+��.�Jt�L2����K�ѰD�fݻtlߦe�6�_�����oаq���&��ؠa�����Q#�
��J�7Q)K.�#�e� \*bJegU�����]�L�?UD�$���{���ʩh��a͊�
��׫k��-pjI

���,ݖ���T��ó>(���'�� �
x�O:#%�ޥP(��€��+^#�)$�R��(9���QF�S�[4�^���Kz9��¥�?�0�d�2e+T�z&��:
�x�@����ҷ�B�_���|LrA�C%�wR�d�\'�wRr��g�-�œ�?8P,�X��KGt�5mܨa|
5n�
���
�r�y���d�y�+�t�b�R�)k\Dr��󩟼ϐ�
j��X2��`J���O
=D=�պ�7�/���P���,�u�
��~��$`�����@��V%
�T#��������s�����ݻ�J�伃}��+����9GL9�E�#�%W��
e4t��`��$�\�*G�N��
-g�̀��J���M5���=
�`�N�!�	�
+T���݅�s��{�B�Z�����o@�-�sb8��9)>V*�)Ƴ���9���!�����I�
];%�k\jҸQ�F�7iּe�vIt�eȈ��͚�x����
��JWP)&,�'�_R�0"Y��B��ύ��,��S*`IN]So��-��GK��
N<��C���֩�%<�@
Kw�y>`ҽ!P���x��}b)����{ g+��#%ݽ�C�Ť��~��
+�c^�F�Ă]�_2v��e4��
|���ʍЇ [��̊�
(]��HɆ���v�a0F?_T�����(ryB�_}�x$J��v�вy����~�8��E'/���V�׉B�������HX2mWs$��٭s��m[�lѼYS�5kޢe�I
�����I�g/X
ew�
�
+]A����yl%��J�s!��+�T�D�H��"^�0K����`��.ł%����
�_�����=����M
3\��@x�@���0Zz�{.�L�?�
J%��4z<
:�\��p��N(	!����(���H
+��O��]��
��s�h�b��ƥ`�u��y]t'A_�#Xb���-��Y��*�*V(_�\�r��W�X�J��u��֮c�^�|�G�]]T�"���%���u"�t�w����0(Yω|��
�s��NJ�V	L�g�x��K����R�Խ�*�ڶnղ���ڴmߡs7>�<~�9
��$<ȑ^A�+���0�+l��Hګ��m��*챃��(���J,�T�r �l-


vi�G

ɕ#{���
+����{�I�0_���G�D����J�?����s�H�Ͽ0�;w��P��$��+�x����F���h�h�
�mC�ҏ�-������u$�`D�pU[0��Ԭ^�J�J�
р�uE�w�Y�1��_~��y������"�:Ֆ����
[,�H��8�'K�u~�~�89DJ�䮣��(X���R���zt��Q�R�֭[�jݦM��
:u�N'0!x2w�R���^P���T��J��]���J!׳��� �}A9r�ԑZ{��R|X��k=Z�2���]�zxBxhӢ����/O�
�,ex������{�&e0�T�A�:�;��
�
)PšD����Jz�$ݻTJ�#���+|��_�;�B%l$0��v˥�[0�n����M��
n�n��L�R�J��h@�FM�J�ӟa��.�J�����ť��c.��Z�K�q�J,���1�;)wRĥ��K�H\`�	2��6x@��=�u��1�}�vm۶m�>�c�.�{�I
����X����:F���t����R,q�8�;�;g��{��鼻�a;���� ��:���R�4���wɧ�9�\j�ȴ.�7K
ڷjڰN�*|-=o�)Xʘ!�
+�� ��1�%�
�j�t
D
JJ����eK�FJn��%��
3
/�G���o�g���&�����DJ؈��_.��2
+���$�U9��v�Z�`
˙uj)\�h at U�ԩװ1X�;@/� ��)aTz?m�[������4��0�W�~�r�ГE���:1|��;��T��ҿ���Q
K+h��`i����>�z �:tHJJ�Сc��z��7`�p0���,[�
�C����(]A��:T�������D��k�s`|��o�6$%�f-����`:��_�ִ�-�)��FX�Ŝ�ף%
[�<<�.�3]
�
^�TZ�?��aK�3>�!C���3(Lʔ%k�
Q�ԋ�w(�����"i�I��u^!�
��/�k���x%lJ`Y.����nL�Լ����T�%��a
��l�f@�����k�J%��o�0�۳h��
��"ը�~	M�|�H�t`A)I�\�'
yN�c%pm&>.E�R@<=K��
+�E2q��C��ۻg�n]:w�]�v�ٻo�ACIF΂��Hځ��]A�+�� .��Ǥ0$}�I��Ρ�9>s�
?�Ϯ
~&N&��1�>b8V�dFK���Ax����E�"�?�K�R�̙2f|��3f̄B)
�+R�d��f����8|"J�|��
)�ݻ��=�b�ߚW୚/�W�4�E���
�:C�X%lJST��
e��I8��NIOK�c��ʟ���Y�^��$P���&�[�M�L)�h^�!ʱ
,�g�P���E
E�ۖ��K ��F�Ƅ�Г���sB��fu?8��s��).E�Z��ga�Ň
,�7�4n􈡃T�Իg�nݺ��[�

+��>j,	q-Y�^i'	=��
_��JWP)���J�o9���8�����?�L��4Y>|Z��ӳ,�򹳆�l�����%������hz�D=�����{vlV��'��0���Dx(Z�@�<
+��g͒%s�L�3gɒ-�C�ʓ��w
+��1(u$�p���ݭ`�
�
ds�v�R,��`�9���+��`�o����0:n�`��)aS�%�\
+.g�zlX^W�NImI˦!k@4�Q�f-Z�� ��n��Q��4�RlX�"C+���V���]H2��ɢ=�>����;�L���Rj`I_�%X��`i�����ӻW�
�z�R�4`�*��نu%H�_A�+��".E��	a�9�(��7��.nE>%��C�>p�Id��Zj1F��ˈ1�x���
-�<��'��q-)<;<�5��-��c�
,�x([���&�ȉ��PB	�Ѡd�w��D#���wL�Gp��y��
+����?�y�OL��ET���r�
��1��u��	Kt�[0�ڴl\jР~}�(Pj�6�SW^Ϝ�%��r��+��K=*E	E��"_
(���~��|�����t
��u|'��.E\
+����_
X�L����
+�,���}��Օ��O����D�D�hbW���R�&H�"����.���{��t�X���a����Uv��wι�x9�yfF
'���]�]�]�8v����r�[�Ν:v�бc��]�v��J���➳`�
+D��|^I��'n
N��9�JQ���7^�n�{UHRO����)�Cs�nѼ��h�"
ܤy
]�%���%�������T
,I���DŽ_�p�t���ֱm����T�\��Rŋ��^K��"p�&�n�t�:΍�;��:9`�J(�p�A�ͷ
��3RJ2���
o�
+�^u�m��5ތ��,<5\2�x���$��WMX�$`	/[tF��F
 �j�h@�:�6n�j��9a� *	�V�t:5Tra�;���W�}���r��^���H[)`rL���x�Ք���c�$a�[�3�L
7zD������ԵK�Ν�t�ڭG����R���.]��pgeTz��4*�Q)�
T���ѭ=w���K���:=.%<�u��%~�'����`�<Os���Cy5ͻ�L�d��v*��'	��7k��J[�*

| a��n�%o�<y�������T�~>8W��D����<K��J@�3GJIv�˜�|���`h����|k���d*a�쨕�'1�
� �p)9X��
�?I�F�
�$J�v�hQ�aD�#rWvQ�+�lc�YH�I��>2Lv�1��X�	���ՙr|��hK�� ,ѽ%6���� KÆ@�Իg��ݻu�ֽG�^}�
4J%��Z<�v at Tz
͔F�4*��R��eB�����=�$r,�W���'���'�`<����/�����2�s�� .%9]
+�R������@x v8����5�T�
^�� Kw�~�m��w��w�y����+���jL�
9�]f��X�!
J��wQ��eS��4X���6�
/�i
y�O�:���BoI���[0�*c��
X�ݽK�vm`9�!�ԯ�@�R�Vm;t���qx!�a�������K
.��dF1���TN�L;N��@[Y�2��4>�R���`K��'� Z�4_�Ҥ�cF:xЀ~}���ճg�^�z��48s��qp�y�b$;��H; *a K�R�bp)J6&�����<'9��+�*�^x����Y���{�yt3�b�_½�#�p=���t�(^`��x���#�����T,�*-
J,ݓ�;����� L�'�}���� %mש�DJkyO�%�G�C��;���:�ɓ?
��Dt��f����5���P�8�����p�
6������}��E��	K����AZ6͚�h@�
	P%��;z�dX�YE7N�^�
�
+*E��wz"�G!L�"��y&ӎ�9���,[�cfu��h)7h����
ai���Q#2�d

�_ S�>}���?p���G��0��-�����~�v�S�aT
+
�Өtn��L���$u�!	�B�p+�)���<��1xG��?��
1��	�	B!��P1ѥi��p)X.�
�%s�.1��H���v���kB�d�
ޗ�޻��뮻���T�/s?�Nϒ<?� (�
��(�!�B)Q�
+����g6���
s�5�
2S��N��v{�I5W�`��/L����4z�P���M�K$иq��lסs7\�
3a
+.��X�ѳ�JѺ�I�D���Zw�T�M�r���2]�C�J����N�!�R���u��ycь`i��ƍ
9\�� L�
8(c���#nj��|�&[��w8�JiTJ������%&�oIH�T=p+�U�R��
9�/x����߄�>&<
c!"�L.m�$a��I�b	�_�p`�S����
vx���,)t�����^�I
?�J
���7H���wC(<�$FJ��	`�� �^G#Pxc+<��q�
��gY㘌wf� ��740}�v	�V�������4��
��.
۷m�R�4oѪu��T"}��Sy�(�4��
+*u��5�Ġ�Ma�1[#��&;!
'�瘮c�:Ͽ���
�O��
�~?|�7aI^wF��吰4e��1�F
�
28#cРA��f9z�(�f�]�d9
h���^"��)�Ӓ��F�4*�8����1�>ɩ�$�$��_ @^>�t�����ۏ�R��������A0�PxB��K����f�+eX���X�+�%\��W�Z�
+eK�(Ng�
�_��}��}�� �G��(EV	Jؘ`J� %T�A)�����ֱnJ��yJ5�7 $܎�f��>2�!��4��)�E�$�#������\��
KG=X?z��
�X�
+��I4�e��mڵ�ԥ{����9���n��8	O�º���I4(1	ӈw�T�L��
2�&�
z΁���8=�|G9��
l���
��\��%}���sZ�P�Ҳ�
�Κ>e҄��G��9t��f1r��	��Θ=o\hތd^W���LiTJ�R�]P����I$q�$	"!x�������ݻw�x��?�s�>�h�ń�a,�2�I�%|�\�*.�G�����4���g�XZ���D.��4o\�N����X*�������?��.Z
�͕GP�:C(~G�r��jPz�@)�sH�B�$snY����@y����Dp;䘁m�<mi
i�#N��S�������T��b\��ޒ�jeX�-Q.u�о-��mסSP�D뙴��c w��eT���hq���n����d0;�!���9�Vd,N��
=�ձ�|`X*���Q)��'�����ƹ%K�gL�<q����#�o����ƌ
?i��Ys������!��Ҩ�F�?ԑ�:��{��I\$�ca(<^.�o׮��=i<��]��!6
:�ޥ��]K�W.e�t/�X����j���իT|�l��,j��.Q�L9J5���m��)�z	���RBL��
�E�7#�� �څf����x�5�
��L��au��<��D�ҿ,-gXk�����U����Q�*�d�

c%����8���i���KФA�*�T&N��+��1LfyΓh+�:���ܬ�h7��d������E
�ӗH�Λ=s�(�Ə
#�I�Q�F�
7aҔi3���6�v�m�����J!C�Q�B������smڹȷ4$�c	@�� [...]
+��w��Q,
��%X�mҠ^����Yn���p�
+��jPbI��ؖ�{���Ϩ=�(�v�"
%���H��QV`�Aa�-[�*{Hk<	�{7��d�݇�F�HX�́%
U���ΚwP˦w��]Q4�c�N�:w�֣W��h=s�\��-��*A��*�
+���-����,m�f��0�C�����
v
a�=���
+YJ���������K�&p�Yi)XZ�|���sf��4q���cnj3v��(͘=O�Jp�Yyʉ�_}-�JiT��A�����^�\�Lג��%"!x�6p�-[6o޴i�F뉿�y����Ʉ��`��	�K��p-�,t,KIHm�~$��g��#��A}{tiߺY��ukVX*S
+�r�G�˔}��%�t�۳�W���ĎP2�w�1;�>	a�ߴ�
+O�f�`=�[E��x�k��)�h�K��d�#F�
K��j��0,-DXB-(�H4�
ht�ٻo(�� 0/��gr׿ѿ��J)*kP��[�*LRi�o2J!�q���"<G�I�w������p����jI’�=�=D۰v��̝=s�T�K&�o��I��
+P�K��&��9)�Ө�F��@�-�$&A<�%�=p-�,�+t�-¥D\�~ݺ��1���u�׋�(|l
�{�p.�["
>���%p,�\�<�t&�
v�Y,
���uj۲i��� ,�/�OK�,	�O��KsJ���SvLҷ�؅��,
+�& ��x��L�T� 
�d�D�3n;-��f���j�Y��脩�'�10q����V.}��K����	K��,������.^�����T���%r��
��Y@��'.��;;� Z�L#��5 I��
g��c
�:�V�9�{N���0�
V�!�\J���%�
B�m��b����̚9}ڔɓ'�7y�i�g
+PZ�d����7?
<+���Bi�4*�Q)�~(�BI5�&a�t�i�$�')
+�� >%B�U+W�\�b�r�?�\�j����b64�w!0
:|�i�D4˥0,%F��K���R栾=�thӢI��G+<R�Ο�-�H�����M���PQ at K:��E�R��Rt���L�DOAf�2��,3���϶�Zxf��h�i�1�a_��(}��O���a�M$vt��y������a�\р޽���ӯ�����F�?Y��J���ۓ**%�`
%7�`L�eCR�d�F�VK���ck���;̬Le��߰��n�*,}���ؼa��˖,��4c����M�6}�, ���VB���hu����4*�Q)�|��]�$l�A�ٞ�$�Y�X	�b
�l��%K/^��|��K�,]*b�
+�0�M������i��}�Z"�#\�Ԝ�%=\����I���K �p
�
KC��޹}���U�
+��W
�ըU��	JjQ	�2�{���R�f�rn�oG)��%#@xSi�jm���!���aG;	LX�b��g᪍�d��%�ijOp�ܾe#0��#-�Qåh �~�
�J6�.�&R�<
+�A�Q)�"�"�! �LMa)�8f�rh2��!
	0�C�sL�Ʋl��:�c^�
I{�Ƴ1]<�7
�����Ҏ'6o\�f�rQ.	\�-�	��Y���PZ��J�R�
x�6�JiT���0�F�
��3>�� �����'E0���x$�j��
̟?o�\xs��_͛7o��"$.[N�%�k�VL���u��4"�r��K�VK��eK�����v
��biTfF? <�j���zujV�Z�ң�=Z�����	��
:�XTG���W�J^�m�I�����5O5"! 	3 at hH�̀6�MO���@ �0�
+
� �qɴ�jX�Eg�ɗK>,9�{�֩KƊr�D�

�1X�*��z&3N��{�'
���\���#6cLŽ�qr��i����d�-�����"�ci[2ɬn?�g�6�۱l֐�Ò=
4`i���kVA�$pi�
�m�;��%KW�Z�~�J�-gyQ���ѳ�I��9�J��<����](a�Na�H���vA�E�D$��SfϚ5r���A�4s�,�{
+>&�!���.(�D�$��݄K±Dj��e{A�SǡB?�w�z
O���;KX,�2�o�.
ڴl������i���3s��0(���b����O�
ѐ;�ɂRl�D
J&&a΍m �oI\�*@B3�s�0�xd���
5�!8�p�kX���p�nE��v/��%X�r"�mCXb-���P4`����

<$@i<�g��~$���E�:.E��e3U۞�L�9�xT�
�
s��l.Dr�sLי��c�Jfuh*,��6��.�5{���4,�ڱm˦
kW�ri	E�C-Y&@i���O�RIM`������F�4*�NJԇ����D����w�C��U+��ca~>%B��)S&Ӽs">�|N�:u�t*����Z�l�JL"AǂI��q�+,���[��a)��}���b�(�䝥�Ǐ�ѿw�������Z��\�z�᠏J���:0]�Q.
\P�
q��8 &���&2��
H��
3��&���ks�$sP��h'�p,� ���u�~.E�K񂅉`I��'�5,)� L�2�
9z������\N���-F�ϳ�J?���;�f_�v(޶�
�����]�� �0���	���iS��L2<�]g:��l+��m%S��j���-��5:p~pm�pu{�9	KOnۺyú5�a���B�(mؼu;�J��Co�(���iT:�Q)	P"�z
�Kd�ǡ	!0I��
�[�Z
/ǚM#�)��7M?~ܸ�����ر��Ut�$!�Bd�%��Z,���6
�K��{'�
D4,Y?�Y,��ָ����iǎ:�_�nx��1\��S��x��ԭW�A�&t:A���=kr�
7s@�۔A�3�f�a�I�1��E�J�
 �͑Vp�0�|h
0� �I�
M2�A�������$���a�C�7Vt�̝e��1r���'N�6��l�L9V���E����P"��
�I�I��޵��
�d�Hs��!�:�9�:@�6|g���փ��I��1�S�Y�6�-X�G %,
ܷG`���!�.]����6	�ܵ{��
�b�ե�Q�
G�hP�\):��
%�

%L��*~��J�$�s@$�+�U�S"�9rƏa� ���eo\����p�L�.�
+��%].A/��h��b����Q�SƏ�CϮ�ڵnѬq���W�n�z�
�{>�Z�nۡ�J&'\Q��#�Qʕ��	RI�;�0�rnH
�����)�7�L�-�ѣ�
`�L�Ls�;��J�
�f��i��
�cE;쮾
�SC�%��uD�iِh�����wK�ѣa?s2l �͆-���(���T!�q��>2� �q
A�$J[,���
+��$e2$�#r���(�c�����0�[��M��`�
�-Z�yϾF	Dt/YX
+�K����)~-E��V��+�GC����5���{}��d�4*�ۨ�
(A�G%n�
��
�I�����M����cX
�i0h��,`0�5f�8��½p�a֜y
��$B���\z��xo����C���X�^�
跙�,�����
P���i�ƍ���ߧG���Z�9x�O��]��fP��lN8���e�	�K&�oV�͍ � �2i�
���4�DDx#+�23�
+���I{�5�f����*�0�߀�F�c2J��p�w.|&���H�F� �R����J%Ʉ�� Y}��%h4�-�� �#����;�m֯%HB�	D9��	�qL���d8�����T��d�a�L���Y2�$=$�J��%�^
+����UvQD�D�	�m
�j³�R�����YP��S"TڑF�\�J��9��#%��A��0	�6�j��4�F�_A�E��}�~���˯_����=5(c��0�m�e*m�-^*R>��wB��%�����KQ�����*��&�I�
���ܙS&��


?m��|�k>t8A������{��M�<?�&'�R%
��E=
����"�7N
�
���f����`��@fs��&���h��kX�vr�'�
��S�L
K�X��Բ!� �]
���9����3u+�U���v)zK䶹E
�6;N��mT&Qwa�<m2$��i2�s,ס<��|�N� �
��v�g)�{�]�KN����m�çZ+J�ҿ����͢^�,\ ��V���t������4*�Q)D�3@�yos"���;�.�$�-� ƈsh��t��wo8�܃6��?��٫w�>�l��^R�G9����K<�%ʥ�����kX
+6ǂ?��I�j�b��BK�'Co`�^ݻt��|�kޢe�6�;v�� J��
+�߽&�/>��\ꠤ���ͤA�Ȭ`��k�cB�
2nR�
iZ�� ���xd�`݇�1p�;��\a�����Yx��P1���1,)р�3�3��{Xs��&̺�����
X�9TrAɪn5�J��<Ib�z�.@*7k�i�L�q�d�!ב�3D�j� g&���g_Q���IOK�ђ��􊝸n&���^��nӽy쁘�}ڥ�M�ҹ�Jɂҿ��)�
~�4��!�T �F��X8�w�{�!�k�.�;w�#?�;��Y7ԋ��W��
�SkQ0�g-]�j���Ё�M
h�|ڜ-E	�?������I+~��XZ�h�̩ǂ>u�^=��Մ�p�n��݄��{��A�4s��%������'(%��K��D�$��TH�<i�8>jCW at Q�2�0@��9�v�֝́�N@D;]�FD;M�L=
���g�z�i٬V��
b�O��KWp��G.���jg
�B��МǑ͞5�4b�4�đ�� Q"�
䔺u
y�NWp
�;l��c�M@�Q통�
\z
性$m�}��u���’q�
~d�[J���~�H�J.~

u@��g�����JߤQ)��R86|%�"��ޤɳ�2F�
b���Ċ)����c�_u]g�8о]��m��Ë8�m۶]��"&v�P�x�p.X�
��,��`|��mO>��x
+��bX���%S,Y-���T�[�I��CX,-Y0gƔ	cFf
зw��#~ �w��	}d

A�Ĝp�~G�J�+�&:���u��۠���A��T�
+L7Z@�H"�qZ@��`��m�*Q�V�Z�=�O֮��(D'L �(ک֌v�Y���,<�J�
K_�{�o|`	�l�h -��w��z&��蒈�W��
�R<(����
4&�4b�ʍ���o(� �Ya���!�a[���V��Vp镼gL�p<+���P�N�s �2P0T�wHT��H�:��K۔�9�X0i$��X)T�e�r*%J�5(����mݴ^�RD<�%���"
+D��J��6" ������׼y�-���9]�� �� LP0.͙�pɲ�k�A��k����R���Jn
O�
x�VK���7"3��u����0�[�^}@�z���ԥg��I�U�A�Œ%&��'"�~Y�:�I�I�L��ET��z�V`34G345�������pG�NְvsUg���0�ʥ7f�T�\�9����]�S4Z6�3�Y�����]���Hv`%*��s��Q)z��wfxދN���x�4�LF)9��mny�v
�;�A4
l5`PƐL�n�=�qI1�4��?{'=,y�JKO�Ŭ�|He;� �acXL� Z87�
iT:7Q)���@�u��B�NJ�V�i/��(|
�!x�p,�*��Es�4nܨQC�����Ík�A�"A�Zԟ2}^�����;w����1X�
�V���N��;����wxZK at x�:i
�>�W0V��?�@�/GΗ+�jw#���)E��?$��0�rn*��T
���Rx�膱�4�0� [...]
+�vsUg�;���-kE�QkXzA’
XA�!
���""E��������-TJ�d"qҤ��v��Ҟ1�2! R;v
a�&!�!�i�þC��ٻ�&:�'qI��ՆR]<�ۚ
+,9=W��r�M:<�z�t�o�H�	�;c7?tK>�J�$*y�����c� �f�
��.�|��&� g���|�� �I�F�����c���z��=�X��ȴ��j��1�
�U3���`k�o��樆���\\���M�
�
�bi�����̘:a	B���߇�&hPB%��
��w۠��9R
+$ݒ�Hu�ʹu|��
�7�
+

��f����`$��=Z 4aф5l�vs��2�·%�¿H	��5���5f�ȁ�F��^Bڥ��f ��ڃ����oS�J�AI&�Nj����F�]����.(�Q���
v
�;@����U�L}�T�BL��E��d.�n����V��(nIzȂ������(|R���d��RɑA�
�dP�4*�2T�B�&�
+W�d�wO���ŸeO�4$|
G0퐲ִ	�,��Y��5k�W���˚5A)�N�z"�2��	`��I#�#D�7Y
S�(�
�`�t��P��;p�'��l\�r٢y��j�P�fBp�
d̜̠�֦|�%�O��2YP��;�tS#hӆu�I2�V�Gw�qw��э�`�,P����0G����

�D"�ѮK����`�h��K�mOzY���,<)i��5K{�c5I �#m$^�ܭ򗠒M6P)���>�K�6۲	k[��4�!�sG4� $J�pk�Nm4��:�W�:�2��[!2�IDW�n��c�b1І���/x
^��,��B����d����={��ݫN{"y�%�}!���6�!�J�8*�C%[��!��'������&
�G�q��l���Y�� a�"V�Z�M+�B�U���X�&��d�%��}GfP�
�%���G��lE;�뤋%��C���pe�E�
�bi��5+��
�9����#:$c�)͵����CF�O#���A�s�����t?)��
+���e,UE|k߮
"�o�++��
Տ�!���@{<Є�Ѯ��v�0ک,�d6��w������O�#��
b��|

 ��kp�K��X*�^�1�3u��Z��Vv��`�����������d
�d�h���
'�9`���w at n��E�6��0A
+�9\���´�OGl�咵��:�Ò�ƚ��Ţ[���;p�Hҝ����.�̱R��9T�c��.��dܹ��P�->d�uDH�y���~U
��+T(_��+_�B�
�*�½����Q�f�Z
;
\�7 c�p,If����%k<����<���i��
n�	���,Ch�
7~�������]v2bG=
��:Aܽ��{'&�k��4aN�(- H�*�7�TV�S
`���̇� s��,�Q���v�dj�����
��pdb�ǦYl��^�)d��
P&ţB=�՚(����%�,�R
(}����b�ܡث�:�
o�F��m2�9N�s�u*9�j����De�YdHZ�iC��B���V�N�G��Y������
+� �C� 
�$�G��ȓ�\�Ҩ�{Q)����0��1��pm��" ��֙4$��m@$�Ia�\Y��Z���ʔy��pص�ѫR�z�Z�05d=���D�D7,���_�l�sEir�T��
�C�V�dݳ r8K��ϸa-�.9&�
+�Sg�/d�f	�h�a�C
(}	J�HIGcN���`��$̹u|k�+պu � � ����f��_�|h
6\5��F;�i`��	y2
��U���#K2��g	��5����:Kxb�:|x��4>:�$r`�mT
+���r���h�����xc!!I���

'�9d+�
�����~Ccn7t�JDѡ�A`�iC���*4�`)�h�k.�o��a���0	d�w���X(='AI_���$�~�|T� �J���@��|aPڏ��ݻY<u
�i�I�ڠ\������cU <�0X�d�%
z����?�(Q�d���a|�Z�ZuH��t�z��r	��՜�
+��u��y=<;��Qɻg��p*����=��K1��B[�����ci�?��+Z�J6�(uPr;Aн;�7k@�����Ӧ&e
�ߧ�I
�Dƍ	�o��{i�
�2Gi�O�$�]
�D�dd��3��,|��-�t�����2,�*v�X��L�l���7�%cZ�BtTdM=��*;�����>�C���
1� L4����
1L&��48N�s���w0�[�ٯ:��Ц7.0
�iC�
�_�趪�Y���8
s���ҾJǒ��
=��xG�
u\o'Prz�]���҄4*��Q�*Y��J{ \
P��
L�ƌ�տ��.�$(����<�±
<>%b`�bE�> ^~��E�!�Me��*Wŋz�#.�G������
;a��Y�.]A���`a��A
�ZxL�bI��0:�D!
M �
+:&0֔]n�'�\�CP�� %�	:mt��f>>N���K�%U�����^;
ߠR%D��p$��Z�0?ia
4��G9�*`���U�t�`�R
Z�
d�2(F� �D^��?|�u�-�7o�"����Lc�$Df���� �x/p�w(�fXyc�{v���@��6�@#v��瀱����Fr-i*�j���uc5mew�
��F��Rd��`	�%h�='���3�:�9u��uu�SM���Q�g�JI8�
�Ʒ�� �fJ+�-�4.�d
��
�K��L�^��
	��[U�P����o<��B�DL|@`�p/t��+U��	q	u��w@t�@�[’3���U�b)�,��Y,��|HO��ـiJvb���|��P)*灒+�Dݻ}{�{��cGA�0	sn�$A�͈�x$"� "4����Y�6�C�
+�$�+p��
g���D���mO��c�:�p�Q�Z��&�5K��q�/
�n��f�._3 h���R�[B�խ�C�ENa�f"����$�
��m���o0� �Q&�\�� (m+�L"���i
�Ziն=X�oܭ7i�t<�amY<K�Em�OaV���ҋ� ��$�B	/s1(y�<m�I��9�J��a�Üp:ps�[��5{Ɣ�"&�B�w���DƇ��eR��I%K`(xT�`����+�=��_�ϟ�@����`���%�o=RAL�Kp��u;(�Pu<��������}B�w�d��� ��L��
��妱(]��;��jR ���$�6T��wVˊ:A;�_I��@����I
۷m�BvO!�A�͈$�Pе���,s @�xg�
+�$�+P�k��
g�8^b�~L�Qxf�M�U�7�;*x
T�܁$v�٧�ӿ��? ���f	�����

+�52�O�<�B&ai
iD]���d�H�Bh����U���#|�`!� �H"*pZǒ���@�Qц�-�=�,yF`���˻�o@�ĸt��L� ��P�s��Y
�w$����{iTʕ���/R���
9m�7{:v�@��;�j�1	ˤG �
*���U�{!��w�xw�'��/�����
+?PT��p�r����o��<����7��n'��~ �Q�m�}��4@x�)a�oC�
+�t:I=w>�s��@ɢ{�:T2A�c�2`��C&�q�Y�tC��*�V��^.���.E�
���!�
p?�
�ܛ??�
+�L%K�yX��t������t��7��Rj���v��%���~R
صk��] �Gk�R��h��Wd
�>�@)�C1CMa���u�fM0� �=
+��&��
��0��A��Ҿ#����z�u�`�-Z���1��boY�S�ym���2����'V��C�K�^�tB ҋ/&��A)x�3�J�
*��c`�R/�բJi!*č��
�jmߦe��

�[�F�ʢLz��bE�gݏ�N!���o�V��n�
b�]��{�w!0=T�p�Z���
�R������;p��Qx�H��Z<��W��5uh��R�Ƕ[x�ɟ�!Z
-Iqj�:{�x�g���f3Z���ֽ��P���e�@	��	�n�b�ڔsnJ
�=XL�7���"��V���k��=:U�h'����`���4��7߶�UI�?�^�a� �X�$�%���-
,h*� ��ni�c�����J�L� %�F�kP"�P6��&rm�0��,A�m2�8��[I�a�)��6L��EK��>xH ���$eIIUL
�� ���Ko�q	�I@� ��_~0�@�m��k�iT�E��uqa@��z���O�E	J�&�=|(t��jޤ���
+�
	za�Y�X"
+���7o�<����:o^����~! S��Ŋ��T��*թ\�.^Ͼ#XZ�l%�|�ђ����1Œ���b���C��A�%�@�|�A��Ş���J�?0��(�xb�l(R�=UQ�{�1�sn�oX$ax��p�[��9n�x�R
�����~*
�v�CY�G	�CƗ�Z���tl�i^��G$��Z�
i|�ET��/<P"����l����`
+��$�

I���hǑ6ˣ-%L�Ʋl�%�0�(n�.J[�T�����*i(�h���V���N����O�r	�S'2��� �W_=)�$*�,P���4*�s�(�T���Q��#Ai�h����սs,��թ)2>E<�B��X��P8�M7�t�7�`�oWxY�[� �D|�XqQ/=R�RUQ.	�jնcמ}hXZ�n�Vd<X7�
<���o��:���Lǝ%(
A���6�=�%�-Z(ޢ�K�.[N秷��R��L�Q��/I�'y
%���E�˘t3��s�'5�J�Ƿ��D�
	�J
�
+7k+\o>��CD=�T��v8��$�
L�:�ۇF.)^F���q3��/^�9I7��% ���
Dɀ#OU�.��/�SF%�J�
+�
+���G'@��BI�
���i�W�ę
��a2H!�j�y�öʃ�ĶI��x	�6iFtV(���&N�>xCR�
���Y��ǷAX2p�ס`:�t�b�
JA�_ЅӨ�kQ�
�e�T��� '�> %�a���֩}�P(ժ^�RƤ�!A��0/�Ս���k�]��Z�=��� �����C%˔-���㍚�l۱K���Ϟ�x�j}azx��
�G�T
�S}3�,P���U+�����]�O�ۚ�P�l��̏�f"�O�D	�n9���)b�I
� �ViX��`Y��
�c�`�
+*�UѮ���q�L�:�
e�/y��

+�FFmg��\�<L$`�X�t4��T�p�Y׷aP�9 �\%]6��M���?�L*��mp��P$�� 
a� =�Zm)�V7i]~L���T��MZ�n��0��1�?,Ma��kq
+�>*���r	q	
&�L���|�1��$K�4*�~T��T_;1��Jϲb�֍k����0J=�vjת���P(U|�l钄I·�ȱ0^s��W�S�O�����4	�ߺ��,�KE,QJ�K��լS�aӖm;X8d�hKs,Y�
-�5#TC�%e%Zv
O��&���]#����@�fæ�t@-�ؙf�C%�l�Õ��&K}!��ʤ�'z�=�J��E(-��+Uo�V�
+���0��z�&�v��hW�p�
�Q`���Ҹ�,��`s(1�!v
��Iނ!Հ�4�b `ҳϽ��`&9P�֩$%\��\q�tU�B�ۚ�"&A������d�H���f��=G��:m+&�+\�^��c�@�rI
+.Ub�`je
�v��U@�8�X
+�v�\��$�	��&A�Ġ�Ӟ(�4Q�4*�ը�UP�[7D���;�ʧ���Աm�f�
�'
+%˔|�1I�{I�H�V�Q"�])�ߍ'��A��^�\�D�tW>�X��+^�L�
+��֨󘀥6���0z”s�� �%��$ϻ���X�~fM�w/�
�ӡ�At�zP[[�Z���u��Ե;�fh��Ħ�W��Dϔ
�'�Mc�c?L��T�����{��M!D����O[�!O�;Ln��.�*ڕSY8�� 
�]g��zYx ��'��<�b6�K @�3���KJ3 R^-K�J�428����t�F�4m�֜�*L�w��&
y��
��a*��~�R���%��Z�⍛�%�jX2ϔǟxN��ӀŰ\�zI �@&z�/��PR��
�

�Q)ף�7U��\ߡ��h�ɡ�p�u��}zPjٴQ��X(=\�ăE	�D<�%��������D��+�+� �P ��M7�E���¯
+?�`���ūQ[�R
�-�
8t�Sg�h	{xG��}l�(�G�^
�,���]Ц��6��oÆ��������>�J�. J�����	�a�n(P�ɤ[�U
����e��o*�At�*�
+�5�
�T�3��]*��hgf��P�N��f��Ò�}��̷x;S.g>+�	
�g����R	5�%_V_�DuK��U�*��)lpJ#�q�2�k36�N�n��v��
�,4
��
+�B:+j�L�1[+K���Ò�xH�J�1��.0	dl��~�4bX��w�`y|/�J?#T�$T2��R	�J�~C������V,Y0g����=�t�԰~��U+U�R�b½ ��s�o�g�_�G]~�����?�������DŽ{]��tÍ�KX.=]�*��Z,�4t��I�f�hi�N�����;����c���[��:D�c�[�l޼	�f���R
�����R��5�t��w�zwW�Gh�<��b|sӂ��V���9�=8U`d�َv�(�URKe�\���wD5�>�i9_(~;�3_�����=ϒr=��
H��*%J׭�y)�D�͵�0�ubҽ�5�2$�L�<G���V`,+�S�~�R�2���tV�?�pi��,y@�8z<҈�!��ְ�]<l�10	d�'��]�$a
���"�T)�J?3T�"eT2�J������
�̘2a�p�)uh#@�:5�>Z�li,�D�~a��?ɳ�
+n�Q�2x�g>�g
�
+��n���|�(X�h�e4,u�֫F�q4ZZ�q+��A��C��1��І֛��׌���
�i�U�' ��܉�Q@���]�O
����ݷzh.�x�
(�x;A02���nh��p&z�=5�J

+h
\z饦5�
2W�T�J������F��_=,�:�,|b�,��@
�H6n��3a9��	t^�M��W�M�
� _S>
�dRe&!r��
+T��
B�j[Q(�ͪBsj[�$Q�ގ
�(��=G����4Ս�o�-U��
:k�JZ��3�%Y]�C��
Kn�
�`d1�%a5&�ރ�
J���J�\iT:GQ��ݑ�
���)
*͝9u�C�L	@�v�*�>�p���ݗ_d��n�ˤ\�u�����
F������_�t���[�Ԫ]������̹
���{ߡ#(<
4s��w�~�/mT0`���v�M��ۥ���}P(�����O����L�(jrq���>�D�AƤ;�L2����CV���Ls��e��T!*�.jg�-��p��H�V�
^h;�E��{0�dp=3؎J�MW#�xE��l�9��Pݎ
�DO��6�6+KSX���&�^s�k2D#2Y�s
[ISa�Ė�糥��Z��;tf���
eI<�V�#�����7
+����p�B&|�$&a��I�1Tr��iT:Q)\*��,���FC�Y�&�
9tP?Jի���d�ED�)_ޛ�ȷ�@��� x�|_,�
+"!�H��r��{�+���%ʔ�X�F�����j��x#�L�
ޚ
[��ڃ�b��d)�w��f�%M��Dbk,j�K�ڠ���g�}�yI�tph�L��=N˳&(�PjC3pq�m+�(���w�D���F|��͵���3�A�̏vP0�v���WD:���3������n|�ruR�
K$f�����h?�_��4��<*E���s at +rd�`H$:2]�m�ڌ1	��d�F�4\x�mu��v�!�1��Fx�k���}'�J�^JY�0.���Y�X�T��%¥�?F`d؄�]@`w�<P��:�Q)��R�T�g
 8
��
�D�>nTfF�^�4(�H�h����#
+����г(B��C�a@�%�
\Kx��%o�����̇����R��
���;(s$��'r<Q,
�bɢ�%�J�-�O������CQT[o����( `��{
�㋸pk2�ޒ
SH	W�4W�i��2�L(�.�=¤[�R�V�7�`h�F���Ls�\�����52�.�,\/�M�3P�
!]��ۧ�Yx\/n;�u&���w
+el|P���c^BP
+�r�esn�!(M323�H$Z*�*ج��bҵF&��da�����;`+j8�~�5����	�K��kފ�R��R�L���
S�%����"�� ��P�@���E׳iTʝ�d�.��U*I��Aa�'6�[%B�)�Gܿw�N�Z)P*��н���&��
��x( Ix����y���. &�ZT/�C�Ս��S��h՚uoܢMǮ��
=�y���AK�Ia�C*�bk��
��s�Yl�����j�?k�<}

+%TZ{M-�x��
����e�-Wb�
J�F��˼#I75��4��
+�(-��M+�O�;�����
+v��E���,���8
��f�;�3�J'0��z,�rI��r&-h&�����(9� :�n�^Sy�@	�T�v�‰��Y��
&�AL���?��d
+�8d*�V��q���K8��6�4-�[Z)K x��^X�(�v�5��졒KF�ĸD���,L���I�Q��D�p��T�gԿ�7
�JC��޹}�f��׮�@��|w��x#��I
+���ȫ0����( "20.���\���z�]� XzX�R�z
��lש{�CF��4m�|"<�	<���w�����8!A� js�DmY�C��~��x���t��Ѡ�O(�v%�K�4�v���r=�qҍ� Ƥk�J����"��9�
���
Lf���p(��&��;͡{x,qO�/g�` �g�����I��^v�xQ��g1����
-�����-'5��j�L`�(m�ԙܥ��8mYʱ$�� �bސ,�`��ZM.�R�K��Ob)�y���]��d� B#��
b�*� �F�s��R�3�T"��Ƶؿ�4n��A}{v�кy��u$(�H	�wм���� �#�"���|�C���
���p,�WX.]{�My �D�T����+U��X�f��co���3��`K��-��
�CDN��΍kS���P�
��| nj�z�5��� �ߢ������r��\�Vu�tC#���fέ*UN
~gY����A���v�:�.��WI����PH*0���·%w;�4ng�	Є�o�z�i�����Mr��i4��

aO�% [...]
+Ko�
��/��hc���!
~u
�*j���1����%D&�&�
I�
P
+�_�~ި�Mj�]*��w˰7jXF�^];�i���5�<���=w�qkޛn�NJ�^�I	�t�������`����,A�h�Re+T�^�~��m:v����1��2�%�Y���� �]�ۊ3Q��N*�g�	d�w
m�GI�{;1Z[2Q�.|���iy�Ai"��a'H%�м�,�$
�.6�i�{���v�]��d~���W�Yx�d�����d`����@��l =�${=�s�
H��� �›f&�2C��}�A	�[)Q"Q

%����]
��t���� �i�?���W_{�*�h����4�a	�k7nٮ�ü|2p�,�
�K6.0!2}�x$!�0���R)�J��T��K���#R
�7u��C��֩m�&
�լ*@�$���D���+!$JL�E�$����#C�‚�,����߯�����E*]�b��u4iٮs�>��
7y�
U,��I�����R�@�ҿ�x i<��3 ������T��X%�����\*��JI�R��#V��nf�@ҍ,�I2���&C���϶�od��*������v�/>
��T���lX��V
P�
¤�i=�S
Jg�T�$��L��[X��A	��j�+03��,���F�I�F�A���7���
+��oP��-���h)�
’p$S����
:B#@Y��e�'�a�,�������
(�Q��J*
�:��%���/�T�n��r�9�'�9t`�
��ӡV�J�.Y��BJ7(A�Ę$�!��t�
"�D&�%.����`)��E��(�ȣ�j=ְY�]{��6z�(���o�[x���V�S[�J<��	�
����I;1o��Z(%*�����E�y���)@i�<�A�I�+�;b:�v0ɬT�GA}��g!�o�\�wFw�p)&
o��7�����җD�U@6�

x�=�$��i�RvP�[S71��
�\}P�m�J�{{}�ͮ�����Ź�i+�T��~�
T���_9�<Xj޺�Kp
6-��e��A�&��r	�	�Ib�5aR
(�Q�
E%��3K��C������͜2a4��p�T�z�
+eK	P�O��
�{��+����s$�c�a����k��г��t�e�����;��_��kѶ�S,�b���%��\Y
+�n[ϻ����egG< |�9	

_uЛO�
�4
1���;�P��v�
+��wW]ia��~�������'�+��
e�\�,������.
Y��"�3?��L��I
��z��96���J!�y62
(����%��,W��ؽ+@� jx��te2�e�\�2�EiKi�P�[��_i�֪�xc��<̺MH��]-�ђ}Y���ŒK�K
+���,L��;�4*�TzӪ�F%���J��TZ�rɂ��&�
1D��Nm[4y�.0
J?T��}���J	A�
+%�IIұBa�W���P�K«.�?�� ��)P{xUk�k���X���†��
�T
�{���@ߗ�겳�
�1)jO3Y�×��o�'`h��Th��Ժ� %O�
1J���/Y&�s�ꅮ~_>�,xR�.�dN�����7Y�+Ie�a��%�
����
P뙁E����+b�z12	���s@���0a�Pb��4"�d�O�u*�����l(X�(P�H���V�T�V]�%�jG�W˸ת�Z#{���9�K
.12}�	 IbR�F�\�J.ׁd
�ոTZ�z�"�:d�ۣ
��h�T�X����w�J�PҘ$
+u4�b\�R�t��7�|��w�{_a��U�V�~# <p�4v��lߵ��9�Ï5�!�^"�S�x �v>�cRJ�����P�%>Bb�Ю+��83��u��{I���V����5�/���S\�����p�(
O���h;�C�
�����j�"L|ċ����MW�h:��
+�ԾCc��҉D
�d6�$�L�<�>�?�� ���,,=C@�%l���Дt�l�6�ʢ�]%y
�D%�%�$2����I)�R��T������J"�[2���c��/��6ؿ��҃E��)P��@Ia����8h�C��¯�.����q�u7�h���*[�J���X3v�V�ޞ��-��'�cP�*�8
�a	qI��eg�$�P
+m�$߿SK/'gCh�D�T�V5
OP'��>�Ĉo�� �!�R��v{_.;,� g��
��g�O������������Ɋ�d at H]-UT
+���h�Ipy
�8S"P��T��H�^�a3�I�%��0%�����T.�5�[��-�P)�%�J�ecPZ��x$�O���O��CrŒK�K���_~E��r{iT:gPI7�t���i��*�@jH�J�۵��
�
+N����P�����(
%��صL7����sQ�ĸ���ҕ���z��C�K�U�F4��>M�
<���ŀ%��iguٙ1)��Jv�ΚO�gC�� A�|��8�����da��D|~���.��
+Y���&����~����"Lj��Ϳ{O	� �Ҋ��6�o&:0(Ѳ9���6��o�Lg6/�C��APq���AY
�V�%�> 5E]-C�c�?LEmD�n�,f��B&�HF��4(�Q�lE�u�A�`
+� ��:�TI�J];�nְ^����P	�"0^��;%.���kE�����s�c�[iX�


+FK�û�
T�;K�f/X*>��_+�
"��’�
��KxA�64���s�����{e��Jv+ȾEO�
��d�)P���
��t����7+��w���+�DE�på��,����ϐY�.>�Y��Ë-�mg��Lz�z��cs�J%�g
3	��I=� (�D¶��I!�%�"��4.i>+�Y���-�ٰ�y�l"� ��c��kA+���2���,9�d�o�0)~�%�J��l��JGJ
�J#��T����T�L��{��~��7\{�%*��{1&Y�
ٷ�$,]��������<��qw��<T�
KH��
5~��y���p����"�4A�F��%�:�r��t����L8T
+R����МΆ %\��'�]u�� ��I�V&�e"<
+D�
+n��
�K���y�,����K�1���w��E4,�ۙJ6 at -hjɀ3
J�'��� 4�F��jfY.
JX���X�01��;�K�V�T..�Q�Y���KpL�W?�Z6I�ZUQk�xg��a��%����6
+�Ҩt��H���Ǐ�
�*�K%�:T���;*]w�?\P�%b�g�ɴo.��ģ%��!�AK]�g1v�����l�S�F
�#}*>r���	�X��}���6?�G4cb�ym�bn����ı������Y�t�-�	r�n������?/W��vT.%��#O�;u��y��{��v
_,%���L��zfV@��s���6�
*a&��-
5(���HX6�ӈ�I��4��&d(��]���|���pH�4{��"^xL��è�F�`�ZC_1d2�K
+�����IɁR�r5*9
���S��#`ڭ���x]*ծV	�w�݃C�k��9�D!1
I��

�J���K�û�$<`�Tw�z�
����6%j�?���
]iH\2v4�]g��s$(9��S
l~��r>ACsPxj�¯��
�`��Y�/�},4�]
+Yx7#
GE�����
���٥MT,�mg��j?�]��@�L���ay
=WKE��Q"a�La�/�L.y[��N5�M��e<\X�C�Re}Ls�<����Z��K�=�|��%L4�
¤8
�Q)ף�j�A
+����b����\*+�AݚU*�5�w��Jd~�]J�D�;v/�\ɺᒂ��~���ݘ綻�b�J�z �Э� �;@
o�ƭV
��‹,�ŒK�v ��Gǝ#�4��dyŕJ�V��e5�w��j۲�	J83��묤�A����4 %�vN~9g�7Ge�HěA簶ҕ�g�?a��4�!�Xr�`��U�r��ό�
�*9�\��d��$� ��B�w~�;5H�l�4�/D��J��ֆ��K�1ͩT�nކ7���g��a4
������A)�J��
w�x�u�
p��5⇙��J�Tz��:��N���N��o%(iL�s&���,�D�l(��5�X���Ǜ�lG|j��ʒ��K�T/x����|_��T��8걇Ja��k�-zc>Csy�
+�4hoA�;AؽsAN|s�x��.0��e�M;�<i�'�F/�b)v;�K���3�
J�M>��w��� kE֪�$�%@�:s�ϴ��I�ɂƓ�M�h�PZ,�)yQëp1��4�ib������f/�������L�����Lh�4*�FT�����
�H�J�����Ι>i�$�A�T�J�: ��w8T��wJܼ3�ˌt����ʄ%9Z��o�X*�`ɲ��rx��}e�
+�� �17�����o�E�RhG�wG�_ҌA����&W�T��46�oY
�E�V�(��J�ּ8�@�'�w�B)�I)��La\2�x@7a����a�H�2&�
�GIK�ۙ�r��IY%o{º��-��t��J���C;O+��T�+^h�,+&3M�
n���6�!�C�;��Z�’<�ُGKȗ�{x��R�[��ɂ&��&�Q)��R��'B$r
�>k�����a�JHu���p3 �����
(i�J޳,��6�=<XZ�b�n�Y*S�Ru�;t��k�XY�-<�D�R
,9��_��$w4��������
+�_��f+���8T�޲*��p	J�����ƷD�.���Ee��Y8�-��'�'M�M[K�iwi�#��b)b;S�f�	$RB��S/�T��;i��(�"3�RŋJ���Q�-�P��,+�2qI�Y����� �<X�n<��S7-I�$�xq�n�&,����R��ɘ&�J���
�:��x�u Z8(�ѮRM,�
+
G�-/���:
4(��[6,�
�*���w�⥘�Юs�~���a
,�>��s���,Eo,��R̎�'��'�󅽣Q)E_��$���j>јeK#1
�[FP��;�J
ߢ�+�h�g�Fs��]�e��f��z!������'i�����/�)�lZ�I5��~�Y %�K��	�����O��р3��;�s�A�{��W~�;y
9�R�Y�g��R^�x

��iت
����Eb
+����C�b)�K�����I�&�J���-�D�
h�I]�u��e
����R�;�� �;��.J�<ɲ���_,!O=�,]{�Ͱ�T�X	�;�����`�y�ν�u,���],%���Toh~j�+3
+��@ɖw�ZA�/�����|�.�!��%��D4.��ߢ
.����¯��p$��
�i!
�=<wd�|���v������QO.P*�����)�w�h

cS+Aɨnu"���Bl0����^K�(�7�a�V��<n�t&��كj�zf��rI"S�K�6iT2�F.@%�߼
-+�
s
��ӭc*���'K%�:p����2>��6,���n�{��;Tv��%h��"-h�
P��O�w,>�y
X��؅Q�0ֆ����0�
�J��������ca�D�	��=���(�N��|�
�"=0Q~�����#���	^�$}���#
�X�
�[��"S���$�^�T��[:�B�;e4�L�L"�t��$��%��k�K9�Y��� �7�kЍ箽�/	ĔEtM��
R-�"qɲ`��>Y�Q����\�\VڲA���u�٥}�&�ש^�2H��R	��'�w�L�%��
K��gKyn����V�Z
[x��;i����Hr�#>E�똰�����f��(�$�A����b&
�ڷ��
�
�
���F0��2$�F;7
�(��z�N��f�l-�$�F�v���
�IT��p.ElgfI2 �I\Q��@*��)p�w(�Fk�X�j$`
�,�ڠd%��
���5�,%
�%$��q��R =\��d��
+�o�RK�%��2M����;Q�`�A��^XVZ�v�Cw�4z

[
+	xT*������cQ���Q��'���\��w�
��p����
+�Q���/�%{�؄�hjL��dJ�����aj��
l*u��ŋ2�+J�����ARd�K*
���ëԨC����Sxx[�0�#
�X
+N�"�w.0y���R�|��8���oi��w�Q����W1
c�?��^��,릲
en�_�	�a�n<�kجU�.=�1e��94��e
�V�S,�~��Ҩ�}�܃J/��
�
No�ȡ�u Zx��eJ��Q
�
�X�l�`�����
�� [x���=p�(��
�
,E}
+'ι�c�	c��th�I^�ۙ�wV|SSs)�D�찊��;<��C%u`A)��d�Rv�[�+���	^M[���É�g�,<~W�f�z��E�q�]����^��[y�OZ꫘���M�(�q�E
+a�B�NW���%�x���M������T��
�p�WI���f;C��F%�k�T2�J�
+-3𠁇�J�'�ٹ]K���+]��P��C�P
+�4dtF�_�����pɥ�%T
�Xx�H��ↃB���N�����b���� ���K�M&�Md��B� R�ey'�:P+h�>�X�>��������&�]t~��‹Е�Z�5�I:��g�,��eL���D�R$2�@Vb�e5�T:���{��](�bB���6gX������@�
�̲��?\@ܡ��?݇�`q.j���

L ,���
 &��g�~H���5�TZy�PɐQ!
<Z�e��	�QסM�FD
G�[��ǥ��ߑ���Jšҡ�b���
T
�Xx(
����Woغ�D�Kq��%��%MM=�!y}�v��$@�W$��Au���a��l
X�Z�rm�Qx
+'�Y�o���U�C�B;
�P�:Mҩ�7q�
Y
�Wj�R���HDJq=��_*a}����,�w�UL;���b��|C1,]h��-Q��Z��S��
����l�FK�|�3	I?�Q��?T2¤�
�#$�^��
��P0>�u ^D�0V2�d�R�%�w�-<b�)���Z#7\�����GƷ�A�X�w4�a�2r��
�Y�!�
+j���:΁�khmY+<]pAdҝ���^~a8
'����S�GrG�/�����=>.�_Vß�#:��R�5�T3շ�'��*��I����3f�(XR�ap�Em�Jհ��<<�=�ƒ�j�J�i�,#���K���5r
*�c���m��Z���
�:T,\�{�-ύ�R)�RA%�Xb���£EZ�w��{��Q�Ith�6�£�R
+t����	M�
+�@%�T�Ҕ	�rjWu+����44��o����{�يm�.�e�������J#h��$
zx����%�
�aK	#[J��B4�.��(p��y�O�G�;�*��$��������`"q�
eÒ�
q�xE-�%k�}�xxf��
U��1x)Y+�"L��1��AiT2�F.B%�[�@xیV��
�6�IסD1�:\?�_�RI��%ߚ�NQ-��ђ�J7\
�xc���4�A^�K�
�qp&j&jva��[*��J%����lU�T
�^�E�K�@)��d���d��+�tx����

��pd1}6�h��+�҃��L�?�Zԋ*��m�J�S��!zw%���$�.OU_UJ
J?B"	K�ٲ+�?��E-��gd^�բ�e
���K���5r*}玕La��s�\2/+
<�����u YhJd�T
+XS���l��"��7j�E��N�K-S�N����l\2	���L�y
���xl��S�u����h1��8��L.`�])������
w*
�I:���#��s���K���"pɁ��?�jԋ��K%8�L��}{�����I����&(�h6���Et�L�Z�/	=�국�
�ժ�%�Y�,[�ҙziTr�FnB�h^�֍��G+����e%�:�A���5��������TP�<��Nj� 
~�
,��l,M��Rx�GKty�OݣM�JaX��ь'
P�;#�}����P��QsP�ޠ��
+���
�������
K�Y8��`�N=<إ���RR��hXJ�R�zn���@���<����k�S/����t��lu��#�RBX�^���&������f��;K�`�%Ө�F���R�E=T��}�<�c%>b�x �
<n��t=� Ҭn���EÆ���K�ˡ���Rxa�C�$<�A�q�����0߇f!N�e
�RINͩD��ձG�b=��$J
��Ť�JK������=<P�1G��]�z�fP�$&�W,%܅��1ɧ���g���h�(���:�+���^l��VߏJ��g��hI��T��MPi�mKL�s�FM�����K���5r
*��J�X	�
�Ṹ}��
+m���	�$�T*%h�,<k��C�j�o������/����y�6	O�"w4�E��\3���T⩹*���_l���r>�'��
�%�x���r�^�bU�
,�%a�V����
�Ș�RU�DT�����d�.�h?z"
K�h	{x�Ñg� �9M��jK� ��
R���}iTr�F�@%��
+�m�'�ǘ9y��!zui�rᏖsx
�!�R)�~�i�`IdറT�>�Iw��Y �o�%�R��[��r�䮒,���S��^+��J���'�����(
�ђ��!�FF�$�P�������꺞aHr]�@*!K�ex�F�\���,6]#��T�!;�����@
I��
g~��%s���F%�k�RT�s�J�
�ѹm
$A.<a/l��P)r��KEK�)_��L��Tw�IEJ$<�Q�p)�%
�&(�k/�Reʗ��)z��ê�n�W��O0R�M�e��`��`d���e.�pg�E&M������
��\��T���N�dշ2i�wl��B��?�͂�d������Cy#{p��#Ǟ=aK�`�>s6^�����P��Vr�J��G,P�Wh�^�R)yT�Li}���p?H�)�Cư1Y݁�Ѧ`K���L��@�����T�� �D 冷�^e\���\?(Eg��$
zxw�-G�ᨽ�<c��J��u�I���.�X�,~�<]*5W��!w�5ύԿ
�ǟzv2{����R��S�C�*5�5hں�S,�3�Z�88 ��Ά�Ҩd|�\�J1c%8�Ի[�VM�E��(
l��q
��J����E��u�o����� ������$����wI����(�+�|Y�
qK�x4���
+��9JqY�
-�

�,��`K0Y��%�
ņ����<��y߅&���{'�*��R������Yٿ#�L����	KF��k��A�Z���݊��_��9��K���5r	*���N`��m%5V�ܽK{��
��3Vh����C%gc	\Ƞ;�@��MX6<�����I�Nl�����J�yE^{9�C<�
\ȗ��Լ����AJ�m���Ћ	wY=<"<��S,������rvb�C�����
+�J\*�(�
2��濹F�)3	m&�ת�Z�
��P����ك.�V��g���2&��x
/�J��������E=<��d���^lz�Mg���J[^��R�A�� �k 	/����DBN������҅)�;m\�B�Jzj���;i���ͫ�9J&�s��Y<\
��\,ɝ�u����!M��p��f�ƥf�b�b"��շy"N5���m ��
��
�.�K���x9��i���wH�R��$*Y��ޡ�A��bፕ�~����ڬ7�E����G��PH�Β��d�XRJx
5<Y�9���Q�[@!�\�]
+�쩒��3��l����
�;$L�/��hd��w�b�ix3��`:+���.��l�n��q��S	�u���JH����:��i�������q�������V�,���¥ 
�ؒ���is�DiTR_#�����q
+n+i<�V�
�Jj�ļ��X)��;�Aw uH�$	�s�~�G��K!%�����s& ��:����yE�
�S%,���S�Ƶ�r���p��cƒY,�d��
���7I��~�gX͛jZ8���&7�J��Q�U�����v2aI�� �þ8��.��%�Y���˶�9\ӦQ���
�
��p9�����$L�`���2+��+��c�TP�٣������M��ԣ/�X2��ǀ�R2$<�e�~�Q�P0�
��(�4��r�T�8ET�@+(�@ɇ%�óF�X�HŒ�ZA҅��k�
Ί
M�C>�xV*����A�A�V�dַ�T�Oo4
�=<+{�M�`g����jY�!�JiT:èd�� {�|[	E��n+��PV�J�@���L�I�͡G*U�K}15��g5��:*��40%�1�x�%��#�k>)��M��`|�q_�F�.G�w�Iu�k^z�#����H.�� ��ݪ�j�l
+w?���C$Iu��!����^�^�S%U*�ߨos�h����ك*�@��Ù-	��p�B�.��d�"��4*��J�d�͙>i�p�kC?n+ݥL�ʬ�+%B%����C�J:+�5\�
K�S_X
+�,���.+1�A��y�d
�R�>}��/Du�ZA9J�=<&<�˜,qoH�;Z1{�
w9>��/�Y q
0��-S	�F�J9h�DكW,��C�C�-�
 #kڜ�Q����y�R��J*ydء�
��$����V��X)*4��J:(�ijx�(<G�z}
KY��O
���iDOr
L.W���IS��X*YS�'
u���3�A�X�OK�g3 �)L�;Cu(��}��a5I�7g���S	�ue
�^�T��%���!�Y��
�b�ҏ�U��-�u��2{ xL^�9+j�4*9_��B�#YA%����
pC�
p��k�V"Nj<5V��
+E��K՜.*Ic^�R�I�����%bgm��L?3��w�r���
+x��dN�̩�Yѿ��R��o���K�7�nb�&��^?K�]����3ob��>]j�ThW�K%w���~Z;��n��b	w��X��25 4���R״iTr���
�‘R�
Gb�n�
�E
�ޙ+%�J����]y5S�I��Ѫ��U��䕎�]X�q�S*��o�)��ܠ�Ҿ�:���JgA+(l)�Zg���(�To�c��A�
u��p�9A-n�nB�$��;�f���&y��F��
.�DK@Ã{X�P:�}���
���j�
0R����u����2AS�A�
�
Z�#���d���*��P���j��qSf��,�ra�Gy�
<o@��p^{�c�R���IS�gf�>�|�w!;��%��K	N�9?�}�s�.6m�
<���
���ȅ]�|�R�&�1
+�)��ك�j5���X
ْ� p�&���is�HiTR_#��Q�$�H��0�
��a�t�)�����죒��t/.,���m;��7�nY��5Zq���Y�J�uE9�ۿ�P-\���J<U�l�0*��߫bI��9<"�EO,~R�9
<G��-+�Y�h���S	^{&Y�*�
�R0{�&KW��W�B(�/����D���6gYxiTr�F�@�p�N����C���P�~�k!���.*��y���_�o-,i�pp�z
i�v�\��g�;��{]q��uP\��BY��R)�A)��K~�1Y�M��wf
��`��JGU�G�x1x�N%��<Y*�Q`�-�=����PK�H�R� �Q��XY
+ԴiT���Ө�=T��]��`�fJ�� ��b����~T���F{I�T��h��-^X��
��9�e�o��
g����.�r�Ƕ:�<od�ix�7䅻����00���6�48�|}��.��&&�T�T"�T�!3EK��w�ݸZf�
2�H$W�bk�4*���4*e�h�k�
���C�B��v�WD�
�*�gD9��?�’�F
� w�n�;%��A
��
6�>|�]�����䀂h����
��gm�.��A��h1�M:��j��s��W2�
,+�,�‘�`�A�|�ɝC�[,1[R q�y�y[x:��#ΕF%�k��Q)���)x0���<�AK��Tv��!{�\�-^�w�4}��n�F{֡����4�hY��1Հ�\�R��:hc�,���
��$n�%st��=| ��b��hX]�ļ��k��.5�
+�1�y�b��j��
 �h
m���~sTM�u5"Ҩ�|�܅JV�
R�p��|���TvH��_�5SE��]�c
+%��@Ys�m͓gBr(�/r@��������(�.�!���T
+K	�
�,�!AZ2C�n��x�
�^?�0𰁇�J4
T\��T"���ɐ�7ؒ&ߡY���E�fmBZ�O]ӦQ��?oT
+4(L<���P�RVv�.*]�13oǚ�:@;((9tv����b�h
6xc��",c:
+Z
s?��JŒ�
�
�,鉅j�
�����2��Ý?V2
��T�
����J��T�0�W,]��$�
x�W�P�Щi_�Q7K���ϧQ)uTBޫ�0b
+�t���Ms�-g�Y+%�J��?H��u �zT7��ZT�z�8�;��x��'���m�2�+T*e%D���
��Ý1���I�
 �War������Y.��x��60g��~���~e�%��#ۻa�,�XY�-<��=�P�r��M���5r*��
+����0�
�'���&��+E�S9��J��Pa)9$���^��d�Ly�s�ܱ��ue�BK
<�0��$�����T��%3�]d�;��'Yx��'9s�
N�M�x�.pQ�x���(
$��u8{R	�B@V��
~�ሬi?���Ҩ��Ө�-T��*������Ǖ��7�T:/���xBx�J�U��YߐBx�
�΋
+Y{/kV,�Z��W�xx@X{I=<���’&��pw
]6Zx���GZx�*L��Bc%�$&�iK���;�R��\3iz�
 Z
~n�V��tfJ���5r*Eç�wT����J6/��mT����Ό�B�J@ލ��+ �j��;��q��_��>D?
Wh���
c�u(r:��/�p�@q��7 u��	a5G�~Z�ő��J�.p�b����ݜ�U��
K!�q�U
/��
�%�6�J���u����1
x:�g��%��dͤQ	�E8�g-*�YE>7`�H�2(T���Sg	*ū���C�}4O2�(R�M?�K&�-<X��C�ciˌ��Oӑ��,��@oy�|S���g5���c
(���f߁��^n�/%��J9嬨iӨd|�\�J��O
�A�py��R�
Eʔ��T�V���=h�B�s&*}u6��1V��J�K�6;��"�o�=
+�ņ;ZY2Zx��
��X�J���NzN'��;�]q�D�u�Kj
���
h�Fs�d
/�[x5�g_x�U�,�F��>�JI�R�C��ɗ�yt
�Jbx]� 1<N/%kƘӴf���i}甅�
�i\F~�p|3N��/M��+
4�w؎~/����<iM��n�5 椚��]��`��
+��L��Z���;kR	
�
�k�z�����G
�Ҩ��Ө���I�C�*����<`�1��3�ac�
�`�1v��dϒ�F"K��-�6$�d�RىR�R��(Dd����
�2�w�庮sm�s?o��s�o�����x��<����;��;t
��k`����r���h�	�T��:e�~
���Y蝱��;�c���
��{�ڀ��/cV���鉧�մ�����
���<G�G��`���.;
�n+���Op��@��Be3��#Li
+�z��NO���p�TC�C�JާјP)Mo
#�����a��阔0�骋fv8�4ܩ��)���E�P�A~9�|���tz���
��y'q�>B�-�l��*Sx�HK^x�
+Cst2��kf��E��5qՍЮ�h#*a�&Y~����w�h�[�RB�)��3=�����W#��5cZKT2�F�@��7ۮ+=��J��jez���+C^]4�T9�MX��MQP)M�ʱ�Vr��B[���=&�ɉ�V᭏���
���=z��x.?��R��
*}�M֙�|�S�7F��>h��ARx��=�-�]Ȟ��|C�0�%*5T�b]�s
o]N	ޒC%:e�҅>*�T8T�b.]u�c%�
�{/z�6M�U����qҝ���;	[��;�;������R�o�U<�Bc�
��nG���]3�]\ۨ���bvO{�/cK�p�y�$�%*y�FC%�=[W:וB��5�V���m���G�=������c%8���}�(��{�t����
�6�,ɻX1?�G�,�u�~=�r�JLp�Ob���T�8;�`w��^���fc�*͠&P%*5)T2K���v�
�ĺR��U�ʨDg�
�a�?�c�.*�1Z�B*�a^���Ed[�a���c% [...]
+S�J����P)����X�Fw,r�+U͊����<,��H�O�O��6�F��z��\���c%8���s�U������l��M�80�w�hkB
���B�
��öR��R�J	�xO��m�3��ƒ�f�J�KT*Q��P�/o�� �
�u�pfij�hVD�
���|�x��.*��\�P�;���1W?����J��|٬�!�|2�
h����}�m�����vr_�j�@�B��bM�
v�
+��u>)*�8-K�x��n��;X��_/s빪lY��*Q���6~T��D�ו�c�2��XaX���d��ȹ|TB��n��G*(@�?��ƨ��
����8g��qŬ��5�o�cӝ;G�K
��.�
a�̊!w��L���]OG���v�^�|��j����=�$��?�7^��ſ_f�5r�*Q��4��JO/T
+(
+L�4��h��������lT�
A�Xv��[��]���
���{�c�F@�yE��
7E��\��m@�yu����	_�����m��Y��n+�ףȨdzZw���,����t�쮱	�q��,�D�ƎJ�Jxq�O%�*�h�P4#�����b<p��bܡ=���Ya[� ��{d�����lz��{�B�P j('�MS���$J+T�,�X��������`ɺp�^�V��
j�XV���4�*9��d�`�Û��J��;,6*щ�����B�p�u4
+|!�2�JN~+,*�ҝ�
ofmȏ���V�����6<I
5L䢹�C���4�4b�v�uzo�A�a2�F��rc�J��w
+�
��U�Ų�̧јQ�!��\��\��N��.�V�NU���Q8����JI�Pmy�dխ�=݃!�W�V�"5Г.
m����r�85Tϡ�/���&�,v�L���h��e��&��(wЛ$������,������KT�����g��o�m�q�@��� ��C������sM�u�i���d<�g�
+�߼G�;��B� �;쌚c#w,��	j�AQ�*�v\��0�bc]x�~qڵpc�����b��K����
�.�bYq֝KTj��dEF4� �P��K���C�D[�R�9窺��8;d

)D~�d��<m���ٻ��
+!�s$*��a�X;.�$қ��2�o�'�J�w�y�P����6
��<�ʹ6D�l�JT2�F�G��y��p�?�;�Y;,�h&Pi튨D
�G��IV�D�m�wn��

Y�X��{*ٸyG�w�+	���r9Q#T��8B�g�{hYT�UV������|�9^w��
^MםKT�_E%���q�s���%�4*��oM
��_�P)�'�U7:;��W;�D���oޓ*�c�P7Z4�"�i�����4>y�1>�
���F��H>�Ȇ$*�~�;�a�����b0�a�JTjJ���O�4
}p��.�pȡ(�T4���
�'pj�
ñ'0*��V Tr��Y��U�[W��󧠆|�9�ኾ�APC^b`QT��@���d�lʼn�E��Rr��9�t��2k4�tADx%*y�Fc@��[�����x^��qáU1��/�hV@�-�T:�Q�Nc�~
��|�Xug�
�g��|bE�O
�����~�p�K
,~h�t�-
��8X�'��Q��5�
'_I8ۙŲ��Xv��ȋ���BU�R�B��Y�bZ��P
�޹�C
�J1*�p�4J�Ki�P�P)SN.x7�Ϲ}�����$��45�Exv?3C^T�+�D�W�#�'��Q��EPI�մ�eR�WiݹD��?_��⢒͖�QDl�
G���l8I#DP�A%m7�
+�{�S��v��P�>>*���32o�78*y�p��&�w���������L�Z���/X������|M������9�ْNm��`����.(6*E֕Bc��ɪ{��&��,*%Ex��,H���m�z�r~����|�{�y�F2
L��1
˴�5L��9�����U�J��h�d�7�r�a��M��*}��np��9ƛ54v
+?��rA�Cq[&-£����Vq�'�`ذ�N��4�T�^1/X������kǴ��D���h��}����\�T�5�cκ����dNa�҈JA���4��I�I��=���X�{�=α�h���
�J�y ��c�H>D�q�9@�Z�F>�2�VZwnyp�i
�
̴��D���h��$�%�����9�'2�z�bT��2��yi2������G��?�@׀�Vnԓ����"���ca�&bw��ϸӼl�֬��<��NI3�
��T���i4
T�
��*#���Y�'�YKT��3�	nD�:&�R�n��,؟5�b��2^�Z�R�D[՝fF�e��f�L�<��"�i
K�k�%*��D�:��'�CμTFl.����/Q)�΄v�	.�\�Bcqh;��N>
�xEx��*��|P�
�
qW�Q�������N&�4�:2�Ӭ
+���aZ�9M��$����J��u����Uř�
+ӎ�*sA�2-4r���iRCA�Z
b
֮�
+Ϝk��~V
�q
+����_�]�;�5zL���#ʴ��zzY�=�JT*Q�^Pɛwħ�V�
+F8Ve$k��ɲD%B��
�,+ǹ��p��}�����ݲ q�����ko��n��
�L�/�#�<1��z@%�j��̑;�?��W~��r��M�,Q�D�%�J�Ŧ�D62�`n��5KT�����r�,.H;5
+Tj����K��
Ƿ*���'9��5�h��0=t=#X��
u�J�6K1��5�s˂�hg���Z޲/Q�������0���4E�%*�ޙ���ee@%�
*>*���J�Xq���	Ƿ=�q�U.*Ň�q)�*��]T�&wp�hٰ�ܲ/��C�Jާ��QI
��>�G{��FF�}-Q��;�2
2���e�Ͳ�hs��Z<*ٯ�s|[K��];r�w#�H��Y2�
�G��5�6T
+�0�Fk�|�ޙ�}���iKT���%*-6*ѱ�@�
h�JT�򝱨,+��}�B��D�3�
*�47��=��'gh��R���,��1ϒY�֬Yȴ��ݽ�߈
+��r�J��J�S�����k�re������3'���	�VXѓ
��vF^��z=3�*���CWX}�Kf
Z�������_h9T��ǪD%��ۤP��J�S�ѣ%*�gs�e��B�1��J�~Ë0��E�Qɮg��|�(��
i�mZ}���r�Z��BT��;���ɑ���|�J��J��r��ݣY�D�:�3������<j�W���>"rˡ��+*���*5���G���5N$�6x�
�R�?J9r��0�+Q)�ϗ���P�xЉT��A�������q�B#��ܨQ�En�*��L�''�YCT�ɕ�2Q��ۖH8�1䈯>S���J2�8'G
+�J��*Q�|M��-=^&ρ��;�����)Q��w��@ͥP��9�|�M�JQ5W㘛{��J?���
۳�i��hP�4� ���]���-*���J9.�J)Q�D�%�JmXe'
y �wb�3���D�\�Ʃ��f:ݹ�3
�X����J�l��9
l&������H��J)Q)�ϗ��QI��*]x�u‰x��T��ɁJ��8�|\����䙆�OY4
T�DBڼpł�R39�
�Y%*���J�#OY4����D%�i4-T�ԢR��Һ>*U�EW���G�w&��"5�M
+���F�y�����1*��kzە5&TZ��J���J	��*5�^�Jާ��Pɽ ���{HT�����3�b�����/��ɷ�dT����Q��^Pɡ������*E��!*�P�R�J
�J
"^֌J�*���t~�%*����M�
endstream
endobj
323 0 obj
<</Length 65536>>stream
+R���t�<�t��QTJ��(��
���j@��l%��1�G���!�
JT�>���J�
T�^�����3*-�K at 1�\�����JቄF�JE]}�F�?o�S�_�R�J
�J� *���J��f귿r�J�ߙ%�+5T2��&�J4eTZ6�Jy��>��D���0*}Q��ϩ1TZ�D����bΕ
���P�I�J9Q����D�ڡ���U���_X���/Q�
^�W;4�RN�Cc�+��T�R�P�[��5�^%*-�;S�+EP)��+2*ŕ�ݚ�2�d�JT*2*
�wT�����6�K=ޓ�ľҠƷ�٢mz��[�P�R�J
�J��~���JշJM�>�>x�<�q���ॽ
vi��71o��2��R�f%*5 *�W�RC�3K�g�냗�8TP�o3P)8�8>Vt�%�E[�R�3.Q����>���
��i��-Q)�;S��!M�R̝��
*�gxo�>���U8��/Y��C%*5T����/Q���Lx��P)r�������dQ�L��%
�W�3ιdQ��J�W�^|�is�����?B��
*-w����q�JuG%�-s�R�-KT��Θ�Y��L{!}�B�3,*�͖�93��IqW_�'�J�I� ?tźE�/�7�[�	Tʸd!P�]��K��D��F���>Y�R}�3�k������
�P������@%ɔ��8Q)��r0C���n
9�fϘ�2ݝ�o1l�B%v�8x�}�6��T��Y]���;��G�տ�R�J
�J�-�nsQ��%��f�D���E%fJ��|�5C���)��EP��	�y�l����ࡶ�ᲝA��<TZ
��£R�
��-��j�JN�Ԩ�w��T���2��y~�h�Q��	�y�wo�6�5�*�
9��?�6��vS�B�a
+�t�y.H9%*������4�$��(Q)�;C�/QT����<�A��������R��:Z�ߙQ�74*y�N�>�}f1��E��'���8����~�ۍ�v�)��J9ܔ3�D���^q�

+�..Qi�ޙ ��uE�bHp��w�q�5ZT2��w^�����\�|q��r�J�Q�Y�J������z�6�\�i���iy�m:
R��*

6��w�}��3f?�Q�}�ӿ���?%*�?���
*��—�T�wƢ����3{���O���P�5�[�y�/����nM7���f�����W�����������l��r����3�J�
T:�6
�?��Y��
0�*�JwTz�7��P���ri�D��j޻!�b�D����Jީ
a���5v!s��Bf!�n���-F����?������m�$�ԵjTq�o��{@��v�r��g��w�W]wӘ��Nxx��'�0U�>��C���Pə�zs+Q)��=��KT����Q)j^�\Ȍ��/�9O5��,��
��G��_�z�ZD���˧Q)bм8�]����j�
6���t��\<���y���O����U�|��?D�,**3@�K��ԇ��ƬS�2���T�R=�3��3��� -d�՗C��D���x	�y��>�d�]
��s.5�>�@3
��7�ix1�f�y��!�n��PI���b�+S��+S��)*����Sq�J٨tz�Ju~g��.d�/�E9W����=��Lg�W�P�P��_�s��<
\��Q�0����P1]�
�L��7����ǎ2���d�i�˾ڢ�p*>�u*.Q�D��|i<T��C0h{VG��
*�`���v��3��z$�����vI�ʻB�"���4��A��EC%��Z�o
��V�v/*��L��~�j�J���u*�[cK
�P�{i?�䗨�t�R
�4�rh�ƈJN��Cl���΋X�lW�4�p��
*4*keւCC9v��F����Ҧ5C�x�fQI;/AT��(r=�5�G����Rڞ�ʹ
�A;8�k�+���q�R|�V�6x�9k
Q���?0
�i��`H��3�
��J�Z��q�G��Fv�&V��43*��r���K�Ɩ(*�h�`i�D���\9�k9$��Vvp�^�^iq�P	�y�y�p�ֵvІCY6x�A�
+�@#7�z�,V�y�f~��m`���欵�+4�J���]�S���A����J�/ITzd��6�x�D��
��"cp��f�5-^�s
�햏�+�%��۰�MF�
��
����Fx�p`�Pqa�@AK�i]��]vΰ���!���P���J�ɤ0�^Q��?��,T�4�$P)�JC�JK*��

�����-G�{�Ƞ%8���vb]��h��m��Cg��T.��!WȻ�l���R�������
��#�Z�`�V,;;
�
�b�K���S�2�P��%�JU�A����Q����{A�Qh�PJ^��<�l���7H�J�e�]����C$չ�����ϧxWy��@Q���
+�
�S���ʜe�Z�)*�vaQi�"��lJR��R�J��<��D�pQ�[��hSdPq�|���пDk��=��
+g9s
�+#��j�J�k�����w-TМ8	Q
+H%An�ػ�J���t�6�Jڇ#���;���·���A�:<D%-��*��Ϲe�R���D%�G�*%���������g������`�y�4l����]����za)�]3Dx�	Z*NQa����g��'u����g:�J?ɛ���`M>e+�_��=1^�R�J�FH~�Z_-֌����v�H�s�|�.њ��ÙZ
��Q)�F�.,��]���V)&�
��Z.��u��ҿBTrV/��ޚz=�����UeD%U����s/
>�ȚD���^
TڲD����#�w-t�j�n��|���"�T��<�l�H������Sϥ֕j�JyW#
7�.���B�QI��\	��;��J�
+�G��+�����/�!vU��5G%b|T2o�E���
IT
+�qT
+�%*E���RlDa���-�$T��<�l���O
��ٿ�^�����n�wշ,��g��Y�W�I��\Q
+I�h����W3NAP�I���WGBTZ��P	^����n1T��'uE��J'�J�.Q)�#M��/�gΈB��
�sޙ�

+62�ܡY3Y�kJ�\	
��u��/r-P)»����w�\�3����'g�g
��(ő���ݱ�"� �WG\TڕG)"�\勤R~TR
��Jy.TJ

P���+Qi)D��{�$��?��@�ݗ�%8���v�D:Ia��
���ڡ�7C��u�2�*Ex�.�Z�5�B-'1����R��nL*Y���QT��O.YyE'�JY(S7T
+�?��V�n4��V���uG%yK���7�G�����#M���p��p��7���i�mr���䏕�o(.��2B�g�+E�`2jY������I�;�9����^Z�P��5q�9ph����d�‰�+���+�J��ղlT�(
�T2�[�5�;��)��:��c�.ҏ*�\�R�G;*�F!��|m��a���,�g@]��<a�[%%vp�]$�e���
����{�ވ��Cw��	ϓ;���qZ6k�b��I��R�#��D%c��m���
Tʱ��dP�i�2�l�n��4���5F��BC�Jޏ4
T�.��o�\�/�;���%8��n�`��}l��!)�m�
��qޘ��],~�u����>h��8��
��ߐ��rE)V�W{T��G��FqR� �ɶ�P��J�0��%*I��k��4�Zպ'ƍ �D���◸��w
��q��/�}=W���dd;9D���Z�@.xR�J�\p�\�w����U,g��/�O�X*@�t�R;�4V��?;�.x��/
��bTrϯZ*�t)s�����A��Y��(�{��&��)d��:T�o�E���\)6��NC�)Q)3�M�L>�c��YW,�
��'��Vuvh���ؠ�ẛ��u���(���
"�`̚�
���
,�8�c%{n� [...]
�4��|�
*-W?���D%�9#*���J�u�*}[*���z�JK	*%� G�
���A�ݍf�f�U�Ct�ca��j���eZ8kf,w�s�Rп����G���S@��c%;�3
�/T-E)�sQ	�ZF���	�c��4VKʦ6�J��N���@%U���1�����w�eT�[��|���tP	���xZP�%*-E��AR�@ԩ���"(T�s
/��K��J�X��B3Dg��7��"t=G-��r�� �
�����!F�ڱ�1㿄ءV���J_����ޮ{����r ����Nd��86F�dw���B�HK�RDYeQ��δ����kT�D��*%*e�H�@��g��f
�Gk6���+Z�s�J�N���h1�9B��
E;TZ3r#��{04�����'Gm��L�iyI��
+u9E���G�}��@�L���S14���V��v�i�
+��ٟޒA%��
���݄�Y���A���?
L�@�T��F����,%*�?��Q���!���w��^���$��Wxc%��
�?<�;�
��53-w���xھۉ�o�8:\'C๺pM��c%�u�l��w4�X�*ᖺ4�U5_���+�g2��[LT�����䂾��U�g�*G?
�,�/����M�i�F!��S�JK7*��7��[n,m�߆���
+�J:��q�����J�hO�6�Q�
�
����;����Y8�%�ÍRx5��S<Du�v[	-t�X�1V�'�j'v�jI�?M-x���ȢR�#`�Y�p������Jr-leq�w#�6H�TՓ�iE�1�=6���������\T�=�J˖�
h�@��
�V����K|�L�6�H	�y���/��g8V
+
�[X+i������3�{�����H:\'N�G��`
e�V;Vrwh�)�5���@��l�@�gb�f����)��J�3?�:��X�Ӈ��t����(Q	߇��
��f���pQ��E%�,���D�����!(��`�r
,��E[��&�EIp�v��
+��䏕2Bׂ�w�Z��ox�õ�H�(<�x�-���D>8�hEb�
+��
�J?������Y͠?hkŒ�3?����Y��z�
+���bY�N٨��J��c�����NT���O�2�%���O�]
+�Kpŀ%?ۭxθ�n+�XI�о�Vz�^W]�vf�t%
�����xE�P^� N��%_w��D+�
Fb�ݡM��j�"tgO�,E�Ό�����:��)��B%�A_
H?�=p�����z;�U%*������ͱ��%�)��*X�J�4
T
+��m٭�,w�1F�.'獀�s���q��}gm�	�J�X)�4XK�1�l]�=X
n[���~f�W��YTZ6J�m�
��;
��\6��V�C��
2�j&R��g`,�*-c?jڔ�,�-H?����6�U�3QI�'H+?JTZ�Q�~Y�`I����Û�Rx�Jp�〒\��
T��b�f[�Vr���5�va����6�t���=At��H�[��m-��I��?
+ZZ��d]�&Z�Xi�;D,�r�������~3'ҵO�Qf�,r�_�d2�3*��W��.�)�sPU
HϹ(��JF%_Y���R�J�i���,�C
��Q ]����1G�iS��+T�s� ��Z��S�W�-�VZP��R��%A��em8��;o/)�b��9q���.������D��V�a����{�/}`��քcɢR�JD,��{^	�����ka*}�}.���aڐ��nm�o˫
%*�?ҴP),���N!a�
'���IE�Q�e$���R4ۭ(𴍍za\��`x��l+ɠ��K��x��2�Q����0�e%^*
+<A�A�$[��Z۱R*�K��@#,���`li��Fx��C+���P�n+.i>�;d�s�:
H�B߽��]Íb�U�\�����&�Jэ%�	��9XH�����6�3
+G�P�f)�턲+$���3�����-*�X�7X��K���p��uD*�³׷��,���w��5
+< �@)i�"Dk1�$P鳏�,.ý�]{��U�e3Kբ�2�Y1�
�=�:
6%�� '�'
��U��J�M���=KTJ�HA�X�-��eГs���K5	�ְ�f��}e�Y���
W�q�xf��;V�m���pY��,�%G
+�Txb��
�
�P�Z�XKk	<�
�
+����p�q?�%ߛ�4�OŦA�)y���J�����p���6V'�Yhd���O����z{�?�W�G�J�i:�$���ƒ?9�i�C�	�a�+N��v�u�o0�`�]�%�qE�m��H'����H�Uxz�V�k_K���?����ji!UJ�nc��O�՞hMxCeS|��z�KXY�a�D�̢�k��$1c8dm���w]ܬ����ܚ��ݚ2�d�˕���&�Jɍ%�Z�z~��
�Px����GHp~�D�[>�u+�P"��mlx\a�`j�����`��p�H�K��"���[g�����5�%|Prd�F��Ke�٩R%x8��
�
�\��X#&�14�K:��5��yI'4w���&��.�$��%Zm8t�6
��X!��jR��R?��ϯ���y�I�?JTZ�P�,��9�c
+�Ux^��mՊ�,y�.F
��m�.Z�E
x(���ԳEWdyr���� R1�]�E�1�C��s�j	�X�DZ:b�O�CLK�
���
�
/*9��6;����Fn]�?�:�R��|[��/��hVg9�KV�x�
�X�G G\�D����e�І;����/#�
r���֓�.����8�l��
�����*�	
+�Tx|d�������R3'�UҲp��Ѳ�miə�<���r���\�٧�Q6�;8�l�
��ndai���jκ҆f]�,������Y�p�.�do�<�K$v�%*�?҄Pɔ����ۈ�#�Hp�����	�͒��V�!�k
H�E+�Z�7Ax�-������gk��
-Ҫ��A-���Y�}��]<��O�`Y�]���uxB)Ys�5n9�eb�6���D��u��t�
ו����m��b�֊���I�B1�-_�W�Å��Y���#M
�*Sx"���g/#8lP��%	Jr�$[�?�y[�:he�V|�K�%llj���������zMp�@b��"4K��[%��@Z<b![ZC�_8*%kM�&��c��ϕ
•�B���J�H×[B��~���zf]iw����v���*o`:6o[?��
��~2�/�W��R�J�)<���!��z�E�)��VĐv��e%�^�
?C^!��Kk�
�
+Sxï�3�F�O�@��hq�~SjWK8a
+�J�,
�xY	]�tK�
+<&�
SM!P)�F�g�Zy�ޘ�g\�M�R�P)~�v�
�}t��[��#*��
��=.31a��\���#M�ܲ[4ז�C���pe��
4d���W�O1\����x3�vZ�@�.���xE!�BT�
���h�v������v�a
�^�w�Ҫ5&^m�2Z%���'L�H�Ы7\
�DC-�>��x��S
�>�k�bK�Z�Ϩo��4|�,ix����]a������q�ږ��u�)t�YZ�uZ�I�u��)�g�)Z�>�
H���%*�?ҔP�[%�[L��B&8xyZ�Cl�tTʬ�l�j��f�Ub�Ҟ�b�ZPv]E�.��i�k��Ḣ�����7H�ޥ��ʒ���`�������IH
�V	�� 
��?�:8-�Qै֚���I*/aMw<I�4�\Xr]óKuA��<}�O
+�q])��~�IDW�Ԉm�SS�,o�J�ij�[~13
+Jp�`��zf�D�$


+ xHd�۩҆�U�%�:���	x��v6j�y"�ƒ�ǁ�Q�oƁ���5K5�%D���+Q<�V���v��Z��+����\)�)�cW��F:ݺ�d�/,�C ��!wȟ��'
9�,
�]a��R>/:i����:��8�g7�RG�JT�~�)��;8�Lp���̳���l��cQ'

���IP®h�D�Љ�z�ց���dՅ.��d��NwY�]�}t�8V��؎Y
N�I�,YIC�>(�xN�BI3����!x��\
���%E�-Ntp��XX�7҅4�.,����Y���[U_�d�Y�1�ܱ�ύia��D��\CT�-�#�,�$�+Y����i:����ţ���ؠ��͒�WsX��
+n�[�L�v����+���H��	*%(<���t^Y�@���7K��%��89�?�x�V	M�H��?�*߃�J�&eqZ�RO
�䡒+=���_X�5
�����!�*Q)�ϕ��D	�{]))
�J�rW��
��v��W�G������H�@�l
$�e�>�2�w 6H6K��$����|P�
+�upZ%&�`	�r&���ˈ`}^M��
����S/�^|�n�5K\�Gj�ʯ��
��h��xN���p�u��Jzԑ$�r�)�Hu@&/�w9���Y[�?�p�[+�ܡN��
6b����u
{��sc/���
+�JT
+�Y=����sȶ
/Q���&�J�7G$8�w`6�k��u�!/����!T���S�;�%�X�0�)Tv���.�8^mQ)��x
8_�,�q �?�v�k�b�kC���ϰx�<+�JF(���0�Z�
+-m��5�SE�R�py�b��e3W w��SD�;T�J|��;�.�m;�7���;�\W
+�"�C/�M�2�.n���Ԡ~�
�
�
�%1�(
+���+u���
+�U"b��:,x�V3����^��:\|Qb��a��m�6�d��xm�Z"J+i�N��x �n�z�V�*3�#�ëo,NK���\G)r��u_������pw�'���pv���_|)�[q�7�
��W���=Ҝ,��,��c�Q�J?R at T�㋓#��qS��%-�S��ݨ��N�a)���BE
+m
� ��ݹ@
�,\�؄ʮ ���$�g��Hm�I;k�$�Z�Z�����h��Jw[<�T	�������L�-mu��7����֞��S�g��C��#�U���\|�V
�%�!;�

��ɏo���I�u����
q��\�%*y?R$T���㡒#36	����m�hgi�-xH�u�����b�$�;-�B�O�U2�R��-14����u�!��%���)�K�`�
+���+�m����!^�}iXX
+A�
����s]��wʰUқ�4��݆�u��<���$�����9�M6#�7�;h�������
����T���0����b��b�۩Ts�`~*�XTF����L�zI�����jp6x%*5&TZ��G�R���q��
�ѹj�`g	

�lu�O�n/S���������ᰣ���C
	�C�	������F�Õ+K4Dn��f�w�
�
+�x��5��! %��Z�(¨x8���f���,
��_VK[Mp�>y��f
̩g#w�1?J��%s�΃��?�V�ǕT;��ٍ�O3ۋ!�#���i�C�����a<5
*Q���B���?�w	N�; �G�Y:��a�
�A
K(��+���f�+r{��^�$��W."e�'Z�U��8Y�ҿ��fF����ӭv�6K ��W��k8XJ�
+�N���
6uPJS�͢��֡�/�����AJ\��.���C��`)A�>�\��f�����t��;�.xIT�>����㪫*�Lc8�&��	*UD�</�y����4d�%���`��[��[sxL9�T�.��2/�Kp�ߑ�
N#�m�Bb(��*�R�Ò+���ߎ�e'�$/��fɨTP
�px�y`=-Ja�
���A�JӂM��ӿh@@�D�JQJJ���(�;`:;�Hܣm������«
����`wv3Vj�>�
��p��^����f�e�a8T�R�Q)Wƫ��7Q��8�AM'� |}�d	n#���n�ãʮ&��%S��0��8��
�C�lӡ3f��l������6�e�_�_�q �+F;i��
�Y�*<�x�gA���BP���s��\�gŝ2J:ӿ�Z�H(Ґ�D��AJ����z���z���&��� ���3&xz�Ԓ�J��늷sK�
r	Í��_���y�p(��+Q���ڢR59/�
�/�\Y2���	�%���!�� 4F>|���$^ J�tࡒ)�7���]��
o��,��:�!�;.�� �q��NҢ��,�ī���h�`)]<��
�H��CW�Y�

�JF.�^���ǥ� }:��������b����n�GVϥ«�|�N��mf�V�RX,e�
�C5��p���w��׶���C�����̏��R��
}��O���w0l�i�hg��R`�
Bc��9S� �H�eA��4��=T����3�F��o��8�R��Hwy�\�w��g���
�%T��œ�y`��R'��5�;
��JY�cOp��*i������%ߞ��c��L`��Hȡ&�ݣ�6Ao,��l��oPxU7K�F�p�3��#'���|�	`�;����tv�w���z])\�Ek��k�JκR�Jޏ��"-'�{��!��b��,�

)L��

�AzJ��	J^	��(u8��q�s
8�]}�M�Ur�!�S��˃@y��K�
��g*B����xE��'Q�gGK
K	PB��)
~+��R&��*��x�,<��K�B!"E�)W�l��
��MЃ%����p��[Y�9g NTZ&�����|��[�sx�D;�3r���4�×�gF�hj����
JT�~�f�$��؆�[c�%��l�h�Ƙf���
��ޖ�c:�6�$s�J�2%8�w0��®�î�]%ॉ�,TJbN����5��,�
/F��g�nЖ�G�����4ͪR
���|��;���!(
D�$-�*k
R��y���#t?�t�;�A?
��Хg:^FG��8�‹�R�4f>yG� xF�&x��t%���&����+~W	��[[f]����%�!�D{�^�mn�h��%*y?R#T����/�~��
��95K껃nx8������Z��%�xȀ���%7�a���D�
�t	���F� ®����k�,1$߿(*����T
+���I2���<�c�$�4�@��w-�ˉٟ�Ѳ�N�:u9�/

�6�i��P2�*a�w�����E��;d�r;^z�����߾�J
�kZ/�,^�4&A�
w!_���Ѕ�%������X).v�+
���!*���
�X�-Q���ڠRf�K����O��"	�4K��4��1fHu7
+�[�� -�B’#y��v�DM��
+��3������;3�HW����k����dCR<4���Ǿ�cd���%�Y2*#xP�Ğ���<Pm���ō�i�DGK�;��:w�U��!h��u�����{},
}����K������3X�#Џ�KH�aN��S�R�,怒�u�ZC������&6w����/?*��]W������D�+������R*�Ub��tC
*y	�%=YRe
+�`HABc��ң�8,�o�$s�a�"�ļ�.�[���L�V�
�F�<�*��.�JUCR,6�����ZBj'�d�dxh���+
+
��ؖ8<9Ԋ�}������J^G��������⡎�R
���<1\�9�J�I?��
+�hÏ*�?�CϑK�aH*f1��;�����
+< �:��	]�󷕪+y,&���w/匽�YWjkו��hKT�~��Ox��l��%��_�d�D�.��Qh�
ޡZ�EJc
K?�$���K��ȹ�KvJ�>K��)��l��
N+P�W�0����K�J��3I�k�
�d�s��f��f	U*D���œ*hz
���3-����%�D� @Iv��H�
�w0�#�C�x��JqT��(��o�S,t��)�Sw�D�h�6\Sx��#'e�Y��R�,��
+�J��W�#�n$�if[�+�;Hax�n/�
q����K�b]�D�ď� ��1)N����%�oL7Kh�^ R`�
Bc��?�%�e�h	��j]Sx[X�W��`�
)IP�	:
+T5�C%S�#��
+-�J�ux���+�J>�G1�ʚ�jX�z�Y%R�0�J�O�y �TP�`�%KA��1�*,
��)��
+�;��ԁT�~��*%Q)�$��V�
M.e��ϒC��#m�K��"-z^'�,������\���]X��X��
�
�i.ѿ�
+�@��0��L�{�1�-��$sz�Jޏ4<*�R^�R����A%�,}4K`
�C
+����
�Q���L)8�9�䧸%�����T't
(���B<T:
�w���������T�C�
Lrp�St%bST�7KL�N�īO��`7h����*͖V\�1�T<�N��hq��w8���2<���(
>���J�������w�`�C}�Y_gDݫ��c
���/�'Og�1����=

ُVh�
f?�b�ǞyN�f��;k���r(
�����Z�Z��_�>z�J�ipTJbR8���Y/��`I�[�8\4K|��\w���)'
׾͑��h	� ��
���
K�vi����$�� 0�h���
+�p��%8�w��	�
+v�]%����v>����d+I��Rv�$�W<�x9�mh
�ks��X�$�R��!
���x P�
���ђ"��w����n�<+�O�P2�LB���d��RF�D�܍%�_�6
)<��:
Zۢ+�o�rz�+XiL~��S��백>μ?x�=;x��!u��O����
Tr6��
�G��b�����0��ۛ�u���ihT
+s�Lw���w�p�E%!�͒j����ḕ�
^��N�ҩ��fJ�5
+�(�IX�).�Ku&����28U�SR�d�8Tj�A����<��;3��
��U
+e�0�3�;�D+�U3䇥D-����x
s��(��h3��
�x�ċ��u�%�HE������w��Q�1�?�2$�w#F�z�=��
,�P	�&D�J<��������T�qRFg���ٝn�ѽ�m�fI_���#�i����w0�U�6&�I�]a���A
�7A�/y�>� �8�?2u5]W:Ź��u�D%�Gj�J>��:�Y'�)����	�s�Y�UZ]w���!��hJ���:�iXZs
��t�%�K�LN�$&�\ǣ
+���}{�@%����v`�YxV���
&��l�f����[4�� x5ē���<���՟������B�����w���%�YMG
����:��K�Ҙ���R^�eAX�g� %�(&D��<��a���-Q8$Z҆O�)<pvW5
z����ɫ��2�F*�y��BV�Ͼ7k
N�~�y�B�
+����+o�(~�>��F`98�K���J%*
������~�LU�R�Y�C��T�
��!
��p�R�
+�
,�@�IqTz'�\^d���a�qP�a��{�8 u]0T�:�w��M
6����vP)��CL�U
*Uh�\�u�](�$

h�;������,�Z� dY�OV���a
M��
m��X�2���\�ÿ	����a�+��(
b�4J�4 }a
�LL���K&B�����5
K��\��E�G�[8�R�
+���' %�:�������]-Y�p,L�Z��.���$�
MJ��5�a�A��ݽc���TTJ�����|6#���T&8���!�����8<��p��S����	B<�p�~��Mq�6��T��h!&1{�5���Ҏ���J
*�
�wwާ�(��v�l����N���{ٺ��}�#��{�x�M3XZ"

�q��mS	K̼&Z��y0�T�xX# ��ڎ���z�O�ˈ���~���!W�D%�4&1 ��>�L�K�]�
�xV6�:|R�Z�
�����}Kn�6��`�P�ⱌ%���]%>e�'m�qf�<������³�f�8��=����
+�p��–<�fT^�R1P)ʅ3"e�g��K&��dV�Y"u8v��{7����L)hx���~�kX������풏Ku�r�
H2�I!S�G at i��aX����P	G�g���$�x9Z�8&e�����D��*
���9<=t��͟,�@P%�]ҸT7`r��(���v�c��E�?{�m����O�­'T�V���%�$F����	��qɃ�
�ӆ
PXt��t<��d��W���2�*����'�~�<�
V�
څ�qf�=��g</�X�e0�q�+��QH���n;m�՟|	���KT�%*e��E$g:�L����S�f)Vw�C

�A0Z��M+
<X��L��*Jo�
0U�LˈD'1	�oJk���*Y�@�k��B����A�eJp���b&L+H��v�ݦ�I�l�����K���瞖

�m�Z���%,���ٲu�%d�����J��LI�Ѭ��=�,�����;��ÿ��C�P��&"�S>�L����K
*} [...]
+�Z���=]����\����cٙ�9bl�D[˶U��+�Ž�&=���o�����z��O�:��V;�;��f%*��d8���~euCY��Ϫz�E��u7��û���`�S����
ǰ�J<�% �L�c�åe�7(��d1��o�
+��
�qA	��t��
t]�'��N+���w/w��`WC����&B���f)$^gh

�)h S!
��,a�+c�"Q��Zb
�0H�P-粬^�q"P"�����=�:��n��;��h�G:ɬV)��
%�I�H���3z�"2i\ʆ�T� ��£E�G'���3��;7K��O�����e�B�qyWC�������.h:HN���^��:�����5��܂3z�3N=�X���c��	�KT�%*EA��j�g�x��l�O�r)ө���8<��h�S��O���xTx3,��U�0�Х7�
L�{��R�&:�Iz�D�ڿ��Iv�p�Ên=�>�"�u
��Jp����]�Z������W�#ZY1:��o�o�h����<�x��u���
�A;��v���]4,�O3�~���%rgD�P{���Z�x��4��т"��;ZU
+�9Z%�5b�N`ҧ�Ahrp�Y�ʰ�
�
+�M6M���t��\�D7~Xs&��ߚ�e��XxB
l�8�M>��/�J�ȟ�9���\��O���t
]��o����Ko�
���^�RaP)F�e5C<���ي�Y/��fɪ�Ah�

�����e�I�p�K���1Vސ�
����j�ܲ.$���s
�*6����<��6��Z��]����⁨�u�����iEF���RZi��x�V��X~ˋJ~�d�׀��y ��0h�uh{���\�uM3يAȪ
U����.(AG{��h�"E�wr���/�B���S�)J�QBLHRH�z>�G�D&L�K�]��R%T2g��am���=�9����
+Vx�l���oY�����)
+�*��1q�OY�'�b�u �V�����	{Z�W��D��R��
g�酈�Yw>�]6,ś%]w#��Ԭ�SI
NS��}.8�'f8	K��)��8j�<\��d��b�3��r.$Q����ꚽ���6�S:�@	��/
 G�p��K��i��r��&WC���
��
��w慥�Y�K�j�Y��`
��֫g��A�wT��,��’iq]�5
��O�x��Z�u��qR��o˃�f=�4��cG{��(
+�gYg�n� >�8(}��z�
& }dB&�K*|>,U@��K%(<���z��f������
�qN�1,��CB>s�+qr�\��w0o�{|�
�Xh��^B�ъ�
�I�;��C)�[k��cx�J�G�(.TC���Y���/Z�����ɺ�txOΜ���;GÔ�A����3
�h���z�-���Nq�]
+q�f�*�E$I��t�M�
+�
7�d������ww@��sz/t�;TR%8�����VTh�"��)���P']yQ�wó�+�'�Û���{�8M�vKļ����Z��'?6����jB����a
]<l�9��v��?�߁v��hYGÿ��O��&Q)J�(��I
+�}��?��ᇀL�K��v)',��|�SxV��
�15�AW�.�s#<Z���k!��d0D�y
iL�A;�-���j�Y�A���d:h�o��
��6l �o��
���Z�R�P)�6	��p����tC��nv5	έ���{�Y��p�t��@�0���4,��ß��ʛX<[z
\�����B������t��TǤj�P�����Mv
+�:�����5/dJp�;���v�Rt��Gi��JX��,x��g9�i2h/�輳{�vR�c�kX� 3�n�����6d�����I�9k���t�`@�i�s/���hI����
�e�$+��m� �T�����O��_�L�cB\�v)
+KѨE2��~�;�8�4K�a	P��W�,��s�Y!� ��]�c�v\Uj�O�u�Z%���Bp��?Y��#��%v �!}
ݺ�		�J�7����TsTJ��
��	���p��<��6K��c:�GKw��a���
,폰�V��F�K�<`�4�+�-����ԋF��cJuz��ޯ������j�
��€RwJ0�@��W����N+�H
R�*��Q��iEW~TJ5K�i&8��m�FR�.<��3�,����!.�!�Z$T�I�Q�寴HR�#-��w (
n��;Z�H���q|m;��V)J@�&$�����������? ��K�.����Hx�%{����=�Y“�G��F�
+�����q>|��
�%mо#n��;$�
㫿 ſ�d�ϐ�`�������S洬�{�h�7��H��yt���ȓ��TT��R\6��"���-�fɭ�

�p�R�v+�eR�#XB�����s
+�<`��vi�uL�3I�d9JsΫ�񬰂i�
$ј�ɻ�ar�f���n��v�c��Z
�B ���(ᰂx!=T%�;��
P��-��XI��	��i�,�A�]Z3ZB�
+�'/<�,K-���51S����V
CV]�tC+XV3���a�](N�)Y���uG���^BE
+L8*
���
P��s�'&)H@��_��x��hz���]����C=t �y(<
�[�,��.�
ύ������LQ�p�V��{}�=O�
�;^�����O��!�:��Jn�Y�bg;�x;����j�J�U��
���1ɓ
}²!��R�K��^���_w�� �RP���3���#=�%�Uޛc�D���K�t�chJ ��{+r�Ӑ�3��$US���
�
 �8+p���pXA�
���x�W��"�$���l�`;ٸ�X�ReT
+�%��
���@-���x���t�̼������p�D�K�0
Y�Ń�КF�FJ�x8@���YI��t��H�
�e�F������7 ���{�]x��W�I��x��
^:<��=n��t����
+7Kp��O��7b��R’д�"^�J!X��;�P��d�pɠ

�x�4N�����K����ɣ޴l�t��Y��U�
�C�q	^�JE@�pD�uC$�Xʆ>f`��lݐ�b�[�u7qx�%RM)`��ᮼ��R�c�>ⰃZ"!�)δK.a��d�z��^/
H&�q��2�Nu���z8Q�|
U�o�|���ܧ� 5VɎ@�"��F
+^u]X���}��
��(���Lɀ5=����������*�R(x0
�kA�J�R_K �� i
L�~ih�����$Bf��_��Z��$fY��������z�Y���C�����*y��O
J�I@z睷�y�
M L�K1XʋJ"9��Ę+X�I�'O�Ғ97�ai]WӺ�S�E��<��*T���.'��m
F:���u�4�6V�|NǕ���
���� v�~C����J��>�ЇZ5�!���|��n�M��
8<��H
S
+T<�
ǰtb��>����V�.��	s�:6ə,����J+�ޯ����@$xϸM��D�7�Ϸ��Ҿ�xH��(�!(]"A��~	.��t�� %�I��~�E�ـ!\��!�r�R6�'�
4P<�|�
+ڥ�
,��3�N�+��5b![�y�(�����"y��B�n]<`��ՠ���hGK�p���$��͵�%� ��z�M~�zK!�j� �
X��˯�h)g�$�n�4Q�
�s#|#F~�F��f�Դ���#�����D��w݅
�����Vɜ�������/�
Zq����<g����;D[�R�Q���,(����?��!~�adCL�W���Y�< �'����A�p�N9�s�vm�leR�v[s��s
�L�bA�#lJ�`��� &:x�&Q�
��*�i�t���&;JLxy����rZ�P�GAIV
�r�!?� Á��/qAWU��'�y ����Am��P�r�iqu�6D��5��9�>n����;
+�8����E��� ���V+R
�.�y��*�Ę�B�Eo�����Q�oѢ7�t�da�+ӡ%�$BTr�l�'Où��(x8������%�LĪ-��X�-
+V_c
͝�U���u�c:���`>�N�M�[�����h
ݡ
<���g�~2���A�
qB/Q�V������r��z���g�駦]ʐ��$9<K�@�4k��G&�wa���
ߩ}��P�R
h�]�
gp��o�r��$4��[�BYN�d��0�Q��y�:"��ȍ�*�Q�кm�c��d�
��=�`��*U�߹�$W2���&V�
� ��_Xg��/�ʏJ�fI���=IAC����-,�@�W�O�h<�%�t��S7b2f���F$
I��W�ژ��þP<qR�D4k��
+EJt��
J�����c�"H
�F�
�#0�~I�RK�f)
O��7K���߈�
@�u�wO�YXĪ��W��b�Uܢ`
V����fE�l;����G'Ǟ�[��)+��]y�dvh�E����wv�I�JTZlT��n�{����3*�|@�H�P5�7ֳ~��REy$�
�3�x�x*�YX�����O�z����R��g��L��9p	S}0a��<�g�Գ�$D$|��{ƙ�bLϩQ�
FG��N�v�%�u=�У0��3�Et
+����;��rl���#g�%�b:�ŝ,y�@/hX:��:w<F3����F����C�*=�@�P�NQG��Lޡ́F{�r��1
������f����h�j��h�Z�
PR�a����^}u��WԳ`��W2)`zx<f�,,�'�
	���
�r�`��.�
?x��ӯ�g��n��Z7�?3шC�`5�rk��\3���4ѻ/^wA�	�
ӭ��d�����
+��pء�3��CB�P��b���K���ӗ�����!����V�
1n�AQ���3�%R<��ˁ%�[:�י��
+������
ۥm)�!.�|��
e9��
6���y�o��
"��$Ĥ�	��R��v;�\���!�զ]��'�|�g�k�
��e�qx![�dz]
���U�
b��~��/��z.
K�\X��Rt
�A�=s�U�;���N�@�gZ\l�4.�"�S'b6j�t�V�.��$$Y�H����
vRy�(�Q�p2,���+AIҬ��
)U�J_-A�ػ��ELR�� ���y��W0)\z�U���D���ۥUn��K5K/j�B�

�񃨕`	H<��o �C� 2��E�P�����i�������E:9ƭRR�A�I<t $S
=V�t�

ۮu�[�[󔳃;��TsTrZ%
J�~���Ғt�C$h`�����JMhCXr8<3Zz�-��
�
+o�%�[��s�B�s�v��q���<��
.�g��A&Nt�r�
���8�sGm��0� L"�n�
wޕs��۶��i=�Vɮ�%�u͠�L�`Ô���;�^�dg�_���X�P�E�(�Y
+8��l�@�0��&����
�ymkc֜b��f0\2
��N�bA[͆���U90�Y��x`=
+(�UfP����i�xG����[%��������o.z1���ϛ�">���W����K�.IX�9�
+��LXܓ����`�a�����P�L7�}��d.\�	"��&_]P�fD&�J3
k��0�<�
TᏑ�O��O�����c&x�#m9k���n
�a�V���;��TST�<!g��jַ���dCR�*'��:���t��sP�x�poiP�>�{Tސ�Z���n;7��d�
�V��ԛ�^-�t���<�WW_� ��s�6��wC��R
�w� )�N�
`~޽���]�nϔ ��*P�a��D	�C�%�	�M����+3�'�um��y����!��q��@�Ԯ]���nq�S�
�����KTK�\F��L>��Pq�@�Z�$fYw�
�w8R�⡻ʌJÆkPb�5�h����>�)�	��(��w`��z��_{!����}
��s_xQ�˯���K z���K�����ap|cw�Yz�o�8���zLf��0e+�
��@��sc��x]�~�,��z�|[lS�����4����:3_w���[�JV���O��?�Ys

�J}p�$
�A찾wƢD�zA�9s��ˉJ�"�?f�De�'g]�����g�q�Oܪ�
+XB���R�ρ�{�
{KC"B��)]��ku�޻#%D���&��,0q��W�3�:�ɇ~�g?ӀiN�e�������aLA����^��F�P`�:v>�n�����
/
��Ai��W_��_�W��fU�d���;T,��~��BO�:h/�>
֖��w���yz��N8Z�V�.��N;
+\�H�l
EL��{�P��6��v���-
z��q�
@�^�P�v�U�Jv�dA��T����I
+���g��ϳ�>��&�K
^]��"�%�>�Ձd��
N�d�O?��������Оl��:�
L�**���b���r�	��P:�Ltx��Q���m,�\�>qK���������f��Y��h�6uƢD���R�N]�B�X���7ҡ� ���� LZ7$�,R#
/�
�Q<���p�,�W�k�^qi��!�u�v����ۛs
�%9
L�0�16���N>��kA��,��yδI���I�ꀼ����O���9\t��ˆ�����h��A	&�#7���w	P�zAGE�-*h��/���EX
+j	/h��԰ݒ
^pH�N�l[ܽ� �qi���eR�j���y�o@�t��4��I�S�Z�p_�q�p��t��h�G�̎6�U
+�J��\�b�s��y晧�~
+���yfγ�!.A��護5,}*Z5�U"
!��Fbw���뱵�d�����p�Wv?b�c`��
5��;��U��h3
c�?��s�x`�'��������X� +��J�C;��TKT�RV��WGϺ�լ$g5kqX����S
+�tA�3��;��2���R�i��x���.
~�A��
G�IN�T�(�A�S��2
>k9�"�8$Ls�-�D�7f:�I{���
|��� ��R�~/��kQj,A�&�"�!_W�C�{X������Q- �K�P)1�����1X���~}z�{��3h�Z�4��A������j`��DՄ��x���C6��I�n��
��z�'���}
(	�5���>���H��O�
���-xy�<��g�~��'g?���'�|�iĥy/����
+��R<8�s#o�N��g���q=�|��3:ƥ��2�_
�uM��M^�Q 5�.���h6=��ko�y��ΜӠ=bO���gM���x[�l��Dc%ܡ�c�@�P�RP�[�����0IZ�y�Uڳ ��_�.Z|X��
�9�i�`�֑���R��=����%��Z�xI���0�,GȄ�D��/|���=��e at 2���N��E�r���ݞ0i�}��A�n�� ��Ҡ�W^�޸Q�c�C���.(9��
F��Q2��
P0@��V
K�Ë̱r�R�Y
+���4���q �̫ʀ=O71;���"�J���7� bn�l��v�lh!R�IH�i�U���ᆛ8N
+�f=5ǣY��6��c���w����
J
_}���/"&)D�5s���̜9�ـKϫv�e�% ���*ɰ�%�;Yz_�f|��ɴ�k/Ɇ)����2��B<�R
~�+�Fz�
+j Z� ��:q�em�?�3/�w�9��su�|[�M��m%q
=�C[�R�P��~�j��BL����E�W͚E���ax)�o��5�0����'=x��w����WR��u� z8�C�6GA���{�](ɩb&L�����<�z� �Q�s
��� � ˩�� Ҧ I�M�Lǘ��  �T�͹
+pU
�fč7������EA��8������	�-�B��ݗ�-z��_����
���ćZ��+�
,�@
���������1;��?���z\�^��&&]L��A�8fγ�z\;���~����ڷEK���ޓ���W��A��QTIjPz9�I1T�Y}��Ҽ�v�¤Y3�1}��i�
�6m����D\zn��%:3���� ��������
+{I^����fF++;/��vM)���.�"%8q�"�����c3�����-�
�Ru�̯B&xζ�;V�whKT* *��#hP"A�K��ϟ7O�T��5���5
'�f��<
-��M�ma�I>p�]@��S
h�]�
w���K��v�
&L�[dhBlR��]���c�@R��9
I�=�z��v�Lg0	�;j�z�}
�0��n�-��{,�P�Zc�rK��d-վ4�
+b�D
�������[�D��Mz���<y�P<��4�a
�:䲁���ܳ{�h</.�dBF�\�;1
ٯ�P��JEjK�TsĤ}Z��N7J�ޝo�?N
JAG�(
b������M�Ҝg�R�4c��ǦN��z�L��ش�
+��|��.YX��R�Y��
�U�{��a�{�o/	�dh��:��t�J�dc��,[h5Ю�B�������,���x��o�#�����"�^"�t�|[�S�����R�X�D�b��h��>:��ea�,^���4�l赅o�5��͚Eu3����p��y�
���}w߮*oJq����v	�x
۷���&�]v����9x�T�S��`����o�o��kC�r��ֈ�%B�I����_a��c:����S�QR��;U�:��{Ǝ�(@IuJo�A����+��QҘ�X��+>�8�c�D��ћ�|
�-YX�<Q3��^�%jq��r�� �C�U�K��z!
#�!��R�� C�����َZ¤�;�(dYA��ػKt�0�{Ǝ�8��)��/��rA�iT̊��*({��'&)Hz���3��G�LU�4k6��<KF��PxY�]]k/iV-�-Q���X�G�`cA)�ɫj�X�x
:<(]	보"�Ol�o&)w�
+{�
��W,HN���	�����JT�-*�V���>������lY�5����]���n���ta��Y3Ի4a
Tޔ�_�ڥ�{���d�q���~i_HrP}c�ۊӜz���R/�Ju���ـ�+�u�qPv�W
�1��m�v�E�h��>�}��X��K5J�
�

+�n
u۝��?~��)�T�ӝ�%Sy��d
+P�b�_�J�|^�ĝL�%�.,���\'�Q)�%�,�n	�׻�y
:X��@�9J��l;D��	���̄J�2�j�M9T�x��~)��*L��_����Q:�󁽻�*Nc���[�(�Y+�wPr�
�a@	FJ�B����Ǧ<:��&M�8q„�'=��I��
�.=Ͱ�� ��;�c4K��8Zra�g�S��v���©�J�	X'�X���`3�rc��'�K�#�L ��E2Ө|�*�J^��os�	<4v���s{�m����N�|�
Ķ�w
�D�Z�R�|`J�o���k�p�BlY<?p	��i�aɾ�=���R
�X��
���XyC��A�KPzC�;��c�(��'L� ���Ȥ^-Lt*ө�
^0��_8�L�aPxo�yn�
��؋3]+�$�ꐼ;�ˇ\5��o
��'M6�NwJ��)
<�
P��Uu��W,暕L7(��Ru��UK�ڒ��@�����u�`��G��H�\�
�����F
ҡ��Hq�6�
	�Y�%��N;ﺛ���G�n��"��窴���#n@����u��wA�㺀���+�"�"(=��ǪQ�6UaҤ�

?����0���j��|z�xPǼ�W!Ow�,A����u癟1���
+��1�xu�-�Z��u+z}�XDb�!0�W=�3k(2aP���!���7ҏn��Z������b	<�b���w
M�b;�%*-YTZT=*�r_����"PI��g�4=�e�����Y�ЯSa����F'�����L፰��ϩי*o.��A�i�0�A�p�h�=@ä�*��T��� %:�����	 J>�+
+����I�b�H*�5� I�g�MBLj�1�ē��CRH�:,�qT��#S�Ϝ�Ɏ��A�a73�J�X�A	�kp���T
�@��޴+���{��y^T�	�,��0����K�C���k��:�G\:�{\&SK4m�Ð�C���ʆ�P5HR�Z�$��e���J��ށ
����3Y�R`���p����@��S���FIa҄�=p�ر��w�ر�?0n�¥ɏN�����O�/�gZ^�C��
n3��`�TH��P��lV-��+�	M�X at 8�����FU
�X�
+U %��M���
YW�v����B@}�򤔽
+�ި�8��bq�~{�m���?9V*Q�����Ҟ��g�ԓ��y���<��Y�)`)���LX�܇���CBȤ�[E��9�q��1GC�����z�v��D��.�z�
�?���"<�W
	�
������@�t0O"L���({��У�)Pz�Y��⠔���g}��bX^a� X�|�J�TL^FXz����"�|��R���
��
7V��2f�sV��*
*\R���q[�7��P� ���Q̶�R��ҁj*
T>�
8VȈ���N8ɲ���p���N��4��#1@ ��RF�$=/�y"Z}�U�4~��c������{����&�viڌY�k�z� ��Y�PL��N�H��
zF
:���re�6^,���A�^��4�;��!�Ƴ�	�CFnYe9��o�s~�����	V����O�̺�]v؆o+�c��
+�JΜ���c(���֧`�b֬�3gΚ��K�.Q
+
a)�j����b�V���y�*��Q"~��.
�s
�z�0ɩ�
+��z���cwF&�n!6A��
+����у�^.�F[oCx��in�=-$u׶�z���R�75J����tO?;W�q��
����8(����ɜ��>X*�F&L�q>������T�sx.,Q!�_�y��X<��x=��J���+4L���\ؼ���
���J�*V*�U�D$k���ID�a�0�GF��(`�)z�,
�$�d;^úu�5c��
~p����{�]w�q����λ�pI�KS�74�:��xb:���	
t
�Bm	��+q�<��ªEk�%�a'�`
l�F��iT��	�]L^����"	
���` J�ց�X�ZC౱
G����J%*
�L�􎪰.�E
^�{|=����Ya�B��\��=1?�
-U�%*5���A�n��
�|�8�K��>JU� L-��o_D&�&�&Hu���m��~u{��
���	�
@$:��:
۹KW�I����i�� �Q�z��΃ܢ�]�A���Q
�k�8�k,T� J����K��Q5Wը�%>��
+���j[�!�
��+�R�cu�A`�ZbO*&v��!ӑR��X�d��}�kA
+6����S���������E��n�dJ�
��
�)�u��ns�>�	����1�G�
5j��1��~�]
+�T����$.��Oqy׆������T��\�{cn ^|!n��B�m�_:Ȗ	�r� ��`l��@�I�Q�=T
##}%\��י]���V�
� n��L+���c���qtm7$sy�J��JoW�J�M�-7�|�A�'������Ӧ=ϴi��7k����>ρ��t�|��$8W -�Z@��{M)���v閑�_{��+.Wo����(ɩ���鐃0��yޭ]w�T��/�������wR��$��Z���$Ht�M:�����
1I��K\J��M�b��|*�*�
�҂\��9o��\b%s��0&���q(
� 
�w���%�JiX�Ad^y��1�v�P�
+���ܕ��6Gu��%Z`� ����q�0R��U�v�dh��TB�����OdLB�n��w�s��aA.PJ�R�����u�T���{����=��[n��[F�
s��w�;v܃
K�h��/H7K>@F'\�yų��
\r�m2�.�ҵKgͫ
�	&
��p
��_�C�Q%�XnU �
�)���������������Ꮇ��z��w�V�1���
Y�p�C[�RmQ��|E�?��OD��x�B��?]�Cr���S�ʛR
2BTz�
�t�9g��$w��#Z��[!SK�&�t�z)x������c��$gI�9� ѩ6	3]�3{)L�T��75JpZ�5	|��;(�>\) ��>,fb����dH�r/��E�*ai!~o@�G,�hq�z\�ѽr��,0A�Dۇ#�Cf
�½��Ń*ѡKR	��O:Uc�wW�FI���ZJ�((���V)��
�{�e���n3�֛oy�
��8�o
5�����c4��Wݚ%���XB=F�Pw��%��żq	�CԿ�ԕ���yv��
��
�5�gyJ�гXwJ^K�
�&›�X�DZ���u@<8�t�@&�ڷn�;o�5�ra7D���m����J��U���J��Ǧ<���ɓ~X����5
m���R��%���ܥ�8���ɓ��1
丫�
̸I����ڵm�Z�X� �4��
R��{�ް=�%��B���*ũ�
���r�H*�a�����g��0I�: ���\��#S� v.�
�T�P�)
>���|�j_�T�g��	xq~|!���"B�,�!����.����W��^"d
��h}$!�1ŌC��J�B$
��I��b��V�t���a��,+��&?*�����-�S�͍�w�I�������r<�4�6�֛G�x�u#F\{�#F\w��#o�u�mw�-V
+�4
��!�,��/���0K�����W��D9���˄�M,0�u��cp@7��<
�݈�
�^�3jPJ�
��U��fY��'����Y�'	�M$�ׅ����Q��<�$����2
^&r
�Z<��<���h+��R�U�xp�u>4~�z
ĵS�輛h<��.]���Y�0�r҉�1uhiN�L
M*��륒�z����k���
�
Y��9�$��!	�$��.��1I�:"��A�E�:��HI�)�$;�
��>�J��TU*@�0�(
�}L,^qm%hm�k[r��-��v H�3
.��%��z�ƥ�LȺ�Z�h/b2�?*,
�ZQ�H:�n��Ox��+��,�
���!���!� ��S_\�M�n�T}�Q�t�u#�_s��W]u��W_s��o���S���x�f�K։u2i	����{�k	���#p��d��W�2�
Q2
|�
�č� Oi�
+}*�	Y��<�.�<��A=�uZ�������ķ��/$�~��oҺ����JQV
����I�4q„�0a⤇.A�m<�tݙ2<��xp
�\sK`���[�P��T��p������E�w4L�庞Х�Js�Lm��ۥ^/�~
t������4:�P|�T�k
=R�Pz��LA�I����<Ia�Ju��*�
��)4
� �k�_��B4�e�t�;�?	a^3+���B�`�G[
+�!�r�RX����f&��Ƃ�֛n�n8���{p��0�Z�ID̄�>q�#@������U��b7�ԅ�I�P�~�-�(P�H���Q^�����
�b�c���ܤPy��W

z%<C�]u���S��I�
/֒�:6K��Yr~�zo8�4��E����@��e�=
~��~]t�ʘd���.�J��!#�R���7^5ZXV�#��ZR�a&�~�%*����b����#?�;��3n��'(\zt�c�,������Rh
p=������z��0�]�&L'wUi��=Bd:�z����a��WL>��/�pDI�]�
!�u���@�I�^:x�P�Kn�%������^�u/��)��L��R���5Sɼ+�
�uLȋ�}�:�R6,��+j
������܉�+�Ґ�U
Đ�����ı������CE��
+�3��[wnh/T������1
(h��D�+
2�%��s��B�6E;��*j��]9����3��!C�]�=7�Z�{�R
�i7]W㽱���
KI+��z���*���L0��`�s�� �@��!O�	�T�C2}��4V�T�������
��
ï�#gu?�KG\��^%c���
��w9�Bz�Jޮ}�y�B.��V��%��Y��>������Oъ�*o�p��nT���P"�K��a�}��
+�z��]�9@&�s
;@�S�ޯ�G��H��_�w�z� ��# uFD:�T�s
+� �A����ƤqPO՟�Ծ�S��%`������-rTC�G�y���%`
+��SZ_�f`��V�uD�T��3���}Z\�^��{�:
k	ȅ't9���R5AS!Ø��b�cվ�.
N�P)HR
�E�+�����{�e�3Φx�:N���%�9��:Y�З�����K
�g��F�%�i����
��a���%���l���9�{CHZ
���+�^�L,�ץM��
,7@���.�FU#.�;���'�'��KR|
~
k
��e�Kz���
��Z��3^J^�R�Q�[���0
��m�+L���{�R�X�%�ν�q�<L�><K�$V
T�O���*P�t���
|�j�0˩�꬞*͝�z���b�;2�z�ڷo���z����];�p��<@�W��n��~F�3��u.@�I�_q�U�\{
�0�!y7c�n���6}E�l�^5(Eu��Qm:4��&B�*�`��'�o�i�w�.�x�*P),��mjq������J��	�2�q���8�4@&'b
 b
3���c��D�P!$q� �3&�čY���nZ=��ɊƩN����!?@�����/
4��K�ӯ_����2
�`cξ��?�[�'�&�%��͝g���Z
y�ëŒV�>^,(���ttb �t6�oH)`�z
��yr����[���W	p���������e%��O�
x�/=V*Q����
+�BR��0��@a������\�ޒ3�񛅥�P��-�8,�'k33����o�p閑*�Aä�I|*ͩ7
�z�0�u9^�_ǩ7��NΣ~��� ����
 �;�9h����2��a8�y�� �=��09�1+��l��;�k�|��Ha�	X(`�p���T&�ۏ�0�VP)K�������q�;Z\��A\�Q���>XK@�t����ڈq���R�r!�J���ꢾ��"�z�H�$(�y6J�{�Cv�*���UAD�_�
*�t��J�������}��袋��U߫Z���<���

�L��
�e���%���O�^��(�����W)\Ҽ*��gt��Ǎ?��}9�DQ� �*���E���%��@��Vl�
k
�]nC��E�B�"�_x�J�C%��
�~�{Fk{����o�m�zn��%;U����_�u�
������s
+��@��R��ˌK�䈲��\�K���[�Y�g:�'&�n��T���]O<��t�����*k���7�gt�@�E�.		i�F@������n���$��VDA@��j�}��<�<�2��}]��������[����k� 5
��\{Ts]���C$Q��$��e&�WӞ��$�;;n���	�@������8Qm��Kpz͂���͟O�k�98N%�tߋ*��ᇔS)n,}�K�\We'�f��O��hj�%�tB2ɋ5�k�/�o&/EO���m��d<t��J$�K�$&-�K���R ���\�mˆ�+�1�����I��]�v�ڵ[wr��r�)�г��ic
�5�����%�ʅ=���/��v�(��!m&�c�3A�Ň^�������
:wE$��?`0O'L�ʎ��@/߻���ϱ��B����j�q�ց���
����[hc�nS鷥�mxX
,ߵ���WL��s�̚5s���f�pX��U��ɝx
�B�#�O�6
y�-o=j�	�mSq�%�p�$�o9
�
+
R H@Sf�W���@Ĝ?h֬Ys�Q�6�N�#��I�,xI���M�I��K�#�H�9�Ĥ�0zg�*�R��J����D���L�3{Μ��
�����
����7L� ����*�pqyj6��iƁ<٘Q�jA[�uwߋ���O�oն]���T]�S
b
Z0�e��:�ɭ{N���w�����3�Pi�ުe�e����}ߩ#�N��ypN��%���mڊ���><oux8���y�(�@����VW���>2СC�1oђ����uˀ��x���Q]ǽ|�džR`B{
-��d�u�݆�*��x\>f��>=:�m�����3���M��B��7�J�1

[�n�ysf㬔�p�M�>C��`�^F���"'.&��`�c��}���DIyq�S`1
�
�	-pBJ�W�6mZ�u�%�K��U\��
^�?��B�I�bb�f�I�QRѻ��Eo�Zj��Cϙ=k�̙3f�T#ՖQ?���}�,���T����	J��G��AL	"R�ɦNV`B[�Dn��b�d�h���:���O5
��
�yt
����
*zw�Y ���댜�&��uMB�Շ2��	Pѷ���U4I��x�ԙsbj�bxN��'+�w� �t攔Gb#�)iU�>�����a�f������
z��
�7���i�$
ޭ���4�� [...]
�&��v
���Im.�߰`
i9�R
�.�`�s�&�n��tFeױ����ߡ�کsg���֧UHQ�.�:r>c�W(?I�w�ZKy��(-�ң�|+ѺEϕ&�M%#a�l��KL�ST��͢�K^�
+�Z\b;���
+Ŗ�R z��������P��Ї�4���Iʡ���l����ar�C"P
+
u���eF%�Lۍ+q�&BgO&P
��<�f����(�]����<ο],�s}j��q5'��r�P8��
�~A�Q^^'��<�� �*�ML�H�U��zgS���[�^O��Y%�*IYx���Z6�_��:�ϛ��Іg���J���S�x���
h��L�W���i)Ə?a��I��U'�f�C�
]�)^��9N��U
�yz��q3sG�$����c�;z7�`.i:�1�����>���Q�G��@���!�Ǝ�0i�x!�I�IJՙՇ��,����zL]�&�`M�>	�x�(U��
�Y�J@#a:���f�`}�M�RKW�.���g�$y�E
�c��D�Ĉ���ª���fr��[�&
��xEO�Hr
Z�$���2
��!���7�tA�2�}�;�}䣇
�W�T[QҬi�f͹��6m
aևS
�.x����m򭍴�}�Ty$��J�o%��a�H��
J^�X^+N[��9j�<}����N�
In���@����Y%�Uл[GZ�^�B��d�ߓ��s�XX<7�t�J�=�¦��kwb�V�1C���8c��/�kMha�ԇǜ

K���%����%U%�|)k9�9�Ȅ8�,R�H?��>X���9R��*n�@Vr�v�jn��{
+���͚��$�����З�X����:�t��&��6_
C1&�3��zW��j�^�,��r�5x�X�]���fp���)����
��7�

ߋɓ��O��~+x�q�
+I�&9L���*�0
�R%�(�J*�\�P�<
��#Pq�RS�
�b���sJ���3a
+��8��F<p 6F
/4�Ϯ
�~��t
W吃�����
;�-��ey`�A�*`�
���l����LR)\����
��p]%���¥�A7+������T����D�Is��^��]%
C6��Q�F�
9j�hR�Ҵ7�S�g�MBXr�K���[t�^��
s�{>L��LQ��Q�Pׁ�

 ��
�k�ѠA�2�y�@�	eD$����7Pt�x���I"��q��
+��t�jTzϪ�߼A�-��
|<0�*a���}2�)�R����%�}H�7N��\�%�㪕C3�e�2��b�d�h�R�T�VÔ�0N�\�H;��$N(9Q�s�ᇐ��I��*!�I���V-[4��ɴƨO/���P
(VU7i�
�q1�ȱ�Μ�1��[����MK�Ԓ����jLwJZ�P8�Iv���[�C�)@^��
�*���U�#vQz��PJ��!P��]%
�@x�UJ�����\S�p�]�%��t+R�.���FK�ՕK��nW�F_F����1�sZ�iƵ�ˣ�t�[ގ��������۫&�o -�
��6����� ���1G� 2����0�4�G��8"%GKH́����Xc�*�[�\n�$�	Q�.�(����3z��j��c>lj�@nn��e
�����TM/)�R,mk�`�����
z.�f~��&��*i2z�	�����͆�·m�<����2
Kf����'�CY5�Q�C�P
+
�RAL*mZ�+
fL�0fC�}ܭG��^��+�o޶`�ߠa�0��1��w���DSZu^0�s���J��#Mc�S
i��s�-vSذ���o���	D^��o@�"7�
�29�6.' ����o�a�G��^%�*a-��òp����:�ڨ �m*�BT]h��Ⴆ8�hⅶ*�6�ْ���o
�S�Ϻ�bǎm,Y��
Ra<�K��p�X�
&
��xWM�5*ѠX�8�-@��IPp�Y�䋀4
E���P��h�,;�%��$ޙ칤ϝ�PBP����~gF

��1��D@���lуk�!8an��cbT���~�?��.��Ы,�}s�<�F��(����&����:�T�䩰0^=�Z=�
�I�I:x�8J��R
+�$I�s�.�CI�p�U:((�b=�V�OQ��> �z ���
?Y��v��P�U�
~�񧌅%�1�ܥ��i�

+_fv��-�1�� ���X�
�U&�u��
���J����>�J���X�U�$�R�E�,ܩu�5+ݦҭJ%�<�ʈx
�3�	��nϖ�X��)޶�dW��X�*���Y��KzS8X�&��Bȴ@�҅%�\ 26Ō�%N�2�j�Dɡ��y	�h�ܺ
���;�MBM�2��w���R
��J��(c>Gp\���#2m�
Z.���iżz��RɃ�����x:�\z�0/�E�� &�%pP�b�ъ<z���,��y+�4BO���$+)�
8�L:&LRQVv���]ʠ�M*Q�a�v�斾6o�ԉcG
��ԺE�F
hI���Z�o~hظY��
��H�?xĘ	X
�1���q���c��| �ݓ
�Z9X�䖴��
�x]���W�a��bWz�[�s���B��g����r _�I�
�ֽ;�*�'S �S�d�l�U�Z]�s
��!جt�J�,���Us��q1�\S�7�=�PMϖ�5wA K�����Pq&��CB�KJ�
��&f�L�ށFiӌ8BJ���Y��@�M��r��1x�Y؎*�H4�t
m�`$�r�t�$Tu�[L���%%w�6Ai��Z6n��H

�^b�L���*�R! ck'H�h��,���ƹ�^m.�2]��L���ɡ�Ro5߼�~���o���d%?�J�(�k<�J�.?+�D�w�,(կS��SZ
+�j����=�
:r,����cV8;�R�%]�w��UU�
+g0�@�If��D�Y��5N
~��ؾm��4�0��TUe����4��v�
p��ᶿ��T\�B�����f�P
�m*�2T�d��҅��XG�h>/����\'J%��l� ��� �
p���F.��;�6:LJ�m�]x��Ɨ���Z��y@���8��D�����框[@�
�pg:I�
�@��MMw�a�Vu��:?�L����u��+�Ƴ�@U�\
5����D��2�=MC>�־*Ekh����b��g�KX��|\��
�܍~�^�5~���b�f�Rs�Yo�ļ�z*D�8���(k��_
&�u��PV�J*Q�èa������Ԥa�Wy�+�T�E���6a�]�n��
6j����[�;-ܦ%�c�J	|�
����U��!�Cyc�v$><�w�b
�
y
���&��5�I�*Pa�S�*��z����ҰLh�O���1ثd�J�U²p��8�!�f��T���d��@->�T�*�%��s�'
?��̸Ceo at F,Ѵ����V�ȱ6���O?#Bq�3����C�B-
�9�Ҫ�ᶇ�4\����s��O-Z�
:@�X�1���޾w�$0��M:~�4
��>��;�=�_�9����CP���8Z�Kc��@�G1z,Ϟ����TT��*������X�K��(�
+���c[����'3��j1IG]h��gIʡŗz�b�Q�*�w#P
+�$��:�ĕ���P�[�f���y�6|�R�*�^�U�A�急��

>z����ᦸߩûQ,)wɔ�|��ɰ۠
;\��+lYg�L�_np�z�ܺ�$�s�a�~>�A�9p0֭�a�W	\�j�*��kF�E�:ܦ�oO�����J���HhC��<2e"v��B��ԅ*c�h�$��",�u�
+K����=�*Ʒ0�]��x�u
�,�"���
�	�
J��
.v��x `��h�sd��
+Rq�#�rL$�s�$r�@��)&��;�D�wQK�
(�(юqUf͞,���izl
�ˏ���Q)��v�ˋ%
3�R��_��+jB:��vʓy^�WM����j�~+|�-�S
$����T�I���(9�F�
����R���'��ҡ
A�j�+V(G+�q�k�2���Uk�Z���#���c'�:<=xȊ�+
�ƒj&3U���=m&H(|�N�-��V�fI~
uX^�G$�*@���s
t��*�����4���!�`�z�����z\%頕���\_ �6�n)*�J˃�P=ƌ�M�2�S��]h�-
u(X�q7Ge���Òmz�:��aR`:���z�
�k�z�u�L|5Șs�([��H�H�!�D��=��$�� �t�.��]�͡��j���8����x�)
��)d�em�؉SԌO��Ψ�#!�Q)�~<VK!��҇���>b�/�Of��V��2O��A��
�Н���P�/��P�7���w�}v�ؑC��P�Q����˖.Y��Ŋ+^����ʔ�P	�T�A�m:t��g�P�ᭈ�ṩ�`����!��P�^
+��M�)�-�Q�<r
8DO��0w�
(ީ'��w
+Ld��{R��U�
�L�a��U�O
ϐ>m�U�U�p�J�&��K/U3Sd�$��Ё�v�ْ����R�C
BX�5�U˓�.)
�҇b}3��8dB��"�B]���}�'�
 \��@�@�X˜Ho	��1��X��Vu��
g�ΊEA鐁�"��,��]yl
�
+(ZH=f����-Z��%*w *}
E��ҿ���ҏ
+KJ
*5��KΓ�/�;�b�ɬ|�����`�$��8(���&��%=�n�6�ҡOϮ
۶lJP�T�\钀��E^|��"E��J�e,5lڲm�n�����N�&��Kn�P0E{☄��e3����l�Gx�g�YV�ǁr����@���L�%��^�
4���*e�]%��oS�?�J��(`��oݰ��.��6�Z�������j2����'MUX�ba)����R�.
g�$	&��-0�h��c6��]�2�g�f*:�3��m(];v�|) YD:� Ii� �l�;^(]�%^p�M�4g�I���&kpYqkG�2Kc�i����p!�UZ�}�ذ�*�R�A YT,ч�\\�R��
��/��l�y��[�}�1
�S
Z�Kģ
�X��U���J:�=�*
���fA�l�ŋ)\�PA8�
+�X�x�Re�W�Z�6`�RK�S
o���eM3tSK	b麷�B�h%�Ǐa��d��߂� ހaWȀ�'x�J�
���͇�$��!4{u�7����¥W���y�UJv��j
nS�7�ҿ-*�X)j p�ZTz��= J�i�
�����.ᆘ��\,�
���R|��1�k��s�p�N�2j��

H�:�u a b(d��߃~C�b
�|������
!Ik�&��(�F�	�>�Ci��9��޴Ś�<�u�
�

*�Ԗ`���pi�M���H�
�,��%ז`2
�=�>;��0o�k�h�ᆙ
%��a�
U 4w�T:t�ԮU�F� J˗)�R�"�
x��p^(P�p�b/�*S�R�Wj�kԼu�.=�<ܭ�;�~O�~rb�߻e(&EK��Md'��g��^.
�Q�#��TR�UTg���*�-O�+_�z�®ҟ�q�nS�֣���b��J�F
�?�'�oۚ��J���K*,-^�j-�R�c��ZX��1+o|*,.i�Ii9QsZϑ��"U���
��t��A�@���F�"%��
˘�sJ�H�
���3�vcP:����@I¨4{�����x(��
<�O�� {�
�=���"&,��$��kK(c�y1���ܷ:����� �,&���FY�R8	x�=(\*
pD��NC�R���
�J/�b����g�<�|��^,�RI�ҫ�7oӡkϾ���
?e�Óyx'6�+�U�T�{B�(>�L�&y���r�
�#
J�*�S��M���P
+�����*u��J4�y\a�xjؐ�,�6�nE*}�O��^@nP�ݣK��mZ�lތ���v�Vm��(���O�`iWl,95qs��KZɑX�\��S�Eh"�"U�28��D#��GH�@´����Cw"h&��(y��$
%^�#���nN+t��6H�G���z;�J?{��P)�T2��
+�lWT!�LH��/��l�<��V��p�z*x);Ȫ^*!�֧�5�g?�a�f���i��ҡ}����
+C	
��6_޼y��ɛ7�sϿP�p��%�T�T�f�MZ���
cxc&N�{iuy���縰����P<)Z�_Ű�p8
+�-��Gx[�BH:H�:����{���Z��4 OJ
x-

��*��R�Z��T�ըDu-oڿg�mql
+���S�i�F
6l�Ȍ�'C���v��;�b)Nw)�K�a�`5�z��
�pTu��@�H�z5
��I�Rs(dI�&��Qu�A�1�UN	������)�*Kz��~w�
�
pK(���^[�I	��H�����������p��d�j[B|&y�w��ԓ
�_*�V���x at uh�Xu��cwa&�(Iʝ67ӈ�M&�@�
ڴ (U*_�D�"�(=�/�3�s�ʕ+w�g�K�
.R�d�
+��ע�R�
I��
7�x�{�O������a�)C�&����%<���
�|�@)S�^=�@�_|p��յ|@We�T.u�pګ��]��T�ϡ���4
+�b�<�G����(����կ� �Լek��{��/�v�Һd�,��1���%�䤼KByL&�s(\(]'Tv b|�
!�F~i�:�
KI�D��M
+h:�I�y�&�5N(�@(
�%=�yIZ`4nB�A��=��S&G�J��x���A�8��R�Kږ�Ҷ%>��I�b�d��䩂ou����S��
Z�OJȣ�<Yd
�L�����t@�8�o��`�7iP�f5�R�b/G)�3�s�́'g.�ҳ�(T�x��/W�A��]z�����~�*��Ǫ��[#C�{K?���J����l+��Jz�9J�p��1��3o�b
+:�+��OI*
���A�8FJ
���\�b���U�M�ߎJ?��J�
"T� �&�a^�۷iɳ����S�^�߹[O����0�qk\X�'��K��4���Sd"�	�&�t _�'<��C?�_�b
�|!�,"��SH"7��t��!GI�o�90_���J�43{䮶kݲY��jI��%�
�N/\�9�����IT�@ҏ���T���$�ǖ`2	���'����؟�L?�vh�aRP�K��v���t��;�R�R��Qʝ3G�lY�d˞#W�<���J��XSK-�t�֫���8��֥[��3֨��i�,Y�
����Zz�)N�ЏqB��y$��>�b
+!&%��> ���\�\;�ԪD�-�*�%�
+W� �v�nS�V��O�0��������
: /����zu^�]
O�W�K��4o)����XB�Raq�B<.w���0����Dj���h"�U���.t�� \ ]�G$$�r�I���M�ɤ�����F�)�a�I��m[5oڸa�z��w�eФ�@7l���X�ذ���;DQ)J���綑�c�G�K1��m�O�^��<o�>�I�:/u-N�֣ңk�e�
gP8W:�kլa�Z�+3��?���\9�g͒9s�L�2gΒ-{��y�=_�pїJ������-�u���i�u�8gW�����.�KK�\2)ڀ�@,[v����#��
�~'���Lp�BP��w�SI�K����h�C�:�pUx�|�yX8M�S�Rx��m*�"T�
K>*�h�
[7�
2��I$dأ޲Yc�R�Z5_�Q���y7��B�N]{P�}lL,�}KW½݉p�u����P���9�&�/0Vw�C?�_�"�2 at B#�O{I��s5]�L�u�^(����F�/�GWZ��D5qEO�z����!�Ě��x�*��*���X
+�KΓ}I�#|1y2�����8/�V�T_XO�m�z�T�R�>���Fp��;
>�8�t���U^.[�8@�ټ�s"�2e|O�L��fˑ��T�L�J�j�m،���WF<`ji�;�=�	c�q�~
�
|��#��L�
>t�E���zM��$x�WT��U����x>�T���T.uP
�O9��r�nS�֥҆5�s�%Θ�Ծu�&
�ש]��ժU�
1�������c�

qI�h��?2��#��"	#

��G��@�H���
�,1K�I�蝂�ײ���Sr�4��DΪe�eP��<@��4�s̄���/Z�37�J.�

O2\�<��֓�3O�M�.���S��K�Ѝ��2
V�58ӡC���׮P*U�C)[���~��'3dx�ɧ�ʘ)K�
��,�X�d�
+�kԮG��f�����
�3��XJ�]
+p)�J?���#��SH�
?9(�)����I�éV�6��^�Y��T�Ϡ.
޲a�r4B&�
Ω[t��֮Y�Z�*��T�Z�7����;K$Q�����R��U�\2�wL��D�)6�|���2<�
�;HŁ|����dI��G$�$�h�
.b�Ci
+C�w�.
����fs\U�
^��j=
:�k��ƌ�~��p�#G�T��(�<L]�N,2��}5��ዑ>$�h=�'��
+��z��
���� ��P⌻���F��*
�OV�mZ4���r�^*R(��yr�Ȗ%0)���y"ÓOg̜5;b���K�}����p�Z�ˣR�,�ˆ��yB᎕p!d%���:�#��
�2�|VA<���`(�QNײ$�)~׬a

�WҪ
+��J���\��T���D땎
��C[��a��vhӢ�숩\���/�\�"n��Aj�������a�����U��	�1�%-T?���J���Shb6�|1��|���ųgE�@�H��HZ�$i1�O���Qp�
�
�O����P�Ci ��]:�mլq�zu�Ih���U�U�v�������>T�5s�k��|T�q�?���aS2��d
���cs"�d���kן�a=D|�B5
A�6�)	�8�*5ᲽbW:P�]�r�J/�2g|��'
��x
.=EX��l��E��*��%S
.�%,����N�8��
� ��k�S|�<����Ċ)�<�zJXĒ�� �M�HRi�1p�*~�S
����'p����a᤼�u�nS閦���] ��7n :Q/.+_^o.�߸�E�IXZ�b�&���tS����F��
�2�
���M(_�'�1����w��c�#	#3�7K�_�����
�
�������4�;��w�^]�* ��R���k֮۠	ͫI�3�g�}
�h�J'x�RJ��c�5�K�8dJ�K�c2d�&�b�d����F�շ��������
(]��őV����wjתiúX^�D�B/<�7w�� �
O<���t�ҦK��Q��K�K/Š�J�k�mԬ5M&�%�Z��,���pK��;?�˥��p!`عOq.�#$S���$袪�	�@�}���
+Lz�!�ߕ(ZPJ
LUx��t�J�AT���F
�1`��S^��e/W(G��ʖ-WA6�������?��
+��>,%�h4��G�唚c=NJ�T

+��3%U|�׿�:�]$E$�� �bR$��'P:h;�OJ��cU>�خ�J����((���j5����p�!#�JKW�ۼm7

w�t51*�MF�����d���{1���h��CrL�	�pc�%x�5j��!�zР!.�+Q��@�ip��Iiy$M�G
I���b)G�ϽP�X�2�ԨM��]{�$�gK��&x�s\Շ[��м��>�K�a2����2��#\p-���M���%~&�/ކ���M9�Ė3�ߙ�]��!�*E�nS�V��RE%i��[�F�����R%K�*]�T�r�5_�רi�6�r44�%
��vZn\"SOG��*z�9��d�9��P�Dӱ������‘(9M� �
E�\���$���N
����A(�*�b>����r�r`�.�י֦M��;	�KW�v�y�C��	S��t���hJ L�2�6]�/�{2�[E=U
�C�C
����2Jo	��J%*��F�z��fG�X at C�1dR��~衇2�{���D�Zr&͜˫�y�և���`ɰ�#�WB����_G>��$%�$_ӲJ8�U*
��ʞ�?[���E�J��t�Ri
^����u [...]
dz$-c)[N�x��p�U<H!��-���8\�/�������j=�ň��~��\�L����D5�4��Z
ԯW��8ߩv
rP
���*u�
��f�nS�V�Ү �:��j�_(�>�bŊ�J�-_�2�M�@�W_��>�m�7KgT)�W�Z��
�d���\�K&.�&Vu"b��]0?�ȿ��8��
e��,q&]�V������aJ�y�H�R��͛4�+��$(^
��	ʿ
w��iZ͠�c&N��`�M�SJ%�T^t��\v���Ur`����s���"��1��Ϥ�:�P�3)G��ƾq4�
q�]�
>��J�M�Lz�_t
|�ӤM�^��l�BE^*]�2����b�Iӹ��eQ}xK	
�
H�7Ek�I?ŷO~��6�"<�X2��j.
DEb
+z��t-�\^˦x�/��;.u�J�}�J�T�֢8Ȼ�m�1xs��tx��׮Q�by\^�j+^�T�r/ˢ�急n.�h��H!����XK��
C���?�D�%�Β2s�/���:�r����xʞ~�D�K��
�wD
��i����p-=��ԮU��
��R+��"(
+�^��֮רY+��TZ�ҷqS)�"�����Z�q�J���=�ף��2~�K�q���[]s�G�.�Q2�
+cAi�T��ឿ~����ʗ~�H��J�
I�L��t���S?���R�,T�ʹ�Zj�/���$�p�=և�X:�fM~��_�<v�1�'�
����OZb��bX_3�>����w�͓���kH���]��!W�6�ne*-Y8{R	wS"�:�J��y�p!<�_,ZL/z�� L���4�f0�d;- �qI�<��xq�"�9
+L.�8�q��e�yl�?�
+��ER��dE�LJ�*�IԶ2�桎c(u�خU����Ԓ�`�APl���_B��N�l׹G���FO@*��T:u&Q*�~Jn����h�9*�`]��
��U����,���?��#�T���|�t;k(m�P���v-U��KE�Q	������CȤ�����#�K�=�b)�s
+cj�
+��Z�t�x�k
/_��R���q�[~�V��%�O�~Zp�Y�?T��+(a����{w�(
�k�sy��W&[�y_�N�:$�*ݦ�-G�S'�J��J
�J4
�
�_�R
�<�J�B
x�@k�s����W���%�(�N��Dqqj\��+��w�?r���tRޤ@��`v�UTL�Ǎ���c�Q��
i8�I`��@i��%` ��c(�'�>���K-���b�B�j��v��I��v����o�J!�Z=�V5��	����u�d
+?�e�8������\�nR��dT���l���R��i�~o{�
ք?�'W�,����/U�{S�J`z ���#���Ϥ�x ^��8�c��9
�>|���Mk���;N0��s���~�
�#D�K<
7z�BI�Tߑ�N4Jc�l�k�GiPRɉ�%Z�p�J�(�p�Pi��ae/��K�(P*�B���E�%˔�J����fK��{>`i͆ͯ��w�
��䒊�E�K�|�v4�� �L	�䎧�9L����r1��;�R�Jo߲q���KΛ5�t\�RK*ȧ|
9��p�6
��qg\��Uk�i���Q8r�G���J���|���*
�
�J�Y�*�
+.��d��d��S�V?��aL$yz��%��w\|'��8�
����|��T
k�JO(��Ͻ� K�o)�e ,�|&_���Z�x��w�9�\��p�
+l[ڱ�M�ΘjVo�E<�v�O�#DYp��Y�&��J8��ӵ����
����x
��M��*]
Qi-Ri*P���7��S�^�Eϴ����_(P�0�˽\�Z�W�u�X�=�ҕkH��b㒪yD񌻔�B�m=�&\������v�摊?%�$��t�r�@θK���!��V��b1�8�2Բ)(9*2s n� �h�=P�
����M�n��J�J_�	Tz'q*E)���4���_
����*!,Yhr_,�'�?���bE�s�������j.u�&Q�y#����^�p��C(���ߗ
+�t��w�}���%����⁚iK��P����R!
c�d��*?�:������D�u1_�j���D��ߛR|U}灒յ�KC��$o��N���:$�*ݦ�-L�K�<��n8�C��P�M�p�=K\*R
cIX���v
���3��4}��ז�HmR�KG�P� T�V-O��X���L뀦�E�w�o��R�����􃵗�
%��q��߁�[�p�L*�,cڛ6(U��i�b�b́|��A at X��R�_��Cp�ЍP��
aG�l�1�3�n�o����Ò�`z�k�O�[^&�ӆ��z z'u�
J<W���J5�
�
J�"������%�R�ǹ��iK�
+@�x�C�>\��ۋ%_�E
+�'~�I��F�or�>k at C��;q�2߻�Z��
+Lr�wn��m*��T�VB?�A%
>a���@����\`P��
�<�����/}�S
���K���F��t-`I�<H��_ް��Vx��us��>���1��
��s�g��
�2
��:���e�̥m费�G֭]�j��e�E$���0
+�X��|j�i�T���H���5H������;���A-ao�S��Λ	_�Q��{�"��b�O�y�d���Ok��u�����k.��Ѕ���pЎOgx�Q�����t7 ��t L�%ƒ�Q3m�Re+Ҝ�\����Զ$X⾥����.�K`��Wz"캨��!0���\	[�
(�Q#�X]�*��U�蠦	���u�nS�7����J�4
�ԵCk��[�c��ܹr�̕+7p	����)�Q��+��5j�R�4|������[�z
W�srɊ�)cO�K)㒏L���ڽ�
뷛����/�?is
�o�Qœ9G�u\|�mJz���k�+« ��CU�@n8l
�ƸR�@��iдU�.��
9n��y��J{�TJn��)<Pr6ĝד;y>��å�bD�V#ؔ��
+��b|X�f�������ў�j�3��j��I��p���A<*�Ê�|��֪5�~�#́�c��d�j(���K�~�����
�X�E@���L�2���pQ��
�:ܦ�-A%υ��K�3�N�T��:Si��QC���ڡv��3���+g�
ٳ�ȑ3Wn�R���H�v����
I�#��͢Y�Ը2��K��+��J��X�d�Qv?&p����%"�a&q�\;J�9��w��0PNmJ2���
ԩU�
+���AG�l��x�ț��"ť���48�J�ĵ_�|��骨�L�+x>7C�φ�2�|k`ݫMN�?V�Y|�42x q�ngJ4U�T�R
Ij�	Ji0|�
+�vd�
w��o��;��XJ�0`IU<��񀣇z��a�
+8�h�HTzR*<�A��/���>9lCI�+�!ki�M9������?�`��6�~c*�(T����o�>�Pi�Pi�~���G*�0�b�
���=g˖5k�lفK��yV��*V��s�:t!,�H��!l\B���ґ�,T
�P�R8��8�
�
+)�)
�&�ߑ���$�24�P̸sV�w hT�z�lSR�X�Ɍv���)�zN��ॣ- at S=+ר]�I�v]z�<b��D��D��H��p���K߹T�βDA��w�$�����l��EJ�p)���G�
�z/��|����D��$K5Z�����
5��
�L.iTR5ᏧO��5�I��_	L�%�ҿRc}x��{аn��ài�����r�M��
>�x
�I^`����X� ��ŅJبԗ�����C��NNR):~w�J�T�*@%\E;s�8�R�����S�#�#(e͒%s�,Y�fˑ3w�|��/�X*XB�jц���
�y�
+��&�$Q<���Es)�=�W��"����I�C��r�+V��v����w����:��R��8
}�
�SE8V=.��R�x�x��?�+*W'*��(*m��ҏ�_�A�S��f"�7h�#[�L������R�]��R���[E)&٪��%M��a�J��%��(����K�KX�g*
J�
+�V�x
�©lHU��c5��k+

O<t)���s�Q7�X�]k`�^��'P�F%
-� x���S��J��O��&��A*������)0��$�R����
Z���'*iLk%t�*~�#ue\V�*
:����K�ƍ
ܯg\<\���M�͝3{�,�3eʘ1S���%��
R���*�q�P
{�6.-]�z�&N.�(
=w�ǥ����
C��?���X�!�IN��ht�(���蝤���a�$�;K{Cp� �a���잒! �M��"/���<��h׹G�A#��^[�z��
�J�N�L��?���B؂jf4��H��#\\�>
�^h21�8��I���
�U$�b0�GOȕ
M"�N�s`.���Z^��g5��QB$���&0),��
+�r�2G�dH�gQ�t5�	3�+M���o��w������J��|k�t-S�ԛT
+��n"�t���D�o�J<"��,�=�?�J�f/�u:����I�"��������}�ϼ{��C�
*��ٹ]�Ƹ�Qj���ʑ
���i<�K��t�yʾ��8ux(���
+q]�@����qуq�.E�|���(e�r	��o��^���6k��d��v�0zw�����
+�s�9$
۔t�,V�c�C��GG�
��t2eFK �
5�Tj�	�4|,��*��䩤>H(ʯ1��>��t��{�9�l�P��\�Z?i
ؾ���	c#)��^sK�wk��Ui�:�A�
(I��nTJ�}�J�'���?�
��Of<���%�!���X: Mj�ח�pC
�ٛ#;��h
�
J̵PK��>�P��_nA	�;�QŌ��I���]��R�T�ԣϠ�&��T����.�TjߥW���&$C%��<�C�
.�vle*M
7����T�b9�
|>�3�!3g|��'�<�t��YXIb���j�P��M=�y��
�3��W��W�!1�N|r�?�s�����<LR^�9*��Fѻ�����s�8$��^�J��aJ�9t��x
+Z`<#�uŪ5늄
;i�PɊ�~��KQB�^�E%�Q��gv��I �N�>u�]>�N�:}�=$��p���:�2��x"
H�1�S���%�ț�ng��\�����%lTz��J�'�I
�`�^’*��[-�m��DeCX�,;��;���"..�);�R�福�l�L�	[o�R�O�j(�.R�Z�{WaSN*��wq�:�I��6l��W�(�5o]*լ۸�͡�uk��W_p����D�
��J3&�
1�o��m�Bx�#�\6�R�'�d .ew)hI�
+�@c
d(
6.q)ނŒ\RQ<q�(�$Q���%�~������Հ���d)t�Q��.s�C����9���6�*�;L"��3��]x�
��<��q�Tjө{����0�$�{
���Y'�z=�
aٯ~(��DLz�4 �����8q�$��4�L &�K�Ic�K7���E���^
5����%�r�t�,�̅JRP�&sP��{��
��O��
�c鮻�O*
h�Շ��o.`i��d��\�n��3�pSd'Yi�u����;�R�:�#���6�:[P2]�
6�kw�J	�Rђ�*ER����K�i��z��ѡ�J	cr�3L�DR�J���o=*/]�J$�4��R#�
<�B~���l2��J���T��@�>=:�m�1]�F���Td�'
�18�#�2��;/�<�짭��<p)�ԙ�\RQ<4�,w�v�l%�⩴�����t]�8x�t��OUF	�� ��U�SJT����[S�U�ssX
��d�HV��p�3e����d��+u6o�Q�4g��U�l'*�|�c�|��F�u~Rr⃒8J�$"ұcG��C���cǀM'	L�0Y\�\.�̗J���׌��mIp����J���
(�d(ɚ?�=���
%b���D�x<zH�-�X���d�A7Y�Y5�!�&b
8�Ox�B�"�
��J�k�<ԇ�I���w�P)�s=T���~�O�0���l��4`'D�����JTʗ���J+�����\ȏ�u��
+ÅJ'��CQi����t'*��y�;0KF��c��?���Kb�?K�x����4.�L�
qJ.Qc`챻�be��B\J)�����A$ً��t
���l�'ls��t�-*s�ѻ93���S+�TE8w,c
�'����ӣ
 X��;LAU�R�;t�4pؘ�ӄJ��|�KlX�$�K%��u� ���t���w�~�ȑ�t�
9�6��q������Ղq�(�xQ�M��B� ]��
D7z��
�(�
C	�����^��X��]R��x�%26�m)���v��^��%Q�P�Et�I"7y�!3?��d�Ԝ�>��}B
}
%lT2]˺��$�<�w)�R��A*
;I�r]*��N;V��:������:L%i�	P)W�[�J�r�4�q.	S�k
Ӵ��7�r�Li�h
;"5�@���
TjӼa�W�T(�
ye���=�h:< &ғ���ȅ5ܸ$��X!2�3�'OdžZ�⡱�E�.Q�+��B\
+����c�k)��D~�O��5��"�I
����9�������͞N)%�s�mJXN�w��
+��xl<J� �2��xi�q7hֺC�$�A*��L��FKv�w���/EtA�|���)���
>t��[r
<t�0����S�Kɥ���	?���"�	�6�
+���v��;����%{��}�
��O��:.��>ܚ��,��W
+b��dqJ�J9��+�ц����捇��)zwRuO�ր�}��p�Q�(Y�J)��ŠR��.�:vOhQi�>���%H�/�8��N�XT܏���2���ߚJ�?�ɡR��=�
��D���B%��<r]���cJ��E4�R���Խc�f
�Ԩ\��K��1K��2 �ҥM���i�=
+���x��~/P��n\jҢ
�M2b��I�P�(���
�]�Z"Vb:G~)4J-E��
W�+��p
�nV�ÑC�QRѻY�(��F3©���*�{.onpL�Q" -�t��'2<���[prZ���_m���{��Ѳ"}��oj;�,��%�גʍ�׽�hvZ�]b�a ҁ����������ୃ&t��K��'
���n��������U/i�w{U�U���
hF���
���A.),9�x�m�P�A,
5M:={P�x�UC?DE~A�-3Fd��),0~k@���$
3đ�f�5��(�'�1�V:$���R���@��T|BS�3��f���颏�	����Pi'��)*�mި�C�ti~[*�I�P�N��J��Pf�J�iӼ�|)��֘�b�
q��nY�NK��p8k�WkT.Oˇq�T�'�x,}����I��a��#iӁ��(^���%i\�
+q�y<|4�z3f��(
I�v�TՃN/�����~9�ZJc��BL⸗���M�w�(��;I)Q������R"G	o��;�#r�y@�b��U�^�~�V��Ƙ�TkE:Q
KH��2t�{<U�F�V�<�Lz
���޽{��AgϞ�@'$���q�K��lDW�̓R�/+x�R������4�u#\Ɍ0PB��đJ�I�%p�X鲚7���!�%ޥI�ah�1O�2Q�$���"���`�Gf����5��D��O�P�OTGn|c(���I�CtR)ETz�a�J��*
3Qr��v)K�c�J�L�\��+�J�耕U=H��J��6�R��:��JT*OT<Ǟ���J;��J�����K �
���є�iGл[��M�Z
�T�0���K�(hɇ����i
w)K6�yx�Pn\���i;v��%�\�(
H�K\���
o���%�ؚ���b�Vh�rP��L��TRs��QZ8w�����٭��9X�w�R(�e�y�� ��<��88�������V�v�&@�^��Xk����ѧN8��=}_�P�_ϓw�(1	���ݻv�ܹs��?�v�~�`�	
��hi�����P��^3��O�1&µ)�Q�4�N��L�wjGk
����`AI
����`Iׇ?��j,��$�4U���d�/�d���6�2~	��Y�6`
سOvk@��5��	�읿������<E��A�G��
��T�DY��'�J�@*Y2g���E%��ӈt��׀�����D��Tr�T%lQ�ߊJ��T�.j�$*�]�\��L+%����
�jUY��)��{�
{��~�����;�j��
ʕ�
y�){M�PJ���S�N���i���(^�
�u����l��K(T�'O�9Gܥ��.a1��s�k1�Ƽ`���,Z��C�]$Y��L���Ű6nj9���D�w
+J�)%4���|�P�#����K�@j�����S��*Z�,��6�L�ƒ���9�p����|���k�9�
+p
�D$�ܱ}۶��l۾}�N$�	
&å@9�;
/b:^�3����Ռ6�,s�8J����R�s�Fp4�
�˔�
J�k��%]��Œ��4M*=KUC�&
�7�,��[h��,��g��Bm
��%�a(�s�
T+��r*�cQ��L%�9j>a�'x}
��D��:�����E	cř��o��>���0�BT*�E%Z��SImL%�Vܰ9Q�Z�-W%W@%��RB�]�\��Z��L��X�GM����6�_�P�h���r���Ϗ��&�
��!ҕOP>���4C�ۂ�x�,w	�J��JL�RsD+L7����G�c�CH2L"�/�$��
67�~�ߨ�aƔ����Ť9��T�J�9P
%�?\�d�M�J��EAB�֪טdz��'l�`��)�
	�|!�����j�DW����
@Ҷ׷nټy�͛�l�
+hB0�}
&��iP�v��B�K��G"��_-��<��%�6�j,CոǪ��=�j�d����~(�����q��ԇ������x�K�n��8���:=�Q<��⣀
m�#L����Qf�0�kX��Xj�	����&����q�C�G:أ4�J��wa*�o��������j!����T����
{$bʼn{l��}~P�F��.x
�w��C����X,9����5*��䴨�_�J�����ۊ���yێݹ��k�V���i��8��RB_;�ﻐ+N��
�4��o��&�
�Y�*b���߀�&��ο��|�ɧ����*ţ�x�\��%��QG-He�@�����J�0��h���Y���:���;(\�iI��M
+2	e��b(x�g9Jk��4a�H��un�SJv�G��)E$�E�M?~)�?{.�R��Wݢ��g�IAd�
�v���x�����Ww��a뮝۷�6mܰ~�:<��oذq��-&p��NʓRك�U�]<&��=eLc":�J��Vm�[/9k:�������*\=P�ׁ��X=�#X��j[�'KV��`*ś��
N��{N�P`Bn�n��D��$k��7V��1~��p�k��j�@���(
��S� ��0Tz:3Q�2H��-�w��o�(��Ӡ��o�op��
�[
d
+L��r�a3o����l�Di���
 T�4J

X!��f4T��צҝ�J�����5M3i��K1�����3�i�=j}˗��*�4��<�hb�M��6�	LeK`a�,��K
����<� q)�#���0]�G5�\ꑄQ���'Y��.�0^�K��,�)&�Ҟ�(Z
"�H�Ը�?�2I%���l��+���DeCr�usJ)ᐡ��!+���Lz�_tZ���9��*5�6*� �I3�b�u�v�SL8��y7���J�8�X���uP�s �6oڰ~��5�W�³z��5k׭�@`ڱk��7���QdV�
�in�#�E��^��tA$]5/��\�'��(�x=��<��[�)�
N	��A(��@I9J�
+O�K��?��3mK.���V����~���&�7�&
�j(m��';���Č,��	c
H.�i�X<��\)�)��N��$�BT����D%��#�	^�I����`�BV2��}�o�l���$l��e𸸃]�&4{�Q�(�Oi���J
�T�ۯK%�T
�DE��k�:tK(�����
�Ƅ�sf
��>D�X�kg5�1�D�#�vܷGg=��H���
�x�t
 �K4�Q����֊����(����Q;��%��p�8W=
�J��
+�(�
+�ɕ�`s�
JVpm�uG�YHR��qMk�IV�n�5+���߀��T�NM��W����APJ�L���{���qӴ
)#�� h�M�$��Ux�Z�ۥ�/������HY�÷u��
�֮^�r�����,_�b��kL[�a2\:��^�Ė�Ŵ2�_�
���5cTm�Q�n�3�9t6�)��9\A(����q��-a7�cX�baIo��yǔ��x�j]5��:�j��Xц��sӅ�j���Xq�+k�]�Q�buO�5�V47ċ�J�J<�����RJ��M�G
E*��T*]�ԨE�.=�
�y����mP�֕'J����w!i���(�lݰf�"�
�(�+�*=�
Q)������kP	\{]*OT��DJ�5m�Cñxւ��<b��c'�V�5�!υ\���4���6�`�Ǟ�����M8Ԣ�o��v�<9լ)\�y�}�R��7U*P��/S��GfU�G5�\�(^R�5���u\����gjY�7�ä�%]�q:�H�#Z!"y�d�Igy�62I9�.�*�2r�ƃ�4���5m�]J�R�X���8N
+L���{�kƆK��h��6Z
��e�l�PY�[��RP�
72T������;�R\t���g)�nٴaݚ�+W,[�d��Et/^�д��q���5��>je
��,���(+#��v��]���0!WT�:z��%���Z2���4��%
G2Pb.Ń%�f��ax�1�g'�(�4Y
���ť��ц+�e���L싿��
7OXL���(��'3�{¶�[P��@�4$����\*�IS�!�Rv�����ɶ�q����"��[w��q��O���}.]R�Þ�D��Av
(`5e�(ڼڲI}J�*�ȂTz��ߒJ�<b[q)J�V��S�����<Rb��;��X|!����N8�F#���&���w���1�(�ƣ
p. ��e�~
t��Ku���sϽ�"��]J�yȭk
��k at Q�.=z�
8d��q�.�X�Y��q-\�yJ���dKW��4��!��״|i�M���L�����V�zS��pp�zww g�kX)%��Dѻ�|�p�xK�5qX�W��p*����5�X:p��%[B.DK}%��(��s�&Jz�6o\�v��値�.X0�ς�
_2-_�j�Zp���.������r<l)n+#ٷ���v?x4ctm�n�(-
+�K�
���˳�bC鿝’ڶ���OYX�&�\!N�Y�78UC{BUC��u���v��Tb�e�&H��[ Y ��m�P�Oh��p�0����Ξ�kj���b(�T���O���s�J��ᓝ��#VX��aˎ�{Q�N����8<��>��6c~p��%
��Z,v�1y���}{Q�f5��V �p���J(*��ע��
 *=
T��2/W�Y7b��7x�8ܧ�tպM�
�Y	}jv�}C�Ṑ
�H�����
+��oYOM�S9�i�h
��1��.�K�P�瞻� �Xa�T�]�
G��t c��.iwi��`�a/ȥ
�l�~g']2��Пܓ�>�xdɖC��: zQ]�f҇�T"f�
+�-�
�q�(q����Y#±uVE��!M��|��e�S;
Je�yWn��BS�7��S��r8.7�R!�
���Oh�$
x|�I�-\0o�9�gϚ5k��9s�Λ��E &t�,.
:bW�|�dq�$S�)�}��1�&l��0�J���r���N�K��t�
�!�e�x���P����#\JK<ό�o֊j
d��JY�����!e8�}1Jv\�IHv�x_QK
z��5�	Xk�I��� p�J�SR�4h栮t��J)�R��i�P)W���ʢN
>�{��Q��o������O�pB�^`W� ��?Aai���q�����۷n\��9�'�1�O����J�gs��H�TJ���_�JPTR�6*J|�2h��\
�Ex
1`�!<r��}��[�
�&օXq�S'i1Rz
�Ϝ2~��hr��T1,
ώ���Jw�}
P��1�I=n��K�rI�x�:u��%p��N��%	�qz�p�=��r��&�V�U�|= `�io���G
6�\�!��om�B-ēYq6���[�|�"�r��;p�z��ԺE������J����|A�;F��t�|��p�Ǟ�"<iX�O
K�(ȍ�%�S}��%�5��a����9��O��c�7z>Ɋe�&͟;g��ӧO�3}��Y���0-^�lŪ �މ�dq3�?����^2��b���Ί���Q��ro�⫡%�i��8@�HT�`FpP)(��>K��a�a�[vE��z���;�FP�r�(��U��ad��#;7$:�/�Y3	�dx�{�p
%�u[�����=%{��
��\%�J�W�9D�t@�l������G�q��X°9(�|�Z��%ibd�}�'H$%n|�N�� 
��&�
60��"���YdTz�t����
*�^Q�mX����|��╺�Z�ZL#L��`��5��}4����#��u!����#�`
\%��ZJ+a��s�
ە������{@Y���]`ɳ!�%b\� ɥ2T"^�{X�`�%L�.YN�x[M��Ē���0��dK����P�xd�,HF�i�����-&�Lm�I�֯�%�)G)	
%0��az�
�:��bARO��Ow|b	�O�%��<X^�gܑv��1���^@���,
��pZB����P2b􅎫����I�gΘ6u��I�&M��M�<e��3g�.����2F%K�
�*�?��]�[aͨc�nm�j�nj���#8D7��d2�(	�K����Xʒ����ɥ>0�7A����bG�E.D��5Wv��[d�����=f�fR�`Gi:G�p���=aY�;�R
++

*����?�ĕ��r�������զ�8b|L��m�EZ���r!�41H
��
�	
+�97�O#iQ	�غq�ʥ�

ЛVujT�U.\d�
<��33�~��S�w�J�hKϫ,^��f�:
���CGcb	Cx��ؽw?N9�#��>�B�Ǻ%�2����B���gM�8��y?:�+����y��ݠ-�N���,yU�#w^'��
=8��{$W�J���q3|Z;L0�Zp�V�~�H�5���)�$%_��;h��!�eK^��B��v���A�޽���f|*��c��
#�R�X�ǥ᲍�0�4oѲU�.�
7��7�>�/~'PF�H�q5�@�U�QB&M�:e��	�Ǎ�g���&N�B`��R��V
�=G�0���|��ף
��p���]��rm���XfT��ۙW��6�)�ӦI
?�baIb�</O>5��ҳM0�Ե'F�FĬRV��68ap��H���{�6��(��aa>t�[�d
P�
L�\��(��f at IS��Jw"�x�ל)Q�Z���v
�
H��mb-L#sO�F�O�@
��s����&���R��,_�`��I�F`���y�z�r2p(�S42
��wE������J:���S���΋��r8#���V~Ҍ9������d��O?�
9罐�r!�ٓ���aW�xFc����'��Y3IZ����U����#\�(ރ�U����(^�j�Ԧ��.

1�
0��xي�X%.\:���	&����d2=8�\K��$�Xz�)�7zM!���H�#�@�H���MUC�3��9P흞�*)%�ޑ7�}ǀ�{db�;P���ӆ%���ᄕk7����w����_�ι�w��4��)�q�9���'�;f�#G��3j�@��IS�Ͱ��yk<�
ɫ�d
Ҽ����y��/�y��ڔ�j�R�4���S/�#8���:ĆR�Xʦ�
�aW�~�f�0�4Y��4����+���R&:��&��#
�e��^���ne
�%�<.0��	e
�ŧ�J)�F�R�G��O>�U��V�Y�3���SP�H
�5�,t�+0�&F6�~��܄-njy��u��an�\��4ɠv�Je)`E�

�#�m*Q����z(
���4N�l��Ǿ�F`%0a�%���1s��C��w!��A��GW
�^l�fJO
7rH�
��lR��F{���;�CJ�%Iǧ�	��\RQ<���R��9���x`��`s��֜<eD�&S����.��Q��U��Tu��5jZ�L6I���XLZ��JXy'U��ێRE;z�]J*zǎ1ɾa/MU���%���ܡ��"h�jt�pc�!iOF.Ŗ���3c)0�O�gL�<q��1�F
6t�<C�>b��1 ��S�Ϝ=Wqic�K��alU�Kz^϶&�c�&xP7;S�V%+Gi m1�����#X7ʘ!�4�X���R:i�x&��p�ӳo�(^��UCG��v�z������Ň��s�g}Ŭ5��<,
+���հ�N[��{��?)��P�)�k�D�
H���v
*1�2GZx���qRV3�܁*�d�9�6�6%n��g����ׯY�d��SƏ
:0�{�-׭U�b��D����
M���<����?�,��G���?R�y�����3q
�v�4p���Sg�]��z�O�G�����!_�'�
��/�ԩ�J�m�e��UK���&RZ�k�VMu	
VPW�C
�#(���
�/݅ӏ��/N�(^er����ԭg�
+�\���p�,�����²����F�-`��:1�3���eH"�ٗ���#Ì-M/
0	�
0�T�k���(Q��'� \u)Q�
%D_�
�%
�&
�?����7i��'�������Y"�
iK��HH���e�>
'T(R�X�ԋ��cG�
>l��A
�߿��<d�p�p��K�_���m�|"9>�*�vFܯ�}X1�
����n�\7Km���j������z�<�S�L�D4���`�6�dTkzl�0��T�T�Fm��u�ap	7pՐ��
��N���m��S,:~��.��-3NE)&m�L���G��Q�a]w 5-?��%S���]�J�G*av?�ST�Z�����.�̝�����7���{��*���������s��(m,n'H}�4���Z4��Ic�5�U8`��(���������פҟ��C�A|�L�i�6����g�_�
#6�v�F��p�/�C��	S�c>V/_�pRz��>�Vj"é/��ҧK#m��M ��W:�%����%7��E�.���ń�(�De�u�|��Q ��8k���.�]jZ�D��f�D
��5��h}+�Z��^Ӿ��Ip� a.���F�wm��6�$�.%U��qE��~y����XJO��|V�#�=i��Q [...]
�߯o�$:}���?`�!��c�p��
�3�;�Ue����/y��z��q.)�Cy at jv^���4r�M�QE���z��! ��%
%�K1����G�%��%�Rh�$�KƳ}S|wm�P����7Gt�{�
��
�/���$�{V�`�$`���V\T�
�eY����⤒��[T��]�J-�
N�/W�:�D�d.��$��KW��Ʉ���b�M��}��Q�P܈I8�B��_�d�JFS ��JQ�(�A�O��
�j�h9*aL��h����t�<R�T��5�4ĀMϾ����8u8K�W��DXB������/���� ���N�J�:�\���YBi�Ŵ�.v���j&2|��:�7ɚ�(�I.e�
�d�w	Ī
�z�0
����a����z�y
+���e:�:.X�e��P�t�$�;f��%��EE�B�sR��
l>q�h��� ��|�p;x�6�v�( �g
=�����Q"&����ow�*-J,=e�
8��!�1�YZ��J<G����B�w��������DV�,���Q#�
��ԫg�
����ѳW�>��
<
�����P�p��=������S�~Iwh��R�(ƀ��5c(��1�%�ڙU#�*���2/�
����G�\5
K2��!��s��$��s	k�"���7e.Q�����o����a���1㬋w��7Lž��5���>��]�ʁ�\h
�����RI�Q�J�R�J%Fػ�2���B0��ɞ�%;�A�9�
�Ụ�Q�@H�M�֬X��<P��F
Ч{�v8 �z��LH
+��h�_�J
Ҕɀ�<�,�6��

:r��i��FJh��b��#���}��Q�y5�k���*!��v���.v�ꏇe���Qi��/��\�S�x�s��xh��%�{�撒,Rc�h�)��3�p��g�d���Kf��
�s9�q��XsD�)�"I=�F��I�	�VS�$�nV�N;JR����`RJ�
+��F�������<�ĒU%
+'`�����>3���Q�'�q:t��ˈ�@��J� �;�H�ޭk��|�t�ֽG��}�
@�i����������a L��[ZOx��z���s
\4qb��$M_*�S���<Z�bE���hGغ1Y().y�xwH����?��Q�P�jhV
I5�p�Mv��?Q�s�|����X�n�q���oKdAI
��q*�$`)�Ѐ�wz W.�����p��dSIg��4<C��9�Ķ�*��mߥ'hap���Y�t��u6��[���
;v�8(c>��OP֎
;����>ծ�z%����Uܯw���چ�\�hڇ
|�>*
*��ע�l�b�1-M� �f��^���cLs�x��"
�2�FP����
9����ߎ��8�wlM

�N�.<Z���
�{�!=�
���/��x�r�x U�K"W`�Q�ri���X�
u��]&Vf܂#ݡz�ťK�����R`������)�&�RH:�^�I<O�������$J(I�
%����#�[�Ά�w�o�6�`�Lw(L�%J5v .9Kz1�RO-	�|!�WED'x@�
KRSe��I�zt�ҹS����i߾C�N@�
�����dq���UC���A��ԕ/z����S�Y�����\�2VO�ЪQ��/��%ɎH
JK�K��?�ţ��jhƬ��u̔�� }��IXt"/�'5_*"�"
�&�%l�$-�(x7j�`�R���������L(���vv���8҇)��
�O+��\
��
M��-����27�;�;p�@��;$l�����F���x�TT”E� 
�u
�U�'�D�KS���RH�v
�+X1�J
�t�
��Sg�]�Clۉ��H

:�u �#t��QkR�͚>]�~��b ��TZ�&;HZ����|@s�0
gl3e͎R��q���w�!V=�\��7j��%��7�@
��|G�Q`��=�}J��ң,.^�G-]�>��
�+}�n5�B
�H,]IG�+En����["����$L(q�
TF	
%�=��D��Q���\3��6�,��	����04�f�M��C��d�$�J��h3�
���
+����N
ڷmӺu�V-[�jպu���;t�ܵ{Op��K�s�PqI�7(�e^S�K]i�20!ɼ���Bք*xwc���=��ĵ)��kSTȵ��F���TwU�Bvĝ	AɃ%{T+���������tՐ��nV�Ѻl&�I y��
+O�ޭ� _�R�Y���,�P
�d��]�EP��&C�������j�����*�ðyϾ��
�[��F��ʹ������A�<P� |΁���
|�-7�
���=\���%ܭc���k �H�d|�t�������v���j7�J��)�G��Kl��FӸc���
=~�t^�L��t�^�����
9�����
Z.J�ݕ�rsʄ1#�
H��+��R�rZ	#�iRs O�
 �t at ujw��ʎ�a��r�T��
+�#F�X��� ,Z���m�I��ݔ%hң
�1��.&w�AL�XcL�5)5!�.aO� ʗv���c&�C&
엄	%+x���(��~n�b�r��%�ۻTb	�;pb�4�0�+��x3�sm�����FD|!DD�+q ��vǏT�,���ԡ]��-[4o֬)�f͚�h٪u�v
:u��O�6�����/!$��ʔ�c*Uy��������4�>���Ҍd���~hK̔fg�6ũ�d{=�U/��
�?�c������{�d��ɰ�xC�/Ѡ+
����&L���$�ӷ�:�m��Y����S*5b�/��6���*b�Ҁ�:��r\��.01�����	%�J��<���?�P��2s�|��h����:s.�q_����n߾���8���>��A�@��������\��ӣK�V�Rn���ӆ��\����_��'��KS����M9�i��q�<��.���
����TL���;@
�}�
�^�~����r*ы��u�
�nk(��K��k�m߇?(.��Cv�8MϞ
��]�(��tz��w��ǡ��
�2`R�E�L�t֞��12s,Y�'0��摖-�
 i�8`m�tH6�J�n`?��0A�w(d����֎��J�;g%z����|
�&A*�D�
+��m���|#��""�YD� ����`��bV�:�ߣkg`R�͚6iܨaÆ
��7iڬ��}��]{�J�sɵ���2%��q�y��Sڏ�<�!���y;��b�����J(jS�j���KJ��G7�cBX��� 3X2'W
Y�Rc�.�!���3�(=
�M�E&堚����1.<,5�{w�8Kh���&I��S�*� G���i�HJ7N���-�
h��3�%H2G�$2qu=�P��7o�`�
��={���
��9�5п(m n[��&�	����nR+�J�k��u
t���JT�;ҥ�A*����
���,���)u��D���E�����{!{�B�> I�ֱ�����I�pv|R��H�:�f+Y����
��<
+X�!թ�ʊ�Tw	ĪB��ƣ�V��F\���0���6���G-�&�OT��a&-}e
g�:f�yk��OTc�.U��H�0C]��p ϔ �$��BFUhs���E-Bw�w
�s�V�h��X*T�U�5h
+Βn���jG��7’�BDd�X) #�ov�j�A'S��LjҨa�z����S�n��
5F0�iסs����
+�%������	:��:Oi����s�
=�Y
$M$��+���r�$�7�X�j�re'{ݪsP�m�P��%)���%����,�jh�]cb�#	�
+�۷�Zuq�N��˵��]����:6,L���{�:�+OPV" ��($@ U�2r�$� �D&@� �
+�%�dْ,gY���$��Ζ�
d��a��ٞ�힯��ӽ3�;��_�'�Xu��@���e�z�U�s�wι��M�Ib����EA	Q�`�[]RҬt͵)c��

��B�I+�܋���
�o}E������/~	��׈������4��F��4�,MU$E�y��'
����U�2��ǣch �6�|�g%�t>Q4>C���퉙Sg��fl>"�|��Ґ��L�� ����7R
@�����"��|�S�?�8?;5��l��
;ⲒL���
�8$/�ey�ţ�)"\"X��i<\^�ûƪb���&~,b�e3�,�����_f�����z���!�Q3��~�;AI�

BN���@�L'�q�0֍�w��́P�%�sVJׅD�+�"��;��A+VaR����>���>��;x�1#
+" OCSH�'x�>ҟ�.`���s
�Iӓc�Ǐ�q|tl|b����?�xIE����>�Q0*`���6f�,��B��w�0�_bO��2�o�zIzLkc�2�"{Wce\o�U�
�IJ�h�V{�_�Y54��j�W�^1Y�J��4�ILƎ��;,�������oa��������낓d�jy��	���eG��V��s�Ҧ;����(m�����y<d�yy�)�a������ �~�������=���_���?���o�L
vO��>�g£�Z��kȥym_;����b%<�)\c>�W�q
a~��>)�V�H0��!
U��`��
+�_�B��G(�B�9u�����a��X�x�5+-+ɭl8���:
*��P��p	;Q�Þ} W��qك�K�~V�S��zD����3�mY_�w����l���
VW*�+�����e2W%Q�M��Rw_���[z8NB�E`��'��w�GI�(��w�T��z)�
R�"�w-��
�zq��%t�
���1-}AΈь�	�
'@�S�����?�J���i����G�
>t�����
:|���1$����,�s�^1T��~�3����f�ϰ&�>�
������`3��M�(�u#�J�)�Iw��xa��&
	�������6EJZ"્K\�;xYUC�!�f���N�6�-
+��4��c����rn�%x#��� %M��s�/ZPRހ�d�*
+'4G��
�)	;,�\o�[,�
<JV�����|�U��?���~��o������o���5�z�?��Om?|�!M�l�?r�0�J�w�u�5�[FiY	�~�v���ʬ�E����f�5��+��A�iN��;s���q��GE?9��`����,H�<ޒ��Rҷ��
jq�����
�g'!T
"�V	��u���Z�뮓Y<��A=xT��;1���x����͛��zY�S〉3y?�����F�L�L
4	j�I��VK�!��c���sGu9�]�[
.�.��~,|
N݁i{��
�80'��GVɻƺ�*�S�V����d�`o�I D��h�up/K�Ξ�9�5Y_~��
�	|�%>SO@ǣ������^�'�N:v���#���ȁ��1�ON/���3�oh�g" �; ���.
U���Jc�{D}���U7�@ؖQ�9��6�<��G�%6�z0���RR�d���*���%�ţV)j���hy��Y/�W'�
"��ʠ�S'�
��
+C'N�B�N��nHK�n��/
U5'���D�#���	�!W�7pa�R��D���ma��c�`��a�	fP?��#��`~�;`�������G?���H���|���F�ӝ_gK@�#����g&)_�����1/�c��h�7�u�ci�YI�+��6������Ɩ�
��GF�f��d�;�}{�
+}��?���Y
,�9�C��
-�N=�F��A�xrz���}
*��J�.�N��Y�J`7���#�q�#�g�Kٺ�z�4�{ӳ�K� ��^�(<ϧ����'o31���$����!Ɲu����
����}����%�����%����b Ls���E�[��{w�<er��#���ʻ6Q�%:��(s��ҵ�*�W
<��p��ӎ���y��ǥmzÜ��S �=5%�%l��	s08�S�I���޻g�n
{��
��t��񱉩�^z�3“�><��eb2`m+��45
�cҿ�wÛ��
�ʤ5�9W�$�T������4��CKJ+#%-Y�x��?�jh�]5�լ/H�Ne8
.�ɒ�?�xL��[���Q�|C���8�c���%'���w�
�@�^ˋT=�*)	V2���@aNK`��dZz�r��#��o~
�����~�{�?k�+���w��o�[�6`$0!_�v�L��6�
�O���`���hE$�hY�ݷ��k�Jf���Gk�Ƹ���бq�
D�`ڇ���W��
+����S �e��<��u0���l��>
:KC��#{)T"�v%�x^���ݥ�N�^���V"�7�gx��cc�/���"�1
01���p	�W�V!�:�����G�y"���ο�����o��;�,�#&$�3�,b}�5AI�� �u>x�)�m������к�䝯W��x?#{w��@�XefG!D�fAI]v�`FL���}��f���3�BxJ D�) �S�0"��SO�-Wc�I�����548����Ю�{������¼$��~���ϐ�T�#n��I�M��w�����l��m�sU	J��?e�\�6��
+E�xE	Mc�^��Zn�PdExѴ���J㪆�Ȫ!�f%�y���6��1�^�?������@#Q�r�o
+65��$� +3
��=M;���	�
p���OjBEA��v!�d��5d�!cy_b����9�����<�N���{�
 
 �/����M���7�ݯ��m_�ʗ����7����@�V0�ꀻ�#�Jk�JV�x���	4�olŢ+�،Oc;���
��1\B3����I
,�8y�@P
o|���癓Ċ�cHJ:�P�Y�N���7�@�Y�j(�^�J=���i�tV��z��ò�K���s{��T�$��W�Ȑ�>�uFx�g�A����g�Z���l����Dӝ�t$���آ��o~�%�?U�q�Q旄�Ʈ�`ڞ~�Ԉ��'Ѹ���
JXy�Ӂ�C�x�;4̌ ����)<�
��FY]��g>���bF|ޜ��S �5��g߯3�d�����ڹc����F��d�=1A�4:>套��ﰟ����J�!M*m����/a��
�a4�7M�(����+֦LM�
ew��[(�i,��o��s(�����t��U���m����h�W
���KMrY��b���LQ����J����!�[�HH��
�,Hg�2
yד'��:��(%B��z\)�YI
f��ÅJP�FWp���Veğx	P���k_� ��:��_s�7ހw��կ �^ó�_}��&j@�%0D�w����'��g��J���m
+�ں�vJ#$ڎ��‹O��6�#��<X q� ��<���kx���٨��:�nfj���{�9T"��$��M�9q5cJ������4^K;//���x�<��0_�>�0Q"J�r`e����Ix�9��
��S�L�9���R1�X����7��Q#F� ��?�Z II
e�t�f<�?;{z�rw�IT�@
J����%��kM���W��R#�e��
��޹{��#x�6��}R&B���Q!"_��)�b?�M!�Zp�l��΁�ޞ��.��=�};�v�%^:.yI�rn��f �}AL�x[;��V��R��F�
#�2I�q���H�s�+J{�e$_��(IN��)�6p׹�.�w;�����R\�Q���`����jyIyu��Z���$&Ž���xL���e��yw��ۿ43
�4�8��(N��*٭�p��r5kAJ����%�9,5�w������?Ff��1�>�Y 
 �/=���=��/~�� l�6<��%�����<�f3��ő�v�w����C����X�)+���\
+
�t'
��
�,��Rvf#tR�W at +�a2C��@X
b����l�����=LJ�A踣��V�|Q'o&�Ĕ�S��A�%[:��V�t�U�w�P���=����]��1�%1�%�5eo���{����s��]��O�#��j�����[����v^3�
Fz�+���o��8�$&!�д!��fx=�9	�>�X�N�q:�W��}���a�nTIn١UK��
R>��?O���>'�p͈/���_ >R�)A��e>R����z��:;��h��wtvu1�Gcx��K��O𷘘T 
���ɿך��TCj���_
o�I�?�_U.��hd�U֦��:���i��6גR�tE�nZ
+g�̪!
+�������K���$7}�D
�O$1)i
? �4�ay�Љ�0j�V�淿�ͯ�����(>U΀�,<&9��=ѩӦ�m�+�
���T�7�Jrߨ�\�AW��7�]�Orw��c�L/���+��W?���~�9>
��3��
+`{�Ov�C˨��#�>����e���L,+]}Օk�Jr_1/,�t�����2���l;rt��B9I�V
^�êQ
,�8y�@�<��'��X>�����|:�PIo�5B%4�W)����{�����
������ir�Dj–$&\��.�P1���f�����'��
�^�
5��
@� $.��>Wp~��&��T��ܳ���0^O"N�N�
J��!.P�8�b5�%�“�� M�s/

+�g���
+�Q!<%`F�)��S��}RԷ�N��lokminn������������ۿ�y	+�B+��ϕTD
���P��G��
#�DK�EAH��0}d�����t&
endstream
endobj
324 0 obj
<</Length 22349>>stream
+�gp�U�b���i���Q�c�9�t���0�-3�%ky�U5�UC��j��%n����E\T���D��kC�?
��v`�F
��h
b��AC���;���I4��ހ#{��0��b%n�z

!s�
�Rx#����	�4�����>�"
�
���K/}�S/�x�
��>��K/}���>p{��2�@$��Gc�N�-#�So�Y)�£�&�,qƆ��A����
��|��}�#���X
���q<�������(w�	g�
�x��`i�O$�����p��ۈ3��ݓi<䥶�楩'O��c��<�TU�|���31���=Ƞa��[���p&���PӻF&�s���I#h)Fz�����/����+:Ȥ����=�
s�^P���D/VQ�%-T�T�H�i�-��ҎY]>B�7V�ez�N<z����għhF|g��O	ˆ\Q�
��ځ���y44465#1uC �sh�^�%�bH�%��R�_���|Ol�2܌�JUjM�*�2şV��&
wB�0\i�+��*lN��;с�6��2�Й���2��В��37YUC/����	��L�31	i�N�_���������w��XDb]K�5�8�YX09I�px�-}�
W�Iv�l�
+R�8
�p��2-Q��A"/��vρ%�Ћ ��|�>
���~��"����<���o�"1qD����Ҙ�>��f)lP�Jk�J���A��fN�Kf1�׍IM�:B�5y���O?�,
��Q�@H
h~�
�'Ѫ��h�Y����e�$6+�"b�
))^Ҩ��%�B��G����"yi�>�ǣ�9z$��S��SQ�_�h���"J����΂ &�O��w� ����/л�
�_ɖ;�I��0��jF� ���8qdž��N��<�R�]��x���r0Qv�
(Y2�Ep�O�`���:��ϴ��I��=N'
��x^�9!>
ƌ�y��rJ,�]��n,�hj����rY
�\����	�/�B��0�/pѨ
 �n�0�͞�R+S���i��3�|dƷb��p_
��9ב}�B��R�N�J�h���aC�d�<8��*�W
uts5��'y1Ot�ea�J(��7�%�ICG�ۂ��
cr�k�܍�؆�%%� Af


�\���wO4՛������mT����W�GJ#W�
K�M��;�+�)+v������3���$�L��}�`��LJ��y�y��

��xd�{{��s�(=���X��
�|�,8!\c
����D��:����ۉ����ۇ��#�!S㙠�>��x�(y|����Qn���`��0t�
�EB�+	΍�ʰ�
�J,/1/�Q�G,��D
YV���*"UsP����L�2�I 
�+�m�/�
 61�F�|����R����h�#���ۂ�^�
+I�}�Ӹ4��R�;!<�MǏ�׷�k
4'	�&�wh��經�a�^e��D]&K>c>�C�G�BajG��c����bg���i�<�����2�����l&��Ng��L����N2����;^14|x��}�k* �l�/C�$U��S��/m���6wq!��##��7(���\.i�i�Q�Kb
+�tף���%���`\��t�PNT
Q��G�
��H�ci�r3M
tP�tL�P󗪗ۯ��	5ڍ��7��x�A��¸�$�{B%�*�l��/0Y�
+1XI/�l��OV�]Au�W�cO����!�30�z����駟~��s�;�<���O��_<D��Gރ��O�ڙ����@TA��U��JM��%=��FЈSpqfa��{��'��I
�)�'Y
�?�pV�-��<ӤB&4��J�ΦW^��=W�t�=2��
+�ҀZ��}�s�2`R�D��4�]~�؈#��
>��nK���
 �:���N� U�F?�> �G��x�2I/}��e�cJ��ܬ�`��Dk/��cº�;���;!jKԨw��Ϝ���Fc_����?
��BN	�OьxLBD2�Y���GJJ��{���A�L�3 at L
MX���C�ff�3I>�3�>��	טT l�JReH��JcЋ�2I:�.
+��^'_
u��
+p�e�� ���c"NrԦ��%;�])�%�Ż�N��t�Q5��G�����e7���O�/~�����b&'t~����d��m���Q�
����!#�C��2
‹�9�=a{E�,�����
KL��ʒ�’����6kQ7
1����������'i<e~�}����8��LGhB��x�l�~�/
[�b��a��.�ᗐ�5V)0K����Q��n�
Q�>LM��A
���^)��3�ЬJ�xH��
��	�6��
�F�(z��%����0/����L61�%ê2
�xG�؈#� c��Xu[�9��_p�D�	(��K|��*є���`ˮ��Ȩ#��
+I��H�=�)�*
�b�n��ppY7+y)s�*,ѫU��ԕ���
�ؖ����
ψ'�xj��Sb�!r�� U9`�NpP����&50�D��#1esu����4��W
G'\>�*^w�F�$�$�R*�u�T�oIy�S��G�7�^Q.���(��iN2RH�G�4^o�K.{Iɂ},-�UC��pIW
�X؄
Q��<��Ǖ�$��+��L6t~���1���Rr��-w��Ѷ7-x��'����Y8���$�$�F��MEz�f�
VX�����D�i��8u'�� xxB��?�0����/»��E�A��Hp�c�����0G�/�H#lF�.���<l#�)l�0Z<MVh���
2��"Z"!�%"�q�1�g�p4�ۗ[5��(t�
�*�i	Ĵ�U"	a�K����߫��5y��y����)��=���������G��9ވ#� c�Q�%��cD����
�*�$c�C�F
,F֟?++�1H�b%	|M�0iP,�N�wjA	��܁�[�W�%u��Ϙ�K��;ͭ
ݪ̞�ѝ�=9�1f�k>�)���.�ٳ�"�v��v9)�DMuuU�v
UU��M�HL0�D+��<��|xQF�q
 ��
��5ɪT�^�M���,oB(�U��_bݩe at e1["6a�PЮMQ)Wu$��__�z{����K��U
I^B
)ʆx�
�ڰ�n�ω|�
��:
+=��
����.O��>���!_�'�̂l�{Ț[*y�
(0Y=+���7YV��:�˖�
��/=6����N��!�8�9����9���p��	l{̮��+‡x`dP���ƪ�*�+1M_�^Yz@�d&W��B�

���fB��ϳ<����
��6
��5I�a�ؐ�5��^�

��2���t�W\%n�eƆu���	]�g�Ő	�l`&ޛ%��~�u�l?�m��}D��p�A�������J�l�M�q�[
��W1k���
h֞�III'�0Iq L�I��к�ɻ�;X2
�m�H89#��
�1	3b��!��Y����|���$CDR-G`7��5�H�۶m��VVnfJ@Ĕʠ�$OC(�

; fb2`��@n�fH��Jc��R��5!	�H)W��!�s��k
�+��Tx1���3��%W�ЦpՐ�K�����6(b�t����A��x3��E�*l]fzq5��}\�FTn��,H�0'��]q����^�
+_u��{
�0��[��"�jM|�����
CC
�S<;�؛;u
+*v����O����3� O�C�DxC��g��N��|��m�Pi
X)
,��'����0l={p�
�sH x.(ɣ�@N�@H
3$<,(	'�r���7������q� F[�w9å
�pI//Q"�KY2�'�Vd'��mYV�A�L��8�/ݿ��Ĩ�ҷe���:����m�Է�)��z�Z
|� ��ɨ������MW�=�džM�2uGss��nKJ�2�ZY�����:ڄq\Έ���"fAd�!r� Bvö�d8���m�Z^^^V�ٺu[S��Rgf��a��1=-�ףn��ILkR�R�o;�g5�xY2�
Bw�M`�Z���+�r��
oos�Fw�n��a�,��jH��x�tP��
x+_;/03}2
+�7d�2C��	��;j�i��.�aӮ7�S,x��3p��,N*�
,���jVX�B���*8`Z�7�^f:��	����x����)�i<�Ok���oOOMM��
B�a#����u
+
��>���wF�7���Ÿ��<D�t�
a#��RZ�F���ǐ��
cyLHy,%�Ǥ�P��T�'x�3�y��.��;�
�*
++
W��a
B�RZ��=}���@l!1��z}\h(���j��h�
>�$�-as�?G�a8jgz ����R��;_��,�o�"�&�7�/�]�,0�9�n�6�ry�0A�~9��g�7G�6R�2<r�LZR]h��iF
r��Sž��H"r׬��V!%my�ǖ-�MDL0I\`�V
�Y����� 8�f���rH�B��t��
��5ӛ���7_��
}Dxtna�:��RHF�dl�t��䤥b��d5k���	Pip1vx[H�yK�
Q[��
%w!vv��%!Qb�<R��O��n�fN���M���OV�=l�VX��4-�c�T��@�h��� B8@��
=v�8����q砷Fi�k`nh���lD����bR�s�o
+��c%����Ƚ>8
�
S�7$���R�S�8���7L�'�뫽��D����6:1��%���K/	d�#-�
#[�p�`&��ܤ�Oư��W���
��3��!����p�,�hz���!�ō	�$���c��!�f���(;��\��r�Y�0�%���-�r���B�X���$�!j�
��2n̈c<#���R�~�5���⤲-[��JK����	���
+�$W
���N��*3���� n�\D�R�Bw�����A��އ�0b��I�t?����et֦�c����Ϋ�I����b��D5��%�	�ipAL$m�, 6z�@結�_�
-wn]��\&�8�v】,�#%��J�0�$k�D�R��7�ZV�]N+������O�*�E=�i2@��"5� ��0LGh
���o>�'g
��ʐ���q��m�E2���XD�$�ֈ��ހh��W��
��q"�B<u���5���Ray
�� ��߫�O��Tq���b�cU��d|�d��0a��1Բ
+�dz�
+\0
�%�.ܭF[q51� a
1��y$(l H�!�"��7����<7�-�X��ĆRĖb$Q�H����!lVJSI�0ޒ��59�<ܯ��m
VjK7��ﳏT�k���5#
(�nj@���A�$�\ٌ�!%=�����
Dfڂ
+ES	��Yj��EDL�N��c�d���h�Ti�/8����&�a|�)J��Jw��Qx뚓���My�-E�ƕ7���"W��Ǯ�!U�Zmxu�UaSt�J_�
��Gh�'n�AG4�
+
���0�.z����t�
�-��s\�qrV�3P�q��X͵��zP�7U�˹

<��l�!,Vg75�߅Ǎ�


��0q�8���f�蠲]��uNR�kä�Q6(RZsV��p�s)MZ�<�V��
g�<I`��>)���O�@��<�X
=�2(|��C,}��|3��T�d��L^ڪ͘X���5[���Xz9��Ļ՞�$[Z°�6�yP�i��z���^{�Un��
+�`"6��;�,&����;�$#qiژX��3
�����5Nrmuq��aN�	�"�d9n��A�֌�$(�nƌ�+fD�	�!2, 3� 3�!b.��7��v߽r܇�,EK�
+�
z�P'ɇ�D�ِ���Zt+1K�B�Jy����@{���UW�� ������
��H!Y�;
(���]H_�b�%W��/������~��Q1JC&d��h�g:#��g�C��e&#n\��n�q�
+���	�Y��
'}=�Ff��b���c���j�R��L+L�0��3舗�wvu� x;����v��b��� �w��A-p�`���tPq���?+����%�Ӵ��Q;SO/"!�]R 䱛��A�������IF���o��e��^U
+'��
�$�U�f��%�у�"&��N���^��Zp"L����:HP� ���'��6�AX1�X��m(;ܘ�0Hu ��:��Ʃ$l7 
k
"��J��4�vK�-	G�=7�tlGG3��gĠ�K"D��1#��
A�
�$'	J�瞻�����?w�s0)�<H�� �}���g1���xR�χ4��d]�A�C����u,a�(�^� Wx�2�
X6'�RH���*��"��Ҽ$�S�ȓ�}"�#;�n�;=m�<'�:B�a��
���e��b��D���Y J�͙�.3�PkpRd���
��f�M�EF:8�$������,���
�������	�'�N{���>�
�����cɆzdj����;D����ّ�jI!$��E�XRb
K��*xl��
�(��<�H
E	��K���o��
�(�4[R��
*9����%J��K6/��l\�9�-��
+��3��,EM`���
� �`F-�T[@��[#�)CP}H��A\!��-ƴ}GKs��^t��ލH�m�ж��$��p��G%����ق���&fD���挈�Ɣ0f��H#z)V�'��
$�;��;���y.�+Z&xI>H^����v�f<l��k�T���"���{��&8�=K��f�^
�
+�(J��Jq��x
P��h�����@��U
���m*8�l׳���
���ث{8�;��Q{D�.�T=
B
n�$F����,�[ގ⤻�Z�]5�Gu���+�������|=Žp�����Ig��x�F�x/B6B��D�cj�"�[��9|�
����!�d�i<LB &�C$�NHwA��Q�hS�0
�,�Q�VT��k
�J.w�^^
+�R)�GPa�6�2?9���RC�)���ɍԲ���yJ��y�:$ΰ�蓨��Q3 at D�3сI Ko�Bp��GAf��;MI*L��-���
���ɻ��(�M<X��{
"/�=EA�
�DG��M��]J=��Iw!!�c��v�&"&��DW
E�%�DfV���.�*�|2�I�K�<�^H}O��9;��w�E\N��+7�̹ڵ)�u�U�ޅL�?#UCT�ʼrH���+젴���}lګ3�#:S=k���Prb��T)��N1�
��$-x�ơ�EA:+,8ɱ{b-��
+� l�Ep���-�u<��!��X�

;F��9ěx
��	�-���d�7��X8n���Qo��$��uҒ���9���b�!Y�<���F�H��̫�R����X�-P��Օ�pI�=�D�
L�X��d�2,5<D�4F�Dy'��g���y�:$̰'�h�h�g� �2Փ��u�zX� �7��҆.�j��2
+�$%q�3-����WF�.�-��⎊
��,Z�Έ��
˘
���)!f:)
+"�:=<٦��شi�݆Be��.�
+�"&�{�`�ⅭT��LM
+]�A/�����&���v�w'
�F�5dM�u�K^'��_;Ӹ$~tՐ8���%�xd
�IH{�d��"�#�ma��bg�]���
7��s"(I��4����Y
��V{-�������������;�
rB�<Vp�%��Ɔ�#0������X�
�b4�5HiU���óhI���:�%��e�$�G�����A�偽�� ��}4�u�IؘZ�i�i�^�_�GȀ���������KYϛq�6�Y�#� C�q
���HĞ��N�����Z#"����#��v;,�G���85�� ��>*��$�©0�4�1�d
Y�$������vc��_^]�f�.���,fD�1#$Dj"�J���[oEfbb�
+Վ���ErIef�)7c�v3����IR�9
'��W��P��=����>
+��2�����&ƓXE��ϵ�UC�Տ�N���
2�VO��&,�,h�<��Pr�bW}�Br��0Ҿ���;��uZ��2�`!f=���lWP[a�
�"��&�$��G[
��Qǣ�9ěx]����)LEE�\ĥ�VY�@�|c��ȃҀo'y8R�<�,<� LI��on��)��QR����y�,��T"�wb
+l11���l�`�}�G��-
����:�]@�=eS@�P6}�N� )��s�o�0aG*B�&$��T�J��2 MI	SpEpRl��
+���ؠw���0�B���{+rFԇfD62#*dݝ�`��³���|3�1�&S������NPniP���*����IT�=H{Z}�>���q�<�DR���ܧ����0']���6 �����
+9r��N�v(�@�dl�C�l:
+<rD�.���r�>#�
+�
�j*�HѲ5Kyk(]a��h�$�:��SAL��Zn���]�h����C������$���[y�U,n�
9�w�a	��#�RʒP^P.߆Ąv��	�)�G�@Ly�@jk�ۦ��@�ir�>�*�Փ�]�C8�=cyI�Բ^`|+�TZ���ݾ>Q�L��5�̎K�\g�{$b
8�'Qz�,����o+n�4et�;�y?3�n�6�5��ڮ�$
�'�q+��
�C�mBLG�.b �W�:���3"��aA�
+ o#JB��Q����VD�������?�fcI�)4)t)�U߉�7!
�،'�Ɛe�P�Dؗ�1�]_+����[�%��5ipQ%�2�3Y�V�&�̅�Z�B쪏������
:c2
[]��I��
��o�OC
6���	b�
��� zh�}��%]�g����h�
�	�6�Zę�Z}Q�����FXjAY05LC!%�"B� y��� -�����V�k�D�j�{
+WN^
+�עE ��a*��ȕebW��':" &6.�뜠p`װ) w���ܜ��6K=w���!� ��aIH�VZ���|EI[͉�,7��Es�S��C���	͈ڢXQ3"
a:�j��Ѓ��V<n
+�����1�
 ��c��McQM
+]�qR�o�Pߨ��#�vy��;ڰ~߶���Q
�/q}1�)ka\�	U
i^�Ӭ2Q�܀�)/�C;j�F�0tP�Q����	ɝ�>e4�
+�]my� �|`d����$#B]'o $}m�ô�
��{@X,�&�&�^uM�8�E�Z{�7� �`
���R��iӭ���<ސ���H��d�t˭�Z~�fl?Fv(,�D��Ct6�f��g�E�wN�:yi��%YP�ټVhbJɓNE�s��'�{
�TdҨ�6��&��-�h'�""�������
S
���&!���F���$_wi�-r@
1øa�l��[�ͲfDm��SB��$'!%݈�P�7��q�H̺|��*U���Y�����P�l�dj�Ti
��ĸПh�Dv�v'��+�]&�s�%�+�MY+;���:{Sȫ�
	���;z��!��QÒ���Q٤
+Pq��0�,<`�SZ���ހ-��6A��Kur��2jQ,�#��/�C\H���6D�h�%�F��
=�י�lZ
+[!6C��1&	���}I��g�@P
8Ml���P]U��ܸ��%YQt�
abRK�r�m�܍#�R�
�F�
쮃=�
v
m�Ԡ׸��
+��趃���
x��b�U�(� \������8�8���rܬB
0g�V1#*��U���W���؞d�-q��4��8br8* N���l8 �n�>�<KiR�rT)O��V�~�M��	��!�5)I[F\NZ�6e��v�-A�[�%��9
��$�
M*f��MlKC��!wK�m�K�b�I^
^��;`�����
X�7Aguo�fXH
ENMM����5�J�[zЅ��y�/`ƛ���lr,)��0�X��B�k���@�
�,_
,����e�HA�L-DJW��*��,��EL�f�z��zzeՃju��.��P��;"�¶o )�"D�>�����&�LFJ�)I�m��TH�6B�
m�4g��jFlY�S"4#T)��
LIף����t�L��ܒN�)u&Tf6om��n�P�&�q��w �>�W25�rPSR�2n�r�Eצ��%(��
1�nᮎ	��ΐ�V6��a{
R�!��GN�-���5hB�Ѧ���⤵��qVxc�~�$~65��>jIM��?ma�*��N�H�)���(����k&
+���"qp�ǃJ
�	d�!���y��$kYd�ވ��%�+����v��P�d���L�/0��.7I����O�9��}ߨ7��]����d�
-'#E(�
+���~��d����,_94#4B�nj��fr3�F13�

��Egf535���R�B�{Y��J5�%��T���;�M�i3nNZ�X\�P����J7�^O
:��[�.K�B�6f�)��b�=��B�i�=8*�]\f�����(]�¦/�A�QG���A"���xl������K
+����Xhs��u�G
O
��~�]B
$�
`�sɃ)I�����G�Y��n0�k選��0fLM��A�Ճj�@�-�+�l��Hm���7��f;�m�E�b���B����%�0�B8ə�
5�5W��cF�9i#����$xI�o��b�
�+)�I�K�<Rq��>��;��h��Rn�)uķ��I��s���
a����SQSa�X��]�Fw-늢�7�
+�n+�Pᤋ+���@�'s��C���.�
>�I����g�e>�6^b���6xM�#�H��@f�Dk�e	�!�{�<
d�����Z�i�x�Z��LM�n`���L=��8�ST41@���Puȸ
��}u[D����{�p�%n�Ӫ�(B�I���u�]�춅��NK��AKÄ~a3"2%�a�8(J�D>3�uQG��o2��f�&�mM�*��H}}����s��1����]_>���I(
N�a���&k�FBG�xH�
c�K���9���&��,\LN*����
n�E�
'��d�b
�1�w
q[��oW�$ w�c’٪�H
O���ɷ3��v-�
���;�<\9�5G,�����^�0Rb	�!a�Ԏ5�ST��0:촳U�.��P��3�"b�7�(P�*pE���n��[���*
��d�mII1�T$���3r8��-B�X��f�~6���tz(b
+%�n�`�M��dl�cGCjR�R+�T_��=�^t+�
cL�gW߮�\�%y��Y��m����hA�x�k��'��ɶ9��'�$��,g����-Ӊ[u�W����1����yԨ��g���z�?�`c��
�7G%���$�w�g`x�-���nW�X�@�C�<�~ch��<yɲcQbR�<���;ES��0�P51ȰK"5��]���&���Z�ٚ�vȢ��b3�b$�r3DI�0�B8��m�
&I͈0B�,8!��f՝�[��k��d�3��
b
+9�VC
+�,����$���.��7!	�`$uV�;�Zr�9��
n�8y�F��Q��W�=Y�"j�B'*p3
+5�EM
+5��sS~��pbg6Y	7']$ɻAwMH޴�`�Ԅ�ck,,rQC\N�%>-S€s��u�I�
+��a��Tm
d��M���X�
��'R���R��n�)Y�r��e2�'7S�>F�%��=�D8�N�)��!�UyՎ*e��`�f�n+�ei暤��']�"NrFKB�fF��QNt$ty��O���Io�� 8�f��&Y��I�K�S}ԛBk�R3���o/N
+̀X^2�f+
nI[���A��NJA'����-��P��F����Ԩ�dntd."']Q��/	ԉ��DM�<>ձx�����V�S��1E��ƭq��P
+Y!e�5S[�py�@hw��I�o ��ăE&ߦ�%B&f&��I|qO�a,͍ur�>��ȋ�o��[F4�	����G�AH��a���$	/g(a�I+KEDDc�n�����dF�g3
�ZIHzX�T8 .�f�~b�t&�Ik���'�W�
�����E�!�x��k3��%��o
c�A�Lr����)o���Q��ZT�Q��pB����IW8h)l��
ffBKL�c쩎�K
�Z��͒�
Jr�f�I�-���`�X�`�6@���Y��
+C���Z<�����**�s����Im�ƀ��Y2�T2`k&p%��T���l��֝�t��P�
.W������0/]o �9#���ܬ!�g��p����J)��3
�H.��43=[t�$�HҤT�)K}��LL��m��p�܂��E�$�$yux�Ffvt$5-���]��E�2[�Q7���Hy�q�!Z�2*��=^�l)�-E
}=��,�p3M�K4�,��
+�4C�����Co�4@#��eR$/E2R�6�/e���j7���B����:�f��H8���}߬^;���EH"kw���U2��t�tE1�"��F3�⤫�a�# �ĤL�֥�ʰ&�*��b�gj�
���9��x�p�š'
+

;���{�6�=rb�xH��l���Q���f����;���IZb=
���j%�x]���\w��Z��@JV&��<�v���`�e	d�cA���k���YlY3}���.T�a��P&�$��͞ohɪEÝJ�F�
�l��B$��"�ulb���3���s�\Ќ�ɚ!��
+%�����q���Z��fD4)Ui
z�:������T(�
y`+�MY�Q
/��1k�o7�{�F:�_Y��-�H���٦��D���&��Z����H<b�����wy��B��
�k�篿^�K٨�\
y�A ��wmX
*���h�B�ee����l�f�Hu�4fj7�jc��B%숮�F���7�1� #ٍ�@���!���ܔ�j�tE�r��̈��@dc"���4�AL�>#��f(]�%�ϠNIZ�R�ꯈ�d�$�M�Q����7
b�:3�M7D�:-o���ݠ!�W�&U�f�2�iNhd�������[�ת��Uϭ�-�;�E���ޖ��ŐG!���<n(J
�6Y��Pp|C���6^���
;��N���'_.� U�Վ�Gw�e$��”�
+��Z$]�N3"�x%��Yȇw���|ХI�J=�C�{h��dR�;QL�{�-�R� �l(@L˅�C�Ԙ�	����8@#�� �bI~	�if�`4�2��K��d��
�Ÿ�K .ۭv�(y\�@��($�����|��f&�/
0�cG6�y���Z��˾���^;F7*���iapYE2B�� X�̖1#��q٠�DhF�()zkV���k+���T)����l�OtJ2i��`�Q4x�
/[�W���7���1�ny�YX#qG��;�M{+
�k��t��8�\"�:,�
�,C
dsʅ?���
ˉ���ܑ���cp�نJ��y��
ʾ��o�n�t��n�����Ѣ4'%�*��+3!k:#"ќ��x?��HfV1S�V�k(Rh�A����Gx6!)F*"���,ch,	�kc�m�;:�
���P��
F������(/9�F��;
{+����&oW6K䚵�C
��I�gS�,[��7[�Ee݆J�׹���
��>����Q��Ҧٌ�J��I������R���n�� �ְ*��������g
�%l��)n��7��sSh�uD�K
+<^�w��})�v.��㧶�L!�t���v�L˥�q���#�t�>��p�R&�›�n�[}Mv��:��[��z��cw�Q|dn�v0R��jO�B�MfĒ�R���\>|؉�٥�8MZ��n�d4�P�[ʛ�4-cd,
���mq/:�r7as{D���]l1�p�l	;�;��.l诼� �.)�\�v�:*�8�xm�N=��F����&;�Î�/��-���촣�e����p��JS�m�
Y��qRT�K�J���j�֥zѩ����;�2FGaa�bg��qbǖ��AU�_K7n�����g�e�\��5�v��J1�r
�q���X5�0d�����&���BMv����jķ|��l�괣�Hl�g
+�/%E���\Z�����:
��K��
�]R�Q��S�zs�;�2F��c�:S�˂����cTźq�_�j,�,j*d���/3ˉ�u)�'^ �GXU�\/�U����B�
+3S��T�
�``�׹�
��oR���-
�|$	� #�$�VS\^Z�QpJ��ucJ��n��J�H�&�Uߍ�a
3�R�tIYF�pJ� v
��]��
r�}An�
���ƭ�( ;�.t�_��x-��YB
k ���n�ړc�+҇J��y�5���t�[�N;%&E�Y7��Z}q$�5�HhND~�x��{�ڌs3n0܌��4���n��V�
��Ԑ_�X;�D��2�ĉ���#n\�������+�cU at Vm[<���
+�m�&�B�̉.��"]vd�
�Sb�����j�F��TQ[�Hz
��C1�;#�5'"��5C�Q7�:��tk22
+��:�a\� wM�r��|�#vl
+�q�<���~<�.|8�b
�
��<�T 1�vUؖ9��jDm��d�7�v��n`�$
a�Y6���Zo��'트=�6
��Ѥ�
ɩ<��
�Dt��;�2�F��qA����q`�!���W*�K^�q XE������ѱ�)�
�y�T���j�a�/��s�=�B#�j��l��MHK0���x�v3b�IQ�9��c*�Z��I����D��Φ$
��΅C�%�\7�"�ˆX�q�;~��
$�W��e��`"L��1;��7̋�}v�Vq�tѵ^3�9�yw�s3��4ui��Vߵ�u'�Aek5�UXڮ��Ny_#��r_5���r'ӥ5VK���~ڥ��<�7AWhK��69�6;׹�e���>���ik_4!"[���[�1�N7c	M.G}q�[�3]�#N�nq��p[Z�K������	~5�
��;����+c���H8�mv6;��D:/�;]�Dp���Z�qa���xM.CKi��ݪ�XiGw�_0tV��?N��
�.�s���#�G��
���&��Άb��!G�%�.�K\�5#V��b�Y@��kҭ����!���~���N��y����<�
�h��vט�� [...]
+���>��
1P��UY��6�w�(��XIä�i�b�b�ǪAgU��' ���Oa8�vdK�U��lD�p��el�p,���h���I+om���D1r����0\sܽ]�	�"�뻜?z�E�E���wY{4���e�\
�Dz�_{,P�pu[�9��I[�/����Xt��Y����y�I�X�X�N;��2�V��&/+��X+�\F��qy\QĞ�Հ�ed�Ǹ0M^��rǪ@�2j.���=������xB���y�����r//�<=�1zn�d�����7}
��=�xnr�dgI���օs
3��f�O�.<ZZ/y� ��^���9/�J%KkwO�ΕV��J���
3�3���=�s�����z�����L���&S^�K�Sy/dKkR�|��d>�����J��D6���dd�|�qр� ����y/���Aև��?�h��{(9Q���tɮ�|iEe����ڮ��ə�Ӄc����@:~i�ɅE�<���sA��z�|:�L�z�5�k�T*���3�|$=�z!�M�2yx��_
+�ݻ0zzqj~�|m6��KsY?�Hf�����JkY�p��{���y^2x��t>���l�,�ɗ���D2	/���d�Li6�=$��l6OW�ֶ͟?=�_W��5X}�e���
{N��S���񉝍�7�5q�c�T�l�y(w��n1q��ih����ٹ�-��2#c]�3

;Rg�����ؙ��t���Ίc�]�U����c]
�u'K���ę����=��Z���o�9�5��*fZ��o.�[윢��G�=�~�X�������g�x=Ƿ��j���m�X���ۛ��'�ʎ)�`������l[��q����}�c����ҟN��8�i:�}�ח./���=ٚ�d����75���Mul^�>x�s~o��ޚ=
�r�`W宠��l�юT�W��ղ77��м�
�Ln��.x=����sS3}-u#3m^���=[
Y�X���'�ݹÝU�7��s%�X��G�X�C[���ꨜ��[���ULO����9V֜騄߫�����v����Z;3vjgUDZ�fl��t�:�V{������3{jOLU4V5�\���G=��վ�7�U�Wj
��
d��i�X.y(W�
l��Ol˴Lx��v&��
+�����%�)nn/)*3u�d����Y�A���p\Ԕ�&��V�+jg����ׂʹ�
AG�h[Uӹ��dkgs:�5��=YV�8������y��x��lI9�v
|m��Dp|{>t���ʫ��S7��۷e�k��Ig�u{M����d�~tg�Q��l}UӁ�j�����k�J$_R8�K���l�u����Ly�Cu
����_Mp?��pyy]U��(<�ɺ����T}�Lu
<P���|wUS��)��`SPY������C��@b
�%���l�L�`;(g
n%3�L��_l	��wy���^ob�bڛ�W֞ܺ�H�_���;�d�[�ғ�z�[���
)����p����3�³�/�$Ov�0��<��GZ�[���:^C��/W����f������P;�w����N��O��Q��;w��)����d[n�
�i��9�
�9���
����no��۳><�hi^�t�^����H�����f;����B�e] ��I�J~3>Z&�:��폝�ٗ�6�N�������̀dG�~My�ۛ��q�7�/�
�ٴ%�
��
�7
l��w��4����v��9��޲nR<|�n!�7?ە,�{�
*��ó-���d%̧�4\7��?�W���Y��F���̩C�lG��{�3�Ae�f�^c�������~O�������=�~{���=��
�_Y�C�v�L���G����m������8��O�~u�@g�k���Ǜ�p�M�,��w��=0ۇ3�%�<��Y��W
�'[�͞���6��G{��Ʒx�й&eq���E���	��9���|�n�`�?�
��}ls{P�;�Au7��o욇o��1��m�K&����
Jl�@
+��D�7u�%M���)4 ,�����|h�ɷ�f��?Z��&��a�������h
�����UR�����ǃ�`�fv��Ї@�[�Y����,�`�s��߱=�2=rn��h7̻��6����:z
LOf�� �U�3�܇_�W��`η϶��=�7?�

�y��!���u�%�nn���
r��.�z���bl�5
�غg�
�g;PkM��r�v|�֠3�>[��\���no
Z���O5��N탻i�9���Mw�◥q
+
��
+���g��_I ��|oPy~�|_�f��ݻi�T�O�i�
D+�
&��(̓�#ը��54L�VD<L������
�H-`�熓`u�������
��~�tc
Ԙ�!����$[�s�A����n�FsP� �
�C����*�ꢩ�:�
�W���G�cu�h�A�i�
L�C�h�2�y�Λ�`�x����m`�*�^߹�v4�
ȴ��C���cV�њT���
�P9�
X�-W�փB��<�������:����u�5�PbS~�
	�-8�1�(���K�H=����]�J�4��DM�׷x.��ބ
���
�9���'N�lh���E�i��
К |��K�	�<�=X�������r����ձ�`�
����(���l�
q��?:	_���.�n���<�w'"\�to����@;�
�c$Bi wg{��Z����J���-hCƫ�U=9�L�B҄97���:0�:7﬇�Z��@0��L���1�M΢�i���<�+麠c���tU�7U��\<��Z�NW���> �+۬e��lB
sl�Ii#�х��������{9ׇ�"���:N�un�ms�7����"�t�
k ���W��F�d'�.
;8�T����-7�����vm��Z
4��'6����fP�^�"��LFc��5�t�%���.�s�S`�
��M4���3���A�
�K�0׬� ��o [...]
O �����z��h0�C����V��M�$�
��9�%���
���9v�[^ي�]�3����z����; �@�10�-`i�&��O۵|��i��a
{�P�����]~�tJ����5nZ�:�H��?����sqt�
0j������Q΀t �=�`ni�
+H5!�
���eзLl�Ȝ�mYv556�g϶�����ֳ�xwU�L_{Yjx�hk>�MSdO�b˾]�z.��_Y�n67tu������m��zj~`�uG��D�Lcө��Ϊ�)�Ϸ�i;Yq�5?[QՖ9�9u�5�/���Q
��

��i����0W�������:�9���ζ�l
L�Ɏ��'�w�ff��;z�Oï��<���
v��
>8��{hbk�T͡�x�y/�<՚�>3OgUӮ�N
k���b��ms�;N��m?:�Q;ڰ����u���	��v��i��j�
$c�5�iz�cj��bG��d�zm
��޳�[r
?�����:��9��M=m ��VP�֩�#;�Ӛ=2Q�M
�Jw�m�9����Pbk��Ã�	Zw��:дX�}���_(�(�9���<{�a��\j��d����L>�n?�?q�8�u���� ʬ�Jd+꫁��{6'��;'��ʙ�tCg��7
?��и�zgsc�Б��#�滚�:*{��O��e��Jʛ7:���q����#����G[�ںF[��'Z��N��M�ζfn;ݺ�2��zz��Cm��G��
����v�pYu{P���w
�$�O,
����;j��;���[!ޟ�4utV
������<1�9��|OW�BvWgk㇇�vo��
�n*��>r.������y��bϡ�S�{e��{7�T�6n�O��<��.�̥�����յ�����[�Φw�g���@M�	��[�E�>�xL���s���IX�vzAswUG"��d��O
�t>����bˁ���Z�~]����ͳU��Fz�3���4d��u�ؖ#^rs*��-��B��̙�,~�bgY�X~Ϡ�5�[uX�M
�3��j8?_�:q���� w~���2�>�d���h�o��`j�o�����o�;� ��}�f�����z�c���7��e=1���W����7����zo�D��X�i�F�����e}g���Ο¼�hG�f0X��[��;�a���� x�~ͩ��l:�8��9�%�59u0��u�Pp���	o�|r"3ߒ�����y.�ko
�z����}`��d��T�e�3���lۡ�t���|yC���:�LJz` [...]
+���AZpǠ�$�=�T"���SI?��Y�x�T2ߐ�$��d��'Y8��lt��A�p	
+���T��n%�N���4�T�P�?„
s��T��L�٠R��J�nr^*���I��J%�!�!��l;=�s�g��O��˥a�)�~���@8� � "a�y
d}�O�`ւ��0;K��L��"@�^�X��H�
+n1��
�4��s�z��tr�z0#��%��L�
<Y)h8CO�6������@W锟P�0S�
=�g*Hz�
�0�����a�g�{�	� 0w2
�?Ŋ��9����Ph
�~��i�"��@���р��
N�\ f;�Je
��s4��ÍfY�

�
+�n2/�:�<X%?����|��A����D�� ^�M�t&�O�s�
x(�بl�a�R��p�	l]��@��`K~�L
0�������yMT�#
+%���K~
����;H�}�lN`~7���|�:.�� p	f
��(�H�%٤���/śAK�L�P2y��4h
�!�(��%�y��~>�w(�<`C�
4�����EE���@V.�&�_�QRO��`�<�g�5)Ѓ3>���N#�"%�pW0�`J�	�gJJ at l`�A9hG�E]��V2@Ó-��^�I ���u !��R0��
�C0��`��G��sea*��m`� � �
�+�� �l�A�a.%Q� `�$�Ԟ�4�
��R�C�Τ雓8�#R�ǽT
�)�	kc_1^�'Q���T>��u����
ԚJ��t	\V @��%0���&�
��,=t/3(�ĝ3��f���T�<4�N!@`V�`P�l��i����*H&]����{H)xT���%ы
�Ѕ������{A��@����#���Y�{
|� 7Y
��y9@
l�!�
+`%%lxw �<�70 *
�X0��8�rG��QM2 S���oDm� �t�A���&a
mW:_���S�Z��hx��o�� �z��,�Ty�%d����t��
�E�
Y0�Y8�O�9��������$��3~��	x�Ty|f -H�l?

]`
�{a���%�-���o�ԃ�	������ ��O�K��s��2�d���� 
+\@���(�����
�5�d���(
��sr�ry��x�	����}r/�ӹLi*��Y���=z�������偗ɟ��
\�
�]2O�׀���L�
b��D���� 
@o&�����L��8�sN8�!�`�� �	���p
+�0
N L�R����� �&���%1���%`$��
�����=�?��ga��O��|
��q����1�_* $�@�	��E������v
�}�
=�4 
��
2>�����ɢ�ʤѺ��ԃ�˝�
Q��3�p�A'���W�%�X�K�g
8���Rzh3>�,w
X4��t�@
��f`^��䃛��3Neg at M zp�@R�{:d��8@ՙ�s>d��e�/˂�I��$��"l?/ y�,pH
h?�y.��%@m�֠s(�
[�Y�
+t� ����SN
�E�@�pk�u�4 �>}�x�r�=�+��\�c@`
�>:�^>zE�7`��^
Y)&"r����
��(�$�� ,�R-��E]���6E^X��E�X�o>���f�� �d�
�YQ�5:#�~/L,�r@�)p��_��r���H9�	\7�$�P�%ы
��'�c�V|�L�b��"O5P C�B*x����R�q
+�h��K�9����o�x
�f�
2ƒ��H�%�.�鐢	�6@�-���<�K��~��
%X��ʃ��@�
�"�!Дc
*r	��TY��@��z��z�)
+J���
7�D��KGX
+�$
�� �v�E��suQ�L�˦����Ε�c
+& �f��&�P �F�ȷ^�+0hkA��wƒ�S�!�" �~�#Eڂ{�%��pP	��d6
���7�JL�� ���%�m)G������ &�f6��
p�(
+ca�P<!F�`0�3��IR5#�4Nj�
́�S	�f���d�D
�H�e0]�>j
+0J�����cW�ćo�p���0K^�T4��0�(�I�_��'1��l
^�a8�k�܆�K�h]�x�^�n8��?�%��@j��d��I��%e���\@��KY�����Ĉ��`�a���8g`f%��\���)�e��5��3"��s��"�h�`��˥�݀���`��􋄂
��
83� Sq ��%���@(�}�ăh�/}¾�
\
.O
+�p
R�R�+P���,�
0��P�9��^�Ŵ���LTY��c��抹�hY.>D}��
y4�
�m������`��WZ۵099|zb

v��S���'&�B���=��
��������fF�fFgNOë���E�=�sm��z`��Ʌ�������ɽ
�3s�
%Ӌ��,
=}z����3�N����"��d�����������s����
6q)
endstream
endobj
325 0 obj
<</Length 65536>>stream
+c�)�+������X)B5�|A|M?�J��_�o��&c�%$�妁hs7L�F
u*���;��e�
�F�)��Tj'v\/uYh.�6��Ư�Ha7���Ѯ�^G���~��lSB�<)�=�G$�%
y�<E�<������4�'k�00dX̩��(Ki�p��pM
@l<��
��{"i`�.�����5�80��}���oOCx
Q�iQ��#�)�Q9I0���Q�y<��	
��̙�Q�
����{<�Zp�� x��DH�����@u��D����w��$���-6A�#?>�%�7k�
���:?�e��Gv����:Xڞ:S����8g	QUqي�3DN)A=����Ȯ��ՙ�ڭ}'Ǚ����S-y�^L��2F��e,]�vzI"W`(z�
�D�c-��A�&Õt\6濹 ���G&����x�bM$�!Ξ��p:V�J5�0

CЊs�m!��jP�����1H��:a���h��##(�|�Y��Ą�=\T�
j����@�w�~u�w��T|n��
�#�`�
�+
��n?�Æ%�Qۂ!9Tg�
%��&ٟ�a��b���b��:�,M�*Ek��NC؜(�*�`���s�!�{��n/Pq��������cn1�jI)�I��E
�U?͆
Z
z�4��7&o�?����K��+�G	̊
/<n;�8D�θX:?�7$˒<�.{�S�7�Ͽ���k��<a�]y&+��
q`�rH
+ �h��
��'
+���#�r�� 
PUv��	L��
V`�,����
��8X���N��b�J�n��GC�*��l竔�9�x�N��5z��p�Ȁ<��2>����^O�)i-נI��N"��zD8�Dd�aj�Q���:
+2
IAiP�b+ȚG"���xS��i� ku��~z@�v/x�
��v\�קG�|�h��\�:��a�`�	���Q��
8q�C��H�DޕPyTE��0�a�5�p%Y�1��N��==��o
+�ĬAҽ�y:�"���U�

B-�%+�Q�N`t�>
+��� %q�B�%��?�$r?�G��S at 0���!�X����̓��f� ���[a��r�|���{�~
+�{<��Ѐ$4^�,���ُ�h��E�w��}�����A�玝�7�9��A��Z��l��G�x�\���vy�o����ړ���M�3:��.�ۅ�N6�P�tPK�A�2b`�󞩅��1�
+wEjU[(z���=ڑg{��bL��w�j��fF]H��u��
� R�<<�
��&>���
��6��(��z1/
��<5�(�=�:�Ź!L0T8�Sp�f͢)1�W�vߟ�}�[����9�����
���������]�w�t4
�0�Q����1�]��8�ïߦPj� �9upY�o(95j��|�����OF�6)�}F�]N�U��z|,.ղ_� ��W{�h � �T�>�#
+� p-�l���@72)�h�+UoOP���<�� k>@�tԴ3���Q�SP�m�E�d�m
9��]r�%a�|Q��P>3�4Q���?S�nG
�[��^��t�)�C���H]e��O���3�ߐ
%{�(�NA�Ş<���
H���8sh%_����
?+m:^el�+�����y u�=�N�^��E���
+��t��w�t�����P��VX1��$�IDf��r���������ﹿ �#l����
�����=�E��#!I8��7��1
���󰽭�
�T
UP�6��>�C�G�1_��l��+��C��NKQ�dF��|
+�2����(����#�R���5
���{������n�H6Wy!��F��� �nC��"G�+��!p��� �"=�2|E;��aY]��\�s��D��A�[�n��b�`Up�׊L
Jlh�f�

)��[
	��)�
A�5�J����pؽ`xG/g`@=(��LB3{����I�Q>=���!'�<
�G���r�)d�v��I�^�(�A]TI�.p����
H�?ɪ^��D ��A���u�E�4�& w�� ����(�=�$]�G�����>�&�2z=�% ��@�
+��j��A�0�`�������Ӈ@HR���_ �
�1
h���q���^}9z��z��n�A�
E�����(��~��٫f���D-���L���k��s�L&�
Qy���(<��p
�
#z�a
+�+�Q�e1���wf�k�ݾ(]4(�ߔ����p�e���JOȚ�
+d�g����j&��4�geY�C�t9/#����Q�'�E��S:��
+�����N{I���_���n�C
�Sy�q�M0x����E�n��TG��`��bi�
+�RR_C5�����ˆ<`��kR�Q�V
hX�$d�w��>�ߡOe�9�U�=Y�n
����{�B-h=�PYq�h�߷$cr�+(*���!���L	����}�S�~��Z'fB40S�Y!�^��BM9\'(w�K�գ��t��
�TZ�w�
	݅| \��t��#���J́��i,�ޣ�t�:�^9gz�E5���=�D��[HR�Z�c��M�Nf���Ru���#n��MA�:�o��� ����{L�0
�ZD_:H�ׅl��_;1�
AB���
+s��~@Uj">���!
�����x�q_RD:yI+b�����X:�U��j' g˷=�
��`'y����bVQ��A��
�/�jl쪁"فd�"V`�J@�PL�[��y9`$7���{�h7�j)b��4�)�7����/�<���
�f�F1��$
����4$ep��#���`��RM;}
Wۗ�0���s�R�8��'\=ȫ�
��_e�yH��qP�y��U^\�
|J>�N�3D74YG�K���ƐX�/�{�B&�t(�����F|�)+��o�$3Ġ������� �����x4�^!�{'�� �/�Jv6Ue�gG
P��
(2BI.�Hl%؋@}�s���i�[��e̳Bq ��
"�v�_Px�]�v;\"������z
?:o԰W5���G9'��t��c�V	'��ごx ��
�����W�
�CȊ�'� �t8]�}W���8��O�t�Ι�鱄*�gF�2H��RP����Z�3��PCW���8���p}+m/�
�%E��:�����
ct�V:=�����<�T4��!�����k�[�*�e�"�O�J��y����j\�r���営���M���P�
v�~�s�Pi
|a{�������.���n/���a
�� �A/X6{a�"���
x��O���ڕՂ^%��
Q�8���۔����Q�[��
`��* D?2��=
�Fi�`{:J؞��D0�Z$����� x��'9��������=$
o64��GA�R��
M��d�5TV`>�D;��4���æӘ�0�����nj
	Cq{��./z��c�3
[�w�<$�$Iq��ӎ�Ϗ���Fp�{�o���
�|��	5NGz�~�<9�
B��\f:����-��B�Ӿs<�	�j
_Ge�0l(W}�*{bXz�Cz���5 C���,B�o:��t���(Ą]B$Eq���Z����/a�J1���p��L��0w8�I!h���H��<.�2�2Ƿ�AT�0�t��cPy��Q��#m=�>t/t�������wr-�L�܃�0���O�w�J�K����q]9^��1·�U�W�=�
R�I�I��
���
�^��{hd*��^��yT��մc�3����4<_�����XԿ �e�}�c�C@�5
�k��y��.H�/ud���"��UEF`� �93�q�ٶ�!�I&�
+��ݰ�chĈ�a��c(�J|�]f �`���T=��e�:ItdL� �
�ė���yj�W��b�O
�Q����u"�
���@��"+�J ��h{|��0
:<��U" NB��,W��&lv0�El�*�l/�C�`̰5V��ӓ���@zv���n�]�7a�
+C���S
�I
+��cT+��P�����o�k���ٙ�u5�!1)7�q>�����[��8��3H����2�B=Scάs�a6��)`��{�?r���/��	l'�sK�K$��Ҙ4��wڿ�� rT>B8�i~v�9�-A�	���5g}=�)]�j�S{Rr
�"�&1�~����nJ�թۜ�5�'�b(�(L����.y�
�M�.%�3��x���pv��a����s�J�u!Ή���ĸ�II��]�4�
+�J�ͺr�+���bd~
"޾��;ҭ�b;��.�
+�����:��F
h�yY
����(�눫ԩ,J��g7�
8�@�����H
��͇��Ge9(
�	e� K�f/W7�
�|�

�f^IL��G�MA�훴��
������Q�ƚ����#u:"��0	%�Xq?��5(e1��!�^��.(q��
�\Ъ�K�
-�S��"e7#F�Ά
+�-���-n�+�(����
+��+��C�a�	�4���8�?�P��ˁi5��A��=ؗ6H �8B��"x�PU�w�+�}�M��c��L�nU�5�a�
+ ����BT��ϟX�n��W�Wԑ�
��U������u��jx�wa��]v��֞����(LT�
������܍�*���zt��2��)�+]����k"M��lT(T�S�+KG������t0y���3��2����h�7/C���n �f*iV0��4|�|�O�C�аx(�qd!�&��q��'S�����d�m��,��	/̇^��+���6J�
�N@�
�E`��ʤ�C8�,�c9e��sL�v��B
R<KR/���'�+G+zG�
�V
�t������F�F�!|�$
+�>9L�8°�"L-�C~�
���kC=<����6�CG��}m��0(%-�v�Q��9lO���
a��G8�u
.}�h�r�	�ZQ#0���|ʧln���
4RC
��MGu�-(H$���@�>�^&������0dX���X�Q�oW����w�ָBy�_@�~�s�>+���4�樯�8\��]���;�J�z���*\�E՜#@
�:E���6�[w#P�c�!V��� `�����
rO��勨���>�����
�V�L?�m��w
�o�Y��D� ��W�(#�ia�G���Khi�B*+�3����lQ�^J�o���

Z0;�����%���0P(�
�׫�֎���R���!�N�4��ʔ%fn�K��ZERkUm]�����;LEL�B�����QV~�H�	�F/��
^���"��h�<����
+����V尽���p�Q�E
j?�ۈ�
J��h�����?ԛ t���|��$P@졮�2aH5wߌ��tn�.��(���sV�R `��!�
;���
0,+����N�LJ����=���v��
����H&�MB��`	���#U���w�������������W���������o��?������������o������������?�O�������������?�������������u������=����+~�7<�=͇�i��@4= �>�FAA{��(��FLDU���8��6
6�� �8"���D�X��B!��Ď��NvU�N:b��mg/��@A�.ӉY�
�� 	��	�1����C��ۇ{��
;tյ��-z$�eq
R��-���s���p��&?v��D�#��/z
!~��$��$®��wD��<�q�ނ�_a呆C=����

~�l+�'5���P�
+��W�}+��,N��\w!
	'���ݚ��4*A{��3i�+Wp��"Ȓ�-�
�Ð;��c�(Ǡ|�j"����( �pI+1�4���=åo��)]�96����蓟I��D��}tBu7:aLH'~�%��*�|�8:b'�ک����{�����QQ!����� �v�@�A;�ޔW�;3v� t<v�2
+�(��a�4Z��ʲh��P��߆[���
#P.Ӕ;�
+a�	c�z?�ټ
�������:�
+]P�������
�~
�`�s��N�X�C��{���{��'k�|��N�L���O�#1�o�zb
�?zmq'yx�Ӑ����X�,n=
+�q�zj��쏣W [2`�_��}�W�E�<,�+���Tp�P�3ӐF{�Su^�G�G���`Y�G!�G�H'G,�y$�G����
i��Vƙ���
��R#-�wLǢ/������
h5�@���Xn�$�Ι��N;(�#Ɯ���(�*�k��@�ʇ.�Y���CjD���
��p��c��[�v
��~$a�F�^kV�;�}���0~�"+[�u�`��
��j�CuQ"
;�k at y0�C
��}Kj�Y�6s2�݌�����@�
S�bV�_�
�]
�S4�^��E
&��3�
+�N\�A�d�_y�h���ƕ��'�P�v�ait�Sno-̨�*6�u���Z�(��!�a�aP��6Ԓb)�ם�7<�,ꁗ[؈5]�q^%�_�p0�Q�|������1�;N�#������1��+)�L�"V9|2ۘ�i��@��G|�M/
𪌉��~3���npN�_�W��2� �LuId8�

B�R����}�w�#���@q:��H�Sh�Q�������g8
+.���[;唂� �Y��`N28B

���tDۧ��
�^
����64�ž� Ρ��xk
{e���^E\&��I�ك"��1=ѣs
���
�]�Q�C>�9
{!���4	޷Z���_Pi�U��'V��{�#�q�@:(��a����/x�}ќLj��={T2i*�r���B��9��
�z���̻_�
��'{j�@��(����y���C�D��L���]�!��
_M����:>O�
���
���UAE�L�\=
ud�W\B�Vz�J�s G{
�
�BFC6Gh�M��s5<�����]f
SC�%���T!��R��U�A	5�"�t��X�]%jT~�A���;
*��`
�,�|�P�7e7v^|��!��i؋����p����ѝX�=w7+�l<�����/}}�D��x�m�
BpM�p��緘�P�:J
�����g�d�����!9�L�x?��{
�ńT
a�

����\Un��50.JȮ
�*��"�Z�{>
\rt�-�~��ҫE9��=#�y&�Sq�=X�������x�Q�)`pu6.{#��Lg��� ?��XpwG�ϓi�����7U��B~����[Î�S9Ւ�Fѕ�LRe���v�iD�.ք"7�h~5�Յ��R�����b�ilP�����ɝM
��MM|\�

-P�������g'���kɫ!.��<�t�i>0���K�zȦz,~42��<���E��	���Y�`�65b����
+߱,ʵ2W���r���� �еFwA����
:1ʾ4��	�.��b
+j
+l�����FF�6�kY��UY����-�fp8��'�8�[������(����i*���C�
/e�;�bG�_���AD��	H�y ����Aq�~�z2��U�p�a
M�̞*a�gU٣b���O��<{�
Y
%� �	o0�V��›�20�n^
"�9r�Lڅ��D";iQQl��<R
+>��M�꘡�x���<��|��
kA�+
{z�`k$A	k�wTzُtE_DW��`� Pӆ�`8���Ҝ��
$a
+!�I��
�b��"����XL�]�n�
�l�VYe`b�~L��qT���>E��ǡN�Ts!�@ei&|�`�b��ग�)�LcX	� ?EgeJ�+
o��2L��2nj�.�	>!AW>�\=h�8�y�}K!���Z�E��`�.��J��'D��Z+�&���ٸ@�|�(B�)X
]{n�G ���7WPo7G)
+�����+��l͓z�{��?x0�ߞBތF��;O�ܹ�#�l`�A�1�XJ�<Z�0
C��=ҧZ�z�
=��:�DU�|v���<7
z۬��J� ��
9�`Y/�ߗ6@� '�,�h�AJ�8`M6�
*Gq�0�/=<���UM��7�A]ɬ
o�aR�;�e+Yk �
(��4]D�a;5L	Њ)��E#�r�
v
�'Y
�k�d�k��&f-�3��
Q��gU�����8��}�
J���8xk�ж;~ը�&Wh�ha�Wn
�k?�{;�[`P�&�
��Ќ� $��-��P9�Vp%�񭡧0‹�}m\�t�$��0�� ,�d��I��j��yc�7��zH�b�$w�S�e{�~�땮�{[l5���ȫʶ'�̔�m�}�[��í�SQ�VDy
�M��e��u=�K�o� O�P0�)H#�J�M�1+S�y�I
?	�%�E�i�nc���
��B?�T�C_������.0f���­Z� GV�<�{�y���x�
U�[�ͻ��zb�bP��K� Ez�7vq$���������"4}k8�nٗFр�T�������P@�[29��
8���p�ll��iہ��[x� B�Y�0�+���D���
~mT%�!`����~�SF1��[yn�B7nC��T����}�����<��p�\p����q��:*�U���ն��:�W\A�%���
U�u}�)�oA�z�RO���w���y&"�,7��

����*��;�O�X�֍�(��q���)5��#�b �{N���G�Y�܆X��
�;��>��A�
��ˤ�Qo
�_���m��M$i�r2��
n
l��m�����LI>�����e�!Eئ�'��nj�W�2؟����^���
�=��,��@����hc��U���
+�㗷�	�>�L�l�W`T�r�R�r�_56mB"��+���'�Dk�;JC���5,FG�e��^Ґ
S=�O|����ދ�3%Q�/��
|p�!�;,&i�S�Rx�>�I?T
+�\�^@`���(*��"l{}	�?�H�3����R{k�մ��9����P��K�G�o��9�&�Y����F=۩���PA?� ~�H:
-�q�
+�Y&�Jl��o ���7��؝
�Pl���A��������*�~��nkL9���մ7�a��_�ET=R���B���.ĵ�[�S�m�i#�n��Iu>�mh��	��疢1@��H�-2��\��7{7��ʒ!l�Z	�
�);�_
�����(a� j�z��F�q�h]��Z���t�A��c
+�8��ǚ����
���hS�E���1����́�����X
r��؅�y���
+�8�+�w�4�bjs
�y�ќwh��{7��hTD�cAŽg\Pn��$	
+ �,kBO��J2-��pk�z �+�*
�$�8�|R-����;ϰ�Y�7�����K��|C��
����|i��r�#u�5_ ]�!R�F7�z�T1
28�
+�t$�3���dPƌ
-�t�:�g���:�?Hm��rYfd�e��t
No��Zk&]X�?(����Q�i����!���uz�~5��=f4e��'0袋�=Ex�C��y���+<3����G�8�5LHs
���7XY�:��ƣ>�/����g�ռC-ܡ�٥?>��X7$Ϯ��lX��QQ;�;
lĜ��D
�9Nc��U�n0�o��Z=�����,�F�6�8��<:�5ג�^�*�V0�kg��q& ؜	a�k�_��
����[�)x���I�����N	���#h�
 N�Ժ�gC�T���
+K�F����.�v��PF��D|�B����
�ʹ���@�ɷ��09�>X-S�<Ka���&�ݿ��2h��
B3�Q:���.�\!�)AjB��_z�cJ1<{�P	��8먗�8�֖��͡\<�����z��J�7�r��@	[և�`@�h��L
+�H�x�#�������5�
���z��2�J(�IhA
��o�3� ��$��^%"i;�u���׉\ˋ>;3.�<9 �<{,7�K�
=pw�Äј
H6U��P�a�� ��ac�8H�X�!�F��PĢOHF
�����.=
_
� ��'�o�zRE�{�b���>����c}�f_:�l��WݑqM�\�	e�*�q>���'��*�ݯ=~9%���0���/����I�tɝ�f���jz~P�^f+eI�=�K�wZ�&7^"+��{C�_�#~u��o�����H���k!	�–��>�ԔPD�wz�QЏp���KI-z��)�gz����Z[��
�̱Ǥ�d?z�*2u��L�^�K��PA�����ǁ�EL�2���
n��, T�tXś�
ey�!��2$PU|F�H�S�0ͷc��
�ڝ��ݽ�Mb�!BkO/����Vʉt�o�0UX^�N��v��M� �����/'�QB�i�o�3L
[���/��{P(}�.j�M�r�kH��S��n��V�����
�(�a
+.s��
���-���Z����~�W��z�&�֑$_L
� F������v_�1z5x
���P;ܸ�Q%��,��
���
�1ϙ
7DA.{JvL�����f�g��=��<W
��[C܈=�H;RH�Д@�3K���r�+xν�3-�o
���!�
+p8
�N�N��P`v����k�|�ʓ[?�^o���M�-q]s��<��u
�ԧF nZѴd�#��J}�[���S1PR���Qz0|�
��;�	j��Ԓ����+p�.w7K
�=�nEN��%��fO|Z��
�YSc�a����
"ny���鋾�jz�-e2��[*�/G�Ν
��[�Chg6
՞�G���
��;W~=�D��3��{j J����
8��Z�e������i�_���aULhh��4$��M�evW�#�PU.!?�]��aoӯO��*��M(*=Q�
����g� ��Ry�H�QE���y����G�b�
+��
��T[�������8��gl})p^
�r ��p�;�Zr`m�� ie�ڰ��{�Q��
���
��1�
.٘	�
��r� V�8y����'��G�`F��_�p�
Q�N��aȉ�
��[�,Ǻ\��8�x�n^�a
P,������s=�Z��וAp~��Mv��'3�t g+4
הY���Y����|�)�8E�1/=�ѩ
ͺ��Tź
 �!��^���;,0����P�7%�|H/�����$�}�P̯=��͑%��
�>�o���������G�eV�i�AD�Lҙ"�)#�
QR&/I2W���TD����2��
 :����I�t
[
+��9A��fB��k�fl�YwR�')U��DOq
����0��� �2%	4s�tJ1���8�U�~
u���T��Q��5ٳm����= �~�8R�32
�]�7���ߪ{�j
�AW:ڍ�=Xs��"h_gho(���
+��K��k�a/�p?�*?����s��8h���Vݔ*
�b^��Ļ\@���w����#í
�]b=�J��?6��:�R?��#׆�E�J%��7d4<M�h;	^�*w@
���1�
E�|�P���)�հ8"�8rw
x#P�hZ
+ñ��iq���t�[w�xTuB�w�U?K��HM9C
�>�����e�YY��� �;B�
dHIN�}�=^��-l\���<���@�-.�z at 3�B@�P��f�?�Z�r����
`?o*K5o*:��0
���4_�*�[��\��W���.wF��u�:��!�S��GP�w�i)� 
+H��O\1��=2q6��i�H1
����"�K,(X�pi�D�82�'<sr�S_� ��r~�:ƃ"���ʶ�
1<ɥ.%�
+a���&f7K|�_W?�(
ae�^$
j|ú�>n�ᘽ�i
��
]3�n�'��Kv�
S�H&���P�iGNj�_;hRT3H�e3�������,�yZ��/)�
b�x�G ��B�0@��
��A�J�q�<���>� QC���̾Hl�>
+b3�gYG^

�
>
�nIYW���5���i����IZ>�QS�e�gZ�����)g,�����Q�v��
h݋O�I��Q�g��/q�+������aE�N����Z���
,P	$�=�ۆt�e��X� ���&�w�ӭs�
�	�*3-�
+$=::*Hx*rZI��8�ڠ�^�g��T�����&�F���8�]z4黀�u"]����>�c0jIh �$[9^�b���ߪ�[3��IA�
+�����<�8�_p
k��ϜQ�Q�Ǟ\�
+�J�@w�"I~���Nt��EH
�G�`���=�:����c@��Vp^¯ה��g�Gp{��)I2���{�V�3��8Y���J��;�(:�wp�)�­�)}=�	�tRHp�tgbR+@���\�y0��;J��b���&�����?�
)]�rfgJB0��q>੬��
N�_AF�/����Z3��f%1��^f��#�h�(jf!:
��+G?�B]�1PX��F��߹Gz�+@� {
+mr*R��\̈��`i�h��R_���`�
Μ
O��Fh��Բ�܍�;��s?T�9�ٰ�6�u��iq�`�0�#����n��5t��TΪaG�4�+Y�t�3�@�diL��1M�6�VVRe�m�+���(�;�I-��9��k��!ǁ��)x��b��aڍ�~��C�C'Xp?�@�V
�x�̶� V����
�؞H��td��O�7
AA��
 y��3�K�}y�}���D��jQ�OLF)p�/4�+�5�3�XgC���b�50�d�Gr
��|Xa>gв�V
X�Ɗ$~�d>(D��
�F蔉׎�R�j�V������J�H�mס��oq/O{T���
��l���F��U	��OV
S�?Y�h��"���y>��l����1Ւ
���
Fޗ������� _�1[��*�\�\c�kD{{
��������8����K}x�2u�L
X��{�N���BܖLM1�5�����Q�f���d�qй4 �d�(v�=�s�P�g�^^�H [...]
AG����&�����GR������t����������Zl��7'S�.�!N�;٪R<,���w%+�`�kؽ�WA/RZ`�A�ʂ��{�/{��dR��
N��+ݢ8�.�u"v8tb�M�j���כ�zz�tl�h�u� Gi��Ѡ	��
:̻����9���:y�yk��;��3@?C$�B}�W��W��^k��%[�NT��,�v4
��,
$JQ&*��$�~�7x)�;;
+L���;�[�=,0���>��,�J�������TdH�pz���
+�UĢ��Σ��V��
+N�$����:�U+��㽃�t
�πT[�;�
�����~'o�
 Ɗ�E�
�^)T>���rk�V
�N��ݣ�
��f��z�
�w~�G�I����_���ua
+;�L��E�eD5�%h/a�J�A�����Š�c�>i["�b at x�ֹ���IyR���_Ebu���/+
%	MGs�����<$��%�RL5�j����CUmP
Z9�I{j�q�UM��H%��Pi �D��}�� {x)ɂ�(�M=g�WyH��~8�̗��×�z�*牠=F���=B�	FT?�td��X�et�
d�0�)�:%ңA
+�!M�ե�$�j���F����1�s�0*�S�Qru�W�����?��"G2$G�`�Tme8����G"�}(k�~g�ݗ���?U'b7��;�����7�
QmkX�r��`.=�x��2��S�`�W0a�ͥDd4�oY/�f�.yeB�*�,7�I6Ζk�����/��#JP.���W
CP2�����)�V�>D�%�m[Y��	u`J�@�3T
y��\ϐ�Y�P�b�c�)����[%đ�/{��Fz��ė�S�=�<�%7&�E�Q���hQ��$_�H6��҉9��=6��=� l�
D�
æ\u R҆M���w��g#x�D�L%[9Cmo
�,�0!��d�~�h��OAl�l��f1�@H�R�(��[p�h`eP�TD�}J,҈|;�M��y���c
�y����i�9�a�Ԣr����!W��d�ꎔ
+s%X9�6��+����7�
��q4�}��h��K

+����zC�
jm��%a�]nT��>� �b���Q�;r{	���X
�y`u�m�
W,�F��
���FRX4��h9������Dlx!�1���:4D6+�N��n)��H%�nL>�D�%��d�P���.*0Ch�O��wD�!�ը��ON
`� [�M�H~�>��z�E�
?@�u at k`1��[�P<	86-�Y7$]z
�;���^0ѡ�1�D	�.�
I=o��
���U
+��
s��{�+��)�.��$G�=a�*3���y����T�d+	`{
�}�W,�1d��P���E�i�BJ[�h�U`��;g6kG��~�ɘ£��k����4@Y�]J���p;ڋN�ϩ
��<��
+���
��3`��qLdBB�	�eR[O�"E�C ��"V�F~�c�<��A���D�"�N��B��M�X��8}�1�y4�B"��b|�_�g���T
W��+I��<.��wp���h�oR��v��S�D�
���O�=�A�4U1ɉ��!�̥��~�S0\�k~��S�6�|_����@�c�����l�}�M�"'�����]�
+�G;R�$�2LT�'U1�E�t��ʇ�
&K�I�u�%�
�fs
A���g#-#��1��K2����
u�e�/�E�N]�4��x���@ȵ���L�9҇�o����]�����
&�C�p��L�lkA��Q��Ic�+��
y��8�"��%~7��@?c��D���:9�r�Y4��DX�!�A��� 7�
.-�/3�C4��G��f7��
�L7>_�7�dϐ�.7��&�Z
�[-M83�'�;Y���
sb
��
`�+I�"{F�˲�,95Y!
S� �*
J�SÒ�`
+r*��^�+�bM���ğH�Z�TGj����x�~$tH�\<��0 n�P��>��C�m7� Q��ҧ!�
v�K^/4Z�ڍH|�H��������c���WJu�^Ҝ��
�
�u�J aSU�y�Z4GvQ�
�S��ZΣ;�X5�lÍz���S��
S
+il���/^On��SH��	M%��#"I��A��\
)P�'��Gj�鱐N�7yh��)R�
xİOP���o����g��曃#K�Y�!��{�:+��A]
�9�����Ƅ;���	$Qr�؟��K�
�?9*�k$f(�]-N�YDRGf��
+"�I������(��%݀��h��[� �������
hV$F���K
F*��NY�@��-YCw,
+:N*a9r"Ao��MJ�Le���F|	8������*��t�0
1?�����
��
+�<ω
��
+
��F��*��9�8
����B��C�7	�uz�֔�}��řW�z--��PT�̃��HZ���ѡ�>m��5�Ljk��׉(
����� s౳{�@��O#<�U���S�
�R��XϓN�A�<Bp�MN�
���<)
Qm���
+���s ��_ at 7��3x6vݨZ�� ��A�����
X���
����<��{<N
�K�a�6�D?�^�˄a2V��5�؍	_����
��<!�E���֭v@'�m�
<��z�o�q�¯i���Կ S��R/p�H�JҊ���l��*٬,w1(�		��c�3aQ�g�\U]�����Z�A�X�4���\�ޤp��MD�YR���
+��=.J��R�8�\�CP�c
�X��DcbS!1�{W
qƁvt˿7�pUe~"rG��r�7 at -X,[+���p{Ls�.B2䑚��n�J	e�ꦩ`��,i��86�1
�w���'����[��x+���3v�FRV~��R��}��ǚ��1�.O{�xi�������6F�G�lP�V>�6<p�g��j�\C����E��?e�U��R�t4�� s0��Z��|`��&Ξ���@,K�Q�e<��f$����A�
/zM=��݋2����c� ��!c!���$0�"�RRPt at -��
�/������}�h�R�=�ڤx���K�Ɋ�2���je�t�J�u�d�u��]NЦw����
+5
+G� �}L*=$�(ʡ6��'m(f��b���J.)�zU��B'�z�� (�L���z����u�)����9�>D
~$h��1(��`�F�ý��(C!�
tF
	p�|�d����eHz���tUS���;Ϥ�S����M"
N�����NZV�@Ps��匌',��t}?����K�'�y*�<���B�M��
�
�6e�V���$ߤ,ޅ�Ɛ��<CI�'�73�*�n%v0U����v8����-�N��D�|�	Xנp
�d

5�i�C���kɡ����W��^�=�b
+O��x2�ŹdB�#|+Sj��!-]
��դ�b	�K��DcFp^S�Ǚ��\��[�����gqgP�);]�3�bH����Pn����*\���NF����d+A
+j� �2���"=�I� ��Ȅ?����Gd��wc�+�'�&�p���Z��OP�
+lч�� I=^�x��Qm$R�� �cDw�W��;��f���`�|
+K2�<Z� H	��`	"\��WQ�P]�7�n�邂R����}�ײ��/2
)'��i(J�
h�n�����b��3���:Z�����щ�zw*n$b�>VY��CЧ�(��p.�@ +�|g02�M6���"pԐ�IZ� F���^hw�@ft�`�/�:ۻO4����uHa�U�JF�8��]��jXpb��Ԑa���ΕNW����;D�X��T��1K�؀j�lu��X2 R,�H�+��@�[B�sQL=P�����8JL���j󐉒�㸝���d0fU�j쭞
�9�D�O��B�K��$ }O�"�P<�(��p&j���燌��"�A_��^W�2E���`9���*̵��

���Zt��]��Y�QUe�]���≷F�;�`��������=X9A��{��th�"
8EF�,U�R
�e���.dzEEqO�*��y	(��HڳF�O���"L]���ɟ�
+ ��RC���z̓������ �7�ߚ���
]�n������LB����9�(����Q-S�c
<�M��_A��] g�=
�X��3����MT�$A�
l{Y
�
����f+x��YFy ��T)*
��+
i����r����P�t+�ɗ<.�5�k� ��DI�0���þë]Xk
+�^pvC 1�!T��H]1r�-�Qb�T[�X��3��̱Ė��4�D(q=[�qܢ�����jl|��a*�{`��PvJ=�orP��c�FD{�	���34����;��'Wϙ��i=�!M�Ù����0�K���I���41��f9��E�@|�s�@�E�H\���{��0�$�^m�
�ٴ@�
I|�6N�v��
8�qw��ӕ��y�
�8iJء6P�����v؏��@|�.ڤ 
7��
A�ď�z��q�	z2@p�b����b�'ͥQ�1�"U� I�dn��Q�c�^��_��|E��J�5�зC�SF�>���vt���خ�� j����+
�|��
+���@ᑙbi�GG�'`�-E=����������I�g�H�U���K\��
���O���:�1��cֱ����<������JKt6�%�����8�W
+ P#�{*#��3�6� .�{
�̈�6%d.6;��Y�
+���Y��Īv/�{�x� ,X՘����I|��s6q�_
+��C�A��tf��B��
�]�y��6:L�A��������Gw��p��f����U��≴�@*���T��Y1�k�ɴM������#|����piZch �X���#���1�ƾQ��-��t������<П1
��1��Q
%
�aq�/�k�G�xq/ֽ��1�����
g���k�å�ϗ�r�{�my�V>`��uѕ��R�!�Ol�_Vː0�x����!
+��H���FE`��
4 
̔C�-�
:�ߘ��o�Jv���5��L'�XMq��0��	�(��8� �݀��
�M~��3�ࢫ8�
BZ��
1)�����P�`3|�����
+3�g�Q�e�U���:Œ�{a�E�B̞��(�y���3+e1�����*��IJ��<�gY^E���iU3�DŽ�m
cI��c
��\-�gC�����N��~��F�S
�

!���V�W-}N��^����0|�?���xVm�	�*��Ԩs�-ym�)��L�u\}r�x$
u̾_27E"����)�Ox�|�|���r�
-O=.(�
�"���+1J
Z�%5>��JZ1R�1�u��^i�j
�)܌������'�� �
�+�PL����
�10&�H��,-��"t��a�
mF#i���i���=6��������L�ʹJ�&�|�hW��K����z,���h)�6�(R����V�<�`9���\4���LtOkN*�]?�ǒ�.(k�h8pM�룆�٢}x�~AP58o
�_;�.;
6�R�r�H�0,��Ka+�>�PYZ	Æ
�Q84�
l؞ʆT}��T�~�J�T��融��9����03i ��N�qm%޼���"m�P Oa|�L9	>IJt���|j�v��T� :2�y�,2�$
�OAn�� ��CoA��yb�
����!�����0����S�xID$��b�"������:�L�,�?�
�nz���8�w��,�Se��[���3��wZ(��B��B�FY�"��k��S��S)��$�C��rr�tjգfT��
����"B�*	�3�Rt��$�@p�
+ھ(qxq8+�{�`��'����j�
��I��\�@2�H��U`���T,n�<�,8\�B��H����,w��]4��e��ܔOTǜǞ����e�cvoG�ɕ�IN�Gѹb��9T'U�{�F?�
:�|�N�>H�8^�Li����-.��<
��:�*���^γ{�^�pi�<�d&�����Z
[��z�?�k籮ٳ�a�:�3i7w
�l&�j�������8��ښ�h�͢����5�|��C���&$1��x#A��'J�z��|�<�z0(3�'S-�y
+
��!P�.�EzL��%�Y��
+,B��a��� �i7��Qܱ�Ǣ�R�W���'���1���d/���#����ɲC�E��؁H(%���P��(�e�E�����n9卜Do�
��Xt�z�����n7/�V��3\��|����g�+���5�"���ߔ�?f��
+�b�K
+�+FN
+Ax��ɔ�����}�)�j�����8Y�8D\��{]�9x��BM��A�u� Z���`��bzLd���:�}����b �d�F�;�t
���n~H7x2Y��
+�>;��k52�cu O[xE7�
��'US��#
+��*�X���i�fO�/��^���+���!*�H
_���e
+2�fw);��
���\ﴃ���|;��S�I��k�.h�D��k���
&�K!~��Y�M*�.�'�ͧ�",)xZ�d�u��()�W#V`��h�v,�pކ�"K*�q�\H�{����W�ߺ��AɁ~$��F��C�h]<9C�*@�<����!��Q�ɐ�>X�1��솒W9d��=A:
��Z�
g�yRDڹ!Cy��_?5�}��1	U.�� �|ף��,u�����k/�������w�t`������8�%��
����1���V+E���o���T�P����|m ��(*����K{>R�Xi@��w�({�|@�U�< �/q�_��g�uu��`
k
�K����N -��*�zm�\~
�CL[�'�ėw�g(:τ�R��]����"h���YT�s�)M`
��ȿ��O�û��1���EaD���L=�\4s�#�L�uA��{z�{�ɧ��8K�0�ݻ�}����?��@�`!����{E�_�xXHS9������*���*5x�Z��s�5V.܁���7��f4��]� w�͛�'�g��B
+5��!<�.�I"v:�
��S6�HQl�ȅ0ǟ�~���{��
%c�J�6�;H����
Xs�
�
{� w���
����l�u�*�@
�Q�T�4蜨��#���;��
�d޷c�l/V;zi���>ʾ�B�n�˙Tf.G��
��1�ki=N�~9�Go\6��K�N\���P�^${&�݆V�ߨ̋"�`X�
�����D����
]�udN�k�=B:b����
G S �V ˆ��6�5�Ȳ��Fv�
\�B��5bE�j����̪K��1§�riRF��-8�
D+@��`�X�RQ�
��̲%1(F���L0�U��8k�A	��
{��Sk,^�����5�M@~i��!��������N�t/h]��
����%���*�$�G����x�
ܤ�tW8v�2 �5�Ը���ևhf�5�
d����(��C�G }��A
�����
H�Ћx�� �/G`~^Ӟ
�
X�`BL�"�p$�J�tW W��*�1LL2+�h�Ͻį6�/�I�F1����OS)��8=���\�����Q�d!���H�B,���,��ۇ:�O2~��ݽK�	N����ߕ�6�i�����$L�a�2-d*`���R~�vh$�
)�50{��:w<�~ĥ�lc&�>x�
+MQH<U��
w�LE������>'j������
7v-��N�'�h���e2�n{Y�
��
�'�
+!�\��<$*M����42
���-�j���!�.Ip�ȡ$���{���9�o����!\�bVZ�1xG�g�39���&-Yj�c<���MV_3A|A䰈���.�P��@]�=�3l6*�8�T��:�F<]� 	(�dI��*�m��G��k�Oq���
�(O��l�	�Z`����Td&�$3XՏ�]������3�h�'������Ea+ ����B_{X��6��3��z�2�ф�5<�4oT�����
l6�R�?�1l ٜ����i�ސ�~�o���l�Ir,
+� �-��`� ����%r
H�����:#Z�@,&Y�3K1DlS����MG�"{�%w��#�]
��jC���ǹR]��J�'�j)����y���
��zם%�.�8d=
פ
+"$�	�4�0Ϊ�ü��c;��h`���jҲ{
qf�V���g��IQ6��l^��=^��Jqs�6�Da�� ��u�8��C�h�����������ɽ��x~�У�
}�b�"@, 
���
q#�i(o�
�����w=Z��:i��u��
0#� x"�����1��`�5�M�
ev����Kn�ǴN�~(hD"�Z�������6@�{�����
+IGg�/�z� D7WxW�sȻ
ɓs�M�//q&���2A��gR�3Y��"�
��K�\����v���ߘ�:�W]=sD�d\��G�մ2�
|��
��ǜJ����ӯ{)�C"
��b�
�8�x�S�GX��^����}l��iZcl��
����ʾJ��(��;$E�f��*�b���
���:��
o��Y:+D7��n���VsY<�W�0�$����[�R�}����K���c�j�)X�
�.�o��b��8��(�����_����- 
T���(4��Þp�l���%H
�ɉo#��\�����&�nAbe�B,�0R�=�ȓ$��q�[�F"�2��(��n�� 30`2���z���9u�}]�&L��b��1��'�HX6<�0�������*Z����T����Ә�0��p'{N�=��vz�ӣ�
�q��Lǻx��n�!&y�{戴Z
+~�1A�Dy]v��B�D���
qg�� RH
��R�Ef��X�28��iޑ�4>���
��c8-���j���H
|
+W��g6�Zn:�����u���U���P�0�H�J���ؼ��g����AhvMd<^q��@�
�<֜RG��k�0��?>s^N(����WrPI6F�w=���@�p\k�;*�r�Һ��/{��Ui��U�
��Ĕ�
pu��J
}�-#��]9���$��_Y�f��;e�����K{B�V�.�3����[L�$��
��B�^;P}L,?'�T��`LZS�3
!)�p�S��
�A=
+�:s�+7RAz�*خ4u�Bͱ��铉
a�v���Q��#�6i
N�Ƃ�~·f�`��
� H�͗v�5�V.g�BDH�6#ҹ<��GvdLdvC���
+ofE�>����A��WSCh������]�_w���S+w\�\a�
���cC�z|�I&.��H��~���~)p�Ȇ��N�pS��r2�
�m��q�D��4b���`�
��o�!����<yO�Pֱ�!0��Ϗ�	��o���F:Ӟ�3J#br��7xg�b(
���
X�d�<d��� �!�X��uH��f0�h���/W��k#�Y�#�q%���K"g	�<��kQ����x����<��^������T}=�)�\i
+�3HL�
9@;~x8��O���I�N�t�"�N�!�P��'���-q��㣍U�����7��b�#�v����2q����Xx_v<��~Z��5*�%M2���)T��b!��kCܛ�����1���
-G[��ܞQ K����N�:%�Y\Vd��I���-�0��|�]5;
�h
+��6
+�!�~�U�g�}ɑ*�1�顐H~^��^�:H?�
C4�YD���l�}�XU�N��&�����'�G/L��\]So-B���G at O�8����)
����A�B��L��k
�@/3�%�!E�I3@�����c��
+����y;�c�=s t9
+H3�R��襾ƥU�U0�k[%� ����[�`W��k��t�!���BQ�?�
�	�b�
�4�AU��iOrF�.�)+��P����+ܭ
���5V��Y��-�#���Q���nU�
K�W�{��>(�_�C�0f`��O�9*��6
���q{�wo=ϒr�s�ESյSʈ���������C����z���v?@ކ��=C+�A�4;�������-��RA}c�Y�U=��<E�
0E��79����e��QL��S�`?*K���9��
Π�Uj��D�z0lΈx��P�� � 4
���� �A����3~K
�GPc�#PM�G�
���c'6 �/�]�s�h$�������޶�u|}
Ž�s{3'�Ju�P��#)$<b�
ވ�R�A����$�6��K"����O�/I�d?��	����&�����\�ģ�N=A����$�{6̋���P���[�(:��̗@'����v�Gq�Om5$��n_�
"@z�lپ��L
���=.v�*A-@�m���ڕ%�iÔ49܎�1h
v6���,�g�����;͔�\�8&��4BrH}S
�
�m���̽}��˻�S�
+!�z��_S�nO�(�9
+�w�
��N)S�Ƿ�ᙰ��w�/�g�Z���x`
5Y���.�0�Exc#i��;�z�z
3�<db�
N^��{���u�
ۧ�
�V��:����C�
�Fgm�{�^`��+R

��=�%33"Ж�:�U&�R�Ou�ߩ�~nl���>9�1ʱ���M1�Du���W�l
���q)d@ϐ�p8�*mS��ڌ%f7[V��=�yZ��b뢼�rbhH����A͞����W$_���7!{)g�����4�AW��
+N��O,=��GDB�7�.� 객����	��K�Dl���VŇjӔLyu
+O#�?s8ΐ�4�+b���
��j:Z�u�!��+�):;`DQ�u`Ž���{�E�“������s��aQj�i,z��}�-�6��*u�_y��-c����a����7������d�ۿ��?����������������?��������������������?��?������qү������?��/��O�����u��p���{��cx�W��/�s��}"����O�Y���~���6����n�l��
%�<�ZߟP��U	��
��NKh���̣�\�2!�{=�dz~dLE/
�e���ОhP>�*
+�-��N2���A�t�AA�|�����P�mpKvC%��u�ѕޣa
�����
*6��A�A1Y6X��>
>P�-
w
'�<�|��n����
"V���M<���v$��;^�
+.
/b
>�MY2���R�:,ؗ��<�E�z����V�a�͵�x�ss���1C/{
kj���煑��7�`ah�:�o������hAy|������A�۶�f���}�D#��#�'/�k���3f���#T���
+rn�}��7�v
"n=�G�<f�,%������`��No�\�����! ?t�J޾�����?G=�ue >�,���^|Y�*GR`zl��P-���UFVyfJ�G�0��
�bu~�
$G��`g��L!4�r�1���I#1V��6)6`��kN/��24����;�i��7:m��(7t���;�lC#
w���q�$@I2�?7�
+J��1	�
c�%e���)0;Y�}LDG�uh���H�	x��|�|�
��a[gF�
+���/+f=|i��M�H�!8�>����KE��Y�9¬�X�z���`�adr�\!>/��2u2ҧ���n ��3���J�|!�Sf_��Ȭ4��P �d�S����Ʈ
+���9GkR�h�,��P����(�֟���3�ǬQ;
#�k���܍?��
�
3h9�|tu���w84=�YV���c
�&�6��Ɏc��:(��r�D'�*g53|�L:��Q�&�T��/��#q�7890�ej�>�
���8��LK>�|B����,�
�
g�Ɂ
�}�F3l�

J{��~�]x9'��MDSu��}�P�s��h� �8�E����
.�����
��0\���ʴ��/�
�S�u@%u��
��`!���Z��	
8j�x�u�v�;4ivK�{�!Am�fE<���A�
$��$NI%��	
7�:>Nz�NQo�hRk�^Ny�H��{��t�8m

�~˞�zPw{#}���ޑ�T-�� ��na�4�
���@b:n���x_6�x�=~
�pţg�%H�&az�z�˛� ��pn�{�Q
=P��pPBi�,M4�lՇ��MAlb]C<ȿR��R�]|��o��:���b�{��U�cM�ik�N���������2B�OQ��
,���
�nU�Ȓ�A��
U�S;
"���*�C*ޙ�}ZC�� �В�ޟ9g	�`��d���C�3���!i�� �n`�C�=Fd�0>�h̯
�հ-��ɡ�Y�yGq��7��d�_��,S�}�Κ$P�d�%ڸ{i�����
�6�%�����{/��}?b�=��T�~"��)
`4���B0��l|ּI�E�
�Wj�|�wCm`?3�9 KF�c�gUx�a}��}�R #��~�����
�k�s>�lW�}��
��SN��>�v��_j����C��CC��m��$�g2��o�^�N��d}j*L���䋭&�0��-�(�غ��!#���a�;��!�'"y�Tn3�
+�L"��]��L
+9H-�S;�,�
�B�"�y7u��oH�YU٠R3�z0�t�
;��
�|��il$�ƞ`!�]�Vv�I�Ŭ�m�+����0���{��;��T>ʔ�k�ei� ,d7 O��-�vљ8
+E���tE����.
�H�15��侜io�9c0=�B<�0݂ZD���=���y
Y2^#
��
Ν�"��k��!�ro�?f0�zOc��Ũ��+W�V�A	�Zm����P�ŋ��<��	��8��
�Lϳ�_�p��*pSzL�/�&�K:	�a��B����V�U
�2��>a�\>�x�:� v�j
5�,�"��g�NՓ;E���5��$��c����Ԁ�cJy�4��5���䟔0�.|��ы>O��6R'fg��ZRfe��#5ˌ���Ɖ��ǂ~M�x��3"#B���b�/G䙡��
�u��~n �q���۠t��"Q�0{�[C~��.�b$�'��\_��Yx��Q�O�
��q ����Um��p�
�P)`��Nu�	g��h<n(�Hm�����#5Nmg��j�E�W�9T���#�G�)��Z��z�R<=�E;�pE�.���_4ʌ���o�Z�U�
�N�-į���
���˄��J;�n>aɑ]�k��׊�����p�{̷�Uo�a��0�a���X�P8�o5
���>����s��>����֦j5ܩ԰q��	����V�U��z��4&���-x]v�ޟ����5Me�R�M`�����=�RU	�
5GXTN�� 8\4,
+Ѱ�� ��7^�X���Veg��S��D�1K�z�a�c��
�=^�2_��cխ
9a�G#�	7n��'��q~o�؅��{k<�`����%V-l��J"���'��8��>��[�r� �A�{n
 �ra��}nD-��uVڈ�=���8L�A�J�w�ߑKT����h���o�k����?5��+7b�g+q���y�1$�V���ϫ!~
��4"�K��~K?"E'�Xsa��]��t�bP*�;*��#�a���1��?Y.�>W�5�����D�W��P
+/��@͘JU4���c��_��2Q\����k��i	(
�����
?q[+P�r��
+���UY,���{
7�I��Z��@��E_��ȴzB�
�|$�*�G.
+�:n��1�I�+v%�U�\��:�
C�a����GR8�]e����$�|D�4�[;����nH��)z6��c�
��$vSll�p�K�{X������ �ԯ�r������hlzD ��6� ����*Gka+�d7������b��U�9�4b@�yO�/o�0�Y,��?ǒ����_������71/#Dϼ�pYgS��~q�s��^��M�� e����[�����T�C���S��F�jʄ��vj��藌�Ԕ���<I�*�׻��N�8��f��5v����`��!�N��:.�#�5�=#�M4�*���>�c+Ӓ����q`��
�l��N���^���e��*tQ��x��
I��`�Fu�Yǿ���� n������Exb��3�{->@�w<��3�Ә׺�Z��?+�Pb�g1�}Ć[u��7 �l�鴇2��.�(r�iD�p� 5�(18�7� �n�������[p
�!Ս��8E�5{E���[vP���.{{i��q6Í�X���JB<�!�C����@
��8�� [...]
+׆�^UG�=
nN
,{)�hb���5k=/��%�e�}�������]�ɕ;�`�>�R`��;�P��
	�@�n�r�Wo#��ϱ�xH"H�E
+A�nR��j r�W�E�vO��!*���[U�;D��^���@B-cZz
+��^ �5��UM��e��	�p9y �2Q�=���
�X�x�ș���q|�:i�;#�
�Ll�)@����P�-�Q\��W1����a}��\��I�b��#2U��b���p;�-W���HU�=Dj�H�dI�G��P�1yYREU�@T�D��G�k�3�0ڱP�:����%E���EɾQ�:B�o��&&
+�G�13��tQ$]���'r�
.���H72�
?O�5����sbq��؜�
��O������X�݋�[����O��'�z#?�"���5�?�rY3.�9\55FL
�uD/�;6�s�ߟ��C�R���Ci���Ҟ"�@�e T)��XA�oo(2��[Pj�� �@K�
9+y�[�S���R�o���L=�2g���	e�~j}%��D*�)�c�h�W��c
1
yf�k
����#+�{�0�ɫ`��kge������p�~��k��ͦ�#���S�8S�y�+ ���OP�;.��,�! C� ���
wHސ�Ԧ�Ǒv&Ou�;�!�SV� 7�d�O��L�a#H�
^4E��E���C
J��U��<NLj,j��ZJ�%� �?����yo��	}��)����޹Ĝ�T�"����hH���H�r��^�;n*�؆zGw��h�q?��{�f��n[��0��V�]5������G�x�����]#
:���T	��N�{�9p�V�w��)�
�+�jb�Ȣs�Ĥ��%�� [...]
�!@�ӟ5
� 
S �`�ц�G���b�\��U�#5�C����^*�c���n�Od&
�uՒ�QK<3���>wH!~��[�,��О#un�
���9�g3�"���~�xF�:�	�B���^�+
��K���șg��r�#
����J��
�L�P�
`��h�
�RT��u���BC
+�䇏�� �v ����jϧ�ޕ�����%�'�n��T��S�;�o|s�'�Oq"q�������M�~����$�+�v-�l4�P���MS�-��
�
!R��[���k at H���
�o\0�%�v�D�E$�|�tV܋fg2�h���x��,�@�2��#s��+��_|�.��*��ύSciφM0�U����g[����a��l���wq��N���4E���>rŲAyT�
D;�w
�C1oH�ȯ<���K_�`��#��M�D�W$����ٿ�+a�4G��uv;N[Q�%o�L�7���0D_����D��s/T9�^�4�z$L���=�[�2⍋�42�!uv�\��X[t_WU��~�gv�І��A��H��@�!��&M����u�#z��
eX c�Z�s��"��.�Qf)�{�c�I����Y�oABřc%��;���
���Z��r@�o�G�>46�T��z�y���=�dk�����O"1[��P�(t���������8�Y����L��ч@j� �O�����P?��,������1�B�����Q_�V
o�_2\��
�w�C���=�!��"Ò����o&�^�@9۩�h3ԍǕ�p�l�W�"�I�!&K�Y-�?�*���
+�
)\��|���l"R
+�Gnv!+
p�� �
�A��P�+1�%C��������ہ��g�a�*)�1
�v!A�_%��0�"q���
.��
�M��%�s���8O}B�~���IZ&��k�B�j1�3�e5�s�T��!�s�
���uh�(����o�y�
�^юT>1'[v+�5by�N�`�������xb-n�X����/*����R��X�(h/r�%�
�v]��C�F�
+��oA����hd]�r[�,�Q�
+�,�2��a����B5Jl<�'n��Q�}��f�	L	�3��H
�u�5xȻ�0-4�W��qlQ�>�����lq���&�=�8�+pI��
S�0&�<XAMi�0@@���\5p�F8s��vh�^�#n�X��6�\�u&�&ކ��)+�$�����%(��:{��V�p�@��%D���K5=�)���I�ë�N��+��3�#7�NbC��)P'����A9��7��W�j	�2E�Q+��]t����U�
?�0���:W< ���k��!쀶���o����Ҽ���g����F��:D�n�az���G��
��L��qN��Y�W-Q~�;^��^�ء)1M��أZ�ǧ��Ö5OAS	%�Vf�e�]3yG{�靈|�X�*e
��h2G�W�b�3�L
�! �����Q�C �y=��-�{���uxJ�%x��B��H1��!�FsI��pՀ�O���\��ˊE�y:�[䣅<��>/�Ī��A�Qs5���6�Ocx��% [...]
+2�4,
ҵ$�����‡B �8�F˩�+6�wO#���
���)�a��/[�����߹Gy�9\I�4��Ż���9�ng
��1�%#��tqגOH|��8���N��0�3�1��4rvX� ���B|���x�P2�H��iߔ�g���O��؉T�SR��;�N..�8��iNDA���
יP����P at p��'�Sʏ'Lp"���>.�G%�
+�
��Fa7��-�>�G������!��������[���
1/�G&h"����X�E��p�	{�I��9"UE:�6pf4`FO1ɯ�% 3�Y
�������qy]�S;��׉�y�I�󱁁_�HH�Ƣ��xM�̢������|�,����J
��8%`�,��p4�����	Se�`�^���$�i�	�Z�p�˥`
�|��Ic?�<�rv�(Y�v���\�L(���(W�ެ�w{	����
���OO�
+u
�Z�
+)��Ʋ��g��M�Y
��1'j#�A�F�q����p,�6xj�5��%U.��Ɵ�qLS:�ڸ`I�OR
����A���$5���Y��`��F�TD2
G��$'��’:�/��'���
+�<|c��7S�Mq��6��F�r�B�#
�K�`�
.���<��
�����.{�"����S��)��2Lܨ�H���2ʄ�r����q1-��9�������b�dČi�s�҃�ʻ���!8
�``�
IN��^k
~
�d��.uP ِ�$���Db�m���.js�m�|�SN>
�yR�x6� �D���
�a��P�B�f7�s��n>U�4boġ2�RҀaFba�rd�wp�Bx�<�K�d���j��v�f
3��t9f�W"��9�5��U�L5���gB|�;С
+��#2�~nm�@���~��O�Ab����LR(�51�t�|���Z�(����9��|`?=�긅��+5Fٞ�k�ZV�w�
�5d�?�N� �P�
��8����M��ظ{D�7R���q
g떜��Kt'V���#�.�x
�7�ho�
x��cί�6����|i*�vV6ը&����Nw�^�z�:gMɈeUSזU��L^��UU�{C��V��$ˈ�<2��Dh{Fn�Y!/ݩ�g�#{z���������a%�xW���V���LC/�Z�"��R�Q�� ��*��x�FP���K|�k8����g�*��2��8066B�
�K�o9����{=�<����qR���-�Z/T�r�Ə� �K�b�_;���@[�IS�
( �L�	ʺP6|?���MR�_���
+������\��uK�.�#�;+Y�zB
$8�<X�6c#�G��e[�WU �![��Q������UE.�U9�#��O�##.Z�Džtg�7��8Cש@������
P����/'
�Z���z�����&�7�ݵ��|�h�Y�zW������x
&�jԗ[��b��<k{
�j
�@Պ"
�v��
7h�
�����
�
o}DB�e@�NG�����?��S��{84��%
Z����]@�.*5.d��߈ǿIY�7��VB��|eΥ(J#)1,���%�U��jb��:`Ca�>#��R3���T�~�v�?���,�a��0ٯL0
���C��>���;��4������p
��}�)W��’ݷWz$�G9��kje;k�!z)�AQ�w�d	�A���J[�Νh~?{Ù%�j9|�\��
+�_�g!!/����&J�5�S$�A�
+��˪�pF��oh�̿$x)6Ɩd��[?H�mK5��1LI����
�pyc�zƇ �╭@�C�ݲ��Y$���1_��KJ/�D���~b�ᖴDn��
;���g �e�|?cm"ƒw���!���;�t� ����w�D���J1���<�G��=��f�^o9��F	�2�
��pt������.q�G�u �|e�'�"8�
b6�>��*�;NܯI�EU�J��-���5P�~E|��K�$
Y����]�Xz	��S�q�R*{-H��'��K�&��ғ&���1>E}t!Ѻ�b2_r��E{"�%�On�ѧ8Z;�������K����
,�
�
+C�m�%w������X �~I�f�ђƺ�T�����f#3�9=_q^X�+w{�J�q�U��݄ôz)�슰k�u�fr��%:\�ts�?���L���U�������)L�� �ΪT����o����7-�\�
+���R]�
��&D~$�����,Z�.��-�:R
�O��{5qҤS��(���iK[�D��R�gdv����]҇�4��-�C^�_8�`�Y�x��b�uY��P�j
+�P���O�����Mi�?[�}}s��.��
�B ��W�)��i
�D�f�{z�k6ǻ�h}F~ `�C\lr�H�U
�>��}R���� �L��[�."	I���^�,f�����O�ur��X"U��!��U<������u�#��s��є]���q�͎��ᔔ@G�+0-�
�0����r���S %C"�b�
�i�Խ}}��X`uʞ����|�KӪۖ|uhf��0��h��\���C
Y$����I&�^��#��eo{�s�G���=P>Ł��b/��C��=р
�jdv�n,�C>�K�1��!JS�����
�Y
����'a1ǰr�c���
�L��ؔ<H�
sh0�L�I�+�N"�[ p�Y��Ӣ̐!Z�������Ο⧽X��zx�&n�m�850�u��z��0&R�S�(ׅ�u\��Ü�.YR�� N[��`2�=�X�
HT�|�X�Pa� � N&�Ӄm�H*�=؟JDI'q�� 13��H���3J��I���4xf��k���
�nL���
�n��/����sߙ/�!v�Me+�2�H�o$
+!M$:y_tnvq�Z���e�([�@h)�w�
ua��N
�$Ʒ)_��f��h��+<[[��{��_���RGnX�n��+���N�$�����V���'���@�*
���pڏ��5}�rp̐���%��S��Wd��M�Iwk N� #�
���
~�z<�#��}7�^4o�
��ѳ�cw:��r�	ˇ����J�p�l�u����e����:8.�.�c��f���=N�
@H��Z�TA��RɆ��R (��	Um�֭�����
+�ێ��z�

`
3�j
��Z$#
�{~�n�{�fi�C�/+DL�3����R��#8z ��-��?�?�"w���""���
*��m�� "L�k^T�DMaI�	 �1C�[��eƁ��ա
 �)�
��Ȅ V�3Y�q<d��1�s�D�0����ND ����z�T" ~�!�bJ�p =|x�ب�4[�-wd|��"�iD
�d�%��&q�;9Hx�G����R��#8Y��'��3�X��@R��H��n�7�
&�%�O+,�(��'W/�KC����O"�u9�j�I���Z��ꀛ��/<�N��#���G�A �0��q���n{� ֑=��˟�?��	�I�b���a�D���v�\;��&�h��1n.%��M65~��P/��<nb�t��rG
���g�kI\
3B�nc��n3]F���
B�IG�7��uUk���:1=G��eX��-����}\8�ͽ\�' ���f��#e,e���C��#'�`���Ȇ��
"��*�>�
��+d��8J�#eR��O�&��Eq���M�1��+<�H
�TSznTk�TӞ	�#c
o�FTl�?H�,���O�,��"�Cz
+1��u]Jo�'z��I��G/*��r�K#
�D\}FI�t�g�F�p
N
ҳ=�
��
g
+�iU��(�:GE��0zw*l�����X*0�#Xt�D/��)��T�	rq&NȺ��S�>�~5c��
}�B�D�p�
;�[g��Q��Ī8t�QsM��5�
衲�

�^E�e}�i�|��i
+��=E׳LN�)gF0�Rj�(w5e
+�Qk�k��M���1 0�Y�踊�X
�~�-M��q���
^7�5J�ø�#� ?Ht�@���m�(�y�1���;P�.��tA "���Ft���w`��a-1hw��#ɧ�-��������g��K�u�
���8�i���
knxF]��Z�w�5����8S�BM2�Kcr��N����8��C��x�v:$VÕ>�J�
4vtY�r�á��t�X�鑋P΢��n�
�CD���1�9�P�_G�|��j��$ZWi��B��)f��P�bM�����L�%�ZI2,
25�pmw
�0ie2 �H�V�[T۟X��RM�B�<0�u����
�.åM���م�L8E{쐇%u�Qq�|��)";���6t��X+P�؛P�~ ;��^U�t
�e
֬�/����{��˺�4FD���C�6�����ԅ�1
��U�
�B�&ެ
n�
 
d
x	�8/�s������P-+׸�M�|!X7��
6k�3(y�6�mR�.�{��Cu}�q�������ݤ�bX-��c�@q� N��quO�!����N`=|���(���FB�A���>��сLq���A��di��Ar��M�a�^�5VH^���V|��}�gu�{	@)$����;m0�P)��U�+n���h�ksL�l�G�_k���	��r��[�C�y�f�)8�y��E,TQ.X�
+����Pе��Osi�ᣞ��>?�k=�>�(��Ɍ6t����~Z�6<T�S��
2��գ
�f}����Rގ�b@�wg�d
+?`�3WU
��톨��(�j� �|� T��0��e3ḛY����%���Z�����@+c��BD�$�
�Ւ�b�vH�32�a'���z̚S�5��n
{*�n)
+�
+�Mg��c�ľ0�/H�D(^���P��̘����M�C�R%�
v��:�t
+G~Ȩ:WG1�j�Q�]t�VS�~��GU턬x����)�\�RR5TS�
P��R(/�W&��P�

�6y�� V����%Y�w%�נ
|$�r.�[>�Y���W�IA<5���1�Y�V4�ˣ�ȹE��s���,����j:�<Я�����poY��.��j ^�BfP�����t�ZfT?�:-�2Q�;��8�X	wÈ�B�d�.�X��$
%ψ������I5R�qZ`�	c��t{�@[_{`̐��[{1n��ҵ�YW3�	^M�0(
+]��[��Tߨ�Q�	Oʦ���^
Ctj�
��B��ϟ�]! ~x	!
�>�b˦�0�� �
�����N�1ߖآ����3j�̤5V�g��zt�!�I���~a����ъpe��=[�T%҂��e	36�<&�
3-	�	1IF�	���dQX��l�������y� }F
�2
��"�Q ҹţŵ�P����+
+$�J�ib�Ɣ���
[�Ѧ��
+
�I�җ
B�S!�G1�{�l��z<�2������b�
+��ø�!��� ���5�X
+�f|�+�R���S�jc
ہt��y\��
��Z���A/œ��ä��
|!��b_=^�`��6��*�R����^;����`���;���
�C�	����8�"Y�.Y

T�)��%�i�$G��IE��$`���k�x���`��?O��o��x�AP��!l�x��T�
W���������%�f��)7R6o
�x��;�bS����B��(�M��M�������I��u �,�)�~@<P@�o*@�Ћ���g�5�:
�
8x�6`
��
������UHR=rVw *w�=����y.a��~i�0��B�
+�uM� �}�VR�_<C�,�E[��p�;�Gԧ�̯��,�L���o�t��HZRe�')GmyI�?�	�,ͩX�҅9ӫ˯A^%�C�Y'I�p��.��D^� ����r��ŕ�_
4���t�⒟�%�S{y`�� \�I�P�cK�wpY4�����M7x�%�tL�M�hzD|�rz퀪L5�/Pc6`�·�w���8�Bh�=��S��
.j����}"7���3
�T��/ 8 $�Z1M�)�%	�����4�s�
�@����(�4�(�T0J�{Z�CLn󇏁���:OQ=*I����
+ u
+
�ʱ�Q\A��몮��
؍r���H*9��-.[7��;�?Q�HW
+��15�,%�P�F��
+��+ÿՆ��L:��#J֕���&���9
U������
� !���[�!�J���|�qa�"�����h�>Q#�$�(0LIBZ���# @J�/�z}�
�5��j<|Zze��� t	ۚ$�
gs$��ej�>��.0�t����L�-�� 
��>�
�|�޼Bt
�Bɇ��8&e�r	8� ���L���G���T2�[���K��T���*
0�����!�q(ey(��
K�pj�P���E�vș�;ë�N_�vU� ����=�Qz�t�Y�z�<

��$�'�@��t�<O��̼A8�0x�$*p
@�,�Hڣ/
Q�)q����s�d�WL�� �C�%���;T^8�r��dvH��t�b���[�<�������P1c�i��郦 ����I׭J�&�
���� �����h�����B���a��.� �ס̊v��|�M��7���
�?�SY���+����t�v�=�
`!�9��Ks����EI����Ycj�(��e ��
 ~W�ϧ��:�<2�=A
+m�=
�Jz@,�T�|
*�M��G��jJeh�`
�0c�h)�٥�<V��@G�!2�$D�^�-=�
ܕ%��c
�_v�

�qY&�3����o;�nA�_�L���9�9R�Q? "OQ�[��߾�m<_����Fͩ?����
�7{��<�
����e�:��\)EH{6���!���5�6����P�t[���

+
+�5�zk��\)��^�����w!rK`

Nq9XSZ�P����!L�+��p�U*R����iV܉�}����(�f����D�
��'�P�.�g�=���fb�7[��wu��#2
!M�^��eL���q��L�H��0���x&��)
Hi-\�L�	� U��N �$p�S�~�#�hV
�R�����Y{�������!8n������%BM�>z<ʼ����t3�q��6���?�R�V J�{�x6��88�"�գ�*��h
�P�
}V�#���ң�߅�.I;!#�zag��3LA\�I�� ?*�4t!��z��[n+���~v疡D�l��

+hC� l?���Y
Jf��*3
g�a�#m���|N#+�(��'��T
+��R+�;C֠�7��@��R��0�sK��ɻ��DD��݆���B�i�F�H_��f@�A}ȗM;�_�_ٳ&��FK�X�D�uK��U��b	 
���,��UM�+Bm��o?A�� �_+N�>��<�a
������ ��rw�
���~�x.A
+�2ž�܀���N ��t`��Z�_�
�*���c����GC�����F�|��K8|�q:&�,#��$Z���"�y�ez r�h�W��9.�j떣�;�K��P?]��""���[BS�r���9]����aK˂���
�Ȕ���HBa������5eM���
+�ٵ�<r٧�RC[���bc����(S]�H6v���E�F�ٵ�^Ò/:����QܧP�
�֙���L�3	
�O
���y��_4.e^��_U���b�J�b�,~
l�5
�B4P�Kr>��%1�K
���ҿ��5�ɚF
�l�V;�B�����{
+2
���c���c�Å	������Jd2T#`V6ucm���J���Mn� &�C��6צ�+9�(4����Gs{_�Q��h��qn�$ �n�|�8
�
���{����n��[���]�>j$^!]����~_b��5q�L諃�É��D;���`�4��q���D
 �m?�"��z��0A����|�N�lA�
���Fe�j��ʁ��q
m��$[��
�͞�K
��z?7xOk�j
a��,�-Ţ.���������UC�Nv� 
�0R�������pǮS)�0Kn! ��gz
�h9NA��)J�[�k��k�f�v�
��ގn������7ύ밢��56���LJl��u��PN��X�������/��W|G响�GC
�^x^1ƫ�9���j6��{۷+��BD�%�Ʈ�]
k�׹�F�‘�"����
��@��*"da��Hcv�>�
.Ԗ��>20��p(:�Cu
aް
���ݻ
ު��/r����`���fX������]|?�\��!��F%QzH��e:��O��F����Я�l�����;l)P�<�>j����y�Ë��I����M�#x����Q
y(�?�$�@��G��X\�����l<�|v'���� �>�|("�r���(S'��=����{A�:�'ɢc9ꟻW�����5��sh��Wʇ��c���9<����G��
|�@ !��'��p�����W��b��r����=��]�-�1��hFC [...]
+��м~| 
��}���M-$m6�d�<G��w��K��K�
����r��WՋ��
����
�r�
8���ͻÅtu8��9
����ǔ�A��%�D�R#@��\H{
蚂ϝ�=;�=
M
y�<�r�+�>N���j��C3�L _�}�C�n`+�ƌ��'��0N��7��&�)���wKCV��BeN)n�{2�����
n
_�0��:�)�e�H�"�v�V*	��q,2x�z at _���t�գ�H/��̛� PB�ҀRy=�-�,�[��U��Id�w��Sv�@�2d�f!������xQ�EU��M��iu��6
��ҐWAvt���|&AY;	dG8�:
V����B=�o2w���'��rw��� 
+T�� ��D���P���өo1C�^F��$OՕ�b
�1|�� ��fc�o5
+Y�a}H�
ֻ��q�˶��kZ:%�py��(;:zY
+{^�Mp��6�X��,lv�6i�y�C�L=�e�l��R܆�32-MB��R�۷$�����2�H�A�|N^#��Ϊ���8��*�wN�����_��
�+iT:_챕�{�:s���O��	<�H
�'�
�K(u��{ꏐ"_���>�RT#y}+�| 
V�<��O�_
��C��m��C�q\.�fZ�EK�s
�=����q�t
�H�w��j��Ņ.�eD���>AN�`#>rY޽����q
A 	=���T�
�O�0� v��rTIJ��iVKX��N}�����7�>i�w�w3�p�GܶY�}
aR�u$~�DU����Q���q��~n�ƹ��5B�E�&R5tW^��-��O��Wc �	�����[��ɇJ���H
~f�+FZn �'GFl�mUB�WP�~N�J3g~N������������JM��
;���IR#���Z�����8�7|
���IhynCG�I$Ӱe�w��������>*5`��`N�C�T�ay/�D��
+%eAXe
�5 at 2����Dݧ_]����j�[4�a<K&X.\���N�Lb*��@#Ge��H�֐t�g�c)A
���9���k˻=߂�M�T���N���:w
c�h��]Ԡ�
�=`��(��q�P�
��_o�
k	Ne��d
���)Il��
.��	�""��sC%���IS��j�B�=dqaJj
�Q\��|N
+2��.�4�a�熭
 ���O�Յ�B�|L_D����<e�{�r��`͏�����f��h����3~B��A��{zy����W���A�u�U��
�����Z(*"N����,��<K	5$�P2�7����j�v2M?�^E�R�u��!�^q�9���mI`�CH����g1ivK
��kH��f8�����u��
�S4�K�΁��B��{C;4� ~n���%�Ev��{y��
���/,����T�y�M��kkjE��l�����n�/�5�VD���$�����`�?�� s�z�1��֩�S���)`<3�7)��
�Po
T�_�֟W�xc3��k� 0D���b�b����mpT]8C��2�S�a"$���{��1��)�:�F,����	�I�j)�Dj�G����7w�:R��t�ջ/
)|��$?\�y��O��`5�BFp�ɽ�d<o��؏�'��i��n��\��peu�T��A4x�ld&���;K�E�k�¤�Iq
�E������"o�O�
C
+o`�U��A(��"
+��K���
+�j��s��!��ߧP�f�|D�H]����V�c�9��r�Ϋ�I	jpi���̔���
.
��c��\o�}����?U�r\�(�푂�H,)Z.�%������oY��D�W�D�ʃ%����!��dS��Ϳ��?��_?Y������?��o������/��?��O�~�/�����ǟ���~�������������s���o��?���������>�/.�y]����+���e����Y��?5��Q�qD��[!���=�
%�dHh]LM��[/z��Ѧ��UQ {
@
=����
������������$���­��v\h�9�+:�Y[�� *��xM���
�X��f]CH:!$^��ainډe�r�&�
�R����A
�! JУ<���&�4���Y|i
qPz�q�=�k��$S�&�W�H�uV�V����
+��}N��
��{���ؽ�DX���8�
4)n{�P1��S�o�C!�7<_��|�Z�>V JK�f��7�y at +�w����7EX�T�;"����ɉ��0
`q�B����+�P�
b`�HM�$(������
��% H�{�TK��u��O:z�]_�a����];��a������A�n@8�=G�'%� F�Tɣ�@?���
+����a�Y�r7
�s� ���s�
g���
]����芈.��L�#q�A at B
+�4j�]�>
£�j1�*V��k[{�-���ƴ��)
+N��#hQYuI��@˜�
����΋�E�.���j*�
j�#��0I���&�P���\>5���W��4���W%]��KX�P�M�Nh��;C��4+,�t����`�Pߥ���,��q 8�pGE
m�P^^K�|Bo�P�
(��
u
�d
�P��I/��f\p�|��Y�v��$LM�{�}����B����nњ��'�Nμ� O��
<ؐj���� �z�H ������G��=�˕
�
&� ��
��Į����@m���ǃ�YU�1|��h��!�X	7��&e����0��05�c�
'����н�	z�
��%���� ��X�R���}��@����1E��n[�9
Y
ԃF�QSX�j�}�"pM�hg/��zbv��z|��Zf��bեH�`*R��i�
T2큝=ر��9˳{e$hJ@��2�8�ǘEK��U���
cu{`>@��}�k���M�
v@��'�u�����E�����P��X�
�9�c�����QX��Y��{ [...]
�9��^�RD)y�$h���tr;{�"peR�5��!�h�tz�[��@f3bb� bB��#�#w�Q
ؗ�t�f= U�_���n���D 3]SYsj�%�xQ�n��s�.�F��
��!�N�� i�#�,F��Ѷ�b[G]}�(��c�{Ƽ���=28#zgУB���D�]�urkm
�#�H3�K���keŏ�{�)�z=���c�\����XBj�+:��kI�(sO
����*�	�d�%d���'VVI���%(�Fj�O K.��'�����p9��{ض�C!��&��
�~C�[��T�qU֐�$�.��J2�M�ldU����~�Y�*�ԙ�Q�.{�4�9Kf�L<F�YD
OV��a�R�(.�:�Z\�x�+K!��i�b����nj@�#�
;��a�%�X�y���鞨�q߷2G���⊨~��
7 � "��# ß#�����R

�e�
�A�R�� �5:�Z����1�ʼn���d���$W��9�,�H� ���W�.uk4f�H�o���݂jJ��%J��8
����"o�ҏ��
+c�ye��,$wO	{�h���fX�ڳ
����<Z�#��vB�
�T�zx���/�XQ�/�#k�$�9��P8$)[xBd�1����%+gV[)$�����8z��8�s4��E}���:��bJ4����!�~P�T�q/���X#-&�QC
{U��ٯ�m�=�Cv
+�<�@���Pa����sx�Y�#s�9Qw�x������i2�Rãa^�]̃�и�찑�d͡ [B&��!~By
+�.�4HC�m���ij��
���J���h�����w��&p�<�Ͻ؛�qE�L��hr]�[ZSe<d/[,}��8"��#~�����I}q
N�A�/{)�_8|�Vz됑8�)��m]���zu�y6ˆ��Hf1��דJ'4 )>�=,*&�	0��}TH�x/F�})
��[`
�,�=�d�

+��.Ծ�I(1�o߃/��,S:��2�����B���
$4��skJܒ��!
f#��A\۳/�����-�����U0��<*%��3����lS���G�����=�[�'��(��� P��Ȟ,җ���蚙�a������
�M�b������q�8��)L2�ʕ��d��;�ȅ�*�S���ߐᄘ~W
����P��D 
Y���!�����K߈���� �b�v�S�1�q�-quK�%�ht*�<R���j�u|}:
5�X4���W,����sA�S{r`Ȱ�@DW���4z�E�
�P
+��֡o�d�|9�H^�^Ȏ� �+sû�L
q�^*ֲtY
N��]Ԕ�%
+�2�J��"��o.{#|�-{��W�%z��o����cGG�
�_.��q�������~�4��l4h0�H���"�Z����G�lp)/\Q_�G��
HaG�8Fr��O�p��S��Q�z{8�ΐ���w�]o�>��Q�*G�O��_
��n�k7� �VYA��p��*��:u�<,�
mAG,���h�qi����D�N

�4���֕����^��p��D���ڎ�)�+ݝ�HJ�W`��:�����e/�ĉ��7MҒ�Ljm�ʈ5x�A�KZ#�3�g������c�=P�Nq�;�S���
H�p��Qq�+�
iWd-qH=�����r+��t��D���1)_Y�[R� ���
%��d$]`�ַ�N�*B5�|�
(�s��؃Ue�
K

%�c��B>u]F`�H�NK�������`=
v��l�'VZ�(;���
G�Y
ٯ��<)_��n�sƷ�3����]�z\@����\s2
Y��א��t��l��X��U��b�~L+�w�q���-��_�PZq���/�^"LZψ����a0$���P���u��|5v$�s���Y�}� �ޏ��{�<v4�%Lx��{k�����y�*׺��a��
#��<�[��*ِ���-�~7��)�
��Y��
~�	V�+I�z��O���-`���0����/
�
+Nj�m�<i�_� k����������e/|
��ˏ�T��**�����OJ�g�@���`�~n�4hp����c��A��5 at 95T�� Ձ]���
!������֋2��mJA�8�?�<
��IyG��2؀9�/]�=�Pl��5�?�V;x ���(0#�[�����
�@Q��[s�Tދu�6ϙ���l��`�˻l_n"�mˑ�ffKNK��ˀ��Fz`\�:�%O�u��ы����L�
>�)M��n
��N��0
E֥��A�u�����b�� ���	)�=�����b�4�L�#���{���o�y�
H~�!��v�~�e�2���Z��l�)UP\���1گ����wB�Jf���L�R<a���
A�~�E2���S�'���u
+y};E!VH�*ˈ
m�
G��
3j�`��}$o�*��_J␸�G��c��[i'u#fO�
i����õ�}��㾚��C;�ϝH��):��M�s)����S���=U�7���z�
�pq�혊��ص`�g���/
�Ȯ%��ק
qǺn`�U����T�i��[O����q��{V "c��M:ă���?��3��>
+͵�ut�E~I������vpk՗k�d�x-2��/za��
s?������4��"9�9�#,{�j��53��Q0K��v��y$H
+�$�+�;�:-�\f/J�Jl 5��`Z$���{�"�,������<�m��h5\����S���
+�����~�ՎhSm� UQ�]�]!���
+fla��O�
+1_}�ѻ������r��v#7$]O/"���)�r��@z�
M�=�߫
Z��y)x�����qcI(옺��Ⱦ�I|��Q�3�/�f��P/��zmބC�F2..��@J�nJ`p�9
�#���#@�
�p�Rd�e^JF����
+dU�l��7�|�õ�:��D@$:�/
�n�(�+X~5������׷�r�$��\�j�
H� �a�d�q�V�f-�z�lU��E`@
J�tr+8yb�ʺ���s2n5�ls�} ����I��������FMsB���{/��ԣ�k�/#&�^d���~������	�
	
�

��I,5�
VcϽ=�j�
�d�D�E�
6Z�"&�Ho�Qr4{$$*
+Hi �Ĺ�G �I�6�]�%d��*���Myϗo
YV�]����}��F P��=�쟠�A �f����g{5��I�s8�⠨}��S
+ �κ��%Ȟ&y����5��i�\ݜ�,b4*�j���a%=H�у�o��:��z{��a��
I
+w��Ll�鵣V�N��U���� O���#f�kM�m��)�=ʳ=4Bi�*������oj� ����.j�c�� �����8��<bxL�Qw�u���R=N�#D�b=��*-b�
�cx�
 1��nR�J��F�vZ��5eF#7���_$4i��/�D��DDd���G��tS���y���t�����R�^J��܍��bc������7�$��+�
�>��y���ܒN��65E�'���j��Μ��,RҦzЃM�:S��O��	�oTH��<���Yil�|u�4�$Cyu�ژ�&"
+Jzd� 2d��?wXaJ�಄�:AG��
0+��@r�܁F�(s�Z uE̺�05k�Ԏ0���vJ8ǭ@�x�
�
+M�3����OBd�Y
H��MS�P^7A4� 7I��M�,!�^��<�h�L��A���Ȭ �t�W�i�Z8��@�I *o�l�3u˱�p�s=ٯ������f�L����0�A�
B����
w*��
}��W��^��;�A��L?_�Z�W��C
5{�J>�
�&�
���@�F#m�Ϟ�4(4�Ƹ�ֽo=�V~k=4f����
��y-�c;1�����ĉ���D���&�K#���E�Vb��z������L��t��c�ؽ�&��5�c�O�{a�Y{%��D�1���
���&}��R�M<rTf>7DJ>�a|��x�Bn�M������?�=���y�msFv��0��'�dZ�8���E�OECm��
Όʺ����^��?YϞ��$>V���
+$
$-���
�AO-�,n����
+K�*&efD��4� 5
۽��?�:
�4c
+�����]�7�^,�t�.�d*�<t�;d�z� "y�ns��Z��E��5^g�0T#K��>�^�huz��^�$U{`h��!J� ��{���
 ���W����d��I3?Nz �
+%$\j&�G����i���f�F��s}������0���& ��P�y����େC�����}�"d5�����y�w�����)S
�&��G"�g��
�?@8�.�=u��� ��7��CڽCjh�Ȓ���:1�A�y��x\��S2���iJ���<���"޾�1h��H4Q���}��o�����ٳ���vf�l���?��в�\���m�`F��UR�ԋ�T�7
+9���y��8U{8�i
W?��%�Z5z=�����=�a2��̲b���Us-l��B8]��}���j�T�
�s��*�����_�U�&2L?��۪��
E�
�=ޟ�֫�P���f9�R���~?v�T2
�wd���o=~�&�n�	�)��kI,j�
TV,k#9������-
![h%@}rb�i�޼��V&��ez��uxM(0V�
8��u
<��^�"I�홖
��
v}M����-�u�Uv�iS��ƾ�N��c��Ǝdj� G��l�'2��JP�A�J���D1c��pQ��9�L
���
���S�S'�I��|"��	�i���!ځI�~�e�w�ơB��f�GT {{�/�&��{Uk_�@>ԻB�(����$:Bڹ��n5��r)q��!��߫�Q�h �#���
1�S�~ک_
�U�=���Oٿe
�����$" -��3;�e� ���|��6�
�=<%��/��(f���E݊
2���� d�E����g��`��WpD�L
�9��&
+]�o�T{�c���!�O��
T��(٩>Gl,�=́��A�ďy�0�]v4u�O�{	�E�̣�R ����׷�	01O�|/?�
~�~r�#�0u��X1`�i�;C	���������D��=�w�C�=DA�bϴ^'��
+��^g
�،,�>�%(�ͭ#:d)P&ޣ{Ř�t���<CF�"OQ��SJ�R�hh��h��
+��?k�m�ER���=�ec��*��ޓ&"z<��
e?�YS������GܫPf�d�W�/�3�oe��>UY��"y��;��l��>�ť_�`?p7e��{��;�7c�Z�\wJ�y���Q�������P����EB�
50H{Ʉn��E/�����Y 8&٣� 	�VZeb%`wG�b�$�E��?��Gʔ���Y�=���]��5!�•
�[��
sD��{�W"�a)Bp�LiS�p�jd@1�;�=/
+�L�
��ek at K&E�6�mE�G���P�(��
�!�h��P#D�7iy������
;�8Z��F
!'9}v
(�>���{��F�Ϗ�i�(P�B�g�?Um��"n�|"�4؏Ts��t�^��@.�
�2�
0l9��ȕ�<�(-� 'z���1#�&\1���qL��ރ�W�}�Æ邏��~e_��}2]`,\P䥕���K#.V���&� uJ
t^R
+����Ww�Z�qҊ��+ .
�w��2������/X�
+��VAgdJ�
+ߙ0���t at Af9�3̃H��8d��������'bG�O��6 �� '�{Ի}x�A��A�H.�e����p�n�/�n<��Z��0G�������Xj���e^����Ķ��{��
Fh2�5�Pw�(6ң�����Lhhƾ6}��>�t�u<��[/7��[
=��J��aC�lL��ӧ�i�R>��>!���CSf;��
tȈ;v�ȁ�A�
H1v�^�.
6&+ju�h��P�^3�W��0�]7��x���;ڃ��;
+�{���t�2�^;�%�FXۚDF8 �!yʍXU�J
�FXDצ��h��$ۗ�r�܀	��rぼ1'���R���=���Zt�~��_���ŀU�
TN��Ұ1�t�GY
+8�8� ��,3O@����k���
���uK?=�s�`	����4}W�q�ˀ��]�@�f 
������S<S��v
w�R�n�)��~�\�y���4 �s�@'X�2M!���
y"Y� BvQ�S�w��
+w�
J@�	�9]��7ż��b��WV�i�fY��eE�-¬�:��tɼq[�"��,f���´��
�}�iXs#�$���
5j�OXĊM0
+�5����]�Vӱ�I�"H|�T�H"^ׁRk�с
��0�E5HWI$�~�V�)k�C��/"r��$�W��g�gk���=�f��59Y���� �M��5�HX�=��\��s_b^O��E6qD\C� 氿hk
�^����~�%QJ%E�
�V����~�xG5�F�4k�ؑeC��ܥj
z����: |��wW#��ϾִHQ� a�X��W���z&g�
���L<4�Ģ�


E������:
SC���}
���O$�-8t��&����$p�`f�x�)y���
�
Y�'��
�/�+���g�E�B����R
L�sTq@�i
>n3�����4л�R?�dH� :�Df�N�:���`(^���=
+k!���<���
'����
+��"8.��\�
͟�qu��=:u�����
<nF*
=,�a`?NH�/5�a��^�Ey?j
+
��O���KND���	*�U�t\��������+N����E�`�6c��F���b3C�%�i3���lD�Af(��Q;�}"I�:}"&�Ub*�_
E�2 +�*�r�v�����=��^͆+*ܐ3(t��N2�`�)âBľ���G
>����N+M#�@��g�KZ�}�h$A�̇��B���
�lx�G�Ο-�PKӞ)4]�-�=S����V1ɧ
�PG��L��
��C�l�bgqA ��s���g@[�����u-HJ�;\Obf�U�}
���](��.-c�w��t<��+X�V�k�`Z8	��	�ԒI�27E��Bl��S�:ێR �~�N���$��x_
5�
ď�ͥGqj�X(p!��i/w�$���ךq����
+�S
�_�^��A���@�z|
+�\Q7=�qj$Z.��
�i�-O1��q_+�.)�;q�^�Bi�%����_��W���2S���3XRى�Q���EƟ^ zI/�á�+L�=�@��� �=А�hz8SZ�1�N@���礔�3Vԯ��ҋ�D
< Ǒ�
F�A�
+ �^���u����/��D�ؙ�@	�HZ�*
���f�7� b�8��2�
+�� P�zu�ʁt�Ba�=MHJa��D��t���KhD\�yH��E����nA�^���4�N
��A�B/2}I���q����;�G�&�"�`
��ƈ��uI���:���ً���~:�[�3��$~L���%;r ��m�
3~����N�-�<D���:�VH�7��dy
���*UA<����i-A�w
X�f<
$�98��YI���"M�>�°9hTc��Z%*U��C�/�RlpZ�$��M ���ۥ�AE��WET!�Q*����I���ِ�Y�|>�L�~s�d� 6)h����H�l�BHD�CC��(	���&�K����fՇ�Vz���ܣ�������等D)~�����9�'�?� �M/>�{,�>��7�=7���Á3���\33p췻
+p�T�=.췓�3�FJ�`B�p�֘y��1
a{(�'U��@
+x^^\�;��Jp��b"ѩ��ö`53��u�����BYɢ�EG�cQ��l�_T
�
�fKB�L
�P8K	�2�� #�	�U'�	r�2�|8+=p�H��!
3�� U�2�W*��F��
�WQ�"d�T�‡�
|�%ܽ�
�z5��a���"I�G˜��1X�iɎ�w���E�h�,���3D6 ��Q�$�T �y�	k�9�8�R�@ij�GUKgF���h/:��@V<9��(s� ������=��
P��o�Ε
�ED���Z���+K���L��'c!��!��p9�I@-ݝ�"�'��[J8Pb�e�.y=k�({�P��u��8
#0<̶�����gt��7e�d$�"��P�,G��<.#`ߪh�Z
�~�聎+=X����?��T.x�j��F��):�u�Id�<�gU0]
~5��-75��p�.B/�9Iy��ƎX��p
�%��)�>^�A�0=�tg��%��G�G1&

Jj!E݆cD	S9��&w/�Ӱ�BZ�^�O���@�箖eCr^>�k2r��S+!z�!��'���\=���>�W �
�_ۃ/ř���H�k�U�W�B��1�j!b��K!��άRqY2{e!�X�
�ob *‹Sv��I�6}��l�A`��G�G5�j��l�)�"2�7�d^��������Wԇ<�sB�� W,���M˾� � }��f�C�Hͯ��= �TnX3B<I���ZS:=���`��Ǒ�X����#�G{�!��E�8z�6��
f�G\i����p���
+=BB�`M=H
�
%��
+�!��KH�ش�U��
!���Z���I
t*
+�`vQ� TB���E$�F��
��_��#	�'��u ����A1��dhV&�����6��.)�F�|��Fh�
�R?�
kq�a��{��V33����P��K����Ȭ.	^	@N��z����uE�t�Z�|OUU
�z�����B
v�r���,y��ct@�A�����'.I¬#�n�z0��F(�4�KF�6�Џ}��
@�b�3�i
r2���.�����N!>b�Wɤ��+&f �@
+�d%�C+�ۄ�H
�B
~�26I��w:�
+O��i��`*�� #��i�^�,�1D(GޫRR2��B,�{�%8�
�
d�`�����	e���Iz�� "�;�'��4R�%*��

+Q(=
f]o������ĺ!� ��
n��� >u�1ap��=9I�̛5R� 1��Te��a�L.Uh�1�c�-.�� �q�5{�Z�xz�7�d������;��`���N���J���q"�#���H�>�q�R
rVݑc� �+�v(C�tL�
)�0�X�&$���)�W,dz�1z�jY`a[���O��
+ɛ
+�3�q@Ӎ�i�0K;
+��:B� �t����

��&�7���#�
�~�	��NL���M����2���;�{�*��(��
A(���h}��$�\��>���²e"������
���.MO`c=$H��Ȧ�?!�Em

��l]�Q4��{�*/�
�/�,�n@��(Xϋ՗i���P��mƟ�g���
�m�aceyı������da�|�]e⫁S�N	�Z�%�u��X:��k�m#;>r02����Cj|]��
�����.6�

+�'��%z�<Ş��)��K�֑G�+f��
��S�p����Rhx,Z�BŪ�)�0Ԋ���u��Ë�gP�
Cv_Bv�bfpBᷪb^���74�c�,ܒ����M7�=z�
�4?�sl��
S
}�#�7����O��9���JxRP {IP���R.�R����
�0�$GQ%�¤+<`��X���4��
[׻
�
E�(y
iB�v/7[�(@��	�P� �  \K�n��D��W)����#��:�6�	�l�G�\��CƖ���OtM����(�
2
����yx_  �#c�K�3]�6�
�#��YC���ȴ�ڃb.#����=��`�{��!
�n�2�DU�3S�na<�Y;�
������ZŖ�e�QV~�	�	iaV�����O�
�&�nM��9�]�����Z�p�
v�`٠
��������ޱ>V����
����;N�n�lC]Q0�����`�V��|��!�Zx�-��fp�a���=��=F�e��Ϻ��l&&��}g�y�Ʉ�s����	�,� ��R��,�
�//����
o�:���|��#��s$� �4
1'��
+�E
�
.Crf6��cT�*�)R�V�f
S5�}N@؃���!	rW

)J�>Zp��
��Gۜ���.F�|�Rz ����Q���9S�F�Cn���F����demg������B��i�'����e/V��
��9Έ
(pD2Ϫ���C�ʾLq�� WE��|�Iwd�G�6�-`/E�ہa���eז%;�{��i�j��M�`h�p�V�J4 �Y&�w|�?r�Sk.�@U���X�s�%b\�
��@��V2��w)�ȩ�<W�,;�׉h�3&[�Ӽs��Ю{�k��
p�?���j�2'��)9� -��p�YOSׁ��i*틌�)�
��w��g@���S���D7M�Ɣۢ&D�~� �$���dU�X#I��E^)�,�
1��%�G/��!!?D���u\�<:�v���
�\���y@Ⲱ�@ѤI%{�A�Q'p"0�g��b3ΛDd��A�\Vh�m"�
+ܐ��		�ھ��A�O
o	;�
`j��O��M�����+ݪ�[q
��҇�(K��=c�@��V��T{,k���
ǎ�tŽ�3Si�:�p�ɒW�a����]8P�B9_��n;��Lyw

���l*���F=�yE���F�
�=A�*oe�����Ο�֞�	<%@��{V�=��D��w�'�����C�|� ���D>��E\d���UV����
+�M�w�ـ��A���"���.�g����������HkH�HJ�-��{GM��7�$J]���D��DG\�F�@��䝖�Fd~�w<�됒�Y�{P��:�����1
+�љ�3�x���W���#Tt��?MD6c
�2V�r�K�-ם%�iCp��@�G�EC
Ʊ4<@�FQ
d4xSf�]�����H���
��C�
��7�c#�'��3�uX��!����ٙ�~�v
+�E8
Au�b�}�m���
g
+e���B
2I���|k����a�0�$D�xX��	���R��5JÄk�/�g��k�C ��^��
�Ab�0���s��~�X�����)��=�A6hW����XG�Y,
��8
>U�盀;b�Py'���5W��)ϼ�;C�%��Y�99�ј�D+_�A�Nb[g�=JM�k�؟�Յ�hz��׽mު�1*��_�\Wr槣+
����vaVaw�9����W�ɞ��i�VMF$
�r	�}�����t�œ�Cy
�@쯭+*] �_�+�5�ô�>*����W�w� ���E���rY���
"��s
+���ׯ��
[,�
���:�q�
y��E�Ȓ9���@ �v�
���&\Y%y�����P�d~���NK��D-�P�����fFaA�����q��<؝[(
+,iu�$Ӈ;�T��uT�=�3�
Ϩ��@¯�+�¤������(h\w�1�T�yV��?hCd�H}7=l�|3��귦y�g��m�&.�
疺D6�f�
+�������MByc�}�

���(���W-�JA]�c>��p� >�b��+:�&�͞����D9]��%��J���A�#����Ew�~�?�I�"!GddFPM1N [v�5�pFW���zW�Z�˶YyE��o�	Q�w�ɤ+lȴ�Q�Y�=r�~�v_8�\%c1�#I�^K:��J�P
�]��� 9Xu�k/�����J��@��!ه�K��}\q�+[0���|�(<��<c{p��f�k���%�Ɓk�M'����j�3|❱�S
ӳ�����H�)PA�faj��SxA�u�a�tE�`��jΈ+�E\q:<�����W�E�5�`�l�wR����V6�K�A3zg��%C�����s������Nn,G�Q���Q[���N�!D�����pi,� ͒��t)$3��J�*UY&�<*�f$A��
���ȭ�z.�NU��B�*
�q;�����_B��L�|A�Nh�Ȕ@V��FO�Dt=#��p�Y�� [...]
+;ϴI��
_7eE��⡝�
&���溗�A���S�"�LkY�ռ~%-�%
 
�G}5&��$��8~
h�i��%�%��Cv1�}ezP���w�S� ��7�W��"���v�˲��$�u��h� ]mv��M"� ��:�D
�
 -B�h��#*��rv/��\)�'/�Z�F���
+>���\R��)a�7�$鉪W��e�GuA\��á�-j�K��3W�e
+��c�GrFC�}O&E �yL,
p
��]�����ؽʥ�� v&�����Dx�rT#x���VSE޾c���e��
�� ͡
�8�-^���Y�b�#j���€;s <x�`��_$b#��?f&�#D��!3����G�����+:�J�?V �%��$N����s�;*���y�V ����]�R=���Β�Q�w:���W�,��V&�����T,P���
>)���ח��
�A�GՓ�e�%�%�!ɦ�=�d�L)mL2p��-x�|�:~n��N��(�I5�O�o(:I�ڿ
l�sR{��g�B���~ 
�����r��M}IJ�"0m<0�:g_�r��<B�V ��O
+�wU�JGt��vٞ�K�wJ�q�8c`��oO^�% ��R0��zAs�B�����ГlE=uNӇ!k�I�
�:�wPu�#� N�K�gHM�����ǫ�M."���y��Ry�gwԶ�͆�� ����RM�
u?�ЎOJ����������&"��4Z�QZe��9N�x
�<�?D��5��柴��
�|���|�e�����K�3:� 1��8�CDY}.MV=�Ar�\�/������n�+���*� �V	75�jk�������
+PL��(�u�����L�Ek&/�,C�r�`<�#b�9���x���qT[�1A�sE)x�/9�
�1z��qqc_grְ����&�N@�ᤁ�������q�$�������8�`]�n��l
�(�0��J�.i�k*~oQMaw�
�aOj�>`eDn��Uj�䂖��g 
�+
�x�`I]%Z�ƾ;T!�$	�O�yvx��̞�Lsj��ט
\A��4e��
Ne�}D�S�3�w4���@��4$�鞷 iL���|K)J�%�$o��(�($��B~�h���(�vʎ��15:Y�t��	�����	�SP�Ex�ay����e@�h�|Q���:��
����vt1�=LR�"��
*iR���&_@��5��`����$�
+�G�g�OO��ߞc
����t��
8*��n L.8
�i��a��$f�p@�mA\�Z���������] S��4*�&��ں�)�`�x]����	�J�T��,G^]�^
'>D�t�N����j��sꊉ_�/����f� ��jm�Y���i����C&f�ט���(���8Wf�;Tx"N�L ���p�����'zGy��.=ۉ��^g��.E
�Z��������+&��W��3�,Yy�^T0�Z^ͬ��{����m*��
+����V�"�3�q����7���^��nu�6li�"~zZ?�N �:�L��&n��Lv��<�l��O��̇W�DK	njw�#YJ�Ь�I�0�7����ة��H��k-锂�$%��nJ�:DL�y4��C���gj2�����M|�. ��1c����^�a��������+V5���d�[B�q���DY&;���
(8��nN����i��32y��(�wM
Po�ޝ����H�0<��?���`�nw��+ӈ�ŭ(��Ni��&��g!JqF%W�9E���8�;vW*�<}��?�����K�y�e,{���Y/��]ÚB^��$mh�pϺ#U��,Z���ζ'M�Lx08��Bk���;.�!��w`��*D7��K7�K��ٮ��宆�G���
�e��t&�9�
t���:[oPҾ�3����P:����$��D�	�}4�qx8��eT��K97���=
��̘��hHB�9�u#�p�X(�/��g$d�6�(���P��	m� [...]
�ȍ�y'�
����r�bߩ������(�_ �j����z
u�3�<�21�o�����P
��`i�?}Q�0�
CJ�	%^pDa�A&��P�@��ct�
گ�4�
$��#"uԓ��B�g��P˃�B"��@��ˌ�F�Y�aƿ�����
��[\��`�B�2�[-Fh�W���>���3E���Y"�O�ho��	�u(�9L���Ak��E���"@��{Y"��^�D`{��v��9�:�i�����+Gdp�dB
��Xj�
+8x��m��$� ��f�w�Ÿ�kc��7h G���Ֆ IuL�+]���o︃�c���s��vWx�Ո��*n���k�H0�sd8�2��`�>k�<fW岁�E���%���h�Ο�SH͋�廘L�� >�����
N��Qxc9��k]��ήN-�ǰ��.�"��/�!H��ث;�3��$22|
��5eM�l2�U�m�F�f5YR@��JU.+�ي����Q�:��p݌
�*��L�a�FZ�+B�
�����
0F���@�A)>�sv��
+	��ȥ�����j��;�ʵWE_�K�㏈b��]۟zs�GA� K����k��;Po'��> 0=i�#|�>�=��k��b����m�e��<����� i/���
+��¢�Y��S�kVFbNVI��O%���|E�W�p/{_��O�j�Jw���Ӫ!��<	�^��Yp~i�8Hwx�%ݷ��J��b_�#�
+
�25P=RB�\*�Йrz��z�xv���nw]t��}�\�\ e�ʣ
���!hU_��^��p�9��r��D�

-
�q�d�+B�|(5��ۿ��5�9#�.	�<Co!"����Aߔg_օ"���9*	��'�5�[�UӴS��|�
J�NM��6US)
+��p �F��A��u�
�a2�ɳ��p���?ʅ��&�2;�A��T�Z�^�le;G�rTi �crY���o
�nݡ�f��8��3��2Z��d������9Ju��v�9�ی����G����L�)s�
%ʇ5]/ɹ3Ǹ��_'"O�V�GA
{OpqE�=��.�<0m�#L{q���
�#�Ib��� u	��dR��q	U:C ���>��;;uۡv��Qm2�-j��K�T/�E�����[aF����8~r��r�m�a���oW6Qލ������Xe�(�Z��=�;J *fC�~fͧG�أ�fL�ZGF8�hO��_gB
��Q߇U��1��\Oՙf���8�r����
��H�\���KoiƳ�����š�uL����0ܐ��^%��U��D��z^�
Fd�`"ش�%���1��$��2s`�H�>��U]�k��
̰�zn�tT
t��	�p?5u�9�}�Y���~�ęK`ml�yr���ԒDs
��W<��v�Ϝ�3����T�=
+f,(�,|��l�E
�C�/q%BLM�ޕ�ۇ$�]�C�^��c��h�k,Z������
���yg^F��Ur��
ި�;ABFY���7<�?p  �m��f�R�a>��x��(�DV�Dd��˱+/M�E>YCNu���B�>5���x��c�v��P{))@ۜBTJ��ܣ8�Һ��%y�G�/�k��
+�G
�����P�N�uǓ���
aMc����ۉ8�
+�����ѻ�[�z���D�A��+k�_�yd��(y�is�;�Q	��&�k&�-�@�˹>�[�  ʏ&w�P���)/�U/��?#rKF�̀ZGd�.h&Q$$�<����E/�yϥ��G�Į�W�3
+-n��H�ԟ��ѕ�7
+zGW�D�/�8F��fd���gW���8G�3|o�U��LR�����b�z��C��F6צ�;�Ƭ�n�-rV�ň��M���{��~B���>��� Q&Ɏ��g�P�
���)������>ۯ��b'㰬(� [�N���R�Coz�d��'t.gC�|������x-�$ +`i>��}
o�5��[���zq)h�/�O�W��(�
cK��E�5}j����kkz��t�%����;d�;�-�����A���q��E�
g��n^2u
T�'� 
+O�(An�gs�"�ڌ-:���{/N1���\�
ѧ�Md
+}���K��Mx�1_pV�}~e)]Ij~
���Q�;�Z�(?6u�U
C�������*����5t���1yLZH�`��f��!(J�!Y4�D�48S_r�g�t>�E�t韗pNnոl0�
5�]��Wp2����D#U�4���w�|S�u��_�s�l��:w��
�%.�V�	U�R
��
�6Ҕ��6�x߅���.�n�����~	;�G�
��Ask�e�G���3���:G
:�����1�y�	/)z��n����
��%JM}χ���L����1��B٣��W�����Z�-
g�
���,�׎���_waC��Zh�Ì6�
v-��#���t�W�����\��펮l�AY�A��=����[�I�jx����p� ���:d�J6��

��s4Ye�.�}��S
1j��[�9?�T��n���oZjQc
��4�&�P
�i-�1y�ZI�?����(7�!�aJ1����
+���#�������é��G�V��R� ���2�ش�nun(� 
��'��4i%�"j�7�VN��\DZ]vA��UmU�J��D�ơS��m7�0�q.��,����8U[���w�h��O��Iۂz�_�ȹvɾ�ܘG�
H,�ۆ��7S��]�ȼ���/��W�e#L�YvI]CA?��� �6p�e/�,j���?���n�~x�8)�`%*p�8�w���<��
+7�i����jH%�G��b@�V\��{�s��A{a%{�_������g���S�����9#Z�*�`�����Q������#�K*�-��Ե 'Mf HI��}�<�H`$�+{��>闣�˗V͒e<��S�%D� J���),��}F�sMq���;�1�3������wМ>J�g׳�s\��E�:8쒦.�(�J����aǼ�ktD%�����W��
�����!	�W����dݞ�=�WYq��\�;�_�x��;�C^����Q �Bn
`�	�H�c3��H1��;���!I�(�yV9�%���w�1�*:/`���Gv!r\����Y��nC�^C�'$m����0�n@����
�bM�^�
�=
,�C�V�Ү�v���^^Q��@�Ҡ٨�(�WD
��YF�˂�ߒ�
W#V�	�����D�y�#/��%����:r�ٖ���TR�#4��&v���|��m��j_wF�̾���&p�~R�G��[ܳ'��W�)���x�h|�� [...]
+@�w]����6��5�N/E���l�����eo+-:ࠝ~å�#BY0�=Z�I9�G��I3�+U���;���L�����6��A�=\��ˠ������~�s
��s$g������wZQ{QEQ���B�Q{l�M�
^X���������BL���W$��]��?�1Nz�5�Z�	��D�$�T�4Gk_\�d-�`�}8`����I��R��l"�'��8ό�4�mR��
���À�W�n���Ot�o��4g �r���<�Ep>wI�~� o�w��ǟc�X�
��
+Qt8;� �O�Ǚ�8�~�G$x�

�|;fɼ>�}���>]�v;�Y¿_0�ʨ�"�?>�DRI�J��K
��
�ލW�1�HqW� �Y@��=.��΂pp���.�\�9�
yǁ�f�
YN�p��!�t�9tD��Q$D \�����iS¬}GC�8^����ޞ�]Ƙ;�I,5NQP��NÎn�@r�[# z��)��(�?������W������s���R�#(^��,w�8�Sv��
��8��U
��p3�J4
ܗ���HY`��YT��{�����e7)5��Ēf]D�{(�|&c�Ɛ��90U���&�clE]���G�*?��t����UU���f�j���6·��m��fa(o��q��s
+��,�Jꬥ�����5�04���|
g�{jM�l�z�t	�t83F	��;��r�V'@0j�Cz�2�
�&�:$�m� m���4g�D(uF�D���6�L_VFd��is��a�G���D��5��F��/T;W~��i��u��D��I������
~��{����U/B'��44JkcTԖϼ��>�ȑ%�<�JΤ���`
�*1�ψ�
�A
E������|�b2xCw�
ou�?1M
�*V)
>h���ޡ
�
+�x��g��p�(���kHdG@�� ��((���,�]�0��S��B�޷��QU
��"���*c*�{@�1�
+��ŀ����Vv�z�
gb�~'?
g�NR�>���Zz�?D�����{W>���0�)��"^�'~^*Ne䋡#4.�3%o�kx�NͶ�[s̷��2��#]e����9����<�

c�?{ y[`�
+�Rhf����\�^ͭ��v6��狌 !�yo	��lk�BA�ۡ?����H�5EU�
+�Win�8V��+(ҫ��4Ҹ���?E`�z)�{�%��H�EͲ`�������8iWY6�AwVȱ��3.�^ë$��8G���*�ۃ�"+h�RZ1Pԕg���輸тZ#�k����pK�o��<a����}i�L�J�|�A$r"=����sǒ
����ZGu�s���8+]���.
�4K�ʦ�۳Pd�L����W�$�vB�P��(����b�(��)�Ac0Gj�mZ�ߣZ�9�@�B��;�{w�Ge�
�@������v�r6�q6X��h�c�K7		�b��u��Z����b�`�[J�#���S�I�T�_q\9_ �@ AM? �_�~L��L�I
�0���� �Cz��LlB�'o���C�
.��k/��� ��0Dq�T�]�Q�� q�}�M����Է��,�
���(d�9ԋB�V)W�����N��C9��!>
�]��Z����a�t
�:�*��K
�A�Y'�
g�Vr�'\��J��R
��
��%Be��p��5��5�
���wM��T����/<؁���=����?�����_�w�����?}����?��?�߿������o���������������w�˿���������������������������������������������S�ŗ{�����������s����~P���*=�}��"�ĵ��,FR��m��\����(%?�;wh\#���
n
���Ō��J򮋒�="�USHF��!&pO��@uỆ�/�WKP�a���U
�Y�w�н8T����#�c�Δ�
����1��c`���G��R
�T
-*�:��?z
�q�FB�������ҙ�1<표`�H�t��t�јR�l(���t�>+�{ϧV��<��;m�ƫh�{w
ִ��M�6��FC{�:��g� T��wu^��b�ݐ�H�g΀�Z4�N�J�T�Z�|�#�l�G�_C�,]�΅qy��
��":#�@�	
+�����(���R!Q'�����:���g��������{�ӕ?
y�>[!��b}D=L@("X�F�
��3]'�x�.��o`���'x�Z
�1���(�DO4�e��7�
+��#uO$�L�:���;Gm��j]���-f�S�a8'�8?��~��;G�i�9���5��f
��;b��y�8"�w
��a)�p����������_=����^�1 "BE�v`{bB(�I�����t�i-ϑ��^?���s�ES+��^��h��W�Ag��~E��ũIn�_g�x ў���U��܁ 2E�y�fJF��
�*��
�
+�9���͈$ۑq��0Ь��L�a%|�#nغ�O�B�'x��-�
E�w�ݡ�g{�
ҝ��`F�Y�����-
��LNʷ ϳf�"4���~S��Mzլ��/��4��Z���!�����"�.:�;�71���X�a��$���o�PJ�O�$= {�z�
]t���i��
  
�6�:wSn���!�>��
+z����&��1��Tʝ��d��ZD���R��zu��n���x�t
+>�s�=;-^Z1AN-��F@�&"B_O9�숽(�u&�%D�d޲�A�d;cC��a>˻������
�)!Ɗ�Nb at 0���pm�F��~:�n��C���f���g�W�I�r��h��J�����0��g^Fa�S�޷�����	�
���?N��d9��n��„\chO����c�Z
6Ϫ�O��Tm�P����2�AUu�
h��m�Ő]�Z�J�ͥ�$���Ǔ�&s-�B�&�
�
v}��^�]7{��G��@&X<�
u�'�h/n^N�
�d���)!��Q"���P)`�?N���%�O�uO��� �h
`k�ZB+
gI
�R��E��v7��N
+!���v��s��!:
>����t_��Ɨש�	|�Օ�5�u�.��=����Ό�H/�#^���nY����������{�
+*^T�3�-<V���n�çz�_��
��n�D{�
��C݇6�P��\�
:"DY�H&�*��Q����nHQ���-�KP�ǔ���:|Sd���3��Y/��#�wJ�?[�y�pG5N�R�x;�����W��5#-�Ș��
�S��4�%s�8� �V��)�dnVI
"��_�Q
+���5�{~��|�A��#n��o�|}�9�]�J�צ�$��"U�RG�W`��Hmy��=�f�A���)PZ���R���@�����~_�<�h0��+Rix�<����#,2Y�oZ��4���g�@�Ŝ� ;N�G{?�
�CH��Zmg�G7�g���gA��0�n譭%�T뒰꟧~�
3�9�+�qe�v�ϵ��W�2�{ժO�5���bnw��l�~=�f�
X
{�/���4z���R�r
@_�C�
s~  �
+4�BW^m�+��0��
}{
�@�Q�|F���8NP��#�,�P����
+�G�MC;8ZX�8��u�;����o��M1Ne�>�b�<.�,�L�<LKҵ�9P�� ��ފ����V4Dz+#	
^���tƢ
��&��4U�N��
6nD���Ŷ|s���=G�*�,��ko:�w8
Wo��2�,^FH){�b'o��vw�k�&�ǁ �`�"��:D<w�ԥ��=Ɩ�jL7.�q+��g=����L�.,u͔⧟�4JE@�W���Դ�	�@zs�Ϩ'
+� �W����+�b9�;�;m�����s����Z=��>s>?
�:��x� T��<���=p��	[�P�?D��c,G
�
(@������@<���x~�
+4�6N[d�W�؟
+6��Չ�
+��`?�< �X������\]�.%w�\zof�RO��
�[(	�����C3~'��C�1�
fV�9��'����J��?�����=�X��Гo5R�w�
���Hu3�'���
+
�o_Q�k���O��j�=d��V~2x=�p��u��j3���p�;�v�F�Cr�)>d�����t��s�[|�]�
�� A�]�z\�<��R�C0����
�th ԭ<Zi5=-���>�B��;HQ����l�?�
���d��p�G�x���o
��L�,B��F�⶟`�>w
+� ��h���F>�ޙ�[��C9
L�GS�
ѿ�,G9�œ�����N����Uj��$�}�`0~ǣ�����%S�����JT�oe�Z���$3���ڑ�q)>���i�
+�z��C��LDk��[S{ B�ERQ�<J�!�t�l��
$�ڭӭ�n��@p�ؔ�6xwE}����*6��#�ZK��ix�S�
۾�
��{Ӿ����Lw�+Ec���/�G;�"
+�[�2�����	�1�0��rɲ�P��e:|=�� ��Ӕ���
^�;��7��ٱfΏxN~����G�X_�T���߯�Of�t6|sI��aB[
SF�rFj�"�*���N��H0�d��H�x0f��"6,�ŗ	24![��P��"<ϸe >䠳���
e�dk)���2�0ad:
]c�	�oG���A=D[ޫ�
:�3R)O���/� >�,���Hh��="�O*����f��A�Ż�_��b[���vט�3�; �}��2J$-]A==�C�9��#*�"A���AF�C6� �/R\?��ox�
b�v�C
+;�T�P.*w�-�k�N��{�<ߣDS�B�Oո��V
��#�=�P'$�)Z��x���n
+=���p��	ht"glxN9��s�ӝA2>*�
9��nj��M�Z:\�z�a}!���1X⸍L0E�pjɆs
+@�k�jd��9�lZ\݉��ё��
5
+���=M����0!�4m���8��.�LM�
x;�YQ��i
������x�����E�l۪�Mh�v����&6�㏇~�d^-	z,��;#3�3�Q*0��]q�}��ƺtgiN*21��W"��N`����VS�å1Kh�/��d�qx��M���~���1be�8�F����(�p�B�'��m�g;�\4�{ӕ���Q<� 膜�龎� r����8<��m72
��1?�3u�)=
�����=�(K$$̛�^�ߔ6�3�#*=��`�Y=�?���-"���	
#���h�8��Q�جt����UN�/��xS�S�S���0�����+j�H�����8��'�:FƵ�
��3Ʉ��H
+�8
[��s�?�0
�g|ngp��s��
��G�5�H�����!-�)��yOv�N�E=�����fҲ��u��u'��PQ�3"�F�
J:Ck��`t��3��F�$)T�a.�=�n�
�
+����[Ԉ.���J*Lk�ޖ�ԌC
�P8�d�[�򱚬y�J�7Yۅ�g��ʟ8o�
gƯ
�����$�8�IS�!3�j�����W�њ��v�y�_��z���[i
M=��V�ӹ�A�eG|ɲ���
����M�c��0_]��#�e%�84�
�R��{1{�L�3}F�xNNL�`�HBI���:[ib`��~���^�
&���+GW��R��ײ��H�3PӉ2h�д*�����
9
3����y��^0���U�k�5O��X�Yk~c:�>+ M�@���;Exl�~
��;LB�2���U��i�
4��3/�E�>"~�?�P9��a��V�=���[?��{�w���b%��wM튱b���g��^�c��^�&�?2�د�X���
1�����u�p�'�
�sM����S��բ�$�;�U^

�
B�� ���<_��-����5�������b�m�y��C`M3��P�
�׈��W��#�)ȩ>�t��r�?�I�\���.�M�KE��xJ�^
endstream
endobj
326 0 obj
<</Length 65536>>stream
+�l�e�!f�#17�����Sr
��8G9���/�{D4)7�����Pq�nd���Y{:��eTȽm/��6�H�xz���x��;w�X�c�u�EL��'u�
�%���$�:�ӥ��H
���88`J

���>�1~׺�N'�o�
@��X����4p�+�i�.�g��m�}}�W*U�
xj�L�z�;�*

6��# �H�?���&���=��Sm�?I�3�h2�[
�a$f��q
lq
�@��G�>��+��{mE ��" |�qr��;Ҳ��L�6�^� ���*��4X%%M�H�L�k;
���wh�	�"`~F�.�d/T�Tx���T6�ʔ�9�u�%]�$a��gW;�T�\Z����j�] \�9�
�v�f2an��X���Ȇ@�U7)~�yf���)! ?	cm��H���]U2��sU3z�+z%bf�:��(l'WL�r
Q��g�Ea'
+���
�)#�\���]#Y����!A�a�{�S�1a��G��4܁�D�c G5�Eh�`�}O�-fF���a�
+y�E���� #���a�3a����

�5�=�%);)ts�5�ė����U(9��ؓ�d��w�c�SG�(��љ}��''�XƉ�mzƒ���©ǥT��.����WK���KYH�]U�J�w, �z(Q�ԇ�N���~>"8v��S��sz��G�B.#�?HC��*���ʶ��v���UĖ���/y��

�hܧ���?��:���5=!���Y�N��s�E��{v�����"X�y
o=P

���wj'F���S �=��/_�3
+�h:�],J|�I�#�dۣ"4}�w|�nfm��ׯ�~�Ļ�n�4�ĻÇ�q������j�)��X�����i�bv�|w���z#> �
T$�;��wNO����
����r7��aG_�[���]�3�^�X�ze�e�g�O
�b�j����#rk��m�Y3���w�U�����
�y����-��Єu
sַ]�m�&�󨉡���sm��>�3�����/\��DC�džj�qF������-�(�-�aJ
+\���,z
 �%ʋ��Y]p�<�����m/=۲$��’gf
+ɬ_ at Q^O ��2'%��z�@c�$E��3�
�k�2�(r
�B|
^@?�'�@�O�*Ԙ����e&���kW\��L��=��_�$�t}}<r DLgp��%?�r�L�Bd��E͕�'Ǻ_xSX��w���m�D[�
����
5g
��F>��!�Øl�ڜ��>�0KV���v��:���f�;�W�")�^��c�#�\ɒ
+��*���8�0��	�@7
�s�%�{*��
����-��1�
* ��3��߼Ⱦ#Η;?
�o_+	|�v|폣��"K��oF��:�[����˔ D�׵
�֯�7Q����VO�DE����DH��@���3��<0�n#LY5D}o��ݪݎ�bT��u�=�� �
�2%0�>��S�X>�t:W���[�1
+
͵ə�K�62n5Gс%�:gj��z���v"�lR~8�*PsJS�#H�\@���\��J���ii6��l�q
`?��8�gDj���dq����~�
+0�LZD ��E�2�$��2�8gK'A��|�d
������F�V�'p�Q(o��q�����ɒ�����pR�.y+��Q��J̍Q(--���#C'm���)��z��������*</�q
E��S����1	������5�֋��
u���N�@+�� 
����DvI��k��6
`�F
�������(�ko�y?t�x���asm0�n��ĥv�(% ���a��E�t�G3��_s�� ��t��n�ņ�11 Y�d0�
@k���s
[
M������v�U�R��3���y�D$f�<�Y��a���LJ<_+���"H����v���Mlq�1� 9�9�J^؟\���_3p����
+��'�Jˉ'm��u.s���/H�
��b>�Q[�'�ĝK�����}�X
3֏��r�A�GY틭��)�x��h/H�{�<���8�J`%wL4/�OeY6lMp�o�~Ԟ%�i�}p
+���C��o��
�
��{�x퇈�r�ߣ{��@+7��0�s
p�;`�/�x�5I���D�b}	�ʧ��;�
�
�~��r6RQ� 7a�
+�9\1��
¥�j5&Aw� ��FQA���t�]C��቞�
+7t��>�R'{˒���j�
���#���(F���"!
�	鎅%@�?��"J�k}�{�4+]����X�Vǜ�G�+�h������A8�W��#hDN�n=�.`�|�L��ه��
�~]�3�;z�욧�6kL=�|j�Ay�q�8{TM"
��F}~�c�ߋ���IDo��O7��AZ�F� �p��.Ds�SE�"*�d�!o�H/n��R�qCM�̉�m����c����eX^LK�%�x���F'��
�53��K��=c]�}+Fq��ȣB�d+oD��LU:��g;':��G?B�I���T��w������e���([5<��jZ��+���U�8"N���Q��P�B��()6
+S&;oCw�u�-��_�CWuBi#�)��I�V�hwoe�
���/�S��{��/㩭�nZ�^Pr�����;
��ҲׇN�J
�Ɗ��=-J`A�HcW��.��T  յP<�XO[�_�]Y�ҙ���?W
�T��{�L��T�
�7������Ì�oM�R��]�}w�6*b)�h��2�ro��^����9�0[/F:��)M�.n ��)+��\`�V m��Lް/�:WX��MZo��h\��N3Z�ә��@����������
����<A� �6��g
+Y�p��儤2?k:�caJ����x�*.?2������:%��N�o���a���oZ�d���z��5�x�5;5F�x_<x;����ᵿ
‡ G�a�
�����;1�Q���I�!*`�gA������ъC�ǡ�$�A����*���a�6�$
��������|�
��!��"��9���;쐘s�_'z"48���d?�YPf;D
v
����&�?n���a�]���^L62z����5(�Ю@����4�I i<���;3�/��R>��Lj�u
ƫ�,�xuo(�S����+��<��vg�d;��M�L�+�P�����Sw��E�|l
>���@�6b���t���uE`�0�i(�
�����y@W1v���������Җ �l�8��t0�a�E��ÁOP٢r"o&o�?z�
��!�}_�=ݸ��H�����8`���p�O��]9��u���eQ�ak&��P��~�q|Y�
'��[Cz#l���q�����g��?@��N02�$��C+��ax�K�C3�(��X�:�j�
��}?�_LJ�u!�b�ÿ�B\�\=��� �Z�3�!���@@X�U�y����
�-�W���}yј���=�a�wu��Vf�Vj�d�{ǟ�Q�ߩH��,���~T\BRs��2#�@R���}�"���qWf8�޻`�������HE����	Q
=�Z8���&�~1��m��1 
~>�����٢��=U�H�i(j���G�
䣀��:P9����)�H0��5m����L<���;�3�/��.
+ވ5�bdm�sS
*ȹ��RD�gT4��E	��q������RE#W
+����q��1zf���:U��B8���;G��-r~U�hr�|����o*�������ſ���T��'�P��"�j�#�x��La�tG�s��'g�����-Ū ;�)����D.��l�Ʀ|���m�`������Z
�)�c���
w�
z��1��UKh
���������_�G��
S�7Kp�
JT�:�OuI%�.�o�G\�X��
�D �9H�
����$
���� ��
���Li
5nm�
+�s�"7�q��P��KO���r^=lo�FH>���Bm�	����b�&��\8e��$��WU0
+���"zN~��_����f��=P똈FM$��T���7���Ɋ��i��c
��W������>����.�Q���
t�@�%6F��r Zd���
"�!Z���ND�6�m��(���˘9�y�~O-~Og�/1�(Rf
6������~1�a�Bt�*ڮc�aӾ�iO
+��%��Q�/�T�qn��1p�t6�^�]���
Wa�l3k�9�S ��w&d����Bu�k^�syvj�S�i��l�k���
�r
�2ھ�d� �K��
j�:b�y�D�
.���
��H
�.�!.o��<W�\�����5�������u
U����Щx�/��b���X� ��ЮowE8��8��$?)}9ݨ՝��k��<j���'J%������;�8����i�̎G���45��i��"O�(��:��[
+a�4
+a� D@\���닖X�䬣~I ����Q�ǫ��2@u/����p܅��,�P=f�|#f�;㸃C?l�����5#p<�=9j����u�ɴc_�s��>����Ɉ��4�^��o
W����1�c
IJ�6����1
Vq|0G
+4��u'��
�e�c�|��/�|�K
`�E��@�ՠ׎f�z��XY�	t*���ʰy�/4A�j�V��t9�cVRG���3��;
��5I�
�H.���9� ]��
2�_4{̦/-uc
Ԛ��Ǝ7u��Z�������&�
��
�&��w�Z�yy���#�R�V����^���#��~�K�Et
+͓!�^�Z�(��䂌�]h����8kFԊ�A��W�J��.�ϧ��T]x>��N�D�%mբ�y����Z� �K?�0
>�1��J��^��ŗ�t3~Q�/.�
�ؤ
��+��9
�{� � z1&�����Y� V`�;$״���'&�ɟ�`�(�\�#��
EpH�O�Y,
+��*[�Hf���WtC�G����(1��ph�\7�_碏����K��&����($ҊNM�n�\
��9o��@��|eB��=�ܯ�Q~�
��g����l��
%~A>(Ms���Ub��xW����EG\�3��� 
�`�3�A��c#!:�JZ�\��k�eBu�\YO3�q�Ta�%��N`ۂ�8QdyT�
c#���Z)J�0�����|
����h���W�"�<AwD`Q�~�2	�d .d�:�
]��u
���UQSu�������"��u

)��,�
�D���Dz}�����"&����]v:ov�u�DN�i�
�tB�9x_v=O����r
��h������4mb�
3I-�Q6���d��;
&!��C�������
�+�}G �8-<q\UcW�CV�SL�}	T
�
?#�
i���Y�����J���ƣ�
���@�{d?G�Ȳ�-�2��Jx��>��)�o���Tk
��;;oL���wf�R�xtڟTD�qU+l�(��r0˿C/W�Tl�Q�:�8�-���-!v.���"J�ë
vVce�	D��HײE�2�I�Կ
m���&���ޑ���=�(�
g��w"ɪI��p�
x;/$g��G�E�Y�Mc(�D�
e�
	�d���
+��u��4���M�d�{�v�=�Man��@��
+��<M}�Li}</�~^l1�	Kҏ ��c鲓#�|��+΄�GE�����Ҕ*.�y�b�mTi�e��rՉ�׬qv�D�U/2�5m�
n
hB}�f��#:m��(=qásŌ��O[>��I�)�0���	
t�ܒW�hߗ��$�V:yں���t!�cRҟ��&:7�G�* )u��j|KV����f�A���Xe��7�!�q
��+�
,�,{1�瞨�\����?�6�
�ϱK�|����
��|�?�I3v�\1e>��B�/A�m��!�SR�׾E��)�'`�:W�w�4
:9̈� k�

 ^I�Q{��篺��c_2����t+�!ŝ�H��g.�Ձ���÷�k)�~Y����۠q.֣u����t
�t����笭E�*�ڡ�j
�^5�V�a&�×;�Tr�N�Z�����5�Qnb?�#κ.(g)�K�Q.~HQ;��%jL���G	�ٲ
�����h��FD��fٙ��L��g���L����6��]�&�}686]�^?�v��z놺�U�.����~��;	�Σhv�ȋ>V($0v?�gǀ��d��E���!M
�}�W{��L�⪱oM\p��d��:Ծ�~�1��	����N"�#�M;�����_Z�GMT��f�@L��&
7I�ȑl�'�����?��\��d֕���z�g�^�Y�)�z�
�o0�B��>W�n���q3C�V��Y9�
a8"r�S&�_'rM&�L�g�A��N��������y��4�ծ��]�H���F
?\�Ư�u[�2�K�j���;!�XA����mQT���:E6)Lڼ�^�k�C���7�4
|2�s!>UĦ����q���X��.aEA�?CU�:�^fe#
�UYR��
�߿�1'�j�S�	��Re�AA����MU�g���t��q$�U�J���PM<p2&LJ}VJ�������ݹ�O�zlЋ�yBQ��w���f���R"�'t^�j|07�
d�`���_��U����]���m��������N��ES/���n��j����}�c��ͩ�����5-���w�<o�w�בn��2ڟ@��4��Uz�
���p�����r��i��C0�d���hI�r��	���?دի%��l1����Ø�:�[�W="7���L���/�cߎZ�����6b�4�Q�ϊ��B���SD
ϯ3�{��`nIԭ���'T�7���q����ܧc��� 2f���O�˲#��F=�������GU���Q���������G��i��
f5�|8٬��*O����v8�-~k���
:(*1��aO՚�6"
+&+��ۍ
+��}��~{�ތ
+����)�?��`2A�Gv�;�V �"� ���:�y�vĮ�Ζ�
+�K�����w��⟰�@��Y��I�4�}O�
`��|��]f�^F�,��h�>�IWa|ƮO�75�mNt�w
+o	4pcdG��*��
��+�ɿ
zE��WJ<�7��@�W�.���/qC���.7fd���5�i�-`��U
a�/$���G�;H�=�4���
J�S�
����Ss���˳w]^�A#����,�
�t�}�+n�E�:�om�e
�
cCF��l�}�O
sW���^Y<�6EZ�%� ��ѽك-1�f(�?�$��rh �Ş28*8���-dv���o�\���X-���w��?����P�-�b�����q��
m5�+WYA�߾o��q��7���w���'H�
��`�� چ|1��=Ff�[��
+�����"�@����u�^�D�
�t�ɉ�
�a �6�f�
+�Y��3������
/J��ciY��+\;����e�32ec�w�~
Y�^�* �"�xb�-��	&蘿&À˜%jD��
\�W�
+��t�\�R��������g
+�s�>�v���A�����FٻV1�/�2��;�K�26��k�Ρ(F���Aq���)��}Ča�ď�|g8
����z�8��|o

e��bB��e�
�HX�E p�{�ԟ}����DG~�n��z
�g�[�s���1&/��$��4FC�S�����5����%�0B��dG��;�U8���-4���
+A_\g����ELp��|�&	��݋�}ǻ#��3
ҳt �E�� !��<u"$X�������<�+�H��;�<��>��||�ZI�r3�7��z����mvi�����#/��Lv
ue�z#d=���8��"&fpC0a�j6��Co�z® �.2S*�i�y�VH?T��2~��8u2:��" ��:5
�?�
\�b�Ic�v���w�k
;�l�,)Xyz(ҁ�T��!N9� P�d��z3�m�>n�q�i�
����;���%q��W���$F�J�U	�q(W�kOg���f�.
+���|��ґ:�v�Z�wD��"k�Mj���"[=6�l��g�ի
1
�۞�*T2bTG�q]�� t�����B��??=iz�z�YuS�r⥾ā�IK@}#s���u���.%�a��0K�ǟ�F�H�^��w%gU�'ov����9

�|�̝>
�G��I6��ғ�MDO�uV�n�Af}>33^
I6�"M0�z�\�.����V�[O6<�g�]���"/5@"u��<�"�%B
ل�hn��� �ޭ/��Y��W��1ѝ1� ��I� �p�8��L�A-��p 7���I���"n�hXST�uH�UsEO�O��@�Rq�^�v/��*�Oa���0�B�B��{c|�5D�`
+����{w����N�J%�3TF��^��ƣ릛 �CnԿ�
+(~Lo��m���B���," {8��[��!�ފi͙��
�\l�x�:M �_z�
��^Ӗ*5\LhT]�ʌ�'K���諺�� E�䋴�TT���F���~�r��9hG�dW��v�2_�R
���f
�,��-Z0��)5���יD}�3Œ�Iwq�r�fb��{u@��B����<6 E�t�Y�S=o�i�x�~�4� ��\�-A
GJ�Q��8����.e2�i����y~Y�7��Z/��4%LJ��
+�B�/a�'y0P��V�XF�m?��{S�{޿��
�=�/Y
��֝��`kĂ+���-e�y���
�Z
؅eR�ɍ�1�[���B�-��0)"o��<o
p=)/@}��4��^�h$�Ƿy��}��iKلtD���aӣ�
�'��
4�JDH�;]{��Ɇ�28�GTD���A|k���]!C
؈;��M���͗��L
ްN�n��"Fd������ݲH��KmA�)ӂ+���X_@ǝg\(���
��
Y at jPY(V�&Z�Z[����
�6��3�bcU��U	�����6懼|����&���lG(D���ϟj�5�(4��a&j߽��W�ِc$w�сiK_�^���_�;��+f�
4|�4��ޫxG�ž
+���A[�g�ߠd
+�eJ���{~G�
���֝�] 
�H
+�5��G'������x��
��՞7��/�"�}�ŋrdS��F���V
��?*
��z�
��
�g�\�D���>�2�����mǢ�����t���d�
+a%��+*C��`��J
!�������e���=' '�9Az���㈈F/�?݊N<0��`L@���wU�J5<��w��'B[��Ӊ X�)
+����g�o�����"ɸxU������A��S��s�4�o�s��d����a�w��M��R���P=��;^�6�[On��f
Q�2Qn+N6j��Y��%��
wȸQ�r�{
��l�����^�m�s\�f�{!1�1A�I(��o9N�,
V��_���k����?i?�/<����?�����o T�k�����ث��Y��ž
�B�ߢ��߱)#�XŇ\
�c�)~ ҾE�>W-�{
Ģ.��I
��|dI0R��*
�}Q��#���3�+|�`�n+y0���:��NJ�<NB͔���J���;ӌ��΁c
9Ff�g|����c������^�
�V�<���
g�8i�G`�n3��mZ�OSѕ9cCzFY�ƭ
+�L�@�ִ�.շk�`p ������m����~R,
+��
��&
q�Ia$����{K!1Ґr%�$�H�9-_�G����Vj����by�Pj!�	�<$��w�<;��,>
�_�
,
^��O� �X$\t�

��~&++d�D�C�:����]_�G.�(˂c���O�\s��}2��}�v��*�#W	m,|�M��
�]���Ϻ�
+f��'
�xP�
��k�Uڛ����%l��3�l�%)g�
�������z���RI����g k $x�d�#���� ���
䌆�_��ӹ=S���9��dg_��=A�\�u��+�n@�! 
�p�e�6!-�_:
z�+��Z|~��  qD
tz
+r�[u�'
��q#"��M\FP���w&"��	w������k.,K�.�����
�r(qJL�ߌ��i���q��g�D�n�җ}�V��q���r>M��}���r��
]����Ҁg1؅�#9�g`�
��q��3�8O�\Ls"zE�e�:}|6 \��_a�x��0
�@��ψՏ�૾7����st�JF>���e8�
�E]���?�+��= �3�g�ν�7^�n�� �*�;[����B����1K㪴!.:�F\̽�|�R~)|��|��}�i��M��y��i�vy/�]�9�$"
+��
+%�z�k_"��At���{=��q7�B�v_}@����+���˼��aSא(��3��ɍ������C�{��u�
�e_R�g:�j�8R('@��P!����|�U4e������#�َ:
�Ca�r
O	9dNJ�#��*&���?�p��_F��`���B��m VSkh&4+
�O�"#%��,��Q�u�y��KZ.9��gP@�^S@�U�B%�4o�KE�V1Kr�5���	�Gu�V�M�ᚷ��#���(�����&B��	��ű�#��
%Wۨ#��
+j�,��5��x$8-���z�Ĭ��5=�`�����
s䩯sPE�y�
m��'h.�`�h�����	��f:�[h���4�wwd3
��a�rG�\+��}����l��oiWj�]1B-k$fP_�	kn�G��3C�85E�������9;_�[�X��.�R�Q<Ԡ�vu{!�-�*�Ȋ��J#�f ��g����c!!�
h�Bȭptga
���U�/�н&�;23�K�n�t�:�
+���������_�%�Y��-�;#��D���&�!����߱h�����j�]��
>�	�p�f:�9�����4��O�1]
X�O��u�]��Ί1�Yz���O@�:��N�r�N��& �4�t�<��
s�@�F/��s����
�ji1�5m����à
�*��3d�`�N���*���l�����0�����&����
Y��n�V�)s�8J����ùe�E
^zڻD��Ѿ��g�
+�.�23�W����N���8C�
�q4â�	��S�
�A�����Y��@!d
+�
�8�k�:�l�H�v��M:'�l�x<6���a�S}�v\
�jʁʢ)�
+�tm��Cܕi�د~�\D��S0.�D�#�xzt�Đa�x�@���e�<Mq�l�� W9?#�\�g��9�e�<NA0��w�
�b>���?�z�����qP��#
+�3����K����0W��a\�0/S"�wm�Qt�ˁ
e�{�]C�ד���_��������T�d�:#rU(�+�
+�q!��N}��=���L�:�LO������4�@p�Ӂć7��G���VO�Eu�Ʌ
�P�2���t�l��=|>��?"�qz�����(�s�:}�\�i\˳�]�����ݏ��>�=rY]7��u���`
l]���
:��� �-}d�_"�Q��A4iB������
y�h���i���*�k~���a��輀#��t�[�D�P���i@%=3��hYˠoUD���
9�FqY�߀�����3�*���ܾ�6�#5u�F-��VrW� �V:��D��(m��:#SeTp��eGCG�vYx	eu����۝?�W^�[p��9Ly6�����VH���u-E�U�_�}���E
��
~�do\j&�O<f���U�]K���M�][�[����x�5���b�P";������!<��V��wP��$C��
+G������D^�l����m�`ڦ���hA��.��
�ZWAX
;C�Yq�U�ut�Gi�F�bW��
?��<�z8�ݝ&vy
+ە�W�`�œI�Y�4D���R
ѐ믪�&ȧ���F&����Zu�u�S7��#���Wx5���s�
�`ɿ�V��(+�4ܯ$ꖡwq[�ܥ�>Ц�S�"P��-��k��rA���f

+����l���Pj�pf�掄��H-��4':׫����n�%De�R�����ߩ,#<�A�l�
+d�׊�|gH�it��	V'Qg}�,[����Pc��6Z;k����W�L#�=C��������v:��ms|?���L�y�r���xe?аJ:2�e��*j�E#��x
�\�*E�eP�����<��Az��t�{����ppؼ��DN
+al
���o��<K~�⨥]�Yv9��e��������8)��䠥�<=~�(${�r؄Aa~���
+~
�Jf*��1KƱ�E�G���*�y��޵�ۇ"�e3У�cR��8Tb�\N�x:vM�
�:�OM�=o�Qo�F՛�}�<Ŭ*�%*t
�g^���5p��T`<��f�P�2����A���\u#�����M�B�Lf�i����}D�O��>g_��Sl	9�Q+�+�F$^��ǂc���Ծ"�[�,��D�'�>'�9�8���
�$S���a�Ը��a���
����ͨX����P
yG�re%����L\}�����g
+��B���@_K���Rќ��z�*��	�>��K
� ��B���""'Xq
ۇ_��D�����?!� ����f$��B�?#� rɼ�^�Q �z%zĤ4+���V�e?���ϝ��3��t>#<\(�`"թ�8��eI�v��2�o~����v�P!��3}�:
��[���,�t��nVK�
)��#��(]��-�}Cc䆪���p��D�����
C�2��������l��Oh�(޻�DSl�B�~����)m���}3	����D퇈\�ֹz�}
���H{�Y��{���e�TS��w�������b��˅�T��m o��x�.����#}�?q���nj����
q�( _��
j��8"���L)C.����Ѹ9S��.��WiqD��|��)�0��K��^1 ���F�p���CС��s
�2⬈��JT�i�N[��hC�K�ԥD��_m/����GD
��~�5Rp�g�&��@�J��XTz�%h��K
�L�A.Wwv�%�9����o��ȨdD
||����P�(

�"^A�K '�W3�(P
d2�b���ҫ�3��\U�d_��۫��M�+–�N
ڛgHˤ�YF;c0y9������B�-���.6�T����9!DGk���G���3�����'X��Ov<�b��	��/ב�ZIq����"_&R���3Ewu�2��aL/�-��O�
�_��k��СЂd�ڞŗd�?�`ԟx�S�|����]������/-F�L9K��r�U�3��=�{J\R&���R�ga��G�va����x?c�h�TÌ��0g+drK�������D?t!�?֓����cJ�R�1挒N���w.���x����:�5�l�"��g}D�cu�\�?��_i� ��:o탚/^�]?`G�S
�)
]�5^_%�zE��
�yGu�
��k�{�S�"�
+9�o�u�r�N}�v��Cw����9�q����yhsK[���wf��
�%BWa�6�/�&��
����|^��慸x��`*���H	68q��CkD������~��
+~3�|�"��&\��=����ͪk���S����{���Q�o�P��+�ஃ.��0V�p65;j�
+�
A�S�	��2�a �n�/�
ו�@L���'�SZ������Z�+�`�(cW�(���ɽ��t
����%䩅*����x:��vL�lC`&^�ΫG룮�p�9%��Sb�p�аh�J�����秈�E�
#���F5Gl
�R���襶�Er�3��@Wp���g������.�� 
�?�R^�4|rw��jH��d���=S1ҤW�
1�nE1aS"+��@e
�����k��[&��,�Q��5�-�;P�6e�`W ���^�m9��H�xu�����h��@3�;�1n�}�9zI{#}�C�.e|
�����acc�|�(�1yA딯�oއ��r�f<�Q� 1^�
�}j��E��Q
+��	3�\��;�,�
�:/�$�#�W�a�_|o�aǥi7_ɎP}�=��gT-gZ�U+ޜ�&7g��U�
-+��f};\��\g����U���H�ٗ�R_��%p/�C+M�?�m�뀔�Y�m�4� "dt�OK7�x��Ʒǁ�j���D�n��z=4��T���M}����G���I��z}�
�D��8���
�	Q7E�G����q_����y���4�7p��N���J�g_۴�*뒰�?xm�u<���+u���ZoFv���'���}p�+թ��=B+D������a��*����Z�4�J�J[���e�?)N��=r;�iS(`���4��
9�m֟~�֓��o<|�p�&��F
��®Bn�ZuOĩ��84�lv�s�����2'k�����̪��ŪR?h�u
����S\�o�����\��$�?�y���\S�e,S���c��}�����1ߣDݳ`,�G����Ө9fs�R��["�^�^L
.B^��x���
�O"�U5�� �Z��N=3��,)*R���>�e�D"�*
K?z�AU���4����y�[����\Ne'Q+b��Q�tKA�(��d��g�/�F�^�������x���/z�{-Ɩ�����(/��-��{�n
���c�Q�E�`HequG������:�]��Nz�b��y4��#`#
4� |����
�\*ãD�l���p�����:Uc�q]9��V-�>!�q
]�F�PZ���k�*l��`�Mt����Ӣ.� ��ψ�"W�6E��� �C�Q����9�����$�~��s�� |���f�H���{��/
:E�U�(
+�����{��"������80Y���9ma�	*D>r��9tn�՞�W{߳:�P+�啌_H517jhy�y����g�q�R��#Ft��I���42�i5+#JN��w����B�!}oo
G�w����
\��Ǵ��z�=u&�i{�W7c�s�<��fx~~���^�7���.1�&���_���:]j���D
4��}$7��wF�*5G<C�?
�(XJ��\��^ ������q%u��XE'Ŝ�Ÿ����
+�Ty���C
+�H,4�]�jL7kP�xI�,�:��x��|LX��#�*�0�zj�{ŋ
+$L��x	Z���0E&��aݛC�_�׭�p�UZH���0��[��?��g��~o�G�]e�EǬҙ�7�V����^�z��	�
uj��v!0ߒ��Ha �����kwmK.�� =W}�B�ؘx���Ѵ��*�`�b�/��\�G!�>[�|� �Y�t������)� ��P_?<�xbϭA[�L��Z��m��;W�����"�p�eM<�G h+EGU
�‘�e�,G ����X�pԐ������`��3"�k^v��~:N/�!M
}
z R$�
�(��Bo<�us!��2#}��^Q�6�b����}���汃QߝN8{=7�4y
������\8�������zFu#d���κ�ߟԤX��*R���X�b�Ӯ_UQ8��/!C�
V�T^X��
�œ��uV��U೯Ͻ5�����T�0(1��l��;�Dԉ ��P��=��~�ߟeU0cU�^��Ҿ�?��s�`˘����9�F�]�������@������ʲ
��W����

�f
�� ��7�="JX� �|������n� @��WEWUWgeFF�?^�ì�@���2.^ s�
+i�������%MUtMs��
C4k$����Q�@.��	�B��80u��;
RP-wiG{#0]�꾲 ���{~���� rt����y(u˗&!Vx��[�q �A{؏��8�=���<��&�k��� ��Sfq�Y��A���a��a
S�ВI����S�
9���G��-��
1?ʵ��V�i��_�'����̓%���/)������c|�տ�����_,������������_�����������������������������������������E�י������{0�
�?+n����R¿I�*VL��c
�_�~P]4��k��y��AF�LDX����|r8B�¨]�/���bHgbQÖ�A�Y(k:�
V�Q��ǘ������8О8��}9\&?�N#�
.`�n�I��Rm�se5�< j7Xʇ�匳�2p���¸���5)��T��BTC���rO���=3�
��h$���I�(,�;������l��N
�1;rᣖ
�D+He�U��X�/��J9�����(bD� J;�������,o�
5�N|j���L�I"�޴09��K@��rq0��q��A��B="�3&���n�jK�\��u��d
"/��_��%��N|ث�	��lC��I�}U���>k��Ϗ%� >��;�
lQ�eǖ\��y�
F�����t���@`����Xo귍��5�[jT�m�
����j�ݯ�f�
�jw��OգLꛥ
�'tT��6vP���O�Ȧ
`}���ZOU���w�
���x�q�$�X�C,Bc�=��� Jw�.��{��<��ܲ�9F��LMH? tc��W���_�W��T����(L��XVlU�R+O5}
)��+�;]�x)��~:z��
h���ʲsl��I�������}Ef���ά×^��gΠб
�~&&�q�M{&���-�
c�}���� C��ԇ��X����"`!,;�	�B�(h��#o(��~Pc�� 6�)�=��H4���u(C����	\+�oB��)n/A��悰
c-€>��
�
��!���i�R7�cIX]�>/�73	f�
.?���~c�B�N�1:q9�B!=��Rh���;	�x�98ī�3�r��;�J at I4�
w
+́.!ooo����^P�Cx{
ab�؛�z{F<�\�
U��(
��ZGJ%C�\	�����)߿�#���*r�ޤ9A��`cDP�&��'"�6P��:�q%x�<�
�<y=��f�2�N��P�87%�����������K��Ff��U�8o���c����V
�5���ڠ
�
�=�S�ڝ�-C=�#_��g��x��\f�a�ס�O����������p�bUg�QTq|]�
1���d_x"�mCDA���J
���Vh�@;� _�:�m0#΅,a�x�z���8݄��~”Ղ�ھ�d���O�?�7�*�ݱ����Ԗ�4 at P��������B��~�q�
���[��_����gY
��̅ �0x����Y|����
VWsd��D�^�f�<��������
f�ݫ�r���JtK��:͟�ܱm��C#�8�#��f��آp��ŝ�d�G@wZz��*Rݓoz��+���� �-�
�ngF
����i���Y�


�4�ZB|ȍ;wQb�߿�@<����i���~�
p�Fx�v�~Mهd��~����
�歱��]�^�)$���XW*5$|q:0�=�q�S���V��3��xj���p._O���q4���8@a���9�=X*�:�)

k���S���6�R���b�s���ڪ�Y��
 @�q ���^�
+��
��(:>��@V+3$-���,ꘇ����m�����|(D��J�+����Xm�~��3��	
%��*
ꫡH~e�h˳UŵdE��
+�,�[�CP�|�v|�x�s�yڄ����u@�*�5&O�:��Li���ZxsRĉ�}j:nM]�?
�U
?���v���ƻHh�����;����B�=(���P��/�;2��H at n��~=d�9��*F:
 �1�V�mD���{0���P�|���wy��.

~���e�b
Ur�;DI}�0��H�^��$��QGW�Rf�UUOzL��1�o�Z畊��;,F��m�;�=U��@�O ��K'�
Ւ¾8�
�:O��;⋂�bU�%�
+��F���`[��T���l=�/��4�1Ӥ6i�E��F���
�1f
��gM���y��
�!�a ��\�
i�_\ �X�
�/�
+�M_���o�r���#�XC-w��|���j}3aM�XH�n�Jl�z��I�S�~(�h��|%����������&c�4���G,�W�Z~	�f�(2�LF�3�� /���*hШ-n\g�����[�2"�%B~�����Β��m^3I��m�՟�
+�I���"�s\	+
� F7(���o9
ews
d�w���J�I,y��
��t��`?���b�t
��z�1yA��j�1��.ڽ�
+��j��^GO���%�F���~�у�N�3�kR���K��]�����7�8� +X/Ӄ����tf��Q��:JEu9��ĺE�柳��i�4��[�e��?Ξ�{���K9)�
�R)��
��դ���D���5N�]0R�i��j�����z����1�bqqq:G�`3A���b~���6_?į���d39��`��3HU�UE5=+��*�����4��h0�Zv��~�I���"L*4��
����ܚ�����ñU�0�K*��-8[\4�ܼ4.��A\l���&����d�{D�
��T�q9��(~��9U�
v���ئ�2?D|�y����(%O�'u*E��R�E�!��)�R]b
Y:�&6Zt���Fh������~���'P1
��Z���bi���[ -}��0���{�x	�'��ȶ�0�g
�|��W
+#i*$EHa1��{�
m�m�
mp�>�f)
���x��=ʜ����dN�nD�7�h�$DT!�����F$%�3���=�E�Av�KÔADKG���>("P��B{�b��F��h�vOS��\lB�7z��v*Q�B�-�
{�iT
���RUM��%&��b�S)�x{�����=M����ƨ�����v<
0�7۶� ��U@��R�+B[��Ha��b���-�(c��bڍ���_��G���|?
�j�
f��KX�΁�!l%�f��qs
�#>��3$� q~��(�/�=�������N�����x�3e�����������|�tWpb�0���M��gv>EFU���=*
������q�
{�颢 zdK�Dd���="�SFנ2����yHF��\
�����ȄG��+�aH7���p�>��p�
�0�p]
��S��L��B��yoW-~��霃� ����1��_T�cL�K�f������!=nѪ!��·���3H#A���(�Ws�����$s��
+
�
��"_� 2�㦆2XS��"�h<5�H�>�㝡����ѩ�
��_GD�P#y�
����o
�
HH����Y�q�:�2�0�t%0����t�_:0��g�
�������oj:��eD(����r+!��d�U
�����Du��yjL�Ԟ��Yx����Ȃ`lY�G�i���Ka��
�a��~���*?8.�q\1	3-�yp�Jq�,l}>D 	�ΰ�;��J�Q9
亸�؄�B�i����,
H
ͭ���k��
|2�`��Z�G5��rC�-�V�s��ϳ���G�pOe;!�,�Q��+�ɏC�b	�SZ:H���h^�ը
��
x�{����I�G���s��R˶U�v����N�a���"��'.ۧ�O��[�2�(	\�2<�@�>7�s����%���X�7۱��V����-�
��(s�m�����?2^X��i�}Bw���L4$$In�X����c�l:�㋀�
(��h���= �E�,�F��/+��:`+S+��
�P����9Q-��t57@��@F���g 5�S'�o�w�ME(��`+_���Y {
h� ��l
+xOWC��-z�>>�����VQ�� 
8�$R�R(����
!� ��ߝ�B��"R��W���{�ǻ��s�W�Kv:{�����px,�
���^B[�����6/�
�X�2�b�J�߇�=�pq`(\�
O}ו$
�����`����S�9D����'��J�e�t�\غ: 
Z
x$���.���` ӷ�s$�=�V}=�/`���1
��E����UA�	
	7ʐ	����ˏ+��R��upRx��0!|�%�Wlψj:K4Z2�h��~�NoE�(�ҨC��������&v	0�eB�  JNL��P{	��ʈЅH��fܔ��=�eo���
+�p�b[�v����CI�S���²���E�/N�
6��gG ���R�is/������5���E �'�AG�G)���=I*��{ހ�3�
����+<�s��|��2��Q�)��SБ� �Ĥ��������
����,.���h�Ǫ vթ�
+��٢��^u2�w�p|=�B�И:[�l����!�Ǡ�Hy<q��Z�/dY�	ؿ�Hه◦�r߅�UQ��'0���|��"9��#O��t�V ��_
 }�8����)
+��'�#*�V9~Q�9�N����ڀ�ņ� }3��*�p��#�_�߅� TS��y��T�&y��$���q�ߕ�~���QX�����8Y�n�}D����ƙ}0�Ԡ������m!b�t����<�3����BX�I�����0N�D��(Zp˫؂}�%�cZ<�l��Q�&F�q�Ь��9kf����o��?��
(�^42؉��aB;���!=���S�xct��;�uĬq�~�4D� �(�ڸ
��A�)�\-b��-�~� �2�PF�t=��ے��/��(�\��h@�
�6��f8B�ڔ�vԐl�gg���Yb l
s��
������<0K�-~��9��BZ� �"
��g����Q��C�
w��s�3n�92��률N	�1�J�~{ Lv)pe�?
Ha�.�' �'�t�QC:$h
`M�+�'�>@(������\���bX�\YH��^�J|P��
��c��D�K�r;�h"y���u�{~�#��'��R���?�PO+�QM�(��᭳�Z|��?����K�p�lm��Ê�ߏ+��J{�	��g�͜�x������VvG���JlJ!��Q'b�/i47����E:������.�WI75���0蘺z�"�
+�Ԧr��[(_5�L��S�T
=p|O!ɶ�4Y�9���~�'�*��JP�zp�Tʫ
�3��{.~
����ϟr�ف��
I}0����~��L~�I���[�k�h�@�����[��O�M
+�l�u������Z<��fK5=�h���H�
2�B���Q��
+ Q�/1�s4�8�\�
�A��gMS�<m'%}��|nx����vŤK���L+X�i2Q��9��3����L��g��� ~��v�����aY��'�F`|S����$�{� ��ca䷻n|�R0DgB�����JfFϺ¥+�K�~��
��~�%�i�\��V� M�
E�* 8����\�i��y`яn��Czޡ0?�Z`,�k�Zp���E<�+Li�h���>C0`�l �d��������:��
B
ʹ������#�eg��Lܯ� �!������
���<'o������B�Ї��	�G���5�d8�n��6��=���.?B�{����$���I~�q
Myf�O���t��xks�>ˌ�#�!eU�r#׋B_X��_
@|�^�]��_p�M�j���,z.	
��g�ߨ Ɍ�vېJ7bk�
�9�̱����d����v�o�R{��)�._��_�.�*(�:���@
��VF'�
�)IJt5[_k4�M�e������ꂽ��i��Ϧ��4>��� �мHb��k�?��.Ŀ����GT�GaG,Z��l��LG�Q��w(�D�9l��C���P �Y�������JQt��|t��?��N��{P!��
+��
%��IA
�f�)
�&x�
�
��)��
���-����������A��S%��+�ua,C�
�?��{����Hk�
 S\�Dڈ�־ܘ�QO�H-���<:�c�gC������#զ�I���l߂Z(��b�Ry�),
�m�`�Z�
¦���Vis

d< k�[��G�1Q}Z6�hx���+�E�V՟�o]��D�w�a�e�Kra}t��
	��tO�6�x�?�(a
r�Q�	7)�OԷ�)���8�זQ����UQreo)~�#����d1����h��
�^�3���,vd����t��B�a�&;�.؂��f:X8�ܺ��3O��k�a���d[�'c1�m?�(�a�A2��*�s���h�W��AT-G
0MhfS�	�TT
�1�3
i�
�CQ!����}P�8�v�He^�ۥ��
�[�'�v
>��b(}4aAH���I.�YΪ;�����'8�X:$ #�1.ޮ	6
s����B�=� F;��c�V)2�wm��
}?y�e����kTA��P�a�!(c~,�z�%��j
6�c���U����P
QV�M��
+XMX�װ\���VMq �?��7�1
+i
���a�#%�Ϫ�tM�
"���8�O�WtW	k3��\�&1B*qtR9O��
%�<k>�->�'e� #=�6�W���8b%2�9�m��l\d����
g:|4�|a�6B~ch_��p���V��xZD��ըz*5�7ib5�.��Z�����LI}PB
�a
E�_�ͣ �K�@_b
�ҵ@�;��@�����L���W�Z+�8���������RC
p!����9�L#(_�?�0��
�@O���=�U_���,�������j\�]�P���
+��$�a^�d�#t��++`|�����b6}1}SI	D��
+K<�"��J����O�
T���`��,>eKG0ў�� �p�
�1`CȢ�-����
�v�?�KV���A�<M����j>b����,T�w*
+�+ы�Jr�+�li`�;�1
+f	�E��l?`¡�t

�:�AV3
F��jjy�N(ؑ�N���{�P�I��3�>��!�uP��qJ<��3�����ҺOi+�t){ۋ��d	/afV��I`�j�M��+
�8#0�""4���|�U�&�M����o=®��e�v���uؐ�퇱�s+��f���}��.�K::
����l�r���C5�xW�uI*�?4�xi:NRN
E�ub��*"	�䣤��� �0)��9R�ϱZV�Ւ�6Ղ��O�!�:�d�HҌ$G5g8� �P����߄�e�Hh������ԨD�B���b��Ǔ���}���0=�$�g�
x�.��
l�z��l_'�[(k�4����y�̑�<�
B��L�
�pe�I����%�A�x����� � +��D<Il:@�������b��
+tK�
+
�A���u�g
}��a9�s6>�	Z]���]�0�k�
y���FGZʔ���Q
VH`�>��ס�
p�f���*
+���O��m�1��q�7
1�ة�h�CQ����1\  5$�RF��3kY�'}�
(g��V��w�Ld�)8�;�n�Q,�|%
��>
x������S5��e����=�A-��`.h�v�|�
ռsA�-6�B�,��[�0���hV^Hυhޑ��#���X�K��:���k�
D�!�L�RR���b� ���Ҫ-/0�����ߓ����� �^c��#���,3�JɊ��[�x�p�)��Y�l����Yt6����5�Kγ��Am����O)pb�,�n�T�P��/���(9��]�T�c���o�4��J:��z��l�
����$�F(�Y5L!1y�=ҿ���H��o�'5�
��u(%�~�.��
;i�q@�=�U�nُ��(�C�lLhe�;��9�/0�'0�ts�Q.m V�
˄�9	��	ehmy���a��ˁP�PH��㹕EdFA���^�Q��3 d�/y�3�	H�3XY�=i�%�X�y�&���2b��t��>q2sZ@���
+]S�
v
�*�k���}P�ja��ԈS�|nw,Cz�t�i}:�9 Na� =�J�6�x
��@�-
�@F��~%��������8`���,�|Ch\F(@�5 }~*T��=��i��s��vx�O��ۼ*�(ܟ�*4֫�S?���g���7L���
���#LգFu{]H�������"��E��DP
+ ���Dc�H��ۇ�ʪ�q+h���0b^��R

<��D�
2N�Hc%�+�~\����F
A��j������쟎��#ūjQ��t"�N7Z��R�j����᠟��M�8mNa")�

�mƬ�
����Ύ�B��}�sz#%]�e
�Nq�t�Os�Q�گ9���E��E"a�+$�PPP8L�rEz���ԣESNd-|_��D��5��EۥS��)�d ����|!G{�^��$�� d
me�Ѷ,Vk�E,��k�
KKpTOl��*��ak!�Hݤa��6~�>.�������4	��|N�	���[�ġw�����B
O�Q� 5yN�f"e��=�ۑ,S�X�C�Xg��"Zu�>��
��#cpu����ɄY�'G��z/[2fzu<�{
���A�����MO2�(E�y�,
T��^O���&�c��
 �C�×d)���+�����
5�9��$ܭC�w�)����� ��MoB=P
d�%��6\�t�#� Sqj�]IAh��o�e�4��2���"���6�S1BPB^�M!�k
[�_,��fv�ۿ䯲/{�fH��
�ة(�����f!�x��p����^�
vI+��qƇD�z
re'f���~r�H����=�*~��N��@��z�}(�a���!E�����-���x���Nc��[a�
�	p3H�� 	�7l��6��TX�d��8 /9�#b��YҕȔC߬��
}OY��Ɏ��=�õ��D��
+)�)�	�
���"<��C��K�ô+G�
V�b�����C!�];<C����
��IE����_�@��4
����
��8X\
��'�좃k+���̞<�}@�Um��q����Y�%U8
���
��6�
+��
 6���9�pV�L�
d�f���hRCE%�="HA�&x
v
�Q�?�7�l����Hj�B<��������MTf`��ov�e����U�a�LW���̐YM��aKN� \�u������
9�(oǰ��-u䠠��&�j�m�
���V,ҙX��"������>x3qo�^a@ �͒�t_hV�(TXs�@����%N^�U��
+�3�"�<��I���Rn/�;�Yl-r ���Ue���
+�}/_����bMP�%��N���k�x�*�r�*��bC0
��ro'^{�
l�y)��M�[F�m�rj}��
�b
Q`����!#�����قq�����6^�a(*���}%k��鰊��
r-u��c�"�uV5
Z�bZ]C�
�#gҜ��"
������,�`�7�9m��!�� պ:��
+���xvA�/1��Ҟ�Ĵj
��ҝ)G!%��,�Ϫ
��	�{;������!�Q�>��]��ǃ�)"��5w�
+B�%ѽ�
j� ���O�
�:�,����C�P`kKHۿ�����-������	CeLlj�lթ�˂]
+���d�b����Kd��t�F�$4�����$��|��c�*��%(��ķ6H/g}��h�
vA�.��� P��D�q\5�6 3��͝�ȇ8�:�����7�i5"\��SaQ�
��5 �B��l����dʪ��
���:
���?�ӆ
����u�Z�
V@�AK�V(�����K)l
WD]�v��h�]���1R���9�+���*u��RXy�i>򚃙8]�౒��P�i���2��6�w���e>�����T[v:�j�x�[�H����x�+ݿ�P����zXA
=G~0}�y�i�d*�O1�Q���y�8p����^��P�?�:3�"t��ʡ��8�/�DQ�_�A�fsle�d��8�h�Q[p����O�H���7�
���܈-wc�:��g�:��zK8����yE�g�@��u��#�x�4���7�,�
�(v��	�O G�zj���
0�w�C���(�}���%m)pۡ|���E���H%
�`�{�.p�@>E�km�k���T�h������Q�1��UC����J�qp[K�ͤ�~����
nj�6�����
M�L"F�#+��B���\AhP�$��0+I� qHM�:�Ѡ��È���0 �S� wSQ�� B%�c^ o��A
����ԋ�G��}erx%d�z���,QG�r�f��
^�]{
���>V3qY��6��c�$R�L2��ރ�Xs�Ϋ���"U�>�T�fl0l�*���h�<�4U�t)�����k���>�*E%U;Qc{xU�A�r�w�$;��
�mE�V�w`�ӷ�*�SC�9g*��=�
+�ϑ���l�YT
+��<�µ"�M)�%F�qR.P1Q��%��J�5�c3��1C�`O�
�:��ݪ���s �`ؙ��5���1�
Z�'�~��L��ΐz�\
3���(rF�'��@�v�9"��L�s�� n
L@
+��(@a�w/d�y6�-�,����Q^鴠Yd\��Ѣ��Z��
�Y�2�F\�kd�9�홋;DGf�P�	���X�t�i_)6�p8熫�
��uw����*
�c�g�8:�o�����=5�uI��
�
+
r"B��FD�G���;
�[��/��
+1��I��H5��ù��u�����
Pe�qU�w	�b��
�ƲO��BD�CD�k1�����9�_�g	;_��I?�0H�6x�2��a���s/c�꾤�W
z�b���� X

J�JLOt���f�
q�4�4�/ӈĆ�t����x%5c��?�8V�A�W�=��>:�����Ew���>����č�K��+�
�(�f������O�x��+��3:�\�����eԒ�3ޘ�5w�G����
D'�^oY�Gg�T��
��NПF�3�����F%ȐHVH�\��!���Q/�T��S8��R$�����&�X
+���c��
S<�P��b~����B�aY�>>��=a�~:�d�}����7���v
��8T?^�F�_�~�!F��t"�!slE'��HE��3���Ͷ����~*XR��o!�0�:���H�d1��ĭ0=t�4>�׽�����](�7�I(Mٙ�sAugX�	��8M��;�
�' ��d]B0����'�����V�D_i$�l��z�
�-�h�2�ؽ�<�c�z)?}�L
+ۻ�v�m8k�ֽ�����Fs�1D��"S���䢒
֮=7ɷ�9Tw�9C����F"#�o�f�c��#j6f�<�C�v����HR���j���z�Y��	�I����$�G��b�;\��֬��kI%
+Qř��]��f��BQN#"���j\��Z���q��
+ڽR�5�
e	%1��W��c��$��_�<���h�S�e�jT*�Ϣ^瞛Ѷ�}�F���\ia��t��tG�dt�
������ڝ�w��F�]V�Nɴ���
�1�$0�=.�]O�{$�(����{Ȫ0m9�d��!��gDx� '��T�-ANu��8�VP�AXOSXG��u,�\�yj�d` rsŸ-�!ێ���.`�P(XpE���8��HZ��o�P���Ò
E/

�^�H�pdp�~�T{o��s�]��DQbc����[��Bd|�g�d=:A՞&��TJ����y�(�V�
�蔚��!�q
�kU��xt����f�u���8]5$��{\�`&Wq�8�։��}�Hal�uG
�]�T�s��Xݴ�,�l����V"[@{�B��b�����̄�zT -D���l��N�m�z�?�����
hX0+bVi��Pm
+�E�i^fd0)���p�h�:�q�Q��f������
�aʵ����"9я�2��T-�7]�,�C�[�V�F>.0�%�F���SG�@�=���F�p�R1�a0��awRh���Ⱦ�]��P)�G�B*XB��= �Ć�X����4�m�j
�͋����d�W��:�ď?�
z�8���F8"1'1� 0���
���G�#�2��Wz�"�^�z;�U[}�Mm�l���X�p7*���E�]�*lTM�����
p��Wٞ�i����0P���I��Y�t� ��~g:��y�x]@

���%��J���`,���֭��k��D�����!B�o3��H�r������VHu
E�9�V
+U�
ʮ����~p1f;*ݭ,�\D>��բ쾯��JFv�N�����th����.1��ا
��?
�lѱ-�4[�6��+l	�>�c����f.�;��rQ��)�#�&�Qq���c{����/h$*�b�6��<�#A��=�GDo/��{�
܌��
+���6K�6��ʡԨ4��f�
�G�\����O�En�B�i�3���9J�,�{����R�Yr�y��K�%H���e*�K[m[ޘ�P4)7��*�N�ds^U�C
,+۵����n
� �Ԟl���&�-J-�InXȄҨE̺������;�}��\���A���ޛX
H�#c?5�`�
�a]"�m�9�AqM�N}����lY�ዾPJ��F%q��QMka9'`��F A����J�U�+�@5k�SD�
���pU��@E@?�8U�����)�*��k7���� �jt� 
�

+y'�
+�`>�P����Ř
+�#(�t�.�ȵBs٦!;s��Y����R�K(}6�h v>9�d
+>Pq8��Z����ݾu��R����D
�%�M���u��'����
2��P�2Syũ�㝞�Y�&�
��`�E��D�S-R�F��8����bNl ���� Ir!�n(&�(,l�u�e��ս�ﶹP�|��*��L׃���@zQ�'���c"X�*!�KJ:=Ombi&�,�#��[jO!�vƂ_o53��ׅ�. �(j��X�k���2Cݺ
�G���VsoD�إ76h�{�-�㺄H�sJ��1[tw�l�s#F��FǶQ�$	��IKl��{�v�ꀯ[K�ȁ ��wo�
E�l�'|�ٓiH�΅X�yfTOB�u
7�Ny Ŀ
�m��:�a&��l|�Ϥ�:f�����ӑY�%(2{ δյ
Ay�=�qgm�Є�1
��s�(��v$�8��<��x] ���{\ �Ʉ~�
+� ~P|�1����X&[8`��p��!��.֧��

�Kg	�a��_������GCXY�
���8��_Ex�f
����!LJ�b�s�j�y~4b 
 ���"D����[TZ�ZcCOO
��^� e
��D�4aW��d'�5=���[P,^hԬ_|*����|"kl-k�PV���U|4���^��V��^�ݑ��:������CX=H�`E����l5ve;b�~&�V
���X��Դ����M�e+����
�ѭW
Cf�]�N��t����1u��|9�$��j��:c��
��Kf��APKAP;��Q���.�����4XOdFt4��Kៈ&P5!�'���~�_�8~;f��ơS�	�
4ԣ���{��!�ߵj
+Г�q��{�{^�֣�$C�^���M��� X
c�X+=��K`ا����B�k
Q��3�%`f� �:R~>��a�fE
+u��[&��Ue��*Q���{ߘ���5y�)Zq�~��-��|�P#B� 3����9 ׌7�r�;��T*A�/ד@'YS��
��QQ��[
'��%
H� ���="�@�튩t�x
�v֣�݊�$*�{�r�w�ٻ����wHX���#�K���	2"DQ�8�EŔ�X@#eR
���V�����4�LC��\e�k�]/�PO�ӑ.7�qA�J��
n2���ޱs
+�)=rn�E���I��
����ȣ�1�fX&L>�B�>P +��f
O9O{""u
+E���P/S\I����n�<���vkp#Je�X���i���\ǵV�
+/�R�MJ��6�8z[�YУȖ*����.���pR3������.-���'��M�#�����Ggٜ�� ]�u����3���
+�ӧv���Z�:��M��%�qi3�b���_����
5K����ϦBD����r�^‚�ؾP����
+c����~˱�
��sP�XS��#̆M7 2�prA�9@�=��UQ>�j��N1�5.u���&��=l–�ۆ�>��O�?�%�F�ش���Ӽ\�g{��g�%���
RzD�KP�RG���>Щ|���H�D����—��$D �O�m�r�GK�ۗ�yB�r�	8̳�^BQ�
π���9�^;���rZ���(�.�S	�<��3��F��&ԴN)��8?R��ذ2��="�E�t>k���"=i��qW��F�j��Rx
�z�6V�)���NS�?�Y$���Q�$�S�������Ў1.�	@،+� �B�3<��#"�*�����JS#F�#�
*R��pC���z�<����kDth>X�J����;��}&4�(^)��y��0)Z�
���
p].�p�ٴ����Y}�e�#
��*J{�EC��9AX{�N��B����a�5{��B��}�ؼ��{��X�)������į�q�ٿ���gܮ�~)mf|���if��+����� �١���[L�_��� ��n@Q�3���6�G!�,��Q��ڵ`����A���C��r���~5�#jo����ȊN�p�)u� ((�+
D�^v����B������K>����p���R�� #<�E�	�
�0�0+�'](.*c���s�3A�~Tt� �!��3W�8yg�"߮�t���[ [...]
+èX�WLbO �b�s@}<ꕔ� 4ճ�聶��iC��h�@?�~R6Vֽ���T
�%�x��,NF&B�d��wb�(

+R/����g�
ܿ#��?�Ss�(` j���ֿckT(rMKN�!O�)���:��(kI��R���‚�3�&�q
+x�ˬ����@����c[a�#�S�J
+t˒��W������#�:7_lמ(�,q`
�xMΟȞ��|j�{�
+S��~����1�ن��m�x��
j9���`[qP�"8�p�9]Ul>��\n"0�).��z�M�8�!p�G=���԰��<�_z%��~�������A�$j at q@��s=�I�
3���s��<��ļO�$C�*��v��
�)���9�i�:��WaI<糱���uN�Z	
����H��S<8��
�;���s��)'
+U㭁ſF0��#P/*��<�k����	Ò�96�4��Tz��!I�Vu��@	Ħ�Su�q��'�8�W�*S�:K-����Ȁ/�v����}��)�)c�k�=3����p�֐;���%v��G�:ơ���1X!�G����w���&�����)k��w�Ii�6
Q�Yߏ�L��Ǎ�U{�e�cZӇ������r����.�Y?�p�
��
+�~?�3a���`(�=gam)֝��p P`j�C��r�h$�HP�B��ſ���*�#B弇���

ԟr|JlE���O���|ROX��7%9���1x��դ��C��gWDu)96Y��2o���^	���ΰ�@9�3}?�o鼛� ���w%��ď9�{��3	�6�pPg�A]�=8|dsU�a
@BCU�t��a'#ꌢ2��S�;p %z@�� �+�z���T�׃$�V�P��]�O�f8ѳF5���O�o1ζ�ɳ,�M���Um� ��&��)ה-�� ��
��J���I_U@례F]�n	��w�����]�;<�G���20�h�df�oE�1[�Տ4��g�E�9f)��ء��3U�=]�-
+�[�F����@3��~෷�0�� ��ޣ���w4E�q����/�G|��ߢ��f��ǰ�_��h�A�I����G#�
�1���q�����)�i
�
xhN�v��DE�A�8*�p���JI�Ȁ���ai�
+�؁��2J��D��={O
Q������zvȱ�_���|�����<�2J
+��")��8+H�{���8�L�����Z0���|��,�R�<Bn��መ'B�z��DX�ȡ�G��q�c����|�|L��0�:
�ǀ�P4�, �mfb#؞1��"��(^M�J���;�e�Y���$o'â��"vh�a�x�-�<C��:����=:s�8����m*|�s{�d�u
�5A]C��s�W`�u��Y�5 #$�i��C���	-Ey(�x
�}�d��9��K���U^X�H�N��@�/�0b>E(��jIS�
��q�k0 ��E�V�p�m�]��)ɢ��Uc�뺲K�ChC�q�ym{�3���e�Z��l���#kOч�k�: �~���#���� Ӽ�f���p�kE�C�	l\��P�o
X�
���kc�D�!+4�3�ִ����*jƍ��
+j����hm�$�ڽ��.�}�S��^f�<��w�Rb[4<�jQH,�F
?E\^�{�"u9e$"�ΒX��IqZ���dsԐR��QV1ϛ`���~�j׎(�("B�
+�^a���
B�a�*���wt��J=� ���z
�s�B:���$k�\���9_h8�N��X)Yߥ�&*|g6/6H���q�w��#
+�M���MF	gc% ����Ck@
+_�ޔ� ������;e�jr�
Hv-. �_���*����@Ft����9"���L~�<��Ѯ���2�������r���"�Eh�Ղl�f��!
+�f��pt�*��+��v
�wV_�������'�M
�G��=	���
u,���
'"�)��~� 0�:�����'����.��{X�
x
��R�FS&+���x
+tjY�jF5��&/�#"�/L�c�H�y>��1 ��"3�E�T�ī��c_#�AH�e��J�K	�A�v��u��
�~�h8
���a���/��ls�<�P*��>��^���|kDK �v�Yy���ev<D�8H�v�n&��E�o�
�
 ����2�:�����m5֛Q�0=
��^r�����a�
^�T�z>���J�{D<�CS}����,�Sy�2�f��*i=���
�l�*�oQ�؝IT�}΍���q��t �
�` u
+&�y�r?�,(=��
8�G�G[O<�@^���G��
+��r����e
	�
�J�B5�#M�ɐ �G�����{D_�A@!��6�zQ�n��A�KZ
��JH:��P9�C��5f4��d�B�v|������8^�Ȭ
|��!��"
����d�8 ʗ&]ZGTP24������#�
+�в�T��$ZT`h�jH�T�)e���'��|]S��0Xw���F������>�
@���&{ �����h�M�=�(��hۡ�W�Y��KW$�Io
�3��pS�G�����0�8�"$�,96��g���jk�%{h�4/E�[ԛ�*��$_s�Xs���d�x
�<}
���
�%4!N0�ۇ���0$o�@�/�=.`�}�S�ȨBMZ/`��.3�3�ϕ`Q
���GJ	�jxKb� �6�r#����u�#���ّ���Q��w�U���h��<�xBIL�G>
��~��C1d^�^,�w��W��+e��6�{��е�,���
ԯ0X���.<�
+�f�h_ �#�n�
Օ'�)�-��&��F����h�GĘ:Jpo_-T�;�T1�yrk���T����_��Cu�_�o�l�xs`�!
~�����:H^8,�������l3��Ր�bT���I��X
~>��$�N?b*T�����������#�*��P����)v�qfܑ��H��?�&��=�D\��o�R��<YC��BV
!��t�p^E#LO$rb�T��xTEc��M�"Ktv��_GH:b��
׸��	x�	Eo��_`D��KTp'��B���J��,
�'�h�=�c�)?��_QP at Uz���e�$����hy4�@[���te� �G�|

u5�
�P�V�A#`�T������oQ�I�>����Y)^(�
���P� �jă�c���ÊL��*Gߣ:��s���`�W�pO1�
+�"��υ|�1��r�QeE�$s��	{��̞_��o�0S�� lM4�й�Xq�J��W�E���
.}S�cb&�tA���©�p)a+�(����c{�(��3�^U�Ղ���K
��`�c���m��oQ�;����Ƕz1�z�Nb% ��5M�A��}����ѵ�k=�\a:�; �;7�,+
�
���苕� �)i���v����g
+�-u��%�	�7�H��'&�u4�
rv��Aq��P�N�����f���>���)�G�P�
8F�
+�
��l�Ǣ�L"��r Wf��'��^Yyq���߰�W��>!h�
y�^<Z`0�dRu�97p �H�^�z�L��_����H���4�?�d	���K�����h�|�տ�����_,������������_�����������������������������������������~���������������K����
�	���� �_f����R�Í�p�/ c�|5v!����;��<Q{Z��~1�ߢ�����=5�W�
�̈��T#�ri��(��a���046��p�{�o�D�Xx���ۊ(*�A���$X�
=��(�O ;�C+Yw�ta)�E{�/��Ixg7#���(Kj����M���8�5�D�?!s�,�l� �KD

�2h����Q�8SfD��
+Vq�=�lI����šy�����S�@R���[4gŎუ�^�[�f��v({ƌڀ���(��E�/�cë)��A�
��cQ�í
�m"ط0Ce1��>q<)e��4�'�SMh�x�;^�;AF/yDƳޠ$3Y��ɜ
+�p���+=EX
e&�Nc֛(�NL(5�(~��f�x�q��w�~���'0$�.TJ���ç#JQ_����7���F/�}��
u��s0
��q�+�=����e���Ǝ!s�C���iD� E�E�-Q!TJ�`~
��k��{��|A0��>Ӯ�
+�"�`A?�x��?G ��ϻ�uW��AO�¼�1FUU�Ԁ �� �ëދ�4��s};��ӂV>|�
+�
O���X���ݒF:�glKOe�չ�!>��*(pp��
�PD=��F�].�~�
3�
S5y+)�=�}E�%"��&�����MĖ��z&���it�����v�;
؏?���C!b�Q4�Ѻ��2��B�aR���A�F� )Bu�&���h3!a�$�E<n`&��J��(&���R�$2�[���=������#l8�.<x�u|<��"b�)f��D�$F�c����/�-4�$^>��{lB�X���@|F��f*{;�<�wz
iVq�9��
�(��@H�E��3��z��*�d�̵U�<���?�����Ȧ/ā��[�^�40���;�;	J
+x#��Ž��`П�9$��2Pr�xS�B������s�_�@׀�'�| &K�
+f	 7{�݊}0Z��b�(Q�EҼ�w��!̱�7��H�
�y2�(�Go^i	�� ���y��ej�Ol]
+�yJ^�9�<%��+c�8O��ʗ�;
H"��b�P�5gbJ6g�3����f�A�m��P��"&exŻL���1S9
V����^��Z�C�����
F5��c�VN
{w���W?�Z
k���`���,��g�����m�؛�LV�g��g�,q~� "r>=4�[#Q����K藞i�O�m

�(+1�{�a���[�
���`a�y]7���A���g�M
+�
/�3Dq��,Bx͓8 at J�֖Sx�nF����J "^��bZO���,ٹ_\zR,�=S��0�b��
�+�V��oA!�V�ΚX��"�|
89,��Y0��}��3��J��*�0�k�&�

����D��4�({j���[AD�LC�6"
q�!�
�C�&JԶ�

+�6�h��x(��ȯ-e$Ф(
W���e�F3��
��zC~>/�Ί\��
#�
�P5	^]+X�D��N���
r�f,�
gy
g(r蚴h�k�@%�,�V��y�9hNzO�-���)����  ���F��aSn;$P�qX}��
}�{!�!e^Hk��{�c�<u���>@�݄b{Oy���zi�;�ڷ�H,�݄�kn�4�x�"J�S�ԔgXms��17*��o�

+�B��^r�=<gx?H
��R��5���&Hت!q��Q�|Z�:���\�g�m�5 ="4HW�1Ώ(J�:˰^7{�3Ƴ��\�,W۬;��qj��=IC�b�LR��t�y�`��
�����i�7<I32Y�Z \�]��%�Y,�0�~VѫƗp��p
�@a�T�<?c�=jr�) �=.�/�����@y2�N�LU�v�+Օ���- �B͋/�$g���F
f�����B�
������]��۱�֙��ю�
�Į�aL!
n/	z�-*I[�|N��*��	��=!��Ԁƺ(
=p�9�ҵ�c9�����g<
Xw�4��P_[($V���Rق�_N�`����;8`;
+R��jMb��
w*ԋ�v?BUU�ZZ� �}F� V�5��d��aX�x������S��E�t�joQ�PL�?���
�9�����Q�R�s at A����
w
��"��Bw\
���y��Y�)(QS��xM�|�{�:���A���{��]�
ͤ}
����}P�m�r��]�%6�M~�='![Uש�Οµ�@�~����	 lT�q4�o#��^�
�����g�K��bǸ���nV�VV�`����&3��NT�Ip�w����'�q~Swϸ���E��sض�'V������bs#֕�礁���
+�w�Qa�rB+��6c��DT�.�(z�Du��v��$F�##����'Q���߁�'�s����0���ܻ �.�_���L���ۧ�zg��
ρbf�r�Q�BC�~ȭ�B5ÊPQU�VI6K�ī�@�0�2!`�W�'<����)�,gu5/Hiv:�%�.�ZR�N�����
Ώ��*y
+��+�-�`�u�+d�RV�It6�̑{�זͪ�cM����ي6s+nZ��F�<kYC�`�j͕�u����<��#��I�a���	S�9��d�7���CC{xT�c��\�|"3T�
+��z�
]���M :�m�@�'��{�tA@��|5��H�S�NLJ���&a�b
����8󸩫���
M�e@���1�5e|O
:�!���P�ޫp�p{�w�F�dv�{�c;�+Qv�Ru�k Ff�ui ��
+;�0�}7���i��j��DžR,Fra8����O����q��q���EH�Ȑ���3��'^�H��i�ǁ�T�
+Y�fB������#����|?���	+�����ԁ�|5�
�i�=팰c%��1�io^	����
+��y�V�

v�ܽG���E��2LG�iXM���v_,�=s��<�$��r��*���Yr:
+�n
ɔ&]�.
�y�F��J���XV���W�l���c�lN
5~����^Wv"'�h^��
Zܣ��
\���›C�I�1H+�"��`E����Lzh�c�w�(�B)t���۫췷�@)j�kh��
�2�:���"@
A	N�Γ{��� ` e@
+�
+=n^��喇,��
�
^~��ow���c�5�i>�d
+��@KK,v�P�\H�u�'R;�b�I���{S�>Wz�<���g�D�P��yL���b�[�ch�#�����K�6;�g"
+<��yt�u%��#�"
+Er��4��
�X�DT3�q!�Qd���J�5��]�WB/���')F�R(��IV�`
2"�B(F<.3��1��~T�m7'�WB�~�8əŵ�7��*f����>
�ÄP�]�ߣZ��4J�T+�"X�sd"u�n�I &�eL5K������+&Z���i���Z�`1��[OG�="$��e���L�ׄ�~4;z�[���2:����c�㶶�
q�Ѩ"]�߃,�6�Q��T�1	y���+L�P]�9�GAf��߲3�����P;�!��,�A
>����G��*C��7{�p�JA
�Ů�������xb���먘�/��t��
����s�8螟}r�~
݌
1����of�~��K��:�),���֛GF)Q�A� ��
� ��Q/"Ҵ�vx���C��XF at a2b��M��3a\A0�Gɉ�$n��;AH-JZ���>�
�5U� Z%���"bM[v�Hl����<�y���A�!�G]DgL�"�a�
�^�\��Qh9��xMSb��]��@;�*0��[�NX��#-P�Э&�ڽ9`��
 ��� �^=M���T��_
�8���
ȬX����Pt��w*p]�v�K6ɕU6�{@��2����e�Lݢ��Fo^GszM�N��
??��
�Ht��GY
�����
[k|@���7B9�j|��(

㌬6ul��^�-n�h��/�
s~
x
ߝ�1|
��O��b3��#a|���t�A�@A1΋��ք�l ̺�Dޏ�e:⬲dx��̫�\�vHt��غ��
��H������ޖ���9��%߂(�Ӎ���
1�(Mˎ�Q}���@�EQߔ{�HKD�a��!�ؗ�av��.
	63����`"�&8 �cM�
+��} ��9��+��I<���<�<�$?t��j�uڦF5�Xėb���s!:�6���(Њp�W
����l��j9)�ΚHQ��)�
��
+�E���sl�,hXa����@�Q{b
S�ʔlie��а?�*fDXu�9="ƍha��%
����$��/�X�S'�m?$Y�0�{���j�[�kT��4
r|� �
+Wg���Ȍ�4�ي s
�>���a��� � ��/�!6���x�K at cc���j(C{V�T��r "�@�3�6N>�^zW�o=��nG��m��h��Ŗ6]t՞��jF� p=U`1�I��u,��fC��
�f�,:�c�V �PO$j�JG�
�3�ڲ�rd(�a�
,�Dװrn�0�܃���L��R���'eB��x�^֨Q?|��NTm��1v�a��
^I}3Jԕ
+�/���b�� ���9/2����|?��6,�(˅~җ��Mۻۧ;�ϙ�� 
Q�}���
Y��ED�($.x��g��:�8q� �ĕ���M�V6�� H:1.���_�'��}����	q�T҈������=�U�hp�� I
+"�GD��+�#���5���q%Q�	Z��R�%˯�������[6���Zhb:x����^T�ҡ6H�-M5�!Q�iA�=9~���#U&���E�
���p�0�kWJ�8.]~�u
+|�`-
d��Q�+�m$�R:�:QO������}�n6��=�,浜�S�ʼn+��y��[$yo����
ȂX�!u�D�����T�!�}���������z�m�w������91�0��~�d��~�ē�n�}'u�c� fH�ݷ�Gq>���g��J���x-�x^�Ļ�<��=��<�vn)�Df-F=0+�q��]����~0�:�{y���\d�G�
�h���o���؃	�����އ����}�����Z�&_�B?��H�6H�?]3+IQ�_��3����/ke �x��q�� Ath���g=�� 5�{�Cü��]�։��wg:��;n
���,q7�a���[���qh<Tج9x�;�U��	 ��r*��B�@�Ta��T���c}����@��<����6e�FG��s}�i�[��~���R��ٱ}���r���v�Ex�E�Q4g
�r�s����i!��C
�>��w�H�n��ۃ��3Q� �x;�(��HO��J�
+1G�G�Ў�
�
v�Ze�B�|�Kb�t��S��t���SUOi|���LᏋ�x�B_� U�0%�Œ��}_l������cCO��%�C�M��{�����te���6���C��ѝ ך����挶`
+�W�Ų����droRa:z
NKĠ1��D��B�.G�{j�Ņ�E����6+�B4��%�~~9X�#�Ö�Y�l��p�
V�-��O�A �d�j��*�>�8}�$��@�
+!�P�w9�O�;��p;�"~{����0�P���v
�),>Y�˴T����[o(��:�W�  
+�EnTؖ����!����7�xQ��N����{�kR��4�;R
�u�b�q�r�Uڛ��t�@�
��<���߮{��-������prwG �Z�qv+��1υ�nP壌�.�뎠Q�PLۧ	G��
+"Q)�f�!�}���
 pOpݴ��	����2�
i���0D{S�@DF�~t�d�{�^S�+�iR�E�
�x��C�n�ޢ�ޢ��E��j��3���`qs�]�Yl��2�o1�ZL2{7��
?
Ї�
+29`�� �L�Ht!���sH%�Hw�A��	
�,�> �{�\���s�p��i��
5�D�X��H��W�a.�q�B\j�z��� Q*C܍J7�̱�-0� I*�="�P��6�
&�=�*�+ƭ��L/����~�@5M0�w���hr
��1,���
�JX1��t��<�{H?#"��u{<����1�9`�ʃ�����aF&�S���v�
�
L��x��(���@|��AW�Q���^A������
n˲l�{���M��d��tk�V��@���_���
����o���]>V�ȉ���1b�t}D>

��*��ޓf��1;���o�O����="�U�L�� ?�g
�4�����Zs��C��f�Q�(�scAg�C���s;p4��
�]t�Y
��wݫ$H�
9o�3���^�=�4����^���@�E�%F����iA�>�jT[U�+7�腓@G�[�Ow�#�:)���Y�F:i����d1y���
�<Gr�=
+1
I83�H��mZ
N\��v�;sTRb�*0T'�'_�B
�	e;,��tA���]�1�B��������L�f��o�
+
���!-�
� �\ͳk�j�=�;�tB�$.�B$�����x�{��~O��ʞ/_b�9m���%�-& i	(�I	B��D�I�ݯ�
}�%
mOx/��O�jt��4zT���}� �BO��v{[oQ�
[�ir�7���u'Pܚ��N���D{`�����;�ޫŴ@<���Ѥv�a��c�7>��2&̖��?���@A����
	�W�s� '�F�4��ٙ���w�O�!tO�|��o�‚���T�� sg#�Pܭ}!O�f[X��(�Nݮ���̃x!���
)�M�
+�ctb(ER:@��=[
wq��bF
+�F��CB߶�({�`p��f��Va4�s	�2U}{L�[��(i2�2�T��<�A�7v����X���h���4�<�eQ-�
�w<�is  �_x��煔�J���C�"��y�'=���@  �P�S��OQ�,h�,������� d���ٟ?) �����K��=�(�9[;3�ݼ3Wם���5TY�*M҈:�4
1#g�Ȟ�GXT��h�1�*�
c�f6� %+�{���q�=�9�$M
�
��n����ɒ�2�9���=�`�
q ������qFqR��ȝ����Ԩ�1�xBo��{$�j
+���ٕp�؜�Q��L�p�4'L��T��Zs��4f�Z-���ݟ�%⒠�];�r��Cy�b�m��zj
+>��e�B�Ȉ=9�+�h��T�CDC�<�z���
 �H��Y�qE�N����'�9�ْ��a� �n�H[ߥ�0�P�ơ��	���-���!ύ�_�0`醎27��da���@�N�W.�a���6�R Q�F�>�M�u���u���l��
��!}����|u��_�Ѽ�'����Aa0�W�L����ʟqks�w�h���4A�SUzAUۊQ��B�unh�RAaL��0a
��J{�
X�_��a���
���ʡL�
+ �����tE�`H�g�����g.�h��+���|~�
�����B�x�-Ϝ;S,j�,�[uZ�"��@$
�ί��)�Ϫ����9�
.�M��hS�Бq���[�
�
*�L&p��q��w:.����^[�$�U�Etu֖k��f�#���gU�}��x�g���5&�
W�x
C�1S��z�Di�LF p(�#���X�U�'�V�=�_��f�4��:~�}�y�
�ىc����}�
�O�pX�ǁ�[#
%,<슈���x�:�9!�t��y���V�B��ƃ!u��C�\��7q4��l1%FZ��yS��.0��s�A|	���ɡu`�yo�FT��fϝF�uͦ<
��Cd�͛Ī\��H��I���*U��iK+i��΢`N)ص<��)�Ge&��'��u Y�
�%�gjC�Q�P2f�@����qj #���n��@
~m�]ñ
6���a>PЊ=R��Ȑ��Oe����
h�,����kDDQ�P�
�4�)v����(ׁ
+�w��GKY�8K�#’��T.���uV��8&9tm]���:<+'��|�� �n�@�"�?�ϧ�K�֑�k�����"�:�ߗ��G��b�F����Y#[��r�\Op��|H'���An���<ێ\@�7� J
u˦UQ"���yq%sAX5���+h�L��I�&.���^�#�GL��V�
w3��#o��ـr}vh"��h���wK�{;�b�
tB|'z$Җ0�m�p�\��#�'	��o����Q����ݣ���^ʁ�/
æ�aկb�X�X�Ř ���Җ�w���3�y�ޡ'�PÅ#z�0P�M_uQ�,%=�4ה�H�Ì� �<,+D�=%"� ,��
>�C� 	��:�3C�e�Bp�R
�-(
+�N��a�5��e�##���p���v�W;�B��
MhJ��X�6[�xP�a�IF$�v�=ĻƂŻ��P�y+�������f��B"�R����]4d�ʚ����ԧԗzx
+�P��q5Ȑ��q!�ܒ ϸ�D�
�s�����P#�8�G��ݮ8޽� ��
��?� ���)�7Ÿ�ey{��4
�t�'U�&w��W
��S�,p>�o�U�)b5�|Q�&{����t�r��}EY��+;5�}�{\+E+��]���
�ۗ
+f;�	���S��X�ɍ� �쉝��]ѫsU�AT΢6-�d��a�D<�!	\9r/4��)�ߥ���E�f&� �
�l R�Ma�y��5�&�x�>'�^}�b
�PyNl��~��!�
�`;�n�C��~\ d�q�*�ɽ����t����5I��O���Xtw��ٴb�����ԝ��v����u��b�
�m��h'�
�c~'FC��*�1IMȶ�2�4,�9|��k۽o�
��L��c�%�5]_#r��iqU��ذ�������JT�9��1i��€���_Wx��#cN؊-����Y�O��B�*C�g]�]
dG�x�|)�C�y���Ե�ۡ��")nQ)����},B��y�G���l��
$�-+�:��� ,D�������k���
+T�^ ,
��G#�\v�ΆXn�H�	��0 ;�2�gI&Y�cI���|^p�"��j��&}�vn����N����0J��C�*�����ߚ|�j�EC!,�t��o,�蘁���Ϻ!0�v�@���v��U:bW5$?�c��Z����3�!\��+0⼝�;A��v��1�{����

�LCQ��z
(J$%<��K�k:���I�	�y��5ٓJ���PhEm���H�T����
��0)�IrV����=�ϭJ
W
����4
+*E��(�%���j�P�T���
�v�XmD
+gF�Èv%F�#
�I�h�wܐˎ+�\QB�r��7_2�?�R�9[���D/�6 ����~�P=����� ���p�z�����9}�
QE��&�!-�H�)��Ad;5��&���9�2�.��*~BX^��h�!Ǡ���S�+�Z���V���=۹�Q�͈j�
ؚ������+'�̒�p=BK��>T�N�D����4�
!RN�>�]6
+�'�W�
�5d_a�x�uo�)�?��m�z%=ϻ��:t|���a��$�`��@d�" w�z��8��sLiA@�!���o�

dշy7
�D�n
+����6��,�2A*7��������
+��H "~	��b�5)e�^�5�N{
���hlh�*'�\W%UA�
+մn7��&���ʈP�
������ُ�	J�x
���
�M[�(���h���8�}C��]�[ 	$���)$Wt�h���_�T����4�e=��k͜)�:bI�S�5�c�/�-�/��0�ٕHAd�7�kA�|<ݪ�� �i�24\�Q��zQ�
��㡨$�~8H�I!�W����ݛ�6W�S@���� N�YI��,�\U@��*��-�}B/���6�Ġ2�Q����~��
�(
y"=��p�yMf&��R��}���YJc��
+�4H$�쾎���Eɮ�/ $��Jn�C��̀CD���3��D�xo�3
��R�xjΉ�g�Ǐ���(n�c	wc�C�W�I��DX
c1�Ӟ2;��E���z/!�i�R��X�r�����
+��S�*y���B*b�u~��k��%�M�j�$h�͟1y�~���D=�|:�
�A\Q���hR�|����z'��w�+����wH�<J-��)�hf4����7$b̡*����
#�Ku
^?ҟ��<��-�㚇)\���/
���G� c���J_���=�w
+|�1A�q�ۥH�D�Pȧi��~8��9�u%^�� �G!*o��}��h���V��rN
�<B�^����)��_{�Ǽ�}�<��D�N
/�~���U��E����Pw&�\�J��<GYY��ʮ��
��=V�
���3�Rb�nG��]�7�`�p�U�����ɟ�AU�W9D˿&Mh!lL!;E��SS� wH�-X�p��1F�CJ>�0M9 }�
��ȟ�G-�6
J���$�7�s�
D�H���W!��}�I�;���zŅ_� KF�P
���j�|����\܂�-9ѕ�}��l`�hbv��Q���A�O�w6�+�L6L_�|�
r-� {�+�]�8k��
� �j�U,6�����
>
�v����\2R5כ0k����%E93dU��O��
�Z�T�m��ޤ�ГWk_5+���tgj�8�)�g�w/$
+]�
ű���Z���;�R�}V#tC}�R���&.�>m�d+�K��c���d�j��3iF�Ð�aDy�(|I�@[}(����������yx]�y�udm�"�H�.��
�·v������3�ѐ(��^�(���z�Xh�ꃓaX
5qTM�=5�Zk)f�O’E�=�1�,�B
�b
���8'��EZ���*$!(��"q�X�M ���&qQ�R���\��b;�R���_�e v�
��_u �.9��Z@�( �J�����Hj]Oj}H�����z���R��M�pT���}��	#�YS
10Bf�>LV�
+ӥ�:��_�cRC)�+�h�\N<�B!l��Z�S��
����T��6Y9]�D
+��-��s�Յ��
	�
 |Y�g:�C|I�����V�H&����k�g���`���x��i�̜P^;���9�
+Ƨ�����$-��E7L�EG�� 
x$)[�Q�JCiw$��tK�U�O�hi�!
+�"�w��b�#�Nq"f"��F�� ��LrV�w�JHK׫��L�_�fԛQ��Qk� ���E�:��TR�4z�a�M����Y��g6��L�-{�(E4�|-صTGw�0S�k�Ӣ[��(+�AG�y�N�@02`QU&?m�y � o�$�_�,t*Au� n<Ù&�t��&�b.Ui��Gp������Q0 3�刡G5a<�Q`/
�t�\_�5ǻ�Q��U ^�[Ɣ���.Le���p`��ɞ��8�w
���+܍�=kv�ׇH���ۋyy	���D���о-ő�l?8Y���A��vd��/a�ey`���ߧ�C<�X�Z5���ny�Ǽb��V��d{T%�v � Ϯ1ፅ��g��$����A�M��To��{�> �3mW��4lVD��čz�<|d`�g��%%}T�
�ʔL�WO��(�ϓ���c������	>Uo�.��
Oj�WD�D
�z,�F(�9Aw
+�E�W���_Y��G;^^����¤�?-��$����\�V�{o� �����
]�����+�6	��c�'����˰��5��y�<
QZ O�D�cR=���.�^��
$S ��׈�/l:ۉ@��2��LW�K�yD_�>���3�u��<�(�"b
�� ��d;�~����}���s�L�v�ٯ�2�s�)s�n���X�Ƥ:c�����
�j�3�L�qɠO��W�9��� �Щ�dk�g�굄�6m��Ϊo�B�$k^���L�4�yr�0G�����1c���M�*
+�4����h #�=A�-e�n���;��߲�8 at F��6;8Hjp����yi9h�2��u��pNDq��8�`?�'�k�=�a�����`z��w4a��
*�Rs,��f
τ�����U���WΚ��FmF%�������%6{��`Dz�//����R�$����#�(��L�B�=w;{���Q	���N��N䦲���{��
I����ՅuL94�$c�0!"ʣ�"ʉp赏Q��'���}��1%r]w�c�P
E%sk|lt����x-wt�m/aF�*<g:*�������HG�V��[U�GiP�1A���
��ѥ�@�H#�
�0�Rs�,��9�|
+�ij��U%����t�Ш�U�_��'G~w�$@еx��q�ր�P��a:�@=*,֩3�'�
��9��]/���J����P�ܨ��	^	i�OՑ$
y(��o0Zw�����������`s�N{�
aoPU�:��җ���o�!8����D�\~�Eo�r�}� 8�V�fr����/�5��2�L|��ȸ^��|k#Eu�d �l9�)�;z=�g�RaL��@�e��`��p�(i�%���cu�R�����G\�U�s@�
̒ώ�QM,oh,qb9ݸ�� �^aKጶ���I�E��U���C*��}%�@m�)$8�_1�����
N��>�n�+��Ͻ$f_�ˬUM0�c�(�ǁ:8�3��W�a��VH��D�@{����׏�Y&G��
�Z���8���0),�#(k
+�-ee�,�[��qȂ���z ��ilGTh�#s��Ka�4#¢hwi��,ή����
+M
���_�Z��~�D�
��YP$��DM�>���
Ŵs�@c����D�ځ&�/6���t\ɲ��Æ
i��.Xo.#�CD�
+�gz�H�2��]�=�gg�t�
�pE�����Xj�?]� ���'��n��C�ңk�J]����_V�}
+�MU:��;�.��6ZZ
���j
%��x�ДO���3���k
E������6�1�r����E���
������x�t
�09�K��s%z�n?�`�;�da���I۫��.g���l����	d|"�Ӕ��/�t��#�7r:a��Q�E�c	i���C/)v�'�����ׯ�"#3yjG ��Il���n�SPm
��q���̟��CG�}`�a��_�t;R�u�;/x^�ZG��H����.�a���- S��%���v�Y[|���i=I�F��=�DZ���]�w�!]ov�R.���
+vv�O�%��Ҩ|�I�
z  ��:�� �&xN�R�DP��1N��x{6�����i����n!�n=��e,;-
��x)|����Ur�^b�K�=�D�%��	�
6OI�eA�Av1}�!
+{��s�~L"v*�>P�<��蚒�V$����+R-을�o��j���W��<�	Z�QV���d������p�j�5�a��/j�QL�_+�rL�I�
9��?���Z����d���hG�	�P��v>���M�}��j+(k�3��y;�P�d�~G��� �l�;".�4
�8����I)-�������8��CGY��ؤ�8�x��J�(�O���#�Tp�M�����$�=�/Ԉ`�<�����
��y��GV+"N�`w���X'c��L������!<[Zq��q
�#$�
�� B&��
��8%��D�����y�XKx9�$��8\�V6���m's�0P�
��)fz�M��?P�>�2֊>WW�o0�G�w�C�Xm�G��N�
��
F�J[�����:8|+�iK���l���X����^���?::���i�@���P�O�n��y�\h3Z�ڏ~93X(ŽH=θϘl�/���?���5A�����
������e��G�Ϻ��zl�� ��2�b��[��=��y,��%VH��
9	���h��t�*��wP�X���+w��p�5���qL|�ۑ���͙���
�E�Q�&sU�(�c���5D���\AP<Sp����`H�1Z���

��R�
F;�8.�G�Z���Ⱦ�,��ٞ�l)�q0B�Ž�m�r"�w�-��qF��E��
+v���%��5�,!�dI�B�'1�
�
,�g�7��L�8�P���ei� ��bjT8U�t�BGBY�M�g��*�\��r&z�����jeL���b�Pz}B��� ��Ǝ���p�[@%���
)p�D%���Uf����F3��z�SF�"LeQ,h��#�KK[� ͌R{���	�U�Q%�!0O�;

�h�ew�E$e?�����݂���c�0qW��w9���{�Aѳ
+� �\��ڣ� zOl �D���LG5�Fɹ<?
�6(�7�� Mb��j���=`A�2�14|O�=h��3
д��3��5[�^�r5ҡW�#x>𰀃
f�,
+�_i���J����v[�Ub�:���X�
+�y_9>d���Lk(��k���s�
+=�D��"b:�[+��Pv:#c�.#+N�4��:�1
+��
1o(�h��
�ZF-
� �!�6.��
8�w�7xD
W�&�A����0��_
(�^��L�����|�B�va
4�sM#��
�� G�ɘ��x�i%�ndD;4��=?|8�i�C�H���v����������g�HV�k �'�p�q$�Jl���\�НxoRs�# Vߑ!������
�����u0`:6Ǻ�>�]/���50J0y���vjK`u�îMĸ"�Ŕ��
���|ߗIs��q��C�"x�]Q;���G]+	�^
�i�Ύ| Y{���>2x���x�
�
��R��h����٥[��!�`K%���gD�����9����� !�t�i�Xw^G� ����D
�_�������; �L����+����}2)
p`�Ѝ��|��>�|��_F� a#��B�~�Xg[r@ۘN����#EKTu
!
}�$�d�
]r���3�(�ySO�m���mng0W-/���_�f���L]S����A�#�Zg���8g
+�衄6B?r��Ž�r�7�j��njÜR"��5�f? 
bS�A��N�����hG�~��P��4is;f��S�e�:�3�B������K�Y�
_�q�%��i
/��˾�;�<B᣺��epE�<n�M��X7����K}K����Eu>�6�����E��
�?Gܨ�u��}�}9Lv��uM���ma0IaK��/x���G��i=���sq%���)��L����M$Y�e���k
1�@:~�E)�

P&#3j+x���룕�
A����_�?�_S�(*�V���Do�� 7�NVs�
+զ�Q@ш�~w�w��T R���Z`J�)(p��3
���E:�a��בv��$�
:
{P�6�l۵��8�$x�^"� ��5f- �k�
_��䑚v��%�Č㴀�h*ѫ�纃d�}D��z2,�a�~F�B��?�J*`"E#"���F�(
+4��-�(B*�Wy�f����
K4׊y��p��N6o#��Û�"L�*���i�M�ytuh�s�0�\����E��̲��b��fNx�"D��I��ĴL��
+!�;����]$�ҫ����bB����Jv��-��L��_��؉QY� M \
��T�D)�ɘ�m
39[���
�� >�U?��xZߣV~�aB��/0Jt0�n�4E�,H
�L�@��f}F���K�]�k��*>�s ��oZr-�6��i��
62���췉������k��Jϙ�\�U��U͌[g"-���T�����\"}}�����9Z2���vD?z�Z.-Lc{qe�
iASP�o"A���%.���0LJQ��L1k���"��Ԟ/�
���{A:�r3�t��;I>w���y��O�73Z�9�i�*p̽4��
q�����/����렄J��7��wZ�����O,0�����Y�^���{ʧ��k`6��Acm^�0�> �����/���(����>U�fe$�hu�=
��@;�	hBG�p��8�E�p
	�; ���.
�U�VGt��?
����vQ���˽_�Q���s8X(ʗ�D'ر�x�
EiU-��lچ�3Kl$��2M:hu] [...]
7�9@|V�{{��S�P�i�B�%�F{�W�Er�q�mq����8���
�G��V�����+S�cf�
�m2ۯ�/nnu3����o8B2#����w"(����h��
%ܯ��Y0�=��s���t9�����E��M���� ��s�_
���ʣݦ�֡�.<G���Ȟ�>Y,�<�,����ᔑڿ��
�	r��)@yy��IlG
1\@��L�� �-\'[�ȱ
)�Ug6��+��s���YD�h�M�FA-�do)�ԑ�ʀ�g���;�����.�]L0vD{�F=����\O-0�5zd�����2�.n��Wr�>�	a�z�ٓ�|�������;Oa�����r7[�٘?D̓����Y�։z^ґ�1�c4�]zZK�PgǼ��0e<��_]��~���ɟ�FPDp�t�ЅZ<���X�~�1�
�P+>��
+�vc�4Q
Q=�������Bf8�!vbq��
���~��
s�� X���3���던�����+���C`�!>p+��Mn�Q�!B �ZQf�z9�"̬��z�^D<嗠�yb9�
�1�A38�c�7��l�@�.�
>"���~�~���AZ��c-���t���
U֐�c�[7i�I<s���u����C#m�;]s*��R��H3����ٽ�S�5�������[��&L5�
D�<����T�|:I?�
���D��;4��y��������լp�f!��߅{G���3���@�KD�f�K~��b��j�zX	t�Q�d9���/fT"��D�
)��NX�
d�_D�G�7�w��t&Q�0��S��&�v��� X��"�`v�м�uQr)��R���
+E�*V
�d( k�*
�)�#�3"7��GW�����<Ε	
�����r�
�Pl��o?�{�cB
V��\�v�|�����ٛaq����z;t��
�:š�����q���-��e��
fC���� ����:�O��#��G�lgwy�#�sz��tᾄ�z,U��~
����WLz�7���q^�O<���n�+��<����,�sN����w~V�'.�����
����0���
�}�Cu�%���uG���h&J�
�D�rv�9|�V�#jN䃗L��H��*�q����WiE��;��� w�14^b �<�J�<��)v�� ��c7��K@?M�ty�?L��g��Ȣ��za�
|(\?#@�1ٟyΙ>�,���%�1��Js�DXI��	�^����T����K��

�v���k T_�
(Ex��Uc�������J�0�X��:~Դ��>�,��)�v���+�X/�����Ej~�q�a||f�,4��^�؅�c ��RM�88�4�_h9������� 
+�
��Y�����2~k�5TL�t,��ȃ���~>���%ş(�i�?�1G����܇��ܞ �z
��nDLӻ��{��,�ք0�����'㊯@z�˔�l6�V� �~�x�m��r�Ǚ����w���E_ E��?~��!��l?�]���1˅�*��E��-�N2I?,c;C���o��o~�x�*�;R_�=&XR��D�/���^�o�kH�Z��r��Z�~�2�8�#��>k�ߩ�7n�G�?���������LY���5�Π��
+'�H<ZA�� I�z����D� ���*����������D�5�L���|y4]WxPS��4��Р�0������F�z��)��_��0B��~������BIug��%T!��ȿ8�QkS�D~��p
�l�I�`� ��	G��-����V��:����޿J�ٱU��
� �
�&p�zjڦ��w^��+6Q��zGM
d ��� �" �	�f����g��qO�~?F����~���'���GrYy��".Q�y{�����F���@�����E��kB����Ӏ�Į�s�W
�,��'�d�H�.g� B0
+�v
��"��������Ng��L���ޞ3��0�ҎFsU�+�ǽ��� �d��.�x��T�2�I=9��؂i�����\Ǹ�
��
s
�ƫΉ�L����tA�T㨙
���������
�bs���
��l"ʝ^P�[Ҳ��B^��q
�;���UAX�2�� ��/C
+=��l^�d%'�� �-\��ǎ �DDR
�+э�zz�u�a(#���
y\,�pJ���y�ڋM�V�[�bO=L������W�qG��J�f�t3��M�S�,?W�Y�g
7F�D
��~����.޳4�,�zpOK+��
���6
h�Vu5�=.\'
�E���
�v/�s�2#�)�����=��A�̳�mT��^��{��%}����3�[V]�ě
��a��Q��vM�a��GV�
r�> 
y�ӏ�<�H��?���"{�b�����tg/+}9��5� }�"�[)v��`��ߣj;�k䊤��L���]!�R�k�wD���|��SJ�G�g���wvkň1���w�t�PI��{vV�4K���nr_��qj���Z���!Ñ� �u����
���q�&�Dog-3�"K�f��bX��d������[�
�b�$�j�Du�N�
���_^H��p+_��޲/�(Ȗ��^�֡5���r�
+��1� ���7�{R�����
��%��+2F��}F�+���/��#H�=�D��=�9�EeӢK��'Rz~p�����{\
)z�-�����:�e�@d�
�
�Q(��w]n2�
Vk_�T����o�����]�M����QG܇
�^�Y�H��.����+-�r�s�w������a�a�^X�C�YB�X����O�yn�㋹3�"
�D�}�<"�����$ з�NI�<��v Ư�c�u���:%�kdQ~�~�����ºC �lOk
�&[DU��6��
e����U]
7��H�k|U��Bt��h��~�F�ל�BX��W���x��Vk��ף4��t�>��������?����G����ȡ��Ѐ4�k��'��M[�i��wݰ+d�8�Y���R:��ψ�D/}y��ǁ�
+zt�r�Ÿ
~��
x��o6��7�B+j���
	�J�H��q��`

+Zs �kf2�^�DP��%�EPu�D�Z7z��M����!��r
y{L%�sS�ߦB.jjϗ-��΅q��M�Ow�Xa9 p��ׄ��>�Q�
�_ܒ)X�w���T|f*.
+�a'u�½��M�Ѯ��1� ��>#R,D�QC��<?
z裖�EW۩u�Ba�� �(�����_xzF	X���;.L���`nה�uf�������0�:j��
{"��P�M��0w��!=�	{���O�`f�	���q������~X������DD���G�
ʗ�K%������K��~������b$�C��jmX/�_�#
+t�T�~��Gy
+��+
��J�*|%���
+m���z�*g��ף���;Q�z�
d'W�D�xh&�3��Պ �{�I��!OQ�Σ�
?��l���[�s&�q#���P���
2�T
���'��[|)BJ3t_
!:��.}�����4��{5S��3p����YoG����
��
���e
��v]Lʀٝ��gD�TD��# ��8�a �����{	��ܡ5(�N������c���^��Ԉj:>�z���F��s=Oxb$�l��݂̇}��N���	�Χ]�Ȥ1(�l��k�ETG�b���r�r�
��Vɂ��,�x����/1�;L?VZP"|@'+4q���%#��Z�#��BR��e�K�
�׭82�}S���w�t�I@
5������r�o�:f������a1�k2�n�d�#�,J��T՞��߫֌�?��]p��Ww��k~�:L����}ۃ�h'�|X��DaZK�E)�4<v(����� 
~  0��� �r���G'�"�,�FK�B��&v�]
a�[ċb
+v
U��(�"ZjWRc
���\*`��"
�j�����!>{���T�9&-�% ��j/�z�x��'�+j���Q���M��O+�59��Htv)�\O<'FC�cc�=$�<��	�z�O�����0��'��_���/����������o�������������������o��o����7������o��������������O����������I����o���������7�qq����J�����O��2s��/��j���E�`hY?^���򴋢�;Q�iw�g~FUu�P��L����t�GU��J5�:r敺�~�x�
%�h�:��UT�fz����Ps�F���K.�h�"��+�:�|ES�ң��#�%��tx/�F�Lj^��i�-gj$B��>F/g2��	��O�`�;�*������l�@዆�ם@�;��y&B�D	��Х�/��V�<�J)FV�C�]���!�"��|�SU�T���k}G�U��L���Qe�����T�0�ij@
�ԕ�
Z�;k�k�[���������Ɂ+H��;��+^?J�����k쯢 JJm��i�LiP
�߂�@!�F��	�\��P�47�Fos
�iA�j�_���� �.ំ9
+������@D��9��u|WH����/����ubiC�.�z�-Ks�\����W"O���wl,zP��[m��`�U1�e����j�]�o#N�v�5�l�s�b�
�cU���o44؛�e�vN �;u�?G`r��
b�������q�هA�A����>Q��؝*q"�W������'�:M��WOv����f��,0X��8�zĭ"��Mz�U��DĜ/���K��(˟3!��(^�=�f�W4֣����T4���u���
,�qd��w��aH���Ћ����)l�(��Ι��6�k{D�V&���T��F�����FXP�?#���V��7���#õ�[
n^���l���v�����aa���_I���#<�x�D�ׇ����hHAM@��ew��Oz�4򇈟�� P�����M>�I� ��Q�����kޯ���N ^�w�B��g�	��A�^m
����}�H���&�70��.
��|�"5�s~�&���k,D�Ky\pS�w�
�q��r�
i0?�uR̖�C;���P6}�oK
F"��2�+��& �^3�2�@�Q�,B׉�g�6_~��A6�U`�tn��ב ��n�#
�
�r�m}F���M?�~�S����m
F,����J����y� �R���Ft�
���qR�F�g�{�D4M�TxN�4�<��I؛.����H��lӮ[Lx��
*$��xPm~֥n�uj�4���#�Ei�X.�%{����r	|�eJ
����,z	_h�wF�}+���� [...]
+��u'j��4��V�B��
��&�S���SB�$/1��1b��)��:�A��@c����1�H
\�u��3��U;�=��[I��߾�~8��+�a}�;+�	�si^�

G�n�-V%E�a27O�g˯� KT3o�=5S�cF�q��|,>t��Z.��]z=��@����YaWz/%�KP�4�}�i	�0E_\�b�J5� ������y�"�lL��.�!P�{��JNw�p��R��G�Y��W:�j�߫���
ܙ��5��FT
�j2���
H,�a�?�6�vT4P@��<efB�<�_<]A�}������/���#���AT�
InwaG
"2��EyM�J���s��`s﷮B�cK��+�o�O����^��?
�5u��9����18�e�Γq3�G��%k
b�zݼ���
< Q�<>b)�Z�J�/��[(�wqgk1=�6:>8	���F�1J �\
�h�D�~��ë�)'t���2���S�bڛ󠥉0

i*�֛��
+e
+���N���*"ҩ�|�aM���Z�
�
2�˹�Ə�����q&��y��3��Ծ�q�1�ޫ����-�:�yϾ�ĺ�vtq�-ATz�����������>��H����}
���S*�s�A��Qp�gf������m��u
8��)�r��U���z���h)����
+��	32=T{y��ҝ=�%���-����z�
�s��}�������.��4�����֨������@y�Y�b���픶���\�"�
�Y�#���y �I`n�Z�P�$J�Nh��Xn1�ȱ�5�����R�Ἡ�G�3�5�(@�x�H�+)

X�pt`a8���q/�E�����V-�ܶSt�ǡyb��?횇J��C �@C���<h
�Q����}�ͿU&�`@[��bw
����"�m���5�B��t�m ��-h��< 'wr91i�P��zPTwB����r�$i��<@��\#�"��~�llr�k +M��Ү{24̐���^����i!������bf^��&��EE7�����qc��g�;��|p�� ��G&(���%��Fc���!h����!W\�d�?�
\�zM���m�4�����p
�n�L��8z�2/c�����tmC�p���Wl�:#.���� 

q���̙�
�h�D;[jy��:��a}"�M����"7QSˎ��8	z

u��Oa�*���qoɖ��ї�П��D
sa2$?
�&T(-�9_T'�-�Q萰9�����|(�{�
�]�����ʈrW��=%��"
��'�4{�g�"���
ph�:{>orE9��iWd�Rz�+xd`T��
����v@*D��O�v5#ȭ�7�7�M�c~
+,
�J
-��X�{�Iy5W�Gy�t�\u=����;ȼ��ûAH�'A+�
+f
��8/ƨ�[^�P�}i��] 
�8]F��|�]L��A[��N��kO�ñ�	����c�tJu7z��t�V�ٮ��
�X�;���+�9\m���lW# �4_D�W�����EN�?����D~�ٻ�s<�z�KG�nf� �����!��CĖ.ɋXX
u��S�
+��n�
�<�x�b��Ex�~����D���qzQY�b�>+�ʩ�#
ۚ�`0��#��;z��V3�}=����+�|8���c�i�°"jV����#�/A�)� F<ȓ�"2�dj\
˷�@��� k��
يE
R/@���	�~����K���2
21?�&5�+��ȵ����0�4�>"RT?���;\�\~8ή��
 �Ex� \-��E�)�Qm�����9��(qT�,�,:͉V���H<Z���uq|�>#��m�H��rزy�7�
A��
�������bgxA�S���f�5K�F�y
@-v|".u$�-?e��j�N3�≠'-n���jWw~O�೰�������a4h�]����j$�
l�)%i9�(�S��RNTdT���5pϢR� �#>�8��F�K�,}�Y
���\t;m������ϻ��cΒ$=>�8������kw��
�#�*��k����
+�|9�xG}b7����~F�
q_L��8��ߎ�d��@�w�����`�/~��
��[������A}I
G����B���d����TH��x�Ѵ�=�)y
���.B�JH1��l�%�7���:�G�� �[�B2�Q#��^��yd���Ҿ�����e��&�P���<iʥ������f�fO�T+XM�_$��u�<�}y���ŸZyij]!;������*��K5
��1l��z���+Q�
�Bg/���Z��|
&F�?8���}�_�1�8�GՁ�ޛ`4�o�{��
+�J�����'D�����
+U@��"Ŕp�KW�����
5���q
t���
t;�
���g�)�V& yƸ�ڿ�B�����
f%}|"
+lYUP(�=�
�,�����]���I�g� ��01���I_W�}��݋����C�
����
~h���.���6P+�aWQ��x�p��GT�K��O�W�`� ��ˎ��b�
`e	�ΏN��
R
W��_�G]g���f���= �Xsd���<]Q{��i�i�^��8��}d
f�N��]p4}�_��}��=~�#G+������5�^
f

,��l6-�WO�u��(�T�	�
r��`��
XT�W�e(0������hE?��a�5������
�dR`��� ��`�&,,	�)�->"~��GEm�VF�_b疠�#ʥn����^�J�'�΍��/6f��i�3]�&4G�;�G2
��>�u��*�W�s!%K7����� P�5q��Eư�؋T���)OyfQ
+�Ή�Q�G�}�6�Z�n���
+|m�KLj3H����f@E�YW:�Bv��l]~����RA����!�d�9+y"��O�sD�������D
+�0T�wt�/��Z��4��%���f
+m�xQ�m��'��Q�̙v��K���"�
+,���Z����G-�Z����0 �r���:胝gH�� ];e�j\�����:Ou)���G��5g���8
<VM�g�w��)�%y-�H��@����=
Fx��9�d;��=
+�,���r��:��
�
�F$N��؛Q��1"T��XkOċ̈A�<��)@79|
E����[nM5
J��J��}?;����U?�)��@�5=|�+�vE�wڃ.��u�������ªH����P��a�"�2"���n��0�_��2�
�=��dc��3|��d��XT
B�
�H$��<�枡�%O��y�����g6�3aP���KG��2�
N��r����d���وdk;�����
��h�"�y�E���|�Z����L�P'��a��q�x?�<BQ�4l���ʥ]�WS���A��$6�e�/x�
����L��vd�*�������u�r�9@"�
%D

@��N?���̹�XԽhF���s����_W�\�|��
��?�JF&�lF`��[h�݂�� 0{"�w�+(o�iTcį
j����"��3�-�LCњP��6�_��D˾�:S�cU�a
�"W~Dk��y �)^��L��_���+?՟����NMs�;�T3{�#��q��!
EF���h�����Q���{�D�$�����kѨ�����8)��kal��&=�V��1[�ZB�,�!�y�����k�|��
]�p?����
~�t�F�*�+λ?D ���2�?��w�b ����U�:`
�y񼟴�w%2h0�Zn�j���]�wHeӚ�v>��zD
� TO�`8
����SD\�>�;�}N��l?Tk�a�b6M�m
ꖱ�ƌ_� �U����.[{��M�l�џ���l
M�������~���T:�Ч�Z��4��R��ȏ�-m�<�9�d
y��(��XL�� �~
�����8e{��1]�r׹\�C�D0�FJ��ׅ8?���BE�"�|PpN_tn�!HHT�P5*L*�
�;�PT���A)
a�+RKv��Ȁ�Z"��
��W�ɤ�C��M	��
��g���ץd�P��\�^�.@
S�T��;��(B�����GB;HЦQ�*��7��;΅(�5	D�����w" �L�����?~��m
g5$�8'����37΋��Z$ãDP�&&�r:�m�ك �K�>!��7 �5�d�9��
+��߻��܅}&�ո��"�!ke�v���RQ����aK�+n��V�$�A��+J��!*|D���J��7���q&��KPP�5*�+��f�=e��I��Ϣ5Y�5)T
x�c��
��}�ܯ��D�Џu�{��jifsS���q�m�پX�F��/��*��~6�?�����ݯ�7Q
f%?uy��F�@��#�-
+�px��L&6������	���LY���MA3�
;�*犑�g�yTɔ�H@�S�[����� N/�勑����߽��!�Oh�2��9�'#-؃�^�$=؏ 
�ܕ
Lp��-H���#�
`l�S ��
�x��+� A��a���b�hqB輕��v�0���}���	 ��!Z� X���PJ`¼�2^O����'r!� ����iz#����2רe�d
��l�4�IQqX/o�Ǥ����ʈ\d���h�5�<��4%)�ж+A>*	�����[D�O�@˪���S��� *5w$�����F�~	�]���3}D=�5܋ [...]
+����n:�@�jx��D\0��gDN��
6(*�������N�� U1��)�=x�+�S�u�������ݞ���=�ߟ�q��/��l
́�
+ at w�FU���\s��QN�c��?#�x-֭�1͗�UV��=ўُ�ay 7���7Y�*��Bew���Yx�
+�����y��C�V,R����Ř
����ؚӱ�
������N8�E��,�i�
��j"���k��2�kɔR�lv^BON��CP

�
+h�y!��ۀ+D|^P�eƫ1�^&{��yC����3Hd.r�c<6`����,���L�y5���	 ������V	Ю�'�TA2f��� ;PQ�
��*��F�m?�[��s�4+}
���A�����
���
ߞ?D��0�ߗv��Ϩ+"pQ���������2h��꜑�fW��q$g5��eW=�L��G݀���"�y������ں�����
(���^`���tގ�Y!����]d
��q�)D�R��A8�rF�!��.�d�a^FHK�H
�
�>(���*)��&��qr���h
� �1H��A�e�
�/Hw�4�0��.]ۓ��*=�S�G@�ѐu1�+����
x��Ǘ����u�	UP�4?��b
�B�wǧ�JT�L��A��s
�[�@+�+�
"y\%�1���C`ڗ�Fv�?�*�v�	���gW�
2
��r8�[4���F�'������C�2+]�
+(����]�Y!P5�a�]"�8N�A*�c]�h
�uJ#��H?����T���&
�` �M�&�]��>��1
@����T��`�e'$8+K�D��
+�<�*q�����
It�*����#zU��ͨ�|���������­���_� �S�Mm��kp�w�b#�b��1�m��n��QY�.��7P);:����D�u%�vj)�b)�Π�Q��0� �<�'qpu�@�ǸsF�	7��K�s�`�h����O$�wbԻ�M���H�Mi*Z7�9����f������Q��_Fh%Ҡ�����Ԭ��9��fz�u
����+�Ȋ�]5n��C���
�	�t[}A��m�(p�F-�
+5X�P
�À�Z�v��r(��@y[΄��\J��B����/D��Q�,�u���@� I
t3��bG
�)�oUs��� �"�_H�
�Dnp0J�ָ�;�ma
�(�h���\��"(�l�U�3��r'�n/L�I2���с"�2
�+-�x~wF5�i~xXѧ��JѥC�{~6Xj���9^�{�<����sS��0ug�0U���_����'

��8A�^����� g�@�
wnC�z�M�f��
2~�HMW�r���ȁ@%v^d�n�~��s�H ��>�a�>�Q;O�Q��d�u�B�["�O�$�K$�0J��I�G7������a�|�]�è�D�3��9�_tb��
+gM���%e���Z��sؕ�+y�(����:�u�
�_��6)j�7B�d��ۑ�:iyo��f��(4t5���/ 8�oF4Yِ�|aK#�8��x�
M���c+j�С��D���-�뵳/�[��mIj�V��	��4�U%��7�O_qDN�;nH��nj�d�;�3�W������ߏ�K�:XH�E&���
+�e���눗��䆣�
��	���?$���&�y�-o둾zX��?����(�/·��
���?��#
��:"���3]���]��V���M�u�lc�M+^y8�ۖ��X�Q�s�9+9O�m�
�q��(	p\]d��3��
+TS9"Ĉj��&r)��$h/�D�b
��>3�{���vk��;����V�<���I��y�tx�BD�#yR
�7�����I�Jj��@߇-1?�5j;�
��I�^M��
)���
�s�ZB�q"���!��2F�`& �ݜڊ;W`;/zxF�\�Վt�*���:#ǀ��#{�o���8PL[��z�R�*Q��h������H�	��Ӆ��o�
*T�O���
*[��X#]�`؁Cs >�.:�����޻1�)$5g��"�
������Q��ߍ*ܿ��M8�W�KY04��&��;(��B
2�w��������]���A���BM��z$���z�c��
������2�ӅJv���օV
��G�T��t��lCc��
��ɐ���0!G����SB�u����W҈��:Vǽ�%��������A?�G�)���#�T�`�0B����}���<�m�c ʑ6���
+���z*�z�-���K�͉`�$�W��
&
��Mr�~��}K��
�[�>J F;>]�u���הj<�����7t���D��g�Y�L��ٻ��ť�2%�Z������^qwvb{5���Lx

��wk�`Q�.G4����l�CY��2\�5���{�}7'�������RD����}����8\E�j&|	�
�<�9��<�k�a�BE�!L�IS�E��i{�5vC���'B�n�)���ug?@�����>�
+�"G��.dgu���ة��O��-ۗ���5L#�TY�+��
��E
�'Z��F-�G�P�w�m^���Y��8k?_�<`���*F�
+֌@&~%@a��@xm�^NM�*rEL'J���b,���{�2̋3w�O���]�0Qm����������bgȳ �Ÿ��_ǕXIeF\��Z2��#��K㕸2\�5��-*�\�N�{L �W�Rk��#>Z�
Ɏh�5e
��H�}��c��^�i at V��9�W&�=�!x��@'o�����CA�#z���L�����u�_2�ܗ9�γ
S��!䫒A�U��z!�7iY���b�G���^
+�w1�<#�Gu�H�3XN$��
��
GF���z���Uv�+86��
�ׂٛ���9Ɣ�Hv���-١V��i�%�qŚ?1�5ǫ�f͚��"����.�'�z*�3�S�,nP�PK �
�E��'�c
R��.U���b���6��=�Œ	���S��w�\��dDfw&�wH$���(�~�|�?Lm��eM�l�Dw߱4���-�]
S��H���ĥ#8_qp�N�/Yx;����@�w� f��	PR��KK�uhH=�?�3�
+�A��D��'����#-ԙ��-r���2r����}ԧQ}�C\|���?����\�Z-g2��+���Z��	Յ@��4�:ƭf���<M�W��g�%�P�*�ӯ���6JS�;~����؇S,:��q8g/$9���z��|�m�ڃ�����T��ڏIW��kVTB3e%U���6�N����%� �
f�FR��>� wH�O;�I3(mV������%��gi�
���y��É��0͎������S��DD ɖT"�� C���#�_�j
�R�A%�
oO�J4����~��E�O1�
+3
��
~ᯯ�i�\�9C2E\�4=+��Q;���
�c��;�fT�[�2��F���K���gI�n��n�2v�%�N)���.�
{�ù���s��{��h��P��
u�
 ����\Dz���<hX����.L��7f���\���ҷ����)�Dq�?�
��M|XX�_��牍p��z��;l��F�
�k�nJO������*�"��eU�WޛW%���b5�H�Xϒh��
#� �NC��6�x�>�#5x?�;�o���$�� ��`�\��R{w[������dQ��(�(8���F�����M%�
F��^��u���UC�)���#6���P�)�z
+~�md�
�#�&p����/�眩���
��aDqK

�����O�S�|�0_G���9erF�:�8q��h��u���'�_w��p�b�ט�#���3l�x���J4�ͧ��p	7m Y���x	\NjQ=��
-1�6��G��
����+���y��[2??

endstream
endobj
327 0 obj
<</Length 65536>>stream
+Y/���ߩF�
+�e	�#�j�"~QF�]6��
�Y�k���!(�����#�K���
1t�8�67����g�
s��eW|����5>���#�ϱ+
�����r� ��q+�3f�6*����t�{�H��՜�dߝ�r��%�^��>4S;J�{y�e�۴:>��"��|r_���������\i+�Ѵ��
W�m��g.O.G�O�
��@�$�e�q�?�
���(��iPW���ϥ��&,�^?3���[9Ӥ�,�'�C���#Pnbi��}�o�Z����� H�u�䤾�]�5�%c-z��ҳ
+��
��D�ԋ9\1=7b�o��G�'�
Q��@J1���ѝ�Ӿ�$�}Gu��`;�Z|�CBl at Uըm�b��+B��7�:����ˉ��z}����}#�^����(����.�hu�#�%Ll�)A��U�Y�$wO���me<7
�
U��v��
�#5���n�8�s��ܡC9X����E�=���:U�U�`���R@��� <�k�
X+O�����N�~(��"��N
���5/���G�:�("
�(�<x����q���l�����5L���%�"LRP�zی@G�( ��rB���P�R0(�\��OxZ='��t/����
+U��׉gs�~̏�&�^^��$�Q�n?4
��挴:�hH�#�J���\g�@Y;��:�4�x J�i+H#X9[T�&�D5�c��`�l/�&ޢ_���]T�N{Z�Vǿ����7� ����5k$�k
0 �'\���\QsJ��?S��]P���bJ
+Dv�*�f|«f
=^8r��M�	4t��1<��|�����i�hf����
��l2�	�N^
+G�e�w-F��A{�9�/>�&�Oz�������b ������ǭ�q��g��*�����l����-��+����`��@�޼o�C��"� �z�Jh_/úEop?���"D����
���1��vƅX��}����dꠣ1 at V�H���,2�
�b�=�j�<�
�NI��#j3�l���׏Q�z��Ї]Gfڈ�F�_L�י$���O�N���יH�Xi4���J��3�a]mE��XID����ȥ
H*F1s���a�LKh�#����a�tfT����*t��@��%2@�wį����P
9'���*Ip���@^�ǃ����ڡ��]c.\�"�J��
�3LA+`��]11�"#�rbvt!<���
Pd�K�C��A���\ջW��Ƈ&vc���
+��sK�R�y?O�P�s �D�I�)4��
�	���^_ʪw�;5wp��ƕ���T�>b��My}[�� �R��Q�O��
���Zf��_�x[�"����׋�^])��x���W�^y��z_��>!��/� �N�\����T��Y$�b��z�v�˓��egg�
��fU�l�
0$�`��U�-݋O<���
^�1F@����6bǃp�I89⯨!4�ON�f 7��
�/A���]��b����)Ѩ�K	���C=���
?$Y�[�A]B�����
g ��H�����Fj�(��6���]�1��✖+�%1���Ɲli�t��Y�u��($���f�D�2C[m*�WH
al�xR~oo�0�uQsbL��o=���#+$u]"���3]��o�
��/ �
���@ �^�!�-�<T�'�i/CU�	7b�
+�ߒy��ǥ�
�Ѡˆ)��:t/@�F��J�
������Ԕ��Y��ǵ��(cͧG�qo�s	:����)�1�T��O���(���c�r	�N_#���:�3�:�
��sYzck�&�h5ۡ|O�2�0��C���R���4Wm3�ݙ:K8+.<R` �� ��/f�Ѷ��e�Mž ֭�«�v�V�1mʫ�R=
I9�L�"���c`&�tqf�>P�&�
<iU�kX�
�+�3{�����of.{���h(p��s
��2�
+�G]�<�e�������[xX�|	Y_2


v����~�/�'ʆ��K;|���Z�3�j�J��E�� ��x�>�D�	�>Dy9�
ѝ���ASw�N��
󩫫b�o��<n*�|A�#�R�
�ϙ��nmGid�$���>�F��U����Z������s��`���&��\&�)�!� ^d�{��T�S�iyؠ���2Z�#�ia?���?��������'M�4ڀE0|D�D�I���hN P����
��{Ģw
I�2*���'K��m�
 QYCԂމ�j �i���E
�:�v��Y�Xղ�������v�U��
)�Mz�����
k p[�w�#�o�x��-���E
�aM
}�a�c�� 6tx�5b�6
��&
&�9�k��3߲He\���ˮ%�VJb�d�xJ͝�.?��0�/f>H��/h
*?j���R	��頠"�P�V���G�F:��ZOMK�*xo�հԷ��#�E"��+�NpQE�E���
�2-o�1�S
�ƺJ�Ċ�t���xh�:H����mzؓ�h�p�r��n}���/N��(���kP���&P�{�W80 u���&�S�����'�_ f��r x�|# ѫ:�7���
�+,k��=�L�W2���t��T`#϶ǚh[i��$ή
5\B��m��狶!%�j��e���Տ
+������4��N^ڹwC�~�uQ��/���N>@7J�,�@��qՏR�}� R�y�eC�t�Dw\b����	��
+(u�D�;���.]̓��S�&�L�]®���'�&��@]��fdFAg��T����Ү�xPp{���
+d8�D�K)a���w�� ����
�Hѐ$��z��L"@/O,<���@y��Z�]OVy�UCIŒ�&�]S���,�?Yc�K�d�C��eЅ
��
����`s�q�:���
��/� 
N��[h��,y*-��+,�%T�#��n�#j l
�>��>���v�����(�ѭ���%{��㺕_8n�xrŮ�3'�3���|7� ����3�y����.)�� ��V2k,���O�r��5.��m��J4��L_2�3=T��Uc<Q�u���Z�RBt&��
�/[�8��
+4�J�t^H����A�1:�J�D�	D�-���|�=dnXxt=� ٬��R�A��'u��G�
����j���K��FK�u]San��=ڿ��cN���0�"�'@� �`�X��Ź��lR/�}
���j��/$�>;�r<�E�M&��0�
7�1�
�2�]����L$�1
�W���!��`���������1���
��h��x��
1�[�P\
�~��,�a?�c�u�5j9��6��+r3�”+���K�>~�8�TL��yC_��;f��}�ڑ��D�Njb8$
��
ˁf�.<��^�NBG�~u���2p����31�Q��앤�%I�D�9iG"�\j�[S�5�L�?��D��
�^xp�e
��\Pa�/ű�}X��l�߷����e�
l=���
a66�y�u9�Z
+�^3
F��
+�p��@���)d�
Vt�k�maGT�+a�H. \�,���ԣnVJ���0h2h����-�^$�}�ۙ�ێ�3[=�{�8=ݒ�F[ޥ��
6
�B�3����*}����
y�Y��,��w�	�X����
�^�^ZP=*xЃy�:�7
_~Xp�6��9&"��W�T�=�P2j�
�}��st���k����?�G�/<���??�
w��*�(��sl��nʙ�;AY5��P�/��G.��
�4nTM���s�
{r��>��ߢM�b=�:�:R9��K}
+4��T��;�W4�
šBg�
�B�_d�
�Lu�(��bZAT�m����ߨ��ә�g�LC�>
��1���gP^f�����2�܋.�
����qD`�C%&ؕ��0^hF(��^�"H‰��
��F&�7S�+YSĶ��F�ufXE��P����[�>btX��\sS
�[
R�����
�:v(5��Uh���<���.u\K�|a�4�
�=� «Hb�
�m!c�-�	P �5���`��

��,�
a�}�Y$��;W=�gh�A�G�|����B�]'ieϼuo,�Tv�{dFa	�os�t�� �3�N@�߼^��au�K9�E܎�T�w�μ�b9�,i{_+Op^lI�*�3k7�*�*���%�pF�,�����E.|
�f'\��*͸V��3`q}1�`N�t`T�?�ü4J���u�y�b)E��I>�Ճ?���(z��W�����U_G�������C�'f�r��K�gL1�gC�(����ù��{��߃�?��}�o�OW�]
�D:���Y8?������9
5 ʈ΋*s;`��Q����H�!������x18� �F*���XB
f	�Η(���A��8i7
+f��h�n�����HTz)�ߣ
y���nچ (�	Ҵ��s6su0�s2X�r���h'� z�
���
<�>�K.������9���?=�Q��l�
+ ��
+pS��

�ֆaj��*M9��A�LЮY9G�:;��Qf�L�h��"����-�~�$0
+���S=F~�
�~���
檒q0x��GdU���}_$>d�	�������U�\L{��ޮ�~�%ʭ��-�"4�x���/�� qM���yգ�C�)@���K�
6�'�Y�~'�����.T8�ZڞZl�3?��o��-�=2�)x�L\��":���B��ʛ�k�4��e�m
{>����
����,:��Q���f����/c�
o���8�D�%8+h�-9�
=T��^�?�
+�
�:�
�:X��Ғ6'�'��՚�A�8EH��Q}y��^�b��ĢE�:�([F�
�
,&.]ۮ	�2g�|ə4ߠ�v�PֻZ��$)u���"j�KY�+h�я|wt�k��d9w���U��a����r;J��^U}q5�n�
�%�

�C�A8��3O�T0#����f�
�N����]{�]J�+r�r4<����.��
+މ���W5�
M(ui��'���Tz�[SP�P�2@�.�01���k�XM1B:Ҏc&B0&s.
+s���9sdͿ��QX"1�?��9A�ؙ��lq���#@�I��{ag�It/�����@�%n�n�tEzIY�J+��?z]��W|Ee��c�_
|G�D"R����)���~��1#j<"�ht�2T`{
 R
 �;LDQ>]�h�Ĵ�ݺ~A|�'*�,@���A���(c|��k���h�lŐ��?EU�\_S�~�_���Vh�E�M��
��Ё
+@����9� z�@�j����K��GD�K��Bye���h���#�8B�5s[�?D�*�#�=Ṗ-,Z�/�(:c�[v�*��/�c��:q
�z"��'p�'n��
�g"XY�

��6��K�v$�T��Qו㤾�]|�MeG,H2�
�vA#<|'�^��a�@�fw��"љa^�m������ �d��#�(�����ЦW�מJ��q�W�%pV�:'Q��zNNo���bpY� ��j�)<������WI�H��%���~)�g�XE��l���J�����(Cs�e����q�������|@j�~X
�1D{
�^ձ�(^	g
�hy5�t������Fy�k����VZ㕌!��B�l	�3�&gGos��Vg���FR

QUO^�F�.
�fd�ޛ�n�י 0=*�R�Fͽ'�Lv�vD�̀��M,
NJ宇>���N_ƫ���-�<��–�j81���p�:��5����G����wz�4~��>���kQ=�~� ' Ǧ�*�F~G,*�Q��{
�c�]�?"���5��W�go'�f���ڹɽ_�֏(�LcV�I��|2;]"u#�*��
%��I����:���[B{���dž�Z��ʈl��ǁ [...]
�}��;?�ܷ�
&�L̐>�Qѿ�����'s�`��e�P60Kw�>�,k�[����[��<߿�?�}��5�$8J��췴:"�;rp�
��/;�	;;��nfG�E��o�$R���舱8yF�Fv�\w�WѯW�N|���f��<�p6#5���*����ؘ�3�0#!��h4Q�K

+�<C�����E�F�m�䃴
<����ֹ�*�����"Q�>�`���\&
+\�3���
+@,ջ��>�(b�Я��T��Rc=j�	��cW��2�b���`h6(�m�wW�}N�鉟��Vj� ymfG�x�l�����^�V���v�jK�KGja7/���A�l�����?ߙR;�������z��U���?�{�'��5�9&�9po� ];��+sNP3q��
�����Q>b`��¨�g��.�d.}��'!1{�ԍZ'JfW�1�"�H���t*T��<��Y����f������qs���i�Ø:��0��vDu&�VW�sX�~�'�.�ۚi�B��3D4%DT��Y=|�Ԯ�1��/,́]X{�o^�����a��T�36f��i���Jp6b���uC{����ر�5<WƨOl�!�Z<°n�� 0�3ڋ��T�
s	
+�zL��a�k�8�,��c��� h�P�S����[5�~os�1Z��c���8�M���U��o�C�����������Z:���!�*��kJ�[S�fy�`[�h��/F\���M�R�N��ϽAr� [...]
+���9m��࿬�L���|��x����6�y~8&<���h+�/�,C�t�A���_��'�M��]P�,6�w����J:�D[(���W�C����}��}F�����p�8�y�W�Bm��$\�J
�T�e'��<w<>v�A�x��+5�s,)���H
��A���
O~�a W��(������_����
%t��[�uZ_9N��%V�7+<� sr�gN�0��_5�
�c���% ���f1�Ra�5�f��ėU9���cqf��KD��W�"N
l���(��[�=��t� ��g�f|�(g��	�۸���ĉ+�k�I
�Ƅ,`b����t����<�K��nV��Kbs
a�v<���G�
*
�:D`��:�D�R�`������"�A�Ү)vcx��s�d��PG
I§+�B~�z~��D��7�l��?ˍNjU��;��
��~�4�ڥ)��"���39
��'��H
���g�
D'{,���(��Z�O�<��??�����Y7�	R [...]
+s�&t��,a�a���#�C4����{��yk!�<�\;�{��W��R&ci�ڛԊ�Y6�Ž�
u�a͌�=�����cV1X��j��A�񏧍�����{s�����H֬v�
m�*<�a�`
��ŝf��yt%�2��D3� ��z;f(�?'b%B8��D�7�?��rW������
���a:ߡ-]a@��u��ĿS��jtN��pK^t?&{�w��z* � �J��Y�@�S(�<�d�#⏨�5j�l�r�W��1�[�d�
t�0�|��㴬 �
+(:߃7�V=�6�RN����xQ{)��Ѧx�
���&_�8OLҫ`��r��w�uY����)&(���5��~p�(^sayw|��E+�m����]��&�	�q��j��"�“�l��g��vmK�3�'�;�R*��p)�۲����$F�&KݴU,�*I��w~D�\{͹�@�(r�ȕc�qȌ��l�%�ј��8Ĺ'��a}t.��-b�iP9A��ᢟEa~1��
疊��
��$�rP/"��gh�Չo��.���A�:��&`�K��=��)ja��qX�+�@(Ϙ
�f�7�}pJ��w��J
vG�Ɩ8+��l+R�x
��i�yIδ�G�VG��mТ�+��JƉ����A4e��,
K��y8�����kMXdbAs|7!�\ �
+�n�kN�ke�3����7=A�[|��i֖��+QS
+�-�B
�!
=D9�L(K�a�K?�у)3c���D|�
�I a
�8"�侗K�*��U���ީ�E��
�h$�=��
+�����!HlQ]H]G�Sf��i�CQy*�yDZ�Ӝ
+u&�P�I�W�g �p��Jleq�<�=��/1�b��
�nӓA`PN��Q�hh+g#egj*f:n,�36Y�b�m�n�F����Fٵ����PF9�E�
+
�*7R��ѮQA=J�$�I
�o�#렚*����I���ԃo��p3�
���2�%buH����T2���0]�&7537��
;�����p�k�΋0Ms�$�H!1��ݒQ�s�wo�4�̔
"�1L�m��l)��K���L���һ�lMf!r�b�KQb�U��1�6א_�G
(+��&8jF=��ġ�­�^S�x��ԃ�
��+ۄ�5U�|/W�Ka.ֿZ* ��$6bo#��s�4v)�8@%���������܏��ӟ��FB�vu��"��XіK��
z�ݞ�c^�;�	�LѴ���B�"ZE
�Ї֞������Yš.�H}�%8�B�T�@p�
��������5����F��uGc���tm�]Y\,�S��
qQ��\�S���W5��+[/6�BnLGdn!')��.�Გ��x�	lPd�#�^F>���tԺ�(�Z���F�Bd�i����`B��5

+Aݝ0�
���q���6
+p�5�=Ʒ%j	�����r��H�v�<����*�  ����R�I�����3V=��f�BZ$��K����Mw���I�o|�1�
��x*�:�9� ���D쎳�9�(#2��$/�) ����c[B�9Ve�'x1r>�
+��I�=vi%? �@d�� |��A4��~#�2ԅ��� Ί�F�pΖr�S�;PFE�i�#��8g�Sn�ڽ�9lt�%\��jFta��K�]6
N�¯.eue'<
�&
$o�ƅ� �Y�[¸
+N�*�+� Si��꒽4F'�7t��
=�f$��I��t� ��,͜�P�Q�)JRv�y�~&����O�H�tAS�7l�N�Ӂ���K0�NrGB�π��N�� ���9%f�͌�(|@��� �
+���
�J��#
�<ۋqz6��3�%(�}�"(�0b}j~��s��R
{l��n����4iV�8�Ia��5���Ln�I�F
j�f.�R�F�(	K.A1C?����3������zK����6�H�8�,�9y_�)���L�i=�����^|Թ�g��J\Ց�K�ڙ�Aa�x(��C'�7C��C��tu)��s:��<b�jr�߳�"LIތ��|���C��5<�)}x/���GeF�
ݙ4�SO$����)!��\��IF(;�i�"���]�쎏��9TV��3���. ��GYQِ�LJ?Sn髟��i���g����
=���R��U�s��@eD��4�Ŏ~щ�J��
 �λ��Dx�+�N�l����E��z,0_�=�u��P`��y��tC9.�R���dD�����P*���n��*�V�N\�֫,�ub��~=�&bX&��G�$��0A����h��y�/;�v�LV�l�<���,o�-��>>h5)A̢]ݴA�K������
VYR
B�U3�|�5%��Li��y`S簙
~XX-(��
E�Z+����W�;Td
T�U�A W�=[�Zܝ��;��Ń�7dGʒɅ�Yń�VZTrIUa޲�
J.
�uTh��m���K��;�n�:�t(�P���Ou��>wȇ��I�+n�2�g�\���|�%h!�)t�膸���h�Ս@�ݘFS2��o���s
��# L������(�2���2ِ<�6hث^g�4� k<$E9�	6k�hTJ�ҒQ�p�q����;���@�I��Ez�#��դ�b�c6+ݓ!i�����>��z���1vLD�H�_%����%\��{
+��ǯ��o�o���_?Y~����~�������?~���~��������7�������o��o��׿����������_��w���?~��o�)���}��g� ����s�nj�e?�>��T��d0V��!RoQ�z>8��%+LnI�O^J}�Ґ�7atȦugs�2��I��ߤ�.'+�BMŬ�
?A\���9��Q�^�:8�s�7�m�9 NAR��m�8�dUN�Ԩ�	zP.�2F��M�CF�F�Ԫ��/��e���
7RN���$vX��N�Q	
+R�T=M�4� y��Qg��vc�����#�[��
~�&L��D˕���$ʜOF�C(g�ߺ?�������@Y)�In!�[�%<�n��R���b¨S1�d��E���3�OX
S�e�{�T�sPr�H��(�Q���"��jS5�
�5m at LL(
�8p��{�*�#����$7��iӦ��ք���HWs�.._
X�_���r��xJX��3(
�!*(Rh�.2�B����|�0J�򋃲��5��E���u��
*_kp���
}q]k������W�xI]��<�Jz�%��$��II�G�)�f��#��rNߠPR"f5@,��|Pz�x��F����a���0H]�㦬���@U���#yǖ4� �P�y���6�K�8G�(��e`w�H~<���a���0�ʽO���
L/ߊd������E3T���ga��gDk�_y�7��.�II�zl��dAx�T���"�s�d�e�&���d%{��q�f��� f�|�I!�0c�j`ƲK at qP�C�=q�
+%c
 ��M~
e����_O��|��oSʇw�$s
�2ݫ��7-�
=12���vF���88HWM��G|���cJZ�NDh�P���K��,]g��Γ��N<{�����1�Ѯ3�"PQ�KD���Z
~�I�/ ���3D�q[��^�L9 %�g���2�Y2�1f��"�½
[Dm��
31�8�z �*|��c�6���ӵՃ/�
9;�6�\mg�(�>2��7g*xXq��0dC1Q��8��d�����u��R9��jy��T al�(A3W��|��Gy8�MbĄ�<��A�=/�^���
)�.R��������ñۀCD�>�E�8ڜ�X��t tK���!3smp�;���=wg��v��]j��g+1����A��:�x8
J*�Jb� ;��
C��=� �bn�!�G��CW4�9SF�v!Yj���,�T�6~"��&�j�t~Wv��c�o�Ud� w��z��'�)���p]

�Q��Ԗ�ڪz
��^-Ie.�Z(�b�*N�oG�7;�,K��U��vg�
+Kā�
+D��E�A&Y��
��pT�[�H�l V.�{4�-xaO�ɶ�dU<�$�%�L?S�h��
+�U�
a���Z6(6�Wl�`E�"A������4W������p+?
��+wݿ�bc*h��
�
���9�&3
���j���Qe�m�l�O�6��4 ��$H�
�ܚ��W)�
�|�M,�����H��lip�9��&�1]
Q���/�-�]�7�[�x���A����
:�d'�8��:Yg��|n�v��<q�Mf0j
Hأ>�щ(S)�5\��q�к�;(v�)!BN��i&|�Ff�h�c�~6�s>

��dZ��(�c��8���ߛ�V���-*
�#���y���r,K��ֱe�6�$02�
�g��Of�?��*lL�6�~,�f�����1\7q��i�<��N�T)���r�
Pj���
�Ҙ��
u��
�g|���$[��""��Zƻ���v��=���0��-���5,�㚈�hya�|�j����}�8�BU�xp�E"PQ�`6/
 �ǁ�&�,�Ñ���l��W�g�m9���m���<�M�M��<2�M��O6�X�U�A�nyۤ�ˋ'�	h�
+�)g���e������tH,��4|��
ĝ)�=�$�%�k���R���O-Ԩ(Wɬ�`�^gi8��Se��^T>�s 
��L �������+�=8h��4U�ߙ�5��%�D/b��^rhL�Ş7)ːB(�rV�l=��'U��0e:����a��U�:�v*�P���dT-
+�3�Ŭ�q�ED%F�B�����f�B��$�g' >��Zj��J<�'#뎰���ޑ�%)(ޑ������"b
s�B+�$�t$�*F-*

�i�Bl�E�;�TlP��2
��|&@Ǎ���.��U
���
I�$�7ac��I��캓�rzA��
��߇�`��LCƐ��bzt�?��,����"�X�u��2
�d� �;S��������h��ͪZS��6y�l�
+�%�_�2��q&<5Uh���Gպ�ʲ&�Q&1����ӏ!
-ߢ�bs.H���$7ݺ�y��%��m��� Je�rۗ
�2��vM���j= ��:Ƨ�30�(i 6���kި�sY�ٚ��W�[i�
���/N�+z
��.��A�G��uV/Ճ:-�mUXJ�] 4�!	��s�zG���gw��D�
�y�)���qv���-Zϥ֐�ք�
��<�s�� $m�
�ma0���”�2pm :�%�_��x�t��_��<!�A*'��jw�4B��T��v��Y,J���
i��D���V�s�Q�ٶ+�MN�!g��ڴ4Li���dz��*�`ʖ����ò
�,��P�C/�i��ζ�˚	`���s�/���v}ѧJ�ɇ��;={)�3�QĒ
�y�Ϯ�ێ�!�+Jj�=􋦜3(k!���W
81� %u�U���)�W=���k�����}�%D�S"
�d��#v���ݥAO�i!@H� RG
�?w��m����^
�$(�G��ش�m��%����x2-w���
V�'�Ha�m&�W�B��ܟe�l��
����u��dž$[D6�!W�M
��.�V㞈
��Ԓ��5uj�����u05�v
0s[�>�EGe`����3`agzdNAP�=�38��ɋ�=ߤ~3�]}Fij���^�s{�?����U/�5��<�;�V��Z1K��:L$n�urd4�{}�
eL!�;��C'�&���#����2P9�n����b

+ЙdES�B�V��ɤ>��M4{I�����1ec*(@�o�x��&oO�y{j���B������C|�J]=�uG��4F��7��s�6AE���^�y��k���d��L���Ms�SZ
@�^���f���c�O$i���h"��$~��5���u�ΐ^���
����
'w�=4�
�(����,��&y"�2�T��
��ѣh� Di
��3�N,�g��<����2�/=���/O]
;���!��6��SE��%�Tx9�/��&o���R�"F��#XuʀX���,�"�J�ռ#����w��z���d

&`O>�X�	�
q뗽�O@���e!�Oh��
�T�o�2Te,
+2F[2/�Pb���Րt�5����ڙY��	�l�~�\!��'�Ex�L��cn; HD�,r`S����V/r�W�݀nny�͠W�	3;=��Oe[��Q�p7��Kp�
�=N���D�޵;�����/s&�

����*x���ʙt���G��$�À�c��d/�QQg*
+��u@���dQ�����~��эp&Ԙ�K;{
�`o]��ր�����}h+D��-���(<!'wB�6�,�9K��Oi��\XM��  �L
�҇H*�V��>�����z4R����a�s����9T	��g>�Q
 �^�x�~�%
gU�λt
�[�eف��r"�憗��β�����:�U�sM���=(�[����� �-R
�A�X �US%��W&����I* ����$�+�`�|�����pcYeDP�Y"9��J�i�
NR8R��+���?Оs7m�����\�Y�_��R�
��mC�
 o�Y)�mӶ
~���X����S�+
%9I��jOfLa�8�_���v�r�H�X!�7
���^ֺs#�'`��F36
Ҕ�
�%ޝ׉%����(�^�,�J�)/���@��$��2[�3iޝ''5	�
+���b^����	��,DE7��Ytp`�j`���|���#(�q�� 

+��}
v@����N�W��Pq+��!%�by��):��Q�[@�X!-��K�u[4Qɏ��
�5�w�қ/�Q��gc
+�Kt0s����޵w�wB��'Be��,���S3|*�T��_�ڒ	
+�A�hÆu#
e�TdE2���w]Eu����aӱG�e�@&D
�(�hd�ߘ�"MTҩw
%u��"��I
����T��h	6�z�T�h���,?�
�
f���)W�G��$xW��x�ċ]O֟9�`X��O:&�.�
	��p���į�§��7���ln)���
�҅2
���A3��+�)�� �)��*`;��2:�x�{��$��8J"	�O�7蓟
�R�y��!eL5�r)��K�V�^5� ��n�
���L��.���.	6u@ Ra��5^ ��r�}��(�����

�UJF���B	�<�{ ��fp�� �E� 
\H.
=@ԝ8O�	����;L�z�{J�Q�:�jA(����a�t仰,_����ܡH\����՚Q�@!;N]L?H�x�+���!��n��/k{�s���
��{1�ޏ�i_8q �櫌��E^�m[�S9��ϽpS�䲱>��M��<�bn��ng�qC[Zz�2�)<�ɢqB�*8�RE���U����	��hKn\=o:���T����^t��"��˰|\�$p&���(
�
{I�MӃ�]
X���>�(E��Z�DJw�@7��j�i��_
+�s3���q64?�j�.
+
�z����<���؍��ҵ�f�T���E��߃ �<�b�E$� �~�O���:b]/2'⢤�*���>v����T���T3��0�]X�Y0��-.�ޫ6G��d
+�赑8�� �X�o��9!�`,ҖTNY���H�s	CV	C����N�
��"eI�
; �4�yH���;���-
+ i�w���x�
�=e�mr�"�ǖ����2 c
��Z}.4˲
���
����)#���z��Wj
B��f�#�Ԭ�
+�Z=�6�;Z�O��KgbK
+�U�(�XZQ�UP�D?��ϝZ���$�W}��QR
0Hql�;���^� �
 :�縅�/z���%�2R�U�h
r�Ew��F�ʶ�{k|>�+�ʔ��P���⮙�4�0fa�2I�꼚L���P��l�Ѻ���Vܝ���F
��n<���F�h�pC1
�<�2F��+rբ⵲��5��vK��ՉD�z�A�Kd9� Y�V:���X�Y�
���l�8�8Q�z��jf�&�3i>�^��'�j&���9
+�&|$
�X��ԃ��
绳!&��q�pC�D�d2�L��>��s^
RO`��
��RnG����
��v[�����s/�I�fz�$2��+B�6].lZ�T
4K>��B�.ϧc��PYa��4U3�m��
��/)���92�c�Ѱ�$��Pp��gG���C�>�D0%V�5
+K��i^��Tlsщ=!���
G���6���FO;�k����.d!;r���q�l������+�xmWA
4g
�y��P�Q�@�� cLdvMqt���umE�`���h�bJ"F�0Y
n�pe�����jh�s��<I���t��s���Y�R$�FC�˞IB�D6�γP���&�>(l�?�>s
؝�5�
�j���nu�d�l�

� �>
�[����B�@W
�������B���[{>��Nu�i�7)�1�ep�,��jL+���7#q
��6ξox��W��9�N�

p�'�@��M4������P*��
0
��i�0&�0���d7�
���S��E�Ґ{�Y,�4F��╦���ޠ0˲?�
+�u{0k�q�%v�&�i�	��M�lRj����}�ɰЋ�X��
"��ᚶ����[��f�8F�
�݉
ы[�6u���<V$|�
�y%
��^�$��&NIW�f$PDG��\,��3
$�d������G	�^�dc>u��x���Y/�@G�M1��������n��E����������V<�J&�#aV6�j�J�$ͻtNw��
��?�s�+(��QM~~�M+̍+��.Yv�nO8Xe9
�]�_hs	?�
+ԗh����
��=�0�x:o�y
��R?e�p>f��w0
&+x�
~S�E�[�|㈊G�Tܶ���zTa搿$�����wR�
bBaN�y��c(/�=�4�d�( ��h�=*�Mi�)"P��|C��BV��{�I�4t��u>K :@���ʧ��"k:T~a�u�T�Q�
s���ֻխ��5�,�x�8���y�t)��
����
�; K������㲽Efڸ
�M�x��	�z������dA�%9�O�Y|%��3m���@qpK�w۲!P�d�*���5��G��L�~��x.�������aB&��*�.h
+��X]���皣�Ш�!`�m��}yR&�Bd<,��&��By����
�B3��HK�!U��쟊
 m�PďXG� �6(\��n.;�ns#Qb��8���=��I2�@�	 e�U��LƤ�)"A,q|b9=ؖ_%jy�F�\>Uh'�1J�6� g�f�ԥ��R~�A��wN��4��e��zr��� �uV�a����5?�+�&� �ZT��/#Wv,�gUl�FŌ���dWkU���#[1S�
�������8��
+
.lNĿ�ejj���l�N<n� +.d���p�	?�vi��.�,;j�5</�VD
��C0��k3�� 6ՃD���+��zl�:������~a-����%����
R�V�J
+�
��$�A���aZ�@�A&O�?�=Ӷ7Lb����%u��A
��h���^%�M�&3�Q�@2�BA���5eF���}F{;:�ⅰ������y�O2c]��߱��"NltA'ٚ��^�r��.J���,����u�����&r,R �:�L�;q��-��⌏{�j���9lZJ����';�"g],}��'K�^�d0v4)��P�Y�.���4;u�� N���s��REf`�]�[��&%�5d�i*��J��%�7�z����YM�2�e}EMN=*������ӡ�ۉ釞!f�#�Ds���Ha�C=έa
8
 kr\�cV�$�>HxZ�FP9�����<1�[�(�Y���F��,����
ɝ���5��g�)�|�
fQ�Y�P,I,tY1�tO�O	7�
�?�D��5
��6Q���r.
��
�n�iI�&j�EGM�Ю�B.~��?����aٽ�Ѡτ�y�s����
{r����B?��d��&���V��d;7� ��M�r�ԠdC��~���"~9,F�4H
�.�[:H�f�{��k ��i�3�kqBG�O�*�׉����w��=����z6*����?
j�����FEܙQ�r[��[��@�ˍT��ŴЪC��=M�x/�]|�i҃S�D�iY;���p�Gm�5�Ն0��mڰZ.�
M�.ٝ3��
�7����%���Y!��D\>_�����$��A%�d�d���X���ΊK6�N�_oB��{���
|�t0
�귁g��Px.���ճɟ-p�R
[�^ x��y���4B�L�%�O�*ٙ�v��B7o^���W65玓���b��KP1y�l��Y���G�*���v�3�y��� @H�
��~�D�ce�̮j�=y�i��P�T۬+��9���`U򊐻Y�T�&�@:;Y�f�C`�g
+�������}�/�Ddk�����,�Ւ+�w�s���2x
�S
!�-d4kQ\#&�w���o���&�	%
�L
U���$
�~mE��T������%�?�[wc�V
K��Q�:3W ��1��c��#�Y�9�eR
k/��	
g/���F�_i^\=�jP\ԋ���QD�)��L/G@�ɴ ������I	OR��O
�@�gނxx��^��`�m��P`
��ss�3�
�N�։`�8�d��߬�� ��X��� �KO��~FK-A(���_"2P�B�0	�ihn&!f%gZC�`� 4� ��2�^�ұ��Sxި����d�>QB�{�|>$?��{4�
�s4�[Ñd¥ҵ������PRv��U�T��Tm� �h
U진@�oC�{�j���|���v4I����'�=��̟�cd�`Lj��z�Rԣ�O"��P�AҸ��

+��
���=0Wq�wv8��Pצ8�#�ELz��So�R'��'=W*V�S)o1���dXUF
$ҹ�����^
����#�E��5���� �[n��ǰbDQy �F��
�Z	4`�d���:i�����X�dMwg
���G6��kn�HZ
<�:L_ af�{fNk�`�J����J!Y'�6���`�^�$�� �S|H�o���9ȫjqQ�HV�],�p(���~�,b���V�?W�@��(�ƹ��2�fq��g7<ն�R���
�Y��J�
r6K$�䘖T�ۦ,fe�.�`������������-�U0����K�
��S )�й�~�� 0�%��K��[���7�	mUti_]x��1w�Z��U-��v����W��4�Qv>gX�:������ȱu�V��g6B�
q��!{
+�(qR�V��D��*�e�<�> ��R�$ vFc�X��.�7�j8U=u
��6����V��q��^|7y�SR8N��\�Z��i0�3��t%"�����*�#P}\.Ϫ�H%��LY�z#V섘�/��f>4z1��f�Ol.�
��:�$t
+��H�~�kU�f�h���`GX��̖
�|v
[w
)������ż*�_D� 
��yE&�~.���T�`�4����e�L��Y
�N����$�!s!��:��	֔$V�t�IŃ�N�'��A9�Y̘�x�b��T "%V3F?Up*K�uxb�
���]Z��
+�Z�ߩcJ,��2E!ïˈ��d��{1���$'�W%��`�,� 
p������"eO.�
$E��Xfd`̆�evC6�#2������)i��3�Bn�fM9�zq��G�%z�\
�z��N>H��ih
4��R��� 4�I���9*'\Bv��2�CUv*h��&*�}�e_ ڈ��S��#OQ�7iW���n�$+����ݒ�1��z�遳��f�/>emY�aؘ�Y�!���1�?�ه#n�� `�]|80&�$Xt`t�@k�&��\4Zޕ|I�~�>�Q��5�2.l�G
�����'&��� ��3��I�|�r�pؽ�W)���$낻3�+�K:���P7�]���Ɋ������8�\�kA|��#0-��/��l1�2{0?sl땘�����lf�r|O���)D@�@��"�ٲ$8��MB�J%�vI��Ow�ׂԖ����L�Ήě�E�
.KNdr�3�f��c��XC����D�
Q1��'U:�d��c�"�=ٕ#�Yʓ �N��;N��� [...]
�Œh���&��o�JFH2'
U���nr.4�����ּ����U���hC�#
�� "VhE�T�er��Y��å�z-|�T�����l8 )��|MY��%;��}O+����D�,[	Gz��-I2S{�*}Y)�0�ZNm�n��4ձ@B1N�–�>M��[
ʄ���
!_ݫJ4Y�n��-�PV�nd�p���
uꢰ
�&Ǯ���I��	C�H)���Z`i

0G
X�3[@�"���,�����i
=�f5`�
 .��5W��'��w,��Z�a�ÿ��Us%�J�s}T*X�!q�1��y�W��Ĥ��V���<d�t8��b]���.-�[n�F�}���Y.J�bj�4ܮ&^YM:X�>�ϳGK�5_�Ss��A��;h15߿+�["��VX�@ʜ�N�3���~��Q���ge$Ĕ���=���X����d�6:[*86u
;X �OB��|
%7Q������&<G���x��*qxi�I�]]ui}�"Ճ�'
�&�斳��M�0�%‘��[��f�yz#P,� �ɉo��x{����R��k2D3T�n
/�s���3BlO6`�W5I"XBY�T��ʯg�Iޖ�)n|TAD]Ur����~�.�E���4M�����3��=ɗ
١z(����	�J�^�1[�ȁ�D���
��_Pin.Di�
+
#<Σ1�F���#�{����y�,늎زaH>���X
0�
�Q�VM$�$=���~Q���tI������'i��3��3�aBԇ��+B`��!�;�s�@~IΎ�!�u���7C�e/^Z��EƖU� ��`�`5(�/ao�F�
���gb��f'��
+�"�bb��Xx��7+��"Ah��p_������@,m��O��,ۂ)0%�L���
jM^�f��3>�����I���,������o�h��,���
��Ć@��"rx�����}��	ʑC�Ow,��
�^��@C�_�CY��*�Ru��D�e�\AGl����In��/Y��
�L'%-��m;�+��g�����YD�u$�+�j�d�p,>_�󌐃�ʫ���5f_ at R�ɤv���DދO��&S-��1�l[zqy{1CO+աQ���:�
[����@�ZmF
-�v,�fr�
+��*�c�w�l����e:�f�
+	
X�"RK�#S*Ӯɥ��H ��<7�mY��u��vC/zu�i~l3�
	��_βF�{'�`U6z��Ou�{Ɓ��
_�
�
�9N�0{s�؇�Q�
p	�Y�6x���P�{�]Tt��ϻL�	����B8�־ՊJ�1��
��"w����4���8	���4B�9�=\�2M�jP~�of�`(�H,6AQ�˺4_���	)�� R�3r�`"�LԌ	oq��xBC��R"bEl��ۊ"��}7�m
���
7d��pi�Rp�M])���ub�D�.�$^�> 4�h2hɰK�����aZO"�5�BIj3��l J��)4/֭Z
+wܦ�=FL-s�i�׌m���b�H�+D���]�y�}� �b�=o,��Y$,���DO�=��ww��
m����o��LI~�n�R>:
�	ԯ�k��3��	le9s3�h�hR��(��o����@
���N��=VN����9�"e5�U�*݂P�K��U�Z6�`d-�H�tY�!%�.v-�]w[��n�˫�.R8:�t���E�K���$�3��0�
����0��E�c
草O�RR���K�
��7��jbTY�3�	A�Y�9�rf3f��͟b���P�)'h=����8��@2����`�bF>&q)ֶG��,��[P�&��Kud# �i�*nRɮ�&�i-Yò6
+�0�t�{quA�%��Ǣ�,���
_f��b֢�j�8�S��8�0L
&q�����F6���
�^E�q�̬RLM�t*�
�<�! ��2�LUK&p�ngr���"Th���NK��Ѥ++�"q,e�gp ,F��ꡋ�K�~�xc
��L����9��@d��WƆw��V���$��,�S����$�0����%K�0[Z���>��R� tY�s�@�%	�Z
�\'�}��W:1��d

+Զ�
j��D�E
�+ �Mx��B�R at -��n������<�I�ĭ��B��ƅ(����%��Z��b�I � E�DC��v
K����i��/Aq at 8G�H�)�Ov@�)p��)�폙������mn`\�.37l��EOi�OM��U塂S�$�sA	���
4�՚ݻ�}����z�\��O�q�����v;Ӊ^���X��+:uUv;��
`%�%:���0&�)Q9:W�>Ɇ]j�/�1���@�*����SBnfŖh\۶	6u)��A Q��[r�잗�~Afwm^r��L4$QHa֠%=m�Z���:.Q�$�4MLメ�=��X��"�
��H" %}˪����6 �fۜ.��,��0��
X�
)
�O�p`e��u
� y
&�4�$be�`�p��6%aDυY��x��[� �,n	�pӘv�&��� �&]��
�비��S��"II��$u<d��EY�)l�P$B7=]��
'�j^f�t�o}�տ?؀ڲ��4��>
lW�=�Yo�]��Ϸ�]Tx��3�#�A	v�َU� ���
+�ms�:),���\Jhm��푦��B�z؉������s�T�'�F�ٌ����R�iP���c��_�CPJM��D��t�W�R�����(
�)��&�re��:؍�d� ��v
%�.�BA ���  ���k�-8�<�
q®��V
"�؊~��]��k�
+�X��E����~r=m�d�E�Dy�-�)�
�RЋ�z��ii$U��"_e��k�lf�d����
;���_�D��Pʥ
,��^�1��� ��6�(�z-M�z��t�2�`.�D�(�
PN�)!e"@S%�@ƫ�jEe�cJE�	���$�׷+G��}Ϛ"���䂂�RCr�5)-�E�p�����
+LX�tYzr7WV%�o:��e���o3!���EP�
Y�B�.�Qnʘ�r�g���A�6}����K!�l0N'�yH�c��‡��q���MYÊ
���o)s�ϓ�qX,�W����5��
����d_
�u*��
�8_s1vX�?��W�Q�z����
��
7 ^��=T���UrΧ�$_�݉@8i��8�6���6$LؤM�,c�u�<|3��*��*~GC��v���@��Yc KŹD,���8��
CJ��V�6#'
�eg#����f��ssT��Ҽ����<[	1�h�
�jNz���W�GL������8��8h���p�u�E�3XސrQ�
���4#�� ����x1ŸCL���PfA����:�����7��$�
�ձ(�x����l03q۫6
��
+m1o	z���!��Vv���
����IR��*�z���
�I�S��4g
+]���T�
����Z7�D�$�
�Kb�Vd �Q�/�l$�&�9B5em�}(��(��&�7�'
ۤJ�U
�Ȅ3�/��+�,B2!PTy�6��[e}�rX5g!�O����������r�}�#��(+�U[�/�a��j!PNB-|��u-���a��
;vωB{q�j!5��%$�NE��U�6)���$
��!��
t:_�1׺-c��$��.��+�]�,��aY/̢�.�E���: ��n� =$6 �~�j'
+I�
}O`L�L�N`�伱� �G��	ߜ�
�ѵ��K�U��!V�i�ո��h��6U��ٌ%�aپ�P9d�(M��"'l��i�i�N �Ķo���2��:�r3����I��8_�`�� &
���W�j-�z�
KO8���JÎ�z��/uX�;Wy4��d� %.�jֻ��&� ڣOs�a
J�7�;��O�-O.�r��9�䀁�AD�ȟ����
���&u��ռu�]��t]=
�YM�8Τ��鵋_F�`���P�&[VE4���i
&� U��5�w��6�K�!��[�W��UIo�U��@s�9��G����k��OVr&C�?�Nl��K�x�¦6drC��=�yd?+Xfn��Y&RH#Zg���^ȧ^��_ �<�m1e� {"�oY��D{������S>�{��������V)��#V	��3�
�V-����r��z�����
���(%��c�b2-Y�~0جs��0�q��2�ո�&@�E�M
�J�6�9�<�C�A�ŘF)�,?P%j�{��5�D�����Dթ-� [...]
��l�n
+�@ �u���NP1�^[��̪����X$�Q�\�S�����m�������	���$Ț�Q�����9k$2�;f��
�
+(�k�ر3��["�T�����`�&��B���nR��`�$�_�=K�a�	��M��
"cH�ɨ�*��J���5)���ԍO�*�Z ���pk��
B�gȃ*s��	�N/w��&o�vլA����/qp
	z��w���-��g�	��
6&{VN(t"!}��5��F��I/�c��r�a
�
6*�����Hn3`I�����6��!�4�?�<Z�@	�8�H�0X
XZ���F%y��41�����
k�3��%�Δn�t�K�پ�[�^��b�2�$�X��U��^�!���;��FdC!���
�)�^��E
+sO���41�q4F����)޵	�8_���]M�@�&ұ=��݈�_f��JNj��n���*1=���
�#���`�DVM�Cz{�h�
a���,�R���n��Ʊ��y&,����1)��|Dj t���؂����eU&��ꆚQ�hr�HҮ���ܻ��3�f�.郈�(��bJ̓:Vz��T�YEIl
@gX��e�"@���
k"�Q� �ݤU	�����ӨNR~[
E����zэ>� O��V69_��z�ʋx������u �� Q�6��QmR��8�JՀ�^��"&0쓺eҍf9󙒋�	�B#"҃
�hq�
:p���	m�

醸e: C�a�����z�3b���Ï�D�U�{I��
�ܯY��^C�Zȟ]��F�q��:=����1����7�7�B+p(']��xD���Е��Ϯ�jqx�o��{�01��|�sg�-%j�T�Wr�����NN
+ڔ
+Ys\�d-̌K�읉~=w���]@�yD8>
�A�NRj��G��� �YL*�̆֋^����Lsc��� �f��M��9p�0iD�C�3�5ŮN�ױ��L݀B�`�x�P��.��T�^� ��=�U�+O��"��}
�e|�B���1Y\�VYX��3����D�D� �K𝷦	�
�X
+ʲ^m�
�*n�&�)�/Q��T�<�$��c��������yk��T��8�(�R�j(VP�tJ�NA(�s5pƔ��ʼn
rt!t_��U'���-ׇI�&�w ��HR/T���<�LJ�
V�j,iս�3���m�P�C��y����8	�`�ѣZ3��V�2
��I��NgSGS���A�s{�B���ۅ��l���ݷ�%�E
Dn=
��˔TG.<���4W��Lt��bS\�ѳ
�֦
�4�>)�#��&��i`��R��@�1��݃��

>����
������qy�9/����ķ�������9��Β�
y�d�)�^P�"�Ϳ��yV�y=����ʩ5
r�6�c�B�U
�mV��7����I�'ѕ�Mbð��+�뵆��ρ:�$h�9�
��E�
�O���Jj���R9�~fs���k��H
����J�BpS@�'�'��Ł���O<���`e��g9�H?�*��	H�=��T�L\��`�����=	:
�{Ǣ�7@uqXd�h%�������P�
��v:+=����/pE�����\��!2$�3�B?0�Ɖ��Īc�|~�
ӸDv<�OP�Y�6ӢÁ���R
+���4t�RH�Bf3䱳���豊L��}o��e'i�O�:G�a��8
�8 e�H��C�?�95MyL��Ր8�V:�Q�Y�p~���=�z���%�MVC���9֥�W#�):@}A�
����+T���B9���
+צR���a`�+�p��%�7o�wT�jH|�adb�٘���q�î�zʔ�
�$x
��6�=�
	}�� }
؆�<�}h�A���nj�]̶iSF�%
���~H7�6��~#2���_!�;�H3Ӑ%���S�����82T� ��^�o�Im�ѳ�">�au��| �ݢ�^E�ş�ْ *f0%e�3��~:N0m(�aٱmt�ӧ�@�)ɜ��bk���'H�
4�B�
+��%��t@�d��xq�d϶��-ٺzv�
 ����v�=��?�D	;�Kz�^T��y��;&�z��u�M�<vC*Sd����
F��_Q�3
E�
sP���ݬ:�ll���&�;�J���b����&�g_��فb�サ >
$�` 
�����€ܓ���?QE�A��.l'K{:A!�	2]��SE�_nC^��M���G
+5G��
8Л,L
+�:�	���� ʯNZ+
$��XS�0�b
�8Q���'�QY�+�o*)�y:��×
KF��=
�V�f~�K��"����6X��m�=.C��i!5�j���'	�N�w����Cq�J��
<Q�d�2.B��&���
��.��3EG�ds�h�zؒO�_k�
��V���8���.��_E��;�-�������4��O#.��P�Q~��j�~�5�*��h������ƕ�(�!o�%�����	��
�����%�gy]�Ku�Zd at q�ڔ�XCJ��z�:��=��4��U�_��3��(ަ
+��9��l��
[�����c��T�ş�,��)�S�T�y�'qm at Y��v���P��n�
G�j�ꔣ�S%M�#�
���=���-N4�A�z�B�G��{A&�h|1�L��R�F��G�*��^��X�:(�4 ��R���yY��_-�
,��o�И՝�XDL�l M�
rh�@o�"1�5�
+�P������a�D�h�"��;๹�)���S� �!���I�wI���;LX��� �k
R��ȏ@�l��,�XnǟlS�GwEN�(��
x��U�L��
��!�X�Ԕt�7N&‚�
+�*|f �4
r*r�
1��3�.wv�����E�g����n�;d�e�{�Q
Q�qQ��ؐX�E!%���<d޷%+�3�gz�.�Z_\��c���D����0Y��4�+#9��X�T
�)Tc9��مnP�dž+�ñ���
7<G�
%�{���ӄy�'�g�6+wt���\�K:rfK}���� 
1 �葅qJgO�C!����i�h<A�A	*�)��=�e��q.#O�se�$�=�z���|Œ�K&]r`e���LA�J��ۍ#
+�xI�'���R�V8݆��P�̀
�a���:EX�OI�]�o_6@�`
�X
����G��^�5
�
+HR'"
�<��������7�A �Jxk7`��8�V�j��!gOm�H ���!���#��]�s�E�H��0�"䣣]ž�&g��U���,���P�3kJ\�:n�h�W&rt�(�����Q`ݡ�Da��֢�ȿ��kN�g�$�
k7�quq�JX��� q"�2y�ٝgZ��,u�
5[�Ƶ��s/��D���.���
A���i�4����5j�����
�z\�S,k����� ����H6�%��eWu9|�[�
����/��>��Wn �U_���	� 1v{=b"*;�[.�~����yȃ�6h:h��x��nԀ�#m=����Y���M!
�Lc�A
����	�Y�g���pA�6Q*i�
'F��z��
Dm�~�6�@\��Ȕ'�X at u��*;l<T�Tl��z&xn�=�{����#�d�߬YZ
]0"�=�\�=ר�?u�H|&U��A�u6���h� �B���삁X\\@�.���Y�s/���X{
rьJ�ˊ�Uٌ5� [...]
+�T�0	H��1mo���B[D�a%BF�T��ȥƁ�e�gS����߀��h�v�U���Ui�#v�����'�;#
MX󱇽��],p�A(�i
���7K�/9��8@>M��*�Q9���xj��,�����
h�*�����@��Ý"�A|�
+2*�� �"���Ah
�
�2F��'Ro�w
�>!�C��u{��|�n*�m�6�lu�M뀬�t�*)˘�
lx�q���@���:�a�"�&�N#9�<��&��&�
� �
Զ9v)��c_�k6�:�M=���۪���(��>��`r���|\��u�=�鄠%)m�
+F�0U*%�7E��^:�Y�µ�E1��㹇�R.���?@˜�q�� }l�}���Ⱦ�FP(l�kp�bdO���4!�P��7�	���i�MpX�����P
J�t������۳�L�q
u>W��&Ŗq�@�&����y��L�b��PB���:�AHm��F|1Lv�@�l�
~�
��J^��
�)`�{A
11G|M�Q�(�>͇o+1"���E��Tń�v��P�����	9L$���dZ��誄lR�
6>��ANJ\	c�@���D�
CI�� �g7
G�R]Jz�E��q�y�g��]��L���� q�L&�l���Fܵ�� &t���,F�z E+e���8��^�]�HV6�a%e�$*Y]R�"�5�(�
�[�a	�eQ
�pč�z
+3�
��0��<�����2�q���lt_�	7,f�m?
�c�.�U��:Q�g��mΞ��XU���J_���;�T���0=Q�v��HI���.?��u��Q� ĒT�������%�X��
+I�&��U~k�/��*�Ž
����u"/\y�Ƕ
�cO+��|ꅉ��d�R�k�3d V
�ln߸ 
�=Z?o��ӥ��KY�;lr�
\����K-tg��N�2��%
]�O�K�N�]�y�p�셗�e�լ��b(�@����z�rp[�.ޑ�
�h�:�d�̒`�M�Ɣ�`�n)?}<��
�|8��LuA��J��b�
+͞�=صhN��8;�%�%a^��Z(-��
sy��h
�T�'������M�PHwI���yr��~�����r�U��8X�
��'������۟���?���O����/�����/��o����������|�7���o����������ۿ��o~�/���_g'}����������s�/.n����?���~�ŀ�������������o�����?l������_��~����wv����oHP�i�!�v���7����7���|��F�~��I���������
����o�����u������K�߾���?��5pΏ��w���~�������?��������~���_�o�귿���ߝ�_��ߞ������ٟY�_~��ω�
���
G�
��������O����������Hoq����
�����_��_P����~���w�������������_���?�t�
s�>�����A�Lۧ���md�)j~�����o�����
��������}$2g�֑Z!iY��
+�3����
�ɥDj�M�R����т�Q���~�O�sq���9��_Z}X�����	X�=�w����� �}t!�Z
H�G'_��5k�m����1��›�p��#
T�ɯ��_�X\ޙ��]�
+ٟ�t�6�K��MI�3�Ƿ���IL-��H��A6�z3ű7k���H��x���l�w�����L0W4� x#V|�X����R���_썻�h
��~��}9����r��=~��ׂ������5^���i��%�
�q	&F�	��?8�h�; ^z�!
+*��X��eq at i+�}�������elA�^^ק{���ξ$��ケ�9��([�
�0��`����i���Y��d�;�3'�(z��
|G5v(�
g�/Z|��Eg����������}����{:����z���-�g cg;
(������
QsiF�.����@����|��O��SϹ�; �QH������M�3�W/>[Q��d=?��~���旁��� ��7�
ͨ��YcZ�o���E�8��W�L�
ڎ!U�z�;�R���=�_�@�"�6����8a\q3C
)g_*�-Z�}�����1����Y�{���}��_5�����b���To�1|�3�g`� ����lhJ�SL:)d��}�G�1bp������N�)>ʍo�(K<��6�֪O>��}�s�5 �K�����g��3�e����QU6����ڗ?!^���^�ケJ��^ܹ�*J��(������6|6�����|��w��
+>�g���
��x�I�,�'[y�jY�;ZH�!N']�O>�<5|ܴ����1��7�fy�h����=�X�
���-��	A�x3��5�O*&ql���5�X]���)���4��zL1�se��I���u��Q��+�"�6�
+�3wԸ�~'�W�+���q�{����A*�9�~3!d��
+&E����;��"���f*��‹{u���
ܟ���
g�+;�U�g�ݲĉ;�����{��Ԋ/��LJ�t�Ϗg����R��k���L�h�l�h�r�ǜ'�n���
w���(�C� j���YW[��q�;)D�zY�w2�T�^1	�W[��w�����*�zo|���_^������}����}"y�D�J��}�k
7,�4X/B��t󻛋����
�+��F
���hN���n�������o ��F�s�׀2�m�9V���.��~�
��q͸���
7������w�I�7����"��{�ݺ�A�#��߼3u����X�
�qł�.dD��0���
)�X��|�r��>�1�?y�X}��ȵ���O��'%h`6��սAt���Hkl󾻣�h��[\¯��v4�(|?��/��g/-߽@��P���G��O�
%�X1�}�r������,�mf���ŷ�Z��QV��
Q�g�l��%&W�BM�K�}��Dϙc.lޗbm �}
����g}��
S���A��Lj�o#t�oa��Ӧ���K�Aso~Uh�޿�(�M��nT�����g���0�F��t��j�� �W}㖛�K䵫|
���
�Ӈg�9��T����9Ʃ�Ϸ��6
:i�xE�K�ޛM����=�V�]�]������
S�
�g,y�Jm��,�=�c�%�e�%,�u�'i��ޯ���e}�#>�)Na���)n��?��&(�E�r���ޒ���{[
[Uϕ��\�7r	@�5�Ga�,���5�������"&��}[Y�+X��\v(�Uj�1�� ��e\2a1_�
۞����bӊ�M�v� 3]Q�ޏ[8�
��-�h�)�;��*�����Ǹ�܉�^��wz�i��5o|��c���f�,8��mI��{"<�%F��P}�� .{~9����t�g�r�y�.wD��+�6��H���3����P4��⩼x�_�:��u�
�fL'z�_~���8W�º�c�:���$���2�m��x�Į#ۚA�w��s3co/����jwr��}�
������bdߩ���@*9{\�-�Qr_�0� �_Qb���|���vxW���4�~ڊ���ǽ�7[�C�;=�\Y&c�I�v���H >�� &�âAv��v�ֲ_C����}
k:�r�a�R}Q&c�ٛ���|������ z�f�g�B�
+E,vw�}�_}q�68+v@��68�/Ƽ��crҶ���AbQ�����G�����n|tLJ/�h������O�a���Q�m�i6
.�`��Zx�{��,
+o�z�;u��
�n���-o�͖^D���a'L;�]-��%.��m/�������N����tTެ�E)��6n/�O��k�� �}iػ&�
��q�S�>/��/��6}΀�l�U��K�Vk�;fÅ��7��W��h�L���]��mH���X�c�]��c��n��[c&�c�?��ˢ$
+�&
+D�3����-��n��g�\�z������I.?ޔ6��=ϼaՎf�go���f{��˴�5+~�
��{vD7�!	�#��f�#EBS�;�x&�hL�%��Ս�}�d7����<�;/
��B����ֹY�Nc������^m�>Ÿ7�:,�Pc����7��+2������ݸ6��h��L3Gc��+�����D�
U���e&T
+�ɻ�=�t�����"�v�����u�8e�4����>�ۺ�*Zj�B�m7F�F�Zi
^`T�MT��o�]=�{q~e=�
+�T��K[xFqw�Ȧ̔�ўg�=pE�Ѯ�滩��)�a�W�h6{w
�<E�>�D�]��
�?��r�X\��džO���G���h�b�jd�g�gP��Q8}$1(.�dF�x1o������+𻀲�>5��~�3�w����})o:?� ��'5��;}�y��O�=��oa������X���ٜ}K�^	��TnR+�vt�����N���|�"����J�e%�yߜ�fL�C�t9���s�Os��4 �߾ ����
+
��/0f��
t
�tTkܞ:�!�ן�gUT/�{oP .5���0��
+[į�W�D
��؋*�+�a��E�����f3	���C%~�ˊ�l�Z��b��ļѳh�^Η�����qk"jN=��ESj�^v)b�h�;0��;s4�;�A�h�j
m��P[Ԑ��˧#���;�.R��{��q)��wu=��Ho���'�ˢq|���O�u���U��Ԋ%���{o��'t�\=~���p�a�2!���+�'�5�G� ?�>��QwG7֡�\�i��
2E�(
"<�go�)V�2핡�9�
�w4b���so2�r�
���x�f�=�Ӹ�� 
	)�Ow��G<�1Vdd1ۿ�k���������㕝B)�L/)�㑶rC/#��蟾vL�ǫ��=�\_ى���;�'�� 3�ѭx�0
��7��Ex�0��j&4���W��z���j%���,b�6��d�t�*�ɺ����
�Z]Y��;��l������%�U��@ �{�{��[�@ĨĢ�O=�q��4t��c at fч�$�vQ�����b;�f�
5ǃD5�+��U��O��w�+�$*w�h$���Ҝ
�ik�;�'�F�<)P?A�����nM�#zZ�t��
Ͳq��%P�_v߄
x@%�ϣ'�����l+�+�� f������[�6���'�<�"9���~���
KИ�s�߁H��yi�������+�X�;RӾ�^�O��H���,6�bq2��̍*�з�$�}��Էě�EMc��V����}���f���/�Z��<�1 �9�6����E�����)w��h>1�zG�
+͢4�{����"��<D7\r綀(9�!@�Lѫ��5��wO	�z,J|>s*��	0�H쒏��
��𜞴�'.�h�kE��K_M�T�����.�n�
HƜ�X��.��gW}Bٻ�&�jdNqM�w
ؔ��H(�"e~䎚zU�
qc_'�b�������s���w6W��|#�]b�Y���ˎ_0lg�
C�:�hf�8���ָ���f풏�7����)��f�	���!��x�^��o��;�Kaǭy�������q��2*��(�
�5Ғ����˅��*�M�!'�=k�'�m�Pc��DS��s+2��!��#�ܟb k
>!Jj$�⸅�*WZo�U�Zv�ۈ��r�D��ê6�9�g$�c��
=��{&��9G�\�c�r��2)�m�	
+��1��3@"Jn��:����N��,��;�������f�E�j�\%�Vk���]�:+�;�A��#E��9
-~��j1 at u�My�‚ae�:���	|�
�ɖ�b,?#��\��H��~�Dˈ@P��5:
+}����چ�����=v����j��
�T���
�
+�1�7����e�5���Rl����2�I������
����
+�
���ob�q�rg��۫0
O&p+�7f�Re�Z���x�9����N
T���A������nI|�߷�ӢoJ�W��޷F�צ�D�s�wx�F��ŷ�ٛ��F%B�
w�(
+�itNI<��X�I_���@� �U7�
"�)v��;3�*�O"������u��cY^qØbv4��h.^�-�G���x�6��	�K�Mj�|��2��lg�6�7���0Ų�>���U�RCi0�܉E�'?����z�Pl�D�X�cF��q��~�Zc�b������
�z�{�"��n��rȲzx���j��|co5��e��=�>�U#�x��
+yb�X�2����V�4��6��8ci
����Vlm��6�u�
�r�xL���H��2
+ 
;n�)�
� ��鉮�
+Kyz����߇
�k��C��
++('x����L��k��ȿ-ݩ�}=��}�߮G���po
�g��h��|$�׌A=j����3��Q0�0�l9vk�=ʶ�������u
����-4�u����@}d~2OE�	��K�cŞ�1����f�v�Έ������&��:�N��X�-�L؈+V�bS-�i�e	A�;�NoL7�.6! z��I`�O��/���5���y�w���Q
+�n\
S��>��B3�m��~zȁ;���q�բjx7i�
���bo<�H�L��-��F�}���wk2��1V,�Q�i�%.H޿wj���c��i��4r�ZJ�� ��0%R�\f\����V
Po.$[F�/֘��u������-���S����9�cV�����|7	a��
��Y�Y(���W�1�LN;�C�M�C) m�pn3_�<�
��ܥ�/�r�w���}�F��k��˽��4��'[5&��,7.k�X�~��y��a�_�s�m��/ă�
�l#ٚ-�6�8]�]��B>@�Ng۷n��[ 
%q�#�IQ����.`:w5�}z�QS�r���@��Q�J����
��$��69H$=���#&�ƨڈ����k�
�u� �tj}�Пu�a�����ҫ��c�ڝ>8o�ざ��"�뱧P5#jS��7����a�$H�Z�τ1��RU3���$�Nڝ5��0=
k܎w���'4�{�s�ԫ_
�y��C�q�V���σX��� M��*��
��
+��z�BG���V@^�S���"�� �
+����ۻ�."�ܮ��E}�U��Ǖ:�����)
+��%5��c�R��h�d����
F
�.����cA;�q�@
Ԗ�Y-�F���
��˪�讅>F�����X_4O2,�Z/sh��A�}Y;�x�<� �y�?>\�[���N��z	�^���y	/��GX�C@���
|�e�kl}
���^x�	���L�5`�����^�o�����xW��7���
�#�z�}1wՓJ�/�%��xh_�k��.���DS)���-�!5�K��w�As>�}x�d#��|Y.qN�d���ƀd2UE�u��:Cg�D$����Qs��
()rߜm9
�jlAP=p)w��Yq^V4JM���ȯ�;���� �WA�Z+�l
�rh
fk5�UŚ�g�-��e�3��
kɱ��)���	����w�V�	�M��e�kK+�"Wqm�R�@
J8�^�n����i����;}k��?��������_�o�:W,Y��g4^V�z޼�|�XK\��e�~��	�}�%$Gr�_����N뽂�2��Ib��}���[$ �]���
߼v�4Q�X�n��r/�U$�H�yrI/}�\�4X
�� +n
Z�w�tg�x�w��I��p	笾�T\+�FN�i�
�f�H<�NFoQ�Ck��N�-�!y�`�K�"�	}�G���L^���^�8::#�V6����1H�GZ��ȒF�Vi�z�W
+%���Ӿ��	:�m�%~DY�OZ2W
��a�
�O���H��ϖ
����9`}��
3.�!�#�帛�LU�06~1[��az�A�;"��Ҍ*���~�
�mߣnn�O�p�q�S@VD�3z��ԥ���_����S�9yF�M@��N)�T`�k�'��^�<d��d��z�Lu��Z3��(�!�>Z��_}ܿI!+�y����8-�G��SDC�
3ʷ���~\�^%.�++���p�5����~�����#�
]��w짓	�� ������=c��5m���������nnZH+�~��Qf��x
���M��
+-^�wx�d�
��a���z߾�
�
��JV�-����j�I}9�L8��1z�q)&"-���չH�˷���m�ǹ��} Q��^�(p�}+�
Py^�wr|�|в������iO�v�֠Ŵ�~	rN���rœh}}�S2����c�%�ӝq\B ���+������hf��e���K��3���[#"\
�5�]�|Σg {A����j%�c�_��
�Ӹr��'��#�A
��h N�^�!�QF ��'oc
:��DžO��n�i�
m��c�0�y�d�%�Z�M<���
��rz�3Z�
&�'i��
Ǖ�
~�{vwtv�ۙ}3��=��V�[-�Q���
E�@$@�����	ZQe(R�
+�}�t�e���� ����c�fU&@I�f��
v��n޼&������~�7�cE{�F!k�2X����I:����.[�B7��`P��I((Vv�n 3��$�t٥2�
��`�qt�S	����I#�})qy9<
��L�"Fj�U��QBG�}H�3#���83��Г4/��#�%tJ|9��m�
�L��0�5ܬ�xٞlU���L�%���.�2�CQ&�"MW&����Պ��/��
�bO����,�T���@������l�I�����
t����̇� 3�C<Ȍ�B��脲�R*���`R�*J
�����)�k�	K
+��|(
�nE�/�R���L2�B(
����dE�
+G�/��YP�� ./ڵz%�.�P1�쒯J
+�(�L���T�;�j�
�Y��C��8Lt5͡ЅR���TZ�m�� �+{QbV)����D5���G��~&y
��9?D5ˤ�h�f$�Q��΀(���
I�ɟQ�����Ӯ����ʖ(������
h���z���N�CФ���n��[M�J�h¢|��S���Q,����SV�-���^�B�$��H�N7PD�#
�]��E
�.$d��(�m���jC�.*
b*B�(�SI�+4�ʇ���%�OYQA���>�%7C�[�gY
ʡPHtLG)Q�7���UD�75=�C��r��S���<���@��jTh*3����y?>���J
+#�xDBVY9U[������<�y+T\F��ʫ��R�E�f�ْݚ:�(�K��lHȢK�������R/+Σ�b�F
�j烃���{&�2�?���
�b�1y�G�
*�
%��Td0��(xI1]�����$�gQ��.�du�¤J�,��Rl���e��$Ǫ ��:+
8_�!߁����Bb��D�}�K�hbQ��F>I�aR��LV	U頼��2
J(o8�
+9��DU�U��T*(O*�|�?
�=껨�翑��B�
�|�EcFa� !���0��緜�#H�kT2�A��<a(a��T��揆Q�]
U\80A���P�d��B� z�Q��Ġ�<Y��:��0-"���
��3��|�J>��s���@����g�|�H�dP�l���³Tn~q! �vfXe����t�@QAͲ�|I�]��B�
�*��7P��Z�w!�b~1��AT���J(��4��) 7Xt�a>y)�
��
+S�,�K���|~!���ˁ�k�E��Q�>$.bR'�T�������͗?#{@A��T�K�]f�e�{B*�����p�AF���֫�:K��.�,�˼]
+E}k�nL:]�
�}+
�
+:�0SJ��AE&��
+���ES8
"��c�
����k��^RZx�rر���?���pJٕ�dl
�Y���(�4h���`�ӿ/�쒱��`1hsEg]"�^(AEF�1h
B�mq�����"�͢L~
Z�̓׼�|7�3ʅl`E�6 �k
�M�YP �
�-�	 �n
iEa� �͢��H;B�[��J���
��
+:l���A��A���3vC�d��)�	*F���R����N�f�O��
�(���UĤ�
�[MEm�i��R�0��@&y]+(N�UzʨxM�>@1y
ITRQ�y1��2�,��b�Aˢ�S�*���q�H��5�\�,��!�VLE�fq�8*+��I�8�
��� ��ⓘ�˨�����B
+mOP%ك
+*>����T�g)�Ċ(W
�H�7��N���-��e��-��@vy���T�E�"�@�Y\�ϭ,�k.�j�2�L�0��|�i�S0(!eX�T�"R�R���*TD��]�TQJ�V!ܕ�O�Ը��`�n�o4��J���Rf9E�t�>����/g{��Etd-yJPh�������tP*n�g��]-����c��lSKE����S
(gR�Ņjz�T�:�"�C���E�Q�Љ?��$�i���|F RɎ���L�O�
��yVeA
D|oz�$�.��
+
+ːYFW�.�=�A��Z#dVZeA\RBٯ�|v	 �XJ[$�nMC�,�OX�B��g��2�?Ȭ�t1���}i>['?������.UB��gy�VV��a(�uQI�~@T�
U-
=	�N�/.����YT5$�λXT�
$,�H�)����ɢ}B,�أv��� Г�y�eT�=S`�E�|t3�@
�O !� ��`2�t�/�l�o�,$��K�b�սe��XLU�����B,:E��6�ȇTLi*�_Sbsw�
W� ���\���$�?)kY�ϫf2��h�T��]����Qe�{��'�����T(k�nqH$.�A-�Rj蜠����a�� j7�*��3���BF,�zD��aR-JS��@{�{�6���d��p�J����t&��xY1��"z��c�s�<O�I!��!Et��=�^VL"
*�P#���/Q5��EӀ�
+�Db���
+��w���(���b��ݺp�RD��{��rіӨ�NvF�r*����������2�d��{�ٮ3����C*��QA]��Ό]n�������"�Q)U)���)[Bg�3�s�=)�ȟ]Ji�
+�G]F'��+u�Uͨ��
�
�V
+����JQ����
+��v�a��&~@��K�������
�V���ԩU��Q�te�By����D�(Є+��B�(�(�4�
N-J���!�X�tz
�5H(�E�Y�B�V�>��

2;���a!a9]�����	*E�x�p�<�p�BB��B�
��bUӡ�I

+8��
*���d��C	��X�
+�d���7T6��:@�+��HRPN՝)��,l9u����QƢ�T,�M�Fȡ����<K�<h�ϢC
~��8

+�����@J-�
jŅ��v���
��
B:D�xOl$���pˢ��M�yUt���?D��9L�B�0-ϗ�QR:�J�$��Q9�a	
}�(�
-���ƨr?(J�I�<Bg�Q�
Q�����SJLޗ�Ǯt�����bE�����)!IM)ȼ{�XL�+(|
�#!	
5
�A�ϚE�|�<5�(V���f��t�˂W}O�)��ɤ��g����B�l�N2)���Yt���`O-I��Kq�4S^JYs2�� ,�
+�P�鿩�i�G
�3�$,�����/��PI���;�<dET�\t�,
�
+�٢K�L���tƢ3
��Q��*����S����+ݽ��lO�<�Oe��ӧ�E� {�,ʨpZ���O�����2�K�&���+-�s�T�p�/�k�d>�d�y]2�Ax�2K�
+��trIiY�9B�TZ`)}}
3����=%�YetQ�B�:U����Z(���~�0��ҒD��S�c�B�$�__��v�A>a��:���\H1
�Ǣ.�(�s�Ie��R���b��*��L#�å%��'ݧ���
+s'�������"�'F�Jы]�PJ�����
t�4
@�u,E�j�����
�V�+��m�KB*�BH�S����_VL�J���)t�DU���,��Q�.HeR�~��݅P��VH��(�J��A1�V�-U^�ڕ�������Rg�1J�ʙ��*ݕ�n�*L�M:���Age��"��na��(��
<M���}c0鬚7�uh���
S
&�n^L��0�Lufq9���ܽ���t�c�;�A��FYԆePz���V�t�zR�Q�D
��
N�c/�s�K����F(KPLW�+ԥ�ed He��rtz8Jߤ�_��=��QD�(�o�@���
+γ�ʨg��|D��;Fa>&��
++D1�.�C�҇���
+�7�p��\
+�L�
)�u]�Mg���v���.����v`R7 ��w��G:g�J ,�j�v���%�w+3�j�?��!ںWTPy����{y95���|���2,/+��_h����^΢��xQ�bz1�rV�I��-V`�dNBɮk7�a�=I

入�T���B&!�S`P䥤����QΤ��1J�w������O�`��OZ�>�E����,
�eGJ�y�EE��I
T=3V�ҥ8K���Ř{r	�TQQA\��nթ�=߽�c����M*��0�df7�@D�����Q��G+�t�����7@���xf^e���⻨��tq�Bn���U��9���>�,ϧϐ��Ŕ���p�BW
�D�|��C�������)Op)E�HqQ)����5SX��X����8�.�Y�Ϲ���eI>M*/����V�G���	��[
�j�x��4��ߢn�����+돈�߸��?�Ǟ��
��t��߸ƞQ�{�aN�+��rt�F9J'��*/b��SKwŕo�Y%�+r*�6���Н���Bѹ�dP<(T�h��m���pޓ�Q���	�e�}��8Y�$_�2y�w�3P%�r�^q�[5�c��'o��.E�@'��u ��BPYS�225��QR�?�>�6�
�p���O��l�
o"�q�i�~yz���m���F��Q�O�d��ޜ�F�
����
C��~J�o�4gЛϖ毓{��]�=�+�{K���g�9 ]o����'�J�
)4%,��=M�km��{Etw����in����y�!qIyq�Ϟe�J?iuW������ҭ����~z���
�.�~�������6
��}VR��ZD����-΋Y�*aaW�N+��
jv��b��W����ȗ�(�_
�(�dP���"D�(��m^�j+��kxs�SbR�0еެ�7�`��t ��:5��Q�j�W��b�E��u�4���g
z+/&-���L����w�#�PVV�GU�Ǘ�?�&�e [...]
+Yh �
+T�**�w�$4�B��(t�\E`�(!	@>[^��d4
�zY	�k�Ro��Ne������
��~{���J+Xo|VD��.4�d1�7�
�K"��w!O1%&�t�~�!,���~�������os�d���f�}@���j��,42��,�L"�,X�����`�B5y����/
+�4����>2P�Kڎ�=������s

+��`��co��p����s�té�/T�Մ�#�l�����~��脐QT����?��
�
�_���jF9�S@�衷�y����eǾ�a%2�޺p���)�0�A�5𶦔u���3���C�@��u���Dt�},n����-�W'�Xe�/�86&'6'$U�9u'��	0�A
��t��MQ��!j�
^��^<�Y��}��}����p|�{��NĦ;>J9������c��-G�~cRӲ�D|b�q���'������q�)lJۖve���'�ߓV'슖����^���>���������O�%�D5)����I��||FX��|q��
��^���i��'aU�$�:qگW$\ʎ�q������G��"����M/��hڣ��}m+6ݧ��������
��ݙ_o>h)I����V
;���=h+Y�Y���[�<��\�r��ݭю}�
g�szatZR
���cv
�p��)��w�j�mL�������QY3����t&��
��ܴSՕ�Jjb3��ج�nsZr:>';�r�j�Ծ���f�)8�uix�~�:�5(1���9_=�L:�J�mRm�
+N�Oq�Da��~����	���jZP
���g̦�ٕ�M����t���t at -��Jvʫ�}����{<1�=�r�Nav��� �ϯ��^e摶&<�ֈMp:f�����K|>�Q�3>�!�R��(:�^57�V
�gy'W��Gy�wn�����;��l�d��f˖]�_�*;6l�f���
�q
���F��#����۠�=j^&�`c
am�#iLy�
��N��ob3�s�C�K����zy&��f�M})��+���<ܚ��s*2�=�:έ��t���E�ስߔr�Z7�z��������є�2h2bEw�#�IX9'S6��� �UP'߲J�=�����p̣�Yy��tkBv65k�i�%�ʎ�
�Hd�}xcVռ�@y:����\}}����&�J�����#)[��MT�9+>�eU�&�]̪�X}��x��?��o/�Lt�KM
+	��3n�7=0�;���?�^�J:ԝ��m���=��Gg�ٹ'�.e;���1�^��
��	w$)�����.$��'	��9푷f�un�`Jy�JXCҨU [...]
��
6�� <��x{��������OY�SV�a
t
�1H1���p��0�ABx̺�e��kDI��kA�	��dB�����Mz>6-=����Ny#�\�x%��&1���vd)��\r�{"ふ�R�>�0�щ�^�*��L�
�-��=6g�c.����F��iEiX�h/$���Ѓ��g–���ޫ�є��\�.�A
ڴ[ޚv	�����?�2��D]��n��?��*̣�&A����ڔWx.�f�����stu��"1���zF��Fn�|*Ζ�_�6ӳ��s �а���o��եC*~6��y:0���"����.~U������pߵt@%�1d~K�q�^�
ʻ��T%��|ܫ᧝�
�t�gI��#n����%�-�I����x�/���{5��~d�w"�Cþ��?��C�w��3�c=�7��u��w���NF���Oщ{�<�;m�o�f:)�Qv�z$8�jTtt˦j[wJ��O�������$�y���Nqó{5�{y���Ȭ��#7巘�N
��(� t�SژuKR6α�����{-�M�G���Q���o�?xyG�?�X]��N��G'9�^>�,��t����c��tmZ��W����
4�3ݧ���Kj1�;	���'"�#iO�s�I��9��d`�\�;����[��+;RN�&2����6`szvjNѸ���(p��߻G��W�ź��
9����W�����o��}�M�>�?�թ_/|��'���}�\�۵�8���'�?��X�9�q�p�*	G�g��wsɚ7���Z����\����4)��.	��T9�VB&s¥hI9�m9�^��G+��	k��Sױ����ĸ��p��m�rOmM����5❰A��e�`&��&]jv�eT$ /$\Zn�i&��T t����X0��~"�W��j�)�u�+�GF2���7�[]�\����ޓ�.qmt�}�l�8���l��P�am���9Hy�
�%o%�&��9Ix����ʟ?�{76-i�z/~C��G�NuOdN����nY[ҡ�Ȅ�&<��@/� [...]
+�氨�a���K�Ξ#�َ}�9��]P��
��귦������Q�Kቍ�ΏV�5�����׽���x~�]��D|��}ѡ�E��[u��.
��ЗU��������U�'ǣ���mߥ,���T�'O������ݘ��xcZp"f�5���N���^A���\�l���}�ܫ�I:e
�KՙukyY˜Gp&�9��}�1^�[�
'qXk�
�o�u~�
�������J�r�.oN�t¤C����&��
�
��2K�+��N���<d�}1��)��.X
a�|{�`�^��2�Ze����ෙ�ɒ��z����9�Z�
V�ra�47�Y{�*�� S��b�7�v¥g=Z��c��C�Gڒ{�5'��X{U)w�)��I�^� �Ұ1�q��%�Qvn/[�et:pQn��ffA����
�b
AM6,co9D5K���<},<�	
\ݙ7��5�L��'@�݂������㦢WO؟>� 7�w
���}�R��������-�mN��Ṝ_'�,Z.o���#s���DUQ+�pd�}��[^�9eM�Ӽ#�&�����-�A��Jk�=7&ZY���[����ڵ�g��#��տ���\�&]NtFZ�`�
��	�RN�����O���d$��
;����[���+��ܣ�9�W�y��>��og������Kb�؝�6�������O_�~z��
�����&M�{	��i�1I{�G���c3
FgZK�S]�$��֗3��W��v Gv�n�=0o6��?�Lu}�����V�����u��Oi�I
�IjV��2�o�����~��MͿ�>`���{_/��,^��vZti��
p�s[���k3�C�V�<5/��`��UV�tK.�����3a7�W�<`Sa���+�S��~;6�Vt����׋En^֕	�W�{�>�T��_~��տ^6b�&Vd���5v�}(�ԧ���L@'�Lz��?��^O��/�	�N�NᙈSt6�wa��iew`Kʧ��v{�hz�d��^�*s�Zu&
{���2��"|C׉����p��ܢ^�YPKqS���Gޖ�h�)����\��
 .�I�%5��>>s"��lYyG1�Q
�+ڶ��ʴ_+΄nd���喌��ˆ�̂B��E
ĒZ�/h5	p���Lp��맖��TQ����½Wra� � C}
����@W6�
���,�`d�{$��NxčI�x`�t��q�Q�eS>��1`���u��z���u�1t	�դ�#�sܡh!<š�l�G�
����G��<ݽ2n����|��}+6->��6iU6E&�
�����m~�V�dj���3k�Qp�V��M:8����Qks��;g�r����U;��J^>�|����ZA�����v�-��������)�_�t��ML�ڷ�D�"�=Gƺ>�N�F&yG6F�*�V^et��h�&�N�4�Ȭ���X�Gm0=G�f�������7���u�
��뀬k;(��
��f���'��"S�#�I΁�Gm��o��{�s4x.6
��*:��
~���O˷j�c�1��g�:K����
+^m���0�J^�@d�m�Υ\���-H��e��wf�>�=Z��
�dt�{8	�:�̞r�O~�&����޾A��?������I�Tp����w�FE�٠e(�t�}�֜W�
���pVq�N�
��)��&���@O�ᛘg�r���c���&���oمU[�W6m�c���%�����΢��
k���4�l�y��L)���p���i�Ixx�
8���N��3���H[c����},
����KZ�F!��a�0�`ʄC\��hA&k�:Dg3A��
D�h�,�9��G�`G��y��X��3���зx��g�Λ��`��o� ~�l� �
wܴ6��1�Tw���ʒ��]
k�VE�1S&��9`;K
�M̡lC��]�
�J��'�_�*Q��1�]H�|"�
���r��-|s�W�:>Z���M��g�]���
HXU��љȔ�j�������}�o[�[}�;�
�k_�
����O_�<lf��_x}���L#cc����AkH/Z����C�fV��	���❳��Q�O����8�/�ߋ��z����;-��ny;�5`��W[�����w��P�;��7��
�avUgƧ�^EG
���Gm��.���ũ_=�UW�cPXO I���n�̊�"�“k�=����'�si��)�54)���i�.o|��{��{u������,�E˟�3���^�D�ɦ�J;���b$<:q�&��:�C/��������Cr�)�6>
8��;L��H�� [...]
��V`��a�u��qt��!�*a�'j�5+���N�h��4��$��D�EI��A�k��Y�ɘ	�]$�W��
0��Q��l�%�[�������\X�ˆ�
+�
�#�ü�
x�h�{5"�F�L�w���i��� �h���U�Wޖ[R�3
*��I&�U&�Ҷ�[v]�HV�������y#6��)΁�Mx:�t�G'���_���,�w��y"l�K��z< ��^��
}א}�,X.f�etz<��Avf{q$so�oҥ�!�+a�	�$嗵E�$�7�y��6�)��0
�_�o2˖�q�F�
k6f��n�%��
�[���Y+���е�+c.���l����-�Wc�c�iysگFݪ���J��M�<���)�Q��ǻ��'Egb���Qm��4g^<4�����؇-EI���.�!:�}��J��s��Y��磝���Ҷ>CtJ����]}�=�9&8���
�W����Z��WN���ﴗ��h�f��1�1��O��0"�`�:�% ӭ���]:��X�
�SˍL�
ؚh� 9�R���
!���`os~਀}���'�3�Fܥ���rA���7g��y[�iү��N������ڰY
n���A'%��^��}��~���M#�
)f�rRvmf��U���`0���6ֈ�m������v��
~����)dW��N5�X�j�y�֦ 
2�R�!��
��U�m
̸�u_��9��
�gA�� _��}�

����\����y�0�ȫɅe�ĵ0��L�҇|��7�|y��N��1#:���w at _gCj�5G��SQ�,�.u��9��N�W�������LH���"$mK��
,��Zwux��� 
4[ '��7���	��w����6f:����$���9�7��k�O+Ȅ���7�`g�ȏ��	}�.�
�/3/�N#;�h0!�t�`�l0Z�ܟ]�gt�LH�Ny��[���n)}0t�s��k��#�p�ո_��j�h����d�:
�2����	�;������CՉyu"<h2�C�ބM�Ŝ-�췤\&�O��g9�_Ms��	��-��iD�C�qE=67<���'u�/��k����ma�=�9�v$�=�m�k�&-z���qsѳ����S�ӤI;��m3�6|�(�fխȯ��޿r��_�
6��
�f5
�t�����J;���Cˎ�r���_�ۥ���9�
x���p��Iؚiu+�"6ݵ?2^�����?Ƨ��9ķ��
pÕ�-��;>θ�ڬ���Z���l�'mIإ���m
x
f��W��x'^���ǍG�%�ia6'9��dMY�2k�����
��p8 ؗ��Ϡ�`>Gm��I��)
{'�� 
Dx/~�{�>��׈P�H8A8zܩ�"��WA?jSN�8�0k���a�JZ�!;/���k;��WA�Z � 0��6^껴3o��5�W'�^�Y�������=��SN�wk�0�
1���&�o2��=8<s$	�Y��
^{6�iy1&>�����:����3�jI�8�k6&<�OG co&��:Y6��� �4�R>�6��TmL�T��:E�w�k�k�D�du�9�����^;��w#�1�kR�����w���7�7�c�Y1�b���
�k[�b0N[s�й1��B�0
�:��	�!
��[�'%UY��7b�H^��Z�������m_�G�W$�z�MX�b�wdm֨\u
-<��5p�N�����?YU��s�s�"ߘ�4
���T`���W/�o2#
�1�?�����{�/��+���al�n�&
ckN�O^�{�w�.i���{�a�}*�{j§W^�!�1i�f�]+���^>�x�Dt|���ؘ8��&6�9�q#ߝ�;퐷,ߩ���7����I["�c��;��Ww/|�>��9ϹԜ$|���u��o���5%�Y��������C+�,�:�֧>.�}���xk�s
����aeƫ�<k@�
j%��9/�[K��5�12!=u�T������[i%63<�
ߐs�T�A��)��_V����_%�zN$��Ε���ؔ�;n�3�π��r+�NI��X3cm�{*��
u�F���
�8`#�:z
8ҡ�J�Z��6� ����?
Trs�*������
+�
�o�
����^�&�
A�8�3���c_/Z.%?��:��-n7˓V� ���hmm/
�����5�?�9��IxM�WV
'������W�	��������[6��tX��,*x�h�|�_m�-�Nzג
+WB�ǧ쉻T�-�O�Mٍ��IM'��Ӿ�a��۟
������ܢ��� �÷
]�;/Ɯ&Y:�;�Y近Y
�!
X)�`��-�}��F��_���.
�t?����
\&BzU�;0v�Z�i��j,����ٺ����k�.O��_Z����zBܫ�%�ZIġ���l�C�-oKx�-q��=�Υ]:Q�58�1c�=������M��%�2P�� n�tn�Hk�6M׫9i���wVH�w����g�N�(6+:�p����)n���c���!=3r	����ݪ�]��+�&��+���VGGܷ�J
�����]n�vЄֲ��u�p	k^�5����?oV��Y%6gD�/nw��6��
+�s��q��c
eK�U����Ƣ���_I>���c;����W�~%��Jj�f�+�vne�#m
ܬ{'뒶�~�7�A9�I1��uu���WO���
��K�f��������I�<��hA6pkB~�~��7�����|�>�2!81�{��ɩ~�+�G���w�6E+�+1��ܳ��O֧�8��mWtN/Hy�>H���Lx����v�՜ȴ�\tZ�
���V� ����ۡ������?>5
�>������k?p��Ȝ���1�~א
_����O�o���Ȗ �n���?M:�U�M�MΚĸ�"`���E��>�1�q�V��h�OGŕ�ğf������w��9�m��
�ɆC��
liġWl�U]s��G͇=��dF�t��tj�ޯ�>ؚ�}��<{
x���k�K(9I��!
�
z9��<Q��=2
��s"�{1
�
�.��`�sa�~c�[�Pw�������u��I���Lx�+"4|
��K2n�+m^���|�6�*�t�u@�2�+�p���7�a�1b�6�N�\�
�i�ɤ[ڜ�K �����`�N
ox���
��+�K��̒Z�ڽ5���
�$೨K��t����y��6�$M���KQ�Q�����s�Uw`v-���������i7����iqe�&����S4$l���U�v~�Yv[|��V��8�|�I7�K���s�#�F;�-~s�Ș�tƭ�$]Z~��tn�߸1�hY���Ĭ��l�6�.k�M�*����55|�L��-ͅ,W�����Kޚv9�ٌ��lM5mM����[����WE�K:��z&�%�shz�&t��:�_��A�'��� ��>�?k�.1gQ�g-�踺->�j��hڭߵ0e���_�F�Z�w��� ^���4cB�M�{L����=�rO�Y|V�üm�fE
&Eܡ���Y��0���'�G�w�crR+��_K��=i����2�B-!z�������/���?��#���+b�_F�&�սC����m�g�[����M�i:1���HZ�A�� ��u��n&���9�gc��㪺���/�4�^o;4��7���^�d��6i݋)a���܃[6u��C�g	�Y����KϏ�n���}Zq̭ [...]
i�'�OԵO��d�F�p�]������b��g�zM�\�s��ڜ���t�єo�k,p��^y �6�ACx.�U��-Ԧ����ɔ
�^L��I�n`~���z��%�� �������M���i��1��#�V.Ttf�Z�β�3#:k�B��Ȝ�u�8�����-�|��,1�h�u�N w��ͪ�8�ḫ�lMK��F�G �TmMJN'�v<��ѳﻋ���
1��~kJv66�lڜR�-�
�������)\�& ��
��KodFٺ1%���H�m>����Ʀ�u)�^���;��WO�>����γ��~�q��������Ql`Ge��g�zzM�Im|���g���Or^n����"�L�iO����א��	'�)���E�hgQ��+��W�;�L)�[���C�}���M���q+s�v۟��	?��`������K'}k,:�����]��7��(��g�>��8�s���W�Mx��1�6��`®磳ٍIٹ
�gϞ\(�����
�^�\�b
��K�Ž�na����Hx���q��W���<M ��9̪�{p$�
����p ̯��<Ҧm�A�����
ߘ��c�.��	�$��8��q?�5j�����
ɻ1{�����~k�_	s#�<j6ߗ��:Xm
�\2h�Eܪ��G�}����}�x�a��!#�U�
8�(�Wq���gAϸ������h�h�	/�����"�	x
�6�6�1�Ѝ
���rVR��￞E
}W3��w�Z�-n�on8L�5�E�y/�O���/��3a�<
�H�>%g��>��t�EC�K�Tnq�������b�u<�C�P������2��gB�!�o�-�4鰴;��V.�a��X��
恸CӍ��ʄ˨��&F1h�[��j���ƌ�*���:ޫQYUtZ��$؛m��>��~��̟����Ջ���D�cN^Gz�a�!��tk8ȿ�
��d|��m���
��(fZ|&e7+VǕV�$�P�ً�z���$9#m�	�{�VQurNt&n�oUw�'ν����o�
5�9<��)�p����bvEgrz�79�+��g�T���x�
���_��"
�7��
���3��a"(n��݇�Ξ��Kژ����y��5
���jڷ�(��'t]�Iu
��AQc�)oI����`|��}Ob�O�����D��?�O�>��&
ʶ�U|w���`K�
~u�[�+<��/��l:0r'�
���o�\�����/�S�s
Uᖵ��$u8����׌��`����>�^0���
+6�Ԧ<�S�aQ�NHܜ򰫶���1�AEL�K���
j$�KҌ9D��^�B��L�'I���
�_����M�A;���q�d�'i����t ��*6�'=�v�-m�=��q���d��/��G��y8�����L:te
|��x��01�w5;?�}�*���F3Tto/{a
$0�;K7�?c{Q��YR+a��p��Z9��Y6}*A2�
|�g�o�D��M��"b�:S�anq�����׀�F��V�,��\K�$B}�%l
@1I��1b>Ы���G��[�SZ���Y�w� ��C17���d�GI���u�*�[��ÊM�;�3
IS�������?��;�'��&g��i���|�
쭰��Z��gڴ�ίM�mNw}�
�?���Ѳ��.<hc`�~#�8����F���7+������l��O#�k+��vʢ=�N����;k�S����G#������(����,��ƌ���=aU��=�~$eWr���]�9i:�L8Ul��K [...]
+_/*�q{������O7�`��m�q�"V5'�
��

��
�9e�֜�kmZV�6�q �1��]f�*p˄�V
+�
��8��Am��j>`"q�ԠF
wJj1����7��,�LĂ�'֥�e=�a#���t��\*|ݑ�O,�^�=
������ܲq8
�*��Z���]�
��Cy��e�'����홰 �����㮏7g�	����
�p�=,
�&����~<�Q`AYg2�����]���/�!������uz^�[���w�H�
�&#�
�.M�7���:u&`��7u���}���0/��p�F��a��-��;˖��^q����u���>�
�߹�Mp�)8ig樂w��m��xsdz��%�S�:���'� �o3i.��)`?E�p�5+��ژ�xb���2:�m�z"=��찦��N��G'�?����;�mw�j�㮾���o� ��ⲓ�7�VΉlX����?>�
���4��A�{T��Gٽz-6+��]06S/���v�r�O����>�鈕}(A�!
�b.n%�wF�†���{�����Βa��%��rá��pJ�Ǻ?ڰ���-��1����8.��y�/�l [...]
u–~�h�鈛s�5��$�g�u�8���w�Jvq�NnI������OэyU�lH.���*`ʮ�'��=}�iۂqߚ3�
�����+�ƝW�r��+s�֕iY5

�� lMX�П��]N�.�C�H�_N��7���I�F�[��WbA~M��?urO&ü����4�[��]轔�u��2p'�Tg�@���c�'
+���q{�A�'�}��f���\P%�qQ����Z�μV��l�!<�j��"喷�3�*<`�`������7����1�w*��%|>
2�a-k�q�Y�E� �o:5�K������� ��{s���\�Ի�i2A��Aǧ�?�,��]2�}�k0��
��Z�q'�x���
��Ȇ�oe�}s޾��ۨF~P��rK�0��>n�L;z�	祯����ìܜ�u'
n�<
T�#.Y���=�u;��/���1�?�>%<
\
��Z�tbn^�̀-�~m�fV���H_(p��_���>�1���­�o����,�4�3�j��1����r�s��/�Q��~�
�:�#�'� k��?��/�΄�F��<�G���u��Gj~�|�ܭU%}H�8	�A�i�r�
5g�!���V����/�$��0���G	����ie�y����	�񗓢S�G�Ĭ�� �7��0|CҮ�I{����

����x�l�� }��{r�v{I.h�C*�βJ�[T�_���%��Cc~�8��L�d
yt�Cbq�I匀����
6am
�)0�_M��R΋7�������=f]���
���t�<��/�����$�#X�h��:e�/kۘ<�Q���`O�$
�'�u1��
<p���?�-���-�~�)���#i��	�H�wÖZ��0��Ҧ�;��t@ѵ
5m%
kS��;�����ǰF�
�;.I}�Ϋў����2~i[.�S�|q��W���v,h���8؂
򍣸�y��s	���� �ϩ�Nug£��Z!p���[�6�	�_��LҸU����UsQ�?�S�	�!�KÞT�C:en�`�^6
��
�p�[ՙ���1�`��R>���y
�[6�;����1���;�E/��~n�]FEĦ�NH���C�љ^eҡ~)o� �2�R
���f�&�N�ܻ�CkmLҘtY��I��=�3�Q��e�y��]��'�M
:O�-�] ��ws ���kSs��
��lP'ǜ�Ft�D��v�(�
!�׳!���y�<��@1��{z��Jx-`ct���6�O��Լ���ѫ���p�&�dC琙���)��W(^k�.�� �ga�R>��o�
��
��?�
+Ȼ��smJR���}����{"�բ���Ǥ���G ��(�i�<����^ւ\#����[��'�W�ļx��5
�kngYo��3��ǧ*EƯ�dj����r��J��Zf�r�H��r���ˍ̒ތ����Y���x`�Z�g�G=}����
Џ�&Ǽ&5��e�w%}���������h2p�1
��cz^)]|����1o���7������ ���
f�A�.ˆ
z���,�W,0t
�iq��Oڲe�>
��
O��M�L�]�\~
��Xh�)�i ��M�G׳�8���~I��qX���[.G��0���{�?ao�fA�A'2-��

���j�yQ�~�!:��
ޚ
O��
���Sky�n<���U�a�i�#���q��>n��Ú��YЩ��(��r�N
�s��pj��KՅ�ۄv�VIm©�X���{�Dz��C���	ޑ�CP
�Uo͉kV'D'6'M����C+:˷@��A�G���m�Q��6��^E����_�|,���9w�k1�e�r���������
:�9)Eq��)���NP%��O�)2'LT��>�w���:�.<�5�=��Q6e}�n��� S�]� �	�%
���Op�r��.E;�3��L4i��o����듿��[?�{�@<�mP`�^s
+�Bҭg�-`�>��\��-�OX��H���)��
�]�g6��,n�:���u��]�Y�,
lMGʧ�
9�����ր�9
+6�����c����l
ɐ1azY:8�
�h�B�˹�K�����
+�f<�
���Z��l�l/�
8�[��:
:=���q���
�p5��6����P�
9�!�X;`PAYw�+��ͱ �Zߗ�D��,

�"r<�d��椇}:�2����ǣ��w_��aoe�%L�q��5��N��r���/1�Ŝ�ᅱ	�_K8�ڔ_#�wu�=��
6ph.$co5�G��˗&�χ
���؞ת�u`
Ʌ�[\��$��G�:��������_ςN
������*~& iڜ�|��Ng��=���?[��.�MI�bS��Q�o����^��d>���Ǖ��G8�g��1�P4��?�焧s�3)���RvĦu�Y=;�4�Sn�2aU�Ŧe5�(�CT�WE��G7'x��9��'�?
{���/n�
�Zy�b��c6љ�	�A�Wg~���w����m~®F�|�&o�Z�7����\�ڭYq�Ƙ�2�0�^͂~NفO8d
�	���Q�'�	���S\�V?ըra�*iWulM�+�s��m��i��~�I+����w��si�Qz[
ܗ�O?�
&�&��Nv�K̶�^g��]%����<���{���/K
+i.,�N{%
�9���	�ѴϨ��8q�&��)��)�����6�
����y�;�N�jBV
�
N�^>p
a�N@�ɸ��S� X��V�rQ�_:�h�����K��
5|돀	P�M�eR6�
u�
�)9ِ����
VpRva��d�gQ'�h.���y�3�!`d�}�3�zm‡8��y
�g���k��Ad�
��E�HZ�>�y�+nH»Ҁ�S�!�>�
~	��Jf^���+?.i�Q��q
��Uպ2*>�p�$<�kS��g�{J��� ��xWtVP��4��
+�Vu��'��,��
�­�L�b�	�!8�qțQ�if��>�w�%s
�ea��n-sj9�9��W��Y+�;YO�u�lN����ϠH�Z2��P��������w�}�)�

{~��$2�=�PԼ|��l�V�B�j���w��F&x�P���� \��]��K9$uqXױy��c�!����DV���G�iy�ǂ�+�G���Ķ�ݺ�[�VT,�XA���{!�{OH!	���		!���{�I �n�g�s�{�r'���8�f����Z���&#D۟�
�o
)��ꆼ��-u;
E�^�������R?����DMH<�b.f	��)B��)f���*%&��e��%�]��g
+�ﱬ�ۙ
�s��]C�2�pQ{��s%b
����ޟ+��?g)y�*L��
6�\EH1K𑗪2إ�
�s�
q�`�ϔ,�IB��
+0�A=�&`�'jT��
6�b��슒�9��1�>'�?��8�<��}Ѕ�V��
+��c�Y��
a�k�F]�������π6|_`#.��ԋy!۪�e]�1K��1��J\����ACH֋~�	L��%�3��)闖�?�L����kLp�:�BM���F���@��{�����^����*B�E�	>
�o��t��d�N�!��2��Yv酆Yd�$D�$��356�_k
��
%��
�7�?��t�ʡ���d���\�mZ����
6ɾ��0��o�,R
+�g����
+
��h�}����&�!gsT���4�g�E��L*�{����A��-�s,@�
��C��0�{}���~j�|��0Z����� Y�
��

2��
.�2MN֍�·�0�g
+J.P����2�����ן��ٽ��,�p1W!8��{C��{$++2�()@N�L��-2����mS�C�?7O�
��ZQ
���^#��n��mv8����{����aZ�y��n�D�7��m4@��Fq!GbR��%^[���$�E\h�y9>�y�a�s8��N��-bb�YF�[�*r[��:���
5ߎ3�0��
;=p��^�˅�4�b�8Ħ�&��<�M��cUl���

�|�C��1L�O
-�_�R�}.�)�DNN�
q,-�5��]�C�����%_�\�\}�c� ���
Lԙ
+�h���h�G���ηS���U�se(���U��cE9�$g�lvZk)t��-v��@?
J��Z���p �Q�*R�%:��2
u�a������?k<��EF񿷸
��R΁�?�P�l*L��x��Yh�$9�p��?�0K(��j��
m�$ĘƑ��#p�
ȇ��bw}��|����6��
�ۦ$%Ye�p�}
)&�R�.��w��w�&�i�
�j
����냺����M�� ]�u����p���ڊ�\n����Ez�v�����g] �"��$��c���*��5.��
 �-2D�
��)�k
ÿ���*2�AFޥ����
���M@,��\m�u:����9����%:�#���9>�x�UdÅn4�]k ���
'H	77�s_��a�/4����G*���I<<���o�=煮3��Y��ʰQ��]�ָ��6�&�gڀ�8�S�����ÿnv����!<�Fȱ��<��yr��42�\�M��Lʻ�s;����E~;�%�d��

pΉ���~�U�
+0�#��K=�[
+�.V�=�E����;q���0���1�v�
�B�v'��hd'F[�\q��EFK�H�I�q|��`ɗ�޼�ra�}97��z;�]?<0	�A��0.�`��U��8��z�%��~�(�6�)5L0��ԜR�������=�a���lv.CElwd�ҏ �(�)�6I�?
.r��ül�b�
��W�u�<�a�$�?�\����
\
#w�l�DY\�d���)B����\�C�����r~�� 9r���Չ���q��-�l�Ϧ)�G㘐�sl����P��zH���S@���<��k��>���j�ܦ�`.�����n���l.|�k�~е�>�����@�Y&1�
+Z汄�x4��?A�mv����Z=��q�s�O=Ѱ�M��΀/;Q�#�b��n_��VW��RC�s)#��j}��i��S�*��Ҙ�j���h���p���` �х�s!O����*�/O���	qf1:�:�� �p0�
8��g��C�,Yx1K�1�&��M�Bw��>�Wg=]m�w��Gx�T�]�Z�a?�e@?��
c� ]�e����Fc�˓I\��9z��y,�_hkk-Sl�� 
+�f\�F+����xo�
��Vs��b�k/.�q��Ml�EZ��$.�8C���}7[����㥆��/ ϟΗ�,T?N���(�|�W��]�qV��Z���8���ށ�������Kt�Z-��yB扺4�8R�ӑ�|�1��p��g����x���k�K=V�ӍCE�vz2_.�%8���oC~�>�Hx0�Ov��@��q�k��7�
E�{]�/���wrN܃qB��V��MJ˴M��LRf�^?�W?�Z��y:W���U�>D
��*Ks2BK<�����[�����Wƞ��{m��G��^G�H����׶I>�\]�?�02�{a����W+��U�9�դ:���O�R
����{��H]+�~ �f
��

@?��@�hY����
��B����J
�DƄX���86���^_��:�%��
|�
�3�w�i�8����#�:!�V�����T�>���
[d��#���d�a�sx۽�����e�1��|M�ӭ�
��iT���\���=�`���Z�Z��
�~1�5��`��p
v&%%Z��<F�J=u���F at O�����q\�E�C
M�Z��0�ly����~R]�~N��X��L[��p���
� ԧ�)��L��𥪼��ě��؛�؛c̴G�ݸ��aB�js���)b�uy:e_���<���"��r}�+'���

k�$Z���������g*^�=57㾦"�i'<�+�y�
z2��7IH	�}�O�
 � |6��u����LJ�'���n|�^LM=�VUŴ�ź�ד���'����JB��C_��{��Ź_U��?7Z3��g�Q�J8�{��O���ZB��9�XNM;��'Z.i���kG����_�6f;��y�O��4u�_r�
��ޘ
�kA��샇M��=֏�?
�y�kIv���}w��d�ゞX�1ٿ �i�����}ZjHq\�Ox4S
�2�E#"�n]���AT�Fw�{9'ᶄ�xSJO���g?���o��CnM
+�"��j��
���:�^�uY/�*�
4����줻��J~��^b�S4�a�/��?,����
Gc/�M�Ix8����,����
�Wb�v;���Se� ��a�wZ���-E��r�͋�
u�_9
�v���Ώ~{}(/�(5a����u����;����c�|� -a�
�f
���a�Q���P��� �#��\M��le꓍vJ�z��`���
�Xk�8��@����T�:Q�7��q����1R�J=�iF�� c��S�Ҟ.Ԧ?[kJu(.�
b
G����r
�`�
+p���t����g ��dE�����e}�C�Ir�������
����
ylu�Z�r��b�2���"Ʀ�B�rR�	Р�f��^�k����v'�
ȗ
���W@���������ab�jk駹j�f���B䡔�i�Y3���������j�DZa�M��
���ۊ]���U��彝��~��$.U9ow���Q���
���W��/3‚7Ԅ�ח �;�����
�I��p�-��Xo��������tu}ʻ.������OFq%y����
'%=
'$;(����Ġ����G�?�&�1��+��Y���{��)��7U��;���g��
���k]�CU]�!@>�(��ߵe�S.�h�M����)��ё��Ұ�
t�L���R�q9K��ȗ��
������9�ך��^*��
��a���<��>do��V�f�&��|e��RU�S%w{�e���}��8[	wYi���h.��ц�8��>�"c&y�LqKֻ�ߦxA�O�~�s"��R�o�a�k�o���D�8]5O�2����I�ו옛��2z�m	%��no�'p�����8��� [...]
+�Yo�y8Wr[#����[�ۈMy�/�z�����\�~x4\�Yߗ�~�=㣘�}Sמ��TEou��m4���En��
�����oQ>KM��씯��"��Ns��d^8~�&��Z]�
� ��T���K�%�w�I����`aF�G����l�uZoHs��C�Z$ĸ�i.�4�*8V�inod��s59����;+�	�w:�^[f�i�ʤ�+-�ģ�&�n?7}����LU�
/���
�<DI}�݁͹TU���1����
W[��t-��=����jhП��0��0��5/��r^l4��j�	�Vg=��~�D~���b&{��R�L�gQ�6��|��.��ۍ�Y�����h��<�L
����5��� >n�w������>�F[��d�ۆ�?Nq�ò\�[f)>so�֚�|�!�q�)��lU��4+��
7��A*��$�n
2�_j�b
�
�[�ۀ��u���Nҏ�vSNt����bD>;ƥ�k���&'g m2O��"�\�1I��.4�߫�Q�2a����	���t{�~�t������6x�i��2Í���6��2v��!�qt��]���w��HJ�;�__��+��V��
[�� 97�q���`����
z2�MP5f|d����l'G�V��IhI��I��
W �a{��c)1�&��-6f�Y�,�2K�������~��N�ם���#�459_�za�����W�1R�R��$e�ܝb'ݛd�<
���ce�-� C���
+|���c��������+��FK��zS�. c�)��
�[~��N
+"�
���?Y��p{_Qp{����� ��"���c�h+s\-r�?�X�>f�&�q�1�Y�MzD�~{��$��r3<DY���t���L`N�J��&1"d�>�u:�v'>�aw
�0]�
�i��~��e�e%�E���ҝ���^Y��ЕAt�jw��e��{4FI��-�l
2��_M@�]�-	8�6y�po���܈q��d:�a"�\��y,!���P��>[�=
`�1>l��ޑ�֘�T��y,�'�ꅇ\�5ü�c�mu���Nj�^-��sm�v{�*��B}��s
u
H��I.�b��:�{Y&�9G̼�V��be�S%7󱌙�PJ�z�Ղ�2��JWZ��
5�/
y/������`_-rZ�\+2d��8�TU��ņ���^{�4��U�����	s�n��<��O���F�)+-��N���1�pl
†
�ҊΕ,�U�*��9 �*䟵���J�!�y��	6.�ds� �Z����T�BT��&�Q���F��74�������͖�:
t��U��S]o
�b�~.�)��t��h�����S�,U����~�C�#
>�����(9z��J�M�7Ŋ��C�v����p�.�i�%�yc��\

~8�L�8��O��4�c�-Rd��`��^O��r]���΢/#��zT�#Em��u��~(F-5����u�����Z�K{��U�7�Lx4_������#�la���ۣ�0EU��������`䛧�6%�t��
��q���w��En�
E_f;
+�w�qYbN����=P�Ñ�P�<�\M�]h����qF�����s5��,�E��ꊔ3�t� �����`�������!Íc��U���v�j���F�A���.4�}� ����ىK�ģ��
��2]
c�D�8��L^N8S����� �8.֪�#
#����R���
����g ���\�`NT���	J�j��TU+:V
+�Gb\��>�v�y:Sl��� ^���
@�]�d��5�7�0�+����\������=p/�5VVW�6HH��Z[�v8L�>#F�G�A��o����wk
���C���t��Z��rF��rV���
v"a�7{0�

��Gc�8M3֯������YQ�Ӄa�߱�Yp�5��<�K��ga��U�[g+8Z�z�W׆���D{�Z����|�0=c���`�9���89
h��a�C'�����y���T���c��9��Nf.f+�7zK}U@
�=�F��m-��i���p��MY/v���懲z�v4BK��9����w2V���	6�X�Fl}2��Ԟy~*F
O����'�
��uB���P�ڴW��?V[�ީk��%�T�����Jf��+K��+`i�Js����jC�?���p�?���$"�x���5D���O�D�Ԍ��Ƃô�'S���+�������X����������<M� ��3@�%�<��)��;V�;\�m��#�c�D`\>l�Q3�4��$#{���c���S�Oz>N��{(E�/
+8s}���h��+}%QgZF�YJ�׏c��c��M KO�"�
SC
� �|�
2D�yl��Zd"‘��x$�@Ng���T��
%׬���Z
���d�>��LQ��L��gJv�p�_�d�U^
|(.��{����N���,r0^���bm������r�IBI2 �h\��$)��
�x����d�
+gs!�2FVx0����$e���
�
+j��@���P��f{������g3�d���}>��e���V�ި �����
�(��v� �/ֻJ��P�̈́����Tǃ^���[��R�y���HR�`�.��N'�G?�:��gm��[�ޟ(��C16r�%��(%��$'�Q7.�^\���nj�d
Χ	}K-{�+�
𥆒o�a�6{�.=i��m���,=�$%Yd|�m���7�H���y1A��-e'��,�y܅�.f�:,t�zvP�I9����Gc�d��aj�D���K ^�
+TܱFH?VV0��y�
|
����;�n�r\���ۇ�9B�F	іI�8AM��%=Yj)�4���19�DɅ��
+��ʲ��	l�e���:�2bU����J�,6���d�Xi-r�LѲ��SU����%8X����	F�^?�w�1�i�5���(9v��m�� ��k��_�pI �ҭrb��
�V��Lu�kYy��y<��
M3 ��� �R@�(x(�����/r�,�8�cbl�
�!`����P��t"GG�
~S
+
��w�,��e�:Wq��UB���n��a��4I)I��p���|��V���01v��k�\x$%�mw"���"?��#�
+B�I�O5�p��Y��������oe��[�Mښ
+��
�=�	���Z5 V��-1%#��T��	��ִ��|�����FW�����7���/�S?�ZT],	kV�|dQ�/�jO4"�M�Gئ8P�(#e���Gm#$=�a��Z�)�A�f+�w��p�C�>
��Z�|�I�ŭ �𧾧S�R�l�d�NT<�y�U`����P�%�`��ن��KS���A�?�&�GX��1^���
7_
{��M�1LV�ׇ��35E��U��N|�e������&��{�����Y�׻��6��?�	\��p��?��2_�`�f4���	c\ćH�ݵfb�?�U���E�q���0�cgy$%�}�e���H�-ov�Y)ƩF�F?;U#,px�� !��=���,��J
<b���/�|X[z��\�&' \^
h�|6{!�z*΢�#-.�h�9���up2̓^��2�=�|]kNr\��}j�3�T�e�=����
вN�<@�����`��
+b�u�����u4����r�~���=�
<��X�P���qL���wo y�0�K>��:뚡����sM9Ӫ*C���cTU��F��|U��b��P�K��[� ��kS�-w�����a?�;����[��.���M��B�hD9/
��G�جc�|2[N�N�x/<����}PO� ���,����|�1��,+����f���qZ�E^�1Mx�0�t
��&�Q7U���[}.�qR��[|��Sl
b$�3�o
�5

^l��\��rۙ��nOP ��
me��Jmǡ
#*[?� �,p�?օ��K�n��/y"��d�nT��>���^�J�Kq�I|�IN.����Z�
�BW���i|�a��t��+?�������m8�*:Mѐϵ\���K�$��]z����w'��'�jV�����֎��5�\�5Hi�8��M�JʞXX�d%nt��[��۝�H]kY�l��0/�� :�����f�)�2�pR�h��,���fגw��e#��R)̢�o� [...]
+]����ͮ��
+��f���
r�V�n
��t��D��2<��,
�bl
�
+��~�qz�M.�Z��#Veu�E���}R
+Ҟ�:�[��]we�f33d����*H�lf��w񒖁��RQ���O��(�d������	Y��L��J���J}�U+�ͷ�/��<���lU�૭H������=0��AD�e��u"e������Z��V�(�6�H��V���dmE���Η�������!e{���7��:TpK�g�I3�M�-�Ƈ�v�|�M��/�<�Q�/nE���Ee�_��F���ן�D����o�.���|�T�y�T�z�P)2O��M����9��X�!],p��%�{�E~�
`��~��� !�
���x�?��ˊΦ�D�
+�v+)��C�9���9ųUE.�aB��8!Φ`BNf���
+D��"쩄zO׋
8Q�U�1���6��V5q�x�#���Ar�����A?�9�K
���f��r��BS����|��U~�ϭ��_��Cz)1{�|���
/�H��k���ؤ
12Jݐ�f�#�͑
w�R.�X�j<��K��I�7���m��1_�b�,�Yn�y�֛��P��;_)#m
endstream
endobj
328 0 obj
<</Length 65536>>stream
+
�C7����5�o����턂�D��cB~+	���	�����_��7�����;���+�D�?�������X?�y,�������j�|���?N
+P�F��N������X����+���+�Y���bo��~#�������j3<�E#*��B�t�
`%%e0]9R�M
+��e.w�*�n�T��v<�Q
�';%�&"�j���nl�5AZ�
r���_�D�
+|�
+}�
�w�҉�z��Y�l��GS5��I!j��<`y��&g��<t��{ً��ė<
�\qȗ���'MЬ{�p����
�^ݿ

+��*+5����

��d�I�-2�
�Љ�T���ӊO�U��v��[�t��|5#D�
+1>*
ʣ�$�;-�6:�z��W1�~Rb�o�"|_���+�x�
g�/g��H	{Rl���(��
Yj�jk�>2!�k��p�%f9��#�B�^��\�s~z�p���UFb�C'!������C�
�Yp�
w��@���S�j.�l�O1��+]�n*aዹ��lѷ2?�6������Jl�uL��uRb����@���:?�����&.�NM^���Aj�E-��g*�{b^�� &x�
�=���oG{�����;��d��m��۝D�'�V�	�Rn0��nF�������'��p����]P~������+¦mqD�|��@���5���*�~�XQiP\2NM<�&&
k�P�����
��iy-2��8�eYz�_Uy	�p1w��=n�
+c
'XI���̗�\�/
���DC�.���������k�ё�pW�;�� �{wA
?�~|t���w���8��=�����i*r��<�8�\�$M�
�F*��qy�Ќ�ܴk��+a���Zu�����|�@��^�\
�b>�y}x�}�:(�P��TD�Zh�|�4����B��Tb?�vp�����4�SY!�&*%�JNp0(��������_ �'O at a��@_�;�
������u�ݷA^�
A�8�&eC��:��tC��x5V�����bx������&
�.3+�ZA�ߕ�/�,ϯ�|/OP��O ����7@<�{��o��^���� ~~���z���&Ҩ�$�A�,4�d
(��v�x5ɵ[|���x
|�B��"]^�ܟ9�>;>ݿqt�k�7o�^ �����zx��\s�G�$&|k��K/!Dot"��u|'*Po{h�k���؄�k%�A�
wP��� 7LJ���\
������-ЍkW���ܟ����o
+Q�ߙF��X����
+�g��?GS���AR�����y����
s5��
���������/A���~���=���' �[�@׮�z\/����@SO��="�
Hګͪڊ�i!nk���hD~�žW!3��"�>	���������9(��k�3�|w�_�����c����\

��QA��9��ں�7��&�
~����Z'-����,��C�k���x��C,ԧ:X�}\l�o�_ݯ|���D��

�n c� ��$wWPiD�5bJ�_���0�Ti�ڤ >X���(}(@ޤ@��3�Ab����~������@߾z����KP�g�kĴ�{����
+r�Z'�ۢf��>V7Q[
�*V���ԕ�� �Aʊ��N��������r�
�8�\?���{
��@�<�~�|%���7JrȃN\��	n���AZ�|7)@YKtW�1���8��ep�&�I
�����g��(�����{�� �>] ��������_��	z~�
(��{",�V3<��|=.T�ψ�
p��Ey��O
���4��*x��*
�/BV��w�[ǧ g��<
��߁�=zzz��	��� w8���?���q��B�[�tY�A�o
a�V;�>�
��W0�W?ZW�]�'8%�������Jps}z�
��?Aw~�
���9��_�@�<�x�\���r���x��q4���
#FmCW;��Ԁ!�u���
�����
���	�q� }z�
�׵렧7o�������; _�E����
�}w���fQ�JNe'+���dє�w&(	���o�
�/5��G���k�_�A�n�,;�
X~��
 �π~
zx�/����:�^>z
+ry�
+��;1%�a���9���KZD&em�Z/-f��1�M	n�?E%G\
�����#��3�9���
�-�Ż����������3'Pax��H�o�������؟�š�6�hVHߙ��
��j7�"� �F˻�N��-��ӕ��
@�x�ܜ^�n]�
���_�u��>�xr�2���zvƽjT���.D��)���07u���6^�����R�.
xڳ.
+�}5��
+�Zz�w
��Oσ�,k����C,�v�w'����*�f ��j��3uU�ӕx� ?e��
8T�p��=�Q��H��&߅�Gz^
W|�w���u���x�����
��Tחe��	���
�������f�&j�+cM4�P=��r���B\W
�Y]�C�ޒ�J
��B³������?����Ӄ��$Ϡ�4�v
�K�(�X�f��Kx���
+�~��<�W�S�C�oJ��Oۻ��q����P��䠄k��>�^���
�o�n�`w�ށW��ӮB�
+n��ůGxh��j�YU�0L� �i
�L#�9_����V���Z�f��x��)AD&:ee�
���-���5
���t��=P�א��
�#�����e������XFyc��b?
�r�QV��
��/
7T�„��g�� -qȏN��}5����K�v���y���
���.��I+���)3*�F9#�x^�;[k�8_�n?]�j�UqњAJ���,��K{�B"�.�@
��9�q��wKS��y�����(���|51(�z�7�+���?Y���Z�n�
u(�eNUR
r^��xY�l+�}���9YK�w�'�a����?��ndG����L��
��ǛW��o]��$�9$�'�͊O�� ����zx$/u#�۔ ��jwi��JE��_�ü#��l��Vm)jXS��Z
+�>7珨/^W"�<@yaѠ���k1~��=�<%y]���YC�;��˃胩ṟ��3��D�ʖ�=���L607'�I�}���V�ט���s��hC�
u�vG�釲Z�IQ�1�E�)f���ڕ�Ś&�
�/��U"��t9jSQ�Z��!�
7����ȹ.~��DW��X�n��|u�	�1� �`ƝM�Qg �,�ʲ#
|(��-�
5yϸA�P�#��e�SU�^N���"w���X��
Ռ
}}4qCs�xECh7��Z[
+�׊���UV�o�4�͊�������
��'�|�霈c���n�Ӗ��Q[#�½�*��PU���6M��\0�ђ%ih���������
1�Ϊ��LisCJ����_])l,ݚ�a�q�
ۗ�26�Q_�br��k
�Y>mc
�)%%iFxi��\���ʨѶ�
q{kN�����?P���~Q�rB��u#��C9)ͤa�X+���uͦ��Σ��������@<�c��2Z�NB���">�;�CMe�����
8�YOuSB���o��"����SSy��d
7xC�*2��)OV�m���'kM����a�bU��݄i���W����hqZ@���Q�f~��`
tE�S37T[��qR'[؁���]ݝ����x͐ kCV��Ή��ZU�k���L����"u#��1~�~���)cU��Y�!�o�b�%�v�d;
�"�s�
���ٳ�c���6���"N�_]�.nf駛��TB��0&FU�pw�}��~�j]�-��GJF�Y+�oO�#W����ʌ���8Yk]�T7L1ЀP�w���13iu��<D]
��Z�"�~J�[�A;��ګ�
�w�O�͚�J���~x��	J����kCq�ݓ)>�6SN?�PR
RB��>ʤ �:�ȱ�p1'�յ�*
ªp7�.=[h�\,4t��T���<��4=ks�#&�lI�ـW�~_�
��m�F�v9��Yj��
��`��r�,+��4�
M�	�
+E��vd�~��c���$�
�05vw�
�9H�ݓ����n��7QG�����&� q��(;���!VY�}�m�b��Ϫ�`���ң�2�A�/��
�T��5U<�J@�jjk����#e}Ł�W�%&Go�I�z=�`��d��×��ik�U`�t��x�n�<����iR�!f96fo�jQ��VT�gd�BH�-Զ����4��;3m�۪��mE=ge�
�:*뤵�}r���_,�x����]#s�_i_Ѥ���<�u���|�z��zDZ:��"kU��z),�E��aq�D�|��{tQV�XS0sW���T9�d޾nu���ru�>]�l?_k�?[��2�XE���-�k��2#$�M027z�^G�2�m��}s ��~�9�
+�"D����������
3߭��1�&��-U���0�'S�P�
�;�5O1r��|̉���\�繤�������δ�
������\������Q[�P
|�(#���(�竪m�2�n�4P"L�7]��H����U�kZ��5�
r
+Ҿ��Œ��t^�x�-F�η�~^�+t����-��C�@;�s|�ɒH`��bOP�
9�2MJ�-��.��s���T�2`Ut
Z��}MK�m���"���Ŕ����C99s����lK���5�8I���0
+�jj�YNL:Ѱ��jF�9Pw�Km���
+B�a�>������iZ��%�U&����R�y���oUU�
I)I��b/��g��nR��+c,�hy���>�l���X��mU7���|�Zg���^���0:`_Bϔ���5��죩J&����EӾ���
)�8
\�yjU� g�-�3"�l7��H��
k*�O4�����2��]�;��ۗ"�ϗD���*�]c���#9�Ȭ`�
k�>��M*
+�1~�QV�����x�������с 
S/��B�42��"�c��8ܢ�]��L��7J�
u�����#mm���	3NӲL*.�x��r����w��׾���
s�@��X��/P
M
+rʉ�9_)瘕lı}�-Q�7���qh6-g��m��y(� O�k�l�5
�jf�uMT���������Vy��5��x����
/��g��M�KՍ���՗�@m�O��-CY�������`އ�Yz{����MP3N��������սU-F-:՜�>�G
����ʘ`�
�}�V�}Ѿfs�*�&������j��)6t�9�I[��p�+��MMH5Oc3.������\Ƹ(�QA�|�Ս���̣ib���2��=R�竂���z�~������\?�/��*��)'*z�EAH�C���S�
H����<�)�oGj.�d���x���P# �)�G�� �d���X��A����NE�Y�C�us�v��������,�>�f	.�`��W즪�rXl,��g�FI��Rb���{���:������E:�]y������Y�'0v�
+��fYT�l�
�+��n�D�Z�n=[�k6O
q�IF�A?�UL��>SN2�E8U+9����ׇ��9/*?V�GS\(P����cV2�6���?]ǮB�>mA$z��B�7��i&%6ڬ����P�p8M�ؖ2�V�Ha�)!�|�aȾN����:��������������r�l;��Z*�l������"�IQVdR1
����lߟv������v���@x�Z��s�ϿX$��/R�.���������0dR����<�Y[-:RW��<P��ߗ
��
)���	�{v���t���s�e�|_�m��ڭƧ�
A���\
���.ɾ��<��|�Ql�g�R3/�ʙ�ք�)d�A�O?�5� ?5e�a��'�_
����E*�b�N���W��l��=�|��٬��{�ٿ����O<����f�'���aV�����n� %���D���q�"��f�Ig
����&���
*!æ��/�ߗ��Ĭ��t�a��
uE�Y�6#��R�����n���%\�^�
�
��V�	�;��=	*�p���ģ
k�E�󕵶�f��zM��fE����JE�Y�'o
B�*z�}Oԃ	r����{�qN�yԳ����ډ����,�تa���-X��|ԡ�Y�������A������-Q��l	
�e�:|�c:�闺��'��'AG���[3���g?�逺��	�C9��>�mc��Ke%㧶��}��)6�$���2��k����E����,�9Yd��rb�ANJ�hH��rα���?��:�������I�RF�i�y0@
6K������A��Vw�K�d�3sw)yVIY񁄖�5���$G
M�
m2^�M����<;�.��~ ��|�
Ȋ�
�$%yWB�4Ș@-WU�.x��`�5�U�s5��g��Z|ҩ�$�P�
�cB��Ё��,�b'1ؤ�`����k9(+��V��]rb�� .�
�T7�_.ն�.�4Xgif&��h�

a���M	���4����(�|�qжP�px'�}O)&�0����r���H�
Ƈ%̂˅���@�;��
 [...]
+��2Ot�D���'���g �N��k
�m�C2�0�)C�,�?6��?W�e�ZZI75��b*��F��皝�Y�])��2�N��bS/���mVv
���@�,7OY�5ն
�DS�8ײJ�Ɛ�GJy��ފ��9S-:���Hi61)a��bj�"�gl
�C:(�wʓ�
X �5�X�{C耭�B׍!��J��E^�Y	w���Aa��n�4�o]��加
�-�
+`dk�-�ݳ�m�������QZ�ZS���<�Ś�
UO��R
���Mz��
^�z����$eM�65}�fB�&Q��}Y
����9͢`����4
�EIL>��Ɲk1q62r{��
�9V�(�٦�CU�[�ɗ3��S%
jQ�2�jJ��1v�>�
v�
%$i�K7z`~�JV�A�
;,�r��3%�R�,9�e��5�rQ��	d��'���@����#��-��&)#�l¾�6��|�O��EGrr�U�,1��&	)��8�4���M��\��t���t���(�����>����p�x
��c����$��7��J/�,s����5
�
���"d
)���Ū�����]�j��Z�=[d��4�H�<`
�m� ��L�IJ���h�G�8�4#��7��V�����dz|�������Y�%f��h�\�T��4l�IIL1L��>� ���?־���'�f
H��z���ோ5��](߭�B�&�$��n�����-�l��>g��Lf&S�{OLL3��c�w�w��{( E�	b�&EĚd����ܜ�.��ޫ�����Z��
Wvf浞�1�>
�ܣB��e�6Iɧ�Lŷ5 [...]
��
rW:A�U
����W��
�01Q�-��de_�3�.j@+��C�Y��y�����A׿ce�ؗ��6	�v{�.�:	_
�~��N��'��Z��|V4d>ڗb*��s�Os��?Z����o,5D���[��`�Ri�gծ� B���ϖX���
-SȨ�	x(`+Iۣ���Ƣ@|�_'p��}�ߞD�m�?�(z�������
+<V�j4��
"�ؽ[J,��’|+تc3}�.���z�>�H9Բ�����JHE�qd�c�`��
�
�����u-�O<
��,��f���l�l{n�,hl̼♬���W��NT�蹀�m�w˨u�U��ɚ赡�@�`�S���W�i����u�Ke�o9Y����
�uQ<ڵ ��S�R]@
u�?8�aa.1�����5�����	h��"�0�'g�ڞ�b���>������ �¾�=�
Z�
-C۳��Y\�G%���۶D�ҥ6H��

��&m
��:fj�x��>V��.Fg
�)�C=�ԧAdyU��c�Ǹ�f"ܣD����-n�Cf��
�KA��iٴSs}۞
��Q ��摩�E|�O��
�^
}�ڽt��8�[�����t�
*~{
�5�v-�J
����^b�G�/�([[<
+6»H.9T3�
+B�k��>X�|��|ec���Ud��Yk�����Yh
���\�f7�>��y��2������-�b�2f��O;S���1H��d���%.kO�g1(�h��:3q���b�S�
s��J{�}Ck�S��Y�:@I��Jo�� �?�M���C��_�:����s������ޏ���4`WG����?��@�=R|�G�r�� ����4�h����4[+
P�~�3S~7w=u�B���|� �[f�q���c�p�
.�1�Oݝ$$o� B���m��u=�`}3⃈Z�o���;ˁJ��wD�؟���
�YH��4��c
+v�LA��3�aӟ���)�>�r8{"P艶"�P[�2��T�
{�<P��!���Lc�և��/q�
uS�!0W��Ԅߚ*�~���u�J�`��0����
[B|�������wY�ͼ "G�C��i���1lw�V�=�MpLJ]:�=���J�_ud艖�<\��N�\֗ �.Q GB屆Xu���
:�9	��ޚss�/�ޑ
��� �èh�$2�)�$��Щ����aا�Ƃ s/8�.�C��ܭf��
�OŨ;Y��]
+&l_I�=����
��N��Rk�SQOߛ�yp�����ݢ���x�e���RC�uCW��3�e���@��w.�~�ȑi�9�W�t�SM��>y+˶��S\��2
y�L����Pi�yX���o��<6�,{WZ|�����ǫr������ 7�9$�x�
��Y汜�6���yG+�v��Cr��ɶ)�g]k��Y!+�>�ُڶ�x���kʾe�.xj/�S���R�Է��>]�����-�|�
ȯ�
�#��u�Q~��b�p����֪ �
��d�Mݙ�%m
�}��zil)|�=
+Z�@EM��nSҟ a!w&Pq�����M�7u�%��nj�n���=�o��&au� �
�wo
_l���6�>�@F��'���.`���|�CD)8\�BN�l��,�/�9� M��7'��L��oV�k��Z at O����Cy[�SL/_�{/�d�J�x�~��E����Q\��
�Q���Z7$�o-��hd}K�KMS�k�dI����Tpo��y�!׮t�_��{�A�vg�¬Bp��"��hbysq�'����jn9�2�;����QX�u�p��c�2|��qG�*���L=�O����3�?%��*n�mS{�˝AX��4�0�ӝ��n쎒QGA��h~�N��1��u����
+�|��f
3��uԅ\��]~��vAoWs�)I��I��nv��?���}��{��+Þ ������͡�Wj~�Ů�W�HX�����C�*�ZD��o+��/Z.�\�C"�fA��N��#�t�<��."�
�iU��Uo5��JF�S�O?�׽��<-��e���]n�����4Py���N�>ճ9':�}�՟Yѿ���4Tؾ���K���s�T��=�0	���pe' K
)��
)"߽����7�����%b���
 _�P��jL񉑁w-1��2j����~SȀk�
?�C9
朥ۦpI�>�3��c�\n�D�/�g�04e���B�pn��ᚫ�9�rX	�vc�����}�b"N�d��U2�B<YA��LWY���*jm�����9�"\"
�P�A�D�T���S��'��3GȚb�=Z����{S���Ί��}���3Ш��{r^�s/�홦��6�3t�*�{+߬uU}�x�H�-��aS,Br�7CS�ߦ�n��
+6�>Z�-�g�ʻ
��3����+ĥh�@w11^)
l�#6�낥�����_���~�']��3���/�Yo�)J"N��*]{֭H������C���>Z��=�+<4�U�Z��	<Ѱ(g&~�G0��Tv��,��o��^���o���c
���"y�,�ON,ٟG��
A���J_�K���æh%A�����H�4��>̓{fq)�)T�� "]Q_
�^��E^Q䁄�ٗP at J^�ms���ap�	q�a\rz�bgY�3%��\n9�do�`G�|o
8f��NP8KH���x��It����2꽋�����	�G�
2ӧ�g�g��<4 L3��_G����6{�D'�&����3n['K_�N���t��K��Q�<2�-�U������������ss��?6z
+^�(���L\������>�N�O
��B�{U��1�{�2:oo��m/ �� ��C�%*�k^�O��=���õ��ok,�W\
�ݛ}k�'���;��GU�u���ܚ����q�����/����\�
~��!�*r�!�|K,�4������9YfcO�
�g��Ϡb,å��#9��&D��"Bݳ��}	:`�7��{�`�Eb�R�+���X(������=jp��q��M>T�e��i�I
my�����cu��`� ��g�ˍ97���j^y�f�D/��K?<���,n�({>�	�e����!劈
���
���`U�
��9^�qw��2��@F�?����fK?h�2�XƑ�_
��gz>�)Xl���c��a�]"�S%�4�$<�u„�$������ �
>s}��%�ݒ�s.�h9W���aLҕ)R���ڨ���O
+~��fփ)|�Ӎ��O_ ���#��h�(8X՞�꫑��j�6ف��;^�zw��:p����fh�(�����@Nt��=1<f��, at JO:��^\�*{f
��7V�ހD>��<P� �:�)%Uئ+ߪ�n�������AJI�_�q����Ѝ^��9��D���g�#�j`��JB�{�v�$��l��4*�#�T�Z�_��)�|\�*y�]}����̀�W2^����l3�D�
���T���X�
+��^�˴� 暯;ѱ_�̓^9�fk� �%�N8�P�g��S�'�l�@C�b��LM�%���m�o7�Kܳ!��긽iH��@�3������u��Ѳ��#�Q�g�}���I�������^�T��K8�t��л|`�^:��#���C���p���B�}�c˼����5V��F���HÜ� ,���
����
��-��j
��ʈ��.��
t��l�����ۖ�G��� s{�]���]f"� ��+�	���)�<��J�u�O����ڵ�
+�9n_CE�k���ÿ̍À���c5!>%w��<x�4�~s�H,ܛA���C71�^t�?��q�3CH����>����}`�D|�
'�M�I�>1BD����e.�%%�:�
+���%\Yn��SL��+��
�8@~��
�� y��e>y��ɱπ�v�A/���H�46N�)�5�/z�=K�ڑpaKm�c��_:+B�o������쟋�Ի�@���>^�Ix���6ͳ@�<��sܳ�a�y��BJ��K��ݬ����8XDen�^�����3�~��b���S���z�Dx����H�����=1&�%��n�`�Z*�P��MAS���UG�=EK�mw~�.��0"�&�
� ������1�~��+
��&�s�Ŗ;D��lI�[0�2��in��*���fOL(��4�,"�<P���U�PL˾Z_r��&�m
�`
�0JC�Z�p�>�ns�*��W���[|�4��%}���a�4|���Z���՞��[�Z�
�I`}[�#%+��J{�C�
&eO¬����{\
+�&ԍ�����?Bޝ[ D��b��鞭K��
N�U^����:����o���g����ŧZX�u��+���;������}C�C.��D�3CC渚I��c`���J��&ng4�c�"���ݩnh�-������c�|��z mn��
E�^��yo�G۞#d���*���?��
���pU��@�Ýޜ�YD��
������$�`O‚�΢�,����D�U�r*P��Z:�@�6x��;Է��[�Ό���&.����<\XR�ϳ˩�.U=sg��'���sS{�5?��ZO�G��l
�	Z�&��5��F��IV��!e�����P�x��C
��
��-1�dOB���L��YgcS]�� 
@4�R�
�d�Cg�{��/��

�U���@�{u�H�6,��[�x}f�g�l�ِ�
J���o�G������3.�
+�*ڋ���~���?ا������欻�qP�jO�sC[�=�D��<ӧ�n	�;3��c-�q�ebOWX�c���}�n
,~��&��I��9f���Wx���
bc
�f}��=������ah��8:���zwe��2��[b��t � v	,�4\�VY_x�o��'�o��������e�
�8��:�J�
�qJ�{�xm"�*"
 �ۧ��
.0k�st�}���O�9FH��Yd�7��R~�
�<*
���##�vjf1N��w����̒��
+
�!f�.�+�Rx��p��h��H�;�.�hm�
=���8<sc[2��{&e�ݳ�A�|�Ȕ�E*�@B��
�LZ��~g�ͺ{����\��$ls����xn�Jg����W
�S�O�d�����Ⳟ���N�ꛏT���.�ԚO�K��=V����0
�^@���-C'-s.)�tc
+��wc���]a�}�z�2�2�N�
+1�Yb֚��R{ޭ��컋��+�����o="
�8X/d���F�/��
x� 92Ѱ�e
�P�
���u
-_Lm��>x_�\ޑ��p���
-�Ȯ&�G����7
Br�e��.��\m/}�]k����
����Yb�v���E�{0D���5	�ڗq�
+�@�/>�bK
��.BFX�uvioe��b�ħX����
+�/���o�D�_&�T/h �H�-
�G���c}Cӡ���(0yv1(�&��v�H��v��9S��B<�M�1P
w��6�B(�I\�UCC�]�
%O�X���xic�P�Z���L`,Ӑ`�
n��:XFdy�d�MBC
�6�x���}
�̫F�x��b�
����tl��&uw�W��E�;���N�<�t��n�G�
!�%�y!l���'�	���7�9t��<�8X�rs��c�
�#~���������_�GN��"Մ
+����
,�:W�d�K���(�Nh��#=��as����d��K
��?{�>����~!Bf��^D�����j
����i ���Q۳�\��Y-o�<��f
 ��_C�p��L���uM�����a����T~hC�ދ||���ⰿ�D�[Z
�9��\ݒ��]��G^��s�����p����]<�w��r�_M
�ߛt�_��-aN��pA��xm
0
䱁��_���l���M9U���1Q���$!OM���Qȧ�1|2[�ꖮ}u=׫4j��J�%Ɨ�D:Pa��
�T��&�68;H�\~���5W
��˼��U��6R�~g+�g�Ą��>X
q�c��5G:t�S�r\��^ gx�X�/���S=�}��2���e V��gSҪ4���ijY��!f��K�CF/
V��L- �
+��%�L
�K����#Đ�\|ɉ�Q�/��R�>˺H���=��u,�s�'qi�v���9
+�@#h�IU�EH�S�p�CS��bN4l⡆��i�
���?��N�\��o�o	`�)b��0.a{�y���IQ���R/�c
�vos���^�r��♘�r[��y:�˼�GL���å� ��GDl
�Q�B���.��������8tdj�vk��{¤�U&��,86���

m^ �8�2`}�gٙw���W����w����RK-�Ȉ�����μ�#��61�r�Sx_�X�l_����t�[��w+���E|���~������?td�:��>ko�\{��� �
�3j,b\�� 4t�hKr�C��Z�Kշ�}\��ڞ�I�����0�S��G���''@>t�ɥ1��.�Tx4l�]΂��SK
r&T�]�&�@�:l�;��b�*v{���F/���x]�e�U-j�Ǒ
+�n�
U��̓"
��״���VG+B�
Ea�
ş]��6��k����N�K�
~jl95�1���l�4�����'!��/���_͜�M!6�0��w(8�/�΅����N%|3c+�U���P�s�R����y��ն�Ss��^�b�����+

�8�������o�=��@�wU=[�D}�7�mv�B�8y7��׻�~�>����}W��s����B�s��UK=*RՉ�'866
�V���,̩��p�qY>%
��#��\�v�`�,�f���"f�?h,�|N�λ���X�a�������K�����0�@��Dm����g8E���qI���X�m�:BޔrwQ�~�2Y��H%ە$Ȟ��'��tˠ�G�xȿ�����j��{2k�=	����
%�r������
X�0:�B4ᒜW���~��<
��=I�[�y�>P܏L�:GO��';湨�AzZ?>�	�'�]JZ͑� :�aʼ$`��t��V�Zf�}��Σ^�1��������ۧol���4y��x��
+2c�:��E�G�iF�m��O��Ȍ�`h�}�6\
6BH�$��:4�}
�e�xn
�x���o��� ���i�ζ[��پȄ:$-\�R��l���QS���B��x�=�}:&���9>��#uk�g�
+v,`�6&���mE�WG�v	����iڕbJ�c�d��'847
��Yh����/R*��
�
mS��RSî�V�Q6p�4
�g��&��Y�6M�\�
+�&h���l}/�9��/���k�r­@e[D��k������y\Φ��4
�U _�N
��{2\�
�a�V�����ђ�N)*�@_�5�1�C��{*.�������g&�OGG��>m}˱���S�Q^9�ԫnh��Y�"�'!��y�ۛ�%y�Hٮyb�c��Ⱦ�i*�o�%ŵC�$_Xl�8Cϼ;�J�4GL�ll/}j���,�׼2���=J>�&��
,�)GƖQ����&���1~m�.bg�,k̺�ǃ��]�s0v>]�R���-��[`�^#�LL{q��Z�^�f�$���n���Z��{��yEJ	9��U�z{��)k̹�ܐ��\]�̈́�S
�dg��[�����o�������yH�{��́�p�����i�G��:JY�����Zj��( �])
8/(�������v��u
+
ߏ��m}i����Ԭ���13o.6����!�ֺ+���=e��.'�8�љn9}�a��V��cw���<*
ȥ�湕���ՖɃA�[ã�O’7'�?��5�=rT�r<��v_�
��
g�:j���؋=U!E��[jN�u�((�PMAI���م����3 ���&��p��}%�d[r�N����*��4H�|�^y�l�y���1ز����Py�u
+��r 6B.4���C�]Z
G lS�����g
69
lAG��E^��WgHUkc�l������1�5
��
+�ɽ
�6
��d�\�9iSH*p/q��j�bc��x��T�msW�#)/��rGI��$"w
s�6�9�QQGZ at w��i�F
+ūBWڦ�y�ydh�<�6�[%T��>�s�����%�2:�0�W��
���-�ls�Txh�Z�z�>S���!�
-�jF�Ћ����F�3u��J^�fV�/c��Ӹ�,xs���ZW�=9'ႌ�{��]q;���J�oۦQ���p}(��[�lk����DI�k����,���}�-����i��o¶�ڴ��O
�f���2����ƈ@�F�8%��,2n��~�Q�d��w������߈i�~�6���Qɫ}yw�C��M��F���O�ï	I�w�*C5���k�/���y.a
�+#�
���ʺ�
a�;�lE�O��h�x���$U��@A�x���m���q���y0���P���it� ���$5��� >v��捾5�pe��g+�����-2���EOم����%A+�U�kÀ&aR
�R��i_��mς>��U��i(��P�+*
��[����%�M
�GK��J�I���jj��bƒ�t�,�
�����"��:�IXD�_γ������al�qJ�y��'işw����#�l�(2�P0���8�� 'F2�xo�[(j�1�Ly~��8l�qI�y�-� [...]
+�z��1,���] �Y�e!֙�h���8���X���yY�
u.	>�����mt�9I	�A%��0IJٞa��Jl[
�9\�
����7��{W9���DC��u�	��>�'t��_��c�V��n�}��?]i-���Z�t�Vr

�qB�K�2^V�uS�J�h�
��x��ÏU��}���%զ����^���4�s-�K
m�'&n���E�s��
5w���
�8��JGmƁ�R�7����M��ږ��
�ʛrfU�u��oh���4���ք�
W�Y(}g"�F�؝��^
�
+�֗<^i��*x���њ�c
��#�@�f��e*�L�$�I��9H�O�+ܗ����Ѱ�]t�i��� o��>٦�Ҷf0i���BZ���l���*p�>��<5�`
+�>�1O���Z4�ϼ����?�{*#$~
��L��W� A;�/�Ⓑ���j��pm�w&�q�:"�Ā���3���D����Bm��s���?�7���ŧ��|J\�}�:��]�D�I��1
�l���2�My/,3��	r֋	b�C@?%
�X0@��� #�fб'F:��@Ɲ�uGz|偁P�2бv���:��:��<�4������oF&sw
�i�su�>���P��)��@A�X�<�waB��b�:�4P�V�Q�h}��E\f�����4�[�cl͑˝*.ӽ�c:d�����#3xN�Y�����G�~�\�?BHX�� �$��[z�
����<�N;$�vt^�Q�C�T$�E�ͷ/2�N
s�!���z�2B�SF�3�@>-��>�
"b��y���(qU.=�eUR�-rغ�gy�g�զ�M�$�i�����i�{���5P1'�d�[�����T]���"�&��z�}�U�3AH4�W?�!f��S�somԏ3���{Bj��8.}����u�.�#¦���I
��A1<eg��
�G�
�8&iD��K�6p9^ ��P^
��R��ViQ؀�j�H��ށ�<\�U�u�?���7vT?S��/���cȘ�	B*
��b{M�-��^�+����C%�'i�W�����偻Bx��"27,��,9���[-b��A����
+[l
�|#oθ�5V����v#��\n*N�fh
84���X| ���1������f��NT֍q\��4�vk ��N�{S:l�����+��8�P��;�"q��8PӘw�-�'�/*����c����_�������8�%�_�h��c��㠷^��.-:�؀���&���햲�G������'����}�;��k3o�w�e�RigY88!�A���|j�܇�0�׼X�~	��[~v/��n9�&�N��o�D�I_W�10�:&�@�$��Q��YB�nLBގ�s��R^\����iq����(8�X�ڝ�նd=
�����
�ԃI}J�z����}�PC�
��#
����
�!�
�m[���\��<�ܣ��|K
��
+����EG���5Z�BՒuG�Y2J�}<����8�֢�s
�V�*�|2tk��X� a�\��Q
+�<��#��$��=)����U��H��h%
��S��4Qs��&=\m�q.��5��60�=Ok�VH(��.�
uٷDD�?Gì��K�H�N��o�V��-���k�����<�fo�Wc���m�c��87��������
���v�q��ʗ��E�]
��Ց�O��€՞ҧƞ��ۃ��3�����Jgz
t�K�@�
\�73`���C���%eV�/0*�d�#)�я�^o�E�F8E���3���U��GJA�c'��BP|{���Z��Jz��g�C��cp�I�=$�룸
!�,��zI�V�zlj��KH%�#��
!,�@A,>R�KU�=�P�~�3��?ִ���=Y�T�/��'P����6H�^hA��@]������3k���Ob"���~�W/,��)B�e@
+�^iP��F�����s�R
�+�� ��81�MW�Umw�卑���t�o��E���G�}����0x�����g����.���	��ʗ����	����L����,±�^���wFjbŬ�@	?�`	�ga)v1�k�
p���"r�k
��`��Rݾ��r�/n
��O�
�%@�x�S������_�
=*�P�"m�� �
�O�rJ塆���V

+�J���z��/��no��DZ+�~!��G��� v�'�F;$�h�|M��-
+h��,&ٶ@.<R76x�,��d]��"��1
�Rק��~�M�\،J�����}ȴ���_�!?�I�ʩ�����Y
u��*��"7��<�8(�ɥ��~�akS���H�WC�ٕ`rL�5���H/��ga�n�#�]&�x�y���2q��*����?[%�O�e��
+�B�Um%��#�X�:~wb���*
��+zw�`��F�@,�z=G�~�9��_|����$"�W!���"��_��7v���u���5��u�F��M�S
�u�K���ڦ� �0�[Z��H�.9Y�pNM��L±����W?T�(>�?O�s�Q
t��g��ڗ�,Ы����]U1���:
O���˻�7Y���N��wf��{2ĭ����$�]T�X�~U�J���]��1�J�Xx'�'.9�Ƨ�g
,q�n1*�)}�f?1�<2�:S�	�*�:K.:Pr�J�2M��4�rk�EA�3m$p}�=�(V6�?X`�ܚ�e?[�.�P�����j_M�R/<�
�t����1K�1�V>_�=ѵ@�oBB�f���j:��f@΂5�&�� (~j�c��R�'T�
�z����X�jQ�C
�f�:�r��"L�VoE�j[��zҟ���	���@~��#��M�K�0K"o���e{J��3��<#䂐����)���@��a_�È�ṉ���{�� [...]
`4ַunә�EwK`��������gO����v�wsgg�3l����\ƞ�Y
AG˛@k#��R��֒�?.23o-7���A&߫lWD����F5����D=�����S�������kR���(���v���'�V�ؿw����r�X�/�Nũ���h������z\�k����"��-�CVF 	�y<�	�"%+�F?(�Ƕ�W��c.�E�|���� 2�
���w��+���Fa)״���"\��*Z�k-�v�+yч���[���I|򕝱����
+~Σ���������Ex���+81�N>�k_$�%�r�"�U�S���6!&�2��^���^���6�7Nnȿ����lp���sY�ͺ�m�z"�Fޙ�_Zn�z�3��s���	X��>��8dk���}����@�+��"̣D�z4�Ou�9�9d�W�A�\RXΞ�v���:%�\3�i֬s.6�v�(9�
�+)'��Yr�y��n�����L�c�Xj�}m2�V�*�N�c����x��R�h�
�3ʅ�G�%Ä���nb�m�We
C�8g���y|�`)�@
+hm/4ҭ�Uhi�C=h��e|�o�Pn�z-o,{�5��9[oqH��cu�CȘ�At��[�t�xY#(x�Z �4�2oWŽ:��
ͳ�)%��ċ
��;R~\��/���
w�,��.R���﯎QS>|3sx� ���ܫ��
+�*�I�ܔ�s�|dN�%Lz�}����U!���S؈?�y�߷=��ܞ�Ч$�[�����?q*#��H��6�-'zlw����P�=��6��X���Q��������g��p�GA*�
+1)�	����냕/7��TRΧ_��/~Z�*�����Du��������I?"�7VΛ�g�����=	2yw�ɫdz�e�t�C��豑A�$��5	�+�׍�	���ؑq�J#
�q�NW�$���e�
?1`�	,�&��v�	Y��u�r^�C'�k���y+��^Z�g]�&�\l�N8�J�~�X`�
j(}�%�����o~� ���H��1t��#�yw�vhȯ�M���J�h�
ٙ�ǬM�
�R.n_á��� ,R�λ�1��v�yD�<�jg
�k,���λ"�%�:�͸�ډ�e\2�jy����w�:
������c�$K"D�P�`�

t0�,w
�i��>٣A�-鷎��1鰅>	"�>Zf�*p� �0 �w�T����~���E8ň�=1&�+g�y�X�])�:M/��s+4�E&Pa?���~�#�\Qp���ZJ��쳦
�
�?��T�N�T�n
v^�I{��
+������~mw��*�Tm{��͑�wV*im
�ɣ"�y5,��
��4
������S?�u���U1aۓ�ԥ��{��<P!>�d����5I[�}��&�?&g����G?,��r'(��
M�-�h;
\��:ͷ̮?Y�7
h�T�
>O&(|��R�L�~�Q�yg��#G:խ�T���r�,�|[HH��Њ�D��9佲S�]jX�EL������.튡�8�#���\�1E��|��
���XEB11i	2�@�)?ё�GZ:�)g�-�����+���6�
�PN:u[�d���`����Q�n �L
�������=)*g�y^Ǝ��i)y��zo�+��D
���=� ȼaaJOM��]d��D�P�V	�Э$T~�
:�<���u~������Ӎ��c#���`G~�:R�T;~o�bWNP*o��S���}IU�s�,hc�W4��-�
.I��e��뺶�g�!t�LPvw�&��^p��b�C]+豱

h���E��Bz�=� [...]
P*/?��D�+k��0@ϿT�Ӯ�[��
�w��Q��A?� b.-�
�_���]r"'��;J��8i�T��?� Ͽ�|�YLܯs���I�.�����yD�j�Y�oz
+�l��๻#%�L}E���e�q9Q��I.�2�L�S.�����Gs�܋@:��P�35���ƒ@1;�=���؀�[J?�.�$]Z�zf���Y�+�-’��%R�o�Oۗ�J��[�Q 3�������`�����a��*�l]
�{`NQG�[F(ٝ Gl���v��"\��\�"
nD�N�2n�
`�MȈ)&譺����Pa�c�
���
���tf�5�4L��45ǹH�u�0�>-�e��p�g�
��L��T��vw�P�;K(�̐r6G�ћ���}��xIP�qp�9f��t;e{���<HMZ���d���_\�GX����:�	ؤK�Ƹ�
�=�h��A:c}���KN��Y�C@�
j�p����jy�=s ���܂��?���}O�bt���E4N��u�5�{RR��,6ѥ�f;�䵉�P���U��1!߿G�h��tk�Я;��
��)�;��L���\�#aB��əV��t�iƥa��<�S���狞�<ֱ�
-��)��[��g��:�����QN���\Qz a^YnȻ�6 y�1���
����j̽��}핫��ح1|������%���@�����H��Ј�	x��J}ӡ��~��p/�Pv)1ϳ�&x5�W���Y��m�b�
�xs��^�B.(�5Aʺ܇-�H�O���u_�ȿ��a�CK���z��?Ky��nt������]�����*d���9�G��c�S�/)yE���ꐵn\����
�3-3�kS�1\�lw
���]�����w?��K�J�F���
>1��n�ۥ���bB�m!:�-��A������?J������1����1Ͽ3���^�lk�쩶5�q����#���
ӵ��S��	R�}mK�'��;PPQ�Yr��>{g����qa��$�6K)��3��f��@�+��[}�0��1p�'�F;�ÿ6��i�6l���:�6��g��Q�.��g
-�$yd��|�A�#<
+Vۇ˳�c� �9��Ag+d؉� ���$Y�� ��ݚ���KiP�2EH��(&�>��	�
�o��lӍ��1N�m�Wk5�&X��c�̝	l
�e���ồ�D�"��1��讉�>��
=�s�v&��N9�u:ųL���F�))uZ>o}�`h�u��=X�Jݔp�2Yba��fI� ���Ĥ��qd�OGC}Y�~��:���@c
"�D�T��u��uh� �+v.��}2�&���t
����>Ҳ�Z:vw�Xx�e��\�#���
+�v�Lyd�|�4>�����T��_�H��1�V���J���ac�r{
�jm�F�]��<[����
L=�X��hÿo��<`w���}�a����/�}Uot<��	��Y픳�
���7������-�-@�"D�CF-ߚ �[���^��nxܹvH2fՃ�~F�r��6��Rc��yn�'U3�����bQ�7&a� �����;w�
(�?bl�}
+��Q�
 ;����u��(yS�km,l_�B���к�/W{�ލ��L���ݤ�a
:�sn��䑡�7A)�����
5%����w��ƾ�	�k}^��T�-TF�y^q��1r�MV��ߦq���#BE�2�K����?�N
U}uQȄ��ꭎ~���m>�r9�i��ڏ���RF���Qt�q���{}~��}�L����ij/��e���x�
��_���_�lj����eQO��"��f1�њ��9h�k���45�^k���������ya��R���(��f&��
+�Χ@�8�5I�ܘ;�؛�#��H�/�Q1�gi���/�q�\�e�(='`g�.}O�%i���[c�`�Rv&�e{"�1��4uUGMbbo��
�s��8X���_��%����нZ�`(��ðKip	?�����C�ʛ*�v��!rN���������U���	�g��������ZR�M�.X�~ԵC^�L�b���b��E85p�������	N)��HǤ�Ꙝ�F������*���a
���g���6�=.9�䫉[�o3��HN*�����
+\�	�
���=V��DG�hGh������m�S�;AH2��?6t��4v���FE��RS�:pͽ�p���6
VXd\�6g]S
+үYg	n9�֣�<��F�8:F3��t*�yi<з

x�#

�#R� �ؑ 3����mS���1b�J"D�-���S�n{���_�d]���Z9 ���"
�y�V:�om�V�d�b�"��<�h�����8��"§�
!BV�k^o����g��*�@�P�=G-�Kx$�\����m�J=�˓�S�d
�����
�-u�
�TH�}0MD��
`M����V�'mc�3	��������(��>+�ù	D���G�q����]1�.n�Jzq���
Vq�����D�[�py�ꈿ�qu�s�\�1�͖��T5T\����yH��Pѣ���+ðȟz Q�Ɛ��?G�ݗf����I�$�d&}ҋ�1&&�$��{GŎH/�;RTPQAz�*
+v������~w�����v��p��u�G��:���%55��17W�?\���?Z�n�r?^4�"���=���ᔍ]>"e$�$F��*������9�`,
�?
�]r�RδV>��',��t7�C2����D
��b����
rͲ��C?*�7N����G�&�%Ou��Ⱥ�[?(ٯ���mR�ݼ�˽
�~��><�#�_��+�$=����}��i~ϷY~��$���C���iÒ�p
!�Ԍ��)������ӊ��
s}쒢,|y���|QxWݓ���w~rr�n
7Wb�"N�S����V���精x��Q.{o���6l���Y����-��7O Y��و���N�����W���,�������Յ�n\}"푚��da�:? �Y�!S����O^t�?G�+W�،5;�q�¬	�5X�q�6�G4���1���T RONu�F.�oG���ONj��!*��(
udPw��9�t|��3o�S��m�Za�S��0�-��
3&��G��r"3w���
g
v
+��c

]Ԃ�=�����OډIg'�s��<\꒍��
@��q���<ͥ߂4�	Z��(�iɌ�i/����m{��G{^��8�M;��C�;�;蛺]/
�x�i���(���b`G �4���M�P�
6|����׎��
K!�r�*m;����!eM�� �t��1�7:���
�W ����|f�\<5 at L
��EKNfô�]
23*vG8�^��0	��@g��q�ʮ[w����
��=g��-���{���\�"�5V��j�T.jiE�J�� >�׋y���ݱp�V��,��⾁�v��(�;"����#eM*�yý-9�ޖ�I9󓏆;�`1̸�Y-*u��\�b�׮:8��������+��7�cD�dOe�xgŭE�+-)�����]~s�D��w†�
6~i�
[
讽��?��mz3+oN
��SV픪-�~n��j�V
N�yGg�w���YU��)��CZȻy#��?�)0�a�jRك5
�|Z\vm������v��μ0�Z
� G.�q��f!��{M\�p਒���Ԑ�u�` [...]
3
�a����h0@Sׇ��q

�h���4Ƣ|�n~��
+�
��sS�WlĂE1wAK+^���zP�g��e�>���ݘ�*}87P
���t�_l8i�:n�+�lg���ab7�tȾS��iX��@m꒵>��XpH;����� *� ȤoSPA
+�p��4���pbr�F�Հ~&�*�o�u�vtִ��eP{�d!���x��B
ep�
e�z��i�~��nX�0�BFx�N��
Q���
����
�p�GD�[~
����5�6k�V,[��zDҖ���i!�� �G�Ш5+�`d��ȉ)�Zr�6"'
WӋW�B椖R��@�۩!���d� Z�V9��%���Gk���Pw��f|���xt�g�I��
zT�)�1���=tȆ��AWg^Z6�JV͸�M7�r�F(�s�����հ��w�m�G�zK6r�ףl�Y~��Hk똦?��y�8����
+�~t�
��iV�mmJٴ�
׬��u$ � 5LD�S+�k�۽	pܬ�򩝕���pJ�M���'��
�Fռ���3
P� ��X��=�rNM��`��2�y=�hL�����
�#�kO
��V͌�c�6�[!;1��&̝�BR�W��
�Y
��߆�[T�6���u�iDE��J.s�S�"�-H�A���5��T_��U�|�. ,��8k�–U
�lg6����7�d�U�ٱ�ˆ��%2ce��8�!d1WpYQ�7M̺-;�fe�m�hM�
Jü�Q���=����us����z���������an�˄/�	9㽨�y
�r�ȅxE
�V�À������
TG-��
j���)��I�a��
$p���E@�u�`����@]��(	����٥�!9
<���~�j7|�nU
�-/<{�Ә��A�����^R�
�tɀ�<%A�|��-7�l�gbp嫖��>x�ָ3!�^�0�
\�_(>�����
e��,9�U�f^����{Dٔ�Yq�!+^r�K�,ۚ+֜Ԇ��6E�QI��6A�Ȭ�����e3J٬�
����s�Nᔁ[kQ�O���Ac�h�ʁ �U�d"��;h�]?�q0�ڳln
�q�iw'x�5
�5�&��00�Nd���l��i+
�� ]
S��V<|�T��;	�h!�-t�樨w}�C���杌��Q�lo�߹5J��xH��~�Q1i�h檯�毙��o3
��鶁ϓ��(O�w4
dX�
*[@��A ��%��b�	�1���{��cҦ�Y������0vGں��e���u�̃����)-��ڊx��D��P��,��EK;{��-�j�l��ל���yiN)$�N/���/l��{W�Rղ�k h� ��m��^V�� ����H��ы��|”�V�6=�w�^���e��׍��7'�
�c%�~	��7|\򚗃��5gOjpIK��_���V=m�e����b#7�
��8��:D�V64�B#�\h�V ��2�

О����qȋ.bm���+$P~��6����ᶎ��.���y�aL٪�4����Qտ��բ��RP
Ԕ��
+ at O :a��)zA
�
�5�����r�M���9��UL�)�K&,�����$}0��/��ؐ������;���Vf�! -;��O�

+�峚��Flښ�ְ�a�Wmͅ!Mc4��7
��s�;����v at G^k���!{}D�Zq�PW|Yބ��2�#�����
��VI7��� ��G�Hj�n���K#l���R��� 
���s���+��L�
+����1g����mؠ�
>c��*�`¬V��传A_�<��e/qy�>j����������L�sk����nN�
l͊
;��	o�GC��(�������brJKC�y�ەox��11d�Vo
ѱ+Cl\�E�Z
b 6���1ec̸�.b�ho�j����M�ڿ-�Y��ּ4ز���H��fӔ�X���0��hi�o��k��{��Y!�C�]
�����%K㻃�����s���)Щ
Y8�A%5cR#�s��

���:�Y{C|ֶ��[�����_�͆
S���hw+Ye
hʥ��+�w�TܧqYpgTj\r�)zzѨ��㓲S�*A%���l[M��E-���wo�Pv �?�Lx�Į�T	����rw7%��^�$dD�/ZȠE�v��#L�����nʨ�
�Rs-����3kogϘ���2d´�^7k��
:��O�u��f-�;�F)sY�+Y:�Szt�������ao������h�k��j
+iȹ�ZZ馋^���nyH5KvFCPC͝5�!�VmBAJU�޴�j�\l̺��_�0aKF����=h�-�Px���)��o�R����������D{'��%�l��;$�5�X�b���2x������_��c�B:b��Wu;���)�*�
o���s�ˮ̒�Y�d%���G�C��VW<�!���Z:�#�~���_3sT���'�Č�K0g�벶�3Y�'t|�ƄX�`��L�ew�M�>ʡ5[:i`Tl���{�v�<�sƭ����O����O�z%fYW�@[W�@���鬰����2K�=����N�N@Է3��\��7L���xpgR��
uz�&���1g�,
qH�v������&U�i�@/�1
n|���l�	�{S��d�i�/�/
��3B񼓉Z��wm}��?m�&�z�A[Ø�� 
�;.
�
J-�:B�R�
h�
+:wlZ�B�i�)�nr���t0��X�3�k�|��T�|wLж3Nl�
��+�������]f�@�<CEiy
���gUr����nm���v���uSj��7�:zZ
�|�k� �r0֡�	��+>
ٯ��9��
ǀ
c����	w�Ƥ�/�:[w<�M/9g��
�6qo��ד���f	��p\I�?����Mw�|�ݣZu��Ǵb�S�7u�U8�e��:U�A�_�i���{L��AϠOm�7ˬ,e��B�Vf�I�He�� F� ��Y8X������oA��)��hV�vP$�)�+


+��SY��j˛53˧�؏
R����Y�zT+FX��,L���
F�Y M�
�A挭�Y
�����"���v3�c�
��`���h��
m����TN��t�$5��N��OԾlgA�rF�OJL�
��,Z�.�?
�H��>l���X��p�\|✵:�!�U��)�r��C-�鵀�Ϛ12J}���f� V%�غ;K=�n�����*�2-=�����$�~#Z����s�ڒ�;��S�
��׭��u�K,���/���|��������Czc�]�[�#�'	x�Y��(����W�V��\�~��UO��%'�8�Bϸ(U;�|�Q����X�d1W��ąюΠ[L��p&�����
vȻj',]�q�L���<}J�S��;��_��M$Ш����7G�������N���H�7!�|��u
����rd/���
+�w'9�� �1��l�������6R��F�N���	g��+�2��]⎭�n��H�x��C��$
�ɤ0�F�
+�R���h��b��q?Q��b�����D�I�ny)!�2%��lk�({��_2����}�9O�z��+4�eMJ�.W�s��1(�6)�i-BK�M4X�wyd���X�Ǵ�qH�w��Պt���
��}ZIkOY��F:�g,"�W�ɷ�{ �
B.sc�z|X!ۘ�BҾle8�$��F!۞IiVGV�/�
�?$�~z��X����^U��5�F���J�d �l!K������	ִ�f�0�	�:����F+�Vk;��}
+	lƬ���%澾:%����(z*lB?�$���D���j�Mڶ1ҩ�4)<�:��y�fE��g��	�Z��I%A���;˫��nj
+���W�Wu������jj�ʉ���I^�r��fMvїL֤�U�Њ�d�
�3��42�k�e�i��wrc�����Nc�D2Z��)
570��H����Gl���, �*�@�JOn:_���\�}$���;��}&o���[tۂ�T5��f�B�� ��M��
�B���i�\>�
�ov>j@讖U�N�f1�Υ�x�^|X���%�g�M�{�
�{�B�0n��g
"����2ʧ,�r�Y!��
��^U��]�%�4�
9�A�����J��.hz�TJyR�����Z�]z�Ry�_��
ു4�~�G��Z
HT��.�
�~���OqZv�%�͉.ۊ�k`�+���R�WH�=��XM�@��_��
%)*�(��ߚi�c���[)�A�}\����	�zC�b���ϱ��y0�심kT^FBW`u=��~Jz�57�{*�T�����?o�������L�I�{W�ў�J�V��e��U�a�X>�d�C�4�~����&�b��70�
"�p
����Zv����"���l^����Pح�9aI���0�u�h�6`2�W<鄁�8�k�{�
+�����잮@�g����gUM��مm���)+W��/�9�~�ڝ�����c�ߑ®?��z�iث�ڟK�yࡽ7u���i;7�i!X�� E�`Iߝ�f:b��31���O���8T�;&a�-�l����
��ܹ
���1a��e�K2�w5�s�	3i0����e+
��
.�T�٢��q�(��+�(�^!I�m|G��a��Ql��;����Sy���|���d��O�'��_x��"��!2�*	�+Jt���}�T��ҧ�wzz}H�4P��� ��_�nP�ASǣ��4�#^�x���D^��tNY�Ϗ���.^I	�|=+�u�ؕ5a�opDZ��޾a�Ϭ���rp�^��E��u��h����f\"���ϪN$���RT�<��/����{���^��E'��]�W
v'�����h�JkV>Q�E�Q�� #�?@Is�P��Q4�}��,$6�mw
+�E�*!�+5˅��?
?*:v�RL��{�aϣ`a�_/	;q�N؝;���u��R�'�=�<���|M��W�4"�؟h�]�����z���e��e����^y�-�������f�=4FN {^���'`pן1�+OfdϤ$מ�Hʻ�he�/ل�97
i�*H
��*�x*�2WG
+�gW+O'd�Hʠ������ϊ�~9�2�~x^؛jX�Kh��;�a�Q'D�Se��Uw6��Z�m��Bi'��$�r:���H	�W�<�����*�>��CZ�o��a7"��~�u�naؓ�Ȱ�Q�c_�~,���i78r��E™��$��n�Q����%� ���"�Й�:��|���q��?n��n?�
+�Id
{�v�qc��DXt
+�XT��Go�'^%�N��^�	�i���5w�����
���덅5���,��9*�q<!���Ԝ���W�=�l��C
+���,��3�3�~9�*���Ұ�ј�s�ˎ�z�?���?���;g,:�U�>fѵ�~G�NcH��T�Nm#s1�3|�
5r����G^��Dl�DJV��w�c���(
v�ie؅�i�^���@��ݑQ(���Ȩ;���tI4�-��X��{�/R@�
�b�z�s,!]�Cr��/c���x'���7�c�Ǣ�)a���
�7�Xi=�U��
A
��X�\�݈��ju�k�b���M���+��T��[1��/�<��5���wˎ�|Rv7�.��ڰg��ǟ%2��ɖ
Ϫ����Ǟ���}]^�}P�
��+g-
�OAHT��xt�
v�h&E<�
c,=�-W��>�}�b8�^D��=�
��
+�:\X�GAح��.�C�q�%��<�/��kE���R�2o�ɥϛѩ!�ȣl��
���Fʸ��"
m$�
;q�
+\-�8Φfw���
x����^Ē����1�?b�%d����9U�������f�B�F�S-�����s��,�MA0�"*�ˉ9-�Ƥ�ND%7�x><���g^��~V�����ߚa]��
��VN��	5%cDE�t�Y����PF��#�>� ���Ys�x�����{O�ò
�?e�����xG�9�#���m"^�X��y=6 at O��ӗ�4p��CM���&9;E.k���!�αB
���؞���9ժ��_���16�p<1�s<���{A��j1B�'k�M�x�ur]����RC��t��)ޭ�{�e�N��A,s�1��:����ܶ�/�X?=y�;�8
+
+�Cձ��
�"�p�"��aW�ԅ]8�Y� ,���Sq��
���1�
���ζ�At�G}1�c��T��g���7U���(���<�h���Τ�~�p�0��풰�ϡa��+�.^��z�<��-<^P$>�BR�v�v���
vj��
�ʬ��{�&G���>SH�X͇�g��Q�G���?��.7`t7Sʻ.ߏ��
?���;�X�~>���^#I�8>���1ÆN蜓U�1�elO��
[:�j�S�1����2*[��L�?���#�������i��;Y%�[p��
�i�E2��-BU�nPV�����tRĜ��3���͚yAms���Q�l�Ⱥ�]}�
+�P
��T>�3,�9ս�c2D������c/��N$u��P��Gv�Fe�AZ���i��V�нVeRG̚R׼^��*և�-AKM�3�$*�/�&
G�Ùso�q#�ʑ�����>�?v򏔰k�� 6���
+����ĭ�^��j�I����x�^+1�b�Z��*�%��؞��YbpD�C8V��������[l2�BF>�f��	��M�K
�Q�I����3����.*��7D
�[*
Z%V*�ˢ���a�Kl�D~�UV/���Q
+k��n
�
C)o`��1<�:O!�W[��A!�7D��Ɨo809�z|ڂ�9�+�E���"�^�ԨP�2E��K["�s��h
��!
#���v?�d��i��K��ݗ< �T��:b��K��I�F�e*o�F�l�]
���jht���ζx��)�ly\��?H)�<��:�R�������y?|(j�)���Lv�����=�w�m#*
d�K�-9peKvxk�Mw�zi�$�M9�gJBe8�/As?m :��d��x+�����a/c��}D�,��a����U��P�3'���KRiHϨ��
1~=�b at J{�ׯ���8��Rk���R-�iA�bE�@�I�ux� ����p�

E��-���ԅ����vC4h���X�����.�E_g9�1
5Ϯ�L�V�i����.VI:�]�)�=��~C�L����k�R���{�M�5Zȃ�
���r�@/���Q�>v��Ex:�/����!
ceD��r��
}[�����í�&`�w��im��&��^=ݒ_�hO [...]
+�h/��P��^�6��EA-6f�@kZ��ʎ
+�ZR�TvV�ڄo"Ef��P�#2����s�`���49 �,kD�
����ooy�!k^M���p؛^&r�H/�Z��Z����`��EʁAH��;]�!H����N�G#�O�zy��6ʒ[H\��I{�<��`
w׃.����
J at w����)51uZϩ
+��0C���I��y��N��Z�ōw���1򾵿5ϡ�n
�3�G5�I!s;g�%��yy�:�Q�dl���!�Ϙ5
�^Ӽ�W7n"�5�B���g�����z
e��B��Us�2�B�D5�
H��t�4��M�)����/�f�[�m�>�u�)�,I埇[��G36
�L���SR~�ލ��)�1J�
�Ԫ�����7
'sz��j0gj@�3D
冰�9�'۔jR@�K��2��݄�m�e����z��&_��S/�UO�N��X��\�r�od���:�ǭ-
�Aj�YF�7H�o�rFҐIP
+��A*tw�E�%ė
�2�G�e_����ABӶ_>�oΝ�u��d�){'{gL(�
j�y�u���-8H��vrɌM��v�d3�Vڪ�MX�2HsfrኋR���.hbf�u���Ȩ�b���w�^r���VT#?��uq�NR�]�8�a�����Tvٵ�\��9֭k)q��\
謝]���
+�|�k.l��I&��|����ķ;��
9�0��S�T��� >
1�0
��A�	�t�~��>�4tj%Ҧ�
Y���<�^��
�k���YW�������F�5&iA#�,���w#��w���u��Q
��
P�mY�������Qq�P��?^P�����	V\���!�ݝ�K��O�~r��w
؜m6��0�a�K���3kV�����ڽ � �~������7D(��*��)u!#>s�΄
�1��T��
���O �'��o&U���
��
�pN�˙�a�7�Ċ�
�U#�Â�)aX�E��i9�픚�7;�N�sb
+?
����	U�N��\���!:j���_�1@�J|ƄW<;�J��G���o����q��W�7�(��SJ֚�G�l
�]Ć}����;;Dާ����֞oA���QΔ��0X�v�����p��l�
��7�N�Ť�M��h�`[;�՜�U�ne7�Y������
7��ŕ�{�P�z�A.����y-*a�#����6�0�����7
�D_md����������M �
�R�
�{n
�h~���j�
+�]6�?|P1�g��-4u�=���Q����ݮU�i2vg�N
7�
jj��,��K��|8!��p
n�tW=ٳc
>�
&��+�6��n�(5���g�}%ၮ�[3�»�6C�;���k�%�4�o�<��}��poi_�V��lϹhϿ���<�
=���o�ѐ_�(�����O�E���yUq�"�VH
zq8��5Nl�{������!3�t�Mmܟ
��t8��}[clƊ�T=�C%���+#��
���9��`A�����a*���e��8paʾ�ʿ-�
�}���t�t �����zB��
)]���m�e/
`��U��)E�+
-��=�mc�Vt��iI�
#&�[|�A�
V�v	ү˟w��_����ݏ)[�=X�Ϻ��/�mC��iu�^N�T�����>�]Wsپ���/9�,}��Ѽ
��ä|!C���]'�b�M�Wֽ������۲�
'��^���n.�P��
)�T�!jR�{q���ϙ���Y�9
l���vzq�6q�A���a��u�������ڦ�O6dʞ�1$�{���S��Om�����qYCTغ���c�fo�P�{.b�_I�3��
����|����
8����k���och�_��K�?�pi;�ֆ�	i�ɫ��Wۮڔ�1:nk��
���5Џ{.|岦�]P\rgL�wg�\�kmxw�� ��[�#S7���m/�v����4D�;
��[6l����ooJ�� ���f�,`�
7
-�}�P���v�XЪ	�n�'����w\��M<e�}?��}q��?
aA����]Gm���,hKS�
���8��m�-i�,��{n�[��
����&��QKX��_��$��;��
+�+?;�Ҝ����s������Y�q�O�ɫfxjh�)s��\�?/8
6}
���m�9�nT�Q���Ic˂ʚ�+}��ﺐ5����i���aGM�����
�I^ǿBB��)o;��n��;nt�QB���P��!�W�D��d�`o�߱d;�®}�� ?]QV=_;�ѱ7���2C�m����7�zj�	ޞ2���23�w���=+�`����\_Ճe��e��� >}���ل��ž�
����}�x�Z;�O>7�N<=���sc��c�5��1������G�ֆ��Σ��uq3}��=��:�E|��j>��
���P_��EE��
C��
:cߍ+ڵ�R�t
�w�T@��Wu������o
�f��(�1%�
�vA�~_Q��4��^�E3.�� "��
z���%��9m]�K��&_8�Q�wL����%E��(펗�ta��zv\\|k�D(^T7e/ �y��߱"RVU���^.�!qzƕ
h�Pm��~
﫛 ��*x�oM�<�wy�	���Cf}vcJ�l���
�-
�ic!��ӰI�{�Ě�e�:P��}�9E��鞪��jrՎ�T��	O�6VE�(+#��y7B��O�~)������+3���_�Iu��,���c�|�1��V�ů������{
Y�)<~^y�blJ��jvݸ�EU���ޒ;��%7'z�n� !�
5oW��5c��^L�W��o?�������>$h��4|�
����vlͥ:؇Ձ���pĦ�u��p�n���x}�B�k��4��a�K��)�X��_�/���VE�"ʗT��S=���
1(�|��0"o�[��fG���m;"��0�x߇+[PU��:��x���$���%5.��LH
÷�5q{�t�q��$	~8��:�j�OtھO�
�_���}V�����x�n��<F�4F�. �0�>�0�.
�W|48��o��_�;�.��K���C^n�H���Ȥ����;zrъ����UU�de�f��桧���\/��'������P�.t��������:���1yQ���y��M�>p�VT@����}ܤ�Q/�;i�O}>�?�K(s�WG)��|��A��e��
+?y>�h�
O��/N
+s�/�ao'��I�u6�����Ƙ%uC⊦1vE����n�wTD���3�����kޝP�%�rQ���o/��
�Za�kx��Wx�����ќw5<a�-��hk�=��;�ʊ
���2�
>��aaޝñ�	Y�C&餉������[?�ͯ
���v,��5�SW��/�9�z|�	��#F�f >�}����$��=2c�F(��!3e
�����d����b �V��d����xG��5
�!�O��*��(/��6P�p��z�L��
�ʏB��/|��?����R���u��yy��P_�uu��F��'j��TԼ�R2Ϯ��y�G(�]OsYHYhK���=��x�o�����xD��G�Jb�P_|�L�֊>y���y�Bݙ��5�OG`���kv���ܘ�O����$�w-MIk� �e�Q5>=�fj����>�q�g{K���NQp�
�W���^y��L���^Z���^pMB�h;(|����	�����=:����p�X{ڕ9y���),|w[�"���
Ğ�E�u���S��#��u5(v�?'<ؚr��-��F[�v"������|χ,�� 
+�
+b@�C����⧓��[��)�����CG����@��t���s������-
2y�P�:X�tH�tΌ{���9��9�Zqs�_v��-�
��#���E92���??�]�xU���5ń�%��D)�
+S��W���Z`	�\��]�p�������e����Dl�J�Y�q�J�S+�w;��궍��~>/��XVվ�25�] ?��z��㔄�
=�N�v�Go���lzHQ����>gAǞ\�)�3)�G*H���

�JÿX�eۆ�7Q�7��+��_K��
#�����i�fl�0�F*h{�zh#���X��Okp�O
�. ��zY������6� x����|<�I�4-�}��.���)�3�Y���+�X׉�c"��a
$zJZ���
�:pԿ_ւ�%%�=�g���?��_��XYk�Y��.
���]�K��k>:��J�����ޒ�e��n��j�1)�`��R7����8�?3P
N���D78�߀v��k�^Q<��H�䤿;�@F�<�O��j�fh�W�ª�����b� ~
�N���E�b���5QS�-�k�vlMi#�yw�
�*�� �o�����k�7ۦ������:bҥ}�pN]�n�3�ꪺ*bE	y��j��q4�,��2x�YvAԏ@/gnۚ�f���������e��ݶ6 �
�[7��z8�ƥ9�o�H�>�����QNa��薏�}��8	��3��쥙����Q*�_�tζ
��ʹ�:P�jI��5W'~r�%�w��wv��Ƞ�����S�9����n���
ʂ�.z�o
�O�[�|	`�����$��/^r�W/�b�
~�Ƀ)�=�O����Ğ�����1�Ԕ���y�D)����&�)��S���.n�M'+��Ǹ���������qs/o[P+JԇU%�ݾ�1
���uM�K�w��\�0 >nj�\�6DOHRύ�Ĝ�P
ce�^�~L^�����_
�lY��$(ο>�O8ͯzu��츅����������D˿1��D��K�8�i���>A��A|򩮚�C\h��Qp���\��"rCט��E�n���t��M8nAQr�r��
+d��s3�S�� �ҡ��g�%��TO7�U�]��3Zd�~��=��,���~�(�}uf��|q�P��W��M���A�
s@�w4"����k����|��
���-�� =���+�amZ�9�j��~Lº�zG[�,/�7�Stg����X�nf4
�����
�L\�DG]���w6 (��o-~�o˿9,.��e�Wn��y�=�{�]��g���g$�;�*���
+_����t�#�t��[|�NM;��
��_.�c
o6o�=�4��������0�*\�9v��z�ޜ0aO� |���Y����������8
n�ڱ����H+%񊓖򇛖}�CK;��/���<ۍNz��l�X56�x�
8@�b�$�vҢYו��{��X� ���Ī��'3��'s�҈徊d ���r�Nue_�K$¾Y6�]zg�\�p8*
����0��G`ـ�^6Ծ��ּ��`�O�|��Ak�ƸmK��=;$m�I<M�W�cz�N�t��< �㞽��n���
���f
�?��<
���?��.��Vz��R�a�UΩa������(��?�ٹ秥�/B*|���
%��g�
��B_�k�(�����@kֹ����D;�μ�k-}0���6�_�dR�iJXtm���٦
�a�3�
�˔
�m$�x��F�%�t�?UqgMq�':�/�4��Jj�-1��� 2eHT�DT�����Տ*d�Oz�����y��ݔtv]�~�۳[&|�g at clꠀ���ݘ�̹��,��m�ďHk�
+^����s�� |��?=7�X�K�/�k��}������tq��0#*��&/���E��S#��w��ċ�G3���<jQ�oj܇NL��
U�g���5��nh �
�Ȼ��)n̸�B���t���<}��홱�3�5oM���7���}3�/�z�����½��k��E�� zh׆�
� ���'g3hU�0!*�f�

+S�zXoO�	��/ �fIO�V�����Ł���>l!��I�m]��R���ԾڱQV�جAB�����+�m���n��%e}�x8��+{&��9-��^="ՄT�o
��sjxܙQ�ue����ꗫ��h^M�#�4a�KC̫Q���nv�cGI�l_Y䦶��ߣ��O�
Zx���0�

y���i�%몟�u; Ⱦ�e(y��qNS�A�Ⱥ�d����8���,_Fq{�Ƅ5CUĆ�>�`
�{�ݺ�k�_1���{0%�����1����P�2��lo�O^\����ޱa� ���t4�łN=��泏�8pKm��8P9�]>'ox��F&n���z|ꢮ)n���ɘtgI
}�
��U#,nBRrs��:�[@�q����<-�=-��䵑�L桛ִhBe�x��g�M�K��,3�w#.��tv }J�y}�E�����1~�B)�Ҳ/
�mZHes}Ș5�{ ��|���ֲ
+��
+]@�|�m�|pp�#��'s��gk����
+R�P{ݓ�nȻ/�ƚ�����n�)�AZ�b$rNVvg����D��E�W&J��
���EV�˜���dg��!>��l_c�� "��9
���
;d�/�l�5�̌$�J�~�?�ᖮ&���5�j��p��(y�� �s�K��̿:і{a�t{����Xw�s���v�������k[z�E��Z�c�{s
��gz��N8oN� �����eoo
wp
��5��ʞ�
+����yY�h�/�1�Ͻ��"UM��M�ԼX7³mB����@��z��4%��lH��o�}�$�_���ZV�'/(��?���ߏf��)u�zHܰ(�BH�������jNF&�YY�t���'�
+�
}�bF�w�o�uսX7#�V�%ᓢ�+���?g$��W�u/?� ��%�%����Gs҇��-3,a]U�hR���d{ƽM"yӆ/p0+���gdД���̯Cd���$�nˋ
+�T>�V�}�4B%�tLȘ��Ɏ���"�?!2�?s$�?�0�],?(˼6ґpnY_g��E��s��
���G��/~�_���oA4xE�@���!x��@C�
+�i¦��5F��]:}C`��&���H���o�I�
j��<�J
Wܜ3� �&�f'\�RB�
4�dG��PWm�W�n׆L���b�u�x[ޭ���Y9(|Uה�餂����
v��AQ���k
+x����p[��	v?
��n��1y�6\�� �ݢ�1�/?��V>��ֽ8�2`�zb�D<rEͭ�
��oC����ּ?C}��~�2��?�+��+���=7ݍ˙��s����~�S�~v���..fB��h����b�>����+ް6�z�EW
�k.V��e#2m͎�����[�}����Km
Jʞ�#��)�f��Ow
͠�����LOe]Ī
_x��v����nh���_
ޅ�>��-�-[֔>XP��)K^���������Ty���}A�'�k��xP��[���W�ũwC}���@�v̍IGٻr|�Y
�(ꓛT�Շ.ڵ��FDY�T�׿ɩ�x��B�s��Ay��S���C4c�3�����}�ߒsy�����]�����~v>�����	_s�#����w�Y����>���]]�]��J*
N��33۲%��,s
fr�,�Y�eYf�d1�2$U����/f��{�μ���x=�;KK���������s���攥We?�=(������~�a��'Ԭ� R>qM [...]
+��%�8��'�5yT|�� 1�5C�w��S�R|�k}{�E���7U?�^6���9
�)F��+�ŭ�M�_��A��
r����Sn��n��{�n)9�9F�����C��LPK�rf�GʩMΡc~����%�+�7���_X|�p��[�� �w�1���l+��;ê�
f�^b/DM"J@�n�)i�n	6'����q��3ܓb����� %7���Jjy�Ă�t\�c
w{c r�1�z�=I��
g��"�19G�s�Yb�\���ET�6�ކ��?�Rs�-�d7���+7�	�`�
���C�%�Sx�_�<��k^��#�‚z13����*k�_}��^x�(|�	xq��%V�
 .o����|��[r��~v�S�Erݣ�{�s~��o��(*%���s]��ZE�א3Q�G����1Xs~o�\{�̣[ޡ���~1( w���]K�0aa��*t��`���׍��Z!�-�`�Ee�;'(�n9
���j6�KB��A�EEo�I��o�RSDG����=��^Vs�%�S	^���~�z�9>����;�4�am�j�_󽼣���M灞�	�9��j����;�����ߺ>@������^� [...]
+*�Š�,��\XF]�<��zg��>��������a�7޷^k�8�N���0��2~��{�e'���拆���);
+~�}�ʉ��Ď�zcRVe@®r�'��&Ua5ᜦZ��N�=���1�(_ �k{k���
z��+�ǭ���^�x��旰j�����o�&>ngw�5��j�_� �VQʢ*�'�Cw!'�����d�z�
1'���ymq�[È9��=M�]�\*,�CHŁ'�wWt�|=���k�8&ucyy�U�ý��-�9N�_%g%��
h���Q��{�U�
��/�7;'DM�id��n}CL�*�:|�{=Q}��p��-�#WڇaWV_CNۧ�Ջ��[q�a~�7>��
���F���)R�}
��5���!f�����J��1��%.������%+���
,Q�Q3�Z�����S�#�=jF}|��r+0y[#M)�Yti<y���%)�n)�e��I��'լ��adڔ�����_�Gj.�c]�ߛ�=|f�$�
<R�$$yT�ƭYz��6m�
���\Xkc�B�3ܥ�QA�c�
��[
+r��(���m�Y;��Z6ԫa�����
�I%��R=���C3����T��8�Zr��u0����_i�˿(��U^9�"bf}s�Kv�Q�եQ~�� ����pY�����[񕺻�tb�C��"��[�Q�jbѶ�T�]ܷ��c�L��A=� ��y���C% ��5�څ��ӫ������ױ���^
��2���2�O����<-�l��쯛�
?�G٥.I;f}�[�=�.�̂�
%����3#*BABG�L�)�41۫�.�������f���;���
#�̰�Q��e5'�!qJ�
^Y��m��?i��?[�\�O�SWޡ.���f���C~T����'6�%���b g�¦zr��Yv�g��`g�!f�5���I�������q#�&�$�
�ο�RP��.eVT��GJ*��yȈ���5�)읍!��'��k;���+#���T���:������
uM'�?�\qt�9C�J,tw�e@;N�nm�R�CثQ�>��}
+.D�
rbiw;hx2�?��{�
��(a�(,�Մ@mؒs`�~t�m�X7v���T�p����
?-�j<P �6/���b��>���&�=�
R����Z�j|���ړ��M��2Bi�(�ā���ǧ9gi��KbQ���E4�"�ts��󒟴���6?o8q�,�q*h͊�Ɵ��#z17����:6�7Kȷ�6_��`�|J�O�%���A�[��W��A� 
Ұ�bs
®E�ٞ��[��)ɵ��s��$��xe�2��^x�:�eB>X�����`y
�hy;�q1���o_@/j�_���`��
_�㑣���
+��h��
4
+�^%��9� ��������<�n��8�~L���	���Dls��z�=��\|�x�>���h��Q[ǃ�B[��YK���#h�����M�b��z�zr����s�C�s>=�3�
��H��Yj�[�l�Z���1z�� 5�9A/c�	�Z��ʂ 
lHr}��1l��ԋ況�s!)�F at F*(Eh�$�īd5���x��Z��2�#M��ߖ�u{~) ������6��;z��(��!�oO��W�"ϯ�m9���B�Y�躨^L�
��Y^�O�7�u�^��;b�_�4_p���ԝ��I9�X}=����d�bۻ��'�77���	�Wߓ��bR�
+����\{�]k��i����_��)^	�VHE)
�8-v	�fc�]�u]*>�>�L]�o�Q�^�;����
���JX�.)>�
b�5E��t�|����ts������«�3!-�.f�Q�*."�jÄ
B��������?�*���,���I�wQ�8�i'Y_�T�U�w) ���"S�S�;�c�+ۣ��YZ�K&���������-��
��\����&���םZ�/��1њ�g
�@_lN���H�Y�d��pC�[��O�E��u���T�}��}�V�W��W[}:F��>�3K�Hγ�0	X;2>}�W���
�T
+I�C�4�Ӛ�.���ٞ�]��P��&�K/�
��6�hEq[��4�i�쬺���{u�������oZS�֞�������{�tZP�����|zPϧ�|�� ������؜bU� �M,01K<��r������vRn�Ҩ�zy�
�6 ��e�������|G��j���ƽ�ȢP�T�k7��
y�ȫ��
l�����-[���QDn�H�$Vۺ6�.ؘ�<����ݏ�mb`������%�kb7:���7F�Oy%�����5p[]3�,��ea���Y�
���u�˓�S�o�W��'|X�2pZ}Jfmr^K7`��A�u�Ӧk���5��o]��oK҅_e�-�D�5��>���w� ��Q�"n�oL��-���^�� ;wk���5D���)���������
+)�U�c�۫#�2��

j�
ݽ�/
����s����������҉ȶ|��0�WJ�5,mg��m�j~Z�ו���~�A�n��(���.ms�R�5F-j���K|V��%8GQ�
���Zy�|
�C�
[NX�������&
i�C��Dž�-������� �t���{���+���7N��3 ���g;Fљ��ʿ
5��e~���v�|�kM�
k<皀]rM��և���?�vU� �k�aTX_7��<k8iy�rym ���f)�(�@�\�&fz5w�}j
*�!W������E���5����d�9h[?���.;� b���
W�5�t������ow��C�pg�ը���>F�
+(�%.O�
�c��5��3�������8�l���� %g�U�U�4�2fs����qf�m��4��A#�:
�n�Fg�H	�-
�c��/���
]��@��Hq�+�qA�
)�>9.�+M��Ĩ��{�v��^Ͽ��X� �� ��qojo��;�TbI$��谅C�/y����4)���o<*J���G��m��E.ǣ�W�����YĊ/v��[�?���
l���½�]�� ��Ԓ���b�&��@�f:ǡ��rq\��ؙ&e.�ϩ
����t�U��]�,
| h��^D�z8�A��Q�!r�?i����1���j
�_��G_��FoO��GyU��[k�;[/�&[�쓄������}���=����ak���9LΘ֔�F���+�ŝw�ˎ!ԕ���)!ԣlø�I9�OZ/�ӳ�
���y�]���
� z�>�*�)Dh��]l�yk
z�>�|q�U�)�d����Ւ�3qy���x�_��W�N��g4{��ҵ7�
Ko��\Z���Rw}rg�]��P.	>�9��a�_���~�7��T�Z�\
�j�5�_~�.����ad�Z\��3�w���ϴ=�_�'�y
%�U������9%n�<��4��/��x���)V���7��jE8�; [...]
�X�B��ݜBx��<��V����+�����ڐX��Z4��wM<<�+��S��9�h��E\^
���-��ٳq�Q3z�*
,��Q-hm�9C,5<��`D�
�����C��iu�y:ҧ#7EE
����<��2`�c���zhd�Y��*j���jz8N	��9�L������z�_��?��\��o��.Čmt��U�1F�ڞ��'��}㭗vF�.�^�~��w���9i'���{N��{Z��
�)�Ϳ�)M�.s��ӭוO*��r�#�$�'ۡ@�����݅�Y�5��K�
+��gv�ň�!���!�
��
��I��"m_ӏZq��;���YZID���\��g��b��{z��;|��[�I�8�ZP�l$��
]
��Q�=�zѧ �B�[J+]�:����'�,$�%cVt�E��F��6��sko�C�-pq.9�x}sk{�R�4HJ_��v�8�-휦�5|�GB)tM"o��w�� �k��bPE-	k�x>M_�/�SM_ݥ�AJ�_B�O�ɍ1
�pS��K��[���Uo~|����rR�[wa
�☒��2��Gp7�/`�� �zzBF!1n��zb�{�P��
+��:��/vt/��}M�J=�b���9�p���y_�:3?uN�o��D�]�����?N���4w���W��^
l���� 8�ZHDŽ�,
�+�t�3��,
���ٓ c.�•�Ga��RD�C͇��E0�(�xJT�\k.=a`"��*�T�⸁���W�՟�Z��b�c�!����d��B��
�w��_�|
1Ё��U�t
��RG�W�E/�C^]xV���i�7.	���&W�"
��!5�֧Bd��X�
�d{������i^5��g`��X�%V��v
����0�=�[y8�����gL�H��i� �
��.��zu��G��S­�O���_����5��n�V�Q��9��7y=�*�N:�}�U�=�*�{Z�L|�_5ݹ�uec��
`2�Ό�U�$�yum{���l
���o̯���zX�ץ~hZ@��rδ����9n	��#�C�Rj����	q�'�?�'����qLa��%��:Y��
+��5I̴�Cχe���gE��r���f{T|��^�ٹ��[Q5r22af"#J�W�ϙ{Q�����/��}�,]�^U�)!��L�\���	ֳ�!
����鬄��y�@n��
)9�''��唢�����<
+r�s��㔰�B����1�����s�����	7����
>�ڄqS� �m�m��U	�>��¦���~?B���1f��I,`�{=���l�c�I�cԩ
��< =�������ޔ|��c&>5a�}蘦���3���ν��ވ��h���񆋫�E_zd�B�{谩�׭�`��s*��^�K�I��xЈ���Q`�]
+t�KF-�i���{j�bvHdž��lX at A)�5P���t¶�
YxEz�Y�k�y�1K���o�`yY{j�
�RHO�$��Ub��8��:(�ݒt�W�i��'�7��R,/�O;'a������ ��[�v�]!h��w�t\�OC�ښB��
G\
����m��z�l�0��O�g�����K]w�����p��
+�4�n�������{�{Tގ��S�������`I��gw�Რ���A
++[K<՗7�j��9�����S��_
lv=���7v���
(х�s
�Q
� ꒲k�G(Y˃�����C�����t�=~�����kة�a��Y^��0%k�%��{HÅ��$P�j<��
c�
�
��1I��9
K��s>%�NH��G^k`�
�F�Y{_�5��	���+����)R��c�s�U�&���'�Ϸq<*F��{l��%si�������}S�;�BnTI�I�H1�Ǿjq`�^�o1]R�M�
�JlfPG.�)5�96�`���
s�y�!SOw���T��"z.�>��"n8��w �'x��^�1x��	y)�c��rPA�̈́E5��ᓥ!���)Vm��z��:�u��ag
vm�u��^�:X�}5�Yn9���F��Q�3���A�1V��+?k}�pv�v���� ��!WU V�Y��E!/�g��ay�A
�fw��Ah��;jj��LI
��rL6\�`㐢Fѯb#�J.dm�Y����u�{�~��W��Ә
�,&;bd�����
�Yb^D�����=�&��'��,�
+�j}�|&����z
�ł���_i^ �S�I!��6�ڬ w4�S�G����Yg�"�"
+/��e����=1�@�%�7Czj�/9Vս�.ս�+C��[��҈Yĉ�9��E!'��g��Xh��^	ڤ�c��3���b�ws�;��գKvA�
Y������I^�������W{6
gsv�1�d}Vuek�:��;
��W�|��Pa��L|��kh��H#�.�Ż
�VЦ,�J��K����
+��c�إ�:�\�Q�c�v�W+&�T��)s}su	�������`}�_����L
,P��n���
�5�9)�u�쓬b�$%�9��6R��:z��
��� ��R\���-�_��5���O�K����[�c&nd6��ɕ>&s}qi�
���p:&eky-��!BrrI\C��I���eg�#�s�Iԍ�
鑓
ܳ�ܠ�
��X-�x?��13��>��Vyt�^����hk�Y7
(>
6;6G,����
.��A
��%A��5Rjb&&І�kA9�WO��sQ_��q��q���Z�̭ⶕm��a�M�8����2'i�fW�ɎhEP+������v^ yf
vy�]��K���řL~ŧ�Wf�5�Z^X��
7ww�
�ƀ
+��2�x^ћ�g�Lӵ�<�uo��=h��&!c���=��
sۯ��l�5_�
i�2)���a���� ���{�6FD�n))e~��>�|cu��B�<LJ����B{����Z�1
+�\�^9X�Q6>kKM�0�#S�f�(���;0�!
�1�k�G;{vWDmn��;?�)׾%\��C��z�Ǭݽ��ZV*F��xKF��&
,�u��
M{�m����k�r�C��^��k:j�GE�
+�q�H��Xy8�%�#�rBN��F����]z+� b��8�4��
�a���!#V�7��`��9�k®�mr�a#	�U��<O���.����9U�U����������T�J�O�~m7ϧ�|�i��kp!�y1;:��p��
9��%4oOr+W�i�[�Ԣ
�ve�|se z�>��<��׉I~� �U[}�N�_�>/�ʭO���(���ǥ�^A0?n�a�)��}���[�@G�E ;��Ŝ𜈜\4�#��X�1�
�^9�Χ�4FA�

�>/�bk���H�7����>)>�+c�z�|�GƮ	�8����S����]R�u�,��g�
Ջ��K�ϒs��O�
�f!�.�ݰ�ԟ	�� �p�[� �LB��M̖�N��86
�qHTO�	���flyX���m���1�99��DG�7�)zY8y_�
q3,Gd ��X$��'�~��7��nO�� k_�Xp��
}R8�
���wk:;�bdr�`�jt��
�2���~]�sW8��_�1�r�>��I,vu����QְZ�*RYPMo�:��6!�������A/8$T�d�_��_�����P�JVˡEĈ���VI޿��dn�"�
��Q��s\||Q��a���M�=�
_�3p0ɵ�ZҧǗ�M#��M�o��N����n�}W��9yoӣ�[ϓ�!?�%TԀ�e�����;���w>Q=����[~�u���&��|�]�m]�纕Ԫ�m���e��ux�����5��ö�oM$ܵ2;*\��4>˭faֻO��N�B��\�#%W
4h���M��5��LO�y����e����7*|a�Ȇ���ٴ��/���kWW�,f ��_@]ڞ�d{BX@��
+&�)&�5�Ó�g�m�7�õ?���B��R�S2*��E�K����zcf
&�aՃ�	���.i7ɣ�|
+n�OF.�+�e ��$�]��x`�m)�x��f����W����"���^�#%��/�'	��
+F%�\�� ����OA)|�h� �aR��C���҄��3`lg9���49ϫ��|z��8[��Y�#�,�� �!��&�ʭ��A�JN�KN/u)��
%�|e��3�cf5���.����>V�5��>��P�K܀��f9���)Q�%�>�|vkr�/����ژ���3�=�xX�Š�ֆ���� q�Ā
���Q��p�G=X��	:9
��in	��p����"�^wL��윂\�n�②�wA�	�۸!=7�h�@+�U�L�}k�
����ҿ,��\tK(>��8��\�	���;z�E���Q�ʃR|Vp^h��	|��"-<�%إ|��
�꾭��X�GMꁕ���p���s[#է��:�m�hu�G�'\j���<��q0��_{W{R�S��\Q��p�	��k�@N��-m����jJ�߷���yB�crn謃uqwd�	�i�u�~t��M� �\7�����ޱ���)�$�ŗ���#l�6:��t`����L�.1/�m��
|.��F�Pb���-�Yb��$9kGN+�,�p�:�7�l�
Y�s ��oE����
 ���\l�,����� �8&	9�k�<*l�}
+r9�%�GL\�W)��gY��-��o7������U�VJ�
7�?��h{V
0&6��C}
+z�SB.�(xM
9�
�>4a`��a�M�E�4:'bd5��\t����V<��v&�O!B8�YE����U'��4���Y�@��Zǩݖ��L/��� ߃��9��U����Ib�����
��1˩ښm�/���kc"� V�[��R�����𑅮N��S�2N��5K+v�v��0������Z�{Z
+f5ȵ��NLu�
V0�6Gq���0)/���vf��[c��a5��Q�=n���=���|�+�_
i0 o"c.ԑ�ؼ��p1�������qP�죄;�F���CI`�G_C\ޑJ�:!>�ݕ�u��*i����껅߃��P�HK��ۓ���:��YvC���\{�
*E�]��4+���7�|�7��75uL���t\�QHܳ�����"�Y�:Hɉ�v|L��O�o�����
hP��
,����
�xh���^�}�k�y�0r1
�4�Ago
���g�
1SW��b�C�
�D#����`kVH�6�
+�s�r�
q{KB�D��/��]����ノ�_�����ꛪ
C��x���?[^_����(l�����&�K���q箍�s+p��/kO�?��~GB*�_�d}�?nL���-L�G������(H��א�f�)n���-��bFz㮙�����Ny�茰h	3�����
�ɣBg�f��Fkb>�<��!��J�
��+��X�`"zL�W�t�-k�|j��s䒰F���IN	��_́�d�H��Q�� �"}rV����;��쨉V��Ȅ��
4�y�
��յ�]�v�s�S���xK�]��}��B at N(rM���*~˦�
�2�ֲ5�o�80�
>�������
+�.���Fٖ�K�e���
���
����F�2?���3K���(	[���\�XƮ�;E��~�b������S�3.U�fs� `
��UT��
	�2�f�����!ĭ�!�Q\ZP�k�j�$�89w�5���@�_��r*t�K
+�r�s��n~����ಗ�U����|RV�{�����G��v��?'�o��K�s]m������GAs�)%�?�:o{W�����1j������#c<2|QT���ʰ����?�
+�?�����
rc{�V ��
���	��"n�f�A
�ү'Wy4�ꀶ����Kh��ibvbIܱ�(E�����k�5A
�:j�aw�L$l=�m�}��"�U�
+k���A���~
���k��g|::$�(`�g�S�ZLI@πv&E��m��'S��á.=h&��-v�
(�˯�~����Cw���w
έ�We,�ist������s���/B�|�s�R�>�1���ǵ1h�_E�:�>n� g:
�^
j��_�Q����h�Em{������K[͵O�!�O�\A�\��ѪBz*�.����
X��ؚ��vJp�r�_Ƭ�[PY��>.��q3��������긁�LEĐ��7p`a
�)j`!v縸���6���*:�#NmD'����ix�+���g�?�dԲ=3�99��`�MB��䊰�
�a��L �iy�Ȇy4l�,�ҐZ��+Y���X����£� �@�
j1���d����NH
�n63��-��� ���
��Bߓ����
� �
h�r�
��>Tsi�M�	�oPO�c˽/\:>:Y�k�3�&�
��7��rK����9�����uN�
+
��Թ�U�.>�������^� �M�!!�;+��
m���Ӽ3�H�>/�j�Y��!5
�k�{
_�h�X���
;@�2�FZm@ښ
�Qk�`
����ʽA���L�����7����
+j�_�O�lvN1�6G�~Y�>ɮX
���>�������(��1�kH9А��ؚ��/�E���"6�	��,�1N���5Q

��"�-w��L��
�'w�v7�O N':$�<�_�7O�}\���IX�zb�v桭���~a=�d�_�۹�;>��OEoNX;���;�&������g�� :�#$�\Z��%EA�
�%;�֫	'�)R�c{kg����,����&�7�+
3���AJ��{jf�x���E mV�W3[��]��
+�9��5�wwgk��3Z��1�M
��\\��^
��l�٘���s�z�@,
+�H�`

.��?X��ļ�h�rֆZ~�x��{��ZL�-;\��?,��VĢ]+ Z�?
K	H��A%.#�e�����稁���� ��-�hQ#
����Zv�O-���\���
�Q1� �9ۯbՆu�Ƙ���5�(A0�ͯʾ��^�swޟ"
+��,XH����
�[ƩsO
 ;�|�����`_=�[a9�*
+851ǣ�ZE���ScP˨��	�>u�5���c��L����S
7=x�V�j��Z�:���$̴�������F�׶%�*�j�5���rz�eŏq
�b��AE�4�}
+U�< �l���VvR�*A�}��+�)�bZ����Ijn
p at T	��`�Y\֞Y@�yH��Z�5Runs���v5>�A��ᅧ�z�Z>2
r�O��
ĕ���6�UX�J���YFyd���
��� ᖢ��G�Ӧ��j���<���&��"⎔Y�W���^�O��ٞ�g�?������
���/�Xn�[��Yڸ{Km�݅��A�><X��L�c���W
�Qs�x7�6�]����
����~����
+��E.<��9��\�u?nߏt���1v	��������_�:
�q�	�\Բ[>���E8���V�jY at E�޳���8�}+�5�#Uo�@Ϻg�YW��4�����S��~�
�g )�?;v��
��=}.K�E�`���+9y����
�}���FZs��$G���)t�Wì
�0�4��U�w��ٟ�m�w�%1#.?
+�龙O8\��/t��u�&��������d��򋢯?,�HW����]
��9�fAbjj�_�j�\�
�]�Ȉ9a=��㲐�q�M�g#����W<
+JQ h�=�����9{��mA^��A�∆\
R��*V��6{�}�qlnb�u�4__
��ٞ\�[*h�*��V�����
�(8C*�x�pQ)���Fթ]3������ܽ�ӷ�

+|��d�U�
[敠ny$țn)*o{��V�I>]'6�!س�q��0����l�br�@;�ud0F�UN)�G��L�����S`2�/J��>/��3
���j��6�K�kؚ`���w,Oa�\c�;֧�?k���7�}��{������a�E���S5"o�P�J�RJU@ɆU턠��ݐ��vI�w���u�����a����C�ѡ���Ӝj���i�5)�+i��CfEMIJ�YH��ܳ�����'<��t�y��aJ�}
�%A&��%�Yx����>k��A�"dF�Y��!#��}JV�WJ�pI�9>
�`w�K:X�y�X}8mW2j|ZM����Ml�k�cy^w������̯�ף��[���Z�?n���|\r
���
+h���Y@�/�H,t�4�R���i��"���;�6r����V��
���@˳V{_%�I�%�w�jjr��
{�&�w?����m�虆��Y�i�=?�Ky{���ל�Q���4o��
+
��^}��EV
Z�X{Zc@	4�4<%f�@�Lb��|��o`5[1��o��-�΂�����t���
ظ���
=��{oW�N�i�U�I������
��kA)?���
��н
!>�C��
Ȼ@��b�
�3bJ�&0&Ż@�u�[
+�vq�1�rfk��
��|�.�Q1���Yt
��,��u���%�
+�,�1��'�y�>����(�l�z�w�1h�G�C���B����)n�S�m
��Q�O�
�8&���'�.:fQ���K��������L�ܙfUF�LXC�ݙi��"S}*|^
�����T�}
+|��82#���%���e�4�.9��)��oO�7pW�O`?I���ps>_{U.a"U�[Xp��\��g��k	kq�^,uu��}��3��wbƞ
�V�ݘ f���6[oǔĢ��R��e{*y�/�vX́9��5�{�?xf�9����K,܁�E
j�>%�"jb�Bs\�|��[�NY�ǥ�� �9'�ף&R��"�gc#s��m�S���7c
"�WdžnO���f�7C
+R����&��qM��7�iv
�<9�#�=`ܶ�
�.�?���:Ɉh�nҵ	�ǰ9�WMg�&�Ň��!Css����x�;�x
0SI��#}��~�� �nN�^qJ��A����
��GlO(q*��wd����v�Fm!�5:��,
���\J\G��U�96�c�a�F>ګbԸ�q7��֟�<*;���\�<��ӓנ�m��[����F�`��7av
̦���0�B}\���Ȅ���h��^��u@=q��_h��g#V
���>����V2��*jyT�n�+����\�����ʧ�OKN�Ԥ���t���7q�[��+��I.����3
�oB:n�?y '�?*�5
bRB��Ȩ�~
�!nngFf�M|t at E�X}���
+v����9���s~�
��?�z�\e�����y"�S�o���QC�xk�U4 g�&�/��{K<*�el��_F�x�еa~����[�1��SSk�,
\�>&,�s�t�'#����01�du�:�1�r0Jn��ET�J�ߞd�,�
*ևy�9�as��n�=R}fg
+���C���9�7˂D5BT�G��Eݜ��~'���2D��|p�x���myR�CXE,N��M�V�p��qK����U?��æE�b~lQĎ-0aa-��魰�������|w�K�nX
!e�#�����7�k����>M�k(�=�h/�WK��	ya�.fd5.�DL�N�w�r�͸�K:\�{�p�WI)9�
+������X�����櫊+oJ��)1��w<����,��œӔЏ5{&fK���ze�b�T}�ssǧ�T'ۻ�z
G��q�v󩉕�6�
4�_��k�4D-\tx���Y�]Ч!�5�!U�p�@+�Wh�C�QQK7��w�
+NK�ȧ
,�<K؄
/��;RR�GA� u
[���`�"jV�C'w_+D ��#$n��EM�,�L��(�O
%��-c��T��+l�?�����ttb���B�n
".�d̺�B���RJ�rl��U������7�4����
췑����k���ոg�Ն5�W���s~�O��jEX��x�Q�=�|^ӓ����S���}q<�
ł��kݾ���g�#B��H�ɥw�_ڇ�7��
ؠ�OԷCɚ*�U��|ܮ����5���%����+w_�t=L�8
+�Y�M���=
RPʝc����_W�:�s
Ⱦ�K<X�BzfcPŅ$� Wk��[�
?Ǵ��_�
m�z1c{
�昀�M�Ƕ9F��g��
��iv��(!�3K)rO
>Z����
+�l<z ���^
Vwq�n��1M������s�%�&L��}kG{l^Hٖr��)��q�z�S�kc-�6G��;&�殻1�set���SRK�y$��e-W�#%�,���
��
��U�9!��զ6�GI)�k�U�9!�p����jד`g��wfIyQ����am�a�#f
�o�mݿ��A��C��"}Xf��i�A�mM�� _P��:����?V���`��s�����-��R�>9`P7����
�_�2So{])f`c~Yo��uC�
�c��s
+�[��K`������l��UH���u]���)��(�%�C
'c>����WGw�@h�
+S~�j��ܞ�~IM��9о�.	�zQ����%�[�kj�\�����옪;�%d
x�#v`f���M{s���9LvL����7nNn��y�~�����6��56aw�X�յ�ο���3F��7t��q3����d]aT�������/��v̈́b�{�'cT����:�!��}f{����|��%y
j���]J+Z'��
�����F�o�,���ƫ���5U��s)WDm{V!�''��W���֞�)ՇF1}���ձ�csm��������G!�j:�9T{�'�e%L���]bs|l���~\븻���e���w5�T]���?(��h�
,��@��Ԫ�U�׭��}k� X;n�7�L�\�`����Q��&�/a��9�5R��[��	t��|��Bۣ"�l�`�Bz!!a��&fcHK-�m9�9�x��J��`e��ʆ&����^
�x-1-�5a��D���@�����C�Xu�)#�<DlN at 8\l&��#�VQJ�׽|���R�4�����o7���Y9؏����+
�q��M�o�w���N��jϓ�ծ�a���2�-��
5�3�����
W�p7#������^��5���sz!�E�
��d{�L�
+�/(ם���}ۃ�]��aU�e�x�w�����؛��z_/�`�����L� ����F��_��l�lk�}���cu-j9�+����zr�	T��E���q�>`���oyU�WuoƧ���3��"�&��fI�@;������Kٟc���(_~���U2��.Zy[��$'�Lr�v�6\��M��/b���w��+;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9j������E�w�Nб�(.�H�'�rJR�u-��ű?����r��O�pI
:�-:q
�u����'.��P�g�s�`�Ul�Do�aPT������㓆���'�7����Q\����� [...]

5�9ld4�Y��1�$�������
�5f1ZV�SJ��*(%>9�2��w�"J� ��5TXDž&��JNM��
���!|�s����
+bALK*	�P��&!)dx�8h|��o�n�*�
	��=���$��fEd�R�H�Yk��R�8�:b�z���
)�}��rH�/۵P�J|^TG�������6fT�h���A5��1�I���������
�rZ�=am�D�(����5O�L���ʸ��V
�A����c�
��3���
���=P��o�55�����q]���יּs�oϽ
�{ӝN��N:
��813Ȳ���T"�23� Y,3���N
�*���;����P�kɒ�����<�g�}���ZܪfN5gm���҃�O֟�|�>Ҳ�y�������*	����Vd̒zԡd�
��{�V�8>��lO+Zb������ӕs	�^9^,�%�F��ꌙ[��H���+Y��s�k�Gk�X��=��V�J�n@����2�dc�yzk�S�s�d�G/�[��cs�si#" ���(Y[�܊�Hӷ�]I�8d���WA���‚q�*xx@��|2&�vg���u
s�/�N�^�/��>Y7��!^q[�ν�q�+񀔖s
j	����뵘[�"�$|
+�Q�bv��<�<┴�~I�nP%~5����z#
2�'f�uƩ#w��r^�.	����n���'����h��W�·�
�8�W؄�$���Z���d��*ԩdc���X@#ɇ5�BTo��n��*G��ꬋy9ef�۞f��_��!p�~6e��cn��e�����	�y�c��Р��y�Ո�Y��y��A�~��UX�>�8�>�>��*�oǓ3�J�5�҉s.Yg��<��g��[�-���+9��u�L	
��L�YK��A?��ig;�"aT%��6�cTg����1���'-�o��8���<���JI��+k�4����w��K���Sѕ�m?����{�o*��:X���wi8�G�C�Zׄ��B̭f稣&m��+n!���|@�(F�z̫�A
��ViSrVZ�9��(�_|�vt�E�'�{�*ލ��r�y�0>�9����˥�e�m<���c�ΙٗRVޕ��ӿ���|���:I�V���)����>/��2NcV�Y
��jE�G�D��!~9vƠލɀ���8P
�|�4��0�]T��U��DդK�Dz�
y���t
��yi�Ԋ1'�*ga]�{��
+:�W���O�tr"`�Ϲ��Uّ��8�[/�CZV
+s~��:�z!��G��Y|ݶ?1� {n�>5^���!�Zᑴn^E�I?�0J�!Vu��v<a�8I
݆z��
hN�!��|��|�[���v������^�=,��c~93i���'bV���S�؍�ށ�Ua9����Dp����*9Y7�,�䔦�Ҏ<u4CP΃1d��	�u�O#*�$���%������
�%l@����Y�рx4�02j
��ĝ[�M�lN��5��U�ƾ~�x�����d埐�����u�����O���K��ZLF4
+�/��}
+6̝�Щ
+A��ʺ��pOmM��'����K�<�_���K�yҩ�}&S�%h\{U����OSY
�#


i���9Ɂ1 Mq��
+
a#fg^��t
Z}����
�bڥ�O�..>��zs�{"5����	��,��Y�ͱ�l�*����q<cSv'�����;��3�2��a
+���
j�O���o�u�9��s�
A�G
|�_�����s�)��;>�jDmf�6m��~�s�7����]��(�F�LL+��Fy�v^qN$^���s�
�c�_�_~�Y㗎[���
�
*A�{�vt�y����Ӥ�]J:�O�nv9u\A
�
j��2�A�f7�Vb
A]�h�E�V�z▶bNY{ѣ��Uq����� �r>�}!1Y�
2-n$]����u99�q�P
+�"Z�?�����J�s+9�N� / n+���r�/��L�a��zɐF����9օ�
+��P~�p^�垛�E�|��:�w
jҖ�è��(��<�6�[�S�_�a0����%mdPЌ��%������Xݧ�yaS�w��
ʺ�Mܔ�
�s
q{�)�̇uz<�`����������ǔ�*���]F�9�������9/�d��.�Y����~S�?ժ�H�9��
q��
+>A㮏q	�L9�4�&꿋t����]���M��[�rr�lN��-�x�1�\>psv獨t�E���$�d�#j̻y5y��w��H�NI�z��G/͹4��UڈYm�/�'m_��\4_�z?>)�ǜ�Y6ik��-O����~C�K
]��g\��-��7���MbJ\��Kjr~栎�V�ni��ɗ^1�4}���}b�)���
�̬�"1�>{�<����Z�U9��!�m��K.�go/���ZRV�	�ͫ�=�Z�떼4ã�cP��(߅^ߋ
+;�\��y8cc�E
�2
�=c�'�e��iQE|�}ɻ��:������h�輤n�uǾ���C�	�����3�Qi��ӺO��N�&|��ψY\O:�ҫ��S��[�]�ӵ�Gl���ʋ���j?��v
��s/e
�q;rb�6�)�ש�A�<[��ŝ�ONϹč�[�U��ˢ�[^�/b����鲏�;Jp�����ɩ����o�ڷP+�r�!iɹռ�S�B�C����C*q~�x
���xX���z�� �Ѳn���J���5�.����JF@��.�?·�F꘻��SR�)�������Q��
�;RVn)
+L�q���&I�JP���[X�:igH��� ~��	�R�
9�����ju��V2P�O܊xe]��ƛ���.*.�>�/�3v�Y���˭.DČ��_��ule�w6��ˑ�Q�$�jH��íD
M�ƛ�ۚ`
'�
+n1j���z���������M��_�~��e� ���b at -�/��C��
���/K[YgSs
�I���
u��c��s[3����_��k�9����O�g������H��cm�u.��=
|sCM��̴YT����Y26^����Ў/?�ڇ�+:��&A
��&���)���8���8�T�u�E����Ÿ�I
-7�edg�%�Y��M���WM�-<m�$9-(]��}I`f4&�h?����&cn�&mn�!=�}
qI�6�⦭qƩ=�H`G�nHB�ykH�ю�溏d���WF۾��=�;�ͺ/	�^��
��'��-?��p�q��ˏ���=�8���v������s��j4#��C&�JZ��w��3	+4O�.R�쑶��(m)���"�w>"e)
��X���1��Ǝ�{��X�W�vQ)-F���0�i{�~z{BX�6�;�vI�y��kB��R����s��6��+�'|2Z>��z
��
�~9.��*L��:M�x�)�2�t��
��w�Ac/�W
ɠN���ӿ]ҙvT��J��@� A-����?p�
�"=��E�:���0��5�W�Nx�<̣d}}���L�!�]:y�R�ͯNZ��Q�N�vHۓV^)P	��;���&u��'� �~#����
*%�L쿓
��]1�&����C��\/F
�(�J]kX��LWZٌ9E�
�t��:�ur� ^AS� �'�W_d�:EҮ >6��
4��sAkL;9��'��ר��s�?R�H9����W���
Y���ڛ�O�A�W�u����cK�:d��krVYsjV�|t.��嫥��+��E�;�Qp7uT&|��yq�Φ�-WF*?X
i�6k�w�>�ps�y,c֦��90�ۓ�����}�U���̃�sN]�)2��HN�/�&�GSS�Gӳ��Y���d�O9+�4m���ڹ�_�MY�%;S]G�3�0��I3���$��ٮÖ�%v]|�mPܽw�N�Bf΅�,�Lj�}.5�<���}��q�o��1�
uܫ�_��c��
k�r�i�����k���d�ߡ-��
�V�s��&�.~�v�f�R�JB���ʃ?d�*v��)Iϳ��@�3��80;��\!e~Y!�}�~��;P�������}9\����ӝI~i!d
��]�_�V�	Z���H���}9�d�`~nu>"�( [...]
�-kMdPԖq2�QG0��N��E�(0
+	� 
s�������SP�y���ōi'�2RIɈVKFt���VW}�
ဏ��Q��\����
dh�1
������x�H�WD�:fUؔ� 
7��tE]
+��BV��
�m�[�ݐ���p�m`;c�MƩ����E
▬UT��������*u\�I�F2t��ql�Օ�,<*���T瑘UR�6��7�l���F�g�Uޒ6��Ss���q�y긭��/�G�gv���4������wu����醯b�u_��M��M�3UC�pV�^�7�� ����jq��/�;�z�V���W���3���{��������
I�7�p�[c�߮���d�E��������]@
�_�"}��
������G>�ݽ���Ӻ�?�x�$�
2<u�]�"(K��Jv&�Gbӌ9���'��,��hE9��ic��;߭�����c��(�P�n�9��s7�Q�(f�+�	�NRpu�W-Hٹ�i'dhȥ��J����9�
+�Y
p`�g����<�=�2F	�"���[X�4�-EA���:1*�8� �p�ɐ����fy?C�؋����GM���Ea��Un�[��B@��MW�`��
|�����_�q
�v�3�Ǜ�J��#Rv!��B�`�^~
�4�!�>�S�!��A<��~)�
��<�i9ꓴ����
r�R��d9��
����RX1c�^���ySv^yl�y*m�]A(M������
�$�tc��d�`"�

��w�5�‚�&�/����_aA���R:�3�
TF2��� �%��+�
�Q���i����F��+fg_�l
����
<�/o�~�0��U����9��X���e�����
+|��4S�2�7Pz��
jfޥ$�U|�}!;/i!J^�#�ڰ�K��?Y�8�{��4�Dv�_��Vw�&UM+/��c�v�
�/�c��� �.�j�,=O;�: ��M��H�$�y�¹�>�����a7i�sʶԼ�r{�u61Ž���\�͂
+�"��xպ�s��?�G:B4�f�E8&>�8
oݗ�no�<� ��L�On58��w�X�9���L��9K����~�t�N�� dT`��
�$k�5�n��+��
2��O����͒��K��M�K�?�3fq;j��Va%���xU[��GV^7~�ە<ܩ�vs��
�ɧ`�cA�{� +1;�l�
�0�P��p�=�#c$�(_��\
+��R�Q�j�K��j,4 Z�U�^vE���}��v8�a����hnq�"j�]��k�A1t�Y1*���ň�@Ps(ȇ�&j͒Z�����a�,�7�`^~�
�u!��
qK�����̒p+h�6�Q�Up�5껑K�xP�J�E��oPJG���m+u��N��O�	������
ޘu*��
�T1
�T��u8�O��o��w}
+&�&u
4
������:|fM|���т��'ԑ������F
Y_\��)��y�<�:�X���߳�V�����㴽�[
���b���nth������-[S�3�����l��^��ga^�q]I9zR�kϳNy�S��^O�
=�]�B]F��5bn=��yvk�yj{�ww�8�_ɏO3�d����m�?5k��f�m��Ҋ
������v���V�q������*�HP�oc�廵�m��3�ˤK�$\�}d[Ĭl�m:>jQ�Q�J�9ډՑ�?�5}��b�B-�����6^�
 \*NΩbd-�s��+>Zzp�������ҭ����5�62Ef��Dj���L��ٹ�����[
+F
���X���;��=:U�o4A�V�~��Z����1q��c��P��N���'�ؗ6_4}
�v�畡6a-j7�ev�9��

N5o2 �KS��g�)���i���::����@.%A�H�Շ���<�{�
�
� � �g]�n2�{�Q��4�iP 3"J
��AAc!*��G�ҽŞ��F`�Z�i���^Tߓ)�O-,/�-��@O?Jqp5��Kq���ܘ��<��z-���e�Z!�6�r���k3�֍)�%�#�ڍ�{P�?�h��Q����
:�{{>��&�jq!��Q�2�1�^�r2��3�?.�4�����)��.mֆ
����Eӝ"�c!�Qb�;��{�	����:E��9!z��Qkm
m�)i����F]†�a!4�
z��
P
��*�b�²B�Г�+����ִ}�j�q{,f�;����4���W�1�>�c�ɶ]}
o$�w
Zܯ�`����Uކ��z�$>�l&�z%�����9�/G�
C��8��3����G��ZR������!<ze�
+jN�S�]���8>�uq��W����&9��k��ϠżzUҢ�^}�}h�
��	�����3SB�<���
�b�C���h�SҺ<R��ң���6Qk
+r��ڏ�^6|�����Ü�
+f>���}����M�	����}�
e��;U�=`��a�[��f}�}r�y��xs�W���o�ǡ���J|�ܘn;�����Ԍ�2�Q�C;��|,*E̓C���
�<��
+rvi��^ه�g�C����k�%��̜����t�3�V1��q	뗦Z��̳.ށ[iWoʡd��k�p*C �hp��9����Y�[�]�Žr�s���U\��߮*U?�*�h�[��
D=F-�t�O�,Fz�(-��ZE4��q�
�8W�9�mq�A��긨à�jkw�|�4��R���	�����-��z!8�X{d��F���9�GҒ��+����_�q�N����
�֔G-�5b!�J���e�[�l)!�
+�Љ��.�c�~� ���-�
��K*eqQ�
���u
�
�̺��f\z1���/���/� ���#܋���!�bm���
�W�x�����F�}71�0��
0�Š^�R��5-���C��
'c���֛��gM�M���� ���>�8�Q	SNY��A�g9��
�JZ�^YG��/�V�1w�P�l�M
+K�!������aAqj�Y��+aUg���-���9������e/
+�'`����]~�¿����
�t}�vaTv�
�<t
���d=rZ�!kO;�M;����W�Cۓ�s�������~�*�
�Z�P���W�5ռ�s��,>��+j6$����睇p��A�T���_��<
��<������M߅^w��/<�N�f煽��g��
+< c����Vau���S��*�yEm�u�ܢ��+=
�0�uR�+i۞��ܚ����JN��k�U��D��9�͢^�Vi+��I��Z����$�0.��p/M�T�=7�
�rk�]
Iۥm��d삪���c�9n��0���6
�������i0Ky�G�L͋���Z�jR�� K:4��p��n�g��� �
r�Ү��=�R6km�S
+?�X�\}A��^���d���%��;2���9�
��Y9�^�;����).�P`��W����P�7�U	V&�ѧ��yGu�����ɺ�"�6K-
+�$�w�����i�!���W��
Հ?�>݅kȹ�,��毓s�7���8���
~3QB��1s>A#�؜װV'��#��Mn����D�g���7A���&>Ϫ
S��,7o�����Os��k�H�}2<��ⷷKb��,<k�q�9�,�6�n�S�����
]!�����RVQ��
��6��%9��� �Kk�a�q�uĥf' �oϊ��ï�.�{�K
+1|VZҢ�e
ZN�,햴�Lv
��n�8>%l.F{��
:^ڡ��w.�=E'�P1a�.M(/���T	��cg^P���� �4el�FĮ��X5
ף�C��~��������PyIP�1�mMv
^|��uj�{%�Q
sn'5&�R����3��ő��Q+d+��
w�[2s�R��O��_������a���KX�uK��VZ

���Tr���|Ǐ[/��^t��Ȩ�k�F?�she$�3�T��:	�Zwp��Gi�rf��͌�9����Q����iE{vFޖ1+;�OZ�W}���N���_ƭZ���x
+Ƅ
�{��Gzl��d֢f�>�*m���N�4�T1�Խ�0p��D��[�����U�wC�7sn�(8(��}
+!��^0O?W����Z�g��Ы���h�s�^ʥ�\�3�5����
Ik�"��ٔ]�K�!���BH)&!������
��m����D|Z^W���rna#w�}wɀA�@�۲����9^��8�tҮ�G��'�A����!�v�)�W	2
iG�,(_
�
ڙT6S���LWo�
�𰱟�t��J:�]�PԬ�K��!�
^Z
r
xB.pj� x>�Q^����
�uc�~
�<D�w�Y��Qxo
b�g��*�'���0�~$���B=W���#"�w
Hp}l<�1�
endstream
endobj
329 0 obj
<</Length 65536>>stream
+]��I�и[�؍�? O
$�+3.y'�J���|oYK����׊��})���v���~��h뷉7���E�u�@ ;e
9y&

�:��估bg�w��,9+���X�Y{F۟��5d��䜸2c�5'�du˯��R�⪟j��
*��$0 �(1�5j!��̲����:eU%&X'p`�̼�sh�{���oMt�>h�d�a�G��
�y`m�FB�M v�<&C�ۣϚ�5Y3���)��;�}����� 3�Hx{�c�
mΡ�!.�)���E9oQ�܍Hy�Z�2�1�������~���;��۾_~��m�	���
0���j��X�r�9�������;f�>��3�"6n	�S���)cns��#
��7�W�A��&��ޮ�jϧQ�K��9ϵ'Yߵ�(�g�����`�M
�l��N�^!!�g�y��?��nA�>F �
���w���aq�_��W�9
��i(G��k`P�F�ߍ��Ű��:h6Gk������P�����#��1`�$�\H�Ny��7�àˊ<�|�xʩ�a
ԪZ
�_
�Y䵘t�-c"�S���z6��!>j��	<��
��x
�6��JP����ˠݴ+���[�`������;n
���C��N�l�jT����D���~0QJ��R��˘	�"R��EmϦ�}����`w��4�h���
+
+��>��{���76P���E����hY/���IFrA�#
}Y����u2ĭ�C�	�=h�Gܾ5K?7��jߓC�ޚ��畠�P��7�~}�Ǽ�9Q�����6�7|����&��R:�ԋ����(����nPL���
���P�4�f^P�9
��iY�������1Z���X���YԲ2������_���[�ٙ�/�%$�4�A�'��n�-�Cm��!������=���[�8R�ab�
z�[[HYJ#����CɆ�z��ɐ�����\��[Ԕ�ke�������L��Z�
�	imvFݝ�U��^n
�7e]�V�cPR���I�5t�f� sp�Vƹ�\�
x�˙��לS֞�
+*q��K�^��r*�7�ǫE����7

Iy�2��;��i�7x2���I��-k��Po��ǀ�n���x��z�����
�ǭ���˻~�^XЂyeI�Jơ��A=h)��G�;T
+q��u�k	��	y�~��q,��s��[i����k�Y�4�Ve���/l��N"z�AF�9�����q/�6k�m�v
ݜg�GÆAlA!��{���4x�
���j���n��
+P��Z
�А�����q�
��-�=��3vՊ�%�
�V�8�<�R���}	���
*�� o������ȨF�_PHsaF특��b���R�C`��]���W�����22���k���=9��)�<��w
�G4Z�-I�%��֡
�w� h�P��*ݚ�<�s���kݱ
+�F�2s�
�`�+l�9ۏ%fk�\}u���D��WOx��W
෼�g��K���kw�����3^ ͏�q�fa�}j�ա��9���3�~(�������`vAKޯ�ŧ�f-�3j�^@-��U~�ُY8uy�������6j��W)
�|�,��|�+C�0ߓ
�0��Y�2�Gڝ���{��K΀y��rJ���m{QQ�ۨ�c/"c�E�|"�oθ�2v^�R1S���̴�+='��|�g
+A
����S�
4�m��"1����'�G��O�/&&8WH�JX
��9��>1�~86ݺ��k�=zUΩf�>u�1�����T���)
�%�6�A+���FjM{^ŐΘ�8�!��$
�c]������
��ޡ�g�a���%����vQ��::N��k��ͷ
���Xe)��Ix�
����>�6m��$m��yq��\穬W���
�mȖH`�)|G���`�9�w`>�H at P95�d]��+g��޽e��\ё �������	jp�ݲa�[N
��\�.�
�z�60^\�
�

*����5A����b���y
x@ԑ�p!�pkWǻ�&,�R�#�\33��}
�Ʌ��xTߋG�R4$��Y�?����{��$�x�C"�V��5
�!wB���@��^}Aե
zc�U+�A�>
r
�K��¼@����J.U�y�=��ao�x��h4)'�Bl��G`~��k����vnj�2	Wϵ�o��n��
��s�u��Ĝ��ڟ���sBַ땈[�6���&!�Xgw�����(Kϩړ���4�
+u at MA.؞a�H�Ҏ���=�ĩ�!V�w���i�^��e�7+�R!�k�xp��Q��oH�VY
iոW��ye�
е�ET��al��
j�&��@���2�g\IYg�_�!s+Q7���J��.^�Ց�IN��(�{Kځ���F�sYܩ��]¦��Hܡ`��P[VI�4���O��ޫ;�|{����X����ØW#ܞU4�f�u$0�^�tg7"�~�a���I;j��o��x܄U� Y~�ԩI�-Z���+)����]�p
+�jmj��]/,��Ԛ�GP���4�'����Y�ˁ)�&��X�P�'aܓ6
��ɔq�����g]�G�g��
�`զh[�Wࡡ��Q6�ӣ!mo�oƂ��D����a"ȫMX�s^������J���:�㔧]��\�]����aצ���#���k���վ���ڐ�kG �g�5Q�/"(ad
ݧI��D)��]Ő���B��U���JI�l��+ߚ��	�Hڨ{(�7�xP�D���ȅ�G����
\7R�������eUxw4�3��'\JFڭd�����SP�B)�a�@O1�3X��{�"je>$gS��	�x�s�v~��naI��Q��5�!A1��Rk܈K	�dýw
+������j�g�'<:�J�_�<�v�ů�Z9%��ǀ��=L�
��� K�մ�S�*��!� �ӖG�{�u{����W���r.��xW �[+��&�2V
����� �6k�Y
�
���6���l�х���x�r��2�A�<��{��B��~4���K�t�
\g�)��<"���q���Y���|D����>j[{�y�1T��{��kܣ����~˙�W+K8T̬W��9E
1��c�#mٜV����B
%}r�W��Q��������Y�e�#���6}
L��9��NxMԽ5<4����݅ܨo���7�����
�!c?
�s����L�7��RP��рZ
+�j>�7G^�
#�&��H4�o��y5Y�'$��l͋�0��;9�1�?p���Y�A���B�Z
9�!g�L�h
�4炽ChX�E#jY* n�[�ǽr6?�	�gdu��
<8<J��WNJK�;���DX�y�h"�
��i(�c���!!ӍM��
s�DPڽ�7�;s��{���}�sD).%��[X��ٚ���M3N���bX-��b�W��m2f�i��H��S�^�:��Kˢ.�8kS�#.E�����ٌNx$������M/�Z�i��V�����~���4��e�%�awY?@D�Z�q�#�� k�zur��̯�A���o�`�@�om�yty��ͱ���[p�N��+X�3���e�'m��
+ȗ��8d�������&�Ы�†���v��M9�Q��5E�ѽ�RV��i�X��nI�ꄤ,nV�R��	��up!��+Q'��UP��D�E��BH-A]�&�>��sh�y_��U��F���y�ڣ	�C��
��c�b�y�z>�,��|M?�5�8���Ո�q���^{���S��Q

+�_�q��J>u���
����nj�sgNX��k#�����u)���P�G^���
�
ĩ=NQC
�swY_W��vi��i�OԚ�?!{�Q�Q퀚�[�����P��"��Rf>��.��+��������Ԉiw���ު�N~Ic@�*q�"(?�Ã}73~�$�5����ǫ��Q�^A��<䮜��?쿅nL���x��F2,ՏDT&Z�h�fsJ�Nڟ�Ҿ��T�g��:����2h.pY!��Pϯ�Ac_�s߉
�� �OT���E�I+�l�J��s���.�{��l
~��X�DX@����ѭBP)(��
x@،R�8�R���Oҙ��,^}�	���QlX m!CRfj^P���_H��50/�s�+�s��Y�E̡�LL
+/���9�vC90���
�������Y��
j����VP�F���v����S'$]*�wSߗ�ߛ�
+k��3fU�M�J��c3�s��[���+�6A��
�RbV�^z�>�:��c�'
Z��
+�w}:ծǠ!|R�����6��
i�N��iY�>����ko��+:�oz�rbVD�ì�
������AO�/�g��e�/����s	�P�69˺��e����D�0��2��W�sr+I?�
+��*rni��kI��h�ί<��~�a�{G�ȿI*�{�R��c� /�<jA>�U����Y�����WCxE���\�'i�x��u��-iW�阍v*�v����{a�5��_F�
9D���JK�s<gs�w.6�9��
C�_��i�Dh��h�NF%��%~�[x�}�ʼWPW�&�e�qw��!p�cx=,���!�P�8!qg
�R�x at U��ۋ�M�9𚶸�
�*Ȑ���ĝ)��%����#�[<�w7
_ǃ2�伌+9�V��ܞN��_n���[�ž�䂾7��aA%���Ծ
"0pu
�h��|��&�4���R�E#��N��
Z
��!��hpw��la}�Mq���nT����D���#����&�+h�j��T
��{� �
���]!9'6'f�'�F���
�����sr�)�PfNX���^L��%�Y'7^u}�>������I��t��0�������� 6A9�7�nYgfNZ��h�K'�<zbU�g����i�~Y�,(K�q�'fاb���Yi��8���8�p��:���/d��3v~��
��~�{��uoM��۵
ġ��G�vIS��8���8��y5I��">%*-8����E
�Ϙ�Sܘ��KN2��f�q��f/"�|��#jy�!�L�
+Js6Q�.�=���L�
Xy��ivZ\E8tb�md�_���V�����ٮÈ���[���
2���p�.��a]��X��%�������q.'f8�	�N����C6��b�ǘ_��|�����h�ƽB8%�T�<j�֌�"��^�}
�<�������H�p��X�[%��E�֥
�ZM����VP�
�$|֟�	�}7�[/6
N;�G�2f!,ea��F�L������O�]��ň�[���u�C�!z�1
��2��%	����!k���!ʇ�=�E�
+[	?��	s�^�?
��kh��
x��|T�)Deܟ����Kܔ�޶��V'�W����ۙ׭���@\���]i
�,��i��c}BZQ N,ǐ
9=5�9�:Y�p'�<P{L�Q�M<j�A�K��`�	����T̴MP�5�q`�uׁ�W�3�3��eį�!���P��q��~֙��d�V�k��S�
�/�SS�өi��(�������7��������
�
��z®�-=�
J�p.`Na]�:c���s�P�+&&ĥ/8GR󒚭q���'�}�I�Yjm6	����胖O
u}����2�-A�ܲ���Ck�]Sf^I�ƾ��ye�)���1��བ����������sf���l��Ɏ�i�Q�ν�Z��;��3�Oh�e��-/[����$;�<��E��y�Y�¾���]�y�=��W��̪vܮ�efM�9E��>�㧍Wm�l���O�g��e�E�]�@�i��_M=�K=���J��A�M�Z�i��K�UHi�_S
�Xx�Y3�
+|��
\�R��^�8�����qȻP��-=ǹ��
��ҵQڡ�1��8䒴EX��\&lҦ��r�
�0�5�c�wƘG�����!C�
%�H��y~Yn�W{�:��
+�oFp93'�L�([�Ӫ6Ԯ�B��֝	ޙ�7�#3�B> �#Q5ꐷ���(�Sί��	RN%#���6x=�J�ʾL����s��E�o�Rzѧ`�u�{a�GԐ��K֦h�21��E��nH�Ǽ�F2,ca!Iw�%���ج��
[��ڿ��wd����������?@�
�e�����~upJc3���k�ɅW���YQ
�-6�;Cz��,h4E?��EZO�Qڮ�!�!m5*��K/���IU����
+d�K���c������������w&��y��x�
�w+��п���%�8'6_���<��f���ƈ��Θ�b���t�F�ǡk-n��
��[~%�h����(�b��Ǧ���Ϯ��>���y$>&8�ޙ�]�o��5��$h=�7P}�6ҽ��Ň�_�<j�
��:�X:�%fٗv��݉Ym7�UGb�{nu�qp�9���+��*i�;]q�Y�)��Դ�
+���x��/�>�x������h羵7������\{��]�%gd�9%����l�tg����i��켲s��	5�y=;9�gmO�j��;��l�p�Q�瑇m�n����wI;
+�á�Ϥ���G�Nx��U�DB��֔
+�w�:�Q��V���OY�Չyօ�׭����^�|Ϳ�����QE֬�����Or��'x�_��|ѽ?����KO:�^{��!;!*�g�6��Ĝ�r|�urg�z��u2gUv%�gWF:�T����y�%����/��}�������#���/<`
�>i�
S��o��������=�g;bS��W#���iq����<��ʠ#E��
�M�'�S�#�6^���Ѓ���UՅR�8y6����f��u裏X)�G��s
)�N�8t¤EѺ��s<4��������w��~�Q�A�#��W�X9W��,� <��0�����N�#�>����d����"qڥ�NLK�P�iQ9�wD�t�
���l�1����9�V�;�
��ɬ�]Jx�9j��K�+���^q.%&�'����65+���?e���v`�Y�7���s�7�m�����cŅ�{���YV
�,ޡ}���wt�
훭���k����<�ˤ�"�F|y�5����oÏ�?�6^����;m_�=�>���?8�:�9�������Ə6�V�5x���=k=��Qw���k2fuWbVZ���s�b����_g&�'���S
w��������Kޙ�1AIb�qs��������
�݇B������f�i�]�F@������_�|
�
�MЏġ�����)^���C�9-3k�S�L�:��	O/>
��c|�����/㣜��Q��k�1ܡd��x(������>��
y��1�Qc�
+�ͦf����4}
�U����O"w��
�����G��;0f�1޹쬤*�FT������
ơ�݆����=0���qܭ��ʎm�yg��
���h�wK�;�G�~�V�޸�����>�
�Xz�����o}�u�k��`�V�>x��o�OY�C��G�5-��������A|&>ͻ�3�<㞂k�iu����~��z�qȒ͈]ܴ5�:�My���ғ�/����_kx�	m���������M�(mX��)r�����B���&8�q��5��tr\ځ�cSʖ��
�f��Э���ڒ�L��K�FÇ�kM�
qξ�2�vt7̮��7~�=����h�V����K�_}��i�*��C�O;U��UѶ�Zp6z����ǝ�,=h���s�
�P͟7Fh�w�?�j��O0�`
)��Z�sN^U��ud�E�g�w+��
_~g�u�AϭƯ�S�j§'g��[�X|X����w^
+����/�Lj���rK�Y�K?���s40��Q�Z�������>�V_��k��_�վ?1.�JL(����O�?�=���s����ޚw�w~���W󪊏R/$%�7��姼�������l<������
u|���~0x��	
=k��m��U.<j��?X�{o��}����Y|��ɔ��]�P���G�ӑ[m��=m�j�y�W�O۾��l��f��C`��o���W�Ў�洂Ԥ�%6.���}
���ǝ_�%=WK߅�.�|-�Xz&<7�6^���F����Z>�]����jݟ�}e�M�.�glRP����~x�%��&���Ӗ�"��?�
���
�������3��W#͘m[o�g��k����ꓮo7(�|B�
z���g��qAI
jsk����Ӯ�"w>� ?������k��؜��5�j�;U,*[fl�
+��f}�o
Ɔw��5��K~�n��>��;P�ߥ�Ӷ_�Oz���<!*���������ꕼ���#+#����KN�/�'8��S��~��7�?����ޡ��L�Ͽ�\ [...]
+ݪ|?k��I�u���OOӏc6^�P�����M�O�4��]���
�ב�
�׼�����쌰�z�������߃�5G�A~�}bJ�?�^�}��������w��}��E�w8G�+��UC on���/=n��s�ʻ�K��/���[��aڑ��Z��_7�1N�
42����7��_�K���YW�q��_�d
��	C�o�������obPӁ����W����-��S���������9]͟�K߿�v���_�/N�������ݍGm_ͫ/��5�������9zﯴ�n��$��bbzUc�1��{�QT��{���{�"����"v�Ҥ�59�9�����#����0#��,֚����}�Љ�U���:H1�rf�o��>����������:A���駠C�.U���v/��>B���F~3�þ:�������^�Ŭ<s?9~����2L����a���q��k��蓡=��lu��Le���6b�J;.�8�
��y-7@^�4C��j�^(y��;�QW��w�����X~>-�|0�H�3%H}2W��t�1�UR�'�Ÿ��"]�,���E�Z:Qڃ��� �
�G�����d~�k����LE�6�y�� �7P�ޑ�h���/��Le�=�XY�q*�I6@��`n۝����
0 _ziEY/�lp�6�
���p�K-�
�"�Ŧ����H���q�ww�|���nK���
E�-4�?͉�_n���kFg�7'�����cg��0/*|�х�o�Rq�,��\k����!��<_��at����P���:�J��P��l��f���̠Ҧ��u��/��
=,�J�Z71J%�;�O|2�Mz���ݑ�o�
��}��!��t���ٜ���wJƏkjN�-CK�SCC��Z3�����{)x�e�L�,?T��w��M�P���b���<�����t#2'x�n
ͅ^�3�l��|�j�~�ә�aA��~���멒K:�
+��	F�e�1cB������o櫳��*�W%=<Ts6�_VZJ?/��f*an���7�M%W[Q>ü��9~�&h�>rv�J'⻜������qUF��nh�~���)��t����E�9]�L�#%D\V1���I�'(�7�İ�[=��\h�
xȇ�s���x4�
����P��TNK�Շ�<U��x�����iN�G�2B-�|1[��~�2�Y?&�*�]�:K>\X�N{=�I}�G�u��1Ѧ!,�-%� 6<WZr^�9q���~�:��՜h�Vl��Nl�{ K����
��L���;�����n�Ȁ��a����n�}t6tWBL3b­bt����~i�	�gЉ�]�'����Q.�<����F.6}\k+�0���nu#|��ԗ�������c�$-/↮2��B]�K)�睹��G��Ocw��m��6 vsN2�@�X��b#��x}��$=�s���9���Uƿ%&����ON�7��)+�
�*b��J�L�~+-oV��o6�J�,�A}V�J��|�]�)0 �[r^�r^�ɱ�E�>�&؉�͸�'-�X#�3
@�������z6N��SW�5���lC�[6�-:��_��y�`��Ĵ# ��dE�+m��g�!74�Ȼk=%~
��܂���б	��4 �
*�d��}�ږ�QB�v�Ж�q�&�׻J�W�s���C#7z���C�۝����|c�{F���������2@[2 /
�P��d�6㙩�u�FF��e?�%�1�{�a�G/��\��y�R��2A	���b&��qz���Sn�䡷�QA at F�4[��t�
wkQw�#�c�*�L|�،I�
i�o����
+�LWe>���RT at _S�m���O�"�z/)Zא�t�!�e�9󹡹��N76`��VT|�xXW��b�*��j#���sI��t�����@�wAi�uZҷ������y
�h����b��.8��J�U�ԇ�j��~Zڣ��\.�Iq�0�����-E���b���D\i-��k�p�<Z��*����|�.�dl��,�d���\s_�Te=���ߛf'=5��T���n.�����t�e�\���w3���}�������y^��ȧ�C��,k��t3�M@�	<��+�Bl�¯s���Su�	~��]	
�ݏ���Y�e(��
#W��d'?Xo��FI����;;ݰ�ar�f"do��͓K�WG;�%�+�i�NԌ2'�ߖ:˽�{P�
+v��85��jC�ۃ	x��4*^ݐ����~e��5#*���o���.[�w �a���}.qO���7d�Y�(�˸�[}Ԙ�>��f_��͞�Ǘk�������uQ��v^���?繌�|[�H�3NK~4BL})�gz.t���~�
��>�
���
�l�'��
�9�V�]V�^nvCA� e�_O�uq��d�d� ��\e
����Jf�q����~��C���D?�Vf���g�~�(�&z�:�e�!��������bGI��&X�J���p��t�!� '8��(��,d�.�U+"�F&���?)� ���&&�
(��������O
�i��3_:'iE��K]%�
㴜]11y���e�a�}��v��$�*���u��AN�B��8+åyu�2�ž���\�lF�ޕ�&1�ދ	^i�{�ܐ�D��~$��_\24A}LbB�VT�j����M����$ƅ��Ue=���|������`�
;�f�0�%{w����u�Wf?Q�3
M����(�/כQ?�#���܏��/s��Z~�=}e�Ck?�CAΘm)ѷ
���;#�C�g{��jS�K
C��i^��Y~Γ�V��V��dN���<LI^l.���@�Z�q�a�� *dw�\x��c�jz	�����B�]�l؟&�Z�̻/���M�#&1�GJB�CF��7Ã����{
��&��0.芆~{g ���~s�"偱�t���~�؃��=�%��P��S��
�ݕ�f^xm�#��/-� x��ٺ�7;#����K5;�����V7���n|��������y�W�qI"����4��I�@FN86�!+�4�{nw�/Ԧ<��(�b
fe��c*k
+|���4�
<ߘ�ѕ��4T�՛硯M}��Y�?L���2t��v1V [�)�E#�0eU������a����g�Ss�T��-�,��!n���o ?�[j+�Է~�i/�
EgJX	ot��g��"?�pi�
<E��hp�Vi��(5��Fgi����.EG�˾M	��M��
L��
Mp�_��"�5y��������E

]��V{�����p�<��a\����\�]vv��t"�'�p��=��fl���#E�H�A� �M����[n
�����,7d�֋Ҟ\�{��<PS�c�إNB���F����v%�Ƚ��ڎ@��
8%f�Of
3�{�;��ˍ���V�ź�w�s1���.6|X��I1���؄K5Ş�!|ԮiFo
@�����~�[��p���N���x�/�y�/fx�w{aR:x�>W��+�@k�P�-���
�>����������b�����S

u�\Y���Rr�J;���
+���@��a��#�<�%]�N��Ԕ��:J���i�w_�Jy��*x�օ� j*�HUA���a
�X������a�jO��Z��P��~䭭�@ka�vYz�
�k�|�5 �t~�
+�����D������y7AO��?���eC�
v 3;�ڳ���%eA�rP������N���)&\[��r���RK滩��Rv��ն�O�*Z�<�+K~�W���*m����R}�c57���
xw�/�c�,l���>�����N��G�MQ
u
��ȑ�����-Y�[��8dȟs�?	7��}� �շ�]�
+��֝�qK\�5T��&EDZ���\>l�ҏ4"�e����V��U�=�Mt
%E޶����z
k��W
�vw���瑖Zl���L��&1�������C���@6��+
+�E?2�b
���;��
�P���$��,1Ǯ���Z���x�.��H�D9&��#�����zة(�a�����b�wS4x8C�G
���kZ��D��8���h��q||
!��`�
+픰!�Ԝ
��8
��
����̜��.X�����bo�`鷵�܏;CY���QI{
+R��,
i��go
��Gxys͈/���n��n�A> ���Y�?�	�k�F�
����9yV	;����87顔so�6��f��4P�/�dn
�~�Z
+�(�0��؜�:B
�=Ί}؅��
tc���6^��m,��>% �
���_sD𩆘�@Ů���V�S_�����Vj
�':&����*��5u�2����
#��83�Q'�粄�`��Ի��PƊ{j�G��	I�^CO�XeJjю�cU�c�5|ʾJH5�2r
ݘh G�t�=O�}&f����8X
f
�F9�YP�)AS��x����,!%�%��v4�g�U�ҭ1�O����9�<�T2a۽�_��/�ՙ�[
+?;��,@'sբ�rN����
�fo���ҟ/��}�!��iY�q!�"�f-��~5���9���{
���OӢ�W1�,2T��4
�;I�,��:U<�CɁ�%�hC��N_���/����B���3
!B�d��"j��໊�"��ޒ�P���X�F
�T��*!�1Y� j��&#&nu�>���gZ�~kC���^L����]6u����rK�'�&ҮĦ���:�6��v�3|�y��G��c}�M[-4���
12h���� XY�q�%��p��jxt��Lu�I���K��v��
�z�ԑ�Bߔ���%^��<�z�G5.�d���@#��)�e{rV�e���3@�Z�%��b�N3�_��
Ds?/o��ц
4v��#���[fӲы@���ߡ�Ujc�
�
聚��O���
+B�ij
&FŬ�Vt�M����f;.`��o��XĜBC%V'�����E�Dž��AR�tu�+U��j&�1�B��
+��1T�vO��J[櫕΢�{
+>z�4_��|�
�d���R�[nB �I���>�C�o/7���]��;�_d-��*��
.�ܕ�R�fh%Gj|�Bs���.z�E��]�c�h���
ԏ��?F�{4�L���
�еbp
#�����{V��S`./2K��k=�Ϧ	x�CC)wh��]9
b
g����`����C\�;��ܔ�2W��)�e
�E̕nZ4��6�ə*���2�
oQ`�,J\�s�^�X��2kZ̓�9m��<�8��vNR��{ �F��[�0��~d䡚G�וx,��64y�p9ǚ
+�S�,[�ED���_Z�Ԭc]UՉ^(����;ð��`ϩ��w
�����/��v'�y�f�S��v�ԵN��F����W�;���W�	3$�$��{���Q��[�=ŋ�=���;��u�kHs�O�Ɲ�x;�{�(9á�e�&�J����R�1��kj^����|7�(>��Y|��Ul�&�hi�7�Y��зe{ϵgzn��b6ƈ��~d�����x���z���a����ش_+|��<�k�b��!�%u���Ua�	��>��%�x��,�<�ɶ)g�\�SK-��,�h��ěGq���ڊ݉j�Q��[jE�V�\�e�ݴl����p��?�,ʿ=��>6�葦nF�r���0"h���,#�\͵)*��~�a����EZi!�mt0"
-̈�*�~n��~DֽY>���]�i�f%�ד�&��׫|�瞤��%ᗨ�_�[�aU]��0l�Α���7�_�����
ܝ����Ί�Y!�s���R�1�V�9�`�vA2jC|6C��Y����!N�q�o���)x$�T۰S%b:4�bs���������Xh��*s֚h!�]��^�Z#|���� �u��_^�x�G�i�l���m�y;����34��b���b]�S�#�
>/�B�����Tq`K-����v���ց���y c�w�`}
#`�E��7�@��M=�$�0�9�S������>�4��!g�m�i�V%�d�2�#�)إ�C�Э��O{c��n�r�[�R���3�.T�"��muG�v_�wC'�u

>���8��i9���'ŶIJ��,���e�O�XX�xI��P��J;�m��9�����>h���jy�O�>fᑼV`
�-�s79z_R�]�b�T������Ql잒9�f�+��°'RV�
COy��Tm�9Fv���Ԋ�Z�$%� 
og�9@7tNq�>N��>�����M(�V�ǹ�̏K
y>�Kܪ��
���
�d��ž�V�����,;^��<^f�7%�?�����s��*P�����Ū��t���������Lc�/]m�m�4z�5��rO�{�{��į�cBW{�)����=��m�������0�!��_H��
+x�
+���M��+�@�7�}~�!��U9;�ug ����{�C7�)9S����&◉��q
��0�SrOɼ��I�
�����P���''5�
+%6�BZ��__�b��^l�e=k�'=Q
+�=���I)j�&D��?�9
]�D����CB�jÔ=��]e$�\BF�_,��v�
q��~��w)��
�߁�^��B�=��/t�g>\�`&Y$��]y5ck����X^h�Ξ����/zА���Gb"�} ]��Y���(�NQ��E���@/����}q��q}�V�JS����`����Sf%2�Q歬���-!h�xkÌ
)��U�r�����jܫ�$�#5�**�r�����p��Ę�+��?�Pq�*�1�@;u��	|��
�-� ��Iʆ̷���5�	>�g�U�փ�|.ȋ�
�z�(,��kW��w@!o�]�&�=��&��ps�
����):�9�A x6Jh�;b�s��:�q��)J�bg���_�l��3S���K���z�{�u�w���*%)�
+��K���^H��tz�:7��� )�1�#ڧ��m	'��c��!��Ե!��z��v��	a��Vx֍
���;���+���kQ���p���1�zp�
+���۠�@�?�x�!����Yg	�Ә̕�,omK������V�U ���v'q��Z�M�.ߑ0�ׇ�EMy��8�3-�fUn�utt�� ���h�1z�#7ㅡ����[��v�+R6���(�{Bx�ZAΥ��HP��;��]��;�A
=�ztt�ʟ�g�n�B�^�r��/����h��Ϗ��|���c��X��m��Õ$�t�
^Q�FN�%hTȅ0�W@�>%{��r}}@A�^��
�Ez���
t��eP���?^�G]�kB~�ԗ�g=��D}XjgEMֱ:Ȥ���5xrʅ�?@�>�A��_�^ݹ	���1(��s�W��{7�����uX�
���
8�?d
����w� =�0*BM�s�ƪ�^-��V,ҥ	�M�L���!��
(��+(��������؏��o����Ы�7���͋�s��%GFZ4Ȅ���/sM��h�F;��H
��PŷH�	����P
 B��"�^�>?} ���t��5Н�.��ܿz|�Џ���`f�
+?�Ƒ���>&)6j����r'�oL�M.�_�@��]*	e�~�~z�t�z�.���]Л�w@��]]�t��x�+��_�����ix��ya��
�t��Q��Q�+'��
�#�
�/MH�CTt䟘�苙�> χA���x�x��������
==�~
t���g��%��3��i�p�7���MdW�w'���QF����� �ZU�~��I腟�n ��@ߞ���_�=�w��e�
�=^��q�/�������JX���yo6�a�Gs4������ c歎���=��ɚ��bN��A:ܣ�s
�󏄯�/|��9P! �xpt8�{@}'~v�F�^�%��\肅Y䥑��<�@%�m
��>Qp����Iϻ�I�#���G���{���C���/@??�]¥f�i@�����;�
ST�]�E�*�
�bUwm�pmE at 5��̸����
e��҃@�_<}^a�A�߽��/`O
�b�|�����bRȽt������ 9^ׅT��>O�ҾO5������x��j
�!*/�j��'(�����=������t8�� �{�@7��
+r�q��=�,,�z,���
j���YI�>A�����MG�V�f_��ިB���ff\���
z����3/������@�
���ܾz����;\@??{�hY��|�[�$�����WQ�K
��,
+r�A�ɟ�eƍ�2�Uc�.�	1������9(��3���S`���n��'��W���w@
����}/�x}�T	Nx�܎�ؕSs�ĸ���Хv����8�B��f`_a����
�~�A	�ޠ��^ ק���.��\���c���n�{7o|q���BVȷ�bv��CI/9���<��
��0a�c��ɺҷ�z��jD�CHXȥ���@I�� ,���X��� �O�}��&�1��O��^<|rs}	�
	��
�`�����M7I�6U�h��
=�M���"�h�?�'E\
+����
���k�+����^pq��������_�3�|����9� ���jH�=��k[��+���9zw�OٔW��S�5k2j��zÇ�^A�G���q!��7� ��/@�/�	zz�&�O@�=��2��JV�
<��BgY��1�uf��"�!{��>�5��
ۭ
C~�Id���/Q)���"s����w)�����XyMo�|Oek���#�$؁�g��Y�k��&+1�n�X;#h���������5嘧�X�-�Z
[|�{��y��p����ډBzO�1�
�����R��!l�Y]��Q�膱¢���
�+"�����IjEq
��H����[��,!�*$<󲯻'���@-?=����
|��
+~چ��h�K]��
)��,bL�B�� ,D�ܯ��]�r1
R�[;��^M����%�_����
+�N�; �������bķ��i�!��W8��W�
��vR�]]I5�s �I�H#�>���ݛ	LS5\�pm�`}c���{^��y-���pwoP��0��Kw���w at 1_C.#�a.�R�[��}��^髥[
u[c\���<QQn��(�����~����]OC���<ȋJ��
u1����
�v��\������:��A��[
�fZ��2������s��ƎWDm�KUM[j6B3@���c�v��o��W�����茌ۥ)�w¾���������bB�����/@�Ү�ˋ]'�ɡ��
+�UVð�+�f�xk��=ӂ���ŭ�א��58�
:-�j��ϕ��п	��"��z�y	����Rv|�ĸ�ۙq	����|�]7�3Հ�.�e=Z�*
>Y�/s��?�ݝ��ښ�ue5]���!"
br������B��(7,
+��p)�?�כ'��`���ܔ��X��A.5|a@�0�+��6ڮ�vT��ۀ��
������z�Q3-x1���}���
+�
��l�4Q�54�R�2+��
�O����6�M_�h��v�R�Z�_����)+�����š���9��MX�����
�]K�����z�v?-�h�
?���V2w�t�UƆ9��
��Q���nS!�n+E�-ya���h��,��O�4i�����^���)qTX�E��הB� �/'*��և	vec����~OU�ߟ��t\�ᬀ�7]�^d�.t�~�s
+�Ǫ�˃U����TeWS�d{s���%F^W5.��Rq���u����^
׻OT91�P�>YM�(y(�$�#���u��Z$����%3\�
�&�'j�9�
��ʟ#��ْ���zƵ�]�_�����ja�.���yV>զ��8��Uv]m�m��cw���`���
Ȁ��4�i��b��-e�����Ff
:+�
{�-j�o�U��[+*<+D^������e�Wu�X߷��
,7JW���U���&l3,�����"&�j�S�T�T5q����%�ճ�5%Sݔ�AV�x3#����|����9�V��e�NTb�����,TT
i�ȭQt�a��%���"
+p��%)+[ߍ�"�lH��z>H��5�N|0��Κ�Lt�Bd��ة>Qኤ�n�l��U�C�huU���aȷ�.�l�E�7G/�UQ��Z>ec��|QVY>�[�>�&��h�M���Ô��e��N�v�	�(�%.���	�K�(?�V at 3�y��n�w�����Z龮]q0W�e��T�T�+�
vƈq�����!��\��t�(%��e�h��M	`u���7�F
�E5V5�̩p7�&;�k����w
-�jMS
�q���6�
ڔ`�ץ�,�+��U
+����{��vYУR��,��8�O����{�
ͻ�|�R at 4�x��	
�$�f9��X6)9�2D���'D�
Pb���[��0Z��
��m���~Z�M�+;�2w��3�*���Z�'��^�
��0Kw'���[�#��OW2�5U
���sjjj,�u�]U���KQ|�i��f
#&Z&���>n�rW�6�;��R;h����ZͰ�(��=vw(�I���"�4�`Q�){s5�����uMC��tkφ��gCY�Z
�D-��Y
zGɆ
���9�L�g�_��mn�yD�%߮���U� ��C'��#:�R���
�s�Qd������qP��3��F��e�JZ�1�+����
�G
��]

|�P�v�ܦ;Z�鴨酀�b��k8�iV�c���
�f�����*��{�umk��0}+��� ��ne�d��S|Ǝ�����x�4B@�4z4/j>R#��P�
�5��˩�GS\䁊S~�������
q���@��Վ�g���w��CWN��lU�~�ǐ��0*����fձ�J��e�
�� )?��de��]<��zU�m��{�	
dV��{M��
��:

�膤<Tך�i���c���X���a���<���:���M2
�����R�͡�/�ׅ-���~��s��j�uh�����%9�$!�.6�|�*�]��g�K܍bR�e
眦8�H9v.�@À�OQs���;�oU
�5K�1p��瘧)`���`��㭓�
Us��?���bu��\c�S-b�ʈ�&q��YR���v���XӋF*�|v�1�G���}MS�s��Ŧ⢗;��o�@<w��;RJ��
���d��+i ��'z
�|���,>�2V����9��
�j����L"`W�F�k*+45u�S��=�dk�#+?�f���cU�Kw�B��Q���P����D�"��#�Cmc��,
�-��o
!� <��h	���_z�ע���1%�.5ˏW�������cW[SgTҠ�Ir�M͆��V�X��ݮ�9�q{8�@
��!��0��s����|��B�+Xv�l�|غ��W+x�.��{jr�j7������*c��;���w�h�eAݡ�n�A��?��_�
��
�lM�繯'
�E���C}��t���-�!p��3L�SE��{n
�~8��#6�T�j7���)�P���VT
o�zNV��-ZZ��)�meS��X۽5A�&�g��3�y�f&ک@%l�e�
j��9�h�)���:��jgλ�)l�}�~:G�
/T����GѮ%yf�
�+H����M&iq�;E.;^�՞n��L���
V��i
S���g�$��)9%6~GR�m�-��QVy���
��;�.;��n�_��jxx�$1mw�,�>^�kz�e��l
+��Jb�������;�Ե��+��s �Rt�q ��[�f>�7{�F��|�U���,��3X��
GG�t�o=��_C��lQXs8�B���->�U�L����7M�lI�1�%/�Z��j��|�c��e�+��`cΦ+�v� �n!�w�S]�{�ѿu��}5�+g�
+����v�|Oç�L�2��)O���-2
۪�cljB�M����бfYY�I	�N�7d���^|�E�g
/���i�*8��qr�ER
�ޓ��8���>MȘi+���	?��k=���S�M�,��i��qt�]�K:�O�	�����
�v��,��T��{��=��gzb��
���S��P�п�mS
��8�Ȯ	v�D
�g��<�u���Jl��|���61mOK�>�RK��jZNf�uOa�7���5��G�q�sl��,�
��x�Z|~��,#e��W��^�
M��h��vlhT~J�v��_�%a�zR��2�x���
��%�x��ɮe���B>��d�G98�@�I=����s��I.2v�g��s2B�E�H��q�V5.�6�K<���
/V6u�gV�{Z>�l�K;������2׺Ҟ���L	�ޜ�Pa{�<��)�>y>놆?�G����!�D�b6ts
�-�GX'IyG�
⾖R����ٛk�
�Tw�	OW����Z��KX
��:Ք���1B��}��t
��|U�/C���
~��
�ة�/��9��w�\�UI+��@����J�_����-�o�Wo�d�k1.����O	k~�y�,xw(��FK��R]�����ϦQlԠ0�
?���w�����V�f� ��Rl�� �8�����s�uh�ȿ�*��t�E�K2+�
>�PC��W�rvF0?�#���>f�}���/���ĸHc?�]
+�Y��1
@�ֻ�^�%��v-gs���2��Rrں�>@��
��MpJ��XH���{��ӹ��_��9�U Y��n'&mI���	P�U��9
�
t�FTu8[]s6C��i1��� ��<xG�
�#���t���æ�fk���,��k���..yi 
T��xb�G�O�k�����r�]�L �?ʦ@D8m��iM�.���W�
+#����w�d?��"C�������i[C�P���:W�ud����q��i[��IF�YBJ
$&���,������wD#�O�: /h]�a
��U�}8���Z���R����?k��
���n[�g��z���n�aߖ�ʼwF��ۣ���i�ל��hZ�8�p1N5p~2D�l]ړQb�ݭAR�5ر���jQ�[���������l����r0��"�lM��b]�u���ܑ�n���P���j�u�<d�&鱜w�:O�8U�H�h��
��ZӡR8��y
+�|>��=�w8���Z�"��Xx�4
�
f���C��Z����e
j�%]��G�nx���&���s�#�d�,"�9�J9�'�g��c�� r�`�I��V���9�
��XK/���x��ط�t��i��h�U| #��I��[
Env�
RJ�� "��y�"���[��`{�>X�:v_�x�������� 
��?7
�&�c�8]�U ��:��}����?�mƄT�]-��8�9n����Bm�s}u�������U��,���lRJ�T<<?��z2��M�(ޝ����؈�)dw

�֛��,-	:�e�
J*�.֞�
+u�pIӨ�c-2vO]
�1�]���8Ľ��^��	�\��41�PE)r���)b�U���ņ�6�_o�`�m�	��P�}��,A�J�X�w4AL>��J�g����{��Y��u


谏�ޛ�T}+PkR&ެ``w&(`�k����pWA�r�h%�	j�M�O �:vo�Qz�L��l��P_�~�PUmQ���2b�f/�WÎ��?�I�5[Y} p�SC���� �
���c

eU`RMrlƮ�9�W���y�ܕ���K�#=�dOS
i��wFa����`���&��9'�Y�c�X�$5� �lv9�$A��
�G��p)�
+���wk���{�^z�Xռ�a l*\�YNN���f���;RBҶ��n��
+L���M����N��zK��yk� ���lJb��UA���u�'@�L�EYlV���-�
�YcQv��y
�����G�/T�
 ��lU��{���h�\����l
yͷ�}ܟ�puª�y.�d�I�k��U��*� ��"�
��	�l� �/�2t��L���e���h�O9V��5��*%�9���^� ��]LJ=�3
7ۡ
�>��j�C)����Gߜ����%�Ͷ¾���{%T�I�.��s�G ���Ue�lyu���^d����Vw�� x�QT��*�}��M�T������ԅK6�Rbf��O��iw���{sUـ�e?�K�?MbZfE�G�����'{�
+�YA/ߒ bM���������P�piؔ(���$����
hQ��q��i0����D+
+��ޞ��@N/�Lp�W�Ё��1��rq�Ӯ��ŘН!T P+�[��_�չ�
��C�p�C �o
�~�w@<��r?�F��;9���R�Of�eSLԮ
Խc�1�!c	�'�4��]-��,�6
��渄3 _����AL�u
m#���K��”w����N9#�	x�]e��P �z��:x��f�:�s�<�<��*�;��y��ҡd 
��!��������v��\����Q��y_��ʺ�E�|��uj����rx��6��u��6�
��3�'�7��Q��§�
�����
=��NZ��-1�����i8�M`�V +�iX����������1\��1թ��r��6lʘ`mCi�BC��ML���~�Jʣ >�5
��Z�q)��t��<|�C��k�{���8&��^���Ӹ
����!
F)&�1�FۧXe�s̳�ʆ]56�9�Nڝ�$8T��C=�oAG�k����V��Zu��"����$�ب�!T�� 2ܮ�������$��s�9]_眪@�h�G3
��9�.GG��<�¸���%_W[���{�A���o;� 
��b_����[��H��k���l��á� [...]
+��}�7�TV�?���n����4t�
+-a�
���IwN���
+ at 3�ܵ���z�����;�if��0-������Zm��h�ǝ z:E�%���&ț�T�MBL��I	;���>t�V��|~��
�7_��.c������¼�2J��~�]�X���h��U

�5K�
T����n�y��gs<ޮ
x:Wq4W�ؓ�q�5�u�+��UF��
�'z��ky,�LM��W�]��5�_/j�I/���dԛ|�ǁ�B�9BJ։ �t��:~�]-�� ��O]m�s���;&x��m
&��
+�1AL�W�b����sL��,�y:���^�WK/=֑�Nt��)R���l�%����;
�/�����[j�ņ�1��q|�E�K�����E��VgXm/	�L���|��O�y�C
q:+`٧8ȽiF�鼰zVT�-��v�����J��#�)'&�wC��:r�
2D��
a
.��E�,�$���@'�^�h�Y6yy�S�I4I��Ob�ȍ6<fk�V�Y~����,��,
��R��h�@Ƭ
�~?��rN��f�Eu�˕M�K�m�z at KuL�y

��D�eU3���
��{:��x��ѩ�Qm�8�
���{�]�n�cR�۟s
�(�!A_��ښ��8X�'�?�$ܙ��zv�bbO�+�rR���s
ܖ!"����sL�^��V��q����Rr��bc[B���E|_�,�\��y��
�b†Ud>�'y�q��b���?�[r_��d=��翙e>�Ug���x ��>��^�FT ^��;A�3����v�„\���|�/'��
+�V=�H�(=����<
�����w�9��)��r'�{���G_}�;�.8R74��Y��ķ|�uV�7�0�۟2r�����h�E4!�o���F�;�g�y���SW��e�^h�y3B�~�؆I9�����\�{3?9���
Iq�i�$�H�D
�X]��A�Kw4S��{���d���
Dn�#MC��_~_�D�R����9�
��r����@�K����<��3�-7�znw#�6Gi9��/���?��a�uU՛�Y�U�w��F!޿ٴ��
+n/;է	����;�t����Ju��ij�
5��FS�3%9w�
���aQ�{����g���3¸{-ş�)�?\�fi�}}���=�(�g��XU�{���g�Vf/
�
���� ?`��e�`Xd��5�x����N��d�
wG���<��4�
w1JJR���o
�ļ_��9�g� \��W�N��u�aa*n����L�C
�7��[&�-))�1͂�8����.
N/q<�IsN��
ZR驡z�`�_o�R
+��
���,Ǧ����N��$����(�=mU��u�����
��H�+�,&Ʈv@�4��WV1
b�D�V&?Y�I~v�
A��~j <�]��8��q�
+N��%����#
}6O���B���J��.b�G���F1Q6vM�Lӷ��9��2�H���e� 
/&�17'H1W���T17󭊟��!fq+ͅ7:�>�$��ٺ��jA���v��_��j��s�5��rW��R{��ZK��]�o
O��RB�q����BMǿˢ�}
�d�
�v�=��jK�
�/���);#�x]
��v7>b�Ub
A���E�M
+ �롑��9��zQ����d1���ʔ(���4�Xߘ��T��j�
�����?��!%��2�I�J�mJw?�q鿖��N5��5Ԃ��~�
+b�� ��H����R�|��R�4���i.�PM�ߛ��o��:�����
�� 13��
���
����,��s��c���IS�y�E���!
+>oOA�N
����f|��-	��@E��d��U�j.s�?�{.����+�D�щ���2
 >���S_U�>FN|\��ui��+��})k���q�k�bR5���n�8G
�����������l��>g��Lg�#u��+UJ)�ww
B��ww�%D��@HH�(����s���<�s������p����ν�Zc���VZg�L�{�4bc(��D�S�DE��"����YZAPŁ�����yo�9 �tb�
��Zw��#
��O+_���b1�o��G}Y�C:l��(����`[O1�|K�	�W�'k�`OV'��As�̾�s�O;��A�7{r��v�^�v��
�jsv��S����z�I�e���E����
T at G���՞������<2
xG
\���G
�Y �4�s���g��@̀�%�O�Ի�
>sG�M����'v�\�.�9d��

��
+CFdf� �
?L�������%�E����ἰ"���%9�����ix�BC�%
'�APy�8DHaV����xsg��4�W<ǽ�i����>휔�����@M�E�p}���c
+��U��|
+
bWE*�U�>�g�_�Z��:���_�

���B�`��ڷ�iLfP���KNU`3\����	�R�g���41{u����W\Q2�Ψy�5��C��s���
�C�q+}зa�9;��$1��Z{��/ |52Q
,�y
�k�}���|��=@\q�U>sL�^�&�A��X��]#�U�w�4�Ѣ�a[��dﭸ�d��4��O/wV<����� ����C� ['���*�T�
]}�-����r~����G,�xdS
��Z�ծ�=2�q����_�lJHK*	��2v�䲀�KrLa҂
+Z�1�%õ]}Rț�β[]5O��S�}������-�1�iLrHE,��Ҫ�
\|H�/�벝R����G�
�WK�@HM�m
=�+�IGF:
+�V%�
��\�1
�Q�gj`���+@�gj�~��W~/0S��&lOA����_��1���aE��7G*�l��� ��
,P ���7�50O���oz�L��ܳ�k�������\��+džT���s�_��!M]����x��,=�0p�� �.�� �������Pˍ
E�
*r����=K
�
�6i�+��P�m�Xe��-�G�N
-����qH`�A:
�����V
�
���!��k
r܎���1�Ї�� ? ~O��¢��T��妁�Eq�g�ov����Ә�0��� .f�%ް
@>mM�2g虿N�����o�:P
cԒ�)r��<�*�'fM��q�2������r�l�ޤs
͟~�1��R�
y@~��هj#����IJ=
}���y�A[c�'�D�k
+� �]���ܜ��l)�}+��(&�����o[�b��g>��<7���DЛ���ǿm
�3�rf������F[�r��q>\��b~���f�w]�
�_�;���
=�����?[���;��}*l6�,�]=���ðW����2\�_I�ߜ�'뛫��bR۞��
�(0]{�uMs�)SW�aB��!ԧ�@.H4&�4��@~z��ZoE��ټC��+Ǹf�"
+�h�pOs��Q
Ą��2RɞN�p͠�m��w-��d��󢢨�=����QH�m
�*�:�%T���u�#5���ʻ����«~���e
w�(�:���

��xY���]زo���Z�nk9����nygqi�
+v�b7�UHçkB_�-{�Q�����rR�:v�������t���⊧��Fq_��z�.��_���&D�k���Rg�sW���+��
snjW-��Ԓ����c#��e��;�R�C
+X��H��L��?�6����-���D
�V6uWC,��=Q=��?/�{��^�؜%e�Ԛ��>��	ؒc�&b����VO���
*;|G�Qugs�V��� 
3��
6�1��sIq>
&}��D�[�;f��ZG�--��-�W+_ ����_XRK,���~���5�
�w�v�#k[�]�0��K�H���"��H�F���b���rc������X�;�Xٓ}#�2 ��
�l[����쀆]�����4 
�w��r�
+����{�������
+� �ֳP�^]�fJ�[��7�T�Y
FE��X�M��M�����"�S���,9봺�辦��Q!�W��g�Zd�y�ؔs�3�Z�.~dn;�/ztdFf����ǭi|�I�:0����
���Ez�3�δ
����j��Քr�,���
z�ςZ?_
-�ejK�8
uz}
�2�M�F����U
q��%���
-���G�ȲռЊ���m	���]J ����ȡ]j
�<�����1I�#��>Exd�Dź��]@�i��}9�64˄x�q�ra��QR���<�6��R
+s/y�0@<DX8�c�u
Ŀ]���5C-
h
��U���V��ȴ����a���a��p�.�Hm�,3���2{m
_6�*x�d\w�����i��tЮ�Q�>Z��җ��֓s��D'
����QH��Hѝ���{�
�w�P�_6B-�O�{Kl�(��e1��畖�#���@ǀy$u�-��u��+�����^㷛���bH\`�y�h�y֯���
#�:���(&uWGG���̽p�w#��&�$�D�
9�
���Vpe�#��<�������A� a�KT��.m��cv扥��D�g
	r`e���}�P|�$�?\�o�bm�
+���b�
�t�߀�
�%
��0��0Hʾ�P��c�L%=�|[��oZ��~�$ǟr�W=�̐�M#��Nr��AJ�ō	D܎�����b�	_�t� :�9Ǯ�(�#�4�1�5G,�� ~aBf��B��e�����i{
b��Rs��R}��"���
+<2P�[V��'��\��$5[�����M��M8�]��T+(�	B�ys}��4�@�P��
�|fm�T○[�$�$2����H+��.�rB*ܭ`�W��&l�H��yA�ԯg�5t��"����
������
T�o�
�����fe�L�2�>��������~[F&nN�l��Yl��(�e����d�[�
�
+�#q����������_W����"
�*W���,"�5[��Q��-C�8�N���܃%>ϧ��Yz
+o�8g���{����ԑ�ȯ�B$�G=���G �

0����3~��b6g��.����_�g��;\C}_�B8��ẦZz�/}���/vW�nŤ_��s�K=���Ȩ��2n}(�����&������'\ce����nkH�)2
�w����_�<���L�_�8�$/fu�(ru�6�����,�ȡ.����
k9��X����S��Vb�����(1���
Cs�A��M�&�xGˣ�e�r��(�:\A@�HwK`Q�I�{��#�M�7���Zs����:K
��k_m
b�e¬���V�1�Y�/2�`[�관�PtF�!=���<p�$�~^���2�kv �sk5�>§)z�=K7"F�-}<Z����Y
��FX������(pً�/uR���~�+�eG��ZH�)��,�b=2\��$:�+'�N2�m�'�Yx�(n�3Pj��X�㛃���
��}���g�B�hIX�������Ɵ$�n
�6Gp䢊�%�o}����?F1����m5OV:�
Și(y�'���o,�2� ��b6%�M	�uP]���NB���k�lk<��w���=a��
+[��&�?�6���[C@\�j(��F�p���S�j���p�v5�pOI/w��c�;K��;
+�X��w���S�����;�u�\���
�0�%z���v�+ySի]�p��&l�i�En91g{�Z{����
�S�`N!ce �ng�hKj�W��Y
�K_j�x���ۜ�e�g`�[R\�$���-����jj�SF)�hUA#��Qs�9z�W͆����%�,�
y��>%��5���
�}��y�6V���@���Jq�%�`U��
(�ܓ|�ԑ|ee�ꝶ�$z������Wd����w��x�L䱥y��B�
.������$�g?H��~�
������K���!|�W�c|�t��ci���*��
_��C$��"|3�—[�3/ 
��N�Z����͞i\������"� �w���k}%w�=�:k
�t`����ֻ0���s�ԋ]�׿���ο�m'��	�8.�1M����Y!�<���
-
+ć�ơ�����wl沼2BΞ������C����-9���z�i2N�͆�'$؂��)�9���u�06���v�\CE[�k_;�kc�,�o���Ҋ�jįD'���,4Fݘvm^�y�9Q
��B�z�ȶ�����T�ԃ"��j�)�_�=�M,�V��V@��76�T��=��<�
O:�T��Eg^i�L8kiŦnN�
Vz`�W��"��)�g�W�s�R�
�<���#f�Q5��o+d��;0�@�����
�%6�o`@�
,䞹��`Y�p��mzo��ko��m
X� ��RwգŮ����
sQ�ͺ�b������ig���̭���C��aR�����>��<s�
K_�#�`գ�p


�
������f�r�̡z��p�����H?�[�:+$�7�c{o�
�5b�
���������r\��84��Zrce�QP�-�F�WfE��񾭾?����
�g�V�|��,n	�۷���%�<����[>/�jv�}���"���Y�R�R�-5��OM�wv�$T@��uJk?�G@��:�n:�y�R�&a� |I96��U��m:˥�&l��鶑�W>%�`wIķ��
M���:>���V���f&��"{h��D͇FO�ń�<�
��!C}CP�Ay�Y�m�K��
!%8K��ϑ�Ө���������
JB$��Q\����[���kc��3�������iB��
��ڋM
j�T��Y����
X�G���Mn5���x�h]��46UՐs=8G횚:��`<Rb�bsխ
��K_#��_�G�H�x|��R��s�
+L�_��tMA�V�
+���c�)iQ'W;˟mN��U
y,�ް�B� ��k^�;^ĕm͖?
�1q�O[�ؿ�|��
$60U�|W	O:021�@�t͡3��o;%�2���ѷ�ވA	����;).�𛹡��f/��k�؇��e ���j>�;Ń��_β�/�7�ݳ!��-u�������F�GM.��a�j���e|^�
�$®�� �_��jW�'v�ŭ���:�H]��|
P�>՘̅ndB2ㆶ	
��Z�k#$����5Q���OW
�ċ�P侁�Qv�Dr�_��
cA�uM�A=�t ��
-�lg_v�ʤ���56)&e��}��.��g{����}n��p?�����$<Ư"�l��7�?��$�Y � lS�
���T�
n5l
��mI�%!��W�)5�QtnP'���
#
��,l
, �M�Amk9��krk�GY�P�z
ݡ�W�7@��#�.cR��u��V
+�n/���mL�򇰟λ��y�t́	���Lƾ�F
����p
%f��;vM�}.
���ӳ�.�̡bB� s��ꛀ�ݱ!�W�OR��-��!s�a��e�_m����
���ŵ9f�\聡��ZA�q Q��b#=S�$�("r}�������tJ%ȿ�ǭ�#���������$o�#�/����zj
l
U=q��=��� }����{H/P��=�V����[w
B�Yܴ�(�XG���Q2���y>��=�NX톿��J�NS
�su��
9��Fp��&u���m�膶1��0���	��
J�U{�;� �U,񔵍Y�4�B*rف����KޒT�t�TE�i��##��S
�����i������_��C
n(|�6X�d}
+�&�8?A/��>@��wÞ/�\�
+��M��o?�M�{��yV�U)��>���[WY�rWM�}��R\�w�V�=rx��
�
�o�!��qg��	iIUi�uI~�s
��he��&
+̥D� @��Z���J,"r*D�
�w�e�)\�} ��f�\�^�k��[���!��
c��s�=O0J?8F���Ì\����"��Kd��"rd�������⋥M����i�>��<*>�=�CT<�_�)ߖ��ݣ�t�
S$a�]�'�>\
��_���Z��1�At��&�)��
���ز�Jb��������O��\�o
+�m�d�WM+
 ��k�F�x����D��jE\�
�l�^~��*����w?o��	���v5��
|ʅ�/~;�X�x�̥�/
+X�9l��s.YE�k��cH�D�|�0"S��>�ԋx�Ӌ�{Vq׮���s���ZV�y���9���$Ħ
����k9�t��\��
���h�������͓򍽐���?�h�
�,�$\��9�x��	���R~m�v��Qv��޿�HYO���D�(粒�y��S}oc��_
+~�c���d�0"�6������
��_ߧ�7��
Y��3���Yz����9�4��r{m֮�V�=�Kt����]�צ�Grz�e5��k�Rhn�<76�_vH`��C�����/]t*��1����+c5JQٝ�6f�F�����?4�A
�=C^�c>���m*�5
����w�ܿ����
�M@|אJ7�Ao�SuӸ����F���~|����^�}a��|0���oC&_[n��$f_/x~����1����A&8'Wz![��=�����~9�be�6S�ƭ	d��"}d&"�d�g+���JA�5�4����3��o���{���g�#���b���變�zqm��:��fd�S7<vNcrƩ9��ɹ� �����  �_dF�lLc�,L�J82����ջfR����{��—��/��z�("�6LH�Q��Z�l�(��
���Q���A�]%�xWC��
�n-u����h�>96��_�b�����H�c�
�QQ*��
B� `m�R+}:>;� `{U����x�@8稅�G�~�^� �?LJZ�{-�%��{w��겸2�j$�6lA�EB@�u�S�/�̳�>
�k��}�z�*R�OE*�
C�����,�>m/�N-��j�K<�KK�:�
�K/� ��Q�f�Nj
4�u���� [...]
+�.e=YR��k�J��ڎ�ޗ3j읕�7��,��F�i���g�iu���}8���T3a�>%2�6X�h��z~��|��W��!A�
�b��&��{�Y�g������×Z������o�VD�h��]���/4���in��
h�-�tWM�
��
c���]�Ǫ&��LΥ1B�9��v����+k76z���4/���
�9Y_���8*y�����Z@�Lڙ'U�(	��:rY��
0�OƎ����҇~Y�;��n�
.�6z
+�e��
����]g0���J.�@�9
T6�����[G�
cC��8�ꎊP��xN������/{�֋����
�vB� 6�"���
p@�E�%�$� ����u��Eng�M�]dS�Zu����	ȋaf�]D��
��~6�>T�
Gj�9��w��[��w?�� �v���r��*��^�7��$�P
+<�
+ qȫ"�����OܜcT5<ž�G���"�e�
+�,2����o��>�5�\5t�F�P��
�~j-}�]KIԉ�ʘS+���{*|c
�?/*����w�Ҋ�<�䓡s���m%�
���u�B'�,sN-9�]��:^��h�U��R���s�^��0��=Oa��)��.�
wvOO����~&�sگD%�����G���鱥�u
+�w�B�o�۞�\�̂�>|��Wty
+�xB�L��;R�r��`i�~� *�藓
+V���Zz��t�߷t��
�}
�f�}4ޗ&;df�&f����il��4�o��Jv͎�Uu���
(�ĵ>���6B�{�W��}2�O�U'Ȼ��Q��/jĥ�����B�O˄:d��,:q�WF	�!�]
!dIx����[���-�
�lu�nK���ՐK
��}
�h[J*6���n
c
�ͽ�/�hНyr��8�
�H�͘W�s�4е�~fcc�	\������A��8I�9
H�?�[��u=�1ő7���p�ľ�
+�L#ξ0F���ؙp�ԕrvm����<���جmGĭ�a3� ���9Y��s���Y'#�,cKBjd�RW�Z޻_I��NlMQ��

ҡ�	
��[ðx'�B�
h���;3�4��
+Zl���
�$��B�
.#�����
�䥞�<6��� ��t�_�Q�_-�ݻ:b�ġlN3 ���;jZ�����E~0���)��g���a����Z+W��ԧ���!�����ѫ����bw4`np@;`6gp�n9����PRs�[u�;��r�"� ʼ2󋮩�a&�V��;?��3.��S
��|��$���Z��h����K���s�҈��g��x��-)a�Dܜ�D��d�C�˳��"mӵ�!�o���۲>�J�+���妁}k���F��˦���
+{�(�DM�C�k-{�:���Lb
C�(�pM��`Ż�ޒ��.fc��šg���[��X`��7䔌�&P	?KP~��?��$ʺ�?[
�z&��=�^{�=�M������9�L������'eѳ�El��2�wl
�7d��|V����A@���A;s��,�h��`����
��x����o���?!SN�7�'�bs�"�$"sk���bAZ}�@y���yQ�y'��rW�]�$&yO�!� >�Y�=�����2L�Oz��޵�<2���l��u<�k�Z���Qw�b�s���h�����V���At��$�T[_yS�ɻ2��}��U��C����+��D}2FJ9�θ띡�,=Տ�⊻�͐W����i��C�>3�� j���K_
���/+t����H?4!3 N,׵�"h��~
�g=�5�Z=R\�FOս�֒krf�����'�I׿G��9�@f�
˞��b/[���
+Z��#��
+ꔄ�촡��9{�k�����3��חf�)/��ʯ���l��w5�|���\�H�M� t�(+�� !�a at ECx���
	�c�n(|!!&���/.�UE�Lܜ�,�g `4Ο����3�@$;&@��ǫ��Ϟ��6�����8:�##f���aBֶ�Y�~T7��ه��Ӕ�
-eo��gg_Yh�x�1�N>W�CJ.\ꭍ��|w�
ԇ>*wCR��%��������
,	ێ��-�3�o�Y��J�8�/�ͱM�u����0��K�r�����<�8�&B��!I�9"��"-'�R(���ҧ��?��HI�jq������ߌ�r�1�_�A�]0	������u����̀v�-{�K���_���	b깭Ѻ�k�UO4¼�������ˆ�yd/>��L >�㙧�x�����҉��s�"���
�}\���V���6�^~ԿL���Z.����wV�Ϲjj̹���^��G�Yhʹ��j<�,�c
���>��,}�(}�џ��+��j1�!
��ҽRR^`�|�!T��~%"o[��82�k}
+b�
д k���8�IZ���T�K�}��z`��۳ȏ c�ͲJ.�k��$��֪���O��K#���9ii��m�¾��Cl#̲!R�YK9�=!�q�b>�f���9b�`N%�H	hS<6�e at wM
��hj���|o�Ti�y�n���1����Z?�U��6G�b�џ��D���*��Q\��/��5���Ixzr�	^���T���rN�U�0!�ڛ��@�!
,�E�y_���(=���6�`��OUx�{�sKg�5
?嬆�vss�\�΋:�ˌ���C:2�Ԕ{s����-%�������Ӓ*�s,pv�xձ�t�_k��%
+�1Q�hu0��OY��E��U11S��;ZQޝ�f^x�04����$�4�8򃽯���@��u	9����gt��:+>�x�1M�t���5��C%���{��
=��g���@�:f�oCZ6����W�U���
ZX
 O|K:^Ɓ��5�;��|{~��
+�|h�7
�0){|��e*�Ȍ�;�L��ښ"�ԽS
rn�x)�g�l#�x� ����sz��w�
�t���
�螭�6���������A��0N~�#*��?F��[�D������~^h}8���z*dk��>I-r)��
#��Vs`�D��[p}m
�P
��9V��(��bC�=������4>��J�}/"뜔�}�$(��$*�f�(���I�R���(c}�M{8bw�]��3�}�G�"V�3�
΂?���/�S�R<#�Ѷ��{�i`
����ah��\��L]�O��ߖ�RCjV]H�A;��|���9Ư2���
�D�0���q��霆�{a���:�>;��z��'�k^�+^�!�Oy77�A���~P5@
tc3/8&9ȐFH7��]�~�bR��A
�"d��
���2�=�L���h�몠%�c#6'(�����k���5�!{f�<��t�qa^E��#ob(��w�9/$dE�ևH���zh��Ɩ�_��f�-pEG�†]#��&������� [...]
+�[��c��	l�/}5��$d�3��>
*��?W�M2�����؆Hzv��`�X�
�����U
-R�&&ڧ�`�s��9Q���~x�
�3��4�O�Mߔ��:'��]�@<�_��E�3���f>�meZ����ͲcO�����e�M�5�,���v����%.s[%$��ٗ�R\��U���bK<s�X�
��RP�ZR����A�d=+����]���x�~�����.ڒ�_�
��7
�_Y'����+�ar���V�����MTD�M
+��z��yn�����W~q���6�}�W\�%��κ8M.����c�?t�@�xg����;	3�m�.�'��fq�[���
)�̭�wEB���^��s��ԉ�~��㞥��־� $��X��~x܏RZ�~Z������J~~������0��RK�=C}��Ql�	aQ�èOg������?�wUD
�I����G:^����pG��T?��
.��YAލ��g�Q��ҿ�R$4|���%򳞆I���Თ�ޒʆ����S]����sSش3s��
Kb��Yr�i ���/������;CC�C7�3��w��{?6���UFK9��U��5�LpMU�:%e���^��QSʀ�[Ԡ�\3��W����I���5Ι�O��A���
��1��EoM������y�:�M�d]����4��I6腡����`q�w��h�G��
�q�l4����)z�o�Y�S�
+�Lt�;��`�M����:J��[�,��1C*rNS��G����;*j͡^,
+�x�,��1�F�
k��
�S�{���hYWF�����4 g�|�M�u\\�P/��0�
%�b�V���jJU����l�DE�-�!������vUt��_ts
�������[u? �f
9d�8&qq ����l���|�W�H��׾s��!-镑
+�{$��쀉
+��%���%
9rǁ��u(��[
+6ds���R��7��F.cwI �bm�|�4tY��ԠI�Y��2��~�3�p��{����^���H#�Tp��-�\��C��M�1�
���l=���޶�
z��(1��Qzc�9��F��=
�Q�֧�1k��ģeQ�Y$�Y�zƣ$���Q,
��{�
B�{�Q�e����۪
��EW�)9g{�姙�I?�"sn�X��;�Qߍ���k�~�M7��JA���.l���6|��[�ᔵ�&j����G��#���R�h%���Q�.�GU
�
!7�GF����Y\��P��(虵��N��w}�����o
qʮ}|r�br�o+]����[2R�l�%F��"��#����?����}��[��?=���
+�c[�������r������
����N�ƯNb3�)i7Lͥo��Į����P
w��ܭ���2F̩厲�
�d�P��:\�k�.�TEn�"��� 6G�弴Km���Z�gZ��6h�{

;�N�"�E�Z�˺w� K	��)��B�A+c�
��K(���+ �
,A�����E��2��Eg
smc
���d����4	)����~s���Gn�S
��Q^�{JP�6�7�9����q|�eW��
������6D��%\�a�;\�7n��?�� �-�h��1[����횄��at
�# ����	B��@�SCc�u�DM�[�K��Pr&�s�(�c��{�
�;`�����Ax�k
�� ť��T��
a羙Il��7O��3RQn%����
�����kb�
rr���_��X�
.sG
PPE)tOS=�?Y{0�:q���yb����Iׂ|�6L�6w�^�
��l���ڇ��M]U��!�C���^Q����d����m�U�s
׾�̢��
+d�e�ꉩ����|­bC}j.2��R�����[F��-l�I ���U�+7�I�.	>Q.(�҅L8�I�^Ů�����]h�|�g��7Ծ��׾�5�_9$�4��^�6�x0@�r_]$����M�*~�- �&{&��>)��
��J%q���n�=3�"�w�
�!���d����(1���𞺋3$�>De:�_Wv��KJ�_|�������ė��ǿ����� �t?��
+&+���4��(5�2���/S��_�ɱ?
bb!$]�
ﻦ�ź޺8t���@?��j�7
��<�T�@�k[�y%+�����2F�%<;�� �
,� {@촶U>�	���׽9�	z��|�ϫc�,Fŧ�qw�$g<��ಜ#�ȝYx����=�zK����?� G�
+�
%�G
�i��66��2�nO����`)s�OW�	�W�k?�Sҟ
a>��a$ߜ��>��G%�(E�qt�*�T̼{[u��2>�؉���뗶5άؖ���b��7���LI���L�#� 4k���_
޿�c�L,
��0A��Q2�
+a��-	&e�]�n���G�y�7�
���u���q���>nJ at o�M�[�-ZYl�<�G��戥!5�tl����x��I>%��`�M;^b�Z8�?���/+|��2�u���~^v��.���Ie_�|ѿm��5�r����z��
�X�{�9Z��h�1
3�6��;��l���1NJ�tW�1�^�t^����G�i�v�[��O!�Z���⬳���
Zq��4*)�f��N�$jX
�~2bc}Z0/��K̓f�����yը�m�9��9a�
�$�pu���܍���˯�w׽�
$&���t✋��b����Y�.��Up}�#���Hu�_E)�γ��� �_L���N)1�>��Z�=��ƅ�V�t<⮱^�9K/�(��Z��H��M)��0&(P���T�W+#�<� #}V��/!�ޜ"���ň7�|�J
����@���3�-;�W�
���d�>1�J>^7�0>a}�Q�	������ۆH=��F�k���k^��*�
�kC���k�]\uosM=��KJ���Ab�Kn�s�
!b�ĝE'����Xc�f����ʩ4W~��=�L\j̹i$��b^�`f��g;��I9rw��� ���n�;A%�����v��=Ynι��&��X��]Cq��
K{r����#w���44�s��� &�W~�������R�d�[�������7!=
��Q�C�OjQ��>����s�
{��_��Z���
?;�O������ʤ���n92��Q~w��z�.���
+�_Hz�_�!haP
+y�*��
){�1Pp�
��q��T����R>'�gl��u��q���%Q��I�
��H�S�-����&�ulc	��o�2����)�ck���֦���A�_'��Ȅ,�˿��&@�P)��9�7��#�h�$:)�"�i�Y�H�9|�G��u�8 s?�W.��) �8K�=��RK�-)+��*����N)�m�~d�E��=vdbb��lƎ�MX�e/�Ӳ6�bƦ��iY� u(�냚zN at F�
Jq��:r�_�N*��A��p�b��<#�lO��G�>�����niͺ�9o��մj��T����~�0IA��!E�-���wJ�9
���}��>�����}���hYp/�QmӘĀ��qϳ�
 #�G�1�IL򦜘X�#
󬚅�[C'*b}�_��l
+��ؚ�f�z�L:�]���6��ro�;��^q�%�oe�qZ��%e]J+p�8P�,�z]�.�Y�ӎ�D�!�Rb��P�ぽj&8ddcm��̵9Fɖ�U2����� �p�1�=P�%alM���#�$].jJ�%T�wK�Ɩ�{�Ԕ�Jv��䛕~j�u��c�fi����QZ���I8�p9�RBƪ��5M�w�X5n%�҈H���!/]c��Nj�����r{�
�P�k	5��0*���Wv�1˨�i��k�������{��K�5��: OV��ޮ���{�In�ʯc@��1�n)��x�'
+�9�љ���V �_���m�P�#��1����G�/����ak+�����ᥟ�7�E��*_lM
+m�L;&����k@�*��nm
��+'����$*y��Y$Џ ��Y�.�ypɯ����o��F!���)r�Gs[�Ŷ��~Bvޛ��W�=��3P�l
+��4�k�棹5��
�󮑅�.�X+S�RC7.�)g�±�5K���UXO�0
+�)�e�����	Fq��Ҝ��iH�B�k�mM!bݳ���iJ�����R�69���VY�H7�	3O��ا{���Q.�K+;'��{gP	�S��V��ֺ��[�/�0�]5�l��C�
���_�rk,�<�V��^�<jj�[C,�R`�VF ��RdBH�-t�q��l��
!U".}6LJ���d������9Fe@�D \�����IV���&ro�K?�	m���p�=5��%��mMS�7%��-�؃yc�g:����sm}�5KW񃵑�Jq�٥����*fͤ������i��Ɔ8x�����
+��!J�j�
s���g�Tv����L쾙�
+�}3
}l���LĪm.;�@����:��rNb��
���y��!�� �8��b�5��ᚫZ1�6-�lJy�-�>ìt)����?^��F!k]&�z�[�F?�ң1W�r�
1�9���+�~���k�=[h���̉p�3�2� %iCB�^� �,
���X�nm�*��kڰo�gZ볝\�����6JHX�$���d��g� �ۣ t��Z>��UQ+C&
é�cM��,�īa��5l��Wze�K�YB�[J����N9�p}��m
���˹P��^
47
���9䴚�pm�Uq�g��qq��h�ԃ�C���N��(�%�������$�
��#W�ǚ`K�
�	꽪��uE��r��p�7��$���I|�?��@�n��U�"ܚ�
�r�kN ߜ�T��Q��=�Hs/����`q�����̳O���ཀ&_�$縥l�c�>Cc��B�ZS6P-�v�v�b
d�F�`����	�5D���Ѫ�JN��(#��PtQP������㘦�{+��7&�_�/����6��-u�ch�u\�S����yX���rș
>�9
�v��i.=��0A���.2^}���
+�3��t�:���P���r
ԫ��}&.�-�p
Ϡ�	�X�]��r��Rr�r&rc�]�1#�i��wu���:*����>R��1�L��0j��u��
ا���UR+�}��K�w�*����;&*v��ҳ��l�r+-c��Õ��#[��M�k��~MmB@���5R�Zj�r/�c��o��B:B�_M.��ߙB�[F*��##�*fm��н��
J>`lh�_j��
+�o���U��P2�6��:���{a�.C�]횧�\Z&ګ�œrR�Gŀ��b����S7կ�p*����iV�}�^�:�C�ʛyk����iA���
g�
�3�
4o��a�z�8f)�^%�c���{Bfa�?|���,ٱ�Z<:&�o���
l�Mņm�8�m���p�3��+�C�
�FLےQ
�np)��[2J閌����mc
cC�
	��{C��v���pi�����%�#��ڛ�?���Ƕ��k��I�

+�1ԋ���R˘�l}�
�Ӵt
[[$�Yl��"���]�{�:��
���������0���F�T����	�b��X׎~i"~rȸ�[�V�[����
�>="գ������:a�
+V�����z���ϭ�
uj�F�3md��	n��Z��պVv���U�W��+�̂Ɇ���v̛�QFɆ�
���G.
�>�ǁ����
.	��:ͣ�V&I��	B��^m�ȭi�9���y
ڧfC�
�[O��I�3��� 
i��Í}���ivi��Bo����y>ʣ砿���YE��z2`hj
�f���
��
�!G�G!�W m�5'"�yc��C O �`��ܔ c���޺���}�+]k��NK�R���n	 X��@��H��#J� 	Npwk���|��}<��o�a�����y�+>[:!
����5S�� >����Y)�hE���x��|�Vs<�мln��t�@�w��,��EcO߬��Y
f�W��G�L*����!l†�^�c��Y��]�� ��EmCC��m�#��
�����9ʑ��i� ��,cJD�[PPr�ƚ[�
]�ՑVN9��2�k�\�eomYm�]eᧆ�Y��z�2��6��������U�Z����Hs�Є�Դa��6����S�tT!lr���@������!\Ʈ���
k�ߴ5���ùn��LC��Ds��L���|�jo�e`��i�FG-�`����5Wi:(q�ɷoW��hjښ�#�t���vm��s�hū#L��Xs*xRR�a���Z�e��L5u~]j�^�
ذ���:��8������@���nڛ�
����m���6ޢ�9�'f.[����zҢ������r|����G��59�.m}�SLK���ˌ��,vE���.l��Hsݮ���e�]<���-=&k���iׁ���{��~���pG�<��x�Њ��:�d䌋��l=��1	���"�z[i�e9��?�ѷko���qOxQ�*���@�E��>j����k������յе�&┤�dR�G
�wrZڲ�?�7t��4
Uv
*rV�(�W�4:T
+�0_�5w��,I��[C=���~�K�];��I]�
N�*F�5G ��sM�j����(��o���6*t�B.]10+�2Z���U��k�O��	��%/�ut膉�ٴ��7-��af����:h�
sK��|�#G=cw��Z6��,��MK{�k��d誏S����
v��9
掎5]=��C[[�ެi��;6٥ ��_8�U�G�V��dk��Xm�ԈY��BWt��!d���̡��V6܃��v7�J�	Es��E�ǞҰ�s�^���߫kc%��ߝR4��:$[ ���uj��ڤ���
�f�U�­�f���� @�
���~��ė�Y��iu?G��-h�`�D��݅�F��dmަ�G�;�-�s������WF�-G-~w�cpo�Ǻ���L1�.
2iA��Z�'OjYP
�g�E9%��M��WGX�%s
bz�	�3��s0�ޙ�T���
WF�����Ec-zu��w���iy�J ��1��:n�cp�٣�V����]G�ஓݽ�`�]Z:dB���7S��3t��b]����aof�ʹ
+�'�m{���}'�f���,|9^׫A�
+�$��O�
>b^"d�y
��V�gkwš��lF*k�
�Z����C�83w<ѥ�st�lM�19#�(nH
bT�A����A�^�ki�����=KG۶�
��n*u����
���&n���?�����e�(��{o�{�[f�d�ܯ��w �B>B��/
����VU��L��K7p���e�&�	4<]��Q^(d��H��Wd�M7��=���jZ�,�}�`3ꫳ���LC�EVȮ�]hu
w���nq���-c^S[0���.i�����5����
Hm󋶖�~���ְa1��ʅ�V켶	�bb����os���j�L�����=Z�v��j�T-؏B����)��u�6m흫���1!3��C��`� Z�Ђ����|l꜔��mcׯ��I
�F،�
i���̨ꊖ�M�%
+x���!f�m��\#
�JڅY���|���R����Z-WU7ԫ��&�Gt ?����]}�҈]�5S
�df�m�1k6/�j�E.Y�fnƏ*U|�L/
Q�
�~(�]�n3)�����{�J�������IG[ɬ�
[16�G�j�L���f�����嶳�v��@Z��v�;hU/N-��}�aa/tJ�[;�㵛�\��/�y�f����7c�j2x\��_3�)ۣ}�-t�[�;�.:�bsN�z�]
�?����W���ق����MGs���9���;��S�6�S�FddϚZX{Su�K&
hFE�]5ut���6G�:f�M5�&N�U�
�FD
(N�5���
����
H�h	s(���'�{�+��g��FE��a���SG�Y.U[��ߺ`�K'��-j)�Z,BE�
=�	X}�[H�Gi[�P}� ��ћc����!�֐PO�}g�
&�
����� �U1�3n��/���i��VQ}�Aȭ�qUH!ό�sm��P\#Y���
N�LV��
�T�Ի(�r�E�������K^Ob~H�+�J���4��L������?Z��3�/t�k!���Tn�2�C�����<y���7�&���4��	� G�痉:��H�[�k�TƄ�.�AD�
+�
������n��t;�1�Eyi��~0�&��*�LRK���`��$�})V��cbHĞ����I�����Pzi�u!��c��dt���Uu-)����5�nZ\���s'x�Й��Jˠ��$�M��h�-I��<���t�q8�P&N�PQ������Ve����,��$��Ę�۹)5��3`�������T�Z�4=�ݴ
�%3�xV�Mv
� ,*!M%P㻚��F�"��.Ko�j���
+�����JzJ�O�錟^�
+s�x
r9/�p�V�|��l7�8��
��p;c���t��3Zz�M#b+*F�$��S��ӭ)h�WD��_X��X�R�U��:��� 
�6#����PY�X��
hj��d�Lڻ��H�]�?��z��
��7��r4�S����ށY+�e�8�Q��xG�ϭ�
+��
@e9N�‰���Gi��Z~m⤦����1
Nv�-ml�R�-����
��E�b�.��G�D�eܛ��_��a��'7\��������E��~�_s�k���4�Ttu&;�
�N,6
����ChG1;\���,J�V\
q�-�Z��W������*�}h	�)(��.8�{=#��W/���in�Qԟ`p�N�ԡV	�,��)UsՄ�aU��MM�}��5�� uֳ�Zw?5����<�5P��jf6���?��c�47� �O_�nO�A�~������k~n�M<�����'~�Ќ[�4u�V��k0��ٜΪ
&QM����d&k1��<�QOS}�%�Q�|�ѓ�
�o�O~��4�-1 t5/�N,�yi�Ԙi�F�d�l^��awl��U�ġ�h�\���Gv�:�8}k��%b[�p"�9�D��f����_
+Ұ�e��%� ��:�ϴ�l�>�0�Kb���5a�O�Q�z��/
��6TS��c�|��	��TH�kh���e��^�!?|��w9#��j���;O���qn�����G�.=xS��
��������6��wa��of�eU��[[W�<�ΞM��1<
����ѳ�rd8��
����L�OA�K�����/İ.=xU���w��~��R?���
�
EW{�� 3ul��`
�{��k�;��)lGT5^�]�~��R���R{'*����w9���
v{�*��/��Ɠ<�˗�����/A�$�#�k�x���jB"ᱰ�_�2��u8�ڿ9�@�T��-
+U�Fa���}�B'�#�hd4O'�	�W5��b���?@ �����HJ"]����J��p��
+V�-�s
jH."w�k��
3�����2��#�D|52��Ct�G��j���9n���q{��Is���wOu��E_f���]2�U�]e�7��%D��@j�
+$��&"kW����B��NLfۏ~!p���	)�?E�ܞz�� �u�e����[_���~�
+�ط���,�H���r��<θ��iH�	�
+��x?�(6r-��p52�����T����n/��G1/}"�=~_���
��|�7��wA��~�uW@���=	����Z��������ɔ�1�!p���|����̟#S�~�O�����B���?D�1
+Ka_��$��~n�_滽���z���
�SF(���9��8���ж3�R��Ŝ��Y��x{Ъ�e�R��I9z�iq��fFv�����q)]?�~�\��0������"�;�.��~����<*����f`�}-i�
Yvc�x&��

�s
Xt�]0�wA�K���b��?���x�=�ҧ@��3�0��C���0¥�"��R�H�3������ˣ=�����A9�ɟ%�:ײ��3�p��ei��v&���'�ʟ�]z���ҫ��'��3��gT�ρ���SJ��ᔉ����,~�f�7LȚ��L�MD���M
�gV�x2�c1�\��^ �3<�u��#�/} ��zW�����:��W,��/ᇻ
�?�����!�-	j}���a�3�
�EMM�KM˱�;���	m����

}ԫ
;��v<ʯ
�
��������>��/]����͐K�ɍ��Da��2��mJ.n��B�	�%<��S�@7tO�SZ���	�B��~TZ�����˾1��n{�_���g���@�1~H�m�� ��"��0˅�=�R�F%�d��.}p`���
�l����o���B�����&��*~x�1�-5���d����Ԏ˞��_Cc�7KJE/Hx�{Ig��� #nNIJ\1�!.]zJ�P��ℼΤn����{"G�yc�zO8��&�Dr�;���{��Bb�?G���
�ͺ�U��()~X�U��S-_�L�
|��Bs�Ǥ�afE;���w��+:x��stJ�$"��Ot�/q���€z(���u��w(�w4����2�� GyF��"�Ϳ�Vh_Q�ij�p뢡�mb�&�"�}
Q��$��
)���c�[�P����*�mp��ZbN��w�g�=x������G���ǩn�A�K	�-?g�t��H�������Û%�XՉ�ӈ�a�~M [...]
+z��������t9*��v|Q۫*�̛�
��
����`�+ۚh`�N����.�Tfdw
8iu=c KH�
+�S�>!�"��2�GrAۋ��Z������>������4�HB��"��
Q� ���3JjƼ����2f���
�����
+Y-� B��-���N+���~�U ���oK.}�]���	꿙�
y
+���ɪ�����f�IGV��:� ��HK�W���M{s�S�EW(��9��g/����#jKp��
P�wS
����,����8�ǯ  6C��=��v�v��"����
#�ҵ��J9G��H�~����c�k�0$1���8��-+}W=�ͮ�3$w')��Yq%�C=S�h����բ%3��o�h���
�>&��+
Ur1���O�k_��X-S��T�/���iBR�$��A
a�
-~�%ȃ��"��D+���4����Ў/�Ƥ-*�	K*B���
�
�sTJ)sP&A
x�
^�<�ӭͭoP�(�o��Whl�
��������	����
�Ȋ�bɥ�n[Z�G�L��	�1�g�
��^�Z�ש�2� ���V_��CѾ/����t����9.��w�Ț��؟"3�~��i�%
+�v-�\|��h���ǛT��QIS嶕_ƁV
D��8�:i�$
�8
N|�x_�q�pu� $����d|�\{���K�^d��#/}���#��z4RA�
>xJJI���W��|��Y�hh��)�
z�~|����5B�{t�
����'�v���
Y�˚RI
�/G4�c�<OV�
�7 �

�/0��0��
{�#|]`0�Zf���׳'�
��OS��*� ]&�˕p�D��q�ܾD�@U�++���G��7`&�i)�
+.D�U�3�b�,�ы���eC�ҍ�Y�QK7F��k���S;âl+�s)Q܆��=l��.�4�ަ��&�^�3�����h�Fl�G[��uݪ�F�`X�Hҙ�5
�}[vj��0,vӂ+?�l�p�ˣ��&��[*��Eŝ}��v�8��iK%�Xc` �fv<��bx�7|FК���<�Q�!�I�	��
_-�ˋe
!gl���7�'T]5vYk�Y�Uh�rʍ��"I[K��]�,�P�r�U�^e��o����Op*We��=SG��Xkǎ�Q9'!�,J�E�zֶ�5=�ȳJs5
z���
�W*�����=}��.v�a��k�w�-�
Č��i��F]1��6�����gcþ�&g������\
"��HI���b��
32�Ȝַ&u�4��4�Q�.fW=�u�^��ò��Q%3s\F�vi:�MB݁��ql���
.^��U ��4��%[�z�ү�T��첺l������Iz��y��-uR?A�Aeh}	䁷Dr�
�'��M����+���Nj�m�6�n�Ȯ_
"��[��
��� �ð�1
蝑S��Ї�Ջ1π�j���R�Ʒ#(���e��k�`�5������{�/���R�C�O[�3sv���]	rj����15�<�v�߳��?����Iş(�q�džj)�]}���
+� -Q�#��8�@��=�fC]�fƺ�۟m�8u5���k�'�XЙ_v�$V���sJB����Ӯ�g
ݬ����푶�
+��i��ٰ�˖����Jޜ�5k���,���1q��$/h(�k&j��0&{I^</.�t8BA��P�\|�n��,��EN)*�5T�l$M�q �W
t��Fq�A^�nB̊ƜQc'q�T�7�ʷ������
�pÄM=��e�-v�
�sl�SM�.c-�(��3�� �j��aeL%��U��L�R1J�`�Ft������G}�KZ8֒�`��>/-��ef?
k�D/�ؘ%�`~ �e�3���]�zYQW�jA�y�
+�
mO��X��|�I�T�/�!�u5"rK�K�W`Rd���s}e���aGfD��06mw�qd'UlX��
���5k�E���YKz?wU[
�5��?!
X�E�vj�k��n��<�`b�9h��	:r{�;;�
+���%�H;�&hNA�^P����m#��b���"bI^
� �����gV�
+���2�j��죋wh,��c;�x׈��5�?
a�ׇ��K
+&xZ�O��r�ё�r�	
"�)&DM��Qc�ΪQQC�����1��:Z6M��%eїEA����q4��8�l�~u���.�LYaIK�%A{�Z̡���p�հ1\Y4�g

d����"k��;�~
�:覎U��%@����{f,���
Z0�x�3g�봒E9:r�+�����
�i��aj����+�9��7
8�5�j�o��
���3|��q8B,^��BV5��
�m�F�1���i�.f�˾��Y��R�{�
Ҥ���Ҳ��jx�|_�۩v�KKC���l։��\R!����
Jx���Z:/�zN��<
����x�/��$T�w������Q|����u��|:�ع"/�2ݙ��љ��5P�u2I��/6	v'��*�?�M�fX�[��EIn��(��K
+�|>��|�$U�=ˬ�
�c�4��u3��p�}�p�k�p��ߙ`1׌�i:jRA�^�,ٺ�L�����
zh�՜MPp�v�؄��q_Wڇ��v�D �3:P1ϔ���{*r榬&vW�K]�F/J��3�
+?-=�ၺ
���E�)p)�����!Lډ�{l��X,�7��|�������	V�1
hC��fI��`KY�qW���7�����u
�xE	��sB�&�ЂN]W�,��?�{�(C�,)0q����c+�x�H)�����e>�}��%�/;z|���o��lI���V�m��1�
+�������z
<��Y�a�
u	W��Q��t�<�����_��lʫC��
*�%,�
nH�%B�\�Qr�M4�
���x쑕 ��cSw���`LX��M}u1Gd��4vKVzl��>0@"6���N�@���#+����@�35�mk.9*f]��k���O0p;�u8��*��
��E���/Ύ<���
�=
4d_W��؄�~V��D�o�ɻV*tI�J>!��;ɰ
=6kK��:4T��ˉ���<�X����F��XK˞��7b���ʰM-"f]S
�gB�l�q�jX�����A�9�������ah��E��:jπI�>���u��vɫW��s
�[Ď�����a�K�r�<lK���3�@�FT�?R�7;��d�8ߓ�zU��y�/���0��?K��o�ʺ��N>4�GY��ꜳ	xS_��kFg\�\�6]��ѢS����N^vؾ	Uz�`2�N�*��J"�� ��X����:�n����"9��o�u��v��=sM��8�|�J,ٳP�do��}0�ܵ����
��$�|\ڸ��c����*���*
�RV�9�Pϖ��+JΧ#
�do��~�#f���X��Y��_���V�]�S=U��,�wK���;:h�Hs�-;+��Ds�íAd�^�����߯���
�*�N���e�s���)n�Ne^'Vr鉍R�*/�u��/�2^l�����5I�f\ξ
������� 
G�ZW �\�rO@/>iM}>ѕ�t�W���B���Bo���a;2D��)�ve�vu�)�1�Ƃ�,�ā��a1w����=5!kSV�"�y�lOp����6�_���}��&�.K�S��s�
�
��!��%�~�>���P#�p�%�&�=��tf&Bfz�ގ�Fޟ�
�h����P)'fL��
�s1�a�T���ס�
�c�;�UvR��f���Ol59
�⏳���RJ�\xbD$��������O]�E�~�>
#W
�2̉��O��ocu�]M�2bO	]���m*���<֡g$��EI���Puԁ�\�o�,K
+���ܧ��MqA/�N�Q��Ҡ5%�{c�(�Ċ�9�`��
�w�B8���s�|�M
,����iOO��R�#�J}6e�mUe�����L(^�������e�
TD
h�	
�l�����e�kG^
pfE�H
+f���NG��#vlGf�[ˣ6Ԑ ��k@&
ٱ��6
hIR��lS�
��t-}�J�Z
,�����є�
����u�o�d��8��|���p�[�m�C��\��o��U�q��Ӧ��h��]V����
�0E�&
�Ȍ˽� vI�a�������
�O�>�
+r�� *z�[�qOI�Y�a�6d��JJ>�
�'{K�ZA��ၧF&|U
>У�M5�[
+D�w3<���$��R��@����~83�K��q9k�O�
������?��WN.���AfA����z�Ԁ�=�}GgY*"�d���
�w�[�o/
�AS|�dwٛ-)*|YT�"��Z�U��I*}g8��]�^�RB�LO�__�ˢ��+&Z�#g[�U!�ݾ
��EDi��_	��7�/rޥ����{���,��k���kB���aD�
�#����-����)
�������03�O,�����=-:}�Ե���U)2mS���Q�2��?U�O7FX���8),��
=1o��J^�UD�w�A:wR��ʨ5���
��O'�@O6�."r�7��0���@�ۑ��kb�
@+�s	�?��I7������%1��2�Ea�G?�ͦ4���Q,��ӢR?95����q2J��[ ������dC
+��3X���P
�Ձ/����
��
��AE�ڐ�@��
Y����\}ɏ7e��G�ٶ.�?���ɑS��Y��Ӕ�}mu�� ��m���7�!��[)^�54f��w���k
_�!-����W����`�D�x'�c���>ED�k��p��I?5�d� \:љ�`A���|���×�Ș]#y`ml?g���
��(�zS
+Y�y8[���w���h��g�@�<��N�
l��C
2�>Ae.
+r?Ns���ة苙�'#��q0�N���xz`F��1�;ZT̶��w}���HK�-
.��U&y���{����H3葥t��U�� �D�e!*��ʼ=�W�~]�VT��y�&��n����\�_�k�_M̪}5){QP�iG�K�Q#"��^ۊ�wZH��q�.񆁑�hWO���|ZB�V%P�
uE�� ��b_�[�*&���VE�1�W
��&em���.Q���.���&�en��4�-"�>.�~sIK��8�Q@�*h��=鎙~MG��fk�{�5D}
��na�vԘ��!xw�'�nH*u��2��e{S�
`��W�!֦�[�` ��6�E�G����r�?�I
|���S�>�֎�MEk�
�oo�
��)
:7#R����W��ONN�
q��2�����"�J��k�7��x}�_s�*:���'Cc���(���
�㣮b�<~��x�"�
+�uU 8�97P�z��T$�߀v?�U��I��LwE�32�\��~
i����¦����-�ϭ��S�pO�w��ݓ�~��㯫i񷖥��=}u�hk���\��(��K�V �ߐ�w���
����{����i���G��b�5q����"`o�*ne�C�_ge���r�:g���z��z��
UYȮ��oxƦ�<�R�xg�'���I�oS�R��?]�)t��<�5�>�:IF�|f��hhI7��i�f��ZHؚ$���@�ߊ컯)�:2�E�w��7v��)`�?'���-vZN�
�����%q�3#�Ϯ��W̍�oN
D8���
|j���YI����#
&��̃aD̢0��;䏾��?�|�̈��;0�W�T��e	6zA��ᕾ75�<3�e�313nN��X�a"�-�m
��w��51:b]��r��
+j3`SV���ۉ֬{[*��hp��)N�����?,Ԩ�'�Rn>!,��#�~k.�j��C>8;2�
�#�6���
+��YKI�1Ń~R�f>S�3�.�*&:�ݍ���Ύ�'6v��A|̕�Ґ�#
0o%3�� 9�����{KQ�#G��27��m5$tI���r!�"T�
����-�=��KP�؟�nCR�q[Z��Ĉ�&G\�跅~��\w�S1,��wm�>�4�
�wb&��`_���'{�v�
�����V�8�ӟ9�3_-
J�
ǧ~w��m�jҖ�0�%&rST�'��Xf����Ov��o�H�f�HG��\����eLu�yY��
�����7cm���
ٯw���]MM�<�j�7��|oq�
���lw��u����l����s}�c3ej�}j�%�p�3��>����eQE�6�-�\�{NU��U"qS�I��o�2=�^Vc��� |��B���������,���Ⱦ���-��Q�
�q7���[z­#"�
+��W�f�H(\"�Y�wT8@�C��5F]5�~�T��{����"cͤ⹾�s��
�|�U~a
������3����o�L<��@S}��ۚ��������1kOFᩀXUA��~��T췙ց#+
���
+��B�
�	���h�Ӕ�
�E��1��9�ぁ�}Q��V|��02�Y�ʪ�9n�����x���%
+���͍P�-
�hA
+�2֝u ��򋙕~{����K��Q^��EM�ub�E���į�kO|fd}��hM��lϺ;�	v_��Bm��o�A.A����{3-9������Jx�hw�3%.������%�֔yk�#﹂���]
z]T
z�� C��i�䤴G˃������Р�9e~?IP��(1ῌ�2�9������k�Р�;j|�	�1�0�{��9:2�Nw�=X���V���@��e��lo.�<�Dg��R?��YOG�bo�@>��1- ��]����nP�s�œW{
+���/���
��Zuw�"�J�ʠ�x�)�E<=6bJ�
�Me��PyȖ��
�W����g����
UIO%5�� ]h�/ O���9l�\_i��{uk���$��ڋ?�5�=u��=��鏧�s^�zh_�Lgg?��ő� ^� "��s�:Z�n9[�[���hI��x�%"���˯�����Q'6l6����mYoM��S=�O�B���5%6e��tCP���	���_�{O�B��M ����
xȣ�r�KR
��$ޒ"B�͵g����l���+��JC�
��Gn[��E):���ybfe���
�烼�� ��Ǒ���%!�䈰�a��;<��e5<���ƔGc
)/
���;����q�d�%3����2aC_���d9
�
ت"7T�^[������
���|m�,�Ђ���<��͉)���oi����7����GV\���fO�I82��"�E[q����D
I����_
(��+�XV|\���v
L������-�0�v_�‚v_�>���=[�xu��.��� �giL�ki���"�z�0��fz����oJ�?'��YQRL��7�pQW�����W���M��+���=-5OGO�s1�h[K-�Q��� |g�X7��xg��U	:r
 :dm�D
7�{9�K>,����y9a����T_�SK#sC��ܐ�Bv�T�� 
�̯�^��g��/�z��^鷥��O		���𠾿-�ܧ��_�4����B��1B
+�qw����Ѧ��֨ks��Φ�۫�Է;�Ҹ��ƫ�k�F\30�|�q4u��g�3M���Y�������+��m)xQ���藷��`�ϭ5��������7C؀k\ȫ����?�U�!���AA�
n���}�W�<�ٞC��ֺ��2��'�����3�r�Yn���!D*�3w�ȴ="��0��
�:����{c�PO1)��4�*-�Yǜ�P��.2��Բuee��=�KR� ,
^�ANFEj�R�)��7�z���]�[Ѡ��]��e�75Ȕua��t{�ɖ̇s��'��2�#���$��S�j׀N=��I�3jv4��MIλ��ӝI���Șm=>k����~m���{�Q{6B�m�*���ѯ�m�NnчYIY��(��R�VN�|�3#2��#���P��@&�5��ܷ�3���ǣ]��V��PCSF��3���HM��(��t
^��4�櫳�� p@���p��2P�*Ao����6J��&v__���0NZ�ul@Ɲ���r��qlb�V�Q�
��f{��D [...]
�����4�<f�
��r��6
��Uy9����o㍬�VZ���$@�^��ߙ@>�
���Y�.fz�˼֕��cKsݾ����[�>i�K<zQ��Z �ƂVe�o�$��]�<?�|��Eş43�o-���O@��ZЙ������Af;�_��~�|�瞦*�b��s][��{d&C�l59�zx�h{�cI���C��������'}Sћ�ȗW)�
�X�\w�I��j��Xc�����׻ƚ
#�=��9���j|鱍\�>X�=�My1і|{�+�ټ����K:�v[���m"�PK�:�!b��%�
�\�MEa���"�ȆL���[�`[�N<�Tş�*Ӿ�ה~�$U�*�q��>����P����_RV��
+�<e��'b|��-mU�����Ab��EI(��V���Ya4�����%���;�I
ʂ/'vX�SXP��w�����F
�i��Uf
Y�a��l�����s����2������%��A�f
+�%��ok����=,r[U
2՛�l�?�}�����01o}�2�-�\W����#*a�gw���}e�������#c6��_��hG+����7�����/f�8:@�W$��=-%�_�q�3��XS��aj�^���&F��=
>gE�M���x6NG
�
+�M5�;�ʨ##,�Q�rd؎�	qp1�K���j��	��}
9!�n(�B���7�Ş;*d���E&ܸ��9�KZ��]��?5S�� �=ڝ�R�����D���aҗ�k��"��e!�%���K�L�?�
� q��'A��L�E���,BJ���*��g�F��,��uW����/�K�V5�)�z�����K�)�i�.r�&Z �L�2 cWdeާv*�l��~�U4����co�0��m
d}�ˉ���<3)(�
�瑁
+�6Ƣ���}��A��Q���x�
g6rg�X���<�T��w��%;L �eu��-�������r6� �� �g{�=�%q'��D)�7SK�F�p
��S,쪖��tCM�[
��m�z6\��x��ГY�b����mLjl���7R�����%~�і�'*B��Ɏ�o�(��ir̈́�4LM�z���d��cW%��%AN ��g����
�s��S�%$�`d}ZT�
+�-��{zb�B��
+�@�
��oB$��O
��-*}{�q>ED
�q��$���.qYجj�\��|���%���}��F�e�h���
�����
ͅw��82��K����$-��N�%+�^(�lk���hO��,*�:�Ѫ�GhU�\➁R�(������`��hk�MS]ܟ&f"��ʢ���37.�����C-!cST
���f�Xȥ�jt�d��D[��
6uA���5eݝ�����lg��Ds�e^����&��/�K?��S��tU��CP�uY��]@k��Q)gf"x_O����ZA��
��}
<��h��͵�
+Z��
c2v���% ������fb�E���!��DG��uE���
�5�-x;ڒ���F,ZQ�ceȈ���C+.w]\���g_�N90P
+6�t�
+�VM�Ã���}SK㙽����t��.�|v��o����5�g濗R2
��i�MyMҶ

�?��]�WE�**64��c{-fF�J
�,���
+�*�p�F�[+R��C�9�`{w���
�����v-�ܯS��
cE�� ��PW����
�!tf"���
W��Bc��8~d��.J��C�/��4���Y��%*�/'	�������Iǣd��8
�k&��0	.ee�L?���,�E96~�S�iYFm
1*�)ŇFdҪ�<`�_���O'6Bў�^i�,�0֞��p��4�]4�_
�`���-
ZU��^�m-�ebe?�֦><4V~ ��7�H;u��Td!�����3'�̋	Ɏ�j�v�K-)큥!��w'���
̺�fȨM
<a͈H��:���
��5����
+h}���F�e�Or`�dO��߸J��v5��g:�F��Eŗ9,hYZ�a�;��0�ъ0�ź������X$e��)�:��e��{X���:��"���6���=k
z�[�1��}</�~:��v�������l���gH6���=��.!c-��l
�7���U��
�2O���,K�I�V���1�:��
+�4�έ
�����#D�\@�
Yi3����]�O�.�����:��:2U�/�!��WQ�^�r��u��ۻzD™�
=���N�ج���eI�{gW�m[]��{d
+�I٦ֲ7S<xж�|`�I=��������>@
�ljj2�O54� �8T�&��_�T��	�_�L侑�s���$U!G�]�C;g���H�6p�*�ĀH81�d
ܰ:L��	˃f�	_��ț
+�����ê(��<7����6'
u2��ZK^��U�� �,�f'Y`�
��W+R��Cu��1*�+��E��M]M���bթ���.��Izi�Hx���{��yf㦱����9�_
tjg��GH��l_W
�.+�=�TF�kQq��z��>ㅾ)���D)?�Qˏ�x�����$���F�N
˽/��O&Z�.���3Ԥ�j1)���<�����ĕ
�qy����~ȇ�R��������dk�˥�;X��y6Y_�
ԊSPv��GcT؞	��.�2����i���Z�
+r���g�B��u��AB�9��w4��^��uMy���z6[�v2Ũ�s
+��M`w`]kO�I��T&���ȜyQ�{��~�N���R��

:qǎ+<��W��t���<�Aـ>J9��h� ��w^�W��
B�(xw��?�C
��C�|S�O�3��؎����
+[�Y�>Z��|:��W
[��jtF��Y�aS7��5UU�����/|cmL�ga%��tݙ��ZQ`R&{K<F[A�$���x�]g[��
2���}�'�^w����^G�6�g��kJ�ei�Ձ��;ů�f��:��J�&�A��lw��������R�=me��|h&�k	Y�*B҆�
�m��A�����ڸ��
��\���}���d-u[��ji{
kmȺoeE][�ޮ��|�����6tι��:0�J͌��QbAT��ޘt�^�~�Ɗ�5ە���X�xj�EL��榌[��}:
F%mɠ�;C�kr��5Y�ώ�&a�@+�tW��E���E'���E�#p
Q;���a��K��xCY���4�z �U������F.I�w���
t濖�]�&D���gコ�ʲtѧ��u��\gu�J��Je�K�!!� ίAxg ��I)eAx���x"� �7�2������Ⱦ���y�c\��
�Hh��{�5�7�o�5��
��LЫ=~5�mk[䕒j����<���:�i�jI�q3$��GP��'�]~�qb{
+r�/Gdl<:�K����Ӕ�}�s��n�rR!���n�W�4I���˞+1���uY/wi��k�KdnH	4��K
k�Ԑ�K��h��]�=n��ݜf�� =���Q{�
����a������<�ey�������5o�1+
�=!f��ˬ��mܝ���|��ڴ1M��.|2�]�w����N��][S�1XqHG�H�
+%��l� ^��G�����u��4IP+������m���і�9DnL�h�i�=�Y�-��#��}R\�{q��S�	��㛯���
8��
��ޔ]�rh��a�e��K���INǖ����ⓡ�9	v}�v��
~R?T��,��_�x��[��&�����A������S�2�,��m�n�*��%��Srj>�c��2j��8���(�ڻ$D�Z���[��#���<C�U���',\�G- ��as�ޣ���)u���������]�O�����d@0H��\#寍br7�H�[�䊐�ܴ��e�ul�{
qC{�ⳕW��?ܰ��iONX���r���\�1�v������� \��cU���~QP�Y`�V������
��Ɛ7�u��}���h.�+t����k�xO��x�)�$�g
+s{�=���Q��RI�g.�}���Z�Omߙ��~g~�u~�]wn`ې2�)�H���:���S��
DDIl+�u��:���E[Ӱ��Y�ͤ������ܘ��-zHC��/`ʶ���؟5|c|\���
�.���w��6Y�'�q������anX��� >��>�9�h�X��LЪ
/pW�ߑ�,/�.����Z;���M�k�c���VD�؈�����䭝y\EP��]�e�8a�
�N�3�)�[���),#��1���l�%Z�_3 �Q<���Zd~	?
�����i��?
+p*�,��td��"&,|N�t��>,gJP��WNj��)~�Y��ml�W���UQZ�F#a뻓^��.b�Q#&��J�r��_�yS��2reH���G�{&�7����>�#V$4����M�0��~ŧ���?l��9�x�gfa���5�O>�r����������J��'�(���|p�!�K]��GnO
Z��8���pyk���{�z�zr�S�ʍ�^���=���]���uk�\���X`zڞ}F���
�ٝ���ą�w�����n�L����L�{ν���t�����׵?�
�n�C�YF�I��-��W���ߚ�>��<�����{��r\��ʮ�蘠�:�
P<|�[��)��h�>�j�%�����\�
�ys�]����ng�YVq�9l�{yUw��S��/\ﻮ<��=�Ju���'dYT!Ĺ��s��'��SK������9���q{���t�$�,�W
+�5>��t�V��g���:�(�W۳�|*F��7̪���a��\@�����O��ͫ�a�@[:�v��ސ�5���@�1��J��ژ�EqߑB�rT��x�� �
A-
�|\���n��Qh�k
zӿ��O�Y�ܣJy���w����W
�
s�u]
+�
��]5�0K�D��w��x�+S���iA�����;�u�<�=��P�s��ɽ�Z�!5��UP�7�a�>��ONi�ȕ1lQHMnM�x����
S��I=
�
+ x��wlN�ڭ�`�
� '�:Z�߷�F�v61f�w��x{69�"�M��g�U�'
�؇�Cz66lf�Js�D������MЛt�$1�T� ���k!
�g_����r�E�88�S��s�
+�<��S�Wo�����oW�����3q���c�l��omO��w���=�v����,�L}7��q������U��r���Lxr�FR�/�1�sY��������>�sJ�
�k�s
yi�����m��wx����wfD������U�<�ç6�媡�oU��w��CRJeT�]�X�;�-؝!,o�7
��9�:�sM�/�,����V�r��j�'z���pe!
�;O�Z}S|�u�߼Ҏ
��>���0�{:�[bw�Py�e>nac<���1T��4�ty�pmy�tcw��Tq���툒��Α�<S� �~��/:�n?��+#J	ǯ
��pn�A9�|ns���#��4Ķ���
tS��y��[��V�"������𗅾��d��g�@-�˘=a��1����rzy�m` ���f.1��W����SV
�`��n���o�ʆ�O�d<j
pŐ��qOcnJŷ?_���
�z�. �BmyC+�Ӕ��o�s����-�
W�;ϭ��>t�����
7��W�a���B��
�k�@
+�\X��v�An��a7]
+.d}Q ���*�-�^s�RZ:��|~XN�HhI�q5�a�u˩��G
�
YGq%���Eu
$�p�����Gߣ��
+�?�6�fug�{%>9�x
�hy����I��9|�_Al �
�o��
+|�_+L��%\��p���G��l
�r}
+J�_�$�\�VDb�W��	�
�W
L
8���u�u )M~%`=� ��6$t\dP�����
�if��Ǟ�TC��+�ۿ��6~e���>O*��I��;�U�ӌjÓ�/D7~��/��	ԕ�w���&�ޙA\c��
�9�����񫠴�K��%�*P���7ݹ��~�{V�
���q[����<�:�kB̍Iލ���O����,����>��$����L�o:�t��,�K,O˿���O�.�ʹ���='
��y1
+0�2��Q-��~������s�q�D����s��;�]��
+lUJ�EG4LhXIo�>o?9�-�8�%��5�V�<�ؿH�
+,�ʣ*fW��%x��en)��=�l���7�ї7��N-H*�{���y@
+-�`�z1�m�}}�'��r�=�������Q�?�ӯ|�B�ww���^�}�N�q|g��t��>4ީ�׵_����:������y�k�T�>�������˽�Q-�#��W�&ZϮ�)�Ի@,�CF􃃻�^����'�x��~9�;�e#w�P��%d�g�\�W�{��Ը��a5�W0!�%RURKjI���9f���qzu�>�tCJ����<c~�t���\XC��^#v�E���:�oښ맮NP��[��Ar�?����D���_օA��[Kb�s��3��l�_I�ߚF^ݜ�]
j�m�P�ak���,�A�~bk�ۓY������ᾅ��v^�|Q����k�[��
u���P6��e�����o�
<�F��z*��
�7ƛ����l���q\�t�'{��g6���
���
Y��r*����J>»����3�GI�
��#�F�\/"��%z��
�(��'����;RN��{�-�s�e���
I�xP��@g�Ɖ�YN�k
+���
��Q�w��N�e���&;�����ݽ�
�����g]Tp{V� κ�	�� ��� ݣ�[�:.>c��rZ��-:gk�tsy���ê��Ә��,�8&�6��BB
̱�\�Rk3f�3���|B��R��
+Rc���
 �T�!���ΰ~�?���
)����
s�B�{�aW]��|��kRnw�ZQ���-
0Ƹ��yT�k��|h� �7
S�9Q̓��#ث[ӌ�l-�γ�s�|/���qȥ՟�HiD�=���^��]$��\l
,�w��7����c5򡚓��'�ow��03�x�YbmHb��@������Ap
Cn��;/�ԤƤ��~�0�Ӌ9q}�C�o��Z�
�Y����ș�]�cm����
��U
r
+" g��gPE
)�0�c���
���^)�vT�}��O
R*��ݗ�OK�j}�y"��3���6o�N�g���S�a��
тڬ��w�<�[�Ezt�Zg�1�߁]������
�
p7&85e��v�ڮ�5�f6W��
��;+#��[3Ԫ�Q��Y����Jظ̰���Ȩu`Lz���;~��P��}RT�O
+ϋi��IP;���!�n�e�Ӽ=Mk�e��E��am�Bθ�!�O�/l�o(�y�F�����U>׹�������\����6�]z*�RS�O. at 8�m��ʖߢ.8��ͮEA�ΒԊ�>���ӄ�루�� ��Gq7�&i��#�J�T���{��w��*���Ir�{����:��)R�{y1�#��Ԇ�Yl��;����K›�����0�Q�$�2[!�'�3	
�-�!��P7����-�D��
'�����_J�8��"�2�$����o�O�G;Ny�WcܻH,ݕ�C*fGL�������K����i�e��jb��o����[��ꄑG�+хq�����޷1�!%��3��K�H�q=
pCإ�""�7��ְ��
��`z�J8��U�*��m����p�=��=�}
�Int�ܘ��1�*��6��R�4�9��=�q�����_/�i95#���@�_��xȕYf��
�vD3؟0��ŵԶ�
S�2�vzi��/���K	�'�,��bDϧ��s��[D�,����;�o��\
k�����AD/by8
���i��U0;�2Ru`	W�:�z&{���"HY�B��w��-cЛ�#��,
r��el)ȵ�7�Y6§���z�!�#a����
$W�]��m�`ը^�.����������H����ֲ5�U�23	{ao��pƫRW�v���
q%��}�����Ԧ��\�S�# OR�{+�����E\Q��D��\r���F ߊX�����
3p���>��N��k�43k�/��&��:|rP�M��|��	��U��-�?o���?vYܠ�R�
P�s�
+�Vg@��a�D̘IHە� ;��v�"�s{�]���R�5E.�Y`6������>㜀^�^�
�E����-�{��>r@)�
@��[��_�Z.³��ؘ�\����������	�)˷� �j��
7�X����V����h���k^��EV�_�j��� �a}V���p��њ/\�u?��žF�O���.0�j>�
�p�}�q�d���y�e�z�+��4rry�iv���ji��'9� W��-'�
+8�1�ͭ1�?S
'zz��,�ie}
�xGLCn
-@
2FtMD�.��:��1�svM����/����H���E���"� �̂�a|�s�Z���	����4�6��g�r�/cv�9i:�7��U��v�"x�O�[ʇ�]
+r�*�$�E5T�/�\��
+�Tck6&�.8g0E)��?n�Q�jZsD��
+�	�!�5��e���
�c�����q��>�#C�����
U
Q���ʔ�ѵo��:.ί�4F��o)���c��x����M�D����W����El�_�Be{)�p�[�6��6���
xz��kߨ{ ��Qc�ݦ�o����{+|nT��*�_ W�.��&vo���aǷA���MA���[k|A�ʥ9��	j�\�����?o��1�`=�Y���EC�5?i��v䘢��]���y�0�����ˉ
;�ĺ��ҝ�3�!=��	{cv��OI@��ɤ��W�rlYB��N�و��ޞ���Y"ٳJ$q��tO��;Ĺ�IR�w�	����5�l_C���>�W
_l�o�6 Õye�r��V�6	h˃���%�q#R2Z@
4��T�|?�+!�K�V��4�D�x^�'�|�������Ӱ:�
+1)��.
+�;�Ԫ�y|��0�s
+��[�Ձ����A�l��/��H@��9'�E�#�+���'��䪔Y�ԉ�yJ�s�xۧ�@��@��OQʭo�
�1�@�� ��g�jW����퓱Z<��*���+�֬�a�xi5q�����Ў��_:�[~��B/���.��]��֤��k|N

7(�w��t��z�q&��뻕Mq
��=�k9h���6E
bfPŃ�/� �vjgLOm�wp�{�}am��>ww�Ѵ�<�0m�P��=�]��߻�;�l�o��]@V$A�	k�찆K��
�J9���<2o�5��Aտ9^u�ݝ#����-��r���Ԋ��%FOTN�	�co��΋ n�=���:ˍ�8�<���u1crR�^QL�#�Y���S�i>�5�p<��wwCNi�{Xẉ��A>�2&.�
hj3����;�@�_�F1�a��no>-0��0
9q��j��[���	���8�<ko]��л�*jsv
=rv�k�ם�U�p˯��/��Zp�\R�1��\�k.���f&h��)���5A,�+٘C#)��ѻ\R|�����"�*ja`~q��>l2��ExUL��
�Ua�~��8����Q@�dce�P��e����������&�g�|2^���Q�E�Y_6|���D�@��XI��vbgˆk��¡��

И萜��_�ֻ爥�%N�w���ߝ��п�9�u�e�Y�
�(�ctF�ldX7(�]z|�5�4�|K�{�Q��{U���;�������K@�c5m�s�����4;���}TF��/RZ6��%n�o<�>"І�RV��Tu���k��A��έ	t���çb�I�s�ղ2���%�Tx~}v�\Q�k�r�=]�%z�ZlX-"��@/��7�0W��{a
��5
�3K���]�(����� ���ʫ��6�t���C/�����𸙍u [...]
+h�[����	-�#��lu���3:
�`��\����������Bj
.aꗤ�}w|2J�r���N�� 7��ra�
����4�GxW�lM
����׈
y�3���W_BJ��4Y_6��5�ȏ��𤎏O�9��s�*�,ћW�IE�_���0�)l^ {�_E�)��=
�j�ݠ���U�Z#��gI�������	U%�pk�'gw���K�I�����:66i
�VC�"zLỲ��,�nl�;b�����1ǝ�q-��V8~j<��������w~��s���#V
|ș5�P��cdVD}I;����i2=o�����9By�!�,
U}�1�s;a��>�9�_�4xt��c����
��8������1q
�-i��E�ؒ�����EdAD
�����XP�kT�h�ʑ�<��k�fZOʔ�O.�_�l�{�P�'�
�X��U�[j?���y~԰+<z`ID)@{	��9������Y u`�X:�*ܿȨ�=�<�3�*��)-i
ֱ���Avd|�O- [...]
endstream
endobj
330 0 obj
<</Length 65536>>stream
+�>A���;W�F�X�z
�3!9��
+4�{�QR���9z]TAk
,�ʶG`y�#�K[c�ܐ��S��	b�㧎��:υ�҈S
�#K=�ݷ\��b����
��0���u�����yF����/f��ڝ7��-�V�
a�0t?dz2�r���Rӳ����-7�j.�=+B�~Ğ�g�zD(��<���������Jy
��l}�qu{�R�8T�1��ea5
�
����ز�_��JZCP�ˎ�$�
��9�/L-�z�6� j���*2�"6��Ԇ���N:�O�����}C�6��gD�\TL�����ؚ���~5�#a�ѝ��+!�2��A�v&D�ba��x:f��>laSCFbc�&�\�58^4�M���gm�_4wJO���/�sP)wI~
+ ��k�����&.�-%U��B��^4|�6�]���mIY�پ��
#�73�
R�@��5�U�K>}�y韅��>�
�v
`.
�<��ԇ5d�]pE1
hylks�=�)؝%�ui
����C���D'��ր�\Xd6$�
xJ'��e�ք��(��1-�4�1!�5�ev��T0G������Wr:W&1׵O۾�/���F�09��e$�|�=��
�0�F��jPOk�:&īd�B�
++x��Q��-O�Y
6�NGP
��B�
���a��V�)!5��F:,��V�. at s=@�ƍ,Ԟe�qD�����

+p��"���H��%��`�A=�;��l}Z
�e�f)��Y��98�Iآ�RD
+��(e�1�Ã�/m����$��6EDU�
�w����VH��Y�;Ӱk�ge�Y��~
VP!I��W
T3:�r.&����KO�(M���k5��r0����+w�^����x!��`PÆ��ՁE0~*z�{�V�9J+,Q�)f�껦/�m�o�".l���\���<�;,����(%�WȜ�J�1��
��&p~�1ff��+|^�|�qX���|�.Fr��$��x�
���
[�6Q �y�}�7)�d ����O��E4
�����^��`{��ڙ����
}wR�\Fzy�i�"��L
\�ʦČlB
�ؠ
W���s1��3M��D��̒ۢj��e���d�Fd�k�T�&,�%�
��>�j�0�ͪ
+zO�ƕ�����͞i�����)XNXC���ǐ*{�����(�c
۸��D���4���_
R��@�[�����2���9\��H��o[��
�W���ml�C�?X	�V6:�n@
+�	�#��d����֘Ա�q�1-�+tN�§�-JL��*1�*f�_!BU�l�� 5��#�:
& 0; g4EԌ���
K��w��g�����_�Z�x$��`�
+V���yw�ױ3I*�?���	��;�ɋ,��c@��

J�*`�,
,������
5�j���K����ɶQ���>QB�Ů��d}��w�'w� �)#�
��P[o����h�@���
�����~�Pj3F"��t;���w`��	7we}䀜���/�2�/���)rq耘
ԭI�q��[i#�q�9�~k����p�7�9�ń��L��$A
X�_�n�JG�
+�wE�h���
�RZM����9�2��[��}k����~=e"6����F�ߙ��b�O6��+X��؛�'u��}b|T�)��ִ�o n���Bn�r���{�<f�A���ȷ
+>2f����x������h�����̊x�`��pK�e�'-ߧ4\�E�{	��^Tǣ�}��N�{ře����� PA��!��`U(�YXؠ���juPNnH[�ȃe)c��DՄ���R���{A%�ee�������ǡ�GП�I�У�f`�b)dp��߀x%f�;��|b�?���Q:�Z:1f�"���W|JzsX˄���o�_�}�{T�1ئ%i�U�u����#�o�d,q@�l����N��O���q�X����C��"
���I3
�}9�`t���B�E�xǹ�Q�y��(��7p��V��������t^�.�ʃ����"v�,b�� >���J
+��.+�JbMXAi������川Ww&��)��5�y���{g���<��'맹g��/�7³���,�t�u�Y���o�'�\|�&�����k���xc��]�C�y���w���gP�w"�_�ˊ�zyi���}�q�mw���hp爚r�X���{�hu)=��SZ�K���+?�>���+�^��)���Y�nM���o���'��ql��I��*I������s��\LP�lu��>k}^s<����M�:�"�jw�T�1;Br1.��{'��"=s�|˓�J9W~���rv����	
���@?V�gX
�1A��O�\�\υ�~+��W'�|R
`O���
t�@�$��9����
+�8��g��ޗ�fU�U��3+\Ff��~�̧GM����O
�yH����'�z�E~%�4ia�V��V�8e�F����3Q	=�B��5_�>�9�=��(������W��呞k6߄t\L���
�=�
p�昑GLX�~LY$CA%��3�u��\����C*x~�Nl�_c�v�\�zpy�����3)C�~'�1� ��-3��k|Af������n/pZ�i�)���ٞ�{ş.�
��x�xbg	x.�ss�P������[�
�^�o2�fJ[P8�
4'�eu��"Z�$��N�0��%���E�I0����1	��LԞ�����{�;w�j15���{�:N��j;��_
+-JbJ��=#�;m��2i����U�
+�"�V\��J�(� 'EI��#j
jw
���Y���[#]'@\� ���sQQ
����"o����b�k��9Z�G�n�����wެO;���V�y�|�w���k ��/K������iv�{���i1�O �pMu�ߞj?��
+b�;�����>5��I�>|g�QS�P%�ig����<��_��� �U�[C2l�	[�=/�)����<�H���"��=�mٞ�4l��\�>��m�W��9v��k/ZN�􄺌�
(��.)� �_WD���-@��w�t�!�Di
)�w⺁���ޘ��\}���
����jR} ���쳾�
�`6j��|㕢����f��=+R"K�2|mLO��
<L�x��d{���>
+���
���6*m��j�6�ԭ���E������ӈ˞Y����&i!C~��p?���:&ũ$�d�}y8 �g�
��i���ᎂ��&���>�.ҿh?�6����x(
k���Q���7m'}�m��f�L�9����gI
��9�s�=��iٔ����.A�{�P��q�n����`�!m$
�Y=1����V6)��5D�������9(�����i��3��k�Z��V�`{�Y�z>��f�A���`����	�x�������Kj��E|ɞ���`�326<ed��Jr�O!��.��@=q�KXz��v|����X��=��`DFo���519�=!�#������u�i$�����XXA�JY��=[�$�gA�f�/�^��k=���J��
H����@�� �'Ap>��5�
��9|�w�\P2ZF1hdfB�E��շ�3�Bi���&
��q�׺!������,�Ub�s��g�#׻$@���1�����f���2v>/��e��9d�˘
��
���u���������U��r<�1mfa��1e��S�|��v��Aŵ\dV�{���\�]g�F)�~t�'a����7�������"�;��.�ܽ���hÉ�ihNHMm
k{�;�����S�p1��
+q}�S�ռ�䛕�-�î�s��
+͏����)#�=c�A�m
��
���������ܘQč�̸���p`L�"K��:���N�L���Ef��(�&�x��
]U�
+}���T��?uNw_	(IMA
�p/�OE��*p�#zJs\����#�uJ��]�^O�ل�ա����d��=+����e�T�ۣ���/j������/C������Æ�iHņ�gH�`
�zzW\K��- *��-��T�_IjH�Ē��GQ�{<`��
+|]��D� '
�u_J�I�13�p�q+��s�2z�JBCf��\Q��B����
^9�jc���[buEu\Ҟc�i��g� �����K�ZP�aq
�b�\�*m�>vF�G
 ^α#��ގ鑷��]�c�>ye���Z�_N�������6��a��LY��iؕ�aع��9�ă�����"�����k����͗m'�:����q���*
,�b��������BH�r*���_�ՆT�G�z�ְ=�yZ9P��W
������8 
E�����9c2�f>5��Ul�V����S�{�Ր�
��C!>���󔺸��I��V�z�a��R\���~�r��Ƀ����ѝ03 ɬ�:�f��K��8�u�Ī_V��1�#cg��
,\XCo
��
)��J|������*l���^aR#�m��s]�
'��m�
+�&�~Y/~}�Y�2���JI�3��V6��|C
<�/Rk"
+	+�����s��/���.y1���d��⸉Oڞ���t�D��I��۞�^��:�9�y�5�K%w��g��I����UY
IiX=���
���/
/n
�P>���1�
+��z!�+#U�����O�_��*y
���
)�vL' �

��-�t����}S���
+�%���W��՝�Yd��
�p�

��:�f�>XHM��BC��
�0�K
��Z~��	i�Ġ�G�A^Z�-�t�~����Z�ŵL���B�/|q���d��X���e

h�����~���Yxu��u
�`S�땡+
#����\���W���צ���^.,�ؙ}~IA���X00��<s����O;p����&�m7��~���o\��?���[{Z|Oǂ��=i
�=m�U$
�¸��0Q�6'qy�	NK@~�7c2>�1q�|�O�s��cç�qBIF��p
c
+fE�%�ٺB��̳@��X�I#��7���/��v�� ��*�%�÷�lY���z�Q-�+�
j���s�R�6���=F*���D�_�
\ڂk�)��lM�}p.�Ê@����E\���cα��q�a_'�f,b�O�h���e�Q�>�0�g#]��'6G����1�Rz1��!�7p�q#�a��N��B����_7
�K�|d�_�G�0��`��:r��*��˖�?c�@k't����s�̜��ѳ�9Z5�1?l���mwq
�
聩���"dz��ʭYtnX�ǥ�|bBOo
��5c]'6Gێ�[�V�Ufw�ں𵰜�Wq{Rz��zRmDC��Ѽoq��"~�}��4����
n�&���:fWN��>�Z��O�ڝ�\X����p�ɴ����.�Ϭ��'�|z,{�U��	��X�ՁǙUɽ�L�T�g
y-���;wC@;��c�G�}��u�`@�S����X���
+v-�Ŗg�{e�R���t�-
d��G�@�F�����_�_�h���I$�_�iy}k�W��f+���������J{r��g]3�KQP��\6�1y��5&�{f���+��
�pa5���������?D�$���pz���^	J	5�;��������&e
�
0
5�W�3>�e�W��b����~�箱�
��I����������ʎ
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�����Xݱ�C�wǏ�R�%6⣎���U^���7!Xl
󣺏���1�%�@�"��cy�W�]�|�|A>v�?�<6:V�$�T��f��9y�
���|t�Xα [...]
+�)��5��b��$4�;�-
Jiu	��Q��E�3ɇ�����3���
��~�]�����+	�5�`S:q{
+ve�U�q�0�sri�}�)"�ИR
�!9�!�`�ǵ<l���M�%�U�'�%z���I���� czjG��!�>�砢*ZsXA�	+�m~9�6�f�&����SΙ��)=�q��#
X�܌YĎ�9q��w�U1��
7�r|JR�W�/
�1JY9�C��y�
9��1�u>��a�Z6֯"7����Uɣ��KNZ�؄��KYX��_U��:Bu\K��`dz�iI37ѡQԐj�ZJc��B�
�֔�K�XzE	�

�2s�	#��U�<rlYTDŽ%-L䁍��yE��8��r�$i��|�W�F���v@��L�� �����Ӵ�޻��0i��&.!cga���c&ZW��Dd�V�VК�:
!a��8a23�B��J�@��DE
���	�
�㪃
+|�g_'�x��ST
�&
ٞ˘R�8&�;G.K�X�{�q
�0Q��*\UBCn���cT�&�
6�9O(	�������"�1�1�3bz6"�������Y�b��
�q���_	�ov5���Hj1�	
�$��4��Ԧ��
�%�����L���ANz&�W������\�V�
�{������ �A.�b:.ҿ��
���g����_�2��I��7
+�q��� �4�h	�����T��&$ebB3VwEԛ0�� ��!�+��jIh9�8�?�<:k��姆oe}
��&DĨ\B�I��w� ��_���5�v*.���ʠ�\;w���ꡪ��KlD�$b���W^����
+[�P�J� k�&=n��پ����
8$��V
%f�A,�2�2˒;	#�g
�5,�7�d�洞ٕ6�:2fZG�@m��Y
)���Б�bJ|e�b��Ť-|r�$���bN�:03�
V��qC/;i��<Z�§�@�gs!f�C���ϭMB/e
�'���')��7�"���Ó���)#�2�b:LqƊ�����!�_/��m��x�����ڒ0��26RK�Ji�hpe�y������3=x�o{�>a��bͮs˫��t<����s����2��]O?e{0��}4��.�#ք
,x&ۗ��!�1Ħ����Y"N���=;��M3cg�f
1��u���^�
D�$���l���^��@�,t�sϷ��Y�<T*��:�Ч7ͮ?������c�����_v
-�*3V#�r2i������b��M at O�ب�Rю�R�p`^=�{~��S�8�,��e�Bzj��D�w�ɶ�J6�#>a���<�[Jc 0EO��3�:\�w��5�sfw�Xҋ�N)�b�-��{�t+8�m�Ȩ�1%�"����F^U?l�l{{3���*z�g����T�� [...]
+> �(i�)S_\/��tlHBOn޳��hă�Ci���uQ-��KxA5��w��BlB�����\�=/���Aٟ��۾
ψq�n���hw�x�?A���=��gl/��\
�<�}����KHnR˧F �{����ﻮ���ⴞP�֡
+�B}�W��7K�}{_߾M,<px	#�-�&iq������5�z:6l�(d�b�>X�-6luƊ*�K�/D�i��@@��,����<��H���ޡ��O��ؘÅ�5��1��
?6��+��j߽�J�`�.d'�\�K�/���r�Af��>�������&y��>�GK�-!%</���G��B���O�����9H�����	Mۨ�I3�*m���]sN���Ӻ���ߤ��"z.&�ft�5������8�̲�7i�R ��׆�3�{�c�����GJXui
�qo��J���	[��"Ty��
��
+������l2I1#�=�cC����3�2�3��������q�Xj
,�&�E
�����ԑj��<닺���J3֧K�3�1��W�1�;3rK�L�$
���Y�K��%	c/+��#*VgBŅ�~�?�)'V(
6}�2�:��Ԭ���T��K�ZJǾ)۷N�	뙐
�c\3��	7�yF}T�l�))u	m��0�!n`!�1g}�g{���s�pk}�tkg�T^�5��	��3�|��XQҚb:z�c
��
'��

u\���!A�V�@nL�� �!
�
��� q�I8 �?���Q=�4�D�ո���T� �
�0�rv�w���R@^�+}R�
�D���j\�lsM�s���\�
��5I�
�b�l���yX���꾈*�i���6�9�l�z%y`
x���+Cl��}�n�������I�am��
հ�2&!+m
�m}}�f��"i�`bzFg��A���=0��&R��
S�0��}
u߂�Q���=
��G� ~��H�3��(�刖	��N����S���$�|Ff]�8�"�$����r� ȋ{	

1�Xp�k"���@�Y�S V��f콒l����X�o�R
\ƾ�C�_�P�6<�"���
+k�M�^�i��g�S�Z{\���6�{�@�	�imAU?'a���X�lߥ������13z�&6�`C�4�*�/��|�Y���l	�㖸�Լ�``:J��
�`s�\���y�k?�
3c	� RFRc\�ueg����
�f��%�
<K�������ӎ;/�`lmc=��K�[i
�i�*`f�$��
��j��Ք��
+_����zr#���q=��+'��,���ʡހFD���-Q%�ط����y�M!-���/��j�k��Ĥ��
)��a5�|yXM�K詭���#Ȝ����`He��k�5�,�&W��nzf�E�I�e.��o'��G�btL.�F)U�%�M7��͉���]�
�z�k�8np����v#$o?Vt�
)�WC2TATς����Yl��#w�ؙ0o
~:?(C݈�177�����lx�v:��eF4�f�
4gc�囍�M_n�i��3��ߘA��r�e�1��@/� fdL�z�	����-�s}�~����{��M�T�XO��!	��0
������@Bp�q7���t���;�k��a�
fֺ��:��y�{�r��	6����4�<>)����G�*@�%a����1��pp!#x*�uD��}�XS
c�8�����qV�I8YU1;�d}ww}����Z��qN(�8K-	jKϻ'K�lO ê��"FFa���Ƭ"V�*M���?�\�&�A [...]
+�1�r�r�T�57�E�-�qGuKbV,���aS迼����ԐA at J��Z���~
#t��䀞���$=��|����VR�"!=f�{
wִ"�Uٙ�T�f8���V
��s�3B��
��Z�<fk����h&�y��CsT?I8��A�� r�v�2]heiH�,�N�ﺧ�I>-9�o��@
�ֆW{��Q��V�k�~�*��3#Qx��lSG֏m�c$����3��
T�H��L��-����4�wx�{qT�1un̽Ü�N�3!?���R�8��(��]vb���`�ʇ���܀��#�Ʉ�i	���}����BW�O�]�Ӿ)^E�$d��nx��
%h���0����򓆶�}O�2!���?&��
����q��#U�=��qR�k��J at IJ�L�
�Ԕ��Y at qOSR6F*����0��S�[�Ð��+�N?K�A���ǏVVՎ�U�B�"?�
'�sO����;��s����VB�s^�Y�JZ�{�p����|g�A� ��RO�Vҥ؞�]�,
ZI
+����Y������F!��,
>_����)r�g�x? Z��
��
��E,����aSM}�\���
[ؕ=)�
\3�[���0--nS4��ʈ�Y�0����ˣ`
)է%��̔ܘ�Y� ��Z_��-#dB���Oڜ&?��P3��W����p���9�"�����D�p��^�0[�)��K2	H~
�Y '�
�oav�E�ߗ���󒚨�Y��ⓐ�E`~�f�0�g�Q��
|0�~� 0�_K�
�g���=ZZv�&�D
I�!��f%���|DsJ�Y1��L
�5�
[���d�q��!���(䫈y�*��g n���
����2� ��Cm#�ʩ�<&��k��)��o�Ze>7�a������18�i
-d�mB�U��D|�ګ���ؓ�o�Mʷ�#�k�Jv���p����i���W晢e�'���ȳ��oˏ���������Q��Qz
+�%�b�ٍѢ����S%g\�%g�SH
�i�Y֗��j9/���Qsf���Y�g�54e}����n�

x��ml�<�҅:�c`WD��� 
�Z?��rw��y��� �9J}��*cf
1j�`�����}EGL/R�_�,8���Z�<�
�<��=M�pORS6�q�6G�ZN��*�k��Ʃia��аKV��3��~��Sqf�{��u:0���Xł �Lj~UD+e��
+i�(��Ք4�24�ҸE�ؙ��mjE
�i�@Kuc�"d �D]�j�)�&.�m
YjA�9A�f�5L�0�J�2�̨�G��i%P���!K�:�
+���G%�h�YF��EJ�G���E&�Yk����'8��B�����3
+6�3�KO�AK)�r O�FZA�D/
+ۤ2�I@�l$�٪�1;b�`�V�y��
+:�
����
�
��A0bv!7`b�����V�)��!ya`^����9A��QS���&E4/h���v�Ȯ
+���yM�.��l�μX��iE�%6�h���gDⰝ�C|fg�H��E&� �F��+�
�����
#�F^#�rSMJ�l
�Q�"�hx�W<
�
���뚢�
rE�T]�S��<�0V��{��+�zV��jz��5y��5Bz�d�E,����\�����K/��
���Q�-�8-�;*��
�,|d������?�c�Q� ���
�Lb�5�M��;؄(�{���<\yy���0���x&��If�� ���%u{��0<E�
+O�
WzP�
OR�^ �Q�"?
+Ǹ��77Qgܣ��m��~`��a�݈^D�@]�uB�{wg{��d`u!��%Euػ�ۄ2*���5�7�-	���(h_��#G-�­��3�)6:���7Gh)���):8�*+�a�$����6����[|"�P�Z	3�B!.�f2�I���H?:��������0���׈�Q{�ˠ��ߞ@|������9�0�H�6)�D�5�VKDA#)˧.>�Ӗ_�)
5?����p�<�[����:akz�pr��YRn��>���
�c6E
�f��M"ky1����pM��CFZ�.�u�Χ
�2����̲��cWU�:�+kKo�V�4f��V&*jg�#ȿV.h�T�+�g�JEa듑0d��M� N�B/�i��~-�<l�
7��w\S����hQS}�y��' o"π&��BJ�Q��Y��� �h���1GC�<�
࿘��E�W�����
D� 0*��Q`���,�gF$�����QLG��m|�����諄��u���u�>�Yek#�{�}����j~��d8�2J8~ݓ.����6=~���*�&-l��"vy�_-&u
+aPW��e�O��ӄ�k��;�#ԇa��
5
h�Q�=�(�0�j�w�+(����QN���r7��� �ND+a {܍�AkM2!�<� ���`�oK���\c�ԨN&��j���m�StX%����Ⱥ�w{k�+㇍���� �܇��ҍ:�	���&$��f
�{�����r5+/��j�I~y2�w��{��o,��o��\P��->>�p�uv�s=f�
+�fE
dkA��Ň�L�_�,�[aL�,�&丠R����lO��W?�
u
�_�OR3�*F~P�*��l��lA.�kE�]� �/%n��A�`>�{��|���
/��(hP���
6=
[k[���� d7dt��_��>}�tbzH+�!3�
f��@���⸓��9���ꧠ�
+`��i9�R��]��:f�#&#��;�h�X��� W�t2N� ��<{�<�ea�L��	���z	ï�
��֥1je��
4p*w�"�.���
������CLr���l�
��
L��Xq������M.
�eB����C]��D����=jR(�*V�G�
,`���5��q�X�=�[:����E���aN�3�/v�����
㴭�@s�u��8�a��О�7w���
x����qFF�"�v���Q
ʣnhrk��o�_��
O��pKM�Z%%mLK�뺺��6�]�$l�C��A3�'%�<���ݚV�]��ҨQ&��$<�ur����+�C�&�<c�
��Z���N�A]��D
2A
�
+j�F�uݝ}�5Zyׯg�.��]
N����Q��5�%!�L�=ͯZ쩺�:���:D{4�^u�;€�C��N
�
��
ѲQ�]y����

��(7����k�E�����1��O�y.��Y|[zz{��;�Y~r��x7�2w�>��o�b��̼�!��	�CȢ��!jZ�$�
��mB�9ae���|O�Q�3�c�l��W�2ӂS��;p	���I�5���2c�����#�d��_�؍��b}�i�P�!�¯c΍��٘$�F�
m
]m�[# ���߄�
l�#C�hyU�i�7��ͯ�P�F
6b�#6.11�c}\_��J�6�`Р��K1�	Gu3��!����8�h�Z�d��*	a۰F�(���F�Gjkg�|��!�GM�6n�D8�I&^S
+���~e57fsb
9h`�m�i����R�V�$hn|��pPn����� +!�c��|z^�%;j�C)�5.�
∹�1l��M��;sBAbVZ
������\Z}��&�NƊX��c3��c��"�J������6	i���S‰ öǽ~s]k�\���yq��U&ٵ	YȚ��U�%Փ�ۛ�g�+�ַ��5�U���� ֣�MBV� d��\��u�������(��[@�K�E�����5�`-
3R��ƝYY}bN�
Y�$�VL�i�[S�\�ZP��b��-E���e�N�?��z�캰NL�N��g:�oOӖǰ����D�����>��p�

�dc���؃��>LI2t�/
�
�Y�&f��dH-��P�~=5wm����g���~*E[S�����K�i>�R}*Z��ksi�#��rg�o�^̝W��{
������w�����K
BF�(���WbZ��,��.8
�3�?.�ea�������1��!쭐V at v�hus�O�
B|@�r<h�
���
cgk
g���{��� ���%y�:���D-�J�p����Qs�_��9K#����0h�֔�ʣSBƧ}!s�K���чx��OpO�r<�b�[Y#Z��Ԉ�;��
Gu��
��f�J)��nA�,w��ĥAr�^q���!jo��;��ڧ��@���j*nt䌠ZD
L��am0[��Ĭ�!l�3��a`� ��3
+�
��4g'�fLS_�\s	C��!��|ra�9�$�ĥeU,����b�Kër��Y~#�
=*�#}���	���ғ��7���0���
Zi�!�,�%L�∭�auRL\
��C�4B6yuT7E
�
�YY
�4ᐈ]���~��#�ɚz����&�i�T�8�{�7v"��q�E���e3��/Ͼ�g�
����u�ʼnj�K[-�;�_�
b�[�,[#=
�E�IJJ��,��F��b0�a�u�NDڂ\�>���3'����Yp���i1֧���g
=�0��dzV|�5�(M8�{4R�G#c��w:�=�|LP#$��%	
}��n)���4��U ��ī����
+�R�׽���~���L2��
0 y����"$�
W^�}St�=BI�D��^Hv����Z�k����<TB�Rs�a
��;AKS��*+>�?��vœm
���g�G
N�"���w�'�۞����]�KBCʈ:�*�݀FB?�
x&b�]r�r�F`J&��fnN���
�*�7�`yF�h���;%�Pv�βr�~�=,��-�.��>�E��1�Zd�=�Fd��=��C����&�У��<Zǧȵ�0p��P�6̹��Bڎ��5���">9���c�����3w���~�y�{$�h�	���y
M/�:���
��~�,l`�<���JPԉ�+�	XQ�@�����u >]ELZ!�r��
+�Ꚁ�Q
6�H;��Q�\�
��f���+Դ�A��m5��'���䂰��#�lmW���B����ؚ�g�va/m

J�
�j��ƺ�]"���T�
٠��!~�� ;3f���%	C�8:�3��0�G �?f
"F��Ɩ�
�2�{27��ϵ>ӓ>�ny�F��i�9^(
����2Y�V��5����-
<
)l+>ΉeQ��a����
�����x��
\ȩ�9���y	�gR�ZkЮ�s�$$�VDX��e���No
o��9�PGx?d'�F��C��G5"��$#kc��̓�=�H�w,��-�Þ�Lr��jv��+�;�-ݚ���R�GY9�[D��g�|�������XQ�B٥�=�-wM�r�S̜�!�0��w�]҈���ׯ
U]s�.>��^p��[q>4	�m���	��ܸ�F
7V�|S�<���L�
�+n$LĬ�Ѣ� 3]�k���Ւ�FL�뀧`~vfy��Y&a���"kUa]�,�{�Զ�
-
^5�bm����{�iG���9�Vآ���E��1���~Mkw�TS�7r�6��n�Ԅ�~%%j��Ff�W
ܦ���k�d�ڬk���=[*���,�ĮI,�� {
��
>��� �g��~�\�9�H_�#�
L�B��j�<����ojh�z}�
�pqA#�t8(agU��G��ܣ!
�(f�i c�kh
[�\ç�8�����
j�W���
'���ЃF>>�qַ��ն!�lR�����
ூ.�c����n���K�VE,�H���G�C^ۜ��s	~�ӑ���*��M����ڧa�c0���
45<w���iFV�Y�G^35Oc�
+�����6�Q1[�k�V��P*ASKo�y}N�s���0s	[���M$��J�W����l�띥���lM[�*B��
7WׁǾ�;�1��YoN̊�3��KQ�
�K#3�:�V�
�\�^ʃz�#{Ђzm
w�5E��#��4"��0+�3) ����ٱ�
+c&B��P���wi߯�/:@�C�.�!:�����0��Ǝ����Y;��P5
d�$=3��s�G�E��
d��J_����
�)fٮM^
PҲ*Z�O	̯�W��r���R~�
(=
�
5s��zzAPE�
j8������T5ۣ�d�v���ECoP��1�h��]��HP[�1��1j��
��
�AX�,��%ܘ]^���L*�)�C�|ߘ��;�G������V�ӱQ~�\�h��3%��U5b`�O�O�LT\
O��<r�5��}JzvX/� ,/	�Y~𷐉��7ҋ�ȵiks��P��54>�ꟍ�M�/!S�F
.j`��T��0ԛ�\-[�Z���a���lgF"۱q�Q%/d$��8he�vzYȈ���ӽ	/j���"�}ȵC#�g������G��P�1Uq#`����6�YH�2Kx>�S$��)3�,l�`"V�{K�ӨCV0r*�fi�H����k��W'��vych��
+�{"�'cA�
=pb7�Uc�Y�4�lx�ZE��"�<h�`wf��0
���ݹ���z�ά��;��Bݲg���V�CfEݖ�G	X��@�7�2����Q�X��sv|��T���l���\];�\�x��lc�>d-7j��cȱ8�uȞ���^��@���y;�r�#b	�۫c"��q໸4t�k ���c�t�J�X7����.�y�
=32JZ����=ɇ\C�7��ˆ�O�� ���EM
+)�d[JV��$���d�M������;�
+���7Ӈ>T�J������1���x��w�;�THM/��T���o{/��ѳ�X��ه]�y�B�䂘Q@	�����rd��	�4��k�[��C��a��+�B.!�d\�ʧb#�$�:

��[�vf��:�����]�����"6Z�W�K���Y!���
����J�=+d�܋[��&Z��0#��+�Y[�b\X��4��ң�!rzT/d$�BN at G/ܚ@_�
E���1�
2a at +"�M\|PO+��!3�|wF�ݝ��x ���
+h%��B��i��+a�*b;�_�x�21#����߇
�ϑ�ل],�}N��8˥~��}��[����6'�����T�
��O��_ǭ��b&�ģ�m�U��	�
�Q*�����-�����]tA��V$!�2���D��Sm�O��
yĸSZ�;/�Eg�8��Zq�p�j	�`c�֦
+9ڴ!���LuKb����R�`b^�q�A+����AA�
;�
�^�y2S��fE�A�,C�_
���5MI�ؘ�)�� ��a��}t��;�Ն
N�ƪ
X��^3�*1[�2b�)�0>�
��H�1Qt>
��T]t8l�I�/���Ao4Ɲ"~�*�9a!G��fN�G���ua����a
>'1#���+�F
b�[��9Ry�_5��P9>5%'��"���	Só
��r3f������ ٟ��B�W�~�Dl
+��AmC�P��o�P
�U-/�S
+�gB��
b��F�9A
���1�-�8�z�L.܅Z�k�X�R.�k�#���(��/; �Q��j���G��NE�A�&��<B���n��y���a=��UV���غ+�'@O�3�eF��t����5dJvPOL�ٕ

��Cx�w�[?����9I��s�9ץ�c]:F�s{ͥ��f�-%�$����i[:��&����>����_|lk
s5d3�����c��(0Ʈ��������A��슐�S�G�{͊j��O�R2� �7ǭRQaK�r4%�m ���fv�����H�Z���g�s"��@/
�9ؠ�G��ٌ�;��SV�
�
[��aܷUR����ޣ~�֧{�>S�m�U���IVV����6�٥��MR0״��5M{=��-+5KIz0
+؉��7A'�ⵑs�&r�GGL	8H�!;�?��Hb��+>S�8u��X�[�cp�~��^dM�+be�}���Q3�D��YX�	���,����]�P�ԬWK�\���2�ˑk(�7xa�D�ֶEg��Dg�y�C6!�o��v�
jY�

���8r��-� ��
�?�]� d!7䰄��>a�nL8dջ� f㑐}������Yl��E|N
+�(�g�C�C�Aָ�:|�����>��;㖚����>b��uPd�R��@u�B����V������*9ۭ�s��D؀V@�ØGl<�[��������
v��/�F>�5N~�9AM�,lͧ ��pr�1�b���
���>%��c-2D�B+���w]�U�g:�^ySv)���cVo
z#l����W	�Ą��E�$��8}Zz�F�L_`U�g?�Z��
R)dg�Q�R悦9�����d� �̈~�~����|F>aS�,�4p+�
���	F����Ѩ�������S�D�}��hu��
+y$ӫd�Ǭ�oy
0|q@��E�5
ȵ����m�Y�r����Y
"�̾����)��v
yw��L�r��k�sB>r
:hq �7�
2pdhut�y(��3
�Њ\jj���o���&Y!]���i����
��>�\��
+�%���M9���on�
+�Z����]*	:D\���vM�y���T�(^
�x����֖>d�-��؟��y���~�s�g��`C����c~��6��m5OW�"ҦN��X9U;vZ鎍�٘ �߅L�o��
V������B7���0���(�N��D'�"
�1y%h}�	��^���/H k�Ⱦ�T���F�e�:	˧��:~��(��,B*d3\��F���"�_�T2�O��xT,`[>��6��Q�$KCOr"v71'����"N���8`�U� k��<����Y̅����ŭ�
п�A������V�+.?���R�[�'��1�<�
՞�jn@ˇ|ɮpAX
F��N3�b�p�.���P|~c�Q�+�1�L��
�u
+�	'
��էg�-�3\Sr�=�砂
+�sRvP
l���T��pt�&bu��:S�
ǧ�b��樥�-nW4�8�l��������!��7)�cD,��6r�#w�wmm;l&��u���uȘ�qw���
+ٯ��a���0N!���\߆9F��a
�u!+�
+Y�ܘ`���"fZ�OOL�iy���L��6�6��=NNy}
�sg^?P=jN����
+�&�ȞQ'r
�<b퀚۝����������,
B��g���[b
�'�EklV�j�fg��mwQ�<6'��B��4=��.l�k��%l���6�h�}lB(L
4��Q��&�+`���Y������k�`�Q�4 �Lj�˜
*>�:"!m�;L
�
��R�
\�>�>>�
\wH���+A���mx�
Z^�A���,03Q�J�}��(�g�~��U�g^���!��2CY
����Gmq�����*�Fi��!?�T��Ml��
�3���	�)�"lm��8�$=ck���3����"��CZZ�g�t{��(��c�������A�
��
ˏ@�@n��ԬB��U5�ݝ�u#�^H��D�}N�Vʈ�䰞W��o
>ףd��u\��43gi����O�9FJ
+i)Y�iZֶ���>FK����I��*/o���@��JF�I*�1���nK�~u�V��H�^���cR��=�x�qV ���!�标R�ƙ�>̬����k�Q������0Z�Ka��Ƅt������=N|���͏�G,��)�W����Ԝ���
5Sr�&bV@ϩ�e�(xrM4��Z^��hiO�ޫ)���Q��	'���� /
"z�&�� ���QQ35/bdB�QB&6�ݠY.��
�L/���n��wbfNU
<
�^�	��8ȑ͈��,
+%�8{�sV��I����o^�
�cO���5���*�D�l��

�^1%;f�$@�#�|��D�3_�
�^�q���,�d
���� /y!���4��!{
x��&I�k[%����
�X��S浂ך_��ֶ鰣�~
�r�!+�,`ħ����l�cn�^�	Co�f��Fgd�>=�<dP�ٗ�4�
�򄳶5f�m�k�E����F�
L��
����;6��qg��x|�a �P�|�)���a�FF��@�
�%A#�4�hS%$�̵mq�`8a��e�cVF����RW�o�}�+˽�ۋ��K�	F�w�����5J���Syv����bGᡨ���3KBZNY�OEM���!-�(��b��ϴ��I�!���W���IV�k�ᝢg�'���Hw6G	�6�99˃������>%�GIz腺��i�cĻ�W��[�
Z��WK�~
��
T�K<J�ݭ���!=5o{���a�ŵ�GȢq���U�
#'m�o���7�:zޮ��T�K8D�����
��T̼
`���Y�1T~~�}ɯ�QVND#e�n
!���O�;$��������F���}�Q�4j��w(P��6��p�����066bb�U�ԭ1�Y*�!��!�ĀiC��!3�2�
+����>%=�e�"��6��kc�,���
6�!�P�v�<B��)�X����B6r/*�.
�����==Yoȍ¹�L�컉�e\`��|��%��
R����Ci�Y�q�m�� ��R��28��9
+=wԴĜb�ߌdf�6̏
�Ck����!>$��ϊ�a+1S��&zq �+���%����%xɓ��G�;����\��U�
,���/ӓ���f���nc�U�ԋ���)Q�g$wy�)��ICF!ţ�W,q����	����s����䰖�Ӳː=�1gMk�Y�Y�L��u�a�#!)�<*z��`������
=U�������~���I�܇�܏�G�{�m��n[�0�.�%\��>\��]p���8��}���#����;J~u���!��o�%Թ��K�1�Ð�Q���N�
6)�����Xi+��ܓ켵A���ܙ�a�}dmv��C�o��e�g�T�X��]�ORR�ZJ��P奥��
�)j�WEJ����ꃵ~z��e�/�AZrDͯ����)�M�8���p�y�(�zXMI*���{�
��|���+]��}��a5��7I��&=�MR�7(w�Bt`J���X�8��;�/[���ᯬ�Z�G�sO��y4�T�Y�b��c#Z.rO�r/�Q�F��UlT�$�t�ʸ��E��(�45�7EK�sJ��1u�_%c��
+�k�����*�n�g��Ѕ�=(�iK}�K+���.�%�iF�{��QqJ~7���
+A�Yﯺ��O��b%l��dȨA@�O�K�����$5es�x}��o���`f{�eۣ��ZP�W�PC�{��k�)�Ø���O3s�
:
+��z
+�E,0�[+��bږ�^OMw+I���9�ü#{�Czf�G;�0��p
4�ZX��,�V�R�F�7���Yyˎ�O
��Q;�����:F�&��b���+����k

�{ں���ݘ�q��8d�_��Ԑ�6�i�^��
�u�8� ��9H�5
+����f��iN!�F
������=J�`�=�{RBZ�և�鐁�7G�.o��mO��ۚ����|cHP3��O%��5�A�nϿ����O���{n����z��J��F??k�=��)���q���n�>z�|󑪡��>�
��S�9JI�>������j7ᚫ�~��vwc����
+uB�X�o�>�a!}��Uu����
oʏ�'*o��+nl���7F%U[�*����1J�b���{⥵
⵰�]��+]Ƚ�#�T�(#
����`���+�K�-���a�,
�i�3�^�,�-��ὓ�e�=�E�n������V�&��F�M��M�H��2��(7���☥�t�̛�����_W��c:NE
r8��=�$=-b�#F>ޫ�D!�"kJq���s+N�ؖ��w+Y�[�ć����6�������G
�W6�Y�)4$�5L���&���.�~�:�l/�e�����[�E�3�?6����[�T�0��F?r)�v@)�܂�]��\T7���|V~��M���������o�'׻q�
��Gg^/@��V���6�o����7����h����;���w����(��'��Uri�"����Û�ث[�[#�]U�Wz�W=�
�Ana@)�
"�8��7{��Z��i����#D����tD*�k���i>j��|��Rq���'�<wo?=��ӂ�<�
�j�_IN��<�"b �����q����p�,:�ч��&�C��X�,�NP�5��ق��
ef"Gd�������[�o�j	=�em��n�T����^@��vc/.���_�!'o
n���2��|�8+j���e�{~�]�)kk�A}}���������3/���_�/�&��}�=��I�>�{j��tm��vr�o�e���9�J]��Z|�9mSxxT��Qq����'��U]݆�?x��E����ty�U�Μ����Yz���5&�\���y�D�[㜂��.w�Nz�p�|��;3/r�-}�]Y���觧l
�
�v�Nl���n
V\���d{[yfL���r'�ڎ^LGji�]��e'7��7�p�\��[��G�#Ԕ՞�K�		�7U'��b��1�ζ�o8_�O�Z��Ͽ�8��#���1s�z�7�1���R�`H�oX �SPkU��#F.��a{���T"b �?�Qr��V������y�/���_���m��m�S�|���f�����K�E?���bi.ٷ�E��KYn��b
����=A��҇�m�-����q�����57�_�ܚkG
Yz_q��R�O-��J-�������b'���ڨ���1q���ڒ�<�3�Q�Í>�uW?�
Õ�.ҕ�Z����%K�jV�Z��:�q#��s
�c���o͏�~������-9ji��R	a
9E�=�+�W�G�O�����
"?k8(����AN�_�ظ9"(��ă6����JLIR>b����i�~��3o���.t�_߱�
+7�O���N���Cm
R�&��Q�k at IϋA��h��M%�|��~��s|�-�����_���{��y?�ta�[_�.�I2/���!�[-U-5�=Uym�C���ߛZR���b.ڊOl�0r#&1k{����
ul�=�']S�n��??�
�S7�_���=3/p�ޑ�[Z�X��ϿŸ6��=�W/��?g����9[C���A^�|���������o5�y{g^aN����dR�u�����=�ɜ�^u�&�����[i/<8�,o�ڛ��k�p�O����|S�ҵn���QscƗ�ڴY�2�X2�̶�

�d�54W]�þ�h+?��Y~b�}�����c�ֲ*y�W��������

��		�=�+�
d&��n@�]��9i�44����X��fͽc��
�!�tK
��w�/���
+�35�����~X����az���� ��r7��*��|g�	ǫ�#����
��:_e��
�?��
��|m�t���VԡŎ��+�Gv��B�
]}G��
��lBm�u./wV��x^��DU���J/����6&,ui�D$[zUć
��S��/4�������T��/M-%^��@}��N[�%�6��0�L�����N�Ozx�_�_��-tQo���n��
���w=#��~�<3)����&�[cs�aу=�ɹ~�����Lq
2S:0'�-�MJ2?�g��)��e�ݿ
�s�Ͻ%�t�����so���^��VC����x]z��� �leH�1��\_�cexUuu+}�l}S��C�{�=����?)7�?3o�n��������-�G�4�g�
+�u�3��RQ�"i{���SIhn��nA��x�=�xV�%���v�)�#S�Tt:��W�cmɻ��%��U�Fd�^�.8��!���5m���C�)f�s�o\�ļ��J?���[�1�����䯦e��P���Ђ��YSᙿ���߱�.=<*J�t���� '��SҼ
2��M���!y��;?��R�ujj��tVߔ���6s��:��1A�gC���NH�~xCK��U��.w�

������ܘ�w�M��IQ򗽤�2V'}�xE���%]�{�z�=",}��܁>>�V��uX_����:w���xq��>h��@����[�ٍnV�l;��E��+�Q����f���#*Z�d'۞�N�|`%��Po�t�/.�ǜZ�,?�x�PӐ�W]���9�����{���U�,-e���e���E?��
|����.�����,��K~����3,H�|�:�[]c�w�'Y�V�0���v����
UAf�೴�Y{
��߁
��������%���2,J��`�/u��Zx��u����(x�Ŏ?�ko�k����b��F�i��A��UG�_�Z�T�:��,��S���}�-/#
4ێ:��E�kn�<��/�����L'��� 7����/�a/�[�G�O��{I��OJ�����<�8�C<��܄�𠶡���;f��
��5咡|B����T���
zZQ|��|�O�����w��_����mZ�򹱡�볲#����jR�Ts��W�K�>F
[�e�ۙ�'����S��� [...]
%�
�������
f~>���	A�'��φ9w?
`��l�
�7)�ʧ���I��x��y�U�fߔ�bl*�n������?M�r�� ��[|��������E�3Y����6���6�Nʭ��p��+�/��l���N�y������
J�R����	k[�O��G��"^��W��=)I������+j�a��W��3/+�/�ǟ_�ĝ3=E�$^�KgՅ?ku��:>{s������r{��|YS
)�)a59��:��0���^)z�[�;�N�bj-�������[܅�v
E�>Zʑ�t1����i*��O����s�
0�}����z�mʉ����Ô4���#�aF�
����	�p#���)I�}���^r����&d�
��|';K�n\��Մ���
��K�p�m��OK̼Ɯ�<G��>�\�+�����w�˖��}���{�?�/<������[i�m#>ܻ:c�L�oD��5��0�K�����_�)������H
5� 9��_�t��죦�G�Y^�-���ϓ�����T)����
�b
)�'i齯���W���K��W׺J�/�-<l{��k��'���<�����K�Dž:�wg�V$�v�Ͽ*9������ �̟
��|�a�[r��ҿ�4���ԉ>�$&-
`��`.FI=�'�[��hsS�>����3�sn~�9@{�
�և��������<��t2�qMC�wS�G�4�'1�2���iZ�`m귦VJ�Z��\�8��u`�.��aI�ϣ2���̌C3/H���z��-+Iے���%m��5�GGk�/
����
e�˯��%��
+�D�P���.�ۓ��Ji�?����Ϳ*?>�w�����yi��aj¥��r�J/����cs���g���̯�
e�;yY_�;���zX�~q��<�d=������
Pn����_�U\�K?��˽�K��+_
+
N�}c��3�{�Җ���q�^�Ÿ�uy?���5-N�n�-�z
��g���࿬
}S��3�\�����Y�t�2ʹ���^t�=��wk]䬘��qk���
���g{�7���>�:�{\rx�uXQ|r��W2�I�>�����;ܥ��+6`�qq�
糪k뽬�i���ګ�/`gϾ&���%�������2K60W�/�~�O
+�.�o�W�S�7�+�₽Cܬ�ZJ���7�Ӥ�ɖ�_�G�jθ���<1�N�Ǥ4u�܋���Ϸ�;ɷ�i�[�����֗�g7��s
�s
�
�
gf�`��ה
���o��^s��f��[�?�P�8�M�lD���/��nf�
~�	c;�f��������y��oBj>v
�� �s�W?�ZS�Z���}c���ʿ���K?�w���d�tU��ot���
|1.�����g��%6G)��8Iߨj�F�bZX/ m�S�

�{�-��Gũ_������Vݘ�):��7��ɫ�	����>�
Ms���7>}I��g���<VS�}|����
'go
cn�u���d�hx���5�+7�#\7�Ɯ�
���0�ޠ���/9��W~f
���
��j���5ڬ�/�3�O�r��%��������èN�
�k�k}r�R��|K�f}Q��Ғ��R��� '��o�n���)��R#]U��y�%��|;��������T[�������`���{H\��;��n�s���y��6�}m��✯�y�_rr�9[I����+Mm�뺆�Ӻ�ŸT���k��Z�D��
e�h�p7�mW<�B�B7醣���|?#s}�_��"^���}�Q|�|��MU��>���N��{j�%���ڝ���+�I7ֺ�(����c�K{ W݈[j[������y�G��[���1J�w���9��ѷ⯎W��5,a��}�]��Rq���w��F����e�Y|E�<	>(�8���7�ܰN�
�9%�)J�� ������+�8_�
�$
`�"M3��B7㾡�dߤ8�����S��N����)�GKk�~['-�
}��^^�)�
dg��fm��.��>1�^x�ؔ���K�����f�ï�K/�ƘY�}�k�'E�f^�\ꪸ0��蘾)�㫊Kx�_iJ�;�IW�S�B����to��
瞄>,��m�p [...]
����
�7��V�ԅ7Օ���pQ�F����퐷�	׷+>yT�|�شt�S�J<0Ґ��n���%%�,��>.���n���.7��p���t9+��\c���Q|
0�����*f�����R'.��l��K�1�f��L�w��n� �.vC>j��@
�^6�#Ϭ7\[
�qQ�}�pcC�������T@����]f����p����3FG{������N�3���s��w%!
9
�]t�ƀ�����W�����>ל�P[��R�J��ؚ�bOM�LF��,�BX�z�PW[
��%_�p��Ji�ϯ��=��W|��W0Q���ʚ��
-��X��x�yU΋0ۜ�h�%�K��nj�p�o:�x0������R0�^\���>R�a}��C
+�����uy��CL���<�8%k����JgY�'1`�yv[
��y̩
l^i���=e�}zJ�S����"C-#��%�K�ّW�_/{o��-�:���b�GƸ&��k�`�w
��=3��3E�q��n=�C��:]��S1�.%�S�K����2�
܊��mIѧ������v
��h�Csu�I$ޛ�b
RB��G����q���oWf����a�-a�=��}
�pk�$hc���U��񿻰�"���m@�-��>�
�z�D&�(�Y{SL�m���>DK��噚�����
���
+~
��ͅ�'S�c#&�|?.��V;o[�ʟn*{1�I�,e�\0դ>\k/�`��⑓3W�ߍ�E��*V��9۔0L9;Ό�܉��{7*��j'1m����"�/���힚�a"
�y�	d�Rw��ŮԻ���0S!��D��|gR����*�o������o�3��t ޞ���.�� Am���2f܍�>d�}��uɾ�Y�UQ�7���*X�G�'{�B��(=w�


�������*�#CǬ�T|��~�c�\���1AW�xu�	d��|�W�*��
��YC~w�[�SMCn�|���ܐ}[_�ys���KN�x2W#N�-g�_rˉ%�1J�Fo�Ǚ��[��yOև�1�#�,�g�d�7C�l
��<Ks+���{
+]/&�)w'�1l2d�g���+)���n5�R�aV	:z����fo�ˍ��W�
+D�R�
�<� <lG�L�*�Q}�����k#�32�j2��iX�=���T
�.e
�U�CFH\�,i��{fh.��4��Y�AG�����2L�j{���f苭at�S�Iq(�)�	T����t�2�r�ޝ�SH{�Q��JhQ3JVG!�}��: Wfx�	!=��%P,�󎡪ɢ�`�� �;���gݟkO�mnLy�k�'ڟ�W��ȥ���D�^�����T�șŶaJ�f?)j�ւI�1I��q��}���f���V��.|��01ŭ�T8�,�,�y}�qW΄8���qz�W�F8��|��jƄY�Q[#̌T�i����Z6��G�w�rl#��nr�Q\�p�m
��q�UEw�"���vt�k�	��0
cȨ�� ��̻

�/w|�f"d�6��()��-㎆W�n�x&1f�U�
}v������1Z
�9X�jmi�aS
�2��>Ӕ~���l��s{�):~�- ǯ�a�.���L0�
�6�G[0���ȋՅa�~M	Y;
+
��!VIɇ�n�K�,֥#C]:�.g���Y�8�*����)�h��oL�f����b3|1c��
h��k}�L��
�5��&����8�
+���U�fk:���f��
����V��![��h��R쯁lE�����CD�jxsm����{ˍ�A[�؜=
���0*�{��Q�
����g���B��
�9T�~�� P[��p�-;xw�\���}��gl*xx`�l�����dߴ�B>�G��


�5p�n%���B��^��S
��ŝ�`Ĝ�`���Ӟ9' q�o���%e�5L��W)%u�
�|
��O
/��JO�S�(.��,�K�,�
P��z�i�6�Y,	5�f��2�Ƒ1�c�b�p__ٸ7[ݶ����nQR
+�&��_�7��,�`c9�_�Jj����
�'� �K`�YE�u
��P�
g9,��Ra�(|��D�[G��
u
�>QE���͵�> R�
гpO�,�s)���<�JGq��1d��e1-��EO�o��_��,���H�:Wq
�J†�_��OKX�ć,4?���#���5?���>xօ)>>���ʹv1���H!J��"�#�ƯK�e�zě��7���nm�Q`�O�ǚ
+���7�
+��G�YK
ܴ)!.p���PC����Ms��ʷ��ӂʨ	4ᦁ�~jk��o�������
��ֶ��b�KA-�m*z��^_n�e��7b�;+s��_7:+
��y)K����v�
0�a"�N���
���9$([�~\�-rk1��*eo���7[����HƦ—3-%A�_Hr���s�����»�]%���_]#�L��^`�����+͂ԝ�z�ΰe�'�9� =��7�a{gkz�&��U9=oCN��V��<�\��$��`A6�a��e/v��q�j6�&�6W���
�8?#"F�FZk}�F/��r����`��}o���g�8��R������=z&n���l���m
}Zh+x��[�j�W[{��<=@�þ��2�|��sD�Xm�}�v��=�*�J'�� *zj
��n�bbwTT�w�^�QUī�߮K�a疻���ښJ�li��j����	h��!�~|�r;Ỗ]�D�,~<]�
77"�fZ
+��2�̵�ݛ�~��+-UXdج�ފ�m���i��-Tu���qk�wm]�}s[�}�{0���ϊ�'8��>b���������ƚ&�8$z�%��|w��m
2vo��[�C�-��R�U��ݤ�����ӂ�����_���|:��2|�.���Ӡ�'��N�z��|»?����~t��sl��6ͪ!�h;�o䍄���'�<؝!�V;����'�')��v|̑�̴�ة1'ɱ_��Ӿ
�|s����������*4p���d�2J���˝�Ѝv�L''Q.$v�w[�����ГS�#"}xw�q��~��x֛�G"
=�ܽ
+{xT��H;4��R;#�&@��*��8f�&�N�<�Z�=Y�
��nw�����eWF�g�(��^D�Ն��s���>�qt��YP���Gi)
Q
���� o���T̎����`S{E��:�Ɇ�T�ՋxKC�
)
r]΄ޙ�ß���6�USY�z��Ȩ�1�
E���|���Zd�GME�&�(��K_���oȐX0���[�,�t3)D_M�0���
cV<��f��E^,	{s���磟��
]:����QJ·K혤NN�r<ǣ���'�(/��[j����ֲ�>#��Ԓsf;J5�›SU���ce^ҩ�o��8B��:���x��9)�$0��a�n
I
zqv�*7��F?1ѥ���Bꆄ��҇��(��:�nl����m��BȽX֩v,�9+����')��F>:v��AW��ҩ��{ς�>�6�+��c����
+S�Dg.�e������
��Ҫ�d��`Wb�=:j�C͂nJ��+�$��.,M��H�:-ʍ�
��l^�S���kc��+
+N���>T�eN���
RV`7
��K.ay'��9�
�"Aᯞ�
^;�u�,��ˠ�W΃�<���Ӡ���@�!AG�����ٷ��|��Zb
B�����V���J��zT�)^q�IzN�񒨯G�=�
��-Pr�3P����AO/�E��z��&������@,~rD�����ZWy8�*�>Y�|<�ƌRֲ��I�[�’?a�)G�CCA�o߃>ݻ�{�4��ի�owo��\]8�;�:��	`ܧ@o���u<&��oͷ��/��G�Hm'nLDyՌ��h� �5 ��R3S���t$��kPf�P�� P������@����|�,�c�@wϟ��������j]����	
ůM� ��E[j
f���8*�=�G��!�'
�~=

��?�"����q	���������~
t��)�M�|ž��-��4�X��2�_-}k�b�ۡ��;0DŽ�]$����S����e�_@�^�b_<^�zt�<������ρ.������Ź�����~L%����������
��3�(����ˉiK��M=�u#|
�:2�hf�[P��ˠ'/�Bn�E<|��y���@O�\]��/���@7��%��2�.�j��W��-i�ة�ڕ|��(=MU}��*	A���R#�9	;���S��@�n��ܽ
���̉���1�\�:u�wгK�A��_~�0
��k���������8�{
񲌑�8��6w�Ô��G#�G4�󚒜���޼<�8�- &������I`-/ ���v
����Lg�7�
9?�+�D?h�@.�����'��y��1Iǂ��<r��y�E`n�\�
zt�6����DZ�Y��лJ!>d�
�Υ�8u
���dfDT�����W��ˌ;
+O�>R}$�K0������������w�u�
��ˠ��/�||z����B;*%`�U�d��o��}VWc_jk��
̐NF��
�jw���ǗW�����A
<ݽx	t	8ϧ f>�r	p���o�N�}��T�-������ZT�r/%n���d��J���h�JH���S"D�iLfƉ�W/A�]���յˠ��
�
^ ]?{t
X��K� ����9��{B��=�*�V5�`q �e���MAJ_���'{q�5�wUh̵���c�/���߻�|	z~�0�������� ����@�����>
�y��xeA•�6L�]N�]�~_
��͵�?�[�����]t�ma9�lAD����A	AA�藯@�n�N?����|\���t�� /΂"�>:�����Vv�KE+�5��Y
�cb�\:F��!^Y
y��ý���^�z<��;PR�
 ���.�|���@
� ��
+��_�AW�q?�~
t��u�Ӏ;���a�a��/M�>-�q�-�&�C]-��&EOwQ"
���Vr�uXR��@/n\��s ���?���
���g����
�a�����7n�
+�C�V��u���\�G��\�WyLt���'��+�[ښ�%� 9�C��䞄�G�
|~$��+`n�@��n��:��Ʃ��q��
߼��eқ�G�Y��İ�G3
_�
Y�AV�H5)pTL;Z-�&����I7:�Gb�2r�82�/dr�yrn��~F]����b����>��ؔW❀�sNU�m�5�%e%Z��I
k��
TQ^v1��0x at 5}��yJ���Ɩ���¥g��&%����t A�ZF�� >~��j}a�T�7Ub��X5~v�����
+���j`y7%5�vqM$Nz�υ\�H��
�y�ó@У��X�
+�u�:(1��	Rj��V���^�>�I�ޔ�
�r!�2.D�
p
+��\pܟR��T@��f>�"��Q�QW�����9�.��� |�
+}��hĻ��i�G���'��w���smįNM%�:���l�O'��3�jv
b�E[��
Ք�5�
��[E��~}��X�� Pěo�gw����u���	xv�5
+�E?ƣY譡����c
��Np��	n�ꨰ|z��i�ǏT����ۘ�KyQI'R�D
����㷁ؽ:����[��԰�c���k�$n��PæbT��l�����׏�-�[w�D��\�O���e�v�H��p��\p�%bV�yTF�YHJ�o����9������У	_���x��8-��4`���<��m˪���J�U�.]ed�/��Ը��j����X�-��J��#��ۓYa��3ΤE�����
Лώg��^J�K<��p�RPz�G>�b��j��弬+s��/��º�yЇ�v-o�W�VTU4y+�k5~������o�D��~��G%
��|���려/o�"sS��”��P�g���-9�ѱPN#[��nj� ��x
ui�7�C�24�ގ�a�;	%��Z`k
���F��D5ա3�
+zK�)qN�9NS��a�j�Nr��
+6Ģ�V�\ؒ�
���������ȩN��X�pi�W�<�ɝh�/�Օo�Qc}J��K_ɰ�h�2V�k��ʥ��j�j�̆J�X�������na�|o]����X7��W��$u���º�N�Y5|���3Q)J[j�;U
U;���
u5�3��z�
��3Y�Z���t��
�
7�D��Q���:U�٘�lkʔ�5��kk�ƅ�O�=MSm���.���	��"'��!+�*�M�Cڔ��M)-}���&���=_'�8��TĒ
��b��׳��+���dKZ����6V]p��=����mf���ז.���T��V�6W��ƚF�T}�}���;]�~x��)j�e���,�E)�+^(�(�
�TV�)fy��.qC|
��i�Z����}���ob�.J���
�w��w�,���7Hvjw̢:��	��	�T��FH�z������Fη����YIW��@u���
n`��7�C� 
��G?Uu�#�[+�t��ʼnJ�{J��gV �g�+��(��QT��>b}��g�����R��ls.xu��*��*�� )��(+��t/+�0<�<����	c���I#͢l�5|�� "Z#���>~�7���4�wL4�]M�s���U%:+��*{*��[���5���7U_]�z���k��J��s�Ĩ�|�\�K/�Z�<�|���"��F��clSxMu�N]u�E]I����!NQ[�����Y���ޙ䒷���
�5���P���d�L�^��z[îpk���j��L-�}S]�oV\cѲ�[Jr��"dM��^�b� �P|h�x&��;�z v�%>1ow�\���%o��;��M���[% X�<��e�W1ݓ"�CJJ�
c���K��
iw
ؖG�c5صA�J5�!�U�j�
���C�����"�7����L�[ǀؕ
�U�)�
�z&+�
�����n]u�MY+��k�[
+vي�*�EY&�i[c�D��S>��I��8�=����
�j�CM;����g.*�ǜP���m*>y�T�☮�Y�շ�M�t�jڻWU���Ar�ܰ�`YV��T���f:z�$`��������T�� :��|���sϊj ���C'�����Ňf:ҭ�[d�E5�#�$�ɀ ����
6OTV̫�9sr:xY΅y�����C�q�]�+؝�lݛo5��;lZ��X�i at w���dB]�|��%c��֮b at w�j[�����-��`��LԲ������:����pn� 8i�7-n�iq^yy�CV�u}
�S�}Z«fCf�l����
)��џ�r�=���.�qm�3'�;%�5�貺��-�[hR�E�
=�<	����)+cn���+�n�LM�DcA�UA��kM�O
��F
���U	4�ؒ�b���k��q-�l�pNq�i�md!�&J��$>ӥ�%mC>�
����"l��7��U
�nuk�K�Ե3�(s)H�	!v�����1�Y���T�lk�g�Ź')�n-1ǩ�&zu�r�������t�j��$����,�m�$l)�	[2\�����n�~6��y�c��}����ֈv!�2R��*����ݡa�gGh��ܼ��C�L���ݣk�tk�
jj�=��Z78ps�ySJ�PT��t��,���
+�c�̣�{Z�M�rlc�!�����Z
�g�nڞP
��`�����*�^]u�������#c7e��i��k��
��`A�
+Z�SE/��94��
Ѓ�O�aZ֮���3EElH�?��C�|L���
�Jh�3�cVX	�ܥ
��{
�R����a�k��k�T�����а�=S\��
���n���):�g̡��L�B�
+���Q�{�\�SM��������w���w�I�ѐ��`�͍Рm�k��ؙ�j��R
�����ڱ����Y�̳y
�bI��1�}fq�޴�~�\)>X��b��
�灁s���C�����w
4���؅���w�
�g���[w�/��lzj��1���0��3[ӵ>A-pL�"�He�f�fʭ@&��fo}��SJmrz��1���*��bG��
-&ũD���ؽ����!T�� :���"�kF�
+b�]�MZ���f�1v-�bo�Ws�Z+�L������qtѯ9
ϡ$�{5�
�
+�))~7Ӛ|KV
y�����fײ*��U-����m
gS������[#EAV,�5a�Sņ�w2s�;�y����C3���蔢¶����zJ5��K����QZ�u�-�F�T��
(}�
GE� x��\��2Wx8+��50?���{�`1ӥ!f�LR��T�j_Yį9q��T��T�Q�qJ�Vo��s8��9��ގK�����ip=�.g�
+��p�N5���S7�5t,�zSEB�M�cm��h���P#��jT�UVf��?o+��2j�l�M���
��o+�0�8)�&���t�=��{��gZ�_�w��}��-~
��
+��ȡ��[�QN6�ߟv
�NQ_��팽)
����"��o�
�	E&
+d���K�D���ph���qv�S/صb�M�� �Y8�c�yԮ�$���{v;Ԅ�
=>ۧ��
����
����䵁�w�Ƣg�Q\܁������7�
+��(���|V1c�K�5�Z��h�
+���ܠ��5I)�
+xc�(��k&�ϓ	K
�EA���3�f*�z
+8����}��
`�W�N���^!w��tM��}��? �������8&��>�lo����^��O���i��
��4�o�f.u��$�:�F��7P�w&yčab�S��uC���Qi)��r?��l/&lm
�!�El+�y�i6��'y���;�F�o��˷$l8X>g�5N=�؏	sk�����[c��=����
�^#����X�
��ʯ�1PK�:j��|��=]߷����U���i��]��w�N��A�����J�
q�
y�VX��Ϟ�/���ǫ�s�Y7�ڊ_ZF1Q�����wF�y�J�O=h�x�Lq(���#�1Ӡ~�u�i�_K�*���)�IV.ѥå����
6gs�}kXP����q��=2J�c�Շ
uJ��%�Kɫ�ά�V	�SA�Y�'亥��-))me
�ҏ���q
+w&�e;Z&¦���s���8��5{F.�I�qBҺi���,�xl at sМ:�hw����@)9ԣw5e!�2�M	���<d[I�۱���杪���07��n�.6y�R����܇*8��n�5Wչ
�|�� ��C�p���iI�*B�/��E{3��;��:;�����*2D�u

�60�GI[D�٤��Sm�!��|1ߣ�]r\�z?4ح�Y%��B��Վ���Y��wS<
�4�
�� �e.�Bf;��v�؝q�	�HHi��$n�wY���Ua����[v���Ց�ws�A���؍Ql��$��$��M
+�:ڭ�O�6U�v}�y~}��`
f���@#N~�ҒJ�q�/�D��\�K�FoL0��S�-{��=�������K�vՀO���~(�Я��IW匸������T�[
���BC,Lr�
�NH�ΰ��d��?� ����k���S;&&�1Ip������\��9cWO*�$�]1w��.6*~����_��?���n2�`_��Re�g�C|�;�(w��;�l�WǨ�����#����74��[hFE��
|Jf�WFJߑ���ۋ�:�XtI��+��m��3ܤ�
.�o
��畁�g��f� 
�+z��iM�/����Z
�$��\�0��y[�rde�������y }�+��s���&��7�=��ɽe�ʾi�_�%_�
��sHə�VXx~ij�z�
2z�]���hYp��
+���"�z2�X�e!�SL�KE�����QJ\jl�w��G��h����V�K>x�lŽ��g[� t
6�`����&�Ը
����-��l�b§
�c�����O
5��*A}�ꇼ��o��|����h~}�90
X?��{�=��x����&��� ֤
�UA�lN�

��ݛ��ZJ�]��r��e�	J�C�K �:vGI���	ݝ	v͵m�3�*���l���z`t��s�Qtꏩ�*/�In
�ܡ`@�/��p�{:&r[�N��1v5|`����f��
��3S�vt�H�����h�;���&E�:d�8�)�>��u*)9^�ܜjR�E����Fx

�\@��xf���s�N�?+j����56�*'�x�[�M)>iCBLߒR
-��͍o�U9�-
��+ͅ��C�X�)g��P
+,
+��X�]3
�֡�l��/VE���Y\��KL�]Kɛ�*}��ᙩ����pQ��sE��&Avt�����W�myO<SlήQ(:������
;\d�.R�.��}[�(yi� ��3�-�L���٣�����=
����oK	q.)�_� m�|w�S�䌢����ޒ�����*a�E
?��tU���Qb�TK���h���X��q����S��->[^��h��r�
�U�ʏ
��EFiD��f�J����9�X:�ɖ
r���c��v^�J�`e
�}�)�|��P3��y��__;�I�x}G��[4�
k�B�,t�ݛn�����-A�i�)v������#������g�
1���gV�r�x�b��Ћ�������=�	N9gk
�9��
�J�z䵼*�1#�AB��]���a�����ot�p
�m��X�M}�o Tx�
�]����ޥ$���������E*�p�KOG;J��Q�>�
����8��
�F�F�_��ʾh�)͵Y��rz��,^ce��P �z�� ��b��\U�e�4�:P
�9X��`��٪J��_�*�j
�_�.|6ו�ĩ�����>�7���R�U�
�2	�����m2�)�}��b� �n��w�"B�㌂�����W�qi�����~T�L7�K5���
�1׶;tl�0�m�+�蘰�iQ [...]
:iK��ZDF��#jJ�L�����u��'�j�Z.ʣ���
l�WK�t�Q��]y��¸�+]eo�K_[{`![]�w�
@>4<��~p��i=5����D'�=��iwi�x��
u��1�_�|�*���s�!��̽)��<O�-�2BJ^l-{9ېww�.��e����I��p
+nX��ߏ���!?�u��47��QU�_�0�δ¾���A,�I���>�g`�Z$�p��X�V �!��.u���<�SS���f��9�'ѧ5��3���O
c��}���������ُ���G�	�C���^T�z7�����q��^F�6]]�~s�S�n�ȑ�1�]c���ѲO�#%!?�h�~n�S|���r^n���dz�J>��"|�����'�-�����e�̍Q\�r0~=��6T����Z�,z6J�>]]��N�t�9AʯGD�o�E>���ab�Q
�k�g^2�S�˨_O�c��f�	��1bS�(X��Go�
+�
+&�5AH�(�1��T؁���M�&>��,��zd�H*�7�K}Zb��Y����u�76�3���	�܃	�BG:�qq6)6as�}��i�*��b[�W��	����!�O��:�`J�tjو�I:�`ZX��6�r������d�'�n9!y�
�j�=��Kߑ##��
+���Q�f�������.�ۼ:L�C��֠-R�I�v�ѡ�Ŭ#���j�����b����H@'A�*L�m��y�;�a�ϵNyfŵ�󕍻s��
3��F�:��tC���"d��
�w�B�ެ����Q
��8�꛹.��]�aN�Ub���L��(�0>�\��ؒ�dk��\eB�pn�6�桚�ٟ��ݖSl ��9pC��
�$�s��
��8H���+}�-%�
�r�B�Z��JGi�\m������˃��An�MZ��c^�1��>ߜ{{�:놹.���8�*3`���9��Wq�
] \@����<�4|�#�� ���	���
9��3%�l�h�>5
rh� �ȥ��ȇ������'�;ʃ:*ޚkK
هY�>M}�c�	^j���%��L~f��MFJ�f�#D+������K-��M|���k
��ٯlC�_f�r�S��̶�S��T�lSҵ���.,vSRb.
��]�kj�
�y�}.��buノ��@~^�C|�
���8���
� [...]
+N�5��17/
�r�d�̿gE5?M|����
+�8�}��׉ =�H%sk�Uh�QӽF�jG��0��$+���Ӊ�����k[����l�[��1��;�
L3	�@^Nsyf`?���Ԝ�3s-�Ow�tĎ���)��u)1�5Ʉ��l�����3��@K�M���JT�KO�
,W
x��u�zr!�˷}m�cRv
���9ѩg�m*:xG/�\
f!��B���O�A8Ƙy�B�b{�S�0���lBGMU&_��N�鯅��E�X4�S
+��7�8[
+6te�
��ۧc����_
T�E�`��1Z��2����X�%	"����s�G9e�O��:e� nO�bNOc�ؐ�RG8����Ǯf�}���T�d����C
��͸�$^^l+y��XYe�"�ϴ�=��,
+�k+Zj.}o���$>{K����f�=S��Xţ��ʹ<Xh˾�؜y�KO
���aB�����F.£d�m
#CW{��𽺒�?�9���A�^����G����7'���ЃIZ��!5���%�6H�~�/��KJ��x��:՘���ȡ��V�5�F�Q
+���������W>
����i��!��H��I~WC�ߙ��otCB��
�k��.w CF���_�/w���Fiy�Q�=F�w�`6�PI�ʼg
ş~W
r�z|ގ�V2)�:o��x��S�s���7rHN
�n*

a�?�k.���o�����D at _EY�
�Uh=#%^�&�:>��|�V�GM�Z�-~�5X��!E��ꐩ��`�}3��AE-
���Y���3I����k=�7-C/7�
+_��L��O�Ji�n�R0�:�Q�?
骈8)%G�]i�~y�%����~̳X��GU„��t�G��]�/y�;�ʹ�a���l@ߒ���Ӷ�O�l�\
!&�g�|K�S/qx��������ִ����{n
4�;E,^���ž�៫���\�
�gf�\:j���]=3JϽw0#�
Lq�
�-g��$�����Ƕ޲�=
��:����B}v��v�@S9%%�
2@ê�y����qF����qN�<Fd��P���L�8��r8��z�"��|���Z� mz �M
��J���$^2���=�X&���
Ȩ{;c\�Lc��Aܗ?%���q�e���qj䙍�Ґ�f�pu �as���d�

+
«"eyUֱ�����[[��_3UM?��B��b��O�L�[�Os� ���&Z��_�['l��ga��������<DMU�
���*F�-��Y.��%��r4l����V�vU�N�7BL~����� ��L��
;�W�Qא���
O�k�_mpes �js��e��㐐��\����l+�;�4ȁYXeGF,�>V2cOD	f�
�.�ᣪ��C�>�m��<�u�CI)���щo֕�=�K{vBI��1ǣ�Mu�W�J�y5��#��%���
��$�ԸD�$9ߥ�6G1�n����ڮ��Bs����𓄨�G�)��͊�_�c�c�L�GE��MҊ
\�G��t��)[2 at sM��
�9�_s5]

�b�'��SQ
}`���c����pN���za�
�T�;5#��  �
��߬v<v��������΂�*v�
yE����z_a�z/4
8��who��w�}s�]jZ����޶��uδMy�[�>`^�28�����e_=*B��ۢ1~M�
=Zx���zo�Vv0��
�Zt�t\��$1{�&��X`��~��"�M6C��RrɾAı�b��[2nn�d?��_/6�߶
��<Sl��q6�+>�����<e���b�{̮�C��k
�8n�H��n��?�U=@�wߓ�+�w'���5]f���7^59�.�|��E~^�
N�a��¬�s]��
	)i��tf��?��b��� 5�>J{Ք"���aT����)>ݩ�lKs�/�G_���87����G���3� ~ǧ/�@?
 ���lW�E��q�6I�덁�@��e�}��0!̽�>F/�P����'���?������
�'==��&��0�X��RE�k��D��Y�S�]c�!s-��'8�n
�B�x����]�l����1)�=%�6����N�s~̳��

��;;T�@���z&�����z+ޭ�¾��qiN%1c]����?�b���G`�{&J��1�����ySK��^��[=�� �
�`�B$"#����^��U6o߄o��B-c��]
+@L�`���6��� �8)wW'dX�P����Gsͅ��iW*��O�U�^��C��ʂY�W����]

��W�q�
�h�-��|g�-���ïY
w�(�n��9;Z�pVX�ϒ��g��M�g?��d\�mȿ�-����Rs+�G˧kB_i����
�������
�5���
^�E/�<m��e���i�5ͦ�4c�M�4�hΛ�渀���+�*wf�ƶ5"�UF��1#n;4�)?�,��$�أ���ї�=V���%A�� ��ʹh�te��<���s܀7�AC�БWD�/����u))�5I-ui��tBׁX��)}�љs�-��k
�⿇�k*z�>D˶+8��1l��6fS�
+��a-&a��Dz��]>s��7]�8W��cNP�k�/ >��8}����$f�4�b����1�����s����
��
��kK��,È��Ί׳-�/�ⲵ^Q���6B�� ��� ���@~��H� \����b�F�vi��q|�S��� �5�
+�*T�E�M��Z��s�n-����g����g(P�
9�V�p�b�`U��s!�����V�L%楊�wUJN��g?�6�=� ĞQp��m������7��۶���֜�3�)w,���f�)�F|��0*|C���7	X{&6�p�Cߟa�=�_���Is]yO
*h�]C)pH��>M��m8��@Y�r�}SCµ^ػ
�=�ЅlT+*��rK���).yW�%�L2
�@l
+D�|O��ʜ;���{pr�%��~}l��M�v�6�?	&z��,ȡ�?�% ��Q_-2r��߻��
+��
�H�� .A.L��O���V��+��d�0�m��!zo��8\���+yc�<�V��
g�}zj�C��_�)��}Y�x��e�FI�I���)+��|	+󩒝y����;���W�K�
+|��8v�#��b[����g����!!�}��2
�6e<�.	�g� �qw����f�m#�>��P7r0SY��cT؆����������]�7�����"H�k���`�V�T�
+Vz���v�����Y.s�_��H-ے`�-ø(�9u�_g�!3`�)�~a�!��Z�[&@�u������k���
51��
���
	�7���N	x>�P�7])�7�k�׏������
�f�(���6rmR������rc{���5 at NR�ӯ4
��yyLI�<��Y��6FN1���ə��)߯�
!�vT<�W�#z
ļ=>[
��nt��nSV
f�(�C�x�1kG
�	�����<�8-c��N��{ӵ����j��Mtkq����xi�CF�qɹ��#���n7&�A;4�zg��S�Ј��%�g�1Wf�Y�]Z�x8�sq����W6q�[���n�M~�B�z
T�U�@�/T��M��
#��c@��
�<��I�k����ޔ�6���G	E�m�,���1�6�=�K� C��Q!rQ�CAQ���^d��>z��"�&�ƭ�#���WG�?m��q@>�ڡߔuyO���Z��=�׋4��,�ڒRD�E
+��)�s=�0 Nz�\��4��P���ڲ
�8�匔sm�Og��Ҟ;5����~K;��x�̙z&S��$�ɤLz���Il���D��{{Ŏ�t�Ҥ)*U��IfΜs�s�r?|�y ���ޫ�ް�Z�V)���PG��c���f
+X����Y ��12biPM����&х{@�N�P?0Ѡ���D_S9���l��O��R����>T��o�#��O���2��.1+�~����Up�&����-=��/����[6�O��J��*
+�.-I^
�HZ�nK�?r��;�,��2{hf�����������.l��d볍)l6[i;fQ����޵��<���E�)�� #�����
+������`� ξo骿�%z���\�^X믺�h{�)A�)��PϿ\
%��0�x�
Y�ꜸS�
�] g�����{;���Φ
%�ˁo��/d�4[F0o��uל��d���T{��Zje��Q~�%XV��tG�*��ԇ�>5��mL��96
�;:.>�I�Y����܍9xZD�-Y���zZ��I-{�h�Lh�^jM�����JH.�^Ա��?�pi�V.k���
۹�c;���[�o_�9��ܘD�V��V���i��S�L!�.�$𼕞�;���
+j�oN��9N�o��܋�aL�
�����
)$uC��d[����{�%��J]������N���M�|��G�\��}��{�+=�8�$���8:��#=�z��ݮÕ�kȵ�Ix�J����&@�B
+r�<��VX}cG������:nĔ�
����T���X���x�ɕ
z��
_Ra����m��
���Q


P`��c�;�4@[#T��D{������((uc����6��9V������@>�舵�"�%5l[�����+ɵ

bh�g`����Q
�:8�Hې�=[j}�6ݞ
P2@�NX:���Y������)�1�u�ڗu�=����[�r���uL	+����!r����UT�{�h⽓�:��G5����{_J����1���O�瓢s
�茈�E���S���9��U2�/�a��r�6ݏ�H�q9�yg��9vw/�����|Qx���i�|dc���_~qm��Jb�������t{Z��@�0��~UҲ�
@�|Ǯ��5���?�A���Ϡ��
���
+]�k��n	��6���9��"��]f��;���S�o���A��d�&6nS�l	ʸ�az��QIX��+)����y80{�髼h�t�W^�Mw�t��=	̴%�h��
[��*�u�֘�UA�C��d]g��K��S��Ƥ�N21l �ni`�[jpJ\
�>\ƶ��Il��
+����Lf+
��&U'�y��!�:EQ-���
G��8�<���_��է�rv#�7f�e�!�������_�y�cJ\uD�F��Q�F��'��M��4
|�@ZqM6Tݮ�%2?f��b�4ؾC�w��
�|��Yطw
�ۅ=����$���
�l��=㨲^X�9���<�*4���9�DO���]z�;z9��>���= 4_X�,r�4�rJnm&�[IM�Π�[��6D�
�^�C"j{�4$��抷�d���]`����6:�װ%���C�xh{��Q���f@/��U��䰚�x�du�5��TG����?�F��
d��@��H
a�w
|񶵳w��)�k(����"��:�:z�w�T�2*�3��
WljyF,������wt���
Q
����N6=��W\
+(1%>9�R��$�w�[ZL�^Ԁ�7-��ɚ�Q
�l��c����V	������{�[�o$%��u�FE
9��}+Otd��
LĮ���t�,n�
�%Zǖ���K��
�n{�P
S�K#

���
��ʋ�!BzOk�wS�������O#�O.�sO9{j�09�
�]�02{��%�4���e&��)�ܶ	�B:R���ީ���d�VXta[�mڳv�'�����|��������'������I_��n��%�U袘�S#��T�H�=� �g
������{�B���eA�E�p�s@�&��W������P5�����:D�_@����5����lM���=��@2-T�3�Jx�������TR0�n�S~S�ϵ����W���!l��1�r+8���|;}sru��g�W%-�酿.	k���a�u��'+���-C'?���D��¸��<�0)V��#�gFA�����
]7�ڎܢٽ~w�¡��B�}��O���m
"y��˻h肤��ծ޶�RD�O����cߞ3�2�&���$�f�*�Y����4����չmb��<�c���,�k�V���
��#ލ�
/�������9p�* [N���I��� �1-�`#�JX{o�~�=֒
�M��k"r\Y�	�-�	d�[�
ؽ{��읂oy�
3��c�!�V���e �
[4f
��\d|RBE��"���%!��(�����o���?4��?�{kR�g;JǑo	)!%�62��
+��*��I"�����D
�
:}{V�HPMF%�nj���X��R[# s��]@��[���|s��g�Үcȼ�0�_o�@�c��{ �����*�M7���k8]�1hՎ�
�c2�S�$�X�
o�
+�G-����ᷔ�>�׾�-4��ژ���w7]�
5�Xo�㟩��ar } �ʰ�C�7g�jLS�<8�
τ�ĝ;f.����ڷq�)d�w
+�odIT��	��髃��*Z��b�`���JR���=���ْ�5��v���T\4tf���?:1�}uZJH;�
m|a=�g��ꡖŤ"ܮ_sh��ڳ6���B���}���B�F5��C��R����y؂?�
֑���X�T���#s��׿̒ˮ�ưi�A���켁���
����s���D+:/gV]gV�:����2�
4�
�Q�j�rxaX�ې5=�-|W���Y� v
����OZ�XlI�6��ᷭpP{h ޟ.��G���-�k�Y�@|�Y"��Q�ޱ�$�$1����@�-ߜ�
G�9=Mʽ��y�R��?E�_��;'�/l ���
G6L뱓�q �vЀ��w�ߞ��������lBHɂƵ,rL��ݒB�BS�ܨQ!��\�f�\�n/�͡�]��d���Ed䄒�qx�[AH��R��γ+�F�®�eAW����u
�&�۞�Ï[���Qd����E��cze��r��↴z^|�>Rse[	���wT�ߝ~s��?:+2W���P"��@�
*����
V�9͗S
Oه�/�&>���󰅱'�8h��;f	9
����P at JVX�#��U�HbvU�Lj�uQ��D��%\�e��2��v�|Jd�R���
��>[�o��"��}Y
�>J�9����gӸ�;�9x��W����g����D�혼�Ց�־c���wm9���4�&l1ӈ���=y�b�

R�;|���q^�fuʩ�޶�=-�nk���g��O���[ [...]
+~�
o|�
�}�³FN�Ϸ�qO7���j���PK�
�[�$�Ց
�֒Z�dĖ�d�+
����.�&��1�;jd�m�����V ��q��M�B��y�
�<1�ͯRJ���Qt�g����WxZI�:	����g�Oò~_7ߗ`
/�=8���`c�:�a`�9��p��͙��aE���B�Ø�\�
o�W�qs�~d�Ï
Xؑ���El�"@czXND��棃�:0�x��Ρ�����}�2<z�
���ee�Y��vM�K'(�t�e�
��b��|�e@?e�iP@�Wx'���
ȴc'� b�
��C;�qρk�9��p�.|�J���x��)�	L������I�����)	oY�^�I@��4��==�Aŭ�l�G��*I�Q��5����[���d���2�%�m�(���C[_$�G�lz|�C�h1R!�
:�
(�剾G�~i\��?��\�o"Ee}?~q��������{ZS��A��8������P���K4H��@�Y-�D?^-�6�ŕ9'Z��zj���:�n-s�0`�cv#h �:JK��e��/�m���T܌�	
�	
�O7K��&��AF
����
V�h፹�,]oCnH�����"�~s����X��0��z�-��x�O[Rr��4&���]p�=u[�Ή+������L�u�f_q52K���uq��
���rǮ�E�8ĠF��
+����쳫������_���(�tCO)��ɭ8���]���2�^��N;����}%�X�GRsk����8>�G�H�M��:�jH)}y턌�q��u�b�,�������v�5>�u��>UwGOm�x��rgu�_��@���{:LI\�*�OC_�
�nk�Z��!��Nc
+��3��G�}��x�D���2�8����O*
|���Zi��
��2w�p
;L�_���ﭥ���Y\}3�H|�!

)QE�馇��ϻ�Ȓ#��>
+%1_;�a����!}KM�M�}x��/Z�������;ZL����UK����O��7��ax��|{�t�釉�
_���u�����d������|�FC����=���5��	^�6��p�Zr�s�t(Q�fŴ�ƛ��-/��"�L�
�����ŗ�!�AT�u\ѽ���
<�Іk9�`���
q E���
+[ֳ�JJ�����7��Vh�{�܏6
+�������FQ�ys_��Ib�	$�_��/>W=���>�Gw��}-�>/]�_S3J~	.�*�<�U���Ԉ�-
���#7�x�$cvV���[���i{{�֭9p
�&&6b���zb�)��
+���CRO����7"�%fN�4
Y���ǾɆ;�&d����

U��[288G-[A��X��#3��Q���L�?�
��;{�,���T�2�D�3�P�5�`�u�`�危�'�j͟�����w
TL�JC�;�̿<�-:�$>/��7�h
�Zf����]A�Y����&XU�.Нt�wFN�~�-��_��{�[�b�*ȯ@��[�"
+B���xuS e��$��8i��=r���jB���Ŧ����W���FdŖ
Wi�m��9�,?���_b/�@;K����k >���ިD�ǽ
U?/��~O�3[:�/΢R�l{��4��9\�)@
+������8Ԗ\�t�3���_
hP �`j�����������b
xwjm�������)2�BSצ�y{��4��������>� �vu�L�@�
Rɋ�p���ڜ'@�/3pGZ*hW�)ߜ �)E7��,@�e��#���&[g��4"+.'�ǔ���U
W�w��
+��uI˛�f�Mq,7�G�o��?���=#
z`e6(�K��g;:Rぅܱ9{m�W��a�
��>5�L�m}�h�T���^?��$���G�.�4�75�MX	N��c���@ �ؐ��C*b�Y(��1����;K���<4���?7y�����f"�r�+_���Nó�oM�\G��FG�0�ſ�@��D�)g��e7�����WO~����7�r<�;����rׂ�ը�48ɳЖ�
���`�}�
15
}��5v�ͼ_�?npG>���c Fg�����W��
i�9d���y`�9uSR��7\�hO�D�O`�X�|o�Z|�7��_}QE��~�#�i��������
+��%-�lc
���g_����� s"��4�貵��ZDZt'���whC�
��X�]���tܑ�MK|�~`����
%�,�H���[n؄mw���������o��U��f
��G����l{r\����A�7`�[ZZk��#�	Ma98e���������@���
"k���F>��h�}#��gba�
+Ļ���_Z|�9
��4����;0�A�j��"����<��h�eq��%~�
kw��U	���
�� ���b��[��X��	�k^�]�08�4K�5�;�ےw5"#��C��L���6Q�c�X��ȫ#3z��3�c@�mYߨ�Տ�;���n2�؁(=�Cs���<�k��M�I�/�C�ݳ���rT��P�5ww��*�襷�Bg^�t��m5,o�[�^��k^��&�[�J/)i�����d�|�w��ITE�/Q���'g��
�g�-H���`a���Ґ�l���3����>E+}4�)�ג�%�4,���O��t��Rl�/zN�垆�15���$�
����k����ɠ���,�l��L���ݓ���&a�����9O+��yt�S��`��'�ot�M׼��B�iq��/��疅u��'�Y��U�����m���W'ZS/:���bT�Q�.�}T�svLdD@�b��ܞ�5�8q��M2�;Q����ӧ��

���}7{`���Tm�w�P�q
�ue�53��6E�Xd`�
iJ�����?�ط?��r
�����W쪇�ΐ���>�j�s��ݒc�0Rr� �<\s{�����?g��?oN��Z�4��sK�0	Ko�����-���
l��S<
��Px�XVS��K
쮑G�R+BRTz`��
𕣧�VO[淬��YymO
̖kjr�)�輵�誖�r^FN:��Ut9��5�i`�
45��'iy�.������>Z|7"mx�m@���)-.9"Ǖ��Y�zLݾ��@K�ȼc3�-�Ɩz M
�f{tI��ϑJ\��w5��d�� ;���{0f�"�ꬩ��^PJ�Z�n�>�|�=����MOO8E
x��6'٭�Ij�8.��s ���4�o�2xZD�-�l"�!Th -c
���
О�;����,ck��q����{:a���YdɇU�DD��ؘjO�I�o�c�
-���dG�)
��FLE����֜~��R�,� �hyY?���5�����g�&�p��
.�@��ǿL�s���aq,@��&�ܛ8�+~׳ߝҳs.m,���%�O��/��
Ѯ�j�*�4�N��]v��[�zz�/�p�%��0�ʗ�Ɣ[�F��klѱ� ����Z��^�j��~p��-1O/�b�\��`%j�A�zBMP��	��^{G꯯�5��I񹄒g���o��_�:���P�s�������HGַ������N�e-�[jx�_��l�@�H��ݫ�l��I� y�sp��Tӟk™��@Z�-M>tS�G^v�{7��oF�}\!Ž
hH@
�iIM��"�X�

�貖���"�g��ᔞTQ�~�Ǖ�$ e~�ȼ�O�⚧���ї��K�
=�r���w�?�B���7��\7P{�����Φ�G��Dlݔ��z�A
�ca�C:�0M�2�.�͠��:>��5oN!�؄U�L̲���w�,�
~t�!_
C
~��
+�r*/�y�{�*�o�4���:��;�[U��=-�����q)>�(1'{��[��h���m��}uǻ�d�KO���p�����厲�uX֞
Ut�m)Pٻ:Z�����	��yje`��`W]�A��r���E�۟����6Q� �����^
�d�X�l~d�{4
}y��ʻ�>ؔ��k���� 2�����s�֞򫾉�GA9�w
+�lۈ�۵0��ER�k
�Z�e�g�7��*G�k�C7f	�&Q��5@����!�&��LpD��
��(jv�bѣ�1�����]�k����
�8�M�C��/3y�+\ចM,`˴��K�������z&烻k���"������\���7�����j]�h\�>6�P���Q�44y���H����0y?;��on�!�?׭�QJZ�>���y��H@~t�)5<kψ�?���V*<�c JJ��W{e����h���#s7��g�YГ�L�C 
��FQ��y/�@�?��=	��� J�)'�̌�-��?��͏����w
��C;����bU�³9����+��UaekJH���	�q��u�X��aK���_���='G�~M0~�'f~WlJ[
�'��[�Z
�昍3��s�	|Լ�n~����6Dž�M��'��ʟ���3�n�
��B˯�}
���PK��|�e��銳��f`�4"C�;�:^H�%<���P\Dem.�
��Ԛ���޳�

��s
W�m�c&>#�H.w�=��d|�Yy��QH��rR��QR㩤g?��z𳷯�%��y����kfA��)d�W܊�_Nt�=�bV�Gf���7P��X������2���9on��ϡ���P��,rJ.��{���g?ۖ�@��F�I�&tW+�O�<r
W]��.bJR
hy���P��<2�W|��o�c_��NN
+j_~M�}�YXsS�,�A-��9<��ע�g�)H�N��o�`����쀴�Ց� �7q);:B
w��������8$)���7p�2�9 k
�
hT�+�kq5�����������ɱ%l���C��
+~���R����9z�C���ORy?�P�('�E�'�8}pq��:�7O.�.QۢZT������e
+�tbd	]3����q�~�"�@(�M����!I;Zb�ϋkY��"��?�Cژ�{���V�`O�I��?y%���<�:��6E�����Y���S�a
�) G�J@�c:Bö��> 4؁�۷�0�VuK�D�i�-:vťiT�*Z�)�p����ha�3�
�8iKC�ڔ��bztqD��δ�(0Ż&,���'j$W���s�3�a�?�
�
�N:ӯ&�m���� �X�~�s!faR��
�G�H��)
�hgӏlLⶕ��II��ļC5�'�����c�UgCn�yM�Ԍʟ�e����w�f��QD�rg�5���=���
"��Oa�
}�m�ҳ��O���m#��7I^��e
��:
<��2�71a
�l{��۵�V���2�RR�C��j�8:c��ᶎ_qn�Ptj]��<��aX�E��B���'�/?5>�t��k
���} ���=K|�ìy������J�-�����}� e�4p�n�E������S��5��ʼn�"�ym����k������#��>7v�^
g������O�YϿw@�
���ߤ�ҳ���_T�?�I��S��>��SnS�y�.
+y{�SW7��=u7���[Ņ�������Ot��*2ߖ�:�̟!�\������==��wT��ͱ��
+J�+}5�C2R�S��5�V�4����ևaϷ�ElL��Q�r��4=��'!登���
Pfh���g���^��:Rp�p�n[
y�
.�>y[�B[�1ea%�` �
��a�=��>��	�Ex>�0����rv4Hd�#ť�� �^�
�������qLzh^�؜bՄ�9m!��>�h�M
7g�逖�X
C���b��K\��8�` �~FF+{qdgwn�@�Du ��X��eR��-y�@j߳r9��T�G� ��g1�c�w͝����CrT�WF(��$� ��N�_��(��^��1en	$9� I��F��rwMĖ?׹�*�����~�B�i��}�y�`3�
잕����{V&���ftr��0(�˄�m-�<4����B$�
v���~�[��xm�T��x�&i��1�t�;���:�p���z�;��*\����
�j-Q�=R�?��(�/�a���;���{63
+�DHKEuLض�Iطw�
����-l�pM~yGFDK�_�����
��� ,�����/���K�#���n��)t��&a�c%�홱
��/�����Y�+�^���'�����rSˮ�
�ج�
<+*'WE vr�2l#�T]'����rG�@�uh�-w�C͏�����Sʯ���
�͎·_�����ƥϐ*Os�^J�y�Lƣ��
}�M{�
�,��QD�9DA�	Nu�)b����cR�[��|)A��k�yV�-�
��W��S��?������ule����mO]=��hh��&�e�ibIS�������eR�>;]=�w���
��OO�7��L�N�fu_@�{�k]�����y7c2TA`���I�-Խ�'�� ��񥆒�[�(\���p�IG&�O���
+�}_�,�*����g0i��'�^�r�#ޞ�Q�.)�ŷ7F;�wԘ��
<mPZjɵͱ��-�`��O*���ٜ��m�i-���J�E��JH��ID�-���=��$�K�ﱨ�V
+�`�m3��P`jn��M)�}^��lHݜjy�c�����W�o�Um�@^<�fC����J ��Ȋ�A�S[O��hZT����1p�
l��ܡ���`+mt�{;��������|t���+,ڑ�����
���;��j�t�y��p�u���Q��@���A�}�����T۳c��:A)ؘ���,	�yV���9X��[�������8"�;I�1�b�z�Я�j.�5zb���v�6��O:2�:J۶��ض�i�[��5�}�
۳�$���BEEt
9[ sl��Jn���
�|u
+��2���Ȯ��7��hC���?7�άOQ*�*1
��-E{�c���J_�����1-�:�DyƠO� 4�r ����<����� ���425q�j����Y��ErUX�!�u|ZXNmڐ3��Ӝ2�9Uۋx잤�X$��E
��vi
�qWLJ>u����b�3�|C�h�2��9e�7\�$W^d>�j�#��Ĺ9'��>�ʯ��Vb�z����Qͨ����i~����H�4��*�uk
Lݰ�Y �8�c����5I��΢�ǡ)_��~5��n���}�R�V��ݣs?~"�}fk�a�,�d�d�"G<��Z��?zA�O�X�W����Mo~ʬ||e[�������5wVDE�5���;�n|jV���R�9wNP
���BA�7� �zRS`�����w��_
+o��%��3�,����
����&4�bw�ơou��3#���
+o�c��w��!���OJv��<������.*q�/
�`��}�Wg��'�RT.����ܻ�>�ʷ孯��UW�5���ʮ����_z�K-��13�]t�dֽ����,
�G;O���a�Ȱ�
Q��jN�����C��k���ݻV��]��cO���!����V�>]zuK�i
�xws_t{c��>	y��gƵ��}��/+�.�D���6����Ž��8�Q5�	��=��+.�iſ�wd}��m~������[�����ZJӡ�>�R�
tʎ��Y[�V�̐
+�U|ʆ��kE*�5��m��W�K���#�.���n�х�Z.�
p��tc�Rrj����S�o�Q�~pv\��s(~�D�n�H�1=�򃃊��ⶭ�v�
���]s= ������ADņF�lľ�В�;�Mˎ�� ճ�Ȉ[ٌ�
�
0�w
+��Cdm����e2ԿDk^
C<3�w��M�������܌�Yb�g���_۲�G�Yn�� �=���;C*wO���2���,�}rz��2�tl�u��
h�6����Q[v-t�g����Tm�h5��D�L�&�A%��u�Rj����;��4�����Z.+8��CRt�E\{m��^�Dz��=J�sM0��#��7�5E��7R1�LƆ
��*Edm.�J�
+ZsH�F�<
��%���G���g�m�k���Jo�E�x�)���DG��zV��"�^&F���V�+_�������k���;��g�\��063�&7Č�ֵDVH��}�f�wηu��թ�[n��}R�u��2�.����U��
+t�G\�����w#��zV�ϦΚ�������r�\��E�&n}�;��* �[�?��0%A��;ב�p̶��1MBs!��N�q6�!`������C��mCT9���������iSX���
��OG��Ώ��C	\l~���>�B'�g��"�<�{�Vm
D%T�Dl.�J����S2J��jv͍�
��6K�
���Ur����i�D���yhJh���@(�P	�A]wW��?�R
���`��ػ0�Y�#/�\Z;0�� "�H_�gԎ�j��n����
z�C�v
4��
�]�]��

���%��
\��2�kBzl٦��l}
���w
��U�!��2L��_}o�}zOCmڒS뷔����
+��1��+s�zMgsҾ�I>�p�G
��(1{OGn
�%�
��
)�|S�نO�������<6�~wT�X�l|�����?��R��85ו����f:rw���ji�=#��/���ޜ�W��L�
��
��R�D�
8����8p���DȾ۰�E�.~ƯN���[jd�g��c
�̯ V� �x[�D$zp�=W
|�g�Ӻ!g�6���ZTS��&
+��
+��m��|
+(�,�Yx�D�d�ȣ��(�%�00ߑӠ�cz.����,�<+y�
��+!d�KI��Y��e	)ce�V
2.)�T߃|�uS|��L��
���3�I_���$�d�¦� �;�t��ؖ����w�,J@�FZg�U�EZUDOo��P=���*������
S
��*|�O�+tL��TLP� �o;��}��*R�q���*0���i���Z���8*y���g
+�����29�VhY\ٞU K�J|�w�
l���g
��"hɟn�`�q�uw��ܟ��oN̡3Oǀ�b'h]AoX_���D �%A%�1Ϩ[�&�8�PI�a���yR�m�^�<J-���A�e����7�/
+��M@�i��;>5�cM#$:�d�x_�eZB�N��W�8M�����qL^TIj�h��S�1��
�1�;� �ȿ@,v
�__����=Zv-�"լ��M];lrCF&"�f��K,dP���ua5:?� z�W�s�&j�y����9��{�yt��S��a%�%j����dк���S�@���	:�V&�-�D�m=�u�H�홙���ې�
VFI��ul��;�o�����}�;���/�eo�)͖��4����2
��
#M��yW���[�v�D�E<����$�z�4���ݽp��8p�I1,?�oK�둥{Bc�@�[��/�r�D�S�����N
�&���;GaI-�m�)
��s�~

��va��@��i0�^%~
�a]�k��ă��y�����%8h��#"8��Ն�PP�'h��MbDZT�%��u�j���ʻ@�Z]dAWU"֚�W�^�4�E�T��ĈC6&ZW���yU�	�
�c��V:�v
\a,q��+��8yⰑ
+�YY��2
����Fj�ʢ�L��^}�6�,
+���M�|
���X�� To*h�U4��L�-BѺ�����wW��1+�-c���qB�+1sՈk���5��ۣz��<t	${V�h71
�,�9&���in�oA ���}�]b���6
Mq�@Rl��W���&>'��w����a�W���� a햲딝
����G�q�[��ٶ��f�ԃ�1�
5A��Zrmb^���RM+���"D��#!C�T@?0���-�.�y����7���aZYL�ǻ�es����^�ӕ)JպB�6���c���`���#;��e��6�=��w�b������x!}+�$���X𨎎�]a�B&b�y�!�ܗs I.� b�go,Ыw-4���M�\bw�M
��>�ľ�'�21`qsWO�< {��OlFU��uiK�w����V�J
�4N)�&W�Z
x��X{҆�l=�w�_4ƣ���
�o�Z�&��������.
+�`����q�>%�s1+���k�=Jj]# 4
�N��fu����
�.���bz2�•�fے ��6�i~�6]ty}��yT
p$���@����r�TPǥ��
�"�8!sm�T�m�w��{��ξAb�8�'���2w
+C�|���u��%�Z6|`���ώ��cJ at W�3����GL<����Y�w�

]0�L uLIN�����X�����1��2LQ�HGD-|v���o���=o�6���l�Ψ�k2�*Z�^N�8ټ��
+_S��
��B�,�M.&erA�� mW��x[6&���4n�h蠉��-Q&zǖ�?`�h{�2�r?l�[En�20��N^���.E�_@�@��LD�ޯ�,0�ݳ�*`=����ٱs;�V��b���u=�cU�/�ԓ�C�lº�P�W��8H�?���
�}{�O�nsLPr\���(�D �<a�A���̸��	)h-���0�7[*TI��ӭ�`V�!��k��|[N��
;���2��Ov��ʬ��c?+�2%��J�jʾ�)��v,����K��~�3��EV�kJXo
��
�3
�M�}2x���T���hjxx��qe~�l�vC
RJ����]�g���Y^9��<
㙦��.�s�
s�Q	Z�ݙ�1݋ݒ�3�#����G�o(����]
����uh)�c��fI��Rjet�ֺc$7���&��r�R
+W�,�RDu��YE���Jjsx����؈��k��Yb�
`�N(L��߷�iq+�������^��u�=���Q�i�����ubqPɆ:�a/
�u׃
+le��"��5j^�%�P��}G�p|�sp�¡��(����WJ�d
oC��CV~��,E�{����,O��ls�&o�ց�v�
^��`M>:��b�2k+q���[N���w�݊
o�t�ʦ6[�Z��n-�i�N2<n�կi���H�oiT4
ͻG���u�]Y����KC��*.����"���[{����m'��o����
l�)��v�v|����N��;r�Q%~���`5�Gi���[��]�ဉ���1a.�	�w�}���{1hI�&>߫���k���{ �u��؀E
p�13�|�N�쬈g��~�k_��Hn�ۻg�AﶝE�)���Yl檎�
wS��̞��N���mw�d�&��^!��8hؠ�Gl�
��G�X�
1�)ə"s���Ga�S�y����>0����c�-��Y�qfV��,��1Ou���[���],	y$��V���h&%����D����sIŠ�z;��⮨�
_[�59�{�T����;)o$O��_�T��s���0��l醦B��y�T
�JFa������V��T�B�X�l�p�zhe�����c�a%s�+���&r��+�*���j���h�\8S��
�����
lֿ�
abVH�!�ǻ�4=��K������U9��=���Pk"z>;��U*�Pt�_(�[�!z�\ IwMR�k�N���/	X{��Go�
�1�������M�Ѧ���<ɨX��H�
��&���1��j&�"��	Y���
+?��j!�}���E�{�	eQ���_�֔\�{^�a�6��uZ
bCMk�~�WF�4�t��'f�S"I�j��R/+����)C1���
(�đ���m��@ǚ����s��F>y
`�

�%b�##��
��t|�����ҬJb����%#�C"I��7�N��m�?�
��e����E>�w5z�����41��%rö�ߗ�}���G
LF��!lX{z
:1E�0�Y���*��5��f�b���
�$CP��F;<��J��)�X$V[��Y�%)�<8�e]����+��]���h�7pࣱ������O
�
+�v\lv�Ρ�z����NU7=˹�Et(���Z�gI��v2�K�*��<�$�Y���.�[�C�,��
����eθ����D���b��1�T�]V4H�K�#�/���(��G}���>�`��G��<�/�-t!ÖQÚ~tڦ.N�O��`��N�
£�<�P�oBE�J4Ӭ��g��.Y�(C��MT��.���͆��VsOvT����vg��#ӱ��1�BD5���Ւ!���B�dX�

2��,Y&�(}�I׼���	Y�\2n�a]	�t}	���/o�*������=i��
+I�����&��tgY�`k틌����!���>�t� s�tX�(�
�7��A���~��L�|t�e���b� �#lG^���k	{�Ls�������}��Tʺ��YX�Q�k�x
sΥ�Y�\_ɤ@�2�
�3L(�6ٸ��Z�z�Ǹ��Ԧ�$�#}O_Q���S�������	f�o�Zn�%�'y`��,iv�43�X�ʙ�弔
�����*����t��M
�q�G��
�8ɳ��Œ
�����S�y�3
E��4���w0߸8�sizy� �m�
�yt�]&��$���El_Uͥ�𩳅|��%��	�;WU+:Q���,����WR>�z��%�(��+�t~�z���觭jD����[�׸��|\07�@���������so�x�
�'��j,i��^I�]S��Q�
9W�_y��mL�L��uUϊƈ��遰�o*p��
+��xM0��fs�=}�s@�
Lz
}B�v�onb;�7^9��y5;8�<;&�H�}�SB�[�Xg�b���"�$�
������K��_�
�4�z%k,�x�
M2>li�8�����
�T���2-��\Ή���=�}�륂O�>���<�
��c��;�.�C;�K2��Ԭ�_,1��b_1U�WB�le"��������˄���趱3͍ÿWU��R]>�CQy�WW�Wr�R�'ioɟA���}�?Go��躾;k�5+gMw;:a����]��ҝbww ��� ��bb��3���������'�C�羯�
����iČB޿�ok���`���x�l�zpH[]ڹT at ._�'r�ܡ�cOR�~���
������釿��1��3�z��
���'��/��9�� ~�˩�G����6��-�kh��*昰
<�2��R�K+/
bq��$A�Zlm�\zO���9X���^f�������;�WA	��[�ITG&��9ڢ�,�G��暭�2ꁱmh�(�Q�*���'im�S���L[�6��c��P3�P+	����l�gaN����_
+3��	?����=54˱�۟���2�O���_z�q*��w�o���c$V�πh%��d�KX�ȑ̛�"%<?C�ss˽��[w+���'w�ã��O^&;�E�n<� w�
+��@���zz�l㨸c��ڹ8^I4Ⱥ��"cCK�
+�_��XDV�������F�9$�5!��_��N.P��
���O�`��t�
��/E�s>C�*lȖ�4�O

+R&���nR{���y%�S;YLW9f�7>.DK���ʇ���]>e�x�8��S�������\��7



�n@��'�q��:}*���x���[�9��r<_߳k����jQz��cT��
�;{�g���w�JjI
��"qfr�It�+��,ȯ���D���h��Ĩtǁ���MU
}UWF

`��(����4z�J�=�ފH�|����7���{�����
�;�;D�
���O
S
�bH7,���E6�[1�ު�h�9 T�j:&
�u[	��M/
wƹ�����o0�!,��]|r���Q<�W�P����
��rp�&:|����K�W~a탮fE�f���l�XUu�M);�GD����
N�T"�>�<k���Tߊ�h��%��p�5����CP��k ��
��'��?��Ot�w�Kn�F���z���=~I�ڰ<^Sj�,�)i��}K*
�8ƄSR^�O>�"RZ~�Km��K���W�w᱂�&�޸�2���[�/��9���8�	����~�J���zͭ�J�fe��yZ�X2,��U����[^�
�)��S�/Q��WP��^zV��ਊ���-?�|��x�,��'��ɭ����������^�n.����賭`��u�
m����
j�Fp�ϱ����?~
+�܈H��.:��{� ���
3nx�n���	�:<s;��2n���L��~'�g:ڔ �P'ac�]d]�0)ղ���%6�y;�P��c�������<��?<{���������
��
���=�􇀔��a�8δ[U�lfo��
�����(� 3r��Ľ�D���~*�۴��lz��~�+�	��wA7>�3
�>!

?B��9x��:��a|�����7��t�ωËl����Za����dm�
gQ���fhg�`|C���i!�Ÿ�DQ��BH3����w�RZ���������s0�ƝG1��
��T�cp$�7P:��Q�E[Q�1%�]���|s�
��u>�S�KL{�%O"S�~	�c��f��sڍ�nvx��仔�����/�-#E��~֪��0#�&N�8I:qY��� ��g
++h���J�>�(�g��W�� }��␒Y�c��������!̟Bb�`�,z�����oz�$vY�J�T�!��jҼ���/���nNl�W��Z��h�1/*W�ci?��D�"9�����
��!2�⇸�����9�34U���i�Ԧ�ۥ�MM
Ϣ*N��ꤍ���npk����[�,��E!���i
����~t
��p��� ���}��W�WT��SW��#��ܣj
"�t?�)�8e�T�h�~M��0=D��`?���"��R�e�/�]�R��r�e���%�������7YO��:���:�t.tx�"��'�x#>����_��b?mOK�\����A��4�с
l�(��bط�y9��b���/��䟲`�Ϡ��'E�����'��q?���oD�Wߌ�i~W��aK���1�}:�Yފ]Ք!��+�
��fe
K,�Զ
����'A�rY ����-� 0�s�}�I�
o�sJ
�s���� t�:�X:�_U'
+�uj�]8�����i�X�q�W���aF�Y"�6��vw
�t��׉��x��+��2(��S ��ga7>��nFd�܍ ��˦�^��2��ťʌN�D�aL�]����p�-�`�\S5�l�K�#�m"#���
��M��KW`��7���G)�?�sG���^��
'�͈���/��&����p�@#�@��[���:�pۨt�I$��z���m���&u��ZDcI>��O0��똬�߃�i3�_C�]���u�8wjX1�����7e��n9N���eU�a!���7��,}���>.���(��}@��W�����d��[
I��������`ʾN�E��X�c3=o���&�ǯ���n����&[.
�$"R_�@vw�pn[�2��R�O��|�S��H��4f�oMm{DSG{pKgo�`��JY��
�}2%�oiI�+�܌��C��
S
�J�}��ֆЊ�7
+G���?�f�>�-�!6����M��"2��
Ϯ�1�p;%��f�=;;��Z�XÄ��o��6�i�M5r0UΝ�6�{j������s��6
�Vf�'�unE,�ǀ��;��$�x�6��;�p�K
��lp�
<�߹�+

k�ϋ9I�B�ߦ��g�	
+��u�IYM�`;߷�O
+o��@Z�Dz������ap}�@dm�$��bHF3�P�jG
+�۽�]�
g

���]�YU
�h��q�ZR��Fy��JE�������
+i�\1ė�u��Z�:�c{�:����n�
��'���˳;u��%gH�n!{/�K�W�5���ꆺ��o�{o�q�;�j��DmŢ��D/k@
wq"�*�/�k)�[z��yd1s�	U���#4Ga�]��zU�^V�*�j
+m���GW�::��\��86fWOC
��
��t
CZe�X�G�
�6wJ3{�����v�!
�jzAӳ���Th�g<�:�U�Mь�1'E����l%��ۍ1F�� +{v�7-o!�%�0���@/nCi��������Ɓ��&yNW�<_�!C�v!
=]��6�g�6�
O�7
�K��"f�]x��(�7�FJr
����6~���
�����C���qKm�z�6G7܊�K�񋪞�
CwSW��1԰���+�f�*�zr�|w��l���3eQ̊[�U at gG(����U
cn��g�V���0��Z�+I��X_}���3!dLIQ���}m�ؑ����H�8
Gm�/I	aˣ���G����)�fIY�N$HW���:z������ľ
�Й[��a�?2ٍoK�ۃ�DIM�=1}��)sJaþq`lGS[�1��?3�7\�4]g�c�&�A�4m��ԝ���"�V�Z�Zm��cz�xNE�N�
co�(�Wu��^����P̞���ֆه:f���97��Wz�_����
Mq��P�IyEa#
����>�
)�M�t΍U�x	�ݬPy+`�_eR�",�5%�Y
־T�tn��\)�MQA�t��,���H�_�1��-�fUw���6]׸oj��1��v��
#�>��[Ssr�Uu�%mw����o�,gZ
��('k[˅n�S�և��V�H�c��u�Iqp�Y��[U�
g��p�2dC�.�S7� N/l��4��pY�V��I��'4��EmvE]�ڟ��;_�<02
+v�Ԕ��R��Z���J��>_�jє�4�����i�'F���\�
+�K+�$ʒA�S*U�Z�i��d���;�������u�O'�r�Vİ�JA֋�JԺ���)��
�L4�8δ�ߐ��[F������A^������l���rJ�ڕ#�օ�u1�ݪ�G�ђV��d	'��r'2��I6�D�O��SSǩ�'fVю�
]U�·
�׹��G��L��s���a{�ĸ#3���.<6s��z�U]���P����|��8-gi�:�K
X�"�]��e)+kUFK]�R��5�����|��pq�*�����K���E1/}e�
��d�\�F��C
�:�4��TB��
P�RxAHO���
�"��Q^����Y!#rN�H�7c&*�%����-uSݮ�U�.+��֗�hS�OLU%s�]W���s�
���!X�MSJ96WU
O�W!kjFޢ��=�j/�Kj �f�謁
�;V^��d at 6��i6
|d���
%X�z���@��`k�����2D��
������s�����B��y~��
��� �f��:Pz�����;�ML��6xk~6ã|]�q��8ss�����/v
)�%նPšSp2gļ�˕��
.j����|#���2��r'��HM�<3��L��:�Ū
�����WD���\癎�7��Y���e���TZ��BY����l^��Zmѝ�U5oþ,4���i�xc,�<�c`/ת�����E.��������{���5Q���@����r��6����$�8�,+��r�:
�x�q�x�e�x���`�\��a����9)3k{��o��Ҳ�������7��c3�|1͡��Y�S-ta��_m6����;
Hi	 ��7�_˘i�mrvƮ�
s����R��D��Ł"_%?�ّ��*%mKi�Km� �%�LG�9Փӷ��~�ڄ�u�
?hK2>�=]^�u�ڑdX�K~�'�w;Tb�:>��P������2���	ٵ
б��b��{�	�ܶ�=Z��ץ���	�����5��=%6vM��^�D�l�p_T��^��D3������_�+'E|��
��f=[��w^��.�Ʃ��om
!"��ؕ^j���
�և��
.9Qc�ƈ1�~��xe��R�o
+F���ʲS�;��910�65�PA�>Ҳ�'��q����9"+=�=	<�TSu����_M�!�zΉ��:�W�mڪ�=M)�2L����|��X�t	�`��f��ö$ؘ#-�pK��2۔�8ݘ�hE�NJ��j���cH���7FM:4p�rb҉����ecT��=9>�X]
��,��2`���ǫ�Ǔuu6C	ή���
+t�m
-��iI��*|�U�
[#>_�p�'&*�ĀM��#N����ő65%��\e��by�e�)%�
��8@��d�h�
mS`cօ(�M	.tOIϱiX�c
1�V�W3��l���Ҟ�~�?��jg����L���+�.p8�Q|�e�8�X�@
�𙗳���X�
+�z�#�_�\��P&8P��z�f��B�Z"�rF �����G`�{#�6lG' �/T��e��-VTΔ��|�MG�;�b��&̦��jĶPU{�XӲ�������> q�B=v��訋c���
ʑ�{��Й.�{]Q�o��l��Q�6�J;cf.��\W{�օ0�-�ws��0݂r�o�|>V���+i_,>C�j���#oM�$?�"$�T��
96hk�%��t<Vz��ΝD�,���w���<3��gFN��0��қ�dc ��
�gS��u�l��#-�� 
��X��PK?�
ЋoL�)o�[�_-v:�tA>v`C�n
q�|�Lu�QZ�oC��_e��[SթόU�wW����6Hp/6�ᩊ�)��L��@��lc���<��Duܝ���7�
+fΆ�8e
xͻ#�P�!�*B��yo��!��ħ]X��,}��?'��/tL�bG�����'

!O�5�
#1�LG�;RQ��g8
h���2⟓|�Y6��̂�oF�8)��H�^
��-uA?Z�
�M�.8��G�>��B����W��BW�_��'�E#�O��~�f6��d�h��dS��m���8�wW���>�XFZ�C�Dh����##n���7D��=��
����@o����-9<p[��)
83P�/�Լ?'��,qgF"x�/�yw�r5SYmS1����p� �{W�ܗ�C.LܢS
��[�w�%$ k�
endstream
endobj
331 0 obj
<</Length 65536>>stream
+�9X~��ůvey�
�n�<���B��(��+���$���S3!�n at E�( ���ס��pb��
i�u���
	�
��B)�n`c6�PA��Y���#sI��\Y��6�r��\�j<�oU}]j��?����.sK
+�[,��U`C
c�L�r 3��c-��TK��h9��8t_�lM2є�r��/egX��Q�]H7����-�D�H�u�\���s
��*���
\��F���
�H��Zrڞ��M�K�f�_�1�R|�R��Bdž��Ӳ�E@���;+���>����vv}>����`>��{�j:��I*��)�D_�-�,4�<Z�K{�я
��G͵"?쉉a��MqQ��-B�,���εx�����N�����ߴ���
o��A��c��
%>r�:˩u��:�]���jH{<Uu[_u{�<��v?���8>v�Rz�/�t��ir��QD��U�N�}\�{6���|w����p��Pqؖ���+�c�t)��w9�㮩���r[�#=1�@��]�&&mtE�g��u9���Б�r�o����=Y��Z@/w��E�>|�rG�����7;��Mq�G��w���җ��X�xoC��?
g�
>#���an�޼��\�oT�1
+��ܤ;V5�l���� ��5��rG
v;*p=V���f�p}c������?g��s#!	���}q��0��ҙ�bW��v9��2����
�^��(��JJ�Y���⨝!��
E��;���|��ɞO~RWex�g�K�c��C}
�ȇ
+��-?��Z�&1�
v^��}�g��^-�<R���u��K��㟮�g��\���t��0!�P# 
�/�J���ȥ�9A/���7�R�g�c�g���d��}O�B����Ӥ�##1�XO��6K_��k}9n
mYo��\����3ӵf�����;�_
�H)�Jʁ��/��X�
+�LuQ�Gia�l
P��:0^���M5���J������>@
+��'��3
,u�\�\о�8�ҟ�4�{o�.��� ��]����
+0v+k����@N�?P����p�}iާ#%$dCv/K��.�z~�b��{`
k��-��@Q�=q]�~���C��ԇ]��_W:Q��
+V澜�`@y��R�+���nt�;.t��9/PQn(�y��c
С
0Ә�PW
v{�~�X��vo�
�����P�D�|8D��T�rvDEc��[��Msu�C`�����`Cu�ݽaL�׉;�BSE�㥶4�mq��rW��|k�����eW�T>�H�3W���ၗ:|��8*lk�1ۖ�܅
�ӎ���L���:�j
�e�������fo�����UI��4���R=�'�]:x�
y���35��G1&䧭>�)���Ax0$���󝐠 �~n,N�g~Xh�z�)�rk�����&��UNM���n��*���Y`�C�,����i�?��qw���bD�MU
?Q����D+<� ���w��
1(�P�6Ք�Dʊz|�'g���_�[S�[�P�m!�oKT�o��n�`���qw�3}��rҡ�8{�7��r����rd��X�߸��QT��"��\{���X���48��
�s
+g��+S^\ͱ�� ��Aޣ�ĻS<�_K%�JH�(��u0�ws �c�E�h��Y��5-�(����^T�k������C9c]��Z[�{K���tU	�g�8���6pй��0�
+�G!�O�l��3����k��L���v��ׇ��mQX
�DI����m��Q�B��b7�E[��ZS��X+H�7WW�vSB����7V�=9T����p���x

+Ԧ���
�������{r��Ғv�������OT���F�2]�|����~�_/!����P� K/�u�)��=�V
���z��JN���n���4㵂��ju �?ݔ�)�0۔��X��b�
�[<����%d�b�ݷ�x�I1�Ä��FƎ��������\�� 1t����҅�9�����}�'�ӎ��m_
�ЖD�
&��v�o�=`����WBl��~�����Gv9�����{�c,wc��+�/m�F�r!�@Z�/+�iL{=ۘ��z���m��l���!����Q"v�~��\��,���lǹV�ˮ���
�����=�:��>߂�4p�����;N��|�l�xmn�z��
���W��NK
y.+
P�嶂�K��/����iYޓuiϖ;!^����2畚� ���@�{o�0AE�������aB�mI�	�
+J���p�<���.h�M5����.H����Q�{��t���̀��Ԭَ|�1n�S
?����r_Ϗ���grA�w:�Q�4��#U_��PN4>;�wcU�-
���]i^�?+,®�}�cA�;
\�۲]W��<�z
���iH{�ؑ�俛l汑���s�EE\N�5^N�T��,(=��� 
�K��]
��
Op�_�O
t�
r�D�
���*t�i� �t�}�hy���H�Ⱥ��S=�6N��_֡
�ܕ�b�I}���rZB?
+�7�/\�L�f>���<@
�QW��`�
��"�Gˮ���M�f,%
���[�7٘�ZS���L}�����G��`�516�X��a��(��w]h�x�X��b��/ÅO����т~^l��
�p������r�H9��j�!w�C�̷B�W%�0!/��0+���1�Ԙ�ڈ��
��/1�G%�GSy���NnB92�v
"�΁�;4ƾ
x��LS����ԧ[��w�Jt�D;�SY����`;�9��3��{ �ӕ��T�
��v�݅>�l�aRԣ�>b�r#��N��M
+��t�y�6��3TD>�^gZ��y�^��i�N5�]M�<E��GP�{�`���-鯵u�Ϛ0��D��G�� �����/���Qj�r'<P����7BJږ1���P����W�
`gCEڋ�����
��iS�Y���~{�a��"|�|c�������u�w�e��N��?X�ͦ
UY��zH������3#5
�����̏��ط��O�B��T��m5y��x��
��� �_�D�m
+Q^s
/M5Ƚt�
���Ć[D� 9'�r{�1�î�;�J������#y�>aML
+7�g�ԕ��L������A~N
+�Yb�ׇ��,���!^7��窒�OV&���Mys ���o

�*A���O6���
U�:��|�Vpd�D�ȡ�{JT����jy�����
A�)��^�s��R
+��
+���`�5a҇��,�
v9YB��(� G��\g�(�q��ќ�S
+��q�H������"7��y� �d�
iq�B�u��)�
��:�
�o�}��
󺚩m����}X_}U�#}U��~�ס��t��o(Hɪ�'���ћ2F��4��-�zԝA��o���ܘ��ݘP���;�Oyx=�h_����v ��΀�V�����7["R� ��nb���>^��i���v#�w��a+�xS3�u���\_%��G�H���2.�`����E{�v�
�����w ��������5��t#|~^m9.��7Հ?��b�W��}�d +bڔĤ���;3�����R��V�>��K�x ��^�x$cw�o="��Z����Lu�}
��Ԛ�|�!��j'��rW��N���.�ma��Ȩw����y�r�}
�֓�a���
�ts��U��)�z
+|��xe��7
b��܏Y�G#9�{���k�^صl�b7�}�
�yw�x�C!զ�'u:ӕ���8��֢�Ǔ�w!+��B/�wK��^B�ϴĜ���:.�*C��SZDh��~d�Z7�db�hY�c);��|G���{+��8s
��t���(!�ڟ�И�t�.��r[�K�0����}
1�V�t�&�\\礛K����]Q������
͉N�
+B��9^Z�RLH��ލ��s���������Q��QN�t�ٮB�%2�d�ǶHK���0W����2��o
���U6�E
+ڮ�e�v'��h���%C������ͩn6z<A'�O��-0�W�dȶ������&|��`�������&�9�J�]ENؓ'�{��	��Zz��(;k]L
?�
+�[C�ȹ���K
���`'S]�sy��!6�t��^h�}�t </�<�]E����J�
�oև`�+�`g��8j_Ãjs���3��6�\����ڇY�RB�lK�Ǚ���GjJ�����5���!�M�A�
��.���ϗnC�ʜ��{m�+�+C�
� !�2 ���Of�-��
�Ӂ�}fdlK`��"Tȑ����IK�oD8��ҟ�!w���;g�r⾶�2?@�Q�d?8�ğ���H��+
+�Wf?/�Ж�<�!��	1[�(���y_��ʯ
<�lȣ�rg��p��fg��NV����)DzZe�S}M�]]�X�����
��s1�Wm
��TЖ$�ú(�E��
��@� ��h�(|�/�K�Ky8 �'�k��zR�Zw򛩊��KMq�,���k�`w�(&�z�n?=���,��D�F\��v.j�1������':�⡪.����!N��
��ܚ�v����|�*��BG��C
9{�$�1���;���}
~jd��C�^�]�o��
̵�^�G}^i!�?h�{�ڗ�c�����1|�
�ڟ�+-�?���	��vx��O�处s=&�L�N�:E��ca���XCM����rgO��n����e��K}��F�K!=�ݞ�t9M#_ΰʗ���"N��-*�ߛ%�Y84����z8՜�#��rf�&�����Q�~���[��<M���="t�?�q�'����#G�@]z�Ji��q6�PǁX�8��Q|��0��L��ؗ���;�_/��;.u�;�Ǚ��j�r�}KX��?����N��� kf[s�����V�!A_�U�!zw��˾�5S��'#%��i9�*f��
��&ЋM1Ʀ������s�LV�?���]����$�m���)��/u��.���c#߮%g
(ё'l<�-#w�	�rd���>H��4qQ'ZRʷ):��Ă�H1�B�!�����-�'u��^��
�%Z��|���s
�
h�ּwR�/�ZF��%m��
%>v�<��Xh�y
i�?d���Pł����<��6d����;���k�����}5A+����V�pϭQ6lQ�)^�%D�ka�����׹G�u�#-	�o̦�un��/�+��YEK��J~�]	����L�?f	Y��)s}�� �����������s��os4ȑ�1��i�;����#
�3�
+~��]1�`�;PSr��
`/��

I��p�����xй	��ԑ���=ӳp�ZҮ��m|���ю
��䥿�Qpr�1~�����_,��\=�y�g��Ui�4��^v
�.���8Mԥ��3B
�5%;~� �����>x����zo��u�)��AB�������S�QS��l�-��0�.F����L�59+߮/-���9�=09-��05�]�O:11��3��=#1m�DJ��g�ʹ��)
��<��4�1vl*��_9�
QA�Rg�ӓ	*�h���d��v�C\U��F��
:�D�K x/q���m]��kM{�'�y��?�b��4&<��z�y������ljN��@��.࿷���'�c�i�b�
+ }������\獩�i�JF��@q�]NM?ӳ�
+R�\;��tC΋
)5eUH�1Vg>Zn+t���R3�g��э�9Rҳ�Ÿ��^����7�	�Ax[%�χ��<��/tL�]�kj�N���ϧjz�}ya4����b��p��qJ����๊�x�TDŽ]�k*3�M7e=�J��6$�����u�N�Ffᦔ�&!�_�o
h9V	p�(o�()�H��ߕ�A�
+.x��Ѓ
�ij��ں�
s%��Ւ�s!�*�|�t�?X��E�+�ss�_�U<��09q_�����c�Ø�-i���(.��\JYS���
����X��� ��P���2��b� 6�f�\����y{*
�PO͹��#4E�[C ��1T���w GH���;*Z���U-gS
܉���&F��<Q�|�Y�2���u.�Y�P�
���N'���)
�P�����[d��
���YXk�Ը�6�dž�
�)):�@�5��-	���	�
�3#����0����W���D���
J���G&\�U�
ܒ�|��ց�Җg=5��<;�~��nǧ��0p�i.����F���^�p�W�����bOS-���T_����,���UA��l�
������*��c����F/|h �>��~Gl�7��
(Y���A�ߟ������f��MX�}Y
�n�
]�Z��m�'?���}k�0����E�C��m9#�p
�mIq�mv�+��f§]�Ԏa3���`�K]9/V��^-ug9�
a���Ԭ�Fz���]'צ.��%x�.徱2��� ��*G���!���!�'�������Gv%t��
)x`��օ�]v�=ƈ����tb�-v�\�Z�^�\��Y�j��y�-�[B\{ �s3�.ua���iU��
3qn`�먙�#�
Q��lK�cY�/65!��,m=��|7.p��t�!��X�����g`o���wG����++Ԁv
�m�1~V��B�ȹ2v

ln�Ya�O&Z��涡ss��<�&b��&g�ܰ5΄L���q�W�e�])��*.p��}�ҕ�|�t�,�x6)���aN������J�C
+P_�l�
�:��)�
����Mr�W��_�쎑��^�f��s6~_�0ݞ����l�=���+��]
9_S��n��8��,`��X�3k+��J�}�F��v%1�n���*�ߪ�3���
ԉ��:5�A����s<涂�Џ��R>��k���Ǧ&'*)ɀ�͸0����ѐ':Z�\7�}��zbb)8�/;
+=o��g�[,p;Pc�ϧل����
�Vf�ȡ��~2��ڴ��]
��<�->vW�C
�+kRv�0���B��� �C��K@�"���ܬ���C!�b���l����V५;�Zz6�b}[�
+ -Vud&d�
�XD����O�r׆�a;c��3��b���
�D���ve�8��A���Q�	�G'
�u���0�o{�E��c��T��?V�c��|Ԯ��h��sOg9�)�@�	��>���<��<���M�`WQ�X�D�I�);*b¶
h�E���|0T�>֗��; t݅Y@ܔR��:`����"J�>\ԣن|�)!Z_��J�L�ci/t��\��Wc���
�e�/b���`q�e�3�[�7^�z�XO�]L�0V��^K�I��S�X��^6%:�TGL:�1
�JF憜�������8����J���4��xe�k�
bWӑ��J��*l�PK�#�Ce�Cy��M!���0�g�
���Hʾ�a�t,�����l��_
�w5W%�7W�=2���_jIxu��$�J�
ݸ ]u�}��y
��$��T��0���}0F��W�
+����d�/JR�_@�\�9�y�(NY��v��ؑA��Xp� }�)�z�)ợ��uq�ׁ�(��
_����eW�O76�^[��)Gz
�P����5��<
#�^���6ť�9�!v�+M8�D�ï���Z3�/��?n�!�v
2��E.
�Ϋ�ʺ�r��Ru�UA�w@>�+
�e��)#�^��],T��k�8�ڂ�
=���&8�S3�rb�N�
��AZ*�r��ls�����o󴢿�ٴ�Wʛ�fy��=O��Y��2V�u�%� {C�H���k���-+��R+�k�N~�����)Y#Ԅ��*�M[Q�
��

}�H*ؒ�#6$�I<����b�
+>����|a�l��^"�<��D��t=�������n
�8۔Ȁ
#=�b��Ņ>>�
x�6V
�;��_���8ג�ً���?+�5�L�]K˺�ky x��A��B+�gC��ݑ��[c���㭵[�
+캄�؉�4U��`�
���B�K���lȫ�sB~�
�:Ȉ��Fn������G=�
씧����S-%}}l�%jJP ����
7�>�؎~������W�
Ҿ�OXb��E�69
ఀ=��6V�=��|U���H`����*!��
a6%�ĭaR‰����2�~9�*ޕ �'������Іoڠ^�Zf��&;5�R7Dy�s�q��;3����(d&�������
�P����=a���0,bG�
+S��=�h��
x��^t��2���04`{8�e_�ؗc����0Ss������;����RS����r���
<ׄ�G�،o3L��E�`�O�f3Ԕ��l䙁�q�'�Y�`�-2rk�;Z�u��Z�|ڐa".���3�����m
�ܖ�3�δ���SP��'*x{c�<me�c�0.�XK�9�b��Y�����c��3�������U)5y���YH���*�>P��.'���ʪE)-uI�=��N&YH��kU���T�	�F:�r�^�粠�j���h�=&��� g�jI��qL�Mu��DͶ��*��mݳ}�ȹ
�+�7p��S7��JI�9�Sߖ����l�I��籯fk�

p/9?�š���_kiӟ����E�ЀM=0�s�g����?��g�\��<i���|]��μ���v-)�D�	?R�C�e�0@φ�J
=mJB•�������
�\t
	O
��������x��
{
h�S3g�U1wF�y���7"��McE�ݝ!d���X�2VGYWT��G���v���8h
��A���
`�'nH� i}��H
a[���"�n�	��m��3Z.[]0��>���yM���
�
jK������G?%�� 9��f_��iZ������d����i����﷤��VY��rW��<��r�^p=3qEJ�x
t�oj�iJ��	����۴Ĥ�
��rO~�����)c���QN{
+F�����Wb#v(����'s��/v�~Gz.bE�L2�幮t����%�;b��^�@F
��Tw�X���*�Ej9��f���*��j��<
�̴$<Q#����G�_l��`3�1S}��Af�]SS�뱎O��䓯fx�c
)�"��n�Ҫg�M���}����7�ϊ=TaR/f�D�{c��#]Q��p����'�(CK�c]�K�,`gfW�ү����9�
I�ЛC�#�%M7��ٕ�
�y�e��8������ʺu%�*��G��S��u!�ˡ�:���>�|���{���z��w�'n��cmZl�MGα�8�U	6��D���ȥ��&��
���ӝ
xSJ-��=W�����Ԃ��U;���p1C+������H']���&�wGqI��K��/'S,��
���L�>�� �&�b�_�uEPq1�"
���aT��$
��$��՚����j������&��^
�Y��I�?���<���e} �v9YB�W�S6�I��rbԁ
�k�B= [...]
+���%��lg�硪��*/-�k�u壩��7ז�r���
������eST쿯b�m�R���
o�9��Q�'c��s��\dB��(6�@%@�P�V��^�`�
)��D���x6Q��UQS��Pw��8���+>P��,��Ζ��w�c`�}5-��T�t1�&�iJ�{ʢ�?����yf���.)
+�
!�.��E��53���A�*��g�PI�ۗ#����0��?r?ё�
l���B�m����
$f
)I9�̄�K)�M	��d�\�8=g�
��ʌ��r���:�m
��K-zj��
a��
��A
PoUU��<��
�pf�%
��[��Y+��s��rQT
���ش\�%�O&8��L�Xi�3uy��]��K|`](9�Ԙ��w��
^צAGX�=,��n��95�
+/��JW����6���
���o@ϝ�0�V	$xW��s ��|Ȃ��0�ϹΚ
�6AC����;���&���&\��/��b�K9]�j^*����v:��� ��{���ϕ���	
+��ɩ�&f��e6

�҇�o�~5ך�b_����	��*�{�C:���:x�Kt�8q{�q�9��� <��'��'x���V�VCq�T/��x����F�?��v���
@r������x�f�d\MrP�z.lW�ʰ�0Rf;�N���g�J�KmY櫥v�g��yR�uN:.�:BO�
�'O�f�P
�6TFݙxeC��x�½QdG�ϰ+��2�϶8���X6P/�/f�b��c�/�
k*黣%��aJ䁒�s8��T����b�e��[��O��I��.�*�vS9}S�N���/DžY�
]�Ը����W�Q�lc�C
���~�nG]�90 ��fh��	b�M����H~<�������\E�MWF�UG��^�Iߦ8�33vj��:A������\�����"D��	IG���s#��r��?��v��JF����rs�1XࢮHt(�v4���R	�j��
�-hi
h��Hv
�;�\�Oz=D�;L�{�/G
��ji�1ьp�hF:�ix�a�
��\��R [...]
��=�m?�
�<�>�ӻ�sě*	�3�kp����җ�i���̏aE�ۿݞD\���uW�C���R�梠7i

�踰��ִ>���6�8��;�
�t}���
�Y� yl}�ߟw�G��.��kg�"3=�מ��� ����usG78�{F��
n�s�-�����]�@�gc������D�����D�|�����05X��š��������7Q�+W_����xȈF�
+,�|�얕w��׌^���o$-۳2TX##4�~�;�i�ϰ��o�Wv�xm+o)ם?�m�y�i���U@5�% t��{���
�ek�X���S����CJtIL�#�?2��[�,Y~���o[Q���/P'��H׷
�
��l��\�5�y��P1Z=/�E��k�׽�Z��~�•�geI%�%k�R`�C3���
�!o1}�˾�'��kQ
�.�����l�
�-�_���LC�Q��@T-�%�\��
�o
qak
+Y�q}��#��
q
�s��sL��ǔl����.���f’)/�����a}��
+���<�-<�*	�x�y;��s׷Y��Up?H�$,��
+�bgx�Ѳ3���A��
�W������
�۷�\�
p<�
�!��be�w�B^\�"y^�nnO����(-���yh0i��R&�C#�oMv
�sqHI#�V�~%�{y��ҏ������Z�
+�X
�ӘR�
�F���5�
��;sě	-t]ۀ4�&�lN�=����Iϱ�F@λ��ǜ��H��4?}���b	3n �Y#@�h�m5�3�{䘹�~;�8��<��W�^����8����v^��m!(W�Ã>խ����izm�"�$,
L�)䤝|v��B���F0'���H�(�5Ī�
�$8�,N��5P;c��Ѡqx�;�kۘb�|\|�s�8k�`Ƿ^�N:
5�^�|���A��
ٓ����� 4����b&���sߍ�w����Wg�~0���J�ڜ�w�ϫt�Ĝޜ�m-��v���AJj%D�J _�"][y�9�q��pe}�Q��_��cS&
�a�_E��|us�Z�=)hݞvlN���&)7���g�FjSXGoޙ�����WJ*�yQ|��W�w~1�9���b+���C9�62;3zrcH����q��s|�=�tL���lZ�C��5i
�14�������w���&Q�f2�@���ˢZvw������3Sr���
�Z�I�!���)f]�"��4�)3�n����:�訆��Eg�����	�!�ltU
��_�鹨�:�n�[G�
r
�ru~����ޒ.o�#�n��;��bBAm���	�� je��
�2c��"�w0�a��ϛ�p�h�~Zr�?M~:���3��+�͸~x0m
H����������f�Φ����[*��D�I�ȹ~��;���^Ėn��9����L� �d\�w�&	'��uC��,bFB��))u�EB��Tυ�7
ǡ�9���]*z��?Om_
�_[y�w�`�Q�.>k]Mm0�@-�pQA��`�*FA���R~�90���~��k
��k��̌".�
÷S���8��J�h_z��I�X�qݛ��t�˾o�ߢΧ=��~5�=���FtԦ���y�����ޝ\_�#�
�Ҵ��ʹ�Ԍ������X34
2i��V�[
+b��~�A43gwY(��G7���*P������D�V�i:��G�U6~���
~DEkx�
ky!��
�'��zp��V	;i3�*lg���[�lLr�����'�U;
+v��
���U���q��\^X'!�5DpQ�R
P�9x��*�
��5a�|
���q�%ד�/-�{��?��
�@|����)��7��P�XZ�\�\
+�
.p�B*Ng���n��߮������?n�o�64�/
*X�A5�/�`�DtB\ ���ۦ��-�����|s�s�9܍�^D͸�A�]��W$-B��,���L���	b
wm}
��d�wi�wu���
�^8ޝ�S[�
+�ռ[�`�W�zO��x��
��|B����)z]
��oq9���
+t����ċ���RBL[��7��7��>
Q��!%��I
���m��_3�ؙ� �>��sB�� gk#RcBOG}\�sv�
JD��_
�=�9�+�:�)���1��VoTE����
I�����@�ո~n������,~y�_�0n�>��Tŵ���<�&k`���D���O�i-	��-� sc
yp���<h���N�|oe��ޚ����.d�`�^
+~-
��k��g�������Ϳ�
⊟�@�6�{�p
=(x�����Q
���������/�
<P���*���~X
��Z��>cS��w����Jj�_6�_~X�9n� �&!�,�mHF��"a��D�p�����~5
�u�<L����T��yrc�@�˺�بI�7���23��CPC�~Xc3��
�2md�eL\TZ��ʁ��`��
�<e�0��)��B�ܘ��,
+a� +
+�S���I���<k����֯�JBe at I�
+)�9����
~���,<LT�j1�Q
�}󃤀R�
+-r;B
+rEx�^��7K���Ăc ̥��szj)%�
�D�yz��<�l�5���$�8��h�[~;��y6�H���ss�\��s����<�6k�D�R��<�fs�|3���Bz�@��LҪ
/��=oq�NC ^/��ʯ�]��
*9�z�o�Z
P��c��F}�"�f�
��i���ۿ���ϭ�!NG��?�S�s�f�sbQ
7�d�����n�m���k+[Sz>>g��2� ޫAmm����V��u3`�.zO�Do�����P�0���L��e���<z`����D�7�S��W�v�(��Pkbz17�g"�&-�RX���G�>��0߭�Wϳ��YJCH-"�_�k`�>yN�>^d�'T���<�z
�8��kKo�f.as���z�9�w�yY�L�4	�
���*}�m߯�k>�s�ZU��f�5
�T����O�wMm�×��~�����;\U�v��6�������M�ļ�C�5E��u�@�Jhݚ��>xVaE2��3�BZz��>�kkQ�� [...]
+[�9�}*�%�'L\DP)��ϱ6g�Ŏ�͟���:�6���JǮ�ܓ����<Z��# �����}�Ez��,�"���
+,p�����F�}��tx�v��M�KFVO��Enj�r���[�@η(Bl����^�/��7}�y��ux��
x	�u�֍y^��'�I���/�g}�P�B
���Ib�6�7>� hþ�9N�����`�ߋP A�2z�DZ��EVwP'�'��M��;N��>G�����-je\C�O驭���F�� k�1���=��"�im
w> }� ݌�8��z��{�帚K��(�=.{��~����dp
~6��\��LٸXPG�RV!)m�b���
T�^NݑEv���$oP�V��F�<��{ĩ�yBmT' ����k`$���kFk��G*� ��Q�H�W�6&IPa�
�#
p<e���QE���?N��~��V֦���[��������Ĝ�G��y{K"��"�m�5�4���1ns_
���k}Q
W�
���݊�xh����?�8��d�
DJG��k�7����g�
)�\�q��V��h��3N1����1
�8n�U&��z�qe}�ܝt
�x�H����=#OS!8�����r|�i��7�S�r���=�>�qKz/���F�/KF�.+�
d\|��j���[��/vfIUy�����ju��f��D�xԏ2�H�w��]��y�(����%��RFzg�B������
G
�q�
6a����
	�+�B_���]ڵ1��V�<��%г��3���<�~���$��b�	����.�a�^3�$�a
���Y�尚��S�:0K�N�
pZ`59�9�3���4��sN&<f�σ�(��NJ�����	N��Kb�j��ͱ��B�o�\�W�{��露w}��Sq`��5���cKo��g!�1eCA��PpZ�[`ݟM�w�ckUly��y`�ڐ4�)Y�X��'V�ۂ�Q�,�C�oMa����8
+t���b�c{��UKȁYfcB�h	/*7� ��ޠϮ��.F����VB�
'�y~�>���dL���kpe��7�w}k�X���!��,��y㗡yrUh���$\�h�Q��G^��B��
�&j��#��;Q�轨E�ߞ'VX7��z�~-�㓷g$(�����
�P૒z\SP�-s���՜����i%�:
w_ؘ�U,�6~
+xpeLDŽo�!�Cs�ʨ��֓�FsD+�ƭr��,�vs�x#��2N�(a0bz::�%�D5�椉��x�Ld]C�w]��N�����>&i�S`]#j|���c!
�;�07�z�G�����ڙ��H�1냩���ۘ�K�Z�-9�|$��h�<i��
���
��яT|�}�t�����%�9
0+��"
+�?Ƭ|��
�n�
���I�W���J�*b��i
93P�{ϛ�ky7��3ӻ�cm'��������{q��On!/
XA�,�hM1=pBiR�Z��X��]ٞ�]�ϐo��Ɯ]@������ll�B�+���vs��Cf�"bL��H8���ٕ4�3ղ:�vOPEk�iM��(�P!
��;��lx��UHA��Yx� ��^�J��@{��F̍�s
����'�lX@���YS
�a%�;�!V�5
��k���h���0cZ)9�Ң:��-LD„��+�}@˦,
L�>� n��pg��'@�:�ܽ>�������i��XoPOS��}:>��@k�3���
�.4���E��/Mh$��ntd{�V�5�=o����~��ߗ'�������!awpNЗ2�iI
�gg
+q���w�G���鰌c�q�.�Ft�����2�FZkd��R\Gm	�
�Ĝ��k��wB�A�2<
�s��Ej]x̟�ٳ=Ũ[{�(
+Ę�Iv�ҫ��7�;�Y�:�1ƨ��uD�9}1%�>I+w>CŴ"6�	��{X��8�jHMoI�X��W(H�F
�L�
�'��beVoO �Nܚ%��+�9+
���vA�d
�Q��u
?����0�Nv�5�|�R��T�C6��
�d�|V�=�(e��V
!��Ғ.)	jl�D��Y�?�q�"]ߚ���P;:
��[z����ܴݰ5C����\u��^�o�0p��Ն�����/��$�G�m�)��p%듈����
�Ǩ:�}b�
��g
߲����,ҁ
����XՑ*
 v�R��C��Z��YB���oV_v|��6����:��=�D�畈2.6�nxV�G_�*qW�ZFK��E�@<'
���99�����hI#�;���
kٝ!��r
C�F�J�0�찊�ױ:SF."cQ� �-O꾘��{�����0P Ƴ`1-Rs��
+N�Zн3A)w=���&k`W
_`6%�N͚y��C�J�yx�O�Q-�-a!ԇ�
gC
-Ƕ&:�%��X$iӝ'~%������WM��ga%Y
���vP[o�ưg7fM@�
FԼ~�O�ߺj�*�#5�-
TBK�ۜBUx^�9{O��WP�*A���la���²�OR��@$��nM �3����)#VQ���5}������,�L��A����$LC򈖏�,
-B���2Rz��=�qh%f��
�>a
�A�y_��_�
v�9�F^�Zɭ��Ջ�;����ZJ
*��!�gc
+������{����o�
�rG�>0����9������q{��"`g=L��$�fX-D'-rI�g�d$�aC�D�缣/�^���ڞCV������o�-��	��
R�F�0i�I�n����.�L`iT���[��v>b���ZQQ�s6z�͡�
����Լ���;�
�����vDCk���<��雍���G
+��y�~\?4��u����� ^��u'�����F�L�\�i=	��4�QS��A
�-f`����+�'�2޿�)ا=c&Ԥ���$��y
��k���v�4�cw9^�|��[��CW���c����<ҾW"�[��36
+�~9�fu������������`�
+bi\�l����^�0gF����ӁEJUp�M���$��
�'ж W)a�ޑEruBC���imA�me{������8�,ke�m���j�f��=/�
*�3�����+�rUt�T����Rx���MG3>1�'l#�Cz)mk_�:�y&���
΢�����y�͍i�M�ZB
+�d��U&ȹ�
�7�K/��6�0�~���:2�Qr��<�$��h̚���Z�\s�X��q��9�儎�։	�^������\b{;�{�/q<l�F+���4Z�ip��h�
��}'
?�M��9+�1�@���S�"JvwT%%Du�Fbz>�7�.�?���
���v�v���?�0�
�����iN�昨k�g���l��y=i"֥-BJ`O�9 �a(n3�x�շ�����+�Y$t�:gU���^>+�
���	�	+�?m2b::�du�)
�Y|iH���ع��w�����M%�%���$MlL��F�&1���mg
��oL��š�#���
W�~�im�E���A}d
&�KL�&��ڒ9m�1k��F4�Z�<���L�Y�<�$�E��]��e���_ܚ��\�UX~�c&k���$�D�䆂���]��+���>~C�� |�#�f�Ef��Xo�}� ��=/[��, ����*
��~��v�7�lص�Y9�3�
d^�2p�r&	#g�K�V��5��)��I�w`=K>.�I�n6����Fv_�:r+���Sz�o����g�G�^#�F���`a���<B��Cg�rp���X
X@\O1�Y+�
�$�~\'��灾}�8��������c .ˁv�L���������͡o����b��
�ų��
�3��C׼9
u����z�z�W��}�����1�����u{��ӋI�O �ޚ�;�1�ubkq5i���
�	긘�IH�)�ȝiVcR+��5�֝����y���
+3
r/�evD���E|��8�jRCm�����>P#|
���Y~���y����ϳ����~�������Ԙ���a5�fk�_o\��*`�^�~�9�:�X`4g��I��BZ!vu�xm������+)%�*��4�o٘�~닽Ws`���í�/s�R���y7
Wp��Q
�"�$6$MLX�,��-����
ܥ�wȳۓ}�&R[����\
b�L�� ��>������A
�oc
+u�7��
[$�g�T��5
Y86�i�J=t�G��C o��_�NY��Xz�}5��I'��ǖ��t
[��V��S�
b��;쵵��g: ��&m��Vg���d���y|u����mll`~9��mO��V���(PW

�h#q���O����G �9����М0��f6:`�a�F>:�b���q�����ݫ�������|XO�~�w���o�}6
+��%�p�$$d
̮���`f���BV��Ef-
D at C��%x�b� �)�+dq��_�s�v]
D��',C�q%�=���'U쮴R��͓�V�7~����祇5GbjRm��'��_��;�|^���l��PQ��`y���q{��� O"`<�o��,�F at A�kX
i��
42;m�#*Z��K��T�1����bz���q���s~Sx��*�is���o��b`Q�ڞ�w%�r~�0$Y�f5 �ɻ�����ιyT���a#
�~�,
+L	����TmX����8��ڒ�qpP}����IRIHA��1�0)
i�������@��% ���TI����
A��[^{d��Q`K����v�]�)xQTG�d��)ryh�՝�I5��
uy�W��yI���7�+�����ؚ%ܰ=h�2�"Vg-���u�0�Y�
���/�ϱ�	?��Sv&,�%T�9-�/��8��A��Z�}
쎥w�k@�"J썄q#��sI{��ͩ��a
�5��� �%
jiM5�f�DkKY=@�v'L�N�%��崍K�]}	�,���
澇�Jj�����߭=i8�}Z���S�aEvU�(��¶�)5`
[r&fo���
*P՛S���1%!
�9��
��	�{|`�Bjbc���'
���͘(
I
��)���k3��#Rs����(��Ґ�.jw at E�]
'�9�	#�R�
=ʺ�� ��yRY`�� �:"e�Ӝo`gjV�a���
+�{��1v�
��I���L�IP�JV�_��
�h��^6��6���5::k�vmM!�F��)�m�E"4G�	/`�
O��PK�>]{��
�Ͻ{.0n#�>&� bZVg�Bk�kzNG��߇�C����V��)y@�0�7&{~�
��j�Y���
t]
`�D��3@���
bv�&�'4��wu_��W~��!:'�FU�¨^L�A5u�֘R�q���Jx��\`�PZ�u�yG~����fA
�-�����@Z�뜎��-R��]7O���˒fFw��%<
BL�쌪��Y3��b��ێoRZ|��L��K��&����c[{O��>ή)eĕiv�w�p10G��O+�
\�_���=�
xZ����rN�8(ZyC���w�q�[�)�g��^�!���B��<�����(�'Zoc
+~v�}��kc=?lM"���H��X����!%�‘���U��|W�Gϓ��=TtsS�,�t�I�
()�a
�)e�w�d#�K�)��Al^ٙ#�LE����u������Y~�^����+�yXDHwnΠ/�Oo�_! ^P��:f�Ni�w/��
|ڌ,�<k����(j�#u�
�사�1��r��~2e`c>���W�Ҕ���)�w�){nh�ʗ����0p�w1���oM$
(�5�7
_�l|���=�ǭ�q�S+,�'����M��Kjzc��A����e4�Bƞ�K
�!c꼶���WO�_���T۷�9�����,9���ݟ32�rfBuƌ��ңK�Vz���xs��
Vݖ�b��2����������?
�'��
2��5�ꌨ�wi
TW��yN�
�}y;�)c!T��!�	`�,	xuBC,_z}�׮�7�	�c���~�
+�_ߜ�U-�.o�QJ?�٨�}�E��	-Au�������+����9��
Z �/�h:�9�z4�d4�%�]�
�X�)������ϻ���L\��Tױ�7�GB��Y�����I��ؔ���_����
LT�����J~�띊	�gg���?b�6�.	��Ńy�T�Z;m�w�L���`���^��y�e�
�����?�gQ�π�Ye�}��
P�k�g�cz!!k��&fgLK�_
�=����讃ذ�`�\e�A��C���T�ޔ�ߟ5�6Q�z:����]����Ӡ�o+�-�2
�N�0
^�y8��R
��%��:�^럆�^y������rvE:����!3	}ߪ�M���Ѓ���v
p�m��7���4H�i�ȭ(ЎK�q����t8��/5
�����-�RԀ����;E���H9�=7,ʻ�� �Wu��
����Y�?-x5g��v��v��^���zg������W���s�7�{NlM��&@-kEZ}�+^��A0��(�$ҿx%�<�p [...]
+�n���;k��Ԃ?��%����G����>���o�F�<4����N^���������c�������������_FQ���$Qq������XS����T9�O��n6��
�n�����/���g�L���[�KG���9]�� yJ�z4������x��90��K����荧?9z�!B�]|���3g.~�]��t���QB�k$����\`uԌ���ѓsP;S\MT����i-q3�?e1#ZV��<�4�H�	-0�:>:cQR	=���:n�

��߳5MoZy��؞��G���EbEJK���PW�&!)f�s?j��c�8(.
+����
�8<
5H�^O(�u)��5JY�o�����愁�Tbn��#/lN�)�u�#���L�hmi
����I=�#���G��ڭq�Ŕ�ٽ�Țy���ӟ4��Y���0sQ>�|}^��߈�1�z1-� �
�oBO���9�����X�7��>M��O�Y
��5�����+�:�n����|;������
��ВՉ�Q�9�fw�
|�"�m���v�T��>�c�2��A0
t�D��[y$��&
&�e��Ԕ����R1�:VG�Dk_�l�~s��L�Di)��=����I�)�&[3���Yrm�(�,2^PC�
(�Q0GY����	�����4{���J�����i��9�HTX���:�Ԍ��O۸�������	
�2m$ե
�}8�C��ظ���	OXY��3�Z26i�wd�|r�.���<�.
T��'�-|j at C����	#����{N!�W~
���3�y� $�\Tj&�/i�I� �R��G9��W9��p�"�d�|R���C���VFo��F�]"N�'�f���R�>� ���n���
�
lL�LlJY�mq�.�&V��Fս�
�'��vX�6C
�q[�q%�Yje���%���
l�JkKh	�i=�j~��k������yRy��ǭO㯅X-i
����4qQQ5�"�—5<��$�!i
L���B�
�
q
�Jƀ�H��	=�9�����\x�"Ŵ�o�P��
+��oy>��*N���9� 
׳�&n�����EL��G���k��n�&e �d�\d�$&�,bj�,����2f	#m��PM
�6ge��V6<��w�Y�*�bF����"�=m�!R ���ؒ��������R4
��*9#8G��3�a�i���t~�R�˒jRMDKm��U�/���?����U�*���ϫ~����˴_���3 k2V	3ePӋ_�
��<��9����� y��ݼ[>���|�3;b*fkR�l˙ؽ9
�;oct����ӝ5JXi#�5�!�� �|\�.�f�"Z�&�e
C�I���
+�1���2˸�D�v
I���q�B����'�N.O���=�����Y�T����@M�rN�0kaófjs҈+�;��y�-j�_
�7��t)����7���6jk�Ii�;h�q=��7�����p���λo�v
!�'��ո�-�4i����?��e�<2�, �;�r�z�
+�q3�1f$�G�
d
j:��Q�
�s�P�&�flbf����u��λ��M@Κ�)�ȝ��[�	��
5?�y巓6jG�{r{���
E��T�
�)
���)n�ќ�Gu`
W
+5�^y�{4����
"V�#��
t��'���:�‚S��X���iJ��
�2��!&f��h�g��ɕ9���k���=�m_oOt~�pa �i�| j���` ����
�'�'T��������Q���9G�^~�<���r=2��+�
I
�:�H��=������q���N�	i�
���s�ɞs	5�.�`�SF{
+�Nl �h9��ݬup e�ғF.,m����>Z����:�Vbc��E�MrAD'��=)���qz}3���?����n�mw:��MK	!�wg�Z�'_������*�T�q�Ӻϗ���`x����)�b� ����f�%o{/��Pe9�>g��ȘIMP#� �o �0����]�T��	�zg�M�!��B��
$̜����ص�Y�Bʾ�ھ����
���\�鄂Փ3
�5�����=�_We�y���4��I��� |!a�&	5	
�N��^�Pni�v�;0�s��i���$V@]9r7�<pl�vW����� �3�=�A�LȒ�	u#��9�‹��
Q�i+��2��9'�/c#��lD�шK�S���T�ނ�΋�c�n���Et�ޘ�ޕ��I#�wKe�����<�:��6i
�Y���Ԙ��[
+n&�b�V|�_K�
h8�[� +�C�Y	��Ʀ$-����
/��={6|M�g� ��u!�\�OR��<DXGjL�i�	
�=b�4l�#�
O��xI��;
-�����c���9��ٓ7S��6&,cf��lRA�6(O[d��IL�k9=i-��%�8�M�Z}����
�+m<K��(M�<c�u�Z��|^�� 
�5M��q�g5%T����֘6@
�)�)3��Ky+��b�O�_m������\����͡y���4�$4G.�k�I#��3/�~O�9<
�8mg�"Z����ڒ��; ^��v�1-
�"e���@��{Ȅ	WѠ�c:By�@iLl��Y]a�+�`6�h /�5�9��x���$�BJ��ܚ@m��_
�ҫ�&h7#����ם��������?&Ԭ��Q��Y���EJuT#@�9���z���kc�ڜ��6��.	�(51�H��M�9�y����KE�΁P��;
���pI�'c�
!� �r�Ji*8q�i+�$�h�
+Ԏ�
������<�d�K�+	�q�4��I���54a��� �ɸ�����A�+�e�bA�-yq;m�b�f

!{oY"�[��^!7
�goi�e�%�C
��r�O���Y�

s�ˣ�,dDK�ON3�[�F�9��^�
+i3�+e���Y��Po�:FgD;�K[ey��	5�J���q�?a��V��K"Q����g�%:"�Ǘ�5nOY)m
6��V��W�f��y���_�=z�S"�
�Z(-)C������;��k9;���
z�q
�ʺ�w��<#O"`n�c�߇��sFj�C��/��w":��u�ƨ�X
Q"�s&j
��])�/�"U�,p�B�QYX/�$����W\��ۜ�حQ��� V��5�!�p�
b�, D�̶�� =�*��6�M�����tQB�G�ۇ��P�{�>�%VFtԺ��5�
��3�<�G~���'�ؤJ��/�j���k� ���{�-��=VЛ �1��9��� c�ĕ���dL�s2��_�*1W&|[��ݙ���
	�#q��Ɓu�)�%%�J\���6	?3;\�k���z;�g��f�E��ۿ\}���ꋶ/|����il� ����+�LrQ`F�Jn��5�!T�Մ�!-
`
��
��=�ZV'�-�.n
;���.m5�u���m�:4
���pPi��ò���ea�nZ�O�+��2?8��X�?,S{SƾsU_QX	8�3ketem\l�)b�2q�6|;�K#��;�	� N�&jS�DkI:ب��O˹�,�w����]��9�½%��ÊthoI��]��
����@,�l÷r�[�s��3����e�(��gf����k�Xو�U at M[�]�����	�
���gj�fZ[XK�L٤����k��Y���w��T�=����J�K
J�C�ɭ�%� a��9�S�u�݇5�c��xQ#�Ӂ�
>��
��@
����EB��:V���̮�_�+�FrC�J�M,�8o=ͺ�ŭR~X��xh�S>��%�<j$��^5�4޺�դ�G�A��ӟ�Rۢ��+���lL��ؽ���l�	WWޠ��T�&�ۓZn_d���Q��=����?�|�әM~�Q2f�	(��H�N��Q-��ڻ�?��C���yȔM�؞"\�i
Q-�
0��9���7���
_< ��;�������E�p%�yLIt�TY$U�0��ZR}T����)�Y���Pj���+�X
\eX���:|]�����ƻ՟p�0{.:eZHM�
+,oF����"�t}q������iBe���VKk�(	��S�?��n�spmc
}���'�����
�$%D�h�i30���
в�Σ�>ĭBRXM�����I��1�=3���-䆜C,ȯ����h�>|� �3�`��fR]�Չ�o�s���K~+�d��v&|�F����Y W1���FRm�Ni�{��]��9��g)����hB��5)�!W�
��0ȕ�
_ƈ�_��S _�<�_�
�z�\��y��
+^� �di���0~a�p��'e<�/2@�쭊D7���W%C9'
3�+�&HY���T�23�R���6��5N�yON�0���V��;�'j���]BN�#��<Ri~Y"�� r�
�0��s�b�o�����ˌs
Ov��
�U �l�r at _e�PYFo�� �M�LI���fm���I
�6T[9��dy����c@�Č"�
�ܔ��k�]�0.
���߁���zBu#4tL���>���ҋ����QWZv׆�ߥ~��g���c	-UӚ"Jz�o�^	5s���$��s���
+j�OA�z��>;�Wt,v~Q��z�j(��4?�YΟ�'3�^�/a��.�k���S�g�;Ϳ1���>������髭w�g�,ld���I�q�L���|�qtc��kPJ!
+jU��C��<b��A�@
؞F�ٜ�>f{R���םg?��]9�G�@�CM�"zcDE������I�5ka�%� ������4�{���m��~�3�,�Ob/z��J�9�=�X��8������Y.�YE�R5

ti�!d�-�FFF�xo\x�c�v�E�j���b̀�ͭ1q���c�6�nN
+`3�5T�0F4�2䦜�G��i� f�����H�Pcv�G�@�v��딞 �
�4�
��s?H?�ZwE
������<su��x`ɮ�C*x�
�')+�3e�wg\RY�&�m$ʻog
bv���最�;T�Ӽ����]��K<����[�Mژ���꺈�\1��ԁҞ�7��6��Ҩ�ڐ�0�*�� ���Y+���<CY�X�q�q{�biai�T_�K�;��
+K"q���Aufo	�H�Y�L�|6����@}d�
,DT�h��Q��A�:���|�>�yn�ȯ�������TS꒖y�68ײaQ
�+P׳�GjHW�̬n�zz{HM�	~�'U�UlX�!�F-<�Vo�wts
-c��
+���"�)�!s�޵1A�֔
����ة��I�KWǻ�EUز�h@��/
6!�<�!�mΡ/���UY��$��#*f�o�X
��ԅg�U5�9�awm����<����w�� ?zSjru
+��
�Z`��(���چ*N N�#�e�"
+��(�=��Q�J�
='����y�"g–eA��u �
+�OXI�����3��ط��sZWH�WU�I�L
��Ղ��S�)5�3�e�d &%t��
���D��^@�%̔^HH���
p&��%��W
���
�Sצ��	���s����p�a%TW�
I��[
+3^��&%떈Ү[ �%����
������q
�6�v ��.~�
���
ۭg��;ov�\ja�Զ�a~@okHϻ�C�9K��$t./�q# ?�jZC�J��x]p�i)

5��@���|��Q�W��9��ü�C�8��97��
�
\�����P�b�(�|0�� ���@:�'n��$�
x�2 
h��A5�:�a��m��/z��' �	5�&f�BJ�3� �,��:��Σ9o?�{n����������Y�N.KdP�KZD��PsU���
�`�%� ���V1
jn}�a�V�ov
��w�r��q�3O��>�o
,��sy���V	'az�.b|n��y�MD˸d��{`0�S&�0e���2P�@�k�;*B�o�Z�1
+�9��Tn������hdQN	,���
+N������"�
�4k�0 �(����dB��i
+Կ���	����.g�	���ж	� ��Ii)
�W�)����5��?�{<2O(Mi��Iԅ����&!9i��B��D�W+��~�B]�jϙE�
���"��\�(:��:��+{Ϧt�����@�O��ٚ@��-Ra�.�Z��s�;�?a`v�`N�,D 踔V���F
����������	�1�ct���2~�2ta�(��
 �Ko�g�S`=ʣzf�=
r'ti`P�v�y��p:�
~�s�MM=n�cr�� �i���6
+ at 3<f����8�=/��
+8�˃��w:@bz �{�^�`�%�gm"�.�K�K�Y��h
+�=�W�M2N�"��u�? �e
2I
'���%��y@���>�X�o��kRz�+��8��&�{����I�[v�um����s�!�:��b�N��lY��RI*ff�%Y��\� (1sI%'���;޹�~���������O(� �hE��â0�
0Y@ϥ
�ؔ��EB�N�q(��ֹ��A%�~���
+i�b�����̫e��k�a��&
ۯl���{��r�^�rf��gZ�l�͵���.0Nv)�hn�OI�=cxl��
+�ꇏL�5�$���yr�^Tɻ��"����!�0~(k�u��Ƽz
�&#���b���}eU��
�]?����@S}:��$�b���Ҷ,�Y�!��
����q-�
+�I1�u휣���傝QZ�s�5��Z�>cj���#��K�ٲ��R�я|�[�`��c�t<zH+��5B�}��
�?ޝ@<ݝ"�Z���]3d�y��t���c �
+Z�e0��zw�>)��r��7���p�-�,"�<󰊅����
;��Sp۾@ΰ�ߴ�a"�
�G�����x �S2��`��
��E��S��#-���qP�c#�
�
�3[��2��1GIs��LcW���
J�o����CX-d
)�$��^�mO��oz��g瑳�6�QO\

�[V!�C9Ԫ_�(�(�9�3�w1	AMM�SYY퐳�MCw ��� �� �{L�gYLw/5�xd||@�D
L\����ט�?6ٜ?7YL�
�e=�S���%j�찹�
�b���:�ǚ�1d`�\JxĶ����>�����z��_5YYk�r�
���'a��C�7
I9������8��Vh�ӂf�h��|����*�9�\*�]����=:ҭb� ���t,�_.�Z��e���U���a���d���	*A�ǻU$p/5�neu�K)�
��G���Gk�CA�J�N^�l䳶��M��<�	F=��f���1d�1������F��Ru�?��/ys(�0�#i��W�v%<�
p`=B@ˡz�
�C�(�u_�i0��V��0J��K��Kb��49>l��=YV���
����(xx��]f[�d�el���S4�^�#~\�G_Q
8�*��]�Ĥվ���L��
"f�y*�T��Ӕ���L�S΀9����yJ�����4>J�{8Ɍ=�?�I>1
+�Z��@�zT���������_�u��ⓐsmK�ԝ��ǁe6*���Rb��a�L�����K�}�w���o;ȯN��Kc>����z�2�SBΰ/�<��1�^
��Й}�XE)�c�'
i(h�ԧ���!��M!^�l�UE���3���rP^E��Or��^y�}��&oH>'��>g�@�n���f��~�.T]i���2z1�+.)}k����>5 4öā;�<�_�4��ն{4�n�;�,�c���\�!
�
+�� `I9�tb*o<1�7��!�}B���N%�5Ȟ�)�5�K��6�
�L��Acm_�T�y	��%.y�+���q1�e!)���V�^�� ۻ5BV �����pHӤĕ>ҫ#yu�� Y�έb��۬��>�O�
+j��R��G�ʙp����Ѱp�Gy��DP���k�*�mW�M��}mW ��1�3�!3d	ګ%���5��<��3
�H-�&B�򺠹��xMXzD6�y�EL�87�w��ڥ�i?~��V5
��:B��>���X�b�ZJ�j�T�C�0�-��l.����r��Ju籙'pH(��s�����\��{Ք�c��!�ZG`���=J.�r��<5x���ua��:�
+�a_�!�r>�
�̩�mL�>�~Ȼd�!�W��r�)R��;%�=ˬR����,n�
�u`��c��JI�N5d�|���瑱J\
J�]�x�������8hݫ��)�P��ڛ.{�֝{�1�O:Rs�^��%����
�hm��O���
ȩ��b��%�wa���^(O{6��ە�l��V
T��a�HЕ��/�ݱ/�<���-,�&�V�eRd�W�g�@?�l$�Ҡ�K��q��c���%!74�p	j1�#3��b�s�s�1�]K�Io�=j�կ��N@�8l��Ik��W0&!�p����p�
�
!�q/s�>-���N���Vp�ah-B
Xp��TYtK����
≱�٫b �z���k��
2��C�Vķ�+as��W�~̥�kw(� W�ל���O �Դ"�2%�+e���\\�@.:6��!�����ƚN/x�})&jk��:��k�+�*r^@�Ğ���Bz��2ܞ���/�d�,7&1v
�2�}�Q��SMop�
h��­�\jz�m���6�x|0�.�43`���h��&�(`W����C:��L�27&i)GF������+5��UqM �# ����c5 �k����Ed�_W��3�*���c�o�FL�[AHjH�
?�~�I(�������է����a���u�02t@%`���;�'��W���R����^vd�0?Z���	��V�I\��N��LL]+�m����,��@
�< ;��"��7�h����/�S�	Q�y����$/��q��~�}�"#�%����i�eF�m��mſu�R���s�rXG� �
E
i�|�]�
K�b�5ñDI�Ma^ ��i�~9��bw��{S��+�y����/ZGK
�kkx4ho`GƱ�Bt�)��ș�%h��╕�
k1����w at fz�T��+��^9��Q���d�I��FA���h�*������|��q����%c��M߳
�n�{	/5�����ʩ�Rv@�9�?
x���mE�GÀ.�_�e�H�Ҳ0

%�%ܦ����y8hm�:OM�=ۚʽ��!��G-�}
����U7�
}>��t�m
�Ht8KN�ü��ߥ1���z����k�d ����i('���&j�O���.f\��I�G��z/46ʚڀ
�5,��
+6�>9"fw,�7�<.<�O�B���W������ �y��C�D�N��]f
����,�P�)� �*�
+21�gb< �
.�Q1�
]�L`M��m`<Zh�U�ʦ��N�c��z�|�O[�jU�������Je�1�Z�h:��_{��5���X�iU1ۧm

�A^_�
�ٴ��M��h�
4r��5~���^��<٪�
�U�
\�
IǺ�*���fq�I\�7�׸젙�pk0��K�!3�Z�	���*����
�J��F�����T��<�u����=ɹؽij�s�
��$�=1�H�NڝJ�n�O�yg ���)-�
�BH�r�W�FC�'*�HG-9
	��	�Y$���"��,#w���?�˹�7��лD)�h�{%�T���� 旰���kֱ�s����~��C::<�"e���L��^�]�-�.�Ӝr|��`��,
�>�XO�
C����l,����Qm�H*��^%2:������#��*jdR�[�.�Oѳ�s\�k�U��3CFb�[I+�ElH����K<�GZ�́sKPQ΅����

��z
�[BJ
��x���K�\���_K��hH�hm�P?�PWոԵ�.Շـ��
d*\X�D���b���
 ��ѕ��������z�p���騐��נN��&R�_�J��1I.9�2��B�}��!�
P�
}
+bVP�D���s�T�ҫ�
�����C���L7��
+��֡�:ra at O/
��뫚Bfa�WC/�)
1�-�%�͗��]�D�L�Z�*� ?4����T��[ՆV*��Wj��A�BsyA�@�3�'k�r0d�
*?�WuB�'k\��u�-mm
��J�_'���x���
��~qCh�'<Zeѽ&T��R���Zu��zU`���U�jG 냬�e�L|�t-fQ����#�;� Ox̓5�#<>�-�KIɁ桏�
�F 
r�1�{�ϽJjt�r�� �k���z�HC.�*`/m�Y�7G�.Y��_y�	9A

c)~K�
i���$Ԭ�El�m��%'$��@���U��\
���I*>��^%{0
{l�L<�=�u�/#
���
�{��ڣ��R��.[�3���q�G6ާ$eY���=^7
˨h��;BH����.����c(��p����Iz�LxN

�3���
+��r�G3�q�I
�.%2�%#���
�c�
s�r˜
�T���ݱ� ؄M
@�
Vy�}	)�6�C���>��m���ڦpI!�
6p�^%)Ƕ {v8[t?�9�r�
+.6�e�|*b�_G*��(�W9����
+'�,n�X���X
�i��W�(��8�@���J ���WٌcK�@�\�
+�φM<ޟ�l�k
�kt�[^��p1���b�0��V)&�!a�����cCmǑV�wJ�v)~�H�9X(}����*kdK�����.�!��J����kY8�D� �S�l�[I��i���A�G
WZ� =Bvp����A
��-R��E��Z-o
oԌ��U3�j�f�g`��?p��~a���?�~
!7���
�� ��6'�/l��D��V�����B�
VkB��Áae�̦���2���������I(����\�rr@�Y��t8`
+ at _@u)�Q{��e
lpO���
���\@��
+��x�����Wy��qS���9��Ù�'��9!���/�-ç�dttPY���|8ы+An.�-{h[ eC��A>Ez �˄l���l
+؏^d�@��<���z���%1ù��٧(��YB�Oj
+��9�k�<�ű��ԂG�Ax$"^@UQ�VԄ �A����7�tܱ�P0�su�}+$��F>7�a��� �k��P��1ˡ9�pك0Г��0(!
*�!A������O�0�!
�̩$��r��맽�ų̦~\�����?gX,�UI�_�A<��Y�Ԗ��TTT
)����:�
��?S�xw<�m��_�#�ϳ
+��!�W*ZO�4dPtXG+�k�%
h�W'.wiXx���
�|��A�
Al��
�Or���P3'�4ܱ��w�Z�h����
�׹<������>-�xl������L	_�ʿ�1ņ���ۥ�#.yU�S��ǭ|?|�ʮ�6����Ejj�X?�l�6	�>#�ҫ�h�*ꂦjH��B�M���jش�zU�o��wq.-.ũ��{��4�	��0ެ
<^-o8u{�Y5x��
�k�����D��
+h(�

ґA��)GzjY��$���b�_
��q�Æj֥ ��-�=��i��
+�̀���*[B�Uݡ՚~�n��C��ظ�I(��q

(E�c�
��۔l�S�F��~��Y�rXX_^
6�׆���f.����B���@���G��m���<�|
�)l�С9n��
�6U�
�j���uamEuP-`A���%��
�)�9n	.>�(y�
]v���P��%.«`c����L�CEEXƀ����?jj�B�:��=\ $�,ؚ��41���
/��| 1��x��BA�8���RD�u
�b�/헝���a�Htd�2m�7!��X���մ���\�[A�y�
Б�/PK�{p�����X�G�[#���U��7jӫ���h�
���vkX�C%�P�(�W�
wȩ'`lO@

i����C
��)P���bw�	 ���$��#�7��0|�W�B55��Z�X�Z�j����z�9��_(y6��&&I	�1H@k��
���s� ��
��b��u@��Ck�SA���H���k�2��9y
B��"5ۯ�k�j��=��V(�5"�\����A� gUTxt��>c��PY�3	�>3���Sa�e��&6��TJ�۞cd�T��C�4�ި
�W��-��&�5Q}��G_Q�Ե��ku�
cEӮ��=TrPA
~b"�ɥ
�ȏ ��՟f65l��zT�
�i��Y��#=6q��ya� ��
�>��֥����
���8��eE ��sC�e}J>�-e�<JV�G�#��
�fȠ��Z ���K���U�R۲0О����
��4�Iz��e������&���{@6���e~�5N4&xV5~
�z.+ ���P^���5�~a,��;^��sa@%�;d,��
%չ\S�\*gx,�/i%V�6��əGr!�IT�:���`� [...]
+�^�"��A'�U���)Z�u�]��U�"�
�96ͧ l-!e����0��c#��S��u��\��G<�VՇ�U-�&q��
+��T��=��{�P}y�b�1\�G
�6t>a���;�|�7�z�a3<JT
�ydh�kk;��Z69%����_�&B�����ʰ��*����>șpmA
1ۭ��95�L�|DP#d�+����=N+��#�<O,
�u6�)����ʞBs��
�gh�r
�8h�j'������~����
,�ɺ��hC�>�!n>Z7��8���|��
��D>�z�LJ~\0T5�t|�SSQ4�}���0�O+d�
�#�����j���ţo��'��&/ȰP?W����[�3|�]֫uj�}y=������- at s�
��<���� �r�;>CM�0�(�{u�"�� c�*J��������0��Xp(~��
+��N�G-�6)l�������
�ъ�ѡ��:t�y��F@�� 6<�2�юER�m��\�fz �B���
+b�si�'���R�49�`
��:�{{b�1ò��G at nC�e�
���j�q�˂�\*Ʃ�B�H!��
Rrp��
��SB��(��˔�)J��8)�p�W�S
��T����?G���
����w�ceO�@�@�
rΉV�9Q�xA-
!kI�yw���
h.)s����&n�c�
z����́
J��S�}��~9)���I�@O�^��΄�A��
�i�~%9�''d��1��%F���a �o L|U2����U��B:|z@�I���%��^ ��ze�
}g�Y}W��.y�s�cCPW��>U���W�%
�
�`��1���B:BfPCٞ��ki0�w}:�d]�ɤB�
q(E�=���G����0�5�~
	rd=��'�
>4�N�9�ӄ��I\�������ƣ�5ݡ5���
+
s�N,������#
);
4;�Ƣ~���'��.�A=��u
4�h
�h
�H-=y���t����o� �C� ^��k������k��9��e ^�k�y
-�sU�|=``��r�W�J��,��ìS�8�8& z�h��'�*�t���~�0s�о����ݧ��+��G��f�B����d�A
�4��84l��N�l2��K���v�Dx���d���+�iȹ
5)3�#��4�|�Y��R�l9����22qGr�m�fk�������(��f�k���Z��:��l��7;#e��
�n��\
+)q)!%߯�A~pK	I
))ů��T�R�=۹�Cy��_-dx$,�k��a���}�]K�d�.�6�}{8�~}8OOߞ$��N���%�h��u�S�0����
=ٗ������8���G��d�|�a[(y�W2�ˤT�
%�X�'���1�g�
�	5�1���O�^:�P�JR�G3�S63l�2�rf�}���R2O ����������g��A��
+t���_��/�Ɉ���g����~b�h
+��
<��w�8p��Y�S�f"�%�y���
.:�p��>q�M� ���
�u,�_K̶IJ_������V ��C�%��QS]r|R@�������D���%5�`o
:+�K��yah}Oł�2B�^�L �	��
���N�Q
}l�c����a���rB�u
�ƩDE��
|Z/�yd���
86W4
��8

�Y(�v�|��
Z�`\BFȇ���k<A�@.
+�Y-)�
�V��0�[�g�����K��0q�+
���l�SIͷ�ޗ0�7�Iq
eu�GS^u�@��E>
+X��g(w9��ɇ ��5
�S�*ٞ��
N
�	��H�<.ڧ����#��cz�R�
X�h��%ëU��`̃j֧䠝RR��dɃ�Ѳ#�9�;h}٣�ӃF�s(�y\����6�}ch)�}���6C��
F>t�`"
s��1�K_�Ss�O۽��;��3�6��>�x�����l7�k�-�`�:�h��&�
�;i�{����^�]�4!������*���Yxy�����0�g�S�w��
o��=t,�]Rl�GFH�����IQ���߬�ĸ��U�R�K�W�y�#�t��,�E@�O�I�Ӹw�^�
��pg����`�e�<:2 ��1��el�{��t0���.r`�%, � \�|��p��
���H�q�}��S�M�(��+J.�sDPM̀�Ĝ@gq4|�
�Ҋ��|�_�,;���_C
�Y&$���I�]�|J6�#R=
+1ۺH��șe>9�ع���BsB�����8���29�1OJJ��꘨����f
��`
�ܳD�
��a�!Cj6޳L+�,������	̋��}s��%�9�.��r�}2v�G�,:�"�۟@=w-ac��
�g���3a!��>PO^
��L�P�Q^�h�����
l�9
�ܡ=�~%�
ֲP�:��Z�OMɵK��[3��.9�皨���"�5������ip���u�fs�r�s��Cx��K}��*��=\����1�2n��
	2�'�%
Αͣ�7�#��yJ6���$�]H���g��
���_��@l�	
y��)�-�X�"�7�)ڟ�$�

w8r8
�o_*�o[����~0�.8�UT���]X#	��K'�m
�zwq�~k��3H�=g�nP"
M�KƆ�
{ø�{c�(�%VZ�����GB�9��G�>��
�?�
F?���"Ljӄ}G�
em�y;�����
��� �.�k]���W<
e/=�%/m�ظ�Y>�6χ�gUb��Gm�
n
`
�`�$��#��
+���!%8f�I����'�
��_�(��|`����.V^���V_�����r-�ⷡ����`����N���Ev�_�AM�t/
+��y!f��e�(��o.���]r��U����ɑ�^r
r8��w�ERbPM�5,�K���|
�)
�����Q^�q�Rܠ�
j�m�9Zt�`x�9aw��я~z0AIu/q�@C����H�!j�dw~����ޒ�[=�G�)J��A��m[ %X�1oơs��7^	��~wc��&��ʇ��a싍��떞⫖n���a�s����N�C�'E���,]
掦vy�y�'�#�Bg�3<��
����	�;�"��J$�y,/`���i�3`�
`�A����3�"� #�+���5ο�& �����隲�:g0���{��{�t�#�G. ۗYE�#�W�ƒ_�
��$���㤸OMM���;��x���RIP��w f�
G>V�f�1��^:C<�Nc�Ag��z
թd�m��t��,%�
��^�]S[��
�
�9�+�
+r�}��-�&5�
/��v�h��`og�F��H�@��
��4P���c����[�e�
�����~��En�bV�q,
���k��[�}���[{��燣��C�+܋�_�i��Ԅ�Q�����ۦ�˳�دgy�_Z�on�ß�AO?��
�=�
�>Y�Ȼ�ӗ���9������9n��83ӵ�-��ӳ��p� &��+��B�vO�ޮ�e��B>�&�;'�ۦ����E7Ga�l�%m���ƞ��s¤���J���x$��,�yW��
+o
N"^
N!�[A_ۦI��B����{��v/Uqf��~r�Z��J;궱����u
隣��b^�l��/%�Ő�gX@�S��� ��5
�[N�sJ at n�r1^��k��W�-9�MM�ͭſ�[a�mt���1;
'D��i��	J�����걩-�෿�����
�^T�C�.ه�;.s,��������_�(��nH�y��柺��
�����]EW�Jnk����)���������<3v���
+��e+��?�>c�%�
��_X��o�5<�
�>ݝ &.��|�d�GF��üڇ<n�j��蚢:�G]C���^�������f�k��Ƒ��=�~j�(�bz�w�ؘs�1����E�nX�}�^���
ΰ
��P@�qό-����_M�#��Ҕ{AՐ�yzc��ʼn	�s8�w{����X1���K�ʸo7{�~�JH�G �;
ԡ�U�5J�\i+���Szk���wYy�)]}晝A�C��?�u
+��Wӡ�j�{�t�R�󝡼+kmi?kN펖>T��ݰϐ3�Z
�>ON�(��֕~NYwj������?d�}ӇO<�چ|�Տ{�o,�hh(�`�@��5_���|3Jx��j
�m��n�b��O2S-��G[�{꺬啙�W;Jo_��I�����'�)�>³�N�}Cc�����_-2/�u����G>4����6%@���{���n�U]m���o�U)��5ɧֺ�/��O���/,ݴsK�孾�;�76����
/JE��s�
E���E��.�I�if��$%ng���#KO�M`Iu]�i��ɻ����~����
+�ΰ gk�
��^xI[��.���*��iA���Ӥ�=PO�g�È���m-}�7�
Wԍ)?+j�~\�H�`�CE�4<�k�U�7�}}������fo��
�#{��@�\��G�vM��Am�
��l���1��^�~"-O�~gq��G��q
+�
+ʖ.)&f��0�k�8���:�'�0�[mc��L�)P�w����G�o�U9g�(�b�?��D:�L��ԉ{�1Hx�k*��>C��N�"�3�g���]F~%�H�QS�s~�}
+hr�G���R⭓����қ����)_-�Ҿ�Td�����4+��z��c���?A�[�][o�[��1뜹��*��\��)1]׉�5FMvI��v�hi���_�H��>N���C��/�������7�c�wy��elI;�^F�s.���w�"_���Ԡ����RS�R>�!�Lm���V�M��_t��g-]E��s�I]��{����1�yP)�z�g�1�o
g_�
ʺdnN<e�̾�Y�d���`
�do�c_��]S7$�V��}�,��ZV�y���˺�����G�5v\���}>A��t���ْ �Ir���藟M��F�=�7� ��!�i}���.㌼2唤<��9v—S�.2�t�v��b{�;��� ǧ�ڴ�;��7�qߎb�|�)���܁{���>_o�F�g8@ߞn�®���_Xm.�����IQ�q�܂y4˂���*���u�`��օ�on��5w����_|�kJ��`����G�3~@���F�^�
�
m����+�nn��U^ZV��������F|�9 at x��	��o,�`h.����=7/�9ێ��� 9�����R��>��ryƩiv�WK�)?*kSҿO=�;V�hL}z�q�>˅�
Lӂ�RT��R�g����+�!������1�M��[�fm������_tk�=�*��+���gd����
GD٤�B�,)qx��	~�ҁ�gx_��j;�
ȗ��ՙ�A�|q�ZW�ݭAb���욼:������j!bw��q�ry� [...]
]�iQ�Ms�-���X��zk�ٍ���4�Y����z�T���q8����n�_Z�a7��.�k��(*N���s.R�W`�
-e7u
�g�J�m좱��w��!Q���G?��43�c�Wj�@?��?��
���g�o�5I�����}�&�bq��!
����8-m������'
�O�_N�#>����r��� ��s���>Q�K���"��$��Zw�o���f�I_��|�$L�a��q:��o�����}s�v�"㜼2벲2�L����p�OG�o��ҕz���r�����>jk� �������s���/1���v�o����q?t�.�^�[�@=Xm/��5�z�ч��m�]��<�G��'������w�Ͼ���n����^Bsj~	.> �%;�/�q~�
�����]������M���6{�׻�g�)��W�1H��d
�$JEo?WTF���g�� ��J)|��NO��ͮ�G���DS��49�
+��
�I�{��r�g��̱���"
[簑��q�R/���GKU5���
S�[�|��[�h����Rp�Дq���v��Z��9/&
L�
6�1O�-��ͭ�Fh1_V����i^���Ę[01�7��h@�Q��W�d��b�}U_����;�%o,��H��u��v~8
#$:f(�.�[�'�Z���W��\"����]���tNP�z\���x��lo���VO�eck��c����[3�9i�+�e��
97�`�=%Q������_7�Q��/���~�P��g�
�%
�p��&�G}]���>�-�"&jk��ɗ�����{`�w G���Λ��RNO�_}y8A�q���S�<�<�?'�Y���@F�.���i����:����_��)��	?j���{��Y뽼TmS��媌3���_f��
��K�m�,�b5���hL�I٘xZלq��\��F��rM������{
X�����;���:c|���D�o]u�O����~�򲗟1��[[�L8V��;��V;K��w� ��^]�|��)���L������5B��m��G������O�_�c���J
�c��������ܒ��r�o~v0�O��#��[�~V5d�ּ�9'��<;NJ�f����f�EU�/�����ɪ�����N��2�\�U��Ћ~��,�٩���[����q�G��Z�,9mx�<O�3���y������ʆ��K��g�⼛{c�|K��ZGɭ�~��!�S#`�y^ҩ�����Ԥe^�W]��C���N�K�(:�?jZ�G%�p��-��"a�Mׁ��ҍ}:��>=�H���X�c�ʱ��[lL���|���Vr�����-�ߋ����m�WA?����^�'�	�	|��1󢡽�����l���ދy��[rw��p<⹤&��J7�u'=��Nr���R�8��$#��v�WS̤�))�GX74]�W%1�?{�˷��������A�	x�ܑ���9��}����1f)�Ԭǟ�=��o㢼� [...]
+>YooL��Vz��
m��i?JY�O��>놿�s���9IZ]��j;5��E{׍z�?#�ן+�2R����>mnC>vL��e
j�~�p���7��1����*�~\�?�L�v��q~��n{��L�B|��)����9''��L�n�v�p��.oA�T��<u.r��ؗ�^�=�89e�Uf
�<]e~'g���uGZ����:���=Iی��֎y�;D|�;�}�3�}�7L+r/���EV����)��^
�+�˔�]�y�3�8�4.�1��r͓�'��fԳ���m�|��6����?%�7_n�����L�|j��d�� ��g�ݘ��R@�����%|��$쉥3�����+홗�R>0|������09Rݘ~����
��]�_v��|+�K:�oν`�#&V�^|;�L���
�������Ȉ�����������Wۋnoq��Q1���<��QRw�P���s��vf��,y�ޓ{MU�rF�Q�x����&���
�lc �vd
�,�xu�z�*��/�&��<�<#�`��m[���g [...]
:k;\xǹ\��:[�d�G^���W��x�O|b�����ϻ͹l�!
j�
~3u�����uE7�	��jKn��"�F�[C����������xf_�7���
 %m�񋁏_^��[e������A�vL��M]�7��ݽ!N҄}��I{ٽ�����
D<��3�

��.;��%x,�O_Yo�Up7'hɆ6�#��=K;���~�:���
������5e]�
%ǂ뾾,��v�����������T�kAH�k�\��Kr,74xdBcw٣Ŋ4PC)���_�� ���9��V�po�3ά��_�֩@�<��%
�qsg�ٗ�YI����x��:Xt� d�CP{ø7�1�3�
�.>�2 }���s���֦�g����%��RM��	^�ck�u��L
�ze�og+`)ޅr�jk�%]C���7_N��~�ޛ{�>�xm����
"��Ͼ��ˋ�-1��y�
�"~����mɼ���z�p�N�V�hLw�`�\��a��g�ܗߚ��~_)}�>Xz
�3B����
j�KR-ڙbdZKn�t�ޙ$�<J��rw�Ʈq�=�ܒ�+_k{J߹����Ib��(�����	d�~��ԗ�9 at 6��/~9@��~�}8]N؛� �Ms
�2z�[E����)=�*�z��?��3n��9��9޵�.������ْ�cE�C:.�d�z�)�n����j[|ʪj����?AI��<.jm��B~�����c�
+g
�ڧ�
	�`sv�2�=�Ɇ�.��S���J����7����1�yݵ�M��R3�r.fg���>�J�
�r���ۀ�l��
���z����챲����u?)��f?ww���n.�>%H�n����.��Z{�í~�s�
=cu��N�Rt�1σ�a#�͉?S�}9ō����ݸg��vRS��p�#"?[*Ͽ�^`��JJ�WB�=��Ƙ���R~��կb��N��p�r�2�H�Uf����|�
wn��}��'c�W��mew�(��Mrc�����X�<K\�c�Q�1Qxow
c�����
+��(;�܅�9��F{�
�,.�>��^�A<�
@��
&D
Nqa;��xI]���;�c���1r�c�w�Ĝ�N��8�ݡ���*o
��s���۪�Y�5g�-E7gh��'s�S����NYg���qF���HӘvVߒ���09zc��y0UA�ad�[��n�@��Zg�I��JW�����_�����Lb#��\��
�P׍xj]�����1|��3��Fo�MK���YL�M�����D��Mb
��HK_��q����/&Y���ϻyX��J|�PA?��a�ZE�OR�;�7U��We-�G�Ab���
�{����v�m}
���0>�`���?�Oޙ���˸�N^�=A�����4��yt_ZS������`�����+�`e����ʩ�S��zj��4o�
+殲�Ǝ�Kk��u���TMɿu�*�Z\���p���QV�:$�tۼ a���
3�6�i��
�����٨�ցF�v�(��B|��J|��E��
�&[�})����#�
��`��8ņ9���9V��,9ek��j{��9�M����������6⓽>j��+{g�_d��(�a�V;�Q�Sx� 5v��藅�›�v|��8
��s�DZ���;�֌_

�7m�b�F智>��(-��iV��EQ�}}d�j��[Caԗ�&b�
Z/�-��1X|km�7IL�ɘ��ER��9��Z'+ig�Q`�e'K�yg���G��v�
��4'�7m3���ᅠ(��ڂW_�<�,hyɳ�1�CSw�ͭiT̡��<��0{3���)^>T�9>
���Ñ�G{Åw�M	��u�?Z'���j�����Z-ñ�~�C�L��vf	�;��x���8��unK[���qZ�j��� 6�:�(�>yk�j} ��҇�p.����k���
��;���l�Dȴ.r�
t�bU���	F�[QU [...]
}sD����{P��

���G�"呯MP�W��y�w�}9���`�fElu��+C�g�>���Ix�5���J�eL\b�g�;��
-�G���s
筬�|[���o}��o�b��.a�v7I�@{6�B]0��7lc���1q�B#�����B}��'
�kALT�Ͽ��H���Vp�:��4uS����C
���a���
+��V��.����S����+;���A~�� ���(=�6+�Z�Z��
՜�Yf����ڂ(�Gs�(}���`��651_Z:+�M-�dS��F?A�u��:߇,�A#��;*/]�E>Z�-�c]"d8eL�[[�����X�"�������
��>\ׂ��o(�e�
vc���p���d��
��U��'+-�)��F�m����N�Vd�<����m]�沘�:�ε�03v�y��e!ɳ,"�fye�A������qr�g��ڙ�� R>�F����F�FZ�]��Ko�sG���q\�G]��V׶����s��9z�K.ۥ\�G�%�N���
=6��_Y��Z�'���bN���~���׷z9E����
+�j
��v-�>VCX��Ȫ��lb�?�������;��v��-u�Ro�R�����n$��{ �;$�(	�����z��w��0WB.2s�}����9[��h��\�����e�2�����K��o;ʚJ_�l i��f��h��!��~l�R;.\�,z��=1�aB��p�閼�����9�wgY�����_��f:c��"hK�g���D��U
�sT��8\Y���ؖ�`[�ޟas�f�[S���>|�_����چ�C}M�m�,r�%��\w��-<zw��Y�C/�0��U��݄�K���3�܄ߑ�ߏ�|9������=��+g@�N
���
����#ظ�Č\��~d�_�L��y&Ţ f);��č��S�ȧ�
��!�v;��"� �8�OB�#�ب#��)�1��N��aS�����z��hcyƭzH�
�j���`��/uaÖ:1A�̴�NV���Ս��kEV\�*(:EML:

9Z���FT�qNr�Il�����
	}�p�:(��MP���G���W�i	�1
x[\E]��B�ݸ 
��ӭU��*v�q�Qp�Yzu�zޏ ��^k(J?_����WAw/��<�s����9����ag��rIP��X`h��U�<]#��h��!j��솘���B_h��O
+&�MSi�Yj���Q/
��|9���z����Zx�[NF:TT�SϦ�Mab�E���1�W at 7��'�fB����i�Kz?N�x֍N���	�T
��DяoG���=�|
��᭣����Q	�XYK=�,��R�T1;@>o��S7�p�N%�ճpv%1k��䕂�KW�x��?W�$�����H��OGpQ'`a�O`�N�N�>
|����'a��g��cN����
Jή��ǘ��}�����O+#�p}+����oC~���o�d�nG�^ �r���x��
�Gī�Ǯ��;��]>}t��9PηW��s
+��p�^��*d�|_���9���,��6�+-r KF�q�Rt�[M.���1j�� �@R
��ߡ�D�d�����v.��Ӽ������Vڝ�>D�%V��m��'y��x�J,�ȇ�$�g
Ϗ��yzt����s�'W���]� ���o�[gπ���e�i.O9��g���r
zr�q`��K[9�C�����Ӝ�ԓԬ���ߏ�x~��۠�W�Aٟރ
�=�|�����[��'O�B� ����anğ�F�[u]٣IF�
U%��l=BZ���N�ߦ��IL:�J|����}н�g@�]��w���2����A�@ Ѕ�O �>
z�w
��1���\;��� %viTW��b��7�H���z��
9=�xn�#�oނ��߁r���b_� ��q
� ��+�΁~;v
t���\�X9��)k!o�İ0�7?P���p��\�)�t}��Q!�y=��,>5�88<�8�+�
�����ˠ�ׯ�.��t����N�n����Dmy�e]c�S�$,dy��y��~;ׁ�<·<�"�]�.�;
��9^�����1���K��/��]� zp�<���N
?�?�{�����d��/^5��g�W��
�W�!��b[�OY�DŽ*��oaW�a�!�"������r���EP��;��G��y� �s�<���k���	:~��p�ķ�@���Z�Ǖ!^��D�Ю��oK���Qj��
���Q�' ���$�s|$��3Ћk�An������w��	�
�w/]�>�;���+ px�oc������+}�߼2�UV��<O�$��,�22���`i5����� �8�"*�Xܻ�G�Ǹ
��w ��\�:	��E ��_?��G'�83�Y��*.
����W"6��.q��s
N Ss�D%
�������.�.s{����w@�/?G'g�����I�؀�v����gW��K����A���&k����
+�Lz�Qh\䑊��#��_A�����ϟ�>>������\E�}y$�ճc����I~������X}'曼�ZYC��l�t��o7`�ת��+�S�o^��� }z�t��e�e�<�����e��ŋ�3����>�v�1��Gܟ���O��^R�R=����
�"�@�*�2O	�
O
`gP�i'B߼=�~t��7ׯ���zt�t��E�m`��._��:(��
9#���
yh���-rJ�� <p���UBH]�`�zh1�5�UH��¸�cA���>޿
�}����M`�O������e?Х3�AO���"�?
�z��xe^�չ6T趘��6�_@϶!?[���{]T�
~y���А#��?����A��߀^���9~t�?���zw��♳ ^��>{|$���s#��W��c��vf8
���q�i��Xim�CI
�m��J����S�} %�z	��u�% �/�~���_]��
�0�7n��\�z�w��=�7tb�eU-��b+�<�ijɫ�s݄HS)Tۉ
j%�܀$�
~����u����A~��^:�'��A�\<w����-���n= =�y�t�� �X7$���~D��yn��@Elk��Uq%~SYS�(���9�������cѯ^
�z���w@��
t���7 at On���2���#Č��BH��鎊@MC��v��4RMx5*����t��ڐ��
8�c!�r�Tv�(,�Oxb�bv��~Z]�������N\o�m�+�v���u�B��F�(�D��Y��mԀ�*��.:����#o6�X������
Q٧1����	q�(II~
p������4��]�.{�6�
+�(*�2!ei�;3�@�
Ԃ����5��[c5˜vaMJx��.�\�u� $�ħ�@��] b�����x���伛�0�{M=/u��
�1�̷��H�$>=���C�.�
b��`!_L�ژ��Ux�}R�jB`���^����w
����@A�?

�p4%$�hA|�Ifyɽ!&��l��]QI�L2

R&̫�U�5.��gVV��C5%u
�<,�vaz��߿?��������
�E��~�Y~�T�z�͠~
�P�{k(VI}��8���Y��`��be�_n�C)ڹ�#UD�:2����rND‰�����o� 9~��K��΂��~J�=�H*��N`�,
UѬ2Z�UB�t�L�\���3+h\S0��~\����� <h�`�
�.�32/ ��Ε%%������ �����t4.0�D��/G
+RRNQ�%~Su��6dKTM�W�,f��(-S�
{m�&�,NV�%m��jt�uDJԩ�/�Of��M�;�p�̓��w�ό;
.=&�)��
+��ļW��>�9Wg;��f�u�s,.����\�ES-X�UQĭ���8�dV���o�	}���#�w<���o
� %�?
+�N:U�*�?�"�L��b6̭f �z&oC�Դ���:��x-f���mƼ�B�t��/��@V:�kÍĭ�j�M&�[$<䦈UlW	YvC��f�j��X�
	�̬�a��lȢ�
���B�
�C4��0]+n~���8�+X�d�4@�������^)
��ˡ��m�(y["F�c���!��(�jW%<ԺLH[
�
����n~�\o]����H=�Ǖ�����G�u����겂��0�ݩJA��P�.k�r��\�j�[�B��Y��Gw�*����|��3}\ ��۫�e���Ҷ���(qmm�$��e����h�M5�%�pX��BA�T}ٲ��d�q�V)�xc����	yg
æ�5W7��eF��"L�z���_��:�X>�Ғ9�ڜY�G��1��	ڣ�ܷ�fz�\m��7gK�I��)�Nc����i���۷u��;����zt�b�!ii!i�x)i#�
4Т)����7��
�-
���j��6�E[�f���0�̳�z�;3u�.��vg�a�3_;�2
+�|�&lZ:dCNə!Dk ��4��卬�������*�@u����
�'M6Q� 
��E>�u��&[+c���J�S�c�=���=�x�$��("li�6��1��D`MI��Lc��� !jeப��������˦^F�vx�y���@�ƏV�
+
��)fi�`[�ŭ�"��KkCv�Y܃�f��@o�I9v
��"e�gD�`iOe�d+?z��&^���!뫫��v05��1r��0>bz <������f11���9
��^3�ַIv
u�vuu�Y^I����8.FR[����
1
�R����$��9�
�ɀ\��2]*l�(��R0+�
+ �t�"��eb�P��֘�L�����8
X
CE.O�3 �Pt`��UU\��
�]z�W����%�RL▜V�R�7mO�p�2
�,� V�8����T	�	B�u�և
]�'F�O4�׀mi�
+�>^�^
�/���l"N�Gɧm�}=�*k
-�=}}�SI�;մ�m)��"b�l���ݪJ�[-`�
�S]]m�����M	�ty
�2��0OS6�q�V)����J���٤=S������ b5�&'�%������"�p�/��8X��Kt�[l���eu}몪�{E�޽"���
#f�yyK�j�Q�1R�{
���e��F�:��WѦ$��5L�sFP`��
:�W�hOC,:0R�N%��,��I���Y��OxМ%y�q��bNFΚS
��lȎ�W��~�;-l�Vc�<ӕ��s�z�lu�UA)4�kt�X[
�Pq1�㤴�n��m
��ն.�![�
/@����%)���R7�z/7���0pҨ�$l�*`1;��`�����04�.&ez�,؎�	ޟ�2�zfc���z����[���GRV���ά�;:A�q�CՕm�hX�|�|W/�44��HY�7���2���q�,�M�tM5�X$8���䞉���9d g�W�������3=��
3l�c�v`�]���x
���1��\*l�C�I�.��:X���2�٣i�s�:����
���˥��:$�d�.z��������,��m*}�9���Nbb�*R�S�ϲK��;jj�[I���n��"�54��r`o�˴��y�lܦ�%%dɛ2�Oq��
�T�{

�N���-�śGJ�[�*���k�)�ЙJ�0;���2ݫ�mw�;�ʆf����k�x��]�jc�mc��&�FĨk���J2�C�=#���i���dYNjf�#o8�����iK�#k;�_�
�[]��QW�z��4��Z�6
���CvM<ގV��q̖�Q�-��e�R��C=mS� =�b�dx4
�n
�>V�ee �cҞ�c�d��
��G�C)���6�w��'���v���}[S]�)#[��t��Q�ֱq��t��ݾ�

�5`
+g���|�M�M�Q�
+vg�t��Z���[���w���g�Np)�
]���F������:\�UmJr�s�W�Y�
��$���2[x8��
��ű�Wn#��k6욄�
c�p���-�X�}-
���ֆ�^��g?�h)ЕR�B,h{
���Ӑ�6{wEؽ� h�j�E�Ƥg���
+�LM��9�6	;�J����4�S�[����1P�ѐJ�bj��1���*��BG�#��d��S�
d��tU�i�:ʋ��а���Q���-E'���	3�Шm%�bw�S��R+2����D?�$���,�c��Rw�,�
�1V�a�5����(l��� ���dT옪Z��u�[j�*ťlOV|�O�}�
)� ��[�2&t�����A��S�6�_@�"x��e��䕂�~�X_��<JI�
c¶D�ȵ��%��C�~�E�,��3�j���	��_k\ ���>å"��!�V�JC�
+����F���pL�26{+�9�PQ*6�.�!�ؐvL���
H�O=��V���bF�V&�.'�]j.yCZC@�n4U��[E
Ɩ���)��69<�.GD[D�求o[Rlꊈ�>Ӄ�as���u�:�[&d{��b
,w�<�
�ymWaӴ�Eo�: !^Um�O��<�MF+�)ȹ�ID�]�N���]>���?r;mW����V��\`���ؼ#�p�@*[�.}���3u6%�1�,�k��m��m�3Q@|��8t�n�Pq�����69.ť�fz5��Cu����:P���X��2���700�^0{zB���T��g���Ll�9.�,GZdȔݥ����|c<�e��Lj/ڛ#��Y|��Z�:NL۝�l�k�\��.��
���
52٫E��hqك���"F�k�� 6�*��Y��-:ɦB�{
��ݙ� �z-
+.ɥ�RL,�T��E�/v��
Ŀ9��G<�Ӓ�]*~}o��zݐ1^"�<���
��E���C�' �[R|���Ĺ5�B����eh
��Wuy�
�
��
�Ʈaa�Q�N1��us
���1v4<�������K��?W�u.-�ĩ&��ε����

�%#���D!�w������˼��[��Y�4H
2�z4��/%��'��ݓ�ۃ9OV���fk3n���6��"�����.�F�9��J�O
{�� x
+O�I��ZF�
�m��}x��P`��U;F
+�*A'X$�x���Qc3�2t��02|s�W��K˲���"R�m
�ه�O ���Q���7˝w,c�@����ڏ�vN�J6')�#Ȱ�~l��8+�5�,u)�0����˽}C��!�kv�l�+R͓���	T�e�
IJ@�1p�����B�GWU}�%h��
Ei��
�1��1
ؒR
+��� ��O��U׺5t��k����8ۏ����X�C�훪[=ƪ:���kW�� ���I��N�[��:-N0J�e!��������~���n�Nv_O,�2	
sj��#��
"����}Cm����Z!׭d!
bL�Z?��SJ-����p�V:*B��X3�φp�i(���K_��t�{L4�k^ؼ.����)�Y���$l�w���Un�G��^)�0�[�1��^E�xTL��AX�U�
5
�T �'���զ�Ņ]X�gX�gg<T:����Y�E��`��th���)Z�SWݲ;S۳5�Ϟk�}�؞��#|�4�KK�� 7U'\�b.�����H�
f
X����h5��3��yLD��?ɿ �z������9�e�cl*2�;4��?\`�~βh

��|������(�9��n
+tMT�š��;��}�����v��E|cg�Q��T	]*&dGM���PJ�G��rV�\�a��S%�y��
!�5��]k/zfb�1AL]�~o�e'��� ��6E�_�~[
��0��|�
������x�U16��{{i�,��������b'�#˃E&�?����4!����Y��1�aB�\C�����ƪ�[A�5� �u��m���l���>����&��lKYh���Q�
�'!a�=�O-�

���� v�]jR�C�N�Q��w5�h�
�2��i����[��
=[
+�[�	�*\�GN,r�1iN%.eK���E����
��5�eq
]�_�rJ�e
�c�������S��}5�tWK��k־���	x_ݓ�ID$���7�:�O6� �6A�X$T��1���]��T�
+�%�
��\j�"e�&0q _G���2�=�
���1ֶy�UV	>�"�%��@>���ݣ��C]e��IN5��&���^fG�B���-	2�,F�m���FA�}5s��?g�
��T�R�ì��o��,�@�,�&B�8���h������]N�5�!b6���n-�87F��e~>;׍���P7�7#hr��P�
�hR <* �[��	l��>us��o�nl�{g��zb�|^n�c�EۦY����6.�p�Ww�Ƞ{����`�Z$�_f0�-҉�JR�tW�G_��te�����?��^�̥�D���1��<u�,��/�7��{&ɮ�@�̟
d,��6G ?�;�_���s��4}
+�&imv+k+�Z.qWA�s((E[���W� i
@��G�ɻbZ�j[�
so��B{�
?���y�T��fm��k)����
#�E���I�
��_:a��)�J~��K: ����̇
���G(��g��?�K_1�>\5w��=� [...]
+7�����9/B�^?�J�|�%ac-
+xm
m�(
��N�oj��۞,^*��&=tI1E�gG��O|2�?_ꈺ�~?�ܖ�tGL)�N���o���5,�G�K�Y�#��A�7 V����ފ�������
ą\� 
|m
��^�b�3��m���?��ro��=-�bGI�oO b=@�;��qX�g[��@F{�rh�p}G��� "�k`a a�����[��H�4p��4P�Ozd��x�Ss��f��W�xL|
��k�������UIW�C��@y��`��}�U���U��2T�؝�|�+��]��+U�}0-l��ե���ݟ��|�����["x�]
��Q��� �n
����쓴������V�䘔�AH�r?"d�
�ANy�6Bź���65�
+�
�
+.5
�o��M�v���cV�q�N�@���ԯ�hy���o����m#�����w[c� O���+>Y'�I�&
+�kB�y�d��Ws�W�W�k�w��i����o+x�9�Lqh��^�1�i
���
+T�S�H؞B�9��l���]F���4��|�f���3C�m+�	����Ax�j?,�.'�Mw�?ۈ	NuǤSUW�T�n99׫e�w��t��ԕ�BÏ���U�n��䭥������CS�ss�'�
��S������AdܽSM�C���dL���X�J�����.k[�g������8|�1�B�Bk�뙆�{�u�O��̜�NJ���w��x�~l���m�����1箬2��=�l+$�|�uL���|���y
�⋜�3�����R�����r2���l�?뉊yF��=�И��6���~_I*�
C��

l��mc���|��!f��u����^׊�l�A|Qs���K>n�s ~�m1씖u�1^�y{����Hq�����g'=�&<;#�d�
8�mQ�}Ca��P6ӝ����Й�pK�K_��/� ��p�Nmu���������3Յ�	w�S��zXăvL؋

[�:�O�

����ܤ
"�������kBnq
����b#��yv	
��%�%�_F2d�@Czu\ھ���9ெR��'��%^%>�
�,�P駥�ԛ��wwe�8��U�ԃ
+�
B��&11�	t�� &|��EW��d���UJ���ܡe��L
�G̀��xt��	s���}�ʭ
+�Ŝ�mM]�MYIߞ�f;Ÿ�宂7����
"h�K
�
��F\�nN�{8M�����Q61��S��7O��W\��6	$jm��d��秸�


�����T攡�S������

��7۪s�k=s�����V��R=
i�DD�!~K�ؒ�ҝ:
�xc���۝48
�mcA�0��<�=�2̊��Oy���� �2��3V��-�d>�
(�,��^��ŝ7�f�:��P{���-1>�
+��Eа�IT�/'~�r8
��]]ɓ�	B��
��>��^�~\�(y5[��h����� *x��~����؎��\D��5g��Ug�4��>�	�o�����_ ��|y9�r���w{
+�c�,td=D~?9E
��cK�:>kKD��ʩeZ6��, at .�o��}�kJ�9��vr�����⽱����0#߫���M�
ۡ�1��?���~⮛�p��&th#4��bKY�?.�xdSm�+}u��Pn�tSփaR�ݙVdҞ�
�iJ��ܓ��!�Do����K��r�xbEM�1'��W���Z���30���ok}�o�Ad䡚�q�h�QR�m+�c���k�}�"�\
C'��P�n�����_�w�VG�Yi_n%$|���GF��U�}O�����Uq�̣��3
���a$�o�~����
_�5\�n�*���uZN
+�s�1�ށ��mj��d}�{�_��+\��
+Y�.z���\l.y���tݫ##�����aJ֦��׌�槁���D��O�}�
/���D�� r���9�ȷ�ȩ;
+Z�JG�;=?�s~��� ���)Z��ͱҤ7�-�̨�s����Mt���&6g��g����rv�%��GO���,�UJ-X���9Tt�W�$�j��3����Į
+��"2
|��R���
�nKC�|s���-bT�K��ٟe���*��4�ʕa|O�����y,�m��c�E/�?S�s�m��
�C�]e����[�ZN��%@c�'��{kS�/�}�~{�Lā�
�5OF�Z��gP��EoͣȈ
5�8K16���sv�Up�v&ȅ;S��3S��S���V�C97�c�^�=���o*|��^��6	�զ�U��,��;�WVY&���-9O�:
�gۊ��K>nzkW��ܜ��n�����n�gN��VSK���
ηe�]hN��g�Ib��0.V_]�`�
��K7��A+=��R^����?�Y_��G_��G�/���N*��A�*J��!ٯ���1R�
���־�7�	\�!�	�x��1����E9��W9�FW���|��%�����7^5
�׼�i��"�Ԅl����(���)t�zwY�R{�+SMx�-�-?/��R�u��c
����X�*n�
����y�P��w9/�����qI(�*^�CM�ӵ� [...]
+
+��⯱�
B�=�w�Q��3�z�^n�M �<jx��t�w�4#���D�����{:�2��v�'�y(���P��}#��Tsɖ	J�SƂ8$��p�)^�#]�''�a�[3_�+��q�s
-��Q?���*ޭFg�������bH��!з�ҿ ��%�U
��F�	��q�b��E�=Y
�֖�Ԛ�7גrߩ'���E��e_
:\�w�f�����%W�j��i��\��ʣa�F�����y�}
����bF�u
�ٓ���[꿫��[�ѡ]�o�ql�K��4��}���MhX91ge���1I�u�Y(�
+�������`߶k �x�Ф
�E��>������m���>���1H��*���Y�+x���E�
>�����gç�_
b�#��
+c����g&�ag׻J~y���Qt–��I8�
!cGVj��h�O��9�
�5]�th��mR@����l���"l�]�T	:�<���:aøh�3
���o7��IKC�d)7�OJO�$��^Ur��`�����-����;ʿ(�)�����#�ħˍ_~�����1��}���
)��rx���V W6
+�l
0� :|�,��
������$�4��R�o�WmO�C��H�ѧ����3�����U�q7ʾ?�m��<�u�MJ*���S
�o��?�Iy~BJ��>�-�
u�ߖۊ?�(���z&��E���4��V�
rL�����P�	��X��Rr xI_mW����|s�����GG�IO��_�m��,c�(�
��UQ���l�[�Mwh�I�"@sM��Y�_�5]n�b�'�]R
���"�c ߩ�OsW{!�l�d�35#�t? ƞ�ޭt�=q�~uN��o��E�t�}�1�κ���߅���_�����c|}�vu����7��!��k��oI�h�t�ng�E���)���jk��[�����/6߭��
,��w�kE��4��
�EMT(��R\*|�
�M	>O_��tCF�Q5��[&��{Z�2��\jI��ٓ��2P�v�!��u��1��������D���PR���Q
#
��߮
T��8���v�n���
U=@�w��+�zTd��LM׾Q <�fGN��
C�o�¿-wa�Lm�b~ƽٮ���1B�85��������&ď�r��(�`GN*���Y
Fmx��q�v))ok"��|{�]m��I��Sn)6}���
�������2�����`R�c�o��_��a�ͣ��IN��?���8�d]
i�K�����h*�z��0�5��9;�����O�+"_�[���;��"���/�mI~2��qs�tvGN��Je��Ŏ
���S�f���G��:�c���YL�w���I�f��h��\����
��=�I�K�ikc�(Mmѓ	T̹�H쮁T�nL���
�`h�xҋ
�݃�	pA4�1q�.X<<�����_�]ar�
؂-Qi�y<��Ch 
��in�Њ L�ߞ$d{�|�y
��Y�x�9��$-�je���mA�-�e�
}�_y_�nN�<j*t����l{��鶜{s����O�f8l����Q�\J�`�_��"�Ϋ%���3�XiWgrlM`b�%�c+��[ɥ kB]n�}�T��TW���bB��jf�y�84���9�f�T��������T����$�4�s
��h�;Ss��tK��_󕍮��-��o����mz&駑��U��ܒ�����W[ㅁ-�lZa�E�FzM�U{sL�����e
Ї
�*H}}j[ã�M
*r�CA�=����FO����m��
�$�5
uSᣵ!J涄�GGo���6��f,ئDŹ
t�����kl����f��gy���<������
+�nUP���J��(��O��6���k(y��^_l��d
���vV��i!��
KW{�kC���B�:����r_y��������m	�ȭ0
J&tsg��b<���	y"�<�N��Zui�X���p����0�^]�$�E
�n+|�ԋ0O1*�&�e3����F�t%굌�sm��xQ!�|�l�yс�>+a|���3��K�k��X��ηf���O�k
�|�?
O��Y�È��1l̞���50�3,��4����U�L���yj��#��<��ܫh�ӶM�X
(�_��z`h���
�pq�4?��hE��_j)z��c=6ѥ�8H*�J`�s=%�T�Yw�����d��R�[}�XϢ�2�v�6/�
�*r����&����#���"b��=*z�W��'�e�AL��w��u�)g���щR~�
�*
�C��,�v��b
 ����䬏�s
J
kk�Q�Ր�lRx�rO��F/$p��⽯v��
1AOx�: OZ
��1ҟI��w���p�2vON-ޑР+�E��
)�ڒ����]���_�җ�hu ��LS����‿p` �=&&�����
���p�nd��fWM��C���e�U��������m��e�]m��r�]J�[�}|���~T̎�
+sϰ�
_�w=�ts

i
�DXƉɋ�:K
�~�M)w�쐋3
)wW� �"
l�
!$�X������i|��,�lw����x
��/�5U
+���ڟs���>x?g���i*®E&8
�l�����C��&$��&gm��ԫ
y�G�^��.lv����
}ĸfb��nR���!X�K���(9�
->g׀�ݒ���9ńZ�ռ�>R��>�<��p)��0���'��=��
�B`��N��5�v�^#�Tbҭ���ɒ�������F�Iv�nT��vp����ӭ��
��A�pQW��w
c��ɪ�FTԥ�^B�]\�[�Dn��}v������;:D�[K�X$4��|u��@�p�	�n-2թE��5tܶ���1��bL�Ɛ��(��ԆȰM��m������� <h� �>�~=��
�X�F.tU�['�1+��ٮ�W+#E_��� �v�i]�3�󹿖�z|�"��B����,�<��J�y�=�` N����]�c�aSg�2
�X�Ĵ��m�/gMM)/�
+r�03�E"��>��
Z
?���遼P�Qk��4��Y��=]��&� ����0`��� _]S5�L��yck��zT���.�Lm9�,iA�JO�
mm�}v���x��N�r?�w�S��$l��a�����5����B����)_
N
Z����4 ƃܛ�]:ѭc�w�lʁ�E�w����
+	y0��.��}Y��� ��pik�]�J�[/��*.�d������Ƥ;İ8�p�W�<��o�5��j}��
+��xIw����Yz�ֻQa��Ļ]���/u�
���Ċ]#:��X���|��
����9]�u`�M\ƞ�X����,*Z��:J�2�
+
�d��Ɯ�ѳ>+Yo�j-;\��%�$�\j��\�%~=c��s��U��O�I}�YB�['1qk#Ȱ-1>ui�j({�1A)��
j=ZR�S^��&)�MA��b��l�W�gx
|�[�����}���[�� ���ރ�\���W�?�|p4��eP?*��J72~����|s�Iz�-)/��/�V;1
�0���D��0$xm��S���H@��Ω;\��ޝ�8�T�5a��<�w� �ܛ�
�L
�� �l)I���~
g'����\�S
+�^_�v!�#��m�!�f���L7��Z�-�LR�F9Y�dU9�\J@�j�;�
j\�C��ؒ���e�5�vf�ݻ
�:���i㓷�d��<��;֦`TlN��� �\:�-�E[RL�R/4�Ԑ�i��<xm�"�2^�.�$�p2�Q��|�� �mN�2�2J�S�&X,��5oK���[������z���6)%�<�
+[�Yn+��< �ٜb����᤬��݅_����O�E]34E���~S5f�s~ا�/�+�Qq��WV1
~0[�{0K���)6iƛaڛ߇��X(
����\��M�`#��
���&�՝�]��Z��԰���ⷶqJ�C�.q�y���������}���:���k(|�g� 
�m�9��rG�#_Ssɳ�&�'��҂���ߜb�\o�|<��zv����Xs������1B�M�Mtk�yN5�d����V�xf��n

s0�flM�=*�ԟ�,�M�%��٥�q~�r;3v�Up�����at�M�(�b�

�ДuO_{i�9��� "`��qs
��a�m��D����T0��Rd�M

�L�)�c��	�7��>�����*Rٶ
�-���Abvu���̒���!��z2�m	%ǧ��*
eGS]k���ӭ��
t
VH�%��Q;2��� ��l=:fm��>�V��	�܁��:A��m�"�lMqQ3]��|�%YuqඔG��h�B�׈�w�@\��ZZ�]ǀ{���vg [...]
+ol�{�9LɵL�P���O���+y�ON
r~���*���^��<��@~?�
��Ԇ���T,u���`&ݔW�>��U�A?���U�����5�Nr(�]=�v8���Mp;Z
̩�ە�t��ޛ�
ڙ�;�<��,fe��CZ�é@%�Z��M��{�H�� +g��vv����E>�Oˉ���W�٫���-ٟ�Y�Ye^uM�S�"�<�Rr]:l���b7KD��.j���w��ŚA�l��e_?��H�]�K�R\���
~i��4�6E� �l��f`�(�s����a|����1R�b?2ũ�d��<�K�@���
:���,Ķ��k[F�'8��aR�CánH����7���뽨�[
�y������!DZ:�e
+��k��v
�Ӽ��[�.���x��;-l�1;�*�w
Ӧa"�2r^�h�IX�wӪ���2B���6���mZ�\���!L�Z��] ���=o�����ط�W��e�dL�ui�}^�*z�؜sW��� ���`����2H�x�2��Z��ꋟ,��<[�)|�1���>���rq
��F���
��Q��}�"��vi���iA���c���#�� �SmB�e
��
+� f�<
#����)&5�
1��YCui��(*f�=��Bw�=Uu̵^���C��kä�ۋ�E��]�j*".�5���õ������'�TШ�������
�t_��ۤ��]���i
+�?��������R 
]ϖ��_���c�W���W��a�������*~�b���R�s���G���"v�SvV൅�ܷ3-%a�=�'aⶦ(yV2�*�į��-ҭT��4�[E(�e}[N��9Q�ݩt�
��4�*�Rx4�*������ʹk���̴3���;uW��BK������@� b����k�;ՙ�y�w��C���-ɑܹr]k��<�,����5|
��m;�� ���*Vt��xdPI�|�hx~��/�@�rL��Ar�

`�C��OA�zNA͟T">
��|� �2�m�:I��^qcJM���Ԍ���gE�5��jaC�
lʖY���$��@��fd��Qp���dn��pA�ɟ������
CȔ��X0/G
�c�Y����m��u��w�.Q�Ψ��(��ɪu'�b��)�`�'�������u7�5k�V�)�7�5��:k>�Y쫸�c��ॽ����O���o)I�<��
�q�!
*?�܊�����&~�C����I4�D˽0.�~��
+S����h�'�
tӛCČ%=�nӍ�.�!�l��n�s¾��U�#�ƽ)*j�O�0��'m�Be��u�%���eG��C
+hԼ��ф������Zq�.��σ���!-"��ϻfgf���}���y�ej���Co���
4�)�Ʃ����]�bl��g;
�+�Nq��L��X0R
+���W���
�M9�r��:9�$�Nu#��ۚ�Z)�ל���+���@G�+_Kᵠ�aV^�j���͊�p䘠�9~z�>�ί�?�A+tq�	A%���� 7nH
�G)��~a�O_16F
����6T�ƨ���t}���—/*�Vu�Y�zt�MC-~0׏������^�PR��✠*�AX��	q}�
�{�������ژ}ۑ��%����iic����ٚ��uH_�z�J���7e[l\
�%}# �p�/B��)R�)"t��X�6���؇#|����#9�@���5
��dw�;�ʼ
�iJ�)TPs
:[�����<5)��O��&��%�
+D̢
��u�F� a�͟�q��|�V��Y;�
���~�1�3*h�����
��d0���(
1��(?��
�o'��H5V^��q	�æ�\�iE�M�׾
묺7��}2���
Ī
'�=¥/I՛
c{��Xw >�A>�0��Th�B*>�{��9
��
+|ʄ�����G/��_�
���7:�~�@�Nj��-�1d��
�!�
&z�Gl�<����Wn:�E���(oG���x��(Wr��!7�~k��\qS@!'�a��c��o�є=�.y��"§x�?�l����� �u���v�r� -��mNuv�d���t�x�Ȭ^V�S';@����s=��_z��N���74���Al�������9nDŽ�ض��v��Ͱ�e=6�ߏ�WJ
�Q	S�v������	
+|��&m���������jү�ubj���YI���~h�d'豋Z|~�WreM�H�S�3�u��w���8iࣾ�vXҌ���5������d_����`��F?<k %?��b��`D(���Ѓ)�
�}�l͹���
+�uњ����F[���
�������P���l[�9�A�ljn�3Gk�.d��Al��-
�i�ؗ.x�T*z��2̭��VsVX�����:�Z��'*��m����kv���/
B���;`}	���G#��'[�{��U
:of������.?��K S��
T��|�m;
��%Q��E�
��(�c����O�{}D�scׁ��wU}lHyxBP�:rF���� ?����6��(>oS��,���b�&��j��3
��
�;� �1H�����x��C����Ќg�W������y}LH����
�k>����*`NM�B�z��y/71�o
���c���>l9�f��u.Պ+ZsqpKj����=�	�'��̲x?ƨ�/��/*˟y��n�t5�W�
+�� I���8!.{��:��iIm�
+YT#
+���m̂K+Fr)�R6͈�
�x�N�p��e�J:��`w'�Ԑ�
+�|>�nJ�:�n?��lzY��
};�8�y
+�>AD�L�9H܅/�ׅ����[vxꊮ!bAY����*������oZ8�
���-�a��k:T�i'-��ue���~H�dG��Q~ٕ-+�hZQ5�[�p����dO�ݥ����zZ�?���1Mc�h�-?
y���lq�Uv����]+�泃�������a��:���
+v�x+�
����[p�-(��`^q	����æn
�n(hF&����
`
�f�QI����aW=!���^��eJ�]�+���h⾋P�yWy�A�l���Ά�
+T�_��%��Q2hw�P��F~���� >�چ�脗]ԓ�n
�3�Z�o�cO�4�����w�BO�7���6ŔF������C;�+�
+� �� ���>I�%wڅyEu��0
r0��������~ ��������s���cU�焥�w�>'|�
�
qzYG�|e�8h�=3�xYN43��x��K9�k�f��Iuc-�����&R���mC�oۈͻb���~~Q��m�M�Dݶ�����xH�&�=�
:���$.驍�†�]'���G�/�`�F%7�̿z �.�QI/*����*@�3��ՓJB��]n�!��6H��
���{K� ��d@��ZI��GD�='�<Ԝ�;��\�A�F����w�yZ+��"���F��E�Ⱥ:�H?#o�9�$&�qR -
��k(�B[}��aN�c
�<<��_a
��,��Y-"~I���#��6t�� 8rF�����b���[6��D���T��ۢ��c���}���
+`��P}xP��i�x2��'�iQ�Ay����>nYV�aAZ�f��B.*p ֿ4���.���߶���'���?�b�|�u��s5(kx96P��:��{vU��X74'zyw�-��5yϷ�%/?��*�N��ߦ��
�/>����.��E�۵�6���1q��1Q�s
��E(���>�~��3rXڟ^n�퍡�m
�$��f/�a�z㶛O9!֭������Kffʟ�ֵ���	�-'
|��3��lܶ��i�{��?��|D��>��z���l��&���� h�Qq�aA�c{�9����^�V߱2
����'��� q衛_�bZ
+N���b�ui:�
�����ڧ^AՃ��ƈ����z��/#4��Q̀�	5���
+�#�h���� ���84����JO{]8��ÙL΋}?�}̈́�Z�y8�^v�JK;�(|v�r���̎
���U�bT�^��CTm��վ��;��?5���GZ>\��~�i%�׆iPB�۫FVڛ�����e��(�.l�
3�V���J��
�v��� 6�ɶ�
]�`
+�4��������R.���WF;j�o�hh���h�@�ј��qZ�O2i�6hjp��킺��Q��!p��J`'EזՈ�53.gU��*�9ff��l�{8����ٗ��N3r�����-*���
+���Ҧ8a�dz�qw���?�޴��5��V��]/r�Y�㼎��
�Q
��)�YE5���3]�o3����,��4w8��ܲ6}�
F�n;q��Ɣ5
�n�"73�j_]�����L��?�L�b���� "�4���q59�"���i%4㲟
zj�f��P3�Ͷ�YZ�L��=ǩz��.�Ⲫ�㼬湋Wp�+*|�����8����!�Gz׆Iek6Z��0���S6,��U
:)�F�O�*���)�7v�������nV�C����w�ߒ�����a�D�5ښww�L�_3��A54�?悬�������P�����뚚�
72s�Em8t�(�&|����Յ�:p@���Ђ
3*���iӆ+�4-�5�7�E̠�\0������8g ���ӵ
#,
�Fz�UoK��
�l�����<������ɶ�{�ݨ��JN㌒V!�g^��&d�q�WTȄM"q݂+Zl"d'��-���n���}?v8N��|8��<�Wz�_:EU�P�焊u�dI�
� C$���
��GJx�����Xт���>����VHъ�\�৞�2�n�yI�SҜ��^&�󨀿2LaJ#.�(o��as}@�t
�׿����tq�.�8w���bD�����1��]ܶ=��ߚG����S��'q���3
�w��ꐅސy��6��g��yN��q"48T�tNVxk�ޔ�}�/^wА:F�}7���� �(w��"V�h�!5��l_������
B&� �
"�٩QIէm Oՠ�ɞ�w�֒}��ߘ�~2P/��6l��!j�� �V���t��3�I:�� ?�|�@��3/R��D�pga��i*��,���4�x0�)�1A�}
` !4{�A�[����?8�yw
촿���O3JL��[����w^�/8/��F���d �<��l
+V�9Eκ�S��)5��/�a*��?��ݕ�; ��
endstream
endobj
285 0 obj
[/ICCBased 295 0 R]
endobj
6 0 obj
<</Intent 33 0 R/Name(Layer 1)/Type/OCG/Usage 34 0 R>>
endobj
65 0 obj
<</Intent 91 0 R/Name(Layer 1)/Type/OCG/Usage 92 0 R>>
endobj
123 0 obj
<</Intent 149 0 R/Name(Layer 1)/Type/OCG/Usage 150 0 R>>
endobj
181 0 obj
<</Intent 190 0 R/Name(Layer 1)/Type/OCG/Usage 191 0 R>>
endobj
218 0 obj
<</Intent 244 0 R/Name(Layer 1)/Type/OCG/Usage 245 0 R>>
endobj
244 0 obj
[/View/Design]
endobj
245 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
190 0 obj
[/View/Design]
endobj
191 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
149 0 obj
[/View/Design]
endobj
150 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
91 0 obj
[/View/Design]
endobj
92 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
33 0 obj
[/View/Design]
endobj
34 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
277 0 obj
[276 0 R]
endobj
332 0 obj
<</CreationDate(D:20141222131935-06'00')/Creator(Adobe Illustrator CC 2014 \(Macintosh\))/ModDate(D:20141222134947-06'00')/Producer(Adobe PDF library 10.01)/Title(Print)>>
endobj
xref
0 333
0000000004 65535 f
+0000000016 00000 n
+0000000224 00000 n
+0000046507 00000 n
+0000000005 00000 f
+0000000007 00000 f
+0002512206 00000 n
+0000000009 00000 f
+0000046558 00000 n
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000035 00000 f
+0002513039 00000 n
+0002513070 00000 n
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000066 00000 f
+0002512276 00000 n
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000081 00000 f
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000093 00000 f
+0002512923 00000 n
+0002512954 00000 n
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000116 00000 f
+0000000117 00000 f
+0000000118 00000 f
+0000000119 00000 f
+0000000120 00000 f
+0000000121 00000 f
+0000000122 00000 f
+0000000124 00000 f
+0002512347 00000 n
+0000000125 00000 f
+0000000126 00000 f
+0000000127 00000 f
+0000000128 00000 f
+0000000129 00000 f
+0000000130 00000 f
+0000000131 00000 f
+0000000132 00000 f
+0000000133 00000 f
+0000000134 00000 f
+0000000135 00000 f
+0000000136 00000 f
+0000000137 00000 f
+0000000138 00000 f
+0000000139 00000 f
+0000000140 00000 f
+0000000141 00000 f
+0000000142 00000 f
+0000000143 00000 f
+0000000144 00000 f
+0000000145 00000 f
+0000000146 00000 f
+0000000147 00000 f
+0000000148 00000 f
+0000000151 00000 f
+0002512805 00000 n
+0002512837 00000 n
+0000000152 00000 f
+0000000153 00000 f
+0000000154 00000 f
+0000000155 00000 f
+0000000156 00000 f
+0000000157 00000 f
+0000000158 00000 f
+0000000159 00000 f
+0000000160 00000 f
+0000000161 00000 f
+0000000162 00000 f
+0000000163 00000 f
+0000000164 00000 f
+0000000165 00000 f
+0000000166 00000 f
+0000000167 00000 f
+0000000168 00000 f
+0000000169 00000 f
+0000000170 00000 f
+0000000171 00000 f
+0000000172 00000 f
+0000000173 00000 f
+0000000174 00000 f
+0000000175 00000 f
+0000000176 00000 f
+0000000177 00000 f
+0000000178 00000 f
+0000000179 00000 f
+0000000180 00000 f
+0000000182 00000 f
+0002512421 00000 n
+0000000183 00000 f
+0000000184 00000 f
+0000000185 00000 f
+0000000186 00000 f
+0000000187 00000 f
+0000000188 00000 f
+0000000189 00000 f
+0000000192 00000 f
+0002512687 00000 n
+0002512719 00000 n
+0000000193 00000 f
+0000000194 00000 f
+0000000195 00000 f
+0000000196 00000 f
+0000000197 00000 f
+0000000198 00000 f
+0000000199 00000 f
+0000000200 00000 f
+0000000201 00000 f
+0000000202 00000 f
+0000000203 00000 f
+0000000204 00000 f
+0000000205 00000 f
+0000000206 00000 f
+0000000207 00000 f
+0000000208 00000 f
+0000000209 00000 f
+0000000210 00000 f
+0000000211 00000 f
+0000000212 00000 f
+0000000213 00000 f
+0000000214 00000 f
+0000000215 00000 f
+0000000216 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0002512495 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0002512569 00000 n
+0002512601 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0001014835 00000 n
+0001014643 00000 n
+0002513155 00000 n
+0000047009 00000 n
+0000047254 00000 n
+0001038964 00000 n
+0000407159 00000 n
+0000797890 00000 n
+0000048065 00000 n
+0000047318 00000 n
+0002512169 00000 n
+0000047501 00000 n
+0000047551 00000 n
+0000054032 00000 n
+0000190835 00000 n
+0000797659 00000 n
+0000797776 00000 n
+0000797030 00000 n
+0000054095 00000 n
+0000190996 00000 n
+0000407196 00000 n
+0000797192 00000 n
+0000798004 00000 n
+0000798070 00000 n
+0000798105 00000 n
+0000798405 00000 n
+0000798480 00000 n
+0001014717 00000 n
+0001014749 00000 n
+0001015255 00000 n
+0001015517 00000 n
+0001039040 00000 n
+0001039740 00000 n
+0001040896 00000 n
+0001046809 00000 n
+0001112398 00000 n
+0001177987 00000 n
+0001243576 00000 n
+0001309165 00000 n
+0001374754 00000 n
+0001440343 00000 n
+0001505932 00000 n
+0001571521 00000 n
+0001637110 00000 n
+0001702699 00000 n
+0001768288 00000 n
+0001833877 00000 n
+0001899466 00000 n
+0001965055 00000 n
+0002030644 00000 n
+0002053046 00000 n
+0002118635 00000 n
+0002184224 00000 n
+0002249813 00000 n
+0002315402 00000 n
+0002380991 00000 n
+0002446580 00000 n
+0002513182 00000 n
+trailer
<</Size 333/Root 1 0 R/Info 332 0 R/ID[<496307306E3C404CBA393BF6BE106AFA><9D3B339D85FF45DF8C2F328FB9614C9A>]>>
startxref
2513371
%%EOF
\ No newline at end of file
diff --git a/doc/_static/logo/dongle/front.ai b/doc/_static/logo/dongle/front.ai
new file mode 100644
index 0000000..e013169
--- /dev/null
+++ b/doc/_static/logo/dongle/front.ai
@@ -0,0 +1,6536 @@
+%PDF-1.5
%����
+1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[7 0 R 52 0 R 96 0 R]/Order 97 0 R/RBGroups[]>>/OCGs[7 0 R 52 0 R 96 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 49427/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c014 79.156821, 2014/08/29-03:07:50        ">
+   <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+      <rdf:Description rdf:about=""
+            xmlns:dc="http://purl.org/dc/elements/1.1/"
+            xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+            xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
+            xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+            xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+            xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+            xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
+            xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+            xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+            xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
+            xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
+            xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+         <dc:format>application/pdf</dc:format>
+         <dc:title>
+            <rdf:Alt>
+               <rdf:li xml:lang="x-default">Print</rdf:li>
+            </rdf:Alt>
+         </dc:title>
+         <xmp:MetadataDate>2014-12-22T13:28:04-06:00</xmp:MetadataDate>
+         <xmp:ModifyDate>2014-12-22T13:28:04-06:00</xmp:ModifyDate>
+         <xmp:CreateDate>2014-12-22T13:16:47-06:00</xmp:CreateDate>
+         <xmp:CreatorTool>Adobe Illustrator CC 2014 (Macintosh)</xmp:CreatorTool>
+         <xmp:Thumbnails>
+            <rdf:Alt>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpGImg:width>256</xmpGImg:width>
+                  <xmpGImg:height>80</xmpGImg:height>
+                  <xmpGImg:format>JPEG</xmpGImg:format>
+                  <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAUAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQV [...]
+               </rdf:li>
+            </rdf:Alt>
+         </xmp:Thumbnails>
+         <xmpMM:InstanceID>uuid:f064096a-ad71-bd46-91bb-69a1f800b249</xmpMM:InstanceID>
+         <xmpMM:DocumentID>xmp.did:2da2ea4e-4837-4559-b46b-81f2d3f7de04</xmpMM:DocumentID>
+         <xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
+         <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+         <xmpMM:DerivedFrom rdf:parseType="Resource">
+            <stRef:instanceID>uuid:d1c078a0-2746-42b2-b0d1-25aedff8fb1e</stRef:instanceID>
+            <stRef:documentID>xmp.did:1b6690ed-28a8-c141-9479-b6a9cf6be651</stRef:documentID>
+            <stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
+            <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+         </xmpMM:DerivedFrom>
+         <xmpMM:History>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <stEvt:action>saved</stEvt:action>
+                  <stEvt:instanceID>xmp.iid:2da2ea4e-4837-4559-b46b-81f2d3f7de04</stEvt:instanceID>
+                  <stEvt:when>2014-12-22T13:16:47-06:00</stEvt:when>
+                  <stEvt:softwareAgent>Adobe Illustrator CC 2014 (Macintosh)</stEvt:softwareAgent>
+                  <stEvt:changed>/</stEvt:changed>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpMM:History>
+         <illustrator:Type>Document</illustrator:Type>
+         <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+         <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+         <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+         <xmpTPg:NPages>1</xmpTPg:NPages>
+         <xmpTPg:MaxPageSize rdf:parseType="Resource">
+            <stDim:w>49.999194</stDim:w>
+            <stDim:h>15.998472</stDim:h>
+            <stDim:unit>Millimeters</stDim:unit>
+         </xmpTPg:MaxPageSize>
+         <xmpTPg:Fonts>
+            <rdf:Bag>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Bauhaus93</stFnt:fontName>
+                  <stFnt:fontFamily>Bauhaus 93</stFnt:fontFamily>
+                  <stFnt:fontFace>Regular</stFnt:fontFace>
+                  <stFnt:fontType>TrueType</stFnt:fontType>
+                  <stFnt:versionString>Version 1.52</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Bauhaus93.ttf</stFnt:fontFileName>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <stFnt:fontName>Consolas-Bold</stFnt:fontName>
+                  <stFnt:fontFamily>Consolas</stFnt:fontFamily>
+                  <stFnt:fontFace>Bold</stFnt:fontFace>
+                  <stFnt:fontType>Open Type</stFnt:fontType>
+                  <stFnt:versionString>Version 2.00</stFnt:versionString>
+                  <stFnt:composite>False</stFnt:composite>
+                  <stFnt:fontFileName>Consolas Bold.ttf</stFnt:fontFileName>
+               </rdf:li>
+            </rdf:Bag>
+         </xmpTPg:Fonts>
+         <xmpTPg:PlateNames>
+            <rdf:Seq>
+               <rdf:li>Cyan</rdf:li>
+               <rdf:li>Magenta</rdf:li>
+               <rdf:li>Yellow</rdf:li>
+               <rdf:li>Black</rdf:li>
+            </rdf:Seq>
+         </xmpTPg:PlateNames>
+         <xmpTPg:SwatchGroups>
+            <rdf:Seq>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+                  <xmpG:groupType>0</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>White</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>Black</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Red</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Green</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>15.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>85.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>80.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>35.000000</xmpG:magenta>
+                           <xmpG:yellow>85.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>5.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>20.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>90.000000</xmpG:cyan>
+                           <xmpG:magenta>30.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>30.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>80.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>45.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>70.000000</xmpG:cyan>
+                           <xmpG:magenta>15.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>95.000000</xmpG:magenta>
+                           <xmpG:yellow>5.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>25.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>75.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>35.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>10.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>95.000000</xmpG:magenta>
+                           <xmpG:yellow>20.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>25.000000</xmpG:magenta>
+                           <xmpG:yellow>40.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>45.000000</xmpG:magenta>
+                           <xmpG:yellow>50.000000</xmpG:yellow>
+                           <xmpG:black>5.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>60.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>55.000000</xmpG:cyan>
+                           <xmpG:magenta>60.000000</xmpG:magenta>
+                           <xmpG:yellow>65.000000</xmpG:yellow>
+                           <xmpG:black>40.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>25.000000</xmpG:cyan>
+                           <xmpG:magenta>40.000000</xmpG:magenta>
+                           <xmpG:yellow>65.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>30.000000</xmpG:cyan>
+                           <xmpG:magenta>50.000000</xmpG:magenta>
+                           <xmpG:yellow>75.000000</xmpG:yellow>
+                           <xmpG:black>10.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>35.000000</xmpG:cyan>
+                           <xmpG:magenta>60.000000</xmpG:magenta>
+                           <xmpG:yellow>80.000000</xmpG:yellow>
+                           <xmpG:black>25.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>65.000000</xmpG:magenta>
+                           <xmpG:yellow>90.000000</xmpG:yellow>
+                           <xmpG:black>35.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>40.000000</xmpG:cyan>
+                           <xmpG:magenta>70.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>50.000000</xmpG:cyan>
+                           <xmpG:magenta>70.000000</xmpG:magenta>
+                           <xmpG:yellow>80.000000</xmpG:yellow>
+                           <xmpG:black>70.000000</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Grays</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>100.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>89.999400</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>79.998800</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>69.999700</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>59.999100</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>50.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>39.999400</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>29.998800</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>19.999700</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>9.999100</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>0.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>4.998800</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+               <rdf:li rdf:parseType="Resource">
+                  <xmpG:groupName>Brights</xmpG:groupName>
+                  <xmpG:groupType>1</xmpG:groupType>
+                  <xmpG:Colorants>
+                     <rdf:Seq>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>100.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>75.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>0.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>95.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>85.000000</xmpG:cyan>
+                           <xmpG:magenta>10.000000</xmpG:magenta>
+                           <xmpG:yellow>100.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>100.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>0.000000</xmpG:yellow>
+                           <xmpG:black>0.000000</xmpG:black>
+                        </rdf:li>
+                        <rdf:li rdf:parseType="Resource">
+                           <xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
+                           <xmpG:mode>CMYK</xmpG:mode>
+                           <xmpG:type>PROCESS</xmpG:type>
+                           <xmpG:cyan>60.000000</xmpG:cyan>
+                           <xmpG:magenta>90.000000</xmpG:magenta>
+                           <xmpG:yellow>0.003100</xmpG:yellow>
+                           <xmpG:black>0.003100</xmpG:black>
+                        </rdf:li>
+                     </rdf:Seq>
+                  </xmpG:Colorants>
+               </rdf:li>
+            </rdf:Seq>
+         </xmpTPg:SwatchGroups>
+         <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+      </rdf:Description>
+   </rdf:RDF>
+</x:xmpmeta>
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                                                                                                    
+                           
+<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[9 0 R]/Type/Pages>>
endobj
9 0 obj
<</ArtBox[3.5598 3.04572 138.511 45.35]/BleedBox[0.0 0.0 141.73 45.35]/Contents 98 0 R/LastModified(D:20141222132804-06'00')/MediaBox[0.0 0.0 141.73 45.35]/Parent 3 0 R/PieceInfo<</Illustrator 99 0 R>>/Resources<</ColorSpace<</CS0 100 0 R>>/ExtGState<</GS0 101 0 R>>/Font<</TT0 95 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 96 0 R>>/XObject<</Fm0 102 0 R>>>>/Thumb 103 0 R/TrimBox[0.0 0.0 141.73 45.35]/Type/Page>>
endobj
98 0 obj
<</Filter/FlateDecode/Length 1130>>stream
+H��WM�7
�ϯ�=D���k�4�m�@υ��I��m���}���� 9�\4z�I����������[��O�B4>�
�dO��s?�IG��|�Yz<M�ߞ-}x�>O�-F'�������/�������/�\0/2�l<�J��I~H��Mʙظ�uM	����0e�XM�~)�"��tT�ϩS[D��m&mw0%U'-��J?V����	�J�Q�;Z�y_�

�%��|h��Wg#��_2�
�\��u�!@�hB,�m����y at gMuq�u$z��Ȝm��B�l�}��5�5�`���g��
�̮��t6�W
��'��["A[$P"�N�
@GS��CyH)�M��k�:N5�tE�Ϟ��_�����ݟi�P�;S8dz�X�ڦLLNB���y� �1+)�pk��+4
����:��Њh�WV�RY0t��4�/��Kw �z傕d�H�b�� �lS�M~p2��
�!�|u��`�8��5Sk�{��q�;ʦ�:$�vJKOGu��� [...]
�G?�K�[?�:j�v������.����{���~
��l����aA���_��c�]�K�9���v�Q�0� ���h��%jb
���(�G�.}�t��/iG[�S��
��ae���ᄐX�n�
�<�,�����s�D��l��!6�/D*6�r��B����Sj�G:��f�hTª��k!0\�����D��O�j��.��S߽:���
k�趃`�
p$މ!��R/{/N��e�� !%mr�����ӐR ��=
��s����(�}��E���2Y���V3��\"�����
�}�������&�
�
+��
UV��V�f�E|
R�9WHڨ��
A�R�1�ڄb�,M���z��ҁμ��,)��;'���=w\�����t��_Fy�<s�-{l;�
+%J�-w��%jJ�
+��ʖU(40����Sf�t&
�Z�� ���
�]�~=�֦��x��;��#`y���Z�ںϟ���i��a��~���=�����Ӵ��el��+�����8b�Pq�Z�&�a��~y���HO/����HO_������o�����nK��
 ��
endstream
endobj
103 0 obj
<</BitsPerComponent 8/ColorSpace 104 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 5/Length 55/Width 17>>stream
+8;RZ]!s7lU#bVXdK*:+7)oU>4"0_br*^pT193<$i"2k0?"ou$d08]~>
endstream
endobj
104 0 obj
[/Indexed/DeviceRGB 255 105 0 R]
endobj
105 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
102 0 obj
<</BBox[49.2144 45.4716 109.766 15.2201]/Group 106 0 R/Length 47/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 101 0 R>>/XObject<</Fm0 107 0 R>>>>/Subtype/Form>>stream
+q
+/GS0 gs
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+
endstream
endobj
106 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
107 0 obj
<</BBox[49.2144 45.4716 109.766 15.2201]/Group 108 0 R/Length 120/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 100 0 R>>/ExtGState<</GS0 101 0 R>>/Font<</TT0 94 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream
+BT
+/CS0 cs 0 0 0 1  scn
+/GS0 gs
+/TT0 1 Tf
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 29.7595 0 0 27.9204 49.2144 22.2002 Tm
+(pdal)Tj
+ET
+
endstream
endobj
108 0 obj
<</I true/K false/S/Transparency/Type/Group>>
endobj
94 0 obj
<</BaseFont/XPLHSB+Bauhaus93/Encoding/WinAnsiEncoding/FirstChar 97/FontDescriptor 109 0 R/LastChar 112/Subtype/TrueType/Type/Font/Widths[588 0 0 579 0 0 0 0 0 0 0 290 0 0 0 579]>>
endobj
109 0 obj
<</Ascent 899/CapHeight 667/Descent -250/Flags 32/FontBBox[-113 -250 1276 899]/FontFamily(Bauhaus 93)/FontFile2 110 0 R/FontName/XPLHSB+Bauhaus93/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 180/Type/FontDescriptor/XHeight 487>>
endobj
110 0 obj
<</Filter/FlateDecode/Length 2194/Length1 3973>>stream
+H��W}PT�?���ee�]XQ� j1���ve#�O4~�m�F��
+�!Ә��*����MZɗI5F�A̠1�T�k�1
+�`�5�l:�L4��oߢ�Nәv:������s�9��w~������,/�px8ȝ�Nτ�uQX��T��
+@�Kj}r��m�ǰ�%��J�N��w#�T�yJ���T v��Q�
A{Ʉ��
+��N�g�%U%��]/����{=u�x�����z�eZ�u|�W�����u�,���)��^|��֓� ��Ʈ�)��sp���\�@QN��
+��ː
�M*�I�E���*��T�,�
%��	Um�~���Q҅��"�&sd�%zpL쐸�Æ�'ȉ֤�)#G��V���3l�����q�v��v=8!'����&O�:-o���gΚ=g�|�w
+
+�/��#�>���y`�W���^����Z^~u�k�����|�uϯ��m����JJ+�/߶tqϲ�k�5R}��"ߥ?^>��u�J�S�ޫ����%�]��g��{����|��������"�98}����O7�h]���M�a�O��z�7'�ǎ�v���#���	�����@!6�&
RG6ӣ���
�-r�
/[�9C
/�J�&�X�U��fk�5�oM��Y��e#�ߤ��r
�a���|R��:���(9V
&˪/�?�2�}EQ.(�*����W�(+��J��fDoG�������zw��ܛ�s��
����������������mw��35�y�8(�(�2X�P����%�,
+�+�
��d
YI�
+�L�ӡ��J8�p>�N� }H��kDJx����(Hw]p1
vs�y$�N^�N�v����fu�:�k�4�K5�@�]���tמ�v�K��k�Ѕ��]� 	�"1��6@�N
jM7�5��G���(s�3j?1�G�`�D�8-{�(99�a�4y.R

ue�m�,&Yal�3!_0+%�*F[�3�ִ�K�3$���$&�8����.�
<�#�z���/1���
�'�U��OGN�`M�ɈqPr'�ӑ�8�F-�]q�g\`~�MQ��Ψ��\=!q&ʱu
�e�G����X�0��H�pOp�f�ABƘ�KO�ں)V�N��S����ƻ
]���޻��]L�t�&Yb�4��5�}T��n䲚sG+G�
+��h(�`�=Q�L0���r����0���
�b�}
4�F*q�:g�z�'��o���"T _N���k ��Sڲ�M lFX �:Ҍ�9Ʋ�M:�*m$3p�u�F[`��h
��:8!���(��ViSW,Y���,4��������`��P��@�lX�i;8�
+~��J��w
l�݀�vж|�S�N�a�P�|\�*a�8�P7������?(�BoC39�}$h�G���
�&��R�G�y�]�O"<Lf�
�g2��J>�P��w���
"��n�r]�v
�_���@T)�
��|
��Өk�R�q<ʢ�vǰ�
�Lǧ)
̎�J��Ee7��������E���#������-0����\�
�؆�4��|�9e?�y8�
unD
d���݄�kA��w@
��3;'�3�����`
+$��8���7�,l�J�
��Ldz~(r0
��qHG��5�l\2ص<<�hA�R6�U
�
��I�RY����vȵ��} G �*�w��P�T�߁�^S�cn �����N�!m��
�q���U��I�%�*�}ȵ��F
��W�z�;��=P�T

V�w�Ws�%�%m�q� l��|���ӑÛA^�U�Y����q���2Wx�����w��6��l
+��f};�"�|� U
�>m��������X�>��HB�aT׉lߊ<��Y��
��p ��0o-\7��sXư�a��h�L��拔����
D7������@}'� 2y���"�1��
)�#w�z���M�������V�+"`&��
��R����t����v�[���όI�̣l�d�I���o-L�&<[?��"�&s�~T�y��j�2�����j�o���l�<��������'ۜN�\\/�~�ܙy=�+<˗9��T�ȇ�8�����<���I�V
�X�T�>l��o;JŨ���
`.���^&B*��ў=�����
kKT��d��굟J�8{�s���(%,Ax�I^=<
+��99��
 �-�

endstream
endobj
101 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
100 0 obj
[/ICCBased 111 0 R]
endobj
111 0 obj
<</Filter/FlateDecode/Length 389757/N 4>>stream
+H���uT�K�tK���KJI,��t(݋�4�K���%ҹ�H�4J#�Ғ�(H
+w���q�y�y��~�3��̙g�<3�� �Y9El
+ @� ]��!O��-@� � �\����+BVKK
��:�
OX�~�����WCa���iHKL ���0�q�Y���	`�5 �c����k��
+ X�] �x=�
��
�8����	�X ��Ŀ׽�>�.�f���#aP�����
�n�		�D^{y8�����	
�d�p
H��	st��:Y����׬c xc
 I�V�?S��!�:��_����
�9[�YbQ�P�~�+rA
+S�h�����Hh���t^��

�'0�߅�™kY�X��Y9�Yq�q�p��l�'���W����z�E����E$�%
D>,��^|t*K)�%/�`���\�ҫ����:���&D
�
���[�7��dplDa5�|�mb���4�,�y�y��{�e��5�
������������3��
�⚅,t+w��h�l���
��
��A

��
�	�
m
k
+��xYU��
�H�&%��Ȥ
+�q��O'M�z�3�K�T�@v[NUnn^\�o�]�a�b�Tr��t�l��mE]e~U�+�j�א�Z�:�z��a�q�i�����5����};�C�S��������[�\_�ۆw�����C�a��Q�1������;>�L$Lz}4��:%8M7�l̎��Χ/�}�XT^�]�X>\�Ym[���n�!�ycsk��kƶ�ʷ;��v{���p����I�s���0���X������ݯ�3�s�󝋒�&�$��W�WW�*��)���!�$�$�%�!e$c��HNOAKIMEq��������
�����ƕ;KL�w�@��Y�X;ؚ��8^�+�Dsp����f���K�O��TC�P�p�J%���D=��+�+���O%$*������������8�I�Z�\�Z�^�U�K�_wL�������"d�x�����]�}����� �����>�9�=�;��s���_G�8/�̹N!G�z�[<�=��2�|B}����P�Q�z�l�H0Wc(E�e�n�|�P [...]
��kJХ�e����J�*�+��篍k�j5���U���[�ZU�
��h��0�|�e�m������6�]B�@�`�P�p�H�����������?QM1Msψ�*�iϛ.��Z
[JY�Z)X-]��R�޸Ѻپ���w�������?��@��?��5� ǖ'v�N��g��
��
+��W������3�g����L�C#u!��M�M�M�E�vAms˔F�V�N���A���̝GL�w�A�̬,��l�l�ؿs�ݛ�
���n��ͽ����+���!B�²"��<b��4$����݇kR�ғ��e�d���k*�J��Y*/TS
'<�S�V�҈ԌЊЎԉЍЋЏ0�4�2����?M4I~�f�����s-�,󡅰"+�u�M�m�]�}�C�c�S�Q�\�R�Z��s�v����
������G��i��H����3G�F�FaG�D�Ƭ��č��&�$V''g�$�F���LG��˰�4͂d����j�i�kh��C�f%V�Ne��Aq�YU�ڪG^/�
�Ճ���
��[�Z{�Vڱ:�;�`��=�c}��n�K
�
���Fv�(ރ��> 'R&k?���3�?�4+:�6o���
���T�\�ұڿ6���������V����ʝ�o���F?L����T;�:�>�::>�:�;��eq�vx^sa���wݥ��ʕ��'�_� E�F�O\D�K�LtAnF�F)F�|���
�ԭ6�\�`�@z?�m+F�;�L�wiA h�y���͖������)���M���g�w�~_
�@���ZH_XA,�"F)�%�/�*9���a�Z:�Q���,\�B^_AU񡒀2�
+�*����'[j
��o5[����uR1u��h`f�m$1�xJgBdr�l�t�l�y�y�E�e$�fe�g-g#`�dGbwj��0���TOC9;��� �ܨ��ݿx�z6z�x��8��I����P��=A���!.��a�Axۑ ��ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������ �0�@�R�f�zƏǦȾ�����
�*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{����� � � ��T�?�~ò��~i��~L}��~cbA�~�Da�d���
��~t�y�~W����~O��>~\���/~���|�~���`���C ��x
������}%��H}
�1�X}%�z��}K�
��}��
{N}׋<_�~7��A�~��-
ψ��|���|��Dz|+��E|[���s|���z}
��^�}w�O@�}��-�~ċ��	{G�u��{D�z�{]�Ĭ�{��f�{�Zx�|[��]�|ϕM?�}R��<}Ǝ���z��]�Yz��Hħz����|z�=��{L�Nw�{���\�|=��>�|��v|ېI�8z/�r�
z�;�bz'�s�Mzd�6��zɬqv�{D�[�{��0>
|;�
|���
y�����y��a�Iy��?y�a��zY��vzݮ�[{^��=c{Ф�I{R��*y�߄��yf���Uy`��Vy���y���uKz��Zi{
��<�{z�%�zȎ���~+�~� }��͇}W���0}3���}HtЄ�}�Zk��}�=���~���z��ɇ��� ���}�����!�~����Єd�*s}��Y���<9������w����p���S�w�u�����������u�VrU���W��؈|;,�뇔��{���R�s��Ѳ��������;����:�8����q)�P�CV���
:4�.��8�����Ȅ���2������񡂡?�U�����p
����V�u��9S���
�����c�
�b�փ
����R�����.�ՁN��n��	��U��38���8���A�/����ͬ�������δz��6�߆�ө�n1����T\�e��7݀t�XT�� [...]
+�\��l�G�N��ػ�ځ��N�ā�a�5�t��N��zl�ߴ�S<��H6���*���<�a|��k�z|C�V��|�Ǎ|����|Ik���|�Ru��}26��'~2����F�-����B���*���o������������j�����Q^���@5z�I�`����ٳ� �$ĝ�"����c�ߘ���&�U����ij���|PJ�ˇv4v�y���V���G����.�2�{�������
�����萾hS�掼O[���3��Œ
�(����J��ьx�&�$�Ԟs�҉h�
+~�2��gK�>�-N}�o��2ن
��
N�%��է�������� ���>�w���֣A}⇤�\fX����M��ݘ�2,����
��K��Ԑ�3�����g���°����[��}
+�0�e��6��M
�_��1��
�?

���1ӣ���Ǿ���I��^����I|B�̯d��ܪwL���e1$���:
������r�W������]�
��1���S{��z�|di����L
���g0��\��
U��������{[���G{!����{	�ޔ`{&y�E{xbi�e{�Jr��|�/c�5}~
+~���:����f�#���������M�Kx+�C��a|�u��I~����.y�W��	ώ���әߎ��
�%�¡唘����[��w!�^�T`����^H��*��-�����	5�G��Ȩ�瘎��=�Π����4���r��v����_�ҍRG��f��,ދ̋������|�,���ƕ����{�
�����Ҙ�t�ٕ�^��1��F�ő�,;�'��<�!���_���������Y�l�~�J���J��t�S�#]����'FA�4��+����;ۊL�P�f�&��ɔ��ޝ������ը�s@�夏]�0�E�����+:���ևSS	𧠨��jVPp,<XQ)�XVl�(Js�&�J!����K{�@B��E�.
�e���WqQ䆓���~3��7���F�HI^�\�������ӡ���+j&Y���b�dML��
�{#�����)F���A�;q��T0��_�
^��9Iݤ�xֺ�ƢYFh�9Յ�hX;J���l�����n+j�ġ�(�m,ּJ�����(Va�V/���aؑ�@�Q~.�8_]���7]�������
��g�|�F�)
-�/��MH�|����P��8�%�oFx��C��<��R�l�
A�^����Q�l�
�z�rJAU�U����d*�
���N�$i܏�
#�v
b7F�*4ނ���
+
���pv�i�x֖�����I��o�����J۱�#�
+��W��h�ԉ�l�"�kx
wVjG�Dz���*��ߜx�W���:Ʃd��P���$�����j�4W�M��[��,]�ʫ$���W��$I�&��N���}�7¨
s������1@�9�TɎ.�E��zN�Df��*uwr ����	�
*�#����,�h؅��"�8=���N�
�%�=(�p���Qu�9s�Lӓ(�&��w�ھ�?��ER
�AHi.R�~	Ԅ�6�����:�*tД3*���۱�x#�m?r~3��2�+�w����p���6�yX
a�TO�#��
+U�¼<�_)�
I�(��}��W2S�X U��w����
M��f�_T�)����?k��YYF��K8��u;J$��þ*1T� >,��#h�%T�,�Qۥ{[��s�:��9󅼓�&^!Փ�a��@�!��"
y �
+��.��Jl6m�Hj�u�,b�U6�+s��
�hܸd�-ʥ�}�wi� �-s�un=0�Ľ�i-_�*)U��_ˈ�
���b$
��na+;ϧT�
;p�pA7����C�4��.*�Iߥ�a�8��M��m�.���ACi���7�\j|fi������ԫ)��]ޭ�j����ʄ���U�]�3(í�
�wh�J��c�h-�4x7���h׿*
P
0�H됎L����랇ڡu��Â������,�{�Bz}��8�v�g�g
�Ҳ�d[�!XTZ�Z.��vl�A���g��
+{;S�
m�`v��ؿ`~�?g�a.�
+3�Ì�{����L�^�������W�����Y�e�4��]�L�<pq޴���������k���!��G�
�]�
l v���:DeH��Xq��E��K4kHoS|�X�ֽO�7����o���*�*�+ ����2���h�`���?���k6ݤg���,�M{ST3��`�b5��XE�#*�і}�
z�#C�//��
���7��}��V;�9�T��
)?�ވ���2[�ُ�]�n�$�~�
���f�Ќ,�d���p,��B�AdrH��]`u��P��V�k�aEV�vYN��U5/y�fD.�ݡ\ �1����Q�a#K��E�:�|��N[k�=�&[],����1$��ξ�B���0Y�(�ߊq
$���]�!{Ik5�U�3�j�=Or���)�<V��
A
8H��:YjD!��L_��|O����l�xE{EY[��9��#Ev�x���2�E��as=�[R���Q��i��*��i����66�`�����ώ,��+�#�,i��1����A2��� @������ƪ�W���m���H�XJ�NP�+�)�̧�+��=l��$�zU�kb��]�i��[:��<�旰��A��r)<�� ���+e.��
+�%���ӂ�B�s�W�����ď[��~�}F.+}W����t�=�� 
+��K�e&��,�^��-��v�a�(0����

�t�tz�S���w�0D��6j��tl��.\�lVդ����)��-
g�	[ѭ�'��x�|�|D�D�ߵ�����v��wi���8�ư=�݋�bY��
+���TC7j�KI���X�7 о� s�{��W|}��&饷MR����Q��rs�%5
ԯ1�G��
�*=��V�DM� �鶢l���`JY����Ke���\
+��kl�=��ּ sr͌�
+����_L� �\�E܋ʮܤH)�B���"�nĕ)J�ۙ��3g��Y�i&M{&MʹI��B+!%��,O���=Y>7o����k����!w����I�~� Ir�a^
=�C�#Z��h��`W�u}p����)��"�z�7ff&�3����$��
�F�����J8Ҷ5���m�
+
u��R�_,^V��S&�aR�~Pf��LL_Dw��*��`\�-�9]q�����
�
�
�����T�I�6)�>u6	D�`e͢/���xq�Y%�9��ʜ�;�åO
��
d\˾�P�&eR�z��;�]����.�R�<o��Ρ�]�P{?�:�
r̨\���ʻb	�Ҥ�3|����m �s�؟���W�9����oZt]Rn��
Å\�c�W�#+�n�I&�g����y��Ajs�N�06�HiD����'@����J+
��a5V~�cR�I��̫�vwtU��c[3+?F|l(��i��U�����^+O�?R��s����� 1�Hqil��$Wþh����=���(�RE
+��1�B��vџ��n��F/��
Bs�G�����M�Y����9>�ܖ3��ȗqI��
ڣ��5����V��_�1ȣ�β��i��JiX�0�WV���H[8g�� _�/���
+n3�
`�	���38A.|�f|ј0I��6�b�v�%�&� ;Y��㿜�҄# �d��D.)��.p�'��3�J�12K[D�uɥ$s8�I<�R�i�m�J��8�}��f�� ���DJ�ƀ຃ws�!�ʫ���r��RX��
-\y^�*�̏Ld'�雲9?)

"�q��^��5�/<4��i
+��Q<����
+��;/��Ա�JB"���7��t͚��,m��Xdھ^�;촞��&s�`�Y�"������Y
�����{>Ɗ�.���z^48��e!��R�6}��vc����Mi�oz���o�0�'�=�~���i,3�:?-���?oS,���9���w������#��R�Oa����������
;�	?�
�����p��B����
+�֞I����O�
ݟ�e#}ԯ�N$�\
�l?�
]�,��
��y,��>&Р����q]�yh�0Aq��K)ĝB�F��ҍcH:��-h-�ǟc���f)�K9T��127]����q��EjL���<>h��;�|�U
+��������d�p�G
+ƫ�`�&!���8a
��l���`83>�.��q��ɂ�n������A�9
+;�
���`��H��B�y�g���
KB���*k�㰗2fF�=#��OM�
� �eT?
+m��Tm��
�_����OBۊV ��<ɆF('�n3u�G~�Ȯ#�7Њ�9��[��١`N�s�.�P..콤
'Knp��F�
�\�?
�B>���-����`����N��W�O�OW�B���l�f��x��W�^�<x==���Z/~�4/�.*g™�Pʲ�<*V-}&���ٟ�w�z��Wq=g?:��;[���-�(�Z6*<�Ȉ��`p?���2���eQ�yў>�b���-_�

x&*/��(�j����_�=߆󑊢�zF���`�Ld��E:���SN��ʔ@S� 0���3�|T�O�Ko�k��t��o}bF���z$4���-���,�.m��'j*J���|)J
�6�B������P
^�3ewܫpX���.��*��,0��7xP�ڳ�:2�X�
OT�21|"7��=<J}|�wl\��}vGic��Q����S�]�<�C�jȹ*	@8�-f�������݂={ñ(
����]�x�Ѩ�n���?�ϑ]�q�O��ˏ�ExyU���c�0��t�M�]��u3���
j �o)(Co��~2�s�Ѓl�����x��֙
��
�{��L�7z<��"�!s���[��H��a����*�{���1��l��1��,V��&I*[�v�$�#1/�� 5�Z���p(3��]�8��i2|(�2�
| z�D ��5 N�s֬����viV�`D�0Û���]���R)L�!'n��"� <v~�x��)�~�if��
+wnK�ܑQV�B�"�����Խp�� *�+ت�ED���*� �����(���o	B�'{p���wH؆ʴ*JѪmA-n��WjGE���ޯ�y~�~?r�I^
WO
��@�����l)��ƶ�W��giX��
�"�C�#�k��nA���
�˻�r���)b�!�U�ڲI���b=��>�0�ߴ���y}ĸB)H�[�����Fs�
��V�+���̯+Y(I���(����x&��9JAI���'tXm�y�G�=�X[8�TK�)�2��
<�
TSR�v�x��lȓGO�|�g�/�{�>���
4��/�g�R��F�ȶ��&�A�5���2�
uЯ*B<�i�� �0�g�r+O��A��,0���-�b�u�g[�\~�-����4:I>幃A��uF�Ǟѧ��u�D���)B�,�
*�?n�`
	'qQIz���K֗�4�{��
B_g�6�8�#�ʉ2.A�$69�!�̒�ub1&D�3Q�x��"�
>ɏn��νx�VG�&��Tۨ����Ó)�sx�d-5��Kx [...]
��P��mBU#g���B�g˷�)��-*�E
+ar���>�>Ƶrn�[ɭ�F �-I���ByѸP�=��ĶK�UC
w��G
�D��}�����"��vN��.p�]�]Q��8u�Y��{�#q��C��v}sa���x_o��y�iN�r�����(�
d8a�w�2C�Q�}V�8�UWO\�g����
��\�����yk�@��d���c��Z�t���9$��u
+p��-���1
���z(�=�f)
+�v��
�ě9����2�
 w	u��煼��ת��#����{P6�+D��q3HIi����%��B�C��
b�!���kc5�&U	):X�$܎���[��b�2�
*@�PkcӘ�d�oT�B_L1Uwi"�)��=�2#���pI9,�R�O>�T@>�;�bn�����D
��PuC����
fk���^�^��\��G~�
 ��o�L�Rc�Hqܮ=-8^5Oń�y*9��:-\�g8:T<��?*����C;��[���y�X���+����I�;��lRL߭�$D��vY�TQ6�Dy��Vm��fy%/sIs��mXP1�Lռȭ����vow)�QB�b����_ L�V�wu�p����eė���O*��|�+�]�(uH�װ4�W�U��.�{ �4�\�m.Q��w
�����R~MAi���Rz+%�B����K��z�?'�{ �� ��
k�҉
�a��a�{���H]��sX}d����a~�3��_�au���Qz�	
�������VM\ĵv5I0�L�M�)�DŽ�p���1��:5�
��,�&����4��
%���!$
}o���c��ޤ�A�]R^x���T◬M&/B�:D�wA��2�4�����?�c�d&g]5�b���4���a?������i�ǐ��  ��Ĉ��.OA
6�vfv�
s�d��(5yT��H���/P��=�(�a��;zUs�
�b�W��x�Da�)E�ʼ�	$�sg�PJ�r�e�Y�3 �w��`�c��F�o�0|U[j5k��.�5�J��&�����e�T��o�r	��È´��}I	l�p�jC���8c���5�J=g�%U��o�|L5��8E"
+ِ��
�[A
k]�����J��͆�VB�M�"{�N�r�����Q���ih Ц@�Y?��6��^߫ZWٯ�]ذ���c؋h�KSLj:>�O
ɲ���.���ݰ��Q�{5mm<ٷ?^�v"��}�ъw��9��O��&�v��X�7�km[	�,70nΒ7|��e��P��\I;<��u�^`u�!��$P����B
+ET9��ٲF��W��c����m$��="G
+}K�e��6�~֔G_���M�DԿ�s`� g�]
�v�p-9�\N�d{:�:�gv�H�_3fC;}�Ɠ
 P�� �N���p�H�
��d�U9u�;���9$8w��
���3�r�#�A�F�iD1�n�����
-}��t�e�  ���D��H�!5$�
�,I�Q:�ȖR���1�3��<�7��
�j�1�[�ЊT��m���WwzU�x��|����վ+ք{������W��>��p���:ʤ�JRqY���^���`ǯ�<�~�j��!m�r.�B�+��'���OyY+��fN*żt
�W�$��W\�2��� �M_�c[�g������jj�%WuU{{�,_��p�W��n%}P�I^�W�|nˆ;c!�p���u�cʨ�N!k#���)k��sd��5n�Ž�6Q{H10���U�
+�
�
�-�"{⠇TZG �R�,��ɇjࣶZw8j	ICF���:�b
[	
�\+�?�
+���oA
n'a
+
+��O�j0���`�%��|�^�/si�_�Xǣ�Lqi�w]�I�έ�D"J���!y�!�Զ�n��0�R�	z�WC��c�c�h���ūK�_R
[��*)!
OSo��u���Oշ�܌W���ze�W�C���a�����ϝ�L���/�QB�o�_��k�/cg���&MV?��֫5z�� !g����"?w��P͚�I�Q"����P�AdtE)q4��j���G�s���n�{"�
���}e��UM�rk��zvi89C}���
X�LB1W�".ꕝ^M
�����t?WK�L�w�DP]t�U
�揊1r�J���ոK��V����GM;ph�շm� �v>��-wg����FN�
��cI�P�#q��W�����I
��;�N�ٶ��A�)���H~�7i� t�hl�~��~dz�Y�
C����x�2>*c&�m�b����{9f�1X*�L��	�#>�
��
+
V@���g蒼]7n249=M����K%
�;��,����F�\j�
�1��kl�Z�i���؊�����ΐ�.|Q��9��а�$_.!
��;�̿�l���E�,����ɥDi�������}D��
3^�a
`Y5�
g{J=m��ɳ���y�3���C�M'�jM�-i�Ц�m��
�n5?	�SJ�E+U~ �;����q.t�Xd���~���~p*Q�eS��%�.��Ћ�"ư��Bs���Z�6-�����6[\d;�^z4�`;64藸����ͱw���
;����|�+&�A�f�LU�3���X�T��m���)l�F�'l
�V��ɺ�gcG�Ob�bɜ9�;v
\�C��L,�
>B?�KGC��e"�z
-@��E�����H���</�s�=/�ᑍY���{��P��w\L�1A
�|U{�_� ���"҉w�+Gm�
�$�#�n��o���x��N����+���}M�9�MbΥ�_ at Tܲ�'1 �,�q��$;��!�헁h1kb���
�����Bo
+�\��w�J����
���uY/|ϕd<w��Τc�~ώ�����
x�¡�#d��g3�����~����g�‡� xT2��ȵ��6s3�i75��ƻ�Z�E\1�\�ɺ�W�A' ײ
�� M	}?;ʂ�8|R�0S�#❣� ��CۿU��b0���L7ֽ`���hcEk�T\�m
�+	6�&�=����B�9)� �곌����
\�@�^
jk��a�ƚ��Ph�<��=T��6�K^MK�͋=�݊�$�Q����-�U�&�>ILp<�5������'��҉�����$>��8#�g�L�2�m�	��
c�����1
��c�
��F�w)�P��+�r�kC
q�p/��u8#�!�*
g��
°�Pa�`v�u��@��o�H�`"Ž��:�z���
_��Q<,D�>'Ӆ��WP��� .����`�x�W��3�|!6��	�
+�5���
El�["�,0�	e���[Oz��0~l�U�O��+����&x��kP��c|u��$k�.�?�{Qp""k������r�6��isV�a���=~�@�W�_�
+.<�7�
+��2�#h?c~�m'r��E�_�xs��6����a��������G�+���K
1��4���L^kUp�^^��_�� m�S^d�Ш���'����>���}��5�����$:τ!
E��[�b�Jx&�n� t�(��m�;Z��s�F5u�q �X�.�Ղ�BqKP��� *�����l���%{�ٓ{�'��f';�,TT,�b���h
�Uq�2Z
���3���;�}�����T9�vw��R�R;G
D�
+
K�*��/@hUv������$�j�!
�@�
�vyבm���,W�|-͢	�^�
�~�D�_��􆭍�"��ĉ����#c�禘�*�X/��Ϝ�e>�|�XH��;�:��)���d9gƖ�4�aB��
��Q4 
�E� �w�,C
+ۯB�U�#�>�SV�$L�-��5g�V	ϯ*�B����#��}�
np�þ�td�����U�$D�b&$^�\^�&Z"/˺+�-}��%�Z�
��:}��9���A��Yu��	��rT�lP0�"���~!	�͚*@5K�?�߫Z�-�P������=
j�>��܈�[��O?)�a5�
+�����?��W���Us����y�5^(ge�${C����m>�	"���G�գ+�$�踿��ϫ&��
Xw������
��8?��g��,'ō�=�"����/x����N����M)���'��������EF��q�rf�
CįQ9ZY�$r!���6m<YZС.�<��V^�z{U�S=
�P
+k�X%3�x��fj��n%^�����
i𴵻���s���3�0���q�h�$��`kܯ�
D& ��!�M����1��W�}훌1r����=2N��Sd�k�b�
�\��ŀ�p���d�W}^�'�S^}�+P�0iC�
�1�R� 0hDz[P�� �&!��v@�B��]P]V< �SܒG�L�O�
NgK]+&
��-A
+�2���#�sL4�j��&�D���i�b&,�A��MS���U�D��9���y�
+v���98�����j�c7MI�~�(�sL#�}�3���(M�^ N�i�E�K�E8�mi�	u�zI�$N�r|}*��+�'�4��w���{�y%��F $��8
��@�N�z��^G.g����-1Vfk�)��G�����]�u�6K"���K���1�p���P��8����r���>�)�4�
��V�9�k�J�$#��
Fь�X��٥�C��p�[��ģ)C���S�;rFP#�I�m�K�G<��h/��U�-,C
��O�
kOK�YY�;�MH-�t��%�^N��ξ�B���7"
+���O�aj��X�_84�V(N��-{D)��F�0�$�!�o�J��d�v/_�
�(�ǀ��U�H8�B �c�1����f�b5u��&�*�ҽ�n�2s���G4
0:�\=Y2�߯	�$bi�8亵M�$ҙ:ut�N�)��Eh��Dh��d�j�21|�*T��V�˰���T�5ȮM7-�^��S���84Te��hRҨj�[�U�G��U���1���K{�Nh6v�g֨�+��G?���`
lݔ$Rq-�.ަ2��S�e�8
pSՖ�k!�X��C�\�z0�0	nlh��j�<~I�����,K���r�L�)�IM����9M
�_���c+"vҜݤ�L���$>ɺ��z���j>>��X�9,�ZL-j��Ib�k��ȉ8�˚?v�t�����x������P�IO}�_ay@
��:����|Ve�6�����ubd/e�3<֭�z�t��e�a��'�c�LaM
+�lz&,f^�_!��?�l����2x2�X�y
���ń�3D���
�)�\ ?�y�e�
~��4��O�+ 9$�
�
+���E�V�D<�O0�Vbj&��mLB�2Z܈�b9��U��;n���6L0	�+��oˇCr�E.~�>T�
Sؓ�7X����?MM�!���Լu�O��t����P
Cbt;���i����ް��a��@gW��#�@��4c�9.D���o�
z2>M�5��i�~�u0�
�q�s
�wQ�9�ǸLt��삟�Mz)>���kɝ���I�;���io�"���U )��]$Y���L
>$����$T����:gUo$���UK���,�C�`sCMAJMÄ��K��C(��g]���ٮ9�s�U�G�0?����L�5���
�QM%��0O�l��5&���`�Ƒ
1,��x�'���{��k+�mY�}����-J�s#\��d���:�i/�N�K�����  \8�H�����stQ#��-�ND�)�.s*�Z���y�m�n�f����\�1l����{��(E�=�VGW��9��s�:��?���w���ǟ�Q�Z�sC��6��A�1���ƃ��6K�@�8��O�UY�^��`���7��������j6�@�9?,y����
t4&�}"�T��-
+�\Y&k���V��x�녣3��9��1ٵqQ�=�b�eMq\���
�����`/nņ|���2��͌Jkz�D�mͫ�IR4�\~5Nl��օ���KɁZ]T�C�3�l�̅��D�3jSS�)�t��Ww$IX�[�w�V��
+WT���U�w^P�eU����h�WE�^ؓ~W�c�h���s
�s��I��g�����`��w��g�s
(�5��� ��mr��
���]
��
�B`7Jf�A�

���aA�3Ɠ��G�����?{�O[
�?�x�j�/����Z�*7�e�x��X�z�
Ά��})��C���?`��K�c�M����Ռ��&)����Y�5����J]q':]$�؞�]Yv
x�(�����ı��H1��e�U����>�_0�b�?*񸨎�b����
¤،���
���D���;W�xm]|N�7U��13*�;��.�=��>���S�Üj
)��CM��>��.��e�I����1���/�Q�v����6T�
kk
+�Ɯn\\�F�F��V#���Xd���
e�&~�WE��7�"�bj��
��u��^I@�j@�bQ�
W��k��8���w��_�D
��^��z����
x�Z�KA
�_`�T}�]
+x�}�Ё�M0S�,r����V+	K��O&�ƈ�`�;�E{irf0 F�]�� w86f�

����fm_8���c3����V�<)�r1��p���� +h��s|p�
� !Q��P'�Ղ
��ʛ����2�r�Ӥe��j4Y�
r���,
�r�?4�
! U��q�]f�(��*&umM+
�;�1�
+-���c�8�C���j�L=L��1�TDJ���7���>����)BH�*�c�HY}~�xI,{��7��W����jW�ާ�ʇ��h�g�_���Yov�MKi��N>���
Q��R���ǧ}��A��Q�j^��G
�s��yJG"�?txt,L��>�֍p��_��>�Po$��^<�%}���K�D��S4�
+�*S�<ܖ�y�d;���éIJ��~J�M�n>��ȸcI6��u���ɖژ��䩊i77�_�5W�2'	9�
�t�^}/��8%wd�� �0k��)��ͦ�F9
����k����ih��3�Sh�
�PB�U�Lz��s���'0�$Y�/L3����o�����
l���|��f
�ɪ\AW#�si��S�-�O^�I��+�3��6���xas�� ���@M��
+�A
h��m�4�5 V�-��'
ѵ�1��� S+
��
~*�
�%~k� ��˝��ʉl
�*�
+�lك�=�3���_2~���OgP��s
+�C�����c���d���[�a�ے{<Х��j�A	{! ߲ۓ
���;O'��9+wEH�E�����&�J��V�?f�iӺ j0�5
瀶bhW�Zx�o=��ƺ
0���z���hK5�m���o��v
(Y�Ou���t�;���e=��R�*
��yMV�n�,�$v:��Q�ڳE��.�y�Vl�;��svn��,��Wi.[�����@�����34S��D_!���M���F�>J柣ND ��@$�Y�~�-����C�Mu
(+lBpБ��^��#$�~�2è
/@̣�6 3�n�h�
+�;������۪.��������3F��q3��\َv�Zn�Z"/��vNF����N�J2V{�#ΚV�s����e_쑮�T��a�8C¢�!Η��>F��L��\�
�M{���5��eH~7;F��	�	�A���������B?���V���Y�=۩��Q i9�J.sӿc%��FVb�dեiL��`�a)kD���=W����
���
��� \n����e�>�N�X7Ƒ†2I��Y
f-�to7���/�~��U��as[��`W��*
v3_�`~����:k��� 
�j�R("�E
+*���
+��e)DDI��ss��,�f_n6�"���:hm�h+�]Aqñ��Qq��S�a����9�{~8�|�~b�h6�G���ZĠםN\�h��+��(E3�0�~������k�
T�MG����1�:zk�a'L��G�����2�>����, gt
���X&�@�?e%�
+�����=@��Ih�s��
��)H
��U�OeX^m��7R7�~�,���,�
�\j�����J�Ԍf�ͬ����
�8!*�]�JR:��W�R�]�M�ɚ�
�P��Z��;��J�N�.8ɦ������,�[�r*�Α�]M��M"wa�X)Lbjd�`�>:�?����|:?u��>^��G���$��fa��.�
+
ʥ_�S��%�ED�8�
�J��=�ĕK���{����
�6r
z�G��G�� ���
��U�i�<����K�g
��"���^ �q�
+����I6����vP����W�y^,��u�c/ 5��@�:ǹ+
[��N��+�l�i�{��P�#^�
�y����v�,ñ������-��N���ѳH�⺣<֡g�x���V�<
/���
nb�
��6���󴳜�Ρ
 �+nhB˾�P��oT(�W��#�#ĉTw�ZU
}
� w-��v��T����-9O᭺HI�z)����� �z�9��R'�d�I5��a��Z��GS˟�ag��W=��.�P1ٜ y?����2��
��X�)r�4VaG������X����Be�`9�Q1��͚@8�5��
���������$���W?�D�}��z��2�*�
+���
��p�t�
+����;Br\ܕ�'>
���-��v�
�C�Neʔ�����L-ʌ�q��K�H���r
�7�I�
d<�����B
�gNelB^փRγF2��A�qCR�&�t���7߄��{"
D9����u)��C��w���1��t�}?"���'�[�7o�̩�~�1�{�>R�u*�
��ʖd�C��l���u�tqf�2[�l�~{S4�>�J$����.nQ�nl�P�#� x��])By`r+��w����LH?����VD:�|��iU�G��~ժ�+��&+R��b� gP��>��}�����W�Թ�k�Qǖ]WSk
q�w���Z
+�D�Q���d����V���d�24����K�G�M�v���U
35��K�J~�4 & j��w�J�����*��y�;��X�߉˔��O���@��5�hw)�񘴕�o�-9E:��_�
�̂�o����&�6#�V��(ѽS�-te$
�פp}�4�%�4m�rn�z����he4�KX*��KÃ����2�9�ʩ�~���'Ǥ�l|O5ÍB�
+�;�^��j�㛑Q�`�exH��;�J�\*�`l���˴K�h��k
+&����t���F|(��8Vǡ�ܷ�
R���:ϳ��o�G*UjSKk��nR�
��gl�
��ޅ-�
6���&��Nŗ������7O
�4��rGm��O[du_T��vY�{�
̏Iy�\�aR�Ky��&�P�7ݪJ)�l���"�W�5�{K�� ���S_����j 0WSW;�w�ix��F1�^l�О伴^�'�
1���b�%�OA�����X�hq)L�7��j�}=�9PX��=��n��`��ɗKX#Cù�A
*7{� �j��WܴT�By�����ufכ���d=�A��f��]����F���=�_u*`�q������+�_i݋\�^`BaE�|�S&����%
Z�
�a�8����+Q��g�Q�[�IK��-�j��IKr2T�cju�=A
�ʧ�Q�"7��{ٮ���ם*�X|,Y����
z
����ѽ�����}�ƈf:�jCo[>�]��x^���h����lhNr�ϳEDk��c�C���Ǫ
ת9��c	���H
�t<)��}�z��!�hE~DBӳ�2�S͆��i{;�o��u��I��p�??砃4�6ٺ��^"������1�R������<�-��65s��j�p�C�����Sjqi6dzھİ�紈��
4�1�.��$�5E�
G�9���:�
�=��o���b��쾄
v#��[��x�ﯦ �AF�+T�����
���(C at RQF��7�7�2��I$��^a$�Eq��>
�.�AE��b����
i����O0�����]Т�K5ΫPÛ�G���
���
����Z�d��J���*�$d����
^�}E�*֤�>?��������Ƅ��������$d��O���	�_t�l�%��$^7��[�K��S��ECq�z�"$
]�*���B]��}��W�
zT[Rk�"�����n�]�E��U�Y
v��FU�W\�B��6�-RB�^M��e�2B�4�<ZR�V��jV�y�~��O��
+W>��/w�ͺ�h�4E��k�5˖�<1�U���[�t���D��>�Q!�.kR��涧�7�u� J��c�>�c��
+l���/��i^��3;i�����ڐ�
0��s����Ā��Z�n�S�
+���q�W7�N��p:�([���5�6�8���V�
i�AFޜ�~h�9�P�ldüj�2�dO
+�+����6��1�--��1E���wv��	�=JCH��W�3��4܏&�x��8,���&�����#Rc�3D�vz�6��RS��yu�_N/nm�ك��vT����֥Y˼?��RFװKz�n��9����Q��4�g�C�^�5l`�P
\ܲ����G�&���ޫ`��
��9�P����ҞٲX���r�6���
+V4,��{�a�؄���\tcY`]l�ǿԾ�a���r�鴯؏=b��!��&����Y�b

�^[\�aYt�$w	
+���[��R�)���i��[�{$��7f"��o
���X��p
+��z�Bz����'h�
O|Ō4ǐ�|-�j��
+:���}̴a� %Tv��5��Y9QK� �d0
?�$��ćH|�#�u�D�3�
p��h���r�d�@,@Xm��VK
Y��@o��u��([���8#!OM~�.�7SoJn%<��I��dZ��=�1�D3�!P#4����(|:]SYd���_��kG�����Rh�+Ot�B���%�/e�䱖�&]�h��r5�sl�or��Q����
"F�,bՓ�*2~��:ʼ��i��[�������t��˦����~M
+�U�6�DU�e�"udPO:���]�x+����G��B���]��q:�ʥ�'�:�-ML3\�F$�7�K�3�
 C��*s�2��z�F�s�'����
�
�̼K���s�����Ӛ��w�ER��	�!`%aT��H��v�R�W��SP�ƅT���}FVArB�[��SS &��}p
�`�	�~����_���1{�,y��o�����
���{�30��[�b�
K���:w�3��Mn����e6�s
z/0<x� &�3�nj���@���_d
�K�Bٓ�! t�r��!�6<�
�rƕ�KjT�;ҽ�����.�Z������.,��68�MUl��{D
6v�
���@)tmp�y�_.>OG�"
+Ü3N��|��
�/�'��O��-R_�1Vh&׺
N�Pz8de���
勊ZTH;X����Q�6�}��+���'h��_� |ȋ��Cc�����u��H��j�BA�,�N�OS���{�3���	L��� `]���1��> A���
�� rxӴ�*E^�.��ؐ`����Q5
�v{`=W6뼟�\9a����vGO��Xc&
v��1���w�~��� �0�W�:ʎ~��f��:
0�/˵��%�m
�KRK�A�������c�R�%�	�P�#CS��ߥ�f�mD�5�oEx��1�7B����0����<&������Yd�8"1�
�wܡ5�� TaaJ3p��5��
��7�A>��+��y��I��
M���c�u��
Zd?�B��
k1���x-���r�sV��9s
�H6p]D�G�g�O|
y��5�S�$a�E�`$�Ls
+[��Ym�
�~u�8��p`6*I
ߕ�`S8���8s�n��9O3nX�OE
/7
f�^�l�bN�[�PB�F�O��.�9����Z��_
.�5�>�F	��
�S��̉�R�'}ΪѬ`_d�X�|�{�d��HXԾ3�QlZe7P�R��q�ش�O5����OkZ��r�x5u`a ǂ:��*`�T�)��,�
+DPQʮ���dߓ�����J�����Rk=H+
+*�#u)���h��) ��)B�6��s�9߹瞏��H�ZG�z�G���T�"9��3h�D�ͺ
��s��r|��b�4��y	�$��TK	���"�$��I��~
�$�v(�B��#].��qi

��?�C��N
�����~�ޱ�|��ܷ�LcO�n���T~������vxj��̦5<.��f\K<��2p�:Cp���S�y,
66��>|z�C
+���� E
+T )��f/��:X1�}J+��>���_���~ ���Q;�^��ㆪvs&�۸>�.�k�7��yZ��S��:�˩㜍�r�
ݖۜ���aKa���!l��.g5���7�Kv�0��!;ڗ�f����e�
��%�]"X�T�
�J3�aժ�lwV�j=v�姠�α���e=b�I/��g�H&���
�:����g,(y	27�>a�b�a�8���8f��VV
�q��ɌT���0��N���������ɉB�����`(
�_"f��o!�
�t}Wg��_0}H���X
�9�,�Q���x���=�~Jٹ�x�>����ӱe�9�M���2mF��S��)�Vk����-eZF�F٥bt�g0��O?�D�ǐ%7ey��ښ6��W��S
��C��y�e��US}�
�l�`a�8i	��g"1лJ�"�|P�Kڝ�c�,��$����+�&���P����vꖴGBoj_t4I
�vq�f熚(�e��C��!��b�׼�^�S��b�Yi1���¨;2��W�`/7u�h?4
+�
���!��z��@#(���T
���6��
^��!�R	S��#�>E/�S�q9�z_ 
/G%ӈ0C�9�[ۼ�@�(٩��P��
�,�}��X�T�Ok��p��QȫU�G6
��
�x�2�e,��> ���
-?�ϭ��QެYz�/�T���5�FL��^`�tީ��3�\#�������̬D�:�
,�v��� w[mDW�����)��TB��Z���`0Ֆ`3t�BQ˟kk��s4�1y�	�`�\�޸�c�V�#��z`X�Hhw�A��0�چFTy��qӵܫ*F˪�%��*����/>�9

+�g
S'�"b'zL=N�)c��s�*����b�R�����)W<�#�S	��癛)K����
��
+&���L�\��9W�t�W!Y1�������7i*�%�����wJ_����
��閥�n�WJ�!p�����-0�T`�:K6B�+��S��z�l��L,~��J#ZL�HBEe�߈E�q1
+ڸ��TD}�bB;��*O�TC�nՍl�$OY��Q��0m��z7�o��9NŻ�|h��DV�[V��e�֩b7���Y��ZÖ�H��l�����~I�)ܻ�J�5�����oO��ݑ���%(��,�h�Z��G��ҼmR�d���!��/NEWutV57z;�j���j��s���^�^lD�Ǿ0-a���_a��L�؁��w���44簍b^
��ppi������&n�X�	����uƻ-�݂
�-c�Y4��_�����
��g	?
�j�G�I�fH���
�%��J҂[��%ϩ�C6Oz vW�z��oZ�t�A����$�?z���;�
�ؼ���FT2�/+��0���@��@S<@>0b��S�uq�w;j4S�'�/4s����E�թ(P[����V�^�5ƊH��k�g/�ۄ�w����
0��*��֭ �a�j�yB��5�TC�
�J(�_��F�4����!�m�,
R��N�
�?S����9��
:״��O��f��O�V��"յڇ1���,V)S��@�._
+���#��Q�`�K���|ͨ%c�j��/&\��:
[��F�t�^Z "��q�٤Jm�뙊jMarח�`VCg
+��w"�~><��
�8�i����}�X�T8�dzQ��V
Y<��<�J=��E�ۏ7
G8v6��Z:�%���hBò�94^�ԥm!
1���OD>�p%�H���G�����/�Û`rq�;��N�m�~M���s�\��/���Z�h�:�(���MX�а^F�.꜋�.�Y����s}5�`a ����(�(X0�T�+JS��
�4�&��~��|iB!!
!)$�)ʰ��
��WF�Y]E��븎3x,��˽�}���| 
d��c�
+��|�i-��0�Ws��
+Q_G�pRj�y�0���׿�t����j��T̎�ԍ�
D1��څ�ڍ›N�:ka?
���7�e���k��_�%]a;�ז���F�=�9��-b=
&��Mm0-�vD�'^�j��+��/5(er�^�+E��L
F1�$�1K���WE|f��O��FMK�����m��:�:1`�ڥf��X�ЩM�*i�9��
+l?+Lw?-Nx��͈��wɳ\C0���瑃f	�s��
��M;iđ`��$����O���0z��*Rٹ�B9�@�"�k��5�����
v��~�.l�B?�u g�]�ed����
�8J�A�j���͹um�.��D�O��^^��v:�y;��ske��+,L�¶v� ��ŝ���Ҽ��خ�����d��_��5�Z����;
q�#�k>���� �MU\��J����{l*͟��ґ�3Do����y����"UDc�����u��#H�)BP��it��/	v�`�_�Sʝ�{�e�5mp�Ppy�=�-2��[���m�+v��6
*.�Wۿ��Sǔ��]
�
+^DMk��,2�.#��ɲ�\���!{�
^��I4�Ԉ��.~�ç�lDc�BU\b�"c
�j��v�����J�G�|�H`_��2�r����
���H��ѥ
�
��t��HH���BaG�	:����B�f��{�'�9
+[�j��a��e

+&h��z6F�d�y?�>g�ۑx&�l$����^���:����^���n����x-'-����]�O 5�������@S
� U��ڏy]�Tu 
�_,z�
�WPT�|BJ,ɕ}`8�ߴy?p�7gˢu��\JO(_��vOUue4���+Q����bi�?A.j����Cxy���R���J�駥�P��t㸲r��T��fd�d$ֺ�FR>P�a�L���'��
�v�����2M���*��׵�T�]`W��*�cD�*��h�A�e#�"�ɆKO9�J���KL��2��J����(
KgK3jԉf��Z��nL��5��o��M(�_���>�FO����ӹGi}<���@w��#Nd����h
oo4�Y�
̾�Fٸ2�����Y�A��z$�W��֜5��Copl�i�
�\�
���3�2�l�;��a�<;�S�? B�>�<A��a�rL>�z��p
r�j��s�m��1t�Z�c̥�
�{�s�/���J{��c�*�#�3��ހf� [...]
+�oe�*��
+�p���}����%��
+K�"G�*�
yE�%��S\�#���V�9�
�ۦ2�4=���ZH
�
W}d��UU��$�U���>*;�$;�d
'=�NY��
,|ܶ
3�4�����q�T�=�ka%���h�s��䬺��U�X7Fl��[��
o��1a�puxf�9��Q�Gk4�;e
+˸�7荇�5��xB:�y����Zd�ͫ,�`2��?_�a[0�~9iY
Fs�3���g��	�Ë9u����<,yx�87��� �1�����Ja���,O�@/g���O�㔛�
9�4 �|.]�1�6��'�^� �@1'��p:Xt������wL,j��V���Qv@�wl{έ��̱���\�?R^�UV�\�GI�+�����9�����D�0���3o��y�d�[R<� "�"��"
+.��2�}��"!<�4t�H~(��-r��2��5D�H@��l��"K�����濣,��/S}�������"+���~w�������F}V
dR�z�,��:�w&?��C~Fq��J}Jݢ���J��i���rjzE�gU�#��p]ZF��
�%��+���[�Pj e�w�Vjl���W�7��wR��/*��C%�%�j��G�x�
@EFH)&0_����Օ�|Xu�
+D���RNX
A�\0JS���H���30��7�͛7�3
C�Wc+��U#�r#
aQOL4E�љ?�s~�{���s�I���y�?�y>�ҒL��ָKd-ޣJ1�v �*fH
�6��h�����z�+~B�O�:I��Qq�Z��UՍ�
P�[�U��D#�BM�	��>$�	�z|��?��^�������!J0��W8�N�	��W�zX��f���щ@'h�
�<�
+%sd�R۔e�[�$z�,��Z�2�H5����[&Ht	L���
��U�O�
췯�<�u��ɎrE�ᾀ{i�,8+ןwM2��O��\��7I8
��i�l�2�ewkv"9k�r6±��U\�R��*�q��o�GCxxy���;�:j��Y�E)
a���ΰ!Xid�j��
q(���8�S��=���l�(�P��9Iue�&��k)���W1����=k��Z�b;8�zB�C�����4��ڕa�v��?�su��UuP���\Vf�>+�5�2��j&�P�6���uR�ɮ�!
+a�+�r���k�!�o�4	��`��ܗ�P)f��%��V��Q�T��F�(Z�]s���,��TR�|O)O?��h�o�# ]�6y�л�)��O�U�,F��٠����E})�g�s��ٴG�y�Ҙp/kw~˖��I'Y��;Td�
�g�Y�U���'��I8�@F�*�	�8
$�I��+A2((�+y�8O��ϋW��ȗE��
{բ�b�W�"@�}@�C׌�t�e�Y��gv�ֈ���H���o�fE`�ea�<o�V�	�F�
C��k2������* ]v%녦L�y|�KJ���3��P�nW�(��<� yiBVO��h�P������|��q'�9["�<c-�����p����!p��w5
�ϔ�r�)
�􁢮^.
,�8L� ��o����қr�7
��ȶǫ� .�@P�p� ��"��X�SI�3����I����k�TGm���W����Vb�u6��Gބ ����`]O����ZQ���&'l�T�R&"N�!�v�G{�%���^}T�1�v�:Ȉ�\������(�IW�f��*�ڮ��ʃu��*����lg��w\W�d?�'�~�|S6�|��ɖ)ݹ��E< �K��7���b�%����J�\�*\D�)
��e�
+��2�G��2ћBjx$Z-����aV#
s�/�h"���K6WZ,�ɳ����L�9�0�~G�"~4�
�5"[���K��4�h�����q���ɕ�����F���a��1U�_��K�Ī�)��P
��
?Q΢9�ޒ"��zܮi$��5I��0�]x��oܬ��UJ&�]�:QS{%K��z����<�
�~m댋�/7�ƣ��i_��y
+
I<G�d
k~��x�k�ے��1��e'w�7���۲���
��U�y��ʪ����\���P��x��V���nL"�
N6t�Ħ>�gbN�_�����4�!/�e%�
���O;m���ht��Wv6�������[���i�������yF�y���4ʔa�t
V�]��
au���
�#������Q�Ym3rM�/q{�~�
�tj��D��
�7���f�i
���ɷ
������� �.
=[�n`4���qSh��B�r�x_�5wԐ
�%��n�
Q����~x�'G[	�`
+qb�]Q�2Ը�i�=UGn�~���ڋJ�(�����Aݪ��d��
���
E�7��K�z
+M��]������!}��
j�nh-Cզ_�魺��������a�٭�D�fr�j�6�$-�4�n�U�Z�F)�Zp
��ux'
�@��]U���/�ٳ�ۿ�3�Ug`iU�}��ڰ��U�L��W���u����+��S��U��[���;u��������XJP�v��O�ŀ��{$�KF�,q
�Q���r�u��H��.���}i�m����fZ�h~a���t���M����B�b0*��iW�
��C䶧���jZ��m��n��[nKfi
�c�+.�&oV.�� &
ʭ��{���5�_�s�9�d�m��I�A. �*s�5:	�1���Ů�
m!�|f���l'�6#N�
+Z��>���\�oM�k�CZ8�)*���b EE@��(2���7{�I�"	$!��0a�=+v U�ZŁ`-x�E���JU
Ǻ
+����~��~�7�<N�z���Q���T�!w�����B,��C)k���E��+�
�+��#�6�-��)��
p�*㪝A �����Ao���c��c~�\_xb�5Ӽ�����z�g�Q��u�}޵�z�Ge��X~	>T�S�
s��V6�������i�1=�2J眆Jh�@ U���u�;
��7!�0
+߽�\�醮���������%-;��=.
��e�/�T�7D�$v�{�.ʫ�����|�Z�Ѯ�mcDֲ+-C��u�_��{�>�1�H�1]�"�D^n�R�
�ٺ�:����E3�
[�h9�������
��7�TJOW+3
v�œ�Limc
@�6'��[�c�`Ǧ8v���!���b�R�{��1�_ӵ��u���o��P��E�2��\@;4"�mO��
�����m{��
ߺE1�d��A����}C=W����B�}[3']\PJ�G5�V��mnY�G
Xy�ahd�'J�[U~	v��W�ۅWo�]�Wn�G�n�R���9H7�Ѩ��Au
�1�v�����Zm�]lU�r�
�T�V�A
+sj�6l�hm,M��y�4A����*0����v�J��
R�?�� �Ĵ>���2C!
*�#�q0�MJ
!:ŏ�C�����R�|�d�F�a?��2�
݂�c�h3��d
B��
z��SI�t?�%�L��m��F[�A��x�Y�G�ҏ0m�;GY1űh%[�sጒ@�9�
q��_8�G>
r�

�W�n���)jod�E��z�C�.q�JviN&�I
f���8b��g�
+�
�v|�
s��d��%:uT���f�����&�L��0���~�p����.(R���U
+;
_)�w%$��/��
�t#�
+~�#�u`u[�w�.��q�s����Y��_�-����*'̳ɩ��k/���)2*
i�9��$�7fU�z�fl���c�9}�]� �,툏WYC�
I���k
S�-��t�y7>�T!����<v�`tF�W�V��"�)��'����U���!��<���^��D�V��"_W��퇖��6!�{�9
JJ�j��i_U�(홽�c4*j�����>��
���26�����Kݲ�
�	m�&c<kQ ��Jln�
'�I�y�T>��ӣh����'
�..+�upC�6�&@j�5�t���d�����P��0���=��I�˂Ė����
+�</��BིY%�V(��q/ܦ,Ǘ	�9(B��0j�tI4	�S:�q��ԙ�1��K�h^��ChhC��F�����( �|�|y�0%o:TA�
B�Q��yPI\�;hVʓ���2J
+ĥ[�Q�r��_k`��9h�� "?7�<18�����~���Щ�
t]Z*7֡�^��%A�nj#���7L{Lu�7�7]ČY	L��L�;
+�i�\WkI��S����y!KC:�31hZ�Pf:�߄���0��C�>C�{޶$tR:(ϭuO��
R4����$=��jl����uq�1?פ��9��S�i|c��q�F!�_z^�S
��K}��`�d�%D�T	�w
V�>�; �<�'�V=�(�5H�%j���WM��V�#��9�Y�D2��֓��p~�����~J
��}�D�]�gN�S�s�jJm�n-�>,v�g&S�L�l�#�����>���^�i���8��ʞ��%��4'��R��JD��h�RN0hB�A0�(r�0K+�a�������M��Y��|"�E�G����E_R^�v���4�/�?��m[˨�y�N`�K/5[�7�1���[G�ؒ'� '�铯R
�G��hqꭁ�]��>���iI��X�
+5�'�\�GB�	��ć����d�^u��x�+���[�^��%e��	�֪�p��xE��
+
� �6�%!It�ި@�Ҿ #%��
����:��* �h$r��7ש�ׁ�55�׈��Ց'I�+6��*ЮwȰ��%U�#��zD�+J�t�� �B�a�Uؕ	6����}�
�uO�r��7��d����P����
�Cu}FEu�a 7�RV�"KS����T���20
E���N�{��^��lk��ƕ$vW��(�,�F7��b
ˢÞ��O���y����<"_��)���.k�h���[n �9W�?g��ڈ7��yș�*����Ӽ�uA@ �Op��I�R��rP�(�$e[i<�H����������/�\�t�/��G�inQ��a�@��q�I�a�{�Yʒ�]��e��?D��98ߙ����y��dx ,�8�?����Pe�1�N�W��wA�i �N,�
B��=�%P�K���
�~�҈�G�!Oʽ��R=e�"!�]:�:B�I�\��MJ1�j�G�K)b
'xL"W?D\G�ԝC��{���A�A
?u#U���������UJ����
ǹ�	H{�F[�5h���[N6��){((��%��
>�V�Y�R
+n��#����(a����F�q�&mq�3%�\g?�%�ӆ��M5������X�D3�b$ʁ
W�� ����ƿ��5&͔D4�®K���
c�
�Ꮚ
�.
+��1Z�o
+^`��~¿`�6z	�q���
��aX����ǰ�)��Ӽ܄'��84�
n"Db.��� �
�yC<K���
d��},��{�*h
�

+ڸ�h�>���wMv^
c��8�Iƻ�(~��j?���
+e�o��y
��l/��Dl5�����Żר�p�y1���ܣܵ�����^004�{
�����.��%C�A2��2�d�Wu�����Q�>�o�kL<
��
����5.ſȠi�f��fh�7S��-��|�^����T�jX[�wC�Y�*��sG^1�Ve֗�+�˃������L���3�
��/2y���{���
��+�.�;C�t��J �}��
���-��
>٫y6q<����
��<b�s�
+�bk*ĉ��_�
V���
�����T�m
�}���D5�1o��U� ��Q�u
�*�n��ҹ�
�D��U4���|>�W���x�A�_P�Z�?	�Q	��y�����1�>y��K���\.�!�O�q�M��

+0C�l����];�S�k)��=RZ@�[ɷ�5��
���JBe�ǐ$��Ni"�0
-�ú�R4H��~�9.☫|Dϸah� �-�)�r�~"��e�oM�����
���K�%4	_7�"�‘e�
+QD~�0T��.��>"x*
�O�>�酧��.Ey+HVy55R���Ws�����Ek*
�PxEGB����;(J�
X��(8h�iq�mh��^�
�0`���}���_APW�D���L��Z�‹]�<��4��zG֦`��oy��Z�R
|�u^��g��C�F#�n�r)��Va�
�5�ƪw�����9��n�j�yI���t��
+xI��1b�Iy�>}���-A��گ����OSh��KF�x���6xq�qQ

+�3��S�U���\ka��椚̩�Di�~
�?{�>���J�3m�tߐ��Z���t����]�Y���N�ju]�ɒ���QY�lZZ�s��
NѴѷ���W�>S���ݥ0�B��j������+�7��q�҄fU7���m�	�����:�8���^�;�#�eտ�+���*,�_����C�Y�3���
�M���S��U*���L�X�.jQ�Ȗg�_I��W�J5a"9R��'�C�\y׳qH)��V�U��
-Z��.�\+�Ѥ�/�a��en�/|F�[��?S��Pk r�"�
+^�Y��>����V�H9
&ya���I��x�Q�<�zU1\���
+ٽ�l�*7�}��hu;Twfa^���cn����YS
q;)oZ�u�G!�uT�U�Or����lk;�H�F�-�x/,u�	s�m��>fd��}�+]
+U�.o�.����=��q�-y�]�[��v
�i�R����g���k*�`/p����LBu���+��A����@
��[�)��&P���YQ�?���i�m/��K,�Y *g�u��(i�2�`��؀V�"f��JSs��=�RU@� ��7+���>d��ْ���s�m�Y�� �)�w�=U?ο��3D�����
qjv��8<��!z
g�)�b���^�[$z�RYjT����)�Ԭ1�c�?M�2q�=�@��?��ܣ5�ew?SIf�q���D7����
k�\� 
L�24A<D1` (T@@+���7{��d�I؁	3*8����:@-�m��q�*���8r����><�u���ݹ�\��id��Xm�m��J����J������"��U��
jb'm_�z$b�"�uO���
�b�M��q_'�is��ͼ?M#mp_=~m��=�İ���+ȡ�:�L��;48l��mb�
3�埒-m�
$�Y|H��n��]�c�k�k{>3 [...]
e
l��[I��u��Y_(i��&;����t��o���

�
�����5��k������Z���/��
j���j��p��~Ch��⨿���䦿�iR�s!G�-�����֠���5����
��
+�����&w���a7W��AƫX���U����r�8��+}E)�oV�ӃIÌ}�qZl��h�<�gw�
+��A��?�=��$�6-�ޡ|,)!<�*�ǘ*z!���8�߀ϸu��Pp� �D|�Ŝ�e�=s�m4'���Ң�ؽ�YaP�OZ(���vj?�VG�gxI=V
�
�-�
̹��u�MCJ���H_�-C�]����B~�2A\�8����*�E8P�T��Δ�To�
9/�w���h������������a�ߣ�b�y\��'�F,Ռ�o%��w�U/�ժ���n�M�*��T Ƌ{�5NJ����ԢT�9L��;y
_fX�D\���u��ַA���:x�"�)�V%�V/*��]1���#
���)ԋ���@�X�"�SV�Ӆ����4u�.�f�?��Uչk�%��Nj����;c�~?�]Pۺ˄�W��Ҍ=V�듍�1�
+E�	�
ֻqd{q�׉�;�
+�N�
������YH�d�fttc�
���#&�v�P�tQ��jd����1�o�
��­�R)�ʽ@}����<7�	�&���8�w��y�y�b��H�
�04���͂
@>� o`
�����~�M�<��a9����(��n
����c9̼4��<o��/��E1�������:��ɕ��7e��
�.{��Շ�Pi	WE�Y���x�ޝr��
+�EJ�7
�T����|4��'�r41������� n�s��#?�Cśhk�6
�/ϻ���
�7�
n
�
��HIT�����c6�߱=�z
z!�?z��_)��c�)�u�e�T��}nS�3��&iq4r����E�U�Y�X\�K���88IX�`}7yIi��
+��S��iG���r3�8Eiօ�$f
����l+n��.���*d}0Qe��:F����S��S�퍆��֯�SȺ�8��~�%; [ژ�l0~{��^��
KbV+�T
�s I��x)�oe���q��ra5),k�xU����Q"��YN�פ����ܾWu8G�Q�d�!H�9�2�'���31c�C\��!Q-�;U���9�
�d�Z�o�8C�N�T1+�hڟl-?63��z�,�=]���Aw7!�z6��*H��H*[|C���_@m���s2U�r]^9��n������0�"��PuT�t$�#:H���@�бjy�b��~�=�噛��*��ku��U��Q�m�9�]'pu
�
����d��SۖHgi۬��6r-���>`Oi#�T�2��"-�!NSn\ z��$���S�C%�Q���%;���O���z�c�T)!�M�.wf�.P�o�1���U=B��l1�F�#F0HD�\u̞rڜ*��u�jQ��O5��u8�E$�7:"��І���(Uu�AN�gulW�YE�*Z�"cT\���k���Tx�l�x)�$��<�hT��',ʷ�
�����y�={V?$�N�)�D��P�Vl������]:�|�d��̏��"���w1*��=3*gB'����|�'#�sB�F�S^PR�8�?
�
+$	m�:��@����l���(蕉9
Ea,�_܎i�ǀ/O	I��4�a��S8!��%UJ������8C�(�&2�J:�;{��Mጫ~J����dm��rFW	�jg�Y�?��;��s�8Ҁ�����Z6\Fq�D
,���H	Y'{����
$a@Q��k�^����r
��h��"j�}+�m�j����y��s�������әM���D]�_CJQw�)��/ʹ�5���״2�s�7
�v���}���7�
T�V���S���6~G���oLF
��
YH����Km�k�v���~�U��.+�j
p��o8Ɖ$�5�)�\R��������(��g��H�m}�w�5j�N)
++����������p�vO[n��Hj�͌%=h��
��4�^"��l�q:i����%S,��P����=�Ƌ�G����T����	�B�ULR8LW������$G�xLcLS��},�?�E�;�8Q��E�$?\.�e�!&���KK����J����G���7��|�_
��Ҟl8!>�8��(Y�B�I�Y�`[�}��.�B���b
��T���$��=U8O��ŧ
y��P��-x��$�]��0��_���
+�j
��(��sO�����H|/=�wKR���������`�
p�t�l>f*�ӡ����uU��<�=�T��s�(�&zpK��A?sL�o`N0M�q+~*m��-��~F7�^���5惬H]�${��|�-Ҷ9Y&�=X'�V�u+^�ϖE�m���
+��Y/�0�X� c����A��dP
c��_X��
�V�Rx�6���b�|C�6������^FeC]���o�-�F?f7���Q3�V�>͝y�Fs���y]�ݯM�F�����͊��k�^Nն��I�����#F�Z�.�7��Ɔ�Q�f�eϫCJ�n�;Aj�B
JF���w
+��mԗ��6��t�����(�I5�beE���l���X���Q����͌��
��
i,)�6QS �1zJ�ezVBf��
۹���ʹ�/���	HQ8�9�SnE%�o���-�4�NJ�`�`,��)�~u�t��yQ��N��]�vح �p����+e�"�x����N�6y�*������,�7�$'�x�\���C���QL���[8.d@}���C�ɏE)1���D?@晹���b��$�?7�
+	�Y��M���
N�|�����
_�Td'wa�}��0Z�������<���9|��3�����閗3~o=��Y>���l0Wb=P1��jmE� ��X�R[l�o�uv:.�C=���;.�a.��Bř�S[�n�W�J3�ǟN�1='\Xr���8�۲��:K�X��j�6�e	�g΀a�p� ��%z"��K�1��.c1�ɇzɭ�G�T�Ri�VB�e����� -�)K at iͬ�!�u�@_�`�&2�q��
u�p�%P ���
+��S�Ч|N�WP� !���o-t_�
��n�y��V|�ؤ��賐�e`Hʏ�E�=>\� 
�Tǀ�|��cҎ�k�IS�T!������%Gu,%[IR�'�������+#T�}m���3��\��/���df)��`����n2�#���\�M����(��CQ�d�6f��l��qG����v�첵).Z&���w�I�����Te{�������JQ�����ܕQ����E\m�`�p�`��Ҵ���\�z�[�v7OV�o9ݜQ�����}��$SSFMW�d��ny��u�я�:�	�*�o�[��3� ���
O	��
FRJ���0��ո�l����+��L+�&�
o�E�+d�-�
+�@�?��
^f�E��ko�o�\fy���J���8�z���ΰ�Xmi
����
-Nw�}����OY�p
z&�@>��g�ݪHc���.��
��]7M����z�#�f�����e"�g���\��a��@�\�qyºJc�\��3ܔ���
�����r�'W�QV�E�
D�|��P�L���s�\h_h�
�#��9�Z-
�T�d��L�>˼!���WS/b�n�iA�3���.1Fx@Ǡ�3UN�N^n�POZ�d��t<�jGLy��s=���>�vW�O&�-8ךs��hv���eSȉ���`wPU_�c�a��ř�=շ}�m`�<<�$�+��UV�6�6d�����o�88{��η���zkG}ڻ��<<�7�\���jvg!5M��!�w�&�GmpfS����g��O�3x?���
+wZs�LR�q�/�~l�K�]Q�V�����:�o��m��<Q�'��

�
R]�AMXy
��u��
�
^��ȩ����
�$�}�!� 9LH��aH8��h��ʡrTtD-�*��fY]]wu������u[bg���g޼ߛ����"���ȹ�� I7�����H�R�7�H�B�H�u��d�t�
�*�Ჲ=e���J��t�j�|���	�#T����I�/��W?�{�Ν��O�^��'�`�����v�'$�^��E�=7�I����TF�2˵���7-��^�'Z�"[�x
;�����[U�7�,���Q
yWrr�9��E��6c�y'�I� �gIR�m��2��� Z�Q����
+�{0K�,�^�H�/>�>G��@l`�T��=FZ����nZ�H	�ѳ$m�¯鵩�K�A�3D;w�����7����ŏw��^J<��`i$�M_�x��8w��U-,�/h!��pbP���1��|*�k
_U�;� ��N�45�����j��<?�>�X���_�:�]��$
%�
ͫX�+é�
��Miw z�z{7��`fOE���5Fo�h�X�}�fL�}��k%�J�q�_b��_ ��A�5��4WK������'h?�:l��TH�mm.	�m�&�"�X7�r��V7�����l̨b�]r+�
�O�pK�[�{0�E�uwrf�ӵ�Fa�jCCP�k��t�M�ݻ�Vw�[FR��(�Y�-V��E8����	�����P��?�)�p>��͛�5�	#��T��t�F%��
���3�	qhk����
�;�`�LVOp���Z�ۓ.
��j��&�\
C<G�P��J�qzK�md
+���A�>ʡ	<�*�g�!��r)J����;ȁ��&x�K0�N�\��B�&���Գ����$�bԍ7f��p��t
(�0��H�
2����3�ӲG1�d?ź���
+�b�Vֆ|�����\[�w+�tj�j?b7����h���wJ�Cm�m�#�b.^V��B���DR�b��8��E]4�J�
7LG�c.
X
d���/�a�&ڎ�
�@�顢
��zQuֈ4T��q�i˽�èb˕ 4�3���~,�y�moθ�[��0� �
+�l�}	��T�C�u�L�Bt
2��Z���W�>��Eh�@+[���y����0=
+�s�U"r]�;�û]���(��̏{�����e� �E=�m��a^2�'FKv�~.�Оm��0O�j(�e�s�ߺ���
�Pk*!��3�
I�B��
s4�{^�|{6��k\*
�}X�Y��Ǡ���D�=A
%��$�hǹW���ǂORV�����
����U�B��ꯪ��r��+C�a6���� ��K��ԣe�� :Zڿu�6&��?�W�&�k�).��]%��]�,l�b7MX]�[H"}���WL)RI�r�f�r?A��ƁY�&�I�~_�IB��$�{X��l��Z����X�E�&|�w�#����؆�`��_v�ߢf���u���3����f����m��8�9�?��9�
+̟��N�Վ��`�jz1*�������.�@��爎܋��`�o�ْ�J_����+- �4α6@��/DWE�jE}HR�Dl���;Y+�
���z���/������1�D�ѓ(z)oι&�;��.�4��aZ�#�g��
s�b�Z+�X�Wi;�<~�n�"�(�	���M�'��b6��!G
���lP<�^\��nM8-�-a��G+dyXP�^��s:����0q
\p3b����W�u.�,R�&�r��m��#<�He�ĸ�vQ�l���.ˍ���J>��қ�s)��lej�(�^ ��,�=�/����FV���6fj����;e���x��%�D�����k�%�!FW at a��o2QT�vs�
�5��h�0�B�{�U��H�i�GCO����zL'�pb�I�q����+'_1���Lv�
+���Q��A����%�
��$��[H~�}{�1�f��K�ٲ�:HmW�S
+��ëd}�2w7����
j����<� �O�����7�i�2�G��;S�W�ݒ�!�@Y�s�Z~��*���PƐ6�x�Q�ܡ��/9i�7c�G��HV�f�3��R>K�����2j�Z�xH"Z�"�)�
vH�D�}
�@���}	Y�J64�T(P_�(*�C]���mi���S�Jq�OZ�g�A��(n�y8}wν3���7���;�?߇�*x"D���6�Hae�Z
+�5K�	e
+tE=H�������\ƒ�W�8
��7��2�y��m��]L����y���	��1N<�8͍�@��������:�>
�>���6p������ӹ�<�AМ�*쵮�5M
+��N5����g���ܿ��]7�c�D�!\����O��6N�(���b���H����ֲr�t1g���u��N�'w�ߢ�e�Gr��u�b�J1��a�#�g�i�|��Gc��"����

�'x
��&�YH;�����4
�T1}�Ϯ;c�V*���ܲw��f����|�H2;�R��l��{��K��*��G��ZPg��׸z
*ۿ
��?ʗ���
+�ד:�N����9u�����L7�o����|j�B�jEV�QR��!Ū��;~;�Z�Z����xٲ�
+�(�񆜦q�����E蠟�V����7�:b��g3��h\y����g�.:O������0�7��Ң�
�b�4=�N��Hdto{�<��WZgH
�NR��
�RZ\��s�W*Zx�� ƻQͮ�l<�I���Ts|���X)���c?��p�\B� ��K��u��e��|0|/a�hB�|樕���sEG���M���s��M�d���?�*G,����H����R�g�[)|�3��
C�Q��{0b��Iט%9*��X�����R
�M��U)+�^�
�P�,�p�y*��~uR�Hw,r�~L���;�_���v
N���"����ۿ�]���//S{̑��Ͷ�^���0X
7�4�����㊈�#�ޒ{Y�<mg�$���5`��Vs-*l��ۻ�g��r��i�˕[
����L��X#DEhgq
!N-_����c	YP�a
�!w����|Em�"�����P�D�OUHS�r5�a�+[��
m���
+�Wh�*¥{I/1Ywû�Jy�׸j�k�@p[�����z�3*R�e���RXwq3�0���u%�B�AŒ%\N�C)�W�'5�꡵
+&�F+U
,��d5�gR
"J�r��VDB�SDO]V�[EסdyVӃ�1,+�Iev�"���`��Wrw�Ka��
�G��|����`��%+T�VR�C
�F���{Ys*���Z�5� ߬�R�e�s� Q3
+���j�QA�4Ӌ<>���$�.7�$C$p��
��
���A�)h����J��ew�T��*Fm���K�g-��l�m��*{��{�����v\ܲ�s�Ja>3_*ݑ���ہ>��V�5�|���WG_
�>��R��R_YL�!�R�F�jz��	S�5fځO�2��<�� `��}I\:��X�i�Zk�R
���H*��4����[(�x��X��$u|I9̺TkV���z����l�_�׼g�C��%�*�
�w�XR
��nY) N.�9+�wZ�[��E9�ľW����J%�w�p`Nj���[���.�b|JOsd�W,��R�~�#�*	Ľ�yF�dwC��p ���*�L(8�Oe��lL� �˞)A���
��v�f���F��ʹ.��Kn�d�~A򥾺]�Di��
(i���]Yʯ�J����ߟ�?�>�w�[侾
�7���KK�6�w"��!e��D�p� �5��V*
�3VEa{:KoED��cɾ���J�#�oOU4�
��4����l�TjF�k�,>�{S�?ý�Sk�>��Su�����=�|��j}�����T
+�SU�.nk�.����������m�c�Ů)Rx�b� T�<�T�V*y�Ù<+�`R�C�;S�^����0�-�itp��<ȗ�2I�Z_0�ȡ�VVKHW�ol���9�=�f
d�

j��b��%}D�C��y�{�s��I*�{ZL����1
������r`n}+�D�����_�*�Uz�3�����}�i7��7��9_�k��jx�L�+u	
�;�FxL�.�m�m���Q`sK�z�������K#�>����&����ޗxiB�V�^�\s�3�_X��X_�ر��C�+ҭj�|S��	�k�Ͻ�|j|[����X

+Ά�BL���.�?�\��D��C��q��ߢ7n�O(M�&���JO����������i�ݖw0�� ���I�J�LM,NCOYPoQ�R�S�T�U�V�X
Y#Z:[Q\f]x^�_�`�a�b�c�d�fgh#i3jBkRl^mgnqozp�q�r�s�t�u�v�w�x�y�z�{�|�}�~�ˀɁǂŃ„����������������������{�p�d�X�L�@�3�&��
�����֜ȝ��������|�j�W�E�3� �����תū������}�k�Y�G�6�$�� ��ڷȸ������~�k�Y�G�5�"���������ŵƣǑ�~�l�Y�D�.������оѧҐ�y�a�I�1�� ����ڲۘ�}�b�G�,��������{�W�3�������q�H�
������v�U�3�������s�I�
�������a�)�����\�
���Z��  ��,���
+






��������
�
�
�� �!�"�#�$�%�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�5678�9�:;~<|=|>|?}@A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�c dee�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�|z}o~dX�M�A�5�)�
�����ۈʉ��������q�`�N�=�,��
+����ٖɗ��������m�Z�H�6�%������ؤʥ�������������w�o�g�`�Z�T�O�L�I�F�E�D�E�F�H�J�N�R�W�]�c�j�r�{ĄŊƐǖȝɥʭ˶̿���������������
�*�7�D�Q�^�k�yކߔ��������������������� �,�8�C�N�Y�c�j�n�o�l�d�V�D�/���  �h�	2
+R
e
r
xzzzyuph^RE7)4=
@
?
:4 ,!#"#$$�%�&�'�(�)�*�+�,�-�.�/|0p1d2Y3M4A566+7!89
: :�;�<�=�>�?�@�A�B�C�D�E�F�G�H�I�J�K�L�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�[�\�]�^�_�`�a�b�c�d�e�f�g�h�i�j�k�l�m�n�o�p�q�r�s�t�u�v�w�x�y�z�{�||}v~oi�a�Z�Q�H�>�5�+�!��
������؎͏Ð��������������x�p�j�c�^�Y�U�R�P�O�O�P�R�U�Y�_�f�n�x�����������̰߱�	� �8�Q�l�����»��!�C�e��ª������9�^ɂʦ������2�T�tҔӲ������
�6�L�a�t݇ޘߧ���������������������o�X�\�[�V�L�=�*����������b�/�����f����M���q��  ��	T�	�
+�
�
�
�p_L7!	������}tf
U
A
,   �!�"�#�$�%z&d'N(9)%**�+�,�-�.�/�0�1y2g3U4D526"788�9�:�;�<�=�>�?�@}AoBbCUDIE<F0G#HI
I�J�K�L�M�N�O�P�Q�R�S�TzUmV_WQXCY5Z&[\	\�]�^�_�`�a�b�c�dxeffTgBh0i
j
j�k�l�m�n�o�p�qlrVs at t)uu�v�w�x�y�z�{n|V}>~%
�ہ‚����r�W�;� ���ϊ����}�b�G�-����ޒē����x�`�G�/����Ԝ��������q�_�O�?�0�"��������۬խЮ˯ǰı²����µŶȷ͸ӹۺ������ �0�@�R�f�zƏǦȾ�����
�*�G�cЀџҿ����'�L�sٛ������F�s�����M����6����+����1����M����Z�����:�{����� � � �O�X͙�~ʹ��~y��~e�L�~�j��~�Q��c=9 ����~|�4�~c�l�@~]�̳�~n�f��~��C�~لOiZ/�gP����8�v����}6�q��}0����}>�ϲ:}i�^��}��,��~�
׉_L� p����K�-~~,*���~��&E()D9�v��yo�w�y���=�TS3�wI�!
�D)�J��%����OBv���w�N<i����_��ΝD�g�A]�3w�^�|�
<�~]�
+bʀ�}�S���W���?������CN�<��-Y�4����� ���B����Yp�z�S�)j"��{%�>6��4��;�
>��FVW���m��
+S�^�D�i��*��bPk������pة�?�%"�1�#!ϼK`���L�<�n-e��2*���+�)	X䥂C@�v2l
Q?����(=�0�q��
Mz�ǃI�z����7ME�Y;���
Y��@K (�-� �\��U��������&>�r���I�^���2���I�Me;Ya����"��V�N�,S�;��o�_
%s�
�D;��f�Ǝ.�����R?l
;
0Dq�>�
��8z��D�KG)�3o��+�&�<4��@n͗0�E��O�9�4��#��Ґ���n�W9
�b���_��
7}B�2�yːv���/ąJH삻Ȧ��p$�ȫވy;�Æ���ǘ�f��o虔�F¨Ls���I���,Kh�W2�!�A��jHE^�τ���� _�w�d�lX�g�g�Ωr!jU)�[%�B��\D��Cf�p�
�<_��\?�k�,.���w�Ȳ����i rJ����R����ݐ=>0�+cv���Z�{Hl�l�
L���VA��c�۠����
^{6o�Cҏ���
S�
��
م�bȏ���:sz
�
7�j�P@�Q����
��;[�w�g�|z3�0Uq`!�P����-~|���X�3�+�z2lIђ��:�_<����a�X��S5\}���E�^����G���
+�X��J4�^�Ƭw��/��I!5
+�bn�#�F���O��� ����`.ܙ�-�J\�!gZ0�
+)�ݥq Aß���O��k�V�
��^B���f8KĈza>p-F��O�J*����Yr(���".
��O��'����q�ä����f��rC���RJ'�dc~��h��!€�?�`���}W�zBd;�hѲG��ϲ�m�T
��SAi�j9�<�� �
+ߨ��%�@`��8xL��T��qė=�
,Mk
$hJ�����d�����x_�r�̰gʱ��h�t�G,�K��
ytomVK0����X�?R<�J%��m�q<UG]I�X��'t�9E��
+$Vt�� �������ܛ8�i�(�G�T�+��tԃ��]
�6k�N�*���d�$m[��w�_L��-h
��k�,Ȭ�
�&º����^>���=Џ
�]ٛ��a��`sʠ�7�
��g&Gr�ŀ�?>��r&�z`�b>&���z��
%��sx�
bw�&�{�~
�څ��]"W�R�%��c"z �D
����zA ����r���s!֝=jcf]��rm��A��NJl$�� ے�#ؑ
�>���wTf�
GF�F69�9<׵.�'S�Z*�˺#�-�Jl.��Z�Zx�%m*�|�����
�o�	�2�ӝ_T��W�K4
�eRsu33'jRF�B����Wl|��
+��F��gml0L�1�
,
�����y�+�Hu��2��f;�[�T�0BE��{�:���qn�����to�T�]o������kI,
+
��LgV_R:�Kϋ0�d�P?=	��v��E̷փ(M4�m����\��T�k׉o�����,�H��=����������Z��w/��E�I�-LQ����[����
�8�F/�g֖'$��?�[��u~f�g���h�X�j����ݚ-�	VI�m�
K��Հ,%i�b���Q���*e9�7���������W
K�����M�YiHt�X�T���BUD���w�-�4��9#i�ԗ/�r]�hGވ�/�
+
+lD2
h�‘�%TT�T*F���dw">���G��Y?�"��[f
r5��ʊ4��`��TAo��4H5�rW�S�8��Xy��;$Yr���'�q �vUP��V&�����4m�/5LJ��E�:��S�7��Hv�y..�� � k�P  �X��Al���`��
+��,e��:
E�$@B�Kr��.!{�A$A�,�C�Y[EA;|�
TJkU>���4�1a�Ɯd�cT.�����Us
R�&�Bc�h�R�)�����
+� Pd;���ʟH�b����l?1;_�:i�^��m�Mh9Ӝ+,�x�+(�‡j3�=P6u�>��a}�&���b�
(���0�=��.À<��2&�m�%�u9��_�~z�����L��!�S`(�6͟>թV��
�l��W䨸�m5y�pg�!�2��
<��	P�R%�wC�>��u
�b�v���b�F�.0���UK�$�K�;�؂�P�,�!�rA�5��%\��v���"�
+[2�g�w���dx��J���:��_�'�Eښ_+^Cژ�� ���I!	v��,���V7�2UJ������L��N�ITU�K�ɎIy/R+�=+(֨����v��6������!M����	��@P�B�%�R-��-�3��|4�-�����)#ͯ�
�w����.�ܘ�<�;�
��b��#��;*��>$e�G���
+�>�3�
�����"�
و~A��Z���$xOU��x��
�
f𜓜x;٥Q��
h
X�(�Z�����x=�`dš��
8�b�†i��d�, ϐ��!�enZ
+b���
/�޲��І�����2��P�0~�
�+��1�b��a�
�k��tT ��	�?�g�)��˧�9��
С�`.ޓ�`>'4��\DRd���Paxԗ��
����?i|�9�,�t
��Ĵ�q]��"��m-�9�O�D��'���E
x�>�#B������z6����N
k�%��tm���6BDzV��Q�G�
q,2�O:��
y�{i��H cy[]�v�a�Z��T�5 �Ȩ�R
3��4�5N�@q���G!�fYXr����{�3^�
��M7HX1��ey����������8����7ҙ;N�������P9��tn��/D�=����}*��I�:��2s�̋%�����G{��<Ie�d�X�w��39��5�I��ot=�ޓ�*
̸'��
��(���#^s����{�\���d�Y����dS�j	V���΢T>�7��a�b����� T�B��m�6ۺ�4JZm�I��
׶�F�הz�\F�D*r��E�y� [...]
+$Iⷱd�`U�+�����z�3��
8"}��Y\�E^�\Q��ܵ���)<&uZ�!
FM)V��"�ڟ}���&à/����
�
���5��
����O546�PW�눤0��
�f�GlE�bd�c
��'�ƪ�r��Ӭ[��{�K(��"M/y%���0=����zF�Bx}��{w6{Y5��0��%,��4�0�R}ԓ�vT��p>�K@�f�R�$�7H�U�(	�����/1��0�f<,��1�B�S>���٨RI3#&�&���p�a�5j����1��9#yT����H�9c�I���[��է��j���U̟�~��?�����
�+�7��N�zM�`k�|-�k�qJ�}(Ҙ2������S��aӼG�i� �;� ��b�:`uǤayU�}T��	2����Ftm�̔
%OpuD�����U0m~L-_������:�q��W��g�0~�huw�-]�
NV��rP�
=<�]x;Y���1�iw@��8,���n����\(z��q�������b�
!$zB��&5d��n��6
�1Q&�
 �&�
��C��u�Ўy
#����c%$7�]w'z\���0L�k{8<Oz	���o%4�P�˗�
+�9hz���͊��$�L�mxEFGO��$���Dc�����n�:0td#�*�v��T��2��.q0��6���v�g����Aԡ�n�3����l�'��H:�<@�I˞��8!�mR�S����s�^���U��g��f B�
�u�2L�> �;��f�G�S�
�Fx¬P�~���K�����m�%t3�M��� �c��cM(���bC�B��$
_� ��J�,���@��՜   ��%ӸZ�
;�.�6��B��)�P��T�~��~���:_��tH�NI�T�S��c��Τ5���_�3���b�O�6�-[o�
�7�$���c�n����:�zN�q��n�E2~�7\N��T���'�
�"[�fTT��^2F����
��&��+�����c5r~ԕ��(����j����l
4�8mW�DC]X�#���<����n�_	�T�� 45	�C0
V���~
m��&AG�A����7w����@�w����;����Q8� ��Q��
��?d��9���#1�y�ʕq�_eS]y|�d�*�&6Q��3�0J(�WG>�H���N� 
v���Ag��+�[�o:y1ډ�G�m�UV�'p�J{"�����M at 3��X���|��*�oƙ�ޞ�%sfJ�<��ߔ��[����-0R'G
��i�++q��NPF�\���&���XT~y�k�P�x�>���–����������~u2LX'��P
�M�O�W�	�rة
Z?q�U�����\+w�>-�q}y/sR�Q�Q�����J��@737���K�a[t̷�����E�8X��,��T����p����!��P���V�� K$��`�����Κ�׵�b�u~*L��lB�z-��<�R&,��+?�AP�]�o����L�K�ِ
'y����
�Y�?�
+~�t-"X�n�v&���?����VA�G��
+�
����7�W����h�K��D�Y��Z�%4YF�
g�[�
��� ��C_�M�6ЅLJ��!��)�9�
�!6��-��l?�@��W
���?�t`k�;�����p��}�
+P���>�f�{��i8Db����Mp/Ų�F
��_<`w�[�U�q��.
���Y!�'i7�L'� �R�z$���v]�c�-�ީ%HY�~�ٕ����
�鞀ws{)W�a��˹��ԑ`����{�[z��
���ϡ������Z�&
���z
+
-��
��U��@u�BP.8�jz
�B�{G�tϤ1�ޕq#
���^�o�2��N*`�D��Z�m錞c�@QY��@����O�����y`��ŕ^ ��)�H�?�?��s	%�����J�@�f���-���H�%�{#}ř�PK n@�u�5w:=�Y�X9����(5#p
�9#���A�v(~�-�"]�Qb'䠡�y����a
+�������'����£�	+��v
O@��%�7_�*Z-r*��~z Ց�4��
!��w�Bp����G-q.�a+��c��"wmqk=���WfB
+
k^����0����>n�pu�5� �㞃= �m]0o�����-1�:ǒ~��%u
i����;�p�V��O�/a3��;0�o��Kܼ
L���6��E���d@�ZU%�{
����^�
Ͱ�y�O��V�NHLm���u�?�u
M��B�EQ1\�IُO�u�i�@L����7�Nk\��dd��[i��|����lRܰ��3"���r
W^ ��
+�1��9�~�(�V��ZQjsf���b�5~N
l�,
$LAE ���\�����Y�v����3k��"�*��Ie����.�gj4u��D��k"�*T�~~���g�^�
�~��<|�1�c��Px7��
kF�84�K(/AI�\ %�H�
�G;�'��6�������`kK����
+���Z�J���A�Fq��K�q�$5�GT��#.��a<��C]�s�zO��9�����@yQђ�-��D�RP����G�D{��n�����o��^�7�P��vU�v����T_F"�T��e�
��^�9��^�9���(Zi����*���J�|1�"�]����.��g:��E�TI�FzN���%T�|�k&�J�l���I��3ʌ�+�r^�qf��SNM���X��e��
$��v�{�ꢫ?�I��B�-��-Oi�0iX�o�
�葚T\���.%kR&-?(�m��=���?~3�Jncu
�/�mS<��Ð,��Le�H:�
�i�_+MSV��a�
k�@  \Ѓ*��+w��qDS!h��e

+�4��9"(h�d}+ɗ�7��)T���	b�ǪԪhm��`Y�ջ��
�s
<��-�,@��͋������SCg�Zw��N�	CU�c��W�����-JGm\Q��A]Q�]�h&D��0���Zvnw�%����0��z
��MT�X�I����:��l���<�7�
�a�`	���5�P`��ݰDh��k?�(�b��	��
?�`F��g�����ű��y���=�4EJ���0	GvQ�O4��W����d� SA�nM�C���
+ұ|`�7ø_��vY���Io���R�yYqE�,D�;�&Q�\�B�xW��r���v
t�

�
[���\"]����U���ˋ�
����w�髐�<�
|Mc+�����
�Z�9�(W
Z�ʳͰ��f����t��~X)�U�i��?�m�<P����	���;��G��-_k&ڞI&��M�L�<�:��:͹�7�����Kƒ���KX����Ѫ��W[�5P7W��tt
b�E6ռ�z
������~0�i��W�űہi4
[$�k����i�l�$����VRc4ӫ���Gk~ʿ�YQ�:ٮHb�F�G�X
~�Nu�.�kf
��c`�m
��f��4�걳�qVP~�:�U�
#/b�E7K*�W0��]�q�=$ܭ��� �X���QM52ym�B�S<l�U
+�ZҸL�eD׊=�

B��kLBR��Y�^�
�#z�A�%�ڥ`r^��'UIo�Fg�>�;1
p�'t.t-SSUn;Q��Y(sў��*�M�8=���
+BHZ#
��GcD�S���{
d'�,U�t���l�=��,}�*��v�cr�+�]�(_�1r�Ø@?A[��K�Dl�v'”o�>=��ԏ������[���?�Q�
�
ô n!ܘ���e���o���i���B]�u3����PzP'ߧ�%
�4�4Qw� �	L7@�?;�gS
Vjgo�ho�p�7�sy���
�R�\7�����V�%xL|
3 �n��|�2Q|��-��Go�t��u�V֘��Gk�}��fd�'�̐�yQ/;^��+b�#��&�~����ي2����(��<��c 3�;�n`9��2[

�Lqzt�.��)�<����lJ�a�n��
X>��ɚ��p��Tֆ��)��$��Dr�u:5�z�j�,|�~��0T\~�>�*,6�Y
+�]�7E9!��7���;a����u�*��8Y?��Ң��#� ���W
�f�iA�~�\���mB\�$�O�wD h�E��16:_�����J��qB���R%��*X���3

�!��O���:�`I�����o��k��2�+��}�Y��'1�%Y
�G����PMJ{rK
�����w
��
����_��
��L�&N�����
�N�yA '�ճmﺾo4gz"�v;L�	j�e���
%Ɯ���{��N�S6��U'*���@�d���jNc��v�o^=�Bi
���7�95���l
�
€A��ⶫ62�7�I����C�k�y
V�_}B��.I=��YR2��U^�c���<z+w@����b
+�"���8ۺ?pG�Z:�Oȿ��7�Ý��T��ԐI���
��J�A�����x߹rx���n?(��؁ w�h���?���F��O�Gj{�D
"��La�W�e�}j� �w��*����62�y3r3O�(�1�;LS��P��p��a?��
��U��}��c��qT/+��~���3M�ҫy$�=IQ�RS$�@դ@&\�l+f���EI��1k��ڸ����v�x�}_���nϐ��M�fB��y��"m�
�9�nQpϼ
Ϻ�e��\I�2��Gt3y����)w���%�u�$w[6o
@&zܞ�Y^�Z�w�;<\��b���m�����"��������{���3
=�s�
SN�Ӑov�(����D"��i��dM�֬Lใj9��Z�K7_�<��ې���ø��9�74�P6��
�0,�R���?����D ���m���6��.�D�t���he3
+����>~�o��\Ƙa3Ƹ2���@e���U*Tl��m�c�ӱ����� �~� x������n��N��������U���)o`Iχa]�����P���F�ŚVTC&�ϣ�࿋Y�=�d]/��
�.��.F�BX�s+$��=�}buM�>�RWm6�Ŗ6ᢐ�FX �5�x{v*������j;�zv��<���_~���� A��VUJϐ��^Ij�Q�x�シu�Q�o�=l�K�_��Ց�E�kZ\4��s�qU7��vOa �J?��Q)�4C��^����\��k[{��3��y�~���M�|J��'g��4Ay,$�0�( j�H��l�:Q"V҉�1X��&e��������
�s)M�Z��(�W�
�|�Ϲ�\���8�8&�t��c�p��Ҕ��a����
�͔����
�C��C�
GU�$^�fb���|�8u����̸
����&���A֍�9k�e�7�;�㥦���k�o����Av���Տ0o5����y�'����������<�!�����H���P�4
��|y��C�{_�2e��lTr�s��*��Idg_��'
V
+Fv�z|"��ƞ��ҩn2=�3[�"s����t�	�}N��8����`
�����1`X�i��]�x���(�U2\�o[v1�d%JOO&rؗ��0ܵ9�Yx�ݨ \��
��D�m����]=H�j�ovfd���)�:�t��b�dH9\
��ϛ�Y�?�8��
<%�}��dV�ەh��nu�ӻkV��3�+��(+�$���
-������#��Ջ��QҰ�����Ж���X@��h-Nd���$�a��>�M3��q��"y���$�[Y�@S���g�Ó=ݎ��P����1�)L<�d�"�d��rՕs����W��	��DJ�
+t��b��
�c�j��*���!�A�q
+hG�|�3j z�O���� ��|�
N�
+��*������%2#
�Ǔ�H�7!�
;v����� '�;��
O����~h�ĥ�%�,v6�Bբ��Tx��Dv"Lt�ïK"N#��.ec�}f��˺��d�&�T���R��AS�;Yq!������E,������AA�m?~������[�7��[ ��>
\�!�B;U��!�)/������C$N���$�A�³u�e�uU}�,3Y'��/J���c��	.8_[
O�����N-<"N�����awG��m��_+�yj~P�]ſ^\y�
X��,r-�|�㒒��ܳ���<���L^T}��,�^eDR��,��n�kqց%��|r,�!g��Jx�����=~�p{"��\ee�E�N;��Þ ��=���$���{q@Q��_��\?�/иLe���>�u��#��M����p�'Y��n�_e<�q㼅����Ra8p�LB�=��(�YK��[l��`BK����B#4;c��;H�S��^��OA<�J��~�I4,���$"���,B\HV'&fಀ/pO_*���_�_�#���&l��Wc�K	B�Z�(��|Z���b��+|���KpT��
+�Ar3v�*>�����>Ʉ�x\�+�0lk������O�Լ`� �F���cfup�.���wlC�n���KJIi]����&���f�����XPA���n�1ک���F�TK��BoI!��Ӯ���Z�� f�
)~��X��h���y���9�
ݨO��C5�����&�|�T2���Ӳ���n�SLB5eD0��:��
yP�;��(��w��9m��Ϊn�Wh����K�u����{�`��w��k�����
+��kH���>*�ڲ
��1���
�w�p5�����Q����݌�$
�;����LvvJ1��f����3n�*���T�g at oO#9|}����?V0M�5.�ۀz�{"
N�K?�C�_$
P�&B̆e>�(
q��I�u���`���|o�b|�_�0l2�Wꂝ�sC��ܴLT�
�I�a?�f(/+���P�Iw��B
W�h�g��šH
 ��
Ei����(G6

+���
�
�" �
+"(�H2�̙�dfr�	$��x�Z�EP>�ţ��
�����C������~���E��F�:}<
�\{
+�����%����
rH�6N$(߫Nᷘ_%�1�����]�2�:$����o��-�8ȥ I-qt;�'k��TjJW^�}�k��fQUr\�u��
l�N�
kHn᫂�H����*�W������d6��
M2	*{���`�V%���VR�oJJ����`+"�yO|s8����6�V��y8�
�:+����;��9��ɨ�=�.q�q���ѝ=���ɥ��^ӏ�w�ld���G���;<�bSh�
	�
�� (�����%]�
�N�}uAܹ�
�`MV����?g�=�&�o:R�����(�tWS-{66C�S����������U���foEI��hzE�'�ܜ��&��Q�8,�g�]-2t��%��F@}S|��QJĜ�h&S콧�bor
2w�q�|�o�����/�$�
Ĭ�7�Aң���I�MXIc>��f���H^�2��`�zB�ȳ�
	ŞO�*�{M�2MoR�0�i����:�T�~%�$�9ED
~c�j<}
���${.�-��+P]c��=Vz��pwz\S�;!?���
C:�G�F����Iױ�q�Y�Ş
݇>;��]�����m�S�)�yr���Ez�_n˕�aI"l�|s�G��������vm��ߵ
���_7e]֭�>��Г��U�)i:��D΂�G�}�V W�5*��{�f��?�
+�(��$�p\)9D$ZY�r|�����(�4D܁O�H���ʳ
;ܫ��v۱j�x�Lr_r�
���;Wi��
nV�|�R��u��dܦ� ;�@������Y�N�<q�Iȗsc�E���^M|��K����ƿ��6��#Q�쀫��Hl6�\�r
��E��jJ����K
-�β+� �x��=��j1�(~ǒ�)�C[vQn1����򑾪�x��V�
���a���u� I[���
8��m���Y��GeLV��(X/�%W}��%
��
+��M]4�ǽ��A�ߗn�װQ�ԈX�tGd�Ƈ�D�\wQy�R�>�l-�Q���nJ��Ȳ�c�/�����14��
�C:�'K��&���̕BO�J{ߴz�f�sW��|F-��q2��
?���}Y[�pXd�Y<\��v�+�
�M{��i�r��8��~�LJޯ����
�vlL:��	?@���o�[g�`���}�>?Ur�ǛI2��L�k.�}GpI8�Q�RV%܂L0/PU���E��
?�ɹT��c�ۼ�f�H��s��^QM�C!��)�$
�;
�ej�
�uIy	�W
����6���#L��Mi9�Ħͱ��P�*���H��ʘ����F�g��]�m��ߝn�+|���X$Z�6K'�
�O�Q�J�q ���m�(B~�lj��Su�Z
�ť�bhW��P"��z@�U�
�V��J�΂\�,<\H��A�
��5���� �O�af΍�C75O
����<x�5�
��MKQ�����e%T�f�ʤ��6
S
sFt���TOU�t(���
�2���[
+ES!.?Ӕ��#��C�:[�6�$ߴR�2G�[�D��U��cb��Dx(M<����}��|�y��%�����}�ђ���Hm�zy�Ey�)�9Didh(Cp��K�o���Y�9_\n�i�Qsƚ��Ӯk�X3��6R7��U&�"c�T4E�ʈ0�X�,t	��:�T��/>Uݮ�x�7�����F���>Q��L��~:ʥ�#�]�[eTS�2��%��c�
���Æ~EW��g�9��i���%�3W4ފ:�}޼0�_�X|���-�ƣ�µ������V�u�8H{���Y�F�"qĔ-�F95E!L��/���3z���Lw@��
"���F���Rm�O����Q&�[�#�����
�Z�O��/�x��ˤ�r�~9�T0�0b��ܬ
�4��Pߋb�>_nMFY%��<�ip
+�;R�x���@��|���qj#�l�j�?Ape�  �[�ۊ�x�{�
+�s�H�t-bM�#���t8f���5�}s�c��0�f0

CcB�K�R�mc�E����k���ץ�JH�[�ۢŚ<!)�N�o�OC����I}5����2���
������0�9���tMب�������7B���0�؋��
����0��z�D�
K�
�Ye��R�U�J�����ѐ:N::,#��D~6�ž���4o1��l�`��q5��X��U5G�"����Z4�tX���� ������
��cV�u�{�_<�9������S�N�}h���%�{�nԾ�"V}V�"C�w}�t���)�b�3�zFj�oK�����j2�'��Q9
+]��\Bȫr1.8�C|��.x8�~��pG��m<�ϰ�"i��S�˨�
�ڠ
u[��)�E��k�+WE8x����5�
q�g<k~���[��0n�&
ˊڮ�c�A��a��
Jú�g���"�:�"].f��f�5
	R�u��B�Tu6�u�|�;4R�
�'���hNp�\@I!��Bq"��:*��pX'%O���$�K#(�
�}�vW��&��$�����n������x���T�eحk���U�^�I���kK��l��

Y�+H�;"�����^�\��#G_�Km��R2�y���fbI-�ب:ݐ$;8�$N(�Ӊ�x���a
+ ��1��"��*.d8>���MO�a��N�$ʡ˖~
&(��$~��>�����t�BM%^i���3��ϐ�Ef8UB	 �
���'`-�icIaͨ��+��	��دR���=�Z�����Ⱦ��Ł�=�5�U#��5H����R����>njky/����s6��H؃�E
oL��y����C�G��/��?QE%��F�v��MMz)=Z�B.��ϡƋ��/�•��3������O��8��5&�Y�����K�լ(�ST� e�ҝ�ZV�
��x'�xaV�4�Ë
�*H�]z~�h~
�i�0d,�K��8��CZy�{j��CF')�b�
|x���NJ>�V�{�0��e�#|S���E�1b狛*_�R��"���
���37�����B���oξ��(p�3_�<ݥ%-��t��ɫ�B�e��t�Ɠ��px H��uRuɵ)H?�m�����
�f@�Iz�͂qrgM_����D�|Ce�
+��ӯ_���w�CՄYK/��Ԩ	��佨/���Y0�����y��̸
7�.]�*ѳ���a �!�d��[�m��9���#{-�;�W�[����	
��U�$�mb?ci�3�ؘs���q�6�ĂT�
t� ֠}���
�dl����v��{�F�yt/ټ�t�����̰��K��Q8���
N��"���4�ʻ�c �'׸N��s6��I��
<�fWϚvЕ*�҇�T� 
��9�
�I#�{�	��mVx�@�.
��\�EyT��}��W�*�fҿS�ѵ:'��hP��of��ħ/7��n�
u�3֭F����c���ȶT���5��y�ŴѪ����L��i�Ӕ���%v
�I��G�	�ɒ3�m?PH-k�
�;?�v�bkk���Չy��^��4o B[�*�Bo���R
9���^F�t�b�Iyd����W��$ګږ�
�N��T3�VYzl
((�m��"U�a.\�vz��C�5H8�H�$?sZ�6���=:�hh�B�!É8
+`,�
g6�$cN���!L�p�<�
b<���Nz;�0y�%�
)�
�"�
�D�B@�
;�.a��$G=�W+����v�F�v-�����|d%��ݿǁ�gOŨ�
�;$KF���lb�u#�^$(�b�	���,���jdM�[s��kx�v�͆��c��?s�B��fl�S����k����Me͈Ly�i��3�TZu�g�v���#���V'{�F�,���8+�5��%\���Y`kY o���C��,VQ�"�B�k�5Wjؚ��


a�x����h�k�"�	�A�ƛ�/��d�X��!xJ
��(}�~��&�|�
����	�h��?��.��������XS ����qX�}|�#Ci�ch�K��VF @ d��w^��NH L
+jk�u�j����V�JE)������swm��^
��VQe��^*�7�c�Su�5�.�:��5!{3�A/��u@v�?�aD��UNC�k���H2)�
1�z%�9�U鱛������v򹰗�!�k��0>][#�?�w�sb���,4U��_	f�)��E�ď�*	uä6Go7�6ɵ�
���{�����'
C���Ga��+���RU�A=�@��5_�rgs1OU��G��*��ʚ�O�
&��Q͡�4��%����
��nl�c=�%Z� ��v�Y
�Ze��ਝ4�?
eC����`��
�

�_���wvĦ10�K�B/��*Br�v�4όwM��	0����
r� �`���$
����C�ܝ�G�a6;g-N_�&ɰ�.`	�`�0����M/s\�P���M�f�`p��3������ 

$��A7�	i��	���c���(y
<�N������6 ��e/�
�c�POj��m�+�YЪ
C�z��Xa-��
T��`ao�t�t�._
,qg��O�����I]@��f"�	�?4|T�]�T7[��r�5+�D4UffN�]Ϭ��'�Md�d����Y��%A'-�:�x�>�j����Ӎ
�5!�U��iMSD�-rB�FL��&����^:O����F�-T��4��w
�������T��3c
q]�2��R��d�/3���U�\;?���Up=���@�b�
+TYRJ��3���O�)*+ s�W�u�.��[��L6�Ǽ��A�. �귒�h���oN_�=C��|��HW�	Gz}��w\��2�h{?�U��r_ס�,[<���4�Dm�D��〷����C/
�F�l�
M�r_򑹾�g"�P\T�M�Ii�D��w�$��=`
��I�Ӑ
��}����6�.��jY�x^���h}]����"�]���l
+��8�"ӽ΃ǐ��
L����"�H�ڝ��k��:^֖T��m�������� �.���^�@1�~qxT���l�U����#U7�����5��:��L�E|4�&W2��5e��xz��*̖̆;�����M�0��do�^�lpm����aI�S�7�kD#���'͊$�"lL�?b�A���DI����N�mEh�
��8��Ԍ*�"vұ�E������
���݌5Z��5
���
�`z�~x�[�M N&�a� |�b�(��ǁ$�ch�
�����|cq�)M�_���Ɔw>bSО$
��	�D�p��
�z�!G@o3���
��
�a]Pn�N2);K4 U����"�p+q
��7b�������L����a�y�$�04��iC�c9��(�6�>E3a�{� R䏡�0`�?�s0��7y9'`L�q��`S��cLr &M���P.ڽ��,��_�r��u
����/�F������=܏��=1lt�Ŝ
�9>1�lם
+��KX_�t+	�
�=���#�ثL���
+u�uW�K���̹�
u)�F�@�������j�R��_$����YuBś�G�bQl+$���,o8�q�l����g�
!)
����n�2Q����U�>Yt�w�(���^�
�'Y�������
!�� %�G�U��9��� ���,� ��&>�YcwU���
�M����j"�
��Z�o6V��WF9�=�a��l
m�y������nqA/2�A�I�̐���i���
+q��AN?!9Nxl�b�O���{�e�i�Y�Q�̶�>S���Z�	.&�s���b��j?1_��ǡP���k���ٟ�
�x�`дY�!�n��6f�VJ�?ff�o���n��0�����6l�)�7�B�u�yMA�Ѣ�&�m�>�>�Nj��#4J%���&|���
E]ۊ:��i�2g�0��io*�6zX������h
+�҂��3;���1"��2ҍ�+O�?���K��ja����� ���Y|��n�MH�p�A/�LsI5��cu�*ΐDx�!W�
{�|m�p�q%��q�eh��r�Yb�Bt
M7��u�A-�
+w%5��,x�+
�z�!Ί}|%��w�pȩ�xe�Xx|Y��y$M�}y�A��z�5��{�+=�}5"6�~�{άq~�p^�Q~Md��~*XŸ�~,L��U~S@��~�5��
~�+f�2T"��P�{p�U�Ip �<��dG���X]���'Lz�J��@��ς5��)��+��g�I"ۇ���{�~�o��e��c��,�dX�؈	L;�o��@���}5��^�E+����#���zЩג�oy����cơz��Wܝ��L����@��E��5�����+��
��#N����z��O��oK�/��c����W����
K՘$�B at W���|5��%��+׊��#x�A�qzt���&oM�ɜ9c��l��W���K×���@V�� 5�����+�@�)#���� q���h�f��j�[Ű1lmPʪ�npEХip�;
��s
0�Xu�'���xzŒr{�qD��o�f��p�[ԯq�P䩪sNE�t�;=�%v�15�x�(
+��z� W�W}
q(��vsf���v�[���wLP̨OxE뢳y
+;N��z11c��{v(_��|� ׊b~mq�C|�fL�o|�[y�[|�P��|�Eҡt};O��}�1���~/(���~�!E���p޵�f&�B�p[Q�/��Pt�ہgE��S�;P����1��ƀ�(�Ā�!��ހ�p��,�Rf�O�6[B�5�Pc���E��`��;U���1���*)��^!�H��p��y�`f
����[>�f�	P[��AE�����;Z����1ٓ0�U)F�j��"0�΂op~���7f
��![B����PY�_�EE����;T�\��1撠�C)k��"d�j�pm����f�r�=[M�,�1P\�Ǒ�E��S��;`�Ћ�1�'��)}���"��
��Ρmf���n�i=��p�kq��r^m���to�lVu�rX w�tD
y�w'0�|Yz>̾j�qźjl�r�`n�t��p�u0�rnvgkbtgw�WIv~yCtx�z�0b{x|b��h�|~��j�|���l�|��^n�|�~pp�|�j\s}AVtu[}�B�w�}�0z�~l�;fׇ
��i�
+�9kD���mh�5})o��viNqꂿU�tX�BEv��=/�y��VǧeP�{�qg�����i卞�|l
��{�no��hLp�(T�su�SA�v@�Z/ryX��_d
�ִ2f}��}hƖ�Mk�/z�mt�Lgdo��jT3r��xAKu��I/8xσ��[c&��5e��[�}gܞr�Qj.�xy�l���f�oD��S�r
�d@�u��/x\�
ębp� �vdܫ���g%����iw��y3k��ye�n��bSq��@�t��o.�w��U�a����d`�R�f��W��h�-x�kk�emn)��R�q�\@?t@��.�w��Z��t�f4��u�h���v�j��xxm0x�yosekz.q�R|{itP?�|�w-�~�zK�'r�p{��s�qԜ�u#s
��vFtgw�wtu�d�x�w*Q�z%x�?E{�zb-�}�|X��p�z���r'z�ssj{@�(t�{�vxv|c�wy|Qy
+}>�z�}�-R|�~H�(o���Yp�����q݃^��s=��uPt��;b�vS��PPx
�<>Ay���-
|0���m��{��o���p��z��r ��t?s��^a�uQ��O�w+�T=�y>��,�{��¹�lu�S��m�� �oou���{p���sGr��latq��Ovk�?=tx��j,�{
�@��k��
��m�ܖ�n��l��p��rxqؔM`Ws���N�uȌ�=&x��,�z�����j׫��4lg����m�
��om��q�q0��_�s*�9N uI�_<�w��6,�z@����ja�観k��)m\�|�2n��q)p�� _<r��`M�tړl<�wJ�),zy�����}!e��u}Dh,�9}�j��
}�l�pp~.o^�~�q�L�!t";��w+��zU��{
oK�j{ipϒ{�r>�|2s�o�|�u
]�}@v�LO}�xT;"~�z-*��|L��y(x�*y�yr�
z$y�
�gWT�aˢ�ĮkTd at D\dPPp-HG��&]�30���;s�Cg(�� 1DE�*n�6ܵa�z�*�&��<��//6��

�O?��Q}�0$	8
_��{���[w� �/��!f�UmxrI
�WB���5�(����)2����.$
��5U��o�}Z�!O�O����q��m�����
��>�>P�3��ĸg|

�,�X񦁓�`���S$�>BG��
�DǕu��#�i��#��܌-�`
��xJ��!w����
م:��(�����`[H�W��eQ�2U��FD�����`�|���
:C��d���2��~Tv���k��dEeUb2�<o]�^j���j'{@��s�Jɻ�uiW����ŷ� ��o��Ws�%�PFU���V
6[f��
��r�uOC��U(5�?���"/�/��b��;��H���-O
+�o�_�%��{�"bHk�&9q\���W:���r��
�&�G�%2.i6�D�1�%~F���+~Z��C�?��
8��V��
+�2�#�⮪����
ui^#v
+�NL���؏�S���E��Z�Ln�Ö`���=l
�va�;(�>̽��p� ʠ������~��[��@��Qd��F!��7��H��$��������	����#��d�Lt�!BO�K�*��G-i���C��r�B�
.�U�l�mO�>�
�,B�2W�<+�3�6��7���ߛ��@��

�)�۠&KO�
0ޏ� ��O�
igm��82=D� �4FB[���!A�Ib4�~����Z�� 	*��fz\��O�t��F&�����ӝN&3x��F� �[�H��j���z��&3n14���b��M� �zB��!�
��|��+�
�

+/�hw{��V�\l�s��T�j�g�?қ����۟�u �깮�D�}û�.��5�ʺ�(wM�	��ұ=�L����j�e�o(u\���
y�P�X�����Ƣ8�p2�����23�2"uh�0
 �;�(3���-ybݷ�3����Wd��sF�@w�	�,��8#���!��H*9��)iF^
+��P7��D�g��3I�33D_����)�J�QNdO�m2�t�a':�=���J��.�۱�
+s�`d��+�uu�-� ǵ�i�ȵ\L
+�kw��/i���&G�1|91�:H�^��
�gW���@-� E�if�?Q��F?�/�Kv��ř�M�kz�݈u�N�0:ӎ3BJ]�PU@��׊VV�z��D��PC����9>R��Tl�{=E�Y^Sc��yjN��9����6b~mwj

[��
Zl'�d}��[�Y�ގM�:t
U9����WI�-#�d�=�sѣ�S
��I�Ku�Ʒ6i/JO{�s��{��c at 6o���P�U,�'9cV�~�M6���I�Q�1�W�wo��T+�ml��F0��\�O��d��?�o���i��4��M��4M�C%�H�f�M[�r0p�[�
���p�|R�’��/Ld/_c8]�
׍��
�YpF�KM(���Ewo�
@�jj�I0/���k�ad[�H�>��|/ѓ�L��
��|0�0S���VR��ׂV2C�æ���a��v��4x��,'L��82��'�7��&n���&
CĿ���f]9�-f]i<?h��_��]�ǿ�"��a���5!�	�+��C�Q�O�}D{�p����՛�x�էɰ��i��X1kt́K�M�w:�h_�Id)[`m���:��'1��f%s����7�^V6,��0���|����3���3~��+�䔓*o؜w�PPK��
W
��{�W���0�.��
���^�Mq��'r�>{���T������a��4EeNٟ�����ή"�V��_�ǔ3���t�f6���5��ҷ��,� �jP
���6E���x)ͻ��U��Su�@��6M6�d����������F�����V��SˬG���Ŧw�Ơ��u�y�@>.���TȆ���V�Odj�?#驺�syc���A)w,zl<��� ��ـ�B��*��7�i�j,\���P#���;}}�~��r4��fx�O�"Zh���NM��
Be�@�(7���8,i���A#F�a�N}����qǖ*�lf
����Z �ۋ
M��2�HB-����7�߅�,y�Y��#p��9|��
��q�����eے�NYƐ*��M��}�"A�튘6؈U�,��ۅ�#�����||���(qW�,��e��s��Y���!M�����ANJj�e6Ç�,��}��#��5��t�Pc�jO��f=_`�rh�T��k
H���m�=o��p�2���s�(��Hv� "��zbtu�5k#j�� [...]
^ٟ�t
S���uSHt�#v�=_�.x02�y�)B��{�!
+��}~s��<x�i'��y?^W�Ly�SV��zOH-��{=:��{�2�|�)p��}�!g�
~�s@��|h���g]�OR�r:GA=��^2��)��$�!��U�r���
hn����]��
��R��y�G��ƒZ<�����2�3� )��h��!����r��7��h/�ۋu]j�R�
Rh����Gv���:<ِA��2�v��)҈ƃ*"-�=��rY����g��<�"]2���$R1���GD�T��<�����2�䆡)�?��"Y�ׂ�r+�0��g��Ȗ�]/�&�R
�`��G;���
<���42��^�u*�څ�"|���/j	��cj_���e�U᪹h
K��$j�A��+mX7���pM.=�tsk%���v�
��\z`i���j at _׭�k�U֩im�K���oxA���q�7��ts�.��vp&(��y(6�0{�i[��p�_��`q�U���r�K��5t7A��<u�7˙wz.���yQ&��c{V��+}di$��w_O��w�U_�vxKk��x�Av��y�7͗�z�.ݒ�|&̍\}[ '�K~�hꭢ}9_
��}AU-�)}TK4��}wAd��}�7�~..���~�'
�v6 ����h����c_ �z��U��{K
�o��AO����7ԕ��L/���'A���� ӆ��h��ʉ[^񧞈~U�0�jK���EAC�ą17ה�1/7��D'r�	�b!�k��hn�/�^���U�u�K
�ʊEA8���7͔9��/A�O�7'����!H��AhZ����^��b��U�ؐ�K�'��A<�g��7ۓ��$/L�͆�'����!r������h`�JjNc��Qlyf���n�iMy�p�lf�sn�S�urq�@�x u</{,y��eEk��g�mE�j*o��l�p�x�n�r�e�qdtR�t
+v|@Uv�x�.�z={9�)b�v�"e�v���hwl�Ej�x6w�m0yd�o�y�Rr�z�?�u�|.�ye}S�i`��Y�jc����f6̈�h��vRk�yc�n�gQNq�Y?Kt�S.Jx�L��^ي���aɉY�qd��%�vgf��u/jO��b�mf��P�p���>�t(�o.w��
��]^����`c���CcH�l�Vf+�;t)i0�a�ld��O�ȯ�>tsw�[-�wn���w\-����_A���Mb0���ke#�SsShA�!a7k���O|o��>#r�
-�v��0��[D�n��^a����aS�h��dL�%r�g{��`�j哟On��-=�rf�v-�v��m�3Z���p]­
��`��܄c���r
f؝C` jR��N�n�b=�q���-�vB�w�~o�`^��q&cc�r�fB��ti
q�u�k�_�wIn�N1yq�<�{u8,-}py�mjy��n�lp�ptnR��rp/qs�r_;u�tM�w�v2<Ty�x�,|~{6��j�tn��l�uf��ntvT��pEwFo�r+xF^Jt8yZL�vkz;�x�{�+�{�}6�
h�~4�lj�~F�(l�~L�Fn�~Qn�p�~e]er�~�L:uM~�;sw�~�+�z���f��
i
���k�<~�m*�Rm�o_�n\�qǃ�K�tU��;w&��+�z@�ɮoe~���g����iю}�k��:l�nH�[[�pʈ~Ks���:�vw��+�y��Q��dX���f����h•�}j���
Շ_S ��VN�u��1���X�DY� d�0�@�/y{��e��`�@��=�P�����8�
+�
+���x��+����O��pO�T���+��g���xjZ�@���c}9`k`cTnw�?�+�^5�����j�䤢���
T&�o
+
�l���E��x9�
{�Xf�Pg at C_�[�G�=/�5��g�4��ʥ^E�*�z������	��5�#�p�
&��X��s�Y>���>��@?�n���C)�HKс�#�Eu��$�%������`^>[�
+�(?`~�^x ��0���� _�+�O��v&"Y��D�>s�5x'��]����~���-��i�f�~�>NF"
P����� ^O��G�#��
�ǖ����0�<�7�ӆ�7
�:
s���XL��!kݱr�
����x�{6�R�t�"+��@��q��*�7k�1��U誘Y�}(��~
\H��`J䞂��\��
+����5�2[{�F�;�On������ݦ��
�
*C�{
2H�
<��N-�S��2��Ur��u�UKm��5
ųBu��
+}�����3�!�J�H$�
�#h^Qv�0�q�U�Y:�ʫ�a�Z=V.���}V�Z��fs�y
����֧�M���P�8�:�x-k�ն(+�rީ�G�S�I�Э����O
���w�
�iι�9јy��������&��z�8,k�.$��x�=rmRM���R����u�Mb;d��w0y�
�2֤�T�{����
��WƊ�6m|�+�8�EC`��
�Gd]��Mm��"��W�rS禜D��~A���S������	��+�G6W#��jnA>p�� u�w0�D(�MHO�B$ ������vKѻX�� {���'V���'
5�c

+
+�sh�
]T4�I��
��D�G�ãTD�(2BNlz�9�eB_
 ݫ.�#�J�U��bG������ɰ������	�P��c36����߅!�3����?�o /˼�	��4Ta1l-vKWZ������A�p�ɾ���<���>\�Щ��ހk�a8�Z5$�G���d�W#��{{��ߢ��!	�e�8l&�V�
lu4��ʚ��@ԸQ��������WJ"�����
��쎛�����)�9(�6�g
f
�y�'�1?�J��L)��b���쭢���l��]4�L�kۘ�Pp�u�ﲹ�)nCA �Ŷ+2d���EH�'��H�m&Y3�u���ѷ��k�ѽ���ӭ���1��n�]�_Z�<ڮ�Rvӛ���pj� m9G݂������#j}d��A�-u ڠ���
+�0�\C"���
dhK>م�����ٸ�:IF�q�\BVhF�'$�[I�&3����B��t��K\ �D��'�`;�I
[�"��%�#���N���\����
I
+|?�a��8+�ş3�"-A��ש�_ZZ�K�O%u6`����X{c�ͯw1�
���$���+��O�M{�'���E�],�j�z6���+���~�
�Q��k	a=�_���/E	��q����bV�k��&S��7<R5�|m[N�S�<�
T[�'���c�֝"16`���f�i+m�Ԃ���
E��h����6��=��2%w	��\W��w3/VWx�G��k��	(�
+��K6\�G��k6ygf���p86�,W	C	~�����8
�y�q'
Sk���3��vI���ժ*�/��kffԛ]��_M����5Ɵ�$Ϲv��3����\�2
�e*��^\?����|�_��cj��1��xڶ+����em�[�8�
��@��r�1�
��3�4�6=���
�v�׶��
+�f��5�R���j�W����u��M!\��7c {1�
'a����`&y[8#��H���3��Ci\OR<y��0m�O�y3lN2'�\N
`�́QSL��'�}�)�R�찧�R3I�w('�g���V!��pG�Je�ضR.u��.��j�O[GC�����d5�a��L!_s��d
݂F����\nMͳ�&ֹj~*��A��%y   ���2[�\���f�-:H�Leyby �
+� ��}��s����-j������5+ڲkE���Z5׺ֵ��ޛc����[GS�J��o�
Ť��� ����+���unR�Ɖ�o���Q'�j
+���9y<�i;M����B�]
+���Y�5S�A
*bPW#�X�~$u2�ξ/1�a��+���` ����cv&�L/�0�̰��;t)H܄|�E���9�1��ݎ��j�Ɇ'u/���qvC��|���\l��W���ja���C�m�^~nc�=�=�7E�m+�O^�	|��v�d�,�<8L�O�j�%=���
Y0o�}�ď��vCB�W[�K&��I>f�g\"�&]��KOÑ:�
%ije�B>�%���j�:l=��T1e~��/�ߪg�
���I
0^Y��V)�<�^�ϑ�%
+�զՏQS-W��GpaθD�8�ߠ9�D֑Ճ�XM'�
+��U��J�]I�"��mt��e�uuE�)��-3`�Ҍ� SoO��
�� ������6Ju@$�Z�Z��ǚ����;���o������a��m>݄92)@m��{��������
���>�-�V�|���������WU�>r�$Ӳ]
�qّ¸��z�EYuɔ��>�GT@蚩
�\�'��}њG����9��mp.d. at L4
c�&,��r;b�
ӂ���d�l����t3�ݦ�]Q<�
b��-w
��
N
�k��	k�
b�K�%����H���@
j��"�W4�sf��|A�a{��8�c�%�J@b��W���\��E���':Ehs�ř�=�}��9fǹ��T��W�
!3ߔ�% 
פԘ�]YzĀ&X
I
kWdP�ي
�b�]�9g���bI��i�
����$ �O�1wu_)��x��S$P�)m/�UI
�.m
�psf5�Uwl}oy�h�
 4�;=DU�IKS��DS�j�j:�?�2�*w�0P��4��o���+G��4O6�j�eu��
�H�W)ϛ=���ݮȆ��s�51��
o���k���a�I�ӽ֒Wo�0�%>��#}?V�5N���_�����r}��%�7���
+�Լ��
{�!`�D}���K_�4�
+�!���Q\��Hҽ��zȔ�H�N�>�uA-^Ჰ�bg��%+k�5���8�W�	#�wi+���q��0��k�hc��uTT�[����`�5�Z[�`�J�	&���-��v�**��
cs0��� :�-�7���o�3
G�(�Z!�
d
�
�
�z	Q}v��x�'E����}��aQ#*��'���vi�Ʒ|'i��n����˵Y���;�eR{��E�1��v��i�k�Y��T�2����4o�/��;��K�
�
|O	c��
+Rr_��T��'�U�t�Kyγ�z�a�L�
=
z�s#k�)��|O�
���Ā�܇��:a�x�im&��&
^c���ŽoIѓ`�
+���W��8�2K/�ױϬ˽���^��i�����p�u�����O���:JD�:WtG<Z2��]uyy�+���0��H5W�?16א	~u��[4'�)B��rj�X��G���>��<�8Y�J]
+
Մ�y�iZP�-|xm
�4��r�Qe�`�d
Z�H
;4�S���X1̚�`��w����p�u>�7<dE,]��5�J�!
���T�%"��
�7%:�	-+�6\�w�����O��1=�zs��[ITNX��)bOIUq~�JY�����鮦�t ͆/?��w�U[j��+ϖQz�U�R�
�'d(�_���X�q��B�y��g5m���V�e�q}��J��sg[�\[���>�	H�2 
�<?\�`��L���8�n�/�j?*��BgK�ߩd�}��d��"KK{	�LT��k�a�(
�·t=no��4���i�H�A�-:��s0J�
ַYa�<Sebv]�
+�%�;�8;2�/+B�M��q�vs$`ى�Y4/�\ssi iUcd���U���a����fh�6ua�P�����&>�%�C�d>�zES�?��+��&��e�{�\�Q>��+)�
��^T9Z�P���F������� �V+�@������l@
A	��B�
+r�3���
�L2�$��
$���x ����*,^-�ڷ[]��<**�R�������I�<E�|N� �B���j��*�K�=׌���A
���ua�2�%V���/�.RC��
�v(ݴ�ܥ�Kp\��	t!w-<��
��ar[�fA72�:%�E;���),�Aj�&%yޑ$��xPM�E�@��Af�Wxx����M�%|zW�6�J�
i,�o�V�^>npdk�
ŻΫ

�:�������C�������>�
KXi��<�_�TT���Ֆ��q�cs�.�JmZ�E�Œ����:��^΄���hsVIbm8tS��X&^ a*Ɋ���n�^�m����=A2�s��^
�mICca|k��`�K��{��"Y١:nf�,ڱ�W	x�_n~�	��
+!f�睥��#�
��A�ɧo��
(u�
+gį�Vg攷���E)��?n�/ؠ�bd��S�u3�Q��Q���I�B`�\��C!���d�
+�P�,���2QC���[P���һ�n�`��
R������XYU�^��'�,|Y5
G�4-}�<���k�C���fގo�ۆ3 �����7��%�R����/4��!=�a�'��m���fUg�L���(CfU]@::&��
+�wo��߿���D[D$��<��H�׽k���U��*I�#;He6�i*��80C��
 �T�N/h%��
u�hvL�5'�ƭs*=%s+�:V9˲O�%����(LWӖ�s��w��n0~
~
I`����F��嵃v���&��K^U�*^�6U>,�V��{�:T�5zG�Fd������x|��4Z�ٲ�� �u�'�ʦ��"��Ww��[��f^�'0X�cx���������2��rK�J�J�D�������Jm��B�|CÁ=�55oc/�����h��N��L9�'0�jI��.��� ������ =$!_��3�s�^�>pX0�]S�c���Թ`gi�9��Q?�+�,O�|ek���kC)6b���f!)�,�M�����jQ����Z�F��_ ��Y[-�ۈfiv&���m�H�!�����`5o��I��xu�d
��P#�F�
+�P&�����h_2�n�nm��MsC�?�������w� ����O��t�[P�k+�j��n��A	��ǐ���� �H�ځ��Y�*�z��ל`� L﵋TL��0������1|w:4�4o�����(���%����j��̨5Y��J_���|��
�f�����
�y�l0���0����D��O+/�.5�T�"��$8��[g)T`MH��?�Ɠ��\�<f\o���-1�
b�y^�Q���E�E����*׺����e�U�.�_3P}7&^l������X���x��V�MCG| ��0A~�����
�
%_����o�
�À�c`�4]~rf
�5��o���{�/DRe�)��R��'2:(FQ�KL�U�Du�4�9��%���O�
�'����E��Gts���Ӻ|U[��nl�M�Ӵ��
+���/8*�;,��a���8�s�k�
��~!�!�@)�
�֧�&Ñs<-�s�Z�•�2�Eb��T�b~A��A�}D�ʺ0��S��{��{G�a�
oqB͝$��F8���z��*��d���
����:ٟЕLza:J��ea����
���q��
��T�*�1�"}�!�@��k���˳�߬�B/�lEy�~�eK���\�5��$���O�=h���Z����͓ނ9
����`�_��������ݎ�[�9�Ĥ���u2B�\s��
�u5=��@�Ό��p@
�z	t
�;�*+��.��Z�����a]�1��l�R�S���o�����
+�Кr��H�Y�K��g�<�`��7/�|�+4�A���*�K֨8���1��%�
�-1w������?Ɩ����)�r���~�K0�;h���+f��g:"&�6)�r����p�c��y�B��6 b����#�&l�:w����>fިÕyL/�\Z������j�@  Ν(�W�ڢu�����d>�P"Y��d'$�$�ʗ��
�V�J+W�>pG��[��^���Gڻ����2|M
5��k�ci{�
�ZJb��ILF<�fB>�P��C��R7<]'�w����K����QXb����*�
+��$f»��
~	^�̈́:�)�]��}�p��A(��+�R���X� zE����;b1t�!
���9�ݠ�B���j�`�
d�>�
��!�L7g���h
%<d:@dA��C�
�<�@��߈���@��.� ���
��Z�j���@pC䂻Qab!��
��M�b�q�q��z�b��ە�3;����@�A��K�$�˰E�
�N����T��
ۢ�H=j�o�n_a|�1��r(���'�m�r��Q˰�lp;�Ա�{�qe�� ������
=�^ՐYc�I$�ۖ(o%�
��� \�-�
Kч�޻����Α�v��K�W0d��ngXg��IF�~������X��QH��l8'Kr������gJ����
+*Xc�Z3}�E�ٓD�sj�d9F�K�䛉J� �
�I1{�V!xnK�-e>����7n�ׅ���
�_Qg1�R2Ǽĸ:@�n�\�K�X������)�'�WI�C0hݤ�!XL}����
4��l5� Vh2
��,��?��bLb#(sÀy�tk]:ibP�_"��2S&�F��
 ߆*:�/~���5�l�6���fݻ�	���Ӡ��v�<N�E���"A�M�B���I܆=��ӰD��!5��o�G�
]��Ml[U��Z~$g"��H�U�(�>�(l1���u��;8��q������i�7m�L[�@��Wxl�<R�s\�]1�^�>�g����	�Y<�#nMD��yY�ZO�E�X�;/C<_��IfG��u��R���O��M�++c�7�S��
+�4ƊaZ���ԃ�
�����u���	Mߊ]�>]o����/�m^&=�Nh̕.�g*>d_�$��
+]�k����oj-���]��w�z��`��g`�@�XR������
�SZ^6�u�V���^��o�����g��~X��Q��	�濮��a%{s
T���p4{���HLydW�)YU�&R?� �FD�/�'�g�H�7yO��G

+�S0᪄�g
:�po��)�-.XF:�
�e�� �*d�i��G{.㯙nwn.�t���Y���<�"��`����7�d�
�sSC���!�x$��g��:S����X 9
��Y������%�r_��']4K��
��.
q c�Yv�.㏢�
M
r��m������*ADbW냊��M1�Dq�by
��9���m��T'b�u�q�7�O�r�����
��}�y�XK�8���`����微�.;������~1K�}w���ҭ���rB;�ҏ�ޒ
&�6	�Rr���*?j���䆑lu��g�ICk���M��|���v����h�ZY�Hn8�V��z��Q3N?�?��֫zGP
������5�|No�(RG�J[�5��&Hs)qq}^�&2���n:z����ǰ�kFmP�03;7�N�s���i+Z�iӍ���	�^��z�s�7�T�m ,�
��zb�@��p����2�2{�9���6��ʄ��/�=�
�4�)�c���	x
+t&8
�3��B��-�(;�^S��e���dSy�7yG^�H@�Es��7<�A��Q|��h�[�\j���e��Z�Ҏy1|i�-��<C^ow���5���pc�
�P_���<.&n��;ˌpa��[y�y�$۫j���!�
ѫ�$E�42�˚v�?ݴ��^�wnYg?G��9c���K�+%�<qWŔ��z^}NV��]QvS{�q�8�ڷu)?
WV���1l��%�Wy���j�p���0#��>M�']�����|�k!���3h{�&��m��5&[K�i��K%�}UE���k̀��u
hT��[�*�F���k kO��Z �e�� ��e�v]
G
�ؼ;�G��L��W��[����d;o��o�
�3x����� ��Y{OEk[@��|�l��2��섐���^򒼗��F6a	�9�u�UQ[�E�m�'*u�WA���w��:^WfA�w:�R�c��$DZ9-N�7���~c
+�
+?��;�A�34VfO�
�����	5��*Dv��Ue_�Rqr�_����pM�v��]���{�қ[;��f�4�(
�c5ڑG����d�x�����E�jO����-n
+|�
�g8��
K��ٶŲ�]�{r3�J�(��?ұ���q�l��u;S7���qWA}�ǰ�����=��o
+�n��xg�|�GCT�p�T�aH���͗O�0�U`llڤ�C�lt��0�j�h�~��pڱY�_�,x��'�,�IU�jn�\�[M��
z��
���DB�b<Ô��]��T7S0C�o�}�2�%�s�F͘�MQ���
ś�!�7f�Sѕ&.!m����Fk����(+O�
���Oȏ��@
�W�1��f���G
�0J��Z����-#�=����q�b>@@
�g�IxFz�|�����޴\�E=�Y�g6�at�Һ*��SY�����5��T9vh�
��	�%2{}n���}I�90�v zRf����8kO�ʼ�
�jV�o�:*�x��H3�_	
6�WWx�4�\;�5ju���K:��:i�7�rʶ��Y
�Ad��~X����:J1<����;��e��
+(�;�M�s���rlڪ�U[y5�����vw�
(k
+-��Ol��
H���WeG㐣�݆L9s����ŠFp6���i&x���Иp0�C2�}�Txm�C���H#�ѽZy�ڇ�m{��+�E�Aa
����W��d
�V�Sy%�ې���8b�ש"SLL����1�4�$B s��&��B��j��&�d@��Y��?O��+82}����-D^�����ݒD��(��P��R��{���Ѭ.� �s��!�$��4��P���ڣ���o
\�i�(�����#�u"��D��8�
+� �:�]�C������>�6����ڒ������׶�*��
����m at 1GQm
�lìOrus�g#� tk-ۤ��<���v+l�U�w
+]�@��V9�9'��3ի��	
�P�?#�0eD�a���S���#�[%�����LY����ƉU��U�_n����F��η4F�/V[��&+�;�k�+�4e[D7\�~YCm[�D�����������4M��
�n/���9�0����:/[�o��`�K����(��
+��T��o��r
M�8���FECw�LhT��l�������
�;=���L�t��^r%���|�TXN��d�R3O>�
���^�
����G�)�
y����
ۂ�2��b�+�Pg�DW�B��;T��
+�4Q�v�����{����9輵;���!f��6~/ė|@�r~��E�M�$,<��`�2���+��oM�ҿ$ȵk�뤆���)<$�\nnu|�LX ������+z-]�:�r"���Xꗺ.KW�;���–YFC�	�:�Aǔ+�I�U�
u���+�U>.+͋�;�SN@]���
���L U������X�Kx�6
͑8=�*�U��4^q�ݗۥ>S韒�
+�Ż
�e�L��sf���	v?���m�!���'�粈�Y��v0��z�ْ2G����wT�1��e{B��H��M�,�
�&fr(y���)�%
��P�����
Ehl�%
+$EVDĶ����t
o��
\~6-�s��/�/���E���
2<뤪t�
���:���mb��p��V�����n(Q�7:�
�ziZ����N�l*�3��m�i��`��
��
s���nX
+�U��\�b�i0���^Kc�=�!!{pwp�y�
�K��H��&�Ș/�U�D
��
�g�#M@���
1�����&����yf_s�Ir����Ŕ\
�B�c���7�H�e�x�Xl��tbu�!��hI
+&)�� ֩�ršbp�s���;�Cu
GF�q�~~c6RbO��'l�"<͖����z
[��T���0}�5y   V�|E�W�r��ф �\�2�aAA��0	��/ɷW&a�A
+���AK]מ
�q\k�P���U�"�Jѻ�?�W���{��j#�'rG�^���$U��)~V�H�D��Tup����7��e��Ê⚊��R�"�I��^�w0�^�+m��O��X���iM��i�-T��5ȝ��'���N�]�~{e�� 
��r���5Ճ�-w��A������-��V��YF~�Ug��BO�Jt�8y�0���.{K��O�(��vlJ�	u�S��0��փy��k�^?��6W��c+�
+�C���l�]
��E�ko�%���ݼ�脦���� g}<p���?��j~�t7�Q|/y	�u�"-�Q߽����{ޥ��w
�iN1j2F��c���߀9uTE�����ڵ粎
t������
�;�HC;o�sTH#d��
����}�[aT���*Ч ހG�X�;Pp�i�t$V.��x�P
+��C�_"�>�h0�[[���tVۃw,���U���^|}�X?����4:a<X�
s��%���هU)��<�@Z�Q�/�[�6���
�.�	�
0A=��f���x�Iҗ��Q�l�3\�P�BoJ]Դ�\>[3��������?,���
ЛMOyI�Oi>�
�'�|���2��k��x��o��6��<J�c�^|5�ܲZz;*�,�1��M;]���U��� ���DQ$6*ړ��
Xz#���U��fZ,k���u���)jF��R6�:��*�hyY���p�I�~��K�SpMn�Qjm-+�y��ɽM�4q,��t0L$t�h!f��
��_�yb
q��X𖠕@�Fb��/r��hf��Z`;k��4<a�%� K�E�b}��9v_Փ�
���U���k��w�3��H��/us���k�`�Ǚ�;3��������$B4\+;�j�K�D�� Z
FF��v��
E��u�{qcʰS��TK��k�
+rS4�,F�S��Q�?���D ��"�u�%���Z�i�^,[U6Pw
���԰�
��S7ž$�
�!�E.����H
���7�^ü���
�u������m[E^����)@Y�MSP�)'b^E�q���c�?�'F����x���m����uym.͇$|��O�Kb�
��1�c���w�Wln��~B
���XfO�yDz��2�MӅ
�B�QW���ci�2�� [
�b},�1�E���w��^��k��b�)�k�,]��wH�ߦ�4�U���mϪKc`�C!��Z�ʎ�5�I�C�W�  �fQ��9�Q�|U���ά�2=��-�I�d����	2_���M��4� /ڨ��B��>oy *��Zo�9��XY��i�����fNP?��1�k�𾠣�� *���_B����u�p�ֲB[�
�
���4X����
��φ��}�����P����73�d"�d
ٮ&�<����ăT�>���x4�
Y��"��G��XF%N�g��t2��S
8.h��pq��܏��#~�
�2�Hl<hކ��
+�aG��-?�J1��p�m�����"��2���V�z�|Raw�~�l�8�
�����4����������
���E�Z�Kݸ���UG�|�B1��&T6���;w��W��ٝ]8���X��y�W���G-����%��r9���Pv��X7i�x*�L�(�u��==��ϲ�͓m
qqZe��&���߰�n�=jc�i�o��@��
��x/{Y���/�r�pՓ�-�k�b��(n��
�J;7��N]�
�	|ט
9^R��,��q��i-�j5I�~Wfǒ�;*~x���F�M��u��ò~�7�����S.0.rm���4�P�M��X��
+d����6���͵�N|b*��4u
v�v#3�֬ަq�V`i
2d%�

�5���0����7Ӝ
���jx��9��x���!K�hF�	bLb4�Ezcl��X�>�eҢ��(j
=����~�n$��
Y9P�K���C‰/�q䢘��&l���r��S�� 1��|�8��+�����ۺ���p5q   �Z����(
�QӸ�AX��!\�$$$C�srL2�$�L��%,���*OQ�u��Oł��BuUX뵊]�x��V��~�n�,��[�|�nC�
+-�bY@�X?(�e�92�"կ)f�m��6@>��_�|�Xȼ
���L
N�+VJ2�v&����ǂ��g�a:y�*=>�C�,꽅�zq����wΣa���V�bP$���Ԇ3H����*
+|�t�c^�7�C�v��f�C���UʆN�\�A�
X�)�M��Ȋ��Q�r�K{���Fۏe�"j��%��h��C�����i�24��.$�Ҳ�ɹ�D��Ӯ�?2�
���]HMt���a���PZ�+C��9�J*��_r%QN�H�4�r�{W)�	|�em}�^
�e
��ٻ
+�.�v���_.e'T�)�V4��(F��o��Ugzf��0�=�r��ƣ�[(h��GjK��Ң��y�}����%�]�ʟ%��(y쭬��0�����L
1���s�R1w^N�J�O�7�
��نy�oxõ��O���`�i0)�¿6T���@J���JL#��״��C ��[!�)��9!���w�+����@,�&T��Q�0GU5����a��
+�5\1(���<U~�� ��ڌxݷ:vR�Ȇ�qV���t��.	�d7J���<L���US����0ݠL��w�k^I�p2��Z���
���#*��͚i
�1�.�~��x�E \M;.�7�vD�5枤���B��l�4 �&ɷ����͉�Qs�r�k�d�
+�B�2i�N����ğ�'��:d�a����9�<o�=���:�O8� �Zq��]��\�(�p�/@Γ��H�+�nind`�gA�د0iJ*��eW}o���
߶�x�"omz�r��Q��u
�_p=�=n_��%�!w~~S]��Jѯ5V�Q��z�<�L/8#�
��+�������>-�9]���������s�4���1y
3���yʍ����/�	��G䇫~IĴ41��_�35g%@���.1N§�
N�̡�P��i'�7����4�
�@r�z�8�Z?�
 ��i�;�f�
+�c�E�N�O�ri@�D��
�����u{A�6.ѱ>1���_�:,� ��Jf?�/�L��C�N�N��*E]٭!�����mq�=p�)��
�ݍ�
+�c�F�M�H���?�
�b;t�%��
7�r�~�����L&�3>��ﰞ�
~6slD'9�?��6�
�T­�ϙ��^
5�;�
+k[�}����gX0^h�q$W�KJm3�qV/f�̔��&��|�}3����1���s�O[�9�"6��ε�6
�9�K���+�|d���j�8a�&�k��ɐ���=9w�U�ͩ��?�������|�
���0,����lug��z� �eU
,}*�
��e-���^u��G�S���oy��7��7��bC#Q����ş�n��[�,(
��l�^	6���! ���ʌ�>�"�:�j���<rB�a̪�� NfE��
�kI8<*�͒"�e�[�,�A��v
:ks�Cl.�\șc�+��5*�W
���&��ŀ~�\K�4�sR^�?ӕ��
x0v�>biq������2�$V1�\$���Ǖw��kGԣ����Q�� �%�[�����`�ѐ�J�
Ή	`��]���+Y�)�u�!*�5��(H��Id��a�oE�lw1��7�����hY�xЈr���M��y�A39S��cLYg�Bل*d��lQ���
���P/���Džm���l)��I�R�`i��?Ğ���A��Y訌�:��e���t��/�
�y�sn琸�M����>d�SG�&H�P���e*p
���:��v��F���ӫ�}9��|%*�C��d
�ڌ����T���m ؍��θSV��k��q�����~V�Q<
��f��
+�C�B��'��L�H
�?� 6���ǍZWz��jxA�|�+cs�h�i�#a�43���
�K�Zr?�'H:���m�2��A�Ľ
�e�Эd�c�M^��k�^�C�j#,���@D�L2�� �I~tHGǫ��J̀�e��
�	W `_q�Z�b��
+�"�p�p߄CH�� 	I&�d2�L�)x�ʪ��*j�XEtJ�J]�EZ_=@�X��Y�����#>�(�U���T��#tg��E	���U�O4E���]cD��ix`Ff����w0b(���U
+�
�Y��]sA��vj�fh�w at A,b��x#�i���u+����E���_�X��x˼U-�E�W'��_�@�� c�e2b1(��
h�^EN�
�
+�`V�[@-k��b���n�_P����e�:��60���������l�u-'\��j|D�me;��tH�GD�˪&����աD!ߪ�@��M��?B
�=�
r���Ε
t<�GH�8�Jd	��l�M��
�i�lv>Sw��o2�Y�!�;DL��ž�]��򮆁�����˶�R�����f;˷��-r�
�0�ۏ첸�R}�"��?5#��mk+3�(���(.���R���
xP{K$
���~?
uX� m��
���(U$C[K��Il9v���L�"�F���]C2q�.�OI�6�1�Q��x�	�1i��Q�Zxl��e_��)O&uZ���C�j
7$
6����} �A~��8zX�������m�b|�n�^i>�]��fQ����Bch�JDj^��
k��]�r�ou��#I���h
+8ЂTc�1)�ü��W�+�-�*�kx�u��e�I�~���PE�:���LR]
&��t-¬^�*$M�4-�b������B
����c��鎳�A9Z�u�K�Dۄ������T}��p�p;dz��x0w
+�
��7
? r���
�lJ�����U/�3B��K3h��f@��j�m1��R�זD*��p
����֓�2��O�(
Vv��
+n���d���mMAO���;�1�S`�M����
-a6��)��N�˛,��_
+�l[c�.H�і%�Ŗش+#]l��c�ٶ����$ �s�~
�&���b�~In^�Y�6-�쪸ʟ���/F�R��a`	�����Ei|�o���$Գ��h:)=�k�Zv��6���g|V'E����;�R�����^�t\"ZW��
+Y���nN'⢒���Li�K�[��!6b�
���jnf�$=�+
*�.Ӄ���
K�vI�chP�*%�z��ډ,1-�pGs���D�8D�C7x��&�X���8e�!j5kL��4�Y��
��&Xq�� �Y�LA)$�]�s�_g�^
.��[����fx���́{�s��Hq�
��	������o���݌�� K���Fa�a)1$Poגי�DO̐Ń��w�q?0
$װ����ޮxYZ�N��8$��8��
_ُ$�`�l�cZ��6��ݐ?�
ȇY�+�0�H5z�ቔkQ}Ö<i�|�>!���~QQ���2�&
P{B�cH��|��7g�z�9^sy��l������u^�A�
�;�R�ck
U�>�)����v�Q
�
8�:oV�c���s�K���6��8#7�>^nNk�_�<w�*>��m�ڹ3���"Ψ��Ţl�`����
D#����
����ޣ7W-��#���h��� 
<�L�qf6��6@��0}����ك�i���h�� ��
�ӛ��R�$�0�a�p��s���T9��˟�	sJЫ��lO�
�I�w7±A8j^Տ�ork�l��17�x�&��e���o��U��d!SQ2��b+��(k�m\5
���/ [...]
�_���߷,����c��n�$k��a�����M�=U�lM�Q���"g��Ɇ
5iЉ�5M�%7R�%
q���v�L�S�G�[]]��M����	vK�s�w��>���q|�
+�7�p�L=��#.��[��CjϨ��^w�UOl���Tv�Ce�����������]�j2��0�uuFf�ձ��ʪ�:�AƆ"E�*��S��'_
+� !��
Z�:���Qpt��4��7�rv�윽Ys��9��{�<����Fr��׃d�+G1	
F�~ /b�m1�&��& x��� ,�
^�
�LtZn��D<�t"��7�4�"���ף.9���m��-��6��Iq�5�����5.1g�)�j�����������!0��OD<%n�{?ns
����
����8�Y����F<�p	���r�wPq�D��!\ ���F���KA��^���Z�Ũ�ˍ�
�R���휃�E��Ꮵ��
l�a�������?��aZ�뵘lt�U
��t�W�z������s1��͘iea1�����M�1�g͞���v��w����
��x��e�W�m��O�V�����u�m6l�Ǧ�mav��ov�u��m�w8�������m�^wO/o�}��
��?t���c�N�
:|���s�/\
	

�u9:&�J\|B"
�D�1X

 I�dJ��Դ�k�Y����y��Bz���bs�<��D(K�2��T�*+���RWkjj봺z}CcSsKk[{���������[}��w�������>

z4����g�?
�x����7o߽�0���6m��3fB|=k���s�
�Λ�
4�|K��5~X �p���%�&�(�*�,�.�0���<��6��6�4^����
�?|�X@`P�sB�#�b�$ PX<1����A͹�O�3�l.O I�r���O�S��#?UB�P'
+�B�P��T;��}�
*~>22
+E�OL���_�~���[�������� g

,v�,�cy]
�zF��l�(��}FVύP�q㫪���J6�A�$�*�H���$���Ρ�����`v0;�
�f�×9�zL2���ٞQC|�Q�M5���x��zA�R+��Ԕ k*x��Gj�sH�%Ť^Va�ݼ����r~��Lȡ�3h��
5$؋�#����2��'$
��
+�,��F�P].����V!���fo��Dc&�2`* �_
'ǹ{#	ݰw%{2��>��aQ�*X��
SV*�5r1V/�
�\�����2���d��L9�x~d����E
�]0�
+��
�^z[�AKm���<�L!����
|���t䳁�,&p#�A�e* �aʁ�'pB�r��	}��1��zw�A���j$���
+�,��9�Kͅ|�-��7\c��L�
Sy�
r���Rꈼ_��bl؞�Ұ�U��KT�U|YB
[��3�@S� �J���Ӹ�!�C�2�)gO��|�dgس�u��
��zw��2P�W^R�d���\=M4�
+��
�z�Oh'�
��7�@�nOP��J�-�y���V;Lg�]f�Γ'�R���j�
^[(���Ā�
+y�C
�B
I at l3�o?� �q�M����zۨ{�6����T�և�*?]FW^V���|�.G�2 �T�!YHl"	Iͦ
+~���]��tˑ�ն��:6^��m5�������
+�)��U�
+�&G��͒�ҥ�U	�>IL�ŤSK�`�`�;��

m\�o����j��c{.]w�{]}A�][�U���T�5�䄚T9��"#֑�$-QJ֙
+(���R;�7������n
^���윆����a�:V�V�T����ST at e���&���
+�P�kL�l���vw���6�Է�U8{`>��5#��8-Eʦhc�5I��j�
��ɱUx�(EU��������u=X�U=���ux�}{tj�G
+�����4�a�(=���Gr��(n�Ë���qZ��T�i�����vU�肝���
F7��
:&|�ؾ����ĮȬ8CLNlG\nt{B��vx~T2?�]ъ�����?����:��B':����
����n��A���S�+���w.�"nG%���PB��RBz�^�ML�p�z�&*�T@�� �mH����h���؇��Dc���΢��&Z�T_ Wj
�5yI5���LOї��5��m
+ � �һE��/��`v0;�
�f��ˡp��;�ϙ־�A���}��U
�l��K��8��SQC#k�דtY�FU��VEr�AF̾!���b7���E�
|��{�e��
��w��Y�쓌�E��8�T�@V�4U4��<7�I�Ii�����������A(��R��@�����:
j:��8������v��ug����*t��E at EQ��
*�r �럄
B��;� !�rI�C at V@�]��_���Ӈ�Q����5��<�n��.>��U�W
�/)�a�Y�/-Ry%�F���2"�
	InK/i��"�t��Y�{�p�8d�|�Q\Đx �i'6ĩ/�U�Ui��5��gԧye�bLY��(k�e��&�\1q�(h��-����Ev;w��Λ�6 ��!5kC�(x�H��@����
m�՝�N��&ו�y
UF�e�a�f5n\+#�$�,�۾���.�w���A��ڐ&�T%_}ؗ�Y6"�s�
��9G
��&��j��
�ơ���R9a�WL����t~�-��m�
��A���Nv$�&��!	�2p��0t�{z$�?5Z 
uTj���]Ġ��`9��t�&	f,���h�؈!� %g�S$��&T<6
n�cK /�
�'z&��b�p��`F*��8b�(�@����H3x!}'�: yo8�I��P&\���P����{�C��@R�t(���ɓ�ʌ*rH1𵐗��&���d��x'�McČ��`�$f��>��m|�S�~䃱ؕ�$�x0�mq]P��e&�	i�#�eF6AWB~��8��QChi�T�ɞ <|�����]z��[u*�nz!�b�g��9�Ԓ�r3l��q
X�r3"���	>��4�SPh=m@����A�8�
{Ͼ�+\�Ǖ--�F����3a��@��4�M�6�;ҩ'�Z�
��8JԐ�pj��j�6 �
D�z�Q0�'����չ=��;Q���v��(��X����
�N#��0
-z���#��}�
��2��Ң��
���>�ƾ#�Ah��w��8Vw�5�C
�/[�r�:mU�5�f�Y���H�7H�����)N���6��S
P��X�'>�}�<��5ӽ�e�~y'NNdtO���ݗd�jM�
��Z��̓x3�Y��A��dE��CM&�-ڀjG
�o����ž�����>ْm\��-��u� �Z���T��S#%��xG�;�Ѣ�8]�0^�`#�Hƺ����b~ں�n��
��A��-9���*�V��i��TR8�
+��`'�yM>��a�AT�m#GђZVZ��˪ݐ��ETD������_l	�}�m�ϒdo�8�z�����P���c�)���Vd�jG�T
�*��:YϪ
�z*�M�� �S�qK�P�}���W7��K۫Ov*�o���m;C��z�z�q�t}�J���e��V�l��|e��ry
I�t��V2�j)�k��b腳��h
�����?��|��lIl�N^�mz�Qr}�\E���+������ݫl(�[�Xp��1ٔ�Z��[m at _Xi�䮠����
p�� v�f�y�?q�)����?GZ�3�=��@W���	=
T�����2lvsd�rڰ
�P챢�ށz��E



����
���q�5�Y�Tp
+yO�C�Ż���R�eb

&��l�[Ghm���
��b9��M�%��>]8��!p���~�{��g���k�l’�B�4�2?ȩV����n���I�����6
+�e%2G-8�o 
��Q����P6n�c���N/J/�F�Q�&=	}-9�>#,�
�+�>n���ƙ�,��Π�
��z,�
>3�'Џ�ԍ���I�����6�
M���o$G������Wd�o�s�f��ܐ�T:�jGyh��K�ڻ)k[��Le���ٓ���#�ceA>V�l�
��������o�iE�Ǫ�2p˪l�Me.{J~I�T��"��C�vn�c���5�3�}-���"Ðh�I'ِ,���kHM"D�[Yj�sUZ�CM:f��D˂�
+�)U�
+��N�a��a␽Zfk@��
	�0�,��"IBL�tr�AlĐ
�� N9�V�r�:��#�Q�1��h�a�
x!c��oD��jԀE�
����
�_�dLq�i&]8�N�L�S����NI��S��/�)W����K�lƜ5�==\�[jTv]�٨@�(��W�K�s�m!fwO��)�ii�L�ڤ���?鑓�#�tɕOL�=�?ٯ������9��,o�9̳��t���2����UA��P��@C6����-!d!��@ BB6�B�ĂQD���k���op��9��4����M��re���9�*��Ӎ������RM�d�0W�:�r�B�5*G1G�R�Bd;
�ib"P'd�h8^��`B��5yϕJ\
���L�΄*nW��2���b�߭�L�)�3t�*E&�'	�sd�r* ��i����@s��?��/=:V�h,~ߗ��;{���u15����k�}6�EnA;��xo��
bh�S$u�,N%��ɕ�8�j��
��'����q/�q�O=�`�S)����г
�,�T���ר�s���=@
o5�-z�$^˚Fk�3(�l�UA�?5(��!�4�
��v
��(_uw1�f�f:�w-�}h�X��Kvz�q��A���O�Q�� NϜ@�:&�z�$B/�
��$Gc�*�8�?���z0�;ߗ��]�/ZZ���V��#sY
]�X&q�zlK�NC���d
P<dՋ�c�1ƶ �ؽ�P� Ҹ�=��Ӷ�1��S�o�<X�8�/%��3Y<I�X�s�:�Hs�oe�vn��$�������
G���H�7�G��8`ݗ�$����1�]�\?�2^OdJ���tJ
�z}�eb����8B!���v���@�YN��݅4wBT_D Ձ}`0��Kw������ͮGf�
GU�
l�,&��3�=m�2)�
���(ʼn�'��qv�c�
�F��+c>¶�G�F������ޜ�
=��;����
�èj��!,�z�5�ϥ�+D�`���C��^����n��" [...]
A�
 (��$e��EU���
Ȁ�ӏ^9���������,�>I�oG�s
}YE�HBW����h���֯�յ�������YTw�L3�r�S1M�O�eS-��)*d`���[�������hh��%؝��j��ӣ��͓��\$|�[��X�RK���@-_��J���oЌ+כ�ŋ8V�"����]�?���/&�����������{���d_$]B?�,k�ʯ������2x�F5�x�
u�n#��
s����
+[�������o�y�D��s?����{h�ow���1,��8	�f�L?��CVA��yE%�
+K.?)-����amU����
[�5�[�ڜ���Ⱥ�Mt��M�0���o� ?�s�}*�Ϝ|-��.̩� �{JZV�u

�(�lIne�C�6�����%�F��Q������n�j̍�;\M�{��w
��5��6��4
��q at p�$��{�{�bK��XQVx�

�&�\^f��A{�O�
򒻭��m�����
.���B����0b��
���@��ħ/��d�?��4m�/�o
+��y0�
�w��A6k��l
o�z�=vV�tbd.R�
C�{,�DŽ4�� ��]@��Г

z�Ӂ4#���L�#y��,�xK|�}]Xÿ�C��
�>�A𵲇�i�6��p�D�1�|܎��,H�ψ���P�
(@c���
�ii@���Rq��2��[eaU^��FR��6J�z��!���`
{��v'���
��f��Q��m�)0}^(�6Rc�$5
(�r~P�,y�9��wM�:���(�^�։gDH�D��ϡy�l������"�0A4�t!5F�5�bl���
”#@��
+�)�ۚ�+Ou�`����;�\�
mqׂ�Z4+�+'�8���bqu2Ǭ�N� ���G��t$����
���F��7
�G�,)�������O
'�6��b��gSo��/+�Wu��������Q.ml���c`rj�($oQM
+��0��rIF?�i����#@���I�_�S�����>8�Z7g�W-[���ܫ��
J?&�[���1Ck\����B�"�mф;[��
+ ���7q��D
+�$f�Øt�;Sj͖%q�z��f�g,��;�-�^�
�Q`-}"Ҙ�G�H���v��-
�35Sl�.�J7��o�@��
��
�5�p
�Ng�mw���ٱ�ٙ�mu���*ꊸ����/#7H �NH 
	��@HB��\�$77!�P���x �E�.�o�v��[������O���8������bD>������������)Q���6A�Y�-�a�W�j�LGU-o��F<B��8�4���4��N�_ �
�T�%�w�O_�@����9{q�/��ߔ�`P�ɥX���h��{j*h�Z;��0T��J
�5R�+ ��
4x�|_O �9�g.����m�Φ��	�^p���܀bFl���Y\u\,R�ՍR���J�	��K5�d
�A䉆Hl���^js�l�x��9��:�c6:��-
�?��y{"38�\n����,9"ARU��+���J_��ʆ��Q��$��e6W����}HN��SA[�����2�:7�<v7
�=�DU��٭�٭

��ڀ�St$K���������\`˓�l�V��+ ��h���O{ ��/�y at 6�N�.
�D�OFN�eئ#��2��z�
���F�if��D_h$iK�8uyZE�A(9�peko�R� 8��� y� �g�L��Wm
��|!S�~q�`��`�l*��7��aڲ�+�QR�%_E6����̌�VY��:+B+��5-�� M����@��1�u�q���gq��;s'/9���?�lRě��a�$si�
��hIQAAt>�7k1Fj�@3����\=ۉ� <��'��#Gޙ�?�<t�cz�ЏC��C-K���4�
��v"��b$�Sj���ѭ�^��M��;�ڑ�R%�R��1Wi��
�u�%���������|�ϻ{��<��k}�
)_���=������M�V���
�6�(ƆkF�[��
+Ź��m�
��zw�,��F���p	h9���voZ����ͯw�x��p����o��=3��b����
+�$���ʨ����!G�l�0��3Dh�v��Yv� s��)�F��h�)�-� ��܀n�WK�/o>��u��ߎ�o�
�q���xeP
 I��h1�nzY���=�W�u
M��զ��g��ԥ��'�(e]-gCGi.�];^���ɹ�>�~��o�[?) � �oO�P^�M!=�a
Ǡ����tR�l69m^�rU�4��\�	O��%�%�-,O�]T�B��*s�;�?M���w�+��Pm���v{ւC)��#H������ܥ��O��)�i����h�\L�C.�!� K��'b��1�
����HQs�.�����w��{�ϟ��/�2��
Tp�
	�c6�#s6"���b�I��)���i�+��˰��exV��z�:;�9�

��s�YAn�S�K�G?��v��O������W{����$����a �R*��
��ը��1�o���7��l����	���˯�WC^������kh��+ ���qf7�	:�B|�J�+*�u}B�2#�P�C���Ѧˋ�S%e���*���:�g�
c�Ch�܁li��)�
+�`�Fm�5�{����kï
��
��5���!>s���^���sUX�t�9UJ厓���7��YΆ�-P��7 $*g�z0W��]y�����l`\:XA>�s9�
7<�5'&c�E=ff��ӕD�dyi�x	M8ZH�<Wa�T6T�چ�h��AgEt���
L�1��
�A�Cc�#�V��Evr�}fN�t
�1I#7ܤ�	G��ۆ
+�r;���a��t��)��Ch�H�^��0����
uΆ��c�p�.]���
~x�
^Lޓ(q��Uv�����&ro�(�Je���P
��<_ׇ�{Q
+c7Rg4�tFZg�a��CC�����Q��x�!��)(��04e�)
+�T����1�2�Υ�f�8��E‘��6G	��V�����^��؃R��(�E�֘��Y�ՙ�
�>6�.
����"4F�m	Iz���9��)�d�1��
ź� 	F+)mju�@a��7�g��DfFiUcԝR��ڊ�X�x�i�>6|X�G��/@@+$���k��a�����Qbќ0��/�n�M�ҋ��]%�:c!ר�ZTxY�
��jq4�F�ּ]X��yw�?����=5a' 
��v:�u�]��㌵��u=���,�"�@n9� �$$!�+���E�@�AHGBB�p��EA.�"(�hA�
P�뷙�ӗ}�Ї��w�
+oP�E�i������ԑ9�q�ͩ�[
�q)Q<\U�h.g�Y}��WS(35Q���EJ�Yj)zS
��h/P�k�����<�^~��'���?aS�|�� ��A�
:8}F�/�R�+�����|����cha
+�
4�Y^��H���j��ZU�7

+����[C��1 ?w�<}A�w�{�_�K�yē���]P�m�p\�+�ؐ-�
T�ź
ˠ��RV�YĐ[�t� �X;�-i�(i���7[�9GP�q4z� �g�6����@���0�=4kֈ�\�c�-M�ANTij
��*�A�+7V�	�|��ZQ�4�f��m�l��d/ �5���
�@��
+�ݽ��#�]�w̋���Usri07mN�
w�ˌ|��!W��Q�RQI���c�	fWlerU���:Gg���&{�� q?
+�n.���
�����|f�0�rg$u͚B���8�6���9�A�$�Vˊ:�bVoi
�L�,EU���J�@!Og)������@�v4�>4�=A�[�+�g�� $fy4"nv,9r1��gJc�:�5J-AY�L��
+:J匞Y��*��ϗȭy�5�Zg!W�����6��
���@����@6,
�G����D�OMBӆF`�+��٘^-��+*u�j���/i�u�U
cnC�9K)��7h�����s�z����� �5�]��N�������ٰ;��T d~><lt&a
K��]��VTUu_���;�����#�;st��x���m����-&ls{^i��
� 
+g�9yN�nZ�Ϯ^sw�s�9�
qq.�5
��4�̨��&��J���l��d��2zY
���.d����ؓj0t���=��#ۀ��{�:y�
?����ڈ���-w����~��B�=wB���(��z�?�1G�E����AR#�R�ƙ���6T�P�f�kG5��^C����� s��
��#?�
9z��	��%g������^���t!�̛�a2�Rx�c����,i�p�?T��
Л�VN
��W#�E��~���j7 s���Z��o��_;�wf�����	���.��U��/����`
+c�(�� N`+�G�D�+���:�%Z}�E�2u��>T�J
�4&
*��o��w��}��
��u��?���z�X�c���Α�ggS�+~��P2u.���3�M��V�&����*��1Z,�_e����%I#\i�P�pYRg/Pph������m�s�
Y��}��~'�kG��s4���T�j`�ޅ��X~>�3�e�n؈��2�4�"y��
���'�����ʸq~t�Zh/���5�����k���o�f�صO�a��8�s߸F�_�$����@3q˰<�R	�����d%��'���nQ�q����4f�M+���Ҩ|������׆�n��|�q���j��
p�Ch��#�/ⳟ_�c�bQ�G0l�
+�%=+�>>'n9;7�^^^�=1�.5?j���D'_X,�D,�Q�n�����?��t��/����J���\p�
��&��w!��ב���0؋���g�T�StZ�
*j���|��
�	D„=�bC�B
�3�WYx{�o��t}�5�[�,�w������$	���4LB�A#�oaQQ���\x�����ą�ʈ}IH��N��K
�ȇ�ߠ��
��K��e���'�s�}*_}�;v����$p��;���$p�\,��1~ �?$�� �
+
+�� �
��!�
+9�~��|?��}�S����R�
��wp����^@
��Y�H{��VD�rqQ�"�Ş'Vpo�TU�$�V�d�DױJ�tz�t
+�*�B��M"{�i��1�����a�=~o����ض�R[�� ��Q!��q/��e��UV.y�VH[(`��I����ʪY���L<�SJ�0Mu��V���~٫�@(���C��
[����=着0�#�?��/0�S.2s�C -3)��bg����$�395���t2C!��6+�ӵ�khC�5�Iu�?F�;��; ���?�z��{w��]-�SUԧU� ""{*(CF�
+DF$L�@	�;���/�d:�!��Z
u]�{��w����T
�*�� ʇ��F� �� �9xɉ��Y��9E���G4v����؊�?�Ƹ�@��ֱ���B��J�|��/7)�˜����b@Ջ<��*���@�
�;��€ ��f��e>� 1K�Wi��E2�c���9��rg0]����D��g
�Q])����ܚd��]ѯ�W�iMU}:o ��@�
:�v N�?ćѱ�@���F�q�?��.�[cT�(��y�1�o�M70œh~�8J�
��h.#l�QD���ҭ�W��F�[�����3j;�E���#@�� ��O���<��~����.;��YK��h�k&�qt�d=��r�T}�J����+z�PU��X}Ψ�9gT��z�<����
�#��8:���<1��)y/�%O$y����evU�m:�>Cn�^!R$��,�@�P��18Q�r�
�.���e�F��Һs&o|<�#�A��D
�1�@q4�7剜_���NJ��5yvAT�<��P�hx�0�,��w*
�\��^j4�5]�ͪD;��:�U�qZ�W �s��~���,�0PD� u������gڴ‡�lIJ�}����8Ma��)�BU��,��QdRb�n��&�8����mpZ9�.�7>
8a�@���*2
+hc�^�3~1��3�J�E�i�颸����r!:Aj$�U��^N��Mr� ��s!�����&����xt�~8���ۀ��>�4�@s�W�Ѵ�m)9�PV�-kQŸ��iP��8��
S�Y��FR��4���c�4Kl]
�I�C4<Q	��z�á�s�
��!{�2� Ѕ��f�NxfKH~�Jμ��Οu�F^4��܊����p�rf�J@�г:���6��BRBd����
+Am-[[��ꍏ��m@��Ch�[kd�+>�~r��`v��S�!��C����k��B�D��+Y]d=��a&���JD��
�;Dlw؛��7 c�_ �so����`
+	y툈z���6��tk4
6֗��7Z
��*�-��Kآ&%�ת#q�fB׆cʡ�
�2 G��MT���C?�����.�X��
[��Z�H�����5:�W�t6譥d����U�E��FIҬŋ(��ZǗ�kxZ����,����z0=�� >�=P
���~�
���?�Y�9=1��y~4����t��V$�a��i��x%A��!j�Ls�LdE�Զr��V!tZQ<����s`� i����	,{߸�?�x���Q��#/N�e��`%���z�yx+�U��nG��z)�xVY�'i��NC�V`�k��"��|Fy�T&�`y������'_ ��z>����#�n/F�\L���z�2���Cs/)��Tb%Ӌ�\8y��U	��B��+��|Ȫ/����:� �� ��{7Ӟ޸��h�o��;A[����,��8N����(��V�'O7������*�
�����x�Uzj�ޝ;�Wd�(aCV%l`P��Pyp<����}�捑
�^��g�Օ���B�
kQG5w�a
g����7�p�kŭ�Y�l���hd����˿L�^b��/IİK�(�� [...]

ۿy���7�S[��Z�����
h=(L�0��~l.}-����Z�Y�n@�."��@����P
+g�SDF�d{W���5��d�˸�:n�8� �
��� ��\���o3K>^��=ݻ_�%�%4��$&��8�� ��j%��|	���A
+oմ��Ķ�^Ƿî�:�f�Ԍ&��
��6-�L��zH|�

���b�?����ӑu����[}U��
+^��^��_��b6��Q�Y������U8��2��Tݘ��i�-4�3�4�o��'�iͩ��ZRn
+Z�o�H� �͟�s��ӹ��?}����W>ߪ�m���7�
+�b��#�1��e����n��
��?�#s
"*a�Q��{u5�k
�i�xt�JK}�
+��L�
��jH���
+0}�����0:����[gAM v
��t�v�3�t�љvZuծ]��u�C�;r�CDD ��@	!`BBHHB�
r�;��
\B���ZP�X��nŋu��
���؇}��f~/������76ذQ
����@Bbh�\�
�Y��u��un^�R!��
lQ�wL�s6���H-M{��#��R�p�R�ʒKʓ���7k׌M�rM��'����?��g�İk�S!"�	q8@&� 
���x�w���3�Ks�ޖG�!禼�:�����􊑟��� �%��� �X~H�<�齾v�m�Wka��İu�~A���D�
+(Dh>�F����,�A�C~�I)��o|J"��& ����x��ŭԤǮ03b��gF��}P����M}�3-�z���[6|�Ǔ�oK�@C��' �룐��A��
���	P� tD
`#c��{xʢ��
�H��� jl80bÀ�!s�'�<�jc�/q/Ӄ@�

�|�
+�8�-�
��QMxFeU>��i�HR�|��� ���/1����{��.�K<[�'�-<+�A�IgPW�7
�K���
�g�����
+��� N
���H]iD����/X�"�IY����E���M�
o��(���
+g�]�Yt�d��_6]8��|�pR~
=)��L�}�U�z�����{@�
yf4HsRA�:�VPR���X[CY�q��Du*ܹr��.� ��Y%3X�lsZ~=��*UN^i��\U^,��t{�gP�5�y
��- A�Er (ӣA�����eQq�����>IY`��<<)`?����5�Y�^2]b����+�0g�n�Ϫn]T_�\V�c/�=�˚�%>����x[@���A����#I��=�,-B-	��g
��Vm�<�Ǿ_%�߭P�f�ZewJ-�۸�?�{5��#��	�%��Sr�y���UC�� ��
��ݠ>���Ф'��X��ʂ��Rl�Fy�C���r�sT��I<MlQ��[T�p��o���|s^7�׍���
�/��.�v���?��A��bw�&� 4'��� �Y��4�y��h�s	��1�����b���U
+�I��I0k&K;tWp}��Q�h�� ����켡����E�
p��� �
���
���0�'#@����%'��U�������<F�t]�]"�JQ��I���e�V���Ɵ5
�L����:�cmvҘ�R�U�o=HB?M�h�> ��0%ŭ�Ґ���Ǟ���݌!�W���i��
��K�F�M�vW�Z��fC?�������]>jq�F-V��Ty�l���?d^�6b�#�Sl0�b�Y��K���O̹�4�KftD�uE5s����px�!�D�GS�vWL��v��|�j'�mm�
���c�U�Z�գ_��E�&Ѕmc�~0��
�֑��ܙ���y<wΆ��4*&ԔZ���?ȯ���
5�L��A׵YNZ���Sv}ՐCW=b�PG�*�Ǧ�y����
��M������5*`��#��Tr�+'{�
]x�\Z1���
RR�=b�������zScnamZ�ˡ��;�t�S^�v�#6)��U�kPo��࿂9�KpD�����+1v�'=�~��o�P�K6
�m 2�4��Ny��&�j�<����dn����L�C��q���N!��hd�ؽ�|<���5�mám`	��p�官��z"
���
�AN�)@������2FW
�gW�eF[�5��YҠ�5r�N
����
{s;��n;�~��U�����
� Ơ���:��9
�8p8tޝ
55��:ї_���{m������L�5�X���I�f��;Kc��%�t�6�u1�N�mg�F||�A�54n S�_���B����{<�|p!-�'+�������E��K�V+���P-U�j�����$n���l52��*mwVK\'%n'M4b�
Gl��� :�t���Vh��ÙC{�3�����݉���${�����/$8�p4�����R$b]ՠg�0u�&�Vi��[�*����s�TnG�|�N�yl�Z5H�Z�~��f�<�m�?p�3Oخ�W;oO&��g$
���*������nB���,������k���8N9E�i�՞��VO�:�c��w�+��MX	$���
aEО ��� *EY�dHeJ q ���.�{�1�����������wRX%*�U��X��ʄ�3��W���7j5W3K�]L8�(L6@�շPv�j�{��
5�m;n2���I�XKg(���Q��{8���$NQ#S~-I!����-P%_��e^*(�֔T�j���5
U�ږJr��Jj�n��m(���v�O��n�ص��Ю�
��QW�GC�6�{�}�:#�/�a���Dzj� �vB��&�ɸ�R�1�
��<���
s��
�x�
{�a9��n��m(1��̷C����;vNw�o
=��c�e߽1_�ơ ��di7���NH��Q��
Ƌ��化�|r����+F�U�hueI�����\y�Qi�Ggt�mù�[���6�����_M�y>��W���k�:nv}�þv
�sv$4��y4A֏�K磻��2��n������uJ�����UaDG�2��2��2�qwQ؃���R�pa�WPg�����M/�
�uL�nm�X�i�����vu:3��_0
%yN䍡I/�ɴQ:�8��nj�	��%b�P�,|�Tv�@�<x�֍���6yP�NPl�jL���d�a�s�������
&ۯ-Z�^��.�wv+����F�4�DM
�2�gfhɘ����	
7�(-bL�}Q(U��F�E�#��#׵���v@���W6��{��ꅿol�`btq�|ɒ� [...]
+�R�M�L�p�'ʸ~�<�x�NPm������
z�c�\�c����]�Ofy��lş]]��H���G$�;����zO'D�M�
{�BYL�������y
�\Q��F��є�{�V%�ܰI��e���'���_eP�[OÏ�s��,
�r��1

F� �
�\!��}�!C���
+�+&�w�o��F|���,ea��rq^���T�wg��t�\�w��@�~`�`��S��6��%�#�䀣�mI�눁`�(@z��;��@��F }�
�
�`O�x|�
u�,
s��s��
wY9���k��:�蕏����9�"0�.��2�� \-P�s$mC �> �������^@q���;$����8
ΐ��BOG�hO����t��P_��__����r��:!͆�i`�=l���i_(x� ��1����
r�a 
q��#��$������� ��
��$v�@���m��dx��8�$� F{���8�
+;��("���a��)^ST���S��

��7����
+Ә>��ɟA�dL�

�b�c�!�3쨠�bU�o����m`kR���S2i����@�� 1 �ȏ�l�r���>>��^��@=͚#�K�+���ڴW�+�lc�4�`}_8�������1C���Q~u��6�hx�F �0�l?
�	�y�;H� �!?��)|�$Y�"3?i�V����徊�H�!�fL��S��I̝�It�x�#
��{���v�MH��!��!��M@�0���c��r�?H�+��e.���%f�N�M�c�H����͐/dLk�����	�
�V-
�<����I��ϥ
�A����������=�j�2

!���}��A�P�t�<�d�F�d20��)䷩B��$9K�Tr_�K�Ӕr�dlM��N2��Y�ے�۝=���$d��>��I�9wȫ�_G� �7��^P�
�6P����%��Ȩ�ea�-��\`�X���L��)jY��F��X����|
ך3����"�紒�jro�/���&�ꀣm�j�v;!��Nz�A1������
+1�+�d�)��V�a�s��YV.o*�X0N?'�Tg����<'�T�Zs�{�ZI=yw)=�?S�4О\�������
�	���p�� �|��*�N�{���?(�ы
+Q#e�MeX�q�i��Jѳ�R�SF���z9���X�FR����w�O�M�n�Uzw�Oq��KqOV<mC��!�v9���~(�>g�
�Kx}E5��q
�cu��(�:�ʢ2�� R��^��P)R @JH��C�"BE0	A\��
���g��nև}����9���9? 
�^��!H�yY����z at -��F*#��1K���cH9}�b_�R�h2/s/g���f���
97y��7�
H���P������a ��� ���0����WRX�3a�A
*�v
=A)%�(����j*5ybf?���7��
�+�@\��MH�@�2�	��
 ��P��7��]���AP�e���B<�*#����
��q�
+r��|�h%�x�\N�/b�z�|VV�iè�-��
+5(n@��
+�^$����k�
+��$���ub��
+wk�<s�S�߉�MAn��#��6��kH���f�Ǹ��H�TA�t�VU�հ�	b��@)�Ŷ�e�K	��D����
�b.n\���
���Pbj����u��n@�i��f�?Z�_��x�
�w�))J_��zU�B]��;�Ŕ��F2�]K�D�HHh���R~DVM�I�D��Iԋ��q�9���@>��
�d�߁z�����f���������0��]1>���F��)�\d7KheR��U�r:[D��x%2Q5I%eu��aYI+��t�J�^�%�(G- ��i��l	\~ N
�S�y�U�����0��.Fy��a��M𔋵d�CPq	d��&��؜�
�L,�Q��d��J��)��B�J)d��B֋�$SC�
�w�N���yߧ6�Ʈ�6/���>

+q����J�hMI�l��m���"
Y�+�q���
&�WQ%�+�ŕm��������
+��T�����bs@�����
����@�ӞE��o�ܭ��
�-�~b0�������䤶�
�2'��rą�
>�U�epK�y�B�B�c^��3��X�VV��IqUz1�
>7����� �O;A������
t����������
�z��B;��~ICț���F-��LZ�,�8G��K�(^�4��#��J�
�]�c�z�9���@�Y���A�����}�O�_\;��������n�z�G�PLh�%���%l�Ʋ.�I�*\Y��������(ؼ
�X�%m�K�$i�k�
�^�-!��Bs@�i��
+�?�l�u���������?o��v����9�ц�w�D���%H�S2�{31�����|
+����n)c!��5�*!/�Q)Hj�&���I
A�� ��
|s ��Psp
�3�F��>�M/G�l|t�ĺκ�>�m�w3ȭU��
�
N��ӑ��98�żbt�,��B�w2�I
�j����Vs�:�L&9�Z&9�&� ����^
M��a��ݕ���ɤ���v�O�
��e�q'�Ey+�_h��bh�'�G���D
zCȺB(�k���AzE� �*f��5�Ό
�0"4ӌ��)ft��
Pnj�
��
X��o��]+o?سB�쨅手e��36M�$�Po��(u
+v�0�������2`�R��y=�0^G/�����z*T�N
�k��㷩a#3���
+s �r%�ۿ
+��V���e���
˴���
�?��s�i���1�ߓ��A�ԇa��q���I�w3�S��Y*v��5�(������Y51讆to�4��0x�Q�9���r�l�|��Wӆu�s��^�Y�~m�����Kw�|NQ^���#B��q��s���ғ�i1s�̈����9Zn�
0/G�Ϸ`��{�|�������{�c�n[:6-���2vk-��oV��Z�m-�F�C
��q�����4F�c����qƴ�(c
j�&��Rߕ��}�L�{#��}�����9����,��W�ϼ
3
�, S��!��VC�fi�}ؼ��þM�G��N�K?z8��O�.{—��`�bc?���[BD/b�>b��S�P���o�9����3)�{��J<��#��}�Yw:W at F4� �WAZ�Y� ۾��[h�Ϊ8, �v��
+] �#�xA�7���̀� ��}@a� �zZ�`C�?	�O-�"ܖ#�>6�5ڷ�;��2�"{��+�vM%��\
�-��yp�I^vq����2_gQM�g �9�=ǥ=Gg��>�(*(�Ȏ��;�H�����d%|	�
��,심���@EE�R�VOU����0��l*���w�o�{��_����;�C��i zC�g н����|_H���)O��� m�;�ݠ0�ʃ]�ʬ��_Y4���(��"6����5p`��63�q'	ܭ��c
��~�3��!�> G� ��P
��~�؎
�wr��+ ..��:���r�N@���uᎅE�c

��*�lظ
+����z
�H�MQ��
x��������zAԾ����DkW p���N�8t8�
@`s
$��@fk�a;P��Y�l�����n	"�
�b
H�Q�ƺ���<v�R# 9����;����PN�@<G{w>�
����oc.᮳c�ً��9
��ܹ�1�1���������?�`
v뀍5�}w ��G!�Bj�/�Y���D�}�鈿S
+�+�����5�wq�����������Y���.���棇x�c�y/q��1�4o(v�7��kH�x�� ��A�An8�x�|A�

+<A$���5��y�Ki����F�b\
g���]�����n���y���yʟ�M�	S�ḗ���i�9��X��d^�
��g�A��F
/��S��B3Q�SJ���*�bBg�x�7ۖ��)�����

+_ឋ&���Q�KQO”�
`}��v�A�l	��!��Oہ*�2�| �v$�S	�ؙ��d}һ�"�Rb%{�Tϛ��ȟ�k��������%S�1�(��q���7a2����
`c
,�A��
(=�����
=�H'P�AI#DB§�
��6i�^�\��s��u�����Yb��M��ׄ^�
aT��8.}��"��4��!O�nQ�e]f|i`Yi'��l�m�����`
w=��	A���Dx��"���S�޲L�7�R�+j�p��$y��t2�3m�x#>����e=�1��ı�.��$�{5p���נq�
+&+����0ȋ9	���55l	e��Ԅ��J�tJ{�U�K�?Mj�>��"��k�>��G�>EO�sE7�ڙ��+��2�<�b
)�׃��א��
�{�A���1(�r���hH<=�fDϠ��H:�X�
N��KS2jd�К2�SB�Q��w)������봑�6�HV+c$��i
���:����F�-P����,��SY��r	�g��2m�G�k�q#(B�C�8�z���B�]NEz7�
��ܒ�I���N����/3����au#kX]�y�2x�V���:ȶ�yΛ��k������?T�9���>�k1`�0)쉑Kx��P{
+�]D#��؄t
+J2:xՙ�&�V������"�_�����8C�j�7�1R���u�Ӳ
+�6�Y�
P��sM��ҹ��>���j���Y����,BO��z;[��Rd�:��MR�h�g7��5��V]=����{__�З�s���b���
�c
�kA��EN�Bv?k��|��?0�j7��8�H89PE
+�-a�o�Poꤜ�Y���B#k��
�����5�*a��\p�P&�k,�
+E�|�>O<�3�Kb��XC�㟡�m+�y�~�oߛ�`������b<
�&������Uȥ\5�9��颦�lY�€VɋTg�*uũ�
�6c���dJ�3��F�t@��6�cv����`���^GK�q��
;��}�^]
+��h;c;����H
�N�]/eS��
�
��V��Uf��Re�� ��$�7�e�MZYW�F�0W-�3����|@o�
l�1a
؜�u����m��%�]���V�;B=��v�B\pW-%�����\�g��KE�R�S�y*�ʐU��(������E�_0}&�7���9 ���@�͟�
+�S��߮\t�n��c��u��O:�>h�p�{+!�Z#9�RM2���Ǫ*
K��H�)��T*m�N��6���M2յ�4��\D�gB������9_2����?B��
p����%�M�u�m���w��������u��L���@#��p���BA^	��S�T���:��:��8���iQ�i�m��lY"��Y
�Y��9�}�^�Pd9(R�6�� �D�)L��I3�	%�8���)��������������|�'r2$E9)y���W
�ro
���
?(}S�ӑ���)�
�֩ CO���ǥ]����%c7M�5Y,�i�Y��!i��F�y�-_RM-ϻ�R�?{9,��Rl��|RRF�$5�t����YqE�������7
�
)�ɏ<ޑ��)�
�
Y4P��SF��5;��/
x�W�����g-���^f7�2�����.Ԋ��U!AyW��2*R/}8�Bfz��c�%9�gʥAgj�ĥ:�NwJC��rg�EC�zu��6W���zs����ms��w��~a��������
�5��e�
J�mN�� q��ȈԪ���k�Rb�
��WH���:&*���_V��/���+�w���_rDg�f�IkU�����[4Pe�1vGO}�MO���@�ٛ�K�_�o���mϕ���Y�'�	�Yw�������F��HN�M?x=G�_s���b��:�Uݔɬy�ɮ|�ɭ�
�RA�b/+�զ�tU�|�J���
+�W�mR}�m��N����W���)6'�����|�
�
��c�DŽ�6%ň��w����3�\Heܩ��%�w_J�{����1��
GV(�d�2*uT�n�V�y��xիE���5��.���vmy����N���5���ҏ��.b�<
�>����o�DrZ�c}[���-��U����$r��D���$j���� {�.�TB�2����/^�#
.SjПS3�gi�{ݒ>'��
O��
��q�b����_B�]�\~g��ݑ&ft�{w�
�t\
�ꨎ��l�t�z��9���)z68�D	W�o��Z�?u�#ꇗ�T
,��i���C�zҏNF�<,�i�QL�����?Л����O`��S���,�W��}��u��e��y�UL��+v��S��;3��$~�S'��� ��j���#*eߩ]�o^T,7Y�+��O�;'�=�#e4�@ӑ/�rdbO�,�B�
�&��xȏ����Y����h����u��X#w��v�ݗ�
+C3깢L<��F�{�F�x�A\�T:�����۴�����|��O'�w7�S�x�
[�ׁ>!r�L�:{NF��N&��&%�����S���T��˴}P<4�Mt���
+/f�V��wW��kS%*�4�ҩ��ǡ;�
�Ra�:6�p`��F~ �0�cF����n�uF��#��#��G
�!��
+E$K�s�@��9�]��0�������D�
�T���e��8�v,����`X�`�

�������N70�I��> ��~�� r�>ę["��
�fȱ2E�>��ރ�w��f6uw����	��� r�3W)
˕��
��
�0��b�
+�WS���
$x�9�[�Lkp�XB��A������{��c7$;��C#��@��!��M�O��/	�X/A�b��Ah)c�� �5��2�
+�E�0�"�Z�
+l��<W���z/kL�^��u��!Xw"u
�~R6lE���8�� z�o�*XF��[h"�n9"\tEق�.�- ��0�	�#n��y�YL�<
>
x����j=���ir��$�5w«�����
�/�U�
��r�c3���\���嬃h�D1w!���av%8���?)�b|������J��ؠ�s���~S�6�$�
o��=��O�Q��3M�����������Ad��pm�:���f�2�ɷ@H�
�q$�K��ˡ�S�
�YeL�T���~S�z���7I}��t	��_(Â�h#�t���!����	��Nu�M5e��x�uH�،x�1b��Cp
	�= Ȣ�{�v)�K�i�5�)�Zޤw=��@0A}����N�7�PF�,
���`Ȅݾr��<`&��O�l��X+m$9�C���iF�g�#Zd���= ̠�W� ��5���o��*o�Q+�����~(�F{.���0F�0L�
��w$�
sD��%
lg�gEw�:�v/@��2
ڿ�.���b�����ϰ��=��l.R��-�:�{R�U��p#V�$BB��	Y$9Y�$�0B�aod�����(PW+^!,E�^������y�>���9/��y��w��}�q�z
P�!��q��O���(
�CT�=��gd
���W	o#�oŸ_F� M"�#Q/I�ѯȷP�(7b��5. ��
0w~��B~`9P�XT?�9�; �
 <�q����
+��'j��p1�Ƙ0o�E�ר*���F�
��<��� ~�L!f(#Q�Q�P/i�1s�k�9���9�= 
n�mq����b��5�
_
4!ۀ��?P���(�}�c�y�J
MKB�$��g�s�f����2�dL
e
�N�E��F������c~c�Dϲ�1���
vK�} 76���'P�^4����c�A�-�B��ǔ�}�7bj�
�6Ö#����qr&�)�D
�Q
a���c����n� �.{ =����p��3�V�snC�sn
�>@X��\���V���?,� ���!tǻ4���̡Y%�Դ�jH�#
u�z:~��C�C��o��X}�:No\{�5�M�U�����?ͯ�O�+���r�3��n��w���f�B`��
����9����H�Y}L��p���u��D�
(0�9Z�MF�5��M.�t+y�&A
���	?,�'L�����2򤨈2%�����
`�u�M
����%�;��������sy�~���QC|�
��
%�'�bzjb7���2����zj���R�XM�I\I�-)'�K��b
mB\@�ḨO�H�8�W����w~r���C��s��k��
3�s�63��Q6���4r��6�[!¶K�&��~�������˙��F����"�D�]�?�L
�4�9.5��%Y�	�=7p��H��`�1��],��
Y1W|r�T��MO��w��eC�/0m�|L�"�H��
+Q��o\J��h�K�ٍ�
�U��}_����6HϵIӹ�{ n�����
� 
�O�
�O�?|�{��e/ʏ��U�{P
��u�''�L��٠K�T���2��^�fq� Ohg�K�
^�\��R����Q��?&�
+lLj��wx�Ѭw����݂�{��"��YMв֞\;T
�w�}�˄
nʦD֤�c�tB�5YN7)S�92� C�'N�E�E��C�,P�GI����1YR�
�P��J�[�r������Y��¹�}�'}�K��5U�v�� �Y��/�Ηg1c��|�I'�S�
CR���(N�Yd*�R!�Z�2�_ɞ*!hTAc2����p�x�3H]��}=@�����]�_��Y0���^���}�gwt�#
cOU�	E�ttAV����J�N��S��r�Y&U�+U�J��J�����E�1�Ha���U�@�5����i������
�kwxN���|ҹ�k�5��zC���������'K����Ԙ�<^�-�j3��$��/K5�u&��-Qp5
J�暒�
Qr4�rn�,Am�����@7d���K[�>Tluٰ�}�s��ë�
o�txՕ�`ߦ��*�P'�����B2�p��5	(�\��<af�(��+e��t}����VR
��Q9#uL��� { 
>�R'�
�G�&�w5\gZ׻�^��<|}���W�w��V�
Pr9꘩{.���+a�%��R��!(Pq9���<���c��952|N�<>�g�83mR�a�.���	$�r��t���
>�SWV:�rk���>��W�X��}rKEG�
K
2�؀9�ZG@$U�b�\��TDc+شB-�h��.Y�K�}�6(E[�%XӸ$.wBl���y;�
+�OU+��ڼ
G��
��r꽳ݳ��Қ�7����y(�

�n���)(A=Ǯ��52:�Z��Vf$�+̂�J��]���#���EO�P�)�=@��/q֯
��/qx���po�ӡ��r�Ο}=��K��+��3�F��NȺ��	:�VMi���	ӒLC5���vDS7����< ��]~�QmP.rF/P���m��`��C߽yݏ�:6��Ž�ў%��GVg
�� �
uDЏ
f��B)7��^^L�u)6�Z2>����u�䝆�c	Ъh](VED$
+�*���d��/�FI�
+�
��Œb��#ngT
-.uGܷ��0�n�
+�B��� �39��+r��?����%�R�C]9�˻R���z��U.y�;�w�;�l�`�W��q��y��-g��?c�S�_�
i���y����=*�|�	BKZ��JO6>�b��)MS�X�T*�4V��Uj^cu:��Zvc���tW�n��`>�ӳ~�˴[��9N;W/9��'��%j:f8�����#�m�ϲ�L�����viTv�:^ۖ��֚ǔ�.�[W���d�1�u���V#e�����ߴj�����%?
P�b�v$�k
���4����mv!�&��2yҶ��]7tG�۝8������
��/�t)�]�8IWN���0�׵���^�bvWrR��s�L�y��c��?��=����*��˷��	��/����m��
���$������K�Q���	���T��L��
�e��P�`F80+�c�_ĴŦXJ�U$&
U%�
�J�>�=r25j�"#�C##��K�n�D]�=q�=��ɑ���gD�Gw��>ѝW!p|!�ݲ7=�^Jp|��R��q�^��>(9!�Q����(
����H����a�Y��1!��;����BG.��;Q�ȞX?2�n
����)~c3:Q��/�H�& Ã
r"�d(|���!�/1��B������?���T��`���G�MG�	b�
��� ֶ�j��+��}<
�Aw�#`�
'p3���nI`�ǃ�Ѵ(ȦG@=#
:�d�
�R� ����y��=[���9��}�Ʀ����߷��� V��|���a��S
��t� �D�}
���Hp
G��P�'����'�C>i>ԓ}��<9S|P�6%_z����=P5uv�1�� ġ�P/r�.�
�ܙ�I�H�@Z^(�%Q�|
��D�J�/�&8�X`�a����:�$�I���!����a�
��x��a��;�{K����!�Ȉr�a��93aӡ�@�
+eq��q�u1�S��� y�n-��\�H�n��l��f����裆X�T?g�o"����a��H��i�9C�
+c�rY3a�aH
@FVҖEC�m<$�� �1�n&x� k��&�i�}�V3�
��#�~� {P�i��
	کaa5,
�>.�A�
C�+�Ĺ!��<��2 ��0�DC�:
���oe at X�u�
�Q
�S|p�S�\��(��n���D�{�;rP�o��,�'�!��6 at f� �A�
c�8�L�ש
(�� _��6
��h��L�j]
+䛙��āh���'��#�N�wY<L�[ȧ�򍤏염�̒v����"k[�6��A>���3��a��)X�<��
,��a�&Fc42��Q��)mkD��
��,�B��g��_� �ܒ��Z��T����O�.
P�&6+%��_e�- �� �/
_'�E���}�4
�p��R4��B�o��`,L�\�j�V���[x����
�~�IvX�%=!+9�x-���7+_�_)[��T-��=�YsSn�\V��/*G�5�f.
9s�Pl�8���P���Y^X#��*E�P�.r`i^|onI�)k-筮����E
��җ���vE���l�S�e�c�M�셦Y֓~G�>��A�^W�֯;�

����8"߇�UcP
���wG���s-�}�5�bc����)���pڳ�S�2�$�kw�[4�UՇ5������w��t��O�7T]�K���zu�ᔦ�p<��p,ctPY3dz;���/J�?G��	��ʔC��9}��~�kUa������O�^�i�[+h2VJ���n�57��^K�YEs�pI}%낺)�����3�=��=ƣ�
c��'���ݨ�6��^�(������aS�+6�L�X�4�}���7�o�FyP�:}�o�K��Vq�.[#���B~5wsڥ�
�
{��������S���]_QM�i ��P
��XP��2*:��
+�� қR	�ɗ� ��Ih� �%t!�Q"ʂh��x�w�#I�Y
�
f��o�:^�������O������ERS�"��H���N��
+8����LA�Ȳ5���,�2��_*\7���{�|�Ž�%a?<ˏ=���?� 
�
JI
���EޢĨȥ�
�ۅo�w�:����f�0E���4�(��7�*����H��w #��jc�
\	��[����Y��X-Tyl����f�"�n�(��<��=
ŷ?�
|#�jd7+'�T��J��5�k���r
��ZC�K�&<�K�:Z%IO����7�8�+�6�9��(8�.?b�\����̺�:�M/꼷�,
�Ք]r`\�sH��3A]i�ȶ+��&vAB�,IF�"I�rj%��^N��(�P)�5TL�х4=M@[�~
�̦#�����3�+�}�
�Xlp\�J�~Z���#����ʈ꒸s�B<�+�
Ԛ�)��
S��M�J)�W�Ť2f=��P� z��g�d�1�P.SG�a�i�!p2���
o;�:��ڭX�?f�k:a1�vz͓f7��~�V�
�+�9�,���PsX2^Z�$=+A��S+ȅ)����V(��b��#,^�
&/Y��L�A��z���X�
�H�f}g�!��������mG͞w���hs�:����6��^I�K�(�[^L
+�0"�1eY�af>?����VM��63�rz�\�?Y
�
B��r����s9z�!p2;i�
k#�|��r���[�a�[�!�g=�,Ʈ�l�ׂ�w�1�XW�e�f	ƫVD����)���tL^Nn?���Γ�8�rFJF7��q���x��g�3�Pr���|UO3& �S�5��`��їƽ���}�/�0~��_5�t�<�᳷�9�h[C䙆�xO�$�_TN
���r��0<AvRZ��t%OLc�4 at Pv'���fQr
��9Z-K
��::���
�I�=�mB���(�j;j�y��k�N��m�x���g��Sz��l8�h�8]��Q.��	�ȡ�b���rN<���K..$2�ʩTA
�T����3��Z�@���4R�a09�
+\��!ۊz�n�zyc�Y�
�������ɪ����V���u�a�������
y���Lɭ�˖d$�+���22^$�%�� LY/C��'��i�"=+4
������6�?��^�
�r��߳F
ݵ[٧>��󖻍\�g'�9Y��ߎA�Z�
-�՘
M��O����d%LM59���U}�v��!�5J�@��X�Ė�1f�G�y�P�d
�в<S��V��#����AӞ!�u̓n�e��������K���8/NW�E�5J��Ih��$�dc⚋�QMR|����P�B�F/���EbD-Bf�Y���k�'�j0u�
�����a3pG��4�L�
��~�źr�g�`0�h�:‰{;�<��C�I�ǫ!	�9�1=��K�¸�nIB�R����t�G�a�������Z
�3� Xd	f+���`�%P���ɵ�cr�q��QK����E�=����s`
G��
%�'�#�`�B�S�"���BՂ� �����<�o�7�W=���F�����1���ap���6�m�`De
+�M@Ϙh�Z
�i$�:d^��ic��
i���&C�)Q'q㘳�?ܢ~��"Ʈ�C4<� � �O#��(B|4���c#�^c�!^߆y���9�
a�����v��۷��r�4O��ڹ�@<gc\4{�<{�q=���5�W�=��b�_������<Cp
���
���0�;aZ��{{M+|<gz�
χ���E�O/�ݦ���:�lЌ M���5J�1P<4UÓH�U��ބ�=j��u�iݬ	Z�]����Q��v��1����)~�lG�|�i����
Z������9]����~
���Y���y���!� �;Q@ه�a# �4Es�@޻���w�M���[R�;nHz�%���K.���/�C��߇;���dヤz�u����ę����?�O9~R:��<�t�˄��g-�A�m t� @�A��)��c
�,[1����<�*�O��Q�u�
+��cK�_���ࠝ>p�.O8���0v�9���f
<
smO��v�c���b��8��fZ�p��(%-�$T�,��,5��K3�4��HDuQ�P"Kٗd�ZN<�9����\��v�updi��}��{����>�����������Q����

����`��>�7�ZN�HM���$R�C��Æ��Gda�����+2Z���B�'p��Ăp2
�S������Hr]������
+�j� ��
��yh��C�
_���K^�h���yb�5b�=����l���#
p�Q��,�
[��8X��G*�c�����E�_ �O��D�N�C��VN�š)�����i��8�
G���U;ۈ�����&��_�HfPHZ�!I��!q
�"��E���mB�"�~>"��p�g�#�!
��(Oh
g�����3a��N�Q�4��N�B�8k�C{�-�!v�,t���5�J�
d	
���@T ~�|p7���c1�?�#�H�KAo��*�V�����"t�@�'
�@�
P{��}dY�7�`
+b�� 
u�:�	Z�34b(�
���@�, �����i!�����֡%`��D�(0~���N��
�}����
��G6�9��?CL � [(B
�[�=�	q.Ш=�4�B�qq������%�
��x�g�`]��y��=�;�{���5���x��5,k  2�)���Bl��p'���0�\�Wx at c�2;�U
 ._
QM;#�����tp[�\��6s������������cc~�����p�����G���� {�Ü�ʘ�T�
�e
0�}���� �5a�lZ���(���~��'���gY�b.�cn��y�8=�לO�O�1��1�v
+�{*D̿D�[�!އ��-L�쑾h
�h�ś����H�� 1%:K谺8|H�!rP��6 ����c��
a�=��,���(������^���%��~�w
�Bx/�[b��E�܋=!��9��a�� 
gr�ܑ��
N6��C����=ڵQ�TU�nE
�/�
�����?%'b������W/�w���s�ᓸ����ے�R��ȬC
�A�I�Ƀ�L;�8b��Xɜ��!�|n�>�sZz�s~��Ē�7	ѯ4[؝����>�s�Q�SY���r���_�
�?ߓ�ߑ�ǷK��W��ҋ�a�y�u�!C�NF
+�;��ڢ0x��ǡ��<T��[(�����{��
�*#7���U��Mk�O
U�G�:��n�=uS�]�	�-�y�M�5Y�������GqI9�8�R6k��'4C
+k %������D�+t@��1����r�w�ƺw�V�t���
{���z?��u7iC̯��?
���	��W���m�ӊK�˪
�[�V�곚��f��nPs8aPݤ�r�
L�d�����S�o�
��_+���Xɜ��z�kg�l���A
+R�����ڳV������R6�^J��wc��\�~��qusB��d�
��'�#���C�ݾ��^�n����f� ��{���&c���𦐑=��N��_l�N{Z!�Fx��
v� ��f)`_�)��\ג�Yz*e��y����E�xŰ�x��h�2�1�v&�����	u��A3���l���Q�f�Jo�`M����E�o�"�=�ƚ��*���zU��5�ŗ�ҩ�+,�e�'s��G�*e3����5hS$�N>�ؐ|Ѹ#��i{�KcmJ�qkjobMZ��:�Oo
t��g�w%�;�y���}����w,p��>��z��ݭB��������/M�6小�\!8��D�߲^�7�ZՐU�����P�q̸%�5�:�=iszGRU�g���
cefobEf���
+b�,g�":�z������_Jמ �獡#�N����v�F:�u�n��rsԱ�LvSQ���p�xW�Zy}�&�6K��&w��*簩2��yC�����g�u9�I�r������r{�A"�r��YLtފ#�os����e�r��Ɂ`��{�&^�ɛu�6��L�f��JSdSy:�qM
���P\��T�ee���`KBE~Cb����2�is��jr��q��ؤϷ&�, ��%!T��� ; (]@���{�:!P�R�B(
R'�DD H�*" �
�������qw��Pag
��ȇ���9�9��ߒ�s���9I$�(��B��VK�	�S%>�� ~��"^��=�7��y�^a��s���`��&�E������T�S�Y����A������ʨcG�q�'y�3좂s�‚�n�Ô�/
.w��-XO�l�D�de1�%�P�D _����*�s�:�bhqИv��N~V�q�t��`�~��x�v>ǵ�6Ç_�TSq4������Һ�"މDn���W4��9z)�p�}��8�E���Gדr�l�D����@`�V�FExߡ³J�dT��=bH�2`#7��>"���
a��k{����?~л�>;���0����y��&6��)!��3)�l09�l:�`�
�9�e�����̒
�(�F�P��y�yX햅�#��`\���/�X˜pQ�������<
c���r�9��U�t(��PZ�=/2��*�PmC|zu;+��lrJ�'��&I�̩Zg�Tn$�Vl�D�t�_$
X'
ڤ�E���m�ۓJper7uj�Rzd�Y�g�g穾P��3Qֵ]���S<xm�~��y��-EYMQ�q��m�I���D�$;��D�����X��b��?Q̒%�T��x�)	+��pwBnL+��e|j���	�m
缴Z����"-+����d7� �'�3'0��д��Hv[}t��ָ�֞����,f�u��Df�Ĩ��bE�
i��-�k

�����#tX����99����d*%�a(�Nyh�'���E��Fcm�Cl��
g���q��zK����FFw�DEvwdž
���W�B��*x��!6�]4�n��5��������
�f�p�4
_�$z����l�ϻ�W���L��p���O���S]8�Y�����ђ@�HuH�HsxȰ`��9f����H��5���'f`�hȓ��x�E��!q�����<��7Aϭ�D�MZ㲵L���J�u_-����
L������R�.e:���G���f��������|�GC|�B�g��x_\
���5�-L�O�b��V/��Q`b���kTܣC�%hx��Z�������w�4�	�9p;Ґ}+�4�&�2j9�6b)��T�
�X��������8�������}q����G_�k�'�+>��N��A&&���t.�C�#I�.�^h�������z�-�;XO#v�>��c>N6�n��k�Rl�r��k���}����x�����g.+�98=�����7Q
�;��
pa``��4ݣA��RP.�F
}�C�ycJO��$
]ㅾjQ�P�pa�v����:M���aC/�a����o�,l���f���ʹ%�?wHo,�

�ן�DY \
�$��o����4(^���U5"kU���fJg��l�YsV�X�V^
R
x�_��m����d-��;]���:���f��ֳ{�l`�^`h�>jd�~��r��gc��"��
�t^hX�x@@��!��

���`��C��Ә��J*䣃t�'w9�O~[=>�*�~fns�������K�����;���jZ|����[���
�=8��t��
#�42B�/��kd�
@�s��u:pP�Q��D-J�S�ь�6t7t�䌞[
�_�Ce�!S�
+��"g�f(�`���*`��
�Tݍ=���.�n��e��4.��� �O�H�"Q(��D����'�P\Ј���hC�FG	
t���}Ja��FK�!k�.<�y'�l��b�a��&6�j`鬜:���<G����W ��
�
+������3���)f����hH1E3�ZQ��N|:�렻�6�о�@�&���1FB
�$T0����tE,�+`���H�c�H�dHA'S*z�|,h�gK� wi
RD�XU�Nہ
y��Z��N�z�x� ]F��7F�Q�����L�v�t�
m^�~1G�
�gs�E�o�/vh���.:P�ń�^$?s�c��4*b`�*��h�w�6z�v�k�>:7��ict�5A��=Ș0EƬ�_l�WX�i�?M�1�2�q�����J$��ވ�:&$���*eQyP�E
Y+:긺�
�(��#��
�~�������|��
�G �E������	3N:8ͺ��;8Oz ����@�5 ��!8����&�c�G��́�� ��
+|5;�Gk
�:{�nq ����#x�9��g��
��8����f�Ӹ/
�<���.o��u��[@�1 ?�s�!p�@�3��	�if �o^�9��-��j
�y;�Rf�5@nr�v' �tR/���2�}�e����_^��S��\?zq��fLxÞ7$���� >h��p�
A���N�AF\2��r6�h�jі�I���,[����t���;�RZq3~�.Ӿg\��^�3E
�&���$��ߑ����N�_���%�|��
+�, ����
@`i RkCٽ��V at 8y5�l� �9H�:��f����f�
+(w�Ĭ�Mқ\?����'���?���z��
u��:L�w�~v��{
S��?x�J�;�oe;���5C�B��"��/�oS����l�Kl�Yk3)N��d;����9����u�����t�3{ܟ1�N|ʸI�/���W
���
��I���s�	>@�e@��>�A��ngkJ����X��O]�%��i2B�ӟ��֯e�Ǥ鎣����2��Մ!n�	���1���!���k�t����k��k��:K�7�J?(}\��[ 0���G}Eb�=l
A�d<�L0�R�׼?��8
/��":��<�n($��_A�{

w��^��f�-�q�
^��5^?e�{�z�;B���������# Z�h]
 ��>HQ�@[�!�Mڮ���{��W{�z��n4��yX)��(6��~��;aj���<ⵠ���*�+�����6�E�I���>�9�?��nj3�qf��
�K�10�$H 0�<�_��^
ꝉh�4
]����\ܒ�\w��,_�!5{�o��mw�r�q�qQ�{/�3=.�iH}!徽�jϾ&�)i�d`O���ˬ����c�6�'v��M��U��� �E]s�z=H٤�[���
�<��E!~鰆d�[6�A���Zr���܅�ngc�<{�r}��Ŕa���:�߂�X��nN���Iv�� {ƫ
��=��V� �*8�����P~��
$�=�Q�4��Xh�����p��y�b�Uw
+h�e�-/�����#�{(ܺɞ�q���
�5��~4�&�A~�]�ɭ	;˯
+�&�
h�'�����e�y^�|�[�-��ӃH�7�P��\���lқ(ݢ���J���]�w����r>ע/Kj{F
�ܕ��XR�gk��ܴ?�ZWL���dUE7p�Q���=’�_Dő�E�Qo��Q3�C�:~A��W=�
���1��%�ޙ���h�F�I�i�V���
V��\-�[���SO�xgWV�S{z���T�g�*�|$1�Z�p�qXq�U_�-�khbO��c/�sc�s�^�r⦅��s��x
!��!n꽫Q�Z�M�}���y
6T�v�n���j���
+��Ҁ�'
�;���
��#���=��T>)��2U>�(���I���*�ي.Q��$]qW�V���S�4��)u߀`�_�vP��@c�MjM�給����`����:���IkOk[��
+lZ
+��ϗ�Ή#j3I%�i�Ci���bVvr/]�$8��)NI</Q%JTIc��H�4+T%�	�� �C�J
2����D�	6Ҹ{в��lep���������i�mZ�uC�ԡ�(�U��!��%�49����,zfF!+M]�MNk$
�'���(Ro"����"��Y�2uN���$~�A�	��t6td)��yv��
h�fp��y��FO�c����Vs��THvU�����D�k
+�9�d���
Zj�& )�07!�N��.���Dg\�Dg� ����YaL�� v��G
�c�Zc�q��^��f�)v��B���qɉ���&ʏuu�m�5"��*N��p�.��J/M�M)V�'�1�RNl�~T~�P�wF
�7�
#�E�y�ByΜ �
b���˱�CK�߫a��������+��'���t0n?F0ml�?�u��p��JPaTd�@B �BB"$@Xª(.��
+�U�Q��
P�Ƞ(
+n �
P�
��#������Z�*�K�M�yO�Nz�;�������պT��xl�6yo���q�Bi~�W�5�+�y;���)-4,�^
�h[E|fI�)��xҜ���9�?��[bؔQ4���u,̱,���%4xPɄ۵L�Rτ��6p������{��z�S�{��aam�_�����{��s����w��fUn�\�茝�����S���/������Tޓ��ݧ������ұ0��6��Q
���Aޞ
8�H��&+hhq�
h2�N��8�r(j�r+l���ק�V���P�t��
�����5s�m�L��a0UW�&�m0��=g�{��6�
�v�1n�X��	϶ܫ��{@���4h:A��V
l�{�x����(&nj�M]���d����s}�
[$^ؘ-�װ24�h�*�~�6��Lg��s��P�f��u�G�
Q�
Q�Р?8�P��m ��(p��I���
�.O���
��v?֦K2����+�GO�i3q���㵠u���3�SO�1����7��i.U���#�굺��ڈ�mDS�V{�?B{u��� 
� Wj N�4�$�6
+T^e@�	PtˍRxˇ���zō����΋�%L��C7�j� ��R��˹~���
훂#۷Ku�U2M{�\���~�x%W]�W(/`��<*�����U �� �Ԟ��D���L(�?

+
8��|Z� ֲ�a�
�Ϟ�q��ڙ2��9�
בō�XΏ���K�Q(�vl�
����
�h
Tt�
Pt�
+��$�3,��cܮ 8_
p�(��&�'�ϒ�4��ik~
y�)�m�P���̲qif�m�9zb���c��7/r��$�Mk^�V�7x(��\���'7�˞��g�r�?��s������a���#�_j�p�����F�W6ܥª�����^9S��Rӻ|�.	+�Keex
i��h�:e���<U�GEw���{�Ti�fא�27qO��7��|s�
����ۿ��
�����F�]gH�2��� ���YϘ����?�P�z9Ը^��'f��
ei�5�T�z+�@��| �V:0�.dp�_��&
�O����a��)>C5��Cǝ��/:	�;��/��1��
�n&�K�
`ŏ �� �X�4jFt��M�@-
��
+
a�P����B�zV �Y�a��L��Yㅘk��|kO�b����
X3�
�ٱ��~�&��6r6� ȻO�O ��G��6��ɠDW�
9�����i"�ӽQE����h��Ɯ�
,�0�b*�e9�,'�a�ՖS�����3c��3����{���D�Q�4H�0�)ځ�P�qE�
!
+�<Q=0�����i����`�
4L�O�t�=.��a.��ʰ�"��a��D��CE�����4T��Q�DU8
�c�P�f����([��
.R��n(���A������S�x���X�9���xG
r09���������A�C��ڗ�Z1�Jj
֨I�Gբ����8�hJ����*���\��'8(>M\���'��o<G����Q�`���G�����B�'t>t�
b`������8�d��LT������;Y�R6�*�q�~�u���F.J�=Qr����Nި�����?(���KGy�R������$��%�zQQţ��GC���1�
���0Vg�����်��Q�f��@e�;���b/Cxb�Qި�$D�*�,�,��
�
��]��彂w��9z��Ч[����0�OE-��z
c�
	�
L�Z`��
+�c�16���\0j��
+�#ڭ�aM��zo0|?@uDЧj�*[�>*/x}P��~�|�ݣ|�ݥ���B�Y��0��<
}����c%�	�\*�fS1��wM\���H
��t�����dr��t��q��ƽ7j�Cd	�n��]�
�7�{�G}^kN�ti�D/5�D/4D�j=�|���f���~Rc�5���u�ԙ�q�ID�Q��⊈ȾCHrsH ��� ���}��;�
+
+#x�Z�ʴ�i��Z�Աu��Z�>s�x�9�|���|�����񐊵n�.<��o �{�
�`��Z�$�����kT���"��:-�~*?�"Xu�9���"Z�{J��S��ķ���䱓�3_��:�'/:.�_;}N��<G���0�d�6�,I{�0t'
FY�!�"	�G2v�w���
oi��v�`�w/F�FJ?	W�<
�
�*���^���
Z�����
t�y
��2�~�z
}�z���m��1�B�k(�B�Q�r�b�m�c1I�
�ؿ��]����7<_ӗ��M�N���m"s�7���bDG�r�~��~.B�x+���lX�ˍ�.���A��!c��!�z]
��k<��H�;��!�g(�\�
�-i�8Hǚ3a֝;��ڇ�Sx����K���3a�#^��=.c�
vҁ9��l��n��p�
]rj�^�:q���jd��hD����a���I�K���ß�����O���+���q0�=�V
<�m!ڍ{�} �Jfk�(s^�(��B���g�V���ӜT�I���8+�q4^�r9V�~)���B���|T�_}0��~5���MB�	���3�%�BS$�a`�
+�il�8����;2- ̶Ľ�����8��r՗ro��و�
Q��?�z<�cs�˷�H��y��	*�
�λ+�ί=�5���Ghb\!�cfH
1Hu���jc'��BbU

�����`�9���K���
|��^����=(�5�/�X�O9qˤ4t�(�zX�h3�K��K��N���s��-l�Ϲ�j��9B
��XͼD���B��
��e�F.cA�&�+���8��z���`x���(� �Ֆ`AmcpS�fr]I�|U
l9$��3��d����g8��$n��<�z�ʷ&�<����c��4�A�4q��J�G���Ѣ�wHQ$r YɁ��`4vּ��;r���B3���
�,�m�����xB�鲒�ɀ<r_�,�h[�D���� ���s�*y��ڴ� ujm���J.L�$����[Լ�g�<�/��

y%��5/kN�z�1o
�Q�<ԙ��Jsp�� ~J�fT�񂊲�W��=�q�\N�]]v�c�X�J=5�|_U�:��l1�ׄ��{ќ��4m����
M�{�JxQ$<�`�K�8l��u JL�Ok�C�1�Wa�k6��k�x���!��Y����C��I}�N�:^��⨕�]J��<���| [...]
+^S3R2Y	db`����<)2��k��jcp�~#��߇��7����]N�֢	�]_B?TUo�-�8�(x.�r��"'�'GZ�-�EY
�@܉��C4�h��.��35]��.��"K�l�
�:�|�2
��\�0�7��=��F;��:��m���
+ڮ�ȃZu����(�9O��!͗�d�)2�eA��:r��
��.R��S4��>�5Y�M�AJ�"KA�	��5��
��*#p��L6�#-�pͶ��z7Ӧ� ���JWn]R
c��&����S٥�"��;�H��+,%p
jH��VJ�b e)�Q��a^b�(,D� y)��|�Z
)q�n��3כ
�X�)��a	z�mV�����o��R�G,K���)k��ȫ�vٕɎ��|��3�LV&�V�%��XU?���@�Uw��(1ſ!1Ő�(Z��e �W0Wi �
�x��6}=�A{�a��.'���M�6�eKȞ�&�!�>�6�!�$�.ݙ[+tO���fU��U�FW�#���ȑ�W���y���{R��"������wy �� p��ьÝ ����s�8��>�Z�ﵡ�7�"��f��i-hg
MoK�KiIuHl��7I�z�7�Q�����Ci
+n�

+�
\�+�k�{'�B >� �
��p��6�?�7���{qe�v��C�d]@?�ߓv>� ��e�Лb��w��8Gv廝��xw�{S;�|)
W���[�E?r�/~�V迒g9�j fjk`�����s����@=a�SN
3�w1_�3�"ܑН���]�QM^i
����@A����H ,!!		�	 a�Ȣ���
���Ѷ�N����jkkGfܵ"�hE
.���q����j�����3��/s������{�{�����sfW/�=�4�rl�4��:���&e����U�ԉU'b����r(�P�V_���}�P#>�N����W���8�,���9�u�
��>��K��~i]�ԅ�܋/����a坟Ýy�D�U�D�^�R�j�<�h��h�.�����2��A��>���
��NOD���{Z�\����
�����oO#��"�V7�Њw���X�N)iQ���OͿjr˹j�ʺZ��\�25/�$7��'6}&�o� �7}״G�m:
�i��=i�c���� l���:�;�wP^�����Ս��
Ϳ㌊�|Q�MD���
[�}���f�pN��ۊ<�zǷ�1tmk|cm_�bl��Զݜ��Ǹ����v�������
?�6�OvwP�;�����;��y��e���
*�pA�
Ld��R�ԩ�3vΰO�Ju���v�u�O��*v�t/v��^��^�ٳ�K޳�[�s�.�=͐�^cHz���a��k�=U�
�>���Ghùw�K[�w�@9�(�+J�c�Ծ "�_L��+)qZ;�@U=h��̦E�;ȇ�
#�J�$���p
��K���i��
+נ�Z���V7�n7�ˁ����p;���8��]~QB����i�8�
c>H7�'��""zBJ*'T����"}k��C�]dR�!�E�BXd/��4��8p�ܑ�~p֑
͎,x��
�x�5�q�u�oC(�'u"4c������
)��d  $L�������.9
t�?$�\0Q� �‚�̷�C��|n�	��
��
Pݠ�}�f�>������g�#�Ѕ�f !8w
+
+W�(� |�!����g�� 5�q���
̤+�$�a.9�N�	��)��B�r�=�H$$(�H��-�@����TP�i��w�g��p�Zw�l���!�_t��1 �����b
�v{���
c��b���h01�d��U!$Ą��	��Va�8*Ĥ�@=�	�>re�(>� �/�}K��

�����_����2AR�]�
`O��!�t��Z
+�WR`�H��R~��
�E$�b�P
+�ev0CK��q'��@�7���'���
�-
����r\�>&��@~
�a����
��أ�
�+� {X>�
��߀
8�r��ɀ7(q�VH�
 �pIj*$&���9f̙���!v�h���7��z+�bMD�b�G
d��*�FU'9oT��ת+��-Π��ӧ��<�����S���@������?��IH䓐��0�)����IO��0�M���_�=�_�3�[�|
��5��略�3���
�
�h���5gx/4�x�57x�k��}����10�=�c ���֟�.)~�
H���En�Z{�4:�M�L5y�$�҇�V��'�c�0l�{���nj
���]�^�A�n}��SwQ�DMЮ$�M�|�
���[:��A�8n����@��,Ҙ���HB>�#/�~|��qĒ�2�U��<}���̷;u
�3�+��ޣ���&��O�p/�Bh3���Px��t�p_t=ᙨ��*�р�K_�걺I��&�� ����(�NBQ(e�(�:\�� Ź77ǽ#g
�={	�U
[�Z�m��7S��H�!�zʿE-�����!�ƚ�+����ƛ��
�9��j�i�&"N} }	��{o�7s�Y��
���Rʳ�j����)�s�\�ΞM�o�BVkN�ŲZД���!c��R�֐��
a̻��̇$V�q�SmD����cY�i@~�<��4��V��J' �s<�0,b�K��%!dW����"����f��Ź��b��R~]�ʀs�>
���*���S��INf패��';�Q��̨�<�Ѡ<�qOy0�j�jo&��`��@9�=	����y�>�s,�A�e
Խ"�x�BB�Z�uh)M�ְ�B�XRȶ�[ȯ)\.<9���q]�QM�i��$�((H�*��"��@V,���f�5@	!�LK��@�����(������h5x�9���2��
�
��NGǶs���ȇ߹�~z�}�� [...]
�(� �r���9�#�'v�<�lY
es�$�a�����L�	N��X��k�]�;�]ЛYܕ�ڑ����ХM���ɍi�)�
J�r=
!է#��w"6C�l��R��7%xxQ���
+<<�r��U
���`�E)�z���Li��
�,�a>�c�����)��̓��*�u9�6������Ϝ �e^�*3W���uZM�?��Y�P��2��r}��m���ob
�Zfk�V�Pa�~�RM��|%Qz|Ǹ$~��(ŵO���%�
n���
+%ZnU��SOP�����j�8��=G�`ߡ��_ҥ��h�ܟ)�<���f�A�%���z�)�U��#�%ܫ��e�f���eE䶉���ò3���.��
��Ҽ�MB��Z P�+���ڰ�¦9��$�P%�+�2�-���%���&��Dq�� ��l��Z��`ߗ��+�	k��s�9l��3��k2�"Z�*?�﯊���"yo��u at +a{6�
}jKK��K���bA*h��u�E�!j	����iTo5���
����&�#YP�>�e�~L`C�&���ZSXQ��r�5\k���޸qM���>ʮ���SkM�
me�����CJ)׻���_V&	*W�"5QX�N��<�
�@��>B��s�oh\!B-"y3$���0�T`��½z��5�:<̶�ɖø��P��F�m[É�ZU�G�J�>EM��ʪ|o���HY�8�T*�Wy�-$����W6Ec�-�s�
F����F�*��"o�d�� �R�J,48X��`��f:�`�� ��-ؼ��b��t [...]
+BV�����&�*�)L�U*Cq��P|Ce���¬Aȿ!m�p �� ���Lp�~W��y�
�z{���ô
1���){��˻O9�w&�)�H�WԖu���㕧��4K3��!i��0��3"Y3JJTϑ��+�
r|�������ȭ^������:�Ou W��)��
���{�h
s�hF}p���|�f+<�X�?����p��e
`��
���{���~����䎆���v™���+�m�3bl뿈�-��b��}F��qջ,v \D�G� ����<e
��ݠ���VL��MR��1��N;�';g��\�G�R�
�*�J
��=;��շ���
�
zl�Nh��������
Ӌ�����
>i����� ��Z@՜#H��1�� �\�%w�c���홗��.�:3.f�$�p����㦥�NN�z
�j���
���5y˟>��?}�?��O�q$�6�nfDgpG
p
=�I=��@+��B;��D7�x�xK>ؼ�0��4+��6�g�������|�`��r��Ł��fڵ�C�k3��eO��=IW_zFο���C�#f�w�
��v��~��Q��i���r�
+o�s�+� k� ���c��L�V�-������&۞�˲?f`;Dx;�
e���jg�A�'�з�h�v	7|�f��k�g/]	���z
ٿկ{x�`���) �,@�
��[ �ߙ@�C
8��
����`���6���4���f1ƳG��m4c�5�ȵ�4��W+���jv���8�N�
Z]����� �����_;<Bvm5ߍ� ��=� Z4�����h�=��/p�f'�Zñ�N��G��1�gD,�Y���I�����f��l���|ˠ�r���Z���6k�?���:�j�J8��I��%��@Xe
		�A�
+Avd����q�ڣc��R��BQ,r� �V+�]Zƥ֭�+���&�g.g�A8��;�~������p+Y�'�,Y�U�GG���;��}�-m�h��Cc3X
��$�r�+ϓ~
�� ��CA��!��^	`Z�
�;e0���RuM��]Z��;�.�N�{��`x��֓�������l1����V3]ޞf:�me:�{�t��c:�����?p`#����q`�= m@`�

������@1(��Ȇ��dXM�?Sn�i�#q4�Tڤ?����̣�~\C����~ǰ�C
Kld���x:N�q�M� ���} �0�)�� 
��dh�:���=`*�
�)[
�BYbe���(��̰���B��f�i&x�h".�S� ���ߢ��M�>{
�z��
�
�LpA8"�4`��`��`�"��p��P,
�RFC`
+��l�¥�zb'���&j�A�'�^R
+��4Tx�P�������Q
�H�G�</c�h��m6F��&�Vj��r�
+��l�&���
��e�
+��#n�

#D����
+e��S��NC��CC�@:*"�=S���,��k�P��%;LQR�B��lt�$j������s
_%nsF�
��
ΐ��ـ�޻�9��sG^�x<���RH�?1YL�)ބ������/A}u����W���W�赍��El��k��
�UGɷԛ��Θ�]2�����k�/�6�9h���72��!�K����XߙB51UHC�'�O���c�qJ:���2ST�e�o��G���?}��?(�s���!E
oPq�7�h�W4����^�#^��5�π�
Z>W��So<U�u��x��O�P�@aY���%3�����H}�$31p����Ŭ��fS6p�O����/��/���X�QU�U��]�S�N�9�+U
���!�ÿ��X�oզB�~h����w���S8e�oK��F�u���hrQ

��0=�9��2~���	Z��Ҭ�vN+�
�a�|j1���2�u���a���:�v�YA�������]�+����v�գ�8�� tl�8ַ$}"֎�x
+�l���g齍�bvE��
�f?����$t5�=�+~[�V�?>�-�Tj}'��润�����
M��u�y�V�M���g���
/hF��5��D�Ӡ�DdEa0��$ L!g�*�S�i=�j���0���D�G3t��9�G.�ߌ���z�F������Zd-t��m��%m�Ӆ�Z��!?9�
��rN�����Gؠ
q;�EQ=QG�N�Z
�(��M4L�f���Ι��I��Jz{z����X�[3�ح	ټkqyV�cW�\�Yg�
��CS�ǟ"�8��(s9
~P�~��Tx��>좸6��xx����!IM8JE���o`iǒ7g�`Y��ûl;x��
+��ʩ�g��[at5#�}!Ugє�Pp6i����
����6������-
�)�>$����VG7yTE_�UF?�U����cP�=�L�xI�	��ds�0<��Z@{�-�ΑR�.�¸�
j���8�]�ECF��.-��D�
+ǣ�_:N� �N�&�!�Ƚ2~��"�RV
w�s܏^��Z�qO�%�����(ߓ��o�k"�!�dc@�1��3��E��4�w��кXD]��c�[lظ �]��lq|�,�ú��ՙ��3
+\+�ֹ�������M.�}7�מ���EI�R�N��+��g��^��3?*�I�1ބ�S8Ä́!9&��1��<&�_b7�r��2W�i��1_ì͍d
�I�U��Tfg����T6k��^�QI�ɷ�<��^�3��{{j�϶�:�-�畅�w�_�u+7���nJG��騘��=�C�<�����R}���ZVr�y��^)��.�jpdI�*/�W�y�`���v��s���-q-�[ �5g�d��B�V�.��Y��MY��2O(�g6���yK�.��om��Z
�>a"��^.�#�N�z�K�\��
g�8@����U+���b�e��V%y:��E�
w��n_�B�u���.Ϩ��<���PD� �H)#LQA�,�"��t��ІFpF�  �RD�� *�1X�Qp]��f�%'n�f��=G�}���s�����=�W�R���*�x��-^��nAIܐ�84�wQ�SQQ�;aQP�_B6���1x��C��T��T0^����,p�̕�_��-]��Q�ךnܔm^��`U��fW���H+v)O��m���R�����I����ޒ�)�ܤ�޹�oE��D��B�LH$
oA���26.�98�]���pf�n�t�.��*[;��h�Q]�&��8+e�6��lDz�BY��[�Q�+Ho�u�S�E��g|2R����>��H{-�H#B��K�&�E20�\�ߖ�p���Q�

)�qX��t)�*�+�4��W�֕�V�"�ҭ
�&ۖ�g:J��
$�\I�N^vN�WFv� -�h[�i���	��Q^�R���"�<Ln��y��3��:�dp�R
��讶gګ<9�;�ΩW�ҩ.1P�7���b,e%�6E��yR�sN��-�P�VP�_��wH� �\����D�M/!B��KH,�S�C!pY�W#4{
ԲѻK
u�L�.wvC��zMu���2X_��`,۱٢�"�Z�=�>K��0�T꺭�bQ���#����U�+�������,��
-})�.�$�)"
+&��{��d1pq�5����k7�٨��&+46r�5
�j����:�^q�:���(���X�̝)���,�dE�K�9wkE5/���s��nA���p���h��}�OQ�QQF�_�,���Õ2ڃJ�����w��f�m4����Յ�l�ț�5�{V��5�d7D����b�R�d��+�>�6�)���uSu墈�&ކ�.�u�C���q~h���Н��)�
+S��x��gz�7�.^�܃Z����Zi��>5��Pt:2e
^
i�RuI�*����K�n��m�7�rKs���=���M2�
�J���nHC�{p� O�p�C�p�C���
��
�:���=zW?��
+���-4��
]@e�*�{磤ϖ)�sg��.V��Y97�[��pp��֮(���f��)�����:�v!�;
����ikw���۪����n��{�����B����.^R�
��=��l�RMPz��A]H-�u̕I
r��bVύ>�u4Bc��uG�LB�d�
.X��P��W�v�
�ﰢ��qy�7N�}7
�{�;���s��&
�����9:�t����}��C@� �H�ĶQc$�:2������%���@��`�u#�BF6����_s*�p�p�q�p���5~'[-��<l�{�
底V�����"6>Lj�L.�
����7
�h�2h�����1=D�[!b܍Y?.b��/���Q����
��
ߪ�r<E�,g޲�}߱*������>#��ic�ؤ���#��7&�s���,1��7��]Կ��+�_6d��ǁ��
�\�D�U#���c�$�&3�+Y+&�l�������U}'�|�2爦�4SJM��&-��
m��)
��:�S��]{ [...]
+d�.�W��)6n�c�mm,�m
+��
���<x���� F0
���Y�wbX�;)l����\��n���NՅ��T��_����x��j���
~�4g&}�t����˨?���-�_��
+����gZ��Z�|h�C+�?r��'�
����J8?3NO�3�O��g�,�g���r���F���l����LP
�͞�d�={?�6��u����@��G�S��&��=`��\^���Ws8�j��\`��֯���?,^��ٛP���b��&2�r������M�އ
ּ#,�߯P�S��b� PN�P�}$�}�-�o����
8��>i���b1�91�	��q��B��G|�KV@���E�1��aɂ:�3j��Q!9N�����,vP>�'S�ߨ�־���� X�������ԤN]�O}&�gI}���D]\��wa�% 	��R�)i�~ =>BO�͂8�2�ٙ!.g.C
�X�~�خe�6�J��l��Q�*���\�iTS��@H.!�y`b�
�Fd�A at A�
4
aJ�"cD'(��
+�(�
P���ϱ���+������ �߱�}`������:{�u������I
,c��`�#ց]�����{I�|O�d�E��?Xc�����{�<
+8b¯�3�
7*��5��3�5�.ClU4�-��B
8۰::p�a��Qpڱ�X'v�1��e|�
2F9�#��a[ �lA{�̷S ɥ�,�s��0\;��
+"_
�h�@�	|9
f�рW��2:p�b5
��a|��'&�G�q�	b�{��̽D|�^'F��a� �7B��Mh���X�� t'�=��o�) ��<<�yb*���œ 
p�h¬$8*��
���u���&�#���@��
��~'8�="he
N2�
�7�n��{��s�sr��79�zJ´'$�c}$�M���6��3
+��oq���y�-��
���p�1q�ևo�����3�go�7j�q��|�\�|�T��©Ig��΀S��9�3���~�
V��3�^�i����;���N0��	
~���.�܍,��+���w�{>u��[c�}��[��k��
��������k���*t�Ϋf=�b��t���S|l�ù����dߟ{��#�׻-
�~C<fx]
F�b0�Y
&]S���c:����O�
8�2�x!��o���#��%0�<ӵ{=�t
��f�_�a�on��=n����ֿ��4����.��]:
��\7�ٵר����%�O�
�`v���ag�������z�9
�CC˅���y��K}4z��~��a��%3��*uo���׽K�m4��4��èӳ������
��<N������ǯ�<��
�l����1�u
+�½�X��.�P\G��H
41=w���N���vcY$�
Ϻ�D�����_mر���_������|k�O�6X��
�l�i�:�s����u�O��!�N�/p���m>��;��P
�,�I�F/�
P��ݓ�-�
�;j1�3"���:��wjY����<㶠U�Ǘ�3k]Ra�Xmu8���`�~��V���g����
��	xk�;`bƮ@��j���ƹ7���GhP�������XCt3���b�R/I��F?���m���o
���)M��̚C�-��o�ڷ��fop�m}P�]]��;�Nrk�~�����-��*x��5x[�w�@�;���M�4V�;A
ݓ�Lu%١
I���2Z{| �*
�=
�~st�Q�t���
���U]x��ΰ�mw�U�o
�ͭ
+i�m	i�o��)���C
�C?��€�1
fNKh�(h?/�2*�I��[�tԝ�F6�\DiKu�lI�#�e�Y���=��FuR�im��bGt�U�d5g�
v��*gTD���#�"�	�G�'�F�"K#��k"?J������A0M�@�i
B�Sp�Uh��t�����dX��L�Ғ>_�Y��ؗ�ڝ
�W�(5ܞ�dZ�nQ�cU!-�[j�!���.z��5�{
�%-d��p��_�jI��:��P
�w1 ���d_���h�
��wW�еL*���D�:臕f��J>�Y)�h��ץ��(��Sc
+�e&Ir�2��j}��S_l_W�-�����
T�C�|�)�<i�(W�D�;�
dn
��P��=�wp3��+)�#��N��X�1:�ǣ4���؝�Nߡ�gVe��7��0(Wę������fZ'�q����Չ��[�y�:AvB�P�pR���%�Lx$ʔ
;fʾ3e at b�� 
�gx��q�R"tg�3�V at G�U���;{T�r���iU��17eO+SFN_�%5.�H4+JO�T���(�v���������Z2#e�cZr�H��9K���,y�[�<eB(OR��ɾD!�D��sgW�|*�7�
Uk���h�*[�s��Z�v�mR�ho,X��6/\�8'ƨ0;�L��[�e)m�3UvYk��|Ez� 5��19�(Qqy�,��F��6.LLaR���û�W2�CBW��
�߮8{
\MA
�l���m+R7ϧ�-"��V�C��*�Q~A�iN^��27�:#'�V�]�M]Y>3I�]���'��:&�ͺ(�f��^�zL�d�/�.<�s���?��=
�|����
Ƹ��Ľ�3bf0F�Q�PI��.���
])��)��B[(%]�ە��n�v��Dm��v
�T[�UJ���:�꼴����5��|����{�y� �L�2��,�9��l#(�J�@��r�=��,�u�!�SM�ӣ�W��/I[`������I�
R�
bW�8�[�]9'y���j��s�ɭ�IO\g&
�D'g���|�����
�I������PQ��
��<'*;o$�.g�n�� A҆0�e��f�YsD���Y�g.��e����n
7'];<zm�"*�L5=��9"�Kx�5��5��[�T��L%ʡ:�3a9�E<'q��9��&���5x�>�XBV��J/��)�y+��n�d��)��˼h������Yh=w�2٬
)vQ�,y�v��i�%�)Y��aY���YW�C���o�a�d�b���τd����`����Π�� 6��Af�Ҋ�`u�
��؋M,��h����S�b�E	�n���U/�*H��,X%��%�.ls>���ab�Aǐ�SN�����7=p
��w
+�%�!9�kųx��)-v����bE8{�
��`u��,���=
+*�̃�/��Ŗ�Ŕ�	f�L7��=[�+�"|W�h�W+�Bw�K'�������
,:�������}�mD
��s���s���^R�
�(��shR��X\)���wPC�T�ffU�*'�E
L;mV1�$�b�ل��-�����m�W�C�_^!
S~\�[~	uI}�����������q-v�
P��߻`G)@N9@ΡK� �հSk
+�km �N3�<��:fjm0orm������ڹ��5�5K��֤��Uk�|��YxW�����W�E���NѨ���Q�?�<D��:�{P��_��_a~�~��C8�
���8��,~� �֋ �^�
n0���
+n��7Ld��c�u�bu}��
������F#�����5v��`��o7֜~a�v��	"Df�
/ 8���`~v��kO�Xt`n=�:σ�F�h
�
��;�i���@ʻ)��j��=��0
M���e��y���y��Ks��������;tGO��LO����t��#�'G0�o�|m@
+�=�@
fG|r��G<��a�5Spo����ܮk@}�\[��u��"A�C9�XD9�XE9����E���C��/gPm{�1m����i%�P�_��9��z
 �`�w���!? ����:.���]�ۅ��K��_`��
+�
����d�@��p�t���`u/��r)Qw	ey�����2�;e���2���N����4�_r`�y̿|��`�
 � ��4�
��	X��`X�
�z��E�
�?� �g�`�l<�<���Bb�b�L�W�@�W�}u�݈~�����c~�q���6D���
`t��6����������Lދ��
?p`�A��@�x�

�@���!Y��N��d���209��a�ӱ��V �[ j�v�lI7�� �� ƄC�1�<�3�<1��
qH�ܑ
+B_
��
|ozr�3�^A��k���DC+_��C(b9�&�41[Ba
+�B�h;ڍ��JT��F�ѷ�t�� ����~� �gF�Wf���
���4��^���M�x��p�X��D��&�d��rQ!ډ��~tբ�G�9惨��2��{�+�S��x�~*&L����zĄ7q�(��9w���.q
E� �&�&v�hbO�r���mf>Jw0�%��w�rf at Rɼ�
e�%ǘג3L���y)��<�v2O������C�ݗ��?�ET6@\$��+^�Z�FR�ُ"ʉ4q�A����Df@��y�e2��\��+d^r��
��}��g�rG�^����N�����G����v�{��[�v9��MN���	��_W�ֈ�(Y��k�t@�#q?4�w�it��
���B�jӫLc�(��#e>�P���@��w_��wOq�ץ��u*N�:���ڕ�yw��[�
�6�~���_U�%1��/�;�{�x��b �؅�>�����K=�
�������c���.�Ul�&�׮����V�sǭX�[��-u��Mu�^����u�Y~��%�U����4��� [...]
+`�T�Ri����y�Fx�s�.�q|��
r��۵����y����yo��띭}�w8�>�9�|nr�ol������ʖҵ-ˤe�=�UΧ䋜o)�
�����`������"�&�#��3��<#���“���QZ2��\���b$���D������+	m�k	ݾK�v��x�r�~�Kq���f(���/�]���p6��Q���4���3�`	(;�
e� ��
/r��
*<�EŸy�û�q�[�L�jfa9���
+W�})����j&-�Z��)=�����g�GN%

<�4I�K:
4�t!x&i5�X�Ð�䧡G��H��\ȑ5)X�KX�7`\w�r���>x�>	���]��.����K�<�
��^�9e>gx:��,����f�ٌ���
�M�`����tW�D�L�+�
�p��`����_����+����ǐ�5����|
���U���"wxP�
w�`EĄ+�͸EQ"�\!��dA�ל��8#P���
��܆���V�
k��=!㼽a�y�4g�T�h֩ȑ��tG�]��� �;z6�&��
+,
}�sQ�D���%��I���V%~pYJ��F�ii
~N�u?V,��'����Z������Bs�S`	�9�����}yt{�\T_�b��޼�1z��Dw�5Q]���_Z��|#x�~s�Kn)�$�U9	�48U��*��婄��\�C�"⁒R��X�?"����ZB�
����=��zO�ᨮ�Fg�yfG�*˒�V{�3f{�O��BlM�z�
4�e��ε�F�O��
�>pZ
�`J��U�D/�y:�Ľr	y��̿_�
�#�
���C{�-4k�-�C<L��ƣ�D���YV���,��m���e*Ƙc���A
�@p�/U�ޫ8[�	�Z*L����nƍW&�*2<
j�πJL�+�Sz��rCpgiC�����&�l�D�����IV��4�N�c��S+}���U+Ř�`������*ʿ�G�� p�� �� p0n�
nL��mX��a��z�4E��
+�S�
+��tA�*chsY3ͤ�lPأ��1F��(� ?��_���ߏ�ɿ��R���R`,���?�>F����(��^Խfjpp���Q0f|
7\���^��a3d{wU���ҕ��i�M
դ�	��0ь�]���}Q���N�bW���T�.ŪU����V�^�+�1�\��"��h
������:��еg=Փ�����p���>��j���
+�-�b�� �oЫ��*CH����׵Gh��(M����<�Rifc����
+�;��JͿ�J
�ZS���/}���t�ZE3��rϠ�7���.��g&��)
��7����x�9��n�z67�M�E�:�������
+��ԅijZ#ʫ��e�!�B�U�����c%���g��{��
+cɪ0�zO� �2���F�Z �� ������`�mg��}��-��Ԛ��В�cl. �$��,�Ҥ
V7ֆ�54��뭑���hI�f��[d\�)2�D>A�c�j1������:�� �Q� Lt ���wxBOg tZ�f݈k���Vߙ�^�������b��]�j�P��!�SXIsG���N/l���7O3��y��|�-0?a	L�YB�6b��>@�p��-3�(��.�����
7��R��F�����vs�նD��7ó������2?YWy�Īw6�vXhŽ������]��ٖ�
�e�ɳ<fd���nâ_�'t
��
Σ�ϡ��6 g�]H�
�<@��A�
m����8�`�[�`��r �K�_�#闐��2J�
m���.�������Ƴ�DdڎFrm���o#���=_�ӻ��wa�r��Z��V4��h� à �!�ƽ�{���n,4N&�;7��mx�3�P2��!x��}��r߼�_�H���f*��
��p��
�’�O�����h���h�?�'�c��6:�
h��P�� ���Q��� �q��CP
�@�H��~Ů7pE��r]�AQ�g
��� [...]
+m1�hfZ<�f	�4K8�j�eɖ)B�e�8�2WkI�N*Zd]�\Y�N^�EZ��zB�A���jr�.x���}�5A��~�J�(?w�j�6� �󁥅�ԋ�)RJ%�\�Ab�+ʽW
�X����,ښ���YB�u�(̺@
b]&	���Z7��w��[�l�[��~�s6~e��q�C�q%\�{�WGh��(?#��ƾ������#���@j%W��+^�CX�h���`Bm�k��M@`�4��a�u�_�"�[����S��~�hl�>ј�J�g��g]�ȳfP�Q�%���L���^`�}�a`a��Q ��PD�
0�÷Q	�)
��Fal�7��Ls:����q&�3s�ޜ��0�e
\[���%��%���I8��ù�	s>��p�ٴ���i���
+�]ʞQK�
@�	�?���I�oU���W�p����㠻6�DC{=�7f��f:47�Bs��P��	u�~�ڪ`�v��?��� lo>m�nV� ����G�A�	'��&���:�n��1�ߒBӡ��C
U�
��(�|�����
YO"$=3!�Q�2��
@�ׄBz��=H����f���X�
0��I��
F��)��_��u at wP�lP
( PC2��h��M��?	��tB�"��� 
�A
+������kS�R�s�Ӛ�Es�@�a�=�2`�8����Ȩl�3�q}��JC
��Hb >$�L$)�^��>�8������qZt^�w
K��-��u����D��'3��Ÿ2�q����'��v�A���Bp�aRN�H^ɛ�B~
C�
���X��H��P��C���n��n��DO���Z��u	T�
�5�2�^H����F���"�$��W�셺�=W�3u
�����G�n<P��W�Y�
g����k����J�H�܉�����g�sw��q�2����m`/t_�g��lH���j�؀6��k��m1{��`�5���F���
+��u�u��݁��\���?m�p/�#��8�{Q
ciMƘ�&3Փ
>j6{�ΆF.f�#W�'���~#{�����;��
֫�e=�֥?�:��C��ןd�����Nvå_��
VW.�D.�r�a����h+i���	���8������Jc�=�a}

X�a�2�b
���ak7lcwݿfwܳ�m�<v���nJ�5C�p���j�(���Z<��N{r�)O.i������Q��
�IC�فмy�ɄG�Q�����9�o:k�Y�n�,g׌k�e�B��K�q�p޸[�Oc�謱@�l<,:m�5�č�f�I���߇�:�W�_ns�g�|���D�AJ�Px8�ሡ���
1�#8mAq�
����wع�B�i�pƴR�dZ+j
�L|2`��D�N��{$
{��E�ڀRiM�1��FY�����jz�(3qe�ώ
Ãm)_
+
%�#m����E9�=�
�#��BdZ"��S�ى��BC�BQ}��ĵa�T���

�(�.t��ې]6�!Y�|yy�!EiH��$�AY
rIy0�۶(�0�NPW�{����
�I�'��Ij\�脳1�h�
���	�66M8���I�+'.��G�^V�'������M�C�mʃ�
[�9WUh.RD����k���-v{�?j������7$�
<�Q>ЗH=_2p5Y��Ir4'jqb�j�Q�<�UL�*�%�'�'9��@f��Ȧ0n�� n�2?�ۼ�/T{cv���dj�b��3c��{b��1�t������aG,w��l���x0� �O�~�
�g�4�J�C�
�SG����(�
��&	�ii��)s��S߷�;e�<'y�2k�JUf�Z����Cu�5}�q��K�o�\��
��Z������H!� @‘�+�����9��T]ī��u�{�����t��
����m׵���ٱ�?>3o��7��>���x�D�xG��#���G��퍼��y��
�1�3�K~{Է�o�f��Æ�_���$��T����T.n���T�wR7�\�v�4�3�g7���p$I�4���2��w�7y
�Y<���=�
���Aߎ��~m1��[b~(h��-h��Hh��\���`����%l�i<��?"ﻝA��tW�ΰ)�8��3�A�q�^�a��QY��pZ�Ӏ4ۥW�s�N)��L��jK��$��4%��Y���g [...]
+�K�<׭E��hJ3y5�YxS}k�]|�tDP%�VH�Ef�u�I�c�Q��ؘ�o�1�}�������c%���殺��9��Us0��c��lƐfӧ�ve�ٷ���͙.�J�[}F�G]z��%��W����Pt���!A�|BT*�˗$�� ��S�^�X�`E�а��t��P�7)�r>0O����c�
�m at o�6�S�m�9`ߨIv��V8ת�\����+U�r��g̬�-�l�/V�ʣ�B�Y�N�����xB�K��dń���3��_�
ܣگ逋���"`�~Ǹ�
CB��GGAӢ�ñ�G���%8XrӜ+����
wcN�g���3d��e7�
�}�|�aQ���$G}%@�~H���J�Q�bB���'R����y�"e���s�8B�a�+z�|tٰ֠�i����E�U�9�H��.%:��!_�Y�W�˫���m�ks{�H�=%Qi/dj� �)�Բb��-�����in �({�H�WF�G��'������5ԗ25e;8��a\sI�}iq� [...]
+���~VA� �`T��;!V�.J亻r�'�?$
+
K߱������!��u=�"�!�<J
й�d�&�7����|#*ʷ1��Pn�9�^oJt,0ɜ�*WmY�Gv��+���S�
�K/i���O���
���������ER=��K>�{�Ks�H�_[p��"�$�bP[�*���(�	b
�ݜB�~���xmu�Sv��%�2�MYY�^a�������S̃�$�0��(��8��q��KQ��[Q��&���'�]��%3����Z�Z:W
tCY�?�֠Ⱥ��Ywr��pnvC�}V}���^�8�v�
�w�֕z&�V�k�}�j��15�,�(�-a��W¨�/�U�	V]������u���T��z�>+�C4��-�(l�A~�*h�7#�};�j�d�Eqm��im2Gi��9�%�5���
�\�y���
��볿�_x�,?��:_�/�a���a
��ճ���`��>G�Sʹ
-�]��=m�]]@^7�^/d���ٿ
��A���0�����Xnb��>�/�!�W��[��cv
�����幷������%ޮ��B:��B:������㦉f�z~���t�.tV�.���=�Q7���!
[���@$�oG�x(3
͉
O�F���"Ʋ����
���9�
�u�5��ct�m��i�m#�
�#?r>����o<�Y��,�
�Q���}�h�
Pv	e��c@¤b��=%F��:�ފ��]�	gBgb�=3)���
�Ι
����m�U�?�nqxkz�q��	�7�/��ޜ��S��'X��c��@
+v��
��>ʵ���	 sH:D�&�u��9_�[��s�c>oχ`�|�mq��2o�T���h3q6٬܍�~��I����v�l����?ᮝ��n�9�~��W���c�����2	N �g��9� �ឋ@�e.�,x p���
��iq6.a��]x�j�_�Ǻ%�,e��%V/Y�UK��ʥ#L��yFr�6#Y���,��/<爯��1E�#T{'���t�����rcIIC�m׀�7�5�9`�
w����
+�ﮃ�����^��ł_��9�}P�V�

���)x=�χ���_�u����1>F�H}o��M����+@����
lzx�> ���չ�����l�e�
D��((`�W%���	1`A,H��@Dņ�(�<	��C�-�O1D!�ODQDĂ����g�0���;�=�;{���9���F
�9���P�Y��0�s C �Y�ҿ#�DH�N��b:D� �X
+AC��Fr�<�(g3�J��,Z��=�X�=�OZ��8����
`]
h��%�+"�6�!�j��&;��@�:5�ͣ�1� n�@h�m���
+}k7��j����GK(��]�4��8Zw }��0�`W�. ��e@~5��Gn���+��j�M
��	���:���k�Rs��G��?�:���=�@ON}�Do��G� �=�b{���� }
��`��]$7��b���u)��b�ѽ5t?+����� ��f�
5���(F? ���C��?b�>`�h�Uŗ`R�wŮ`0��o�4�H�%$��"�H>)�k�
��x�Cx�jt���h���(m����0k0���Q�����L��ɼ�L�Dc����O�WI%K�r��W��߀�|��Ex���N�
���������y��n���@߅�B�V���
��5��ջ<��RM�)O��H�D�ɿ#3�Z>
]�x)[��,<����:t�6ᑬ
��t7�J+�&�B��
Z�7pC���]h2ehT�sE������9塡|(��T������7��T��j
+:U3�P���Ÿ��@��7�Q�M��Ven)w�r��{q]yM��WՌ�C�k�p^øZsƝ{��=fK�m�`����f��9/��c� <��B��w����m"nh��6
M�ehԮ��Z\�n�%�6\Ԗ�^�,���4j��p��W�Ew�
�����ϰ~f`}�`v�`�*�j�
�|���vC���u!�����^���+
��9��[�Z��貸����i�z�;���U۔q�m��ٜ�z_�۶�l_*m�`_&�ۇ	+>��)���Q�Dy
P��+K����z?'\��z�?��#q�n����U���듸c��>�;����s�C�
��V�}��ҮB���ܾUXf�LX��D%L��3l �w���`
φ��1H�6G�[���g�\q��ǜ�q�y,w�y"��y_���s��W8-�q��;-�v\#,s��:�J�v�v:
;�9�:w�lqf���L����m|�N:�h{u�
�A��!�8�b��nq�m*���
+����[��u_���e�p�K��ؐ**2,m7�֛l1l5)0�.�7TJ6��
W��\:dk\^�V�2Y�g�`��(v���F�#9�
.�	%
�}#�c�w����JFs��c����S�[�ŋ6�-��X ��f��%Y�Z��=_�ڽX�����
U�9

��
���֥�
���t�'�+m�����Z#PM���88�>�(��c��E���V� ~�O8�qT� o�DѺ���k�6���+Y�"��ʐ-�ʑg{�fzmS,��m���ae��ye��
�/�/���L�:��}�
?>4sЬD}>͟��P�o����
;�`k�@�xry�����`A�1Z����ѓ�٣�L2�����e�i�t�,E���T�-��R�B���g��}[��~������=���h��(�1:��ӑ����� ���(����X2��

���d�
3lj2�|/N�&I
�I��?W��b�и�l�q�r�1_5׸S3�X��e<e���<���&����R}p���˴�S��h`o
�[t�ơ \���
X
a�d�{q�¿�

��F���/
+�$Y
'MN�'-P�	J7���Jܠ���<>�����j���f��<.�i�S��G�Cp"
+80(�ٯ��[�u^����ȉ�̘AȈ��Ң}��Q������XqR���9�Ӥ���'��S�
�E���
]��
��|j�
�)�ǻMk"�-&�1s��T�?p�jPEq����췍��Ҽ3N��Z,��ҿqBj�;�(v�<. at 0wl�pvL�8!f����)���xy\�
���ԨL��ȵ�"
��uyGEu�q�wgfd`����.誈�i*e�60�
U�RUZb�2�X�YK�(n�Q at M\)GO�-�h��k��n�Q���
�9��9��9s��{��}������b�<�31�=uO\u]�D��1�D�[~:s[<ס�='ˍ�y����
��kP�0e	�P�0I(��H��Ҝ�y2s��&3.N�
��#56Ci��uXS�h��vN�ޠ�G���Gp��>�36�o��_k�E
Q����Y�|��7��jd�Y�c
�?4�b���I�Q�4�I�\�t�l�-�4���
6)�1��D�")!�ΐ�c��/T��+�b�����۵
�\���z��/�N���Fŋ�~�>��\�3��T`'ٔ��uy�%&G,5�E^�rR�!+e��a򗤚����a6I�Ѷ�E	
+����$�}L�R�¤r'��V
aܦ	7�w	3
wY`�����%��Rf5�Q���|'��&`_��ԥ���<JҀ�t�f�9c(23=��9Y0e�J�2�J
�e��(۸�xyLZr��i������+
��u��bQ���ӆ�|�
N�Nl��
1�Ԅ�Duh�;��Zle�鵚����.f��I?�9YJ,6k��=��QX��%rf��ْ��itv�MTv�m�٨7����ʵ�*U/^��x����=�̣�9�ߐ{���_��: ]t~�Y����]��%�9@!��yF�
�%�H���w�
�#v��]�/�I#
+�da��6���KRAKr�������P5+w�����/���on���w�/�~9���;N1���\��,�k� +x\BҖI��U�+��ҡ�*�@d�d!��G�_ 	-�'
.��K�mJ�mg�d)�����W)�/��0�h�ʻ�09��.���^�\�T�fz�o�r
63��e��B�RL���/c߱��P"�R�U1�j$B�' ��[��)TIfW�KfV�H���2��L����i��)���&W�TzU
"g�^�?)�V���Z!�{-�����w}u��
<,�3�[_
D�=
+]c��'��Ŝ�a�U灙u��W���9��u��u:ɴ�ɔ�T��\����6�kkl=k����4�=j�"��
k�)<V�
+�U��x�A��J��
+�GRR�
НLwL
{����M��V{�ت����VOL�L�$��,��h	�[bO�"��b���IFYVIGZ,��&���̭���m�S����6n�����طӻ�mX��k���2��-�\��>;�I
2�ۭ���^�8cGbt�8��Nş��i
�kܭz
��a�5_b�[7
��W`=.�Z�
+���׆��]��4T[�]Mo�:����`+���@�.��
+L�
��p? ��f'
i�A̓0��
8�	׃S����

+�{�t�{Ȁ>-f�n)Eϖ:��4@�r��o�9t���
��X�r
0��y	��T�
��O�&`�R���3`�Q��19��*hZ]�nu�s�p2Nm����
U{0��C{2�O�Ay�
+v��P�7A��%����P��J^u��qW��}@w&cN��7s�G���80�
�u
+p>-�����*��ka{�l����(H/xAr��A$
�up�up�}�DwP��A;���6yD�t���3��=��S��-��i�w8��O.�ձ���]���#���Z�r_��`��HD��)PY
^�K�:_��K��F����n� ��)k��p��9�}�5���O
�=
�G��;�� �������pKŦ@
�؋��+p�
���By:��x�y<�K����I�d�;�B�$g��c�M|�
� ���W����
��"sO��^��-�/r����#�m�P�AaN
k���ɳ!��1�
�/Y$��^�������b�]LzWs7�� ����0"��D�KBI
I&Y����
Ux�5x��x�-���

�{�?|���3<E��<
�:q����>��DM?��} :[�K��WO2�
1�
�F.~EG+��#<C-]��c젫��O�j��ǘ�3�7�0uw������͑n�ѥ7硅��m
���!ʦ0/����3�n�4�Y��J�dL��ZG�f���vѵ��f�}7���"��
��ٹ�(.KD|��;����	���L�yTSgƟ{��$$7n�#V��j�FzX�l��$&� 	�@v������(n��R���(.�Եxlq���L;��T����tZ���y�O��w�{�?��=������#����r
+�O4~���%���<��J�LR���j|%��cI=
r
�ׂ�&|���\��
�]�8�p��%���'�.�W.+\���E��0TI��� C��Q�m at 0����x|ͧ�	��G|>�ɗ�K���
q�_���p�o�-~#n���
�T]��:�˪^�n�b���
��
+8K�!N��>�C�������<O}'��i�Ǡd�
��[�
��[�k���;���ϯ����E�f\�	��w���N�
rg��ũ!�p�/��3���94L`��
�"�"}*/�����@%�S
�������pk���6\�KÍ�8†�N�Q���p:�
+�jp2`9N�ű���	��
��

y��
y�9��t>`:G}�v���m��(/��cH?��5��'��Ip?P�;���2z4.����c��:	'�i8���ڍ���VW0��.�bf�z�W��t�[���=h/����
+���
��n{�h˸_E��	���zy����ɓ�Tb5���
�O��7�?�O����EOH�hq`�t�
�Dg���)`�Cʘ�!��]����Zv{�*vkp�hs�Ѧ�ŭ!��CΉׇ�7O�Z�4�gI�{��Y��*w�}?
�A�/�z�Pg&��2�S��:
�Qh
M��P3�}���:5��<���@S�n�T�6h�Z4u�u�q��UҠ�%Y���VkNq+5W��S�H�O�QZ*H�yY��ITꩤމ&�8��biޡ'�H�
��}�1
+�"'b{d86Gj�i`6D�3-vv]��m
/�
�%^
^%^�DR��[
��-
�&�
�+[v\^�'_�H� �{B�WG�7�&��3ҿ|�� �)�-F{� l��M��16ͱ�h�Ib�Ƥ2���l}�C�<�@�,�L\5G�$jW3�N�pZ��z�fyմ�yQG}*�.*�D=P̎�NQ-�x���yO
|JO�i�:D'�m���xZ�ѬS�Q7�u��O�g�
��x
�$>[T�u�j���Z��*���W+��F^���kS��
RΌ�U�i��gh�U�j�P��
��y�j9n��/L��]�n���s�!I���!X�2�)!�K	CmJ,S���,HNe�'e��%9ĕ��ىeܬ�Jiyb��L�R^�[�(��T�����Ļ���|~����$A�&�
\��9 �4{���I�F�� Ǫ�Xn
�Z㻨1�b�1��2�������h�![\npI��%\��BZ�_ +�/���7+�)ەN}��?����&���zAI(^s?�dN�~7�_m���S���J��< ��ñ �
T�MAeZ$Sa�2
s
+[�jfKS����\q����7�K]�*�Ӵ�'�Ԥ�1n���}�,�)�F?��?����2	J/�W��<�h��H�]���S۳��5i�禋P������1�3߃'#
e1LIF"[�nd
�3D��
�Ӓ/ɵ�Is,sevK�O��AaM��g�u��-�K�\'�Q�
�n��4A��۴���
����؁&�W��)��6
s��`V�ۘ��ҬPeE1�Y	��f`�l�Ö-��\�l[)g�ΑeZ��[�(Ҭ�xs�
U����d���d��ʔ�3��)�B�����u����̙K
P\K��|�gv��9~(u�D�c<
+r5p�F2y-�p��v�Y�尉�9y���bΒS!3�,���F{��`���ۏ�R엉�*��'^�-(_a�r�<?E�>袙�h!��kS.s(��N9�]Q��;y�I�q�#�
���Il��Ħ�3Ein�8�U(1�<R��Z��\��ܠHt�)uΣ|������Q����\A�����8��/��H4K�i�s�>}�
+$p�Gn�?��c�Uk���(�b,%	�����J,���v���-I..����	Eu������݊��#ʘ�O��ʘ����A��'�GHo���t�E�,���9g0����
���@X<�a�h`�D���2O
+��1�I
�H�q���K%q�\L�Ri���.�(�+��لaf���aQA��
׺<�T�5ڨE��A�	���EE�qA&.TD0j]S4�Vm�X�Zc4DM��'�>��3��}�9���ݓT�84ɬ�O�OZ�qI�P�/y��_,*��ʷ�8�
�o{P���z�N�����-gߑ���n���������1�>
c��	�ӧ#�%	i�J��-����,�K�RĦ�w�I�p�^��4;D������!:�g����k�{�R��e܋$�$ӻ0��
+Lg�6)C���8cl�7FgaTV?��
���x
�
�������B\�,Il�|�ଥҨ�ղ�Ye�Y�������&rM��"<�'"*�W�B
[��+X�IYIoR��٢M^��s=�����\w���D\�
C��5�`�0D�"�8�3�ƹB�q�fL��7�J��HC�vKC�viH�#iȆe!���Ԧ�.e�.��I
+�^�	̦{��~F`8[֘B99c@�"�u�(AxI$
%��_2
�J�F_�T��f!ش zS��۴N�e*Kv
+��PrQ�?
+_H
+���\
la
��d�5i
�!݉tO������R r+Z��JW��ޕ��eE�9��X��	0���e�,s�ò�������b��� ��3К�B[�m�(xuQ�!�b�#I��Y��}X La[8�
�� l�� ���
5N����
/���x�F��6�#�n�7�L����Ŗ�-�l�ڶ*�	�joAe}u͏D�t#�#s�*�g���1��6��J����ҿ�<	pnPB��U�N��P6�����t����>2�� �����kgB��C�����fQ��ttR@�Z�|
0�1��O'0��6 z?�� �
��'��Q@�86�!=��Õx-~�	�0h兠��V>��x�ڸ��\[
9��/��G��0�+��"�<��5`�#��H�a ����8���� �i��A�u#��y�㼖➼
��Ŝ����G;/"WX��_�B_-'{��9�ȍN2��I�{��F�(�;�޾���^�S��@y�\���|N� ���u'^�5�Mw6'݁�t�$�jV��;� ����.
�=
�{\��\��
��r����y��
�=��f��
+0^-�z���~I8m|E�&��w�͜<P]�G��c��;=�=����>��>�����ɤ���Dt�ح;D���M"�P2�$�ydI�O��K��
�����
ex�J<E��ߢ��'x��x��x����7w�3�Q�
Q�	Q��;��@b C�2���ӹ���t�q�L<�z<����Ltm��B�.����z��8Sv���'n��79��
�F�Btq��v��p�(�\�GBHI�{��-c�G�"���>Vғ�;؀��DW!-�tU�U�񭸆�2Gq��?�����"G�@ο����\�!����/�"��o™�8�9��i�ͦ�=z�Г�Q3p
k�Mrpq��UF���jF�g�
�ъS��m
�$3�‘O"�%�C�pb.đh8����!x ����ܒN�uY"����o���$[�
�T����Y�:����S�f����*/G�|�6�Eр&E
�:���=؝~@�JD���d� j�|�<\5x���]�7�\u�K�18��
Ψ��)�<���G�z��i8�^�&͇8�و#�"
֔��َF����8�|\ڱ��ln/`uQ�.b��>���ؐ<޷=��||���E�>8�6���p�c<�yL�a�ٰ{�
��P�
=�q@����
ا�{�&ؼ*`���n�:T{7a��ET�܁ŧ���P�Ey"�r��]���Y�t.�:ଗ+Z|p�G�{���(��M�^�D��ޅ��=��/F�2v����lT��b{@,e�
�By�
a��P�;+�~#���	�A�PD
+�@
d�!�XjY�?e�=���)P�� ��ƞ>Q�gv�ǡJ?�������
+���`�>e�
�T�N�X�I(ћ��`�Pl67H�CNI6�ܒC�HrCEIίx̲\fimc�?���p��}
a������2��l�E�a$��&�4lL�Y(6�C��OB�a��o�/���}���\��)A55�J
��.�{�]8����.�.�]n
r[�ۊ(���%��*X���ԱmSӦi3�δ�v�!m�Ӵ�t2M3M��il�/2f���9�����ߞ>f&m��J�`O��fO�-�'�_��Ʌ��ɍ��ˍ��
��"�ܱ���j�}6p/�{��V
p��\��q��z��܊5)��h�F��+"	ӚjLj��IMs"����fÙ!v43�gNsC��ܠ�"�\�4w�Y�S�e}���~@D���PC�
��� ܦ���+��;t/���m"�h��Uc*7'sM�έdF�NfX�a���젶�
i{�~�0ק=��hg�n�K�.�UEg����_	�	�y����y�����B��rp���
e�C��m��nN�S�gcD�ǐނA}�ۘ~������#� ۥ�悺�\�n�oӝQ���	~�+B�Y_٤�+�Ш�>B����I�N1�@��QD���,��6�0aL@ش
æ�4g"d�G�ٌ
��t�*����t�<l���m5vr~c?�l
S4#B��E�k���7���~A|��3�GYg�*=��1���a�V���4�(�P��g�|�(�1Z�c���$�ך�#V-�V:�V��"1��i���&K�hi�|�^��pD�)�ܖ��rYUc�E�
��E����*����ߘ�7���t�Y.�
�,B~&��E
�ǡO܄nq':�T��d! ��"�I,a�J�+:�z�����[��k�c
+�xJp�s�jqYeo��ğ�T����sT��M�
+�ܧ9�:�ި��@W�Y��L��1��Q��[�`��K��R�,e�QʃO2�^*b�r�%��Z��uJ͜C
+���QE�4!�Ҭ�B��*��#Io"�I�Qey�C�U�Q����j������y9F�z�K�"��	h���Q~^Y
�|n�0je
���lc�ek�9Y��+�E�<.��g����(� ތ)��#ʟ��ʨr��ʨ��Ϩ��H��Xt�<�S�O?����M at Su<�՛��˞�G6

�
�9J�!3�����c��m\����aE���`����د�
+�?&�#>UVG��5�U~B��$��Zʜ5���!��M^Z�{����&��Mp��ݵ6W&dw
*�&����]���
��g�]����
]�
+�+"�\�F�5��uWep��2��Ci��Ji��
+���z�E{R
p���qb����S#�u���Eu�S��nC�w�}j����w�ςb_c�٘B��5��Y���3��x�wZ��.	���
+��וy�w�������y�_s�j�J`��&F�
�O�y]���7�Gi�f�-�P�O�՟��
+f�"��1j���=��d���\��?�_T䴼��n��"��[���n~��i�~�-��J#0GL��Q;���;Z�� P�����Ž�0wn�)���
j��2@�eE~W9�
�����t��Y�V��2�s܁�wyu�6�
�5�������W�Gyu�7H��������JxZ)st�~P at 1�л����oA^�nhRqp@��P>�Cfd�J�	U!#�:�¤�z���q65�<�o`�M�>q�M���M���K�r)=k�Ju.�Ӟ�F�� �D�5�-��ʞ[��
+d��!st#2ƶ���
���c8ia=R�|+,a_؉�p���H�0�ç�]�
���M&)|�I��I�7�4
e��ָLZ��q��h�
�����c�q�=dL ��O ej=�N'��$$O�`���fb�I�"���
q��H+�FB���3�sH�\��3oF���H��2���8O1p���#�Mύ!Z�-�v�8�7	dRLL=�e��\,��'`��f<����
)H\8���شh���lX���|s��/�#~q�xq�o n�=<9�)��
 ���C�h_$��u������h
+П�fIH^��6]�p)��	D"�\ށ�����X�"vŌu+�X�E�J ʕA���|��-p�~I| ��gė�P�G�@��p�S�%gi�9����i�%ҿL�/��וP����1M���}�S��QQB_C�RJ�SN�����h������HER
!�|�dB�2�9>��eȲZfǚ��5�5�0��ż�mw�\]����������繟�њ@ҚC���eS�eS�E؈�x��x ��u�`
E�
D�994|Cݬ`����@
c�\	�0^_����o�
��!��(`���$'
���N�Rp�>�ٜ6�9m��V
��<Z��[9ɭ
�u;�
��yr����)�����ɘ��+ƫf����0j�RӢ	P6�����76�
+�
}�����@��R;�Nl��_���lL:X;��:8�

���u
'��F7yۀ��܋��o u��Q�`��=
�PS��y�����
+�*_��6���X�A��E����l�����<�������s��Dw�'
��L7�;� ��0�x��0�ZSלV�/R��"���ȭ
�N�'w97?��=�G3�s��Ǽ��BOٌ<�����݋*�%�_꺑���aуBF�qd�$�$o�����+�%��9V���)6�	*�5�����	Gp-�'.�
���o��
���
��Y]>�
C��+"�/�����N�y�Y�G(��2ꬢ�:�l�Χ���q�����&��9��[�<`_�G���z��)s��	1'�#�`u����Q/�Z)�ʤN�`u��SJ���Y���1��k����s�4r����.��f����
���~/Ȣ!��ӝ�7���:W�G�P3�ٌ�V"u�C����.�b�,���l�N%�3_�gp��q�oZ躙Y<��8I�� +� �᧾d���
��J�Q�ϟ��0��Ԋ�hI�>��K�\�P����\͜���E��140M\�ts
:���k4�2J�C斒��e.��F��`��
�J.�$�A�"gѦ��V�84�%�^:��e�^.���R
�/�N�Z�*
4؉z�z��u
u��a��w�c�3v�E����=� 2����,wwȍ>��6��^�X�㴱;�M��I(M"pX�2
ʏqP��ze6>W�N����bO�r����۱�t?��6�3�/QmvU揱���-�xN����,+?
bIa��J.��l?=��*q�|��
]?o
���쵘�ݖѨ�����)�n���y�f����Q�%*�W`�U56Y����Q1�
�^G���Xm����n�zxj�3�%�G�yg�{G�����Fhh�:�!�m3;m}Pc�j��Qe��v��l��Mv��`7v9Xg�k�a�}9V�oE�{�X�^�nA��+�'C�
%��bY(z�Կ���=�}�
bi���}z�5�
56�t�3�8zc��?*
ð�1�ӱ��#�9��J�YXR�<,u*B�S�P<l��dX�P8�^(�$,�'!������J�u��YЅ�,t�`����GH�7PK/��W���\��~��]ݱ��+\�P�����Q��!����-�n�(p�/,t+��J�\�uB��ja��:1{��\�
b�{����B��!��x�_P���������
�>ۓ�
C�������%��(��C�g(
+<'b�g$�<c�뙈
�Ta�W���'dy��^k�
�Jq��
q��)����:���2���w�N���o
� ���/y̔3'+G`�3����NX4�y*,Pb�J�l�$�UE!S�
U���Jf�r�4�1EU&&�6KI>��L�CR��i��mE��/R����.�����
a�����ǜ|�+��W��㬰@=�ծ��
�L�?2ԡHWO�,�T��c��N��iB�:[H�+����~���vH��ZE��N����һ\b�͡\�l{�����Jza���|�7���[ +�
Θ
�� _�!90
I�����B|��B\`��/�.�>
\/E�(�
TL
:��
��<&�J�A�ig�����V�2�9��Rz)d>rIv�!��cv�
RC��
⎙!c1#�	!a�
��ؐHĄ�
+ѡIBTh�0=4W�
-�������mSL
+�'-���kza�����R��Y�A#[�]d�����K��3��f��	�H�0�$h\��F�F�hM0�4ᘮ��i��Bdx�0%|�09<G�/�>_#M���2�������73��(�Bj�+�7&���
+"� �0#2
L*�8������y�2�T�2E���$�\�Ct�2_ۮ�f����F��m�o^R����=���|��y�ߔ-���}�����ԋ�RR���-�)>�Ϝ"3�
�*��{�$
��ef�Eim4%��wW^z�
�Q�M�	�	ʶ&�f�P��ndX�V�L#��1�Z���[W����,�2�Z�2���cI��>�&����6j!�<@<�Ms��L�)�.gf��2�˞�U9Y���,[�2m#e�%)ݖ���
�d;���Ӎ��bSR�ה���<&{�ytv�%!�>�ۖ��h��!Y>�q4�M�`,e,x��� �����	9���*#������f�T{�R�c�lO�8�MI�<c��e�q�1
��Q�J��s�c�9�q��8o���2��0���~�(����P�8P
+�0=}���6�Oּ@��uRʤ�JΏԸ�(%��Xg��8�5ڙ�QN�F:���YF�s�i����\o�q�2u
1G;ϙ��4���<t��
�H��|�
y�Zƀ2X �`*˝D���&��<5@�S�k촮]�S�
+�kdA�F�F(ޕ�8W���r뚬W��o
q��]U�(�N� �!8cTp�4h�w�3EM}�~Z�-謄%P3 2�OE����Q)a��F�
R\a���)���b��4�=L��
q���n��'i�{��K��~�5F_�v�����~ψ,�nD���g��j	7�UO�l�����3CW(��%
��L��m�xI
.骨y=5p^
�7D�=���IT_O��x��LSo�
Ex���Y�
�j#ܳN���%
Fx���������	��@!�'�=���o�4��h���k������)���z/Ž�s�@���
�Q
+�&+�kSwo�
��ے�겤R�z_P�w�B�'�BJ�+t�O
+}�g4�	�g�怋�p"�h'2�3�Y��R)�̬�g�Xy�����Ky�
��Th� �TĪs�hu�L�#���X�R��yj_Y����
+�ܣ��7X񱂞������i�̧����
i>�E�,���
���%��e� ��F��+�����am�ڭk��u!��u�
+����j[5Vm8���պʭVU��_�Z-�m�ߺC�[[7䷦A-V��s�y�\�۾HJ��1eRl�4�^kЯB��n��fs
��n����Ԣ:D~�aj^
)K�`���e��ổ�f+]M"�ˁ�샓4(���-��wZ^����;�i��r)	�㞓���nwF��[��
��Z�i&sMk.:��⽏B8�ji�j�pk�xj��u-���H�N~s���p��Rb]���05g9�#��э܆����A�V
+xE�{M\0p���v
Ǝ�4�G�h���
�1.�:�:6z
I�ù:bQG,���
����r/���ֱ�>����[#���>�A��VG%��h����8ٜ��h[�m��ӝi�h��ml҉GccPϡ_ON�It=���.��
�������9_��9�%�t
�z��uR ������g�l��f1�3�] &;Jw�>�%}�
�iB�PWf2�P�WI�U��̫8r��f`�Db���4�05�nt;�xZj�~��y�l�	����ҧp>�H��K�
o�[�ȝ�k�r�f�>�7
vߐ���@a5쇃L�� ���
�B,$B&��'f�����ѿ�H��i5�\��B��u��z}�M���=�ż���tC��:�~����5V����)�@ C(���M�44sћ��
��
4棱XׯuS�Dg-:Xs���E]�>����c}��X�+]`�F>�/
j�h

�
���
��� 
�<t
+��b4�o�񉖑�
+R�
+�*�ߨ�����9��z
����˓���x�6*���&|����ޚX�o�C��1�Hw*>M@'_\h��(Ac�{)�ezO��<��z�߬���M��7tT��~
k���a� ���G)��3͉s �v��0��X\ 穋���cg��h<�����<��S��ot��8DN���*�~�������D��F�4�c���Q�l�/�[~��n(1�����0�dt��Ł�SXy:n�]�W��%�,W-5ZCNv�]zI;�b��f��V�
U[�����f�>��=��l�K
5��9cnE��鄩�����z�j�>� ���^�TPnB�Hȅ�@B.�@!B�-	!"�BAQDT��R�u�κ��εg���z��������vv��n�ݥ]������9o���|��=��y���2|k���1��;n�m���m���W׆p%f.Ō�b�^������p��e�^w�������qb��p��GX�}��qQ,<s�<N >M��B��!���R�}���[�;�q+67�D��ĕ8
.n0���np�̆v����r|'�p"~����b�!
MX‘��8�p�����1��S�l�ӛ�+���,�e��
�
j�w���ѽW6����\ڔ�s�xi����XJ���$+���܂�d'wc.��#��2��-��޺��[�b_�7�7�
�I}���O0��v�G1�
QݟP{WH{���1jm��<OYΤ��d�
K��BF�3���� ׈n
��NLq=����$�{21�9����ؕ5�Ѭe�l{�m�c��}
�~���a ;����_Q�D���H��B`����,��u��m��l.^�`*���*���0���8ߎ1~F���w"��Pn;r�` � ��λ�P�m���
+~�����(�zB���Et�I���2��St�,R�Cہ�5�ΏǤ 9�UP�Q�
#�J

��Ch����B7��>��� �}=���]8���c,Px�u�b���'�k�����&����j~GI���F
�(�}��L�s�1�.�è(	Qv�
0 .E��
!q�bz���]�Bg���Nt��W2���)�Z�����XK�M於C~ʚ%���X�$���|@5敏��)p���S�=e�勔�Ǡd#�$�Jr�#�K*C at Z�� �Ԃv��enx�:�)
�-��f�$s��S�k���4���8?&"�fE�9�O�O5_��{Hc�q2Kc�^�2F9�)_�<Ay��)(�ѡ�]Q�VE9��*�(Mp+�Фt��l���
�;��|��Us�^��l��
��
����cQ���QfU=�
�|�ƌsd�L��3NY�)G��Q�F@�:��,x��p��hR��RW��€�
+

��WzPW�	[� �jƙEs��jN1��Ǩ}�|H�@��1j�O�'
Pݛz�49D&�N�7 at 9z�_�Ц��G�	��t��|4j
��JQ�U�������*;,:7�:?L�>fԏ��
��/1��*Go�6Gg�!�=G���r�O��4�\�Q|�̒�մoѽ =?ei�Ѭ�_�>
�T�x�
+`5��\�@m��j#�5u��iBu�c:�NVe�fZ�q�1^�T�r*L�#N��K�
�T֬`o�+&��&����u��h�<͔���zS<l�-0��`�͇�V��Z
�
+����VTY��Zڠ���aj�~��,�r�%����(�? ��(-�I�)�QVN�Z�/��#d�DH��S�fZ�s�e5��8m�Qmˀ�Ƈ���:	4u*T��PQ_
u�*���.(�C��'�̾�����~�I��O��LZeҺ(+#��h�!sd7$]�C�A]m4���
�
�jH��!��<�
�r�ܩ�ҩ��i��U��
���k ��	V�gb�9&r�J�G~�Dο3�3�čOݰ'ɋd��IirP}ɍN@�ݳ9*w<��d�[2!k�E��R���
J�V��.��>y�(�C�C��
x�I�e��_3��L��V�e�(��
%�d�tS�V�@uʹ��[h�UIѶ
+��X��6��#
�
D
(���v�B�	���/���
�?0���2���x�m�����
���Y�/��
��sd���?q��
� 5������i��ݧg
����&#?�E^���`!�!	rB*d�
�l�nFf���2�SH/!-|
���H	}�������z�+NR�i2Bz���'�6��� @m� ���W�7���Dd��;����<�GDH�Ȑ�DJĄ��$��#i��G�b��"6F��\�yTd��"\�
\�T.j:Z�S:*����
�� �+\���\REG'�r�IsL��:���Fs���q�<z:�� �p��{�����-{�\���-��2��=��3�� ��L�Váh�G�5֢]2�P�ŀY�O~+y8�u��<
+�e*
�{a��
+#�Z�~/c�`��˹h���fɱ�L�52�}�'2|#Ü���LyV-J�!
��w�db����R�,)r��'�?W�X�Xb''��
-&�%PKG�[̲����ZZF��%Y6�
5��'��R�vv̒+4Ļ�x�B���M�J
̐��&�l.@���藢���c��l+
eS�0��
w�/q�ƪx��h�U4�j��:��q�j����>灼����i06��@��0�{��]1���K%���5�e�dX+��aXo/m` ��ƣ�P�;61��2��������@��:X�v��p
��{���KO"ޣ�br�ϯ.��˥�*��4���q�~�d��%dԳ
ճ|�$�$
;�G��؍
�=��g~Iރs{�Ec
�����pnk*>'͓���|�]%5��!���qw4��V
��B�B%}l�N:��P�Bp�$
aI����v
g9��s��~�D�D�$�<Ɂ'���
=�����Q����%_BfjD�d{ =����YpN�'�)|FLN��3��,19�%]`a��
�B.�(}IN�P�Wʤ�8x��
d�8�D�u�:�1>�J�;�돟
�Ч�[
o��
��p���p	���p��������&����t;�1(�����{@}>��n ��p/���p_���b�?��'v�5Q�5M�+[�4[�R�
j��c��r}Ǯ{Gﱷ��EsS{�����^�
��=��9�כ��	
`.�A�F����hC+
�q�����r��C�H_i!e�W�k����2[�E�B� �;���ɳ�t���Uv�
Z���+�~�~v�uG�M���D�]쟀F3��A#�b�Î�Z̙�m
e���|��??�[�#(
F��XI�
���5��h�H��KS?����(4�H�
�И��9h��b4q�R<_�Z��ق���5b�.��@dP��+^�?��jF�
�ؤ���sb�guC�

� |��h4���)ڏ
$/{��;vk.�r�r�k���m���O�qR-Yۤk#�ވ�
��?�;@��_e��.hza}�D�����
Bc�>��
ر��lÎ�ر;ꔏ�<�-�zU�����v5��ZV��J*���T���
�)W�
��x�����+�>hv@��I��y
_b���h4���ICg�V)�B�^��f�U�l���l��F-n~T���Tj{O����Ď���\�봷�
h�����h{��N���C�-���U'���5v�k�}?U�V���0īܐ�e�-5L�bC��
f��a�J
�h��*�w��\��*v:�"��*p~�9.ϔ�bU��n�ܜoG����E��چ�{�[���E���h�s�V�Dh��������_��wTb
���-pM�<�I*v��"�
�j�[���Vj��F�toP��G�6]T��}e�~֟���h�<w{a
m~
-��*�e��AKM&Y<���u��6k�g/{�U�� ��
�<�X����^�땪l�
e��SF� [...]
�)
`���|o��|�j�o��|�5�]7�{M���R��@e�
U�_���%j�_���OS��&�����*%`����q�*9��݆�J
+���4c��i3T���Bl)Ɩ�� '�z(+�_A�J�Ҵ����Gi��498F�G(%8^B�5.$U�!�Jz�@��������E��vZ�þU\؏`}ɩH��L��
E1�c�ll�����wpӔPo��kRXg��u�����Wc�(��%v
�1
��i�FwJW\�<��\���*�����E܄���c�I`
,���b��%
�ұeJ��&w6jB��ƅ��؈0%FDjLD%D���o+."F��
Wl���
��S5,j��F-�;�
+
6oR��Q1ѧ�
��
kP���V
b��
+UPs �Qlz4�>��D�(9�I�Q&�1�S�9Dq�pŚ�jdt/
��a�44z��t���c�-M���h`�yн\�g�̣�:�0��+*"�EP�E�a�eXT7�(
+.ǚ
b���&Z���q_c���5֥�1�x��X�Ҩ�Z�M��D�?	����\�{����������0��t�^���>|߂���3��s��1�TG9y�%��41�W�1~���P�ŌV�1V��$ٍ6es�[���2��͔-�WJ3-W��A��MJ��`�?f���r��1�
6�
�k`T�
�7�8���b�Eq
g���O9�����+����h���`U�9K��q�&�(%a�,���p���F�I�JH�c0'
�+�
�
	�?�:cx#�%S�3�=�|K!1�'tTN��쉽���/[�P�%��5)J)Iq�$[�����d�-��`�.s�\ŧ<+SJ��M���2�Z����
�bS
�����I����	��Q�g[�)#�Si)��Z�d�Q�5D���JH5ʜ���4�Li��K+R�m���9��-Qtz�ƦoԘ�Т��K
�j��0������;1U�e
��
+�����v~�ۘ7m]���Č~2g
V|F��2��-c�Y1YVEg�56�@c�e��h�K�����oPx�v�e�

+��G��
+�r+^e��ti)̇��

��߶L<G3���L�^��魘
E�iln��r�4:/N�yE�e*ܑ�0G�F9��HG�B
+���F�o�C�N#
w4"�'����V3u��J��E�Hg$Oɕ�إ��v;�SQ�}9��"
+V0\�
+�5�0F�4NHa�F�jx�D�kX�
-�QP�

+,ڬ!E�,�V`�
+,`r���ȡ0
&��2�F75���C��1A
+����

+)��%�
+.	Ұ�P
-�RPi�KS4�Ԯ��B
.��AeUz�l���~��e�j@�~��~��75��
,v����)̃r4�!���Rr�
�:��W����^A�<5d����Ӡ��z�<X��a��d�3A~N��;
��,U_g��8����^�������|���[~]=��^�ܭԡ�K8���"�E;
ms��=��&�(���UtV�9^�7���T��we�zU������o�E>UvyWMP�*����սj4ʳr��U
S�9��9����~��nբ� f@	�p<d���v�t)�2K
+�.�ϕ�.�|�������\�`�����
+Q7W������e��+_�]���5W
\�����
�0���P}A����n�w�)�a��9S����s�l)�
+}t��F���?�\�I]j<ձ�G�k��]��
5|�k����r���RKS?�`�L���5���`?�u�]�	����<τ2G�3�ND;z�4j�4t1���].�<��Jɣ����3 �{AO�<�j�5
Dk��6�o���@�5�����<l��
�}�r�
�NU�Y���M�-\n\�3�4l�+�>���WK�X�N/` ^����

���@
���8���)����a3/�f���fl^˹-��~��**�uv��4�{����W��n�u�ٕ-thF�t2�K���`
���P��y;��N��� ����n
��{7��M.v7��7�\�ĵ7TN��(W�Rj�����g�p�G�˽_���&h'��?�m�M��^��!��A9�18�P~�!�0q�� ��G����BA���l��p.��|�������7 ݾ\��G��� 
�x����`K:�9:A��$'����1
+�G
f�:GM��h�I��
���ކ�* ���]��{�
�.���C�vy��H�8�ZZg�8
�U���|J}��'�|�/������F�����k�~��E�o#v{n�;tk��`�3����?M—Nñ��=��]��
|�m-�-��M<�
��W8�/��t?���úB�9sI�����m|��y=�C��魇
+Џ�
F��{��o�k��:��K�����k��O�B
��<���u:�����=K��[Dp\���џD���l�AOЕ��p�@���F�=+�1�ɤ�I	*�!q|@
#���q�8��մNj�����B)�����
o���d� JO�X��WGt��a���(��V2:�h䳣�:F
G��q�K]k!�����*�Wm��Wx�vjgv��
�B��������m1<�{�/�H.ΐ����}�"�1�++�Y
�O䱜L��Y�v�N��A
�Túu�LM��&�آM��G2ӤO����<����J���p�W0`6�`�`6`����
+$��&!Is�
M�4I�&k�f]zd=Uu������ӎv�6�դ�Q�ҺN�:mk�U�v޷d�������z�����{
>�I}�R��/���xW�%^ս���ŋ�7��Zʥc�:�������\��G����&�dQ��qX���<�pz����}��^��ݐ���s:�����D��v)^�V�Y
=�HӨ5�K�H:ҩ�	���.��f�ƨ4&�$��^���KcE�����i�;�
:��p\'zL�}L��5i���Tx{Y<��򔞯+�='�$�eK�D�Y���5
ί��� g�85��0w����k8�vǢ�}'G����uW9��I�X��c~ξ[�c_��,o��������S�����)z�(�]Qx��!�˷�'&�s�y�[Ʃ
՜����-
�����
��
p8n�CqS�7ρ�E���l8�
�yn7<�R�����_ga���4~�c�+�Th)����_���4
3	1��7r|S+�"-
4:8��bB�	~�&�;a���YL�fW�N��#�(ۓ�2�t���יI��t�L��Ƕ�O�J�|�kz���JA.�=��yJ-�爼
J6p 9��\v��XJ�b1���R�YH��#-���si#̦M2�>�t�S�	g�b"�㙏�5�;�e�����2��|�+
+�O�����	=.V�%?{�ewV,�Y	,de�#���l3������3��a*��pN7�9��nek�4�y
���g(���(�F�s���P�;���."7)��R��.��JŎ�].�%�Y��
�ˏg� �m��
K�(�d���X��ѢV���
�2X4Lq���턶�GIP��ݦ��2=K��e�6�ҿ���7�Q׾H���
�_��Ny�����5�K�/Ib�$�SC�rM6�MN�J����)�&X:@w�8]e���o���
�s�[��<����7�C�_�k��ҝ�6��G�
���Yy�ҾLh_Fͱ
��
���3��k6�T�mq�ei�oi��⧣"D{�(���U�h�:D��,
�xlO�}�fۯ�_��\DVyF�W�f��/����k\�2,����'X�L�5�����v�
��I��M���[��a��S4�,�d���
��+48�/Q�xK�E��Dd�'�{�VwQi�>� f�<��a��Q�S��@M
�5���x���K��+q�
4;\49�p�v�X;HC�$�u;p:�S�<Em���q
���^���?���pF����L�W�uJ������뗏����_�ڜF<�T���49����P_C}}Ά���6��h
Ǯ�ƵL��$�M��5}
k�wůğĿ��"�\��F�ŢKy��z�K�����q��䊧ѕL}SΦBj��p4[�7�Q���݁�݋�=F�g�J�
*Z�ci�O<����[~���/,��*J�R��:�M%Ҩ�>ѩ�6�n�5z�q��mI�ޚNuk>�VֶJ��
T����z�x���#��f(�-Q�[�仗��G��~C���(���7���_�eJ�������"(��Y�R���Z����
X;�Tv�Pљ�����N3e�Ք��1�[(���80EQ`��#.����x�����
�O~�S
+��U.��.HgI�*�1�'���k�*�j;����ʃ��(��`KO>�=&�z�(쭥������z��
M��Iv� Y���
=DF�ۤ�~&~OF�'d�D�wK렴Ĕ�DP�K�I�N���A����?����
�L!w(���"���d
U�9�@�p��A҆GI
�#yd�GΈ�$
?K��Ż$
}����*wJkY�����E�H�M%Zc�U�V����Q�[cȘ0�6�H�D:)�y$O��y����Z'�$��bcx�M��ćOb_O7��x��G�?#~<Š���i1"�
ѡ5�U��I�J�Q٘�U��!}z
I��$�m�8��Ms���`�/6���8�e�|/������������H��u��^d��D�~@��c�L��<�0�"�"2�
+*�
��
5�"(Ȧ((��	(8*
+�+��˩₩
1n�&�D�Qc��%�i�[5�Ǧ�MjԨI�4��4�>�99=�Ǚ�g������}����T�:+�+�
Hϖs��<r0K����5}�ŀy�o�ԣ�M
��Y��j�%H.��r�D���C��f�\

���2`�]x 
kت頫��g��ȇ,
IF;��9�X2���n at 5��k���E��
r��A1�x-��Xޟf���ʋ��g�ȭԊ!+Z�p��^�����9��
+�"��҄9�a	9��Hx<��:�W0���\h���t6�|6҈��)m���4
y��x��8�l����0f�a[o����=�oU�fd�I�;��}Ț�M��
�Q���'��f��R�gx��m��v�h
��?v���p���M�᳇B�C,�1�̬������n��s�ZsI�t�J��k��9r9�k�_/7K4�v��'
>�'�'
-
<hi��H��i��?:^�m䤍k#m� #��HG�&���4�xO!މK��yp��z�5�$�/���
�#���0\�!K:NL^'&'�I;M��4�o��i�3�tΰ�ϒ賋�X�%g۹O]���
J6e%9X'�n�L������
�%��x
^B�@��H+��P༫t��\"7�eP�?.Ӕ}ċ�
+�y�d_�A�zN�ye��r����r�^_�j`}���s���à_�2|W�܀�N�'��
r�1�|� G�������|`�� �y���;��x��`�<��g̘�)Wߨ�ٴD_3�=a�{Ĝ�%s�&��Lt�����t�S�]��?��?��?��'ܽ�ou��wp
.�]N ǧ|�����i�q�衦2)��s�˻̗V�>ŏ;�q?>Ə��q�)�S�&�ժt�����"�_�u
�~�u���y����z��YWz��+��TXG�O�~>�/�~������طb-v7R
�(�=z�B>C,N��)V|���^
�������)<R"f v��'��
Bk(:�hL�~��Q6�OIa�To��S��~-���]����vف�>�P+[�]G���9DF�x��!�
��Ng�u�%y��ab
Qh�@#
����`��5��2yi�>ZU��
Ə��q@���V��f*�%��cD�
��u��X;��;�
����M,�$ǩ�W���5Ġ1
+�㱟��LV���<�H����f�؅;�I+�����o�[����m${
���
+_�v��'�
l�S�#���8�
ia��� t�����N�r
+�3��l4�?6ᇍ�l�>UG$��o�V��*V���[��r�����c�գ��_�K�s��4��g
[{/�^���g���	A'
+��h�Ec)hd����c��)E�
+�����ZV���,""[�.�v���._i��s�wr�#�
�kG�>>wp���e���l��w�U�S�Vw	�J�hY�G��%Vu.�ZꚢZ�L-q��"�|Y܊T�V�j���Z������֤y�-*s?�R�wT��c�x<Q��9�;�đz�㽅WMظn��
+Vz�iew/�w��R��Z�1HC�F����$��LU��Ux�j�g��<KT�5_�^K5ǫAE^�T�c�
+�_�,�w5����������}y��J�'m��|��^-�,�]dt�Bo�x��ۤy�����8Z%�x'j�O��|�T蓧�"��P��b��J�{nUN���������S��Me��
+~{''y�
0�
+ at Cm
����S�/��]T��K%~�4ׯ����*�����5��X��NP����g(�?G���P���M�cUf�M��%�ئ���J
���A���smױ���Ā6lE�泊�r�)Ɨ9�2;�C���(?��f�����e�TV�8M
JԔ�Te��Rz�<�������+e@��lФ��J2
��J4]Qbȗ�
�\�Ն�.ڍ�iTC�s�_�/��2#��r�{hZ����Sfp�2LQJ7
S�i�&��+�4I�!�������8�RB�j��Q�杊
;�4.��
z��n�]���F��f��*`n��ˣ5�!.Yfe�z*=�W��>J1��l�D�%�G(1,V	a����Aي
/и�r�F,�؈��l���CuR#�~���=�;iAo
m�
+��1� 
+��ǽl�����09�C�"�J��	�����(�EӸ�ъ�
��Q)5U��kTt�FF[4b��0d��Ǽ�a1��|���`��!v�
�S\7�y�a&�po
+K#.����M	����̣�>�0�dQv�MvD�}
�}G�EepcĠ`Ԉ\ �Ƹ���5q��i�Fk��U�ظ/MjzbNs��5M�S��Tk7��IO��sf`f�{�{�����K9�Y�eI�PfR��II�HJWzr�Ғ���R%SJ���MJM]��j%7)��MG�`� �������A���,W�}��́z��@��y>�9���J�T�q��� ��d2��ј�T�I)&���
+`��ҧ)1ݮ��E��X��gޭX��`>�x�7�e8نV7�m\��3��0*��������ǔ��.S��R3�(�<NI�(%�'*!3U񙙚����IeP�X�
M�,T��S��+:k���+2�,���=E[
�l"�*3�k�6��5��C!X!���Y�
7%ey)�jP�5Pq�p�Z'hBv�b��5>;[�9%�ʩVd�LE�(<w��r�Wh��pH!y��Bs��C��8�
���hEc�hTB	��*��'cW��|_�/�WTA�"
�Q��B��
+-
+-,THQ��5(��YAE

+,zN�;�u����E��_�
+�Q`�C�E�
����Ī�B9���<��\��*1��U2R��
++3(�,H��"\���d��P�'��
+����1M]�&C�3�xQ�*��I�V|�Q�w�W�@�2���z��h��KUPy0	��"�_���:FbUB*]4�S�վ[=Vc�C4�:Z��x�1ȣj��)�Z��4ʻv��j��Y�~ ���<����k�C��,d����
+(��bjP*%��;&KQS��)�N2L!�z/��� @޶0yq�yڒ!S
��۪4�6Cn���:�b땳m���������\�%ܕ��jG�q�ـ^5�B
k��vj%�{]+�am����ly�=4����r���
)g�D
���d�j�� v~d��VjĨ6b��3|��9w�Z�V#5��YoX��h'���QX���э�7I�����]N
�����P��������J�[)^�lX
=��m�����|�!�3�]���
��rȣ���zf`�>}t
����j�K�4l)
w)
���W��e�
7�v
2�
l�
{Emg��6�k|�m~sn����0�(��z���8��E
BװH�~Rr_&�,��K8�p.�+��*.]���tq�������í�A�aa=��
�G�
���w1�]_�5
ͩPF�s([�\�!k�\�>�Z��
i�Jɩm�*si-�䱎<�S�
Q��
zt!��a�GO��>j��b��`;��6���{[
�V�f�6S�D�
E���V��Fr{���	��6xh���$��2����.�c}���c�����c����}
���ǹ�} 7TG�KH1��Ia�1�y
�5�빑�o�z	v�^x���2
+�� �� 3�#jr�K�� 
y�3�
6�
Y+0��;���g6�~��K8��N[�
���u�?��E�\vih
2 at o��!ނ��18��I��
59͌�#�
�
</�W/R�K
ե
�e_&��*F;�Dj
��ǒ�7��������pj���Y`��\��
�U�
+���\eN>aF�ї�2����gl�
�M���V�żu��ؠ�u�	<���=�w��'-�]U���'��m���u���}�����r
�uv
x�a���}�k���}�Ӹ�_�C<�ω���
<��74}t�WE�/JD3�|t*�-6�������K��A�N�w�}��e
�E|�y\�Y
"��qyW(���
�2�9�?9<�{�=�;�B���Dz�QD�J�^G�t�<ΐ�)��)y���|�<N�B�i�~���N��C�ُ�<�8�$�����
����S�%^�
+^��8��=�t2��a$J�*"��y�I_k
�[��X�����k�
z�
�*C��o�B�ݺ�](�Du���x8�}h��ș�y�k��!~2�f��]ʶ�$v
�m�=j"��.f
�k�Vj;ً�d*[�j37ѥ^}���':�<�����
�ZG��H�|�?�ÉG|#�-t9�إĮ�V棏9ݬYĞK��]B'����bB��Y��
�z�Z7���D�f�V��-7м8��
=���vj��=�E��E�⛈ja��_B�J��R�z��"~1[��R:ҩ���r�|�.t}�lc���+�78���v�ce�+ڼ���
Q蹡�MEǠ�F
��J���B!_�I4&�QK�ј��<v�T�C���	"�R����i�OǛ�����f�8͑v��u��>X��5�<�\�i�0w�|��G'
�X4��HG#
�|4J���=�ͫ
�O����[;i�$Nb'�'�sqbױsq��iR���M���6��Z�:��um�U�
]K+T(L\�Mh�	B�6��&�B
Ć
m0ډ3?�?~:�w�}~�{���������c�c/��
�V�0��]�b�
-�|Q��_�75���������O �op�}��������$��1�s�4WG
+
:�kѡ\����i5ϫ��~��j%?�L���
F�X0���i�*��\ъv�i���f�/hGɋ�*��ɒ�5Q�&����>d�
+���e�E���
��i׸?�-Ye,���-5j�Ԫ��J-����ЬyC��
=�i�j�׌!�
Ɣ��iM�5a<��Nj�Į1]ר鞒�ה0����F,Yڬ^F���z����Ч��}�c~��,lZ�s��Lf���1;5mnД�E����am��i�2�1˘F-�Jn\���U
c>�nzRq�U
Z�j��u��~���?��>�.�/8�l���>X�z
{�f,3�qږ�)�Q)�&��
��i��U�֦�-��������,�x���w��n�m~Lъ��k����s��xUa��
+Wާ���y��E��i�t�-��<�3�M2�s3���6{��f
��5dw*n�נݧG��
=�9b�V��r\��Ym��(T����O�����5w�U�:k�oÇ�g�Z�I�����"�r=I�8ce^Fː�H���_mU��P�Y�^g��8[��R�&���Au׎*X;���Eu�
T�����o��͉[�=�������?�kh=��R�
��io�ޡ�yd,}�<E]E\�]���V�U�.W�:���p��^ߧ@}B��I�5�R�g�ZO��xQ͍���������o��;|BVW�9��4�c@
+F�j�g�{�xr��)Q�cR�Ǧv�CO��<�jmlS�7�oT��!57���<'o�}'��]P���[�"w�w��\ ������i4`?[��0���e,aBGs��F��6��W!�ϩ&_��->�TckD�ָ��Tߖ�ۿG.Lj���j7T�2|[��/i�W��?�ճ�@s��u�~NB��/
]�m�|��5��j
���RC�%w{�j��c@�
��霑�sE՝GT���*�^���eٻހ_p�7����ά�濏�
�Y�jN�~�#?�����
y�J���
+ZU����V�n����T�
TeOL���CS�-is��CO�,|
�$[�[��&[�=��>Vy��54�И�V�A:��R��#Շ�}
rn1�*bQe�\�H��nU�����Ce�٢C�FS�]�C�;'K�̱{�M�b?�9�WY����7�3h��zϣ3�N A�ۄ%n�໣RU_�*�KT>`RـU�A�6
�j�`#�e
�
�)>s2����/�]��_SI�Ǵ��0� �:��
tf�|�0�^
B�-��'F��)ՃR��u�P��A�E�D�6$�dL�eH��K�ɘJ�	'w�(�[���*H^T^�r��*7�C�%~(�c
Fg���J� D H�~��h����O�b�l3��ɘ*QIʤ��&��*Lժ ը�T@�a��تuL.����EL�%�*P�l��܎������3��%
C��e{ˇv���LJ�m���<I
6����b���3K�O���$�����f���4/��	�xi��4ET��i�8�+�{�@+����A
�$�Vb�s�8��c�F���,ڵ^��ԖK�%
�2�~���P�p�g��3,l�?���
+Em�$P�f>ϳ��?�ݿ�}�"�	��JH��%�:bv̠���RѰ$�H����@����p���
�h
Ĉ
��`ּ�>�5&ym
xy��X{�g(b����5��
s/�w���)� 1WΣ���0JW�AJ�c6��ԔG1���	�#�u�ơK�?C"<˚�eße.��o-�q�3<�{>M�z�mx_Sh�B?��ʹ���
|���5�[By��=g��®��r�'����oϳ.�0�g��K��2{�9����	�2{�2r����{�������	�8�|oa�<�!�j��
]�q�����8zlk
=�?4��W�Ә�녘r
�
����D��
��
����6B���4-�q���EUs�wJ2�1�sg��
����t�@5y�q�_!1&@�� �p
7�" � �V�}Z�V[;�S�n�U�u��^�Z����Yٺ^�9�����g�tk��s�Z�5�a�
�w��/���������>�ׄn�Zr�1��x
v���� �fK�0�4&{C����Y����i>���>椏��� �~��q� �>�J��%?��A۹B�>��z�Ƹ%�9����j��]���
�c�F���2ur��9�A��Ca?/�~곟B;��i��8�'U��9@��m� c����A�g��|�FW�(ćW�$�
^�~�E�a{3ظ�!'���}�q��=/�X�Rl�
$�I�p�.G�&��&��
�ҝ���j�K�t�>�o�K�����O�l�H��1�������ӝ��S{���7$�

�ۘ~S����� �����M�̫2ґZ�v�>����
�Ϫ@�V�O�S;�tF=ğI�����
|�����ݞ�pOѩ���y�
�e
�	\���0]׹
��<w����2\R��@w^6��2�
R[��(�ד������b
=z	/��|
��Q|
a��xi�R��r��_��G�KV���L���
�v,t�rSk�Ɛ�2C
�K�����@�b�� ��~M!�t�����(ޣ�l"?�Z��I;��η���q2���n���?Wѽg��@Yk�@nj�����c�i}���ɼl�>�i"�'k�
���L>
�R��X���f�)������'Z��:���%t
,�e�v+�-�H�|';��!����.'v5���L�qTa'�&3�i�B/��mt9.�h�XI�dn9��L��?��E����v(��
,����r��5�^q�O�Cr1��/$v9�u���&�q'�����
-��[|c!.��yds.3:�
+��O�n1���.��̓�ي��
+��U2�E|�
��$���E�/�"|,��||���\�q7��˺������L�OgT��T2�Ce��O���8[�S
6��[���.��R^��/i8:4��D#
�<4��(G�J3�1�y�J}�P��\M曓����T��p�$�:���������`�v�� [�6��
�jV����
^?��!�=8-:q���HC��h��(f���S��wԫ�Mԡ�AS4>�.�
Y�����2�a�
ݩ�Ѓj
+=��!��v�A@{���ql5[�=0f��O�5�3\�6��;ܠIC�tg�U�aɚ�R{X���i���
�Tk�h��7�9|���u�q�
5D,P}�J�En���
��<�j�I�
\���hn8z�`�
�fB7�]<��K^:�C�n0j�!F��x�58�l�P�!G���1���X�:c�j��m�����Ue�����Tiڨ
+����I��߇�4�k��#�[c#
;zy����\�s,k��4G���
�F�I
�8ՙ�5�j�9K�f����U��Q�Uլ���E��3G%1�Tl���,�T{ ^�/�=���
hZ����W�L����
Z�1yހ�:��Ɔ��bT�%Z#-6UZ�Uaq�̒��X����*��Rq�ƍS����Yg+��J��U�m�r��);�%8
��:�0Z+М�Qt*��Nh�1m���y>G�BTa�T��,�5VŶDٜ*�e���/�Hy��&�)7�U9�]�N�%�}��Ik���2��*#��\�g�s��ó�֣���T�=����
��W�|$^h)U��b{�
+�F���ʳ��'+מ���le'��I.�;�FY)��L�T�c��
���|P���r:��#�x>�3��z��h�L�9��eHc�_#yV���R��!�:
�q��q�)ˑ�L�S�,��yJO-QZZ�R��L�#}�R\
��z at I�Ge��Ǖ��6|��W<h5�
ћ��<�X�uP�u9~��� /^�N���
�I.W��\6��R��pɑ����"%gV*)�A���Jt�(�=O��U�y�/��G��	���}U6w at +ј�f��y�PP�����ϼ�L���C����D)�3BI
���iJ��(!ۧ��r�rje�mӈ�)�˝�X�}�xQ�w7
U��
��������ؽhN�%i��� UPE<��r�{ ����H%��o�-?A�|�F�g*Η�X�__�b
+�*��KQ�2.���T�
����^pQ��C at KП��Dڑ�P
�P>ȅL���|�}�^��d+
+W\�Q��hŔX]����tȑ�_$�4��(c�,J�*�t=�T�����O��\�K�%7���ME�
�F4��
� �g��R]�AQ�g��]w�EЪ(*
+�-,�����
� 
+B��
m�ă�D3i�F���Ui;1&ͤ��N
k�
N�c�̴�L56i��֣�c��,�d�?�Y����罾��}��F�L+�����`��WJ�Q��dv|d��ȕ�Q
�Jv���\*��C	�~�;�+ιO��c�q��X�����^8V±����`>(� �
���*i�
��d�_+�;IF�YI��J�d���T�'[��y*�u)ڋ����'/ыp�| <�<�_h���&����q;(�@
1τ;�~$J�
~d����ʼnJ��**�@0�
� � � :3��"$�� �*�� ��!�y���U��Rx�P	J �l�L_��qÿ~L��l�u1JXbPt|�R.�Fz#ì�C�H�	��
��N��j�ų# a��K�gpK-��/p�
+PH�9ĜE̓}�O?���/��Q�_�µ�EgKO
�F+�k+:w%�K�����F.�(\/�Q��u`;ϰ-�D����M��T\~�vPB�s�y&1O	�_?��f4`��9��V�AZM.��?�P��px�s�{�E�z���3����
r
[d������!m��\@̳p}j��Ϋ)��$C��7�X�l�a�X���?X�6N`���LM6s�6�����U|R�M�y����Sp�w�+�TQ�"
͡|���ի^3uK	a·A?�

�XWY<���e0��":�����1�%7����	p�;q|'��q�������L~x�Թ�|���Ӊ9c5�=���m�p>
+�����q��/�O�=��r�,
�w��}�q�K� C� M~���'��q~g���<�>�,��O�
ڙ��zb/��k��u?#|a�g �D:a
 /�Caq0&�X���k����u�7F��4�(�8�
!��8��G��䠿���&M���������
s�A��
";`4"�hu��&x����`x?NsfO��8�)�������w	�/�:�r���΄;��M�6���H��hD�9p
���ɈH#��88r�p�u��\���,b���%�%
+~��O
+y��.����!��M��w�A��Q���j�@�|�ν�:���+�OQ8��|�����H���❧I~E?"�sp����h��B�p;�C�-�>�U�n�3o��>�$}����|�Q�X5���=�:�7j
��~�{��
���=Hj���=�k?
+�Ux���3z]W�]R�t�+p�k>�\P\f�Fi�3�
�[G�P'�^��uz�|���:��z�:~���C�E�
�0-��{/��J'i�
:
���A�� ���ƸE���+Z�d$�����,����%ض㷋�\D�����K��è���!�A���6���
�]T�y�xs�cu��9�/���pޏ#��N�����[f|�a
+Gb��]�m;V]��a;��l/�n�v��S����<��7v����#��dr

�E�A�+|2�����;�1�7bۊ�t�f���.�v#ʎ��^�� ���DZ��=B]��F� �yB�z����
}d�����%��,��ã%2v������b�\lQ*�'a{:�sυ�.#�U���{���~=�7Q�������By��
��5d��������f'�ީ��~�.�=��$8#��`;
ۓ�=�b��eد�~���
?:�C�ZE���Ko�����
+�rz��S�L��9���q,���Ǭ�`#�v
�����pF�H�o�~:��b&'2�B".��
+�8�p��@w���tұk�����uԣ�j�� �.�����3�H��x��U3 
2�_	Vq
��G�-*
3V�ÑG&
��ȃc
�e�T�� 
<�x����k1Q�舅��K�y�t7��͉w3	���ùs
W;#��k�#��w3�p�5&Ū1>Y
1�G�T5I��i
+De�=G����(�\��jyc�����m�+�U5q�r�
�?�����'�����L8����4��^���z����J���KXk�'�/S��IF-6X�3��k�,�!K.�l-H�WMb�����H�Qu�O��zU&����.U�Uf
R�q�JL/��tBE��p
|�'��6��\�p�-�������^~w[��6�2�UcJ�Ӕ�j�T�M3Te��|S�*��*7W���U��V�㖫h�jͳ���U����k}Es�o*��!���=��pm�`�c
m�zk ���.|q⛃��SbUeMR�Ţ
+�M�I*�NS�5[�ֹ*���Z����S�;�Iy�W)7u�rR��٩O+���f���L�9p��{HC�����
+���U
|��w�*�_��Ԗ��T��RST�:A��575Ksl�ʳ*�V�
D��Eʞ�T���5#}��2�.�5-cD��55�,��!
¿���4`��$�
|��e��}��o�Jx
 b	I���5AI*����;��œ��V�YK�f�n��V�b��UQ���y�U���ۺ�uն�]ﶹ��]����n��9�	d�
��'y����^������z|���*|�̍W�%Ye�ty-Y*���R O�G��r��jU��(��Ek�
+&-V��_v��l�4�~PV���g�~�<�mYm���j8!
:�h
0
L�ܫ�J�)��JA�� ��(�ͤB[�
6p���U��J����kRA�����s�R��~Y�;��|Vf�)e;�ו�%��?��
+�zX��]�
p
��U�[(�p9&��HQ�#]vG�lN��N(V^�O��S�k�r\m2�{��^�,�&ezv��yF����=�V���2��h���oh*���ց��SJ���|�w���I��cTn�I�"�r��e.r+��\Yŵ�,	�TҪ������)ݻQi�o��
'��}�ܔ��
���R��Sp� ���@)>”�߬�8Ki�̥��*�Pf�Y��I�(/Tz�T)
�j�hQjE'�U�o@ɾA%����;�Ċs2T\����*>W?�a;���R�ԃ�|ǤJ�
pϊ|�THپx�&')�ʨ��Li�ԪP��*����J�nRbuD��ŚX�Fw�lU|�^�U��	կ�+|�D�U���ݬ�m�o
���W
+<��w��L�F��j�V�����J�e�۔�wi��L������@�أ+�,�X�#�,�~o?�c�-�b���f���6WBQ9(.��ÝW
-��RZ N)S
24���`�⢇X��$H�)Z�Bh�B6��
�)B� �&ȖD$4�>������TP
*1Q
+<|.��HF3ńٴF4P(N�i�O�;�J�N3�X3��

.kᡖ&��lAĵ�)��0�(��4����1���� ��{���$f[��3����K���7�E���,^�m��f��v��
)
�
�#�#��ψ�v�l���/�
d��x��:��4�z0^o��
�Q&R1��&�J	ȵ	�����N��y�=/���亭�M�ԃ�
����>��������!�g����}�6blS��|�s>i�m��d�7yp.�]�6��E,`��c	5Y������Q�>����9�f�q/�r9br9�c/[��y�fg�0��%�� �<R�I�Fx��K��� -Ƃ��+��j��'k�cmt�e����g���3���~i� �'�җ_c6��QaR���k�
�����̫WFx
K���(��
&ρu`= ,�k��	,�����A��R�0/�A�A�n��>�.m��m������,����o�:�H��C���Y�k�7��f-�������Pl
,�`�'�&'ߡO�Q�!zt�~��
"�'(�~����sbϫ��5��*�]�Msv��,!�{_�3��hl�<&Bh-�TlDŽ�0 ň2���=r?F����(�8
+����a
:t�Pu�V���r�4�%��-���|��4.�F �&�1B�Jg蓳�q��\�����E?O��Ar�3��!pF�p����v�R�#<�+�;
�<�a�u:��Q��x
\ ��(�.�A]�6��������}f���J��#�+�{��^��8���i����
=s�yS~}������=*�:�+��G
�/�P]Wiԟ�%.��~J�~B�.�i\:���op����s0�^/�c��_������>Q\f�
+�4�G��5t̻j��L�?~�ʹ��y
-�J�<Cs?��D��P@��L��:�	�t
k#Dw��Q}�;1�?������R�1�
<eد%�Sue�2~�ƏS(��
X'P��84F��~����6�f

�s0>C��xЙOE������������h�4�7�jvP�}��hũ�߄�3�,j�i��0��)�(�'�
+���L5���{�� #u�̼M��`��pEW����h���T�՟W<~�`;۹�v0�Ŵi%��m�x
}�
%��rǘ��
as9��j�j=��7�{L`e
��R�5�:�%.�Z;�����}��Q`�O#6���Z�m/���u؞��{�݌�VlE�ݥ�����
�Te�� ��е/��i��Vқ��b�X��������1��\�G.��t욱k.l{�]��Z��쇰�V+�#
�]L�b��
+Y��<H����0�
g����?�>:��1~6
����ktv
�5bׄE
�g����?���R�X� 
a�2)s��n���M?ӳ��ٮ:e��05&9���(�F�����d�}�{���\,�XH.�&=�F�ڍ��c
~t�� 
!셱ۦv��,�n�/f��:��z43Ua��K����H}$A��+oX&�fp���:9/:��
jQ6��LC

8J�dR��r���u�a���ĉc;Ǘ�N�8N��vlDZs�:M�$m״	��K֭�b�BJ���A�V�S���
�V�1D��m0�؀�A	h*h�6&.ZQ��PG�'�e=:�����������3H�ì�1V�*f��젗���
�c%����X�z>���A4�lsG�X
㰔gKH	�����
;�;Ѩ$� :u�4���2�t���o>�.&�	zg=;�6��%ʯ�c�³�x/�U�|��8fw��
��cn
������i��L�"��.��|�5ը�\�nsL]�:�Yuv��0����-W�x�Z��(m٣f�A�,ǔ��V�r	�����v���M�{�R�a�� G^�{
���jSW�����K��VZ�liD�ҸZJ�J[;�l�WʺPɲ1%��(n۬�m����j�S���"��
+ۧ���:��\G8N
+6
+C��C7�]'��c�aV��DY�]-v���J��~%�uJأj��w�)��UԱ@
�1E��(llV��G!�~��*h<��G
+W�^�k���[�K�Bz��N<Y޵K3����JV%
��K1çF#�#��Ѥ�3�zg��C
+��(�Z���p�V��>Uy���9-�粼���u��7�
�;�\�MZL�3���v@�gi�%���r1O��5�m
+�
ջ+rW��]��'�O�
�W�T]�HU�+��ީJ�.U��q}�����\�Kry���r{oj'�荓��@.�pm�4�$x#�F�E���[��ת�ס�ץj�WU� D�J�[զ��~UT��㟐ۿA����
|EF�pJ偋r����P��Otk�#�Z�!��kR��]��'D���~��vy�*��婩��&.W0#g�G�څ2j��<4)Gh��/�ò��RY�
����cm����݆]
�
h�44O#��"���Ye�P�P�\u9��r�Wɨ�Uy}�
�4t�
�'[d��"kd�lUidJ%�#�DN�
*��\��d	��Կ�EسA�,$!�=���P
�<wG�r6����.G�){�R�h�ʢaY�	���T�%�Hű�*�oRa�^��d�?���*���*���vt�#�	����ih�Y#ԣY
~�}<�`�1���%�%m�&
�$=�$�U��SQ2&s�E�T�
+R��^��Ҽ�{��7��;IƔ|f����R��(� ����"P5Pų
+l�3A��4��lQi�M����
+��
���h6x�VLk+yt+^�o�Jf�%��b2� �cfF��{1u簆��	�Gc�r_ͳʤ�¶�c���m��������f��F���c���oՍ��Ƹv�
D��=d
�/û,��Ӯa��6h�&�5@�{?M������ �&��������|nc����� }1�G�x��a���)r�
�e��m 3���h)m�x7d!���s_C�}Y��5:%U��IE4O�8؇��9\�0}1B_����2yG�Q>
�ˀ91B�4B�6Lֺ�"��og4�� t@
mM@��m���ݍ>���T�𚱮
��ib�8d��6�cL��
�l�l&������q�c|-0'�3/�
�<~w�4\�|tz�����F��aɪ{Y�נ6t-#���Hb���3ı�8V�j�XC
�c�1�d�O��T��
+�3
�
o�c�e}~��z�����.hE7�5L��\�=5�-C�h,�I5$s��o%{sI�
��F�Mı�8�17v0&;X����T������V����f������H3׆A� !s���+��+�z
))"�ö[�/:@�n�dw�t/��
ı��v?��~ޗ��}�S��)
+�k�yR�{���꣯��s�"!����R�t{^sk^�n�h
+Ƃz��8K!L�t?I�!���q�8
f�
e�
ep��#Tx�p�l���C����N.a
0�U��X���R��|�������
�e��>oH
���]�)a�0K$������S��gX'�0ٟ����q��%=y�2����ղ�1@ۏ�k#��VR�+�{ ��@^��y3�xޔ��T'��Y{.o�?$�
��%�K��E&���<{ŋ��s�g�W
� �
�ml�}y��`�}ò{ސ͚���:Lm�`VKs��%O�,�~����c��c���l:W�� �{ś4썓d��ŧp����O�/y��C�/s�
�/d�"oG�G��,���~��~ͤy�I�K
��L�W��W��^/��}�_%Կ�,jg���'��ހ�
�Uf���yw?�6
sZ)�
+��:���2q�����Ӻ�{�Esx���q���~���
&̳�g��cۼ�8��m�~��v|��;�
׉�8i���M��鑶뵵��)�F�=��C��ݠ�$@��c��L
	��ILHC�C􏩈C�����$P��P����}�~���{����<$���%<����t~�n�+k�|>��
�
�ݜ�7�3
0�(_f�ѯ�=���M�gP^ <��?��QR�$�gH�GH��X��x�<	r�/0��{
>O�߰y
ކ����!���$�=�~7�V��!Rd
��c�s�e	�e:�#h�$���>��+x�y��K��+D�gt���������*s��B?�Lm*
���у�_��u���]S
�2�5t��������,���v��#Wȑ��q?>�2�S�{R�#��a����Cd�C����/6��k���*<	�3������ϋJ�\;�-�[Cw��6Н@w�Y4�:0
G���t�7��)T 2��d�	�V�9��
���-hm[���=�c��0g���!��X��=��G�G���
��x��l
'[�p�<��Sx�<���:Gϟ�#~���)�|��{�6��o

'��h��Vt�aE�.��U��F
�&�1KT���0{�l9O�.��:
�H��������:7�Ŏ������v9V� �]7��&D�n�,����n��_G�q��ɐ9�ߏG�5�,N�	2i�x��1��1v�1v�q|X��c
3g9򎳥-s]�y���l����.���G;Q��gYl��Q�� z
t'��]��C��óYI��Ƞ��o�p
�ͳU=���
sp��Q���ZyֲQ�M:,��������6rc�

e�4ԁ�6�ب�7��6f��~f��HՈj�x�2{����?���]��>��3�=�Ѳ�Єq��Q���ϰǦ!�[[��-&v�؉c'��
v�ة`�;����f�L$��G�S�\V��Y<�:�ށ���(�Na� ��<e�4���[)���3,�y
��[Tu�uU��j�-��-�n[^%{�����
�*8���ة�sI9�1u�V�u]R�u]i׋�Rη�R�u
'����k��c0�}�{�/e�Meån�W%�_EOPwT���r�.ux*ʶԕiU�;��w��}G���wIq�u����UE}o�{�z?�
+6�`o�Rc%�
A�=�R�]	_�L�:M��~��O9_ at Y_X_\i#���W�QV��W����Z1����c��)l^Q�|NA��#��_�_
�K��q{sQr�r�P後/E�u�K�!��A�R�G�d�TŒ(n&3;5K�kj
�(
l*ZT0tDfhEf����gᦌ�k2Bo�z��?u
+�7K�3A)<}Pᾄ/���
���Z��+r*�*�5R8
W(�Q0ܥ`k��֭
+D����=$#zZ��c�Ʈ�%�Uy�ߓ;�&ܒ'rW���{;i�`�R�ʵ
|��.����Z�����z�2cAbQ�c����2�e�u�&o;K�~y�Nʕ� g�9�_���;���\�ğdO��1��פ5j@
*P�<�dy�—6��-�ĭ
+%�2�.��>�|�ay�ji�ȓ*ʝ�ʕ
�3ݔ=�$[愬��e�pf(H��i����cc{S���P�2(�:x��$��!��(��*�n�?�/�UK�/w6$gGL����
���*���)r�
�F%O���9�s*�
r� �g���}-ck��l<K
�J��Y_R�o�(��f��g�2r.�tz�,�LY�H�.�E
_���"�S���DsV�Y(� 9��/�wo �K�}���>���@%�!��4����
+A�hߌ�M-]N9K-�u��ma���*$MG+],lj�
j���@���i�CeP���P�o�)�C���$P�n��N�S���!��6J�@e�����
4U6�]?M��S'hu>��[��w�4qu��:�@�z��J�����ʱ��{�-�hAz���<�2�Lr�r®Y�~���ΚE�~��A�!�a�h�66���@�A<�0ǀfq�&m�&А
��ឦ	]�`
ta/��)�q��
�ĮQ�<Hr
�2ā?B�;ꐶq��3�d��h�M���5��I<�4��ɉ����I��	���w�&�V�B{ƛ��!��]��a����6��)h������8�w�7�6��b��,
�x��e�s��n�Y�ݙw�]w4���Ս*a7�5I{�S���u����5�@�Q4�L�)t����e?~,��abr�a��0sq��q8S�
$'�����}���j�N
k��)�
e�A>�a�E{HY�a��Na�V��6
��3]� [...]
Pb
F
+*��e(P*�S�S
+J��/Pʥj-2� ʴ:�ڱj�
3���H�m-������ɞ�t���;��o������el?V��~��Y�pYKb�r�5�
c̉ջ��c,N����Y{���&Μ��&�38���]�p~�ᣴX���,�k�:g�HL6��}?�ѯ�'���	�v
?��m�I[�����-�����~x;g�r�!�q68�w�sΕΒm�
QQ]·�˨#
r�s[ � 7����c?}��&{�������v���dV��ĻH�����"��8���s��IKi�&x�A;�.G��d�#��#�h�^�e~��WN0?H�
��H�3�(�qe3~V�p��N�
�E�j'�[��ٜ;�nG��<�$�����H9��X<
�WU��~�H<^�W^ef\�.�
�eu�qD�I�N�
�ۿ�����^p�᳹��ϏU�6�K�<`�,�D$��+�5�>����>�ɿJ��Kb�&�>�f-�
|
+��������������Ol��������.>�I�Q��Aa�M���2z��
���2z���Q�{u��΢k~��8����	p
޿������z]u
q-����l�$.��%����~�u��9G�e�m�~<G���HOQ0'H�q�o���qt�x�=�;���x�y���W�V�w��3��v/�!^D-<��8�~8��9��:ΰz�A�4
+�)�w�&�>~|?�D�~�bz�":����'����~BiUh�
+^V�Xe��]��SNڟ&�h�q4�8Z�j%v�؝�lj�~��>�^�
��n��.�N�C)��u���}�v��!�~D�_�v���<���mv�\p�ǝ��;�v
�d`�IЈ�"v;�;�eZu&v��;�#��bl/�"V��c(��p<�
4�z"����%�kЙcp�_/;mu�i�G���:ў�؊ 
�@
�EN�A�{�;�ӱ;��a�rX��e��Q��Û����� ����r��W��+b� ���f����8
�S
�
a��@䩾"�;�=�}�
��ll�>B�~	���*Y�o���a���T�1�v���|*8�=���ط�{L�cz�\��c� Ql�z+�۱ݍ�>l`o6

�;������s�:��>G��NU
QuCt�
�~��1l�E��о��kپ�
Tc�	��~
���o�~���;@V�d
��jY�dg:Y
���G��-��e:������5c_	���;�~�σaWuM�C,��lr2�ژ��T2��c������^��y;u£��)TE
��G7Y���.���wm�k�Uh9W����J4f�<��i�S&���Tr2�ژJ���G��h���v�M�nY��m'�� ��dvQn��Kt\�iUd��~E&q	6qݏr�-e�/`5
3��
z�nz��W�n��A�A�
I8�p4�Q�^'����t���UR �Tx��'�y&@#5��Th�G<�����BV�a֟Y�
���:�l��<*�jU�TtG�ꊂ�
+���]9x
+�L�f�]e�\s�u���u�2�U`�Ү
t��<x���}Fu
a���V�B��/�|)n5�|j
+��j�E��5��&���(�̓���N��}J���|�T	����7+�T���,�Y�˲<�e���{�X�|xgq���ɠ�xW M|���(�*�+
+*

+�*�TH*�*
((
lW,8EVp���<��%�Lc�"ƣ�¡3�U��Z��E�
��5���xn�}
d�#�Q�Σ��_�H@�pH1#,ˈ��L##3ܤ(B�1��T82,�Q7�P�&뾭@ݓ�j#��U�#7��/�7�4�IhE�̻
�e@ҬQ��*�ˊd��pE����@��ht)d�4oW�\�Z�n��
�Yߒ�:(�uRn�pE5�
-��|��9�H�.�
+<7���%a����L��f at ufPa3$Ê(d�
+Z	b
���X���>y��$�;�B5�ur%X|�
	���E�Ί}��ṗs&�o/�E�̻,H�K}ܥx�#+�iժDb񠂉�j�����O˓�˝lSM�G�;lq�f�����܆i���	�I|H��bx�S�GdQh- ϻ|I�y"Q�X�+3�SD~��
+&��
y2�4Xr5��
9�g�Ϣ)���
K{��ca�q+�X³��Y�φ�$�/�"\C��edj(�f�s��I>�'ݲ�=�&=� #�U0�?�;���ӼMvū_nF�5#\�O&~���mX�fl�ؒ��!
|�|e6���;A+h�9�/)>�O�&�d\2�5
+����r73D

�V�:HJW	������xm�ǶA��lc�oC
��%K��"�K+>�|��pN�+=`hi�y׀)����ޅ��~�F5}fa��X5	�Z��Z�"�
+nUƱ�3h�:����Z+ne��J;�=��HYB6BIH�@���P� !Ѻ/��N�T;ն�K2��x:�ɇ�0p�=!����������?}f��^��L�R�p�φ��`@Vr����@�G�� ��A�w"0<����A! ��\�ŜԪ�X<71
1
�'#�h�G�����w_��C0"
��
5 m ṫ�`
�
�",B�",B�P�G�b��P
�!�BpS/� ���t���3�Ϟ���ߧ"�$�
�����/��0����`
%�����:�B�r�Xa`F6;X�Ap��ٕ�Vb�\���r>�i:��_PK�������
�-��:�G��/�Ґ�9�c+.q|�h"�|�X�
~5.�5��uб�Fl�
0�a
|x=��u��
��04��.z�E4)����x	��C�$����Hl-
�
y��ױ;'�jn�
i�\
W8tl�-б
k���؎�nA�
�pNlEMla�Y�6�{ר`�
+��Y�;���y8���0�
��_�w97�=�Ec�g�@Ҁ��=�	
�б����Q�R$Ή
�{P�1��j������`��	�<z	� ��aXB�5n���&s�;J
M���BD�q�
�~��Av{%���|�{
,����wQ��G
��\�:h����Ex��5
�~�<t�;�Vw�]�|()
��4�1�#�<�=��J� DQgP�
��6�X
@s �#Lt�G?�zj�e*��{���;�
~���v؝�;O�{(8C��#
�\�
+���F�س٨
)�S�"̌��tN�T���f`��#�H��8�00��;�Iw>B�΃�Vݕ�
�Y�k`������(,7U
+
U�+�'F|`���
	
+ ^�EMB����@n/����+i�Q���'B/ p�aT�/D�;��C!��X��B�"�0�c�r�>�Q�8�
8/l0݊���M��?�xy~n�0���7|��c�ǎ�0q��)S�M����s��^�(d��^^�2l�/W�Y�n��_�z��W�l۾���ܵ{��"�ވ��־�o|���#G����?�����>���3L6��ğ=w>1)�B����Y"�D�-��U�5�ڂ¢�Ci�����TS��ź�Ʀf����f�pvv]��|���nܼu����}�ŗ_���o��������~�O�����D
%�}�y1�<\�'�_ �g��K��<b}���ˉ�_��+�� '����	�HB�M`8 at 8��A�Aq,>"0X�8�d$
D���0Q ��P���p)#`�@�L��6-��F�8�n��#����m��O��@zH(=&����c̾�dݽ��z�~���x�
�F���������Eyy
��=
�
%�����
�G�	�� ��X �'$`(�,�K?W-=C�
��o"[	;��=Q�o�;p0�ȱ����4�Ï?�����!Idr�
�-�bX�w��AWM�1	��	�0
+��z��޻��}�_>x�������o=z��;x��ɓ�O��k�M�����uDT_�_��ba~Cٖs�J��:C
�R���
���Z	�G#������e&\Wf���HK��i
h�0�a@À�
4���
w�|��k��f�dKe����Uh�_ݯAų�s��94H�A��Se	�*�g�)�A��x�Ӏ�	���n�_To�O��*HSo�Tb.�W]���ޠ�Z��A
�Р�%4(��ײ3n����膆��>�n��E���$YL�!�`*�_mԝ�/Qs��Р�
4�y�"�y��SIf�uaƹ���gc,�i��0�,5���pCu�~S9Ѡriȇ��۝+�]��xW�Y��"��Z:��Ӹd�M�3�^��Dv
�9��7�V0��N6CC4��N��۝#�����>1tdBG*�������@C��'�ie$5��h��ͥ�o�t��Р���Ur�S!�\ʖrz$N�:Ҡ#{��脆�ƒn#���Hi�	Кʷ��kJ��
+�A�˱)s�Ny6�K"cwgI�=��q:E�+����6�
������Zg
+�U�o-/�4C�TР�a;�rV�(�Օ
�Б�u9'�_�4
��q��b���f��՚�
*ʶ��̅ڸ�|5ǢT�۳,�8��Ȅ���#Eƾt^�鎗�{<��6�X��jwУ-VZ��zQQY�kF}QL�Vנ���<V�Dɲ	̎�
�#E�r&�ٝg�9]|ak��۝�%m�[
-
��j���tg���p�Zנ԰�e*�5+�ٖ�d���2�
+VG����p
\9��i���Ϸ9��[
���2CeX�ְ�RUt�6� �N�e5�4̖t5Ӓ�b�&�I���.��ps�6v.��iXm�q-NzX��
S^������J���YVwQ�c�gh���Y͉VK��m x*����2��
G��6������A?^T��Ra�X*+��5���j�������$
�!A�nh9��|N'������h
G]ǰ��.چr'�=U��t�i�.�4��'��$������l'Nb;niP�� 
q[�
�RN
��RJK9 IӬ�"���O�l����i{�%�Z�6[�mْyKҙ�q�L�8=��\8F\���w�����ߐ�LT�e�$
(!�a��S�
Ic.4���
��3l'��u�߻x�=�ن7���Ӛ�VTR��L�z�"����_�E>�ϋ�I��h4��X��$�&�}4��9߻����w�?���c�W�{YE˫���}�?
���Q
�
+˱lp���WDL�|r���V\�`Ɖ��
�м
V��mӰi�4l6
��m��{�Pdž��g0|ǐ��0��a���V]ց�灡F!ʺ[Kn۹�l�{�`�����?�)`�o��h@��l��ǧ�"���sf
\޼�-R�tɌ)��N��m-���n��ë�=��
+�5��e�'#1=0h�tH���h�#E��A����g
"�F	��V�h�•��I�b�m�0;;�6
���������7`�2>���A
:�S��
�vI���QĢU�]1��W
B�%
O�Xo����L[��n`�	�`�Q/c×���hޫF'�J��cs�_��+�!��DtU3(��˗�����vj�������Yy�`xN +
1™�
-x��[�V
J�f��
��Aƻ�
��C)�,�ȗ��fjkۭTk���ë����K���
/c�k$f����L��<z��Ң3������AA�h��%��{E"_�(���v}Ðn���ѡՑǀ�E{�v��X��|!
��33Z�Ѳ]��X4�A�-j�ؒB�/K�C,�_)%������o2-�o1ã���{�z��c���[O�v�ˈNـ�6�V�Ԕ*tA�D�����@�]�)�K�����z3�c�7�
Z��f
�۳��{�p�~.
qte<�`7"e�
����Ui�9��
��!8��\$U����ij��ݱ�f��V�Xׯ�Y�!C}��Oł����)�	)
�ZU�:hF����x��T5Lͭ��������\϶���|�Up?G�\=)����D����9��3�}�[Wa����P�X:x��Efq-6�jɺ[�5�|=�홯G�޺�ng��T�~�N���ɤ�ѝ�ڐ�
l]��=!5��F��Xx�B�
+�Ǫ�����hC˵��}��;޼�kaO�F���#��}������T�YإA
{\,|4�1�e
��W؈���XÎ�R�Ͼ*m;��B��R�q
}����Z鳌�ٝ�9���b�Il��V�ȵB%��0
2���qȌO�[u�a��D�ӵ�7�&��(��-��k~����iR��N��PF
+
�vhT at Ac<
+ʓ6���;B�?[�"ۊ��T�a[���d�����dcW(��i	

i}EU��q%ݝ���� p�P��s�
��vd��c��A>�G�z�(6l��j�;^i<�)7�m�}U���ɰ�w>&�t�%4��a��S
�&�Hs�ĉe!�e;�l����[�԰�0ݸ/Wi<�k�Q���
%ߤC�����X��
<p�C#I�F̍2�c`7�b��T��L��8u��xp{���lh��=�W-������
�r��ɓw�͉���;��0@"l?:��Ǣ��H������./����#3>o�����ƮO�W�}�/
���>{�cI_ᜲk�s��,�p!�m�,�g9�@�O�v.�Rg�u6A��$Ⱥ[�5��
�X�=�ښ�Wǖͯ�s���l��w�rl$&��"���;$�� &,�aq��
���J'�=ʲ�[_vw�MæaӰi��7��X�?�ښ��c˖�9�_��
0t��JddD�'�%x:,&rA>'���>\0�EE�
h`��Nӽ���GW�����pk�z����^`x���� ���+W���c"R,��B���q&<$�Lc�i7�_uA�[=k��V�}����;��Ǘ�/	�����b$�fǢ*�	˱\P������W@�i.w�Ef��x΁H�m�j�i�HW���#-��]
��`�0�(̩�

�I��HL��`��

H��w��EĴ�ϙqrxsvB�@��E���͌����:yn��8~
^���I3���m��fځ�6MmҔK�
IJ�
q�C�wI֣�y�G��ﻭ�Ѿo�bK�l˖%[^ �p(t�4u�U}\�?�ɩ��k����3������������X�b�?<1�{B1
)
�����ʠ)��u
+�e;���5+��j�K״4Œ��^�S5�x{
z��
~q_=�a8���
�ie�/��Ŵ�xX��j(�Q@Ө����ʨ�V���f�
=[rS�PԤtuE�h�x{
~���
{����/���ͩ0��/��
���!=��k��[�8�P�&��ڪY��� ��V	$7�
yM�RU�LMo��gn`�#��#4�n�%u��b��D�@��tP���f
*haTI���Ț^ʸ����,��o���e>OU�q�
x�
-�"���8����g��3h.����P�ԗ����M��Ь]
U,*��WPW�2�M��~K(���d+\����+x{���ڍ^o_
=�N�i�o���Yz!�p�g�'�ئ�b�
+Z�(�e�^�ik
{�����d�E�DU�ۆ�a�}�B���{_k_����ӜB3�sޔ�J(6�y<d#d�؞���I
.h5`U���J��UPW�
+�
+]�_f���t�����--���}�
���l?��mh�tƛ�]��k1�m(�@SV#8��S�ZʂDC����"
�	�Bj��]���*�QT�v?��r?�m����c����
o����G�#'=c�3���#�
�F-��D�Q��L�
u@��Y�B�P���Q4�
+�-��^�u��ֽ��/[|���<�7�Ƒs�p%'
�Z�f#�,��՚���D�ɳ\���S�
8��2�C��:v������D��o��s/��{롽�K�����m�x����8dG�R!k�L����B���E�	��)3T�}@�Z�d`����&�7�+�ܞ���}}�}��}�T�UK8����=1��%
vBFcr�Q�p���X��L"�l��*���"�D�&��[K76�ٲ���m�~��~y5���L�
u?�=�Z��	��8���
��0
k�cw���y�b��d+�@�"�����LCӝ��]g�^�)5Ah���]@�Q���2���8����
�4�N���`��Y�e)68G�Qs$�#�⯜mh\�l���t���r��B3lH�a��O$�+a��FT�&�.J��R�L,�	��N(;�1�	�Q
�1���
v iҷ�4ްin���|���b��-dY��~��FN좃
��a��
/a����i.(����I
+JM(-9�"IJO�E�|�3�٦��J�/
i=�������#)}ȧ���l�
�1S#�8�N����
� ��0��C����
Q�=A����D���R�.�Z�;�[O���j;r��
`��aR�4B������NuK�
}���Ae�A�9N�\ˑ���(��,��$
�fh��w��&��}��G��
'�����E���_���y�عr�Xꂯ,�@.W����D���a���ι9���9*�l	�-�qWG_h���w�퇎�-?k���׽�ҏD�.gF0�
QI��������Y�0����L�,�I�\�(
)'��ڼ����[p��������jx���څb��mwu�Ve��9A��{���@RB
�H,ʡ'�L�X���!n. &��⼏(+�����Aݤ{�4�0�Twm^�Qw
8R���vW�~_UvJ�v���
oJB
+&dp$&��#|$b32A:3�9>
+��%��<$i�CPM�����Acqd�<���k[cݍ����G��
���ۤYѧ���ۗ��	9�J����6�"Y?�1ᣱ&=���3.�t�ET��]�J0L	�)<������u�p���}
�'���/%
��hT'�bj&�����H�Cg�0g��d�sX]���sF�aFG2M����P�`3�
n�c8޿ ?)�J����._J���ȱ�N��p�/��\ڔ�I�Ai�9�_�S����b$k�d���l��Sݳax3���`<�_V��夗]i�5_J��ov�+��À���
5
R!��ڃBҦn�u\�#�.��@33lp�1�%Y��K�ִ������_�[�l�6�$��4�
��_1�}Eo}������O(��E�"9_72����NƘ�ɞ��x%+,��C�T堶 �#��y�{hX��`{�a�4'�ĝ�7�PeK(�"��*$��}�
x�-B
+N
�h�J&.��F�%9�*J`mA
�G*����Z����]���i�;�8�EU͡��k�t@	�{d�K��م�)
�9k��~�a��ə��
��(�k
B�~���gx�l؂�k�N(�?��d'�i�i/�i
+Ŵ�xX
��jx�W�:ep��C�1u3��D�r~Ϝ�K6-�('�,�e
S��$̻챡�l�o~lP�����u�՝���xXO��u�`�.8��YN��J�db�=�5�P:��)'��4c�
]��
|kˆ���E�����+��؋�1SK<l��}FdХ�
5<�S 3rrETvp%�9�T:��VL��1O;ZI�5x�Ǜ�;ƭ���=iN�se��<��T0nk���Ĵ�
�tP����J%4%V at 3\�
+Kƾ”w�0�)F�z�.�*	�-���ה
k0�&�
��Ģ�]i��g�|�7�8�O��섌���ШF
�K���@Nq�4]����iD%�D�qX�-T�c�굘wC����w�	�I�q�#����x���q������A��+�@�[
�q5@���&}T�'�j��U�jM��0������5�o}
�z
w��Ҥ����[�
{4p �v�KX���L���@�
��Q��L�Bc��j��M�8Y+
#�U�J��Va��k0����w�VC*y��C��Mh�mg��p��jL줌�
+��,���:�5#,���QP��v��?v���
=�J‚K��Њ5X�5��Uܟz���x��?��7��c�
���M	���Rځ��J��[�~�`��A�
�&d��H&Y#$c�0�$����U"�W�;��[��e�7�u��C��+fsp�O뭍(��rW;*q )�
�tـ,���V���������� �� X����ދ-]u?�z˃�z�͑eu}��4[�u�*�/ �օ%��1��=���<'�r
`���4;���p�#Y������v;G�uV�\b����KV�
}~�����]t�;�Q�oV���9E��A��b��!���@��
&X.(I/��`r"(डT'=Eq2Rd+Erp*��Vͻ�[���}�n*L/|'t{q���

݅-����*Zkb�>��"mnf��:�p �~0H�A�\^�0�K
����Ì<�h%�����\�|l|����5���Z���س52���C�Rj��=wIM̶i���5M6��(Ƌ(�Ԍ�
I�Ҕ�-�&h��8�VI�l��G�,M�����%;%�_<����3��mɟ�!��
�J��-�΅�&nc��~/l�E�#����aj��!Prj��
�d�
0+j�o����U��7�*Öo��6���
�|��$�?6��:��x�_����󔺫����K`�L|b��
���>*Q��J ���82Eg
�`�*)=P���3�؏6r��[h�/�w`�}����o�羣�=\[����u�᣻���nj:|����Ͷ�o�Zp7ȗ|Im��K��u��:�m�lB%a�5�0��as5�ޱ���wDGI��^�{I��vx�\�/��$ٝ�����h
�c
�D�,IFI�d��B#mZ4�7�"��T�Ձ>m��3��V?1�Y�i
ޯ�-:B������}�K�y�/�e�
N(���^,
+�ю�d�,A#$9Z6��m�toJ�Zmio�=��a�����qS5�ݾ�|O�����ӂS�a�c�O��0��.v8���h�x�'#TQ*L�I�H�L��ʆ�t� ޜ��Yޖ~�0˪�a�
+��аm�=�ć��“�!A�)# x�B�1B	
3��QFg2�R!@�	R��`�, ��}�o�w�Yr�6[�iì+�a�u�c�7�1��'���R�	��9#l��D�����
��}�q�N��ܱ��qZ�ӝN�U�z�uu�k�@�zW���EAAP ��I�\�Bx $�����F�$@Bȅ��pAEV�Ժ9�;�m�-ʶ���������?�
��������������*9�M��8b�ɢv�:j�h"(VV��@��ߠ���T�e���i��4EJt���Lp����avw�k}n���䅜4~�����1+�=n�*�(N
U��
+<L���;s���YIN���iBx�6���
+�_�s�Z���fF�G�������ܰ
��Z)H�B':�!�T�Ur��_JD���o�t$
���H�\$�\���V����Q��"F�a�]|V��aG�
^�j
2��#(Q6�"*r�*&!i"�$]0��
k�
��A�]0ݺ�4!>�DZ�р��/�rz[I��V��-��9�~��`q�L4�5�z]E�����CmdULD�D�](Հ���������OICV�t�^�D�A$"�C�
V[��+�{�$��SL:��Q
�1h�G���	5M|CF�^k�ʇZ��x3UA��P��i/
�
����n҄di=�ۊ�~i��+�z�d��%�C6
�@��>k\��O�X�["�d���>�Еq]i��B�6gx;iذ��%
�
+gd9�	�
$*�M
M��//uxU
�����a�����k�f���R�2�ȕ\o`����*�X�(��
�0,OƤA���q�����.�<�1*;�
�O[�T�������{�j8lQƒ�
�.3&�B��a��:A�8�/��	W=��h�S
�g�� 4IC�΢���/�}ڐ:��=k�J�]�*�
��
*8�l�]Kh���-nH�6�j����	&_c�i�S
3Ҁi�r`xaؚ�D�y�]��Mݧ
1M�&��o
+Zr-��s.��j�)�kjT�A�
Ad�GO�۸7`�p
�HG��ܤ��M$Հ�!�o �?f�*w��m��2~\?h��2b۩z�2�ln��ʯK� �@1����'
��
TY�Y�0F��G)2��U���h�Ӳ4`^���2�nK֬f{�}�V�m�&�p�ҁ�-Zw���Zܥ5U�Uz(Ԧ��MjJ���
m�3G�r�A�
��A��%�h���4��
`Z�	�����lV��y�1>����g���<��X.t+L5�2hA)�-�h������D{��b��8V#�aU�h���%i��2������4�!�_]�+�.��
x����k��q��n��-1c|�Fȏ�`

+�ju�~X
G(ZF���
�ixX� Z�E�u���i���2`y/7e��Z{�~dU���b�k�"UW�Y��s��e]-
�
��5� ?�H
0
� M�((#DDYa<�	c��0E����P�ۯ���e���z`]��Q`����%y���$4�)l���	���V�n�b�
��:3��6�z&�O3��#��dd�
� ��
`

�cs_�Ǣ���|)p�^��g՟oM,��w�9�ԛ$Ib� 	�i�{����e�:'�ɳ��
+��e���;`/����L����l���Ś�{1f�/�
w.���{ɒ���}�x}c��뻬�2
+dw���6����M���f_�����=8=�M4�<d3�
Ypn��	�j\
[��e��bۯ8��
+'?�nu��lֻh�?‹�Do.̴�.�V�{�df]%{j	
���'^@��-��Uqu��j'�
�/��� ���).�ѕ�}LU���:��S�7}���k��#��p��r�d�jz�^.���"���*���`�N��nR+n�0.���J�*��Uq�G1��|]����0��?Lm8;7�I0y	Nc�
��ϋE���ƫ+��}�
V~��R�}���s������ߟ�Xr����+ߖV�S�9��+��;��S_c	'��'��"��OQȹ�i�c�
��$��jѾ�W�C�j��-K�r��[��
x�#��=P�ác�
?��8�lޣ‚�K�����±�%GT]<�=������C�H��A��—��eV��T����+���^��˹`�;T�v=
l�\>�~	|�y؟��~u���G<w���
xz���ي��Sg�M� �'�9�t���L&)A@
+mBS )`B���mh!1���Rc�ӒeY�u߷dIֹ�z%!�v�]iu ��pd0!L���̐�$�̯ۚ>�? ���ӷm�
�H�
��oz������ޯ'�|%:��W�S�����
8�#�^�87Ѐ����`�S��ӏT��]�=�r�{L&��u���~C*�gN�{�i��%8�
��dp�?�3 ����x����
�\�ahe�
eh�
��jO�y��`~���R�M�OU!�KrU��h��>���D�u���38lj�,J0��pz���T��~��ޡ{�&`jm��
�յ��k�˦�t˸��("�R�(H�ɼX�&�Q�oAq�
�q��
˓�2�,
�a�h6E�e��X=7e�Nަ
;63e0�u��O����ɧ4]��jn���H�"Q��RĀv�
ߌ帶l���a,/�1 
�G�#���
Œa���ܔ��>ehi�3~�1k<ʞ1tȧ���i�PQ�'5�D^�LRM�l�)��l8�q(˛G�|����
��0#x���eX �+)�z�
���9�Ys{�xJ1�?o�����'u�d^�H�2�k�����<k>�q2,9ʄ�q�0�0�|���h����ah
e�>o�
옵
fϘ�+&�; [...]
+%�
��h�>�鵐i���f�qf����b�5\��É���ߊy�s�&`�`���1k�{�ڦ�4�vT��ᢁ
/���A�ɩ�YL�"2B
��5��=�+	v�:̂*;\�q`r�!�=�\=�
���y�������c��ʚq
�OZO:���ᢉ/��)�,�du�
�P�bM9�7�Fz\W��j��z{Be7&�H�΋��	�(�����
���un��̬��u�yP>�8�Z?�]�'�[E(f��jY1)QU��oh"��^�jN^�l�^$o�Gs�4o�-��Ҁ�28��>u�9�Ƚ�yh�l�u�^s��K�O�3�;(j��zIyD.�
�A�s���\��5KT1��E� ����7�� w�>u�>����3�
��m�u
*��].�������NQ!iWcZ�DX���
޲=7�B��^Ut�pQ+.hD����2�-��h�M�;[���l��'�Ap�d:�d��;
,{O�H���g�����p�j�]<�5��jT:�h�Cj���J
+]QI�%�d�@�����
[����[ߎ�A;.}�߆w���[|�pRB�\�G;���A���-��٤���
��}S��KU��T*K�0)�!D=� eR�oh`�2x�o�.���cxk���{�w��t#;]�ds��=c�?�bv>	k6�`B��:��E�M��{M��DZ�"V�E�
+��Ӽ�g�w�o������2���o�M�{�
�ir�e��Ӈ�Ţ#�3P�S
+	��}���f�j��;8�wy��m��>3tE`��uÅzA� Q���ln �w��G6
{�x�����ϫkE�7���]�H��H ~������5�_8��ɯs��뜀g���q�+<k��k��z�ʰ�2�Iކڰ���
����ꚮO��'��6Lj�!�D��D
Q.aB�2,�� Q������1&d�1B�*�U��P���z����/��i���D���~��?>��>~���?�>].L�m����`�=a
���cܜ>"�ˑ~R�J�ai�VUXaS��/���%(\bxa��@�
@�Յ �e �nH����\�tz����K?��Y)�ƶX
�f�#fHv�uq
����Ҩ�Fą^DJ�
+��a]��XH:�$�?y
.��d�_Y«�����Ѷ<�����/����"|g����v��tȣ����L�eU���'���돉s����F;��3����
�����@^~
�\R��|Q{i��K��|�
�;��yw��p�Q��~��z�D74�� �(/�����	vj �H�R���twB;ڕ0�^L�G;��t=���@�A���rɊəū��K��~�5��
�
�
l;��ζ�Й����twfe��vu�V@D@9��\"�IH"$!	���"	I�r��Tģ��]ԭ.�㮀���:}^�E_|�^<�<�~�$���g���oX7�XMs���S�R�8JI�j��'��C����=�
r��[�k1^�	�}bc�O����7����_my~{`aa�G�O�?d��8V��9Г×��;��-%Pȷr��
�|%��jMk�
V��"H+&Im�Ty�x��d��,
c���T���
+1*S���]����S��wB?6o�?�����>Oo~~���������Z�J^]�r��rj�����[���E
�ۛb��.�A�\��Ԓw��ͽ����
xY�b�N���
�8�ww`�{-C����p
�lI�nF�'�L�Ǭ�/F>�-/��,zT�B�^������
��O
>{��.�����V�~1�
��v��tnYH�I׽{Bc{C�������:
>g�ώP���:}�$%_z��^���U�S~n�ˢ��e����Ϫ�������q%�k�ҔIe�?R˒�6^L|�,Ox�ri'�
�	���ޥ^y/���	>9� }�Ǿ��+���2�2AnB:@$����dP����������Ɉ�ğ?�Ǐ۠d�~u9;�3'��ܝd}/Ds;d~��>�O`��?T��.�@�WY���4�v,dG$���xPt2\���11 
ЧO|�	@<(�1>0�n�N\x??��G� ����	�)��e�U��Mu����ƥ�6�-�k8�b#S͢���v�횮�馐��J�~�Ү�����*��`w��o�2�`�i(�`���!�8)��:���W���@�K�����D�|�Ъ���j���)��{���g�3�Wzǫ��qd�q
�1����>��,��
��A�����y�-�"�8��Yh��f�NS���%�o�_%B�)�X7�o�Ƕ���;L������ye��T;-����

��D�A
 ���
���

�p�[�Z�T��	ͷ�4�zS>Kk�L7tD�a� 3��f��Y�`�l��^{��j��{���~8
&x@��
��� ?=
+�R7
+��E�Une�2�^dQD�L�r���9I����[M#D�%@P؆�~?V��N�����
8
��o��
@�A$o
�@����
(�pM�@��/6,qkً
�x�դ�f�u㍼�*d	�%v����k\C�n������\��ӂ�9�X��g�h�
�?�)lń(9
+��R7D��k�P�Pq������Kf9T�$�Y?���.
���c�(w
�5�A��3��x
�ی��{�6�
gsv��`�� ;���l���lH�k�lԪ��a	*�,�ђY.I3�����8�a���O��r� ��7���91f�k�p�oui�6�����ٶ�0 ��( KJ�lK-Xo;_�*�%/�K8
P��*��c�K3\iaY��<�
r��|^|ǐk
2�L�=�>_����U�SI�;��
6�mN��H OH�T$�+�U=Td���웒r�l+Z3! ��6?��9�(�zI�!7�3`�z�ѯ��P�^e��-'ڜ2�������a@d�#��LҖ*1��:�H�F�מӼ(/�J��	�pEH��y,���p��W��t��:����;��7
��^)���m.����3ȷ
'����=�Zs&�6��qg
+�6�q[�ͷ��O���G$$�_�py�
��"��!hgT���6�! !�E
f_+��Rl.���[�b��u��ũ�@���36��.��}"~�'��>�]W�6���
S�L�
+��
1�f񌒢�Su<*�q�O���h�fuqi6g���A�m8�%h?�w�=� �Oe�4Ĕ=1�a��$P����[���k�匭�sH_g7)h�v!oF�VϷ0�&9��6��g���t���du��l�`�5(�
_�YT8PG
]�����s߉�5{4�;�~e�l��H&{a�L0�Ejm����<,P���2�|��s����sz��l� �e�1�-
��
+��?N��٭�<�������T3���T��TN���ؔ�f�WZi[�y噡r�x �((�x���J�� ��!x$�)���ef5��5M����>�s�����׏o�P�ʝ~���w8	J��W
1�4G��u'��C����0��VЮ#�ԫ�%JFWV]� �R�-fE�`����%l�a*�2
+�
��&
7�Ym((C
U�5X�B��~�dgr[7h��~��
}���hč87w*A?������:�Lڞ�6�4�^or]����������҆
�Xѝ&j�L/RiY��vCA���)T��u6�Ae}��
+����{4�8=��?p�k���������b�P��Vg(3���]��BGi��K��{h��nzicg�X�e�TC��P��	T!١} ���փN��t[�>59w���#;�vމ)��/
)+F
�$ev+����Ӥ(󻒔�.�R��PtSj]���Τ
+eGr�Jc(�D
5f&P}�j-~�&s�w
�l���
&���n.Y�h���)�
Y�Qt���в�
�E~���Nkb�r[iWr��a;���=��VCjRic.���Tڄj��P E
��&P�)4����6_������.��K{OkV�W<>D��:�Ew����a��>r�:����lH�d(���qm���6�r[uKT[�|ks+Au��t�pP�.�0��Vh�a����f'��
,�լ��R�:!]:� �se���p�1"�@L)�F���K�%t��ەYݑ�@��	�29��
�!��kZ���b���.���zۖ���7.nޭY�����[��"B��>�ߝ�1��c�E��G���C	�z)�?�"�W���Wc{5:�
��D����UՄ��/
+j�DA�?��i�W��7l
Z��7�ʷ��;����[�����%���NJ�d&�Dr�'IY���\�hR�6�0r�-��ʺ6�W
��C�`}UI���$P�,1�oDAÖ/V:���e��ņ-�����`�,���o�Y/ݱ)�|���!	1�i���Tܽش��D���ι�t^�73h��
0!���-��/��
����]6(֣��5�~c#턉��ӗ�R05�n�l�:����C�Ly�!�
�a�1Q�_��sO�q!�)��%5�#�����03�g!����0�̃�T�����2��^6��:ע4C_��XW	�L�����:
�ip�=<��U_��A�ޝ�
�[T���X��+j��Jr��K&����x��?�<�pj��xrY
���
+��F�֠�uF5��1�x�n]!���L03c��y8Z���,�v�cAp��B���
^�G���ubϜ��>��'>�������s��Ca����@Ci4kP
z#T�=�� �sa�Tؽ��;�`�����f�
Vg��
�� �;`
� �x
�N�@vv���G!��	R\
!�p����
�J�C���Py���8��Otغ.̾���߄���?�m?.�N�����8���B���p�D
t ��=�~��8+[�Z�!H������[C�k#`�X
���0�- -�	�"<�A
+|G�F��1���<�SJ^�R�0�!Y��@*��'Ve�.������a������
+f»3�����a����C����6b�@

��F
L��r��p`E�eR�+)�1�h����
�"�0�Alq�<���T�;K��?C�L�ES��T�Z8q]41(��
�n	o�o�>dl2.b�"�
��>c	�@g�aЫ\B��X�K&=�ה��%?}�*���_��Ŗ�͐��i�ŢIb�h�X<��"��� �JF���A����0(�&~>� ����C

���e	���C�f��pc�/ش��LV�bJ�-?k.A�7_"���NDˊǣ�%c�ƒ1���;���;���A�Ͳ^bYgT������2Cb�!�,OK�=�
y����7�����D�vZ�C&�3O���&L%H�q�1�����|4JYq��Zy��-�����>i'�:�O�J�|�C�>
1d#�LĐ����3�ѫ���or���ٔ���T��Ûc��M'M$��c����ؚ�r]�0IU=
u�f��#��� �Ȯ���Z�T�!�΢�<�0��ZO��sj�Ӟq�ku�Qj-����"eA���`	�@XB$d%!@VI ��%$lj at A��A�
V��
G��;ߙ�uz��ݼ�</�W�-�D
4�P��
��Ƒ-���
�aX��kSҞ�d�h�����[dj���Z�
"Ox�� �ɤ��+�3
-�:�����]�VlW�1��U��V��[�T�P��Q-h%�B� 7< x�G?p��_�1g�0�����;U$�x�9ZB�_/�4
�	��9Җ�X��J�Q��r�]�N��l��8��x�Z�w��N������̆�P
��!��?�G@�ﺄԧ���)f�=�:N+eyʫ?�X��|A�U�DُS���VM'Ρ��8�Z�C�"84���<��&����n��@G
�}+��/ԇ솆�Ph�:�F��L����-��ʡ��I,��~��!
(�k�˓�_�i����o3hrme
bh&"zi�]'�wh�.t�{
�P
50Ps�
+o������𘷢��ϛNb
+�
��eR�YD��^Z?D��^)�.�u�ZB��5y��h5K/X��
6Cc��u������wC-j`�]�A�@�=H
���w��KYL�#Ib�dSj�O�l�?9���������-;r�6M��֜o��
,�B����f�!�:���:o������
X
{7�$pȃ��p�Z���Q�OZ�I�wd4Oc
�
+�,�մ��s{��.�`p4��b�+����6#�1�K=�Į�Ԡ�Z��D
�=ˠi���E�~P��
?�
Oy���N���9Wz���J�LJ{+�m��:�%:'�l��J�Vf��\[j32JmF)������
`�j�/��zhٽ���
:��p(��XҔ�x�D;lN/�Ug��R�X�'�72vu����sUU
U�&[�b��XMU6cUb@�{���ų������w�@��4�����4r �+,v�RL���S�}��b�>�٦$�DbR��f���w�9Wi��Q^c�UT�-U3�f5URm�J*��0P
5p�̇ƝK@���ޱ
��C�?�
+��
;61|��������3$�-�!��x�UF1�x��&����(��b��JfX,�t����f(�F�ނ�Og 5p}��o1(����f������������<?znFE_
�O��1�ʮ�!��ѿ��L�W����V+GO��d#�͖��\Ȳ�j=�a�y
����x�A�u�|W�qˆ��m[���w��w�vH��Dd�k46U;t*_ܗBc�d�˜Y.Bn;geR�
+s��j�l����V^h3���k��s
Zo
5p��� ��w�l\�
ٰ�٥����\빽{Ǖ���;��nE��G�u?&S���>|Sv/�%��V}�)�$;͚�F�.Meם��u�EmvC�'�h��QCݢYа�sh]��,��^�trx�77n������9�7Lw�@���,�Ddu,�B����
 ��%�k�{��=���e�ե:�u�S�.u�ܥʐt*�
����ڿB۷��/�����7&V,tOm��x�}������ 
o*�<�^DA�xbyލ��0��>P,8�Okĸ��D�T��6��.�HO:{��
9F�#OV{x�A��W~�%�=���3ϭ/?u��l����m�Wۂ%/���=J�=:�U|?�H���d�eP2<���EL���p�Y?���
h����1���
}
�־Fo��/>дp��y�7g�3w�{j�<���U���m���v���?�6
�T��Xq*6;��ϸ�AJ��S�+�$����<��u��	#j��6r���
`D
3���,o�p�H���
���O�m��\��ekİ~'��  ������g���g�=�`O?H'���O޽P{�\3A+���E��%,�a\^~l\�f/�Zvll�k �������sip�����9*X�U,_Æ�۩�#���߇Ec�DǧM�'%�HNIx���+�\̣����$l�/�ptl���%
��17�~K^�}
1d�N<<y�k ��g�:ӧ�w����G3�/?��_͂U�V��V������Y�
+Q������:�j���8
@ϙΔ���Zt�V[p��
+�
+J����,ʒ�,$�@���D�L�$ ���Q��U�"{A��(��"� "Z������3y�������nt�;b��7����i���\B�+11쥂txNE���%���!�fZ�s=�ycr�̏vi@��~Z�j�^��������֬̆M$�k
�ەA>d8⇃ȀX�
�<&(G��dl��1�?�Ƞʨ���1���3
?��
������3v��jjqB�n8�J��:j`�G'`�21|��
;7�`�&�o��P�h�
1�G a}C 	
)ȁe
���d
D#O�/����6������
�P{]�䈪�F�
�(��䠀�K���c�.#��K<x������z0C |s �l���~�wGy�~���4�����;�@�kdy��n�#���֊B��B匣P2��
>q��gK���hpu�
�?ŀ׊@ؿ� 
tAC��}��"��c_zA�W;���(v@��ہ��;�\�B��Pn�
��
:�w�#��-����y��a��~��	���C'��z6�
UC���_�����
+�
B
�9�t�
��;���{�p�?
�*���N��N���&�	n�

+n�������lw��
p��?�8_�QC��<
+Lq�;FV�k�)�+�>e�RƜ%Y8ω��g�z�4�Q0�kMa?M���4�7�q���1콌!�}�
�X�u;1pC:b`���!7Ey��!%x���„�Li�������RK�33o�T-�"֋�2��$��+�Il�l2�_� ;$���'�I��$�ʻ���厐������7�Fz�,

���\
�
GN�-M��"Eǚ���T�`�R%~B��L&6�
.dN�(&p
�G��~H9�8���8�l'
+�����]��m��E
�P7Ȍ�E
2��&G�rp��I/�9��iγ�"�Sz�x2�*}L��|DjP�'^81Nh�~��ʾ���}�8��K�� ��i���i�1��U v��p�9��l��	�Z$���N0g�y��4�x2�L6A�T�'�f=$7�< ��Kl�
#���&���s�)��'
�/S՗���
@��	��A�
+N��*��1h��b ���d��|�
Q&�O%x�ΗL��(Ɠ+��jU�)
�Q��S���4w�75}�M{Ҁ��6��D�6%h�'h
ĈA�D�A��
p��
���m|(�"F-����l��Tže
'�Z�8�8k�aV��m�F������wI��I7
+�i����~���~���~}�F�Y;A�2��	��Π�q����@���P���B �^���W��f�ΔT!���
sF������.��
Jsѯ���z��Jr����И�k8��W\��+�e^_4� 1b� �,o�
��B��!�
�APw�}A"���N�Uq�SJ�xBrR9���
a�C���۴s%�Ime]�+�n���n�Yf����SV��)��)���
��!c�H�ɽ_��o��C���P%���
�I/�
֔J z�P*�5�ani��Ԛ����>Z��*��|��a9���8�fkz����.7q{�ʹ=���O
@�d�A��
(F���0��a�D
Y0�
��H ��R'u
��J���P���
+
;�-�ִ�WS���Xm�zN����f���+��
�2~��D�]nt��1���k%��~f�o�2�
�0~P�y]�܊�?����K��
+��
Չ��LM�eQ���k�j�\��r�U�[k�תK�mV����H�aы�LzqW�b�
1�C��O@��s0���
+�&�����߷ua�s�Q�O���
ԑ���Le����-Zy��
Uq���R+���
+�Yg�ԕ�[j�2Zk�kU��6�N�Q��t���.�bA&b�#�Vg���
L{�B���P��z�7
����C���F7��}���V3Gv�H�wV�e���U�+�mŲ�.�5���[�4�m���y�6k���R-�4���UN����<W�e���q��h�w�wϝ�}򯈀�+����N� �LR�b�Ц
)�skк�8r͘a3�$gR"��
FB��0�M�U�D�)���M*�W˦ҡ�=��?0�^??�ߞ�	8��&�6�
�U}�|kY
�� ��jNve~fI-�[����4�
�
}u���^����6$䥉+PI UA
+R��9(1�B�N�7׆K�/�v�o��������u�Q{�8�7#�Ng��&�eTd�֦�T7&�t6%e�6$g�եd�פf
�RyC�4��%��ІT�!KOJѿ��5h:������.����qƳ#^؉a��`o ����t=�\E���ˢ���
�IW�㊅
1ŷc
������&��W��
�J�U��
�HG�І��7��XjMv@��o��\�ԙs�y�����(���`���;�0Q����\~S\~r]Ji�(�*J(�
�V!諍.�9U0 ����4\Q,��x�\��6����\�MPi�
���P�S��ϯF,~��î�)Ӂ	o�[#d������^ΙK�ii7O�ĵ%G�d
��˪��m"Và�p�*�lHU2\](���+;�_"�n�.�P�-
�����KW�X_iz��h�V��_�F���
Z
�+Ǩ��bV
o ,)�7&�D����.~	��Ҳ���唎{��kb�F,��W
Zv�,���Ոɀ�6d�
W�6@ݾMЮ)�a`���cm��Y�m����s���͸;�<'z�<��'�I��nj�L
���E�sĥ~��$�B������ђ���f�X	G8V̩+�2�HA��:h��k{d�v��̍+I?�U�
\4P�|e�ۺ`o.z�+��'�?C�'����~|*l*�
c215`��#M�e��f&��>#�rH��������|j�x>�A2�
9�1P��R����o�<�݂x�.��NW��@��Ʋ�5΅�ʃ���vz!0$l�Ŝ��
�KH��H"N��_Ԥy=�H�z�g���04�A�y����,����Ey���٬,��G} ���"}�b�g}��OX��e��e�K�'!v�D	_�0Y��ǩo�"ȋ��ą����s�^����kJ86׍z��99���`���t2~@2ȓC�B
yvK�߿靐E�?)�ԯ��&X�׺��5�\��L^sv:����F"����e��d?�	ƿK	�\⇻�)�t{]u�e�5�y�n4nq2�u�e����I��
1�@�&d�	��t�G��e��ɍR����R�؞Z`n�v��b��, �S!O��"�������
+���Hu��
r��K�}*e:.װ�~��v�x�c��O�ѥ���$Z"��o��
i�eLMo��ʲ�@[�
F{�^
ؙ�Μ�����
�.�z�D{�@���
�,����D۵r��Z����
?��
���8�r�D��݁A�
b������fL6�lL
�0V;f��`�K���dp3% 
�	d
7���
l+G�q@�#[8ko
�G-��x
+�,�
=�j]��
�b�O��r��T�!H�4�d��T2���-�p�Sb��j ������'�t��C>
���
Z���M��ISs�?���Ç 
k
+��L���DF�r��$j�@�#H�$���C��!ױAU&46Aw�'�(���vG�U��Nkp��+����o5S�B��!J�b�
�D
}��Ӄ���P��*��C�D�}��qI�E�3� a�Q����*�q�G�
t7Z��#`&gV[��VpV0wE����Jz@٦

�}�}/D�І�
�����.�ݐ��r%�`U
0���j(�6
+�pUa/S
��1f�-����u�%o�/&��|E�@j�� �R�|�i���A���
+~����9�_�y��"�
�-c���>CzϐBT0�Bh2 at E��jp
�B� �e�(;`�uz�P/�R�
�e�@�����SWI-A+�v�w����>�o��/��e�<{�g��@|˚�]b=�{ǖ��
lMi2� 4k��p/
��7�0��D�'���^�'��
�Rʚ���B���ka~�mg}#��|%��#�3a&�����ϰ&�5���==-�:+Z�QԣuTD+�ʅ�u�Bf!��
�H�,�'$!�Ҡ("e��(U
(�L�x at e��(λO}�����s�7�i� �/l��>B�G<s�g5Ġ�f�m��>/`���X�/Ш[���
D��Մ.3�#6'�=�0�]�	���3ĉ�jқ�:��k�����c�i�!�i�{J���FӚ0#N�I at Z�
+��݀�������������xr �9{�"=q���H�{\v�[laSBz
YF���
+�Hz�1��|��
`�D>e�1�̦����X�
5�Q5P7y 7����@��?H�
����@O<
���qzܻ�,�\>�5�F}�)����b��_d���

��<	�y�`ۣ�pna�p�E?���t�ݦ,p�8�����9 ٹ��i�$��,~�'�<�=E���3��c�h/qǘc�Ӭ�*�h䥄g�x�=�?1�x��~�M\��!�_�;�_�[�������
8>
 �yȷ/�5�
�Yt ��A�c�|bI�o���#�e\���=�;�0��
c�Ñ͢G���V\_�͘>�؇�:�Cɹ�>q%�y?�h�]����� ����z�jPo�4L �	A f�~�	�'�J�8=���le����C�5�Q
��Q�I�^�M|or=��񁬊�@v�ܛ|�ܛ�,`�:j��p���!u�l�,���Ap#��@�䐏bv�/����f<���#�|�`l��	�\� �Qރ�R܎�V^��N9O�J��t��Q��'i=
+�G�,`Ow&���� i�נ�8
��`ڹ��} 3�
ѻ�k���J&��DD
�0�
�G�
��M�I�T:�
�wc;��
����rj���ޑnct�3:S
�])��l�G
�en G��
��`�2�w,�� o�o~g���1����Ag[��$�K����i�Py�R���T��'5kk���CW�l�Ƿi�Y��<V�*�ݙ�,��m��
+	^S u�W��̀�-� w�R�۽�C��W�a�#��A&RXo�H�0����H�eNNZ-�D[C��W��ӌ�x��P�n��r
�ln�6�ۮ�$t���i.�B
��S@�޽��� w�',��_V�)޷a����B���<�V33�N���"�&i��B��<�0��]n���M��fS.����kA,|���w��6-"hW;
P{�+$�w
+h�	V�o �7����m��؉=�O
��;��~1���#��+�	��4R�)i��$D},1�pTPj:«�d��ZL�f"�gԋ�
Q�^'r财�g}6pP��q2��
r�=���Y`�<�M�V�ggv��8���<���	܁?
+ȸZ+�Q���'5
+Ea�NsDfEL����ƪ�4ei�w�jis�Zڂ��v�J�ХK�4�
z[pQC���
8��
�m�����e�����
��.�[�Zuxˍ2��ߏ���2�Y|A!�,�֪5H��(�,��_��[V��E�h6)�-F��nP�Z3��mZg�o��+ȿ�
��S�����{ڻ3g�V�4w�n���K�W޹p���}�J	زc4Zq
��mː�T�JoD��|�D]ni�[Ū;Iz�I��bLJ����Ɋ6��@�PC��ɐ��ū��Sk<�+���n��װu��aNJƋ����[q���R(��X<c�(YuD��Y2
��\3�x:�e�j� w-��f�@ӂ�v�(ݑ��֦u�g5��
Y2l+��T���/.��zએ{O���;�ۗ_��߷�.lwi
."�,�d>��jl|��(9U��ѱr�����fr�%
5���0�3����o�'�
:��M�,��s&��[W8�n�R�)UK�]^6�a��֖
����6�X~%dg�El��|
AWIg)�E��
+�	��b��	�K�1��F|q
B̳(�V=���1�m�xC��Y����0��;�̂�c��&���ε�k�����\�,�����č��
�`�rlLj
��x��cW���ʴ|�Y
u��6��NQ��aK
:|a�6.����ݮ�X:ҝb�M�f��*�7�C��IC�<\:�������W{}��w�/<�ص���� SS�~Ս�����u���q��uDP�QT�(��b��I�l$$,D�*0�:ŒZ;N�Z��:n��ǵZP*���2�)�UdK����9}m^|^�������K.�7V����z��a�Z�������j�BK5}��F_�\c<�\������m�zG��i�af�ӛ����0�ܻ=��|��j|
4�쳨�Ǟ$M�W?l{�������I]voqf��"k���[ե�m+��U�n����zZ�h|��:�^E�h[��m[�?���<Y�<���
��
��id�kMn��s���Π1G_F��}�
��7^��g�Ī'��AQЖ��n-��h-ϥU�+
m+��
*��/�?)��(�^{�\��|������g�`
s��v�}Ε\��J�
��}��y�����*!dCOZDU��[�M�t��Y]��U����g(�֙�][�u��������j���xi�ڝ'��S ��](��U���N:��HӉQ��
9{Õ|��F
���
���`䔿ڸ!�m��2�8n�M�0˦M7��"�-_&��R��*:���6վK��^��<�`Lj7����x�^�[^g��X
�F����tƙ�it&Gﺐ�
�
�\�
��U��ɫ�T�4N>�Q��IT��"�b�ŋx���F���R.��p\��T��*�m?���;��1�t�e!W�r�Ή
��D��y�jx,k#�]�!Գ
Q>ňX���&�gk ���*�Y>c�Ȏc���d�%rQ�
��)�#5Ңq��+�Qh�G��3bw�F-!?�&�H#!�����Ej��Z�Q�q_��qY����_��iR���H
�
 [...]
��sp1n
�q�
��9fG���!�~%d͠3Y	/�RLt�F�kӡ�\Ob�
��IC�o2�� ��: Ʃ���:K��ayU���4c&�Ϝ���Bp,4?��
�#G�2�_%d�B����R�+>a����.|��
s��
���xF��=�qs@��
݄Y0�)։AX���ISQ��-~�b��Oqp�?��;��"s�;�T�R4HH6�•%���t�0
	�`�Hp\�"b4�G��
�v�n��M��- �1��
3Vw_,���
Q�1_������@?�	�`g��]!�gC����zzt�Ph
+á.��r=3��'C�M*${y�C� ��B�EXtY
�m	��R�w2���6�M�V�/z/钼�vH�?��i�3
�lhS�`�¨DFf(�Ь\ �_�ܜ�v
���CrH �1D�%�3O��
�;r,j��ߥ��h at a��Evy���7�;�S���0�	�A1���lz�,�
+��8��H��A�6	�M�PnK�|� ��bH�-��
�z9DW�UB𘂠�z'
�~٨
�]�Bf���oU��
�A�
%�@ǰ���l�r��2p`^
cI<�B���W(w��8 ��V�)%$u�WT5�!zJ
_�6� �+
�_(lt�rH�
e�<p F���c����G����<��e�a�r��
KQ��)����"�z��~G)�O�!��@zU
�}ݰ���.y��
�:���ڨA��T6�
z�p����tg��\`
+g#/�
����H
�B5����]
eE*L��o�@�C�^T�i�<���N?"��1,���V�a
��;���V���>�&�f�|U7h�� 2}�`t����06
+c�P��2A J�
��$7�?OC�j!L�0lSA�G��~Du��AYgV\7��?��Q��tR��6�?�I�:�?���K���
9���4d0
�\`�Q�r�$T�OC�l6Vh��%<X��ȪV´��a������=}��NU�m���3�|�ۣ��m׾�m��Y���~2���h��;�ٗw�X&9�4��,�5+��bu�֦M�ZI(V�Q�0qQj塰D�>o
e���Lp��q��__�ӫ��ڣ���I7�?������k��� ~�"�-�ց�j�W�u��Dd� !���I�
2	h�����QP�(T�hI �
ǭ{{���̋��yy~��y����$�A��'b*�3��7Em��J��O%\�OŚx4C����<H�2
+�e����z��v��A;�{ೀ���M�yK��P�a��,���`�����Bхߠ>
�
b'iݑ/���f�
F}�KF-�%�:v2�2v�f�A�i
:Oǡs=�_H��`��0��Z�:�*�J?���,�m:�����	20%��	��q�qC����hm�ݨ6foT?�'j�݆��4�9u�	NU��<��*��А^�	_b`4���0�6YA���P��2���
�4���]f��2�e\
w|D�
x�����~j&��T�x�X���p%�=�6�s���@4�j�
�r�ѐǓ
+)�
[�`b�c�1�`	i�,�p�<��f;/���_����
+|
��A;�s���T�!5஘���I	7X���-	eI�$-�>�CX?�\I
j(c����O3 �4#7�6��N�0
�������Zd�{�߽\���m�l�׷��m#š�C�����.9
�!ƶ��˜LV
���]�Q[�j���6,�K
e�DŽ�
=�<Àd0��
�x�9h��@Z�jK���f�{�p��?�����p�j������w˓�S?�+�<ڕ
�ߡ�c�S�X�8�Z-P�K�j~!�B��l��0{R2Y:��=,V�G��r��
=/�mDP\s`
z��[k	��sB�f���jv,��t^<{���	��j]��7�w�Z�u�@�E
מ��V�ET�$����x�b%R��ν)S ���$�"�B��˸D�5ŕ�hڷx��HG��z�,߾ோ;�^5�Y�ovY��cS�%�]7+Î�j�~�jrXU�P�P��l�,S�.)��Du2qrg�H�\&餢�a�H8�,�	DO�7"�@����@��*�,��X�S�����i��y���}�-�z.��h�
um����ǟѨ�1y�H�J%e+�f�%�
b~j���ږʑ�!K�餈tX�HF�y�1_d��
�9��i�9%F��Wa`�F�����
���N֏o��������U��6�>\w1ҧ�"6T���U
�"O�e��!�<3�2%Q�*�f<�%��Ii#b�|TȖ�	8)
GjD́dtm���-��
��,_������tm���k�Ń�]_t_w]������|�`e�DAmLpf�V�"���tn��K��R��%q��)�y�I㲇%dՈ�znLHK���
+B���@
+�6�X���� ֬��6�c�7W�G��0}wv�]�:�����֋��5-a�9��A�ZR���N�V��
+�T��#��$�J�đ%�"\�hrL������ǟ7��J#�rn<�
����[���% /sڥ�Y�-x�g
~��5��=��?�
X���t,���S~g���Z����x�B��/sI$�4IŎ�� gj/�C����5z
����*4 ��F.!g�CȚ0
���-���E�m�-x�l�ۀ��l@�З�}p��Ɓ}�U��7�ܭ�>�"��Ϳ
{��IŒ�81�k�5��R�ji`����M��K���	vX��QdbF�0
��
�v��<���[�_o�7l@���陣U��eE��m�z�]~?h��n��/�$�%8����v��C�2��]�$���ow/���4��WԀ�W��K���կh!�A�b�;, å`��
+t�Y��
k�2�4��c��
��G��f��M��c��ݬ?�Q
��
�}#ف!�����'Gz6⼆�p��q^�o	�7�}�����:���Y0y!��`���X��NK��g
j�,e�UL��9or^!�p]/?��4��$B���Q.X=�㴞�0&���+��A�m���;���2�]�>����0�����Gz�b
L��;Z
hk� 
�,A�}kPd���k-��[me�{V�g]�1f=��Ϝt������{j�x�&��{���9����:����j��o�|�}�{��׉ϾGt���~�;���߁��p���F :0����Y��c�>:̓|�ޖ��y9�ӡ����7F�y:�-p.����]gQM�y�?		q�
+.,*  �l!!!{	I	�7�k
�KGw�KU��#-�X+:�u��A
=z�L[��8���
+B|潚��|�w�]=������hi�l�*5{�.]0���wp3�G��N
RqU���"֘[�> a�s�bOn
���"��)����{��>�G�6bڸ��-G�x}�H�Y��|HC4Є�aX(AQ���<��f`u|�$$c_R"����mJ
n�Ƣ/-H�'�<�<IQ�ϒ��(jOEm���־�V�U�M+E(݂�	�|��L�C4S�,r�pa
+�@qH*��tA<ֆ���E�<"�\����q+:
}ѡ@��9�FQ_^$�W)j�m��HQ�`Re�
g�
�|2

��2�������$�S� �cA3-��q�Έ&�"Q��5
�uv���en .�EW�\��A�G��
�%w���A�}��
�(h��i0u��^BӸ�f#��B#l�X� fF@>>
���a���@TN������q�
���G�����q��2͓�
$���ߡ(��2�)*%�`�8�z��
	d
��E!�;
q��L�
.}6D� �3�e|��4�|����E
s262'aq�h��/Ȣh���f3 �2���*��� (\���GA�i,�; <�As
+��R�u�
��t�:3���A��Ld>��
1�y���

+��J
�'�� J�C�ʀ�ÄF�
��KTaP�-��!��D��X
K��/l��d���AV'ɺ��.�g� Ivg�|���[x�bd=�xM��4d'ѡ`1�IgB'��^
 �9��p��GC�I<�ے!ٟ
+��t�Nf at x&�v.�Y�wg!�>Y��� ���/��y���B�	����t�&xC�Ȁ.�	��&E ����
�[��D(��@����/8�n�Bܖ�>��B�E<�����C���!�ρ��
ُ��Qx�� /(#hP�y#o1&�����BPPCU
�ꓠ�4
ʝ
�� =�G��BH�#�3���
�����
KG����R�<U@�@	��U���x��@/�Ҡ���1�k�
?8�`׆��
����0�`A�!
��\��P4� o�@z>9�� �&'}HN�J1&Q��O�n�=�[}K�Aݝ
��<Ϡ#
4��>��(:�qLT�}��å
+A�1���(�I�y
�-|�v��{8�TgP^R�W���h�ʟk�4O��w��y�����w�:�?�.<C>�)��4�½a#*�}P�2��3�L
�}*��Q�������hA�d��$�?�ҵj���}��������j��z�o������W
��˦QӅ�Q�9�g0��"7���x�&�����Xś�U�@|��e渱jGʰs)w�t��u�V�+�ne������E�c8��8��ᑾ�x_����~������aK�y�r�p��f.l���=��tГ|�{]Ċ:�&N�'��ؐ=�ա#��1�+m�W�U��]����G�F���&�
K��_�
+n�[n��Z��
�d(�0��[mmEC�S�C�-���_���z�l/�y�A���o�"����ؔ�-�Y#���z�Y��[����|���%��+���p�2\+9T�cqK�?�gK:-��;,�J/Y_8�Z4�h�
8N�J����)
,9��y���L~#�d
+ȷ�.��ͱLlK�2�ȟ9�(
���v�����mp�o��]_�J�SM��k{A�s_�%�Q�{k�7%�γ�����������fG��pY����eM��>��'( ���d�ȾWOz4̣a[4;Y��p��؛=��n������[�m�
.ѕ�+�
+��ۗn)��z��t�AG����d�9׉�+��e�U�|Y�y�+׾ʾ�ݮ~�.��
��'0�
�FfQC��5��&2�
����%��?�1��A�d���袻�[�~���mC�������?�h9�|{ɉ���Ǫ�]�]mK�:j�\����]���E����tm_�W��l�y8�yƟ�8����H%C�E�S��f_˖�
��88��9v!�5d�l!�Ҵ���eFi���K4�L��������������^���XY�A�@�����3A���������Z��6]M����D�j+���.;�
��f�w��9�&G�7�%��ƞgTF�.�8�M�<�m^�?�7���O�g�g9��9v:>$��,
+�%t��IIl�b�樒���I^�֥N��{��:���+�v�x�o��f�:4�
�kR��e	i�"anH^lYXVt/#��\Ԉ 5�=/%z*"9z&,9j649j>$)j�%�=�֓0�{��"_��B�4{Y��S�.u�E�p���@����
+�k%���Y�5_qO�f���Kf|��
��P�w�� �.�F
+�&�B�W��Lx��YN\�
;.v�%
+�#<���{�+���U���ͤ���Hߴ�z�rL���N����M~�jK���
+�O�D�dg%2�22YI�„)�x����䇑��	~d�7*a:<:~�7ǎ.�D��DaD�r����xY~nS�ћj�ᮽ�&ʷ�m�Z��_��s��2����P��"�wZ~ܙ������� ����*�d
8�ᇧOq#Rg�y)�
~�
[����&<p�H�,
�'
+�2��Ui�!
�{T�a�n�ޮ#�;ڭ5�]�������T�8���<.���)Je�
+sC9�ᬼ&
3����#/8g:"$s&,4c6��6�K]`���)K�������W���[
+��(�ݾ��=��oZm����b���ܦӖ�
��	u�151���$�<��,+�)��W��[�.ܿx&, ��̙ce͇��/���
b�3��]^6��H�<����}_��v�.W�g����A7��;=���4��i��q�^��b7&��g2��J���؞u�C=��ٞ5s�Se�!~�
������LQ ��!^�0ZE��&<�A�t�A��6J�#�ʯM7޳�ɼ�?��)��[
K�
���������~���Z�m���m=L�ko]���'./1=���^�ˁ�J����T*�-xVG�mT�E���b��T�m&W=Փ*6V���L~����^t�����{!V�~���
��g_��[o��So��Co��}�۞�~
���M������'.���!0�
�
��2�v����
M�iP�R
+*GUIE����W��S�c�~�Gm�3����t�p���������P���P���P���P����qW���'����æ�OO��?�
Z?� �
������~W�Q�z��ck �����w���wec�7S澵�
2~R'��
��A
c�C�c_;�e�ڎ[
k��|}��ś7V��}�6}���C�hq��z�E�e<'2������
P��/h�5%
�&5��hQ�tٰ�cJ�	u�	M�	��'&��&8zv1��t���Cf�5FG�w�L
O��
M����&ߢ��gh)�Q"�u ]-��M����2��� qIb�4�ܥ���%C�e�e+�eGu�e�-���Y`�X~��0]��e����h�T�����������h`���2��AÃ�"]�U 7��w�w rR^�N��/��:��Y�������߇e\�L��
��Uł8Ža��1�j
ƨ-0YS��a��^l�ٍ��w��]���hz �ڈ�{ r
$� ��
��IQ�䋪dwԤ����
�G#)34�6A;Y#t������ۇ�J{0ZYS7l�BUm�U��.�m8�Ig7m��[E��
PIt�{ � 
 �=���e�דlQ�l�_P��.���ш����zh-��$w����Ii!KZ2���_

�n�Z9U�߀�
+*���2~Z'���D�w	� �k �/ 
+ at h��׀9ʑ�Q�t7��Q��u)�����t��mEs1
�SCg�*zҔ1@|
��+�PB�%�b��,�H�b��
�I~�������ݦlm�#H�(
z�]T"�in%oFm��7�
E	
)�hD�GS�Z��ʠ3u
zQ%�I�!_��Ib�q(F�خ����<
+� �V�渶(.��@ �B� 	dO	 �D%���AFT8�+x�vpk�:�V;��z�U{�J
F�`Y���M�&<|��������GtN
+���Q�b؁ʹ'�

�8	3�V�CX�|��#�⌀
.`�]�OW��+�N��~n5|�w<���>�����
�`��
��A�
O��_
B��'=����q /n&��y�d,@؆%`mY����`�Y���n`
u���g=�w���4�{�@��7|I:�H��5
�?BH�I �t`{R��"�n>�
|��bf�/s/m!��?�삐OV"x���F`�'���!�,ɹ�
�
0z}��OX	҂A�g,�7��{Ɇ_g"D.�ǃ
+�Q�v��Gl���Y�MtBt�"�s��+]��*W�5�Fh+
!���:��i__�#�;?=�G�+b������� ��`>���7���ҁO=��3�@$�fA���b��"�h%�[W�WG���mtp:���f�}6 aי���
D� �@+��5z��q$X?�r'j"D���u�"֕
+��
��S g8@>
J�d��HJ[Q�+��<���:��
D�3q,����]b��k��,d�;2�{���!���8?D�s3�듀���U�HXA��P��AK�
+}�,�N�&-�*��unH2� ��_�x+l�ƴ�Ew���Æ�؃Q7��Q�9/�9}���p�ŀw3W�q>�&��!��?��{���ԯ��Z{d�>@V�#֊A�rAr��UU�=,7�J�$6�^�Z�^%�s^�[��%���*�7�!�q�+�C��;Q� 8/���DN&A�-��d_Ɠ|Ň����-֑{��@
w.

�lٲ�t�[����R[����"�WQ�T�;�����KRg��I�O�����{�[��7�c��!� �q�e
�#�C1�$WLh�b-���
+#�G��4�g�	��_4��egy?Y���H_κ���s[�+▲%��������kҞ�+�o.J{�I�E�eW@ܩ����j$���>đ|)�֑�����6�UT��N
-g��7G8���/yZ�\�ИN��n}���%�7�,ܫ��Q����=��V�!�Jy2������7ң��v�[��V-��@�g�_B��idg�'=���������6�M%sz_e��_-�
~6K]n�t^7
+r��
���9戞�����;�O���?O9$��
�w&�8�|[ٮ�]ٖ2�h�[�ͩ㲦Է�ƴwI
�����dg��Q at zlZh�R��jw��Z��OkCf>����VE��u��v�$�ٳ!�}*�$�\KlWv��#�Ir8}��`Z�j�Mk귚��}���#ꆵ���VE}Ƹ|{�[)!yD�m��H�@6o�<l&}���
ԭ��m��ݣF��yN��$,�P��}U���.��
+*�w����W��d�S6g
�4e��6d\Kٙ٫��N��
Q�d���s����qYU�DH$�[G�
d�Υ�‘2V���r�G6O�]m�5�
n6�;^�.�{vW��6g�?�h䷙6
+[
++���e�y�U;
�jks?�լ����}���0�RiN�0��-�1�V�U��0.{$�m�J� �l޲�T͡
�p�<߽�����V��ԫ{���5�8���xt�hWf�lY��Wf6�nI�Y\#�-lTW�O�0v���Zn|�Z^0�3
i��M�qTU�?�(˷��y�����{)�L|2���8��k�
�݃�(7x�_h
�{�Y�����G�Ռ����F6Z
+����Ě�*ye�N�fSkʦ��Ԓ�4S���b�:S��T4�1��L��
�	� �a&�.&��������{�S�͠|�>�r�ǔ�m��ݭ�%��"���J�};���u����ʍb��Bf�\�.1�M),�,ո�LZ^ُĀ>Ӑ�X:�)(U�ƔLV���&�Bٜ�3(CU��沧�i�F�uh:�'ʿ��۝j�[W[Ģ��x��=rzSS
+�nW&��./fk�I�i�ViqU��X٬5X��9�S�Y��׺�-C�u���yTe�4�\�Ѫ��u�����MBXEA��� aIX�E at 0�qW
�z��Z�D�
+R�EAPAܵEܗ#n=3�v
+c�NUԞ
�,�g�g��|���~z��y�}?�ѐ�f���͂1=�ŧo�A���4ӵV+����ok2?�mW{$QRYk�+;��.�b����}���˶���S����"{qI�����yy%�����w��,��>{I�@��m�˶��\6��E�~����у*!ݮ3���Ft�mu�M原T�յh'l���y}�Oq���Oj�#
��Ǭ;�&a��)�*>K_X�?+w�᜜}m������d�}�=�@V^�`�O�2�w
�

Y���٧D����N���6��	u�1�ֳ.��3�&������s�Ւ"/j�T6慮;�T��nu��Ûf���=��,=������sӪo2/�
U���YeCs�w��F�Rև�D��"�_I�Uǧ
M
�����%S��,��\RU\�,=㰽C�Q�>�wݩy�'G,iY5-�yc\vSѬ�c{�SkR�N�o�
/
��Æ�/?R�>�*F���GRGC���o#zTFt���b=�����t�G_]ҡk�T�%�^
1��M�m�D����d+/d�/>�08����g6��;���>�'^�:1��U��>���>��f6#9�(�����T��Ѱ�臝Dw]������۽j/qTyÈ��M��{�\�]���ۑ�ފ�_q3�m��,��k
|��V��S�\�1�s�6��zڌ���1�יӣ� v�y�Ŵ#>�3�����D�]�!�h`�?���Utr�뮈���Ӗ����O}�����[�8�:���>��
����
��˼����&<ت�}�;h�����V����F��B
y�Cx�]DFvAu:�yD���gD7�
��#jnf���ʯ���Ӗ�"��kNkzż��r�� ��=Z���kCO�]JO�xV������cz>�F��ȵ=U��͊�t2�T��8��w(C��@u7�5�2��ω.��4
>��/�N�����͈V����/
y�/e���TF�Wfɯf�Ox�dחa3�/�N׷�!�o�c���.���܂��M
|{F����D��7��$�/!����5Z�!���Dul+Xvv�'��_�=7���-)�_�3�{p��~���j�Z��x�����Y4C���
+�UC�l��w��~�����d�5�
�IJ�A�lbY?
�h�GX�a��D��|K��#Q�;#J��Î7n:��Z(���3
+B�H�c?d��`��
��l.A��T
��VK\��_��0l��_�Lj*�P�5˿C��)�<�?�g�D(��5E@�SÝ
�� �j�
Q)f�1K�
+����X.���"[���$��X���
+Ϙ�
LG�b3Pr�h�-�O�rz���ż#�Q(L(���?&�|X
2��$��B�9A�9@��A˷A,�
+I|Kd��c��
kf�.0E���Bc����<����M����|=����H��U�
�`J�'W�
��›'�
��
+R�x�,���Q��
[9B6����'�2��q�c
��=/���J�Gp � P'D@�~�&P,6��:Kȋ��Yfσ��
���e
+�
��� �[�1<~b�8�c����!e���N��f5(�8��auhBPG	/�*����h"['�{�dxW���=��
 ocg_t�����N��:C���3pf���/F�a?�������/��C8�#"P��0!Bg��I5CH�xXAU8�v�/��_��
��=�߳�P|��]6"�3/ܠxnj0�|��r
+��;��A2BY
!�
"�8����@"�n��d3D�L@��I�l�E�v{�uDP�3�\�jv���
�KS������_�!	X�
+��@H
��+5<��B6��9��X��C�'���
+��+a
b2,1m�
�k� r�ỜV�К���K�i�����N�'Խ�#�מC��~
<WC�V����7>�E��pVCԿ�.��4���Y�EjE���( �"A��%���	��#@��#r�
A(�"H�M׫�X��VG+VW��Z�]�gߝ�/��g������|g���]�ך��$���i	��V�c�jD�0��!D�
+hzG�[���C�q
n�@=������_�\���r}A�s}F}���
+ns���[ x�
+ϫA�y9��*Φ9�|���f��9D�Y@��D�B(�
��K�����
���D��*�׌F�!�.��mz
<���vl��i�'�k�?~�1K��w���Zl�D�i&x�b�6S �����a�
[nb<���
$^�@`1��—�	��x!Js�C���)W�<G�nz�n��O���1�y�5�e�uz믬+[o�
z��|�}�	>?2a�4;N�a�1v���k
+�ZC狰o��R 
�#��
�
� ��~�H�{/px*ٽ�_�
+LJ�j�ٰb׻��ͷ�=o�:�~��y_#��!�|�\�q���w�|��
	��$|�Q>P�@
��)�w����u�s�W`���Qn2���#5h�����y��R��/��ף5n3Q�-߇�/�5��u�M
��
+�N	��:!�x\�$hB�6&�P(��APo8���.S��3�)mO��EH��d�����`�\�i�X��f6�iK��'E���d�
R��t�v�阽�'��;'�����
:>|$l*���������@�zg���!�U
4S��
� �V,�
�=v�����S^j�R�
+\�g
�[���ͨ�.�Ǭ=�"w9���9)�xOHK���U|%i�
�t�
D0���^�y�(�ewE�&:b�h�
�F	0$@��@�)��=�Į%�Ω�s�?A�

��şS~+[ov�l��Lq���ɥgr"
�2�.G�R<G��>�IZ�YEࡄ�c|;�+��#v�l���6Knsc�$�S�A
+�j)0��@7��b�-Ǯ���ȳC����c��S���S�f��z�3%쥓a�㹱.#��->�J
�;�,�3���*o&e=d}�0�6�ߐp]P���W%n�
8�r �r`�d�0���q�����-�=�-@���Ѝ}����M��>�*g./�.�q���<��J�ά
jkF�Q��Q����I>��L�'
꒮�O���+I�X�"�) �]��E��7�!�=*��n�F��g�f
����O���NT�
F*������=ERώ���\�>��fP陕�
}z;�D�/�*'D�ˡ��9a~�5i��(��akR�e
+�-D�}/�
+=˷D�u��z�|�o�.5-Bg�7�߿�f�6x�@
w�qo��]�GSI��:m�u~
�<��Y�S�Ѫ[xU�0'k,T�u!T��H�R}�����R�lu:�@�B��L
tOKA7*,Е�y8>�n�G߶a6޲�z�1hQo
ge�!̩�R�^[.��*K�ח�k�U�
M/+�(L�

U�~���P���^��^Z6��j`���0�p�X�W����w�T���
�h�u
:y�Mt�5��2��-��&bEK�h}]m�[UM�6]e�_Q�*P�+��K+���njQ�@�
ɵgCe��"y�;��B����� ;9S w!��
�!tC���}fh����@nj
���Ք��UO�����g���uUMbW]C�Vm��7ϐ���N�Աu����/�	��D��{�X�[~|p��L�[V�)���D��B���w��N���c=fh��

��r��Ͳ��������]�5��gm[�Gn˞�Y���ʆܠ��RzB�����N��Q��H�
~T���
+Ș
+�Ht@Ė��Z��Y���pـp�{
���C
|i�/C
C.�_���
�-���+��aN���n�݉[S���;���mŴݭՌ��V"��0G�<E
+�os�M�8����"�XQ��4�=�E�j9B�a����7j����O3�>�)j
s23
����^;B|�3$t�oL>,u��'{�
R�F�j�+E��^O?��dr�7��
N0����7]X!�@*Bw�]�A�d
Bc�
������_ݤ
��t��{�+<�sA��!�(�s�X亄#qΒѤ�Q�a�N��:�8�?�&l
+��C ����D�aI��)Te�Z=z�Sm�:�g\j�
�j�=
��.���Z7w����:V2ֱ. ��VD�
��ױ� ·߹���?��>����k��/���7�����ZT_ks�7�6�m����Dna-r�[�;~����c�x|���D_|J��������>�KˎEћ�ԂEG->�
���
v��8T)������N�в@]��n|�;)������T{s�%��35�q0Ͷ����m@���yW���
��5�;��d�d���&��Gy�S�-<
D���6z�<m
5��򩊐��ꈲ����Wζ7���V%�}0������֨�j��f�
�e|C�q�����H߱

�H��'D��j�d���V
&ZrR@�𢙝~4�
E��j~��"�t����K�\��������/��v.�dw��f�7D���Ǥ�k��r�{���
��<��sHL�I�SP�Ժ�h�����`S=�{lV
"Z�vЗ;x�~��&u���+�*���.���;ˣ�����]>�vc�_֍Yc�o [...]
8=�
Tx��V{����
.
�\�;vh�H5�mL¯����.��Cw����C
׏���ma3�>����^g�sX~����G��[B���Q(e>����*�
�
��M��C��ra�x�a��
�yFc��
xGa�w$xKp�'������
l`3�v�o�g�&_$*�B��M���#
|Ʉ@�CBZ((	*.�\,�\
�x��H���`� �X&c���	�ࠇW�!���fpU3�+�l�?����D�
"� �\"
�Hų:� �I�x
+C
=�q�?���/�8T��
��籎簝'�c�??g5��|����M����˾E��r�b�(xS�(b
+D��ZD��hĒT�	
�/�j!8���K�"f5S��dZ�m�$=m2]
+{�
+��-��HE�bfy"z���} ];ҏ|!��i�ү� ��9ꏨ��bD�2w�a1�x��d�]� � ��Ԡ���kyX
z� �LVG�'zB9�
q
���h(��
�F���|�?��b��2 ?ɜg��fn3�~_�r�
+B,��#dX�,�T
��<�I���i�
�b@o�����i^;oTo�"q�	���P#F¶ (wB�+�&�x0�
�U�&s/	�]�
ND�P��}�9�0�	<�T<�5<,��6�]�0N�a�h$�.�n�?�
��� h>�zG����P��A}����1�a�4{��W#��
�"�f2���ς�友����#;��� @v��
�Ȩ�A�K�H�?�0��q}�5�H����pvE��,��U���O��
ɯ)��cI
+�n �e at t�	1W͈�<�Y0*Y���-�C
S��ph(����	{�r��!{�Y����<�q������6G�O���g��Y�I-Gd��n[�����/�<��a��˂���;
�g3&�YHe�ϖrȗpp2.VO)��R��lO���s�h�pV���WC�K�rޑ���G�b���f��蟳�b��_�{��=�S���W���d
V��H<�U���6���@ud�������
e��D�*%��d*�=�'�
�U�x�x^h_�I�c���pM���+��c/���]�k��hoR��'��/%v��R��?T�١i�C{$��h�B�gX�8���$����^LUp�6�0�,
��yߜ��멚xm����F^,]}��*�\�{ʳ�?J<S�%鴳N��ح9�8�mu��
s��:��
04:a�]C�xvC_7rX�	lי@x1�0S�=�����J����>�1�Ҵʀ﫧���4O�m�bEۄ?+[+�M:V���Hi��P�v}��>��� [...]
+*2��2XP�H��TA�D �@(��J���ޔ ��A�B�6��=�������sf��κ�޽
������������{��b��
O��MbCx-�'���I?&s�>���XߎM�9#�s�d��kQ���5���n�B���N
y\8��	��
�<��;�
�?Q�B�+
y��#��p�!������u�N��x���ʶ��
[Ÿ�]
�X&w���g�������<%ݫ��:0�/<8S�6|����n�:9@틼H뉸A�x�h�|K�D~��F!ZS4����.y}
+
+���|&������t3�I�	��l}�#�fr+�Ȧ��0k�4�f,9�nD$s�&�
J�{�j<�b���1=�V���7�j�=`��~f����Y�G�j>�U�wQ1�����
�k	�����n����$o
<.������x:���rVȖQ�F�"���v�I��v$�5�
+Js���t0k�울	Ne�
NE�O
U�{�J�X��( Z� �0D]	
+� (��� ަ�i���0��E&p���J�ה�F�ߍ�yǷ
ʣl�2v�2��&%ݵI� �ť�3ɵ�D
K%�)^�U
+��
+�/�
+E�s
+��!�B�h`���/	�
{o.
+���c��2���{WT�K��E�V}���
9�{[�I
����
rU���:]M/�6�
%}
���_��7[��͖��7[�|�Ē�C��_�dD[	:����U����7��JH�u�!ܪ��5���*�5�L��� �Ne莖˜=j�С&�K�<�\�YH)ʨ�+d
��n���Qnz�
���1����!Y*b�RSv�1���0��x��� �{�J�.7�[�$��5���;	��ל���vU
���<�
u�����ST�b���t��<%7GEϒ׳dY����a�$�8�̯~�Lđd"�4
1�2D���� �
+��Xp�;O�눠kX�M�a�щԭ����q-�5ǷUWF�R���W�%
T�
�V�ze��R�kYE;')O�'̝��{���/!�s[����Y��)(��J����"���j&	p���k��
0hk�Z���1�i8f��
���
�.�Z�U��*+�{H˔Ԥ�j����
�<�����|���/_�|b
+.1��]���$�[�=��gp�{W#v�V���vYB{�>bc'ٸ���Q�9jU��#���'�!�@j��YR��.:S�%���񫚙'+|�*'8�8�|"*;R���%��S"�h5�[�K����L��q�����f`34�&��w3T�1L�z���-�#�6�-�.Y��(l���5+ȼ&�WdC#-������
n��
+V�a�#Fp
��V#ZX�+*_ͿE{�Wp�
��`����`��� �#6��ფ�!��l��y�� +�@�����N����{S
��s\»J�C:՞A�=���q��;�
��m��Aԣ͈zL�(Au�y�{�
oq�`w0������
@-vв�u������q��1����Q
��-q��/x�l#GN�

��*v:��s9��>�Վ��i�q�
\r��@�
 �o/"s;ٿ}5�2 �G ��p�s� 
g���N� k�dӻ	�iWR��X0�o3�9�j�U���m�W�;'2w
�(��������t
��ێLݒc��}
9�. �ra���
� �� 
ut
 4� ��|�$@�MH�3��v�;b�=IQ�>�as����7
��[
�M��Φ[sf
+��fjv�g:��`K��ږ:�d�u��
��Ȏ���1��{\E�+�W�w��A'�@?@ίXΟH�	 �m ��!��f[���B��ਞ��_l쫏^��'�1�)i���}�g��6K������y+w��Vn������|�8x�8�]�M�����
h��_ο����-��3�'����p����C�"�Hv���Y(��9���y�ѡ�Y&�/J�9�hZ��r����u3�W/�
����~���,�=A��}�ny���;P��
��g �D. ~��gЗL�{�(�m��#��� ��a��
!:�
5px�7�?��ՙ���Sa�20� �

��f`F��P��"JQ,X"q%��Uc	jt�
E��=��.Y{�u���ƵG"%(
+��!��
���;�O��}�}�'�~�$�~���0Ofh����#��v^��R��+��u��BW
e{;�
��F��;�m����_ x�(�6Q�}�اD��
��֍"�j)�]�5GPps�`|�(|H�?��-"���"��)bϏ߈5X/v�~�nH�>6J�-�߳�*�
.�C4��'����D�����D�
�8?��(

+
+��
А
:��H>0Z�ArCO�Y�
+y�JL�X R`��
Ev�%�����,�M4�����/q�-�T�{�c���DA�D �3
8Ӆ<�Ajt"�����@4�э$H%��ΊB+g�l��jٛ������?�-�Q
+�=�����9ߧ�ȓkpg.\�3���D�\�
�$�7��1#
g1,�e�|�/A�b|���}�~� �̂"F���M�414�b�C=A�l[�*�p�ªdp�Ͼg?Ƞ�"���cM
mdp�k7��
�a߁!\@�Y@���][ELA�,�o1:
���T�4V.�f)��A���CS��As���=��5�V;x�O�LO(��?��o
+
,�*�l!$F��
bf��/��o��Il�
�ErhW��v�n�����gGОc7�3����G
�:([tph�‘W���
!�s-FQ��^�w�M�'b�3�͓ x��	2��a�o�2�_��MJv(X��#0�bW
ax��bhpl6�wh2��w#�
P1��F��
��o�
���/ ���^����"�u��Ce���#|�=�s0/r�i�#L�l�S��ʹ�t����s��_�&�}���
�w�/�p�3���������
���
!*�s}t�$�K�z��x�g�[w1�˗!v�]kt��C���:�szk[���m��m��k��W�j�k���zV]g�I��V������
�[������M��t��:���\BO���$ 5J��b�L���+oJ,��I�CC�)�/��V�vY��"a��y�:�g	[ܟ��v
��a�i�	?z�Mx����}-
>�㡽�.�Cw&��]�mqm{w'�♯����E��^d��֬QSzɫ�ly]j��y�h�'��P=�9]}�G����K4w�V{�J��u#qg���|�&
�x��B�S��F�ӉПHD�1�v(	��C�
�jx�m�<oe������Rk�Qx�)���*~�/]� {��n�0����k�'{\N���b�N�S���K�НI��:�J�����
��s��W����Ǫ�
�m
+��S;B�!�󳔄
^�|j,�Qm~��xp���d鏟�W^�)T��?��L�	^����
�3Gw4s��&se��J����A������}"���C����v�����󓛁��ݐ���L���
����^;� ��Б����n�=*���ő•�I�e)O��
4\S3p\�C�u�s������[
����Н�7mϮ2o�Sc���ec�/�����a����}a^����
���Y��)},�QC����P�ӑNt�ċ.�2
gK�JO�譬��z`H���p�OU�_�w��-oV�߄m�]aސSiY��#�b���g��<�-�i�.�A��\D.�EĢ\�/�������+�
Tϳƃ1�#�[cty�;�-
����

���;��K��|�
�G�n)
��4�K����!k
�6��_lY9hM��-�%y���;�0�^̂�7���6o0����`D�

K{���~�y�1ϝw�
+t�TJ���ѹ	�t��(
.���
�S����˶�y��F��,�_3bBЪaSC��_2da䢢�����
w��-87��fܬ�W�_!zfl�:��Ӌ�
2��Q�P�ux��9��/��/etr���L�����]�췖e�6��լ--�]�Y�~��σ����d�e��yQs�/�<kXe���o��Z\?��j�������ˢ�
��EM)Fd{�#�@��p��>#�TFtf��NL�P�ɮ��+����( �}߆}f���DTDDY�aVePY�M�*�X�&F����M0.5�9�Ѵ1i�h���Ks����������޼[ą3r
�{�����
��ʏ2h��nڒ�۪1Sb_��ǯ���*Ҫ=�R�D�n���a_Y�9�����s����MF���""�,�MB��0R�߯i��P���Q�t	
&�V�X�)
�������w���j+�\ټw�I�l�徼T�ʜl~Yv��<��s��Q��q�;Gr�/+}�_�~�?#��_���
	��I�Q(MC��0
+`~'��4�T�?P�L)�<� �j0Rm�|Vw�ﲶ�ns�z�����5�;-�
�mK
+2��d��<�gnn�(3��[�=蛚u�?%k�?9�_r��>)�(N�BQj&
+S�(Xla���ᮔ�^����;���4�>#�80Pk =u�L{��Ӽ/xE}�Z��h�Bg./�c��$�1�8�%���#�p�0��U�$��M���K�]�O�=��O>�d(N�GQb.
+w�`1�J��D}���P:��} 'i�h`A�=�h�cZU��4���u��
�kbMeՉV9�i�Ҋ
~���-��F�X��_r�'N>�+��+D����8�E;
+Q�� ��B��`��4ԃs5ԃz�{����vH�[���C
��je-�ZEM�+�c���-$u)�)�Y����$�Tz�U7	�U�xm�
�����]��;��xs�6��pk
+bJ�s��� �S�
5��P�H3@/��*��Ʌ�.3��re�v�.+���k_��ٶ�0��Ӥ�{,w�d��h�9�
(w���辩�K�pB���r_�����:l�E����X��
z.��,^.�����V�ô6� T������~G���K5��=���Z)G��v����M�w�[n�̳�>\��Q缮��kD��{x���������v;��a�=��"�z�NϤB�
4�M C���	�r�f �h�
�a]�
��';m$��gx�F�����[�b��F��l
�6_7 ����o����7䴺���)�����A�U�輺���ɡ�QA5h 8A����z�v��V�,��Ns!e��L83	��������G����x*Ng��
���L�бB㐱�U�m�
�
+
���kp��o��o���ȱ�>^����A��wP~�1�?O �H��1Ł�i=�����3
L�L {��յ3��OǨ��ޥ�zZ���t�n�T����!��AC����ӷy���F�sh"�D3���\p-�Ds8I�?D�������M ���y`�%6�U"�� l�BgE�
b���� e�J�2��L^��U++��fMOe?���Y-�k7��g�]����e�w��+���b��
 G)���F����)����O+a�5�X�s\�3� �)�ς@x+�܊f<ndz�nK�.w�T�w�U��
Qu�����
����
��P�v5l>�֟��b�t�����R�k(��j/���˔?
�'��O D�T��
up~�
������	

����`�$
l�F����򙔱xV�2���e������ы�,��?�xO��{�*��Pu�A�o����_t��?��_��#��?�����%��7j`��X~�����|0�^��@0��WA��Nx絔��A�h�ie�ޞ`�og�?���hΓ�����|9�g|H�t��7 B� |����{`���'�
�
zh�%h�p�
4�40�p
p�X%�B0H��1B��o	��F��ʗR��Q>�=���
��X=�Q��[�L���Ʌ�Cy+)��hE�ˉH 	#[�!� `����|E~\BA�Y��p�����S� 8R��B�7��(� ˉ
+r�o�	��}bL�	�x�`B/Hb� �͇C�<��h�Ơ�3���̕A#�z�
j��A�M,�H`�Z&)&5��t�>2L��$����U�)}~D^��
����K�K��0h�Ƞ
��]�̝ACo�
�
�l`��r�I�$���
!��	2A��%r�|I�N���e�J�����vv
:�2hO������Z1�[�•�X���B�\RJj٨�B:	�Bw����,��\'���u}GEugq �S
F�A�"3� �u

+D�PAd�2��30�
 ���"�,��BK�5�ZWc��M�=�hbY�-��b'���s���u߻����}9(z�y'���V���&�q_� ������N�q%]e�v�^Hi
���h�d�e-r8hQ�A�:���'��h��E��� "���[|�}mq��B���L���b�?�ǖ( z�Ũ�����-�,����rw���(
e�}
�
��o��w��?$kxo%
�7���W�
������C���gҋ�_�w�?�=�߷{'�+E�
;
��oKQ�ܒ��(�[�'e8s21�E�3�f�N�Px�pz]�8o���W.Z�
���?����Y�̬�
�Y�����	
0��/��2���]�7\�
+�g����'\e��
+�/�����p�@w��$@/#@oZ�P/��^���z���~>+���]�}�A&����ݙ�;����U�'E��b��;��w�>��3�_�q������)�0�J�Ƨ(:�@��3��8]��z~@��I�w�}҆��<4� {����~ެ>��;��ܛs����\�Z&��U�ٳ��g��7
'���d�Y�>��=��x�����5�qχ&G<ޚ~�f�<p� ���h�
�=��#�)�ͥ�D�l/����|'�3ϝ�� �����K�����~����?�&��3:�����z���������3���ȔA���}������E�>���#z}�b��!����\  
�C
�a�	�Zd�C���_��E
y���
N68�=qh~��y&sL���?�ݢ?`�xO�n�>�A�]�g�w�d�-�Mw N��6]���V�@�A �`�Wal����-� ��pM9�G2p:ҋ},b>H�.��p ,ݨ?$���E��v/�6߹��r{�Z���6�A��[��K:��K7]������`��'�Q���k�Ա�O��/&���f~�e��%<��疈�JGT�؃q�����=ѱ�����{#4�=����]��7���nm���tۯ��6�lM�%YK�#٪�w͡hO��P���c��8� O� 7c���q>�_'��d�$8�,��d�_��۝�P�=>Ұ;.AԵ$�lSl�EGt�����m�M�ֈ6�e��Y�˩1��sC�9�z��:��N�(#5hW
�ұ0���
e���7� gRYp"�
�S'�g6�7c{g�7�'u�pKJ��Fu��=1Ŭ-![ܪ�Y�ĕ�6/Yn�"�UV�ѩ6�����̥2�+yy�]���7Li [...]
+���Íx�Ae

��� � �Z!��3��|gVg�lnG��^[΢	���D�Y	f
i�t�MuZ��<�ʾ$�ɱH��ѩ���I���I'ܴI7�r�/�Z52ĉȴI�0. x82���L�cT�e�} �
+�AO�)t�X
���6���ei��<�q}n�YuN��"[c]�)�g��d48楯erҺ䚴O�2Ӿ�����[F�
yF2�)3

3SQF
Fa텑��
+p:�z@��Q��V́�t�ڱ�J���q���
�
+U�bM˖&Y�gZ���m��ڜzGMv+���,O��vK�
���|��<wUk�%Y���Y蘒�������m��:��ȣ
P��R�
�9HG�$h�����i���9�����e��JK�'-K0_Z�n�-̝���e��R��8��7��v������grU
2�\t��E�-�r��td/$Q��8��
P�>ʟ��P�j�=�����V��ٵu���ZaI�BC]U�(�Re�S�*�,˶I+-��K�
�5;�w01E���]#�.���Bd�S�
c
+PF
F�
�9P���g?���\N� ��ay��4;�ʛfq��+�
�
�F�����uj���,�Ě��q��Ҙ�FYd��NʊmLXŠKh�����LX9:�����R�����X�U ��[<^H����}� ݍ �� ��kW
���J�8�
+�(8��������g�����6NZ�`�jN��m���z���N� ��?f`��af 
n�MP��EES�����k�ٺ��n�]6�e��y���Z(�*�X�
+��)J��Y��Y����ػ�ہΞ���;0
��}����'�MZ�B��׋�ǽ�2��-�c��$�)nJ�jG���%��W�?ō�'��=�v��pU��B`�������J��56<�ցYki3�d�
^S`����gꪉ~E+��߷bz�	+


�|NX��c�.��ts�ȥձK��,i�)X,1�$f�=bao�y-~�
�������K�U�^����
�)5cFi(
ޔ��mJצ���JG��x�i����qoM�nx$p̆��;��
.X�$lhIix^IUDnIcD�ܵ��Z"sVId��ގ�5���^���u+�7�r�~v�'�l3`Jy �*�qE��X���[Q�����sl�$���S}Fn�a
��)k�ֹ9[����V�̭�����3ʮ؇�-��%$}������0�=�5P�����-g�ť����ʁi\�&TwW�QX
�����J�(W���
wݣ�wy�
2d�f3]/����ӪK�R\;-�]�
��lI���6h�
�)�wH��p�8���_�����\ɞ�
:��P��;`�
y�V���C��Nd����Q7F�׍���j)�3u�����{&կ�r�o7$
<dH���_{�ؿF|���o�>1�T�(c��1�f`�6�ɝ��.`2Wû ù�f6h��X�t$
�G��<�gS
��F�cw�A�
�����UQ�˴��2-��Z-���~�ˣ�Q��;"���ij�r�o`�R���?����
PT���Y�@Ƈ��& �c
�O�!g�|&�_$#�%��;`?;}�MC��O"���h-���ݰ}�
���`;+��BgD�i#�3~��n`k/b݅
��F ��I�'��3@�9=.�a� k[,m�03��L�v����^�N���O�й ^�6Am?t��uނvU����*�3N5���?�ev
�SO 	��Hf�l�o|oa�������1:w4�;p��P���A����
��7�� �����-`�s̟ɹ���2;�ك?e�[��V��`�'`�
� �x@�7B�d��Nq�L9ćᇡ�
�7\�.,P.���W/��{���r����g��̎� 
X� >
̽��o����,v�$'e�h�B| �C��G����{"$(��C�� �i���J0�~O��
z��J��cl�r����}j�O�]�[��B�
	��9� �<�9���Sb(T�/�yf(ў���:-��T�D�A�����@'��/R'����y�N�[ߛ�3?�;nD$�_��}�š��<Z��$%�?(1΢�i>-&�¸��P9U�^��x��<~4^��.�0���#�;ߟi�%�G��\�������
��)P���a�I���������6R��e١���Ԫ�֏�
k�괶��M��M�6Ѯ�����Ab���N} ���:��F���9�Ur����ꧠǕ����iE�`_����P��K�u�f�T��
��:��k�A��+��i_��
!7��!�q6Tt-����?�� 	A�$��b@�k�"q $>�����ǫ�
P�
�����Z��%���vٱD��X�}�ب]t�i
;�֨�ڹ����S���+
�D��7Lj��:#�#ݢ{���-����T3$���8��8t%����|t$�ˉ��W�ӵ
��k��i-Η=>w��qڹ\w�Y���s��s�����s�y6%6{6&]�jH���`���T�$>5���@����| �q��4A�y��@�+#
Wӝ�t[Z�F⋴��d�ډ��
�S��5���?���gc�b��)+

)���yL�e�K�g�Mi4
Hm5�M��'U�vSU�X*i�I�X��gk�<OH�	]�~h��/�
���d|�������Ɯ�

�?�?x�c^u��j�_2��z��׬%>{�����YjveV����c��<dݕ��u{�U۶,�/˒�w��m��
��#��v��( �
����
_���aAh*H������QZ͈	�}S=�
>��5�	Sհ�|w
��c����e����my���U��W�o��5��+
�o"�	�Jb�Z����E�(� ��K�!@��k�� ��@ E�(��޸�j��u�nk�n����۱��vv���t����;�ad?����=s��9�s
�����߰NJbMH	k��)	^
ك{�x

�
����s%��'	
�0!n%��&�,%�^JR�/�5���|Ϲ�R����3���q��S�����։ة����PG�2{4�!�x�W�!�s΀���e$	��k�g�����|�¾����Ct�� +J\V卵WI��*9}V��8���=�0�M�TL$[�ƒۘ�I=!��C�C����Y�=�2�/�.�H�����]r³�	זDظ������T�
�u�Y�c繥�ΕA��t_����f�MM�tf<�T���Dz��#��DmZLU
<�lb�u��R�ܞT�K1#�T�
֡�)�*�[SkI%��p�^��u�
^oOq���
�<�╻���l/Xв�n38u�ԓ����c8;�{0K�o��e��=�[��s8�Ϛ6,hUO	���D
���z�������4�
�E8��ᷘ�?d`�A���{.�>v��<��g�T�F�0즎�Ї��yj�^]�w�!�S[�lϩ	m�n�6gu�4Caͤ�&s>�*�
Ie�#�Y�BCDH�YC��B� �>�9��Ή�װ{^.p!g
�0e
��b	�GP���
5&0z
+�ޝ�,��}`k~	�I_Z��ȭ�u�s��f털\;')�Y��h?�P��[x���J�$
 |���s�×j�ߢ�7
�A	��R�7��
+��`�L��R�ʢܺKe�M
+���
��"]`��Ȭ3V�V�s͆v~Y�QaI���H?+)�/n(��|+)�1"4� �#�U��cpу���.��
�{�F�������[���U���QyнŜ��X��[W�]_]j6��B�Jj9%�m|cq��P4*��Ht�+r��ޠ5~#���0��t������`���a�B�	8Y0�O0{�
��Ͳ��ny��\���V�QS���
+(��2U�XE�j�����/��-唞ה^�d�ޗd�����3MD�1A���J^�W%fA��=X��
��4��������B��y#45�Z��ѫ�
�ޥ��~E��@C]S_kͭi�f����!az�S��z;\Yu�:\Y��HUI�Tf"P�	_]Ax�<K���
����	sЊ3hA}�����`�o�ڎ
���(�2k�{�5ų�-�'�U�k)
�i.gi�,�����q@��0)Li8/Jn�-J�&J��G�l!��:�O�%��<�9<�3��38߈g�
+0�ЏX��F��� ��	�򞭔��7���z~����Rz�ز|5��靦 ��ZVj����n�&���Ƿ�q֛a2�Yۿ�q���Bx�̈́���XEna���̣��
s�
Ѓ4
0����El(
x�(�Ѵ�8zf���֟ᥴ�|G����V&�0�z{C���cz�9�{��H{�đ�<�H�Gj#��6�������_��]@��v����v`-�
��}4o�ZGd;Ġ��c����!����P��
�
�o�h�� �HO`�#8jx��g�:�y�_��AŠ
@������"f`
��=@���]� П H?p��
�N�Lo���H��K���Qe�
+ځ�
���<�h��#�i�t�|^w��������|�1���Γd��	d���:f��}�dž�,� ��T�D���H��&{���C̼ �
�a��n�vI!ʕ@��RR�pe�v��n�\��
��u�]C�[]3�W\�
[\_0����s�
��4K�7�%>k���C���?4
+`C�z'f�,@�
��w 
+;�kW� �j0�\Ž�-���nؾ$�mˉ�uY
[�u�M�e��W��/�ة��)Z���x�M���*�
��u���]x��p�N�A�{&q38��;���p;�@�5��7h~�D��@t[ �ۛ �N�D�n���^>p�W��
B�Cȃ��z�`���u�P��	�y���2��cc }8�ܻy3��i����t�u�`�
 ���� �cOx �������>����>���� ޏ�;x}~<?�
_|����^PQ]i
��o�

0�P,�$�51q�T�
+"* �D�����(Į
�ŵ�`Y#Q��	QcC�

֛�"9��s�p~��;̼�~߽�3�Hu1~
�}�|8sȼ{�¾g��
���O �Ӏ�
`}^�oZ�/頺���P\�t�-@n�*���
w�����j
g&p�!pS��|ƟT�d�'���3�! ���1��$�vp� 䋀�@q
�-5ِ�m�f�
��

�Gܔ<f;�p�{—��
��xv
+��	�������w�N��֟�5���'sv���/3�k��cߦ�T���"-�mK�@MC����
��n�*�)\��DZD
؂I�{��OY�����2�p�mfl�_ w��t��W��q�3���!�!�DX�
�&ƒZ7�"�^;��
\0���O�[/
�|�����Dݨ
���M�i6-�%���Q)�2:N��.����sbl'�q
ݙ�'�ۄ�H�ԛR��)4���"ZNŴ���^��Q�F^�^���oI}��.��҈%l�z�*������!�F4%Q:e�����E���b��+��v�w
�9�'��c�G��CzP��zD#�n�
�f�0kۡc-d���a�B�6����k���7�\�R��
u!j���L]�j�F<Vo�CU���;�J�>l�Fຕ@��
�Cq�
 �� \��֥)��������b�J��r:�ɣP-g�<
�<ܗ��\�;�Jܖ�ᦼU��p��8��^�E�'��	霽��:�'�8����^vMm <er�f-7g{��ܹ���������2d��0����j��ˆ|\2,�E�2�7��¸�{p��G�r�"
w}"��	�:�&,���7�B4SCx����ހ�y���w�ͨj��Mb�[�$�Ꞇs�#��8����L��\�G�T�J:�Aq�s���a�������[��z���%T�i��P���#|���
+�O�h�k+-^���#o#n4�¥f��K�`��[7��C�w���P�O��O���g��~�<�}>�-��,U��)Q��٬���j��i�f���M~/������-߿-4�˩ŸS
��۟*p���-lQ�犓�|P�: �Ma(����U��OU��ϰ�f�Rn1MPm6MW��f�7�
+l0�Ԭ7m�\k�eYb����׭V��h��
�%���? Z+j�s�������l�g�X��gz
j��~���:J[�EJ��,6PnLW�
�.	�)�l�ڜk��\�]n^b�Լ�f�y�\d��\h�,�7W��9��� aS����s�\
Nq�+��H�
+e�u��-
?�?;���w
+W�t��X�1Q��cJ�e
�j�tȴ*
+��O�Y4K�Th;7h�.?��~vP�}^P�}n�#���~z�Б]N-�:�3.m��K����vʺ {:+�=TFiXC��Eq�YZ�X
�,
+�Sv�fU6�z���Y_L��.4W�:�~F�rǜ�
��!{����v�z�iB�Џ�dO�����%���⹷����7u�bM7g��j����H��wP,��,��ΏL��떢��u�͌��ls�d�v�q������);|�a\�N�����w�Yo
_G=9���
7Y��#Y.�{{3~,���K�`E=����^&��W{��^�����Vo��c�vJ�4yR�p�	����}��ب<���Bcfd����m.#"�]�E�tɈzëғ�H�P�)�`e8p���v$p��������(����x���J�����O�2'>R=9�����$���A���_ٍ���Cf�	��=s
�c�;��eH��~��kZL�tN�r"}z�p���p�p���c�-<w���L�x��h��I�1����k����I91��:�oO˱�	ڬ�d9�ϗv#��tȈ�F?4n�!=��yp�
+�A��nɱ���^�.c��
ɱBO�u
�
��;��y�f��d�8X2��y?���܁n�I����6���`�q��Y�5��kG��/g�K��4�!=i�>��4CJb���e��6�%%
p�p�j\�&#���������}�������YI
�%���)֘�ꌉ��!;�_3�����T#R�4�b��
J�IOd���e
���7	1P���,,.��V�:,��U��H�A@��*��`-�k1X�b]Q��QD���#U�ѱ���rԊ��:��k+ڙs���@��w�����Ť��,��F/(�GFW�ύ��8;j�SxT��QW�c��(a>_�#�

����}x�k�����+��$�|dm���8��IZ�%BN�(If��4-y�YrR�"!1�ba�\eLB�Ut|�M�,�9���"V��6:���p
�kv
+���<r���X��������`�A�'�uH������^4?U��t[df8#=�U��1F���c�(}Z���`�����h՜�눔Ś��BmH����IF�I�
��
�']p����> A�>0^舶�K��
g�ų��f��]�
��
޹�>-�)9���;
�r=$���eѹ~�Ȝ�9�aّʰ����4���<M����W��3��2�O����/���/M触	��T��Ov=��~le�s�۲�s�r����)y@|�
+q�XP8QE�$󊼤��&��
��g�(�
�X��(�S���rm��j&/Y��]R��YrH�����{:�\���v>�$Khz��:��
�w=}�lIV��|���(f�Yb����.sFx�
��<%!e�3˦�˂��K���Q~�-'-�Vy�[M(Yc�^I��W��ؒS����ڎ]*l��H!)6=
g�;ؖm^�!�I.�I�����}*$��BP�#�� `�h���K��W�j�lҪP3��y�U
�UeXxUY���RzVnQyT�W�W���+��>j�����
+a�^��c�{�s��2�|s@�鎭 �W����U[`�
|7�q8���P3
�k�H��̐��	���Y �I���{�6�+�1n2w5�5w1���l�m��xk�:�VX�X�\s;�}F�Z:K+��* ���<����m�o�Ԫ�Y��G]�׏�[��\?�M�x�,i�+q1�K�6�H��VȆ�jdCL���N���2T+䃶�^7�τ��=�{
��tW�
+�M� Dofm������]2
kP�O

�3 C����
�w��ǀ�P�o��sc�6.C�}�$N��K
��E���%q��\�[H
v	����l�#�z
���,z�a���
�˞�u?0� ��
�&5�M:�����0h��`�<
�c��=F�`Ӓ�rX��B�z�\�U�3X
�>"$d3��8�2�;�s��
`�. ��������00�(лв]�:!�e�
+mv0o�
E�2
+�N����?���!k���� �vN�}'��5����) i{M�'܋����H�Dr�A����.�.�����iT
�����5/
Z�\���/�_\Jy��C�2�h/��`��pB�/�������뭐yO���3�3��O��W���:赦��;���X�_�*��8�kx!v�7\�[c�ی���@77�����,�]N����)��K�Ogͣp4��x0m�ځ���=�jz/��ȏ��I~"�r��~���T<�<<�E�W
��y 
~
+n:��-Z�U�����C@(�4�nO�y�i��<s	P�+��p�%���<!��_
OEl	s"�6,�q�q� U/�`�ŷ�V�o��!,�!d|
��EƑi�CRɇ����5�H6�I��#�89C��"�����?�aC�5{\UoE_�f AƐ)$��'�$��2RI֓��s��k��8����Ё�,�&�1�x���n��g.z�̅;�&�d6�#i���9�9�J�`5=��l��������
��3��
|�n�6?y��y�
�:-�а&Ē�(X�ȗ��'�H���e�U@�rz��YK���-�l�i`q���q�������
+G���#�֌C����cŚ(�CXxB���3�
<���=i,����)�A��?��p]V�k���*�W��p�l'.�}���V��w�L�.t�?�?�h�8�|��kD_��X2�=������/�#q_=ݪ���
�������eU.�����T+qV��UFt���z;:��qR݂6�N�����l��E#Ь����%����
��Z8��;���	?i���;��z�& g��ѩ]�]N�2�>�/�qC��.נ(�+����+��7&��F���,(,ȲܖEv�v���rY�˂+

"��.!xC�E��h�&Fmc��6�If:i:MS�M[�vڴ}z
���<�_��9��y�>|e
>X6�����e��7���pm��ŕO�K���\@��$�
d
��X�q��u,x�F�V��e���
+��*��U-�]��)�[kk�ݵMp=��{�������aj1d��r��r��r��_w�~k�o�7C��fC	�$r"�����C�kK��Gm�o
�����Wk�q�Kp/4
n���R�Z�
.G��R��Z�pP���9E;}V�C�)��g~֬�(�b�}Bq�}Lq�=���=�WΑH�H���둄�CH���W��
�ׇ�G1 �7r�}��G���͛`!:�)3aNi��(-�)��>����)w�f�
�i�^�Q�g2z�{8�8w<z�7���U~�Q~�?�_���\��_����6�|f~�F�dܳ�pύ��J

�V���8����	i0�`����dB�pB
{\��S�r��n�!��7
���O
��	�
+}�	�T�����{TDгD �ق�@
zN
�?
����1��D�NzN$��%L�$S)Y�XJ>}Hca
kl�!M
w0��7���ߟ�WЧ>(�U	�Qϊ�귙.�=�C�Ӟ�OQ[2	�$��<�%�b޿�{?�@ω��l��sc9�ʅ�49Lføv3�3���
�@fk����זs��5�ތF~OF����-�L�/jO���J[���>���})iN��ؕND�"BW�O��_��z�p}�b
�0��L
+&tRݱ���p@G��t�>�ի/`wg[�]�6^�g@ێ��֬�@wV?Ӓ��t3�Fݼ�^wK���ZV��w�#��ơ#"$�9�p��
�7 \G߷`�=� `
+c���i`�@�J0�C�1��)�Q��0��󊸞<+ߝ[В��r�E
9{�NÈ�a���ޒWޕ�
��m�'2��H1���D�>���O1w� W��9K ����(D}�7��
+�A�)
����i�N��3X�&{���m.,�5V�4�
+ZE5�=��!��8)������Ae�_�������H�S�GD����瘃[x��q�z���~\�__� z�_�Βh�l�V���iI�]�lvcI>�Yb�9Jl5�N���-�,�+̃�R�aY��LP��Z���I���Xn6i��H������;����
�\��>�b�<���aN��<�]&O�p[#�ٺ�j�jhg�����TW���ր�r����ETZ�)..
��-�Bˬ<�r%�h����h!��"A��b��3��:���_C�y���~
ρJ��Xڬ,pۤ�l�4V���:�rT'��UZ��*�m�����r��V-(�5�+w3��$F�,�zRn�.��֟"��+���	�=�g|�}w뿈�s��wj ���� mO
���
8
+��n=T;���L���4��.�m�+�9,<��
PP� ̫��rj���k�����2]�%���'ȟd�*"ɬ"�L;atv"�ٖx�}wW΋�u�
��D�Q�9 at Z�z�W������
+�rW�����6�t�BW
;�����d�����B]�
��aX��0#ImX��4ܗj��(IqqJ
aR�(���w�1�}
���	���
i�o{
�
7,�dP��*�=�P艁|�v*ϓA�x�,}k!;�����Z�������+Ը���if��<���$�1�-�%6Q��nF�w1��s�?�FߋV�q#������:(0v2�۵
r����n�
��խ�2�ut��H�yK�����6q�wu�U]��&ۺ�	c��c;�����0��cۈ`��7���γ
�q��Gv#M� ���0�����/��WC�/
R|J��A=�N%
�D��V�*Xq>';���(}��-�ü��gyQ�ۼ���xQ}��z	?j��X�x�c^��.�=�.�v�v)j��d�Ґ0�@��+w(�
R�V,��� Ư���\�2ZBm��6���^V��������
{��������N�r�1糨{�{�i'҈ߕ>�j�@k��� �<ɃȣP
]S!>	���k�jX?���7��vy at E}ea��Op�}P,�	����
+(�q]����ՠƂ��ADET,�NPX�
�h
{,G$1�qu]{�X�ۏ��������{����
�@�x�g��y��gΑڛ�%_�>�`�Q2l�]f(2C����/�)���멷4�y�����赌A.��| b3��8~�Z��9�P�	�rx�ë�;<+"�Q1�ír\�\��p�4é��U�p,�2!9����V�3y����LYǻH�?���R�O	VF�*�gS�݀c��j���u#
`WD�ak���26�1�Z�CcI�ڲ*K%���\�@]+��!��=��b
��ԝC݉�
Eݸr��6�����ԯ��_��Ƞ��AV� ��h�6#G��
�de��Y�PV:��
���S�^���
�
�jO-�Pwm���.�߃�k=�?�
���CIl�3�Yw�8ߕ��F6eل\d�i�kbR5љ�
&��+"�CV!��V`z�m��DQ7��� +�|
�;
��R����@.�
Wtl��l�]��>�
7� �L�b��|�I�I}g'�&w!��h!�y6��
�N�(�F{;Q׋��� ]# �D��u�Or��Lh�v�/��C��?�[7����l��O���
��1yI#_ҐW���������h� �
v<x����ռ�mּE����xD����3��=��桍�i<���,���`��!Pq��k�6@���k�A�?�	$��#�dYM6�RDJ�vRK�!��u�/��+~��xI��!쨭�Pp�W����;H����32�$�t��䐍du�r�
+��.����2i��.
�'��W��G�����
�ƙ�5���H?2�|B>�N"u��9R�kC��:k��%�2S��Vo���>�~���C����G��7�A8RW���m!�
+����Gz�j���XjMf|�tX@�Tjd�������s�"�@#�
�~��I�
�p�'��4q7F�� \��hK_h�ZG��9&��ۇ��G�x�}L��ԙ�0&���H���e��%�r�M���8O_���ŠS��	��8�t��Z%�#R����9��ST��hgG�8���A��'5�qU�˲�h�%�|:����bN+�qJ�'�98�̃UY�ê
+4�jpHՀ��&|�����W��2c�j�AxQ�eN�W^/'������7�~��}�6}pV7�lG��X
�����3�`?���`��8�n��s�W�u�2�:�A�C=�84a��T9�F��@Y��Bz��7ˈ�����n.yJ\��C��;N;t�Q��w
��ð��Թ�G��T{$a����L����敃*�|Tx��{J����
��Hf�Ki���
+IA3!�!�Z��=��k,���	`�;孁����Pg���}��� l��ʎcPR��(�b�dl	H��VJ�
�� �TX)��Iy�'e��~����L��Y�֐՝�F�R�K�0���3O�v���@ol�
��=P4 [����Gas�8O��gHy!s��!)�
!���!9��!�5!��U!��쐣���e�OKC�"#TțY�?���]���8i��G,=�c~��3X��P7l��a(�<�`�G`�q���8AZc�"[eL�eʳ����ƕ�L�FE�q�2ݸS���^�~E��X�(\(�I���<	�ԝ�n_>�|r�8n�����U���	�=���+�LXc�F�i��e%-7��e�&�2L��t�\E�)E�jZ�L1�S-�0�FlSϏ8��gj��1=��6	�,�Pe
�<��W{��>��s� �:��W|j
+{K���ھ>X���
X�?
+����#����e��&��5E�
��\�������F3+�P�yd�vf�>����6�#h�E	��(��)Tm(��O|ǧ�J�x��
�b�c����a�@OdFwƒ�0������XiQ�G����d�c����NR̎��L������N���N�γ�]��
m�M��V71��.!Fh�����*a`+�"�}�����c�������c�
�buX2��q�H�
��&̏(͍��͎)K�#���"q�4�!��S�R4��Vh���u�GEy�a��fav
.D�&�葨(�((�"���0�
̌��
(��q��h]\Q0.
cM�h��4rZ=&�Ic\km�m��&��A����;��8�}������}��yI�ir��j
I�j�I�4���j{���'�J�x�U�?3��~��F[�6�a���>�(Ѡ���Ԧ����*C�PnH
��t��$=WV�^
P�V��O�W�5�
��Mߡ���Y�g�M�Y�Hc֋*�^TZRE�S.q�a�Q��ؑl�ZV���u�d��D��9Tf�C�i*�L��i�PlJ����N�]��Y(_�Y��e���ƕj�q�&˸K���ΘqZ��qC���&#CT
�ҏ����}m��f`6���9�x%�R�uԘTf��bK0ʬcQb����BA�<!?;E�k͔:�92��)϶��-5J�e��h^�1�۵if�No�P�j��M5���g�*�ԛDe�IT�r�������,ځV��q#�SüTpM�9:ۆ��

+�c�
ӱ�1W�;�$9���J͎\y���a�V��Uz�:u��UM��6���6�vU���P��-��Ee��	�^z����o!�c.���*Z�zR����,�U#/o��
�4X���s�`r�I��,��鐥9������
ʄ<�j~�vu|�M\�IrY��@
�PT�<��xʟ���1�.'����`�!�<�N��Q��@X��#�$
&�]�0��	i�d!�e�$�r���ق�ry|I�"�d�2�x�jv�����Y�ߨf�S�*�1��	�>>d��b��Jx
�yh�I%)�{�rs� ��~0�AZy(R+‘R���9H�LT�
�I\E�4��L6��-�U�]ު�^�WY�>�J���"r���,�J������B�����2`y)PK�8�]L�WA߳H^�FB�@̯}
�a�瞂��hĺ�0ǝ"ĸ3��n�d��X宖Ns/���n�O�}M>���<���<��<�Z�G,!U�|��w������K�RE���C��Z ��ާA�������!�n
��&`������ ҳ Sy�_�X�)
��&z%<��=
�<�H�<�a�?H�Di�ˤ�W�d��T�<�p/.��$�H.����L�6��XE��Z��́�hƤ�ј�f"��Db�w�{�׈0�c���B�^a�� [...]
+�	��~�u
����@�����7hYGo��
ڥŠ�$;Fc at G8;#�\<өG��
��]
+���	�����<M�
hw=�n�];��G;�65+���P���`0���^�ہ�N`�
`�~��
j��Cp(�C����!�EA���e���a�qC��1}������C"?
���6j�e������6ր����v�1�.���Ao�8��]@8���B{|a#��hB��>��n~p��s�y����n��u��󘈿���+�2�7���ԝ�Xg
&Qs45��9�=@{��?0�#	pZM�����3�lF{��p�3��,?�gyٟ�!�a�{(p�m>/��
����.�d/`=�
f�C���70���ԧ�'����������J��"�H��5��K��\�~���¿ƍ�	��b^?En��D|B]k�4�
R�
C�I�
�X�=��
+(z������%�-�B��R�&k�O����m���?r
w���޸�p��0�>&��?<a����������;��QWw�}I����~���%���(��Ӌ�\�C
�9Y�M��FM�^�"��ċ
Xd���Oe��D���
�$�H$�'�NJH�#�I3YOZ�+���'��q��p������w��S
�����!��

"A$��!�%�$�X��,"KIYI�p�
�m�w
`7�
�pwp�:=L�
��������QC�@�����E8�&	��x
���:�pS��������8�V�g'���y},�q�gp
��*q�3|˙z���:�t̅�o�
��d,�J͹�"�Z��Q��U�x�.�i��k9W
��vn�|������S8��<F����8�Y��v�Ey�q��^
�] �[�Q at PNA�c9V؅v9v��Z�e9� �'�x�b�z�V,�x�h�ĚX�4��Sg�:��i��$�f:}�Em�d��g�}�?��<���=���?��5T-u'�@�D����Ok�%k�)"�����d>6�2�j4�h�G���L����A����I�þx�q�1�Gx������P���R*Ǎ�+�G�sM�ԝ��PS��20�l<@��
?F-5���A�ո�
��
��޸�5��Z���x
WX�wq�+0"<���⢤��MT�8UK�<�y�X>�Ʊ���s�
�qW\���
�%����u�W7�hZpYӉQ�
\��ň�v
��¸C8?�
΍��3
n�&<ĉI���d [...]
+��^�
�?�`���ST�!��|�:��lG��
�<v�q������2�k�
����p>0�����

�V�#ӝ84�ߛш3۱�j웹	C�v`p���>�ݳ�10�v��%����%U�'������8V?	�_L�Hj�ȹ
�{�<
�3&�̬)8>'�����$��r&���cp�{T`��:
5cgP'v�ö�~ak�
�?���|^�
�.l
+���>�/�څ��Cք|�/����@܎Fcy�G����9���� �2����
�]�ұcq6�-.���Rlw�/�#�	û�
�º�]bO�~qu�i�;�����X\�/�=R}F���4�����X��Lk��6c9�

�b r&�G/Ė
��$�W����|��ٱVW.��j�ձ��*]�إ[/v�I
�!�-���;*��ޕ�b�$7��Sj�U�=c������;�3Ҙ?����o��v�$�/��޸ذ,
+��X���n}���+�Ra��%��=�W�.���H�	��Ƅ��'��NQ��?Rj�j�Wr�^�\	�E
�kp���4r�iӊ
2��)�I�~<�'����y�NGWJ
VR�n0�͐/�
B��Bl4ԉ
C��6���
�r��U�e8�T.j*
w4e�ߓ(N�*;ST��<�����Uڍ�fր�g����_�&k
t���3m6:2B��СŘ�&�r4s��Hp�b��F�66IU�N�¸Q.3�TJ3jJ2��qo�؍5v�ߕ�
U~J�*ٟ��D�2j^� '�9�1�M���5�2��X�Ek�
4g��
�Y�9
��l��l��+�
+s�Xn�HNs�\bZ�8Lەb�~M��O�馏��[��K�դ*�,U&�5S�l�#��5/�G��i763����+�w.֧�<	
9S��G�%չ��MEe^�P��/8��bIn���uKŹmran�b�ݪX-�4y�3>�u�
˯��
������lU�'��
j^,�^��h�71�n��F�Ș�yP��"\ֹ��-B�-΂d�,NJ�`/(�
+�bAA�d��Hy�ղ�֯dۆ4f�i�,�5�L��}2��dZU%3_����S�1�1׫�=W̽H;��X�x:O#c�㳪��E�p�FI�B8�1���(r��Б-�
6!�Q"�ګ�
{�d�w�Y�>ey�&���&��
M��CMZ�MZ����r��4�;��ej�\���A�����+����X�Eq�
��挄���2r˲�S�/d��SY���l���N)ݹINu�VR��5���5I�4���)I%����)R�C���m�|��Gi�J��%�i"���ߋ� k�$�UN��j
r�!ۥ�ɕ�,��]]EB��LHu��W���� �]򲪣r|ը纯�U�U��T�
+U�+W���g�`�/��*���!m�M��VXE�]
�k�#���ݳ��Fz}����IE�DŽd���A��yZ�8�Z1�~�����SI��O�r�Y��S��ZU��!�ϸ�\�R㻤�Ž@�H5�
5����� �IFJ�d$�LEb�<�[ð�u	⽉��f`�ׂX.�o��m���B�w���{P
���޻bh�'bh�*�6�FU
{��'��Z��a�'�|/�����^@�,�
�%��#�k&�� jU8"W-EĪd���Ģn+ºK��u�G�|�q����X�YĖ�,�$��&ni����TUk_�p�
+"��$�D�ԒPJ����2��Uc�LU����jj�:J��ϕ�:��Gr#y�����<꒕�Ȭ
�g��*���]Fh�I#t�M#4�4B3`�i	M7-a�
�*t�fpY
Sa*��gC�~m��w��@�^dQ�bOE��*<7P�s#�)7Fay�
+�믐��
+�����
+̟���j�_�v�;�\y�)`��j�cmAv�3yf�.�f����N5`={e!�/�b򥈥Rpq�/�R�?�-	T at i�ڔ�ʿ4A~��kS>��jm��V�����ҾU^�#�_�W�OjY�Q�x?���Vv&g�����R�\)� �"�K�/�ʥ�k����%O��<

���X�p���1P�
o�m�$5q���Q �c���XF��Tޕe�)�
+SM�4PI����Yh��x>]B
�I��ϕR�)�51�Jj�I��b�۶2�1
oc ����R
P

���RC�k(b
�Wov�m7�)�
��
+�	��z�rj���E���
�o��TK�;$�]�++�>v
�۽
���c~�ǏZ��Z}-ͥ�b�b�� j�W��#0�G��
��i�%�o���FɺU���h�$��/5?(���G��	~
ŏc���0���$~�b 9E����Q�:�����_�|F^}�I�;l
5���wK������a�
M�ch�JV��0 ���E:�\:Ǣt�%�B{�
�K��u����L�/������� �gds2y
��4]�!���T�=A�OI.����? �H+��X���MXPܥ�����
���q���>g�A*K����c�����zM#�c��/�v?�>�>��~���_�zN�o�:p�t��p0��J���Sjc� �
�&C���0��&51I�I1�/�g��
ה_���q0 ބ10f�
X�P+`
��-���6�P���Ol����s
��&\w��V���6=�
�0�a&��~��j	���[��Z=��W�^�u_���:Rt�����z�m���e�.������4�+��k�4�xƠ��F
+)O��<�/�~v��VW%qm�wڡkڧ�:G�6�|"gֿl�"\��N�:u��[�ז�j�D����+D1�����x4�b��j6�������plVcw
v�R����+��4�g��SX>	ίu/`�@��hȉ+������f7r�� }�!�>�w�7%�,g�ҹ�Y���n!�K��kt��
�v��>
�	<�����Z����äŘ�
>��<�r�
jr�sqQ���A</��::o�1�
O�E%��=�h�G#{�P-�^9��ح=څ'p��S��[���m/`z��u���܂��Ϋߔ\�"�D��UG�*:�8�o�1��h$���M��	X�N>�KP_�
٤����4�*�3Z�zC�Ǫljjm3S/`�R
�
_Z�-��
+�N����!����M�h��o����n6\[�������b�6��R��\�wϑ�c�*=V��c��=?�j�CZ�yF+�n�����{�>�@<���iGK
����i��O��)r��N϶��
+ז���ѻ��Z�.G��Z�z�ִ��r��Z�3]+}fk���}���Ϯb?���j�ԿV�����r�(���E�	h�!��¤ϣxz��
ήA{�ցgկ�6��h��*�ku�x���/{��*�0L�
FkYljZ�1I��Z����
�+'�B��[�0x���Լ�k�
}��P�
�����~�+OQ� �f�×u��6�Py��V�WIH����Ra��Z�i��:����Z>N��Z����5/b��F*#r��#7i�{�YQǍԨ+ƌ�G��(�HyNd7x���
�g�{�=Ê6�Wvg�"7�
*�l��.a����n	ZЭ�����跔=Js�'jvL��bR53f���g̈Ya��T���2�c?5�b/ScSbM#�I̯\%��g�ˌ\}�2|)�)�e��n�E1>���=�*��U��)��@��=D���a
���)�f�n$[�I�
c�u��huX&��L�;by7�q����3�q�Fz��Wh�D{�o�͌
������	�q�ڽ]�i�V�K
4+>B�	 [...]
�1�g$��b>��
�������0��{	KHe�
K�"�I&�L2If�LB&�$$C!���"IT�BR,	�@�!�(}��c��V��V��c]
+B����_H��g�3s����9�|/>����X�$��E�
�Ґ���cU�8E5IsT��@U�-wd�ґ�
+G@�2#�Xa�:�Ŏ;�BG�Y��n�;�[y�c��q��9.YK
��$�_�m�q�g�����.j��]��L,k�c
�a�c��S�UU�
+��TE�<��'�,ݩ�ӣg����F�s�Q�3��L����w[���,��q+��'+�y��N��+��fNj?g�8�I�K+��M��u��J,�����T����y��]̈Qif��3�ȝ��;Kn���EF����k�\�m�ǽ��vo���[��V����r_�\���GF��9�Ʊ
�l�M�Ԁxꉧ��,'�r�`�fE�8;J�9SU�3GK=
��q��ɔϛ�\o@^o���1��Mf�g���<`9={�4�cV��y+�󱕒c�}�fCV?��8�+��/�n�-��xB�R�g��T�7\��c�_-�o�r}���'��w*��Q�?_n���0��#�����b&�w[I�^+��Z���\����x�m&����}$�=��o��%�PF<����/o������t��
��]�̂eR�
+d)=�WZ�X)��#��H
+����̈́�.sA�x>0�
�7��f|>���x�����h��A
,�B��
eVVQ�2�#�*�Rz�T���Vj�|��&)�ԥ�`��-
+V(!x�� �l��c�
�4o
2c�������ؒ���bی-�͸"ۈ+��c��/bO�~o�&�j`��<��H���i��X���1J���E�ӕP���	ZJU|([�C��
+���Jņn3�ڍ١�Y�����������3������l�1tzJٓЂ���R�}e��e�WJ���>�C5o�(�]��k�(��F���ӜU���ʥW�j֪"ͬ����F��nԴ�nM�=�ɵ�(z�ۚ\�1��6&��gJ�m<��h����|P�u <ش�����Z�Ճ4�>\3���	�i��7�Ѵ�xMmthJc���uC�2Mj�ӄ�6��i����i|�q�kzC����z[Qk`�mD���#hl#���Y�����y&-�)
�tS�4
��<D["4�e��o�����o�I�Zjlk�ƴzu]k��m���uնY�m{���F��WD��l�I��I��O�ݷ
+ߋ^
TB���:�^Z�V�ŲNoA���
�Ȏ��Ή���XX��.
��Ӱ�
+
�lPX�&]ݹC�;�誎3�~AWo�5�n����lo�l$ϵ�Y�P���F�u+k�Y�k�f`W��ѿ����X�5L��"5�k�̮I2�8�8 �y�w��Yh�$�M�][S�
��
�������λ�z��s)9�[��
��M�Lt��H㱉��T
+���K2v��W�����C3��d//���`�������N��'�����
@��~:�s
�5PB��wK)���w��D��Ҩ
i������pЂ�
v�q�8

'
&�#���a�ˁ����ea�R�#$p���K�����ȵ*5o3s@��;�\'�E�Q���?*
�E�7p
~ۇ)=I=�ӈ?5Jzz,�0�቙��ٳ
��K'��
��'���x�5�Wh��+�-"�l�M�g�����x4#�JÞ�̧�<'�9�=��?��Wь
�1�9� �e��2q���8ρ�
+�U&��. �ר�k�[�m���H�}��+iޯ��p#�
;9��<���K�2�����M�f�]j�>s�!&���E���
:�TK�Xܗ
�.S��
p�8.�j�k�a���R�3н��A�W�e�4��ހ��Rbc�‡�/�L�>e~>g�|�A��`����fN����m���
��h5@��8�
+q�
�P �`%��:X������>��q���B��x_�]}���%�~1�%� ޅ���&��V� #�7B��%B������70v�ޯ�ե�h�>�g^�}~����$%zEs���`@�}x�ËWbCa�ADA
�z��,E�L��
+F���e�;{�v0-[��nr��t�#��L�q�������j��h��8���Чm�>G��u���lꖀ��i�E�P�0'o��eX�׈�<q�L
/�����Y�Y�=��-s�\�yL��ǿoΆ$@��Ä�!�\�0`�
��c�m
6l�aCH ��%9H�PҜm%�Ҵ9�4R�4G��֩��i�V�Ȧ-�4���e���/	Қ����'������������)���'t���pg����Sx������x�
Ƭ�Z��Q������N���
��0���]�����s��?������u������
���]��
W��4����#={���Ԍ�O�J�5�*�:t�0�#4q�V��N|H��5��*}\�.��I\�\��΋x�N.��y^�s\�٧'�y� 3
1��n
S��4���[B�x�S+�k)��j���9�6��.j�Rc����sN�u��i��$�
��c\�Q��4W9s��f92�^�o���:	|�sk�L*�n45��9�
+�����+���9qJxpB�q|N^�3��s����qL͛��y�ph�yLο�
�`�
_a�o�'L����1u��4�tr����X>?L�����0?g�pj���J��U�^l��b���Px;�w�@x�#F�7b;&"�aw�Q�\r㑗�#��G~�-Q�X��M��7�����g����Q;�O-����SQ�p2"G#q$*���q`i9�-���2
v/k�ΘV����#��c�ak�6���X��.
#�/a8�6��
���`�����Cj~���c>1�1�������_��Cq��y,�$Ȱ31;Vc��JlYi��$+6%90���H���A�O�P�KL=�P�IS�A��&ze?�Z�#t�I� �%U�oW�9R2y���WP�~X�a��Jy;R��U���496�*�pz9֧�1�ڌ��v
d���?�}��ѓ�ݙ��C��M��7�!�
�Y�'K�G�=2%|�'�>K���L!��rl/���碗͙s1��
�
e�c [���Do�=9
�V8Px�Wt�S9��ڕ{�QN�Uy^�����	g#�?¡���3���m>�K�,;&Y����g�ɸl`\�*cї���y��Ÿ_�΂j�
+��(��[�
+OaZ
�p�6¥��jJ4��	�ꚰ�>���ªzB$a-��@�S�f����4�(c�CO#��	1.��a�V-EWQ|řh/΃�D���*���.m�������^4��aS�$��E���������0�� ���u��3J$a"?���J�E>��N�ś�i�^�����t!:�Q�%��,
�r\�pVh�E��
v�6�V�Z�k�`�n&�AaԾ&
��E��Q�������H���5咸Oͫz�4K�I���='=駛q��f
ܚ%pi��Q)CSU6�U�hԕêӣAgF����&} F� 
���F@����N�����Z��O��IB[%��*%q���X'{��j��}�񻋿���U��Z����LXj�`�-��P�:�FC#j
-�1tBo
Ag
��}Bc<!ʍ�2�
�6�F�
��ZI�k$Q6C�$nQ�m����C2J��_K}����v�o0��R
S�
+M�0��5�Ƭ��\
��
U'*-
�X�QnE�eB�Z��b�;���PY~%T�I�L�(�{��:�ۢ�&`aۊ^��q�5���,
Q[��x�2TY�Q�X mc4�z��L(�5Am��փb�0T�](�
���D��#���R(
�U�
��K��z�2I��A m�F�V�
l�t���6���9��IP;2P�P��Q�b�ENT�F8��w��Z�k
9�W��zY����~��o�;$d5K"���%q�e�I2AF��O|���쀡�}K���
Uk
+[P�&C~[6��
+��A��#�c���^��dz�a��0Vy�#�{2�� ���6	i��-aU�����-�8YO�i��ɞ���m���@�o>r:#�������w�#�K�
V�5H���A� 5Ї��f$&�"p���|��wH�d�ꓰb�	��|����
�.�&�
7P[��M���`븪oR�#�����$3�2���R$uHYjA\���,
����iD��"*�cD�At������H8��M��
�E�N
�Lm]'{� ���L�wX��ǿ *��p ʐ%D�qE��ׁ��
/B
���E
��yj
��Ml���`֓&����8�֪16Mn?H����}~�~�����=��~���_������Y⦎%��(	��)Dn�(�/WS�:���`ʖ��@Φ%r2m����K�ʡ�
���|���2�L��h�L�cx��,� W����<�$�R�k3`��\��r2����#s��͡jg�Q[� ٙ�ek�,3ƛ���vs�Z+�*�P�b [...]
+�S3`���V�j
eSˌ[ۑC�h��(�u�:.�:�.X�n0g�<��̙+
��[�F�_sa
+�S�yH1g`�^.�@��U�s��$����z�
4���fp�'E��g

�
+m=E�������'��������{�x�����K���4�b�X�94s�퉮�j�#��M�C�d�;�s���rÎ]ر;���ر;h�(|F�u��l��]p�w��r��߇
{�)�5���՜��� ����݌>�4��A�p�&�B��
��4��hΏ{H�c_N`G#�I#ů�K��u�X4�`�;�1�'-��c�ٮqu��x-t��ɞ�%�CR[��1Y~ւ��}8��6�9��4�.�Hb�U���(�M
����m™&>�v
~�f���ت�����n����c8!�;ݪu.4@�W�	����9|������
��-�M��
���yw�t�{���>S������ӆ�#��I�?
�{�Y�r��U�
�
+n GL_�M�%݁{ց

0�=&&OV�ۃA�
���c��Y�p
��

��d�r��Xw�@���0
�C̄9P
eP�`�~a��Y�̍;���ټ'��	�K=�=⭇�܁���uޔ������_�8
� 
�l4r�9�	s�c�x�
�Ǝi���
��)�>s�]��u� ~˯�|�
�|
��\�K�68�
ش����
��+�/�����c�Hg�i�?��
؂�.c�*�Z��k�l7��ң�49��Y}��]�Z��Z9���flA���
M��O��Ţ�:#�W��Ϛ��d����D<��/W��2v\Ž
Z�s��.�$����B���|��D�*Vޅ�p�نg�O�S�-�3�7��V8~$`�P]dO�)�㘁F֞��\�.f�2
���VG����r���!���e��~�dJV����9
�]��|�
��
_|�#�ht�����Y"
f��Q��;�c�^�أj�"G��&�A,��[Y�
�6�M�Y��
��߶i9�l�숗�Xu— ��N
��n��N�a������F��
[ȏ�2�
�d�2"���62� �P
�Y��]�n�@�y�r��������,��9lk��
�tŧ�dX�"�I���h$�1�4429����J��B�b����*_T�*�c1�����
+ۧ*oC��{���S���1���ڝ<�A	����<8�~Zg�ն�Z�f�V�
ղ��Z�n�j�MRu���j?Sf�9��/Q��b�9�j��&-p�-��Q;]T��-��Ԉ�����ɏ��>eo{g�)��Q~��h��A�N^Z�
��0U��i��EUUn�E
&h����er�U��|�w+W��r�m�
�]�w?�<������
��5����n��k�0�I�!�vß���WÕ_�n/���*�}��c�J;�U��
*�4X�;��<�1*�J�
�,�{�T��\��,P�O�f��ӌ�o���������v����?)��E�]�����C)�!��*m�U2�a��.mT��AE��5�k����)�7Vy~��7L9�ɚ�?^3��kz7����
P�� �2VkJ�6�
Ҥ�3J
��&=Uj�E�����7%��g���a�z<+Ŗ���7�fn��^	��� ��
���jz�M�9X�=G(��e�JSF�,������B�W(5x�&��k\�A�
yOcB�+%�F�XZ�(.E�Q�6XU�
�<+Ė|l�%69���i!]55��2{�+�w���
��>�4)l�&�MPjX�&���
/SJ�
+��ج�%E�҈���
���C�E#�\
�0�6�C9�,{rh�a�
�V�ᮚ�ɑ�J�쭉}�5��
5D㢒46j�R�'kt�Q����@#b�jx�F�
�OCcNjH���,
Q-�����נ�\Z�
Z#mP��G�jR��Rc<5>�_�b�5&.R)q��o���%jd�%ŧix|���4,ޤ��5��^JأNh`�'��P�-�?��<*���?we1 $�� n "�"�

�2�,�0Q��NHAA�(����M�q��Z5q�4զ�M���6mz���ĸ�&��ƚ�X���a�9����}�����"Ρ���l����X?m�
_f�K1�S�U����@Y��(/i�r�'+;� ���,�E&C�2
2��UZJ�RS�dH�PR�>%��RB�NJO���
%$�Hr����T�#,�g���=
3�
+��b��oe�Ȝ6R��pe�E+#=I�t���s�j���L��J26(��\��M���G�'�qA��;�Nw(��4�bS
:F�
�@�Q�U<�Cq���l6�)c�22�Pzf��L�J5M����T%e���U��
ř�4�lW�y���4ɼK���`�nkB�C�&���0#�Oa4A
̂�`�
0eIFs�f{Ȑ㣤�@%�VBn��rc59/Y�y��ɛ��M���DK�&XZaY�p��Y�)��
_+4ϡ�\�qh\�C�R,���r(�)�J�
�<zn�?e�&�{)��_���*
Ӥ�I�X����tEXs4�:M��
+�Y�jm��5ں]#�����
+�~��B:��wh��^�0�J�V�E7�Q)��ٓ�1jZM(�TD��‹5�d��J"Z��%�)�����,-SHi��J��T�j�����P�
����FC�C��
ڞ�� 
�lP
��fю�2��_"�gT;s�F�{id��B*�\���H=Y�@[�F��4�V"[��l
z��&_�V����vnjX�C��t8�-s�E4V@TCL�\F4#�lyE��_.�at
���s<�_�-�� =Q
�ǫ�ɷ&J>5IVc�w�U^56=VS��5��Y�!���r�>��>�<�
��e�k�z��P ��� ��
+)�il���u�O� y-��P�0yڇ��>���
+7{���4�>]�5�o_����p��S$��l�7�SO7=ϡ~�z&�j��"��9�Ff3��A��(h
�
�����ܚ�4��K}�i~�i<���[�dZ8�Z�L-P
�ky��g��ຈ�m�
��l��y�h�*^/�|�3Xs"k�ĚC�� �7IÚ%�%m���,�1ϵ�x���XE#�����
��C��
�N0�1Ҿ���C�� ��P���"p8iF�j��z��͚
�� �5J���c�{��J�����j}?���@�?6��f���	���p뤰;YT'�:��p�������p�
z��y�b�F�cI�7x��Z�Z+�o��w��^B�m���x�B<v��.�������c/�>P\���w���F�z�w>�{��pbGs֏�

��ŜC�9��V�M�(���g���U8 ���@xu��������q
?N�x���;�A�Equ����O�/����
Nj[9���W��<��F���^��W]ZG���Mg �_��p��b x���%7�Ҡ�Ï�
,\~��gw-�������/�M�CO���H���9���;b?��%�=�].���;�z���Çp�9����Ae��W�Kä/��
+M��
��y�"��
��uj��M�穀5��Z��z���a��qi����ȥ���g�7�`x����a
na�
����w4������'?P��_���
\c�
+���z��� 
� �a:̂�`�&h�6��5z���=�}�o���Ôx�$}��L�_�
�6o�p���9o��@���
`
DA
+dca�~P���:�۱߄�V��_����?���4z�"�J"����<}��t	K=|�Yx��C?���KWL|Y[0�Ϛ��2�cA���د�j����������~|ʴ�	S�ټ�T?�QJ�
z�9"�>��uqN�	��?�%w�ŗ̺7��5f�/��N��LN>V	1,�v��b{%Ө���;��[��|;�x�R>����<Z7t�H
C�u8
+���#>prWJU}���s_�D��щ��T�MNΨ@�Ə7𣋼������:~
ŏ�Z��u
[����8�}D|E��
�Bm'�|��.85�go�����-/���(t"ш�Z:�s�_��l���خ��|l6bs����ll�2�9=ق�
l��ds����
�ۮ�����"G�'�#��$:��D����
��b��]P��r����\l.`w,$
+ϓ��T�V���W��UD��̮�������r�]��9��� �]���;��A��1���B���9
�(��h���r4*Ѩ�f
,�R����y
ZDd�+�G#��r���"���pvrԾ�ѿ�+`�ܵ^��
Gk4:��ı�T-��T�iL\�����Y�n0˰/� �2,�� 3,3��1��
���$��v�c���xK�ʭk7�V�괪*�R��R�U~���V��.Q*�J��c;R������{����;G:����	r�q���+Y�Ȧc�n:�J�F�d)���ﱰ��G}��Vu���Wj폴�~U��e�Zr6�f_T=/�F�|T
g"S8�%�S[K8]ͱ��lsrx[�����}�嘽,�Lr f���Äc�e.v���L��g2�=&�> �1�����,�wvi9Tk���%�?k�5�t2Y$Dq"nG��9o��r�j8��`!�E8��\���� �I�L&�1��B(i����K����{S
H�9#�3�j���J��Cq'_vD���Syʝ�i%S
K�,'�r %�pj6�i�L�U1��������݌��2���ьQ�fL4-0�`�t�ݙ�2�y_�
d�������2����L�G�_d}>'.�z�i{X��d�U˜j�Ɍf*3��Y&�w�/������4�i'� [...]
+�Ū���I�W=����f�8��%��K�(-����޲Z��<�.z*<tU
���b�e�e�6�Z,��l�:M���񔊧�#|�
+�ğ�bF�k�
գ(Ǡ�Y��gI�[����LwU]�V��
tT��v�n��i�N�b[�a[�ѶA��6v�ר����� 
꬟Rm�v��B��CY�cbAL���7�c~�اz<�(�m;pפ�Q����gm%muvZ�Zh����G�}�F�~����'������&��������=U�S]g<���]�[�Q49ܠy ��; ��߫Z�US�=���8�RhmȢ�� GcM�5465�����䥮i�Z�86�<Վ�T9.`qܠ��e�G�:~GYӿ�Ay�AE��]i�,�{�Iߡ��bH�.
wiۦ���
CSs"
-Է�ao-������zlmmXۺ�n�S�6��9G��(��(q^����B�(p����R�jP��7tՋd��" |�#\��U�K���
Mm�l�4��l�:
+��`騥�����N�:�)��C�{�B�*��s����u�
�����
9�� �� �e��npS�?��uBX��!�'�Dk;4(>ֺ���"�t�QޓDY���
3%�R�=V
+=�x���z1{G��N��]a��92����������k�=���c`�~�5��3�t��
�
�RLrH��[�
(�m
$`
H#Ϸ�\_!9�
+�}u���e��1���ӿH��4)��$���(~I���$
�=��5���X�E�_Z#�_t	�^���}�Wt,RT�
�$k$S ��@:;���I
T�h$9�")�Obp/	�yvO�L\�Mb��&&��+�#r��r�C�|ǥ�Ġ�p�!
Ү��Zj����B��VCq$������Y��!6�BL���a�CSl

a��Td��o1��'"����lg�qHL��ݢէ9(�Ji+"�J_�1uBp:�ع��	D�S��bs�����Ma}�a�ܰn
�Byw�x
f�kf?T#������VJ٭�aH=A�a�+\��8�9�J�I_��4)�ҟ���MD
��Z��Y��XI׃(O
RS_US[�Ƕ�\���[U�\=%���=���@vP5,O8"�Y=��%]�6�mz�I0�H_�)K����0l>.�wR��
�)���Z��L�
-v�j�����5�!���/����C��p��'�V5�4X�ք�,(z�۩g���

C���|D�' z
"���9��&5x����
ZpT�%���
-vz'�5�7�`
B�cㆎS�}���&T��y�i�0(:5�
:�� H�tR��w��K����c���)�j<�)�^�x���rS��긭�����
M��z���[����
9�����5�Yi�Gcݲ�9�S
Ok�I7���e��.���5��ӍB
��2��{2��ce���e
�y��
(�K�k�]XXXv�]`9DPEEE-�}�3�Ѫ�68ƨ�ǚ&5UcըʹM���G϶&iL�L�9�l?�q��g~�e���}��y�G�㣍
Y���&�Fa���V��[O�?�r��&�4ݑ
�C�ƹ��ߢ�����ԩ�~�?�p� Ҫ���
'�K���i.�g����]��l 穋
L�h���ݷ�S
c
���)+����C7`?��vj�	��$��ur.�{�gx��hV.37������k
z���nP�7�I7��M�����;*�D
2f;y6�U�+�6�����S�|���}�.���U�����Xz�M�|��;��]j�
sr�E��5�zH]< �t9}���"�
v�@	��Z�3a,�tS��|
��=���t��������}M��>��|�������\�sOz��O���  B�VȆB}�24F�QG��@�����Ǘ����9
�3���Е��b�A�\�Ru���!u>}��p�?��^0zݣ׽C.����RC�('~�n��>��_~�fb/�%||�������%��
+�x
����6
�O�t���k?������S�n)�qG�>���H^�WB�ԟ�q
��sϨ�سu�������8�Mhl�����6���u��F��*�
��ާ<�k1N161
��){:&�2�l��Q|���#�&�x
��!Mg�M:���c��
�w�����/w�E�cj/�v��wz��YΗ:��Irq�\
�.+

v��*
+��aڃ����I���$bNgkbw%[�z\�h3n6i#�7P����P]�I��4ou.�w:����h?��K.vi ��nE�A�\��G{4�XK�IěN�����R�j5�*"� �/��rfu)�f)�O�U������p��-ql'�e��Z!�#�1�Ѱ��Ɍ�i
>V�c%>V�����2�e	�e�摍�ϯ�il�JfSQM�����4�9�αͷ�
h��f��
x�%{�Z1�p"ơ���4-�6�o,P���
+4j��T��mnq<��Me>������_x
��������
y-���5
�+8�{w��n}W0z�h%��K���dhVW�fv�Wc�!�޽LӺ�R��8M�I~�T�c�&�X���[U�s���<�1=/���g���j�j�b(G�ˋl�a5�ø�p
h��� ?��
�Y�C���i�f5�iJ_�&��U}�M
(Q]�H��Ѹ��8C5�
T
�FU�[U�W�o�<�=���ߏ�2p�Fq��Z#-�9��3#���gj�Ҕ��>(B��lQmp����֘~
��+��~e��_����U���C�,d���lְ��ڪ!�T
����~ �

������q���
>O���������

И�U�Ekt�I�"�2¡�9*P�J4<�B��cU��sh�l����+v*�pX^�9y�n)/�1ON"Cm	\e8�3���
�O�o��S���x���ʨ~*��Ԉ�x
���4&]�b�44֣!q�*��¸j��+�8K^���+ǸC.�!eǟQV���p;8��6���\E@#���$����#�R�S��A*��ЄX4�h�M
l�Q��P^S���U�5��mn�˼HY���L�.G"�\�i�'ބ���}O�0�t ���\{��L�8�g5G~/�K)^�&vWQb�
+�B48)J^K�<��Y��Mv)'9_��e�T(3�VΔi�H���g�f�&�����SJ�^��@��%w��M�.���rdž�P��2(��b�
������4 at n�Q.[��l��L͔3�#Gj�2R˕Nc��� [�\Y��(9�yY�(1��iW�S}Jj���nt�s�\�N-ک��r>�@���)��;���҃�i��
��
��V�gd(͑�TG�9�du�(�9Yg���dr�F	���w�AF��2:�)��SB�}ځγ�$�
�:P����^
����,�g�3���_�Yٲ�5(ۢ��t%gg���W�k�̮*�\�Jp5��f�uoQ��eE���ຬ(�]Eg����S
�Wg�ђL�1P%P �����R�]e����`Yr#��+s�Y�<��9���S�g��<���)�;S�2Ez7+��;�y�*�sIa����SDn[�X��,4&r����P
^p��V��,�o���4� P�!2W����d��U薡�P�E#Q4N�E�
+-Z��E�'�̃�>�8�dY�]p9d�j
F�����Ev���Ǯ"��!�fR�zD�1j5�6�$�HӚ��1�Zs�L�5�Gڴ�4u�S�v���~��L�LJ=���}��}��}��J,}Z�җe-=/k�Mي�\!iZP[O��h�g
��J(�<�E{,�#��K�!�ʨ4+�iS�3E��L�8���
#�+W]EJr�ds���Z�W�,�͊w�Xf�Q�\g�.s%�k�=~�FG!�":�P
eP�idz�
UF��3�8��dw��
��$ٌ4Y�!J0F�b�W�1U�5劫���Ƨؚv��e<�H�yEg�
+_+�
TtuP��X\�~ �ZpA	��x�A{
��]�36:<RJ
3��HYL��Ze��5��P�w���*ʛ�Ho��y���	$�
R^Ɔ�p�`����}t��
+�����V@L��8�GTKC�
3��N�1��ϊP��X��1����}\�~u?��M�g���3g���!��0�C�1�����Ü`��v
.��tޗ�T�g�Yb�3��g����`6��F�����fc!�"� �]��7�f
��́v`�
0D.b8]�`��.�
Z��ЙM���"ׅ����ziX����dt�
$s�
���
�GJ˘+;hv:i4����ts���p]�f�.
u3gv��
�y�g/p9�|�
��G��� �R^'��Ĝ�C�x��Z�H�eR���&�4u\�!�c5~�!��c=~l�������uk�؈����q��C�}������ڠ|��S:N^��u�<j�U�\�>�~��ԏ0h.CM&
l�X��o���ӈ�`]~��񣇋��5顸{�	ٽ	��]��k4N�>��br�K	�$���B]�)f:[`��k�i8`o�g��g��~rr��9H}
�;¥{���Ev��$��
�9�P�,z�)Y�J\�B�c���U�?t-��=��7��������
L0�cQ�q��-��)�8ť|��<�B�$�$��!`=޺!�����\D���|�f)�x���R�����O�hX�ux3<�Ҫ_�;�
�

L
�Y����c��'��E�K�e
+�2A]�ؕKpS��9
��(b� lj�P!ݟ�+a�p:��+�5�
���pH�>�?c�t�$�`]��9���s�Mx�B���@w~DŽ
�q`�
+�a2�B5��
X X��Q�f��e���z���E�|�^&���W��T���_�?�xN���D��H�
x &@�Q��G�ՠ���oLNי�1�]e
+�?>Ǐ?�Y>c2���D�|��oI�9�d�
�8��8�>�//w�@<)�3��̤���N�L�
�?>ď�0՝��� ?���{�wg�RO�yN�9��%�x�%��cd�5^�� ����\���{%���e�3�)�/&�.lخ��ll��n应�w�E��Vو�v�ϓ:��^�<@��G!���������.���b(��?��h�Dcy���2�Ķ�uDڄ]?Sm+�_�qх�*�?J&v�����%��}� �
(n�C�
+�D�:\��fk�m�t��*�t��3z�s��<l�`ۉm�gb�I���
+�R
K9Һ�`�6��o֓�ul�����t��j������

3�
�I{��nYа���1������f���;����L�5b��J�q���a�����x�E�:�d'�ӁⲾ
u��#zo���Б��F�BWA�t�h
!�#����Z���х�G'~,#�O&Z�D���X�����\@m.�6��n��s
����;�w�ޯ]���{d�XN}v�&
��Qhdk�&�Q��,E��*x��
�h!#��#|�B���,֣������r/�!�4G���
Z�-�
+������u�T&b����V&ֳ��n���dt
+�)C�
+�Z2ш����%T�J� ��TO
�e�?<���
q[�Ƞ���}�Ǹ���X�Ƒ��`	������"�
mּ�6͍L���C4+�5F��7:G�1SUS��1��1����2b}r�.Rul��LT�i�*M��0
W����n��
�/G���$3����
[�kK
+-��Ɵ&X��d�W�y���͈���Q2���c�$��@Ֆ2UY��ԩ2a�*�,a�J�4�K��ګ�ʷ~�|��!�{N`8��NZ�u\���>�7�]
���/��Rk3ɰZ嶥j�m�\���L
�ʤ�"i�ʒ�U��T��ZM8K�[T`�T�}���wj��9M���
�E�$�Qnr���v�J�
ˤ������3i�
��Ɨ��R�
-g�E)v��8T�:Lũ#5-u���&�0�P�i���єA^M
Ԭ����I_�	�ە��O��_���
��k���x
+�G�҂Ҋ.�
�
�`��+�ܔ9"T�0k�#Q�i*������7�e�y��G�(�
�A�uY`w�]`�e�]�]6��x�M0�xD��⠉��h���hԦ:���M��4��=�$�Τ�v�I
��۴�
;���^3
�7{���y��{���wi��J>S�����MM�,�)O�"�t�]�-��)���n~]6��p��D�o����}=׿%؃��
+M|���!�.��oNP�9M�1#U3&_���,UV�S�SE���嶶�i] �u���.�Xw��zH���b=�x��p�g�ي�lA�
S���!������|��(^UE�UY����\���QY�M�29m^����a�,�-��<ٗ�оY�.��e���|�9�)�-�0�pv�Ӎ�*��-�M0	&�]
���*�pĪ̑,Wi����*-5��,���T��RŮ:�&��5UW���2�7j�{���/h�����*�u]9��r���Fc3��e.�K�FB��|P	e��;GY�l�i*.�RQy��V�e�(���S��^&O�F{f)�ӡQ��]��FV>�L�+�y��>����F�G������
��� ����


�����*^����3T�͑�[�|o�F׸�[S�Q5�SӨ�|3��kW�o�2|ە�ۯ4�	
��\UZ
�FoT��Q=F��h.&�
�B��
+}/��P06F�k��[��
���y��o�H�CY�2u�LRz`��
�X��mJ<���q%�(�YI�{J��*�6�-h������ �Pe`G�Z�>�-o
�cB�2�)�f(=�
&����rkxȧ�PPɡf%��*!�BCC݊�S\�b�o+6����zn��ڌ5]��
���0P
p�]����W�>�mĤX�6&*%���p��¹J[4,���p��(.ܨ�0
/�6�&|�f�,4b�96Dx��5�ƌ �@=���|��mA{�D�'��R�b�45AC[R�@�p�D�T#E�M
aP��������<��0��i���BS��Bc���a<�}P�{{�
�$�7��e�h�6�u��grј��?�v6ʜ��M�����nc�ښ�
0�m�x�9c8����GX��f��H��⽓1[s�)��V�)m�
)n
�ql(	�".�ɣ=���å�M�����$w�c:<_��O&��
���(���ӧ ����&�⩒i�X�
tS�K�(k��Rˆp�p	[�eg%yt2'�9d�r��cN��/8&s-�[�ֳ���j�i'7�U���j�����C�m�^0}ƛ�nr��
]�"W4y� �&걙zt�G7��B
=��V6�,�Ԣ�����\�1o��v�aM]Q�D��:�����R�o
ig3�tt�:��~͍�[`+<���(f�"�$���<��G/r/~/
��~�
��[��׸�q��}p�Թ�Zj�^LR�
Z(
�D�TL�棆ˋk��ś���?x��0
�Ajr���f��-�8F�
cN���Gg��Z.�x�;\ qS�Y��S�;�Z{����\���������ٯ��_X�bS��@H
ؠAx^������q��4�[4ُz��q
+q�]��C��&�9�����x��
�1�~�c��I��2�7e��
8c�~��!|D�^ �K��K
��X�}4Y���+]$��>���#�I̯e'{ 5N�����1�bh�of�=Cc@~	�W�ad

0�����*�r�޸Ξq�M�&�����:$�fϼ�ɀ�
$`8dA>ؠ�A��d,�-��=���qB���~�#�M����]�[}�wu��O|ʯ~g�
�	��r��y�AX����z�Ea���� ����N�
+n�2.�S��Y4��y����y]����C4���b���9�eh����'�{�̻Ja,#t�Z\S	Z����!}����5}L
���>�U����3��	�xG;h�^��ms�{�V���3���]8
+�����Je|�I��NS���4
hT�O[��}?�#ĞI�y��bZg)�W�*7�e��ƻ�
�j���A�r��z��}��}Fw�����ㄧ
Sh��G�V4\ԭ��~b��
&�Tb� n�_��}�ث�
�ѫm����M-v�,�ϵ�'`|

�/�>g,��ƒ8B-^T*�G���_L|7�{٢����m���Ӊ9����:�w
[i��ɨ�
�F���ܤ��
`<
W�;k,���Ex��N�T2yg?��f�ۈ_F��t���A�7
+�Z��9
#�9N��Z֓I�:Y'���
+��\��9�y������v��2�È?�����#�����K����B�h&�t�0�U� �jg���BF5��׏��p�����6���X�f��
���Ʊ��ZtR���'�e
��]��o��
;v.�p�8q��Nl�p��9�
��&M��N�v-m�v�JW�rT+[�v
�h5���[�@�Q�ZXA\��1&
+

	����
+!:�'���������}���<_+�Qˌ7�ъF�Q4���$�M�,�c�]�O��x��a��YEVW����^e�N�{��{���J�;��Q��>��!���ctM���
:^FݏN�
t��f6R�;�I��h
a�
�:fm��M����E���Q��ڣ^C�"��)R�QX��
�s<���
+��uM!}*F��jT�����
tj"�W�5�=�d��Ʋ7k��
7,j�pV���7�P��E�,+�s_�ܴb�%4�J�{J�CvJ.���Y�m\)W�eʘ���&��+W*ߩd~��
+Z4Z�HAD�˜��*��@#S4�hт���k��"���6�P��
��:MAZ]ƴ��w�R�IJ���fa��	����X��<���1ٔ097�4dnҀ9�~s�b�}���kIi�eF˜�,
�
W�rFA�e�Y�*��]��� �Y�z�����J9ZM�
`
��<�ĉeȖ���"
X-������V�����(b
��֣.��:�c
+�7(hߡ��}
+�
Sk�j.����7�-}G���\�ܓ�<:�B� %�C��YXc��)O�/�;Qb�-�SO�Y�r��ʫ�Y�V��I��6+��^U�rD~ǤZ
[��ث&����xF
Njr;^����
���Ɋp��h����ƒ�8$�:j
�0.��k�QmR��D�5j�q*P� m�Zj�j�����9�F�fy����|Bu����|A5�WU�|
� qO�P�ٍ�Q4�`
�z�=�^�0��>�E���ü�^����P�.�Z\�jvW��]/�ۧ��v5�GT_?(�g\.�&9=���<O��sQ��*�|_����Wy=<M���ۅ%��� ����������<y�jh���T��Nn�W���ꚺT�SMӘ�|U�W���|'e�]P��+���'k���߲5�e��u�v�7�
؈MK6����B�x
�fh��ӼF���Z�r�����Fխ
U�[��U��S�Xe�)�;UxT���e	</s��2��
����J�����n����@?�@�ڠ�w�{����rͪ
�T
t�,�R)��C�zT��^/Kx�����%�_Q~�6����`ZEp���b����ǡ��]?���3D�OiZޙ#{�Q%�VY�ˠF��GőV�#�2E�e���(�Y�=ʋ<���"/)���L����+�
8B��h+��A�h�y
4�]�vU�XY��lY�
+d��e��T�Taԥ��O�Ѡrc�ʉ���VV
�0����ˀ��o��
+�U��Nڟ�`
 ���+/��hנ]�V�G%K�L��*�����ʐ(Sv�M�`�&�$���&0�	��F)~0C�0�^e�o��C#����Y;��]�#��U��
�bƒ
g)4O�$I-Y��@Oqئ��)X����`]�x)�k
+Ә�����$yҫ�o3h$a z���ʵ��5Џ��K�����f�mٓ��)����Ý�7́>�A6Á2���3|43
�#7�96��4U��_�.��4&ab1��۸z�s
V��W6t��-��ri�bA�L���"c+Ƕ�DOb�I�cN�9T�YPs46LJs;�0�c`w^�@�n��w�Uf	5�V�1!��a�5&9�f6�Ԍn�&<�V���
<��cw.�,㱗8��������@c
�<? x��Wx�[�Ǩ���
�)��`��v3֭㬁	����5��O7�XޔF|
4G!��Z�IO0/G(Ǝ2/Ljc�w�ds�M��X,ґ� s�	*�c�أ��`��wi�Go������X7n�
ڂ>�لn�ތ�c+Z�$
_-xI��L|�1y��y�uz�8��c�}���:�`?G�gi��s��y�Ǽ�O��&�� �
�ٷ�=0��ۃ>�9�g4Od�N�i8�)���<|
.[O��+�q�8���O^a���X\���ū�Ú���RZ#�u}��g�\�����"ӿ���3��0���+FH�a�
��W�
���M���q�����M�7��-:uq���Su_��qp?��a�`����ә>^�h^����� �;
�s�͌I�.��1���
����
�_�^�	�}���C~w��=u�e|�������>��r��,!݆���!y��tVL�
X1K�/�W�[�����e�2c�̦Z^�ً@'�~��y�y�_��=�ͫ
�O�8�v?;N
DZ���%���n;7�zI��m�vݺ6[E�֪]��
��B��ҁ(�	ʠ�*�k�T.��T`�@
��`��m��2���sQ�S>����w�{�y+8�!h�n�	X��
��_8�wp at 7)�8���2��}���]c�^e��� ��?��̫��
+<߅o�7�9���|
N��Fb-C�Oo�c���\#�Wp9/�|^�u��¹�|�<~K
��hM�^�#8��0lO1|�e�.�c
�_��
ރw�&��2�؉��_�3/�^P'�=�C�%��i��/pZO�~���|���1��!��}
+�"�zA�RB��L�y���,|>����O��s�yx��4c�$c�syy�0���;���G{�	�W�=���hϳ<��*w�n�Y6e6N��Y���]ad�Z�yN���8�K�΋e�T��/·df���
}?�ed��N�a���A{
�)tg�"֣=�S�q�y9���	�ܯ3�
+����O�Tn���a���w����j~���	m+���'�`�6��@;�v�a��hO����0y
$���>�f{;�{��n2��ŵSϰ�ހ��a<�_֜��B~�c7E�E]
��
��
��
T���K
�2/{��]B?��J��5h�g��I�8Z��r�s̜��y��)��u����&x"�<���参�
ǃ��-h�Qt���1����"���Eo��2K�n�B>@6�X=G�����Rf��f}��6C��<��o�'�G���q�։J�e�kC�}7Ƕ�a��1���1��1��-��4+f
�:O�l#�������
<�+xr
����d���8���rD�.�w-�
+�2k�9�s�9Y�޵��XE�N�f'�;VR+��	��8WY�\N�c��o5��R�T� #߯� ��"g�� ��~��m0�a�{�i	��g���XV�
�q��;��H�V"����/��4�gt6���覲���4�+���dg�dG�$~
+>K�c�@�
Z�bK���I�~��hy�Y�E6�Vh��F��~
,	)��Y}E	���S�Q�iT]�I�Lk�i�S��;�,>�D�j+>�V�%��������%9��ib
"�6���N�&!�����ˀ�Xf�2e�z˪�c�U�9��9�Ty�:�;�Qޣe��JZV��2�V˼�
j�
Q��AE-��\R�rU!�u��9E�q�s
��m
o�hn��0��*��]7�t�
Ե�Ti�U)�C
�j��ꔴ��XS�ҤZ�n�i�cƄ��YE�y��
j0�*h|J���Tg�X>�E����:'?
'�n�݅=XK۳��|���ý49u�_;�-s)�(W�a��Q���V����+�TѦhEJg��ά�kpn��r��*�[yZ��srW^Ru�
pSngN5p�woc-u@[>C�
)�V���B.1W���ljtU(�r+R�W�:��긂��
+�����ܫ�uo���n�k�UsJ�5_���#9�ϫ�}��*�s:���Ļ�v|�O�A?t�
�bq�o&�F�xL
+y,j��+P[��Z��ޠ�M�y���u����7)��6U�>(g�9|'e�="���|��R�uޜ�p �-ĺ�V|e�:�^�$�Z���"��s��~�|�K�w���F�@�܁���rҪ
�d%��
�"#�O��	Y�_�%xQ��gT
xS� �J}NBw3��h�&h��ڡ�{�����P��a�\a���.UF|rFB����t�
�
�-:'kt�,�=2G�WY�!�D.�����5���Wi8�{��	�5سl�y��	�Cc�~��;7�zUS����r�
�cN1d�5�O��Qy|L��j��7�8�SE�c*����h�ct	��U���
+�9?�ހ�ڣس^�V>7C��Pǵ�Irag+Z
+e��ʖ�ʚpȒp���1�xi�E%ɔL��%�I$1ILY��(�	IpB'��P������o
�+h{��$�qh�~�\�r߅uc	�H��^"sʢ��!Sʩ%)�
+S
j���V�
`
����V�4NaRR�Rl�֝��Iّ�]hϠ�ņd���6h�3 /���/��<P�@�������M��M,�"ϰ�2�E�
�*���� &&C7�9ų�>LH/�S/9��t�5��H����u
��i࿏{�v�w�
�#�����A<��0��sqsc,��1�
|�rl7��mF1f#���+�>��i
�<>]��s��
����4�y%����lH*�P_���r�s�N0+8t&�ܧ�H�(�)^b���)<��v�;[�i[A�:A=A�8�m9d E������A����ĵ�$+"�o��<8����ߐ;�ݼ�l��dw���쒓�!� �SAn
+� G�@e"
+�JG�C�)��)R��Z��СPfl�ik�RA�Te�j�~���N��ξ�>���
���e`�.�ɐц��
?:񣛜���M�' �х��.;q
��+��\̎����
�
'���)'/a�����S�}��	0�Pc7�!g� 
��y�� ?QK9d���%�
.���� 5���u!�����}�0�kl����V���O)�^ތ6)��
�`�{`�5�=�0���XI}�Əu�a���K}���u\��kWr at n�zc�y�GY<�D^�%���-ći� �5�M�7�a��&X90��Os�� 6���&j��>괟d+�V곟Xl!y}K؟�6Sϟ����!�s=�U|R<�
�����/��hr�뭁H(!0�
XB��qa�C�*5�?�+8p�l�I�>�����|��	��L�}_c�uM;9`ͅ�9�����x7Z�}���� ��k
�-Ǹ(dD\,
�FN���
�?#'')�3q˥����|x���Cul���b����3׻�Z��>�W�]���y�D&�Qp
�$�
�U\0�!V�s��%���q���@�ϓ�s� ,QTg~)���!Ļ�<�jg�	۬������13 BM�� [
�I��> �����e�W�9�I���н�Fs�ƺFA}�p�C&k��@&0@>�r0
���u�-�y
s%�
��kT�m���r� � YWI���e����{1܏�-S׀�C���X�5�ȵ�G6(пјwU�H}�r���:~\e����������M�!
s?Σi�j��OZ��{���$U1�#�1J	]v[>�_���mpmu
}�)����'h��ЗQ*���
�8�fy
+��>��=��w��$��)
t��9Ïa|�$
���љ�Y�;�6�����f���_)������b�
�5خǶ��&b{�gb���x�
�O�)�5d��t;m�G/Q��'*;���������)p
��X��U�f{
&��wѺИ����P���n���.�N������Vjd
~����E�=�Kx�:\?דDt�O��`X	>��������-`��U�2��K��@	�+�\�g���Q�Q�����H/5�?����z
�OR��z��^N��l�߰�Ǩ��c~g��;h�$�
��i=��
��lYnl�	�W�P��:l7`{
�'�!��n��
-�n
_�%s�ŃtAz�����D��w�m��_P|�
�ت���]>�`�td��J�a���7�#u:��ID�Q��R-4�,M�GZYm�� �b�ÛV�͵�ǐy,�G���1�C,��E'9� '
�F;5:KQ���L����䥅�L�>��f2����H���6��l�����q�~+��9�3��=\�s
s���A�OǾ
�ٚ��5E^8BpD��J8j�����nV_����D�����*���P�#����
ĸ�c7|�8�V�3�p�w1���wG����6Q)pd‘G
n���Rx�੅�
�M؟Ld�4�H�R1è�:g(UW�^1DwA����ý��x���K�#>
6s���1�3:m���Ԑ`�ˀ)��𔰓��U
W
\�ᚈ�x�C����	v�~���nw��]�Al }����`��hi�`,�
Y̹��ß�I����)�&;U�����^U'�4$y��R�T�R����LPij���݊�.V8u��S_T(u�)G�9%�RQ�}��_��ι�_m�>�@�xV˻���JP�=Eՙ��a�2å�L��2�T�Y���rEm5�����W��EA{�������kߢ�^y��䶝U�����r
�F8����X�ʸ�
�HjF�Jޗ�O�����4�:���Vđ��,��Y�*�*U�� "�� �3�����X�|�W�F�\�~9���6> ��>`���b�:ɧ2��0ہZ��yVJ�)�7W�J�I*vf*��R��R�Y N@����9U*�!�k��]S���˵HN�Ze�^���+��쮳�
9�ALk�=�YH�I�;c �Q5�W�R���>
B��K�?/M�<�
+�*�ϗ'�'�;�<w�rݵr���LR�g�
�9<�e�l���2<?Q�������|�
lυk�1�
C@�"�S
�|�^PP�,w�My^C��\�������*�7T�o�
�f��3e��U�������Yɾ7��;�*�{G�ޘ
��� W�!��A
��yA������-��@��A��������
��-T��P��C-J
�ӆ�)1�B�&�a�a0�L
�bZ��N��0��uȣj~�@$�_@���u
ϝŃd�S��d�ʌ�*#�Uz$��H�R�ÔmTbt���(�"�I݉�À)��a���%�ى���>����A׃A��A���?L�
p�����ew�^�g���;���n�	�,$�$�\ T� ���
+����D��8V�^���Bq
�2��Z�N��6�#�2�Ң
��
��>��q���;���9����o��yn�'�[鐫�%g�+{ ]I�l%
+e
VP�!��d�"Z��� �"�8��<�<]��LpUq-��@�ԉh �ܛ_!�
+���c>
)�
$�Uc��֥�
&�S�a
+(��H�w#��)�<a�s2�9�C�>��q-���J��FP
��.�~1���͵�~L{�	��M�H��i�
4���
-J�G	l���l+@�5���c`��*�o�
>40E70�c�ۭ�
� +�W�/��p����dK��
,1!���a7���f�F3���bl����l
m�
��B&�xjG����؄��� �;@�� |�R�o.�����<���)��>
?:�c�m9�&'�4�^6O/����
��3�J��κ�s�ܺ�b��Cg\��o3@�j�i�y\g6��^g��8
���9�@/��}��o
��1DN��Q�C�b����wD�&�A�����z�kN#� 
�����-�:��Nc�nx
�_����`�=��'�d6���2�� !'#�FW�?���r&�e��R���
R�;㚅�ͬ���U�[�uv
~��&�v���6�IZF�
P�I
�`%XEn�E㮥>��yl�>7��
,f=F���5���\�3KT�h\��5����!��%�>��擤!s��`������1k���D���-
^[�c������s�X|��0��>��
�CMlFY}
�s
��$����A
�n–��Z�5d�||�X��`�5�?b
�ߝ%b���&&ϰo_`���a��M�<~���H{xy7����1��R�X���:�8{�WY����I��ň�%
@�#_&��A�%���WL����$��u��8�x�WX�Q>8B>�0uUJ
�&�^�p�Kd��|<a
�&iD�
+�ɷ��e
+�ׁ)Vޒ)V��p��˻�K4�w(�_��
���B�����S���4n;6Y��a�s����_����"����
xP�z^d�t�
+u
|L/�AN�Aù�#�����$^{Yz�<S�����U��)��� �[x30�I�PJ_e:F=��3��S��?)�(���G,�
�J�.���y�_� ?��`0���!ݴ�o4�-���2yV��0���~���o4���}6�{4���?��~�
���"~��:��8
��ܛ$�_���,�`x
pz��&C���k��*��2�����h�K�
����q�x��i�F��A�8E�8A�8��{?��'��i��~��y�X
ԟ�t��N�-�8xl������w�R:3�v�N����k��8Z���~
��^�i@�Gu>G�|Fw�UV�3�]����6�KD��_P�Lpo����Fp�*%���U~/N��
�)ڇ��GN���vSO����8��j�Q��v��85�mjd+~<L<��P6�A<�AT��N�ye�s
|
�+�E�ďX�`��8�M���Pei ����ZN˨�n
v���6�vh=5��Y�k��^�t�7V��VRy��0B���ږ�;
�K�[���Z�n��v���X0c�K{N9�.�v9+
b;B+m�v
vgSݴ�~�߁�T�Z�ڄWߣz�O弩��x@������j�X��l�f���a3�.|6@���b��rl5��]��m�*fc��J
�x�K��H��n2;���6�� s������tr��1��#�<*��]'�`;
db?�J,�~9���c�{���_Og���hgUmD����B�g��&�O���o��<O�2� :�w�E'�� '
�,8��(��� 
lF��v5�U�h7��2W�
+������t�0�P���q�5��;�@�H�1�q�(�N�{����Q@��S	�t��Ox��ZV1�j���TW��S��UE���_�m�^\[�Ɯ�$
-
�z�l��u��
�5�O}�
�8��!
d��
W!\��T���Fl��U"[�y�O���d��n�8����(G�F�>Ɵ9�D��!�Mǧ�)���;Lr+���j�OU�,U���*���.V_���ZUb�R�mP���*��Q��!�y7^��'�q~��&
��������>�@
��^�gU��cS�;Y))*wzT�0Tj���b{��
�*tT�(�Ѭ<g�r���q+˹Z����xJ~�!���ȗ|
�qm��2�˻�[�
�U�2�O%�${
*v�T����S�+Ky�<Mu�(�]�
wX��&ez:���W�gX>�j�-J���sH
�O�U�/�Zl���(����
"�Tr�
��O��%*�HV^�SSS����I�++5W����0*�7B�MJ3:e�K�1V�ml��xRS���4N�a\�ɑJ���b��1ǐ'� �A9�J@!���%7=A9�$e����(����ϗ���P&#}�����cr����?��8ʫ
+�o6��$�,��fw��I6�l~vIHBH�&@�J$
+�$�AkJJ�J��RZ�j���X��ZdZQ���t:0�V

�v�ږa�V;������0/��۽�=��s�}�o�
+|��ӷCy�d�}K���e+��
�{�y�3�����݌�s�lP⼫����`�M�2�|ey��*����
(!�Uh�+ت�`���>9�ò7��RN-�F
 �����6`|K�Zi�
+�����|A|�l�r�
:�)w�
r�(4K�P�
+�Q~�R�pB�p���N�ˆ�
/B׏܆hD��Ѳ!|���PN�c%|�a�#h�p���JF�0ߕ�K�<G�r�����rG�*��TP�V
���+�*��X
瓀�-� �c

+�-�[�� �1��!ʜ�ޅ���J� �x��]��%�oʀ�gO�&w�]E�<T�/��Ɠ-�Z�MT��D+`�J00%F �Q������(b
��'�h
|},늑���]�/���?���<�w�}Qܦ�Z�
u4�zX�;{�S$6ł:>ż�bxLq㤸S���n~ǐ�� Ѐ
(������%�������
�]%\a8��g��|�JH�l��H�Oq�4d�i

��X��6�5������|Ն�oexhE��0W�!��Д� ./�n{
y೎����Y|<���
�
��sc�Zl�ŏv��0�
��:r�� ��E�E��0��&���u���٦�0k�@3�������nI�k�%���e���
o!�y��a|��Hs�v��B�������!'K�A#KY�d>`�]�*Y� �� Ճr\t�u��L-�1G��l��k�� �Kx_
o��8I/9kA��!�h.\���c������ <�FV�x%�X�P�b����1����4"�sq}F
(�vx��g�U����m��xm�7�%��g�#rVZ���5�d
�c?��%DN�)�q63���c=
+qŴ���yּ#
3��6\��/5��������Q��
������%��,�iD e�	��$~l�6���[)��l&`�,�4�o�!��$>��2ꄯ����MS���~��w9Xeqrđ���&�f�������Nj�n��
�q/���X�6�,���a���o���������=puV?�&�k���y��G�C&g�
���3�d��L(9!�Qj� g�����ky?ۇ�G>-}����)��w�žk)�
+��!��#������6ko,c\Ɋ���A�(���f��C�~
��
�y�Cv��
&��ړ��{OK߹�F�*J������y�W��=烀%���
��qe�#3�p�H���\�΀���j�<9y��{�@�&�/|N:��gT
��"b�c�|'�k���u��4���
J��g-�_�-�_�_�߃?���[�m��rr��z��{ҿ��r��
GQ
+�-�@�t���%��"}�v�̨N�|S�
t�LF�8$P��3�\�P�E��M /3y^b}���"��3ɹ�#LV��9�����2l+C
+3l3�ԑ���)e�X��%�x?��<�>j�*��
+
+�-t��L4���&��qX�sh^�x_�xO�Nj�qJ�tR{�
L�(�������P��&˽�v�+p^�Z!��3��N�e�8�
q�Y�
�������S�q��u���
��s�a��(�C��2������M�~�]��
+�{mf�{�L��m�5��:'�`6�?�)�
=�|w��|_APŎ��L�籟.���L��i$_�y=B�z?
"
�k��z��DZ}���p_!B<DK�M`�2:~b��9^_�����#n����r�GL_�����Y��^.�=4����.r��ى;��v��
o'3��x��ll�y���`<g�����u͑�v�
*�49���9�T�
?n#/[��ne���
t����Lh�l�
+
�F����n$'�Dh�
�R-며���U`
���V�f�&�&L{����s(!lǰ]��v[a�`���^L��S
��7
+�U;M�ܧ�,����~x?
�,<f�ﲸ�U`�s%�v��X
S����jjcX~l��?�����m�nQ����p������J���U���=ŵ�[�}m�t��ڿ�
+6Z��0�jT�ql�A!vݠ�g?�#�����o�^vP�}Tʠ��N��AV�QQ��f�^�\N�\��Z]g���u�JËꘑ*F:t��J�3Қ�p�c?���R�l�B��M���fb���fsR0���$�<�7Af�����5��e%�"���H'#ݸ�� �(�'O�jl�c�I�xӀ��D���&�l-Y�����8K5��t�8��&\+7����c��H���T�û�H�>%��}'�]�
J�)��
�(<5�k�n
����t���b��#BŅ9!:N���w����p����CȎn��$���|_�)n�S�V��"xf���O�*x�l�y��x��H�%k7�
x�x�S�spd�;�I쯇o9r��8+�[@
+ԁ8�c�ҕ�h�C��|E�\
+;��{��Tn���������6�ٻ���4wX�܍*ɝ���yyr
��g�E�o����/��(�3�?�d�o�%3���$$`BH@���
��U��d���(Q�"��EED
+TP�M(�Ȗ��-��Z�"��"K��w�;=����
�4�s3_���s��g�}���ߖ6�(M@�rA�k&�Ь��%�vJ��^	;��
K���g�M@��	ú�Z|�
�u�9I<�9�v,�}��l�+팸�	O8:�C�_
�mk��<�b���$�J��.!�)A�-A�&�.~OHtO���H�ZsѴ��Ѫŭ�$N�V
��i�%M["V��x��sR��ܢ�x:�{u�>4� �gq�YBz�t��}N�}.ѽ
�z���D�Eģg�q�%��+ġ��~���Ţ��N��y}d8/a�Kb�rg��
�*bNE�} 
+A
�3A
���"�M�~��K��[4�[<~M�����
���[���[�%�V�A�[���r�Nj�?�����]༆��e�y |�1�G@(h�`�*��]�S�@�K�!M��>���b
G��s��)4
N��_�(|  �SC���,u%�7

�$��ђ4���ų
��`�6уv�-dw�C�a�آ
�ļb�1a1������1NS�aȤϋ� ��8!5F � -E�Sw'�:�{U�!�<�\>�y���0
���?�*>���⎤�3�&��C̙
"�,�\&57��K?�GӚ�
+�4J�C96g! -dSCI23!�rm�3��A��{�Z"���% �I�
��cfqdZ$-�*�
�<�|6xcw!^"�0�Å�("�q��k�N�Ƥ��5�!96"M�%�3��
C�s��o��#�:���2���������4�s�4�/���
�%���RLZ�Jk���M[����f���
+�ESjh���rٓ���\�gRG���������B
�%�xP�EWjI],-��V�I^T0�
��G����FZќ^IRkA#VN�,c.�'�Z�ϕ���W�:���g/�\��h��L1�$�i�RU�kku�RG[�bNڱ���E��AΚh˺���ن�TI�n}Rɻ�@S��3$�(����
�4�[f\��"��	h	/\4����D
�SGw��Ά�݊��+yލC�F�3��gD�v6gT��T� ��a[>u��
���������4UF��h���F��4�B@?�h�I|
b�aX_���Mb���H��������t��%�0>���B���S�
�.���z$�f*|ըj�@8�:F�F�0'�YP�y�H�`�pΪ����4���M
LH9:K��F�f���������� ��T{|���j��H���h#O S�4pu�d��d��������q'�q�m*i~R����R��B�7��
೛%l�jۛ
�Z�o�����Iq�@>CRM�}�jP�~D&�%�x������8�(���D�笚�|�9*Ŭ��v��h֘Ws/�w��QqN2��,����AI5F���(�SB�)RV�$��M����׍l�ux��U�y���d�.�/���(ǘn+��Д�<�np�5�K:ٔ� +�s�jU���dӨ��ݒjb��+�1'X�o#�M�����c[�:���>�ЬB�݆��j>��׍l[
�����{
T��3�8؂r�99��<��c��Bv�OU����d���
N�[����`(
���Y9�y�
+6izEq���e-Z^Yq�խ�暶U��_WݱS��v���7��٫w����8�v�C�
1r��1�7~¤�Sn�c�o��5�{gκo��s~?��.x�?.|��EO<�䩥˖�xz�3ϮZ��
k^Z�~�Ɨ7�y��m�n߱s�������[{���o����{�>��O���g���𑯎~����}���Ϝ=�ϟ.\J���������J�]I��YW��Q��dg+��/R�K��r��R�+��k��A��ݔ7)
nƃe�-ʅ��p��a�2b"NLUV܉w+3~�ܘ�
P~<�
y
G+K��<��+/b�:��&e�+8�f���M�y[�sP��>�|�
�
��T}�<:�I?(��)�.^J�
>�\ͻ%�~����_�_b2���lv�����ǣa�O���
�G8�#1<�\�|��LҚ�7?3'�
�t뮶;�f���[��m��q&O�6}ƽ�fϝ7��
[�x��e+��.j��[�ȤƟILiL�T*��N���h��j�~��o����'�G�~8��3gϞ;w
�?]�p�����ƶ��e����hbm���֮-;zW_�5����a��
3�Ж�����j�꩛����sӲ��Z�d���O���G.
54��PCC

54��PCC
�w
+����u
%^��]��/��9���	_ԏ�����-~k���w���e�
����ܝ�V�����O��Ѣ'�~�H�PG
�VF��ծ�=��Ͽ1���}C&|�w�w��>����/n{y�
/Mٵz�
o.���Ѳ{�_�d�'��װ�6R�k]�/�޳�̾�����{t�t� p|g��v�zf��fg�i;f��i�����N���д2/A� oF)�TLP.�� �
E�["-�����)'-�߶g�/������y�ޘᎀ�N"_�
+)�U�k�a�"a�>W�~�ՓĢ��
�?J!���&�v�e��zz���c��-̣>�$CkS�F��kCe\	��)�j3J�-)|��ʉ鱶
d(;���nZ���s�����>w�'C71}f�Dm<W�,�Q��d�uY�կ���b
�Oi�6 �
|� :���n\h���[��S��<Fǯ���%��wE:��!D|�%K���Xu���#	���?�װ
+�����}��~ϴ��v|�ʵ����M��4Yg`&_�`3�Ȓ;
+TEr-ZF�b��J�_
��6P���@ ��]T�n�m��=1�l3<q�Z��'J��7V�
�`��tH.]�*��G�S�¤�j|
VJ�[(�
�{V��5o�'���92z��ᴫ{˔�z؇"�
�����ȂD
��A��ز�z|9ZN��6P
+J!C��ճ�'׏���:ڴ�^tSM_C�Ƽ������
Dz�1$���$7��M��0-���,�6P���XP
�j���w摳�Z_8�l|�rE:��Nxc�����~T*�� v�2pFB6����Ŵ6 ޲
�v�eF`����5m�gw��8�Ȁ�Œ9�[y�ވ���X��DBGG<����3))���若[�زl^��ў=��Ǐ�SϞ�)v�����{7w�o��8�2�
+���bpO�8�">����X4	>J��6 ���3��O;F�.��
�^�h���
���W��}�F�]�υ�
+{��E����"�f(��/c�`�4���Ѭ����7�h�^!}w�>8�5��K�h�ʙH��AΡ �5�.-F\
|�{Gq�{���im=�/���Z��t��Up��
pdK*8�+��#�K����D0��
+�3� {���� ��7���1�7���@���A�����o���Pa��.
57�d0�~D�K2qH9�y���BCO�mHLU��1tՔl���2�"8���dX2,�
K�%��e(�
%6@d�u=
+�ם�����j����^A���\�ˎ�*����$�,!��2.�K
���Gv[��=����ZP
+$�A�=]����+�#��zw�^
�X�aF�*�b��Z*SR�D	�&^\��
��4��h`C�͏@v~'��x�<\�վ���A�G��i]8�^@(W�I��<�}I�X�A�-ed�YÍ�DV���a(�
e������
��Z�g:8�QCHz�,��I^���P�Q�%�x��I�-��0�2����,탡 2Ad��
j����k.s�[�g-���H�Q���$Xi}y�J&��E|���N�e2��
�@ZF��� ����O�
�A�F�#
zw��/؄9Ќ��ވ��0RYe�J($�9J;�C��`�M􂜇����}0� ��P��/69������&�I��l���됼:y���*LYT~?W at l�ͥt%��SY��Bf���a�C�*�Pn�;�ӑ��W�_�ހ��}��]���M��*��'�(�b��N)�%�O2�qbzȅ)}���^K���g
X
$'��mo
N�_u_q�
�

y�[�r=�P�"fU��dV���p
���=!�:qܴ.K�``�ZJ ������s�^�9
z�����5��-���&i	*ઑ�9u(I�#O���bD
QHnƖP
��VKE��2�j���Vwn���
'�\
G&���Ǽ����Բ֠�m0�NJ�\���ɰu�U���H
Z
�
%4Y�@�"� ��5P
��o�g�1i�p`䉳���ߦq/�����g����(M�Eɱ��Z�,��T"�V $�K�M� 2T��jA}��)���Ï
���9;g/�(��Ė>������Ȝ�f+Z��5�b�� 
m ����@9��� 2v~	j����l��̆�q���'G��%���7B�#~�̇��ސ��t&�
�n�磛#X���B�.�
��x��ю?�S�]1a<�u��톖)����/�W/�z�fn��N�cSG��q�(j�9,	ߏO
�%���Ɍ����j��1!��@��πt�/��,7�]i��u�䁇a\ŎU�q\�3:Z��:.g�
+8g��:
+ElA��,DBHHB�@¾�- 	�@�%1,	{ 	�E���"
+ZD���|���>^�‹��w���>��L�p�P
8:H��"���O�l at H�4�@D E> E�ߧ���h
�x
3�{
=�p��~�@��bI��b����)���y���`o%��6������5~)�
+}
�Oz
t�Gr(�
�y�������_
x�	�{�L|�@�m�T������+5s7*��N�
ȁ3GR�]
x��څ���)�
�|9x��^d\	\dy��b��.pP��d��m�k����k���m_� ��"8��'�q��*�����)�c {&��B��?P�|��5
+b�} ���\����hX�L3���5��j1|����%��/h`�?
�b��!4�
��У( 
���^@9�	�S��a��6������
���r��
��%'����P�b
5��A
�(�=�)|F����I�S|F�!�'����AcI�n#V���4j�Bkn



�{C.b�E
����aԞ���=�����a�g*"��t�
V�P*GhHL���f)��sU�Q�͚H��%����P�Y����~5�[y�6���V�!�zgkhpw��K

+L�y}\DM�3
�3�]W�����dk�i�jJ���$��#d=U$y��A�����
+�7B��-P����%P��_6�`
ׅ3�$����}N��+5A�IL�6�2�U�<C��TE.3�Q*{�Y���3�7 at 9b���*���� �>���`�#%�yWF�SE�
E[V\Ks2�[��nh`�Ա�Cb�x��.�
蕽�|Đ�
+Cű-����N�����V��>ߊ�=j���Vy&	����ޠ�e����=�����<S%�tX+�gJ�y�R���3!鱿A
bhv������W<���Z,�2<�_
)�*��4��6%��S�K3J2x&a�`8?A8�ͮ��bK
��� �� ���
1�8ZA�E�7]^
s�������̈́<c]DU���T�1��v�$?�P��
�g�G�S��Ӹ�i\���~1 �b�?Cbh��
4�Vo;/�/�<=��������h����JMm��^��V
+�z�E\� ����N�^禗p�$Fs���
%�A���A�h�SϷ�
zO��}�
��G���-��rc���)���.&xũ��œ�B��W>�ή0�ۯ��k@��G�
+*���h�����\���̰O����^LA�� m��(U�4�2fw���O'p���xa�0��|�YPa47(�t%��1� ��Ο;�
\0^��
vw���
vgԟ�g
�oB����� l�����;�e�^��cdUd���
���~�Pb07(��Pf�
G?���^��;87�rz����ĸ~�_|�)8Wх�����5�S����S���r�I���Td������C!b�@
��As�/��<�q�v����q���XMCA�R
F���ӯT�bkt-�#���sU���V%�U�}8Y���@������@yd���;f���ј���/�
Oy`��Q\Gg��Cٝ8	��P�&*)��&b�W�l
�M�@�fv��
#b�\MG6��l�O���?����w3.�}��CU(��&:����҇+au*�mDYD+�6��Z�Q�(��������~ʌ&s��P��cP|��M��
3�[�ǿ�3������E͋KA�IT�`

�9�IK0�s�
��^R��
��E��`J��2_m�
�M�67n����Ձ�/t�]w����I�}�Y�S����Խt�N��xh*w
ǼIH��
�N
�d�
�r0�� #��oH,B�S�}���ĈA���7��ar�����>�=s�߼t�D�[g���n�y�QA��A�$�L�N�'3	c�8�
FB�m}����.)u#=�g4��b�4~n�o�����U��c[������Q8�� ܾMYBy�͇�f�BHOI8�t�8�:K
+���
|�H�{�
��Ƞ�Ld�
T�}ū���o�ݸ\7�gMӫ�[e`��
��G�p=���ϡn��O�"��@E�d���Y�s�@�\4�yj��lf��lV����/�o��.�=ٴB�j�:
�*����n��%}�
���l��Nmg[������S�e���JK��n�/T^�����P@QQQ@@PA/]�,�Yi��n��m����������������y�Rؽ�
+��e��[
+���C�>
�yE@��)H;����a���#�s���sE�fK��ϖ��?��,���?_�V3|�~l����EfA��x8䌃���X�H��?B�� ���r��
_(�{
J��h3[��^^0_�S
�3`��
p^A�����kO����� �o� �t�7�$磐����dm���Ð��А
+P�+����6/�
+�f��^

G�p��1~��)��$�T1�|�RB���.���玦�T�M��
I����千�����.Yo�A��7�7�7��SC�kCɦ��C
��?��#4
w��PO���?�N���fo0��qZ�bNY��Ln���~(�VbOKm�k�Ze�u��8�M�B
̵����Օ�?��?��#Ȏ��,�kN�D�s�:#�:'�>V\�9Oe�
���t�̚R�2'��L�掞8�N��h�mנ镡1�!?mb#�~GP
qEfV

�	7UO$��K.�R+��
�\f�9�\cL��u%�u��M�Xy�
ߪoNhkG�W���F
5�A�k(�9���ԁ������Z��$)9��3�Ε���4��R���f�i��Nb]�6��*M�Z�I�nAӉ�W�2���v	�-�&Ġڷ
���6 �[�ɐiuL�
Ye�>�3��YK����@e����6r�U���/"4�
S�jb�
M�C
b�"5b�@
�����Ї�IUB�EI*w�:S�W���.+Է�[i�>9E�ߔ+�U�K�r7Se@p^*6���A��3�x��!�Y��!,�!*y�-�vAN��E�M&A���Cӫ�
���c��uԆnv��C���$e�^X_/.bm[rĠ������yb

�g� \����)�ƴ&}
I��Q�RV�������m��z;��hg���y�n4�6,
bhغ
;WB;b�>���t��
v�/��KWt�:A`jNm��g��\}CE���Ŵ�6N��Π7Ҥ}�4E��
1�1��1t"���/,�1��Aa��O�\4Fٴ�C
A���J�d��2�ȫ(��8
�Um�3��R
�HaD���� ذ$[��n+A�����?�
��
+
��cSΙ#
ͺ��vU�D֜�Zא��
)F�������/�
+(�F;�Lj!����
+14!��
+�r�f���ס�^w�������
Y���]1|�6�Q�HUU5gv�Ź=�uts��ԚSͳe׈2xRKFE�MP�8��1H�| Z�Og��k��1�
���5�zq4�`��.����dz�X�FPV(3�Kd��&Z/��a�s��b��P+�K�V���P��B���
�CǎOf�{�~4�������]=|�RP���IZ�-��`��
I-����|M�����)�z�圾�Ђ���x��M�E
�������os�
?�߻���Io���cA�����?c)ґ��]�쉗RtI��ZbA�e��򺣕E�HE�)B)2��*�����A��W�8/�1�����/o\��
#�=�s# �ǒ�F#�l{t%�/N�Փ %�	ʸ�tM���~����a�B4|}���M�G
�5
��qtl^��������4��4r�a������8���((>��
���'	�)
1�tIDIz��*5+�
��@}������;�X�p�gӻ�G\�^��k��m'�#����!_ٴ_D�TXr��R,-s4�A8K`��qq�Y��9UX[~M���6�®���QU�A��۠]��t�w
�\����ԮU�G��g<��<?x���_(�>6�`**9{".#u<��p�H��,���\x��;Jg��g�������h���j��_9L��q���4�ku�˽N�s�w��y(��ϗ��dyI���K���;�N��$�'s�OM�g�]/�
+��$^���y9h�:�жr�����L~�`�v�@���
	��( W6x���ϛ<{�q&: �YBH�Tl��������)�؇������Kc�����ǣ	����ڻt��K�_gaM�YǙ�q�ZG�u��ֺUjQ���V�n�����,�!�
�Bd!
K �,d�D��PZ��q�:Z�Z��g~�y�:��E/�����7\�ߙ���}E;�Y+ /W
��
+��C�A"��f�?�O� /8�עг�����V�:�sMx�
#��L]d�ƨ��ӯӌy����.��Z����rp_��O�F�����6
ߙ
a����^��
�c��P4�
���#�@94�p`���X(�^��<��|ͳ��º�<ض�
�J�smxoƒ�k��B��i�팄�Á���}��C��3Ȟ�P�'�{���$���N}�s]�����
+����݅T��f���
�V���;�pd}l
������I�m
�t����?�n;$T�Ǡ�C? ��E}����e� {,��k
�|7�(���^������^���B�|X�λ_�+�'QTy��Zs'��1��]�%��~"��0�����]�_��,p��
��/
��P�X���� � �/��O '7�'fi�w�Ԭ�u�Ӆܲ)���5��6����2]ɞH�iO���Jq>�
7
'8��́j�');�m{��k���&h
�ho'��'D�X_���A!NW1K�)��L��Y���[�Ff��Z��y
on��: L
��㆚�
��P�
5ۗ@��+ at t� =�	�
 �򆶤�YIV�S~AƷ��ST*e�\W;^��^'��c���F�:�/����n΢���w���t����@s[\d� ���FP�� E�t$�H3�>�eOs�J�0)�/(��k�
�h�@>�Ӭ
�n�
f��v��hN1�{�����vg�o�'���h9��_

��
��>�u6�EgZ�cin�=aq�W�u7h4�(�N~	=�"���l'h0SF�I7��21MG�M�l/
4d`��B�
mȠ8�4'<@s�gV
��;5�Q�9�Ts�
ny�����*�r��Q�(����FR�iھ�,
&#�{Zs�Jg�K�|�ݶ�� ۷��6@����|ftgB��&'=Te���H�[��H}�����U��{˚���6���˪���Zs�}�I/��S9�K
�� ��'h߷
+T7�����P���1!O
I��=��;s�c��Pc��ƪQ���m%�WY.��(�I���M���7����ـ������� A�d�
|L��g����GX"nJ�Vx�+�9�J�%rS}�Z�d5
LV%��TH��d���Hm�/6��%���^��A�fdP�]	=��{�}���-*�[[|�
SJј*�9(#6a�"��[�R��)����|����Υt9Xe*�\of�{{���8
�o@��eЅ
��փ�o�s{����Ȑ選�	
WtE�����i2�ȕMe*ic�A�fa<&�ZO��ki
*��QC���P�:g�Zd`"�<�A72�����`���/F�L]8�|ÖT4dHc`JB�FF��%%*��R�md`l�ʨ�k��JF��L�a4����g�!���MP��
�}ޝ��n���I�#���\�I��H(t�S�M�@� �Z�E�<	Y_'����lkW�On�:JT��
KI�I�lP�
,d�.92h��0�u/}ݾ
�t�ZX���i�������ڐ���s�M�J��LGk�6WJX}�"��P�b���y�

�Ѥw6�[�� ܺ:����y{�����G�=�~b��xH��kQI��q�F�ډ�s�B+GC�+K��U�b9#���2�� Sڲ�uAd�;������ ޺�ܗ�����<r�uz�������D��X��bbu��ȳd53MĎJ}��X[��S�L�P�-i�.
^�7���:g�zd�C����z��_-��?
�Zs���-w��yޘ
+
�0
o�C츚P%��R_;�!���Ȋ�]D
Y��K���lC��ɔh����$-�q6ଜ���@�e>�/zn߽����ʯ'm�y����t����Sq��ф������̚�t^����s��4{�g%w��Q5g,lm�E����ڬJg�d୛
����m������
?����g��z�������݋N��P��*��|3�I;��
!	R��ʼnC䖸
5m��ke��y����_goM�i
�#֊NǺ_��ъ�b�Z�Ԋ"�(�	D�	K�!
ـ� !!�@BB� 	���"ua��(nXQ���HU��^���h�?������ܿʪ�
�@������-g���{��~��o�٦�w7�i��aݯ�'�^�	E�Q��G����	���T
�Y���̂ȟ�Ea|1��Hx]&�����]�-E�"͚�`^?�e��ܡ�����aWtL
�m�qu�~���)~�?�;I �_�)�O�Ԅ��i�_hY�=�A.3���+�ݑq�+r�nW���-�n����/��^2���禰� [...]
+z*��)S��hS��es��
s��
+�����)[+�,vU%8Z��y�p�s�� 
�T z��;v6ُ�.3 �-#0l�
�&��.	���.

x�
���D�
���ꞏ�|c��es`�"5�^Y{�����JO�D�'"�E�5
2p!�8��� �;B� 
���q(���7�n���\���v{>F+,U�y�v.��5�ก
+.�I�-
+v�A��@��Dl ��
������8p
}!���������:
�.uXb��,15���(`ռb�Yȅ�K2��U�w
�ׇ���	���_ �yC�7^���R����
@�qX;� o�;�w
��]8�|�6s�\��F����V[�a��4��,�/� ��A��qp[��k=��;�\��ȯ� f�+�7�@��!H��26:C6�� pm� �m��l
��O �+8{��q�\ׁ��D!�P at r��ԣ�a��g
+B�dI�R��&�ԉ�q���MYϢ�hc�.Ɠ�ޜG��{a�87Ns���o��5d�X�݋�`�J#�o;���A�
��c�c�x�⇿��L��N�HV�<O��xF����62G��F���_��#��yCaC���[yh�����}!��D?�١u ���� ��(�� ���K�d&�̒�=KU�
'U�
Qjx#$�~�Yx/����h0�_|%|@t)� M�F
Ld�0�-�/$�m/��ߠ��	,�#]@��N����4��<����r�Uſ�P]8Ln�"�e�1]�}�}}���I;�"41� �7VP��
���@
�v���2���~o�i�E9�����ќ"΃,�`8U)
J�*�A�W
�Z��1]���
U]�K���WN�c�K�����j"�p��k����~X�
u{_��F�L�UB��	s#��0]"
L//�j��(��+$��7���
�S�ӭm"]V�Weh.�/X�m�kg❟A�/*����vPs
 [...]
g�
F3�Lc
�L�.�S�I�TS���<��F
|d�Hw�*��@��4 �7v���l�

�%�=T'�eY«�,��<���%�n���5g�
��ڦ���fmR[��z�A�ҭ-K�U��A�i�"��2�=��n�gM^�iS n�)<�q},��&�q�,]xQ̐ux*3�@gd����
+cuvu�&�ѤHom9�v�(�8_-ͼ�B�"ΆyP�����a)�!�f���Z=
��p㭡��є:
+�2E�)˖���*�����kX�F%��Tƨo�����3M"ZWM�M���,�����S(C
U�K������i����s�����໦���z2���*h�gʌ���0O��֗��e�
+��]k�[�F[� ���TN�M��A��Ag�����6W�鮣�//
w��
�ER�
$zGu��Y�.�-��*�\]Y���D i,�W��y:3?����i5�
z
�[�&����1T oe���м���g]l^u����m�;8h�=���Co��?�P�"ՖgW����K$��BQq#�Pn�	�f�����[����
~�Mx�Ab3Ԉ�n�����m�����#�Ǯ����

��F�4i�
+_���(�J���'�u���q<,2��Z�VP�\Q�JUd�}�=�5@ !a	;�D�HD���Ȏ������
V�X�� Et�>󞞹'�s1����{�����.b�X�ܛ�|�mz^y3-��9���D�^鮒d 
L���4T ���~����m��8d{�嘳�����@�_h[;�V'�(�����PJ�I��ki�)%�F��'�\��WT��on��u���wWI���e����U'���z���+�fjo�l���
/���c�}I�����6K ���m�+Ψ�U\�f\�V�����nF����e�o����ÅwE��*I���> ���fh:��֥��ݰ��˧֚�.����n�&���(���������袔[������1��Z�(�>D$h
��$���k��+{*%��KGu������S[��o�{d�<5mq|셽q�������j�?�?�gpzB9��(
��R
�F/oeV[�׃����Z�E�-M���]5���rI@�.i��'
�7��crk]:�_��Sz��p�؜�����q봋s��d
�

����2h�D��
���Ӌ�����>n�_��ҧ��ʫW\���[��1(�\Ax*�P�&
��e��~�Qa�ў���w��5�rr,��`
����)||�dh2e"� [...]
�֭]�,[����y���
+�)u�߃����
�'/RBHo�ƒ�H��g�����y��Q0��	��
+��L=��E�D��]
+D�I��(�
>݂�]�+��Q�[�W���_M��[�f��1��-���c�C\ÿDa��)��5:6`5��������\��,��+���E$�Eq�$���r�V���7�z߂jZ�'W
�ۄpN%�4X`�E�3@D�߅P Y �&(�����
�N��v��
�/���W�m�����
��FI,�ˣF���9"�/*J��~����
�?���*\8

�'C��|�� X
d}�5��1RL܁i��
��k�|s'Z8B����$1�"��۳	u�
��od����8��:;��r8�
 ���8
�����DC��+D�8C��N@;�)�/S�
�~����l��
�ZC�D�ݑA5�"�*{&#U�d8p@>�3Nl
�]80��
�{�`����
��
��m��a
�CVs��X@�s`
5�Qd�
3��c&�?.��n)T�C*בֿ��$��\�)��/�]���
N`��,w[���V6/S�W1���F@�g��
 JU�T�C��
����4��$��"1�� Bg
$�*A��H�P�
'
`�jAj�9H�7Z�
$d;A,
Q�^��j�C�>�Ak�6�*���8��$l�(|�g�<�59��jC�o�_j at nE��
Dio�K�� ���0W�,
`{k���X3�_�*��y���B��J�Z���J�EZ	n
���$/F.�D��>���y
;�5?�5�H�oC�IH>�,�
�1S��d{jC�<��, 5���uj
�S� h5�<��:y)�!j���@�Ky4@��ݿ4��$i�g�>�3M��M�$"
q������:��y�;�*C���a���Ӈ,���.1ҽ?'q��L�.�\�|Q�&����$NzE�s�eP�
�O����N��M%��O_�P��@<Ґ�� ��ֻ��<e��h@!Z��
�jY�u&�o5�C\�D.�S^GU$ͅ�`̐n1���������p��=����p��
�S�����4\:� ���9�
x�� �V��a
��d���Yˤ~Hg�/$���'�g�K�'�d=
i�N��%

���t=�n�?e5&S74�!i��
�HC
�������J
�9�@��ї����^�\Z�;=z���4C�1���O#�
+
��
FI�%��>aOЀ�~��9x,�&i<��4��А͛�l��G6�8<d��2K��^�QM�k �CE�u�:N�U�b�{ӪnE�D at .K��� !lH0B�L�ɞ
A�a����V��b9�*x�Z�����{��������s���?Ua^��W�^�S/OU�&=/����ԇDs(KPٗ.w����F�%���vB��1���.i�o�
3�)��� 	i�C�[���s1����ZО�̞��7�̯����Œ��L"i��J�'3؝�\A{�D�JP�[𵪦�uC�Uc�u)t��"��V�����o���Y
dϒ
\��k�p�����yW��icvR�5.M�ss
+�d��V¾[�6�
���ʺL��:�֐a�)�V���+�f�ę�L{�j�GJ6;o�
T
X
+ڣ����ƹ��o.yM�G`��bF)���B+�Do�S9&j����+3%*M�F�̹��g��E�� �[���W�>`��H�7K� ��
+�A��Nm��ta�Ls��)
���J�M���
+����
+
+���.�QY2%Y��")u"b����b����]
+q@�$�8�@��50���E�ڿ�����p�����������0̿b�����v9��Y�C���u�7D��r��V��,��8d��I6����Rr���<ĵ�H	i(ߴ ����׵G>��trÛV�
/,أO[C0L��]5���SI
��=��V��
E�
���fKt
��XBk����US�
j�OL�~Wi�_
����	鶅���	�^9k>���=�퓝�#�ۃ�͑Q��q�Mz
�ZA(VI�Xb>Y���ʙ,uIr-
��Rz����V]@�j
+齒B� �
� 
dW'`#g!��
ƽ���ß�o=��Uǹ���C;�|{Z#"[o]M��I��j��RE6�')�
oTWV�(
���V�X5�
֝�
�U�[�+�+����h(��\�A��j��|l>��m��/^�����7��K>���fs,�ؐ�'�N��YJdXʮK��2_��f	dz��h�
�F<ߪ!�z��A�=P�4��;A%r�@��Esw�]���k��ЙM?
_p��8�#,��-:Ym��+j�QY��ņ<
YK���
G�*�h�ez}��I�$�jp�^i�x�o\GJ�9���t[�i��v�O��=W�{����y��{7����Q�UmqY��d
+݄/�4�s�
+��b)��R$Ī8�V}�pKs�ة����U��� u_8�t�#Tov��������4�t���_�����6�=s�
�ꋈ�w]�`X
��Ҋs�dU������4a|S�$�$�E���#L���M����aT��
�!
LdN)�σ�M�~k�������c��K�_o}vvo�8�~,�x8<�⻘4j��������̒�by��Ɖ�_Qy�"�Z4���`k�0�m�z{�i��4����hހ������&ǁ���qܵy����	����9O�"n|�@
�F ���'gR�> ݈����6fY�M\d�2m&V�p73pp�,�g�n�W�A����8���vx2�
5���������c�/O�O����p�>D�962{"1>m"
��S^��gEYQ���ϸĐ�҂����z���6
+v|��y�l��@�j��G�r��
j`b�C����o�+
o=]�ޜ�����������3a�93W�g�C��3"㧉1��Ը��k�xI!/���)uJ�Tm��
s�E7
��C����j?E�X�z���f��?l^��s_)�����;��x����ً
ٳa'�f��K�����f`cf����K��ʂCgy!�$a�~W��������}g��{�e(]P�������;#
Q7��l����a��
+8��
+�����`�� ��x����d�( ��
y�B�r&�g���
����p�>����;~�`���}
���j�uB���R�*G!lu)���)�6<ק�i�x��
A;/CԞPH�
i� �=H����1�=�
bPz\ �Qoh�<-^���(��e��CUM-t��Z':�-"��%�,���X8�.
λ��� ی��-~����^��m灴�
\�qJw�֮� �ud�O�~�q���|�2�P�G(
��a�c>lpN��������j2[�Ke��8v
GEłH


"
��
BH)$$��{$!�H�*(( �X����.l�"(�3���{��9W�?p.���Y{�o���fF���0��
��� dI 
_���} ��R����b/�Wx"x�W���]�^�
�<�������|�s�8ųq��0}<
�N��b�8��!��
���cV x}�
s���<O86o7���	(G�s��
���
�
]��p0n�".��K'@22'0.@t��gC���:���u��m�t�vHzI��π/9ت#��;
+��
���!�:��	��.��񑈾�7შ���Q���l���uXk��@q������ 8���
�
2�.��y ���?M� ���*� {&0
a���5�5�sL�CTW�H䓘�����㞇
������R�L 
��� ��S��18�
@p�	����I�
+,�.`f�@�� ��h
����1\M�פ���ċ�_�ſ�mC�Dwaޠz����{�q"�&ޏF���
qH�� �-S��c�9����C�A�
8�=�����0�냁��obI�������u�1M��諸��6›�.b?�)�'��|?�UjG���o�� ��	���
�?N���S��}H�
A��	��� �uA�^�0�Kpt���Jˋ�B.B$T`��Τ���HN���&��6s�ރz��:��hG
��F�&\���ȈqHC�Y6қ"�� �tu�h�6�2�
���@@�e��	�̒G}��ߥ�G���?�մ7���W�-�����1��ۨǼ�Q����}���W䋱�D[��a�=����<�S@�6�{��9�n ]���
+����|����W�(�m���j��$2_�+�ϒj�=�
��7ewb�ʯ�t�[bs��{3��i��l�E q`��B����3@�{
��C�ag0���I�y�&K��<^R���K�e<"�ywqE�Τ*y{b��V�e�u�mus�]E���.�Iv
�9�Tҋt[@�@\m�5�@��;� �g�5,���z�y� ��C^��p..蕒�\�Jy�%`ܡ+8�
э�|�U|��%���ۤ����;��Ԟ�ޓU&?��zY'qϙ���@Zel�yeH��N�ι`�^:V|`������~�yI�ϴ��n)����0o�$��t��9ͤh$j�	�������)Wr+q�e)]�bB�Țړ]��˲P2��AzS�� ��
+<�@�%�e�׽+r*��볢C
R�
*�U��q�+���RH��s�����*riN9��$��XD�e��:5�}���k��m4d�O[i��A��K�F��
J���y�Hu��������6���(���̌�WˑJ�XUä+N/2X��L���<3�f��ڡϡݕ�h��Z��-�9А�"Z���y
+��=V��CM�����]�j�|��bCڬ؄#�ب�3kel^�P$-�*U֬\�9�j40���sf-�E�h�U1��
+�����g
HG
�+�@��_7	Y�@��Y��{�U�z���֧u�>w���[�1�,b]�Y���H���Le����l�Q�uҬ`�ZdY-IV�Q¾�gu�DY���@
��<	␋������
+��_�x:��[9p�ˣ�!��5Q�-e��'��&
+㤞�-Pq$F�D�k�
+��(���ܚ|
�9�ǻe��nkx�n1��P`
�#���|"Ȝ���̍�
������j�]�w��{M����E
�P�[[�L(�'1�F:רgK�j�J�P�ER��+.4�ŧ�3�M7�X�N-Kt_�>��k�DP"ga^c�'��q���q���K>˞^=�Sgs�ו��G���Ŝ*OJ)*J���S9ZS�X��W
+tr]�:ǐ�,ȣ+*,4EC>UuӜ��Х��K�e�"[ q`/�j�,
+�����I�g�M��k�@���76޺|t�Ŧ��ڳ1ѥ�|~y
+M_La˭L���Q�M-àͥ�XL$}�9U�Bȹn&�;t$�=)Y�-�0
���e�p�D��`����a�nj�{9v���Zk�g�oaG��Q�u�dC
��� g	K�v1[F?!RS
+�z��dH��4%Y��0��a�N����8�������u��)�H	��d�9�s
�8g�
�
[�lI�JŴ\u]I㚚�G�1�h�h��js�P��+]ռ��\��}�x���n�~����sDr�^���G{����TA�PI�
�=uz�:ڬ5>t�k���7��ͤ﾿Mw/uk�
zDs7�u�#)y��)�6YA�O9e;�푷T֦�P{@���!AsS����w�ZCRs��?
U
O>�R��j�&;����ߨ}�����M[����Z
+W��}�^�w��76��M��U���K,�Ց���=�8�RA��by������ڰ�s�ԁ��
��֫�	�u��TqZ�V��"���D
'�(�`A��^Iyݿ�20d�u���Q琯U�P�������i5w���["I^OjfƵ�<ɕ�awY9���*�����y�;z�Z����]���k^
wi�T���4��ل�ݔxwg	10dB���V��I۰�ՙ�!NG�|�=���x�a��~i��w�\p7?��W^��)��m,��m*��m+��w�4X��Ƌ��k/
TA�!G�Rpn	��.q�.qst��	[��q�3c>V�F
���n�=
R����R�L{��
e���"I�bw:C�/��8��hΎ��C
���B��h$3b�\�PpJ�x֮C�����y�K�2c�~�����q_vd��r�T�]��p���t��Inp����<!�I�ȍ�N�0Y{،�\��1~�dsR�d� �}�0b�(|��(ltT%4���4��_��+����g��Y���)���F��i���r��M�2�!s��:��ω}�� �27��,	e(�"������G���7EG.�C]�
_����5-��;�F���E
��K��xW�h_L9�Z�a�x/��wa�E|-�j��h�$$8r!��B�+Y
tn�E��v�xE�7'|��_��B���{Ax�R�9�躬N����5��_
��J�
+��ai&ܖI�m���UlDZ1�XK�u��ZO�
;rpl�@�}v;��nS0�q�) -��h��._�t�� Z;Ո�^
+�8�N�a�ZVh�a��
�Ep6�b�)�f1��D̊p�V� qURV@f�
+_}냊5^�Y�
��z��4[{།.���N!�n��Q=�A)��Z6�4�X��=&
�cຄ
+/�"���˼���6pͶBh��rwr,�"�����m�گ7���8���T:�M�� �Qm�
_��a�Ά�&
�:T���q�����e�_�!l�
��8��t����C`d��
��G��-
+�mPjb�jR�J�T�F\G
������ 2cdD�##a5ҥ�H�߈�*'��Bxr
-ې��
�e_p���s+ 	}�`>F�"�S�p�
},t�66
�!l"F���M�l��� �I�
��3Ff�9�X��!�A�N{H+��R���<!:�
�y?$���
��`�{C���T��3�#>ƍQg�S�����w�y�*�w�lHڨ�TG=��
��c��ps�dX"[��,G��\�Z�	�$7@t6�K�H�
��
+/����������i�m�>MK�H{
��
+D6XkB�A2]d� ����(�["O@~bN�{@��i� 9���Z� �F���?x���9���	ϙ��a�c<�M�
��c���y�*��K"ِ�^r��۬�"/c��cW�������Ȭ�>iǩ���F�9����ݬ��ۜ��{����1�H�H��@���?�������!i�&R�i#g�.���Q�i��@sTn�B����z!�<�y
���1v>��
eJ
�?�Vެ�#�Cb�h�w/e�=(}�z��,~L:���%|H�Şc��d�A at 6��}�Gn�R�Ũ�j�=˱�j�*�
��n_J2}���r�cf32gҎ�$M�I�ٔq���Q~��7���ל��G�᜻	�v�fOJ�s�E]�Y�*H�P�����k�P�N�����a�Z���n�Z����we���CI~�T~%c"��7*k�HN����T$�����K�c�͢ܧEw�/
�sG��x�vt�'��g��@B6$�7���ϰ&�5�o�T��#�G��
�:�� i)E�
�ed�� [...]
+�k0�
x��
���Q�bF
-��&��*�E	��jQQDkbaĠ8?R�9�Q_�3��kỵ@��`������ �ܦO��_,�Z�_�t86]�a�ɿe?����'#���a
<�R�N`V0epIt&����+�٤FI�7)��D�F��P^2�)�$9enUH4 ��q�!
�uL(�n�_�َ�+�;Wc��T�����]v�gGjx at c5�FȢ���LG�Ŧ	1����RI
+�.IN��迈��<	�E������d� ��^m��d��F�1�Pa��]�{f�펎��_
.�����h�"�&���%
J������L8Y��V���E1�F*dޑ	Y��b��S,A�
u-�3А��Gr�k���uA���K�[~�0z�d{d��څ�
+��
U�{}.ο2�HP%G�s%
F�(
�
�1/S��UJ�p��
��`������)
��F�V"�Ѐ�̥ɑ�����+O�����湖�vN�Yz��r�G}ú���M����dG��ҩ��X�\ʇ��@�.���KX�
+C�,�
��c	L�3��EGD��s��#9�h���h��>����dë�
c�V��[�L:�<��W޺^^
r�� 
��M&�31��\_.�s�)"�$WB�I)�
2��_F��	���0U8M_
 "X�� 	��
�=SvXk��Λ�����n�ky�^��ٖF+u��kQE�ov1����J̥��
+��������)
+11�8)<�^JH�'�H
F�'���阵�(�|x'ȑ,��Р����+��=�t'��n
������L}��eY��K^m�wZ%.DR�/��XJVlt��K�I����*q��$X�-	�b3'a\�t�Z 	���
�
�޹������
��/���}tzc����Z��OUw�Z�a�2�0Һ� AMx��B�.g�D�Ʊ	�b^HQz|��P觪���D~Śx�3N`�4}-�b�	�Q �_(Pf�Ziڍ��3BMh�����4�
1�w����~�
/y�-���`?v�@�$��P�\FpM"�O����.�c��/u��F�x����,��Z 
��m(��
5ۡ_;�@��
Ѓ�=���'�5ǩ�
[S���Rꠇ������
ݍ"v�;tbP;L��*�cZS��-,�5�zk�z����4M��=KF�V���)[ P��n2�Fz�CC�5�z����_�Z�~nf���:���j"
u��>��H�A
����������p��ѽ?��گ���i��4��T�޹(�΅p���U�&Pl��������}�k� j�ۯU5{j��ٮ�W��%/�{�z9��JԤ�#�)�-p���
����p�5���4�X'M!�����0�M��x�w[�^}�[�Z@�4�҆
��B�:t��a}�~~���
�o7����K�ha�]�9
��ڹ�y�e�|�e�<��o���=�p��㹺�Iܮ�gx:�z]���8����_�i�f����������V��{��Ps�T3���lE�.�.��$\������~ڲ���e���%�3�K��}�p�7�I��

��8K�e���J���J���J��݇f{��6�;X�����B�ECM�ZPՀ6T�у�>�@ [...]
+�5@;�
��
A���_��m@�%kPkj��~Cf���eK0���Jjn at A��((�g4�:�I��?|�kX�y�I*�x� ��$%���Rt���
�f��f�fjj��3Q*jS$�b������Z\�ua�b�'��q�(�����������\�}�������
Tp0��zS��s���(
2��A��
��h���B�mT�‰c4�탱�!�����]�~�^�
��q��D:�M"��!��#���M)���
X�ag�
+'�d��&�n,�D#fa$ȋ���O0�K!��G����>(��B��'j�����
�m6�s�+.\�I�9��M������D*��9�N`�

�
(�7����Fx�!�$�f���ツ�^��� k�x�]�����2_K,GT-t@�B{�,Z�����_��]��$���$��)\�N�a��8X�E=	�Ì �z�s���\2���N�l숄���^
��
RMVBd�2�eP�ڠ���fV��*`�u�}P\����\c�B瀿�
<��Jm�Qۂ��
�G0�ց~��Ӯ�^� �
7Pz<����^O$��B°7��y��i}>Ǎ�hc'|>�B'�:8��<

WC𼍑2�M�0,��؀�oN�X�ׂ��䣮�w��v�
�k����ʯ�H����H|�;�������č�������WH^:
�4
�.�x#=h�1��, -G�rR�:"����
`
q�'��y�q���~�= ��@$=� �&j��	ڐw	c!o&���
0	*��r4 ��b�Y�0C�FsȒ,!M[�t�=�N�U�"��)������3`^D��`0~폰I�𱤡-Y�I
�|�89H�
 #D�:��#e�DN3��a��fȎ\E�%�+�!_q�
�U��7x�w�܎ pN��}!
�k�H�)
+�'�c��-uh�&���W�؁�/1�(��"B`��p�����7Y����ke�9�⬐˶E������TxAT����GLr�o������
c�?��K���O~K�
R�S�S?�{i_��c�#:�u6ᐼJ�U��O���joS���p�
+��'r�"�
�R�q�ΐ1Qc���M#����)'����X���
�kF/�%m��G{�~B�?d�%�K����D�.�����
�v��X5
�u3Q�i��`sl��B�E|�q��볢0H+��z/��}+�K~�?H�
c�d��`v�1n
��O���
�?dh�=L-�6k�q�=N�ƙL�R�
+=d,�G��J�fb��	*`[�%���ƶ��h��>U^ذ�l�`����=�>��ԧ����ٝ�G���0od�g>��$�n�ޤ_��_I�\�2�s�)� �p��Fn��[lu4�v����?5�c5�vw�ֿ)�
eG�+
��˙�%5���oD��H��:2�p��~L�ξɹ��������Χ���}�⏰O��2t.��K����C	�7������:�y��,�
������T�z�d��V�G��[ʾ��=�VF����9��P�i�s.��)/�����w��"�`8�P#�~�
}b���C:1�J"�n!���ȼ����=�sS�bMs���F���])����c~.SPnrn(�W��%3������ʓ���N��cž�Q��[��������=�T��
�,�BBx�y���ɮ�ht�9��e��5h�p[Ԋ��˓v��ja̭J9�j��s��T�}�vi��.�|o���C�#���$
+�$��Z���-�����2�dA��C�.�q� ���{���'�i�:��
&�C
�D,{ږ���^������;2(+r9gJ�'
+*�GU�Y�s��[��eu-�Fv��A��dO�se}���N�6�V�
�	��i(&�A��;}�_;c䰛�p�����­�s������}�V�t�*��Y����IVe�˯W6嵨��~[T�s�d��Jiu���je�j��e��kq��@H[2YD�,%�!�i���AG�
�F��>s�:j��h��[i~W����#J:Q#g�W�	�*J�-e�ٍŻ�uM�j���*Ugi��rY����B�?u�z at Q�
���5B]���;s������k:�� ~�#-�����4)�A)�ԡ�Z�	�I	-���
+��*HDP��]
@?����8*��~�Yѳ��}���s��s��v�:
��
{�:,��{�����~'���Š�B�zj�Z���ƲԨ3�Y	����i%9ՙ�����
�p0W(��D/��D�)�췉���y�@4�!M?a{g6�-—KR�.��~��4�q��j4�h����^��\����:Y]�_^�+(.*N�/����g��d�����)��Œ��Ԍ���
񟱒@�:
�m�C����y�S�n��~c��+���
�ǯx��`���q��_��8ΩZAd���
+ё���TaiEfF�aj�Ŝ�¾�#E��%/���KiG
�$���I��;8����-88�
w�>\��/�~�e*=3rp��AO��^?۶�[cK8������!)��Lj��F��U���^Y��\Q��/?/�/��[>�_�L���RZbٛ$���8I ����r
ԫ⾶oý؁{q{nv�h�䘽��a�����^�k]g�O�hV��0q�ј���Ĵ��d������L^M�0�TW���õO��5Ki1�o�xU+q�@6�\E
T)�I}�QFˣ���{*�޴!��ݖ�17ݶa��
�L��jiO$3�#>$�M��r,�ȅ�#q��)�MU���2C�u
�6�d7�m\N	;��~��8I ���j�����<z<!�
>TD��fl���\��o�,jo:�
{�F�e�DzS{�“z�bb���#;
���W
�ק
j�HjNgv̦��_
�-�8���$�t�%d���i�F4;$��ݑFS��h䑎T��^Ŗ8��6����_p��&

������������ׄ�!�q쁊D���$���߁!c`V�7�61��=/�{5J�qP)�^^ ��>�;JB�f6��gdt��m�B�᱃F՜�A�Cƾ��,Ǵ�PO��hޝ����6wBš(����
����w�h�ñԉ9
mb%�~�c����PI _}8-��ۤН���
<�F=�Q�+
��߬�O�8�������)�4m�i��u�y
��(�<��4'
�+d1�*9��s\�\g���h��'ع���_l�{�$�2ZhBh���F�I�+�D�>/�οQ�������Kr�k{5��.���T���@�%�u�R�=w1щ�������X�E_��R�^K
>
KC
����
��/>�/�i���E��%�F��o��Zg��aAլ����
H�k��U�-ɫ���V��"W��CW9F��H�����Ք}��B[�Z�~�Z����
/9�}����)g�O�rv����e��N�����fB��8�2�Gu�R�bE�|� �|�#�5���l�YwT
[��`��w�i�}
����ӣ}x����=���{�ɏPc�M���e�C�0cy^a�[I2ކP_B-7:=�P�
��&\h��Ά80����d
��WP�h���
�'�
bp�N'��t�<��P�m�u�༮-t������0�y�'I7V�:V��y�D�8t
p|P�G�."�IL0�a��<
7y���+Д��_��*���bTm���ҷZA�V
(�f��M�Q��4L�_�nHt��
��	�#�Dd\(�Y�N�m"
In`!�
�2�Q��䬁"o�d
`n2��M&�`��� Pԇ�ͻ!��+iC��4+kB�Du����d- �_F(
+�
��T�n����R�����7X�5��7��Fp����.0d�!PF8�;!\v��j�@ndʩ�XNNȫ�I���C ����o�@+����!W2�hJ�Qf�:d� ����{R�v�O�>�/ }�hc{�6m���@]Ĭ� ��	P��e���t
�7�|� |����ϔA�$��� י
�T%���OX黀��
����>�]4�.#`\5ƨ	�L��Ϭ�_���9��,���P�-�R��
,?S�����@5�� "��Ib-a�d�V��p��'E��BP�>0O���]�QM^[�T��zYuQ����� � ��Ɛ9!		I�@�
@ �� �A@��(rUZ�P������E�
+*Ȱ�w�;�����9�]笇ظm�@�X�
 �o#D�� �/�����a��$v�l����a,�|��Fk ~�
`W�e�0�
��;xۜ��{!p	.��B
�
i+�n�	hk�rx
�[6����?nn��̀ Q�'q�-���[F�Ö�8ā�� h��=н
�����0�	D�
A�q1�O�#pR=���%�~�h��@m�
�3�@�	ҵ�@�<Ex�}��!�3��)j*t�o	��5`
 .��*{`�^������A8da
A�uI��D+ .i5p
�]������izK�$�T�J׎	�c�����g�����ȷĩ�${A��'���[�$4e�=p<�A�rȽ�Ŧy�
Y�=.������
+����4�/���qN�6KLM�(�)|��1L���҃
"_ǽ'=�zC|KxE��N����
+�i~���� ��h/y�kJ=
@��+H��
����p
�}F��@��-��af�G^��ANE�;V
���G�43�%�<�9�j�S�]�C�k����w�S����΀ȟ����	�� ��-0�
Bw{P�� ��
A��5��}�˴
�>�ez�$�|�e�[IZ؀ w�s����*�Cf���V�=zG�
�%v?��&��W�0���e�
�'�w�aO"��w6�x��� �

�	Æ9�
�<��c�X�^�O��;-��U�,�iBr��3p�F�m^�V�!�uv3�։ث��ˌ>~/�ϸ����n��l�$��;C8���
��T7[�ځ|�
��فa�䮛
��N�!�F���#{�4��
i�!�U��!��_�ٔ>���oA%��W���
�;�9-<þ$�`��O�Df�hl<�%n�|T QG����
�wN�::�>r�~�u�.��;Z�m�`�.�W&��<���AȍԄȾD
�W�A��3�JJb;D�|��I��o���K��I�yO�����%�^<A�Ok�3k 
�\!:_�:o���P�z�D�������[��
�ꮉ�w#���j�4�V�?����Vf�N$q[eqG��č�I��SV+�"�>��H>�J�����3*dS�
+�4��p�1:?��,�y��7����s������_��pyP�]y����W��~1G
yF���ԦЎ'XG���E��6�&�Z�,���L(�� %�;Hi�{I	2�+F,,�jB&)� &:W��n*J.���e��W��{;�i�4�IsȒ�����VI��T
|�(�0g��-�$Z�.�U��íN2	+TU�%��	iC
+�nE>rSiT��՟��՟�y�	z��
���߾�C�7u�27ۉZ���5/[|��ٲ��[��
Wj��ʙ�N���[�QM�*jm��U���-M-�4�cR�<7�U��>�4���2�_%di>
+35������L���A��,��t�y
]l����rx��O�g���wۂ_;�CO=aC�A�ֶ2��fS<�֨�T�hX%��B}�0/�D��=$ק
U�R:U�)?�R����H����ӎ1t��hk �uN������f�����	�G�kf���,�ںkyWS�:s-=�hU��R��*S�� �Y�����#0d
��e
���I�U��+*���"�0$N��%�ǘ��q�5���@�:g6��t1f��_��Km^t���?��p�#`���:�Ἇ7R�4ԲwVW	��e2ra���S���(�h��r+��F$!ˬ�e�����H�P<�3�Sd[X��1�5@�� ����c�bf�q�݉Ř�]K0��W����4��t���
���Qr��FVXY
_a���S��֗�pRK
q��b��\&-�O�+�=JA�]��4_8̗-,�q�i
��O��
+�1P�=�
f��<��^g̍K
v���;φ���ڻ�p;iSe
#���ݓ� &��ZJMr��`:/�2O_^*���y��Ni7�.���*���a^\��W<ƴH�=�;a�f�~.�a�l̽�s0�W�0}W��u��8�/l_�t.ҳ���Wl����:�j��� ~IH� �("��
;�BBB�@aG(���Vԩ#.�u�Sw
+�,�0Et ��VEq=�c=
���b��ʎϼ�O����;�~��������|}&G���P��n�j����'��Stbo~~́�����Ս����Ҵ껥?
eU��e��>6��
�S9�G��g?2ɃV���Env�K���7���r�k.
�^H
+��/u��sYq[[
7�s�bM�FuaӶ����9Y
��k�
+U�
E��
����┆�u�9��&��NMit����
���t�In�3 �.3��^9w�^Sǰ�V�Ց|��פ����Э3�7\X%X�Q"���L�{~�:�ܮ�Զʬ����y���m��dmC9����Te�Zl7$ch�I-��if�+�
�q�A��3$M��S���c�CV�����{n��
�Э	_}#/��zq|ε����I��JŕJ���*-��A#��HO�r��{��kJ�x�BrA7좑���ܭ����t�~�NZn2I�##r�ߒ
�w���Y���Q�۞�7<�{�<L
���Y���ȴ{�x)����}"I_�D�W%�5&��u������}��zR"�Xp"]~�$����ҤG���Hs���a���F��%z�_���	�_�r���|���2�U��^���~���AɃ�B���%�����h�`U,���숋}�;�&.v`��o��?O��]GH�O����#'o���LR9<�|5bO�r��ܬ
�W�
7/�򬳵b;�6�I��tSh
<eڵމ�-��N?���������#?G�k
��
9:�"�ݻ�v.��:�� �B!����B��^=��)�TL��m����Mz0�'��r'�Lӧ��S�������H�RmEӹ���bG�t�oz�K��^�ș�ܹ35
�M�᳝찹
�
v���	�.5�B�A�EB�"�DŽl� ��Po
��������B��
+Mg&��<J�h�����K=@±aI�۬�
 �8h�v�8c�N�-{?�p��o:��L��v���	�s���~B���B��e����2�
�
���#�0�Ƒ�ϋ��$

+��.B�Y >7�ú�
��{c���D�����f�k�n�NS
�2��K��R2LH.$
&zrX艨���Y?
+^��3C�� \�?bY>.�Ԉ�d#h�ݐk��y˰q���o�oLlq�d)jMlp��-:
�2�{��-O)zIH�8!J"����HX�>�--�t?x�9��g#��0�
��e�e:@����i��5�
!�e��96�̰�p�\�C��8���h��Շ�"	`Bʂ,�R�)��!*�B�k�� �;[����s@\�#��/�x7)�������{�4�<ǃ�.�f�q�q�!�cB��E�1�"S�T�,B�%W�"�=�U��^�jo�3�v��+�w)�n࿡��
�)
+>�H���m�W] �f�{�!�և‡�� T\c�M�P�C�j1de6��C��
!>�Q�
D��Hhu���
«
���)�5�Qʤ�L
���� �@�J��M������
����0�&�j�Tً�����H��	�C��ָCR��6�� ��
Q�r�
q���	Z�لq�鄏�	�� gL�Qغ|�A�A��Cil2}
�
f�l�)2�HϠ�Y�
�_8!e�+�<�8��!������v�C�K��ľ��ā�I�p��1�\�h"G$���wH
+�.Hp�A�F�ڕ�Lw�8(Xa��hS�-��^��dlt�f�'��,��r�w6�&`FQ4%o�L::!�
�Az;���׈Qɛ�o%�Cҹ�7I{-G�K�+�
D�4ȝ��P�*��y��L�a5�%B
)mP���1o��L�6�Ɍ=~�i�ޫ����Ԇ�&7rG�Qo�1�I�yC���W�W�/dc��lL��g)�B�CBt���!ő�,��:飔�c}�!�"LPƷ�:��̚
��bϱ�M��r��6s_���`�k���c�N����8���MEqk�K��Xܪ� {H�
���� @ b�	��B�-@"D@�D�
+A�^��VP���ֶ�^�u������9ߞ3�������)�1�	ŌyD��>$
�< ������{��>p�}n0���	��1�[ n32��+�����$lw��}
���b�:������X�ۯQ���)G
�r���U`�0kq��&�L��x��O��������1�
�����Q

f#���@O[ a#����O}k�
Tm���=�0���}ډ���}�B��s"oףX��}i��$��6h�W��������ѰV�0�+�
+s�~�1��e<c�^�{�w�;���‡޶@2���|)ҷ����ld�9��
\�:�ز�s�W?� m�U�w�N�xL��yZe)~W#31�������ϫ��p��ݜvf'��eaO�γ��f�_�f�<�U�-"�,���@*2��̏Azo�h��	
�;��|��g��%ϋN����o����5�z�%E��O����Hs	]:�E\j�1[��&~7��7n���6~k����G@|m$��D� [`(2W�
+㐾�^�t�
hX��ݫ�=��)�p~\���i�)m讱
����H�^e�WB
+�]�Il�.����
cd5�N�ĩ[x� _/��WJ~	�����e�T!��r
�2�=H���@��F:�+�C���
+7�gU�Tu|�L)f�x��J.ǽ']�yA
�oV)��D
��K���1
ѕ�Ji=�,��?�',��
+uҧ��X�K��Str�G�Ð��H�S"2��(Z���l#�7�6��u{
��
]v�2��ξַr����e~�j�>9�X��E�T2K�����^Q�9A~�E�6fL��H������@�S@�V��@�((C�^�
+d�!�o5����n3�a�N����KǪ�]/�wt������9Q~uq���X��N-Q�1��J8y�j^NB�03�S�
?*��?g$����z���$��� �{�� � ��s����羚P?�l��l��e��w]O~{G��I�=V��kȉŔe&ti���r���:Nf���Q��J�8Y9$Q)�JRR^�������y�:�m�<$�H�X�
|�\^ԯs����v-�K.O���}ݪ��7�r�V��>���VA��N�fgf1�Ӌ�jMOu�^��>/NPJ�Է$��?�I��I��e��H\ �@�\�k�
�����X
+�:��G�.�5y�io�nm>K�W�g
�(��K�����ɔ4m#%'���]ƍϬ�f��e�iƴ$:�7�<�-3.�#%.
l�b$
�zo����b0[��=���\&:7�;�/�j;�E�	�����W_v����_�U*є(�ɧ��B-K^P•�Djω��^�H;)���ʋ*|˔|�J� ��d!���"���5. 7�
��Eg0ri=��{��v��U���M�-�ݥ�
��:�gv��_c����Ąr5-�4�uF��x�b����$�[�ܒ�\A�?LQ�G��l�2d����
�=��iv�'p�o���ٻǩ��ѕ��7���w��
�6q�i�D>�YP|]>�&�
Q�*4�q��
�����w���	
���m�������WB�-P��A��;�?��k�#�t ���{h5h����0ph����Uw�-������uHy^���/;,1����

+��0�i�dҌ�,���M6��ɍO�h�oht#$1�a�-0�	��p���F;0r�
�]�����m�3`
�fouw)
�^�
�l��w+{���/�J�#�E]���
J
˒B��'Q:*(�v#-��3�>�xJ÷�!�a�
�m�� ̝`�, ߷�A�
,�h�r��O-������i�
�<m<`��*a�|��7r$�]8$>~%�s0ɇv9-�t9�(�a�x�@!p`
�9���� l
���, n�0a�ߌ�����@����v�;�(��ݎ�[G�%��];��1M�ο��Þ
�Oʾ�\O<J����Y�1�
+� k��������5����o�k��z�2[���A , 4�P}���qy��9W�z��A1��
=�R�0x-�'�a[i;H���v�E5}�a ��"e"�}_"��	� $!�H�$h��bQ�tܦ�Z

��[-�8:��Wqj��v��T�TqÀ���n�|3s3���wr�s��{���S���|��Y���Y��ճ-%�gO���Q��v�@z�a��g(Uz�m����r����tG��w��NB6_a�5��d�Ս,��3k�ќ*k���*r�eUxXs��Dž�
�l��*(�Z��6�ɭk#e�-Q��]1��C��N���-���/|��/�C�-�5ұ����4�
!�.��_
��
�r'�C�̹C��ҡ��‰��Lݰz�z��
)񒏔{g�,�"��FWL�n�K��2��<��4��8~?0q�E`��k����� �?I�/��!���q$pg�1�Y�0��

�
T;ʡp�A�,�L!f���|R2�'��cVz��ɱ��5
���8�
�.�h�R�6���Do��<!+���&!�)�R7b ��E S�(v�8b��	 �OA�C"��ap����|�v�F�S����!��
�����5�8O]�����Y��+4����{��Fh�
�™(�����"���(V��ӑ��#�'
J���0�> %��(w�Ɓ����f�dl��fG��m�r�ޟ~�n��^BL�	Ѿ"4�	
I\��dL�C��pfb���c�!�Ń�5R�lOh��0��P¡E��
j9Nh�8b��#��M�N� �dB�B��gC�b��r�Dd9CV�I�;���h�d���F�
o۸�O������@p�꣞Sc>�����k��� ᳐E����N�C����P�@^ᆌE
���
�gސl�B�����@|��<�:��S!�
R�Ԩ/Do�/�G
�[1|l��
�h��f�;��
�U:A=�*�$(j=��'o��s��背f
2�N��/d
~�~C]��'�^ �O�a�M�)^� [...]
+
�|
:���a9���z�� [ 
gBƄ>�c8�i
�8�0�	�:W�=�7�9�>Э�vc 4ۂ�nA��P��Au,��l���ȗ��Q����!��ѿ)^E*�T��'*�
d#d@�G��4�L�X(
aaV4�D{�%1K튢|O��"��Ə��
y��%��~G�nw�v?Dsdڐ�T�
���߳���`F�������5�}�E�=
�z������ &L���`�dcn�=�
+'�\��y�0���.��+\2lZ
�b憘���g�M�Os�N��=ɪ�H�ӞK{��*���+��y&��O�����\�������0�TAt�L��i�/���v�NuĂ
�7�u�cżs����J>�?.\�0s�}��Իy���m��9,��?-��w�n�og\�?�]�
}oD��|$u�0�R�.`�������a�̥�S�������.��͇��=�/4���[��/��[�$����ɿ��(�*�n�)�1w�����Ǝ�K�N�w����=Rv�
�<[ �7E�)F��$��z��".�5��,u�L,��Xo?�T�4�8˽o�����Ґ���17*�f�hiH�R���R�F酒���EM�s�-�3�ԧL�4'L]�c�;ڣϳۋ�d
)�����!�J~r}�E����o�Y��{|
�_
�y�"űo����2������k�s���k.�_��Y�B|Ʋ.���͊c����/5�K���9P|>w�Ϲ�%�V�Ke�
d�Z n)��J [...]
+b}��_�`߻F�ܽR����|�~vL�U	�k��,��W����Ty�|�zߜ����_��);�����q��c�����2�i�@Vs%dM�}Q	ỐOs���ڷ��YVp���3?
c>���� t��F�}i�1�\Ci�������
�`��m�r��kU{*7iw��<狹_��(o3~n9��h�2m���:oH�Xն�f�>��L�0 ?I����8X�UA)ғ`B(�@�(� =j��j�A�@P�((�2눸z�Q�	3{f��{vV|��
����>_���Nn��MF
��*�1&�8��xx��ot~
|��N��Ό�ъ�X��Qu�TY�٭���9�.}|�gWF>U�VJoO��&51�/�'��&������Tſ
+�NZ
�� ��4D��#/�C
+��
�+2T�Vk��r��R����tLg����ve��뢰%1Gz
�;ry
�r)R~1�)�ܿ>��Y��ƪL�a������&�K���E���ļu��s��->��T��C"�{٘p#�W��7��
ư�nA��:hO6z�I�w
V��zE'�:J��
�<ZY����$K�_ɗ0��!��Nvq�`Xa�
n~�na�?C�3��/�F4�\���U�(|ɺ�r�pz�*у_Z��o2}�NfF��xDk���h���S!	��Uu�]��"Lv�/⓫
�rA����*fIvSHA����y%<�?���\�fg�����=0_��#�B'�-��͙���:xwj��6
X�ԅG];	��Úc��Z�;z�-/I"l[+c
�ʼnn��yd�0�VZT�WTX��7������p^�Mnz�<�'�;�_����"�Q1�*�
�P
����E�&|I��с�˦��nk�a��a_�	Syk�^ic�MC�c��	��4o�8�D����[*�,�c��ةE�aI���Ģ9nb�2'E�fz)b�J�?�RDU��p|M�$T�W<mՀ�
�0ק��&0�wP�j��A�����b��
��hq�%�)^�5�>9U���*���%�Ie��Q'Nt=��h��/��L�@��
+�T���P�![
�� �ד`�]

tk��
�5��]�R��wҗ]&ok��7��B�ۣ�K�q��-I
�M���<zJ������W�Š��bGWs���EV�e���1ck#���IUJ҂/�� O��0'S��^5�5H��#P
[�:���J�zm��c�.�a�/��
�c
�.�u嵧{'_���ƶTD77E4w�š��r��C�M�C›?D� ߨD�nFU(��(ƿ�`�oO�Rax� �qC�� ��
�iq7����\	;��w�>�7�9�'��LW����B�Ȏr�0y��L
,

+�M1e?0Y�~�rD���#CdU��V��&z	0��_�@�]=h����x�V�r⸁p��D0`ƿ�ޟ:es�Z���d����j��J��h�*d���AC1��b�)VO(�P���
�T��{�k���n��~�x{�o�eF�g�C��5�='ݼio�s�~�)wC,��D쏹
k5�t$��9ǐ����27��zO�1�7ml��36E���|blՋ6�<�ȕ~
W�N�P0-��
���7��HP5�	�#(^�C�}l���g��I�q��LO΅�s��d?8{ ��&`V`ǘ9�f�
�32g�̠��촋�������#�
:J���R%����n�+Wq�
���g�C5(~��/���r!���Z�
�����Ɯ%�	�Y���g�f~�������,��"/��|&��x6d�t��m�G��U����nߣCnO�6�p�`��s���Y9P�@�
-HU�Y�.B�� )RyL�����R�7*�71�[h���P�)���,SOe�Nwe�n��6s�e����w,�~^�p\����O��;�Cd���e�.|�-���{ �2�!aYb3������V�������]5�+
ꊟ��J���J����M�Wӌ�V�}(���������>o;�6kb�������6ە/����a+~*�p�<@���� �k:����>� �}�K��ې���
���_|4���kC�:(r�
:�k���!��T��
+5�C����^���pZ�>}�w ����
<H[����_ �H��h�
�\�~�:L:�
Iv�M�Q�"��
+ְD�{P��9J�ڍr�w�2�
�I�u�|��u���
&�9��+m������8�)@
�g)�k ��H��
E�	vȜ`����
���d�YT�g������;Av�5&@ �$$$6!�)6�7�,����E*n8R�A
[EQ�}k=ť�ӊ֭�Uq��3_ۙ�x�;�����}�sr
pig0
 b��ɴA$�
+�ZH�2E��1ʴ
�J� Y�e�c������'6�PT�9����I~�������(����“��F�p���
[83ؘǰ�'�

h�iC���z��u����%�i�cj����&�v&���O��N�߃�Ѓ�`�O
B
�J
�π_�.xz��ǂ6p����0��~b�8A\4��u�
�xg���3��O�>C�|��x\-��,��@�0��Y��ï� ��
�������{M�;H
3��)�W�;��=%��w�Ô/��x0�ȃ�&��|�<B��D��d�,H�:��τ(}��
 Xi��ct� `�)����$���
�����-
�?&^[�?i���	>����T��h�\H>��D����,�Ku ��	Y�
B�
!�2����m��@���½V
"�i
�Ekn��ٓ�W����B�_
a5
�W���\R'��H#��ݘ�ZX�c!F���](�#,��2S�֛C���M��ʆd�͔dp�G����#v�g�&�W�߉�ڏ�ux!�px.��S	l�H`�8�G!�ք`gr{Qv4b�gم���D�)t�0� 1&�*4�����
_c3�f�E��;�v�7�{�^��u~%;4���
�s�I�\I��>���{7s~���c
+��R�V$4���e�Pͦ�2��4/-��!E:��
>&����ϵ|3
So�"j����9O�=���w��60���
��G=��/xߑ���I����;����vM	�+�3	��"�	��
D[1�`�@*��&��
��
�D3>�+�ߤ�L_$������~YT�|?����V���.���z}nF��s#b�{=b�wUy�wTy���ߥ�7�
Q�>��
�v&��c�	a$7���d�;3,�!7�#���ў�L�	�{�g� c	�N�r�����Pչ_Kh���ȹ
���&v�߅���s1��D
<}Ip"���X�ˀ���|�ăs8�Ép'�4!��
�ι�t�l2K�
%��d�s��o��bɬ��&?�$���3��K/�w)���|�*Ι�������=G�
�
:P�u�i����㟈�&L�U�w(	��dx
��C�I�b��̀B�	�R2�
+{ƛ*W�I5G�neЌ�eJ�ѢD����Ng���N�˽����
^��w0�5�@r�p_R�hh�
ɠj_Ȁ꘴?�lw���w�}��K�o�p���[b�
RH~6�[EFV�Q��lƯuN�������V+�.��Y�*Ns:���v(���@Vo���?��,�r���=K�%}�;�;RC��
˷��W�$�V���Cؓ�/��
M�7&wУ��(#��Qo̩G������0�6�N�X'3<Yc}�"����۾�|����sk�}ٍ�
��E��6��d�~�ޯ�Zz �s�)e����/B;�E
Y�́_g.���`H�"�{�dd�:}�e�!u�Ō��Α�m3�u�Qb0Re�U��qhE��/�r����y�
���5u�6��rڥ
Y=�̾�V�>�Z����Ȗ�gaks&%�C�>���_GT䷫I�+&�gR�V�R�ZfQ�6�Q�mv��>��-"����{�9�צ��U���[^��RZ��*^�Q�$ސ�A�.o��9wGxS��#V�D5�\�j�}�\�?!m,DPS��O��;��!oQ�z�R�[3���~:�����7
��S�����o�h���U��ڻR��]���\Q�o+��/]%n.Y'k*ڤXU�MY [...]
e��Lm
8���Ȣ�TE�g�Ǚ3=a>����~��s����>9
+�f���?pf�ތ���=!)�B�3&�w��7-
�����:�í
�T~!3߷���1��
ײ��~\��bt�q�j��ZVWdx�,Ҭ�d���X�]~a����t���,����^��}w:��}.()�;x{�����B�r��%Fe�T�
A�:�']Hx�
�uE:����L8˄�M|�j2��$�Z%�������&E������Ź�;���i���
tK+��L)(�I:Z㟘�
��
�7�5�Qp|�o~	��^���B���D&���}
��8��jh�]π�4\n�AG�	��b�y�эWY�oP|&lm��M�95q��U;
�U��.�p�u<�c{i��G��~[�b�.n.�.zS��7�dAW��m�(W�I ?e���ϕ@:@��F
+�� :��@�yc��C̪ns�-9竟�j�s6��@}�pom����)Ҥ���	5�q'>Vn����T��Uy�?��? ���Ȫ���=���us5:����
r% �j � ��8Of��.-��lH��a�^t�tz/��Z}�=b]Z�f��x�
�;���:ƞ͒G7(���=�����:}B��|B�F�:�V7�^��:��{�N�x��
+�۵ W�:?y�O��^T]ׇ�^+F�5);�ǃ�ѽAO��ﺴ�4�B�U\�ۘ�{�>�ȔF|rT�^��^��v�=���#�}�#�mJ�6'jE��V������H�]r�.�;h�H�O2����pl`)

0��?�c��Wh���-K�j�э��c�ǚD�&Zn��*���Q��<������ZG�+
2�[2��Q���)'��9�O7��^F;uߑ.> g�_�E�̟d�+��?Ā���p���{߆���L3�N�p�p�~����;	ơwRL��2,��X��
+�km��
b��>�����E��
!T�*<M:���P�
Pq�` �RGذst9$��Q�F�1_�iF}��
	�

ٴ,hd�~�j�*_վ5^�\#U�Z7�WU��\�g&��L�匩�_ߘ:���Yl���,y� 
�����| ��bB�C6Č�`ӘD�	�q3dܓ�a<��7
��
ߢ�
��s��w
�^./zO6qr��D��tↁ����I��Y�p�����"w��
+p�@U/ɿ�.?y �!6>ք��!�>����8�^��L�I
�d����l�T,�q*�+�N׶�>��~�LW4Ӡg3s�'|:D����x����	ꩻ��D�a5�`� ɿ����� |
 �9�_����!(_�S�W"�y֑v�uc8��aڽ���԰y��e=�c��\���\
�t��m2��Y���Y�pO�'������-�B�a
��������-���|P�&(P�q%H��ђ�����BW�
=iS
`��0�F3
1��
+Ә+��{X��Y��2kY|�u�S�����}�.?�@���O �߁�2����`�`A�a��1
+�5��Z���JTP+Л^��4#h=��up��,��08XKt0����Ļ��7�5L�U$�;��x�
 �#��0�%�u���j�}4��d/K�
�P@領�F)�AWJ�)

�(�� �t"�� ��E�ƖF;�R!��"�Jh�`�8����� A���hy��ǵ���H�s��q��'�*.Z��o�ω7r��,�ɖX��D8��(�g����?�E,A�66���0G
��\� �Q�J\ �����Y� 
?ψ�r�ȝ�/j����:Y��B(�>\E
t�1Q��B�0M�Ʋ�!Y
�2���P����ͺ(��EQ�K
���
�
�g�ij�oĨ;K�����x�
,(��R�fB�Ҝ0�S�D%
݂5�%���;��_
�t�߸
Jkx(i Z�����G�>b���9<��J��/$/��%�&��Oߒ"o�
�?B����zQ��o��3��4
�oh""�� U�t	%����B 5�@B
��TY�X8�V�
;zг�c�X���<��?���~��y���qY�A�:5[��tMި
�D
`f/���^	4�>��
�z���
}�����z��3u�����<�
+q�z�������:O|I��~`��V=���.h�`� t
"�7�N
�qQTM�
ֆ���AH�
��$2�Ī3�l5�c� ~�[�>`��-c����5��Sf��e��~��	���#Ɯ�}Ƃٽ 0����L ��	Ƌ�B��F	cJ���j���H�}�1�@LIJ�Q�z#r�߇�zVM�#�����ٳ�n�'A���F���}x���iۻ������n����zЂ�L0X^� �W6���!`�`���U8ߐ ���4|�3���-��5�
��.!q
��1�GQk�G�,�7[�޸��V�N���a��{��r�q&��Ր�ΗB�;_
y�4
����F�=֧#��TX`̿6��M�{�W"H7B���d��]�沼5_g.}ʎ�{��f�k"��f|����*�k1�vW�Z
~޴��b�.��#��"��	�t?>�1>K�g�
���O.Q�x,�ŀ���^
�`3����8�x�ػ,�|�+>I�q������峜D���K����m�%�8��op��ks=���}2f�43J>}��p�Iʡ��^�~��3 [...]
+�� =/7A�*l	7�)��Y��Q�S��ɜ,�#��9eN�2$nc�z�?�Z��N��5���ӟ<Jݙt�֓tƿ;iֿ3��3�gW:xt���+
1��T�{ܥ:h�T�顇U���]�"k��X�Si��DQ���L��y���9B���"���Zr��қ�ͻ��Kݑ��֞~��J�b(�fZӟӕ����
 �e�;ƹ-�����{�B���抵�#��#Y�nKuь�
]���OI�:�����Lƅ�V#��`��iW^�[��ܙSOٞ�����k�2�����Pd
g�3/3�9��YR���\���=��;��@
���qݩ�D�����V
����wQ���-��:D\
�zwy�e���"�S��ح�@Ln��(-�M����~�>z
w,��;XýȒp��>�I����dY>�-���-�\!B�Eݔj�o�BW�h���N(�Ԏ�}��ɂW��D�+�,z*2m;�x���B�a����"4���hR~/C���)�;ªțf���c��?���] [...]
+�	n����OY	x����b ��- �;��j����p�:��D�U�ʎ0��\2�������ck�Y�,ͦ�&k�\�w�U��Eb�ʊ:������NFQ���� �_r*(��VP~�[��|���(B�0
�l5�g>B�U t]������*�щvut�c%�߱�0�N��kc,�l	3R5n^�Ԑb]���P+�u�H�<D5���ZoaU������0y��,�h*(Kt#�+~��U}�ͫ
+_��@&B/�nc�V����}�4�I@��Оn+�@��fw���m!��mѦ�-IVҦ
�*E�S�\�^R_����ڋ/SPy����Ҿ N�����,v�/�
�+���oV-P�e@�ʀ�=�������
+�N�����ً�o�.�3G��\5��RuZ����;6���'XT��m�ڲ
�����%�ܦ*
+��އӠ���;���d�qf��3Y������7�(l��Ѓr�f��nE�v��8������w�u
9��zk��WHw��{b�J�S��:���;�s�
ݳ���
U�Wj��7I�KKP��c����ʫ�X�
Z��/�%x&�	��=�
p������6�&z�����a��G5P��j
�W����:j�L8��r� !�
	��!�H Í	nA�x_�N=겻�Nm����ƻ��T<PT���
+��V�.`�j���-�>�d����|&3�e����#3�0���x��=��Kv�H����U�=k�
�i;m_
<e�*դ-��OزE�m��e8�i0���,�)<ۀ�
��C������	@-�?+��m��Z���I`u�'��6���@�pqu�����
�|�'�QU��޾Y���'W.
ȭX��޳.$�ܠN+�
O)?�/o����
K�m
+M-��2T��n� � 4}px;�� ;��� �?� �h���WX��ZtLÛT+�U�.)>��0�p�t�n.��>��'�n�_Zm�}�W���
+���>H[�4�@o��Ƥ��`���G�Lspf=�1Z��e _��L�Rs��`6�`a�(�����nQ��5��
����S�≧���
3��JӾ��U��_��z�k��;�q�olc�oLc��9a�9��1
�5Rk)�C:�{��P��W�X�����\(n���vW(hd��Dzs۵����
�DQ���:�8[�3.�O0�8ĵ}�ݶYٶG�1ֻ�5]ƶ��D��\"ΡK��Լ�����
+��� ��*�/=
0���"&\Bֿl!���:�!�#��ԑ��ufq:'��:�	�;#;?�����:�k�Xݵ�&��$�F�$��W�1h|
�~��z�
�=�}?����o����� ��?
 ����n��3b{˜��XFӛ̊�
�V��sB��s��>�)�K���k�
����~���ׅ���By�
�
��yV������?K�v���@��x ��D?���
Ÿ����B�G0�qL�d�0�%�c�
Mc{
���x�g���u
7�v����+{u�+}u�+5=�J��p��
_���A���_F�9 �\��w`l7@�0��Jt� t�T��a4F1n�ed��8��
Y�8�e�bI��e��I
���52@
�cs
�'��?2���5����P�@�
`
��EԔP�\���

��1l1
l0�1���LF��>�b���a�



���c�<iǚ� ���o��ܧݢ���  ��r�-�i�1:��E�� @?�X4�� &�
RD��F�
d�Ojށc
*
6S�P�B�6��p�+��
3�辘��+�g�K���.��
&'x��B��:=�&���������~
��X�BE$�9��E�i\�^�CϿ��s-��G�m�\�
U��
#M�<}�ܥ�
�!��7��[�G@����`8��3�`�z,Cu

ʦ1�p�>�/��j����w�JRC����,�Hn������!?
����۞
Fz0�E�Y�f�&���\TO�a�l>/�r�*�	Q���D�('U��
�DE���
+�尢��O�\�\�D���E� �M�‘0��Qn
ƹ2���8_B���X=�&�P3]�
�^"°O,ߨ�[�Ve�J��ڤ��
RU�UG�/T��g�s⧪+⇪n�}�Sq����[��{j���VwF@��/eP��`}��\��z�i=u\Ԏ�c|��p�<�˘�VtS�~U*~���Q�V�@d��o�}v�5uv���^��
ͥQw5����y2�F�k��H����Wɕ(���a����z{�tG�h.��
�R�0#�3���{��g�$i��n�u��D�;n�ݽ�����ov�%n���=N7c��o��K;bOI�Ƕˮ�ޖ]�}$�7,5ƣSk<:�O�Q����0����-�m�H�8&� ���d��հ�d'�
d�X�dY�I�gs3e�]�~�õ�5NW7HL4�\��r�A�׭][�ަm}^���9�U�3�~�fݐ{S"�6&��d2:�HF'��6�Q7���t�̓ М���ЏyT�b���q~��t��[]͙i{i�B����έ�\Υ���M�8�t���2�& [...]
+u6~3p:�����7���?�M$!�q6�OF�ƒ��5(n?�`�L<��h�;��$��g�/���坳��'9}��r���羜)�XL�x�s*}���H3�-�)�������䩠Q���a�#� {�����d_�O��4��{�`�{9�5(g��}/���go
+
�[�#|Yx �ˏ��Bq]c�@
ﴜ�q���=<�+��QyOfk}�2��G2)��m���
Z�1zW�
�3�~pGڳ`K���ΏA�
`�D$K��x[�.��9D@|"|'!�K�-|��
/�{��⣰��]�k��C���T�q��<��@�=�W��x�
n-�zNsP{V'�-k�y5s:�9c9Ԝ�q�)��0S�[�)Q�����C$��5��;�x�}�5��?�l`K�
~�q���C�BXRG�ͫ�;�P�]�d��C�>q�w�HE��Ӓ��ԫ|�9��0��������;�F�zx5�Oռ��Q�Q��B�g�C$kP��
 �|��sKM�gZ;���

�>�
���
��.=�w�$�e@�q��<;eb�6��tU�!�ŕ�FQ=�.��Q#����U"t�G�r�
V��M�N��|D�#2���f�o�+)�
�;�i	�Dok�vp���a�2�v\wz�`Y�s�:�P{q�G�2�ˬ��6��d:j��H343���!Z�HXi�\�:�!�$;�D��0u��t����
�[�8 ?^���|��
W�A�
,�
�9�a��i;d8��;�^�r�ji��&�������F��7�Q��*�Vnbh
+�CJdC�J�,K!�)��.R.�>�H�_�R��T
+DQ!�5(�{�A��W
�i��e$�J
�����/�����wwT_��Z���I�q��<�xu�اB��/Wk(�%�����R�"W�K��Y��{��O#��o�
T?1e�(��Q0dkP6�	�;�`͈���"v��&'3{�@�x�1��Z}�&�e��j��*���BtB�/�S��PTZ}����.+m
�h��D��z��W?�䫿����)*E��2D�� k�~[� O�p� Kf�]- �{`��t�R�m-��泎u��.U�il�R�л�ZJ*�R�%�Ɠ���@���M����Fd�>ae�������-�Q�(��w���=|����kXh�ރ�k�}tw
K���
fW�vzoUk���%��ƜyTe��7J|�
E��ueTam5-�hf��t�d֌��W�	�R��UXz͏���eDL�5��
����;h���ϴ�`��!@[�+�{}	�=L۪�_9�w^ܧ�Hr+�p�ڸ��V�w�U9)�EC�i6P3�&�����4�l�
�6m�&���l���bB��&�fBdk�*�=�[\����?ޅ�;`�@���
���I�v0ʾd �Qџ�\ЛvPԓ}��-<��zg]/&q:+ȩ

Tv{;-�}�
߾��ԾΈ��f�[�%X%�
�1~ּ���i%� wpϿэ;��h� 0L9�n�(h�(�T�m��i�x��p,م7�q0k�8}D�:��b�|��.
Z.
Q���<Ƽ����
8߇�/�!�ך?��
� V��������6OT�b�����7(\����7mǻu�!k�S���ԛ\7�l���YőK3Zϋ3�^���N��
�==}�3�F:5��tj�O�$:��@^�<�w��!���;�;�j���� ]����'pW	��D�����K����M���/nEx�Š��ܲ����S˭G��<���<"��<Y˯<Xw�z�� �":ʺ�K
�o�R� �?���� ��P~@�=T����Cʆ$o�@�&���E�ی����h�ɱ?��s�ِ��(v��0��hq��w	ݸ����y����+s
�1���~�j�`������K �x�5��'Hxf�~�g���-�l1��v4!z�!j;���ɰ	�چ�(�;:{��i7m��!���C��G{��w�5uoq ?��$� �� !�	j8*���,�ɢ�Vi
���
t���Z7����V\�֊Z�<l��":U�cQ�Td+�y���8���g&���{���{����l������ְ�{��o��hG����J�_C�K����Q~=@��� S9�o
>�b�nV���>h�����0�-
<��m[��8�u{\��<Y�9?Y�9�W���<���<�'�<���}+��[��G��6���_F�����_ ��D��
0�w�	�F��B
ڗrp��WZp~�
N]�cWؿ�ew*�����0�/Y�&֪�[ֲ�
+��J{_�݃�E����u���)��
�_����; � x5x<p��f�

��R�ݐl��A6�X�/H1$8
Ę�8D�)#�"�73Ƹ����H#�7c���/����_��_"~�0�����w�!�
�5��%J)�ơ
+�P��cԃ ���P�uB�!���4t��Р!5��g�?w$��=�!�_
��v �� �/ �� ,�1�t�ƔiB�jaPN��"�%^d2�$Ʉ6�1�F�t��rl
t�2��Π;q�1�gP�Ϣm8��$��9��sh���&I9�$դ�CI-9K.��L:X�xC�	�#�ZuD;R��
BYT&p��͡<�C�<��$�d+�+�>r�
#?��
Z_#�3�M/�e�Ȑ��o�e�wbp��8S-�]�Y��r�N��aU�y�,"_�M|Tn'U��ԐZ���\&M�a�Sހ��ׯ��T��%=���

O�z{�U
z9�g�IO�1!�E�4�1�C׹<t��s!5�H� 5[I�K	�4���ӂM��/�-��cA������
��3
+:ȟ���@=eOR l��A?ꉯ'�?}�r�O����T�">z.
銌������hԯ-�iw
{���=��k�	a�������C�,�C�R�D�NئC��

+G<z���Y�([� ��	�E�7��i=�b�AC��\A�O��k�B�+���/��w��L��w�<��1}�?d�D������UEԬ�]�@�iv��Y����BQ�鍦7ރ��`A�b�0)`�$B>��g���s���Y�g.��/1n�_n���������ߘ�7�wϰ_�d8"i4���6�[4�X\3<����oq�%�P|�ǝ�C�s��ɔ;e
�T3�(�#�j�nC��Lo�7��>
�嵄�

��3�7%_�������A_K�n�^
,��
Pi�s����c�
?��\�����t�N��� ��
B��`��hD�SE�oOu̐ &ʡ'Q
�<��8���H�1&��FT��ȅ�?G|&�^(=7�ت.�Dv6l��t�v�S!{lO�
VԆ���!����������a���P~`*Z��p�����ӄ�qt�L�:R͠��L�Cs��R|�I��_��Euq��ӱKO�,���^&?����u���-�Ñ���
�#�w�6�N�/►*♺2�jw*vE�ME4ʈ�hn
+�ҵ�Пƃ�L#�#�Z3�p'S�2'2�����h�����,��ď,��Q ;��mu\�ݾ�U{��w����+��ig�a����ˣ��l�ns�ۧ.���eqhW��D>F�� ` �}��l��A�
��mst��l�6+Bx4s��Pz�d�\���y�ʔŊ��B��b������5e	Λ�]7�w+��w_��cmB�KI"�K�PU��v�v4���
 t�6�L睦y
4,����B�8��,pc��7p5�aFr�D{�̔�=�jG����|Ŗ��6�\�!u�Si�z�)�k����N>�*�ve�]]q�+���aM�LtX��*b7�2�)�:��F[\�B:��qP��?�Y@���P���U/�bT5?F�37Y�-g�UYv�|cV��t�b��Y��k2�5��X�2}�ۗi�
�Ӿ�-K;�4�����N�ҌA����^6
�r��u�	К�H�W?�w�|��98�/�#j8��g�>	�̛f����M
�-K�e�Kr?R|���Z����9E���5.�f [...]
+���iՅ�g�$Y�(2m�y
+qAn�$/��I.ovɒk�ҳ{=R��d)��=�����uM�aND�����J���T�C
́�j@ك���`g�>:k��Q;�k���i�Z2E]�\PUnZV=CU�`Q�J�V����$Y�N��M.)��g')v�'(d�s�8�]ٚ��&�3��&I*`�F�ga�4g˨�}���=�@W�:�Eh[+�������W��V��(��D�����V�erی�"�ԒJiRqì5�M���
���h�'
*o{D���ZŜb����'z� |K}��jp�v�A���H{W�A����L��l�:O^U��niC�a����n�4�:vf�Gɖi�Y6I5�5��تz���v�����++�ET�u���
Q�O��L���9DU0�D�R�/i?�
WS
(���l�����
BԶ۠r�W�~>���oJn�
+㬖��u1��D���
���m��R�U�j����Nau�g}Pw�5�n�|�����5s
U3b7�
��%z��Ct�}���v�=7�[�*�J5Pjfq�o
��Ez��
S:B���L�6�ψiO3�ڐk���6��V
��*Y��%]ֺ�)���s`�7΁-�
�Z�òf&^��l'��~��L��	��!�߽�PvK'�^�e�.=ӑ�#Af�'����O�Џ�l�=R�-�4�+Y֕m�Yd�bk�u��f� M��_���Os�a��k�%[F�~����mf6�
�z�����
P��(�h�U��(��(�H�"y�5�������E�/��_��f�m
�7A�|o�i���=�3�z���j,}{����=e��{��g�����7�>=���
f>�yz��

��
��Lwo�T���y���#@��D
��rH��!O.tȇ<�Tg�`�n��J���8��T��y��ʦ�
4�.8�e���}��GO����������y
b"�����

�u����
��kh
+:
d
������lX��a
��uF�v����m �H���~��P��;_��7W[<�K[g��&CO�
#�����ٯ�<����~#p;�n'�p�c4�}�����S����
�
?K;�9��0��	�]������<^W|1�J ޹�y^Y�y����F�y�#�:.#��#��NW?�K�~��^y�w�4�'���K.N��毛�7R~�A���}XC���(��{���������THoX at zS
+Ǜ����C�p+��WC|;�wT����Y���,�
�,������3���3����nN����A�
�_z
����|J���>e�|��5�r���
�B�<�����x�
�G���hf����L{
�'�0yZL�A8�
�c<�
+���0~2��$�o��򏁜a�?O��
@�
([�@z��0����F=7��
3��������0z�
�׋��z9�cQ��-
�7��ö́
�1j��5򄌑�����+)?W
$��ïK��(ۍ�
(��
0�`�
+2=�1
�	�|f	���L<�B��_�!3z���3:�B����$Ք���D�(�+��;`.e��
���3e�э)߀z����]" &DD,�=q!^d1	!����5�.BC�NM�Ĵ[:8�e��1
O�M[�1� �	"8f��1�

3(%u��c[��K���M9AΒ��w�>���m�o0���8qLJ��8	��ƍc��
��Gg	����0��H
YG6�.����Y�c�
��\#'���+q/����?d�yTSW
���K¾� !/�@�	Z�*�,�ʾ�H�HXH�Ը����ТH݊�8
�m

�ک����^EN�w~�
�����N�������r���Oq�w¢)�^/
 �(s�Hl�Cb�� h&�M+� _�
�
��<����8�	��x���K����K�O >�
��N�c�t�f�'
��HbG���Z dAC�6�=��|Gw��ѽ�8}�|K� ��ߑ���g�cr�?F>�c�!S���M���A�\�=��iO�c��Og�#��SbH����5�|'.���5Ԙh�Z��z%�B��S�E]�3Q�Dt�
�
�NSEW���G�-��M1f����O����	u?�Ax��
�}aM>n�ۓ�������O��_�)��S
�'
z��R�C�*�}I
�d+�d����[�}̛�~�?$'�7$�XW<
�.z�6�0��s�;pv*f}
�p [...]
+�,�I�����K�`btV
�`����Y.u˻��w5��2�U�&�߽6]��n|ѳ���
��MF<M�y~oz���I�fC޿���Ʀ���76�#�
u�Am��a
��G�����������-��Ƽ��\%��9Z�y�%F��jM���0=����f�a�v�o}����O��O�Հ�)�c>׬���>����~?l�������������\�Ȃ�
��a
�h<������N�;�:
�-4�	���˘'�����כ
�[

0X�4[���>��a�߿���~�}�'l��_���o�
0��
'([wb+`�5�
0���@hl�FcY�q��e��F9�
�3Й� �ۨ(���֑p���<�
u�}��ֽ�K�{BVq�
+n��n��
���
+��+�og�Y^G�-�=�w[�k
�
��[?�0^�c���_�t-����
:�����a�q�F�be�=��-���V���؝�՜��v
k���
��No
��o	;(�
6�1�'ǖ�g���;����͑ض9
+�|�/�=��7S���Ѕt�>��L�C�O�!�l�/5�ѓc�;)մ31�bG�ں=���[n�[��
c�m\�L�_�&X����'\=�*�����

1���X� 쁭!
�Bwa��0��$Ѱ���ѡ
1���&��T�,ҨC�h�-Mfٚ��ޔ��$��7'V94%6ҫ�V�ovZ�C�,n�KC�QQ}܈�.��K]¸c]"��0��I��i<d ����^�y�`�
�"�!���rF�Y3�]�yT�"�՚g�Q�f�^�`�MWsVK��
i��S��Ɣ����amr�Ku���o��䳮��w]�SƄ�T�קa
��I8
+�����
�F������s��r-P�Z�v���s��-9!���E�k�)�rkCFg�\k�tq�C�����-s�L_',����Iw�K�]uҿ�Io���q�ɰ@���p'��؋i��qꞀٳ� ����Rc�viy�]+!�hf�-yA�&u��JU����t�YJN�2ϮJQ�P����d68�f4	�孢By��V��M#vϓ�t����E��
5
+��*08Lz
�пd����cE0��`� ]Eƨ���Z�?A-E3ɦ�@�Anܘo^��fU�δѫT�KT�ܒ�r�8�α k�P��I����R���(�ܳ�7ܳ�^�r���*�s�1/7;Lz>q
'� 
A��R�����
:J����m(sEM�^��ğ�P�и�(Ƭ� Ų\+g�j�m��܂�RZ�W#P�
BU�QV�W���-Su�=#�*x!�Tc'�
�jLޤQ8�'� 
•�\C�T"�	��	�R�FM.�P1�h��a�,	1�(�6-+I���d���,[MQ���P�SV	�
+�;ej׻ȵ��e�=nR�q�4�ew���8]���,X\�i���P��%�28Z��2��
����X��N��vQS�K髂X���&�	�Z��:�\�Q-Q�g�9(J+��F��u�i���W�I�cn����(Y��S�
 ��üIw��y����pB{�a4�ܷ
����7X��FU7��(o�E�42
�Í��b�rkS,�k�lE��V^U�M�*�U.$W4	*�\��ݢX�q��0�����4��k
�3 ��!��A4�(AD�q���p�U�֩�Z���
+X+ 
+8"8Kl��Uk+���.D���:��Z��u�}_�Z���?����y���}r��?h��
<Oz�w��pf&p�{������|Πe�I��SaNJ >L1+�'Ǫ�$�;LZ�_3~�P�ec�^:A?��i�Ö���8�g��~����&�h�;���+�Wƒ&�^��I�>��7A�R9���
��{��u{��d�*`}��¬4=f�15�����x/��j\j�ѫ;��|�v���
������G
��X��{E�wϔL���m���
n�5�l�����%���$
ݓ�W��o�����y?���8�lJeҁ�5��29�e�g�a�:_�_�q�ڋQ�q���=�C�8���9N�w��n�����X���ۚ�]2�xu��j��8�
�Q�
��gCl�s��4و<�+al܃��?/
�b��, q=0���D�Gcr5����04/��"�����~�}T�s��{�r�e����.�r���,�E�v�ܜ����GD����������7H}�z�
Q�I���;��q-������r�i�9����Ѩ��
}�>�mm��V
⭱��5^t��Wt�S�Y����Nq�̟���X���b�ߢm��_�6����*m�管;�k莿+��g�s����'� 
��v���}��8 ��
���.B�-
��8D�z �6P��F	�m���m���m���m��dۤ�}���h���ͮny�c�!�xP:շ��n+�9
+�d�	;�������H΢�l@��@������Ѻ��EA0[T
�V%=вdKƠE�4+�+J�D��u�I�U��>%�K��ſ+�
+����T���
�O���ﳿ&3{���_3�[�������_�
�
���wE
.�R�.uC�K�ɗ�������"�����ۡ�r��AWY
�E	]��
omb�j�/e�?f�SX�hf�?�� �
rh^�U�?�����mw���fp����ػ��> ���p���b��P٭P؋!�v��I����/��3x ���G�������@�� S`�
�
+����j'hj��X�U�5@��¨#񥤆���5��kx�k� ^��]zB/�Hf�����
,d~Љٖ�@�ˀ�O��&���|P��:�t^��;5�o
+��@]
��a��\��:$�d���w�X���<sc���Ϻ�W��� �[�����g�Cp�$�S���HO2R0EP<�EY�,��$�<D�ߐ���~�!}ȳ%�.�9
R�R
�hͥ%���2h��N�K�+*��t�~��I����M��ҟ���#�e�!��Xb?!
G	��,�r6}Bɔ�ȢM��v�>���NR]����%�����
+RJ<Q�I��
hB~l!���u?B�����3LH�{B�̤�)��
!����mY��p>�:�R�p����U�u~�ߜ%
�H���x���]��/d�����Ϧ�{̽� �j�
	��~�O�9�^�D�.U��e�纍�.O<��Ot��c�
��BT���Pw��k`w%�襸M��t�
�����l��V�GK��f��#d�<3#�K��w��a��5,Ն�!]�j��r�}�v�a��2
v�7�Ἰ�}[��S-.��R\�
+�@��!�nӀ\!Cu�~�a/Z�lE�Y`<
7"
���{���n\$n������
�q͸A�h�?�����J�	�ŀ2Ey�uŹf�)�4�S�6��b*�B:U�l�|�
��	2���������ۚ�0�#�Z�ŭ���	�i��4�UT��$�w�T�9S��i��̴MuڴWUb*P��ԅ�J����c��
������
~�
�2W
����:b\Q���q�}n�E�%
��󖱢�2YQj�PYl��:e^��Ɯ�>iNs8a�r8�.��h����v����O8
2��
0��|a���j��|�t�m����GF8BF�"x�Y����;��
��ը&(�n��1�P
�O|3Bq"z����Q�t8
�/ǃ�K��G�h�E����2
j���Ī}Eb�'
{��c\jl!�B�!�$K�@$6�Ib�ر@��
�8��X$vl'�
�Y&��v��L��=i�&�I:M��m���43��3��{�y�9��^�+b?uU�L�$�L�(��8/~�?b.����J�Ϥ��T���J�>
�F�I��
��l��
+|,���Ki� #
ޖ�_���LA��YB	e"�d�D�
�G_���vQ��
����e�
sI��Z���OKB����/yȝK��3��kFJ0��}�n�3�уL̽�{T����
+���r��r\��9��f�W��
9e�AEE�r�5����� ��z���!֜l�=+;ŝ�\��2��S�����	����cr��0G��Y)
kX��P�!�J��E��Bl� k�d��J'�+RR��D�.0����ԓy����	��5���
���L�G
�a�Ÿ!�5�G�h@�h@�DЯ$���a!�0���\̜��
/�񨻍�(#AḦ́˚Ͱ�y	�4i�ӥr�)uQ�L�6�Wl�zU�DQs���=\��
,�
+����
{����xw�/\����:
	>�ul��G<�>G~���=<��𞍄��r9
��8��	�z1iV�I��E
זƌ���3�SZ�
P���J\ܞ���x"�Y|RԡZ�oS�'���&��>Ij)�{|K	!hQ<��� �0�*������A�-3�^d� h��E����0cJ!M�����aCq�G_N��U�{ʭ�.m#۩m�v����4�B�fFԤYJh,]K���N�i~�ɦ�[���ڴ߮%�'�7؇�� [...]
+ӏ�J!@xU&��K���>zpu�6�͘7�9��o=Fl��c�
�61�]�A�SF���4[˩
�
+���ʪ�n�X�;��恸J�q��ʟp��|����&]ՇȗIz�"���C�G�/�_p�3��
u�
8mx��
8ل���ǚ��y��RH��G�"��^m��Q�lF����Y]g�Tֵ�L�}q��q��:����4��6�Z�G�H�X�#*�qe�_k%xa>�}� g�6ּ���: �:1wv��w
�Ҡ�Mζm�֖Ljn=Lnh�G�;
+��-����Ze��ij�g[���nAYè��>_b9Qe5���^R��s|�^���b;�Gxa��}x��&ּ��+�?�1s ��[ܮhhw���~�{I6W*�֕I�v�FVvǘ:˩��
+zy{-�����ns�[��
+[gD����<G(A�x�sB����<!@x���!��=��������0�
 
Gܽ�������[�f���
5�HU�R��Oa�-�*�-�)�1�������U����uy�J��8�{I(w�����E2�g�,׿��.�/w�l'�	���3r�,��{a`z`�Dl�e��x�����$��!�v$��ɏ(VG
�c
+����A;=g��%�
pd�)^�g�/=vE��'�
�� }�	/}��J�	��z�:�`
�?7�
��8^�`�f
+��T,�||������
(�I*�r�/���+�PNi#��*��&�b3&[iRoC���yة�5�A�[
��S�x�l�8�:8��0wp7z��wa
� u�O`f 0��N��IP8ς�@���2�
��!�< #�y䌀�"�7DH�-�i�����1�����߿JK�ߡ'����}G�w���Ef�rÍ
`��X��`b�u
��� �����dc!#�i�9H�����Њ�V�IW
+IV�䔕J��;eߊ+bop$rO�T��२]��Q;���v��.z�2��,�c�)!��+���}s � @��O�5b,+�<*_8��5e���
+ ���wu콚/�$�'���!�
+�aG�J�
j#m
yH[C��C��/l�A޲�	y�������_!"�[{�e�_D��}d{��
 *P�t
 ' y
`�� ;oQ`뛌��]PQ]y��7}fPPi�
(�
���PP��%G]O,I�EWE#Qlh,A\l(6tQC46K�b�z����.�ݏ�wO�w��p�w���w
<���(v'
܋���H�>������dZ�$�E�,��,�si
�J����g����|XH�CBr<(d��s
r��뀯��hf'07��!�_��R�����:�W��Ɗ����2��B_}�(�VM��*
6U����	M�	�
Me����0?������;�ϋ���gns�e@�@�Ӏs%`�����-T�MP^q��7�W;A�T��(���ĉ�ff>X�x�kU@�c^_�� �c?��\��p/0��Q�z
:��U ��� �e@�+ �n:Ԥn���ZpC��͐7�݀��3��!��/��o)�ca�؉����?�DZ��ڏ��CK���sw�ُM�>��0U�﵀�&��Ѓ�
)yo
�c��������ܤ���Q}�E����.>o9����G윸�����x�~�Q` ���:�ϞWX��x�}�ͼ{�~��⦆��5i`M��󞬉�"��C��FQ�
��l�`��.~ �� �<_���
��@��]�Q
}F�i
+ͦ��Iٴ�6�6*��TL'���;<�wx���Pß-����l
�٦-��/����!�9M�J�%��rh
�S�a�޷
�q�%��Rճdo��6z�'D+7�l9�����/�6B�B��Ih��Z,����=�eB
3�2��X�'(ar9��
��!^����H����3DG�����z��p���t��s<l9
�a��4	��3�F=��@:^���\��'���WmB�� �T����~�mU5n�
��5jmjt�6�����2��� њ��.l�?�%��I$�?�K�Qxj����0
�
�����
�qǰ�
p˰7
�Pk؏�qT���!�ۿ��@�IHT� �ӍLMD{;���m���
^
�hp�g-{��e �;�m�1���j����)�N
q�i).9}�
Nkp�y�:�@��^T�
E��y�lyW*s})��
+鈛��݄�p#�?��(Iё��e=>1�E;w<��;
A��&W�
�E��8�>
U�Q�1�=�H?y,�NxdJ�<��2�u�Q�-R��.�����i������OeE�B��v�W��jz���/�+�/�
x����=�K{+�~�rK
NX���2Z*�L��-��!K��e�l�%]�ϒ%���#/����X
+�|�*
+}�)v�\Ul�Sl�}����M
�bc#�?4esZ
�4����tU���
��\q��/���Q��]�}��IE�cd�����O��Δﰦ)�[+�ZW(7[sU��ͪ����
�#���s�5�����oP�t�U]�*������60�>��k���t&T�� 
��Q
�?w����Q�=F*N�m

%�
4N�)h�"/����_���W�f�Wdkr6h�vج
�o�"�nY�o�̠6AB�m�А�c���̿���B$�Q��~<�)p0�
Ea
�W���
���HiC�x�ڰ��ܰъ��_(�{NV�
��^
���
+]d��L��k�$d�>=�H�(�aAh�a^�S}ZO�#��=�vn��4ݛ��jfWpj/�s'Ϡ?FJ��׀�7�G�bCdr#�H91�������Pf�
��蛤^�'Y��g����i���3l�z�2�	�h���8;��8�������R�}J_�#�6{�܎ ~f������췏��l��:l�v�ژȉ醕1aRVtYFt�b�aʅ������&-j����i�ّ���"�
)+�G�7N��i�q�4%�Cr�c��G	;ғ�=�F���� ��Y���c�P�'p��Fn����XoEF|��
�O� v�"-6Q�͠���hfL�ΈI�M����=ߐ
�e�
��41z��W�
����CR�[c�@a [�5{�砚}>�������)8��	
+|�`BV��
����`)-��,5!Z>���ʔ��U���L��M����
7]?1n�ݗ��bW����q\�>���r�{�c����
;ғm��|/�����#Y.��h=?g�o�ÌX<�5��/�e�����
��
�GAk���!�
�#@� 
A����z at T�Bt]O������Za��]��-3�um���n���~���L����
_�|���?��~���i����扫t�$���))2k���89ǹ0��Ւ�J��T�2k7�gk[=Lڃ�Y�S�L�^�&3iH��$���%Q�S�����{��
K��r�ٻ��>�5��`�:�d�1�U�K��k�R���$iAz�c~��97�⚣[�X��Vu���

����'4i��^�ԛ�4�#u�NpK�	J����?��sY�Ij�����e�C?��1���4�Lӱ��ظP\���!?k�Ԝ�s���r2�\�
V�A�Z���w��mꔌ����5I��^Z�
��Iz�-Y/(�b�k���ی�8���(b��q��1;�¬A�y<��/��
,���Ź9�$�9	RSv�,3��_nvI_^,י*�)�
nZc�:Ѹ�#��M��&�����x��`�D1̧���L����ڿ���bI��c���HQbQ��`
,��-�-�)�,Q�L�R}~�,=?�15/�99��U�W�H�]��������k���=O�yƘT/6
*��5
�a�pݝ�'
��恥�.���8Vr
Vb���k}9%�`*	BfI�H_�P�f���Z�I�W�ɖ�09%[\�K�Euʘ�-n�E{�#
;�E�<]UG��
Q(�"
ed����\�g��S���V�k�z�e���r9�*�a��GF�4�*CD)��⤊E�Ċx������L�ūr��*q�*��/,ۤ�_�[^v�-��,��-��*�TP�[�
+m� ��
t3��� �[k�7ֲ�!%u����NH��@r�Xh���v��或�E�c떈cj����
iDm�lA�
+����sk]C�[�WQ�T�YR3�YsW�Z�א�眧'J�#�o�n���
X� �L�m!�Q�%�#�41M�����pQD�"т�qx�N�hrm,���X!
n�w�ݰ�yf�a���^�
�̨��<c��<cY���<���:z@�-��[����}����,m"[\����mc0���lA�k
E�m!^�ŊBlI�Wm�,[�$�V&�޲�aZ�M:��lJK�,��#Y`�w��m�,`+�"8s�9?B�6����n�f�
(�	d�҃�@�^`n���J�n��,��쁘a����9x�
�i��0u�S�-쳊&�k�������O���/�Ƿ+��g��
��o�s���~��dܛ[�wq
��:hg��X�1� 0�0{��RL>�¤c>���	
�x�c&�;�b|G�:1�S�����Y�Q��1��
#:�����������A�s�9�����|�������

 ҩw
X��=|�}鄓���2�v����
��q��~	�� x�́GO4�=ˠ�5½�
+���P��B��E�E(z�<���(O=��޷��z�]ɸ-��w	"N !���
���t�;��<���
��J��i��7N}���7
��PH��I2$�9��CԿ����p���;�����7�q��BƝI��S������
��
0�"��@�!�tI�e���Ko4pe"
�WX�0��/�#�t�pL���.���#?�o0�5�w1c�b��z��x��;��~����~	�3
�' �M�J��p
�T,�=�/^`Q�|9��Y0�y������\t��$o�>r�|O~|F�!����Dϵg�/P�d�c��E]� c���An�ArKĂܑ���
l�X �� �Y,?`���/�G|��b‡h�E��E>{F)�[6S�Dϣ�
̘.c�	x�6o�>����&��w	-C�}1���<%�ă�=&�Y�E��y<�����N��
�>Cp
�m49q�42�,&�$�� Ud=�LZț�N�r��
����qO�?�/
�
+����z%q��x:�)$�D-�"d�%
d+�A�Pg?u�1��q
+��
�x����k������%w~���A�E?4���t�N"��|G҉�X�y��8�&>y;uvQ�
?� u�R�8�ۃo�>�?��pn�A��+r�7Fx@�q�nT
�\�9�C�41$���[���1�j�l��f�4�h���:�Ӆ/��u������<��;����H��T�}Pem�:�X5�$
�p
1$�$"B<��x-�J=pQ�깞�jkkն�V�c���uW����m;�
뻏��:��3���̛���~��۴�o�7(S�韮W���_'�}Ք%�CC�P>"�QmCT��oB
+~�Z���C�
�j����]�����
����FҊ��6\�l�U�~\�
�_��qQ�
�
�B�Y��OU"��1J����� F* �!�zR}��/��&4��� w�
|���kuW�a\Q�Ɨ����#.hV�s�|�يs�=���1|��
Nw�'#
��k"�uq���
�
b
���
$?��-2�z����p��۸�%W���b7;>��Ź�U8ӽ����z4�Þ�8ٳ'z���^m8�k��:�C�O�`�k�����O�]�"���_�ǘ�٧����1�-������O$.E������&�꟏Q�8�Ñ� EO���g`�
f_�BfO�r��2�lav
��lp��x�ix�m��7�1Fd7�w_A
B>
��'����

]��8\�Q�|L|4h��9�'�6{�6���`���ٮ�f:�S�-ڙL�v.�Y��ݤ]�n�nb�kwr���ܺ!g�5C��V��_>T�-È��G
<&�w銿6��Z�Y=��[|0,��Ga_�p�ҍ�6�	[tyجs0�t%�z��m��u�:vMl�*��[��/�m�[b�J���,ѝ�.�ݒ6�x,m!J�?���
+O��?���$�[F�M|@���380J�]��b�^��q��!ވ��,fM\�2��]
Wʶ�UqK�����i�B}��Y�HҤ_%��o����5�O��W�����̸��񢔐��O��%R�k�L����!jy{�Io$(�'ClH��&���$�%���IfQ��mN�pM���<C��c���6̔6$4�f&,�'��OK�!�O8��3\P�
(�$>�$�2BZ�
+��
�P
��)Ҟ�s�=�n#ڌ2��tŪ�h����1hNMa�f3sR����N���a��C��1,�36
+��K�5����e0��j��*`��
+��G11E٫�` �S�g�����~+�O�fz^��b�)K2��9s�G�1s
Ӑ�����c���
7_k*�ԘҐi��:�A�/�OL_��LoWU�P���Q����*�L��,Ch���>��rp:���>�i��B�z�eE6�l
�r��1�M4侍��>'������d[�P�����JY�Ҫ��2�
��ܤ�W(��6u�y��8�Ɠu��E����^�W�(�6ҜN`g!�XK-	�5?O�Y�=1#?��o�v����`��
��UyvΟ���-R�%(�Z�B�e�“�LU��Q��ݭqZ>�8,�;9,?�
y�™'ʝQxɷT��d�8��Gڳ�����X@~�*P`���ڢQ3a�6=�$��fb+
+rٲWZPėX}�5 +��	.k��a]��[׫m�]���NV�M�_j�UTXE�
�gܤ:�![G������-^��]4�:��u����&���r�D�����i�י�;�����

^��Q%��k�}��j_�
ooU��wj,��\�u��b�����3���^�

��w��Y� �G���r`���C��3��}Q�ye

��1L��ȸ�f����nowKlE~���F�/zGn)\��)\��*ܮ6���,��x�2�Js�� ��KtNR�S��*�4~�$�'���j�+텒�x|�Q䋃�7�q�2�	���t7���畖Kr�!Y�w���]���Q�{;Tiޣ�T�ď��Q�V"�_ <�3:�S
�P��4v�������N���O�~%��npUF�Q9�F����X�Ҙ��l�Ri�r*
��J�$�?I���R���F�*Er�Ve���*�I�X�P�T!*��E9!�{�:��;)��`�Tҝu�i
�/>���aB0�H�������1șld�B�Lf(�5�
\Z��O	N�$�I��2Cp�0��]
<��^P�U� ���T��$
+�Q��S���o��&�7
h"i4�L#�UOs
��:
��{�\?��a0�G!=���p:c
�0��66)�a
�~nL�>���\�yT��Ɵ��3,�
+ʦ0
�'�-Dk�$F��5
O46�5"�eE�
8���H�pj�%�����&*.��TӨ(1�>
+&������y�{������E���
+�9�^��٬Iθ�I���&9]h��Bm���^��]�u
�
KY�+Ǣ�V��w��dX�'���!-'
�Y�0�����0������g
#Y��T����:Ga�f)�r
+�/�lV&�TƜ�Ҙ�Xe\*T�%�R�=PC_7f1�&��y�e
Vr���� ��d�ia���=�����H����>}��BR�8�Ο,�$�}�o�ɽ��X{�
c?&�ؾ�c�~RĬ
�v��yw��R�@�Դ���`5�G�Qk�׋�W�I%
0��PCi4�K��+MA/�@�t
C�c4b
嘆HG�;r�X/us��
�����Rغv)�XH�k�����}/�q
�;�z�8���x���@�M�i3_�pz"©G�3�*�ViDhe
+B*"�r8�*Ǣk�$T͆U����[U}���V�<��B at _.��S
}�YԞ�qp
+5�Qod%0�0o��6 r'��Է�%�\:�+���2�A�v���k
<]S��ʄ�e��Ue]#9K�@U����
�{!�m����y�`<5��X:x�k���7 A�z��>�
��RS0�\$1θل�y�Y��<�n&� �;��|�&�y@�/�a�����r`:}�@����O��=@��@�A at w�:(�����_��h�
ʹ�8C;��2na�oa�i�&o��-\��
���?$O���9_H�g� ��F��W� �
���c��$��9�ϒ����j6@��Wz�BW6���
.�Ao�
������ʢw����^����Kr�����N`���'��N��f���nu�N�_����_�o��JV\Wp(y	��es̘|�A%��zp�v�ccp���>��&�7V
lc<�.=c6��$�z
�=�0��8�����WO]�
Թԩy��$�&ߓ��Bwp_��<�v
�1=H"a�,h�`1���0肉�g�0�P�B �D�D�*N�@�#3I�"����2RN��N�@��I<�7���>F;~�v���[�.�vB���-�ӎx�J���d"���%����"��SB�
ԩ�N
5j�{� �q���|�˿�C�?��N��?D_/����b"���Od
+�fRg>u��
�p6�Q��)����\s;SU�[��wh�W��p��}����+�\�D�� �Z��BӅ9	����H^!����M�?Ө3����m��&�SǎXC
56s�jn�ݸ�X|��8���%�:�U��j-��
�@o���X� �^�z��XH��o2�
L�7�7�Z��3�����X�
Ȧ�
+��󸮥F5*p��hf,Nc<�Gi�a����&
���U�nO�G;���<#pW��
+
.+���m�W��s�)hQ��窏pJ�'T98���Qu�KpH�nu5��uد9��
����:��P�#�"uO�
+�v"©
�A;����*<�
��h���?��p�{ �}���X
�N�!��pkg�I;��,��.V�U��OuEh��u�]����.�)l�����m�
+p�-/ XbEw
�(�K�e
��*\�y�>'���Y@*������o�1�zuAS�;hv�cG�bl
^��;�C�Q�	��T�6`s�Ql
+���n?J�p!���!��
"���'��,��Y��<���
8�}�h�HBm����cj"G�:r<�Q�Q�ʣ>Ħ�
l�Z��D����B�4z�T픊��51n�(�T{G�����U
HOi�c�{��W����T^o}�kd4�h��g7��P���i�h�2�X8
Pbxņ���
iuB�T��#�'�I��b9/a��2a��"a���xF�q�-EN�cEv���:Y��=��k�=ן��@�|��U���߶�^p�Ħ�X��cBI�Xc�զQ�7���4QZe���k�!�0}$-3-����r��P�e*S,1mU,65*�N*$�Pf�)盅"���J��C�ơ�q�s5�����>��}{`�%v��,iȵ��2��j/e[&IK-��Ŗ兖
y�%[�a�)�-%�y�j�ť��e
�y���ޙ{D
�K]
�q�D�pFf`��f�����D�
+5.�K�q-�5z�X��Tk��Ĝ4�mz�5m<96ij4Iۓd� 1��w�=�<��������/�*�&~,�$~#�$����h���������he��3x��9[/ �
��)�I?-�8�7��`�s�l�ِ'<kp
+��
q��J��4u��4�����]R����՟�+
o�z�WryjH"�>
�|�z�e�m�A6�G�#�����ulI�����1kLs�lJF�ɄU&��3-���X,V��U�ZM��I[a�(�w�
c��m<�+1�
Vl�
y�+6��"SH"���?�7�w��g����:x��u�H?6�#��<
M�Xm�E�%��4�X2�E�Z�
+�S,7{�2�
+�ۼZ[b~^*6o�]���B�e�Ka�?�����L�K�^��Z�e��}%�s����4���k�ah�E��I�٦���*�
�t�۲�m�Pj+Kl�b�ͫq���ֵR�u�l�����:��l�sm�/�Ԭ��k�Cz�����u��]˸9��D�q-빮�l-�#Q���W��
+eʔ$�#J�L�HY"8�X���r�]���+~)W�$/U~��Q��)ʅpEy'<[���!
����܃�Y����ż�1t7����|�ۊ��Q��B��Ru&����T��@�
j���:�\�L��5�
�IRԀ�Xݭ�R��Y���Vx��O^��YՐL��ܢߗ�u���J��@�o�/��K�} J�#Pd��c:�9��p��HG�#KP
���X&.q�5َ�,G��jo�2�;u���q.,�q3l��>�����P/�����^����0GO�4l��^\N�G�V�
G�3
+���w>�<�\��$丌X���]9�b�C��J�L�Wcq�Ҧ�6H&g�lt
ҥ�^ե���Ou��o�4gH꣰�+y|'��{������X���[�r

z��TB^i$��1�qO�➉ŞdyRa�X���,�|!�S$.�T�FO�&ͽNkpo�R�
r�����F��I��II��>�KB�^ޠg�S�@-��H �z��������dW
BV�HX+' �;
�<��)XTe��ʆ�U��VU(�eb��NL��,�n���
��{OKqޫ�)��ڸʐ6��'.��S�8\�>����8��4�ʕ�]
�
\��n �
��~
�OF�o
��}�H�Y��S��s	>�����Ź�͚پ����S�X�[�����hb�B��ڟ8�
t������f`���5�
���|?`��
�4Hn���X�<	�S1�?��$��0�o�
.f��0��f��i�������8�Y���c��c�
�1������Q����u@�fύ�C
PD�3I&s[�1�ef��ƌ�hLo��i�q�ڪ�3�fL	(�
(@L�
с<
؈	�=x*�)����`|�W��
�~���K����wQ{s+=��o�^�[��6 �Q1�L�Lj��ۢ0�m,&�M�S�X<���`*�30���`1Fk��Z��ن�;�aX�"��FԎG�=�a��֐��Q��e�۩�B�F�T'������%`�^ v�����>�ۣ0�}
�ڣ1�}�t�'i���;w,Ǡ�F
�؂��
h?���[?�
�
�C����Az
dݛX�'�$��b��_f�1G�
�	D��qrº����+RW,�]	�Lz?�]<X�j�z�bNt��x��|�M��=�|k��[=�tw yG��_ )����h�I�
;
>
�� ��|��d8pa
�D8�vs ��0��C���K77[7E.��
̹��3_�oI��
�}�^��3��v�i=�E�W��G���A� �
�a�:-� �Dr �:���0�������
3�G�_�l�����]�B���G�>Z�{#=�`��7����ԧ�_�_��	D�Q��ԾI�@�!�j����{����r ��a�C�я
 =��aO�p��a���Ȟߓ{��G{]E�
Y�bj���٬5����
{�����#����|D�c��1=�GO>
�g`�|C
�x���/y�=dO
��4��
r��j��b��E �20�*��;���o����!���"\>�'u�g�_���K�H�
���2�������kDT��}
**	��EZ��n��nh���YDQ�A@����B"2��b�M0�1��rRV&N�RV��8ff\*5qܢo~�T�����������{�=缤O~���l
d�!�H����u��'3�en��� ��D���ٍ��^ӉYD���d��d�"�d3�Av����t�S�"�oq?���x�W���?���"�

����~�
�1�
1�t�K����l�F3�`'5ڨq�s�s
��g�#>��mj�
O9z�<&�ȿ�?�eg7�N�
�&��qd�OT�@���E�ꬤF5j8s#5�P��{8g;���V��!}� �i�_2�:���2����G;C
5��ķQĝL%��_AԌ�3�s�Ө�C�Bj��F%5j��H�-������_�'�Q�B/��/�� }� �M�oq�~�$7� �
�/D��Ác�
��9}�r]*|=�c\|
ur�QD�UԨ�F-5>��V���9��w�d4��o鋫��˴��
���wi0Z�"��6�;ٙ0�eG'�\�;�k��B��q�5��J�N&gͣ��p
�y]U�
+��D���h���9��Y��ВS��G|��k
w�ql���C�y�e
����
����o$O�^17�����x�
��Ұ,\p��9�b�u,Ǚ�U85|z�6�S
�9�G��#�qGF^��Qߠ��1�]��
s�h��!ȓ�����x吻|��!�+�ȍ��p�y~���.��
��)�D�pM�1�lt�-C�[	:����jt�mD��6
to��O���$�x�m�
��}��qo�c<��6�WL7OfRߛ� 7�0
L.Ot�%wW􎝆��|�=^��	�����
���}��`��M.�k�:�-S��cJ
�O9��S��y�l�v
M�=D��+4x�B� y�4�����������O3
��:
+]�&��s6L���*���g��sf2�ϴa��R4{b�W��*��U��Y[Q?k�P7�S���+��}]��s_���\��u��S^���}�)����ZO.���;�
��v{{b��s��%�}4h�1��'
>Vl��D�o
j|�P�[�*��B�o��ηUX3��P>�G\=��X6rޏb�|Y,y�P<��\��{-��]�~�t���S��\ `�<Wl�?Mz�a�?��T��ӡ�ψ*?
*�ұ�/�~�j�R�̯B(�oJ�w�E������}bA�]iY�b~�<@����}��6�/G��d��&�8��o;蛦 g��G�B/�*h>*�a�R��J=ʔ�X�LA�Ҏ"e��BY$,W�
˔�b�r����+-]�--YtI��#e?!��,�C�G�߈.1��0�vƲ�1 -Zָ��.�	U�c�6��C}P�U�T:��(P��L��<U��TU �ʄlU����$�U�%[�)=�"-�"-��"5���.�#&���5��
����C�����4Ўʈa(w�ʈ)(��F����5�U둣�G�:Yj�`W�	6M�����4��U�*�h+�"�*,�_�(̑o$s�,Y�!�sG\�{��k3{
���|n�{
��kEG��0j"�^����m������`���� M�.��r��
+1Y�V���%�n����P�G�Q��o(���D��1
r���q�)jw���ge��g#߫���v,vF��qX���L�l� ��C���D�ހd}"�
��Ő-$�
	�r�d���
ۥؘvEL�i�!�B�w�Ȓa7xP�#����} ������v,5�@f�2�Ӑf�ո ��`X�j��#1΄����)�	�q�D��Fԛ�JѦ�
+��G�5]SD���2��X��{���sI,���βoW�Lj9.�]��Þ��7�$L�%a�#!1��p�%�`4kN��l��<!�\*j��b��YҘ�Kj�	E��sE��>y!E��_H�����^����X���<�j���
�#5Y�%�	�`J�c�/bS`H	�����D[��ZӅ(�RAc-"�Ub�u����B�Ǥ��+Rp�R��9����_���P�p��|�	l6�
+�
iG}�dc͝>
+1�c��x����@k[�H��b���[f�B�+��:q��#1��&.��헥��{R���h��2�q��<��3I��+�s��#k��v���x�a�>�Y�=�D��lvBP&-~�����,�"d���%�Ğ�X��VjI �5bԴ�c�1�Z�i�C��vZ3�\��o�1\r�{��y��{����lb�>Kz	�4&�Vq�.�]#�4"!R�hX�0�&>������'����dӀ��~��M}��̽������5G%]3G%>4G%��V��hd���e�T��>`
+ 3��8�E<�gTJ�&;iH��bR�48%LS�h at j����T����6Q}Ҧ+:m��Ҳ����+���3m�),�)t�USh�Sh��d���Ar�Cc#����˰ 
Js��z��2������gکO��zguStV������_ٱ
+ώS��	
+˙�М��SP�E9k�S+��c�͹,�����2L����/���R��X�ݲ|އB���}��0��	����f�8*��]A�
+,
V at a��
��Zƨ�e�|,3�mIU7�"u����e�<-��\�Ga�<�X����|�"i
z˗З�Q�bjP"M�1+�X�
a��F�J�Ե�C]J}�U"ϲ(y�
�{�H����k��r)O�sy��)/�S�f9�
�C�y9�~#ǒ�r*az.nc[
5(�X��hda	�V�>���c�F�g��W�A+%��r�:���!����-;k�l�q�l}Q
�3dcMW���2U�P��
+#[y��L���@��^�R�E7�_W�?7Hq�؃�R�)`+�5�o�
k��Tg/S

��
|�!��adg,���@���PՑX
��uw\
����xº2�����s���/���)k�S
+܍>i��
ޖl�oaHa1��~R=Ci}_�
CP
������o���,^�Ç���<�OXI�-�A�	��Gh�Foz�<�^�Òs�dwT2G��vN�I�8E
�a�g0?�:Ǚg
+�hrM�@-�H���|
-�����/�:'����
��֣��?��<!9�׉���s����������E
�%o���*q|�`�	N3
�����sѼ��&�'����gS���y\��1)�
�OI
����ԾU�C�l'F
h��§p���Ĩ}�j�0,����]��o9-4�^�W
B-�I
�|�r�v�w������뇮;y:\���X�J��gp
�_۪�p��{f遭�=5�����b0�
)�T��@��63��8=��
/�0q�L�Y0r��C9�+l�����n�׿(���O=ҏ�����w�v���Wrnǥ=� �
#`<L�7 2a!�/�c�'�Dc=Pڦ�[uPt�s��3���?��v�V����Fk
��������"`<���g::Ih��;e��EEh���*֯`�M�����b�Fݤ�u��r[׈���>��<ŕ�l�d�l��l����j֟��%��hMFg&����9��G�E�q\#���d������G
�
�(�+t��|�+e���`؛����
�=�vE��Hr��sh�@
���:s��t4���C����j�Q�N�F�i-��
9�c<u�j5�Y#
+
�Էc�b��z���;��#�w!�`��sqQ����D�ʪo�1G'��
�8N
�!�#Z��kuX9�z�Z��{���K�B����A�S���y�[�x݈�:��5ud]hA>�֋]
DN��g
:��C�GaoA:���N
:K�(g�Jm�5���b>��
�i��-m��P՝
U��|�Ǵ��
���U�����l';���c��WC�(
�<D�l��v�vڽ�Z���n��dm�����
�ѡPV�bU;�U��&�wܭu��Z��;�r��r�G*u6���P�S<B�+��������� �'����I��N���U��	��~��2\�\Fk��
�r��
+��Z皠�n�Z�6_+��T�[�J��U�^�b�Z-�8����U�ק�ty�������k�şVۓV
ɵ�׈`������z-wV���6z���k��u���F���X�vQ%ݧh��
-�N��T-�Β�'_>���N�z��M����=�~W��O���2��|�u{�7W� �� � ?w1Ԅ��Z��Y�����?T�}�40VE�q*

�����
zM
�f*7h��+;8WY�E�Y�y!�
�GsC�+-�)%�)��a��_�ڸŵ7�+x(��0fl�#Yi�k�͊P-
��%,@�=#��� ����^���+e�O���iJ�WZx�R#2�
Q���>�����_�
+h- Z�E%�Hy!�@$� 	�$�BТm����������N�!��Z��ҭ�͵
{������3��n�u;�֞vN�Z���!�~��>��Ͻ��`͊�O= �S��&��'�,V��
iw�� �$���uL�s�������0��^5���K>[R��)�G{Z
+6�g�-=��X�a�ڌ
+��pŸQ��
?|�mX��
��
+o�^��:"�Y�D��X��\�f�!��U<ຒ�����X�`�d?���|���lΞ���H�)�E�k�Ӱ:;�9:�rLh�)GCN�9u�����]���Q��-\ʰ�Q�j�IY��̡�T�P/
*IT�80��Tf�?گ>����8�b
팣E�5�yhV-�O�

j����
Q��`e�
�<�y
��[���v���&*�w
��_�4#2��]Y��&��H�4c�O�79��rZM;렂
��Ʊ��	�_3
��9�j���&c�6.�N�
�:�t�p�Q�����æ_/��'EY�QZ�'�
�̆wd%��["�G���+��
���?X�u ;i����&
}6��0�(�
�Ӱ�9
�lT4�
+a+,����ƕ(5�`1��h�(.z^��ɊLC2�iTVh�#��H��Ec�[L��y�B�~'���Z$[��s���8ܦIp�f���
+�b�L�a5e��X���X��0��QR�Bq�*�[`4����(0z�Od:�y���c���/"ɴfI�����J�G�=L+���s�����3���Y&Pa����0�J�R�
si:�K�0��PTf��̊��ʽЗ?]y��X���}"�z\�lo�T����Be��(����me-�r
��A/�{"�z`-���]c,�M���b{,��KQhO������|�+��U�A[Y��J�*WC]���[�:��l�1�p�YU�D��+~����g9��� ۀ}M���.�G}\��fN*Kq�C0TGB_
]�"hj�!�&y5*��P9�P:+��Z�lW3�
�tu�
W�H�=*�gDj�U�O!wIB�
�F���s�/Qw�Z��ǀ'Ɇ5�y���0�(�Ȑ_�{��8���C��A�G�L�	�V��;�V߈�� Vx��2oR�/#�{Z$y� ���H��D�G��qK�U��(���=�C�$	�s[�*�e^
�O�o*2}QH��GZ�"țR�ڔ�M*,o6`Y���UHj�"ѿK�[�'���?�����m$4�CB���$�!�s����;ڹ��'�Z�g��[#cR3���	Hi�@R�
$��bi�,i]�G[Xܪ���		;�u�
�Fl�
�1��1m�an�%�
�¼��"�EB̺1�q�}����~��ux��@��s
`�3]�9 �;�v<���Y�휋G:㱠3�;���ż�
-�������
!2x��Ø�����cf�0k��}6J���s��l���O�\�<�N�DI�d	�%s��"*���\���$�����1#d��SC-�ڊɡ=��}
��c�ӟ��1�K��mc�q��[���g���<؎U�`
�4��
�H�v��f�'`Z�
L���p
&� �4Ba�����{y�����,�0
�`=��z���
+�bc��'.���.��v7u7R�j��<x���d�����L{�}h?�o?�p�l�����
�
���3��`!�3��
����n����pHB������\�}�C~�F
� �3�0��G��y
��
+�����da
C���8�8��M�/�
�#<hFXH�L�0�����o�M�	/���s+���<�^f
�9�ZF��!��0�0�g�~���?lJ�2�Ǜф�m�����(/�Q
p������a�AF����
��{��|�gn��8�N�_��I�fs	g�&�EMN����8�/�%6I�f��
���s� �_e
����K������Y`�9�ϓ�ɗ�[�3�M?j8�b�NS�,돚�Ԝ��q-.#�
�²b���G�w��2�)�
��&���8�o�M�-^|�x~��w���ͺ��I����3��s���G��ԍ���M}�c_�����3�I�B>#%L-[J������pm�c�r�����6��0��%&^��J�����I$�"��|�H���L����8��x˥^ȩ�I 	�@����@ 	� �\*""^��b�2T@�W=j��>gm��t��]�3�6�v[�����N��vݦs����T��|�?D�~���;��K
�N�H�#�H3i#ϑm���%��1|�I�1��G,�C�����y�|G
���3��y~�g_2��)ѐ,�O��"Ưg�F����Cld���b���O��aj��W�L�� ��#��>��[_0���o�6��9�aOƒ	#5	&�$�dP/�:
jT�ι_������72~�w1�N.�~�v�p���:��k��ߤ��0ڍ>$���<x�0z�
��oD2�D|�Z|	
k�F	��5��Z�o`�&|B7���q�ܲ�� W�8�_�U��m��/��-V��
+WțO!��S
�\�Qs2s
fN��KƟ�/~�l�Q@�RfV�_�ǻ���e���}��Ǜ��N؃>��%����q��αRg�r��r��
a�ga�������oj�^ԓ2�4j������Z����}\��
�q�>���)t�vpg���p/�/^�_ğY�op�j�G�7�0������8����=]���O͙x�ԓ3��I�<�87+]J�j��bf�@�F�Rc�n�)����C���\�v
�
V��{�k�4���W��y�?
��C~9��wy�D��)�B�8�%3���/
D����Q���U��^���j���M��
]c:�u�t�=���'�y�e����&���I���-`�S<��m^i���:����?_���
���|px\L��މR윤B��=�Vt�8��ǃN�2t�T�9�%h�]�g}���w6�vc��>��
G����c���h�"���x^�Q��y����1��H���}^���
�Y�:9?�"�� 56�qj66Lub�TZ��GK�B<�kW�)h
Vub�]X1����e��G��;���Kf	?�6��I�:�����E1g
~��
s�7ڧ�mF���eV
+����5�f4�`Up>V�.���X6��!�QҌ%!�X
�5���0�<�_Eu�g��x���G|L�w��
+��d*g
>��
�I��ǚl���)X>�#��"B���T�GP����\,�S�Es�a�jTϭC��FT�mCyT�G
@Y�̋ �Q�o�
+O��}�����؂
ձ�!�|�u�
iKd�煕Q~X=u1���cQl2�jP
kDe�
qN̏�,�
��Q��⟠H�n�
(��D��
+�•�
�>��.S�L�
�>{H�h��%��kS'�F�$
$���Ơ\*C�4�	z�$d�(�OB܉�(L\�|�2�d�p�:��F��8�7`O�9I�a�0��x��'29g��I���i�gk譞>�'�B>e�`���H!�[��B��IF��lp&9�H*F^r%��K����)�)w"KyU�Ȣ��(S���`����n�:ظv`�`볎>V�G-}�+Ǣ$�
�t(#�R����#O�
+�J�
�٪\�Rݰ��#+���F���¤�QsD��yUd�� _Ad�� ��s����6x�����:�ْ�>�����(�}�T"O

+�:��X5)�h�ĄLm6����KaL�A�n�6�tۑ�?
���Hc�N�A�F?�V'�.�����w��/����Z�����d=���F�. V}0,�9�ԋa�+`ԧ!Ð��
+}����Bk\�q=�L�H5
��|Q�4@�A�4	"� F��'��Aj?�xK1�#�M
Q��2�����g��L�d�L3�a���

�Y�t�
+Z��L
ԙyH�!�RU�2�d�"9k����^���>d�{|~y�0���B�c�{?�wp$�(�^ �J��5�ř��i���� h�!Pۢ�f�"Ֆ
U��lR��H�qC�Sy�R���H�o�Ծ��s�G�Bl�$v��a�3�#�{/u�+9�Tq/𹼜��<����\z1:EP�yC����YH΋D�#

+�
rGd�
$:m�:�!q�A�E�k-b]
����g��|A
#�% �9�i�?��wQ{�"��>�9*V�K!G���%�=
�B$��A���

�;��y�� ��@TQ	��`NQ#"�7#�xŠO!��m�9B�
!�H@���+9�~/�;9�_
+4��s]�QQXW
�e�u eߑE�=�-����f Q�(̸ �`T
0q�8Q�U
bզ�A�lVMM�`L�6
{b�CRc4�h�������o���w��{
xm�c�b-��fJ�M
�`�P��W��`Ř��Ք�hSE�(�4\������l�dZ��R��[��_����yE�`��o�جloCk�i�Y�Χ6B��}�3�U�XO�|)�uF�(<�K�9]����$*0��r��?w��rS�%/C�y���{I�y�dȫ�W�{�̻$C�2�0M�icv�E�F����C	� ��������]o�Ǻ����*_���c��%N�Ӑ$O��,�L�[��f)��e�\,{�d����39�oɥ�.�����߸H�\�y`[���t� C��H�H okG�[��j�V'k�\��r�v����:Z��u�
�$��M�ℵ�D�
���\���C��-i�
�`�|91��]%�^&*����YH�h�r���U6/�֙

4>6����V��v��
+�dά<Ȇ3D��$��ͭl��J��a�b��WS�2��m�zAWڄ�f�_��0'��xn����i�]�'�
�)�vba'��l�uPC!d��|�R��[Y���p����
�1�5��6��v)��4�0���wI
w���v ��j�Q�:jXG

��.@�Z.�Z�}-����K��b�����na�14���,��tt���N_tb������\�K���K��3�4@
o�/u��a���h�j�!j�6p��EN�c��$\bq�'-%��r?�=	��k�g�Y,zA����&Z������@��q��.�I����X��4i�Á=9] l�i��x��3�o�'3���#MF{���-� ~FK.�w�uN �Đ��v>Q�@$M1p2 u��1(}��\�����4�׸�7qț|�m‘��3�}�l�d�� �I�ƿ�>_{
�
[4�Ү�)���y�W�P(]���%|
��[��6��]?�>��F���C��#�c6�1��q��F�./�l� ~
�`0��)`�
(�b��J��zآ���~d�|����i�s���Y�;}�/���\��p�e�d��Z�
���AwH�0���Ŵ��}��k1�˰_�}�������-��
�:��5���5�u�]�|g��u
N� �����|�OC���x���̹7T�}
�c�
��ضa{�.0��.�S���0��I�
����v͏�C8	�Zנ������"�ZI�J��a/`߈����"ih�~1���/Ƕ
�����\M��?�
�Ч<~���b*-��a8�k�7刦��NƠ��A�Bc")��}�gc� �f�cߪ���^��N�������*�ȎSD�2����P�-�T+�nK�K���_�������ϡ1�L���4ʓI�g
�#?��EhX�����
rc�;Y�v��O^��}�5��1%�;J�U���<�f
�ȋc��Q���?=�IBg~�E#�ih���4�S�N1�ehTh���oֱ�5���HUD���R�n�|O��FI���7�c]O�;�99(o4�ыկٓ���p�>�h���i�#:���cFg1v��՜\;���
ke��ҧ.���]�:6k	�8�q�W:Dy��{�+�e� ��Pvw9��]��
�Ƨ�im��Z�q��
G��i�V9�h�s�V8��s��\
+��e�J]�*�T��N���u���A�2�_T��=z6k�\F�����X�ᷔ��a�w��͆����SUn�Z�
�
=�̣����U�9R%���3E���i��I�
�
�*4,�\�J�hX�|���~C9>�5��f��Sv��Vf�s������p��N����_Fъp��uQ��������7N
:���s���<�y]Fin��*�KU��t��ei�_�f���,�e�
+X���m2�Wz�J:��w4#������^o�c��Z�ן��཭���R�$��x�(0 at s����]��}5'd�f�
Ӭ���
MVF�TCӕ
6[3�
+5=|���W���F�jJ�Q�F~��Q�59����6>���h
@
h;��3�bʹvK��|�� �]9�ʎ
UVd�2���1��fF
֌��=Vi�)�=MS�f)�k�Rb�5)�\c7+9�Z��h|�����qݚy�����}�;����`s�آ��#;�E�Xo��jz\���kj|M�V��*%~�&u���nS5��Q�r5.a��t_���7�W=�hTb�F&6jd�ѳ����m
�/��
u���T@T at S���2�
0
�]`H�䲨1�
`y� ^�K$�Zf*h�Y�)=�Zֶɶ�v�:��k%�ִܓ����������?>����y��}��}��˚���ƎL�
��}%q4�bb\9\�0�
�-�_E��U
����G$+7ª��\eGڔY��Q5ʌ��5�E���J��Tjl�,����5����?N����ܛE
r��a
#NJ
�+��	q��-z�
+��)?z�r������X͎1*#&U��,��*-ήԸjY��
�R)��JNإ���2%�Șx~��)S� '��F�N��m���[�q8���8�G��E9�^�2LT�a���J3D)Ր KB��	�JI,Pr�\%ͪ�iV���'4˸Q���2�ː��.���;�� ��?�^���b���9�1�1�A��a�a�V٦�0�Q��G����%#�d��ɔ$cR�f%�*1�D	ɏȐR���fř��E[*��|	w��)�<@75؇�
����~
��gא�2jSH�d����d�8�̓d4*�<S	�,�oIU\j�bS��6_�i��ި��u
+�nW���fZ�Vh�<��))}�#�`/�ߎ��2z��3��2�G)�)�NVb5Y]�`�R�u���͘���(Eg$(*3E���Y���e�9�F�Y�5#k�B��Qp��
+�>���<o)8��O
(�^`���y�R��̳�1��μ�gyĘJ�
�#���
oE�LQxN��r�437N3r�4=Ϫ��|��SP~���55�U���K�+8�)s>�yS~�N�C@�S�K��o���ޖt/��*z�XlȤ,bI&�X�P�,��cR4Q�E
+*����(M+N���T���V�)�
+M�-Ճ%�4��CJ�ɧ䔼K>�yC�6�&35‹���JzY��Q΅Zz-����X҉oya�+�>J�
�+
�)��5�
�I�0=h��D{�&�3�SV$��_V�q�Ojly����ʳ��<��˳�:8�e�
��,�\��~Zʹ�4\�S����H�l�2�y
1�����!�P�&�JO���ոJ?��
�HyU%ʳ*Uc���Qe�{�"��n�[�F�V�KիU��F.�w�Z����V�mh�Ƞ�F΅ǩ����zr at L���I�����1Z�(7�T�:B���(G�F�e遺
����:
;л��X�_�m�Qg?��ߎ�����I�~%g#��=R��b����|J��
c��ʥ�UÛйM�����\��\<�l�F
+�H�-4���9xp�!̖�bhpj+�ވ�V���Jx���m�
H25��?��F���5
�m
[m
�m�����%��E��%��fn��WS��,b5:��.�_B�冴��O;�o-�W��e�9�7�6q&m��OI�0|�3.O�
�o�v�
0�na�`��� .��6t�#|NA��������s4�5�{��|��w9>k�1��>$mI���g�iໝ�S�Q;�v���M
��G'��$]���0�P���`�C@�uQ�N
w
�����+

+}��|7���[ً���O
+�FwJ�]��#y�‘���PR
���������a�#>
eԥ�8�
��t����4v7����1�q�z
��j��iW|?�<g>-/҃�
+܏�W�O�
��1xN��A^�S�I�AN�$'g����R��,�Y��
���h��m���y���׵�u/`ͅ�3�5�
b
���%��Ұ��>�Z����
҅�\��Opn��!���p�8>c���"5�ec���,�ý�K��K�f+�ų�`�����ߐ������o���O�!|����
z�-�Kp��\uC�ѫ��
�7Rn�Wos�ܦ��Hv���;��;�
������PeP
h�fh��(�M����EyEև������b�7:󺮢g�����Kp>���5�HCax�$�q`�\,<���u}��[���rl��w�q�8�%�����̾F
^F)^Bg~I� A��gX�>�?�Y�u
��!�y�aM���Z�����
��`{!��`{9��)E
����h̏Q����h�;�:��.�i�o�f��p^��'Ѻ�7/}���J3�G�����~1�`�9U�~
YK
m�@k6Ӣ?�ڵzGOѺ��ѩ�l�S��$�8A�Q�n<
��r_
w�_pY�X�;�|�r�"𓈏4���-��"el�
+ֱ���c�	��X�:
V;�؎��t����^��
*ׅ����5��
h����
9���$���
�	V,�a߆};�plՐ�Z|��	�-�]�����ɳ|k������yF�;l�ݘ؀���m����@��a
n_�L �b � ��-��M�&k��k�^�5�SWU�v��6Ҥj�Ti�ViӤ�ݴn��U�NC�����}�>�}��}.Wy����%z�"Y/��_{�O�b>
+ۻ��3>wi���J>EO
OUE79��𓣛
}��!\��+�q�~��F�6��e�������;K
�0������"�W���ҽ����M�y���ޑ��`���H�R���sxx/Yڱ�8]����c�~9��X�ze

Tt����OҢ���Q�B|�������c��29w��
x�z�����8�-��R�L��Sγ�hqy��i'Ooi=�l�f�f1����s��
����c�`4�!F�?�јop4V��c�:��W�y,=��|��`oŔ>1
���D�`1*��u���`6Ǝ��jL�z��a"Ώ�n
��h�F�0�pC	L��Ò{��_����CI"����%�M��{�M���l���b�dK� ��II�%�LTc,Q�cI%�:0,�APڀ!i
�H;0 �E�l�dcds�I^Ew�Ut����m�DG����{+�3����
w��L��YfV
�3�7C;���1"�#���#)
��/ՆC����Гք�6t�w�`z?:�G�Ϙ��2�іy�Yw��z
^�ω?�9�B���
x��6`���u��Kl�fi�q�'�
��L)��
�(��R�‚@v9��N�g�Ѧ�U�G��ޜ!4�L���E4�?��-x�o���	�s�@���Ïy����<����m��6���6(dᜡgm�G�J��*�*%��������V�@n
�rјۊ��.���>
u��Q��D��\���,���
Nݿ��{x�m����t
�M���c[:�o���C
�x�hd�j2q@�F�V��
��
�Z'�
+ܨ-�Z�K�g�1TΡR��av�+(7~@�����N<�_&�-7p�%~�X��	�R� u
d��
�h,L�G��z}j�T�p�p
�2Ԣ�؄
+c;
E즣(3�@�y6�uX-/���>��K�%�"�Y�����=r�`�w���
�p�s���:���T
�:��&9�&*M�p�
a7�Qn.C�ŅRKl�m����$��iX�ga�]�������GQ��"��}op
�K�
c�m�*q�-�$�
RG7u�2V<�U�5
�
��
�Y��f��j-B�͆b[,�n�K}0�u��l��
���ۯ@g��Ǐ�u���W�9D�($^#�
/c������H0�u���G'}�c��1f����I(���خ�ٞ�݀"G	�
��W4��2 ]� 
+�&��ZB���w��|j�'���,r����<G��������^��q��q���i��j诲�H��9�08��w�Q��A�2��Umu5򫛐W�GnMԵǡ�=���
P�}�u����W>�P֊�&�E��&�.w��m�
��
l��i�&��I�X9���㡭�BS����
�5�u�v۠�T!���ӆ�^(F��p
+��Ho����"��!R�䳈�=�%��.p$[;��x���u��w��I�������E덂�99�r(���ݬ�«C�ׂL�
��:��|H�u!�7
y�I$�lB�r
Җ�Hl�I-_�Y�̷�۴���?7�7��s,� ����i��jڥ�Z
�Qn 
Y�8���H��!ů�ܟ�d�2��pA�ф�� ;!	� !����3�
����O��q
�F�_|�g��|���
Af�Y��㼓#��VA}�FK=J�}�	io{eD$�
+	B�
�
+�
+
D
��!L`���0���!J���{��e7�#b�
ɽ6ɼ0�X�a,L�|�q��zJ�]
PSSm$;���8D'!b8��
+��-,F�I>�

d0�� �1�y7ȹf����{��5�"�I
q�
[�\9	���N�����98��<j���%"j:��Ùn������}H�WdBLl!p���!C���m�8�݉]^|v�c�w��G�x����K�zb�����%\D	��~�" '$D߱	,��[L"8[.�	[d�_d�]d�]�-�
t�B���F�d� {�����,J�&�Dl�a,.s�IJZeN�HڶΜ�Al�\�D
+!�{����\�	T���/�
�"�
;�
��
�&� 
+
+AW���F�&�%I�Ab�q\�
����ZkԘ�U��$�K�xHjcb��X�N�Ԧ9�{��,�޷|�{�������


+# 9Y�e�����4Pl
���X��&p
�?(�^�{1�O`b#=iuH�h�2ë�ϵ�+&n9̠���H<6�&�&t4��
-
F-4�fP3�h&�M4�����u���b�C���ɗ:Kf
<�pd4K�Ͱ	�͒�V��6�~
+0������r����C}�eHn
�
N�s���B:@<@A�_Ơ��}G�{|�|�>�|���_%~
�/
.�)
._��\Z�!�,8
]�u'0���B (5
w�N��
�FO3��朜�>��d�P�g���<��Y
�]��qp���
8����{��N��
�!d�†�Թ�^Z��>\Ҥ���}j�Ct����r�t��\�\�ȯ�k������K����8D�??8{=�<��<����w��rx\��O�
��&5�y�� v����h�}���q�����-�
t=��!��� P
F�j0��ؔ��f�/���T�d���V�
[�=��v
�]�������K�u�_}��K�7�펝ץc��+� XA��S
����Z�Q
vg�+t�B����-��l�7�?c�k�n���c��g�����X����>Nth��o���+|�������+{n�*	��^�k踂�?��t\B�{l��u�m���29�wt�t��"w�7�1p
�����y�����G\Vx��塿ۏa�
+��]��x:�
�k	%�
�^��i op���tDoq�>!;�p�
(cv;���i��	�w��|��-�8�8,����~>^���rlWa���د�����@�Z�=ZA�X�f8Z��_m&:-D���`�k�wp~
>s������
�z�K?�"�'f)X��~�v�c��N^��F[4E��т�&tl�2����!'���*,4�2�"�^��q�6�Q{�r��ר���_\1�a�#b��P
G
cᨆc2��p���Ӝ���
�.E����(>���;�����F��v��f��|��¤��n��
���3�a#<�H�#�8��
�
+-F�"t<C},�\=�;�:�':�4��:�����S��p�Wh��������Ͼ�8��ֲm��;Vʛj�g�?&xlx���\�G�\t<�Q�T�S�Y��
^M�ӈ�T�5��M�!��m*�Sպ|��.�G�H;=�_:
����)DZ�H�������
�>��)��r�k�K��w�մ���Z�)�e��Z���T�m�j�����KU�}�*{lVEσ��F�]W��=�x���
���2���u�ndy>�у�����n����Oun�5�W�&��h�{�j�3T힫q
CU�1Bc=�U�9^�=����	�y.R��J�x�h���~K��m*�
*�qt<O3~
6�+W<Xma�`Z̕7/����L��Z/o��
�*o��z�j�w�ʽ���w��|�ԧP%>��S��>T�g���Y�B�*�ݨ|�V
�{Sy�+�����0w^����s�6�|���;��:rT�
+?O���j�_�J�#5�ߤb�*ꛪa}sT�w��+?�\C���o�������50h���v++��2��*3䞲B
��#����u
��
j��v��}��L��$7���T
��A*
2� (F����588C�B)7�P9!���_���)�
��t�2�1����RJ�q%�ڕ
���P
+x
�w�ۜC
�^_ ������
��IqD7��g�� C�"���De��(#<[���J��Ԉ
+�DNRR�l٣���Z�w�}L֘K�p(щCp��`�<�9���k6��d>��F�B��r�<�
�̨~J�2(-*F)Q�J��+):C�����
׀�r%���j���"�ǭ�ٴ]&��gzWq��2�
���}���6��1�d�Z�ʧyo":*�1
CБ�T������Cd3F*�'k\���T%��b.T��L��j���e�<�XK�b�*:ᨢ�����::��P+�������֣yé�Ԡ�

E�� r�f�.��S�_%Xe���l��)!Aq	Ɋ�f�h-Plb���)j��
�@��۶�`?�P���-^;�m�&�-�¸������z��8Z��2>�΁�kJJ%�<d��(� �-T1�(E�͊�������<�'�PX�XR�*4e�BRW(8u��R)0��ং�
�׉����ˣ苌�X���CK:J�7�8eS#vbbJwSt��"S��������v� Ey�a��f��]NE�1j��'�
KXuw=pD]P��h@���<�� [...]
+ˢs��h�o]!��l�0=r-,������R�e�����"�w���E9͊t&�d]���p�(��2dp�➮`w������"?�A��Ip]~�/�O�N�)�7��8OZ�5�,E�`�l"�$�\Fy�^3��$2O���d�5��T�'F��Dzz(���=, �g��B����5=�:����to9tq9�s�o���\�Y��{�\�W��m��!TWj����e(
U@!���C������r�x9��l�^��E�^^��Ǜ��MC75�"�k�C�OM�w%�U-a
�x����Ԁg#+���ޝ��H&r
���Q��ex�2��D��R��*��� �R�R>|�
`jK0��~�a||��}�X�z�f
��X��d/�,`0��o��JfJ�j��_5�����	����	�T��E��
+�WQ�%+ at 3��T.¤Vބ�;@_K�ڕ|VK���H�	���F�7�D`a��Lr��_hvȣ�<ȣ�<i���F�F6�w������h
�e
�s-��*
�*���1��2eX�I��3b3 I��s�m2<h~~�泙Ư�<Zȣ��pk{SFS�]��͖���5����e��ģ����*�Ro\9M�G-��mR��R�
�3���p�|�a����kG �A:@C|}��G�hcN��p[�E+�J���s������3�bƖ
��1�<OWb��
z����x

�o>���Q�"@�z�
cn^��N�VN�����$��)�I&��O���/\�T	�yp��ײ���
~
��
��h��
+x
�Nw�
8
^o�7h�:9Ϛ��Q�L3xm\� ��|�p�Z��+��>V�
4�X�9�np��
9�����
+�� �%p��b]7������9��E�|�F�k�.��=tq��ߣp_���	 ~ @�z�! 8�d�
+�%8�b&q�O����,���	�7�G���;��[�s}���F7�}
�#8� �>��oD�X�
�׏x�o��b����E�.!�}F
���'��W\�G��8�?#���}
+y
7{�//�x���8x����B�/��?���x��x��d!�]ʥ?��8
+��J
�q�q`��2ϓ�9�cʚ�v鷈�uX���i�<��^�^G����
~_�[��'22�8}@-��1/i��� ��z�]@�"b�#v9�1��:�:f�)d�̲�%�8
�)=�`��A��}`7x�#vL*%����x[f���E�A�>���N�lb��=��Ӊ�e��2��į�~�xV�a��v�];a�A-����63ڧam��F�n�f����:��i�y�Z
�G����1��c�W6�����!~>�g��b��E,C�
������%�F��3��QV
��
Xn��8ױ�wl=���>t�
��3�m�I����B�6�wh=�X�)p��1�b8�{�V�
��e5�����YЕ(�އq#�%��Y�/��>�`�ݍ.��F�(��$��
�p<
+G
+
68
��jȣZӴ�<�G��	���UJ�\	#��J��7�a�́{6h�^b{?�v�[�!�{8v������
+!J$�����D�
�@�2
�-D�ʂ�	�x�P���W���`��k�, at 9��G
�Y?�[�ԟ��0G�^��m���8r�К��.5~a��_\���0�A�
��O:�YT�	W*�N���.g���d
�m�$�VM�{Mn�+rޓ+����}�GXo|/������D�A]�U
�9fy�;kf��T�W���5-h�r�,�lSN�C��ݚ�;d�\�%��X�
��mh�#��aǕ~I�w���w��[��~
�8����:Z�ڲ��E�7*H��Fy�b�����=41��\���	�T�3f(�8NY�ɲGNWfd�2"+�
Y���&YM��j:.��,�/��>R�+�ц��hkk����nт�ҖQ�|�k�9T�(�ƛ�m�,S/�M���y�2̣d3[�n������\�F)%f��ĬШ���W#�^��w�h�

����8��ӂ�%m�h���Y��
y>��̠NSi���kTF��.���+�_���l#�
0
3� ΰ�l
+(0.�D4D�wq�;hc��9�&٬i�&VLlk��XS�i�&=i��Zcܲ��U�t��
��
�=�����}����kPq�QE!�
��0ԩ��,��+7l�F��SNx����1W�UJ3nU��K)��rF�7�r+%�.^��nr���n-d
��<Ffx<Bj��B'e1R�i�
+�A�7�)��
�M٦$e�Ҕi���QJ�,Sj�K)���~T�r%�7+)�)%��Dv�i%X���_J����"uw�w��&|m
#�2,�
�E�f�J�
�J�Q`�U�9@��a�0�f�(՜����1YrX
+4�R��؉J����ڨ�2��6�f�#k�+��;���+��˳[6����~v#��R���Gy����84R�^s�+�6T)�`9�aJ�F+�jS�-Yv[���_���dK��5�^��%��o�9�IE'��Ȥ��eE%}��$7�è���l�
+l�`��|n�K-<&�Fehek��V
���h��
�x�Iq�X��&�(6)G��"�$WȜ�����T$������N�;_T�����;�p�e���Nrn{ =N@�`!cp\��1��;�Y�d���T�9��0��P��,�3^�N��R��R(S�XE�NVxZ���(4}���?!C�g�	.ʐq�w�>����߂Y?=N���#�_<&0��ҧz����s�+&�OQA���1#RV�g&),3]�Y�
+�*հ�I2d�Pp�<�(0�C9��?�(8/���<39����A�M��֪��l�Ti&�Sy?����;�pM�gq�$*��r�kPHn����Ȑ����P`~���˿�̖�qHA�>+��#�C
*�B�
ܼg������9���G0���s%\*��(��E��Y�X�'bt��T���P%�b���_q�����q�-��OI��,W����Wҍ�1	%���g���حN�ՠ�:iV�4��x�
���i�|��U<}��/!㤀�A�+
Р2�|ˌ�)�h`y�����r�\�r�Y�X
+0�嘵r�CƠ�S�W��.j�B�����豉��4��/Ɩd�%���ӛ B�M�������
+��0wE�=�\
�.�BD.���"��c
'1!Mdb���6��1�;��-s8��K�pG`O+y
�
ɇK*�����a�@ȡ3$�x��
�\�
�\�5\t5\@5� ��!`u+�-M�_M;��"88Lu�m6{�������&P��
�\�����	�U
����jb�ib�h�[6ҋ�P� ���@/�D��G=������l�����y�C�2�����D��-�\X�:���`
+���X������X� �
G}��
��3�5ã9
p�5��X�ᲈ�XĢ.$��ml|��|��<���[\
+nm ��5��ʡ]�ֱ@!H]/Y�
��@�
&����
+�Vx�ҏVx�£���%����R�Z��q.|�j&�UL�+q4+�ZO�X�9Hf�F$�|�6K[� � ��w+�(����݋�����
�
<�����
d۹x���vzю��(���8�r�96����5�]@�:r��;zgA���K2>A�������b{����婋�t��}
����A=
�=
�=��u�h�
�$߽���V3u�"o%9Kɓ���FbvI9V���� ���#�=� u̐�ǜ�c at E�?e�
b(�E���a.�^z��
��C�U�>_��Z�>�QA�\�%!��Կ_p���5��5AG���y�1�~	���[�/�	
g����?�>�q��&8Ǣ�%�Yzq����]��9@��"g �5�7��<Ǽ�=f�
/΀w�9�Q|P���5�X������r���*���
��.�S�
�8��y����P

 ��q����
��-��M\�׸��p@�E~��
_�).�:
x�~B�>�G����"Q���U�mp�����A0�ҷ���x̯5��c�=��U����
�K��+<.�$���;�?�1?R�>@��k?���e�������x�
+^�?
ni 5�3|�5��ezqA#�_L�
+�^.��{�8
�3��w𗿂���8�#=�C=��:�n$�2�
��y
�?t�,���Y��?8��Vr�����E�r�?�أ��8�
G��:�rX���D���^��]M���2m���~��A�馲.�=
��ݠ���&�救GZ���q�+��YȑL�LV���8��D�D��RK�������X�%�_�"6�c�v�v'���i�P�6Դ��
� l _����+u��:�~��G-rE�.9
�Ϣ�B��1į �D�W��c���
Ğ�2� ���Y�N���y:
�߰Z_j%yWx�=�19��v�-����{�E'{�Cf�$��I�l��q��1���	�B�jrԑ��d�kL����7���6�`0`n&&`CbH '@B(�HB���[Fi.�K���@�%Y�e	(m�fi�6AZ�N]5mӺ}��m�6MӦM۪}ؤj�ڥ�4�G.S�	=z�?��y�9�9��『�w
f��
�8�����$7e�l�{�W��('ߡܿ�$x�q���Ö����8���	��1Ua�#��f<ߦg��3�q ;�������cX5�#Df��=�
��	��M��S��w)��h5�����졅p�$v1�i�L.x
+8K)gY�B�D�i���m��`���
��$���]v��>N�K<��n���'���2LY�%u	)tY��='�e��*�����\v/�<e�'O��7sKZ�ꄧK�{�lY��s���[Ȩv2���o�V�R�Z��
�˥���_��^�mOa�
�h������4���
��rx�܎\���j��Kmq�j�֦�iE㏪9ႚ��!����Ր� �
�
x��ږ����Y>�q~J�����	�M5�+ɢmI�ښ�Q{r�ڒ˵9%�M)aES՜USj�6���1m�"��Z�~D�
��XR(�j
?R��/�1~
+b����:m�:r�"8��+GS ����I�ږ��V�QQ�U��6��`(V��B�Z�7֫޸Qu�6�Mݪ5�R�i��3)�yNU�
+��V��UX>T��3S �����KH������'�bCط��E��ȓ&K�"�L�3�Tg�U�\�Z�_5���ZjUm�(h���ک��_��Q�gͪ,��m�Ub{S�����g;>S�#�{Lo��
&����Yg����{���(�C$;I!�Qk�,��ek�ͭ*[�*m媰W��^�2G�J
[���SI����3�9O� Q��sWޜ��������w�
�6�	�%��3���3�Icu�KZ~vl�F9�{��IW�3S�N�ʜ.���*��8'�"WH>�涩 �G�y���v?�<�U�<w�������+���\ޘr=1��Ht
ދ̳�[�p �3��h�
]H�Vr��|
!�)�*v[�sg���E��T��Y+�7"�w����*PN������(�"{�m�|�+��[֏e��� ��u
�
̲'����4�Gx���:�q�j2�#�%	�f(��,O�]y���-,���T._P9�z9�Z�(�i�JƕUrT֒K��_����L�_�\�O��
�g���|\
�e��-�#����m�'J�֓#�Ħ��䗥)�oR��*��)��+{i�l�3�4,kY营�_��}2Ú�2V�*C�ʨ�%�G|G�U��9�8�1�x�Y����:؁�fT���[�s
�Z�O��;�$G� [�YY���<Y>��ʬ����Q�5�`�
�Q�)-����[J��&���R��Vj0������vƟ^�Dw��;�X҃][�K>	�'������d�MSf�I��,kr@�
��ʨ�Vz(��P�RB=J
+)1<����G�C��
F%��-Ÿ*.����E8O#��wr'E�Xw3�n�y~i��jl���q0:�R��ި���F��
�()R��H��#��k�����/�� -�� �	�+`ތ���Y���tdw�������S<o�/u�(@||��Eܬ�Ÿ)Y)Q��4�(�%J!�r��$n�b%�Q�
� �ME��PԂZiF56� �c�
�yx�&F�)F��~�o���]̞���/
be�
�K�LR|'
m�	dI
4�^Ť��� �:0���'��)�~�M��v�[;~h���^r�c�6;A>N�����0��u�R�;���Hfb��M	���~f�/��w�
��_�ዾ�K�����ax���
���
e����"�'q�
!�a$
�|�:�x
�qb�M���G�#���a���{i�{�s��p�� �m�x
�A��Y�2`��͐���ѐb:
�	�}�0q8�k�]��A�(�n��bL4�n"�L���vLa�vL"�&i0��b�K4A<&��?åC)�{������1���ǎJ���w��
ցJ���9�>������c
;�c�ܘ������ɋ9.�
�?7Fҳ���B���_H�������x|
+�:;_ ���U�:G ;0�������\|��H��v,b�b
��,R�(2
$�y
{��8G^��~��;��?��o��س�Ei㗩���W��H*�_��%p
p
��Ǎ' 67��%�X�,�e
+�2�X&��8�ҫ��>_{���Ŵn���a�"�r܄���*�_��a�
�|n]������M�>�g�V�c�B~�P�W��
+I��ʊt�����9c/g�g�TW6\�ۏ�_ݛ�¸� �o�o=^I/�G��!�R6��\�{t��
Ɵ�6�%inmzK����4I�IKK�EZ.��E���\�1AA�Ƞ� �
�� ás��)�`�e2�q2&��s��ӝ�Y�iO����s~�/��<�������Yz�,��G���G��>ۇ��;�h
+{mf�5�*c?����,k�
���s�
5�����1#�ꋚ�
�b԰��> ���_�8?�@}^�Gn�x7��u6v�̀��/b at 2�(CAw6�ڦ�q-gҿ����������u7�g���8�?R<7�{�{B�G�e�E�R?.�������j���K��?�w�v�T����=:�u�ч踂��8��9,�C�%t���z
gz��@�{�཮kz
_����>���/�߈�M��_�p�귪һ�ܷt���ɜGG�8���qy�qa��6��W�qR���6��K��'H��z��
��0�v�]_�p|ܟ>��ݛ�����,�:��:���)��t
G�s��c8��8�#����8��Z��ܬ}�d/
��_�R@��m
!B��� #�_�y
\�����b�3�e�'�"֯�M�z���G<����S�q�������?_;���Wh���
���
+9�1��
%c��يP9��`-�	���ђ�o�c-��^,p9�=�R	���B�N<��Q�?��[92���t��d�n=L<��A��ȑ�]�Xe����\�h��E������x8z��'��m�H�2�G>
e��k=:
B��t5��J�R���=pt±�n����ѽ(\��S�ݰt�*�O��.r�����?��b�̘�C"�f��'���Q��~��m���m���I�G<�4�����v������PAo��� �ɠ�y�#�y�����n��s�mE��o
+����
�8�����,��� OU�B$�����P���]����*��,�����Od�_ 2��\�G�{?v�����X�-��s^tS�sd�+�\x
+�)��c�:����h�������_�P��
+~����/k$?�f�O��yF��>Oq�m��r��Ѻ�
!.s�Sc��>;\��䱧"���p᪇���pMd�pt�v����Z��f��^��w at d G�\��ȝ�� ���
+�-a4��u�AL&c�jHָA��9�ʂ�͞���*
P}LHu�ª
4Z5�����9���_'����`�K�0\RE�-U$Fp�+mw�����_�ղ����q���lI��&&c�qjHNQ8��:C�j�U���`b��+4$�JUI�
+$5ȗ4V���H�%o����U�q���O��xB��wU`��BSDE� �O��ƮG�� �m%�
#P1i����(��bP�ɨ!F��t��9�4y4�T*��R�j�����ܤbs�
+�
*H�W��5r[�)��\�ʱ\��zD�
���$#F���#ϯ�w泥��8�!7#kȍߚ�
+�Y��J-*���R�BK�
+�U�X�)�:Jn[�rm3�/T�}����R�c�����xG�i�3-»�����[���1n�Ō�s����JnFS'���R����*�U`��cO�۞�<{�r
%r9|�I
);�AY�㕙>MNg�ҝ+���*{�^�2^�5�M�l���
�����k����H��=S�l-~�@�
�F�����y2���4+�iS�ө̌\P���
+93�*=+�4L�={�l�]��< K�7���#��L�_�O�̔ z��vx75R�x�eXՅ|���v���ꤖz
P#����6(�e�3Ǣ��49\��#��L��*Y��e�k���.�{�L��ddHO��*�sLI�s�#>��|�o��
�#���c�`�;�3	mc��HrSCn|Ĥ����*� Y�|���vY<���TO��>�
+ke,�K)EmJ.����+�x�
��U\�Q���y
|�;�r���Ȼ
���� ��chiCG3#�t��2���7���^���R�L%V�J�e,u)� %�
VRYH	�2��*�ۡX��x�K^n"/����˴����2K��-p�g�]9�� ]m��	�
�jF_-CF2�֓b�$&�@��>��*-J�L����x_�b}^
�SH~��gC�� ��c�c
�~�c�U���E���p>4��q*=�N�s�����aXF�h����11��+)���`�b�

A� M
�h�P���i`��0MA
C��?��V��j�)x6����{�Lz�Ӑ����أ�VB�V7�q7
�������$�K%l\xa�0�
���t���\x
��
��
Ǹ�cB�Huh�c�C��걓z�CO�N0yy@�0���"�d��F\��1��R
��
��k�RivHM
dM4p��ġӄ�&��4���5Go�L�Lk�.K�hh�h
�k�\��ni)![�
�9�<tѓh��24����2��<��ù����.�ˍ(���ϐ��D
QA��`�	1�X<�i�1QH̡�
3&��Ĥi�f�vjb�N�1I�4c:�Iu��-lgZ'�<.����y��}��{�C<Vrc`k*c��.�rɗ��rQL.����i&�ԣM�<H���"
�\�ٜK
|b��ӣpoA2Mk��:���
�f[|v1���TR�&Nۉ$_
.CXL.q�W3U1U��JtQI.*9<�ԣ�VT ]�`�
�0�c�0͗1�����#�Z�	��2��hB� �x���D�*x�X 9S=q,'��ı�8�I
M��\�r�j�G-�e3�Z�$�s	F�!�a�
���V�_s3u@�5�� �7S��wv�d���p�)��
�
�8�F#�[#g�]4r�8�
$���7�	aj�aT�0կ�����&(���/��\�$^
�����?h��A���F>�<�� �h#;�?�;: ��6�����
�+X���y�#�t��p��
��30hs�1
���;��� 9��tG7��&�4�nrх���U]Gy�,�A����U���Epܳ���:^J�<�a�<2h6� �ƺ	�����gG��I '�M/u�E�賏F�G.�Y�
'�ṿ�����;
�1p�a0�p����{�Lߐ	{%�W@�Ca�!W��қ��O
�
c
*��r1@��� �_R����qpf��
L�tL��R��l`���u����t�
^ o$6hV�Ӑq�
�-��8.sf�p��>�rF�qخR�+�_W.0Y��
āt0R��οgj��s�;���������pH���}�A��#�
G�G�s�"^�@�� ������a��G�>|��T�p
��!X��4�T
|�p��Ʋ~k��g8��8�K8���G����<����
N�]<�E��D4 ��(�y}��Y���Z��Y��;b�6�� �ԮO���}�<�
+��n�-���qS���M�8��z
{���S�x�8Nk{�M)�(�3H�4�z�~=���1p
�p;��T���_+�}Xኁ'	�,�?u��
+��q�@>z�S'�u��/��
>�z��:=E;�

�N*ңn�<�7��U�#��`�
:�.�
�_�OR���ܠԍp���/���h=�k�!G��!�^7���Y����J�g��z\��h�����Dt�*��bn���
6���^
��489x,�؋�h2� G���
��M>:p��6��N
�v4����#ԥY
��E�f��U��R��0��we ����
�m���X��u���8#�
��t��e����D��
�t��2�!�U�e�/�Z"\B.j��(f��mV�]����O{�

j���ȭ7��\���~��t�� �\�χc
�9��)���2x�Y�ŮC-�Z@�泳R\	�,F}������9�(�48ĵ��5��x��W�:E�iU
5YJϨ�.&�j�$�
+���n1
�Bx��S����(fYj�C(�����i>'{��og������G;k�}+�l$n9�C�5���r��xx��K<��s�G��Ή��x*�j�]�r���~"}�nwUL%o� Nq�
O�*c
}��e;W�&�YC��%/��
P8�f�fc_1�)
���	k.\�p��� ��ṕg�����t���SO�Y:����o'��`��Q:9 -x��w3Ӑ���Q�z��>;\�p%�'/\�p
�k4\5�h�r��#{#PN.
+
�i��dgqe�d�����Y������1 at 3��z�MaL$?���
r2�
�C�&�X5>ȡ1A.�%jTP�FgiD�
�a!w+'t��C��V���:��7)5�C)�O(��
�1|!O�w�D�t
�.���X�m�)��1���PAN��O!��ǁ紆*�dT^�U��r
.eGx�����
�G�RZ�y�S�b��dS�<��J07*�����
��/)�|Q1���{�Z|z��x���-��k~�k��撧��f2�KmF�•i1)�
�Ts���8%���dɐ�2\	����(�Z(��L��%rF5(��.��춗e�]_�[����}��vƭ�I�����m3��l�4
�Lb
���
�	R�� �͢�(��b�%�e�*֖�[����m�%��TvG�l���F��òD�(S������/��t�N��𳛱��A
���4�8�6S��42��dS�w��F�8�r:
��v��,�3��木������Hf��\���R��W��~���M>��d�{�����<
=�Z�Q1��]!��2�Y��Q�,j�LN\�r�,���r���Ni��
�9~�L�SeL��Ȅ*W*,q�B=�9� �
+N��UH�O]p�w�L��,�X�ߕ|VLl���)�f
9�#'��CN��PEyL�xl2{�2y�eLJUD�0��(<e�BSf+ĻPA^
�����2�z6����$�����;�݊%k��� K=+��
NǦ���
G,�h6��GN
١���f��u�u}����-��m
�r��
-h
��Q`
�r��*�1n� �"ʘ�TT��W 1��h���
���۹�-s�n1N��M�O̘ۗ����������{��sE���H\��Gʐ��i(�
��P��,;V�e��
Yb /9
o��
C?��p6YMw̕��8Gm�7�;b��k�R�'��џ~z�I�ѩ�Y�i���i�?Ҿ;R�)�KZ�f���̰ef�2ݧ�Qj(5O���Y6�l�[�_�s���A^��-�//}>�-U3�Ui0��v�|:ɮL��1v�
+ͥB+�t��r�)��D]᥊y��
+ݸ�~0)\�*��ָɽ�û{��Xfm�հ����2��V��|�ߵ�=rů�Ĕ�T��M�T�۩��jE�Z��
W��j�^v�q��q�*�B�˄ΆKZ�[µo�5�c[��_�U�`�8,���G�� ��bK�^2ٓ:��hh�5�i|1�/j�Z�V<ji�V k�P��V�bi�l��lZ��sBcCMk
���U;.���n��X�G���j>XA>��ך��_���,N�7Ѧ
_\���[=_�i�u�`�x��D�@�yy��_�2%ʹ��x�
>r��؏{�Թr��`j�f>��+�T�e$9
`c���U:�
I
~�%���
�ٱ�/袁/��h��
_��s�)q��q��l��������� K�3[�j��
����M��L_�>���7\;ֲc��4��Q�kTT�((k�x��[��w
+�ሕ������Kk4��U��@���{.�J�1P╢
4�
�ŗqE��` �Ǝ���U�n�\���ɼE���i�]l����'$��{.�y����ǵ��1�Ja}���
�
�!����Ϛ�:mfG3m4�I3]4�E35q^��
'��$�;��i츎[�u�
�r@
+1�T��<ȸѹm�	��a���-��߉MKvǀz���(j-|�BL�9���~���3�p.�Q3
xԭ�G�n�߶d���N�;�|ܛ�}��6��'Ѷ$��3'�qR�<%&�4�S|qJ~�DzR�>���ދ�x/�9���f �|�ʸ'y��j=	
k�âٱ
]��0���!,�
�ڣp~����ӳ�q�0rN�<����Q��ٗc�;�ޥ��`|��<�\�����^�\e>����P��F<?W��O�cq|��x�
����i�o��r�M��_�a�{�	�u|	��=��&R��K���忚��6�����W$�dv��}������*�1?��X߶��i�{�#_��\��Y��3Nmc}�
���6�>��|d������)�]��;��_��_����
/����9�Գ
+�3���%�Ol�OI�'	�<!=��1�9��G�c���&�}/��>�3d,��mB��=�E;��bW8{�;�
+�,g_���^��U��*Ilt�B��t���l��	�x��������(����
�$�/����g����� �:{��'�iv��6�l`�����
g��v�;�����8hûC��������Q��O�)�͠s�'���I�=�.�
\�x�������
����
��)����9��)#+����y�J
���9���ۉ�xs'5��ۆ�
T�x>)�3�tSI���/
WB�)t~���-�v���k��~��ƻ�Fv��NZ��������M���s�Ep]��z>�Dk;��d�����dI8�,y�b�
i�|
EN
���b��W�V��f{�c��r�Vրco��5�(������X�e1/����s�SG	j+�G��Y�v������ꎣ7�b
%8�pTȊ*J��3�L<s�,r��X��y<3�/.��:j�M���o&�
8c$|(K�UV���u�#�%n�4���xzȂ�8�(�eY��O�L��f�d�'g��t��*jm�L��c�*R����o��	�]�;
+7i����]��Ɩ�q�Q�,�.n��/WO<}�
�S���2�c;�:q��&yb"
'�D5}V�d%Վ�=c(�B�U�����r��բ�����Ξ
F�5��T���2g�{��̞���@�%��
W9�*\�p��5�'��"�-�e]w�H�e��
�ϡ5N��k�Z�>�JY�–�ٲ�_h9��
+uk�<���q쨔+c��v��0��
�j
�k*�z�/jW�PY2����@�8~�R���5�3~ަ�

n�0^i���5Ə%F�9F�|2�fƥe��ƙ�W���~�5����U��b�S� ��'��RYo9Z��Rm
U��N���uo���ֺ��{={V
1��I=�L3�N���9)1�k���%��ҩ �����Q�2$���(�"�t
�ӦGQ��(L_=�7E���(�8��#/�|$2ގD��#�U��y��l�u�j��6��EW�m���lq�b}'6�t2"�s
����D��D���E]zG�.�Q�uX��::zdVEAfm�g]yY�#��1r���H�d�����|���8���Z���
#���_��y�)N��RlF��0�)N�EQnf��΍��yQ��3��F^��H�F�����;9rr�"��������L�.�Ñ�8��#-�*|��ָ
ߍV�k�Z;'}�^k�\ʖ9[C����k�(�)��=;EaAz�%�p�Fn���IAq���2�������Id"���AB�(�7Q\� �!	b���)D1��Q5
mQ㫚�ؾ����UZ�E�
JI'���n���[��z�^k�{���9{����w)�ʢ�c
a��eZ�2��R�[Xh�	s��q�����$z}&f��D�
U�Y�������[S�F���8� 0�*�\�L8������V[F�8�k'OaU�OX�
�u��s3�qahuaq��u�1v��te�u9�2_�<��;�}G2
��KB��#�� �&`T�q�&��I%�Yw���4v�6���NX�9
+
7ga�V^h�a,��ӽ)C"��G��`C��������A��N
�yb*��c�4Z�̲IhW�G��V
�L�gMb�g�Xޅ8
|�DIQ��Nh<)O���z�D�D�F(��73��@t�i��iN�i6���3OLf�1�;��CuI�م�Q��|��{
b	_��?Z�j`&�ޱ.v?._�Ə
�������ς��(3��8��яWҗ�>Tz.��?�����.��7�i<�
�%�oD,!`R�8��\�)����`.� .�j�ȥHB�@H
�1�%�폎�@T��
Xb��/&f:���.c�K4�#1�wsb��=�8|��L��f�Җ���xxC��Cx�t������	�$2N��(��mt
�5&j0�T?�Cp�mG2�a���E�
h
�9K(�U/0q&{���@�Ak ���
X�
=������	=���Y�&zfͺ
�u��Э�>H�V��^iPfPwމ��Ћ������������������lxH9,4�ٲ�5���f`�
,�x�8�08�!�q�M٠)]I���
l���"�1 [...]
���>[3�F�5�b(
�A�b${��i�z��з9�&� l^}�p"F;b2!�{as�E���
+D&�x�#�8j$,by�b!p,d�L�Y���]ّ!1���C�H�l�p��
��������\q
 .�������U%N�LH��-R��dch���
+�^��@�D����3Hv�gx�q�|�D�p��*�жhc��H� u�}��6�
�7j�ʌ�
+?R�#�3I�3<�� �P��S�,�>����� ؞�E�q�����\��=�-�R'6���;��9IA���zɆٜI6�|XdA�,@��W��־+Y?��[�ړ�C
�iB�F-����(�ӊ	�-A[(�
�����o�q@ j�	��ȡ^s8�
j$,A�E$�h�~?�Xhڊ����>�ǁ�-��•a�0|�!�St�+�R)5�D�@*zm�ah�C�F��nl�V7q�m�͐p�n�y�Qњ+�{��O�#Ok	��R�>����5y�]��Nb��s�0
�;P�^84~��E���J�c�
�i<r�g.��	�8��`�r���E	Kkےv��
�h��]\˹{��������W��*U�ר�
��n��z�6j�4�Y��Z��l۾CTtL��q�]�&t�ѳwb������������
M
�6bT��1cǍ�0qR��)S��e��YΞ3o��E9��|���e��X�z�ڿ��|��M��l�b��]��|�����?p�Б��rO�<u曳ߞ��� [...]
H��̿ DH�I:�A���D�0$I
�%�Ab��b$XdH02%��1M��d.�,��|$1Y(�$*����V	�N��RB�Obsp�KtNKx��
�� tEBtCbt�
H�~�0=�/HNL�.��\�}�y�

+� �)��.doF�X�^�Kh4ff��``i%Q ���JفDiG��:��
�"$`(�,�B`
\z
�B`�%��,%*)6�kB�^�I��
J�6j�����L������,�x�r�EVˆ��X��k	8QH
+�$Y�&y�(��ꕫ$��uҽy���ܽ{����!y?z���ߟ����������UQEUTQEUTQEUTQ��!�`�y�
�����bQEU����o����n��b��}S�V\+����e�:<=�c�o���*����oW���gֈ	�����W���G&��;��D�›&
N8:<�͂[��ߝ9�qt���O�	����
*Ʈ�*��Gr��~���\�13��Ǧ̏�.�K?j�a��`[ᖰ��=7%��¶�
+st�P"M8<�[^�R�6��+;
�k�
��k
��ke�U	�	�lY�j�9e�Ks��b"<��.��RE�?��<wx����c�c�e�0e�;����Q���_�/��j�n+;���P��|V��lLu��`�]�:kfp]�
V��"���C�]�C�b
w�Ê
��Qr�[�+� ,|j�w:����e�Un�3c����+:|�a톣�<5aUE��"Wv�M�qФ���>���l�)���%d�t�U��[�PY����#��Wq���€rF�t�Gz]����(9dj_8�`���]���భ�K�J7H��K�ws����ؗ1TT�..�(r�ۮ�����ѵ}
�4f�>�z��{�ϟ�ࣵ�L�A�����ϻsƌzf�zkfL��(�ք���C�
~�h?�j�}�CJ��3��E�%�/c_TV��J�*�p��T�_���xE���y\���_�^H�ڨ;Wi����
Y�A�"�ҭ[���l�!�I�v��^يR�9�$�V�d2���nq�y>��=/�����<�y�;�s�����+N��w	$�
ӟ��mWy0����\�*c���<0gל�uN��@�B����!���
���+��
G[Y��u�?R�
|�^��rr���H��/�
坑�������,�~$���K�]�Kn�`����l����=�Z�5�[7�q|g�Unr���"~��F�8�ߛ-cY����
đ\ೖ-K1�Es��� �)�`[����<pb !zٔ�������z�{t��@�E^�~˷Je}yU����-�#iږy��k��p��?���0Z/����j���,�bh��}��F�u���D��R�����%�H���2 ��
����� �v &� � �e��u	�Y�N N"�{B��^��{~ݾ�V
���>�>��zy�H�����]P�F(볫�ܤ;�dq��F��V	�Lk-��z�PߔJ��K{�w�W�y~��P�'C8�d,ߴ.����
�
�:���J�@7
�d�z�qF�@���`
�V�"��
 6X��  �#����#�
��	Z������e�W Ŕ����ԃ��N~�a�~�qfu��#E".�l�йy.�?Xϊ�
��;��m�
HK�=�`(tu4�G!g��n� ��_��:�� ^!��B@�� zh�C�L Z8�l�$@��
+��+ <j�e 2<�QQSS}?�4i�ǀ����(;�jv�,����_X��?�j�_�Xr)z��XK=A��T�h����0�B~[�)��ܦ�����bU�q OՆ��
Fv�
�S�����@���g��6��_8��1 �>� 
@
�e ��!� O� �����Ax
�C�8���~ⷎNs]=�/��I���֣�3ѡ��M*{q6l�j�K~!}
9Y�����m!���!��_�
7�Hl�ް�(��Qp�p��j�`�0G��Xs,D� `+�� ��
�/x�G �F�
@� ҚSШ
+�s�=�t��##URuM�T��������?|�����zq+[:����s����M�n�ִ�������䂹3���3�o�\P��7.��B ��<�L
0
+� wz B��F�1��2
+�Ȇ�� �DG�r�
<�6� X��`3
+���83�|6
�~!�]{=i���5�$��>�*�OE�t�O������1����o��,N�4����GO\ٞ~��pc݌
)��G�R��0X�
��
QA�l�(f�4�� ��M<�Aoc0 n�`��� ��"��0E��>���)h�@<׹L
"]�N��JY���s����
r�,�'��%����hݹv
+��� ݆/�U�)�
��|���J��n��P��W��
+�x ������k��F�E�Q��`0|�=t�[�
1x}� 
f�p��c3��A&��� �ŽpJ�� �~
��7%�1
�����,۰�PRN�D�,^�H�U
0u�����f>���
��7웻ñ]zQ��ZV�����q��6
S�
��d` �0��XA#����G�V�J�[�(���9
+R�
��WvH� o�^0�x�3�
 bx
+p`+gQ��(^���1�����ױ���>���9��ږ�騬��*�^���x���#qb ,Y2aHwc�VM�O�b�/f=-��ȁ/}	��-�
��`=���瀾�}��k��)���
+���4���`"��
C �!�)�p3 : �m� �u�@�X oQ�v� �����n�gn3����
��w
:s��+
*�����q���BV-
������M$Nre�O{�} v� �R`��
�8�3J�yM�O�4�)X� �ZG�y��Q�j{�<E�T ��I���v\�5�Y �8�F�a
���j5
�X���+�~6���yB���UX�D����C����j��*+�j�߯
�X��9�q�x;�aV�,�;�`g�\��L�Z����[�� �6�
zx�GP��k0���
ܢ���@+8MA\��Z ��T�����g����P ⚖ (�U Ͼ?�4
�;���Ic@�����S�l|Q�gV�e����O��H\����GI���s���}-:�l޸�-�P���
4T/�數H���1e
�N1��@
+���^�Sp��|�v:Q � h	 Z��1
+��VKȘ� �1�>DM
{��_�Y
����̸�Ӻ�|)�we��Uef�ᨈ�����.A�]��]��dci��I~\w���<����
8�/�t��
�P���g�+ ��e
>*7E`S# �
��3\�G��HpχH �n
aKS[��K
5�u�k;�mɶc���V�ރ	iE�HD������_+�߾U\�'�9GVXJ¬���9M�<~̨���փ �I+���q���ij�L9%��A�
��0p��cF"((�`�77 Q����#�' q��� h[:�-H,�n#*Z_YXO�
+=�V�y�!�p������
�LY���zY*K;�x2��}{"w��7�e�r
��"Iw�:G�S
y�\�V[�<�6'R��չ
n%�:溬'5�m���Dtb�Z����L\�&$
+��ܾ��~v���ן{��}߻�����<%E��&�g������IN�
��DH�J��
"�NƄdD�]�	Q�!�c�@
+�d	*��>7
�8P�W%

 \� h�`3�^l:�9�3��
c<��xWo67��!����ʺ���[�ЈZ��I���4�z{z?c�vT�g���C	|ޮ���X�.�qDh\�1�y�X��C>�M|; ��egA��� ��:܂�8XJ�[7X�I�|0|�����N�7
�����w[{�Ekv��c�JȬ�����i%J-��Q�#�u��|FB���ѵ�<~�ԠV�T�w<k�F�K�};�#9a�X!���ЭѨP5w�8G��ĥ�eb��5�@�
+ݡP�
+�`(d�B�
G $��8������&��{j?��S���
�p䴥��W5z��N�K6�
�V��i�|Q�Ah
����4�ݪ��(����d*��i��sZdD(k}P` ͏��Gg��墂t���5R�LT�c��+ʻ�#��
!� �
1M��e�+����ƅ
��xoBj�0�ǻ�8���O�U��N�������☤�"ţ���>�|���_�JvV��{J,�͓ɯ)��l/`�
���R|Vx��fm�
��96���pL1c����3Y0��ߜ,��/���N��P�[@��Q�t�+eK�T�e�9ۏ-p�
+�
Ȯ|BpW����$�
��%IH�O޿y���:�~0?_(g��D��,�rE}K�
cШ+)�J_*=��I,�?!�
4�
l=Å�[�P�ծ�=�Ğ�	[������ �}g���
OZO$o�!xL��=�5�dbBC��)		�O�մ�>�R�I�r�\���r"#;�@V�2[��k������c��lz��i5a#*�X�m�?�;�6�2.�#�:ĉ֙Li���������_ �8L+
endstream
endobj
96 0 obj
<</Intent 112 0 R/Name(Layer 1)/Type/OCG/Usage 113 0 R>>
endobj
112 0 obj
[/View/Design]
endobj
113 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
95 0 obj
<</BaseFont/XPLHSB+Consolas-Bold/Encoding/WinAnsiEncoding/FirstChar 32/FontDescriptor 114 0 R/LastChar 116/Subtype/TrueType/Type/Font/Widths[550 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 550 0 550 0 550 550 550 0 550 0 0 550 0 550 550 550 0 0 550 550]>>
endobj
114 0 obj
<</Ascent 952/CapHeight 638/Descent -240/Flags 34/FontBBox[-133 -240 630 952]/FontFamily(Consolas)/FontFile2 115 0 R/FontName/XPLHSB+Consolas-Bold/FontStretch/Normal/FontWeight 700/ItalicAngle 0/StemV 124/Type/FontDescriptor/XHeight 496>>
endobj
115 0 obj
<</Filter/FlateDecode/Length 8457/Length1 17110>>stream
+H�ԖyxM����;�$11��9�
+-j�Ɣ����"�� ��P��KʭYiͥ�)��sc�5��T�K�J
�9��9���>Ͻ��}���^{}k}{�k����E"aC�V�*T���A���8O���J�LO9K,`���;�S���r��
ګ���j@�@�2Q�ak�����Aբ�'�D�^JF�$
�g������.ٯ4��jybL�o���bƆ�Dz˧��/���O��V}\|�7��S��,lF/�;���u��q�
��H6�,"�M���;�a6�
-ڙ&��L������n":�ϭ:�c{Q+�Wq_�|���I |$�[1xk^
�q���OKC��DHWY�ZҚ���	����n
$�%}���h��X�/q��.򥬓

��0t�>�� +�!��tN�Bn�A^��[�GD!FE1��1Ғc����9��H�G���'>�L�$L�L�4L�'�����afc�b
�q0�Ks}J�<*�=�"

0_�[��X��H�z|��؃t��~��w
�~�C��Gx̉�E�K's��t��҉u�X֣
z�VY-e���n�&���e��IOمe����f�!=$Uvr ��]�@ � 
W�!����7�d��
�e�ta
c��8�#ُѲR�
+��*!��o�#���C,�>�)��-[�=[��a��Ә��Y�b�F���8�.)*�\��巕�
���}l�h[d;j�0Aƴ���fn3�Y�
0
fi��Yˬc64��Q�d3%�?�`�#�t`y�8|
�
y
E
�r�&�PGd������XU��X�Y�J!ٯY�z�&hֱ�u�m���oL
H
��Y��Bf1�tg��͚`&��x%k
G�Y#4+5+]O]�ܹ��,gg������}�=�>������]���2�d]
��C�3�d&�Ӫ��3�f�el�H��2�eL���&��O�i/�K�\���������{t�#�ZFm#�hhhF�����ht�+
�R�o�[���?m�u�tV��P�5Vw�q�lf�tdS��j-��+�9E��^FIO�K�,��P�u�vy�y%uz�H�G*��;�}�]e
z�O,��c$z��`��`�a��u�� �M�te�E��ʄ�J�
J��d-.)
��`�U�j	|��X�7���X�rX������
+��`
�cj`3jb
j!
U��b;jc�`'�b�a�:�+4�>��h��h�Ch��� G�LWqs
�1��q�·h�h�Sh��h���g���=:�
�!ݑ�\�(�p\C$�#?�n�7~A�Bn"������0O�O1�0��C��a��G��h$����N_�Ei,E�#������B�^uP
��Y��r��
+��*��:~˩��,��38���3��l��\��|.��\�E�����K��eL�Z~ã<������
��M��-L�6n���.��{��{��x��y�_�O�$O���GD �ߊ��I�.9$�d���Kr3����K��+��k���y���&o�6��.��>�W>�#���|§|������|�_
+HA�\a)��-&oH�S�!%�����򦔑 )+��-y[�K�(�H%�,5��T�*R]jȻR[�H}i �RO��{�P�H#�+4JU
�C��p#(��d����a�+ќ�{�	��;�p�� |�m՝�^#I,F�_W�j̤?kh�q��ئnد��\��&
�ؿb�s跋~��n(��\A���+�n>]>�3�+�Ǟ:{��]�5�{W�q����^� �]��<�{0������מdO���5w�2�.�^+D=�_=7�_x6I
���H�$7�f�I6W]�D)7�ͻ�Z3O�
��׈du�
+�A�Re�`�����w��ӕ8)�t�R¢����d���"�m��
�S�c���x�O�pH�p_+,l��n��ЁWj6�s�������=
|���J��J��ʼ�:��^�Oi���W�7��w���V�S���"�
q���)o_��t	�t}�ճ
��Y��u��d=%G�2~
�+g�T�	����>2]��)ig�Vӕ8���^�V�^KT���Y��F���6
�g�in�,
�b�����u��R��/�N(o-e^��3�窽�삎����������uܖ~�T��r^�1m�g�}�ml
g��s΋��O�@	��>��I1�쎰�Ɛ”NtJ�&M*:)M�d�iڴ�Ӵuڧ�&�f��M�,_��SUiUS��ӼJk�Fi{޻3����Xg�}~ϟ���>w�㌾od�0�����r�O��=C�ϖ��)��!ǞQ?�Y�=�N�
W�l��Q֝�St����a�?�3��xCҎ������H�,]�k���F�v�*�1�~܀E
�a����P���]P�AX�3sԸ7�q��(N�]�y��*>�_���׾���s�vlvf:=���#OON��ǒj"
;�DG�<5<tpp������U7�}M�Z�P�q�*�{�FaԮ�dF�r��d2>��h� ��P	��n*e
1i���'��TLIe[
��h�T"�;	"�\Z���D�h�X1�6� <@�B�!���DqFRi��r^�$�^�튓����
\nX�aE[�j��bc����x��m)V��t*��	1�

�
[�
�Ö��|FW�B���բ�2��E����(��<���7B�H���{? !/�v�Pi������
0�
D���yR��n$k!���	bK�v��_^#�
<��B!�˕����kiͤ%� �#�+�S.�87ʜ�c��V�l�gH��J�Xי� ][�:�!���
����Bn��g��$�0�6�Q%
%kŪ��@>�� VX��"����L $V���P��hm��L�Ң]j��%��L�t��"im�m�W8 ���#�����8EV���Iڔ�?OJ����Ӊ���*���ۅ�

-��	�0��vJ'�:� R~Hl�� YEc#��ET�],	��e>
g,����Ő
2?_�h�T��
� �}2������̡6I]J�pp��
+�A����ɱ\X����s����pr����*$��$�,�@)S���ڨ��
�L�iF��.��E����<kE�84`2"�kj�c�M�?�N��R�I&g��2�
"	�Dl�S�+}�\&a��d�H���g�[k
����W���0�AR�y2����k���
�ʇ&��l��
O�@��tA��g�
!��ϥ�LL/4OېR
�c(!1�Y��iȋ
+Bk�f �+bd`�2�Q�ș�P�8�l&��@�ː_�����js^_�gtv������QD92Z������R��I��Q�GM��pt�� 9l �3�t��Dl�!�LJŭ�Y-tG,�!�y��i�2��"<rc�x����tLc��p*�Cϖ
�H�V��J�H$

֋����@
�5 �N��T[э^('�Pv�f��6���>�k
L8��%�W	���DD a3�L��
+<�`�2dۆr3��� u�&���&/_�h1
��=.Z�	�bkw';�a�����%K ��<�w��R�� +�|����Do23�"�&/�XaN�
���p*
���wB���l@�-�L��"��������O��ЎOG;aw֘H܀�Fz�I���t�;�D=��;=��`������z!�
x��Ip[��5
+�Py��/���x��� 'BXS6�� ګ��e�
���:X����(�y7Z�	%�P�]�^	w�[�W6o{��Jo�z��7�5���
q��w��@'GH_o������?0�1ڶ�a??�y��kI�
��^J��F���o�d���7������`������?����ه�o���E��:����3���c��W�� ���6� �깭�?٪Q3�A߁s?�]khp�"����H��W���VCC��G܌dA朼,����:7�4
+D����(D
����
CĽ�X&z�E%������C-��vJ��\�;�X~�����j���A�i��������j;t����=G��~>�z�������wG��R����oh}�����9��PK�=���^9r����f`�`���	��.n���is"�Κ�Y'�=�9ZA��/k�XཱུEܳ�B�� �u�7C�|��|"2�q2��?�A�v�����ɲu�Qn��9��ٳ7^
;r��gs�F_;�85Ѳ�ȩ�46�[�6ƾu��s��>]'���uN��L�NG*�~t�ɭl:@Bm�Y����Q��Y���O�Շ��l���<��*��c/Y�Yp�ﲒ�R{��0D�k펐���`ݎCM
f�m��7�&W����h��,t�.�%�
ϝzcu�>�S��ϸ��=S$~Rm�o���W툽���x���o(#�p�K����c+��DԸ]G��S�<��ƅ|55{���5_��
+T�E���M%0[��M߽��P_����C]�޾+l޺Ţu��z,j�pu���_�Q^G|�ow�=�^x�^|��
k�c�}�mB]�|Ā���l| A�K
+2��*(m(�("M�h�8��S	9J+DAj��D���
{�����c��6Q�o�ޛo�1���̛�fpl���+�Q�{�]Yq��������{_��vz[��v�9�*��əf�'�?�����0�>BĪ�;�aTH���>�n/M�~|\��Т��"��	�=*w��p�|�**
�dG�ڷ�F��**+4i2YNR�N�u2e��"���w5��ɩ-y��8��L��A?5�s
n�'�O�u�8ap�:�;�)i���
ScD��ʄĐ�fs��4/tf'$��~m&�ň"��D��ų��FdC���'��d��
��8W�ݺ��n�����W����Y�t�1&��L/�v�9e�]�8c۽�1o�KJ��F����ېR�
le�
UI
�nN1i
K�����+ۊ��CV⪶<GA��%������HgGM�кT�ftڝ��dYNl�ӲH���;�eQu�،��o�{%,�����,-����
`ᑸPcL�)�b�1E�c�"c���t��j�"�"N!F��S������ȢK17h3���a/T�k��2��>W,� �δ��"]yv{�+2ҕo��"����D��>)�*��<���ʳ��-��<�fr���Io��"�O7&�*�l
gӅ�Tj�\5ZGS
qͬ�]���E)���¤��N���,�˓�悵@#����Z���&dB� ЛD�)#�d�
�G_�Q�j��ō�����


\�F�l{�
+Xt����E��#&�ioQw�߯�ĕU��T�U'��^�5���?��I�to8X7���X9bu,d\��*(�A7Q8E�U�Y���ƍ��(�^U!�|��Yx|��
]�0����ؕ���
�[��๝=�{K���<-yQ�
+[r�E�S��[]z���=o
�*�΅�O��h�+=�|z�.&���W
�u�8�ƌ.RZ�z�7�fV/�$E3�i���u�c�3��y,�:����9^����N��8O�
+)}0DOSs�|wBeܬ�[y3�R�
�Ӑ��-���~3\�V�{C�6ʇ~u`�J��ѿR�Mk
��
Gu�K����-4!Ɠ����Q��6.�
=��v�(�;�%����sB
��=*��\���C�\w�D(w6q���*�?���f�F2��yޙ�\�@V
��2�ժ�����m�X����[�]���:ݵ��M?\�z�1�[���7������a
+�}��0ݜ�p�M��^OQ皴����4s��a�-_=�3=)
+�2kc�Jgd�mS�K�T�)m�������t�}%��U��3����W�e���N�5d3�7H���ҧ
|G�)��
+�)aĿ����'U�3.k
Z/ܙ�%��I�����E,2�<�C�����Jɒ
+��0*���_���oRhBO`�2�s�U��3w�Vy��N`�B���_��v�F
~�^N�TO�4H%/
�3�\�j%'
��&��&̵������<p#p]!������By�
CNA�F�0�w�	��
+x�8�Ȯ�7�iP�m$�Y�sӂ�mG

�Jb��~�v�Q����Q+i����2��6���ňv�C8[%����9J8�B�G [�� 	�%��)
���>X���2�c�8`D	� �B�/�E9��!Z?`�C�=�l 	f�t(�Rz
�����X�>�����)ޟ�}�ROq��W,‹�p����a@�˘�i�Yz�
a'F�!�5��B
��
�`�\��;
+L3���^��n�.(Y�g�&���P��K�
��
+���FAc^q>���vX��E"9������;h+0w2-�V}\���~���( =wQ
+�ܠ[ `�/�D �c���.���c«�������(��
����
�%r������8� �Τ"���Z�3ĭ�
�r�XiCu��M����
nS�A��l=��
p�i�_X����/��b�?����%f����ȷ`��R���ث
���W��0C�)}���0���Й�t�fZ���t~�ކ��4
z��P�C�'p�r�ޏ��Dg��c�M�˰�[t_��4!���5F�jhc+���!pl'n{�'!���㬹��ax�����G@�p pOl�5.3���(U�9�
�
�#x�`��x	o_(�B�����T�3��$�ٴ�΢��h��-�C�����
a���(\���ˁ�����$<��
�e���{�+%\����%\$�����@�H��$�Jx�,	�<�Vz���Ai�L`Ux�7Su��‹�Z�
���6P:�u�r���6�YD}
oZV��-�`�.�>�,�+؎۰����-����͵bĊ~
vb�}���[�3�>|mG�CO��5�f����t [...]
+Wv�5��m[	�������dg�)ؙliM�����`���9yLS�����X]��b��=����i�?�nJ'S����R
�c��v�lOw�&S%��k){�:_wn1�����
+kkv�<������k⇾�?����+���?[�D۶�C�??�DV
�4*�G��n�0[���-�e�d�9�4|d���1n6�6����]	�6a�N�DY�1�8,
��ō��
q��p,�=fdbFW�p�V��1k]xA�6\o�1�cn�*^���ګ��8��~

�,s�8�p�5f��
UP	�9p ��ā��
�aL�}�
�@�B��"°7�`2L��`"L��'��=`,��1 ��&|P
E�B(��0
+F���
.p�y�
�`(
�����v0�6������
|
_���|����	|
������=xށ��-xހ��5xvY�Y�x^���"� ��s�,<O�S�$<��c�(<;`;<
��� ����p�
w��pl�ۡ��mp+l�[�f�	z�F�
7���	,�
l����up-\W�Up%\��ep)\�Ep!l�n� ·��\8Ά��L8N���T8�*�+N����`-���X�?���G��U4C����Y�,��8�-�~
��_±�
��U8_�����t��`t@;
mp4
��
Z`$��‘�d$D#4@=���%��Ű�� 
��KE
�`�Z��wf����k�x1��D5
�<8�p ̅*+_��F%T@�r�s� �f�,�	3`?���4�
+�@9L�2(�����0	���0�Þ0����@ ��b(/B��Q0<�np�F�pȃ\��`(
�����v0��پSߪo���+���B}�>S��O���#���@�V��Ի�
��zK���P���ԫj�zE��^R;Ջ���zN=��QO��ԓ�	��zL=�
Q;�5�v��zH=�
P���Խ�
u��Kݩ�P���*���YanU�i�V�EݢnV7�^u�ڬnP׫M�R=#�03j��N]��QW��ԕ�
+u��L]�.Q��ԅj��V���yÏ2�U稳�Y�Lu�:]��NU����zՕWj��;�\�N�k1m�0]G������E�pY����.����w�7�s��;}�}���gF#>O����H�&N����S�!��)j(��z�v�7���:�+���o�ά���OY��d
+�
+�6�۳³�3(W�7yƌ�f��{
+��Aw�;�v����vgv��|���9�I��e��5�W���5���vmtm�$�>3�r�N{Ev������̙�q68
]�n�ݱ��>m��
c}��X(T�;���:3�vI�X�ˎ����5[<�dQ�a�[�cثf�$X?~�Z[��:�-�
6*WgVg����?;��%�S���P�e��`�B�6�B�/��C�T��_X��
����`*�-�E�x`������U� ��
endstream
endobj
99 0 obj
<</LastModified(D:20141222132804-06'00')/Private 116 0 R>>
endobj
116 0 obj
<</AIMetaData 117 0 R/AIPrivateData1 118 0 R/AIPrivateData10 119 0 R/AIPrivateData11 120 0 R/AIPrivateData12 121 0 R/AIPrivateData13 122 0 R/AIPrivateData14 123 0 R/AIPrivateData15 124 0 R/AIPrivateData16 125 0 R/AIPrivateData17 126 0 R/AIPrivateData18 127 0 R/AIPrivateData19 128 0 R/AIPrivateData2 129 0 R/AIPrivateData3 130 0 R/AIPrivateData4 131 0 R/AIPrivateData5 132 0 R/AIPrivateData6 133 0 R/AIPrivateData7 134 0 R/AIPrivateData8 135 0 R/AIPrivateData9 136 0 R/ContainerVersion 11/Crea [...]
endobj
117 0 obj
<</Length 1102>>stream
+%!PS-Adobe-3.0 
%%Creator: Adobe Illustrator(R) 17.0
%%AI8_CreatorVersion: 18.1.1
%%For: (Howard Butler) ()
%%Title: (front.ai)
%%CreationDate: 12/22/14 1:28 PM
%%Canvassize: 16383
%%BoundingBox: 3 -43 139 1
%%HiResBoundingBox: 3.55980782122515 -42.3042710950194 138.5107421875 0.12158203125
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 13.0
%AI12_BuildNumber: 446
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%CMYKProcessColor: 1 1 1 1 ([Registration])
%AI3_Cropmarks: 0 -45.3500000000004 141.73 0
%AI3_TemplateBox: 71.5 -23.5 71.5 -23.5
%AI3_TileBox: -307.135 -310.674999999999 426.865 265.325
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 1
%AI9_ColorModel: 2
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI9_OpenToView: -44 38.75 8 1866 1032 18 0 0 78 133 0 0 0 1 1 0 1 1 0 1
%AI5_OpenViewLayers: 7
%%PageOrigin:-235 -419
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments

endstream
endobj
118 0 obj
<</Length 6572>>stream
+%%BoundingBox: 3 -43 139 1
%%HiResBoundingBox: 3.55980782122515 -42.3042710950194 138.5107421875 0.12158203125
%AI7_Thumbnail: 128 40 8
%%BeginData: 6398 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FDFCFFFD1FFFA8FFA8FD64FFA1A8FD15FFA859847D7D7DFD62FF7D
%A8A8A8FD13FFA87DAFAFAFA9847DFD25FF84FD047DA8FD13FF7EFD047DFD
%1DFFA8A8A8FF7DFD05FFA8FD0CFFA87DAF84AF84AF84847DFD24FF52F827
%F82752FD13FFF827F827F8A8FD1DFF7DA8A8A8FD04FFA8A8A8FD06FFA87D
%FFFFFF7DAFA9AF84AFA9AF8484FD24FF5227F827277DFD13FF27F8272727
%A8FD1EFF7DA8A8FFFFA87DA8A8A87DFD04FFA87DA87DFFA87D84AF84AF84
%AF84AF7DFF7D7DA8FD20FF7DF827F8277DFD13FF2727F827F8A8FD23FFA8
%A8A8FFA8A8A8FFFFFFA8A87DFFFFFF7DAFA9AFA9AFA9AF85A8A87E8484FD
%20FF52272027277DFD13FF2720272727A8FD23FFFD07A8FD04FFA8FD04FF
%7D7EAF84AF84AF85847DFF7D7D7DFD0BFF7D7D2727275253A8FD08FF7D52
%2727527DF827F8277DFD05FF7D7D2727F85252A8FD06FF2727F827F8A8FD
%1DFF7D847DFD04FFA8A8FFA8A8A8FD0AFF7D84AFA9AFA9AF7DFFFFFFA8FD
%0BFF5227F8272727F827277EFD05FFA82727F827277D53272727F87DFD04
%FF5227F8272727F827277DFD05FF272727F827A8FD1CFF5284848452FFFF
%FFA8A87DA8A8FD0BFFA87D7DA8848453A8FD0EFF2727F827F827F827F827
%F87DFFFFFFA8F827F827F827527DF827F82753FFFFFF5227F827F827F827
%F827F852FD04FF2027F827F8A8FD1CFF7DA9AFAFA87DFD11FFA8FFA8A883
%A87DFD0FFF7D272727202727272027272720FFFFFFFD04272027277D7D27
%2727207DFFFF7D272727202727272027272720A8FFFFFF2727272027A8FD
%1CFF59AF84AF7EA8FD06FFA87D7DA8A8FFFFFFA87D53595359537DA8FD10
%FF27F827F827F827F827F827F82752FF7D27F827F827F827537DF827F827
%59FFFF27F827F827F8272127F827F82752FFFFFF2727F827F8A8FD1CFF7D
%7DA9847DFD07FFA8A8FFA8A8FFFF7D59595A5A615A6136597DFD0EFFA827
%27F827277DFFFF5227F8272752FF7D2727F82727AFFFFF5227F827277DFF
%A82727F827277DFFFF5227F8272752FFFFFF27F8272727A8FD1CFFA87D7D
%7DA8FFA8FD05FF7DAFA8A87DFF7D5336FD075A365952FD0DFF7D27F827F8
%52FFFFFFA8F827F82727FF5227F827F87DFFFFFF52F827F8277DFF7D27F8
%27F827FFFFFFA8F827F82727FFFFFF2727F827F8A8FD20FFA87D7E597EA8
%FFFFA8A1A87DA8CF595A855A615A615A615A615A5A7DFD0CFFA827272027
%52FFFFFF522720272752FF7D2727202752FFFFA82727202727A8FFA82727
%2027277DFFFFA82720272752FFFFFF2720272727A8FD1FFF7D2F5A5A5A35
%597DFFFFA87DA8FF7D35FD0C5A53A8FD0BFF7D27F827F8537D27F827F827
%F82752FF7D27F827F827F827F827F827F827A8FFA827F827F827F82727A8
%2727F82727FFFFFF2727F827F8A8FD1EFF7D59615A615A615A597DFD05FF
%53615A605A615A605A615A605A6159A8FD0BFFA8F827272752842727F827
%2727F8FFFFFFFD0427F8272727F827272752FFFFFF7D272727F827272784
%272727F852FFFFFF272727F827A8FD1DFFA82EFD075A3659A8FFFFFFA859
%36FD0D5A7DFD0BFF7D27F827F8527D27F827F827F87DFFFFFFA8F827F827
%F827F827F82727FD05FF2727F827F82727A8F827F82727FFFFFF2027F827
%F8A8FD1DFF7D5A5A615A615A615A6159A8FFFFFFA859615A615A615A615A
%615A615A615A7EFD0BFFA82027272752A82727202727A8FD05FFA8272720
%272727202752FD07FF522720272727A82727272052FFFFFF2727272027A8
%FD1DFF7D35FD095A7DFFFFFFA8FD0F5A7DFD0BFF7D27F827F8527D272752
%52FD09FF7D52272727527DFD09FF7D53272727A8FD0527FFFFFFFD0527FD
%1EFF7D5A5A615A605A615A6153A8FD04FF53615A615A605A615A605A615A
%61367EFD0BFFA82727F82752FFA8FD0FFFA9FD3DFFA82FFD075A3659A8FF
%A8FFA85936FD0C5A597DFD0BFF7D27F827F852FD50FF7D36615A615A855A
%5A7DFFA8A87DFF7D5A5A615A615A615A615A615A5A53FD0CFFA827272027
%52FD50FFCF592F5A5A5A36597DFFFFA87DA8A8FF52FD0B5A2EA8FD0CFF7D
%27F827F852FD52FFA8597E597D7DFD04FFA8A8FFFFFF535A5A615A615A61
%5A5A2EA8FFFFA8FD0AFFA82027272752FD52FFCFCAA8FD0DFF53592F5A36
%5A2F5952A8CFA87D7D7DFD0BFFA8FFA8FD52FFA8A87DFD07FFA1A8A8A8FD
%04FFA8847D7E597EA2FFFFA8A8FFA8A8A8FD5FFFA87DA87DFD04FFA87DA8
%A8A87D7DA8FD0BFF7DFFFD04A8FD60FFA8A8FD04FFA87DFFA8AFA8FFA8A2
%FD0BFFA8A8FFA8A8A8FD66FF7DFD07A87DA8FD06FFA8FFFFFFA87D7DA87D
%FD5FFFA87D7E7DFFFFFFA8A8A8FFA8FFA8FFA8A8A8FFFFFFA87D535959FF
%FFFFA8A8A8FD1FFFFD05A8FD0FFF7DFD0EFFA97DFFFFFFA8A9FD16FF7E2E
%2F0D2F2EA8FFFF7DFD09A8FFFFA82F0D360D2F2EFD23FFA8527DFF7D27A8
%FD05FFA8FFFFFF7E7DA8FFA87DA8FFFFFFA8FFFFFFA8FD05FF7E277DFFA8
%7D7DFFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFA82E3630362F36
%52FFFD05A8FFFD05A8FFFF590D362F36302F59FD0DFFA852527DA852527D
%FF7D527DA852527DFD04FFA87D27A8FFFF27A8FF7D527DFFA8527DA87D27
%7DA87E28A8FF7D5252FF7E52527DFD05FF527DFFA827A8FFA85252A8A852
%59A87D5252A8A8527DFFA852537E532F0D362F360D2F7DFF7DFD07A87DFF
%FFCF2E362F360D360D53A8FFFFFFA8FD08FF7D52FF277E28FF287D277D27
%A828A827FD05FF52527DFFFF52A8A827FF52A8A87D27A8A852FFFFFF527D
%FF27A852A8527D52A8FD05FF527DFFFF527DFF527DFFFF2752277D527D52
%7D7D527DFF525252537E0D3630362F362F7EFFFF7DA8A8FFA8AF7DA8FFFF
%A85930362F36303653FFFFFF7DA8A8FD07FF7D527D52A8527D527D527DA8
%A852A852FD05FFA852FFFFA827A8A8527D52A8525252A8FF27A8FFA8277D
%FF52A852A87D277EFD06FF277DFFFF277DFF7D52A8A87D52A8A853A87D7D
%FF7D277D7D52A8A87D2F0D362F360D2FA8FFFFFF7D7D7DA87DA8FD04FF2E
%362F362F360D7DFFFFA8A87DA8FD08FF7D52A8A8277DA8FF7D7D7DFF7DFF
%7DFD05FFA87DFFFF7D7D53FF7D527DFF7D7D7DFFFF7D52FF7D7D52AF7DFF
%7DFF287D527DFD04FF7D7D52A87D7D52A8FF7D52FFA87D52FF7DA87DA87D
%7D7DFFFF7D52A8FF2E362F36303052FD07FFA8FD06FFA82E3630360D53A8
%FFFFFFA1A8FD0CFFA87DFD2BFF7D7D7DA8FD21FFA82E2F0D2F52FD10FFA8
%2E2F2E53A8FD13FFA8FD2FFFA8FD1EFFFF
%%EndData

endstream
endobj
119 0 obj
<</Length 65536>>stream
+@ޟk�����&|����a	�ZRɊ�����)�&�5 �հ�nͫ1��.a�L�_V!��Ee�=���l�=&���.�G)4��{��-�=�/�9�U��W���������^aَٝ��}
�z[C��r4'[Y>ݖ}���!�?��+<mM�=#�~������� E>�
7�l��&t���޼�a"�Fb኎V��x�ew���S���_
Ą�NN���[@<���}�mH>;�R���R�f}��κ��S	��'���q*�rP˄�9y_G�E�#2mV��q���LL�@.���"W
���Y�������
��1��V|k
П����?��A#W�,𺵝�fi�Z9��Iyo~����M�:�U���
I[�p��dA��:c�N�D�^%�����G�*�z^�8Y��ӭ���lʶ�\�f�T��)�K|֊�Z�hd���6tɞ��v3�J�����	-6뢿��Ɏ�
�sռ�ZА��h��/n"����nE����_�I��>b��D���Z3���d?$��-�_&��M'*sI�
+
�ޮ�_�(q��
�}���i%�lÆ,00b��Y��m�|�����:bׅ,�<��m�y8� �jȈ��6�k�t���̍��d���X������(X�rd����������
�_����%˚�7ӊ�G����)-�VM��>� d�������͡��y-���a��ee����+������P삪���3�
9W�����I��n}�����
+n�Ț�6-Ă:uـ�Y4�*Vm\��8���`#������w�ΖG�\5P���MC��?ZJ�����b$��O����j<���ٮ�h@�?�e]��?
��P��N�J�O)�	YX�7P��N-tW����W�tV<u�����	礍O�}��0:錁[p;��_a�W�1�@Gg��� þ{��=#�0��x3%-�mU�����ݐv�B̽�Ce�e��_�4�3
+���/ae�/��7'FEOL��Ǵ�'�i����DN�k��������Mi*>~�A

u�A� �nَ��2��qN�\;:��8l
UnN tt��)ڶ�+�ꆘEE]�9fkW�3„M
�2�Ĝk���8g
"F˨{=�V�xAV���x��fGe�q�>�
x�
�`s�ִiG�(��,��	i}���&Vm�
��a|IHO,XPb�!��vR����mgcW
������4(j���M�����9�U���2X̊�Q�m��m6��f��G��
'��f�Յ���9(b�A��eb
v�#�&��=���d������ :�^xaFZ�hۄ���ejd�� 8r�F,[
Ƥn91��h����CȄ��s�`�&|�Q���Ic�G�������,P~r�� ��������%
)w�H*��آ���\6͏������e�E���
rv�h��0�O��@W�
��]�C�:�uw��ҋc¢˳��/�p����ȱ���3���iiG�t/%qQ�K�w��
o+�������̀︉5
:H̼��u��r���w�x�m�f#팱�{^o��ֻ3ƣ����j��
�<�Q��!(��&�]�b*�ӊS~���n��ŷ$
�O(�'�j#��@��q+Nt���}����yX����?)�~
+������?L��\ܲ'm�����x����
5���-�~^^�8��{9�]r���D_���ʻrf����7��R��1�
}���5�K�֠
+�R�ߝ,	�
���BX嫛�yuq'���
�$<=>��cG��Ł�G>q�

!欰��	���u]S���&f����G
���}'�>L*޵�����1NvU����d��7S���Y]줸&rQ
+{�\Ē�!��θ�Q���%k�
��� ��Bb͌��Fr�s}9?���v쐴Yi1���1;N6�'���1U �?O��O��_��u?&�"`���jXƮ�
+Y�"24���&R�)82��D.ɱI�:rYŮX�q�V�"¢�Y��"�.�1I��M�@}
�R�Gx�y96��te�^����eY
��t \7�&����
�y����)q���

[��.
ԾmI���jD���&)X5��Ʃ�����E�2H̊
��n������Y�I�4<`s�#��/	�jÁ�٬�~볏����0A
�t��b
Np8?<ѿ�L��1bݎ�X��å��4Ջ�t
jn��JlB�[
��W�s�����K�u/f�
�|�5�;�ʹeR~�T91�����m�U?
*�ެ9�VXJ`��OZ�j���|b�� m:X�
7�x0���eR�:���������u;�zQ��^�`�-ܒ�ݰ��
�)'��;s}���v�'&�G�a�4E�[!A
>c�H)��~ z��9�݅�ֆ'vN�] Ʀ�i��FJ�:�N�}���>\������޵1Q�Guh���ӽ�oT��:j�CG71F�E=��&��o��������ܢO�)�a��
�$�9�K|�_�t�Y}
��x�[
sVEʸ�,~����{J���U�M���?Z�J���8Dʣ�{A���sZ��8������wS
ٗl��K
JTQ`�TP��򬧫.���� ��S
�/���[����J�^�<��=37HȡV%\��{���dk�R�#w
��-}�'
%�����)5��u���Eѿ��_<d�?3
�?���'�`�N3sn���צM������Ȅ
���;fJ���~xҮ[R#� e�<\
h��0q�^	"{QE,�/cYM��0�ևq�SP�:�1��1%2�i` �3�W�v�qT�Ǧ���h@�!wF��5f��]� �&��JGKMܲ�ὃ�xei����|7�lI
��P����ݡ�Z5�J&{ ��;_.����f\������������]3#R6m����
�	�� S��,G�c���:ɦ�f���������r�+�����g����A������{2�_�5�]R5E}
'6�Ԝ%5�rwD�Xձk�j|Z�������Z�����
;��dx:��fz17�<�� �G�s�ךw�%Ⱦ����l;�M;..s�����2T즋�K���D�쳟+�쥡�
�
�9���
3�����V<�"dM��߻9�7z��,�p)�}��݂�+�*j�E���t��
��.�5ٕ}QY�e'���0 at 3�w+ 4��q� �W����Y��d7��� *��l՞����
+�KJٚ�K�v�kFZݒ�Y?:�-��Q��Ȉi%��+�f��GB�

��!�����$N�QQ>����t_������QRJo3sߞV�S�<ڷ���0L-
�x�9��b���v@���2�Ïz�ͪ�_����G=�A6ͤ�y}7�!m��J��q5��ƘyY�=OK�E94�TOc�i"��ɮ��AjqSn��o���V��ʆ�<ђw��M�dD�>M˹w��鬅��`L�H�Kx}�Uqdž&�;�`��'��.�X)�T=>���;{@���gi9�'~x��o
2䳓\�5}@F���rR���ؔ�乖U�����SzJ��=
�m����?�J������Ǵ�؋���IE/Λ9�����~�t���v݈�U
,m����!����.�x9����g��
c�Ǡ��AHY�tq��AwóS�»���{[��*L^�T��s�ڸ�^.��_���e�y(�-'�h�R��KT��:�P�
������H�6�i�:�a�?�"����=_}�����lc7<�� !�ْ [...]
+��!���];o��N��9�u���:����N�S��6
+v���C7�jˎ�ܱbrw�<�4���
��#Ԃ
��Q5'����s
�9�Ԡ���Q��v
��-'����
��w|���1�^�(���m;��>Ыu
�i� ���� �4��u@�����>su��iV���"S�,���1
+48B�@F�J��
*N՚Y�z47cy��5Ӌ�0�ROS��rTƕIi��uo����Y5�xZIL[0���v&h���]02*w�8����Qxņ�4CS��nXw���
Ԍ��=o��-[�{ޣ~?��e�5V̴Z@T-khE�zJ����C���ՏV5�,��򡞔v��(�7&����'eM)�y�}�
W/{JE�<pӰ�,��5�A�.��+&z����Yq����L�4�Yl��6N�L�V=�쬼=+oz�!�\U���t�+n
��a1��~�"(��6�)��8���|��9jN�O���RV���-7�q^�L]5b*�M��Gg�w
��9U��i��4���S0,��
$�=Z3a*f�e�t�t���9ٙ=-������:l�Q��D��-n��	䨒C�����l��W4����
���s=Jh&$�ՙ��W�lD��Y�t�w����8�
ȹ������
��=��܂wON��=��9Jj������'�W
�����L̙}/
�>ƧO���=�Ȑ�Qw�W
�B`�#���0����S�8�%��QK��Wͼ�{N:��ݲ�j�d.鉅Ki���rI�S�
�[.��T�Y}/wQK������Yh����0<iNǬ
�W�koN97�z�0��4�]�tFZ�ho���bb挬���`�ţm�q�kRŪW�lEeL+#V���=�xՁΟF%Nc�5��
+|��}�n�H��0S��=4(����QcRK����G
��(_fx�/3\ᗣ�{J튅X��'�.ih��&h��nVN��D�I�KXv3�]�x^Y��&Ƚ0�S�j�N��r+
���/vF��1&f�N�����@�>Oԧ͍�G�a�&��Ȩ�~%2��Ϥo�R��~
+�[�9��j6��ܽ1b-�τ9�}H�Jް��f�
o�rhT�D*��񎓅<���z�s�%`�蹍KF6h��lX�U�Xi�=�m������
&.h}��}���
�O����9
�2d��t��-&��#�[�/�D��53�4̨��S5���!Bژ��<9H/^u��SJ���na���`���F�B��6i^��8Z�}/��
��5+�Kݤ���>�vR���M
99(��l�@/[w��N��.�>䥐[�j��o:HU!
�xa��W��,,ЪK(��
��
Z��_�z��	z��ZZƇ:q>���%GnjH�
Ϩ��G5p�,�Z�mnN�4�
+�̄���V�
1Ą��A
����l9nNQ����<��ğ�bR.o�	�NТ�Q�h��Bd�%+f.dIǬ�$e�{ё~)"jQG.W1���i�Zh{
�_@�/h	y�FF
�c6G[�
V.|�&"������;(���
�9-���
+�Y�c�6���u�yLE�cK�pkS�u�zR�_Z�h�%��t��U
�b�*$,;Z9k�"ު��
Y���6j���-��5+&;�E-���it��ńg\�fE��40��|̚�ٰ�5�:)�E�a���;���qa˦��r
���玓ڸ���GY�m�d$�L�!#�U��\��
���R�x�����/f���aX���Z��oN������u���W�jB�u�p���牆�]	����[%m
�:0H-�2ݮ�:Ӣ8�3�[.X���)iۉ*��k�]��I)�yP��<��{nlɖ�P������V���Ł~X亝ִ�,;y�������ć"�?@�޲a�z��mԚE#�y�#�S4g9z��WF��
��"�C|嚝
+Z�	�vQ�k����h.
3�fմ�E=�lVO)�3��s�6���S4���[�(q���?<жh态�*
���6d��e
N����y���3N�m�� _�榁�|l��=cg���L�M[q�Ì���rTފS@^6��7 nX����M��e
��k�[�\����m_�toRй�#BW��Z� �ONL�:������3۪�>�a�6Ӫ�<%����m{G�@F�|��W
�U,腰M���۔X4�2����>H츤9bN�����kv!cw��{{T꘵t��|ȚE���p��-�g�Ně�
�4���M��Uk�d�ãlz��kvJ�Ѽ4�
m����
+7��}�.�*��V��;^M+d���>�Ժ�)�Rzі]@��Ҋ���G�N�I�l�$ĸ{0���Y5�>fr��	�`��%��8�i->{j�D������le�FD��6b����M2٫
R��<�	7r!�S!���H_�3���t�C^
���<L�?
B���m�Äm��vl�v;:O<�.[5�5
����WӀ�Z6�q
9�`�RvaN��	3͑KX�D?蕳���1�l;(��@|^��*g)UA|t���u8�,;��� �s1{��-[�Kzf�B�MH
+ٸ���A��P��aLښ��r2Q�|��PS$��6m����.j�oZ���&�W=B��X�j����9
�ey91e^K.��
+Z&:t!OKW����t~a��m��	��16.0L)X�s� �����	����U:f�
+��u�1o�c'����6;,��U2a�888�����6X��
6{y���f 7�κ�K����g;�[�\�Ƹ�es�U�5צߙ)w
������P��C�\����(&��@� mW�=��o���
fj톇�Y�
#Ԛ����
+��Mѓ���57��J͆���
�ۿ/������hА��ܞ��g����!bp=��Q>ww�ײ?�:�5�*]t2�sB���R�:�!.Z��ASӇã���g��`�S�`�4�Ԍ�!a��_P ���t`��<ֶ��]5��j�� �ٰ�
�]
���I�\q���=���w|��C@	��E>9+�-a�zU�*.��\k]��e
����l��(;@�?�'�h`�M�D�>yK�����j�{�0�H_6�˗
���P	j'u=��
��Ps�M-�Y��3gmg��M�RD�� �aN/�M�r[�
�ho�Z��m
K�!]�p��ɜ֡��LU��lj�=u ��-_�Ț�ռ0D�]��J7G荻nJ���T�2@�!j
^6��rR����Φ�V�6�F��8�u'�1C��q�ͷ
"�Q��	}�GE,��KV�L亳�ua��h���۲<�vȢ�K���W�
�_
+�v�T=Z1�J��l҂�Xa��ܙ�mz}�o�nO��lx���
�0�fb��0<a���O�2�
��I`�s�N��� }\+��=�u�F!|��-�7�w�[ٙ���K����6���;�nڝm
\�q�͖N��c�^��؞�W��ŜIs_��H�f�ի�2�u��U���T�P�0��Yi�^L�1K֝��m_���D[�N@���aL�v@�ޙ��v:�[m�Ϙ7�
�
i�Įw��S
}��
+���p��F/9X��a>zk\$ٛ�mM�V�m��G �5��Ld��޽�����lҪ
_�5�.ޝ�aw'��M��4�%��(����m��sg�M[0ѪLJp)sr��4�t���X�2�k���t�lw\غ3Il���q+��Wًp�kp�n#R�"�PQx/'$��9��>*妛[h�\����I���ȭ
�z[
+��w!<�p�C�3!����d���gWpslJZ߫�Ȅ��.8���I�i;[v���M1o����
Uq_��ߛ���e�0�ؒŸ���7
ݲ
G�j�ѧ׈avY?���_i�6����d�a�U�k�5�G�N�{�<`��Y
+��R�VdI�Ie�G���jl�Q��rv�T/���~�?�\�Ѭ�m��-o��u��G:���ּ9#�bZ�I^2�*֝�
+��>�nje|01�O}��B��4����[0s&>&8"d���?fۍ���6F�E�S�Σ=Zvu��*�%z湌���v�͘;���������n	1uNI/	�k��OHI��~L�� �h�-�G�y32�k���D��zVՒ��\�����5;�(u���
+5F�&+��t�:e=`soo�Y�a�z���n3����I
�=s�w���
����Yt
(� �.9�
�^j
�!7��X�!�����#C�G7�o�������|E4�,}�k�\Ɓ�7�R+��W�ީĭ�3:!$h`�=,���fgJ�u��jJ���+�\⒯���S��n�A�Ui
詶ɺ��n�Y���B��
+�]��e]8�F��H�AL�ʈ��9֣ۘ�۝�lO���®/s���:���
����9�����>�e̻:���K;#5`h%�M�4��^83"b�X��lٴ�P
wl�z��c��i59��q
�a�W.
Gtq]ym4�{1F�t��JT1��z�8Rr\N�E���"�2��=�掶�A������w�;��-}"à�Y!���\I�8�OS���4	&���Ҧ�w�����!��u���iM���
��+�W�弿�e�����5g���X������s�^�P�
.�:0��n��=��#i޴0li]��&ۚI���* _�. _���<��i���Idz���F�E�����.%4d"J����	�z��/�����Fv���4RM���;�-���q�����ߠ��۞��Q��I��*P��� 7d��n�u��� �A�.j����ܽ�V٬K
bk%]J�0V���r)L��a�p��'�:�x-1���s2"鍳�+�J�[�eͨ��ACkJ�*X�� [...]
w�d�
r�����
pے�T3��dN
�`N���0�:�r
M�#�
�
+(�h
���^/�l;����9;�����an<YR�?Gmf��a��.ФIB����WFx��b�D�p�B�VO��S�J�UY�Nc����gd���d<������qs)�YE�q^:�zYv�<���!+R�o-j 9���&�T� ��N�[��
��9���.�f�۲��Vθ�D^��K��ɻ䥽���C=���
V&�JQ��L-��~f������X�'��Eg�Ъ�wʕ.v�l�-/Vc���
M�+��*���|^:�Tb
���L�ټR�/��®��9��m���L��{O�ў9����
+�ȰU���e��x!�&�/ s7RP�ct��&��K��oc����Jo��t\*/�=�W,9� �<����������FW�x��A/[qvIzAӸ�����J���3S�b�E"(3/j��W�
[-,����B�[~a���w�c��	
�9��)�Ɠ�_�>{Q���
黥m���X�y'�`V���;�%
G.�i�&RF^0˙
�b�P0�ǡ�?0	��,�p&�Q�G�����/oF��G��V���K���;
�)�qp��.�Y�-w�:�VMX�&M�ԋ���
�M]=+$I��U`K2���K$���*f�����Z�����?��a��9��w{(��^"㞂P~U���u��jљ��6Bo���L�a�W�
7jA��(�dDM�Ѕ�W�ǟ?/9�W"�-�����a����]���.�z�꣺��Q���y_�(�m
��t�L۸�N�T�[;��4�Le��@>��E���8�/Ee�3��ҟ��
���&�m
�Xd�����aw�qa���_AM��4��B,/�v���)�^%%ͮ�"%=>�}��,�Hh�Y�V�]�]��.&�~z���ؕ��a�g������y�$��ɻaw�
�nP]���<s�I�oi���e��U�1q�~��o�åMꄍN��ۨ�J�ԣ=}2?�K�ƣ
�2�x�}z���|��ٟUWw_�~Wu&#��GJR�_�yw�-슠E��w��9���T�O��xs1
��ٵ���3��3(?��k���(엿ބ=|�O
{�v�nvXj2�$��x��*w
v69�y��� WX��no%IJ�3���(*�΋I��?��
�K"
O���>�v3�&�O�.�+
{��8w��[��U�
���\�3uq�-�.���?�j/�
��|���E�y
����%'��P���*��&,:�q��{R��O�����"S�"�Dǟ���|�:
|U*����;[gm������_2��t��#?v?�t�tD<�D|vǯ�9�'
>{�t�S
+���,�?nd����۰�=�D��u�����?0X�']�h�Ik�3K��Mmt�� �#r�1$�j�t����
^�
�ш
�Y�h:�W(9�1�s2%��D��גÞ�W��^v�zڱ�Q��4l�])���ނ�X�2 �
QNw�P!�ݗ�.���*�\~�I4�ԓ��c����IŸ�D�~�t7���(�O��"b)a�
��=��K�2�̪s������Le#�
��D�:��1Yu����}��������
�e�g_���v��حg�a���{��E�DT��DV���<����/��vA�j
w|HP5gbT������OW�b��2)��l(#�2�B�{\*�$�sǣ�9�^E��?i����uذ�da����K�?��=����%���wQ���D�ț�s�FTꂁZ�T����i�mce\�T�6ވ	ܩFN\/�Υfw���,�y$�����c�.%��~���Lީ�	�ey��n]/v�*"
�zk��aX����(%��R���J��
ޯѩ��I��/<�=v��Waw^��F?�]��
�� �942�E��d��ș�AV�Z�lj��A��d,]���^���nFe�\:~�yvXv��Tf��טl��1��1Ɍ�u�;D����n\IO��ӃVZ����
��;E&m��Y����B,��C���G
�Ԫ.�N ���]���'�8'R
�4H�����
����;���h�A���`iN�6�:�m��viy�� K

L�#�1x�Sn�ooY��Ea�=�� �Ps��Â��1�c��aW�5�]rԋDaX|��T1�t�̲�T��Ekg��C^y���J��z*X��5�ލ�z����&˅�F��Em�/�.
�z�$��KH؍Ua����x�8��-:QP$>�#
���(��3*���};��Q����L��-�}��ر�e��T �O
+k%�j������[)�W
FBOG�Ž%��O&�_H�j��Dz�ڒ�
�Q}'d��j��2��Z�GM
��!��C駲$�2*[E�ȞRXʗp��AI���̊�;i�̻Y%��0�%
+̴~D0��<�*F��Vٵ�P�V���s�u��9!ϯ���1
+��i������-��3�a
��ھ�mݏ��r�q�Wqؓ�E
Ɨ��/�xn�Q�
�53M�=�ct�YE�����ޅ,���Q�o�i��m]*7U 
�%���`���Z���
+��Rv�����ΜO	��~5��G�B�c���'���f�N�-�[p��˨
���>�����^�[3|S4�8��|R
��J.���1	{1#������Ф[%6�Oc�/9����F��5�������@�:^�^��H�����
<�y�-
+�7S�e���i�g��֫(������k����<y���4�S�`���y�u����
:gQ�K[��3\Rl�E&(���!r@*/�vkJ�:M�
�6K�{
C��#1=���[�P/�|���ORJ�j

+-q��G�t�H>.4�̛�С��n�A�o6��C�xggk,���
M6=�C[�u^���:�R����x���d�����㟊ZN%����ݨ8&8�{z|���uL�o�hР
[���|l��H;Q�'L���JmUL�]
eX�;Ns<폣2��.��:v�N~؛h��ɨ3E���aP�
E��,�/
�3
+Ȼ��T��cT-ZEh�NP�����h�z�՝sa׀�V,Ք���	®�4Z�+
LP�k���)�l���G9X�V�UX�����7������]f�}��ǵ�<����7h[�5mh��X�ՙ&�nO���I��k�
+
�w`�����-��L׵��}��d�Hg�өL��iqw� �q%H�@�� !	!�	
�$ăS��������{g}���:�Cr��y|� .�
S3$2���<�U�*�-6Ͻ#m+�Qv�M7>tg����{Ɩ�5U{�f�=r����'�]��B~�5(,�'b#�����2Bg���h�'0�dq�������خ���Y�bƼ�w��A�)0)
�[n����w�'T��n��P�����WT�>��i���Z�� W�+;�%��υ^��o���d�lc~����Y
&㼹�3K/�c���q���dT=�U�� ���U��[�F�G��:�%}�����3��@hu���:َ�:����:\���qF���U��468�u�UIm�v��d���*�d%ȧ��G�&�>�f�Z���ZJ�S�8����|�yG����neڵ�X����CS����)^�/�g�ݵJ9kBf��t#�4󞬟�-X��җg;�:QS�D��h
��d���P[�b�m��,Lғ�f:���Y����@WS�V ��J���"B��
f�
H�5�ei+�0Y_�
��ˇ�J�?������
_���9��0:k���~���Ct�����9˲��N�Ȭ]�Ҹ#aU
�ޟ,uN3�
+L�|�ceO�ݹ^B�|t�<�?G�j�}@�~?h���0�s�I��hmk
�G��%� w{�_�V3*�*&��PW�9y�$���H���<�7V�3!/ؐ�_�%u��Ů���&�f��1�ό�0#g��Izi
|���f�b��M
G[��O6���
��c
qhb`�:Z��4=oM��i�����u7x[۝���vm
סk���x��U�=�.ݐ��U���6�m��a��Y�vў��*�E�)���Q�
��M:�쐺��ڵl�YΫ2	��[D̎�U�<�N8
5�ɋT+G?�M��F��jQS�Q��XS5b6��NSK��f�KG���(9��:��v��`�G�]i��R��#��ʑڂE��3}|�tF<�
��C��ڱQ	C$
%�E-��Yf�m��շ�ؼ%�Eηf_��)��B_��E��ߓ�,�-��in��������RwՃ
Q}Ŗ�o�-
㢞�d:�;�N�L���2
+~b��ۤ���Yj֦��=�ο�ы��<����
����VP�&ʮeA�su�=m{0�q�g�c �_b�a���4��Q�Ӳ��bKB˲��U�,�)gK\��"��TPK�Lj�+����qj���&jC�,2OSs�"r�Sɬ
ΐ�I��)l�X��l��01jM���
�I�)�E��
z``@�JJ0״̯�%�|�E����2WF�%����~d�b?>�4JO\��煝h� om��mW�
[�:Z
*&�2]�f{(��GF��j����NM�#��9SZL�e�Q֑���F�|����o�����:X&��:��;�����,��;f�v
�#��y��OK-�kk1��
�@�s��S�cW���ix����g��
+N�� <d��*�`�'�-�j�R�o&Hi�T�OM�;�zdom���.q�g\�K�I3t��2gL!�x���/�l�g���,e.	��'���R\�foգ�v�]����F/�o�Rxh�%X�
����yW����6���WK�/},���_t�������/���#
u��睚��G�M��S�7���7�:
nm�U�<\�cN���܋<����y�l��}_�-�
/��ɹ�%�:Y��ϗ�����F�|}��
�̦��+���.��eе���S���"RⲈQ�g�
�躺̪F�EQ_�;ˇ�
ܚ�E6���$
����j��n�b{��KD� �?���|s����#f8&kR�Rj�e���=N�YA�������x����'�f���#=rRr���ߛ���Z2��V��������ņ��yr�}���e(���t�3����U�~m#�6Â�N��s��WE/�kH9����Ѳg{�
mO�-"rꑑ]}�e@�Jv�
��=�]�E>�ǽq�iE+����N�M����6�Ju�I�v!*l�#����k+�o��LR���ӿߙ�'�<�� %�!�I�
B�:��191�7KL�F<Wr/����sI��g���=����t�GN�qKI�>�b~�:m�.�^p��� ,es�D%����vI^��b
د���
�F�����u��)b�m��[O�.�R]�z��4>�:�I�hU�I�SG����;�x�w��@E)���M��g)Yn-n�z���¸��}1>�?�M�j���n��k\�T41��
m-��l��X�
�l��&{T�l�
�j�bⶅ�W'K����
+h1y^<� �-�&z��9�˂w�k
-[S��]!ͧ�g}�wM�=Әd��bE��N�b�e���Y�W3�,1Qgfա����!��u�䕹����p��?-�ƳU6�6�O��f��t�_�/<1a��1 �
��V��3W�V��.){u�,��_�Ua'K|��"��)���K�a��8��O<Zm����:~����^��
�����h���jP�����1��զ�ڻ�]yp6��e�lo��
��3�M�j巸ň��il�R�y+*�v��
�0�|���S� �e��:�y�;A�X�B>_��~�6��5��ŮYx��]�ECC���ﲯ�O�<r
�.Ƽ����XG�
�gQ���`�$"fc�*b��X'��C-
v�c��Sа���+;#���Őp��&ӯ�{�p�v*�3�4
m�c�����xKߖsk����Z���>𣏘���Fq��I|�Rs��3���&��N�c�_hν�k���<��U���1ɗ�\�GJ/tL�cwG������h�.��~\�(��2Jv��

�
��X�,!�6�|�C�Z��1���W�0�m
��?�77�൏������~���W�Îu��C5��''g8�T�����y�G97��>���
+Rڡ���<y��yd�!
)��P��pK a{�U/M��7����R�g�$
W7F�G�l��雭��Ȫ�=3����c�T�y�'���c�ǫ_�I��>

�US+v�+"7J����\�+�}��"ZŰ��iP�]Ry�%k(e��iп���C
�1Tv�1��9]4{��}.�6
uL�_:��1�z�@M�lV������}2\����}�*vg���k
+q�%T�WD����;��9
s` �{��D�
�5q�2J�_G-��C_
/� �1�W�x^-
�3�|���k�3��
-�מ���'
d��ZS��[~��!��-~әWh�÷�*_8��X�ǘ�E.eG
`���W��TTP at M-	f o��b�Rh�|w�cG����P��U`� &���<���Ir�}X�q�ӽ	L��G�#MS�e� .�H��YG0o}rR�_U��/�g��qy�Zh���#�Ǭ��
�Y��xo
����:A�O�WS��;
��e����a#̜���h�����RQ@��ߛ,�ڑ��jk�/;ø��!Z�r7�ᾐ�3�~�+D%�M���ƫ��z@���*_:��̵�׽�7A$���fz_p�:\��;�K���3�E��pI?�sޅ����y�ڒ.hj�.���
�_
)�k����ehͿs�HG��?''}+ee����0����e��GFʳ��7���
+	��i�%%拘?��/~�7���ѓ}ͧ!f��ҍ~b�N?*�Z扉�w���� ߎ�>5�X�*��.�Cm
�6>��.�e�x�oL�0È�	�ʏ���^�Z2�EF��
+�(�BD��0���`�C���Ź�x"z����'�G���h�`�z��(,d�}��v!�k��}�D�i�s
,|,����!
�Y@�4����{[�Y�
�%�N��"](��2������c����Uv�W�M�O 
�>��8����RTtmE���W�9�T����i��
!����KRB��Z^��� �5�N���AP��
+���\+��k��5.�K;ӯ��
Q�^#
�3EHv+�����x����k
�g#
���w�r��R/���4Xh��?Ǭ>�Ӫ�I>
�¯!��Ƞ=�`{���jOѭC���~�jj�OA���Ϳ�S�r�Jr�KFLv�aa���g�֤�3ԸYG�Y��!�m�7����ʯ�������R��01F�P��z/�m��)¾�.��؞��Bk���#�^.�T�G{�̢�!�
�������E��NQ�c�

�3
+z����i���7��	����
�����C]RT����v/���0>f��{�
��f/2�-e:Ŕ��d��>碬&�۝��;����V�ud���W�(�4�.w��K홗�
qf��tM���%��Sc#�)�d���L��
rO��N���8*r���$5����K���[E���挟���o�δ
���S/���=�V�m��Y�=�vt9D

��pCsu��Xԉ�}�@�Y�@/L=���p�?~�����R�8�c5
3+x}y�������+ޙ�yUR*-���5�<2��iu�-�{r��o(���!D���:8�\�1�'��f���@��9{�‡�]I���o�!����]�61%[�+��m�<;�6�T�J�
�՛zy���9/�G)7��
�cӍm�w��Ԫ##��&`�w��
�#�Ҋ����+"f�e����,��Y����&�������"<
+t��܏O���0쿀^�r˱��%6@��}v���Y�߸|�
2ZӘqi�C��o3�g+T��/�s
+����	r��.��G ��>���p3:^�2���6�e�ؽ�ܛ���׻#�0�
41�B$�efӔ]�$6(��Adڧ�N͑I���XF
o�jc�z�)����/��b�푖
;�2+�3�W
������=\pC��mo���3��nm�A��^�)��3NI2��#��aOT������*~��˭��w'�	�֊:A�����7J������gѱ@mF8&a� �>Zl+��/|�
5�>��X�I�hlz����������s��Ⴤ�o��AÀ�-�?5u�>AK��
���m����3~Z釿�ܔ�
+n�G�#;��(k�1u���k)�>AK��#,��z&d�_�`�wqk�2d_�NvM��z�]��pJ�1��һ����
!�NQson�!S /�5T�|{��}��Sy��M�0E��.�o��������_��/,6&���"�u��C5�r������3����!$�D�x�tU�R{�MS{���!�㴜��z�lM�n"'8F��=S����E�6���,w�?q��H�
�����Lj�J⥖���RKŝ������
n:�
�d�*�LM�f���Dz'�!=��ֻ��F��ӊB�[�m�CԵD����
7� �_=
j
G��AE:oa�=�A��l��g8��qj�ņ�����w)%�{
��}�H�4��]u�v���{b���s�"�NJ�YN�U%/�g5/碆�~1��r�C�Iz���W�$�\Mm�%1����tM��+y�8De�l2	!ٯfB6z+�n�?5����V&���>���ǜ+��e1�:b�Jo�
�
2�d���d�]�� [...]
+��o�P����Z�.FǸe�8�\u�[^�x�1�1}�����C �蛣��@K+�()��:�F�o�>ѿ�}�C���1�+��n������Bܛ���+c��oF���P7�����jk��<
<��ɺx��#��ڶ
b���3n*���Ԗ}��^��J'�ζ�k+{�9����=]m/���Z|}o ��9��7v�ߜ���f�
新�u�:Jo�ع�Z 1?�`c��t�C͓��Qn��)f�o;�T}{��vx��z��k��ir�?�
��M���D҅w�]R��N�
��K
�7V�s�ZGK�eձ������3�����s���e �?}�7��)�| �^;��!��.L��S��_�CĄ������{
(d�7�=���1�W[0�j���-�AH��q�$C�s�B�Lu�W��ޟ�~�U��+�����Z:��xM�M�+ m�ੈ��7C)��EI)��KHY{�t�|;��|s�
�{�}mc�����G�
��	y
-E7���
P�A�q|�J{��̋���5�Q�.���b���4>IP��m�ȟw�P��:J��I
�
�Ro�| |J��G�E�MS�'�?
դ]5�Gl�V��"C�?�C����ۑo���E�v�g��Ƒ�bv�E!>��F{�C�(4�1
��Ͱ�
�Ʋ��G���
ſ���w���
,qN��^ T����[��n
`�~p�ߥ���Xn��m^�}{�%�K\���-�<	���g_�W��卤`&���ҧC'�Ő��2d��B
賹�ͧ�#�$�h��\��&�}f"W��V���@ۣY7���T��|m�GN�82?�b�դ�9��	Jf���v�!k����èg6!1�5LJoO��vDؘՏЧ��;�BL���6	.f���ur����֖!�kMSƯ���_w��!n19�D���HI���+����iz����'	5�;	-��1R�wS��8)?���c=2N�,/�RpN�S�*7�������n�Ϊ[�qR�
 ��~b��=9^!@�\j�>5��'�q�#�t}'��Jo��#M�>�O�Ob���
�k���1���Y�+������կ��
��0>�
�/��o���v�=п=�
DGoN���� V�^�ȈY�����/l��\55��b
�y��R��\����

a�_�e��۫�e�w���>t{����b/䅬��vUʓ�!��^<�S�N�5�Y���܇Ją>�+�������PIWʣn�M!(zz�������~i�s��乶>��I̫���.�Wł��#����^9$�
�;���\�
>
��إ���}ؤo�QI��;��G����_[��d�($�PE,9
f��9�tu��=���xu�y�v�p21a�>�������Ǣ���o+3�4C���G�+�
!�6\z�=��rk������mS�Ѐ��Z&��Sy�=G�9�jk\3��x��Վ�۫����RB�SN+T�U�.$�]��cR?/��
����:i�%��}~������8">`䲶DuՋ�O=j|��
&��-6�O3��i�\���
+L�Y׍]	�����]g�3���7�j��q�_V�5��������~=>kw
a
'�uJ):6l_BN��k2����^
�R�T��
��"�����)q�����Ǫ;��=}k�/���K�QĹ�W��}����X�Ex�Ĵ�)�[�;�>��e�rst�&�&9�\���􊦡𚩽�e��>���Nы�"B�����R{�M�
9�-��Y'pov&�o�{�ϴmUO�> ^�h���if��G|ȞP ۜ�l���F`/��m
V>v �䒒�u�ʽIh��82�'P�{��+��{�������8�?
*�N���2BI����"���@G-ٟEEkſ)j˯��K~�J���9B�u
+	p3��l���T�E�z�_
c~�p�.m
��yt��|S�Yp��(�m�Vt�yW���b"�m��w���9ߪZ����['�
Z�

l���>o�m��7��_�ss.� �	�Zȑ�T�ݟ}k�1��zG�ݭ���ۃ��tRp��0-�GY}qX@͂�j��r\��=��xM�v�5Us�mm+�����aE���&�I�O4�̍���-�����r��~,{�V������y�����z��SJ�
�Xն������ۋ�~Y�*��9�|�!ľ�"���
�S�O�������ih�y��CTP�b:B���-��W�bRƑ�v���=[���-3�V)U��⾈��㾔ٛ�I�Lc�ׇ��O���%�ݗ��N�5'K̆�	D�8;�U�,�s�V�e�M�I�q���K
�����o
�
�04���_\P���ͦ~�Ӵ|��.h౫�Ew
+mL :r����
����U���j6xk���8���rL�S��^��}s} ��zo�=��Qj�P�7��ϭ��7@�����#�� �1u�ܗ1���� ~{fh��d���SDLZj=ڟ&ey���Q����Q~}w��⑱�̃�gk�����Upb��G��SU�u�3C+�R��{��
/�~=�«�)pɪJL:�-
S�X��^�#����N�
d at E�9_��O�L�]���=�O@��Ą�=-����SpF�CBʹM��lc�'Gjr������
��e���
�;�e�ԍ!D�b;��j74ħ
+^dUX q�3��̓��A�
����i_ָ�?�9�S#���Ga/�3,蚐�]$$Z��E����ܣ�V���� �7ewrd��y����~�#/�Ir�7��§�L����,������s
��|�l��{�L���ĝ��ǖ����:.��`TKy�7
��4��u͑K�:���d�������{K=i���Gz|��Ǣ��!hꡆ������y8M?��L��2n�
��]�=�7��T�g^_�P�Г�F�c��)kʻ�l+
�*��(�e��5�w1=����;gFb��*�fq+��ܟ!����88�2T
���kU����k
=�ဇ���3n����3+��:�G�(1@��Ԥ�S��K^>+��C����}
1ϩ'埬0�~u���\Z�5��]���>b#we5gkl��xe�zo�Հ���-���Z��l�Y�*s��Ku|@�� x/s���"D�^�λ�?	
���^�R~Zjϸ�3yy�㢽z.�6C��̱+�GP/
��ޛ�xnlK�YU������+D��B#�
�����2z�c�S�5,�CJJ[� ~����]D�1�Rtͅ�n�T=���z'$l�
��N?2�'��	qq�A���6z
��Cm��Wn at k
����j�+g���@����_
��J�3��c�Y�3�
e�"�
+r�KJH� x.�f�x�f@���JA�Ŏ�k6*|g�r��⑱��ޑ�Q�+"�lO���~-��6	|�d�w���cW8�y�)�2��Z
�Ey�-�^UkӱA��j��=��lB�~�C��T�&���eO����^9�tNⒼ|�m
+
o�"�3��C
ym����	{�ڋ����o
TƟhQ�_6�U�K���������CMw_�Ÿ5���¥D%['�C��Ȭ��H	����KN��ln�:\`�Zɶ
)ό"徾f�(|������s�0q'
<恑�?Z���jf�u���5]
�6 z���=EI[�A�ؙ��%�(��
�+	��Id�� �1P;/u�*��Wm�>�o/��W�3�����.Q�>=��&CDYEȰ`ޖ�-UC�Um]�5�
�R�G��=Z�㼋
B/=��(�4tc�]�9J�Z��}�o�ܕ1s�j��M
�f~��5ѡ���)����-�6X�}	&y
�C-��>�Y�s����䢕^�í1h�����5A�G�"�E�7�)LԎ���rw������v�Ko�&�YNY
�2�,�ӳݳ@mOb�zf0qGjl�
��)����֓V�����J�o�X�/�c���
�Q��t���=$9��3W
�K�|k�E� �g��M�
7!�^'yGH�T���h�
+�ʸ�>��'�l�����
���f�	?�
��\�Z?��zW�����؄�yRa@�M3��� �/��^�C����~q�����H˪:RS
+��ꘝ�'���_t�	����L*R�!
��㢜��,��&�HˬrJ���@�@
�:fj��W�
�
%�{Bt�m�:�XI/9��	^%d���GG�]�~C�đ��s�p���{8�O?��)< ���`�燑Q�c����z�C�	+�ZGJ�n����+�f����6�=�{T�kV xH>����4�4�Hѽ]a��
6�|��84��&�1[��u��;]b����t��"r�C�]]G������n�
ʚ
+eK�ݵlԑ��<�3ɇz:�;�M�MV��f��2b���ȝn̿-o.
���Ȁ��<���Oسe.cOJLY
F���[���}<s5�n9��:*�e*"���.�C�/���L�����Ǫ��ۊ�Z�*���0�G�,��rc�P+����`��9�
+��€�,{b�Ƨ:�\�[#�o�X%S����.B��t=xw��r�a�
<n���m��r�������z*C�͠;���
.0���
>�Ś|B��H哭q�����8�S�8�,)�e�V
�r�S�$�)�1MNz�
�AE�>� x0�A�|罩��	8�����'rx���W�1-ӣ��
�����㒣cm�-�9��C_�e�耲����׆��ۓ�
����'FGm
Ÿ�+j�r/k�v����'�������m忍�S
�%�jz_��%"$kJn�9?n}�z��P�q�a2և���M���a/�c��B�� *\ѐ{ѯ�B�k��!H�zw�/
m9WlS����큚��W3*m2z᎘�i�k�9��*�
�9\vG^���B�rsk㝣!Η�8N9&�ԒSBJ�
+
+�h/쎖?ڛB���?:Б�O�XD��	�kQ�F.�<R��Дy�И���!��zWƍc%:�H[�_��E���/��_A�ܟ���$Ș�)�Id�k�&�9ǭ�t���#��咑�� ��s�C�K��1��ιn���Z�s|���CB�e�x�
<�",
q�P)�K<�W
�ˡ�����oڦjr|:
���Rf�`ݳ�����m�M�`�P6��*.�2��\�.�mc�hO
~�U#b?�q� /���Zw$5���]6)�|�#���1��������9 	?^m궨��ʖʛ��Ȁ�HF6���&
lR@Ǯ��RQ�OL
��Z�>�g�W��/,��͆�S����ə%�܂MQ+n}�_�3I�<]�`�����>o���i�q�
�hGB�p+�x
Uc+�w�eZ����*�%�L’�x��Vm�.�
v�<�[���xK�qn���O�76�}��&z�]
+}�3Qr�#CD
�h��F&�9��||�!��,6�!AD��<Z�ʺ�;�
�?��͆wFī��Z� ϲ3}��]
�3�H�O�@�������*k�X&)�k���
-9����Ur�/
+q��
����<��^e����I�	J�u
�n��u 
�7-+�{
��@EηL᣷&��ne-��}k��N��|�~�����+l�S�#��b"�BT�G^�pX�
]�N��<Z�ا0H'��'�1����Ib�u��В��n�i'�L�cml͸j
�x
+�C@V�Z큄
�AMv�%�E-w����-��pum��%�$���_�I(y^6f�*�=M�O"����~5vT�t �ki�:V'(�i��D�M�=qN�_8��d���x0�Xp�x_�
%w����rO���/�G�"}
+L�����;�ܒ��<�wu^

q�%
hy[���."�*�E8fPqgK
��0���4:�d�G
ȕ�9t�u�������K]y��K)yG�F��,�L%(�l����U��
+���*\@�a������JW���"J�b6bc����W���N�|f`^д&��O�cF>50�Dl	��mRd��
����@'������ӕ��-@����)_����):P�r�
+t�G
�^�{
M����~�9qy ������J>m�
+� �:��q����e�t��:5��о���y���jbٿmu
��jN֘
����Ք��x�ӵ�w�6�FM
��
+
����J������{U�̀
+
�W�8��� =�U�����zʾ�9}�~�qE+��`�<>���2�4������N�����8!��Ƙ���X���ms��l�
+�{^��$+�2�}�
p�}
��)�D����
Q=xKԆ�HZ	{bn�u��+$Ězʃ�h=��A���_����Gq{n�[U�rJ�.ȋar�����K�C�O�Uv@�fh�^%�Q2��c�������}��
��'�����M9��r���ӣ���'��D��Y��g�NYM��43O߆��/���X�
��"#�۲�,��_�
+�}|S��ҵ�=��G�
ij�v!<D�O�e����1�g]S�5�4.٭bC���ꦊ�S#ចF.ue\�$��qQBK�����G�C/
�ގ12�wT>��y��y^����W������=�[�4�r����4��W4e�|V�[��=^b�:���B�|jT�u���
~#����k���6��OA�s���E
�t���G��}�-���O�;rn9&+�� vT��C=}����hU�j�q��b
�"�U,| ?��B߸�r?��g�)G
,���ƶ�,݀�����T�J`�
&٣�)���H�$&1�'���qh
��X�D�-�0�^�} [...]
+~t2O��ok�ħu&�x�Z�u����F#
눀֮�9fpY�n���1ě�s����
5�&2ܫ'�����6���&&ѯ��-SȨ�<
�u�������x��٣mb8d�
�
��_tc���0��7
+^��,#��N�k�N-gg��'&&����^���d����IW��o8Y����9�#�$�HM�f_�	���,���� lJ!�U]y�M��/���M\W��
�2L)H�y���O�����ߗ�a���7�����	�h��;bZ����������240[�y��E&d�f0�.9�2B��
„XA��"xX@� ��xhld8��=�W�M
�X��&kk8���P�]�,(�9G����:��{&=�Z̾
���w��D;�
�$�힄��1���'F��%~
���l�[FLs��@�=\x�x�))
P�2��,���q��|A�R�bw�X蓑J�
��=��M+�U���R��V��|GA����=Us�3+��'*:�@G�؜@G>��n��zkj:���N�لC.�5�M?_�0�خo��V/X�&�ZʟxT
�	�F6�!A���%_�k���B�|Z��B.���$�ͺ
hn��
eu��Xŋ��g�;�S�N���̣���
�3�,
��jC�9�sjt�m
����6آ�W'^I0k.��H����{��g���'z\��Pɓ�e�`��su�2�W|�h��<
�E��y����H�MQ�y��ѣf"7��+=�7���;e�T��P �/�W�t��yհ�O��}%6so���Fg�m�,ң����x�X�f~�M�M[���Z�>�ۧ��5|��� �y�l �98��y�Zr��<��p���&��>B��Z*�i快�
o�����'Us�q16	-kOB�^�.�>Ǐ�F+H�����h���U�����I^�W��F��	
o�g��zɾ�ԗrQݞ���pU�_)�9fj�{S�D��]�V�A
9)���|Bt�4'��a��o�E����F�W�@۝f�:��:Ÿ8�p���9\�JO�
cKү�����
��B
/~�~{�aCL��/Q�GFb�G�I\��}�ԕz9x���rc�G]OtȰ�����'L�����@�
h�嫽�e��_���R��Zj���
+B�OAL?��+O�x�����':d��}�`w����X哹��{#؈k�Yh���Ӆ:����c�Q
5��U�0Iu��p��	򋟦�ᗝ�j��6��P���{�N��}%�9Z��xO,C�7�2o�茓6�|���.%fXD���պ�O��GF�H�˲�J�o
�_q�Ҁ�C
.47����m#ϣjf9�^5����D�+Q	N%2�9G��ꘐ��
�p����:د$f��%����=
�҇�85�l��gg���:R�l����� �Ł�

+�FlS�ћ"V����*��D5eꮒ����%
bX���oKm��g���ڦ�T
��~=����[%Ȉ],�o �}ެ����4�;C)�u�Y�l���w�m����BA�g*�w�/�n�� ����� >A�\r����
�ᯛ��?�)�C$�=]�rg��A��f�7���A��/����m����j�i;��'~=
��rn��)�Z&��c�sp��8��!�G�����
ٜ@�Z�����gY�!1~�������	>5q� G��e�"�zfX�v1.fWꨗ.I��
+s`�#
�eVY��푒�Niu�_Æ����|�����P�*��<��T�p�)E�#�!�ib��X�CSG�/^	:�7�M:V�
ύ��`��3�
�,9��2�ꔣ�8g =���
�	�^
��t����~
�R�*��AC at S�>20a��K�
a��c o�s��º���C=���
+
Xcl�_����*^�x�{S���:֑��kc
a�Њ�\�3�}2D����)p�V��s��e���x�Os)H�@/�����}	2�=Kz,Gݒ�x����
��
*&l�x�Bn@
Ԋ�����e
h��1p�CR�
�����
u��������ť��Xg��8��s���m1��khy��4�}
§��:��D�,*�h�8�~�'��gq�G�๶����i��
+[�I�m���Q@�!|�h�<X�s��]�~����?X�S� 7k9�}-�а�����ՙ6��
,����Qr%�������M�KV���@*�{U�,p�[ߙ��o�Rr���q��@��q�kl��"
�T��5����w��:�O�K�̢b<���d���˂�|��,f�I(����}Zg1v'���c��=���‚ؿ������}��ms��u!8�`��3�W%�L���q�B� kJ�y��]�^���M�,�+xU��:��XG���8��ݕ��,��
��-�h�4%�2����6V�,�� 
�Ԥ, �cmӤD��S���Ĵ
����!C�I�>=�`�3
+}��]P����2T�� �Q�4=3X[
��yjٙ���C�Y���g�S���B���S

v� d�j�y^<ag8��c��)FD
/2�n!�5�K
+���Ze�޿���'K�r���Z9�k��������}��!z��	'���?7��_��Ȁ�X�!ߞ�
O��6����
4꓁������?M-�'�F��]Z.zOU����8D����@�D
͑
+�

�#

pe�c�&��T����L�_���on
�<���.���W�A�g��5ɇ�f�钠��H.��I汲���KΙ�S�i��.��#
.p)���s��Q��}��Ľ������#�x�.h?\�3�s,P�z�Zʑ�^q�"f���T��"bk��Y�:�+�M�+u��_.t�I%;��8�xի/+,��:�fՐr��!�3L�gA ���G���k
Mgf^�k��4�9�Al�L
,�gln;Y4��Ԕ��2�|����Y[��!ukj�摪��BD��f}�KC.���E~=)߭��?��<x
��.�*�p��x�DG|Zg����C at o
��h�E6�4��E�Km�}�g謸�c������m��]�p
�^6�J��p��np
+#��7�����>�.ۯ���ڧ��>�7�
+�>�a�
���cS-ť���r��S�'f�m	kR�bR��
��<Nxc
�zfA#�����|�Oˁy�\�W�@�i���Ze���
���������n/uV�^�>�M�z�
�Q�G�w>1���<B0�@�K�*�\DE���(�^5��� �A�2/[Dz��&r�ۧ�
z�$�
�ȣaW���~=��pK��6]��)��v�B_�g�	�
�l��'8k�"%�
/q�68�6S�ȯ�5���N�#=>]�V��0�̢�( �A�Ra`�y�:�P[��3Y���c ��������
r�a�\���P�|f��.�&&��T|��RS󞄐
x�g~5
�U�A��>�~�����6P�g��`N�c�
8:��,��wd #���f|53�~=&gGT��&E'��5
+NV85zJ�VP�r鱱��u��z,s�����P�3��}��u��p-�B�갅~96��H���̣�̳�^MM�Q������7	4H�[�N�,21�k��?,̓��[m
+L���@�\:�k�dnKaa�Rd�
�駋�ɍj�}�<��1r������e��~
���H��9lҙ���bi�Rw���u�ʿvy�/ۀ����W���	���\*R��5���+�?\d�8���\�{����<��*��F'�H1�.

u����tY� �
�WM(ؗ�ƚ��uzu`��1�c�g���z���v销�*¯Ƥ��ӫ���S���{-76~Yml<Y�S ߓb
E�؛&&��\�_%���)s
g���
,��+,��Sa��*b�WE��d�Q��h��u���d��
+hi%@
���S.��U|�W�,��R}Jr6���N9�L��}Ym ֒��nM
ѧi�u)x�}99k_�K�C����o=JJ
���Q�3�<̫$f ���6MH����7G�
�夬����|
�.�ɴI	�


�5 z �3��&}u�jS��|
����Z�T�wײ�<*F�SA�r*In9�<�	w*(9'K<��
+�zs �w�T�C����{=�qn��S3�̜퓮������mٲ-ي�DEJ�(Qs� ��s��,KV�b�9�9�F#������3�u�އ����0Uú��BQ�D��[�
��֣��Ft�+�������C�nD�m���������ɏ���DMbr��5��P[+�6%?b���|�朗݀X�U9����u���]�o��c�ʜ��f�#b&Z�����vm�~���ڃ�Ɏ�pM�$�Lܶ�U�ʀV
+k;�nNt�-<n>`�Q�����l�1��t2��)�����'�ٗ��y-	-�$:A>�m���|v�E��MHY�7yv
�x墔G�@�f��nG��K#U?,�*ߛ�u
,hYUc7K�l�8L�A�!�l{�S;٭s�+���\���W������5���Y��(L:�"�-����$�J9(����H����+�.nS�����qC+�[��4�sq�����A�_R>�(�3�G�ɬ]�h;�
+�=����<N9d����^H�^����q
�qu���8D?�>�*N�x�k���E>c�P����:�R���y�"$��2v
��iڕ�!J>~O_ at K��2\�s�@+IX�mA��is�wme�#�����u��6zY�ͨ�y�
I;�z{F�J�E�ĨV��f����
Ӣ����^�)e�?���f�a݁��������
;b�^�����Չn�D���emkoyE��ȿXo�}�X�Mx�W��NP�<!���'�d�Y�%��oֵ��zq�Z��fC�Eoش0.([���_+�sod�ЃP��������i^}�(''\ꮕIA��[�ɥq�协�n1/����Ĭ����֒cFsm
��4�l�5�X /l�v1n4���K��PN�u�f�(n�qr�Q�7
O~
+N�
��;� nP��<R�:���S�	
�\p��d�̩�L�kV^SNg,������MĞ�����8j�P��nu���԰���W���.}	����h�g�?.�
+�9›����8j��}��i���<�;�����؛J�Ê?���F�Bf�R�Ne�/m����ܪ��|���1	ie��Ư�8MQ=��uI��a��cSϩ��z�a��)��
5Ҋ����K/Zm�rkP�Z�yzn�M'Z�d�#
l936�ŭ�K��Z�1�vji�^��{�Շx�����!j�P�c����*��>,�����?_o���.��aUy3����)�S^	/3��¼b��4��q��;���/��hE�L4�_��»��I'�m�+b~ps�iZ�����g�3{�%��ϨIJB-�Z�ή��Kok��:��͠%�"b�&h��kf^]@�qnc��D��iI9���K����ϖ��Ү'�%[
Ag��y!8]w`s���
p��������2b`�V�6�q2��oL��/#�W	�)^��~Á����U��p[cA��u��5hT�7�J��;A��Sj����g+���G�(E#�M��qqZ�63$o\7Ĵ��Q�Y���}�/Z��"��r��$���"��}�.���
5�8�#�y�;�ƙ������%��|�I~U��%��Tb�sū��S�Ok����Պ��Q�kc�ҨNA�qK:NEx�ri�E[�⋎#K�IǣQbP����/� [...]
+M�*6�(�>8E��'a���<ξ���[�����fԮ�MP

��~�>�>�0��k��vǯ�Ko������$�1�ʂ��
��
_�K.����O���Y
fN��~
+:�R��m]yݖ'_���a�,��G
*aܡV����WF��S>�
+�(d	��3�;�zET�.G�""��.���v��<2i�-����N�,!���
�d�yþ��]��H�+�
Ǣ��+��3-aW�c��È��˘KȎ��i��/2�)�?��˸ �����f�+�a�I���������0`V�$$d��9Ĵ�q���W��8
�=��)?�����N��Ѯ�?�_4���D���]~]u��,��VÑ��W
�d�pb`%X
6��b&&hJ>b⃗�-
�N����l��χ'��i����/bm��Ĥ�]�0��S��YDHYdԘ�_�4
��zn
b�a6!)j��������
{$�L��(h��^�0�t�|����$�j�."��&/i����_�[:�G���pO |Z���z>xnqL'!�5����Z�[��u��+�;�3x��6tqc%=f���F��vn[�J��9�z|�,jtf]�����;��b8?I�\'h���T��?�
�	�~�t���_7�����kQ�����(�jh�xns� >����+1c�����k�1ۍ��=�*>}_�ؕ	����!i}p\҄��,�(hXn;�w�������͘��^ҥRF����VL�[�$�{�I
�22�r"ndV�c	5=3�
��z��%��{{#&akx�y5<�g�6�
s�.��\O�;W���f�U~���ۥW��_s.���D&M1��mi�U�y�q(f��&��o�����	����ז��J�ξ�1k�t
�$�.
�0�|:uu�~qSC.L;X��>�(}�r�{P������݂���D���5a���^N�����ݐr�������O�K�z�.�q�()���؅486b�\Y�j9��:���[}G�[e�&�"�{�r���¤����(����q���y6j�0
�@��uܖ�G��0+G��U���I�����L�F\?F
����s�ZO�_�+���1��+
�
7S��Fڥ,�@Υo��CB]��Ͻh�v�i�כ�Z��:�՜GH��+�[3
+�#�u��͇"
'������,B
+����(���K�J�d,�«��I�~mH� F
���T;����	)
�
��*�F^-j�av#
+�np��Q����w_�O	30��
3�H!��isRP�9"�_�(��)�b�5���!�SS6
s�x�KD|��8U	;�$��9��ط��v_� f�R$��ljX�����yV���X�锝�~�����5����
�ZwD'jqޯ��w���I#�Z�.hOXM+���g�fohg75]̰VҲ2L�0�S����
b^H�@4�[��㌓Υ�
+j�Zf�ҫ���~k>��	:���	k�:b�e�i�x�+
�1<ѐ��+q��9%	G�*=7�7����{��/��p2�Wf�Ra�$��OpK�:%5����=��a�Yǝ�?�o���~��3�嚴��uʅi�\���nA����K�)?��:ļ�I;�Z����U��|�;�Z�3�O33�ޭom�p�u��۔I
X�
L��	��
�u������\�aIu��3X5��f�r�% G̬jЪW#Zfy�����	7�%a��/�j�~s�xn{V9ѳ�g^��}Z����3�#��
+��ߊ�z�7���
�8���ꕎ��
����A�O(�*fa5$�\:bc�/w

�U13�ys�p����
˭��1՘�r��
+�ӌ]LɹT��K�
�u�
ߘn\�Cϙ��Z��-���=�Pl�*�SЎ~���Q
�$<�tx�M�O˯�LR��&nն_*ܞ�K�N	5a�?�p00�(��6O;”S!H;�>���2°ߑi�儞^ӱ��Z^��;�y�ӆ_��/�
���ц��gU߮೾'$�AM7gm�W6��p*6J/���
+
�
�H�~��l/fS1��7��
����i򅅡�á)���X{^`�prs����H��M��2��C%I{��
�٧M��_w�o�v��У�	���4�4e左����t�Y��W>s߻�e`��d�Ȫ唍)Q��;n��	���N�ލ7���;���E_Z��>
��N�Ť��_��t�}�doB�V�vPJS���	FYDï�j���q�/fwl�u�vݹ��qѱ߭��?��P��o��M�/���W^��f�
��
Dm�s��z5i�2����K��'�sW�Dm
/�WސOm���}�5�€�R���2���S�M8x-I��3J:B^mp�qmc���
1����鹟��1���T��
+���LZ�����|罪��[%���IW������G�|D*�h9����$j��9�Y+�k{h�*�.�']���\����Z�1�z|m�����t�@8����rs<ʦ����x�Q���l��;fR6��NZEDG����9�,3�}/h��'E5�gj
�*2�r�1x�)��?�ط>M�+hX|K+4V�q�i�qµ�S�K;Y�
h���C�Y�*8i�Z6���;��~v>��
���9>-��wf�B
+b�7e
}�Q�F�첍���
��]}N8�� z�Ŭ�۔v�(I��sH�h���z90�v�t�
�:�IZ?n�tnN��}�v`�e㾥���.
���"Vqg�"j�����y�b��(��1ε�qam\���?��[��VU����#��x�tb04�S�Ǭ�ݳ��ʵ)am�$� �O@�ԯ5��<Tw`u��
�컕p�^��	���1)%���J��3�gW���
ܜ 

i���{	�&�!�M�
��� zf~�'<�||8bcJP�6&�^
�/<#
v�n�˘��DŽ���=��!e��f��ְ�~eu�|��1n ]N6�}������c�)Ny
+�j��	�ąwԳ��ڏ/>o9�j�EI#�,
�ey�חx*�4���W�Z�
+���ב3>
)��Q����z
�r�c6	)n��9�dx��N̿"
Yj:�XiUi�3��P6v�2`���$�	�F~��p�эю��iZ	�b6X���]a
���g����}�}�2���g�ݪ����$��r��b��Aݾ�!����MM�,�.�"�]|R�}p��G�LW�Nmk��
��Z�M�/G�BV��'�[O����)W�4�G�'��d�r%x#y�*hAl|r�/Q��BF�H)O�)eQ�#`u-⎠�S�9B:9��z�����<O�6�χMl�
�V�r�n�髰E��ΪzSV)3s��SԂ��׾��26!!e��̒�NAޜ� �B]򒮖�i/�,��e\bz����p��Zf	���%5��������oL��4{�ʞ��V�r�iYO�:i�.�4
�<.�}h�f�D)��y���3
+����O"p>���#P�c��I�尞W��+���I��#�e]�}ں?8I+�lb2f�1��뿴�w���X\
�^����-߿1R<0-k_��!&�1�(�Fx�@2^�$���>t?l��^�%Ms/�uڮ�?-=�<��5��Y�v
+H8?�����th�v��:Q������o�G�� }���*��C�+�'�k�/EՑ)~Sd��o8���W��և[E��ژY%^���y��^BAt��G�'�D��P|5�~j	r�4��V�(睷+��k��Svv]��i�yx��c���ʾ�yL<��b�#�.ns�@�
k��&���غ
<�rt�nL�kf_�΂ǣD4��	c���T�	����V������ʈ�� �K4��:�Ÿ�U�Zx
�K�V�)K��ͩ֓I�����
+<�
+jW�n	w�/�!j��V�����yX�EH�Y�~^uk{A}7j6��0��>V���F��m
+N�_^�>�6�y:�g��<Ju��s+�g�-����\�� h��X��ʨA�Ž�KDD�{3�Z"zZyfF(���Ͱ9/�>�e/���N
1#�﹛�JA���	څ�4��z��</��$t��-s�0c�vl�.�s�O��kǹ���ী�W�9�)iY%�3|�/
ۋ쎔�Y�:�vl�y�O�InU|Z�g\	O/��}�S^�t�a������p��qg� i�x�i;�2�o8�T��n;��\�d�
��
+�|y��G}O�����
�⟋*$�
�kU�-秝RvBO�����7�Ǘ>[yI�%:�"F��ҨIN��:�*Eubf���D�n;�䇦Eu[3}��f�7RPGq;�)��5c��6�	�iF���u��3rb��g�Bj�/��L�ڨVX�����S//���5�K޻Ur̤�,�!
_}W�=�9��7�3Ko��Cu~�m�5�x`�Q�9B-�v
i�����"v�$4�.��Ԃ��[6��z\�����ꧠ%��]��[�D
R��%���P�N^oy���›�_7��:Ԗ����P�=
�
Cf1�#)��%:�xp�Օ?�\���i��e�M
+���*�4�ⰞY�ڤ�ܬ�/7����w��<�>N��Xd4�&"z�6����(]�w��^���}F&����\�8�4B=�{�x���4
+:�]�����t�����
+��ʿ�=i?5�������Ȕ��g������[�O����~^��� U�6^3��������]zJ����]�����a^"�Z������oP�X��z��a��I�L�5H��V~����%
�4a������g<RΖ_H�{
�֞�z��į�nu���8�\�,"d-�欝ߒ�p��6�e��y
5u�N:ص��(y+oE�a�*����l�Z
4�
s�Z�Y�
� cV���IgFe�Hq^��'[�}�
�S.'�y�IN`�
+]��S
f�_�W�����c��o��Aů��L����RN.�f�w����y
%�Tu����/�p����L�vK١)J�쓲=+�+��Ny΢`g\JQ�ȫFmrf��+���
+;V���-���� �KY��-��:jQ���=��K���I���{��c�8��s4̖���WX���Y����?,ɻ3n�$	^;ia׭7�����7/|��
+�1�U�1�-�����X�I��[�p�%���+K���1����K�I+�6f`�,�nܷ��vo�M����@���k�!�k1��5�[RV�n+�Z���ϫʹ�[!M�M�
#Qj�Pr
�4��H�ZF1~�KtZ
>�]�9�|p�i����O���yewfF՝tK��~��[�v	�ٞۙY�`
4��dg��D�	Ĭ�&�}Q�oH'�.en^�ֵ䛻/�����Cۉ��\����0���+���x�,��
+���������G�	���C!�����{E<7,)���~
xU�,t����-�W�6
X
i?� .���-�!����A�0�T(�:�Pe��Ō
�E�������A�^�y���
+��!�qZ	h����;[^!#c��z����j8�Y�E3���2$8�X�_���뚃���!��������*v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZ�&��b7������Md��n";-v�i���N��DvZB��D��A�w{������O�/�7�ʱ6���v������m?���N!��n�����_
����=?W�ڙ{���#��A{��4
+�
Y���$}�g?
z
+
�
�sh������>9p��#?
9q���'�
=x�='�r��_�8~��Ǐ
���<��/?
;v�ȱ#�
<|d:t��Oǎ�<y����r:r�ɓ���<x����A���c�����'u��?����}�﩯���I���[r���>��%���_�x�+�-&<
�)������I�x�����O��|\N�W
��'8���[*'��i�s��=���/ ���	�?��'�ן'�
�8t���
���7|�w��S��?oωc������3
+�P���+ha��68ū	�8
q
�!�f֢fҕ��\7�*�6~
�q#^��%?8͸��"Fqf�1P��
�K��Fa>-
�VڵIq���l��p�
� :E-�OS
Q�JL�~*i��b�뷢���-��ത%0ƾ�9J�
�����쫨Fږ�(ys/��+o��	��%��<�>A�e�]��1
�*�d��5䋈�U��
��C�EL����Y�1�W�v
G���mwWW�&"%
��,c��rA�&lߘ�,�k=!���sJ�&9+���S
+��;i+�푄�!�ם��^�������P˱��W�d�EF_
j;6��v����+���,���.<ޞ9T��rfT�)���u�YBN�U�S�
6t�}cR�
�5c��n8��ʮ�8D4xPSVQg�����%1=�6��\�y5I+�za�������)+�"k�ж�rqƩ��'���
�c�bĢ�v�(�g\
h��QX��[�L�e�]B]�2���FMR�,$�
��O&�Ϊo�<b&���N!%�t�M��	=�R�B����e�^x=���9����ۚp�Z#&Ƶ��U��D�ƮI9��K�H�D�/���SLM��̀�V��%_JX�m��߱���Ϩom��f}*5��R��Rz� l��v���J�ZC]}wӞ�gigw/fW0����
+��$k��iL:���L��sb:N%j�В���I����ɥ�UO���Lبe��Z�R�Ft�Ij��f�/�����W����I��oH�c�KI;��W�D=b���J(�I����8�+c��+���CLZ!�
O�*�F����X��Q
�0�%���!�5��Ӎ�zzBz迩�_�z�)�L*L��	�<�gW�
�ք]-�$�Ô�KϚ��xG8�j�Kj�%i��#n�7
u]���^�Ћ��E��n�[~s�O#ߢfꕔMH��r:j�3Q����s�l
+N�&�!��I#�8��5�
�֌[!��(TI�R5č��iAu�,jC�����K�+��~+�Z�U�Y𭂞Ъ9�q�����?�?,����P
���]����.�����
tZ؞v(��I�ə�E�_zY�U�@��4P
+0�̡�v	%�O��8q�K��W��b�ҡ8_ύ�Oݗ�C?��51-��p��V~c�Ω�89�i�*�ԧ,
+^�¨D��+ԂMLJ��̔C�J9������)xa��3*�M%ļ
+i�'� .)+u�������~�{�z$�W�I�u�I���̌�:>�'�QHSv~k��,G,�
7�$�VEm�gC&�y|j�P����]�t2+3
Fu�ͪ��(�6&'F)��8��2�Q�&zɦ�t.` �#	yk��>�,���o�Oyn�F�"	=n���,�M@��S<"&�!9�V�`N�sʹY/���E?��1����r�Q->�\�
w��v9���Q"N^��d�Oku?�O6�iW|����?�nXX�7��U� ��ӫ�6�N2�d�2^�/']��)���Isn�4�q1��s}���>κ6��Vn�D�g+o��?���Z�
�o��Y{W�]D/l|�&�ꮨUB]�� �X��Y;�!i��Ǘ޶�ߜ�_�Z�q�幧�k��"��ڸ�}
��.G�)׆;~1ެ���[�٘Q�2pk6�Z�n5
M�W�nN+j�T��;	x@��ξ)GwjU���9ieVe=��v*��qPKfa{Ҫ�D�����5��I��qc������߸���_�F��Ф�q}�����~.�v�Њ6���{
^�|�E�{U_�
6��Rv
�c�xz�e�/���
i+�$m�<��he��� ��Rg��Օ�(�[~�$ig�"�7�[!���Su%l���Eؖ��y
Rƶ�Y��!_͸;�B�u������'��^
O�n	{ۯ��mA՟�H��MLFlJA�B�&�"V��I`���'=�5����M{�¤W�\�P��+�#72s]��1�[辛�S��x{oC�q0�:�'�V�鄵�|��p$hh��'_Da�1��[�
v���T��+õ�Ŵ�Ƭ������F�*&E��Ƙ�]��ym�EԞ�)U�W�N.����g��/WwO�!a$]�Ҵ�^���:S^
q��7
��^в:
X�����L��E>�s�ak��n�r��$?#f	�����?@�J9p^[�H+M�X�	;�:ba\[�h�s?(�f�)�0�;�9�-Yz�y,8N9��s26fu��m�l�ƴS)I9��I�J�X�̸AА4�[S�Oж��_�ݬ�<8ίKZ at g-3�,�%`fV}΁O�S�bV~�:����$�Mh�W���=�4i�'
+3�Q��u)E�o�y���_������8�����攇&h#�ӡqzA\ϩD,�z���CkoП������
1ϡ6ffg� ^7g\�v9+	u�ZԢ-���!a%F��y1#� af�&�c&^]X+�
Lr˃�,�K��xǩ��M��C���Z~��;¡�7��1v��;��Ȑ�d�y�w���������	
�.mQ���h�X��tl�{nfa?��3��K�X��.8�q:�e\���I;"b�$h�8䂴K)�y�������׎9E$��k�l���]J��Z�
����t9�h;
�,����Z[
m=��8�����B�
j%�
7����XdT84aeW��w0����W��fd"�'�`>U��`�%$�mP
~)kN�ޚ��23Ra
+�gk��iƫR��zzq�)fm�ż�_��͈�i�10JP�T13��4��I�Y����8u��x1��d�o�FNm��-JڻU���O]J�$d�/��$
Ž���̬L�]�[�}��e��L���j�����y䰅U5?B=�8�,�x��|��8#�g<
+yp egT���c�M���g�.1#7�s�v��=7���/���X[��B��si
�2��3s�[��]#hn#�4j�D4����Y\^�ZyM-�p}JP����&1p�z҅�T�ѕR^`�_5K�˓�B��?a��IԤMB��U1#p��Z32K�Vv����‹�C	��}��ӓ§���%a�R�ȼ�>J;�1J���#
~�_߱���W��
�bG��g� ��6�}޸7<�.\�"�i��)���v*���)�k�)�k�%��<��
+Z�t���Qr�6�HЎ�-/��V�OG4���Z��š��c����v��ǔIŏ�8Uc���W����'U_n
�O/��i��a�6�p˪�� 32zx�ʰ�riSG�2� �Ĵ
�?@{D
�Z
[r^)���
�)���t ��Z���_&
=��vd�.hO�����$��
�3�c5nhI6�8��=����K��瘍���hD�t(�
k$_L98u)�����x�J�:{�'�^�@ġN�VfY�ʪ@����_�J��<\w�
uo�%�=J�֬R�~^ٳ5+���z�
�j9��
H��}�F���[�9�,3+�b���՘�ߖrH�I���s���B��$̜*��S�g� 6VU�@��:��Y�60KRn);�뻟�鹋OU�ZPtgf
��jHϋ�جT�p�'����xo�z����L��:
|���v��ՏB
����dR�t���MI
�.�'_�詅q
�Z��nD 
0��Ô���C)�Ġ�{�>x�}�U��z��Y��e�&�W
�#>A�"hI;�UQ}˩��o�G��� v/M*۝�)g�_��i�e����)2-n }T8�y���d=b��ܲM�(�
��	�Y(�fbA��|l�U�K��~��D�)�
S����0�wc���‹��{5_ަ
�;���Ĕ��`]���NG&:OG�i�"Ӵ��x�I�@+��I��&Fy�%aD��͉�S��6�
ҥ��xnc
|�tG����?[n\����׹��u��B:zQ`�z1��F�)�K#mG�O�~X
�\J����^
����R�6�����G�g��v
�K;���Ns�{�€�4p 2E��ŪL���-8�����wd��)-��G���:�͞�ӯ��rIfA�ǜ=���w 
����
��v5�f�]�w�㬒�W=�x8
)�5�d7����U���q
�8�bTe�\Bp2�
|�:�o!�/���/����0�J�D.�s$n�+�(�+��s���_*�%ɀf��(��J:%���K!L�N���O0�0[
2هe�����'���,�B|JP
+�7�RJQ���o�=N����)vUҁO:�5D-���W*H���_���)�9��:�43�T����o���w�)���S
fg���}�H��Jy�	��Ƹ
� �ͩ�ӨULL9�9���
��s����*�����:�&f�1����f^s���
L�y�E����:>�,	���F
<t�D8���ڗ�O���1�~*`��-k�u����ߩߗ0���:VYD�.�e_�'m�����1D���K�&��7&���K�͇7'���k���%tx
�Y���<������DI8���Y9���K����������W���
6�
V��^�׫�Z�l�����׀�y�����f����o���
��"�,�ȸDԴS�

Xi;�2T����Ꟗ��
��e֥��$���S�"zviD�,�
'�
+L��!fVe��kJX����%�]�E�����փ�{W���phs�x����gD'h���%��L�ΔE����ʴCƎ�%Q
xh�Y���5��
X8���ܸ
t��{0
u���h[������"���{�%�=����z�=�{KxzY�+b�]�F�Y���~��\x�>����t�_b4��ϺUʌ��z��{�<`��fVE�Ʃ���0ڴ?X��
hY�T ~��:X���]�y���S�o$�x�1���r	�i�y��	8-B���ܼ�����p2>�qr�v�L��31��Tc�y#&fY at Cɏ���8&;d�`|@C:�r�;�p|��Փ��嘇O�Z�+��=wq~�̪�gA�eger�' �<�5�{���[%K��M��W�
+�#'��E��J��
����v�5�G����IfA�+�p�ffUPǸ�ػ�Ygw_��o��a���S��:�W�l�z
�&vuHǼ}��ŵ��[Œ�E
�zV��q�ޕ�䳘CLL�ŧYe�I!0.m\|-)[
V�A_0?^�
n9��/]x[�/�%^@����ƿ���4�yDO��2�qbc�^�2�(�IkD˭���&W�c�"L�.����շ-G췋���+�1�FTG����	���F[E&[������6�iR6tp;�uf�R#R~x�� �o9�1�
+�V��m�

�OX�,�넍�MLK��"z�ͪ
�Eu�6Ī�&X���U1
�
��j1�LJ���m��5��L&fQpQ���4KI�	4�SL��B�~F�X����#伄Y�L��C�BrX��
+�����y��Q(�6)�B�� V+d��V
75
�[Z��vJ1�f�dss��/fz~�z��1�(��"7#df�hU9?������{�k���I�Z^�'F ?�:ֵ��U�
x���Y���
5ӯF���lb�x�
+��s�]��w'�P0�%�㶥�
	�:7
�D_�
�ܞ����]j�	L��
q3�"a�b�.i at O��:΁c����>�]��z� M�\RF��sr�G�gR�u4�࣌�>
u
�_f�Għ���*������Fŧ�������1�2I�''
r6>I��嗡����s��ݚ�1���މ�9���KC���t�8�=���t(	��W�c{�y�e�"�@�2�U�R���INE�j)j�U'm*�'�q=�`]K�ߘ`a)=풰�����IA
j
�L��iY�ڤ�|ji�Mˡ�QR~ʢ����2�:UR|(
+��:�|p�]���jڪ����}	�	��
3*Y�^܊_W�i��^��ys�qd����%�+C��i9��J�EJ��)�k�ʿ�t��a�j^u�&�#&���5
�"��<������>�i<�q�%&g�.
�
^}�~:cWJ�.uxk	��1�%a��g=�&6^[ |
j��Rξ�a
������#��Zf)j�Ԡ&^S���$�R|a�"cn� ~i���
8�Q5qk��)���4`P�y�1�3�yz�}�7���q��3���(MZ�줥K�ϐ�K���ӂy�
�n{fF"؞�x��>@5�z������;㕰SN'zi{V}#���Gq��:iU	0��
���<@�0�J����ธM�Iغ������eu�}�
:�fd�m�����̌��p�qv)�_���a�d�[���$�m\�y�TI�J�PJ�S-'SV� ��8�T�#F^m�Z<��ss=�s��Y�\��ޟFm��a���[)��fEaOҳ���km�rE
�)l� �^@���,�a�;�8��&��
�u@� n
LsJ���I�Y��DM�#�_�����!�-��L���IZ�^)ܰ�
̎���v)0���LE]�
�V���ҫ�A��)�PI�N�x��}�&���5dPC���V�����w����5�Mʮ�da���>��M�7�Ɏ
	�i�)������i�\�vv)��4�w.��<�6B<�6ƺ���Hl���U�P.g���;!1e�,���f�I�_P#�%>f�Y���o��M
2��9���@�+�j-=m�9��T-<o=
�^�X��m��}��.9�qn��Xۑ��R^��6�,�8����ǡ$Y�����:�zl�m���)nE�.y~^{�-Au�7� ��]%�Xl�$hr�V�����?%&HWfq���FJ��z�I�g@�&�BB�ʩ��h>���^M9�E������9n>�p���
ϏXD�	�Z�ݹ�0)�CDLyD�WH�͉x�$�Kb�fԄ�Q�Zeʩ����7p,N��,`��9���GH�Y;
qm�����A�@�]b�������zЏ5�;2�H	�J�n�P�����na�#d�":j�7�M���_H�� [...]
+�>�=7��U���;/ߡ��� ��|�p��M��n�}rQ�;�Q)��R
~M�����6�|������Ӆ�
��AN��� ��ĜR
b�r"a��Q�>��oK8�-q�����K�d����FP��-�s�sޞ��9Un^"LzĴ�EΈ�%
!
�*n�t��m�[�{7�8��3��=����0��ӳ��>���PKV��EC‚OS�7QGww�."F�¶�Yи9�-_zK<�1�(�?o;6*����j�W��2/
u��1��'�������G�{P�>�c���l?��%�UʌYq��������ʿYy�x���=�!�����E���/@�1����G�8Ua=�$b�� n��Q�ެ���~Q�¼|2~�u�[7����Lj�	=hc��nT}��LJF,�M��A
΁�)~��f��K_�Fȗ��W&�+�E4��+��S�믢&A+�+1�ry��L@�(� 3B:ig�(g$
w��������8�
v1%��UF�rb��#[zZ�,go��om��o}XT
@�p�
Fm��y�gk�(�.��K�y
9���iߍw)�����%�	13�,b���&ѫؘ�:h����9� 
+�>�P�1�V(��;���qv��s�ٌ�����C����
�m��
+�I��#,�F,rA�,�
��	��=*~���t
��J���M����c
���
VS�//!� NvC��=���S��D5�#��M~M�������9U�2�WȃZjհ��>D��s� >E�}73���i��s\����QSNn���s/ɥ��W+�>钦�
�t+�3���~�2b�6oLъ�6N}T�(F���,��4h�
�9����h!��Ӽ2���[��̼���z91nV��gQ�eq����׆o����L�ͨYɌ�U܏xgߣ��f)��ʘ��`�
i� &lj�%Q�<Kc�(hH�Ą�AN�>�8������g�W�k�
�K욀�R�>ޑ7���@d�q-c�q��
�_�{��)A�ܫ�è��IІ�y�1
��p��;UÁ�I�]�KΧ�
�rj�6~kʮ��]]����4

k	'���~�3�J�3��M#�bV��ϨEBNhO�e젙^�2D<��T�4`f at G��X�0��q����ŧD�1��`x�r�W����ǕR�u�MР`Ͻ�������*�=�A�G
zl�-�|\/��N�4jR��� n�Rr�{v� ���:.�k?�oȴ����؄��[LG�{@>�w!�=r��kʅ��
��|�j_��-�=�_�-bU���
ؚ���}���-Q=�1J:P����pZ�^	/

�:ü���Fj���\pRT�st� 6N�Ѷ|}��.U<ܺ�W�a�֮j�%���
a��43L;��vI0�����
�vuO�%e��BH�.�{E<�9.i�1��\O8�n`>E�S���Je�'�N0��Ջ����W���ߕ�x��U`�=���\�r��w�z�id��jI����Ǩ�%�=�݅y�eq
�2���
�I8��O�B��ד��')_�}�- ���0�\�~^�J���lJ��p�`
+�2f�'�BЅ���_*�^P�|���kE}꾈QA�Zd�
=�|n�����|B/h�:"'�;��]���8p4j�Q�ZN��8�4Oix�s
�X&�Z~A<�
+�c&~]X�M!��v�
#?2ɫ��	?�JŸ�N��K;�
+�.���5��UEt����
Z4���&�r�6�݁���:O�<jػ�����;�Ѥ��C���M �(��{���nU\ǩ������2�D8�sR�7&��g:�r��NZ��Y�LXAO��l͉X�s\ʖ_�įUa�
U�z�9j�7��o=��D�����
/�~�?c�q�'���꾨M�]���}�0�}�9{�ag@�y&n�$���SLM8��1�6k_�,�����y�A�����3�V��v�%Y�%����泸��s�g��	gWW`�sm}�z
0�Z���%���o$���^�&��n!	up��@�|��A�
�V}�4��3���6ցA̍�1kkFH���D�L,Z��6<M/��a�1��R3���������R��H�#�<�eq����X\̧�Z���#�rn5~-���	)	ם	lN};�0N���
��;�ם��`o���:��]�5=�<7�{/�?f{�d�}���Q���-o���E%�4�%��ֻ����j0��S
��I�W>��m [...]
+�R����;AqwO����HB��	� Aڹ���w��yΗN�Y{������+��$:����Ls��5	.�l.���r���\v���gօ�SeV.�تSmf��tf�y��l��1i�H�
t	�X�&��YQ�A�A
ȄL�L��F6��
L�`�C(o�()�h�{�����ha�#
�� '��T��O�е�p�������	o�ͺc�
o0�$�f�)�S
�y}㧚�:Q��~
	�!{��3B?�16�	Ô(s��jg��z�a���K#���"��I�1��b6�0e��
z�ݝ����c%q$#�
��b&�������,��$!r�%�R? �A�=U1��f��С{�

ȭړQ����t0��ٗ���dT�R�<��
���4� �m�2b
�<��;�HN�9֐�)=�8%☱
��;�Gdz�@s�
b���p��ГGJƼ��/a�
br䑌G0k�#�%�r|��ۡ�k����{�ꢖ��������=ُ�#EA�T�39
u<EK5�S�@��Y�#Un�1��������YA�O
}� �
�1�?���_���C9:l{�7)`
�3 �����{�
ʑ��| !Ś,
�
�i��*A��tN���K�+,��
נD����##ݤx��-=�f���iSԤ#9)�0�[����`��E��l���i����Rtb�V�3٥�3�M� W�ky&�Pt�a �	�@
(`r~��֘�3~��ؿ��L���N�;ȕ�Cef�^�"��@��� �?��x��q2�f�O�cG������O�sk��+�	���\A;���k�����y,ZQ���`_I��L?��~Ή��
�ޢ�I���u�S��N� # �MaCևҝ��4�y��bJ�l
���0�
�����/���bm��_�zS��Lj�&9�О��s���+C/��n����#��Ibر
+`�V���"��v�>
�s�@�K���>�WmM��J[���9�D�!��a�1����GOţmuE��u�|:
�ǝ�9�)9Vחj���C��F���vb�q�w_���$sj��S
�a��hޓ4JYh0O�;�δ�_3T�?3��_Z&��
�dҐ������	bġ������x��arġ"��TMڄC:2�=��br�~��:��4
Lept�� }/>�Xƥ����})9^?
s�H�t
�|4��ݗ�pG
+&�@FJ<T�����_�\�Ya�.�,Yf�J�O���5��:�3OT ���*�i@���f9�Ӆ��#mN�y}�l����<���
���
o�Ls����I�
��dž���TQͩ���D�!�
g&o�s�#����tO�\�ے���[UE��@�
/
+
��4_�=l<�Dd�٧j8d��s gaOg�9�xdzT�QM�3��P��D(����|�P[.9�<�Ur�����r~�ق����2�l�����d�֊����]u�$&
��i'Z�2�إ
��~�b���/�b|��}���dzmG39GZ�@C�﫱�{J"�l.��4��y
����4��m'|>�x��C��G�
!�
s^f��(8��O�Bx&$�Q�#%����s��
�9O�}�f��_
��&-��#A�o��
���
+3� ��
���	�$�*>S�������9}��&Ǚ�Ӂ?E�K�ן��e.Ц@�1R����}6�	�񒪝�L��0��K�2
�&AN_�1�v�
B��*��@.%\�Q,�ɲ�L���c���}���6LbL੖��[�����gw<!�i�#9
�/g"7��Q�d 6�,󚍦
��
�����c%:tG��6���L�<�aC��t������u~�Dwf
��~�
��3/�|��I�H����G:�&��
%�-1
j�d�HJ�9�{����k]����t�C9��1�N�d�
��k&�⧖�2)+�i�
+F�Ѽޫ��ړ�	z15x��S��wl֖*�фН)L�ș��t��O` �bT�~?��o9���
S��%y�`�N�����bM���Z/�r`� ���B�#��{��y���
��-�gr����qv��-�HS�f��0-�8�r���%���B�t��KLjb�^�
ؗs�g�u3
ž�����J�A�Z\�ᴹ?���l)��t6����ϥܖ�E�������yM̗IMG&^�J
+��DE��iX��̱Y�g���5��svOB
_�;�����P��`
��uN��ln��l~�
���K3*9���
�e���#��j~�}���ޕq� x� �
 /�|ؙ*+�L�Up������qN4,��/�0�p����lN���#�s ><D>�r�5n��~��=�Ω8�.h<Ue�)��LSB�y
�ܿt8E�
HI�1>�$��ŵ��"��D�ԏ����ܤa�wd4�B'�.r�/yA屜��
�������m�&�1�l��=\
��lsB���#�]

�DEJ4�#�tC����g�u�_Ϥ"щ��҃�8�g�O5y�g ϔ���
+!{�� !�?B9R�/�����J�O�B!��8��R���
&����J�
MqY�J3~�0F�����b
r6fKBMؚb�mL1�׆)?Al?z�`�MJ.�l�C5��� 1`m�
�H���
{���e
��?�F����潵#MA��Ln%���c�7K�ؠ��4�3Mf��4
�k�E=�c��1�M�s��}��<|�6#��B��]�sE�&���*R�n�c �dTg��Ghq��Š}yi�Q�_a������u0-
l�d���mT�
h�F��9E�B�����Q�`�1���,�i��8%qe��'+�8R�t����
���+��~�����DE&�
���]e���\a�Q�]�6��mI�h����9MJ����oc}~O�_PW��rhgjz�QF����އ��@{�����i

���ʁ���&�`O�g �����}/3B�y=�h���fgÌR6�(�U\"�f(�
85�|��p<�j��w�i@۲���#%
8��AM2L�<�ټ@�s!#�4#�7ޟb����)��\�*�LPs�G �N�Y�� ��{0.
-i�k]i_�~N>�	;l�� 5bw,?kw4��/aIO��ԗ�io�s2���5-ʚmM���O���2�'�
���_3
��

��E� �'/���t�����I�H9�$ ��<� m-&�
�S�π�>���R:Լ�t���N�EǪ�����Ÿ3l��h���e�/�"p
�f�~�|>a��ցr^�A{
)q�F)�߼y�.n;TT����Ը��OA��
�y�1�_;��{��#�k���
06��g�aw����<�s��)������4#�;��s�
>�w'Pe#��yM��{
ϰ�o���4 ;@��Z�g�w����"�q�b`N�l��yQ�ɢ���bf��\f)ȑ�
Y忖2+N����i.mk�
�8�H�[���w��9&mA
��B�:��@��>Vgf� ߵ���3��ʍ�Ҿ}uIϑ6�txXs=�f�Թ�D��~n{�A����쨲�����w� 0�S��o>�r���ݙ��
��k���o���Jjʶ�#F�˨I��fd�o!��-ĂK=Te��]���T�!�ihiG*Jҁ�k�쓙̒
=}G	4�\a;�OP�B�Y�l9�00;#�0}?�w�c��ܿ [...]
�� �|GL���rN��&9Q
�p����;)��
�?����e�3��BG���@
뇨�>̈�Ir�/
����\���	#��z�?Q������Ib��6�8�L:U7�T�@S ^�<A�ڗ"����#6b_�H;Rf���D�'H��Ǫڠ�{�����
�}���q �
��?�#�h\����Vǂ�O9VcLr*��<¡�3���(x]����])�kk
�y�d N g��� פ*�(�#�̸�s�+0�yp�Z�w���DE'����i&M~��\���:��<)�p�(�'rr��l�
��kA��s!��zp՞L?��Ƽ����� ����(�dN��t6�
:�5��<��j�XCC
*h�;���=5�Ze�Ҩ.;��V��Gj&�PMIޗ�C�e�a������m
�#P['s��dz9-�P�!
iy
s_�I�_u ���䔝hrʌ�Pš��B���c��CϦi�裂�
�C�+��g�Y?g�l��9%�8E�9RR�r2`V��8��)?�4
�H�K�Ÿ�)I�A��r
�~��m��Ԉ��7L	�&삿��
���+ [...]
+J�q
�����B���'��	д� ��l̡�����	�&	=�\;;S<�� -bo�z���C���faN��GRZ"�@{s�注�u��9�̼�'c�������hsߍI��ڰdWxT�ĜN3pg`���20�����cW��;�2	g��20�Mv�1��Smv��
�kT�=
5y̏��C�^��Xc�!A��
_x�������#9q��	h�C�!
J�@�W����

:�$�g��ܕҠ�@Ko�Y�K}�@�4��(���
��-w����l�1��fߵ;F���P�%��i+���S�π�9�b�v��~l��~"�'�{LOf�ˎf�K��g��
� �).�@��쎓#�{�>/u�?/�#
�ho���Q)`�4B��P��qe�~����.O�\�q���W�P;�X��AF�Z'�c�1�j�,��J��� ��|f]?! �7#����%�8��Qz�f��|^Q�K
Ym�;��c�{>K
��>��ymv��j+�~�&��l
�v�
��8B:��V{�_�;�;�Ġ�q\�q���'��w�}�Uɯu=�@�;�p��?�t��}��K��7�t9� �
�)ћ}x���a���ږ�n�%��a�s4A�7�`}�c� �1t���?
�raG\���7�N��&��C[mO�[�}�E{�N₍R��5�9�4E�6���i>�#���A�qzʩB�8���*���f�2�C
��P�L!{`
R�8�A3J29�z�q�?�d����u�11d��u�
��dw��3D6�3��Q�п�u|�F�a�
�l
�%�i2�΀�<���c�$�)l��ՍuYk�7H��F�r����
�Q�J��%zot���Fq�'*&�8F�>�d����< �����v�&ؑp��2>I?N\O
����90�y7��ʨ��L3Pg
+6��d�
;��&l�ゖ���{�4��D%?5lҡ��x<��
j�=)%v
�f���:[���POt^l�yKr�-W�ҿ��?^� ��(Fy
L�C�)!���l;�eo����C�>�s�����ϔ����fm�;!$'�E��L�B3#`gD�[��l�QC���G8n��>m�&�#�̟o�r�N��y at O����F(�?�����
�֊��؀��h'z���6��+�T/u)쥦8�r�
��I�]h����=���{Ō���/�s��V��Z�Y�E���$ym��U�)����m���IZ��Ζ[��1W��]�K�2�]�ci��!\�� � �\��	�K-h��f���v�󑘞p"a�u�����J(�g��
���6����$�e�������Eaw���gRzo�b�N[›��d;�ϻ �
#���I.`B�a$�=���`�NW�Y�ʒ,g���jkS߬u#
O���S��A�{CLS
�I�F�c�o�kJ�*�H�L;��󀶥@��i����RG��f7��^J�Z)`�	�m��a� ����>�^��F�q��i�6��|Cڻ�z�C/5�������`]�c��|��/����[ҿL�G=����V׆sY�O�Y�O}�P{�цr�������:�:IY���*˱��ث�:�G�=a�q���|���� -b���=b�	�U|�>�
FP�[}H'=��~�5Z�WۑN�#P���}1~`����l��TY�ei���~l�㍀��� G�\㤐�=�NYiǻiJ�^���OĢh�.r���Ҹ'��;t�� ���r�i
+�4�Rꫬ"���*��f'�Qׇ�6��2���])�`D�A~lP����k@|��L���G�/�R��'�#	%a{�aDž����}s�m��b
��z;>P߇�0��� �cw�h� ��u��o�
���Mp;uY�
Y^⋥��b=��
+�y��y��y�i��Ht��Bڭ���:H>[�WF ���#��i�
������u�2n
��n�+R�-7!��AM>�[j�;/5�
g���6F=S���[nJq���+]���Q
\?Ĉ[nŻ�5�Jcʻ�^����9[�t��m����E����ZRl�:`�=i�>�WM=��`F����t�2>ٜK
M�V+���z�.[�(g
�k}9`���֎�j`
����a�B�k���:S�~�)K�\�K��u�}��Q�
XףI��_%��!��0�O�\C ?h�31�Ij���q
v|��VS
�t�4镶"����z��i�l���k�GmwS��[����ӕ	� ߾VA����ݎdBڎ���a>�
t��0�s�f?_��i�:�j�8�a�㒲(�r���>_�b�ܜ�^Q�tB~gBuK]��b�뤩&8����nM�@����
�7;1.�.�'÷�ܷ�nR���7�%��4�z'�m��q�h���kI^�}eq���䧱
�[U��p�
��HXi�|�V�ZMO|�)��Ӌ�;�d�h�`^�=�4�xA�V?'y�
��)�>]���>S�`)+�~���X,�������o�$���L�[�L��r"'��RC�}19���]	�%f�.w�}f*�m�����k��Ld��V�<ZmA~VW�
;Ꮊ^L�����ľ��3
+w^mM����|�(	��֑�0U�h��O�6)���!J�js��\m�ia��6���?P6[��7	!�g+Q�MxUI�suq��B5���$�� ��f����r�'}=J�ˎ��aE,4�,7#>N�ޟ̉���N�Lr�<x��J��f�/4�fj���%IOWk�_,���\�K��ބrPO|���
�y��nf�l
쭲 �2'�*7��*?��\-�U� �b��PG�Җ��ZnL�]mN�]jL�V�%?E�Q�$�X�@�-6 ]���>V�V5p��
+���B}�;5ВS�!����:��Mϭ�l�j�0~���5S��RQ�@Q�H���O�w��
��i��҆tX�v�1�V[�d5U�P�x�:�r{�w,�3�F٩��8o�{-�e)/���W�
ـ�j��Z�}��
�rs�����V$X�>�
+��ځ�� ��I:	k��{�X�E�'G3"nLf&X��b
�g�R�@�Wc}o����:m��1����t��w��w��~g���B�P�����'�z�^���w��?�d�\��//����
09�(��6:�A�
j�bC�;yI܃A��Q~�
qv��*��}�(��z��N?;a��
8_������$���&�-x�{{=����L�����I
���]�G�
+�����"�]����7��	d�.�c�3����OMy�c��{wtOʧ����81�4��m��
���8�<]I���@���Hx�,�y�P�bg���
��~��$��$	�����w���^��ƾԖ��^��{i
�FW���:�1&�7W�pn��)�Sš���;c7&rb
� �����ڄ���$��^�]�a�^����\mø^��@{>>/F�m��VU�>�
+�M��g���_��^�<�#�<�Nu�{����Kx$�eeA��j]��/�V��<�����.��9�W�����I ߾�4�l�ʡ��e)�d��$Y��r�6�27͌�_��7�h�s��O�J�m5�Ӏ��oeiij�v^�J#=P�e��J�]m'�����,5��-6��h+c_L�YL���TP�ԕ$ǥf��\
�NU�l�.K~))Hx2$�\����B�Ԍ�\i'�(���Dz�o�qB��f�ߗD<P}�x�֙��S�g�F��
�!@
F*��$y���b <x�������v]���>^���0-v�!�n��^S��LU�[��VK
~�&r�n.u!}��d� 9dp��a�P������f�
+��K�񼘧�[:�u�\mʇ����
n=�}�(M}5�H�Z�aF�u�XV��&���
f��4u�]�
j#�K|:�#����韆�/$��֋MԠ�����ש�Ͱ ���0��t��Xf�sZ��ũb�{[�^=��;�d�?�xA���q��?��6{��	\�hQ��j�׋�����
�t-�g8+�E9�~1��+�z'���Ŧ�Ŷ��.��$'�T�,�ż
�\
x��-�x�-���.�>�V#�F��D��;C��q.jw����\
�[�M��T& ]wW�b��D�V���	r,�"��+b/V'���žR}O��?$�dz�[}���.A�R+�u�	f����|*?��$'��Tnȝ�j�l3콺
�NYLv��AX)�a�5��o4?p[E���<<��
+����OWWc>�
��|�}���g�状�f0�<5��O����]��~n��n���a��eIVȵ>���n�����{!��U�����4�S���у�:W��Z^����w���hFԽV^�E������o�Z��#��O&sb_Is�
5���P����Lm�e� �U���j;�w���%�
Ԇ��<�Ɉ ���
�0��#_���{���W��g�џg��6���ϋ��O�R�U#��F��E���j� Ϻ�wR#��	
k�xW�ڡt4���D��?\��V�8ѳ��o���7���K�(��Z�Cf�SR��-����.jȸ��$�ﶼ(�i7���4���j}��Rm䗍>B�t�J�G��o�~R�
���|����� ;亮�U7����	|A
y~i��
!+Eʈ�3��k�!��rꋺ<鹺�|�&����Q]��ew(���#HZj�:���j+�,������?^��?,#��/��[,��O#+Hy*͏y��
+�^���3���dI�U	1�����q�muCv��{��l�:�+|oMf�^��nLץ)��>&y�-���v�S���N�-I6���4�o:��.k+��wG�Й�WMq���F��l}��Z
�e��b�	�0�=�'����χ��<$�(������U�Q��av�#X��n�Kv��5B�ۋ�z��*����ħ��q����}
�k[�$��A>j����=$@m
��
�8'�Qm&�c���V�ޘ��~�5F
+��	��(#��}g�7�#�)��r��	�
d�,��a/g+q��#y��z���$⁴$�BY�X[��z���8���"/���*�;�*,�$?��Tn�#�w�
�0�/e^��T��&��,��Vȧ����S���ڑ�y�&�z�
�Y��a^�
Y~�e#+⮷�ŹvZ��&�#��Zy�ߺ	��</�H��G���JG�W^ڷ[ܸwW6{Q
Mȏ��؇��
���'�1�ف7��!���.��
��P>�ia�B�s�[�@si+�^N�E�k�|�<�p�=S�`���z�ނ�8�g�(�+������ۏt6
!]7�S>H���F��N}����;YЅF��\u��j��j+�h�!~���Z����b-�e��
9W�q�w`|�;EO�%�B��ӿ�+#�G8H
�o�j��L
�� ?΢�qSS��b��3�

)�|�
{{i���3����5"
���L~
��}���C
+�w�e%1��UI7{�����|�a�!��\]:��Hgq~���:�{
#�E
%��r;�o83�q3�Z?'�z/+�n5�i;;�V^�rK����-H�����7��9mu�3MY���{�ӹj�1�Q�دW"�>;�%J�
(t<+�4�ԑߍ!���ז�[�����ط&�t$��6��S��ʒx�~�
�ϋ�U�n�������1v�
�0A�M���D�NE?��q�ZE�=ߎ

�N�f��N���Gn��{�7��ȿG<��
�T7�JU4a\�5韶zYq����ź��f��fg�
�m�u���:$�@Q�B� F^�}�ˋ���z�9���d���,�`
Ld��;E��v!l��ମL�T�D�
c�v3��!\/hKa��)��y)�f�h>
�t�:�Åv��UIn�iQ"��q�J�ם^>�8�G/5">nu1b׻X�r��,'��0?�n+�V#��L�{�-
�('�H�S�K�㟌g�ݔ�D�Yk�}��GM��\e�i�vG���6����q���1†k[���D1w&3����@ۏgGݗ�żZie�*ʐvsUX��V��Z+�e���FO1
�	�vzf����W���rJ�Ǩ�k��n��}x��A���%l��%+C;
e%���	���/[IN�ę
��"���<�����T�q
<(
{{e�}$R�'��QB�f�q�&��T���3U1����&�R�/�Q|�J�OG�������?_�%;ޚ,
}�*K��4�B�`.�:Xv{��N=
`l�V�k�)�v�6���0��lU���V^T���PA��n��։v���`=[�n�%�a�>�ZV�H^����xG������	�k�[�ة�mX���ķ���w��C̄�~f�~��s9_�l��
+��饲"�VV��~�2�c���
z.Ɏ|�T��e���GF)0���֝����qu��fe�mv�=����F�Co��"n��"��	|�.��z�$|�Lt�2�JA��#ܔ@��W��
�
�ӊr����sKZo�j����*|0�'cw����
e��N	����
d����6��r�O7$D��֛�U%����� �
��<��3a��꯬�8�dm�H�x/���m[���X��n �q�q2��|�����Nr�����(J|i^sYnD:(ʒ^O�">j�i~}�)�MĠ�ʂ4۵��z;�k��<ߔ�i�
+��RU
e��L]��
5*�|2&�~2!���^�q��fC�k�
�b؇��
����
�x�
+�������K-ȯ�C�ĝap�r����}	w��)�Md��a�J���Dž*�Gm�F��NXiaD��n*Kc_�uP��m�2n
����&YNא=AN��
gP�ޞ�G�+.6Ndgh��_F�#A�ߙ���{�<	p-�~�'?ۈ��|�~4��1�S�|���J���%
dĽ�c�������9�ٖ�M��@�m��=v;�N�������f�{�0�vG����]L�?���/G��u��,5�6�a|
+��t�[ٰ���,�lE�Keq��ǵn���
	�۽H��^j�L3�'
�tc�0�K?�L��$�n�{���P�ǼR��x�Ճ��V&�>�
�$|uh$}�2�s�5]��f�=�a�%��F7�k��
���l=-rO�'Z�eƨ+��fj�����;h^��z�
�2o�����cuCQ��7�L��!,w�\��1.��K�
���\�� o>X���L�҄����"��e���xɻ�4���؞��m�3��q���so�(�vo�����9iFp���
���u�|=V�x?��w'��K
Id���<�Xi����p��\/9���~W�
��Ӗ��u���qF1=i�f�ЂpX��ƙ�.�
�����ך៦+��,�����B���$��ǎ�oe/���e��@w^i@;�V$�5�H]
�*�F)%��h"�Y,5
+�:��Se�6�;�\�����sUP��&��v?#z���-)Oy�3�G�u�e!ۨN�zy�wj�����;]���E��
�#}��fA?���C)�/�&l�����V���g�
�X�^r�V����-�1�'rbuѼ��p��r}�Vc?^��ݖV��+�>wzx�q��k�q���b�.v'\B�o�3���̥N����
|��b�v ��C�G:,5��Wڈ>[�<�j-H\|o�
n��I
Z���
�{���a.|�
�%)��M��ꆸ��z�{���'��я�)���1�'�G�Ÿ�
o��i��.f�B⋼$�<��|�o���ٛM^mgƨ��������"t�P�
�L-�f,/�Y_����
����>�LV�!��E��!z��૭�~XlHy�Дd�6���K��5 �[0n�
\�� �g�1��pf�E;���
6��QO
#|�a"7ss8��5�������� ��J�N�þL���4�/�*#s��>[�|�*G�,��6��a���>|���XÏ�(L�tc��I7��:6�󳗇���v����E'�"	g:��
V�!�h�o�����!Q[
��N|9��\Y�DV�Ƥ��2��m��"��܂
qC?$D��y��m���&��������`����k.��4���I_f+Hߖj)>km�0ݰ�1��+�����n?��Łn�r`;#�� ;qs���Ft[i��,��~��g����$9�7�7[�q��m
�_�{9[C�]��&��ic�)φs��i�~[]<��xw�
�P�d���~��N}���/6b���"w����������T����|���d�k�RR©<�ȼ_�ёj�ؒj7׊�Z�!�L���Fȑ���s5�������&�L|
p�n#��V#�n7ⵢ
�)�At�x�*Hr�n����� �ӜV:a�u�����[bjK�Ǯ���z�Ps
�

+@
;l��~YoK��*
�����u���F��Z�/Ѐ_���;���|�j9pu��:D
+�M��[�šqI��`f��
1ۈrZj������w /w`��_�^�#"��(�ZY�d�-M�_j ��,�������F>]�f�$��FYv�Z>p��YQ	�
-{)��u�
c������	�2��}I^�"���j��8+��J��z.z{�OٙȠ��)�ޓv8��������k}\�}��Ғ���}� �;��y��A��(�m
�z�f�k+��]��#"�3��V�
d?s/�V/m������ ��o��"����VF�����f��ɚFl�q<�Ԡ(�\3��Hgy�	ݑ�Y���<ÔH�m'�
�\�u%G�j�,<�o X߉\�A���b7(I
+!_7�DJ��ެ
W:H��Å�}���va���H���t��q>�j�O��a�j�w�S�u�`��yl��ZN���y��nD|X顃y�n
�P:3ӴM� M
�I]N�2[��Җs='r)�3���7bbnNfRlWj3�Wjy�S�t�A6�R�I��wP�;3ӇK��~�ݷ����Z��e�w��3I��PKIv譅ʤ��N�tuF�d6�v���.�.�Ȉ�5�"�*�⧲r|��G
��jEf�Z� q��u����t����<�� 
�(K�
���V��f�J�ښ���R��BMt�\6]��X���X�h觍��{r�{�5+}��e�!�^7J�ޝ`1
���=EQ�n\D��%������� ��([Uqҳ�Z��Z�u����Á�7gBe
Ǚ�p}[	Mߖ�_�ㄌg�=z0� 
+v�
Kc���~N�B?+zm���=�A6��(�>|���6_�n�����naZ92�r
:�<���^Q�חE]h��V'Z��C�SU����=iN�� 'mc���7���=�#�<�Zo��BK�Wu%�j�f7�D
(��߮@D>
�l��){��Y�����r��J-�w�3�8S�K��M�Zi!��u��C��1N��2p(��~7���mg�0�\#�� )`�f�iA�@�-���(
�*��� ��(/��T1�CV�������~�~��J�hP
+s�fJM���=�E�eM�-ؖ������<׉�
-�}.��{�>���Wdd�%k}B�B#-�XRR{4��PRX��
����}���|�6��7(��F����6�O�\GO�UAL�++1����o�N_�E���8>yz�/ȵK ��
���s��O��.6�����Z�^ačV>�R�����O[���U����їq�t�s�@�s��
��.1���D8�����g��|)"�Q	:��P�v��
��ͅik)^���B� J^#
�Ϧ���0�*�;�ɩrB�.`==Χ8|:��� 
+��D��r!���s��^B��Y@�^>�@
ߞ�BEߙ�↬vf����9�hY
�eԲ�"?v,?í��R�O��DH��N%�m£�4`S�}O�����p�탻��7�A<^<9����Jz&.Ƹ ޠ�(XD���Yb$K���C	o:�i;㹢�VNT7~���z:���
��:��ve�s��/�|�.�Y�:����'�������"\��0��5���$��>r�B�s��t��r7?y���4^�p��d~��!��Hя��n��>\Lu�v���Cȫ��!�/
�g�߮"����9i�1qۣl�nL�����Ɋ\��F��=���9ʈST�َd&=�����%}�I�
+u�p��p���s���"9��OF��%0�
n��E��\�����pi���5*�n�e�:�3�XE5�a�
�-���+��
�J��l��t��*�������K�p��>��~����
�n_���u
�����.Q��"���
/K7F�V7�؏�Z�lƶ,;ge`I-h}��-f�n
�Q���ęz�@�#;-�	7�����+x�o�
�f%�Zt�����h��&�����fu7
+�ƫ
+�f6:�+)�B�����-��
���� ��ށ<�{r���G�q����;ٟ+GD\g�>6���$,����$m�V��[sh�%������K���
0�s�o��\}
	�}
�w�qz�bu�o���s��׏ W/]�x����͹�D�+�R�{q1�e/?��X��3X�w���
s�`�ѡa�b]\ �?C�ZZB�]�
���=���ǐoCn^�����E0�- `
��$?VU>k�فڎ<�h�0�+�iWN�<�A�Z|�"����.$:=h�
m����
hc
��oy�q��5���yv�/s, ���G��v��X�U16Hݜ�^Z
+8`���4,"N6r�;��oKpi�"�.��]�
!�o/�'�wnCl,�Bn\�
�����[W!���yx��y{�4��r/�c�#��r7�GS�z��&~��F����o �Wq��=�!�� �6� �� �nހXݺy~�:���+�K���s�
������PV��=��c����O�h{��z?-b���9RBz_�M��������{>��#���
ț[7!NO�@<_�q�yr�:���=��+W ��y~/�-�
�sS\D�<ۚ���]��9R��>�����D
��^7�asQ���� &n��ZA��݆|z��������/B���xz�.���? oo߁�����%Y�&<�mD|ۓ��s�
�:+O��M�t�ceu��ԫv�U3m]������-�ûso�o<9�
+���훐K`.o��~��t�@
+u�K^�p_�{�zE��
‹r&���t���|��p!�/�7G�w��^��b���
ȫO �6_.��c��`Q��)N�*̧�Q&tS,�i�2`��ܴ��¸��
�|���� �sH�s�Ύ�wO
@ރ���������br���朷��o�כU���]��7�&z����m���n���y�;ϩ��x�����O ��%$��lg
q���8�xyv�6�6xN+��o�ކ<�y���B
^�����
t��ZR�w�60���YCV|g>ˡ��y���3�r5���
u���
��}�%�3;�;�o�/!/�<�ܿv����� ;, ��!�����+�ܤ�a6TӌsVV�ج�#�݂ızn@[!�S>�h�����;+�g�ǐ@�w�@��������Bn�u
���C����y?��r�AwU�D��~f�|;�{��䦬$|�Uо5���j9�'و�kPO�s�_>C���!��� �@��pr��e�{��V���
�����չ�O�����[C��]�����򖘋���_
���c��$��^���	bkj�r
��?.�:| �~r��_�{`�o�?�<�sb��)$���wR���"���Fa�rwY��pA����;U����T0��C</�ټ��<��||j	y�{��+�.�C^�Z������
̡����!I
.���C^�o��
�3�
��D&c�?��4ZX0ݓ�k�g��/a}�>�gcbc�}�r���W��{����%�ː_�1b"�硣^ɫ����c
N����
�
y��
Y
u4�U%�������f?Ņ��N����
��`�#n4q���
�SuU�������
�&�|��y�c��Ӄ9��&ahW%ǩ9����DZ�Cc
���V�x��4���~�Wɑ��H!A��aa�qX��"n���8]��o!z���p���ڮ���;}����	�^�Nx�Y�P�W�%��_P�᷑Aq&{D_txk
yu���{��7�C��/�á*����%Y����b [...]
q���5��·��Y�B\�}:����|�G�����KDڳV杲��9��\�$o
+�{�|�4�P?���<Z ��5̢�
�DG_v���7����O�Bn\����z��`‰Vu|��.�Y�P�^
()���?�����k[���ڞ2h���8��8ffF�33X233�bFK�Y�dHڞ�����w�|�C0lii�9�{�9��K�jw�Xm{+�V�B/R1��Y�$��%�."[��N��G���_�}��E v���ˏ?��څ����
^�tf
�ʶ-vR�2j�[B��9���o-�%�Z�
+:D=�}+��fM��Wјˬ��oq�_�KK� }����=�v냷�|��<��ܗo������/.����|^ԋOٙg�=�.�G܁uI�+�
+��q����х����PMg�ř�<{�Q���AJs?/~����+�>x��ͿW�T}����EYv�?���_q ���
�Ce�]��e��h���29�>��*9����+�$�G(�������z{�����}�����Ԥ��=���ܽr����?�U~܉l�i�IL5�� 1
V��~=�k�
f����փ�L�ӵC��
�	l�O��a���8�`i��u�|2�%�"
Bf�_%`�
#r���ߥb��ȩ�w�,��nt"7���1Z�n����6��^���L�,���lo��,)+&e�c@~4
T��\��[����K�۳/�"eꁘ��M��v�x�֙�f��@�zq�#��Ư���zS&��]��/���K�~��b?�/��
��{C�.NX�DE�LtTǥ�T
��yJ�y
�vw�Qw��[��
�"��@�tt�l�w(S�ӓ��c>�'�~R
��
+z
����3~�h��+�$�el�[Jo���K�'�ܫ��߬��-o[�����ԋ���>��Ł��K���#C�8��Qz��Y�X�$�sO9DK���4�,r�=t�OMn	;�~}��O�7��
�DL�c'���HMN�pg
�.j�U2JL��f�ˋ?�������
�Y��x/�Y�[�,�ݍAz�mu��VM�#��3!��'b�_�n�,����Ľ	������[��,
��!�[� �i��qsu�S7�բ�$�j�i����Y@Or7dcЍ��l�<��&�@u\��\��f?�&BV�i;��7��j�X@ �hY�U'����{� wu�_�ǧ}�B���4C/�.-�&�녣�,匠aku����
+v���g}s�X�(nfrNv��!��+'V�5
ž�վ)�h�Nw�l��DC�y�a�k�lo�|e��Y@m���,K�t�<&�2
{�pIN1n��<v,C��v�������w¯��p�;
@�װْ���ͯ�������Ep�c
]Bd�c
��'rUJ���ЈQ��Q0ڂ
+ �t#˜ax���;�t;�
�CJ(�^�&�"3v�Q�Vh<1tpêNNH��.�)��UGu�f�]�S�C��A�F7'(�b�r6|_Ć;ŝ���O��K�
�̃Y̛�9B��� � 8vV:��kݨ�en��,)�'d�E�<�W��!��sb����J,����Rj�K�l�/3�ªJX�g�lTP����p��
�C�h�]Ťﭢӝ"B�c
��2[M3�"���'������:2
��R��P��2jod��S
O�W�1n�2t
�L�ӻ꾑}��ԞbljO�C�\ �[���;�.�]F��)�#�qb���[#�ّ���Sj�:���0?Q
��Gt�!4�)������j%]��̦���\H��|b�(�h��H�1�~G�G��}�1�`��F�F�
#q�>f�w+�
���L���s���T
����6���+���t=#۳�����_�����yd���s(9��O��^�,a� '��L����
������� )~1�"�dB#rF������h�r˓ù�;������W��7gv&*�Gt�
��"�mNvȨ��֠<��
B*|g�����Rڑy�+����|��I�@m�K�mOԚ<2qyQ=��L��j{�~�����;�M3��3o���1��
��a�1�”��|����B�w����fp6(�
�G���ɐ������ج���;
	�T7��X;�rӱ��vo���*b]P���KPy5�5�$VŁ����eq��j"�69
��P�`r
Bt�G���V�q2�nv�E
�3A���b���]�m���}
+ds�ܸĪ~h_D���=ca��DP�?�3�ֱ�_���o� /��RI<[݃(��;H@Q��lR��U\��t�5&m�e�
*��1}נG�%i' Ͻ
+:,��`E�]=Qe5$��
,�����Ը�ˍh���x$t�WBn��(-a
p�t�O�� �k�\
��O�u$��j볽H���GL]Pڞ}j$!N7y
�g���eP
��[w��|��1����!#5���2���ֱ�q3
��!*Q�6��@ct��Q7��|2LADM��o�h~9�-��������b�a��C
+|�m��8�~�#��G���!s�]I�
Z�=ѝ��w;�����V;l �m�V�1�1��?n�E�
�c[�,[�(0��Z*8(Ǖ
,��>���Ւ!{��z�$4ٻ�+�ꩈ��Ŋ�	��l�A���(
(����h
ovO
�H�>8�D�o91&j6S�A	,w��}��eTClv�)����
�΂ol�WCJd�_
++96�Pqs�i^���8�';�+~	��+E��
��
�L�������z�N��k�Vp޹�hxoa�}RlIDA�
Ȑ9���G摂+ac��6�
�ͫ��EL��as�G�F���b�F�
��c��KN�}�7�1 �	Z��8��H�3tbd�} ����
���t�m��[c_�-�
+�ȵ�N�Q�m�������S��	��x'�����}��o
 �pe�<�"���3�f[޼��b����l�
3m����
�p�!L�����48㝞�
++�0����j�[����I�!5�d�vS��³�m���B6�#� |
+L�OK���Y.a[�s���G�)���6�ѯ�b%n�O�i�H`��ؽڞ�;U}ݱR}ǯ”jG�Y���1U�pB��\�OFm�)H5�
��
���O��'
endstream
endobj
120 0 obj
<</Length 65536>>stream
+髻�vi\��
Y:��٘�##��Ĉm86A;S-w�t�wާd ��F�F��*,������Ħ%x�+C�&�$zv����S�[N
]CGZ`�JD��|�#�@�M�
+:��@G'z�
��uq
�9q��%ĕ
�X��V�)n�p���~����վV��%jy
5�����6��P����qsǀ_C���Xwq�e� FԈ��Q�b���g��;�ĺ !��-����U�S��bbK|������C
i8��tb"�������

��)y�W���֐��;\�����^7$t�/v���ڙ��ܜA���R��o<R\u����5�����+dX�muNƶy��6�q����01�9dJPA�I�Du�a��Z.=���"z.f⏝�t����􆴤栚�
����Y��	��Hu쐉���P����
��]v�KJw#ޜ���]x��u��sx��w����P�yKO�����;�d�<��*���W�eR�����N�œh� ��
+}����ҫ���	�
h���۬Έ�
qKP�.	:/�FF՘��
Ui_B�u,q[�3�J�
+!/,$��Qi�YT�
x���t�5�ݝ(��Zm闐*��U�uj�c
_���H۝äyטu!�%��A�RU"��
󧀮��Y�Wė87����4���2_5��� ��~T��u�%6�hyQEK�G��Ҿ
+}e_�$y��z�*�'�#�����x
L�
+,s�
؛�;���cS�H�����k�
+h.���>	�M�00O���
(����M��72t�z��O�TBS]�����<b��"ŽN�96�L� ^/�p�J&" F̵?J)
�U\�<6﫽�7���^��.Xt2 hq���v��I����&**�%:��@�U|��c�����
�g�3
�#���[Yf���W�Y�+�Ԩ�;5:c*.%�f"�
+`���׺��+ش��q� � �X�?+?���S
���6�be1�PDm
꺆�=�
��:Vsu{���
�if�����oe���AL��fo�5��DB��4�J{2���A
�P�3�5p��$��/j�pN�Dh�@C�T$ w��#wjc1�Y�Ԩ�2�K��8	�xg���&��
9�?
� yA-��؄i�}�c,�cR B���AM� �b�#jj[\Cn�.�'y�l�v����<�J��Ii�!�$���9k��b1�N(ٝ��Ŧ}�ʿ�u �[��\w8y�;_w�6_{ss��ن����}1�v��sag
���N���&��mSȑ݅�G��_&�i�X�/λgaپ%|���庹�ꂱ��G����k�|�#�:�L9N�ys��3Мk>!��+e�BJ:$�$�{7�i��e�]�-IQ

�! v�BjbS@�ʏ�`Yq
4+�hO�[�}�;��$,g`C��i��
+�T��
+[�rtiP�-��Q��d�n����%d�f�k�lz���\��׎9�=��b"l����ג��yl���^!Q�ij� x�����"\�q��u*�%� �"B�еq�T�LyPNj��ut.��Y!)�X��Qc�h���tKp.!6�DM��2��(:�utF L
+�ɭ>	tx������i0�Q�#K�rR�����W�f�蝅E��-!u{�[��¾��ȵ��ҽM�	Q�A�ܻ���K�������*<�>��&�e���Zl��ϭS��w����M�`HM����_
�Q=����#��1�����:��	��8P���Yy�9~�;Tw׵����3��>�����=٦ӢFL}P��w�^�$5�N6�
�m�^%��<��8�?"l�� ���&y�������7�x�4Z}=�c0�z
��Ĥ
��D�
>���l$
�
���[�Mw�"\�uW�f��$#CaeOGL�!��ڀ���Y�f�ɉZ�<�WS�G�n9g����jo�xY�(8��:+�
��uíl���
��z���l0�1 �~�	:
BL���藽ih�	�� V��. �g�����
lz�
h�ͨ|�sU�&dj95�T���
�
+��*~�#�:�Ie���[���|�,|z6$aa\r��*$˹z�5U��i8�w�5eg�Z)(�9$E7�螈��ߨ�/��3�yV#x���h������1۷f�/�O5LԱ�K�K��eD�}�����Y�=qg�M\��/`S�D~��z�;V�p��W�R�}�\寻3E7��ض��
+��s�@���z�4+��i>��P1��
+L?�|g�301'��pJ�U�yD�g
��^��<�my��^5���Sj��f��;��&
�����K�`�Kg�w���T�|k�}��鱉��Ύ��ٙl~�ZlKݞ��i����%�JuM��C�D]*KG��&
����AR<BX�_
~
U"s� �z�Z�V�I�
j��{�S�Brt�}��;O5O�^����
,S0acϘO�@��� ^!����M��#s���*{
[T��]w߾�Z���0��<�-c����
xV��<�ڙk{��@�Mdl̄����Eau��X��1���� 
�P���z����XG�t�_Ik�X�[G�W��
*��^"7 �UE�l��<-���N��5�۝��M*֫@�;֑�
�7�s�T��Xk�lj
%���AUoOPɂ�多����(�e~1<cg��������d��P�=�48�1���>��`�M�\��
S<�]z
Rr�_
���'������A�����{s�������ӫ�1 
*���S+��-ڹ�/�����쯾l�\bToM�3��s�9���a2������w�՗d
%߯��?����8���*�l͂_ sù
+N
Jq�A	�bR��D�}ko�͸��J�4ۙ����f|�`�|n���[g|�$�;Vo��W�s���Ul�g�k_�g����L�����F�OM���BJ�MSW�c�,�U_�>�r2�
+���zWZ�y���Nud�
��&��gbvUꉁ��
+�^
��
�i�S��M�i�mU?{�ز�t��40~
��v
ǀs�;�ps���YWÃռ��~���~e
�v+�a	��pzA�e=��[=��+!�էsț��w�^ �j_��
�`2<��Z���
��Ea	,�>6P1
�zl�0�m��!��z|㑞�
S��b���-�<��-9g+��!r}B&hg��XD��6���uT�}��`�L�Yq�6���-��x
�2�G&65��C�u\�_ɀ�T��c�3����V���ߧ�yE���[�;Yw{��f@I
�ao
�u4��3��K�f2�ݖ`4�F����
+D�s

+<b+��o�I��K�� o��	?�aEt4D\G�:	�!��"h��
�qT�d
YFt�MAO��1�t��� ���<�
y
	,�#Öu\���!=����l�o��Z��6�V�������W|㟆��t�&��U|�6\q�1��T���^�����S�㉜�<2u�xĸB7��	<B�<ȂDN���ٶ|�����g
_}�ɢ
�b���!�wǛo[z*�
L6��Y@�,��~$���[D�D
. �Z��.���{k��e��e�G�n��uw��5	r����+�U���Sm�W�>��c��:
�#$W��Љ�E84
�Ku�e��`��܋�������
{�~�.��b��>��~{
�h	]�oZ��xe��)��q�b3$��7��϶�Ao�0p�!�#�z�n�*�k^�+�,+.m� 
+������3��e�d�,�js�s�%%&�B��'VtW_�K�ƴ,�{[�̑��:���8���p. 2N�4tXF��
.(���+\�u�LD*�vU�\yV�)���_u�p���B�,}v�C|���Y2��w�ϖ_3�3�4w�~�\���I'Et,�4��� ��w�k����RӃ�ΒT��O�Ĵ�
�]>��Lc������kL��+���ޛj���e=�|�	3�LLG���K[K�J�]��&�������Dj�o�^yך�{��@�t�
"z�[H*�(��{����*z����g���<����zƱ�R���3�����:Q���DÞ y}bb�����l���3S?�
�݈�)А��vK)��܀����D��?�غc at K�U��^
��@�;��+�ף!�����k�YҢ��-t�_C��e����߱�D�
�y�D?���	��Ѫ]��,�X�
5��g�T�\D��:
+Κ�
+~L�B��3�� ÿysd`3
F��!+��;�f�OL$��-⽍L8�D�
�4�s� �#j:r{Zl
J�9���B.2�`��Bt.�
E���D�̏��E�̲���k�eZ�w��5�p}o��o���)����}gmzp���t��ޚ���Y'�[F�o5?�z+��T8�19�%R�o殱?��ᰚ�b
��yk��m��"��n�6��%l������$�MXJkq,����!O����z��>�T>�d���k�P�̩�W��#��&�XEn6�� ��1�����g��ֱ���'pJ`E�����z&����
* ��&�
%�9K��sMwcj�-���I��UaUjB"T��(ig��������8,i�Zs�W����$��{�\�^�‚k؜�22�p��쨾����_rnի���I�M*n�W�����-I��D�����+h�����ˌ�k	�P�k���
�<<�W��9@�L6�6�n���~`���"*���[�
W~0���c��o
QU�<�1bf@� [...]
+1�~!�S%�<�"���-a�{��Z�9Vq�;��")�V�Z�]{s���21���������gJ^�bF�O˸�����ཞ���(�l�Su��6�����p�>_׾��ȹ
��
P�;+��Ӑ
	�4�"����N����X�5)-�S-?��͡��YLzgk�YЫ��M�f ���I�
���jAޏ�M?g�����
�?\eX�&z[_�6=�((��z��m6���A
��U9:/�"��,�}����O /������l
�\nN��~�x����)(��w#�ZEf�e���x�ea�jLY@)t�%jM:62��-ݓa�m��_Қq��������/"��π_�6H�=5m��� �]3�5>���Xkx
\o}�]e�M�>�1�?��*ׅf�n̴� ߁O�
�눠?l�����[���?y�4��<��X�51�� �kn{�Z^�e���s���M����{������-T��&�EM��C*\��M	�V�Yq�.#T��@�]넦#-��ZAe�
��蘮��5_��_rѽ����}��ؗڞ79�y�(ɍ��Ȩ����k8.���Bz����s��I�}�m��yTEžnvO
��S o"rB�w��>{�;�N6����y�-��7����5J�����~�ҟl����yR�w�P�}bv��� /:�/%�z�+om�e|��y�����a)�,nd��)ٞnz
�f
�����8ҠKܫM��n�֠��+����"^�Ok��C	��k�>�L�d�������F [...]
s�,�cb
��<؛���=�s��>2`�=–d�Zͽ�� :28���-�6�p߻����yT�<�6Q��e��������矎�%�q́2l�-��Ͽw�c�j
+do���e���h�e�D������M6+���BJeHIm?�������i�-����U���7�k�x��9^	��8{Vr���Pv�jn���x��#1>�_jF�5H��
���
+H
���g�9t�{S��{��Έ�>1@��+�LC�����߿����<
+>�%$U���'z񝑎��H�aI���ٲ۞����ms�}ZA�K�B�L
�GV)��Uo�ZlO�E�}�/��Wå
��
*Rs at AM��I> b�>�|�p����h�O�5xa�
�z����"��+a��k�,�*Ӿ
+Oq
+�)>%27d��"��ɘqp=f�;��ΝZ�
�
.�ȍ�mZR�+s+(�~u�p��'/,�[���_���3�#uO�K�l�D۽�a���9A��
��`�Y����9���|�
�|�혞P 8p�R���
+>#�d@
�\�
��8��׺d�,�:�(�k5�aa�J&<��[C�'zu����.!4�<�pug����6X��r����n�@ޑ��X'|�T\W�W��f}.a�?v��*�c���E��MϷF*o��
+/9*n
�a�Q=�r	�z���>2p�qs�ɤ
��0��rD�e���O֞�Uk}�֘bt�H;*~
|w����\�C������[��xڗ;Í��t,BT�"�T4 � �Z`�n~�꨼�%у��sJnM�c=����3�8b��8W�{�-�}���/.�0�*"����hm11�=�N�йb^�9|湠��ڝCHy�g�"d
�����I=�1�' �E�
��5Ru@�ez6��1
��'���N7޷π_
̴=L��rζ�������
+w05��RF�%�
�mT��9�S�"*do�1kk���m��ⱁ��8��9P��l�����k����8���~�aہ|���9V��Q\ѭӭ��csGw\Mms/A^X{�/��Y��j_���0O�S�|PJ@�3u�۳kwg�/ ��pw�
QS��M-����'�8VQ�%t�k�P�����_v~k�������f��I��
�LBҥ����s��
W}jƵ�Z𠸕���영Ǐ�:GFA�;k�J��;
�7S�~-"?h�V���J�,����g�T�'�K)%���������ߤ���

�����YB���)��3��Д����(ٸ�W
7`j<r�L!�
"�-��n�sl��
�W
Rya����E �nesNL|0FrT���M=G&AW�����2�FS�k�9�'$VĬփeR���ry
+Y��X{�ىַ�������)��El��fA���*�l���� 2��|�_܁=\@g8V at O�2�K���ND/
+kI`��
+?��	�m!=�.�E���j����*)Ȉ�Ű�ѹ����Ql�i^��Z}����|�<,y{
+�$��\�6<�bo�~��ɰM��w�����`��ɚ�{ˍ�<bD6��8�X�kio�
��9�w:gN�"��g���:4͹�rK	��iD
+�W#z+n�}2L�e��g3�1���Qȳ�M�ŷ�
+h�Qqk���c@��T(0������y�`!�H�N	�U! ]ߝ�F �N�P�i�P�4)Q�TEI�l
��K�H��>d�WW���4Z�� H�S���oi{�~bU��'���G����
���J|�]K�
�
�{+���
����u�$yg����|�[`<�#3�ұ	a

ײ�'*&�O+��
qb�AvfA��p� ��Cڞ������c�~H�&�7p��F"F�貀��Zj{�Z��t�=}w�ekO��\�M
����P�
�L���)d����$���v&[�O�t�;
�-nDU X�P`+€���0���=�'&.��ġ%��Lh�ϥ�6�DZoV(u�,#��
V��s��/d�ʧJf�=k�e�Z��$�B#�K���og�?�Kp5��N~H�#���u��W�
t��2"�#ƕ�,b�T����urKD��j��A9�OҔ��s���,BLϣG
<vX��
�x�c���[� �P|8��8�E�w��R��ʇ97��`�wio
+����|{k���-�G)���2���1B�e�6�
+���yx��8�`	�8��d���#�8d���:��V�p at OI�&�l1��6�đ�g>j�\�(�u��>]c^��d���b���
+|yTJ�u�"�7��.��~ܝi}�ڠ4��+/�:�o����հ�~�W���
+W��J�G��G
o*n�����
+�W䕓�O��l��1>�ͱ��ۚ��耷$5z�袝H������Dk��b[�k�-�P��_fW�<K����C��T�� V�e䆠��w+�P��R�Q0��a���%`���n�OJ�v.#��ڟ펂
��C�
"f��
��X�tv{��W���<���a0���l�
�@U�n���_+�}�ձ��̕6�v�i�K�̉��>2����w��w���{���|C�{�co	�k�Ƥ{�l�;ˠ�OK��_;�o6LCH
�ܚh��[#W��搜�=��[=���
��=�Ut����ʑ�
x�
�P���񪫉
���[��'�ydo�B�.;'�g�?��Sy�cF鵿
�>�Ⱦ�.����|bLAXK�
����F.���5
�
�uL�E�l`��*:��w&ɧ��Ŭ��mw����������GK��s�n�c�d�������:T���<<�:��رО|���|k���\T�A~)"�'��u��&+�r.����:���PHn��2���W8;�Á�c!��g���>ѓ�@Gx%��~��䈦��'���#ФiT�W#�o���c���=�o���	e[�m�w& O�Y߯��.�E�j���ܜ���
+��u5��J����7�bFt]X� ����R[�::,j�
�or;� �|d�_��������C`��S�����[���{�it� ,���U��^�F���r��3Ҿ2��^ߞnM��g��-�<�[�*��7ܲL5�:L�P�� ���:�Nz�!3��3�
I'��n�z�ZJ+0VPo��v�� x
W�ǵ��A9��#F��.�&i��.o����R㑅�e��k,s�젞ˏ�
�3�n9��
�N���
���.�]J�
���^�{j��
+(��r���b{�Z`_��F[��J�|���⇐(��a{��l�c�P�O�dO�Eؖh̀�$��;:�2l�W�(pJ[�
n���fk
��Ȳ���c�c�����j돝>qTMNh&P�HC
Yx�QCGϑ��U��a4hX+�
*�p���J�M�y�xװY�ub�_D(���Ӎŗ�]����ķ�������_��WVi���߬r����^w�bs4�mw�c�젊GrIi���E�[zf�FA�KA���=I>\Ee�:�.E����{(��-��{�����gO�����H�O?&������.9 ��%�
���\iM�/����NJ~���P�݃|����G������9�su�+����N����ڻ��7 ��u�����ED�W����)8#��!c f:E�<�@�ώ%r�k����=�7�����O�կ�0w6�t0�r˹
KG��l����(&ó�nۙjy��(<'יּf��=W�B
oN�*��.�[A��P�
׳���
ޑ��h�Р��Wb� [...]
+j��8��!�&���
���~��&DfMR
+ꇼ:�ݽ�
�b@,'�y�M��s.���2l	����ڻcȷ�lM�$ڦ�
p�G�/s�KAk�ΠR�pUa �V���s�⠺��r!=
��ut ���p��	�k����Ľ%bE@æ�%�:yg��	X��d֏��ڟ�܂�u5)����iԛ�]"pI�HA�
��ޤQc29�F5��<�+����`�)���1}�)#��e4��
a�����}!�no�X�
���Qm�:��om��'��Cl�_��jE�M7�C�g����IhUHƀ�W��9�ӽ���C՗쌯d��
㬆_���~��]+�̃�KS_�5�h���������5l��k��Q|Ꙁ�Ў��c
.yoWH�c
���Q#�i�C�o� �F��$��������^��*��p���KR>#�=���Ւ�]Afo��]�MU\Vue�0�x��"��KĴ
��/����ҿ�����K=���P��
+B*H��R�C�Z�Ө
+�r�g�|R\y\El��L��8��q�M\���
�M��؝�������_�H)�eo��=�v��[vA���n���eo��/x��?�Ӌ.YU�Y�/�
���
nN۞<����k�BD�[
�;Xkz�[DX��
+ɩȰ
+�`V��[*}�Xoy� ��J'
�6��x���V��;+�%n�d��(��!9�ƹ��؞�?�ϒ�\.s�cJ\��\k�4&��yr�O" ��կ�s���j�e�"f4�� ?2bA�<|�S��v����ȹu��9�q�.��)�
d�w	��k��m +�%�&p�7w�!�{˘b�&�6�x����p�%�ӈD=��W����`�S�ħ���݉�� N�y� �o+�����	�[���G���^�֬Rj/�6�}9������5W�����^9���!�晿�vU��7Y���Kw�P�v �uϝ�
�a5

3p9�h��V��i
�§��V�p����'t�
+�A
b^$�
�қ|*<�`\�d�
Y�5�����<Z2(l����:ar|�~
�
�����O��S���
3�g�C-�7{k/�zۮOPk~hJ���y|�m�2"]�QtN����6�xm��W���呚	�y�
4�=�¿l�ͅ!͌ѯ���}��VNG��$'t��:�t���>��շ���λ�Nw�2�Èdž
�-1���|�9O,7����J�ٗ�^lO7�ߞ�}�\Bd9پIݚo�'���O+Ur�o�m/��֠�
�ZNu䩁A�J���u�Ө[���7R1m�O
 �+���3M�\+���Ut^/"������	L�m������%� ,���=�b
�yq������R����4&G$	{�X��n���
.���ިy�X��S궦��� 6
.��
	�c3vd&�N�$ȉ��+a9
q{�;3�
�vt
��F��R�Q�ҽ���2\񋌝}fw��:�)��\St���XE-��~] _�SfDƄ
�b{����J;���f��L��M�ƈ��7�0�ĺ�M��S`�����`�C��o�>��LD|󽮣���T룈�PQ�ļ�+�!�
��\������u?��6���hKrˈu^�r���z����
�
�5

�1��T�CD*O�=�K����3���!��%t��m/��kyt�_�B?(�~T�+��WA�
L�[N��LtDOl�%����>��2z�鯽j�����|�
+�v���~��TQZ

+j�S�c��疵�o/T�
(�p�

�~����!w(l����HȀVx x�eH�b�!׵���r�:��p�i�o��J(�r�-������"ҿ�.Q�w����ϝ3��������}����Ul�a�:K��ųH%D�C�����
ߤ��z6ɯ⒜RaI�J�i�>�3�i�����C�?�O@YZo(��_[xg�s�7;
�\f��������D]	���6Usk����4!�+�x�M�,e���4�ڧk�����lD�~��Sm�l���.�~��^HIk��~������9q
+x���P
Q`K"t�}
�rs��WY7�� ���<��;�
+�}8/��G�T��8>C���)�SA��=
�L]w�M}g�ŀ���BRl�P����~�������#q
�s�%B��
�׻
��#3��=*5�_; e!�ʡ�����Pj�>l��������
!�V:X��%��?��O>�j�H�"������P�m �$�9 ��,��Rk�7�G��5����F::dd"F��ݎ��Q��z0C+������z6�7ݜ�mI:RŠ�

/
=EWf`/��5
+}6�ν�/����Y|)�'@�F|K\���7 
��p�.1�̭��D������j؄�M:��m
+;r��WuO��`��YR��)��O��_�����G��_m
5&EeT���T�Q~M�,�޹N�x,÷�(�J��^)������P��M&ա���#���
�o�w���-��O��y�<z��H�<m;�$"
BH�8�ۨ���?�`-�s�/�g:WZ
��6܎jP�9x!�qڼk�6�2�l
��aW�[A���e~x8~k�o���:��˶f�YF+�m��^���]9�l
X�ռ<޻-#l�a�:2j�~��h鞊��
~)�9$�7�e,H\���cRw���\3�*Sw��UL��jn��*~�U��_���86�/�a}*Z�}�ֱ�H�c�lkH�wf�K캛�����js����n	�fg��p	�Q��Z\mL���
+񕆁�;�3��#}��K�c
�5$'T
, _�ps{�*�A>�W}�Jn��XϬ諭��~��H�㿏B�?^�}
X�7�Z
�Gۓ+�^�;����bR4�W�5J~�����~o��vw��QDNGu]=�h��<*�
/��A������s� {���
++`��������}t�B���#�5��-?�iK�`ݔ�2��uh
��� 5��y摙!��/B�$� 	Ɉ-Rv���S-�'Z6�M1,קĔդ���HDM��
L��*$�<
)ȍ1=~8{��W\�rr���v����ٶW��*A���������%�?yĥW
+N�H��nQ۫�
�[*�ȃ5t�KL��k;aw�I�q��h��#��4��g����+�Ϯ~<��;;����4(�
+b���
C_|2ؚ�mO�rN�
��^�/�|Вz�߇Bt{�z�
+J
+�	mv	��:��Զ��*
���:X�{��t���9�잌Y{N�{%�x�[$�1�Q���{�%�Ku_�͝x�{�n�=w�4�
Nս��zQ���38 
��ӊ��M���W_�X�������B��OL
g�S-w��
wym�>h��k��Y��i�EW
]��<KE�Ҋ�q#��x��>�&�2�Gz=q_=�咣JJSHD,�S*��-7���E̦;#��5�����忧aY_i�e�����[a_���²�2:(��D��&��핼#��
f�W��5�x���Q5��_Ao��;
�@f�6��ؗ���zd�r�e�cj6ѹF���ؤ��Ow���� ϭ�m�#�7�0��?Gg��f��mڙ�3ӎ�S����ҖB���
����'!��=@B�ܵ>?9��O�p��	ɝ;{/���^kݛ�C_/(5~
��Vz�B*�;�
��C����GS����~H�)�tOK��u3�m����0��֘�5>:��z�z�i�
�pX3ु��Y'
ܚ�/2���9+�
�}
+A�c�X5=!T�99�,|�b�֬������S���r�oԲ? 3�
�B_��qB��ڧ���
���
'��]�S^���<�c��͙�A��M�s�Cck^��г��w��;���5H'��Pe����������ui;��Ք��C��{�nxݎ,[�CR�T�4/��
����UtnT��z�IFع��s�c�F��,������g-�^D���kO>��N��I��E-4}͆.\5"K����
�uJ	O�v5ݞQ�sL����ڗ�=Ԣ�����JhV�s�/Y�aY�;
���w׏�w�����,���=]����a�n};��c
+k`��H��(1~���MK|_�9���̃)�CU��h��ATm{ѭ����5;�i3�����M	�E5��Xѩ��Y1^nե!h���gG���3�?���gC,�}+�� )�AL;�j�Pɿ1�}�C�YTw���7<�Ko
���-)*��{ %�"L��	�.�#�k
|���
����{qÎ�\�#җ����_E�����?3�^ⴿ��[n;������K���[nf�%31�������6J�Ҷ��;�������<Z��<�,y��oH�����|��~6q݊)ݶ@�>�P�nP��
\�a��
!�o:�e�1Mc͎M��d �N��>r1r3�sN���†�c�\
���pW��=�z\�pG
O��[�临��	AÍ�^��E�uZE�U`�NO�b�Vu��5,u�
M[���c6���U�bZ&�J�����!�C�i��躃Q
 ����˯�5���~��)ם��uGRTM��g��uwT�Y���ʻ[\m�����G�<ݠ�������A{w��N [...]
 ���b��ؙ})N
�kT����[wW
z}r����'?�qߺh����+.&j7� �zim�!p��^~eN�,����[vJ��2Ư�8L/?�Ge�4!
�������g����B���aN��IՓ����5ug����u�W}mF��d�Hl����d��L	
+.~����{
Yu���^S�'NK��L�}�d�+������k掤M[gچ
���t�
ӠKV\ي�\��a6��״��H�\���옠�J,��J o�[2N�w5?u�?׀O�����b����o��/8�d�A�|lbH\q+�l|�b�eϨA�v��� 
�d!TO* 	�H�9�fY½ ����

*�������� B�E��U;�m�)�9�IN&�&������'���ϏJ��E�A٫i��E
���Q:��8��d�M�r7��GPw7���l�Gg}��V~
c�}��5�l&���z�Jk�p[��D�ްhpFN��s~
h~̀�?���q�2b�\?g �����Q
�|�)�����֝Ь� �y
�"C7�4����h� 
������e�4N������W�:�m�X<JD���'
�<�uJ��p�J-��Snzƙ���FH�
?!���a��t򆛍vp��/[u_&قM?�z�ޚ���8qU�~L��C�#,��\��"����'X�/s<ŧ	�����E}��)e͝�PK���ި%4^�Qb�����]gs⦮�ɜ�
��x�:�U�u��Dmw���7nn�塶���-��Lؚ�c¦�Җ{�*��u3� 2��FO.�2-�H�t�JW,��E
�p�J�]u���c
����Zc�ӈ)�	p�[�\ڪ�X1%k�ס2~�zxl��G+���AB�鄻��:������&����v�ٰ�������v����?
�K�'����?{1����F�� +�7Y�����~oF����J�f?�3�*���;V���_a��0�g��-)k�Oʪ����WQ��~�m��́+:c���iǔ�
s[oX�e��ɟ����yϏ��k���ew�%��A�n�(�{������To��$}�ؘ���}�i<f�v���Xܭ��A
W��og���Ú=C��F����Ԙ�oZ{��nL풶%i^ٔ�h�H���v<4��<O�+�03�x��&�M�F�w��'��� s����>N_'Y�� 
5K7=��M7�� D����>���u�h+��ߌ=wɂ�Z2c*�M�Ҩ
+�Հv���O�\ζ��Z�P��b‚��1=D�
0
+/����!I+FjͶ�ܴ�ɭ 
�=��n�H�5�i�
+/��㷼����CL�}�!a
+j/�"o��}7��ˬ��A��栔���5�ٶ�
>i�	-,cl�-aÅ�^4#��|Ȓu/8gF��fن*���!�6L�����t�v�g���u����
'��%'�}�Im]0�V���/�]�� ��f��M
+��&�}��L�1:~'ĦE�����y�f�a�����k�> ��q��9iUgFy�gg[���c���Ѯ������)��q���6�F�G$5W�e��;^
��;\C�J��B2>�s�>D8��Q6e{�[sa�wF阽 ���ɫvRͪ�TU 3��
��ʋZ\�i��rE�2H�U�⊴��14�1�h(�G��v��
��:���^���II��q)�~��~���j#���gU�

��gzQ)n!�%�$�GRћS[D����do��~��c�Ϗ��+h��S
^:��z��T/��0��
S��
^v�T��x哋qy�N��=�|����x���GA���N�b�(��;?T'$,���&����:��|�ú�=m� /��r��5��8�[7�+v
�š�;6R����'�fB�
U�|R�^2-oJ
6$�� �wb7��nIq0rϋ�^|��GDȂ����%۩����g
+o
m��q��gd1$��Ȑ
U�fG����c��u
�<�i�6NŭX�1��<����H�u4W�I�Æϻ��%,�@	

+T���[T3jW���U+;��5F���E-2=�e3f��o�t�m7�@����3S��|
+3����Mo�����QB˒�=i�O���Y�J軘�4���C-
5>�ʼ��k~�jE�̘q%1&)]���g5зc$ط���[P�SrPҊ	��n�1���7�o�g�-�!cb6W������U��`�A�
a�?�h�����V���a&�����q��(�iǍ�X5�s�b�4�Kp��zЕ.)65 ���)	E���s�
��G3����ކ�c=�wg�갌S9�GH[6P���m n/)۟�Y���NH愦�aH��t�Eߌ�Ī�
+���!;:� �=�i\�>�nacӴd��Xw�ZL��
��`U^셤� n�<�6_�
����`����3���x;��U�����X�5s:��$�t$�tw�pw�=7p=c��
ЬM+�z=�NS����;oW������GϡI[
N�7?W��/I����$
~��(�����&]K�:�*����*��d����'9��
� a�i�X5I����
��G?Qɿ���'��T���>vŝ#�* �xͼ�}?0��?f����b<���rR\𗋒�WT/���K����4�|
%�
�b��(�*�2������fd��Y
��T�z��ݭ_
��{[fDᲪ-a�z�e�o$&^�p���^�q�<�5&/��0��4���8���/ݴ�eۙ�����
S�������
+X�i3)뚝X�`a�3}׉�\�B�fc�M.��8�Q�ac�Rh��Wۿ�E-�~�JiY7��&��w:D�\��#*X���!`��@�-���=y/DA�4lg�AYs� Nv��E=,;,��y��-�[^{i��j�o;b��T/hA�c<���oz�!��Z��}��c��NjZpڦ
]��a�D���,������M�����%Le�3A��k���6�d
gP>M��_gٽ��������&���N��?zq��A��ަ{�}mO��
��W��p�!%�pAK����FF��=��驸0!�����%Ϩ���=����ȷ�N6|r�b�[x:�]|��-8�b������w�,�N����S�rx�[��~X �aq?Ɉuog�F�9��B;��ꪁ\1����u�0�.G�:�/�љ3
���s�jR՚CȈ�YՆ�#)�[~e\Rrq^��dˍ�Y�P��C�+1h�b�b
_�lE���;_���=����
�V��� ��`!V�9Y�m/��f%7-Xi�#V�s������R [...]
����
ޗ��7L�l�`����] Q�LS�غW���\s�_&{
�����Y���w���9��ה���Z{;��i����y(q� ��v������0�+vd޾d�5E1��
��MgL#Zp1}|V^�RJ.(:�NN�4?[�R������}MOܤ��ä��!2�K�J�
���,�q-�p��%-�{���|������Ѷm��
+��C [����8�E;n6r*��cb�]��t���
�'����&D���|,Ғ���V���x	�[>L���u���	;����QQ�e=�xۇ�

 ��;��M'v�õ
Ν��Mˮ�Z�i�i,c;Ĥ�z���#ͨ!I�Xւ]�=J/y(ͣC�W#��'Q5�~�.�>������O��Sb��W_{�/
+x�qYǛ��^������h	S*\v�J(_rӀ�Fc�J��
e>�9]{#��</�ڗ쌖u/�e/H�O��svR���R�<���*Z��Ɗ�����zr���X6�Bg�����6�Ϊ
���6�Ϲ��7F���S���I%�xd�]�`L�	y2����`E���aY�&Lي�Ҽ�b"W|
L��K�}��W4�����@�����{��(�_��畝9���W�,$�Y��qp�ޮy����aI�é��W�rLָ
���$6lH�sZX֪Y�e��9�9��B
f����b�շ��7�K�*f��
~��W�Y�!k���O�+.�ٿ�yg��j�DĀg�FTŴ���-lM�
�Q�bv7�i�_w�JW
��Cg�n�cv"
ְ
+�*|z�&���-�?
L��q����jb97%".�:&��;<�**}y�xûg7G�]�؃#̊�9%"�9�@&��R�
ʔ�R3҇HXvP�c�P���C=e&U\v2k�.p�c:R� �⼝
x��@{�-�ɫdނ	W����W���e�T6i��Ҷ�N-�1���
��QNI,�
,����;�g���!J�
QG�oc"����do��iY��=O[������қ't��5?��1�Ĭy�>t���;�j�_�B����U/�d�
O�2�r�ܚ�JL��}�i�Jl�I��a28�Ť�.u�@������O�l��i����=/�qŁ+]4���E
8�{9� ,�����~^��ު�s��g.n��p�醛�l`�ޱs �vF��Qr�Mi� *�5
��n�Z��&
~��T<,'�ET��e{��!B�L�A!tÆQ�7�k��3vV	y�l�gl8��ӊ���Ւ
_���;>:���a�U?�>mb�.X�E�%j&V�䶽a��8��dS�6p}T �
+r���'�
�T�lG-;Ӷ\Ȓ-�n{<�ů�9�3�vF�˜���t��Q9!c\C�X��i�zb�O
5�HQ���de�X�\?�F��й�k�d�vc�{�ӥ|�a�Ϻ�
1H�>&<�cV�X(��>Jۆ�
+�1j.���ҲU�jE�lz���lEԌ)����Q
���qw"�C�}��
��χ�}g�}k�]]c�
tH�k�+I
i��i5���
�
�u�o�;27m�5;�qF���K�:Z�[� \���o3��f����?
ȔSd�٭�~�b'p�Fm��psV
l9�KV�,Ђ�V?���F�	�ռ�P>����Kg
T��h�1M
5`�W�ԦX�i�
��E���9?a�!��֠FN	��m�VS��3iQ��ߴ�]��Q5�P��<�j��%ԋ-^2�K"2�
OW�_S��W
��y'���f���٫:l�I�x�/�s�A�_s"
�M��%4we��>����:sϣ��mZh-[Nr�Nk�
�;V}D་�u0��>
w{�׵��c��t��s�Gj�
P �#tԶ�Y�b
�`	�:j����� o� w�G1�~4�j�_2Cr6|���`GZ��-uo��Zw�����aY�����?�[�vCx�FP�?�
+��t���T�iJd�<ݥ������-_{��^��5n���㲶�K&Dއ�m/����b����&U�j�TL
B�����	~ߢ�M]r���A��C�/�'��\��^%�K.Rü�ӱ>,�Uv�{��W<��?��Ƿ-;0uknp��Ź�
φ���Mo7/j���h�E�&J���X=ka�g
Ɯ��?eb5;�w�@�<$��3�b�U�d�U��Ƞ� ��a��/��o
�8��
�Z�ܶbVG��i7�m!@Cl��
j��\
S��W|\¢
_��'
�h��,�(m�!����X��
�����@�7���
+��+>|cp�>���M
�\
`�����~�;�Lw�>N���!�`�p��Q�k&4�ڨ���	%_&��%
<wNN�
��Ǥ
�j軝a.k�ͣ�v�n�ȼ3Iג�Zsp�Szf����A��|B�N]���m"ƪ�O�5�&n�s��ĺ�yini[��R~�k���
�V�R���W1��A}7hd��3��6D���|���N��~�
g�帚T=o�!}Ȅ�&uF[;��S����k~&jʀ)�ԡҖb"~���Y�u3�=|���R�{�4��0�uD��0w��XY��I=
��,��5{A
+t#�$,z��k�4�?Q��`�#��A�G���#��/���#��U[[ڼ�%aF��t*���
�T�!V��U�x"�	�C
	
zHRx��'܊i���^b�v,>G��i
�~ɂl;�=�2I�gq�,d�΍������ϻ�}�v
b���/�Xă���Y]��y32{�In�h�U�,�kO�i��MW��9M��yC��Mg�#cZk3�W�y��Q�z��&��rXL�O(p�sB�N��u���$}������?�f<pc���:ʥ-�2�fb颛	]�1ؚ���
��1]e�լ�
_�P�
Ը�1uCf�<pD-�MX5�Q��1	 �1;�Q�fT�v�
+�
r��vc�Mޟ�qoM��cܮͩn�֬��3�W�N09�2t�A����E
��*$d��y�cڮv;��l��qQ;�qc��\f��
R��0�s#��
S�'��[��b�� 6l���	���B��_���
^v�a�a�{�D���c�C[�v�����nټ��9���,��ͫ�LܼW�dk���<,u|��z�=����
Q�r'u�� ���:5,F��
s��~:j�Fi9<���
�t�/y��j*(�l]��c;V�`\�	I�K^.q�H))�)#+��ճ�e�u7��\�S)�Aa��������	�[M�j> ����3���Q34g�F�Y�КW\
섚�8n�#��"pDO*\�u�g,R�SĘ���GdДi
�e�$e�M�kP���4=�
���l
�Em=�)#�`�V�z
���b�}+��Y��;�:BѼ�\�顴���[>|Ӓ�
+��HE�VFۢ]@�P�C��k�vr󚇁X�3��>x�Em���
�bl����������	���T��h�u��;j��9��LK� X+ͻ$�5�P�bg�#2H����Ί
]�`�\���p-���� �%�
����H�
6b�Ak^����̝���=�B�.O?$�%�$��zX��!ʘ��4sh�kOXy�3�^ޜu����ȣ�U�5a�b7&��X�ߝ�vg�5�!&%f�U�&j��(��7A�n�1�9��9n�D=���q�2 ��z�UݽY*�4���S�`c��*�}ҡ�P�f',ܙ��,
S az{B�ݙ��w�=��	*9j�̝� J����q��7H���R#jL�ż���/
2i� ���ҽ)�kkRdY	
+�K�\�
[1�����ޭ�_o�0�~L���b7LF�
���mҀ-��[��"�v�׳f��62`L�Μ�������t�j��[�2v���c��q\�n��^�AU?�7�G�{�0U�<WMd?K!�j9eD�ʱw���{��SCҖ)��������23������0&6� ��S��JV�K%G��� 9O�"�D]s�H%ˆ��
��{�τ�Y8M���!
(0q�����|>�z
UY�����l��+����W��1��B,��u�!YkȠ�2I�Ztݲ"g�1��i��Uf�+��:9C��k���WC���P�iQ�V������j�Я&��S,�ᬐ�@
P��]bE��G����.���j��Ȍ�v��e���:�vں�ol4��P?����O��ms�.䬍�\�����ی��1��V�a��s�G�~q���Vi�#�q�+^��i���XD�Nz[PN-
+HqY�*J�R�u�|�ð
�D�hp�
s�����٠)��sD�o�2���
؂��
���3fjU at +j�*�H�@^����������Mv��f�7�ͽvZ~཰�� 0��9g��|l�|�K��1삗Ҳ
���cZb9@�\��X��E�M�
�C>l4:���y��L�d���ҳ�6ޥ����1u�jaw㴑ZrsQ��t���ذ3ɕ
��ڟ7#t��
��D�B��ԋ��%u��>�K��<a륍�e���T��25�-���z."b�ׄ4Ȭ��9�g���N�8����	���,��C����*S��%���,ohw��\��s�
�!�fMX��[7yXK)���;t�U=e�V,{��P�}}�[8����=��bQ�e�,�p
*a��d�k!Rv�NSS��}T�;,Lz���x���~.!��$���XP0:�-����k�A��oP3��[4���
�+�YR��C�>����6���!�6{���>���6WҜ�L��MM)�b]�<���gg5�g% [...]
�
�ӌ)�&��>�J/�7�{z

+	xƪ��Y���`��%z��	
�;�w�ғR�!��r
k�!���Q
L
+b�L��7�Z�w�u�g��	�F�0H%�*
/Y����+m�1��7i��=�C�$rS�or
��O,)������im/e�"�O*�Q
�bLI�Rq�|Z
ף��<����;���J4�ʆz̕I���R�� i�9xi��g*�a��K�WKsaWs�;NW���5����W枾��E��t�pcܶ��7L�ya3�3�I�!
Z�u԰ɆB.YW�%Z��=`��bu��TQ>���"��7n&�ݺ��xe)�7R�f��Ω� �mRʬK at Y�Q
�v�F�
X<��DPWIE�|i����4�б�7
�8"�m,��QE|P[��[��X]Pu�V������t��Cx�Nӻ��Wc\�;���<�ڟb�w�%�͉^�J�W5��n�ĠԠEU?S�Vקj�
�Qr�$S��چ��l���qkq;"u�
�n��h�Q���
�
�+� 	�g-��sP��<�����
ԉ�w����X���?�~	��p�����*��'��
�X��K�v��cvպ�P>�
+�%d�~)���	��":���`�u\��*�}�\s��ru������ߊ+�?�zRw�Za\Z*�{�qI"k[L��D:aⶏ� ~����z8���:8c6J�~��a?WP��SYe��յ�K���?y	9���¸'��G
���]�����ø��?TUp�@��DҬi'5�cc�ʮ�X[)�z�4W"��yD�.�Q�<�x1�dzC�j_�	�x$Dq������K	G_N��I���2y
�Dzb[�&�f�-�.��ȭ�D�
P�
V��_DId�Nqo�]ҷ���.`���

՜�!:�x��
+ډ�B�O�%賹�?<���Kar��>�<�G���֜W“�
�f9��AŐ
�?�r��je�)�e�R#P}
N�ohѝ~�p�����ŕ��
�������̸s���^����������x808�X5�s�=}S.�o��5�@�x`K�M���+I��5
Oy����Zy2�D�����#7�7ĽH�
IHg
9�1��t\I��'`��"�|�*�
bA���ZT��*L��3E�U^8��^V+8[ߦ;��f;��������#��&�ݾY�8

���ʸ�ǯ�]��uТ>�>�v�����s0�E��K�B��D���0�<n��
�^��)�iG���D�Ʀp'sa�M8Bw
K�=��� ��
�/�O���~�Lo�37�����Q����t�Y���l
T�T�=�Ԃ�*hT���G8��K��Ż��ˏ��~��y��[�q�RHq�����]/��ʀ
���b]�_���
d8�*�B��q{�ux�rN'm�Y;1|��;�^��݋��w�������^���.?i��=v��7��
<��ݍG���}m=�t��R�V�!�6	s�!��l}
�ZT�/� HB�5����_�[�?��H��O"��q�&�ڝ���T���q�o����3.!�{$>���k��)�S����x��iwO���K�[��\��1��Aa�߂1�7�~�O�
K)��U(:v�~]��g���3��'���z)/�ǟ_��}�*�v"��K�G^�A��D�Gzfl��]*�	(z����fS�� �l������	1r�6z����Gq����4���|��7�#g.d��{����>����#/^���Q��eD�mw4~�I����][*A��Ů�4�Fq�^"�Ľ׈#)9��鹼�'¿��zɑǯ`G��
�O&�]�Uw?s$��~<���K'9�Wb��h�: [...]
N�I���N�T<���f:]R�s��˶cnT��9�Ɠ�����
��
{�J;��@v,��vL{�DJ{� �V��q�gmT@@�MU�(�8�SFW(�(�/ S�
ժy��8
󹣉)�#O�q7��]���u��'�����j���s���b叹���˛��<e�E��³�R�O)j�㩲���,�d9�<��9q
 
_�js��U ���SH���ѧo�G~�+#�?�
I�c�x��8U]��0��f�|�N��(��!��0��3QE��fvRǞ�At�R
�?%f�ǧc�?}����>����)fo���_0��7r����qs^gXC�
U�z�V�j
�@�n_���F.ԁ]�_�rb�x��Â��Rj�OI�㏒�?$eP�hlR\áe��"��1%sƈ�Yr�Q;6aa�Z�L�L��#w��{��Pd�3$�����)lT�~�J������ߦc���3�e�1~/m�^��T^hCZ����7=,O�Ij /�����#'��H��~���Gj
+e�ߛ��\z_����4���PG�ǃb��p���ҸgI�#��q�����Q��xq)U�@�M�]hQ���=�cZx�Oz:l`T��&���>8Հ�ߨh&�<�kw��i5��S.���ղ���*�n?�]�U���q�G�
��J˅'�x�Kπ�r�D�]p�L"�
�b $��ј�4�LN�Zf�$��L������+����n'��O�
I/�
O��Ϊ�َ�=��\�C^Ĉ�4禷l���ۓ]�#61N�s�Ī�.
V��W��>��z܉Uܪl��W�}-��v=��~Bu�j�9�Bi�6_�d���݆~�A�9�1����Y
�8����eJ/S֫��
4�1��
MyB�=+l
���+���+��6
y�u<�\�{J���������;�p͝���O3J����I.J��rف�[�#61�`0
$� �+i$�G�Ahs�Q�Wk���
+��?�x�z���q��bs�ф,��mHa��K�ޯ4l�񐨽
�5�%V�Y��P2S�H����T�-��݅ 5���+e�_ަ���p�4��?`R�9N���[
^�`L#Fڟ;�׃r`���]g�+�R�`>	K����2�%
D_|u��rvn�Np�y8Fu

S^Fb�
��X!16چ�j�R��0�i]��B���
&L�_�Jpȹ�&���թaC2E��W_)�U0Y�a�.!�	C��Aae/�<i��W�V�7�����J.j
 n�������:(�c��g��-Z��0���ӝ̤�>Dl���;��=��fҏe�v��"~<!�}J	������ݿ�*�h�������
��{T�i���K.T��
�
+1��
N5�˖H$Y��q4M�F�	�d�C �}�U
����x�$�yb�7��5��!`�-6���.
����&���K6|U�H��w�A#�N%%�
24I�݀
��L2dk��5]BE*O��&���mX��V�:�({Đ:j�T�2�v��i�E
b�^���:G��k�!�<��H�N� �d1t�,Z�n��B-��V�2��rdC�����?�H���>�7`���~�^
>i���9��y��du�z ��Ħ�aue�ǜ�(>cw������j�[�C�jJ�ݦ���f+�VR�)Ja���]�l��
���-�&��j��e�
��m��W\��u�uo�K�7%�.��j=6y�F7T�D}�R�`�
+�|:(W��RK)�
+XO!$Nb�F�p�%ؠ�
��ۈo�-�1�A�<���Lb����ѫ��4�V���^���(򆄦�~��V�kl��i[��5�*I۲N �����.ᖏ�6����k��{>&c�O�N�)�~5��*!g�D���(P��mҾ
����T�*��
�O'�L98��n⒗�[�s�{!�c������'d�7#���fl���5md6D�݈a-�d��nj�E���]��_W��/������b���}�H-	�0iQ�������
ʇ �d�՚�d�x;m�|7c�6-,�ø�
��˼jj�C�U��
(�u���t�

Fy�H��c�X���!}��V�	{2�d҂q��{3����y�E3���HW���H{8`��
ʪ�%�7�}���B)s��1[
�ڻG �@|K�צЯ8�2���L5(8�|�0@��S˷�غm�i��
lx�a�_�
��
�&f� ��Аy:h����}�v6Ч%�Xe�d���.��
[x����!�v���OQ���,��1���
A�|�`;���#�h* �8d�)gcg�/�
���y�� � �,��U�NB匃���d3�.�j��]�S�sVBي�ذ�B�-聉�ʖ���طY�e��v?�q�A��h��斤E7�~�)@�r:P%"�򺕽N=�ȣļ���nv���:��
��,_��ԭy��4����������'ꦁ�
+f�[A)���Qk?�e�L�
��d`
�l�Ҍ5h�P��W=l��Np�{a&'�iz��J*��j�ڨe�i
:
b�H��UAތ�*��{�o/�Q32��T�H�G[6��cP4�%Dŭ�Z���
��U
$eÎʛ5 �u��3}-9��A^HΎ
Y��B��k~|Ü�ִ�
�}��Ehؘ�W,�:�m��Y{���=?�~��5��V���/cT�0	�e�ܹ�BUL�����W�jT�H?���W6gD��n\�a�U3����#e.��3����r��)
�xV��s#�kh|��#؆m7�p�i��0�ꢶ.�5�Jt�U1�����Z��� �#JL�E 
jD�
+Vє�����/;��u�`�3?Tx}��Y|0̦|
���(>���r���w�4����d��\p��S5��#)ͧ�
"؋9�y���X�a ����
/�fϏ���S@���?GX1_'5��a)����+��/aD��	��"�M
6?
��?�0Af���eK,�haYs
+`�Qs8�c۰b�]�B�
��fH�-(kDTxu���ͮV��irg���J�R�Y�К�6�WwBPs��*�:���`ω,�8B�\�`N��sFpن��4�n~49Xy+�[ruFVv�"���7M��g�.8E?NP�_���O�lђ��ͤ��JXTr5��{�q
�2��
#C?M����Q}�b6l
��ꊄE�ը�����8����T�v�ΈZ	U�^R���@�?#v�O����7�q� K
7`�VFEC
�x�Ä,��mKvj��	�y���4����AT
A�~]��konP9��_,��_1b�n��%�:xƶU��B�ͫ;���6rх=
���V
��iI��
3��Y��/^�6���r��k�PJ��w�A�DT����,
��0�>�vtf�z�-�~&fՊoX2���ЮS���k��+�
���h^y�`@d~%�}�cv݄�
(s^��|������fˁ.�ly1*���`�eLɁ��&X��?),�k����Lo���st�,'=��Ems궋
�
Df��Y�C����
Ih�
���<r�
+�T��OmY0���X��$��q����8��X��W��ei7���4el蚒>��i{N��5sQ��18`ߏ�8�[?�X�
���A�zh����Ŷ�9sw������FȻe
(cσ�_ֵ��+��	���X���ځo>x�������Yvd޶�ؼ`��

c[�D�-�t�I�wv��7��w�B��q٦�����;~
+x׍�Y��%�� �֎�
,��\����k��~	��Ț?�h�՜��p��#ulj(�g���:��E��
�Y{^:!淐-cg����ce,([�t��
�bǍ��wCs������?�:sf�����O��Jo��Ko����m�@X�B�����}/�uR�%�Q�y
T��h/��Š{�|��S�l�����WYY���%L�~
C�m��o��jл5/�i�#�O���8��l���2|�
��¶����;>dՉ�L�y{S\��v���ኲ���a
gG����mSK†�#9����|}�J(|`�6�qE{vl��@냹��;
����jЋ%-:gL��hB��t�� ��c���b���07��F��c��
�μ
�f%.�j�/+���ہ�݇s'[�f�&�kc������1@ .�㣃����6L
/w
��}/�|�	�\3 _��I1�#�� �Qy�/^
�*�:&.�<%�����%���'o� �œ�����S�η'���C��
v��s��d��v�~惃Ըc����ړ���#���~FڙQN�o�Š��lŢ��`!v����
{g檺�ź
+�|YӖ����%��5g�;��|�bS��w�])�&{�������^D՞Q~��a�C��tС����D��{#������e}
����?Go��fڮ}���[�
����Le�F��P���&b�݅����"�5@��;!	qj3�����=3���������w�y
T��wW�2��
��J���i��~|0X�`�u���ު��_��zn�TC�/����:��s\��l����ŚFJ�X&�	���=����ab��0���>ɥ�"�
+to�t����jW٥���G+\�Q��:��������T����^�Qτ���c��d�F_�u�
.����␲�'	�!�#��U��
h�5^�z�}e�WN�Ǭ`�&�%!dlu?0�V���U<��WGT$��04r����_#�{�|�WK*p��I�iX�� ,�>G��h�n5�bw�0�LC�c���	�*.vo
����m�������k�W����:����^y#=^%��mQ�Pd��E�
U޷L�‏q<���h�4!�-�Uy�
�G�(
� �
��Y���o
+��^�_���<�Np
M���nT�c�Wr0FK2���:
�{0�{��qK�\qv����/��h����S�'��'
+B��
+
PbS�&��뽈��g�

�>�^W7%�8Jy��0�_��x�B�<����?DŽ|��+N(�
eM��Xŝ�W�?�����'D��1��ߠn
�������#5Icؘ�a��N�����V��[�.ij�R��

+[zYx��_q�9KH7K�I3-����?Cs�G��
/��.�H�^Y����!痃~�C�<1m
�	f��mW��,�JOŭaZ�������E����g�z�!�䛁�
���#�<�$k�&Lp"�s���i��a�3�W���e���6z��{=5I��r�K<�]�I:�
̻��[|q���y��f�������^���!�-Mc��3�AV���W�Pݚ��� :�=υ�?A=�采m�/�i)���&bU� ���0M�
|:>ΩdUl"�
/�/�G a��ʻ�9t̑��P���XxW���'�դlPk%
%>co���vW�y�XiXPG(Vw@"*#.x4ԗ���/�<�S�O6�|�}e�O�tML-4�T΃s��k.|����a�Ym
�~��$��&E~�&}��
��F.��\_{�8YaS>o�6���|��Zh^��:㗭�«�5:ѩc��I)v���R5�j��Z�3?�x�$f�/��ҋ�3�4�z��
�q0>
�ʿH���d�[I*:Y�A�r�N_i�jg��>-��3ݧ	eF�k����Upѥ���e�\���b#
�F+�4mɧf��1в��a�_T^�<��M�Tqn�~}���;@���'Ǫ
+O�w�����	|�vٵ���������pJ�Gr�9�)�髹o32l�Ą�	��D�m��7	����q���7�������G>0#٦k��`ww��om�c�yg��	_ov�#�Ӝ"����=�~���=%��|��
���C
��G'��%����Y^�]�|jh�:�h��~��𽺹�����H�ȷNѳlӴ,� be���R�p��YA��c��j[r΀u�0N`bT-�?
�c��^g�G��h�ήw��=�>��.����(�z�a�xհ�N�ж`"��"��
+b�w

o
��_�,��MH��-&�Q 4�j�l����QJ�����9gBϫRҘ���k�9�_ǂY�11�̤oii׿��\��6���>�Z��"�t�.X����j|��H��Վ䳲�g���[�<�g���#��j�
���~9��!�Elw��
g<�J*L�aZ�~jo��3t/
+��5�*��Qē}��摊��ih�«�s��n%�xk���ʛ��L#�1��H�<6m
+��CL������^ζK�%�Kol�Bn�u��Q1���߄�
:F٘yf�mރ�v8������>���%���r�-s�~�g��fY?�O뵍v	,�`8�i�d ��9O��Q�n�H2�������;�����v)�pw�蒼6�[�(�3o�
l��"��NH�_�CT�J�
�GI+�^�'���^Դ�|݅������Y�ǿ�e;ͯ��7LO�$F�� �țJ.��
��E?-�U^��%*ڠ7�M���J�� %�4H|��Ɓڌ��!
߽�����p�
#�<^�ҙ~J�
��������S�o��Q�Iq_������~�����(3����O�~��	/�Ǖ
�����K��‹[���W�Wd���^�]P��e�|��OM.|RTtc�j��2�p�b'�ۧX��	B�u�;Pvd���r�8#��v7:�
Xz����No�m�pe�u����6��qr�7�~����xSrq��s?�����)?;ň�5�̧`Wn��i!
c휍NR�m�&�:Y��Оi����^�83���Xo�����"v�h��L�c�캱���fwɕ�7w,b�2#�Ѽ����ʙ������C+��E�M���K�W�7lf�}�Z��
��������ȍ��[�o
+ΛC��?ҷ����
�*j��ҋs���@��
d
�F�
�<��X������d
#fZ�i��S
���Ow��Nӓ�U}X�=ݝd>�ğ�]��A-
朣/�����~�	�~RsO)��<rb���]�䛇2V�i�����>#f��ύ�Nݜ�L��e�<��&�d��R�
+N�FW�ݍΒ�[����+S��?5�̿��.��_�\�[M�X�*�b�A'�ڃ��-_6Du>
!0@�Q�|�5�x�����k/�<*&�,���%�x�
&�.�$�A��t�|��x���c��֫b�;�I��:��&lt���<ϻ��]1#�OX~Nь||8#��!<ӿ):7D��j�
�/EC�������̔��sX��S>u
�j{�=>BߞyI���'Ë�SK�E?���\��Ū_���쫉��C�]m/<��Vr��y�:IHн)�4Ɉ�j��}�W�n)<����	^ޯ�ձ?
�cϭ��=�#�
+r����7JNӴC�#��щz�_���M����i(8����l@%�
��m�	���a���@?1�*���&��`�U��{��]_��sh�0���뻽 �t]�ԧ�~
{^;���>��\Է���}�č������k�	H�vW�������Ƥ�M��V��AI�w#���^
�f0��)t���X�lmG�%y[ѯ��Y���\ W�l�
�TdPN/q��K7�Q���o�(��,����������K�uUc���7%7� 9�������X_��X�01a��䢡-��R[������2N��ٟ$&7U>��
�ӟ��j�|jz1��䅗E��
i�W�N�F>qH5��Qv֏}��_�/a��]���At��;X����^;:��NB�o^
�=�~*�e�!�~��^|�2d�?2M�"[1�O5�'ZUB��%A�PrA�PpG�Q���"�:^�q�T�e�C�
'���90��gz`���&D�k�9�7}S�eCk��6q��?��ح1d¤(�ܾ�a�6RB3Y�
�J��hW?8��c�
T�ǭ�.5
}0��q+iel
+y�K���٪�C	$rg0��fo����k�)-xd�'4�EBM���E$��S�u��*|����VM�i��d�!w&��{���w��+�#�(;�z�!v����=<����b��>�es���椟����v1-;����)9Җ�s����IV�����)F�7S���(�ߌ�"�!���߃�sH�e���3�}��n��{r���Χ�7�
��~7SM��
=�(�KZ�|���
~w�y�<J��
�fh^��ta����"�
1�<���O�a�Q!r�=&|����zw�Օw���1O���~b�s�.=��_m���������9���{l��()����"�CB�ֵ��`x���Fg�/K-q��}��l���F at Q��<y�L�~NT�蓡�s�����𷕗�g�� �7��n/vUߗ�A/W���*��
�<��:g��;�y7���wî�s���k��&�\E����o*�{�aœ�{���{���{�����p������N9�z�}o���2E��\h�&�9�٠N�
��������$�տF��d^X}{b
A��V�������
we���j���lc"��Q�;=H���ę�����W��t�έ�Pҵ
�ˋ�P-3�
S�����_��
+��,�`G=�A�Wq�K����s��@hN���j�!$Z�Kn������:�u��b�2���.�������}\��
hx8���oM��}Y�x�����0*��p�'�0�o�w

+b�
��m
�-.��
�T
+�z���:O'��s-���ya
�ڭcR�z��*�z�D�
L 
�+������j"�äh�4=ӫ�!�h�N)5�ph��w���3K�3���z�W.�G)I˯*/�����5 ��iK:�mH<c��z煘����w�� 唒��	і	b��e�ﻣ�����	|�U&��Z��)�~]j����C<4��b�)o�����k�V`�2򍣄g{c�h}',L�����[�àJD؛���#��4!6G���C���ă��n���m�d������ʃ1���at�K��X�b䭴#�)�
~�d��8�O��'k [�M��z����m����ԫf�
���(�J~���8/�/��8E�0ϑR��h������#� ��Yq��
��?��F,�1ς
��C{z�
�&��^��z�\-r�
�x��/y�������
�0��8V~sw����`��y�L��]35	k}�p� �� �O�k��JJ�NO��
�Q���J���
�d�=�c�
�{���򃤾�G�E������k�9?L��n������貪
v_�Ru�x��Q^��������r�ߵ���9����v�d���J���7����i&«�bL����ˋ/�O/w�_��G?��?�$�~���*&��%�"�,1�p
��_��2Q���yԤ
�[D4X�_�bJ�_�M��1y�
T��2k�����C�O0s8�fU�P�w'�1�}U��X	��W%���"�4p�GQIü��it���M��y
�4<^ޜ|f�u�u�$�O��\�G"�o�G ��q�������
S�Q"�V���,���9r�U ��e����V�<�� !�:CL���#|R\�U��Yy�si����z�s�]f���lt����@�~��{��6�5KoJ�K8��l��Ek�E6))�2�f� '^@n
NR�
�R��]
�C�����09�!�o�����.�]ߒ��<?���k�u�0K�G��]������ְ�N9��&�$yd�
��I�qR�M,��iѻC�䠆���)�'
LXP�A�'�1{������{61)�`���M��1�G�e [...]
+�,t��?�	���G:�9K��D<0�p�k#<��{R��~{��w64�h�
v�%������Z>1��(
�*Z�ܒS
�=��<Tt�����&��܇~|��g��<�7���'�
�K�N�*���S~=��l�l̴0�e��n�g�ms�R�����z�}O֒p�Й~!�#V�5���w��w��i>%���PN��		ʞ��oqq�J�Ӽ��!l��Eѥ����ko+�<Y�U���J��9���EQ�Sƫ�
$Dᆵ��k˽ f����*�ʱ�\q�ʥ.�!⦅E�gh�6>�8
���+����[uK֔��BgY`��nV��ڢ�;bԩ��;��ҭ^�c1#��qz�����Ѱ��N͡��o�P
+�+l�[˨	.p��K˷Qq��X�;��}	z��c�
W>]���ţ��\��Z�ZC�U�#oI�嶙�`<2B&𽬵����ԓ�7��
���w��ͩ?�3��
T?�X�F�5�02
s�ʝ������{��?��Ӿ��2A�B%
-4�̡ycRf�[�*�
�:������LSҗ��n.�,=o���n
�R�-E?otV���p�u�������zЏ]f��!~�=�n`��=���Z���Lc�v�5}
+rN@��8�<��9��E�C�
��9CH
+hAf�{_[l�q鞧ئIɻ@ϥ���
+6<4�]�T����_M5{c�+��[���k~5�j���3FJ��t���1�}Џ�3�
�
j�VX����~l�j/!�!k�w�ۚ�&���Z���o�=���4MS
+צ�����;#���N� i�fY���)b�i
�`���4���:�� 9w�5��j6^�O��L�jr>m��D����ڻ�(��Ap(��Jz��
+e�դG+�ݳ���3�S��.b�6)���Vs�o�G�(��;#ȧS�g�O~5����.��a�C�Kp��!ǫ��
�]�)7��2�'1O�z!7B{a���:��������<��-#e�Б��o�ڹ�S��
r!F�~W�^v�=O��a�@F}60�.
��$AE'ЏC�vAo��Q�����P
+
��<��Ep.�I]����e�6�x��AV��
����������������eKT�a�K�(	2bƟ&Q�
.�p
+���P�>�����:L�RъW� 7����[z�kM�
.ik����8.jo������9����]6��������QNс��c��=��v����
+|ډ���)�4!ѡ���tï�w����/���S|�<����ы��Lh�
��W昫E v�ѷ�R7e��;	3��[}�{�uR�F�Y��+�梟�A�K"�tM
 �AR|7&��6Ƚ�gY�?
��n{T���
�����
���,�HGzJ�G�O�����/�]^�Ɔ�
+�OۥČ����U~��:������ԑZ]���
)hR����J!�:K�vɨ�~��:
��
���#�
��d���6��6�`a�<
+�X�G*�)�@����7��1
]Ǡ[�9��6�W�h�y�9b�o�Z��`�g�����!BƑ��k�@F�F*�ʮnv�_w�@n[�}zm����eM�m�	0�}��V{����k�#w\s��=�}2�� �e���yC$<2��~.�:
}��6��UƯ��e��5[dT�����Z/>ʯq�ͧaᜳ�T��k���Ӝ�F�dc�eiKQ�K�C{�|�WŬ.������49u�

���[l�]�q�Qs�Z��€����@y���
���^�]��S3�K������/���U���p�E.)��ظje���w���sȉ�i���;�Ib�E!@ٕM��	n鸠⬪��=Y�e�A
�� ��z��L3�x���X��[���vV�+Z W�q��-p8'�|�b�.-�ds����0�S�B:uu��qb�y��i�2*���8-yw�o������ 9��
�#��	�w>�D
�"�_ at o��+�x��H�
1�-�-bf�C�,�.�p6%�&�ƙF+n����`~�-i�zd/D��Z�Z-eg��k��3�ب��Ȼ[�+o����*2~��\Њ�����w���
��~�#$���f� �(J/Jٹ?l����A[Ϸ��2���
L"�� ���1��ԕ�5�
y��J<�X���_�}z�E�9�8"�!�D{�l��]i����Ĭ,�\#���U������W�ui?�7�^�
D�:瘨��:�U�K��Z�NQRUME�T
I��V�:G=^鮸�USJ�.٥� ܊��N@����6g��6���nH;�ޑy1 �f�Uu��
�SEK�)�����Y�c��:�`
��`
��6KͰ�	��o�Q/Q	��I(ٟ@���9��d���n��\���=o�����*�@��W�J�	�d��HY�MR�zb�>�:,rb����i���R��W��z�q
+�d�%���?Y�3�x�Qn�EY#$�#w�k�.�)�m�=�ց���@�}\�3�/u
�4��MQ3��[:L�̊�w������m%�9I��~��:"���fW^ϓ�V^Z�E?�� #�x4��G�hy���1
��������)f�!�ٓFͧ
.��fë�%��ߓrJ7���m��AQ��+�h��ǞX�o���:�i�M�_,JZ��=�>�,t�ۀ�������5J�Q�H�C${�D��vm�>�{�B�]��u`����n��
�ĭk�4���X��i������	�i@�,
�8��B��
��,>�2��\�)��ܑ}}�=����/�
Ͻ:v�S�(�ki̲7������ *�<Ʌgߴ�οi5Jq�c�.�����3�įe��3!�h�I�'n�-
+sV��[C�d�(=�8L�Q4g�܋|�7��6�+��c�G9vY-xi��-��k����������wG+<�U#$��Gj"
Rj>𰧇ӈ�l�#Û�߶Kn�@��M��1r��(���9�8N��(ş7x̠�����btm��l����d���W;�ýr64�ɼ*J��py����]EW�@W���#���������	|��`�c�8<�<������Y�
+z����
�n*�d
�~z0^~�:	�ocSvGp����������f�y�=�ז;ˮ-��|�3X��5�+<1��'k"����4!ޡz^�TrQ>�Ы$�oB���$�"�2Sl`���a��&���!ã�U:��ơ������

����~]��p�Y.o*:k'$���R�
��e�
��p�{B�g���Ֆ7[��n|�� 9i���m��ԉ8
}S��#o}��щ
=�=b�F'
J�n5\dV~��
�4�l�Lr(Ŧ~�
+���+��9籉ih��ĩmn<Tv�,�ђ�{�wo���6�a���t�dC��h�2�t�"�
-=�z�
s����Lu�>n�6�8l�
+�gSSK�!�h�������%>ͷ�B9@^9Zi{��=o�z�SN��ȱ	.)&�:��y6�2Q��!!e
i������!�
���s�����շ��
|Zf�� x�B�C��6���5��&E�S���y�P��؜m��N7���ec܂�A|��`�P�=����I��ڛ��mO���N��Ă2�(%n���Y�G뎱~���<�z�3H�<�T��5�ib�RG��~Z¹!��3�}y7���*3�C�f�S&D;d쪭��Ɖ�{�I轍��1�IPϬ
홸9AK>^�R�z������P�����
��>�J�%���|�
��iV�W�EY%�D�4:R�"����������
ag����n�����Z�y�e��d�}�iL�Iݜ��i��b���_W�S4CÏtl�}��Бyn����ۚ�SS��Sko�7
j!v��=���Q��[!��B�A at q+(%�#����&%�®yѺԇM�o��
pV�]��
�dP���Yx�KQ�c
������c�U
7�myL���qx [...]
�W`WR���i9.š��:5<��.ɣ�����
5�*�᠏�8�V0�S��?A�X}�x�9���+���:�a�C
+U����OkLJ at MY�����uo �ׇP�<

�w��wi�%�%ҩ!Uք�Ǜ�����V�a���(��Y�Y������;`hiq���	=�"F���_�<���t�ya�v*‚�Z�U����$
���61�s����XŽ�wɿhڢ�
.򉇡9���j�fwe�w
+��
䊿6٤���'���K]����I\W�k�i
�X֔��rg�
��9�%�|y8-B�1����V)�P����
uk��(�����g���ׄ�E&e�fpq6��2@���Åヌ\3O {�l�FB�O�ȶH�y���2|�G+�ۤ�������}W�p�
���y�*��
s�jq����lBp����S2w�j���iCĨ�ar�m�]�V�Жir�O���%�t�	z���ˤ�֩�{
%˧j�:U���ܔ�U�%����E.	��DK*j(%��2W��n'e�yf��|Ǧ�3s
�k�0#�⠜U�U3����H�;�ݍ!���f�^@8Z�|ZB�m�q���|٩o��Vߴ6�O��V�q��� Ȋ

k����֥�:���e��ú
Zi?=�Gqm�U���]�u
2L����vU���^
�*�\_�5��Z�f��?V�O@�y�
�,�"Eě�<���:�Μ��f�E������
+b摎\�
+��J���4�Z���Q|����_�D��~�m�����گ���O��j�U7�

+z��h�������V	!ͩ$��^�Q�JB�S�H����
��YC�6^�\6!�:�T�S�"�^�l��L*|��{d�{����V��S�[�>� �ة����/
}*Zᑞ�v+�p��Sh�b�.����n���l�� �/�������T��N�5M1���9�o��ωb�R5%��|eo��`����<&,tJ�����#Eݳ%�^r��SO)��~��z�51-3���qZ�M�+��� )%���|Bl�$?��~��'j҃
�B����?�ͳ�ߵ�	�����9B�Jg�E]k�ώYL�]�CH۪o/��D�<8�d䉁�����%.i�]�٥�������ˍuE=�"��
NU>	*q�'
<�O˂{U��ծ��^�i��T��2��RR�s���'g�լ��"�h���-��$��U�մ6�c��
Uޙk̺6����5
O�c�Vp�P�Ƕb}�P(N�g��D��g_���q�q�*� �kk^`$�^#��^�������;������]��ͺ��fx���v�49sw�Z��a��ůcB�jB�y���v�9�
)
�ڷ��bS��w&��y
�:�@r*�U~
}(�I���q�9J�Sͩ=Sc��̩d��2r���\��@�HX��n"�㌜���νYR�� 4l����f/�WK����"��7ouHPl�4Ѷ'�劎��ŷ���w�7-bD�O���k���
��(�Ød���RS�[Á9U��:r�ȭ��ܬ����ܻ?C/Tw o�y�7�������:�=���N:�kL��>�J9�45h��-�W?m������y�_�e�N�ɫ�쓅�Ƌox�x����q|�TS��O��o��o
���mp���{��;n
�V	P�y~�U�*�
%'l��B{;��,�z�KUO��x՛��k=��{#���Yn��9a�
��
��WŁ
-����쀳��8�
��,&���B9�m��S���jC�ȭv�r��#�؝�һ�iL�[ɫ��G�3O,@����
YFk>�y��K�l��^�9�	7N��7�*o.��>��ƺf��9��DWK
�5v�P2ݳ����B�UZ��:�
�ѐr�Jr��"
�0�[́��P�Bs�g��������
�i��*ED������sOV�x�����0�?�p�1Ƨ��5��	���؛
��~m{��0.�8�,y�]�.qIP�vP����=7O�"槵�����i��d�^,w��E�S��
"�X��5��jW����-rbd<�
)ϣ ���D^p}Z&qs�b��>�h�E�kM/���M��:np!���	fqYؗu61�g\
+�&�@vČb����M��s)�(��Yf��I���$���j�A,��Vf�%��ա���<Jb�i���rg�o���[
��q���wMğ|^���
�;���5�>
�fy��,J
ڪչ:�5�
��
��� �d7x��
a��?�j)%�P�*[�����[��g�iZ�� d�
��5�h���.2�V9-
�j���S_�s��ٚX�,2:�Eg
��.7�:�-M[bn��������\��(,�<���Y��8R���������<�
>o}��]�	�z��F�Av��<^!W�c�t(�(��W^/}c��I�)1�
�eu5n]
͡�
+>|��;Z�h���(>�8IO�
�e9f1��z&�a�MA��
g��$Y��bˌ��$ff���D���OO)pih��3�ؽAx�\����6�߻}�7��FM���PmyԼ�P�
���ZR�s�&~wq��&l�8�&�8�||��"��#9�)A&���ܶ�B�XŨ��"i�'��f	�
5
X`V����:�4�*LS�' k������-��S��#��Ta����?6Y��k,�GE.�J���zrQp��!�g
���>h9��Yk~��R�렮�
�\�M%�
�k��#�g�	����O���(E���_-��,��Rӏ����5�q؃���K��w�E� �?t���V�� 5ŧmi:245u�r���5T~W֒|�:S��h�^�a��γ $���?s
q��ĸd���q����G^��|����[��s\H�z�C-ݯdA�rr�K�O3MA#����B�9��46����^.�I)�{c���᪇�V���u
Ө������;3
�c��ɽT/�
�.��k
��[�Zۂ��4��U��?�iED�t-/��M-��,+��8Qw��"~ڬ�?^5mW�Ҷ�n"�6��mJZ�[C+vk(v����$t
c�]l��!m���#
�a�G9^g�| o�V�L�"
�X䢿��6������K�9.
03�������q(�//QJ����o`�산�4��
4���ll�[A�z�q���N��
�҄fp �%+�TK�)���y^�u�=s�G��F1%�p�U�5Lz�5Xf��G���4"�K�G8d�j����R5���Z唆���u<�u�
ٛ�F�wW]6��^^y�e#��V9�Q%~���%۷($�f�z5�t�<�bM�
Ԡc�]�T��`=�CV�f�5�7��7���tJqɎ9f�Cɫ�ϱ����p{��i��U
+b��?��bZ!�x��3����4--`�MX�i��[�5��7��Cn-0*�f��[�(�㐀�R䙃�}4`r}*L��X�]P�
�ϡ=�'��-S�
_蹾y�3�<"pf���ILKs�E�#Cs��)�v�[��;�,X�"���r�
���~8+B��[f��i�g��*b�_KC���c�b��\��D�C�46�d��)�§z5���Y�Qs<JZY at W���.�
�Z�)���Wf�P�/�Q?���k2|j|�[��:�1+?/
�A=�TR���緔
��1�#�A��
+l�c��;Z5~�my�e_�f���8u��,���tjqY;ӈ�;��H��G�ύz��7��mz5�_o���%�����p�
%�6�O>^b�>�6t(^A��մ�?��M�v@��}�<�Iɩޘ�%�䔂�>h�s��Ƿ�F����;��Q��
��x��8T`���q	6%��d��������Tx(%�{tԪ�uƳ���zp13��w
*"��}ݣ��t+p�GzV��u�eT| ���rc���ƠADܓ�5��0IN��0����	�S
�5��C�g�}�����+.9>�.'g8���KB������7[�n�G�,5P�V4Ѭ�&�].B9e�2�
)�%�� =ϰJh���j8�"�Cˆڕud����6/�JiهRB����I��v�����rvaa�Q�c���	���4IJ�
���
���R�O���:�YJ�2M�R
J.̩y �ٮ���:�|�9�}
+8
r� t�lr��*n�C�.��Ӳ�2J�]N���EX��A��r���l��]0��޴����!
���,੝Yv�R!< ��-gT�CoG a�����,jy���������	��طX�r����t��u4�@+��ɥ|�hh���+=��6	���F�k\�]Z��<Yr�2	�)h�Cg
��jk9^-q� �~Yɥ���I��{}�{���?o��ܳI�yN���8@�n�=����y�%cV��\�������`�=�x�[��MR^�zoͣ��ܓ�zQ`�O��JC5�t�t�
�h��
m{
+j��U��V%����q���c
0�2
��W|Mќyfg��]n��zs�(�����Znp��
<������%|�yr��Y�vEM�F�SM+	��U��0��U���~5��8v����Ɇ�{��#�~|˔r�e��]fa��,	��	R�S�����:|�����J�,!i_LJ8��f�W�ؿ,��?�Y,�<2;�e&CG��ؤ�@��s0'!��1�,�'���+0ɦ)�����_� 
r~�m��g�AG��^���u�H*��J.��N�
�lq�V�x����W��
+,R�]ƭ�ϳK��W������D�.�ꭸg�F'��L���A{�-�6Y�
��	0�|2!�2����E.�.���[v�5�,�x
��@�-Y���׾�\�u�/��9穥�bB�����ذjo�]`���o��0;�B�AP�t�q�m�1!M-ο��`�c�nM�g��ֿ�ݢ��T�ܠ�R
rO�[�(Z��jD�,�a�`
a]
�#��4l��
-�8��S�`A
������k{���)��WUt\�`����ģeN
`��\�#

▱�Lc�؏z>��n�Ľȥ�#

J��

���x����!���Z�~W>O�z�ҭ7�w�Ĵ�
a�,���xp���ч
+W4��fƝ���)^�-��,F�5
�^@�����p�l
E�2F��9)���1>�$�E�B����*�����" ks/p�6�̷���x��剞�j��>:�8\
n�a��ך�-s��
��Z-�����[��	��9D�QB�V[ށ��<���~�|����	.s��(l�� l�����
�Z�μ����o�O?��;�֓u>�㖨�x�ǵɰ�K]�7�:K/
J�7�ܹ��+{��)G�
��\�_�t�_F�^�d
2�sr/�#�`�zZ���V���R�e����8�d	�_d���/��v:�:[�y�^}��OI�x6�2C�rH)�_��5~mM�CVq�6}�x�[|�1��J����,�3��
����2����"��̂�.�CqMb`�Z�a����h��`�rܡ�#Yu8�$;{��hJ?g+
s��3�Ӥ
��W�/�El�k+�b
ԫ`ì3�����[���൐.]-�`��u0�.��������+_6yt�t�4*���}���גO�k���|�9V�C� �,��B���01�e�g�y\(�9�0�E���(E$����Wҋ\���aD��0��q
��#�Bj�2AJ����
���*qi>6٭@�Y�U	�B�C������l�f_�e����2�lb|�_�\�;��]���,-˳�X�^l}�Yj}�1��,RB��ۂ��}��~
�d�������Yy�9Q�}��b

s���.�Y~�O���ӫo!�SԴ���� �{5
�i
�ť{4�|��T`W�
��z�o���$�f��	�'���5�пȧ{�4�OM*�h��.�x����z����
��ׄ�O��Oū	��� XW���3���� Gk|�i�Q�d��t`g��PW�]�
+��
�ph
���Z�s��^��]ru�
�o]S���;[���6i��67���f9�
�ݦw�%
�2K��
�G.u^��Jr) ��
�ș��_7���7���4�k�䞺.��k���=��
�;�
+�h�KC-�j) ��Z`y6�8���H�q�R�k���a�O�s�K�c��92��\rJ�k�Ux��"O�B�W�*;ұa>�"�c"�9X��Y�ӱ�
��د`< C9U\��$������s������:�&i�G
���<��&ѣ�I1��\����X�Y�^%�3!>!c�����W%��@�:�
Jޥn`x�u$�F@�h at n60�\�m��
+X6h`�|Zi��-�xs(���G ���=�9_��;\t�7�w'Xo�'M�͖wV

�w�Zx�
��5C�q�`l$�$\�_%"{5��-bj�y
��^pa�u���SjZ�h�_
�!�1˯
+�j�
z8��Z}���Jgگ^%
v����h��έaB�
+
֧o���8�S����(��R� =���	�چ�^�t.4�=����w�(9�yp��
�e���?JOv��֘Ĭ����
����Q�Ã1z�y�[斲��r.�(����G�{�B�	��8,�<��s*iE�e&�Ö����û� 8yp�x��$�t�YBJ��qi���?6��ϠoNV���:�����/������e.���^b����
+�d����f��

��FsgpE�,q�'�
j��!�Ǻ�Y��ՏN@�X��	�IL��
�ܯ�R�ܨk��}�Ȁ�3ϐs7��q�x���ˮ� @6�v)��x�m�y�yF�u
+��,6�(F�{���P~�C�� �vF�1�c���yV��P��ԺOG��h��@|^��}Y�N�����3\yco��m��qP������}�	�l��ǫ
�d]�,,�-EGy�ظ��^t�� ���:vep·�Ê��3!n6ťf�;�"�[�ı�7Ӽ**��c]@�]
+f�O�,�9�c����n�ι4�y�oCS�)��
4�	�X��]e�c�ئ���Ir���܋&�Y��h�<�  8�d�K=^2+\
Чr��^�7�s�ʲ����[���[~�dž����n��Z��Wxuk��M�=1P+O�oMY�<>��
 �5�����.�͍��+Gb�G�WS�LS���Ap�Ɖ�6yť�W�����?{��
�u
�����
�w����$�&p&�m@���E�	JT��)��` 
Q


+��f9v
'�m)�U,J")��D��DQ�(����|�xo��Ϝ2"fh@g�,���ޫ���~�ى������ś
�/�pq#�߁��6��k{�[/��]|zSǔO^���#�L�Ήw�˻{�.�}�v=���־��A��ڀ�]�l����oj_�{ꑵ��
{�^ux��+��oX=�o�l��]ܼػ�wɴ
+g�/k�|]w���+�Nn|.j˳=G״�`��&�垟L��=?��m����?��}�
��_�we��?�����~н�؛

�74]ܳz���+�?�%�=�^;�����|�֡ޥ��]����������@�~��/^���uj�ӝv�
��k����/_��OV��A�
�ҳ[�O�:�|���=-gvt� [��3�:�^;�o��~O���
.l�N=��{�X���/�|�̖��~3k�ᗧ����>8�������~z~��/
Z:�޲��<����w�z���������ꕝ�s/��^rqwW��&�����v�����1��w��o�53��n}���̄��O���k��ղ��W�<�-?���s�~�?=�?�>�����_'���z�_
Z����˯��I���K��ι������y�����}u�}'ַ�;��{��
�<�|�ھ��
;q�\���g�6��oE��=��}�o
r��4���
K
��eI�͝�OnZ:���5?���s���h
uonޱ��������^���ɍ��>{{�ÿ\<���K&�};��ǿ�Y�q����/MseO_ە�V?wa��/�ھ��؆���9K�z������?��b�u���o��ؼ"{j۪�K{W�_;��k�<O?�Zz�`;�߶xtɔ��e
8�!7���«�:g�ڐ���}��~��ߜX�л�����ۖ�
�w�'��x�%����1�_oy��Ϧ�����f�
�ul�k{�2g��g~��yu��q̅͋&\��:�Ļ����}ʙ��9g7�l=��Gϟ���t�����쉿Z�k��翝cb��
���l��㣟��3��ז�>��Y��;
�K���⮶'.�h����{O�����{�w{�w�ǿm���[�
g1��0f�����[z��g~|i�@���K\�?�;�����ƥ�N�k�t���q��4?|e!{�г�v��?����ܓ��t>yqW>}yW~��7����|������]�y���?��پ}��Lx�7
�/�<��ٝ [...]
7�tϻ������ަ+{��\���ֶGO��臗v����s6��+`��֟�b
���YTw�O���o���r�.�.��K_�ٻ���65�z�|�������ܤ�k
��oz�
��
��9�i���������s�z���/����3���}�naֹ��s�>{dα7��w���u��.z���za�s?>�����k�����ş��t�ŭ���[��}���u��S�Z.�]��=��Ɩ�Nmh�p��^��1
�<���w���8�nϓ���7��ީ�GF
����N��?y�0�[�b�w���N��o��ӛ�<vlm˃�~O�ߚy������W�����RօwsS���si�Ϟ�:�����~p�?RΑW����m��m�SN��rt
��6�=��g�go����9��y
�u-��_��q`i��-M���6�����v�g��y��_lX���K��W��9ϼ�+;��{����
��
���[��K��Nn��;�&e
��;�!�xe�������Á�O��w~����>>
|��������^w��9^�vӶ����<n�/f���͏���'��X�}���
yiֽ'ߞ�=�
���7{��g~~e�ț
��ֵ<zvG���|�

���o���g���O=x��+�7Z~nWς���-7>�_y�@���֩v�N9�;�tbOo��ξ���rO~�V���W3�������Ks'
���.�AYx��7�8�;�w�w�8�깫�Z���}�ݶ	7v/M}�����
����YtbKG���+Z�X�t+�S����_޿�kۦ�<�[t}ߒ{�}�����7u4^ܔ�}y�@�ܺ%O|����}�����X���ǯ����x��՗w�,��y�{����ޙ����[��g�����[�m+<u� ����Y�r��4�N�C'�w<zz�ҙ���̃�������̦�I�_^����_���re���]�<�ov����ǿ�r��`�.���S���9Ή
�R���}q�꾋;�]��[K'�
�s��@��������� �,z�҅��v�~bM���7{����ꓗ�^FosǓ���dP?^����ٛ�N��6\�ݛ����	}�k��c�?U>��
`߀_�qrӊ��o.}샗�'}���g���;��y�����N���5
��ۺf�۱���5K&�Z�t��-��7�5}��f���^�b�w�f��O �/��.:�N�C����������=]���-������,|h�O�|�Я���{V�]zoY�����緶>
+sz��
-��qᗠ'��}����g
~5���Z�ll~�¶E�|w�������y��-���l�
���ɭ�SNlnm8��s���K�_:��.�S;>�Ż
���
+ٛ�_x����q������^��6���θ��/&�
���}jc����h�O��x����Z���[��:>ymW�S�vt�;�>��kf8���~�Ԗ��W�[��������=�a�Nmn�|u>}l����3��j�yq_������K�sW`M��X��̖���
+}`+��y�s�̓
sNl�x��7�<prC�Sv�������zp��$����eǟ��9	���K��:���|��楳n�x�p}�@�-�
a�s.�hi���釟����.�~:�q��/��
?�����C���s���呮���;f[����E���wO?��ѩ�폝~�y��_L���+���/g�
��S�¸w���ї>��ѹ�Kg]��9�����ٍ3�{z�"�Ԇܤ�[�5��
�Jn��7�~o˳����_�s�m��
�pE����E�N�~`y�ھ��
[Z=���������m�Ϯ]�|v�
g�/o;�:u]��K��2Wv=�,�J-��,2O�m
wjC��[������V��U���{�λ�o��+�
�}m[~�
퍟�~ݺ%�����Uw��\?Xh��AO��ݳ�n*̹���-m�~�ۙ�pikK�
X�������/v��nν������?y#�詍��>z+?��k�Ή���x���/���ၾ[{�΀<9�nW��ͫ{��|f�G�is6�������ؒ�ꮧ{�X���ށ���Zǽ��<��I��;�f����O}��ks�w��E�_ݳ��K~�����S;
G9ru{ς���>}�����/����7O��{ h��]˻Oll��)�vt�<�����W��%�6�~�6�pq���ݽ�_���
{z[����g~(�k��9�l٭�������M�'o�=��,y����m=�/��O��C����8�ry��	�j�_��RJ?��oə
�
���xw�#�~������>��Ҏ|�??Z������{�|�)p�@_����{�7{��ֿ��
O���s��
�����֑e�Nll~�����K���n
����{��;Zgm
��d������6wM���g̯{������
�n}Phwҕ]�~�����/����������ֶ��Ǝ��7v�̿�'�������v�>zew��Kۛ
���k֑ߵ����3Nozq����/���|�CmSOn[`��ש�>�zv��
��~�J���������P��&�_���-�}��g�\�����u���Z���k�E��/li�p���?;�ˇ��1^ؑ
+kP1���Ή���
}�}��ϧ�ߏ��^������Ӿ�ɚG����e˯
�:�n��/M���ic.m�M��sE���+{On[:����
��������ɹ]��ckf�s�7�jO����ꮕ�[����}͗��5�����I�]��Ï~��M����?~��>	6̭�K��
���Ύ)7�����g�X�|��;�f������?��������ŧ��=~�?~�ꌿ�❔v��[{W�ܿ<bӒ�>y��9�}��ꞁ%�wu�:�����מ��ȫ���<�6�ց
�j~
��O��vnS�S���-��
d���I�w�ݿt���+�n
X1p��g�<|fk�K��[o��r�*�����|���q�{9�����ǿxk����S���W��{�@O��|���U�\>0�}�۟�=���+�����W�x
l��֧�?��ɽ�ce��=���,���_�x�<���G+�;�y��
�4��g�������ܳ;Z&�|Z����m7?[�ܲ����{�o�}�go<��5�O�|����n~�ܿ� [...]
�����7gR��\s���+�0����Ύ.�S

+�m�-dzpm`]���lGs>Ӆ��=�U(�
�),�u�G״1���7�+��txnWk�ҾTG/_۟m.����T']
C�W��1j�d[�
+e��.r�rMK2���\oW3�o|n�\[����BO�X��rT�=�h\Gw[j�^.��f�r��!G�|:\V��,�j<�� 
���[-b�Лo���t�3�N�Z�l��
���kV��4�z2��3K{a�'��]C�aWnz![H���X���3�
���e�!�P��ZWo�t!�Wf�[�
1d�rq�gzz;�����r$�W
]���Kk��R��(S��|���u�v
B�A��9�M���ә��Tw[6]>Z`5
H
6�"&��L>U���Ƨxð1OC��;ד-T�;wc
d%�;��&dZj�&.`�a���%���L\��$.ఈɖ|
+l�ɹl�(sˎ�$>`u��e���L|��L|�\�&>`�Zts���`4R|@p��g�2
��R͹�Q�!���A��Q�"�"%�}��Ѧ��A��`�V���Sh���˦p@�B����B�����ɦ�����h`��D����ᐋ��O�˂\KKO�08A�b��\��j.Sy��BK5��^�ʖ�ݙtoG*��@w�+�U>��o
zۼR$r]=��
 Y�qȑ,����7ߒJgd�m��nJ���
�ʔ�Ahk���tR�P9������o4Z4��UB�|�H�T�]�O�ӱ��X>
��^	.U�F[����w����v+	0ݝXef�ԉ�R0�<���
՞}�P�$�tX�i�N�R�P1�T�<(�9j/���@�l=�>H�!��9
����p��3AWG?�05�
,60�4N�r�(��a@$���:3��y目BG�]yH�b�8L�9)�o��L�<��R�8����#)<�z���
U��7k�IC.�1>��,/;^^�Vc�G��Fd��W��e�������| [...]
+�ۨ�iwV"ӆz��6���)�
5�����H�e�c4RX~����
e�f#�G@,T��m�w;(��z�u;h*��)��l�F�f�]�Ȅʶ"
�
��ꋾF��i*��F�+����P��N5����2
�3
�t%q���C�䴲�Dw�d��aSG�=�
�t�3�U���
y:�3�*;�<|�
+�E���W#E�k����W=�\��[�������r�X�
��qR��^�Q�B�lw|���1�v{��}�C��Z����⮖lGG%�k
ռ�-�\g����C�D��f����k�awJW&Uvq|:Ց��+��9p���6t���R �
�|Eҟ�z�l���|��S
|���S�l/b�~2��L
#w
C꣫l��J�{;{�	���z�
�\�rn�g(`Q�:57g
پ
+Vɿa�<�TW����K{TFv��:7)��2?/=��f��h��D�����t�U63��W����\������{K��™�+�)����Fr�L����(������pf�(��+�)�jO�$�3I�L���W8S���vQ>�
g�oJ�L�k9R,�]8S�rT��u�3�cT��^�Ό���)���N+�!ô�#�Ya�v�b��~%#g-��8�w
��e��M��-�*�/}M6y�LC����,iT�Y�>C�%b�=O"�ʒo�7Y���|"���ȷ%�
� 1��V��-���H�D�U.��-�n�tK��h�n��Ѣʒ�Lȕ��7/K�0QL�|���l�&J�(�!Z���.6c��UPo�c�Ͳo�i[S����
�e�*ۏ9��`>әl���IS~'�����Ӎ�\��'���;�I��k�ty:,i�r{􆳉K��9Ӓ��� �ugR�	���
C/�k��B��-�W�����w�9�P;�6$�l���*�Qx�dS'������T��(��
+gp�}|E\T�R.������y4�w�5��`s?�m
j�F�\��Z�v�Pv(��|Lڇ��C��dよ�#D�U��.q�����ü8���a��`����*ÀH*�-�uf
+�o�tU:r�wā�.�;G�N��I��T�����I�9�?
2�9"I��6�?'��$�<�M�h����>KrεI�9�9�yfi��’�s�s
J�T���[@�O��|��+7g[Zz{2
�.�Żʗ���Eh�-_�ꖄU���e::r��bӑmm+������l̢�
9��
F�J����e�Z��(
�%G�&!�$��Q`��+��%q��ñ=6�5��t�C330ζ���es
���|�yl.��,�� ��f��eG�S˳���AN�
.��~���.�L�RQ (pǰE&d��oD�7̵3�Mi�*x2@����LTc��nP�l�7CҿR,+K�o
�j4GSh
+L��
�R�0�v�`N�I�9I0'	�$��$�3T�a膃92�C1�$�!�$��sFB0g8�0�wG{dj��FnhjTn����ڃC��'�9�tOq��U�\(�iBҚ��;CU��.��C����������gF��)�}��
�
+
rK���h����h����5��n�&�l���ѢBGN!@�ܗt���q
�FMW�oV��m��\�7�ܡ�q��0u��M�l�.N*�8��O��K���]�ZZz2$�|��")7R$C�d7�2���0J�)�d�(�Ωt;
ղ8C�
9�8qU���6�\:��6WP
'�
�@�Q>Fm�Jj��ˇ�2�&��w����R�[e�b�v�p���`R��X��X-�2	�'�N��n&�I���d���OvI��Z�p��b���?��Lj
+|�
�B����ј�nɧ҅T��\��m"|s�k��4����ew�iJ�d
�g��f���[ב��
���+����
�Bz�@j�Kūgd;*��g�#�eW�v�vN~� ��-CO�e�$G�KT>FI3���}В�u��]<��$ݤ�F*�&���ʷ���K�G/i�t7e~٧<r�;4�a@%�
�]�$���7�v�T���Q��k�ʽܤG�0�	��ڨ�B� ��
+���
,/*�E��
�h�cuס��Ǩ�B+�i����6�3�?�_vy�H
�#�����0���Xe>`%Ėx���x��K�&^���m�&^`��1j���[�Vv���
�N7��L���
L���
L���

:M֨s+�(qK`9�n��\��5�*_�U�X��/�LF�8*�#�])*�P�V�j��I�ѡ�*�k�����k0:,K5�{��L����
u]t%Ǟ�^��j7	Z:�C����o�H����2(םJg
�� ��SX�Q~�B^=l<��9�X��S���8+1�YQxx���.�
wUȏ��w�����8zz�-�tfz:U�.
+�4�q沭o>(�!�E'ӗo�G�^Y�U�|�{O������m�
�€�ו���Eor$+<n|���JOQ�}at�lu�Z��� �_?��k�ݝ)��T�
�1�x�8�nFw�Ԛ�%M�XIR�.u
��r�Q�ݑg��ߗL����@w�+S����z-$5֊����C��6�Cp���!��1����U#n�i�YO��t׌��RD�\�iTVY߁�v�;��ht&
+����U�\([˷��I{u#2Hz>��9
���Bײ}��A�
��>,�caj*;X
a�i���g�
a�2��T>[h��Tp�G�B��l�~5Z�|K�hu
+�jנ�/L�A�E��/
:�4��	U'�JV�et�U��Y��7��G��Ҩo�{G���BGS��{�_�����N�!�;S�{���^9�U����
^`5}�ZM�W�)m�V�TT��/ؑ�O*��Qp�B+c4�LZ�T=GՕ�T{O�!	�
1NSF�6ẻ�\d���Hm�q�V�)ˊ��j
�ǥ�1݋���*�Ō �I�T�>Ñ�Iz}�[�
|��jT�9-��#�|5D_�e�
����x$�<Em���}Ve���=����+=m�	�QGl�N�V�� ��	�
?����6~�
U�®
+3򩮞��O��
��],�
4�;n$ئ�\Cb�&��$r���j�q

�;�rbRz��1��Vc�=�k�
�j���B���E�s]S������3�ٮ�j&w�3L���e�M���{&f�M ���j���s��K����X2g��8|Y��Z�vR�Zm3^>��N�z���Za�k���v��7��|H���/�� ��++��U
ϔ�^�=�V�w\���-��k�t���
x�]oi����V/,��������
S|��Y�s�*۰��:���

��^���Ŭw4W���[��"Ds
׫m�7����j�z϶\x�n��� �6
|�^oZ�@���Ewz��2
�����#�׻�QǤ���8{z��؎�S�՛&N��5\�Vw�

u<˫�Utk
f�^��Sbh�cD��m�p�=ˀ��m	�4x� �������{����[`�p� _M��
�^���h�e���#N����pF�����k�� �l
��e�`�<

��A:��
C� p=Ǵux�C ��H#@L'ܥ;���q5���Z�2�Mn��yo2��q	}�n�5a=�z�6M
��ؖ�O14��+,���5�Qh���]\7��&�х��y0R�_N
���΃�hL~�.p��޶��DI�
s��	�HKX�3�&O
+�f����A/�
a��FԻ�i"2 at 6��=�� ��M�� 8 6~\\�
�S
Tlj�0h
�!H�@O�n0'�2C�s���� �4
��=�r�=)&&� ����p\�PX0�p�@Z@�4
x�@�C!W���,�h�̳IXV�@����l#Z �@~���!�V�Ejph��H8���': 3 �i�.��kjH@m<xXӢ瘶�8HN�q�*x�0Q*����<@���
�a���/
��pM�� /�Q��t��`��2�
P�&H|�� `ml�.s
�3��Ԗ@n�W�7Кp
Ӥ�螉��0�^
3��Q$�L�fٲd��ڃ$c�0�vI� =P"�%�d��ӄ�� a����
+nsqu4��d �D!����,�_�mV
��M�+
��Ip��,A:F���q�@��$J"I�
-70
�����
ԋ�Q�Y�,�q
+
I�������
���Z) 1���S/\\��隒����L�}@�627Ҋ�;�+�&��A����G���܀Sg��sl`�F����l��g���!��)
��a��#��@��.=5#�$��KįilD �pQ|x¦?�.R!6�Z
���%�jck��L�)���
4"tA��B-��
+
 OtI���n�t�FF@��� ��dX��
��[]����@�
s�S���
��I8&�
~�\��`V<b;�V��F��
��<
8<\#e�`���(�
+
� -T3����R̤�]Q�,M��G�ܣ	����xUQ���+�x�Q�2-)?Z
+]�:�巇��fL
�R��ж�"&9V� c�
+�PE�&@ 1MG0�d1M�����(xA��ՁFK

F`<D�$��c��!Rr���6��
+_�y4� I
��@�i���R3�����r���-�/�6
ݥY�M�eXd�����	&.!	�Ng��
+��
V4=��a9d5Z��&@&���לld	���� XP 1E�� �P�yV`8��Jw��8��R
��
���ހ�VѽG�4_��tP!q�&#�6`��
+
Sy���f��y"历N�i�T�|�x�0�.$��W���Ԁ6� X4�
4}��E�"����6�id�n+�Bg�@d�
�Rt^N��wDE�2Q����Ց�
[�
� ��EF"+4�P�����c I�9`�l�Q\{���R�s6��K�>X�N�
�
�3�f+�5荙d�Ā�8+R:�b2�D)� 4K`�l葝m�$� V%���<�k�w����bg����
���р-O(%�!��]dX��H~�JWc (Y�+�� �䰁�at&�~5��-%�i\I�0i.�.��e:
�@̓f�^z�Q���&�$�
,�c̀گ~:�
ɟ�7���Лtbi��M��„��k

=?���5�
��=��e."-y��V̓aÒ�<�3j����Fx�nG�@�=ƣYgZC+�U"�
%9�.\�$:c/@>'�բP :1���A5д�`�^�@ �`��X����:��0�4"F�4����<�Lk����,�` �[�N��[�6�7�i�?��X�ֈ��
+��	{�sC�y���
 nbi�uրM�҂�� ��u�l~ŸɼCiA�f�]�i@��$�!S��Fb��5X���ȿ��0��\&	GZ�ȉޘ��5
�;
()��u�����eط� ;�� �  .x�p�
�;I��_-�=D�F
�a
+��
]���w��q��z;�n2>Ċ�;��SGх
+C��u�#�
��
�D���{¢GE�3ah�N����	ۦ�]�F�A�Z
�Ԛ��]r�x�>4CN>
�j�J��C�lAQ�]x
	fQ��P�1�d�@ɀB��Ir��):�ZĞ(���)L�4� T-$��(nku�"Xx�D�J��¡�4�
�.�h,�t
�A�7:*}�
#
G´�n�.�����b���r�%I���S ���\
� ��;	x��`�{
�҅(r^#G9�wv�Q�	29t�
�Xl��\��i��@�#�{4`qΑUQ��R��6!X��$��m���%z���h�
��H�jb!�X�5
��d F#�'q�8�h�0�%��-5��]'�L�t���r!�כ[rY� �e�\p[yǚt�`9
���vI��>=P�/SmD~?�;��Fm���¥H��j$��5]��،�f5]S"
����ED��HŒL���
*�(��� ~?�L��P���&F�EY�X�{���?� 0�
|Z��
{i6:QU�.���
Kk��'�D"g ‘ 
+��slà�)�1��A
�Q45-\
R��QOCM��K�aþ�x<:��F�i���2P&	��콱y�bh	��!�a��=<��C�ķ�pt4`

j�T�`F
z�iTu(t��Z�V�Ê8�b�=��+{fc�pu,��X2�
���R�seP���{��^�&����$�\�A�b�"L*���h���M�)�I�4����oS�/�z~.<��b��6����˳b Yw��
��h��S�SM����R-2�F4~��D�JCE��9Ƥ����baB��R��`Rk
1!
+�kX	�+�6ƶ;�ȳ���p[j��0�`��{%%��%�1���G�dd���Q� �m �,
+d�C���\B�
���K�!�KHb`���*�"Es-�	���
���h�:,�,)x@(��F��pPn��[�\
�"R�x�&Ei�tG�ZTz��06Y�2_�f��2�&݂
G/�A��Z0�
]�Bu�'�]&�f`�)�x���r5�N��C�2�MD���B��6�<G��+��@�(�"���5)r�$��=U�Q�J0�H

!%D4Jq�%�2:
}5�rd�<Z��T��U,��WC�,:�$
��hP
+�pi^l
+�É����|v7mG�|U_MɬV<�I2�y�9-�@8N�*��U"ݓ�m8]eY�@��(-tZ8�ž��Zoӣ���Xɸ��A���F�9JXȔ@,�Ei�h�+�
�dsJg|�i�>
�h�R���̉Le�%��=?&��PR<Zb
��7`�BG�s�[Pt
^�H3�)���

+��<��-U���S���.'�V���2��DK��bd� L2�/X���yXe��&�?B�DIO�}�z��)�G�S�Q�(
+���h�rf����t.R�9LÙR�љ��^l�Ӹ���6,)�d
+�
?�;(��
�!2
GF1�H� �}9�&E)�z���m���U.w=?��#qy�$δ�:���mmq�@K&���� �?C��`���#u�K�S
�;(7,)dm��d8YA�f��±4N[� P��\&;.y�d�MF���2u�h�6�XM�1Oה���
F':M�S�u1ǹQ�K�'��(�E���g��D��W1���)����wcIR�>W4R�*����[��'�b�Ne
۠������<�CB
�m
+H3p��0'i4
+�Jm��|ij(A31�
+�^C	�aM�֣�"dm���5�
��,V��t��D;�掦�Ӕ����
�'}�[�,N�����!L*6P��P�u�������w�ڼhJ:]�[�S�%�-5�&�R@�BbJהȷ���G3�
%���
m_M�Dn,���D���u���+M�	` h�a��a���Y ��ғ�[�`�Ԥ �Eab
+x��ӕ���|	�<�
���?�#ަ���<
+�	� iIM�G�Y&� L/��D|(*KӇ0�����A���4��8R�k<e�>�c���f�p7�0:2��O1����WN2qzd!�k[�tM�r�h�C,���!�x���#	|����t�%����%�ƙ
�9��M�T��8'��x�t�g��tZ�.
 �LR(�b*�����a��#ߖ"���〷��
4
+�ˠ�#d�c�s9��W3Þ�-Z\�0��`�WCͣ##�h�iLZ��#����3�I� �]���`�h�cm2��&"�LJ/"��Ua�SgPe��8q��1)%� 9|��"��W�-ᩏ-Nt�Hy��� �&��IL$$/��"�\�z� l�Fk/Xg��3b��
�J1X��P�jf�/
+��T
ZU"
ҡ
+��,U
�@�V��L��G��4�:x��.k'�ǣucpx;F,��$#�0�5� �Vl��p���CP��T�a�h���`EI��$Rv�"!R�+ވx���Ò�IY��S�mV͑�f��P�A)K
�
���zǜ#i�Yl-h�l�B%W��
�zv�GȐS�c�ØG,N�"%88��(J��EJU���0"�}5�Z�X�E�ʀ�4;�.�k�m��={[���Z���(n�|/�E
+
fL44)wc�Hz

�
[�m��
 L���},�ñ)M�
+
����)ˌ��u"��D+����fr%,d8�B�:Ӟ�%R���%�R�X1Pd	o�7�
���#�C'�i��}��u��#�J�rx
b
]L� ��2W�D����l����M��%V)��yfnty��4	b���I�x%(��Kc���:Ub�]����)�&�:��%ͱ�
�B �~��f
�@l*! $Y-Vq�)]񆔘��XãclR�o�!_�~S�r�o��Kd�1
�xr̅b����dڦЯ�l���%S3�t9��St+V�C��H�O�0�d����2�
���6ȁ���Ô�9�>P�
+,�a�
���i��)�<�˦��n�����D'J=��Udӕ�!���
+���J�bP���4''9�,��Dz��гF�Zc�v(Kn3�b�E(��&�+��@#��66W�*�R(XG
#��������&C7݁1��}��68�qdG@���@��(]Sj�Q�¨c�}B���mq2�9 �`;G��<�~`�s��v�="u\}5�:�P�WTP�T��"*Or4?.1�Oh+!9��\� �
D49�0�T]fI��"|�)�_6`�dHZ�2���S8���"UeѢ�hYZ�j�
ڃ��%d|�n��+]S�,Z*,&k���E��v�9p�
��u�yWK���+�v�����<G�!�RX��3:��T�L�':ָ�z�6-]�^������XB�;8TJȅ(��
���V�"T"MJ�P�
�/V�F5)�j�h5[�ލ֑�$W�m4
�'҈4���ldG���e~���44J8OK�&
qM��l�.�Wok�V�����E/EC�
����4jU�b�pHCM ���W�=��`E=M%H�*7��Q#%K;Wp*
��
+
+)t�m�F���jbo�r�H�\Cl�nS���N	NKzt����#�d�KE0�R�D�B��!V���H�Ɋ�l�ZK�
P�X7�<�S�X�NNK.*=�9:��GA
)���(1�~&��$�L�kަ8ql�H������j�q
+_���p)Ά�[\�VUEj�v�n��.]/�+Q���»"u[�ʮX�Wˏ8�g���)����2�z
�)V����P1G�'V�#/\�(�H4�:x�M�?d� "�:�W���'\�+q)US�Z&^Q��Hה���W]D+3��C��%� ry�\8�O�D���h���V�$K�����E�sV��2�*�t<I
Kes� p��ig]�	,�dc�M�+��'J#	4�oF�l�Rq�49��dBɔC81!�m8wh�P�ۑd�Q|R�����s�<B<�KIĒ�@5���YȠ��b۔;�{��h at 81��
@ġ�<$]���'Cm��8i�"q���pȌnb�hI��N5��4�Q$�%h�F�"Q"�H��D(&
 ��(����.@)�P5���e�P�o�:���(�=�?�m1隨��QS�9�8�1/e�`�� �J�o �}Ht��nf�
��b(�c�]"�a®j��su���Z+a�!�YD
�4Y�H���X���Δɖ�Y����Q�6lՑ��J�jQj3Ft�Ft;Gh��9�� �����h�B��ڶD����#,i��L�H�
�
�' ��V �lKj�.B7��
���X-�Q�
��2h
 RRУ����X�jb2ǭ,܉C���,<�)t�
]T��#3+ؓ�vQй�u����k�}j���W�ȼ�J*�Z=�Ҹ
�+�JG���e���
+�H�6�x@���&�0�X�c�r�IcQb�I#�+�5��
��mTS�W�<ӈ�\y�4�6	��as����-F��ă�'��6
�:[tT���<?�9�ĩMs�
+
�$�D�e+N.^i"���Ti�v�~ƥ�j��x	�̧)�i at Z�8\�H&
<$�ɡ	��n�ӑIJ��\~��r�	��
��Ur�R�P��I�œ����{k�̖=�t�2�¦�1`���Ҧ��.�9N��PG��)�hKڒ~��� d:��i�5�)>@��tCPm��C>�+6���@(�y<>H
X='���juy��
]��֐��}>�'@
)\�� �i����2�e`�� �Y^dH�RO��	P�L��A~J�.w�f@�P��|����Niv(�%����>��i�*�8�����a��eX�l�A�4�7�W��o,�N�c�b{'Q{��Cɮ�ѿq5�?�)�E�%�T�.u���G��!
�ȥ�ԩ��e�`OР���gy��H.
+
�j� +p���zlc�M�zt�t�����gs�%��i�Ձ��h�n�m�ad�������oi,�n�PlF%����ة~�,L�=�aԈ���;eK� �C��[�e�
�%���U�� �d�\��X�e8�1p��)AR� ^
�����н�u���ʡ�;VH4h(\�UDi�*�a$U�IլFd��
ܨ��Y��Q�����{.:��H-�*�W�A��Ѓ S���*����i���x"� ��G�����U�,�$�-��Q &p��H=�1�B�N��h+ʉw8��"U�ū�KJ�oFai4���zAc��,F�U�ܴ
+3���y���%v����r%��j�D�xl������W4�xm#�#��!y�p��g�i�Ad+Ɛv`����]��������N��!��Ҁl��rOc�2!������{_� KI3u������d+ɓ��̚1���/�Z�Y4���)�M冧%Z�>���ۙ�J2͵S��L�n�Ad�WwGյp{T�}c�5�&{�*���	�=�p
����-R��.�|.�`����E�I+~%��rj	�=��k�7�|�3�
[�6׶�S��LW�����x8Gz�,a�v|+1$tp!���~�:B�N���ck�w�`�qDg�FB`�C����u���
�C�1���Cބ��_�����薇p�ǧ/�ll�`a>ͳ���(�ׄ�� Z�
+!#>�6pDw�6
�rС�i�(��oð"U�X�� �m����E6���`1٘ߎ���Y-��ŗyTA��3\-��Ǐ�r��%\y��R�m�#a���_w�!A��
z��y�Q!C2�`$Tw����Lg�Rp>_i�o
�̞u��g�bк2�BC�5l&T\xW+��Wqh]d��;y��!z`TL�
p#<*�*��L`��$е��0��Eh��Y`p»�;{��=:��z-�=��
V�P��U�J��E���t��ᠣo�@J�
0]x��w�.�]�v��6�1N�]_i���&�
+U_*����� ���Q�����7�k���R?�,Ω>gR��&�].����b�7.C��.zw]�W��Rk ���Gd	�/c:k�R���K����4x�s at Nak�[CMH��b�xs�7���L�h5r��"��vpYC�b
+�vU.i�V�4���Xc�<���Y�ѬWz`���1�J!^����Ew�<�W)�c���Yԅ�u\
����uϸ�tcj�P��

���
3��-ci�����:��t��t{��|VN�a���\:��S;-�.��Z;�:ʠU
e�����
�uK��j�\!������TT O�	���
�
@
��
��Ժ�c��4�D�|H#A��CB豖U|l@cQ 5���4x���
Yr�c��G�W�E�yE�+���y���-HM�JU�5��<�̅A=�uS�D��P�Q�����
���ċ�aq�B
���=�2�Y��,�q�M��{t���_Vѐ�b�Z�BK�>��^fX�!��ãV4dwy�-Ą�Ix�
��a��lL��`�	'b}}
��/�
@�V��)�C	��!��o8��6U��4)L�����B�Q����E���g���p� ‘	+��
,���6������Ue�An��F~�=�.��U�\��jI��/
X���{�]]��	�F�pR�fwj
�e���ଋIκ�X�x޻cŒB�.����F�)L3Z1E4xl�?�mL
��1��r�8Z� �n�j:d��Q����cRP7#�6���O�Ei����"��B���!
ܠ�<�H'�t^�n}�Sd�8!��F@	�-S�'I �ڞ� t4��XW`�x���� T��?��P��@�FA��B�NO��K[5��+9 �F��4f��:���yh�NL 
��=
���K��t_ы���vh
1�[� ����d�Y�A��Vw�����e��r]�����]bO�v��gR��Wq�
j�c�5S�R�f�^0ܯ �֥*,��6_�]Ф}�7vlޅG���^Tǁ�Wh�r-�5��,ڮj`�'���7�Cǐ�P�	���X�M�ij�/\��a<���v���!AM�p�)�B��Q[����2jI�8�e �Sp0�ž��(~&������ݑ��=ot�y��8�݂f�5y�o�ARa�4v��M�t��G�
���P�*<=��.i��q\�Ϋ���6a�i�Q�Q$��Os1�l��m@�#4�!e:��ε�r���{&\q����b�fJ���ܤ%��Z��q:��m����Bp�F�{[(�	
+A��tx,<���92h
#ԇQȒ�w��{��"OoKug�wd�����
���u�_yI�G���X�I�B�mFn|�%�W��
+\��
�ǏK�{;��
+)
^���zó��,��Jn:�Ơ�k]:A�GhR[%�ˍ�ro&�&�w8dN�6��wM{�;�����v$$
endstream
endobj
121 0 obj
<</Length 65536>>stream
+	W6����t���O��:l@��9X�LMu�O�Kv�X`+F�k�-	k����t~N��A�`gdګ�[t��r�V|l-�]�M�,��?qRh�>� G�m��*.���
�Ⴁ;�ַ�&��nV�sn��
���t<Q��v\����
+g�� ���J��
+^�X���R�6�c̊�u�cA���,j�D-�pו�%�/��w?<٣6���3�.l�Cem���j��P2)�-��U�v�|:!N�\uԦEr�cɝ���r�k*����O:��*�Ä�L�

�������R9��!ۻ.��q��$l`�o�!��4P
. 5#瞫�s��Ľ�x��@q��3e/34�A	n��{�t�b.k�h�puKX�y�� Bw]�&(�q��g�Em�a�bژ��VL�N{r,��tK�yY��7,!��
+�t�#���lB�e�td-N#6�Ɖ�
o�Q�mn�"%o�U
��[mM�z��,�
��(FC�
Tj�;AgR�M)��_41(
\��^�|PW6����t�!�=�79�����R�q��s�3�X:�7�����"R���Վ�)S�$I���
+��7�괈�LWV��,��v<�dL�:c���iO���p�'ֽ��&�9M��%�<fQWM�t>PM�ۍi�La�����C�Hȉ�e�ZĞp����@,�)��`
I5�>DžBYl�Vw���<>�
�h	��
O��'y���j
O�ĺ�%k��0��m�|5
!�
ͤM
�q�,
'��s\����Y��]��<D�ֹ뀆U�(���'�l����l�����Ҝ�'d���I�O�
�u�B�ݻ����X����"V�mn+���,8m�)��{�(�/��1�B�1<�G����p+pt%q[
+�%l!�np�o�`T
Gh��.�.�5���n��K���!1�Kt����y�C�C����� ��<�m�ڎq� �t>b���1%�a9���H�[tF���0��I��i��=�
�a��A�#�Mc��Q��F:t��6��{q��GF�R�Ig�Q�[�D"�5�c�KF�iѦJ
��:�8��
+n(���G��&K�'
��4�#���J0ϡ�i��.MD�P�-R��ˠv5� ܳ
7�bwY؆]� ȴH���Q'�������[�t�i I���)e�cbf���H�$Kǒ�
+۔��BY�f8�Q3�]"t��grDZeQ�A��x��0�8��
:��Q
�"u���� 
�J	�o����ͽ:v/���Pr�Rqyz�w>��}(A
)dn.(����R&J|��m�mD�՞���Ɵv�"b�N��V
�'���TҩR�o�S�*bԀ�����`�7�w�`l
�Z�ތos�-�ɖ]3>i�fb����ZR�nAB��PuҖ���u���ǩ���N����.�`�Q�H�I?�n�.6
�>�K
G����:�G�mz���n�5$���iC5�etL�ȅҮ�9�4+=>F���=n�L穒rF��]�N)��;s;@>����#��
����
nN#�p�B�_*HmH�h��fz�T���a
����T��4��|����f�rv�S:���dH�
C�n�%�B"D�J�-ѤAe�>��2O~o<�n�DT:Z��ܒ
\
+:��R�)�aE�L��<.��!����*��# T�w:׆�R6�'-S6V�j�i4O��c�/O�sR���f
<7�#��19RS
l��I���e#2��qP�y��N���c�I�8N͑�[p�h8cז�4��)ƚ勸
���II��숏��U2�fwė�bY�RϥF��&O]����ܷ�f�8b�,dqWH<���>A6+b��6�a�#Z�ޱ}�)�E$A���&��j�
��p�!�U�\t�YV��sVǾl���=��f#?h�:K�:�ԇY\��;h�X.my���:�C�~Ԓ��6����i��O�6nR� V
Vö�^�]�[|P�
%���@�@L`�=ż3�LV��n�`P�s�ܚ =
+6�p��&�L�a��Ŷ8 :'�bM6E�
�UB�Ѵ≲�Pt,�+O�#{�3����iQ
/`�
FBE�G�j�뒍��T
[q�p c��˚�.[��z��B�g�O��A�o�|
j�Nm�,�A��t�N
��,1��$}����U��,��;"F-�T�t��c��L�Υ��=l,�q��x%S#��e�E5HW�T�jI��ϧgJt
�
�W�&2�Yʠ.-|j��;�a�1T���(���
��
��h��t���喋�dp�j��Ⱦ�P��R�{O
&���>��݅\8��@�
dWH�Y�_eC~K`=j�������B����jљ�����
#&D����8B:�������擄LG������������c�q[�O�Ř$�a�Vg��y$�u��U
�D
�<>�|�z��K���ż�
+k��!
��(.�ɖhg
�m�Rᰗ�A
�R&[ph�#����1�ĝRN*6�qؙy��̬�U�'�γ���
�W�f�Kv���Ի|���jP�)��3�t&��
�qS�jr�i\&�K!ze�b��ѻt>�J
�yo�	�(����*N��V��e�ImN,�#
+�8�܄�f#��$��tɚ�6
�7(�!��,
l^�w`x
f���5Ec�C�����t��
+ק�2
O��z�ԞN+���2�s�^d(���eԫ��ŒM���Qy
7s�UfO��cn�"c����c{b�����A���Z
+����Mq|tS��uˊͫ��.7���S�_�N��lg�T���v�=��B[�W7�#��̿7�������ִZ��is�����+��X�Z���J��Z��y�`�=�<M�,Ә�L�R�gB�أ��
~eת��:����:=�O]����O�
_��S]
?X�~]�:��
z0��`u_�itA���6����?X�~�����`�
��(.^�i��:��m�
+��zq�sB���O-�[q��Y�/�?����0����;�o�?��'
+Bu��'	/�M>�2��
˟�
�`:M
~���z�{D��2��\��;}AO`W�`RA�נc�'dZԿ�^(
y���FE"DG��6�ܮ���C���@-�BQ$o���j�:L��l	!�N�B�I�	�V�w�E��ڡ�My �1-y����k�
+9R�.F�m�|N)��� �A�[�S����
�a��N�g�:�!���hO��u���qs-�R:MF��ZX��\G�(���|.)c����%Bh��� �Bdk��<�B
��@�bTa��[�+%n0&�kIz�H���N�p-�!��rru ��k!t#������J��ɬ�C�
�q"�H�ia#hƞ�Δ��6�v�A&w�[}�m�W�yϮY/�*Lj�FY�"�&�Na
�nu� O>H���7�Þ��_�P��:�-,y��`MR�[��B�0ԒZD�f�:M��T,�Hh���+��n��͖ v�Hq\��bFWc���*�� �A>�"z
�>�O�ӗ����jk��V�T�4�d��Ds�I�� .z��^KxꝦ\�Őn��$�ʌj�/Ӹ/��
�?I��_j�Sn˧I W�� "H%7p��� ������\�b,��<>HQ�N��Β+C�љȩusU
�K"�cst��
^�6	�(�$o�@��l�a�An��/5�z�p�$`�r�� [...]
WW� �E��8YF���+��R�*t���:�|*h�q�n�fqf[J�P�7�d�P�"ж�ږ3D1K~��+�	�9aZ�k�ţ�;�p瓅�+���18��!��|I[�%�X|;�(q� n*(S��I��������Q����Ҥ��WH��率�z�Y�Q~��m*/24�1�D@��v	QeZR�g��
͝ɌR:$�h�ؖ\3ӷP%si�l�$�z�,r��'��@"`T*�";|�f��_��Vj<@�<%5�&W܄���`q���"�o����4�jSVc�+
�
+)	-e�+H{f�	�
+�L�F2vTv�\�d&e���O*� 3�|Xht����
��K4'�c�R
KM'$�e�<�" H,EM�OyQ�A�V
+��‡I��4
��SJ9`��PA�ir�w@��DI
�:�眠N6��&|3�����@#恉���a��5L��C?l�4*K�m5e�َoHI���
-�z
+|��;��*~�
�v��:+)��
56��A\�����xfP@�خƷ�
}L ;	�P>Ps]���Q*$�R�x�8�

��
�-A�U����(�";x�":��AXT
|

�Y�gIFlJG$�W ���՝�aj.M:�-<妬�
,��E��4�
t�}
+��َY�Ldظ���}�@��+ 3;�}R�t
�(rȊD���[�G@�TJ�X)
 ٺ��,5$|�7� �L
+Mrp
�d��#W�tdJ(���Q�A����ǻH	I>Ė�W�	A=�	
%���VBV��"(0)E�?yT�b��#KA�K��Т�y>ȗ�v�Lt��H
�lIW���r�@�rB�V�
x�H\3#H|�aY9nhJ�����}I�UԴ�ç�	dhk�
/l ���,��rqC��!/׌)�z �z-;�DOEg���F��	�S��"П;�����
.�?6�\�W���)�{��hc
�'
�D�E9QlR��h
�s
ԫ��4|��jYw��+~�
E[l�X��3xf��0��1U3~��Θ|�3���
v�G��*LΥTqT���1� ���\>|��Ʀln���a(�A��i�B�fdݚ���	��$M hZ��:C
�'m�DH1S�������TGPѳ*����2S��p�W�1E���Q�+ U�gM�Y�|��S
+䯋�E����D�)�]������/�J� ����D
�49�b��
~�J�(?A2Qc��q�f1���y����N�r�U
+F�O�n���1|
�C��D
+~%As5��3<9L��|P�8���An W �\
=� 2�n��)�jdu9U�F��$S0;�>Hy�^�2>(�A~�ɥ��D�b2x *S��ubp�L�2��gj��b�~�Ɣ�7��_��sYE���^��D�)�Kq�4�
+��
+���F�c�
�����-��OԘj�]?Q�n��b1���	 U�Ƭ7�ٵT*�} �]7 �<y��l
��C �(���D���1�V: j�=J���s~|�$��
`�\L��>�:��0�t.H�
�OC��q��4'�d:2��
�ȹ��KVVHej�b��z*Scɜ����KMĺ�?^�g�ė��%�l�)��t�j�t��u&
L� _pSE+#���P2)<Gq���f(�)�P��Ɂbf#FH:
&8X
+��
+$8�@J�	�B�+;L�-�
+�krۇHph����	�ZD��V��f����ݬ�2

�'G��7Y[j�ty�R=�p
@�PJ &N|���z�cH=�ХWA.�۳"#aB:k
+$�dS��ݫ(��r�UdJ"[��lU�d9���R�D<J�`�)C�A�����p�	�R>8j�h�
��`��+�@4��s���P��
�84_ s
��1x/Wk^�oB�]����$�
!�T���
E�
+�L��Ht� �x1ܤ+Q[Lr�E	�|!�.$�6��ߐ�d��-R�d��d!�Rf9
>R�@2�`
�b�N��u�*=bH U6�g@AʙR�x�<9�4��o5��*K�88.�"l��=P��;]ey'�[D����ƀ�	�/�4R�`4Q�`?ρ^K����}�<G�(X�<�!��m�D����C��
��}����L�
�X��@��� ������mS��.�s��Jt(H0��Ô}ǕCфo�<4Gio��L�mZ?Lʉ���[y���G�\��06�z-�5�
+�w�ûNH�
�Q]ar���J���
$:��`����4]�b�C�ƐJT{��S���Ք���>�x���*�Y6y	�ނ
1
�dC�z
2:
�|�@�A،i,֤3
��1d��������WӸ�(I�/��(�j�a��Mك�0ٰ�����M�=T�&9�
A��,��S|b�|��&>�wV�ϋ��)㡛�
S~��7�vCN�@
��ѐ!S�FL�{`�"�g��@��1*�0�'���	p��`���s�
+����Sؓ7KΛ#�E�t���1E'B|Af� B��r��h��ӇE�*���Cq��g6�5(չ=}��J^��<F�R�E��SĴo'x�Ku/�Wp=
%�:!7
�~^�B��r�>P�\�
��8/MS^LX�I
+-������V�\k���p���0���a�JS�|z *�

L�zM iY�аFn�2�u�̲d/i�m�u+ ���f��u�����8�@o5�N=�����=��-q�P��U�(����E�=q͋��!�"
�)���r�#׷�`;���6��z�l
�D �����,��-@��V�2�N7B$���b
��z��0�aXMN�O�ś�����A��������R��� (8E�-g��]	���xfD��q�W��Lh
�

r�[[~���g�ɳ�wx��!-�C�*��-,ٜ��S�I/*� �WPA�Td�L �
v�ҕ�D��7PQ}Z�
%�d-Y���>�5�%��C7s* ` �YJC��OF��Q
+�8S�4�ؖi,��E`Q;�� =r�t�j�1"B]�mM
+�bh�Sb�m!�ІTY���4��'�R�
T
+58���)��	]
�?�&v��6�fDnv1�
~��H���=��!�&,�X �����X�V)�`�,�~	��ڋZA��E����b�"�by�I�%�T���� )0���uI��?�a�
G
�;ņ���A�ҴocAV�>�tUq&��!���Ĉ��ss������-MG��ټ8)A��ƮZ1 �d�|6��V��
��C�opS� �R�����'%�	��z�X�	-�!�%S1���E{�@>CEh
 �;]l��h!:�J��T�z1���Q��(B
+�"�tuxN�����>�J�	W�UO3��7�M�C+�P\ي.LP
����kF
H}EĠ������0>
O�Ŭ�),8��b�z
+��9	}A�
�&8���:Ʀ�
��9!�$� �A�0(�"
+�Q`P����_�.�4�[c���X��6�ո�����(�V��CX��aŊ;�U��CX��aŊ;�U��#|���.�V��aŊ;�+�V��aE�;�-�@?�+Kpq�(n�UEŠw�Dq��b�
Šw��(a��aŊ;�+�V���u���hqUX��aŊ;�+�V��aŊ;�+�V��aŊ;�+�V���u\�!�Xq��Jw+V�!�Xq�0Kw3Z�!�hq�0Kw3V�!�Xq����Lw3V�!��peq�0c�
Œw�Dq�{bB"�2c�
Œw3V�!�Xq���o��븸Ï	�yŒw3V�!�hq�0Kw3V�!�Xq�oM��aƊ;�pt�*j*�f��a���}�BkG������l����{�4�r�7\��>�?��i�p��&�d�����9���h$�F���!H�;i�s� }p���
��Ź�G��s�k��s� }p���
��ŹC�7�;��s� oq���
����C�� [...]
+��5
e���,�O�]�m�΂�Ew��
��ҭ;�E.��,t�ή�TwvuAu獡Pu�1dS'vL�Q�Qw���hlCwv��ԝ
kc�ή���Y�ԝͲ��
iǩ;��
��Y�����,�tg�z�ҝ�pCw��kCwFզ�
��3�J��
Etg�ܺ3n-��l��H��;o�H��;c�n����;�4ܺ3N֭;���,�Н
(6ug�R���c�L�ٱ���l9tgM0�X��y�
+����nt�D���1
ԝ]��:�
'v��q�֝q%ܺ����tg��ZS�ԝ7���.�1�ǍB�ɼ����[S���m���Qf��zr}Н
���ԝ]��ۦ��XU�>�?��$A�dS��,��;�e��Nݙ��D�v�Gd�����6����1
D��f���B�8�!*ԋ��
r��jZz�̘/�z3�căP�/�h�bEfMt�r��
pl�]AP1�
�)E�"k���2�p!��n^
�E���(�d�&�4g��L��[o6U ��ϫ&
O���<�H�Qd2�f��h��2�����ټ0�EKo�Y�h�u"�	�j3�� o��X��h��2�IYz3Қ��l6DKm�i�,��f���b�s]��/Zj3)�ښ�6��a"j�y5hb�T��ݩ�P���'

��]P��Ѓ�ai͊ɜDK�T�{V�Ӛ�"��5;
+M�Y�^��j�B_�A�QKkV ���Қ��`K
V�;3/�n2u�bߡ]�t�:�~���Қ�"��'Km�Y�*�����я�YfZ�6���(�R�e�$�,�Yf2�.��]��Ak�]d>��p����қe�[�"غc�X pSm�Y(?�Xj���T��-�]�5C�l\NM�e�,�YQ �f�2�J��.u��Tf����Q�U)�
���
+9sd4b�f�b>��
�bna'
f�֘Ƭ0��k�@�ч�1+D��TM��Qdk�V�hj�
+3��c�b�O"厬�$��mj̊�
��	;��1����n	ex�Ųi�<�8��Q�-�Y6���Ƽy�~Ԙ%�i�
.�:��Jt��q�#s���<o[R�
0�#=#-=�&�r�l��Rw�'��
�
+o��
+J��3�
`ɻ�=����xOֱc����
.�v���s�|R��ΐO��N,j��y	���1��c�YdΟ�3�_���t�69���ڼxg� ��F[�V8���M}��m�t[�Uz�ĩ䙅v�'v9B>)
G�����fM���}��M�%�˽�����N2۽�g��p��M
9����Z�>��x�"�{�]h��Q��
�u��\�u��nm�:�fs�B��a��2}茊\������!�xw�'�@q~t���e�g�'���������$NwYd��ʖ�n���ݡ�,I�

��❱�L�;W�'͔��X�!&��P?��̒@��`"�3����O����RL����"IY�6���@M��"dE��
�W,B��5����uc���e���o��U,�:�-ܻ[���a�65�o�U��
M	�ĵ÷�gg�K"�UAwm)���[
+�A�Kͪr���e��T�7��lo�B�
p�w
ϳ��1�Ұ��
3Y9O
�û�.rz�Y��w
/s�O�"��`�i�F�
+w�ӹ-9N�4lǖ���
����sT��Z<;�m{�N�'���R�+���t���0�ѹN�f�@`W��X�ـ�m҈� 3�8�DqF6�]�.q\X���՘}A`uj[�
�3���ulK�Ştmi�"���ͫ�˳ %�
^a��yA@� 9�,b���
EN1�.4�	�1[��M��!��)�X
}��s8�8p�
��®-�(t^�k;��
�:�ѯ���v�â�TB3X)�s
���E�
��äk�l��]�0�څ��(�ƉrI��ِ�Y�GWdTL.㒧YR4�0na�i��M��P`ۦK��9v�`j���/�d��oSq��Q�.ru�Bk�i2�m��frk�QW�M	�-���.

+�|pV����
��'�HP���A&��%��(T�]����r��
�Y�$n����.��E�م?��}p!4�5K�����ֽ��
��q�\f�#A�W��Zl5h
kV�
o�f�0"�s���.]
��,�0�,d����k��\�"�ŲekIyQ�<nRr��I��h�8
+���u�9��w���"m����
"A1�������z�]^v��q8iQ4-Ծj�Z�4V)-�в4���ے��-���8�
�;�����F�mt�s���n���M<�)����r ����=� ~!�R�e��1�I���N"���La
+�DV���7�k���
}�ơ�ۯ���AFVA0/�!�#��rNd%n<������h���7ѯ�<��N�N��\O���*3р��&=(tz[
+!v�9cg��B��3
� ����9��cd5�v�F`
��Q�6J��:1�$�ы�s���nH��ǨvM���Po6��RM�R�"+2�j$,���JH���L�B��h
e�9l+2m��b7���q�L�YE��[��%d��|j�F�lMB�置����k���Ê�N���&��tԝM_�	9AE��i��07
+Y�M{D`�Q4׸E���v n*"@�>�4Q#IHfXs9�jR �[]�2��2�M��^q0�7邥}qєu�:iJ4
R�u�
�M��yA�n�t)�;j=
�b�ؓ��lq���W�L�!ɼ�APVg���
k����.��h�n��P9�T퀶��Jf
F#{�h�$&H�I�T
����� �
$��L3U�9�����n�i.��7�42����xZ�˦'�ı#�s�
��0&�E-4\9F��LU�*s�
v�u�@���!f��8�Dk��g���y���}��4���*R�wuz� �HV^-�SE��Z�����OB��0'��	��$A b���n"Becqb��ЄLʂ�Y'}���m�����
+�nN���lT$�6��
O	
+�^�jM�k��ę\
�
�=l���aBIv3W�
+���
��͒e�-���y$O~�%X�%3�"K�V��B,�<Y0�"��L�H>����
^f�C�/���ۑǔ䤜�4x�5
�p��1�������?��3\�+���,m%*<�J,��y��ɲ�/��Qr7��d�N�}D�',p�_�٦�/s��=�!�1ȵ�S��m�1V���l|�s��gÜ��.�t��SX3e�N�}�=Teq�ӟl���
n�e�_���/y>��f�-����e�_=��-u�k&ǻ���e☪q��8�9�j��dǽ�l�wQ9���A-
� ��J�� �$6kyܹ�[*��
t��{ p��5v�&��D�q�e�ue����%]c��=�`�*�(�LU����Z w��ʤw�l�
 \�e������e�>��?B
?�2

�j��G�£�]��W���<�q�C������M@��l:���
�v�x6:g�듣�&
.*�X]�Q͇R�a��
+���m�β��ⵏ��� �1�͋2�!�]�d
0�C2)W��c�&a�UxY-|l�:�-U�R?��V�c��jW�F0EYMQe��~,u
�۪H[�؂��~��߃�@���+~׮�Q��s4��4|�2ꖞ�[�
����o����j�6�J�T���Q>6���>ْ'��ͿE���w[v�y�oٔ���O�`�>� �|X�Ov�9iK�-{{+%R�Î����~���Lj��]�o?$����
����}���|>��g������Ъ��:��b�����7�))�=��t��GҼX�V�b��u>[�j�͍�焂Dg��f�퍍��h`,)瀒K�_�q�X<�U��Io6�ތ�(���['n
��*�H��q<YGA$��9p$�tU�T��=��>$��
绫��WR�ո^
��F��
��/7�� k���oG���Vs�G�p��t@���N��l�J�
2���Cژp!�k�����]�!�����N`~#?2�WR�7 ���3 �Ѫ�<ʞ[i
+�IP�"GWhV�r�E&� �����6�V
��N�t��D��=�D�h���v��@�X����&�CY9$�p��F�
��:{r�V����Hx��(E��H�w�<B	&
�K9���(�$�
+D���1!��fFK���
=�A?�N����d��
+s� ��k>��7A
+���Ɓ��

D�`�"̊��t�P�L�<M.�Q�}
���4��Ū�@(��u�Iթ��0�",&^�6Bp*�Z�!N�~
-�I�c
���
}�`�R�=9%���#
,t�DY�dz�
���0J�Ęp-��]���_0�-�#:����hŃw��[e��^e<s"'8�q�M����Q2�!i�8?�:D��gFp����
+��
�E	f*�i=�{��&�"
+"{����*Ǯ?�2��/0��Jf
n�$�%D!c�|���
+X�n��Y
+s�kd�p"Ǡ���	Z��$0�
\.ȚK�
�=]�
ت}�"��^TH
�b+������hZG 8
�A&RV ��BX���
�$x�J���v���Pg@,!#S�to����*&���Z�[IEf)?�6�"Һ BHFXh	�:�
����H�N�A�Y|�UtY��Z����<Oj��LD���,����o� C�l�t^���*��̜ś�r�+���	���){�*p
Ԯ�H�Wi
N�@�
0)]h%��T�82�=XS���I
��\W���d�20m�V2
�&+4ӧ
1�I
0)�&5T��'í�L�TC*�e�>b&MQF&��� �P�t��7�*u��tY�g. ]��Yh�
��dp���
h��z�ͅ�A�y����Xi�d�("٩:&؄�"��H��^e��W�xZ
+{D<fd��R�D�d
��
S�}ܠ\��6�
L/A���59�JdGs,�l>�#%4ͅl�zy��x�Ȣ:
���9d~�D������T�׊ Y�9ܟVP���ax8�LU >U���Q҈~8�@��6ӿ�
!Dp)$��S�&��
�k�H5#�Û3b7a�b�:����
+xbh�E"�
��S"|10�0d!
��
+RE_ B��
s�q�ro�1�@8�0S2��+h;4��$����0�����N�T�N*���S�Q��U�0;�HGN!�4�+T�i�	
1C?0(���� ����8�@�e�d�
�Y�F���$���4�x����2�BGހ)¡1
�(��� ��P/ .�1�d3�80*"f�ߢ��H����Qš�b ��,�B���C4
��&�C��e�Vi
+oEb�c�
�C�?�fD,���  �sT��ѣ�DEy2
+��p�C�U၀ 1$��:8��A(���{�A
+d�`�b�$�ƭV!�#nS���Q!
>t��$T�

P����� ���7a+��V1�#툣1
H%	�Y�8���4Li���9z���:�4�Z5��`� �b��P.��*D���J�OlV�����^����H�# G�i��ܨ��-a���
+�`f7�I$���7�H�mJ�h�;��1 �f�c�6WǪC�9J��@�l]88�t��T
:D��0j]Cj�"�¡lJT��	R`���.�M���D�%c�
+����`f7p&/�:"
:g0���4&h��d}���*�:9Fa/�D��T�
�=��cE�
+�#�q���
+.�9,�2� �!)T��
� %BJ
8��!17N�G����
��[��'�:ڮ��]����T5�����i$\P�T�C��ΐ
+�1,:�+���nt��u��[Fo�sB��,"�Q�P��N2�
�NC�h
}�
Ua��t

+��"
+���'��:����uUp�U�;����xx|���P��>�Ɛ%*��Pqh��jX�!*�O��T�)"
*ɰk�%�t0�����v���H!�
,�\$��o
�#
C�hH@
������{�A6�K��mt }Bh
x��i��|�Kd�
�
�mW�b�D����4K��b��
+J?����#��hЎ!k,�
+�<p������~n�0p�f
j
��(E�b(o�
^��
@d��U
h�tw�
dIR��e��C�8*�ʜ�Ԇ�'I�C
G��$1�
���R��*�kQ�����(Z��W�y��(R`�O
�DHfdWA��cb; :Ѹ�
��	�T���[
��י�5�*Դ�L5����^J�#�t�뉉�d��҇���L hB3���`�
���u�

+
eD:FU�[
�^5RCd�� -D���<}�
8
��d�����,���� �p����f	/��J�����
���d���
��x�Y�J�8!
+P��0��LuB
з�G�"a���\��C�Q���|�yF���y�2;�8ةh��M
+
p&������؜bh��y�����$�%Pg�Y�5skQ�
}�NH��MD�}�E�2V��\�
��A�j��������Y�0FQ� �V�_��hw���2
�0
Z�F%#$K��b-
��A�ȒF���\�h��\h
41�g]a�l���A�}
"a�?}G
ہ�6�͘o����g7���^G	���:;=D�:�onU*G�,V"�	в��d�ʘL���Vh�Q�
�
t�Q��~h�F�f`�(5�lnXłI"x
+�	a��I`ԥ�%y�F6�B�:�PM
J���73z��V�W�ΆA
+��̠ʱ0�<�G;���#�,�%T�e��$�k����4���
���N6�V `�d��TZ�c�a�ݡ��4$��d�i �N�����3i�ꎐ8Z���F��<�dٌ�)Ҡ� �&
�O��*��`�$�1:{�J(����
>UAv�bijx`��Hˠ	XO�~j;���uS�2
�&NE����v#�ӧ�D!�i�x��XA3�F�h
��aw��A�B�;�p��G at s���}
X;PT�7�44/�4
� -R��
+Y)���P�]���<�~4�c�:
�`" P��	ɄlK�r��h��E����&�#+,S����9�u6�S�s- H@)`�A!�x[�+1FY��cD�[RD�􇜔<"CYH�ATI`��1Nh�‹ �:��
L�O�<��*���Y�A�ϡ�Kc<
T
0��
���%gT�� Btf�T0v�@mo��
&!i��h��(M[G$
�囦
2a^�#��t�:>J�qQÿ�op��:����coi8j�(j(��%��͍7
%M0&�H���Y"�y&gY�H�8��q��<�<�(q��N'D��Z m�8E4j�ąҨ��2x����H,\��Kn���(
9?ڲ8<�?��?����� �fa��
6lȋ,!�s�?t�u�i��d�pw��a2Sy3����KT8d�;(7o��k"|{���%1m��)q�Z��NtB$F��� /`vv�	�)8���
dW��I��ˤc��u�yu��gY�S�
+�xD��G�

��j�„
+�lh��l>���G�YivV���
�Bͳ,�7i^��Jcjc�	�>=	dt��QF�'��Y`�
8��D0Cg,kA6���y|U�1_�R�#ݡ�C%
���o�WmqF�N9��D��E:A#:�e��<�v�rP�cP�z�R$n4.\Tz�r
hw`�	IX�@n���&���K!�p�4�S��Dob�m/v�����

lT�� ���KpEv&9Qu*� �A���!���cfrv�)�p
�
+�Wƛ2�KA�А
j
�v��
8j��,"�C9Q4���K��
H�
+Dz��Q��Ԛ��8SDR��Dx�98
'xYl3
����
+��������#
�́m
+3�croΐ
a��
E��.��o��0��<�'(㽂�F5�
�K���]C
o��x'�6�@�jp	ɘ�*`��&:�^n��%S8�| �	���S����R�2_7�F���*�;w�E$z�A�j^���
@�^U0���H��t
_��, at z�k������'�'^������U*Nh�]%p�B[/�
�@ƫjT.���*NT�#�A���"Pup��o
�w��S�
��#ZG
+=���
�**Ͷ�2I
�0<$�+�L
����]	��U&
T,Iq��x�Nf � 1��2� �
�n_��gP���}�?A�`�2���b
�Q��C%_Ь �4��%�퀐,��A
�2�w�
�@d9���
-&�B��#K%!���y��`�A�n)��+�P�p���5���i��A��p��&	�lp?��:�
+�B
+F	ܹ�F;X�H	�p@݂�f1An�Dj*EoQ��G
+�*��K��|�������"
��z�6�Lq�9D  �n�I{@�D4��,��6 5�d�"�j%z��9y���l��0#.Xd0i�A�^	���-�#
���
.p7M���z6	�,
�$�

�2���J�
�Zh0+�M�% 2���$��q͎.��x�huGGW�0
+jI#$&�
|
~Bj�dcT�`��t���p� �
�y�N�@?H�Tv C��7#�#sӀ&���nاLI�!��U 7
�Z>m�W��J0�/��Wd�?�'��ěgp��
�
,�Z�DLѥ�o`�. љ^ *��1 d�.���S��Qs��Q`!�1숀X@���׃Xd#�
�B�~��т
,A��a����+�h#•(ޤC�N���@��1$HPE�x"�a
p��	��SB ���vPCE�@%jE�.f�'B!�U�f£�_P1A>�dž�)�JI`�PP��N5^�2$(��
+�Lnp��p�j��)O��ԃw�:B��L+6�WE$$�/��V���a.N"�!�9Bd&�
�}`� >x�(�q0
Jd:Z����h9���d^���#��	�
f
.z"���~
���
�]QE�V��.J����/�܏?5du 鐣�$R��Q�ͩŗg�QMN�=��8T�������	,<(<2���?�,�
#0G1�7
%,�����8��*bR=\���2��� ��=
���B
����p=� ^�fA	
�@�G��cZ�`���
\��C
�A�;[�Q5�-e4?YR&zw���}����piC/t�D��@����d�\`l1�����
�E��N�u�L��8\5L4M��� �����J�ы�
6��)Q��o�281��}	���x&��	��p��'c���G�lv��-W^��j�%8�H�����Z�0�
��*�̢G
J���3T�+!�v ������ʥ�+*
p92�"��%��1
7:c��(`���y�/	�=d0HC
����(FÑl���l�k�ӟM��t�Y�s�3�

�[�����J�q �4�Ȑ8	���h���XN��Fș
�
��4�q~v
+�ii1��H�`��O���Na_4��4^�{�;��`�3<��z9����c����~�u���ˢ;��
�F�
�Ȟ�*� �?�<�
���u
7��c�B������MPl�
�主�F��D��������	��dŇ�^b��?�&�cOГ4����R|�
�r
h ߰	7X~67A�mk˘�&��ѝ���BT.
+��)m@�w`p�O�J��y��){��'�"*(�ED�≤;�ُck�F=�1:�*��;@3��A'ٝ��f�E����
?�����3c�������Z�
;&�9�<`��!�7#x��~�n�b�����?R��\�S
;
*��d�

o�.��^�?k��1Jb��dž�Gn�m܊���8'{#��'�O�݉1�(a��2�0�Z��1S��o�x�/�������d���n
��h�1L`Q���WhG�����s��,���/'�G��g�fm
 �N\��Ų���A��~

�
��?:�B���ml,w����_S�A�Ld:#�D�@�N�p�����p����ј`
�		��

+ at KT�c 'D!7F��(���-TW�����.G}� f��z����g;�p��Xmi��Z�ތ������HZt
+���U��ψ@8������S�8��A6
�� �
9Ov��E��Y�9x�P���x��yv<~GG )�yp\
����E�@
�I
��祱
+��?��I!C�WÔ�	��H��jϓ#d�I<��B�k���

͟��i?�tz�
�B����!
t9w�?Ts�¬�}�6�

D}��5�/ؘ�.�l=
!!���Q`�����T
+"��pa������Ř�ҙ����/�7q��Z�=B�~�P 2�`d�Z�#
�6�7�
�g�Ѩ���r�
�O����湀)���+��E�$��h����w"�v�N8��_����&�yxU�� ��W\R#���d�� 
lB��Z��շ��o-��l���g�h�O��'�8��T�����<n��!$���E�3���AqN�J��H�����	����)�:��ǖ��
oh1��V
ri	�'Y�Bx��^�o?��dģ���!F�_
B����?J�o[;��?n���:ƗS���M��lM���A���tE�tp�5���O��%����o�|w���҆pT�Tg3/�l
�K$��Y��<���@H���L���
�>E����C�d�a2
M�A����t5�ߪ	0{^���yYb��D7�{��_;����S
v��<T�i���i�^�r8��.
+��; ���;�w��
S�鰉��g�'��K�E�x�-
O�X,Gp�︊\/�R5
��0K��~�m�v�/X�8��x:p�a�
� ��E-�`�4ϔy�d�8
to���
<vD���feA
g������ˮA���^������:�
[���	x��sv��/��?I
�-��%a���9��)�w4�}l��1�8�MF�6�
2��z��G��_b��Ѵ4M�5�'$��~wl�:%c�7�l8?Z�&�_��j����(���fr���^�Vݕ�}�L�q~ר�]���jka<�ɑ��V���F�݆���0
�PW�J0����� ��
��
�]�2U�d����7�E>���y�]��
��������<�����ov.��!��'$��xU�%�� ��gg�L�H�_��Ҫ@�G]���~�ğ,�O�-<�0��^��no��!� ��<>�
�&�d(?�?�����
��PDHI
+
E�0J�
7lt��T��;�>��r[�\D�O�Y&g�Q����T�\��o.���i�R��K;��C#50X8も
�-@�|mB��3�w�� =������c_�&�BCO�'
������m7
�ߦa��&�V��
�t����`�^��2��,��lC�WN��q�������2�i\��>���5��� _S��O����u��-��b�<�?�U�V��5��E$�T<�h���_^k���
3l�iض-��{B��o(
?����#���x����t�'�n���<Ӂ
���@KD9 >���ۡQdy����������,�)�
��7����(�wA����B�~���YO�X���1
������O7DQ�Z_8Ǘ�o]���
�
�{�|��(s]�
�^����� �$J`�B�<Y�9Z��d��Y
�h_���
nu�����dk�"���
�"w�!����[�7�B/����
�Ny;��R�@�l�
M�j���SĨ��E�@`
�i�Lt����ݽ���6�
h�ٻ�T��4�`���q@�Tp�l(ޜg�	���������_8Jn@
+�=]�18�*�k怑��0"%qQ��C�[e�z�:fa��n���
+�� s\D'���,҃�����[�C"�JЪ$�}�6��X�3
����ΉC�T�((0�AA`����Ā
Õ,P
����&J�!�.���4�xEk�k�f�t_8�����*[/P�w����H����1��JA�v��'
��=&O�~����(.��RΘ��Z� ��I�u�⩾���6
���yF�;��zN�
�BG�i�^�p~���kBG_^ m��,V�!��My��f��
�ҋ��������5&�ӥ�p�L%P��Ls�)К�Lu�� �ep��G�
!~2z�
&|2z�
�2z�
�}2z~L�ީl�Wt1z���Ţ
��n� ꆠ��[����؆��8���Ɏ��>R�1�y�(�Eq�����:ʖ*��%���珄����)e���o��?ܱ�"4�G�.?�
����{���
�DSA3������
��"��h ;���z"�&�3=
�'�iwE�
� !��Hd����s���h5��AL�t D�z���7Ƣg,��̈́H���g����"&ǻ�.$�2c�)�N�[�\a60�~<������s��Z-F���L=�,��4����G��˜R3�����a����/����M�	�K4
+
��O������,]���ؙΦ�w f<���;0cB����ꍦ ���17B
UcU�I|{~N�?h��CL�_b��?�$s�C��\��F?�廷:���
�믗����d

�.�`��3�l��%�?}_T!&��f(�
�t�����i�o�%���U�!���$*�`���l��
0��7W����X��he�Aѥo�nh���=�3!���Y��M�7[�c(g<��D�
M�gj����
J�.\ �����^�߾g�����C��k��	� ��7wޯ��_��2��l��Q�7��9���!L�Uw@��t
�8�(���
�,6����0�!v��C{ci��y4^�h}�.���+뱱pr��#K��g!
+ɸ#�Uo�]
 8|�>
��X���:���Y�TX�ćT�̊2g�#9�R1ƵY��U�-G0~�*�#㾻
+����Ks��.W���&bэ��b6�,�.uơ�dA4+Ÿ�����Ƴ�G��E0�*�,ʟ��?�0M�
���6{񊨉�iK�u��t�U��@l$����X�_
O��u�I
F�no4
�~��y���;5��Ym�����io�u��x4��c�W2��ڬ��H��.W�"�
5V����o�û�1�'������̇`��q~�E���9�D����W
���=�yc9�Tp
��C��7vq���j�^}�gO���r��˺�bxJ��z�Fe��I��
2^������'g���JSo-�
�O�
��X]
�
41���b�<�h�$h\Z��5�
������0�R���?W@\t|�����F��K'�
uk�����<UOu=��{�v�S4i���
Fl�)�x
�'��#�X4�`��(���r>cm��9�yw0�h�;
�j^$퉬W3�������s�l�_�I���Mg��!��̤F��w�r9����� t�w�����43�_�:"ۥK֢.S, e��< K������x��+]��
�f�Fw:ZI
�s
{�}��U"
�@�0�!Ux�@�i��{T]�9 �
Bu�~�M���p����
h�{��6{U�I
"�|��Mp1c<N��2��?[IOƯU�?�2��$��z���{�M��oTA��|�?�fa�?����I
V�ԡ���Q�;?���Kө�TwE��ܬ�
�t�Z��L�t�	��\K���t^
+q!�!X�C$�
��C��'_
TE�jC�؂ٗ?��S�B�J�u
�d~60-"��$	iy�������#wS
BMw�yt�������,�ax���m�+"¹���|k��#���&PjF���4�0҈��^�eKV��BK���=ܠ�y�o	)_�3B[�~�^iI�T�+P��օm��
�aI�>����Ҿ E��
�G��շЉ�('6eM��/��F���g(H'�<��;Ux&�����]�uj?[����n&
+���51|����/�ʼnF��Տo/K�J��˩&�}#�N߀|o ��墾��7=�m֖#b��-��[x�Ǫ&��mkX�u�
�F�I��M���	>���z �Ϟ�C�F��S�	8�l��[��n|�4ȉ�����
n�:��
"����$��j
�Q[0؁���y���m3��ԙ&��x�݃���qz�j�ض�DEb`_,�a��e六
K�
w��)���>�M��
��	��1EF�
��!v����()��@����Y<��~��d�.�^h�^٭�����ρ�H�����C}��؇EG(T�>�>10����qwG�ټ�jў�
p�%eTߵ'��k9>�z�M,��3��@BP���
@Z�
��F��B/!"�������M���hn&��M�Psfx���חЗ��`~�`�ڄ�hf[߄���9.��q��Ϲ��O7��M�Q�lK�g�#�4�ο������2���|�wji>�&�"8������:��W�ғ�
|v$���}q
���Ϳ2'�u4}�}l�x7��NA��u�/��-Q���w �
S����1�
�w [��X�0����*4��(�|�<�~�� l���QܶFK2QK��*k,��	��
�
M���}��	P�~�)
9n�_�5��h`7���
-�݁�0�� +P�dl"���R���_�!��m�ހZl��x#�
�e�п
����]b�z�p���5�x��  ``A����o���_pX~��0X.��%�^��.����6Z�Z$Y
�o�'������(
+�
K&U}��:��Լڰ
x���F�'��_UC�����f�6��_mK��/�7�	��
���!0��Y6�O�c�s�'��}!D؀3��j��+��1�=���iГ�����Wc\2�~��͛F�ZEҞ3D+�X���_]O�J
�C���7����=�D���]�Z����B
��
�ywj���ȴdD��tZ��P
+|�ݝ
��՞/�۾�'�k�Qh��F���%n����z�w==�>-^���i��o��o���n�)��{t���������/�]��qD}x�?�K���E9͓�|�5w�6n`,�����߻'
���:+�����@�2�OE�
	�I�����$_����OR�6�ß;��$�I[�u��>���p�g��xp
-�<
_��ɘ�>
+.ZB�;)����i��i��࿓�燋+��|��ո��y�b�e�
-���/�ѣ2�4�:��\��~K?=\D��y��a� ��6A�����8��=�����>��
����
��_��y#��r_[�7���a�7�k���p�T���}��Z�
*��tt��Ϗ����K���
=P��Qi�
���S�N��掏��7So;|c�{$\>��ă��T�����-Y�w�i9))�$����������:�����Ӑ���t�gŗ��sE
������V�H��]^޷ή������[��:���H 7}����V4�.�c��{�-��Y�v�=�����%3�u�&Xּ7F&v�J��Z�J�����2��H'�-Dnw|�vA.�N���l]S�2�+p��Q0��H1>����wg�R˟
���w���
y��o_�U��q�z�ϼ�N;��ڤY�ճ�]#p�zk�=��z=������d+�5ۇ��}{/��j�}��-�Kݥ����A�oܷSO�5=�F���7M���]�
;�~�$?�����i7y��{����k��;0�;���%�DJ��` [...]
+_���(Rx��Z;�߮
���jb���C�JJF�.e��#��q�/*u�z�͵zW~P����V�^Qo���S�����G
�g�x��\-�yϧ�J��4/.��(�z�x��ub���c>t�\ߏDRW�h4�:?'<�s{�Ʈ�
+�
s���xߛ�z��Ĵ]�'
���M(>���f��T�<L����t}��gd�>3
+s\6ur��
���\;�
+����U�UW*���j��+�V��bk�VK�n!_z=Nʩ�l�rpu�WZ/�DU���Ց(��P����z;�5�QOh����lR�[�!q�z�_�������:�
�6��j�w������3�/��|�#<��������`�%zQ{�4n��`���k
B������'����)7H��>���x.$&ϙa��V��˰�y��
�ܼ4��}�h�^�f��[H��w��
=LB�~n2���i�%�θ�Pr6z\��y.s�
�:�!$�8Z�����[G��ߓw��^nV��y¨��֟
��"�-
C>�_�^{��Ӯ���^���tO���v|�	�
�4.{��}'�^5���
����F���-��˷‹�Q�p˲�m�\*
��uS��<r�W�=�ͼ�J�I�Uzq99ۿ��Y}�t��j䩔���ON�V`����_��=
��:��3!#�������L�^��]���/����e��U��o�̮�߽����&i?�kѳ�d$�(��c�3�W|�Z||7j$
+��j2|4�'����Mb��R��@�>؜��s��
_����dʃ�A�ϵo���5-�h�Fy�W���	ߢ�=�r���:(�
s�҉�JOó��u�<U^gҡJ��2�*g�Nu,��Z>�6�a�ީ?'�َ��*r�$R�m�S��.ǧ�Pn��
�;������N���w�
+w�.�T
"�I��������N�_�}:=
>v�
)����^6r��K��f��;���H����|��e��}��KN���ku8��/F����xu+����߲�ph|��Əe19������`Z>�3.��>�o��:1ˁ����g��CaqQ�S��Xa�@�9(�wS�^�۰������C�o?,������,��^���0F��᪭T���r=��'�#w8:��+��W���
+�=	{������:xadw��Q� �?>
+���������N_�ܤT0�앶'�CE�����Ӛ�E���a)�����{���{?U.
+g�;>�=�©��ES
'GGZ?�����t�߮�֗��3yR��=�����C���0�]j�Z�r�뎯2��x���_߽�u#z�v�\4s���b�=���E�����9�zs5K��ڋ�~�eAĦ��F�}�
:�a*��E�}�.r�r渪�d�'޳��V
+dG���\"m�w��X��C����|�Wx�����|�m�]�R�o\y?R?(��EE�_O+�`t\��yu��ۯ���R=
*f�Lc؈(�jc}^�7k�|�%-��[�Iy��
���'�sg�w��z�w������ٍx�I>�b����a��<>=�ҝD���8�V��3�Y72H�$�ۛ�����&������hݶ�=�=��'��,�S���K�-�ӝܨ</�_#{]����}���x�L���δy~���'{�y�T����Hq�2o�X\�s����y�0����/�J�� ���^����:����K>�9V��9K����ӄ�t�-}��4�L7�������u^靶��vOi/�����7�>�c�}�;ͶV�zz�J!��e�jB�$��+�_J�T�\
T#ia�9�>�g���H�3�r�b���EL������U��]煋b$�y�
���g���X��D

��.&5�l����w���-wjrV�F�pJ����絖>�?e�����p�?
��B��<��Oۇ�Z� [...]
+B.�<
+6*g!r��嫉/;-�%�E��"}9�Jf�w��o
��[��~N4�
�~r���7�bN�
+����S#wt
�f;u尠L�l��{��^��Ec?�=*�w���.���m(��e���t]
��e��d�e�u#p]�d��¥O>�*�r≐C���!���&'�^y7�+��\��e�o��q��?^d�'���|v}^�
}:�,�/��|b_�/
������8���i�43L�e��'_�V���ͳ�a���JH��~�8��
��v#�e����}���l^�gjw|CL��Od��݋������\��N�){�
^��?>��sE��ܽ��\�eQ��	�<�;�J���Ry~�I>�^�g���|+�ݕv��~޸W#��#����j�te�.֫L,����WwG���� ����‚�;���U&�^��>׏{��x=3:�rwW�|�1h�g���u"w�M܆��p��f��i3�w|���qp�X��w�}_v�)�����\��q9�d�c���_v|��:z���������YA���5�^�
��L��`������Ũ�X�F����+��7"�.\#���R��d>7��ϲw�RZ�󇓧�A�Y��y��\O�N|���o�
+���
��Y��?˗���l�3�]�'
+j��}�[
�3���I�����W��b+4�
��|�-φ-�Wη��b�����8�s��u��H��B;���Zm߳���N��Pa���;���_�m/��rO�r|oU�k�t~�[����C��	�s�V��
�g�S4����χa� g�����[�O����O�C��~�߿��_�b#�z\�N%�M���5��[����[�a�0�
'/Z����Y>q��X��U=��x�U�td�4M<�9�Ap��O�/��S.4�|2ν훇�s�(oD�>�#�{�N�7i�s/�y=ͭ��w����Ii0Ի�N�v
]_e��}�?
�zw�JA����Sg������A/X����]n������៤f�=8&����s�|2U{.T�٧	?
�����v�͗��i�$;
�'���C�㝞�-
ovv�6����Kۗ�Ye
+�r��x�����y��t�ߟ'.�[���V9��2���^(U��+�v���u#7�R��Z�V�	N�{��g�R�\[=���G��S82.OT5U�[� [...]
+z�;>�޿�f곛�B���m?����
=�2������o���i��M_��w^�J�c�O��VV��
+���]=|+�95�
bՇA7��+�����+�D��5��F�,#rŧT����w�E!�*	���W�z����c~
:�{:�y���<�V�۾�=�'��z���χ����6/L�����Kh,����Y�e#���0x�?L�ӧ�����P�-�jU���E�P2����?J꡸��
&�>멕��ayX������Лo�pّ��-Wt��b�'
��6,�B�y����ʅA���'�Zj���>�
�^t���hkh�(y���$/�����w��8*��)�U�ow�d{P

3��󭨴"�|������JUnkJ#1~�������{��>�{g���lܾ��Se~.>d�B.�����g�B��/��x{�-��Q�j����u��:7yz�|x9 I)uE��:o���i�<�:=Oy��V�!^��T��ϖo��lyK�6�I��*x���[-��G��:�}k^'k��*L��A�����n2���<{���"vה3ї�TJ�o���oo��5�����<p�>	�	��Z����y|�� [...]
+z&�Ͻŋd�޽�˷x��$ZR=>˾5nw�����fRUNWjF�{�,z��D9��[���k��oR�-���fPHܥ��I(�c�����&�µó�~I~\*J��U>���5Bc��հ
Z��1)V�u����������,
��ں+����(���B7���G�����s@?,�����A}\9e��J�l}2^jei�X�W�{;���������A��|�;/�f�|	�;��At^�����e��׹��U�Fu|�>-�:��^0S~�6�=	u��
�6���u�|�xHK��\k��ܑ�<Ż���Ӈ\���*�N#''���׊oO8,��㻳�[��'�3��{{V����=�ϋ�r.��V;��[��(Z
�	Y2|��f~x�-�G
j{�AB$'�[���]Z
CU�Ͽ�������1p�nk�S�����|�ʦU�b����^*���
�!�r�*LwW��l�9�>��yᲞ���z� ���x��a��
�VO�"��O3��A�r5�]=Y�gN��`{�w�^iO��ya [...]
�*R��;��?�BB(F0�|1W*T��f�y�5��l��*�޲7��yY�
+��
�ҟ����h�ʗ�8�l��>2��
���
+�ëʱ�;�ċ���$$<&E��b<>����`^i���V�;,wG'�����T�i��b�M�kf/��ߜ�5֢υ2GZ�8Tj�'9x}��=����rut�zύ�rV��
��/�����L�x�j�q���Ŏ����^� *��~9�[O��U����9�pP
ݿ���d�G
�|Vjy�e�Y~n
�����A�� ,�ٗF=��Q�H}|j7v�;{n7�痙J�4{*�q��i/�wo�ٻe���|��(�*����CS��OC�B���Rn���yee����Fd�jfS�r8�G��p�`�R�׊����yiz�����wѽ��Nʧ˛���j�t�O/�O��TH�(�g3o����S�U�Q��s�8A�,~�>�
cǣLd?r�.?���?��3{��rc��Wjc�z�^e���}�W�u�:�\���J��˶���Z��x�q�������a�T�h�nYc�4�g�1�=������]�`,up7$C	
��+�Ǘ�Y�{
��I��=�1}Ok���yC��U����YvY;
dN������}q_;�Uc��y�q�8�����]|Ld���H�k^
nj�\|�
+Q
.��/�|u$4.�@|+2����Y��{)ҩ��e���މ�"�B%������]��w�ʗF�Tm�a����ޠ.�
�kY�
���V�
���� ��z��潹{0X]�v�o�e~tTK���e,_�fG���N�
�; 9A"����y)��t��>�WM��g|7����O9���
ݽ��͛F1<����L�wyt��#"�C%LI���m�X��
흿f�/-C;����^�������cw���i�D��w�9y{:|J&9>�<��o�WDZ�y�'_Gbr��U;N�{�^Rz�Kɩ�<Qlf�_����[2U�>W
+���(���i&O�=^�_s;�D�Yˤ��`�v�׋����^��8Vl
>^��N���۰��,u���o�$��wF��j�8H�咪?sQMp�'^>�9ؕ�ǹH^z�N��7}��ȍ��8;��σ����UA>�&�ɞ�)ƣ1�apPJ$��k��U��ȱ�=M�4���U�߼Q�J(L·��,�m�v�-2��)��c��Z}̜�=	�|�V��

�W��J�8?
��O�;��w|_�xg��\;>VG/�z�q\8�xբ0�˵b!y�p�ǿ$���J3>zlOR�쩞�M�/g���<����B���|\i���ʵ�
eyF�Ҋ>���L�$5
՗Ń�]d6�_uZ�X�@<�ku���,
�T����z���>��ޣ��2�P�^o����e��<7��ݯ��0�z��7�l�Tl>%�O�k�Q=�=

��ҕU#>��O�n�@�8��ǻ�Q���ջ�����oO/^��^
[���E�/�ť��)�^�xzZ??xY
\�O/�ݗL~y���:��F�n	_�/I !@ �9�
�r����y�;?�
�޵��-�rSB���d]_���IH
+yjIF�ɔ� 
�B��>� �^]��;���}�A.F�������
+JO�"�G�W�E%[���WE�#bə�it�U�b�15�Z���d���
V
�Y�мA���A�o�Y��P
��J?|�?�{�⭔�¶��_��
�+왼�K���3
���x�ϛ���nzi���&��[�
o��eS�
+#�UN	�6����\�(�.��U�
�Y�.M�za6�[V��~o: ��(&�S$þ'�:o��w~A�_f�rH�O�eۗmf!)3�J���`8ߤt�b��7?
>�-u�[H�t��&7��¾A��-{��_�R�(����`)�\#�xxo�����c��$���֪�6@� 7 i?�zQ>Y��@�.BV���5E=��{ǂ>A[UkX�ukRRn�RU��L��]�2��ӄ�t���{�[�
������ݻ�Y�B~��K��6c�V
LV
˃5�YH�E!�ڽ��E���_K�2�xЖD�q;o���6�tw���Dӽ$�qx[���{�!r��>�F2���W�+�3x3o�C�v{Q�Գ1�RP��D��n,��,n]���FU�+�=�&x�v�3���/5���e�jf�A��e��3>&�X
w�I\!�7���r/c���kI���<a��ŷ�*���ED�-M�:�'��T/b��G�;��
���4iV:����j>����؎r{�f�E�����(qHH���N��9�C�,ib�]�Du|�
b���!	�/ �o��s5��}
L	
�	�w���+�4#�?������^�Q�S�]�G��ë�Fm3)�����tp�*��+̮}@5	��6�'�N�p�|w i�`m��
+�(����"�	�뾶I�sf�т�o/頾10���g$���m�n��O=]S8�*_.��ފ�%�����2��kc:�xg�D]�r7�
J�e�sqp��
+����[ޓ�F�
+쁕�n�a]ae��V"9/HX�UP)m�)��N�P':���s�3�#�bˑ��o��e�&�RqS��;Wb���e���u��
`e:X\ec�FY�e<)��6p����TeL�J�=��C0u��|��gb�ihlE!�����%Y�u�*A[;�A�Ũ<"T
yp')H?�b	/\�&Ok�,�1l��w�ط75�b�
�.�U�Q�r�w��Pz�5�����f�K�M��^��w�
+|ZZ��a����+�B�)4{f�G��&�} !�k��%�'l����iBP�I��-:�h
$Ȫ#�V���	�
.�=�Q���$�^,�%Y��>�7e)��>��d��%�Ҥ��ó�m�L!RK��dԕ~S-y�Vߐ�����HS��Y���pҸ2���]2F��$�uP��~�J��$0q#�� U��x
GL �7Wg#P"Ї�#z��F�T��p\,���
���)��z7.��6�~���C�
XR�v`�z O�� �t6<g�w�Y
+dTT4��SL��*���X�U�^�M��KA�W��4ɕ����#��lK��}C�2]j�A}#�i}r��O�N~���V�I�=��I���*]Kz�fk6�fi��j2�vB͂UkVNjC�`D.W�U�71��̪��UEY
+^���e/e��#T����N��Z����t�0�Tiu�oD���Y�l�'*�j�X��c}�=%�O>�O�ʓ�Fu6��z�Ri
�fjL��׫)YAg��D�
}
_��`_
�7��S6I���Z��^�P����*
+u�����`E�
j�-?��=>F^���J�,�s�{�k0[(8�J]a[�Xͥ���lu)~���6���6��|=�Q�^�ʪ���:�y����W��lN.ϸ؀7�܌u��+M۾n%��>���R�6�������=�Z}�Qh�_��(8�O�1W�
=Z��Z2'� ).N�X�>ٯڣf�:��u���=E}�*ZX�o�ξ@˯�9�H� ����E�Ȫ9��wg�ϻ�vl��I�L���*��qXH
+�-`��Ys�sZ�;���6m��
f;���r��B�=��.��J�z;*2z*-n��1�g�J��Er+���
��إf�����#�D��ꔴ=u
+��zKr7c$�G���b|��-�<v����w;��s͔�Cp���C
��Z���� 
�����oC�
�)4l��!
�(��U���E��N��a���|��R�
ߒF�f��j]
(<�3�Y����u��`PB�2�L[�v��#�b���ez��
��9xe%���zS6z�/uH��g�!Y˹�1ߏ�Ga`O7+ב����C$�N�$�=b���wB������d��
��A�f�d�3L�
�� �KǪ��F ���?�[QM����bޕOw���8�x�Tt�D�_Pj���0*�8��DM���d��ɢw���=�k��
+��>�
��O�P�{��_EVy��3���<W.����W_�4�7|N/��l�6g�>�F��~��
۴��"�j�V	sm&��@Յ�ڕ��
*
�O�ob/h?�`[(�����' ���	�C�F�hKl�N[��E3��N
I�Z���͉��;/�/�.}}��\�R͖M����n~�p�S#�
k�*w]nL�?�s�ɼK���
+�ӵ
BX�i$Sd��LM=��B�(͢�4��@�𡬠eXЅ�$��c|<��m�����A'���|��Im���
3����m�ȟ���ŀ5@���p,���t�W�q3ne����B�&l�@0�3v0^���?�"�?ҷ��
�r9I��C[\��
oM��+}����k���Pe�j����:�R��;7jtk�����tj�P7L�	t���<���m�
�j��A�;R��B�%��u���t�۲�}���45OF�%B�����R�F�e(vo��g�
����ݚ�"�MM���S���{���!�s�垠@���
+�	���e�Ⱥvr@��2�����͋C���
b��*+�������=,K�\�{��“�U�6;��^6���f~��
+�V�|�����+�~��d�B3�l�YE�[u��4%��S&wM4�@	h�<����5	�em��%.L��4�ΟEw�K�R��=�E�`�85�i�݅^#
+��ݓr�\}�3/^���?;���?��W~ k��N	[�^_� .}�<3�<�<Vr�җ��}�M�F
5]{�X_ʹ��Ȍ��n$J]:��Ըέ���a�b]u=�:���uw6x �������a���Ҙ��`���<���<,�
1�����=���;�=���
�,��

�
~N��Z�l�u��XK���f�t
�f��G6n�X�-���e'h%�l�}mo}ȼr�F��IO��Xȳ�}}�cH� ����U�N4��y�V���)h��
�
��Ճ���+�
+�$c;{�Ԙ-VT|���
�;�>�*����e�T�跒�|�fμ�|
/�Q��r�����:��@�쨱:���/
"�%4O+g�ѻ�fHլ?X,���
�����A��h8�ѽ�R˵�����ѯ�K�7��Ǯ]p�np
A�9
C߮����xL�l$�OO�Kv������w��׎B��ǁn'
'~�x��\o/��kr�Q���r�r�0SiN�n�{�J8�*�
��=z=-���N��S
9��B'
��
����S���
6�Wx\)�9B������'��t�V�j�g/���YA߀:)��)?/�k2�A�|�\5E�A�	����V�U���^]��=�ڊ�
u찲���O1h�PM-@��ʮ<��s;���4d6�;OL벵�;�����A�|L}\�:�_�5�n^m��5q���7�Jr��y�zA!*+�k̬\���N�;c�
�
�R�^�^����ö��	mV��~����h�,�v9��,��m��m�Zu��&]k }{�{g;3~c�
�s����ʹ��,ο{�͈��w�T�a��$��R{Sc�l��f�չ2l#i��{�l���
+m��FWm<��\=��M�Ԭ��s�ČK�9?�,&���}�K�_�_� �}�����h�� ��_�,�Ō��}a��(Y3"!�����A���T�SG���w�P7_1� ;%���({����j�[t���<��
��ֹ�Z�v�8���+��=|y�/��9v�*=��o^�A�}2=�f:.+V�k
��Kl�0g�uu4+̂�5=�
���s�!�T���
���l����Ih��F+9�r=��P?ߏp[�]���z1�
|���o��5ӳ^���筛���3:G�fD��
��0���s#�
+Iw�x
ʦ\��AӺ�[�lG*Xx���-ůZ]���A���Xm�ӷ�
��� ����u&�
'zeߥ�������[��vM.;=�%�����
$�� �oz=���.���{�%J�R}���=��
3)�tQZ�_]�w�i~Jk�������%T��eH�.\%i<�+:\��!bR�l�;0���$�Ge�oM~Tg֭��\�y��$�k�'����M�����N{��?�:E~���duii(ƵN|��1��|f�k
+J=zKbĘ[��ѢM�I�(s��.��s�Uj/w��H
����G�W
d+�J�y�1��j<Q�K���,�j�2s#��^����l�r�{��h˹0һuL�*��$�5�{��E����wJ�����Ν+�Z��{z�b�Q3���u;QWe�
Yf:�N̕����~D� �_���Am�l�3!}�3�o�����+��;��s�-�Yӵ��UTXq�W��L�
Ft��%w��<�f�6�X�69H�^���������x��Vt������� �
�病�>#,�R�3�������,tGևrw�W
(�|���-6��Q�t��"�.-�v�hQk2ξ�LI|�=���-������T�1��]�s$�V�q���'�p6����V�E�e�t�ب�d�Bz
����y
ꯠ��g�
a��@G���U�S- O�RD��x�;Tj;��O�t���#����z�]����N=���l	���j�
�`�#�:�.�vw��ٝ�"�
� 
���aŒ^[_��mQp�q�8�@!�(��E	�-��K�@AҪ�P
�<zL�
+��Q���:�f���ʖ�,ޠj�����]�^�ݐ^%%����X3�VyR�rM�7��s�:�V�胚�u�[��v����B�:�[���vi�bD
��![ߴ\W=��
+�F�>��y�z',��,���mQ����R|��J0�#Ӥ���� #���$� �m(��=���	��x�%�#��6ڜ����v]r]'�~x�������_��+-~�
+f.��|�*����j++�Rc�pI���
#�
���
�
=��-<���N�������#7������#�h^��b�M�X���a������*�0z{�����*
ߦG0�6�V!zp.0�Y>��`?$��Z���lv\�"�+i�~�r��ȓ���'>4�G���g���R���;�/��8w5:�F�P�k�a�r���I���-K�uxc�Ϥ{��t�Q�@�[�
Lx�=?�ut��U��l�Β
+��@��,ĭz""��˴�ҝ�l���6�,8V�
��6�����j�-�=it�*�&I����vj�pC�{I��y� �;J��Q�S�W�qI���I#���9�e�-l|we��
+
+�Q`[�S1BD�jT$hnl5�?����d��V�.n�+�zA�V�,��N,���J��N���>��|1����\�;Td�5G�!ds��[���P��V۔�>5Xs���,�sa��[�H���U/�b�u���~����M���6�v"�:���DS�=K�#���Kc�ݥ�~؈
+�m(�����Ѳ��r���P�FJs�F�Iy��݂�Y��$Eѯ��#�9d ����Do�~狳Y�O	ba^A���Z0�ǎ}w���=���X#A���'uʱ[�G��)�����Xt���v2�t�뢆4��=�>�/e�~��*�ܶ	U���C,6A�rM�PP��t�Ը[,�U`�E��|��dJ�-�)Q¤D��
U��c�����MU�w�X�4<Qy���S����%�=srTX�|��P�O�0	���l�M%�T�*AOdi�_v~5�����]��� *
-�rݔb�"B�|�����WU���(?�խȫ��,��2)���gV���%M~,T]=�QS{2.������·͚lV�V�,���p���
+��f�
+v����ry�{��
sؑ,�q��{f�-g��zf
<:����ӮX��[��Gy���p|H��dyRkj���ض���*����52����?Ka
�\���S�ɵ���$<��/'V���ط���������Y�Ε���-��tD�����+��������c
+_
�2}N���ޚy�ݶž�
+mE��op p]�֘::����f�>�b�Qs����������U�Uz~;2U��(kO����fR����۩���`�ʥ7�@�^�����9I��������(���̒�
y��C��
s���v4_���vr���.�5~��6,�>}�=��
���&���W5k���Q�WK	U�vX{
(Md�/^k�pҶ��+f"�Ҋ�|�u8�wM-������Ni�W4ɇ���ua4����&��{᠓��o�^��J�=J��׉o�VKG��V{�E�P��L*�W��=��
9���*fR�
�o�Rca���}�%Fbr���^�I��'�f���5
�)�-e���@F{x���z�J �'`�4���
�v�8=mc\lO]�>N�i���{3��1��T�HN��V,���|�PD��R�����
�?iT��R[
�5ݥc�7 "P�%�+6�v���U
��d �ׅ��J�@�YkR��U���%��by�59��rK+^�?4b��Lm~�u!:�+Gũ��DG��.~��JϟmXLe��	u·nA��i>�Ud/s����h	eփ�p���zЫ�g�Pwm�AG���}y��f���	�
�'�!�� '��_~���cĽn���;F�o��f�'�{��-z��w�g�ؚ���}̢y��oQ�C���M#�O�>�}C�@�G��xv�a'��9��~lr��Ֆu�-�/��h�ɝ`w0.�j{�j�<���&��6�[���+W��R��/,l
r�"�,�m�Zw�ke�=���t�=#o�2��?I��)�U
#�u�P
�׆r�Vj�|[��tt(��
	�@��2Q؊�^��Ѯ-����:�F�5��
XͲ������o
�=jI�V�k�
�Q�٦��m
n� [...]
yZ���ט峟�D�|�j�1i�Ҹm66�v�/��ћg6{O�S��P4�����1H�]�ެ5�}��G�j���9
+���-�zʉi\����G;�����k����k}�	�x j�pla;���FޘѠ��Q�JR�y��f�-63��"�Ʌ
+��_	����k����3؊O~2�
+�(¶�
>��&�?�ZŞ�M��п�׷6kQX��~<B��w5F�Tp��Sѭ�i�Lag��e�Z��ww�<�y�]@Im�e3�a�
g�
s->��������J�Z�|�bAZM��i}�R������
��vU��C
u;T��
0X᎗�j�_�6�`�p[We6�fr2b�gEJִ�V��=ذ��<V�=��kc�S��Vfv:�;4�S;z�\�[�舓:P�klR��ǵ�(�_/Ҫ8��������M��L�/!���5�'���C��!����
���4�os
��F������� N
��Wح-�����N��ݩ:.u�ю
hz�t� q �-�?_�7��
��+����ԛU7�HXOm���S�v��.�\�"h2,���mMo��B�����|
x��{��9�)p���+�)�I�8
'60^@? e��Y�
D��sҤ��N�>�džxL�
��.OR
��PǦ�;�նa5]��
�g9pe��s�a���5�V�]r�ޡ[�P����ϋ��r�[��
E��|�ϒr�}x/�"յ>�6�J-®�W
A��� �eg�s�d�ao)gy���ڍ,$�A17rV����Ƙ���;��^����]�r��;��ML��h���f�����B��M��.L��`
����b��R�휜�
�W��4+
��ej������ Ne!M%m/��� ��+���墴׮��s
}������Z��eϗ{�N��V���~�V��V�,���:����{��{���xKZ%#���3 J�^k��
Ő� �
�!%L+d5�D����w�MY��u{�,��ֶ=�ra�x�
'��"f�U\�>[��<���:���/��ux �T]�}��=U������4��[���}�K\~�.��h�}�
�%��i[AJ�l���õv�d��&�h;+�y���)�X�.��^oѪ�۞�.7��T���朋���<��1��C��Xs
f�K�`4��M3����	��a���p��A�.?��k��WQ� ����y
��� c�'���3%
�^�kS��嗱*���r�9�yy���U/�
ۇ!Է��KW�
ؿ�>_hJ%����u�-Q��
2��g�͆Q<>��B�H���d����������I=G�s��
k�X�nm��>C�J钰�(�Z�e�����W�ݭ��O�������ֶ�}�w���"��3%�����d�i]���uX��*
+��]� ��:�M�
="`�}60���?M�9�V�g���)
�O\�p��2��dC�4{

�LX5��xi�Y�
+���k,#��ۈpq�
:J�+��&��X�ň+��d�[n�����V�Jr�sk���骟���4�l.���ӣ��?�������G�
�*���l
�%��ix=
��ypv�����,��Ԯ*��Q����|��Bv��d4l�
�,kjZuJ_|n1����܏^%�,{bq��
���?���\��!M��ގNd6�VI��*�,�4;�0t�1��7�n$��'P��7�x�jA{=�c��n���:�F����Ip�r�w�#�o�ݷ|Q� ��c��!� �|x95(�)N�U0B�nɞu�i�D�p<�Ӎ�������"� �۰#Ssn�eS�ڔ ��쒣֠O���~��B����&͜C�q�U@��$�g�
����x�0K�B�2Q�7�%{̺�xX�'
����
j�e�7��G��+-���l�#�/Hjv`)����.F(�Jͫ_�}W��Y/��5���~@=*b���X��ҍ����Qs1��+;;,�&�]�Nmk(�B�rY�;��R.�D�-α�|��? ? ��3�(�IM��
a�C��35���óG��jIs���ڷ�+T�4O.���@n=��/d1�<',WX���ެ�wt⦗
�
+\�1�\���LXѭVK�E��D��89��ݨ�-k�\��6��0*���k�,�V!Ϝ�B�6��
3QZ���{`?S3r�9a��U����w/�4��ap�n��T�����%����d����˶.`��D����
�6��67��>�z���n-�/�p�\-3����`��pH���~��ۈ_��#�o�J�(0dT��ڣ���xTg��g��3΅s�u/O��krEW�W�7��뺕�FY��_x#��
��Wޭ�.�Y ��~;s��qƊ��.^��޲c���)�f*
+���̗�E
���v.
~F��!:am��0��
i��ߋ7��'�7(����������*Dw�qd�U�}��x���i�<�k�!G��k5��8r�λ��n���b{��e�ޚS���>'Q��xB���K�,����;f\�4�F�����bps4�!�0�8	��I������2���nwU*�ccM
y�
��r�
��M���1�/��U�jo3���W�Q�
f�����/q"q�YO���Mx���a�f>"h@
�7�)
�������h���V���*���{Y�q���D��殩
%cVTB��	�r�e����U�^t�]K�
!�
+
P%dL
��ly9�Q�ѿ�5V�����䚬�ic��1*�Vڝ�2�@0��ٰ�i�D���%*�7��v�{�x�G~����>��q���_y�gv����VG�{q��D<��
��w�L��e�
���e
��ďag^f�cn|���8��
���<Uǟ�dn���00�q|4h��=�p�T��oC$��ru9:�I���e�&ߩ��
n��a�}gvS ��N
+0<^�TV�C��
�s/���a܈\��bcIm?FL�r�=�nñ�n�]��_��}+O|�
xtl�e���
�
�s����۹5�$�e�n
\G)~‘��x�n�GQ�|p� |X�š]�������~q�
+�bN���Y��k+6T��}{/'��c
� ���{L���a5I��5ED���,�;^m<Cyp��,�[���}��3
���t�b�r�Qvy�|ry�-O���,�1Z%z�J����M�=����J������#EZ��V3
�E�$�dK�٬Q�	�.�l�.�6���~�T]�����rP�˜�F	�c.��@9��/q	���D�+l)<I���
+����١Ƌo88��C,qW���Ŗ>A�խ�5�
+�f}��.���\-A7���i�Q�%�䠙t�ܑ��J
�͞����u�2@��Ȑ�Wͳ9
� q3�=�#�X3��2ϭ�R�����
J�ǰ�$��%��L_�q0Q
�,QrdH�eke�ע{�wj�ٹn�^� ����r\��7� O������6"�T:Mn{��7��R����KN(���xq������坆�",�?
�%�)��j�x�NQx-���Ysp
G��R��^XH�No��vW1
�k��9���Zy�3�Ѿ�2c��MO�
�/uۀ'}kU5{*A��#�
������mU��T�tN�S7.<O#�F�Rv&l!��?�P�{�7(��$�}�����
G5aa�l��c
+��yK����sZ
;t	�t�j!{~�
0H�δ�)�Z��f�Ҵ���
M=}LJѧf�TiZ�mjl���{)(�
+v`��P�/�(��i�UH�(���Vf
z�Be���Is
����h���2/�jVȗ>	TG!��>
�gU�fR�����N�ݻȩ�z
���=Ya�
Se%����������Di��'�^V3s0	yy;���b
U.�d�t����*�awd�7������'P
_�Z�Ay�_�����^��)l{�u5��L/)�u�
s
��r����L�E
)�jmb�>�
��:��k��Y���*�������0�C"Óe��j�
+��ǯ��+�$G̨���}�(D�W=��EM������r�
�[^}n��N�I��/���y�ߗa� z�	���oc����{�~��OU�ٕ
;���Ne�
��I�{�r[�57��
X0�,hc��C�|.�X�b�1���W�32��
�>�wЅ�&��>,���N+�f�c<l�G`&&�x�_D�e�;�#nz�*
��=*
񝆡&��W�ܠO�Z�eR��8M��(Ң���+J���(MI4���;R�ɗ����
p��R��b�զ��oM���,V���w�cӖ^����g�[�r��:P�����W�
o�����5�]U�u��˱�;:����(�n���M
�jT
�FL}O l�yB�hRlu�S����?{������9��������>�}5}�ztK��Ź�Ha�����e�U�{��Q
k� �^H9kO�r�H���6]S_���
~�>�H)b�m_����mC)nԢ
���Џ�/����dD���6h�/�fLg�1|Q*��F�������섔��d�a ����_�,5t��$qM���;f]�&�>�b�3v�c�97Y��Qǯ�ly�? ���N� �ܚ�ܢt����LO��;%~����fL{�(5�+��f��Cx�!�F��_�Tll�g�Ir+�Y���q��/�U	Ee�K?4��b�q�-��g��g�Ϛ���xLEy(���D?V'����d��U�_���A\�)}u1ګ� U�<��_��--=��n~K��P��?]}w,�J2��Q%�Uf2��y�n
���Z��5c04��@�
G�D:اq|��D�ʜ�H?7
�1f/"k���7k��7�����jxc=���>�A9�E�
]n�a���fG��W��F;����u�^��6��K��Ջ�b4�̈��~]�~<&��p�����+�~��1"��-�pD��o��\{�
+��]��X���y �Xݫ����Dǽ����76�+B������g��ڇ(D�^�� ���)r����sd��_�h}��
F-�{�����v�T< *q�Z-�� ���!ˑ�}Pݣ���)��ieĺ�[���v��n+�=�'�TM>P�#�u����`[_�J>��@X9���.�l�d
�$�}��5�5B��~-��;���jJ�D6[0P���+��^���
�ʥg;��K�
�wGzf�u�jd�"y�~��֬4	��4Z޲����YQ�+�+�s<���A8�T�|�f+W'�p�*��+Y�Go\��B�L�1��y�G���iWc�5��z�[�d`'4��hl�'�e��p�D�}���f�陉B��� }��,?�s����)��y�
ջ����X����Nc\2f�k��S+
�P��c�/H��]��~n-�s7N�����ݲM�M���6�J}s��ƈN{

,�e��� ��~�)�
�����Ap��o8оK��Ac��)#,��G�����7��\/
`��Q��ͽ�
>�GA}
���c��W780��҆�⃭;��읬<Eeew�y�c���}�|�������+
�U���>�ͷ��>~=m�M�
�|�k��sD! �:�E
����e�B9<w���ݟ”h
�Y�Sm]��D��g[? \@��
�Y%��P���_:�=QҬ
�M���5g-�M���)	j��C��7oW��>p�;iv��u&|��Zg�0�>�Ƙ���
�;|V
�HȚ�m�m�`��9k�2n(�m�����
��֤%�Z�kG������5�D�0wMӛ
��k,s�I
�^ �-J�-�׿(��62�ІLc;
Cj+3��-�z�A�
���i9:{V>��kqeE2���C��Y�
n��}Yn�>�aF=��f����ݲ�֛�cv�&<8�g
�`D�7��ww��#և�# �En��M�	�F]����
+T�`
pEy�Oa�zǨZ�:�����8���;�g�D��Hf!�v�E1�W%���ˣ����͙y�i�' ��;�
+��)
��.,+hlz��tP�w칌.≚�����n�i�-��Q.s�N�褮
�6f���'Y��0
%U�
+����kX#õ��?`����B�5~�z��sC�M���~��R��W����󗚋��e��D�V†��.x+�>P�v_�i� �L�a;~�PW� �����WA���58mL���
�P�
�A��\�Y�0}��%�ݤ����`���y�=���fD���Vp����)P�ޜ��_ؓ��k�'�~/��o��g�}r
9
�"�y�W{�
+��ZA�g�Z�Ey�+IJ�����i1vo���9�
9�r��n'��G�cn�}ͯ�(¯�]���c=[�3�ԋ�o���\L;�Q���sN
t��~@?��xMB��u�´w
ٿ�y���e�y7�tj]Y���>Ju�0�
�U�X�6�7�O��J�ܞ$n~S�Bmf� ���܏ah�͔�IJVM�[�؊�j4�I��p�f�9�O@�u���T54l/\!
c
�
�W_�庒4��!,[&ɖA�,ff633��U��}f����jۡRBdTV��\�N�$U*5>a�����_'2
+o���j�g�^�>�ؿ6ځѢPI��P����Ħ',S���F�`.U���ۆ����UI&Ƴ����m�
+���V%dsٝl�gi���b��%޷e݅�n���lO����-�3SϤf8���U��qL�
=����KV��-�j�,���'	3�8;
+r��c�M��d,}��Sk汢4���*!Q
��ިA)f�ί�π����W�Qϋ�K3ݶG�����5��S��E,���՝Ʉ	a�RWkg65{�xL:���_�
��=]�C]�T	쉷�}d/Q�F�g����!=���Ļ� 70/���iVֺ~WH>QI���t�̙�X�����H�ޡ
�
+v��||��A�
ij�������s��i8�q���lk�j�9��)�ܗ�H�
8BaG_�*���UG�b���Bq�+�,�3:�՟�7�����/j5�ÐP������x
n
+"=�i_o����
�n�u>0�]9,�ꌡEƦ��#�ϦgE�U�uP���Z����	5ܪ
LX�����
+�Z�)����9�|?՛?���n�Ͱ�|�J~Я�E
`^YK�
��|6���
E� 0��6���#��Q����ޒ�t���
+Oy?�93�R}'=�9%�h��.e�
�2�~��C^=���[?b��3�B��*rqzd|���?ȝ.()���Գ�9�
��w
_��&e��޾�yV�[�iI�
��b��Ǜ�v)ÛZ۸1�
�'b"��՚^N���51e4�j���r��&��\��XQHaX>M�$Wg�H5
�PK2q{O��q1Z]<�i�z�Q�Bc�|+�bew�Z]6��g �&ɰ2W�������J	��6.�6�qifY�&�w�T��En4*o6d��Is�0�
��Q���|_��ѷ�x�ML���kqA�i��q#��5���{nc̀z��ML�ys�H(��Ub��`���cb���d�
�����
B�������k��7��VҠh'�%�D
^��� �>� ���;��J]�t����h����A�P
�z�f�~��c*��*�4|�3Q�	�^g0-�S��
�f̲5�m
���L��3�N4"�B����NdC��ɠ�ۼ[qO��A�C#��#LO�g�����=n�-m [...]
n��g~

!�G2�=��p���e#���s]dK#&�L�<*�Y��Tʶg���M�þ9WGE��/�_+@��M�����k� �{4G+�V�B��ML��f�X�w�
���U̒�j���j�g5}
�$d��0{�O�G,]!\e��}���eY]�;��q����ݣ'6V���#b
sOc
��k8�
+�ۄϥ�h]������e��\�k���Uxu�J��2�QCb��R��!���@[���juhy@�a\&�i|�Gb�r{
�V�5Y�O� X�|�c�oN;m�
þy��N_�]��N����Ctu:��9����޼�*j�80]�+�xVն��h�~���)��c�1�mu^[�,��q��Ӛ1��,>��=�3kpV0z�3�Y�x�~�=,��YF7��[3��>�N�,��Y�/ÿ�Z��/�(�
+V�l�m?1����F�e+��1\�G�i�K��rY6���SSܶ���/��<���m
�� '>dؤ��Ƞ��tT>��
]
+�?�N�6�
+��;i��
D������bj��=X�)����x'-=w ����,�c���#�����@�V�(�7U�U���
��L<���Jx�E�ž�l�q�Uf֠����4�'��Ү��qp�ۂ���_ ��]��c��׽�@Τ�
�8^b=����H7���%�
k;��5Ǭ>��̳��� ����B�S��
�����'��s��^�{6�h9��EGr-y�PI^~̙�F����)����Ն�N*�������Q,a����S�
L
�;�$�1���748j��	9�"����-��g��h}����
+�!�G�ՙE7[�]��W��������J�_'�}z�迅�b����X*��W!;�(oA�=#����lh�P{���d��K���]� ��hX���+�
�he�~b��'���u�����z��65dg/+�Hß
�m֎�"�dMoe�_
�<Fm]
+;��0�ݬ���OX4vK۲��'����p�b+�j��)�kK�^��
	�bX9ؘu�?��6nW�WFm,�\��)�~$��+T�Yj7_	@x4�|���i�wM���x��4�y�K,��%
y�W��3
~��y+�^3�����^�+�6���ϸ��G�u�I�Ȟ)ض�gm�����B�.3��C�^d?&�;�4��9����n>&ړؿ@x?���<�	*��u��
�K������x�[�N�$1��F8:*�[��G�+lm�I������s����Y�J�y�;l��)�D�<Hf
+��м+�I�{�j�W��u�����i��T3[��zޱRGG�׉X�O#R�B��i"
�n�����Dh�_�����xս{+.Jj��ߣ��3�-���)5p^u[�܃W���hT���.��)g��K�B�Hs:��Kg�~������h!��˭d�[�P�|���3B�\�v|�^�����Z̸�w�Rk�!Q�.ZO{�
�����r��?��S��#�9�]�>lx�i��e���)�2QoU��=��"M�ܗ��K�s�+�ш�ڙ��}w���C)OJ:m�`h�@
+���f5���D�[�
Lo�
ii��i�#�#Ѿ�	S��G��W������>k^5_t5�~f�
�#��t�L�/qs1�9�F�;�h�F�鄳���Z�\�V�F� ���C�u��uq�|?m���'+)Q
2D��F	i�b�$W��\�wi��F!8�ڿ@*
��������R�Q?��IV(<k�d��
B�WZ��+y��b��zY�P�o�+��,6�yM�����@�0F
+��b��C���
�5�S//k�^�X�|.��������^Z
��ΐ�<��� 4��6�ꦴ��!�->h�z:Lb�c>�2��s�p�zc�m���Xl��9rX�8�����۾ԛ"cj���gZ�~�9�4�sa��	��֌@��$��X�6�ւ��Ѥ�.
;vwE��W�<��m"'Q��%�¹����_ ���3�~CP�@��5<��~rX�z�:�\���u��vxkk�ӈ�./Z�_ �B�ö�<ݿ!`����P_d��6������e�ַI)��

w��_�~��W�Y�r�y'����n�b��]{Ŷ��e���;�~�<pxo�Ʋl�@1��5����r�σ�y+ˈ��
+�C�^��#��m�b�Y�&
+�����x�ON�z�#��eÍ~=''j����@*cwq����4ʹs��[�x��=�Fl�?Ӂr{�>����AT�_�BQ�ٶ?y��ي�����#%|]9	�k��ƌU��0��̭s����#ߐ����ϯ�w�Z؜N��)GU����|bt
V�^�B3��n{�ܗ����V��
�~ʛ��@$,=�$���k�^�< �޸N���9YE�w�5�G��o
�xD�� �����$I)�m>�'I�M�̬gvq5N�M�Y��q k����SNl�-�6�`^�yG����?S�c�����P���bQn18�}&΍���
�>
�Hg���PX}�
�� jq�
�P.'�5������s���:��i��s���/��
ف�L�m����
�ą���Y.sϯ���a�
~y
�*a���a���FgYW˼N�E��/ �I5#�wˀ������[2����C��P��9x
��А��֛
���[
�y����s�y��
�̀dC��ax�=T���[�A���X�L
+��$��8N�DQF��0w��ưՔ�`��6��þ�)��%
�[D��]W�����(��؛j��?�����7����ti
���}�'P"
���EԳR����U�hX$�����
l��,��}�gƨ
áޅ7}�ju�J��3�*\�,��~��Y!���R��KF�V�����B��F��Hc���"�ꠠ��T�*VJY
+q�S�ǭ��q�o�mi�gZ7�,w�{�3�������L.8���L�O!!���cKG	+��[|U�^o�r���
����oFw���-��}&e�
�+
��=-�^������&�3;����~fS���­^/0��y��K��*����0���	z
��/l�/��2d��B��N��
�*D���6XS���]$}MS��4��q��a��p�YH��O}��	�J�<U�O��f
+_�IL��
+/2��Uy��އ$�F��.gE�AG����T�4
Ҭ��������h�s�oo ��
�hm�q;ݭ��iZL���q]Vڧ�vS�lU����\��~����������v�%oi��`��D[,"����
c<ե$Ͻ'����q��0黯��Y�{7������f����ҡP���`�&�<#�a皊(�$̨r��N%
�\��|?��3�V��p�_-�A}�S��8K���>^<�^��՘�0-_E�z>a�S�u��8��{�bE�־�q��h��j��[s97(����ۋ'rAL��o|�"T�aKh5>�Y��6��ZA;�����S}���)�P�<HR
+]���H[r�C5b��X8|�w �c2-C,O�@�q�5���-������C�$/gc^~\�� ��3���:�C�Y�
k��?}!�h*�w�Q����q
*����%k���*�A�(��!�������J�����Q���s�
�m�-z7iբJ��
�� bcy�!���)zחG��WF;�F3��C�L��j֧r� ���l�^ܖ�a*�_�m�KĹ�ђ���n/r�x1DSO�Q�T
<m��[���2�避?�;�d�Nj�����(ڛ���	>*)��H�����A6?�R���5A֫l`;�}��:��K��^!�m�+�$d���Zr#��\R"�(lc�i��&)��/�
+�$��b�$���+ �ٗ�V^���� ������9�
+G-���<^ߒ�~
(`��`
+A�Bg�? 
�6C���=u�m<�ۼ�D<�^�
hnT�#�v�:�B��y�T�<�)�I��ly�٤�q��/��,5�-l���0T�6�����m&sek�#nFaP#�󩦒޵�6Ʃ+-��1t�K
+_�b}������+�=q{t$o��t9�\A=~A��y��RsU��	�?ӴT�&��h�p
*�5�Z�������th;�ڔT�$~�W��f���JP¤dDL�a�Ѫ_����D�����'95
����:���;�'I��������7��L~6H[M�G�.������+�"��yK@
�W?�n�Zӳ�J�2�����{��^pU �eWӨ�p�jr�߬;�Li!е~����/y�C6��VT���+�7�.8W��9˩�Z�h��F���ّ��j��,c�os�ĵ<YjW���<���pV�Q������UV��.ݿL_5
Ƥ�*����e����OΉ;���v%3���+<�.�p�4��a���XC�;��3m�P��S�*���+�
$��x%�d�2�
�2#�OV������O��p�T��kP;���p�/3��EI�^c��Fr�`ĉz��p��b�=d���	n��T�9_�=HZg��A�>���`%�O��AK^dz]�H;�J׸�%��
�m�����|�6�K#K��(�c��{����U&

���e�׺�2��j& �O�G�X
����^%zk�9�/�ꛧ��wSV+�jt���;��-_%01���G��0 

�)8��Nz�\\JUx?���qs+�5�����
#z0f[�qIL��y��K0v�W�m�#�'��_��f���c�2���5X�8����l��y���>*��6�3f!Z��{�N���
4Y�rN�=}�X�v$��:����H'�&�=B��j5��?N�Q>ӜnB���mߐk����|y�>�㿒�j�nO�`�9���V��,!4&N{��k����2�L�8�YZ��j��m�v_}���ڃ�M�r�i����v �~e�+��ߠ��C�
+�D�l
	
�ӕ���Ua�/[;��
�
lY��
+E"�����	u��gW��ը
�VW�'5��>T�]�1��ҩ�
$z�߬�(E�Q at b*7��[U��ΔN��8��"�H{BH?�V!;�Q���
�:[C�t

�)�v��Һ�ܳ��
+�(۝�%B��~Ajԏ�͗�[�n.��1�k��\��h��J,�L�z���<�+���m�C�D�k�����d����gCR��1���{�� (���r�/�S_�4I�j�"����Uy��<�[��(zo
�h,���I�@�������Y{{LH�]
+�9�\��y�Y���86��硎����?l���U]iZ[sfn��j������P�d8j���m�؍�W�u��G��x��T�hx�����N`�9��:v�U����,80"�Ɗ0�(�#{�h�F�o�\I�8��ӳ`x��A�P���b
��
�T3w��f�|��w�d�o���z!q�G�b�dc�����9�4�=���#���B���km��u��d���
 ���=�A�jĨVe�ׯ��~o�8�!�H�.��}� ���&
+(�毩~��.sw��Ƹ��'��۰�P�
+���5X�%�>���P#�Dy��+���'%���ݒW��uAD����#sB��#������?�QǞ+��P��B ���ڌݦ���,�k9�c��N��AV�a�-
�R�LTs�
g�O^bTc"�uj����1���u69Sr������U+Erz�����BI�G�A'�յ�#O^N-W�w���R܃:�ʂ�Mʾ�gq����v|4���2H��N�GK�͌~e>kO�
k�bN�>���BɅ����bY9����۫��~@�Ho}��ߞ�+�kǻ��:m�{��V#���xլyxU��Ŀ�A�X�Ä�|F̋u5,Y�_�&7���{–/ȇ�罋� ��F�
뭴�o�
����
�qR�g.\U
v�U
?�o����@PW'�u|g;
+�Z�_�K
ߑ|k��ٞ��}�
�b-�_-��O�j�����w�>K��مn��X9"R��
+���c��U�xs
�u��Q}oW�M�^�5�St������ΜK�k��|��;W��4w����9O����D�^l�ܹ��S����Y��mG��54xVW0c3�^��
��Em�<-���°KU�N�(]�{�9��o���[g�,
lO�ɝ���w���
L�v��{�c����`��T˝B�g�%�\߿2_
���X�%��r'6~�'7���~��K���w�VԫE�\�Y_��b\�>��B��)N�c���PռU�]�K]��?�φ{Uj�&�
�Fa=.����-�N��!��n>Y6�Օ]�
7�? 
ecت�kE�ry]�u�2�#}_˕+��GD�r=��9��/�����^����l�~i�9:��
�Xl֯�b�[+��W
�
+��M�|��E��'A�ϲ�Qj�������o\�{�v�rv�;��x�s���o�۞��6�/�_ J�E�$\ͳXhˋ�2~�R0P��	^ڽq�6+�cL��^w
��TM�9�m+¹K�����Ev� z���TcwuY�^��~�bh���KGn�̏g�֖��D5�I�u��욏PP3q�J�呇]�LDz�����R�U�q����_�r���/��'�R�
�~&�L6�&��
����A�u�j�R���� t0�ǥ��ح�_����K8��sv�F����;�=1SE?�@�;���o^#���5Bg����Q�
{�܄?����n�[�w!���^���� lk:^9�����`�4It\�>쁔�
��EXʽ�����wj�Ф�J�Z��r	�yAӥ
zkT�U�����W��=>�ة~k���"�����I`�(ܒgσ]��?���KS+�I�Zn��]�:�_(�f�
p���@������@ z���/{`!�ٮ�/����Oi2}����^�
C
E�X"��F�?��y49
?-�$�?E��T)��?���V���*���{T{v8�6�1v!W&��
4�.yМ�������C��|ʞ����;�JV<S�@a����
y�.�aGO�Ahd�a#7�I�њ�fش�P�2��eG���8��z���|��󠑙���Ԟ�M@��b�
V���X:�x-��+Ynt�
~	�ey�Dv6�Fs�P�����Sx��
�w��J�jf�
>ڀ�����(k/�������^xmB��MQ�	�>eϋj�"T�%EY��^��f�F�9a���O��_
�~M���M�Y:�Է�Cg\2�������j���l�l'��>01
綰��G�
�i֞l��1:x���렭�&ܑV����W"T�T�����J�� �~����Bo��,m�Kk��['A�1�U)�O�[��w6�E�h��yur����(s{<��2�c:J�`M�.y�.r�?�i�|I�L%"�Q�V!8Tݘ��ט�l�F��ww�٫P�܂����u��G1��$�����W8��� �o�� �r*������1��r���t�QK�>�2�s#B�X���ET�
L�F^�3$*M�H�JCTY
+��WG@~�VC
n��o-�OE\���?�0A���B%eT�B��ы�M+�[1��'𒕣��
���a\.ě��J4��<h=[�j9���� �z’��;N���g��� }O����1����
[�0,3^��B]P����9
t�<���?��R|�˪<2���������?�}GXS{�݋���t��3�˭�m�Žcrs�ۍ�
E;rÞ���к,x���mܴ�Z�S� �y�><ъ<
��o�9�)�Y�
SAU��'ܫe�-����_�0�O<��[m�<���e#�Q_b*r3�p|�
d�����S�}Q�xv�۰��y���J﫱�����,f�ZTM�>u�d�K���j-�$v�轐�3C�( Y����
)!% -���dK�$M�O��f7�'"
�2���wZ4�������P'�
�µ��*x
+
gBzw|���^�8�f�HY��M>��h��Tr�z����t�UV��ܻz�V�j��sK��)���Χ����4 ��G
?��X㼋�f�
%�ȩ�s��Ӻ*wgk��&5�9�K����_�&�p-Mv�

��E��yL�vޱ+]h�
��BGj5_��c�_��Q�%s
{
t^����r ��~�0�a=��w
*�I���^sFLd�L�}�
+�
����1�� 6�Y3����s�vHrd������t����÷̵zӅ����*�Q���/�T��l���/L:ȭ��5�%��oM~8?�S[
W�Go�?�q9��v�9�d��
+�n�-o�s��plL��(� �g�ַ +G{�x���0>�@��i+���A�}~|�;�]����I�����
��4�%�cГ�v�NIy�qfzM����;���ۘ�k
�Z��6'�FP��C��5�X��]x���LdljJp��b����M�uR�n��,��hC�&��w����k�:���2�#X�t��s^��qB$�2�])�M�9����dL����#�9�-9j�����L_������%���Nݯ�Mym��<�4�	��DĻ���z*CUE}e�]/�-tV������Wag�Lφf�i
'�nV}k��D�9�xG���׬)�p���c<��μ��z���i
@L��tY�P�$A�X���ƹ�5e��/�[:t,ǩ\��U8���'B=����M�3�
�/�Vb��vo�XH|cQ�Ư�am�=*����5
����WZ���t�<�
���h@�
+zU�k�ܽKӌ;��M �%���Zp�O9-%�6�;'�:��
��\�CX-cU���
}����������J�,�
K*�J�VY����m��A��J��Io��i*���~��uQ���	���ĉ��=[Ѓ�
�� @�I2���`yF��9φ�6֑�>�wRN�
*��ȪLz�9��k�5j�Z�gT<����I��+/�^��Z�{�{�s�O
kh��"�J��Hܭ��Y��v͉\�d�:����Iұ~u�|�
h��CK:�_]
pl�7j�$�g�V{�	��2WY�Ͳ�:W�IG����ղ�$�q^����R���!�v�ەp^q_�
U��u�ɦ7lr}�M��Y랴%-�(�ޠ����mt�iS�l�-�
�A�w����A�[�iH��\�
Z�@��)̯�v)�d�}a�2]b^2H
k9�7�¼c�fcg)@�D:�5���l�~�V����/��s�lg:���ML*�a����s�O�ڃ4���ɣ���p�_�[@o�@$�^�Oi#Y��$���Ÿ���Q՘0 ���Xr�y���Ƥ�=l#d���O��������-�kq!�sR�7��;�P�c\FÒН]�@�#G�k
N������5��a�R�3��!�\ц8�m���~�}!>od����q�v��ej��Ҭ���o�ȘeCY�
�,�cc�"�
+�� ?
�MaڱPd/%�V��rR<Jݏt=�՟VK�%�Oچ�_�bW���A�8;؀ˉ�_��"?����n�
t�Г��͋�9���j��Z��qU\���\Bm��*=fm5�
	c�)K�C�5�������Mt�h8$�*��_�|�-4�A�G�=�{�:��݂8[�w؎�k�V�z!�_^Ӈ>�����3P�*`�tV�gZg�t�}d�+9�k:'6�xu1��X�\�_+�CU5�W+������l�-QM+ږ�C�p��l�ު�݉����iY���
	�
c���v�g�x�
�Z6ѳ��٢߱VGU��;5�Jnc��ԑfAmz�۸�

+��
�'H�j������*JD��Z��1ߌt$l��������Y �STU+�Ml�o�ף�W��}����	�1/�:�E�m�i��5�W���)��
+�bvg��l�&Ǹ�:�R���g�SUE����B�PN
��
�vO@�y�=�DR��>�m���k�^%r�~�<��4r�ʬ���il���Y��$6,���%�`OQE�ƻ,�V�z��~a�G���6�_uMYs���굊V}���m��)�X�/u��#p�R�����Y�q(�Z�wh�/��F��#L
+<�-�0c*��$��j�W���I�D��
g�/�5��)�� �W������1a݄�&c|j�#�2�l�o�Ta\�xpm�>����ru��f
{�^i�3�_�ϝݹ8�0������C�Em�[s��
�3|}�@��3P�})�'����W[�R=�v��@C��.�tW�saTn�W�9��n�����aU
�4�lJxlP(���Xk���u���
+9�\����?}7%
?>"�>eP��4���[3O���<���lN����Y��)����\��R�^��;���6-b�i��6/΁��
�5x��c�=�7�_+Y
K��f�.�(�%
ɞH�/�Y�a�v�|�^p�5x �}Dt/��7��~vR�X̍_ 
o���{��3���:����Bt���վ��T�rx�퉪
>�D���� ,��{ʼ�v���d�z,�h����c.�"�eٱ��#,�
X9������G!Xh�I�$��EN�hߚA��#qjk�NuP��NG�kU�ط)tyӔE�a�v�w��9���3�\4�+ݷrc޻.����E�t�;��a85ɽ2w��)�����U����أA#�S���w���b�[�DX}�\������os��ބ>�H����3�
�~���pc�kLN�[���C�n���}����A�e�7��O����O%�qݮS�&1z�K��&U�	gx�x�5<y��Ve;��9��D�÷���B9�и
+hJ�
c�+ߨ�1�n�k�
D�B80���5T��b�=Bǝen�ː7�>ٰ4���z��'�ߵ/
`�O��߰V��ͻ<2�2ð=(R��j_��dn;��]���$
�K3�)���!X� ԥWsP���#�C��IҺ�s"�A���$
+������hZ���.$k��˭&8�XA�?��c3]�X�Jv?
�"��aJIc�?�N�=�}\N��s"�
�M�ȥ�ohYعϋM�v�%o�&i��'�j��*
�ɭ_�;K���|�����j�K�R����Ž��C
i�\��i�s~�Ym�E:|r�������3�}���I�Y�MWG�^
ۅ� .�
+�(��$�ZE}����nq,B��J-��ܒ�٧�Lr�YK�b��:�n3�h�Įc������Y-��	lM0�������f/�ʵX��"8r?�i�cA�F�wk_ �֊D����ہ�����B�I�D׊�s��gZ�%3ft��)�9> -Xh�y2d�BV-��_8<�����f-�&p�[5ؗ���㷀<U�o~6f�
��X)
o}/�(JO������I��Wa�zF&W�q�3ˁsS���}R�(R
��b��
v:��β�H������7�ȭ��}��r�
I��Y�fJ"�h۔�Zp��]�
+.�$-��EX��1��J�
+a�����'u�w&�}��¸�)�i
D>
+ �2�()q
D�> ʳ��&�����
:��0`�/`k(n��-Lf��lޚ�|r�W�U�¾�q���w�����
�rypF�5XFi�[u���0�!�
��pij���"���ܩ��X6��c��h��!Z/��� �r8
/5��o]K��କQp:�qvM � 3����r��h��u��3n������+�����:�ؕ�@z��~6�Lz����\�;۝��P$�}*
�<�H�l���~
�I���oP-
��Kź���"P����g�(������Z
�%6s��[۷�e��������~i"���Y��w�{gU�x��0'�eWE�5*T��c�~�
C�ê-U@n�+�:�s+�H�Ii�R���XB�k�T����hSl2	'K���@���-˥��!sk


�u���$��g��B�U�;Uy
�VYw�Ž�!@�y4�0pdR��r9S�E^��
�`�AF���?'��t.@*��
��
+z�zX��X�V����v�4�l����sKZ61��vW�ʚ雕'@�9m�c���K�_x��
+8�P7H��
Y��T
��]r��S��FU�)��S7�f��p���f�A�R��LӚ`�Nf�(zZ>_���n���&7�]��j�)����y�����mNc�%� f�>@�5�SP�a��Fu?��M��'��
+����f��“�M�����Ar*��T��k�o��U:�Y���R{T��[U�'��"�b�$�t�
��
�ۍ�t�?��c^��Rcx��=2���̨`�Cg��UK���0S�?�V�\?���b�uDF��}:�<%���I�)G�mvˢy�)cB���bWj.ټP�� ��߷>�?X )[hp�<
����z�OʤO"��&�Mtҷ?�_�r�;+K��d�E�"u��j�}��*�gGl���+(���_�
��M�'��պ|���Le����܎�
+���$��N���x/Ȁ�z�
��9��<�����Y̨��Dl�
(��у? òFM������H�C
��C��d�8��2X�&
��d���?<�Gw
?Yj��{��e��^���f!=�A�!��̱�h��)�,�
\�qϋ�w/�Y,@�k0�=��t�\�	�R���,�M"ΰ)K�
��$WrĬ�T
�K<b�����a� ��
+�ϴ�����ם>�)�W�� y{O��<w-��Q����
s'�U�f��:c�E�N>l�[�f�`�������R2�V�+7�
�[*ǂWx�ʋ\���/'v�n���p�Y��P��6凷�#���DM[* ��f%����E��C����4�֣��VԔ�e��J��Յ���q�J�MZ��V���E[�$�U|'�kЦ�{��J?$��h��ɻv��S��j�N�����N�
+�U
B��쁃x�����ڑ
(���-~����[�|
8t
|W<ݸ��4tN)=�h=�{���zz!X���#����|�%�*,�
�����dr|ʾd6��{���IU
��p��C-��h`f^<<�yX��Ю"3M�#�[8q�ۤ��Y����i�,ȋ����z�5�q`k�
+ދ��d�
66�9g�&��d_���=3���O��>h(I�Uk�J� �����0jzğ6�vi
4">?����
{���ޥ�P�AJ �[+�.�u�A��)�ݍr�����#�k���r����Y���p�ӡ�RG��X,�$*
0�,�HG��M�t9ͷ�ז۟Z��M��I�i��SB�

�^������G"u`�����~�������O��4�l<�J�s�)��I���
KO����'�ι)xS�C��
��z-���9B��ۻ,n�/��^+Nc�*�O��Sj�w�h��ّ�4j�D7nT�����#�w G�>�
��*j͋s�h�Wq9SW��ۭ�`�s*�4��ʟgI^�tS��j��d�$�\&u�g���ߣ��DI �Iqp^٪]y��5ѶVaFU�~D��|��k�{K�z�!˫w�}��G:Qݨ!
�C�o�= ���9C?��\�UT��s0���,��.�_�ӯ	��x�"��]�e�k�T���Uزfi��V���ճ�F���[�
+��)�6,t��۲��,�l��5�ٰ�pg"'�����3P�D�k+��
yĵ|�6b�E)������>]Du�����VT���uͧ�b�FA�I"';
+���J�]@�(���8�˛�ߒ
B�x}�~Ɋ7�E��:�J�z
�Q��i����ࣻ.��
�g������n(��-?��Z�`ᱠ&����r��#N�fT��,��Fu�.�
h�G�
�7O�T��^��a��4��8��Ë����j�
*��P�z��K��

5�g>5m�Z:�P�/�B)�5:E��>��p����N
'�/������k�n�W.�1ER�
+�����]ӊmz�?4��
?�+w��5G�MN�
W�}������ˢ�j�FTY�Z��4%���槸lhQ��Q����m��Ʀ�WV��?%R?����6pd����a�r����;��Ru�����d�9
i�On-q��G�
��'��:�K3�8�����Ex����4�nY��-�������1T�5�}r�2챸�����'R��
+�h�
.
n�/U��d"y;=�v҆����
lX��S0s�_N��D���O'o[�X���&��ߞT��U���s!��e]P}9`F��b�~ڗ�.��*�|,�k
Ĉ�<�\ه��q�+�lj������o�S?ޚ�� �X�D�C3�u�8Hm���0ߖ�g�{,�6��U�!?�y��ZD���<��ǧ�{��רuK
z_
�)
�l��G��I�3��=,��kI�[ ��V�tA�͚�٭-Ę�
p{�"H�S��>��S��`���J�z˷ȱ��ތW��s?�[wzJ����4���*qx|�U܇�`��:�w:p�|J�DS�m3�y�/���k��j��_v�
Z:#����wg��A[>�u.w��O�O�߫f,�*#2��7�5�ѧ9&��ں"51�Z�-S�T��n,���
��@J��h��%��Wv
�+�LX:�Nc�N�ס����^�����c��t���at�T�
�|�4��P|o�B��]���G
���\ր�l���62%{�Œ٫X�(��	�o�6�p���'�j�����
�[D}���Γ�j����8g�I����{�!����@47M ��۴�@�BfFR�����~�����V;�
Qk9,�
�UE汲�p>F�oS�
O�a
2~l��v�*8�V.�ۇ���Ӛ�\��E��ms�t����GK\�|=D���V�)�8FV�.&I.߷:
�j�:�q9�[�G��%���<g������mHn���	Zs։��
+�i5������
ŴY�T��s��qV��/�}��OJW�7�Iq�5C�k�)$�KG�br	G�;6��0Վ��`�v!V��Z/�F��g�3�vdR��Gd#��;�^F&m� 8�
��2���]ΌE��
����%,\+�l�F��(�ᤲu��3}���W�������K=�b�o�$�����"t�v�Y}�|�8��|�X{^5��=��S�m��9�4��p��cH���{�R�?P�"6AG^����E
�eUY6��%Ȓ��
^D�Ef7���d��i�P�����[`��3ښ�
�?�:Nu�I.�՚-�����
��,�^������r��k
+
�[m�7z�r����*���z�D��w?�����FL
+��������b�#��+dwe��C�ۑ
+6�s��-_:OZ�D���R�73�ǃ
�kH�
$���ܜmX��r|��PF9ǥ'F�}����|W�F�
0��@Y���E�I�Q�8���$�Ӛ���{�d��J ��p>��s^ZDÃ��Wwv�h�7SOe|�����E;���x� i=�}/6c����?Z���
���p�=X���%B`��m@���e.W���fU����L���Z��
�K�y�����X�a6��)��N�*��q[b�ޓ���XV}
կ�;a/���j�gW�6[��S�2�'���O��
B/�v���ao��o����ė�� �e���{�r�7b)����\ĭ�u�����+����2GyeGٚlU�|ʵ�Ad�q�~����b���(��
��2���g�l��
+�o���;l�����S8��ij��Cu>�@U�|�Kf�j���b���>ЇՐ��S
z�H��sB�l{��X3���9@~&��6��
4�6�`����w�&�[9��
\�Ԇ��r�
�omW�U%Iz���=ĕ�����X�M�
X:�%Em�k�lC�ʠ0A��F�����o+

k��`_�7v����և����#�o����潶�07km�
w�\��cHw}��׵���O�9Ym
���<�d�?P�P񪡴�7H?X4�������k��3n��sD���s籴�l,Oӗ�_��j_
+�-�YX��뼀��ϐ�l\m�}��
L�A`�X�)6\�z�
=bQ~�ö�'i!��PH6 `X]U����T7��j��
+�����<쿅<V��&ؑ[n�Y�.�r
����Xs�j�
+Gڠž�$����}+�c �gI���ݗ*���
H�
+�򆚶nЄ��&���:�م�UQ5hN<���o�Զ���K�x��]Y*�^����z@�
4�U�k�����U�N&4�[���y���z�r}i~c��Q]4v:0���Zw|l��jEW���x�D<���,�;����խ��h��׹��
��&~��Ԑ�[�)�(�V#�
�R�r-�8f�
{l�!��=�v�� u��
��S��w��%����0g���zL�U�(S�F�V?��2 (wOf΋��'�uƔ�_n��-^�?��I:
���X=��&�F�ߺx�H)yWD��s��ܿ�h4s��}
@#3�%NLN�V���u��
+a���xS�N��E���j�<�ӏĽa��2��Ic����1
�bo�#���
֘���4�C����9�L�v�ީ�ڕ�p1����F��D_�Oό�{j
+� ��mRN,�T���Bo����}d��f�x
+��N�=�TN��F}/��\On{��o�L�y��xM��#�*�otA�w�!��yH��aW~z
�Xw
?ͧJn�=S�{H
u��2�z��S��)�_������łݔ��)Ko��>/%�/!г3�#��t0
�T�f%�d��\� u�	�S�?YG������[2�Z+O�0ԫ�~ȷp����7��tO�߸,�5�e
�B��lP�3P5�
���^Vl�~y�9��{�c&��"�Y���PG[2�]��;
7o��
��m���N���Z�m�+�Ϣ�Z=��7�ڷ�\�bt�!jTx�����sl��6��D���:oآc�������av̡�*�
u�z������ƌ��@�{�77J�!��<����ό���pm�\qc�F
{a=NT��o8�
+҃��~z/�E�י��k`ʕ\�R���t�
+�Rz�7�(
�����qڇ�s%Ζ�具���l �����s��4�
c'F	��´��
����Ӫn��[�{6x��V�]���n�6_����A.�T����~�ma��92^9����ta#n�ЫXP_�NM2�3�-���<w_r�Ҫ�\�[�� %ǟ
_D����rUg?�7E�t��lo:ߕi��.6U{喙'���aùju)�pt������i!~@������B�ꪷ���j��i��(���DL'����ž0�1���A���!
+TȢ��A���?j������13�H^���6G�O�5�,5���Q
��+���'u�Ul���
���ҹ���ù�RB�ٹ
�]�����o�r�1���m�vX�q*�c�A�%o,P[�5����v���y�����~�ә��p�6�y�ox��CNߢ,h8_��U��H�����j��x��
+ U�4���P��:���Jl��8~����s��Sr�@
�,��9�~ޫ�uBv��잽�V
_�yu���u$
5�ݝs����-#a�R�з �n��/��kU瞠ȥn��|��
h��
"��g1q���U�����\1������
�c?)˧���K�g�0g��<���1�Z+�n����-܅�pjK l)}��T����[[�?��'���\�;��>KMWŊګgv����zF"��U��%UD�
���.�����/{F�Q�:MtM�<�ٝL��S҃3lqoh���Y�W��Q�����)فv3�ϑ�1��#`l@����8f��,���Ѯ
2�� �7�i�
{f�V�1X���[Gi0}���,�sC<Ms��q�{���>+��K�5���l�r4ѿ
���EX��0�mP\�/���q�w�{�gl����/e�r���d���R�#��
+�%�B�2�*Lg{e_�_�r�c}��1j��Tql�,����4�1=V�ݤ_K�X�j���aY��6�`pc�Y����!�-<���)�)�"q�9
0j�k� Q�"�w��wdl{�pmhW��l�����2��q�����q�*�� �䳴(���� ����H���P
��x��f��E�NW��k�U��Hz����D.�d��4��=�'u�U�b�W����Ҙ�鉧PE�lT��T����-f�=*��;��b���?�v�%c�"�s�Gc
����n�0+����
�KSHG�
��R������
`{GR?�o�Sq��V�T_
\�!�i�
���vU��5iO���8xm�_}�]90o�)��Ct���h2�R����iw
�!���
+m�u�f
+�
�
����V_p��]4�m��k�@�Ec%�
��EWX�y|�H^_�Ō;;�Q�q�����
�p�d��%�gN`N�1�c�7�C��I��FA�Z�U��C��@}�k�<���y����0z�~�y^e���}2�
�&A�z�^Kg�!)h�mΠpx�^&�י��*y����睘�7)�%*��\Kw�<=���*�*����G��m�r%gu
�ND2��;(O����wq��j�6Ѫ��J���^Q�{�3��+��>����
+UNV�o�SCZ
�����N���?�P	M�~�o@�
�/-�	�
+xڲ��
6�ՙ3��ù*�_�T�v���y-��8����di��vaO
+䱙#�b��HC)��K4X�NR�A��!�Z��]�\���6�x���_�+{����ʹ��q���p����W����Q��a�����
,{*{�	s�
^+�~�V�3kb�/���=��VL�e�;,N�C�|���_ɊÂ�R�
-u΁�wb���x�-8���9���\�}9��'הi�C�j:=�
��ޮ�N�ړ^����O���%�g��6
*"�#?����ϓ5���p�n܎�c�6)��
�L��m�-YlܩT�q��+������X��S��<Ĉ�i�9�,��A��2��@��
,r
�cTQ%�!�? �Dc�MP��6�ܐ�?���4�cz��8QzӾ�j�
�G�(�����T	�"n�$g��&�����}6���#
*kE�V�`�籴�+����"�|7`Y7��&�O
(>���Jv?3�������P�u%=år���N���}�ln�j%یTΛ��KrJ�x�,j������ځI�����wUP��t�����rY7VS��+�VU�z9W�>��4�y���]���YD�[}Ƅ��,��h���a|��J^�+B��W�Y�&�*���kHy�l><?�f�T���
kc�ڑ{�s�1׊
n�@��(��*�ҿ�k�:�۳;J�{��Vg��M�(I�
+�����q�@�|�|��7��y��d��u�{ݽ�K��FR���g�zs2�D)ǎ6R�

V�f��v�?ɟ��7��O28��6���K��2DZ�j�X��]�SGV��sqL���t�*�
��|ǂ�^+�D\������P`�\r�>V�����6�g��ZD���x;���Y�5J�2��k>N?"ӿM�Qc�,�
�z	"w�\�1Bxc at RB�<k
+:�,�ǻ!	��|���\��~
���OeW���eކ[Sy;����L��V��k�4:�g� v��
Za��Z�JW{�d
�H��R��Do���2Sﯴ�[�����6�J���|l��'D��"=]
ZZ0�-y��a�k���V�I�֏ ���m��-�M=�]\�y/ɗ�1�EU�*	rI��6
+Ǚ��g��ұ�
�V17�v����߆t��b���I
��E��n'���mH�{���\��@�
����n2��~�s���j�����˳�w�M����.�຿���G��t`f\�l�l�Z
@ʆ��� +���a�n�
�'���7
��>�%�ӫ����<��� �
�rC�
���u7)�j��Z�Z��ʽAv����
���G�z;���/���sB��_0z]�wNpc���xZ}8�`j!�X}	q�E��(R�+ܜV'����w=9����
G����Z��<��p�GyW�?��4><@��?��Q�Dz܆~��4���`ߚ�U��׵KAi
^*��/oa�Ȃ�A�fd+&�M��	����W �_9���u���bu�I�����B�]�mM���e?DX+��N�����/��
��#n�To{�����"�)P��LïLRs0�������&�2�?dd|Q�'��^�j@�
����Ͽ~�~� @Y��,��.����J�!t�PiHP�.�J���,�r
+�M5L<�F��G�,΅���k�@,0%�7�PnY�bT)7
�=D[�M�ټ5��6;��Xɝް5�&�c�N���-P�n���?�w*�0����Z��Vɥh7��"�������ȧ�����?���h�hM:���x�����}�	�u<�'nH�eڕ���,[h���Y e����|S
Ȃ�5%N�)}d����X�����*�Bf�n'�)����o�u� �\�
o��0<��\�"p�Q�:���
+N;a�
�*Lݍ
endstream
endobj
122 0 obj
<</Length 65536>>stream
+&�S�
_���XLw<��?��x7*
{��
^�:2��aZ�Z�4�t���,��QQ�Һ�����3%�M��2;ӆ[w1�l>j���;U�$��*�5V��-Y
 x�n_:��f/
6��D�wO�ޖ�w

�vS���{�Y؟"`wPu=:����
�k:!,���RT8�	s�f�a׍��鳫l����.�
q��˝����� �o[������Q�W�g}_#r������bi�{lsM��*�yNm�S�O�	����v�L�x(�;ְ� gt�
�u�\���^j���ݞ�]�s���\͹ƶ�l��d�BJ��C&&�K��
+��;���3��V���֙w�m{���xl[�p�*�l�R����[��Y���K�4�'�-��h��oI�B�@=E��cy>�Ⴥ�-	������::�
�8{.=s��B�]R�E�����<���d����XP�����x�����!򡠭�X�?/�@�eFr}��N%���&�Zzc<̡�p�Sc;��qΩ�
]���x�gz�oJ��:��nl���a��{�hQ��lD�koc
��*�����Uq5 ����R�gCK�z�:�=F�
+�|=�_�P���3&��6��珉�5��V<oO��P�Y��j�<��|/2��
d�%���?�r�Af+�3B׍m;]o��1�l������rmg
Lo��&��!�����p<Vn���\�3�[
��@/\
�^km_�:~�G���.�~�}�5�g��k��
j/�8�>�9�����
�Z��W��.���꿄&��n;���rL��i��c���
+gL��Z���O\���>"Q�A��R�RZE��Yu���d�?#MtF�W���
�P]�[�;lK��p{�
����	?Q�c��V�~O�FY��)!,|��
�
U��^�:����D��c�n��}�f�
Mp�a���ZO4Vqш+Ov�
7�;�?
� n4DHOR��� ��S�����<�
�|�
�#�Y;:�6�5媐z),W�	<�}�<2�KU0�MZ�Zv�Y�zL��@?:P���T�^.�;���<{f�@~pq������kH�����KK���n
c�!�I�H��N����
B�
����@���}����|�y��t�Yŗ����4؇9Z
+3�2�����P��yPq�E
f�� 7�+h��,��Z�&=\���dG|�ד���;[�
��6y���):\
+2s����	�2�tr���l�M�R�6��Y�}]iG~\
ns
XtG���}��F�*�K��>�Ì~^�����A�5�K�jV�d
@�O���0,,�ͩ(O�P�S��CC��.u��Q��GYʷK��vÊ��j���խ]>֤��S�rX[0�h�ocq�afk��8/!N��4k�	ݜ�z:J�΃?z��m��H�]%���D 
��
{�Vl5q�`�N

.���Iu��u��
%|��M�X#׎��i�J�4��w�Bw����+���Z� ����LVP�Lb��@�
g�w������K�7�>�ŕQ�d`A��[O�bq"���N>i�]�����K
�ǻ�狶�_��]�zK����P#0�QO3'�m�g�j
���V
q� �Qr�fq�������̣��㝿$���3��$���2
7�x�����u0��q gx�D<+Y���@��������H#����Nj�Z��:k`�y�Z�cy='eZ�&su�L%�W�����l1Ӎ���E]���������+
/W�g
8Gi
g���V�e��[eit�vVġ [...]
�Q7���X*N)^eN�~]O��
�Xk����)��ui�,!��m\_�O��a�Ф��Q&��p��޸=�g�^��}��l�ٙ��.>��~f���t�F�ѫ
��]��,�'� w{����_Ш>#�w3��W�W#���{�'��";�Ni~i��_c�Th������K
N��V_N�� }{t�Iy���
���t�W��
��~��a��
��z����x�����jR/�W`�
�m6����
��K���0�a�v�vV{�_zy}��LJ�j���%
+�>^-f��
ӽ�O_a�ԏ��!�i>E�kk������g#P;�^
y���t��C���
�!��i�t����Rؐ��If/����)�
�v��}���w��Y�ݞ�;3G��0�
VZ����j>���T�� ���t6_���
+}4i}Ʋ`N�������%��	Y����2��ӭU��ռ�;��<��}�
�5�6���^�u�����>��A�n�5Q~Z
�
�a;>�{[�&7uO��z�.��vIc|ݺ�ζ���ݪ��XK��#���͑C�z=��V`A�ZI�%� �6�m�h�۵}�!�Kn�d��Jζ>>��5���R��
���U#����>�k��c������z7�
�w�PUr�r��i�;��`r��ޢ�O/'R%��֗�
�as|O
+�9!;zR����u4MaK�� E�Ū=���2'I,<�*��^єN8y����4�ks/ �I��&��u7RX;I�2�1~o�6	����s4
��VU�{qI
��Ջ«��i٦�.��(j�&f���ȴ������!��)�4��d�	o��t�0l#>�O�(KӱG�	�-
.��7lj[��M�bЖQ8���T�朏��K�6Q��Vs�X�u�Σ�g�������Y���בs�`
��g�_&�Jhe�y���yN��׻���W�����x��~�k��<3Y!]�n���
�
G6yv�c�`y����Һ�%F���c�C�Ýl5e�t��� ��"H��3n��pa����L���v(�_m�
?ptH�����
0HbQ�[��;	

�ks�@�DRD�
�>a�[wǖ�\M��v�����<���SsgYi�����j����EU��
Pڳf���
�R�kn'��"���,�:���?ָ�( �.}�
+����t+��N��nFf�4G>Zș��42���
�kӶu��$cR�0����?k�#�\K��{�â�6����
.�ib-
9C��2��S�m���;þq��U,����5(��ͭ����•��Z7����l��"�� �
�z��<�tKt0��uݚ���˗$"�aߪ���O�p�
�Yu�I��>x��A��@���z�e��VӢDn����-�ǭ�T3U#����k���V���,��;1�=ς��{8�p���̆)�ڝ^��^���ށ|�Vp�b&
;'��^�`ߡ�B���qDxi{��|{�/���Œ�m$���@�[D
���
bW�%�|�[0�KNRK�d89��}6Zx"aC�e�\y�c.xh�Z

𝋐��y��y��M�k�� ����:�����{Y�J��{'`+�k����"ʣVj�i
+ث�h�%)�k��ew�P�K����į������WX,�:]��!Z�n��U��g=��l�*��ublZ�5&d��rɴ0�
o��uW|�Z2b��m]���)YH�a����q7���
���W&�Ť�g�5��|�
��
+x:������vQF�d��Ge
+:m*z�;��
�n�椘��e�A�l�>	[3�u)y
+rp�@�ל��e�/jB�����{ZK�Xe��5-�>�g��º��N�|񹇣�%1o���Q�d�kVP�6`e�c��0�$�B٬Tk�$��ɨ3]��c	`Q�L
l's���y�*
o
cr��5n�=��b=S�'�}u��4��Fnɘ�㚄�BxF�r{�{"���iJ�M�
x��LP��,w��q���:�X�$��C�S��
U���z@��Ӆ���|p�r��@u'/�������]m�o���Ϸ�D��|��=�	,o2��pL$p���_yc '=
$�0����x�r�}o6V����~�8f?̰p��u�3����UK|6�h�t|�y��A0����0tY�����h�~�hS�>Q
O,�#�
c�>�
�� ���
��<����w�9���R�
�g��jc{��x{�9P3Q�����
+�S2���t�S�ꗊ
�cӥ�����2�c����:6aס�4-��=�O)��|3W���d� ���)�)� �
m�~{ �x���0�y�����Y�t�R���6�b�\u�\��
5���,A�#k�Dl7��j��#���+ML�;ê�$g�wV)7i��MT��z��/��Ri*�N��A <L�D��\��ȡ�
��Xn{P
+n�XL�w���t
��C����6�p�n�'�sl���C�3̕&+ge��4�׭
������~��5��9�O��6>�5��� ��$t��
�;��Q��@$�%V��
wXڈ���-��g�)eYl���yK;�u%�އb�Дo/�`ȥO�;��)�l`Ԏ2�l�g��G˟D�� ��
��8��#`�� �{�W
�s��/�$��aW��K��m�k��0�/�\����.���M�dգl=�HQr+j��
S%�����.5t���^�Mm����,���A�{�9¢��1���?��F���`Ab����o{.��^��V������K��c��8�v(��aٯB���Z�.E�ժ�1�s�x'q��dG�h���8�����a|��n��׉G�� �k��P��Ǣs
�t�XX4�����Ѕ'P
1��26>c͓_fZ��#�]�(�Q͂~���(��{�2A��	lޮ�n�ٹ~Q����x���ҩm�,���y~頍|�� ʁ��v���>U>��c��(6 ��@SoEK��o��#���S8{�@�i;ԯ?�0P��wu��[��s$�/��#�
��(`�#�]��k��?�`�bcc�B��SECI�<���Z
�A}��ya:	��Ĭã�%�0j*Nͽ_=��^�O�S��vr�e[�<��iQo:Í�(�u�z��b�5hjP_z��'�/oF����Ϗ:lu&��ؘ��n'-'�ijy7��K�d
��̦9Olb ���5��S�ܣ��xPd��v}����=��ƌr���U
�e)�]_��d=���ͧ�/����3le���j�<��r�N���~�~ǃ�h1�m/+��o��D��b����U

x $�y����O�{Z��H�d,�\r�9�M[�m\�6����RIkz������	x�{3�3�Av<GFR
����m���tר����5���2mt��6����ধ��k;�dꈱ�^��t�K�	��AIڿ�.��X?w�u��V�t`�q~`w���݊��xX-"�.m���9����
���
Ͻ����:h�
�r{���/����$�y
W�"ogZ�l�
�@,tڍ�i�}�S���T�l]v�̗�x
cYmd�u�Sh}���<�	ު)&�+�
��:Ѕ;'k͜'�q(��F
`���h��J�^����S�(,>_�za�k�I���m2=�c�:#;��t�$^���t.�G�ZMw��֯'�.�
b5×�)�D����%x�11�L*p��j����ഊgh� &�v��D����<�$�{�����p�C�?N��9�0��jj���׽����W</ o��9냇�u�F�5?
�cƚ}�ۨ�:8iz [�!�x���dU�=PA&v��D�[� ���ј;�}9XF��B���{��b�Ҟ����Ń>�:��c����W�(g��3��a
�
m&e&��+�,��jl#ƻ1�O�Fp��W7�٣�
+ۗED��K�Ռ���4O���mຟ3��^�*ֻ�ʼ�ͷ��+��-�B9��\&,�Ee����@
_+
���mn��&0f�Ucӧ����ܗî�{�;���L{����(W�
~��f�����	b��E�F�EA#�^���V)h:e����z��[DF�}A�<���,8��t���P4 ����ls:�g,��D.�-�R�#�����>V*Ȯ��d��m
h��ަy����
CD�k�V��"⌍�œz�㖹��Uq�!��[i՛͸�-� ���܄Q��z�!g��x1I�!-lQe��}�+���U+�M�V��E���S��*�t���չ"��p�w9"���~�#�F��hWQj~!<�a\��<�Q�w�/��T���}����p���uBWx��
v�
KݾW0�k_f�S��f�v
� }t�j���:R
�r�j�h��
��=
���
����q��ѹS,��r��5Yiݸ�u�1�Wt�&�����X�
9��`O��ͲkfL-4�V���熓R�+����6'P{���������dW7�q^/j�s��}�z�t]����Ӝ��m��y4��f��d�W���Sx^Xo��`�4�(��?�ϫv�W�����+%�YW�p�o��v�Ǩ��R�Q�HK>�

$tk
'��\j8��N��
��(P���l�G
���
+��s���WC͋c��o�}��
V�޲�P���_��
^$�IESH]��t������P滥���ҹ�/ɡي��e�q
Q�Z݌Wn�+�v���o0�
�vw:�J]sY7�����b�uԱx���Wu��xkT�����@[��+x�0�Q	E:�n��{��~s�=!p&u.&��u��J���Λ\
J�K	�k�W7��LjB~ڔ��*�}&��
J��b`fe�&kt�$q���`��_��2]^c�/�$g��!���;���l�>�s-
e�#��
֔s�OGY�d�w�����h?Sx��ʧ1j�5�6
��D��ްv8�W&-,>ʶ"�ڊ�	�em#5Z�m�=���"��Z�q����V�X�����`'iM$wIZ���4�[%�P�vꚳs_�f�:��wYՄ��7c��1�Џ�ײ��_�k}�
����;�����;�]m`��_��#[������:�ˑ}����	�w�oX
�G�noG���֍����Aق��X
ij]�>;�h��SS�2o9�����vW��6�����m�����Yp[.T0~N��hRAn�#���I0�V[g��
+Uv�����ӗ�IU其�P�;������
�zE6+�5�>�wz,.���.��He��g���e�=�N�z���]߷_e��i�
��}�]5�
)2�IQ_;O�@;j���޼
�ھ�
��:N%���l��������Y��GX{�����Z�:����:ص�����)>KS��s-iH�Oas��l�1G���
�K�î�{�;Ǩ� "��q�>�{��Lb�0
�2*2C���t�x�j��nrz]t�l6��P۰z�˃�9�Th�A��FYLc�j�eS�Ӫgg��Ǽ���1��򢕙^�M_#����'vZ@��5�K*����f(%M�o�cԅ�F����~7���W;�^�ZM~v�����N�ۍ��}
���@-���*�!no�ł���KT
-`
߲��R�m�����i}
+�E=�*:���%�4�`ە�g��O�ʙw�Pq�Wv�|���lg���hl8��]9W����JW����>��d�k�9y�$�
5O{B���/�ؗ����V飊:��_�&
DZ�u�34Xm�_>H����I��PR�
���׷Y
s�
����e�
8�h��2.�er%,'-��*al���j�U<n���̥��Q�`�T��-(�w�\�+'X{�M�}��ҭ�c���� w5�����UO�u��f��r�,��� �N�j��M�f�Ю���/-�/*�h��m���Y�M��Co�����`�Z�e[yLl�Ϯ<�/�V�9�(���[��g�(��\*����~�ž�ڨ�^f�}vjN���U7d_�_A��>�5�q���~�
+k<&?5=<CW8-Eg��>�f��l׿o��
+֪]d��/��ڜSMeQ}�R� �c�8*���w�H�*z��K���f�j�Ǔ�UN���H�P�䙛&f�C��#(�
��ڳ���я��W����/��=�
^H-8v�� ��W2s���'b��/�������{�闚ʑ�Wgg�6���-���d�p�[ڠb�?�I�������A�M	��&�e�Ft�;���
c|�X ��y�[���-��c�\�9B�\�w
۹:҈��n�uV��nV�2j߭�I�W�0p�v��>��ָ��D��2��v#�,��7��G�!�D~�M�S�����Ӄ�sp\�"��0���e�>��dwX��50s9�r��K4�^0h��זּ
[�v�S�c��{�ω�H+�J~��p���1>2����x�ҙAg.>����Q�Q![�'+�ԡ�,9thN�>�+EMy
���
+�br�K������n��_�S�(Na�<���"�ܭ�ZuU"$f3PC�y7T��v�.���h�in�
��^�8N��r���`��8++���˨�оr�1������絖6��N�R�
��ͪ5K۝8˘Q�q���ͳ\U�xz�ߡ��\~�Q�g��l�aP�LE�K���A��'
����Q�����P��,^��՘[c��e��*I�a���:�"=�I��t�~�@��.���o��f0��&܄?���
O��Iy��:�S,��ݮ볠r�D|��P���5w�w�W/��#�NF��b���1�
�>!�
7�d����t��1�VX|��)�����[G5KP��#���ڜ�T^'^=ksϩl)
+��0`�]�U ]J�P',v0}����(|ݼ�
͊=���1�R.�]�J�[3�W�3:�W��
*�|^:�i��
65��E
8��%L�u[2b�|���
�����֞ﷆ
���i�E�އAj��
+��4ͅ7���
��st	�����[�,���m�FS����wS�B�m
��
:5�N{���5��t[]�OԨ/����
��8`�ߣ�g`����1c�
��
?;Ҏ���H,�/�ݗQm��E3�L
�M�������q�;WJ�t�o?��@�c�;���͓^Svw
;����U`@+��Ϟ��wF�)^��%�cs9
��X�[]�J�VY���fͭ�l�mp�#
���3������2�k�(��O�a�
p~/z���;;���S'f���rk�	94�t��NZݻ�bխ�a5$��;�f��/[�L���hu�V��*[Yoc�\'�~����chF�ah��کd�xԭB`;���`-�#�Y�xM�Q������0��
�M�W)�T�<kٵ֥���8T߆� ���1(���k��6i;�:����_���q]�u����rY��?�#b���D֩vj"�G��;��ڷ����k�5aX?�r��`�|*K�g�v�I(

Fu
t�f�ev/�{��v��_
�@i�͢5奏kJF�Y�?�Cc�e�Vř,�
�?y�
���͐[�pQY+W�t�/~
�@r��v��z���AX��g��
N^Ε��|�jʞ��
lQWpMԆ
�������Q�+ы�+��E
��V�_�l3E���j��w�96��P� �5����
���p�]�p�`���ÍFgw��æb�
�Gb�1�ي�b� ��uE��~�&�t�����Ҿc��rױ�T�N���h�*�yf��^ӷ��x����[��C
�\�VS���;���N��yc�N���l����f�w/6��ó��9A����zķ�_-�I~�kP(�]�������������*J�
œ��T�ލ�o:e��
+
ml��Y���!jX�+ܳ`^n�3{���w��!-5�TW���#.��(pS廏3��,�7x}���FN����0(��
cސ�{����t,Kti_�m)�"N7O\J�YL1Ј��)�_�\qD�C_%]�.d�_;j9�5�ɪ�,_�6���}�Tj�NW���b崨$�7¨A
�qS����
�2��~S�W�=�9�����@\�3x:��f���T��D������Z�@�om��u�BI����.���u�&����s[�����������{��v�	|I��-�:�;{��Y/}
nn��l�9��[5>wdb}䕸a�"�6�uBD�qi���F�{�=��]{
�Ы
ݰ����.7��t7m�O��33�|���?��ɾ�sy�a5��j��ctFF�o
�T6ed��z���
�J/������l#K��%6���(/!
o�f�&c���[ ���45��N�`�d���������l�X�*�Ց��5Z�Z��ٹ�
���佪
kin1��o�B�./��5KL�`^�bt��M��E�1(Fߜ�B
+�H�f��󌹏��_�^
-���'Oͧ�m�"!������
�%yw>K�
Z���
��$I�!���t�O~UN^dQ���
WG�ߩk�Z�y�-5�
�a$�B���gC��c7��@�~QE���'g�1ݍt&w�鴋Z��fǓ�}��Uc�$Yu�+�i�
��x�)�,lv�y&���R��R�V�d����b�a�_`�wOS�N��s�]U'\��:�z4��tQx�)e`T�_�������ݿ
~۲`����m�+�Ky��$n˷�n�|�I
j1
L�Q3�W�
3i~!B��&�o�4�`�Y
n$���T5a�k؏Kc2Ǟ{��+�_��ViZ�<�
M�8;��_~���%ݴ׮�
��Fu
Pu�,�UXbnpn������}<l��֋���v���`���e���\����:��Q�1
A#��9j�W�?L��ho:u�m���+�d���k�O�[��1+�c�Z�)
��}+ �XV��HL9Sb�
��$�昼�._ZuCgɾ�%+��W�[odp���l�1����0GR��)����_G���g �F���(���X�Io2���k�T�³�>)�Q�1���w�]w��je?F�)���LU
��Y2��W��?��X�nf�X�u�OUK������W����[j)���:5?䆻��ќ��`��Ib
̴�"��3Se� >j6�&�	%��J�	-jc=5C�&��௪Eǔ%�&��)i��m �B>��
��%p�ڑZ
v������~�S�ݟ
6n�-A�]�U����_�]A�2��)S�y��m�l��+�w`aFY,
��z
9�dT
�m�M����-��}]����^��Rv>}ep��Hckx��ZY�!���
+�"Z85��Q2;���&u+"��t}�eX�k��|`�U��Bs���Ȅi-�֍�0ImbŠ�"%�~PϹ��
%|�	D�g*~���䡓�� �j���<E���G��{�?���$<�����=��ի?DJ/�+(n��/)���xXG��C����M"'zX2:��TͶ?nyN*7�t�<�|��*�Di� X}a�Ll��e^S,o��_f�[�q�Zd5�N��tb����tU�+�N��R+��XUJ�����“쭆g

���[室�>U}�����n�BUɰb�_�sR/��O#�{8�UP�*R���
+`PBTU�{sP��q�o�
�S&�nvٞ�U�4]y�q�H`�����
��Z&��A2
��ÍM#�V8�ht|�A��6����TWJ��ً��WpB�(D�����{�8�
���cw�
+;��������[Y���T����,w���i��c�Ѡ��xg-y(��ɴv
j;����7AGEog��[j���lxp>�
9�-
+s:��僓2�X}H�-{J�Z�� ��{��ܭ
%R(�/���

�[u4kK��1O�Z*�θi���IMۍwI��C5p�g���M��;l�
;F����w6ҩ7�zPj����j%�!J:CI_6��h=�<e��F>��=:��?��F
+�����"�)L��N���]l�t��tƜ�A`�R����Jպj
9�I�O
@��AV���3 ��|��	�U�Sz�q�N{;��~3�x�h5�PMY^s�NN�'�+X-�.(�_ ?�qB����R��Z��~����4�_3�
���Z��+�W�k��p��?�1uѢ�f	L�_c^�+#���@I�1��#�$�9�܊�
�I�n�v���"Xi}��jg:������8��`�mMn��r�$
�s򰴍��~e�tm*er�MMy�
Ls^SXm��ߔ�����[×����Ě���s�L#��x�U�ư15BqJ;��h
UXJ^�0����Գ�Q��T���.��A-�N�|i�F_�Z�����d����FL��EW��s���ƞ�E�>�J
�W���ʹ�qş2m����6<�ǏKF
�
+a9�K�g�ɽ[��҆��u,�xe��{{6 �|���bַ�A��Z����_7�E�g���O��D{���PC����8��	�K4�`�4Y���X������wE��V����z�GT�
#O>kh̜
��=MTto�����4T8�s�+~R-�jӉ�O��1W�"'N2�ˮ*�6�R�KÏ��
���I�B��ױ��|��H]�e�
=T�����q�kD���ٷ��h�o�%��1��67�_
ܣ�F�
�>
����h42~�l��dk*�B��?����N>�g����t����E
:vXn�B.�:�7k�U7�
��v�{����[Sۋ�y�ڨ��ʐ!�j��s�[��j�&�J��l��c�T�Oe��.�bht'�
�e�y�
]w���Kɶ�H���N��aѸ�[@�7�9.�m`�+SLo�@����
��@�u>/C��q?�fv�Iu|K�
��
�����~�mhM
צ����N4����_�Ͷ5���]v�z��?�`
{��c��#�[�k=�#)_e7��ή>�E�@������[O���[��ZA=?k��d�>0�^0����{q5V{H
�|���㳦a�4����p���Y/��?(��.f�&)��Hag�7#��A�x�)��
��v����������}[˧|�d[^�
ũ�b���U�
{�[����zu�a5�<U���AoI�ٛ�I�o����f�p+�G�߬����]罥�Tv�Y��?��s7�ꑸӃw��A�Q��%;�XpG���c������=�3.�p�&���a'� ۪�F���v�ߦ�����/F
�״�!��ȁ|�/��5�
�57�~����o�kei(�f;�2�z���Htd:
]u@�0p��!f�s_�u��O	Y5]�nE�иl�}K�
���=�u���ɩ��'�.�y�[�c��:em��3_�ר�s������8��gԚNN�Ǧa
+�t� (vPr��1�l��@�X���}���]�k���]9J4��A�}r�k�P�;��
7���
7f�z
:ٻ
b.�%���Z�s��;��Fr�s�z�sf��7��Տ��m����n��%�o��
Y�u
`x�w
��0�n�xT����om$ȿ�
jy�)s�9��0�zi:A�evPF��]��k�3nݾ,���ܒ�
�BS^1��٠�	_�m.(����,����Y�鞑%Ѻ�d]S�o��O�9dn�-I}��
� ��p�
��ӎ$�N��SO�td���]-�D+�aMW�ϫW��
�#���
��q|�U�!�M��^fH��&�i�O,�@�~{Ect�?m��ih�X�eS�����#m�s�hk'���dv�t���a
+�u1���lދ4�5V �����ÝNF#g]��%��:��xn2�{�]�L�/3��y��~�
-�B�#����i4� �]�yA�t��0����:;�����1Ni���hrָ^�b��eu�F����MB�;�uǻ׎��*sߨ���.�-m9>���
����&؋���j..��
/�B;~m�HA[�]zk#!d4�N3g
�k�:�	_^V<k"�1Rk��Je4W�t�����-{Ph�
���"��*Q�������DЛ[~ 
��e�W%�y��{/_z��o-���Ѫ�Q��$O��Y�q�I� >Q8y�6^�-UI�avEy�`��6���ES����{�5�䎬�6r�j�C���
&�q�n���Hs�T�Ci��}RFѺ���8|��U{
�
t�55�ʴ
��O�UU�I��k�
+i�����Ϧr�Jz��V��d�{�"i��;YW�"~-�i~���[�P5�C�g��������b��y��q��a��Z��^��d/,8!�-�YD�gzUd�\j{᣹A4k
"��f�ψtƦ��I��8���
��mZX�d�F|�˻J�bHv�꧝���W ��H*3��
�t/Gd9j��W�i}3�\nž�
+?���U#���������^��8�;;���X#hV[
'������|��e��k-�<�N��Kd��|=���=0��ES$��[#/iK�:�:3�M�����Y�.\@.6���y(��!_���[r�.N��x���@��.�����\(
9����:@ "IK.8�=��r��QQU��T��һD?�k�$�/��Ϭb�ǍE�K��{"o��U
ʘ�4sr�e+*J����=yM?�l��E퐿mtLG)�⸭�G���%�4^bU��ė��c�^r+u��sF6�ŀ��0� �����Y�ko�v
����;�b�\t�ѯ��
+R�ԏf[�	�h������O/�#�F�S�N�
+����v
��I6(�~
H��a�Ӱ
G��
T&��Q�*U��UȺ�Ü�:���K�1}I)�q�F~p�1�
+����`q
�]/�����A���EP

��S8䎵>;�˔�O{������.��~
���{�ް;��N��@o��
}q(p��-e��Fq���r?��
+Y���w��&O��m
��ܙ���~�<#r
�$�V����00�2�p�k�o�ٔV

+�c:���c��eU��������,�C���
��XN�
{�N7�˪��T[Po3|^.����:"���
��
~�J}<y�ŀD�k�&�^�����jz��Lm�caat2X�^����
=�_������))�d�Z
�vw%����F:z��*���L��T��$u��
��ۛH�z����2��hx]n&ʛ�Ͼ�^'���+��p��
l�/���u�����*�hB;v���-���nӹ�h�V�
��}���0�����V��Й%Q#���O�\o��Q�C�,���h����6��:_��r
�����sΣ�krU�Է|��h�˨������+�%�"xeJ�;���2m��A��vU�	�+f[��OǸ9�t�T��ިb��4$o�X�)���Mo��͟,�}7#��̆��6޻���t��FxI7�Y�B�}�5IrՆ���t�iSBUߜ�b���5�<��
+���a]���Wj�U��t��˶�xͿ:>�0�����
���wRXK�͆0�X�
+T�
�[{2<�ͳ���Uj�!�<��*Ɣ�h�Y�--�)���
��Uv;x�_ɺ�f^"�5F�߃�L5�Oq��7Ҍc&
+��7
P�s\W�q�
�x��~Q�;=���r ��|CҟĪ�����
A��i��� cXe�xL�` ��MUVV�����UyhWx1EH��1Q�4��^J�u>��QG�\�/%W'_���Lk��W9U���0U�mɘ p���03��D��:@�������g~�& �hG�l�&r|N�Z��Ǽ��0�%��r~i�GL�(�q�[͒a�-���F�ţq)<���y����u��y(r^�����@�~��̣�_)x���)d�mCK���^!�)U���4�6V��
�,�4QD‚l�����4��߼�G�+�����n�O�"v��)�
��W����߁��,Բ��^bٮx�ji#���NY'�kD�C<�cw(�Ԉ��}�7�����rf
�ƭ^2�4��j�����~���
��ۜ �
�ژg�����)�g�����)��p���v�YYZOlɯ���h�\�׌�/���Յ+�k���qW�Ȱ/~~G�v�AߩyQFN
��񵇐*_T�{%�#���?%�ɴ��)�v
+[���ț*�)���|��
+�9��u}Jx����k��k��m�	j�G�lŤ��LR���YE�d9B�4WJ
+�#
�k;�w�Bj-~ϑʋ���t"�>9�x�
ܕ�Vv�U��S�ky1�bN�,Yv�?[ƟǏ�}{�\
`xJ~�����ٖ��]�3�<Z:��*�y*���f�$o��E�g�PO�*�� 
�[ø���_���&
+�=$^{��ׯ&-qG���rK��{�t�Vy�-�7i�x���TL�Pk`��alE,�F�����a�Q���Jv�U���
v�>Ԗ�/Q&Sx[�o>��"���x��o���e�1}��j�9\#	Zi���(p[NZzVd
���H�
�<��|�3'��P֚U_:�3��O����:]}Q�^zm����?(�6.��A�01s�E��@U�gĔ�
Ѝ�gHtc[Su�a���–��l���յ���ʧ'K��)j��/�7rv~F���As}/�h�W5jHjn���2�ZKZo��HG�L�7j��,%�C%Pdc�i#�t����TG�3TOw
�"��&�Xݽ�]>�����
��C�{NL�¨+�qR�
z��^����rU�M�E���~:��
�9�W
���7�g���i��j!ћ�Z��]Q���.{c��
�;d~m�`1������
$�L0������|ҁ�w�mI�{�]O���\���M�`�����w�V��b�w��G�@#\٩�/�wV�-�����6&��lXβ��߱��&PU�4'�
���4P�]d�:q������:1��:������G�b
����FD�o����?spRh�
�^�g��ǣ����a�u���V���:�4Ok�P��<
+.f#N��灂��l��v)P���
gm:����x(�2�P����;��Ue%��^ۮ��C���"5��R�'�z�m¥���*�n��@�x},��f�Л
,#��Q���r��	ru��7ke��
�zK>^E1ɹ����
��%2J�u��k��I
+�|s.Ы��8(P6����Ĉ������օV-5��V�f���/Q��O��E���3�&�0��d�:�aA�E;ҧ��7�!�<�ê�<�f`��c�|p;�S���&6�e�B�cE�ނ>�^�y�c
�:Z�l��Z���o�.���mLh�u���w-d��	��׿׎�m���P��m�B[����_
+�v��}ܵ�{uZ�ӪP
�MG��3������x��j85�+Bj</xU�w�
+u<����j�wdM�OrO
+Z�d��Kv�W~���|�
��g�T_�Ʃ�
��ʙ�������4I:���9�,��̕��4
P
�͋�H������P#�x6"�E�@�5����
+gX��J�=�c�[�-��ϱvz抿Y�Us�_O�@5j;Nf}ϵg
ʈư<
֯��_3U;�q`�M8�moriۖ4%�
6��f���Em(|�
+dℱ��]\�
�#2��Z�c�	7����e����Jߙ�3
��zvsAdҺ�u�+>�=��WS�&*� ����t
+u}�:����.TB�%V<�I��/8eK���7
�R��Ψ�<_��P�M��⿽ڕY[W'�vo�����o1��[���y7��z�
�w���aj�2y��Mۼ9N�v���Ή�.�
߃�^R��i�W̳�V-n��Ec�5v��%.p��/>-���yC���L�&�x��u�
@^�3�����(�����؄��WZ��e��QZ9�	�,�l�!�7�`�O��g����v�ތ�Aޜ��d��!����/�àuR�
+��5�2:�-�)�;���MM�4&��b\�g�K�c
�3�
+S�6Һw֊��x����ǂ����i�i��z2���0-~�R�����E�Dޛu'��qp��
#��Q'�����S,�~�R�UǷ�#Z��F���J���P�J�I�f|��X7�.N�`�����g����M�zuR���� �:/)�
�
�]L[/isS����+����'�{��M��k|�)�HnmYJB�"{X�6kp=@K{(T���;-�V��
�S1W���'��ũ��J��/��F��l�
dzp�ƙ�w�����?��u�����Z�n��$��#g�
,1;��
_T��Yo�X='��wt�a�B �����^D�Dwa����A�ՇS'؋<^��
��"W|4���
�k|�PGҗ��pץ�f؆{��48�	n)��ݶ�A̺v�q��@�Hf
K���V���k�[�_q��
4r�#м�`��$�쐕0� 4��<p�V�$�G7��3�T�ߋa�����ۭ�^q�Q���`��;|��
�������Yӓ�qt���T�`��3F
+H߂e��G����<m���>�����{���Xu|?�̷2���a����\��t?��|2��=�� ���ֿ/p$��
.�2X�53��WT��筧X�)�G'�}�
�¾�6�B�cÂ?>J�k�%�~��R��Wq�n�ܛԗ���X
�m�6eޔZ��u�csE���Bz��Ķ���G�B�`��lYвŷ�?oF�-K)�9�ɟ_��ɦ6a��
�J�m����a$ei:�U
+M
+�Yt����^�K��.(QE�m:='J����"�����6���d�a~e�o]ư���j��Q۰[*�r����j��I*�$�sBVl7C�Ϥ�S��:
{z�����Y���Rux���+�*��z����쪎�y��{/�GC�R��~�
�=,*�IE�nj�E}J
z� ׊�2�њ�������W��E)(������DٙY+Ph�������@
���5��7~�=����W��
+��T
�_�)�@��? q
?���n���
X[`�\�g�r��E���/<}cy���D?�y�|_���7�yY#}�Z�]艼�����
Z�[�&D#�شA����/�G��)�p�pj�z0�c�G��|�QC�
+��֍������&"|�l]|�Хl.Z֤7Vr��ʜN�>�
�(�D��x����Žq�H� yi���_
�d�њ���&u�/~���ʧ��[�r������H�,pצ�0㞿�TSbu<�
+*���>y�ݡ����f�U����&�
�9'6�z��
+V����9�{̺�U�a=�<�=5�N+��w�:�x�Vj�����J�/mA����<:�=�/�	�����@�tn�>�q䴧P�;�ҏ��ld6gs���n�&훍h7�u��CۆGŠ)t���3}��I��eW|�8�m���|.��.h�#Ed����A
��V6�Ѽ����x��b�4lQ��8*��Ě>dľ1W5�56{P�o��>
a�<f룄?�����XwܹM�)���qt��*�����7/Ã��
+�0Ls�������w#
n}E
�&uL��Y�֩`�~�
TF�a�5��KnI�8b�ȧS�tg'�����ܧ�"?�#-�
+t	;�;�}G\��ӛK�����3yA��l����OF_��Pr�0��>�b1�^w�Y+
�N$�e��:s�0
U������ù���UT�DĴ�B{�5�"2���c�ȓ��/{��ġi�*�QEv�kG%[���]+�mjQ7T�/���
����%�qi=�
T�.����
�p�
H��R1�R���ba$
�ƚ����is���Zi2�f��f��
+h�y��>� Oo��y
��O~ګ
���ri��%wI�2��&L����.��a�h���tL|z�Qk������	Tp'�
+�j��'��|�
+t��ΌQ�o�Qr��z�MfP0fw�m�t�馑��^�X�
���
\{U���L �6�����r
����_����[�-������BȲeH�W�#ec��;C�u���g�+�r���J]Ō�I�o��hU.᎟
{�ܓ�,N�u��[�Gg�{�׭�jM2�9'X�mM�T��׻�]kob�?jW�Nt�BL�J��`O_�M<��k1p�	�a�SD��%8�#��*��w$��%��=OV
+��T��c�n
+�W��Z��=��
+��!����$��r�9����+(���Y��n���Ŋ��G�����RL��(�j�
?jǨ�����I=�̭g�� p�T6�p�<p��Wg{����$yU<_-��� m���K]�r�i���^H����I����i�R�_vZ�4����
+VZ at 6w_S�v��*5%�O���\���OF��/����}�F��1�
��¯�)�o��� ����ơ��ȒM�A/8׳�3S�D �yWſ[欫��T>
+%}%:Y!�<��?(�M�仼��
���77���
��as�-����h�������4��6�z��$��!a�]?n2w������ÝWS�OcQb7
�O'��u(j�
p׎�5[:Ӓ���*ѵi�n�7v��r~K�����s��ȫ�6
+��@x�QNQם�$�r��R7
�`	$����?h*6N
.|1
��
㈨�P{bW����Y/�E�
]e��?
@��<�DZ�x���U^l��#i�
 �X\����Ŷ��e��I�1
+�
�{�E�0���lQ|
G�`�|�st�Y�jA
�
�Q@@�9�`�9t��~?�W/��U����rc���Rc]����BSoV���(ٮ�� �EPo�R�
V����,�u�I�d��moAϕ5��]��Ծ�2\I�9[Zq��j��{�j��W2*���;4e��#pa�\A
��ۨq�Tr{f��"�>g


�*n�H�
� ���� j�����ʠ�K$���k�a�ٜ��l�n��#�
�?���Iu�	Ur�i�1��@�Q��j�Z���)���k�nl�I��NA����P������3 ��/����q)�og����'|
+B�LS��<h��P9z�V�m*�7ף�>�%��L�B�O��_]��l|��t�@l���^&
����6`�0R"E�~Kvr�[xx��dq��Ƞ�£��A���z�ps��JB�^m�����EZ
p鋂�4����0�є�ۦj�Ⱥ
r嚬t,a��C�A
z��W�cM�6�]����
�]r}�N{&t�f
�)^��4�2ݙ[�[��t��S�U|B��xf�e�c��ZF�
�bҋ!j7��0^�{���f�F�A:I
	����pQT�J�3Cyu2O������-�[K۵��j�4����
�|����w��66���Zs=��]�$�E�������M�#��I�n�������y,�k���]�
�(

�M#����[@!����&:�,杙�$ �|�*	2
㻝d�JO��9�2m�Z�6*�e٪���_�}�-h؇}&��
��q�!��q��[�KKBe�}���v`�?�g��X�`�(�kE�h���&��D�e̸_
�0fȶ���
�u����x�]��|� �.�d�"
+�}ǃ�њYo~K�F��c�x�#�P��� \0�RI�nr4���cl\�6I��Y�;+�7�$�Rύ~�~3�$_
�TM�N�I-Gv���ӹO�G4]�0Y�܏�+G��[�s�28�
z_��#kZ�;��e���� ��@� }U4H5~�����UOG�4��&�wN8�t_wu#(��*���Fx)J�lC�T����G���˃w��v�Z`���nV,voK���֍jj��ʷ��w�g�-T��ͮ��Ϙ��&���=�n��%��9
�>���
i�
�v�}!���������	'l�����vy�l��녅�K��][[C������Ȥ
Y��8
�X�w'�B�#���վ��
��`�6*DpT����p:7n�o�n�b�%,��ދ^�*F5�q�_�<���ef�4�^��ُ^[���
�p�F�}�X5���*��B��V�����84|�i�,��۸Pp�Iske5��ه���U�n�?�~�$�o�j�1�,
ޭFx�v�U�y��R������P�H�r�.���������-��Ɯ�E�O���
2�b.�
����:\IpdUJ��'����9�tk�k���.u��C%�	�Y�sx)��v�i�$L��~�
���ER�Y4#�,���ï�Dm�<�5|�D
��ķ�9Ye
+���쨺S��-����!�w��~�Z�G&NmkW�M(k�
n�Q8v�
�9
�w�q4J���i��`I0N^��6�s�k��'P�� s�^d���/pw�-��;^�2^�@
+ޯW����
�5d���OLφ{��8MZN�7���︱.����¸�R\���.5��)=�:�j.:����o�r�:D)�:.A�[�3����G�2�_\�c�\wl}-�*��4�+�B�$K���٩��T^d�]��^#��[�sGT;����R�J)��/݁q5�pXOo�S��OHӉ�L�����['f_�{[�[��
X�f��>�sI��
�z�䤙LA�
h��B�kT�}l{q8��[�
��8��r��;�r��b��`��%�0=r�њ3y
�������5����-��uT�>�A��X=,���p��c
��R�.d��a��Ҫ�v�������70��O�{�9�z�
n�zpt{��{�n)���y��4f
�V�-ԟNy,C
���ޘ5��Ŏ���y��?�S7��PR	��
T� ���Z!2�o��t7Sz{�
��uoX [...]
+�@��M�m8�_[���]����q� W�UG7� ��^�k�"m�
q>'(ӽ�E�|'pt�j�^^@d�mD�O\ڭ�
+}0�S��}����;s��O������.��`HF{��Z���2g���gnQ�I0B�sD��?|Kص�66�z�%���
��2Q�Ѷ	�~\V��=$�dO�7#W����9T�T���t�
Y�z�-�A��<�:���~����8sz1�
U�uT��l']��㗷�U��Xф�0ޅ D��q_Ú�SF�i�.�����6�
+�k��W�{�J__*䓫�Y��D	F�U0m���jY�v?�
��c>�v`�U�<?�V�T_+��!7�۴�_��ػz�Ni�>Eѝ�e�b��F�<��]�g�F�آ[wB�p
k㘒QZ.
��q��	
+��@��������#�̏�����H�7�� ��"�Z��z:�7�xу��_�ۜ��ȹݭۢu�Z?
!�`Y����cxG
+sӳ�]�r��=���m~+Ơw�߄f��v�Dx-*LI￘��>
BQ�`��䶈�2�p�\9Y���m3-gi�o������	��X�Us�ٚn�0�d�?,�rB�>ܽA�
To�#L-w߲����C�&���Ф��aP��Q�kp��B�KAu
����tc�ү����QU�o��6�{׵�>9*��0H��2^j�)m�O٤� ���Ko��\���E����
N�W|?egLt�7����ɇ�A�h���*NZ�a�^:��7[�!x[���1���L���%�Y
Q��:4`���wC=�17�v
��Ng.|����7m�.뻧b�'_��K+
�1R``��>x�h�55H�)
Ru��We���
+����u����k=�m5�V/�q��XB��g��y�2'�kݎB�ƹqh'�~#�/kΚ<�B0
�ͷ�X��(�{
���xZ��(�[�‰���b��� >�
U6
˭��H.X3=��y9�����a
�v�iR#����/V}�YS���t�8H����?x<��/�&���
8�
���ekR��� �2��`�˲+:p�x;r=�|%��u�w}����E���G�kM؛� f�i/�ͨ(���ۙ��JuAѤ=]>\bl���9�-�{'���0��b��������v����Uf����\?�aB�v�w'o��w�Jhp���w��4���*W�
�TUl,�3�
(�ʣ�r���ߑ�|Z�.Z'rZR
;�:Z$�O�W�s�\��'Kviƹ�.K�mM)
dO��8��^u��w�
+;��߉v<Ʋ��1�ͨ�Ϩ�A
[�žss ����F9b�7����y��u�a}
��W��o�c�nj7���8�nǼ���YV������6%�G�;�I�t�έ��\ FEVn���;¬�J��֫RB����k*m��ԩv�x
��5����x[�����]�J
+ڍPq)�ggܨ{.�N�[�'GO���tfo~�Em(4&|;�.z��$P�q(��{]���/wřrB�mo��en*s���2�!��S~\�~��ڐ��GR�5C1�۠s�RZ�S�5�E�M�s�>���V�%��Cr�an��D�	
BRPxyt��9�
B�<�:5��
_�ct8mTE荃��ݞ���{ڦ���t��87�O���١�
�RE��uJ[:����u�&ñ$���":�*�
+�_���땏
��QZ��)O ���gMM�ڭ��Pq���Me-#-Wkȡ�>��]{R����
�Z��[�d<[��
+
'Xz���r6�L���۩���l�H'�WI
UTgS4�C�'e8��{�X�V�(�%JVwg_y��}�2ը���� ���㇠1ږ	](�nw�tpS���q&��9�Vg�����*
�;��a5
�$�kVr-
�kE��v]�Ʈ?�g1�'[А�6���t��u���ɝ�wF^6L@��
c���Q��:8�W �"nQ�Ur�|ej��
������H�|s
���t���N�e�i�׮{M��S����r��:(�;�m��;q���a�4Z˛��T�VZ=?~_f��I�Ӌ�
X���puK�z�i�>�oI�䷰�O��=����
̗���41��Ni%��3�׬>����}�"��Su���HxФ$'k������M>BMryi�KKN�� ?��O�؁O�OB
HU�Y�](n.w
=m
/��
��_���3��v�ų�W�ˡc�N���S7�;CU
�)��y35�ՙ�X
ALϢ>���|�O�;���>���l�%z�JN ��v��|�j���c������
]�g�͂��
+�����O
j�g��A�sUp���e���¨�����D���إ��I�F�(��9��"K��y�
�{�a��11��w�Zч����d����>��r��W�
V雮�ɑ�1��]�
,�ü�ĝ9���5��f��8�t�u
��v(��sԿ����\8�
��X�{0Mɻ��7|¨K�8�yOl�hY���JR�g*b6�D|_���ș�}�!�w`٫�S�9��"����q��H����
���L;�K �x�w����h�꓍�|�xst�&���}
��5�8�qDb�'�Z����˲�{�E��)CZ�o���c�K�
+�0�����nY1�p���wV�v�\�w:ښ�	U'��!w\+��P*Ɏ�m�5<
�e����^c�����n��<Lֶ{[iQA�_*1��+
�`�&ml^YQ
��4�-�y�R��m���G���[?�٫",:KK�
+�֛y�:�cӊp��j�zU�����VR��k�o���֖~�ml��َ�Sy���j��O�|<OC<��B�E��J_Z�Y���z��(��,Tf��G�v�c�tL�b�&e
��:/�\�
s�slU�5�Y��ȍ��:Nږ]�y�|�{��U�Z�#���#���&��c�Ɨ�
B��4{|�ݢnC
+���CcU�+.j9<��?�M
JF��S

E��7�KC��nj�v���U�i\w�io4*2�C�w3l��v�0
s'�V��ɱ�|���3��Y�[0y�1��)�U)�]G�O�c��>��p���ژ;���,�4�_X	t�u���:W���3~�����/t/MϐZ�a��v2ߛ��&ď@;t��U�i�®a-���*��ҋn��D���x�����׿�S���܈��u���em��8
+���3�DCAv
��7��<�[�ᶿ�F�6�

�9�c�

g�����
6�}��d�6
� �^����U����S	����8֩|�#h��x�v!�S(Y_�7c��?l��o�h�t�>k��I�4�0��5��2�۵t}���
һ��B�MX�
f0�F��7�b���A~��o�9������@�9�a"��j[���-~x7c�mؒ98�˹�Y5fp��\��e*�����
ekـK:67nu��DJ#d�ԍ�ڥ��3�nݷ1����H{<��
�[C�.
V�bT���i�l�kݽ6O&{W;
+Ok���|���ξ�����"�%�9X�cl�pgM��˖_f����������ۖ
дԡ�������\���f�.���1�Ϙu�����e���Q9�^��E坾��
+Z!�Zh���6�}�7��b*q�@�O�J��i����Y-ց+���T�bu���L#.Pߋ���u�/��]-�Q�������m�!u�
w�fMo��}�Ӳ0I͢#��\ ���F�`x~�{W�T�ˊ6�
�r
!��Ts� �
+D(AM�24��M柷�aמ��H����->B:�,T6�j
��F4��|��G4�����aoU5�Ϫ�S�i�V�O�M͡w�î��IS	uɫS�ew��>��ˁ��N�cS-�i:�e�#:V���1K~
+���Ϥ0�������^=u�5�.U
.������r���F4[���� 
�ks�	���CrO
5�^۰���������9ǭ�~�����j0Ѯ0#�[�Se.����]�
w�bW�^g�)j�.�����9��n��f�{�Ni��%ј����+��lv�
�e�".\��]�p0��R^�)3Nj�so�y��l"��w�|-�8�����B�����x����Y�a3l�]��Y���.!�R���攟{d4u�94�g7g��{�O/��h׈���5pvͧ.�.�GD�T�i!l�gO�E���'�t�D�O
�w�6+�oP\��
������7�TW�
��U�����wdq�x��q���J�Bx�-@���O�W���9fhh�,}�5Q�#&C�Q���,�oeÂ�ԫL�~Oy���?��}�vOYc_$�_2�1z��h�+����{B|w�r�e��
�?�Z�RG��
=�
�>3$:�c����	
q1*eFӓ��K51�?��Q�W�1��$5��}�3jt�}��53�����~g�䫚�Q�jiSX��%��_��?('��n�Ѹ��fn"v�ً��]�t�h�"/��.='
n���L�,=����	G"nۯ��z�lE1��aؓ�q7:7ioH�j[��s����_1����`2ZA�Uܫާ���B�k���+���k��V8�Vΐ�L��^�#��jm�;`j�YY�!������
++�uG�M	=�A�� ���W����c?f{�ѻn��
:����r*�gd(�1>�?h_	����=�r�}��#�w���M�Kͫ��F�$F�A���1�V�e1�������
����/ ��h[���
+/���)*
�ܥ�cj[�5��~c֛��iv7~I:,?2-��z.˥Z3~��Z�'���r5 *��b�H�6����
��iG{J1�:p���W6�PQn����*�X�����4R�u�{u�9BƁ��=�N��a����=ڋ ����UaV��
R��\Z�]y���\�b�n|{Dx^��~��}j�^�
d��[��YO1��ڄ��,fŶ�c��f�����u�i9����	��0Ǩ��Fw��
���낎�xS*-D��vg`�Q

��G�f��WD<
+
���
)���
&_����".�|�s���VpG��
�q�q�[�~4Xun��98��6�M&uGdO�_*�<�}��Ŀ���� 
y��m�O+&y�-�'���Df���N4����aߟ��;ѷ̑[ �^]C�����A����5�� ��
+��~D�g,�;<�
�j�	�!/�ċ�Y�y�0w��ǽ��7vh�k�^�O��p��׻�Y�Ja����GI��f��/�\{�^���M(ge
+O�|�3�ת�Ϧ$y*�͟k��(�`A|�a�< "�!W���Z��Er�3B�q���S��V��f�6=�2,���;)o?Z���BO���A@ Ŝ?��gƹ���V�M��!�?LdM+�<�u���KM���4kdǞgZ=
]��%99T �E�J���PJ��M��5�	J�`I�cK}f��� �ZU�
.�? �.�1�Tլ+&��#k��~ݜ���x�����i����Jk���%X��`}s=�.a����Cdz�bV�4����
+(����9��3�O����6_��}"M���[u���5p��ï}}������|pv�yo|�MLΠm�:���K��t��&����'�_��o
m��'�D:{��� �Q	~�
LI���@ѽ��tYo�M��In����=��k�z��=��k�]cŷ/!,��VxKo�l>a�l
�g�g���yo�}"{�����mf��,�=�s�Q��y�䰽��2��=k�����FU�V�
i��O5a<B��ݼ�R�G�F
+��t8t+�|�R�o�[�p��m�y�r��U>���`�B�z��X�4�a(}�
mM⹴�L�O�'��\��]���r�{0f����.�:O�d~�&��{d�6E�5�����A؆�͠l�d�K��n� u at 7Ro��_W}C���x��N��gA�Y
E��J�!��T����y��ɟ*{���vjﱣ�h|�j�on��ѝ�'h@��oȥ{��1����
<�ޤ�<(�7{X�qK��{�I����W ���G�.E�����]1�WF�t
��z�V~���
��]�:�24U ��j�̵Q���:Dh$�8�E��V�S2)���ː��z|dS$'�Ⱥ/My@߈�bϿe��{~^�d\t
���Q�3�����~�:n㴘��
W�تW����K��j׭�� |.!����(�8���aJ�Y	�K3�nTޫ���'0�~I���X
��
�)�72 
��
�-�˘y{�j��^<�ڜ|���w�},�E�m��pI�=
Gu!k�m�h�һ��ɧKC�����4Q�n�3�6�B�}�,����I��B񃋡
+��>��g��t����o�&a�f�L+�zz/���$JG}�fVi�1�����<
��<؊���C�o>~'�2
��dM� �Z��K�c{*�/�0��cn�^�+�[��-��t�>�t���
ڈ�ƍ��4\	g/g�X�,dj1�-�+ҫ[9��O�`d�M��6��1YG�ò.��
�dm���K8z"���b�
s�%����Pn�I�p�/��?Po�� J�
+uN�6e�k���ϗJb���Sس�
�Ja:ݳԙ��R2~��D�
Ŵ�=���7*!C���
$#�#G��~��3!�H~��N;bi���݂q�텢��7�:��F��MV�Z�2~�
qk�R��_A���~�8iw�I:�UZ��9��k@��6><�Μo�EåQ���x��oIi�7�[TKcЂj���Aw0
H�
+gh����ng�D�MU��ʆ} ����c���8

;|
���|���Z�5%��l9[�MVC��D��������:u;�����+��Y2]��'�!�t���s��}
;��ɛ*�o
5�
+C��]Y��(�X�EyS��D��
o>/�����$s�������9P��b*�_*}��1�U���:(	�c��h[3����f�{���3v��o�e6�H
�@��E����3WZ�YS
O���0���Ԥ=�Y`�/���u�h|��o�~>+����&U�<�'��.+�M��/���a0�hO�-E���G�a�r�͗l@����o�(�w2\���k��F����
+[&T�����U�)�^w�[�Я?�v�;���vh����̖_�"N�&�4oJ�aV5����OcO�n���w�T�š@��a�O��
�ߧ��`��;�"��ȥ
��#Z�>��%yƮ��:{͙)�o���Gn��g�
�ώ-E�:�)T*�o����H�!
+�o���5}�2�07��Q��ћ-���=3��w�2���һ�@t
)�n�,�����#��:�hD�u��SG��>eƥخ�]�v�֪�P��u
���׬L���z5�s����hݯ�ْ�Skc��:xϰ
�^6�4֊5�4���ݭ�Hù�
ѹ�l衶qn7�bȎ�7�>�~�]�\Y�V֌3	��pw����(�>�!�*�x=V/���{�wKf
�[��^��Κ8��)����!�NC�����]8]�]�rl�sJnWv�#1>t�	�o��m��N`����]tk�GA>1�1z{� 
�֬W
�Dx�]�5�G�Q�*�|7�k$i����kлt�)Ҽ���t9pXr_�F�|����Xa.
�N
�^)�m�<
��ں�T� UI�a8#���{�9���O�����`���U߱g�
&tEy��'*�}8層B>bw�\�@2NB��l�;��<���N�<^��}:�$-�#cD�&�Z�(S�IC)1�:UᲨ饍�U����E�c���)zb�뛍�>m4wǞ:��YQ"��������B�zc5掊�]������q�έ�J܈u܃
B),r-�u _���o�L�B͍�k��,�fdq
��F�%.�'\��5��I�O�5
�1��I~�歪9

IL��ƙxJr��枝�L2�o� h7�������vL�
�4��[�#���+�P�
d����������
#��A���vQ�f�kD��Hv�M�涡`����� k�\�v��,ϐx�(�_O��A��q"3�����w]�_M�����e��#o�S�� ,h1��� �ﺖ����X�<1L�]�r���k���ͼ.
�t�ޱ������.��
���t�fd�#��1�B�D���C8i�x=2���y�I�w�y���>{��̚���m�p
�{
'aZ�yf8�����?��e�)�ڷ��'K�j�l�/� ��΋�`��nD���Mg4�Sq�/�wl�eE͐,
�e�>?;o���^k��Z1ǘ3�_D����
�l���'�i�]L��G�:����O5S2�
8�}��]nYU��q��3�<j��s���)O�s䦾4㙔����ƙgM�"��]JS�u��u�׺���+]O�l
D�qE�ǻA��r32^C졁*P�5�Z,Y"l� `*���Y�ɱ-7��q�4��f1�ۙ�}�|����Nlytj{˸�M[��m����}�qܱ~�*ڛ�ac��
���
P����z6F+
E‡
���݄�B��ۆ����xg�
O;��~e���[�)��Ց��Â,:^� 
j���"�Q�K���
+9"vm�r�/p�������[�����N��Iu��Q��{�
����L�@3g���
8fPg�z�k1�Y٨t�J8��a�U�z
���R�?c�j��#��̣��`	��)<��Y���u���L�
�y��AH���UEl�B�W7�^�v}�����!�@�}6��#1^���f"�nL��M�w
s�_tW�n��1{�=���(ݪ$�
�ԋ�wܡ���[
���9���p��Xn���2~�tv��},ו��
+<c�Uiϝ5Ad��`�
a�~�?���
�!�Q�6��{���qO�gG�����v��V'�E3��N���<MVk��!u���q��穙��S�����?����E�N�����Q����[��TL��c�Mͳ��#9�c����`ڲ�v�Of쾙2*���i��n�
+#x�3������iJ����5�#���X@�Ϡn����^�B96S�Q�n�e�d�ǽ��!z�ҙ� ���
~�o׆�~��njB�$e�LHp5��max�t�"��U�����vVq�Q
��:�j㴬�J
o��7��=<i����[Ԗg�lKm%�Ot���b�C"�����foR���B�&���h�d;���[ו���-�D�F��]����_ w�?�a�x#�Yg��J��� '���
+��7��}pݱ*��O
rg?��{@��_�


_�]�|,�?�1����	{��LK�v�SA3��Ҏv#�J��/�CxޚT5�E���}w��ɧL�BV,5����^�
�'W]㦱mj�>�x� ]�M���_�tޗrI�%��%�DC�y��R(5�����C�kG<�
+�@i�K��:	�5c=�P.E
h���0
�N�P�ϋ>
�+}�� �^&C)ש!��w5�.^ǐI@����
&���o'ׄ:2R8����M5�#����ls���m���<.w��[��������S�{��e�t&v6��1�>�x�M��)�&�Qڗ�
��v?�
ƫ?�-��f��w���y߰�*��A���qEI �U{��=ZZ1�j��n��Ԣ���Zw���g��z������!P���햧[�G������z�#��>��]���rs�Ws':��݆xp~���	'�
��z怃κȜ鳯m.>�n���u�ͱT��|71��D���x��r	�W2Bz
�O��䅝����3�G�]`!��I�E߆ωQu��/�r�*?��y;�gz��ܿ�+�? �~���#�]��V���[�4��d�"V��p
+��NѾ��:�����O���
.����>��[Q)���m&���,��T<��S8�Բ5UYAuM��e�S��� ��o��',�t��)�NU�w����l�A�I�X\����o�bw��x��Wo䏩���|��w���7ܑ=ZGU,[�#��O=k��5�}�zG�e;7xZ1���z�t��nc������:U(x�K+�0H+��'R��Ʃ
�z Rh�x,Vr�VAu�3߶�y8z?�YFR�д^k�pal����a�8���
γ%�
�}��!�]v�ű����"p����n���_Q��
Bcm���gF;�lLx�n�r08E4��٪k�����@5���
�Y�‡緘=2<��Uƒ�G�$A�g'*���ɑN<=���ȁ�I��U� շ�|�?���y1K�bΙ#�<@
Kȸ�R}xh�La47���lL�x�pJC���g��PA�x(�)3��'���݋^a����3m�3��'��L�'vֿ%�iQ0��Խ+	i��l����T���$�|d��7ݠV6��v���J���ɛ*U��[���
��~+�%�3\9Cdh
��
�&w�c|^h�0��/v=�MƑ��
�&<���Fv�t-�p����x��(
�
��B]x�p�Գ�
��o��<

K3Wt�=�$5���C�y�Y��w�&���&+G��_����b�5��/�
�����
O�.���@�<
��-�\[��F}�˼�y�	�K�/���@)y8-�	�,,��k�u�*�_�?�rv����x�ls�.�����#]O.��k�Ŭ���	B��dž*'
xxU��<�O��&!�%�����UOmE[",��3
�V�};�fwL&�ӌ���ث�F����@�b,�t����FA
�y��ˆT���Iv�K:g�4~{�Сt!��Hiڽ]B�'�j���]xl^N��(ya����B��.�+k�2P
+{)�������W�`���񦮏�'��}�A�
�_9���p
}8{Lb�H����Ri?�~���5K��D4�s����� ���6/f�?�y�ߢ��P����w��Qs��XБ{����F�И�.�
o�
n���9󿇂^�Q�u6������c���Oo�7��������+�3��J�1u;��e˪�
�-�svK��8�
E��G��<��"��z=�M�#�>�)+]��>T�;
�)��`{�c�`������m﹵��m
_�ŝ
 9IE���?��?�����>��޹�\�O�F٤��Qc�%���a�����gO]@��R��
�-e
_i
+>kx����NWY�w%�QI���uܩ�/*��lݾ*8�S��1֟�g!�������Ҳ�Vg�g��O�t��g�J1�'|��3�'u����Y�\�*�O�shܳ܋���Oo��LF�N��fY��9
�Ib�r����{eB�a���
+��הYV�
S�����lZx�#{ ��
��1�}rnk�j��e�)���P���'�J煃-t�蝜�/��{1�+�ՈF��X�ׅ"ˋD�O��������3�%KN��aR�r
=��
D�g
F�f�Q���td��˛64~��d�YQ�Lgt���lLv��g�˕s�)����D�w��������&#GB��?���Yi�)��p9�B��
��Y$�ʅԆ�)�]�Nܧ�n�2
��F�T�4�$@�=>��4i�Y�?s-4��䫌���C�� �4�J��eR�Y�:
fL����I,�$��An�]�|�9�|��I�Bߥ�h�V�/�LL�v��B���n;5j��wC��+ȇ�_`XU��m�K���v���9�7Ҏ?��F��9�;u?�ƋɈ����Q7W�A�p��o!�Ua:J�!���t֑)�
��fI��nd9UVq��1y��^�U2�z�7?v����2K������g#�U~&5e?�ۨj1קK�������/�j��a �R�X��B��y���2`�����k6����1S�3�˚��'%z{���,�'뻧I��G���V�@)�3��o�9��Z��s�W
��tP��;!����3g^
�D
�fu|4G-F��{q������[��,����ܸ���0��
uyp���}:�Q��vׄ~�?��{Yc���^��#¶���S�5�n� ����(7����f��GaTdF�,��ک1��F�hd�a�<W��)|F�%����9��yO�wg��u ��*����*=���/�|�Q�y�-% �{�fײ
�����TM޺��1�
�G����r�_�߼�J��4ޮ���k��-
(������1ݒ˽k�'�
��'�������2'~2�W���{WY�Y�۸�>x�z� �4�b�����l�+������Y�Хx�\�1�8f:͖M⃫>Mc~K�:Em�<n��F���]���.��^6H|I�6��u�&7�r ������voC���_fq���D0�?����Sĸ�?A0A��{S���Dr�u�P̼�֦�gH�&Y#@C�a�k��

ҋ��dt�sZ��,�_��
r��/	��`pd�v��
)Q칒�
*���`r���?����uh
+�|�JK
Y�
^�0D�����~
+
x8�l�H�e�);:`e�
!��H�
3g�Zx�:��k�z�t���k
=m/ֵ����Q�y�g��p�|6�o�:�Z���W.
��w�qo�B�������Eh�<�Jt���ڭ�`�g��i@�V�H���օaX�Q��8ijQ�c�J$���E}٠��%�YJ��7�dE!+2�a�Q�0kL���������,@�2�9�=^����bÞ�x��5�ۚ� :�z6q�f���
[�찡žV
+EE
N��,���ΖD���
�4�%70Z�?Uh^�Ԧ�d
a�mZ�p��B1�G���#�;��|�e�_A
y�;�B�hw�+���b.W�c��q��W_M��Srw`���b�|�7یc��n���
X=��d�bR�^Yd>�
O�R�;`�d���T�H��i�#yʴ@����
�W�,_�FZg�X�i
�c
7�x
_��d�RE5~���0�����L��*mbh
8�H$	K����Ă
y���I�jE��w_X�'r,��:�<ֱX���gЗ9�����GpD,�°�u�	@ܙ��~���޿��=�&�k��N��P�< �p��
�
a2h�i*hs(�ȰW�sLTo%�{��crf�{��p^Džh\~�pG��y��Zk�I�H<�	��]��nc%��
!^��H��@�͡
w���
|(�Ƭ��F(bc
F�>V��Q��5O�0�ت'N��G	y��w_J:C��,4o���
�NA)�U^��ڽ�ݖY��
ɫ ��y�̽��T_�(u4���
W�NXzg�p,���<����~S��x@��Dl�

xK8��}#_<֥^�
"��K�c
Z�viy�f[���E��ڭ��<< U��o�L�
����xZY6NI��?��N�b��
+:+
"bg^�
+2^p�ͩ�r<
+7�R�̱c������X��P[��7��F�0�=�@N��k|88�SZf�F�[�%H��u�Ņ[(g�ɥI<�0�^U�9���\��K���ͮ_cD�֕
+�)�����I�5괊�}����"�r�T�{�����U’��ҝ\kD�=	�$1{��O=�v8֖�f��	/��7���2��ښ#�=`.Y�����Ӏ����wd �
9��Kw�#)@_@k~���)7�J�<<	�N�J�ޣTg�GpG�ўH�!��ͼ(c���z=��{^Ek�J��%s���d��Ac���ϙT���l\j
�5٠���>s�X>���5jY���عŇ�9>�rIZ�DfD��ܳ|�v�YN<x�r]�>�
�Z��{.&ȪZVy�~n�x�沝���zO�(s��2nT�}0泡��6M

��'>��S'�e���e�ɩ�*��7qa���6�Ζ7-�k���ApWs�L��S�%�
�F��
��������紥��+����i�|]��y�MS�
+�V�r�HF��77�G%Wߑx����z�j���IJ��3v����G�^��r
ȳWe�:]�$
+cGB~
���ze�e���lkh�<D�HxUU
+���`_u��n*
N���^�8�Q��7�yo̗�O6"W>
.�w-hb:������<��'�"���s�.�����!7���}
�{�au-�
�kN��C�l-

Gˑ̗��PFsk�c�ʅ����Q� �]I{9A�.�
�-��U��O�RH��I�d��f��+���2,'�)H^��ɨ
�PDM� Wg�*x��q���ψ���^y��<Z�
=��
�9i��,Y�?�0��ƒT��R卵!��HE5��uQj�nqM�g��$���i�J��G�8����(
��չm�r�nP�}n=�9;hK��-���V�>��U�/�k�S��%��[Z��'
>x��z�;j��6K7|4��~��-��e�ij�B[us��a%�)��1Bs��>)w��"F2l,�D� �u��%
4�Ô>,4�
,���Z:��o�WkB}^k��������P�}�xvF���꼷��u���4Mr�
�̧���~����™G�p�S\���|�
+�.X��*�YNw�)S�x*�V}m��1aTǣ���E�j1>�%�,Y�j\z��_��c���|��� �"�4���Re���Uo�:���}�ן��h�<�(���0��2�m:c�څ�)@�Q�f>�ew����~{�Jz:�O�c�VkƄ+
+�;f�K

՜�����	L���y�T���	�Mn-���CA��s�*o](FЛx/�{����4�n�!�����ž=�׊�^w�&��>lxH^t�+�2�ˣS�$/�؇u��|��#�]��r+�
�����S_�<EL
K

����kB��~����1�H�[�T�˛��d ��@*
i����$V�|i֘|��M-&ػ�$r$W֘�!:���L�W���2�|-��I�O��E'+��
诂6��
��0����1mO��q�n����.����sN,����]��'pLo�Y:^X
0RT��.�ȺΓ
���0�p�.=�z�Z���	���H���3��hYu�< ���r]���Ͼr��	��g7���k���f�^S��WY�l�;.^�iS8y�,�y��:�
??�S��c�(r�O�1�����1�uށ���#�;���]'���m�Q���VD:e�C}ɌЇ�<=���L�_�V����l[��n�e��IݛKc!|h�W�;#u�u�<�p��F���_�6\��F8TT�
Α�W?�$���TL�T�D��!<����t��gBr�\]f�QB�
�=Y
+F�[/m�
*[�hS��
+��Q�-�9
EM}�^uLɝ�Z��9���|
��E@��ʑR��_�y�-ְ��1�]VF�ڥF���;WA���O�yt�/`a�J|cK��p
��P�*�%�N
5���h������[���p��4���ѧ�I���Y��V��q���,�m�h��A�@݂�H� Qx@�*�/\n�+
+k-Z�
F�
�	�g��ؙ�L��-�u�/ m#�,�]6��?|M��.Mo/���5�$�Mc��P����`̼�>V���F�_��h���=��U���%�1
]��Y��9�$:|���k�~�jߨZ�~o��ջ�=7
0��b	���[��B-f�
�n�7�>�>�B�_�[����ta�_$�%N����E���xh�0���I
����Y���g!��z����z�O�W�%�э�<J����W�继�yQA��k4%��
�C=Y)��Vk�
�dy���@�"��=4:��_ȃs��J��ٶ�NN:��w�WGUFӆdl�C�9m�ZZ�.S�^D�I�𮪵�^$T����gSP�Uk�XI�+�v�T�y�3Dr�N ����p.
̈́q�j���)9H���ιC�x���YPh񠷧��@�(����J�N���(<�b����Fy��
��ޘQV�`��%��KY����bZ��e��O�}�l`�/��~:�W��c�&��%���~��e��
ߦw�3$�`F��Ǖ�����Ƶ [...]
gί+Pw'm���*������u��gHZ" �"�r����y���c�^�yB �rE�#}�V�q
�Lz�@��x�+NƕO<��~��&g��<�q�v]{��O,���y���KX�;��V�*:~:&$�B�vPi�e��r]�wGFѲN������h
+�.��vi�/
�j_BP(�٬��� ۡ
���7�^a��ō�G�I�g�7��Rw� /&��k�Q
�6$ן�;4��?p��-� S;K�N��D�?�5c�	��b�y-"��ڃ���+��Fg�J"q�
p�ьE��HOj���/��+u޴ƣM�]a
� ^D��V
�[������Ԙ�V����g�x`
�V�8쇴l�T��&Ȥy宭ɚ
O�KةTk�1���ϲ>h~�;Y���TL&+3�V�w6��\�),Lw=��*7t��
Qx��7S����T�'"��u��Zã'���	6���vo�b�q�.@6���$%���	Uz�
9�Jt
ٖ���
x�%�h%�*�POG5��ʓ�yې��W�iV熯����V��9��vΧ�w�?�}N)*�Ƒ
P�j���
௘Y�,�*
'����T�
�Y�+e����Q��c��(�C�+ey�n�N�“*V
�c�����
 �������8���v�v#4���TI�����B��fׯ{ps��sJ�q?��^�ou�H�Þ��]� @�S��iG
K�G��
?�����T+r݉�K�D9�[N���\2YV��NX!c��fMR���dN��ۆ���G;,Q8���Tų�u���mP}����~C{��L��(X�=�'�y��rBG\�|^0�p�	���Q"_�ٕ{!���B�5�R�˱�k���/
x$�p�¬��4�^�[�
52X

�
5��i�3!��2���fï�qJ���a�\[����Q}�ջ
��pXz�%�:>Ƣ�Zg!=q[��kq7?gY��p&
Ÿ��N�������a{��؞���'y~fU�F��ޤ�I��4�A����yR&��<:�$ē%�A��xl��]��X��(\s>Y�����
��	�N{��Y�u"�E�B0?QnXAC��*�A��YV2+^9��Ѿ,�˾��[�1���P"��|���(	�W!

�7۸x
wbQ/��0�Ro7�6maͳشB�5�,�*�1
+
+?�bӍ11��;�7"\���S���jd�����
+f�iEY"�Xu�n�����
�Q(�
f
��[ _�����1
+����B�4Ԯ⌚Y\>|�Z�47]����, O�Q�:
�,&S%�3b7��
��<N�Ȯ�
��	�=m�B���G�lq>9�
9i%N^�PMo%\��
�
�
+y桇h�������n��yx�H%�Kwt"&<"��B���{�]
��h(�[��j�b�[�
�@\��Ws�O�>��Z
��PLV)_:=&-�B�K�-	�䘫/
+�)z������0������̠J��� "q<e/�I�
~XS�kc�7�F�5��xOz
�k�}L�(���H������m�T�U�����>yyt]���nk�I-Mha�z-�~��$�����P'�	��+�Th� ��
�
+4#�lo�y���d�>��0�7O
�,���J�p�*�1�£�G7��9!�R~YÖqr�ۡR�5gA(N+�G�\���`J;�;)+CT�
+�
�
���K�޵Z��T2��8$�oo�o�'Kb��j�	�BOf� ���Vb����&�`��-N��[lXjm�c�$��E��|o�AZ
&����G^���P�g��v����#�ҟ��:
c9�ՠ�"04+FDg�g
+�Q^��a;��S6<�%�P�
�>���>0�������>���s]D"a�8}�[�zҁ��a�	
��LC�z��= |�'"׫8͊�hM8 ����Y���N��r�*׊y
5��9��wj�{��n|6!6��~
M96&W����k�[6�sc�
�7�}$0�x��
|*I�ե|\k��
+��E��l� 4�0x����a�|ޚ�B#/������
Ӎ(�KQ����Sg�v���jա^���r�?H]�����&��*��kz`�`�0���$��Ƃc�|�k�����?s�Ե�e�X�RṠ�/�>��$�O�
�Px�PМ�T�������<I���e�n�%�ܔ*4nEl
���|�d���@lSĪ���Ӡ�̶6�׏>"��]�I�<��Y$�מ
)y���mQb6Q#�ڭ6p
+�햼���0��D��i�˽��
eء�~Si�֢�
�$l,cF�mT
J����{yRuj�iY
,5)� ٟ-���Q:��4�3k}4��~�`c��r ��cU;�L��@��ˣN?
lM��yWj,���מ�g���t�Ekd�!�
W��e�ћ�b��෴
�;��.^ٚP\���B�d��j� .��ѱ�˄o��x߷�^#�����ww�-�ı,�,
+
p����
��E]s�ںwu��P�hG�(
z�����]�R������F�6�H~`��WW!-7
IW)R�﷚�g#!la�WudQ�uq�h��
-�ېb����c>�&�m�T�;�cI��I`dk�|=
H�4j
ު�n��+�#�Gbx��󕓨�OI��>
a�4�f��WV�.�
9
mq��
��6���:m��"�|�[#�J� 5��
ơ|wl3Sk������g�v�xIW4�)��K�Gf��>
��X��VX"�'�	Yq�0���v"o�g�
��r�dQ
���⸌ە��Ӆ����A�Y��rVW�ik���Z�<8��P/��ۢYD,���X�
�
E�FpI�7�:�L����|�{\]n�kޑ[�
�C��)����W���5�UH_��Vl�V�R#vz����u�ͤ�����T��&�,�6wr�_�
R��4�*S�<?��B�\ykQ��k=��F</�V�)UzM����y�D�t�v�0�	�\����Sq/>!o.
�yy�|Z�C'�5"�
�(h�+���^m�]m*5������V����Q��y���꾜kɷN��F�b���
8G�{� ���ŖTuu��
z'
�TR��rԋ���Gҟ鴷1�1�MF�6a�uPǮx]P�D��)���iK�%��kK�ړ��"����`�u��W.��b.W+�����
��������)�ʉ/^��E	|hQ��S����;�b�B�Q�i6f\�oޛ��>K͖�cX;@Zj��6=ܹ��K«�I�

z+
Ui��Fa�~B��QVԝ�G+�T�D6D@�L7���2�6��$��o{���{
+wi�@��5��J
�E
�/�T�7g}E�xazf Y6d�5{vO_�Egu|/eҁ�CE���>u	��m���&�{��ۻ�N��>��Cm;�
iB���G��̞�;����zN�ϭ��[_��ë��=���k,,��k at n�Қߦ�
YU�nQ"�� ڋ۪�lP:��o��*��Q��vL�Vx���*V���ٍ��
u.`�8� ��oS�m>JŎ��N��w�}4�Kߦ
��JI�$�F�Q=��C�DB��@Kvȗ-q'͡
�����(���Tg��E�A���m��g*�@���LTI�V}��Nvg/Ԃ&���Mt>�?I.f3���Af��>�r�v�^�ef,%�v+i
�%G�\�
�
(�w���Q�Hܷ�O�'.�I��K>E�����W���;;��V�F�cǿۊ_�����Z1��c7�o��}��ܵѾף�x�ow�vP
�~~Von�>3=o^M.u���v�Eq�uk��)�%���݃��!�?j�Y�?A�
�e�?A�
�e�?A�O,��D������������[�/�3���W��X��n�/�7
����w
�k��_����O����
���������~�������}�{~�n���/�O��U�?���f��/�l�/�7
����f��.���fb���~���\F�~ע�:�~9%����O����n<�]��x���֛���b4���tav�rsm�_
��?oψ�;)��3{~���}�|�
�]�l��=��M|J���7ޭ޽ng�^��i	X1�My)�v�tH,��\tn���nH!���������)�W +����
6����S��֟n��&',�K��ːh��q~�s9���L�9��w��a�O��)�e�yb��1�;�k`b�lK�c�
'��LP��=�
�M���ծ~�.�C���*�d6X�.V�r
�����q���
�æ�������1v:��֝VN���
�9f�Ϥ�Y�����*��d��BS�x�����Y�X^f���_�:���ݐB�5���eU����ňOc��+��	։�+��C�Gr�j�p��x��"?����~���*��;�j3�W
�/�?�/������h>;�.�Wd�n�G�tQ�g�4�ô7���
2�Sx1�=��f6�ZGke��Y��=���8�,��/��_����B�=#�2�q~����U��5t�ޡ��`�T��������iYvJ];׽�͍�yF�୧2�X��ܰ�׹�5����.q���E�ywpJ�l�7�r�9^ d�L��������n
�H̶�W�z�%-��`�c��-
�?���??�/�B⽓B%�J[u%HK�����
��s��^q~��
;?���V��YL.�{��� +��H������,
ۺ2���/C֗�}!��$#*�z�ڭ7w�߆���|5�,/-�eO�ۦI�z��1yA?�W]
��4�3�1�z
��Ye_j�?�
�FH�c���r$=
�Oϴ dc%�[��㡸�����vE�������)W��[��֫3�j���<�U�+E^������i+_��I_�wޟ�
����|>F�3�`��T�]sZcA�<�����䀒����8$%�i@���U���_����-�޺��z���0��U���S̆�е;�zJjs7��%yeM i�ڢ��bU�BЦ:B�ou��P���&��_����2$V���(t��(-�K��8��e�
\24e¯����B�!� ��W*䛻L:�k�r�m�X�|)�0�+2���Y���OF����c�w�Ƥl3��hz���YY��K[��w�Ӟ��#�؍#3:��/�v��3��Wg:Od.�N�
E̅�o�/��!ޭJ
+��|
+V߇d9�{~�+]��E�)
 .�w�9�|E
y��@N[���7���ݗ���J���Y�r{�늰����Py|?�
N3����O�O�����2џ��o��R�'h~�Y�����c�L��+�����V���֞ٸ�{����o|����,�����V�M��d�/�7
�'}��#���A�
�������3�n>H�O�y��;�r�ߡh >F�]�v�g�ʉ��%q����m?73l�p��m����ʽ\.+�h>����槊
����˅eNB
+v��D/����eD�o0������Pv_?�
_ō�W�hkG�͈�'.�j<ָ��W����T!1����&�݆.�3M4�O��)��2�
�Fl<<l��祛�K׻�֧�%��w��b�����8���Y6�Sٶ����Ԃ�BV��i��@FT/gD���,�5�ϻ�2��6x���8��>�7�;h��~�͝��탹�6�Zp'�����nq)������Z6��ӯ��?�)x�W��h�O��{F�Q+\�h�
�
W~�	Xea�‡��/�U��z��&����������{�Cja���;���CU��=��45 �������k��6O�~2s�
ʇ��?x��
��
�=�n���N�6~��G�a9s���I;���ֆ����{F�������5��E�u�@Fԡ
+q
=���7��<���P������s���_�s��υF�O{��F�2;��jE�b���/CV�2�V��)��_�^
�~�9�i�y���a��k1\���
2u�+����z�=B�j��^病����\
���>�Y
�q�eH�������o_��?[��l��\T�5>=�r,�O���z��T�e����a�8�(z9���ݛJ��Ry4�����4!��O@֗������
ܼ�$w��+��E�*=�����s�.�,ͥ��s�m��"-�_�U8ߨ>��v��bRC�`SC*
F��ߙR2τ�g

+A=7��f����ܝD�eL�cEH�-:�XG�,i�вn/����ۍY���Yƥ�|K�tХ�t9�
+�h���=����?��̞��?!Y�-l{Ik��U���A7˓{(������A�ژ�Ṱ(ZfY
-�gW�6��q������rѤ���i��˟���eD�{fO[���-|�t|6�{@�i}S<��
cP�ٓ~7�5'����{�7�c�c�v�[*��2ة���T	�.�����%�ͦ��b'H�Wy�
�`s�~�w���z�^�]Ьָ�~
Wh
���B�u�2U
�&A��d©��&�[T�V��?Af��}�/A
+�r
+Yu*m�[���'),��K�(ZA�0���b��T��ʽ�]7.��e�Q�=IP�w5�e
�yi=�9�xmr�V�		��?lJ!�T�L�=��Eo����������z�
�%-�v�wN}lܦ:X�2��cy2~�%��Q	�4�{g����2*p����o�:�˯K*��h�=�޻��n��L^��ad��5Ӑ�s�,��]^�'Ei�W�oM!PdPh� NZY)ĝ�K�Sχ6�aם������՟��5-�oըPh��=���߉Ϛ��$iÚ`�n�\KL��r��>KA�^\7��Y��Yx|�'��3�mY`��
�SP����^}�=�=�<�l���xq���-i�9y[�j���
��
�o�;h�̸\
+i�#�':/�Δ
��yKO�)`�������
8�HڮVuq����A���<���P/R<<�2?�L�
�N&�
+'�YV�T��X��x^�Uo�&���f`o	�cxD�|<�����/������H��G�����5��4�l�F���
HY���a=)K�]m6�j��z~
����ڟ�q���}�m��M�1�A���}Ψ�:��=>	����׉��/����/�����c��N�'hf��^��O_~��?h~�Y�4���,�_T�W���f���/�O�4���^������+�ϫ����~������O�����<����y߈�Y���}72�~X�Mq�C��U��ڡ�-g���ps?��ƪ.Nn����L�����MV�k�e�����M�M4m�nj&Z9?�����z9��J��R?�ۨ�_��kz���Z��^����F�9m,/�8��;��.��]~�s�!Yr`��8̮�?�/���������sʈ����������
�Ω_g&G�i�A�L͝(��=?��׍��-������y[?��J.^��ג���\�����
~��~��5!#
+V����Q�/
��B)�\̨{�w���Y�|��;v���x�����x
;��
׵�D3���kE6ڥ��Hgۼ�
�/���?�DS���3�
0L����>�[�+���SL���"
�
�P��=O
7��|���c޶�(�t���c�Ë�a��d攏m��'�m�v����O��M����NA�
&��Έ�p���ι۬O����aU'�vR����T~n����	������r�hՈ�=�M��9F=���_�����ޙ���xψ�{�D_�_�U��ĵڭ{�bz
�o���<؁j�b����t'���p[9Z�^��~����+�Fɳ�i 7�iЬm��?�	��h�H%V
+��cw���goTbvY�/�r=#N���7F��g�]H��y�+�O���:����r~�����T���&�9_k��������+Q�4:$1�K�(�ƻ!޻(V�8Y��4�𞹛?�:Wwݜ��f�q�����r�$�1��t�)8�v굨]�v�����K��s.�ϱ������gH �����뱈^�[�a���Φ�F>���<��
]��2>��o���Fk3��
�;�ij��8�+�
+u�gn�������
��
?Q:���/7Rh��_�@y=R�S�m?�~܀�쥫��(w�����$"�Jl��i7��٭�9��z#%
5f�<�V��d�
�I��%��
�_����ψJ��u��^�Q�)�]q��sΈ�[� �lӢ�]��v~G���ە�Ʈ�^�Xƨ�8l~�)���X҈��w׾ࣷ�@
+z��4_=�\1�5M���՛��{�
��GO�L}�N�l�h,tͲm� �LY.��w�.�!<�%���ĒO��5
�z3��_�������2{2�8{�*Z�ʛ���)޾7(�_[+�
+�Ӈ4閭.��%���G�$�^�5����ӈ��~,d�S�Ҥ�9����,g
�w����<�Q�ˈ������:A�C��=�#�{�Z;�m���.��#l��fVs[ZcP�*�u���My�gUNC�֕��=
���®����o�_�����:�Ĵ���wr�8_�)�w�_�IB���f�d��v��5�C��D��GF�M-QIJUA^�V���XA*�k�Xv#A�J;9�H�w�Y쏚�R�&�അq�s>��˴�A�o��M�z2b{
{OC8oKSm
����
� uГ&ʸr�X�}�j�o�>�B}p yQ[�������͌���^�Dc�����G�<��t�
���
+$�3@�?if'�V��[S�<Ӗ'~�/��
,V�8,�|�"�K�h������o�q&�+�B��ye��(t��Hȏ�Jkl����0�/��9
GM�归/+�\t'y���%!��
+���*4�6x6��9j�Fm�d��)��S�J�?�/���@
+�׷ļ��荎W�}g?k����\C���s?U"kˤ�݈{	;	bp���6�z�N�����b�Z�2Ã��S���K@�Ө��ܘ(Q����;Z�ip�3���Z�
��)
��Q��(���.6��k�ʖ}Tt��۝�~_J!=Ʌ!��E$��T�BzU�J�~#+�0�ň}�u���>�o�{�[�*��#��&�Am��Nd��h)����4�`oǠqylSV���;d��Yc�	�jl��J��!�z�3�;\z�
R�������Y�0}oJ\��t�
1�-�
 ��!�'9+����,EoT��� ����G�P�[���L.�=�LaØt#��@��M٘Y��߰��J8���
(m
+���]��h�~>�a�Ox��0�u^�q��j�a�ٞI��
oT|_�{�1Oq;G�
�B��*���u�^�?��t]Qd[�O�C�`�}/
+"�" ���t���õs��['��ʪ[�|a~��1# f8���������:���o�K�� G���߰����]�oh&�,�
�O������z��O�4п
���,���	����K�k����������L@�r��Y�J�tz�(����?ƕb)�?��LAӲ7��N8y���s�oL
+Z
N�P1
fa��딶��ݾ|4��y��ӸBj����SR�Wӵ�o����8��[
?;$��=��T:��jٳӏ�Umv�\1�L?#��ޟ`�e������t�X�h
{q����!��G!:���8
�Z$���������� fy�����<��1
�ʪ{�ļ�C��v�Ε�'�eб�3vo�|ߤ����\����D9����r
߻�q�	����}��B���
�L>�_�gw����z4��Pk;�2�O醑8إn)/�4�w�>��.r2=?ﷳ�y���i�/OF�\r��:Z���l�K�!r>������8�
��es�
'����5���S�4]<L@��qS7t�/��c�v����N-��E.���y~6��5���z�=���!
o{�5|l5���V<oZ��.uG����
�߭?��E���S�=�?�x6}ۥg堰v:��
pG��
{�oK�N ��i�2���ET�z@����Ig�wU_�q�&�r�)��q��
�����DK`��0B��S�=	D���m�^��U�z��f|��[K�m��y|E
�&����Z�A��
1�*��M���
O�_�~�w�:����&v�դ�`J�_Ձj\�N������mp`xX�[\��5���%F��3��Z�[�G9w�w�����A;�+
�$	�uQga�P?��{��)�?C�ӷ~C\A���O���W�jo�>���w8�-��_I�(�3(��E�*ʼ���
c�ԍ=lK��V�]E�|q��)�@T
��:
���x���"�o�k?�7Q��2�q����SLݕG�
jBv�۵7��cW����vZb����w���
+[�6�#��{���O]E�fqX�e����yǮZg�o����I}����v���6�C������g�6}�/��y�жF��o�֕���"mDe)���(�f�"���/�
�Q�]8i,;��_v��O����}�W���d����	�] j����R�F�+7�#���i'�Ѳyi�6�-�ݴ��0?���ޏ8��o����Z-o�$��K�Čܓƨ�f���f�7�Z���>�����R\Kiv\3��HΕ*a������]2vv}jf���`4u�9)���un�g�Z)�,��pɼ���|l,���9�����v�����ė�M�J��9��ȱ�
߉�����b�����e��c2���
V��R�V�9ws�v��|�\��s�pZ�V�st�2W�}�i}y�k$�?}
��A�,��Ɵ[����FF$W� ,<�+B��=�¨q�n�ٺO�&?�I����+�o������'��<'j�Z/��|.LWuGy���7�����zrK5�ǵ�=9.>��{��Z�5Xh<߅ [...]
+g�=Y��A289���x:+�{��75�.��<]V
p��z�u�p@�'|�<?�k��D�'��VE�����q�H�bRyl]����ð�
+f�.+�����-�

-��#6�
�1=W���	��i��Y 8�7����߭qEQ].��[���<gR��%va6���U�5��Oi\,=y��+���ϓ\_��63��ЬtO�i��
�l�C(��TK'��
!��	0*G��kܴ���[�Ҿn<�n���L�J���=["��ͳ���F�\�
z2��T�?�.gy�B3��W���,)~�lMn�3�!�����o��E\y�@��'��)Y�v�i-2
XÇ�ٶ�[I�;~�n�YY�|~?q
�{V��3f$酏���c&CO/Ku���D�/
�>4-�
+҅���^%v�R��H@h �I��/GaA�Xg�����j
+o�ˋ��%�⹁.���Jf��z��c�B_1۝��Gu{�`�Y]�d|V"r͞�ǒ2�"��"2B+=����p*����n��K�n�	i���Q��6���&+
Q�?�4;��̩�\��R�
+����6A��D�wp1_[�J�X�,�c�My��
|����E����	�
��g��6�Ҫ��
��:�n��*�ԲŢ�<f��e>[�մv�Ie8����\�)���E�-V�᳆r�ak��	���"C����Pw0�Q��\~		�c{���F�F3;���6�rF����[���`�:;�zE
�	�'?�
+3�
�D�%���uV
ڌV�Q��@�7Z����1��0B�Fg�;������l��qYa�<�y
+���Y�YT(��ɬ>�a�������3=Dۍ ��#>ꕏ��)��LJ���5�"�-E#/~� �6�@Fw����Z����R\n?^1
��qy�@����ˌ��GD�b,^�,u�\]�:u�K��e"���ў��>P���M�~=�9⠟
O��9�
+7�z*�bhX�
����KH at _/�D��	��~C�����74��?��f�����ˁ���D�_
��f������N��AF��Y�-�CL&��� 4W
�����4ϛ͗f25�����tʉ���Ӊ���G���̀��S[��ۯ�K�},��˝	
+
u>./����@��Ʌ�cY�ĵu�6�
���)���I��Ikk���p:-ډ�x�8�P˰n�k�ƓИ���wIa�}?�����4����M@Z:��_5�NXzF]t�
��=ȑ�i�5fB8�򅱑KS8��'قt|o����4�˺q
�Mcf��Q�!�~q���g����;��?E�ӷ�2/� ܅$ 
D��+��)�P�g����-�
+���v�ekK8B�el�&�sz�������~���T��'cޚغ�k���h�5/و}�
+v�Q����u����O�L���~
+CA���t���W� ��N|;��0v\W�3V+��-��g���ɦ�
z}��z�j�ɟ݀���劙�d��꿎���*_�`h�_e��,���4z��4t�.�J0����Zk��_[c���;��be���d-Е`p�K�q9���
"R��0��Ԣ^��e[�7
�
�	�g��#��
�)c�FK��Y�������
K�@��z�
��W�O1�Gs�����Z�bx0����q��?&g(}?ŧ]��.�2�ȵ;�K��
����:~h��0���W��m�<�l�
|8��ӭ��x1�a=&��f�tz�������p���uRm��
u7.�T�l��\O�r
�-�;*
����]������^~	q����? i�c�����&xݟ�^-<
/ߺ�&	�Dg��
}�,y��^n�Ð��]��UxXe���M�N冷79�G��
+��J ��|	�
�}��O} ���<W�[6���z�����ɵ�ȭ,C�
v
���Y��
ƪ�ޜ��	��RO���w1جӐ{�'��磎̙������f#�����d>;$=|W��t���=�˵�e{^]��˫�\�3����Ȓ��չ
+�֙�<Cs1�{�+K�@0��:}yŜ�͊Q#	 ���~;��o�aj�2�B���A���̷q-�Ϧe��_J�F���Ć$n��
oq�
���tk%���D
Dr�Q�)O]�9�D�%�RCq�gy���
m�]$�ߎ/ڐ��G� �s%��b��7\�~u���R�=��Q�Ի#��c�P�5�����q����U
�)�W�#��nzK��We�_q�BR��㿚�48'ɝ�c#)qN�T�E'�Q
N&ۼ�Z�
'Y��'����m��m�
��
47��5�i�9Z��5t���1���9~�/gze����Hb�kR�
 ���q���~�N�m04+T\+�7q��;��0���
���9�b`���p��4$)~��H��y P��`��w�e�#Lz<�&�Aӛ�|�Xu��yF��旐��^�J
��/�-08�D\�:���������J9��i:N��
����BN{�Gt��p���}��쿩����Y��~�_}���>f�)�Ԫ��Sf7�
�������O�%
�N'��
��޼�d�<��l�[j㐻YME�@M��
�mt��ǭ�d �ߢ�ڙ�׃��V�p�~M�Y��5�O:K\���Z���R��dGSq������[�aB
+"9����g�hz������T>�%
GK�3-�
ީ,�F�6/�T��V�-��O���B&ݠ;&��`F�͚������]t ��|��
+�5u3����2a���q�����ʿ��4^m^<��$�AJ/��8?��c��е�}:`�4��-�x�|��L"�.F����n4��
?_*�k�Rt��_�-l�.�;uP\_���
+F�,岧+�X�� h
�4΋V���<����L����D¹2�4Z�=�l�[]"M�F�c
'��o}\���2�]��+G��x�ŗ�܌N¶�9�+��ʼn,���#�DEm��`�sgf7S�W�%�/�𩷼��_&ɡLf�]���r�0>j��8�/5pc[��:@WV��kex�F�y�^7
+���Gy|�Qő<��&��-$�a�]Ca
+��v�]s�/�g�{o;����h�
��>���0��Z<�E�$>��3	/��<6�!���OW�k^N�k#�1W��t$���*�zG*l�owIp�gS�*���zV�ꮙ�D��{U�G��X�s�S6n
+�/E}��� ���zEsOtyϼ�	�OߊkE�'GylU�M�H
+��*�O����y�[
s2ɔ�݌�SKm�Kb�	Kj�S�@�-�֖8���EX�jD
Qw9��U�sBf�
h�:�
��qmž�������p̫�1{�����g�
l�tP_Q��LH�7���P�\L�ؒ��g)K�ä��Pa�
P���a�������2
$&�گü�n��
W�
�]ir�p�PLjlZ��Āh�N�&���L@U(u�K��b��CP^~G���z��x�pv�����.�ȶM0���%�Z
W�Cm(�5��Z��H�o�^� ��/�	�p
�t�{�,ى���1�k$Q��Ύ$�-lWFޚTCv��D��
�ʑ�u<��
+X��A�}*G��uH�:bx,a1܇��->��p�q�,��~��<��}���B�F�F �6�M���[)Sǣ;s��Ȭ.��,�R��>ڜ���z����,�F�3��/g�̅V��A�?�R�/����9�?�����,�.�
��E����!�W��
��
�/��/�}��DC�J
8��(����撌:�"e�� [������5���b�%��+;Jnx[����������@�Y�h�3�zE�+�:2���̀)��%�0��cx�3 �0�A
+��k�f?�n��\��.kAv��{4� Q̥
�..�j���p�>?�挼K�����6J��_,���0�/M�;���B����â1���b���K|vmA:B at s�^H��p��D9���L\���3�
Χ�n5���y-�} [o+����C����l�p�߶��e�G�~��G��.���Q	G�w	�"���J1ot�(�J��ڌ����x����Ex��ee?�w���xN"u��ڷ�����y�ݜ
�1���c�y�{e�1w��Y�%�����lj�3i���q��܀��o	^F�Gk��n�W�Z�l{�wEݪ���1X�Ad����$k_ 1Ϥ��I�t��rW߰zz�5���W��y{<k�J���7$�?4�
��TaЕ2�����+��)�(��{ds��4��t���M
ukUz��`���DZ
D�k �Էf��=��)��/������`��c��1�
�\��e����>�J; c�œ�o ѷ<)�kW��
W\.z��q�.�V-<��]�� [...]
+H�|;�܅��ԯjq��W�gc(���B�
��D׳�
z�l�����6��|fT�,�����0 3�>y��[����2:*�]��۝���q�6@�Y�o���s�o�^	��s���g?��Ǹ�8����3�7�.�C���
ry�&a�sE�XX)��
��;�E���3u*<���rr=-�Rx�w�F,�kU����E|i~��%�CJ��� ��E\
s��z��gS�L�^�˽~�*l4�|����<<��u�����5J
��֍��<JI��{.n�'�V������[h&�y�<�	q9���&
o�E04�A\�֙�*n@:zO��B�	(�I�����jN�\�����t~���!��喙�r1��
�B��3�k������'�șdS��z���	�O���h9-~J���O}��S�8����{6{�{O��{P��3.�Tj6ޯ4O�Ŭy|¯�
b��ZI��:yv��Ϟp�	�/�1��D8]U�1Ǻ��g��p�~��\+��ȗ�=��,����Cx��>�o>�Ϧ��jW�̤]��Q�~@�m}
g�5������G�֔�
���V��:\�)�����|~�y�v5n)dO�_B\��@�~�-'��r�v@�q:��B%�
�
+�`�{n}��Jd?+�
��� :�;�F�
+��U$yv��!�]���f������z�Q��$�uz��F+F�OY�.�
	�g��mй�
+=��=��5>���P�3X^�0�M�Y?�
?h�`�ߖ�Bq#�Zq}��E
n
a���m^ȥQ�I!��L��!}��	=��,T��
��5��6<�
0���׷	�v\+m�'����a�����v�n�ylͤuR{��>�t�J
���~8���
ͱ�<�-�ܦ0�/�6
�>eh�G�
��7j�մ"=�U�.u��/!.�
:.��+�C|�Soٌk���!���k�c�{�ۉk5A�̤������gi��*�7M�j'��<Kτk�r}�:�)q
Fĩ뒼O_���=����؛��R��<!8b^��5/���p3�k�|�^�Ѳ���n�mw�
+�,)��� �k����\_s2�te�#�j�f��
�2����xo��g
���
�rx�~	q�G?w#UܸZٿ���+	t&�fH���
+y�עl��d
&d��7�2�J���V��s�}n��z
b�}&�$b�rD��+�Q�;x��1̪u�`1�Qq��<���廈��	�
+�����k'�p
���Q�
�����J8P��Vm
���-~�D��㶵ܖ����Yw���
'��F�Z��lWό�e��f���R�.��[����|	�����O�גq=������L[F��K��P��fJTxrR.{��fZ�-�7q���R�e�Lu/U�TÝ��`��5��b���Rxq��c�4T��R��:}E�J��J����ݩFe�	�e}g=��5�b�>�
+���0!�Ę��-�X8l�r#T����R�-���S��G{<37;���;6��ިs{��z?Uy^�6�A�
	��F\Y>xЕ�z߲�p���0���
Jr7�ȽFC4Q�_��.�
���|���tӘ�16QL~Mb��Ld��n<��4��&v��:�(���עO��Q+�d�7�[�.��
�����Q��%�ye#*ɽM:�"ߺo���*'U��r�
&s��tK���B[�c*|����Zc����j`�����~��_�
	h�
uҝ��.u�aϫݐ'�y��Zs����4����TA�M��w�0R�-��:_������qb�ĸ�!�ZyOQ�}�������;��	a�A;�p��+H,uv������?!�i���~�K�ů����!�7�ϝ�p�m8�
Y��r�W-	�J�be���c�~��Jw���Yٞ�G�
f`Cy#��H]� [����H�-��p5��!?�����[��K ��8n�'t�W��3��!p�,�Y�W�#bM{��O [...]
+�#�:�6g��>hg@��A�X�>U#��/��xϚ��,՟���p�K���+]} ��縞S�C��t0��^�`	��J���آB�=������I���Qr���X�~��=z�j��͚�d���e�f�����Vj����Jg���@�Y�o�K
����Y\*
��Ip
/a��m&28��m�q���-
+�b�ֶ� c�=�(#o�xr�1qiz8wK�{���ǵ͵�5w��ӝkjv0nvw]�m��~_�`��OE��	V��T��	��~C3�c�oh������K��������c9��6��
�j���_��x��Ѩ��Qn�
2�v�Ͼԣ2;ҵ�3څ�}�jKe�Z�2µ�e��*���<|~���W�����9N�.�E\B��G��K�ۉ�ť
�3����M
G�ǚ���\��ov D	�
оg��kmV�
o��9�j.�9W5)9l)�uꇜq�{M.
�ks�O�Z�6�|����'�qir��E,�W����]��ےq;|탃�9s��c?{�u��pt�5(E�S�	4
ir�Нٵ�Ȁոî
�i$
��ϝ���b��=��� r“.�
�����=��E\b�r\Z͖`h6�O��)T��
+��|3.�P�h�	��۟��V��h��i㍹3M�\hs渽�u�����5��z�t�6	���:�н��̚�@�Ҧ-�ГV��⇨�b��D=Ё����"�yZ� �:��}��X���]�&�	(ܾG�GO:]0���
���sgU��
VE�v嶶����
��9F�n��}����#��n�����H@h�Kr�_��D��%�q����8��J�=��
�G�~9|�\#/
�졸[�
�k��3�@9�����]N)V*��渝r�K��
ۼ
��~K@��R
R�.�O-m\2�U
���X��!�bqyqq�j�AM��C�
A�!&�k>��.���
�E���yJXoR'�k�
��fu&�H�[�wT1v�Q��^ת2�J`+/��]�u z��'ʟ��G���?E����R�0������i����ra�
�
�3�O�f
�Ƽ�F5�� �¦<=�Sgf�<��
���*��|������������1p�T�#ZN�����]ȟ��
+}Ώ?$�;�><]L�����;ᓭ�1)S;Y�[]gG��q
�����0��~�����׹2򛍗;�R8bqSmp�}/����#����S<8�ȷ��ۄgwW{�Ct�.��|��|�
��#�͛�⦤���c��
�i�-i at -嬱]y	7�.W�H�T�r0�V'��:���w&}�|��X�!��������T��p2O���ߟz�
+s9��J��Hh%c�����<��=n���
+g��B�+���l�۳!>�Bg
?f�u�-��),�9�On
�P���?/���fQ��[ ]���r�l<7�=�iAQ�
�V����&L�o�F_S��U�l)u�U���ߴ�tAD���p at 2`m��p���zr̕��|e� L:7���.�a�
�U�s�4Y������\���\�aAj�Ϲ���>n��z���<"�i��c�����ߛ���oC���X�̻Z^1�i�e��h黧���(����~;�S��@4� Qy���[��~m�S!$g)�c[�uym,Ϝ^�v�n�c���=>��F���<�Q��rx-ɕ�
ĮZ�²�j��9�c�.N1��|����%�]|�M�v�,��y�D�mļՉk-gzW�e at gR����Φ��S
=\�C��m-���$��k3�	��߹J>�٦7J-���e�
N@�L]n���gG�DͱFk2�M��w�r،a)���
ĕ�	4m��l�������3ZI�J�}�h/y�����k��Qk3�*=���΢u�c�^��.yu��
��i��m�g�Q�Vr�p:����<H��I�	�
��KUs�����5�R�ƣ�冡.Hύ�˾8QN�zs8n��[KS�����'/`���7���+�nռy���ӥW=��R��\�2iݐ>�>��#�����m��k~��0*�Y4r�����k�M�����`V
��`Μ��[ԣ�@���A�]]��'��oNl����h��\5s�^4ң��҃���$�tp��3~�xfR
��"������*:y1Ͻ����n�u��5�V�r� �Y����i��C�:��v��
�u�R�+~�[d���S�4uޑ=	��Kj��x?�'qmr/�d����?ŵ�M�ҩ? |���~!�B'.��&�BKL�Z����_l�o'u�a�*70]��̞.� �G3�H�d�[�}e9l�vs*��뛺��6��$�0���n���7�ʬ�6Z
C�TK
��}Ϳ���n\<>��չj�5���I��
4U�M��e�a)��[����
+-e�S��{
a������-)t=��&��t$�H�
�$G�]<�����i�z	h��lV=q�p���".��>�yI�kE�p����ەU�ږ>T��~v�5I8�h��8,Pj���
f��w���%"���qZ�
�Z�9h.�G|?�
޸R~ؽ
� ��,� V�ϐ�~���o$��#��)��)
%,�~��Iee�+�kR�
X�f�m.���{\�yY��i�\aH�.Ƨ�S�g��[`�����Q�6/�{?�E�#�V7��6^Bf�A�E�.@����)
��B'�K̹
3��j�����$zyN,��KH��F����'�!��O
2�����Y�RK��F�?T��9�D�D�q�
[�p�
�4�1�� ��K�E\��F��T`�\��u��
;���2�
����s=��[f9�6sg0ƨ�T
���`4�	
�+�6�����:=�.W��Ɯ��+�IȨ�W��7<�R�d
�����O<��O����I>R5m�p��&b�j�*,���|�H
w��2rƨG	��޹@P�2�/z
[��6ږ��QO� C�9b�;/��
��3jp���`\Ö}}�����P��ضg��7}R�wa�F���^�]e��6�z�H@��C��:�/����ʽ
�<)�0�s�/j���ɑ����)dG.�Hڤ��Z}c1���6�Y\��J}��C�{�n�r	�[U��wq|�{v�qn�
+-Epq��B�|�Ԭqq��	y�`$�]���]
�F��&�����8
���
�~�Uи���g�.��BǕ7��
+Q���o��ݩ��3��H@�
o�H�lF�1-�u�¾9�(�
0-�:�Iz7h�a[��G��� �
5
��OUk\o�L��!�t���v܍��4^'p�o۳�г�K�~�Dxa�yr"���]ą�ڏ
Q�3���k\�0��?��0p�rq��
�h8�r�zD��+}珇�M�Nj�CD:�@)
�W1��>M��s$����#i��7ڪ����ī[4��*J`
cw���
���74�?�����OD��	V��T��]
��;�*.5/n\:̀�ga�蟞 ��q�v�'	Nf+$���	D9�
��v'xQ�A�O4aw2HF���_>Y/�E{��~F�X^n3�
G|��\�,������_#.��0.��V\\�������1��c�^�	kq���
�p4�:to�m���p

�*�	���0Ha��G���������it {� ������u.���'-n
��cE�|�!znQ��0aUbxS��%" [T�K۶��d�g�zt3�|���n�l�����?t.��o�SO�wK�Dw�G�����
�|=oa�^�j�O��|
��Z�}q�� ��(�za
���T/����\x�1���g�y>#��gn|-�O�i�g���w�g
���푼�zy�(�'颹�M/�p�X��v>幔�]'��Ճ�������C[�cpNAWҷ���k?ʂ�"���:��m����8��K�I?J��2�`�k��|9�C�n���q��w�
a�r����nh���}ʫ)]���� [...]
+�"_��8d�|6]rgѢ��}i�G�3H�G�v!�a��Oz���

'�á�_mv�<T��f�Œ\���� 
3�����1�
6 ����W>O7E?��]ŕb��[�|S�/8G�H�ʖ�e-�
+��3�y<��Sai�D�k�h�j�:5;���z/�0y{�
A-�J^�
s��ݾ��4?���A�=�f+ ����s
���R��X!H��3����*���tK����*�5;I�pW��^���.9 at wi|9S��' v*��UmF��:��� ��g\
�A
/
+ at s���JC�?��vm���������|1'���<�����z��n�}D����Ct?'��[�eׂjh|E�x�-_$
���u)	"=%�M��0M������'�q�*ѷl(q9h}��
�y^��y5F�]6E.̎���X�ѹٛ����S�<;�PԽ��}�v�R�����be^o�7^��KaQ��Q���U��J؃�%d6;������f��D�
B��oZwЙ�⧂u���k���pK���l���a�hN�Ǔε�烢���أ�*=���C7�e��f^K�G�LA�3�����|
+�w�WJ7q��w bތ�U
��4������n>���辆ƷL���e��_;�!�,�v��=v<nN�����:�cKf��#��讷x:ppB���y�+���j~��
+���l��K#D�	�
?DWe$.���cX�[\y���*N{�g��N�z��^T:)�3��6��
Rk���;M��.I�o�w��gL�<�5o�UL���*UX��A{q۫��^� 6����W\2:�?i��tS2��T^��ː��ps��;v�j����ʝj,
T�w��DU���V���a���:o8���H�
��{�B
�#G"4��|�n
���`��d��� .�w\zb������<���
�۪����+'vx�
�Skv}=�>�#gjSQ�t
+���&eqdB[�t�w+�^h�p����0��w�V8#ڥ7mHc����p�u��l
A�ٱSA�	��������@�
+���C=E�|1$M�汞ٿ�����ڋ>�*��n�*qJ��
+b�Da˜��t����mU�z
lƩX��Ӳa>�e)��j6ۥ��>����`jy~��K�i2���(��_��
+mܸ�$�]�]S

+ngth�)�64���<�
���<�Ŧ�Vkb��E�Y/�mAd�{O�����S_��
+oOZk�Fv�c�xP��vEd��4��C��K�
�



�
+�O�se7��h�=�igTE���=u�a����cHʷ�<K@"�
���/َ^]1;o��(d#N��:	������@d&�;%5Nϫ�1���d��������&\*.�p���j\=��(ҽK`��W�[;Gg����|�8��@]MU\��ۤ W�{[��b�K3��][N��O�mH"��v�ك��&NX��Q�.��j
����U
���|qI�g�d�q�
ך�vO���)}�}�'T�z������A�]9v6�����]�i��u�̪��U��Io����"�����̉~B���]���E��Q�S#'�1��6A.���׈KW'�_`a\�O��V2��{,l]�p��o�z��=<e�JoЯ��̫��Ec�
��#0_��M��EN������7�����
�us���P��԰�JՑhx�
��9=�������ƙl\�ؓ�V\/� O:)፜���2P��-��P~j��Xؗ
+
�+KT�5�p�ޛ�vD�\
'�E�t�ȢW�
��s��ӧF�a'�R�f����s���բxd����#.��2��G�c�`�
0,��Z�Yn�)tH@��i��s���:�]f
+�9)�FEe�Eb�BwL��#��MЕ6\�:tM@�Zn�$[�� ;
���]&��q���Q�����O���>;��=��J�^㲎���<85���Hθ��3n�f��A9�G{�X���]�e�z
�*	�b}\����ek0�a>���la�

r�� j5�>�t�~�J]{'C�zS���J�b�{>t:�@\-��`�@�	��l�8B��E����f�eg��Ŕ�l���䐿��h����)G�W_�
�Fc�
��q
A�
t0�0��{�Y�P�z�#&�
����8u���t+g#�\�V�
\����hY�搃3�ʏ�:X�Zm�a�)��s⢰�<n�pg�V(��� s��
m?�x�`��#���HwJ��S�S�N�gq
��:xw��O;��_tVML�4΄���p���������7�U���s�PB��I��0��Zaw����p~N
5����h=���k��2�{�}|���:�
F�~*T])�͚£{Y�����Tz.
��{Sm
ئ��d�A뮝��DFӖ4�̿�4�IE�Q��'%���V.bћ13�P�޹Z�<bx�02�
+�6
��1�>4Ы-{�*�u/���V#G��m��r���g�kvK"�^��
��T�ޫ9,=ҍ�%_l�P�P�R��d�@�NG����՞WM�J)�~@�:�\��z�~
+�a������؛5�jw��6�Y���Р�I�F-i|ÛO�J6ʧ�=o�����Un�F����D㱫gC� (�@�Yk
2l-�s 7�{~;.D��k\\�k@�;qᙜąI��
��!�����(Ǐ���~�/v!r�f5Zxv;E��޻�7st_16yofo�{#.	�@%�����w�?{��xr���g�*�
M���
Q���z�n\̄@s���(�\��0����*[��̋0 ɜE at 1 *�T��Q@[��m�{�Y��s��ˏ��9���i�a�
�v�\g ���ر��+�z
�i�Y��D"�N))+f=��N'�;�^\+mG�}w�F�=�GK���_u
+���! X�?��sVR�o�A�V��Zt�z|XlCf��L�n�$	
����:c@�jK��
�	���2xN�(�\�'2)�V��Ƭ�qM[@o<z��^t9|��_�Q�L���
+-�}���p��g� `�/ � �F�3/�� ��
C0^�P�������	���U��P(�
^�ዋI$}KƷ���ح=�)
-�)5��䑤|�G�s�i�����EBsp�
;������/ ��
+�
߰k���K
����ɛH ro�:��u@��.���y�ТE?B����NJ��FGhGjI`	͍
�c:{���xt����&��]��ht
��/O�;F;����
p4��| Q�(@�s(4
 _^�w(�O�e�P�cyp\̓W^�Ar��l
�|\��Z�N��#Yw{�`�?�訂rŭ
Z��z�d�1*o�,�o�ǟt�"�7,�������Q	�m���5�w�o���(��i�V��
� ���	]�S2&Q����]oc��)ޙ�
چN�Y�݆]
���f�xj���}s{|:�6K��~���_ �e
+-k)@
n

�(�]���r�e@>�e�����Z;���̆p��[�;	��<u
�h@�.�kqnT/�>�:=�u�\���������ζ8��n�})6
f�3J��������� �H��
(d��P�ϭi

+���
U-n۽��6N�=������:S���>���
�R���E}��!�[$�|�����톰-�S���;�2���D>Ga-H��_ ��p7�2��
l��=&��=���nۃC��M��<�mYG�Y��ʻ(����� ��w���	�.ؖ� �U�s�ѱ�h�m?7��鬒�/L���M
9
+������=�'���A>
٠`U^�CC��s
����
#���;�ypI�K�R�
Y
�?��5Ho7!���g���o�k��֧�LY��3sXXٌ�z��y#�GC}�[�5�Ʋ�ߵrV��`G��
z=P���C���[�%ݯ�x�/1D�o��^�<���h9�'��:�6n��
l�;�zzͶ�<$�ՙ��о*m2�1O�-}Y�9�C�{�Z�3K˸w� �S@�Y�/�����(��o2�?M��S�uB�:`YO��&�
+>�B�m�W��mv��=7ֆHHo5���Qw/z�U��N��V��yYMecf������\R
����������_���7������.����%��(=� �����
?3�].{�k�͙m��9
�#��\O
�n��b��j��c�/��<Xx���@�
��c�R����A�=/�
+�8������C?�S����Ac*P*ah��8�>�ϥ�V��N� �}As�m���ΦϊZ����h"���О���2�\xq�Ux>��:)���`Ǖ�\�]���������ƿ����L�L'~o
�2���U
]S��h#��8?��a�j���i�Kk�u�n���jf�)��xdɩ��8I����)h���aɕ����r��<�=}��%�IB��Nj��[�_ �yxdUE�'c
�|A�O��l
6���!?��1�]()U<�P�.'�a�W�2n��6C�s��?���~��
���ס1k�*���Ǝ�e�q��$���'�X���z�_�2G6�g�%>��.�R�$���g�8'q���
|/	��
*Ǧ��/�����\�j:��e=����(5�i�^��$�?�b������?/��
�Ú�+aU؂w�_ N����#�}K~
���Jjr�ST��r��]��{������{ޱY�j���q*S+��?o��R(��O�2��U���_�
ݾ7�ͯ���ʸ�6+������"#A�>���9�|h��O{eC̻���p�
��?=$oE븵��Zi�u��0���y���R{P�s�-*q�y~r��Fa��
>�%k�|��%:`@M�� 9
+�ზ���ȫ'�o(b���5�51���o�B�j���9�7��nI)��<�Y��I� �:lUe����[�i��tEܪ�|Iq��
endstream
endobj
123 0 obj
<</Length 65536>>stream
+�/W8����L�z�s����窍��
+5n�
U� ��g��:$(O(��2N���-h��K�)�>4��[Ǖ�:��\_��
+�8nL,�>S�[*W���!W�ɗ�bw����`�`y.[�����1zD��g��"b
�F�=,�Fo����~��U ¿]@�ԋ���5W'�v��d�
��9�w-;e9�qx�(���օ�,
�rN�1�t�EQ�{e��������ˀ	|��-
+�
�JlqX��vtظF�"+�[R�,Y5��eQ�g��^@aAiR
� <1p��-�t����Nۡ��	�ʼn��ҡJ6��\�n�Y�"�1����+
_�Wd�V�?�=�^�ꏘ`�H�]r�nlF���c�n����X�}���hEv�@
���H�K�LT��d_��N��O���XlhV�����uW<��4���H���I�S|=���{,�d�*�yw�d��>�(�ֈV�Լk\�k�]5c�^Tzb��4'���_��U��+��P:oV�ş�N筡�#�`����Z⌞2S�Bӳ���t�
�8g
��!�
f7ō�=�w^E�
+nu:v��Zw_;oD}�{��<o�΀F�J������X;:9=7�䦟�?�����s����Ńk����Y'޹�{�^o)����� �
�۾X�/�c���K���D�Ju�0�Q h��.3K���
�:C-%��
�vND�n���ym����~�feߞ@t�������������`�e�@ݽk>O����d(O����F�k?��#�v�7�K���.���~5�O�|w��7��膖�B�m�f9��
�5�Y}
��ekn����T��xga��X����qOz��&��[�ɊBEˏi%����v*"��и
�Q/�ո�0\���f��u?^ާ\>�|_��;B��Y�?�`� �
�%��7���ᆪw�۰�:dg��X�jta��
x�(=0OF�g�Nn�<]��>?����u2��*ߎ��p�
v���c��ƀ^�g���ϦP^g�k�ek�|�9u4K�v�k�
Ծ�ּ�h2JU�����d����W��U���a��W�X���rbe;��]�F�"VO�p� [...]
��0�{���R����)U�S1�1�x��A�\��m�6����8�-�;�m�r�4]�5�
�u���iP�
>�j�CIw��
���nq�1r���A�ta<���&��|Zܶ�/ P5o )� ��o�m�0 �H
+����U|3��"	�^�
�,/ Ԑ�?R���	��[r�9�DA��*�\sX��J���7x��m���&9y5/���C

/�̺q�+�^�<~��-���Bo��h, .(tT�u�V
`b
�,�<@=E��� �
/ ��
���P貈A�L	��4^�D�_#�
B���)��VR��^�p���:�87���`��6�
h������� F�R �(��/~-�	y�{�;,@���О�P���B�ޮШIr$
�։׮�*�F^���S���IN��m�h��m�1�v����eF��b{
�V�dP��D6QQ� ��>P�Q������e kz:@/�
@�$ h5
@�SD^;�H���z��K����{O���<��&��d����.�Z��
�

��1�4���U����
+�}v
;�(M٧�G5@��3 &^
+��� �m
+`wc
��^�=��i$7�v��;`��5nb�~�ԟ�N=��?x�CN�n�D��q�>��`g:�\��ǎ�.}
l��
�>�Оn�
/`��Ɣ�?	��6�
 
	�Ӳ�[E ����j:�	�̆��;y���<�Y�O���̠��'��,Z���
L`$~˽�ޥL��h�ԽG2�n�|O� K�P�=�����
�X@c
��W�͂#�$i�j��^k�EL Ng����{ɵ!��J�yĵ����!Qs������_�
u���ah-�m at 9_�w��$�~���	nN�r�����o 0b��jW{��a��B��
+��}������
@֗�WaMI�J��뛨]
�ꪝ�ؽ��Tz� a�$�7t���x��S�^Eg>9�j�́>_�ݞK�=�7�8�[<�
g9�g �65F�>lq
��k��+ހ�@~|�Yc �y5_�H�%u�1��|q�H��e�V��hl���nq\.�&�O��
]�
��(
��J�=Вw�3�� ��R��O�Y̺�7���3�F
+]GPh�m��
�����-����kV�4�ƚ�F݊
+[��_�F��ܕ�B�R/� �:���ux��[ߩ���-"��X�Kvd���N��w9d8'B_k�jL�k(�k�g��-�ߊ�
+�V��\���o:���e"y��J��
�� �P7a����0�.�'
����NX�Hf��
+�
��ܙ��I_
-׉�U��X�]��sb��<�]��m��gG�m����x�e~
ʻ�
��t_R�Cc�[���q+ߎpM�λ
}궳��Ű��F��<t����(N�x��l�L��L�]?oF�~��g+lM�)֐�'���km���
u�,�� ����A��#f�Z̃�prA�3��u
+�D�|���7T�#�([�S:�JkwrL�S.��c
�j��+��
*�͸|��ym�^�棭Q��.�bk���֭��~������﵅˺���������{�H
�y
+��.(v�{���96>�i��^4�!޴V�*���x�[N7ߡ�������
�E�	�-���Ŗ�`��Ý��ٝ��:������b�Xה�;�*����h��πcȱ 
K��y��U�{֡���������
U}�>��\�'�|[s�E�u	j��57B�쬮�c���P3zkA�����vPm�ֳ�2�������sq߬��+�<����j���8��(��MYw��f�e��9�_s�K�o&�-�?�ko��I���eǥ�a"UVA��ԣS�R��Y�ay��rq~Tչ|Ik�&n|I)^R�y,�
+� �}��
?ȟ�vߗ?X�
+�Z*SV��o��q�[y�9�����i��mT����
���j�uy�*��fTQ?�]c�
;��O/�yQ��2#�89��^Z�~ѝR�&������]`H�>9�z�� �l@,�3����
(s���+�]�ْ�5���<o�^urޗs��}5Џ�
�M�~`��x���J�AsVU��)ߕ]���f[ab2�":���}1�ʛ!���$~�b�?`�+�?�=�q�{(��n�F�#���2�h#���Y���Z���r��)���jQT�?��.;�ғ�"���<_+�Y|-����aD���hט��5�g�<��%
������x߹����]���>�7���2(C�8�珁֞a�3?9<��h�yTvw�њ����/��V9R@�Sa�Ɋv#gF�U��׺�2�6rp�ė8��9ux���å]J�j�s��&�π�g�d�|���ܦŤ
;Bx���U3�<�`�
0��#�t�P<��k��j�X�\P��jZ�=d��퉉SM��
%�X�5F�C�
Uj7
l�p�+��F
+�
X��@r���F�
���
g����
+J6�Se�w�>u�ej�_����
W
˟۵rH_t�ߗ�[�ϭ7�^g�s!5q[<"
2'l|���Q������plf9���.�����m'�m{]�o�Y�K���?�I��N�|ъa�,�^r��?�GP��N�px(�]�
�A6P6A�b+�tP1K�(θKTŌ��u��U*=��~n�Ān�*}WЛ��@�� ��Il��3���ܙY�+����=,a� Lc�v�E�]I:l�v~����>Ge�Jƣv��� �'+}��ڀ�zJP���+տL��vN�C<V�54"3=Hm�?
��=2sn2���Gߜ`J��Һ���n�G�隹(�A8����W�o $����4 (5��\�׃`���ZH%��N	��͵�GGz�YY,.��F�c›�ۊ/�7�e��
�+��sK�O�9��������¯��ڹ;�^�ՆZ�[!��TJ�J$a8�>��
@>;gPD���ҩ�ށd÷�}n��n!�8C�tgks�)I�Vk3DIYb��mǪ�
�L�p��8�7��J�k����B��
+�f�b2\�;��nv��۽cˏJ'k��N�gw� �8�ׅ42����j͎�>m�W�=�^N��sW��6�c򺏋�ݠ��8��^��
f��åץ7=�,���t�fr�u�^�,�բ2#��pwOn�Z)�=F�a{�Km|~fZ������o���)�8 ��V��%'W�K��d��R�kĖA�[X��G�7�3kQ�]/�ц�ht=]�
ۜ�*���4o���]��Q7��ST�(
�*U�|u�mMzG�y�fզ$�v�
+�yBč��3��[+��l��[�� ��[�u��嵒ܕ��G%���''!��Z;;����ғ���D���^�^^���T.�:8������j��є�}�q/ �ѐ
�R�>�޶v��k�}��Ÿ��ؗb�s�����ﴞU��b���yw�&�]���@8W�/�h
s
�~�<�8���<���i��j at Zz�M;�蹭ҳ�oV?�kc���u}H�k/H��R�Z3����	_̈́
��.t�o�fG��
+�g�u�
�k$u%�xm9S\yӼǝ�Fp���n
��6�
�
�ѩ]��q� �D��_T뼴�f`(\�n�pk43�i��2Jm��WUk�8�L�+���^ީ�w�h�NWJ"]i�36�R��g�vYQ�4�m��OF����|����ϊ����sO������}��qk'�fx�F3�BꝜ���c!_�&�R5sm�*�j�S
7l�`tǥ�����
�� ��՜�|�
54
�:[��ʍ�W�^E(W���hM8�h����Aq���+̬��=W��ju����h|jU{ʸRw_�-J�2
㗒�Ʌ��&��ܻ0��l~9��&Q�����&^�^�X������
r�L�{�����$N,�h���,S� ����
��
r��9A.S\�L� q'{��+ at f� �t
+��U�R�j ��C��9��~aM�L&!mF��Q����z�������[��ri�1��7?��H c�6 at c

+�Wi��}(t�*|�6�*@bƂj%��oP��		�B�Lj5ZPfA���/�n�OR�r�n~�G�P�0��7�<)�䌥
r�
+}���
�6a`!#̔
�u�e���	�O�L�{Rk�mi ��P�r�j�w�6 1�(T;,A��.@�
	
+�WO�0��+K�ml�Bs���H�� ��'~�?��t(��
���=4f7
�w�xe"
�<��xX���] *�B�а8�e���n�P����@�
+��o�浭6�ߤ��D�v��
��ԍ`C�a����u��
+��Xsh��
+��ԇ���I/ㆷ������F ��
+X�^��2���V�B�%'�k{N>���^ػR~
+
���t[������ͼw'�:���d�s荷��pXw.�_�_��k
��s8���.+����	��}j�� k�}�^��$�y
Δ�̃�19�[RrZ�8(u�qu�Ţ;�բF�Ի��~ZE#��ڹz���zp����\e�+�},q���
������M�����ѷ^ �nphY��"��,���Tr��l͈�ׅ��?��S��z�%��{�	��N� aF��n9�!\����羵�Lv� y������� �
��
`��	�"t��� �������?�x@L�'X�R��N�Z�6�rj��
��>�6n^}��Pn����z'��r���K�J���`��F"�Y���a;t��R�N����F{M�
+��P�����g@����|�! װג���J���>�\�(��n%t+��m4�@H�r-�����«'����
f���?�Z��ﭱ��Ki���z�{�d4p�с�6c�c���i"��w �y���&[���@
� w�1ȗ���e��3I����#�֐���A�Ӭ^�E�sҼ4}x;2�;DI�{�G�����=��Ͷp�v�D�o�|�q
�eS�9c�{���*Fcuʴ*�ɹU� ��
��M��=��X�ҁ�^�y���9ֻ��ɬO$!N0��]����R��A���

+.��
+
֓�ّ[���%��m
���񌭕ƒ�������j�k��{W�E�/���Y�A�<� *~��M65�! eP�i���h�I
d{���S8�n���$�s�����3���U|;�̊^-��G'��ݕ��Ų�ɕ���(�(k�e�W'�y\
9cT���E���>�݂��V���'�d��{�0!<�

+e CX(T�ױ��9wOlo���xi.����
<�������q[$��M����XT��f��Z�`�6�e�����B
+���8?��n."u�m��=�_8�X�k�
�W ��A���&��mNW@���7}�E��l��_3�a����)�/�>Q@����"��5�v�
��!��c�ͯf��l�p����U�y�[Z(:]fxz��N�i�ӗ�2">?�=l.�
t�?�s��U�
p��T8��o��
�6�P�'�)���Zܦ,�]�Hes���n�'7>�7�u��
�
+���<J�G
?Eo~DRCZ;�-0��2nI��5�l���lrK��"�'�|�@���
+�m
�n�l�}��;K(ԗG�*�O�xv0	�Z"�X�Q�����
'~�Іp1w�y���vd,��K{�fi��R���)��Tu^X!m��L����Lg�ph� ���yA�4�)Y5�π��"�xp
�cPH���&�Qd��a��j�K�SLJ]���d����k�Z[�J�M�_�w��k����,#r���jL���(�f}����4~”��$��I�]�L�J+
A}��_����[g%
+m�[@n�	(���g����j��2F�gZ��}���nRVw҇�m��k���Г�Qȫګ
+������a�_-Dٙ�.�)u�V&�i�#"��H
K�����0<�S�6��/N}~��p!�
�#��W�I�Y���>����\ZG��¨�u�5�_Z�d�Y_�k����ړ�����
��n���v�JOLPʉ��)	8~n��l�OG%yt���d\����6����~�dp��
+��VP���A��@!�U����
+
yP�P
_<��ik�ⳡӛ*����Y5�cK3�v��L~��g鱦oS0�IOg��ξgx����e^
U�%=l��Al��A�b>�%�FՉ�
U��7� ���C�{
@�� P���{�����ȝ���=^uARf�=]���nu���啚���2�;�
��w?{���]�4
��l~FJa�
�&]����8z3s)���R"���w�3�T0��ׯ �A�C&N�@V߯��������r~OnɁ|������-��b+���#�^�.
+%Ҕ�T۝uw��$W�
�<J]�r+�#q���
�1n��G�r�7t�QdV���
�j���H��%�����
�B��6b*�
�3
>_^v����潃Z�Tm�"s���}w�8�<����6��9A[MG(��ݸ�.
�z�t�>����|'���$��j
f�����!�Sbi��+�4�M�~�?@,�&�Oַ��u�������*��yt1���-��>*e�3�RK�>��p:{�b2��P�7�z�v�T���l�z��r�t?�����E׺Z�wU��u�|%�6u��]6CWc�w ��9�@���&��a���N9�t�#}o��DZ�o�\966�W�����*)F���x2�p3�����@�i�
7nm{��<�S�0���F�»��[�VL��O��y�'��9���.����b��9�
��G>�&Mi��o�˦'3K
Kꦮ�\�,�C�/�ӊr���slO��t_(��<
����6�.8��V=�8���~�Y����o@��9�J���NO��,[��^6�h��	ֆAa�=�&�_g�eC5O�#5ޗ�঑hh���J���s
��Y�4d�#�f��6_��+=Z9����&}�
/z%��bB����h����b+�Z�Y�d{k����p2n����߃���M�E^�j�$wj�⢶�����Ko�y��̪���5� [...]
c,��h�O�a�.���SK
"̪�?�R�~��k�5�rJ���
z��V�4��W14+0�i��
V�|�^�fKk�d��V^��u��������?�E(��
e����y�i5f�Cɜ��`�k��e�aA�
H9՛���W���G��(�P߃MٶX#ƭY+5iΩǼq7��
���=������<U�Y+]���|�U��ʠ��*�X7 �����|��j�����$)'[���T� VO�z�1��`����䫿e��Lә\H��ó�_�w;�g��Qľo��
R�wrQ��
?���U����������q�h�+�X�JT�N���&��Y������a��&������t����9>��C����yR��ec'�t�3�x2o��ښ5&�fPn��.�.��
]���V\��f#�O��lI����ys���)�r�a��o��%?��M����d�~���|D�����ğ�8��z�آ_�c�rGT�}�E�f��TcI�l���?
Uܙ5.Xƣ�TۢR�ѴZ�Q� [...]
���-�=�@K�Ƚ�ȭ5�h���=�@�R m���idg��H�
���ҲA�����e«�le!z<�.���S��ߜ�w�<
���`$�� J��J߼-��� -�P(׮�
]��k�A��
����Q�uZ�ZW
@r�
+~�O�
�]�{Ɓ��#�-�E%ql��ЃEWy��r_�Y��&�ݸ��_�_�!AS��ݶ�ki��<8� ն<T� �� r��r���
�j[ \$ ��) A�+����>C�(3��t�e
j�kX��乗�d–�Q}��ݩ&ܜ�j�+ b�x��M�����4���4� ˧' u��"�	���wQd
�uж�
@\�G�^_d�l�di
�� ��J �Q�k(��'?;�����%�H���wj[��}:�
+df�~��U@�Y
��ӡ��8 ��r �<)���
`���yx�@ E�$�m�M�c�}��� �)�������o��|�??�Hy<I�N��(W�
+�׭��ud��-�R0*��K	�
�Q�2� !!��p�@S��0Z��7Jc���J��Pd���
�o���g��B�5V���A�{�����Q�� ѴX^�V��]���#��C���J�![���X@��o�ia���b3{7W��
+8|
+P���B��Z�|�$ �I,�ep9�
�/��=�ź�~O;	�带�;Q��{]��K?H���UC+mmBV;lo�+��rL	#g]���.u��b��6R�����
~�(oF	Ϳ���
ۼ&�'o��	p��<��ѻ� �/(�(���,$������}�
����T�,��
ھ
�
��~x=X��O��r)���<�o���/G=�d]�*��4C�vc��fC��ܣO��w�� �J�_��n��; D��'�Lp�L͖ϋ\��%Pv��
��!�F\�
+H[�/�O�tVa��u�u�=�ju�[��t�Z��
Ͷ���3��(fP.U���-�w��i
�W���I8���ʡ���w�����{MS�"�X�zlN�
��.���L�ٞS{0y
����K�\�x���
g��w�畵���֨�,M�NZ���aڭBu��vqM�<�*��F�����yC����Bc�"�1���i�%ᓞ>>�F	��[&a�:?���Hφ'�l��!�xn��#�Uu�j+�FXզ�w�c�ٳg��S4�犾���g����2y�B?q�>qPM��ȯ�]S�2�
�鶠�C9dP.���5�-��=;���Ip�9���c�56��,~�ji���D!����c�
19��o�Q���w��jb}��iHFe��u�XO���a�
+o�H|�^�3K6�I�
+�6�)�ւ
+ۜ��:x~ӡ�g�1��T��
	�>�֨�p��e��@K�Jw�rUނ��
h�h�(%0sn%^�XMW�!�=B_
;Mk�;�S�T
+
�Ɏ�e�
d\g�V��uJ���W|�LP�K�
m
 )�_�th)N�Cy�:F'�Fo��瞿�/⮤��y�޼j���vC��quI��1uc�q~�����m��25���
V��L�k�a~Hw�����ϥ��A��+ j�g /�P�ƒ2�. �Ӳ9U
yeX�sr}i֏}z��ti�-G���a�����zC
+u{U!���V���w��"�x��oe7Ar��(]��=�#��� ��#U��H�~���n
�<[���W ���B9
+
oG��ǫ\�{�!oE˟W�v���Bk{���h�E˝��F�6ڪ�
�?��!][}���_�
�:u�
^"��iJ��1[*��4�Nܴ�a�igX
'�2H���_D�������y~�b�������
�}�����E�����4c����$��l,���=��?�%��
+�}l�Ŧq�n~�1S;$�v
�
��7�|E�k]F�=�šu�W��)�b/F�� �� 
ck@�
+�w2�8�n�P(�����a��]�ڰ+�[6;�P	님Fs��]
-��yg(�V0嫵q�z��O�}�l
~"��uF��<���
���f<Yc�<?��y~��~}��E�}�/���!"_� r۹�B��6����h/:Y����?�i/�

�c	�͉[�Vuj3��:�,�.+"?�k�
ȏ���&�tuN�&���$lW
+��x�u��UX6G�KF�x�GrQ���}%
U�w lׅ2����5_A�i���p�.[���
���^.Mb�5�4�ky���ƐS��),�L<�oӚ"5��>���Ft�#��0>�J�H����✂�?�˝ڠ���A{a��N�ч
+��*s� �	2 |ɂ]s$juy�h&g��h��
�x�%�<�ݧ����ϔ�xB��L��.�.7�W��(��Yi�P�B�fiC l����������E�z}�p�4Z���Y��v�7D���R
�nR����W�/����Yٻ �ݮ��k�����cQ7v���0�Z�]��
�E�)l_]����<�U��v���l�2G��
�؉>��̭��%�r�����^���O}&E��i���"
+�=�{�
 ?�@`{w�'%�L�'��0�)͔⾙dmc�}�T$2��� ���RT$�Ԓ����MN
W6<?C�����.��eW�����s����u��݇)~n�B_�^����-sᕾ�Ȉ)���_�!L}M%�]Z�I7qW��q��=���F^b��7u+}OoP�|
�[�iej�v-��
_�'pa$��`�/f\�c��.z�Yq~�t�zxu�*JR�S����i�>�Δη��Ʀ���o�x�`�Ըc�3�`���≳����T}mj���Z��b��bYG�٩��Ea���U,i���
0�砿mj0���!;g��Ҋ�9��r�Y+�:�V��l��av��a��I�ʳ�:I�_����D��?�뾞�w���t�
�@�Z0T�ݳ�(��-d�:�
+�K,pwd�@z�!�$�A6=��c��g��yC��ˎlt��Pݗp��R�W��D{�c����U�vn��v��5:c�_q
&���a�ӑn�ڗ��z��5t�I���&�Σ!H�}y5
���pZ�d��Ԑ9t0n���z���`%�b���
u��hJ��H�ا��A��K����L�ɽ��S���HjvnN˸Y������|�ݢ�6<�
{Й�׊��L�(/.�.�J
5s�<�ޚ���n����`���}��f�@��fJ��
D�����Q�{�c'R�����-�396�;n��i���fcn���ߘ�ب~��ϯ�]i��d�Yi}�I=mV�8��7MH�*M��Q�wE,i
�����'
K1�Nϟ.x(H7�(Ŏw����
E��J�*��i�2�
e����~��[z�U[�
Q��G����b U���jf���p��)wULgL
]��)"��++�N�k��d����t�����6����.w��O�Ԭ���뼶�e�5|�"�lNE��J0�����n�����N��`�|���*���ɟ���
��d볨V�o]�Y{�n5Q�Q��)���+�!<��,��ǔ*
�{�4lq��7|����y^-�S;!j�QIMYc��3d�f�?�aO.Г.�<OY6=Q��j��
�g���cw�o�2�=7�G59
�*��
+W��=��~�t��t��g��و���0
+2W�J����
�����SZ��{ʶ�d|��x�Q�q?7�`�ܽ�l�]��&��vӛf���#����֌�$V�BV�'�Z�Nsz��u�z|�����&r*���-_�)�ӆu"���!n�Lr�
�L������в
L۠����c`#�;7m��l�n`�vp%��,��@G(��
r��`R�p�z�̗��_��z1�:�
+�ϲ��s�n�S�\����x*f��hN}BQ����!���#��~#�
�ѣ�LZ)�O|�}�
!
+ K�%��Y`��ح�0
+ ��]��`��a]�{�
Pa�h��4s
4#4 �һ ��C�<�3��K���9qd�yBLq�K �L ��l�U&��盋���� P�e�
+�YP��C���
�> 8��>���p`NsՎm�ֺ@���s� �Y(+5Z�8(�:h��4ͬ �@��
 �q������;�C�i��������4
�I��q ���@�jF�϶`�s�J� |�,�-���>����սB�/ РH� T�������Cݯ	@Ge���	qtJ�b�Jx#����ON�v���
+6o��c�m�~@7��3�X��F�)��%��M��R����|�<�n�B�I�Ϸ\�>�ߓlX�; �I����Nv������^����S��,
��T��}Qfn����Z�j�Ž�
 =M{���qf8���=#�@bS�9�fVD���w4q�����N!x���F�%��J'�Pm��Ԋ��I�_�Y,ή˸@��ϋ߸<«��/�U���+x�L�骭`0�ЗŒ/�`��T�
��(4"F��^&zE�k Ț@@�
@��#@���!�
+�k����铐q1�,>g�g
��H=�j���|0��$��^]|y[!�c��O�pSK�`_L�W��4.��A�j�{�}oj�[$�� �ǁ}�Կ��y�{����
� #����O�㳡����z��{��������["�ĭm�
+�u���L�9��O��@h�|��u��h����>ѹ
齎�����Ǿ�����.�;�s�o�}�C/Yr�bZ� r����5%�&[�q<F0�x<�]�δ��[jc��]���k�
P�,~͝_����y��7Nj�b}�Wy/)�^{����b
�+=}l
��	��<�$��|�8F���ҟ�/ ,���@�c@��* ���]�y|��M�˒���t��|I�[Wf�Pd�Av���x��
+��k��֞
+c~�^�D\�������́:��Iz;��D���ύ��P繞6�ȣJ�)�k�� �2
+er��O��[!�kG���0�הl
���u�Z7�C����K�]�S���=�!�nO�G
·�I���k>���
���������6�:�r��T��wl�h<�^-��%&���:÷>�K5N��N�W |Z�a{Ph��:����f�D�,�g���0=�W?\7/J5���|�	n�EO���k��+��<����ih�s'�YP�XܣH��"]2����
�O�j�0��e�ܖ%?���2�T/^�^��?ؿ� ���~�@5�+�����8�W

Ƚ[��p<A��h�W��Zn��?���7�U
��F�-4����6L,w6�x0�'{�u�m��B��,��2BW��ܹ�/����ߏ�Ჱf^�XK�
O���o x��dqP�{
2���[RV�_�f-L�C���=�5'�
+�S�P���n���,G6W&��o����W�
�,g��5��6����\��EZ{�NNK��-u���bJ��k38�7�;\ͺ�|\l�
+8
�}@�sP�`�$��2����
N���R��'�ᜒ
+��s
gK�]Y��xsxڌW�{e��3� ����TZ탧\-����"TҰ����<_�3I�7�`V���t�W�[�/`f��k�E2�hЖ���,�mgίJ=ݶ��5(Y���y77Cc�}�Z�lVG�b��E�
���j:l���0֍3?[�
b�!W߄����n�^���ι�}�Դ2Zd�Lr2m�k�^NN�s�]!��
8oj<�p�[� ���cz
`f
�{Y����i�� '�kkX� z�`�q����+�x�?��teAsF���_�3%�u��9��i�y�e�u/�s��d�S����N��lu'�s���Q:�@x� P����^[�Gr\za��oN�}k�Y&��k��cÞ׈u��ٵL�0RZ��v]o�v[۔J=�l8�\�4�Y	��.m�R̪[q���}
4����
�������aw�W�q��/�`��(T�C�osr���������\�؊]
���a�*B
�osr[���-��RնȰ�R��;�*#~
�cyqZ�3
��b�W��4�8:N�h�q[願��C1��`6
o��� ��!�NWd��AosYy����p�ta��ث}e�鼣�妋�*�1��,�r
nz+��V�>�1�=��˜�츂hͻ�I��1	�QV>�kv{���{�
��@��"����ʍq�9
+����
�ّ��d��68��x2'��Hg|,���6��,�Y�Y����]H��T�P��u��_jhuz��R>X����_G#��M���օJm�����of����R���_ɫu�uɺ|#�k-��7|y�P踠?^���c���vр?��
aO����
k
������~܁&`EL)ȓ���:%p��"�ط��L�;�3���
q����Ʒ��gS����;�m�$�e�
��K����i��5_�� �b{
2QǸ�
�;�Z��nIn������
pE
�cu=o�����+�L~�3�V"�6e��^��ǣì>��pFPԠ���ɨo�[�
w'�
�*
��[=�f�
���v�o6��_�v0��;���� }H�<ձt6�F�=n��>�g̖�*-�X�9�<�岢-ut�
�|��4Y�,L'�~,f�W�O��p������W���f�!�g�R�md�����k��奃��6�lG,����j˖٫ǖ���@&��~�@�)
���Õ����CۇpR6��as�*����+��8μV!O�9�"ao�8�ְauhQc�.�)$�{[e�p�����u�
�����o���M�W�(������a���M+iD
���5mJ�����Gݮ��[��C�h��q�x�ve
G�\�O'S�Ӆ�![�f/��2��O��B?f�!�έ�둥���O�fg:�s�қ��
j�1
:qZ�`{m�<"�t4��tDKmr��irA����4�!8�F��K��^E���%�9�$���.7��"�ʼ��g��ݗ9ڝM<
.����(�0��Z���g�q�K���x����Z��9w��~-�,o�����i�����橆�(�
A�*
+�m��z�����W���U:\��0�n��1�{�\2$�-�`�ϵv��{$���'ݜ�������p5�Gú��{�,��R
�l�\ɴ[a�¤t�i�k|�
��yc�u���
�s]�P�z�~�����З>��r��ti~��"��������K�,ȹ��k�Ȩbc��pB���FJ�����M4�{.h-�b?���(pe����n��4�5VT��̊Ma��
����;�ŷIςƉ�����m4��n�ִ���f��n�I�߽���/�
e#gS����kjA���\u���K�ɸ������Z��~���srX�;�뮱-۷��<�v�rm
[��k��q��?�z)P˴R��ڢ�T��[�2��Sw'��z�t�~�|�:�m���7�{��V�,l!�닪�ċ��(B�� ��It�in�̷;�ʳ�5�
�(-�T���s�4
+�w�W��+�J�GM�w��$5&*l\�t�Y�ܮ�2���?XI���%
��Wm ���X+�tY�X+�a]�^ދ
��s�;~H|ËFʴ�����MO=��St��
��z�7e
�.L��=�멇Vka�e������W��v�r�xd]KCz��n]M��3�=k����n?_%�Y���6�s������i�~���@��x
u�7i�;��* g�?TΝ�!�ڟ�apwC4'�q�
���x���<��q�Vy+Oڥ��q%����\R
}��U)8U%Q=W��v֘���zʇ�'2ޔ��
��[�]��
�]�%�d���+�dD�#���
+YfI
���2X1�o�UX�7�Ϛ��<�,qN*�i�)
�tqҨAIm��W�+���S6k��B&9�����(�*5��b�!�> ��J�=;�q2���
v��#��a��(d@�}
 �w��^��3��� 5Z[�n�@�	P�k �m q��ӵ�F9 ��� ��@�^
+�C �P,@�k
V �k
|`@�]����H�N&��'�����_����������Єd��)��q0$������q+
�����, r�9
+�I�؛����z�S�2 at z�}}��s �cq	
=A��dK��됅�(]�c�����$� 2;5�)�P�I��� sƷ:�z.�&�
`�$0�f zI��gE�maPJ �9� rGP��/T , ε�MA�P�ɖGϯ�(�=)��sI����2[ ���Z��oK�
��#(Tg�P���� �6V �b��m[ ��dրi4��W�r��[O��@���l� h�����d�[�O|B��k8/,��bt|�_��1���~G]�^����=�o���#V� ���E�	��U���ɖ�����}�ئ .<� ��: ���[�&��z�@po���ר~�bdb�|����~NQ��+�*�G8�揪{rn���D���Q����
nh��=4��r��� *��΂�
+Q���u�B�Dc|��}
N�~�w�CF�_�
���}Έ������Q���� P����+�/ݘf����D
V
E�T�vAѽ
}�~g��y:�}~��"k�_(���.��� �e
+=
;Њ�����ጷ��?B@��8 Nz�5�s�3���Ckiӻ�旷U���~������(�S�+�sd:���2��5����
p�ki!��4�x�a��^xwӂ{��8���>{������ڨ�R�:�/.����/ �Ҵ�Wƞ��{]��@�
9X(��d9
����:A��E
+��y漮'������I���F<��S0{��犛���c���
+qw�,8]w��&���R���n����� �(P�� bb������j[�yZ���~y<р�Yr5�~��ǍΥ�8	���a�����y^��q�=�i�;
���@
��>'N>;i�Pۀ:ֶ3�:ب���ijۣ���W�3�/?��u''���z�`���Uh�O"�$t���n�&�����S���V�OH9;�������k^g�m�2��#b���'/�����
b��ܢ�~S�
Ύ��vbJ)�M[Y�n>�v$�L�tq�T������|��-K���7�
�[_��]@�2����{l��O���.�0y�.a�{�k�����:{p�����mT�7�%6r����6���r2�i����$���z�	�l��Fz�/ťlφF�>
�:�
t�=.��{�X"��7 �[��&�?{Ũ-����=���
���:u�0��A��\޻�C>W�wG�mt�����b�.��}����S^��V]����j;�z�O��hNjxx'����2�:��h���W{5z��>��o�sQ��m�����
R6_���w4�N��>���q�8������폓|0���`
p��
k
-&12�,���Q3QIo,bm�ǵfڗ����@E?�GpӒB����
+���곙g�ę����
ph
 +g��kB5��d�X1I;��~��u�GJ��1�9
w*B����l԰��Pϑ��m�s����bI���k:��^GV�]CWH5kͳF���fb�{L��Sf:C
aZ�Ts[��p�U�7 �6 �� P��
+2��z6��2
+��L��+<��~vo`��
+'{S�<�ѨV��
7��zF7�`3
+�!����7w�;��
���X+9�W;��N��+�Ԭe9���U1A���`�^�
@pu(�"�zD���.o��mzѨ��G�YᘇkƎ���c����p]ؔ_���u&
pͩ��_��L��N�<��4Ѕ�|Ң��UbҮ8b�
_&V�&ݽ՞ �
� v��
Ї8(3��@�Nk?�݌n�E�{�%�H������z6�/�����Tg�]_�i�9��VI�@�}���M�Yy
+�\�]����y�	r��c<|��
�~2�b�

��8����� �7a�TŒ��ί3��8��G�۞��c�wv�Kn�pM5�8�_杞o4m+\ �O�
+U�3?��ج,���n���C�
t۞p�6�P
eFCc89�G�'A�� G�H�o�D�.��?����� N�ZP�x�h����F
5�H573����@1S9
l����S�hq;,�pQM�>?�ɬB�iYu	�I��6���x���F#�����D(�6P�얿;Z�/$.�/�ʀ��O��Ԑ����О']
�V>�GR���a�|(ŷ����֝�f�7�=*-��H���u��n�W�ΪT�)��G��)tҷ�1U
��m��&�����ש��_���{
-�V�,*�{V&�z��xa-����~ g���
��%�7o۬�zP�-�ya�V�ek\%ګHݍ
�TVg��_�3r�)
�,/s�]JuɄ�}�#o�C���J�V�g�g������ؙr�h���Z������C�Ëb�q������{
�׳{�E��U2.�	r��{��XJ�T�_�v���)���f���컽�E��V^QyOt�N�b�99�-�*��L�[Ov.�~�m6zh^ẇH����nՙLQ��/��N
vh'���N>��:V�pzǻA�<�=8;���tBm� 0[h��z�f�e
!K:�X՛���ʙ��7���3ޏ���<*|ޑ�2�נqfS}+�^o�smIw�e��)�c�\2����c�Fk��]��L��&�v
kk��VC\�w։6�X4��-�u��
1���� �)X�2�����|���2`���U�W����
��
+u�q�״t�wC�p)�v=��v�ݲ�άE�M����G���}k����jg�Z��g�jSm�7�`�0�{@c^=b?�J�&͚�y���1�&�A&
+S+ at g�RR����+n8�)e�H�z��-�r�^o�K7J�q7��|ذ�ü�}g.e�x:���B+Uj�3Z�&ں��(sk4��樱�gj����o���~昋9l�4C���
.�����_���>mw���	���}�j� Mq�3��'�h�>�69�X�Rg|ꔓJ���T�n���V�V� �f�]4�U�.����d�Yw�n���n�Q=;�T�������l|�ȥP{�V�������P.Q?���A8��m4�Z`X�����4��h����+R�����iљ�����ұ�b���-Nh��<W�4��V���^=��f�<�
���t���t)S�g��捎�~�C�\B�MJI�g������Hj�l/oR�
���9�[pݧ{Y�U�^/���
�O3�[�^�6-l1��j
6F�%Ԁ�O_�A��I��ֻ [...]
��͸���Lf<oL�٪.��:��|��Y�Z}�MU
7�V@=ר�����bN�2��\�W���;�Y��ffTF���7XY���D�U������G��;�>9�6
�XٲL�y�;�1�`�Pj
�FC\7;��X�,]��&�ŇV�/�����҉�nyC��2��>%�2EwLՋ��X(��� 
^�HƟ��vl�N����� �m���]�&

�?{nYw�g�bz�tiQ-*�8gq�>�&yZ�|����ق�rЩpș/��aT:(�i�z�b.�V�
���I`���
�{Nrh��KYC�t��b_�$��̬��9�֮�oXu5�-�,R�T�l�z.cmX��.�#TE1w��ۮ<j-yUY"�T��+���*z
%[8��|`3�|e�6`ZYc\�d�s�ϰ%fBq��Jn��E���'f�E
;���K
��y���,��y��EAG!.���hl��!vs�&-���8ď���9'u�+�LwA�N��l+�~ɰ����g��Bn���B
��=k]�'�3��|�b%27B�㾆Vs�
r�`�M; ��g�o i�.����:��՛Ⱥ&@,�
C �z����ǥ��L����e[�xZ =���3H3�
b ��M�����l
�c�Y.!�
Hw�����k_ ��`8����P�����j$�v �������8� ����t�
+ at r-x�!��3�A��;m�w�+������+��� �
H�;2�q��S��K(ħ؝��x\9^⬷�S�D�c�O�@��-d���)5���YZ���
���
�-�P� ���y �Y���֘�aݾ����`��B��3أ�������:3q��4�{\���1[v.�
+S�ܣ;����@�ʔ��o
��I,�ݿ�cW C�.@��:��Jt0�Z>� y'3�x��� ۺ&�X�%�r��e/��'��4�{�n+�-u�t�o.v�#��T��y��Q"��h]�.Q;P�_\�4�U��5��;M���=������
0��lRI V�� Cߓ���s�*�o���2����;O�y~|��R�s!L��J}Tk|������
��V�2�RŶ���!�{����������t�\������?���7ږ�Б� �
 |`���
�
�3�+3��u�5&e:.����":�/��q�
¹-�cf8�"�R�G)ƅN~�����;&n^�
+^D��O!�w���8�u?<xKl��Z{�W T|� VkT���&��������S�	u�^q�B����{������QzYB�&L�=R��U��#������)��y:,�N�XI������G�}c��vt�����@��?
-{?��>�
��4j~�`(�6 �����A
��K2W��T�$����������ʫWS鋴���H�'�|N��s;�V%{ᾕ��vN��q�����}6�
HiX�g��p{m<�myMY�����v��z�/~���1�e����Rv �*�����󳻽�C7����՗��9l|P��
3
�˔�n�Ǿ�w�j)���B��������^��v[A��F����pI�i朶�.Ţ��f
s�������o ��@��S��[e�R ��_����ݙ�½}���g�pj�ԋ�&>�� WR��X#��6Y�����M{C?t�1���N��b�
uiY/}kn>���w�`}���ʣ
0�Y���Rz��eqE�F `�o رS��N�f�	
@]�������k1�i~��M�����1�]w�<��m�VSNlVHH�N��U
�o���`��g��U˥\��@OB�x\�:���y�
C�)�VK�k	�Ͼ��
)}��b�K����Ȥ+��Tw~���8�i��Ԛ�D��~�Cn�[��$�6�\'����i�V��
Lxb=bJ���KU�S<l!�~0��8���̟/Z���)Wcg2P�{�Vў1PvX0U��Y�BR��V�
���
+��j��仗q&?o�D�с1���l�^+
+�	0��*�Z:�;�������,Zgc�*
ô5\dz�E�*T4pÚZ'O��
��(�.�)Ķ����46�ǽ�L��/�|�g���]}���/ ��A�
� 2��8�<�7�=��)
Ѿy��Ǒ����S}�i�K��
�2�=u�:Or�lYQ֑�HZ���'ӚŸ������'���M
�y�9
�
+UA�N�)�Io}�ȵш�
��Hz��/ƿ��4��R�Gn
+/
+7���/J��?1�w�y����
�m�b�v\fj
��r%�r�q�Qo�ճ���7uK.^���O��c���6Tqz�%�L�&�����Rãtq��"s-"���ќ�׽��}PF���/ �W�^���2d��91
��z7�:f�z�0t�
k����ׅ�l��!OSo���f�BW��U�����<|�i�8 ��JϼV_�	3� �0Im>ޘ��Gf�1��j��6�
Ya�7ʿ4�Bg[��YwJ��!�t{��e	�_��$�j��
k��h��fmE_���H%y[
�w�l��5&
���������ɮ�O>V�8A
�1��7N���+j�0��a���:7
����pB��Z������[AOLAC\-!Ɍ�
�^`N��+Z�E�V�����G^t���:���s�=�����Q�;�YZV�7��!�
ޘ��Q�z��`Éx�
+�p�_]�
�ҡ0��Mb�����.AD�%M����� ~�¦�9"N�n��{��&P,���eɭ/�X�[|do���|~��Ƭ�,X�0�Y	���S�xw
���n�buJ
+ӂX
(���
T���e�_R�s��	ӏG]8����� }�Z���Z���)w����A�~o[����F�Ĝ�bU]�*����5~4�I5%���t!è�?u�'۴;J��(�1n•�A�������/���ɞ��tj/��]�٣D/�
��4��z�~�W@b�!�6af�3
����}9v
>��v�X)}:m0��@χ���[�YX��r��(R*u]N��`��
��k_�r8�{ո��`��;Ng{�(M�`
v&{]�ԛu�0>t�(ƻ�7�����
�/ r5�_eA<��I���$ެ���:v�*JEWc���E��R?�::ʵyyHt���
�T�ɓf-F>�6�%%�
����N��_�J�
��?
O<�.�9U:��s�!���n��;�-.[UV�=��.�����
�/gO�8~ǥ�k�<�b]^
�K�]�U[�}��T�2��+E� �.fCJ��ބt������BT��AC�Zp��S���z�O�NC����������J��2�~Yd��a�1�ho [...]
�db�?���^��
�������m�9�
J�v���c��a�Vy�^���>j�;Ԗ=
c
���`j�+{5��
�/�ѫ�B륓����I�=��U;��V�+7-d�6���
�y��1�1��6����z\���+g}����+9y4	���99�~�
+���h�˧����M�Sn���|�5;�|i�V��3�<�{+9�R��	�79��ll��Q�Ϣ��H���J�C�ܮJ�n�@�a��i�����`_��/����zB��N�v8N�^j#�-��7�X1tl��V�]���\�s��^W��Q�,
�lm��?X�1��
3������Q��HL�~<��z6�
���W�hT���:��`��R��e�t��-�d���cS4:��Z�o}��x�E�����h�*�i=h�f���>n\�unTW���N��2,�7�L2�LZ�)���q}���mC��\}��c��\tq}����*�-k��V��x)�U�B����F��J����s����/��u�/s��:��RO5���y���&���vө&T�r�r�6��ӡ�J����n��G�����<�M��

k�d߫��T�R���e�´��&N�
+S�d��}�e�Kw���ﵽ����y�m�y��E�(9�q3�����E�:7	4�m�Eksɛ-��
��e?
rG�i�P��j��=Kl�ƳB�>��V5��QI$cSi'��lwpPF6\����v	+b	�]�`Eh���KE!�4!�.��P�jݓR�G�3�o����<�[/97���|����t֘D�.?�3
�F\���t5�
���R�
�egq���Ì\<��E1[���2΅B���O}.�/�g��E��,�$�C�v����Z.�j�r�/�J:+�����}j7������|�)m���������Ԛ����jT�V,�}�~٬[�2��%�1�s�N� y#:�GL��\�s��
g��N�$��̴�U���6��|*�ݵ��nNI�=�H�e^�Ͽ���4�dt�d�Bw�ӑ����+��u�9�=�>/�^��(ke�pܗ��r,���P|����;z�4�����;��h4�i��9Ð�E�L�f���l]�'�{����qI0yX�`��Bc�,:�(��� [...]
c����&���]!^��BR��3	���v.�^�
ҚP�ɾ�=r
+҅�R/��C*�u� ���
����� R#N��To�قԘ���n�HM���Rbm�8���ڵ����ڋв��XOk_,�·�K�GA��f
 Ը
�i$�
����A�1
����u ���
�@
+d�?��Bm��������b��ދ�A@���3����
+��G���|A�|��BW��f�@ZM��BDr ���o�
�uo
���{/H��H�t���
�Z^��Z��ymqVA���@�)n �
�*L��'=A_{�R�]r�>O���1��=�l���U�^���h�H�p(ThC�W
���V ������P<6 �� 1'@F�4@�T 9�D$��&�`	��K��������o�x�B�qoO���bڠ
�ټ�Y��^	%G�jN�wD���v�g=L_��_ H���S�J�6�y�n
+4@�>��\_Ԙ� m
� %Q�u�ą��8��;O�
��:%?橔�,��]���N���۳͝oM{r����󑨽�VCD� ��+�����W��b������T�vr��
+WP�s��#6�ܿ���9�T��y?�k4��q>��#k����nq���Z�l'Z�$�r���<D at A�&cD���
6p]����e2*�OA�h�ڢ!x�vAv��CrY�$�`G��'����:{
+j,���K�M�W�K���V���5X���
��9��`�i��y�v��9���w�,�?��D��
+�~�|.�%�l�ֶyvMB
��
xP��x�7>�]~�
����+ �S	�e�o�c��i�
px� ��J,����\햑M��o���X���UkƧ������SpMߩ�i�d�=��
v�9:��n�1;}����?�N����r�g6��6��2߷�7!�K
l���;}����{(T!3�rhh�n=|孡t�EG�P�%]�D�~��\@L�	�{����c_�����޻���N�*�+���v�՛���v6��*8zj%ۯ�k��;Xov����hb�B{=��{k�)�Vn�~�?�_�ƼB�a9�r脇Bo���\�Qo��^E��?5���K�%�H��~2��v%�<m+�#�������^��͠�:/Z݁V77�ƚ���B�0[�fb��]Ẅ)
i\�nݨ�RW�����MVW���_ ��M�5������Dܴ�0huoV��_O�\�-�
� �0Z)��t@*����25����[\��|+�ׇ�1���&�ʭ��R���4v
�2�zO�?�������Mi�̤���3�~
��
��
 ;f)�o�" �j���u��HD:�������q/r�Qk��0w^�*ٝEN����\��n�wXoyiV##̤�F��N�u&"��(j���P?��r9RT���T�r�9?X��|��y&�i}��Z�O�/ � �M�6nVݢ�Ū�9�/���%'u�ܮ�a5'�:6�)M�|��N-v���R���.{���z��@�1�f�L�:�JJEGJ!���|���f~Jf��~1��Ӵ�`�
�FU9�
YI+�o x�eҗ�3Jwr��a���N<��y
�z�
�7�i��ņI-����m���
�u��,̥ai
7�W{��Ws7��zz<����iY9\5�
�Ң��~0�
��b����Rx���LQ�
��;P�
+JѦ�����*�o.Q�G�K�����U�v�ͬ9���J
s0R2n&*���BԬ�����IW��e�Ǚ�~&a��t���d�i�p�+�'�Gםn)
+l
~�|TT�EdP&E�Y�	��랾�+��?_he���c'	�Rg yYs��+|�\.xO�.�
+���/�J�_�E�.��=м
+��8b��F��u+�����Cϖ��3��e�~6Zƭ_@�ɚ�]
�bp��{L���6u�qeM������21y�!:��V�]�y���I��˖ar����vB�����N����C6
�K�v�[ΎJ��w
�T�l�����j��.HD���r��k�%w��
N�Zi�MŅʫ�
+���2�%�̉U�V��#��*�EB�C|x�1(s5h��h3l�����嚏�&v*��~������ΡI)����)�}❟�Λ�i}T����;z�j�
�T�̇�kc��eg�d���֕��y!�H�%b!r-G(&���n����ӄm����Pm�����6�҇p�
8p�W
�/�?���Q6 �^%ds��8�5������]6�!7VF.��]L��$,i�nL��;��%���^���o�=y$
�aK��������Y�
��k�����<Ҩ��2N[�D���x�-���������o�%�V�֊�c���e� ��+�ݝ�Z}���:w�=��~�>t��f¾[SU{בS�?y�cR\!:+�CB�
0cϟ`9�sot�){�����@
�JQ��
+�`B��z��Q'�Q��ST,7�����`�|� �]�/���<z��
h���X��
k&nu+F����Q��KI60�1��k٘,2;��wi��EA`U�����|>B��~��ͺW
+��	9޲��0{�*��3��au����S����?`���{���0��|�@\�x	�X�i�c�+��
��I
��K~�NA�*�'�
��eKXr
o��Ƞ<����&O�%���
�U�<�ꓐ�p���.��o�����]9�U�2��/�?���굧��u�V�'ω�{[$�Ͳ��������r֨+�:��yN��w��r�S�5�����7F��I�È�O�k�
J���z�l���������
��}ý����v��BO~��!�P��j}�T�p�v�G�w+��G���
��
^/�-ΞMbEW÷.9ӻ;)�� ��'w��y)qՑ�T�? 3��0\.�TY���c�;!.ݶ�Gͪ3�Wʻ�
,G�B��PT[X��P��-Qϒ�7}�P�/���Գy�6g�mOֹ�Fv��zY*���t�	s�EA�1�o>�5�p�/a	�J�
A���Y�-�aӟ0x<��Ӟ����>h9��i�!ʸ,��<�F�5�d��
��o��X �ݪSCv�z�A0�\WI}vv8#w\���f�8w��KC�,�S�\�
+٘��M�Q��-��N{z�8�_?d���P�5�1�R{��H�X]	+�::z
�
Oȡ7O���^�ʟ�U��֕oI�mID��v�"W�\�/�H=_\���p��C��$
�eKh��ʄTX�/����T�
N�Ƨ�U�:H���X��
��ʎ1g6nc��E7:D!`���/TE$���*5�w����A�j��}x1��}�_a4�s0z=U�/Ϊ�a�?�W���Yv1p��&,O1Ɠ�+��׮^���
�I��Ͻ:���_h�g�Թ=Pn����I�ՉF
i�U�;ݴ��

O:=}6���a��S��	w
�*DZ^C�Z^Q;��i�n*�R� |�?8�z6^0�PU\��z`OJ�h�u]He�'
�
+�
���Q
�)����ݨ-L�����v��cg��;XaS����P��v�Ơ�{ƭ�ڞ����m�b���=�@C0
�F���F������K
����������~^,�7j�O��zT68
�f������l��s��!.�;w���<ۮ����T�Z~�
Z�����>Y۬��|�P����̄���ePo� [�e�{��W�9R��h~Y�,� R�}�2������Λ�?�W�c;�O*�P��"U��k)ðp��
�#{
!�:�PO�m�J�ڬ��h,H��$�q�ֽ�a�>�=���UL�S�޷Z"i
+�6S.��,O.m����z��I�rq�<cE!���v��f�ko%y����m>�ۧ�0�=�l"�h��p_H���u�R���]Ԧ���W�Ȭ��Q�xU��x[.>�C��?�%�]|Ez�'�S��,\�_�Tl>>1F^��C�u�������W�\�7��b��_d�t��dg���1#[��ܧ��Qud�v1���Y�z���J����+�tٟ��r�~�KPb
E�XJ�ɛ��L��z�p�,�|�W�|�>[��m%�f[�qK �7�2�(@�#!#� ��
 ���R@&?)p��x��~�Y���N�rs�|"IL>���|��:���%�&�I��1nf,{g"��)�|�V�	f4Ͱ�?����c�L>
+��bI^�W��O�D�O6��'d7�+)೟4�W37��j~!{������ZeR at 9�)�����m��x�w[��'��PƼ�q�'�{�����a���|
p��EI>�^�ܧ񬔊�G�[#�;D���'c��Ɖ����:
Jz�9�Ҝ��r�u�F�ӵ~�^�4רNS����o�}
+X�=����^O�l-�|���:�(g�KR���k��گ���y���YY���L�[8�[�r%�9d�qo?���ȑѲN�%͑�,��.��w
�y�YJ���VG��0�W�|��M�4��4'�o
��x�	���y�5��;��Ğ��&�U�0~Lă�h�o��|),��qoa<��f���l���%�
�J��zQ���@]��d1n�i�
e�E�?�[��M
E�L���$�[�E��K����<=1�����헋���Ǯz��W��M�X|�r�}��e4������
/Cgh���	�.�� <���I�
�G-�`�
�o��

�����'F3�f�a at Z���;����"��w�?�0mާ���s�K�qdusi�6�B�g��կ@�k�."�-��/
�?�Y�#��T��Ss,�Gu�
+Ȳ��%d�|Fp7 ���+�ޖ9�z�bvD��?6���-
+)X�)�ϾW/��o=y���a��g�P#"!��0��K ��C��N��y�.��!�z��YW���k�˺���p|��e at 5 9�_({;�ѦV
+�:��֕~�^鬮g����7x�i
�H�j�|�I�NT�^y�L�t��vG{xהh���n�+{>�e��*�E�~ Yv���c@�g�vM*�mɐ�M�7˛�lQ_�w�럛����wvv��Ug1�^ ����
9vs�v�i�i{�aSqT����nz�u�M�����RZiQ���w"��i]!U�fˡ�7<�ˆa��_��nx4�Ǧ������۴zY�L���>��C{2�.�z�t�H�
[;���6= 
k�B38c�ږˉ�՗
�Y�od�{�NAbd�iѰ[�zn؊-�X��7@�<��tq�z��v��M-�h_Mj�J��
6������������fr���`rb��J��o���ذ;��%��K��m/�/�"���Y���ћ^������R�e]���^
W
�˦�U����8/�
���ۊÖ�-��^�Xu��L;��l&I�l���<�qv�{�,��}0ԥ
-��NHmU�/�c]�oT7�1��7[#b<[�Bp�����򬈄�?dG�����b�\x��c���ӹ��
�h��/���w��漥�W]���أ{ط*ܒ6�"׸-�zc�@җ57����H�����c�<��o���|��

OكDM!)��B\Ԛ��?.)ru �7R��'YW6�1��.��z�?
��f�jt���o�h�\@�D�����Ak��jf�Cw�pS�s�Hϗ����9I�L�k�n�F|3��,�ۻ�M�F9���j�����N�H񥼗tu�H=�R�VG��K��>���kU��ķ���
�w+��mw��Y [...]
��QO^�Y�
��&͵)�n����0�(L�j/[

�6�NLq�N��5�yg��#�ۤH�#�X�|xI�u�n��z��^
+^u�?�U�eg��~uJ�f[*LkR�ה�w
�0�����H�����̳=z���g����6N�d��.�(��(+�Q�?Σh�$B:nߴ�$�Q#���i�L����������A�̮�n�2�֋��\���zv�JF�>�Ove��roЪM�c�]n�|���-�e�}�*��2��M���Q�0��Av�1�ܢ�`X��Ii=�����`,�̀Sf���򘪃ץAY�
3�W��ie{�θ'�L��	����P�]m�u�z��+��L�޳����gE��˦P��._��W��I�U��q'w��t,�����c�3m�)�c�y�������ɋ�������[���2� ���z(Y�g&�]
3��A��p�V�� ��G�U"zq�Q�|L�����W���r�
�
+��}��:�yu�2ˢ��6�0h ]m����#����n�*?܆�&C��Rk����CTX!�����i��Vˡ`g3�x2L)M8�c�����ǻ9Wa��e�e�g	�"x?���Q
+\�Vض
�F���˼��~7U��UX�AF'K��=�L
����V��:~v�
Q��}�~�"�~�Ĥj��ʫ��ί,7��#�
��v��ƣxV�"i��r��SS�dӴ'T

+�f�_/|m�?�+Mc-.�F�|�eg��$�bC�ɢ8?`lFH=���6{
D��9����{^Q�����m�:�%����?���Z���׫g���vL5����^bGJ����tEq]�..ܮ�3f
�Μ�GO��2��φ�]�1j����"���#,>���@o�f�!0�>v2���@
�C
��m�ZW̼�
�y �8�2�۴���
UϮM�a���P/ᨬv��h�-{��K#�1�l�$������o�t��Sx��A�!��<�pl�Ph
��
9�\��?����b`�AnP*u�hA���q�uϳzk�r���ѣ�_��vś���v6��/�e�= �g��[��g�KX���dN�1��O�0g���*;+7�`O
+3;
J���P�R����`�b��+�Q�}FH,��<az�-	>��wR=���Q�`ݣ�#�9t���ѝ�ۗ�?~��F��[��
7��B�"
Q�Ƴ3MY�4Qܬ-��	���G��w�ܟ�Y���akȯ�39�=��
�� �,b�
����֕h��
z�>Fđ0�����\��Kg*3�N��B:��s��hǢu������k
n
h�m�=g��k/5�H�f
Ӂ��o>��PY�c-�v�P
�Γ�r�P�o8����}��f?�;Z���^u
�ɮY�^jX��p���	<?�����;���$m�r��rI at m��Vв��k�V���/.s��̎�_�=�oM/�2�>���Ŏ����x���w.�Š�~��/�О�
r�&Y��H�D����NK��{9
?�ьK0B��5����J�ZT�7}��m�ʣ�����V�L��i�`��܀�G�%�%��[r��
Ý
��R�����A�񒯏�]o@H�E0�<m 2���%4k��޼�
�T�t&-O�.Z4��Z �?4�
7�
��.�{�5�x
׏ B��*�.MЫ����
�P5"�Quv����O��� ��`
��J�Iu[1���-͏t�.�K�@�����	FZܳ
+ ��ܔ�J��<�k�V�WS�1U�mO��|�W�Z˩"qWy~T1F�w�ߦ*P�d��1�yٽ�e�\�1����u���F
w[1��t�J�*��bPѦ�����,�	�~'����v�Y%������͎`
�2���n ��w[�;����S���]��F����vsK�U}W�{�"��b�zB�qH�@�z��ƃ�
+�u�ZP�X��n� w�+:�?�1�Y>6�^t��<dz�TxB׺4V2!���V��;��O�]����
Dl��2#�{�m
���)���O�p�
e6/K�0��n>އA�W�>�!ׇ
O��5
+6
ho�/�W����2���!�A�H\p���2E�/��d��Q�܇}����F�y���J�n�Kkd�.��X�X�8mP�6h�v��x'��l���[0]����
U�8. i��K&�ɘ5�0+��C�z+��w��%ۖ>	�!�$�-�q��%��)��>�O�PH�w���W� yK6y��Y��kv�}���(c�dl��X�ܡ�W��n��}��M b5�8m��
+���-�{�D��C�ڃ����@3��d>߻|���|R(M>UJ>3��|��0��!y?$-y��n�>7�[����.&�K��A�3�h�a��� �8Ӗ��
��_
:��,
����AR+��%.�n���	��r>
�/�����o�������<�e�N>�B�z��\�G,��u�sF�L>0���6���j��C�����WQ
�왧������m�����\��8�$zv)2�A=L�Y-��|��6�?�����
f4�iai�<�
��\��R��S`�RS�m�	�6��=>�� zV���?�ܣ�WK?߼Ԭ�e{Ӿ��]�6]E��3G�
4&q�W�Q_��B`<��Z����j���+gn��+�
+�C�E��Y���l�K�<�-0C*���
���7�ڔ/�7
���jֽ�T�ی����D1�X=������tW�a��
�K��p
�>,{S��<�,�=��`|�i��~�狻g�-얖U�
�i�YxL蛽����y|����p��o�)D*uWmh
�/�lޏLџ���]f
�_]A��]���r�
��su�ONR�;^��xl{��ACxg��~ѡ��k�7�+���	�l6j��)g_��ian- �~��/i���i~��a���H
(�-/g]]�_�ǹ
�o��މ��]G�u�V!w:k���v@\��/���.�
���?`�Af��4��vj�-3�T6���@�
�ޗ�?Հ�J
K�w{Y��}�����!����<o�Yp�WZ����ն���8�0^r�BXp�l����cg��썷���J�L�#�Q7�-��T*��if�6��oAl����k�)9O��W� �!b�,�$�Ȳ?���.�/k4n'V�\~�����/Y��(-P�(
n�� �˿�
��_
t���Jx��GD��\��C�m�sje��pq��_��U��X���{P��l���}ϱ����bS[�a�+˜5:��f�l
L�z�.'9,0�����\�
�X�*�}1�Y����GZ�GaZ84�5���g�Q.��<W��Fݽ��oN[VRki�VѾ�e������8���^��
���5V��ē�hV뼻�(Y�~�ͮF�f���UZt�mx>זc���9�`l]�wy��kCA���fſd]]R�3����OW��{�ÃZ-vn
[n�t������=4������b�67�e������l�e�b�v��
��P�wi���ۅ��'����
7����ڌ>8�8�`��t����/E_BU���?�7����
�>
�t]
����f�B��n+w�w(����s�Y�jm/����S3�͈�
��5�
!sl�
t���)>�3�.�'��P�sP�q�
w
�H£'_��TV��Z�q���"����������/�&�.{9t}}�k��n�1�C�.y��;������}X��qdt�F:6㼞�`��y�M-s�Y��L�r�V���	�ʩ_W���3e�N����bm?�ǰӚ`��(&�抉�;�� w�r�C���(�����.�7�f��u;�gf����as-��{��T��fq{���Asu��Mgk�S��RE=�†Z���yy:�iI����q�I
+
���si=
+�U���ek1��2���ӗ��g��8�><���l�VnS�{	���c񟷰T����.G�|pt��
+ ���Y{d�X�v}+�`Y����;W�%�]dҿ4pцڬP]E(�&?r�[.��1ǭ�%��%M�6
�������0B�
]9���m1Zl�rQ�p$���dl���z1^��:LJ���,|=+���M���Ҷ���]
 	�V��u����-x���Ɔ�z�
E�r�R�I��g��X�:�q�1 at GᲮ�ۅ�6�����
�#�K}
�v�����z	�
�
���b?��E
3�J�����b�O�
7P�|���V<1��Kt�cN�#��o���ZL���,�6�
+[u6� �
u����o�o�������w��̣��K��
�Ӭ��8�������Rކ�(���Md�,>C=x�3OtU
��
�Z2����<�
F���7�؞�<T��\�W�f���L�?҈ڈ��a�A_�E��bO��WB9�֢
L�����2��?��c����)���當����
�P
�x
+�)�ҋG�Gt���g�#�\7�#p�d-w�������U&1'ֺ/V.A��HJ�}4��@�w%@W�	��!���ɀd�Փ,�X�,v�����
�
+�	K���砹��5ͳXY��� ,gЛ��ۙq�>��J�2�oN]����>���F}l��,�W��8l��ѭr��zt\b���F=�KQm'}�����1r�چ�
��
+!6@!ö~@b� �/�!��l~�
z�v./K_�|4��)Śt�@{Z+#XU�����/
!+���mzK�X�x���xfT�1y4��o̠�Ih��
�G�r=[� ���Jv^��5�����[2�ֵ<�;!~����o�g��󷂰��/�>z՜ҹ���7�;�5��:��h��	Y�vE�Fg9�f"q���Y��ڣ����
h]��
+_<�MO��eE,��$#������`WS�/��>:,��W��W�a�h�6�h����71t��kx��׭c�35/��<K)��lO��,@�
�������^�#oPe��ݠ?V����nGna�DB�v��M4�~�G��@
��X�JdÉ��:+脒��CɾI�d���dy����{��îV�ճ
+�Xw�&�/L�Ϋ!�jv�����͋�Vb�;�>z��.��� �3�
ӕN��

`iM�{�!;�Z
+�

zr'�7�~����n{Z�ȓވ���v��#
�� 
� i��6�.?[�a#�V�7lBK���h�Y��m��Wn�i(��sx|�a%�ޞ�4��T���I����ɋT	�C��8�� �/�fy�aC��FW�^��N:�^�
�**r����w. t�L:���w�v���vZ�|�i����߳�s#��<���
J�d���?���D�
+)�=��:���lm
+����U�[�����#O�귊�޶����E��J�{��j�+J 
8�`->����n/^�G{�,:�E�+�l۬6�]{?���찚�o.,+յ�ې�AX���,Bw�4�"5b*��}b� X��A��t�ҢB���/�*[]C&��'���X�?tf�5�oz�½W��^��v+uu�E<Or
ؐ^�c�[����&u�L�)X6
��k������M�0����6����M��0���S�g(���Ѥ�O�[��{���vv@�{�����݁�7M�_;�k�B���zi�z?	�E�c+��nM���5Pm��V�E�,�
:fՎ�չ&�l�&Mi�&��ָ���q���Χm%�H$��){�t��
x�|���Ur��~����w⍭yO�J��oL�.�M�^G/t�\�Nj�v��Zӥ[
;�:˵n��jV�̛�v�R4��:4�3�r����Ԭ2�T]����0����,��g��X�>MU��·�zC�X����{m��:z��n�v�Ѩ���:�7h�C��0���\0*�s�
.�f�A�!���5
�T�����9���ã�nڥ"{	�����m@��I��I�N��
�-�XS�_���^�I�>D�!��CU׍l�2H*�
+��j��7�ŒN�
h�M�$,���R�V���r<TE�n
�/�h�<����"�B+\h�����n~n����G-] `)���20(�k`�����YD2"��_�ETղ�
+K��g)�7&q�b���h�OvXl��٧�|.O��&o%溿�{oz��F��T�T�k�U�ݯz3�u��7FH�Ed$
�7�)�c���S�������� ��6�sL��|�@3��?�m�6�����8A�7�
�V4�?/�J�l�
+� ���<���#�#��6�-�H�`M{ @t(Cn De��p�����`��(C�2.@ �M�D-e�@������ ��,d0�_�A�3�A򩴶�[��ɻ
f��N�&�e�K�ͭ������t�+I�#f����
�T���$II�P�ϒ�jƫ��T�P��.
�`;ޫ R�G�&��QѸ�~ G�}��gԨ���%f�Z�,�)�M>@i���C򞋷�M�ɻYj$�"�Oҫ���
&
3\m���NI�o�4c��8B��E�xD헷��^�K>��Xx�ڼ���H�k
��$��@w��+�ri�+��o
6��2�M�R�,d*��r�Y/__ɧZ/&�#�Jދu��_
|����t�$9>:���������)�g��g��j���H5뱪Ĵ������^�Zt�P?|M��p�Z>�>~\I���=z�%0#Hf�N�&�eo�]
+�����I>�X�n���$�H&�q�b'����?�i޺o�����vy!�j�q
}�g���'zd0Z��j���������H��{垷���$��l���":6WRx�2Lx���/)��f�
�,Е�Js��1���{��O?�%T�t����?�(Gf;�?��so=��,�#��[�6(7$������Õ��׋��o�����[�����(�{Gy::���=��:H{�K@,�s 
���}˧?dq�7�zr��Ns�'Hs;�x�9'οơQ�_*(��׍hКtC�>
\
W���n4�\P�T���Q��C�
���{�����~����n9R�Y,H��'��� ����eS���ڪ
���y\�o����̗�Yp�6���:͗�C�h�4?>>^P�|ޢX�Gx5͎�+x0�� k�Qm#���(vw�駿܋t�`�EiKߠ��#�f�B�M�d�5������T��

5W�x�z�W�p�l�wL���+�m�g�����]q��X���zqJ��K��ګ���.$���Yxf	�ޒ� [...]
'�
���}��jS6�w9��ے�-@��v�g��g�p)"�ұ^ >�<
7�}I��Oj9ח�z�Ⱦ�x�VH�Js�E��ۼc^��K>�cL<����:�-C��?�������y�.��ű��Ӧ{㏵V��Xլ�H{9)a�q
"����"�i�}B�|h���7{}Y�Zʱe�8�������ܲ��:d��t���ݍ���oB�k'f�=^��`�gSʮ�P~;

V
�
�Qump���(�,���ø`��"��Ew2�^�;��-��}@ɸf/��
iF��|���մ\��j��s*/�}����W���#_�����P����U1/�{n�����n�
`�>���c�k^
��
�lA�Bz)�g�
,�y�ch���G�9­0[�h��Ɣ����\�Z!�LnOE�`�����"b����
O�2�O��2ceM�ta~Y����!�	�q�!M|i:^��6��Wo�M�b��M��g\�b�-
���z�nW�g�6�̊#"�B|/Q�U7�
�6$_n`C��FO��69��Cq��&�h*�J��z,8�
	$-�R*�B�Y[~�>�%k�<��n���O��d[!�#��Lp7%��S��-S���1������n�S]+���Tk��~�w>+���&ñ����^7���Ab"h-���vc!ϿT�95lnۚ�86

�݆
��ӌ��e�e�����6
�w�0�g������4�
���VŘV�P�������걳�RW�|�9W�V`�!���L爛8�L���M��F*�>T�)T�GC�
�d�#�"��f��i��2c�Vi2��u9���Dz2���`�9M����Wџ�Cڵ���.��T�Ni��iC�o�l����jw������<��
	���dP �"�F;��o���������U&n�/���
�Y4�"7�^�9s��-��/F�7������e��k�9l�9<��t[�Z�j
�g��
̣X���� u���fd֙V��PQ��X�z�4y�eM�C�•˯�چ
�̞�V�,�e �+8U��Xu�:����t>3zP�}*]G*�D=*�*BF�}�~ZL�_BFH�u����񞉬���A6&��=|�F44��Ն�J
L��@zb*w>;�6� �ΗW��U���mx��XyA��,�ܘ{�0�R��ˈ@�wM���쫤~���5-&i]���e,g�w[��
+Ɂ��"D�#��]��Жp��2�[�j=�Mk�%���
��;��+B�
�}"[I�p�
3c%�����E����G��jט�[��r�[��� L2�9�
G�ay�f����1��x����d�e����9�C�
J�����
�a�	c���g�|sie@�V&o��ɢ�9�M��H���8��s��6��:���|�<6�E{��j�������"��
��I�'jLG�%K\�M�s›ä�7��K.������˱Ǿ�c1�=s_�m�ˏ�
j���k��j�y�H�|����T�C?�e�Ch8����H�<$�x�4�zoM�}
Uh�Y�ʗ!'�B�x ?
�u��`��~���}�>
~�~�h���H��z�%��eU��
+���'���n�,�%Oު3��b�&3�y�����#�y3������\
�7�5�����|��/R�NW)0?]���
�9bML�+D?
�s�3輔j��l�;������6l��
�]�	4

�hxWд{�~�2�u$h�GC��R+���
�sy����umbo�o����8���- ���j��s=j�Ir��pg�a5
�D3GX�����֩���y'��}��K�A<,�N]�9����}![Y��5�i`�
�`x�Vbl��?l�Vq���X�Y81�98���-*�e�*���'��2�R��y�J��(�\�E�> �~���Y�
�U]
 I��D��,��A?f匒q��c�(�l��&ik�+<
J����:'
�f�n���n�p�n�������c挞=�l/iN�w�i�!�&�j��ז�Xz
�A�~��փh
9|�Tj����O/ �w�C�٧��TG����Y����RY���:ga��N�ʅ	��M�l
+����D�7�d�7p#��#T7��U��-j�C)H���$We;|���B� +=�_��9���-7ytŖh���F�ѽ�s) ��V�Gg��6�����-
���#�J�^�h��
+<�e
+u��>M��������6
�
5
�"5��n�3
}�-ҩ��0�mr$c�����n^
�PN��2Xxi�2��
�
_aW�_������Pmt:�#
+ǧ
�Ze.��j�?
�4�\�&86����,T�ņ���R
׷�ԨsZ�R�D��֡�Fա�eR��;�����7Sf��E���v�6^��Mj
�Jxl��ņq�ܽ�O
ZC
�6�l�hҔ�o����6����$�(�[>;���e��h���E��j��*�n�ڞ�ɊV��*��u_��q���!t�/x��0�_
,I5-��r�]��
'n�
�j�q��e�I��^�+��L�Y�غ�%E��Q�WP�
+Ψ̓�(��((�N8�z�������
�σU�,2!�EV����k��t]۝Fa���8�*����. ��*
+��[�,�ӠSr��V�Ԥ��L����z�b���$�`�� I��Xi� �]� ��t!)74�b��9<��^����:�
�������`�m�@|' )B5���i@,��Mg]~@���7$3��D���
��6 V�f9��O�]���ZV.���a�X���)[͝��3_�q��;`Z{e�`Z�،��ѱ 
�kt�$��M��9
��Zō		�R����|x���qT�StU��M���ga
��}n����P���
�sO ��j	����/
�
����hr|h�Q h�I�4 � ���a��" �h�_�,e���%���v#����M|ϹP˱��
�*V��Kn�F�B�¾�]�.v7 �v��n7hsuh�q������S
`�
0l�̈��擝�`6�
�D0�0��X��l�R�*��E���M|�A�e�
+���Pm��[��]��i	9�dy c�����$�F�}V �27 #
v�0(� f�=fe �8d�+0��#
+`������<\���B[T��E��>��fzi����<,ӷ�9�.O��
+��/�5Kӷ�JӅ{LS���i�]�Xai*�
I�X��y��� ��2�Y�g��5eC��\V��3�

��C$E��I����zt�����Z�k whx��?���#
�g����] ǿ9�C�M_��&})�K�*�4���4�OY�[4
�ӻq����q?e������3���	���R���K�y�
��u/ӕk#�?�eT�k��O�3�Dk���(:=J��?����0K��`�O�
o��#J� wK_�Y>}ͿYp�̰�_�]���#c�Y�Ӈt���������l�Y����4�
���ڴ����
�Γ|�|zH4v�7{-q�}�$68
+MesX�T������K�q
+N�
&Y��Q�u�~��*}_�]���o��nZ�?A��7�u���
���u���9w5/�x��oE�=O6���<=s���H��
�礭��$W1���;�%�w�#=�>��
�"��"�
*��-���~��,�<_Y�ǫ��Xw����|r�<�5y<��u۝K���x�/x��)p���rD'
��Ir��z��r�����tͲ���}{�F>n�Ri�O�=Ʊ)M�V6۰����?��Ȝ���<[�(c�� ��@�0��O~�}r֩����x�.�]�pJ��%����'�}����]�aշ#�F㋷�c\f�Q%�#���7��
7\�3
�üvX*\K�.�Ux�����K~�y�h=�б?Y^��di�
���=d�qYx�����,�k��+W�Ww�4s�3rn'�A��o�d�5ag=��y�Zٯ
�Y(���z%��uq�a�nգV�ݡ��l��O����靦u�3E}�����rҭ���4`]�Iu7W�Y�л�
ޛ�!
I��r]�z�6��Q��&���gWE���͉���u�EL���>���%ߍV��;��{������9�aqT]N���98�y�͹o�)��z5
d�2
�-��X�s�PLg�`�����*�6��G��M�r}8EJ��_���ϯ��K��]bv�k��RD�
�{NXiק�'�m�Y����K�h��Yk�.���ͷ���}ށ�{i�8��,��L�ˌ����P)}�T��)�[��K>O�ѮfQ~�=v�^o�&������}��q�G�iNN
u���w��鵉n���B;�4I��
��5p�w�v��^��i9���tk���ݬ���h��L�r�Xz�j�M���͌�H�]*f��e?��
ߎ�E��=TQwXi�z����ky�w�B�d��
"r�d��P���UO���I�T�;y�/�3m�)A�:�z��
(}{jv$w2a��z,� [...]
+��:�S`�?pt� ��8�f�,�	�
�E����[:'�.��7z)l�xF��u���
�d�
�ۅ��p{���zJ�����L�9q�����x�huu���i�Udpl/�k �}�?Du�t�V�uz�f����g�J�3����QGs���?���P�=���ugD�
ǯkr��qG����`���v�8=z�	�������\W�
r8�&UkX}�� ��������{o`���7��o�)��?��l𦶨*��3�ݮ��&]��n�5/TT%eT�@ȪR�_�\
���YQۈN�
$��L�,�J5	���>�p��{�4�2�7bB�73���8�ل%i��ƥ6�z��6�Q]���jH;h<gܻ�g��sYU6��ȃD��#y�>�ect��'f at e3qüJ�C�������vȫayy�|k���g��W�FΏ���n:�'��(���^
�f}��H�z����ԭ
~@�3��5���w$���$��1Rb��Rj]����HI�iK��n�B�E
s���
S�E���
��?�jXq


qW.��Y�;�&�=;�

�6R=�38 �r�h�
b
Q=چ::�&r6����8U�-K�W#G�����筝�˛�O��
,��=@��l]�K�e'���Nz�a��J
+� �/���2#�f���5���w��}}:Q�
����������{X�=ܰ��b�i0��2���#+[������9�Fw��M"	�s�	t^
���F�`\��L�9߱�w�3S��ߙ��Y������ޣ
�J�
���cqT�0:�6�x
V�޸��Ko�?z�P��v��L����d�á ȭV��JX�j��1
���*��b��B4�
�n��fx[� �]
�6���gn���v1ZsG���_�/f��;��]��E~N	{\�*VnP|
{�|����M�	?���ɽ+^U
5�(Py�PҸx��in#
Oq�g5�=o�{O��Av�k��׃�<���UYa�����<�ba!=�0��؞�1�6����bK
������}�XGc
bJ5*eS�6��Y�

-M$�]�\�.?��;���ޔ�K~�o/�Ҝ�	��I
�35���>�i[ag
�f��f�+
��yfHTL�av��<�u��2�Ǩ]��&Eg(Y�1����%Z�=0q�wan��y�� �ҨF���X'��jq}�4f��t�Чx�P���\�r=�Ӂ�4p2��v�T��k��O{��;��$L{� ���
��u��ujzfX�odJ�!��z��
���9��_6E#�|r�]e���ˠ��_�R�-F���=Ru���G�m >r^,��� �s@��*���H{S�Hn
��\}��l?n�̩��
*c3�а�����|�ɵ��H,�Et�I�(�Ѐ�4���D�3�R�������B�v|�'�\���
�:w��0����^�ּ#�ؚ_y�$+��q��������{A�9�s,��o���r]�YÃ�
`��\xK�9���Լ�_ �u۲�u����
֭/�[��_~@lC��/���
�5�g'�ٱ:��$����U�?�XxW{
~�<g������-f�z�ƌ<��̢JOk�J�;�b�#O.6����|��#D�9�כ�/���A�5�)�6�'�
Ŷ�
���
�
[N
�.
2x��x�K]s����]�mv�f�Or�M�d{q��!�#��3ќ���C�mMq��H~nϔ�H
�,E�����;��Uc!bq�kX
ݍ���6G�$�FP�<���8�=WA7�Q[l���n��'m��Q�I��I�c��'z� }�j�\��
��W�ǃ��ڨ*7q���|9��+�]�C�	QL!��MV/ۭx�`�x��g\D�O9��
�!��(���0���|�d��p��}�=�~`ﲃaa�`�|L�d����E}ed}�
�/?����ڇ��9��q��h���MS+[JA& �ё�#׼N"���

��9r>�v��e3͏��|�\�f�j,�u��/�z#��8
�㬅�������J���e-�kڡ���j����jÚ
+	�+I��T��(��&6������n�0�$\��
4�S
E`���o�}�L?��X��5��{�錛��m���,k��Vh�X
 ��wC�\�$x��	?�
+�4��u�*�	��d��
��Tb�y��ڌ���jp�خ]�b�p*�#��u���d	3=S�O��
Y��ېiI�U�5��a��Ν�:�#֜�Q�5���M��VG�,=��qv�E�6+�5�+��d
����}A"�� Q��u4c�u
���K�L\6�詤mx����S��v��ݷ��E2�N�ZKu	��&��9��`�
Rc��f�*��'6cI�M"a=�:�*����Q2����J��x��{
/��Q���(!�9t4@�F0@� �1�DP�e8{�8H @�>$@��>@�� N](�f��/C�;����CV.��`��LdY�����ZQ�=���pWׂ�b��*v�V�ט�9��M�
Rv�� ȹ���{�I�����f�P��� �e�.@���
�����w�(�vG �7�
�b
��/F.���$�� ��R�A�|��
g�W��
O�}p��
+
�B�]��16���
P�1(ϟ��e{^ �
:'��:;4vz�F� =v 
�Y��=�A�E��0�)0���^43�!��{FP�Hj_��'d�1`(3��NAi^
ձ�'��n�^;t�c���
�&
����9�͹ 
�2�-�7��O���m񐝞�g����� �

��^�O�X� v��v/
 � ��!T
�k4V���|F��M}��8H_R��i�Ҵ��2n�4��Q������`PƬ��`�T �Q?u����(��sY��ϼ
����<��}����=D��{�j|n1�)޴���ٚ|5>c��X��K"��ov��.����#��w��O_�QKӗ���
�M��u�{΂+�2z�����k��G'�!��=l
�?�]9=Ʒ�No����jvѿ����p��K���ė�g
�Ag|S�Ov����]b%iZ$N�H������m	�,֒��O��?Ѿ�Q�j���ګ4�&����B���W�?�~��虸��
sm̏���s�/�򩟭­�׹�鮔�WI���0a���l��c~|��C��!3S���f����hW��ٓ�_����/� ���M��QJ��g�K����u�f����j�
�z�>R�k�d+�˥\?�r��2�8�2� ��p\�q�Xh��A2��>�Q־B�ήα������_1�
�hR�����
6L���K�:��?��s�K�A�F��`Y���/m�d��:O����U�����<���4ӴG�n򟣀q�A��ʾˡ�'�~
�����V��ħ�v��:�D�G���emf���a�O
�+����ik���|1|7�q5�.j�����"��'F�aa1�4������e5~��%�:$k�ӳo�I���CiRY���i
���6�N�KD�N�͜z�{���E���
�\�C��T�VkǔVe`�Zo��bA�Q�|c�
�$W)/�	G.�#/�m_rӞ$���i�K�yN����ȕ��A������	�	?�轶����=Ո:�̬^>��|
(�`��hU>掁�Vo�~	��~��{Ɋ-y#Y����@��6g��Nʆ�9#{.ZS��&�3�y� �"�g�~ۙU�
�~��9i��s�/`r���?�39�D>�
Xَ�ly�5t��!nUYB����i\��W��\��z1k�;���'��G6{B��x�t
+[�:_�bt^<&��AҬ
+��'�]����jӇi�U��$�q ����}W���B�0�Z�����8�hv��7�VUY��-�Ö�j�_0	��<�
�ٙ�׬��KK5�i=�w�~�{��ez��t���'g�P�`�G˺i���wU�FO{?3o<2�2s
����|��_^�*:�d�?��*�\/��2��K��:f���n�c����o��ƞj7lo0
����y�	>]y�4��������p2?��i�N.o�9�6=������?�+�7�n��SN�߇�t��/?�����n�e���pak]Ox��v���9�ZL��4$.N0�>�����1
� 9!�wۢ��2v��� r��r�Q0{�#�[��C�ƃx&�����B,��a�Ik�@K%�g��Y� ��n��U�^s�N+(��㨪
+J^��H]�|��M:�.�T:;�����{�25���z8bi���)
+9Zu����R�aeAi�^��k��.57�
����=+5N����t�ۗ4ʣ�h����q�ss�n!h�ԕ�����s�?��I�\(Z�v��b�5>��\��'��yo1��fz�lh�z��a7�dw�������9㔆��q�֛L���x�c�a��Z���ˮ+����Z�y�TPae��Y��P}��Vw���+Ƚi�)��6�
���
N�d�ų]�YW� �Q���B��m#�0�q
�(��Q�a����hv
+�!�֌1���)��՜$8�=l
+Z��v�~�����U�L�J�K�R��G�wr^2l�*��N�R+�5�,+q\&?�972ޭ���q7j?_L�䎭%�H+s
��)�oﲧ�}d���}��>����{�wo�~�y�����v�hKv���Ui#*�f�)��f �a*
Ç'!��N
�C�!��+&PX'��w���"���<�zƢ�K�/��W7�gC�V�o-��<k���J����wX��>�tV������޵%1�ufP�J,��Z���R3B6n
+%T[�����0�do.L������k��T���
�x~�x>\��|w����f(���w��]Z����Ѵ�y�<�|*�qG8�Ø^��#�i�l�t"-� N�b��R+�R^���ܬ�ai$<�~S"Q���y˝t
f��W��Y��]�{j�hK�̅����IgʅS񞑖��n4��
���%O����]j�\��|Kw��Y�z3��"4�j6���?SZ�ӕ3PՍ�W���&���[]אh=��m-������E~�������YO�s�}�*�����[��W]��+���g�*ta�
���¿��}r��4�\x�ؚ
�u�j��p�k�J~��` �ŀ��m^����L�L�붗
+�������:�n�
�0�x�5f�+m�i��.�m�&�5�
���m�C_x2�ӢL��U�6�Հ6��D�&}(���/Ls�����}k_%�՚Gl�<�`�w
x���Ǵ+��@�nc�
F3�V>“x�f^�u����
ă2^k���Kr�>�f{^f�Um�5�3�
�!�u�7j�S �4��l
��
(RA��E�z��̭ꗰ|x�Nߤ�qd�d�����'��W�L,���~߫4CxZ��y��E'w�F�����upK����iZ����P�m4�83�Y����4��{�T�'�s;^����B�C�@,�F�UR#���	>�E�S%]�˪�ڴ��ʑ�D��B—g�M|�.[+�0��n'��G����e_qzQ;�����6v�OVb���$��i
���}�����A!��L�1�?5���P
I���TU��Wq����
K�
+�~�8�4+_��;ܵ}w;لMs}.~�������I�����
.�-�l߱�̩�,t
+Ŵ�"g��5��
+�
j�
�-P"��m|U�(xq��7#�#
t[7��~�}�C�3n"�ߞV�!g����*!���_x�-�
m
1��Շ{q��98��/Y]x��r���z�&3PW��
R�"�H��ɶ�
��	a��H%\�U��}
�
�
�+
+kI
�N���6^��[�VkN>ߜ
W^s���9m��C�9Q7�/
�e�Y/�q�|U(�K�B��W�q�^8mWKP�1ӾF�W'��kW��1�+
,�Y#��9gt_ۧ? ��_�H�*V��m�.8G����м�A�I�w����M�
�'�x}�0��0���`�G\a^� �'W��8����Ǝ��W�F}���v+��4�AT�3vȗG����h�Uо)�*ʃ����1�������
qi�D.m�P/��B�� F��&�
����Y�_/:�Um�6n��t_�ni����긺E��o�-Tu�,�ev����!z`�LI�.�T<����nW�Z���� �Ҝ룇�F�[$U�`������9�˗ܴ^�0�uzqM+��ZuuxVwJ._5�X�
+_L�r��J�Y4��y�-��ϱt��|i*|����Z%%2�fc��h�K�w��e:/�$�zuH�!+]M:��
�l���0��yIzfc��b�lM�+����Ԛvք
+r»e���Kw��lq���.��i�>
�9L����^�U2kFz2ԑ�D�&��%�j�EQ�"Ԋ@(�f�k��L�%�����.>o����i/��k��
���k\3����i#�L5}���W���no߁�r����7�q7
�g�)t��Pe�]~�Y��-���=�
�S*��? pFs �� 6uA �$�
�Q��`J6�Ĕq��w
m�y�I��GU�M�|���=n��z��E���'f�^o`�'������Up=O�B��9d�� n�
�� v |�3�#�v/ R�
� � t�D��Z̸0 Q��  #���rٵ9��e@<SA/i -O�f����G1����tC���mQ����uV�:�	ա�D�7�X��@$���F�e
��,�Z���3� �|;$ʼR=ֲٸ�d\�,��
�q-��˽��9�7r
P�W
P5�P�J���f:�?k��E��^-�D���>�ݱs*C�j��˒�wmH2oゞC�z�� r���H� EN� %��2�
@���v�
��@�f��J��� �=�Ϯ��>o }�� }�J Sh�3�
���g�~Qg��=B9sx�S� ��b�h���:2G�����fњ��zP0�]�dn��囷���?+�M2 hW��� S*� �E� F�d�
�yZ
�RH`ţ���
`gX-�! �:�lH� 6Y?3>��LovH_�HK_EELS�Τi;����i��d��]ҴS�g
�?��T�d�uS}.˨��c�|uz�����=l�ֿ�ѳ
���0�i��v����j���K֨�Q�/2k���t�1_��H_�s�di��,�
�E�����f1V�
�7�z��
+.=��⾊��f���M���X[�զL������H{�%�z��0��E0��z��]�
NT�x$i�)&������%Z׎�U�2��1?��/���L�����7M;��+����Ne1��ۆ��t����o��$I�~Ӯ���x�K�B��,�ͳU(cg|��'���OTD��S�Ԅ݋�q�GǼ�L�Ț�0�����C����8Q�b<���1�=�ѥ)��s��Y�\��y&�4����Դ,е��z�}����q������
+�,�m�8.��s���A�l�����v1�6v���n�y��;��ecd�#���6w�an�S}:�}
+�{��^�*��_6��o,z��������HfLƢ�E����a׻�q����K-I׳�`��� 1w���oڛ8ّ��
��r����������YOk!P���
�'Wم�"���=	*�u�o�Y����*Ejy�_�H�юˢ����@����x-ܶK�<O�y���n�
���Q�h"���L�еD'
Z��ƈV���_���
l��G���{J �g~j��!�����8T�X727\�ܧ��9�1�p�w
qrA
��R����S:����֓{B4K\ƶ�u�
8��7p��w��<�Kf�5��X�WJ���u}�����Q'
����Y����v�

+�_�g�V�,Y�Z��U�WTt�_
n.Z}�~*�<j=��D+M��9m��ƗI������J��}��Ǣ
+v������d�<;�ZtG�0��A�Kz���bMjaw&
בM��D3��૱��fs�>-��뵞�<��U������]o
+Ӿ��&�m�OF*YעmY�X<�g��͗�n�R3�M\��7�}��{�X�z<͓�M����b�EA|���(�N�Y�{��=*97j΋�#9�$Ƕ�Co��0y�?YY<�����	�������h�X�Nc�<y����6Yj��9Ì�����h���ރ��UU-��{����lD��[\~�Cq{|F&���%��7�=��
�/��
L�
T���rú
�Ef����{�(f��fn̛#�.ڣl��
��<D�u��|�����r>
1�h�ec�o��y��zxkU�ؔ���-��M5��l���U
�����]����k_�Ͳn͟�����v�-0?x�l��~c���0�Y�,ڝ��r�YZ������@�d��i��{�E�>�9-eú� H[c��i�c��]�U͞��A���r8��z��z��E}�/�s��f�-Z؍�bN�R�
i�2;��0���1T�kn�
�R����F_Q-��ֲg�'�G�I��B�
+��k5��笮�
�>��
?U����0�(E�}��vJ�\ r�\�C�?��-3��h�Ż�<��R7����X�Y��&1I~�
V�z�?�hb�X�ѻvH�G��E}V��K��
���[�ʂ�5ĚZ4ܑ�&[G�b@�����IjR��/ ����&��q$�t8�:����C
ܦ� ���C���w{pom��:?3=��nz��~�L������h�H�ٛ��z�R-�;��+�+�XSK���t�3!o�GF�q9I:x�����xZ�++o�¤W�$i6;��.w
�ں3۬��ov�T�u
�<�ewj��z�:�޴���G_'7�
�Ʊ=*�'�������H��Ls_p����
�U-��T�^����Ţ
Ŭߗ�%�	��ǜn̺+��ݨ�$J�����[޾�v\�el>�
<>7Un!����/[2W�VFn^_��%43������b5Rh}2���,��(��mmh�����*�p�V���A�Nj�5�O��D<������TF:s�Awؚ(��� [...]
ޅ��weNa�6��҂S8蜡���v�������^�g
����y̯�`Xk�1�TU�ŴN�M-�H_��|6N�
ѓY܈��8
+���*P��3?�y��9e~q�|�J����:m����+S�,F!�m�+[�K̾Vb�}��d�	[�Qo�& Y��{H�l���lj�О.L��,1�e��'ba��ŝ���Z[-�I6މ&�j��h��`�Ъ�ڵm�}!'~��|ާ>�@T��ĠP�q��`\yr�_T�� �G��i\�zD!��3E#��M��H�Zi��d�!T�2�٨��S1o�/�8��t��C�r05�6��r|���{�/��"ئnt^��@���.Q;���v��\�0���
+�,�[���uAj1��J1Mv)ѣ�eH]�ڂ�ֿaGj>O>*c�|T'��q{�����_����Z��-9�Q���[`��U���&\�h}6RÐ���aEkߤ;�vE� FS�
#�w_P
n#�V\�ܱ�ara�K�
&�<�|˴��4z�IjB���9}�~_
��:l�}�6�"DbF�*���6�?���C�� ��k��
��)=o�>����bJ}	�F�
W��|�i�K��u'����
SV8��RĴt+�̓}��A��&�m6� ���F2�
%�
�&�
Uǽ�c��
�q����50yyֱ�ub�}������o7�-�?�d�7��v9�{��s�iſt9
>b�ͦ��58���˰�'0�s�K�yϤ��˥��⚢ZĞ�/:���)�&��6U�w��

�Hu+GST�&����? �
�*�;�Ud�����S��դy��򥮱�.��V�~<-���m�8Wv�[_$���^��k�-���e�s
�J%�dOL?���;��N����_9�R�x`��0 [...]
��F�5~b�wr�祢#�f�?���*I�)�n�8�
b$�|�[�¢��V�IsZ��M�����>4����`
�~Ϟex��8����XXup�\���2�)4��Zi{gk%���J�v֪J�V�{�/��Ҡ��c�����A^%'�`& em�m1[�'��C�y����!��/����'�eu���
�f���n��⋟ԡ�xQ�*%����V��
���
+U������+}��V��ì��:�2Z���R�Kϰ�Ȯ�+#�p/#S��ejGP6N
��V��iӓ���8��3��`��1�ȅ����Z���͹��
�U�o	�2 9��|���i
fS�>)c��t���d2NJ$�K��#-�3GA�
w ��L�-nB�-�/Ћ �.�jW��Z�/V!q���9�U�8˦E�
j9\�$ZT��}<\\�922�U���kl]6�d���Hi*�Z�'�%!�� ~P��|�6@�=�d엠��G �a/��`eu��
+K����5���k�$�߿��5�W;�h��\g��˗�ڽ��ȫF���,S��:�y�#���M�EzM&���"�J�H��Mr�\\Q��
&��m�dgi:m8q=0WP�`�]dXqFzнf\��
<d =�f �^
4�! ��Y u?6�.������`�m�1
+����ԽS����6�k�����z8��ʩf�%�����la�(P�c{EX2`3�N�A�W��!M�x ^�o�ed�
�3����\N�p
 oK � ǃ6�w�	�
L���b �-�6gJQ�<��
�ęZ\�
����=[�p1}M+������˪�z���w�K�����D�( D��e�� �c��?@�� �� ��@~
 s0
�խ�5��z���4 
Jٵ�
��Xm�)�hݩ�Ks^���Q/0t�z����zV�.�Ң2V�V�7��B��o� ƴoK�V�$� )���g"�\.@
� ��
@��@Moy��Z ]� Md�B
b�"�h�tb ��e8G � ~�|�RwB��ġ��#�T����������N�P-�b�G9��� rp7�I%��S��F�?�;�� �4w �9] �\|L+{�����ް^� ���B�`�> �L� X��g\�
�����%M]�MS.&��o&�R2�q��p�1IҴd��#T��m=4eW��,m�g^;ȏ���P�ڿ�-`|W�E�������f����׬͸^F9�sA�~���xƣ��t�x�d�X�D�l.�=�%}��@
�����]2ƃ����ݥN~u�x�;�xW�E��~�V��ׯ
�kc��/��N�fG�ݳU8����9:٥��D�%7q����0�#6��� �4��{���b~5��//��w�K���,L'���g,�����mQ{~Dc [...]
�#<Ώ7�>�C���!{���2t��v~����� �q
�\#
�~���Z����x�m�.G
H_\F�`a�[�����n^t���_��|�7�|#}�)�(�^�-��g?q���A�����Ȓ��
��Z�O�%�`�^��Ã�Ǘ������<l��<��(.���^��M�L����9/ޫ8�����0ӕ�P�-�Kt��B�0+�5��
����{!}�p$�Q���L
@�(3�����-lbt\ل.zMV���3]SUY���E�
+��҃t�
+��(�b�w���Fͱ��g=�ԏ
�'�L22�0���������ҭ2!�[v''t�Y�ƹ�����
u��"�
�V\o�C�8��Z�83c�����
J��
5w%8B]��^�w��a���Oa����)6@��b������&�y}�>{%�B��_<�6���*�P�e.
�I��;�9����>�|���7?T�_$��om�� � �0!Z/�F�!����ӯU4��
��G
+�$�|.�qJ�n��}��`�v�χU'P���?3���#��?�7��w�z���h�n�c�O�8k��x�ݬ�$-2�ы�G�|/?,M�mB����^6��
��*a�YT�~��n�	�����a?iv ���d����L|�e6~1ۜ��p�o��bf��-zk��zo�K囋�+���.<�Ez%�ԡ94ʫ��~�\\ߎ��\<����
X�F�?0R���e�ޜc���f���
�����
+���n�«�.?������W�V<�ݨG.Q��N{sh�"�qz��:��(��x�°uj~����A��
]�4����Nmn��@|�D�c=��n4@ӡ�o�Z��'Nw��
9

usX���|l7/盷c�o�=�_��XW��.V%[�^�>�6~ ��iZvLO�����{�j�V����dAw�7�o��eg"���
�V	�f8K>F�Fg�Z�(��|Y+
�Z�(�9m[�t=���]?�.[�7wh1�|u�S�e�`3g��	7��.�TZ]š>���ŗ��9�4'B��@������h���m�*��t��N���0>���rK,�h�0aW�[l]�y�ZIî�����I�
�J��v
��ڮsܞ�_�Ė�骙�����ov��W�O
>|s�E|ac�1�ak���u�|C;��m��߆jz��j�^�T���ǟ�W��4kDS��?8�b�<�������x�it�_���8���e��n,��U�m�ջl��w��
^�f�D"��"�i
ȕ��0{�k�~�k
�ͯv.�E�jF�zE����Q^iDo�n�G�H�v
E�
wxGT�-OHg��~�/���Re�6����s���Ig2���6�
�\�΃��UiK�Ph�N�\)�ml� 0*��@o���v���J�5�_T��z4
S<�`������尮�mj�j
�ȅ�;���O*�_�Jy5�a�Rg�2$��j�/ؔv��o6u�T�q`�ʾG(7�Ł/g�
�[�PaM4��W
��qW�y����l�x�z�5g�| g�ȦwQr��-O�+$C
����e��h���i��-3v��Q��HHh�>��:�c�uil3X��#���x
��1̢��K��O\����n�T�GٞmP3v�9��ON�{Y�s�#���q�=E>�G�3
+�JZ���d�T��r�]�Dt��֋�VʲP=8�����꾨
�����/�X�/�^T'�ԶN��7(�EQ
+�ow����5􎋁��M�ф�e��IE'Nj%���*G5b��+�PՔܣ�Ț���xIH~4���R��`/�.ū�vُPc�pݏx��_�;�m�Q�w��[��������ȼ>��<�2�7ܽX��bv�Lt�g�\�ѹm`F���n�����b�D���ZS�ɧ�|���#�FN��5j���D,R{¾�
e#Vuf��<���q�S��'
+<snV��
�
/4�a]��{�f�c��|�f�4d��ޜ���_lW��e)�������o���ȉZ�
��p ��	=jTI�8�=W$��%E�
�O[�?�z�)u�M��fLy�o��<:r���`��g�
���� �b��Jg
+t�K�n���#���D�z{�Ӻ���٢��������u��&���;���]ݚ�&<IZ��	%i��ٰ�$1�%k���3�U�e����h��\�x��ai̎$z����3��2������De��V-�A5��*��3r�o��e�f��֩f�8�m+��k�
ʫD��h�ҳSD���9�M�_��:��º%���A����
�b���q��yJ���3I�QC?`��:���E�6��EiC�L�L57�B�&[�#NV}B"�i�#�
H�
\�
_G�
.��K�8�/�Ғ ��
�
�=��;ry���C�Ԯ�.(� Ė�"���
�F�ln�h�Th�2t龗([��V�\rw�z���Gd��.���v �z�/>�w��J�?��Z.85�؎�/�~�ƛw�O��j��������&��2[�K�����*a�a+�� bوeR V.�=)�L�
�aʙ
#�b�L�:8N��T��6k�,|j��g$�E
~R������M/�a���Ju�\IF]��Pr [...]
c��T���T ���[{����
ϱ�H<�U�\+��V�jî�Q'ke
ob�_3��=���w��n �1T��r�B�뭑�G�ݖT�-�=��+s�`��_�V�n����mٱY}}|�y������̴�
'�v�^UR���,\{�y�2%�
V:�j
jE?
��*�\��:r< ��x!	}X�|f�Rw�:�����¬Z�/j��������'�7,j
���
�z:��sl	?��T��_k���(�����|�1���!�ѧ�1�a�"�DZŹ7�T��	�nX.�!��,�]�X�.���
�w-
��s��Buv%�`5F�*(u�0�/��>���3
筄K�V���V��k���t9����i��^���x���_��Zw�rg֬_�@c�-Rn�g�("��[��n�+�\jS M��baQ�b��?�����7ӏ�G{U�ʵ������>8��9 ��c�
 Ĵ�g�逘i@D� �" �Qv.`��) �h�>T�e;�^�ᣱ2�BY1 [...]
+�F���E���b��aH��[?Pv����R@�
�\Q�-
��o2����
�X͜2%7�J�|:��&`�a�E\o�Y�fN�۽���,�]�IH�:x޹��?�|����r��@
��Zj�I�2 ��G���7��7@�7%@'"���G�
L=�</zV�:Jt@��q霁�e�%RA��dS���J`/�	kL��r�wkʩ�b���D�Q�O|篞���4``�
�d�B�K�q�:`"��Lof��������mX����b�uKR��X��l�f81�����
�#��C���
�p^-
�w�"����[Q�%3ť�c�� ���
X�~��
��-��WOV*����/֖�Kd�s�G�"���p�t	�q<, >jQ��
����㟺
+/��Q �
���T��o>ˇ��ࢼGpPN��%gB�+l�)K����u��ͽ��7��+%/���t�������r�8����)���ԛ�3��A�T:% ������L�@xP |�*o �r~���g�_/iF�*��/%��^
+�dh�3���TF��gR2�g�n�mߔ�K����sǺm�s�o��
돺W�5����j��'�H��{w	���|���9B
���:�iX;
���^RDdj�*���J8\�a�^�@Ϥ(�
ڎ�������Z��H$=�X%%���
��'�n��9*)��e+�W���빝�r�ڭ?�/��~����v����W�i?ж�"�_lN͒�/�ӽF9���G	�s��7
���dv�ް�k|�E��%���9���Ӱ�\��V�<*���
f�(��Qqo>��iW�{�Mlk�6�	�
a�6����UT�v��5[����F��"�'����#�����^C�O����g���3o�f�{x�gA������T�Ǥ"�څw����z 
[h:Y��t�f6��*���+��8/���/�wi��E>���H\{����03d�+S��u'{�O<l�HN�NNm�/�^K�O
�?`��k=�Qz
��2�GzNi[K�<b�8��۸�
�����)��|�s���R�����F-��O'{_Njj�����5�^at�*#���P�����g��'���4
+��ُ���I�oNmu�t?��I\!����Lש6Y,_��n����\{4?3���S'�b�h�ɩi3	�������ژ9��(�|k�_cw8��`(>�Q���$�'��@�J�hi���B����W��
���Wxg�ۿ������nE��[[����g�.?�~���<����_(�Wb�h���fI��q8Qn��}�ôQ��S�s������K9��K-*G��w��v�`#Q���Yd�#R��{]׊]�s�ǣ���u|H���������Q�������
��_�<���;mM���`���7ܑ�Z�0W�fټ@X�����r�췦#�;���^n��B��s}3���w�!P:O	�:¤�>�(��f�O���׀�
5%ۥӴ�G���Pc��
��N���J*o�LF��[��g������
~��4T�
!�:j#�k�V�ڽ
	���!G�n?\
;������+�o� ���,z��6ԇ�\���T�6����w,�V��C�6�6� [_-�@aNc� [...]
+}O=R=?
׻�v�v�ʴ$ޱ�ϟćo�E��K{o�B/^�3������x�ɷN'
iQ�[s�`�:����G
u�z d�4G`0kJSpn�[�Ѭ�8�sEY�#��q,���J�����
BS��?
+�{��
+��Hc�
+ڷ�^Ѱ�`���܃��\�j&-�̝l�l
���Aÿ�B�H�##�5e"E�I�U�T�ƙ󹩙��h��gh4���@�'�w�Yҫ��ի�w�
�4�cy?�Ŏ젅k����h����j�u�˜�ݾ�n^իVT��mέ���\[�z�q~3j����RW��5_�ؽ�</��!O���r:����^ݥ��㈭g��v��Re��Ce*4ݸ

~��[Io�/�ϻ��y,r�\�KA��\�Fv�!
+�x����.�k��3�-�tSAϒ��o�\�����*�akxl`�4��@_�5*8h~/�h$7{��x�W�\i�u���"]y�p�)bv/�_�v���,nJ�^KN*呬
��?H*�d��j�I�ޤ�I�a]�\9�(^���[̢�����7��Z�`M���%��R�XLw�
K;�O#��WM�Xe�I�n<�
>-�WH]�!���|�ȉq�����H�0�$��&�t��rɠ�rE��q�G".G�̇�=,�[>�ԧ�9�N�
t�jW��
+'	i��̏�9Ӫ~`K/�^{\-��j�@����Z�:Ax��c�Ii��L���|�P\
��<�"S-��{�*Z��(�
��u
�;d���J�f��	��d,T�����s�`��ԕ����uܳg�N}�٪,��Y�n����@�
Vٮ[i�#�V�ᅠ y�ʍ�)�K[�O�P*vJCqEss��k턭�K�|B�L`�C��������Q=�ɼX}��;F��2c��Xt��H�����-y2���}�8|#������Y�dsE
��v>굍>+(�:\�'M�&v
�IFM��U��b�j�B�3=���#�
+ݒ��T]g&^=��k��w&��5��n���8�
r\g�a�L=�>YEe��K�}V�!ǵ��
��q����`��.�~�jf��`׭��P3*�[^���WC��7%�4�
R��c"*n���8���z���u��]�B�!���G<�
?wS�ׯ�O��wa6&o$+\e���]f�ח��>�R�ˌ���X�
�1q��`�[�eP����z
���-O��<�Z'��!t>Oy
+�Wɸ�/]�9�E�Rݯ8U�2����n$�6�k\��;
_���
�xП����1�o�ʌ���
�=]�dZ3[m�
+�����E�qi3�
�
���)�A
V���U`�n�
���$�Q�
*�g��T[<�ҕO������6�y���K8��6������
+��,&)�ی��{L�f���״v__�e��̏R���Z$7
�%��<!�E�FbK�#�"��ۍH�l��
�G��=���z<�[�Z�8�(�,����e`�x�	�ܻ�
��O�l�#|�d�r�e��m�I�B�Q��
=I�˞As�����#�����t:ځ������e‹�:~z_l<�C<H�)
Lpz{?��?��/��=�_�?���ַ���{�e~eoY��9����lU���¾ލ��Wz�o�h5�u
�T��"ȭ�d
�4��Rj��6�
���i�wxd�S/�^�7��C��cڷ��4Ȱ=�@U��%�1hVdVA�_}�����������=ly��B���!U!T*�\=X(O�>[���c��jNd+�+�ó�!�.���F�ΦC�t�k7���z�r����n5F�QU��V�O+�V�U=_��Y���M�KSo�=EFS���󨛅#��/�,�����r�9�A����o)� �P� }�<��_,x'Wj
WN�љ�q�4��xf���TE��T��R�2^slE��J����~ncڠa��g�5��E�ק��Xղ}x5ʘ�v�}9�F��F���Z�)(cX�����ѣ�zܜ�7G?3�1�F����h�ӻ�q���Mt�'
�F�/83�
+ߙp�t����)�D-�.��Z�\ޜx�~�rE�6�CNn"޴�Ap�0*��Du�G�J�����E�{y����(U2
?ʆ?��+�t���`�w-�\���2��^7��գŪ7�x�y����䞏�x��U�;8c�Qi_�L���Iַ�8��7(_����#�9�$�'���A�V��uaaҌ���Z at c��B�r C�f�+LsC���Ȥ �w��:���oم���-L�C�&���V竾A���0{O��~��wGq�W��
��W)�TGf���Z�NK��m���bۿ@ʺ�������^,�*H��
x� �m)�$�V
�^�܆%2�"g?:;��o�~�5P� 
�zQ�\� j
_5�� 5��d��V����z:ù-E����d{�p��8�D'b��q����F9�c�Z��(އ���
T0v�|9��� �/��X��+eX� ~G�
��a���
������=��_��sm��r�:�~ �'��lr
>)���.�ڬ5��%Ux\��Pg��O��%���N
�,rRD�%4_
�z\�W�<97? qv߀x/
�R�
+Yª��T�53]@�� ��9õ �f��&[�T.����
����
�1 k�Y悥���H^�1�~�(3�_4�P��d-����VZG.�V����
\@�n���P�< ��l
P��sd ��	��	�&#P�B�[���e�B�#�R�p�

րz	 ��"
�w� �c�3��9m��7�.��Uw�7��A|S+Ƈˤ�E�r  ]o�����GOw��g��\
��*�A��ܓ���)0����
f�� 3_��+�9~�9
B���#`>T)�]�����U �4C��}';�:����i�Ð�w��*<A�r0��J��B�:���d����m���m�!2`��X�Oe0�v#��}矚
��g�΀[�
�;s4�K�e��,���/���f�Q
x��|�I�'��tk����bN��׸ָ���rP��l2ͽ��?�olJ�������_�Qp�#��o�vr��p#V������|�@}�)����,�/R�B���K��
�l
&��Þ���K	��%T���|���b���k���gR�3��@�}f���an����$߰>�]�WɼֆD+
 ��D�]BH
��1;G�`wz9��I<
+���cB9��
��?��duf��(��"�
����f��k���^'�Y�������qz�
����
�%U�Ѕ�
�s�m��W3���hB�����i(
2��8���ܛϥ����p�N���$r�"봥��̱����uIB2T
+(�
�Z�C����!��u�ԝ���
3�g~�O��Vaq̷ߛ�=����|���y��r��?��<���O�ꢶ|�;f)�7i�p%k����:�}���W�-�71��7�_��D�x�Q�f��|J�
���]�`y��J}��Eu��ܐ�f�'�ZEX�]�eo)�O�EB�E����g|����t?���2ݨ��ԁ+���b�Imk�IPM�q ������{�~gp�Q�k����Z1���۟^��?��~�����:,Vn+~W�.�S��P�Du�=�������Q�ؼԘx%HONv�J
uǩW��!N��ѽÍFṁ�~{7_�4N��'�Os�g�
���h�LV���.�������ה
�Vǯ�
n��^w!��B��ټ̖uq4ur�b���!9Y�m�������������ѡ�pjq"8T�|n0Sq���f�RO��*���M���c{d��pf�:�-$o{��Q_�B��e>�I������=��oJm{�a�a�kvG�
����W]�x��2N�9�{g8�Q����`&
2�gr�Gt=�@��y������E��%8<��r�D���
�e
�ع�f�^Z��ab��`W~2_>����y�q�sj
�
p����]��a��U�ޟ��st�g�
i%�mY=�1|�9&NzcvP$�JTvn�~%΅=<�
�N�:�^�Ħ�^�Cg�piG�ˏ`�˟@.��t_���Ԟ�w\ۨC��Z	��������n�^����"��\����<�����/~E�-y����Z
+��6�c-R�h��V�;$��[��Q��_�ۛ~���4�O68AN�#_]����������x�}��������V����}�E��U��3�C��n��q��!4i�f��)��Y�\ٰ�
3����9���i���R�Nz�~'.*�F�.t��h�E��N���@)1z��6�P��UX�u��ք0l��(��4%�Gs��o�6��
�/�~k����������,ܜ�3���m,u32,��5�K?�o�NCwZ� ��+�b��-5=�f���Q.����l��B�$��-D����������
+�N��9�E;ln ���Ho�N�VS�΁�L
}��s�,�L����rK

����ͳ�E��x`ڡ\a5��;u��-Tj�{7���иv{^�nj:�b�)��ILkq�܉������Z�]��Z�t{u�`���ͷ�ȼIsW��1�\I2�qU7����뭊j��kY�0���|�v��Q�3���9��By|
�"8�'*�D�p�<z��]L�G%;�
���)ױ�V����t��Ehc�ֺ�������9ڪkss��_��&a}{Q�zUq3�i��K1���j��/��Ά��
\T*�7:U�����h�"˷#�sQ���H����]g(.��E49�ʰ�D����@D�6����
�-d���R�w��U�_�f����
��,�
;�������P��}�q~���3J�!�"Œ&�-ƒ���ɹk7����H���B\,K�
��HD�
"��*+`ZϬ~}��Ou��!�nj���L�Ymv��V.�����j;��9�ǚʙșf,���}q����S�O��%��[� �^YV���i�HZ���eᤉ��k�����
�D�I}�Xl�
���kG�O���I�y
+
�\:�w\:s�\:��?Pv���b���Ӡ��N2
�
�c�=
�Q
�~��%�U#G�qW�ke��Nr¾n�L��%8�gE�PF��Q��hp�}W��<q�	�z�8�i�v��@�<E�+.�L/\�`y�m�8����e>��l=(o�����z��`�]��
�t��_?�� �zO�[����Krߖ��s��N�[ڸOɝ"�˕�D;q��b�
B�u�3��8���`z%�+��kW��[
�	��C>
�A
����}b��.[�̈`���Y�
H耞4�Kz�
J�D
ez��]D�?�녏S�cTs
�%m��
����I���V���h�ٕP��ß{�)��QO��y�Wk#�#�T�5�Y<$�=-��Hc[�\
z
8-z2���*�/��Qj��E��n
e�{s�D�!�t�2��󓽶��_
��d�?�n�ry���tH�I%��h~�����9;\��
����:�;�u��Z��x>n� ����-cr�&IO��̃����Ґlj�2�ވ*�6kr]����+AHt���N�
b��-�ة�:��<+Ch�h+��&a������}�hN6
Ҩ�D�R9���'C�$�%}Uo�����ф}r��1;;FN')=eW/Z}�����!��8U��,�;2i�s�D�6�[�1����!i����~k��$�5k��sT��ϯ��2gq��,�D�&

�E0W�V�l˖1/��E���G~>%c���~�ZqY�=cEH3
+��h�@��y1�‘\_�i�{_S0��vQk�(�D�_T
'ǃV-UνZX�Lk�<8U��;W�Ȁ���|68�i\y�[�*�o3U~�ЫQ��Y�j�Q���p=����u�#���\So�Vr��KD����o'sz�Eǔy��Ilu[
���(w��{�ҕ���M�Tc3'�z�
٬�(�əSD[�w�ө
W�qE��}`��
*5��NT�@2=�@��X�FI��
�XC^�X2:[�)���Vs���U�|
I����Si��Uy�(�Μ���F�������UuP���wo}���ۻ"��B
�X6��局�
�5�V�_�uy5�?�My��@e4/��63aHK��m<�"ۀ���e���o���,5-���#�Ш(���\W�}�iwsfA����bgIVдv����'
l�e>
��] �-�f�o����et� ;�d1e��7KG����<+�mZ�B�إ��"}�<�a+�֮���|-;ϒ�����v"/L��,u��*2|
���_\��]�9�ޑ�Fs�wֹyUX�cL�|���'H��,J'��)�
endstream
endobj
124 0 obj
<</Length 65536>>stream
+�ש�*Ƚ�� CP*2�e����v�G�����C��s

Y���g�]<\���BB-��]
+_�� q|�!�{3��U�Y˓�k�|�U�'Z��:�WSy��
e{%�\���ml�q���f�����}T
+<o ?ho
+��`�j�.�)��s�
�^(Lh
+4n](�S%?�ל�����J��sͼ�ʕg��Z��QUP���I�W�l��E�z��*��Y�`�:�8yn����'���W�&��}��ly�͆�u9s���w�@�4�f� 
�un���
���`g6R�"�
T7sT��Z��!�@���2\V�zoey�
��.�T��TG5
+T;��aa6
��3�3xi
ٺr��T�>�/�*^�W�j��}�"�T�n��R��n�؀���<-��Z���������A�|��
� K�
��
p
V2ح
��DspV
�)'{E� �� ��xP{p�
��t�q�T�Mn����gȷLU�:�s�	��	��~y7j�J��<�R��
+%�/��-���
+�t��3�/@�VrRD��+��: 4�Л bR>g�À��u@̰ �"ڭ1�f�s
 �b�����
�~o���H�F�#M�P���<���H]޷K�ĺ�7,�Y0ڗ{�u�S@�
u�H�����/��$|a@je@ε 1��STU��
����K at i�P�����
��
st�$%1�&�,��z�����ά%�8����"y��h8ZI�X��
+%X��p��<��篞�Y`@m��_�~	P�)h*GZ�ꀶ���Ы�
�~�#���=`��0$Od����c���0
^�p� �j�
��2O=�2M�\�/4)��i5��J��]r���@�
l��M��?z�y� zY�SS���/�
�������
�����m��i��2��v
�/N�y�5
���pa�0��
��\u�a����m��X�ަ� ���V��L$<�
xR
���ۇ��K��n��oK�?�������
��J���}h	�[�������i����6��u}B.k�@���@`��
��tP
�ů>�����������Ϥؾ?fh���.tG��W�r�z}��>�Lz}>��}�6��%,L��ݘ���z���.�}Z4;&w8滃����r�-/�O��?�
b����C��o�7�k�C���������w�ȌoXX[�@�� ۦ�9]�Y�z���iX����5wT�g���![)���};�3��{e[��fe��ujW:kf�LW��W�eI,_!�,�l^��~�����RB5�ǬtEo��SKO��\R�%��j�:
��w̷��~ɠ���z�[
Ǜ���n��n����Zݝ�~Uv�嫽��
�{a�����A��R�2���(
�����
�<�*r��_:�
q�蒊��$���A;i���
�ZR.o�y�X���|y@\|�Gc�\�|�=�9
_ݙ�=�3$y�S��L��c<��"99�mB
��8$��u�ۂFs �����k
���RW�'��>����f�:�s��{$��֩&��V)Y(��b��?����ݦ�b��^G����#	��WƩ��c�0�������!�e�?+NDލ��
f
8���Ed�v��Ɓ^}�⢽�_�{
��{�+�	O����=��w
oX�<���i�����rX��ْ���^�I���qX�{�����WWZ�ߨ����t
���}��w�Ԛ�Ȃ�pc����;�޾�#{^u
'%�dz6�i��w�g=�D��
^�&
$����%����w�W�ѿ�#�kz����ڡ�\�a�o��
�6�_�����
f�Y�����v[��=;�“w�����ꦝ���n��=�];���^��7�r�'��
ئ�3�/��������[�z�ɘ�u���mB�؝�[����ť���ͥ��%����NJ
���S6:L ���'��u� �:�
%t�g]���ah�ߍ��l���0n�B4nß�ܳ����Xzt
��/��myc����!���d_��c����pJ���U�u�h
+��k�����{8B��i�{���7b�
���:�Cz�������e�'�O�6ڞ+
�[y��W~�T�%o-��{x�����9�Nq��4>���^�Z�
�86K���U�m�+W�xs�Z&$�z�"��ƾ[1JT�ׂ`��Mj!۩G,�a~��{'߭u^M��O�^�]����6Ϋ�����nk9��u�8��f��
ks���|�P�)
Ѧ��iϒS�c�B92��16�yoi���A_w��fiX�
Z��W%�ď��~�.T�-���i�h��(y�qt�ܨ�1�λ�����ȹ�K��
+x���m�0�����)*ϯ��/؜^��dj]�6w�n���蛢k����h{4�5w��'�2V�wi�He����W�����UA��-���&�0��"\W�?мY��Z]:=�x���a|�^m�6ߍϮ	J��j������a��U��ͯ�����I!��2��=�H�{��w��R��D�Z�))uU��ã;�%��& zH��]�
+�+�k�%��P,�ҷX\�h���i� ��M�Dov�pʶ�@/;�̛j�-�l���l1��k�o˳�v��+�L&�
+7�F�p�*�� �`���	y�68
tI��&5>C[�ۛ@4�o,�Jh
+݋�"�B}��T�~��W�^T�j�?�D�M�^�S�I�K��G�hS�f\�+�l��x�
1w2P�_i�I2Qϋ���sع2h�k�}a���Xi2s2�/�� �*�3)�ngVhF@�zE�[o��
�OS�}�
~��]�5��q���t�1�r�\��!T2D��@}f���u�g�G0�rn�lM���a+�����e�f6��Sy�q�HSt;� �����,�i��)
+�;�+�]X���e�_�p<q])ܥ�Ȭ%������1��[���7��-1�i2�
FlO���0&>ե

���(�B�
�mL{��K���0��	�
T��/�ة�~ 9w
�%�֎�ҫ50`,�n����Aʓ��[k�u�[��=��_T)�7e�y�=��ӭˈ�ʀ���5�T�Zyye:?�
+t~��H|��j�P�������_���v����'kI4��Z0
D��iS�+/���u�
�jk�����)Ir�����,�Y�Y��Pv�ַϟ���Kf��;z0f4�A�n`.2��Q^0
�� C��G&j��]�r��
l\~�Y0
�0[���i�K����"Q%V
	ڵ1��:�g*s�Da��)֚�W�@p�B��<�b�n+lLa1�X}jH��8������#�jszUv���`f.�~ߠL�
�mS
�yO���c���c��k�s|
$Gz_%�?b
ۨ��ڴ�qsIX
�����
�]o��>僝s�@yzPS���S�g�.wB��]Rx�=2��
�[��Nz�)��w����

Э�Օؠ�|Ok��vz�)�vC~��P�ۗ�Q1gdc!z�q",��I�ק@�P���d���U���c��U�
W��ǽ�c��"�l��ɰ��Y�^��e_�~Vb�0+q�Ķ���EG1��z0�Ze+��B�߂���^r��1�
k�
�U�qK
�W����X�؞��RC�D嘯��g����v��w���cO����EQe%�g�R��t���v���+oz�
y�Xy
m��mL�= '�~H��E�e[���s�
�.��Ν�cdg�@Gk��ާ�
+��r�$����
+�+��9���<�9>:��S_�ҞJ�k�$1]��d���QB҃<$�&c��~�v�Ը��R�XXR���AN�u���t�t��O���ENm���O��<��N�Ջ�Q�p%��3h�d���Z;����6�=)�������w%�<z�t��
��Vh��i8���zE}�۞��e�, at A�Z���1G���N��Y$ʸM��:W|m�
���SS'ĩ��Vx�N����*�k]�Q�t��7sP
�i
w
����p4���R��d*gV��Xԋ!_���YhV�g��PQڐQЍ뒞�
I
���b�L�q�/�'� |}#`<�YN로M^'[[iu�Hu�XsG
Sl��XT5��腄Θ�[X���_��g�Xʟ��{j�Y{l#��֫
+~��7B�2�%��
+T��p���btůQћ�K�X�+⦝�u��l]���<J,��BI���1����f���.ͧhZ���������w�aa�p�*������1L��:�M��AJ��m�b����n:E����eT�ϣ&��
1���'����]��I�Ԥ����@g�~�I�J횭�~��-�� x��!)�'�ޏxܸ0�-r��4���
By���|x}e�R�����d��8S����)"
����v�v��t�Oa�Zxs�ԛ��I����	�9_{�#��t�^w�l�i���^��|��<��&
�.��}��K�̢]��{���&��6'����
������:�
��>~�%euc
+�J�#@͒7��:��)������
.��I�z������?�7{%�S����ug{NS���
��<�GafY(�@�"{��I��Y��0��
X���A`9E���s2`��0��L6#�������/
��)z˚�
Y������-��Vr���G�nJ����ϘS��cLY�d����z�y�f�p�
�Se ��l�b7,o +�G���g�
X_gSD`KT9Šز���€
F:`�V��g	X��7�u���w;�eO:-�d�2����bn��81�\ؑK��y�^��9Clr8��Oo�5
���f)�5��p���
����'w�
�Mpۛ������p~�"=�ܣ���/��
���-N�tۺ��5�F�笕����&ew��%�5 �y�\a�3. �:��	��-D��t<�`xq��N �|� ?�_ڿ����7X�!���06�0 } �G] ,�e���W�]�
Vl���=B4��c0@�/E���n҆�D����`����
+p1��#@��Y����5n@��߽�No B��؂
b�f� ��/�$��ɺ������݃�i
+�&��TNv+ M; �z������7{i5N���|��ʠ-s7���^U��㬅��ZEPb�d�5�kM�3���ۯ
����)	e�o�Cui��7����
+j�J`/�^o@��I�lU;ū�[r �}�n{��ǩ	���צ_V�����)��
�N�53WK������ߓ�;�?����߯x�O��?2�?q��s�s�4f?Z7��j5K�/�V�]Ŭ"�@�"��tk<�}ƍ�ޯ��cX��A�������|�/Š�|ڙ�ӌ��*��ۂy��k��R��s�ޟ�o��̞��<�
�;��G<�
+�v�V�ux��`&ZyqvcK��Y�8����6ȴ�M�e�M
3*�
+
�]7kyk������X�k^�:�����Ѡ����0�R�a�|���)��ѱ�z�Ð�W� ��C
�s��9Y(�m�6�sK�^�M-��/����.f���챌�x6s��P���OW����ΡQ����^FWf蔓�׺jϖе|�f΍�
+9ޜyf��������=��m�){v��ka����չ�ǿ��
��!w�?�s4����
�~�3���ŋ
z��)����N�g&5bmD��\��cf��µ�`
JSl,_����������i}0��&��`�>��fb�i�#��bȒ�ܾd�{3q�}�k�$O�����Gn�.���Pz#a��8X�c6
�$f8Ү��p�U��g8�

p���+	}��Ei��-���_������
Hh����:�x�/�s}��3�!�qt(~�����cy�^F��y>C
�;"��� Иc�R��h�k=ӭ��x?H���NR�;
�p��CKHB�Z}�C
����Zk����kX���]��c<���l����bH}r1>�HQ3[PF=��
�R&7�4����c+[�{@��|Dv�Euڥ�ƲS��M����a�7N�p*���v�ݖoU�u�u�-�5f���IiZP�nD
_n8X�[�K�y
M�[mQ����Q��
P���n�/�5���1���zt(dɑv���}?�=
+�n��D�F|�d�}n�v[�
���U��A�l��(l|���iD�!j@�$�Dž۪��Ю��S
���n�U�P��
)�yA��������h
�ü�����-�_읣<_��]�$x&� �<�f��Mxt8�vh���KOGs��_�(�FP���
��E�Wk�V���jZ�R��_I��J������S	����σNT��t�����#����o�}��� ��0^Z�>��c8^��
%���b-y��d��k����v�f���.�I2�6�ca]���Mz�j�̏i�_+l���QA�r8�زR��R�d�%�]����(�V�Z�7���4,¥Ө�ݲ��˟�6�xĉd݊\�\�v��w�x��퇿>��O�ܡf|1�6��h������Zf�����Zղ�
+������ط�-lJ��v�G-��g2>T�LC���=�0[�b��<�����
,��y�
��e�2���=�~�7��sb��:d���*v�x趺�Ts����

KѓRD���Q�qKo���/�fZ]|��r�
�Kf�3�m-���CmX��ia�Ko%;��zWw�?.3�!�}�N�8�:�����"�����v���*���o���<�.���ق�	lNךh��h�jgb�n?c�
'�P�/"��*�]�Q��5���}/��ևe!.,���[��G�-w������&Jϋ�_�N{���7��n"�rON�r�c>�3G-Ɗ2-���͌ѥm�GP2і�2�L32��g��k~�9�JX-�y-YK#�V!^)&��~�	Z���#k�.���\�/}	:�����u�X
&�N����j�rΉQu�W.��+��
����,
+˴D(%��͸�y��c�1�kz�����zÈzP1t�V;�V̪��H��j��y*ק����J�w��{(
�D��
Jo��ۆRk�r�Ki�{.f���q�^�\V�����܈�9�nk��~̛^��K�41��u�or�g�������Ō���zL�U\m%�fsJGɗ^v�~�X���!4��D�ؔFS�-��z�j�HR�TNz�y�O�t�99�\�d� ʨ��_a������6�\.Ǥ�޾[2�s�l;��Wx;�Ŵݸ<�x�1U��x�J�8Q.��Y��O�~�2r�'��y���
it|��8ߒ2�&��~�
&"G����IDF{\D�Y��~�֗�|�p=�AW΃����F_ڏ��r�Nǜ#�����KzeyZ}�W����P��'T�:�;������nq/���E�-ƯD�4o�8�pZt3�""۹+�kH](ꭉ�}�#�Z��
`
+OыO1�_���{�_M�)Sڶ�zY[�eS�?�r�tȷ;�E�c��D3��(
Ӫ�̨�zj�]��]���pX�M0lH�|ܕ2�x(�B�����
t/��]��ZF��ɯ�ȗ�E���y�K���U���±=b�Fbo?`�j�
,-}�9`�h?j�Ɗ5�d7_o����6��9H�
M�UC�U���:�m�e��<ɮ8e�
������Q���p0�˳ޜ��I�%���U?�;E3˱�g�d�j��
+�k�9�&��F!+<}K���
���	�.����L�rfD�w7���ĺ{�<7g:�
��|��s��(�tQ�"Qw�X�maQ$|~]~�y*yո��u8�-��؉�f9ܰ"�srN{d&��p��(��N�q�H����w��RG/j��Y��
+�5:/��;�K��/��le�A�}�s�]�Q���_���Z?�r[ɕ���y���
��7O�K�㼙�6��*+�.-&��{���"���K���;Z_��ԫu�P#� �
�����&��Ng$|6~;q����Y����pN�I�"!�<t&����N�dm�
=�Ⱦ·�<
}��Z�0��+.��/6W����[�)��t�Z(� ����h����
Rp��ɖؐ��~"��"f�]�(�����
��
jx)�'8Y{\p��%�[A���
e���9�K�
Q��d�oډ{���m-���}���W��&ڧ"����V�<+���_I���KNE�H�@���$�H�Gd�_56K�,��8y��#��vJp��_2Y%
l�hX��0�l�SB�)N&ڮo��i>�bʡXC���E��ߴ��r<]s����#{_&|_~��-q6<W~�d�+���&O?Z�
e�����9|
_
ل�����ZͲ!��
+?���f�
z.l�h�ß%���u驋>�ּI�[ڽ��VC���B���)�Fz��˯y(A��u|1��h���n�<�l_�ȍ�P�$U�?�>�q3�_
�63
�
k��崳@�Z��b�@�ܣ��Nd��mc���_���L����Kr"��N�������>�
��L��m2�[@0?BJMs�
�
�tbl�p�I��T~7��8��6�2�sS�2�i�~����A���M�
���o�Z�s�b	ΐ�*4��P��df��4Sh!�LVR�?(u� �ږ�n)�U@��{Oqf)�}@�� ):�F��o̷30\`	�7l�j�$����P�JZȞ�=���'����+��a��#��큍��M[�R&�ċ�"�r
+������� JB�)
+�[P�Ħ�� ������P���
�8��,��{��U��'��ȏI��Y;C�V������W��Y����$�ڌ꣚�ᏼ/@�kP�f� �tum7RLC@��nh�X�h�R
�6TЅ�h�˧X�m׀αP���N4�o�X8����k����c�9�U
��?�7��FL((�
u�m,���eYG��R�"�a�w �k�Lf_O�n������c�؝`��-`B���R���g&���P̴8 L��Sl����
�
�.`��0-�L�5�h�&-�� -<�oЉ�(��n�1�V�1�����.2b.azWŸQ;C֍&`N|��\�F��b2l�5�^vn%�݇g�>/��
+8- ��v�n
p3M���찀K;�I��W�%�w�Q+p�T���
m��+�
��}do|=���vI�w�uz�)2�zh�Pƀ�O���<��c� 7��E\o=���x)�7�R���0ݶ����:�x�
�S
?@ }��H�N��s��'Q�z����Rq�~���J�dzbO�De��n��"�[�@�����'��=�_�	�{���u�@�@H�/ �!��M�'�� q��	��nی�����Y �fH�K�:��'��96_I]o���
G7�J�M� )���n��L�Dڍ��!}r;�ݶ_9rѿ�_H��������NѺd�����^���*�����5|���$�3�VXK��
+E��b�#Q�ʃ�٧
2録���6����
���"�W��
ҟ���J�+�����o��� c��^��	�Up��Ԣ���tZ�rZ�ā�,��z!�
�
�Q
:�8@�f!�yb�|Z����$�W��m�'�\y3��#B�����/ox���Ra��gɬƻ�8���:ɱ��u�
�0$�?�f��],6�d�6���
+����y���l��#�6��
+�q៌��u�����[W-�!
}G�/�����%�^΅���)���Y����`��A�P�3Jr>ڮui�Ir�ن�"�uE�kaA
V!A^��
+�\j{Z
��2?��c��
�
+��G�W�ϗ�?�c�]-�ͫ���[1�s㑿
��t�G���s�/1�I̦�f����i}����<��y$���_}���¼��W/��5��?��p4���":\	;�:>���X>
�QO�����s���
+��'f@�
��s�-�u�Y<��p�idfs(D�3��_b|�<&�{�L����M��C&!���̎z�Ai�2|�ch�?��3����V�����
���骇�
��'��R���I�A�&:��e���(~Ǹ�7��J�7�9���rѡ�q���4��v�ᳵ�
�2

"
���uO��?��/\p���׵���g7 H�I*Y�Scx<<4x:l
+y�}+f;Tf�֭i��=j
Ӵ8���?N#��a�!ƃ?������kw�^����ksƏCr�
>
��Ɠ��P�v,�;I�fujU
5�
+G��%�ۺu�A��iQ�9����2���D�4��{�AҸ��b�]��5V[7���)��n��U�
++IG]Vj���ϝUa_z�|��z���p(B����k'�{��9m�ӎ���vW�������α
���ثut�rj�R�P÷�ru]�Ԫ�lU��S���a��ܧAS�@x��rh9��m��J��],騕�A��5}�t7�O"�)VZ�������䳓  �
z���nu$j8�:������㫤��S%�v�LpQ<�hڽ��}V(�oJ.�Ƃ^�٦�?c����[�-�Z+F�vXt�ոW�˂�Igo�j@�/]9��
w�]70�W70<ł�b6�
�d��!lgw+~�o�>Գ$9�V��R��;�a���]P����Գ•��
���D�bT�
E߀B
l��G��{1ޢ
�/�9�q�)�~P��
+�sXCs�V/���;���
.2�����VF#`++�JA�޷��J���@��U��	NA��?Jq��\�
�fz^��==
�N��&Co	�b��+wý.�z]�;{��
+�8�uZX�t�cK�/��f������p9gpzh�����񓕁|Ȝķ�N6��n��7���O���hP��
A>`
T/��Y}e�"*r�B�>�z�,z���&a���1���3pZ]ij_����,*��V��%� &ϜQ���lQk�xSVnȈ�H���T<c���Fv��$z�>:9�Xm[�|��#���V5,��P]�[�V��&���s7X�Co�&�M3߄��i/��#EǑ6
�V�n�զ��=+wL>7��>=������(�����LD/�6���AzĴ�=74�&Kj��U�8.��Ǻ)���T�J�Q��x�Ƚ�#���Gm�bF	�"����ݹl�A^,��vo�(���k}
+�����:gAй`�غd��`��e���{�H�t!ֶ/{�U���z ��
�T�{C���C)��T�[i����ѐ�q%����,Y|=+~�t��s"	��M�\5H�$�4c��7��'�}a�q�� zv�3�9P�����:&Ŧ�s���K��NM=Oc^Y=4æ*\Žr�ģD	�癢 ���ν{Y���i�7�	��?E1:9�iv�"�##aF������6���Ck�O�w��/B%t��
?�
��~���N�}��rR�f�U�(A7G���զ@V�(a)���V��ɽ=
�z�kJ/A�JV�%��f�
nDg�>�pz
+3AA��?�t�:_b�2O<VCn3Tw\�Ze�J��r
t�J`S$n
2���2��J���c��'��dֱ�w�(�ZQg���qWEW.�eZ�������}bI#c�H`<)�yh3o�
+خ#`'x�/�ܜ/��"�ޕ�$�t u��������g��r��dž9�i'�z�"�z�i
Ü
t���a�z4�Қ
+��,f��m����ܘ�w��`U�+w���b+��]�
�.J��*����	�D2�,'9|�%xR�W�J7��A8���8�z��{[�
�ub�Q�fN�
δ)Qb�[���>�]c��5\zQ����
�]���uBk������i�U
��G����kzQz�LK�� �݊�Ϟ�euK6�U���0��
`�=d�
^5�J<,v_y�l�͖�S��1m�StƌL��u
�t��?hM��}	?5X:e��&���
r|{<��}̑����gmC~�σ�p��k�/����c^��
��؜Oն���@���'��%e�#U(ڤ���mz�q��Jd��ʜ
���S����"�]?*�SEZ)�5xTbʜ/�S|]�H���}�$ԅ-"v�:�axL���_�e
+_�O�n��
��
8�����n�~˟3�*7�cc�2m��+V��s�������p	{�ك5`�s�e�[#}�g�j��)[�gVΓQ}\&
~���$tzt�8̎	�ɯ
�
�������J�DZ�f�:��E�
��K�v?��V^�66�l0�.�������-�tqn�mi�����Qì
�C�牱����S��p/0a��ҺIQ����)��e)�H[���n_��*���!N�N�l�zϲ���c�r�թk�ӿk�a��^B���mY�1�G�L#���N�
C�
�Q~�
�K���
�i��K��W�Vze*���¢��$1T�BlE��(s+%bV��x)������f+՛�힟<VQ%��i��
zʬ�h+A��T��Rl1�sʊ)F����=�P�?Y~��Qk���EԺ���Xv�V�s����iQ��
_<�_��{�U��wV�\�Dh<
�2������Ӱ'�m+�Q�m�y�n�7�
�X-Lэ��a����6�bz_�,4�6d�vf:֗�>�3�ғ2��4�L���lG��_��NVV�g:������mJ�P�A���{ܮ<�1��Q��T&���2vc���G��E�CzDO��L���fB��Ѕ"a]��󭑉U���3Π������
�M1��~�� ��Y�8}iV >(7>�.R�X�z�{cS�bM�H}�5�6%�p��R`[�Ȧ�-i��0U��Δ�l�#��q��5�"lu����0��NX),/E����DC���&�hf���I@�� Z�: Ү
!�D�H���Z�p������쌗5[v���T5��\��Vġ��k�H?��<i|_;c=�em
HF��B��f(g
+�@���)

�N�X� YA�y'+f?�x�j搢�I�` �kـ���
 =����O�� ���)*�oډY�v�I�ϔ��%{w�D)���L�#�t�\j�
�5�cuhJ
�Lv*���t��~��[P^�o���v5�N 5��)Z�oP� ��)��k?Qw�.�Mq�U�U�_�*D��V���;M��B������f�O�NE'8 Jh���*��j���Iہܑi� 9��z�~=�4˺)L�Z�
+�jz���
�:�, }�����؂i-ET�S
�\ �ڲ�>Ջ�>[@o,(�Y�p�v�8����,D��sbU��9:j+��gЯ�ZC-Ñ�)e�q�>�b0�A	0�* L�ZLi f�v ��
�8���}	X�7����
�C�~��O��b�cd�b�lؒ�qꀭ���{S�
��[�ݢ���g+��fb��#�ƽ�p�BT���0p
�����Q��{���~��� ���l���\�Z ��K 7IN�����>�܁|��SlK����
�+#�W�u�
�kv�Uol)�
-O��<�g���	�%��Tg�t�P��
��A
��n��;������?V�߽,��_��`��������@��I���b�b5}3�z���c�X/��XTg@��;�D bN/�ƹ�����ao���^���
j��^o�?���A�䏔���.�����E�鷍�ooN�uۢ�<�=��8yf�R|` ϧ���&�Gz�6��xm92�2zb�!�S�{}������c~�;��?���
���F8�q�����7����W�}/�@5�>P��%P���0�w/�XD���O��e	h->H����J��r�MF��aF(>>��x@~����<��}hyF��I�
�Gm��f�zG+�����^�X�gvh�G���&�Ը�nظ"���(�
+ə�����R;w���S������k]�ʡ�3��9rwW��
+��zͱ�Ƴ���V�w�,�����O�<�R�be�N��Z���U�S���e�fG�g��.���G���C=�4s_��7w4�Db|3� ���T�OjT�0aw����j����/�j��o�Cn�=h��CUh��a��T��˺	�����h5��#��f�Jr3t��o+bL�Y&7�a���]!ŨI!��U�>��dgԓ�����/��s|�������+�~\��)��������Еp�'w�x��8�ۛ�J�σ���Ufh�\���-�h4I\j

|j;��~�����}����5��
د��Z�qn���̝�-�
��1X�K��
H��$ՠ�I+�^���P�����1�����������׺z�bv�>��
jگ�שpcy����\�>�?�S��~�~���
>{�]ju�w��;��#��u
+���}ngvm��9�n�쭥��w�9Ґ��q��g:��Qt���R�Z��������E��j>��XW��o\�ꜟ���.��k���}v���ѩ�;�}��tR����S^�^Zڃ����7>�7
��q��ս,ת�+�[�)qP�=��5�R�`[�I��^�O��a"^�Rsq��@B�t�ߧ�m�J�y��AJ�b���{
c|��cGez��p
+�
X��[nֈr�
�ߛ:��
j>Aޫ�
+���U��MVس���,M������Y������P���AI��u�_�������JZ
�t.B�
.x<��S?_@�N�[t�W�'�-����,�
����mٱ�S�Y:�b���s��Ԣ0hJ�_%4��g3.݆񦤃��N�7�Bί�g�b�cX��D!�L�c8���u�����sแ�
\��� ���%�q��!J���k�#"��#���#b��}^^�/�#�z���i8�����$8���2%�%��)�l��Q�����,xT��-j����\}�����
��Υ��s>�n���v|;��	r��;눙,m���h+h����BN'6
��"kX��-��2��8���i�6�Pݘ��&���/��0���P���zaYZ��C���ٽT�˷�۱㮟Uץ.l>_S�9
�#|��}�ܞ
:�q�6�ƹ^�����qb=O��b
ۏ�e9TƌfB�t�Uބ��axQ�70��՗�}��{���m�uI۔�
mSf�)���
+�ͱ`�+
s5���^�+Ӻ��Q�A����
���~����trw�g��$.Z#nQ���eN�s��C�؄c*6f��2
+\qo`��E/I�NfD���1����㠠����QNPi����M��
Z�AI���<����q�4��5)���ⴰ �0�����m77�}Lk\d+�#x+�s�99������(t��oїO=�KC���V��mAo�U&�T�3�J��o;�o�W�$jE��p�Z9H�z�
��l4�A����t�1I�c�^DžC,��I|ϫ�'r[+�j�Z���1;����(X���3o�vl
��
\�qzY�3zI��l)�
Yj���*�۔�S�RS�ӥ%_C�/w
q"k���A�A��I&��������"7ua���m4F�����
0F��d����
�n��S3b���<�E�=�����{�?2�A`^:�k��"j�¨�3I��C2J�����e����
i�|��*��Xo�vk�!i3b^
�G
������A�1-s9j��3
��[�f
+�f![��6EI����Ż܋ޛ�GNj5�	��
?Y�
ɩjs>�0�h���fe�8�JCiΊ���CWJ��ؚ����N�E~�"U�g�6�n.�Z3��t�[��֪y�崍�
1�c�ˤÈe{M_����T��ǬG_4gÈ��P'�����l���I0����Y�X�+\�S�ULU�u���~����qV��,�
�0B�y�"p�z/�G�a
-�
6��Kl-Z�X���2G�OkK����q0;���he�g�{�bS}�kR��6'_���|�\�|�
!���շ�}u�+�ywW����F-�n,�fQ��j��i
٠�|z��і᪍
+X�x"��\p���8�,7>�L
:ˌ
�R\���eZy���}�R� �S��?����M��$E�
��D��\��BL����P����1�od��v���
rq�\>Xߚl35}
S���,��o)W�9a6��r(�\�Yg�z!�0�S�ӗ[Hҝ^�I����'P��B����&�Z$G7�N�z�.��11�"	�?������\Q5��xv�M����]�k6�*�xv\���{�*:�H]X� �C���9s�i{��)]T4��ӗ��*��+�Jp�
�~ML�4v?�;e
-�|����\
��t����E�h������[r�������v�]��-[��h��3
+�=��X5$�)�g�U
+c�F���)�M:ۯ��K��<��ͺƪ8�~eo�1�M)3��B1se����]���-jP���x�eH��ʂ��<i/u	�-OϮA�ɖ7�r��<�X�
+C��l,1v�?���
�Mr%�M�PB��5B�]t�A�PPH���TX"���?E�c�TY���}�+�LƮ�>�
y礯�ͱ�K2���� q2����r��>rA����bI�!��x�C0=�E+E��6�:*
+�>*��	;�#N)Qܮ �1��b3�{c}��
�u�Y�{���]�U��}�n�95��\�)�
��_�R��P
�dn����P�H��N02�-��$�����ϠGe���lD�رH'{��N���V\�
���W����Gq���
����d��L\��ɣ�U
9����������7��6Ckb�Y)Tφ���ϋ�nc�kY��H��C�(�������S�B�
@��B:�?�
6�-zS#%
���6��	?39Y�
b7`
� [��)�(�5-Ż�V�9��ڢ
+��Y�}c�sP���i+=-Ka�E}crI�����Q/
�H'�q�D�h�A�
?�
҅G<0F8dS%"��_�b1�3 Ϥ�=�i)v
�!����8�\�.�R|p�3��j�X��e@��4@�S�.��,�_:�5Qٶ���Y�M��X.�>ML���
+�G<�Kd���2U=����t�M:��&
٫		z��Ƞ��� ?��/�'�O�Lr:� ~67�z�y� ��L�r� ~
� O�-�wX�����|���O�6��h�*�iK�3���}=�JfT*Wl�Da�s٪���鐿z2�	x��	z�p@�^�Dm#��R�'L@�
������ޞ��� q�>)�
 �9'���� �u����N�$@LK
@tӿۅ+�8��#;nKy����Zߦ�ݬẠ���� =w�<��
lM
633^ �H��ҡe@�Ȱ��Փ����V�Eh
+4)N
@e�s�
((�6(�R��a_y����ז�
 W
`T��R���<Z�ÿ��Y���U����ɬ��YP�y���f(�� �<���ZPfMT16ո�S�}@
�
+���&��S�����\ST���A,r�AE0a�Y�	�r�R����~������YHX���� ��>��[(S_�[x��ԫ�-�
`����V,Ө��� ���d�����s=vz"�\��VhǮ:���X���f��J��d\���~��g��� [Kـ��_��>F�?�`���R� n:� w}�O:�X��)M�e�<mwC���s��� n�_���
/����Ws��\b6�D^�A��7:�W�
+��D�GZO���r�\�E��Go���j����p��;����O�C���
�&Bk�0oIJp����@x>�9K~�
�Mf�)��h�F>ȥYv)ȏ΄Y �>Y�
m,�m���2�&T.��x���?��5'��_>����7��^�
��f$�G�4T =�Q�˼�喘�2 ��k
H�fH��	H{�|i��A>��
;]�<��)�]�c��1İ�x�N�ߒ~
I%|lT���c��qHn�M�$��qjW(-]�3:�0����@M�@͐4P�C
��pT�}%`�X�|�?��
��]�=���-��Dh���E�
󋳓B�w��8A��4����o�bi|ݶ���or��o�X�}
�b�@�/�@���
���5�y�z�S���6�GH�v�+����o�'��G��u��`0�޲��%���%�6W~f/lι3�;y8
���?Tޓ�������%���V�O�̀;K��H����r�}|$/=s�����6�̏n��I���Za@�������ډ:�e��KjyP�3fd
�>��E��NZr[u[��ɛ��*�ǂY^Em���=���K��
�omZS��;˅���q�ܽ�|wͤ3��WĖ5	z��$解I*L��x�q&zESW��7<v��Op������{3����l�ڛMj?9�3��c�i��W���
yx~tx|�oj֢�o�*&L�<�L��ORw,=
����3�Ty4���<k��Z
�E�: wE��bپ�ˋ>�w��W3?�*���"�{�ZW�ji���*�<Ӌ��~�O=����~�i��צ����
+�q&@�\��u��3����w�ӭ����^�}A=���ݖD��[WQ:�3o��^�������enZ&F?h3ZcvsVZ
����0�c�zo�3Ǜ�D����

�s]l at z����;�w�^��n��:�V�v�{�h�[;��a��L0je�pڜY��i��	��c�!�k}��z�ma�]c-ԘlV��J��?s��P��r�?ܿ��5����[yK
����3�ֹ��_
:?�2���9���&��D�����}���
Iu� i�]�H��V�-ڮ�w���=��t�Q���N��ɏ�N<�U���Z
K���,�����P)Ϊl�hq�E�0"���"��*��2	O
���7_7��y��VR��2�Z�����궔h[�
�S�k����μ˃�	�
��Jc�"K&Vb�Ѻ.g��Z���T���r�;�u�VsJ2ӷw��g���?�1(_7�b^��xu���S^@p,�M$�kHjlԼ��Wf�*�ީT
d_�w��B�^���v��T���c9m�u�tpJ��b����ס��_6 Q�8��<�&p˟(������mQ6r]{�d����
��I֠��
`��k�
7�
sܜ���A����5�tWȡ���ߙ���,���w���t�}IsH�O��
��=2��_̗���V+cw,)^y�n��4�!
/,G�젰8d
b����0Ǖ��4Y��j���XbEN{�i6�hh-�=�c=|��R��%����=��/G��U86���ֽ<�a	"�U��~��FKM[mk���iS�u+��
<D�A�F|�0�
e���&mU2��Y�X|����z?��#�i�����h���ڍ�w�5
\?��^χY]��
�_?Z�\�i�����Z����fZ���;������ײ�^�:�6�-'�6�*�4sP�	�'63oMb��B��B�Ɉb�ҚQ��i�B
+VjwjSncR��WV\6����ׅ�}�]��Z'm��
��v?�H�f�V��P�l�*ƫ6��c�"O�))O��<�i#yR�[�H�$&�-�|�v�����
ΘP`*�U���|�2��
5�
A�����2N?կ�.\
�v�@M~|r���j�Q\UdzM�yi�a{>S��e#O<ė����{1HXRR�������
+��ba�?�qJ�DI/�r�DY^5V��TI����>7
KmM
37��tq�˩ë���D�<E��Z�b��碔���;�hU�Ue��T%���G���lo��P�Z��%���PBKمX��"�;��V0�^�e�PF
+|My.��y�c�y�(���yT
��뾬3t�P�A����Zv���̫�
f�����h�`���vR^��[ɠ۷�
!y*��
u����NB��,��dJ,�R�%��.�6W�g����1_+k��}��] N�i�����Y�]V-��L@� &`jy&`�
���E��ӻ�
v���S��l�����P�?ODMcQZ	7
L��H�������	cs��Z:@$	
*���zI�yc�s���䚓��I��ޘ\����.�3 ��eR�-C�]ݤ�ھIg^֊�Fћ�&�Igއ6���3Wݝ7qck
r�u�:A���ɪ���-��Ў�����^"9�nB���\��0��~q��q����]�Y���LP3tf�jYL*��t����NhS��h COj�UH���q{
һQ
�tw!��iҩ?(�
^ӊ�L��
��[�V��K	}DS�V�W at yJJK�G��l��a�����+�>{�V��!�c�=�
�zx,'�6K ��р2��^*PVo\��|8$�|nC:��N�m#6�U�(�z����
�� �[)|o25�O�I(�-4A/�{{�����)�!��ge
��&�����ya��ܟ]Yml��!�n�;o=ise�Ԝ�"ʺ�1r���X�"Y@�)_Qyb�t�DY��x_.��ܾ����;��*v�?��nO�F�x`�&�X�
��i_��\j����n̑:MZ��KUɊ('REB�w��H�oN~��
v��{/�ip���g���!O�`�7�9q0Qn�I�

��L4�:=eq���:�Nk��9�x�>&�fz5%�m	�@�	�x�5���*�]m�R���IE���k�3Y,�D�5��n����7~�8�s�k�������P�+5�grE���V=]�e�)�k�)�`�
+�aMUa11��?h��$�^�w\JAn�*њ�
�ǭ!�n$ )�����
�/s�G�*�����$��T��<����4m�E]�[�2E�����p�x<>_�5�)�̇�����K7rUD|b�ٟ�7���{�������}�v4�~�t,i		����ߛx�SP�Ü9���l
E
�	��n|߇r;̄`w�
�o���)
�yݺ-���l���h�/d�E:+�[{�
+ܜĹka���yӟ��Iٺs'I���Gxs�|c~���[{ �a
"?������q�L¦����i��R�B�j	x�K�4��ep8�᱄�#������ 
�� {�u�Oj�J)SD_���
jF�32z�e�G,�̓�3�
������,��~̽��?�_��eyC���	O������� �L��Q��� �=2>��R��r,ϸЍ���v��E|�f>{�/̇����N!�[7�9>GiF:4� Z;Jν�%R�d�����l�ҍ�J:��"r���vA�z7�w��>�
�|������+ �S<��Sc�� Q�����X�5 j�O�X�>]������
u�]ˌM{2�|�_WC{����ʑ�y_�plP�H:��(��pW�vq��/��"�<�NO
���ľz_��W
�4� R�J��Nұ<
@� �����eR��X�6 ����s�Ճ$�j":,ӻZy�w�v�Uf���|�	%�3�mDSK����ࢴ�Ї��(mFpNE�`._�l�#@N ���%o���o4@�HPi�;��J{m at e�y,��L4�� ����R���
+ˀ|-z�
�C0žfTԚ�P%'�b�[He�sM�� dI:ۢpqM������`���P�#��V
���5
��
�[�:>@=q
ЬiZ�:�v�:����?�`�h�� ډ
�9��NV_қq!@�R
+�4�
w�^E��ydj�R
�~�޺B��yT�Ɋ	�d�Xt@�4b�8
9�	WS��@�܅t�Q�w+;#�l����g�"`Z�`��.`��
0��!��
0[��e���mf.� � ����1`
+�G{���
+�LS��R��q��K2N�
R�p
+et�{<�[�� ׃
q!��ގ<#!��-�ĵS_lZ� v�m6@��S
3�U6�/�M�
�Cp=V\u� �N
�W�Wp��8���E���[j	iU�(۳)2�d�6�ɠC/��mpK�Aܫ]�<9A�	��kn���&#���%�_��w���s@0f,�&������;*ȳ6h{�ǒ���m6|�5jc�����
+�sv`�ݴ�#����T�DK$9ȉ�Cf�
�[��M���~I8"@jH
����Vb9��Hc�҄%��m U�S i��t����u�k>?���R�h�.�
W�:�<��oe�y_k�!�o������_����z������[�<|�m���(���ٍ%��ӏ�rK)@٣u��.{��'����Lcda���uu6Œ�0@��"����<������Qn��7^�;��/�M|�ߩi߼�M��I��f|��%�˙z�m]5�@g��Kz�Gh���m��Pb^Q��_p�Ҟ���
�F�x��{����%�?;��\��3v8<ybu|\����&f�c�~Н��v���ƽ�i�:
n����f�/�4#,�i%�����k�a������>�������2o���?�U�Aw����;p�
"򸖏ܞ�iܶ���M갑���r�����jz���Y�򋝕/,\��Ώ�Fs�o۽�t�M�]a�������

g�Cy4�u{#
)�F��J\�	�
[�)	Hʻ5���yF�G{~��7A��\gN��j&��KO
͗�`�Y�P�0�cE�����}��`4��$uc�qؕ�q�)�Y��F�������V����]��
��^] W] [...]
+!�HXm��Y
]��zv�s���J=���6t;����jx�Z��%ݜ�.�&�����n.n}]���%�ݮ�j�~��I�ئ�j]1���w�ΡJ�|ǽXE�J������~����Y)d6�W��u$�&��^�2��S]6-05�UmV'w�WsY{��\cN��zl��*�fA�-5$\�	3�������A6R�����s%�b�ɸE��[E�0
��q�m�>��ۻ��m���e�F���C�¸I>�'wn��&)��2���Y�
�&�r*Z6Jck�*�Ȧ_���i1Z��E��"�����ʷv2�κa}��X�
���mW�R?��=>
,�<��g,�-�Z��7��4<<g�m
�\&�
T���&�����%2���ORa�A3}�� �R8���O�쐊�b�Kە%�f?�r�X��|]_���k;�Z��ܒ��*w�=v���:�4�fE�5H�m��b��
+��N}93k\���U�^wwiG��i�5G�X8��v��>� �
�T�	ϛC���j%��S��z�n���J�t�6lN�);��J����/
7V�
�K��4�z=3����o�2�?���7O;�n�����X���A��+��5g�~�i�n�U]��S]��7�����J-��ck]�r����ajl뗲�b��M�R���
�p�4�aYD2�B�^�A�
�E����.�%ML�3�M�y;�˥�iT�����yO����`�����Wo[�v+=H	�'V4
S1�]C1��R1d�#�1˽+���h"eU鵻��V�V{��G��
j�hcs�P�&V���W�Q��rP�y�@�gaX ����h-;%h2�S�ۺ�R5�h*���W�~I1�U]�׮<n�ٔ�)�o��_!	���O�*z�/:9�(:��r-�N>ݩ�ϋy);F6�_�#q�e��3�G���֮��֔�����P�W�U5�ʓ,~ò ����T
���l6f�
ĵ"ͮǔd�`KB,�(.Y�!:��@ؤ�P��@����B<_��y���.wj�wܩ]ǸSǶb9ԫbמVڗZ[
��Kx�Q�W�Y9c��Ay��/%}���I�_�� [...]
+"���[�,�.���
�v����Ԏ���;��
'�{�ʯ�U�r�<�Y��Ke�ѣ�H�f�=�#y:ÙUjڬ��\&XQ0��H;�a$��
b�_kD�]��bň��+���n])�X�g�R��	w��?��5
�P�	����0
+Er��f��y�o
��l��m�dUv�a
���I����ίtF�<�O��PS��MS����ŵ�!��=��H��Ě
,���.SGq����.v��9vL�C�h�u��ˉ;=���
�Ӻ��	�a
H�J����uB�y�7.�-��[
��{L���� ixt��/��4��fpzO��r$��X��e�u�J%�_}w����Ƴ�3c�
��3Vw㛬��*&pM�}z
w��酶�s��F1��Ά�~!M	��˙���/+2y\N�=�_o�n��;'&��w���״I���@3ҫCK{;�d~����-�;�����(v
�,VT��)ۘP^�ы�N�V�=���b�d�I��nt
#=л!=�-!w���zz������14����+�
����}�ȼ�����ZI>2�{��f�����w��#>�K�9��k줯�X�u8b
��c�Z
�K)�my���PP��e���
_a��} :�m��f�������-��Nz��3�^s���M6���&�Q�T�S��y�q��� /l�'{��Wf�#=AN;jN4��1�
�A�3��O�X#�X���j��G��d
W��қ� ��9~q#
��i8���چ�ང���
�
@�>Ȃ��i4w����|���F�1��N!�2)����ُ���w?�`�ّ�JaMl���q��^��y4D��N�H��k~8��>����
��]�/܊
+lve�L���d2h�]�_�^�B�k�
��� �=��2�e�m�f�����������}yr���C0�V�JOz™ʧ7{�`
+���+�	�q���
+U��~E�#��#�����+�r�W,>
0��c�( s_6���
����`5�������
+��2i`f^��]0�k5uz�-5ݝ��
+:���D%b{��ɤK��/�/l����;�<�6�Yy�֨�l���s�f���B��k�
���
��
���b�p '�)�SJ!�Iര�e� 8� Gx'��`�I��͗�`��ő�w�VNɞ���M��lEX�b��
���~�E����F��I��
U������G�
G'��7�w����$|�� ~�S��E��b&�^�Ћ����||�ſƮY�\�|�� P�Ƕqp�-��Y�����8�����񃐲���F�罍�I��yB��N�Gh.=� ���@^W at pt ]QmB��p@�?, �K/˻
+��r�}I��Ĉcy��h�W�(�"@T�y at X�QJJ�e%�(S*vt�/�fBƅi�~Hr�>q�E�\~���O��+������u�K���' A�Hj
2
�,�
 'U	��}�[�K�K0�,w�%� 9變�g뀬�;@:O��
��ՋW�:()p�&�o�oMyv@�zVwQ��{�
�ߘ��/��
6X��w@��H�C��! � �F�����6�8��<y�� �t��\@��~,��Ώ���
a�r���{T�N�Z,�.�T���2�|gEW��~o��>)������JL�-adT( h �?E��ʃ<�c� T�#�,�?�`WP=s3��yy��Q0�J'��
0Yz�0LN��
��
[ ��
��@U at o)_�����~�D�y�*"U��X�;�iL5Yɜ�8���蟒�j�=�'����_����q�,`1� X�Sl���
��1�-�X�8���T���.`������Glg��;>+y,��g��w�}ѴA��H#j�P�4l����埢���/J���������ǁ����D��7�/\�_i{ p�
)�� 0y �
���w
�=b��
��|H���ʫ���"�4�

ɶ
T2������$\")%�"�-�	,��8pl������;?M|HC[ Rck��m ����^�
�@�
	H0� �����y�`�˳L�ʹ�=�s
�z�<pSp�O]��IJJ��_����Mo�O�?c���n�z^���q#
�
��Қ e�}�� J��<��(6u
+��9c�����c�^��D7�
+��m�O�E�O��M$����Î���&�߿�����L����$*!q�^��?F���t�]�5�ӗЂ�hK
�0J����r��������=�wk�Q�"���
��K���1���s'�z�ڏ�a��6�G����y���V��V�I�̀����x��JnW�@��$z䢄-\l���T������
���x���w���_$���|b]MBC�괿I�e�<.<
�7�r�i�k_�\���������U��—��Ly�ςY�rS�K���4��}u�o�ƬE���6�����LR�Us<��Q4�6#x��
�L֥MeP�wǤ���c����V��&�����f?h2�i��I�
+n�lo��<r<p.���c~7����t����$uu����G��:�ro�2�F�e�|ֶ�
��4�ߕ
+x��W�^��)?h�%M�έ{�tԗ�o2�]� �۝zˌ1I�j}�d��]��Jfd%��$�4�x��VAGQ7�G�0 �G��������\f�ޱ�8]�������:X�^�i�^A���?��h{M
Ŷ
�H��z�׮
�ɓ��\12�Ǯ�����G��O��@�e5>UVm�S�����:�?�����CG��V�pPݷ2��9˖�M
��\�N�~��u�����A��W�Ɯ�z��|d�������ݗ�t��J/�^�f�N9�)�����J�ry)��YX���h�o��o˂�&�Xj�����߇����ޱT:�uqqǗ��s�6\�m4\�a�*ݔ9��5�e�����T
���?O��a1Z=A�"�H޽��WE���QB;˪S���C�J��j�ꗎ>�~�����	`��'iKFώ%�o��8��!��y';0a��cݭW�װ���l�t�vh�umTpJ����������2�]E��}n����m��G��/V�,?,4��m>�r:ų���e
��^ϛ&�kf"Ydf��=c)2���������;�-߉����o���8A�IyqQ�j3��`�C�����9V�i���be��W�b�����f��渼�&�3���uw�j�"c	�&�C�Q�k{ء��1�
�|j7�3)7;��XX\�Go���F���`�םs"�T�/�o1򮦽k
%Kz���Xv`�Qs\����=E��`i��"I�#�B��J,����VsFIk;�ݰZL�鶛b>Æ~�.�z=w��^h���i��sSo�n��ʓQ5��(�)h(�fs�
Z6�
�Ò2�X3%�VɱX
��E�t��s��%�溌���2J��+�[<n)7u}���5���#��k�H(Ok-[�5���mm�j�Tɨմ�`?**��*��mK
7_Cٔťݫgi�;}$+��$8<Y�7q��7e��7�ɢ7�cLB�dT�w�"�
�
us�xs鸁�R
S�h��#��{�v_�I�����
*�M1�(����E��q��eS�(i�1Y�RK�O���&z��):���wT�S�'�r��@��3 [...]
+�q~7�0��߈<�>S�q��z�r9��X� �~P��o>X��(�v�d��Ui1�~dnw��e�+M֠�o�mӜ2�dTP�L��Wo���7�"叻�X�8[a
�k�\C6B�;�]�^��K�Ϻ�wB&g��\�8���1^�n��3�a�VYfz�$�h�w�~6�=�x
���z�=��تˣA��ƚ2?m�2oH��)�Z�b){>������>\��<m�
z���m����xn�\p�[;��pʼnZc�^��5�.��}��^.{ft�z���^H�o��6
$��5��
*[�(HC���YZ����J,#�%2�¼Y#�[�áa
eg+��kxL��ל�%��)���--v����
�%_��
��,=��-�X�$N��HL}�1z���Y���cM}�Ϟ��i��N�e�ru028pĊiD��1�4�m���~�{�C���8Ha5)UǸ�u�q�3���b��O��\Ǻ��
VS�#T�����F���d[G�9z��N��`�
nB�.����#jj�GT6l�P
+wf�B��It�\��hOѕO�k�o�
^�sN��2v��rX�֫���/�g���#h�S�PI�\TbGs�znT�E)ߴ�jŒ��j�2��oɓ�/ag��%�7�f����
]�	��!c�>i�j�D�L�(����^��S�!�v��Xͭ]�Z�����ꣶ�6W�
���
+*��E�H�F���%���G
��H	�@�rVg<�3�c���[+X�v͗�l���&p��YI���ʟ	����j�(��.�C��n}��=1�LQ_�<��$�h
)^Pi�y"��� �&�"�L3��ѹ s��d��w�4n�9Ȥ

D��"�p�L�C���J>MN(E�Z-�j
$�4��
��g�%j��pEg>ʜ�=�c���x��
+���

�����Z��q�3�v
H�oMd�p��`ډ`�r��7�ȐٰsH�`�����n �Wi���\,�
@�E�=�Hg3g>g0��
�ł'D���
	nC
+�V��'̛
7�Kj���Wێ�u�2 �{��3Ϩ��
AmM�rg�1�
�Sx�^ϡwy��&�m�G����c��A 2�q �Jf,�*@v�,��
 �9
�����
2x �M�iIX.%�'Yy
g*i���읯��&޹/�'
�0!(�
����
+룭뭏�;x��p4��o
+e��
���`�� �bi��@Ŝ	���LuP�z�r�T �d& e�7 at QH�ટ���DJ��"�]D��;qy�o빧f���tNl��w��k�� �4�2�
!����p������ ����^�W�{�z�5�J�ѣO �$I�L�x��O��2��|�	�
�����h��h/^��nF}vˢ�,j�*T�Q�����l��	{�Sֵ�&������;�*c�rN�P�(�5�ȸ�A0��n0ț��� �#w ���X:A,G 0��>���M��\n���f!���
��ZX����! &_�TC�����
�f�����Ӕ��`yړ�NuC�8�ag��
ݽ�
Uε�"3S(B����m
+�v� ؔ�7p����� .��<B�KK�����.Ʋ�\�� W���N8���q
-
 X�]����(C�_Q^8 ���m?�?��P���Hl���&�
+��k���v	�Rmʹ�
8B48A. ��m ^h~�%�����G\�
�U�XT,	|>����� ��� J0�#� ����~s�b����I��Tx��_��
���+u{�Pռ���t�kNy�Iee�˼������*.J��j*k�?�[@��# ��U% ļ�u���
������c�|H�h��f�dU����ƿAX
�b���@��a��-VR+.�{'�-����l��z�$�ղ�3<��#X���Z#;�@e�Q�q=�; ����嗘~�/:(��ʹh�j9@J�X�
�2�U,���"
(���S@����G�f ϯ��������!�M�������:!�9���l�}D:�))�ʭ�
����?����%�_�|
Ҁ��"�--�Y7�ۭ�j��n?�=�Ў �qR,�2��%��u�f.h����m#%�³�#��-��{��X�u?�+-�a�py�!�IQ���˓Qr�N̷;V�CL��
+��� �*��]�ګ6`=nK�����g �a�l� �� k��Ur$`a�L�I��pw���po�\��ص0$D�(���������o5_����	�]�ҀE�,`S��/���8�_x��>}�R[� �� ާ0���
+�'L	����F���� �R��s�����0t��3⯑ڠLr����I��_���r� �oZ¿�����ޯ�6���1j��Ҽ}�7��0�-I<�@"
= ���b���f�@,@N�4r4&

ܟ�*:�Z�����c�_�/���N�������opC�+�ӿ����5���t
+(��u�^�P6�5P:�(&E;׀�jo��">���s|��v[����r��&�䤚���5|��������+4!���m���Fۭ[z3�c�h�zK�<�@Wz��h^� �p������'�V��9 k� (
��c'd��.sw�_V�]���1qM�s�U�V�ց��=?
���<��vV�
�qu=��UԮ���/���ؙx%P_-\tp���u8kq=�5���z_l�(؄�&�w�/	-
.ׄ�^;���7~��ǵdN���)^]�Z��۵`�����u=������^�C�.
}�G;�~�f����ު>5U�>7HGq
v}m�y�h��
#x&5���
J�b�wY"�A{�����wdՕ��m�C^�2HܡIy�T:���/퇦-��D��ˉ1kCsz�̝i��T'��g
��(��C�lO�iY�Š�6V�]���3�¾wt��
�޺-����:���#�=0B+�f˄
���9M���lx�_h`g�W=���<y������~3Mi-<� [...]
�{�`Y�����إs���	M�x%3���Ԙ����X_�a�D߭��*��!��Ɯ��j]�F�߹!��x�6���q�`���."�4v�\1�0�⬜��C�W���]�SR��Ct��wCd`���h,$��[�Rf�����ŕ��*Ѫ�84q�FK�X��j,�f,�~,�Y�^���O�M/g��<o�������q�B����y���>�_P,���}*�4\d��.k0Rd��(e����
}
N��O�L�
vOfw��	�-2��+)���J�C���$Z���[�� 
�:KX�Z�����V�k����dF�AA�d
"�0í�6Ǖ��4��%3���/�� _a2�urJ
Fyc=�;F)=�d��R���M��c,�k"�?9�ݥ�E�
�
ȉa5,ژ��4)�̪(��
+GS��\,)�a*��fڑ&V�-
ƺ��%�R7�糝ڍ@?�f�I����^�̽. ݻ�//��*j�&�kK��S
�[}
�t��aUM��j�q�$�|��T��'5�n�
W����%��v��5ń��/	=�?ѯ#����Xr�. at EA�5��P�;)M����^�U���`�u�A��R
�
ɡ�]����,���#E�*/��-Y�x Y��]�2��d��Q,�_�]p�n�"���&�h�X_�/���Z�����U5��(��xT������`�w,$�*��IJ��a�Y�%Km�
�2�78ڢcD�*b�+��͹P�]O�� �[>d�-6ʼ[2�[
0�[�T����.�;=o��P5ߵ%el
++�7�O���/�;�

c)�.�\�����`��������#�Xؓ褄����CX��P(�V$P���y������Y�r�50�zI+q�j���6g[�x�#�7���~��]��.��nڕ��K:++X��8˒�9�7�d�S��ڛ���d
��Sߊ����d��3�1���޵�	�"�,��Ke��
�����e�m�g[�򝕙v�܎
����$���HW݈e^�]�K����g�—�S�q�@�'ʂO�$Fl�)��lv85Dc�"�xrz��Jy�;[�Z���|�5f�1{yB��<���Y��^��;=3�~eKFasA��5=h-��!|*�?
�x7 �m��F�J����ʺ�~L"�y&<�޲k���޺�8���?��sQQl��W�E�`�9�
HRr6�����՟��jW�����J�cH���a�s_�֥����P��r�p�I��(����l_X�-%_�z|����
��2�
I��hDgڅ>��2��+) ��.
��\J�g���\րL�)��Z�����$R-Dh'�ur���]"mç�����aQ��}��ㇺ�������l���j�N��
��̱h��2/�V���	�ɴ�
2�ӳ�t�'RC��t�������䤭0��s�E��!\�ļ���e���^�`������W��Oo
����`��H#Hi���WH���H�3��i��h�yl�b�;�.%.̓
qHϑ���m�]�)��t�K���'���%��%��O�����x��@�L|�P||u�h�<;!�R��`O*���K)�5p����0��|�����!�]Q �Z�Ɍ�1&[Vb����k;�Z+s����|Yknq1G��r�P�7�'fX�K�
}25����4��	ۆ
L���_�*h<�M��POI�dX �
;�by�0�op-F%c7ŭ��3�5K&��m=�R� �i`%�y�'@.�o@���c�Js=ͧ��(�,�������
����#��ӂ�0)Yo�IMt���-��<���
 8��"�mEJ�`
;���
&�Z&����V灠`�̈�Xs�𢬑�E;Ħ ��`v#x�5���d(�3�X�Q�b���Ut�e��3j��
\x&+���Rc��_
+�}֫
+x��3�XgRqp�I�r{,��l���\�
9+�5��9v�ks�1׀�>6e��.��s�uMH�l
�u_PLne���+S:+ O ��w(��KP�+Ρ�C1‹���T'�c��?��"������g��Jy'�)%�fŸW"���ٶ����/ԺhAp���n1
y�5�>
�"��AB��b�/@0T7�P6��
�3�
�G��8
+���
+� �+
��iB1'\�8�ڶ��ߍ��*^r��of�vO�ȼ�ܔIN�Y2��.D�������ܫ�a�� ��ZU�B��Ap��!xjQ@0N��M]�9 9�LT��+�= &�sq�C0�G@
^+`ߘ� x����{W��)���{Ր얲�L�4Tұ�fI}6b�))K%��iG�[
�����E�z���ZD�B+��Y`%|(�w@���!��!Ŭ�5^~� �4�CH9J�yr�7 $=����!$�"!ػ���n���������8�]�s�5�̴(T�œ�w4�XSa*�� r�!���ue�E"��Q�a�\qi��z�B�ƣ���r*�@��$���*��B�m�_�}�' TB��B��
BV�vmk!`�T
��XuR_�o�7��l(������b����m�B*构�-
�.I7H�
���P<�a�xF�x�Aq�����(�
�
�
�
Aq��"4������P�i���6���7�����
��N��]��)������#��Z�}^����b
+��aͅy2�a�j'���k&*)
+U$�S j�@qB��C��ς%J�×���݃l2 2�ъ_֜�v+(A$8 �
&��eJ
:(���P���,�+|�9=���;�5��v����6b�}��
+�h�[`����! �T�"�G����P�bP��P�����j�3������6���P+\����AɎ6��Z��:%c'�w��qQ0

;�?�o�t8&3hۈ���̻C*ј��D2&~Ei_C���+JuA�RD4�^�!�`�]�߅RN}Da��[3���@)i]�RL{
���J��$�*w6�u����Љd���}���$��/�7또����1
7�
+��_�dp/�����v�y(�K���κP�ҧP�Nm��j-B���e�$e����2I����)\#X�Ai�]��MN�H��xk����Po��f�
M���ç�wt��/4�Z���
����U�q����|�;�|���ۇ���ʍLʍ
ʵ�(W�>�\	�C�Wbe�
e%փ��Eʎ�X�^粏��\���~pG�I���� 
}��z���f�wD��]����×%
���[t��RA��m۶��X�6�4T�rm����P!z3��I���nՅ�x�����{������m)�b�3��"Gؤ��<�K:�������ŷ��
J~���wb�^4�[jK�õm�Tng�P9�nB���J���V�0�,5�T*�K�,�l��(�2�
�c7{�A�K�
6)���?��7�;
}/��Nm߽�o��,�����=
��+�-�}/.�K�9�,Z��
��%XBU�*	��Z�P�����d�
+n8�T}��6�w�
+4�B�8����G��η��m�ц�-���f��[��m��p���F[�o��pŃ���H����lW��Pc#ġF�ц�7{Օ�
�O�������2�M|
W�#6�I�V�LJ�:�LW��w��9OB�D���wJ�a��������X����M����BO6:�����6�To5�]�ʸ&��K�X�-��b|��+�_zk6��c�3� ��+q�r�;T�>�i�tl���yɸ�]6����])q���Mj�a�+�Mc��}�0��!Z���x��;����3�����k���:܌}�o��������������w�A����v-�|Ϸ��Z����+�E�Ϟm��Z����+�E���/����Ո��y;�S���X��hR���iN�C���n�7s�
�V�.�\qM�z�}��W�AL��Z�Z����~�
�s��ۧR��M��0Ӫ�8<!�5��~LN+��I�gٓן�ps�P�;54��ns���
-�E��MA��r!�<Ӱ=�ӣ� [...]
��
OY�u��e0\��Y��=57���.��ƍ�,m���<:-��lYώ���I/a�2W�����
z3G=������P���]�i�O���d��j���]��M
+`6�mұ:�j������9%�g-pJ��c�ʺ�,��b!Fc
�;tʇ�%L����^Sv��3�S��ZU8{���7�#��g�c���&�Y�՟� v��K��BJ�U��O�}�hz��
��Ӄ�Iōi5
���U�/���&Q��J]�^`���nia���9	U�&\j�;O�pYܴ���ԝ�ڙ�49�F�v��Yk�`Vƚ-(u����TB���m��t��(��A���H1��S1yך�L^�bA߸h��>�#��T�|X�4�%+Mp>�&�4�\�Ǎ'%�w*��u�

�A��aLUo�ګ�%��y	�#|������� ����`���7������w������w�A���?�hu���s����K(K�>��h�*�| T�
�n
̪G��5}�̥ޕ��4���~&�Y^4ɕ�Z��96�V����m�'A?���W�e�G��ˠ?��O�~T�������
+�[���������~�{�-��c�Å�]��f�Å�Ա�
?A��l�ߘ��7T��~F�?\���X~�	�ʟ-��a�l���?�g�Å��c��W��:R�GLp�������^�4tP
 ���E�����bJ_1���8��@��E�
+@�X��/J	c�8k_�[�����{�Y"��v��{#�}@Kͭn�|4W�U^'W��z�_��@)1U�&�����$Ν�I@�`�Z�»F>3�)F��%|��r	����ն3���e�=��:F������Aw�g��`^+�ʝ��B܇��([���
-ՠm�$
t�<>!�X>��oy�Z�`v�+L}�U0�u�����+�t����S��/��u�����!K<d�x�۝��^�}b��#���i�#�V�j�λ��;�n
�\��FsL�S�
{&��^ÂN�r
=�u����֝?���3ϒ|��S͡�i�~K����r���aţՃW��x�ь�6�\N�CUT����4��qz�@�};���ʓ�^���qhx۶�L�?�)���9M�>+�yT�^�$�s��4�6��Ҍ��Ϫ�F���Ӕ�7�.�+3�/����ǎ�@]�m��0=�9��=�fZ�+�e�F� ��x��`�7O���R���W���Ψ
�MC���tX)��V��-�*ٌ0 [...]
+��Q�_�������F�g6�@�#���ž�{<��^�����f����
�h�$Դ��EZQ��V�pg���D�O��A�Z�����¢b�XKV��~N���Z��M�?I1��LN��k�C�L,i�)Mij�
[tO2�
n�M���gp�["�!=C�y����J����$�r��I	;���^�.��º��}��3�ג{J��Ur��$bMs�g<NR�cPi�7� ���C�_���~�-�f�W��F$i"sE���snc�ypG���a�E+F
N�t\8Ơ,������'�"�1'�FE�'$����Ujf	6U����H�IB�
���֞�vQ���@�v���
w2*�ߒ�V��f�Wv8U
�W��e�B�M�
�'~�D�S� :MvT��%1;T�1.e��q8�B�	�H�Nd��S�#'{W��p�Ƽ���Z�"�r�X����{A��O�^�yu�?i��8�5^o����UJn�	뾤�N8F�D�P��l�Y��=���-`\�H�S��;Io֢� [...]
i�u�d4�[y�kR���d#�}�EX'aE�N�vc��[�:�Ҙ��7XK�6(�q��v���Ф�Y��ⳍ�ֿ����
s����C��~�?��I*j�ϸ
+�L�d���2ľ<i no��V�bܰ
A�Ў0e�W!o{���>�E��M"���~B��~3��2�'����C���c�_�&�#����t��OP�?[����.��ʟ-�̒�l���?�'�����ϱ��¿1�j�C~����-�V�W�� ��=�?W���Z���m&Ą�`6+o��3�h�4��7��?��@]A��W :��^z�|�Z�>!�X��?�Y0��B�}xFh�2�y�?���Ϥ����S�x I��.�u��4���WOH
��o=~��
|�Ҍ�g�y�
� ~�R �~���@G��\�/��H<��M8�*m'�=f����X Nr�]0Ji_H�>�?� ܣ��P(��
+R3�#
����m�'���'^>�7��|]1�!ft	03r�G�$�19��_R~=�$�y
+�R��z��[�O��{����{N%�����D��{�K�I���
+�VN��
+
+I# �-?s%W~:Y��l����!��iH�$Q>w;�,�X��7x�
�nw�X�颋��O�"�x���	@��;g�'3Kky ] м
@��|f����`Q�a�̩0x��
C��vw=���S�2<�Hу`}��
?$^�y�x�{xO�Y�s�0%�� L�0�%��^� ��qqZ�ąl��<YEX'.�v7���vΓ����R�l@�6���D���ۨ/c��M 虝��c7�r�����(���ȯv3&�7/%Ng�$�.a0W����V�<��|��9�[,���{9_q�>
�G�St���x�
+8	�S �:�ك��/�LZ�Ԧ��X'��ia���ܙlG٪N߷�a���O֡���4!�D���qsN�/�0�߽�w��^�\�~g:q���\V� s����|Ml�e-b�^��Cט���Ƶ}e���B˵�EM.ށ8���s:��!��%���w�S*����{^,���� ��n ���4*�խ��r��Ba

+�|n^��E�m;�䅉�̑���=��8-�y���N�*c����B���m�O^o#�6��Eu�7�'e
�v�A�^CK�5�j$�wʸ}@s���G��ir�J�Ki���B�����I����S�(��ծz��^�z��6u0�h�(�z�Z�9I	�����
�I*`l�c
�ü�#="Y�J�
+q<���|

���Y�v:���&v?)�o;��M���V;�{��r�Eno
�(l`=z�@�I	K=�su�Tmv�r�L+IG����Bfg�(
�ܦ<�x�0�cʁA	�7�I��+gﵑ
��Ԝ���>�h@�������p
�Y���v�b��
��A�}Y&���H�pz�lw��0�7H�Xsk�(H�?
+p�_���
�Q�p�������IJF�}�Խ�ƃ�sD.���5��E��B���ǝ|�'﷤���B_ #�2x����6���+�vl�������s��mG
U��M�G�������6`�-4�hF�$�#e�-n�G�x9� ��Qx=����Ea-8�5~$����~/�i���W�2��Yx��0��Xf��}D��*A��=�2RU�\*&O{��2|�8�*�
k
$��8�m����������Go1O�"nb�#nT�KH\���n
:�b��
c�T�1W�aq��� )h��6&K�k2uИ_	�E�4�����oP���ע����
�
+����'��m7���qf�	
j�\�6��m�";�T	f�7F���+���%�ˡK�f��4i���de����z���Uy?��h��6�F�K�
�����e�=�x�=u��Ū�n� �
��J����~�,,�d��X������s\7*�r���\��Μ+]��4�� �����0����A�h���r}>��y����q�Kd�^��M�盲��\�q�l��G�Dz��gI�%.R/��Rt.٢t#
Q:�<q8�A�&�_��ˠ��3�_�&�#�*�
�e�O`����¿1�����ʱ��'�#����_���H����o̰���V��T���_��w_AA��d�AP����o)
��:b�s
 -�CШ��j����SZ��U�4ϑ^"jK}5w�b��E�	��7����*"M�!$+�?���7� ��		J��i j��6�ƌ|���I���Oe��ϒLT��w�Dj�H�]�G�a��(��zr&��/L.k�;��>{.	�I�ێ����
m; t�٫���*;�������MP���`�'
�o�%5�B�l�$�;g�vE�R���
���!�ڊ  4tt ���V����P�׏ܶ7��%i���jn扉$tf�&�֓����6��������	�g�?�@ �7�[���\��
��i���?�-x�
;��8��w�H&�B:���eax�N�ҋ+��������#�u���q�q� ߶�E"�R�@��
��� t��H/M
 �G��Kj�����%&�e �M8�G�ɝ

�+������U
h�N�iϡ����+����x�C�'�8Y�l��w�R �b�U]DS����Kn+��0��
+��A�AHB�Ř0W��)�r��-��E>�S�joScD<O"�?>�7y
O|��s�'5=P�,�s��Z�����-��sk�+���J�c�v�m;��1��%I��B@�w�%g���f��C�y�?l�=�[��+(%?U��j�< ]���T�I����VB�Xj�ü(���G�v�;��-{�d�
+�d��WIk�+q(o�_�GuF�_0�^�9=X�fb
+����;��:Em�C :��$%��!���K<��Gch�6r���r!��8"ރȗu�Ƚ8�%����o� ���ۃ J#��_ P.呎���F�{��|�\�e��w+�1�a|0��5�=���M#�ԉ�
���9U�oJT��S�l��_�r�U
��}|c�����vGO#�� ���h�p.�۳�~'���z���-I��7�<[	sP_�nノݰ�	�^o���+r������Tp
+��C����f�2֝�P�̪(�%]���t���#]��K�r���z&�ԎԴ�Չ#M�_�Ѓ�5��������s��w	�{�ސz�{��� ���۩�im�i`��s�(�W
�Q�qR��
����q��x�59�f�{�Hi�4�Dz��&��_�P�X���ۜ_
�\���mFJlc~�������f.��X`
d���Bn3��D��5��n;W`��9��X���aχI��-�-�
K4�4��Cf�_�����rM���<��~���L���3�UR��m!wV6��`3��׺��Æ,&vn�,+��i��7������l�%	U�T�{H���Z���g$<�x��Ŭ�+�M�?�V<a�+g�ZZiŠ
4Y��w-���%0Q�MJ�2�
�Q��v��]d"^{�il;(��ch'8k���A��%�:D/��njA�z=�����!�7Y1��
�ha�m/>�3Rcx��1;TȽg�ʏ�͆~1a�Hc�;#�-5 Ї_$�n������H�
+���WpX�vf
��ݰ�F��m��3��z�;�)c���
y�Jn�4�	�Ȳ��a�k�A�u|O�Q#F�����Q#�u ���N�g�A���11��*\46����t�$f.?ؓ8��
+���!��JXۏ�KfS��N�c�O/��\a�6`�6a�%���Eਙ�E���$�/_Ϟ~K�:]l��
��6A�W
�7�:�7
؃��Gu�B��T헽�zo�kd7�&�zܾr��YK
���_f��`q��
F�$��m�'ĸw� 7͞xt���y�@_M�q����
��V-��ɨ��{�.�9l/��J|��‰�{��3j��fuh��z��n�̴y��&���+��D�����kƗ�8T���Ơ6�(�a�N��h=�|y�WܢL��#,�);�
'B׻L�+�
����̮#���F�f|�d��

�l��H��++���%(ܒ��0*��?�6��/��R=�:j:�f�G��&]��ًZ�u.
+s�,��Q��]\Z2
WN��*���$q��%ؑ�I`��� ��0��
�.��f�e�O�_��'A?�	���
+�	��
����?#�.�_�����	^����	�����/�	��g
��X �p�V
+�s�Q޸"R�u�-�U#7���@�ɃV�KW��5G�͋�<{g��������V�,=��E�
ۖx�r�^��"�(���0I�ݟ@8~v�M�u	`
��LTu�Ă1�^4��FԞ�����
�U�Ǿ#?4ϖ����%	��,�
˖�Uɑ�Q�%F}�k�ʧ����A��y�8~��KP�d (S
A���:@�,���
/��[��ޔ��we�um�E-�O+w���u�*�Cf��5}���
,�a1�~R �jVfG3� -�W�Zy
�Zѭ	�����
+	�夫���WZ��'wqו��̖b�e�pDD^��V�x�'^���X�d�c;��?�� ��"(n���j
�)WuW�O�iL�]륒Æ�$�9��68.|��7i0���҆
1^�9´9�	I��y�ؓ��J��6����%���S������j��TJ?��bU�������n�T�0��@���C�:�'���M����)�#v��K���N����}W�:s�^'�]�?)�p�i[a�ߠ��@#k��8�xe
�ɕ�n[�涁4,�wq�}A��߯W>��4^\a��w���c�Aʦ��ӑ�7D0
{?��|��\��ߘ�L_0s�2
Ci�Le������,D�ޑ�>�m�
\!	?�sM���2��J��7}Z��
%߷j���'�ž���@3M ��y
+A��"�C)���w��)����>
�W�h��
+B����4�5���G��ʅ�;�9u�O
+ ľb�K-P�­��;���@��x
��UMm� tR�ʱ���Y=.�}�c݁��ډ1�ђ�'����+:�~?;�z�xK���Y���!h���{
�ءd��DLJ��Z��*���B騣h���T�����f�
�͇_��h]���+�iƟDΥ��U�6�Z4?+�o;�
+JT[�����)
=�B�*|�Ci�(�'��)�(�:
�HH�qh4�C[6����T��9(xl���
n[�
N�r��@H �Kb��j��w*��QX
�a�8�/���WZT�!�w+B4xY��
�
��ݘ~R>QI�����1K����c����n����f��M"��v��|��_
Aۚ;=���
e�S<�3�Ml�hB��\�$�
��ӷ�w�k(|�vV�3
�M
2
)r��n�mU
��v2���B�������$LG�nFz
�1(�:���Uwz���=���[���D	�խ8;N

]�\��p~���
k�L*�*�D�����f�f¾��d��!��v꺿�O?)�p7J	`�
�9�nj�Q�)�M_�A��4&^�Q���~�����v��r�_����Y".~|��F���ׯ������}
K�ǐ]�tB��D������8@���� (?W����=7��8{�4a�_tgK=[�n��-��
��eD%��Z$
+����뷺� tN��qE��„^Ź9���%|xT���:3�
4*�ֹ|�������\ޚw�~�����[>.1[�{ 7�<�}i�4:엯vO)��o�>T��E2L3<�R���_��O�M��������
t�=�������������3��1�,?a`��n���Ĵ'�W�����݃�����?�����j<�}W�c���79߶�=�U����U�g���E�K�W~��f�Z�����j*�
�_�.��t	���[����G���&?�.9����.��3
	� _)7�g�_���i�wn~�SHp�߂@I�.�r��>�<q٭|��_�6Ζlo�;
�.�xcTXb;=�B��~���
+���Zº���T_�T2� �M2�b�8^�?)�N���m��Ġ��x�r;�ڢ���`s���&?cU��
o�:h6
����_�`��\<��e����TZF�w�ee�sj���ҹ�����Q�~�{~�ϕ�C����86�J��d3�2�Ȝz�`r]����Y�ǡ�<�2�SwN�
oF�^����2�U��u�I0$�	�`�I����3��E�����O�Y0��ʯ�b\���ٷf6�-�L6b�����V9��Yl��n���ܴsj��>�R���5�q�3GK
GIw|���2\�Z�0c՝aF�_�d��+'}�I����Q�+��v�
P��'���hJzVJ�/�E�c�簱���b4����
+���Q����mx��7��Я�R�uZJ�"�Z�Z��^=�:t=�r�w� ��TPX!c s-(��|�go���;6���\�p��̻��ϽvQ�g�l���F;'�
ŏjU;
�����-����Sg�
��B疎B�O�|.�[B��q�������A?�&$��	���o,����l�ߘ�������o,�\��l�,�1:�
+�傼�d ��w
-mQ"�b��.��^�G��V`�����:uR�g�����I�E4�>�\�A
�n
\��.}�o�
RW��?.A�N?��l� ���{�=��i���r��'*=TG����ɽ����VI����-�֌Fv_��4����[ j˕}�u�w��]�
}O�7����m��'=W���

+~���d�;F_�ԠmPi���׋bj\r���
�w�|V���R��b����
+�e ��-��	Wn=�!��
jw��s$i}V��ѯ�AAJPi� �#p����9��V�4�!�sd5�׵
+�3��m�����y�廻�d��=��]�"A~��ϯ7���`
��<�����<���su~c2�*��Gg�%S'���kr����N����Uἣ҉���ѩ���ݣg�W�\/R�g�t;�EX�{�������[���oA����
��Z�#�+�=g�g�X��sY�X��l1�i�\����������
ܽ�
�H��ժ
�+���Hz��a���I����h��%j�Iy? ��WP�	A����<�n�n������όf���W9��6��ˮ�i7������a�U�4W>?�0Rb�'k��败���+���+�J��YH?�#�I����W�j�_ϩ��9��BT���\�{	�+�
�}t/rݰq��,�oB����s�uw��9o�kϴ'���7������ ��0(\���s�"��v���O�r�bfR����Τ攓�z���}��gF>���EŪ���S�d�}��|
�駤�t�4J���K8R�濂J�����w��1q�wZ%3�y��s�	@� [...]
+o����w�Ĝ_2 t��5G+���m[
+��r��������.��n�l�WP~�Y�
f�G2E�
b�+*�BMKߓ�O�0fA��S��l"��$kW�����
��"���g	���p(�^gn)
<�B9)j�M\��%
����-mk>��V �P�
"7�
7'5mlN���AK���K��ӄ�pt��}�������
�YӔ]�0k�z���Z=/���KzHʢ���’��J�M�%����
��m�e�������4|C\�@�~�w ��~����v��Q�ڦ��>5��"��6�
�n��F�s'.%o�~��8�D���:�)
-��~��P1�]<cLi`c��>bt/00:j+�(a:�O��0
��;�s��������k�ey�Kb�+R���DwjF�IU�?F��
;o
�L����-g�
�Zr�� ����h��8��l��`��[�q�%�g����f���|/�;�΍�3]����*���x���(.
F�����uM��\�
_j�o)�_:ߢ,�1����[�
+���5��u��y�����X�]	���(���ԝJ������_��
:��:��_�z�˂#�ٖ�/Zڮ�*��.ur?���~�w�%��i��"�R��*���U���U|��]�D��� �� �M�c�zT��&�ӫS��^Ɔ<bf�)s�\z��e�Ԗ{��J[&��
+q�k�~Kl[ϑ]��(M�F�
����r���e�j�?.��
07��H*�~�J>���p�XG?�&����ao�Ca�3�!#u'8��,�"�J
bg!Lُ~�V�N�ݢ��-��Ja��*��ȥ���e:-	���C�	 � ��$�"�C�XY�O���N����>:l��F�V��n��%�,�y
+��4�pM��[m�[R�"�a�e�K�$�9��Z�,�ˎ\�8c�	���;��e@�L��8F;ֳ���-Y����J5T��
; ��D�kl��<sM`c���N��u!�<Xk/��|k�
�i|�f��*����Q������Iۇ
db�]�o�jI�՜��>f��a4�V2��
am�E
g�igx����f���Z�o�kV�2X�Yh�����23�G������n<�$b���m�b�g����!q�k�j��	'
�E��v�:y�Ɇ�_qL��tث:(�4��
+��œ�t]O-s�qz��+��e
e�動��35?�
����
+�-2/M��<a_��g%�|�>�ڱ� +�K��̳b~��
�|c�c�!w�:e�Uv�����0'ی5k�
+�t�x\&��ޙ�V[wE6��p:��1���G��
+F�z1%��kh`y���0
$�}�
+B��\Gj*4
���f�x&�[
���T�7���AN�&KN�b�
�{1v�Ӯ0J�uy����0+���T냵�5�u�_��Sr�~�_t�I�ێs�3�2�O'nK����phbq>�N�SiY��ь�X���g�#�����<�
�����{�O
(�_�)�wݡL�.�v��9��b tw���m)-����Iy?(����+/ӧ�Q&�Vr��9a
�Dž��^��CJL�Z>;<�lq�Ɍ���j���vYu��v�Ԩ#��I�_��;��`ٖǭu�M{t�6��-�:�\���\�,�
��E4Ƚ�I�[
���c����4��N�d�>�ug���z��
	᠝�Ӄ�ݚG
��G�T����#v֊���
�V����阯�P�P���M����w|O�
���A?!a������� �
�	��
����
?A��l�<֬��ג!�������*�5�&
�Y����
�f��k���<ꅖy������ 
�B��I�Y�R���tU����S�r͹�E�?$oP��l�<���|J�9
+�Im�1W�G�b<։ LJYY��i~k,S%U/��'�:�� O.
T��x�,����*���jEԯje���)$��$h
9ߓ����
+�~5ȟ�!��@�‹���N���8��،w�
����W�1����ᤥ]B?���Qu��Y���=��?���xV�˭�\��
0����I��w��;��yuZ{c�?MXG�rz�^r�T4{��֑��KCZGwU/�'mS4-�<_[�#�-�ʞN���Y�U�.
+�C]��)_�>�w at h;���ϑ��$~�3�Ov�옠�{�'�� �N`6�ƱK�b��6���M֋���m��Yu����^�M���^i���R�f7ٟ�O	Z_o��IHX:r9�1�Q"���yk]���BPm��Vx�*�ɜ�գ~��؜I
RG����9�UZ�Eu��s�[
+S�@�?���$g˻R
��>܄	4���=�);[�������
�?5�{;��@�d�lK��C3M�6:�܄�)��UvQG����#�o��wR�r%����T�p�vb�>c�4�~�&
+�I���: ���4�^_0_w�)t �9�8;�X��+A`q(aDǒw^��̗����q�m!v�Yj����^��I�q�Vm�bK��~Wmu�m�W���%��D���
+0�
+��>�z�›���!�ĥD (��
TZ��4�i�>c�W+�*��
W� ��W�u����-��Z}q��p�J簥���쮞J?{��i��C�3�� ?N�ꗟ{��^<�݋_Jv�pr��9�z+ݺgX�I�
����ʎ�<�{įR�*����ƭ�����RG���y2�н3'Sr���
���5|���/((|��4��d�_��
���(���i6Ws�<�����=]�Që�&��
]�wq�=~���[-��������T
+q��������[�'$�|�
+9�%��4 e�SP��~���
�h�r�2�㫼l�Suf�CJ/iM�R���j���;,�V�"��tP}r��}.�
+'
5'�I�'��4�C�G�'���^�	�U�`���mO�{}��hA%�P5�X��-��%�V�OW�"�)�A��qSl't�b�2~!l��mnS��-`.�����P7[Aa�`@�w Ts����v'��������H��%F���Q��=ۘy���Jp������
^2����S	k��F?�g���a�i)u4D̽Y�
-�A�_A��W��$(�����F����9��.sfR��)V<��S�L(B���W9�λm+q���H~�Z��ǭ�t������AG�CAwUD��������
Vm�g��g`6K���7]SUWv���{ľ�@PEi�����5��s��s�������Q��'!$OBԟ�L>�o�}��f�n�R��;�7�#N,G['�j�TE>�O�$٫ҩ�]� [...]
��V^�ǟwTTPY
/�����x�״���U��F}|s��f2X_��n��s���������#ۏK&���'���篞5�
�� W��

i��3�4�a��.,}���A�8����d�	�}tb�o���Y�Y��d��F�3��E��la�Y��[:3�,�sSU���q7�3�9��O���� &�PS'��t��k�*'iy�O�u��6�_��8��W�	�-����4����F>K_���o�k'%~����[d���M+:��I8۩�
S�?���
���`��:(��0���c]$G�e*O�\:�Өah�4d�ŢM4�+v��,��;^.d>���_�gJ��\X��[L���i�I���"�
2��r���`ѫ�=�0]�z�l�CbѼ��:��;�B��
+RW��tm#2X�~R�-;��`��;IzȽ��KR�9��C&�L��E�4�1�F��e#�9;]0����P) 
P�3K���֧�W�
����ֶ!�a�4Y�1R��~1ఈĒF�ݺ���wTehO��g�z}Ʈ������ZAiOV̢K�٣��
?lr0�̙���Q���I�
*��i�w:#��� l����uC�
+Cq��3�[���TI�X�
�l�ӻ��z�*[�C6�L����
���ev�n����.�vb
Qh�2<,������G�i�<
+*�Ͼ
+�a?(��pӃ���r�Q�7{]�'�F��r

F��
6�O#�7&�-k�x%��	�
�۪?B��e8��h��Z�`��b5���0�������}�?��(��y�߁�r����]h�2D!S	xh�8#����:6
�@�(LU�M^�N������� ��u�	:��G�~� ��P��~��dԯ{d�P��n%�G|�[��W݁���f��zq%�!w�rY��U��&�w��l�>��(��4rD�brX���
7GTո��˷=!�:�B���c�G��	Ś,�^��Wj$�Ll�hm{��u��`�S�
��F���p�
M����\^絹�ּ�s���GH�9��6IJh`H_�d����*�J�
�}<��]o��G��9�
F�^f4�t
0�w�%�v��+|!�ە�#�����]@C����
kS�ּv�M&�3���4ఇև�_�Y�λ�@�R��N�koT|>�&{Ov�����5ߙׯ��Y�6׾�����n�{�%�ߪ'�����r���
��g�ͭ
�t
%�A�ǞA�Hŏ�FÊ߽���_
ՙ�(U�]uV�%�૊��5�j��/�N�����]�:T,�:dC���5�"��>
fI]_��ӄ-�+�M8z�oE����ע?������K�k~J��Â�� �f�p �bUP:�������MśǢ
e*a/p��c�=Kgt�����@��Zyk����:�݃5���l��9]�'��_NfÍOt
>
�N��:�����
~ �&3O���@W���f
���
+b�?���q��f����O��X]��JB�B
�ȶ�ik�qo���=�Nٵq�,Y�T(�\��Ӿi���i�{`p��� .�Ѿ۟?�g�-< ����+l ���(��A�΋{�!�G��@��� S���-'�.^I���$�6�WwV.��O�
+4,h�e:šk��}�1�#��
F��C�c�D���
+X51 
��?5��:��+V˃cda5I�D{Q
+'���<}^���^�=,3[k
堣�?�Ή=�hܱ
oX�
.(���n'�?����������X8���dG�u�� (�|��G ���G�
�%��{~�<̲NFF����,W��`cg���r�D�h����,�C�X
Kgc��FE�DF��
�+�|�I�;=��ȑ
m� O?�_�)�h؇�Q�qE�5C(�b�1�K�prp������"X'�^d���?gAʗ�m���f>�'=j��(��wVT��L��f���6Փ�Z/��w�w�_��jڱ�X�֯/$&Z>�ܬ�/���|s'\�V���s
������ �L)<��2�B�~�e�����Nm�Q�|��,J�A�ț�_�B~��
 �
% ��?��
,�

Ew[��r
� ��^���W�%�']У���<�V�1�M����%��٨�5���D߳	ѡ���
�.�i800�iS�m�J#;�ei��� ���OF1�Ҡ�/È��V�

��I���g�=�����U�K��^Z�:i��B�ܼٙ�B��a�{J�?���m�c�H+��Y4��g���� Kˎ�~$��7x�?ŷ((WW�Y��g0�o��I���I�d4��D9��U���
;�[��
+�R39�|2.��a��?P*�������ˁ6�\i�V��Vz�U"7�*%��
�����
���ԟ��*����
+��PT-O�^~��&��hF�<g��N�F;�ꜷ���1���d,�F�Yk�e}�K�ڴ�
+�F�f�'�K�㰕����������)+�5Y�j�6��|rF4�L��.�A�����	�td�/��
�6��n_O�6=����FXS�Cw?��f)����Y"�Q
���ʘ�F�0b��ג�֢"A�
�^��(�k�xF���|8X�} +���
��F]��
Q����Ԙ>�UUr�jl�Sď������g��s��I
�r�e���8�ι�*�����7̮!
+���
������3(Z��|�����
`��0W���D'
S���*q����:���ڨ�RC_�E{�\����V���1�-���_D�i�ד���bO�k�'�B����"� *�\XsP���w鯠��5�z���=�������z5
��rI[K�G!��e��a��OZUX
�#2��bMT���b�d �� �u�kJ*NJ
+w{j��oe��B윤���(���B�
b]�
,f6���!ݐd<�]4��\�
�7|R�˻��Hx}y��z����6b����n����R�ْc�
I:0�u�eɺ��Z}����d�;�����P�ؙ?E�6�lʟ��CP!���A^�[��EБMz�U�fc|�:�bs����#�]5gRN:�]ן�
?o=g1E��W]����if=�ÜF�-���F��MHc��S���
`����

T�ey۪�rQ��q��
(
�|�������H�[R�p�K�L�8I/82=g��{���[O����\�9=�
}6���<�l����1�
+P
�r���P� ��[T�ϖ�G�]�Z
��p���9�;������Ϸ1&�(-ځ�.�i	��~�虩1�T��|:�3�8rSO��'������fL�9�O�h��������u��;����g�zT�R�j����O�ZБX
����
+��W�O�6�/�|9���}u���]v�R{sk�������i�a�����O�iI�ţ2�-��X������m~
+X�"�������2
n[���KO0bK�Q[n�'�������5ކ �h�кҋ۹�����|��*��rO��Ҥc�?�
9���1�Ҹ�V���~�h�}j�~!߇ �����F`��/�g� �K}�kV�
Bh8hnW�/� ��(rǍ"t��n�<�`O�
��W��`ƽF�i}ғV]����8&��hG5j��Rm�������yY_� _��`-S�}VXk���`m�6Z
��u��M%#
&��Ze�n�^r1�a�"s�cĝ��+ҖK����E�ă��y
��2�
N=��<�4�j~k�(T���^W�� ���t��[r��l�^�5E����/qTk&
׿����2�0��4̱������v��<�2�5��9w0�F�*݈*��{�/^d8BR��dCk���ѫ�
����wX�^�l��Ft$U�m���mh�}��Q���Z��` ���ch�ϱ��L���M��`�8���We�B	Z_P&�7�	�����w��n�Bt@�������A���#
=#"���9
����F�U6��dї
�k�>k��\@�ʴsC;tJZ�C;e�vI�)~X�W�`D�QuB<�C(/n����%Nr-8�Ǔb��OĮ7 �c��'��C�?�3
�w��+��„$�4� +1?���؟�sd��mr���	��_G��n��jq>M�6Q�x�L�
+N�F�0��{��w�Ѩߥ5��$1����Sb���Im�
m���˅_pxM�vI�s9S�U�`q�4��y
t��%Aө��
�$O	�͚��چ Ro
�����ҝ`¹��Kg^��4�������
�TK��l��^��N�4EJo5nG��Sl��p���
-�&+-��e0�O�v�9�d���,yS�2��z�i��5�İ3��&�xb��]ZBO���V�4ž�k�ұ!������R�NQ�(
o���k;���)@�lP��(
+�	��8] �"7�����[��<*��}k�
������°n8�������%_�O�Y�5���#t	�7��_^T�<m�=?IX��[�ͻ�A�
5�/|!�\�
?����_��@���[�h~!�עt�E^K��:���$pA1Y(��t\�����n�����%��^�k�����Lu/�h�7�Yk滷
+�c�{�
+$�/\��_w^u�6�*�� Ļ�`���]A�_���U蘅���9�����Б�@�rc at 1�Ow�yܗP4V�d9�I���<y)��aP
+��ϥP�
0�È��U<���>��i{^���a\�sì\
�9�Y�� 0-�u
��Y? (nP��{P3��W�>(��*(U�
(���ӵf�޸j���+V��w.�I�{���f���iΫ��p^9���f����]��#�s����گp�oZ�u>������ CY�|\���ٱ0��
(euPZtxPR���\ݾ�MⒻ�v��!�M�2�dz�'~e�b�:v��b]��c�v;tOs
��с�:�����fZO�r
��sh�Ls�9pǿ�������%��@�BPEMP���Oz����{S��;O�Cc��/E���0�)�;���re���'߆��u���O�;
�p�7}�v�
���t��f;K�/�aG%�� ���a:J
�s�}f��&@��°���M��]w�v%4..���Bf��C�w���r�gr�m����:�}q�T���l|;֎oo߹M��������隹�j? 
�ȇ��(
�(U�1@ӵ�'k�t^:�V�����q%��g���^�x�r��ҹ
���$��Ʀ��n
����|�D��zڥ��<SΎ"��6[��
�5���Ym��sP*��BQ���hv���@w�@�	P��R��ĉ����
w.�(
,܇��
M_�6%�?�h2�����$��1ЛW�y��ۃ��Zo�*:O�6�U�� jN`<�z��o�����'7
,(�G���~��LL&.XxB�Vpv����
��"$�t�������ݘ�B����s
t�"��HWN�S�
7���S���&K����6ٗ Pjs0��n	�x�܌�"���'�C {P��n��"@b�R��1>m]P͂}/�f���$'y�7�x��O���9���{N��#G�Ut�:*��z+K$�Y�ݚ��u������|@i ^�=�V -��O����gl��w�
0�c�.!7<%b�����X��e�g���YtR�]�r;do�1n�
�pķY���|=�۵��o��V$�>��d͖D=:�?���{
+�Ss��`(�ϛ ���賭�����d�ܞx�r���6�a��H�}�1њ���1*6e}�K��\bl(�?��q~+i~����-���,��\�VʭVco��B��(1*l2�I�yM��O����g��"��`{��
�d��|
��l�ܹpAw�ɫ
%Y�Yd��[���t�U��c!��5���Xq����h��
)ii����,W �?Ƨ��vP4�0��:���'(��
+��"�/P)����x��
��M?&ā3.�c��i}�b#�[/Fk���7qb!��U����Ax ��5�R��	�"�����Ks^�U���� ec�I�5������AeU9�^�����љ
��� N~�O
�ݘ�ΔLțVL��
���'m�uMM�dU�ͧ�Z��i�3Gau
������7���������)dƳI+�\��?����mT��q�N�9��y�O��ٶf۲�0:ݠ��.?o��e�%�}�ͯ�l�M�ejf�%� �5�`�+Vu�%׭KKN�h'ח
w�� J��yV�E�����r���aq3��
+�{�y�^��^����LK�S}_.�G�zE
��
���pY�j,5U��=���r� ]�gS�����1��1�݃\�	�dY�=�	@�\��U:�7�>D �
YPY*�G{�\'����z�t/U�b�����na�Q������k�%�eإ��-+�dŽ�&#�j�t�ˉ�򽸜�"?;�ʋ��]e��Z���Ɏ��
��|��&�nUX��Ϯ���s��j�Pot.�tyx�`��j
���㝻߾7�C.)n"�+�\�
a&�.?��Gl�xWۣ~57
�W�f�8W�<˭����O�ʋ��I��x� ����eP��I
U�
�3
f
�^A�,S��k��)
+���;,^��{V�E��G�����f^u���
+Z~�G��(5.�����
��Q"�
�+G��
=����V��Y�g? ,�������-?��O�8�
�s�p\���'qE4G����؅����E���l�O�l���2e���!��l�
Q�rn8��*�I��
+)��J�Q��ȃ�4�)��w�;�_��]���U�~�f�ٵ~g�������I�n�a,i���b��`��w]nx0�4�T��5�ִ�b]��F��n�o�1��+���T�����^�u��Oo�������S�}��`(��e��
��=X����9��I�$.��!7�ܶ͊QU��M������\6�9�W6����h��9�����5����*���~�K���)W"�q�����(�F
+q
�e��9� P0�|\㠢2Cw�A��,&irvqW2�Yk����b�.�L��
����
��X/̈́Q��^썪R����Ƅկ�Z��ИX��	�C�y|�g�W�G������
��(�	�ُ�;̓�y-���ld�Z�|I2}ǜU4���]�(���֙���x�N��
O�C+K���*�
߯{s�
![���j���[81�xx�H�z�p��3R��z�݃V! P>Gɳ�#'�I�>�p��>�
*���
�-߿
|v���y��J��T���
���Ż
���o}�����&��I1x�#���ԕ�F���ׄ��u���)�_Hg*8�N�p�� ~
u��2"$}�QVj���kx{�����X
:>ǜi\�5/�CS	��--�Bإ���[���}�8�㪽Q�jtM��u���̋�q�
�6�$�mL��VP����V������/��ӢVX�4��n�+~*�ä����"�v�
f��i'.�ƣ�t>8�>ߏ���0
���aj��&+��<h�)]'�6�
=��6�`�$h��bS��z�vT:
y|�7�����g�@?F<��و����P�/�G�7�2��sL���shO�4U��<�yq�՛��s�t��o�Ei����iK�1L3�N�f+5��h��?O䮮N�F�펝ڎ]\j�ܫa��B���� �[�k����,��e������)*�h��pT��D��
Ne���ɤ�N)<��@�`
kF�l���D�����:i�jo��֨r�RK��fuTú�Lԡ*�Vs\���
f+�
++��
���=����ߊ[��{6�s~��c�ry�IA8
���� Od������g���6�ܫܾt[j�j|u��X{׻��_�zgtU8
�\�:��@�_G�w�G��<�i�|��q�˺i�R{b�
�ׄ���V��_� ڶ@��ʃ�b
+E��	�
+�D2�ȫ�
�O&������o���*�*}!qܘ����Ӿޟ
��+��%:��%&���*"
Z���������,�*A�8�Zְ����{��RU(p aD=� ��b
+
+H��ɂ�6��!!@���i�����Ľ���Xaq���W�u�W!EF��E$��F��
u<GI�^�w��߸��Gޢ��
�/���h�����(�P�<v@�^,��Q��€�W
�~>��Dh+�O[�̯&oQ�-��%�]7�Z3z	�^�M�Q
ơ����-?+̔0
h�c�
|�8�Gݱ���hZ��֜���|����A����t�ޏ
(8��
8�,����2�����{�7ҷ��(Ɲ�z�;X�
���'�Qs���r
U�2�6������B�����|;�T�Sn����L=.�M�� ��@�D�$���ꡠ�z,(L�	
+���E+��b?�>�@�݅G;
�n.zU�z�}��~w��Q
_�!7�����΂LG�c0��/_�y�����/-Ӫ���u��-���l�P��uTjR�2(H�(
+�OzY�@����R��}r�!�?��� ��TX����T/̴vԅ�	���MA�k�|��,E�[���&-�5-�7�<���㳽�q��v�d}��/��_ 
++VӾ~���k]���#P�oUP��sP:�;PZl.O,U{��"�Jq�����f�
}�����Uw�2��e-���b��-�Bh��Ŵ��:��y}��
+����J����fpM�=@a������S�"��"�I�f��-Vh���@�nO��&�ͺ��{�
��U;��o2��C�?7[��U�+�/��s���n[�Ƨ���
��	�/��B���H
1Ku�n,�ұ�� ,� ��x�`+UPTe������Qq3����c��rc�}��\��$�V'�����s��j�#�W��ލ'��d�9�����M�mf��U{�[m��c��Q����˅o�B�
aX=(�5P|�@K�������v#���עP���_S�|��5�yx�/V�����3��v�����f�>����z�ѩ�n�Ho�I~�ޜ�ɕ",��,�Yn}���l֦�(�t�i]}Px�>;��:�5 at g��g� �x8��g�����������e�:��B�{5V(��Y�z�1:MHlf�k��X[؇ݎL몽k�J ��,���
Y��+"5��9��`�{�)� �^�>y���{@�
�ܼ��
�P3X:�u/�=�8�5��Ԟf�J�-��vT�h>�4�³shy	B'�
�=HcQE[�"_�j�d0^�jOVJ�F
�w��q,Ы�B�_�/@1w2`0�P�]��r֠�ze~��x�H��\?VNψ�}Ëh�tt��{�ZΚ��QMt����v�yտw���e�9]���J"��B
�v��x�\n4]�,j��κc�(V=�F�8I�`�
n��[�������� �W�n������u�0,�n/�m�[1a�5$�'
��]2��U;�zS�j�
���X�pK+G���2�Ra"0�ϛ\�P��2�
� ���x��6@�����`H\�,
%
Q��n	YGŬq
�O>_ܴy��@}�xw��{潩�ۄ�6�̊�:E+���08�!��"4��"TO4�!8#��7��/�sP�]�h
�
*0���'}7
6L�@%)��J����Ճ���x�᭧m9����eg^W��nk�*?V#���d5���0f��,�LX��͌�#A
�Cn-i��
�8��@��GFu �r7�}1.����"��֍d����"�@��T�l�����U8k��d����,s�zgI���g�~q�tW�lrO���<7bRQu��ߍ���`�y�d� E>a�"ݽ��u�}��>�#x���J>����b+���cO���	w��k}؃�OǓra��]
]���
�+V.�٢w��2��8v��*���;���Ӎ����f��՟��
	Q�g|!�P�dmhK at QW��|n0�䂊ƽn�z9
��E��Ƅ3}�8��XJ�,��T13د�
��\�I��Č5/l�����ב�p�2�&Xs���qۏ��z?�T��n��.9��||�d_���Fjs��l]x��נ���i_	�X,�
C_���n�X�N�mG����]P�ZI�
��Y�h�'Yԙ|68LV��=zqd402�$5��M�8L���՝
��v8 [...]
+�y7V��i`j�K�l�Rd�-���b�͔j��������}}���-1�|���<+��
J��'�8# ve�����>
C�N�J�L����Z;�
�aKyoQR*)��Б�9KO%nVK���˼i�ܮe��Y"$�
B��A�

n�5!�Y#��~�~�}���il�A���(�'
(I7 �w�U�="��R�5��9
��U�k�u)�P!Z�v�-t�%�5��hV'�3:Qr�	�ך�ɨ��ĭRy��"�����qΔ���%����M�
�A�^�����?����T`N�w~I^ly��� m���U]����� ��K\8���u����2�i�@��ex��s�ۜ�~�8Y�REǟ uq�A<z;v�륂{����ֽ�v��n\X��@��7fI�
�t�?�eytN{�`�ZXcv:��u�J�Սn-eZiZ��0��ۛ�em
�΢
����N
��A
�qm�_�)�NX��"$<��ޠH���p
!ݬ��;'mt�ɀ펚y��O
�
��@�w䋨��)P�����ܼ�ag=&�j:��
��7�}<gb���Tb��3�H�Y��
�-BMp|
+���0�u
��9�P:���h�絙�
��u���;f��p�e��:�7�����u_�vAV�mc�m9��+�7�Jg��-eT,�O��fwS��3��nK�GծqD�������x�"
+�̹U��/�V�W�m�ӝ��Z5g�iF�j6E$�4�f%�l�f�q#����
&�� �O~�-f#%��MD�z���9��̺�'j'1���t�[��|tV��<u:�]�匎-���Y".m�A=Z�w/��A�q;2�F7'u?�--g\W�E�@[J����y�=�J"���SԕwW8v��*$ߏ�6kS�h&bѓ�s��8D��~$�yB�e��mvM�w�5�jcwf�G&T����0X7�ف��$(s�Q��?��z��fb�Z1�$1����˅ol�Ӯ)����2�j-�n�2^��!RB
S��&���=u'��>�NQK�J��H���<�?y���Lh�V=�X���j�'	:�l�3��=V,��+���
�\I=�r%�D���N;��eYƸ�|_�䓙M�4k8��
Nv��v�@�;�y���z��ٴ�E:\��c��f��rS+�2�+�80�y�l�Ϫ�9"���
=�:rM�"3
?K�U(`ś�j��1�
 7�,A.�WA��M�
<�����{*����q���.�z�Ϸcg�z�x��%�w���K�̮Q|��v�I{��3?&q�~X���Qj%�;�K��=ѓ
Ô�Ѓ���~����p(Z�gYiE�T�� ���K
r"R 9��C[���:��cC��d��7t�f�)>��\�
yؽb�1
�$3}�f�pgW�V�:�U�,Oa��:�&���[�=@N
�@�>�Y�-�]g`o
�V�1Ƚ
���;�E��
�V��i�Nj
�<��,^N='�d�a^�Ǽ�l<J!�}����~��;{[���r1��^�·^6a�����q�{������(�oA�Y��MX�a�_yp�@
�bЕ!��5���
rH: Y��|N"y8�8��sq�f��y�$�\37�c�6w
F�[[͊�����z��A^w[<�����w�B�:9������uc�
9+�|o<y#a ����L�B[
V��k��8�\;{y�6Y�pf1�@e�x��n�^!��-p
��	�pr��e
-��U0u�-
Վ�
o�v�;ʧ쾼�=@.`����u�`� wږ@��|�B�k��@O³k�����W �(�жu}�����
����G�m߸	�{���8
+�y,N^��m߳�<��)D�N�v�
1Olre����� �'E�-���,*a���mA�lP��Ӡ�Vڠ��� ���A~�:=-�{��%�~���.�M�V�gM؏b��%У뽰᯲
j1�yAa6t���{�җ��,"�x��:�}��1�ط�
@>��`�;X��\:xP��.(N��
�Eq
+kam'��]���{$�ճU�5�l5��~��)��әE�=�u,�ؼd�+�m#�i��@3��F:,�
�?H��m���� ��
j�\&}PH���X�B�S��m򥬐E`�����Y���9'&�=���-�d���a���:�\��Hkc\��q5�l�r^;�B���(��z�����&��~��~!�J����퟾+g1 �������.|΃�����qm������BM��&�mu��q�8�_{f	�H�6��S�b�ࣷ��{���׆ʾ}Q�]2H3��;N��b<ް�
�{|f�XV:챇��
A!:6@)c�@鼾 -� ښ�?{d�t�

�-���v�wo�#��3�p��K>�m������@�]I\�l�:Y_����и�v�;�jݧ�
k�
+ﺔ�z����O�n� ����I�AM�-�釟=J��c�m��`��5�n��4�����8
EO��i繰�v*��'�y���;e���7ˉ��Ԏ��\-O!��f��r�ߗ�z�����_�2��/ϳE�l�e\C���F��y�xVQ��)\F�RJ

���p��n:

����"6���y
�D��\*E}c���~�j��6�Oe�����&%�)������ǟ���#� 
+%'�g�
�9��C��g[�<(�9�����8)\8�*���;�X>�N�?ٟ�
��>{ߎ�UB�gxq�eg=9گ����ֱ��@o�H)grux��U��u���� �ݗ�<5g�J��\mP���g���#����K
2�us(ʟ{om�J5����&���xeO���x}ow��j����ձ�R�SB,
�nOpF���dѶ��
+�o|!���?E��v���B����2.�!/侾o����/��a��V}n�o.�w�нn6�
�`Le��A���I�:
��崱�	�(K�J��½�/��._���|�po-.Υ�{��-	5�Ϸ���(��.(ג*(���
0$q#��\4���ŏ�
+���y}c��&��^Uop_˷K�J}'uXZ�����h�n�k?�
n]����A�rkD�p�CiAhMN���
+�
|�Gx�w� -F=X+���u�!��=N�z�<���=D�eO�1i\

�O-�s�=�
E��4�
ť�T����sN������~�I��m�?o����k1/{�d^;������
���7��SV���6@��< :��^6d�I�u-ƏN��-��M�݇	�x�F���B۠7bq4[�{evU�2p$�7*Y��j�6ϒ�9��F4����m��Y��h��j�1όs��pQ����j���S�F�����Oki��
+Cz�3�/�XWzF�Urg�;D^�<��k��F��S/�>%Bb$�]�G��n}1�)��da��q���葏�cIX�hṂ�p�}}�&��Ԟ>j���Q�=@�YU��������O���;N��5�ׁ�!w��'A/������[v9h*�j�'��S_X�!Gp��|R[0!i,�
	׆�?� ��=��|s�.�u�nnk�`�+�
+f�
+�Y��� �[PX)'Pڧޠ�l�O���%K���7s�����7�,��QNme��z��M�o-z�����S�R�˱G!��s��y|CM��՟��Tn�{�Y���I�m
_m�6R$�:n]W��
[P�]l�6�$���Ɵu�7��,ۃ�%�ƺ�`<��������AR֩}a�F߭4�I��S>(��5
�D�R��J&���"B��"V��\��^�ޭakI��Uc0�ͪ�$=,�
�`-tP4*�g�(j�:^Ϲޜ��x[B��1�����2�Ӣ�)۽��BDwE#�/��1�*�*�]���Jgx,-)j��pE��i8x׶�=0���[y<$�ǰK.�F����Z�F����
��
^�
�1 e���rϵg]
�a���H��u
턴z{7e����D��D�SZ��,������8aC��6)V�S�j�Ϳ���6�7��z)b�饦�E��潧�
�5���q5n���{�bV;�L]��q�����f�mu
��#��*�!�ۀ���H\]ʁ���Nn�۬n�o:1k&���.OUv�*)�
+p��%&=�
+�n֬���U|�����L��
bꬫO��/�G�t������3�
����і��}�����r�$g�.�Qj�8jK>�%u�hϳF��~!t��݇�J�EU&Bvғ����=T�Ό��mvZ�$�[5��j��ny���^��COv��ѩ��_���y��M��NXC�0��E���s�a�����e�(�C�(`����=LJA���������nu�SV=�5�B�S�����t]Qe	׽�qJ/؁
`��ؠ"(�
�(���z�'�5��g��ƪ/Y�O��E�i��i��Ճ�W�`u��88nIȰ���f%��刖��+�v�7�F�
8�!m��ܴ�ޫi��y6;�#8�|�
6RR��:a��b������~;x��c��j��m!J�i���TGU��+h.U��Y��ՙ���cBg[E�e[�d�;.~s}�!�o
/�ng�� U��W+��Ƀk�]5���
�
�
�;�vT��4o�'W��R
9�����{��0�]aߢ\��ר$�9W�K6k�nq7�݋�}���;_P�F�@����}�]gS�0Fn�_e�de�sg6-L�^�
��LOe=e)���踊�lM�ζ��ש���+W�U/���‚Ż���g),��&�"~�+�7F������9�3����'�������N��lv"��Vx ���T���A�
}����u�!�������D��
m�
�R5G��^_�K��ُ[^wcd]p��]�����?�����?IP<�1���ҏ�P���̼|g�y�2cM�����W�2MM*K�0��PĐe;��������0���Q���Uz�&���z�E.Y��L���;�B�2wYn����6�
:�2zwܣ����4c��&�	�Uڻ��o�$d>��*���� ���>>|1�=Y lm���@�e��Ko�a5�J���� �`z����n� �\� �X
��`b�Xq��E��.%M vVr|�V�܌[��s�]N�GM6=��|oj '�%�z9 <qQ@
�u~E���5�.�j�9�6�����)Ρچ
ՎOP�&�j���
+�n��X� �T�vd���e?�bݎg���
��p��f��2��~�^�@Tt(�jO ^�� ?G at T_8 �e��,� 1�~��SjM ����j@��
���w-
�8ߡ�1�_c.zE(�X�,h�*�=��CcP����!���z��� D˂fy�{qqg������)@ҧ �E�H��e��j�" �X
�Qi
�6�5ǰY��T{}��5�DC��2�v �
�/Rm~�g.*l��d�����BS��st~���� �jC���]�D�s�
+�@�a+#O
���
+���5�4
�q�
�6`
D�5��+���
�}��͑ G�Д�
4�O
^�[���B��e����r��Ay��4v녫zj����`��� tG������% ����%��(Jܯ`	��t���V��ZE	�l������j
 �i�[/�j�q�u�o:/�
�	�Vv�-}?DM�}&̛gS͌O��x�(VZ9���+ a�Pf%�2���
+U2�����R���� �8 o� �A��6��~��
���4E�W4����U�ϋ��
�g�����û� �����vPva������p�l�h�v~
�)B�4t�[ad�
�
����@-7����g��g�t�ЁjA�}�~)-,��c�K��R�y)F�7
��k�=��E޸��Νc
��پ��7n퍘�@O|R����> ����h�s�!F SiC/��
 ������ ���0fk�
+�>����x����#�����eѸ� �v7�x����N�q�f��
Z)��a����fa�
;���W��YX���+ �y
����f��G��Ԍ��~�d�:�\��ЫIJ�[�U!�O��j�C�W���p�5�fa���5
d�3�g�ʵ0)��ŭ
آ��=�)�*�?��
�V/���!R�,�Λ���>P虁B'�-� �������L 3�{�10ҋMؼT{T��]��D�vIgR�����%R��9)���Za�S;�"�]�\qz�h��u�ͤ�֩;m,s�_�xT1��5���~��Ў8zg�y��O��h��By�����yM&� �R��
iv�i0����6��ĵ{o���Ӈ!�!��]a����6��MR��5f���[W
6�
�#���
��kS�?5��+ Y���L��I/g�l����������]_�,�~,�	yG��<
��Ϻ����?��8I������?ҷf�imj���.��a6 ����_���L�:�0����
�Wdv)�:+;�'�+ ��G��fiJ�B�&�}C9�q}�D���z:�W�ޓ��*)%8&S
Q<�V����yS��kI� [...]
ʼ�|_J3��ةcN
+SEPsw%0����s��<��_�B�в�L
��t���S
�!���&��g�?��˒���Q{�A�v�>��[��X�l��
7�S�<f�����m�N�����:�Qi�$v��*�Jgs��#�І!D�W@�,��d� ��=�z�l�#�\��`ɬ�mc$�q"f���2�'g�pӎ��gv�z��A�Vy����":FR
�y�-
g����h�T*���0��ι1��gft׎p
��=q�
��xhOgf�>4u ��P茁B�E��"��͙�� ,>N�Tn���
��o6	�euV��%WNJ�����S:�+�8ik�8[���S��z71�P{�Pl��X�R�l�����ij��/�����6H�:煗��i�]�#���~�i�τ�8;�	��~:Qz}���2��V��.�Vi��Oq|����
���t<���b��ؗ{
�?Lߴ�~��
���%s� -V!�E�W@��1�xo�͊� G8��b2;y�]R2�`ç;��W��)'���"�F"5~YA����[%�X��Ls�PߕyeX��5U*u����5e���r`�S� [...]
�y|:tg%w(�L�D�R
���\Ce�l�@�����L���#vh��|�*�wo�)��l�����j���Ww���Ǎ�g�~������>F
�T%#JH�Ȯ9��:��[m9��m��e޸�F�d
�%g��v[����c
 �h�������o��Ә��z��=��o]�_��>�'a�F��ݩ"�Ca����%u)�����Sv�=�>

endstream
endobj
125 0 obj
<</Length 65536>>stream
+Ȱ����*��"^#���̴z�[�q=^:���3���(����b�@�&#���i��ZC�X� PÃ��sG˰j�W9�p{���D��f�5o�m����[�eR����h������~���so2���k/=:;�O���L5�
+_��׼T�w3]����kv���_�ݛS��e�1�d��E5�W�L��=TH8����\�:�
+:�5W�����a͎�\�@�0�O�1ӌ��Պ�|H�C�	�A'�KgR�����Џ�z5{�D�
1�VM���n��B���Z�D�s��c����?ؿ�2Q{qo���v��
n4�m�xZY_��ؚ'��M	Ϲ�b�T7f��^<z�Ah=�%�]�3[w
qZ#�	��^R_�פ��v�]$���
�>�3�T]˩Vݔ��$����$ b)/4��+ ��/.	^��y�=��F�5�y�m-��
+I��"�O&��L��9�%���f�m��i��������ԟ���V�$�� ��q�z��Ŋ��A9b�My�ҩ�\�:��6߮\0K��r�\���F+�{����]]��u���.�)I��l�55���5��׈|�h�-H�SRj�}M:��N;_7�Ͳ�j��(0�]z�dGwyf��+Am�.��M�d�u�e�5�����O��X�ӤRՑ�e.�
eN�U�|����3&���k�V�Y�RX�Z���5{Emi��#��vՠ��=�����J�{�����1jΐ�x�#���9����eɔ���ݿ��ߩ�nZ��x�.(��.Po	ɻ�-�	_)�|�W
ʃfe�n��B�N���yCf��
f08o�~9(,��{�츽�ݚ�Ʊa�<t�:�Xp��l�
�,�ڮ㗸zf+��ܶS�o�a�zz�<�I��QK|f������D
��\F91�����ag��X����R��F��ռ��UI���V0��r��UP���V����
+
�e鱉7�%
�V�^Q*���R�<����F
��N:j���A��ː��*cM
?S/��L���R�Gw�_���-/��"�3���� �׬z��͙L��N����<�!��6_��M7��2�ڻ<k��zQ*H��<�"�\�Y
����Y���}��Fw���  wf�C⠗%�յF(͂
+a- ^�_���~z\-�}�N��(�����
+�����#(L.��YRz�T�~�vR��һ@݋��e�F�
�D�
+���@w2k��R��\��{�LJU^$�e�CP�����Ϣ���d�����}B�V�`�_���X�*�8� �� +�v ���\��3"l^3V�����/�T�0�U+t�5�
z �����%
Pz )��!�"@
��g�
+UU�V�a����c��w��A��7�H�{��
ݞGPc�Y{�}jo�S
���;
�v{�jc 0<OC��
+�:kA�'xg%��WZ�18A��o�-�)�2�2@��6�(
��/�:?����2=9z�~�W 
�Pf/�2��*���w� \�|3���*\����,�ݽ+���`|�>��u�NkcE� ��[��J~& m�s��U��P�2�ׂ��s���ZZ1��� '�P��@S�Ph4Z@��	����� <� ��W �b`1��Z�y�u��7���`��X�a���@ɛ�k2
���
5#A�c��1��[��%e5��2��ӽs�Ư�Z� ���Bל�ļxR;��
��
��l���#�G:x��O�
¦������	�
`��`��Pp����$@O���������L�{ӊ��U��5R�OS�wa)��.�{�W@])(3"z '�	����u�d�L ���/H$�b��Bo Ї����i6�KV�YZl48B���
+�o��löAe���Ef�u
�w3j���иz6�D�d���b�þ�_�.o���8֧��CS�+ W��#�1��<��"��Q�($U��H����[/����
+��0�>���o1��U�[
Gq4
Q��֯��c�֎��wr��]x;��˿�B�{��}��� q���F2 ���~O� ��j)he7�d�񬊯cQ�'&L�^=G���x,x�
+�ij
����ݖ����"�ϯ��M;ٍy���^s7Y���wJ�*%��\�E����2Y�ـz7�A�i={ ����LN��T>/&Kg�~�T~L�a+�Wy�n~��ͺ|֑=u�~(�W�4�W�]�2�Y�w���5���۫L��F���8m����7�&)H��[*4%��h�� 겏A����OU����6�܃0)��C�m������fѩF�HiG��#�?`���蹰�;#n�O�quA��rSD�t����0nB�>U����Y��<�
���oXa�_+�e^G߳�I����3�RO@��,�T
�ۤx0�8)���Qr t�:0!Q���zNV���z5�S���D�Nf�ڇ����
�Jj{�^��nd*��$W�2'�rf���Y�C/�z����D� r"ϡ)�ȸ\��ږ�G
�����W���1y뭮a?��~Q(�Π��\$nf���r�T�������E�Pә�F;��5�]�-���E+�F���/keR�
�7��?ؿ���$@�hs�)OO [...]
+��ކ0�?|W�ff�K
+�ڥd�<��Q�Q�~8/��T&pN��x=h5����^�M#������X�\\�o޲f�0��`���,�C�
)Ї�:Ą�RS��c�0��.<�����`�>��,��D�0��
�tPzVSN�f���F�E���`.qP7N��w��l���:���򺢰�4i��s���Ba���PP8���z�01Gh�N��'�=�L�ُ
��,���4����g�-]#.�|>�k���+��Gp�l�e�!�;3>�*�r_q҇M��\Vn����T}����W{z�:ꭲS�.��+�5�!Z���f?�otT���2O
����|����d~��]�K���/�J�
+w�P6JӒ�Yl�S��J�f�m���Zy٧ep�\L3�������"5�1b
�O�Q�0�3�A�@��w)=HE��6H��Ϡ�ރzTyA��C�
H��'+F'��]$�z$
GF.���>�9
_rM��۶��A�-�zW���e|��ß)Dp��'
��:\J
f�6�r�{�۽S�0{}�����w�䯯~w�|���T�ߛ�����
ݒ����"A0�I��]�T�n]>a
dߗ�=K���+����-b�+���F�FcZrfG�w'c�+�{<���������vAɋV]f[�&���S����_��
_=zr|�zN�; a�@u�	���-`6���M�7
敞wZ��
��Ù&�]=�
v��)��d���y���d;�E�W��y�:M���K
ʕ��[��x���
8ÎuJn�)w����`�6x�ln����8����P��� � ���=_�>nx-��㪶?��0�/>��ۥU�uLPU [...]
?؟
 k/�n��:
���N��Z��M���(�ց��#Y`��%�eu��
���ըj���Ö2���l�Q&4}��u�YG<lcm� �fH�
/Е�p��ެ�i
#���w�I���=ڟg��+`ʫ�iV��⢹���|r����v�����d+!�n}��k���gC)li��
���t�>W����.xz�i]a�
���U�z�
��=cwkz�k���Ե]��2��֤��y�a�_g"y ����!�ver�q8���5rqwCQou]h����=�(�z�m1�c;����F�j�y���i��jcv:
m���é�f�z�S�b2�
��]�+����#E!ԐZ�h�k�B1�k��߹2}ݶ�E�R�F�	𤱫kr����u�֯ɋF�?6��v����pR�Ȩ͕
+���ʽ�v��}�ߑ�դ��E�1�ӇzEHB����h)�G� ����
W�'�
�wf���n�Pa՘�D��~�
+8W�Gכ����m$�S�3G�����7[m�/��c���\�֖��?�y���ŘR�U��6kA�C�[r+�z���Ƭ%�x'���P�0�4/�b���)վ�{U����䫙��zJ<��R�"��l��O���8��L��e�>�F'Z��qa^Հ���h��
�W����D��&�˴.�:��5�D�^7�w��b7��{���
��3�ʵX̔��^�f�E�[��ҝr��b��$��Q7�+�ד����x��6���]��y����N6'zܸ��aoU�բ���E�8v۫jԡ���*.t�Q�q��:�"��6�Sk߫z�㴢��vy&</%�_�#?�\�y�&fev햯�Z��a�P,��8g��W
V���
+cqz�00�ælRCGm醪��������;�jv��hݚP�S�,v��g�?�(�j{�:�L
8��
+�k�b0���7X$X9E���c�3
+�:yw

�6����>˟�߰]�Z��
�h���M|��^�ݻ������
Wiv[�����hP�;�Tpԧ��ų]	�顬7��V2;���g�	����I��w�j)���vn�4�l���Y�lܙ�K}��1���@ا_�Q
��
����b���<{嬓H�Nz��q��0�����6'(�t�z�z�
+�Қ%��K\��z,r�
�xx���1���^�
+)k��0���r��J|W�jB���,���I����B^[�ܭ�_aֽ�{���d(�?�/FqG��a�`W�Z
]���j�~�#L��QҜ��b,��PΙl�Z
�r�O����\���X��D���Q��'�B��o�p,lAdR���7O<��2��Y���
`�����������1��o7%���:
���B�oP^�+=�։�
�s�ϰQU�\�]�0�
Ц⅙znQ-V�0R��OB� wׅ4�E8IB
�R�h��T��0-p�E�7ݔe��e�� �AW ��u�����\�*@��
�aC�"�B�d��i��� H?$ۼ5� ��d@:a� �w� }X�Aځ�M�Zx �B�.����t�a R��^;�YH��4�d�� �����j���i<u������
�
��X�V��#�� :{H����w��+�\>
6�@���_�
��9��J)�>�i�E�0�UX�qR��Pޢ�)�|<Qc�~�� P�T�V�ա���y 0$3��� cn����Q
�]gP_�V� �6 
� �qi7k �.����)@��=�]r�h�ψM
��}5� �(T�V���+�m�&���� и
+e�E(s;�����c}��'nSO��j`-�	0
� z� �� ������Ηr
6!< [� �1����yA�3�?�j�%�	��!'Vo
rɆ��]Υ���ḈPCz���#��G���o
|�8� ��; ��f kϾ�+1������� U`p�ַ�Ji�,�����P��8ïd
"�DN�w�
O3�Z��k���<��\��x�˙�?ؿeh�6j4 ��e(�5��] �/�����,[/ܑ�*K����G& ���k
��C��4,�Nx���^y
� ]
��[���Fx\�P���A'J3Z������ �iݡ��V�п`�.M9�2߄�>D������
 b� �g�0|���xx� Nk�J�S�%�vr���w��O�Wρ�;=�T�
O�̽�G���x����ߺhT
z��Q�9wK�7���G�o Xo*Bl� �r2 *���l����\���2�: �� 
�����q	�`�Q�C<�֫ߊ������0��- [...]
+Lo?'��ɲk��]��)#���L|.��Ľ��gς�/��*R?���(e���t���;{���7�l+y���}"�"��[�xY�Sw�(l��� ��{N�
��2��ڵO0�q���H��x�Kwopp�J�b��sa�f�������z�y$��d�'���7�]X]�;N��ۊ��7�6���&����L/D	3�M�6��ۨ���|����w�	�P�Sh�z�atw2A��B�7!y
�3�^Jܭ�|o�w�SE��f�8I�����
���,�yl��(��[�N������7�,{V�����E1c��0K�E���f��i)yζ����#��(
�*)P��d��3����9붱�ZI6�5�zK��F4U���r|=n�Nr���vs��pZ��.��X�Z��#֜�̦g��<)z��V��l+x`�
��LϠ�&�a����o 8q�BU�3�Д��I��AG����'R�3̟�q��٤�'J���b�]���6)}���
߬��\��.�˲o޲��0���_�z3s�ζ��:�B�<���k�֞�0��������Dc����
���Jµ$@��c����jY/��������*_�Ei����8����θ<�Mz	�kRlϭl��ܒ��nw��i)���:9����t��.h����~�}n�1k_�l�����Qyo�_�����̡1�O��+��a>�ё+]�R��`����*��h����M�k��Q��if\-�Xv�z;�
f�|� [...]
^�
�Y=X}����K��7�I���x�&�bSX���d�Kl
Wn�˞�T��O��
�NBnW-�];�L��]yQ�,��wt�����ioy�h���4�
�?\d�dP?\�u�**:L��{������@E��UE��S�B��7����2��w�X�Nf���<�|.�'�dg
�6��]2_"L��W�[X]��eԫ�����h�T�3�E�ˑQ�v�w}�mM��ɬ��h҄��
��P�W�|^���}u��2G����
���o��]h�>�(�i�s�}����J�j�RϝjA;1zay(wWn�ִ'Q��uQ2@��u)zu�ن����J�Q�4�����
�R��O?�nd
+�n	<�n�C��HnÖ��=������J���ߟ�v�V��2z*�C�A�<К��9��p�q��gz[A��Ҝ,f.g��
�k���p�ڴ�QFµ7�m�eDӾ2���Ŧv2�ĭG��<3��Po�?���Y>sW��/Rl�^��nw�i����'p�
6�g�2�]�:��}?];z#�u�M1i��x#
0{5Z͂���)1š��9m�Sőx;��uQ�Ӝ1T��w�w�C�mo2z��cg�E(R�k���%��k��N{�O��:�.�v�
��7 �ݵ@&=��yQ=�W:��A8�6���ך�M7�)�
2[,�8��`Ʀ8If��	�pY$?��Jyй��}�O�
+����<��:�k�������R��6Xݯ
+b��g�F���6�4�8>��R�v������� ryk���S�7�Tv	c�
�y����/�},إ�8���F�31��n��v�p2]>#pt�A7E��Y�*�3~Cz}��Wv��6h)y�h2gsW�P#����t����Q"�Z4M��y�l�<r��4�VDr����i�z�
+?خ�4��(d��I��6Q1:vEљ&aLf��i�~��@Ϋ��=R�
�
+�*9T��k�Ѣ�O�1V�I���l��W
R)���U���7?��2��`�H����c�V:{��PqG�Y��N�	��W#3k;�Tƚ|改&4�4��0ݫk��`4�����Lzy���C�yZj�t�-߶��(�
v�tj���� _	�y��w�����
o
6U
+�ܫݠ�hP��v�>��������

6�s+��
�{'��LS�ܺ��Z�1��,�I�֧G���
�p�Vs
m��)�۵�_I���J��E�c��V��D�����mg��yQ=�n5�"?8�W*�u�._�JT.L at T���
+��J�N�����c��m�@�U�-!���%#�>�>�c�A�]����@q==]n�V�J;�b����o|=l�7P{�iB���:aT�)�W����WFi�X��W�2
�\�}�VIG>pF�
��9�����|?�����7��
gvK�B�.T)m����Ӄ�K�w�����IoVy��U�V���]�}n���B���}�W֮�Zϓ����@<���y�%*��X
���qz�=_�%'*�
��s��e:l��
�TT��m�u-����hou����
J�Qf}��œ΁�S�Əj�@987� +��|��X�4�]���iB����H�������j^8�7
���8)�q��2�����A(vn�~�i���p��*�%�ٴ��.��.������
�o��1�xL�~ԣ��
����$_NJw��t�v�ܜ�Hݪ/�5�ЭJ�T�^f�Ne�G�r%uq��l�~\m�"�ᦈG�c	~��+WH�����
+s;v�L��V��2~��x[2-��Y�u���r�ɜ�Ow͐�Hu��U^x{��t�c]�w�D� �x�����
�{�GY����8V�
+�RA)|�I��\�smg9�0r?���u��FO�̈
�<)R���%�pl�"�6���+��!��6�}����p@݄�,v�n�R���z;X��+��q*��݅�
�(剠@ݞ��e�d'�����Mg�y
+�Z
�!��+G(���p�FD<��l��t48�:Q�	�e�,r�{
D�d
���o�L/T0P�:T�N�Q��]֕q�s�]��l+�Z���`���Nƒ��M+�:36e�oR*�B�
�6�청�X���D�bD�@Z`E4U���PLի�(U�-�q��Ru��!��� r?Ү́�g��7 R'� ɔ� }� =�A��>A:ߥA�uA�H�!�V��t���s�5� ����eAJ��o�����%��^�/<���/ �΄ ]��_ؐ��
 Ѵ�7�{�sP�
+��&DIȤ77_ $uwA��^ m̳P�҅� �\�4
@�� ��$;
�>H�_��[�{w�}�������n_�]������-�<��k�7 d9�CS��ee�rM��]��P�s� �����MS )�� \�/
�w��|�q�o��@<(���,Ĭ	�Jn
+��C5h �z}uALU��;9��û
�,f���� ���Y^��<L �������Y����o����͕�V%���@*���$�L�ς(@0=�T 
�~���WxiP�C,���2��
�x"m��O��c�K�O�����k(���߼������s`����<b�>+@�:�J��(K� �t� �-#��� ��� �/koX/Fw�M/_^;A}}�ɍ)�T�]��8%2f�k,���H���F��o Hr(��.,����P�	�����x�N �4�����7ۣ�� ��c�&����P-~T��'�wr��K��/��'�͟�}|z��G̩��7+O�̓L�-�^����Txj�Ɨ��� М���ȟ�(N�: �#�_?+��
���4��O�u�
�6}
چ�"��%�[��9XX��z���Qd�b
�\>�@���
��jz
+Í�J�ɍ�~������c��ӆ�7 at SFEX�"�'8�Nn)t ���m�
���� ����KQ:��E�����x9܍�u�-����t���T�e7�S�Bp��}@j��:xڞ7}|�\]�Ү��S�/�;���m�c<;y��
+�u� ���?+�y
��z�^.��a���
�i����(Hҭn��<����
|�<�^/D/�����f?��|�M|�wk�P>5���}����{��~m
�|������1������`��� �
�,�W`M�ҡ��=�7��0�%y�􎍅C��R�
ra�?_�ʵ�ŚW�˰b(v{�G��q׻�?�7�ġ&{��?_��a�v7og��٘)&���+^IL�_������WG3���v�

�¦�J���W�����4 5�:�e�����oȣ�	����j�
w^*5�Mw��;RGN&��k-�wav��Ʌ�y<�ύP0P�N�sk{D�V��ye9����-�
�x�~���g�}�
���o X�
+��a�� �S
��>�fm��ǽ��n�����~���i��j��bN�*
�����J�ƭ�x�8��v�?�����ͷ��0Y�W
_\��ʢ�og&w(��ʭ��`�z*\:�vI�M�k����2�V]������fG�
��Wv����Gۆ=ﶿN�;�����C]�P���]9W6�ݻa#iCY
&M��%����]x�EQ�Of�dEF5o�b&�ꫡ��S���ڽ�7�����Z~m5�
+�l�v�
H9���el��?س���f~
Fo��z��
O
+
�})�}nV�&�"�5�

+��AZ��h�̙)�
��5�b���i�|�a�k<�419e��	�ԗ����l��a�Uv�q�inF�X���S(T��<|$@y-)'=�YȔԑ���'�$���v<�I6i���`���`�W/-��D4�Q�3��������������xІR.k�NjyIy4[��Q����R=
�������
���� \X@�v] ��_�p9��!ѺFn�v1���E�}�8���O;��k
+y��~��1c�."R��̾1#j��Ľ�#mT���5��v3|�g��K>%�ڹVP?Æ�~̌��Bj������Z��p�7�>t.�&A�<ۍ��ԼF͘�j�5���h�$�2ʡs�lC�Zjo�ZC��r
'
�d��rӣ�&�G�Oi�7�X�� �Xx+�q��=���9�?�9�ծ����9�����V?O�/�2
�FP�Q�1�yɱ�ww�&
��N!�5v�qy�A-w�R��eq�ê�i�wL������Xe\Z��ÅS�
8c��}g���V�/�|��<.�{�-��Uno���X)꡽Tԥh�
߷	�B5Sxrّ��K��>��uo9�p����M�l�uMW%s9��GSpr�
-j�)
�q-�Ef�(
��Z�ɫ[���kSQ<a��1v_
�*ۢ����$fL�$Q$)
+�s�,����)������3/���m7�*��Qҥ��Ƀ�4�Z[�(�X��qG?�S)B��n���]K̺ݛ�M���T����;ކKǷE��r��m+�S\�-���-�D'�٫������k5n���(�$_�[ۅ�W	��!xX֥|���SC���eސ�<�v8��o�<��n�[��&n����:
~��\
����!�Nr吻���~o3��Y��c��/�k����¿���;9�	��g��`y0�~|7�9�-�PrDu��T�u�ʷ�Nw)�.v|掠E�1��m)��j��:�Ry��6��ؙx^��I�O�t�
h/�pP��
��ڙM}V�h��yS�,�Y��Tz"h���9|6W�fo{�#h�g���Ōܘ�Eɽ1��%���ߔ�ʞG?�Pzޖ���#���2�<H�@é��#OLmҒ���o�^jܶ�K���V�����ۼ��즞�����$��MP�R���]4o�h0`���9}���E���g��
!�[���2�b��4������yȑ�c�N41d��B�M�i��{4e��Yt
�c|�״��$���ˠ5��s������o�L�_�s��Q���
��e�ƀ��w{�mi�.>W��"�t��:
r�n㖎��k� Tzh�{d�uV/p�ڗ�
T����k�h��l6�p�7g��0\���7GZ�F(��Ì�b?��zǑ%�@�~�
�͈~���1�$)L|�˫R��o�U/��*G�a,}
것�p j��M����
G_*���,���L�^��3���(�R��ѤT;�)�Z�4.�ƴT���Z�O�� +6��g��#v
��qѻ�w�x5f��U/��
���LLʘV��q,tVAk�k�q�p��Pol���C��[)#rJ���
+E糎L�Z쐧�v&
oX%
E5�^�k�6Y�1
\ƍKuh�`6�8o]?
+x����T�h�
+�w�vL�F�,
���8�.a�:�r���zG�]X`��0�i	�����V䲳�q��1�wjf�ѓ.�}�*��Y
3�ƈ�G
�
�ѵP�G�M���Ss7�¸愘�ol�*/)�k������[U1b|��Ŷ���M{���Zu�
	vW�x��'���g�ղ/5E��zOs(PXkҜ��
{���W5.��ج�n_�.�0꫊�!��G�]E	iT��ͷ���1�����L�.�_
�9�s��5(�'CxS{���MwZ�,�c����r�VH~0��0&� ��1CP��A�Ȇ:%:�u����flsY]�Z��� ���-�Z�Ɣ��I�LT���%�s�ˡ�ejP���RՃ�?�`��0=��/�Ǣ��4+��Y��k�n��B�~.�WE��<q���W+�T�Ĕ���
W�F�����YCN_�Zz�&�����4��tKu�^���\pz8T`�v-�S)��g~.��ln�-�YΉ̺�o����>�����i��D��u��e�2�m�u:�}�
��z�rε��ܪ�D�N%D��D
+g���-<w�r�)
�y��7sb���J�]�

�yhd�%���2zgZ˔p^�N{톝� 5�
;_%Nv,�~b������j8�3+2��[�Ы}z�*��I%�����̾kD�y����&�ms���0w�f^��%�0�
i��V8�U�z��B�;fh}�Z�B�$�!��ϲ�s��/�����ׅh��x��Rt�sF*A#��c�j�U���s2 qe��scJy_���|@�Y���rj�����i��u�����3������^]@<����,W!��H��
���D��������O�結�b���z��:�5�W�K�A��@Yo���,N��9N�]��j`1�[7N'%���i�Y ��85�O����	�Iq:�����
����醶�����u�y��(L����D
�O�hG<�u�$��c'А]%7�%P
C(߭|�%FU olp�$R� �1 .$��c�[e��
�l�e�@�;���2F���/�\��֞ P;M�r�Ԇ��y �p/$���MO��n8=�*�:�.	4�� �p&	d�	4���
 [...]
+����s��/x�0C"� r�HoYO�M�L�~��t����i���1��b���8+eX�f

N���Rm��
c	\�T�w�X��e���n�w�s�?�wsx����ш�U��t� 5��e�Z��x�-��	��6�3���y��x~� 7� �
� 
+N��)οO#�s� (�J�v,	|����y�GƝZ�y�4m�4��|��
�!�e���H�w�lm��u���ws���	)���	ھ	z,�
V�k��+R�}��]��
�2	�*�ͮ:	r���J/�q�Ln��n�������髸���I
+�`4N�	!��&V����s�
�q�7�W	M�'C�,�'hH{�dL~���OPz�}�&L`A���#�������}���(�D3g��:�D�y��YY2�Ȍ����+�5V��v�!3�Bw?<����B�@�ܿ���?���Ǻ�l��m/;�9��вׇ~����\�..Ec���$3�KIf���e�;�9��|�
ݷ��cB�͐
��]pP��Ž;��O��Ņ�EU���a�F�R<�O�X>62�N���^���]�*��]�X�-y�]'
ڕ���e�� ��>
���@o�J�1�T��
9����N/��zH�uu~~0u�u���u�l*m��g��l�D;LZW3x;��I�r/
O��2�;L̓|�=�����եSt�w.�-�u:�Xə�������/�=�	�[�L��
cU@���o�r�͓���]�w��

+J~s�?����V�
�X��~.A����[��P6����/k�&��ŪV1��]���Y|�~.Z��2gH�4�v�/�
����/���
?��S��{�H��zcKIf��&�-}�m�J��e�9jͭ��D�ƪ��n�7�G$/{
��[5��6%�L�nň�~��[��q"���p0Kǝ�u��U�;���>�sC��A%�ĥ�:�aa2�[{k�Á�[5���
P�Q.�T���
I1i$ٜ�J�ۢ�^�*�|
�v���0h�������(���l�Y��>�NrHLr*�悯�M�; ��=�tǹF�ک�_&�����2��\�m�&ۣL
�5v�Y������ZƘ EY"A��m��v =ɽԹm7,{��
��E��|e5^�|~��|Ƨ�l��N9��=%��$[���	h�rhM��:vk�iOK�oC��a$�mȒ�8g����
O��`�a����٭��|7�/lZ��-'x�P�>%2���R�T�Z�\��J!�w*�׷~}�t^��\�ʻ��M�ީD����:df\����1[�?r��a1۱ַ�n���,����\P���٣U��.54�=�3�K�G�����
pi6
+	����I�^��;�n��\
� p&�ϲ|i3�Q����Ũ�LU���y�脻�1i���N�6ZޏEk���&��a��ȃ�90FX֟������*���R{^gg|���x�����"�"��B1��u1VC�~բ(=����S���>+%�_��I�L/Z�����Y#;�����y8�~�t��-���(�Af`�١�Am��
R۽8{��):z��<hˠXЖ�l��k�1�i�^C�:������tH]��+Dђ-\*�}z�f�{��W�
��z�3����͝n�}�2taӟ��|m�����
v����V@�̰���g(���{��V��[A���d�Ut��(zv$*z
֕@�T%`?�T�Η�/@�0�I�������l�>�m�a�ףm����ex.���i��ܐ
�&�q�NSZX`�
/��u��?Q�uY����gu�NU4\Bi� %
����
�]sYLA.f�j<`�uo�^�+�MW� ����dN�"�*�k@"Ё�?����<���-}��W�u2է��g�3f��.h/�.YA��/w3 +�S�k�
����&[�Tu�**�����6
Qz�w���M�
67v���鸪�v^Ӿ"Q;M��,����Z�[x
���
	��˒y����@�����O���d
�n6��)l��
�oV��PHw��
�N_�-�#�x���k��K�׭t�z�mϲm�
k;Ol�Żؾش�$H�f��:D�=�[�dI�&�[�|�d��*��z3�5i������Y�)�=��<;nB��=$F�esf5�W�g1��*H�6˵���R)��n����|��v�WK�*[�[[�!�r��ھ~������&U�}K-9�E�DZ"&��/�\�7yO��B��S�K_���
)\��av�|��n�ݹ�Hc��9lRԀ~�@��
'�г��X���L��3�.�ٞ;�X�Ű�� �����r���m�3O�3g��g�O�3W�7а͟�@�����y���?u��
��<.��������rͽ-OW����0�P#�wD�z�0E%��P&������E�����Fo-�����Gp���*5�-���L�MJƽ�Ɲ=��;�J�k�m��~.�����l;$��{s9��B��..��h/
)ܚW��0��k�_��gת��ﰺbn6B�Yw4	B2f[ⷮ�{�+�d�GެV

y��L�b�fڧ�f�:
4K��+�����Bw��C/�@l
+�����/��F �G�?WN
}�v���k�f�	�Bv�A�+#aݩ�Z٩V�G��%2=������X#s���'�U.;
u�0<(�.�P�'�vA(�]�b(�~֩|dn���T",�&�{�C���Hꊧr֜��vt˭d3���B\
~��Γ�N�Gť�
8��ų��H�4��s	iy�NF
+!Q;�an)>,;"7	
���҈i��Y��-[������!���Ѹ��1<���p]+����X'�f�99�ޘ�|�ѹr�����P4����8�0
+��v�^�^�R�~0e�ɶ�X�Q�X0#��I3�!?�ܫW��dHYh.R�u����������d%�/�z�M�c!_���f���Y��N��d�U~���*�
�����+�J��X�W�9SI��җ�іo���>��^נ}e$��2=�-�P2��96�٨m���yIku����+)B8���	m6�J�S
+�Qo.��m�mu^>�Ȅ�U�L�U2;�&��EJlK4I�
���`|YS�\�XX�����5���8��
�`��[��Se4
M:+�j	�6�c�ڥ��E!���~�iPG�Vw�zR��^�=��^,���v
b7�ʇ
�˵��c��|�*U�L�h]��b��̋
�+<N
��X���X��ߩ_�U
�N���ϯ�X�7SF��t$5
	���%^��%�
�u��i�ZeuV]z�me3wϕ\��$��
*�
^�>��胑�g���c�U�\2�ss��!'�]�8��|�.��{{|;ޔp��V�˗M
�7��/&�9w�*��鷵�\	��ב���o�hn��B��XM#��dWE�(>� 1J.�R
ޯ�Tf�/0�������-'ֆQveO>�ֵ1<�Y�2z+��Ӛ��Jv8B�A6 at M}��r�F«�!�% ���a���ր���{�v�w�2�reؔ-Zk�/R��b�)��	]��[��ȶ��KJ/'V#+��!�0��	��;-

ft�%j*����;C���~�`��t�
89��V�8�i�!��J��{���1u_+u8~��է���4j�TV�;.�&v<���U�s���r�m�d3Me�CeJ�a��h=;��(�0Si� �At 

0� �)ē�w�v�X�,���X}��?h���g�꟧m��/�B�	��P9&�@�����8��8-��s\������G�]��w񇭆���W ���\�f*
������G�o��|Vx��r���}a��|�_���H���	�\}��}��w���}Dv�̓h�8��q�!b���A�"K?���=@}�h��ʀ6	�� %�\KC��ş8g��c@��?��=�����E�/�/2��^��j��"�$.M`�P�B�u�$p1a��r
&��2�+���1�w�7��'�!��q9�� ;.N'�w2��
pZĩC
^
�n� ,��6e-���^,�^��߀��Ϟ�R�������%�N�[�@gW��;�:���n�X�	\���.�Iy�Mɻ[�p���L'��oD�:�����8�	D���[�+ �H���
�o|��_y�h<�r��oC�� :
���~y� ��0�O$Aj4Ad���r�w�yC}��$�	|p�	<~
�q�9��x��R��*`5�^�֐e�k�{}���lŇ^�=��z�
���=�����aH�����]�����_1
UJ�������;�-�m��%zr��;+Av�2AT�� ��j��_�ޛ���n�K�@��q���D>?�.���0f��o��c$���d\/�9Ngoj(�N�6/r�28q�:���FW堩y�~���	���1p��2��cj	V
	?�=��	�(�r��^%
���F
��]|P(��,���,�y�ڿ�%���nȔ��+a��f���ek�ع
�c��v��W�����yd����H�f
i{
l�����.�� �!�`�w.���O�N���d0Ջe��_��΍��
+�{�
���
3��"�K~
7��+�O�=�
�S�

��:PV�Γ����!-WٮqB�(�"���~9ɫs͑V[j/���������SP�bܣ 8��d��wz�$��Ҟ��@
��۸-���_��s9,�{山�F��i��O���
�Aeז��v
�Z�,:P7j�5ׇ��_�Q�t]t� jA�y�
+��l���38�
+���e�=z��FJ�
(L:M0��鿱$#Y��_��e��4���ڱu�
[�s�#:�y9Y�:��q��Z�M��K�.gW�F�X��-z���^郬ν�h4����L8T�i�}��2T=
}�^�
��~u�95�՜��"���A��
I2�*�d��j��%�]��@�
N�qU�q��X�t ��ý�`�����7K[Y�=��~MKgs��g��
IQ�l𢷿�W,���72g8
��!�	)� �
�
g���is�-5�cf�	z}��5X<�!���{[M�[wQyC���lՋ��kX]�'�h�,H��-j�v*��g_������=m��s
w+N�6'd8��Ni:��!����
�D�o����Y���Z���M���f
Ek���n�I��
��T�+���1��O��s;NZF p��ƅ��F��������1қv���_`�{>V��͇���~{�_�=b'�eކ*p���.yK�5s{+�f��xu�"�%��
ΕGs`��b-�ƭ1���?u�L���3��5w=�X�̶��~�A{��"\��
���Zu�(9~�cW�חx˹�_�d�[�Ƭ�=؂ָ��R9��
3�r\�r15�s�q�[�Q>��c�.��
�٧3��}7��kۨ�\�@�"��#(J� ?\*�����ˁ3��>���:�ޯ�g��d�F:G���4_
+�
��;�8��qm<��9ܭNG
�Z���d^4,��q/��~��}�e
+=V�������et���_H
��/
.
˿H������'�c��Ȭrܯ��n[�ћ�yz��.�	�mh����mΫ���C�Ik�{�j#�im��5���
��޸��k?:���{���g?�OQF�&E��۹�ݝ5�6��}R�R�~I�ٙV��4#(��V��ϐ����
vyLݬo�g�|M����������û�:�
�2�����l�Rvocx�G��쑾A~�u/v�����C[e�T�B����)�X;wA*+z2��|dB��dM�Z`�,��&!��Z�I�x|��{�^�y� �m�9��͊�7���禳l
=�A��6�yh�1�%�U�RX{8�L�A��
�k�͆�
�8s]����g�����D>ye�{�5)
�Eɮ&c�| o����25ɮ���HY
+����?�f8�.��4r��v1ݭ-*�^|��l�g|���}�d�	���v�g�,M�և�.�I}v��������Se��Di����$W֯�� �H�U���o'd�o���j�����=����A���OD;~ϋ
��*�"ɬh�5&��G��V�
v+Zz��
B^L�T"tJ�	1 �W����ƆW&"�'ѧ�\��֗���eo�P9v�y�>���`��hm�?���a�+�h|dZ]�6Zݖ
��"Sl�m�"��C�bj�~0q�3
���'�j��#@n�a}����Lدg9���j{�
���i�����/0PDn�O�}j6t���@2��3��
+���H��~�k��v��^D,�V�*g��aB�}��~����,��]��,SԵXvg>���K/��C;���u�h7��w&ˍO�ҹ�H�3��؁9`io�(�õ���$1
_DŽ�C�M�&�b�&J')���|?��C�[J�>�k5�C�j�a�c��Ga�F��څ$��H�̆d����|����/BAz�>)�7�
+3+�N���v)͟���mlV�{��2�/<� K�a��U���G����ܘJ5ɍq�#طN�N���ZBO�}~�i�T��Ի	3L:�6�EAiN;�+��Ls�W�M?ɗ�	�&��~�?��\���s���q5)	�<���=s�YN�
�Y��74�Y_��@ъZ:V	���m�{t�;��3h�ݙ��b��r��J??�=n4i��f��d�r��lՄ�)
K4��J�Ưo���bT7*��,��>^�_�����9_����S=�g�ڋ�"��h�ݜ!����*O�J����̤җ�{�Y�c[�O1�/�\
y�Ԯs��ͳL��ex�:l���GKC6�]}��`�'K\d�3$.�#�4��Xl�|�A�h�A���5N]V͒z��3��K}ҕ��+�Y+��~+�
��'P�dqEuM���}`�`¥����.~�"��b�Fe>V����r���e�Ύ�U��1Y��Uc�u�a��|�Ԣ�=�E�~Z�3W}=�l�����F������קrΞUnm'0�,,�v����ni�!��V�+�Ŷ�����i�ʹ�{��Rʳ��
i��>��;��i~,��
F�z�Ӫ�z�_{�U���*O�iBwde�Y�+ssW�E����!:#2\�Œ[����_��\[�+:5|�
Fځ�@�pS�v6]txr�d䝡�3cR�Gd�����i���޸����OX��H�:C��*ll�J����k��n[��w��UJ��4��J���^�]3X�̝��9��@��_��vr� ��
��l����}K�^;�=d��"�)�)IV�Rc�s�ؼ�c~B�(��]|��s�\ʓA�t�%c|���L�X4�r��o�
U����8��J�%#��MEn��_1��!��'$�~|�/?؟�;�t��,��s=�t����o�d�A�p/$+6q/G7�)S��j�r9�6
+�j
o��Q
�

�k:y/�Z�>��k��Gv�%Sp��p��x�ə���e4�w��F;�*v*�X�8e�>3G�~�A~1�du��
~}O��5b���"��<�L0�I��W:�Q2H8_���B�[�ĜX���ըd�[��\�w���4�N��3:��n�'Z���*�ʰc2<?�'Z �
�~g�j�9�
�<��YG�ns�NX�\��9�Օ�#�񵸠SD�l�z������З
+�{�����
;-`��Q
�g�m�*κ0S�����du
poO����H���>�7��w��=6��R@�����������V:ƀsg�F
7�v���fYw�j�en�Y,��2�M��|H��u����0;�y���� �5@@R
�ٔ�%�
 oD�= ����>h+�j+��ǂG�ǂ��/┟?�t{����|Ʃ����zv
'�1���d�"�Ĥ�8�
5Nd
�W��9NZ��&9��X�(�  ��7���:�I������)���F�?L��oR�%P&Th
�����c�h�h�!p"�d
>N�'-Nn$8�m���;|���Q�p)�I�Ul0nnz�<�<�I�I �|�<3�� ��iğb���0��I�C<� ^	�#/m��)��6�o/�V�1r�5�4p�ğn�$�c&��X���8H�G� ���'��s��Vp<#3����4���Y��xm����?�jQ#�G=��Y85�a���W�8� �w>yFJq���qJ^�qJч8-Y�)ݡ8-���*`ڌS:i�i����\Ĉ�;�3
~u���9��6�N>�����~\9�z
S���b$�0�����@�K`��%Ы/$���H��	Tc�	��^(�����b������ҫ��� [...]
��zⅵ6JrI������{��=6I��2���(4_���}<�uO�O�&������Y�����ñ���
+�@�����c���]���^s'�ki��&�m&P6���&+�|�&�+-©U\؂ZXP���3D�ŗO�/	�]����D����A�w�1�L-��J+���/��C�v)�8w�L�
�.��~�7ƻE�:߮[����/��4�\�Q^���ܪb����g���RY�1��`s7�g�%�L�Oi����/�F�?xʇD�����%A�Q��m8�Q��{(�nY�]�f���s�U���i�����#��Ys��������.|m�����"�!��g.sw�y�>�<Z��t���S4��+�
ow�
��-���3�w��gvrϜ�/�q�7��e<>H�_���@�{�)���x)G�9�
�򹴽nK��hC��~.
+�R$𵑏k�P�r����ι�h�ZR}<������A��g���W8�O�_�"�E��N5P�ɨ����PZ���9�ώ>�:>��yl��A��
ݠ_���
	���,��wdr?إTy,����
�<݋��jshl�+
������9T����&�
+�P<�<�F�;qLTXLBV؏�$}7
6��]'3J
��!�-ky��?��y�7S^-2� �_��v��â%��S���%Ae(/��h�KpƗ��Yv���d�����`�U�'�
Vνgm�%��L+^���΍��Ƀ|k�W�bڠqFi<Y�ĺw���(�94
�maX\����i=�:n�
�~�F=#_�~�y|��|�� FJ��O�G���}�El�;���"���d�GHkSVN�Uch���of��	�²
��G!�4���]y�=�4i�&ȞՅ2���3�6<T���\�/�
��z
��)���^�I�1�r�'T���/
ҧ� ���R�u�^�S�������5{wpM��eG������F�-�Rݚe���_�gw���d���\qR-����X0��
{�|0��aƢ?V���v�P��=H�;B��`���Y��z�k0��?_u�e_��_u���M �aos\q����
n��f�������[0q�ud�Z��F�)Q�rtJ���
Y�m�HF�O*��
!O��Zk۷��~�?�.l�5���ۙʽ�
���1��|y�Z�<���ـ����P<�n{h��t��zx#�E왃�ʸ���l��9VǓWn�
C��}$IՏ���L��<ݟ<Q��]]}v8�қ��U���\Ѫ���/ZQ�b\�n�N7��]w��8whɗw�����/	���b�y8���b��f�|ģ�<�@�:ͫ
ս�>����
ǐ[X��H�l
��{X��a��b�i�
=��mճ��VV5%�XK>U�i�Z��R��a�Y裠ۍ�v\9��q5��`�F$��w�r�ٙxd�X6�
�@xг
�h�"�N����yb���z"����u-�	�K0������{�>���sU�
cZ�ˬ ��l�{M>�Fo��~6����t[HE1?��ȱ���r�b�"�|�s��ڙHL���,=G�K����
V���
����hZ�V�n�l�c�$9k� �Oh����A�ܵ7�fb��<c�
�����^`�
�ޖh���Ze�":ܜZ�ڜri�����Bު
e�zy
+�d��J���������Р�V�ߧK&�YWwlo��]P~0k�?����v��
�c��赜�m��C�L�/6׽ϳ�4a�T��fB[�N�ɃVV֦BA
|�ݼ��<S��Q��c�
&6�p��q���K�
�⾀�K�ٺ�����.�K�L
ks�D�n`/?yX�M�A�7���Z�=-_p��ik\�:�۾�b6�Ў�\
+�ycY;Wp���#�f�'�愫��-;M
L�BrL���L�v�0Ey1^����*��ml��/W�����a�Ŋ�
��M-���L
��qϰ��'N 1�t���AY���5�__t�7��$�W�^0���n�2-�*��5x��	\]'���F�9�Vs��W޽	e���@��yM�e>�A����4��r����(��S ��v̟�
�/�l�V�-��z
�b0����$�e%�D+���N���t%n����A$��n�WM�kx��v�fX��i
+# �NkFu���EO�T�C���Te="�a
dd>(�I%��&@��f5f����o��pd�cq��̳q�
v�J������ڬ���Ƶ����du����
���c��B���"�L�\��
�*��x*g5�hqN�͂���~���BՇ!4��D#��A�T��+ 7�Ŷ���M�]�7��|�'g�O��^j�.��(ې�l��Q�7C
g_��2���$s��h�m.�ޚ^k����O*
`��
�A3&�)ѩ=�
��Q�lUu���޵*���J2���\+���Tx��?��r~�Hgjw��x��]�^�N�d�Vg
f)�<!�8�e�u��+�
y
�*d���I"c�Ce5n��U}4��L6�ZS�A�uؖ+i9e+-�Ӊ�c9%2���|J�ͧ>*˭���}���^�?Xi�P�_�;��֫w�Ÿ�Ȼ�$���ԕ��H���Zea�`��S�s�5V�,\��&Hm�
�ꙥiՓ\:
0P�򎵃r~<J���z%�Z<B�8����m�9��/XR~X���]�!؇��a
���~�W�Mpé(S���N��/���1�+�@�V3,'^+T@<�u[.�q׍K��  [...]
4.�Vg]�0��C��X�^������F͢Ue�;���Qax�#�����eCo�~��T��b
��?����ee:h�����y�#0J��n�L��h�\���I���}c��'�q��
�q�)H��׭z�v(�6�8�F�mp�2T!��7 .ڻ�,o��^t
�1T��w ~{�Kf$ĥ�
�@|���Ő\�
=?��]v�k��J�����'�^�
+�P:�{�
R�4��7v��t�b$��8�<�s�o���	���&�7�m���c�'��yt�[�Ύҕ�w����L�F
�s�5 N~�,�p�hw�ƶ/����q$��牮"�s�DDQ.�_8��Z1Vn��p$���(u��g����?!����Y[��G��h����`�NA���uR�x�2 ������C�y0�8�� P�ǟ1��?�m'��1�g�k
�
I
�����q�Q �Hg18� �
`>�8�H��M�ؓq�-����r}
�o��R���Һ�T�C���
�Za���w�|
�d�?��F�8t�A�f
��.`:N�8�p[��
8�@��8��
+��e-��@p��g%���N������	�N(CP
�M�ۧ8�� Э5%P���6���C�)��8�LA�[�'���Q�j���{.�� l@��~�q�5b@,�7�
�� � �Io�{/jA��^���
��npC�*{����6q��"�=�ށ/�-�V{�}
��g�f�O��ş�/������RU��}}��F��H���E1`������g�o��
c����N
+,fM��w��%��e8^������{�����w%�H����%׀�x"�D��sW ��kDw�8�oW���%4w�m�������E
+��>t�am�/E���M뿵��O>�E=���a��W��'��B�,�\���bn�{�dt~U���cs�g����
-���eK��у��<;7������9O��0"o�'*.��)�¢_��)p���\��8n��ߊ�\�~��|���i� �G㩑���݄{
��|?�nٻ��
|��¬���u�"D�q����2��ډ�31?�#��'�*̏��f�W
�-Ԋz�{1�k��[�m�۔���ŷ�����ܼ�KsN>Hs�N��[�d�4�1�
�Ϧ2m��M{x�
 ~��)sv�9Z��k�թ�*G^�
�V��/q#���^6��^����[F%f��n R�yS�V�5{�=�C{p��K������o2��Y��՜ߝ]�/W�i^��i~
���2�_a��F�[%H����$[��vg�{��d�;�Ftvgڞ����vL^����]P
�
M�^�J�_Xs
���
�`^wo������$��:f8�:�lx�?�f�/��}�G�A�x��SZ��1㘷� #���A
+O
�y�/�8�Yޱ�%��
�@k��VV��^b��"e���Y^7����n?}�WƸ�8�?(9��ҳ?��`���6�q3�9�
=����B�l�ӗ����wv������=O�ٻGj~��o�R`!㠖;��f��`
�o�Z���%�^����s�p��ׄc�\�4W��xkX��ֵJ�Khn�߿5�rX�n|�8
RB�Ж�w��H��y�ӗ�b	Y��
_z�
+BW�����k���G��!&�~���.7"�p�U��/�ӽ���
+�5OjU\�m�,]a��]��
sFT�d�#CW����i�
q�XzBi�Ns�
g]Mu�ݽ
+"ݓ�N�Y������/�?����d��ߖq׎��|/+�.ON�`sK�M
�3����WVk�v�{���
��I.,[c�ft�V�[�s��h�P�,�s}�����|
VLգ��
+���.����\
#I�l 5��Q�Li/F-�>���서o��k���ś��Ĥ�Ȼ��g6��k쟝	���&�|��`O��m���nن��~;<��38��j�?�ћ�"��)��;F���L��%ѕZ����({�X������,�?7./s�/�/�/����ᅏ
�򢰤-�����оZ�qwY�+`�vi�1�9ָ
4CEk}��N
�+��.8��ZV�%В�+0����H<{Z�'I�w�7F at 0�&��1y�[1�����f�e�%�.��͗����q�Ś�Z�خk	��&mʍ�<����]�����ڙ��X֖z����^]G���u���#�$��Yn)�-
��� :��>�|���|�Η<�9�Y��JKz_m�L��7_�_�?� P;_�4���
X���=�@��6��T��f6�6z�y��xQX䂢�҅�Z�9�I���ST@�ν��ך3{��s��q��aK�Xa���M�����N��R�'ԛ^��E�1�گ��������C\C�å8+�B� [...]
+:�[6
���:I7]� �\NU7ڑ�"�Cf�&��]%��"��&�������ߍ����Q(^�]�:V�+?���㖲+�/;�JO��2'�R_����,B#Y�<	[x��-�E�h6^m\U?l�Ogy2Soc
�U��N��O�����'�?6�{=g"4�qQ��qi�u��i2r�������z�6����.{��ᳫ���i�y�u�=w���TQf�e[n#\��
�`\JK
h^|��=�P������~�Rz��t��wH������Y��W����p��ͧ^�i�� W��ͣ��W��Iu���W���0��y��ٵ*o3�F/�[4�F^�SfΤ()�!
,̧��
��˻s��h[]S}C'ꂔ����!�((N��j��1��9.�^Ig4cv��E�g��\�F�����e5�5�
�n����_.>Ƭo
�;ݳ�"
�jxc
;bNu���N�E�
�|�w�
X#�]g"1�i��!��M������e�7��|�Z�(��ڸt�u��q����������^�r�v4r'x��.�]�����/�����u�yFs%;%�$��r?�f��rh:���b9�C�#�7-���Wu
+Ñ=� �`���#ބ��|"�x�J�F�㨍A����)�
����d�������$�otb¨��0JI�\���8�u���Xs��B��גd
�Cv�1��tݥ�̋6E�e�Rj��S�-v��@f��deq�k�6Lz��
l;:.�3v��^�M,�S���D��a,@��x/��y�
ȳ���I
�c|9(�)gP����
�����������/��P��jB�T֜��*�n2q
��J/M�L&DT�T�����<��
+o|��*���=T�CdI~.�=zf,
x�Ұ`��A�
��L,J�=v�
��5<s�=��z��N���Z��g��ߛG����ցbz���y�
������I�B���ݏ�xӘްyO�a�ǥ���6���)�`5E�
�Z¹s��������u�O��nd��.��Μxڝ>8�C���@��N搞�mH;�&�y���R�t��h,���\��Q/-�3q�6G=h�
[�1�Uި�����j�
O�� �{��T>�W'�?�J�
�^�C���bv��^֫3@/E!
+�����m�|�Z��;�^�Z<�[��_6�nOo����]��[V����(��}�͋qv�p�q��M�Cݤ�ݎ) ��8��є�
z=���:���A��.�m��
mܶ�v����_:���Mi�4�˾�����FͰ����u>���=*ԛCV����V;m�
������W
����d����l�\L�*{O�r;�ǔ�RF������;+�c
�T������y�Yo9b�v
��Ҩ��Ή����F�.�[
T�S�y��*��v+�`�i�얭m�+[�w�Ô-��ث���un�/�
N1'����C��ٓf:I�O��Gt�>M$���~��J��T�6
;���`[A�nP�
K�����"%��"e�����wUc�jy	d�
+d��3X�X[S���
aT�Z5nR�Y8��A�������,��*|K鿅orR�Q
��.�9�j�܄ hTB��j��j�m�m��)n�5X�^a��E����nT��[@jx:�.`��
� ������0o ��2 �D| �0YD*�\���B=t���u��M�{�wr���J�{�l�R6�a���Z
�ɩ�)�=��]�u�l�W�Zg��=f����@�T@��&�b
+��y��`�y��Zз=��aXw� �g���J�
��/Ĥ�P��̦��i���C�O����J��:@]�D�
+�un�`dE`

s��v �����`����*
1�X� l�*ذZ0~10�H������: �&��wy��we���sU1&{
+v~��ۃ-a���t�Ü��!4
��j�fkC��ڭZ���:��@p�_��@��
@�����?J��RƬ�a@�Tm���l��⻬�������Y����K!����M�
�I�
�J�5�L�7h$	�0�d��2N�$!��Kl�I2iL2D!�=��{d���3����"��2�fF4LjHe��_KO�'����*�~_��l߫{�j�:[�ɻ@IJ5�,��"�Zg��,�f!Ckg��
��������d�𢡄^�t�dᵲ��ҵ
��X��8�v���/
��Q����ˇF���H>Ւ�|*�,���w
,�jIz�-�hѬ���6I��%�6}g����S�:��4C�iԊ�1��Ө�gb���$�x|(�^��}���`ϊ�X<B]?�D�
u�?ݏ������C�Q�^F�N>��Hޡ4�+�w�^�]7ۏ$��B�vN�o=��@��Q�����2�<�K�"��	f||����Uj��'#��Gx�G�a4�m(�o�b,]����B߇˲�;^�����/?�ǿ$�sw�QX&��]K>�E1
�eeM��$owpL�񕼛�b�.���7���W��e�,1���T4�3�.q���Cu#����z���/������2D�M�DZ�qW����'847� [...]
�d=��(4������A^߯6>�:��Й
o��
��x̬
�˾l"�O��<=�n�rI��������"�:�S���
��:�?_*���(R����ݫ8���6��^�#mw
V��F
p3�_�uՂ$��+��i:�Z�-������_~7�����Js����z�y�SWV��O&��~H
k^Qг�5{G�]��{��m��$ﭽ~���J���RC-�z��N׵12��C~��ͩbz���=���\��Jݞ��x�g��vN�mk���W�(���p����4��櫎��
&��\�*I_�M�>
j]:���u�UP,���Y���]x{�\��ފ����:+݅'��ܰ�����=�ٖ�oܷ)7n�榖�ʄ @�X1FkfY�|b�_
�#���涾�w�V[��,�9����Э���y��vغ�n�i�񏇡�uG��z��!�'���
+÷MP�5
�kf�c]��
+�2�r���!��B?WWWX��:�
�8�@zki��f�
(n�/��
+��~���o�i�*�nȜ��jL2��QB��b�Ү�������x�$梃C�e������q���q���Ѿ���
�./���fa?�b�XM�t���T�Ag�/祬�qG�WN�F=C��5��B�;���i
�8�6P�.��,���5ْ�5�>�����!�^q�����3l��<cr��|�<
�J?�1{F�p�|.P���;�Ki�C.M�/}��︼M
�\�5���	W<%��(�DE����(�DS�my�E����4��xw�����v�G��D
�y2o��±��|�lUrHg)X3B�5EA�o��0O��Ν�,T�#qQ6��K��z�\/BeI��b��p5QR�}x���9���~fb�<��+�*
n�ʫ_�/��߻	/zs����a>�sA0*�}e�
��;ٲ�1�a��7�ض��_/d��Uv����:�,�i�kyV�
$�^E%��
+7�+��W�a��f�W�y�9�r`�|�XҘlIS�v.S�)r��~�}$1�j%��yLD�2��Ev�ޘM�q���
8D�i�a��zK㼙���5)/Fs�?/L�Se[[���l뒸�Vb���b5�xc�fݰ��ϳS��z���0�	��Ce���������Z)S�wC��
"�����N���e4���ڛ�Z��h9Z�L4�K�bkپ���=�<�T�	)�
�K� �Du�S��Y? �$j뙍�C��]/\A�^lI9�*T���ܣ�0!��.N�4琋�q!|�#–�xI_Drq,_�?��.��ʩ5|(Apf(��h���C�?
�����
�b��rQ�phHR��oo��1��w��s�ű���
�rK?1��p�� ��$Z,OUB�~@�4���	g�_�R?6fB�=b�
W�"iv���ᶌ֡Υ;;����mt�K�b4��e�FrSk&�U
���{�)m&�q]�8�"�l�@�L-�<��
v.S�S�I�U*Lb��$��L����P���
_��&��k�
J��e
6Y~<��_f��חZR_����[��8ل�gn֘�h�#7o�Y�C��ԟ���C���16(�i�;�EZZzv��nޞ�ן�ԝ�q?�w�}	?D�q���6���Z�
�F
q��nT�|j���A�ja�q�!?b?7�a�q���rW�?|�[~o [...]
+���U�����~�&�az��!��!p�:W�.�$`��%����MvN���S�>8�9ŋ�eJˋҜ.\�9��1_��x�f��bD�R)��s�=A"��x���Jm
�pAG�r�b�=��k������B��}
�Rzf�V<�rq ^��ا�[��[v�
��=�Z�{
 ��]w�Q����?�_�],lϬ���C
��ef5Z���rJw��
��NsV��pԊ�S�m���w]h�
�%
A0����+
Wk[�߮3����>3��z��G��K��s�u���}�
e҂;�H`:
sLw:2���;����{#�Y��		.����Ti5g��+W�c)J�d^���~�����M gc��p҇�C0?��~��!�o��,����x�}��=��߹��S�_RH��z;�i�6:-ȭw�eϟ|���2Ӳ�e7:�:�ג��7d=�Ofs�9���R�6p�
U��缉5d\GPu���|��wB��F�b��
�s����|�t�L�=�4��
�N���6�����Р5v�{��R��L�?`#���}�
�O�F��F�
O�yeR�q���>��
Y��c ���xʻ�{�i��*��r����)K���l�����ۣ�`���A6���c�Ğ�ƶ^̓i5��
+��'Y�˰To�L�v�����zW/f�S�~��#�$z����W�������'�E�dX�l�����j�M������'.�ۄ��������3G9�荞�R���J"m�l9
V���+���x9��&�n�&u���J5-�o|�,9�m�4�Tǥ<82>N�;�/ERm����#� o/� ,��E�L��9-�����NL�o+=Q�t���w�T����`�z
�
+]pHu
���;��MqӨ]�vunjz�#��b�[�ŇSh0�:�5�y�@=3`�m at PxN-�\w'��}Vy Z#l��� h`�h;`p9A��]���X���b�n.UY���V$���45;��XT�T0�t�}��΃�.��_yn.v�X~?�ds�E�t��8ZL/��)8�ps��3t� p�\ੋ���xy^�F p@� �2� �� 8�f_�e%�`�!ۗ�F�֠$�u��
+�	���KZC�<���
��M�\;����*�HQ�]8�{Vn�DK v�����\o
 5� �� \3��';���(�V
@G�
+@��=#��|� ��� �k �ω j� ]�?N0���]��託��a�G���
���m�z��J�c9� [p��o��� ��v D
� rჿ��h�
�. *����y ��:�5gC �
�
v&0�Kg`�@�SW�ou�&�FC`�v��+�
���=�><.�WPw�aK��M�::��H�:��xp�
D-�+��B2�S�*�}��-�`z�����V10�)�b�ٶ��$p�?���N��T�h��,̊�O�&�Pv��o�51��(�o9Ily�$� d
�$�6�{�з`����Jhg��
2�k�5N�i%�1��ζ5��r�R���D����j�U��r�G��w�ғw��&����drY�0�a*Y���z��X;g1�@������J�1�!�����ӂ�S�&�52N�T)$���V�ū�u�EJ��}�"���8���g�n�'�{�f���E

+Y�zLcq�O��V&�ϸĿu�
��W��jT
\(�9������,�_~�{����
���I�Z�#
 �{Y���թ{��j��꽹)�xw묣��I�-�o=y��� ��Go�E�a��=HI�^�s���|�Ԍ?���u}mv�{��=$�~�U�.$�q;�\� ���6���k�^/O.��m��V�:cgc
��+3�k3��$�t�j�bk�I�����,;q��dXRv����{���[����k��s���Kw�9n�:�t�Z��sM��LO��q�Q]�����Q>�9�)~
��^���O�7
^jv/���p6;.�a�R�&��H>�~�|dUȢ�M��ʢ��B7?�B֬x��޳�ۻ��N��R�_����lO`4�)��������CT��DLx��b�.���
���۸r�����0k�`����g>WƸ���밿$����g$���.6(�=V�,x[J>�RyUr;�v����,)��+"�q7l���K��,]w�]#���^~k�j�N�v0f�A����
�_��&;��������&n��p�{-[�V7!$V�$�9�(`
�;q�_���%���f�Gk.^w�M<�أ]l����
G$�-�=Ύ�Sx̶��[
��mJ�f�f4���L��*\�C��^N��J��ꎾ��`U���+�Vmۆғ
,�U�TGf)�2K�P������^ܓ�"ܗ�څ�C抆7$����q�����+��R	�n���ʕ��ltDBdž��8o5��Y^��Ɲ�h�^���bX�&��enjŁYZ�rע�eM1��FSw?:�
��A�:<��d8��J��i.א�\Qo0<'��2�����o?�~n���tS&�qHc���cz��+�l���47q�-w��ad���h� ��a����6_��Y'
���pn���
[zwu�"!�o\�JQ�H9���B�w4��4��G��gg��L�����-���z�r~������
��,_�v@�!���L.͌� PueY���S��|5\ H�<���s�9u�5�H�2
��
�wV�ۺ�A<>u���q�	A�����nFHs[˸=����p�����5��U���?N*0{�/�Lf�z/�^C��'��Myj�d%an
�Bu�T
{�W�&�����r5T_�p
+��d��
Am�H�.Q
+�Ai0{-N�
+2(�n�1g���?`���/�z�\��c��l��j�Л����t>��˽�
��?5���u�9����
3JyK2{�5��^-1��{A�d����K���*�P�q��
q������{�X�_�M�2d�u�2��}A�H�_���^9��9�sZY6��]�U2H*�&9����=�j��,���2�ƞY�Y6�T*,
N�D��
'v��"�ۤ��*���
p�3y��U��z�"ςQ�`���w|��k�iREM(��T+g��`T�!_��w�ˣ[ت'^Ƙ-��"ލ�@�J�U��~��}�:.�q��z�|T*��u�S��OG�qE��Ej��y~��?*�j-6K��
�-�>ٕk���\X|S�B�B�(�?�wE�u��G�;ٗ��WP�
�!��r{AK�����M�X"���=u�j֏)�(^Xl��
̓C�J�|�.v�bA�~�G����p���NiKb����õb�����ıu�*��$o��H�� 41�A$��fc1k,��QAhe�(aM@�
LX������CS5ȵ�����
��+}�����c/�~�/�c ,η3� [...]
+:����v��zm?��E�#��Z%r�O6���?��hW�ģV�`���Q֑��F�@T
+�2*�0�e��.X�?�~9F�.l�}�X�i��ʸ���
T�:{�ex7��-;��>�OE�{4�>��?���	�T{b
$�pjL�<3.����4��v+v�
�|�5����@d��]��V)X'6�Oև���+B����
������Ӊu{��r,����/��
�����߲��vI����t��9��bÉ5��ǽ�	����}�����╨I�f�������%(����p���6Jzn��14Ď89�Hk��Ts�v
>�co���
������~]��}cƍ*��E�*��A|���0�i1�-I���	P�t�0���tӌ�m�M���,�f�M
;��k;W
U�W
+Y���X��#�y�
�tP�7��Ԯ��~�{�|����ƪ�/V�~�et�Ӂ��OV痀9+��>���#
�
��l��
����k�{�7	�&+8�֥Q��71ɐ�4}�QuW���ȣ�U�)t��#0����~8��M
e �"�Oi��Z�g� ȕ.�}��-���)=&��nuN����
�md_�a

��Oc�R�4��X�
��䚛�u��46�Dk
gפ�^�@@િ����~���Q��0������
�d���0֯��i�si�{u��+޺��s7h
�%�O_�m�.Im��?ۺ1m����֑��ۃ��x���wEZC[Ĥ�N�m�u�r\�-ܨ�
���g��Xt
/�YI��
���SC�5 d�=��CWtn�n{��w.
��QNV��G
Z|�L�E�6�V-�9� �4݂�m��Y`�k��?`���P���/�ZX�)gBE*K���D��i��c=OGz�:���;��7W���5(�ݓq�AC�Z�.5o�w�i�n�eJ�
ٽ5��
+4'�m�	�@���G����F���u�4��k�kZ��V�y���Hn����W�j�F@���{��^��z�5�,��}z">��
����cF�����k��^sA��[�M/|���ܙ�Z��T�ӇYU�^P�\٨r��qeA䊕Am���%V6�R�)���b��{�R���R�QJ�_���R	{_:%l�n��c�~Y�᭸��F�΄'X
��N�0)���ļN�8o�u����ГiM�R�ک|`+�K�,ё*��D���"�sA��� %��`���69@ֆƅn��C�����9�7)���*��o2�4��Z�[���e7�ߪ�B5��B[5Q^�#.�l��[x�t�|	o��	�E�K?��ag���Z�~�c����m�=2O��JH�[�1n����}����>�|��^�0�@?�1
��
这&���,0 �+0�i
��8��bά@^҄�_s����ޝq�>��t�
j��2�I=�U��zr�|Ba6*r��d��`�:؝U`p�,����36G`؅b`8r��PE�l|{�e�2tD����Pƛ�O� 
_�!0�+bFK����:7�H"A=yjH0[���^Dy��)רY߂���K�%��� sب�����2ꜽ@�Q �9��P7��� �C{ >HW ɽ> �g� 2P Y�D ٓk 9�1�<�
�<O2��#���6���ڷn�^~k����
�Sz1�b�q��p4���d�>�s���_*�T�pȗ��� ��� @�
 ,������W)]� �vc ��\6\x�
TP #;���|7�5
X�H v� ��U {Y`TAv��F�6�	5(Ø>*BÊQ�rK(ͯߍ�G�T���F�ɟ��wd�Am���u[�ĺ�]���L�
 ���@�UgͿ׶�kyo��'�~٠���CȎ:0��0B���k��@�*&�KIZ��ʊ-2c���Q�d\�2��$!ʹߒ]�����������
����U���� [...]
+����[�P�x�e�/� ��Y.���.7�ǡ޻�L��g|�v�uQ8̮��C��X;'��:c��:ZAY�����|5�G�MM�g/f��t����?N)�Y���$�E�M��
�5��N�~�e!ۭ�	Kr	�ړ����8(�o�;�.����(��U��#�J��\���n�}*j������q9�W �
�ix�|��!�ݢ��O����W�$�`�%p��o��jb=���V����òFm}�<&�I���Y��dv�F?fB^��4=[V��/^;w�s����^��0T�a���'�ݠK���}^�"�X�M; *���X�Ǜ�p8[OMI����ɯ���x�d ��F�,�DV�{�ɧS#��u�$�'oG�^�5�'l
�K�K����$r�����{�3�����6�r� p�fB	�
X6O�蓼g�uH}���ޡ\�{M��q�:����1+5}/V=gy��e�d�wj��پ���_�m��o=��M���c�i��E�P;H�<}E��ڟ���n�h�چ֛i�9
�<A��nt�-V7@�V�}�q��p����j'�Jbc�A��>��n�#�g��ylN���
��o���ӏ����]W;GNGS�9�)��ֺ��K�Y*�D���N��sᱮ���{����6�V��������n➵ay��ٮ�<f['��V�h��fN����B��d���؏�����T?M��.�.M�2o Z��]��Ӝ�v^�����P��:��|[q�s�_��'u�_rKe��Kqy;
]��n
��&���6��Kb/6^�
,����#��b�M��^�.= Q��CM�Y��x0�z1�k���tos4z}T�[��9
�*�X
+�URe���J\�(�e��.����}P�C���wnz�
����]���z�	������9�
�������v����)isn/�M�'
��c�9�:/]T�PHdz�����i�}��r��JuΉ�Qh���k��oDi���kpf��w���8��/���I_�Z_�m�
Vr��Nb�>���{�X6�帳��7�:O���ykj!�*��
�6�H���J�v^E��	�G��p����FN:3�c�K�J��8�j��b`
m>%1�eR�R��-Z��!Ce&b�3�u�l !Y��c?�/����h[���^�|��W��J�{e�,�d��%�7m�<�
k�}��ʔ׆"7{��<C>��ل�q�2ܳ�;y0k��g�C֦��sBWCyI�y>�x�S�8�R��Z��_�}.�
.���A�[�cq.�`�x��.b�n�G��R�G��]\Eh|��|���
�f�W:��0��U�b�B�gA��2��6�]~��k��e�|v��Q.mL��#��ϜT�ܓ�-�ٛ�/�/%�Gdi�����u �P�+s����{�t&��s��P(%%~�_��"�����\8��ϰ�rcH���\���Fq	zg���X�� ��i�\\���t�>�*H�$��J�+���JV�	��/})��R����݁/�N�YA��qƀ�Ӽ�B��!	MW�%�0*�3����YrW��ޫ�a�ע�갟��p� [...]
�]w�����
cpzpj���u�[�2k�>�>��` %� A1��0�z����^ϻ���?��=������Lⴺġ���(�ԏ�"�e�L9�#��@����(\o_��?9��\5���"�����
��o@�̧S�0<�Nx7�34Mu��0z�u�Z�hW(���
\G/�H��)��Έp�}-�����zTq��P
'���!��43'�vw+��ǭ(���]�˿
V��tt�&]<�B�pH�9�؋9d�������
�J�5� Zٻ�`c�tG���F�7��QG5
Z���U}2�5���
U�#-��|(�B9�R+��g��K��kiQB�d~�j���aO���M+q�CW܄��΁YU�0�����[���
�!w���&�~����i)��x)�i�L��%x9ד��B,�D�*�g�URB�Բ��.V}Y���e�wZԅg�	CX�
+ꮷ�����O���;�,W����%�͍jE��+��\*;�
��J���,yi�]�2W�3y�7y�H/�a����[E
��H�ōG4��0�+[b][)`T�.ז>�M��@Q���
+_2
Wie�_�L�.kN�}s.�!s;��,ߙ°���8KS�;C��i���R�6=�񒐏γ0� ��ݮ��6��
+Z�y�j�U��/����6 ����y�|)=�������nTR���[
l�>
~��
+���@�նFq
�B��}���>)F�����
З;�\0(9J(XA��48��e at z��ԙ�5�������Z�:���G��! �z�f��'���_
��ػt��Vnv�
iO=��x�6��(a*�AG>a]�/�:bu
8"��76_�
T|!�e��$
<�pz�ڜL�:v]c�{��zN*א6�
���l�jYY6�
f.���6�o����3BJ�f��d�������+�;��rN����ћ�5���9WNJ�)N�J�r��\��j�Ѥ�I�D
mK�g�-�k�$�
I�洔
t�z�J+�����!:��e��ի1�B9�@&�����B�^z���
��mU���r���O!3�#������|�3�v�$4W�y'7���N���T�m�>��wZ�))j���T��R�r���x�cQ�qpm�V {�נ����vi��r�� 
Y�[�`zL*��Lߨ f�	
/�	�`��6`ڧ+`:"
�� S�St�QT����S���x��#�(_
���
�� [...]
�d&�9�ǧ
������
+��
�k'�kFL0�S�@��'���+���I�˫�EC@!#-?��1u��<2�HC6xs�<�#���V.Ȋ�B
�bM��	.�Z��Z������P9;@h�] D�
���p �3{}{z�Z
H�SR��IЗ@2HeDR�c yz%���;���fT��+ȼ�N�y�����?cr4���r&�4�_HR��P�Q�Ǜ@��} �����}��w�Qp[�9��=���+�)r�R r�с�*m���(�
Je��9~�*x�(Á �Ѹ��YP�.]�X{�iy {�&D���'��2��/c�l��T[����'T�t�	J�֓�%��Xn����t��%���T�$�݁�i�
+������q�P��(��K
k����$h7�XO�4v�7���O2����~�����O�m��>ʏ�v֎���������A��;�q�^/����L�8�
�_t���V$�X;%��K���'��E�d#/�ѻd�5Kv��|�Jt
�=�5�~@u�p�����w�ۜ��ꅐ�X���5�\\ l>��y��6��>Q1i^���wk:�����:8x�I��{��|@V����ɺq˶�/�b������V��.D���%:�����A��7o��
�W��q�oo|pP��?�M=~JxҮ�W��};� d~V��6�T[��h}�������7��A��gztȞ:йp��o�Q\܄C�ݔ��E�}Hf�=��ݝq��j,&3���r�"Q�:�tzE�'�幾���¨��
�UO���@MΩ�fxħS�-�W��3�)���%U-ʄe����>��g������
>\��nj�Z
�=���첓����]�D�
U���J#��p6U�x��w�tn��i
y2|!�?�_xU��[����
��Ɋ.��!q�f���Y ��������m笢��*j�<�m-�幱���< σ��:��~�E_H����xf�ӹ�ߦ��
+&+�����9vs+9<8�
҇M4:+��E���:�
{�ѿ�,�����,y]��ɼfƍ��<`�{�A���9.�n9^H�
+�fa6�V��<���
ݯL���
��7&+k?<� 
�
�.Ei7�g��OuA�lϲ���翐 ���D���l����N����a����ɺ�^�+8{TJ�׮J.��Fh�W��.��5�����|�1�-��
o����#�uU���
���h
��L��6�rq�~%
�{Kuw�Y��Ǥ��a]��Ӱ������YN��E1�M>)0<��[q
+}}�3'�f]n������=Q�œ�7����}ߚbz��Lk<��6x]F��$�ZTy�����Y���o��;o��
l��t����Ѩ�Q�U�R���7߭x��[*]�[  ߃
����w�1?OߍZ���A�w�����=f��rv��6��W�I�To�[��a\Z5(
�~M�F�<�>�dv�6�v�P�о�]�-
{r�ٚ�ZZ�`zc���Ji�ל�ܤYa�]c�/��Bݺf�_�[�1ǡ�ݺ�I�:��O�r��z6�cJV��?��Q�Y����e1L-|�Qzv?7K�����l�����"�Kr^RI��ֻL3*\
+�L s

��6f
�A$��W�M�I�A��9,��:ھ"�m�='�AI,���#o
��K������/��r�RUu�ܦ����&��"_��x�w|�ʛ��c��G��td�{�{7kf
`�����uVZ���Wr�0�z�T��\���=h����XZ���:�['Ǧ>-ojSr����4V�s�^�����J���Mݿq��a�Z�;��gaN��s�ND�
��}vz�ڙi�o�_H;�\̖>�h
� �Ɗ/x�����7V��vq�o��Ӗ�+b�n�e�6�EA0a��jeG���D�Y�����j}\T�D�\v�:Z&�|R]�
LyrJp������?8p
�!u��R��.z#�j�{��ϑ��f�n���,U�u}�a4߮�ξgK���b����+j7*��Lm�k�� _5�SYW'b%��Bj�V��S]�E��ҥ3;���!_�A�W�S�QN������
�ϩP^o���u> A�œ�W��J��5���SG�w1B����Z`�xf�4
+k�j��.ΏSR�J}��*�˖�H'X�
�RU��Rw٬x�e�1҇��F׬�K�
�V�m�@;
a���УV��vy�&�3�M~,�S���_
�!��K
n�T�|!u��%k���9�k��ͩ��d�w`}V)�F�r���Ʃ�y�퀔|�Ø*t\�_S��kO��&�`�!��J���X�,����v�/D���&A|Q,�|��Q1�ۃ��o�
�J
�
;ʇJ�������z�ÆS�5���j�2U+S�*�
X妻���;4���Hz̟*ǒ�6���؃�7du�	
+��0�4�9�jՇle��by�\�\
7�����li�*�L���
?��Lx�`%=��86m�>��2�qS{s��t��ڊ������	���iZ6�G�\�iv�$n�A1 ��
B;���^th½�2�"�V����fq�/D�V�U�X�m�+�3��GW���9��"U�����I��؁ܣؾ��,S�;iϫ�`�P'
R�����]q,�1J�m�L�K����R��sŠ���w���E��jӵ=���p��ۣZ�ce
��/岲;����
S�bg6���+

RQ9�O����~Y��.�a�`�
������?���}0��;/b~�g��
�_����v��ZMŋ�yraJ�� �� S��]���ݯ����S��t�ԳRr%�vr��]�c?|I-y���D��;��L��sTsx
��q�s����USgg�Ƅ�}������;.]�\qv��� x�
�
���*G˕s!�Y�
v5o��%)�1z����ZbJ����ݩP�)�R�Nа+����x���=1��I7������^�)n�:*_���[Y�}f�Z�sZ
֠e�j!�)��ы
�e�[�Tf?�z�3�)h���곹��E]z?������<׋�2dU��(|���VNb7MZ�ő$<�׊�`�˿��>?�[^7vn2��8�L�l����fy�
�\����;���YP��$O�-G���y�5�1�<��-E��	f���;�g��&:ZR�4(��[�ݬ[-�m��aQ�
+]N�����O��Y���Ё��s�YckٍǬ�k��gl��1�������v���:��,� �<G�"�g�
ѫK�B���
+��х���
+���
+Nm
+��
��n>A2����hUS�d]���̬����^���rMW�fW��aD�a-���F')�p�@
�K��g�b�Y���������o�qカ���n��҂
+CkY(�
�̕�e:y��
��v����ӇjO�-��^<]�&P�k�
<6�Hr����M'�h
Ϊ�[�k��n먩�C�.
+��S삏�/�nXn�x0w�����D�ټ$-���
��^-�}<s�g�ҫn1K]>0<�M�6�&�#�k5�_$SX�J2��,�9�b/sjVY*��5r��6Y��?8�f2Z��9�# 

���Gj~��gm5o�اd��Ԛ
��c��j.?y,P̆+��a�峞^g�
4V2����d:
���r/};�t/�i����'�ʣA$j�Z=�Q�k��p�"HѭՓbHY"E���`W�|л'�����zpZ�kkĝ'5�4���IA�t�2_�Q
+�ԛ<)N�d~�8f��L�����3ޣ��r�'3��F���Y\)'X4��
�M�C�Tx�0�S����+S�%j�=� �(\@#x�G�!���m����zJ����u�������o�V����/�&熠@�ŏl���M� /
V`rD�c��GG.�AP攁��ͻ�tߢ=۫��
+�����1��}�; �ѥ }��OO�Ы�
��!��-���M0y|!��
�|���<B���o7���ס��
vm�
J0�J�W5� �b���,Zć$<?j����� s�
+	
,`%'�|����u�b�.`Yw
+X
:%�`���_�`K����l�[�g�U
(����{P�2��Uxщ�ڍ�I�72K��
h�´
SU�cn�]�H땆�oU�ѓ�(E�(��M.�P�q���-��j
H��������1��$^�~g��|$3ɖ�j�W�1�5��Nv����+�;j�a����J�Ŝ�2,l��M���F�y��XH48�!��h�z2ϥ��c1%��%�G��O=
����ڜ a���X ���=�Q� Ĺ�q�~�8�
 �m���gz�e^�bypZ��vf$0q_,e	Gb"�#���t��7�l,�SLū�SO��Ư
�������9|�Xa��ޠ5�@^�Bx��`^��
+�|d�@~aP�y(9t
€��]�%��+b���=�pi����
��Q�`LJ�|!��
x�D���?��4�,�����n�P��,P.=��h�`�*���m
B��F �@�R�K��`ݍc�,����Ϯ�-&���u�'��tЏ������v��$��	H�bq��p��,T!��N:�+
+�.��AO�J4�XE?��G�
�_|k��A��FXvo��~
���؏���� Uc%��ǻZ�
���}@�ܧ�pz7v�	T�9u�ߪg�v]�
t��=�UD��7�󡄬����a�G
�/���W��(��_L��Nm7>�

���hq��M�>�6�ۜX�oYoC_��^�l��rq
/�|P^�3
��s	k����;ު��Q\5�e7���M��磱�
+L�
���C��۹���nZ��O��ݟ�\>���!??�G����im��zp]���B�3=�
N�M.��;�B�����&vh7�n�X�ࣧ�v�te�e���ْ�%�
�
UF����
�>�՟����?���$��� ��c��궑�lY�<�AI<��x����Ts;�2�

��kb�	Wt4�.;�h����v!��<����r����{���h�gƋf�s��&��_�ؙ�b��.�1�c���?[�����q<W��f޷�
�����F���پn���B���/��#���wf
G)
+��>�
+��

��i��kLV�]{b���x[�1��硗�mCz�^G
����07ow>�5x��|���
�A�h�|�E��ą��{�[m��L�<&KNn�C����K�����Ƒ~N-gh?u�fG�x�-CPx0���m
ĨC�Ɋox�pq(^-��b9P
�=x
o���~Z�L�e���ͫص�=;�o�3���~�=t�]2��;����i�z������J]�~!'�]T��Wl
̇ͫeΞV��o�A;d��px���I�� ��נ�#��L��~zY�z&^�{�[��u),����mXP�K�b��tZ��j_�ѵ�
�h�
Ė�h��Q6��R6�7'�e�����c���֟�=z
���N��Հ��[��.�2��<ow;9/�%��Wz�I3ɵ_���F\�;�Z
JJ�F�}�Έ��X����"��\��֒���7'�p�4Th߈�ƻ�-�i�
+6-g����6_H� 
+�? ����eK
Us�]u��m��������A��Uh�.��VA�Y�w��B�ӎd���I+�[k�ݘ�=����S���B����i�X��}	�������Ug��xI�uoT^�}��;3)o�iε�p���cm���T���_\Q�7kBf���_�-,fAiCx��{7�G;�C�o3Gn��S����L��A�vKE�Z¶n~!\�[z֏~���v־�'�ݭ��~�V����3n�_����6��ε�3�VgǞY�p��ˊ����N}�F��#��h�6|�Io��6;���h��#��Bs�ܸ��~�*�1k9TM��['������(�[z����e�1S��&U��!+G�FvT�fv�VŢٰ��ve�T���.��jh��(�ַdeQ:��_
�/�^��<9�k���q�#��V��ͪű
��˻��M�OM[���gX���a�3ᄅ��Imr�V5TV�y�y�B�Y�����y����B�9޸2Ѧ�F�V����dP▙u�f���^�.�qS�'�.��Ez��f?���n�ߩy�š��~ޙ����'��|��]����Y�p�_
s�һ3�~"�ZR����t��c8���6��S�m�u��2Ir��T�t��s��ߣ��x�%
��`"v�]5��.��V4����:ݩ������Ɇ���da�4�x�[�����Z���f�
+R+�]��#�߹
+vp��w�,�~�oxqml0�pU����>ߊ���?=��C�)�[��#��3��R�cn�,J˫b�mJ�-�mym�3y�=�|!J�
&�z
+�Ow�
���+Ġ��-�UvT�9pi��g�
�M˅2�X�%���K��KB��.���aQ���B쭮U�o��xՉ��������#�,�k��F<�v��Ij���DlS������Dj�,~�&�p
+
��n�~�q�Q�*淞l��9%�jbZ��� �eﳥn�A�����x����~SOUf=mB='�
5�ɽ��3We)��
+6jed��Ҿ|W%j�;�ɚ&�1�����8��~���kM~pU�	�����L�����~a�ڴ&���6��i�
T�e0Y���`�A�8�X�>��y=5�I�T��F킭Vu��,��@��㙂���촞'���O�ٓQ��4	�c����wK��
�[^ѽ4��6�z��x��%@�d��D��c�с��V[{U��:\>S3'̓TٴvD�jGpQ��@Oݐ�-�euZ�&mE��SMv��L
ٞt�*c�Ku�����
렻�p�=R���0> J���UN��>��5;�$�5^U�5Ι�5VH�Nޙ_�S�Y�����P�?b�&��
;&O�Z�$�K�9E%9i�1Mژ�&����i�������
#M}[�s"��T �j�?��惱y��}qa��pp.ò�Yf��u��1L2Zҫ�
ЫQ�W�ӈ^MO!��m�-72��~49�,��h����{0���J����
Z�V�DH���K&�ōx�ڐp�ݬл���<+���D�W�U�
���!ϒ�~V��lz%ܙ��F��nC�uө]��Q
��� x�Gok�G�
�G��G�9��� A�^2W� ������*+N���e��n�KI(>A�Ps
�dw��3��n
s�Q��ϳ��ͱ)И��Pc��`0K��ܙ���d��P{rs��̛<qF�d{��ʔC���(��� q�B?���\

+�X�Ł���/4�h���,���:GF��qA ��#���f��wЃ�\�
�
:o� }�ڏw����&�"y:�&ɩA���C��'�
e[����U�8��U!���<�!n
��/GyX�
;�qC���ǃL������
+���rs���Ă�l���.�dZ���TA:aD�uj��Z��҅� �J��
(6��B
+j�B�߻.���b���f
z�
>
� O�A����	�5˩��<'svW)g����us�%�.�u-��u�� �m�Xa����}!�(ո����)�0���(�Ի�8P�
�@3��WS��c��enu4>��yðT�֓I:W@���n��
��f)֬e�ױ�i����a%i��<�[��d0�*�߉-Tn<�ȋ~PYK7ѾY
�}M��V��u�bMG�N��+��B�j�ֶ�e��(��K�U(����y����wA��;�)w/ٽ�
�~gE��
DYU�z>��GF祆�.X2�v+
Sx珰�a�H
�NB�J�$�|��
��t�
+Uk� ��| #�
��θ\?:��(=*����O�^Y>�-I6�5�N�R
-�
+����3{`[�tOM�Q o.py�|&Gɹ�w�NV�`džp�g�=\�Է9C�	Z+ at F�g�	ȠV��Nŀ�*��� K��_|��XW���
���q)�F�j_ݪ�o4T�2�x�4:���cx��E��2�JK��3)
8S��A3�ĀZ�R	Vi@��DC �ki ꍹ��G�l.�K0��T�x�hh34<�z\j�:l�:�䟡�lA���ʗ�e��f�ͣ\�D{���Q�&��_H�5b諗I#��D ��%��n���Q(��L�I �_r�)!*`�	��
��:M�=fZD��̢`�5`�
+�a��|f�<�q����t���sI�v�r�}!
��L�
�ċޗp���l{]���hM!i�$���o?
��)�� X/E~�Ɂ, v�� {XW �L;�#�>�x�F��&�K�T�:�������
���8�B%�
��`�)�<����K2&K������G���Ǥ��<�:n�
+�̓28�比�E�]�
+�Sw�8�����Z|;l ~w�VB Л-<���ް���
+N��Y�Ĝ% +u���7 �S
��-�*�O�R��
+��g>Y-��/2d��cWX�L8���iͷ��狀�@����qs��n�Ē��q����H���y�ii��L�"���
du0�餀ܮk@�Ԇ@
[��ayb)@�j��IYi��mv��ر_�I�O�ht�r�`�G��	�k�����I]�ՖE�_�w��}��[�ݑ'�$�/P�y
(��
T�o��L�'�	�P����a��w4���Q??�sݶo��q��%�O<¼� �� �	���c
��G�����m�����������n���'%�����#�
�=����ȴ%􃏶������������?�B��?�3��Շ�\�
�u7������ܺͩ|�m���S�+ޫm/γs��'z� W:�3�}:W&ѧ]?���;k��;
+�kbAٿm���~�Џ�����u�}Q��Q's�e���j]��<���A���曣O�"ǟ�����V1JGqiTn9���l���h������	�mv��6�T�~tٿX��Smѣ��G�m\
��A?[n�;A��wcUVn�F�r�re�|�l��I�GGq.�ʚ_��=����q;�s����<�[��^����Wny6SĒ�`��G��<�Lk�\I�E�h�#hr�rJ��NH�Ck6:ҿ��'�U|_��
��Ђʒ��!���s���[%�W
|�|!Kn�
q��
Zѻ��~
��T
'3#^-�s���fǷ��F��	>��cb��W�)���6F
�qW�D���w��~^��#��6*��u]�é�򣽾�뭜��
t�^���)z7��l��\��&+}DL��
��H
+f���&2F
bi����M��c
��xņA ���
�v�"h�����s����\���t���Y
�/$ׅ�~�p/����V��n�ƒ�"���$K��\�5'�x�
��dt���q>�S|���=�;<���l��
}t��{�2#��
^�W�]��M��u�i�s�n�}���@_H�{j�6B:��^��$H�|��Sj�Arq{�k��Z9����xǜ�
Uo�
qt�*�P<����
� 
+�vM��^6*M��Κ��֮�Ľu�xr7�0�%��X�L�����c|K��%/X��
�.�f�����~k��
�H���k
+Q�b����B��9>6�n��f�+��]�JCy��G��8nS�4����ӵ.�t�s�[�ny���GԒ���N3G/��\���j"�7f�&��42�q�Iu1-c:�M���]To<�k��9�ݮ�/CKx����e?zfv�b�9_�"��m/���b���?��/�K�:H��
�m�9�U���B�l5���iTsh�]v鉋=���T��Cd�s���u���v���[6�Y��Z2c>j�� 5����C-̕��R��y�ZF{�*:w{U4��q�ҋ��2yܧu�9�Rن�v�ZTKռ��?no�^�Ft��]�

�
���GI�}
��/��!o`ݶ�%��?㽩j�	 �U+��t
&�Z
���"�Jm���I
�)ۧ%j��a�h L�HJi� p���v������kx
�&}+:
a�,K�7�0�<��w��lO�{=!mw�
�꧆�9$w�V�v
�0�j���tl�+��
*����	!���W
JM��5�v�Wԙ��»(�eC��]��
w��i���wSh��h��;j���In`qXp����8��,��aq7��=\'�`
a
+|5S�7�
+��7����/���h柑A���ҩ�^J��}��0S�'��|Q{�:MmTG��.l��$Xj_�jh��j���`r�յ݄�[��p?��٬���Cw�y[��9��������w�]��V���O(c��Hͽ���Nտ�W�[�[����p���l�n�����]
3�AV�T��QSц�*�S*َ~�WBU��8�JP���!���y��T\
�0�����m�9h��Y��NE��U��Tu�4��9����:��/�\�/�G_����������[����<Ҡ�6S���VM��e>y��5�4��m�.�y�nK��I�'�pF��,��goZP�<��[
hHCa��
�c��y3Ш:��-պc�t
+IU�u5���XG]�=g� 8gu��(-�(��NY��[Mז-e�����&3Qr�����<I;�����G�Dfޭ	3��Mo���)��+N2�%/�VR�����{�|�B#5��n��7MD����!���Y�b�7��z�K��� ����=D-?�+nQ���uy�k_�\����]imF�=E�q��E� ܅�~������P�ea�s�@�r�V�8M���
��J�ZU��zsf��`ֹl;2��&cr!�)[�}�V�n�L����]�t5���:o��#{W�l
��N1'�-5fsY�*7C<�D]l����v��н�'��_��A6u�啞T�(?��T3UbKg��"���<�DDl1Qo2�'�`�h��mL��450��M;��m�mJV���J}Rʖ���֓����V�bΦ���
+��YjB��x� TdOdA��˼��.�ж��g�W�l�{�����K.u��XC��Y�LU�h�r�5i��X$��
N� �%��_�]�����`��!�/��k/"�V�O�ŏ���D�lq�a_je�=ț�t+5��Jl��{�o�n|��x�Y�7	hn��eN֌�� �g��f걨s0s�1ٖ��W� �q?�Q�S�)bxrI��HzffHzP��t���(�Šㄏ��m)�hZlڳ�ГY̒s��同�s���#�Q�uo+���W֗����Nk��-�JHrU��LM��L�qQ��<_������ץ�z0�H�&�����&�
љ�B!Y#X��$+�b�(H|�)��[���/�G�%�:qn?wȮiA�U�B��>���eb����[�r��eɦ�z��dr���7�gjG�_��F�
+y,�<��qi,�D�z6���
�Ћ
+2�:&� �l���z���
+� ��'/f:��u�x�%c2^\�6
��v�
��6ԬN
n�pk��M5�΂�Cy�V���[</og>X�;��_��z^��VY�)�/<҅K���
r�O�_�ȏ ��	Sڔ��i�E�Ñ�}�E���2��[��B�즘��(u��cY�nЅ�]�c+��k;�3�w�^F��w5�_��^Ч�m�
e�
X���
_�d���UE�(j^��	>��X�o�jsr�����["���z2���Bv�,�Y琩g	���4/�(C��K�
7����9�i�ڃ����"zCJV�*�(hfW��/�Q
G�
��e��)Eu]��ڭ��������Ƙ�܁���M!��>�5�:9�j��׋�Kڦ;K��-�޹ ��n��	��Vy��&�����
J
��� �E��xúN��N��Ð���[N�>�>�vk6�����F�!p��#H��C%�����;�\çBܮl�ipZ��}5ʴ����SD����]����v�3�S�
�2�M���\N�G�6���k4��p�~�H���B��Bm��7 at A�ؠ [...]
+
s�� &��J��UԂ�-�J
P/��� %m6���8�rp'A��,>H���m���eTR骫��|I��b%�"�r
��!�se�{�#�z�g��4���i�
hҸ Z��@7
�}#� �#�[O�gʀ~�<@��0hpLZ�&xk�~E>����=Т }�� �
\,�-ت��C�+�Bm��=IX�\��T�{�|~����ziXz ���� ��)�y��gS��(`B��J�<��K��eX	�j���.��%�������g� ���
80
��ޫ��&�� �X&�
0��ހʼnߚ(����Hr�V�&���1)��&� e�E�v�W�:��H�1K��������
+d��N�-W<T��
[��!���=�C8 �;\o�b��4� �f@(�	 T:�nek��
tIF˼7^��� d
��'�θ�m_Q-#��%$ʺTxޥ?
٬�?*�j˟����o�C���QL�b�4���n�
���H���/i���t����@Ə
 �; ɮxMv�JX�
+�K���'�&g������cn�����	�Jyr�����J�nԧ)������G��H����3���J�L�W@�_܀ʏ��}U<������Uf�@Ur�_%�~���{���f��'�??J����d�\���q�v	VݟǑ(>��9�z�9������>-���8��
�6�m�6f� ��Q�g�ǵ���0�?2m
���9���i�O��'���֖����o� [x@����\SX���E�
+�䜣�(&ń9�x���޳Ϝg�����
+�[ϪUe���E��(E����
+��>�f�[g2�vO{m���~#N�|;�9v�F� m�h���?)�+�~��ϥo�Uh�>�l��o��e�}��z�>����f��+R���z8����
��#;����i����ݻ��v�>��1[�
���kl�	W��/�
^2���+��>kq~�6֯0�;������-��#6��R>t�3���'&}�W�}���tM63����T��h��.ɨo�L/�E��w�w?ͥ��>�85}$25n5���2��R�f��xY̿�
�%�ز����+���n���~t��s;Wυ�!L/;cm�7�3�XU_�Բ�N�d��L�
�?}7��4�
�>r�����pT
{�Qc�)L:#r1�����ٗ�
O�0�XI��k�
]܈��{�����g]�ƅ��_�3�y:1��|g���^/si�
�Ʊӛ�a+��~/���^jq
���cȬB0�a�2A�/��d	C�����PYj��`cwc��u�	�
+ݜ��Ek�������p�<
��!4�s�-������Y�ÿ6
�Ek��Š?՚Ĝ���Ї����I9z4G�޻3����v�u�j
�6D��c�C���;<���������
� Z���Z�PҚ�n�mJ�U���A�=17�a@��ro���NP�
�Lf
��v�&o0
y��
+3�jq�k$z4�hϸ�x
"lgY�����9��Ǽ�90�V�Ia��QM�ƍHS�

��[�c݄:�Z\
�jr���
+��.�Ū�z�R�N�^�K�
+�o��F_�z����åb4��Τ3���ᛑ
�t8��pgU.�ڛy
bZ���kʙU2�oh�Y���Ӫ��l��Uغ?�9
?_v���
'U<
���?T����
�T�c�.Qn�C�,�R�[.���ں�`�vS��M��G���ԕ��/�

/O
r=�s�zd
�Z������L5�{xm����Br�?��Z.�`>J�*��Jmܴ�#�-{�YR�^�B��Ie?P�ng'�
̮ܗ�
]��x��v�ˬG�/L5�.���YT�+�,�H{=@
vR��`�_�bu���ʃ����7/)�p�N����w5��?�W�T׶���4��
+�T�2
`��r��Ta�����r�b�T
��Z��vaz��BqҞ8��h�O�jo.c��
+i�
���[�R��'�13��#o\gS��E��q����j&Q�
{�y������������|=�V��.Je}p���V��7�
����8gU�sZ��9
ʶ�\׭C�ұqnh��87�C�`ܸ���9L:E�go
�ݑ6��f�UC��-S7�/~�����X\G�{s�E��|yS�_�2�jKϳ~pG�Ū8��I1+��B�d�
���Q�c�:�K�jri�<�I�l�jѸ͌��m�Z?�����o�c]�ѭ6��w
��r�䂊jN����3?PJ<���U�����ꖶT���~�\�)�
&�u���
�ɕ^���r�:�/�b{�T��ޮ
K밻��
��X2F��b��
Y}�IJ�/���j#eͺc5
�
u�V�jn9])�
+tU�Uu��dR+�@R�u%�_�
*�q~r�cc���̒��ޞ�P��OS�(��Z9�Y�s\e��y�(��ǽ�kbs�EDc����������gݠo�]L��f�2�N'�k��"t\P�}E��wK�d��L����
����I�2"�=�B筷i$\i��	bG�:QR at U�����͸A��O��LY���"�+%�0���x�43�og�&������^-n��R~�1dY��(Y&7�)�}�$5�Y�O�}W

d"\cu'����?��G��ɽoh�
��#gj��Lִ�������1y}������nWN��.��T����
+��69�
��L7��P���HEַ���٭��S�B- ��͜�J#R<=��̳�(�؂pC�� W��J�1���
��3���dy�u��䷰�r���	�̡��fE�/��1
+��s X�>���w#tq�"2�!�^M�*mu���
(^�ٓ��=���R<���؆?ɓ��%2B7���|n���=���x�x0˔��+49+���I%^��}���> �Ыq�FYqE�E�ǃAW�IWrg�^)7c��]rGn���
wF��hTaeC���\��Kn�l͜*xg2����"�nSk&(Lm������#�S��"Jp����T��B0*�9
|4���2hћѕ��D�
�j��H
Y�B6��9ټ�$�܌
����׿���&�_Q˧�=�d�©����-�/z���(�;����V$ܡ\��ǐO�����蒝�܁-�*67d�rz�g�͝��5T���n�ı�Quc
PL&;&[gO�s��x�߷�ޫw&?�k�0�W*���_Jд4B���|�_5G�֨��E��Q[�n)C�v�ZN�o��&;����ץ�A�V�Y��}C{��Y�iR��~ j��_T}n�Sj��	�r$�9��UF�D�i��ގ�(
���q^�0���t�+�1ΏP{g��F5,-	Ȝ�UZ
w7o�J��y�Q
+k}�[⶞ҭG��������:��`l�e��P{��
H�3"��
!�
�ح�xT��ƒ@YĆ���e�]2�@��A���,?[=o�<Y�!c"8��C��Ud9�%J
Y���%:NkĽ_�����]���Q���;���g���%�
��v��~̴��l��$�b�1
b��~�NLd�2��N��|)�����
��XF*�Q�m��z���F���:d��+�堮�]�
�KA���-Cʲ�����+�
v�q���E�P�����q�*VQ/R�nl�w{>c�Ԑ�J���%E�A��B�
�nn���\=��~�
=�٣=�d[ ���E�K�c���a�U�{X�A=�B�k e^CQ��U-�?�[f@�����H	�_4��c��{��Ӧ�Y��ʡ���R
+y����in9�ן��BjL��
�z����m!dԳ|eބ��E�y���<�n
��=3W������XĴ����G�Vʅ�)X��;����p�eW �	(�b	,���B���R^��t�}�(�� L]>��$���J	;����;Ƹ�W���"�����
+(hA�nd��6J͕ZT�� �qa�`��6{OP�
��43���}q��Lpa��W >
� o/?�xG�^�/*]-+�]��rF�'�
!F�����P�U(���c1E�
3�
ҳ>|+i]H��az��Zi� �hL>3��X⭝�o@�3hWHp* -����	�)@�M���ă��P�qDkɗ�~Q�&�s$���?$#��f�I���6Wl^�ԩ�9 �\*��z�;���}.�Pj��� r2��F	�9� o
(":J�> e
��	��HL��@rFG�o���
�z�,�"�T��T�r��8��2��+��/�r�ٱ/;��+gE��w�a�>�@���
-
J�\������^g����ɳaҨschv���Y�}����tگ�}X€~�1��l
0����7 S�M �6��)	`�w0�%yO��O0Tz�Qz��񋢏�{���<�R�:
�پf�� �.1�p;����[�P;^���
���~��k��o� [...]
+$?����
�c$��5��y
p�,�
���/�[��h��
~s�r�P2��~ �}PD�+!���
b�2���_�?��(�
|g9ꏌ
+,ग़���|̖
�@�1��;��-;����B�L��. ���'��W���A2ĵ��H	�L d�B����O
���؆g6���ͫk�!���Ϭ�?���r��p�*���
+����#[@"c u�
�S/ d�� Yp�@���U,y/�L w���T
+�
�㵖�W�m��\��ΐ�-�i��J
���^9Y�E�����+�ۚ�j��m�
n�J����J����
M�Zn��
��C��HjǮ5�V@ݢ�{w� 4��-�d�5�垃�3��c�}�g�w��J�7%v~y<L4���&�	n��a���X۰�P�ap���X�F��w]��]z�1��Z<5rW��(����At����_@�W� �m��z���2�w��W�ZD���~�o2=������~f�.�?�
�.�kq� �H��]��tވ�\}���^��'f�֏��F�^e����{����ݐu�_S�߄��kuj<C��
����|�_|u����u�0��,]��+�yE�p�����^~/�Aj�>\��a�pg罺��wCb���L?���Qn�\���jY�6���}q�Ȏ�ũt���
+�!���
���Zi��p�~�5�~�����׺j/*�5S�S���cG~�&��(������Ԣ�.?��
�ޒ����_���{�g�ћ���p:���i:L���2����7�����#r-U�
+��@C氀��:��h���(�`������4p)OF�d��j�d'���]ί��8{Tn����Lb����/�)��6N���4l�=�u����E��t�V�����r��P������:p�g��h�w�������>��᾽ixۿz�ی���[���,Z�u�<S�dqwbw��2J��
6��?�p��pE|�����K��{�I��.<ngBn�Bd6�;^~´7���QGI`����l�N�x���ja�)�z�_�j�����{�-ܰ�fk�k�G��gR&�7��_�G:R�
��{u�
[V�&����ƍ��
:����0
��6k���J�]Sz\.�H�<Z
+�ԇ6���3��%�ݬ��{՟U�������͓�R�:��&���YX�����=p���J�-r��2Y�{ƭ��4�lo�'���:՟x�<�ƣ���;kՇfޭ�'wG����`۾��=�h��G��*vhl+>]�}g��2��O}G*��T��|����X�8�������<ꞗ�I���+��!DuV�Y:hj�KK��uS����w����ǥk
�U���깪Gt�ʦ>�*�i y�`mx��%v/�2�����
+Jr��Ƕ���]�n�ɭ�]4M+�ۑZp������ߘSJ�T'?.+��
�a:����g��z��-	�_�� ��\I_�%�2����"9.8^]z�\�X>�WY؜�R�z`�s��n�`$l$�8�b�Y�
+���Yȥ�]g�IM
��v���~ل~ǬZ�(�l}�mM.�ȸ'�&;��WT����ܺ���29���ꥶ�Z����Q��~�òh�S�E��n��O�E���r
sl��c:�%{mmt���
k׀+}&[�m�M��Y���bHy#��*c^{=��6�g�Q��4������͟�������hR%5̱�����|��}T�b,
{E�!Eh��
��9q0���� �X�[����6O�L>�3�U`E#̸��(�E=�
}��:��P �1�����ۧUx�2��/
+
+�k��e4�ʞ��~��S��l��7g��Zz��
p_�׶W��L[�K��̮���Z6�Xu~ ����f ?��u��
��o��ZI���� ;!����k��լ#{�<��|)
�+
��xX}K��DJԠh���M‚Dv�MƖ";��b:pb�b�{���[j��E����P��6��
__��s<��j6)ݰnӸɅ�!7+=]��ڈ
��L��$=�T
�)�����T����/�m��D��J�j�.Ѥ���p)r:�����ٴ�w��.��/�W�&�����ёh�B��/6��T�c;��JRNN5+-,n�
�;���j����j�G��\z����\A��N^C��L�oiǼ�R��=�9��K��p)
|A<�|Ot�?���7n�	y� K�
�ŀ
;�;.X�(
+��P<����.��]�_�TArG�ᰅq?iC���;��F�j�>�(��1���jfדv�W,�Uq#
��Ilyͧ���ЩMAR^4��&��T��`{�pi��v�YX9���dј�L)wz��1
£I��>0��Ax��n�~u6�J�'�
v<�W�:���@��ZGY�5���+R�V���W'��x(t6� u�=�{�.��0 �.W�1
7�z8g\�<�/��_��̌R�qӫ��	G;�!j�"E��u�|�n�_S��_Tk*���^�)f�y����O���Z�������Lz=_<)�'\�X��|�kY#�����3���K_v'6�
��06��Q�-�i&�dzyyh\&j��/�)J��~ �[i�un<,UB�'"Չ
�8�{��Tw)��9ûN���u�w���;z����
1P� ��k��ę�w�b���fml��auθ�֞^��
흧/����&	��yp��d/U�ܡ{��h��[��j3�3�=�_(���`�3�,.Om��>�Hu�p���2�p��4õ���;U��/5VP[�[�ϙ�Y�u�~�)�O��Q��߳
�
^c�&�K�cd�n�HN
?�%���<�
���*���K؋Y�1�Mϱ�8�Vđ(�����ޢ�FQ�	�2
�&q��b-�dn��C
KO�OJ;u�hӤ���v_l��6b�gs`X�WwǥjK�%�7�N\
+r at tr^������'��ث�<��"C��
,��K���
+m��|�^��"/?R�Xn�K
+�.s�f�C��GJ��/Zϖר�^v��n�:O��n���+|KM��e�� 
+�1h%�:"��%>8��������
,M������v_����n�Tt�Ǜw
��<R>$�k�z�z9Urdh����eU2��6�[
+�O��e�Dz��"�53ό�uGo�P�(9�{�=��(��w5��Ҁ��6�(�uj7
*�5�uq�?rP��|
*�W)��hwr~�?�Q�j�ݟ�6�h��(�Z�4|�V8
��,��tC�=(\wv��3pr�X(�h1�2���<��C2k�P�:xmM��r�>
zF�
�r���d���~v&�D}�\a�k�CW��:��
+�e�%4
�
�*OX�C�U����x��@
�nM&�. ��
2�S���V.�
#6);�f�R�fj2��R9��L���
c��������x�h��;��I`ՖG�\$��V'�du���^���33��
1`ʇr�<�6
<��Ut�
�ȪQ*f��
����e^�
7�~�
�ig
���k���u��T�
�4�%h* ��~��������n ��%/� O�� :̐�ڟ~�9H�_�� ����`���aκ4�c5ğް�Nl
��F^�E�.,1P1���4ܟV �7>���; {�F	�d�������r�M
+�H�H6 ��� G��S;`�Q`�L`�X�t&Q��E���H��9�����s��M
�#�;S���@�a�:�F�u�נH�+�D��{X� �
T
� �B
@�� ��
�yS~$�ga���l'8n �
�?(��fl�Z��� �ԋE|����
�z�5�����GM��^wE�ǻ	f��!�ca7+�x�� =6�`������X/�f=�k� I�ƀT�
�uy
�^p������؂�v��c����'+��Y(�� �V��iNӎ���d��r=/�<��b�y&����g�%RC�IVt�cH���4��D�W����<���1����V�P���(y4� @�f�[�ǣHz��\+�j�� �� 
"
@wS;@�S�Nhw���\ٝ"��{_�:k�f5����������~��5�^���'��9�����W�
��la�,�c [�i�
�=������
�	�����6�4`���۲g��r��n��~��F�V��b�
�D����}���ʑ~� (uKq��!���G@���
��
�A����ʸ�L����Wx��}
�2pzM�o�I����2	�]B� !�C@@0y}	�KrF𗭢������M,vr2���er�a�N�ø
d7.�����͕���������q��]��	E, ���'K�~ R���� m� H�z�ޣN9�m9
��\U �jM�c�����
+-J���^����]�`.���t�G�O�.���?��j������ݯ����~�>�����~�[%���漀
+�$P��Ti< �Ӿ���ڋ?i�j4H�hV9��j�_���������P�.��MF�fĶ����D��g
2��.�Ar�\��}���{��7{�]gt��"���pp�(
u&��ڛ��7���
��jEǏ
�W��'0��W
�*���]�qt�3b
��׎�tɺ��u�}-���e�ڹ
ֶ�s�nS��js'fX��A�l
�I�=H�����Eg��_��K���/Ħ�j>�߯uu���ү
�q��J�ڬ�\�.��
�<�Z�F�k��^������A���Kfe�ۘ�͌?������S��ro�_����,���K�3���:}�Eo��>�e���.��p_C�?���GD����wc��/Kr{91=�z3�c�.]ӻt�����]mԐ[2G�_ˬ:{��9}73�Ը wK�2����"v�K+�c��x�#�r���Ӑ��A@��5��~(J���;^�
+m����5����W�?z2u��
lcB��@��ի�j���.���db_/���
��x}���kȬ��_��>D��W#���F�_����:�G%�� D��a������wۧ�b�<������~
�k+P&��uP���kȞRL�VէX����#G�d�
������DW��ޝv�KGͤWv�Qm�Ps�Y���l��>^;�Z�0�ڳuj��-�:F���B7�$7"C,��q�Y:ϸn��{-���L���v���|�}߸�999�ii�8Y��W�
6��|�iе_Q&Db/�ޔ4�M�=6h���:5"�ym�nS�G�F�F��{��f&��ӓxXsr�䳕�f��i�#[�^�h!Sٴ<���{��wI�k(�Ǽǩr`����L��Պ<(��=���P3]x@^����@��n�!�=4�g�\��W-���g;�w����܅*��+���
�}��<�N�ʧ����
�B����h�F����)���M"_*�w��7Nق���a7�������B�;�AZ"d
�ѧ������bqX�p>�lj��۷���\�K9����t��PIN�������!S|�b�h�c��^��B\y�
�
i8.��
��Y؞x���C�Z�h-ZT�P3��{4��<��� [...]
Sz�!�LKZ�r�i��$���
�E�s�f�����O���\��Ke��-J��w
XKƖEk��!��3�~��]$����?�+�|nm��Uk��኿�f(fL�)���Bb�����HՕ�Z�I54�����~�B�V���)��Q�f{//,1�@G�!.ow�o�o��o�>�粜̊�=����l��W�b��T�&”g����JA
�bCC�+�H�7*;]�������e����F�R�3!(�v�T�_���s(cym!U+Û�{P�X�N����Ȕ�p�K6y���HJ@���:�KN��<����5��+�Z�V҇��0�q
�bX�=����5��ZZ؍U{�Z�p�+�%qQ��z�K�
+�ؤ�I��:'K�⮊{�sE��
�@9L�m^��\!�
y���\ԴS��Ё�Ǽ}1���JpV�*-?ܦ�
+P����M�C=7�P��`W����T���񡫱G�Tx��
+��y9(�e
�O��f����x���Ml,��ȖUD66)~O��������������Ț��f\����(M�����f��/���[]��Tk�6(����!���l����DM��:%5���n���
b[�rO�:��xp���&C�H87� \�
w�|�^�x�B\���Ω<;�T
֒�>3��&����|�A4J�dju����i��|:�gzٷ�6S9���*\�|���֦G��P�yG��PM���%��,i�oh�a��y�QkT�;�^�l"�E�'\��8=2�\J��Yk�X���3������F���2�w]�
+���ν�Iz]��߈Hz�z��d�&k��/�u�*֧�,���P����G_=Y�Mw�\�ՒD�g�$r
S���M��p�*q��Vg�Š��H<b��l��ǖ�ݱ
��I/���Yj��)��r��]�a:
��N-	^l��N������x
�
�wZ~
+�
�4~Y4R
���ke2&J����T����O��R��`�ԗq��:����W9C�K�xr����Pd�A�� �剖��4V�bj�
�T��?Rd�~���!���A.	~�.�!nأ��c�{��� C��C�tF߾����L� ��ۖO�>�5}�@v}n���)�T���ѓ����{�bǷ���r5�^����C�T�D��m��7�
�aPC�
3"p�
!P��
 �y�`�����hr`��������4oS�|�n��lY�����w�,�E�̃���7��X�7��&Wz��*X�!���}A��\.)�L9�����ӺHQ!���D�V
+�P-U��o�r4�bO�0��)����p�@�{��
��ƍ�R�������8�*
.9|�`�m*����r�}���/1~�<�xF
+�I��2	�~�o*�@}^��.�X�I�FS!�(����
+tQ�~�ea��*��6ZE-�j�@(����t4�����3��VR�ս��*���������a�7g�<̕�%8�)[��/�p
+�Y��u�5V� =G��o0�er[�V�����;����[���D��J�
������[GG�������[�~����9b����5�֕�!K�O�e�r0���?t�܊P��� )��3��,�Q�rR8�E��uސ�u�S�$�μ������-�=��v�ڕ��B>*���i�lIÕ1�
}t��|�&�9�@�,�:|�yn=����u誏C(L
G��+Hڴo��Zd2ꑠ��V�J�g3��"�7�	{9W�q�Ϻթ8�}��|�U�W�P�r��
�j��/�þ?��]��
�Ơ�_"����{�����QNF_-1W}�
|?x(���Lt~���.������f�7���KM�`��Z�-pg�;ȻE$�]�R���9y~'x� /�q�s�9
+_|#O�#���c�~V*
g!^������u��5�5��h%B�W��E#�,wj��"
l�<$�OB��Z�P�t���A����HvT�	�[�J�3���|V2B�g
�J� (��@���X%�t���($'��$?���ߠ��>��7)njDҽ<
endstream
endobj
126 0 obj
<</Length 65536>>stream
+�D��|�E�
5Y�p�\V�sLqH9=��E��U��c3��X>]�6 �
��)�t��` fpD��0�m�b6 �a`��Mm��1�!�G�C����m
�ŴZ
�v׼��G
6��dP�7��+_ɗ�~)G������ymZf�0
`ӥ��#��)
.WN� �/�GO��1������
+�Ixw��� 
��	�G���$�[M��ppk�'_A� �ú�ڔ�`FF�T�7�1g׬�1��
{��a�K�l-{
�<X��^��^���l%[� R� ��'���L��*D�X�b@
�
@"����
H
�D
+ u�
+Hn�q�|�H�" ����
 �S+�o��5�}P��y����7y�&����b�4c�_�f�쩏Pt�73�e�*�TҚZ$]>[�u�?���6�y?!� e[@U�'@��'�.~�X�KPw ���	&+ at C�
�
���4 �QMj9�jdN������J��g}?�����Vh^�N��p9�)o�.jٿz2����4���i��c�+��O��z��I}<�]
̶J6s� K�*�%��a��	���6'� �E��J
0�( ̵s�F8h�z�����~�W�&�7,G���Vq���4�J�0n��Өo{��p��?��_�����5�~s
�*�<��n��O������J�O�X>�
+n�	~'�
x�^�e O*��
+��hEs���a��FXt�u��ӥ���GO�6�$�\��,���长�ۯ\�����	�!�% 2H���$���O(�K�����H�&
$-��R�
ɣ0 U`W
�]�b�JO"Av��k��_ɸ��Փ5�o��i�_�3w����������m�o�y	��(�v(=YL*
��'�j€��@e�-P9$y�տ�կ-����_��wQ�o2B��]-
&(��m!�@G�$���X[u
+���{��Tn�6��+�.X�-���F�=���{�j�p-��
��C��N�N����L�s�����˿�ߌ�]�����4���hn-���K��������:�Y��
f�1H�򇫳$RR�#����������$8X{��W>�x.���8U�o��7f`�,��
�_�����,d���-�a+��O�R>�֙
������n�W��}T�
�zk,z
V�h7Z6��t ����wsi{������M��#;���g���H�k����2Ɩ��"����կk�������ߙ���}y���vg���fƼO��߾�e
ҋ ;�ͥu��j�4��
#Ü<�2�6� kD.�Ⱁ
9'�h����\iERs�{G�W�LqD/
����}��M��
��u��}��������~���a>��ZW��N��w9.>fձf���:�G��=
�l��x=Z��׿j<ä~��z��:�Q2��GH��&D�����z�m�ċ��a6�

[���5�Q�k����_�����د��A�k]=���2�m��%�C��R�ЃSi��
���ՍUCg���n�^�,
�j{Sn5��_m̡�k\uؼv�qSz��GT_74�:ԇV�ZOOcPK~t����H�w��U]&��zla^�.5��u�?��N�kR�����8�W���+tS�S�\y�֩._�׀}6���@�H)�
��f�f�)֜lE�g���h�X]V��G�k�M�۬����۫�����)�e��Rh�ђ
ge7r����KW��d�h?���
W�S�^���ӷ�TAR+|�ڠA�e3䭸>�փ<��>��Ϊ
^_W6�ީB
�o�ڧ˧p�-�	+]�'�$�NI]�>�ɍ
X/��]
�x��^���C�{x��;.�
�R�mO��'O�6��\l�
�f� �H^FԲ�T���\q]g�O�ڐ����Rj\].�Aŧ̪��z��R�eC7�2W��YqX�7��R;bϽ��rf�f�A����lu1��猵	W���O���%�a���8�ql�d�aV=F��Ja��d�����"�V���
�;w"hF�{
�j�
+m�Q�
�\
���
m��K�ࠗ�3�^��A����8(�6���"������Д�q)#�
+OC�Z�:
�uY��c)�F�EuXo�T�S5}��J����0u%KC%�Ԓ^�d
������#3\$5Ec�:�ʮ����T�)L�I�A[P���Ǧ��ٺ�e
ۢ,�1Y.���BP
�n�>��Io����Jӎ���t��U
�$P3V&�*�d�=Q��^��-�RM$a��v���ZeYii�i�~�à#f�6�-�Z�
��έaMH��]
�يz�ѱU��f�~�g�~{�M�^4��W����R��S&Wl�bc���F^d;'-

��g$"Lc�N�x���-��^�;2��P�3wo�(�
��Y�&�����ޅ�����h����d�>�߻�26r�۳e2T�#Ѱ4c�T����U��Ъ�de�Q�G�
k�
;i��R���ɘf3w��\d��F8ΰ��j������8$��h��+�`��i��1��1��ܼ���~��C���ČOƹ[|�B�$�)/��m1+��Vc1i�O�X�2b*�8T�e)����1q�J��J����VN"U�
�⯪��C���r�����w�z{�١�O������J
�}����4r�o(O�f(�a��
f��
)OI����֎���[P�G���҆S���H
��=6���7MY��3'6�Rd�)fM䯓���t��
Ǖ�iơ΁
��-;d͚9c⣻a�Vx���d��N�yj��x
+/G�߰�DR���h���� �`��$A|$�ّ8p�S�-���	�%09����
�*4�I�U�+��
\��9'�N�r7�q�
e9`R2�57��f�B�q��*��w����%�9��|IU(�@��Ɠ��,q?��8~�oZ��Is��/��B�$La�C����m���juq��R/�Y�,+�95�z���Jih�R������n�d�~� �Qi�2����:�U�uk_A_D�sT
�ń9gQL���!=מ��s�?c��6�Z`Q��Q�Tq�z["MC���)e��s��j��ƪ?�Ew��A�
�:rJ����Te��B`�f�YNj1�J툚19����q|>9��S�L���s+-�|�SQa׶��G�h
j�_�ې����_���YF�7N"r=Z��2#T�m�?9=�o��4/./�-���r�[쭫�ٞӘ�)t�g��(���*GCϝE�l�Na`���b�z�5,�x�A�lj\6� UB�<��������"N�F�ibE��s3�{rL�9”�Mm�	59C�M�$�������blo�1�T��e"vVb�S���.=��c:3I�i8�=S���E�H�$�a� �ګJ0����a��ݹ�󽷏���~`v'����*E�u�
��s��Ig�]�d�}Co���:jiF)�Xea�9.�x���w���!�X��DO�H��o����S�r�B��q�\��>��o��o�@T��'~8,q���T,��K�בǘ�W�Ӭ�h���0Y����O�g�Nu
diC
7G�Fk;7���ݕ��L ���B?����!Ǔ�&��
�
�Ig�
�ʷ�<��&r<	��Ď�D%�����c����`��s�
�‰+&��z-�d�˔�ȣ� }�
~PĈ��+7�>��G��Z�T�ƒ(�C�-rV��F�mQ��lF"7��P��2ש�x�E�
���I
+�8QMi
we���������T,�,�8a�a��vW����
+yR�3��K ~�MN{�

)����,�#B�OB��r\��H?������oFDz��&�9~��O4)�8�d�J�a�����,��,�R�kH՞�㢇�Kqh
+e%乔5dP���{���qů��Ёf�h��B9I݂e�v���YN"��<6�8/@\>@�� vt��;_�Q���]��"�L�e��7�^"YA�
#A�?(��r"U�#���*.F�ޮ�
�8g6g����QK�egr�b�7bY
 9aր܎��I$ ���F
�sc��]�L� ��# ��#��NÙW�|����Я]�WG�Ր
����庭�y9zn4j��$��^qX��
�S2�

��������P���UTC� ��c9� 5�DZ����Q,mP#1
ˣ
��< T�� �:��v��g�Dr�N�
W
+��
Y�����}�s�/�n�w�q��t� J
+��"�;b�7�@<@�;�,� Z�
@g�4�+��;Q
�S��x��݁��5>���|,�
�� ��
+�!#�ŵ]v�_)_Y at g�Lv �k��A�Km��C��<A"�evp^�ilH��âm`WUҿ<�4x�*`#�"�CY
�W#�&`���
3���j�=ǀ��_[���7��2����X>�\O/��6)�
v_��,0�I*�
��s��S������=k7���Q��~�8VQ�{i�]��0>q5Ŏ�S`��2��I�4�T��v�˓��&�`�85=\��\	 7��c��7�ۀ���X6k��cp���bg�4,����%{�ǀ�/��f��F��o�׆p�A�v�8ɭ2�kr.2a.E��s����
+�1��[o�H�oV��/����?f�?i[ �^ '���s�X�oR���@� 4g 4�,�J��
d���<F��[hѡ���NPҧ3s��׍�w�-$V�`�F���o!_��P��V�9����-5��q��\�
+�W�$�C �����e���z at ZQ+ 
W/ �:���
�*���u�Kz��&Io0E���
<�f�xb'�mM
I���#��;�7O�V�pb �����`i����P���O|¯��&�
i��x5TB=�}�_
gPv�PzS
(����r��B�凐+t��^�׍�K��G��)6K{А�y�߆�-*�'9�	;N,��$&�$��/�M�OKvM����*Э� ���Wڰ	�>�5���&�;p �.)�F��^�#�7\[ŧ
'�
�`��4Dt��7�T����?�;��II_�/C�-���7$���7����˴�m�M�)5��$�'0�

L���[��U� ��� s�π������r���%6��h�d#$�U2K�˥��d������,����Gd�bd-��sB�'\�sf]�f�w�;�Z7o�۵�E�y�A������dg���d�c�u�ZWgr$$8��c]����߽�R�XƭȚ�FO�]��+���m���Z{dNa�^.aF���y&:��,�4��&<N�`O+
W��b���n���٨���]��ALPrBk�������"��� ��+��[��`W�'�a�*i�Ю����9'�~*
�������Z�_ۄE��Q�p{�3��j(܇�O+�-3wx�Ƚ��܅��l�� [...]
+:v[�z���{Zn������$[o7�E�o�ʰ�*�gu�nj���Tc��ZW)��y�"�VN9
gz�N։��X�r�j�P�����Ϳ���f~z�������չ#
�/��es�涍y=4��W�
�]��Զ�Y=4�l��b%�4�����N��w;W��ǥ�/?�;�ﻮM��⤬���,�]�.%+��Ƚ���P~�����Ĥ
_�?���g�j=+
�4��ԭU�I����Z{v��F��t�%x[7��Ϯ��o�Iq
��*�+G��g�T;>�J@Γ!k�*��u�l٩��N6G���ͅ�pq�3Თ�A3
���tJ#$�
�W�=
�$�	v���P�q�0��厾(�R�)~��J^��B�~V�ڳ�w��۶�a���s����_�j�9d�a:�zv閕A��8m(��3"}_^��AA�
�̜msݦ�	����+��pʂ�|Ղ�)�~�+Ym�J��O�k��
K3�]�Q����
.�woM+Wi���Yi�X�Yό��p�-d:�{5�!���
p7m��
���m3���
2{kR��
�v7�	�Aͼr���OʆkԜ�vt�R���L���kU?,?#��a�>%22�o���^�kв4��N�p�����d�J���f]N?��w���v�ZK�M�5kR�YV�{�,8 at Jf^Fj&ve[�jj�
�q'���[�*��!�J�U�Oq�
N�Ѽ�P�d�)��]s�j5�<�
��*�i*}b�R��}�<��>
�6io,�a�ҩM�9�?m�i�q&�X3jwis�k������*k��Զ�IU�~>�>�+R�c������[j��*�BSXw�v��P���G�OJ1��.��aY�$k(M�K �z���Ԣ!���:��Vr|۫�Q4v�RD0�89�E�ͬ����}0�勒��nĥ��LՈ'��n�T�ˢ��X@�v!P]k]􌦴
E�{/TT�oy�3��+�:��md#�U�,C~>�A%�5"�e�����.�|�
�&s�k,L�5=��k)���=j%�{v�i�;H�@��n��r���H�b��
èP/Y������~�A�ZVo�6���6�<gcY��YJ~�g܂�2tC�Ҭ'��\�0���L,�ӝ�ٝ�B��#�>�<o�
�9˷�
7l{=AY����/l{;��!�^pR�l
!�J��/b�d�
�N=����P1R���N�cT?�!��UD���I1���HR��/妖"aզ%O��*�ͱ+l�KC� ��
z�׹†
��3�I7��]�e�g?��6��Ѵ��;�m�\�����9?g^ IR��@e��_\���[�I
-�]����h�ր����+���[��W���ǝ*��(�$��j��N���Z����'nC��E��V1O�l�~P�%�(���&
�c���9�Dor�rCc*;6��䒞7qr�)
�m����H~W��q��>:%Q��'ZFzE\�=��8�DŽ�"�G���B�Crgu�r-8P�k>4�.�ɰ�Er�G;�`�{�G��=*�l��0=�\4��_�U���A=���AE����%�9%�7�����^��$�Þv/U��?d�xZ�+�GZ�
eIKxd�®s��c����c��)�
�n�ƙ�٠���"0f���7���0�h�t��QӳԦ�VyL.�ٖ$r�+��3A�6^=��$�'X�Rb��<�5��
+���
�o����łZ\g��k�Z�f�Tc=��1M/^u9A*��H�
�s�k�S/V��L?���w	G��
!h�'�����)r�v�d�Z��M5he
�tT\�5{|�N���b�\S�$�.���h���vCU�b�*��m}0���i^��_�mH���O��F�U�۝.;N7|��.�qӇX���ŭ�g�b�տS:d��@IRڑD�s��AT��
+^[f�8_�԰@
+}�y���m���� Puh��ݾ�Ԭ0���
޸
+>pI5۳x^�;��e��r'��L�_ݮ���*��;��5�H�a�i���8��}��
�M��!"Wh�N�?������yf��e!b2�H��h���h�b�Q���1�G�M� Ga-�m-d�� ���ϭ�za����a����Tr��-]���]��tR͆TR�Q6#�
+
-�a6��(�T��.�g"�ә��M��IDT��4��

��XD�GF'�>찈1o)�+���~�àMա���C��/A�u>v�x^�O
�S����)���x#5O$�f�Ddefn1���/dI��Z�����n"�����>���w*� �؞�/�
�����r���o�CaH at q�o$X�P
)B����eQ�Aub�, aba,V��-� !?@�@���̶������tNg
�Ԩ�P[�3X��
�t���$N}�
c�+����(��� B�)l���
�
����-��Y,׸L�XJ���B�, a�K����׀d�w@"
+��2~k
 񲯀x�5@��I|
��)�N6N�Ӕ׹���,*���+�R����2/�gi�_Q$u�0\��0�L0�� <
���� [

�82Y@�[2 _W
�o�K�K8�'���
+�9 at A\�Kza0���x0��gY��D2#L:���q�k�x�rQEZ����o���e��2<I�|�@o�
G�5�����ݳ�2�/T�Ҁ�O@�gP
$�G6
hdR4�ub)� ��2 ��h|T�۝꓅ u�d�_� 5/`�؋�=��"6�h�¦�8XT�u|�%ŤgRO%�&&�R�cQ_6��q��}">E	4<� ��@W� 莬z[� 
�
���
�j~�;
 ��b�^S��X�)�d�:`
r
�C ����G���#�ݘ�S�p1S��'m���+�k���8��j�.3�tSԏ�2<��"HR��	
�1d�Xu
0�a�-�y�˫����֖
`�8�� 
s>��?�Cv
��|�܍�|I�y/ v�n��:��f҉#���Q���K�g��\N����e�._�j�UFwA�OIy�ݲ���X��	�m��xp�w�xs1|Y�䞀��x��%>���*�CS�_�O�o)�O�}��"�����11<'��qoy5��1�����ZM�9P�|)@�V��L��
+IPr���u��8�_�6��%��u�$��	 �J,�<��FH2{ uŁD� �O�����8������_d��Z���`B/[���T;1)C����O�K�R뤞�>��r�/����&j��Lk@�
��Y/��(�\�#%����J
+��`5 �����
�:��]�
�
nV�9M��zM~C��hWY���(���Jo��~ɱ�g����ۿ��$a�}o�؜�%B��K
+�J#t؞ �G�6����jm��>Jҡwxs��x��7:���a<��0��SY�D	����_n�_nۿ�
I
�v�R��m�M�5�m�uۖ�0^��Dܻ\�%.���^i�,�&_����
�j�d
$�����d
2b��m
�X�a,��o@��P�l�٘�cΤ�VO[�|�o����jxa`w��Y��w�Q���&r�K���<�)T��`�/�� �� �OFl�f�/?'X����2�;ٔ&׃�-���֗�ڞ}lx"wx�AO�j=<�M�q�:��~k*�s���qӡ
k�
+�u�e&z�y:�'�6)n����S�J���59����4Y�~c��#
�������:Y2g�(�̡��z�����؄�Z��vf�:���u�ˉ�N�)����T{�a0���lz(����=~�q�X�{��G��4��+)/�]�������e��]�n[~$84	6��#���/�*���Oc?Zf.�e8����&�
r��$p��qX-�F��
F��@�C� ��F2oC��aM�W���k��U�m�[�?�N��]:ҝ��a?��
��W�w3�Aw�J���j���o���N�A���MF�LZץ>�t���$E����R�����1�e�[g��NP_�����m��ٵ��>�������iNr$фW����N}UC[u2�o��տ1��`$T*^/���ٽ��lu �;o	�*�qX�I��ګ`à�q©ݑ�k+�B�V�!/�;�74[|s���Mx�H5�x������R�V�K���+ժu�ժݮ_���I�c�6���%�)�_���6e�����)N�5)���+�g�Z�5��"wӴQ*P�ն�Kw��
O���Hvj�
+9�
�I�.��*Q���]
Њt/?��+�.��,\2�
+�s.�ژ''n].f)?U�W��B��o�U3j��+?�m��m�y>#�n9G�87��WG at l�����2�$Rb��$�AHhm�܄q#��JY}�
�0����Y)f	�^���V,�A!όf�U}�Γ��.�m��
s[_�C��t�'����f�4Ag�'f:9�H�W�B�w_m;��
{X
�-t�s���'�=cy|l[FA"�:b�>9
.I�q�U�%�*�Y|l�c�U�Qs�f ;��!���
�A6�Q1+}�Z&�H���H��}a������&�����޶��ٚ�w++
�_`�̫�db�^�p�g������Ej;��T�A�T%�YIJ9��vv�$P��Y"��NJ�K��\)�}�9Jw5+4.�A#<����
�F�=t���ٍTkR]ǟ��rWǂ�s���o�.�1\]�3?Km�&�|��~�

zݡP-Xf�+
�j�K��N��Q;�
�j«�j�|�v�u"?��^��#���+�
���:�-��'Q��tj�X���{��|a���e��:�
��R[���*�;�Fo[�g��.���s��ɸ��A�p]ꫝR�������U1�*[kY�U�(}��@��ۡ��6���[�X�øs=�:�3����e�1��ՠ[>���5��It
���'$��~��?�1�Ct�D�Zp�QMNa�F<�vV��<(+���ZF1����җUy�>۲��FҔҗRv�
+ą~">�yam�T(Aٮ@���31���u�*�}~�,
Z�g�Z'�IaY�ճm���3���$�r)��Ƶ�_��[	���usW���[�V��Xna�$��L\~�+��H��Ӥ�R�%���K(Y+��J�)�i ���@[���NZo��X���f�
�h����gn�/07�Ye���O��r���yF�V3�j*cayCMՖ��KLM���b雧<.�r��
+��6���l�-͐
+,��
+..	���/
+��J�{Z��������ܦ��Lo�^��=�\�'�Sk4�?�4=0[-�=���@�q��P�Y�M[�7�A���CN�����҉�W��
��� �?5(
��pq�0����
�E�p�s�6m�-�w �5�y
�Y���\�T7���˰�޶Ī����F����ܚ�j��T�ʴf&9����Č��X��,��
�$&�
��Vm+�s��'njk���az�5�Ei�V��4o���R|�

+�h����|�r�?8��P6���/��;/���;�I�4��<�H[�a�����D̒�����v!F�|FǷީ�W��;�K�
�E���=|����4$�W��?h�>��꾲�3��U����lME�U8{
ۣ���Å
fމ�"m�vl��ܧڕ����N�=l60ڶ�
��
%j2�p�C�O�j�b��u�����xe9D�#��>
W0!����Z��3�/b����z?~��6�rT7=�nJ�N�X���K���PR>`��
��Q��������O��;��=��= jJ"w*��^RQ`r��(�8bm�U�}���\��-�ب���x?bB�BhK
eT~�J�uHO~P�����Y�ڞ�Py�j���l���kO��k�뺕�oy��Q����]�_ܹ
��km
2}�8��㼣
��!�ʼn$�ݕ(�������]P
��E�Դ�
�-k��EL,�
��dG�R^����F��D��R� ��� �w�ͯ-�̻M�?ﴒd�쵼h[�f͍{K��[���$i�k� [...]
+ݙ�ʻЯ�|���qOjuC���
��Z�T�ޱ&ݏ0q��1� Qh[@y�m�
Ty�rH/}��-���><Ȼk��ޡ
��`V�f �Iu �UB��J�Ax
�҆W���"�8��f�"t%'�J����jR�
`��ν�n/�3�]�|y2G��%q<e��ùWz�I���Yኪ���c��[�0$�^Xxp���)64�
+.���M�S��g��"�C`f��Ո�
��
0��bq;ɖ��t���,�O���2$�x
Ni[o�
+tz�:���N8/�
+K�
�@�3b`�
�)�0��O>� ̛�0����|,]�>�e
�� {`N,�!�N�`g*˶��v�\tj�3�K������W���_�7wi���Z�=�>��������aq¤u�v҅#b�
+!
d�
+��
+����b)�,�Q#�R1��7�e��o �
�'����2xO� ^����H�i�M�ى�Y>��
Z���	��O�ũ�a��f���$��
�3�˗'
�3��Zb̜4u�
��(� g��7@8{5N�����XD]�ŲZ�a=A< Qܔ �NW�H�1@�ї���-�3}02�ά�F�a^�
w�����/�N���9��t��
�w�;&��
�^����C��g at t�
 ����  ��/O��$ �:�RW��� ���b�Y���l>�tr sJ��A� )" ɚ����'�/֪u
���P>�_�V��%
���_�MO|#�����0o�)���
`镮��K��st�
^��h\�+M
+o|
�kP
�T������ Ռ/'՜}�"�@�
P�E�R�?J����P����c���P�/ņ����D�;��ݛŒH���s�ď�b�v� �F�fw�
����-=>q)

����\�>�
�@k��kz2�0�Xj}@_O+@�ҷX����W��
����߆)
Х��3��>V���S-�0T_�'/d�L�fM}�RK��S<��TW��q& �)���W�%�����e�?�VrU����7��:�@r˷���z��;
���`����m�%��E���w������K�<������ww�H
m��7�t�\oe蜵I%�!��EKm%Tm
���?E1dV�_f�_p���&��ׁ˵ �n
o>��dO�_n_�_
���m=�g�-��7x� a����P]�ً���]>$+U&
u���ؘ�dLj�Ɵ&JJJ���Z�O�Ćn&i�_
po�
����$�7��&�4��@\w �D�kZ-$� 1�A|�����
���"~x�x��9U� Y=�^��.��^�("p}����un���B�D���;�O�
�
����_p�Xn�%[7�2ܹ@i>PJ�(�!�� -́
Tq ��5 �owi�M/�'V
Q����5�h!Sk���L�Ó��I���􆤊�
'Q	wM�Wf�7n�o�mBm���+�1�Zq���ۖ&4���
��
�h�Kh��	�X�1yj�$�{8M��A�}��\����7$%��H�붭u�}������$�6IIHv'K��I��&!��������%`\�K`�r0��)n���:���~?1��W6B��n�r��h�:Ų�'��O��<3�'��7��՞½<��V���!���+?�*�4U��{ќQ��&�� [...]
�moh~�3	F�,���}��6�S�e�gm��c5�R�u�)T��rT�>7"��?hbYu�:���DOp����_��8kV��ӕ74����ĺ	ψ}c���=ҏXpݥ�xm[m��C��%����iE�
�s�rǬ�K�q-W�3���gM��/��L���p-��7��]
+f~��󮾢��3�sk%&������{��K`w�b��K����6��my�U<)�;��Z�
^gO^ؑM��;t���g鞊Y�

�J�^���(��-yW�~W�w�\E]�V� ���c����z?.�CF#�P��M}�Owɪ�_��J�Y���(�V��V[�G׵�w���F~U���c�\E��w�1�T�9ts�X-�z�`�
e��l��dgˌ�l����rJ�%��-w
	�>G��&��f��KΜw����^;{�c5
��j����?��$7br��Lhm!Og�
�B6�
L&
���}�����h���{��a	O�6-�IM(YY^�Yp`{_��lwM���Uכ�>٤���)U��G��ם��
��тU��y%��
�j2��5����Wev�$h>���N�Q.�J��A
!��hMڶL at V����y��2�K6V�f�������T�x�)�
Y�aL;� -���˛MM�K=5\�'�F/��� ._�j݁���a|�d[���cv�>���5�m�$�O`Wc;��c�-��M�ҦJ�r5q�D�?�ʝ{�hy��������<g���x୆�KD�y����J�rt"-yؔ
ٖ2%�6�Ҥ��KY
Z��~��q���jz�
+n�_
+
�E����@�P[p�t�~u]�:�|���e�Ǖf9�)cЅ'��y�����\�<R��!|V
5������z��m!zK�
�HY�%��2?�8�eA�YM�^u[X�&��u~;�|��/���zs��e���f�c��zM��z��b�_I�A@��
x�9�Y{�ڲ�q
�'��Є�
u{*���	|����^r�Ã���@BZ�Y\��P�s���潗�#X��5����W!D掹x���
��ƶ�m��o��e��r�hч���Ew�Ip�^MD�^��K���r��ړ"�Yײ�U��|��'����ߧ�]�Uȳ���"1r�B).H(��ݗZ״�@cڙ��B�s���]�Éz	e/h�f[˵�*�G���,�W�
+�z]�
�
j
�7��	�YI&��'�XB�=Q���p4�?(�D\��F�Q~ӨV��'l��|t)s���
z�0Y���z�R}��rԚ;
�
�IN\��pbg�g/���*�݅�A��Hb����@s8�|�Tjl�l*����,K�Ht��Eb����e60�}3��j�r�j�#b�6��/��W4���b����i0����
.O��;��V�t�����kƎ���۞�笪Ug�m��1)�Y��MaG��m1�+5�G�1�0��$��@<�1qwZ�Ws)�x�����ݍGX<�1�
�hs��P)�ܠR���f�w߷��H��k�ա��O-^M�z�4/._�,���u�?qҊڲ�d�d|�1�#S��V�=�A��
���obM�qzO��b at b%�F��Ƈ {mߦ6,^��*v()Y�N�j�
QO0��t>$l�
+�ޣ2|o��y���H#�j_��,���j_4W�JJ�I����g�X�r^�=���a
����fzFM2И�g�!��GA�ʻ�
+\��v�<�
�,&�3Ǡ��-V�z4&�'��o�sN�b
�J�~��
6� 
�~�:�'�M�
ф��V�P�
+��A͊�vm蚖Yy�Ϡ"��"�>��_e��?yl�a���&ceF!04�o��߁�g��9vԗL�w�\Ψ�����B��+�ȵ:�1�Ga�nA#}4�������
�Y6��_& �D�X�\�͒h1�:҂������
+�c1��6d5�8�/��X]R���H<w��7
a�j9������V��F�as�t;�#�k�+�x�"�?��MJ
��db�Y�4n5�J��2�rdJw
+ e�3�"3�h�ȳ�:�{��Am�h��sh�Ȅ�|��B&�ü)�H��뎚���ss��ݦ8{m�0�+��ֲ�@���
��
�nd�P�b��L�\A�}���@ t�K�|g��c�O�2n ]�<@GA	���
+�]T���X}Բ]���
+�Ӯ˫&O['F�>�;oԈձa��s�S�À�qG.ʅQ2�9^�.3���M�6ڛ!=���-���2k
0���*
c�笘:� ,KR���X.��t3��
`��`�-~y�)� &��)��GnĒm�_g���g���T��%#p��
1�hr�G]�D��bG������%֤n
��,�Ho�V���A!�a�A<R�k�d �4� {� ��H,9&��pJ��2m��V ����$��f\��zXp�����l;�w�Oz�2f���I
�|�7Uz1�`~�f(�D{��k����%z���i���˸?����%����f� �������򉥆Dz�<9��XZ.��H/�N|�E�)�t�o�
�O�!��l�Y�$�,��澞����("

X^<(�c�7��Y��3��O�_���G՛����mM��:>�� ��
��cy �� �џ���>���P@� &S�e��
��P��G
� �e��w�>1�G�h�@T�[@dO�T������8N�B�k�\�`���?�t
3�?��_�ox�+G	o����.>��WC��*��'7���7 ���H���J�¯&��k
�k���һ �*��3��_ǀ�_�c�* �j��u�ՋT���=�����lj���JT�^�y�<�����¿E����(�+8��B ���ͯ�w���R ���+~.���e�U��f�:u� m���;K@}����e->��O��a��|g���ep�n[�'�I�j8��:�y�7
�
Q¹�-�%��|h�f4H���	�� ƚX�b�D�`S����et,�}s
`B�����,�}Io���|ထ��o6u~��s>m0�fM"K�9�]�,�D��򪃀�L�˓�j���
�~ [...]
+����q� xY O
r����;�7��M
p�l��
	Iz����Zbu`�g)mS�lY�Aqi���~���<����P�-��_�mK���B���i�Η�27 �W߿����&���	�be���ŀ�y �k+ �O2��P&�j<J�
+�o�r?�M3�y�����i���&%%t�H'��%�U����n���n��7�V��o<B7
�h %]��a
@��e /N- ��/����NfR���Z�8���Ʒ�5�1M'<�
�����m���6�lH�mRȟ�����&���kr�rR=
��9X �&�@����V- �7�@+�8�Ȕ
���ƙ^jH1L���՝�%���''픴ηa~�IJ��m�8~��r�Pۯ�V���l�_��_`�j����	LsJSʦ�	�>0v�;0|� F������E��Ov�~~�p4���IFl�ٲ�mcq��۶�������.��Vk��b�&o[��ݘ�@��J��sQ��9�y��O��
s�
���fa}o�sI��-��0��
C������d�|�=���xf��,��������#��n[�R��\��i�;ߝW'���)sl���Ki���hW���OT�~����e5��e����;����8��lַ��y�IyɮS	o��3M6��b�P���	 [...]
+�8��8�����J�s:''��Iw�����Z�*�Vov-�Mm�Ҩ����To?v�7���HƟ-���0���v�jJ��u���-�=K��!�Сm��A��tR���(���_
+�~�v�^��ޡ�8�q�4�v#�)�
��
AGITh� �>g��ϯ�~9�zV�$��]�n��^���a���<�u�o)�TՕ���.]�)e��|[�{���&__l�*�,|y~�?�hX
+a�O���T���64C�`6
SW�8�sҡ�\q{�Bс.?�W'������Z���藝��L����_
�Ed����ԛ��W�$�}݄*}���\�<Y_��k<
+�0W�������(��1
�4
+=���j��i
+U�l�K"�=7�V��n6�hBj���ڬ��kf�;�ڪ.���N�n��띪�޻U��4�\s�2�
ce�J��V�\z��JI�0�R��܊����>�_���G�Qh�C�ka����.���
�V���$�v��v�
e+�
+��d�dB�Ak�}˒�y����{}T4;p�\�\��x���H>w����s~3����sD�
����e��c�Ⱥ���vE���*�,��� L���B�P1)W�f_VKz+
-�������x�
�p$
��
/���oFl:�ʤ�9g*�rr�P�ѯZ+�ΕN�G5�YS-�6v�L�Nz$�t�
�)��&SZOo��
+
a��kM>o�a���!���^�a�Ck�=ϔ�x����|+�]srn}ʺz���A�
:��6yB� >�I�H<��G�Mgbx"���LJ�����&�~��,%����bk	s��ȣ�	��F�F���(��7Ko�oV��Y����'B���B)��cՂ����i�NV���*y���K�g}����&�t�]R�jG�9Y�77~�0W���,��(%X�
+�|&)�A#Ϸ�r���FM�s��'7���3����J�2�3�)�ã,ϧ��
���t;��9��T�:�:��B���p&��o�i�;&˴�$jD
�+h+X��d	��v%�ݖ��v���o������p
�FYw�%خ�dX���9�U�IL�m��Q��3��#�_�|\�|j��5m��k�X�ڈ��)xs�h�ϵ0I� �adV�^��C�$�i��Fi˷�w��

�S�=���ʒc�ź���v{�兔
�+�s�eT��1I�y�/n/�G�9Jg�&��t\���� 1���"� �#e�1��V�"U��gT�AJ,
+�ݮ؞N2�:[�TJe��?�Ʌ
����;	�@���	��ؾ�`�Q�`r�
V��%�|aK�:xY�8�X�
���C<��X`�1�,!�rt���#��/S�IQ�fj7#	�t ��J�5OĜ� ���O|W�'!r�r?�V� Q,b�����K45���:��x)Uu�ck1�Qۤo=
�+������4>��g��~=��s3�—V�ܚob��~O-��U�`w
+˥���)R$ٚ%;�(� �{n:��q������R
�O5�aB��C��f
"&/�ʄy�
�u�d��>��φ�@ց�tx�9;�%};d����<���ql^�LbQ=7�E�"
ߒ���s
+� �qK��ၰE�FH�����;lE��㼄�7	�
=�w;t�kF��~O#���Er�}Erh�A��c�a��rQ���4ۦӓm%V6��x��l�L��[Ɵ$i��ѥ���U/qC
+��CR��C��?'�=}�����XxGN8��1�'��9(�(�
z~W�J

��&�c�!����3�Ѣ2M�7���|[�@��P`>��4&�*p��qb6
fW��7׹�.s)޷tnZ^ċ��LfUW�Ï���$�y	i�
p�܌��Nqnx1���-��
�b�i�^
+�+:"u���C!9����B�
-�g]`f���Ww���
@T^�@�x��f L��D��,֭F&L��(
�o��4\�m7q]�.bf��S7��M��
2<x�a��m�0��Lыe�許���fw�h����)�k�#Z�7P`
и_ (-) e�@��
����S�$�!��0�\
+�� ��d�W,�
o����`l/�t�Ylbo[X|��q]��p�5&d�9�ݞ9�6CL
:�83���z4(w��
-��>ڀ�g� U�+@�(������g
���K��� ��)
Ў3 h{�p���V�ϱT�3Q�J��{*W����fFzƍ?��&t�)kr4ȍ*i�h�]]?Yp!G�
�W8_@�]k5��
,�����
Bw
0�= ��|2
+�� FK�=�Q��b�7��L`5�]��8>�p�'��E�f��Jƒ
+3��S�r��Iލ�z�M�*	K�Q�d,)M	&K�q����~�C�:t�ȴ�O��V�,�� �
�6ѭ����8 ���	a��f/��fU�-�60�
���{�}
`ʮ
��I)һ����d]vH�9�__l��.�~���tC+)�lm���+S�?r6("t<� G�
E�[u)U!��� xܵ �zo.�:W��2EA� � Wz�����x���q�k��~�$��|q���A^��r��Ԅ���0ߛ�7�x�`�E���P�%9��=�c`�uQG�oz�|O�`�h�O )Ux{9o��Av��g@n@(�>^wD�ւp��<��K�H at 0� 0a
��l�i���r˞��R*ZH	B��#�3)����ʞ:�.�Vx�j��;Y��D݌�� ��3���� �s�&�]!A����kf0��䎒�Nšd
K at h�N
@� 
���&Hj�$0
@܂ ��2q��z|1��B�gw
��y�MO�����c������&��8[E�Lq	u�>i�i�l%m ��
��~���+@�W�	��� �
%5��#50r��M at I���
+P�$�-k9x>'t ���jM<���q�
��M&��"A��N╘�ST"v�=����H�c;�b�-�8�_)��G��ɵ�o���o.�F;b�V �;�q8�q��8����c�1/@l�H��q���\��=Ǎ�08ie>U�T��/�qz淐��	�3(\
�
bt�'@V�nH�+�o~�7��K*��o�;��c�~ju��hO�BXN �%׀6�
��
1 at K�2���
��$ ���v��a ��{PhWH3�1DŽ�C�4jl��H%z}�>�G��.�J�
������Ǽ���_J8����+'�_׶g 8,}vM�^{�b�]dҀUBo��,7��'`I�
��ï�����sI���Ip��oP�͹�H嬠_}���)����eK��/?Հ��������	�z	��@� l
C:	i)���?ܯ�__S�oyc���o���z�����q��^"����Y�I����E����_��To�� 
���ߥ��)��\��
ӏڥ�%
Rj�a��2�=���$�.	��t
$�
H��1�X::;9���F�W�Tɣe����E�/6{X
R�O����a���'�C�mX#!L�팳_}�а-�=�]M���1"�� sc?�$f&�1��Ҷ�i�8��!�����w���X���
fK���_��w�B鋓
n�&����i��mV��O�헲��,��Q���X��� �po�050P�YPH�}P ��s��
Ƚ��|���	]���Ge
c~�nB6���h+� (���h�
�m�v��
��>�ћt-���#�\�b%y�T��I#�f�n_="���!�u�W-,\@��
+m�o�;}qB�\����3�!�?������"���0)���8v��D���ē_�=�j*G�Gv\���ܒ�u�ZQ�/bb��en��
��M�s��~Y�
�N��n�k�^�����Md��Br_���Rgڡ7ZmN�[��vhXm�`���+^�َ3�\�]�U:����������n֦ <�N%�^��wt�m�x3�
5������]�Y�xWff1!O�j}�m���đ�����c��ءva������m�r����<�iä�p��V=��(�$�����wL/� (��=IIS��u�z�Od�
�]��Ɯ��G*�^
/��z�����
+������x��(֚Wz�>��6�=@z�j�ֆF����[.�h��T���.C#/�#+����Ɓ�
;���� \o�s���ݲRx߬���� �
�%�V
Kw����^��t�њ썱��x�
iTFm�,��yt�k����U��h*LKD<��
��
�`�$	b�'��a1����*�ߥ�~���@�Fp�nBߵ
�N��y o[zMދ��UJ�~ى����ϓ����Z�A՝Ⴍ��.]s�h�ƽ2rU����$�
+��GVF�]������"�C��'�4
K���!�O��yM|��ԝ����	���R��c�
+!-B�:5�!�U�(�+S�VFվY�W
��5'v�iOܒ.��R�~��fNjU�.����
ͤ�~��7�-�o��z>}]�����3
�kC��v!9H��� ���z+=7)�T�a��{�ES���|��b�5�E中�U��_v�|+�S������4u����<��u�[��o�?2�H�2IjTH_v�Az���t�/����S�Y[��aw����5�(�
�Z�!�/N�f��r��x��ϙ�u������n�l�� Y�(RY>Zd2޲.d�x%��l�\z��?����S�2�Ry�<H���,YJf7��ո&�	K&��])��$��fO�Z]�ip%`�zVM��H�*�^m�!��!�0C�ڥ3��Ii��J�����K>]���$�^nI��|&K
+�|C	2��<#XZ>!4�
�1��U�H|
AF�c�-Nn
/�c�N�c�r�uw�ź{/˺����~(eh|W.�{����W��
/�M�
��*a�C�ƽ���65(��§�,�iϷ�w��p��jp��x��Z�خX��<�K0��*0�D&�V�����*>�L�Nҙ4֏�w%��t&�����d�
+s���;]2�����A&y
��F�r���֣�s�%>��yȺ�|�v�1��)���`��kŨRt�$irO_\�D��?��������g>�O����WZ1]�Nb�����o
�L�Y��e|M��8	�Z��[ ��W��
������LMgi/��-�VN�.�
��9Y�1}5:*=N�U:3I@�s�����qߣ�qM��x>���5�����:Vʊ;����)sf?�j�Q(�q����F
SH���l�wbc�DKFT��
Q��a��f��4��Z�
+�D~{�b�T�vO���oGck��&38`S:�
��}E��p�3t\��)_��.�$dgUwD-PO�Ц3��^�+
+ߐ
'} 	Y�[FD��lj����;j&���Lmuę\/���Ls��3�^&
�$�B#
��c���9�^#�GmvK`]s���s�
z
�'�²>��7x�Z���U�.���=ru��d����h@/mLl���hW�9G���>����V�
�4;o�%�vp�
֓�"&��=��#:h�(4E�h�O�h�@hrU�j��X*.�;&�G���k&]r�݅~rh%�g��*V~&T�vq;�:�+$ٓ��.Ѷ�]".�zD�R��{�4��:��FkA_bG�u��?c°�B�i=��g�r
d����G���`�ţ��Q��f�yT���:����:9�3C��NF���o�9���#^�ؼ^R��'��C�͖LHd���|� |g�X*�j�.�{]�O�CL�f4�<h��-��m�m�#�|
�>
�����
+xYuT��D�9�f� ���
D'�SC���������դ
%�U����Ngڋ�lp�Ƣ���.~�$�BHBK�����wq��!/
t0�tг~��6:@�qb����
�t�����r>�������e���Bp]H�e� �6� zu� z�� ���K��:"K�f�G ����zx̦'��{��)UoqR��
�R����S)uq���~��`	<PСzR
�HN�����i-��.��	�
@��� ���!l� ��� i�6��񓋧@��
 i�]O��Y����L����N��a���/%>f��#hA��{[��
��bG��
�(d��C��\�G�ʶ
�k��� p�#�\�@�<$z�z./��
@��2@��
+�{y�G��Nj ��� ��� �sE�g����'Vb�w1�myL�r�Ƌg���y��	�`�xg��b
�T�D����3�_����b� s6P��s��xA�k m1&��
Pս|<�/��t��T���<vZS� ��@��;@�[
�T��w��D��.lF�GX:����6fJ�I5�ɔ��ǕwU�4}�����./��<!#�z���b%�1�
+'� ]� }�4��y�lA����>��N ��j ��1��0�cz�t>m9/�=،Y��㱅�*�;8���0�;
��m���L
+��S��q#��m�8��zX��vБ�T����n�5̀<�
������ɏ���vsV|`>���'�A�{%
�,�؞�K��e��i`#���Y�\)�O��
:a2z���\��J�
r���Y��8_p�j�*:F�}$$�Qp�+��V�_v�
�
��[u
���\|�p n�G� ���?~���|�� �8 _j𼦦 �� ^�G��|�YN��).L�fOC��������V\��Z
�>�	6�c4K��苗�,�|`{^x�4xY� |`N~�� i
��
����1��zA�҂� �l®�m~x�< 1�3��_S@�X�9̻@�yr�}��2�Q6��
t!V��`�u�}���â���Κ�4:oX�M���ִ�2��%�T_�Iѹ�񓫏# ǩ ��7��P)�T\�B�6�TG���eA
�݇\w���{s@�

����H4oG�K.��E
a�ju^�;r��
��%�+J�he�_�
+M�/��R��L��忒o�o�
��:�+��P�����~�7��9�����*�C�8<�0+@
��f�e�� ��
'�}<̦�-k�
I#��'�)�=��(ʈ�/>�G�����O}�08Lr���	�n
��	h5�tk6t;� :5~x�	�W��E��T��<qdJ�.��D���o�~SԬ��j�p����y��t��OKK�lº�a�Y�k���}�t
SnC{��
 {6�
`��
��.�l�X�� �{� c����2
�f�w�$�'߱�b�4j��>�Z�~��w��'��BuB>a���"��һ_��Й�����y�� 
.�J�B:W r�~�؀�q��2"�nipڱ�^K�t�F��ːX�z��Fc���6�C6!�W�����l�Û���o)��|۰J·���O�
+�mKA���
+$-* I~���r
���S��q�%�/<�i��u��O�/�ɟ�}�(�CaB6!������?���Y������O���+,���
�=�
�m������
d�!JH�y��J7F�_e|�.�:�|-�
V���sC�>~r�ۆ��C+9�[Y۰HC��~K���#YX��w~o��(�;P��'PD��'���'@��J��
�A~_D@���������t����~
\�38mۜIJq㔥�����>��g��E�
�#�����d�[٥�LD2b��
z����ۢ#o�����+_�M���HS�g�K�BK��[Rc�4p���
W�^Z�4�^i�dis
c7��
�QՠΓ�O��S��\�J
bW
.��[�>���qn����
��nk
�nmM
�Y\��F|uV�����u*�{��4oT��0��
�G�������n?[��g��l�"؟����E���~D���Wۏ����j���[(CD��w6�!��QB�Ʌ���z �Y#Jn��D
E��G�1=m;6scfON�:
��˂���I<@�Tu~���ښ��b�i��~'g\!~,Q��_A1�ʢ`6�/ПԳV�i
�d���ۢ]��n�mUZ������NA/Q�I���.XTQ��i����
�c�$�&�QV�f��6�/BO���ѭϹ���U?*��nbm���z\o�MZ���Z�>D%s[N�f���%
f����r�rz����h�?��v���k�1�`��v�ye�.��K����a+�35�\�����
�~���r��:����g��Me�b
 [...]
+MϽt�1�?R���`�����Z�B��h�J=��<�3Zy��(�Ό�2}O��F��g'sj��ҽ����=P�O��@�c�+��8�!Ae�]�a���G"oO���rc�
&sP'�y|���M�7��s�I2�\�l\)���ԭ�~�}2�i�ܗ)�xT��^�o�qz�.��?[��g:�l#؟���U�`��7���X�
v�>u�B�7�a�ϳ�K>B�槾�vݲt?�;�rZ_����(yYF'i8C0�L�a��2K�:�φ�&���(���~��wЌ`?L�;�o��sҌ`�8�!M�_���?�Ά~m���-?1�!��/߫'���
����?�3�����y[~v����#=a�m��M[�������K����4?������m�=#�/������S���4#�/����#�D��=�+ m�A�u�gZE����,O����F���Vĉ�
퓾Ub
+p���;b`�/ޟf��m\�s��
�L�C��4.@�Q��
�g���\�AWW�d"u�[���
������H-O�j�R�
ב�v��3��gG���f'�
�y����9����Tu����ko�N��V��\O��y��fwF���S�n,��ׇtl4�ܱ��!���ynV�Jt�o�!�Ge��D��M���#�85�w�;X��J�jϕ�l9˜����`�6t��ڿ�Nwfݟ
!�0��"���W�����!��cR�f�j����w����ɴ���ʬ�zj�
k���F��PV������F����/O}��2Ձlˀ�U_� ����H[��jR��P�N�@�E0�C]�h��97F��K��,+zy�ֻ�R��f
�f6/�K�`y
+��E�ǻ�@�mjw=�,odA&�	Mn
ޏ���lf��֝���a��
�1T^�r��了t�D0�q#���t~:\-
if���<���>�=��W���
�iF^��
+�t5�
F�^��� K�G�uUT��N�Wxh��Xqr�g۽j��K�`�/!�2
|�X���<r�Q�ڎ�f�_ڼ�:ڰ��zoI5?���YiZ�C/?��J��l�.�Pi�6��zq�5D'?�ώܸ	��x��'��� _<
?v-�Nϸe��n��RԖ!;<��B�.��ycJ�:"$�}E�	�
WI��G~6�nЇ�&�}܆<�.��>T��}갧�kGs
e�K�J��0r��:�g�^���:$�Ge%s��OR	�F�h����!�}LJ� 
Ht�unVR
��K;|��ˇ�~��Dh3b
v� �́�CvԫCI�@�Jƣ}>�����
�3^|6�Q*�a�m����

���9�����f�ܣ��[K��Nw%�������j�ץ;r�׺��5�^Z�ڸ���pi��赉l�p���Dx
]��2�ѣ�|mh&���Rm�g&�&��
�{���gc����4���v�d:⫞�ŲN웵�n�X
��I����{?½�n{{���F�5
� g�΃
w3��	#���l]�v�N�%��bp�wdY�z��욍M��hP
+��KGt]�E`�
�T������T�M~ϗ�~~����X���
��x�-]z���
�K���
�ԨӇ�Xs{;��vݪ7\�jz1!�}{����N9`�u?`�
p��i���w�wUx\{1��bn3�S�;k�WN3_Zn�~a���j�f7���lA�u`?��	�x�{�`�����wЌ`?L����#D����+�#z~��K��m�a=#�/�׶����������]m�9zF�_
���'��4�?!�߫'\#����_m��
)�����4?��������#=#�/�ߴ��D�Y'�:�X�Ky%(�
���|�����:nX�����6Q�l�ov�����ص��ݍ`fm���M���
�����W��^
X�`
�I3
��jr�΁��ӏ	�U�d�]xɝf��ѱ�A�YF�cM��~�v�Y7ޜ|��K�i����g����_B�6���D�5��R�4m�
�.�pt��I�
]�k{}
�?�κ>�ζ�nr�]�@��y�y1/��m\�X	<_�	�~Ot���~@�Y�D��-H`��#W݌/��I�r�5�����vϫ���,+��c���P�d:�X��
��������W��3�6�{���M��L������
)�uf3�8��=���=�o��n���蜮��,��IYZ?Fč{
9�K�`���Y�+��؅+��F
�����K��Ʌi��Ө�
i0~��R�m�+��݌�M���0�·�]Fj����U��#����J��
��DS;6
+��������lr>ڴ�s���%�l�^�fE���q(Q���Y}
ۡ>���?����,��9w&��ρ��d�p�l��@��p-�L�g�;`��u;״�0J���ڿ�s��޴��5�/��P���öX&;J=1W�y��=D���P;��F4{�D� ]��G���>�Ҳ��M�\
�؇iroU����s�)
a�ɵ?�
;���e��Ԕ�b�v]rМ�޿8�!��/_��^� ���Q)&<�">�4}���({Nh�ԵЂ�O��"��,�Ez���1l�a�jض��B�+ Ŗ�T#X�����u
�I�sI�[YJ>r�7�5NO/�]�����@՜.^�����fx�AO��G�#�B�6�-��i�Xb	�Iɖ�}�����~D���P�
�u8*�G��[PSM�f~Խ(K����X�����_�Eܢ:���h��S���e���Q�5�b�=��m!ӧű�0�i��|fJ�3$zư�n��\N][ˌ�M�y۵�e�9��m��,D#�mT'�u=78eɞ>�0��e�%cG��*����o��	�1�d���	�>����.w���i�\.�,{��ԣ���������N#�����3�u�e�w��J|%��Fj�y���p
m ]�^�m���#�
��A�l�qaD�p�V��k�X-��ǒ�	ff,��1SH5�אn�� %�o������NI��x��Wc!���U��I {� ~�F~q�_K�C%>���Z,�jgJ3U���N
��!�T��齇�û"�����v���ħLޚ��7�T�ިw*A}����ܮ�~d�I�x�F��[^V5���/ [...]
+N]*
v�����:i��s���l�Q�F
�ıd�g&��
r����+w
�ȸ�.�w������,��Ʀ�H
jGt�2
Ԛۻ�j]�ո�]���	������
���UẪ�Gj>B��
Q�QbcY=+��Ι����y��v���(�Ӈr
�*
Uo�MU���\4�P�r%
ղo��e�,��
"؟

�
+�
+�
�tG�k���t�l���i�#�#��S��sB�Z�����#%��ݼ�,���ݔ��6�-.�8&����۷�gjG�Ҭ^�����������D��&\��(���~��w����g>�	���6�!������D�_��~q���-�$�!M8&����4?��������=#�/�����Ҍ`?5�Rޛ�\������
�O�f�Y_z�
x��5.%]q�x�����lN�UN�a�E����ņ��5?�7�d���F��yQ�j{�,e������C��h�0�9$�^A��|�K]���w���{���]ZtB?��co��C��Wn��q���qk5���V�N�K-�
���blVp�
f��c#��0o�z�>Nπ�
�?���E!�*~���X��8���b-R+;��
g��۰�
`9��fg?����S
�~~O�|��p�y�4ϛE $��'۶h�}c���n
��b��.�f�d���%��Vn�9�ם9.�6��:-�����h٘eM�;}�����<�G�f^�W��f
@�iP�+zob
����?�^��2�lyik;�7���cg�ي;�+�����f��\���
z�ɣ�ٍ˳�r
K����'��,��\=�
+�
+Q���
+��F>�EW�+4��Y�v�`


�8l��[e�}����<&�������xW��3\�bˡ�A���K���l"
+ivx�s$��D�O�-���
8��+üy:�o�k\������eY�/���2�Q��ϩ��
�O���7܈]w at 7
W�; �����W���
+�"	�N� ��
$:����qC=r�F�Y�����ɍ^�7�M��U^�_�
'
�㐇џf�� _�?O����8���j�W˫ŏ �*�LH3�'�&
�ʰ�ۥ*�yz�L�-�^Bu�FХ�I�ծ{��_7�{�\d��9��,ݹo'��c3"�z��m����^fiX��d�!�}{���7�u�Yap���ܨ��׷��eD�զܸƬ<\�y�<92q8�
�� ɲ����J��z���֠�x�����tv��1��c���B����(
�`��5
�J=vv��
�s�{)��o���8���Ўǭw��ɶq䖫i�O�cBxL�25�`��S�v���P�Oc��[[[����� ���W��
+�K2�@hn��Ʌ[��C
��ӭ�)�b�{rY߭��cm�͞>}4��8b
���^>};�x�%��,�ӹ*���R��
�D�?
��J��o��s�������ߖ��n�$zN4��û����m��yb���c�mv�AO+Vz�7��Q2#ɣJ��m�������!(Y
u;�?��;�_V�e!�	$Z�n~����o��>?�sw��A��s�����ٍL6��BM���Ś�~��;5m'�q���{���2�{\3���Fi1*4 at M+�l���\��C�!C���$���a��
���pN-���EeIMo-=;���۴�WG2��V�#��-�>��J�:D󑦨��t���B
��� ���ѿ��m����
exif��m�$���=w|���}���W�V5�Q1.[<��Q,�/B���
�F)���K��Z����@ﴄ4��k�O���%��!�}{��~
NA�n��t�GZ+�ma�
��m���U�T	��(pӪ��G��'�3��;��
��1�Iz�2���(�a� [...]
��χ�"���\��})�����N��l;�ت�ݔ�{Ye�'Hy���76▫��8]�
+�
T�6�U5ݮW~[�\4E���J���~Y+����@ۤ7�zI�郮��%M����#�u[�ؓF���f)�5({1�u�޶�����(�{�}��Z����
��0���ڐ)��!_|��ɢ)N2
�̲?}k�zi��~Q�z鼅�<�8|�
8
�>�� 
�A9{WE8s���Y<7U����
�c����a�J���Ur� ݛm/�������z/������翃�wЌ`?L�;hB�~��w����9z~��K�E��>��~q�C������W�9zF�_
��i�O
|H3����3Q9������8$Nԁ+�p�U+��&��M$`OJ�0�xE�j�$�S�c_IC�~C����bv��qi7��f�II�-U���
c
��0i� �/�y��0q����T7`�qHӋRp=�3}�dCXO�0��L�+��Ի#���'��|Nw�-j8�~vn�|���ӫ
����KY�
+����'7ݚ&�Y�
w�|%zs
+�$�����K��8�O��O�bO5����u�,%[�q�{M���2��ؘo��>4l�k�?ZG�U2��Y�f�l�Kq{��ΖA��濄�I�~�������<����4�S~�9�(�<�Ӻ����L�4�0�
�݂���h/7쩸X�
��31{yo2�EPA�FK�g��3g|�2���
�e�^1`*uH��v��d���|M���ǵG�n�
���ɑ	�k�4��2k�enm�֞ke/��0^��|�Oo3��\j��e�ev��A����D%	����#�8
���

+?BB��h�Ы0;��ʝ��!�vӣ��jd̎ˢc
̥
;�Iπ�d}_�ݴ,З��(��墬�K���|�9�@=���c���[�0��9���{���u�iz'����Aܱ%�����[8e��B�6$O�g��˙��q\�g�Q�L�#����"؟
�3�J4~�D�C��c��
��y�m�)�%�s	HW��\x�-��Y�
a�\�j[3�^�gm�˕5Sk�J�hi=)���d��{�
$>��s�`���®d�p���>�����a��c"7�򅮕��nc;��p�
��j�u�x!3�
�Y]�Γ�����f��a�\�� �&��m��"}B=��O�����3��O`��̴��-��ܚ5�y���
���z�
�uj������@�x���mV���X��S��rʴ7��?�����$j�_���
��o�@h^�ϴ(���{#qmuŻ�g}����&�}��*
{��ʮ6�l��It>
m���%?������`�	��i'����>��oD���J���X2f��s���,	��Q��S�6z��,�if�|Ϯ�<�����jU��V��m
+���~:锟}�V��J�MM�%�`��
+R��|t�$�<gR�a�KL�07���gA�+�bPo�\|�\z��q�-�Z���1!��G:=T�u�흪�7��,$C����_B���_�J8$:c5���@ ��G��7��
.
$#x�좽�ϼ�:��}�u6Y�L�
fp�m�w_;Rg!����{��dᝃ����.ʪ�Ʌ����1��h�
�2
>��E����e|�W���Dߟ.y�; 2[۞�-�����[�"����Eؠ�(�
���
�� �� v�B���0�����QU#׮��y`D���1�9A
�Φ���'k�ڰ���E
+�Ӧ5=�js<����36�M
�:j�a7����(��G����p�Rp�s2(�F�S��o��#�F�,�`�gݮ���0��
eUM���z�5o���,�.b�Y�����Ț��=r�1�hT�Ć`��3>���#Pt�2��(�:���}�aj��
Ǻ�w�ljֽ�{ωQ��t���Od{u&�u�?]p~��K�g�������g�)"�hb��O�[��ߪ�1��� E�.��`�|��B�����+�ܝ��ů���m�}0s����M6+cRU��]�����85�Jr��<?����J0,�Kѣ�0ӟ��u?��}�u�����3��3��������xz�9�2�����m'U��
�金\��Bb�h��l��	N
"��&��3��Xzk f�\$hN��S*���:R��g��RP��/��͊��뭭��I���j�s��3w2sy���v�/Au�\~�Nl�r� �
*x���?
�s��h�'�*LLc+�ݟ=�)��=��#@�8n����b6}�K3�CG*<�Fź�`tm�Ѳj���*��(�:N����;�9|�Hkpx?���y�����f����/z+������ P��K|����� �G��"
+ԅ
�����xU���ʬ�ݭ�ؔ���wK�fh�'��95)
o1Li�� cLv,zhj�8��[�����v�r����M���Q�������j��X�� 8��
������=[\V7���J�f���'b����a?;�'�(��0��ңo��и+�>����P��`7�D-;�j�����T��I
N�GX�6���t+��R��BV|ғD�=J�	���
'T��DGc��ݤo����#���)M5b-�
�s��!��^'q��1��
+��$�R����~�������3�w���=�靬W�"4��T�NoC�˵�9�
�>�K��eK����1���J���X'�9�"R������n�Ŷ>�)�fn'�1x+��oD��%|�ǿX�I����AaT�lS�!��`���9�օ!s^�@�pJ�"�՟^�#�Ȩ
�d������wF��hO*��56��N`\y�/:��Z ������֌χ�u�u������N��_ȿ����E��?���5a��w�[����Ն�y�����B��
��g�]4.�AAlBQ�E��wQ�Ek*�\Ӡغ6�ˬ�
�by�
^��
dN��oa�������>7k��k�nҬx�B��Q�.ݧ��z�u ���h�a}ڣ>(��0 �!()�(ٲ�i}Ź�R��B��C2>uIL�!V�˅X<ʻ�t�uj�5<\�k���/[�;[�t�n�d!68���>������7 �$R ˔�"��
+�����n
�����
JN�+�
 5�<v�
��X<*r���$��� ZV��W:X���tfԭe���s��W]��C��
~
 ����/ެ ���0^:�`*��q E7i�nX�\�$����{ꎞ��G��-8��E�
�V�Cv�lv���jc;u?�ͽ��gGXc��?�����: 6K���k�>g
����
�&��������L{ݬF�uo$��¹����O��+��+��w��K�H{��Z���].������U�I��[|!���E�
X���I

�0�t^ _�]Pn�
+���k�C����G>s&VNIv���t�^�����ϓ)Ssl��Y�~�y��7��s��ge��N���FUf�� �:��h~�IĮ!
J(�
o�_/��d{q��ZH����y�`8/<��B
�l
hƭ�ҏ�ѵ�99
zT⼧��]�
��,*�v����O�*�Z�:~e�8�3�|����+�I���~;R
�rog��N$G�kl
�벿 ��5�[n{\���F,yu�LU=׺ezB�mۙ�Ή]�TB\��F�g���_���.��(�B�a]�����͝�����u��
+_�U����S6����D�s��Nu��ȹ��g�'
�*FV���ക��x�i9CsI��k�x/.���
�k�FUPl������v�.
���R	�h��_a/Xռq:�
�e"^��xn�W�\��|?H��؞η��y�iopi��{�*��ڂs�EAu�Eᜇ5�}�%��(
듪~�-i���)P�u��D[��!F��3�
+?˽;�������jv�|�^��d[� �5��U?o�A���l�`���תq�� _ȟ
+���1����(��	����;b��W��|�-7��4g�L�06ˡ7��b�ۣU{�u��p����b��E=FS�a.��Zh�܊��h�G+��񟚻�u��>!���C���;�g٫�#ܴi�lv��J�ك\V��<+��
���-h�+	��j���4#��<K�J⌤i�_��? ��N��X���4x�`�r�̀Jw�F��[
t��r���v'��_'�_�������zNm�c��R�WO+qO��;�rTf��tGS�R&'��L���b2 at K�O��qE��o���n
+�se���Ya�}YQ|���N}:�^�'�m,��eP�P�Z����Nw�ﺢ85�|�y�����2< ����̸�U�p��������I��u	5��
C	
NGE�
yF�d
�b�� �%�*M��#yl�v7aڔ������7�.ʷf�ť3ɏZ�_̨6&�彴
6s��Pz!��B�T� ������AI~�k6����a��vݻ����e�]��
5�^�r���R�\_ti_[�D�*l5�:C�dm|e���۪t�-��
��u���+����U��/�
���b}����
g�Ay���\��xVto��/\
�����H
Sb+���JI�Hy9e7幜.�fOG9���
��3¾n�,�q)�Չ����0n�ϣG�tu�� �
���=Մ]s� ���0��m��
�Ƈ�kt�͵�4�`s��2,gWV+���:��7��L��$WۤS���lӒL�
"}����)Q�
+oR�a7����*�@q�ɁR��r�\>�5�I
���)ޢ�����|��i�R��M�zI����d3�L�a
�+Q�Z�

�K�b��ɋ�>[���
�ԝ9�=gt.�������5�4��<��ܩm�Q��ܐ�q0���=�
��?V���Ie3x�ϒ˰�7n�3�c'��G�C���	)n�d�
�g���_�܍���%CUS�'u���] ���<	Ĝ�wy�1=?
�:���/E8�l���p=�0^�^����iv6�֤ba�Z������n�6;��.åJ=����]A�<�Tm���{>�W�B��G߀㼁C�=x�ϵ�ҏ��NLd�5lŧ���pڂ��13�p��7��GJ�
S3q��
2dGg�V�`���LϨõ�ج������XDT�:}��&�� ����X,�����Nc}���w�tV��Z�^�l՟���hf1Tb"�
��������gX�����4_�-�7�jxQ)o��T\�^�:0�u��C��3�u�^H�j,3UC;�wu���e�;-�UC [...]
+5���]И>��M<	��
�t�V��`s"
+^�	΍
}�������{{<�{���r��XvNCb�
ތi����.
���
�R����|_~
+P�pأ�
����[SPLm
P�3iP|�z�x�䕬�J��V
�m�޾Ȗ?��=���c�Sb�����0]y�:�Qr��}^0���/�g�O��9�;� _���0gCP��2������g�(!�4��A�PJ
<h{�"�v�u�a�]�>q�Z�;�
�����}���W�2�-7i����!p.���i
�u�F�v����/��'l}5

+b�	[<�êL~f�q��S�f �=T�CP*�*����@��#�d����q���v>'���%&��
��]�����ܨz9>�Qo���!}�_�����5j-��m����n��j � %'ǕUT~�&�~�h�&
_S�.�0\�7��UN�?��]�J��ә�vw3]�
��Z����w����s�S|!�P8�Ptx��1��#�ں����>3?���c� ��38��{l�>�VDg2�-�
�o�2�o�QߝY���h��fS�r�?m�@Ը�N��[u�UVʤXZ��C�GPs<�`��wX����<Ys�h�7"�+�˜�*����.w)�p_IW�,-d[��By�>	�'�~q�����h>��T��9TNi�m9�[��B���/�OPx,#8��
��(*I
����
]�T���,���d��R�6m�+��U�ڰ���j51f�-��t^���������X���Y���CeY����9���r���>����%�����N�
���6ʓx�ZZ�ε����qٹ)#򾞽Xk�w��_��c�~^����t�r�h��r����v�'����W`��+�m��~	�)1
Mw���(��P32
�_��|`��&p]<��v��q]�l��b���	œ�&y\u�����P;���+W+`��33ڬ��t-����
��t���4ؙ��L���W� �n`}n/��^�.(���K�
�I�
�g�F��'�r��F��.-k���'�ĵ5nd��}VHt��Q!e�E��8��+�4,��aq��s&^��T����_·��ON�
	GQr;g��d��A%�ϟ]01?�/p�X�xK�5�*�c{Yh
���PK�UC����ZY��N����A��ϱ��p�\��
+�}
C��/`�>�]���*@�uчm���u���;ud�݅UK��F��.����,k�Ω����va�*k�R�屶i,�w�-��*)x��!�xZ�Bpc�}9r�/�o����3EO�-�� �y��S�,�
,���p�G{�|��
+Gy�������_il�����Bfo|qy����6��Ҟ�y�?=�
+�iXO�Do�K X� p�O��-�p=��-(�U%�֟�M��ƚ<:�Ӊ����6��ӓ����ʛ�!��+ۼ����\j�1~[�U���ۘ
d���u�]n��2暹����G���, �L:�$���v�9��%�Rjs�M��6�1���
f�N�g*u�=�i�>�e���H��07�Nl�'L!7e�/l|�o+�l<k���
]���MG�J��[|!U��h�X��}�|zPAټE�-����f��%�ޓ��3
s�����k�LT���\�'��"���f6����+�
�Wt$J�Ұ�a��NoF� �
+�v��09�% ����5��V��}�P�(���,e�A
�����Ӷ�����O��

�ձ������{\[�Q]x��M*�=nXg�F3H�%0t���B�C�$� 6� ���"(ݣl���2��������v��r��3u�N���
Q�f�l�)�I��̓=E
���=��d
��N�1z�Q����շ�n����Y�
��y�X�3��?��(��ŭ
p�>��R��V�����
f5��Ħ�
��;[s��!^�7�k��6��[~Nfy�5
+0�=PW�����~%A��4u�%�*���x9wz�Ye�sy�� ����]��rb1yv# w���)m.�ҵ
9eW�\�3�9���%#l��ԋڢ)W,!]k?�I	8ou
�q?�
�
+�o@�D�t^d�ʆ.����A}E���
����O'�f���	�6�=
<��
�BC��fdyWwiB�J
fu-�����~����`?�"�9^��m$ϊ�0��
�=�<&߾�t���2�&�껖�-���d��ݠ�������'�s��'14׻��Ϣ��ę�E�C
+
*3�qyigنW=!C���^�%�؍���
4�sbO���7zN�>��(�~���T�)�z+E�(�cd��U~	�t���a�)Y�"��n�9\���M.}��\(y\
+���Jzf1��D,�5�
��p�G��ќ�襼d�GvK�.8��0(o�T��^��A��9��ƏI(�
Xc�{���5�e�͌qy�|(^�yE)���s�J��d/��qʣ�3J�=ܓz8ȜVi8^��P��شڷ�^��(�Z�^��&�N�7'cm�"FP��!��~��0/o:?����X���Gb�_�lv��#�
����o���z��#"����o|O�W��N5�ҭ�!�>�$�F�x��
�KD�b�_HW��[]�8'������y�U��/�(����Lލ#i�'|dѾ�<zh���pj�!�^T�{5�bm��m�"�tjD�o��<������:��1����'���Ƃvк���ŷ�D
��L�V6��>
�ς��
+�Ye1vY^ϗ"�,��$��Mm�2���������E��r����lgTr��I�R�BZ���j�O�h��߬��A��]�ƒ��͔3���/�7,��\v�4~	p��S�@���|�������N���
��/��
#�Bcn��M�A�3��a�曎��~�����X5��
�-C�(+a}�վ��Ț4���}�l����Q�N?�4?{�)��/�_��@�
�ע?Є5��m�oM��;Q�
+�;�<&s �=	PP�
h�� ��0n�{߭?_�����v}��
� �ywc,�������<
�#ú{_u�-�<y�$m����t���z�m�|]F�ß��U�7@~|��&�O�r�P˓p����fk��v��	g`��
+�
�.���hڽ�
���[%&_HvBЦ���e[ﵨ
��V�\z
�mS�=n�hy��t<��T�)@^���Z�|�Q:���O�e�5�³
��a��T���s.��_�x+�:\%ң�S&>q+
%>V���n]d;Ӝ�5�ڜL�7�X:���p2�K1
+��� ��
�6��\�D[Loˠ؈\P��8(�_poE�>�&�E� ��Oc�0h�L�M9?Ѩ�>�-
i���.V���;=� �Y�F�4s���T2��6Q���U���
�
+��A15S~O\F�eP�W&��sGP�.���c���� 2��
���emMp���[
��"����Zͺ�m2<�����~|����:l{��S�����$
cd�}���`ae�UP�z!(
_UP3P"U3rNt�ln�B���
?�4� Dx��j/
ej��-�����Wv�N.�gM�8�k+u�%�W�ف;�=�d�
3����:�>'��Kv��E��
(U���R
��<�׎���]��xQ��wDA۱(�Ӝ�Rë<:
��������[�n��9�t���a�[��
3_,Tt�����M�_ȟ
+@�}�]�a�nA	��ݗJ��w�r��"jLWfH4��G�l��t��
2��N9vσ݉0��ut���RȎ�M�)
��s��.�
�KJ
+vL�e[
&r�p?ȿ�' ��o��hN�d�j�b��x����� rǣt����e�gt���
*���l
�y����cWɡ:^�byuE{��Y�������<����O����-c�H�9P"*���w>p'�3`�s��
��v�s�k�����P8ٷyQ_?D�@e���`��)�㼵�*)/��p���NT�銴��*�J���3��?�� �: o�^ߩ˰sǠ�
�>������st�4��4�
�
�� /%mܣVF�2�C�����v	SJ�YI^1�'oZ��Z���V	O
K�Am,
�N����t
����i�w��|��|[\8}�5�N�Nt���e�����#�Op
���1?�Z⡤w#u�Vp��&j��R#����Ź�`������-;K�&
��=��� �j
֧�y�����1"���_M�5
t����{�&}��b۽
�а�7
�:��~�o�/���H���Y2�|~qբ8��|>z�$�娑W�4� qy������蛄5z��@�r���y�e���V̳
Б<sgǮ~��m��{j���*�:+ۡ
�~��%����Ģ���\�W`\)4l�·/Hg��܌8�ؙ��4ĥ�S�y��B���z
���kϟgP^�p�<e�i���q戕�v�ܥe
+n���*����u�^a�_G!X)\�r
�ל^��l��,��b�te[��R�L�I���{������/���-ڠ0\$@�n7�J
+p�gϱ� H�#/
o��c�I!���N�@__4$�������}|��|�2T�Y��7�ߖ�����)=�Rcs��q��p�����e�ˠD��r��S|��Ú
+�c
+��F�9ls�I?h����ց���|�G�^׫�}�<Z�V�}]�'�*��c�p����k����
+ƅW�5����'C���m��a#鎆n#Ɍ*�J�� �y��j��운ʪxyvc��Y�����]f�9�X+d�h���W��ഡ�oC����?l�<y�]'F��s���
=
�2L�
+�Ƙ��h3o;���8b�8����/�O\0I��pR�!�
��j/�%�L����[���#�y>�g�ޤ����KE���~�*�.JN�B��pfL�u��˿
W��,�B�
֩}S:��Z}�Mh6 at 8Z���-�z�O���)oIP&���d5�<6/7m�z��y�u�{���l���z����r�,ĈU����}�D\<7H���S��dz���I� >ϼ�.���{3j�p<um��"�Ş�x3�bG�/}��-��K��m�
���!Z>�%�e
�6Z���]
+�}==gZ[�y1��,:KWkg���{Z�?�r|M��D�Z� W������lg�'|!U�
��6(ec
�]:�
i��	
+:�	��\զ=���1K,��`8If�g��r��y�z0�
���̲����FL��K�5�=�.�k7� �F�&���&����) ��=A�N�0w�}K'����)al6��LJJԖR��N,,+�"vY����fW�)��3�Pݚ� I
:c��+=��n_�
+1�`R�ުz�|:
�d��nj����~
+P\Ppk�=jW�ʹ�SiG�jv��
�������=%�`&��9�>���&�I�{k��,�R��=y���憞펇��9W�˚��
��v[~�[q�!^�V"vӨM$m��+|!U
+Jz��n`^=�t
��T�����r=~��Ŧ�V�)��.JD4|��� s2K�5Q��MX���$
����T����T2���0��6�
����H]K��>��{�"��[�l4}��|!����^��[���p��D L�wL�h3�
���n�ٷ+��֫�j��toCn�d|ؕI�>�!=��>���$�l)��f
u���{�gtP�����f�iwgj��ֺ�Kq��[*Tg�	�r�lS{��X���N��6�mjB*}J"�B!RgJ�cu3���1�u�A���m-�L{R��6��-��j�p�`��J�������@��'F�$��>���q~zs*��)�ǣx%Ƭ��/��)��s$��]��U:Ƭ�j[b�hc~�i�쨅Ge
��(.��ws����}cٟ�fzy��ǽ[�
nQ���?�Z-X�����.r�'0����LĂ~
����]���c=���#�޶�y�u[�æع���>��f�o�s���<J5et�����Q}_�nu?}Q�>��Ք]Wt�g�
+[�-
+�v�:�9�;�-Z@���

�v
+����d���
ȷ�@A�sҋ��О�hA�A�j4Anm�@�O�@���A�Rt���'�f�aMn��8q�C��~��;����-��?����?Є��ߊ�@�s>�/E���5�3��
��
��q��8�>}^�
��� ]
+�go	���3@��']l�MϪ4iw�mȀ�&59_ƅZ�y޷�u�L�J�T����/ݣm����Ƕ��[~. e(
+�O �( �E���(��
+&僂j����_��fx���
k�V���&@�^?>k�8.�]k�**�
+�-��$�Mp9x*.�n�Ν�|c|�9�xw�K�� P�p���V_�*�24�@��w�]_v@İ�Cy��B��
�ihªt�^<�A4G���@��ʩ�	^��:��S���96��c��&�ͣ��+��W_����M	��[PT��aD�$.�c�����S0� ��p�u���;��2��5�
�X7�n��gu�����e��֏X:^�g7���4��.O"�Y���5����0g%���1�~�ݴg4�ߠ�ޡh�O>�:���bz� �q;X��C۫=�b��hd�Y�d�,^FA�<�}�-HގK��Vz�\�p�/�q�5�K�=��i��\�<
+˙p�4���4�8�sIP�P��yh�>�b���dM�-Pl��&�h���0X��A�
˾��v�>s껌Oq�p��1��
SG��+��r����
���i:g��➚��19l�{�_����ZP��?�w��
<���`L E�a��5�q�;�⥴�j�v
7
��煮�h'�
S�V�,v��]�8�+ܶQ�K�Vr�����*�;0��9��uv#�_��t���
�? l�����sP����2���'u����'�BFn)����
$�����˾*h�^���EM�0+2eӨ�uc�U��ل���?���m���^~�OF��'�X��Sv{}q��-
+G�Ԇ]S�
��B����I\~ �C�_�s=�Ġ�P��}��_��m��oKk%��7�ӽ%��2_�BU�
b�k��$�ߧ��L
.�2���[|�n�YDo�x@��/�O �SvӅ
+��y�����t'�Ґ��R��F^�N���,��zCsJr�zoz�g��$0�� :U[ؓ�V�O
�k%�OW�j��bI����K�l/vӍ��G�Ж�H̩�r��? �c
�
?o����X�yU�{�>��w��[�g�*u�~�Ļ$�=$�<_�1v1'G�q�FWG����^+�"մ@��䶼�Ѝ����'����1�BV��=X
�T�
fH鈦�?�o�y��@���-�=P�DK�#w;��4�Q��g7�\��U}{����|n��ӂ,
 ��^/��:

��<�� 3���Z�/�[��lU:F��=O�))�"*]���B�����)LJc(E)�sk���v��\�D-��]O
~_�\`(�3�<��Q�b
���T--{�Ο����z��W;:�/i8�J��4�(ԅ�8�|b�Ȧ��G������+\��|4a}�}`x�-ߒ�$�~2X�N�
�2A�uni1�e�\Z��z{���N����ؽ�u�#���y��5n��wX����[p�$��z�G8^��I�V���v����\@�}�'S�î9�?i���
u�
���9�Zs����%�poi
+��J�wwyzH����po��V|~���}o��m^=8.���l��f��׵2ݽ���M���]5[�7zi���?�.�e���b�|K��B����
{t!��k��m��3��M�Z��;l��ȁ�خ{�*�l/ޥϛ��U�?�oz���o�6
+ﱱ�#�M�i��d���$s�6~ ���N�e�1
+��'ߒ��5au�F>�y�#�v�[��w��Z�c����M�%*�N���}�
�N�!؊��k�L=����\��\!p��q�GB!�����;��8^��Tor�3����B�a?���JGw �	�>e�x��
+�m?���.�6���մ9;����f�\��W���|m�BJ��v��26[{��ƨ�H�A at K�u�e�Hd���M��zi
�e���B����������.�	)	E��R������t�U�e�G����V3?�֎[�F*��:?o>����!�����JA�|'�ilL-�=��Lj��h�U�1�|D1�D�f�B�' ��i��G���T`�wG�M�_�?�����p�M�	#�
�ڱ�7UQ=�6�.�,�Vz8�טO��Ʉ[y�R�V*�aU�t`�[�
�.�n�K�)�2lT�\a��)"�:��? Ȼ�
��(	T
�k+.���S�^�+�j��5��H
{�~��m�W��}!��rh~?}
&V�㸪X��0g)���O����3���^o>̤z��֛��q�oѽ�_��3���
(�W�9;	���xA�C��ͅ��
��c����7O)m���C:W]�#�-��1-��-z�` V5�MK�
9š��u��Z�B��A at 6�Z�x�Z-��E"<�#�q8
~ �5�wPz�^Լ�2��V�l��0F֏��v�;�C�,O�ڰ�T���}�kS�g���C�Ɣ4`�djʠ���ώ�BU����G���$�B���:�}]wwe�U�<��|_� [�]sb�]�
+
c_c%u#=�>�;�뭺?�ׅ��X��K 
��{z���xѾ�}�Н�����i
=ťy��e���^
��<�"Bn�G4�݃u�ti����u�|�J��|4Ӯv��é����
5P��6i��լm����$ A�:��C�
��5�M���pf<(��ٸ��W�׈jԢyo�F�d��Ù�x�[�ZMc"պ�]F)����:F!+� �u)�����m�)
�#+�.��M�\ڌwJ"�^D
=��cO��o��4/�5��4_~%������ې�&�
�>�C���"u��]��=v3�Ž3�
��Jmk��|�
����pak�(��d?��������� I�>ks*̵��!���O
S�;�X�޸o�/�jD�u��>k_I�O��
"u�>��8Nv3��U�Ju۝����m%N[��u��_I
�n� ��Z`���8��
&��t�-6��)01����Ij���4k��
���"��TH���D?��]��a;#\��-q)�1�n�V���G�Ѵ�޽Y}����ػ���\=<���f��!,�؛�Tg�6����e;sp�� ��x�/�!����I�p���/��˸Dʸ=;���jO�S��7����ޮUm4S�f}ö�z'K35��G5� ��l����㮚�}������>���O�خG��򂭪s���g�n��M�_
2Z0��sT赁��r�U������*���PK� �\j$��}ru?y����V��9�d\;Y
5nH
�nɩ2>�b��m�uK<E0�� r5F��}�-��L��W���۴�� %�9��k$�]&<ȭ�=�1�;ȵ�1�eF�?�7E�5�&�*!	����zf
�jY��
+F�|S_�b���ƭ�����'�C���x�_��@�
���XY�
E�Y��\��<�#E��P%Q (��4!
+���@n�� 7�`���s�U��{0�
h�AV|A����|]EE�ބ�q�
�TS���Sq߇�O r�j��#��?'W�2�)�
�u�O�9�o�� O�!�g�@�Q�#]�5�@.�=����1X��*sxH�,H�@�D�x俥�8�mCQf�����u�SF���;'�? ȍf[(:�A�K� e�ih����4;��R�k&�Y�
]��;�Q�ZA۷	�z#��,m�eh�w�m< �2&��"
O�U�4G�����#I�ঢ�nVr����W�B�T r�|
r		֨Y�
Q�>�q8�8�'P�[GP�7 �b�����
@
�
+PvM����]�^����Hc
M��
:��6h�>t���?r�c�w7��/����~�̯?��=䋥Ovz�{vA�� �
P0�(pV�!�
T�r�[\�
��4��g��X��gE6�pq>N�z�
+ZYڴ�d��+����7��d!!����@NY�nZ�}N�>��n�IP0,	`Y��;V
+^�(H�,����
�������8\��`m��~t}4�����ꯇ�a;�ݴ5�:���~�K
�"o�l
{�d����(L
���
��
��g<iPT����@�#KA��'�z}�=��L1����;�԰Et.>���{�����s�7�ͅ��c*:0��
�9�-����B�ڹꊑ��
���3��mp��? ��
M�
C����c`�e���
�SW���S�����s��A\)~rc�ض���w�Y����M]��<7���ְ�y������S�J�� {�}�{�F�;����  ���
AQ�	E�>�ٍEl.�
 ����5� ���/�w�����u�kٻ��u�sF9�9����*����뮔�i_�т�I%���ɝQƃ#���
�v&�ݿ��}�M�"�S����Z��������Fnz�����i��KV�
��P�����|t{'�BJ֩L����ûZ[+>��L~�'���"u�dq��[����*��n*�� �����[�k�� [...]
5�:�~��
��*zF�S�-�f�
v6K|G�75�\ŇugE�����(��3 �?��k��ُ?o`���~m��*{���@��6
��`nq�ZY��<U�������������؛n)�,�WPaC' ����(�����
v���o����s��{�y�(�x�� #L2��x1Ͻ�`v��vSk��[+E�F�͌]�.�S�o
&���;ʎ$�*�0���|a.��O� {��o�g��]�u����sYe2��aS�ܥ�pX��V�^Z`���Yl�����G�8����ܩ�	
����Q|"�̊G�r�
�m�9��v�:H˪�c��� @ԟ�>#���~:���<�RA>
z/'۽� �D���ڲpnT��h%�z�6����Q�X�ﻧ�nNG��hog�
+��(�X�(���Iهiȕ�i�s
�X)���ɖ��D`�������/�9j�����-�Co`j��w�o�;
��Q���v��͠Nq��4��\'��'OY\�$��1��ш���_>,��z�6*��uP
��~l��A�r���ޣԏe��"�� D'^�y+m~rN}�[VA~�Ii=]>����v���K�n���.��F}�H��B�����Ӹ��q���F�[6-fs��[Pf��P\��7~��P��^��?Rz�V�z[�Jz�=3_��
���(8���:����BI-f	e�F����=a,vZH ��^>�"X�C��{�Ķ�
��^g�;�=��d5�u����D�l�
u�YmU½����*q�T��[,���B���� i8ʼ=N�5�3�s�k�[��a�&w��au|�
�O8*eP�O����V�Y�YnL�F��*|�Yő�1j�V��I`m)����\��]�Wv3Y���U� !y0����OB��'e�;KR�t�]��ð���эa��;3������89�
>Phw(P%�� [...]
����B+�Ԉ=�V��N�U��&�.谳�
qu�
D�8��\j
��K�E>��?��
+�Re�X
+��q��Ƌ#���;�Ej���{��r�r�R�V�t�z��Q���f����@+k$r�� �� ��3$�k+��!LAv>���]߷iu�����&�7+����� h�]P�� �F��.���sO���Ω�\������0{�.����?ݧ)ml��Ț�S��^�Ҩ�T�o��ܝ�d]Jo�m����Q��
ל���ɞ����G�t��勍��'+_��
 �ր&�`�M�Z�h�!����wh�6T�Z���j�~`+�Vd��0sg)\~��랷���b�L����k��ɳ����ȡ���\�����d=嚓����A�q�kl���ܽ���K���
�\�z�rd���^����c�ޮ�H^�~��ԎI�T�6�]��\gm
+"�`��ʼݪ$C�{ƈ{��
�&
.��Jhq��I�Z�,� ��:��
�+1ߌJ�
�ey����Y�5CkS;��Y���)�vҝ�s�:)��z�Rm�#I�*.
�(/
�{�]6�m��
�@Z���6\r��sⲎ�n]��4��No���������N��f��ju
[��upgo��
|(T���!��BZ��͡zS
�O~d��x��]C���UŰ���c�i��j��>U�٦�:�2��-�F���6�l/[�]*|]�&���o�A�>?מn[h{�J�]��p�R�
�6�r/dT��U�g���0mũ�r/�����D�ʹ����iEn1�/�j~�D�)
����z�C�
�!�n}?Zu����4��
���|�U��w�4�뭼�ٚ���x�`3I��J��`�7͢,\n�[R�t�q���m����dI��O����.cq��3m�tU��}]��o�Ӥ����Ż
[N���}Et�v�c� U���|�l7��Ӫ:B
���̫a��렯e{G�.Ͻ��v4��J�[ܪ�-Xc��C � .�B���+�7�9����%~�j��Q�����s�r���e����i�.-�$
%�r�W� ��\p�Ӡ0*�Vq�ϒ>�6��؇����!4�N�i��M���F��u�vݳ��]����^�V���@�Oٕ�L�sP���J� E�엊�}�(��L(���h��b���O��������?���
��mV�{K�;ԁ�@S��vs)n��L�:��(���d�W
Q5�n�=*	41.J�dZ�
�E�x�W�V���{��
�ә��Ӎ.#IB�r*M��B�tt�@6�Z��s�w �ޘ �� ]����`�R���*�8e� �M� p(��9
�^����!#K�~�=@��
��
a� ��*@'h
��R���кj&D�d���Ȋ.������߻�%t� 4f� �v7��� ���\-�s곹;�^]
�
j 3�B{�
���C��#Ԛ< �b� }X�zb�"��`�I]�j;����[1%$֋��aTj[�gUj����{(38M����z���(����o�
�����\�`ݞ ��T��e���
��
/ ��`e8D�r6%�
@��
�6�����1eG�(,:�s	������~����+ &�@��l�ZI? ~]`�(�c
��B���� �S<���>�ko��v��aǰ��d
V:o����t��l&M;ֈd
�]{���ɣ�M9���0�������G�]��7>�|^y�p�a�
 ��	�
���@�^�?
+"�ǒ�
+:�^ ��Y��
�Z��o��>��^4�A����ѳ�[f7N�RIqBY(��
 ��>_�7
��
� �	r�y
��r����!�����	{��@<�P��l�,�(9,D���KA�����—�>�(��}����Z�0G�g��|5>�;u�`,�����	���\��!
#��[4��/�<���
z�U!
ru�
+�p Bv��B� �B������*r�L4l���|�K�1F6��S
��ؽ-�����;Zu��*m��<;��"��; ��@�����M��i�] a�d�,}gXO�g@�4�n#�eIy���
ݫ���y

q�r{p�-6��<�'oYկ\%g/��(3�Ѕo�ʓ&���
���Ʌ��ΧZ��(l�G{{e
V���;p-��z�
?. A'���|r"բ���}6
Ѽ�{�4'��ڠN��ro]ⳑ�gN�}:wd�|h�j�>%�-���k�O�A�>ʫ�{$zq�����ڶ�ׅ?�)����
�9(tYK}g��n@I����#��6M4�XTu�}
��
��/���F��:ċ���/��i�=��m����v頛�k_\ӟ���U͋�DZ�롰X�
n������$F�k��̓��)�$��t|�˨��F^R(��ы��Dzo=+�ü��
��Es�w�-!2�
�GAp�;�֒�ճ.ū�5D��3U[�6�_����
��������k��};�s�^�
5>�7�nGe�Y!X�zY�
�(|���޶��� � o�O�
+�ڋA��US]����3�h央�7�x�e[P6�N�u��U=qw�5�o�5c�]nZjT��h[+O�J��� �� 
R	�hr�B�-����;�ևB�~?1��*�
�����k
˓g֦*{�ԶTz�7�.�^~����\_f>��2���s���7�����й#aکZ�Ƥ~X�c7?)���`/�3���L�yz �{��i�������ڈ+����Jꇛ�=ŗQ�
<e at o5�V
+�����Rs�Jy���]WuzE)ñ��=q���ح�;��|"[�]��|�Q�H�����ps�R�hCu�7��^C��z��w�{�U��-S�+���l��m������3~�N��U�b�;���.�QkZa2�d��ʘ��m`�V�VC�߸X��X��S���2o��
i�+�����9��&��
 K���p$����K.ʹ5sr'Dp��׃���6��"A����
+�q��f!ua���M��۶�[��K��u���g��U���0_~�N��h�Fr������
+�&�S���iBoy[\�g���7ZD���=q�E��k�Y-RMl�
rn�W�;ѼW
��t�Pe����]�F��q�L��]1���4�O?�<�~���}n���
�+u���[>�!�h�ʁ<g�Z�����u�GO��y�;��!�O�K
�P��jLN�	��%vPj�k�9�iT�x�?�4��
Yڪs�4d[�i
N���1%!����_��9 ��A�m% �D�V|
+�5
x����g������oʛ�e���x����٨6�NޅffD
�[�6-wXD�|]�8��nY>��p�l(�מɧ��h�<��Q-��3]L%�C����9��x
(q��6� ���OA)����
��w$;�E΃|Zz�f�pCG���$}Ɲ��
������97��5F��벆��
EsQQ.�w�W.e&]��l{eyM�9���"�02Z� ]8e�(/I��g�������*���U�ܶG�Ow��B��;�?'[�^Ԥ�2oo!;��SL_�Ҥ��̂��3��P;���Q$.�v�Fuә�Ji�?I�5A�.�"����������vN��%:J"�x�Ϭ���.�v��"IG
z��๷f����Ֆ�,���D�t_�U=�09Lw���=*K3�;��Ӧ�=ٺ��
1��k�o�S�P⊸�t��; �z:І�����wr97�^|dN�z
+
r���Ǝ���_~�����tی{��yX�7���z`%��}�ٺ����)R*E���؝�Vٛ��_Z��8i��[��gcR ��A�
~�U�.�j�	�
��9
+��C
��S�n+�:�ӽ�R/��٫6
N���1gkk$e��G���Q���C����
W��*��E��aڇ�^kÓ�'��|b
�9��1_����,2�����
 w3�+�ѩ�54���`�b{?�ڱJ;5D�
�I�9`yG�k�輩N�i���Һ�QO�<�li��E�Ց��[؋&�f��<�2l3R��K�ɹ���5�#�s�A�K�ڬ�ҿ������;�7�pk�v�, {���j
+�ح�
+�';�Kд��3������T�ص�\;�p�.D���
�>�A��~�<���R��w�KӕQC�z��#
��
�u�
/�7����� Ԙ
ε���h����tM��f�+ye:K���D�)���>Y�׉v?W(�T˜���Mκ�d�wrH� ��iI��e����6���p�ǵ�e�W�!�쨾9�A]�T���Pl]�Fݺ���Gh`KuOt��4����	f�e�m��d8�7�x8��HC
SE=�h��x
�z�b�+���!����=�o=�Α���{�]m�iI&8D�J���m�w�H�A�䜙֎��\�S}��?����(�;�k*�a�\*RT�E��M�yK����j*c0 �$��$
ھܜL�֪�96��ZOl՗%�o��v�}��9���66R'l[5�k���N��Xc��}!_a��Ѹz��۪-�2U�[,����`Sr����gO�\
ov^iX���F'���S�*����2K,�h��-�
D��p'����<�+r���
�����H�N=��ļ�ZM�eK�P�}X��TD+'{�Xv�%_��� b�;<I���'q͏7���X�q��o��f��+7_ۙ$c�B͑��河9p�a��&��
X������W�՛�4�t��*H��9�Œ�Ծ��wGE��y?Ha3>�
r={�P�"��
8�x}B�]��>Qdrj�������'�굫��k~V9�C���[c7qȆNqR�[i��@��2O���@OvE����mt-��Q��ɇ���Z�<
�"�.c�@ݷu��ӦXr5�~�\�t�o̲gMD�){Dn��$#IY(��
+ϧ�"���B��N�l))U+��zڹ�R�d	�Ͱ�a��B/r�j��J���E݃T��f���������"v&��“�D��
��Q0��; ��
+ at F���5�
��r���
`HϒR���-�t���<� � c�&@3A 0�*Or��� k�
��I
 ��.A�x�R�SrLNO�ב��_�b�?BQn	�^�S
�-
 �S�:*
��QV�x7����oYF\����U(�� J7�h{
���
+P��H�, $�p 	K
��ߦ?�w:�
�{%��,)2�r��A�>���E
+5�3��[���O�
�8Ģ�I�l�x k
`E�$
+�[V�.�%
=t�j�B� *8�:||�R+g ���'B (�T �F�����N��l��h�v������P�a�
� ��
�
�wv�b�7�T��h����
+,AрU��� �g�_�Y�-�r Pۅ}C�� ���@�_h�������e���o>o�l� �+��$w��g���+ �m�V�V%:����1��k���-�/t��y
p�� �S ���|r��D)g���+X{(y	{������ :vj	�+1e�f]�Y
��7�m�>��˘J��Z��w%
+x���C�݁+���0��^ �b��}��;� A�v �Ko�k^���KV�%[�$�͟����'�c�f����Լ��T�iS)��`r��������pcW�M��.4��~@�����f;
�o�G at H�A��
�=	��B;��e ���5{c}1�_g8~��2������.O�_����<H?w��֭���W�H�CY ��`83����=`���}
�_�@�F����2*P�+�9aZ9=+CH3��%ٯ�H�z�=)�|Z7x�G
�;�w�w�U]ݖob��QxE�{
ʹz���ʙ9��~q�����!k۠�7
+:�6�Ͱ�+�|�0� �%#��+�~g'.?X@����2����5d���E�����3DF���*ں襳s.p���r��
�y����7ѝ ?�[iU�n�����5ɿ1�z�V�j<���d
Ɵ������w>0H�P���^Rr�>�רi���"���\��#�p9�����.��p���U�y��p̈�f�&�� E�5�@���IX�p�ǻ��:����X�����M�W �ei �Ua��P��z �w& �h
��A\��O7���;
/���=s
� R�gV����-CnC�51�

+�+��g�<�^�`�q�u������[���9��<�D�<;څ¬�b�_�����t���B���a6����
D?rf�����Uˉ���i�Ck_��c�Ђ��v����yݛ]��ra#�E;��ue7rw�n��?��6c2CvZ*�%g4W�(-���m��a�T� �i�lJ1�E��3�㲕hϔ-�~��Ry�.�9����X ֗�=�U
� ��K���
ԟ��}������35�HwFF4�<�T0�ӋxR�c9����������?���	�>�������3

+�H��L+zy�

��fxa����&���޸l�I��O���k�FzL��[�s�J�^R��	�:��?N�r��He�δ�Q�x��|��GۤF�M
e��@44�}����Nbn�� � V�M'���yl�7���/#y<=�s���>8l�y������r໗ozz}D��~4r
����<
ؑ$O�C�fȖ����<y�֢[f�ʞ0�d���#|��Q�W l�����n�
����?W�Q��!��(��i���#�b=
�7�yvrZ��suO�!�޶$�ĽAz�2R�(�
ɡ��J=C�f�F$�l��}ӽ��<g�r"Ⴧ��N��
?����Xv ���$��JOހ�G̫���{o�6�2�~{�o������{�[s?��eV�
�D�E�L����z�<c
�E�4�gިTW���:j��8��V!��n.�����y,������2P��=��;�Yߒ� ��a��V�Q�l�<E�ͽ,u��]hث��_,��g=�ΰ��\+��PR�
_�	�f�~f�� [...]
YxiM��?��>�2��#����LV?����>���p`���.o�T
+Ŕ��x�p���I�Ok��v�:���-]
+���yw/�YZ_bu\CkQ^%�����^���z�{|T(��*T��Rԁ��p��A�q�Vi ���
+��P���+G���+r�UZ�~{3�MٴV^��Zq4���|��7W;�|�����}�
�R��[�
(�㒽p:(u�#�խF�!E�Ѧ{"�^9�O�,� ��}R�碻 �h����i8�m��m����<���L�r��B��^���$i6F�]oط͵YM����;�Hո������l���2.��F�$��I)�*z�����-#5�tJr�-9a�
+ at 0}����a{�Y�v���1�w{� �jy�]����B?���u����$k��#�N�L�������(�8�TA��%�r�N�~"q;6�IK���&
u�[J{W��ZX�Eq�Έ�!��% ����94����Տ��v>OTbr����髌��wԣ�1�`�
ǔ[-�9'���;��c��
��.��s&��g��m��ؒ�Eb'jdbX�Z�z�m1�-�a�����nS�4�V�w�����_r�ۆ~���\����O����l@����剿
\ߓ��}^.�Q��w*��4��j����q�4V.���{b��F�ێ�
��vd>�zAJ�
+O��ˡ\m���^���/����
_��r��/�|������&��}��o�Vv������:����³;��_����c%����i�a�rڋ�65%
ﭞC
iI��s��N��V�����|�iN&>��ܐm|�%��8>������”�f�Gq�6'�~�?����R^�=��5���
+)-:
f�Pg���vV��z�J�h8j���z>J��F8�
+:R�+-5I,����
��x�a����s��F�K9U�! �^Z7�ޥ�~��
�끘�Y�-4��B�W�z��=��nk}���*k���e��S�
a�?�'�`�ǭ��������Io�J��.w?�zKB�H���h��������L��
�����ҩj�z�4j{��4B[մ�����S���G���8��^k�0n%�IunL����qn�㇬Wu��
�J%���1��\�HA�N�;*� B������Tь漯M9ϒW�`��8���$�Ej��*��XYc
�lQ���b��T�G�P���⯀�
�x��>�Si~�`y�}��m�
fܯ���My:��޸�����Q; �v��&
�l~0��̐|�C�� xA���l�N���s��l���F#��Z+U�^(Vꏶ]�?�rҟe ���bTZе鼻bΦ�8grM3��_q]�����}���$c\ 2�۾M{g��0Η#А��L��O���Y�W��Ŝ�D��[i`�A�U^���[���V
+�t��h�/Jl{�}�5�_�؏�)W$Q���1g3Y�x\"r"prWJ�4q�/i�j��|Z
rR����y^T�>[��;�7-�*
����
,�R�|J�K
޾ԡ
2۩0���P?-q'?�u���^�p�� *诘���7����3�{Z�>#�z���t4�Tm�G�ϧ�U�ku� C0�>�l��-'��=�/���Q�
����O*Y��~�ӡ���zy��`�SL:��K�ɹ����%_">��I|
��Wػ2�1��
h�^w�m�%\�z�O�|���E�N]�췏�>Rq+}vt�(1g� ���b�D��Z�.g+,��x�tT��%'D$>a�#�r���$=�ф�a2_
��]��P��FPMc?
� B�� ;� ic@n�
��}P�t��B ��W2��)@:00F��
 �
+�.�,�|sY�� {�`��R6����� {o�!
",��#S���&]�T���y�����?y[܁B{���h�Ǡ����Z ��	 �!��/@x	Bl�0� ���!�� ���X�w! 9���$8��x{��b�hU~@*s �o�O:��q�f�����"�2Q(?���h.�4�:�8�@�1	����m�
<X�j�[��� � M����(,ߔ��G�������jхb+ ǖ���o ��A����W:
�.��X� �^� �t 
�}�΋+�*���c�� 4#6 �aU�q��|`$`� �Z��L� �FA���O�Xyݻ/��t�������xV�W�W�G�"� ԰��
쟼�xt �yC�y�MV<�$�X� �o�
�V�j� Z�ÒRW
����_����8�xg���Ѡ��2*���͡��*�u
�վ�<��}�� Q(�M� }m��C�
�]� Wzi�]�m�pJ
�4�ζ��`\1з�&U�׵x_0�1����)=�_�Ip�.�9�J�J�YeZ�{��Z����m�[�'
+W�&��=ٿ���@�[�
��
�Pc	�9
,����2���.�w�	���!ٞ�w|�s�s�X~�5����>�
���ƕ'k.�	gn���v�PI��Q�p
��˾`v.�v$��~�x3����¯ ��,�^)k �2�d�����
S踈@�A
T@��Y|�·W�G�g��>^�$�M�jX�[6��]%�l������-.�I����
�J�G
�LP�'A��fG�,�Oq��6H_
y��~@�W`Y[��$A�
|�G Ƕ��u�1-
,�Nd+��1�ܮ?�=}뼯�Bq�\�}�=]��h���qG��
����2���n���"�ȥ
����v��j�ଓ%�:�Q��b��?�����S
�	���w�]m��0�r�i�9��/Y5���#eޖ7
o
C�r��R	I
�a��/	��eq��ev�d��_�+4�3Y
��<��r�b�X�{�7���:U���̲e}����gt����	�L&�����Iv�ィ�(
��8t�tŸ���b�O�cC��{!�ܷ�{?ِ�l:�t<ܿ� [...]
+��"0H綝N��g&ϧ��o���� �3͙'���s���
+]�@u�<
M�廤���^H�IJ���O6�e�
�`�n�\N���#w���g�x�NMM���3����9�q<��1w=M��n��.7|�t�^|.)��
�_mH�2-ʌp�D�(��N���wy�
��
����1U�{��S6�9
�43��u~�̾��\����9��V�9�S�
'-/k�!igr�ʨ�:�����9zn�Dz�1T8�
�E��E�+���$�o�����W�g@����#�����#B�rc��cT��i]�����%rM�9�V�3C^m��Y:L�&
�H-�n�=��f�{H�<	8g2���^ck�}`�3��9��o��yF���|��.tH=vNq	ۼ�
�T4���M�"�K���uY.m�����O_�2G˜��t<3;�3A���M�6�X#�M]�
����L� ���Ɂ=4���y����r�.��`\6?�qn�x�
+h�.�Y7M�5�
ls��'��lq2�2��ɧ�A�w�Xf֕a��J���B�4��p!���p���ǵ���
��cm���	��17H�o<>�·hQ��
A��TO��>_S@��J���C��+ v�� џY��P�sM
+<{\�5�~��
���cҟ���2 ��m�L�Sޘ���
��i3
�za^�sߨ�j�~,�C}�ؽ4�t3jW[������4�� ����>��b
Q?�_p"��-H
�C at r(���k)�n��9<%��a��ԟ0N
����*/�㒟
��4��fc
5E���|̌j�{��)��3��Q]��E��]�>��z&e�z�3��]�|�j�Ban�����
+��>�_Y1r
+�/�z�.��
?��
�nۂv��J?��r#t�n�Z
'^
ű譔����_�/v:��jq����W�u{'���3���;:e1ire+R}xR��W�w�6�W�7��
��
�9���ބ�Fd
���:��5��?_�o��
 ,h�"��W�Lھ���f�*n]Ũ�9�鷺��u��r�
�`S��%��:�|Ȋ�U�(f�+.��3'�KjXe��� M�	e�Z�njg�^Zٯ���=�^Ʀ��c����>��s�8��U�e�[�Vm�����������s�q��lϺ��g�y����m���=h���0m2'�me���u�D$�ŢX�
��P_�]Sw.��t�ٞ��l�aE�[ǖ��e>/���2�\�3�
94j��1�>\_������ �߳󫡔�I�=�x�:\nۻ�����y��9�E�\�`
,�6Uʁ��Ğ ����ȥW�g3O)G�)͝Z�k6uV^o",Uvҝ�F;{�g�	�'��e�B��}�MU#k��|=�b��F�D�?��K#A>~�6-�!�5^����^�
�9_�p�j�����i���\�+ at n~�/��m�J
#��=7�V�=U_
���V�a{�"3�+�Q��Ofy$}��c
�1�H���V�t��=v������2
�_yR�f-�B�{�?�E�e~�F�%�Fz��
.�l�
��q����ǻ��
y#�n�ᬶ�,���В���˳N�R��<]�
�
adr-:���e�7����q^ƻ��U�HG�&
r�v��=��Gff4���p��
��,���ݧ�1D��I���\7u�8�������Dž�	ǔ;�3��	
��J9?��0
+��Ys6�D#S~
�����R;��%��KZ���R`�y�5һ
_'�����3���7�i Q1��
kjk�b��w��;s��Ά����o
+���;�֢���>ťLf���68��TIb
v�1���}ٛ�ZASl�U%]/��v�}�"
��W�Q?dy�1%��zX���Ր�C�.߆f�P
�qر�]�U���\��J�(���i�a�ϕG�T
�
��@�Ζ&ݲ�B'��
�|;;����_E�2�V�^��$|<�
+�YA���2�K�Wn%JQc���;[!k�i�X˿
�-e
�:F�y}�+�*�/�|�UnJ�\�S�Z�Ž��۩����?��}��`tε�Jv"�g�y�R�j�U�'޽���%��"s���(�|ڝr�,y
�Boj';ubC�u���׸�.�J��v)�[��T��	�RQ*w��f<]�z�T �����h���hmf�+�̾�qR��ghO0�VJ/�m^?H7sb#q@�lۮ6�<�:s�D����z5&J�ջ{3*������)-5sQ�_Do�@D�
�5�Q~в�t��)��&5�m�([����P}���$��̯p�����)7�zH��qk���ˣ���V��U�P�h�g�n����%׊��(�\��b �ϵK��[�����vg;��n�/�քPM]p�a.5�9
�*�Y������9����5X�Їr=�W���-���q�E�VטEȖ����Ȅ��R<�hX���8����M�3��b�
� �h�g�XZ���
�8gʘ�D��~I	(���Ƞ����^f-5>f-���e�L�
+�E�5�E�߬�
��k �� $��
�ɿ�l@�3cPY.�@�T�A��� �y^@6U�A���@�(��
2�2GC�Sց�6�d�(��K��
xx�|��
Y��l��>�
@�)(T� i;k�ctH����٭����Y�3��n�<r���� [
��<Ȓi�I�kALU��0��C$���� �G������5@��.��[m�����/�3���;�,� ���=� �0
+�ƣ)�^�[��T��>���ˁ�A�' �tE���jn����AV#	����t��x�Id,�D�[�_��2�� �
+e�y�ť
�&q��o��$ r�4 2���� ��G�0�7a?˂lr�A�,�^�Uy
��!��
+
�=�>�r:��,�t+�_t��G��"�s���'s��v��_	{䖕�վ��hиw�8� :�� ��<@�
��� �� �� ��w*d�� "�8�4�D0H��y
�U�
�Kj�Ș
���
��ܐy��]�
׸�}����,�"�`��sz��-+ }��Ī��:؄� ��)

��C��+�7~O��E:!������
�����+�����Q����[M<� ��g��s�zk��u��1���µ3!ž4�~ls6��
+e���h��$ x�1T�� �\W������S�$�V>x���%
+�[��}VG>���n�Qo���l�K����nmt?���hp�C�貓����m��%�S�;aaǪ-e� �~�C��������鲢�׿}� d�y�	Q�AAP�������몮��z�\���|H����!4�
�{�E��k2�H�d��d�92�L+a�<�
r�2nd���h�w=J�7Sw?Wk�?�5-.Jav�k�G���`r	.=�|�2�E�����u2�zFJƱ�
̙t��C�g����O~l�5��.~�T!d����V�.�
+�'���\¾��gM:
�9�� Ԯv�߅9�q���r�H� x�냺�{ɺ}�-��7��X���I
!{��j���E���"�Ju�Y׌���������p���N����e&�
�Z�r�Tr#>���o�
QaO�M*G^�(��7��W�d����9a>8�6�����>�
��E��D�������U���&�l3��vئط9Hm�9���NYݿ�1��? i��b�Q 3��0�{oA���������R:���
����
��{0u��Ft�D9毒a���Z���
��n=\��mw��)��5�m'Gu�;y|��T��s1��f����8��p��"�
 =y��0�	Ȅ��͐�U���I�
���S%2
�+f��**M;�G�v���+XM�Sv�'�5�a�6����һM�3"oxn�Z�6�[W�zK[�����~�F%%��J�5��C���@U���7�Ι�B���%X�f��,���||��ו�Eo���2��W~p'?&���ˍ�Z�1��(	��m���sP���*v�U�
+U�c��٢�n��J
V��Ɉu���h�
ww�������~��? i� A�v�a����wSƺ�lN���$׾a�����K9n���oF�د#�4��
�u�'V/暋��
MFe
�Xg��+$U�d��+ܿ&�i-��Nܠ)僔(�j�Yf��m9}7�e�T=��hC�>�Lc(�
�@�����M�(Yn/W�y���D��:�S��R��O���)�7�qJk�Ȩ�e�P�B���ۮ��ږ�*}/�q�	
+Y�������?��fJ�E���X)���]����@�ZP�1;���|Ϸ���{y���1�ܨ�9�2O���-���
�
�*��A}�������
+SyǤ��$X���h���[�X���#��s0��A�'z!��S��\�>���Z����i�
�ǿ�����p}��.C�ü
+�
%Lcw��������K�]�X���=X�?�d���E��^
�-���=y_)�V��n*�\�+�������ge����p杍9�h�d��v�Ѹ�Pr�A-}�������sChC
vͶG��q�?�e=��ψҒ���4l558�v��l=r�o�[AMv庂��*�{�y��7a����W�`m9�0�"{�yl
���1�v�g�k��Җu��O��� ���
MY�����	��vw&�x�����u~�5�����̲�Ы-��
�c�h
WV�n�)	����KP��4�
i�q�]��U���+�=
�ǀ���7��
+5z�VũX�Y�yc���K��������-(�➍�(����v���tj�)gn�g���;�0���8	�]�@���2��? j�G�oϓ��G�9ť�2ð'W��xЕU��v�(����'�F����֜OTw��WIѣ�֑��+�o 1
�\�஧��='~��f�y
����ʦw�MΘ�0�n�u�H{��RY�4!��p�2~����S�u��!S���T�d�n�G+*9ַ�Ϯ���,
YSPMrwfl�����|�)�H%w`��	�q�5�p|{M
�T;v����)�msv*��k.Qa�39*��s_^���
�qh�ﻒ����2�9
�9m4���z9c�A�.��
���i�3�������C&�G�M9��wc�o���\�I��;
��)�k�\8�
�lco���c&U�z�G�(�*v"v+��\D��DB�C |�g���YM�j�zJ��k�{uD�������zPr��~������!W5����vP�wp^y���ڇ� �&I��C��Z�a�X� [...]
+Jwk�VɄ�Θ���2�vv��E�ݩ;x��aۿ!<��t��XX�]�����Nk����OMK��[�����FE����S�;�#o���}<#���eM���-�I��%ʥ��lB���w8Zv��jO?�[;�~�-�1��~g��vjO/ı=�R��p�8��q�r
{��l��
�m����)1^%��
�0�g��\`n��?}qK#+I�2Ln?��ep+�}�DȞ�!z�e��
ϛ�-u�6�LW-��ٷJ�̽�xl���\saU��B�ͅ �������ᔫ��V�R�n/�
��.w���@���k>ٗ�6�49UzT�Ԭٟ��!
�릯qޑ�Ww��C��M���!�B���fK�
F��{	�z�m4d]�-��՟�G��Y�Zׄd_�������f9�{��֖
+�
y��5���˽3���A������qe0�R�i�7u���_�]��N~28�K��o-�t�\&,҈��|�5�4� ׌zI��k��z_ݏ�a�*��U�*ͪ��Q�8��Ct��`N�<�i^�D!��]�<�יr����#1��
�γ�}#�xG�(�w�k�m
hCl�
\n6�̶�I������gnUK�$��W�O�\�z+�\xG\IU�R�z�u��bx,�Ei�
���d=<��ͽ�M�����V��Ǎ
��
�LM��7�-ÁN1N�ҧs�S���V�k�V*۪'vB�>���j	&
��aʮ*	�B"˥JJ����/�S����%�wK�t.	�FN�T�_�H��coeMu�@�ӿA��W$��&T8��pFn�m�ʶ�n_c
+��4�9�/��޼oȸ�E?��ǹ���|�Vfu>].�z�R�S��^.��W-��͜>����t
e�G�dү�D�����vw����~��^.]L�����
�'7�
ҭP�����2
endstream
endobj
127 0 obj
<</Length 65536>>stream
+k#[w|zeN�n#�k{4�6�~��¬��ծ�j
8��
�ޱ� S�%��m.�~i
dG��53i�
�q]{�]#�NsC(�busx�U�z~�A�6A4�x�m*��SJW����?��� 4�V:�7��$��
+b���2@�`�e�
+��h�'��!@bw?�A
��3@��
 
���0��(�� ���#��;]x�U��_���p��_��ͩ	���9�}�6�r �

+�*бB�p�s����:�F m���������CtRb��	~w�ԇ� �T��q���
��o��AxM�W7L���������^Q
�kC�ge���v�A��
�	n
�^� X�k��~ߐ���%@ͩqp*��E�j��O�o2�5 :�
!
+�
+}�8�@t��IzƯ�?^ٽt{����E�?��2ls����������
��L�%�84���,��f`�g0rk��� ^>�r�b�XJ�@ܾ�JÐRb���)'�69����|���N^q�^yD�T�
I;����7 48�����������Oz��>9s4�I_ �� ��[q�xv����<x�0}
 &��Į���;����Y��_9�Y>��Ί���?
p�x�l��
z��{S`0���vȄ�`�[
�H
+u�HW��������
+Ң��t6,�t�3��Z$���0�S�p^��>|����Y�^�x����ZH*�r���F�<z<�����N�ۖ	�ם�D�� ����qpJ���
� ?�����s ��B�
ҕ�Of0�O���0���w at t�H'�j2�Q�祖��C��v���h�
�н�7�cr{�
�6�����n�ֿ��G7���,�Ԥ��A����
�
�r�Ԋ���tv7��d~��h4%(�2�X#�ģ�}����g���2�4���r,���Ǔ��w}^Y܆���JٞNY�
�	��[>�*��oR'�E
+Y�����nj�d�K����'���q*o/?�1;Z���8���� �e��]�'xw�{�]��}k�5�
X<_���F�e��k�v�7�~�[��������|�檧�M�Ջ���$��	
$'ݹ$ǩt�'�r�gϥ�d���n��^.�wqh�_�ß_�Hk(T�F �
�Mߡ$���e0�G1wz��	���@)�"5�W��s��ı�#�� ���MR���{+��U�m�}��?�N�
03a��I^#���@o3��2�qk�/����w[�������|b]@|�1�$��݋�9t}����
�rd4��}���]�0��|��a5�
�: ��aIY�b�ݷވ�����a�������nb}����Pn�/�a��s��z��z��`��^
r�LE�
�|�Mh9�����:�56���
;�-7?\����l%tw���ɾG衬�E�I6������M
����d��b"蹷+o��k��~Жy3P�%Q[N1���#���EY����v�[�E��`�@zb7����������ϫ�K#~<"�v >z �9�8��aF�;R�{�m����%��w�ɽt7�6Z���L[���*
����a�[�
+�J9��՘�aK�|t��#W8�nW�����*�YQ���`��`}ޅ>�M䐗
r����z- ��d
�?M;��xw.�WJ~��f�l�Q3�>ny-e�u�9v�N��ʈ;^��uC]fV%Sb.���_��XZe*bɭ��L4�
7R���YR*�
�7������
�RS䆸
����
����ku���v�ZQ���Aк��l|1���E?�j��}#[nِ�M��Js�X:�3+������Z�y���ģ�\�
3suIO��b&
2vׄ;�V�GS�
��R-�!5�!QY6n��Y f۝K\l�g�n
O�ԙ=ԞCuO
��q0
�>G�1?�%%%)��d�)/s�sS* �\����|
��*��M8�p�����
ㆇې����$�Oޖ2��w�7@ʵAfs���ܕ��5=�a�\�|��jeiK;�0~1-e�������M}�)� 
]��vF�VAA\buQW�
�5K��ug��͕8�rٲ����̚ԛ���$K�k�]8��5����� ��@���?0m,N����S7��uǫw��CN��)��١�݄�:�(C6
��u�#�I��������k����Er�!�,!�&�p�Yq�9Sኾ��eܚy~�)��0�܊q���7 �l�A��
nv}\��/� ]�\(9��T׵[�z]�g�G����U[�Ԓ�|���:R��t)���<!��
�y/A�ܾ�UY�uF�g�<�N��B7r-��(�����R�ۯ�G�V�.^�j���o������0�{A�{G��)�	
�+-�WaT���ݖ�W��Mc [...]
�.u�d��-d�v���#ҕ0Xҩ��n�mmA���z�Ũ-.Ǔ��n>��.?N8�vO1�-wЭ��}����V�Hj�����z�Q��
�G�pxı��:7�1�B�c�ږƟ5#�hCR�F���y�Hg
W�^�~���~�{�q:
��n�
��S,�Ŭ�����e'lj��'v!�$��)`z5fݺ����x��vF�s9
Ό�0pcG{9�)�/�kfP���a�
+��S�.G���^X��*E3}�������13�R�_�Z��͕�n(��f��$$���V1e�.��f��}�63�x��)j�x�Ǹh����
�3�aa-x�Fx:�`��^T������[n/�"�"/�����#���.Q��u����(����8������Kvx�*~jE��.��]��k��9�v&��
?�ˤ_���Sx�f�������ÞR#�M�ߋ�6�M��%���%�
�%7訛�Ob��GbO=#��p��缻���A:��>�D�s���EO��O��
>��
�\�3�֐-i`>�:
���y�ڝ��8C����ע�������O�������릶�3�sj۞�n�����m��q�E��3:���/�i�)�]��u��������L��}Y
6����!玄'{��,S���i缄��d�5��1�RGa�����_
;W��^=rJ��!�+w(:�iO��u��j�P���B/&Z��i�*�b+�����9��T�m���]R$�fu [...]
j[�H�;�%�c�ܬطմ�iFj��-/��.�	���h^f�}�7�@7��^��G��n��C�-ߡ����y�5��g�{�����$�T��}2� D+͕
�
:$�${�jC��V��.U��X�d�]���z?xI@:Q1��t����}I�y�����ϗ��
�Z�8�
����9�
����U8:�S�ܼ8���lLi���ޔ�γ��ʟ��a5��U��_,��S+]6�V14�n���G�VF��5v'�t�V����ʎ��k�ҖHf�K�2�7GG#��+T̓O��$��O�W]�86����y�2{�i_i���vvj���U�8�Ym�
�ťT~3�b

D?x>v��\⽓�'�}��Z�g&�0G
��r�5��47*
�=��J��`����Z]L��V/�
�
8�� *�ۅsQ�H��͇�g�#�%�BmKO��4�2�܋�p;]d���YZ����:�޴M&
�t"
�F�tm��o9�@�.�4�^ѻ7z��H
�S)]��~k[O��E
+B_����
��BD�� �f��[+�&� J�[��r� QJ@��wWsw. ��,)u\�AJ��Aj[� 
�(��2�AjU�!�g�CRr)�P�]~�s�
+⡂����W�ﯿ ��<@��@��o�6hT| ��O�cd�x�=@�Tj�HyWH%�1��B�
��{$S�AL
�}R��	��0
qk$7�@������b$��h$c��x��
 1�9�p^��`�$����$��4
��I
����l1��A VV��1� ���= d�z�
 b
6�8�B�Z ��݀
(�~P7_*g�2���y�zƓ���!�*�? ȧ�
��JA
`����
�TO ؄�V� �j��+�� (������7>h��8�A��bth�� �0�=�T�|7I���m��g��qy��#ѦwQ��Qm16�j������?��I���ǡШ�x~;x3'�03 v�� Ӓ`t�\�a��C���17�S�ɤx��X�����,$���bO�k�ڊ�j�D�8Z=�oĸwQľ��u�O��'9�WS�ll�U`JT�⪵?��e�,��~�[����� u> Ǥ"��K��G��M,�YܺZ,D�W�w'��8x<r�;�3��G��w�8��@�^� ��Eh�
+z��e+ȉ�Ͻc����e�j�o�Ui ��P���u�wAcz1b���SAzS����\A:+�^�w+��UcBԣU
+

J��צ������Uowݱ��Y�҄����
+����	ӹT�[�{��>���^���=�������H��-���3�|��&�P��������1f�
zR�J}F�p���C�pC�x3<l�Ap�f���..A{�������{Q�iy�����vz���@8��6<�;?0׃j�{Ş獥]�6������ �A�N��: F��7?�&���M�x�!^
+���MF�
[�W��p����s��jn2
uO�57>��8��8Nk�p��y�)Ǟg��
+��۪���q/Bv�r��L0wen��hn��$�� �@
+ ]YT�K�.��̬e�ͳzO���~d\ao<��ܧ;��Ñ3ѕ�1WT�O�m�/�Usn��*:�wj�_�I���$

#�o�#�-ſ��1�3�4y�z6|
+z��/�������唠Pa
�r�����w'A�uIM�GҕVשk�|�R�=�6��CC�
ΩJlW3���!���)�L=�4
ӽ���L�?��Y�>+Xˍ+��M�INk��yj�W�ڛ
i�Zf�էm^}��� {�� �k���
+�;G��1=�>�
}������\gA�Zb�~{*9S`�r�8Z��:�m�|l"m���НE����\c�w��uEzRZ��r�|x��|2�+Y?x���K�ovtٙ�}���0�2l��o��3.��LM&A6]�>k�E?��9	�{�<wCjp"V1�t*�>��;�3�C�H�b����sÃGj]�+i�1�Kj��k(�Z�'0�Z�z~iK���i���;�
�����t�W�b,��M�/~�?��,ˀ`AdD��W�b7toF�_d��p�U/�;���V�T���
w[/���Zt̫��L^��ˤ��:����TZ���/3�/�;�X���ł7
�fBa�EJ­�
.�6G/ĢN-Ė5Z�#�_����2M���D�w�U�/�l�/+G�4sNޘ��ƞ���7��KՋb�X׻ǣ�Q݋B�ϻ��֯�!����2�YEˋ@LZ�G󈎹y�-��Mqu���0�o(����85�w���\=���vN�Н�ī�]	.q;�J��>v����A�`��f
+}S�h��sj�\/9t������jച�K����f�`���p���y�	5���H8�3ڊ���FC����
�m)n�#���G�
��w�D�2윭ڍ�Wi��_wwo���C�冓�ԇ�ۡ�Ak��#jS
HA}u-UA�cE��5�(
�pQo��<�S>��i�c�?ơZ�æ�9���+���Ya9|�\z�d��ޘ9�K��o DӇ2E��l=w_$8���
�o{�L 
�?�j�8���^֍���iV1a���׵t��X-�
�3.�umx��6��F[��D��3��ӜK�pZ��<-�8O���Bm*��_�~�1�q����?�6��bׯ�<A<$[N

�ޙ%{��9ao��8��2?�d
N�4�Z,
E[kh�c��;���f��H1���
��>3���N�E�^f���),�����
+W�)]*e��
�=��\��
�0
��>���Q�|N�B�
BDxZ�\.�a��}�l�����i�-[W�Zr�/Jե,��{�J�=�7�;��>�?��iП$���NO�{�>�����ԛ���V
��~0F�Ril I���>�!n$���� >���X
b
8t`U^���
[��|�#wi��%��~��ޥ	e<��W�h2�#��ͱ4O��*7�Q�.��L@,oZ�&�$.U�T�ͣcC{F��9<h��0���d�0�i凇c�7��y���F�7$�[��E4��x3~
�3���Td8,ӫ���z�����RjŀYI��DGxU��<p�#�Ւ���7�����

+Τ˷|�?-Fc4~|���9;p�AcP�f�~9,�Pn��,��9�
+�&9pu�z��A����[)�����ˊ�:l��>ȇ�Kd=�p���K:���
�
+IѮ�Qt0�2��aJ�t1]e�����uj��X�X�F4G܇9�'}_=�ɫ
@o��G���t�b�RN���e{J��&�f�\����pK/X�K}��U���[�2��ՒqQ(!q��ص�B{��?6
+,��g�����N��]�Й����d7d��q0_a��x��f9�{�ܻ�%˥aǐ�ΰ�;v��"�1�{��6
d��i‘�{����B}P�4q_�&��&q�>6�T�C��-/�tXtm���r��
1�1HO�B��a��
ӓ1�����?�@�w7}ɯXdk�}.OHE�>� �ѼTnO��&��:F�Ck&����F�m���g���Y��:{�F�'�}q-]��gz^q���x�S{���lEn��E
M�2�y2�i#���IHŤ�+R���+�z��
��3�k��Z��Ѕ湿�5�,�	�P��&a�T�V#Ȱ����:����k�?��-�
n�+0|yF|\QI��9�\�L
?�'f��
�ʉ	��[v����߃z_��[c��Y�쥰	��2#�CFZ;WY�bcri
+s�Ր$;[�GX�.�5�ޚt�z�G��vh�b�ܫi�M�~��?�[���p��c
�PI�
�T�g��x��1"�LL:+���$����b��!k=���s
�]i��ѠU�G3Xcb�����ף�y����F6���;�Z�a��TQⰯ"�s���2�ʾ�&+c���^\��*���9KR�}������>1�Mu��&"��]�)�Km�-ڭ�e�*]
4��h��^����V
4R�Z�"���X�*vn����g��U�
g����ѲT<SR��עO�E�ʴ��i��
zu���Cyx^V(����b�=���6�
�+���µY�5m6ʶ�P ����M�֌r�YCt��;:W�L�����|�
{MkU_,���&c#/ߡ�W.��J9R���x�d�t/�ɫ�5�j+;
d�����~����
O�`l&D��d��h�j�[���·����w{�Qm�[�t�8��}w.��[I������ OT4�1b&�����'\ճ������
�8n��KU�iz�i���^�8-���D��/.�����]a{H�ly�0'��p=��4�c{k=oJYuR�3�A�4A��E[�Ei�*���ڬ���|a�
Uc+3i^��Q�xD\�47�G�e�|�
+A���˨<u�84��H��T��)]Cީ~�-��=|Q���E�]<��eۜ�Ov3��G�Ki[�Y�����
}��*���4����ُOPk��~�֪=K���IS<�
cF��-�w�'#�_�R�-�M��Ub@<A
+9�G7�o
B��I� D�iMAdѿ���=��E� Ҽ��&�p�@Z�*H��&H��C�ʨ��s�6��l�ɇS"�7�|�A	b�N>co�|(l
+� $�����gR8A�q�Y�r�DO���_ 5�L6�⦡L�
e��
+@���7��T' �D���� U[�����T�A@(����:�'"(�.
!I�:��(l����#>=�ϓ*�t@
+��/�y>M�,�,[b��e������P��
��r�52����$@�7�qC��A*��:H�
HI^�{/�� b4���P�Uր
!��d�
aT at J�lS���12E��./.������5��WHT$��
��0j ��@g
�9E��q���d�@ �� �;
�
+���Z�@P�w�u���ݛ��~�+O�'c�r�F��Yx���c����N�{�!�� ����t� ����F�›�w5���<2� 
���	����û*����~{$
���k���6����O>���-�q&Q�����,��;���F�
�a~���������?�_0!��g� ��5N�P~���g���hn	0�oL�. ���븷�ۥ��ح�
8�<�j��q�����_W��A��������H�~6
Z-�L߹��Z�E�`�Y�{S�S&�<��_��@��Na�_� O�3�
+�
��-7�i���ڿ
��b�H��r����-}¡t�;��u���C+��!Q������\)�����/��>�����xy��*�]z�=�W���Co��M��Ѯl���U���� k��>{(s��|��5�^�^s
,
��h�19Z��y����h�kH{�$ȓp�R�d�UO�T���i��
R����K�RzWvƩ�q����H���C��v�e��b��׻5�/M���������� ��0��#ࠝ��l k}��&�*'�G�R�QY������b��b�
+\�3�O�W�8������#�s������p�������o��7������|����n[��
D�z��v�{�im�s�_��4�L'���N�%@��w��0a��4j���
��&���s�0%7�/n��}g\�����D��.�w�&̛���j��K�0�pd����RX����
�z���%��g��]�_��z~�[�y�o��"R� ���B�
+�<��Pa�
2Ys����m�97��iz���c'<�`�oK�um��w�qw<=�{�f�>�l)�D�i�g7nٯl
+�kg=��X
��\���u幾����醢u���%��/`ħt+��? ��J��M ��^���?^�L���b�v�9��,权�k
���jl�ܮ7���"ַ4j�zn9�6�y����+}�I
+����U�ӻ�t1�+�o�Z�ö������Ejim��Xͥ�rkK8$T�(����
��6�����~���z]VA�h�{r��%~����}\9t�wB�n���Ă�L׮��Vn�)�
s���~�)�DVؠ�]N�d]��
Rt,�
t��d�\�]%��i�&�zU,>��/�� �O
+��t|=��0�Pѥ��?܏��]��
��'���)g~���7�,���
�ֵ�s�F���l���<��Wc5���p����%z_��VXT|�%�o�d��Iy�z!�y�sEU��q��(��Q�S�s�
���ae6���x{z��.}����h��ý����nK
��d��Ū�[� 1Q;�%'�Ui��F�rځv�����9>�,��]X���\9a�B�U�Mt܀�)���H�x�2g�{%���/�� v���_�f����e�ڋ�#�ڝ�<��k�t3���=�X\/�zS�<g(�rc�J;�\r;�R�{5m!�?��Zݝ�*��a�'gt�(���,��
�N*л`2�e�d�ۇ���E�`��l��/�����9�賊d���8��~a8���|�f��;�|���xo��$�>�G��O�0�!�)�SEF��j
ι�s��ox���9��>iݘã�f��q~V���霳�i�4ҧ��L/�iaVX�3�v���7�
�����A�2��[O|�+<\�R����γ [...]
�����x�o��v�D`m��0����T�oO߹��Ɏ'�u�a\s.��������i�>m���(����Nn��R� ��_3���~�Ip��׋����-�̵\0-Uoh�l������QtN�o>Yj���}r*M�̲�3y*���gM_���DY�.���x�̑ю
#��6�HC���q�K�v�%7N�>�������!�*�u*>�D+�o��y�~gN�4Q�
U�Vt�
+���}Ub1�߸� ���
+M��
I�%F�l�b̴V�t��U��1��?~k=g�,�_��{�aFb
��w��ri�?Î6`�ulpji�!���A������"�Ї��R�����i5W����kZ,�2���%�rlq9���s���SR'�tXa8K�L�(7�e�JO�і��7��Zc3J/K�0;���¬���<�%�êE�fy�w�Wے�	C�0�e�eZ&�s��7�y/U���E���O�w޺G�Y�o�����BE�[��=~_n?�cLih�1y�܎�g zԖ���q�gF4:X
g��
�jf߯H����g�%v2]��]��u@��%�t�.�k
�����#�t
�X����ɰz�\��Q�j��b_[t���
+7�l,�m�Y�]:&f�	�!Jr��F�ź?d�<=�W�~��_��c�~���O�ޡwfk�M�=>T����r�c=��w�Q��T���?8w{��a�z;�G�ۢtp��'{�騾oOZ����FX���A��,d��~-?�ќH����r�2�e�_'C��4f�n�*v��Ҧ3�N���o��h���vTo�S~��r��d���o�y!�E��"��?8����p���Y���

e
��|���s~�X.(��^#7��zJ�J;b6�yXIѠJ+(�cQ���t�}��L(�O�>Dy�R�R�$�^$E"��Ǻ�g_Ͼ~���eiu6M��iV�w~�즥
����"�"�eg���D��z�2X�Y��n�o-VG��`�ikA�֢��[����
��G��4atlo����]��⒫���SŢ9�y�[�6��Ge�W���ur0�x
_��Y1�f�,�[WK8�Xg
V��LJX@��4$�i���T
P�$N�jcW��ƮVv��N��B� [...]
�o�Ӓ_��N�O�I
<�e�ͱ]��Bl�,*Tg2���u��5�}<j|������f#���
�n��Q=wa��q���
+7�]=�([�d�Ye6��J�Q�˲�A�-���B8^�������ԁ��R;���b�*�U.���
!lN���F�>�����
��AQ��r�7��.V��Ws��T+���?e��5VN���ʋ��.=��l	�J�m�j�ɜ)����)dv����E�
��U���/-�7�(��1�Gǯ�_����(�B}?�_�������
�q8�}�n=�
#W���i#�*�ȖDV.��Ϫ��Z�z�Sȹ�%�}4�E�?��.�sb��@.VL!u�������g���V��>�	�]��uv�(��K����_,j1mM�&�����g,���'���Y��<V��$�Lfx�HW�^�i at C��nB�������0�U S�A���\��}������v*���6�o�At�DW
�qq򝵺x/���o¶���b�+}�D�*��.����(d2|��}�z��o��F����4�/a����ʉ��B.�O��A�fQge������"|�?Y��훃��D�&���^�o��
+H�9f
+�����R�$�,6k�@�n&�,:��S�jq�T��?�8�����ݽ�$�F1���i9N)�u㴹a 7�M�� �z�b�@��i?
�ܧ0@�������y��_|�d�S�K��2
�?�Ռ?�O?���I���u�^��8��� ��qjW��!������žqqz,�m��8q���6�%�w��v�̋��{���[��/�ҏ�L{��+_
�
�曡ˣ�@R���g�O�K��M������#n�o

��/-���Awj h� "�b��1��6`���F}[�6�DB��y�F��K,e�W���y^&��_�� P]1��4ɸ�����F�a*����@>�$мg&o^��dz'P�k�M
�	�U��o�Sg1��)1L\vo+�
��
q����{^�V5�A�ak{"�ϒxt
�G
����g
���,�����'����Lf��di� |�d̉�d&g;��[��q�x L��p2��Qd�E#^�^�Ƽ&��b�j%�=�9�|6�
#\,��c�	>wR�˷�Ti��
,������%V��H2�>J���d}$N`��$0n���Q��6d�l�IIV�m���v�܇yyM���9�>�����vޮ>ֽ}�����}�ޙ[z|
�~)#�2
�lmb������8�zs1㗳"=���o�������q��Z��_$١}#o^j��ɠ5��H��a����@y�j�}���u�	[0���#��m�
#�6��u���˥��xAW�����ˌ5=����D8���Lש��=�ǜ�m�jU킯����x�\�?���c�8�@��Q�oNT����ɘϜ���F�G���
�kR���뤼3�[�v�˸r=�a��&x��B�
��FŁ+��r�$�k�=�.�����t�
+���5a3��U��9%#�icS����"��%�y���P�$X񟙬�� u�)>;�O��	xJ%�մ˝׭�����lJ��PA�h�>&�������+�_P�
�H��і`��G�um����Ob
��A�톌��Њ���l����E�z �����g&�q�R���hF���y����{�Tu�*�9
�.c�{ӱ�h��
+�Q�5��o�������=������GC�[~7܅�����m���/w٨~��������_�gx�ts�/�_|��pb�(�����cw��wf=~���:G�0�G�s��Y��@����;R
��Kk��NQ��Pߺ~x�x'���*�P�o�������
#��zH�+<5gK
+�J}bE�iX�}.��o�ӿH�h��4��p�����+�x�B/r�Nl:?�
?��=�R
+��BCg�<�;�f+���f��$Uf��z���V�q�^��i��d�ra����|��C��K�\����w ��iv��Oj�~��"A��;������7��\�<|z�N���r6��'���
+���
��vH�ҮTӰ�4 )��Ȱ?�*���2魥%Tc�
+#����|����y9�ҌT��@y�3�ٮg��t����g�b[�L��_�� �U��4Amdo���rY����
M}��T~c)���� �$[�;��>@�k\���4?�s�
,� ;�C���`=��GC���3�o�M��O�ZT�t
\L�`&jY�q��҉'�O������s�
+�x���r����}T�����z`����|?��s��+/fO�QD�5Azť>7d���n�Hͽ��Jה�n��|���/��2W9��y��� 
ö�

��h4,5����<�:|� ぴ��<�"����9���|>��u,�f=��ڌ희[��D�koZ98X�/��Y
3ٲ<�[�,�?���{ӧ
+'o�*NH󪈽�����'
+�sCB����ste����罚�J*蝌���K�I�H>w�D��r�ܖ����!�������d$��ϯ6�V�_G��ei�'/%�of�o䥀�3%�����JL(����J��D��Zp���{���
}N��
�+r���)Z6��m8�h��ϡ��_�S5����N���ėL+��w&�?V�3,ζ�`3Wqd���O\e����S�V�s�Y)Mb�Z
a�
[��
�+�*%����2
�
�]�v���~]`	�D
�m|�R�/\���?�6��_D���
����/��=?��cw�9�v�E2SW&>Y��յrH��|�S_����
��ى����
W�q~�k� �"��
+�r�����h��x2׎�
ۅ��`GdB���rq&�7�_�t�2�S�9��l8�ͧ����^}�xus����-�5�
��in�Xo���l��>�؜������7κ7�O�p���TDj2r�Ò0�
^j�;�Eݣ�Uiϳ��Vh�z��ݷ>6%��O�w|ϱ��)='ϝ��>��*����/
�m������(򘵏��a ra����J%��T�_�<�SS����z!�}g�_ˁ��\ޣ1��
+UC��qZ垜�f߽=5��)˘!?�|vZS���u at O�����&%Ms��U\z2����y�{%4
��w��a߿������%j�zF15���6ʫ�\���D�a���)<F��&^N��g?>..ި
,C^�v�a���8B��l
F�lmJ0�"��
5�=���k0kR�t|!���v��Z���K��s�
I�0B�>=��O>q�
W���RӃ��=���6��z'��"(�8�@ALLR�ļ��F��l'H5�
��n�m
+�7K[�̀���'�~��wz�*գ녶@���젔��f�3����B�h��N�1�1"���eH�ZꝈe���Zg<�J
�f���8l��N{�]
���\O��4S��F^�!��y�y�/�U���MVG��`p	C
�I��*p�J��tg���;M�K6�3�צ���λ��Ž:�6Q��#D��ɡ3D�;`y�
p����gݵ��d��m�X�����XC���8�z����G"�2�!�EZ�gh6+
&����2U�{L��!=�Gk�!_8�v�f�J��iw�l���s���g�=^(G�{>_�T
���
�Z�nc���U�
�6ws��
�Ե��]���ڽ���^נ�ݞ҄]~A�C=�?�~e�o��1h���D�ST##��t�U���~#"�G-�sQ��q�f�}n׺��籺6UZ��>4�.6���
w�5;Kt{+�{#��{��na�W�Յ��lVh�_!Xk'7��r�?����X
rZuC���#ߌQ!��F��
��T�p�1�u\e{�^�ߞv��kq�u���V;_h5�#�i�=e֠j�}�xP�c~��͚L=sU��=����SP����.
����
��י�l,�S�Q��b\��,�,3��Hj-��D��-c��[
��jF�k�gn��N,���Cc�D�Q݄
��ÓG����X�*��m�L�^e�{f+�@W*�e����Z����<�]����¹�Nˁ��bh7���j|�)i�q�szw)1�:�;DΕk�
r
+�� 
5�w/V�ij^�&�n���Fe߉��\隀�Wn�?Q�Qar%�j5�/*��E)�[�U7I�
+����-��

�)�
����B�蟃�[����R��wW�q�(�ؓ��n5���Zjd*�\u���ң����<��&�хd:�
t �
+�(4Q�ky��z����9N��-�\n���˦>�U�2�7
Rd����B��_� K{!���h��'9�_�sjF���>.��vke&�:
�J
�z�j'� �BQ�m�y����ܰ���+RD.�PF��j��
n���d�H�Q�=8C|�-(>s<D#�
D��D%�D�� Q��8F������M��tͯ;���p���&�`�R!G4��"h_j��,���
)�C��f�47>�e�b�md��$,u*�
O�:ch� 8��x`/!�������ݑ������@���
U��$ڇh����)l56�h/B��R�.	
�٦�[�iWOҨZ�J
e�G&7��)R��(����N��Cq��{i1`/����+�ulb
+���<�� ۤ8���h��A\�e
���� Ca�����x���Ɨ���, 4��)N�q�l2qb��8�u�q"�B�б'��	؟�#N�X� �x6⤃�^`�`/	^���8!�o�
�F�
+��Z��/	�
�	D�n��{<⏰a��+NW78N�����iN��$8����\�=�	vzo<S����89�M I V@4��3�<�8��4֦V�=h��7	���.��I�"������¾P���ɥ��A�Of֌S�ҏS� �)Ǯ ����0Dn�ﱐw4N)�
+ 1����8�+@��=�s}#r9~�x~����ӣ`�9I#�Yu��I]
+�
ʂ�|r�O�WDk5��y��
+�'���Go��g<��O��Ɵ
+jF�*N
��>U�
��d=�6G�����޹Ά���:�
+��A^e�q� �ǣmfﯮ����������0ە��m���?$�r-H2㶟d���5
+8A��+�d:�FEc*�6�����a�$P�c��9�|��X�|�N�A������rS��:�����n�-£@eJ�G�א��~a�h9�0
}|n����C.��:{��
WV$�
��b���I
�I���'Y>�I�UH��5�dN^/
D�Q�f׳�D���
��C���
g/�͜�ߒ���o�R�ܠh�Ҩp`��SW�P�%t�z��y�g�}���#㒲�q�p�8�U?v2x;��$�� �������������B�-%Y�o�
�y�Գ��Xܝbf�-�rr�����&�u-=����*�	�³����s�eN��,�[fXw)X#
}�~��~9��<���q�X��x[�����7&�_���${����"�W�7u��&���	�.��`V�ChR
�y���JN�6ʝ��{����c������#�]�غ�va�|
N�9�wMԚA��>�齜k(f�,9�>���?�t�`��紺k�8����I�`���džM� E雼��w�jC!�6�|g��*�f�xE)��2�8
F9��s?�ؚEGik
�����}sy9
�(�����w�+��Y��7�`�4�q���
+�wݜ�w���mSY���릲��?$0쁢\�^���{4E]p,���q~P��rC$�����q�Y�u�B�j���l@��.�}=͝y=�Sm08(������k;ꜽ�Y�>6�{�Q�N���#��A�
�^��S�p�|[�������[n�����hCď�
׿��//&�Ks�Q=�pU���}����<���������)
Qm��;�����Ɲ�x�;���=V�~�V2�f�$��
+�=���4T��ܪh�dz�x1�Bs���u�X��ls�Y�g����z�
8ӽ��S]
|��h���SNJ�n�{�l���G$Z���^��3��=��
�����ѥ:�W�@-c$
,)!
�JE7�
%��n�'w��N�2w7�x>&�%�3�=i:@�R
?��� ��8Rm����(=�
��myˠ��&���
�����a;��!�8[�#ꭁ����'��ҧ’ƍ��Dl��4)I����]q^V�
izc�Y�͜Ys�{L� �'/��䉚�+�����;MTf�|9~���[/õ�u}q��'��VG璓�Ɂ�g����6��dN�Յ��W��?@�Mc�v���X,�E.��+�k[�&9�e��>·���V�n�w�:��t:f�N}�

i
gxš�ΘY��__�_~��E�������˭w0܁�����2�?��Hg��f���v
+�%U)?�ն��`�|]
��P.��t^������V0�O;g�=� ���Z���
>�$�
q������Y�υ�X(�Y]��Q������1_
>o�|y<GGr��xi�����h+u���m=CgTE��W�DQ���2|5w�{��M���k��;�). Ȅd�E�G������蠺�Q��O����I
���E�1�0�n�6�A�
X��I�
J��ax
�֗�^�����C<��3��=���׾85�3�ߝ�LoӔ(jw
�e�k.���/��(5�������-�E��2��}
��68
n�DŽ҈��*��C�(�
���y�����,>��,����*�
�'��s�6kr�]�/~�g��<���
����9̝�b�(a�璃�����Z����)
��q���N��/q?UKEwB١/f;�p�kL�Q�Le�r�Y�k�rc8gk��S�2�>W���e��X{L�*@�>x��ΆK&�,�U6����d~1��5�r�"�A�j-��0N��;�V�v���-�@l,����
+7�Z
+�L�[]�@��
[�捄��.�e�����P��<��/�E��A�y0̧�0�ey��_��~�a'=��t�9ZS~�>��V����L�S�/���*>�7�İ/ٹ��⁢sQG�J�4Zo$��p&��\jG�,t!n���	t��c�ُ������
��:蝄�燍�Sn �2��10�i�z}�m�{��c�+�k-��7]��&]~���i]4{�g��'`�q����2��v��jB��h%�(m0y0Ze�lo�lu[a��]��}ќ�Q~�����%
;1"�8���Y��z5�
`���b���e���]Y��=cI����uA���B��?�y�nU��5�+�_����:��jV��V���[n�><_o'������l=[T�=�O�jc�\"F�9�
�.���[O�=��A������<�z.)���fj�_�	�q
�M�rw<,�!�y�bsI'Ļb�>LC��]����[=o�2�4S#r�6���M���WY�-�3�EO��Rit�>��M�U~���=ew [...]
+ 
��,4��~&�o�~*��T����K��Rb~:�C�����S�&1Ԧ<3l��~���^���i�Ÿ�E���r;�n��HF�"��
t��p�<k;H���B;���W;g�1vzI�v�|0��q
�L������N}��Ւ������N�k�
Ui���� %��\��b�W�.4=�rc
+4�
�yhkݷ^>�U8�|����\ܱ�z��ҕZ�dr4V��bK�\6��ٿ6��ڼs�Qsq[l�
G���B[횷���phY�i el�wu�C��bR�Lg�c��3Qw�޼̱�@�e�J���]��4�ύ�
&���6�x.�~*���n��ץ]�e_X�C-yP)56�7^'Uht+�Z��񹾓kH}7��:��6u�s�:�7��0��v��
r�:��T�s��BZ=�c��,��ֺl��7zu^�=�S�ä]m"y����FgE��p4n-��|����4;6ޕ�� �ӻ�ݓ\=�i5k��<�A�����SE'�Le{\�	
�2��ʨ�����æ3�i��*\��Cd>ه�� w�}��T��u]�uS��댡V���[
>��}�]�jM���Z-'{��WV��@�<s[9M#�"�[A�����V��,C�d�$�Zh�P|<д�8�lq��Ŷ}Њ����B�ö5��3y^
-�z<����ِ�!Z�_
m�$�*����[m��
	+�i�(�n�U�^��d�@r�&�6ʠ [...]
ƠE�̄�O���W�#�B�uO�ڡԈ�Wc~/�z�G3���\�zL9yr���X����5�n�[rາzeo
��mI#��g�f~�Y>�.�
��\��NU
PW#�?(c$���1�Ϝt.�Z|*a=���N�ҭW��G�:
�����Y������Ɇ���
+��,7�]9���Zf]��{"�}@,Bd�_�#D� -C���B�c��(�
+!*�l at Ty�$.DU*��w񋤢�J,����ԸQ�O$MO��+��ک�VK�<S|U��Z�0W,Z7x���sn�2D�ɂ
sunL ��{	4D=k<`.Ct6cBty@t�� �������n��x�h�\@4U4� :��b��	S^
@��{�}����/h��Գs����|��B*�K�	� ���
�[0��P���[�0Z�G�?Y��ٶ��	��;U�w����%�A9�g���昻z���u��u�O�b��2��vq2Ԝ8�;A
��$��A	p%�x .�x���xm�m
 �
`� <�8��Y@� X��n
I
�-x����X�C1u
+��/`/�럝xp P�>��2W+N�g'N��0N�a6N
+�j
��I�@Mc
���@�0��3`<�8V��E��2S��3���nk#�?�p����8��"�!��\��K
�?ğX�
v�	���s������7�
�8E
$N�|#Nv
'�5��Ea	�
�}��8W#��X� ^9ND��1}]o�q]F\�?��z1xV���	���;���wXO��I��@��k��m��(��e�*8��WD�tJ7�������_t�{,��)�� ΔK��`VJ�H����
�P���F�i�U"��s�!�����*
�no
t�H{�
R~z�C�T��ᛃ�[��X[�h*�	����^	��3�ǑK�gtjǟ6�g��qd��yT�e�W��5��I��~�
�s���?����P��}���N�����Ŕ� �P6�cv��
���ּ���˹�+x��9�E�)�$�]��>��^��~�d����d��g�zP}�K0�3�n<��r�wU����U\�$�
�^e����s,}�
���Z,
+�E�H�7������af��P
���NG]��#<f\�P�86w�
��
���dF1�L�A��k�dQ�
����c6k@�I
gCl���I�,����Bڽ�~ߓ�6���3{z
+o��c��ݬ煉�ϣ�i���d��〥 �pT*�p��!-�>����1��`b�e<���/�̽�|��h�8�YI��x��јM��9�e����~����3���Ǝ��v%G_-���v�="�%c�����rz(�Ǖ5�v{_=Y�F���y�
��.sYc=;6����h���jټ{��
}�˕��/[��kH����d���d#�~
����ό�W�}�8��*��Y7��.>8��s�1:��C֚u�^�-�����N�
"�����:�6��4U-�<�wl�w�m+���9
Z�2�)j��ٯ�a� k�9i�ll�"�n��o��$���k��;�V>�x�f_#7�����
*w��/��7;�-ғ��ѡ�
�`I)� ;�UZ[�2%6������H�f�ZgAU��wk�P��&�eT�`ˮ��P�[��T4��R��d��C�.�����������n�gn�y��#}�Z��pn�ǡ��|����a���x��G��Gd}
w�5���j����/��QP4)��}��T
+�|�>�a#.�
����`=/����*����_$pEq���aސ��zm�?q���

�<xn��W�2(�
� +�˭���M
;�{@\W�s�|۹TI�Vz�����úlc׎�No��(HF�W�e�:��3��^f���.�Ao�������)�z~��,�_�?���Ӻ_���c�XX�}�ݷ�}S�����8�
��Ks�6����5��]��*}w�/XKe^��?��}�Y�
J�Tk5��çw�7��
��d-nT�}

�jv��4��c�|Lƺ�_}Q���_|��+�w����������� ����f%€p��;Z����4�uX4�Uw�[(�U�.�qg/��ӼE�T{��Y���ee������p�M��trl�=~����#l?�q�������?���
� �pr��^�Z`�r�H;%�t~,
��|�1�]Jh�f������zժ��ɶ�b� �Oe��,�b|դ�jc�Z��i�{��;l��N�&c�*��lR.�8���kv��v�/����^�36-
g\4
�$Y�6�<�D�}��� 8���a�(!
��02�}s�#+��z�WM�jPa��׆����<Z
�y���f��`5]�>!�%���
3O��G���9��'H(N�</����Zx����,r��Wٰ��e8E��S��leΆ�.`�H\���wֵ�n�a97���:7a��v7�Ĩ���
+V at 9��Q2�%�
�3"'�7��E��c�7FO��Ȟ�Rq|��
Js7cVc�͌`;��6������a4>�a4��$�I��2
lf���A��u�tu,Ղ�~M}
��涻~�䪲��<�f
+�|�n�ڭ
WN��� ���l�ܔ���;�t��|լ�C�]������N1��R�4 �N��.܀��
�?P�Vi��>�q���\M�{�,}�2:�� ��_�Y��NZEW~?H0���H2�`kr�cŚ|*��4���E���%��X��y~,�2}����kp�����=����`Y�
<T=H}����#N���K�D�ӓI���
7�8��I����Y}o�=��M����ȹb�Muj�_�h'Nq�Q�W�\32]���"��|?Q�0�t	
�*���s5i؂rk�
�4������@�[7n}������!�+N�
�!E]r�)U���FJ͐�_�m�&�c >����/����j8�������~lp�nJ��I�i��o����pf�/c\�
$�U!����Q
к�2fvg��dv�
�ܵW�qO��e��dU%����>NѨ��p[���u˶���/t��)�"vW�~�߅�	�=�&]�fZQ���U
.�W���ä&��kT��w^ڵ?��Y,q+�a7�h�5f̻*��٪���W*q6]�u�٧�΃\
�Ow�KDdl��C�����
+0 >��x/����Lq
{��DA��S�rW�G+^0CK��ә���S��[bR;kV�|M�
+��wty�4B�J���G�y���3zB{7N�|��!�A�$�ź�%�b at l�N��
��â�a��m3�U��\.?H�O��0V8�?i۵��e����(k3~�hؚo�`5Y��='�&Fw��k�Q��β;�rgr��_�
��82K��t@�AҧZX~DvXꪻ���ü�ް�3����u�Q�(�v��0�}�Z�Mkٚ��ת}
�V�<e[5�[���e��� 穵1(X˭��kjB��dzR�)vEnݫ�-� 3��1�E�#W�Ó�i�n�^�H� z�����0Ƒ�Y�
�ۦ�7�]�@�?�Upؒ�
��L�M�~e+�%7���m��\��)S���X���q=ⷣ?�������Z}�By�5Qq~+5�)���5D�O�N��/���$��+�JX��<j��)�
�n�]
�]l�b,V����ER���Fk���~�A=�V>uj1(��灪�ՎT�v��O_���?�U�q�*��*�����7��je���B|���<1�������2�i�e}��R��z}lvV���A֯F�~�_=j�:}�:uh�fj&�5&F��#����g�*�\-��Q����r�y9��j����_��m�4su�T�OG�]�`���LL������op}��t�Q���#�Z�ݮ�d�؜�N�n[���X�˵�u/��ϧ�[L�4��R�����{Y(*
+�(��
���Z �
+����n�V����Z���t>�)�|�Lżޣ�P_/n�
"�2_ܼ�e�!�����z�-��
��L��>sxsx5��{�ڏ�S
+F̾�m��<sp��C�v�
��W�{�����Tg � q������j}
\��>/�<�R��6J����u�We�*�E�����b���,]K�i�X
	2WaX�w{�)��f�V�]�+�堏j���J���j���
+
)�Cַ6�z�6�?s����L�?�Bk
t	B�F^B�]sn�y
"n�	D܋6D<�ԅ�D�[����aQ]��
���&�Ys.ѽ9�ǻYrYł�n@��">�Aq5:��{�h#��z�k㕕i'�	u1�HW��sB�;���2)B]��A��Bd�� �Z!�F�{�!r|
C�(�!r�&���T�DZ����ӛ�.�i���A�w�d���&�Zg�EZ�>��g�o>�%zH�.�2��ʆ�Z������n@�b�,2y8��� 
+�� ��J��&DY���x	��� ����sz�u��͎6P��h���h�&��,�5����>�-0�RG�w��,f�Ȗ9�ep�o]��mJ�n���'W��p�0��O�DQ��T3
���z}�@��m����
~�w�Md��i��m~go�S�j�����ig�~��^�u
'�e
�|5��=p~�1C��ǃ� 0�.��l����X��O@��1�D �2��
�>`���[�xW������#
��Q�����S��8��4���S�\��Q���l@���|��0`U��'C4�� ��'�̟���@x9@�1�շQ�w�}��EV������������
+������/�G��
+� Zs
��P�� lFz���)��7�v�
��8����PO+W� �x��A����ۻ柑U
'�c�˼
+K��
GG�Y��������
��G��;��������E�9����T����i�=/��Q�9����8�;�8�j�8�n�8i�H���wgkC����̃]d=
�(_�دb�xz���^^�GX��ջe�K�X�Ey�^o�Q,Z���:u�A��a�m��:^�����U��<Կ)�g~X����s�Ӑ��t"Gq���8S�U�����y�M�9�
���
Fa�t�
��uy�����B�=a�F�K��*� u0�
+���=�O�6���
�}᝻΃�~
��{q�� �{tPI�)����,���5��A�#(o+x[��|�Q%	}��>��-z{��j���X���I�m�W[�GW]O=O��?�W�(��|��{`ۧ6�������W��^����`q8����`VW�i��,~/�qtW��@ϙ�,�E�)ɻ$�ٙ��qÎ�CY#��n�~t}�
+u6�fl
7�b�ԩˮ��@5�I�f�h
8���Ķ\U����� ���:����ev?���?���ٱ��*K=��
���h�(+�!��[ �$m�N2��}���&���c%�r��.�e�֧���]���^�� ��*��)e����V�V��%����
i.V�ߣ���j�
}��NN���V��֓��p�vh[�[�g��c6۔��tS��/?���?���w���u�k�j�����T�Y�9� (�`�	E����9w���>�A��H9b�gu�1�9���1�������A�`bӝ��2�)u>�n�]�&a�]O�~�0q�z
������j�c��ƙ�h�
F���h>V�Q)ӗ��pe��������kT����dt`���W���ng���C����s=zf�wp���~X�	ak>al�͍��J�Wc�m�n��tfz���k���
+S?���h��Q���j�H�݀�z�Yt�6�\
@�
���"��9�mnLm2��Y�����5Û<RT��H��� [...]
+���g��
���
���bk�,����%�׌�Q?�4��z���6a�F�aql﷠���C�W3
+���R��j^6xƝ�?����m�Lxơ)
np�p
�g:hۍog�F��+S�f��r>��+���ИU���g�F�U1�b�v�	�6�3�~�f��GT�=
+*�����/�݂�3Y����˼���#
v�
 U�  3?�/�̰~�J�-
 米h;�
���a�
��+��o�%p�;��U�5�zw��in6�R|���c���T�p��a�>���5�A�S�]�3
���?����:��X�*暰"a^�O�F��`2L*�T �aw&����9D6���AM���U� 
a��b��t��G�;��(T��+�
+M�
��
>5I$L\Mے���PHW�A�.�
a{�3��U`?�?�~q
 �t��o�/sq*��1yJ��?_��=�\(^^�wh�,������k���_
����ɸj�ĭ�(t��娝L�� ���C�$�ۍ�(VU�$��^�?�
�vJ6w���WU��
w�g���/.��
n�/$	�«"�t�v�JvQ�:��2�OWe�S���y�j���K���oJ%�XPm�ȼ���:�����X+:3�G{;�E1�~�s�CZl
��&��N
�W�"�\+��68�b�F}�"�8S��p��O�w��=��A
�^u�(��?RϿ6
.=

+�:�\��g��(Si���Ғ�f���60�
+{���v����r�&��`����m�a��ʐ�ӓ�ь�DtK@��
P���$=���/�_̬��O��� ����"|�Dw=�R�N �@�6�.
��}W)
����"BB��R�
`�V� ���U���f��`Ό�p:�tn#�)
�Ta��ɥMI�eɥ݇Rl	�p��`�8(c�]��Z����
B�N�t��\w+�l��3�����Q#���J�,β�޽%��E��l	����‰���^d�Re^��d��tH��2�Ab���)� �Q�@l�l��&������ܛ��P'���>�E���ݑ+:�o<�eɍE7C�

+Ee��3�#�.�p�Υ�ۉ���
��y;ֹ�0��$3$�w�J}K�&
���A�G�*��	�0�
�
.o�!��x�^ic��aP��aP��`�0��P�<��������
��r�n��/�s����=��Q��n)��g ��ӊw ����a��Pa�[��0

��2KS
M��Ҝ���r�^��GA^bZ;cP4����W�4���iį����\7?���4:H���_��-��uF	��X5��bg���F�x����e#��e�y7k��9��iy�09�R�
~�I�@!7H�$���M����eaι�w�;C�
u at HK{��۶3
�
|ϙ	E���.^
��Y
Ε���i�_|�ub���ʸ\фa��`�i�F���>�ns�6S=r��tʀ�ʔZ>�+�"
+7R[�� �D�8�q+���
z1����CD���@�q�E2�b���WH��cP��V�ln������f�V;��� �l�;�����M�ZA
�uMr����۷��C
��4�p��ľ޾���lF��ᗬ���cq���P�Σ�X����H�H��
+�|֡yrs�k�t�\e��}��>�����
��.�a�e/�M��r˶�h�V�H˦#���0{�e�}���жYS�F��
y�* �I�]�ϖ��|�'? �C�
x�w/pAZ���a.A�ju7
��L���;��iB�m>~�J��<@�M�1*4�di���� C~� =�� 
+R?}��>9��m��L.jt�\{.��ek�D�{��Y6�Ĥ!��xN!y�p;�ݟ���bնK�k�B�[S�-d?i6�%�c����	�5�v��vVgߙSmΈ����u�+Q��J�9�*�T���Z���
+�b,�ś�䃃�?��$�a��W�'�
�Uw
E6X�ܨ}�
��v�:_ޏ��mnQ[�̩&�޳VJ���z\hTU
+C����Wv��H}M�/O��l��w���?`�V��_�%��+�`����c�D~1jCM{���n�����K-o�)z�^��

[�
)��}�\г&��F5�3����ҲK�Q-<*�֮���[�g2� GU
�l2•-d���ۗ(�^�[
t�Up�,(<΃
8{�8��88[��?�q��̴�jF3�!�ŠF��a�n�B8�B��@�9m�&e�Q�2.�ʶ(;�wsk�[h��~0ʩ��4W�>�ٝۺd{��������9.+p����T�p�IK�1�/ nM: \�T ��[ ��',œ��S�
�~����RCe
��"�3]��,�ޝ��^�����
+jX���Q����̬���TL`�o
 ���)�@��@��
@�  �J@�c@��K� W���)�+ ��)
�<�F�F�
��?zZ8ID��H������\߀
{5}4"dt�6
�E	�i~&�#�U��3�:�]PV �� t�h�� �V;X���*R0z�0��l lc�l�zX
")N&�ݽ���D �	�)�/~@�� E2{
��]p��D��p�� ���k�j&�"%5���pf15��*}�.80��#�bKy���� ��B
�8�pcY����N�
(g�YDo�����9��Ec�� ����J0R
�/���t4��sh�(_�
� ���T�z�
�onA�Q��'[H�G�Ŗ �]w >˥�ݛ'������ �S �͏j����R(Z����9dp7���dd����P����v�H^5v��r]+yz�^�,u9I(QM1w����S̮I´������~�����R؍�����$b.H [...]
+�k����m�N�7%
nU_���km������U})i��b��D!5S�R<��La��1�����O;�y9�ۭ��H�
��Q�޹}o/Z�Y,���;:ܔx}�U��}�_���H��K;zk����Ъ?;Ŋ��'�J���w�2�ׅ�Ӿ�H�3��
R��L:���(I|�W�d?'�
��ċf���E�Vu+�{Փ�|9�u�b�u���w�����������ѯ�n�w?
�� �G�U��Gk'���vM��[�:�
hi~�G�%4�3�kPH�6#�&�R�k��<�F�<��&!���
-�XBE��c��SʖOq����f�=��;�oo��`Y��+@ڞ���N�ۃ�j��?�7����^�
����ZQP_<�7m1�^��A�>lRk熒Z[a��(����t
\Nj�t|/��ຟ��q�tk��4T�ӑj6��-��-G��Vc6��~v�oZ�kgm)wtu��������K�f��x�M�}���W�{1U��ꕷ0=�k����?x��x�!�A}� [...]
;
{v9=e�ôÇ׉�\=�{e�
�mR
?���
��1@��!�����Y�����J1X򴂀�{Y ]�S
��mდ^�~��dj�g��1��[�
á��+ɬ�9����C��\慙׊�Y�L�Ų|i�p�~�KwLi���
����ۑ��N���� x�w��ՙf�=�$�m	
7�V�ޠ�p�3xT���d���bVPsQ��۩kQ{
��3#K��0D�}E�m�$@+_9��Y����E�
m���{\��v�3�+5�Ϯ�p��������ͻﶻ�p`���8����q���~��O�@�y�h
�&ǘNO���Ұ??U����J�E�*�@�]~��EnI��U3�~S���sdu�9���R�o��a��'����~�f`���u�5�.�
�]��n�RѲޛ�g1��Č���̯[۾TK���^{jkT���m�׸�T�]
����Ds�]6 at A��LW������d�?M�[e3�0b!�*��H��1�w@&����qX���5o}йKv#����>lM�6m���A\�D�_��Pc��훢�kZ�L7o�V�6FW
6׀�]�������'#I!��D�Vko������-9�-S���|q3k3����*h�
�N
�S�I�A&ξF����Xf5h���|?^+�E��FE�J3F�z7�z-��떹S��`a��C���*�^���%�)����~�.�.L^`�-
YN�E�+e�!V�x]�����������%�^bQ�]����.~�����
γ� ��C;�@kS8��~%�3���V�.����#�C�H��o�
+u��rXk�d��8�p&qUeb�g��m��v�����J��M�,���2w�2
�l���/��*�߸͈�+3�ƋQk
~q��zO�Y�n��f�y��~<��k��y ���h}�)�l�R��+*�3B�%'��3Y�f���s{�?,�!��v��a���J�+=Q�z=��G�q�
L��7>�P�⣎��)�,�׍gf�3�L����U����<
��w;�h��T��Xz���Yy;��
�ZA��ZM*yrG�Z8,�7��(��m�R@ξ
+�N�EG����1C
�y:xX]�^4:+W�)�
���M��+���
+8��aҤ��B�)µF��܁�Kc1{ڥ��n�t |�l�#%�vr���K�,�k�LQh�_u�dm�2�
\�ЬǼ&��=�,�<z��s:����x��o�
�$���������R��Ur�5*���{

�T��!
���l����R*�
�
9�:.?R��ԕgY-�������"��+�c�59���;6Y�	 ƿ���

�[���Cp0$� ٓe:H]�Y�I����%)��e�MԤ��A���/~�-�������s�@�U	j{v�,;#g̊_9ix9��3�k�


+
+F�%u��u#���A̰x[/2cU��SC��l�Ʃ��Ta��i��͹Ml������7��;Ya�h�����8���O�b�kȤ�A�����"͚�
=�tn�h�;�2U;�
�~�S�|���������\��
�W+�%f.
�����i� j��B[�J d�GS�vE�P��xK��u<��[��@�_F
H"���K#����@���<ڽ_�Xe��^Wc: �gl؟�;�A�,�H�zN�u�E�4��S[ck�d��0gt>;:Pbo{O{lu���b���v�o�f	��V���7H at odž��
�EFw�
�
�D�[

+CˁBϹ��;V�3�N�L���
i���w1�
�_
���%�a$���g�9
nW�z����}:�b��2G�\��	Y=��կ��u_��
����U1�tP��1$��Y���ڇ',4��s}��`K`�tp�n�([��̜�� WHQ(vK6����H��I�Dѣ^{N�ޫ�څi�aXXT���&6����b`���#�o��7��n����
v�;�]�,2F�2��̼}�M�4��/RWz%fg�@�Nmf�{1�k7�J�u�Z�։�<�uB��֩�/���=w��ŧ0N@v�q�� ����������@��
c��KZX�\��F��rB��6
ְ f����t&Cs"�����]1d�[��^����
��n�o٭Rм)��V�@�a��ƨ�R�N��S�1��
+��f���$�-������#�.�
�8צF#ۼ���1�n5פ�_�0ԏ
8���nu<�uz����������f�wk],��r��B
���8��&V���O9�G�
w���G���2x��j�Y��r-?{�k�� ���A�#��x��JC˧$'�E��>�'�����v���ĝ^ą-~m��z�6�:{~*�NgQn�5�hPu�k #�O��m�m߯u���T.�vڮ�;Q���T��
��i�Ro(ϲaƍr�;�ʭ�rWn���X:l�t�a��NU�HOk]hӆCH���H���\��I��� {��[����X��΁�lcN�40Q/��A��|�?`���7�K������U�z�R1n�;E4��BB����c�1��`P4��I��t�����惨[�^�_�\RV��
+f�RbR X2�s���
�C�
��{h]�Gmh&��H�j���J����?���{��Y o�3�=N�_��:�B��

��[J[8'W�����C7�5���ޚe3F�Gd��d�:u���[9[�*�dGuժa��?'&)o�F�'�\����,�U�;\nU�m�yO9�������kQʇ�
���
Oʹ���=� ��S$
 ��s� @"�H�� Hb�?�si�CEo �U��@�| �X��F���.��w?�9eE�p5^mz=8��i��\_�����T���8��F�
i5�����j�x VT%Ť��8H�;�	 O�M����\@�s
@2
 ՜�b�����zK� �q?H���"C�p�/���'�Z�Y
+f�1�F�}�`ySH�Hr;�E�8/_��_x�pq
��D{ Ҋ 1b
@�y@�
�`8��c	�
r P}� hT)h<���I)���`�} 0- _gR܇ &Dg �G- 3u%���B�Nt:S�-x�.�8�*��l���7I�
sͰ��
�TA/c�'�ED@�a���m
`�W `Te
+`2�I�
���x~8>-x�	��(D����:D�Q�֌��] B�VR��O
��N��N!G�B-�7)�D�]����ͫ�iۧ�}��K
�t�
+���_��z�o��W��̕��n�5"�;@0��n
W��u�H��m��wgݿ���ߧ��[���=��ɇr�XU:I����>�"XIBף�s�0�L
+���%	

�%��)� V�&����/.݄XwV��Qչ�K�����ls`jh����	QIB^����S��85SK�L�S¡�b	���o�-�����ajY5L�<�L���'uR���Q}W����V,^	:.

��e_I��#����?H����6�
�(�3��ɳ��=JN:)"����&.����_
|�L��yL���U�۝�xѼ�c�

�]�oJ\��R�z��U��ˑb.�v�{����r��*{�*;������o��#q���8�͵��?2�:g�N��Y�#Ib�hja�����n

Y��ŋ���;t�V
��kcĵ/����/�H���͝b��N^1Џ�ZGb7���v�����>�/�5����~��BQ�4�-um�_�9K�A�Z��̩�SQ(y�D<yz:����I"+���كX<4�k�;��
�[�b�x:&�.�om�:Ї}n�]���^V�k|����Agӈ���,���E^�+h{�-�fa���zA�ep>���<;�2�O���O-�v�O^� M�U>�˳���C&5y.<rz[��Z�L��C��^˽}d��:j���\
צ[Y�
�-�@����}��+�٧�����?��Jk�m4Z�B6*+�^���iX;��i�=kL,���

+�a7̦P���ɻ����փ����h8^iQ�^D�Œ���8��4 ���/�+���K����J�9X��3A)��rW]F
ڇ��L�95�NnrnL*���n.�&$���(��+�F��y�|fZC��6�% ����!
�{�s�&C�g�^=f�bv?�#��`�n�s��X�{ ?�@3Z��z��@괵��Ğ�?`��g��r�1��B�
c+�
2?+x����Eu_��Z�[�
�UW���SG������e��
Gm�
��������	�3����:�j���re=�U���qX�W�v����pg�
��<�0�U�
��
+=⽖8��]��T�S������m��|p�w��t��dg �2��V�aY����$Zcԙ�S��0s7�ڟ�f�/�R�_H���/
BI�.7N�%�V	
y6Hf�x����lڙ��p�
�G?��>��-]�4�h�Ɣ�֜#�[I�
DUd{��
���;�|+C�&=v�y����3VU�nTz7���v����z�vʧ�ek*hgc��vk
~k��x�yj�h�ւ��|�d��$ޒ��P���F���
�0�/�f�
���w�oX4A&'O��?�N�~���b.4�ڹX=}���CR��m�k��� v]P�|RQ)P��;�(D��o
�I���n�(
J���W�So�jI�"�j2����H�oO_��dG��7w���73�����ͽ`��\��k?;�q��H�G��
� �񤬪X�i*Ɍ���,R+��Ifj�|]�[	'.&�(��C��sN,�W�2b
�/.hx���ԋb�\�w����1Z�N{���^4Mk2nz?�Yh4#c`�^�@ƺya͹���
5
�2�jH�ɤ�y��4�X�T�Ɩ���'bY�mu�?���)�{�'�f ����q'������q����
jWd�gF��c?��b�6�ˏV�L�i�i����5k�w^ㅆT�'o�

+�= �Խ��HwK�p]5�����ǃ42���i���0�N��떮W���A��`�L��鞙�+
0�����3�1���X`ia�!�p�n�t�	^&8Z��ӽ@Ã�zp���|��Z
n�=���W
�
�]� ��$a�>DyCg�m�+�>Wፋ���H
⬽M��V(��kl1��F|
>����hj�v�V�����3����+�1x~�|��JYn1gd(L�Cm
)����9ρ׳�V�&B��zr:(
+�ؽt���`(��X�l���.|??�sg8(�Y�O�,Z�v�����*
+t��
:���W�l(06^�|�Hߨd�ؐ�2�$ER|���&����&�\1ph�t�_�j�3����ɔT(���S
�I�VUDeD8B�!��Δ%g��=W�W��Oft�? ���%:��t=��*OA)���X�W+BY�
��2�Ừ,��^Z�z��A�����P3�܂&$
�G�)��^�T���ڰ��
ץ���
�y�z48�{��}�΀WZ3ijq�'t��!��"N�S��Z%���!K�I��X�wfc�7�J�'c��-��	Q���
+�^��
k�.���_��FF�۫����p�$���[��|1Z��\aPk�u��*�zc>=�?��
Ј�1�K*��{�����"���2���S&j,��{�
��J�0Gu���E���;�"�]�4�����I�x�����C�����e�}%B�{@���]��]��
-c�t���Ki�5�jM(;5iz���U��
�ԜY>�BkG'�v9>p��;
�|J�E��u#(��8d(L��3��XO0���i��N<s<��2v��e/���t�b�f���in!��f��-��N�f���E����dK+q˃}�'
�jK�\^�
Y�7*��~(���K�
�Xw���
�Q$��Q�TC�Y��"���O�(��b~�v����
�ڸ[�˧n��������/fM|@�i ���5HP�j-4�W$V'Xv-

u�yg<�2�����W���1�j��-�(�=#��jnBI
~W��{V�6g�����|{'��fS�(Vo��ގ��q�v�C��
��ӡ��n�F�~�~�p 	�XĻ`��N���l^��[w�g���Dyt�]d�q`(z�a��ix"WT����V ��l�뾻n�r���չ�b��7��4�Z��Ul�:�6/�hՄ�դ�֭F
��F���lm�����$�Ѯd��2~C6�4����k�~+Iϗ�4�qx����)ְ<�`&	��
�xg�w���>�:�+��S*l��n�ϩe��G+57�
h�j��Hc؟���5g��sY
���M}�Yc������Y������L�
�ΈP�7bn�Fo�l�9�J�s�gBN��[l �ى�*�i�L
i�B6�a�h#�3
��փ!���8r�gSߪ����V����e���7+�
<�(��^�>�zy���v�ږ��p���|���$C���K��b��[�{S
����/�	���=��)�aYZ�{�m�+�Ab�v��0Ѫd:T��YK���ݯ�! [...]
��
�*fB�-�ݎ�o���
ҵbw��M�UDV'��P�0�5���{���� ��|@��<�����R C��@\� ��F�9y:�Č��ɹb�1�␞�C�K��Gn�H�>���V�*e\�*�F[�!vV
����w�%��(�g]���#]Sk�a���q��~��g�{(��b9ó��"�*7������-�^�'Kp��{�ԓ�4�r�:-�t��蔞o�S� @'�@'랁v|x��ɧQN�[63Y�_�rF�d�C����;��ɪ3�IlE-���u� gj�U�8�e
�J�b�]�����"�d?`����:�t:�Zv����
��x
�E���$Ŷ��V�ª5uA:*!k
�ývh��/5 #��
�ɏM�iDA�*?i��.}�
+T��A��1�F�@ �;F(<Q �E �1: ���p�� ���
�l;�ڼ
�:Χ�{ �� l�e �G��1 ���/�M��2�E�>�YE��P~t^5���/`Oy�4A;7_H{�MR.�j�̇7Nͭ�D�tZ<�6�����H����B�v�
H�d��H"�˔ �K?:ô�	�
�@�z
@O�
+���
@WW @�G@�b�
��ꐂv�9Fo2���
+ �e�����v�$)���0��+W�9#�Ɨ�ѓ�:m�f� :ytү~[�� �2v f� �j��5�T<�	
p?k �"���} ����w��"^� �!� ��_��u�1�Io�ة�ղ�i�����%��t��ˠ5̶�p���_���m����#�����v_�ԻU �s 1�k q���C��SӖ���0 �j�ɶE���b�g��Y�$�b,I�#�W[����F����+�%	����N����A����z����-��ߧ�_�HH��?��/"�Z��V��cR�ϿZ�?�b�����?9��t��ٳS3O���Q�sr����|��F`�)���F��'#���m�%N��QB̓�cRJ�z��ܣz�p�Pz����+*
8o�<\�#
��${mL�ˑ���^�Ϗ�3���A�MI���Km wHj!�I�
�%
�*8�y�1��ۼGU
��{,�'��K�!ߔ��_w�a^�d�^��x|1���|aO�3� .'��d���������98�Wgx�T�������T���t�}��ڨ����T�#���c���{Tg��������������z]:CѮ~�
+��1�w�x$�;�0i
�C�<
+{�k�����mz�w�>��y�^��+'��q_���צ�%z��_$�jO;5�L�y��$�I�;�f�ۭwnͧs�q������L�=������r�C�lv
�t�*��i��
n�#7H���(�rʣ�2ւ�=�ͅ��"�s�����
�-��1�@
�J�}+TK�fX][������RCä���{-5��J��r����1��!ۣ��x�ȍ�~s?�=��e��{��Y
����:�g�u4��*Z��}T�^.��~��N�e��M�<1�d'��}6��mo
o^�1�����|?�
>�s��m�H^��$/��܅�Z��
���~`�'/x��-z�V�����K�k瓅ќ�
G�H#Cu"s�}�R�Mc`L���	��t�p4����z��sG
��>��[�j��9Gڷ��;x��u�`�q늟
�&��]<wQJ�hw/"b����B��̨��*���?��f��1���԰�����b��1�ڨ?N\��H�0b7su8����b;�V�W�U��������ϭd�oo
�yPIw�f7����Jҭ�"��i���
��ngcWsu3N+����c	
��y!�	���5�XL���G���x�/j���u�,zU���
������ޚv��E�c9�l�Z���C���{
�L��z��
Z��؍1���(�䵧�G��7�_�W!���M�~���x�w6g�_��
�M~3��$PcL<"c��
�[�&3����AG^����m�?�1p�Z {o��1��g��/
��L6���o���7��֗�n�KW��p�Z�
"Z���ԁn�{2�)Cp���-G
�q��|�pV��I�6���^���#��fXS'�d8H�4�ƣ�̜n�}�(���]x���Y��ZHCo�xW;C2�u=�Uϡ�"㓣������1;9h.^2uƚi,2
C�r�
�Wqޯ\>8�b;s��<���E��ŭ��^�w
 Rn7����=2Q�q9���zK6�I�4VF���42��=6����I�iP�x��kg�G��t�r0
:2�n1)��X)ߩ������2[
+��|�Ҡ��*
��1�
/<}�
1���~��
��_��b-����	N]�~���y��:��cZ
���*��^CVd�ڶKa�$�|���A�߇�1�ăٌ����.Մ����E��i���"�8,΄�S���XGx�X��$�����F
/
`��Ci��˜w���z�
2��>�
+���F�
Č���‹�M�D��xd�5��)Z�'��.�2N�5�.�>���^dܩ������k��p/�0�&�3���']��d��i@�|K�ό�i��K�?��A��
�5d�\��)�w�_Q���ý3��9��g(gV��D��TR�S�X,{=C�
+ѐ�˻�S��㒳�
{5�3
_�;sw�K�E��P�4U�	�$
+�6 ��
�)P�Y̬Zd1{u�嬷N�l�bn���{�]��Y:.3m�W&n�F��p���`O@{�W,��n|���	���4>��nA��
�b~g�"$2é��_���)�w�3��IM/W�������E�����"*,4÷��
׎J
�[Z���e
+r�����b5��Q+�+�����L������h�5G
Y6�������)�Y�κ�L`F��N�ԓCS��O��gH��$�p�@�9�Ng�
��%��zvq��d���1�>���[���i���\����u��|a�����K�a;!DB�1_�A������e�^�:h�U�:�
+�|jrPYh3#�с��t�.��}r

S�,e��ڝ�b ;|{.\q݆_�!f�X���K�N���ԑ�:	w�8"��+�	���3�Լ��@:��X���ݴ?��%��{�y������8��;Ci�C,�7-�>jT�]��<�ɒ��%��Dգ
\
+>�[v��̬���$���Hl��?���!'
��ēB�e��&�����H���0�&�t�o ��l�ʴ'd�T
�O8�"m�m���f
j�F���HT�
���?5U��
�>�n�L�{\@c��Y�L
4�˭�NȆ(�+䞟
LZ��g���I�R�&G�s)v�[����1�-�d��,rBg񮤑x��n�-�
Q�vn9<�?Y�|md,�2�����V�
ʾ`
P�y
�)g��t�U��Z�L�]Sxd��{������k
S at evM5�
+��wWhJ�µudD�ۛ��nk$�j�S�������>:��ڽ���}}�E7�
i_j���K�C3VάrÇ����
i�;O����jy^�𫶨Ôq��
�` v���(�����
v�}pݑ/�c��I[��������[ƻ�4���j��ڢ�=,���� 7�
6n�m�����c��d\
u�u�]��+6w���5���u�6��C���z�5U�pk�� J$)9EP
��0aN���o��^�]��nm�SJ����5jT��f����#�dz�`j�_��,���O0���FP��
��F���n0g��aϜY�Έm�ob����5O
�Z��G����wrL�r�T:�(;��� �y�LyB߫��N)P������K���Vd3~zj����i*j�*�h:��hqG���N0~�I)��۳Y�{�]�
���K����Ք%��
?o�L�,1Ku5����m���y�f\�g3&�g3�3�f(k�-��G�I���̷g�{��W}�\�T*-�X�����$��^Z�&���S�`���Rx
'㒈"f��@���<��;���1�~6���̖Bv���zd(o��
��8��V��0!
�k�A�W��„1�		���Y?r
�3�>�V�"��U�pw�[����-A�NGѫ�#8�[gE��~�$Ѭ3cӸw}`8��(��"�-��2z��=�G0Tٹ
�ً�H�����
�s%x,�����`(�fa�%5`c���,�`xt�,�};מ=w��qi����L�h�>V ���:h��^O�J����
u�S�ך�n�K�W�4�Z�ax�e`S�2p����S�G��,h��Rn駱Tz-��
�E�g [...]
%\��)�p�*_1���͸,�Jc�ƸZ���:�Y �&��< �b��U��
+�s�6�\v
��5�Sޛ�S�3�1�!�qN���
w��_Q�$"&LO��{
�i};�=��ң�t	�䘸xi*ȸ��{e*tjO
2��>�[�F����� �ro�����Z� )�;i�L��8
��ǟrtK�?���_g_1�x��<�?�rs��y��]��Ҏ�zB���6A��v/
+���t�~��IX <�"��b,M ү2U����-�= ֟3 ��#g�4]��)���x
�@<�Y �u����[�щ�7
ʵ�T�*TY�QO���q(���"0��:�a&N9��fӖv�ۡ	�L�GO�R�
�D� �A���&��nH���3��G����ܔ�@���Ў����>�ߺ%�H��j@J>PD)���bDV�O9�}.�����{h�G��iG&�A��ar�'�p�T��~��_r)�~��?>`��Up�0�D�ݦB����
+�P� �iI�sM���ʧ
�ZSh�N��_
��]c�H�u�v�w|]J�<+�"���������.��Jt<��p�;m���Vr�S�m�?�6q�&��4���6�n���[Oޗ�@'�Ы�W�9���ۄ�;AN�c��a�:��a��U]K�g�o��G�K�����6�������x�F�?%�7(�cX���/
O�mt*>�U����jd��B�߭���ƚ(��si�x>���&�������n�By�ᐅ��y�����v��B�����X�����{H��;�W�
n��]�]��K]jܾ��A��L_�I<lҤ|'$v���
��DQ�S1�ğ
+q	3F����6�� �?c���S涠��
o���s9)��|�_j�T�
�R�37I�Ng�j��9����7ۜFO����}�rs)� �c�����BO�w�h�ܺP��a��|�Pܤ��ƍ#�1
+��3{�
c�Y�[���o��\ל������̍��I
��QY"�(Ȣ��S�`#����0{���k�.o��+��û�nbhu�������R9�x��c�����j�x�jQ|黍i���2q��%�R���3���ͬ� /U�>��-�lwK����
&kn>�뱕��W˛��/�����m�io�s�v�g���ΐ
xHhS�+�]�:�л�u�dNȸɦ2c�x��έ-��G�}>]���ǭ�[+�z����I
=N�O�{�#�2��t]s�4��9@\�%����0
�Mi�
�nh��麰oO�ٱ?�c��8r.�1�{mF>������<�J<�
��>#`
+�b4�fb�K��_��[Yq�x�!�}Lr.~ه���>׎�	�����
�Q~8\�2�p��}�3��^B|D�'�"�
G$��[�
��{<$���1�]
��
��Gf��W�ڋ��d�tv��a��yf����
n_:�ݑ
�?<S���4}��k��:�UW�
oZh.�4h���>�m�o��n"�`�!��DB��Y)����U2�Wv7=I�/I��E��f�e�U��}��z�N�3m=Rʾ՟^�7�P�|�Q�Dg���ɶ1W��F�����
�D�IE��v�	�/x���6�rs8�������l��ˁ)���`���P0�V��u��LG������j�ݖY�5�(��}�TsT0�fjVQ�iihy��Xk�R��7�ty^wJ�Np*Z�M�b5���*�+��?�?h��h>�h�ǖo�{�e{�f"��p�r� ����]a��v�6:��r���=�~+H���c^(
+;�ɧ�����u�u7�!�]����р�F�U��)�螷%ϕ���������w�E�r%�':��ۙ�
+{��
#c���T�6ml��۞~��u;
�� ;<����1�
7Z�-7
E�ࡂ�62����fmT�_��j�Q[���
|
�/�ݝ�
u��*����>WcK/��b���]���F?�ki9iХ,�z��
���s���9L��
����%�:z>��~,V�I�^�[~�۷Z���7��
W'e�z\�M�r��[�����pw+)��.��Ͼ
��.��B%�T9ֳŭ0���`
�z<�<t:�ؓ���7���{W(w
�9�/�dO fQ(����k�'��iG�/ڭBƴ�
O<�ҕ�%�h��<�Jj�*�-�������5�
�
�
wU�3��:lzg���O��x!���P�(k��d]1�4�3�`m�C�
���h����ir�'	6�@�6�95�W�[�I�}��
����xKJ.֢�Sp��
�@Y���OS(�A%W�Q-�H{� [...]
+�}�\PY�n<Oy�ȉ�� Pk�/��|�D�p����<�/n-V/��r�����z��~��eOW�J��3��,ǷCv*z�����I��?����y��
�U��#�򕅭cڃMeg
+��ϑ���V
����tZ�S#W�
~ma���^I5v���_�*rJi�%Ն��T�jʱW+�qQ��!�j���(�_p�(���D��S�]��ݳ1�ڟ�|᭙^�&�2��D),jJo1e
�'��T2��rb�D�9}�4,=s�
�*�u�j�z_�ߘ������r�
/��Қ<��d���8�ܒ��C�NR�	R�>���
�1���T?�<��e�:�B��|t%hrlC�鲱[�\�If�l��l��0j
��W
�C(��!�g��UǑ�Q&d��a���Ԕ��J�3�O��0��&�����
� ���U�
�$��{\���<��c�S+��0S�UO̿O��V��.@��Yv����*
��
+Gn0��m�_�������hp׳s�Qk)�z�K�������-t�:�Yrׅ\Y!���}iЏg���݊���*
��'X^������������vȹ����~Q���|7�}��S f�E(��Q����Ҭ��m]��f��^1:�BP��
ޜ>Uo
=�v��e2��VYip+Ȓ�k⧸(�c������1�����7=�

<��n�
+
��Z�q\�u}��u~Wfw-���*F�&�
�	�u�^�O{r\޼-�8��n8���Z3�/mW7&�L�$��ȷp}�rY�%�kôXP�ӂP�󺀦
+����|��n��p뗸�ȼ
�����2E�d���c�vʣ/b'
+i�^�h��,�����������

e�G:��j�+�G�+ln\��e�ȷ͇�%Of���
ICuq��t�9�I����9a8��}l�g�,s)4���cZ�n���;e�N��.C���JiʼF�^ZHG�
�%�
��9t>�ZG
�5^���
e��>��0�����U��ȅ��]�U�?>��'/(]BE�s�{��l��dZ�7���b��J
�MwTZ�-M�ᥫԀ����/
�5X)X�
��v!,<�xc9Y�:��XԿg��>���f;[z�c����m�Aň�_K�;C���|�T�p�,6��
����ZS2e��D2�Z�����r��^�J�^�i
G0	�!�	���u�WKم�ld�7�g�3˸P=�E��^�r,N��6�� �
��
Ƹ�԰&�zX��m,b�V���
_����Fk��
+T��p-W����R� �YF�ro�4�x�)�	3i�Uz]	�ž2��q͐����}�@��(��LE�h^�X�f+襙o�
>���l�{��B�ʝB�Wӂ_#���	
ʰ�I
~��6�N����{�'.#�O�T�
���^{�W��[I���	��5�ʩv)�Ss��-%���P[�v��	�wD��D�!

�
�Q`�
��A�u8u0��%=�f�4|Iߠy����g:�Z5�f*{%V)��ɔCf�Ԫ��!���3L��V�d��V�U
���V����J�%� �ׅu�4�`���Y���@]�z����K��
=��j�Rn��J����zw� F9+�)v�U05�19F�P��~��`o C��Y�L:���� }?	ڳh!y��jO�JV�;�����9��&K�ws�R�5�K7kQ�e$f��#�ޯ�4�⫟ti�z���~v��Q�a��x��
�"`W�B�w�k���p��o���
�>`g�#`�o
+��L
��`
#�6��$�rC
gg1�f��ԝ~��S>j����J[|���K����B�F�2�xO(x��ph-wa��No���t
=áb
x��
�P��� o����[�-f@�1
��U���ĸ< �[
+��}��c��+���+*_+L"*f��
��AF��k��.���L�#
4��
�	�S����A���@(���
������ ���)' �g�\M"O�b�@6ŞD�;�Vz��
�4�""��	z�O>��4��3���Э�y>GO��og�δ���c^K���_-�Ր�8����n�\������K@�5 a
H> i�^9C=�̯ �+���d���� �:*�ۚ �ׁ���)1�GT6T�E.
+��~��1��L��l�
2�塩-WN;�o�4E"@�WE���Xn�
�R�+���v(�j
�)�j�s�AA@]]���u�ԋ2�5uZ����x@#�
Ш:
4ETcl��GlSq]TG��U|	l;��U4˴��
�G�4��.�V��?�j�趉�|9��������+ڬ�:�^mJ@�*.�AXr��r�L99��s��Ov�v۪��U���V��A����M{>��g]MvK�'�z5��ݲ�m�h�����x�j���m�l�
�g���Sѩ��
��nv�!sY�ȴ��v!�sb�M�У��&�r�?�j��&H<�
1Y��8��E8|���w��<�#/������c��J��=$3����;��7�T���v}uun��S���
��sr�/������Ǽ�OJl��
���:����ʴ���9	�����u�/��\?ƨy�[[�~�#%�-�ȁ�NV�z�3�H��37�Փ���'q��=��DO�ۈ�ݨ�D
��{�Gz�c�O|����5U0�ߩ+��.~����
��#}&"h�Gh~s��#nN��
�|%�~�B�������
�.� S�
�T�x���u���sg�5�%F��C���b�X�+0��Yi٣ec�lV��~�u�Ɠ����
�S�8C��.,T������@���ip�w���������t��Y�����u��Z1JzB8�s�S_ޜ[k��n�E�܂�X؍�Pw7�Y�h=C��!,���tm��)���	�Q�q�j�����~�#�2_o]��(xt*y����s������\ja{G��a�EV۵T^��yX�*���Y������Y(cth�|<q��<���	����f�j�ε�;�kc��~�즂@b�`��hb^�Ex �����Y����®K��.���]��'��[ibw�4�K�z:Lc�u�c{�MS�E@��Y(*~���dgыq3C�G>E\�=�x����>�
�w&�
��#a��-���×R�
��\����k
:�;~�_L���s��ʳ��ElKM�j�g�
�A7���H_��Yh�����=��}~�H���
=~����GG�Y~x�7JA 4��Y��Ii�+Íy��Z��n�?v�t��7�w�|�CmI���^x [j	��I�7�h��B8la�@�jT_@\)�+2T�m�A��G5�s���#*C�潺�?��Y;�W���z)�Z��м�}�v�n5�
��vۗ��j��<hi�t�7���B{�,N���pk�����đz6Ǒ�-p�e
+���ZsO<�w�`�u��	;]F-V
�]�2ȇ݊�
��
3��b����Q���Tu4|-o~���98g�*M������u
�v[��C�~mۏ�/���Uψ�)<oݸ�>;��p�O}��'�$*zq!�G'�*m�i��!��Y�a#^K/�A�Y�7���k�Q91 ��<
�kt�G_E��M�VNp����I��zw2��n�W��Rw����j����ҭJ�G{��43*hfV����.��FA�,��
\� (]t�E�H�kתO��bj׳yd���b6�úɏf���
%]��|n\'~J���{�
��o٣��߻Rc�+5�`>�<ҎZ}�\�	��$��3J.ڨ��Z*�M���L�XMw�־ԙZ
l�6����lI����U��)m��%�~^t
��w�f�L�ͰN~x4���R��]�͈1}���oYyP
��.�~:휲�x�ʑk��b��<�[{�%I�K��M7+O����n5zs�<�VS���+���zj`<64���.�����G�w:�ߙln�.
9��7sq���n��myZ�m�t�z7�a�a��4�C���>y}��}v��ͥS��
��aw�<�n���N�"5<|,vzFM!zR����ƣK���2���¨䍌Uϧ6���vV��%?�|A�ck����̉�VWS�eYSwh1Twl
Qkg#�����/��z�E��S�����q�=��Y��=����Z��99瞵�A�nq�s*\���x�b*���X��tnz�9�_�u��HGV�{�8:n�������Su'ͷj
��*=�aJ�L)
+w)9�y
+�1��/��_��ߨ�B3��
���]\��>�����h�V�Ack�j����U��(�>�g�GӇ�Ǎ'{P\��1H��4���%��\� ��v1���fQ�ocW��[[i���³�J>�Vq5.K��� �TER�I �r�C|�Ü�2ĺ�����:#�_���m
%wZ��
��e�
�m�^
g�Ւ̗�ܶ_p��H����փ��;��6�Ҝ^8���e��2���eYj�<鞏�R"撺�N�٥��IaE0:�I�����L�����ո`"��&ʳ:=�{`h>{��Ὁ� �X5��sT����3�:fi[YR���޹���hU(�W�/樴��C���)�C7p��lQR���3
I���LѢ8��jb�nvD�<��d�
8U{�
D�W�1��r���ȭ *�XT��e�����X&t&W��Ӿ��=�\�qo��C���mZ�햊�tB���W�y�
_�������q�HZ��w&���U�ST�&�����
p�yFm�Ms�c�ۖ�<���e��`�%�ֲ�K�:;�Иp, [...]
+�$�x\cw�3��
aT^쎘"lmw X����>&bY��ޕ"}6ZU�'�]Z�33���)����ؗ��$�d>-���O���@}�ɀ��	��M�~�D���֬D�1���N&�}�jN���+��*�(�\t�!�����9MW+�Y{G���h�%Zl���4՛n%J-�
�
+2ת�H l&���
�B�L�����jQɢ�3͢�i&�Z��-N�v��픲�ub�Iw;^��������9�����a�㷍Bj��t�7'������3��c�S�\mA�&�
���G
�Ob�=!��
���lv���l����52�E)�d���\�7N)3ۿr%�1�F�XX���F(�T&_��q
+����� 
�܁Z�(�ip��������|�l�?>��rJK�B\�L��/
��,����6��;�ۆ��k��Ʃ������0���1.�v����EEN^ ���t;yQ�	?�� 

���s
Q�G�j��)���x�6����p���Pn����Ӏ�|�r0
�B+��y#��q=�ɬ��^�)*����
r��.H�N�n���3p��)p�m8'v����
����%]���
��VBa�!��*���y)
����t̆X��<����Q�T�Ⱥ�f��ro4�8[
�]��gv��#�x�_0��!�B�E�,��i8�;B�����/�h&��4
B*��v�U@)� �i(�
���&��]�8��J�f�n�W����
�䩟�����>��	��hs�sҔ�ұ��:]�
,sY��e�{S�<Ig
#h����
�-��О�qL:��Wp�AO�*�ey1�S@��g@�l��� t���eǯ�m�l��l'���P���:W�\�
槔��vUl�ͨ�bn�o3����'J��!����
�����=`�� �x
�+���R1�L��찐��T �ƺ1�+���3Ƒ�3YYϼ�	`N�'`�Z0��Ia��;
x��ԇte]��E�ǯ�
}٨}c>+v���["KÏ���
���)�7^*U3�w������[l�ϋk� ��g �0�]p���y��8ܢx�� W�u�����GpՋ	��g
�u�Q�6�5���b�Ζ��ˑ�䁹��-7d��c#ɕ��|SF�b�N��T4}�+�?���
���+�U��1
 ��wzC
m�̀Ц/1�8|[B����MG@�
	 �e 4
{ xm�6�+*�u�0��v��#�^������T	�_|��~)�Q)�9�8 p�l�
+������
�[Q�@��M �L���$�< �[� ���4�3@��E �!����[��?E �W�ۣ�
H�		�����Vf�����MF�ڎ� :$��Y���Ĝ��Ƽ��6$�ף�k 
�	�����_wN��F@��P����i�]ja�j�Y�k @��&P��a��
��
ԅW� �sM)
�w�Ï^��
+��x� {�ЕT�(�����F�趉�VZ���
����w�H���;�V�� Щ
	�jT�{�n���36�i���b
^@94�a����&�g����o��d�����d#$)����_�@��_A��$��|��{���1Ό^csCPM�V�ݑVgv���ӿM����Y�$��C��Mv���&�g"�����0�$�!5��'�,�
�&���*��XU�{H4rwk����
��*7�8�]�¬yu���e�\F:x��Q�?����:�ȑ<�*��Q�A��V��V���D��i�T"�%n[��':�Qy�Ӯ�#���ڬV���?\	�?�k�̍v�ɇv��V����r'DAv�
>�(0�sq�O7	
����
lv��YG�
���+���F�D|g
̍WOM���#�&x�a��g��:�	�����$N��/8zڛ���n����Ov
�5�:/s�����:��Ú[畟��[U�,���,�&��-̡~W�Y�.
+�(���k��-r�s+T�/xR'��8jd�?�����?9�t<���%җ��ފ'�[��6�O�Ys����9��x�s�ie�9���z�z�ȁ����t�.
�)1'�I
gV�&�
F�z��*4�2x�3�@����`E�Bz�
@3��cb����O!|]��u8����w�nyl��q��m�xV�pn���̺gO����S"DRz	��f!F>�a�7�#
���ۿ��~��c
/�1]�Ӣ�[��Q_�W��(�:w���v[��R��>�7�������
w�����
���r�:w��B�C�
��)1�U�M��F�̡<ۙ�
�7~90^��_L����"o=<���n�JuvU
+��)9�G����9/�}��k��
����^30^������->����E��b�r;_p��V�f��fk�
�Nj|�y�r'��Q
�
�	��9?0
m��(�Fw]�U:uª�Q����=h�Wg��)μ�
�u3ȵ���3i���}4B; 
d���e����
�Ո�Q�֥�_���m6������o���E�kN'���,
��v������
Ow���2��
�G�)�g
�e��={7�t|�K��s_|3��4o�&���θ
��6��کm�BPsoW�E�Y�;��
�.�=����+�a��h���J��o��jw^Na̞�K�
O\.t������R��6���ht�;� mJ=W��gܰ��Y?�C7�j��)P�a�VmQ�\mt)�=!��
+e�v:�u�jի��n��w�r~=	�)����8��
�)��-��*\Ԣ\k��V�?C�i�a�(���
�9yH�ʉ�<�q0�v��'m�2ȭ\k�{�_�׶�x�f'�ٹzث��h��ש��Z�=
�4��Bi
���kE�5o~�EB���Z�=�袼1�e�jr�+Rh�X� ����Ø����{�9A��s�.惪c���
M��^�&Ѻ�5����;Si�׏�]L��>����-Dkk��u.-�ڻ��|�H,���ʯy����i~��y�)�2��
����7Ty4���!�+k���2�r�.���sik��g�Ћ��Ӌ��ř0,��:�*���	�^��u}�@ݦu���t&>�
f^�Ii�)e����=[�G�w��/��?HԸ�
a�c�Ϳܲ���˹<h��\��sr�ѹ��
+�PG��Z[6�7��+-�o5�Zjj��lTJ�)�*���ٮ�_?���g����M�]~B�ڠ�^F�ո��+�%xǣ� n޼9+�iii�K�}~�.^��V���b����K�
�cً�-o���U�x&�n^��)�qO�*��Ҹ�'��a�T2$��>\Y8O��t�֍�pm�`F��eD�]�dg
�����+]��ۇ��;��S5��(��� �
�|~x
s�t��K�%�V�+>;W
+�[KF�bʡ\b/Ӓ��)ȧΫ"�-�-�Ho"u�σ�E >SON
��,I��D�
\�5/�M�?�4rM2�{�6��2hbШ�λ�
�&og�G�<�C�#�c�Vc��Ufjͬl�üW}���
��rۿ���� ���%��k�������	���4��g��P)���"I�1�*V�<� �`ran�\,��_��/�#�zN�lՄۣT�|�B�|�Ӆ��>��9Qw�(�!5��:��ű��zi�,>K�C
0'%�.|�F0E(���7&@�~��
_�
+
��
�bS��
\F����b���e�}�˰K=����]����"
+/�Ǎ�,�W��T����6S�l
��^>��“��t[���s7��9f�>�G$��UHC�C��6ɣ�\��T�+��
+�q�
vC��{�o�^���r
��㱒a��7��4�i
�i@
-��Z������QZ�U
ӓ}U��O�e{��,��F�S�{ժmi!K�GO̅�@(,�?���|q;�}�ܒ�������2Cb7y1�V�5�%�S���R6�P�-���L�C�hA\b��ӨN�Ӣ�2��:�CP��Q��(e���/���&I,���s��l��˙���d�Pmw#��?�]�b!v��'l���X��E��2�3��0�atkAдP6d�ʏ���\
q�2-�ȇu�Hm�O��K&Fb� �����#�xW�JR�bj0z�
�:���-��6kQ�(��)��F�~��B0Ѩ\���_���8#.��;��/���]�6�����Rׁ~��z�E>�~�
�;��)H �%O��*a��Av:)m�V
Ne�/d�G���#;�+3�Ae�뮔E𩜵���{"�K;=e���^U�Qy�������2&f���#�����$93d�)ݡ��f�
�
+=R��c��/�C�a̠+5T�
�:��N!�Y7-SN��
>�; ���8q]G`1����(X�1�e�:��خ��81��$L���[
���\?5��;*���#�|���v~7�x�`)τ>3�,�"�H���l���3�c��)��i&�/��M�w������E���(O`L˕У��+%�y#<��3�R��H;Q��n��>U�#Ҵ�#R��C~����O���I �k��vNO"�ڭ�3g��s솤(������^�����fKm���/�z|t|�5���C�
+қ�3���>�\�c��pp?r
XkF��;oMң����j�tJ���}@S�=�L���O��;1=\ܤ�CBm�eA#*�����
p�g*�$
Xk*�4�A���_tk�8S|�;�X�}���ڰ�6��9��G�����(
q����0d��Lj���=/;`����0�m�s�@�Z������y
+\QH��3��X��oJOw���XI
������ܦ�p��fj�҄H�R
�	�:f܃=G/��/
t�iw�O�OZ�=,������ Y�_ �`S1:$ ����~��l���# +6H�2 i��0�ۖ�w <~���m4��=&�~�%
Lm_~��;z��p
	�aǞ�4��R��LX;kD{�gi
��`۟
uNbl�:�m
�
���q� uQ��PH]�&���P;��}��lcj���p@����T�TMЬ��l�s̢?��E�L(�������Ɓt�z摣��Og�n)��J����Q�FS�5�]r!`Lu���ыb,.���c�H�

��hWb\{�)U����� ��
���Ub0�R��� �7NΒJ�%�;������6ZW�!��p�ЯqM'2Oc
'
#)�A�����s�%
��;ǰ�1| ����! �6���p�c2\F=}+��;�T/؛��]8��`6*�.�U�aȡ��fLe�:pQ-�����ީ���[��f�\&��Sź�%Or�F
+p�����&!�_H��_�Ҁw��;��I�����Z_ ���c�$��N���O��cZ���x\��#�+*o���\��֢S�F�3o�۳��Y��0�0�������H�	�
���)�%���KO�@T�% ��:w�Hig$��D�$ �����
+H���#L ��HY8�Ŕ.+-��K�N^G	����}bC���~Q/��
+%��d����\�ȿ�mb�M�/�!�q������g@�+�����	�}�����w���+P�T��+n��KP3H��7>��_������콃�d63��9�͍MО��_p��~�7��m��G|���&
+��o�nK���h�~h����t�4zq�zc�����
��@8�[#����O�h��gf�l�u|�햕m�ȁt��#��g ��O}~?>ed�?�
�}@U�r���x;����
�f���l���u5�j7uT���Օ
7I����
�'�&��'�D�&n�d[�$axz����W�U
���}ӷ�nx+�\�B6%�Y�S�ʅ��9�U:gn��|x�8��}tT64�>�z�
��8ka4YڟlM��*��x������7����
���
���e'��s����ـ���zƽ�QY|�Q���҇1��
�f��[���T�:4����Һ�����q�+q�\�=v�$Fڟv}z;=�i���	��z�_C���n���s��g�q�O���
��[��5l
������U}��ռud��������ۣ�͵å��������O�9΍�w�΃U{`�
x�O���E��dW�5&�.7��/�
S4��uU�<>�ѓ�Y��'�NW�O�����x��G���]�����V1�E at k�ܸ���zP|��Ye�.`���a�ɮD�&�r�M����u�=��`����٭n��?ƹS*.���,�N��mο�
�=������|�X���(��w��"}
�kq�������5ofݸo�*=��,b>���vt�������Ӈށ~OC_�`��с�&�~hd�>�B���J����<�Tն�}uC�$)�`B	�9���?���s�}���-��z�0�h�h}Y��V��8�p���?o�A��'���b��j��m]E^��{v�}�ncT�
O����Z���<zdO��R�\
���ɒ�}�Y�3P�j{l�~<+pq���~D.�I˥�e�o�ې?r��h�@�jO?V���Q�H�?O?
��l��

�H��Y]��~��W�6]'��U�Į�_8���u;�������	���!{zf�2�����ɴ��=
-����[̺*����ҹj�ʽ�x]ݭ7��k�i����NY�wV��.���Uv��m���\nP�Sq�r�ي��ʱ��jf}p��(y/N�J�aP����=..[s8�[)�f�n�Ґۥ��G���zY���2�z���jB�
�Μ�b�
W'w
���k�Ɯ.I=V��K�rj_*�PO5��
�U��:�Fvb�_��m�'��x
c%�Q����\���`l��e�����*��ŚRԾ���kz8����l���yNi�������K��m#S�7uJV��9U���|s�pY=�	��{p=${�2��>0���W��*�V�X	-���5�|�
+�
q.4�&l
��`��m�v�oݨt>J���v�/,�gd=�	�a_���=?9�_5�Y��&�
��TmS
����
퓪��9�]hm��Rgs��XD+�)��8Y�;W��f��
L�
�j���j>�f~>{�����_����i�<e��i�H�˱>�o��
+��cU�n1�6���ݢXi�Lڪ�Y6���u�[Te'�uĵW��L�">m��4�xl� ���˕}�8����\g��9�<��e���Y�G�LU/ΝH���f_����g�ZEIE%�_%��]�
Wl��S4�]����ՋQ+D����Wt�Q��|M<��r���Ks�:,2�mdJ=-�+�\?�Us��mm
�O��>u�ޥtd�B5�@i
��.�%=���J�fwh*n�HV|����ZHg�h#�g���-�w�[X�N�s1���uo at i������jxV-[t����Ђ�i�>w`92�M+��
|Tk���8Мij��6�U�K�Ra驸7;��� �
����WV>WѼܒ�5YN�mj�%�_����������qv/��4� ���bo�e������$7���z��l�a�T|H.��C��䳗BPXNr�C��3˨��E_����Ґ���aܙg�L#����*ߓ�_�JLZ�]u\Ҭ:/�2#M�
Ѳ�
�-1�.���yp�I�S}l�S�槹)���|!�}�
Juә��$A��dž�Ml��kYQ�iw�[n���1|��\��ֶ�z��z�Y�EB�u ��]dF��s�U�wbi���l�S�F"I
�TE�����,���5���E�r�ʄ�H�*��{s��6‘ʚ�HfJs����?j�^ܴ���=v����r���u��ɢ��yC�,t�҈��jr�1�}Tk7�~a�
��+��X�O�?m!;� [...]
�$wQ����B�-:�VI*1�x�vh����
]�3�ݐ�4���፸��R�	F���HVr'��b
�b�"9,�]�ѩ>C"�k���U�uٌ+��6���^�Kaޘ/^�r��_���7<������m�кUª鋕�������+�Z�#�~�ߢm��Ȏ��+/�Έ�&R�uP����j�J���cw��^��/	
�E	z�2��Am�t� �/Z7\���ۯoW]lk��:+ۍ[���<���N�ج6(���#�c}�8�xN���ʙCiWD�q݂ۙ��`Ԁ��=N?t��I�"m\�����
�/�����*A�R*3Q۠�.� _Z0�WR�������F�%?������on�]�����-�|�s��YP��.�Ť�́x�`Ot':N�ic�;o^G"
�ӯxQ��)�����B�y,�f��(�}
�Q�`��8+%Xـ�8
@L� :����D�S �?�"H�K"xҀ����XA��5��p���In�����f��
�B5���
�\H�X�17?�"��ه
�P����J>����`r �����w �c�J�� y��	�C@��W@��
 Ǵȶ�d����/�e�A�Yh����xݯe"m��^{�+'���5	�'ZB�*TW����L6)��\�jC�\��Oy���(��MP
&�������{�v��RO
�t� h
+t�e�7�QT�k� �i���$ j�/&(Z��r{�OU���^
+�xm��l_
���\����%�����^�z�}�D�����s�!`&����ɷ
|� 9&L��%����>!��
*�L�\� �7M��_H^2 at 3�	�~�s�X� F
�Ѵ��
�M,���)l�.�K!�������fͬ�
+l�+0��Um���Q~��vqJՐ�
+p ^ ,'�V߭Oz���@.��G'��
\
�Wi����
�L
����p��

����g\�
8��|���d/Ἦ����Q_�A�Im��3�xJma�y֙\5��#s�Dg`xX)�\ �π��W������x��C(�ou�
+�l��O�����'�a#A�|:��6@
+8D��^'���˰�Xj��ȭbv����X�cq��w�2Q��ZF����xa�3�Oޅ c) �z�uj�������?ܯ�k) vi������+4�d-@*�@jbX�uH^;�^���>YRh{@������T�\�|�?������Ȣ4`���'6���1�r6=W���1|w�������~�?�>
+�W8����M���.�N/+� } � E�j@��y��e�_��

@	㬉v����Gi���
���qn�7���mF��N�
����=dcmY��7�'x��w����#�@��+�����m�p�u����hO� t����ej	

����	]�ǵ��?�������G�}��f�7����'r�����F�va�t�l�>���=�tZ�A��m�	�ݬ���q�b���Tn3�Bv�����o?�o
+�W���������_���x��+/�l���o[/b��������N��Z�_���,��-;o�E��t��i�׳�ăA�8�̾u�&��!F���Q�w�����\��,�-��� ����4�
��q�oO��˺������`q��R�^�Y�,9�v�_��x��õ��G���5j����v�S�-R�
�N��d��Z��Wz��`|��	vYe
3����?�L�P��@�d�3剕R�Z����ʡ�RL���Pɺ]���zj�����T�^_��]~�3[�'��F�)K/��}�`Ѱ8�Iי=\�6�ns:���������3�
��a�
U��~����!�|���o��޵U
�������v
tރ�뛿���>�+
aF<O��Ce���R����Ԧ�.]�L��iR���c���F�X�
݌B<�a��:��CF���
���3�����V���w�����
:���^�c��eU�"r��&k�y�Ŝ�u�e�ː��_ҫ=}���'bHmf<���#�~���gJXn
+�Ǽ�6�!%D���]��O:�]��9|�FF�)v�c3�Uqjmj\����9.�Oe%HV�?�zU��?G��f�u�Խ5�e�6�5��kX��u�����
VL������H��nZ�z����[�=֋��I빈\�V�%�j�R�N�����cEx��2�
 ͛���n�p������,]�:T�/{��	
F͕�꾽�W�w�^	
Z6�ܮ�p��?�Q.��+���0�*#�a�[>Eu����F��gk�\�!���k�B��V���|Mh����@浜��b}Y�9ur_��6�߬1g?�zY��W�{rɇ�jQ�n��
+�O�����^eۤ�vi܌{%K�Jȅ(�_lQQ���J)
1��:��ڞ
+}*�%�B��'5�rm%&�mܙ}�׫��Rs�ݫ�I�t�ﱊ�<��8w���$;�\����#o���dCk�V�)�f^�ka�`^�fw�¦K�
�	?��eӳ���7�4����${�񲀆�ػV:�u����MJN �y۹��nTs�P�r���rl�#�[0���V76tr�ueɒ�k6�Sε3��qB���+l�[��ZO��m
+��̷�A/w�
�\��<�g�J=�Y4rt{n��R*����٠Ž~�����zV���V.hS:�
�3�K�V�j`V�e�n�v!=�y�Wn�W���i�����zu4Efu͟��W>�K��{��sZ�f�SJ��FΫ匔0���3Ԧ�9�J��EC�&��/oS��ŹJL.@%�DF%v
�ݚ8�ۨ�
�Z�>��ĵo���8�Ԅ��\68{�
��9��]3�U��o�;^�n/�9m�}�83R��Z�^x�wmj�o�N�
��ZᦒJ�R�R��u�I��٦�o�<?I�dz���r0���`S~&�1ڞ�^j
Eq=���� ��h��f��*���jO*�yqsϴL�����	����]��磡�,�0R���j�U&*�VVJ�W�+L.�d��
d��5#�X���gE����-�$I�u���
�,
+��5���U4�b�/��5�"�NrUF�6l��/5����BX&���KDl/
"��s��#�MQ�\���)����ͬ�ǭ,���0�������3� Ŏ~�V�b�5�`�(B��bQ0��/�Em�OR�o�,�ix
�iF'>�E�d��=
����z�%�b�Om�ݒ�^�;*� ���b��:��;�g
��U�z�Y���r8�t��I�3
�ɫ��=9}��X��+��l�B��<�	odx�=๹y2�2m78|w���e�L�4�'�KS�>����&�E__6&mJ	��z
}/�j�뇸iTz���N�*���6�����Nw�‰nNj�sC�q~N�^I(@ê�
o��/e�->sL��y�N�r��r_������@���՘��2\5���,w�����nϦ��iCh���_�7}�B�3��4fg�^��w�d+�zպhE�
+x[|iU'�d�9h�5R?6�KT͋�FK�'Q�Q��se_,q�X�����d�b+f��y���̒i<����d��'��id�K<v�H�:��
��}�D�N�d��(\������RH�ݵڅi�;�~��w[���:-�
'O*��,jj����h�Xeޯ��
JX�cM��]a��Ӯv/0M-�G�p��ȵh	�z��o��e��SQd<���ϐ��S$��eo�
�k�%��c���8;��	ȹ>��
z�'���ܬ�:�~�
�
�^5��̺TF��j5���G��9s��'�c_��W[c�`��'x�ђ=�SWlgSJuWM�/�,쓝;�&�iyL��ޚ��+�?g�4
r��Hpd�
��/�0Gܧ0
���M0�0{b����Z����0y���6��3V��c'�y�Ԩ|j}yhk���^@�'-��U�kk�|
t�4ҺF���"1h�+��-t�G�x�
q�,-�
59cN�0\��?0�|�
�*�̖>�3��ʰ���a��a�=�̖w(e{��	e��n��Kk֭�� ������)W��!�+���h�}V�0�0I��6*[�jgw
+an�,n
�L�Kz	s���ǝ ]Y�
J�_�̶"�2
��̰�;�
&5
�m�""֝���[&í8ׇ�[��#"e<1-ߣ �V�	�gMJ=
��+�>햶��
n0fc%�z:r�ޅ����R�HгD�v�,6!Z��rf�����,Y�qe����HH
�_�Q��ct
_��
�2;
�.�J�^Y��
�A���������:�^�p���{��R���m|�3Z46���+��
��eJ��}�V��M:�E�nL96�Gԣ�.�}��z����%�r8j
r	�6�I7�@�Q�3
�i�٭�7A\�|TA H9�?p���l0K�:�
;�ii
`:_v�X$h]�t߾����ye��q�?��������P��G���5\�Y�+��
��(m�\d�{2V
���JΖj,�}O������)��VR����)�8�Ot� �t�>pB,%�%�%'�SU
+�p��c
������
�WP�5N�:��ו<������H�v�+Ucq��JI�8�7w��6VT_Pzxy�id�4]�ۛ��NP.������,?�		k at 0�-AKg�V �:#���[���	���
�M	NP���8�7�|���)φ�$����N#�Op��ʦ���t�#(m��
��
+������������ i at N��ԑ�
$�w)\�����7 %�N04 )�͏�K=怤g)@"�d��B
G��S��g�����
��������+��Q�E}eUߞH6
�7Y�dw�$�H��y�%{I�iP���`�*Z�	.�l��8Ak��yT#�$X	�jV�G
('��\D��M@ɠ(Z� 
+�(	
���X��i�
+��OV�F��h8���
�F�*'A]����
k*�=�)!�t�1�`ݮ��As����g�
��wLF	�S@����b�)� ǩ��RK� ��� �F����*��Β?�AL2�O��z������;�.
�׽Y����I�B�x��<����q���/��i+�}<��0�i䤰i��s� \'�
�.�
��N�� �M��� vR�vʾ?�����O~�����$���j�.��;�B�%����5Țñ�ʅ]�<d�K�p����i�[\��{�p� ��~��m�/��W�e�w����K
+��� �=R?+	V]�Ϝ=�{�L��	����p� |k������er+A?p�0�'ck�
+x�Bc�i�#�c�ɇHD�1�A�{1�G6ެ�@��o �
�G����a��sE��~���
+D�]���'@<�w &W ߯
+χ9׫
7��u����>d���3W���򪦦"��c&?+�p��$o[
��>������v�5��6p������&|ӯ���׆�����iYL遬~ف�� [�i ��v��@v� �&�Wn�d'�Η���i6��FQ����Z�z^7T���¿��
�g�ݶ���=����Ɵ䄯x���~����
�P�
4��M�U��D���~����m�\�����L3�����oT�I����7����iA�5ږɇ>�q�w�%��v�*C�6&W�
qW�댽yW, �e)	�J�B���\���>�DO
t�O�$����k]�<��}��+���Я��i��c����Ա����v�R�./K>�^Ȱ>�o��i���'�?HCh�
��:ę%��7�^_��݀yX;�����E�7��9[���c�)
��P�O
+��
���I�O/��s���܊�9v��!sވ�왉�c���a7�w��o�\.��$��^�D�ɥ�#�b���҃_���~m�*u��4��=�|z����t 7��X�d@cN_FK�M��j?i_���Z�>��_���W�g��!���݀Hn��'��d��^���B�O����p3}ߓ��sK�����鴊c��ۣ��WG��o
]���b�
x�j�?����[V��S�Y��?�O�,������o��xV�����pߢV����Bz��
j������Q
����
M��^%Y�
��f�w������z�&��)'!�����o*�h*݁�*�
�l;F�d�R�,܈\���OBOԏ!y��\W�k�6��|��eF��ѯ�u�,�_���'/=p/Ϻ�;7���1�_�jO9h��;+
�+6�I�ߊ�)ݍ�7jm�ܬ�l�e�q����x
BI���X|��S��n��7ߣ:�4���;�rY�-�az���o��d�u�7�e]uU+YldS�-���y��J�$Q [...]
da�]�T{��k��U���m|o_c.�{�S�\	s�)_G�^��K�y��c�E�~o.�a7辇�[�p�eb��K%�
 %�C���
���O�zj{i��ֽa!Qrs
<�ԫt��m�M�Ɯ��%��ʩ�4*ҫY(_��]V���t�N�~ϧ�=(�G��
�K�A�Y3�Z���j�^$_�Ca30�
�\ӡ����6ݞ����@\	Fgļب�X���0L�w-L��p1�/�ʨ�rش�_ޫ�ٖUp:;���{�M����VB�7��f�4oa��\\��Q$o�Up5�n��ad
+�f�K�1/�]$W�lN��N��%�2����g�/f��
���
�|Lw|pe��xy�<��=�5�wT����t͞g�h-,!�\�r�ҰXs�"y)�
+�Rۛ�n�dz�ϟ��;FH�:�9[s�ck�A�%}�l�?�n�6
Zg�*<q-��mu��/�9�?�b� -��s��v�g�%Lw��u�
�R������]��j^_8��Y/�^�̟�R3/W�Q.�{�S����+X����Crz����M�7�e���+EA�7QN����B�ʃ�v	�Y��e���,�G�9��|����,��;:�[�z��
�A���6K����G�QQ���]|���/�M����v0�9�����p*�k�� P��A����@%��L�
�I���E�m��[��ܴ|f�,�
Y��Pl);۵Ż_ފ��^�*/�&����_�:
]��+���F+(J~^^�
�1��������a���VB�+P���L޺�2�Z�
��Z�
+=X����&φ
��POTG���H�dg!�'�^씖wQ�2��MN��K�M����E{1���⦗���c������/��x
�I~�
�����Z��t6%�.�.�bc8�۬�0�7�W+���mV5A�88Y�KQ���"����
Q��u�iB��H܎��,��X=���}8�
�7u�
+��,�-��M�uc\}'2n.�a����lz�_$�X�]�cf��n�Pn:�c�.��
�H�2H

Av<��k�y+f��	/������H o��X�<2��ܬ�9�ۗ��]z�)K�Ֆ٬���k(�*�,���
+-T�u&��*,%wZ-*|X[�x�/��޴y�S �VmT_�!�1k3�?��73c�7Z��m���J"4o9y�sj<��.��f^c)�b2�w�̸�u�ak��>������:�
��	��W�@�"�&�G�����\9�
+D�0�3�!�+vKj���8Ĩ�
+���O��5w�x���^v&ذ��?v��>�me��+�����L)vU�Hf��>>X��gi:I�0~kԹ����P�+���b�%�UtFjr�H<o�ћj
�†|x6c��zl�)2��i�����|��`���m��{Ɍ|k�[^�{�.¥�6�4U�t��<��k
'��a��7�<:Z�
�m0�|�p��4y{�<���R+_�ċDl�w�D.n��KY�	>B�
^86^�Tڑ��.�1t��
+�P�l"(q�jhE���E0�`�񰍷J���M�\����q �+�:c�.���"�+���j��0n��8p�"W٠
���a-��2A�.&K�F����/"
�H
��R�ٹ`�.F�Zq�;J��Y�8#��
�O�i��4���+Ȟ�N3��X
f�A�;&3I�~]�j�
+T�M������1�����|��#1���f�e��GHG�L���0���%P��rM��
ʙM��g�d
�t�
d�\��G�Q���5��M8��9,��,�X	��e���>�ʛ�E�����H��F�†��,�|�GY657l/��ͼ���
�PaScqM'�o��3����{�f6�-�q��ai*��wj�U�A>�����Ce˵���R&
��ٴ�5虻M c�> c�iP�:�S��i5�n���3�fһ���F\}�-���-,�4
+
�/��K	!/�-%C{ܺ�q�ֳ�#�K�CW#C�C�턀[ܐNp�`�M���(��f2i�e
=w�
���N(U��|*}_;�d�z Ϗv���(�d+Ag&�b�m+�\	���^�
+����|^�9
�N��U��N�U��w�Iq"6
+8�΋��b�pD
�t
�?0�'���(���HKSp���i�
+:�� �@�! ���
��Z���@��Ё�IpYt�4�[6��>�g�� �`
�yd�
G��W�7����!i�3�<ՆGt|���U�K�[�(���t7+���4a�}(� ��|����YX��tc�������S�w�Պd�EZ���s0w�X�������
�.������#��
x�����ߗ��@�
}��p`E�5����vb5�� �E`��ݥ�����x|� �N�	d�j9��x�%h��� ��8�}Txy�x���)�^ ��{���
���p
1��p�j~�����e�
+��ܳԐ}	Rq[Ms�3~���z�W�0��Z��~*����!%�t@,��^����`� b�4���	 F�Q "N1	�@���Mh{��� !
���Z �!�h��sr���_�{�Ɵ4`����
/d��T��
+�O�|&�V4C�چ��v����$�c%�W�]@>��?���k ȧ�L0��H =�8�y�ˀ\���\�n�
U8@���l��+m��^�\��ݿ-���&4����S,�<���Zg�_���Kt���R��ϿM��|����	�q�B7Ac�`2t5}H�m
(@,#��	h%��i�����eZ��G
�.��u�T�
+��6�u�Z˼-�]����%;���yr�5��I�𻤬 ����~Z��{�M?���~��;~��;;,�l���`9�`,�Ul�f�1`��0�,X�� s~��Ҁ��N�I�:���y�9���d���J,[:^���3�0(k
endstream
endobj
128 0 obj
<</Length 49347>>stream
+d2�Ї!x(�/�d ,�_��s��Qp�/|UݹrIP�0��B(���x����yl5<^�>%p��Hp��pw���h}#
>+�g�䬭~��Q6=܄���ej��TLlI$占�:X��� ���x���W��f�����`�	�mX@�V���y/
DYр��b 2��l:�9��Qzy�V4���hå�b�}�۲
]4��L	
�"�ry
����N?��j�k����
��'�������~��Prj����5�yp� y5��|�
���)�o
�]�佖��PFr�X=(}�	{l�aL����#����Y�A�����m��m��
_|ܯ��o봿��Z��)t
Tuj����Jc
���h�~���J{�@��[�eC�
�_���!���OS�o2�7#���5��	
�Aut��nc�Eݐ����XT��N�,EμT.9�QJ���“��㩰]
�{?��M:(��7����ZW?���b��x~������8��_�CӼ�h2�TNP����ɩ�|,�aj�9\���A��/���x���
��
�A�gR�m���l�{Z^����rӔ��P#X��l1���ʴ�ȁo
+¯
*]"�O���=��MKK�N��8���vS��j�Ž�Xk;�
��R/�6�,����XcbX0�V�h�l���!��;@����\Oƪt� ��k�BtTE���%��`_�$3��c���i��Ud�_�O������r���ǻ��K٘.���r"��\Y���ws����Qz<�������2"�;t3Ma��;��#"��Gf?dFv��-�=�
�����

tށ��Sۂ����i%����o��������F��7|�kO|{=��
����d,��c�ۭ
7�xX5�TuЋ9g��J֪3P�m�Ƕ�R�mdd>cɁh��ਊ��֦Vc>O��Zr��|ʫ��C_y��kn���t�7N�jB����׵�bǫ�ׇ�A3�5�ܹ���I�"�Cf"�ZW��9���I�Ù��Ѳ�[��R����A	�PTb�I]_y��k����h
+ʦ	M�c�ŠwwV��.�
S�*�Pj�Pqj̭W=���ɕӰ����rl��_��k��؁6"
�/��k]�
�y�\|�
+NM��\F��V"��|�i�-Ml ��:D.�ח�L\'��]�x�j�9U/[*�N�]	�֨|

��c2?:FrK��
mC�I�4nZ�r���,��Q�����Ui�O7��ѓO��d���Kk�8� �3OO��Ƹ�Z��r��mѱ���*
^��B�8�f�j*&�n1f��,�3Plh��>,z\�f�Y�����+V�H���苂�Oo�~�a� Gz�4�
�a��J�B�21�|1o���6�zZ�,�
�GC߻޼ge��
ח�GT�D7Y�W���v
C�oJ�Qi\9�J�漶
����#���4q|�
���澇b����i�IyI�C��r��jC����{������j%+�q|�k�v��;ݯ���i�gQj�7���{�th�j�S�W��t�1�Y�d;����J�<n���}��Q�4h��r�9��sq�9˩hgmt+��0��E���n��d
Bj�U�TG�T�y��j>7Q(�p�n&-6�ڃ0�:�2Ae�e��f�v�;��h���?p��o�7
��J���a={��]��[�ּ&'�塀�t�[�L���J�ɰUm�
��@C�f[u�f_���T���*�Y�Y�z}�����b���$�=l)\Ub�}m��1ʈ�|[�Ww���b [���,�RKd��
�[��j�h

S†�2�m�}`��h(����X	�5�q��Ee%�4�j��٭V.e�E�**��K�X:�۞���T�-��خXW�y�^;�	)�-��%��a���&w)͕��g��Ҝ&0��4S]�z9̍k�L)�{�ޜ���M�pEsZg;3f&EV;��,#u5D���Q�F<%d�Q�%qR�ؑ�;2�E�[~`�%��B��BJA~��z|a�ϸ)>�q�5x�
�@���Ag�e��ԉǔ�7c@���C�'��	SW��;��ͨ�����\�2F��&�nh9/��%�R��yq�rF��hNF���7�I��#«yE����#�J�;$pS
�r6��8t�/��j��V�~����>S׉C����nV�0�ӚD�m��
g@^	�NF�|��ʹ.%��1%U�Q�f�
��
9��ļ\��
�W���d�����smU��*M&G� �������X8(K�ɬ�r�a�P�w�e�n��%��0.u"�
+��	%��=���,�<ѕk6��3]��Y�����������f�_�+͇^�B�7\�����(ʞ
��e�]>�T�z�~t���6�e�4�Al�ſ&:���㐢��3C��IPҚMf1�ZW�d�x&�<f�1��[��!�6��nZ��Q��Y�$�2�s@�p(c�b`��5����o���	��<�+����V���#4]8=���@6FZ���8(��m��33f܅�B�� ���M��Dt;�L�-MNZ" ����\�q�5n��"�Ŭ}~�e���F�9�D��:�YY�0S��]�:	|�&(^f�M�(��
���
Ɔu��=g��O�(�&_Z���B�}]si�:U7
�W�d�yy�p�}%�-i�"�Hu��	c�>�!&��t����\�1��b�R��b�)^@�M����A�Y
��L�V�dh��!�}d ��"\��B��!�a��Ŀ_"��D�0���ڴT�e���pT��;J<�R:^��ܑ〯	c�i����.��\+~b�%~�P*�D�[B	�C3�W���3��/e��<��L%A��4n�	�u�
`�

�
/���D�U:R�h����`��
���oea(�a���]�V����
x��%{1�W��/қ�r���zlz�54-�y��a�X�>Qbs�e��=C� �hiJbr`�>�{
Xg�89H0
�/o�V���+��(Pg�k��Ba�z�Z:��
ҫH�,�~��a
�f����[��k۱�W��	�sʹ��X{�5Ց�[�
+�"B�;�B���{�᤯��j�����g��{
�)�"	��sh|�A����j�㴡0w+'����tL��/
���:��:�����k�#�k-�î^F�Zd���ù�v5��&�� x�-�R:��8��V�'�� �o@
�
D�<�ԅߕ�	�s�Y�'�q0�݃��L��z�]�O~��+�,Ԭ6mI�������`&ђ���
+����Z��}�7�����>�����>�6U
��,�f�2 
X��d���
+ȰYd15dV@ �y�G�9eT
��Ay3���[���U��+���"�Hc
�,l�(=t��R�����
+����t@^E�
0���P4�� �t@	%
b�@�@��
���ЯB�#��Pr�JQ̏���b at 1�%��	(tV��Gb�E<��4��v�i}���*_ȴ7���hJ4J�N��R�R��-�!3���O=�y&i8�����N �9B�8
hD!r:��4J!��ih,{�xЀ�7
@=Ru@
�-ē�R��^
_e��
+��
���$L��_�q�)�i�K�;o��}L|*��p%b��N�DmݗK�ͷ�9
K at H�A�*r�YC6d�9l������G�����
(�s�PY�CЛ��_t�O�[8 :n��;w�)ޯ��/pz�ɶ�N9E��c^��N�(��I�ry�#g�O��g�hR�,�'E�M]��S�K& �K�e�wSl��ʼnD0��
 K`ID̳] ��}���|�C���`"�
�����M��Þ��\ю�
[w
�S$q���W{�Oj�C���x�%
������V�p�r���>�R���B�z�KQK��
pBC��3t�
8�� 
���t��
VS�.���
+�������N���d��l%��
'چ�bY�ڐ
o6�S"h"/���寧�4��zT�8V!^
�o�.Dn��`7�=� �d"~�d �M�w���� ���/o��o.p�W���38yF��
+�Jݼ7��$F�x?X
��������x:�� 
?i�.6���6�Xn�����?0�B
F@�cs V�-D�� Z
b�1
�Xt��G�5��b�D�� �%W���?s=ަ���к��X�ц']�����-M�fᎻ��
l�p���w���s<�K����?;����
��*w �"ȅ�䠔r�� V�br6���` d;��2,��züRJ^�q[ڧc^�u2oEr�D2ܼ)��Q8�)�P>������/�6j�������Mo�>~����ty�F�~|���	�b$�Lbs�V��v	�딗 �-� Q��:������C&55�󣩨�^��)ӡ�孈g�
�O0�~�����ݯN�����~�����l� �F��@Ǵ9� �8�@7�p�4��4��L�ү=q�;e�6�3L(�W�+�@k���=�(�%%�1 �Qm�7|̾��-rs�"��U�(��o��	_���X
�߀�5$`�~ �bv�f�V+�Vٚ ���	�/�ퟲ^D�d#��Gr���
9`ܮ3�x]��,vY&��N������)i�ʻd
On�=ֱEp��.Ճ�d��r��
��@�`۱>����/���~���D�~ [...]
+qk:����`Fׁ�]}��-}\�>:��7h����u�sO�?�>R��d�f�2Y?�:�
ZKe�k�[�Л%w�d��^�q��ލBdq
F��1��λ*v���k��ke����@�v���Mޖf'�;�qz鵉���)��\����6�SC<rt=���7^�S�z�'��U��w~�y}��;���
�Z���AL�R}mS�z�v��j�A�����@����̰��g�͐.����m��ܡ
˙s]9����VA��V���ϩwSw�2�|���e��ΣY4�"_
�em�Bm\��V�pߓB���������5E����C�XW�DF7�^�kD�/�c��j��kW[��Ə����o'�
\'��+.�sn�L,���;ʹ��2r'%�ொ�Z?����
*O8���
��ʶ
+�c���n�ߘ�XW]id[��׎��[�*,�n�ty���z��j�	
�5<U\�|-{D��L��B!K7�<_Oy9�����Y3���\�y�`�������w�N5?(L;�qi=�|��j^����BʆV&����M&ru:#a��Sq���e��ԅ��γ����_Z���/�Ҡ��0�W���n����]����C�O맼K�oyt9x�<��z�r��|y�f�����s5�vF|����R�4��i��-R���;�M�w��R�8Jc�8	
$ߧ�����O�m2?P�����}�������T�W���a�2c�)Z�U9��ʹq�ƞ/��첊�3�ƫ�ﯱ��R
7�u�4i
gϩ�T}��)�6����{�IWnI�x�ٞnԬY�7��d�n��g�\���f�{���Q�r��Z�h�wY�֬ꠒE��Rq�
�y�g}�+gr
[KeÄ�Έ�S:}ꏳ�븕OYd+t��V9�^�j�Ai�N��A�
�˱M��skָn-��>��C���P'�(�J���5��~P��� [...]
+�Ƴ�GO{���i��ASǢ�|�B-�L����r���3e����#;��DN�E�
W2�M�2�n�z&e.ۙ�ɽRyc�/�(]������co��N��D���Z�n��jI9<ѭN����9�}]��Nn7YJ(0"�^狞cDp���9��ֳr��%��!
���?��
��9�O7��� Ċ��
+�M�46=���#��'hu��5�Qt�z�:�ed3�'�
N�S��@9¦�_Cˤ6�7mܥya%�\u$���b�/D~ޢD���E�m���b?�8\rN5��&�l�1acC>�ay��•�q�
���[��v���,�z#���g�#	.����
Օl1��
7�d���H�6H�K���E�+
+�h&lo�E��
+�i��հ
���EЧ\c����<��\4��ul��Kׯ_J�t��K��$Zp�� ?M"�l��|���❶��D�k^���n�Tp�q�s�=����c�-*�I@��9#;�Q��Z7��|��
+x���qM�pƺ�c������1��2it8d�Ia���c�b���K�Zk�zA��ȹ?x%���2
���K�yZN�cc3�c�5��Y��CO�t�"l� 
+3�(T�ę?w�&� w��p���x�>8Xl'Cfp6)�e�_�v��C���0x��,*R�}'G�F��5�AѮ���G���ޕ�n놵䬘-/k�X/�R���D.��kF+>�)d^m�l��pC%��v�kF��Kw���x�_m8Sno��qxd�Z�¼����p&�8�s*=:�Rt��
hµT~۝Rt����{���0�!6�{�'"�p%"K��Lr�M�����o�n&Û�R
+�ף�ͻ�p[Yz�d��Ur�Po�dbػ�2S����:���p�
P{Š�
+W|tv.�i���At 5K
i�Gq��7�\F�<�=oUb�wFD�΄ć
���.
w�M<�Ox"�2�_/��נ��^N�7����l����&�WVF����]r�;�ͽ�/k�w���Hk@�y���N���=O]Q��Z���}K�%�
�y��X���c-ќ5	����>!U�U<�JC<1
�s���Na��SGo��
�5�*�_�"����o�'#��]&xWӧ�����#���hq�RӺ�Y
^a�\۔D&��MN{1�)�����"��tAD������!��'~�^Mt8\w
;��
�(�˘!�>z{�����v-$�S*B�W?8��U�C^�[�=ka���QC/^�������+�Z!ө��j���87�O]4���v -�LS�:c
��<�'���Ə�q����g���_'�°��Jb�Ѩq��Xk�=�]��gJH�<�"HSڀ̣� �g� ��q	�!\��y�M�ԯ�f`\n������
.gi�+#0i��z�%��6.��@C�l,��+�Ŧ̺��Q��9 [...]
%��e��V�p_"W� �[�f��FY4�����_pd�f���T�� ���

31�$�V�*��C^���f�!�.AF�׫�3���'���Q�# ����d!�* �x�X�x q���J$�#�m��]���?�(1���e'�G�V�d=|��ʯ� ד��i+)R��V��.�@hLN�Bӛg�̩�RŵG�v�|G2�}��~d��I$;�"OBL%@vq
���8� �s'Wxx���nf ٠��,
ྈq ��_e�Z�^�lZ�L�U�%��W-�`�����p�M�6n��%1[�c)��kܻ:��K�bLJ�b�mE����U�	�a
 ��D!�$��GP%A�(�!�E at ENb������rP��(�8TʁG�����}�Ѳ��ޣ����~]�%�^�ԻYHg�Ӗ
&�#��"o��D�N�:K�z>�e�����u	u�!��ܟ߀�#�{,����<�
�?s�����@l��;@�Й@tV-�s at K+����}��^`
�����׬>����b�j�p㔢n�w2�(�g��^&
^
4�
�:F��`��E{�/���f%f|H|M�
�k
.Ki�(�85 SIO!vg��i0�LjRL�����?&E���7d���'W!�f�zAh��C+g���<
�"deşy4
M���k�]&�P)p��t�)��h����=E�p7
1�v����*�
`��`G��#��9<�}
�n��
��[l
+�V�_3p�т]���u>z'&�P�T�Ҍ��C��P�h������h#|s��%3��G�m���vd��_0��� j�p�C�����	D� xY� O
U��n x�

��p&�� �Yu ���o.0��
��g�zo�v��w��wd��F:Q����j�1f���p�S,�@X� 
�/��O|����'
�X�z�������!�,�uk�S���xM�=�Pi��}سBj�T4�zM�Z��]�2���s�^WdCLE~p�<������t��+�������̀4
z_��v1���M��V�~�&���+H�eH��H������i��>=#�c����

+R딷�U�ɑm���rr��@�l��,���n�_����%���;~c@�"�1	�;��'��
$H  N6HP�P��P�xȆ��㚴���3����4��FS�q��L';�Jay�~���U��b��oZŸ̆?J�7�?��?:��N�#
�6����*"
����̀V#)��	��(���Fqn��Q��!���Z�2������C
��}�X����� ���>�?
+�3�#�~��S�
�F�̬�f�s�����q
���
���	�^�	�~t�_(��D�oY���w2¨vg�;�/&י�Y\�J{	N��y���?�Yl���ʫ
��t?j�.}�zK�`��ھ�>��;��;�*��D3�[���]EDI�M�O2��v�_����?�/�-��8�ܲ��p���zި+��t{��5S��]:Wܥ�jy�=
+�M��4�\w�ZE`�]�3��R�N'�:�Xί�N-�x.��B���`&c;�O���ӓ�|��ۼ��̲���ZW?>��k?��s鬮�Z��'��~;��n��|�O�
m^�f�R���c���
Y��d�`��k�B�J����
#J.
���)�����!�����5'�λG
&�co9�����������̫_9�ۼ�
�MX�2��˗�)ZS*�E7F!xw���4�7j�׶�M�<��ݮ6�/��>ղ�٫��&H�C&Dk��0-z6�K��76�g�!
'�F�nt'�k��U-Dt�n�����&
����U(�
Ͷc�i~t��
:Pj�g�wj���
��O��A�k.s���-j冸	��X
+�B�����jeX�6K�����[��h
+�L�^A�K�/��g��� _�N�VQ���;��8Ea<
���~�ɫ��)�F!Н��C;}�l��ڣ��O�z,
AM;U�O���T���Pq��'|5g��y.�l�--K���Bq�E񜫄�Qh�N�h����rW;�1Ş���`�pn�ѝ�D���Y��Y��_��G��Ư�v(Nd���9��}�ׯu�z�'�wO^�=����e]ܔK��x��C�܃��µ�
	)���ُ�G�R~�G�<���ܸ	�n�y��,f��k=���QF|��n�nP7���tݷ�i��^_�j�n_|�u��^�C -z�?~2"��Eܵ�l^�Y�6�z�\�F�倆�`�vޥ&����F�,��<��[e���>�]&�̦��e�������\�t=�R���,F�+q�[,���n�N�	i�D�s`��u�����&^��
k֗/cf;=[�V!w�j�U�
�(7��7Z�U>,���l�%�7+ur�0��r
3p�XJ�b��1 [...]
���p�Er%7I�>��j�n�j��5�ݷn�H2glF�!��J��_�
�pr�௳\O��� �>�H

�q?靣�E���֣�?+� 7.f6T6�ۡ��QIw
���|��v�

�S��8�|���E���
�C��^ώ��C���
��vZx7M�ڸz�b	Ւ�\�qBۉn��O8�TUޏv������v�k,���b݋{Q���B�z�~�f1p�g�����`�ښզ��l5Yc�
xCBYߏj�� *�v�uҚ�4��u5
TKX��ݥ�pH_4����.�;;\&��I�� �Y 1���*Ȉ�ť�Eg
l�F<�&��0f���~+��
:�\;rkN>��lO2a�-�mH`������S�.�o��
4�-;d‘=V�<Qq�H�ǭȔ=���f�q^�Sײ�
�m1��3a3���(0i~�Y$�������o��9!sgp����A�6����AO��d=�J�v	�D��{�y�yɬ'%,�C�z��<Զb^N4;*n�?�^�:I��~�|߅��(cb�(S?��g&�M� ���	��èʝ3�!���~�/qֺ��
�#��
L���LJ�]&��-�9L����(/�3�X��X!u�^��Z�yI���k%�0���h&��4�%��|�l�U���p-H�ގ?���jߞܹG�F(М��"�n
ֶ'�E�Ez*t:��6�sK:�qj�ިTn�(*+OɅd3�E��|S�N2�4?5˜y��+�%��jx�J^i�6�R����
+�qR?-
^M��<m�wb�`�H��rj��3�α
��Q��KR�L3�^
�GH��3�L�`S�C&OQ�y�
PiF��͓X�}Ν�!�vcB��
�$E�ԧ��74d��G��
E�#��'�W�nk�O���095^es{�u�TUnIäe=	��s�/aĤ
�!=J��4�&�4�YQy|����~�
�F� �eI��׈���l!&D�<�+U��Wj��+���j�l�M;v"����l����bbrtJ���%��g
+�����N����̗ԚY��9�}��ʤP_N���,�f�
yDL�G.��$�>��ʔX/�k�T�� v/B4h
+��y��v.��r�����#���ҁE[R�"��B�S����k<�j��<_���t)ѣ��9%�<3�l��_Ӏ^.�e��2NWP_�����
�{c'�[G���N�Lm at l�w�k�>����z��K��W��'vj�I��4eL��)��K�ezH�s�#�ߦ�`�;�-m�`0A

x*Ss�m�aVI$S<�M�0
Xrn�NQ���~�����Ѱg�sA��c/�К�w
������d�ᒄ
��?�=<�����N�z�[bz.{D[� �`Q�6Ñ�KK�3I�(O��6��n �� k†b�k`m�	q� V12Uw�
+�MyE��v~]�%��e�X
Ieb�`���7�ɢ��c_�_=[8˾��MՆkb�ӏ�}��Z�!���FH/uZ )�O��x+D��� {���Q p��B�� gz�zI8� ���, 8.�#�O��RT>	��S(�_pNT��{���>�\�����;N�Ռ���-W��VE�q��"7�|��wx
ÌSe��eb
+2����
�
+[%� o�	 ��D��� ���3��xo��_�|�Aި���rL@�t\��
&{�ܯ8f�	���igF�V�V��LN��}I�Fe�sN�@�#����]��y��% R� �4���
D�
1zBG?=F�
�%
�L&��M ��� �9 l� q
B��H<�_e��
�e9
+�c��|F�u�������u���PE��od��{!�0�!����6��=B�o�� �n� )w���'�����C���H��!VM@����$:P��>�#wu�G���+}��r�:��������\����.X5������w	�z�u�
q�)����*��F`��"�o����p� ���O@��D���' �H�!�%@>]���/�6�<V���}���֩Ȳ9��K�
��[��4�]�f��&�ܠT�։�,��}�i;�0x�8��
+�h�
��
+ �~�h�� tb
+2k
�`�Q[�4�.�Q0!V��\�zb6��<j�� ��5˵�K�UKh�
+�=@��u�1
C��t�E���-��Fg^���7�QY+���g{,ő�}!�����CG���/)Ld��T
0�MF�0e��L?{*�3�@,[�~�
@�w@���ה�
z�|~����t��`'T��Ni?���}nq�e��u���5������[���-Gt��ć2�	Y_�M�.y���������X�� 
�p�C�r�
+`�tb����%^	���"`^�9`N���\��h�����ÁG�
+��l��7��J���8:�y9�
^��ZҖ=�2�1�Y�<��w���v��_�5�
��p]·H� :M���OvW-�Wci�Cxx�W�Ѷ�39p���}'�k��w�������u707�r��
+��?��}�"�B�Gs�F
��'?��㯸�?�
�}_�����)�&� r����8�@0�
D�
I��U��
����a�_������s;vֹl�Lb�\�T��›e�o�6��M����
���m�Un�_�7@|<����{Ό�$���H���q�@�*�dc$�B\}�@BP�zW� �6S�a�N�	�o��eE
�TF�N����28�=������%�~C������Qu?������n@�N8Pl��Ur�
P�P|g�B�JZ)ŕ7@�"P�V'=�Nf���ni��,J��(Ů��L��5��������_���_���:�'��f6$��Cn��1�VS ^�K@=�>���POY��LhHxY�w[���<2��{�&͔�j��t�C�8�,�����_��z_��?>�����'����/�[0��͝J��T��	G`<)� �K`�
0�+ �e;�_��l�H����l1{g��m̈�k~G�/\��?���O��i~<�N�6��-bs�?��u�\m����Evh�Lm�g�8�ڤo�e
��8~�_h������
|�a����ʡ�t���Я�x#�"z	v�s<9�t0'G}7������S�����<��5�����8�N�B[�y��ijG�i̒�Mg:PO�����'D=���q3�F���K�x�

+��^��D���������SO��'��[��X{5����ofJ4Y�^�t��n������J�<��xf�ޣe���.����}A�Z��u�S{�X�c�g��T�k��λ�/w��N�=v���,�^Z��5CaU�ʴ�(�n�A���Ǻ�GO�6�+�.��Οuy4=�^��|�t
o�`�,ɨw���nW=�;�����q�+�����EO'��2�:6���ڈ�ճ!n/h=�_t�Tg�국�U�U�c
�+�
���+��eO �_��W��7w�k]�,����PV�i�B�h��ȿ��G��;h�ʹf�%�\z3��]�
��d������>��=�n2*��w=�
�z��N�vy���Ģ;�|n�*-�ͱ����E�*1alEFPO-��u
�
+����Ru���uu�t;���0��>G�_9�7w5b�]���Ǫyݞ*�^�Z
g��h�HD�J��^-�E�TJ��
�������]J�}�
+�В��Á�/���~#��An
Q�
q�==_]��e+��r�p��
<�7p�w?Ip���k�Qh�to�Dw���V��]�LL8O.�<7��� ���q����>���w��!?���<���9��^9b�@=_n�
}
r�PJ�Mk�e���q��3�>�մNƣT�p=:��O}��r2�5�~}��M����>�
��[C\%ְ��o�@�
*��q�ǠZ�rv)�qx���]%&v�̦�kg����'wcWy_��{\�u�O�r���X��N7��{��IW�����L���Z����>���n�5y|�06���w�v2L�Kc;6�U��ܔI��-F�[*\;e/?�I�+��_�nlw�i
���E�i�[�r��Z/$%7J�{'�DZװ��ױf�h������nr��Ɉ��K�OZOо��Í��B���*��ڪڎji|�ѳk�D��pT��<
<�l�;�2(�.n�wۈ�]V6��o'�O�Av�;S��Nl�K}�(fh]t�{�l#J�S���
{��'H���
BU��ն�*�F�Ǿ�J8��E4)Bq͆.�{X {����H���$���Tm|��ZB�QY�L<�O�(8l���F>��c��G<��.�����It;����$���=���T��.����”ŏ�D�<V��ԕAmi+�v���ֻ {�K�~�#1hm&.����SYJ�,���N��
���*�?h!�Yl-S�Z����U��^< �S��n�r����쮸���gF2�Y����y��Vϋ'��N'�}�W�/��eϬ��Y��I�ӣ��pȋaf�6ӳ%D>���~���6���4��q��^�'�m5KYֲ�
k�E�y���4��W{6!�Y���yt��C{��VL���k��}M�Թ��M���k�
����q�K��|!.?�Ux���\q'HT���A��'�ޛ�GS�ӥ
�^���Z��f
�v�q�[�~��
�o(�au�O��Ny~�LyUY��^�nTMʌ�GZ��g�
+�
x��}�f��� }�r�i��+Y�E4�dO����br2��0�����7k}έ'?8ۚ��寷L�|<1N�CB�iw_i,^[Ta}�
�dAK�9����QԮ%���������L����
�b�/*��ے{,�O�Ǭ��O�vԮ'ɥ��hZ��	T)]�E5\	r�8�±�<���Imz��{4��FԤ�ͩ\2�Q�y!��B���{^���bg��#���j8����e8O���&ª����;,vtT�7#hj�dX���[��9sB�E���[����a��ԧua/���dq�ַ|-,Y�2��x�n��W�F��ɦ�
b�ΆDq�X�a��񝜾��ט���[Ǝa�b5�X��{q�6��;j����G��t<q��#�
G ��ڨ�唗ZR/�3���8Y�g���N�'d�f��������k��BviL�z�3��s�Yt����%Ω���3�+d��p��u!��Xݬ�Z��b�h3�)�6r�JH2}�7�8�tE� J�2 efC��K��&U� [...]
�"Rm��j��K�!.�H����;� �
|��hD� m�{ mW� ��v�<@���5�����(�Q�	�m���4�rr������L��܊b����wAE�[R�kQ�'K�������g�6�@[
�Z�jȣ	�H��l����e3���
@ϧ@/�� {
`h6O
!�7xͩJ #��Hs�W�Sg}�4��o-���}��=K�v�rsr�fmI�bWo
�enV9[j�7ŦA�BƩ9!��
��N]���M�vu�%ϟ����V��byXUG!��j�я 6�L 6d� kl kvK k5� +�E���T� d�%5�A�D�_�qf0�W_���j{�H�F�-O뉉3(H�%�ܣ��"S��"�Z��6B�ֵ2%�
pBj���V}����np��w)p�~�d�
J�o���p�Z8����q
`�r����A���y*��|0��l�Q��W	K.�ًy
'ګ�wV�}�\�
vp��T���
+�
�[̬t&J>��@�C�_fc���S��
+��Q�
�\�o�:�:�]���'��
�E��g�7r�a�Y���]�Z,��U(���ln3iٙ�'�]yJ}�v����T
��
+����8
E�YRZ�O\�
�(��s@��	 �
+�Z�+@��5 j��G��un
�� 1�ѐ�yMw�C":����;�H��p�Y@�~=R:�J�m���|��t�->��{WE;ZM�g_wTr��JKhn1��&&%�#obe��ֽ3���������������	�rd�zC�i�E���B�>q�b󹇗LG
 u3HCRdQ@�.<��W�ϰF���/dwE�s�L��R�"Hf#�}��n��Y��
�[����f>�%�=
�����[2�ڳz�ʾ j���Qx�X}P�#��aB
���:�x([��oPʺ(�
�!mxV�S
�miVl�	�J
+�\���={�b��"+eW�&��&�C��2s�yz4���+� ma=J`��H�
�q{zxzv�{�̉*KC���\
+��*� Q�w
j��
�5�f�
+h)�4%��:mx��>�����\��[Ys��`:���(2��_ES��pv��M�&p��	R���<
����� �Mؿm��ԉM��
�ʀ�U�LH
������1G�`�<��𹷚)�Z�Io.�ї`Du
+�����3�7�N�\;�y��U/˺FbcJ��
�%F3J9Hu<y$���s��?P�~<�\�n�?
�Jl�
���{p
]
Z����WV��� ��;���-9���װ3VL���M^ZJp>����}����!:	��18�]�'�0'x/�5���*�
� ���u)�F���@���y�h��K
�cc1��m�7
�n���|~��t
+>G���f�_,�6�[�;B��c9�T�$ �JW���fc$p���m��7�Qp�kz��'�|���!w vu��>
�j��V��/�� f�*��Di�����<�a���,�A�t^�� ����m�{[�!�N���F�{�%�~�w�k��7��l��ꋯ��'�w��A���
S��@^�@
Fo ���ǵ�'Mȝg)MǙ�e���y8��a��l�	C���#q��
����'��OH�g6�GE�����'
�7��~%���ܿ�wO;��7
P�E Tc����j=*֍+u�m�%;̰�G�}'�������?���������������l�(���l�
+�e�~�n�5��KS`0��l}<C�1f���i�T����n( �E�ê�F�(�gG�.nXz�:��3�5���	5@���	Iy��j	/J�4��ö�w�a�5�[���h�\��w�k
4L��L{�{�<r{U������[�Ep
��
eMnz��3�V�`v���
�n�n�~�f�J����5��mgH���hxͯ&I��M�RÜ��ny�W��|�}o2볺KDq���1�Hp~����|�.�2�����������~���o���k?����{��o���w�������O{���
m�'������^���wG�� `x��om�wvL
��p���O
�f)Ma0��>}��څ傿�(�K�T��R�Ґ*	≎U�<k�̔��Eu�V�d����
��BaWn�=ȹ/Pi��Yc�Yz�|♃k)��6�t��,�`��'�n���CGʹh�O8R��١{v��ͅ:��y����V�dZ����*���e�bE������Q&R�㾂_'��i��
��UZl�`�b&�a��|3‶}m��ތG�C]�������t�t)�t�:��;2_�
ɰ{�
���_�I�
+�KI�3����������w��$9E|R�
*ОԷ���\���i�ް�
�.�FMZ��Y�
z���isuHSw�s���ϐ-[�Ki��ک��;2������)�����mr��w���X���u�+��F����b�
<>#��.�l���J
I为<^�p/�F���޻��#���r�3(�۬/���݂᤻쎑tg
t	����yJ��B�[H"�X���bM��`���m?���
L�~�6��gh�O[�.,�v��ϰ
t1��J
�_=o��{�P���y@I���g*���41ϫ
z}��.�=�i�nL�X��X��g@;r�}�Y�高��kνF|����^
�vi~�8�o��anS���>/�|+ ��y�#���>>O���*4�t;�he���H�]�,�p����Hݧf�fu�率xɧj��3��]��
~��&
����������,/�	�y:IF�
�y�������{�)���W�=�
��3��34979���ڿ*ۀ3���vfN��3
��R����TR	w\{�5�C��t��lG@@D?O���DPQ�K�wSQ�����Tk����"�S�A�ץ��I�/�_,�X~��b�����/�_,�X~��b�����/�_,�ci
���%�R����57�S)����/�_,ԇ#�Jig?���Cv�|ּ�>G�Z���.��p�N�X��I
�6�k��b������þ��|����2dzע���A��[�<C��T�
X�\b�r)�"-�e{�r�N*ӘVL��G���\2�
i��9�CK�踤������/����ށ��V
O$��]"�}D+�����ct�M�gc��.��f9;ͅ��>>&���$�
����K�03U���"#��� �ߩ8쬼�	���"�\o
����5;�
+Ή�����Z��R~��� �VK����g����wY_�X~����lf��u�b/�x���w\�Cm�K
��
��Ur�h�f�P'���\7i�6nEz
˗���5"�8.�1՗
f�	���5�/�Q�oƒÚ�d�Wpq�@�f����z���,�
�N�
�]��d-z>�ͦMc���IA~L�l;��&�_�I��t�#���N�7��V�/�_,�
,�K�Z
~Ԅ���@+�]���hG

Jo�:/E��*��BK���g��g#ɞ ��:kA�Q5��[-V
+�J�J�~ů�b����+~�v�Bԩ
'__r��)�h����7�e�!���	;#_�u�i��)�3�j__6��խ��b �T��@h��d����AT�-n�2yö�
	���U�O��cX�ʊzEu���������ba}8��Q�kr��ڡ��%���$�.D[��I�p��8F�V�6y�~
`kSN�1��bg5��+�BJ�Qޟ/�~B��`u�oC4��B�O9:�UI��c%
�� ��/B�t
+�ې�*f�t>�
�b��J9 Bg
��g��"Q�B��P�
�	ya���K��ƏQ�X���ח
1�2�+OG�}�c�`UR��N��>�V{0�
b�x�+����ڪhx��Ç�/����ba��Y��=òN�*s����
�nm
�̾�nK#�&�Y
Ov��).-!p�4;k���h�	�l$..��y��T��ߛK*� \�>!
+^0
jCᡰ��TB0��/�Ƶ<;sZ4Z)�
+lIlf\�+�&�\[�3����
R�f��z��N�;K�Do���z=� ������d��l�L�ȍ���v�����7:̠
X�-]+�DJy�fZ*�����X��X�q�~)�fh-�l7J尫Nyny�y��*��1����+ 
��v�
sX��WG$�A��L1^�p�"Z�ɑ�����Ѕ�"��'�A,jrE����B������
�7�G<C
~�±���gCV����w����D6��������]J��7�� �a�j��)��*�v�����>�
(�
�Y�
�3�;{2j�Ks��
�-��ẌLӑJ�
/����י��z����
�3cJ}�{f�{��a�n�2$R܅��L�Rh�.[���9x!d1����d3
~���2��7c�>�;sT�U�zB���2̬��{o���c��_T5�
+�U�JI	i�0l�з6s�B�l�"7,�5B���6D�
���MS��v��Z%��&���˿n:[?#>4z���%�?�B��f~�<+��I.��DS�XT7����2�+�[�.��-Z	�B�D�B"�����
w��O>����#�=,(�ɰ00�����n�&_�
�H(�m���'\��}���H'��}��>��x�� �"�����c�ё�����`T���5[�͛ B�FȆ+��O�Cy��(T| �Vu�}n	�Xe��Ο�D����#���a)���fJ/��
}X��X
4Н+qΡ�&��SzQw5�풠
<J*���;����&_u&m\^�F<�k�Q
�;��P�U���(�r���K�
�l�y�N'S�a5��QQ��_�o~��

�\�F\����2�ْ]���ھ�����X7�fH�g$R�R��4Q'�Ώ6"ƕ�C�:I7__p�/��~f{��Au�|s�p)`l�f��r%h-o��@�Ը�/��2�K���Q��x��������(yƣ/A��T
+[��B���
�\���U�Q�Vs����HIQ�i�H�+^��Y�Y5	&
��>�F��G
d�
����s����:�<��(C���T�4hY��A8r�Á�X,;�����+|c�c~�p
�1ۗ�c���)��j�Y1&O�ȻR?b���@�T�#�𼜅�*x5�	���èG=Nƃ)'Ł�1‮�#��81-
tF\�j�$ق�t�nH��<3Sl(v���;6�����
�����V�
�Q�%�TJ/w
���&-�V	:B��
$ �4�8砪���`�����Q;@���
�
+93J"W�v�:ٗ�St}�ܺ�T�F��}5e�%T���B�Pov{�F�9D5�6�������k�����H�V�en��fKp��
7�{0��\��^,�K�$'�zr�"]`�Y"�q����&7%�&y,�ad3�<SL�E]�R�I���d{~	�b@���/���S��2ƍR*�W��.'�)�-��@�(��%B�(�8�q5	V�
���s�n���sB�qDr��j��<4�X��P�6)��\�Foª�XW8)	�EIJ{s����tR4�y�r��Q�C��
+�PW/e4<��=���K��#�8
c����8���z����~� 1�7w�+d�����`�� �`��Aᒉ&� 
�iDKrވ�ymM	ϗ2'7��#��R�OZqS���<�����~�/�Mue'|�XD��خ ISw(���nRN�,7v�P�"�{Sab��.�8f
)b�D��8>��&��!�a
��cߏ���i�8��6�rP�����O�ff�D��<k�i�Fp��f���RW�s���H��=I��v$�=Ϲ(���6���Z<{b��k<�w�„i�R�k������
+h5��n��xG����	<��ǂ�g����C�qڛm��s{(;k4V�F��X0���*/r�1ԩp'arh|l0u�QIziU}�)-ʇ+�sø�S��_�b>��2��\��
'H	�(�C���b#L�lB{e{����`�#�b0�`
/i�
8��ݒ��㹔IOHC�Q�f�Q
u�`fe{���֔'�a�J��Y	��Lmݰ_�b$e�l�n�A�Z�r9��@ A>֔ ��2
ܓ�6�@;9��=�b(aaZF:��CR�9HJ��V})
��n�7��M�P�u�}25jS���+�����cͶ�$-C�E�Jc���$��9j	ʼn#d�=�I��>C�]�X��u��g�o��9����umnn��@�>n�
2�ߔ����+�:��4w2�P
�P�Cخ�EԔ�� �Jz?���R�
+��3׺�@��bl3w_�aJ��9a���uA�/�8�]W at e竵�$UlO��v:�|q���O�i�	�r�.�7)�{��q��V��7�O�)7:�NHI�U��׃4br�y�jƊx�ŕ�����q��I��A�
�#�p�=�z�E�7�׿=�ʹeU
���ggx�X�VO����OF�
q��~�:
�V�Y�.B�'��ֶ�~U����^S:�Cr�T�l�H���T�>G]U����N�#!��Oٽ�e�~�W(9�
+w)Mxza��{mp 1��͡z����

��b��'j�('�Η�:ٲ�`7�@�Y�ف�g�"#����
2�N̸"���]��7'H���'*d	V��.�z;AIC^�]c`:�������qUS��/�)s��
-��EMvTM~�`b���~�W�by��Ӂt�������6L�
�W����0%Cܖ���@u��fo���FN�/�V�R�N0΅���r�&Hpje�;Jy���ؚ�ae�~y��0S�*�U�n
��P� �|��Ub;.��a���ڍC�K����E��Ѵ�s�3T�y�
`(��-�L�]z�kמ��nS�s��?I��fƓ��P�c��Q�*6v�\�
+v�
Ⲹ��Ү�yV� �)�i��9�ɐĬ._Mg�6����w퇆������������x��K�)��oMZ�͍�K�J)]ڋ��u
g��o�5>ٶ��ZD�焢�!�r���:N.P�U���9�P��5�չa
孛��QR�
6�#�
�gs�\�)E� �kb��]W��9N�ϼ2��<���M\J�CV�$I�ux�K�=�$$CB��8 ����W��Μt|���%ԃV�{%���F8��~�� e�5[\��<NB��8Ĭ��9�r��U���1G+=y�1��ub�|�����_�v|��G�˧�ۻ����*�l;f%���<n�~ȭ�rE�Wz�;�ǝ@�u�q���E�ZP
����
Q���PqF)�ŕ�3OmPRD�5A���
+UcJ�yFZ:���cqC�_j��ߵ�eom9�Lk98�$'O�U�KZ��������
 �bn�Z��AL�dD�� ����?�'z�٦��]���j���
+�ur����Z�
�yL|��Ϥ�-
��\úݏ�
_�w�_,M,��d�
�*g/�x��4Gv�!�ŭ�Qw
]�5���	�R�"��?B����
 
�l��&�^}\^Q2� �i��w5�3�~|j*
IOǦ���'�
4�2�,���M�Qr���jC_|��35t�0�i�N�Yw�i�V9'Y��S�.���\�o�˶�rLt�J�)C:9�mg;I
o�Sw��V�5��*|�_|5�b��b�7��y�6�!��E��&���7\1��QO>牷ž������
��+9�F4����CP0�Oy�����M�

+TCD�R��n�6㖺R�M�x<®h"u�a�2�&B��&I�ixۓ8�9�$;��Ǝ�Ôv��bB�1�����צ�-����uh[�H	�X�x��I����w��Z�
+�i��Yԓn~p��Ԅ:��\��kϕ��ێ�	+����X��h/�?�-��,/��7�W�'�`��=�B��w��>8O*�[��4K�+��O
+���s�
�7��g 'v,�q<�Q�{
+�t�Z�ԙ`���3\u�ڧ�8��=�
�};�3)�q6`W�S&"O����ID
��F�a�l�Bʚc�Szқ���SX���S[�k�Y^�[V
vM�ŗ�*>ł�6��6t:O�^0�r�g�p
�
+�c�T���:����MXN>gh������i�:�2$�
쩮�_OL:�L�z�3�@�؛�a-C3n2��΁�W�!ʄ�� ����]���T
�"Cv.
~+�Ӕ��D5�^%W'�,
�sVn**�G��	����}�׺S��'��'�
o���Ȭ�~���)�\���
&'v�Ȑ�ڴnL�qY�.Q��3P�b��0#t9�?f��b����¢��WU?��t�ϩ�8�<u'��"?���"I{��e��
�
n>{m��_
�u��#�T~��霜`n�%\�LWn�r
%�;��VϢ ����v�-���lM�P��K_a���D�ދ[��8�h3&̤�hv��i��b�-�{KK��ض'OҠ�X�{��ҎM�p�3���mLx��&
j����
+���_m�X~��C���IrZ�~t3�bG���>>�A߅v2���[�^���M����²�A�{���d�(��FO��܌�z$�%!�NnG5B©1NN�ɇP���<�+��N٘繶w
�W��'�#S�8U	�]�g�9� �e�6����v���6w���6?�P>��������V�
�V�9d_
�3{
�P���J���埃��l.��q��|��ձQ�?[�l�d�[#���Vn{J�rz�G�k/�����K�--d�ZMk�f�k��
�Y�|�,6N�{�kX�Wm�Z(�����0(bʹz��T����}/tBǭ���<Z�f�t�[K�6��S�4K���J���b�}��D����/�_,�X�WGU���C�>����q���r�v�T� �ʅ�U�9J�`ɨj���w
�i�k��
�U������,N(9���ug���(���&���@j3�FFS��D�9��:}��2��kˉ���3�?�;�
���Y
;��Q�R�v����q���ɏzm��l�R*���g��/�_,=,��s���6�]-z�^:o�U���f�l�D�I�m�K� t=��s��"P���˕��:nmW�CO��^�A���GH�&C*�؜s����v�F�q)>
#nu��K�N��+��/��4��ɯ"r9o��X�?��/�k���ߠ
��h#i��O|?�ng�˟�i?_mf��H�M
����cN��������
]�F�����1G��t���&��
>������
h|������h���.���<��Q�&���*g=�p*��z2�����M>|�N\xšw#�]�a��g|�b���o҇���
>g�f���[��%�H�sa�}V���I�d�,8�r�6�����I^⟽��cD#�}�
IW/KC��q����h�2$>�2c^`*�g�j���Z��FJo���k���M[C
E��69���X�pP��罦+�	oZ�yty�-]

�
Cu|b�
����I�]>����
|S��iZ
5�?U��Q�#��M�2��5LGY[�>��
�:4�c�:
�]��FF��M&�5��2$�%�ق�G��J5���it��4Ɠ���U�G�]ؗY�d����#��fk�}f��#�r���-r��-���r�8�g�
@6�f�jڰ�w3���Z���E7�Җ
A;��ci���@=�3��tש
�b���ߘv�ֱ�G�
�0��S��S�u6��
�S0��9���lLs������#��:'��	�	(D��i;�����73�%���Đfm[�`�0C0�@���"@�i���g�O��� ^1꠰�F�̽�G,�@6�ى�
�h|@�:>;��Ύ�s��?
�9{L�FU�9����� �-'�HI5�GjV�����V�w��Dk��ID�Z�2����)u���>>�&�=ؑ�T���
A�2$1�Q{+��O�e���7C�
�
��L�
5D��>��́��~�9��
�W-
�X�X��IlE�	:����vQDj�˕KJ�L��~���I��hZE�t�V<3\�>�bKg��c~}|v:�ج��;B��N�\22�X���7qȩYS<����ON��z�f#�~4���7fɎ�xl�m“g�э3�|�v^r�N4USX}�!��b<�Ff U�%�
�{�{no��&�zI
c���X���ylu^9��4vKV�2�z��7󪷀�+:���@���!]| 9fO��>yL���07�Z�0פ��Z~�7j��p�[2�o�wr
�`��No
��Փ�����A6#R0���
�M��9���ʣ���ԛ"�vu'Ch"��|����X�X�0�
�:>�h��=����|I
���
��c�zJ�>|�f�4���`M�hm T,7c�T�`�i#�F�hx[��S849lR�g�)#�O8t�S8��~G6���Ht��Lp���t�C+�=ܘa.GgWDz�m|L�X�2���2�|k�o�0�7�"
+���
��z1�]�n/~�o:O�x���
���=�]��}��&�1�b9$�݃��p,�8���72�i��
�%�9 ��Bt�&���V��(`Ĩ,�m6��.s���m ��������Q=>�:)�����2�$=;��
J?r
c�D����`M1��DX���@G����N
r��
��X93��X�s�
��)!F@~���zJ�`ZϖEG����T�kb$Io�7r��
��X�1��J�&��������p�AR %��N
sVI�A�d%�X��;|
2 }��c!f�x������ ����w��x�d�E�[ːX�W��u���1 8
r�����C�O��y"�He���2{`m�Z#����Z�$�� �%����\ˈ\j��+�
�F+u�ʌ*�:A�
+�V��
!
R}[��f�Y<�`�F���麂֔�����Z�!� �
�� C��
�Jѹ=�

�t,��,R�U��%�Mrf-��{��ͨ��
�� ݭ
#�X�uJ��2,P��1GJS6\�I�q}d*��I?�q�z�H�Yz2ճ:�N������Q�m�I�v�
�vq�
 0��ޛe���j^��`I&�1R߶Y]qcH��!tc�B��H
�)���� ��t�}�-� ���h
�\��
v��Џ(5���=@��L�'YN���/����l
��V�Ė�v̼
+��\1�İE�`ٛ�!
$
}J)�� �M	�9r�S���!�B
$���J�
�,
�?S��uԳ�ec`@S>
=�d�5�xŠY��<lY��`)�K����yݐ�fc<n�M$����<�����k!�r���^�'vס�l����Q���vMr�h�cio
��m#�r�������c��՘k}
��\v|x��l�����[~Ƚ�`r0����	̠)]�
@�/�<녞�~tm
�� �;�n0�H-H����,>
���
w1
+��u��!�
oj��/�V �q)g�.F���'������=�
3�^�3���� �B��dOU��? j���`�}u���$�:6
+��Z����6@��`�G�z�2ޥ3ہ!C<|?Z1�{�ڍ{��$r���Q�_�ꌨ�c����{i
�ܻ +ו6><��X
�vOυ(�ʧ��Ѹ7�,	z�y	:3׸�25�����}��9�.F���3
��U���o�����Y�y�:��(	�
8�6o�n�A��1��=Z��:�ԕs w�i;�c����T)�y\���"�m�tP��&mw�X�;�m;Sl��M�Ĵ�N�L��u|�١�#�	�2gW�߬�l-�x�w56���B�� ����Z|.C�>�8‘nbR��X��\ k P=
+��\hDj�0dC���y�6|2z��R�����9��
�
M�!������
((u|�[��H���L�B
>�&��8W׈{|X�,�J���c5�шk�

�e�K[ ��+�r��l�9X/�3�-�þ���
��
h�r��z�FD�t:>r�t�q���ౙs
��G��ƭtcV�
+{��
1a4	�YE��D`�����#�Z��]�slȟ�^
9C�V2V�5Bw��I�/.�jҍ�'�R�޴^8�W��恕qm&��>�
�S�h
-��eU�y|���]ރ)ԡ����� ��l]ׯS!������s`j�d��5�����*��#���L$���Kb
�ke�7o�u#��Z�X,��
l��RQ�"G
+�۟
$��c�
P���cq���
��z֑D-��T
�0���b�M�F0���θCkw�,`VRh
�M�Wnv���,��\2Q{[QO>�I#��<��bY�
��H��|�
��n���N0\�M	L����kq�
��]�D�m˔�4�-L�ӭ��Y��i��/��K
+��p�q�������3>�d6�~�xr�lv
+�
�Z/`��Q��3ijY��Tլ�OX�Z��(n���_3;x$u"G<=� 
��)� mz(KM�lZҒ�@~�Zj�a�2 s��r=j&l
��α
��4�6�VG����;�
+#��7�>\��F<ˏ����U
9؁pi�a[�c�"��o�8Ë���X��
+��&
/�H�����(a��r
�k����<�AAba
;�
b �ۂX���U7��h2Sh2g#�eQO���8�X�7�Ot�ߝ�]� Ε5>�&?�H���e}�5���
����PE�3J�';�������VmЉ�q�u5Ȏ S"�!}3ϤA
�93u�H�.�������Yc�m�0���l�C�db��?���&R
椵hu*ѭ��IӔ©��ƕ����Ҵ�G._�X�T�u+wCq�����
����p�ćy�#���
+�X~�S�O�M�p{��Ib�O�������h�VD�5m���1��*��L�h��,`4��n(��Ĕ�T�t�#���i���a�_����6�&'�l�n AM�M������K<����4M�E6�-�%.���9s�8Wy��i��{RN�C#e� 쐓��.�3�
��&�,~���I�[華��o��5f��w�K)0���?�s���͡���������df`Y����������<����ng
+�}�k4{���5G����
 �.=j�Ϻ�"���񙿯xL���`�����0;��Z���]0�R)|p��fVc
�9	F!%��0(��9l\�>4��k�q-Ҍ/
�Kz��Mf�wiRNQS� �B�G��e��#����?_�Lנ�y�x*�Il���W��oK��y:qwOM���8ܛF�Ѥ���$!���:��0e���q,Y���w�<�?k����7R
+
+
���6}n�ҐZVD
:���_Ф%�����LѮ
��sCg�[�MfH�ƟK��(������9K
�+@��Q���[�
+�`*�

������ ��C�	@�q��TN���":{�]�yG�e��'��^����Q
�h��\���|��G at 6>X���<Bl	8�syY����՝�.>��
���M���z�kɫ�Џd;:�c�a�&1�*��b�V��Ќ�
/k,w8��m3�
c�%����nF�� �dd<�atG1�[����� �fF��c�
3�
��<�I"xj{7����T����AǼ���1:�QMk��u�PÉ@}���t�\a_�x��b��:���6G�}d�?:GB�i#���W��v�%�[��ޯn��0 /JS�+?0CM��d��G2�՞�әY-�5c�cMȍQ�r7
�<��	�5��nfQKl%�j ��c
Sw�����`l@ݯ���s�Xl���~��x����3-nN��dz?�8��t��g��~�'�������j��Pm�`:�˃����
!w�n~6]]�*��~s��{l���|3�\f�ى�

���4-�kv:��/g�,����~��۬b��a3�? 
+l�њ:a����٬Fg���
��ӈ��x�lV�����zv�"�!�k
�����p���m\���6���2;���e�
mF�	� ��`�dO"
)�w���jg���,�/��d�Φ
\f0ݧ��z���`m�t��ft����Ӕ��X)�F��i�[��!��y�:�A����n�����4�9��hN�-'{0�ˍ�����V0�Uh4�a�F�&���7����@�&��t 3���,yZM����ZP�&���S��9v����]O�?����m��Y��L��ߟWi���C88\ ��F��x�Y]�#<o��I(6 �k��v��6�������)����<���]��K�)x�!�ȗ�V���[��#c at C�e�W!Y�l<t����V�:zP��x�����
{���F�y��̷^#&��Wh	�|����^�$|S:!���~�<�3>r�E�	�&�]V^ˆ!%����ֵ�
n��2m�_��V[�Fs�Z,/�)~�8�� =��.�ޟֹ��[�U����?|���r�o�y��Y����ݥ [...]
��o�
�R
�J%X}����������g�峷�ɀ��ߵ�	T�&��ub)^|/;i/��8�
+�d|{J�:�)T|�]���8 ���YdrڏG���?`�}�J�F�֤w���ri�YM�wR+m��A-����e�#���������z��.��@�f�
5�o� ���
+�{獵����
J��������B"Z��3B�M�n��DE
ߦ�f1��fK_�'�I��"��1����$IX]

Ho�b� EoJ at r���aD(�+�%�׍�e
��cO����Mi[�qo{�� Gvd��?o	V�s�V��p�I�`�6����w<�v�y����!�%::���l���2�Y�N��W7kPt{��97V�S�\[����.�ٟ�l>�n.�6	���Ͽ��ݟ��_��G�?����Ht
����Δʄ4�

A�O&�������-qF.y5	n1F׊����_݁����!���ϊ0�F6#�����~�v{�N��{�
�ū���Ķ���������n���$Y�ON���M�nB5hQ7��N�8I�'Z
��g��j ��nb��
�Ku�Y
`XIaz$�ص|K
+����b��7������O�~�Y������(
��-{z
+�� 
+6�
�ݞ�*��ͨ5
C�!��1�!o4���f���^��A���x೅j�h|�I�S�J`�c������8�r�q����iK����gEn��rdf�Qv
*�
h��yLW����<�R|m�A[�ms;;�m��m#�O��`;���I�|I�eH4aM��Z(=��-�h��bSu;~GP$�G�ө�0���'?�b�V��	��m����d=o��]y,G�xDn�h
�طYӂ���
SLn�xZph�-�_�~���R���L�M$��g��5a���lZ^�=��M�#�،G��T$��"�aٍ
֪+��ω�
Zj��T����¶H�c���X�Y����Q_yt$x���kT�F�(�O��
ف#�V=<=H}v㻚U�i� Q-;=�t�>�
7 ��j&���L� ֝�5}�9�!����Ae߹s��JE�l�j�d#�&-��2��"�-�))\�
�R���,B:>�͆&?�BT��69R��=+��(�X!�T���5���u-�oR��!=]�^�
�ˇ2�o����H�J��7� m`x-Zf!X��*�)��^�I�>'�T����B䭟>&�
��긳�h��E^��9��U)�%��5���+�!�Z�q�@
+�Ph{�^c\@�
8�Ӆ�i�X+"u��U
!-�h)�~��t���HK��m�r��5������B��R���H�����T��
ʣ��C���2�}��:����	 m0|_��#M���lY ������Sj�ܴ$�&>�8��
+�YF	��9HS��
q
�
�u
�cͥ
=
+iۨe���0�:�H�(�ۖ]�wiI�M+��\{��EZ��R�H���@��
V�
��c���9
�y��ҫ� �j�Y>�¨!:�8���
~�9��6
�}�H��Y�
ihg���X�X��
+ M�a�)Ƌ�����`^�h?�\T �덆~���j�E
+(R0/�~k 8��,�]!�c�D.Ώ�[�K9M +�%�N��B:��XLc��6�HqI2e��t��0�e!�!gE1�=��0@8����6J!]{�,�ȼ� 7rk�mI3�CK�I��HD��vՂQ���J i�ž�D��D"
i(�c��(�dSyc�RE��p����ԉ(�T
+ ��YH��hqI!��M��~��5�T��B�\�I`��s�'vU�B�b
��[����ӫZn�n���]̮Lt��߶�N`1�WO�%,�/&ȧ
]� Xra��x������BO#Xn�u
+=�ayy�M<�!<�Xq���=����E�iŪ
����A��	���Z��
X]~4�?�˱�Ur�T
+`i���9����
�XCBOsXS�=-`Mg"v��y	�(]=��?�^��x���z�s���A�֯�lBo���s�x:8YL��C����3���������
=�Z�eEF��do)��+A�Mu��gV����������S�$��2�UԦ���#rS*
$��e������O�S���֠�V �i(��
+�I@+o%�OГR}r�ܐv�&
\W���Z����o
��&�XԜ5Э�!������ �>T�4�1H�9h�t�Ϝw�4�0o]!ot�x����Ҽ
+�u������-1��Ia�JF�J",
���#u,����Gjo���*𩙥�Qh)�X:H�j
윑�!RB�A�I��6֩Z�| %��;R��P��ݐ&7
�*�һ>f��
c��$�����:�P��`!�+�+cVH��VA���/�j�Ӈ>�
��=F�.�[�H�N�BJXI��N1BZ�̪ҋR�o�:��#�WVK�$�����v�a�������Lg��.4�+��5���AChp�p�Q���a
Z���X��]��Ny�
W�aATh��`I�����x5LL}Ɓ �����F&�Q��
�'m?�h��==�z	��F��Q��1���24��-��9I0���B}��=I
Rkgy���
+�1x�;
�rԼ����dK
v��ҽ�@��J~P��H��L��N������w|%�
�!s|�G���=9/8���
��[�IS�o|��$�6L˂
���"�����
�
�l�?[���A��2�+
�[�g�#@���OQ��2��9>�Aw�s�
+���Ǵ爞6z`L,�ž7	8�$����e�
��X�B\�F/���zC�v⃢
�6�]���J����J�t�ZȒ�	�Ε��	
ͨ�1+���i�#��TN���G�&Gſ��	lv^7�DH~�l	�Ձ�C���y2�f���5&*n�	and�w�6�ilv����s_ɤ��
l|��Y�n;2��,ߍ�G	c~�_x��N���
����ѻL�
+,�.C��k4�lB��y��]`|LH)�F�T��=3�
��L]�A�-졃ݭW�)�9S�v���8>�#�
F��`T������-�9*h�$�*���7&��;MZF*MJp[���O���ȟ+0��u��O&:e�v<�N�{#�KJ���1y6@ϵJT�P>���3(��I�?j,���hP�b�f������ sC$�`sͱ�6�=��^�ܫ�b,��*�(���s	
Y��5��

+!��EZ�B��"%��ߠS�|%%*��
+v��+����M\��� �W
ev�c�-R6�/��u�dS{B��I�Ad,,��i`|
���+��<�
�떰+�o҄��
yP��6�
���K�,��q-C��8�d�=��`�
�lЛ�4���tӳ���0��N.U|�1ȣK��AJɝ��E). Hޗ�X�" X:�gZ� �Šy��8�6џi
+�5+{�ˇ��E��2>���
.�3��M,��Ǒ�hߋ��aqA'<W"�z��Y�z089�&.�o3L0Ҟz�l*�B!�C"�K�f�K�fY�k�!
�(x�r��%?�E���B�Z�54r^�88�
�
����H��
����x@�=���	Y2W�!���ÿ�@�8^��k2��F�JV�{��t�[��Ti[���o;�4B��!+�g&{��Bu��p��Aң�eo��+BD~
��
~�_B����u�ڑY����u�-˙�����< ��� ��_��<���!  Y��MZ��.
����W�c'�e50�^C;��b�7�g��f#
�]����ߘ	�,m%�w��U����_$�[0>�{Q&C����gM�e��}�^Bod�~<*�ۣC�B
� ���G 3����$
�-��q��V�'
�3>:�޶��~%�W��I9U[�ϡ��BW@�$0]
:�D�y��8�&ѪS�1w1�V�M�Pw�F�b�?A�$H�g��K�����(^�,��~x�ƞ��!�Ph62G��x�3˨��b�����"~]�9a�#!�����`h)T��*��ѳ���oRD����x������˛r[
A!�:ߗ"f��|b�]�ع}೦_R��Y{5�J��pX�� r����^

+<�~���#
x$�:��ؐ ��#���.ػ�H�4�wÑ"'����
Y_��c����X{!��'y7�$FS<��B`/��|s
+���E!���Dޏ���b �ww�.��8����v����=�ca��{!甇Ά�Q�n(�R'V��rvC��E+Bh/��x�{�<��
�W�k�R�	
b>R��

/i��<q~`o��"4��IwK�^�S�b/�`&R����)���u]��Gt�򐖜NIP5Yے5�jY�9�?Y�Hk�mK�2��
�����\ޞy���6�0A9D�奀z�w�Cb����OxWr[b�-	L at n�ϏX)>,=��i`$�%a�0�"d�({
�l�������L�y+Lq��4F��rzM�
U�/C�Z���q
�$�AG�b?ΡϠ#�TyC
�G
_��wr��3�l���ݗo�c%�,�N<��-��
::�l��s�
�t�l��ЉgБ�	?ϡϠ#O�C'�A��O�;9t̀d�< ��$���:�
��`�d�K��&t
>Eg���
�ڍ�=���$dۖ4Rb�%��u�L�d:���㜍�i�0�Ē�x�����D�=[���	�HȜ�<>���D�ui��&J;�ܩg�+Q~�F��K��;�O��{:_�5�iٵR�A�<�W��h'��
�����>�R�n�&�I
�!O��$z��7I���%�=
�I"
+ [...]
+����
+A�.�;��������C"9�t�(^:~���ÙU�/��3"�-o��&p�1Ѡ��2�$I�N��;ԉiRpgcd�I�s_��/����2N$����I
���NM�	&��i�/�:%_��$h���=�����G���9�/��<���(�s`Ol����L��g�?��[^&|z�
�=���b�� c:~�+"�@'F�ӓ�I�l����f
=�],_N��:K=7��<�΋��*+�ػ��v��
��Z*�4,v��L
��Y�
c�xczS��3L0������C�	'��ϒ��48 ���a��X(�6~bg���
��ěc��#3}�S��4��fA
eDq#����}�Y
���^�x@'������L����
��;49��%�<3tI&1��%�
�K7�ѩ��'>�
;�N2�^�Ȱ�$�G&pa{d`J��
�5����#cSy�*���Vz��$�##{
ȷͼ!�
�y��GF�}JD�<2����~
 ��Ȱ�{��'�I���[B�HHϑ%a����p�>�C��,gY���r��'n5�mp�g���咐:*�ް,�_^����N|h2	+4��{È�a�W'ps�kyuBB��]<˫�n,#mˊ�ݞ�����.P��,�\�
+[2R�>G��'FQڙ��pB��{���w��X>��5��|8z��##���p߉P}=��z��;�Y��{��d��ޔG��JI��Q>
;�&Q����4��-�p�g|Ҏu���2����$�\�+�v��Ib"(�yη������+��	Y�5��Ƴٗ�i<
@�!O��8ǾU�"���̺��?዁��
�͆��/�Q�ذ��Ka97N��'��HM�
�/�1��d�3kQ�6
{�6�Do5�†
� ���W�$6�����s6l����#Q�'���\�H�R�o ��D��$�O3RG����R	�|gFj����d�~
ߐ�jQߒ�
+�%#��yF*��T��&l
�Q�]O�_c1�ȥ�"AFw
�͆��
�o���Ѷ��J*
�.��T�W��~*
W�?�
v��T8;�Gp�<��U��j�+���}��w��%��Q����B��ۀ�����fѓŎ�׌p2uAޤôٗ

9'n�`Υ��Z�k�a6z�d��'7��ĺ��J
�Ca�7{��c�a��\d�*,S���Ɓ\��Y�h�Ҕ��~�i�����~+�v1�1;p`���EmF���Nś�鑡kq��Z�d���S��wv֨���rqڱ��ʰ��>Ē��FA�
u��vN%#1����Kv�;��&��6�+��X"yg~yO��Z9\�!eg�|�z�>V�
_��?坵���-0F,
;٭�ΰC���X�H4�.�y��J�.2JA����.D^T,�N��լY��j$��n�xש�v2��.*gR *���v��`M�܄\�
U�ƺ�mT�򴈙T"!�BlI�e�qn{!��]����x�ױ
+��ط��ha�\���
_���|o%9��{�
W�(^φ���v��+�0��DJ�������Xרq@�$�V>/6"<>F
+�]j�NA�RgD*�y}���l��H����Υ#��3���z.ݷ�0��t|v �{c6������t|C��<��l:� �{��۲�$�u��l:	^�7d��A��\߻!D,��/��?F�'�t|�4�uޗM�g7�{�;���r���v6
_.
;g���t|�t��\}+����w6
�ft?Mx[6
_�x�a~�MǗK'Z1�[�tB��{���@qNx�M�ŎTyW6��)&%�N2�~�M�e����n���K�4���l:>��/�ͦ��	

{���tBqJ�ͦ�^ߛM�7 �۳��f���yk6�3�R�
/e����ߛM�7 �;���R���-�)dž�3'yG�bp������2�R����v��zu���ի�V'�]H���ʶzf�a:-�&Ë-���
��=�D+q�8��DڋU�{V���%£(�)av~�K��x�Y�trJ�0��M� [...]
�

(�U �|+���Kܻ_���N���i9�����gI�3N 0I%�������%	3���OJb^�;��y
I�D�ƞe�S~���
cE�|73���
+���U0��
?���^��.%���:���p~|�KB��-$��%20�G$d�XU�
�^��
l�>p�o,���Pb��'������r��Ɔ��^�ƿW�7��1�*���R��|�����R�퇑\����TL	#1���
+w��j��8~3��!ǀr�$%]zb�EA��w۾�XkQH�����3��LB��7$�6ŽYRc�8�I�e��	8?O�m>����vNp�H�<��k&x�k`�T]|�1!q&.Ȇ�����D�b-�iLR��4�1�yǹ�Ob�
����Nn�7��`�&����O��n���$!�π�+�$���z��WtJ��~Q1$�ؘs�J����mM�•�^�q���﬇��
�����y��u5��
�Q|O�k��t�$�R^k �
+��YQ��m�
A������ޠ#���w�OΝO'�EE%�e<m��W�a�ab������g��<��ԩY���1R�Ng
rb䉳�)�^>�_�̇;]�&v
q2r��f]��:���z
��vG,���´_X��BU�ڒL��NY�id�ͽ[�JC�LM;+�3�|8w*xTm�#e����2D��]@����s*U����@
+���H¡?ۅ�&�aC�
�̴��P�I
iN#��t���pa���{�cVg�z�5�Xg��Ү���F��Sy�'Zŧ�
Kj�Q�$L�����
7��v��:��IPF>6:A��
�HA�9��\��^Ŭ���}|2$R��'��Y�Lj�/�����.��,`�p��x�j�q$Z�E�'�/�"�N��U������kYi�M���֓�(�g�=p|Ocҟ���,`��
qZ�]�fc�%IM|)JK�_|"U���pcc�Šv&���;L��u�/�`���u� �
�P��։���ʟ����k��)�Ϯ�&r E
�2)>a����N�r�L����_��k�1fЈ�{�3�
������ﳑ�6�����?R�-"Q7/: ���'v��N;�q��}`��a;���J�n�ۤ��L|/�����9Vc�{
��g~�)��=��qF�����jT3lj����S9�ּ����/�3xOԑ��:?��L���N�|U��b� ���%Q�i.�+{ϝ#$(����(&���H��(՘��&-
Pj��O� ������,)
Pj��GY�Rs ��wϲ �� J��*8C�r Eb$dJ���c%H�9�������6$|�&�X��ꅢ|?��&�(-��X���,���|L/�D��rQ>A9�֢|̓��VQ>��Q���3��*�����ҋ�=9߇��]ug�7��
+\�wC}��w�ҫ�� ��Q�O<+���P������	����~�U���)=��'�n�����g���4�v7�p]��+ߔ
���'��_��'^Տϲ�N]��fr�V�O��@T��Ty���x���+������y]��hU?Vu�o���
����~���u�c�[�O�{	�����ot��؋u�B���~4��Gu��C�d/�bu�^���~]�Gt_U����c���"\�ﵺ~BPh���Γ�	�u~^�O<
�u
ͷ���[j�X�����'���Z]��'�o��'
p��\��������������
+�n���~�������,4ZU���t���z|��{x@!���P׏/��a��5���~�X�����σ�.�w��q•U��3�������"Ǿ_�O�6��~AѪ~���{�2
ވ����������u�x�_4Ş���~�n��i]?Q�:+�������#C�S�O\��ͬ�F]?�4ɇC�g���f�>����dx�
�[���g�J�����Z2<ӧ���~��9��~,,߮��bCVU?�
�n]?�@�[=��9m?���C���<ѫ�}�oɤ��]v���~�U��Y���y��'x���u�hXx��qrE�Y�OH�Rvd�u��b)}��u��T���(~���xB�S��%!��+�Ӻ~�U���߭�'�90����av��h����@�
숏��w���^3۵
~����-F$.2�Ӂ���S�=؞��2��$ 2�)P#�.v�\݀Q/f��)XY��&bq7�VMP'��|���V��ȇA-�� ���Z�M�ψ�<z
~_�m���{,���{e�����l9���UK�=F,�. [...]
�T�)����!Լ٥�3L'�ɍѶ�V��"��"H(F'���q=bC_w:����u-�ߦ	cx4���$�%���Y�w�a檜�<»�B3�9�I,c��k@�������&&�0J�
����>mhQZUY:%.j��_�ˍfMf��媸�,Gu�0�-#7��v[�Brc�6���VJ�?*�HGG7���Jxj���)�,���[��8�Aؗ�����ּ|�
,�b�G¬��k��xצ�l/�5��?�H�R�>gz�F
+��;皣�`���j��O#�g�N� R����
��Hc��>w�d��
��[�@��ZPl7�u3�7�Q�*Cpm*���1d|���u����D���s4|�6:D)�$�:0aJ
��k��ۯaýyߒ�{�����w��̤�dN1�6��3'�V[���C ��O�
+>\;�g�x3W=�bJ9� h�����;�-�c
+�l�`m�ڎ�+�Ne�Q��N��٫�@��v�D`�E�6�o���cK'^�n�J7�޿�R$�1��,�
K�b~7X ��=��g=�E�j�0�te�Zd��M�c�v�}b�Xu���j6C��J��gz�C�S7\bڂ�*&H*X9�'V
+������_Փߢ
[
+�*m`
���7j��
l�@6�}�&x�̟[C< �#Z�QM>���
Y�������~�ώ�>��-TǡN8�
c�<򫽋������ǖGy�VT�
���iO9�c]b�K�
��]DO~K|d
�7Z�/
�
�Fۆ�?��6��ϑs-���l
S�&=�.ʤ���W���J��p��3 R�O�h"��?��~�-?B�E��"��+�]��
)��R��(/��$���L���+�ayTF �����4��4Ai�%�d7������7v
@(���C�	4.�[�5�� :��p�f>�

���'�8A��A&��
z�ah�R.F��� +G�gڌ9���C��e�!��3�=-�H�.ȩK��P�M�` f�Ը�}�&
+�6aI
�0� >\�Tl����#%^�B�
�@~R0���	R�i�O�e�NN�Jʀ}�
�EN����ˬc�:�(��"���(�f�
Nz�TO�Qa�:����N���O��y����y,&,��	v�s�
+��!ж�>�	{�i\�M�%iP"�ۼr��:�\ş�xۿ{��}Lj��jb�M�]�t
+Lh�
�:�?K��Dsk�6�?I��L�o ��k2 ��tZ��JVWw���J�*��7��\g��y��.�A8�8M�$~��� U�mY8(
�ڌ�ƪ�F]�ϵ`.�
:��QO��V����S�`"%
�u̞{�o����UN^VU1�N�nh6Q3���ķ��o��dx�B۰�
+��fE�ە
+�
��{s���O�_{g��6�,�'�;�$�E�}!�}M @	K��!
k�9��s��V�$K�d�͹w&�t�
c[�Vw��������#`�;�
+/+���~��7���bN
w��q�	����^f
�
��(a���G����E*�X���M)��,P���N�1�-%�n���׾K�x*(����H����f��1=�,�kb�T��*����
+�������V�������$l�z�"T��IT77�
+�)QK�Kh��ݔ�$2p
�V���{k��$ܞ���}��~vO(F`�k�R��z.Fp<K����+��1H�
I�F2�#��^41��{1f&/��Fu�'���E��
�6Y]�9m�tݩ1����C�淳w
�ʉ�nc�Qw�6��#��6�P}���6���@m,�����؃�4��6�d��6�찃��HVm�	�t�`����1%�'���n=>�(�C�Q�k��F'��Hc�#Y���B�k1�
+
��e�o�z�CË_�[odvwܞ��S��h�*]
Zo�.���C����r4�.i�Y��i��7�Kb@*H���l~��%�
5'��_��Ʌ���3��뭯c����
}u}���3��5��E_����j�k[����5�+�O��UG�^
o7���}�&��ڎW��7K�n�ީ��tՇ	�m1�
v��L�h<Y?�Bb�b
M�+hF����Ѫ�74Ζ��!ᡛC/�^tX��g�,���]$�á�:4��";��Mh�ٻ
D�����we��辁e��^>�?D��86��g�E�*�ټ�tv
+�S
+*,�Nv5��?�]n\z��*�W���'�G�� y
>���8���i7X���
A���8�A��^���9�l}��q
us�������+LG��|m1��N�f�C�O���LJ�
�k�o� mŘY/���-�%����7��q*X���Z����ط�gY
�
+�y���
g)�/�
vu�
wʞ��GU��Z�n������U���v"�1�X�/�YZ}u��
+噠��3��X뎴�
]����zt�6GC���E%����,�81��Pl�lNщ�ZÍ|Fٷ�խл�w�wG��+� k���A���������(]Y1��}���GA�o	]�Xx������O�����5X����
�o��c�k
�V��X^&���Q��ϯcK]�K��o�-
��
6<����
�F����;u��]>�^�!��N)
?�Xf�'6�4F
�|�X8[
+L�0D]E�QJV���B��h���`@
+-W�
���
�i{5�fڋ��������bQ|X�F�BT�)7o�Ɵ�9��{6��vX(ά���
+Ƌ�M�kb1�F��ЧO������p�����%ښ3�wGlS�:^l���/�|�1
�B�9�u=���P|t at z�Hz;�?�ܳ���e�؟�Aƣ�ph�G��n�E�akSm�_M;�ZG��*3o��I�����l���ރ��9=E�����q�º�ap�������I
+��_x:<_Δ���B瘙�q8�suz�
PZ��:��;���P��s�_
�KjO�c��|c�
�Υת�=gO�WTۍˑ��-�i�uxy2U!lq�:yu����{Nc����{Vd߾
M�>
c���)
���==�� 
MN�׽��6��z�V��Ĵ�f�fd�|YRbゎ]��:�sBᐲV>_�]b���c�4iX�B
�G�ACӣl�Z'�6�������h�ٶK�/?4�'\�:��߇
}@z���Յ>�
���t,K.�
�ΗԻ
}@z�����=�=u>��.�
�b_.�
�X�}��t�e�م>�=���م>�
��

w���GT�r8z��+#�RP��`Vy��FB��-�����W�	�}�t������[7�GA�;"
�&G~F�7;�Rǁ�`lz�s#�
+�-=� �c�]V=?����u�n��/� �������e�8n�K��>����Э
�K�^�C�+{q9��z�N�Z������z��:�aD�'�1�����V4����A$ �V�v�
���ʼn���g�`(#���x�����f�����/�)���(ݽ��,7��O�_�ś��U���Mz幝��5#�՛Z�s���n5�p0G�m:��a~�]�X}��me�;ٟ
�~���~h8�/��g�;C#�w��u?�V^
-ӕ��<�~2�06}�P��S�-Z��H��=+%��:>bh��P�N�c�v��r������3�M�Uq�~�`�����v��p��qO}X��p����ڛe��bk��,?~s�~=�r�y��ܪ:m3 �� ����Q#ظn���8R	��K?�'q
_�ݦ�
� ��f؝��O4�ջ�C��_�ݺx�X���BI��˭@��;�?Z���тY�kc���ںg"y�X�[��
�
g�
4q�K�n�OI��;�–IlY9-l��IN�I0��,��h�
g>����6�9=C�n�B@���
w|�&`ʍ>��{	����m;L����ţ'�^��ɻ2ń�p��P
��Ĭ?韍�mU��/�_ډdk��ѱ\x��V������Z���o�)�[��+G�
^
+;��Ηj[KE��
���و��yԼ>�D�gt��|	�g�������r�������|�ћꋛ���'��$�$��\)|Շ)�T]���{�~���g��q
zx"��/^�/���d�%T�vu�S\�%����63Bt`F�,.�2
�r�Sx����T�3}��1Z��O,)�q&�7��~����o���Liyyi�	��+I꧓ʁ55�
�� 9F�:�dK�3�P����=<�����/�??;�˘�b*7og��ƻ����&\x;�l_}�-
�{�ΣY��2D��(�+�t��O���
�V�O���
S(�)�+��
�y((>9/I-�dɐ)�ߴy�F���W
�C�/d�#�������Xg|Ycjf'����q?�E�
���=]z ��ݽ���%,Mm�	lw8�]�mI��^M���p�������5��\E�Ѵ�����
�e|�'�����h[��J
\��7��5rՊ|r�����7���@�����z�#�)$����&Tp�৑
+&i�h
�pP;���~|�7񳥄�d���4�*8H� r��8ݜ���*Sb%��Kjb<
��r�?��ia���N�[�3��0@<�� �VHFg�\�dk�-�y�X�
�
�S�

��ҙ������#(3
+��6����ߦۏ��:��-zU�V�.+���b��J$1���-�������&[�Q�Wqduc�ڶJ�k���'*�,��/�ܺzr۹~rs�:Y���Г����'�����
���i#+
�Ij��b�T�q��Zm�t�=�a��|J
�-�_�Tfﵱ�#���M*�|�Ol����.$�)�ht������n���<
�|����}��������Ӟ�� ɶ$�?��#y��hR�e��8��/:?c�<�n>Z���Nvv�LN~p���P�k�勶��_FK�VG��)��F�ۑ�Q��׽0Dkco3�@�AlM)�1�r��� 0 �����[
�����+X0
�]�u)��,����yԾ�rz!vB
%=G�k������\t�cu��Vގ&|���B1�r.�'.%����p46��u,�u��u�����J����ߖ�9w�-V
=>h��ú�߄N��Y<��S|ݥ��3p�n
������>�%L��+o=V˷�)}y��eq��2��X�H�P|J���ȥXzg��YY�
�Z\��
�|�{0�k�#Y�{y�2l^���l&���f��
�ͧ��ٟ�z��V�O�4�d�|z̦���:���SM�$ª��8x;q�����/I��&<��3�ӑg��
�ĥ�!~8p�m�,F&�+ՓO�����:��%i�i��6�j�X�DŽ����T�ѧZ쑭���_"����<Z����?O��X��Q
\���ɝ&�V�$Z8Uh�
|��qte_!��Ty��.��_l�n�Tw����Ž&E)��199-`]
�͊p�g4خ��֗�߾�|Ÿ
+w�_-w�g�������o0�wqF���i<&�}��<,Ѻ�Zۈ�NZkw;|-m�i�7��Tr
][ˮa

~

J8z�1
��W`t\�X���%N;���������6:3O��kIGf�X�_v���[�'��������z�@����_m=ʌǤ�/]?-�8Y�������
+œ�\��x^m��\W��I�ioc}wmћ�N�7�d���4\*�
��y����{�z�>����b�!E��'��Y��}�\�׮k�_�z��M�w�ye�o�y^�<�ܝ_�9�n��
+������{�x���j���'R+(o���})�>Z�&<����	�����Fv>��,4�f�6�{����Ѭ7L���]�O�z�����.OT�����}�~&:�hTRR�痵F�:�m�]7������
\
��K����M�?���H��v~
�N^�_��n+U��r�5T]X�^��
U��q��O%���P��닻j�>�lT���4�&���ꍉ_������a5X�O�뿰9O��ݞ�U������Ŀ�
%.���w��
+�\�(G/��������e�T^�9�/��*��O	o;�;�o�v�����2�K�*��
�f胚y�`8��q~�tYG��R��-�Y�}��P�e���	g�X>N|��"�د��c[CH���Z��t�.%~^�}��.��.��y�����s?���qs{W�j�����
��8��!��S���i����w<�~�� Cdl� �J���`�hDf�����\��"��W���G
+�o�F����Y�d���Z��d�F�x����>�7a|�`X��Z)���2d(�5�
+c!5��TXf���h"�7Zp�\B�<�}y�Kj�"���V�*-@
FȬt�%��0-���MJ��P𤔌�!g
/4�LI/��Sw���$Lg��S
�RM�LZ���<^M��飃-��pBx�p��N�-y�t�O�
�o
�s����ߌ���T�|��̻�ӄ�M�.f�Q���}����\����OQ���e����������������
0E�U�����r4��
!�q��$ c_��W�蒯"N�@��L*#(%DYM$`p`K	�,���&�� }�h�뮲�$R7�FC״Ty�7�)���
��(&B+�6��F5�V@
x�D�@�8i�`��oYBT� � ��Q�Ngf2D:
�J	Q��
+0
�
+��sC�8��� ��
���ҺI	�5��L5�;�
�s
�18��
�s
�18��?���}N� �F�Z)pˁ�(��K����7a}b�Ѡxc�a
+�6KH *E3 at v��(m���j4@;�+�B����(��U at g��
�j*]h�
h��"+
�A(�XE�2��M�HG��Q)!�s�	�X�Jz�� �2�vu
��f�*%�Ji'%��q*7=�Ux+s���6��獷�gDjI�z��x���[)|/�^B��`�
����xk 
��9����@R
��P�	7����R��TDq
��a�Ą�L�q�R@!�%��5� ~
+�*@?�bk9	�hb� �2�Q�Tp.�2��=]P�i�f
+�CA���
�
+�"$��@�h;2 m�*�g|�E? ��'���*�%d�8+-# v�R�J2e��J��.B�"(Di����JJ
Y�&�T�{� h�%�S��
�H�m(���zXn
?0Dfm �P^%�-�>F��i��ZpB	`X�\	�@}X
\1�R��6��+-�=W�ƀ�8T�af��Y#FE�P$�(�;�9�i�]Z��P5F�.�0*����� ��mN�9u�������0��ˆ����S��>a�=s��`M���n #ߠ�0��>����Q�̆���b(�u�iF��0{$�
��)�X�3
�H�Mp
p? 2�z�!�̥TZ��`��ު��4�� 
���
0$��)@*Fô��5�-BcJp��D
+�8"dAf��	�l� �8AvO�&-�*<*-$}e`�
��
^:3�
ஆ�C6��J�T
i处2�#3=�T�e�e-fN�9���\(�R���@eN�<�2�} ]�WL��G��5�?�r�1@���W�9�>A�4\��Rh 'd[��	A-У��f�a�H&��Tqd۴�@%�I�Q�
+�I� P[j��R��J%e � g�y
]������?-–"��CRL� �i�<���7+/"�er+�:���ta�4�;�n�
��Ԋ��
W%J� ئ4�N'��T^z��>�6
+��6'�gN�L�0���h('�'�R�Ë\��|
��d�8�e���0������cq�@r\�
+�70O4� *�V��e�9`��D��5Di�8��&T�2T
"`6f��b0����K[�!R-`(�b
G�ƥ����-�-9�'e�I�t
+���Q>!�� }�[�֑�^�Y 2��f*%R-���ʨ���<^S=C.���6��
r�9����g����Ann�
r��
� ��,����p���2�`�[i�2��} 0�]�\S��5ܥ(�
'��6b�m�f�xJ������ύ5�dSX�� Rj�� �Q'b��I��\H
�5�3�r(�2D��C�bD,��g�P�\�
��3(gFf2D:
帻C��0U�G�B��R�	�
�
�kB��2�D0ƸS7)���S�顦z�a�MN�9
�4��i8_(�|h8_(��h8_(7
S�[��v��,p�
ܧ�08���
!�I�A��
�Wy� M)ƕ��щ(�k�
ԋ �p�X-Նq�!	�&�Jm\?�b@����bв3r�!�Y�j!CH��R���i���	�i).���Ru�@���I���q*7��U��*H�9����k�9���������B�	Lr���qZ��kͭ����N
+�0a��VP�bQ�kb
ny�[�>�=��%�Q���Rm�Z'j�
nW�%�D�5
�J����V(b	�=i%�[@�$�1M0&��h�*.@�Q�NRy��N�L��F�*������56,��,aO���	J�q=X�t8fF��wI�/z�6�0�P�E�[�I%�v[���
���P1�T
VJ
�q6_�?N-��2���(�+|P��̞��-D�
��������
+�&F�07P`�)�.^�VA�&�{ܒ"ؼ8S�h�t �
�-
H‚�5Ѵ��
��rJQ��9v���\�;���aw���3��|k���w0Bay�)��SBI q7 at 9��c
�
#
P�8|f�r�a
̗�M at b
 ���Wx�5<ؾ@�g��
F����jaB�%L���n
n�a�`V�
~�T$d���0��m��	E��� T�C!]��U$�;�s 
�JpܸM�O4ة7K� ���tK�������h7���G��h
��D� ��	��Dž��M�ȢV�G�H��s�pX;ⴁ��
+��G9���]E@�Jj�ٕ��`>
�p���
�OF�^U��	�^v�`��b?�~pB_����Ew]��P�

+� �
Z`q��yN�9��d��yN�9��d��90��HeM�� .|`Z<� ����
�
 i)�3������Q.9��Z4}rN%p?�3�X<�
��[[f0��X! ���
g;ƃ,(б.�"%ĄO��TL��
2r�!�Y*xTZ�A9���p�Tβޑ�
f8Xp
��Q����
wh'�NZǝ�顮z�X�Gu��C�3���8�g��qt�b������J:�|<0C
b�� 3!�5��'0B���DJ��3�=�Z3�ZA��IX�i��Q�3ъ�p�0I�|6�h�
	�
�ǔ�Y�<�Csa�c���(�{P����
����L����(�.c�r. 3J���ҊI'�Ro:3�WS����et9������5�J~F��G%?+~ͣ��W�Z(f�VH4�R�v�K1����9��Ҹ!E,�(�\Q�
�F�
+�%�?(�,nDf9�
P�e0Qt��1#�9�ΉD��x���2�#�n�w
0��Z�(�F��@�PH<�A
l���3�94t�ex<3��+��Y�
+�b��V��T@~h���	�w3�����s#E�t sPH�V��H��G1�
܄�#�
+!
�pmn�����h]`���L �B!1
�)PA�A
�hšHx����(��r��-
��k9�
TbE`u
��X;*�
T
�Rȏ�2[�}�����[� x
��M1Tv*�s
�q�<?��z��"�*�T�S�3��<4�Qy
�<����.�"��
��owl0�;�ŭ~ �t�< j2���v+6�Y+*�6o�|`R������d�)��6��d�z�M�P���)_�RA���	���4�
�`2�-`<`%�e��
+D�-Ѥ���]Dy�6�q�@�na�ѵ�q���g,. $F���]�`����<�K:�ǂ�1l�6���?M
N�B	�cX1�u��Ef���X��o<ؚh���"�m`fP -��%(dFRw
�a-X�͐��0b���%W�@�

+���`f�H
��e�	�n���S��t�����YH�t8T8f�Yj����G.��^��9��\�sy��9��\�s�����h\��L�B�f҅S�oƬBr���0K�hG_YT�J7-�@rʚ���@�H���~0x\�[(�3Dܺ;*����d�Aѝ2�2�b����"��3�)�^�`�_��� 0�5���w^*3\���&
7"�3�SeJ�T
iݤ�Ik�33=�T���#l���
a�g��y��3B�<�c0��}�o���
7{ԝM������Q�m��ZAy#%o�K�����7�@Կ��\��y�5n�o��j_o��]�p/[�o�w���rZ����
ϭ�u�2�s����	E ^y�Q��^�n@�}�4׮k�_����M�w�
j	n�W.�+w���›B���
Ź5y�t][Ǧ:1Q(�*g�O�
+ U�pvW�Oݫ\_�4+��-\���;xVݻ�q�7��D�����r�����
endstream
endobj
129 0 obj
<</Length 65536>>stream
+%AI12_CompressedDatax���
��&�����{��+�H����]�
ͱ-�%{ܧcBQ&KR��,v���~��}
@^���"�>�hV�����`a�o�������/N_����Ű�w�?���������/v�������������;�=N:�2~�O�������7_�Lܛ������g����W��v��o��������77��}w��������y����{|e쉵'���6�~�K�p��OW�����
�8��݇7�n�|����a��
;3L;>����������S�C��Zo<N���w6�~��!�郳&����m?�q��^_�y�������ޝ���ݿ�bw��՛�/���7W��������p{��K.1R�z����Շw_�����޼���z��pw�ju򯮯_]�z�%�_�o/on�1ׯ�����,�_������_}x��k��s#?
��W��;�+^�����헯������c��H.��/���Y�������o���b�z���;�߽}}u�G^�������f֙}v}:����oo�в.��˳�5����9/�>�̀/�����sv�����g�|�R������_ݽ�N�uz���DD��}�7}� �߾��~4����ݫ��/vv����J�I���N������������eK����/�~��_
����7���N��s; /b�����o�φa~�Y�M��x�r��5�5V�����o�|�I%��)-���߼Z�;X<Q��a�cZ5c&�Ovz�'iAˆ-c�}�'i0���_��s�=����/��X.޼ [...]
+|��>}7�.���o�����?ܽ�~�{�^������?]��ē�W7�������=�>9{y������������'�z�
t}�U9�;��|�U:�J�vr���
�����_N��s��Wr����rewr�.�^]z=_z�n�ιY�s3��Fnߝܥs�ҹw�s��s�ҫ|H�~H�~XN�N>�羺������Wx��듗��w��o9�w�/I�'�p{{�����=g��'���՛W��,�
s��^���{�#���'`���
N�;̏ۿ�{�����Ӌ��ށ�������y}���rR����oN^�?��y��w����ƭn�\���W�^~���+|������q��������//o�^˯����W��`��;�7�5�뽽~}!����47o9�wo�^^����8�Ė�wqrGy�
+�tr�Z�'��)���?�=����᫛?ݐ@�I���_�߾��J+z���N�Tv����ܮ;����'���s�^�@d��}���w��
�8��wށD����^�~?M�q1��E��/��_������/�I_���Zݯ���t�o��]���W\) ����i!^_��'�C��iW/eC�-�vtw�Ç7�_�x}{��=�!�O^^��
���~��;��E
+
�
+��x����ݷ��_��;Y>>YNH"��7����f�����o~|{��n�D�-���'ۓ���fF�	 �p����W��c<�y�
6��Wۜ� '�K
b��Gg��n�ysu����N0�ׂ>N��߽����w|O���������_�:3��
�ܝ����[\��S<9��f����m��o���Y���[l�o�����n�=I�ߌܧ)�S�kPeV���� �_�~�W�r���o���~���)���|����;�x���[`��	��t~y�>]#��
+ �?�O����s����3ή��E�ݼl=������w�x$ ���r�����~)��z��W����xÿ�3~t��ׯv_�����Ep@�7�����'�>`�[�?����9
�?a�Փ7��
�v�Y�����޿��7x���~�R_/��=�������W�W�R�����5
�^*}��o���-P̻y
ҟ
��3�>{�k
+��y�z!��'��xxy{��� ������wNJUȧo�t}{�v��yO��՛��j�!�u��ܐ'^���Cw��A:�®�������ܽ~K������^˨˙_�7��k��������Û���Bq	���ϕ�����ϻ��~vw B���?���?u�q��3���p�����D���8$eu�yh�P�q��o;��n}'�x��
�����<eL�a~u����r��V�v>
��?��G����q���pv8?\
.��3sfφ3w��ƳpϦ�ӳ��󳋳���ܜ���ܝ���<�������p~v~~~q~y�_�
{1t��_��"��q����ѭ~�g�A^L����t����ࢋ>�1��x�,�Njx9�����&?�S�h�8���t>]L����9��é;���i8��������;=?�8�<�s�����0
�!
����&4<�;�Ƈ�5�&�~ڣ��Ck��!S3�aN��p6��%�8��w�
.�ɝ��;�\�K,���;��胏~����0�
9��hF;��8�a��4����
st1^�>�`�\�a
!�0��pg���p�h��Ct�v���8�q��8�8�1�8����p8
���_���?�،خ����������F�<���.lE�
i�-{>[��?��شl]#6q<�?��<��z⧸�3���RVFc�M�o�>�S�c�g�9f��6���3
Z�h�D�rsj�Ӝs��%���ޏ����0
2� 
r�`
��b�[�[
�je��ޙ��
r�?
�\>|>���#
;�3�>� ��Z��q8��^(����N� �y!��/�Tj�Q����r�r�|D9�|���a>�:�$<�7�E�x�gM�D
+=m��~24kA�A
+�&H�7P`�N����at�>��|_�S��#�[�9���i}㧜��܏<��٢/�ظ�!�V�|�<�+����kW0���sP�����}�>��v���
8�{�;<k(P���������]�o��v���� ��y�T�����ź���`^�a�}����_Ѽ��$��I�Y�߾ys�z������*4>�t�]!y�r�|899���	���#�a3T���8�
��xLr�|9F9�
.�
�k��x�� ���Obk�r��#=#�Lr�|9F9�
N�!
ݩpv�;
=���&ᡓH] A
y�	ٹ��;��qJ`�{�׹\*W��9@�0�
H�3L�)nNG�T�oGz��
���p�0�	�% �x`�ʄ
|���
sy��G���A�XȽ
�� �
�|
+��F (����݃�_ _�a�O��"p���},f\�p|v��9^��V#�����z���砌C��� 1���$
 S��!e. nϰ����x�Pv�b�'^��>�*C�c��x/�Dg#jc�s��&�hZ_P:�#�Y�
]�%6��y�6�L�]�%g��y\���'6���Gl�SPwH4k��#��N�.ًt� 
�O�md��[.���B2jP
�2��
Ļ�NS���
�{���NC�. \w�[�~��ɮY���N����ه�Vg|��O9;�(�4�4E���:n�x���}S
+�1 (y{Du��160�����8u�Ƒ:��4�@"��лa�[��W���C��j_w��hqŁ�̪��4�k���Nec���EFGI ��|�P�XJ�ɉ^b��,�.�xq&r

�AEQ���UXVH���BW]��_`I�Q�%1f;��^t��,��9P�Q�%�F�&�
�M�M
E\rg�3N;H:ʺ$�(�ģ��'r/I�sA?A
S��A�8/�
l'dۋ8L�\��AƔ�b͒�щ�h���,#)%����첰�yo��3�[�Ϣ�"�n!�i��DI�Tl�i!-��+�X*��� �(�	�MF�b�H&�(&*Z��0I�	E�DA�^0#�b/萨� 00
+����z�t��N����)��T'��	T'D�	T'��	T'
aFPO�
�Ȱ�_��������p��S����_����8����8̇ �.��L�%��������.f���nT�J��t�Ͳ�4[̳q6^��H�-�e;W2A��m>[�Λl=�b�tb�Lǘ-�A��防u�T,��8˖��l������G^���X�2��;3j_F�uf
��r,���>X,�k+�;am$�j�`Z�����
��Z��x"Wq�M�����>7M���12��6�%��A�8.�
�~����\-�%留n�� ���=��<�4��!��~G����D���s���<몏�h\S�q�+�M�_p�[�|�S��ޥl6�
�x���_�>���
�b�O&� N���ʎ��Օ�]���J
����W�{���{:��c��%ة@�3q 
_vt�	���J�+6
+����t�Cv�}���+�^G�:t�p�:��>Ņčŕ6�;�T\j���ٻy1���9j
I隋�g�	�;~m�ٚa���ْҭ�'E%Uq�8�0٢��&3�Y�O/\]s����9�E�]��,
o-��?��p��/G�
[�#�#6��ut󯧏
ڄ����1w��p
�S�6j�O��x�6�5�����put����Q
�SO��~*��Q?�J����kXZ�

��y��!I�3�|0z鰎_����/�ϛ��s�T͋`^�r�ό<�D 
>y~�I�>y|9�F|ʞ}*�x��<��
�}Ob��4���
�[2�����ǎg�t�O�a<��,��,�^��(�"��S�����<M���V��5i�	���~�J
��Y�
��0� k�u�.���=�s.��ǥp�^��N\�ɽ�%yaK���rc1������
�j
����P����V��(�X�:Hj��(�g3�zPg[ŧ[���[��];ا���ҩ9Þf�*~��h��?Uk�gS�[�&�D�9Nf�[�/�ȧ_#�`�(5���D	E*�|;�7�{[��ϸ&=��k�r
�����MH�s.�8]|l��#���J� ��x
+2�0
�r ��;�D�AltF*;��.���
+%U
HQ�'R�'%u�7 at EX/R�ԓ��r�ʔ�I"'y\�q����E�E5,
+�lb���
�
+<�3���
$��\�j.3X2}��	f��C����
+z:�w�\0ԅ�z�7
N85�pl/��G�]EAXS�)�G�OS���,�RX_?� �8�t
��$$��%���qPLA��1����8,G����1!�;\�V%�̃�}��V��w$�+v�Ov|�au��ĉ!��v��̒d�!3%	�Wl�B�� �)������� �(钜K�;��"�x[T�Zqب
ݣ1�ZqXT��m��̻Bh��e at 6C1�1�}-�k��:�
+�r3w[�
G���!�3a8i�_v�����
zhs �ˇ��`����X�/��P�98�l�9_
ks�
Ut��j�2�	g�
�:�eȔ��f�ͣ� �����$���
��N�47��st�;�?�
s��
=�u	��|�Hq�0�@3��F�SN�K�iƝvnF���Y�*/O���A�؄��������j �;��g7�g7�g7�:�����n�g
�������?����
��N�\2;���iq?-.��Z
Q�s&_qG��:�E7�"/7��~
�Y��MU
U>�fwU��Y������aNe<���.� �~1�t|�|
+����*6����9�rZ�_��m�0g9��|������,���t^���
��i��i�!wIɏ3�>t+E�"c悑��Yg+��۴�˕�fK~I�Oi�I�[�E�[��$A�����Nf��tI�l�:W)uӬԝ�n��
]C����)��E<I���soQ��Z�(ċ�2+��<��
|��ݍ����63�
��
��q������������'�<od������XD�,gd�&?C
����~�\���h݃��g\�q��iQ�hQ�Ţ���	ǃ�����<v
~����G[�'m�W�n�U4��16��8���Y�Ɔ�բw}
�GK1���, e������e��)+��{}��?mlP�ʬ�?��m�Q� 5'��mR��IA�j�Te�jڣ�%*B�
+!lK ��R�@��RꎕW노KF�!'�MݜP��<=�J&-���s�^I�+){KҞ��u�����[���\��7��us_+��h
ߺ�6���2�~R5�9�o�_�Fk%�}?r��%S%��Nn��񔓅��}�$
�`���
���6<�܏b�Y�ĚM\I����Z�ZKa�8`\r�
��j�>��2��z�}��~=�
�)����Jw����"*�#T�wO,�b�*r�+�lj�t�2*u!�RJ%�ʍ�TYUY�n1��R�/�+
w)
�*�2s�nS{e]��
[���`��S�P�͖�m��Y`צ��2?��?|�x���=	�l��CG���|� �f��G��y�N�)�ۤ�u��&q|I
/��K�xI /)�Ӫ��\�`G�x���
B�JK�3W/�XI���R� 
�N�E�,���
��
J���`0�r<W19I��u
.6�
�zqU�`��͕
s�q7�������9�xUod[W�*ҩJ!UI�F��5�{tG
z<dB}�nGw4�����a?ٳ
=�g]�q�_;�[V������;��a,���A��y��cWYx�}��
<f�w�y'�	��~c�Y9����mL<k#��̳6���~��t�/������
7~v�wG����~�ݯ��&G�Y���CXL�t/�_F1�1���"x
LЪtM�L�jo[�m갵��=��>[=�i�
��Cnjj�g�	]<vt���>.��_[_]]4�v��;q٥R`Ǫ	4�"s
6����h
=�)''�U?IO�HΥ��É<{1Y=��\:l0�v-p�¬Y�2�?��T���T&|��̎E{��M���"74�n����b��u7�ua����z�{WU3
����G����kp�a��`�v(Z#W�;�V�}�O�z���k�
?
ԥC����Vtq���AmmH[��A\�˪d
Y�2��*k{�������IVk���C��
�`XT.��B�
�~괧��Y�QM]+N�?M��GD|���n��L��<�Y���O;���c�"�O?�l�RvOᏵwt�b\i'S�^��EKY�y�.��*
���b*��N�(��w���U���l*_�����)�A���(`M:��DH+!T�1m��N�8��M��������{?a�79%{P����:�
�V_�T�L
Kc�˵�Y�cA��<�}�T��y��Gk7vO/ޘj7n�r�p��[*��ʼQmJ/�܉�<׸<�M8B�t��Y`r��˹��a.{g׀��!۶��QO�KR? �Ŗ�sQ�rP.�ьAz"�o� [...]
+g�� ������	0�`>'�|N��� ��`��Ό��k�k>��$�Q�K��*�:s~�xҡJ�uM_���4������Y��*}~��f�w�K/ͭygFh�@1�݊!�s�݅)&��6��1�Y�&x�[E��=j�
+y㗭�7����).
1�֭5+,l at Wk2����C�
۞~�p���d�ڎ�J[�֤�ԕ�����o�C��:�W�sM=[ڙ�:�z9τ�5(�I9
��9谄

f¹�VB�
���
�\���,K�$=�j�IK�q?�5_W�ee����M�
��	V�s
�q<��Sa

[Y�P���
�2kR趔�A�����
�B�\�
`
k��U���l���Z�}�?�Fz������E��Y
���l��l��ՙ�������ko3���\���4M�8n��;�epF�U�~
�Ŗ<�ԧ/"�������
�mVa �c|�Kѓ/�8|�
�ç�g�!
��qP���΍& �*�(���
��}��r���b�!�.�bY<ON�nF at kU��Nl*CGԡ�e
~>Fj5ŭ�PW��6zȫVQV�(+i� �V"�:J;-��r�
+�cй-�@>�Ƭp>+�k!����F��%�.;�cv�
+
=')T�Q�4�)�X�7�k�c(hE
Yĕ1�S�0�#Ht��&R��
e!k"�V,�M�i��$[��Y����h���Dx�
����n�v�@��\�;QV4ߦ�#��{"�2+�ZƄ-^�ғ�ɹ�~�F�I��bq�y���#!����|�G�f��H��WJ����r ��}����o����.��X�6�˦v�
əZ�4]
Q;jW�E
�X�,f�V�l�
 ZE->���͹��ѵD/.�u�:�w
Ǹ�d,��%���3���8{�O���%�����x�=��o�#�0�ݜJ�N(�
��1�[��|<��=�e�Өs���i�=���{�ms���Ey숥-���_��p�s����
��Q��~Q�s�(3k���
k�k�5t�ݲx]���-
��59_�
XQڮ����R�~+u�����i�۬T-Vr8��]e鬲��t�N*�
*%���j��j���n(���c�K�]6N����}t꣏��V��>��}� ������)�I���wt��!��}t��V*ϸf�Qś}�M�h�R��{��
_�fO�y78���m۬4��^pW�������B�����Qo�84��a�,ZqZ��UIcK�XZyZ�~Z�����z�ꩺ}��*�術RXK>�x��Ny�
��n�_���p{���͟k煤ʝ�4�)���9=�ϩqg9-.�8�����	wV��:I��R�%�z)�w.�N��]�����j^���
J �����	�����+I�s�T�k)!��bt�*Fx^]��ld.��U#�Ռ�JF
-�=�b�6j˴�U��R
�ge�
%c|�����������7߿x����ݯ��!}�����߀�/�no���ŗ�vƍ{vԛFp�ѹ�1
:��4�������� wn�
�
+_�T�������������G��������)��r�o��߽JW��ܲ~��Q��8�����uV�/Zz�����࿓����7/��ܽ���q��0�������g�_����������o�)X�o������7�/��|��������}�*�.iw�,�F�b��1�L
{l�4'C�� B���F}� d-N�Aw����|�ֿ3��L�O�G3@ �
����;
�`�\;���!�WEl5^Ec��;��>b���d��<�)�
�'���
z(8#2 0�7��u ��������"y+(��=W�	��Yn
�Nn3��&0:�M>qN��g
V
�ج�+.���0&����~�;�W�
�0E�4��)�Z��
+'ٽ�_��48@����t����
{0�`���q 
=&8��g�=��
6�@#2/���
�m��5y��Mz�
g���U��}&��Iޗ��&�q˜�$��
46f
�t�t=��Y�&�
+���ʀۀ�1
���1o�`���U0C`�T��I k��{:�0�q�K1$jp}!!V~�C�
��m �
>�G�g��
�N�]I�&#aՂ��9���m^aM����Ƒw4B��4�A��	���C����
��Y�
�g(+�\�?&`��^�I��B�9x��8 IpxH
�,t�=}%у!��=�����8��.�	$��"(rX.���pm�`�
�9@	v�.�k5�>�|@��$[�ˏ9�H�`
���T�
�IC��A# WN�ƌ��%�
l"hŒ؞=��b��x�c�l��@C"a8	�8�
{ �
@��`a ��.�����Ƃ�!y8ρ��ƾ�t���&�����l
+��!����H�N ֊�G�L�	T��q
΃I\ɺ@��wpH5`3pC�3���o�4���z
Y©�*�8b�NxP/�+�QljLp�
+�4N��H������aO�?���Q�
������˓�d��
_���I��Ԁ���=7 H|�݋��$������A[е�9|�7g�<*9#�z���'�2�=рwYc�Ƞo��@X�	M:~�1�C&
+�|�>�cc±x���
f��`��g9L�;Ō��cٰ�q"C��uLp%�8��#A�}�$
��������
�� r� �8j>��,͜�:��q��u !!��
+
S<+��?��H��MWC�bw�̗;�Hu�:L�D�
���!
���D�WqPdd��
+����䑀�	8�D��

}'���� ���0
��
�^4p��nH>��A1�w/ �
�
�jєB����C �ʘ��k�55�
+�#m���/쀭��0p��^`������"�'PY{����{�E�����	�`������`<;2Zl�H�4�~O>�O�q1n��� '�'X,���U�!CFC�'��X,
+#y
��\
�۽ -�p��m #x��ha�=
����PX�����O86<G�� �o�q�>�i�GLip�	F=
� �d����Ww�u��_���q��
����\_�������_p��gg�_�����_��2r�~u���oO���ŋ|��G ����6�߿*�m?}����|����|��������A�|.��D@�f�l���p3�����pE�T ��,�
b
`��BC���t�ہ�;�W��#���"Hs���=�W��D�U�=ہo�<�n�� ,A]�v�R
�h�
P���vP�p��nW_&
+�p;�"�`�6rW���u���A�t[J���|�a೰k��w����*�&�:�r�H.�z�d� 1�N;�؊S
,.�S�N�\������C�mH�S�XuNi�G+h����/
���Ƽ�4c�a��
��
��P�B;�9�ö������I��C�dt{X,1�X8N\@��:B��|�n��d=�B7�P~ �ӫ8�e .Ȣ�0M��I.�"���R���K'<�;�	�ڞ�T�3�`b����eF�4����Q	=�
��
F���q.)�
h6��=ʔ&
����%�	�
+�w�q�)�����
\S�:C��)�
h�V�t;�/O�� L
����'
P5��	�
+�B�դA���܎|m�L� ��X
�c��(Uq+,9���
+l�`�U0��%'nC�	n��s����f�����v&�O
� �E�s�x/��x�bi@������,.8�!�#*|�kb�P���ys������qC�]�e�~����X�j���C��U|Ȓ�;�8�}^  �]E�[DH
+��z
�+J}�A1ɂ����_��-q*�
�#�~
�6�����~�w��xǦ��h�2i��eGj�_��@S��@>�
�w�iGh�8P9`9c|�]^G�>���dē��	�)R=�Hꄜ��'���	����<�P9��	�X.8�38`2+`�n��G1DP*�O�
����'-�	�
��&�
�e3ͺ	`��)��胝@6D͘
�lr<��܀=����?XxK��W���0���8β�-�ձ0���Ց�'�(�	������`�E�E��>�	�-�Kg����
��a�6	.��z
��(���Ka5�b>TX:�a��\�@)�54
@
h���+"�|�2� �Hm�<���At�S�J=jt��/p��@ƎA�P�^��F�'�	Z�ȡB��
�5N=ƀ�����zy	ܖ�(����3/{�3�nh�I2�$��Q�q��.�F+�Ȏ4�L�.4��� �|Y8��T�?8��0�

�R�0��
V}�
�9��ȁn��4�[N�B�2{Z�@w`� �:�8�&�B$ [...]
��͠��f`�
�q.-
˾ǎ�m
+�B
���P��P6&��HN����
+�2?e�x��4��xq��<�k [��N�e���u��]���Ms��r�G�6,�TA
#cj����-=m�̐Sg~�!U
�>�7\Jޜ��7�NWx����`��pC>��<��L�5����`�
铭$���¡=픀�$�n��� {:_h�t�̢�:��
+8+�Ex𩁶FZ5動ȁ\�q�K�9�TAE+>�_�q�E���c��@�����ʊ3���q���b��,��X�-�k������md�'�0|s�o��,�}A�` cÌh
v�M�{0�8��
�p��J�)ha(A �s�(�wp`���O�~3�!�b�Q&�vI�
+��魱�6��t
�ٸla;��)?��
#��
oA�l���H��$

�3�H�S������53vT_�����T��i6�K�Tْ��f�60��>2xF�A>f��u /��\A��Y��ܥ4(�7
eA��7��@��*k��/@^��A^��@��[O��)_i!� 2
�����Vb t�,�	{BZ3�@tz%ў�@ZEU�./^d�_a�`qp����b�f��ӎ�q�qw,oQ��u"�c$��m=�sC`F��z]�G�x8�E�m�yE�`�}��-��p����٬��*L<����Y�nm��h��>c��uӃ��Ѓ	TꊚF�
�>�4ᆍn�߀���
@߅L'$�!�-��O���P�v������e#
&�qt�
�.V
ro,x��v7Z��
u,f�[Z��X����%I;gS�E�1��_
+g)�pv6���
�4D�a6Q t��Ol�2
ѷ��'8����ě�,-)�%�@E��@�;ȴ�YK]U�a�
�h1����Fi���q�(u�aN��B�#Cb6=/��
.:}յm0�
Vu ���
8	L{2�X�zL4����H�ԭ��(�Ǹ�֘���M�Z��E���4���F�� *�G�
b����
B��

g4�ZJ���5�8�`��b"#��1���F�A�>���3v�	;�x�kh2��{:w�L�u r�Nӑ�Cl5lk/l�������R+�
BZ�� ��\��A
���D#��%{�
㈢�h�8/�l����(�Ϡv=}�f���1����-KlӉV?�Հ��'�"=@��
+ٳ����L
&�CG�Fέ&Ԏ{�e2�
�h��Z
:���O�����AK|�e
&M
� �ׁ7eʨ)l����
��
VĉW��L�������3��m�/��^o
����cvjw����p��f����
��t�8o��f'�Ok	f��]atI}���@
ëPz�ۅ�7
�x�k�O���L*�E������5���Gك20�cO}���v��R1[C�6�y�v5��
�
4�OqK�ˆ�3��M"���)	A�
UW:d��
V
eV6R	���t�5�y���<��:P竄���	Q�7�ƛ�	*	j����@��Ǟ����4����1�e�a��Q8_<��<���|+x�3F$�8�N{�&O�r
G
R8�h��
�ˑ�۸P`f
���a 
՘5�Gq3��i������z6A���
�
n���Љ���fW6�l��Fl�]
�M��5�e��)�Ií/0�B��������+�K� ��h|�!��!��:^�kF&L2���4G����QÝ���X'�_l��g��
�18< ��^��j˄�<.�M��:�e���F�'�@
w�y3�!���E��T�Fqb
�C`��Z�gԺ
�!��Ę䙩֪ Y
W��李bj됮�&�������g��pD�L�_�CNf��~%�S:%�V�ɞh/{e�Y��dŒ�},�vJk����PQt�J�'��� Ok��M��$�3N�
+���
���35�!jc#E
?��� �BS��$�IH8�%��v�X����c1���faq
����
:<���g8���Afb4�Nُpc�3'����2���a�����e0���X� ?����w�
	��f �6��
[�2��,=����9��DJ��)C
�
�D��(�2��D��<���6h\R��'��ٚ��"	1A
|�6H��0�30�.��ʄ��YX=�I�7
�6h�)gh�4����kcq�, at A�BE(����b=R
)'C���W"D�L�)ث��6�g�POܪL̉�SL�Qi
���O��g��o3
x��9�D]�4��H6�ڠ.0�J$�gt�occ�glf
+d
�2�ڔ/q�
���֗�@�c��%�2�ʉ��O�Ũ�i��T�H�N�S�q�`�	F �e�e�v{X�*�$����
N�@��,&�Da���P�v�!�J�=&�4�Bܥ��

Dfg���=
e,mG�p햂�7&N��OڛJv
 <1	 ��r�շ�
��E�������?=�����"�ñ��rL*�(��&M�gE��;Zӱ�6��Ǫ-U{rծT��#�{�F.�A��[Q^�&{RNo�政\���do�Y�W�Z���W!Mɡ"
+j�c���
-ɧ j	�C'j�/ֲ[�kԢ_Ez(��E�0Dř(8S"S
+ Ra,M���`S�3����&�S1;
+G�(��<UH��g����{U����ת���.qO
+��h���B��
����.����:��S��
+/S��>����*u�D�)E��k���;��������ЛgUj�
+6T{����U���K
!�l:Ҳe�Hљ����8��Dŀ6M0*�T�rT�2���+#��tU6($��X*ƶiS!�ʚ��{�EN	�,{*Ƹ����bPT!�-s�
+�.�LB���%�iD����-��w+3�
+
+oY�UDy1%�!����W&l��
�*`^�U�}�����I_E�o��h:��SBe&(džJlh:HT^���܊�5�s4Z.��X�Y"-��*W���蘣
d�U�&�*Yb&���^��:e ��>������'�b�}�ʁ�Ӑ:o,
7��#�Yi!2��hw�`H��!���\�83�U�u�dj�bZ$ ��-0U�q��P�1�uhkab���)�f
+�1>�Lﵿ4�a�9�=-o��"F4U.�X��Z}U���O�}�j ���esj������-����$�y����]�D�m�H���+�,�����jo� ������S���)Km�x52M�Qmó�8/��[a���֛�} ј�?9[j���#��T���E
�2Jc�!)��ԳJ�>C�
A�'Py���0ϔ��@_�2�ud�
+=�+Z]N�F2
Rz�Hօz�8�ک����[��h�
����;b!fŃ �ߙ�rd�u����ƀ]4�\L�Ò�C��E�n���.Nl�$	_٥6ѰWQۗ+1zJ��ѫG����� �h=W�Q���b<ڜE�=��������7`20�T,9�3�T耦A� ��V�R�]�)6a�%:Z����׸O=��]
[���5�n���$�—�J��K�B+�b/��&0�G<���t�V�$Tf��ga���,��;
�1d�i�O�� }fv������~�zk둴X��u5�5�Z�C��j��4h����/��I�E]sg��ol*����^Z���jyNMo��^6�>y
�4�SI2�-���0P���U���92we�b�������1[9 qX��|)F�@E��

�
��
R�@��z?�5M�P^d*D�
��H�
#�I�03����"Ѳ�a`YCGy�
+��INk&�.�Қ8�((����ź�8k��8���3 �5
��B�=c�؈�YE@��N	)rz�c��z����>� �LM�fH5Y�#Y�
����և
�Ū+�Kj}z�I1.
+���1�'(���6+����4��TB����3�+�5�kB8����`����0查=DuN&VW΂�{�vģ6
+'�X��5E�H
�)�گ�H���t��и`C�)�_!�hj� ��2�
�Ŵf��=Z�<T�!�f��(���LTY[�³�D� x$�ZT�}��Q�_!@|�-Ijj��q{> �D���c.p���R�8�o���w����)�JkO�5�֮w��ՕCZ:
��z��Cm�y�p��^�tQq*���A)`d�����xI=�h��[�TS�ű��
�=ѷ�A2���n�VS��a^Y5\B���B���1�%��a���3��[��Q�:��,Ց��$��GԳ�e��)1d�U����w[.�7@��0�Mw��{�bQ��b9�z3L��B�m�^���3�EmC�0��G�j�O'X G~����Ē="�+n���f�?ր+Q�5�Z.����I6_N1�zl�a�i)l~=�Z8�K�L��ZP��@
����Ь)R
ߦB��x�?���
tk�jXR����"k�
+,���ᇮ]n�em���O)(D��c�q,,Eb�������#t��1���

KG
=� m���Ϊ���m��[�f3ѭ�7z��l�� 
��<XW�M���#���5�Rp��gm@˒��
������䊴
+���B�V��K���	��LP
:*�I	4�BI��7�O�&:D�Xz��
XU��22^'HM2�d�9Vbt��+�O�b��d�!KZ�oƙ~��^1j3��I��\2��@����*��\Ί��<��%a��_cL+�v�Dk6K��(��\1�B"xkB`X0�����Qj�����p���L
N
+�#�?};���@�,���@�
���T��F,:W
+;u�I,�'�*�"$啗XM�1�D�Rґy d��̤-��c`.V{(��y��������x�PG+�>j̣�e#H��[��,E"�Y��+)5G{�X�t��<��r=��#��S�dε�&�9��
�
g���aޤ��$5�'i�bf(��JH9���j,���<�����^0�#}��$�ּ�P�	��sAv�U��z�(��&��īw�
+�4�R&��j�J��/�0�xwZ_-��0=�y,M(��>P�Dg:���-�2�7 �0�1��燑B��
B
d��a��%Y��j�����Ɍ���
��
����Z����j)Ǔ�إ�&L���X� �Їq~�����q���@��шu+@;���|ʊ��>o�3�f��Uh�S���� X�E[37t�A)��
b'4ħ�<s��D!�LJ"�ڈ�XN�:!�7? ���������$o0H)� ��bZq��c@hɴ"dK�tN}��d��nh��2�bR���E8
��d�����<ޱX��A
�^e1=`z�L8+LI_ާ��D
���F4d��2q��8��
�i}X&�!P�

�
�ԥ�"�a/�Ό.[O>�)�b���tL~�TÄũ�����
�=�M2b�0�<D�H2U�Ȃ�
���=�2!����Œ���۸(��
��HL�~0�?���C����
�X���ש�
�%�{��x��\R�p�ƃ�"�R-�*�C˘(��S�'uln��Oɒ�%�fJ�a�ؠ'���,.�T�ْ%(�E���`fM�=�G
2�\�:�8D�j.9�K@�v���ԛT�K���c�9����ۨ�yUs��S������[t��xM�
	P�Zn��-�Q���w���������W�18�%@Y�s�*�
D��bת�MH��2�Z$c���M˧*�r�4, ����s��5�O�#�F��_��e��A�.��$.�u���Qn��&�_���qk��5
��aTR�t�kyf��m���j�£Y�:���ا)ɺ�zmYG=�v�kӓe3�i�y�*wm�O�u�k��-�� r�]��2���$` (]��F�c���uu�k��
�"�o#*
c�%@�.r�����/�a
�Q"��悡��*ל=j���m��5����Hr��\[�����RĹlU��>3��QHA�����N,��(v���{�B�xU�'�g��53��c�M�zmi6��z��j�=�y���Z͖��i�
,.�΀�A2��.e��(�ݖ�3Ffb�+� Ȱ2�\9Ь�2��i���g��c�F���3+rb<�Ds��זK��P1��׬э�W���
)}{
��Խ
$B8�e�jp�<��B��8�\�cvly�_C-�D���5�3I��@x�ҷ��,�UBz�0���e��!�	�n`#y&f۷� )�ebl[�
l�<"R��?��
s�$Z�3-��w��FRLc%���F�8-A�O
�64iZ2J'�.G������6�p�����:���
U�Q�ѳ�`c��`�09�
=u
�1Xwb�����V
+����ij�-R�����T,�4�V-l��&SOn�ja#�W�:ǡ2��na#9J�6JH[3���
����l��J���P��	��u�(9�<��8����:
+���OO+�����5
>���c
S��6�*��)���5.�T,�$I[U��T��ь�U���81'z��x�_
�ŁFu��+�
0�$IQ���>tb��tqy�T�����O
�`[#����}j
�
���yOl�mڎ
��
��g01�VR
+D�z2ʟ����s�4��g��$�@Y��d� 5X�R��_C�Vz�
X���`V at f�4`h6
گ!X�����Q���k�:I���6~
a�2���[��g�'��ګ��#(�J���@L�`,�f�^����rnW^ЍW�0�JV\���WC�*�I�,M���gZ
�"��k�$� �ʌi�F�5漀M�T�jPSc�	jj�ٛ���is2�Ӷ�L�rȳ
Ltګ�lИ�=�&*��x|k�d���|�O�i$|�
�6��MA�>�gc/.�|�a�5���
i��̆h�g
̳��d��c<
+F�P�1�ʧx3�?4�n�3#��?�����V���"�b~�+��
��C��
+"�S�=��A´������`��\\$��a'`��/�=�RmJV��A����r,3(���a.�I)N�3�G+#���3�U��&�cb+�0�d�2�d[�\v?L~Sܓ�K
+ �������"��ܥ+��
�&C&Q�
�Rn�U7�Tš�z,�˚
+ģq�f��T�U-TAw#M$��e��d�@�>up4s�U���mh%c��L�H�n�6@�W-�]K��I���
��@K�߶����H)��Z�r�Y�/5�����0�SO 3:1e�U�Vp��
n=̥q��Hu�[1.�a�\�27�»D���U�!5-�r�}��(��M��'X:�v-`%SK)a�ˤ�AfѥT���65+�S���|z+��'�BDŽ	��`2�N)�,H����t�
֪�L�
�|'�Vcjs)�L�'=K�/��.��&,A ���� 4't	0�R
��C��3i9יV_��R�/�n�n���q���Y'D�_`1�aS
[�0'�"
���������#���.�]>+U�E[�9� �(u��j|6��#����9ui��2�.
aX4aP
%��#-)�L�Aw!WX�aU�\
+5лǦ����s=t*A����JR��N
+KDd%@u�F
�R>��7�X��>�˱��ݶ��
+QG�D��T�
/oN+:ߜi���<Stْ�,bS~��B	�3(Θ�h=Y�认p�[�ro�^j�Qt���"/�"&zz �RP�LVT:�_ϭYJ�S'���I�eeօ�)�~W�-�b�Gi�(}��%������L�/,`�٦t.�|��)3�W�5k�X��b+bL��6�
��b8Ƚ�B�:Y���S�'p[Rt�[-��X��4��^�𑒡�G�,�ZZ:�����zM�} �X�nN���R����Y:�ƥ5�@�
��؏�&⻐m-=c���C�
�~HhQ:a��!�
�n�v�����a��S�(]7
��
�
���͗�t�b�(}Ԙ @6�=d��&QE-?�����L~�2n��y�|���WmGD���E��Pr��-��&F8�$�3�8l�q91��Qd�cK��!!)�mW��f-�����sS��%�'5�I���ܙ|�r�z_�e�U�K)�c�2
��vAJ���oީ�r
	0�d���I
"�
�i���Ƙ��|�]7B���@�a��
G�/�4����kh�2�z%Y>G��
+�Օ�g��|A�%_9�
��	l���!1܌��x3⫅0yV�
�ɰY�k2ݧ
+I�&a�g990��͛�U���c
!�z'2-���e׊Ԝ��M
�3֬ i�
�`�
~1� ����w����>�i˟�V\9)-
f^�6�nZ�J�Ms�;���ܵ4�&�~\��u庘J�/L㴰�Ћ�ٶKs4��7:���QR�!��eЮ���
+R�h����Ӹ����|���)(�~.)a^�-�=i�o��yӆ�Z�اSѢ�
�aN��-@ںM���,$�5!��Z�@
y���#Xe5	'q�=/c3JB|��:.��Z��ÍR?�TbV ��\EpNƏ�
+��
��������i쐻A/` �
Fr�
�d���G��*|��wZ��~�ƴ��3f�
���&s�f�̺B#������[�m���`�0���*�]о;J�
+��"@mu��d}fQ:-gm�i�B+==�a�?z��w���m�"����Y���ӽE~M3�
1�L���x�#�6�2�ɰ�S�53�t��-��@���j
�>��	NR����ڥH��2�
Di��	��YIe�~�3+�QJSڍ�
�Q�37M���ۥW�KL`�{{ZV�>Jg�������+��`�n��+v��mcG�]�lP:�X��JEp�4��u,:6Vzۥ�e6��N+�4ŖdG\����S�ֽ��b͑1D�m�7!�+�!
B�S���]f��&�����jv��ܰt"a7w���$|�Y��0d�Qod�P�#�J���X;�T:���Ҍ�F"#kB���?����
ib�hu%џ$
�*"�o���J3�r?���E�����U=�y��Fyjt{�2�u�y��<��
iyu�L
��G�nTᤙ��K�N[��f2W���~�U���i��;Mլ*[R���۷Y,k�(��*�@��|�Y�+�U��"UL,�M���tղ��2g�K6 [...]
+Ǩ��
+���3pjTpK�THM�T@�Y�R���}*��Jk6�h��l�U��,���E���F
+WK��k��Z%S�Yu�բo���JKiVUJ��"��#U�6�T�2�E�REp�����V�]�g��
K�^�M6{V(e�T�J��0���f}�
�E����� g��]D9��K�夣��Y�oWxN��n/QL��t6'l
+Rg���b]
u�يѪ�=�<r���4R��Vv�f�oe�Q�Ë!G
/V�V��l R�΋!IIW�f�ue�REۋ���yW��f��bQS5�
�.S_�Z��񯮘�͆U����جү앪ȿ2u�� �@�l*�̫�9�6��
��F	��z�ʠ�c�*Ct����c��(�zuFsD�,53��^�nm�?�J��`^��͠ɣvQ��Ly8jb�]#��k�Js��n��j��޼�?���+o��9j��5��Ͳjϗb}�i����X���)���}��a[TԎE%q�'2K(�l�5���Ţ���Uy[�bxv��2[9s��W��&XP�d5����nB��V�H9�3��
�Mإ��
+�)Ay*.��BE���Eh��P�
��Q
+#� ��V
+���

��؏��P��h�#�h%�|��qʗ��Tǽh%��i+kuЍV��p�����;�Y��Z�i�Rj��u���O

��zf�4�QZ�Q������:,�mר�ʴ}�H�&�:�mm��1pʬ���i(��5
J*BO٣��>e���-;�
+0��i*2���T<c�h��!��O�O*�`
}ٴ,֡��.��>�ISŌ�
�*�XQKd�2��x֕�V�*����U&a~�4(��]e�V��ł�
�vo}ym5/���ή���fz���:��v� ��ZJ`^�#�����BK`���F#rV��=3Sl�?b��+3��)6ZCX�*J:��ӎK#+Q0��n��[���Re`9�i�^!��p<^dJ�P"�J��
qB�
U ���*��	�۽�
����z^
+W(����4;�,�"C6I2�- �k��~N��_���a
[�[�S�j�8�3����O��-�"�������j��
�5�'��$����l�v�遌Jl,���;�Q���
�z����BWg����u�u.�Id�F��;M"�>�܉����t7h��I���IB��ÖD��U5{�uE|=�Ve}=!�>jR�*�G�dY at Iɭ蚝�/��
��Z6�ϛ
�_�ڙ��c�o<W��h��Ϫ�,P�
V�`���5�wl5| �
Q�y6�n�'O�~�#�r�>
��Ӷ���juۏȦ�
���;c��q ���hA57L��
c�鿩�5�\7i(�WmW�K�����_΃��H=S5��4�j �,��v
+�u��Jk��>������Y�� ��3A�U������y��sd�
+=Қ0�m�ZB�u�n�P���A��0�F�t��ڞ ط��S�6�S�r[�V;�w�U!��8�z��fMT(���T*	{H��RQ���(^�ºp}R捻�
�Hc=ຐ>�$%�
 ����Iug����)׮�����խ ��Se<<ۅF;�=�.4u#&�V[��tujR]
�m?5��
4��+�,�
+2�bt��
+�1��b�ֻ�
�6%�,��-5
=��acb�f3=YM/�%dZXe�
����j,�n�<0h���o��V�9�*ӑv
rWߠ�aH��V���[�i���T'h�̡T�c�K�:�m�������86�n=�&�}��Άqh0)�sqx��AL���F�Z�D?~U����z�V%w=��"������^��
+��.r_H�.�_�Q�Ⱦl]�_Qs]�_m�u� ��Jk��zS��(�Pz#(�R�)(��j����|Q���(v�|KŖ�h3G�����IUbD��EjY�HkR���ƔxU�Y�s���pW�D���`�V��b�
+�����q
)��C�����q�9
��פ�X,6
+�
+s�dU�V�a,u�iT�2
�Ji8U��Tl�����Hl#P�eMxUو�et�d)�Cg=.�ߖ^�
+�^�8k�5�^��e
K�gF(��caJ�tn���5bb;��-6M�D
+n�
mT���pU�ڐT���/�u���}A���p���8 ���
Ɛ� }]�9��_d&��N�I�
vH���
��s��D-�5�7VL��E9ᘍ�v,Lrp`�Ñr׆�At��
 �F�kq�M��\�-�w�>�Dy�mK��EU�_��\�
@�찞��|��˺�^�V%e��UAfM
+uMgMQ��К0�Ӛ��:�zo��]�-�oSoR�*�^o)35#��ԓ�8Ssm
+cSK�x���[�T�x��V��k�?&
��X�Z�>�
�c�_o�Tu�3P�e���W
���z),
��:s�3�X=؊_&'��A
H01�����Ĩ�H
+�&���
A�qy�h��J��42��6Z�t��Z8BEN��4���#snb�z1v��1��,z�z���n��b�G�'���C[�?�#ȗ'y֋
=�e).����
u���A}#�<[ˉ�'�
A��|&NM`
�jĂd b<�aC�IK]3�g�J�J�&�1�4���h�����!�6u���F� ���Ƌ�'�<Iu�}<X�3� ��
$Q�R �3�����s�}\� �=l�T{�6%��i
��-��0�w�xr���E]��7(2bb8�Ș)�8Hb���=c���
~lv�y�������d9N���Ckv�����
Ze5��Q:EƘ��G����
�ɆX:��hu����F�12�����^
I�B!:�W��~��������s���'��
���= 3-6�%M
�0�ײ��M2
��~�A����e�&F���
	
l�~�Ȓ���A�hd�{��X
+a��1����T؂BT��R��'+OfN�L�3$͛
��k�{�ԋ�0�}�
�
�6̽�]L�򶬼�J��	ccH ��E
̐wRC�wr���xa�8y��(}�?k
�-�Gg���&U�e'�f�N
#SlFmswAܟ1��!3��4#�pL�t�5A����
=��
��x
��3\f�S��� �!@�RO���p��
�:̀2� C���}�*A
+�B��Z��8ݱ�d�
h|��®����b�e�w�C�����xNHC+�����Ҝ#m�6��4�coBZC'6!�AjR)�B��:��qsu�\
�

��I�,�D[�P&�qE
7�"�,9G�&
/�	
1<k$�R���S
��De��(1O
����)T�X�ڳ�7�`d�-�%
+��ǖ` 5��Ӯ,K
s���8��:��=c�<��
L$��ߘ��Jر��"���c�-K0X�$#���Ϭ�5
�`�7Ï����CgXNd�:�iآ��� �إ�),����6�B�,�J�������cq4�+��
��n���,��â�!��v1�#F���X���p����T��Z1P��H�[����M��e�	QB	b�b�~�Rw���c.8
�N���*�Qլep�8&]�E�=C�� V��N��EG6j�a���L��3��k��P6��D�?���	��a��ޞ�[�O��(��Pߤ-���"��'� 
*m��Q��3M^d���c�֐�G���������bZ��Y1�2.-�_4�����4�W�f1TvC�s$�
��V14�C�
C`U�ڒYG�2��+1��^J�Z��� NL�
�Ô��Ϭ[�1�wd�ˤ��s��
Ԃ,�F�Zr;�K0�N�b�c,0��
����R�J��g����
�����|l�$jo�%X�ԓy`�eN��|"ơsϲ�%c���l���n
lՑ�'YpVgQ>��9,~/��K]�_T��H\�%4�������ՠE�����{�m�p��8��>�Ӳ
[ш��'�+V�Q���$�:
iQF�K�� �m����{�ӧlI��?
,Co�wHu��bd:Ci�<�/!����cz X��ȗ 
���
�(ђ눯��SX�˸@?'�m��w`��-�N���~
�~��tnH50����{<�$�l !7lȕ:Z{ZF�l8ٌl
bJ�����ۘ�b+���`�pZ�p�17c��6��eؤ�
+)_�@<����b{hng�(B�.1-�3�8��2
+
�/�H��8b��P��+�8��4h��@���Ro;Ǥ#�-�20�
+��U�I�7L
�Ǿ����Yx�� B��Y�AT�T���U���5��<�R(�Ǽ�Yخ"Y�Y�0c�'�0h4c�1��R�p�3G#�	D
�e����}�<��4H��X�
;���	�#��0il�Q�onrp��I�;�`&wA��F�$K�0�B�(l�1K�+.�Wq��֯8�g;B[7�P��={Z�~��ܚL�
J�(fz0’�Ep�g�%�q��$��@Yb{u�'Ṁd�k.�3I25�˶a�8J�F�ٔQ:���0��ڔ�F��
�r���
Ys��ۜRI
+����\�ٮ,�E
q��
J�h%,+�4wMX@�y/�9L��̡j=�]b(��cY�@����8	���V,�L[
+R�[�<-�|� �Q�`a��ρ<f���
_j�Q��w��
�(�i`���+9P�����4�*C����R�6(MVP�آ�Y�
6@��(�Q�R�u"��?F
E�^����)
+s�K�id��&e�M�Ü#���]pFL�&K�2
Y��
q�Y:]�u���8���
�d�0.��/鐲b]M�^ ;�MqL
@�g�Pn.�%9O¢0O@
+�9yQ��0NHQP��N�D���A��j$�\)1�
Na��u(f��=]f�����
�v�ף���1�8��.C�
߀*#����T�S�̰N�_��-�<M���4�G��#
C�N��}~=�z�-$��)t,bȔ��^��v&����&H��^�@D'tF¤EY���3���`
��H�"1�2,�"9
(ȴ2Th��9�t�Iy�B�Q{d�,)t�R�!��>w��#�I�c�*eS/�˦��x��$]9Z͝LV��4��(1 dKf��ԗKs1�1��	J!pL��2��b�,���Z��]p5;�q<��R2&ۑ�9�B�U�MR�
ܔQ��k?@ݰ�f[���.�沾&ay跁6x�N�R�)z�r&��WQg���Ϫ��=h�a«PE
���U<m b�i.S��P�Mksּ'X��V����kR���W���
� Nϖ�rQo�����=3�mh�	yP��Ač��ճ4qђ�ڴ��v�S
+EHlW�=
Y?b�242�S�
+:t�}��b��3#[�6�f[ޥl�m�QD����hb醀�
A�P/-�h�#�r�͊i0L����I�K��C��I�mb$�
H�ZM	"�%)r��µ�D�Q�[
��ej��f|Ǟ0zz�pԦT�;�.i�P����I3��k��ُ
�1i\�z[�����"&��d�& �ȁ��5��;�5źc:�Y<����L�)h�C�')g0F`��V�Ml��j}�>VZ,��52h�8��0�9��H��1)Ȱh]Q���
G�U���2�EYǬ�ҞF��ͱEU��a��S��Dq!ّ4��Q�l���TA,�֫���䍝���XK�~�R`"S��4h�!�:�Q3?��up�E�O��h\Cw�
S�#S����)f��O� �T�<��,�B�@�<+a��B��6mk����h���Z�����/tي�P:)9~r��eNjjh�
��4'K���V�IbG<������j=���i(t�H;8e
�1t�>�@:l����x�A����"��C��oX7
Г�{qn
��@W�� >��YY[hP�-�٬y��4�5�It,�������s#&0=�j����ז'��
��Qۀ�)�B�=@��2���LǕ��3,��3w���]��i7Җ<�kL7�@�_[�W��=
N���>���I��@ӹ�������Ņnh[C=c�����6UϺ
\))fG�2�c
C�Y�
+�T�oXs
�&�ߜu{y at e
�=���Nk�|lؓ)�yc~�b�[���ihA�ڣ2aS(�P
��i+x�DaL�(��1�>A(;��c$=@���K�Z~�P���<
zj��PL$X�Ϟޔ[�7
�����ʼnV?2�m�-W��Kr�P�C�rrF��
(�{vah�_8�
x��7�u����
m��}j^
a
�M�n�HJ�
�O2˙1�y9򳧜��3	Y��_���;g�ar�+�c�[��{�|c�/�n'�� �Y˄_Zb\��dEsL�� � o`�u�։�
�X:zH�	��H�#�}L������	��>֦-�S
����l�6��dL��
�uDT,B͘Jd�
ՙ�e
+nf<�X���IBnx�Dxf(��
oB��2�� �T���XD�"�em8.)��ҷ
1s!Վc�4˸�A�)�X����±	%��HD
�%�z	@L�@�G<��a{s;�.1�ĩ
ғ�"zLq��)/�S2�I��L�ZMmj��0DU��z�����6��j�W������Vz���‘���&0�Xj�������S��"\ǎ�M8����5�;� #
D	�{Y��z�8���Ȣ�#�[��K�!0:��7����y+D�yo�=���,Bw�� ���X����g��O�qD�l(����cdȐ}�Y
PsO>`
Lӱ�)h�� �m��hE#��j:�R�mG)��Ƿ���������G���VK�:+����F�Cd�_�~U��q�r��0x7k�!蘋n�Zӧarl�F�:�a�#�9Z��v�
��HMa�J�;�O����p�@��$Rh�I�w ?:��e��"<���q�H�ݑU�hd��p�@��m���jH��f']�/�*a0
X27��F#8��`�5�T,��ܓ�Ё{҈*[�I�
H��K��:�R�봶16*�҄ie;惄5j4�z&A0|�!�������ы�+G�(hNN(�!�#b��=��f�T
)�&p�L]�,��
�g9~g�n8)�m
+��K(t��8V��R����}C�����1AZ}�֠d���9�ĉ;��9��9�C��6��x�5��V��J.-�}��W_��S��V
u4�`�)�(�W�Q�Π~��*Y��y�7:8���;?%"Pz�����ڒ�lg�d�,��]0��ܭL)�n
�|T&	�}� yf�6l�[	'�,cW���@B�L#6����NYx�{ �<m�q,o�>�3�"?�6�8O�"W[�
jbP
+kG��N�91$M�'���˿�^9��0�-'3��O�'y�Q	ʩ�i�
;'�2�"v�">�>�
��Ym�s,9�\�̫�o\[y�H.��%�PVFЦ�>�Όtm�t#�W3:��:��Ɉ*1�@��R�@M�J�(�+ϐ:�
q�;]m�u�
 ��S&`�tb�V�"wʒ
�@J)�QشY��i��X�D���ۮ�
�_���E� P��!�L� ld�f�y�M�1aA$)�
?��.�y���N��{eߗy�f���)��@Cd�N �E��\y%��h�U���<s@�ڻ���g%���=$�vL�!Up�jG��
+�
ĶR��T�"�Ũ�<�N�|

�	,�h[���r㳣
���?�x���Y�"����|�^,7L������;�,ו��
���������-Â�!�`�yL�n�����7f�Z1�X�Ԗ���bsW��kD�ۘc�����jX��p
���ӌo�jv|�-��Q��P�k��\��\K�=s�����^wyo)6(,��׺"o^�]��tky���
+�Kq�R��n'��f-���Ey
+�R�͈#
NM^"�;aF�O��|"jL��/ONm-
�=�+��m>�R��	e�p+q����j��||�k�����~� #�g�
>�Ο�X�o"
´
����8���V�FX���Ί~���!`O��0,�=*@a֝.�i�f9�8ۭ6 y–
@@�f0Do,D@ �PL�F4���TU����m xm�v ���f�0k[G$`߂Cs��/Pwo<���
~X��_.��>a�!��0�4  �{��I���
��ou�
�3��7(�v��t'@j�7�5�,��}�v
�:7Daq�.���֨���rE)o��g�snP�
F���ͨ%<���/�m~ ���YV,{�UDL�&��x��.	@��r	��m�&4�P�-X�H�ք]*t6�ɬ�
�a��b�M
�!+>Bf/6��2���$$C�ʚ�
-0�Lgh�	�Ѕs�Z�ޝ]~vm���ݻQh���mJ94)������ۡ]j�$mW!�
��<}��ڦ�C�X(���Pp�k��E<Ϭ{���P2	�w��Kh�
�����|b/�t4n��j��+fK	Jϊ?ͳV-������
�dղ�ŰA�w
K�����f��'|4s�;��P�;��P۰ۡ�r[ݳ
��
+����X"��I�_��jaro����T+�U�뀇E7'=��JU�W�"�(�ʽ�Q!ڣ����z(�W"5����
+�n�
���V�y�*r���
�d-h޾��0
��Z`WM�>k�~��k�?N�
d ̶y&l@/�y����
+��+oE_|�
̃�
��M��l�z��B=�u2�v �ya�f!���PO�k�SFY��M]7��F':���'̭�(�(�{��<$a]ё��0�`[v��u0���Hz�ӟ�eR%5�7w���ٺ>\8O|AלE��
��~�<?����[|@P'�Z���s��0�܌2ԮMR�&� ���poF
�Ti�/��dv�
���r8����;	�4�@:�V�}����-\C#�?aDq�i��u��e�I{�6
��d<�#��r���%�x��%�{��c|~�x��e�*�����y����1�-'��z�k�Y:�냼xg��d��Ɖ^
<ea��蟚�9�`\?�]}:� ��;��x_�����fK���*��eھ�uU-ӎ>�`��
�ʧ�D��$/ ]&�0v#.�t��6?_�����~?��mP�p��In���0���QH�}n� �L��Qa����	���Y�K
���k��
��Lf�H}��rF��K�Pv
q�ra�m�]����N2.z(�]��l�gZnH+x�iRI��
-���d���^
�,�鱭�.�#
c���l*�`8w^��]8��<Yq��R!�ؔUHI�4��ʩb�O��FŞ��C�&���<�1r�c}X�vj"/@<Z�:�k&򖅥�Ae;�iD��p8�l
��gC���g��p�b�'h>Q�
����W���^��o1�	�.�T�]�8�,M�79IE��
+^���$U�K�Ae�
4s�5��.
	
�NU_��
+��r,ٯ�,|E����')������G�Ì�_���#�df[�@l�1�I�3��>���=�,�?^g�����-
�bv�%h����m
g�wfa?'yU�UM��:���
՟�7
m������cU�c1���9dijX�2|<�n

H#�A�H����n�o�x�Tv��lG8����{!Krb��� r|?���M��A'�?��"�Д X�"fx����؅7�3J3��A��%N�3$�l���|��51*	�6��~H�HtܑhQ�A�ɐ5����d�� �D�d�+� ,,U��n���:)4���H�2�Z�*�":
=�,�=ԧ���/aۨd'� �D
?l?@��:�5G�ګ�}��6�Y6�x+�~�}���Ǐ���n;�}�ь,�/Z�u
+D���A�0�31�e2G������
*��R���[��SYw�/�v>�؝��% �;m�
�HaZ�|	_!e��&�h,���%��ܤYg�I�$�]_�ȣq�<m��t�N�&y�Sa
��
+(b���ڱЬk��Qg:��B�8���
'�e �ߣ�;�ۯSBB�0�/x�&�.�o�I����_i�C�="�S�.1�og܊�<�r��Y��T��%J���:����hi����J�N����Hn�(_
��@3���#ܢ}�^5�$g�Y��Nۿl���d ���RG�P�tw���x���~�1��dG!�
��RWt*����+�&WJ���%j��I$�
l�!���L�����)� �=*oYh
+N��TQ 5)����
D�W�S<�:m6�D4#�C��U=
�ֵ�4н�B�
	?h��A�a�2�cթҷ#�
��|��1U�0
st�l8�8��1;�x�' '��z�1��6#����
�D'��y���U�폾���eP�I�q��b�-Q�rh���7�\�Ԇ�~�6�
+���<Ěi=9�e���V,����#���~%�.���
����d��Yz-�0(N�
�6
����;K�
+ȕ}b؋!����ϙ$[Y(��M3�i��t�4̀�/�s�y���Haj���<���$]�&��3A�PZ�G}M~��3ٕ*t۸@d��bW:�
+mћKd��?���wσ!��ؖ�|*�
:7@ {�gu�#1����k��e�*�*��!�	�Ȋ�����y�&UV�H
���x�>u���q���z�H�
f��=KUO����Q�m*����[ǝ�j�Š="Y�cI>���*䤫��#��0�����;u�ʥf
3; ���ҙ�{�P�p�cp�A��3U�7gJ�-{������"�I��u�G
�� �o~���1�����Y�|��n���7���Ξ��c�UJ�ƶP��7g�;Jo�x���!Ui
�8v���!���:�W�$Y�Ҷ�� @�`*z!&�����hc`s����4��h����i�v9��y'uNZ'pU����
44�qe���392U)��I��7B�R��"9��Y^��	�LN�F���B%	�&�t�7|a
��e�����Ir���rm3�@P*���T����4W�]ذ��
�����t�'���GXd����2^y]��'Xw��&֝&��u��~���6�0?�� [...]
+D>�W|
�C𸒰b���
��H��|�:���y9Y5 at 5Hۈ�6��%��2���6%@[��M�5�R���D��/t��
����i�2�+!���aHuW@�R[�`Ot!������ �0�
��D�S�ȶБ\'VJ
P�Ur{��o�Ȑ[cK��
b˵χ�n��T��8���
1Ps]&	J%�W���i&��1�
U�f�ǁI��إI4��VT��ɒ�%�D��Ջ�I*ņ.a�4�?�_O�JQ���n��'�\��=�KlQL��K�B�IPOq��C�"�e���
� �i�����Q���
�����aVH̋<`������
�,�/�����
�W�9��Щ�FFˠ�'�r��z�šAu����	����޵��󜰱Y�i��Lo���/8@�L58g*��h{��_�8XÕf�?�	���)�e��'�U���=�`��v{�X�:q�M��hހ�U��R���M%P��\�AKޘ����
��U7&�
�&�i[[
�Z,�Xl�����΍�:���p[
+RY�t�_���%b{�%��Y
+��v���:��\�S�3nlL�y��J]�EJPjg��
KZ��Dmc�N2�C����v��6=�9ޱ]�'e�H�8v�
7�̚�'���\)��֢���
�u���u��ύ�N��\�5ʭ��K���Ceo�T��B�N� j���f	 L� ``�[��{��Q�R��͢τ<�M���G�6����פ�M�G�g�__`����,:�o�����/�F�;�k��µJ�?�K��Z���y��!E
��i��O�)g���x�R�1]_��\�����wO��>얹�ğ�]�ÄZ@:+Ձ\��]����� 	Q�39
^A+�v�>�鰤��nҠV��F
ʮTU�v�]���;N����|�
]iCg��$D���Tv��B�ro^��T{��!)���FP���'d#�o�����!��7P�T�*��(��P�
��o���2Ts}T����
И.~��n>7ڥ��Dž<�.�hˡ�-��e���,^h�Ȩuշ�P���%)�F��\Iw�(��]��dDL!l8d��.l�q�J����:I�پ�P�}�n�tZ
+>-��^;)��o����
����;��4�
ph6�t
䡫A��
�to�⤦[����]�`, �|��t-/�4E����S��ʕ��$ar�B�p�{!�0�5��Ay�.}�*-�-D*U�GrIX�v�(���;�E
����#KSo�
+XQ��YO�ںMtꭠq-�lo������R�J�o
��Nߡ��E������=�I��j^��]j{���6��h9r�p�"Ƒ�����	
'�`�@�JRS6���g?=m.�do�l17Ф�8�/�Z�O��n���S�P/���ɽ�\6A�/Z�,t�5egR�� �p�$��/z6�`��C���OM�	77x_�� �أ���t�s5�k����z�ڻ3㿝*ت@�� ��*U
�BQ\��m��	�d;���KK��b�E
n��i�8V<�IoO@
*�y~R]]ܖՅ�:�p��ׇm���@
�W"""\�����M	���#m�
���%)����
:
�B:��%?#
fl� �jĔ�JP�O�Y�p&�DO\�TA+ZAV#_
��y̛G��LCS�؞�����G ���7|��J}@-Z1�ZrܶV�q�&Q1P�c
��N�6���曑!�@.��9<�*v�m���'�^/�5��m�[��k\ih�6�\�$dN��:�� �tc��B
�a�Fm@	�8�"�.�V
7?�5��r���Z󶪁�f�
���gq���=�;i�3ҧ���`ǟϤ�Ȓ��*qh��w�
s��/yR:�R�eC�
+ ������<&Y�.j��O��4��T$D� ��ue�������[4�
��#���
��h�[��#5K�A
�T
lٙ�u�p�)�*�
5Q��R �]
ya�+_��.'/��[� ��M�t�feg�pH�BtdN�T`)(� U?\��T2Λ
E�u�c
�n
��8^��%��0�px
�=Я	�|�(�}�| ��?�o���q����K�/W�
;�$����a��cW����D>�
;'��n������^
ud�Am�s�n�@!�1��Ⱥf:@+��W�K?p��J*^��9
�D�W�
e"[#��R,+�;G-�m��G
{�gS_AE��=�t�'h]��)s-n:���̞s�#��I�V��yD/����N�[���=�i�7�`��z�@t)�����Ε4��J�|
θ
J�"Aiy�o�t^�`ԶC�}��_��V[���^@`�
�C�����ˀ��J���`�@�(�?�����
+M��{cӠ��3��Q7s?��'�
+�
����/+Q���~EX>��yu�!
Guꆨ]��.R�6�\Ԇ�!=��r2I���]�/J)!�]i�~B�e�g�q��C�I��_�lX
g��ܰ��~��m���_�پ�����D%
���W������JM�kc��<u�+)O�`{�[O��
�R�c�ԛ�<���F��λ,td �VG�{����ރ��J�
�����Q��N���<�����N���.�s8X��.�=%�
��e��n�i�����r��?|����DM�@%���O�8��-kp�9��P���	��uF7]�`���'��;�
^.���l���n�����0/�]���F�\u^G���(i`J��f [=m��DRdK@��u�5Q� ����x��p��Z
v>�:�$u2�M�a�v�p�]�zqؙ���Ή |u��1B\t����.�>�u ���ފta��7;>e8l�Z��;�.h�.�=m
vH�,���t5:(��N}U\W����
vf�Qj��-:��@I�e��?^��
�Z�m
������4w�n���W���z��a)�h�1���mA�EF%ԁ �

�i�u`�u��]˿�kc�%�̭��(\�F��u�>�}��b�w�m˿�C���A���X��>;
+��@�?��_�y��`��}�� O	��ؿ��/����=h"jX��-�w�r
s_�e��!�*hSY���k��<uS��!�q�
�y&��(�g����k�
+vT�b��{$m�l���������<���B0���	�������	��\��J0��/�ސ�i��xy�|I%�53�����[*�����7�*j��,� ���s��
+C I�yWJ�:0ί���2��?��`���� I���ց����u���-�q������C˻'�3�„ɶ�����p�l�&n���
3��@=�%��9d�'����nYؐ	�y.ظ�d��G~J��^�?�{J����
��
j�'�3�<P�uv�#����n�6����
��wx�尿3�a��� �y��ޠ�Ե>D�|ƴ����� �T���d���\�!���eBG��io�$ٟ�Z_u��2��<��Vࠁ$�;�ۍ� �u8[�ԅ�� DN�(�:�䒾��/	�,�+i!I,Ik|
7
+	p�X)B%�F#&��?]�<J�	p
��x��(��}&<��+'�$�1N�=N�Wf�
kF<��΢�7�/�4s]�jc
��z߾��T��<x�G$:
"��<x&6,@I�������pq|�������^��+�
�1� �,��!lV����_�y
�:�TbJ
/���ے88����C��^�}��i�	��g�r�~��#�'2�L�}���d�mB���޺me�`t�%�ϴ�@��ֵ�������M�Z�x��v+8�]����?�']���]���?/�|��ˀȲ�<
�S)��Z�"Nh�6�}Fʀ�Ȩ��?.��G>�S�t:�8���`�	.X��Ի�]��!�#�j�����y��%��9a��Ȋ�$���y�=E���< �[ۚ07Y=�zB�vLh�EИ��
+�Cj��v��J�>�		z���P��cn=˒� ss���	�Z���"�p��MD`�X..`��Q��*��I�9tK͐r�\�f����Ibq���f�}�Kr�z�K*�L(���W�L�\4��� �
�
3S�
�c7Q�
��h
I13���2)����ogt��$�NDU�Ёܰ���fM.�OE'}J��W3��
�
Vn�
%Xi|��G��gr��#�$�.B5Z�!�)%&ᔜ-�.��b@���[�\f���)���
�� ��s��p��c^�	D�e�|�qїUh3"�@�)
~k�ھ����W�`���\߱=��l�X�^�BGR���@�O�"��(�=��7%��M�i��.� 5KZN�K'h��+t:^ys�!byڈ���S��*9}��倧y�\B�W}~"�m����)����8���H��)��y�0j��y�_�+b�>7�@
��Aa���)�7�@70
��
+�9yM Β�@nzhL�
XdH��$·
�Y%��Xw��8�<�Q'WY�\eez�G����I����i.{)M��#V��v����l�I
�
�&�ޢ����4�M:z!���"�N6
Om��mhz�Z2�����hS=
|^qF�`X����NN��]�'wgK��h�B+|X�&��BwmO
L�W�x����%�@
+R��)�MI���
�n77����:jD	�A^S� 58.dwͷ�0
���Ю�X�M#X[���.�����������eJ��}�7�V(-���'s�p� A���R��ۙ8��%���&r����M�T2l�V�y���fD.���liKُ��5���v23�bv{ضE�
+�0�TܺXYd�a�WW�m�*
���
V���s��ݷǤ�� �(X[nC�'`�j�%U��@�=�
K�=�0���d��JR%��Ft�Ģx7��q��&��$�d�R-�K�ʦ�æo
œ�8�T?ظ�p]L8��#T{��n#'~cm�� 

.
+�W}��~
+�@wM�(�9Co�y	
���%����G�>
���(+���t�M�B
ڦ^�+Е
9N����bڄ����$���NN�0�
>@���$��hI�;��
6�o-�#ϗh�ƳJ�c��.u��
pn��(��5�2mB�fҢ6�!>��9[���K�f�����&�o�#\���}[�\�(�g$u�:�!9�����͐�]|�䓍D��\I#Ȯ�
+�|M��S��t�~B₯8�)��Z�tI�C�I Kjٵ>
I�F��a?�R�
�Z���ͭ�f»9
+x�\2���<�G��n4k
v	�A
"P�`}�4eS%�s�>�O�GRd���8X��ͼۋ�31�YP�<6?�"CRΗ��͕È퍇Q���&�7ھ�{n��6������5�(6R�
e���&j�)�z����lNh|��$l3��њ�	,LdH���
�mD/"��J���E�C���9~qm"�kou��R���D���ʀ�$��B�Z��lL���A���H�q�S�����q�ttI9l3�������g׍�2#
+�FTr�fO�
�F:���썆
����IĊ����ؿ.1\�b��/��3
���A���Ih���
-H<��B��\��n
+�������"�O�x6q�k���E	�rEߢ�6m��F�P׈� ����������!���H�)qx�xh��<�R;[���\m
+0z)W�M��J
vJ�Wt�H
�Plʢ�z���2+`%����Yg�ms��0���L\V>�f�‚�����fҰ7щD7�
��v1Ӈ�[ݧ d�ȅ�.4]�*�)�^�ظ����|�:�!k����<��k�5��A3"����E�xm��
��S�CM_ �,M�O�a�["
�?�x`��Qw���A��BT*�P�M�

�kw6�:Xm�L_ބ����ت��!�d�&��BH#�R`W��
+a�H-P�\����dDGH�%t���p
XkY��&����
B���Kg�c���vwi�Q��T����
+�ޚvlA���3l�^*�O�$���
+��R
��,<x�mz�"����U��c����."��k�
Éz��e�2f�ߺ��l�
��x=�K[Ԑ���
��
D���9�:�q�����D*g

��JE1I�����Mg�-�>K����

������eS�P�H�l�� L�-�u�
S�bP�XS�� ���^((�S�� �XX*�*5f�A�'�
�y-f��):�)��ϖ�u]@)v��^����r��J�y�ٯ)Ϣc�Pi�p~!�X���Rd�jG�~�NBls[���Yk
��S0�M}��	��7
�I4(��z(���MGpPY�`7� �kG���XQ�w
+.	DJ���*�(C����zh�k
�
�� qQ#	���Ӝ1M��%R(H\š[���7̃��ZA�4���^Urw�Ds]��bm��#س*������-�
+�����
+݅-x\�R]W��
�8cz�}z�ͷJ£F�W��ݡ����l/���J���^��Ro��<u!�ۄ ��5��,�.߈�\�~h!�V�
Bצ�m��vz�!D�����v6��yl
��
�a�-4���P.WXĻk��m>�Q�

�iT�Dl��fo���<�49t��,PP�
J��F�>���z�xCҰ���
V�>,�����3�K�ɀ+��×3z�������1<P��ag��z�x�
��󂖉�8wQe 	`����k��nOj�A�rZ�e%
ݟj�A�8.F�sh�=�尨i^!���]oo$lT��;"
+�j@��y���l�a���u ~kf-���Z��;IeHnR���zQy�P-Hd�ƽ�@7�gR�C}g�EM�()�������
G��x0��"�i�kۦ�
|\����J.:�h^FKb� '�0��5�<�hȵ�����K>�N�S�:��=3���uR	~m"����Ŏ�
-E������T�*{; ;d�\�D���꯽lO�
�*�����>���hg��)>�Ճ"T=�
2]g�e��̐�sLF��_���͡宵��n�Bn�}ˋOI�:��|>
��҈h�l`�u�nA%ycF�r����|8�bt����k��L����z�㚧\c`
h�Bl12"�o�T��{G!���,�;z�a�$	��v���C�e���<�=ð�i����
��0�#�%nܜg�P�!P�G�	}7�5kV�r�cXl�Ŭ�&��O�kXN=C���{J��>�S{���|!3 
He�:���g�Rho�
l�jw�������P��pFtJ1E�­�@���#�|J�����������a��*�o�	�im5��3�]�G��<�&�
�#x�;a#��昶�j�ʢ��q������P,�� 1�ƅ��E?4��
�q�����J=Xڐ���.I@��4�l��_�Y�R�����OLΚ��fh�Ͱ�\gLk:��鴟�g��DB*��A�P~	)Vv+����^�L-#�ȾC��Do���^@|
�AH�ي��('&��USΈ^�Aْ�fE*��4�
�5.�
����sv1� �V�^�\wK�e�V�[󎢧D���dV��S�� ��K���N}�@��
+��vD61
��J�J�4�:�Z�PC�"��Y
�z�v'棡�j*���
)NJ�%]y�<��6&>"m�T�O�MZ: �j9�V�p(�%���݉���H].�����s[,Ƈ��N�!pP�����V��
��{,%85r��2���J
�%x��k�CE�
�J��;���V�2����uS�d�6���.�^�K
/
d���2k]U�s�z�d͛�
+���,�N}5<p��>�f���`Вa��nΛu���Y����l��>
n��������7����4K
�����TY�aƭ�8iW�~�`���V<�c�4�v�TȺ�W`I�>@���-a�
+��ݭH�� ;���>a����v�B�V��K���Ч��
+ȩ���U�������w � ��޺�<� �
^L��m����� �
Y�n
�Zx;�������ow ����ep���.38��
��
���`† R��NJq݆0+B� �
�T���²8j��`8�w�
4~y
X#����y3j	�o8w��o�>�_1�1���0�mJ#����H�ϬJ���2�r;�!�N
�~�]V)�%`C;��^�f�m�+6U�I�ؘ�&�b�Ǜ4^�Y����d�$��mFrit	y��*r����mj5t��l���s�w��.
;��<r�VZsѱ�i�ӎ=Skn<�]��zh�ڦ�CX���N��B;�v��x��b��֪Gl��UOb��Z��
k%'6�*BmJ�@Ҽ�T���bV;4�:%?Lߺ�}j[�bF���|}���R��r
�DI�r[���^�+�!5*.�6�_��ǻ���~�q��!~9��Zu�]��+�����enᵚ�#��*�X�S	]I���ڔ@�)s�BG�g���<ԓ�,ݮ�ϲ�㝬��Dk����ͬ��{]���	�e-��O�V�3cW��k�ɹb�
�a�ZY1q�����~y&o~�&\i�n���D�i���FK��I:sj�(�k����u�hn�w�W�J
�%�Y���_G�"O"���aƈ��9WEv�
+���+w�#�T��pv?��Y./W,n�zfIJ�6�6�����9�F�y|���D� )�G���#��G�O[|"$��Md�"�+7���+� �P��9�Қ3�U�/ 3����:@"B?�{�
�y������� <������w�y�����Dr�ڦ�7�?�< m�x]
�z�v�L��m���ԣ4l�}q�����������k�T�s)G$�Yl6��R�.I��u��!����YF
�U=?Թ���_�&B�_�AT@�F0'ո\��
�xe
��
J(�eY��F��h����%�%��e���,�o��41(�6 L9�y8�Uj	`p�y�"���[Aα��z�6���Z����Wˤ�\p
����ݶAoEE�z�Y���P&EL�62浽>A�j�tQ�<?����o�y|��-|�
�%ؤG�yٽ�3J��d��
��+�4Y|X��p��F�KMZ�!cjħ6 O3
fzb��ꉶDҶ;
O�$�"�Y��'����ຕj�X���f��ޥ�b1���'�>;�l�:\`,9y�y��j�6?(�p@�؂���[��������_T�C��D��`>f�q�� ���y��,���LtӼb��'�27#ȃ}R�_Δ}9�[����+xo7w������,����6���7��I$����W<'�=���S�e���f���eaӑF"�����iQYb1��_5ee�&-��z�A������;���(Eɵ��O[�Rn'�����P
��;�w�ww%ʄ�c���)l�F��L}���M�wB���
�C���-��L�>��UVn�̽8CyF5GT߻EA��]�|wx6���s�^�2<�nU�^qJU5���� �;0,�!�
���f�
'�����A1�\i4�s�<�>2��ԙK����v��з�B�WJ���G�NWZ?�.Њ��Rc�f��YR�\$���]��KuK�E�{�=?8lb���<�kvp��

���)�
�
l���u�"-$L��׮]I�+
�P�� >�O�<Zo�Ѱ�W����o܄$E*�^v,ܽ��ɗJV��6��;_�y�<�;{��A�-<����w�����6(|�Պݓb5��),i�����;��"	�AXl��
v}��Nκ|�'}�k����1�����o��0=��!�
)K�R��`��5�����?"�`4NJ|��OaT�_
�re"�|â��ޑt����Ӌ��j��O����h����x��f���h�<��F3�͕�~âh�W��R��E3���,���wI�,���>�h���D3��o5)}`ԼI��f`��i:=}`�
��3��oi4=��<���N3��o�4=}��
��N3��o�4O}��\y����W�D���ԯt���>�i��-�f`�t�7K�͢������2z��,Ԁ�
6;OS�^�&�Ĉ��l�W�&61i
=joQ�b�y�"�s����f�1tT}e�Q���96����(�rF�x����
(ٜ+�S�(�J���nP{�+�>���2e_S�\�_ag\e_-Z���1�����ܛ������r˾Bz���6^6���K�}M�-�ozϠ�*
/��vS0�F�Wp	Û>�F�LY�����
���y�f��VZ�Ⱦf�oڶB�����+�B�l�'��|��m^3K7A
���ygAc罷��Kl@�c��b�Z�ai|��{#���o�5�a�@Ww���^ֆ<I��{�J�����hz��ò?�1��AͶ;��f��H�n�T@%���.�ІM4|�j�Ƃk*	6�N �m'���Vּ�/{�)
��J��b�۲������{��2�����l�R�J
=e����
�_Gn*j��,_TO\-_TO\-_PO�Z���,߭�
�TOܚ� ��\�O��\TMܙ��|�j�V��`�|�����`�4wA?qg�~�j�~�b�|���E����E��ՖE
ŝ������������ʊ;k�Wk5W{��B�J����#��[4-jx�X<�.`{y�T��VX��
��W{w�,9(,ZP7�y���~����+��^�i��`���# �SX��F`��ѓM}E^Pʯ���Aby�W���!��P�r��ym�P����{��k���NvL}�����Eiٱ�>�A_#\6�c������C,O[�1�{(��={���l6����k�Vn̶
q<��l{챑�I��ړ
�-�1�O�.n�����W�1Z��x�9*��7���{�Fm�҇
�
��b�6�M�p��۬��X��&��Bwm��pI��
��c�Uky^�|_=6jc�婔V̓�y9ZH�jc"P_���^� [...]
O�c�P��	��Q��c�$ԽIPxP
����M.��UǶ�䋌�N��G��'�����on},��#��X6Q�(�y�
����E1K��
���4�Ws�����l�9��ؔm,z����|����R {
����3<!=��;.�c��
�ޝ'�ؠ?Xs�"I� )���c� �Qg�@���	�,�s=�tK�fc�
 �S��`Ƹ�VZ
�T�0d��
@H��
��-MM]+�i�o�
^ߥ�j~Yh9��
+�թ"�t{
�^՛ pd�Dz���4/�����0�r��xqx	������
��~�4��uDT����矽	�\��F�ͩ7��dNS����'��G�zS
+��)�AMy��S	l
���c~���P��cw)&�o_;��;��sy
����������
JP�Rݿ~�%�,`ͩo>#�
��t[ny�
+v
�&
���Ό2�,ya�~�s33qE���+�z3���:�m��� J7��|
g۶�KO��
+�/���*z��Dީ}�T��29)*ω���N	����
8
+��жԹG�n�@���ګ��l�
�uv4�Gt
����,k8�4˚�t��:˒c�I{ 2�erS�s6��[���UtNd�@����6�����~�*�k�Lx�a��~���Ov�0=��fv��v��q�_��G��.gU���Iġ���t��^<��j+��`|H}�U^qCP!7�7�z[T@�
=:�W�0C��1��tb~JB�4��:�P�Ӗc
yު,�ȷ�E1���v�9�b>�ߊȋ+�7	:\�9c�=�B��MM�~!Q�P~���NT����Q
P�'٩�AӘ�9
��%� R�Rޓ�����T�5S�O�&�>��Ns��m�����<��V�Q
h{���۬l��c�1
�ȂҀ	�Ͳ~�E��]�/�I�1�j�b5���=x�B>^i����l�[��*��WvLP��6��E���u�h2��T6'R��
�U�>|i .zx'�ܶ�0�~��?�y�~��4EJ��7c|S#�w+�9G��hN���%\e;-*«&�7���U� [...]
+��A�6
�t���0&��j^
+��g7��SÒ)b�Yq�ѯx���
���|fQ��6x�F-�ֹqe�c�a'ʸ8�*����~K2	;���S�>T���˹�x�/!4 ̚�
�8
�}���
 ����)ޒU��	n����3iV��ԩ$��D�
�9�=r��7�_
�K2-���3[��՗�lef	�f���[k%��
���er�ɧ�fa�8�a���R��E��
\ x]{�0��ޅ!��k�E<]o�ܧ&v\{�J*�S��ۯxΨ�����S$O��ъJ8�RtHA'\�JMi��

+
��żjZ(��U��agu!�2YTu��N�S* ��p*��n��{��u^��{�;�.L���ÝӍ�Aݕqf��$C��V'�<<��3w�&���
�.A�\]T"�%e�K����W��$=�|vKf�V��҆�͚��@�2��2�
�#Bڠz0C͑`&�}b�� ?��'HrN�	�5�Т
+��y���CW�4I3�Rs	i�5Hi�
�DD}��U<�j��i&7�)����AR��>@-Hj=�k�8��
�NMr��nX��2{���j�^+�Y�7��[h\�s,_Md` �����'&K
!xs�!��nN�^���,��f��TH�&��`�6(����1�
gɄ��t�76-��v�u�8��
���4����ض�:l�0x�"z�wp����3
IxO���}�m�;�M{���`&��PpR���J��DZ��
o��>L�3W1W�r<f��;�-�٦J���0�HZ�R B��L6
q��BG�\S���K'1
[��'�˗���,��,�,���Y�\N
�GlȾ�Z�$kvq���_�:�zg�B�E���
�S��P�&A*���N�VH���gzf���N#C������:�o�\�PR�NV�汝:��$Աg����&;Ƥjߒ�3��ɱ�&j{����e ���(����Bم��3�!CgV��76-�*L�W�O��&���l׬�[���-~fn��uDC����Q(ң��>�ZF�
�c�M̰{��hݳm����,�
�*����'��/�=p��x�M8�&�".(bn�<ϫ�&v'�/.*b�Ή�뎥�(jhf:��V���Sd�ox��=�Ya_�|HL�<��m'Hj�dΙ�IE��P:��\���ʈ]s���S1���B�cR�5��U�I�ӽq[�yW��D��K
*��S=���
!����D�㾏��.3��+��f��j&I,.�Q�d�C�U�޼�3�..)���#G�}�j+�d�"�,�d��ݱe ���T�6� [...]
Y��>�46��B*A^��͜7� Wޢ�J�]:�H*C��n	��(�e횗�o�����
 ���@�����5+G��A�Ϧ��=J��e
+`�֝��~�=TŁ����S�G��3��
�����?CH��
����
���0�xm��TR7��::(co�PcUk�j)!˒@�bc)b��pc�կ|�hߕ��8���}�N�2�&a�7B
+�fR~rd3��{?h��j�F�k輢f��h���&s����;(6/�&e�8����Զ
�;��׆6S��-����!���-�����	��U�M�m
r=ױu�a��n��L!�B[���tk�k�aE�#і���NrU)��ȳ?�`,
U��ˆm0F�X��!������	�`@#w�&&�l
�
��������
؄�aP���Ԥ>p�N�[��5������$�Un��R��
�7;��<�mv~����N���o(tL`NJBe���#S�<�uulrt}k�U��;9�ج-�
ĹI����W�X�94b��M���� 4qeH��
sKD�HL�l��Y�I�7ɬs
+�0�M��F��YNS��r���h�=2wӍ\ܚ룏�*e�*<꼉5��I��0s���Qu�f4�ew�|ɇ�S�!R
�Tq����iv
+�$m�л�@�t�l���C
�*K�
+	4�=%M�ag�.�}�_y<�߇:�Ϙ/?�B�M���O�c�n湧|>�kc2��* �أ�����q��V�d�?9�� �\��A�
���y���$�^�;m���1/��<����y�eR~���'������JlӦ;4�
��b�׷�Z�P��	�f�'i����D�e�G�È�+��)��V�c@*�6�?��6���`��m

� �|c�� t���n�y�i]�(�W�0,cҰ���RI��u&N�$ƣ[kf�?���mu�՗�P8��0	@��}ٖa�/��!l}+ H�-�����Mф�֤���u�̇�#Ti5��W�[dܬ���pK�D���ٶ:��Uݞ�.K�OO;8
+<�
I�<Q�8��u���y��V�]�����y�ų9��z���f*��!IPU���J8���&���@�/��s��^oЅ�Q,B�g�W)
߀�@�@��� 8
\�s�C�E�u�|���Ѯ0#D~C�1/��"��_؜���؋�Ɂ��y-W�
�ܶ�'v��7�D�
�.����+�%��f�� ��J��?�+����	��P����m�{��ؽ�{�ߛ;���s
�%���<�
M�!��R�w���p
Y��
�wϚ�O$�|1q~7�xAM̸�6}D!������6�|�-��Yj�����Vc�9-�m���f�*�8(L�nOak�P������4܀
�{�:�o�AS�
�pK�PD@��f���N\G�p�ld�
b��B�/�#�
9\� \
+���	�
9�6ؚz�IO~]S���@��IZ|C�zk�%�n���N��lG����1�{�P����	�-���z쩠
��
F|��哳�9���i�b:�JBkW
AF^����w
WAk
|
��QK<��-
Y�A/��v�,&!�a�!v=��J
��B>�)�/܌ I�E��ܿ����e��'u9�
B݂Z
�8�!�dW�%ꔴ�t�C$�vHV�B����F��03V�KqG�(���di�����glv�q6d x0�ȧ�A:̃Y��p���]�B}xqP`�V��2�
b&P
�ؠ�՚z����Xo�[x�I
��>�Ȁ�ؗ;сZU
d��n����e
X�X�;�"
 ʸh �?vgaD��j
���3r�$�� c�s<NQ���p֝��*
���Mn6�IMJ%��T�r'��ޠu
+!di���o�}�C�[g�� e'�C�O�r�Ś��$��i��lL!`(p[�t+2spГ��1(ߙ�7�;hJ vB��	�CP��z�^�2��W`ϝk�K�6��*C13�\�b`,K�A�� Ok��M�
+N�΃�� E�Ji�,�.׊.gO3�K2V�䰑�� ��r�q!��r�l�Ï
+i`�B�"H����s�⮪x[(�����3l��KD
�ؒ�h0����� K2
}�%�^}		u�D �e�
�!/���f\CVrn�KV���g�[
��Yd�X�
+�S�sd�J4uXf��ꪱ��I����^���b�0f�G�O�5�T�'


栵�Ӏ
+���w9�
+�R=��Y+P�^ˆ�3�Q�ݬU��~�����Yj{��.E�ǜXK��)��&��\˛qv�e��*Y˭q��۸`���~�/��m�%��,�������/��þJ��]7��æ
��6c
+ޚ��
��0S [K��8F��ձ��7($��'Y-~��l݅ o	�F��?%@m�87�<� �	�Ԋںbz
� _
+.`�AW��
�*��+,+����8�'xWt�W���R|��8����[
V��>�Xw!2�X������}0R+�0c+2qԭ �
��/��O�5�]P�1T^����{���@��@�.���jcb���<Ɗ���CV�p̫�qHͬ��m�gb���P at K��[oS�
�Z+�;$�"j|�O
��
��5����|`�чtb���	���KZ�] 3��ּhh>�fUCCH���!��'�Y�Ѕrȡ��:���m�:t��Lw�@	I��Dzͱ������72���f[ �;�~;���Cl$��-Jvm^�
+��,k�C��+�#2��ʉ\0}Nʮ�
��K�
����2�ע
��"��ج�=�q� �a���֊�,E�wUKq��&y����'wT�Z���r��ox�pݎ��_kY
��KL�^CÕ�ټ1Z
�W��%��X��$�A8�USە�
?_K���kU�q�k-��ۧ\+��
��]?��~��Zy��}W�
�g-��	
+�a
�-3��`-M�u�ִ?n��9V1C��C|�
��?��K��m��3D�g�	�ORq��E`ޮ�	��-����'x��=�7�-4h���ܿ�E�}F���)�1q���vrU귓5�-��~?^�uᠯR
7�\���>}ק�o
FH:�>���M
�L4%�l�
X&jb6�~�tЌ��vk*�_Z �R݌����/��%69rG����Á�~?����(X+
����
�F
��9D��k&�m��^1��H�)H�����̾9�|w��y㟟>
�'�v�+蠣Z�:��
+�73�8�v�OQx�a�c�:�ᰪ�����+_e�������7k�q��o�O�l
ラu^/S�/	�_n^����#Y��E��
�؍�������?�����}~������G��R���u҉�W�h�K6�O�e� ��1�\�g	o.��;�����*F��_΄�� $H��CD���CYL�|�Z*��,~D"Ƅk=U�d��9�6I��BDݿ<��,8��,(2&���I��G����g�xB�@�I�����@X
��T	@-
F�9��+)-��m@<B�b��&�퇇�>z�
 �N$>�{g��ͨ1�N=;Ъ��l[J�b��|���: �SW�t(ȢFApA�(
�4��,�H��-�͐u�W�F�I�� ���>e�<�ԉ!��6�Wu�i�
A������SP�5�
+��9��
rxX��%{Nr��'hM��,�w���y
@�D��	�/
{�N��7�kT�ʋ� ����Ł7�����1�p�*
�\
s��ZQs!Ⱥ����ofd��;���ϳ��ys{��[}gqT�:q�%
Ľ���A|�o�¡e-��]�ȋ�e��
+g�,�f��M�?l.
+�(>�J7���
+�g���PLI"ݿ��!�^'c������] �l'�����w��.҈�U,E���.��9�o4��M���a.��FH~��w�<"�aH[��
+SzdU���C�$,
�y*�rR\`�[
PҢx�^�ʄ�hxXףOw�
: ��������9�~�6{���k��
0Y�N���[;)lw�<�n%��'
+���B�>���P�D08�
6+L�`��3+��0?�^'�m÷�"X�{U�!,��ۅ
|��?|���F�C�
��];��K�KUk���S
1B����6�7���G��dtu�S�^�":
B%����	�

�'��A
+[-�b
+v&�E���7���t�U)�$���:����!�YU����ch�h�1_�Gd�N[�Y�Tm�u`B��^QE<h�i�j�?��G¡��&;gk�|���T]踝�a��uш��h���u�1��(p�rAU >9���1>x����kH-7�
�8��a;P9g��Iz���h����$0��Y�˞�U�4����EOG�܌�	MT$y��%�xM�
�
k'����ǡ�n()�|B��΃�I�;F�C]i
+Σx�h�0��W�P��ͫt[�`BJ��e#����_"����!��)�aƦ��zv0�
f4���F���v���dH���ʖ��xɇ�\�EZ�;j?��_
+=5QFvoq�7svM�$�9���"}:�1��dԩ\a���(�AT�k�}�
�$j.�M�ƪjc�j#_�^ht_�&��s �����Sۦ���x!�F����LJ��z����c	��jk�0��_z�ˡ����Lױ�s���B�C?O*YӐ
XBu(I$6i�
M���@�=]�����o��p�\Sv��,,�PE��6�n?R���zN��9�<�Z� bEH�npu�x¤K���l:xGO�B
�&b������$��vp�V8�F�MFU��
��eˡL��M�4O��
+������dC� �Ǒ��̫p�\�T o 
�?U�5��{r��*�omι� 6�
@�J�9��"��ܢ���:�\�|7F'N��D5���]\<�E
�"��>F�V>D�n�?9�Yv�j%c~���(�q�E4�ڧ�RE�Me�p�PE��&�NI���j_E��)l��y�� ��m��A�;T�Wn2�~uQ%[Sp���� T�N%��jF�fUjɸr� ��*�،�
%���7��]���
����X�_�H�?)@��nj*Q�9��p�5hJ�M�
!����<������ӷ?�W�����|��]�����q����w��KVϼ��b��O�"�x�W��D��Ut�u��*WI`���C[�������F�B��64���'!Q�+O2{�l@�\n�=�=� ����( 
��
�CD6]���u��“
���@�}�ܷk��E������b�E���8`�=�T:إ�	8��[u���D�X�A���i��>͙g�����5r�O��X��R��h�&�,�Bm����fu�THt��H"I��j��C;M�6�Ȅ����,�C��n"����(���^�f^a��
H� ()E��wq
+ɶ���E͇*���F�G'e�]�ļ�S�[��eB�G4�5wZ�?��}�.!:x\�%������n�������yj�>�z�������jj u���,�a���4{���g����/�pL��4I�(̻�}d�'A)����#�&<o2�w�r9��>�y���^�
�)nl�K@\|&G��������F�r��vDZ+�K��UX�D��~s��p�s푅[��1uΓ�<�*�<MЦ�y:����nG����:?���l
w
�L+��8��ؗ������y�߯����uY�
��{� ss����������>e��l��fR��9�͸ǯ��C[q�F�d��˟��������?�˟���w���O���~�W���������0�O��U7����v��	��g����ߘ���O���|6����ir�˟���8������o���?��/������������GCO��D
�������_����_�쇿��A!��;�O�����������O���g>0�������'���O���|���B�{��������}tZ������0��)��Iٗ�����~����+���
�⻿{�������������?��o毾������?����^�g���������������/�����?�����?�ћ�.t&��-��/�*�
+�<5K� ]���'�	
G�/������?z�V�}@;����l����?��KN/���������/��N�����RS�z��ݨ�`��◍�^�W_���/��~��.������o^�+�z�ߔ�6�m�����~4>4=�
�`(�z
'���<�99A�{�6�+�����@��_��X�N(5��-&�4ө��_�2e,�7r����j��Y>��j�
'�jb���
E
� �[�߀���ms�$��� ��XB4��oC�>•�Ns1����\ތv;D@���
Re
#d�*D>�$#p5|�d�u,�T�w�G�6-�m��j�49��
+�WD	�Qj��AM�| ����=r���S$�q�
�ڬ�A��P��X��N@] _�]��������^h�~���q'��6�
9!��I��G�uu�S�K�r���u�YG�;q~� $�Jޙ�OU
�0�A��ă�̿�C�B�?�*��e3�*
P&�Kk�x��CA��@
5���eWiv��]�
���.Š��η�D
+���
�1Oߝ
+Ox��(}?��<�u4�
J�Q�x�R�����,]����u�ޜZXv��C��[�M[�������};�y��:o::&@ A6�r.�;����hF��/�r�_k9����T��p��W28�.g��
Hd�b���G�/��9è��`��S�2O��bBFT�.��/�7�Mf2z-^�쉘�����ja
M��9hI0�HG�-��,6�x �@>��
�HP^��މ�n[���'��sh��*��c3cҫ�ΰ�vU��w?
Y�q���L6�%i�WZG�?
���ޥ��'up�U�Q�������4�&
+�D�
+�a��2�&d�I�:q�z
�w*/F
�	 ��
�M���LY�X Z'
*���pZ�Z�4 ��bk�f�#�� [5���![m^��4��S�7�
�W�d�ajX�ME�z���1C��"�W������_�cP¨&+be�
�������'ZJ���p؂����QZ'6
+.S��-��0�hD��

���0��Ѕ��S��+�N�Q�"�-��f�N:��
�Ca��5u�Nw�h�GHCt�,�]�
���)�;�S4'�<E�RA���uI��.J�&���ysP	]	�
�O�^U�ep�����G�֊F�
+9M�">= �A�ֳ;\��w�7o
�"A5\
Z��_�)���/
���;�Vu��m�xr���c�����mF���D�0�FH
�F$5���O;�A����5��
+"��+
�4F%�+%����e��08�3XFP	��.4�a at S7/��` <ޓ�1k˦�B9GaUŵ��N����@1Iv�lI�F/3e���L�-��e�t�$
D���iX�SS
iS��@N�7�������Rv�͈�f�������T��vp�U�:�Fҋ��1s�n��
+�I�@�|?͛���:f�4CJ}_@�d%]Y1�k
��Ӕ�5�T�3#4�;�Ԭ�}�hs!Ƹ�~!�0�E?���	�N�����.>�ک�
�E���r�\Q?����;GsF��O	��Tr�� 5%�NR��As���
�E	��7G2����z��Y�v�|
4�d�l�%��[j��!����
�L�����%n�Y`!���mWݳ��Ĵޟ��cɯ�wܠ
��,��~���fwi篒�
+�
Χ���nn3RM��R3%x[����	ز
�+�~�O��WZRv�H�KE���>�*|�9�rH���g��
+R.�`<�G��5ͫ?&.]<%���2Q�
t�T�R&��HB6���֨Y�LK��&HG����y at Hhlt�iFj0���N����	�@Vk,D�ty��}���끎��17�p����= 8���?+�?pIn�M7�B���;{�Sة�Io~$E��R�d	�K�{����|���Ix9l<��+в��S�[�����D2���OM
*
��~�� ����C�0
�H�wr}�K_���Zɩ��
4���p^:p�r�q��O�G]
��9+.}|�d�5��
�`p��2p���:v@�?&�r�
�!<����!-��,����m�q��"�}��u3�H����m�U ��Bm��`N�B>�
���O�
�o�0��$��W��ڤ=ա^��f�~���Y� x�h8���kZ~vN*3�OCì�ӑ]
��2�ND��[́��ToD�S&#
[!&�F����.y_n?Ig)Fq�k�־˷m:�e��� >b�"���ԃ���u׾�
*ڝ�'k>��
+4�
8`
Ђ
����w����>l}�z$�Cf]�}�Z����/�)�<�
�2�+åԈ[:�mf<~��E�nlJGinP���� ;�u��K�l�`Ϻ�rv�	��H؈0�
�z�o��%s
"��賦m���}b����L�Y���	��ԯ�c�j����p�p�*��t
�?ݘf ?I^�	hui�:
�]��d��R�s�נg��(�
�$��†�d�\��)�ZX$:�
+,���)�&H)�!�v�X��RDHDF�i��]n@@A��Y��{r
�?Ǡ
��ɢ���k�%V����9T�c�S�r{=]��&�x��7�`�x��>O�G5��Q�O����R�f�ɷ�)�'{P�$��~801^��z:�1�nI$'.����(
�ʺ���h�-�_G�p��i�����S�t(������|ÃP�6K{
�:�z{��O�oU^;E6/N��T��m#��."���� ���(N�3N��G
��s���`kn�Ӡ,�_��*"�p�ܢ����t�>ą���Q��O
ݔ�b� g�E�v�Z^�����-�;�#N)���9"���x��g[?7P
��>�zE	��:I�
ќĮѥ+0P��v�ǁ�˓/��8����O3
�"
<	}��]uPV� �\pӡ"��L�uJ�ئ	3�]
�b!�2o��F�py����RT����T� {�-��`�Y���!�
�ɯ#a�H�������*�%����j�E�p��[⪄�/ҳg/��sa`��?]"�u0Ɩ�����9�˙�Z�����P7�䮍G������SlL�N��vh����PR.�B���${^8@[S���z� W��N�pwH����G�.��9lTg�ׁ{�z��\J�1�(�P:l.������W��2���A�BM(��>�Q)�@�b�@�#�rA�a��� x9xq-?~E����t��vakm�u�-4.�x&(�oG8m����m:F�����<���묗;�h/I��~@{���fARڽ
]�4�@"d��Ck�ũ��gV���Ƭd�7V"�M���C��'
���Nalgk��	���}���S)O,�Mɷ���D̤?�
Ų�y
����`<$�7���`#%�Oo�;�ܝ(��#�
+�4�J�t�шo�A��+��
D�g$B��n!?��
��&��<��I�MviB�&�ͧ�qgT
8�ֳG��g} H�^�
Y��Up
uֹ;���m�z�	��
��.tO�Js����M$�o��D�8� fi�  ���*���LJ}��
�� *�����k)�ඟ6�SYIR��<�b���WR��LAt���)a�l
>ߩ[��DD��d|Dr�-R��[x
��~�A�O詠��&s�
+e���}�e�&�"����$q�C*ꃞ���ٶ]���7��əIͣ�4���'.7!�mRDŽl�e5���JM��6y�
�3I��wi�@����L#����C-�t�
�y��D��%qW3�DL�,Ls��~�T���뀸;��h����G��,CsP��(!
IZD� IT�2c2\�/��q w����r@
�~�S�w��M�We?
�	2d��El��w��\�Im#���{�������R]\D�:���
}΂4��0VBtD]�mN	Z#�F
�c�1��t�(��Ě�� E��Ϥ
���v�p$�U/~�:*IO3#v�&�ө,rB0�|I��c�������
"��5g�pH	�^*�U%�������7�og���Ph֬���ը�h��,ӂV��!���K��3]�
��k�W���w>�C\l��f�HbQ �L� �=|
���V�� �}Va&t�u���F�H�LW�u$f^v
�)I��'�_(r3��/a��Tf�&���H��)�$^�Xf�?5lz��0�R�V�8/.�N�S�΍ݛ����_�R��DY�q%[����y;Y?��1�,&<o�ϫ��/ �p�&���H�&Z˳%���N/�H��J���-/<�0S�uׁ�
M @f��5��>�+�Je�q�
��C���_W���G��8a?��}�6��o�
+�xxB�3	
T'b���Q�]�&�|�m������ߺ��
+�O
+@���
j?��>>�\�y���Ls�$��ե�;�-��^$�K����
<��3�����/��%݆F��ҽ�Z��=��x�LD�]��f�q- ���{^w
�i�E�*npq�һx�b��#k�)���1'�G�wp����/�1�9O�$����ᒖ*
��Fu
��p �����
5I[mjvf8����h�nK�Ni��9��R�
�B8�|����NF��`ݒ
*p!�;��s�0@|�i�)�9� �雲7�s[:��#?����~F��F�3�$P�ba��hl>�?�A�g� �6 S��S�/�$H�u�(�@=��fdF�"����˚{��%ʩ����^��ǏԴ�f�Y$�F�}�p�?k���^ga��ų�.͚��r��S�j ��a!�$���>��y��=�Ҿ9/d���D�%�U�U�j4��"�i�̶��BO
��ogyVz�I����
��ɐ��=
�0RF����8����yz��@�z
+i�
+A' ��.r:�	�
��$5����h-�"(?\�5F4������׫�4;��stC�h!Ɂx_�mXg��Qh�2�I'�l�'����	ͳ�k�G(��^�$
�v
8��t4�奷����t6ᶓ��s�q���Me����J�F��1��.����(�
X� �k\H@��S֚�3��
R�
Ҧ
#>OW�&&y��h8�(����L8� �;.H/���-�c�9z����
+G+z�
�p����\�ō
�
.H9�:�_���O��P����Z�}.��T�	�;͵�ĭ�
E&��_w�K�*�v�"�c�h��첤��8 ��1�hX)��\H>�mO"y9ܥdi�Dž|۽��2:��
+O��0�!f ��f�fo6�T.�Ԥcd��L�o�/4�����Fx�V]Q�>����H�(Id�b�$
�8b��K�z*��QԂ\ҦfA�h�$�@�K6I�v�\�D���]!:� �vM�
<
Y���,���.S��s+�i�I�迺�%j$$,�;��m""l���%��IZ�i�'�s���)�'!j��
�� �K�N�>#I�B��ꔆ F^I��Y$i����ʃ��#ȧ�#��
#�n޴�Π�?��5�|�
"$�&h%U��k"��k�� ���
�WZ�"��_ f�ö�@��z�I.�K����M�-���`U�
T���^�xnG;�D��Gxl�l�VC��Uif=5Js��ԇƃ �IxP�gH�m����Z�)���y@�ѯ'MF�gƈ�b�
�17�j�cj0�QWv�?����{��;U����,�-Uј��yIܰ�B��G� <@�����O#�]5������=Ϙ

�N)��
��t؄�G�[R�
1P5�a�s�`
NIa,��
G�ż
��^��j
�������E
h
+ sj�!q��հyE7�f�?��!��k��ij}8+B��!$Z�V����N�5>$G�$Qs�݈;�1N��27�眭/�U�u��TՉ!d�:b���ʮ�zs��P�սĦ�*�P��|� �����  U�O�q��
+lSf�� �j�e���K;�
uO���Z�G�D
��
�F�KR>d��S�
��IlB
Y��k��}�EwO~!^��@2�0�9k�an	���e;�bO�V��
+�Ը���J_So>!����;��:*�p:�Ÿ=
�<�0 .gi��%�
4��
P��tz�n
@5���>c�p��=pZ���b�V�5)���76I��s�����pHqd	5�iE�®����6�Tg<��.��Lj���
��s��i$T]BN4X�Ǩ�|87�z���7�^�@�{�Tִ͡�k#qB$��5)�H
m�Rv�=p�Ǭ���Q��Sc�M
���p�����FJ�l�-
M�<��,�P���)$�$��'h3m�8���j���$B���>��-�硪IA��<�u��
����u�d�r�d��v�%�\�q!&SY��
�S�A��0���o^�r�d�S��󂚷�;����J��9Hyc>�~	2�!X�:U
+��N�&�-�a�v]B�)��b��r50�ׅM�#���� v�&�b��R 
+���$Me�7�g@�c��a���Q�K��,ѩ@!���M��7��]�Q�\u��(^8
���!0$I 
 ��j��*&�=�\E��Λn�L�����?S�8��J	�d���%=k:.,l��8�]N��* 1�\6�p�l�q�,��޼�,�T��ٛ���:fQ�q
��� ;�
�S#� ���fH⩉���s�P�r��ps�nH#��8/�F�0��cN��N<�b,>�pE���a ���d�;�D���w�	u.��7g;��M�+�&Nz!�i\4�7����W
ҟFF�}��UB/�:�
S`KC�ZL(�P'�D�Z�(,
��9F����"2��ω;��4>��z� ��T�+��@����]���/,
�V�R��i%>�_HJs�e&�
U����� �)��(#�'�9n3�|N�����U,�rB�A�|g75	�"��q�&SF�e
+v�"�����CY�EU��
 b:���Q3#v���]�=�u��	�
Υg����q'p�`r1�`���Hl��@�}�<��篳OK�j����]U��E.��{��A�y J�g�[v ��Z����zy\m�\q��bM��j��'���N��c�LX���Ȍq��r
V����%.O���j�V^PN��䖊@��2?%���*��>�ܾ��c�Y|a�ID�l��M�P�ݳ��ޒ��O�DE`� ��j!1:|�E�K��*K$��
+z,��>
H$E�*�f����f�q&���U��I�+�:��P����pk��Q� ��•+z��b�611)*mm�:=��
�A��]���+���r��t�d�'N ���i��DM����KH�Sp�>7��
��I�pS�R-���MKϔ$
��hG�
�d�c ����s
�H�D��D��^S�3��U�q��7�������ƃ��)��� ?/��?|������O��}��������������{����BP�m��Wv at P>`A���,L�
ت������~������.���'��d6���}�`�*��bf�4@`�z�
٩. F8z�'?����o���Ң�r�

���0�k��n��h�1w|ٙ��xuZ�
(U�,��]6��$l�HB�q���d-vH�*󇏾��VVO����71Z0

Q��B���
~a�۶G�Ô�	��[�U�#���v���M�',����(�Zv6�7�P�|N�#B
����|�g��s���L=�hԽ=YJi�f�+����p���`�o���B�~���P�r���O%��{I&ca��L���#	�B����y��H��e9JϩzS_L�H�0K���"p@�=O�=�,�æ�
����3��z��\
+3@/~��+�4�c?+��"��=��H9����'��aX
�'�제
+�J`�f��L@}*���=@(B�,�?�����:�aa8������n��i!�
��%N�{e$�w/H{ыL��Cl/��X5�m��ƾy
O�
z,�]�P~n�(i|r���ث
������Fy����P?�z�0yk�L�ڣ_
ft
,Q+�D0>��P9mxM؋k��,�q�
�<�t�LV��\諆�z�	�0�zƈ��� ���,��AN�{݀�J"
���,���K�Fʎ� P9�`d���&���p
+3��L�#u�$
�
�y|n8��7g����*��aBLU�(Y�%Bʙ
�\�_�a���覉�a[�4�<�>r}{����S
�R�Ը��p�w�@��{y�g
Y�'��w�}�����ݽ�aI~|�v�����u�kQ"��$�g
��gw����V����aw�$�/ꍯ$�h{�K�ɽ$�{�ꗓ>���ܸV�i��]@
;I�K�B,�bހ�
+���G;%!��b�ѧ�݀6M��ů�b"-�UnFIX�l���j�dW���b���<�Ov��$��u큗gٵ+Gfus99L�HX����
���#{
Y�%qAQB)o
�?����M����a������(�j���ϼ���. ��8-\� Ie�.�
�qi�c�C��y�f�8�����S
ܗYɝ�v�_�8CZ0+Ȳc���/] 
�Z�#k�ɠ��>i^U��e���!D[&ۍ�o��r, ��,adD�f��^��"��*�`댶6�
�f��(w��\��1
@,.8m�J��_�־�jb�z'�z
+�hs�x0�(�u�9�G@���1�|�˻{������t��s�$
���a~n�1�!

d7\25ht�`*�g�q� <��^�+��!\
��K�NA2�əb�uE,�c��r������&��T����~��lB�‡#�))��n��
+v�b�8�
Г;
b�>��8W#�`�B]�A��� 
�6���~���Q2�q�ܜ� ���t���x��0���8�1�s�0�rz�ݩ:�>K��X">[l
+���
<��/<3�X�-{@@��
+�y�@@5��:a��q�4a�LK��~��0G��p,y�(�%x7$�rO�#�=����x���M!.�Aؕ��d�%��s@]goC!�Z
Z�K��)��x�� ������^
t$�K�2j��xa�� �n
d�<���!�w
�!�>���)�}�p�T1�Lqz�P4����e���:�6�`,���`�i�d
8�US�E���ij��q��
+'O�Y�,Ӳ�n(�ga�G�3@/\���@pH�2����TrA!��+��ӡ�9�X�(S����&1lq��%�~��7��~�u-�`d�V 4$�E.zve�9Z>b�oG}+[W"Ǐq6���<@9B�\� �^�q*�#�x��?��ɪ�R��/d�D�i5[��
�]
%��
�	�~4�T{5�
�g�Jz	&��a�����4�tQ��H�@�W2�Ù�ث��bx�in
����9���Z�/x\z3����U��! 
+k'�D#
���
 J��z���I�Z�ݨ;�D�o�K%ݽt���P(w��uP�m�0��92_�'DȓI���HR@۽L�I��5x
�
�R��0+�$C�-ɤ�޿TZ���h"�܉�����3�a�P��P�x8���Q ��y�(\J�t
~� ��`� ��G�
+%w%��= ��
��F䕩!��g��r�I�F�')��1���!u��a�`�s���E�BEڀ� ���
��Z�m�Zc�|?
�
+ğ�(K�n�����X�~����`��a�B�@�{8���T��=���9�
��h��)k�rb"�v�j�f��#�����&g\[߈8
�E>Z��
m�c ���$
C0@NU=C-�RrH�L����#P�_�XYj��Q��RoL�$������Q���o1������T����va6j�G��)E�}���9
*BVh��Fر���+�=
�,wLYl���+p�����4x�
����aX�໇�b[P�&	.�o
eF�d
4���HI��p���HbDQ!��T�T��{��D �	��і�|%�7'S�f�	1���tBU�d��t��Z,�zr'��E
������
���,�_թ��:�ܷ�L���0A�,T{i8�}.�E�6��T���c�T6뀪��D��eu�Bro�	���(��??�4j�e���oj�i����"��
a2�h����2Rt;�
��Q�eﭒ��^�|I
�-��^��
�	
5�X���Y�.NF����z�u��߷��)9���E��

+"\3��/h��|m��4��
f�d���k=���$<^
��Pܛ*2���(r �w�T�Du��X|�
�${�s�
Z�
�c�=�]z@�
l�U�h�'b�����^�O�%������г��(�1��#��LN�aĵ�y��F$XEz�
��>y�1CL��t�=�#w���.=�H/ŌK��e�v���MU�fB�����@kQ�bUn
+cfq&K����A�NI��E��W��&�<�����	ꟽ
�U�f*i�I:�y��%��W�/�w��kD�s����^@���Y�����6;
:`�׬v�a��z�o�q�hi���1�b���
��؎6`��겄�w ���W�%ۖ�~4_�F��gª�l�^�]���Ƣ�8��{q�
&+�~�X����V8!�G (
ȉ	V
y�2��
�y%���S%��; �z�?�
9@�/�ū�t�i�9t�f'��B
+ʉjR]����Ā�<C�{/R0l�ϟ+
+R��+d��gI��G�Q��#&d��m�(,�u4ک3^4�U����H&�o�I�'��=�X��`�u:0Y'kﭪ'(D�q�bzi�P
$�W>U8/Q[���Ϛ�b»JHg�ɂ��L52
|�sS�E֖��q�����m��2 {D�
+�Sʋ)�T��v�`WD��ȡW
+��
�ݢ"
|�b�X���0�k�)�(:�
�C,�Y��8~
+
+
+
�����jV�t���a&�?�RIV&
Bk� X����ʗE�v
+<г`��Wջ�!��ފ��8E��
T��F�3Y����L���U��+���N��Ԕ"p�8S�jہN�GZ+�y�B�z 
G�������'`v$P��|�T�Q���
:I9�\$^�i +OҊ�����������p��u�pK�6N~33��A<�������}\,�w`������ݾ�I�j���Eƅ�_�yV&e��JʍX��8���k9�j:�]��a�Hj��ڃ�s�&��G�h�G
+����2�?~hq��l�y`Hճ��r
�e�
<P��a��#���k�T�zT�
$�9�M�1
T|X�n�lٸ
BM�,2�O���t�U{���v
�Z��v�GJar��
�܇s�v����k�$��Š����#��W�2�I�%z+������6
�kY�=y#&��ܑ��
�O�k2�����2��]zj�rF��L�{l�!��ݢ�
Q
+z-��'���`5��n�$L��
s�\iW��1�K(DD��Tq�N�L�}j��(3- s=#�U
���~������;�^
A��ĸ��b�ͮ�y-��"H&��ڍ��h`��1I��L� ۉg
�<Jj�u�@4}�qN#k
��R�.�B���#q"��G�sE���l,�y��2��C�fj�~�$�]�Q��,.	��=����}"���Y�
�IՊd��]A]��l$,�Q��B�P^;�,
�$t;1dQ���XQ'��S
BZ�$�>Ξ*����UYr���d/�ս�c�{.���8�4DF&� ����dj��x�8��(���2$�nG
���!9q���Q�*3�w���

+��?'
ȔjR�C�:ʗ�����Bf^z6V
s���ia�N�9��,��C�3��2���y��A�6�1J��@0DZǎ��S�W����:�^z�r~|
���I�*o����
�Q�8��ܡ�Rn�#•.��G��V�R(��%TzLe����==��7u��BE�p�* ��
f�P:�������Gb
�r�|��Rr.�w�ÈcZ����&�u&/|�鑓�(3��#���JܓZ�DJ���SU�p��
W�=��p�}̄D."�î�J��ѕf8NC�&�]6����F�L? ����'l�RqX
G��j@��t�$Y$�͍�rR���n��RdV֟��46��"^C� E�,`���Q��g���`	��
Ș
O����Y�@�oG�;���3��-H�����?!yĠ�G�u/r�PDK�TQ�`��j,������-��)����Eb���q��g�RVx��D�/?g:W0!uD�k���3�s��.�F픐�(l .�8=J�
}��Ʉ���䗼\�� [...]
h�q]VP���u$W��	�H-�p��e�	����L���_+̺
n�J�
��_j/$w=̌^�b�(��ԏG at hܴDR��hn���o�_
+b�
�a)!D>�>a�Z�:<
���N
];^d������E

)x�hH�m:�P�Τ^�����v�Q�	�0ؚj���eR�s�"��Ԕ���a��>�!�"�[k�!��Du;����}Φ�����"���z�
݁ Q"��'�8����b5U8��V��ލ0р���XB��z����EX��}�Ў���Ԧ��wg;'Gƪz�%�`�ɛ$�V8c��� 
�,�n��\�*����D�Q��
+�
�=���"*e):�zg�
��+<�J#�u��;N��za�Wx嶢N���#-
IL���i�� 2�ph����q�RE*�J��jQ*�U��o�����ba��W�	�G�
����f)��<�@N����W��
�|���#����Iv�s�f�
�mp�ܓXv{ZN�O�-��"��p^

+�j�,�����Y at CYH�N9QϬw+L��A��֬4���`��뷇
�xT����7��F��*���
+z��T
+��'� �+
z���bz��)��Lo��d(���F@�>x9˕眅��
�����&Y����+�]Gl]X<͌Z-s�b�[��>��P}����C��������].�'�O�-t�

�Z8�"B��
��"��������9�T3��
�ܲ�=Wu R�H\S�&����
+�毦�k. �~��h�"�{��8�������P�L��O��n�S�^F��R=L�]�a
6���j�p�#.�m�)���Z�eD��_�
��s4���[[>k�^"��%�Cp��T,�\B"�|.
endstream
endobj
130 0 obj
<</Length 65536>>stream
+8�h���� *o�V�P��__ӏ�z�W��6���Xf	I|e�i ��
�QG�ʥ3B��q��¦�hJE��8�ډ
�K]�˺
���&R�
��q�+������'(۔���3OJg�@�	z	G�>OQ*��}id?;�!��� 

s�/=�E�=�s4\��g�}�H�u���'�o
?��Fp_�'���^G�eZ�&)��`
+gTNR���}a�a
O�w‚d.sfxT�踴�
���'
42�(z��/4P
�<$�().��
�%	�;8i�ŃM��ȏ�s	��Z���O|���
�(������'���%�YBTU\���
�SJPj�!�+��{u&�vk��qf�ff�TK^�Be��Q�bKW��^���^$C���X���0r��p%
���'�?Ta��_Fdzk"��
q�P
�Б��7P��i�ʀV��o
�VV�*G�p�}؏A"�G�	�ŨX7�E((�@��@Q�#��%'&���ᢒ���P����4T����c��Φ�s�5m��
!K�8_�x��w��
6,��
ɡ:��h(a|6����+lӏ��U�9Xdi2W)Z3Ut��D�VY�\��C��
Vu{��+�HT������Ϸ
s�1UKJaO��.�� �� �i6��Z�C���1y��9u?_*��^!>J`Vlx�q���!�w����q��!Y��v�s�2p�2�~�
Ƿ�\� E�	
��3Y��g���CR �@���?Q`�ϐ
���4�i��
+�3EHwL`�l^�e�,�g=����"�@,t��k?
P�v�<U�
g;_�$�	ƫtr����$��CG��$�񹀾X
6�z�MIk���H�ow1��#��'
+ #0�S��Z��
�Q��H
+H�J�[A�<�t�ƛ��O�Y��׌<���{�s�8���
+�>=��G�L����Y�
��NH�ύ*��������
�wG"'�ʣ*b��
�Q�+�b���p�D��O|S�%f
��E����� �$�"]`j.Y�"w���Q��4)���(!���$���<8�D����������g�D6�X�w�z�4�S�s�]�{�S��̅$���`)=e�~�E��/��{�$��K�_Nn6�=w�̿9΁]
"�
�b�d�>F����
f��;~�d�֞��]�o��ѡ
w��.
t���⤃Zz
Z��Θ�L-��Ǐ)W�+R�r�B�Ì��ю<�#tc�e���T{�73�B�
��� �X�������5�QM�\�v�!.FA�׋yi@桨QD� ��	���.�
a��¡��;7kM�Io�
+���4��z�����<��^�(�|�ϭ�&�"o�{���8����
+�_>���ڸ����~�6�R��ͩ���|�@ɩQs�/�K�筗�2���I��3�p����cq���
+�����Dp��B�Q'�Qx�kA7d3�����H� Ek^�z{�B����9}X�������am,������%h��/"%�o���7�
/���҈���y��j��G���w;��z���4���O1
�tD�*��~ڧt�9��l(��F�/p
+B/��5d�@�
�y�C+����
��Yi��*c�wX�uȕ�|��
��t��2
g4(�GU�<�c|�����/�u�
+��Š��&	L"2[��#E5�P�\ş��~���|a;\�@���(ǥx�Ǡ��Q,"

	I±.�A��؍��4֞��m
l ����,��
�;����m�`��^i�B�vZ�2$3���Sx��$L%@�?G��
�
a�ǘ���阨g��#
|t��vsG���
)5�,`
��vZ=���g9�^��
�X��(����+����
��2�wD䚜{�&��R��t�<����[�VdbPbC�5��0XH,4�bHH6�GHэX��U�<�������;z9s �AYTd���O5LM��*��A�D9����<2�?ݔ�L!{�s=LZ�E�
�J:t�Ӭ\��,�@:�IV��-'�=z=���,���6�C!t}0fF),��)'�o=�
F��?��41���,��zU�WW�G���|� ���O�>�@��
x�� e�a@
-�k
� ���ѫ��k'�>p��*�(&G��E������^�0�&(�H&jy��d�_
^�W_�ۈd2In��s��dF�~��h�у
S8�\����/�IV�3+\;��E�9@������ۖ(�
WzB�|W 8;��T3�0
�1=+ˢ
2�#�y����b<Q�-�7��Q�W ��W�Xu�K�
����0�(v3
b��:�[�;l��[w��]/jvS��:�E��.@K�W�����a�oE�
$�_6���^���"��@�:&!�g������}*�̹���"pk�����+jA�a�ʊ�@K���%�+\A!P�<m!�dfJh�����˟RO�T��:0������
+��rd�j2���:A��]r�
ݼ�������¼^H�.��׈�+FI\���Pj��Mc��
���֡��9�[/��<]�%�א�B�B�j
�n�t2�����B�{��
q�Ѝo
+���|{� .ħ�c�YP�"��A��.`CΈ�ډf2���U��7��RA�A(�YH�dT��{���"��KZ�}?���a&��X
T;8[����H,;�˳m�g����$p
*<d�|�T�`cW
�$#�U��b��z���� ���8W�
HF��TKKe��OQ����M~A�Y�un(5c74ˆ��'iHtW�n�� )�W�
a�F�h���j���ھ<��O
�X����i^?��A^E^pG�*k�C*~�����S����*��{P��At��!���:�\z�<'6�Ģ�|�5�k2��C9
N���0�LYQ?�%qؘ� ���T<d���G�ƣi�
+i�;!
�> ��}T���*?;ꀲ��@�
+Hr�DbC(�^�K��ĔN��*��.c���P��#��ƒ�Z���*�]�ǎ^����Бx����齆>�9QD�s8���J8a
���Gl�,=.���m�
�@V�>�ɧ���"�G�Q�~xڦ��t΄�M�%Ti?3���A����b=��Ƙ����
+�_���<,��[i{94h ,)���ԉ�E�~��x��+�ҡ�QU~�ng�I��A6�
�N�_��ʐU1�,��P|�V
+=�ȣ�@ԈV���|����/����TozH���_�����c��Hk�
�{�o�Ư�t�dn�p{�/P,<c`�@$�z����
��|8��^���|J�p�Ԯ��*����?ަ���CԌ��JMl K�V ������ 6J���Q����$���"f�W�[�?�!����H�@eM�!�x��A�>
+�Z��h"=&+p����'کF��o'
6��<�1�=U?=f�H��cFpyу�
���"O�C�!)&I�S,�v�~~\�D7�� �k��O�@�k�O�q:�Г������_�� �2ӹ�Ddo1������O�U��:*S�aC���W��һ�KG�����f���ᬥsv�D!&�")�s�>�z �<�~	U�Au��78eR����q�`M
+A�
N@���q����9�ݦҠB΀���^���H�j�
i�qt�{��?of���Ӑk�d:�
�|�	�mJ���U:@]��L������J�Ўq>T�����:vHRM�F m8t���P�*P6�{@#�P����Σ�L��
����P]E����*���W���@,[�3
C�a�^��ͣeOtA�x�#��,ܯ*2#�Ι���϶e
qhL2)W��E
C#F4

��
CW��2�k|&�ꙇ$|({��I�#c����'��h�D�S˿��px�~j8�B����U�Q�(����YQU�
(D���[M���၆��p�g��
6a��)-b{Tye{q�
�c����'����Dҳ
�wK���	�U:�h^�Z��LR��
�Z��h侀
+<?��}K&XCeO�����I���Ϩ\L���Ǒ̞A��<'����sf����L���{������i\O`;I�[�]� 	ƖƤyξ��}=����YL�3�io	�M蟿�9��YN!��P{�ړ�c�ha7�1��n,�pS2��N�漅��q=�C�Da��^�w�C\ m�v)����o��$��{Pn6[��
��;T�
qN�g'��OJ����ڦ�W�P"m֕3]!$��#�k��uFޑn��aev�T�ԟ�
���	�4b@#����`m�&F�_G\�NeQ��<����)r���(�Fj@�o>ė?*��AYxM(# XB�3{��!� v����6�JbZ�?@8zm
+roߤU��xش�Ol��6֤xW�
��Ё�%�H�I(	Ɗ�����A)��|
��b�0uA�[��n��ҀV_��h���|�)�1b��p6T�o�
0��oq�\�G	����T0�_�-x:
�N����������$]�H���
B�����AP�bD��J�K^9��n��~
�dd
+
p���ѨCT q���ڿ~���v���xE
����]uQ~1 �,n��Z'~Y���{v��e��o�Z����D��!�
<9a���>�rL?˾�G���/#[��a����!Yay�&�4�F�BU?��!�t�
<��yM��}�8�k*�M�q�6y�2�
��-`��f��J���g��8T9
��G�j��
� �2l�\a��AfP݆��B�����|����B��j������@^ܨL
+<�ʒ>��Q�ٮ1DŽh��X �!ų�$�"o��y��r��wĿ�k�0IkxIjj�§L�@��T`�#

�)�Ԣ8���Q{ػ6�����kC;t�8���
+�R҂hW<ŝ���T���F_~��X����F�� G�@�5C��ϧ|��
P���@#U1�1J��tT�܂�tA"��
T��a¨O��
C�UN����e��v����p�~o�+�W���W
1w��zNi��j�ÕX۵�	���t�'}���A[T�9� ��S$�{�`�Ѹu7�n:�a��a�{HJ��!�$
+X���yk@��:�}m�PmE���f�
x�!���)O�>`xz��2B��z�?n�����*���=
��o��ָ��С�cJ*�|��Q�x*���P|��h�Z��-��R�+ at cحL9Pb�F��j��U$��W��ɘ
��T�d/d��{Q�!e�NJD��Qa�Rj����h+�����C�}Ϯ�*
�?�iU�[�1^
n�XԠ�C����ԋ��._��C�	@G��̷��K�
��(�Ts���
M����b�8j1g�-v�2��C��`X�� òB�*���dϤ�noI?�c
�mWM���_~K��d�_%��K�<�������g|����?�ۯ�,����������������?����_~�_����/�O�������~���������o����'�����������ۧ���{^W�gx��+�ރl������G}Ã��|(�VX	D��Y�h�g����m��DTHa�}l`�`C�K�#�[�A���l!,B`
+J�8H�dW�Lᤡ#f�(�v�b� ��L�2������ 
��ܝ�3�>�̽}��G{�C�P]�;آG"_� e����I\>��G�
�
+k�c�
+Hd��1�K�����*IBzL"�ZyG�h�c�'�-��V
i8�#�M�
ʱ�7���R�
+E����|�޷B��k��uґp��|Pޭ�8I��W�=��0�+�rU��(�,)���<
��J�8�r
���&�-��x���
��Os
+K�3\�;��u�c��|}�>��t;I:��G'Tw�Ƅt� �]�

���nj�#v���ں�~+���y
�9U��:�.�l�8 $T�c�Myպ3c�
@�cwH!�@�rv�:A�5
�,��J
u��m��x�1�2M����0���s�����K��<�ﬣ��E�[0!ۨܿ�����
+F>��4�E=�<���*��(q�V̇��T�
|m�;B#���'����g�w��7<
�iOX��u��֣
���֘��8z�%\����w|�Xd�3���@	MGu83
i��<U��|t{d9)���{B0zT�tr�B�GArzt�
ݐ��le��
;��J+5Ғ{�t,�"����߀V#< �Z �{��&��K���k/ഃR:�`�yO9�Ҭ���H
��|���x<�F���
��>0�ͼ�o�Q`�7@�h$�f%�����
�
�N ���Z	v9��A���;tPE �#����0�A�ٷ��Uo#0'�ͨ��ۮ�t�05.f��ݻp ��1;E��|^�`<�ު���u���JF����l\I���qb� 5i��FW:���Œ�
�`�X�	a:���R�
"V
e�jsA-)�2}�Ix�ɢ
x�%��X���U���	S����
N�9l�p

��:8�A�
�{�{I��"X�,b��'��Y�6�
+D8}ė��� �ʘ�9�W#�������yUyN� s
+��T�D���� 4-H�MQ��\p�92
l
���t;�v
�Y��q	
+9{���B[/��SN)�
�5�
�$�#���JyHG�}�<���Ր
Y�!�kCS-�I�
�
��w�ưW��?�U��e�
���=(�
�=:'С�h�͡�
�<�s��A����@#��}�%؛��vX%�{b%	��<�
w��	
f�Y?���"����ɤ���ܳG%��"*
M.��;���0��GO~ϼ���!�}��6���j0:����=�N���$)�m�u2X����`_H����0���pH�]5T� �D�����QG�z�%�l�'�� ?r����,d4ds�&߄z�>W�Cx[ μ�a�05���_���KUb�)�9Y��P�-�J�z���U��F���K��Ӡb
F� ��r�g�ѹqSvc�ŧ	�?��������
݉�sw�B��\p�쯋��G�ǼA�銇݆� � �T��|~�9E}���aK��=~�K�۸�!��#�ԉ��{���^LH�V�� ��;��U��}�X㢄�ʁ��*r�e����%G����,�Z�#>�3�g�?�؃�+�O�!�H̏�
��Wg�7B�
��t6<�
���:���s��wwt�<�� ��{xSU�/�k8>�5�9�S-yo]���$UF�{o7��A��bM(r3��WC\]�.\�_ߪ-���& ���]�}���ı���������*� �7����d�Z|-y5�e՘'�1��8z|	�B�T�ŏFœb�'1^4��6>!?6+4 ,~զFL264T��;�E�V��?�Z����c~D������N Ȕ�@���C!Fٗ��|T�7���eX�cEM���~2{���݆x-kP�*�s>���l'8��G}kP9�P��%�}8M���Ww�C���`9B�� [...]
�
+Zx�=Q���kA4G�I�3�Hd'-*�
�GJ���һ)�W
3tO����ܙ����c�"h�u�Ac/@�l�$(a-�J/�����
+�,#jڐ
'�R^�S1݃�!L� D3��c
P
�P��W��ɷ�؍
!c�u���*�
L�ޏ�r>�*���ا(�8�)�j.D
��"̈́�
l_
���>��i
+�
@��L�x��m�`�^�i�W�MM�0�'$�ʧ�k��1��o)�pPyCK�(�� ,��Z�Y���"Xk��dvU4� ���E0+��k����0���
+���(EA��wE0��yrC�u�7�&��Sț�h"r穙;��s�"�
�9h�:
Ki�G
�c���G�T�Y����<TG��J��.x��C/b�5��PI
]�!��� ,������
�$5�%M��"H	
����c@�#���'0򣴪�r��8��+���
8�B
+sǼl%k
 �����1l��	"Z1�9�h�Un��nA�$�C]p
�,�_��Ĭs�~�#�0<�*Y��
6�ϱ�C��
o
�vG�5���Z*Z�핛���O�ގ�T�InCD�G'4�>��~
04T��\�{|k�)���p_W ]*	�'��8
'٤lR����n������
ҳ9ɝ��aٞ����z����[��p4���	�=3�kx_�V��pk��T��Q^�yi�j�}c]O��F�4��$�x
+��Ȫhv��x�k��Oa�mDQs��X:|�j��*��O6���WcīA.�6ĭ
��g�p��1@ő ��ހiޥ��5
�GU�s�n.��X��z��7H�ކ��]\�`&���D�2yo�
A���[��E4�*U�2��y� P�L���my5�!xt�v����8�f%��
+��)d���_U�fH�1w����Q̮�V
�ۧЍ��t�7��q�v�5��3�)�0�>?�~n
3���JwU*�r��k���Wp	w�sC��d]�c��[пަԓan��
�1s��+˄Íl�BC��������4��u#4J�`��sJ
��� �
��%z��{��!�,G�����oaD�B��2�|n�[����k�D[(bIZ7��
m,�[��jۥ&{ű>S��F`u4�p�CbH�)�	`��������ᄅ%ņ�c�7��a�ç5
$2�k�>!ژbk?�ŦB���m�䟏�� ����
�������6!L�ր���w��5��
��������ތ2���/iȆ)���'�Gp�pq��	və�(t�T�>8��A�
�4�)L)�r�*N�`/ ���i	�Q�G�����S$�p��{A��5�Ѵ��9����P��K�G�o��9�&�Y����F=۩���PA?� ~�H:
-�q�
+�Y&�Jl��o ���7��؝
�Pl���A��������*�~��nkL9���մ7�a��_�ET=R���B���.ĵ�[�S�m�i#�n��Iu>�mh��	��疢1@��H�-2��\��7{7��ʒ!l�Z	�
�);�_
�����(a� j�z��F�q�h]��Z���t�A��c
+�8��ǚ����
���hS�E���1����́�����X
r��؅�y���
+�8�+�w�4�bjs
�y�ќwh��{7��hTD�cAŽg\Pn��$	
+ �,kBO��J2-��pk�z �+�*
�$�8�|R-����;ϰ�Y�7�����K��|C��
����|i��r�#u�5_ ]�!R�F7�z�T1
28�
+�t$�3���dPƌ
-�t�:�g���:�?Hm��rYfd�e��t
No��Zk&]X�?(����Q�i����!���uz�~5��=f4e��'0袋�=Ex�C��y���+<3����G�8�5LHs
���7XY�:��ƣ>�/����g�ռC-ܡ�٥?>��X7$Ϯ��lX��QQ;�;
lĜ��D
�9Nc��U�n0�o��Z=�����,�F�6�8��<:�5ג�^�*�V0�kg��q& ؜	a�k�_��
����[�)x���I�����N	���#h�
 N�Ժ�gC�T���
+K�F����.�v��PF��D|�B����
�ʹ���@�ɷ��09�>X-S�<Ka���&�ݿ��2h��
B3�Q:���.�\!�)AjB��_z�cJ1<{�P	��8먗�8�֖��͡\<�����z��J�7�r��@	[և�`@�h��L
+�H�x�#�������5�
���z��2�J(�IhA
��o�3� ��$��^%"i;�u���׉\ˋ>;3.�<9 �<{,7�K�
=pw�Äј
H6U��P�a�� ��ac�8H�X�!�F��PĢOHF
�����.=
_
� ��'�o�zRE�{�b���>����c}�f_:�l��WݑqM�\�	e�*�q>���'��*�ݯ=~9%���0���/����I�tɝ�f���jz~P�^f+eI�=�K�wZ�&7^"+��{C�_�#~u��o�����H���k!	�–��>�ԔPD�wz�QЏp���KI-z��)�gz����Z[��
�̱Ǥ�d?z�*2u��L�^�K��PA�����ǁ�EL�2���
n��, T�tXś�
ey�!��2$PU|F�H�S�0ͷc��
�ڝ��ݽ�Mb�!BkO/����Vʉt�o�0UX^�N��v��M� �����/'�QB�i�o�3L
[���/��{P(}�.j�M�r�kH��S��n��V�����
�(�a
+.s��
���-���Z����~�W��z�&�֑$_L
� F������v_�1z5x
���P;ܸ�Q%��,��
���
�1ϙ
7DA.{JvL�����f�g��=��<W
��[C܈=�H;RH�Д@�3K���r�+xν�3-�o
���!�
+p8
�N�N��P`v����k�|�ʓ[?�^o���M�-q]s��<��u
�ԧF nZѴd�#��J}�[���S1PR���Qz0|�
��;�	j��Ԓ����+p�.w7K
�=�nEN��%��fO|Z��
�YSc�a����
"ny���鋾�jz�-e2��[*�/G�Ν
��[�Chg6
՞�G���
��;W~=�D��3��{j J����
8��Z�e������i�_���aULhh��4$��M�evW�#�PU.!?�]��aoӯO��*��M(*=Q�
����g� ��Ry�H�QE���y����G�b�
+��
��T[�������8��gl})p^
�r ��p�;�Zr`m�� ie�ڰ��{�Q��
���
��1�
.٘	�
��r� V�8y����'��G�`F��_�p�
Q�N��aȉ�
��[�,Ǻ\��8�x�n^�a
P,������s=�Z��וAp~��Mv��'3�t g+4
הY���Y����|�)�8E�1/=�ѩ
ͺ��Tź
 �!��^���;,0����P�7%�|H/�����$�}�P̯=��͑%��
�>�o���������G�eV�i�AD�Lҙ"�)#�
QR&/I2W���TD����2��
 :����I�t
[
+��9A��fB��k�fl�YwR�')U��DOq
����0��� �2%	4w�tJ1���8�U�~
u���T��Q��5ٳm����= �~�8R�32
�]�7���ߪ{�j
�AW:ڍ�=Xs��"h_gho(���
+��K��k�a/�p?�*?����s��8h���Vݔ*
�b^�_Ż\@���w����#í
�]b=�J��?6��:�R?��#׆�E�J%��7d4<M�h;	^�*w@
���1�
E�|�P���)�հ8"�8rw
x#P�hZ
+ñ��iq���t�[w�xTuB�w�U?K��HM9C
�>�����e�YY��� �;B�
dHIN�}�=^��-l\���<���@�-.�z at 3�B@�P��f�?�Z�r����
`?o*K5o*:��0
���4_�*�[��\��W���.wF��u�:��!�S��GP�w�i)� 
+H��O\1��=2q6��i�H1
����"�K,(X�pi�D�82�'<sr�S_� ��r~�:ƃ"���ʶ�
1<ɥ.%�
+a���&f7K|�_W?�(
ae�^$
j|ú�>n�ᘽ�i
��
]3�n�'��Kv�
S�H&���P�iGNj�_;hRT3H�e3�������,�yZ��/)�
b�x�G ��B�0@��
��A�J�q�<���>� QC���̾Hl�>
+b3�gYG^

�
>
�nIYW���5���i����IZ>�QS�e�gZ�����)g,�����Q�v��
h݋O�I��Q�g��/q�+������aE�N����Z���
,P	$�=�ۆt�e��X� ���&�w�ӭs�
�	�*3-�
+$=::*Hx*rZI��8�ڠ�^�g��T�����&�F���8�]z4黀�u"]����>�c0jIh �$[9^�b���ߪ�[3��IA�
+�����<�8�_p
k��ϜQ�Q�Ǟ\�
+�J�@w�"I~���Nt��EH
�G�`���=�:����c@��Vp^¯ה��g�Gp{��)I2���{�V�3��8Y���J��;�(:�wp�)�­�)}=�	�tRHp�tgbR+@���\�y0��;J��b���&�����?�
)]�rfgJB0��q>੬��
N�_AF�/����Z3��f%1��^f��#�h�(jf!:
��+G?�B]�1PX��F��߹Gz�+@� {
+mr*R��\̈��`i�h��R_���`�
Μ
O��Fh��Բ�܍�;��s?T�9�ٰ�6�u��iq�`�0�#����n��5t��TΪaG�4�+Y�t�3�@�diL��1M�6�VVRe�m�+���(�;�I-��9��k��!ǁ��)x��b��0��}��k�≡,��^ f
��>�f[@+�Ovq�lO$�@:�W�'΀�� �
����}ҙt�%ݾ���>vn"EN���'&�8���ߚ��S��!�`e���t�
+�#9�|s� �0�3hYB+,fcE��K2"� �l#t��k�V�F�xO+H~���	b%�U$Ћ���F�ɂ����=�_p���a
6��n#������'��)��,`4`I�u��<�ho6��StǘjI��~P#�Kd�QHesxBW����-�B�BB��L����5��=
�@O�����7
��`��>�V�:}&,I�=r'�|z!nK����Κv�
����(a��gc2�8�\�G�G;�
�9K�ճp//n��5)���
	ze�=��;���T�
�.D0�*�
�\Ş{8���<_I��6
 ��M�,�Pva�a�A
�?���#��E}
+�Y�]	ZУ)�zYv� y�Y@���|���o-��{������U����lU)
L�w{���p0�5�^ë�)-0�pe��Q�=��=�A2��d'XzȕnQ���:;
:��W�ʌSE��MW==�z:64ĺ[�����hP�֋�
�]�
+���
zBco��u���[��
J� ��!�_!�>֫Lëlb�5���-p'�Df�U;�x�]
+�(� ��`����ܝ
&�^��
�-�
B�f�t{ă
%��`M�hN*2�G8=��A��*bQWg�Q�[�i�B�O��lh|�ت�yD����i��g@����E��M^V	`��7W�

cE�Ďi�*�V�P�5f�w�Q���Z�^�TE�Ȇ�;���ϣ�$�c��
+�/dx��0�
f�v���2����0E%Ơ����I�Pa�̱sT��-�yH1 �F�\}j�<)N�ί"��Uϗ������9��}�N
C��j)�V�h`U�롪6(�
��=5��&�r���b�4H����O��=���dAV�ʦ����<�pi?
W������@=D��D�
#TJ�
��#��f:�J�~���2�w�bv֔n��� �����RAh�M�a#�\�
X��9`�ͩ���(�:ͫ�t�`���Z���#g0Q��2
�L�ţ
�>��A������DXş�����
]
�
+ at P�܆��5�U��u0�
�
@�Pg��x�)S��+�0��R"2���v�H��2!{z���$g˵�
@GH��}�%(�]�����!(�������΃�\+B"ً�6����ㄌ�	0�]�������
�g��,r�p�C�1��@���H�ؗ=�R#��\�K���
y����"��q	�I�(R]��k$��F|�ĜW��?���{ �����aS�: )iæ���;�Ƴ�C"T������7�x�]���{�p
?@4[� ��X� �G��[ ��G�z�x�-�4
�2�T*��>%iD��Ʀ
m��\|ͱ�<�|@��4
�
�0{jQ�j{�M��Kb�quGJ���
j�@
�Bvm�ˎ��8�>{	l���%	�_CDL��!
W��6|쒰�.7��Qj�k1�Bߨ�
�����s��<���6ņ+J���p{D#),�\�
��� �mqS"6�����RG�
"�T'Ov�u`�� 7&M��XX���XKd�!4I��Z�;"��j���'��d����&d$�Aii��Ž��:�50��e拭F(�
���,���.=�
�d/����W���iÅ��7�z��e�*�{�9`��	�D~��k�LD�#�������ɼvHIa�~����������2ЈL�[Q�"��!��N��*0V֝3���� �f��dL�QC߃��d�ڏ`����.�J�e�
��
���T_yI
�l�Xst��0��8&2!!
Ȅ�2���]�"�! QS�W#?�1t�C���Q�� q�l~!_��r,�l�>���<�}!�{M1�ѯ�3T�_*�+���$_d

^�;
�
�{]4�7�
�r�_�)A��ގ~e
��rÞ�r�����e�J�R�rS?�).�5�`�L�{���S�qvh ӱB�Ry�p�;ɦI�j�i���.xϣ
�tB&	*�����R���o�p|�C^�%�$�:��e�9� S�峑�� [...]
{Xn��}v ��_�r�y�
�CѷH���.�V{�f�ȡ^��m&@�5� I�(���1ЕpՅ�ld�BE��?��ԏ{����h�yll��E9�,s��@",
+ߐ� YQl��{��ޗ�!��#tc��VQ�B��/�d�g�A��GCD-�׭�&
���ם�Rd�Î9���0��$l�=#
+�e�o�����)_ ��%ҩa�n09�II���N���d�u�O��M-S�#����B��
� �}?:$H.��F
 �K��t|�!���J��|h��y����%/�-Z�F$>m$sJ��|{����yT㱁��+��w]/iN�W�HW޺D%�����<�@-�#�(�yG���sU-��
T����h���F�_U������)
+�46	��
+��'7Bѩ	�D�]���E����� Zd.��(�
R�#5ُ�XH�'ۛ<4����
+<b�'�z��7�ZD�3LV����%�,�vō�=Y
�����Y���Z�
~�[Zuc
n���(9|���֥@ϟ
�5�
3瀮��,"�#3�p�$N]W�L�fHϒn��z4D�-Jms�Nd�|�+#n���%� #�uw�,t�r�����;
'��
9��7��&%H�2KKb#>�	
`J}zf�Pqq�����c�	���|c��A���|xDHr�h#x����V�^�
f��v��!��!��:=�kJ�>O���+����pe(�S��@X�
�Yu��P
v���n��cĵ���D��vjr�9��ٽ@ u���*iv��U��u��I'ɠc
!
8�&�q��e����6@�A�Y�9R�/��LJ<�nT��KJŠ��I�x,�^��ʃ�^�r
X�=
��%�0�LA�E��z/i�e�0+��F�Ƅ�`��
+t�os\��ɢ�k�o�V;�ƶ�
RB��7ݸ_��4���p�_�)�M��C
�J%iE��A6�A�lV���~ѱ������3^�����B�{-��\�Y�ayHh�NoR8�r�&"h�,���y���
%D
e�d
��!��1�s,�K�1���K��+�8�@���ߛC��2?�#Kd9��,���@Th�=�9P!�H��|�~
+����	u�T0�y�4~z
�͘��;���PD�눭SO�^��;K#)+��~�d���cMD��w��C���\��I``R��S�	أp6�i+�z�
8_���|5U����C�"w韲��^�o:�^j�9�|-Nt���qBgOF
m` 
�����2�zH3�r��� �C���
���E��N`�d ����zN�Kl))(:��q��]����ؾW4y��
YmR<�Xߥ�dEF�C�z�2U:`��}��:�߮'hS�;�
+��
�|�
+�#T���>&�
�p�Pg��6�TK1�qt%�j���u	^!��s��C �q��\u�A���:ޔQ�ouӜ�A�?4���@_0U���^`�W����Ѝ:��8a>B�]�~�2$=BXM��)��
�gR�)^���&'
+T�POT'-+�W ������rF���e�>�J�T�ӊ��<�X�V at L�¦H���[�2x+V�}
�oR��@cH��
������bK�;��O��tR;��r���R'�u�X>��kP8q2�������!�Fص�P�A�`ѫ�p/ɞO1���~<����\
2!���)�����.��΀jR�h��ĥ`u�1#	
+8�)���LGD��í�v��@鳸3(�����X1��{�S
sF
+(7�_�
L.�sR'��JDZ�� ��
uH�}�T�
⤉b�Xqd�}
S��#2�ٻ1ݕ݊�u��}8xBBc	w-x�'��
����n��
/Y�}��6)Wh�1�;�+��
�Tn3E�K�W>�%�w
�j�܂A��_񫨊@����w7�tA�)�GR�>�kY���
��~�4%��o7T�Ni`f���X�|
-��UW��DP�;7��Q����!��lzt8d ��l�3�&��p8jH�$��P #�Ed/��@ 3�M0�v���'Hss�:�0����H%#Q
��.�{5�81�tj�0�IP�J'��i}��
"F,us*_˜��l@�I�:Jb, )�@�ݕ@w��-!��(�
��t�e��P
%&ŒSX�y�D�r�q��QZS2�*b5�VO̊
D"�']M!ʥ�
G��'Xv(
t��h85
J���CFSC�ݠ�W
+S��H�����B��^�r�ZO�l���}-:T�.��sǨ��뮀U�b��[#���U	�B�
+�P�V��p�
�� c�`�:�_�"#�N�*J���2��J2����'�I�����i$��	��GBC��@Y��πZ � m�!Woc
+=�I�E
�u���yZ m��oMs^�߆�i������u&!Z���	�a�Q������1
�&`� ��.���3ۂ�
�v���JN��&�e� ���,�}|NJ{�����,�<�yh���􉍕����ey[E9j�`S�Q����K
���5��qY���O��D�a���.�5�~/8�!������|���	9����Ĩ�B�-^,T�E��Xb��`G"���-�8
+n�y���\56�g	�0���=
0�Y
(;��_�79���H	#��̄t����I��G����L�
+Դ�
�ѐ���LBZH{�����$aXZ��Y�
\ˢt >�9R ���K$���Gǽd�t�N�j��W�lZ q�$�x'A;r}�ܸ;[�������<�s�\�4%�P�(H`M at o�
���g �|�mR��xp��h��n=��8��
= 
+8]	1|A�A�����ҨҘr��z���B2���(ы�L/�
�����a���
+�_����[�ۡ�)#u_VK;:�A�Hl�}���Y�D��h��@h����L��磣����
�~�ze����e���3e��B�h�%.UQ�M�'��\����1���AEq
[��_�d�%:���N�Fgw��G
+ P#�{*#��3�6� .�{
�̈�6%d.6;��Y�
+���Y��Īv/�{�x� ,X՘����I|��w6q�_
+��C�A��tf��B��
�]�y��6:L�A��������Gw��p��f����U��≴�@*���T��Y1�k�ɴM������#|����piZch �X���#���1�ƾQ��5�o�t�����
�Ϙ�?ߘ
J�(��Ȱ�����#r��������V��K�3؂�h�5�������
i9�=ɶ�^+0U�����~�ߐ�'6�/�eH[�AE����|B�J
+�p�"�h
G�fʡ��?��o���7^%;�E��\�r��8�@��k�I��s
N�n�D̆�&?��� p�U��!���䎘{e��
+K�P0��_����f��޳̨�2ѪVAY�b�ս���"s!fO�c��<�Zᙕ��i}���EC�$%�|�γ,����㴪�c��6�����1�w~�����h���p�|�O?aH#�)��u����IG+�>�iz/NEO��]
|@<���{�z at jԹ�̖����f&Q��
�>9b<�:f�/��"�XEN��'�}��B>ʋom9V���
��m����%��˒��u%��Ƙк�A��L��nF~�����NH F�̕M(&Q��	��ژ
�k$�T�OA:
{���6���	�htŴ\��
��^�|�J�w��fZ%T�^�y����H�%vbxb=���n�if����`��}�~����H.��\C&
��5'�ۮ��c�E�5V4
�&���Q�֌l�><F� �	���?_;�.;
6�R�r�H�0,��Ka+�>�PYZ	Æ
�Q84�
l؞ʆT}��T��~�J�T��融��9����03i ��N�qm%޼���"m�P Oa|�L9	>IJt���|j�v��T� :2�y�,2�$
�OAn�� ��CoA��yb�
����!�����0����S�xID$��b�"������:�L�,�?�
�nz���8�w��,�Se��[���?o�������j���Q֮����Zq���T�f,�@���
&�Z���";Gl�f뇈P8�J�{�L�]m �6\�/J�^
���^ ��	��{�2�{�F��1W ��9�'�A-41���,
נ��7R)h=+��~r
�Ch?'7���1�'cA{DA�{Y���Qpr%h�S�Qt��?`�ÉDEU��{��O�������@��#�(S� pl��f1��?��
+A�t���잩!\�-υD.���y*q4����<�^���y�k�l`�D�N�L�͝�)�ɸZ��m����m��f0d�(���dM;���Pf#�	IL{5�HP&�ҹ��l1�2��

�L��T
l�B�.p��g�
S4zIue���)oXƯ�4 at o�
8vw��(���U�?�	ƫ2rL��0��c��Hq<�x��PqQ�2v J�2�:�x4Jr��A��o=b�[Ny#'�o��)7
�
�`ũ��͋���
��>�1����J��u
�H�=�7���Yi�����ф�Bީg2�j��x&|}_g����=���N6��^j�^x��P=`s�y]5 ���;�/��
SY`"Ƽu��g�H*Y�Q�6
�F*��ҍ�L��B���β�Z���X
���^�
4�Db9�I�� ��B'�
+?��=�o�����ˀ�W?��
+l��{�
+-��ת<~���G��]����/'�*�;� %48ߎs�T{hR��Z�
��>m��%yy���R��z�k�z�
+�K�Ʉs�)�K
+�7�(B
>*J
+�Ո�uƼ'��
�.����Ȓ�a�$҄���1r���'dPr�I)�E��(ZA��
+P=�t?l��gE�c2d��=F�3�,���U�,wO�ǥ��x��`D��vn�P
a��OMb߹zLB��-(>���a1K
�?w>��
.u��y����4
Xp���(4v�ap�3��y��c���J<���F?*>U�'��>_ �4�
+��|)��Ҟ��/VPp��>�
8�a�3� ��K��W��Yu]�54��C�� ���H����9�^*�_������4�������3��mft0|������p��
�DJXC�'�/�����p
A!�|Q��d9:S�4�
��-�|]�8���^�u�u?�)�n���i�j{f��81�1��ChE�;�^��=
�T�@k�i��J��J
�a��)��|̓�
w�t��
k�
�u�>�
f�&�홥��BM�fx���d����pý�
9R�!r!���C��rs�^��EɘƷ�
����ao֜g���^!�ݭ4�mǥ��=۷Cݶ�5Gy-U(
:'*;�(?���B/���1ۋՎ^Z!�������r&��ˑe���� �x���ZZ��9�_�����
b��.*"T<�ɞI�i����7*��~ b�d���0Q�.bk�|C�f
�S��Zk���د|�������0�5�M{M.�,,���<��F�Ф�X����kc�1���g��i�\���-�D
Χ�
+�1�9�T�#�p{(�lEIL����:�z�s=�ZhPBa��^�����!&�9xM�_�d:�>�b�:��5�
Zp���@�{�p�Ey��9I�|�Qn<2A=އ27i/��ݽ
 �EM35�90��!�Ye
��w���8
+)��H_�o�Gr���R0�"�cE! ����״'�-"���(
��3��U�J�@
�̊;��s/���KeFR�Q�b�%��T�p;N�qz<׬�*z|m�$Yȱ�� �����0� ��������/ww�e���2e�w%�Mgګ��8	�o�L
�
+础����
	|C�z
����#���
�q�*�ǘI���BFDO���
4SQ�}��w��ω���~��<��]
u���	4��(�c�
��^V?�#��B7W�G�8O�JSaj$5�
5?`K�Z{�z���G\@&r(	f��ށ��@�����9z�����x
����L�a{�	AK�Z���Ϫ�a���LF9,"�s�˶`(P�{�8�
���,�:��N�OW >@�5YR?�Jb[���:��S�3���%��-5�p����l�����'�
V�#������L �ቁ�j����sA�
+���8ā����
Vﴍ�"���^�
a4az
O*�U�a%/'i������b
@6g�=�kZ�7伟��D"�{�
ˁ&�c˷=�+�|�nt�\�g�ᬢΈV$�Iև��R
۔��9jyӑ����g�ݽ��{���P?��q�T������Z�h*�h
E�=7B ���ugI�K,�F��5�B���nB=
���j�0�{��؎v?��󸚴�^C���$���)p�C���1ہWEnp�u�RD�
��8Q�h,��<-h
(�� �:"�f��Ť@&(��"`r/e=ބ�߇� �(�G�D�
HCo��G��}�[*���3��]���N��;o����̈4 ��`�>�A̧7xͅ�_SwG��=)�����1�Ө
+�H��~e�dw{�����
,5�B�љ�˳^'�
����
�nC��)B���K�ɬ-�LP�㙔�L�顈jC.�7Wl�w�����7�N�UW�
�?e�Qg5�̬_���&�1�R�/g��ǽ��!��Q�f�l
j<ߩ�#��|�I���>6����4�16I�l�U��Ofe_��i�g�
�"qK3OJQ�ye{SOg��d�7q�,���P���y���,
īO�L��x��˭m��>�N��y�%���M5}�,��[�oȷ^{1Qe
�i\��_�/��{Җ*�i�
���o�a�?�}�p������ķ��
+[.�O
+v�r�p� ��@!Y�˞P�I
+���-P#�z��W�IX7Š@�0�xo=��䈜�߾�E��]�����Q��u�
,
s^J���Ŀ|-SDWv*�t�q�i�s�a��=�nj
{q;=��Qn�8z�{��]�{uS7��<�=sDZ-?� ƒ"���
�|�!`��
R܎�3�K )$��`)у"3tx�?u���4�HA��
+†Q�1��M
^�NJ�wO�>�+JƳ
+e-7
M|��ߺ
A��*Y�r(I�`�z%K�Ql�s�3CI~� 4�&�
�8z` |�C
kN�����r�?]��9/'[F��+9�$#�
�{
Jp�d8���
\�}i]��ϗ�q	몴��*��J� bJ��:�LQ��>�֖Y�خ
��~��ڀ��^3{՝2��F{¥=�Z�R��V���-&s���AM��l�
�>&���J�UB0&��)���g8ܩg�	�́�
H�9���� =|lW	�:w��Xe���ą��h����(��r�4�Ac�� ?�C3h�]Ć^ $��K����B+�3P!"$a��\
D�#;2&2���mp�7��I�zL���૩!4CKcx���ׯ�Kx����;.�E���ۍ
+@�ر�m=��$���B$j�u?L	ZX
+�8ldCcq'{���o9aǶP�8\"�O1t��y0���	T�7�wV�}��
q��'E
+(�X��������۷�|�#
�i���19
L��3V1���s�
+�L�~
�y�w��a���:$F at 3x���C�������,�p������%����M����(��M�g�o�gg��T�GH���Z����x�4
��$�ƅ
�
?<
E�'�pS�$T�s�E�}�ڐY�����̖8�����*�G�i�m{
+������AA�8H��
q^,�/;
�W?-W����&@�J���Z�d��!���H����h���-EFn�(�%�{x�_'�����,.��E�J�ʖO�~����
+4v�x�����*w߳���H����PH$?�Bb/W
��Ύ!��,���f�G�>�
�*xV��|�^���������SU���7�!ZG�#�'��g�yT��� C!�t�J�|�������uߤ�[��O
��[m�Z�Ҽ�
zձ�9�
�J�`ā
+�R_��*S�*	�yɵ���s��c��u��R�
�?{:���l�(֟U���1���^
1M�H株~~��'9�����[�&����
����.�c�{����
�f�
��[ϳ��_��=�@�Tu�2"2B!-��� �@���B���O�p�v��ƫ�X��fI��@��@��GQ����jx�v�a� o��֞���
+��]�T�������`���1�,��
y{��_
+���r��
������(���)U��%SZ���	Ug�A�*�YL�H=6gD<�p(�W
+b ��	G��q�� ����%�#������bF����ܗ��K
4��j�Gx�Kyo[�:��aG˹=���H��R��ۑ�
1eoDT
)��u���y�v��%�����'�����[�z��@��l�m.P�Q�
+���M��
m�=�ŀ�ya����y
�d�K�qK��y;ܣ8ا����΂L�/p =��	�l_ZG&R���

�Q��� I�����Z�ʒĴaJ�
n�俘
4;�{x�
+�3���x�f�^.]
�R!9�����϶J�tU��>ǀ��]�m��j�xR�)^�'D�����ɻކ�}������[��L�H��3i-p}v<�����`G�K��"�����ߝs=N=�n
2��u'/��a��:��Sc�K+bf� {oy�!E�k�����=k/0��)��̞�hKN
��*
@)������T?7�vde�
�����ͦ��	�:QT		׫z6�^EŸ�	�g�j8�L��)�fmF����-�@�	�<��U�uQ�q914�DMIՠf�U��������������[���_�A����TI���'�
��#"�Л_
ku�NVg}|���%O"6{^��C�iJ��:����9
gHj�1W�b�P5
-�:y�F�
��
0���:0aG��	q�=쇢V��^�v���9{�(5t�4=�_Ǿ��Hi��:��<X–�O
+�?���c|�������~�����ǟ�����?����_����ǟ�����_~���ӏ?���������?����������8���������?��}�_\��_a8�W�����1��+~��ǹ�L�>��d�����bcv?��KAL`�h�f6N�
��@�D���O(�㪄vq�O�%4f�Dt�эxE�o�̽���Y?2����2�~�hhO4(�J���h'{G� }� �~>RC���?(�6�%����s�:��J��0Fz�p
�Hʠؠ�,,�L���M���;��b
r���
+�e�wv��΋|�&��R;�H�
�R���Ŧ,̇�{�u
�K���� ��"i���j� +�0���
k���9������=�5��������S�q�04yH
ķ�A{X~d��<���J\�� �m�C3�Mܾy���ÓƵ���3c���*�
+yp97Ⱦ��Z��
�m
�t�M�~PH�0�h�7M.����� ��n%o�bai�x���
�2 
D�fmh/��y�Z��	)0=6xx��Pr��*#��<3���X��Y�r�:?�����xK�3���~9��������?썀k�0���5��^�I����W���4���6Vz�:�J�
E������E�8l�$ן|����ޘ��1�2�G_
���,�>&���:���V$�<�|>T���˰�3#�k�?�Q�ɗ�
�����E$��@�HLPϥ�Z��
a։c,k=A�s0�02�K.�����k����@�y7Eʙy�|D%e���)��zBdV
+�f( V��)�h��hcW��V~����5)_4b��g����z�^��a���c֨
��ي5
z��u��AdE���
|>���V�`�;
���,+Cl���i]��d�1QW
��R9Z��S������l&�����S����͑� � �

�G�25
�i��Bbh�
S�K��%c>!|��qw��3��@�>`��6J���=�A��.
+����&��:EĀ>~��9��
+4E�v
ȉ�}�EF{���s�i.s}GeZ`n
+�Q���:��:x�]R��U]���
�Y���L;�
��4�%�=����C�"�������zh��@��z_
��A����H4�5{/��<
+
M$O�=Pw�x�
����l�eϊK=����>Tcp�Ȍr��b �F�0gDž��~ 1
��_z	~��
V���
�R���3��f�0�}=���B��r87ܽᨆ
	
(Xp8(�4�v�&I��C@� 6��!
�_)� y)�.>���7^~
LTY1�=��*ȱ�����5
Q'
+X~QZub��jp��(S|�\DkJ�*Td�Ġ�䆇��
���S�!�L�>
+�!^q��@h�M�Ϝ�f��W�OÊ	ѡ�y at J��4BT�D7�š�
#�@�j4�W��j�@����,鼣����r2ů�D�)�>vgM�~2�mܿ�4�X�|}�C��vy}����վ�ɞ~c�l?��0�J�w!�_6>k�$�ᢏJ�|�+5F>黡6����
�%
��ܱ��*��?������r)��q�S[?EI��w��9�a���>���rI�)��p;��/�����PwΡ�x�6�zx�3I�7B/@�HvS�>5&~`~��Ve�q�Pcl�[����0ɝ�����<U*�Dc
&�x�.So&�
����
u
+�gb!u
ͼ�:��7	�謪lP�G=J:H�
�M�z�~�46JcO���y+
;�$�b��6�Zy�|v�PFؽ��Ft*e��ʲ4i ����A��
P���L
��~�g�\G�"ZLK
NJ$�[Lr_δ7z��1�
[!	
���nA-����
�rY�<�,����d��p���5�퐁v�7y�3p���Y�bTTՕ+U+sؠ��a�6���h(���hd�F܄Տm��oW��Y�/V��z
�
�)=���
�%����v��t����~A�̪C܍t�0~.v�E�P ;{5��H�[�U�3m��ɝ"�w��H�V���1�hj@�1�<N�����f�OJ�h�����E��q�e����-)�2Lґ�eF����DN�cA�&}<K��!��Ht1�#���@F��:�t?7 ׸[��mP�AU�(\����!�Lq�	C1Ј��a�/z��,���(�'���8�wR�v�6qp8re��_��:�3��rv4
7a�������Ej���3aa����+��
�r|��#uZ���xA-�O�xH)�
¢
	\���
�r�/eFJ���7R��*ȆQ���WBDH����e��G��p�?���Ȯ�5v��kE�h}�@f8�=�[㊪� ��w`��0��p�|(
췚��~~�`W�9A[_Z�bkS��Tj�8�wÄ�A�t��֪�p=�T����
�.�a��M�	ɚ��k��&���QM۞H������#,*�ld 
.
�h�Ëo���/W,~RC���J�AT"���F=װ�1W�
�_�
�F�����V	��0�ۍ��{��z�8�7T�B�Ž5�b�������t
n%�x^
�	dx��t���G9�� �=��o
��{�>7��D�:+mDQml
�� w������%�}�ep4ml����O���sw۟UǕ1γ���m�<�R+�J���?Gw�%�y������M��0�z\��1(��
	��p�0�N�C����
z�M��šau�j�P\"׫N{����n�fL�*����1mx�/|��(.��x�C�[�������F����
�@9޿cj�ܪ,{܏�=��i��Lp�|k ���/|ndZ=!��>�m��#x
��q��Ƌ����M��	X


�ن!ΰaJ}���#)
ڮ2M�Gp�b>�QN���GC�b7$t�=��1~Xe�)66q8�y�=,v
+�t���m\ok��
��W
9\�~��_46�"��{K����z�����R�V�hx���xL��ժ�
A1��'—�K��,�A�c�T[ۯJ��
+h웘��g^n������T�� ��Q��vۦL`	�2A\��-�v	Y�
+������)�s#\5eBYx;��V�K�AjJ�P_�$
yC���OQ'��	���O�Xr�;
@�`rY0�ѐV'�O

�К؞���&�I�P�Ut�̱�i���ss׸
0��p��~'��T�t��CIJ�c���w���h���h0t�:����}
+c 7�^[�B�"<�
���Ͻ�?
+���;
o��i�k݌w�\���T(�͊��>bí�A��y6�t�Cp|�Y9��4�q�`��y�
țMq7
��A��j�y�-8�����b�"
zΚ�����-;(��LCSM���4s��8��ƀo,J�{%!
z�!}�~r���N���m&�&&vR{�Z�����!�o��EqX5̥��I(��̨
+61,�9�
cR]��.�e<��Q��o
+8�q�k��
I�R�sJ�{9�'t��
[�fV�4�
h�ԩ��Hz~��
�OX2�
H
؃m =(�Ɖ
�zk����W'M	+CW'/'���u��q8'o:bHFC`*P8Hj���5f:�΁���Z=�7p
�@
��?շ��� ������0=��@��D~��!��;�$X:����K�
n�w�W�n6�Ӵ΁��Ϣ��;�B��k�k���מ
+7'�
���
D41_��
��������>�zr
+Z��x�.��J��J0ij
)0����
+(Eԏ�p�r�G�ʫ����Xu<	$$�"� l7)ER5������N��l��I���*�
��r�{��o
 ���1-
���s/ �Қ
+@窦�Բ���M����W�����|�{�x\,I�N�����8>v^�4ĝ�Kk&6� �z�h�ǖ�(.|�+���~��>JN.��$A�����}s1ЍI}8��햫�f	I_�*�
"�b�c�$�#�^��䘼,��*S �Q"��#�5ΙJ�X(}��ep��"�����d�(Z
!ѷRl�#ʘ��[t:

�(�.��	����B�B��B���ƚ[M��9�8HMlN��j�'�ii}
S,��E�-��xk�'�Γ}���{_�ޚ�]����
��#&��:���
�����O�֌!~)��o����JHiO�@ �2���p� �7��
+(�EeM�%n�����-ԩICb����CR�
I���z넲l?��EE"��1b4ݫ��1���<3qµ
�u�`ޑ���z�܀�U0�굳2�]�z at U8N?ފd��f�f���[A�)}�)�<�
�BN�'(�
Gp��!U �P�ю;$oHJj���H;��:����t�)�\��~��'�o�l��$`/���U���`�!�����k
�cD�
+�_-%�i��@	�ʿ�7���>e��h���k�\b�z������}4��z}��C9�K/�
7
�lC��;�w4ĸ�����=^3B�
��qxb+�Gw�R�Y�#{���kq�����v���
+'�=��
8X+�G��b���B51�sd�9Fb��~����ݮIcŚ�X�=D��ȝ�\�`�83�=%G	�PG�"l1Õ
+$bd��
�=��ĉ ���`�)�C��hC
��#�Iz��	����Ǒҍ!���s/j�1J�E7�'2�׺jI�%	��\o�;����
��lpQhϑ:7�F_�
P���CY�b?N<#L
؇�!Y�H�t��
`�%��lk�̳G�9���X at M%b��e&o(�0�k���W)��o�:��h�!���G�s@; jg�~5��S�q��T^{p��x���I
�[�)Ý�7>�9�ǧ8�8�P]��~�&q���Dw��E���?Y6}(�E�)��y܆����-eq��5 �����7.��	�h;"B�"F>B�
++�E�3~4T����|�d�	�	�KԊ��D�I�/>v�Kn���Ʃ��g�&Ǫ�v{�-�l���Q6k��8�^�c�|���h~h�b٠<���
��ܡ�7�b�W
��U��/z�[����F��+��m��_땰��#��:��
���֒7N���@�n��/z|^E"����
�J�X�qI=&Z[�
�-e��EX�ѐ:;Z�ek�-����\y?��
�phC�� P^�kg �UB����F�:���j�2�?�1P-P���@y�I�Z�(�ֱֽ�$���,�� ���̱���

+f�Ud��z9 ��7�a�
V*Ho�u��j�m�g����G��'���-�Z�t��{P���
+�|j���V�P�M&���C 5W�'��JFq����� �C�I�C�E!���cb�����.�A��;�!Cl��ϐCU�aI��U��7A�|���To����J�?�R�ȫV��$��%�����z�ȏ}{�O�.p�m�@�T6)
+�#7����8�L {�r��uk(ؕ�!X
��r`DS��@
+�U�3۰{��Ϙ�p���߯��d�
+�8�v����i��&���9�u~��>!e��}茤 -�E��@!q�Ι�����`*��۹�퀀yu�:4
oO��a�a����֎ p��hG*���-���<U'r����c����hw<�7J�Dh����}e)vm,r���P�U�.�׍ɡx�KZ۷ Q��K4�.S�-v�(VX��]�0{
�kh��%6
��n��(�td�����^$��:Q��
��i�с+��8�(��|s�����8{Hm�מq
��$�k��L�F�����J  w�y��h#���@;�^/�7x��c�V.�:{o����ؔ�G��
��V�
BM�=�b+\�} �
���l��ݥ�
�”�������z��r����Ù��E'�!o����VEh�ˠ
[ě���h��Z��è�]�.:ǂO��*Y��W���S�+
 ~�TӵD�v@�R��7S``y�Ai^�ac��Q[t
p�z�
�B7�0=���l�Lv�I�8'P������� ?�
/�a/	H�Д��Gy�Q���Ӎ
+`�a˚�����W�
3�2�.����#����N�
�W�E�2��B4��ܫc�
�B&� �hs���! ���v
ʂ��
+�=dpV�:<%��~{�WX��V�t#���GP�j@ͧ��B�A�e�"�<
�-��B�ArU��gbU�{�� ����jlP�֧1���i�vr�p�����l(��iGA0XJ����:;U���Ɂ=�@)b?G���VA��kB�X
u��Z�u���b�C!�T
F��T�߻���PD��}����G���swA�rwG���ܣ��
�$D`��]�b�
D�3c�ےEzS��k�'��
+� �[
��z'�ft��|Q9;,wK�k!�v~p�V(��	$Rtď�oJ�����'xQq�D*�))�p���'r��n�4'��W����L���zL( 8K���)�G�&8����}BH�����w���W����f���#�	y�N�IՐ���Y�q���-��������#4�gV�O,�Cg��=ˁ$��
��"�I830�'���W�
+���� GFT���Ӹ���꩝����DѼ��$����@�/k$�cQo�	�&CfQ��l}@�`�zxFr�F%��}�0A�EM8���|����2O�~
+��f`����d�^8��R0�@>P���r�j9�a�,t��@b.A&� D��
�+ioVû��
+����CRꧏ�A�:�F���p���]c���Ƴ��&���B�������X�
͈�����o8�A<5���ޒ*�DF�O�8�� 
Vm\���')�����ڌJS�]�P�,�e0DF#K*"����[��QaI�ؗu�]�z�|
������)
+P����F`�^
��L�b!�����0xKt`
+�V�wp���d�=cف�^��)E�U
&n�i$�CFeBg9��v����y����\�
���x1j2b�4V��x��� �]����L00�$'BO�5� ?�B�
2�{�:
+(�l�s�ow��
"����F5�9�ڶn>�)'���<�K<j i"�wr��0n{(H�R���J7�*G�7�Pr)i�0#��o
+9��;�A!<k�ԥD2��S5p{;pM��IA�
3�+B�
����*k�����c��3!>�
�P�}��@?���z�{
+db?�ا� ����Z&)��ߚ|�L>{�d�k�_CR̜�D>��
�Cu�Bz��lOߵz-+��;X�y˚2�@	��T�^(i
�dy
K�S�yvl�=��)pH�8��uKN��%�+
+p�EڑS��U<�v�O���<^�1�WP�_
+g�DY�4\;+�jTX�ye�;�
�R�C���dIJ��k�*^X&����*�!�s�Hd�e�a
�v"�=#�d�����T��Б=��`v��p��d� H�+�fs�A+�rb���I
+-r�D])¨�K^f`A�d#�P��%
>�5�R�~�ʊ3j�|��`
!u�%
�
Q�z�佞j
�����8)�~���*n��Gb �%Q����
d�I�-���w ]&�e](�����&)�/��}��Y|b�U.���%�
���杕,y=!
l
��������ڲ-˫*���-��(r_�{U��"�ت
��ܧ������
�3��m
���T����z�[����ؗ�e-�W�~i=�WP}�m������`�d4��e�����z�x�u5�˭}H1a
a����k��c�jE��Y;��4���ID�~��D��>"!�2 z�����Bݟ��Ʃ	��=
�O�-��~��.�~�����o��ߤ����y+��u�2�R����~��ת��5�[
��0}�zb��TU
I*`�I��^hr�
�0�vI��W&��Wa���!vBb�H��zS
����ppu8�{�>͔+t
za���+=ˣ
ƃ�5�2�
�5���Ƞ(�;B
�� ���^%�-ŀ
�N4����̒i�
�p��E� �/곐�G�[�j%��)��N���eUS8�@��74\�_�cK�T��$�ᶥ
����$A�`Yn��1k=�C�N��V ȉ��nY~�,@LӘ�^�%�f"y�{?��pKZ�"�XM�
���3�ȲY���6c�;B�X��M��
h:B�Y�m�;K"SC�x�u�
�#~�
`~3s/��
�|�M� ��u8��B�V�D���#�:�|�2�[
�
1G��m
��
'�פ叢*G����V��k?�">
+m���L�,�̈Z�Ѯ@,�
V��8F)��$��p�%�
��}�I�t����>��h�k1�/9}�=䉒�'7���S
-��w{BT�p�Pvڥ]�c�x�W�!Ѷ���~
m�
X�  h�$P��hIc]y*�����w�
+f��������8/�󕻽o%D����\�n�a�
��YvE�5��:e39��
.}�9��ef&W�t�����
R{L�&XQ�DgU��XL����g��_�\`Np
+�����K�["?�r��DSqS��o�^
���u�
+���8i�)FH��ʹ%�-r"�a��32���@�.�CH��k���]�!��/
q�ҬQ�Hx[1��,��
(X5�]�{�b��JE����� ڟ��>��9�a�Kx�\!�d��{q���p"���==�5��]���>#?0z��!.6�F��*J��>)�^]X a&��-�	a���M�`�Z3E�����:�{g,��b�P�*
h�uC�q��N¹��hJ�.���H���
�f���pJJ�#���AFla`g9a
N�)��!�T1Ɏ�4~�޾>GI,�:eOu��g��iU�mK�:43��\�e4�o.u�졅,I���$v�q�KS�����9�#���
(��C�����
+�t�!h�h��52;`7��!�%�T���X�Vxn�,�zz��cX�ڱ��Ҏs&�mlJ
$u�94�m&ݤƕh'��-��,�i�iQf�-]��[��|
�O��^�C�Z=<F7�6y���Ot=E�
{)�)c��B�:�\�a�J��
��z �-�GW0��D,g�$�L�y,l���	�P'�����C$�
�O%���8�S����`$BM�%T���$��`�<3����p{b7��~�j�pJ7^���������;ܦ��jl$�7��&��/:7�8T�`t�2S��F ��;a��0DY'�C�۔/�P��t4��
��-��F�/X�b�#7�
b����x}�~��XԉQDH+s���ɋ�T�N�B�i8�G�Ú>j98fȊYG����)��+2׍�&Τ�5	'~��BZu�g?V=
���羈�^/�7�
+G���ق@�1�;
yp�Є�ÉW��D%@��
+6q��SD��2��W~


	�T���JI�\Q��
'T �D�H-c� �}��dCW^) ����6�E�V�HFNT�m�Jd=|
+	�0�Z5�P�
-���=�W7qؽf�4С��"&ޙHH�l���
= ��u��p�;�]d��E��N�6�[� ��5/*Q�������̭yi�2��V��P�ޏ�@�edB +ř,u�8
��n���h�i�KI�Rh'" �y�|=p*
+ ?�K1
+%U8�
>�Ml�M����;2��]��4�i2��Ɉt�8�
�
$��#X��o)^���,����k�E� )̿f$vzN�D�T���G�ԓ�ץ!��I�'����5�$BFF-	
+�ku�MH���L�Q
����ѣ� �yRP��A��y��N�Ȟ�Y��όß���v1�K�0l"�ZA�C�
hxO�I4N�7����&���p��je
71I�x|9����ٳy��$���{�1
�n��.#���!�#��tD���5�}� ������2�Uޖ�Č�a�>.
��^�� IFf3�͑2��ˊB�!uꑓN0�b~d�l���p�iz����
2�n
%ꑲ �Nѧ}�|Ѣ8v��ɦ���
u��p�)=7��W�i�����7\
+#*���s�e�F
�F��!=��Ժ.%���=�E�$w��nz9ۥf"�>�$S:�3�#z8���
Յ
�j�3洪�yOx@���z`�;6u��}�p,�,������~D��
+��8	'd]Uة�Br��1�����U!x��� V�
ǭ�}�(̃DbU
:稹�~֚ ��PY�@G@�n�"�܃��>�4v>��4|Ϟ��Y&'��3#�a)�E���2Ҩ5x�5V�&�c� �,�

t\EN�S?Җ���M�n����a�ɑ�W���X�EDЂ�B���_�
����
�`Jr� �pq#����;0�ڰ���n���ݖ�I��~p�[�3q��x�:V��	g
ʴ�[�57�����ju-�;��J`\z��P�&�ꁥ���RD'aa�x�^��!�T<F;
�
��Jv��;��n9���ba:�I,���E(g�Uz	��g�!"�r��
o��#C>�V5d�X����p!E��ds�|1���I��u&�T�$����\�����2t�r��-��O�P{���_�M
�:�@\A��]��Ҧz����R&��=v�Ò:ͨ��e>B��
�J�W:d� ��n�M���?�
i
+u/�X�*{:۲kV��c
i��=��e]�?#"�Ѓɡ{u`as�g��٘�k�*L��s[�~o�7L ���~��9�j{AA�R���k\��H���l�5���EN�6)D�=`ҡ��>]�8P�������n�H1�Z�1��rN'��'�����w'�
�{�q��QE#�� ���\�a��@�����KԠlh�4_� 9Q�&�0`��+$��Bh�U�>��>��:���EL��6�K������W�z4׵9&w
6	ӣ�/��5�J��{�b����-ޡ�J��
�<B�"�(�,u�Bqb
S(��ւ	𧹴��Q�IzH�򵞃Q�z��dF���o?�\
	��T�E����R���q`u
+)oG}1�ֻ��	2��י��P֍vC�~F]�v�
+f�� *T�	�в�2f�,[������p-A[P�o���oi!"�
�_�j�x�K;��а��g}=f�)̚�k7�=�`
��
g�Ħ3��Ob���$�Y"/EQ}(lgfL���զ�!X)����;�|�W:��#?dT�+����c5�(�:N���?[?�裪vBV<p}d�F.f
)������@)��+�R(w���
�<�g ��~�J��,ɻ�
�k�>�K9��-�rͬQ|�+J�� 
��U��,n+����Qz�ܢ����[���_5��W
�W�\�_����F|du5 /A�3�CwY�k�{-3��{	�B��ߝL�
�Z���aDf!|2n�y��p���gD�Ӎ�BQ��)�8-0Ʉ1CG��X���=0fHKŭ�7a�Z��Ь���z��&T���ӭmy*�oTw���DŽ'eS�c/�!:�f�Í�?�����M��?��C��e�X��]�dv�c�W'ژoKlQ�er�5Ef�+��3PI=���$Q��
���p��hE�2@~��-Q�
i�q�����l�a���ꄿ�$#�C�^�(,�@6K�}NIC�<i��	#m�� �A��(������h�p`��U%�41GcJ����-�hS�i��R���Щ��̽`�Qd=

Eq\jJ�Gc1AS�a��D~k�
r�N�s,B3>�T)DR�)j����@
:��<.���Ӊo����䠗�I� �a�
|a
�VT��
/m0�vyi����@TI�
� ��i0D�
��S�����n|J�J��[���֔��ܴb��\ݤ�[�0�z�5F<]�q�B�η�z�{� ����l<ZT
+�
X��+�
t�y}T���Z�zȔ�)���_<�ύ
D
�)`v
+N{!F�rզ�v
+��׀�i�z��$��:�j�o? 
( �7�N�������A���
+�
<�[0���K�pG�s}�*$�
9�; ���
�Y
`�<���q��Jx�{��h���&GՊ>P+)�/
�!q��͢-�}��
�#��m�WCl�S��f�ݷR:�u$-��瓔���� ���H��T�W�œ���� �����$e8P�T��Y"�P�S
W�q9M����/�JS�Cq����)��<0VP.�$h�߱%�u�;�,�[EF�<�v:&�u4=">b9�v at U�����1�h�[�;q�l
N!4�
��)yy5y
���>��G���[���
A�������łf
�{X�mo�A�~T��U�UT*%�=��!&�����|^d���
�����D�:�Y�Xy�(� ~�uUW����F9�݌p$������l
+�
П�f���Xј�R��a�R#my��Z����j�Kt&
����%���Pp���ٜ�*p�ed��[b��]��ޭ�	R%��O>�0Y�R�{h���w4s���kD��!-@�� %�G�>@Ԛ�G5
>-��V�@V 
��mM����9K�25QjzF�:�H
+�G��[�i�ZG�l�F>go^!:h��C�I
�2B�
@ �Qd&���#��~*��-~|�%�Y*�Z`A�@ݐ�8��<u{�%n8��@K��W;�L͝�Uh��/i�*|�RHs�

�(=�_��ȬA�T���J��d �E:J��|If� �F�W� 8 PS��ї��͔8W�]��9_��+&	�NS �!����f_*/�D��yQ2;$��a�G�z�
�ӭP
��UF�X����4yG��AS~GG��V%g���[��ih��|O4W����O!{O���UI^���Pf�
+;�V�A>�h��i��S�ߟĩ,J�ʕz��K:b
+;Y�
���̜��ݥ��F����$ly��15VQ�2�� 
+�����Sbv�g
� ���
�Y%= �C*E>�&��#�R5�24m0�J��O����R܋
+�׉P���G�G/Ȗ
G�ʒ~�1��/�ІŸ,ę�	��鷝q���/Z��B�
�
�� ����-W�o��6��z�py��ԟ�^�қ=�i�{u�{V�Q	
Q	}���"�=���S��A�[���a�k���l�����@�5
+�t��[/�H���;���%
0���
�)�A�Kf������@��*�[�E�4+���>~D�FJ3��Vt"�I��t��h����
�gb31Û-Կл�	r����&
A/�
+�2��j�8Xl&L$�U�Hd
�
+�������.p&��|��p�' v�ީY?ϑ{4+I�k�F��,�=r���Ȁx\�
7l{�L�ݒ��D=
e�zH�
l���8QV�n|ԟA)P+ �����p<�]

I���Q�UYv�{(j�>�ۑq�yQ�Q��B�Z�����
v�������.��F�
{��~=F�-��rv?�s�P"O�\���W�FK�Ԭ�	3�Z���3뇰ّ���d>���FAܓ�H	*���
��֝!kP��b tm)q{��9�%��r
+��]�wE"���n��fy���4t#\�/H�p3�
Π>�˦
��ޯ�Y�C��%`�{�ƺ�R�*g	O�������W�̪��!����7�� iz��p�b�Ӱ��g��H��A�Fm���ӃU^��<�����@��
a�r
n@\�M'Ka:0Tk-ȯL�DL��1E�裡���[g�h>v�%
>�8
l���M-r��e� ���2= �C4�+��
f�u��֝��o��.��JBf��-�)vI9���Ҝ����
ӂ��eATh
+و�qd���|�
��YA_�o����&��c��Z�u
���p���-ԋqn����z���L$;vL���G#���Y�a�����U�(�S(mx�L�}B�晄�������<��/�2�Qѯ��Q�1u%s1]?���Y!��%9������ĥ�h�O�_���dM#z�N�
yR�Z�}vZ�=��p}ݱFQ��1��„u_�	oU�x%2�
0+���6D��Pw����&7~��qx�k�ܕ
�R��w
�����/��4Rw�8�f@7b>��sJ�D�����V�~�-�@�.`�
+������`�/�P΃��m&��A��D�v�
y��^�sMr���ppA���޶�{�BR=Rf� �S�X�h'V� ������O
�Vy�@�븅6�@�-C��f����w
A���'��_5���s͖b�
�~��U���᪡c';{�J��``PL�v�cשJ�%� Q�3��B�
� ������5��5_�d;�pdoG�zY�`�GX����uX�r��
AEF&%6Ԉ�:�l(��l���}yk���Cǂ+����Fᣡh/<���ƜF��j5�~w׽���v!"	��}cW�.�5��\D�z�HY��[��U�G��zx�
���n�1�y�uj�SZ���q8
vܡ��0oX�qw���oU������G0�J�k3,USk��m���y�B���n��(=$Q�2�X�'}V���NL�Wb������(� �w�\���<�"fD{�HU�ئ�<���ߨ��<�Ÿt�B����@o,.�S��o6
L>���?��Pt\>e9�H|����
_M�� uB�ܓdя�
��ݫ�z����Ě��9���+�CO�1
T��
��qxz�أJG�[ ��WēNv8{Qmf�+�H��DF9D�����.���Hq4�!�g Ջ�ʁl~k������ګv~���P̈́����Sb���!���IF�B^��$���'_�:vʷO:�y#B��yz��ˆ=��a|�=�=ӱ�۽Ԕ�3��LQ^1o`�d�#�]��
_��NKC�

+Q{h^?> ���>B_Ɂ��6�w�R�#��;�Х��%܅TRAr�\ի���~_S�}x]�J���H��݈�B�:����
K�~�cJנE��i"i�
+ Uy.��=tM��N�
�
�������
+
i9��Y'X�`�g�K&��?r���^7��VcF�N�\q^'��Λ��pL�RF໥�!��X~�2����=�Dw���z7�/J���k���۲j$Ep�z+���8�o=����b:z���QH�vi�͂X(�Ni@)����
�y��-�u��O�*X�$2�;��Ђ��I ��t���v�Q�~��Ѣ*��&w_�:�u�Q]i�+� ;	
:^�v>�����#�b�
��
_p�p���7��C���p|�;X�c �*�A��p�]�z�EO��Է��H/�u����_1��>A{�@|��Ƿ�
��ݰ>����݈��8�e���5-��L8���}�

�,�=��&8�fD,�[6�{����<�f�
�2f��]� nC���&��K)��[�S`
N�z��
$àj>'���tg���� 
�C�;�`s�w`�pe�4*�/�����j�����������e$̓D�%���C��=�GH��K
�d�^)����f>�+e�b��ϯ��~�6C�!�8.��3-բ�ع�
�p}t����A$ܻT�G5�l��B��2�V�f� '\��,���GF�8� �����o�U��'\q�W�
9*b�\�4�%��{��S��Q�u���;һ���#nۉ,޾�0)�:�x��z�ł�(y�{�8�q?7�L�\V��!ʢY���+/�m�e�'�ƫ1 ��MFR��-���C%L�x$?��#�7 ѓ##��*��+�@?'l��3?���z\��
Q��t�q�&Cf�
�}�$��MS�S�s�{�y���֏� �$�<��#��$�i؋��;}E�PP��\���{0'�!�
�ܰ��B"x��� �2�� ��P�q��ӯ.
�s��
+5�-�0�%,.���]�~&1��G�����O�\kH:����������h�Q�
A`ĵ�ݞo��&�c*
�du��?b����_4^�.jPI��
�sBzw�8G�q���7K����}|	��J�ޔ$6O�JX�r�͹�j�Τ)Sv�Q��
��0%���(.}{>'�
+�z]�Bٰ�s���u
p�ɧ��BT!\>�/"��[q�2�=\9����U���{��hq��M�H���?!�Ҋ ��=��\��ի�kvт�ʺ�*Ȁ݆x�G��v^-'g���Y�sX�����(q��P	z��Z�i;��A�"w�뺋��w���
V�Ѷ$0�!
$��q��4�%�qD�5��{3
��|�z�:�}�)���|���x
�Z���
�C 	?7�P̒�"�}�R}������
+So
+�]���զr��5
	�"`b6LY\�m7�ܚF+�
O��B��yj��
0۟yo��S��LvD�T�)dj�0���oA����/m�ύ+���E����N��5�b ����_
��Y�|CtC�68	�.����`��)�0����=��c��
b#��w�����$N��P"�ģe�
t����|
)�g:��ݗ���~���r��� ��^!#8���N2��]׏ �G�
�����?7�w.�Y���d��_� <_62�	�g��
�%�����TaR줸����Q��N�	�7yϧF��!�7���tV� ���
P�%m
�z���]�{LJ���S(u3r>"c��.�~^+���
}r9w��Ȥ�5�4�L�Hf�E|C��K�1Ph����YpC}���Z9.t��HAh$�-����B�u}��,�K"��D���~H�{����������~���㯟,������������~��������??�����?�����?���~�O���������9N��7���������i������W�N���������Q_���(�8"����W�
|��@2$�.�&�����=H�h�Hƪ���� �
]�_̅�[Q�B��N��{�A at Y��d�Vvn;����

+yG�
֬��z�C�&Mk�̅�Q,_{��!$��`ư47�IJB9�	��fL)�PF� � %�Q�sx���Q��]�d�,����8(=���
�5Mg�)f��+z�?��:�y+A��[����
'ۏ[`ֽ����
��F"�Z��Nu
������Z�T֩��7����
��u`>s-i+���
��u���<���;_y��"
�H*y�
�|X��Dց�W��8`�P��qR��f(t1�B�&y~[x��e�݁��$�k��G�:��'
�����Ћ�0z��î��Ӱ�c��E� ^7
 
�
�#���zO ��^���K�[Jv����0��� ����W me��9b���QΎ.�f�t�qtED�H�����  !h�Ǯv��Q@���U+��������^cZ}�
'��������vT�e�{����J�E��W
S� P5`5�_F�$��^�Q���}.��P�+_|

F�~����.S�%,
+l(� j'4�ٝ!CB��S�w�^�f0z���K�B��U�8 
������� (/�%E
>��G(E�Nv��
+�^2�H(�����EQ3.�Q>��,G;�j����>���M�Jv�i�h�}��P'g^Q�'_�
lH5L�	k�U�s$�Y��_~ѣ�m�
��J���B
�Z��dxxb����|���@��Aެ*r�>�
b�|�c����~����Q
wYO���1z��j�j����g���� t�| ��a
����_H�>QyEJ z��☢VJ�-�
�,�A#
�)�L�ʾc���Z���@�H=1;VB=�N~-3�Z���R�x0�MϴE*���N�
���ݜ��ٽ24%���Z�y
�c̢%v�*��f���=0��޾ŵ�}��Y;�BғH��S�UL[Ԣ@�p|P(���O��
�1L�q��(,�ҬU���=<��Ȏ����i�����N�ut/f)���t4JIF:�
��j�2����G��J:=��B[ �11e1���׍���֨��^�k�
��߯�~�I
+���PR"�����95��
+�(A7�

¹WD#y{���K'{s���v#���h�
V�����wb���=c�V�Ї
�=�3�Q!H�c�܇��:����Ñ^���d���ؽuΔQ=�
T��_.{�wq,�5��u���k����uxk���
+����2�c����$�o��A#5�'�%���V��{�
Hxӽ
l����h���i�!݃-�l�Ǹ*k�[�p��C%�V6���n
�y?��{�^���(`�=
h�%3�&
���,"�'�@�0`�\z
^-�I<ʕ�\ŴV1|^bd75 pكG�
�؃���Q��<��
+y�tO�ĸ�[�#��lqET��ņ��|I���ϑ|����x^�������h�CS ٚ?�^-QBQ�׉�D��]2�at��D�
u�S$_�����+A���3�
���7�b��n�5%��%cb���zH�7d��ac��߼2J{����=p4[`S3�W�ـ���
+�B
Y
-rȁ��b;�ŽI�O=<A����(�Ǒ�Sۉ
ZY(
��-<!2��M�ϒ�3����Q�`�Q
=�k
�9���>A_���Ww1%RB`�F?(p�Ǹ��Cd�����!���|b���ٶ�
�!;�~
q z�t��\�i�9<�,ӑ9�;_<{]�V��4�A��щ0��.�AYh�uv��_��P�-!�q�
?�<�PP�!�6�����D�^��
+�E�y�~4���{��;Ql8p���^�M�8��\�hy4��í	-��2
��-��R]
��	{��NҤ�8�f��藽�/
�A+�u�H
ݔ�綮`���	�:�<aD�l$������I����
��i�>*�{�#�⾔q
u����r�
v2��t^j��$��ط���{�)
JE�RE�}!��D��5%n�M���� ����m
��q�@����*�l	o
�ۇ��ł|A����֣�r���Z����Jb�i�y ��pkdO�KY�st�̂�
�_D��{�ȦP1Rd��p��8`�L�&�
�J��
2]�
t�B^��){~�
�oH�pBL�+�JH�~��V"��,CNѐjm�Yѥo�m�dk�[�t��)��8؃������^4:
)���P5Һ��>��z,�
���+���^�������=90d�] ����D�	�D�"G��}(H��7vO2G��^$/v/dGB ͕���E&�8y/kY�,']
+�.jJ��LI%]w��7���ǖ���+������oo鱣����/G�8S]YZ��C�p�s6�4�F$��z�C�����#J6��.����#�j���z

#9����'C8��)��(B�=
wg�Cczʻή��x��(a�#ʧ�үDw7ҵX�k�� �p��r���	�:U
~���#��d`�ϸ�4 at _}|"A'�Z�X��J��ir��z8�C"��qmG�ٕ�NK$��+�}H�{�t������}�D��&i��cĶDe�<���%�Ιƍ��c�C����
�f���
�)��\a�i���D���
+ƕW��+�������O�d��J��
b"|������,�-�b�H�����m2�.��J��_�|��Q>��9Ay���2�����	�ڱ��X!��.#�j�I���\V�C�WJ�
�pzXK��+-S�
؃�a�#A������q����y
��9����m���X=. ���w�_�9��A�kHY�@:�B��}����a1q?�ʻ͸D�{�/z(�8_O◍P/&�gD�Mf�0�By�J(GpI�:Fe�;���qw��ؾj�U��I�=b
;��&<TȽ5EL�e�<c�k]����x����
����
YK�lH����q����lp��f?��+�$s���'aO�
0W�vPw�엎T'5ֶJ���/z�5ZT�����cp���?����GW�W� �\`�Qŧ��3x
 ic�u\�e?�{4�B�{�1
�� @���*
+l���.��x뀆�@����z�E�a�6��
+S
ڟC��~ڤ�#�Cl�
䗮�
w�
6_��οS�
<���v��-��ZJq�h� c��M���	k*�źt��LA
L^�Wc���]��/7	����U3�%���J�e�s�@#=0.y�ɒ'պ����`�au�xC�
ה��`
7��C�pz�"�R�o���:��MXt1�� ������O�|tj1Po��LCr�=�`۷��$���a�R��2q[}�B-�s6�*(.}��
+���RS�;�L�3���
+�])��Mbb� d�w�_�w�"��t��ݓ�}�:	���
��+$J�eą6W�#��E��C0@�>��^�@��/%qH\�#Y�1i������
+���4s�~��Zپ~�q_��
֡
��N�k��I�&􏹔�����{㞪՛���
=y_�	�{8�8�vLE�U�Z0�Z���ldג�o��S��c]
+70�C��q*ɴ��'‰���ĸc��=+��B�&
�AW�|�I㈙�f��Z�:�I�"��t|f�kf;�5���5z�i
+��G��0WqR����GAU�v|�~K�����=`5�㚙v�(�%u|;R�<$q���
u��K.�%e%�	��JQ0-�`��=b[��d�[��q��6ef�.�K����{���T����^?�jG��6}����.���OHo3����'텕��>���Aiz|�s��r�����K��}9`_ =v������-��	�����븱$vL]^Qd��$�������[3�C��pw�6oB�!X���q %H7%0��
�������Y[8vN)2��2/%���|���j6��g�������؁Q" 
—�C�DX�O�,�^x�h
����[U9
+���`.�
5�$��p��T�L�D=\���^�"0��{:��<�me]M��9�@���>�J��ڌ���W�x���[R��9!����u��{��ח��u/���z���bm|�܎��{�$�������
�
R
��e�A�Ƣ|�KA���(9�=�4 a���#���Z��.�2��fq��<��˷�,+y�Ů�Y�˾Vp# �w�U�OPI���S�V��F糽��$R�9�EqPԾ��)	�}g�{�dO��<�X�Uؚe�`�nΈF1�\�Q���
$������I
@z�=Z�0�j�����{&������q	'��*��qj�'z�v���ߵ��6�sݔ�
��
�4L�M��y�7�Fp�ڍ�A5
�1LvB��n��_
W[
1<&Ψ;����j�
�����
��J��S��1�X��ko7�y�Se#�;�@�2�����/�4V��U��s""������j�)��Y���	ɊI�
:
��{|�
��a�K/%�`�F��	[�1�]N����d�y�T�s]����<PU��RnI��g��"ϓ��`�khgN_]�iS=��&[����N��7*��|
LRa��4�N��jV����lmL
V%=2b ���;�0� PpYBo��#m�FO 9�_�@#F�9
+J�
��"f݇�M��5TjG���{j;�?��V�F<ю�
�����G�'!2Ί��Q��)V(�� �q��$PΦ�^�w�Fv�^�`&Qɠ�qzdV{:�+�4
N-�y��
��$ ��o�י��XE8�����`TB|�o�n�~�a���!�{�^~�;O�>l���HS/W�
ޠLJ�L���/Y��+
��!��=v%i�GM�N��^�J���6�gO�D�yc\P��7�
l+����{d��^�B��tځ��
+t�уXD~�D��r"P�� �ᥑ��
��"
Y+��z=�����Kt&�w�
+�ڱX�^M���1�'׽�͋������v����C�C�P��CC�x�&
+
9*3�"%��0�k<�!7¦_|i����
���ܶ9#;T\H�d2-r
��z���������gFe�?���F~u�H���g��q��
�z�s�U���ؠ��H����^c��N��3"�_C �������M
y�1�fr����A/�H:Y�A2a
:�
2R�t ��i���Ёj���"����D���yjo�G�:=�N/]��=04�j�%z���=X�wj���Z_g2qĤ��'= e�.5�#DSFqˏ�hbd3L�
�޹�w�i�s��v� K@� ��R(�<���x���!�b�����Z�����\�<׻�|�����)P��#�3�{�� �e�	��:��q�E�p��!��!5��qdId�D�� `�<�� <.u�)F@�4�C�p�|xo�o_��4{P$����ދ
+��A�7S@����MQ�u;�O��
+A@���vghY��B�y�B�@0#��*�Z��u*z����j��<Se��=��g��q��
B�R�
+�
̰

@�xf��{�L쪹�h�X���K����X5�Q*҅�9vt����H�/�*K�]��mU�s�"q��
+�Oz��r�RE`��q)��}�;o*�;����
�?Q~�����q��$�?��*+
����_�����l~і����-�� �>91ˈ�?Xo��o+�z�2���:�&+
B
��G�:�sIe�q�$��LˆT
Z���SR�����*;����ic�L']��ucG2�t����p����H%�� t����{���O�
����
H&��\C��������Ϥ�d>���4Q�����[�K�2˻S
+�P!UD��#*��=��	�z[׽��/z �]!�{��{ep
!�\DI�{h��8������U�(zD4 �[�s�u�)f����/�s�*�
S�Ԋ§�߲Xdh�]d��xsə��2u �y{�Bt�JP�
��I��}3� �Oɢn��_AQz ��ON�o��3�B0���+8"S��nL������7y�=�1o{�Ч��*��N���T�#6��
�@�J� l�Ǽw�.;���'j��"E��P)���V��[�����B���J?h?��_�:r_p�0�4ʝ��X�~�H@��p���
�;�!���
� w�gZ�MG�w��M
lF^������
�(��ы��b�X�ۃTE�!����Y��)%M�x�Ȁ44~�4wyW���5ж�����ž��1��E�
a�I=�ie����)��c����#�U(3B2ګɗ���7�2�\�����x�<x�]l6PL����/w���2f���ߝˁ��{�C�;��<�k�Ȋ�{q^f|F�����"!�E���dB7�HA����Jj��, 
��Qk��wL+�2��wDû#h1Q����ݟA�#eJ�����
�sT�.B���J���9��Ͻ�+�ٰ�!8l��)r8e5�2	���
Þp�G�QIJ5�%��E�ζ"҈�H��Y�hN@�H�IU��
�Λ�<MA�p�^၎
~
-I@#����>;�EHE�=�H@���G��u(l!��3�ߟ�6Z�
�N>�z�G��`V:d/�z �P��	h�
}]��?
e�	
}��}���O��k�8&_y��ʫ��>�aÿw�I`_�����>�.0

.
(��JA�@���zJ]T��:%� :/)�`@��;u-��
iEa� ������@���|�
���say��32%Y�������e:� 
+����A$��Hq
2��D���C�
+��Nj'E�b�p{��=��><�\�� r
$���2PN~�E8X7�l7
�}-�a��U�XE]Y�W,5�Ez�2/�U�g�rb�{ǽ�w#4������V�Q�t���s&44c_�>�Tk:�:�^�-������
�Q�����S6�A��ӂӴ
+)�st�T�ۡ)���b:dĉ
;P��?Ƞt��;xL�E����L�c�(f��+��O����e<@��
�AD�
��=��@:JP�
�H#�mM"�
+
���<�F�*X%b#,��kS�^j�?�OE��KD��Bn��V��@ޘ��|�}��
c�
�Nn-��a�NV��{�H}�b�*�M*��aiؿ��F:���,�F
+
Y S\��' ��	уյhvb�zĺ��
@�9�
�����l�����e at I�.�r O3�A�N��)����g
;���_�y���a�R.�{͌} ��R�,c���w�Ď<�,` !�(�)�;�j���%��䀜.	�
+�b^�o���++�4��,g
ٲ��a�� 
�R:�d޸��C�B[3]~fa�GA�>�4���G�����',b�&ٚTl�Z�.l����$C���m*F$��@
����@yw�¢��$d�|+N���š�J��K]��+��۳��5N�f�
R3UϚ��,�� |�C��GКd$�׉
G`�Vٹ/1�'Mc�"�8"�!Y s�_����j/O��a?y���
+����m��m�v�Z��~�r��D�Ȳ�s�H��
��x�^�t
 >V񻫑pU�g_kZ��N�0S�g�+�YU=���Hz&
gb����"���Vax����p���>�N�'��
���qPk��Z8C0��y��<q��A������T���{��3�pL�|O}y���
&�9�8 ƴ�
7��yNd��q��e��^2�U 
v"�N'R
Nߏp0���W�
��gtx
C�P��Sw�~�a	�
�u.m����8�:_�
�:
+I�D��[O
7#���
�0�'$�߰�J�t�"���5�
	��'G��%'"��[̈��*W:.}{�� fjO�'��CƢS�f���h#�nb���I����Y
+6�� 	3�u������>��b�>��*1�/��X�[�9z���o��
�� �f�
n���uX'�`0�aQ!b_��?�#�T	]�t����	����3�%
+��>J4� C��x�L!
��xu6<ݣq
+�ρ�@��iό�����)V��x���S�l�#�s� G�_�!O�I1�3���Sӹ�݁�3�-��I������	�'13�*gNᾎUG�.	~�T��1�[�B:�tK��B�B�5G0-����{jɁ$�e���DA!�{ީY�mG)�H�E'�_~�s�/����G��ң85�,�T�4��;C��y�k�8��v�b⩅�/a�Y� {wh�y=>�U����
�85-Qdž˴�ޖ���帯�
S�蝏�u�e�4�R���Ǐ��+If
+�
�)L�ݙ?,����(���"�O��
 �������&�
g ��q 
�
h���=�)�L�T'�]��sRJ�+��T|�EZ"�
��H	d#� PQ��ׂ��:n`L��h�L��~�R$-G���R3ڛ K 1X�c��PS`H�  (K�:_�@�j�0�&$�0Gz"�l�t[b�%4".�<���"�M�@���u/�W��]'�
� P�����W�8���x�
�#T�D�{��CcDz���C�x�io��Eځ^l?
ƭǙ�u?&hr��
9�
�ӶE��	�W��Y'–{
"�qpj	�G+$���l�<uM�z�� �FOTⴖ �,f3��՜ ��謤qp|��&x�Va�
4�1�a���C�!�x�I)6� -A���&`�����"R׫"��r�(�TE�٤O��l���
>�{�}?�9A��Q ��s��\�v6i!$��P@�NC|y�%J��c��Ch+�PLH���w�d
�{R���D�?���v��
��D
�=GU��Ϟ_L���[�y��8��]�A��

��I���� %f0!Z8ck̼����=̓��� <//.��e%8w
u1��TQ�a�0���N���E�M��dQ��	���Um���/��T���%!
E�i(�����@E���䪓�9gRm�t�
��
�x�Q����QP\c�*
h��+�
�h��m�Ы�~�[*N�CL���^�G����k�0����W�$��eNQӈ
,�dG�;EH�"I�w�bv�" �͋(Wi*���<ꏄ�֜N�g�@ �Y��ߣ��3#~�?u�
m +�
ZQ�9�}`�Z�k	��
�s(R�7R��Â"�|tNe-{
�ܕ�KLJj&i������BJ	����
����e�H�-%�(1ز�
���
��h�� z���:G�s
�
f[f��sP�3:��2i2w�e�|��A`
��oU4 at -F?s�@Ǖ
,�q\����w*�\�z�G#��
���$�w
m��*�.�������D�L�����<�BcG,FP8�u�Z�C/� T���j�3�����ه����
%���n�1����^Z���iX`!�D��'`�G �sW˲!9/�59�⩕=���	�� LR���|D�+ ��ݯ����L��`$Ƶ�*�+N!���T��1�㥐DKgV��,���W�k���71 �Ł)����i�>�W6� 0��壚N��A6�n��^2/C�U�d�� �+�C

�9�gh�+D����e [...]
+�!��B�C�)�
��l0����I,����ѣ��yM�"K
�x��u��#�4kz��J��L]�
!�T�&�
��v���e��z�%�
Al����ƅ���~-XB�$:�y�?0�(i*!R�BL�"�i��x�~�/����g
�: �TZȠ��~24�	����^�h�P	#X>��y#4�m���v����0O�=�H�����Lp	(��%�|�GdV��� �
+'
Bo=���캢S:f-f����*U=�@_�^!�G9�\Q�[�<`�1: נ��
+�zɁ�$aV��|�A=��p#@��%�by�ǾH���1��4�9��KOtBr�y�y�1Ϋd�}w�3�` T����m�{$k!?|�$
��;
e����4�u0��[��A�4j��k��"�#�U))
\M!�P������E�2y0{�beu��2���$� �yj����c����xi��(�
���N܍��Kob]��?r�o7�{d�:��0�Z垈�$uR����X�{rR��j�0A&�*4��1����
�׸�=j�L<=�S���u{��
��
R���R�K�h%Jd��8ё���_}$�
+�8�)
� ��ȱT �`;��g:����dY,xA�xG��v�+��Y���\�,��-L�ďާr at u��M�q™�8
����4���
��i
!P }:�����ze���V�Dq?�Ee'&�}˦AT�Q�kp��
�=v�RK��z� ���z�>�Na@�Pq��|aو2PtP��M������q���'��
��xdSݟ�Ţ�
����s���(��=G�J�uܗhI7��
n�����4�{T(K�6���3`�U��6۰��<�X�Cf��A
+��P���M����2��@��]�U���:w�g,
HɵҶ�
9	����v�!5��Hz}zz��E�k���=B�b�D����%�	��#�3V���)P8tx���C)4<�S�b��JjʼnR\�{w��E�3(�tІ!;�/!�
J138��[U1/f}��1YnI�����
=GH���9��ʅ������ܛZR��'ڍ�
rp	�[
+%<�(��$(GTY)�
|)��W�KG�
+�C	��L�#�(�aaR�
���T�K`q�q����]�"sB���4�f���-z �ȄB(rY �%k7�I������O�ґ�|�H�t6ӣB.��!cK
+�|�':�&TF{{�fҊ�����<�/ �ӑ��%���Y��ґX�!�pwd�A�A1��H�D�
UJ��=�	�ېW7w���ڙ)r�0��Ĭ
��SAFT]z�bKx�2�(+?�݄�0�~�X�����Wn�&�yל|�����[\��O8�;`�lP�hpXP[GT�u�X�BD�u��C�
'S�F���(V�M
� ]0F+�{>��B-��v��BQ38Ͱ����
`�
��2��g݈TY6��3�<��d��9K������
N�D� PD)ˁG��֗��@o���o
�M���X>��f��9F�f����w�"���!93\�1�pM��I�g�����>' �A|M�����N-8a��ܣm�� GG�>	@)=�_�����蜌)K��!�R�C#D��\����?��OX�V���4����
��+��m�
gD8�����ڻ�ڲd�yO�w8MY
:##"#�i
C 
��jB�X� ������G�}j�E
�*� �
+sμD��Q��	+�k�&�^���Lڸ#�|E�m�
��
(]�JF��.E9��'�ʗeG�:m{�dK8 b�w#�
�ur
���'5U�W�D�6%g�E8�9�i�:�P4M�}�q"Qc#��C����P�
���|��0���ۘr[Ԅh�oD��ݝ ���k$i at T��+� ��#�����%p;$�蘸��k�G�.6}y^�
�bU�7H\V@
(�4�dO2��<�N���WUl�y���>���
+M�M�P����>!�T۷�8(���a�-a��L���i��i�>��q�[t+��7_��ei �g�@h�Ԋr�j�e-8 �w�ؑ���7 {f*�Z�o�:Y��z#�
��
�^(����m���)�n�s�~��B@��v٨G9�(�
�Hbڣ�'#��U��M�̿�|
1~����S}0���q����������T��U|� ����������Q���
+}�X�)^�6��x#HrpSD}�ԅ���\yz��\�� �{iM �I)���y�)c��f�D�KC�җ�Ґ㈋�����Ӳۈ̏���|
RR�0
�p� jb^r QG4��~<FA1:�q�o��c��*��vā����f�]�A�
+^�{I�庳�4mn�
��ȱh(��8��H�(���o*��+��xI?@��v��w�p���Ft�b$��w���14�3�Y8>;sُ�Na�g!��R̻����t��L���]\�C&	�~�v=�oM�P�=�O]ƛ�h�=��2�@*��Fi�p��E���x-�tH���#8HL��uq�"�����^1�;�'8H��*���
��=���cR�g��*�|pG��!�d�{���
+_^3�{g(�$7K�!''73@�h�6�Љ�Bl묱G��~��3���mC������[5#FE
��˚�J��tte���.�*��:�q1�*b8��b�9�ЪɈdaQ.!"�O�_#xu��U��p(σ���uE�
D �q���y�V�G%X��Q�*�.��ߴ�0�X.�u�R�A�R�bN!���uԕa�ŔCw�^��"ny!/����
Y2Gs���N��>Y܄+�$ﳒ�~�*�Ґ��
��i)�
J��R?٬�(,�Z<X�7n{"��s
E�%��$b�p��S��ʺ'z��U=
H�u~eS�t؂v33��0����5�*

��m�����ǀm<�oơ��]��4��4W���ĥ���R����l\!7u��UC��I(o�������#ѻ�Tp��E\i"��r�•���]Q��2�xE����� ��sRsu��(�˕b��$�^�P�1hbD�W2��.֯�'
1)R$䈌��)��	`�.����j[\�X�y�"+����-6!*�0�t�
��0ʀ4��G.�o��
G��d� �t�#	�«`I�?\���K��� �.~��0[�^bUi� ��|:$�0{i|��+�re
�ߝ����[_B�gl�W��at��� "���8�bm��QQ��Umr�O�3�aj�oz6���I�5*#��,LͰw*/(�N�"���h��,\�qE`��+N��Xr�X�
+{��h��
L���N*ܢ�
�J�fw�a0hF�ֹd�
�߱� z�
���;��ɍ��4j��<jKW4#�‰@9���;��♞P.�e�Yr��/�d��W�[�*˄�G^Ҍ$��
������UT�ةJ�_H[�#9nu�^��KH��)�/(�	� ��*SB��i���g$�."1���H�͡��L��}&�wu��L�v�&��E��U�P�
+@[5�/��M���L>A���
�p8�oDT��fL��fn'��
��"���y��*c�N$�H��Y�E ���+
X�j�,'�J����i�ɖ���3Dz��/�d�Na�6	T��리h
^<�3@���$4<�\�r6(�?pj[�i-���ׯ�%��`a����r�d?�o�;-^Բ�����q�.f��L�5��N}j�z����*�Qė1��xY6q
�ķ��T���͎��ID}��Ag����E� 
!zDE�_����+���e6C+؈;@Q��]��K�q:%��খ$=Q�j����.��Sq84�Emq�Vs�ʽL�}{����@�hH��ɤ�5�I�e��r�
�^R�W�t�����Ay���Z��j��y٪b���w,����P��@1
�9�# ����k��0+Q�pD�4�o�Upg��w�DlD����dv�(:� dƑ~���P��0`E'^)�'�
+`�� �ߑ�鰒w�b�pG�^}?o�* Uw�
R�g���Y�0*�Ng���
+
�%��D�u�W�����u��'��\B|����c5H�z�`�����=$�T��
�)��In��O�o�S���MR٩�6�F�i�
E'I_����wNj�u��[��B������v]�>��/I	WƢ�f_���B.��G��j  ��I@����Y��3�.�S|	��N	9�"� g�l������=�]
+fv^/h_3���
z�����i�0d�5	��V'��nBt���)yi�
��

��_�x�A��eC��?<�3W*o������P��>`�W�A^�iգ���I)��}�⠀ �s�<6^v�DD5�Fk8J���>�i�A
�'����&
����������/|�������Q�yiFg ƾ
��b�(�ϥ�ª�3HΞ��v����Maez �S�@�*ᦆY��b��
XT��uӢ��>t��)��h��%p�eh_N�'q��AL0�~2�Oz�<��b
�1&�`x�(��%g�!<F�12.n,@��L�vT���$֩h0�4PT�~b`ԟB�4�4����"7;#z
�
���ͷ����"@�PQ��%�xM��-�)�n��0�I����ȍW�J-�\������
�#p�
�,��D+���w�*�#�$��i2�O���s�iN͔�s�+���l�v��칏(xJ}f���S�����d;��$���A�A�o)BI�����mT僄�](�/�mRV [...]
+���!,OՒ;�
h
���"�r�XǾ��v�؎.Ƽ�I*P׷A%M�~�<���
h���
̚�"����>B!���L���ot����al��7�"�!
�G�3`?�
��g�=ͷ Z"l��z���
h�-��"U
# U�!T�Q�?�
d�ޖ&Ceք��P[W9e
�+�[�>!Uɟ���ȫ��k�ćhp����	�^�5\�3N]1�
��e��,ĵR�M0kw"�1�0
~��|�Ĭ���
4}��
}G�
+O�)�	�3�
�_�A�D�(o�ץg;����,��E���T+r�`Z^���??�qwŤS�j�|F�%+܋
+]˫���
to�5�b�M�]aVr��*�WD�af1�>>�������K12��Nۆ-��C�OO�g�	DPG�I�����#��γ�A��Ǖ��iٸ���j�h)��B��r$Ki��<i� ���fԶ;�U �)�~�%�RЗ����M�@V��I3�fzt���LM�4}߷���U9f������5L7���
��qŪ&�R��}K8�ӑ(�d�Ըg"����^<�!��wF&���
����!`��U»3�
�i�������� ��㮶�be1��%8�)M
C�D
s��,D)è�J#��x
��b��J���oZ@����?��v�2Ͽ�e/��V<���`XS�kt��
�7 �Yw�j��E+1r�B>�����	GUS�b-�:~�E?���
[\���{��r閂1�T���pu�c"�_�C��V��d#g�ƒ����^g+�
J�W|c�?WJ��6�>�$��h7!���&^#���
+�z)�F27���~�3�
Ih0瀷nD�
���l���z��6�M��j���P�^k8���6�������1s%j��R����rA�U
+����M_���8�r
��1%���V�;0�qw"��GW:� �0�z"�d��s�4����
:ԏ����W���
���@[��=�D�
+xݞr#�
+�M�n��y�-��G0	ᕸς���/͟��/�LUqO��D�Dmr, �Ћ	>�
0���%4����8���QR~\�R�;����_���
�]- A�tTo�Nt���Q&���m���^4���,
��/
+F�aH�<����(
8���JhR��`���C�U�溃��}D��z20�Bh���jyp�WH�r��6{�Q��4�
1���P�"�V��u��7l�U�S�}��͵�*�{"���r����
�"K��)���b>a�e2�)]�>h�9�躀qUy"p/K��K��l�S܎_�2gT'>��_U"x�
�L�c�K�^��׽����
��ی�����m��c�
�(�3"��$���t�kWR��
w�{�Y?|.p���O�Q���!p�	F~�
�VF3`��gm���\6�?׼$�5����q
+�yQ �|�I? �W�����iQ��#
+o,G{�k=��������6��e^���%�5i�
{u�{��DF��C���)�M&�ʴm@؈Ь&K
+HQ��eE6[q�9j�W'���A[E��9�q��H+yE(��=?6X��h�
h9(��}��z\!!������XMq�[�����kis�Q,սkc�So��(w�`Iֵ�v�wy��D0��'�|�o��gQ{m�QL����M�Զlb��':��  �ep�_B��QX�2�y�q�z��H��*�2���$72��h����e��\�	Q�]��?wZ5�`6�'�k?=
�/m�
�������^Ri�S�+t�[��U��GJ�KE:S�@��tU��N��Y������+�
��Zy��q�=��k���>
.1G�]�`�]��ãe�:���Eȗ�f�?~�7b��f:g��%a�g�-DD��9>�����˺Pdԝ?G%�a��ĹFr˱j�vj3�tAiݩI�Ѧj*E���DӠˆ�;(��Nu�1#L�>y���b0�G��_�B���\f�>hP��R��k�
���c��^�*
|L�"�r����w­;��,���pf�]RFK�o���p^ݠ�b�<G������>q�� ��~���W�c�	{"en��D����%9w�w��D�i�
+�H"�c�	.�H��������w�i/n}����w$7IL��.�~c�L
+0.�Jgd0��gSygG�n;��Q7�M&�E
�{�v��E�>X0z+,�S2�O�pT� �
=�5����F ʻ��>_��
��
�VK��� rG	@�l��Ϭ���{�7Œ�P����	t��L�A5���j5�S��:�
���^N���^��	�K�8�-�x6324ZX�����R
���= ݫ�"�A��s��UQ�K5���lL�v�d�[;�S���Zf�
���]@���{����VB�͖��J��.���0��FB��;g��<������!�8s	��-C8O�]�БZr�h�Au`��<Uخ�|F��?�
+�G���e��O1����cH�"�D耩�ڻR|���Kwh�K�y�-�a�B�
XC?���"�SV6��ˈ�]�J�4��ՠq'H�(�s|�f�'
�  ��"��T�<̇���Ȋ��L�|9v�����'kȩ��TTH����x�a
ޮ��j/%h�SH�*@�c�{�_Z7�z�$O��Ey-�Z��h�0vT�*�	��xr_�#�iL��|;��\�� ��\�;zwp�P/q�b��0(;~`e
��9�L
"#"O3mn~G;*A���|ǘ��
�r9�=bk@��$��*q�?�E��E��gDnɈ�P�,��$����!�@w:�(�%2�4~��8��B�ʁ}F�E��=���S�p!���&CA���j���e
�H�#"׌�{���*]
��x���M>���I�>
?�P�\/ �/��bȵ����ڴr`�ۘ��́�E�ʲQ��i�x~�x�Oh����s�p
$�$��
��
+��1
?EX?�x��g��V}B�d
�%d��ɒ�Y�t�MO�������l���O�^���!"��`,��q^�O���ͷƑ|���Y/.m����	
�
+�e��cl���h`"��O
���wm�B/5�N�d���z��x��E3Q��=H�=9������
 ܭ�K���*��DA�)%���l.V�W��E�}��)12�K{!�T��L�X
z霾	�3��
+�ϯ,�+I�ϣ_�=JyS��Ǧ��ja��R���S���B�?��N�|:&�I
iL�B��?E��C"$�&���g�K��̚·�ȝN#���ɭ�M &v����
+B�z�нtx���aD����z����o�.��~����Y玜�#���
+9��T���Z����@��ن`#�0�6؅ѭW��6��/a����A>hn�����R?tF?T�C�C=�>�x:�4�?��#ER�-
����5�D�����r�!���4&BtP({���jߒ��T�����z�������;���.�b(�V�Mz�����E��{ğ�!��ઔ7�~�k���ѕ
=2h"k;�5���=~
b7�Z
O�R����p\�lT�F1���7w�&���Ŵ��a�!F�t
�"㇚�^��
��MKM#jl�P������<�E5&�Q+i����ҙ�f �>L)�S���A���}D�c��\��8����hb�*�_�
�1WF��ޭ�
���
����&�$WD��F���R��8��.��*���X��7��8t����F�&"�E�>B��š1��
�jˑ3��-���w<i[�@�5���9�.�ד�H���e�~�=�f*����7������*�l�I1�.�k(����2�D�ξ�E�EM���g��ح��'��D�'��N�#u��0Q�0m=b�P
���(P
�Ԋ
8by�q� =h/�d��븺�^61�LQ�y*
�;#'`D�Q�L��r�=�V�6pёb$wI��%2����
)I�R�7⯯�g
	�dw�bO��'�rtp�ҪYr��ǻ�r���hD�Ӿ8�0��|�)�ѻyG4Fy�Z�RP6�����G)��z��v�� ���V��]��ETi�8��|
������Q�_x�C�XX�=$!�
+��tc`����s�'�*+N}��p��k�~�sg~�
�Q58
+�Zȍ���=�1��ql��p)�_vg�"�8� �%�:�*� �8��4&^E�L�r��"�B�˟��� 
�]�m(��k��������
�c���y��_�	b�Kz����x(�jS�U�<"�ns����"J��P45�!���1�uY��[R��*b��7?�?W��=
b�E�$�>�]G��"�rQ��Jj�|��U����t�����V���ȗٗw1���Oj��7��u�{��a^5"��:EZ���Ry���ޑ��q���&d Q�Zs"T(3�k3r��f�������� ���^�T���m�E'
��o��~D(
A�G+8)��(t3iFt��|x�����i��<��FB��7ȵ�+|ԳZ��@ ?�Σ �w��Lv�pz���N+j/�(*�z�V(5j��	�q�
+6�V���y�^��R���������'5�IO��^�0!��<�D�����h�˞��̰,ٿ�>iQV*�P�Md�>!�ѐF�M�;��c~}]w�j��_��N��U��
�U��SC�����.���������sLKtP!�g'@��#��8s������r�c�o�,��'��_�G��7�nG [...]
+ʵ�i��m"B
H#}k@O=%y
���{�:�����¹�=�3�Z��+�����c�nQ^��4��*�����1
n�S��!��r�� )
�{?�
+s|�@�A����&��5�Xì��se��d,S�r��4�ʵ�Dz���kP|��R������|���ʟЌ|�B���F�����p�,
�p>�}Nv��]SI��{�
���&�S����}O�)��W�N �<��g�(!�{'�\�}��F�|HoW�~��D at R��-���Sy��l��Έ@w��پ֦���ʈ� };m��9L��y��(<������j��/q�1m�bW�h��4�u3�`p
�;���rw/z�_|���%@��y��Fim����W�{�g^9�d��Təb�_w��"V%����!`;ȣH;�p
����VLf�`�.��N�'�"ࡩ��X�*��m3v"�;�C]�����7��%��v
���
$���Q�Ź��*�Z���v
=*���0�B�b��XeLE{�5f^����0�1�ʎP�W`�B������I
+�g��\K�����R\ќ|��g�f<�S�����K�飌|1t���oz��mr
/ک��~k����W&z�r����� 1�8`�@y�G���a��g Oc+l_AW
+�
Q�_�kҫ�ub���FZ�|� $�0��-᱕m�_�/�s;�G}�=<)���*]!�*͍�
+�sEz���F�Қ��L^/�q�$_鷨Y� ��^�8�'�*�^�#�Ί 9�?#r��e�kx���
�(>"�U�~{Rd�VJ+*�����B�}U0ZPkDu�v
N�`	�m}�'�1���/
�	S���9�DNd�G�6?#p�X��\�]��/�nt.�qg��?��e!`�f�U��t{���)�v�*�d���N�QeU�8[
=r �S=ų"�a
�H�s�Mk�{Tk1g�P(
y�s�������(=۞{|���U�3��-q�{�&!_l㴮S�b�Q[
�}KiuD��q*|7)�*�+�+��
�a
$����kۏ	��I1�!�Ʒ�_�zH�
��M(��m�:~h�å
A}�P_� w�(����=�x ξ/����~�ž�񂚂場���
�,�!�zQ��*�
+px?@��)�#p(�}?dç#���S�\�_5l��QT�}i�?H5�D��l�J���
�W�_����ԹD��5�o�ݙ2��~��c ���!���O����;p���'�����\����������O�~����������?������������?�ݿ�������?�ݟ��������O��?���������_rҟ��������������}���r��7�Հ������c��?w~�*��U�G�OQ�ׁ�����H�ݿ�|�����u� �kD`����C�

���RI�uQr�GD�j
+���>�����"|���j	�?l�0����<K��
����x�� �a�x�ؙR�c��ײ�S9�}
��
�<u�H��O�a���E�R'��G��[".�H��w��V��@:1�Ǡ=��	�;��?S*�
E�\���g���Ԫb��G�r�m�x
}������	�& �hh�W';��
�������>_��2	���Z�&҉�A	��_��OCz�����bh�%��Թ0./��ó|�@Dg��>A�sݡ�
U\�1QX*$�
�v�X��q�
��?V>�z��t��!O�g+��Q����	EK�H�Cs6Y�{����!ҥ_�
l��O_��9&v� Et���Ɲ��������AA��y��D��X�������A������`��L~
+:
�$�Gr�x��2m;g��?�F����s�B
~?G$ X �n�q<,e>~��P��]���';���+� @$C���lOLE�6�4�z}V���5��9��Ƿ9ΰhjE�k�Mz�
+=�,�د(z�85ɍ��L
$�ӳt���0�;@�H@?�@�L�x��@����S�;��B�P��d;2.��
��>��<죄�q�
[��)bZH���%ߣH�.�;��l��A���h5K���5������I��y֌U�F��ߏb����I��5�s���`R��?=�Q4�Z��%@'#{�&�r��
+0l�D�
��J)�ɗ�d�Z/��#����:�~������^�nʍ�2�4‡�\Ao���{�
C?�v�J��Q��wX�#�zZ�qR��Q�MC��
/�N��.�g��K+F"ȩev��H�DD��)g�
�Ż�D��(��[�3�lgl�>0�gy�
�>�֑;� �X��I
f_�.�->Ө�\�Oǡ�-R{�
1�,w��,���:IWS
�B�\�Q�� F����(
y����0�?�:�x!u�W��)؛,���-�]��k
�
8�lzBk���Y��	x��-
���WxY�7����s�޶�\���T+>@i���d4���x��$`�EX�d��î��k��f�u�����ǐ��������iB�����:>%D08Jc~"�
*��lj[ָ��)�
 mlM_ [...]
+�>`��
)�\C5�%	����r5]�o�,��v&;�%��w�O�N	�gk:O�Ʃ\�a��TQx�J�f��3���ax��a��4�d�� ؊7���*��C�Q���u#JA�ܵFyϯ��"H�w�-_b�͓���#ǿkX��ڴ���P��U��r�
+��_�-��G�
�T�!(��="J
��_���p
_S���k��
�V}E*
/�G�`�u�E&
�M�w���
���Ӂd���h��!})�=T�����F��lt��,���
���D�j]V���/��c&�9'~e=���N��
+v at fw�Z�����S�펺�
ӯŒ��a��E���F���Bj^��3`
�c�  V�T�ʫ�9c���2��o�A�1���
Z
��	�3}D��`*�_�[a��ih�B

G=ؠ�|��9���3"�)Ʃ��'Zl���e�Ŗi��iI��1*p ��[��������Hoe� ��K<�^��X��uڄ1����障��M�(q�ؖ�o�����(Z坥|�M��g��
�Uf���)e�Y��
8؎��r-����8D
lW�Ag���Ι����RQ���ƅ5neR��|��)܅���R��s�F�(���*;ܟ�6�!�
W �@o���D� �; �S�r`�^,�q
r���
�p���U�����g���\�z
��j�ܑ�P���"y=a����(Xt��h�� c(����T�g����\�f���i�
�*�S�F\�:�P��쇖� �vR>
�����.�K��LZ��]#��|
%���Q�@uh����q�7&���ʐ"���ę�oS�_��G3��g�z��O
+�N��R�
�n@`����sZ����+�y
CZ�6T�
��O��Nа�`�Qm����.t'�.ӈx(C�:Ň�7w|
��9�p��@�k��
 �ˠ5B��x��X�pF?������
���G+��'�E���'SHZ{)�30 ����s����
���� ���
��ܟɚ�E�S�hT��,��B��
Wc� M����g�;�q�Uz(��)��"c���#���(GR�s3_\C��[^�J-P�D�o
��x�S�q�djv�4~�W���Q
=>�d�<X;1.ŇQ�?�P��@�rHԛ�hm�|kjD�:��H*
+�G�6d���
6���W�u��ح���
��ﮨϾ�\��A_s$Sk�A�8
Opj
�c���!8�ao�tp��.z�h������h'QD!tkT~S��2a:��ӽ��Z.Y�� jp�L��G�
d��u������+�{����44;������!���
��
+q����Ɍ�Άo.�=Lh�C`ʈQ�Hm�CX�s}݉��	&�
z
��lS#^�F���2A�&d���
*"�[���
��
t���q ѣ�����`-E�uR�R#&�Lǣk�w ���hZ>=��h�{��A�
rFC*�]�^1��!���
	�U�Gd�I��T�����8h�x��k1Wlk�5����~F|����_F)���+��'v�:GcsDP$(U:;�(b�&`�e@��'��
�zA,ߎ"HaG���E%���#�y���SzO��{�h*_���w3؊�}Ā��ꄤ9E���v�M��r��3�0��B�
�)��r.y�3H�G����"�W��M�b���SK�KP�3�/D�~;K@
��	�(�N-�pNh{�p�B���{"��M��;Q�<:����@AԴ�'"��ׁz&����~R�
ѥ��I��o�;#+�51�CZ�Г
��v�8b���m[��i �ۮ1Է�ܤ�f����A�̫%A�e�~gdf~F
1JFu�+���o�@[�6�X��,�IE&f�J�\���	�}~�<�j
+�b�4f	-��1��?�y��p��Oz?F�����=�
��X���>W��c�l'}��Fuo��Rw:��ݐ�3�}5�
D���?
�'
��F�A� 7���:�gaw��9�G
e���y�}����fvqD���۝�<�������E��;�cD��y
m�U g06*
����Su �����ojq�"zJ�4~�r�vE��S�C� Xg6�]��V�ȸ����u&��v
IA`��bk|��'�����
�8��s����}8ġE=E�]1��.�I`���=��aT�LZ��������
*j~F$�h�CIgh
�p
�.�z��h��$�j=�ſG�-rZ�����~�х�b_I�i��۲��q�� 
+�,�]>V�5�U���&k���L�X�������c�
}_��?i�=d�S-��u\7���#ZSv�N8o�k^_O��z+����S�
+:�At"h��/Y6�s�zzݹ�t�v�K�{����
��
�^
+S|� #Fcb�|��s�Ϩ�ɉi•�� I(��\�B�a+M
,��
�k��$�w���aW
+��Z���{&j:Q��V?>
ֽ�!�c&y
��"�z�
ƿ���|m���
�2k�oL��g�	�H_r����o~�i�B(\���0�Jv4m����qf�EѢh�G�O{�G*'�=��*�'��{�GPC{�x�.PuQ�Ġ���]1V�P9�̴�kw�w��+�d<�GF
�U+�6��#�ظ�4������r��5��xʱ�Z4�$|g��˃�CȜd�s�����Գv���_�Qs��C��-;ϕr��b�pJ���q���aD39Շ�.0P���6ɐK���ߥ��}��QO���
endstream
endobj
131 0 obj
<</Length 65536>>stream
+� b����9�Lz$��&ӹݻ~�O����(g�b��e{��&�f03*�ҍ̙8=kOg���
+����@_Ц)O�x>
/�{�kw�����I���δ㯢�����]�}�q�ɣx�
�lC�àc���'<��Z��c���m�������^�F.}�4
4�e��
�ڢ
����J��S�� O횉R�tG]�cc���u����R�����`��GX|�M�'�{f
M�c˃<��,4΃-����HܧWpE}}���d��W�<N�1�bGZ�՝�����_]Œ�����	�I��qm�bP;�3��4�S��(�e��
+�
+OP �<��F]�r`:�n����$����j��j�K�^��A-�
��1'b�����L&��
���b\����&�<�
S��<%�'a�-�Ic����J�|�jFotE�D�L]��
�M��	T�#
+u���(�D!AT�#�6e�
�z�k$�p���9�/�<��x�>&��
�(B1��;P��t
䨆�-��喙���s?7�X!o#����d$s~;�u&,��U"����ƺgZ�$e'�.cn�����1t��b�j %�W`
{2����q�s���<:����D�8��MOxP~5z^8���*b���ڼw�<q�j��Ot�`)
���jUic��@W�! *Ù�p>�������G�N1t*�xA�BY�V�e��iȗX���\ٖ������ز_��%���#���
C�0�&�'D44 +�)�{N���"r�.��
r]k?����C6��N��(��~
+ at 2��4���F�Mǿ�E�/;�}��l{T��O�N���ͬ��6��u��S�x�֍
��xw�P��� �ϳ"@�u��\��3�k��4��:�Y�b��/���]o� {��dqGX�Ήb�[ܙ!P1_�&Q6��Ky��P�+p���_�
�
����c�B�B����{Dn�����8kr�a�N�
+���UP{Y�>#�@�z}�Q���a�����-���p
51T��~�-=اF�� p���k�C�h(��P
"U ��?�t�e��%>LI�+ٞ�E��Dy10<�
���ݟ"Գ�g[�D�QX���L!���
(��	��Z�d�]Oh��䣈^7y�
��
Tr�RE�#�_���
������Q��3��
��s��~��}�G���K�D�����A���
Nv��TN��Q�
󶨹2�$�X�
o
+��A��ԗ�
�h��#=�����l!U���G>?D�w�m_��~�gfɪ ���.�Z����xg��W$e�KSq�{ğ+YR!�[��?
g��1A�ƣb�r� �D�~�@�{|��}��E�1&�C�D\|f at 6��w��r����-�k%��ގ��qT[d����Sg=p+1�qw��h|���#����&
+61Q��Bܗ�H?As�)8�H3b��s&s��m�)����q�[���V�j�����A��ܣV�F���~���N�
+��`t�1F���69�~	�Fƭ�(:�d�@�Lmq[�^~�NěM���]WjNiJ}��
H�@��
sU	p�8-��;��b;����
g��H�Q��,�R|ߏ3CF�I� ��HRF�$?�V��l�$H��o�����]\�h�*���8
+�M�7�r5��1Y�����Nj�%oeU7��>C��1�%��%1zd褍R�� ��]�0����y>�wZ�'�?�ϣhB�bB}���r^2&RW�޻���zqUߣ�X>�ih%���U��.i�u�sц,ר�Ѿ�t]
~�M6���>s=l�
&֭����.��1 �?�0�(���h&@��k�p� d��n�ҭ��P3&" �
�h͝yz�a����_�S�?Վb�*P
+BvF�|�"�����b�g8
��3�7�����kŝXX麾؎P�`;��-3F
$��3"'X�
�����q�k.x��X����Pi9�S��e.�����w�� U��3�o��d��sI��w�/��c���\�8��(�}��??E� ��b�	��G��]� �䎉����,ˆ
�	������ڳ�4��N!��|(׶⍞6җ#��r@{����}SN��{b�rh�fQf��p����O�&�t�hQ�/�R�t=��~G�����C����Q�F*� \�&�\!8�+�
{A��"T���$�$b��(*�2PZ�n�k�><�3Uᆮ���R�doYrP�]Ͱc�B�|d����X$��z !ݱ�� �g2WD)c��ϔf��qP=�k{�꘳�(t�!
�
�>"@�0��J4|�h�)ݭ�#�� l����<0�z]��cد�uF|G��]�Y�f��'�O�;(�1�g��I�!֨�o��{�R�?��
������5H
���D�܅h��(1 at DŖ�u"�m
I��
�^*"��"n�	�9Q��98s
۠��ޡ
ˋi)��
ϱ���褒z�f�4ciX�g�
�o�(n9
yTȕl�(�Q�I�JG��l�D#~�� �G�0�"��@��������9_S�����=~� eK���g�B
\M�1�o%B�
��G��`x�;�1���O�5
%���Fa�d�m�γ.��>��q�N(m�4%�Q#)��j��
�����V�ŢT`�PQb���e<��a��B��
JN�8����v�c�SZ���I]���v�Xq����@	,�^bi�3����T�]�*��
+���i��k�++�`Q:sՁ^���ßjp�c/>��x�������p�{�����R�ײ˴��.�FE,��
�P�S�+B��}�7�fK��H�=����
��7eE��
�S�
+��@[���E"]�
+�v�I���K��iF�~:S�
3
�8��_���!5���'�ئ��L!
Z���T�gMg^w,L�t�Z@�P��Gf�R����^�$��i�
1�=l��M���\�^�_�&�/�b�ƨB�o��?0���C���<l���>�]�Bu'f1
+8�2�}�#D
�,#h3v�t#Zq��8��<(�9�y_e� �r;��f��A���3Q61�o���?d�T3��w�
s���DO�'V@^�,�G;
�l���΃�����
7W8�1�
a��ۋ�FF|��ܠE�h2���f6	 �甗yg�Eö�@���IM���xu����
�v�^~:{�Aՙ'������lǙ�i��|%j��`��|�.����π��G �^���F�����ל���5
�� �`5�V8H�*�0������r{]� �M��[��4�H��z8�	j"[TN�����G��~>���k���T� �Sq^7��
,�~q
n�i7ù+g��w�,
+<l�D�*W���:�/˕�WrkHo�m��1�<�ZX�
����	F����\rh��:
y)phf��K^G�]M�C���g�K��п.D\�q��S�+���p_!_��0�뽊�1o�:ܺ���%���//󞑼G7��.��ʌ�J͝,}��S5��;�?���yߏ�KHj�}�_fdH�P�}��U�yڠ`3��
g�{�p�a���hߕ�T<!j��Q
'���D�/&�����v2��χ���0?[4 X��*
�0
E
R�� |p^*G0��3e�	&Ҹ����W�)��]0�]��A
rGs�����E���W���~�`�CE 97�P�!�󌊦6�(a2<���
�_�h�Ja;?�Z:Fό|_[��>^�C1�p��EBί��
M����
؛�M���s��|�Р��W6^~���D�*�_�Y���pdQ <�)��PbΘ��LPb�5���Xd�>������Ev�-��ؔ� x^�M,w��^��@�]�!%{
���rAOâq3FX�j	�S�����+���
�a
+�f	A�jZG���.����%���菫`z K��Ý�3�	�#�Ҕ@���5��`w��B1�s�)��ƭ
T�y.Q�9ð
+Bp驾z VΫ������0�^h�-1�1P[
Մ>�
��`��$��j�
+F���@�SD�	�/���8����,�ִj
Ѩ�Dq���5����;Yѓ7��l���|�>^
#�GT�v�� ��
�oA�n(��&�u^D�l4ԖA�9D+�Z�2��׉(ن��|
E7�p3':������l�%&EB�l�Ft4����/5,S��a�\B�5`,9l��4��BA�1�Ds6��e�J�/�M�u1�����������*��mf
4G^v� ^�΄�[8�[��u͋z.�Nmwj4mT���b�w�A��A��XF�w�L�
$zI�=�B�aUG�a=�Ƚ�E<W\����
i��8���T��*���bs���������?U����J7�
:O��Xl���k��
���G��8��'��!�����?�Gmu6�D�r��t�\t
�Qյ=����������<-
_�	eQX'�}K!̚F!,���
�S}}����u��"	����5j�xU;Yh���>
��\�E���L�o�L�bg
w0`��03�f���'G
��y��=�v�tNԧ�T�7�p�f�
���J�ۿ7Fr���X6|�f
P�^�;��ʀ"��H�显�duza�
}����0���xi̠�h������LZ�4++6�N��_6��&�BM�j�?�.Gt�J�U�q&
yǁ!Q�&i��
�%���5�T�
�C�f���n,��Z��P���Z�0�v�W{ڄ]��T�A��D�Pk� /�~2q"SJc�J��+Uu�~�/y���N�y2ԫR�
�1�\�Q`�
M|~�g͈Z�2����]	y������v��
��g��މ������ZT<���]�@y����<�tZi������n�/j��%�#� ����y��>��#v��D/�$��?���5k�
+Lq����[:��4�
E�+v0��	��8�E��Sek�L����n���q�5%��� M��F���\�Q��u�Q�D���DZѩ��]�
���
�"�Z����L6�����`!�/��X��x�8�my��$�/��i�8�`�J
�V b
�Һ
����`�W���lq6�P�wl$D�SI�с+�z�L�n�+�iF;�� l���	l[0�'�,���cld^}�B+E�
f�>
�����9-� ��*A$�'(��"*b���^&!�
���P�}�
9����!�*j�N�u1��s�Q����#�וE�#�3��X�����rBĤ��޴�N��.����ȩ]@"�v��Nh=�ˮ�ɓ
��B�#
�v�^:��M��c&��=��
r��$$>~���_
< ��#y%ҡ�$��'���b��y��}�I�/��#v�gD}@�#
��:k���vS)��a��x4�!�X
�q���
Y6�E ^\	�7ѧ>���j��;`{G`�)5��lU��N���h?�j��
e~]f�w���A���2�XGǾE���%���[
ADIrx���jL�L3�ȑ
�Z��Pf9ɝ�����3����u�;ҁ�B3�g���L��N$Y5��
.�o���L��(�(0K�i
E�h��L�!��
VP!���������ⶩ��P`���c�)̍V�6ZAzZ�g���)���� �ϋ-�;"!b)@���x,]vr���
{ř���Sut:[�R��@3�=Q���*m�l?�A�:Q��5�N�����Eƺ���cM�/�̝yD��\
�'�b8t��q�R��iˇ�5i<%
�¶B`�p"����[��
��r��D��J'O[WX|�.dwLJ���P�D��(Y� $���]�o�*:����;Hs�ܳ
��<�&4d9��4x�����e/���u��_��U�� �fڃ�9v��OQ��"W�/��;iƎ�+��ǾbW��e"ȿ��>� [...]
+���G ������@׸hp�;�������c�t��^\5���
�T�,6^�ڗ��/3��=�z���I�r$��i'�?q�KK򨉪�Ѭ��� �߄C�&	
9���8�?�6�Ǔ���u�̺�\�ZO�l�K5k3e[/�A�
VH���
+�-�s;"nfh�*�9+�!
GD.y�DC��D��d����9X��Q�
�4=9Oԝ���A^��	zZڨ�k��u"���b+C_�{�T���x� �+�yy`z�-��vPT��&�I���kr�"r������ƃ�BFa.Dç��1{B:�6

�%�(�'c�
+S'�ˌ�ld���*�Bj�����w2�Zm
w�4A@P�l2(H6U���j�,ԛnv=����=�@)�bT��NƄI��J��]��;����;����B�
z13O(ʐ�B~b��L0v�@JD���]��涃��/���t�*�t�
;�M���8��[�ɐ^�h�7��\׭�Z-p�Tݻ�}�;�9�w�5��<����Ι�m���:ҍt^F������J��pA��.�8��V��:�
v0<�}����ف
-I��A��>!1����z�� ��-FT�z�VG~���G���z���b��QK��U��F�7�f3j<�Y�P���A{����u&r/��-��u�?�J��
;�2�P��t�_��@ƌT4�|Yv�Ѩ�14��r�s
���Y:=�>9��Q����;�w�ìfB�'��0]婂s�Q�g��o�:�µC�E%&_4�Z�f at D�d�T#x�Q��Q�o/�›Q�]�"R�=����
L&H��.p�
+`_$`?x_g</Ԏؕ���W�p)p�U �.QW�V 
�4+�3i���	�
���Z������=�EV���G:�*l����	��ƾ��I����N�-a�n����Ze��c�<tE=�wA�螢�J�������j�����%n�
��9��ƌ츜��;-���|��#���X��?�Hsɿ��&v֛C�sʴ�ְW�tj����{y����>h��t��ڃ�δ�xŭ�V�M¡��C�clH�(��M] ���c�J0��+�>tC�æH뽤
���3�7{�%F��
%�罀D�u^
 C��SB��� ����p�-
������6Q����'
�b1ʼ�]� �^޿2N������x�*+����ͻ<N���rv�NsP����B�L@ې�/�����w��Uatt4|\D�
����
�+����n89ѻA;
�݆��\a=+�xƟ���Ӓ�E�y,-
B�r�k�<"?��,qF�,cL�؏�!��ˡP�^Ol��?���dP�D�(^ѿ��K�
+Q�t��kZ�w��v�5�L�N�ݎ;�V;���?��({�*��e_f�s�{�P�f4�z��9�h�`c޲t8(n<R#s<�ٹ��1L���Q��
gA_1�]�
'U���a�
_L�w�
�#	+�( ~O���1�·2���O��y^��Ly
wnҝ8���E���
��h�}�X"�<���W��FH���|zg�
+g���1�Z!�K��L�>��	��ݞ��d#�\�{q���x�`���Az�@�� $��N�+��u����Gye
���ǙG�ԧ~��aR+�^n&�&tV�0�[��.�u�R�={�EҀ�i�����To��'��
g�Y��
n&�RM�f�{��UO�d`�EfJ��;�:�
+�J WQ���NF�\\`0]�����g҃�Z�3il�λ�Nvma' �M�%+OE:��J�9�)' ��L�^o&�
��m4�4-���€V�y'�_
�$�P�J����h]i�*a3�
+�������E!�݁��=^:R��.\Q+�H>3\dm�I
S<Zd�Ǧ�m��V��,�z�!f�!w�3\�JF���9����=\h���@�'M�`W�"2�n�
WN�ԗ8=i	�odn�?@���?�ӥ8���f������h��KR��䬪����!S��8�a!�o��ӧ�w�HW?�&�^z����ɲΪލ7����gf�k�#�F�S�	F\O����}?��
+}�Ɇ�G�l��RW��H��8��RD�D�#�0��Y�
�=�8
��ʔ9&�3&�s=���
�R�i;�e@���306)���V�m
k���)6�j��	A�	�S�^*.�+��%�O\��I lq�
�RhRh<�`o�/��L����#}�N
�"�
�I^�t��H[��+��xt�t�sHÍ�wTŏ魲�-��Y�q�E`�~�Y:"d�[1�9�������P�	@�K��7�k�R���	��K[�Q�d	ۻ}UW��
�h�|������H���֯Wε8��*��@��]�����l!􀥺b�E
��9�~�z�:���}�Xr>�.�Rn�L�|�hWHU�����H;�N0���-4�����fdw����%��H)<JP'��ݥLF>->�<�/K@����BW�%�����B��X�[��%���!ʐ9�*
�h����xo
+r����"p����%k��޺�l�Xpş�,`?o���AX���L�3���2FxK��]�E&E���YB���'��/W��������6O��/�3m)���h�[B��:lz�b�#��6���FY�iw�k��?�cSg�񈊨~X8�o����k dhq'��I����֝��։���YBĈl�P1�V�[iu�-�7eZp�^2�
��
EC�
s!� �z�!
H
*
�*�DKQk�W�t����F#�v�Tl�*Q�� ��Q�������XB#�=�Q�����y@��Sm������Q<�D����*�6r��n?:0Mc��+����]wGP~��!�����/�&���{���W!|;hk����L��L��r�o�(��Rús��
�aI!��t��d߳
}�
px!W���>�[����xQ�l�6�H�����#p�G�c�XO�!��݃�L�K�ș r҇TF��UR��X�Q~�^���.��\!�����bEe(
#0[�#�V�������̸����D�"'H�w�u
��%��[щ�q,�	HP���jX��'�����Dh�:$ k2E�~���-�t��^$�*���?��u*U�tN��-#�{���0�V8�������B\�?����~ǫ���w�ɍ�Ќ#*]&�m��F��6
���R��7*Y���po�הM
��r�k��}����s/$F5&�5	���-�i���
+���xM�߿�'�����_���w�z�
��wM25rZ�{��5k�B�sA�Y(��[�t<W�;6ed�����w�C� �@ڷh��w��X��1���`��,	�BJ{]�ö/
+7rDUWvp�/�
�m%F3�Qg4�II���B���?QSiWT~g��w�9p�#��l�����39Y�\`���]��+`|X�� ����l
'
�L�mF��M��i*�2glH�(k<¸Ua����ܚ�ѥ�v�
 7�����u�2�O�E�~�QЄ!��")�D�1�wo)D FR������9g��
|�h�V��Jm�8U,�J-�5ᝇd����ggY���c��뵃��ː�I`�/����ѣ�y>��de% ����y{C�]������eeYp����)�kN 2�Of�O��.�#_Ep�*������2Ӄ`�+�V�Y״A�L��Dba� ��a�{
�J{S
B򴹄mzF�-�$�
�Y�~�Xo��VY*I|@]�;�
�`
��Ղ,}��@�3������p{:�g�7�1�2��
��|{�'h�������
h2��l�&�%�K�CO�sE�T��ϐ$�h�NOA�p�����~u;nD�5����2
��D5<������xͅe����1߿�qBN e`"N�I ���?m�:Nr"�
��
�

P�����U�j� � ��v#^Χi"׶�>�X����
��C�Y�,�Pb�!G^�L̑�41N8x
牚K�iND�����Sǡ���+z��+Lo�q
�!H�����u|��f�2��a��S���0 �
����H��\�~�zt��v&��ڹ��Ƌ�-�Z��ogk���U�����>fi\�6�E�݈���oU�/���������7��I�
5�{�4���.����?g�DD�W�DY/v�K� >�N:9z�G}9�FQ����2}ex
y��
=l�8yF�9�Q5�R�="}�p�?>��A��K��L�[m�G
+��*$������������v�?�Q�#w(,Sn�)!��I)y��_ń6�g΢���H�l�3Ph1�
�j
+b
̈́f����Rd�D��E�0ʿ�7O�}I�%
=�

+�k
+�
+X�$��y�����*fIn�f�>��<�J�I7\�w��
%��w_0�D�1a�8�{U���ju�ϕtBA���ŷ�f�=���3Z��U���'l��!}a�<�u�H4/���8�ͅ���x���<2�Lgz
�2 ��&�.�l�C34�^k�ѱ�:x�����-�J
�+F�e��
�<a�M��t�yf��H��"t�q�>g��bv++��E�S�3��Ӯn/��]�Yw�Vid�
D���tvs,$��-V���,�#��J�e�W�$�`Gf���m�._�[A�� ����0�+��2K԰�pg��Ƚ���d0���;�
�4�[M�떠ݣ�G=�#�� n�Lg�;"��R�_�f^�b�I� ��
��>`�.�+2��Y1�=�O
���	h_�թ�Bnש�������'�=�a���e6u�pV�r!U�#"-��ơ���q��T�@�q����ɰ�^e�2��M��fbr�Ҵ<�D84��!���M�*6e�G���8�̙���KO{��8"�W7��V!b����Qf��*8���ډz�
g��À6�fXt:!�{�v�;h�<_6W3�c(�L!�C��uMSG���`@��v�I焖�
�æV��
4
x��=Վ�c�VM9PY4�
B����͡|��2�������
+���|DO�n�2,�����
��)���;�*�gğk ���^5��L��)�
��w!]��6�W�Q��y8�|D��v�p�`{�5?��
+�1�k�eJ����4ʂq9p�l|O��k!�zu_]��`W4"ô}׹�����[gD��EsE<Q�=.d�թ��֢�<B���ZG��
6Q6�&~�v:���ƛ��"����i��3����Y�\59ܗ������ϧ�GD1NO��w5�
N�O�o�k?�kyV�
�����Q<���A.�������̃�+Q��C�_����
"�K��3��:�&MHա�V���#�mW�;�@8_%�u�/��3�34�P`�^��7`
�( *u<
诤g��-k���3Q�!��(.
�p�X;��x�]�����w��~��.Ԩ��J� �JǞ���
�m�]gd��
+�޶�h��.
/�����v�������a
�U�5�)�1X���
+��־��h������
^�h�0���;��K������t��j^�kI���i�k�|� �Q|�F�1bCl
Jdg|Q�{>��*7�
+4��d�Y
Q�ⳳ���`?��k�́���ҽmL��}�-:�e\�c\�*��cg�0+N�
+���(M��C��z�|��RG^�����.Oa��;�̝T�3	�9˗�uu^�!r�U����}�Ȥ�<�� =�AW���N�`��
{����
+�f��z�ۂ�,�W�J�eE㞆��d@�2�.n˞���ڴq�V�� ��%XsM�^.Hs~��aA��m:���� J�Ό�ܑ���w��D�z5Z
�Y����Q��S���;�e��"5#�MV�
�Zq��
��V4����3��$��e�Q�S
j
��Fkgm^�ޞ�
+��`Ŀg�����
����NgRC�m���V"<�	6�Y���g VIG@&��T�VE��hDt���P��
jS9����=Hו��q�
������I!���0^�mT�gɯ]W
���9�.�Y����"��ҡ<'�0�
�t���Ǐ��da\n�0(��~�S���`\�Le03f��8ֶ�s�HVWE<��ٻV|�P�lz�wL
+��Jl��	OǮi�CTg\��ɸ�8*�mרz3��u@�w�D�����
�_���
+�>���TFs~�
�"H�����n�>]z����^(���3m3V3�����Z���˷~�b�-!�� j�w�:È‹
�X0b�;|uB��W�uK���������=Gg
��
�A�d*�3�t�0��9���1�c�~Y��t>�j!#�]��DP�!B�����55��L��_h���k)xq�V*�s"T�X�0�=���Su��0�1_(��_D�+�c���
��uW�4�'�
�?����Ԍ��S��g�D� �W��3
+�T/�D���fe���jܕ��GY���s2u&0���g�'�+�L�:���� ���z\���/;�/#^�.*Dpr�oQ�#B~�~
�r�咮 ���j�ѣ %�}�7
�
��E�oh��P5{����(؞rv�c�U�p�a�bSs��Wc�	m�{W�h��]H�o�|V�<����`�o&�8�"�ӝ���k7B�:W/���ڝi�1+��wbo]=�
���j�R������|\��z�P�j��
�z}p���5u�/��'Ξq��q�8�6�#�t�+\<�AM=�
Gd
��@�)e�E����!7g�]�Ś�*-�H���8FTs�y�+�9�!��}nU�p:T}n�]F�q�_��8-�I`�>�mHzɕ���V����4���hA�"5���?�F
+��L�d��_ia�J/�-p~�㖉4ȥ���ξ�5g�u>���t
���ဏ/9ݡ1����VCī"�z	��j�ʃL�\Ul�7^z�w替��ʙ��"Ø~{�7�)wE�ىA{�
i�T
0�hg
&/���Q��T�e�B���3��v�1g ��h�����RtF�U��`k��Ɏ�
B,2����:R]+)N�]^�+�D
+v"c�q��n��Z�@7"��žet���a�
?p��:Z�LV۳��,�����qʝπ?�S���>����a������)g�1QβJ~F��G~�bC�K�
�ݗW*s�,ly����.
�
�ژ�g
͟j���l�Ln�ß�p^=b��.�����z2_?c�|L�X�:ƜQ�)�׽�����>VXg�f ��WD��
����N���ǟ�+m$
�@�}P��
���(�q�!9ţk���dT���y!2郞���v�po}*bU�^!G�
��>A.שO��Yc�N3=�9'8Β5�1mNciK�3����z�D�*����e�$v��5S����ؼO�L��)�G#n�~�b���5Z�x[���_�o��oQ��߄K��ǜ]�C�Yu���s*��|��5J��*R��u��wƊ�¦fGM
Ca��@�#(v�8!�_&7�d�
�%��2��]�Rc�DtJ��"�u"1`T�q���e��e�z;�����
W���<��@�����OGz؎I�m�$�+�y�h}��
�;'�$�sJL���W�~��������cW�ר戍�Q*�U��VܷH�w�
�
+�}�
��T[�%�`!�']� �+��O�C�Q
I4���2ޡg*F��J�#�ۭ(&lJde���6���x�:z�$�]��6
+Qb�!���yG �0¦,�
+�~ً�-Gi�Ns��?��h�|G:�
��;G/ioD�O#|�ڥ�����^�3ll̐�
�5&/(`��=���p��U�[�
��9#�^  �+�#�O-��(X;Ja8af��pt�Eq!
R祒~��
+5̂����m;�4�� #���'��〉�LK��cś3���L�
+��e�۬�b�
��̙��U��}�
�1�_����wh���ǵm{
��0˴�V�D�̀��i馀������8�Z�2��ۭ�zC@�����jQ���o=�����7iPS���A�H��w���=!�����T�}8.�KP�
5��0�&�� N��i5[	��k�^Pe]�������<2|{�n>�\���Ι:�d����t�:����Gh�H���~��X at 2�"pR�r�]���\I�Bik
����'���R�Gn�;m
+Lv��擶!�����/�zR���on
���ވa�Y�U�MZ���85w\�fC��p�__�]�dM��Y��XU�-���y
x�+�-v<���������8π>ߗk�
�e
+�u�"��3�q�W"�{��{����S_�t5��oT�y|pKd܋݋��eB��^oмߣ�IdҠ�Ɠ[�R�8שgF��%EE�5^٧Y����H�Z�c�G��"�*��}������1�x
Ѷ~�ˉ��$jEL4��n� �E_�L4�,����֋Wp�zaq
����E/{���q�u���w�e7s���� T}�;
+��
�,��谕��_ǿ��I![̞?���~lă���RqיABB�Kex��qC�m|���
>�Q�j
<4�+'��ʠ���#�"���o��oJk�u7u�X�m�lC��a�.�60�~Z�����]�*Ѧ(�p
D}�"�C��<�Д$#ُ�~n^�oQ��
����yoq��A���E�]@�8|��ZB���X�]?
&+sS9�-
:A��GN]?��
����j�{V'@j�C����
�&�F
-��"/���,9�Y�RpĈ��1�O�Z�F�0�feDi�i���q��Y(P#���m�h�.Z 4���:��v�_o����8mo���f�`N�G7�l� ��T0�
�����%f�d��VC�+Cs�YǠKMC�;����F�]������ψ<S��gH[��@K����K��;`7�>΢�P�褘�7^v��=]��*o70wH!
i��&�+P��f
j/	���@�u �|�t��	��}D�[%]O�}�xQ��	�� /A�`����D|=�{s�������J
ɗ���a��g@{������:���;��U:S��*>�"�B�+�Aϔ�=��p�N���.�[R?�!
�2�Qb�w�m�ų���/Q��
P޵�#��T��P�����
�($�g˟/�2��N�0�?E$�
��� O�5hk��I�Uk��|�
+��V[��� m�訪C_8ҿ
�� ^[����rc���R��yF�r���.���O��E>����C@�D��CE6]��x�n.D�W�b�O}���
"��&Q�����ϓ��<v0���g`���&�c60�^���
ǒ����]��/�n�,���Y�������VWE
+24��Vls���*
+
�%d���
K��q�x25�ΊP�
+|����&3�
��*�%���-�yg��: �|�����O����
+���fW��8Ͼ��
�P��8�3kh� 6���!P2 ���w>Od�>gu�B Ž*���:+32���aU0�\�Ѿ�_'�Sr`�襩��9�F�U��0?����^�ì�@���2.^ s�
+i�������%MUtMs��
C4k$����Q�@.��	�B��80u��;
RP-wiG{#0]�꾲 ���{~���� rt����y(u˗&!Vx��[�q �A{؏��8�=���<��&�k��� ��Sfq�Y��A���a��a
S�ВI����S�
9���G��-��
1?ʵ��V�i��_�'����̓%���/)������c|�տ�����_,������������_�����������������������������������������E�י������{0�
�?+n����R¿I�*VL��c
�_�~P]4��k��y��AF�LDX����|r8B�¨]�/���bHgbQÖ�A�Y(k:�
V�Q��ǘ������8О8��}9\&?�N#�
.`�n�I��Rm�se5�< j7Xʇ�匳�2p���¸���5)��T��BTC���rO���=3�
��h$���I�(,�;������l��N
�1;rᣖ
�D+He�U��X�/��J9�����(bD� J;�������,o�
5�N|j���L�I"�޴09��K@��rq0��q��A��B="�3&���n�jK�\��u��d
"/��_��%��N|ث�	��lC��I�}U���>k��Ϗ%� >��;�
lQ�eǖ\��y�
F�����t���@`����Xo귍��5�[jT�m�
����j�ݯ�f�
�jw��OգLꛥ
�'tT��6vP���O�Ȧ
`}���ZOU���w�
���x�q�$�X�C,Bc�=��� Jw�.��{��<��ܲ�9F��LMH? tc��W���_�W��T����(L��XVlU�R+O5}
)��+�;]�x)��~:z��
h���ʲsl��I�������}Ef���ά×^��gΠб
�~&&�q�M{&���-�
c�}���� C��ԇ��X����"`!,;�	�B�(h��#o(��~Pc�� 6�)�=��H4���u(C����	\+�oB��)n/A��悰
c-€>��
�
��!���i�R7�cIX]�>/�73	f�
.?���~c�B�N�1:q9�B!=��Rh���;	�x�98ī�3�r��;�J at I4�
w
+́.!ooo����^P�Cx{
ab�؛�z{F<�\�
U��(
��ZGJ%C�\	�����)߿�#���*r�ޤ9A��`cDP�&��'"�6P��:�q%x�<�
�<y=��f�2�N��P�87%�����������K��Ff��U�8o���c����V
�5���ڠ
�
�=�S�ڝ�-C=�#_��g��x��\f�a�ס�O����������p�bUg�QTq|]�
1���d_x"�mCDA���J
���Vh�@;� _�:�m0#΅,a�x�z���8݄��~”Ղ�ھ�d���O�?�7�*�ݱ����Ԗ�4 at P��������B��~�q�
���[��_����gY
��̅ �0x����Y|����
VWsd��D�^�f�<��������
f�ݫ�r���JtK��:͟�ܱm��C#�8�#��f��آp��ŝ�d�G@wZz��*Rݓoz��+���� �-�
�ngF
����i���Y�


�4�ZB|ȍ;wQb�߿�@<����i���~�
p�Fx�v�~Mهd��~����
�歱��]�^�)$���XW*5$|q:0�=�q�S���V��3��xj���p._O���q4���8@a���9�=X*�:�)

k���S���6�R���b�s���ڪ�Y��
 @�q ���^�
+��
��(:>��@V+3$-���,ꘇ����m�����|(D��J�+����Xm�~��3��	
%��*
ꫡH~e�h˳UŵdE��
+�,�[�CP�|�v|�x�s�yڄ����u@�*�5&O�:��Li���ZxsRĉ�}j:nM]�?
�U
?���v���ƻHh�����;����B�=(���P��/�;2��H at n��~=d�9��*F:
 �1�V�mD���{0���P�|���wy��.

~���e�b
Ur�;DI}�0��H�^��$��QGW�Rf�UUOzL��1�o�Z畊��;,F��m�;�=U��@�O ��K'�
Ւ¾8�
�:O��;⋂�bU�%�
+��F���`[��T���l=�/��4�1Ӥ6i�E��F���
�1f
��gM���y��
�!�a ��\�
i�_\ �X�
�/�
+�M_���o�r���#�XC-w��|���j}3aM�XH�n�Jl�z��I�S�~(�h��|%����������&c�4���G,�W�Z~	�f�(2�LF�3�� /���*hШ-n\g�����[�2"�%B~�����Β��m^3I��m�՟�
+�I���"�s\	+
� F7(���o9
ews
d�w���J�I,y��
��t��`?���b�t
��z�1yA��j�1��.ڽ�
+��j��^GO���%�F���~�у�N�3�kR���K��]�����7�8� +X/Ӄ����tf��Q��:JEu9��ĺE�柳��i�4��[�e��?Ξ�{���K9)�
�R)��
��դ���D���5N�]0R�i��j�����z����1�bqqq:G�`3A���b~���6_?į���d39��`��3HU�UE5=+��*�����4��h0�Zv��~�I���"L*4��
����ܚ�����ñU�0�K*��-8[\4�ܼ4.��A\l���&����d�{D�
��T�q9��(~��9U�
v���ئ�2?D|�y����(%O�'u*E��R�E�!��)�R]b
Y:�&6Zt���Fh������~���'P1
��Z���bi���[ -}��0���{�x	�'��ȶ�0�g
�|��W
+#i*$EHa1��{�
m�m�
mp�>�f)
���x��=ʜ����dN�nD�7�h�$DT!�����F$%�3���=�E�Av�KÔADKG���>("P��B{�b��F��h�vOS��\lB�7z��v*Q�B�-�
{�iT
���RUM��%&��b�S)�x{�����=M����ƨ�����v<
0�7۶� ��U@��R�+B[��Ha��b���-�(c��bڍ���_��G���|?
�j�
f��KX�΁�!l%�f��qs
�#>��3$� q~��(�/�=�������N�����x�3e�����������|�tWpb�0���M��gv>EFU���=*
������q�
{�颢 zdK�Dd���="�SFנ2����yHF��\
�����ȄG��+�aH7���p�>��p�
�0�p]
��S��L��B��yoW-~��霃� ����1��_T�cL�K�f������!=nѪ!��·���3H#A���(�Ws�����$s��
+
�
��"_� 2�㦆2XS��"�h<5�H�>�㝡����ѩ�
��_GD�P#y�
����o
�
HH����Y�q�:�2�0�t%0����t�_:0��g�
�������oj:��eD(����r+!��d�U
�����Du��yjL�Ԟ��Yx����Ȃ`lY�G�i���Ka��
�a��~���*?8.�q\1	3-�yp�Jq�,l}>D 	�ΰ�;��J�Q9
亸�؄�B�i����,
H
ͭ���k��
|2�`��Z�G5��rC�-�V�s��ϳ���G�pOe;!�,�Q��+�ɏC�b	�SZ:H���h^�ը
��
x�{����I�G���s��R˶U�v����N�a���"��'.ۧ�O��[�2�(	\�2<�@�>7�s����%���X�7۱��V����-�
��(s�m�����?2^X��i�}Bw���L4$$In�X����c�l:�㋀�
(��h���= �E�,�F��/+��:`+S+��
�P����9Q-��t57@��@F���g 5�S'�o�w�ME(��`+_���Y {
h� ��l
+xOWC��-z�>>�����VQ�� 
8�$R�R(����
!� ��ߝ�B��"R��W���{�ǻ��s�W�Kv:{�����px,�
���^B[�����6/�
�X�2�b�J�߇�=�pq`(\�
O}ו$
�����`����S�9D����'��J�e�t�\غ: 
Z
x$���.���` ӷ�s$�=�V}=�/`���1
��E����UA�	
	7ʐ	����ˏ+��R��upRx��0!|�%�Wlψj:K4Z2�h��~�NoE�(�ҨC��������&v	0�eB�  JNL��P{	��ʈЅH��fܔ��=�eo���
+�p�b[�v����CI�S���²���E�/N�
6��gG ���R�is/������5���E �'�AG�G)���=I*��{ހ�3�
����+<�s��|��2��Q�)��SБ� �Ĥ��������
����,.���h�Ǫ vթ�
+��٢��^u2�w�p|=�B�И:[�l����!�Ǡ�Hy<q��Z�/dY�	ؿ�Hه◦�r߅�UQ��'0���|��"9��#O��t�V ��_
 }�8����)
+��'�#*�V9~Q�9�N����ڀ�ņ� }3��*�p��#�_�߅� TS��y��T�&y��$���q�ߕ�~���QX�����8Y�n�}D����ƙ}0�Ԡ������m!b�t����<�3����BX�I�����0N�D��(Zp˫؂}�%�cZ<�l��Q�&F�q�Ь��9kf����o��?��
(�^42؉��aB;���!=���S�xct��;�uĬq�~�4D� �(�ڸ
��A�)�\-b��-�~� �2�PF�t=��ے��/��(�\��h@�
�6��f8B�ڔ�vԐl�gg���Yb l
s��
������<0K�-~��9��BZ� �"
��g����Q��C�
w��s�3n�92��률N	�1�J�~{ Lv)pe�?
Ha�.�' �'�t�QC:$h
`M�+�'�>@(������\���bX�\YH��^�J|P��
��c��D�K�r;�h"y���u�{~�#��'��R���?�PO+�QM�(��᭳�Z|��?����K�p�lm��Ê�ߏ+��J{�	��g�͜�x������VvG���JlJ!��Q'b�/i47����E:������.�WI75���0蘺z�"�
+�Ԧr��[(_5�L��S�T
=p|O!ɶ�4Y�9���~�'�*��JP�zp�Tʫ
�3��{.~
����ϟr�ف��
I}0����~��L~�I���[�k�h�@�����[��O�M
+�l�u������Z<��fK5=�h���H�
2�B���Q��
+ Q�/1�s4�8�\�
�A��gMS�<m'%}��|nx����vŤK���L+X�i2Q��9��3����L��g��� ~��v�����aY��'�F`|S����$�{� ��ca䷻n|�R0DgB�����JfFϺ¥+�K�~��
��~�%�i�\��V� M�
E�* 8����\�i��y`яn��Czޡ0?�Z`,�k�Zp���E<�+Li�h���>C0`�l �d��������:��
B
ʹ������#�eg��Lܯ� �!������
���<'o������B�Ї��	�G���5�d8�n��6��=���.?B�{����$���I~�q
Myf�O���t��xks�>ˌ�#�!eU�r#׋B_X��_
@|�^�]��_p�M�j���,z.	
��g�ߨ Ɍ�vېJ7bk�
�9�̱����d����v�o�R{��)�._��_�.�*(�:���@
��VF'�
�)IJt5[_k4�M�e������ꂽ��i��Ϧ��4>��� �мHb��k�?��.Ŀ����GT�GaG,Z��l��LG�Q��w(�D�9l��C���P �Y�������JQt��|t��?��N��{P!��
+��
%��IA
�f�)
�&x�
�
��)��
���-����������A��S%��+�ua,C�
�?��{����Hk�
 S\�Dڈ�־ܘ�QO�H-���<:�c�gC������#զ�I���l߂Z(��b�Ry�),
�m�`�Z�
¦���Vis

d< k�[��G�1Q}Z6�hx���+�E�V՟�o]��D�w�a�e�Kra}t��
	��tO�6�x�?�(a
r�Q�	7)�OԷ�)���8�זQ����UQreo)~�#����d1����h��
�^�3���,vd����t��B�a�&;�.؂��f:X8�ܺ��3O��k�a���d[�'c1�m?�(�a�A2��*�s���h�W��AT-G
0MhfS�	�TT
�1�3
i�
�CQ!����}P�8�v�He^�ۥ��
�[�'�v
>��b(}4aAH���I.�YΪ;�����'8�X:$ #�1.ޮ	6
s����B�=� F;��c�V)2�wm��
}?y�e����kTA��P�a�!(c~,�z�%��j
6�c���U����P
QV�M��
+XMX�װ\���VMq �?��7�1
+i
���a�#%�Ϫ�tM�
"���8�O�WtW	k3��\�&1B*qtR9O��
%�<k>�->�'e� #=�6�W���8b%2�9�m��l\d����
g:|4�|a�6B~ch_��p���V��xZD��ըz*5�7ib5�.��Z�����LI}PB
�a
E�_�ͣ �K�@_b
�ҵ@�;��@�����L���W�Z+�8���������RC
p!����9�L#(_�?�0��
�@O���=�U_���,�������j\�]�P���
+��$�a^�d�#t��++`|�����b6}1}SI	D��
+K<�"��J����O�
T���`��,>eKG0ў�� �p�
�1`CȢ�-����
�v�?�KV���A�<M����j>b����,T�w*
+�+ы�Jr�+�li`�;�1
+f	�E��l?`¡�t

�:�AV3
F��jjy�N(ؑ�N���{�P�I��3�>��!�uP��qJ<��3�����ҺOi+�t){ۋ��d	/afV��I`�j�M��+
�8#0�""4���|�U�&�M����o=®��e�v���uؐ�퇱�s+��f���}��.�K::
����l�r���C5�xW�uI*�?4�xi:NRN
E�ub��*"	�䣤��� �0)��9R�ϱZV�Ւ�6Ղ��O�!�:�d�HҌ$G5g8� �P����߄�e�Hh������ԨD�B���b��Ǔ���}���0=�$�g�
x�.��
l�z��l_'�[(k�4����y�̑�<�
B��L�
�pe�I����%�A�x����� � +��D<Il:@�������b��
+tK�
+
�A���u�g
}��a9�s6>�	Z]���]�0�k�
y���FGZʔ���Q
VH`�>��ס�
p�f���*
+���O��m�1��q�7
1�ة�h�CQ����1\  5$�RF��3kY�'}�
(g��V��w�Ld�)8�;�n�Q,�|%
��>
x������S5��e����=�A-��`.h�v�|�
ռsA�-6�B�,��[�0���hV^Hυhޑ��#���X�K��:���k�
D�!�L�RR���b� ���Ҫ-/0�����ߓ����� �^c��#���,3�JɊ��[�x�p�)��Y�l����Yt6����5�Kγ��Am����O)pb�,�n�T�P��/���(9��]�T�c���o�4��J:��z��l�
����$�F(�Y5L!1y�=ҿ���H��o�'5�
��u(%�~�.��
;i�q@�=�U�nُ��(�C�lLhe�;��9�/0�'0�ts�Q.m V�
˄�9	��	ehmy���a��ˁP�PH��㹕EdFA���^�Q��3 d�/y�3�	H�3XY�=i�%�X�y�&���2b��t��>q2sZ@���
+]S�
v
�*�k���}P�ja��ԈS�|nw,Cz�t�i}:�9 Na� =�J�6�x
��@�-
�@F��~%��������8`���,�|Ch\F(@�5 }~*T��=��i��s��vx�O��ۼ*�(ܟ�*4֫�S?���g���7L���
���#LգFu{]H�������"��E��DP
+ ���Dc�H��ۇ�ʪ�q+h���0b^��R

<��D�
2N�Hc%�+�~\����F
A��j������쟎��#ūjQ��t"�N7Z��R�j����᠟��M�8mNa")�

�mƬ�
����Ύ�B��}�sz#%]�e
�Nq�t�Os�Q�گ9���E��E"a�+$�PPP8L�rEz���ԣESNd-|_��D��5��EۥS��)�d ����|!G{�^��$�� d
me�Ѷ,Vk�E,��k�
KKpTOl��*��ak!�Hݤa��6~�>.�������4	��|N�	���[�ġw�����B
O�Q� 5yN�f"e��=�ۑ,S�X�C�Xg��"Zu�>��
��#cpu����ɄY�'G��z/[2fzu<�{
���A�����MO2�(E�y�,
T��^O���&�c��
 �C�×d)���+�����
5�9��$ܭC�w�)����� ��MoB=P
d�%��6\�t�#� Sqj�]IAh��o�e�4��2���"���6�S1BPB^�M!�k
[�_,��fv�ۿ䯲/{�fH��
�ة(�����f!�x��p����^�
vI+��qƇD�z
re'f���~r�H����=�*~��N��@��z�}(�a���!E�����-���x���Nc��[a�
�	p3H�� 	�7l��6��TX�d��8 /9�#b��YҕȔC߬��
}OY��Ɏ��=�õ��D��
+)�)�	�
���"<��C��K�ô+G�
V�b�����C!�];<C����
��IE����_�@��4
����
��8X\
��'�좃k+���̞<�}@�Um��q����Y�%U8
���
��6�
+��
 6���9�pV�L�
d�f���hRCE%�="HA�&x
v
�Q�?�7�l����Hj�B<��������MTf`��ov�e����U�a�LW���̐YM��aKN� \�u������
9�(oǰ��-u䠠��&�j�m�
���V,ҙX��"������>x3qo�^a@ �͒�t_hV�(TXs�@����%N^�U��
+�3�"�<��I���Rn/�;�Yl-r ���Ue���
+�}/_����bMP�%��N���k�x�*�r�*��bC0
��ro'^{�
l�y)��M�[F�m�rj}��
�b
Q`����!#�����قq�����6^�a(*���}%k��鰊��
r-u��c�"�uV5
Z�bZ]C�
�#gҜ��"
������,�`�7�9m��!�� պ:��
+���xvA�/1��Ҟ�Ĵj
��ҝ)G!%��,�Ϫ
��	�{;������!�Q�>��]��ǃ�)"��5w�
+B�%ѽ�
j� ���O�
�:�,����C�P`kKHۿ�����-������	CeLlj�lթ�˂]
+���d�b����Kd��t�F�$4�����$��|��c�*��%(��ķ6H/g}��h�
vA�.��� P��D�q\5�6 3��͝�ȇ8�:�����7�i5"\��SaQ�
��5 �B��l����dʪ��
���:
���?�ӆ
����u�Z�
V@�AK�V(�����K)l
WD]�v��h�]���1R���9�+���*u��RXy�i>򚃙8]�౒��P�i���2��6�w���e>�����T[v:�j�x�[�H����x�+ݿ�P����zXA
=G~0}�y�i�d*�O1�Q���y�8p����^��P�?�:3�"t��ʡ��8�/�DQ�_�A�fsle�d��8�h�Q[p����O�H���7�
���܈-wc�:��g�:��zK8����yE�g�@��u��#�x�4���7�,�
�(v��	�O G�zj���
0�w�C���(�}���%m)pۡ|���E���H%
�`�{�.p�@>E�km�k���T�h������Q�1��UC����J�qp[K�ͤ�~����
nj�6�����
M�L"F�#+��B���\AhP�$��0+I� qHM�:�Ѡ��È���0 �S� wSQ�� B%�c^ o��A
����ԋ�G��}erx%d�z���,QG�r�f��
^�]{
���>V3qY��6��c�$R�L2��ރ�Xs�Ϋ���"U�>�T�fl0l�*���h�<�4U�t)�����k���>�*E%U;Qc{xU�A�r�w�$;��
�mE�V�w`�ӷ�*�SC�9g*��=�
+�ϑ���l�YT
+��<�µ"�M)�%F�qR.P1Q��%��J�5�c3��1C�`O�
�:��ݪ���s �`ؙ��5���1�
Z�'�~��L��ΐz�\
3���(rF�'��@�v�9"��L�s�� n
L@
+��(@a�w/d�y6�-�,����Q^鴠Yd\��Ѣ��Z��
�Y�2�F\�kd�9�홋;DGf�P�	���X�t�i_)6�p8熫�
��uw����*
�c�g�8:�o�����=5�uI��
�
+
r"B��FD�G���;
�[��/��
+1��I��H5��ù��u�����
Pe�qU�w	�b��
�ƲO��BD�CD�k1�����9�_�g	;_��I?�0H�6x�2��a���s/c�꾤�W
z�b���� X

J�JLOt���f�
q�4�4�/ӈĆ�t����x%5c��?�8V�A�W�=��>:�����Ew���>����č�K��+�
�(�f������O�x��+��3:�\�����eԒ�3ޘ�5w�G����
D'�^oY�Gg�T��
��NПF�3�����F%ȐHVH�\��!���Q/�T��S8��R$�����&�X
+���c��
S<�P��b~����B�aY�>>��=a�~:�d�}����7���v
��8T?^�F�_�~�!F��t"�!slE'��HE��3���Ͷ����~*XR��o!�0�:���H�d1��ĭ0=t�4>�׽�����](�7�I(Mٙ�sAugX�	��8M��;�
�' ��d]B0����'�����V�D_i$�l��z�
�-�h�2�ؽ�<�c�z)?}�L
+ۻ�v�m8k�ֽ�����Fs�1D��"S���䢒
֮=7ɷ�9Tw�9C����F"#�o�f�c��#j6f�<�C�v����HR���j���z�Y��	�I����$�G��b�;\��֬��kI%
+Qř��]��f��BQN#"���j\��Z���q��
+ڽR�5�
e	%1��W��c��$��_�<���h�S�e�jT*�Ϣ^瞛Ѷ�}�F���\ia��t��tG�dt�
������ڝ�w��F�]V�Nɴ���
�1�$0�=.�]O�{$�(����{Ȫ0m9�d��!��gDx� '��T�-ANu��8�VP�AXOSXG��u,�\�yj�d` rsŸ-�!ێ���.`�P(XpE���8��HZ��o�P���Ò
E/

�^�H�pdp�~�T{o��s�]��DQbc����[��Bd|�g�d=:A՞&��TJ����y�(�V�
�蔚��!�q
�kU��xt����f�u���8]5$��{\�`&Wq�8�։��}�Hal�uG
�]�T�s��Xݴ�,�l����V"[@{�B��b�����̄�zT -D���l��N�m�z�?�����
hX0+bVi��Pm
+�E�i^fd0)���p�h�:�q�Q��f������
�aʵ����"9я�2��T-�7]�,�C�[�V�F>.0�%�F���SG�@�=���F�p�R1�a0��awRh���Ⱦ�]��P)�G�B*XB��= �Ć�X����4�m�j
�͋����d�W��:�ď?�
z�8���F8"1'1� 0���
���G�#�2��Wz�"�^�z;�U[}�Mm�l���X�p7*���E�]�*lTM�����
p��Wٞ�i����0P���I��Y�t� ��~g:��y�x]@

���%��J���`,���֭��k��D�����!B�o3��H�r������VHu
E�9�V
+U�
ʮ����~p1f;*ݭ,�\D>��բ쾯��JFv�N�����th����.1��ا
��?
�lѱ-�4[�6��+l	�>�c����f.�;��rQ��)�#�&�Qq���c{����/h$*�b�6��<�#A��=�GDo/��{�
܌��
+���6K�6��ʡԨ4��f�
�G�\����O�En�B�i�3���9J�,�{����R�Yr�y��K�%H���e*�K[m[ޘ�P4)7��*�N�ds^U�C
,+۵����n
� �Ԟl���&�-J-�InXȄҨE̺������;�}��\���A���ޛX
H�#c?5�`�
�a]"�m�9�AqM�N}����lY�ዾPJ��F%q��QMka9'`��F A����J�U�+�@5k�SD�
���pU��@E@?�8U�����)�*��k7���� �jt� 
�

+y'�
+�`>�P����Ř
+�#(�t�.�ȵBs٦!;s��Y����R�K(}6�h v>9�d
+>Pq8��Z����ݾu��R����D
�%�M���u��'����
2��P�2Syũ�㝞�Y�&�
��`�E��D�S-R�F��8����bNl ���� Ir!�n(&�(,l�u�e��ս�ﶹP�|��*��L׃���@zQ�'���c"X�*!�KJ:=Ombi&�,�#��[jO!�vƂ_o53��ׅ�. �(j��X�k���2Cݺ
�G���VsoD�إ76h�{�-�㺄H�sJ��1[tw�l�s#F��FǶQ�$	��IKl��{�v�ꀯ[K�ȁ ��wo�
E�l�'|�ٓiH�΅X�yfTOB�u
7�Ny Ŀ
�m��:�a&��l|�Ϥ�:f�����ӑY�%(2{ δյ
Ay�=�qgm�Є�1
��s�(��v$�8��<��x] ���{\ �Ʉ~�
+� ~P|�1����X&[8`��p��!��.֧��

�Kg	�a��_������GCXY�
���8��_Ex�f
����!LJ�b�s�j�y~4b 
 ���"D����[TZ�ZcCOO
��^� e
��D�4aW��d'�5=���[P,^hԬ_|*����|"kl-k�PV���U|4���^��V��^�ݑ��:������CX=H�`E����l5ve;b�~&�V
���X��Դ����M�e+����
�ѭW
Cf�]�N��t����1u��|9�$��j��:c��
��Kf��APKAP;��Q���.�����4XOdFt4��Kៈ&P5!�'���~�_�8~;f��ơS�	�
4ԣ���{��!�ߵj
+Г�q��{�{^�֣�$C�^���M��� X
c�X+=��K`ا����B�k
Q��3�%`f� �:R~>��a�fE
+u��[&��Ue��*Q���{ߘ���5y�)Zq�~��-��|�P#B� 3����9 ׌7�r�;��T*A�/ד@'YS��
��QQ��[
'��%
H� ���="�@�튩t�x
�v֣�݊�$*�{�r�w�ٻ����wHX���#�K���	2"DQ�8�EŔ�X@#eR
���V�����4�LC��\e�k�]/�PO�ӑ.7�qA�J��
n2���ޱs
+�)=rn�E���I��
����ȣ�1�fX&L>�B�>P +��f
O9O{""u
+E���P/S\I����n�<���vkp#Je�X���i���\ǵV�
+/�R�MJ��6�8z[�YУȖ*����.���pR3������.-���'��M�#�����Ggٜ�� ]�u����3���
+�ӧv���Z�:��M��%�qi3�b���_����
5K����ϦBD����r�^‚�ؾP����
+c����~˱�
��sP�XS��#̆M7 2�prA�9@�=��UQ>�j��N1�5.u���&��=l–�ۆ�>��O�?�%�F�ش���Ӽ\�g{��g�%���
RzD�KP�RG���>Щ|���H�D����—��$D �O�m�r�GK�ۗ�yB�r�	8̳�^BQ�
π���9�^;���rZ���(�.�S	�<��3��F��&ԴN)��8?R��ذ2��="�E�t>k���"=i��qW��F�j��Rx
�z�6V�)���NS�?�Y$���Q�$�S�������Ў1.�	@،+� �B�3<��#"�*�����JS#F�#�
*R��pC���z�<����kDth>X�J����;��}&4�(^)��y��0)Z�
���
p].�p�ٴ����Y}�e�#
��*J{�EC��9AX{�N��B����a�5{��B��}�ؼ��{��X�)������į�q�ٿ���gܮ�~)mf|���if��+����� �١���[L�_��� ��n@Q�3���6�G!�,��Q��ڵ`����A���C��r���~5�#jo����ȊN�p�)u� ((�+
D�^v����B������K>����p���R�� #<�E�	�
�0�0+�'](.*c���s�3A�~Tt� �!��3W�8yg�"߮�t���[ [...]
+èX�WLbO �b�s@}<ꕔ� 4ճ�聶��iC��h�@?�~R6Vֽ���T
�%�x��,NF&B�d��wb�(

+R/����g�
ܿ#��?�Ss�(` j���ֿckT(rMKN�!O�)���:��(kI��R���‚�3�&�q
+x�ˬ����@����c[a�#�S�J
+t˒��W������#�:7_lמ(�,q`
�xMΟȞ��|j�{�
+S��~����1�ن��m�x��
j9���`[qP�"8�p�9]Ul>��\n"0�).��z�M�8�!p�G=���԰��<�_z%��~�������A�$j at q@��s=�I�
3���s��<��ļO�$C�*��v��
�)���9�i�:��WaI<糱���uN�Z	
����H��S<8��
�;���s��)'
+U㭁ſF0��#P/*��<�k����	Ò�96�4��Tz��!I�Vu��@	Ħ�Su�q��'�8�W�*S�:K-����Ȁ/�v����}��)�)c�k�=3����p�֐;���%v��G�:ơ���1X!�G����w���&�����)k��w�Ii�6
Q�Yߏ�L��Ǎ�U{�e�cZӇ������r����.�Y?�p�
��
+�~?�3a���`(�=gam)֝��p P`j�C��r�h$�HP�B��ſ���*�#B弇���

ԟr|JlE���O���|ROX��7%9���1x��դ��C��gWDu)96Y��2o���^	���ΰ�@9�3}?�o鼛� ���w%��ď9�{��3	�6�pPg�A]�=8|dsU�a
@BCU�t��a'#ꌢ2��S�;p %z@�� �+�z���T�׃$�V�P��]�O�f8ѳF5���O�o1ζ�ɳ,�M���Um� ��&��)ה-�� ��
��J���I_U@례F]�n	��w�����]�;<�G���20�h�df�oE�1[�Տ4��g�E�9f)��ء��3U�=]�-
+�[�F����@3��~෷�0�� ��ޣ���w4E�q����/�G|��ߢ��f��ǰ�_��h�A�I����G#�
�1���q�����)�i
�
xhN�v��DE�A�8*�p���JI�Ȁ���ai�
+�؁��2J��D��={O
Q������zvȱ�_���|�����<�2J
+��")��8+H�{���8�L�����Z0���|��,�R�<Bn��መ'B�z��DX�ȡ�G��q�c����|�|L��0�:
�ǀ�P4�, �mfb#؞1��"��(^M�J���;�e�Y���$o'â��"vh�a�x�-�<C��:����=:s�8����m*|�s{�d�u
�5A]C��s�W`�u��Y�5 #$�i��C���	-Ey(�x
�}�d��9��K���U^X�H�N��@�/�0b>E(��jIS�
��q�k0 ��E�V�p�m�]��)ɢ��Uc�뺲K�ChC�q�ym{�3���e�Z��l���#kOч�k�: �~���#���� Ӽ�f���p�kE�C�	l\��P�o
X�
���kc�D�!+4�3�ִ����*jƍ��
+j����hm�$�ڽ��.�}�S��^f�<��w�Rb[4<�jQH,�F
?E\^�{�"u9e$"�ΒX��IqZ���dsԐR��QV1ϛ`���~�j׎(�("B�
+�^a���
B�a�*���wt��J=� ���z
�s�B:���$k�\���9_h8�N��X)Yߥ�&*|g6/6H���q�w��#
+�M���MF	gc% ����Ck@
+_�ޔ� ������;e�jr�
Hv-. �_���*����@Ft����9"���L~�<��Ѯ���2�������r���"�Eh�Ղl�f��!
+�f��pt�*��+��v
�wV_�������'�M
�G��=	���
u,���
'"�)��~� 0�:�����'����.��{X�
x
��R�FS&+���x
+tjY�jF5��&/�#"�/L�c�H�y>��1 ��"3�E�T�ī��c_#�AH�e��J�K	�A�v��u��
�~�h8
���a���/��ls�<�P*��>��^���|kDK �v�Yy���ev<D�8H�v�n&��E�o�
�
 ����2�:�����m5֛Q�0=
��^r�����a�
^�T�z>���J�{D<�CS}����,�Sy�2�f��*i=���
�l�*�oQ�؝IT�}΍���q��t �
�` u
+&�y�r?�,(=��
8�G�G[O<�@^���G��
+��r����e
	�
�J�B5�#M�ɐ �G�����{D_�A@!��6�zQ�n��A�KZ
��JH:��P9�C��5f4��d�B�v|������8^�Ȭ
|��!��"
����d�8 ʗ&]ZGTP24������#�
+�в�T��$ZT`h�jH�T�)e���'��|]S��0Xw���F������>�
@���&{ �����h�M�=�(��hۡ�W�Y��KW$�Io
�3��pS�G�����0�8�"$�,96��g���jk�%{h�4/E�[ԛ�*��$_s�Xs���d�x
�<}
���
�%4!N0�ۇ���0$o�@�/�=.`�}�S�ȨBMZ/`��.3�3�ϕ`Q
���GJ	�jxKb� �6�r#����u�#���ّ���Q��w�U���h��<�xBIL�G>
��~��C1d^�^,�w��W��+e��6�{��е�,���
ԯ0X���.<�
+�f�h_ �#�n�
Օ'�)�-��&��F����h�GĘ:Jpo_-T�;�T1�yrk���T����_��Cu�_�o�l�xs`�!
~�����:H^8,�������l3��Ր�bT���I��X
~>��$�N?b*T�����������#�*��P����)v�qfܑ��H��?�&��=�D\��o�R��<YC��BV
!��t�p^E#LO$rb�T��xTEc��M�"Ktv��_GH:b��
׸��	x�	Eo��_`D��KTp'��B���J��,
�'�h�=�c�)?��_QP at Uz���e�$����hy4�@[���te� �G�|

u5�
�P�V�A#`�T������oQ�I�>����Y)^(�
���P� �jă�c���ÊL��*Gߣ:��s���`�W�pO1�
+�"��υ|�1��r�QeE�$s��	{��̞_��o�0S�� lM4�й�Xq�J��W�E���
.}S�cb&�tA���©�p)a+�(����c{�(��3�^U�Ղ���K
��`�c���m��oQ�;����Ƕz1�z�Nb% ��5M�A��}����ѵ�k=�\a:�; �;7�,+
�
���苕� �)i���v����g
+�-u��%�	�7�H��'&�u4�
rv��Aq��P�N�����f���>���)�G�P�
8F�
+�
��l�Ǣ�L"��r Wf��'��^Yyq���߰�W��>!h�
y�^<Z`0�dRu�97p �H�^�z�L��_����H���4�?�d	���K�����h�|�տ�����_,������������_�����������������������������������������~���������������K����
�	���� �_f����R�Í�p�/ c�|5v!����;��<Q{Z��~1�ߢ�����=5�W�
�̈��T#�ri��(��a���046��p�{�o�D�Xx���ۊ(*�A���$X�
=��(�O ;�C+Yw�ta)�E{�/��Ixg7#���(Kj����M���8�5�D�?!s�,�l� �KD

�2h����Q�8SfD��
+Vq�=�lI����šy�����S�@R���[4gŎუ�^�[�f��v({ƌڀ���(��E�/�cë)��A�
��cQ�í
�m"ط0Ce1��>q<)e��4�'�SMh�x�;^�;AF/yDƳޠ$3Y��ɜ
+�p���+=EX
e&�Nc֛(�NL(5�(~��f�x�q��w�~���'0$�.TJ���ç#JQ_����7���F/�}��
u��s0
��q�+�=����e���Ǝ!s�C���iD� E�E�-Q!TJ�`~
��k��{��|A0��>Ӯ�
+�"�`A?�x��?G ��ϻ�uW��AO�¼�1FUU�Ԁ �� �ëދ�4��s};��ӂV>|�
+�
O���X���ݒF:�glKOe�չ�!>��*(pp��
�PD=��F�].�~�
3�
S5y+)�=�}E�%"��&�����MĖ��z&���it�����v�;
؏?���C!b�Q4�Ѻ��2��B�aR���A�F� )Bu�&���h3!a�$�E<n`&��J��(&���R�$2�[���=������#l8�.<x�u|<��"b�)f��D�$F�c����/�-4�$^>��{lB�X���@|F��f*{;�<�wz
iVq�9��
�(��@H�E��3��z��*�d�̵U�<���?�����Ȧ/ā��[�^�40���;�;	J
+x#��Ž��`П�9$��2Pr�xS�B������s�_�@׀�'�| &K�
+f	 7{�݊}0Z��b�(Q�EҼ�w��!̱�7��H�
�y2�(�Go^i	�� ���y��ej�Ol]
+�yJ^�9�<%��+c�8O��ʗ�;
H"��b�P�5gbJ6g�3����f�A�m��P��"&exŻL���1S9
V����^��Z�C�����
F5��c�VN
{w���W?�Z
k���`���,��g�����m�؛�LV�g��g�,q~� "r>=4�[#Q����K藞i�O�m

�(+1�{�a���[�
���`a�y]7���A���g�M
+�
/�3Dq��,Bx͓8 at J�֖Sx�nF����J "^��bZO���,ٹ_\zR,�=S��0�b��
�+�V��oA!�V�ΚX��"�|
89,��Y0��}��3��J��*�0�k�&�

����D��4�({j���[AD�LC�6"
q�!�
�C�&JԶ�

+�6�h��x(��ȯ-e$Ф(
W���e�F3��
��zC~>/�Ί\��
#�
�P5	^]+X�D��N���
r�f,�
gy
g(r蚴h�k�@%�,�V��y�9hNzO�-���)����  ���F��aSn;$P�qX}��
}�{!�!e^Hk��{�c�<u���>@�݄b{Oy���zi�;�ڷ�H,�݄�kn�4�x�"J�S�ԔgXms��17*��o�

+�B��^r�=<gx?H
��R��5���&Hت!q��Q�|Z�:���\�g�m�5 ="4HW�1Ώ(J�:˰^7{�3Ƴ��\�,W۬;��qj��=IC�b�LR��t�y�`��
�����i�7<I32Y�Z \�]��%�Y,�0�~VѫƗp��p
�@a�T�<?c�=jr�) �=.�/�����@y2�N�LU�v�+Օ���- �B͋/�$g���F
f�����B�
������]��۱�֙��ю�
�Į�aL!
n/	z�-*I[�|N��*��	��=!��Ԁƺ(
=p�9�ҵ�c9�����g<
Xw�4��P_[($V���Rق�_N�`����;8`;
+R��jMb��
w*ԋ�v?BUU�ZZ� �}F� V�5��d��aX�x������S��E�t�joQ�PL�?���
�9�����Q�R�s at A����
w
��"��Bw\
���y��Y�)(QS��xM�|�{�:���A���{��]�
ͤ}
����}P�m�r��]�%6�M~�='![Uש�Οµ�@�~����	 lT�q4�o#��^�
�����g�K��bǸ���nV�VV�`����&3��NT�Ip�w����'�q~Swϸ���E��sض�'V������bs#֕�礁���
+�w�Qa�rB+��6c��DT�.�(z�Du��v��$F�##����'Q���߁�'�s����0���ܻ �.�_���L���ۧ�zg��
ρbf�r�Q�BC�~ȭ�B5ÊPQU�VI6K�ī�@�0�2!`�W�'<����)�,gu5/Hiv:�%�.�ZR�N�����
Ώ��*y
+��+�-�`�u�+d�RV�It6�̑{�זͪ�cM����ي6s+nZ��F�<kYC�`�j͕�u����<��#��I�a���	S�9��d�7���CC{xT�c��\�|"3T�
+��z�
]���M :�m�@�'��{�tA@��|5��H�S�NLJ���&a�b
����8󸩫���
M�e@���1�5e|O
:�!���P�ޫp�p{�w�F�dv�{�c;�+Qv�Ru�k Ff�ui ��
+;�0�}7���i��j��DžR,Fra8����O����q��q���EH�Ȑ���3��'^�H��i�ǁ�T�
+Y�fB������#����|?���	+�����ԁ�|5�
�i�=팰c%��1�io^	����
+��y�V�

v�ܽG���E��2LG�iXM���v_,�=s��<�$��r��*���Yr:
+�n
ɔ&]�.
�y�F��J���XV���W�l���c�lN
5~����^Wv"'�h^��
Zܣ��
\���›C�I�1H+�"��`E����Lzh�c�w�(�B)t���۫췷�@)j�kh��
�2�:���"@
A	N�Γ{��� ` e@
+�
+=n^��喇,��
�
^~��ow���c�5�i>�d
+��@KK,v�P�\H�u�'R;�b�I���{S�>Wz�<���g�D�P��yL���b�[�ch�#�����K�6;�g"
+<��yt�u%��#�"
+Er��4��
�X�DT3�q!�Qd���J�5��]�WB/���')F�R(��IV�`
2"�B(F<.3��1��~T�m7'�WB�~�8əŵ�7��*f����>
�ÄP�]�ߣZ��4J�T+�"X�sd"u�n�I &�eL5K������+&Z���i���Z�`1��[OG�="$��e���L�ׄ�~4;z�[���2:����c�㶶�
q�Ѩ"]�߃,�6�Q��T�1	y���+L�P]�9�GAf��߲3�����P;�!��,�A
>����G��*C��7{�p�JA
�Ů�������xb���먘�/��t��
����s�8螟}r�~
݌
1����of�~��K��:�),���֛GF)Q�A� ��
� ��Q/"Ҵ�vx���C��XF at a2b��M��3a\A0�Gɉ�$n��;AH-JZ���>�
�5U� Z%���"bM[v�Hl����<�y���A�!�G]DgL�"�a�
�^�\��Qh9��xMSb��]��@;�*0��[�NX��#-P�Э&�ڽ9`��
 ��� �^=M���T��_
�8���
ȬX����Pt��w*p]�v�K6ɕU6�{@��2����e�Lݢ��Fo^GszM�N��
??��
�Ht��GY
�����
[k|@���7B9�j|��(

㌬6ul��^�-n�h��/�
s~
x
ߝ�1|
��O��b3��#a|���t�A�@A1΋��ք�l ̺�Dޏ�e:⬲dx��̫�\�vHt��غ��
��H������ޖ���9��%߂(�Ӎ���
1�(Mˎ�Q}���@�EQߔ{�HKD�a��!�ؗ�av��.
	63����`"�&8 �cM�
+��} ��9��+��I<���<�<�$?t��j�uڦF5�Xėb���s!:�6���(Њp�W
����l��j9)�ΚHQ��)�
��
+�E���sl�,hXa����@�Q{b
S�ʔlie��а?�*fDXu�9="ƍha��%
����$��/�X�S'�m?$Y�0�{���j�[�kT��4
r|� �
+Wg���Ȍ�4�ي s
�>���a��� � ��/�!6���x�K at cc���j(C{V�T��r "�@�3�6N>�^zW�o=��nG��m��h��Ŗ6]t՞��jF� p=U`1�I��u,��fC��
�f�,:�c�V �PO$j�JG�
�3�ڲ�rd(�a�
,�Dװrn�0�܃���L��R���'eB��x�^֨Q?|��NTm��1v�a��
^I}3Jԕ
+�/���b�� ���9/2����|?��6,�(˅~җ��Mۻۧ;�ϙ�� 
Q�}���
Y��ED�($.x��g��:�8q� �ĕ���M�V6�� H:1.���_�'��}����	q�T҈������=�U�hp�� I
+"�GD��+�#���5���q%Q�	Z��R�%˯�������[6���Zhb:x����^T�ҡ6H�-M5�!Q�iA�=9~���#U&���E�
���p�0�kWJ�8.]~�u
+|�`-
d��Q�+�m$�R:�:QO������}�n6��=�,浜�S�ʼn+��y��[$yo����
ȂX�!u�D�����T�!�}���������z�m�w������91�0��~�d��~�ē�n�}'u�c� fH�ݷ�Gq>���g��J���x-�x^�Ļ�<��=��<�vn)�Df-F=0+�q��]����~0�:�{y���\d�G�
�h���o���؃	�����އ����}�����Z�&_�B?��H�6H�?]3+IQ�_��3����/ke �x��q�� Ath���g=�� 5�{�Cü��]�։��wg:��;n
���,q7�a���[���qh<Tج9x�;�U��	 ��r*��B�@�Ta��T���c}����@��<����6e�FG��s}�i�[��~���R��ٱ}���r���v�Ex�E�Q4g
�r�s����i!��C
�>��w�H�n��ۃ��3Q� �x;�(��HO��J�
+1G�G�Ў�
�
v�Ze�B�|�Kb�t��S��t���SUOi|���LᏋ�x�B_� U�0%�Œ��}_l������cCO��%�C�M��{�����te���6���C��ѝ ך����挶`
+�W�Ų����droRa:z
NKĠ1��D��B�.G�{j�Ņ�E����6+�B4��%�~~9X�#�Ö�Y�l��p�
V�-��O�A �d�j��*�>�8}�$��@�
+!�P�w9�O�;��p;�"~{����0�P���v
�),>Y�˴T����[o(��:�W�  
+�EnTؖ����!����7�xQ��N����{�kR��4�;R
�u�b�q�r�Uڛ��t�@�
��<���߮{��-������prwG �Z�qv+��1υ�nP壌�.�뎠Q�PLۧ	G��
+"Q)�f�!�}���
 pOpݴ��	����2�
i���0D{S�@DF�~t�d�{�^S�+�iR�E�
�x��C�n�ޢ�ޢ��E��j��3���`qs�]�Yl��2�o1�ZL2{7��
?
Ї�
+29`�� �L�Ht!���sH%�Hw�A��	
�,�> �{�\���s�p��i��
5�D�X��H��W�a.�q�B\j�z��� Q*C܍J7�̱�-0� I*�="�P��6�
&�=�*�+ƭ��L/����~�@5M0�w���hr
��1,���
�JX1��t��<�{H?#"��u{<����1�9`�ʃ�����aF&�S���v�
�
L��x��(���@|��AW�Q���^A������
n˲l�{���M��d��tk�V��@���_���
����o���]>V�ȉ���1b�t}D>

��*��ޓf��1;���o�O����="�U�L�� ?�g
�4�����Zs��C��f�Q�(�scAg�C���s;p4��
�]t�Y
��wݫ$H�
9o�3���^�=�4����^���@�E�%F����iA�>�jT[U�+7�腓@G�[�Ow�#�:)���Y�F:i����d1y���
�<Gr�=
+1
I83�H��mZ
N\��v�;sTRb�*0T'�'_�B
�	e;,��tA���]�1�B��������L�f��o�
+
���!-�
� �\ͳk�j�=�;�tB�$.�B$�����x�{��~O��ʞ/_b�9m���%�-& i	(�I	B��D�I�ݯ�
}�%
mOx/��O�jt��4zT���}� �BO��v{[oQ�
[�ir�7���u'Pܚ��N���D{`�����;�ޫŴ@<���Ѥv�a��c�7>��2&̖��?���@A����
	�W�s� '�F�4��ٙ���w�O�!tO�|��o�‚���T�� sg#�Pܭ}!O�f[X��(�Nݮ���̃x!���
)�M�
+�ctb(ER:@��=[
wq��bF
+�F��CB߶�({�`p��f��Va4�s	�2U}{L�[��(i2�2�T��<�A�7v����X���h���4�<�eQ-�
�w<�is  �_x��煔�J���C�"��y�'=���@  �P�S��OQ�,h�,������� d���ٟ?) �����K��=�(�9[;3�ݼ3Wם���5TY�*M҈:�4
1#g�Ȟ�GXT��h�1�*�
c�f6� %+�{���q�=�9�$M
�
��n����ɒ�2�9���=�`�
q ������qFqR��ȝ����Ԩ�1�xBo��{$�j
+���ٕp�؜�Q��L�p�4'L��T��Zs��4f�Z-���ݟ�%⒠�];�r��Cy�b�m��zj
+>��e�B�Ȉ=9�+�h��T�CDC�<�z���
 �H��Y�qE�N����'�9�ْ��a� �n�H[ߥ�0�P�ơ��	���-���!ύ�_�0`醎27��da���@�N�W.�a���6�R Q�F�>�M�u���u���l��
��!}����|u��_�Ѽ�'����Aa0�W�L����ʟqks�w�h���4A�SUzAUۊQ��B�unh�RAaL��0a
��J{�
X�_��a���
���ʡL�
+ �����tE�`H�g�����g.�h��+���|~�
�����B�x�-Ϝ;S,j�,�[uZ�"��@$
�ί��)�Ϫ����9�
.�M��hS�Бq���[�
�
*�L&p��q��w:.����^[�$�U�Etu֖k��f�#���gU�}��x�g���5&�
W�x
C�1S��z�Di�LF p(�#���X�U�'�V�=�_��f�4��:~�}�y�
�ىc����}�
�O�pX�ǁ�[#
%,<슈���x�:�9!�t��y���V�B��ƃ!u��C�\��7q4��l1%FZ��yS��.0��s�A|	���ɡu`�yo�FT��fϝF�uͦ<
��Cd�͛Ī\��H��I���*U��iK+i��΢`N)ص<��)�Ge&��'��u Y�
�%�gjC�Q�P2f�@����qj #���n��@
~m�]ñ
6���a>PЊ=R��Ȑ��Oe����
h�,����kDDQ�P�
�4�)v����(ׁ
+�w��GKY�8K�#’��T.���uV��8&9tm]���:<+'��|�� �n�@�"�?�ϧ�K�֑�k�����"�:�ߗ��G��b�F����Y#[��r�\Op��|H'���An���<ێ\@�7� J
u˦UQ"���yq%sAX5���+h�L��I�&.���^�#�GL��V�
w3��#o��ـr}vh"��h���wK�{;�b�
tB|'z$Җ0�m�p�\��#�'	��o����Q����ݣ���^ʁ�/
æ�aկb�X�X�Ř ���Җ�w���3�y�ޡ'�PÅ#z�0P�M_uQ�,%=�4ה�H�Ì� �<,+D�=%"� ,��
>�C� 	��:�3C�e�Bp�R
�-(
+�N��a�5��e�##���p���v�W;�B��
MhJ��X�6[�xP�a�IF$�v�=ĻƂŻ��P�y+�������f��B"�R����]4d�ʚ����ԧԗzx
+�P��q5Ȑ��q!�ܒ ϸ�D�
�s�����P#�8�G��ݮ8޽� ��
��?� ���)�7Ÿ�ey{��4
�t�'U�&w��W
��S�,p>�o�U�)b5�|Q�&{����t�r��}EY��+;5�}�{\+E+��]���
�ۗ
+f;�	���S��X�ɍ� �쉝��]ѫsU�AT΢6-�d��a�D<�!	\9r/4��)�ߥ���E�f&� �
�l R�Ma�y��5�&�x�>'�^}�b
�PyNl��~��!�
�`;�n�C��~\ d�q�*�ɽ����t����5I��O���Xtw��ٴb�����ԝ��v����u��b�
�m��h'�
�c~'FC��*�1IMȶ�2�4,�9|��k۽o�
��L��c�%�5]_#r��iqU��ذ�������JT�9��1i��€���_Wx��#cN؊-����Y�O��B�*C�g]�]
dG�x�|)�C�y���Ե�ۡ��")nQ)����},B��y�G���l��
$�-+�:��� ,D�������k���
+T�^ ,
��G#�\v�ΆXn�H�	��0 ;�2�gI&Y�cI���|^p�"��j��&}�vn����N����0J��C�*�����ߚ|�j�EC!,�t��o,�蘁���Ϻ!0�v�@���v��U:bW5$?�c��Z����3�!\��+0⼝�;A��v��1�{����

�LCQ��z
(J$%<��K�k:���I�	�y��5ٓJ���PhEm���H�T����
��0)�IrV����=�ϭJ
W
����4
+*E��(�%���j�P�T���
�v�XmD
+gF�Èv%F�#
�I�h�wܐˎ+�\QB�r��7_2�?�R�9[���D/�6 ����~�P=����� ���p�z�����9}�
QE��&�!-�H�)��Ad;5��&���9�2�.��*~BX^��h�!Ǡ���S�+�Z���V���=۹�Q�͈j�
ؚ������+'�̒�p=BK��>T�N�D���?��m�z%=ϻ��:t|���a��$�`��@d�" w�z��8��sLiA@�!���o�

dշy7_gZb�)'C_y���I�� J��+
����&��R��"�[��o�$x�M>!
�L��
�)��5��ﷂr8���_�XwMJ�k��g
���^�r�0��I-�UIUP�B5��M��i�2"n�@l��|�{}��g��>^��1��q�V4�o55{�c5uߐ�e���� H�~��D
+�
{*��7��W8��et7
kYO��Z3gʦ�X�h���"��c
}�
�+��Fv%R��M<�Z��O�jc# vZ�

�uTƨ�^�%�~��x(*���z��CH�U�����}�����P� �ӣ@V�*�&W+�
+&vK�@���q e��"1�
ql�r���_g{(G�*JC��_��=�k^��	l�Ԧlߣ-`�Ҙ+��2
	3���g�jQ���
 �g��[��У�l3��o��L��=�)ޛ�Ld��%��s"�����c��3��X�������vR�"V�X
����pQv���
�K�zZ��AD5V��)�������T�J�e�������r������os�q�)	�y�g�A���"y�Q�"��9EW��9�+��a@_"��������
��& f�
�%�R�`��k�9��>���
��s��l�=>���RF]�׏�gi9B8hs�����A
+W>�`@�
����,�X�/���ר"x��
�_jL�q��v)�%)�i���Σ�@�j]��i4��Q�ʛ#~�&7Z� �������>���*$lr����^�1�g"��!ѡ��K�_'��G�n�.9��=&ԝ	)����f�-�DV릲+htG�d��;l�z��L��X����v�
6�:�}Uf�+�h�gqPU�U��ISZS�NQ*�Ԕ0�
R~
*��y������&LS� @��.#�g�QK�M�� �.	�
�� `-R!��U��i_g������^qᗻ��5�Gus�Z=_m���7� aKNt�b��x'=���y({T�ax��S䝍�0�
ė4���\
$Ȟ��v;Κp?G!H�~U �M�0�j-G�OG��<B+t���T��&�E�=�IQ�
Y�j���� G��2�b�_���7�=���ڗA�Jj��>ݙ8�b����
�B�yGql��<���:)�ΫyD����P߼������O[=�
+�R�똬�>Y��j��E����0dwQ�DD&
+_���V���9�<:(;)x~w
^�}�y
Y��z%��E�
�#��
��x�`�
r4$Jx�W9�%4��4ڽ��dVGM
U�tOͻ��Z���S��d�ih
5˸Pǭ�ǭs;�	�}i�V�ె
+IJ+��H
8,�x���I
F��Ԅ�/!-W���N�T��Wq�]�E@�|z�W
@�K����!
+H��k�5��;�ZדZ�(��!�^o��n�C�#
�Cmcxx��u�l�TC
����U��tiv�N'!—��PJ��a�3���P�賖�T�xガ�*=Uc�MVN�"��}{˾�\uu��ƹ�B � _V����_��cgn�*�	i���Z�Y )|0X�a:^=x,3'��i�~N����� .,x0I˪o��
Stё�=��
I�uԱ�P�
I�+ݒ|��S4�C�j���H�
�Ɵ�����S����~�p:��:�����E������:����f|v�����jQ���7��8���EX`0s�x���Ϳ"S,A��9J� �4_
v-��
7
������֬$�
+{Бf^��S.Ň
�
AT��O�}
<$��3��2K�JP
5��p��6�,�I��KU�n��F������a
��t9b�QM�q�
�|"
;��q��nhT-���1�<t3��SY#�$
5~���<��`��
+w��`Ϛ�v��!�8j��b^^Bmk"����)�oKqd0�N�$l��_�
Y$�KXnY
����)�OE:��V�a��[��1�X��,�
UI�
H7ȳkLxc� �Y3;�=%:=�i�`Sa8��;�^��y��Lە�?
���=?q���/��YtuII�=��2%��Փ,#J���2�X�o0u=za�O�[���v�S����>�ǣ

��kNН��aQ��=��W��ю���?��0��O�u:I *v�;�A�Ն��['�8ƪ�48CW��������M��A�X���)��2��a�}e�D)OC����4Q�X�T�#�n!����)����5��
��v"��%���=���g
�W��m�
�D
�$O1ʵ�G�'��4َy���_!�-v_��{�
1ӹ�z���
�
g�\�[=�.��1��g%"�D����
;�}\2蓶��UtD�,�"3�=tj/ٚ�Y�z-!�M�����۴5ɚ�#�'S0M~ރ�)�Q�G��a̘���n���z
a�"1���FOP`K�[fc���,!�Q!�
��\��dj^Z� ���Ll�c�*3�Q
� "�����I1�Zr�CtXh�`�8�
��
M@�+����

?��3a�.#�v�b0���f����Q�Q�gj�}+�3B����0���ˋ`����5	w;�,ƈ3
+E��1�P�e����>~T���������އ$>C7;�z�lua
S�<�X4L���裈r"
z�c������z_�DdL�\ם<�X�CQ��
t�z>�,^�]�x�K�Ѳ
+ϙ�J/�C'5�#;ґ=D��,���@�Q�qL�d���{t�0�+�g�j
���3K%k�:���Z*~U	�,�*�<4�xU�����ɑߝ0	t-
.{
�5 %T����@��*P�
+˃u���I�{�t�G�z���+�Ҳ�&�;T*7�(�WBZ��Su$��A

+�x��֝�k$pn��~m�</�ܬ�^uG�T����%�:�{Nt9�6Q(�_iQ�[�\�h�2 �ը��=�9|��
wM��
�452��$4��HQ])@7[�i��^��TSe4y�;���+J��~�!���X]���>�gտ�
�� ��㼪FT�څ K�XN7.%'@�W�R8�m��lR~ѤmU�i萊��|#�C_DI3P�j
+	Ο�W
����8G����������s/����2kU��6J�q����5��m��1Q2��^�}=���u���}&G��m�5�x>9L
+ˁx���iKY*���|
��?�
��~���Ȝ(��RF�0���(�]Z+2���e=u�B��;m����:셟0Q�µ=FIl,Q��6�nG1��;�;b�e=źv����M��2
W��ƻ���GZ � �
֛��� ѡꙞ0�Ln�{�rO��/�`��<\�*�&�+V��O1Ƚî���1q��<�P���ڴ�D����`�p��ES����N���F%���� {�ZC��C'�&4�S0��L~%�Gџf#���zL��4?�`�����!`��80�?�.L�����\�
���*��&YX�hr���r��|~$���D�D���4��K:�?��Í�N��p�a��XBZd���K�ݟ�I�da6������L���z at a�����TC�x\��<�����Qcx�~<��#ݎT{���
���Q�+�-�����y��{
��|	w��bV���;�qZO����`��q,(�zW�
oHכ
��������aI��4*_g&�
H [...]
,�/�{�g%��[Ȣ[��jƨ@�N� ��>^
+�6�jƥ@�r�ܸ�����bO)�cI5y����StY�k�]L_ at h��^E��
����
+��4�4��d�	<�=+�T
{'���e'�����E+�.�2E���z�� ��<Y�1���*\��`�ÿCXr�Zl���
+���h!GN*�px���m`/Y�#?�<Z��b�/�㷝�&k ESxd_���
+
+�ک�
�zގ &T=c����@)�@����>�A� ���;|RJK&�(�/��;΃���Q�j�*6��� N+�+�2J��{����D/
~S��?i8�fO�
5��!�}z2��r��w�F����Ċ���<�]m9=�ɘc?�@���.nϖV
�p\G��	��ª-��	f(!�NI+-ѡ&s�{
�D�^�#	`7W���0�}���
�9
��x{��
o����������������
B�<-V�Qq��Sy9 9��ƫ�(����ߊ~�R��:����=V=�c���!�Σ�r�1P9|1T�Ӂ��?z
'ڌV���_�
��#R�3�3&���#a��`zMP��'���������cx�}�����n�E(�
[=<+�}�L��u�#u�ey

4r��_�|�GN�橄 ڿ�+]�J��
�/V.t��
=�8\gM0+z
�v$�vrs��9hC~��wT��\��4�����o
��wW�\�,o"�x��c(2G��T|���Î*�K鑻��j��/:��|�� [���@
����#h%������{�1}��0x~���k�i	"e�'K$YR�P�I�x�i
���M27S;�.�"�3~Y�0�h��N�?��БP�gS5���w��<����
0*pl�Z� a�����^�P�&}����cFx�i;��P���A,C@
+
5Q�����F�����ьc�
5�SY
�������V;H3��ހ0s�|�}T	�D�S��G�(�aٝkI�Ϣ30p~�`F��7L�����]�a=�
nP�7�"�����0��H"�>#<�Q
�Qr.���
J�
�$H�|�Z��~X���t

��|n�L�4��
jF}���\�t�U�ޟ<,�`@E��2���W�렡�_,*���Vr����g�8��W�s24��| ��Dw���B� �����J�6��ND�����ȊS7ͳ��e��xoG��
+>�u����Q��)�x���
��A��

Q��{!�U��sd�)<�iE�WJ@��0�??��"���&ߣ�]���\S�*'ƹ���x2�}*�>EZI���N�A
�e�NxZ��:�c5�
�n����?|�ó�� �U����I �v
���g*W<t'ޛ��
���wd�$ jq>�(��F] 
�������j�
���`
��L�"�
��X��k1��j1e�?C�'=��e�\�zܽ&�P�
fWA�� �Q�JB���f��#H�^<ag󿏌^��;^%��G퇼T�y$�08wv)�8�o�1�R������a���N}h�j0@�3]q�>֝ב"@}��G�!���W�E�wy�`�Ȅ?!j��
+`��r�LJ
�)t��(�g��&_���Q�@؈g��_�,�ٖ
�6��C.��H��U
CG�;I!�&G�\�s��:Jz��t�gq���Uˋg(���3*�.Sהi�d�`��H���,��.�Ù�#z(���σ\�zq��
�
��3�1�0����c
�� Ă�TjD�r�S>a"�8���}4��z(M��܎�/��Tc��N����v��2��pV��}�c��kZ�
���o���{�P���kh\9�ۇFj��5֍�h��Rߒ���tQ�ϿMmg��-,����7*ƤD]-m_w_���y]�fdh[L�FA���

x��D�'Z�#��\\	n��t�c�S���j�EVc���CL)��_��cQJ,G��Ȍ�
+�����he�B�jy~��W�O��T&�ʸU�:�9ћ�(ȍ���՜�B�ieP4��ߝ�]�6�T=0��Rs
+
+���L�=�z�Nu�|�@E�u���2�6�N�
T����v�i;Σ	�õ��%��Y���<!��<y����v�%1�8-`�F4�J�*�� �m)��
Kg��Q�P)���҆
+�Hш�Dm��+�Ͱ�E
������U
��c�?��͵b
�{"�槓�ۈ(�����JD��{��z�|
]
Z���\9�%�"�D�d�<����쯙ޣѫbR�21-S ���D���#��bI���~ z��P�����
�o
�FF)S����j7vbT�#@ W�:4Q
+g2f[�L��>w�?"��wՏ�(�V�����b�P��
�
L�[-M?
��}�2�a�Y�>�h��Z'����
��䛖\K��fh�~0��
9�F(�m�DA�v�~D��;��s��(W{��|U3#�֙H
��E�7����+�B_���w��
+�
яެ�K
A��^\�B�A���HЬ�3E����:��aԼ�9S��%�ȥ2���2�Ļ�Fw�^��ǡ�
7
��N��
�c
���͌wN~��
+
s���G
��m+�˯�#�:(�R@$�M�m󝄖�@3���
L%���{V��`{����>�X�
-l�X�<�����>�K2�3��:�'�O��Y�9Z] z�Gh,Ўv���5܅y=g� 
G��@~ꨆ��`���
��*.�]��r�f�o��
������2�	v�8�kGQZU��;��!����L�Z
DWv��g�Y�e�8*��� }%h��>Fa_�DʦE����
�%
+
C=��k�r�#B�21�h+n��/r�[�/C�Qw�
�O.�@9��U�r�6�
};ڊoE? �K�/bW�G}�f�K='�5P9�a,�D�#�QJ�׬�(u�TÍn����6��;�}Z��k@ɱ�^�Ux��}�r[�r�:�-Υ+?G���U>��������B|�����[]��0>��m����H>�a��##z;�s5�@	��D$k
wO6�
;�} ]�i��pt�w�kdl*�}��\�-l��h�i���u(�
�Q��5�g�OK��5ˮ�x8e���A0�o��(}
+P^^�b��B
��7��<�f
��F&rlG�wՙ�@��J��ܠ�qQE5y��QPK3�[�"u$�2���b���쯄.�n�
�^@�QO��/<דE
�e�
��ꪵ�䃋[A&��
��w�_���{�d#�CŸxw}d��S�h#�j����~6��d#�_�}��u���tdi����A���k��1���3L�?���W����E�t�D�}�\�)�,t��.�x���_~�x�=ԊO�����X'MGT�oi q�(�����D��X\2F�Gx���ߣ4�
�9V���Lko��z#f"d�k���<|��t�܊'�c�[t�{�@�V�Y�^μ3+}�ޱO�%�c^�XN?�aLn�
���,�6Es�K'����f0���{��e��"�X��?�&
<z+6C�5d����M�x�
�{��`E
�����H[��Cל�w��f7����ev�'�Tu�C�z�h����Vw�	SM����>�+�-#U9�F�nG�{=�l�
v�z^lt�3�}�b5+\q�YHf��w��Q��k�L!�<�����_e����
V�b4Y�-h���H���rGD��(�������Qz���Eki�I�#�o��T��I�
0�;V���'�]14�}�G�\�v�#�G�Bѡ�U�8
+@���Gu���H���M���Uak��?�seB�+?��\,�?�����O�
☐���;�
; �b{�tt�fX�& ����� ];�G��Nq�,���q�>�z��em�-b���i�)��) �}���������{�Q"ۙ�]���H�
."]�/�
KU��j?D�� �
����p�W�����[�J�5��Ep);
�Ü�-��݃��z��%��"kCj-v5�{A���s�P]mI'mr���A�-����nG-����zߪ�㈚S��%S�t0RDF�9�Jp�ec��UZQ�����v
��&O���=�bl�
�- ;���i���O(]^�O����ăyeE �(�^�.
+��PgL�g
�s��(
m��~	�_@̶��
"V�;=f�����#2k�����G��
?9�� �W:�J޾b�������R'�6V���5-䨏=
�u
+�]�o�#V�
��<k~��_d
��4B�Y�#

8g��2va������T�>�$
�ZΤ/��"j=���†�p�?��<������G
S4

�9�3������,=$cnI�'Jy���`�Q1�:�@(�!�)�'�
�m���n/�^:K�5��q�C����ɸ�+�^�2e5�͵��6�gğ�)�n���
��q�x����+)b�@��������A�m�'�Ow��>k�r��
+�|��@��L�����,����_5��Jj��ԗj�	�T{9���h����g�[�Ҵ�=9�
��V�߾L?��z�倏ƚ��w����[�����C�6S����lͳ3�(���,�E��c0HR��>�����!H�����&��'b%b��D+Bc� �&�<_
M�
Ԕ�#
�:4�;��+},�Q�^�wJ����:�г��_��cl���*�PRݙ� b	UHi2�/�`���9��|�#��4iR&0�<AyE��z�!�{��>����~����}vlU�g�>H;��	\e����)€��݇°��M�"��QSH�p> +��qB|��c�����;�F�����ŏ�"���7���߹~���\V�"��K�d��m}b�9�Q�b�2��?6yQ�����t�=�4�'�������|*K9���0�-)��#����]����}%2�wr����<�q1��猸j;������\��
+�q�j9��d%Yh�
)^( U��yRO� !�`Z��$?�7�1�!�ll�\���s"1i-;4]�)�8j&��xgz����j��aǨ�\}�8C#sۆ�r�T㖴l<��am
C��N��xUֱ
�2@��ːB�> �(Y�	�;r��?�# *��G�Jt#����}
�E�Hd5yC
�/���#�G^��bӢ억�SS`ofD���|�Qj�@�Ҫ�(�
3�ASB��7���fA�YǍ�A%Gj�_�-���,�:
��
�Ӓ�J*+d��MڪU]
h�ˁ�ICk�%�2���
圿��d�,�g�kO�f�!�lg��׻�
b�FI_��q�
�UW#�f�kX�q(�]�{Xc���e�
�HG
��#5�,����i�Ȟ`�&z��"���J_N�w�8@����V�]70X�������")05�j�orWH�T<�ڱ�
���3|�ԃ��Q1�Y?��Ɲ�Z1bL�î��#
(TR�"��G�z��ܗ��e��7z�V��yc�p������?�jD����{
+�	&��Yˌ�Ȓ����V>4Y���=x&���h��X*ɻj��6Q
�!>��� 3���康��*
+�%�ķ�uhM�#��\����Ag�&�������}�9�4G�~I���ʄ��e���#��
s�r�:ѭ{�u�tQٴ�&鉔��b0wu�
G�
g
d>��F��i���t��GqJ8�]�ۆ
��Ճ���1�:p��e�@�4u�o��qD���a�Wj�(����(mj�JK����
��&�/�2u�x����Pu�P8֫�6�Sp����b�
x��9z0���g"�?	 ��D�;�r�
��+��
�~�N��Y�߸_)���G�����A&����Qա��̀��BY慴�{hU���ƍ�F'��_U����C�*��?��4�5���4��j:��8�՚n��(
�7������ ��(��(�}���� r(���4 �A�Z�	��|��f��C7�
+� �a�㡢�~�3�k��K_
<��qೂ
]�
�����^f#ś���A��ʹЊZ�� dGB��>R|x\40�‡�
�㚙���/��D|	qT��;#�֍�8zӨ��|���G�
S�z��T﷩�����eK��sa
z��jS��
#VX
��5�~��`�z��$A
+��]��3����Bt�I�8�p�j�@Sm���:t�*�ψ
�w�P�=�ǁ
��eu��vj
�PXa%�6
+w:�!�����E>%���*�+��5�c�'�o>.�>�����-�Ǟ�t0r��8̝�cH�q��ƨ�E�S9�Yz�vr\���1��V�%���=Q�������R	���8��#풮�_/��������Z֋�W���?կ��D�Q��C���/���J _�E⃴B�:m�
��Y ��(�4�N�0d��
�k���)Q*
�	��yt�"��^zRhe�S���h$�',[{��9�V���d���5��ǧ��6Շ"��	��_���
�WG�N+x�K��l�=�&�^�3�� \�$�~��{��Q<fF�g���Bħ�hǧ�]�2`v'����3���a�;�u�c�`��^B�0wh�J9�Ӂ(y���X���%05���;��'j�Q��\��	-�ji� �a����x���i�e 2i
�/����EՑ�؇)���vŃ�e�f�U���3
?�;��:�K��ӏ����I�
+M����r��.�V�He��T>w��G�u+�
{��9���1
uPG��+aa����۹���8f��|?jX�����[$�{�,�E0�/U���D���5#���n�u�U����_���}�wyb��`k�I(�54Q��R{Q
+�
�
ʫ��z:Ȃ 
����� �
�4��ɦ<K��R�P.����~�B��񢘂݀�GU�=
+���ڕԘi�;�
+������/�j|}Ȇ�^}�0�u�I�p	�&�ڋ�^5
)�I��1�{Tyf>p������iMN�.�]@
+/�ω��P<���ػe��?��k����������.L������������_�w�����?}����?����߿������o����o��������������?�����������������������_sҟ�����������?��>�_\��u����S�����{�K�����h�7Z֏W ��<���N�8Dڝ���QU�5�`�u��?
��A�l�RM���y���"^�G	1Z���o����*e�#��;����K8��;�N"_�Լ�6��`�j�&
�
��1�׷�E�}˙�����˙�<��G�u��2��Υʮ}����;�2�D����u'����h��6Q�4�t�����(�R����PlW4?vȾ�z<��T2v{�Z��v� �~dtTx�a��=U'Lv�PC8u�w���چ����Vz?( =#(��� �wpr�
+R�.��{��׏��m�n����0��R[:rZ� S����A;PȿQ<y<m5�'�M���
�hZ���Wh7`5ȿK���@��(��l�"��`t
��0��(����0r�X��˯
p
���\*W���.����9�
�
Ԭ�V�4�.�kU
c����m��a��[���]`�2���
��t��XU���

��0D��H�N����\��/��߃��/k\Dr�ay��f?�Op1v�J�����u~~�	��NS��Փ
}�ٷx� 

f/N�
q�H�~�^wU?�?1�K�k�,5���L�=�;��iϢY�����>��%M�k|���t
u
��Ce�
cxRE"�ߦ;�&�y�$b@
+(��ķs�!�
��
��I�s8(�'�4飄�A��T���1tƾ���M>���p-���W��?(�)� �]宽�`XX���C�0��τ$
6�����8RPЫf��]���1��!���#��!+~�xd�-�6q���������q���W�E��a��eB�`P�W�B=��pj �~#�I�
���
�(2_�H����	��
��R
����]�Gh����
,G�o��G��e����f"�M���҂�9����0�	��׌��0�qT3��u���͗_�kD��EhX=�f�u$�����9ǣ\x[�.�%F�����Td��fwۂ���$c������f�1��>��!���v�ԧQ��
��M<���<�$O�|������2��*�ƴ��u3�
+�;3
T���u��b�Z(�k�dQZ �˻D�ހ6=(#>�\_{���g�"�^��چ�`�
+xf at -��
���f�sS����r|%1��(�ݠ����m�ȅ?݄�ry�[#b��5B�
�
� ��@��<}
+�SZ��ГU����D݉��*�w�հ��;&C,�If��i�ꔐ-�KL7{�q��G��ƨ�m�>�.�X{D#/}L)��+Bݭy(�L�GaՎgOa�VR����A�N���JjX�Ί~B�\����Q�~�C�UI�u��M�����8��̛hO���x
z~DK�
s��K(a�^O�� �+���EV�U��KI��-
a�oZ�0L���X�R�!��?zE�tި�� �~�
mT�
� wF���ߝ(�}���uևu?ƕ��Z�����asw&�v
�Uä��/./�s&b��ϻͶ

P34O���2��ODWPm_���a��k�H�}zU+C��]X �т��qQ^�ߪ�.1���<.��������R���
+�[D�"xp���.��iM�#}���"t
�=�EDٯ�d��䑧i���^7/�����@>��B
+���
E���J@�]��ZL����N��g��Q�j�"��<>�_�r��e�I ���L@�����T����<hi"
CG�
+���d�BY�������h���t�7_aXS����k���
�r�����i��"x���|g^���o3�oi�k
������ff˱}޳�}D���
]�jK��{�==��h?裷�O�=���ni��}���\u�~�噙��h�v�nq
��g@��
��gU�Co��iE�$Z�%�p��b8hŒL�^��3��t'E�f	D(�h@�1�+2�
?��sp� �?=-�ꠧKD�:�=�~9�5*.��2��8PA
lV ����x;��F4y>���@n��H{�z
�b���V,'��ڢ"�Ą�[�"r,{M�!�9��l8o����h
?
+P=^0�E|�J
+C�1

XvA�w܋q��="�U
=��]l��qh�����O��>��"Аe?%���Ct9�q�G�y�o�I,���:��]��A-�����*�h����?��C�oe
�??��ɝ\NLF)}��
՝�lk!��G"I��9k ׈�����!����J�髴�

3$�/�����r�_t�13����`���uQэ/g��~�X����N�0
*e���	
++�uI��X�a��|!�w��%����(ת^Ӯ&u��.
��|<o�+
C�ۀ�%S�;�޻��ؼ.9n��3-.9]ې<��c���ΈK�;�{.��Cܳ~*sfk3�9�ΖZ^>ĺN�|X��o�ae���M��Բ�?N��D�C];�S�� �J3�{��C�%${�%,�'naQ�\�
�G�	J�v���}Kh:$lN�An#.J�ބtGŀt�)c�/�2�ܕ�cO�&��*��3͞��b���$A�b
��Ξϛ\QN�l���^�
+
X է"����
�
+ ���]�r��M�
 A�똟���B�i:��
tR^���Q^+�6W]O0m��2����n��IЊy����c6΋1���8�a_ڷs@�oN���5_rS��?F�֨������C�p�dB�|z�X,�A�M���;]�r�k��<�5�"j��eW�.36����5������~�Ӯ�χ�>�:%�߅e����
���ґ���;�g��亾~�����K�"�AC�r����n�ۨ5OƷ
��o���r�vz Q��p�^T�ح�
+�r��Hö&�Lr����
����i_"!��J#Ni���gZ�0���ma���K�jJ9��d퇈
=���)P��8���#C�bQ��
P�n�g�_½���/b�R~⥌�L̏��FM��#rm����;
�M���Տ���W2���+'x |�? E�wyQ~�`T[$>��w��=J
� �!�Ns��y8�����G]
��ψ�y�6Rh�
��_
g�MbGP�G3��k�Ż>`���^�A��+�Yp�RD�Q�r^�Cˆ
��K
�Gm
�O��Z��̾x"�I��C�d�ڕ���9�,��-�)!u�vz
Z�FWbo���aFJIZ�7J�T"���;v
ܳ�-��ƈ2�Q�R0KE|V�<o:>�N�gD~�@��󮻃昳$I�O3)��9*�ڝ�������
+l8��cq��B'A΀��Q�؍�d����gC�ӥ>����<���?�r�ݭ�j'�CX�_�2C9g�� �f���zP_�Ѫ�t����A�d)�@h�� R?#�w4-BD|�h�_
k/D����R��?[bɠ�
j����Q+>Hꖣ���A�ȩ��<�}�Y�����i��{Dn٭�	0T�"?�C�r)���j?��8�ٓ<�
+V��I�e~]%i_ޅ�>��V
�lW�a<����f�ʩ$�R�ļs
�j���=g��Jb����
&�l��q�����N�n|��{�1�<�Qu��&
���^�¢�hz �)�	�n!�BP4�H1%\��y~F$�(�BM�s}
ݠ$��N�8i��Y~���	H�1�/�P�m��YI��[V
+f@� ��*�/;�_�"�x�1�o�8�'�<L�g�m�y��a� s�"���'�}h�v���ꡋ/��
�
+r�U��-�1����ү�S���)�4���#���$X�@��ӵë��:�W�Q��l@<�ٸ{~ '�
1�<O�G���q��c���0N�Y�Y�S��u
M����C;y�gf�_���J�ic,De
�ׂK�5�M����c�i'��&�8nz��h;�z�s��e��7�4Z�O�z�x�{�ź���~�i��Xn|?�52��	
�EBj�}K���7��QQ�����ǹ%��r)�[��WŻR�I�s#B#���Ybc�x�L�z�	
��N�
G6��s
5�
+��\H�ҍ��⼡�7��sMܠd�1�>�"UA��8`��G�Y�B�s�}���_��ͤ�������B_@[�S��
�/�沙P�f��έ�]za5[�>�TP��s�e$�q�J���F��
�!"��:�&
�

�
"��5M7I8���لB1�D�a[�E:剅�s�"s������H�KE�i���8E�Q���|�C���/
H��q��`g���7H�N���:0���G]J7���Q�o�i͙�u5�US�Y�ǝ�8b���CI^
'��/P�}�#E�^=2��?�D�B&�$h�
9��o�a5E���Sv3��D�jw���1����"3b�+Ϭm
+�M��G�����[SM�R�j�R��`�O��gj�i�Og��� P|�`M��
+�]����
y~��"�#g���*�,�n?��!g�H�� i�۸e?���=5��i���4�=#n�
���:')Ղ��:�ǀ6	+*ϱ�g(��{��xe��𙁍�L�>�D��Qb�
���tqD����#٥�{6"���s��/l��*��Hc^�l��1����?�E:1�Ie|��t܆v�O9�P�+
��<"��ri���|�~P�6��v��
�C�B��z4S �
Y��-u����k�A�
}�H�(C	���b��O�1x�*sn4u/�Qqq��wz����9�<j�E���톒��/�"�y��b* ̞�
�
+�[e��k�u�<8����Lp�8�P�&T(����<Ѳ���T��@U{؅ǡȕ�ڪs
�|�W89�����p��B��y?�S�
�Nv ��
��u\e�hHG��ae8��ǿ�5�)�}��*�/	��?��Z4�~�C�g8N��e�Z�/�I����~����;bo!�a}^�2�E���*�=�B*܏����7�߽]���J������ĿL��(杮ȣ1�չ��d^<�'��]�
L��۱Z���
R�ߴf���h"�
‚$�!N�a���5Ŕ���Nz��ƨ4��Zi<��Mqۂ�e,k�1c��0��_Ձ-�����֞/{�(w�$�([CS`?��߽e���.5��x,�i��V�9�<���?#��|K�>�u<YC
sx)ʰ8�S�=������`�>�(A��lyLW��u.��,���ҥ�u!�Ͻ�Pѷ�?���[~�DA=T�
+�ʰ��N33vyPJGX�ÊĒ��z(2ࠖH/f��4ĕ�@2i���mS�v=��Ŭv�u)"��"��
�T3�z��r8
+�P��|����i�
+��<��s!�fM��!`����;"*�9����_gr���Y
	$�I#%+�̍�����(������c[x����z�O���
@�D
/�d�-f��v��.y9wa��i5n0���gȚD��ݯ��_D�T�?t�����5I�A��늒,k�
+>�����:��p��c�T �/B��8��}�@��A��hM�hM
+Ղ޵��7��@� 8�빀8Q� �c��
�@Z��ܔa�~
d[n�/����K?�ʲ������ŏ��s�{n���MT�Y�O]^!2�Q)�,술AK�J�p'\ 
�9���3��4Bg�E�v�:SV�3zS�
>Î�ʹb���l
U2�1� P�@�V -c>+��
f�b$�"��wo���o��Z��gy�I�H@
�`�0�C�#�:w���|
R"w�H�[�H�?�6^�@��*�DP�~x�i��8Z�:o%��
e�
�w�)�~�bv�V< �q�.;��0o�����(��\H8`pkjZ��4�y��5j�0��!�+MzRT
��[�1�`g��2"9�1�d
'�# MI�)��J���D���~���:в*x���f�� ,�J�
�l`�<���_�o�n}�LQOl
���\$��}-;�"� �/�x
%��*���)m�0�x�iM=�����P�1s�>�s{l�	v)GE\�
�ܴ����(���
!�x2��e��DE��K!K�ͦ���m��K���_B��*�hx��`J�]|��"Nz3g����~�C 
+��1��L%�@Y��vea�po�`}����!��^}?̴�����
����8;� ��|�S�>@U
?w
+�d
��JF���G�y�uzp;*x��h�}����z�,��%3s`6��ݾQUo�,�
�x�����ψ!^�ukoL� ~D��ErO�g��|X
�M+'�MV��a�P�]`���B+t�~^��м�T�h1��|���#>��t��Gao/�a��rQ�5
t0C$���H�|���`�L�Z2�%�����ӅӤ�G���Z`^h�6�
+Q��r��j̱ׄɞg}ސ���h�
��
���
0,68ˣ�3y^�~+y@��:A&?��UD�+�	4U��g�2�D�xG�Jj�Q~������)�J'��CP������bG�+��·�81
������3�\ԯn��yE7�>�
� 3�:g$����k
�Y�D4x�UO9ӻ�Q7��H
��$䠶��!��J������'��c�AV�&*nY�s|\x��T��z���iH{�K3�~��Æ��*R5ǰ����J
+��	oa��b5�$ZG1Hc
�0Fc�Ds���
�],M?
�K���`�J���t4d]��
+0?fn
y���e*c
tBw����d����������E?%{Pe�
�V"���J��H
W	g
(r���峑��O�Jx�
uB~|0�ٕ�L�<��
��M��D��Q��l���*��Ч��J�Ji~��@mk�AT�|t���>��y�JF�X�2��f��H�9ҏ*��0�G|gE%�I*�cS��;���;w
D�P`㱆8"%X��		��ʒD)Qj��&��ƪJ\~��>(C��ʸ����^�7s3�:j�F���e�i���p�'b��>H �T|S�D�����Ĩ�Ⱥ�� v�w�}�ۮq�E����/�
Tʎ�x�}0:�h]ɻ�ZʾX��3(h��4�3�%�u�I
\]0��1�Qo)�R�.�<��cx��I����h~d#�`SA��֍�CΫe>��م�*��s��ׄZ�4���i$� 5��~N&���a]ê�����3�b~W�����?0�b*�x;�V_Psq$
+\�QK��E
4��B��0�1�����
���<Pޖ3��?����� bu�
Q�b�:
s
�>"&@�
"t��Cd��[՜p85 ��u=�
�R�5.��b[�6�.�<<��F��Jx&[`� ����Iį�
�f�
d~gt��
G�J�0�ߝQMd�
V�j��Rt�잟
�Z�w|�W��/��5��8�ܔ�(Lݙ7L�5�'�W{��D"��DŽG��$Nз��=���$��1P�ې��n�x�Y/y��� R�U�
���}�4r �E����������: ����r�Of�Γ@s��;��{�b]��P��$	�	?�ҵ{���
���C(��s!z׃�0*/����fN�݇X/��Y�-�rIY�r���
ve;�J
$Jz:���z
j��W��M����6���v�NZ�j����7
+
]�x���
�ƛ�@V6�)_�҈'��2
4C�m��؊�2t�!��w
�z�����k[�����uB��:M~U	{�M��W
�ӆ��>���>Y���L����&jo��������}�{�,�:�&�(��(z�$n��)�|��h����e
:c��z��
��돸��w2
+��!=�������滎��h�LD$��뀨U�ef�~�(���oӊW^����(A<Vl��\��G�J�y�iEn\?2J
W�����L 8��T�1�Z#��\ʣ�	�K�4��G%��L�
�,��Z���Ϊ �� O��|fi�(�ޢ��H�TC�� 㥫����#��aK�yD���fD���W���B
+�D`|�'Ŝ��d����x2��Q"�	@�7����X�� Ƌ
��)p�#ݩ��E�����1��':��
�['�>�VEi�ޥԼJԄ8:�)�j���6�{��t�p��*�
+��S��D��A���:�HW at 1v��
����N�����y��n at Lg
+I�a��j���b��eT��w�
+��9j�U�R

�I2v��J.�PDŽ��]��c����|��b��+�P�ı
I�{$�
���@8}����"� �
�t����(�u�U���;&է1]�(��ػ���`2�8,�8L���%�P�c��4¼��4"����q/kIl���( �r��O�a�~���5#�3�P��v6E@e�:eA��r��n#�B��z��J��z��Ƽ��ys"X/�x�U�}�	Czy(�{�h���ߧm�Ҷ7�������юO�q����5��il���
ݮ�/Ѩ���e�8�t�j�n+hq��LɪV"���;�W Fܝ��^Mo��5
�����>XT���h29�@"��P?��
v���i��	<�=)#.�G����F�kߨ?�:W¹��	_Bz,OyN�*���i�;�PQrS�E�Tl�� z�
o��Цa��P�[iʀ=�.E��Po�f�ϣº�����Y����<v�|�S`s��e>�c
�H+U��
+��G��bQ��V��Q
�fT�
�a���sV~*����"X �ߵ�Q��5#Ї�_	�F�}� ^v��S��\Sʼn0�K���^�
��̝�ӳ?vW.LT[�3�"�7>�����,�}1.���q�VR�e��
�@����x%�
�b
�"g
��!W����A�U���.����G�#mM���2�k�/�X椗i���hE���sOs�g9��[5�����D��
��.-���<�v
�L;�eNp��l�ԥt��d�|U-�^�MZ�x��X�������B�]�-���Q�7�Ō�I�*Cp+Ǒ�vz��/�n���
+��.!��`��#w�1�3�
�2�FKv�U�seɁw\���O
y��j�E��Aq�H.x��.���K��ɮ�
+���"��;Ԓ�#�oQ"�I����T����_U�}@�X��<��ͮe�q�d�e������]$W&AA#�ٝ��
D	38:
+�5��S��fYS1!��w��o�k
~�”�&R�� �< q��W
���<i�K���'�%*��
/���f��`�Ғq
R8���L�e�G'%Q at m��1��H
u�)j�܇d�|�c��
��#x~�i�C_�_u<��&��>W��V˙L��������;EBua2A:ͣ�q����9O��?�e	$T�
+���~#��������0�rD;����l
��
�AD�*��,>bۨ��*�`{<���c�#���LYI�#�ͼ�ee�z�< �E��Y��Ԣ��O%@�
�ӎv�
J��/$�(�w��_�Y��B&8d|^d��p��>L�c`��>��.+H�%�-5Ȑ~��ȹ�׭Z}��mPIy�ۓ�ͫi�er�S
;���
 >C�_��+d-�_ΐL'MA�J3{�l�jG�أ������L<��(y��a�'�Y��8�[��]@w��SJ�󳋷�^�p�g!����
 <Z%4T��B
!h,b"ױlc,:$t��
� �̓Yw�7ק'>�����g�7Q�l��3G�6F����b�yb#
F*��b�[x�Q*C�ڽ�ғo���{p����HiqYU���U	��?�X
04ֳ� ����.�������+
�O�H
���N����.�g?��8+�����ݖ&�é)($Y��=J-
+�b�:��w� �woS���k��Dk~� {�|�s
+����M����Tx����_hx��	�?��t@��F��9gꤢ�G+v�Qܒ�F��ux���,_#����,iN���ߺ�F=N�F�<�z�b��*���]�;\�X��5�e�Ȧ���[(���w��f�i-9\�M@V��'^��bT��?GK��m��4�Q|pG�o%��!�_f����
endstream
endobj
132 0 obj
<</Length 65536>>stream
+�OG��%4u�w�Q�aY�ȧ���_�Qo�M43�}V��m:�qʷ>&=>Ĉ�RD!lvG
]�,΃��Mz�����œ��n�_/��x�����s�
+��+b�
(��d�ʻ��Y��
+�5���1tx5�+�w����|���<�O@�Ԏ��^�y��6���E?���1����4s�!���|5+W���b4-�a�U~�x�˓�Q�S��v1�*�iYg
�쏾D�9����Fw���si�	˶��̧��V�4i���	��u8���X��v_�[��;p63:R�@ݢ 9�/�u�@�}�X
��&��%4�.x.Q;�bWLύ��,���|EC>'�R�9jv�vt'�鴯3	e�Qݦ#�N�y�_;�PU5j[b���p�
���:/��r��^߫(�wň�W�x�69
+�`�F��+Z��Hv	�rJЩh�|�+���d�|[��
��GU�
:���H
�k�� ��
�<w�P�V$�.v�7���@aU=Xl��С� O����ʓ�hop���
+��w��SC�>}�
�����>�C=��0
�4�x
�/-���E=�f
�jD�fw	8�����6#���;
+�k���P*�?���
J>ע��V�	 -�˧�of�1�B���u"�ٜ��#<�ɾ��{9	y�[�
v|�9#��8�����Dz�&��?P֎��N8�$
�b���V�UF�	;"�E����0X#��
�����kŃ�|��Ӟ���/����M0|���߇~����Z
��	Wx�<2WԜ���ϔ�n�/�����݇�ʩ��YC�NƄ
��`�u
��z
O�6_�g���tZl ��z6��iC�y �Lg��Ӄ���k�]�Q8�y����C�����I��(�*8>����+���%�q+d�+䙩�
+��}"�6� gxK��J��mp���m(P�7�����5�H9Ƚ
���˰n��-}��k�����:lutL���q!ֶ~��<=?�:�h
�U+z�;��g at G6�Xy�;��� �hǯSa���
.�����c���0�aב�6b���u&�(4����+�C�u&�.V
.o�$�L`�F�A[Ѷ8VQ�fr1r)�҇��D�\,FF�y�?��h�s�"��=�&�
+� ~4Pet�
P�
�k��,eE)DCΉ
+E
�x<����`��9�v(}3Fט��H�R�����
S�
+�mzWLL��H���
]��D"������k� F���&�F�.��e��]�����ܒ��y��S<z�
�"�`a�M���w��ח���E�

r��q����;Ud�����yS^��$@���yT���?5Fz���,��!�֦�'�.��b��WWʻ;������W^l�ޗ~�O�����/���7Wp���#-tɶ���
�
��d�c��ٻj�Y�@&�iC
I X�nwK��:03��v�����<괍�� ܹoN·�+j
쓃��
j�G�KP)l~�e�دh�iJ4��RB�t�P3>,�I�+�V|PD��?c��?��?#���p����)ʡ�
��FnL=�8��
+eI�i��q'�_���bq�@
�1
+��7�'Q���V��$�RC� ���ۛ>
p]ԜS��[�����
+�@]�2��LW4���h�
ȡ�##�  �W.E�c� U���y��P��آ����dޠ�q�&h4�0b�4��
��Q!��nC�Ef�)25e%c�wņ�q��%�X��d��\��g at y ;lJd�"կ<���-�'J�/�ء�F���H?����La��t���\���Zy��(�D�v(�Ӷ
:L��P����?8�U�
rw��Ί
� �1����-ee�r��� �u����]���uL��j�T�BR�79�Ȩ~���ɀ(]�Y��������<�OZ��Vi���^/���������k�<
+���
���L�_��Q.�oY/�ž{Fk�
V(_B֗
C������9�
�h���{��V��L�A�Ҁ�a�"!@h2޲�9QwµQ^EΫGt��8�t��ݺ�a��|��;���0��J.�CP�3���$�s���[�Q3�)��O���q��gh���(�6|3���o&�.���'7�	�y�f�%��^-y&U��CB
6h�ky��V��pZ�O!z��}�*~��q�I���6`�C �� �l�,?8��T�8y7������]G���J�m��ҧuB4HT���w���Zj����jðN�]�i,V�ln��~m�
xը�G�b�
!�,,}���
��*
�v
��`��pX�By��Xb4��
�u�X�M�~�ɂ�f���a�̷,RW�����k	���� ��(�Rs��ρ� 
務�b�
�ʏ�&�T6t:(���3T�U���Q�����S��:�
+�g5,�-6����=�
+�\TQ%B���G�L�Fs
�C���-��4
�c.
Z����tq�
��D�$Z6��
1�[�q�D�Sn)J$������4�	�����
@������}��-�	��H��ä�
� 
!_�H��M7F�s�����kO+S��ꕌ��)
d/�ȳ�&�VZ+"��+GM��6tƻ���mHI��~�F��f�r��­����=�氓�v��P�_w�D�C�
�7��ЍR;�(�j\���j�>��@p�`�P0�w�
W��ak�r�`�J
/Q���KW�`/�T�	5�o��k�4���I�5P���Y�EЙ�$ե/�<���!
���(��&��RJ�.���
$=����!#R4$	~���:��
��
�i�%P�!��|דU
z�PR����yה~F遺
��C���e䐪otaG�;ǢsFs|"�\c����F���9��- �����z,KޅJKD�-�
+K|	U��l�[��Z �Ǯ���O�����8�+
+�btk ���^���n��[=�\���̉��̼~3�
#�`�:���Lk
��}�K��8@�������⓵
�|�K�v[��d �ǗL�LU��c�OTq
�1�������4��˖;N���!�ī�fq��D�u��G��g�u27_�dO �
]�2 at 6�k��j����I�r������������R����@]�T��r�������S��w
�ȁ���	�,H5-V�tqno �ԋ|_��a���a��
���Υ
�~�v�	"0���Mq
�l��LxiW��p�<*	b��U��u�<X�.���*,7;s
�n?C�ĥ/�� ���_G��)����.:
�@��|
`�Z���
���
�0�J�0�R��_+=?c��W!���u�v�v3���������r�=�
�>�ש�Б�_]x�=�
��3F`�L
v�&{%�tI9hNڑ�)���Tm
$��O�0�{�D��B�

u��D�,T�KqlyVk2[��-.�`-u@ه*[�~qC���w�u]λ���׌�Q�0v��!\�:��p
+Y)�
�v[��J�7�
 �8K�������Ҥ�+
�
Z�5�bK��v�v������V���>NO����іw)䶇͂��$�
i�t�J�|$��*z-GD�qVi0
c�
p>�*�2�B���T�
+
�`
���̓Ǘ��M�}���)���(�g�<���y��q�a&�
�&��������O���
�F������
+3
+~�\[췛r��NPVM�?��� �G-�U�����{�ށ���|��h���XO���TN!�E�
�gE0����jGq�Й�>������wG�S],�k��VUu�!�k�7����t��2Ӑ���Ǹr
%����Y/����
4��
�Bj�x
X@�P�	v��-����1�ת��p"�w��Ǫ������J��m��сc�VѼ�� �fp�!�V��
֡#��T���T�<��(F���
J�$lZ{>=�$O�)�K
�R&_(M��aO2 ��*�Xbv[��l
f�@{
�|i>7X"r�1>��Gg_{�=�ΕE���DP���<hr2�x�IZ�3�C�K;���
�QX����'�����~A���7���jX]�RNb����/U�]�3/�X�6K�����[���C���ͦʶ�~}s	z&ܟ&
%99�w�
���	���
+D3����
X�A_�F5��|
X ��� �0���!�4�A]l
�XJ�g�@�r��O��!�^~�b����z�����:}ihe.�艙�����S���P� J}�3�p���^7�k����%y��[F��o�3�#?t�Odn�=�zN�A
�2������-nT{�0�}���js5^
N4H��J;3;�P��YB��%J/aa�#<Nڍ���1Z�[��~ '�^���(Gް����� �a�4mn�
��\

�
����}"ډ8��^cC��3���쒋9=352|����O�G<|[����ܔ���BC��aX�s�JS�&c�3�k�E�ѻ�!n�Y%3o�h��c `c
��� 	�Ba!�T�Q����_��7u���d
��|��YU�#vu��`B}�*�w�w�0��
�����A�r+�;kK��ME9
��<�ˡ7@�G��d^���w
+�>��Ұ�M�	h������#��F�
�LJV������f㛱{�3E�Ls
+�%�y�����e��f�(
�y�{[ǞO)�*)��i�1<�N��������˘��l�3N(�|	�
+lK�0GUz����B���w�����������x`��x�0NRvuT_^(�W��?+�h�:ʖz�#KF��K׶k£̙��_r&�7�]/�����(I�F]��섈��R�
+s�#�
��ڴ{&Y�
�z}U�e؀��8�܎��WU�G\͹�� hIfG��P8cNb���(�%���Y�����+;q�
m�R�
��

O9���+�����w"�j/�UM�GJ]�_�	+n2�����(�
�
?L�����!VS����#Ƙ��ɜ
�ʜ�dx�
Y�/�d�HL��zN�nvf�r[ܽ� ��gR��^��q�Ka�w�#��h�[��4]�^R��J!�^�?�_Q�%����Q�7��k4�r��'!�u�C`̈�%]�
�
��@�Q�OW�#��1�|��_<Ɖ� 
%ad�cF�8�_���,#��[1���OQ����������{Qy$8r:t��"�{�4�
/P����}�������R=�P^���a&��3��}�ܖ���nƈx�a
��
!���
�� ����N\G��w�	\�{dy at C�V֩��ͮ����	"�fv�u�8��d�3AS�K �L�GDZ]�E�߉�ׯiX&P��Ý��Htf؁�j[�(�9+���.@!�����.ʸ~ �);��U����o}��h���A�N�IԵ�����fj�\�#Hj�Z�p
+��=j���|�U�>�t	gj�_���)Vt=�;q�R?#�|"��\h����q���Dn ��."�>����z
�
��Wu�3�W��,Z^�3����i'�Q���{!��y����V�x%�A���P�� [�㌺����
-�ՙ���GGTՓ{���
G�E��梛�u& L����p��Qs�I9�ݾ
�53 b�A
��R�롏��ӗ�9��x�)3��僻�NL�2:ܷ�&~��=�����{���6�_7�Ϩ뀀�ZTϽ6��ȱ骊����J~������`����
�����ۉ�����}�vnr�ױ�#
+jӘoREi�)��N�H����)G	�h�e��Nd@�c�ֆ�
����a���2��2"���q`j��Yy2�9Dz�}�dN b4M*��
Ei�;ذ��
h5)A�<��gJ̊�n�ȇ��r���َ�ҳ��[="SUS�(�QV���}
�Ĵ�J���qg�l�5s�եZ�Y�j���a�BZ�Y"�����U���N^G�𖌛�_~�`��h��φ'����I=3��tT�/������\7�d"FY/�
��
�OF?˚��c.`�֪������Ov��D�"	���>�-���΁
ܫ�����NkA�Ύ|��ّk�&�[E���>p2:b,N�ѿQ�]1�]�U�����cgz�Y-.:��H�67���`�86�wČ,̈C�/M��RC�;/�1�q��F���t�%� �O�6p��un����y9�HT�?�k�"������1��K�������-�k�8��趃�X��8jB������̠� �7��
+`���z��mz�罽���/H^�ّ@4^-��`nr�W�U]�����Z��K�#�Df�=�l�o}��w���+vD{FA�$���a�"j�Oc���`i��E��v����@�N��
+œ�L\lh�x}���`�0j�g�
!�K�#�IHL�^=u�։�ٕ~
�%Rgz0�
+dlϬh���$q�Y�=c�~tq@�ܿ�d��0��y!8L���
Q�����U�
�_扸��öf�4����
M	U�jV=��n�a�
Ks`֞�[�W��0�q��2U錍Y�{Z#n����'�y��^!��.v,y
ϕ1�rŷ�0�[�'��̇�"04�z�\��/�
�3�o��<!�'˲��-!7��|��VM<�����E�V �X��'3��F��hfU����P'(>gj�=�}��N:��~�
+����֔�Y�!�V(Ze�NjW��{�Ծ��w�so�\�'�D�*�i���n5x�iL�:Z2U�H��xH��ל�Ams2ތ����Pn����#v��!!g�r��<���_e�
	f�k"�
�&�`
J�Jv8�XQ�e�8e����I��4]h�gDN�bD�f�I<Q�N�7���?�d"
+s���1`���x��%�:�}D�l�F�mF���?`�_c��a�!y���e�=��	�
�WP�}�t
}����������j�
�`4�<�G
mhf\��;׫e�Bp�wN[g��/�"�6�b(�>#�7�zg��x���	�d:<�J�
%�.�?FPD�D#�Wo�	�{�(���]��<bs���8�ʹ�����F�g��}��w=($�t�|
��P[�8	W��pa"ծ�Cى��%�
���eP=���J��
K��f8G�|P!'�“w�U�(
+x|?F|?��>sŪnG	]���t��W���e	�U��JO5���C��9
��W��G��|	 �-�Y��T�dM�Yd=�eUN`�E�X�ٸjA�ѯ������D+�#J��`��*�*�����#��k��6�?�4q�
+�t�1!
�B�f=E0����&�-�'������
GX�
8���ƫ��
+�0�N � '�N �� �j"pA�:A�Hc��k��
��)��3�G�����������>6D��8�%��r��ZU��~�� ��(��vi��5�Ha��L�|�g�t�'o��u��
��:J������%����F<>���t��q�����JUЯ#ۉP��55�sFZٖȍ�cz����?�E�j�p���X���!a��R�t\�9����qz"�~�x���lE����=�B'�� ���������=�xш�����ܸ�	��8�A�c$}�����;{�
{x�Z�p � �����'�U������X���&��9E�����$GݹoX3�mϬcDo���U
�-ƿ��|g}D��i#�v���
���-�5����Bۤ
+�|�0G�Gjq����z
]ɮ
����!�aE�ގJ�ωX�e�:�� �ODy�ܕ�+d�a{G��u��whKW��az]j7��T�,����%ܒ� ݏI�����졞
+ -��ҩ|-P�J0�����#�q��(�<����fL�D(���2
0�EE �8-kȺ����M�U��M�����k��xb
F�^J�n�)^jG�>BĮ��9���*`�\����q]�/��f��zl���o?FhMv�����\�?k�k[r��=�a��P)χKi�ܖ��-6$�0
+4YꦭbTI�޾��#"��k�]�@�;G�
c�Cfd����}��%�VL$qG1�γIU�&��E�WSL��xR2�@`[,ٌƌw�!�=�{N�諠s��nSO��	J|
�,
+�ɘ=�8�T�ld8o�&���z��=C�N|3�ua��
��A�g%0{\�T�q�p�HQ
�%����]	By�l�4#W��S��o
WZ�;
+7��Y�Gg[�2�c��`O�Kr�
<j�:"%l��^	�V2N
=d�
�)
%d�Xz���!��՞�\�h��"
��	1��U t^s�_+[�Q�^6��	�����O����\�z�R l�j����"��!��dBY��S�X���
L���='�o��M2 �0��'��\VI&��
�N]�(* ^p�E#1��W�T��~OAz`���B�:*�2K>N�
��S��#���T�3��LھJ<�#
Wb+�`�1��-�xx���.��u��
�rB���GC[9
);SS1�qc1���JSoӘ�p�4
+dVV7ʮ��܆2�y�(�P`�T���u�v�
+�Q�&N��
�X�TQ��]L
+ at 5��
|
��I<�O�@�	��(�C�V�Ƨ�����5����a�~`؁p��x�ׅ�_���s^�i�s&�D
+���
薌B�k�{{��g�l��8�a:o��/`K��
_�}�d�%M���dk2
���~X���0N�������>Z at Y9���6�Q3�!E%n_�����
,��_�&ܯ���{�Z_
+s����R��&�{iM�;P��K��*�U�Mŧ���~�̞���5B8���v��MĊ�\�?��S��
���	N�f��
�_g"�*jX�>԰���^��k\,�*ua'D��c/�� �B�;m0�l%
M�ݤ��$E�5,�;+�,�k3���b9���\���_亟z�n�B�	\�z��rc:"s
9��H�Ȅu	@
��$���L`�"�
Y�2�1����E���|-7"CL���:̬aP������T�sMu�Q�����1�-�PK��6Ș�?��TF���偼�GGUI'  �� 5&�JM���
���6��"	^-5��n�;�0��OJ|�c��e�k�ǃP�H�i���Ǵ%bw���@�A|%y!M���/{�2̱*�>��q��!W��O�K+�� �H"����C���T���0x��.
v�qV|7��s����z���2*�OS
I�9K�r�����a�+,�2|P3�
��]����p2~u)�+;�� 5a y�4.<
� ����Up�V^!� (8�J�
_U��1:����
g�!4#��LZe��@5�di�|���5��LQ�������3aeT
~�F�P�
�z�a�D�pZ���`\��u�;�|��w"%XDu�)1�lf�E��&yXT �o=��W�e
a(��^�ӳYd�-�@��A!��S��k��b�c��ts.πL�I���L
+CL��VwgrN�5bPC5s�*5BEI�Xr	�����M�q���ĘL�[�/T��	GbƁpd���2O!=0�gjL�t& }������8��T⪎�]��Δ_u
+k�C1PV:A�R��
��KA���	T��T����-aJ�f<\��,
BFP֨�L��{	���?*3�m�Τ	�z� ���hL	
�DM2B�yMc�װ?��ew|��ϡ��47��Dh/wAt>�*�ʆ�dR�(���rK_���M{�

�?���/o��U���ܭj��E*#��O�I.v�N�W�t� �uޅO'“_t�f��$�/���c��z�a7�[ԇ�h���T���q��"
&#ʜ4痞�R���vSVѷB�%p�"��^ey�����6��2���=2
 �g�	��O�E�E�}ف�K`��e{䉾��Э`y�hI'����A�I	�`��
�\"�ļ�`�H�ʒ�ʬ�i�
�)���gJÇ�{ �:������jA��^(�(��Z9$�$��ޡ"@�B�2
�
+�٢�����	�.

�!;R�L.��*&��Ң�K��
+���Pr���BK.oK���]ߡw{>�9.�C���-U������C>4$O*x\q
��?�������0�s$8(A
�N�KD7�݀4G;߬n��4��!o}
Tu�+��
a2�FW&��8d�E��iD�Ɇ�q �A�^�:�Y�!)ʹ}H�YKD�R�������O��~'�����ZM�%-�{�
)'U�&]
�YA�
I�<
��
�a]�o?���c"�D��*��
,�R��S��?~}��x��?}�������۟��?��۟��_��/�����ۿ��o�旿��~��|��?}�W��͏���?���줯�����w���_{N����{?������;?f��,�Q/�&Π�<%������{;������<.YarKR}��Rꛔ��Ș�	�C6�;�[��N��&�w9Y��h*f�o�A�:�%��yN������y��� ��0�q�m;@0�p
+:���8l��$�r��F�NЃrɖ1��m�
226: �V
hM!�/�-�d��r��$����-w��JP����i�
��ɓώ:���#D�4���b�f��7a��%Z�$�|�Ǖ Q�4x2j
B9
�����oV
�g�JOr
� ��,��w��BGwF�ڈ!'��.��Du��}��:`,���꜃��F�MF��4�
+��� PU����4��h�u�ibbBYǁ�,��VI
Iu-�%�)�O�6�%�&�g�F���wq����@����ݐ{��S��8e�AYh
QA�B�u��$����Q:�_
�U���,@>��n�P�Z�
���l��Z[����B�K��|X�V�;�,�
u ��NJ�>�H�6�
�?�s����1�2�x`�ҳ�#�Ȍ6�<���{��7�A�7e���w�
+4�
ɣ8��� �R�%$��]��9�D��-��G��}�`
S>��9V�}��`z�V$�淜|.��"�f>
#$=C Z;��˾�,v�OJ��ccv&
›���t!�&�P-c4I�U%�(��O�6�T?0s�+L�ل�U3�]��B: W�+� Un�`(�\
��z�Ww���x�R>|�s�$�[ ��^-F�i��艑�U?�3� m���A�j�d?�K���PҲu"B����g_���f�:su��/v�ٳ�
-v��Ȉa�v��� ���\"��g�
+��{M�}�&V�!��Rf�Jg�)���8�]d�ϒ!h�0����]�"js]���lj��qT�6
��a��/(���
|�������0h;�E1�	�#�98S�Ê3��!�ɈR���
t k�崽�Ä�ʉ�W�s�H�p�`�D	��ڗ@�L<��ño#&\桟Pb�y��¼�fH!u����?5dmM
��
"J��-J����=H��[��F���k��ܩ

�;S_�#% �RST<�X��G�ʅG�����PR1�P�ٙ�8
`:�Q�
p�=
+^�
����A�2J�
�R�ĝg٥:���y���59U���𻲛�
�3�"�+���g>�O�φ��h���d��D�V�[���jIz(s��Bq�UqZ~�8z��وeYB4�BWT��8SVX2 �X!�M/�2�R�nP�F����GBe�r)ޣ	l�
{z M�u&��q&��-	e��
+DeV��"nk��ֲ�A��b�+r	Jm== $�G����=��5�[���@n_����SA��m��4E�a5�a�4�XV���*3o
e[|"�A
��?$A��@���,��J�nX��lb���4t�G
+Vu`K�
��6�����ʨ��h�}Ila�z�1P�R��U�҅LWo�Q%;�����:���s�D���l2�Q�@�
�ьND�Ji�������%�A��M	r�h\M3�42�E[����y����(e� Ӓ�Gq
{���
��ܶ"�6n�PYh!^��>��P�cY�W��-�����%��q�H=s72��I�Tac����ca6+
-E�ẉknwHk�Q�u�P��H�|�@����R3���Ƥ�������`?��ۜ�_T%�:5�E�2޵o�����q�=��	�n��l�aa�D�D�
���WS��/�ā��ǃ-����y� 0=,7�e�
��}
�`C���?�m�٦�n�Un��lb�l�M瑑 o�T|���*��
z@v��&�^^<�M at +W0�L93=`\-��-�
P��CbIw��3Eg �|H	�%�-i^���'�"T�W}j�FE�Jf�� ��:K�	@�*ì���ў� XPeg���T��ƟX	���A=��z���4 ���,�%z�t��CcB.��IY�B��d롏>�RD�)�9t�e
�׮��9�S���܆'�jQX��,fm���-"*1��d,� .5���'i>;�&��R�MT��=Yw���d/I�@��ĸ-�?�LG 
�X��XZ�%��#V1jQ��N+b+.�P�y�b�� ��ᐟ�3:n�v!U�jHtu�Hz'1�	{`�L��@�fם4��
J��@@�>�
g2�,ӣ
�Y�
`��=|�ŢO���a0%+�}ؙ�Ե,���W��F[��hV՚20p
-��KdsW�-I���9Č3ᩩB{5�<��]V�5��2��$�_�~
�h�
��p�@�<��&��ֽΛ/ILo�4'Q*۔۾\(��U�k��_U����1>���AW�@I�9L�^�F՞�R�ּm�����
�J�eX\�~�p�\�cx�v�%�2=2.��"x�
�iIm���R��@��I84�K�;�4`\?��x�$2gX�#OL�匎�
$��h��z.����&<�0m�y�×!i#�l��	��\����k�Q.���Lś��������	�
R99�W��q
+H&�?�G����bQ��
fH��$��M�����϶]�or�89S
Ԧ�aJkvE%ӳ@NVXS�<h���
�m Ԑ`1�X�z�L�=u��]�H@ ;�`��{|	����>U
+(M>�G���٣�H����"�\���}v��v��_QR{�_4�AY
1�����I(�
֨��DL����AG^c����c/!*X
��X%cM
����.
z�M
9 B
+�:Zh��C�o�/�o%��b�%Ay<:�Ǧ�oK�,!<��œi��H��Z=AF
+��n3������,�d�O�􀧭
f�{�>6$�"�A��m�(LvY��Dd(�4
��
�S� \D
����A�������/�8*� ��
7�
;�#s
+�R����L^\��&�����
0"�}�ݾ�2�;�{�5�z��?�YO��R�ԊYB}�a� q���#����d(c
+�l���
:��4��g-���=얁��uC}d��P���$+�bڴ� �N&���n����KB�g��$�)SA��x+ǃ�6y{�
��S�>?r�nN$�
�SU���;b�1���A䟛�	*�g�����^��O$c�f*絷o�sX��� z��
+��_7s�~�5{�}"IK/�E�8�&�#�Q$ȧ�{t��<�
���g8�
����F��h7gf9�4��(��ئ
+��̏
E�!*H���iub1<�\���v'�
�	}�L�~y�jpO���X�g
1M�᎟���(2>/a�³�	(}�
5yk\��1�'
��S��}|<`х)U
+��
���ݾ��֛�\T� �`0{��M��]��[��%}r���@,
9B�f���}C��*cQ�1ڒy1�S�ĭ��K��'��t�Z�N�e3�3�
+Q�=a,³gҴ
s�@": e��Ș�l
6�z��;�:�ts�3�h�N���鑤_}z(ے���q._��� �qz\�&���I7oV
�|�3�m��D�tT�3�  T�_t >RU� ��{�%{9��p��
+8SQ������'�J<�U�����n�3����\��[�{뚴��,&�C[!��lI��D�	9�
+(�qg�YzżxJ� ?���j�l�d�h�>DR����%�w`=u�U�s����6߸����ϡJ@
?�)�� ����E�c/�8��wޥ� �2,�����47�nu����D��AǬZ�k2$�T���Ai���g?�%	l�b��
"pIJ ��*�P�H�2�V�N
+PQ��`�&�^��c�P
 t���*#�r�ɹT�L�fp�‘�_��O������i3�e'���z �����2]�ίh�_ y��J�m�����-@��f�h��\!�(�I�(oV{2c
+#���z'�c��D2�
+ɿi8�����֝��<��6���\�[p/��N,��m�E)�œ`IV�Ny����$�U��I��|8y8�I�U0

���MTO �f!*�]�Ȣ��U�ME�\�PA1���YPX����>d
�p���,?����X�u
))�+G�O�i��H�b���
+iџ\2�ۢ�J~�|��ٽ�Ж�|���?S�Hg�X����d%-�����j�%`?q*s�g	xw���P����ՖLP�
�@6�i(˦"+�qUl��*�۸X4����=�,32!�`�@��@#��ƌ�i��N�[(��ݸ�)�M�8M����wGK��ԓ
�"�Dk%4d�I�@�0K�O��=Zv&��Ș}��+H/%^�z��|�� �ҿ�x�1�tY\H ��
F�$~
>%@'�7d�sK!�W�P��.���,
����\�XN�
IM٬U� �y�ѱ�����K
7$���Q�I�~��A���X��K
�(c���KavP]:�Z�)���v{e�x�fg��u�=^vI��� �
+�宨��e���P�D!M����h��R2ڧ|@J0��x��7����=(*Y�Bri����y%H� f�ޱ(`����S���AW
B	�� �$w��(�#߅e��4���@��
�s�֌��
�q�b�A��c�\9��
�GuK<|�X��Þ+\Mf�|؋q�~,M�‰�5_e���,�l�j��Au}�&�����Tn�6�Ys�/Tw;K����#ה�L���L��:V�A�*�̭��
(� L���E[r���x;��
~�b��]��#��^���z$���3�=�DYx^�KJn�
����F�)�H��@)�ֺ'R�K�i\V�L����R���	���l�����8P�vQh��Þ·��y
l��n, at V��5����,/z�=h�
H�[-"���x�oב�z��8%%�@Tɤ���ï
Ť��������̂!�oq��^u�9B���p&S�F�����l��2x|s<�	Qc���rʢ�gDR�;H�Jrn/�?unp�)Kr���	�C'/�l<lQ !H�K�w�_��)�m�۠?��,W�k��z�sɠY��������W=L�|����L��R�j 5S
Y�f�W`���ܡв|�L^:[R� [...]
+W��ݓX��_y�U�<t���O��w�tϤ��q0
c
�IzT��dBmń�X�eK��=
�
+��ܨ$�4bXvw�ǝ6D3���a8X湐�1
+�^����������
�[:�G�N$:�
 �]"˩�J���̦�B�����g+�1ƉR�CV3�4�I���*�>�V3!f�`�Q 6�#a��Ģ����
��8ߝ
1y�H�;�b'J$�f���+f���z�FmΗr;R��&>���ۂ��{IO�7ӓ$����\��{���ra��b�Y�]�Ruy>
÷��"c䤩��m
���@�}I����͑Ѡ�����%1.���E<;20-�

+���$�)���QXj�(L�¿�b��N�	وL
�8�O�1L6z:ة\
�(�t!
ّ{�\�`�SfS��<\A�k�
+j�9�@ ��>��"�� r ��c" �k��3��k+�{l�D�S1���j�pSτ�(;����WC۝s�D�I����ܞl��z�"A7
+_�L��$��u��jdw�0��Aa���k�I\@ Vӭ'�Gp�s%�e���H���� �"d���"X�-���f�J�%fdf�����v��LۼIя	/��e�UcZY�,���8�v�дq�}���{�j��avjo��
?I�x�/�l��żd���R�'�i�4N[�1�����&���ਤ��z<-"����
�b�1B��4�%���Y�-�	�T�ۃYˎ�.��6LN 
m�f�R��m�x0����L��^Ɗ�A�״�e�|��5��1
+nX�N�^�������G�"���0�+Y��$4qJ��6#1�":M�b��a �&
m�$�t4<J���@8'�%ēm��z���8�l�y
d�m,�w�P�/z��M�'�E��W2�	��!V�T�&iޥs�����l�y�Sw]A�Əj��[nZan\�}uɲ
u{��*�ix��B��K�90W��D�|&f���)����y��k�U��)[��1�~d�0Y�����,��r���GT<���u�oԣ
+3��%ٯ�ܕ����
+�p
+�c�
CyQ�10�) �Fy �tE���Q�lJ�M��:$O��Z������KOҧ�����Y� ��o�V>��Y�ӡ�
��C�z�
+/`�[�m�ޝ�n%@w-� ��fI���Q����k�K�O]�U�_��Y�����-2����l"'ě,Mpի�
����W$�%
D(��|���+�T�i��,���[¾ۖ
��'�W�$
��>µdz�[�p��/xM�=Ж�2��L�P�v	@@S�|o�2���<�
��F�0�
���nۤh��˓��0I"+�aA�7	7&�S]����P�Alt at Z�h
�b~f�T� h��"~�:���A�jvvs�Aw���#���L�15N�	rL �(+�b�g2&�L�b��3�����*Q�7j��B;�Q� ��8�6ۥ.U
��
*<x�sr4��_�.�=Փ+��P����
�&H��� ]4pբ
�x���`a?�b�6*f4]&&�Z�n�
ي��^��'�?L��t�WXpas"�,SS
n�@�c;v�q{Xq!#�F�{M���K{5v�d�Q��y��"� ��	T�X�A���
$2��\Y=���c���	t>'�(�-�
k٭�E/1/�ఐ�zTR���,p&�
�܈l
�"�2y����aCԝ�.�c��E�L�*�oZ4�i�"�A
+:��-�)3Z<�&�3���с/�ug���γ~��
G���qz`�
:8���<�J�c^wQR$�d��Ư����DW�5�3`�`׉dJ܉�P�(hY0g|ܻ�V
�6�a�R�4G�=��9�b�sv�<Y��B�$���IA��7�j��t�<o�����qz��H����� (2c��:?�5)a�!�NSA�WR
/a�Y�
\� �jb�a,�+jr�Qy\�$u@�U�N�H?�
1#%���-E
+�
�	�pn
#h�� Y��J��'��x�Az��j6��QT�W$���2�C!�v?6�|g1ĕ��H�>����
�=�Oi�=�0�r��ŀ`Ib�ˊ	�{�}J�I_���)$�NG�Y�G ��b����6��sY8���@u
LK�4Q�,:j
vE�s���9�~>���x&�?ȋؐ��{5M�oؓ�'����&�~6QE�^�rD'۹!P�o�ΐ#�%����o��a1��A�Hu���A5�[�_p�O3
�9]�:
+�}zTa�N<,N���<�	��h/׳QQ����P�|��(6*�Όzv��z���J��]n�R.��V
B�i�{���M�
�B&�L�ڡ�5��?j��8�6�Q�oӆ�r_h"�t��qP��X�Qn�Х,���~�
+A�'����Д}f�X$��H
*�%S%�
U/���\>vVtX��t��zR~��̝��ä��T�
<3<���s��G��M�l�+������Sm���n��f.�~�T��D�KD��y��L����9w�L
��\���SdӼ �����ȧ?�W��Ȯ��� ����
~oB��(D��$2+cdvU����+�{�`LS����f
XI�L�9�G6��W����279����4C
�<�P ,Έ �$�Ew��&"[�U�DO�f!��\���ǐ��%
��k�?��An!�Y���3!��nvc?���0YL(a���f�:H��
$i��k+^���
����,���޺�p��b�Xœ��ՙɸ�h掑�
�E
����́-�bX{��L�8{q$t5��J���QT��Ҡ^�5�"�L��,`�x92�L�q$5$D�@NJx�J'�xb�oj?���s Ǎ.��3l�w�k�ܝ�+�)(OeЭ�p�Ns�1&;��fE����0�̥!o\zR��3Z�h	B	
(t����b�IOCs3	1+9����)' �͗Y􂕎��
���FU����&���2�{��!�18�ޣQ]�����$.���%����@t�������ƥj� E�b?%:}��#V��,��;�Ƕ�I�
@�=���lf��
#�;F,T�c��
�!�.����խfXXa��(�$큹�����AU��6�
!/�`ҳ&�z;�:��>�R�ҟJy����%ê2� ��el�'(v�j���
�-�A~����r�-?�#���7*����J�;�$s���I��
��
+$k�;��u�>�a
\s3F�b�Y�a�3��3#pZ+� cU����V
+�:I�a��HK��$i�A���C"|�<��A^U���D���bIw��@�f��d�?_����eF�4�
�E��4�'?��᩶m�����l���:�U"o��Y"�$Ǵ���6e1+�ua۰4<5�6����G�o�H��Y��@H�_���P�HQE�����d��E(ٯ�\�Έ��—}���Oh��K����nj���R��jY�E��Vwv�����鍲�8âԉl��'Χ@��c�2��=��](��M�SD��R��$R�Tɨ.K��о�J%�3����u��Ué��HT�I}�m��R͏[������qҶ�Z$КeN��	LO�+	6�U�&P��
���ryV�D*Y�d�b��b'�D�x	�6�ы��6�|bs�n�ׁ%�S0Nv at J�s�^��6;F��f;²�e��80�kغ�HyO
���t�(�U���"���P��+2A�sq\��B�
�a���D8,cdzX�j8v*���$�
�
y\�ITN��$�Z��L*
$uZ'8a�/��bƔ@ǃ$ [...]
+8�N5Sb��)
+~�XFL�&Õߋ�O�ݿ`'9�P�*(��e��3
�>�){r�] !(BE���0#c6$/���
�qtm���LI[��	�r;6k�y�ԋ�=��(�k�����w�A��OCc���=�:����M�����P9������
��PA��7PA��/��F����
y����I��^ t%Y��@���|ԈQ4�
M��5��}�)k�:
�Ɯ�
+��
��Ԏ��y�>
q�(�S��Á1�&����Z+79�����K���Q��g��qa�<bHԞ�}.�>1y��9ퟹdM��+�{�+����JY��%Yܝ�\!_ґTߘ���r��NV
n'D(Ԝ��	�]
��
�i)�40|qGf�)�ك��c[��4]�ld3��{���L!B@��Ζ%�i�o��T*�طKB<|�S���$o��g�uN$�
,��pYp:� ���!5[\�t&�J�7&�^��X�?��!&3�
��`O�ɮ
I?͒P��wRH�!pb�pL6���-b�e��FI���j,P�����\T2"�gg+M�؞�$?��Eۮx��ɠ͕h�,�D���5�n~�xV2B�9�h���w�sA�	�5dD��ow��dD�
a8���B+�.�3�@�(��.-�kᣥ
+M��߸e;�I�T�k�B߬-��w�{Z1�L�'Zg��H8л�mI����W��J�Y�rj�u��Ħ����pj�l�	h��ߪ�P&D�t����^U��Z�p{$l9���zv#Æ�>.f�S�m�49v�M�L��Np��EJ�
lԚ K�X�9Z����r :��1Ov�f�ǔ4��O��15��� p�������?���c�?��
+�
�
���+AW���R���
,����ͣ��
@F &�
�
+�-�!Ӏ�Ù6�BWtvi��r�7J�3����rQ2xSӤ��v5��j������x�=Zj��Ҙ��K�
+,�A����]�����bR�,u��̠��|�*D�>+�#!�
�D�Y-��2Ϧ�&
�����R����[���}�<�[(��2��6h?�4�9�md��TV��K3Oj��K��
D=Y at 5�6�����m���9�(�
� ���7�����b�PLN|.��Cu�'T�20�_��#���w[xA�;�o�1b{����I��R���/T~=3N2��Oq�
+"ꪒ��gM'���t�.�u/�iz�}�8��	�	H�d��{ @�Ͻ=N at U����ZD�'R�h����zHss!JkW��q
��4"�
y��
��[fYWtĖ
C�I�Lź�!�@�
+�j"�'�A���������H2�G�o>yH�(}�)`���>��]S�
Y�	���Krv$~��
I�����,{��be.2���y�^��A���|	{�6r����8�/0;�%6Pw��G���
�Y)	B�l��"l|
�bi3�}�Te�Lɀ)�dڝ�o�Pk��
0�U��l���O�O�g�e=V,�|@3}fi�Vgh�'6�_��
�����S��LP�
�|r�c����X��z���
ʚ
VY��[�&�-��
+:bㄅ
uHr�x�l�g:)i�
o�ؙ\�~>î�8
��"���#9(�X��W˿ {�c����g�
�T^=D��1s���L&Ű[��&�^|ZFh5�j�U�q�d�ҋ��#�z�X�Ո"�Lԡ�ؚ��p���j3jhA�c�4�KTp�V�
��es�e$,ӑ�6�WH`�"1��X�
��P�vM.�Ж/E��繙l�Z��#,�z�˨�XO�c���H�
�r�}0�F�;Y�����;�$}��3�>���^�@�q�ٛc�>̎��X�K���: ���Um�߳��芠��L|�e�L �����A���VT�Ĉ!�Kd`����tT/����I��Ħr����B�i�V��}À0��@�Db�	��_֥��f/@�MH9G�����ig�fLx�Sl��Ϙ��+b��V!
�Ql�x%�n��!�,�Kۗ"��o�J�
����'B at t��� ���ApF�)@K�}X���L5��z���JR���g� Q�N�y�n��R��6
�1
+`j�OK�fl��'�E"]!�g/�̻�����yc�%�"a)�&zJ���������[hӆ`7c=eJ��t����8�H�~e\�~�ه�0N`+˙�� D�F���6E��|�5M'Z�e,uz��r:�P4F�!)�٬�U���\�,�Bղ�� k�DҦ��)!hu�ka�����8w{^^uu��ѡ��W,�\�$��d��f�(oׇ�.�
[@oL|�����_�m@�U��:蜩�N"��j�A�3�1
�l�
 w_m�.�RL9A�y�����PL���/�/���3�1�K��=��eA|܂z6Ɍ�X�#9 yNS?Pq�Jv�6�HMsh���Q��8���܋�
,�=�eiMM��2K�]U3�����ũ��a�0��}�d�0���N/�8�*���?`f�bj��S���Y! )E�ag�Z2��w;�c����*(@�l��uZ"�&]YQ�c)�<�`�0�lT]l_���k(7lg��-�Tϙ�T
� "�t��06��ʹ [...]
+�-y�i
��
��q�
+'I�ib
���b.�g(/G(�[V�0���
�� �6��ty�fq>�o��̌����Hi~��+�X�p���k0��q$+�3��[5��))#z.���'��
��eqK8���4���4QT�Q7��v�`\�%,
��fIJ�L$�� �%�-�jL�`+�"����jEo8iT��0����+����Ԗu8��i���`�R�Y�zs�p/
Gx����̟�
�
+H�s0x�v�
+м�Wpl�#�I�`��=���PBk[�l�4͜
b��N<��U=D�����=��4r%�fl�\N��O��\�
�W�
�:PBh�$�%���C�Z� ��0�'և�D�N!4�5q�+�E��n�%��u��(t)
+�

 �,p6�_#n�A�Q^�vmM�b!�V�K
��\�WP�*5-Bd�d����i
'ی(*%ʓm�M�\�*�^�5Г>?MK#���*kt^#g3[';$6o�Y�>��%ҥ�R.�`iF/�4������L�qD��ki��˸'�3�I +p9&:F�rM	)A �*2^�U�(*+
S*�O�����'Y��])8r-�x�ɷg
 D��K�Ii�H.���>��
�
�P`ªP��ғ���*	~�1�.
��u�x�9�DE/�r0f��j�p��r�P�DG��<+
F
+����E�6^
+y� e�q:	�Cj
{
>��8���W�o�V\���
xK�#H|����b����G����Pm(%Ն&�j��SY5�������B�ѷ�� �*�+

�\@.x^��
�:du讒s>5$���N�I3,�I�I~�!a�&m:d���ᛉ=UuV�;"�k�%bL��� X*�%b�TEĹ��P�e���9�-;�llw�5㜜��‡��
^t���J�Esl�Us��<޾
+?�cb���W�>���~�A���c��3�.B��򆔋��h�o�{���쏝ċ�
b�$l�2
:�e�
�б���ؿ�$�dh��EY�� _�g��!��^�YЧ�PhˈyK�[U�ɮ�B���l��'�O��VQՋ�^�Mj�ڄ�9S�2���"�5�贐պI%"$A� _k�"0�"}�e� �5Y��)k{�Cq�G��7�a?i�&U��� G&�1}�E�X��d�	��ʻ��>�*��3�ê9#�|��l���
�V&��$��
�%EY���:�
�U
�rj�g�k���G#��ر{Nڋ�W
�1��-� Iv*r��J�I�Uo'Y��
	4e�����m#�%�gwA�_Q�
+d��(�zaMuA,��Dx�	�w��!�(�KV38QH�^��{c�gr�v�%獕1=*�L���$o0����]����
��O;����-F��F
D��R��f,�0����!KGi"/9!`3�O
L��=t�%�}xs��U���y����|M*
����n0�X��LϽ�Vk�ףeXz±h��Tv��;�~����عʣ�� (q�U���U6��
}�3[PǸ�(�9�,jnyrш���p���&
<
"2D�T���
4����K��N���aH�j��q&%�N�]�2zS_�0`�R4ٲ* �}�XO�0���Z��H�
�Q�+���\�
�ܚ���g�Jz�����#7�a�?���Ɩ�.X�
~���3����tb�
]?��6�!�zT�p�#��X�2sS�Ͳ0��B�:�?�B>������l�)��Hg|��T/$�
|4]��:���s���%�|�H1��
�zH�'�)]P�j	,$
����l��
�X
$ [...]
�,�4J�g��*Q#�+߯�&���
,-'�NmѤ���l<�*�e�?����M ���=,�Wf��r
vv�F�YN.�T%���jѱD�U�`
��,-����{�n�
�p0x�L�PQ�DL��g�d���2���^?f��6�N_Ӡ,�<�̟�`N0ת{�m�����hs`{�&(�� ��-��
�YƜ�Β;Te�l
��!�X�#&�2���0}Ӱ�ZU����7U���O���o�ș$�*|��I�姇 +q&�� ҅t9�����B,�O `f+b�Ы�b!�=�o8=f�uS� خ�%�v��1��"��eV��e���"A�R��&�O�m���L
E6OP��G$y@�
�r
n���Y#�A��1��fV at Y]�Ŏ��h���R���/�4)

+��vː
+ev ;$I���Y�/�
��L�gF0hBd�C�MF��T��MUr
ݨI�L��n|:Wi�p�%��[
��?C

P���M at uz���4y[��f
B���~��[H���羋O�o�?�Lp��䀰1ٳrB�	�+,`�!��7
+oOz�
�W����m�QA4��E��Er�K*�\7��}
��������"J ��G��b��
+��4*ɣ�d��<�L^X۝//��vp�t�� ^J��-ު�z����$!��ׯ����Y\,߱T6"
+ 
>��MQ��g-R�{��
��	��12' �ȌO�M���
�j�J7�����F�2EU:^$$w3w�
�U������
Q=L%�j
�ۣG{����e� �҇4
p�N6�m��3a��8pN�I�W=�#R����e��4�7/�2!�W7�<�rF��G�v
����5�؝	�7�wIDtE9�Sb�Ա�c���*Jb[ :�b�-x�'��X9���  �&�J8V>��Fu���2h(
+��eԋn��9��xjM����2U����W^̐�F,e��%��5����!
�j����v�A�W�
��~1�a��-�n4˙ϔ\�H��
lHE+���Ё��|ONh+e`H7��(�R�|U
��C���
~
�%J�R�K�
�H�~
Ⱥ5���B���%7�#��Q%DM�a��@l
_��QZ�C9�h���#r�f���
~vMV���|�&w�s������{8�n)Q�BϽ��v�%��wr�PЦTȚ�b$kaf\�e�L�빃�U���#��iP
�8u�RCU>ҝ���bRd64�^�
E�d��T
� 5�}o*|΁�I#�
ҝ���)vuR���<g���;��B�
wхG�r��!��I�*G]y�����kx/�z���₶��Re��Ll�$J%�(�X��5M�n��ZXQ���(h+e�Uq6�L����P�r�$��
����m�E U���[�T�ҏǁ Dy`��U�@����St
+r at 1����0��E(N�����}�:Q��n�>LB4Q�фF�z�b���agR*m�zTcI��@��_��m��z��G�3��$�I8��
՚�޷B����N�wt:�:"�������ۣj
g�.�
d+~����--a.� r�i��]�Ԡ:r�it7̦��e�s&��R��� �6�Ч)�I�
�6]NӔ����1��
�fX�u
\`��wו�p�7�
�C�yyM,�&��,���/���	�v��^�c$N9���Z�m���̳B��G�}0�PN�ᐣ�Q
� ���hl�"�V�
�N�?���l�
d^i~@X�5,��@�qP$A3�!^�|,����~�6VVR;\���9`5�3�{����\CDEj0��W�
��8�<I�/
 �x�I+#�>�QE��W�,�L@F���Jd��
 ���8�$�I�i�E�38E�"���"�G+�\0|�m��Z\����Y�I|fG�|q�+��H��R�
�!A�����>0N
�&V
���C�h��% �㩠}�J�2����|�(�R0
�����r@�-2�!���g�F�E�U�`r��{�/;I�|��9�
+���)ˌ��@ү���Ωi��c�f����� Љ��:̒8��sX��Y�S��,�o�BUϱ.���L��
jh oG�^��.���� - U�6��t@\�p�^���,1�y뼣�WC�k
#
�����셌+
v
_
�S�T�H'��8H��Y�\H�������6̦��CsJ
�vS��b�M�2�/Y����C�A������/�
+�{�)�F���,�mg�
+�4
�EǑ�j H�:sMj������
��������*�/��̖4 Q)0�))Ӝ�
���q�iC� �Ȏm�۝>��MI���[30��7�8AB��!JU��/���'�Nj�&{�}]m��ճ��� ���t~�+�l��&J �ع\қ����Σe�1	ԃ�0��nZ�R�"�_UE�0b���B���(�l���.�8�f�� f�`��v7!`�9�UR,
��t�.�6�=��W�;�|��� �� X�@�`��

��L�<��8��(�
Buta;Y��	
+	L��BE�*2�r��l�]�=R�9��X&����daR��ЁMp����Q~�p�Z� �GĚ��Y[Hʼn
+��=��ʊ_Q}SI��ӡ

�lX2�@< �XЈ��4��]�)�����|h�qp�M
�QUK�_?I�w���6�
�#uP�v����$�q�W
01'&�l�Ww�0ݞ):�'�cD��Ö|�Z��0wh�J
M��
v�*
+�~��l��~����X�I
}qՆ���S�W��s�V����p@��u̅�5�� E�$y[~(��P�noN��nx�w���-A�8;��B ^�K�"��Ԧ��RZEԓ��@�a<��D���:���
G�6U(D̉8�f�l��
+�?
�7�
ۆޠz/�\f�\Lٝ�����?�k�
+���U���x��w�|h8"T3(T�
�؜*i�|!n�eL�1�Goq��=��2=��
2yF�C��e�$�Z5��8:Ty
��R�Ċ�Aɤ�Ԇ��$���4�j�`��
p�Ƭ�$�"bzgh��Cz����V�B�_nv�ؠ<
�%2E�9\���-L1�=��
!�G��H:��H�5L�a�����_�E~g��gQ�r;�d�"(=��(r�D�T��E�zg���Ey��������q�0
U�HV�3� 1�a�S���1��1�u������\,b<�X�6W�w��!S-���B�"����Z-
+)�h�W=�!�-Y��ܝ	=�
�u�����
��%*&6����e��X���@ǚ����N���O�.t��86\q���-�6X��9
+�>�(�W/��&�>��&8��Y��~O�J\Б3[�;
�\�YE�,�S:{J

+AU�?H�G�	JPM�,�a.u�syڟ+�%��9��ԨP��f
^2�+;=Lg
+zW
+��n
Q��K2?�͌�R���6���Ro\ 
O<p���)�2~JJ�R~���z�@�b�g�X=zu�b���W@�:�(�q�/
E�-vh5��@%W�[���y�
+PUo9{j��@ ���AM�
ن��;(ZD
+�߄��� 
�*��69
Ĭ�4=d9����ʝYCP�"0�qCD3���0���FY,�?���%
+C���F�E
\s
+?[&y�X�a���+Tªv��!�����<�bdd��?���"7�-��{a� $
+(��uY5
\����M;��<ż��Q�e$�?���Z�bY���l
$ �4N�F��-%/������z���}�����r+ ɬ�ʼDM �����Q�1p�r��,�
�C
��A�AS�
Ew�,
�h�!�
�l��
+�
m
+aPg���p���pM�EȲ=Sw�
��
����RI���81j�׫�f j;�c���2EG�<���üW��a�2�b���3�s{�a��#��?���$ۧ�f��Z誀y����F���SF�3�J�ү��u�D�(�r>f
���rwA�2�{ D6h���`��fT"\V���f��.��CY��G@#dKO.��#Z	�qhe�0�s��=J7�P���^�(�E|� �n��#��r��1�n�
&�!��&ˢ\?�i:k{
3Y7�"�Xل�̅~��=f�qJϦ�>U�����5M=X�i�1��!�����G�� �?�@��� �`ztM��?=��/Q ��I at Z��yh{����"�8o
+�2¤"�F.5�,[>�B��m���D�/��&��,��J#
��<��?�ihš�=����b�#
B�O�'pg�Y~�1���i
+GV)���>�S�Tf���0�6v`�@CV�
�=^��O
�!�sW�Qy
����U�
Bk�eh�1��>�x��h�	I
�7��C���[/tSqo��f�KmZd��(TIY�|�`�K�+
D' R��։
�5�u�)�!�4��5!�����ͱK!���^�qי`o���o�V
6F)��Q}��|`f����߭��	O'-Ii�W0B��R)ɼ)�$��Y̒��.�ye
�=�r	��?�Z欌���c����\E�55�Ba�X��#{�և�	��B4p�A�Ox5�OKn��Ҹ
�oL�F���ZP���
�/
ܞ�f�����y�ʟ4)��
z(5�������f"�ԇ:�w���<�
B2h˔6�a�
� f�o��%X�T�G���L��
b�����9�k���G��i>|[�o�/�v��(&̵3�$�J�,��M��`� �

$��&7 at W%`����UrR�J��L�'2�J��� =�!�8���R�C,Č�3�[<df����;�d2�fߖ�4�ed0�k��d1�x�)Z)C�7�ƙ>���R/�@��q
+)�%Q���Q�)D��`w��sK8,��#n��
P�If�\����7�ؔ�����e��bO�a1l��8
�tY���׉�?��ls��lŪ�|��P��T����R��"���DJ2�w��w�!6��珲!��
+
��п<W.�Ģ�W�H�5!��[3~Q�T��p,�]��l,�y���=��`
{ZA5�S/Ld%C��*]3�!�b�fs��- a����y�F�.e�]�:�a����*���^��h�;s�t���
-i�"'|�_�tR�γ�3�d/��.�fu.�CQz݄������(�t�'Ԩ�E�`Թ%�e�
m4��uK����_X���1=�d���
��WR�
�W�h�D���Es"G�@���.�/����Bi��f���DcX��>����n�B��KФϓC���8�?&�G�ۯ�n������=�V��הd���O����~���������'�������������ۿ��o~��~����O��կ������;;�����~��/���ߞS|qq�g� ����}��/�?����������~���~����w�a㶷?������7��������
��ï
C��MS
���3���9��������?6z��o�M�_��o���]�������w�~����^�O_����o�����箁�s~�o���w?���?�O?����w?����|�����/��~�W����%��������o����?�����̚���~N���/���8���_��_���8��������_��?�Ez�����_�N�����Ͽ��B�����?�����o��o����'������_�ٙtN(EZ�"oߟ�*���j��eY~�ڟ���6���>���®(���>$yɆ�Ǚ�u�VHZ�h4���
(�/�sr)�Zs�������la� �@�x:��_���
'p�F�
\�/�4K4���Rc{X�����A>���3\-�f�����{[#�#kLg��f'\5��U}�� ���A(�w��mW�B�g?]���R�tS��
A������m"�+p>w��!gWAy�n��R����H��x���l�w�����L0W4� x#V|�X����R���_썻�h
� [...]
+�s�yb��IF���g+*X>S���������2��R��{s�ьjϛ5���6��_4�[��+\&�5ǐ�o���ٖ��o�dO��@.оH��//�q�NW��PC�ŗJz��|_fol1�|
��C�w��ޣ&|_��Wͫ<�}�زy:���a��u�}6�}�͆��9�Ig�ʞʬ��c���~�&���o�"V3��7k�%��y� k�wA�'`��>͹� �%��Oi>fϊ�g
�ˊ+`[룪ld3幵/B<���^�ケJ��^ܹ�*J��(������6|6�����|��w��
+>�g���
��x�I�,_L�2+k��

-`�8�t�?� ���qӾ�?������w�
����������!X{��_9!Ho&���I�$�-�7���Fk����5EW�`��p]�I f|�l�;	P�y���N0�W�VD��W�w�W����
+��
+�>2?�{o��=H�>��o&�L�ZA����;��"���f��n�ſ���_�{���km���ƕ��*߉3�nY�ĝ�i����L
j����Cz:��dz���u������[&M4S�|49�cΓu�M�u�;�mo�¡O 5��������8��"�S�,�;]�m��NJ��{�;�QǍQ}"k
��"���D��/l���t�H
1��R?~_���
�+�{e'֋P(&����"/����� ��M=�>�S| �C�������o �e����3�e���s����?\���=�)��>�q���;n$r%ޗ���pod+-
�E����u��+�fG�+�yg.�x/��� �0)��]ȈJ�?`��
)�X��|�r��>�1�?y�K�/��������$�
�����7�N�7�䓫�
�D�h3����+c�
�7
+ߏ/��+��K�w/�o,T���Q���/CI-V�uߦ��E>�'>�~���ǽi���r����"�F��=斘\�O5ik,��C���s�
�����X�n_�f�?�Y�)����E�hd�c�����7��c
�+�^&�.9ͽ�U��{�~Ȣ�6M6�1h��>�ߞ5N��Ti�_�e����|��[n�.�G��-d��zLN���h��R��Ua��c�1�|{�l�}&���r	�{����޶�ڊ�w�˒ư�
S�
��<L�6�x�����ϲ��뺍O�t�r��zzy\֗?���T��Q���V��s�n��4�p����G����تF��2�\�k��F�1��!�F
��?()Ⱋ c��������5o�eG��_�f���P�|X�)
+������|m���V���n*�?�LWԸ���}�}�-�7��
�nR~���c�Q�Dx/l�;=���7>��1�]n�O����$~�=
�����Ph��D ��=���qcd:�~�w�<C�;���x[�����f�����
|({}�T^<دN
����cN3���/��wy
�+Pa���
�E��~sA�U[�6ZB<�
+bבm͠�}֊������\X�;�e��U_a��m1���I�E ՝=��v��	#
��%��w{��?
l�w���!���O[�"��7�f
y(w�g�+�dL3��β�
	�G��
wX4Ȏڎ5�Z�k�7���־��bM'P�0
\�/�dL>{s���/�YX�
DOь�_�W����λ�q�/.��g�������v̻�?&'m+?�
��� �#��k���aP[
���s�?
b��
j�JW
�$�K��F��r�Ȫ�Hf���R��F�l�S���q?�	[$s%A�k��-�� {[�O�"�����X����b\:
J�M��H��@
tTެ�E)��6n/�O��k�� �}iػ&�
��q�S�>/��/x���s�g�`�-ǰ��Z���
2��8#0_���&��=���,n�@���ƺS���S�v�F�3�
�~��_%Qh4Q �-
+#[���n��bݚ����z������e@�񦴨H�<,�VG�	��:�m�{�eȻ�mX��Ű1�@
��#�!
O�����8R$4e�c�g��t�$�V �W�����<�;/
��B��c��,B���	�w|��^��`�bܛR
@��FXg��
�&m�u�
�?P�M�n\�}I4�H�����t�|�t��V��/��	��o�-���z�H<f���O�^)dl�3^
�Gs[w
UEK�SȲ����hQ+��
�j��J���:���}/.��L>�� �շ�4����#˓3�,�'��WoL��A5�M���5�M9+���OD0/w
�
|�#�(�����}�ǟ^����
	I9��h��
�^l�qF�}z~�F[�=�$�.�6��;���fF�Vfz��
0!��Y���h���k�ƈU�Ky����)�w �=�qG�i��|����
Y����r�����;�E6��ҿW��!���J�
e̻={������(�ɽ��YVR���Ii�D�;��#���s�Os��4 �߾ ����
+
��/0f��
$*�tTkܞ:�!�ן�gUT/�{oP .5���0��
+[į�W�D
��؋������0����\
DAs��D���*�{�XV4fۍ��<Sm'捞E��r�����/�
ƭ��9�h��F٥�=�����ע��ќ� �R�֣��
j���u�t$�m�흷
����Ը����
�E"����{Y4N��}g�|:�C���Z܁4�XR����B�Ճu�R6
ɇ͖}%�|��$�������	����:��1�X=�C�$0jQDx&���<S��e�+C�sj8�h�\����h.��#֩��6���ƅ�H).n�`/�G<�1Vdd1ۿ�k���������㕝iz��%�?�Vn�e$r��׎��x[�ǖ�+;�T�}�U����9�o
��C���z��nbI3�>�
��'��w���U+y|�f3�3�iF'���U9N�}\L
�����
�1 at 5d�vH�֞��%�U��@ �{�{��[������;�w�FV��2�>��PG\�l�
A�����A��וs��*��'�
+h�;�x�;C4W�UiN�Ŵ5�
��x�W��������c�d�&��=-{:�ޅf�8k���/�oB
+<����Q��a
KJ��5#ۊ���x �L��f��-E�����$�1�'R$�a�@|�R��8b	4
+�s��@�����҂a}3�G���w��}0�<���g$��h@,N�
�-�Џ�����w8*`�;O�[���"La68od�E��̀��r��@}�a���,ƀ��
ڰ*X-�a�S4�[vӢ��Qk�_ƟB�(����M/�_�Ct�e!wn
��
����{X�qx�����(��̩�&8FbWsk�z"��~]<��K9Zy�ZQf���W:���(���.�n�
HƜ�X��.��gW}Bٻ�&�jdNqM�w
ؔ�q���"e~䎚zU�
qc_'�b�������s���w6W��|#�]b�Y���ˎ_0lg�
C�:�hf�8���ָ������ӛ���uݔ\�I����g���~<A�t�7_�
ᥰ��\���Xjzs�El��s��P��HK��tW/.��H7E�B�=k�'ޗO��Dh��������o��#����O�����o�ʕ��|���
��6⾬
0.�Ű��~��I��0~C���ɣؑ�Q��1n�?LA!7��7A�5�~{HD [...]
��jsD*Ǹ���/"F�u֘[l�J�Y����&՛6B"r�x��W%j@� =���&�
�/wF����
d�_L�?�t�Z	���c��V|����*��eЬ��n=}�C��|vwZ�M)�J���ֈ����ѿ�;@1"��,�����=6*7����F���S �-�q�Wg�Q9�g�
}�=`���h���
+�®@?PZJ�c~ԅv�ey�
c���8"b�8�%�yd�_��h*� �DݤF�w� l�v6�k�xcX�n2C��"�@��Ѱ/٪�4�b���?{�GA=y(6�
"�f��1#w��r�P����{1s�Qs���B�q)t�^�;F�����
3��
1@�ٛ��\7�z��^�<W��⍾+�E��b���kZ�cX����f�
�⌥5`g�ZKDX���YҴ�=y�x�2
S�Eh4�����_��;�|�
�3��i�q�U�^�y?��!��
��Z/��(�h����ć�"r��F��ݑG�w��fi&���z �D�~��S�&X���;�
#���r��X{�m�)J;5�X�u|J� �FK[h�{
�P�%�����d��`���+3�X��|
 p��ٵݾ3�/�2�Ҏ����0�r�$6���T;�e	A�;�NoL7�.>!�k
�I`����P��t�=����z��U��h�p���Иb���W����t���!��
�Ur�
Uû�H+�`z�-{�Ezd��!C�Qw_��e�ݚ��q��m���}�!1���N
P V�~�p4����F�YK���;
��T�xD��2x��V
�n.$[F�/֘��u������-���S� ��d_�pr�}�;�Ac"�����`
+uAz��rLD��
}�!����f���3_:���6���ҥ�//�w���}�Tpm�w�W�F���d�Ƥ����e���ڏ�0/�T0����|w�@�M�h2{0�#�Mc$[�e`����
��V���k���
P�gCi,�*�O��L�a����Oo0j�pC.Ÿ�9b ��;j[�Vqߕ�bS����&���5D�]$z��U�p���C�^[�XЯ�П�+��zC�B��b\f�^�5�
T+(�[
ŏ��D2۳Lr��逭gDmJ�}��6���=L
�����N�p���Lv����
+������az8ָ
��1�'Oh�7�b3沩W�682�r鹵-j�k�j�;��+L6�4
�HP���
�耪�7~���.*,�xm�EX��F�	
L4��o]Dr�]������6
}�+u�/^e�S��1Kj��5�D{2B��lﱨ~��Z���	����ָf j��ݬ@����R�eU��/�1�-_����y�a��̡�bѠ���
l<a�c �
�?\�E�4b�[%�{�ח0y^�
fO�W>�N��7_�N����׈�o�מ�3�3f�0���1�)௽�(�^��]]�;ބ��s4�@|���|�UO*
����"�}
��/���gO���[J���^�m���4W��e��go��� _�K��2���ƭ1 �LU�f=͎u�Ξ
�(w��`��#��@ID�xsh��:jlAP=p)w��Yq^V4JM���ȯ�;���� �WA�Z+�l
�rh͜��X3�l�Eչ�}f�x�c-96�5����?M�V)y�mu� ����W
kK+�"Wqm�Rq~��������8���i����m��5 at l����}^�i
+��/�7�h�+������b=o^f>h�%.��2z�K
�����#��.��M'��^��l��$�t��~�� �|��'�:�y�xi���.�L��6^ЫH$�
+��^���h�:��V��j� ��
�����!�����Y}��V��
����6C�ģ�d��:��m��d��UC}i=��r:
zB��|h�8��,�F-����H�����3x
��Ƒ�C* �����5��k@ �&��r�7\=Ag�ͳď(��I���W�B��=�#ղzZ�
+ل�����l�O�}��>�thn�n�"0�
��
%#f�(g�9��fT.�����(ol�
uskxʅ3�˝�{�����=uir����@���1'Ϩ�	�aw�)��+�-�9N.�~��=
+��>�e��?S���֌�)ʁ�AH���-w�z��)Ʃ� ��i>j{
�P��_��mD������W���ʊP�=~���!��G�3���,
IP\��xԿc?�L�&��'�G��ԭi�M8ʖ��A�} i��J���o����;
��.n��`2^�wx�d�
��k��b�ł������� Y��(�`,���]�>�G,'�	g�8�4F�[��81&"-����q$�_��m7ok=΅|��r�����������Ϋ56�.Ƿ�;Z�v��|�y?�b5�����r�/�}/A�	��
]N����s
;�)�.Z-džK�;��@RwW";G3��������v��W
�3z���zkD�k������y�
d���1bUm�~�ҿO�:	���|B h�=��'i���֕�
~��f���ߛ�y�]]���r�]E�`����(�)�
�s�`V�e[�de1� r�2#���@�U��
���
��̚\�ھ8�������{�bjsOH!���+ [...]
�P��Bx)d�¼K	�V%�*�6� �"�J�9����QE�|�9��GR
+��~]}�Kn�޷�ϲ�C��
�d�J��HX�*��[�42Ki� I���-�S������\[��*�BS��QB�
���
]UR�y�#�**���=�/��[�R&mDH'DiAX^Ii4Ś�gˊ5u�PZ����cِ�E��)c�
 s	�����H)�@[�2VAXQI����YttYl�|��ЂrT1�=*�"�I_F�r�#)�e!s	+h�[�/�K>YA
�0��@(��X����@���ޞ�X�4Xg�#`������TU4�ާB��E�:�$]l�I�^���*
�~�
3Y̼��+df!���U�_ <���!�����wQ9�+ݓ�/�a�gY1f�
2�-@�#1�$�� }�D%��)��'ò��g*�g�Gè�y�G�LУe�!��9�
fj;1h-O�,�%)L����=!���
� ?���y��

+L
�
�y*���-"1�A����
�R����@ $+&̰*
+�#���T����e������BLV�%T�/��o�4o���B����0� ��ta%0)=��r��J��|�Rz)
�R]���Q���B$,���ˁ�k�E��Q�>$.aR'�T��A�[D��˟�=���ȃF��B�%�.3����=!���HV8� #�*K�����,5��E.Y��y!�����bL:]��}�
�*:�0SJ��AE&��'ZHXNg�΂Ha��XycG�*����)+/<K9�X�����|n8���
+b2��ҬԈWUUR����c0*��RvѣL�Y�Ӕ���.�f/��"�!
ڂ�c[Zp�#q��H�i���bҡ��<y�
+����S.d��� �e,�4
LfAQ��<� �B� �H��eà\6�IF!2�4ĕT\"����z'Z�y�i�T�I%��
+&��O�L�RJ��R����N�f�O�����H�_%L
+
��VSQ[y�d�T>L!&	�T�8�W�[��xM�> %�S!OUeU���2�) c�򿯤
�,*?��‰/
��d�[��%Ϣ,
h�T�pE�`2+�$�QYq�
+�ĉ�6.�;�,DD��$&�2j�3�x�Ѓ�F�TI����O"�qy!�Y8Fx���$O�h�[FurAI�,(+��o)���g��H*ֿ*o�et����ϭd�5H�Cl&�
+L�U��4�)��2�LU��Լ�B{�1ꤏ�f��h�]I�TI�kaY�
:­��j��* HNK%E�t�>�����g{��%td-yJPh�������tP*n�g��]-����c��lSKE����S
�dR�Ņjz�T�:��<�ˇ��'K�+��/���M&�P!��� $��
K�w�P�@9(K�>�������I"]I'PːIW�.-
� q����V]��Q��<�]���;aP�t>L��.W.�
+D�5
ѳ>a�
�查�S��0� ����dLb���|�N~r����{��F
�Bȕ@�,o�**�
�rZ���AW�`Q��ѓ���D��r�*��EU�AB꼋E��A�‰4��J;��h��6���b
�|z���[A��#1�X��g �M-���HH1�#�L�
�
0� N�P*E�*�Ũܫ{+�k�QIU�����B,:E��6�ȇTJi*�_Sb�8�+B����A��yoQ����eU>��QA�EC��]S�2jGUP��=�̅�%$�BYK��!�����ph�iG%���\��Q�M��R��L:{�2����R�L�j�P�����W�hS���r�!a;��LG_Uȍg���
K�E[8�E���<�'�,�7XF�_ at Z��zY!0�,�PRF� �.�PB�@W^WЀ�
+�Db���
+��;�
+N�2>Om���AƭX.oZeT��G*)m%���;RZI�w�PK
��R��P��s�>+:��˨9��,*�b�vf�+ox�B��
/e�S����)[Fe�#!Ŧ�jҟ]Ni�*j�0��Bu�N���U�cyɋu*YT
�F鮊B���}1�|���I�}Y> =I�
`�бӬ|�*u�@�t at 5+J��r�2H!�<`QI��YV��R*G�l�V��V	
+ՠ�!�X�tz� �rO*�f�
)[IF\~]��siКt�R^AB���?*b�J�0�>\8+
����P(���k��A�t(gR����J��*+�y(��+_��UQ�qS�"��Ta>&�E���B�dW
���VR���\�
+}�Π�bY1�!��~��,�y^?���I��I(�:z")E��r���*��W���t�X��HV)]�Eأ�V�2���O��,�s�l��aZ�/s'��t
�I
+��&r�
�2:��B����:����(Q&u��RFi,2D��K'�O)1
x_A�����=�q:����$5�T s�0��<hTT�#!	
5
�A�O�E�|�<5�$B-��xe9]���Uߓ�E
+�,A2����,տR��-�I&�t�=�.��
�%IW)-�f�K)kN���eTA�7�756���Cz
�����՜��^*I�D.E���U �E����@�*:!���D�[Ig,:#�P5PI9/��?}?����+�o�)g�	�'c��샊J��d��ENK���Q4��D��thB�
�r枛��~�_Œ������9t�|�Q�,�*\���%��j���
%,^_�tu
[Z���>��.ʑ�2E%�

D����~G�I_iI"}j�)�1:x�F�ʯ/T;x?��QN�K�\����c.�@B�4��)�R��ץ��)TZ�FB�K1�(ᏺO}�
+s'���B�T�P	�#sQ
+�
J�:�Ag�h&�5V)
@�ud �@�J���I���*�h[��[PF���"a�_QJ�J���)t��*B�4�}G*����J
���
�P����=[�QF�@'�b��V,U^�*J�Fu�$�ԙ�2�rf!��Jw����
+S(H�Π)g�Y�T�`�$Z&���Rp��Q��d��7�Ϊ�a�K}��a�ä�͋�&���,���R��
<�ʋ
��Q
:5ʢ6,��~��h�H��'�
5O��;��T9v2�:�%K
T�|#�DUҕ�
+u�E1E��0�Lѕˠ���+�Bs{��Ș��L��7M��UQ�Y%Գ�t>"y��
�ƣ��q�����A��n�C��U�[8EI.��&]���]�{�Y~���Q�ۅRB����L*䰜�ۈ�>�9�TatP#T��B� .Vf�����h�^UE归��ԜVVQs�ą�(T������
+%�dK%ғ�T��R&�ړ�Q,V`�dNBYуU�i(�'Ƀ�����*VQQ�$Dy
+
����3�i�L�\��/�N+����
����2�i,�T���`��.;RH�/P-:���a�y�Rҥ8˘��Ř����������AݪSU</^�Q<��i�
+���<�)�(1}]�/���
���xGx1�
�u���"���A�?�.��8�.�P�ϭQ�B�JV>G��ӧ����2�ruV� Q�jᔈ��[|��_W����S�����n�2���f
++_���۠�����snD1upY�O��
)��PQJy4(OKٞ ���@!�v����=@��-���������������'�o��m���h�7��g���
�JQ�]If
�t2��VI>��(���U'G��zo?+,6��?�
+�%��B@��Q�eo���ͧ�󞄎��Fz
��z�4z/�q��I�����ޭd�J�������c��'o��.G�B'��u ��BPYS�225���L�E�
+Q`�X��
g���?�›Hw\%y/}~��R�t-��h�k�Q���d�z83e�|�4
+�Rt
���S�|���A?|�p��[-
+Ѓ�b��t�?��@�vFap��#S�_mőBS�b ���$�֊o�+��X�_����w�y��1B��Ҳ�<
*��V������)������M�A���8|�?��
G� j��*��^���-)�[���U6�®$�V���F��u�������f��Y�r
��%h��W

+�,%�Bd�����e(��^��9%�+2���M0��	:�,�NM�c�Z�j�yQ�v
P�^��g
z+/&-[qP~��� 
����/G�D{Te~|+�'ޤ��~!!��@y~V���:)d��-LP��,�E��
햣�=r�	��d$ �l%��+�#�Y�k�\o��N-Eo��w�"O��~
6�W�~�]����?�.4�d1�~j�DL��B�bJL����2$�@Xt��L�_��������x������.!3�YhdP�fe�
����Xȣ�7��f~V��	d����]�y�'�ߗ������V�����
{�χ�ռ��C��O��T�V+2�,�����EnN���o�BFI9���i�_�_P�
�W3*ɞ�D���;d�w+���
+�Y�VӉ�=��h�
a|��۞Q6lN��o�I��I3�6`������Mt6c^�4b�����
؜�ؚ��$�=�C'��q|^�
_P�Fm��]/x5�n~�H|f�[��W�ه�S���i���;��� ���b�
�����n;�Ӛ��'����m?驊M��OL�Oa3�δ�([�-<�➴6aW�o��~�z������?�fاp��||�}(� �K��}�G/M�$��s������{�ج�i�o6�]���Uў���i�^�p)��&�����`l<b�ԤlzQ|N��2p��k;��A��8|�w��W�5���7g~����,5';�[u�C����l�f�;/n����N[��u��
���p6��Fg%��9y#fװ	�I��Z��f�按�6�n������OO�)n�xT<�㦝�ބUR�T���
[�������ST��������i��l֥�����נ�`N^>�
|��2�0*1�I�9/8�1�=�1J�UB"�S'���YAm�N˟1��?fW����Z"��e�,����+�)����)z�6���<�h��;���gv��>�V�{���Gڑ��:"6��]t�+��.���G���L��K��N{�ܔ[-ܘ�\�eM8䝸O޳���,Z.��{�!��-�v-ê�޴����KzL�mXk�o����
�n���y����y��I��%�wg�:���I�a
/�����噐^�]4
���ބ�{�p��NΩ�
���$�f���r�g��#�!S�%�ؚ�?��n��O�GSnˠɈ})��.a�Lل�w0WA�|�*9��	����1����#���S���X#N�,�TvG�8G"��Û����I�� �
ܚ��7�Y
��� ��I��'l�ڭy�m��#��bVM��C·Ͼi�������T��Ԭ���jz�6y���^o�#��ޤCݳ5ݹ����X{t����{"�Rv�N=s녘� NA�p�A�r�xI��)��?Ixdmi��#�7�s�S�cT��F����iE}ʮ��`�mN�}�컳��>�������6���Y�ds���wm\���/�mx�aL��ND���OF�����_a��n�c�oNvU-~y�=�]��)+�`��9����=)��p.U/�4H�Y���~�(���a-H2�����e8��l����J�%g�u�S�B�%M���p������� K9��������i�i�N��Ui��H�e�m[5]�#s��xРM�4��O+J� [...]
}�\��~�h�q�&��WG]��Lx�Z:���	�e�Z��W/��}}��g�J>����NI6��IҦ�{,�[/'`l�E�X�+�~=��W�゙l~/��;��y�H�����;��ӹ���ᛵ���E�;�I���_'#�zuʧ���j
̝6�7j���({_?
x=.:�mSun8��#'���]�Q�a�缃�Q������߼���ȼ�
�#7巘�N
��8� t�SڒuK�S6α����g���[���:
�����_w���`䱺!>#>���
�Ns�z�S�p��??���8���ݲJϯ=ig�?hf%��N~If��c�w�kODx�/�=f�i'
ʶ�SX�
�}ts���
nM®�N9-�Ȃ�wsBی-�٩E���������x�z/4�:���ٚT��~ <�~���
�cl�wl�a�{�/N�r���?گ��{苶
+ܮ�A��=��������WM8z?�]�3�Kֶ	�
�Ro.h6�F�NX�I��
I�7�ߠʡ�2�.E{ʡ�̹���=Z��OX�`���{�m�7�$&ë́shp{�{j{�k_֯�
����F2�4�R��.�"x!��r�N�0	������Ēy�X4A�2T
_�p�m�]�=r1�l� ��Ձk�e˥Lp�
+�=	��G��aή��O6�ͥ�֎}�.�Q���G��\�" nŽ����
:����Æ��f%-Y��ŸS�Y���l�Ƥ[֙t��3!�	��)�˹�[����o`0��R>^
��͆d�頌��O�[y'7��/�AW�G�������\�tKeG�+n��O�@F�>�
�
��`�:�x5	��%��G
�ӯ&:��?����9G2�k�돤�Ͼ�-�
�|�qK�3.a}�+m�]��kԤ���ۤH:�¸Uќ��;���St�����t��Ɣpւ�=b����
���Ǥ��
��S��p��G��S�n�&dg���伨&e7���Kу����{�}�-�~�
o��-����	Ħ%�[�C�8n����%�iS��ƫ�؟CC`��)��-b�ۏ��gq��<�붌t�[/J���
����EIW��$2߽/��9��
jR��c6Y����qcRZ�9.�})<�9���ڽ��6�c����/�+������/:y��~z��w�K�>�yͿ&�d��� '<FՋi��輦g�?x)
�1�����j~�����mN�|�9+8�˚�N�%l���G� |F].`6��V�>Y7�U�'��fܥ�ɺ��,�e�#8�
�Oy:?ܜ��5؎�8���;J�'z>�|�f�`xk%k9n��%]:aҡ�b`CNq
xje��|Q��Cz

2
¾K��}q���V��l��,�t�E�2
�ggi��L�dI{T��y�ɜW-�	�e��J�[T����+bTc��bv1�U�Ҋ�
�wI1G�!�#mς��^�4D���{����i�F�pi�ؿ�W֞�({vV-�2K:
�(�:t3�$��؇a��1��.���
���G܏�>
����.
;�y&`���n�Y��R��qk��'�	�Z�[
��F���K����Dx���m��w����	��\�g�-��&/�#
��D5Q+�pd�k��[ވ9e���#���[�#�m�A��J���7�:X/
��ۘ���ڵ���#�������\�&]NtNZ[ `�
�-kRN������W��a$f�ݻ����[��󫷭ܣ��׏y�=���b������Kb�ؗ�5��S���龏_�~z���K�Z�ٞ��&M�{	��i�1I{����?�����(���~�p*:^��Z^?f�
	ؑ���ü5m��}��� >����
�'CG���Z��6�<n�ԭ=�`�ު��կ��r���[{��p�Q߾ [...]
+nگ�Oy���X��Wn�<�C0vlܭ�N���o�5�ܢ�7����\{"�y��fE��,l�
���l+c{0��P�#iL{�}��N�	��wh,����
]��a�F��3��l�/�&�j�������O'!F�Β��f�8���U斵�L��x�e�;4J�F��ˏ��˹e�.����0����q��3��Sn
/�
���= \���K�@/} |�D�%�۶�b^�:jWtn[��i�V�	
��.^˭�vV
�%� 
����_�j>�D�����;o�Z�&SE
�
\Ʌ�#�
�5���k ]ٚrHc�샑y�:��$A��/ҡ
��=F��M
�xp���e��KK��?�����I��%�W���`�q�������<p��տ�t��Ic��磕o�Y�Y���I��52�n|td�n�{+��#PO��Y�����n��9���
�Z�ʞ�9��gw:�
�Sua^���C�G�y���t���xw��
ﻯ���+���uFw�w�)]����Td����D��i���4���xoU�ʫ������i�F��\���`s�����\���q���=��?=������& ��	�z0p�9���i��
�Hd�s�٣�R�׍�|�9�<��}n���p�z����[u�������{=e�xo���{Xt%/	z 2Ł�D�R.E7��v�W	�`�{2`�
-o{�2:�=�]
�fO���	�^�YU�q��������򞤋w*�f�~����E�٠e4��}Ҏ�W����pVq�N�
��)��.�v�@O����g�r���c���&m��oۅ5۰W�l�c�Ǿ���������
k���4�l�E� [...]
����KڈF!��a�0�`ʄC\��hA&k�:Dg3A��
D�h�,�9��G�`G��E��X��3�����x` �g�.�G�`��o� ~�l� �
wܴ>��!�T����ʒ��]
k�VE/�1S&4�)`;K
�M̡�@��]��J7��_�*Q�3t!�5�`>�݈��ٺ>zv��-}u��&�?ذ��Ϩ�5���j��VU[tNt&2#�Y{,>��>g_��w�
����W���k�����
�1�'��ۘnx72���
oa$��ҋ�g>��n3�Rп�Sxn����ߨ�'���t
����oŀwDg=�������
���pȚ1����~q��;Ͽ��
؁�6&��0��'�Sq	��;v�գN�M��~v��o5�~6�GR��c��#��Ȭ���x����I��\�-kM8`
M
�q�A���[^>�(�^?��^��b�?����䜢{'��$f��{��<�	�N
�	�����K�~�dg�4��4=������X)7؞�����}�x*���C�S��1��
+
t3���0�
�2�3DP%��D-�f����
-Y����x�(�,�y�L����o2f���Е$|�uc�.:sI�g�>n}/�$V�a���0��	Mq�F�H�	��~�<�S�����
+��;s+jyfI<X#Ʉ�ʤWڙpK���i��1��ؐz
0o�&<�1�9�	O'�N��D1��3���=��<O�̓�^���;�zcvi��/�%˅,`��N������,!�d
H�M�4�Y"{%l0�}�������
�F1��g��;��c�3"<�Uf��)��H�va���T�m�d��q��-:cv=
�6�xe�%kB�`�&�ߚ��|�9�;�����aԭ�y9/��}��΋���
5{c�o|Zt&6���׶<�Ns��CS'�
!�}�^�^�z����پ��
8�W�򗰜C�>���O��\{�?��
�3��Ȭ���c��	���'�c�����7���^�r��~q��
�G
6�?���
g���� �ֽ/�n}�w0��	 wúnƝZnd����T�����������;�{��G�=#<�S��.5� ݗ
���_Ը5�ʈ��;�N�~cBt�g]lN։��p��,:)� <�z������m!�0H1����k�1`&����%��͢
��F�a�<}�ޗ��Dh�s̭do� �">�t��ĊV�/��6�A�
+���6�0�6nkf�

��n�ɤ_x>
:7��bq��l`�Fo���-*��e^].,| ��9g��A�D�I��˄t���9��GԸ
�:R�0��-j矊g�r��^-�
u�
+\�O��fB
+
��!ig�P�cE�p��ۨ�W&p���8A<�9n�M8
�۬ݘ�;�9׳p���\'��W���J�^�}ZA&<x�Y;�F~����Lx�
p�
��EY_��e�	ٸ�['� �fÀ����2<���dBzuʣ'���v{�������]�Y���]��%m�'���=P�ۘ
P�W�3��R
�"�r'���
�^�
w�z0�N�M�t�<��鹘ӢŜC����	��<���Y΁�	�1ܡ�>�hs�s(>�h��F"��ƴ��դ�v
�ҋ�����������
t�פ�Ao``�^>n+y~��tsJx�p�4i��p�mbNӉ/Eؼ���b3}��ݩ����-�E&8�yM����/ﶳ�N-?�в��#����z���<�^-�'\:~��fV�A �����L6�>>u��Rl�-5;����v����f�Fm�gn��}J6'�Ҧl ��%�� 
�Y5�i���މWߵ�a�QGYbVX�-H�c6Yk���$���¬C'� ��%��3�)���Q��|�!oM�މ/%@�
_�ޫ����5"4p1	� 
=�T������)�^�r�5Y�
ٰF�%�x@ܜ]�vg5��偫�O-�]�`M�/
^�]4
d�qګ�� /�.Y.��#�=��SN�wk�0��1���&�o2��=8<s$	�Y��\{>�i9!>��=;�:�.���F2�jI�8�k6&<��F co&��:Y6���"�4�R>�6���lN�W��:E�w�K�k�Dd
������^;�<x#�1�kR�Ә��7�o` �7�c�Y1�bi�]�k[�b0N�
�vй1��)
c�
�~�
]��	
�"
��;6�%5Y�y b�H^M�ڣ��
��7l�MF�W$�z�MX�r�wd}ި\s�.=��5p�N�����?YU
�sxhk�"ߜմ
���T`���W/�o2#
�9�?������/�˫�S��al�n�&
ckN�O~v��o6'{&\�֧����fU��ԄO� �fC�c�nϫ{���x��������/{Kc�<���
�xƍ|wʾ�C޾z��7+_��� m� �Y����_�m�Sl��p�<�Rs��/�70�}����I�ꭎ��pf
Z�.`�7!��>=�qi��'���3�c�Ee���3^��
�qX�lP+|�y9�Q�z���)�٨[�
+~���W_K�����;�
9�I�q�I����yͿ��
�Eb��D®�yv�]����m����VSneW�)i\�hc��rO�=�ףΡ��]��=���� lXG��O:T��y�">w�z�f�
U_:�⧃JnnY%{�L����Z���abn���i�I�
\D�8�3���c�,[.%?��=��-n7˓V� ���hm�
��
��594����OxM��V
'�����u@�	�������m�6��tX��,+x�h�|c_l���Nzג
+WB�ǧ쏻T]�-�O�Mٍ��iM��Ӿ�1�;0�
��vV��ܲq�� �÷�^�;G.Ĝ&Y:00�Y��Y
�.
X)�d�-�}���{�_���.
�t?����
_&BzU�;0v�Z�i��h�X���Ɇ��ɗ�k_�N�_Y����zBܫ�%�ZIġ�����}�-�Lx��q��+�Υ]:Q�5rqs�"{>.9�
��,�Fr+e*��%
zAܮ�ٚ���m���
�N��w�
H�v���G g�N�(6/:�t����n����c���!=w����U}Q��3jW��OKk���X
q��,{�:�kw�5;AZ�2�i�%�{=�Z꾶��\�Y�6f�4m͉j_����5l©�Dg���7'�+V���͋[-%�����|��k��v������J.
-j��m�wU%���G����N�%�x�Toƒr6�b
y��T�'����O94�M���v��W��Ѳ��ϧ1� ��
���)�Y���_ه��j����)��Ɂ��M�
�^�>�^��):�]����Ot�1#��Agl�i{�
zA�s�A�7�y�38G�í�Dfe碳���uP��`I�^���
���S�(�i* h�:{���,h����w͹��������- [...]
+��
��鸸z���}d���������.5?��͊ހ?�tȺ��-�8�M��wsA\����G�`��h��@�N
��e���3�o�c_‧`���a
p	%'�7����f��gOT�a��7��\H�F�˦A�#�\ؠߜ��=�
�}rvp$��|�i�;|)
����B��͊���Jۖ��\�ͮ��/�ya
�>�o:��ő�ٰ��J�֦x�R.IStVp2閶e���20�8���S��^�6-;6��Ίi(������m����v?	�,꒷?
��~����	Iknq�R�nF�&)���{��ݘ]ˁ9;�Ds�����-��k}V\
�������	��+fճ�_�T���g�t�@>��%���Α��=���jz?2!8�q�$I��y(?�[2nN)ڗ��01+p+�����b3�j���ߙ���_fΖ�B�+�NIC�%�H�
���l�}]�g�K�g�*_�m�m�Ϋ!%=�
��v�����94�`��n�x�ίy���IG��ܘ㟀�ؐX�(��YtR��Ru��4]�oڙ�s�/��F-�|w�j/��}
�1!�&�=�1���
{vO�I|^�üm�fE
&Eܡ���Y��0���'=G�w��crZ+�	]K���i����2�B-!z��w�����/�������%}W
��>�8M��Fw�#;��p��=:/=�\��`N
?
��g�
(	�
��LB�k
�#�'��7'U
9��`�%iƽ*�Nh�3�o6%�ý���l҆�3�ꧏ��m��Ň�ON��~�^���2�i�1��kkN|f�N_�����L<8x!����
f<dI��lH+=!X}���X~&4��π�J/�~C,YFq# �?�k�
����w���/g���|�_b�����x�r��
�si��l�6�O�L�dp�B*8�U:4|�+��?

�[ެ�Mph�eT�Gn�M
K���9U�	�p��'֪vW
Ȟ�Y+�
G
��C�Y��.?h���#�'�yE3�#v�S�nV%����Fcv
g{VR�>.<��f{Zr:	�������W�U6�l�����ؼ�ukFٰz_p 2);��_��~I�F8� 
<JFx,�.�9e�挬.2'=����,��7��z�.��`�_?��`�f�;Ͽl����.Vj��G/G�	�
�Y��9�0��$��9�w�Iں>�y��k�M%��*Ӟ�+)ǀ!i�
N�S0?;�*��V��
+w�R�+�0������71���������?��~��ޏ�-�Q�N��Xt���	����wp8�Q�n��~�q''	����H[b6�m�ᑄ]�Gg��Ӳs��Ϟ?i*Y���]�^�\�b
��K�Ľ�na���>Kx��I������<M ��9̪�{�b�;z
���	�@�_ُy��;��r!Y��?�9[���]ܔ	
^L��q���~�kԢ�E%/��a��c�
����4��F�y�l
�/�8�e
+��6�dШ��U�K���@/�3��$p�� �CFX�:p$Qί�&��m̃�q)9	��	|�r%
�^56k�*
D���m�m�c���N��ռ�6�8t=����f�'c���[ܞ	���t���V��^��__1�e�y:��&}JΖ�}<
���ˆ�Wީ���͝�&����x@�p�8��y6lʄ,��ߜ[�i�ai_�í\�!�j1��7����q��s�	�Q�M�b�0����t���9QM�=�u��㲚��5�I�7;~Qc��9��ə?�~[�������D�cA�Gz�a�!��tk8ȿ���g|��
���
�(fV|&e7+�&�Mk3�s(����?�~�R������I��6� :�淪{�S���|p�WۏZ��
O���K܀-��1��'9;6���G킳�w��}k����|֯�f��t�[bv
�֗�E��b��Ig�Q�%m��
�L�<L��Nj�[5]�O��S��ش�
�ꉠ�%'�f
�]0>�蜾?�0����[�G�3]�'q����_�eg�*>��t��p�%I�6�-��Ox�M8:�\�q���c7b�O'q������9���p�:�
�
�[�7`������x�\O��,L;A��
+�S
Ω���m7$nKy�5�v��ݠ"&Х�߇�5�%i�
��i��|�q}�룤�`J���G}Z�Ϡ��
�uڸ�}2퓴�~Ew: ��?|����
E斶�
����_�z���W�ܣX�<�ZR�px&
�2�>sN�
�j�X
��]
�6
k���a�
*�v��0���ݕ�ȟ���Sﮨ��n��8�a��M�,�[>� P��3�\"��̒Z�
��?�k�Sny������.�]
�X��NI�
�
�K�<�b�>qK�|2�W�,����
���1����������bnn�����NY��UҰt����swaf<�֤����|v��o6�t|��6�=j��.���z�k1Ÿi�*;�>�;�5��q�.�!����F˦[P���Y��`�S�[�߬��w��)e�e|��DgY|��P���u���g��|X_���7d<���
�@1^�E��G7甽��	k6���#)���E
׭�/H�љd©b�<]�8��e
��Ҟ7���ݰ�������֘��D�&�M9��ȴ�36��ΈkS��Cـ��F����%�a�*�ݚ������`n�fs�w|�	�4��Jr�"�7n�t�ۘl/%�ϸۤM:t<ܫdc.Qs�'nM��
�KZ��q0
+�%@W�}�X�O{�rA�%�q��ʻ ���4����m<<t�gs!�����ͲR�fY��ۻ�o̞wc���ns�[��9i�ś�����]P�m/hz�ge��3��
�n�eV��L�/�J�#����#���W�L$N#�Ԉ�NI=�Qq��ơ�U��X��'†�?�$l�58�^_H��;R�����˹����<}�[5���Z%P�����K�x�y�/O?O��M�_ڕ	
���?{���ּ�:�w?��
N���������]|�4��5
+,(�I��1��7�<�y:d�0>`;�L/�t�3M,
x'p���a<`2¾@��{c,��SgF
|S�~ܧ�y�<~�ih
f��ܒ޼�j�������DO%`~-�3�a�����0���v\�yG?��[��7w?��S�5#n@���O����6�&�2h��S�oX���O�'.
��(�3���'�s�I�9�k
+x��{t��ì�߸
k!���%�f=�������P\v�F��9�

[��<��ڣ"lM.h��
'�Q���^��Kq�M�4�|6��=�
蓿�*���}:beJ�gȂ���[Mx�=Q������V���ļF��b�~�`{��t��6���ʼn�6�jn�k�*oI;�2�˷rޡ
1����Dwū���nMw�Ky�iu�Ɣ�� ���8xc',�O�@��])��+���>�@̣lY�M��/fF
���� <Zp:���a�����U�!k%�
��]
��[���nq#�S�a^�(�K���J��w�I˻O�h:�aܷ�`Gc�ᑨ���q�;`g���z�udzYY-
�x7�(
2���a(���
+
^H�F�����oYyǓ
�<�2���Ă����&��L�ygS!vi"�l�Nvi�R��γ�;��:s�� �C>Q��t@Ύ�{>	��4���*���j�_��w��fc�׳=U)���� �P��

]'���"�F��A�SA�,�����
kY<�;��,�x~˩aG]6��.�
�PxX�?0�
��¦�ݰN�	�x(.8
:>��ifi���^��
�8�*��;���;4�\h�F64v+�������F5����[҉9E�q+�d�1`N8/}��`�G
f�֜�/��p�0��J
q��V��y(n���}Fx���i���i�b����s�Jnl1��k�6�jmN�K�B�Cd����B������n�}��Wm9�ٜ	�T[�7p�I�
�|����~Fx��$�3�7 ��>1�Y��i�}�v&l4w�>�x~���~��׮�M��n�*�C�[�Ix
�-����9iӆ[ٵ�V��������� %�*vڧ��5R��צ��_M�N9���g����A���I��?�
Egkxp�kbq�3���*�ͳ'ܓ˷��rA�
R�wWU�ܲR��M�h��
����/d�&
��
�����Q��H�/jڴ	��0O��I�zV֐r^���\}���@<8�1��/,d0�����Y��	��;X��\20t

XX���e����=*^z�邤�Ŕ�!���.?@���ӱ�����ՁO�!%�Ͳ�b�a�?x1�aK-_x�^}e��6�Zv:���	�Zw������]�D�}�}X#���	��1z��x�'����3ҩ`��i�+X�S;���|zE
lA��Q�ˢь��`Y�i��ԝ	��'�ыS~��Y�-��ڊ�/R
&iܪ�.� ۪�(�����ĥaO*�!�2�b0﬚FӋC�qҭ�I���U0W�)�^	{�<�-M��{����Ꝯ�W��?��.�"bSsצ����с�܀2�P��wmx6�^���g�&�n�<��]3k}BҒtY��I��=���Q�e}y��]�gO�5�s�vt��v)�1� �9�,� lmק��9��٠N�9�-蜉�A��zQ�;|��_φ,v��s�h��G�+ᵀ���n��(?aNR��~���?�}����}
�Cf�c_�x�-�����qJ�4"t�
s�IrX��p* �E���I}�����.GT��#�
�&���v
G1N��
��Ϊ�aԦh���B>���$��[�
� �Xs��z�_����?U)2~'PKvV̗3O�WrO-�2˖��FwV��>��Ȭ��XH+ۘ�{<����|y�38����xa�,`r�kR�`xW�70�\O���'��ၫI�h?����'�z5a�m۾�F��9"������@{#�Uй�˲a�
�`�p���
��� ��}E\>银o[�G��Ǔ.i�%��_W-�߄�0Zi�o�}���l@#�e]�_Ҋ!~
֪3�����;�̳|�
�O؛F#†Y�-DP��̊k�&DǢs��`^��r��Fgx�����Svu�ָ���C�Ǜ��v�z`Xu��6v�&k��e��f�v�tj�7���ܨS��Ą�(!�Z>�R��綠ݨUR�p*�7��?��|�P||c�w$��F�E��
⺵)щ�io�.�г=�۠��#VI�ר�q��i���v��/^=5E�Fyl����Z [...]
+6�ո���c����j��!c��tp�+b�r�X�swVD�o�/���x�
9���e�lw�`�Y
�p����etzfx
��e��K1�j`�mڇ�R�A�9r.�5Cn�v��&����W�
�+�b����}���y<<�Y
�x@�N$mI�t�eP�ݟNF}��
����,M,���.YG*��a������c.�9�8t-
��p��)�F��K{$݄l
+��\H��	j$���vV/Mg_�>�=
����U���<���[\��$-�G�:�icA�O���gA� ���~�]A?��nMq>y~���Ճ�����<�Ů��Hjb3��Q�o[��O^��a�����g�4��p��.iKʡhK�/O'�gRY�Rv�f
�y=;�4�Sn�2aUw�feu��(�CT��Df�G��x6&9�7��^<
{���/n�
�Zy�b��c6љ�)�A�g~���7����m~®F�|�&o�Z��f���\���yq�愴:�0�� ͂~NفO8d͑)���q�G�)�ǸS\�V?ըra�*iWuoO���
��
��i��q�I�����'e��v�
��/i��L�MT��ٗ�og�ξ
�JH�#�uyh��|c�_V�\Xޗ�J�
�S[S��i�QGq��M2�iS��S>5'�5lY�?�/N�
�V�w"n�����6f�ƽ|�<��݀��q+:p���`o�
�"�tv٠ϡ�=����������ˤlx9� ;�Sr�!/��&��������O�N��\X)ȡ�2�g&8x��=�
^�,�	�,Ҷm��MC ��B�
2
d��F< iO���q��9	�J�O���
j,8�9ؒ+�E?��|��QF���m��kVUdzq�s�b�30�>#kx~��<
P
�ψwE�5�IS
� jUw�x���N��!ܪ��4�(���
�3��
Řf�ዃW�_2�4�M�<���0��]�}�����~��޲�)�!t����QK桠|\���
ښ�}�����_sʶ&��^��/�LpF�u�
�>Y����е�y�M��"S�C(g}�f����8��&����ֽ�궢���A���{
!�{OH!	���		!���C'!��-��s�{��C���a
}g֬����Yk�*pq?�ȹ�@]�ih�f)>�>_�6IM6��NԴl��ߏ�b����f���7��zmvC�m����"�]�������R�q��x��&\�R�S�X�)f���*%&��a��!�]j�gJطcY��39"��
>廖�e��v�^�*&�8
+�0�;W���P��՘�il����b��#/�e�KM��L�L���X�#	�
*�8�4M�|N4���Yl�ż��%�sįEb�}N��sq�x4���

��e
��<��U:®�v���&$�k�)�=%�m�>�F\�ʩsB�UM˺�e�~�e at OU�8��ك��| F�'0�V ��N��O���_::���0Q��@�9����'�Aj����E�2�ߋl��4��BML�T-L���}
+Rҙ��q�`C��e��3��
-��<I�:����4ظ�2�Ӕ��L�߀�����
+�z
+x��96�r�K��H��RN��$�:��ۿ9��@)��
:���,���]��EJ���x0�9��"�϶��?�,�%R��
̏u�l��c�f
�Յ���#��S�� .�ђo� |��e����"#���-
+r�~��5�	>SRr�z at X�����ؘ�����{��4=��Ng����
+��V��
�ǟ�yX����HFI2p�e
+�o��|�5�
+
j��y�]����j�O� ���) ���v��l�����^?��h�i
�ś'X�!J�Z3��z��4�
1�I1�c�x]M�#1.�BKϳ��1 Σ
#p��Qt�u�m#�2B�jW��|-��1���f��v�

ÿ���w�녺^�JC.��ClJl�Y΃۔<80V�6>f�{0��3�a�~ji���c�Z�s�HI'rr
+��ci鷣Q��q����G�/\�l}���׿癨35.�`����f1����� W���E?f�P 'd��˱��ȓ����U�q���e���M��p(A��k�^����G��Iɿ�_K,ԙ��ȷ�gJ���X?����r oK9��DKͲ�1q��E^f	�ѓ��qb�� :�,���k8H�Cb�2|�u�s4��?
��l�@���{
�a��OR���:���s�T�$�
n���#ń_j٥6���
�|���t�l��YG��{}şv��n��0��Qd��
�Ս�pRt8��Yi�x-5��m�"��	��Q�s�. �?�S�
|Ա��m����*�u	x�
 �"�x��5��_�c��S5� #�R[V������& [r_�4�:�Na��
���"
�~��,�|<�*2��B��߬6�_hY����͹/N�J�Z\���%�Z�$� �}�О�\ߙ��,F�[e�(�ܮ_�\��<n��3m@}
�)i�uD���_6:J\w�^�#���
��
9�X�
?�a�-��.��܎"���"���p	6:�Bˀ ܟs��f �f��㈯���k-�o�
���Ӣ��Xq[����]��{ݘ���O� !x��i�YƉ� W��}���-j��8>l���Fo�;�0����z�
�q0<0	�A��0.h��U��8��j�%���`Q�M�)5L0��4�R���{0�
�{B�@���$2�\�����zy0�
8%D�'H��Ib��p��e
�m���dp����/��{�����,pI�Z�
,p5�@<,RD�edpm��⏧��cp�s}��*3��%�����
R�f [...]
��6�"-�|$.�<C���};S��p���å���/ ϟΕ�,Z�`���Q�i���s���Ì(�a�>��q�u��/��['�)?���Z�s��Mi�q��u�#�i�1��p��w����x���k�K=V�ӍCE�{2_��%8���oC~�>�Hx0�Ov��@�

�W����\v�P�W�o圸��;[�0���i�d�
I����oCp�ź����َ[]%
Cİ����'#��c	=mw��ٍ�Yk,|i��{�ۖ�b�-�6
"}ך
+^�&��sM5�$adl���VjS�T&?X�JsX�Iu�����:.�Ãw{i��V軃��q�? ���y�d=Zm�s8�
+��G_�x�b�R��� g�v�J<� /�X���;�p���3H��H+0�Q~��09r��v�.��r]�smU�����"#���z2K���Q��!�mw ���B���4������].�
+T��K\���5I�Q�u-�-Eo��K?�ُ���v8�;��- at m������R/}{����(��q
iQ�&EY�u�
cϖg:L�
�'5���g���
���t�����01@}z�>�h
�X��|��xs{s {s���h��7L_i.zs<E��N�"O��k��~Q�G��U�>]��{)��: ��u��`��)�V)%i���c�1����vO�͸���}�	��C��t��C��L��$���>�ǝ�sE >s^�
݀�yr&�C��B�J7>�@LM=�UUŴ����W����'����JB��C_��z��Ź_���?�[3�ϧ�Q�*8�{�|N���:B��Y�XNM;��':.i���oGx���_�4f;��y�+�iں��9ޏ~[k��5/�m��æ��
��;
�y�oIv���}{��d�ゞX�1ٿ �i�����}\lHq\�Ox4]
�2�y#"�n]ޗ�AT�zw�;9'ᶄ�xSJO���g?���o��CnM
+�"��j����W;��
uY�g+�
����
+v��Ir�
?�y/1ٹ
v�0J��q� �qs�6���
uWs
�c��/�b��pas�ؠ�Nj��TY!�o�~ا�V��VKѻ���gs�,G}+曜{�RUl�G��>��y���݃��w���`>r^���W�1N�a���ކt7�Pc�c�0�(���P��� �#��lM��Le��vJ�Z����
�\m����@����P
+�;Q�7��q�����1R�r=�yZ�� c��ӈҞ�צ?[mJy(.�&�:�R#
��
8���e�\s����9� >x9Ɋ�3B����������]E�9�z���7X�ٙ�h��~��������
+��I�G�-7�]w���kM��:��@���Ug�����m�}9&F���~��?_n��� D
J�v�5-J��7��]i���4�z
���4_]�r����ܮ]%>*^ޛ��ǽAJ�bu��V7�o��I��qX�+|�ю�<-,xMM�t}��#�H)+鑘��4'��RM��6��YZ�1�M�ԧ����]�k(�hW�7z(�*Q��qR��qB���OL
�ko�(po4���:��\e�?�\�^o�[%;���qGߚ�Lߘ��~��{��
<���e9���
y��Řa_z`��=��;�_^�փΒ	�\�Z�</gH9���Ӟ��U�~�:��jSїK%�z�1,2v�q���������
+^/��<��LrX�J~t���n
�>���z�4�g*��
����%�۰�#���oNWd�$�)n�Z��/��)^��rNğRJ�-}#샢���O���U�-c�,힄
q]Ŏ�9'J�+�GޖP����y�a�Q!��
�c��0��p��^�����gS̔;������'#�,ǂ���M�r>�c"�Y/f+s��Wf>���	t׵���W6{�]yi���qN�1|��0Ж/ �k��/Լ�;Øo׺`�Wռ�6B“.B�; K	[]��[����P_��>��0���p���v��¿ :jS�����c��3�Z\��\�zw�;EY���8fegm�`�[�6ڡ����;=h�)a�Kb��Ô���	J�Nq{�2�a�>륄
uo�<ⱱ/�}�'�ۑ
��1v��șV [�yr�	�n��tk󇂕|�:��*���ʄ7���7vh�
�(ey�#Uy�CCɷ�A䷵���k���[�%�W�a�k�%�N�B�Y�+������Է續���V�y_�q��Z�qO[1q�� �,�f����|M��If½���?�^Wf
]		o [...]
+�]k�y8[r[+����[���_�HS��3��ЃAT�i���A_޻���b��M}{��S5
��]�ސ�zo ��W
s8�
+����D�.6A߱S�\o(�p:Up��d^8~�&��j]����s AW����'�]_탅�RW�r�!�y�!�QF�k��N\��$��X�C
)��l �Q?���<�p��,W'����ze�&�I+��.��M�M��~n�rs��骬�2^�+y9�e���v��s���m�Qc�ӟ�7&;��d9�[���z��5�7�Р?;aa�Wa��j
+^,V�<_o����Z��z����;��**
��L��k���ς�m
/���]�q���7'��B
�e���8��1j���A|� 5�n+��7	>�|č�b�?&���
�%~� e�
��R|�� �{�5�i�!�q�)��LU�����`���l�\U~�
�/5u���-�-�s�;
+��T�?�G�)�:l��{1"���q��Z�����@���p:�:W"B�$E_���4��@����$f�w���]�A��q
�x4%7�a�

t4NM������Fh����8:��.�J�;G[$%k
�.�l��o+]H��^l����8�H��X��D�
+=��&�3>0R�nl���g�K�%�����$ǝ����\ر��d����_�uz���ҝ~F�N?�w����vo	��Aښ�ϛ���nzʛnr�˃1R�J��,e�ܝb'ݛd�<
���
ce�/� C��>�
+|���c��������+��zK��ZS���. c�)��
�[~��N
+"�
���?���p{_Yp{����� ��"���c��*s�~-p�?�X�>f�&�q�1�E�MzD�~s��$��R3<DU���t���L`N�J��GbD�l}֫6t��N|���6AQ�
���%�D��0�J�w�>-5�;/6e��*���At�Jw��e��k����}2�?���/G@�]�-	8�6y�pw���Ԉ��d:�a"�\��q,!��=_��>S�5���1>l��֑�ژ�T��y,�'�ꅇ\�7ü��)��W[����
ZT/���1��\U�������:�;�~'�\��4�? ��L�sL̼�V��Be�S7󱌙�PJ�z�ق�2��J�[���5���y/t��
��`_,rZ�l+2d��8�T]��ņ���޻�#5�T?�	�d?��>�lCy�*2��Wg�3��S�[�۝��b��6�8�
1�Ҋ�U,�U�*��9 �*�����iJ�!�y��	6.�D��9S�S-Rz�B
*P)*�`��(�ڂ�#��Za�ݽ���S��f�S
����j@��n��{1Y?����:�T�O4Ka��ݩ�+nnvf�����?[_�zo�
��~��ܛbE��!|��C�8[��ڒ�>@L��?
g�{�)x�)-
��t��?��ۓ�T��x�����'�
�HY[�kUP�Ũ�Ŧ��[ݹ
�ž;}��Ҟ/u��0
�Հ?�{��{C��C [��,��(&LYU�&�fy 8,�)��)F�M�)��r��j
)����J{��BG�癎���q\����z�"��~���Hi�m
+�p�!�.�ČCI��8#��VWi蹆Ul��"�>���ӂt� ����r�������
!Íc�����t�鄉�F�A����7�}� ����ىK�ģ��
v�2]
c�ģqNљ��p���F�A�X���4��MC�ޫ�9.
��� ���9���������.����Vt�Mb\��>�v�u:]l��� ^���
@�]�d��6�7�0>��o��\��-��7z���!j����}��x{����p�m#F
���v!>#`�?s߮6d:
�R
b
��wAƋiA֋A�S:�D�o�`��`_Lc�8m3֯������Q���a�߱�Yp�
��<�K��ca��V�[g*8�Z�Z꛾
�ۉ�ַ�?YGY��az�7��Js���qr<��O����JN�c]U��F7)���3U9���s6�!�L74\�T����~SWd 5��hFyg���Z��YZ�����5e=������i��ds���oe���l�����.�h2��=�(.�T�<�"��O�
���8Ք�t�i/'���f����{H��.����U��E �W�?�W��.U"�V{�ە��'j~�]	+��N���ID��$%cs�-��W�D�4���Ƃ�ô�'S��7˭��V��_[�����71?�YA� ��;@�%�<��)��3V�3\�s$AG�H������f�i��IF�Z{��fw�����4N��{(E�/8�}���h���}%Qg:F�YJ�?����7�,=ŋ|2L
ytdsE=4d���0����D���h�q �3���*�x��k���V
��G�~�X��~�,�Z|���]|���l�����^�p��]=t:C��~��P��}���|��x$�$ ~4.f{���J{�TQ�}2Z�����c#�BK+��y��}
��\�܅C%5wg���p��g�=���p���il�MN�>��`�2V��+iwT�?߂�
�~��V;�=���k]�~�]�ö́����T��^���[��R�i���HR�`�.��v'��`t<E��&F͵�;Qr�bl�rK��(%��$'�Q7.�^\��nj�d
η	}K#{����𥖒o�a�6z���=i��m���,=�$%Yd|�m���;�H���y>A��-e'��,�y܅�.f�:�w�zuP�I9�����1r2�װ

q�d@�$�C%*�X+��*���<}>���{�`�K9.�X����C��!�
��h�$f��&j뒞,��z��D��
{����f�efUY��6�2W�n�m�*��}���r^�j��/�yX�hـN橫�^L�
�ST�i������Ԙ�ښ�ag�
�7��6OV��c�����/�C�$ g�V91���a��i�:���<��Q��<��`M
+d�`U	�%e�c���/{�E
�����rL�m�;L��0:�&�&���ѻ�_U��1z�
)
�u�/��\��L�Ь��[5l�V�GRJ�N7�c�1�m��mc��އ���Z.4I	i[��ϫ��O���H���z$ǧe�ģ��������oe��ZƏt5�2��&p} �ͪ��$�o�)��TL�m���@�'�{J?�w��
�~�ҙ�b�9�ïA�Ţ�f�G51�b���D+�۔|�m�5�2R�i�k}��6Bҳi6�u��b�o��m��{�ч��T���8�qq�@����)N�y�
�L�a'j
Ƭ`��䴃QB�a��?��l��������� ���	�V�q�W����U��nuc
���!j�tM�+U�c�k���DeG����B����Wk]P�\���.�g8����X�/���j3�LՄ1.�}$��j31����z����q���0�s{i�Ӿ�0K�Ԥ������ݬ�T#����8<�x��p�
�XV��~�
1�F�E>�-
��k��k� ./4�a���*΢�#-Z.�4Ł
Nr��:8Q�����A��F!_V��
��b�Z%��3uu�Z3�߶hY'*
��\�QJJ0�	�F%1�:�BX��
��V��
}0AK�@�cc�
+Ծ��8&tg�mw y�0�K>���蛡^����sm9Ӫ.C���c�U/�F��\U��B��P�K��]� �kjS�.u���N�a?�3�h�s-෗s�u{��nt�}������ �86�X�%�̔S���" �'r6t���ߕ��ޗ�����̲�x�o����eZ�u�#�W	#M�Q�q�
uS-����W�j
'�ڿŷH9��!F�~?3
�汛ð��
���,��Il���>�)��U6�/�v
�1��
��<��cMX}�(��Ljq��'�zH��zE��';� ׋Q	RD�a�s$'~_�s�:b���á�`'&
���M���?�
�
XE�)�I�%���*ڵ^�
Zpw
{��fE
�V�Q_7GЁk�/)
������+�Y������V귭Nv���,b���Y�vu ��`VHv7�gz8)�
�@
�.$��ĵ�
��DՈ���F
+����G����9S	�
M`������
�n�qv�FWy�l�}���V��o+O�V��;Dy���h��|��w5�

�y�Ch?�8=�&P�������"g��[�>�iO�
����f���2w����]	�h�n4����xIK@[G�����'Kj�yDT�ݏ�����jY�3L��r���r}�U'�͵z,������lU��+�H�Ն�W{=0��AD�e��u"e�MCB�B-��U�fm��F�q��d]E�3��Η������i!ek���;��:TrK���I��M�-�
Ƈ�t�|�M��/T<�Q�/nE���Ee�_��F���ן�D���ү�.���|�X�y�X�z6_)2+��G
+z�٬Px��.�9��ɒ���"����f?�s{�_�sh�g8��O�eEgSu"�Xf��b��
�k�ݜ♪"W�0!�p�gS2!'���c%"AY�T�	���E�h�*���J�s����x��|�� 9\�I���4
���R�B3�k�
�a�)��Jg���
+���f���F�Ё���܏>�V�Z��k5]�lҶ�i�y�Б��$��].�
/��e���j��s�=?g�z�յ
M��,�ż^��
endstream
endobj
133 0 obj
<</Length 65536>>stream
+xw��Ɲ/��6��}�TE
�k/��a;��/QA�����J��dxx��_��|���k ��~}u~x�������io��
+��s��2�鹚.���f�gY-�ä �r�
�܉/yPɺ��I�
��K��R���;/-�=.�7rz�o�_\@��o�6ó�7���*EH��V�QR���#�ݤ��!^�R7?i����KE�j�#
�@��SR�a"¯��\��F\��� �|�����woA��
A�o����nW:�Y�6:˒�b�4U�ޙ�z)�� ���kr�k�C�X��8��A|��1
+�m�|я)z�ͺ
�����1������7/��R#n�0
_i���n�N���mP�!�/em��]1��DW%�agJ��O�8ȗ�B�G���<[J��®a���~|w��'%��)�������co�f�s��
)aW������u �B[i��Z��L��� \{�Y΢�ȇ��/סaW�\�@�
�B�<��H
s�$$��s�}��c

n���N <{bJ�U�Ş��)f
=w���]-,|>[��"~��O�
��r��{�}
��:)1�Ozr�
���B]�]I��tz�&/��� 5ɢP���]1�`s ����CE͵��V�h�s
����R�6T��N"�#P+��y)7iq7�����x���p�}���.(?���	AQȏeaӿ69"�4>km �Kך��b�E?^��4� .�&�Ąc-z��"����aD^�
�(NzQ�
�WU^�-\L��|�ۢ��	V�c9?�~ ��Kϯ��hhM�q�];
����Y�{�0:��z�x�|�.���G�W��n��
���_�PWP^�וVx�=mE��V`�c�F��Ü$E� j�����w[ ͸��M�����
+�UgP��(�������(��k�����7��"��
��JuA��f�gmC��I.��t%��J'ZQ���Q��
+a7Q)�Wr��A)�_A~..�W���<y
+{�
��� zp��o ��ׁv�y;9��q�Mʆ8�v��X	��j���?Q��lţ��0�M�]fV굂 �+	��AY^_@��^��OA�O
A���xt�.���~�����/@����5�(ϝ)L�Q�I\�~�o4@�,�W	���j�[#��5#�2*�
+2�� E�� y<s }r|
��&���@��=�'���zx��lsч�IL��x�����މ���E�6Q�z�C+}X
��&�_+	��z��>��;>�{p���>���{�7o�n\���<����秿)E~gZ�b���6#���	@�@������u#�s3��;>2�j��7���#Ї�@�/^�"޾��>���{ ��O@�n��]�
�
�^�gw++�����ukDٗ�W�յ&��9�NW6"�raNUȌ{���OB�D���>>q �<w�zz������5^>|
�}����#2*�w1��EW��zk 
p6����ͯ<_U�e���ܜ�^r���n��x7�B}������F��������@M� �����0���N�p�F�^#�����
3N�F�N
+���7��҇t�Mz�:>#�$6�7��
W
߽z��ˇ�@ E}�v���}��|�� �v�},ج�c�尥��bUO]�H]�
������Ę+���+A� ��@��#�����W�����#P��OW��]�$�<�ĥ:Mp
?�
��I�Z�����U��	�.�;7��Oj�G���?�<�A��A�oށ^=t 9 ��
+p�� �@��'���=P��w DX�fx���z\�����$/���5L�
ک�4��*x��*
�/BV��O�ǧ ��<
�\ނ�>r=�� �
����#�
��(�� fv�u��Ơ(+4�X��!l�Jg�'������
+����G��|j�Ǣ��߂=\A_]�A	�
��Ϟ}�'��ᅢ�88�
�u���(���j���k���ǫ
��#og��5D
]��[h�
qp�z؄p�]pD���o_A�^^�O�G�g���]=�y�'�/.�����.(��ݕ���c�
w��Ur� (;Yp��y$��
�=AIPԗ��7�>נ�A�B���%���z`��7 
>��1�᭿@O�vx�
z��)���%(?$�wbJ��t=�oc��q i
�j�W{i1�=���nJp;��)*9�Z�7�O�
A�/]@N@�>����{�7 ��y���C��A�ϜA���Wk I���n�
�b�	k���8ӌ��=UI����nHE�Q���w��[���+��<����;� ݺ�;����>��
��e�oW����Q�A��l��an�X-�}���=^+
+�r];�g]�j�%6��42�6v���?X�7UۇX���L4��MU��@�3��V��6�x� ?e��
8T����=�Qh�Z$�Y����#9�߇���&ed�%&'�e��:ua1^���
�9a���sg�aPW����,�D-yy����GV�S�ա���;��"yh�r^�"1�OHx�u_7wл'��Z~r~���t��~֎!z�E+�̘=	��0U�?���.
���ԇ���>��D����q�j�,�89(��ۏ�W w:����
��s5�'�jzx�UHR�

�����A
1�+�I
Ģ�aδ�����:�L��@S�׎�54%��D碬��!�޿��y�"����^���ߺ��r
�wd�\{��v�Z
�(o�ߙ�C�AV�4��[������S�0VC�j`b_�%����S���y���Cн?��;���B~å�
;i���#5eFe�(g�
�	yg���k��+U�;j.Z;H�R����pi�[H�W��5;�>.3�nijڽ0�?|�Ey������&E]���w���'
Y�$k����Q��Z��T%� ��̴b<z����TyGyR-�K��3���FvD����;��z�~	����ZNB�CR|�ݬ���
p�}!���G��4b�N	��t�],W4���?�3i�d���jSYÚjg��RЏ�9D}����	�
�D'^������)(9��*6/���e��_�@�O�c��\�y�'�S���f{���1QOZ�cEϴ��DŽ�����zGj{���3�L?��2���
�\�ߗ�a��j�y�]u�P�d [...]
��m�����.ۙ�"��r�����
Ś�f�vd@��룉���+B�Y,��RȽV
楬�*}s��lV6�ؔM
6U��x�O<��NgE
�t%wc����E��
��NT�V���T��i���EGK���5v��>z���7� ��[�3��
)}�WuU�l��tSQ�0*X��
ۓ�26�Q_�br�߫
�>m}
�!%%iGxi��\���ʨѶ�
q{kN���m�����
+?kZ9������a����v�e�X*��su�G��������ź��@<�e�d�T��-oE|�w0‡��bq��9p���ꦄ6A��PmE@[y�Ǧ�j��n�Ud��S�,7����OV�ħk�ö������jO��_��� ����G���a��5�eqO��Pm���
>3�I�la >�G�wUvwb&�+�C��uY%�:+��kYT��3-�3��ԏ�#v���S�t`L+N�B�k��%��&�y�yg�����͞
k���A�
q���5q3�@�TeR
)�ØuU�Ý���_�}�u�6�B�T�|�NH�R�#���HE_e�d{E���.i���
h@�ƻx��fⲘ��2J�^"��
`�Yt"��� �ڃ��?�	��['9�됟�7t�����J�!�
�&(����/
�!wO��x�t9}_BI5H	1���#%�U#�6�Ŝ,T�
�y���l��l�Mr1��y�\]w��a��L඘�)!f^�}�Rt<]#�������f������})�PUVl�nl1M�	�J�@%�m�����u��s$�e���;䈍Az쮤�|8��5�݉:����9�L<�
+���2Ӕ}�����mSs�}V
kՖ��e��_�7�/<��dk�xGjѪ��5*�E&U}ž�W�)&Go�I�2z��%ɨ����i��U�#E��x�n�<����y��C�rl��0�͢�%�X��6O
�F��n��m;Zl���6�oO��n�;{�����az�ʨ������\��1/�}_r�w��]~�}
�#
���㑬�Uu ���C���#��ѡ��X��
=�r��Z�7>,�Ð��Wu�.�*�Jf����*G���׭n
9[�n6iI�ӥ���������.��Ux.��"�f���� -�B��#s��mR�!m������6�!T��!Z�`c�5B�����/�|�2J� �4~�X�r��ğL�C���Qt�y��s��cNT<�咐w<�%퍕��x�w�=�kH��G8�s�Of��FliCq𾲌|�֢:������p���@�0អ2��I����Y�{�T�#k��}�ɋEQ�需	�
lK�
�k����W�aY.�[����v�g���E��:��3��ir�EAJ�-��
.��s���T�2`Uv
ZU�}mK�m���"��
�)q�-%
�rr�lw�י���1j�q�o�fZ5�\���t�eÏ5��s���۔��-b;.��<�4
�/''�KI	�
+Z��%�M&����\�y:��oUW�������bo��g��~�桗�X���|�|��\}籶�۪ij=R�q����{!�{��=	=S^�����MS�L Ce
�}O��YR�q���Ԫ!A��j[�E̙n��I��
k+�O������2��]�3��ۓ"��E���*�]c��R��UdV�K�u@�q�Gj
+�1~�QV�����x�������с 
S/t�B��c����\Q	�n�T�.WZ���%���Σ��N���~_Ʉ��#5~<[N9_����[�k_��t��9�'A~��
�穅GJrʉ�9_.�Ulı}�MQ�����rh65-g��u��u(� O�j�lK5
{f�uUT���������fy��U��x����/��g
�M�Ս�
�՗�@m�O��)CYU�̝���`���zk�Y���&��se�������ދ����	�jNu]�#���zvdL�
�}�V�}��fs�*�&n����
����)6t�9�YW��p�+��MCH5+���L��RM��.c\�dT1��u�f95Ӥ &oK�����X���8_�]n�Kf�k{9)N���_+����q���Z���=1�g�=���y����f�p'�5m�K
��Zɨ���&��R���"/����v���^����t��/�����Y�} �\�� �o���]]���X��`��f%E
J�1;C���bo�$.�������ߗ+jOg8������#���eQS�m�LȎ�5P�k���l��٬�,����~����}��d��p�Vrx')�q��sNT~��cMS\(P����cV1�6�����cW�R�� ��R�P)���iG*l�Y��3H�bH�����%ef-��ŒSB��RÐ}��C9e������������
�ir�L;��j*�l�����5"ꑲ��H�,8��E���d������䍅� �3�g‹��Ɵ�|���}�Rt9�(���xZ�
܏冡#
�7Ƀ�u�"���ܨ���l��(��uԤ$$��'���}����t�3
���|m��
�n
>e{�3�\�f'�_�sI��`.�h�糌b�{>���y�X���*�8�B����s}��SS�i|o�� +	;]�B/V��
~Ł�
ٞ�g�/U6�u\
p/4�w3�)��'Z|��
>�d��7�Jv�r�<�����4�
�hT3��ԣib��<��|��	��~�ZȰ鄬�|��EF��
1k�;�y��yCS��b��M
����$�¾�
�t��K?� C���~B��6|W��8TP��y�c
��x���6�,>[��9ۨh�\�\��3����AB�UM/�?A�;�qOt"��
�z�X��C_;�sK�`�a[����նy�b�����:T2
�ѳ��3(�ճY��)j��MA�AQ���G8��#�i*j��xd��՚�R��l��q0N�
��y+���oc�_�*?u���3$�O��Gr��a,��XH;�Zt,̯���('&�$���z�%�
+��{����QQ�^Y�y��t,e��#���f	�w11�`�ٝ�� F�����AJ�URV�/��o��#7ɑ�	~�M�+�i8���g���|���לϕY��q0IIޑ"
2&P�Uէ�
�9Xfmu��lM����t�.	<�"��Ę��1tࡂY�$)+X'����:�
+�վ����2�
��F<�������
5
�Z�Y�I�?�H����r
�ӆ�[RQ�PU]q��8h��i0��l�SE�	7L�#�3
 �1�w��F	��r���;���f���>�2EJ�D�[�"���4DI��Յ���F��?{գ�O#X /h]�~��
�:],#�֪[w���1-��՝��;��U���ma��
!ok
�ҏ������O�y���5g�"���������f�ӟ�S"��
Qs�!L�g�QW���hh�?V���7U�W�y
�++�Zgk�Η��eԼ�΂���7�* �-1q�f��!d�bm򓩲��[���E&ުBE
�#�.L��Dem�d�':]�S������3 ��B�U�6�!
M3�)C�,�?���?W�e�:ZI75��B*��z��窝�Y�
)��2�N��`S/��mTv
���@�,5OYu5նi
�D[�8ױJLc�@�J@�i�����"NW����)-�&&%�tB]�@-Z$��AtH%�Ny��
��G2V��:`s��m}����@��E��)2xP��*M�[_;x�,(p
��
��H8a����Z�!�� '� 6�h���T�a�.�y�&��|UƓŪ�ơb�#	=Kӎ
+/�p�ՏIx$e�|�M�E�h��$*r�/�ARx:ˡY�
4�]
������'�ظs
&ΦFFn
�}7{a��*
�6��w�.|
1�r��s��C-*R�UCI?�"���g��.[��$]{i�z��X�*4�qa�����w&��\j�%�3,���_.��?��`_��p��>���eԴ�6��$e$��Mؓ��G��=_�ӭF�INζ��%f#�HBJ�:Φ`�ڿ	=���.�w�.U�������݇��r�
���~�V֜ �dղ�G��
 ˜���s-{(ǧ
L2M*&�r����5sתZ��s�%6-2�8���$� �|$%�[e�l�)ά`� �fV�
+ĸ��Ad��
��*��)9�����7H.��ZlZ6�HEL1L��>� ���?֞����9z�4������33��LI��>��i�{����T���{�]l���&��*EĚd����ܜ�.��ޫ�����Z���\�<���]�Y�Z�Td��nv���O��]
���Qh�K�+?3��N�t�[�U!3
��H�����*���:��� �����G�

- ۟�{?o
+z�Ⱦ
+��5^�R�W�ط�d�5|���E=��H�e
��Lg~6�����NC?�
�^��I|������v��
�j.�HN.��)U�y\�g��u�tL������EZ�v�m���_�T�O�$�&��o*|�3��Y�ym�{e�%U�D
�Ŝ
��u���*�.6e?��e�����, 晁'����]���N�sf��+�At�m�����P�r.����B ��rϣ�m���1v��ؐk߰�B��K�X��R�3[�l��D�
���������lLA>*��ܗb���s�
Ow�+��&�7��/7F���W��`�R�X`խ�"���ϖY��������$<
���1H�bSq0>��ϓ��k~@��L��7�+��?s	A�,�E�6G���ո�
�7�H�v�+�s�d�*���LF�˳L�k�_mL"R�,�)�/lR�y�C':��#w���r~�C]k�#�"��
0ˁ��ů�� [/ߙDD��*
����N���'j�,�U�'z.�g�<2j��Pu�}�6v}�<�8T��-
�j
>54v�RZOV�@�_�B}�S�u/B?��47�G�šw�X�[L+;�_�zj��&�2	��
G����;�T�O���R1������V�Wѡ'zA۱�uxg��=�����JK���V��	7��C]����a�k�l]O�7�k�;��#=w�G��5�l�*Ps,P�W��L�{��<���5}O���
���p+�~-�vjnhߓ�ҽ
+D��2ͳ�/��8�
!"Χ��O�z�O֛F��4ܞ
�a�G%�L�?m��b�K�2�P]�����U
��ʶV����-�K�L􁂐�^D$n
�<]���9~m���@#�Cuo-�?t��ƫ߻��9#-yO�s��0�L�w�o��ȹX��Y����4,vk
�;U��h���S�@
�?Z���L
>��4!��
~��Qr��V��&d��
R�䬲�q@�c�lc����Β����+��_{���o
�+
��ص1h8��Ol��X�_� 9c�\�>~ej+
>Z"�=�6Ƌ����_���_͝ŏ]sДc ߟ(H�Yd����e

�ť;��i�)B��("lg��
�_׋
+շ މ������w�9T�/�-"����&]��AB�f��Ӡ��
+r������ENq쩖����O����Uq����=q7̓�:E���L��0�eݫn�9�js�2x���Ks��oT��;�Bi;,�A?&���2�q[���4V��p�/k�YD������5-��;�Yfie;��D���-��<
�l���EG��hi��.�D�e}^��2r�!T
k�Շ
+|�!��\S��m�7,��w�d�4���A�Z��q.1&�1�N�Lb�wF`V�
+��}�h��
�s���;�sh~��d�Gw+��}%��D�o�4
+v95{�m
.E}o�Z�]�enU�\�/���c�៬S寗��3�(��k�}*T�k��W�L��À��B/�]hҎ��[��ŀ��V�ȣ:
�$�W�Jw,����!��+,汱wŷ���75t��
�>
�K54�]�H�!�)�'8e�|�
+�����;Ztx�
�K�M�O#>��J
κY�W�9O�׶W$؅�4]s�MsO�c�8t��ze���������
u�ohu.�
@~
��]Q}�S��
��g#�c�$���U9�	%'�l��,.y{����@�sck�Ý!P��$*f�������	
�;��7u�Yi.��k+}�ҘCӔs���)�k6'1�kC0�yl�E�{
��\]�y���$2��1��o[�[᳜"J��r�f� f|��9
yo�ʸ1�?g�y�6P�F�
+z�'d����]bz�z�[!&�gz�����~/"�]���%]�O������@>���2���o-�i.|�*�4t=�
+��"��5�ծ�k�#��<2h�e�:�&�
.����&���-rr
�ٜ/���c-�;����&��g*:�'��gH��嬢w�
��
��@ι<���]B)�����2u?�
�elϐ��>������e��:����
+�t���
Mi�l3��V�6k�����>����5x�Sz�֔{UIJ:�D��y�3�ީ�P�����_���OM�n
W�P�S.vW��IŠ�v�BF�t��5!��*��]�|�r�_��Z��7��u"�' i�[�9�@N���~��g^W2R~�F|�n��Ϳh�׬���X�=Bf�#�`i􉞎;��T�����|\b��j����Pa�j�!�V����<J:�P�$j��m��� ,q�D�x���2
r��4q`�9���n�q|m_De�1%'F޽̨wȨ�˂�-!~��s���,�k�^b��%��AOT��{�ir�m
+��Ґy�Мy+P
A�I��0�{��ӱ�òJ�u�������Cq�'C����_���*�tw�*�6�L8P1P볰
]w��9��P�r�-¤�pg����>���yB�4+��%nQ�g�^�7�KY�|��_��5
�Yiͻ+��a��>�44���񆞒 �`�+c_ի���w{ o
)���yl�UH��jh������SQ����?��
+�� ���%&�Y��TM3����OJ[�𨭑�P)��~(�'nч�F��W����in�3|��s��Ҩ%�Zב}��-)��?摯r������ M`���W:s�O4,ʙ�����"��9Kp;㠗�*:�뚠�X�"��>%
�K�й�Ð��������{�iZi�,���4�1C)q����9\�w��;��P4�wT}�a�W
} �r�%���pAے�xg
��@B
kX��^��U
6�L
+0�GN(ݛE&�'� _%����~�T�ү�3_�k
+
��?k���`g��u��5������٥3
 �L#�'����
/�	�ɒ���[������
��Uq��yJ�WƂz$�ʁ��y���9T���<1����'
+b�WWpfb0hy~#㧅}^��}*t��8����M�v|K ��)��
��7��^C���z���u�'����˹�ћs�ԓs߫��>X�Wm�@�<+��Í����Kn�?��
���W�ej�Z|���㜬��'j޻� 9fQ��#eA�Q�#9��.D�
!�=s،}	:
`�W�Y�[�`�%bɖ�Rh�J�U,�[�+�i�^58&�8�֥
��N�4
�������%~yԱ�Gx��	g
�����
+V�e5�"H3�K�W��i �p�
7t�?��D�4K��Eݘ���
���
���Pu�g
��5Q��2��pJ�.	v #
�j?����i۳n['�q_
M]gz>�%Xl��s��as�"�S%�t�<�u„��������,>kc��-�ߔ�s/�h�W���L�Ӥ��#u1k5����������Ǜ�>
�ECG
�0І1p��#��#����mv q�2Q��2zk�8\
��lb�4t�S���WR ':~Ӟ�i��<HJO>��]\�.b
�&4դ]�D?��<X��:�%%U�g�^��o������	�NJI�_�q�ڶ���>��9��D���g�#�b`�|JB�g	�~�$�zl�e��P�O-���Aޯu�>詎=�Kx�O~Vз������QQ�YT�O�/8TR�N�l�O���,�gYE s-�D��X�/Ɩ!��R�=R��$�h��*���u/K�G��.19p��v��cA����[eA���0�|M��
$qk�음���bma���X��Ѻ�3��CG+$������i� [...]
+x
�ױ���v���}@���P�� 7��/s���C��D�xm�_IƝ��
���g��
,��fQ�Qx��&J߇[��3A>��2��Nc���-��b���2�'fS����ҳ¥���2�|�ӵ��?VZ?�.����b�t
 �cs�G�BO��y�2���<^��:fA!���9X�m/��\��ߙ�V�J���v��qT�O]�a߶WF}K�x��%v�

#���k���=�M�.ҫ��\�\M��';h������r]��z�+�PY;#������~%���Ĥ����쒡� f�
,�ު{�=Z�vk�qO��qK�y;�ؤ�֪�yT�o{���#-�VՙyW�A�S4���=��t�ɀ��i�`��OO~��/���s��V8E�(�\i�G0�
+�i����jOL(���4�
"�<X���]�@L˹�Pv��6�}
�h
�1�®X�qU~�~k�:��_���Wr�4Xp�-����a�5|�ED-�W��NW������$����O%+��jG��<&uO¬�����\
+�&����ஊ�?Aޜ[$���b��O��]N�M^����6����o���g�?��%�ZX�m�赾;妡'�ʗ���}CלS.��E��3Ccߩ�I��c`���*��6~w,��s�2��:�ånl�/������c�|��ymn���C�]��qo�Gۙ'dz��j��8��ؒe�:dw���n_�}�
"+pG�U�pg�R�'a�-s�d�
:�2����`1.*m_K�hڇu]����Sc���������?y~`��� K*��9�ʭj`�Π�$��	yj�~���^[�-o�R���!�=����F��� �3Ū؞&��<�9Qn�(}~�!Vx�
�-���I�U>���Q0�bl�{	�
+�聆Pf�!�m���@���e6֫`!|*����@��S��.���*n�""l
��
1��K�3u0

�2r��yb�Eyc�cEG��\�v�;�
���_�Zג}�1
+[�-zjhϺk�,|zb�g�5آm!"vw�r��1��L��*�zl`}�^v,!3�C%�]���=9��5Ϭ9��	��}
�wAlN�_m�=�v�]����5�Z�@'�"�~��
+9^a��l⾒�A�!�e�F�_+���m
��d�mR ��Xâ~ѷ}
����fQ�[c�W.I`����FD�D��@�����Ef�o�qLb��i7�	I7�KL��8:S�Ϲ�X@��ydd�N�,�)�4
��9r�G�c9Ō��er�K
+O�
�ze�F�־	��%��3
lO��6'�����'Rf�]�84޿�L=^��$����䵁�7��;'Z*�H��l�C"��
+nO��v�=�
+A�qu�?u��L�8;�M>���Z�􉡡�HE�u��MmwU��;�e�or;
#��E$Ƴ�:|��:�R�6Ga�N}�9�J9PQa�U6����!����D��`�#f��,u��\�ʹ�Ď��ڑsw{��+���C�	RA���qh����̀�	�#
�_�q�|�����X�����>�����
������
jB�z
�q��u�)$Y'�Rj�Wߴ��VJ��`
�|�#fiLji����ä�k�S��}{������#-�Թ�ad�u�Y�6�V�H��)|�m_�� �B
���F��e�pO��F`����{�o
<�76�x����"���X��T�Yd��L��$l�aT��u��k����}����m
+�t��Xp�3K�7U��D%]�
%�p���D�
$�+�D:D/V�>5j���kͣ^-�v_C(����^5�ĽL��)��
�iYĤY��Gq��>D�k�]�ƃ��1�	x��0"bQP��W���(<ag
+�h
�}�G�l��c�C�Ϸ��>8�)�?�W��>J�J� 9��e�i�4P/RM��jK���l���)��8����၆�>�s9.6��W𧌕~i���{_��_�]9O�r2D�,|ڇ��|��GM����^;
�r6jg��g�0k䍐Ǜcج j�.3`�IXD������� ���ުw���/�C�W񷙈�H+b�Fr��[��
_|�+|r�6Q��]N���Pa�� }�-�������E�������Fm��nL���A
8��ѷ���ٔS%����-�Ԅ���|�ǧ ����n��W7p}Aˡ�A����b|�H�&߳K�
k����H��C4-�L��Zs�+������O�uow�Qqb~��!L�C5Qg:X{�C�:�#�� ��r�o���lh
:���gz.�8�Yb�>�}v%�Z3��4C-2�¢��g��)���E�
+VA��`Y!�����|�
�ry���[�/=Q7	��|�K�gY�c�v��q�E|��.]�yn���4�V��T�]�D�$�(�4
/�D�&
j�
����Y�=��D������Ɵ&���w�0�G>�&5��?�Q�w����
��׺+��驷����Ӽ�[�Ĵ{�~\�	���	DԎ�#�����?���r���M�G��
���'L:]c��̂�cS������SA*�7t��u{�r�X!�z��	~)��:��Z�.�c�ʿ�9ZiS�f8E�dM%O� �.�	n at W{T��_�\���;!o[*�
��Gf~�KA,�/����u�k,�߱.9��*ƥ�
A��W��$W9�����4}G���������
�\mܮ�1�)�s����ȇN9��*&:d�J��Mp�Y0���)gB5=���B`
tm#�KJ)�M��v��>l�A�mNԧXX5�fx<�(���pe��(�ЗtUەtsm�2\�Y
��Y�ѽ ��k�ݰ>�J[�=w,�����S#s���qI
^
+i/����3Q���i�b�
#���C�l�Z���y�T�W3�r_KZ���(E
�z��;Yk�=5�͜���YL�������hh������@��@}w���.�{�Dc�V*|��c��r���Wnѓ�yA�v׼=g��d[f	�El�OM,�H�':����<�_m����0�6�)�e��
,�?���,�k�K�]d�ms���~f��Uq����9!:��w�Wk
�G����iZS/����oM "L�uﬓuQ��
�k��Q
+�r�-E&�a����(ys�%A�e�TU�g#��P� {Rx➤6�#��
��!�6����J���ɬe �$�� ?{�<��rs�K��za#�
���Kr^��~d��֊���vt��1�����`}� 2��<=��{�P�\�V�����K�fP䞔Gt+i�GZ�P�)�i��]�3�jZ�{�����VyM� /;f���
���cX�0䥾�򩮧:�<���G]�3�t�0��#��~�%f�C{������QB�%1/��!��

�l�@�S�p���@
�
�_����*�7�Ȏ%&�)i����Dgk�6��Z������1����������KT�s��9Y�n/��6
+�rH�U�FN�E�)5�#R�����8�Ya�=ƱD�t �sd�y�͝{�͍)�̫l�
i��t
�
9�~}���&d�O�2-s�
}�9��O-���r£@�XEu��c�w�����\�4
�� _�N

M{2\ޞ
�i�����i�ҷ.)*�@��5�3
�ø�{*.���E��`&�_GG�m~mC뱦��W�Q>9�ԧnl��Y��'!��y�ߛ�%{�I9�b�s���̹�i.�g�#�w@�~
Ǥ\Xj,x0KϺ3�J�4OL�l�({l�ť.wԾ0��S�J>�.����)G��1����.�TX��>^�;�N�5e��.�Aږ��9���k�|�W���֒w�,�򮒋B$�?;gh+��,b��T�[�ΰ��Ĭ
�\n��CJ	;��]�rg��%kʽ��Xpo���@]�¿̈́�S
�tw��G���
+��斉����H�g��Ձ�x�����i[@��:���
+)�v1
��^�^ ���,2輠��o����;�৶ix� 2��!X쥍>l�s�S�1
~3�̺��Td�����߭��������X�\@gy�
�M;[��
܁�p ���QR��Z�V�

��1Kٚ�x��~��Q+���.x�=e
4�2�*1uօQq{��.��n�9	׬c��C5%�)e���>��
�Z���,��������l�������"T�5�~G}�ͳ���Cc��!`ˁ~�[�!�ih�[�����T��im
�M�
�k�"B�
x��t�i
�+�� �_�%U��#s��־����0���f�
+��T,Ğ�s�{�w�9�-!�г̡Z$�򥦚����k���[��?���?W:Kc��y#�OW�
��#
u�t�*�vh�P|*t�}:�G�YG�Ʈm�MB��c���H��\j��!N�9|�� wm���[Ӥ�Cc���Ч��z���
�ol�W3�̀^�\��-4������V�Z4C��}��%��a�[CUOֻK��9�d�����[�O.�CPy�>�Jڙ�E��AA��'�#��-����9\*���s��>B�5��{g���I�R[��>1Z�:
�4�NX'���J�s���^��EFɣYr�]`�
crc~!��U�
NڛA�����1�S6�\
E�9?���*$��^�
+�
ռm�M�`�绅���Xz��g�+�v�Uo�s��~%
|�a�]R|���T��o��_3���9VS�桂'���ϷfЩ��+S��G[C�����W����J~��Ĉ����~��<�f��}[�.~�.��j�)
Y�[4���\��9D�,�"4}g�
зH�Bм�DC���J��(|K�j�G{�n41�^-��&�'�ዩ��	>���=2X����K�R�
&q}j#g ��o�*���5#�ث���
�=O�J>Z����
�2�P0���8�� 'F2�xo�[$j)x6�L}z��4�qI��#�P�bTٞg�Is�Q�Bf��A|J��D}��46�4��2#���P�V)ws�ǖi��ŭկg�E�]���JcK`o#'˝rJ��O��+��xe7"ܩl`���Jg�ew�*�~�
�y{��w�6�@�(��&_�
���lsa��*�z��1�
�

�l��0�le�OEG
jy\�(,CDϺ����I�s`�6���⠒Qo�"���2 at .%�#��
�rڎ�=�_7���j
+�g��݁:aK�<M?�:��O�
+�9O+�o���>lv�����Yi�}<H+�
+�
��!�u� kȾ!ee\4�Um�V>s����*F���OT�’�Ro�`���_
չ�$����������ck��7�P��]}y��.�@F)ߛ�$XLjI�
�;mk��Ej�
9�:�6A*0t@^i��nX����#U����؄����,3��k�!҆҇�
�<��2Vy���xe��
|�BE�i��=	"�6	�+pE�t�_:��낮3-����Q��L}��,&�
{CH+x�1��1�T/7d]]�&]��wA���&�IwV۪C��Yw�_���FoUԁ$�a���iX�Z?$dw��C\��:[�ڽH-_��Xb��<�XGD���crf"ן�H0���\���l`s�

'�澀���T�_�+r��D{
+�8)�6G`McؼQZf��9��u�=I�~6I�y 觤
h���Qd��,:��H'�ȸ��H��:0��:���J��`5��a��Q\ʾ�A���dZ�AH���4d=��y{ %
(ȕ����nL�k�R�ZDg��^�:����zf�F8d��=9
�Q����
+�����N�#*:�����`�rA���_�6���W���	1I��Ն_j��!�������m�n	bc

K
�K��
hH`W�
��P�򍣐�
euC�O{+<�U��X��j��ò)�5V9
l[�|��s��2�'
�=
+�4J@}Y�4��������52ʣ�g� Zxg�>I�Y�ft��1Ϫ؝$$;j���~�M���.��Yd��=!�bs�1OM��6Z�aS=
�do�ܠ��;����cLj���S4���-��
�׏V���Cv+yd���(lDǴV�\���V
.Ҫ׻+��
��5v�<Q�
+.���
��O��4��Ŏڸ�^9�6PW�%�Ǜ�K�N�R���.*�-Bx�(�2:/"��
9���ۭb��Q����
+[b
�z%oɼ�=^
����� b_i.I�jh<4���Xr ��z0��	X�jO�3Y
�q*��.��
�n{��.�[S/:bk���ī��u����7�ID�JKI��)��GO�_"T�Kq9�*bi��
0�O����궒`�8p
��׾��6O�^�׻���c��[4Z���G�F
)�G��&构Z��a�*��iʺ�d�ޗ�ʤ]��Ġ�%��(s?2��Q�l���9`ӯ�ٳD{�lĺ�&Q�K�e�$Y|P�����
���fC�w��9y=J�}K}v�
�Ϧ�A�F���c�c<�2Y�m�~0
+�a���������W+�;��G\	�{��CN>Ǿ��w(���Z�W����9ijU��u6���?|{�䙪5����.l���p�S{I�wm�a�:+�.�uWE�e4��$2o�� H�ʽb��y,�%F��IP{RbH�k4򡑊�_eѬJ|���i����f��p��׵��;�|���
�<�=[%�����nh�e�2����s���n)"�6~�5V�ܿ�.���?�/�\
�ڽ9^�m���=��Y�ޘA'��ӓ~u�U��
��;���4_s/��F+?����z�
{��
ս���K� ����3�qn-�7p�_̀-[�5���Y��Ȩ<��돤|�� 6v�m��[j��b�~U�r�T
+
+�8y���[k�$��R�k,bT�u
����)&���l��2���`rA�%M{Yڱ�m�!!�n�B�w�����H�/;T�
�D�"m'���(��X����d�R��D,ޙD}�C��!v���Q��,t'��Y�\ro
+}���ݿ�`Q?N�/R��j;����.�(�޿��;�b ^��*YW'�a?i��h{�/o�V�=X�C�+ͭ�NX��:�3`/�����V�?[D��Ut�OO��T=���J�x{nw�=]a�e��W�;Z'feK�I�K��?Ku�� ]sU�s���
�
�t��㑐��e$���rq{
{��� -�,��\
+l�WE��bl�=P1`�Zig�YjؗS�5T��8��ZPxG�M��
�xy
k{�6�Z����
�
_�~�X��3`�{Rh�S�u,�F�+p��Ҡ�v@��aR��#uS�O���N�'�/�˜3�uC����_T-��-��Y
�؏L�>�L�y�����
+haX�O]51�[���/q�,�KBb
]�86��]�>��ݙ�D�4�Z��k��
5��E� ��?+�mk��0�ǫ-C������6��
���}�(�Tu�E�T��o�"�
���$�:Z
�;\
��_��@�Fm��XX�r���`k
����")��)D��B��E؏?�2�[��/uC�/���u�E��O�S�s�q˂��� �0��GZ��H�.=Y�pNM��L±���W?T�(~��@�w�S
um�'����
,Ћޚ���՟~k(��y�|a��oo�>ʳ�+�L�2vg�){2ģl���$�CT�ԐqE�J���S��9�J�Xx�'n9�֯j`
,s�
1*�%��s
�
�Ŝ�لC�d�#(9���a��do�{���Œ�ꉶ
�1�
ۙf�(+�/�ro��r���Ty(H�P�b��6a�
� J��	N䜣����.
��Z!o�� a{���c5
v83 g���~^��=5�1�ר�*�DK;���N,S��B(�?a3_
h9�&}��2h����"=�wf޳s�Ļ�L"�����'������7L��=	�Bӕw�vAHxyQ�
���`�;�"�X�È%�ϳ���{���}�aS�<��6Jߚ�T�N��t�8#��.+�#���
�<�
k���7���(xY�V [...]
�Ǖ��>�/a�<r<du��X��\@,R�r��B�o/y�O����P �
Bƞ���f���=�ݹ1X�U-���񻊖��z+���K���疿�v
+����x}��p�s?��妼`�HA��<����ۦ �s,��
z�g�����{
�B�o��Į|e�{�Q��
'/�_چ�wJ68HBͽ��f��6g?�q�o�QC/��d?�ՎyF�e���5
�
.y�*y�=���)���*Qi>
|��S�"B�g
�t����e�t���'F����u.	>�
hZ�5�]KM,�4%��
y!��>GN9�Ӎ�yx,��������u/mBf�j{��I��%!�w�ޟ7�V��ރ��
�B�c��B�ec1�>ū���>��q�|�.`V)�P
+hm4ڣ��
hi�C=h���|��Pa�~)o*�=��=�h
uJ��;��Q[��O�C����"�FP�ĽH*m�eݪ�q~��oSJe
IY1����S懣e�hE�`[��`��^����j��5@����W�2v�Qp�/+���w��ܰK���{
�է"B�-9���Q�q�m+~���#�_I��.0�Y��TE?=R�pmr[O�$�e����p�]���ә���)��f�9�
��
������TjbR�����7���o	�i��?#S����]�����ɚxco�{UK�D�/��W��Q�:���{d�e���dz�u�t�S��ر�A�$�絉��ЗͦI�"��ԙu�F#
�s�O��$���y�
?1`�V	,�.��vg�[C��r^�'��{��y
'��]Z�g_�!�^l�I<�J
�v�Xd�
i,{�%���5�~�$F��H���qt�o[��0yOٓh��+͠��J�h�
ٝ�Z�&ڤ\ܾ�C��Y��!X���ws����F��8*V�T|s�������,6��Z:������uE�+��o(���U�3P
�G$[�a�����
��f�GHL?��
�
Yk͸y<��[� �
cu�� �,����hM��B�G�\}�K���cR|rF�o����Hy�z�u�[�i+�?���a
��<��
+n�U]k�] �}�t����	�W���h���L�"�k8���{A���~�5A��3�Z�Yp��O�v<��zc���ǡ�*B�O��Z�)Ŧx�}
���݆�/�6��	ۙ"�-����灚�$�0,Ծ��uJ�
�-4	��!9�͏�̐�`��W�@��>h�}�G�]�B�����v��*��@åZg��2Aѓ�ֲ'�^�k���;[k=�q�
��!�VX�;BB�m�V�-bU�
 o���B�r���,j
+���@���q��K��h���Ӵ\��?v�_
�H��&&�)A&
�0':2�HKG��,�u�V��P�lu��oK���*�R��v��֩�w�I�k 
��1a�����~[�)ޓ�r���e�?4��j����+��+Q�Gz6}O��/
+��[E��S�եD; ��ET�MB*�(	U_�CN5�;L/|Yq��#��t�q���
��.��߬��<��ߚ��U�����Ĵ%�z_R
�*ٜ�����K��Kf�E�욮���y
.���M���ym�X�@�zh�[�j�;���!D���{�<\�Z$���1I����m��.�at
|�����s���U	��e�>O-X�{;�K�����w�ИE��K���ˡO������.H�矫��W�m9A�Ƭ���s�F�.-��n������S
v"'T�;K��8�7U�O��C�~�W��_s����y���_\�G������5��F_���2���,��oL����M��p�1z�ɿ/����A�^Z �\�
 ��.��RcYďԴ7ߩ�J���'��!�~l-�𫘒|i����m
o��J�
+K#��I5�e>m_N*�n�W�̴��En�@C
�3{� �����s�� �s�:�<2B�e
�=
+�؝��r/��K,�i�6Iʼ�>��Q4#��������'[�E!��r�GjR
2tF��ә����0�[3�\���%���T��uv㑞Iv.a��*R�
�[�<��2G(�Βr�ư�[��}��xY��qp�yf�e���3�To
�&�����P2o�c.�ãl3��"
�lҭbc<�F���FtH� ���1\��-'Uz�,�!���d�_����<����9�Q�rn��	L�������
1:�H�"'Q	����=)�xw��V`s�rX��d]�U���)�p��P�#q��fz�d�]^�ٮ`��
GF&�"!��J���r�MD.<�n�ukش=����*�ll����2�ul�W�gm	)�@��9z�Nz����a�S�j�>U4��KXE�4�_]��؜�'�Q�+�uA澆µ����>j��8>��UrOךw}{���_�DxU�ʭh��$<�d�����а��gx�Y(����]a|ߧm�����Z�}�V�5�MX�|&ޜ$e_�ǖ]�$��Ͼ'f���}7��� [...]
+�m��z���PxK�λN�x�}a���=����Ww��b�O���觧ߘځy�(�=T�Xۖu[H�:�X��Q��sΙ���it�$)�����_I�
(�(�
�`��;T�XL����Ub���ޘF�r�à�ն���~x���88v��z���_[��tu;6C�Q�h��F/0n�(62��Vj��2h�z��Q^����;�� �
��U2�DG }^e�l��
�a�lO�S��4�s�*$D_���o�׆ZƠ�;#�x�Ljw�Sj����EM��IV��89kwhل�!t�e
+��Y�6Gp�=�������zn��$4�%�NǡxW(`�|]Ԟ�R���6F�1��� ��ۦpY;CU/�͉w�S�av&e}��0I�]L�ߘ@F�u4��u���q�k��(�,4�)A�I�-��_��݇:����¯!#�R|�_�a���#-
��c-�Ģ-�}��r?�M_WY���+#�g�)��L}�P������P�M��j���
�dz�6���w&@/�G���=�A�Nȓ�^������K��N3�7��*�,�uo
��L��h��|��~u��]�O�e���
���$��e�x�m<pmao� ��	N�b{��aby�7{���: ��˘��79+����?����.p�>�Z�o-BB�MD-ٜ�E
�:P
+���p��[� ��I�id�KD-v�6 at J�
�c�͵/��})
��C�?_�~3�O�=C+����Fx�`D֧s����	񓔢�����PS#��Kx�Olܛ�qa?7��_
DU�DeƝ�D�'��`��e��,1��aT�Oc���
+~�c�
�H�_�L|�����G_
ܖ-�c�	��{o�ȸ"e$\�C�'ȹ���痻@9G+������*^������A/�5���yc��I+�t�<��o���`�
&�:V�?�qϖ��F�m�x򃔖t�	p!?��qBZ��2����d|Y%���\��6y����$.���h��AR��ԧ�s���
Ԝg;���}	��:��� ����;T��'�4�Ȍ�qR!�~�����=��g��kb�0q7H���9��{j
��\�~���q�>-h0�W�a8�4����`W�J��#��͕1���09'���P�S�"��*B��$�#�C�;B��C-��.B��B��: /w'aq�|�O�"��
���

�D�_x�cRN�L�#K�u���y��?Y�0����
~�_[�^��P���m����r$'Ulּ[�o�ֆl
׿���p�#A���̝IZ��R#�>é�L���
�7�]7wGP��c���N�{s6�%�MC5����-�W�����YD�GN��*y,���I7���FG��
���
�[��
<����q��{ s�J��
��{�iz��81}�������3�O\�S	��m�ӊ
�m
�ϊ���Q�����]97�ǪB�2R�s�Yc
�����Y�c
_f��ׇa�=�/�'�1��U>�ilؙ�;$<�G.`8DtЎ�U����K�1�N�۵1z�f��6� {,$�ݟ!"^����.l�Z�������U�p]zyYPy�Zt�����$"�B`݌����9Z�Ėo�ۨ�>\t,傄U���>Y��0R�6�i\�Z �o����
}�_Z�ֶ�3ɔ$�̤Oz1=1FcKb��wT��"�#EA��n��{Ob2g�s�y���>��!l�׺
+��Z,�LT#�/��b�WnZ�b���[r/)`q?u�}�Y���۸�:̯�5�������!"�ǫ:�'K��Q��fT�ϴ��':�?����B������X%v
�?��������+V򹖊�?��%a���8H��3�찓�G���A2�\��o�؇������ �ɉIq�s
�(�6��OJ֛�A:l��A�7/�jO���9�O�q�fz��I�/��rr��s���m��y4I#�����6xꐤ<TCH;3��d`�b�d���㴢�h�\��(
]�/{:�W�Y��'~�������[CM�ܰ�蔗�}-U��pY��<��(��7H�oyP�����,P�G��fB��g�̗�lD��d���t��߫B���]_G�e���
7����DM�}�0 K��F/���N\����Ѧ�+6}��jX�0��M�m��M;�MD��ׇ������?���S
5��f��^�t��:��I��<H�|
���
�� 7g������m|ꂳ�u\+�_rtv<涅��c�d
�[NdƎ
���l�N:x��������&�Uc�i;1��D[v螇K]�q����;nrՖ���[���6Ak��4.����me�����mOS�hO��u�i�<���󀾩��ҡ�G�6�>m�r��.v�H3*x���`�lS`K.z�p��Tq*֬����R�t7>
�I��R~S�ӯ���ϋp�5�oe3䢩~bj�L.\r2�M쪠�Q�;�!��Z��H�:�

KVv�V�7�@OYsVj颍^�7r����Y�Ɗ�V���E-�p�@)���'�z0���{.�Ѫ�9".h �^u0����o�zI��Jf�POs���9kRE�8��pG,��9�E�,�
+V,�U���5?��U�zE]��h���
�(�3�h�Ԓ��)i�{�e��LT�Q�~/�O�d�Ĭ��E����~I��Ʒ��q>y�N���Q��P)�fl���w|�|Ǎ̚UU<��?����7��G�9�F>,\M*}�f��M�KoL���R�{��[�����E=�h�,Du�rn���o
U|�ݜ�n����3:D�.�cv<�`?,���4(��-��N�������@ �����<
����yr��ó+�C���
ͽ��SM|�-�
{z��Y�ѧ�t�P&j�ƨ>��� ���c?e�ݲs�
/��cjI�蚵�b�C�g�-�aq�&lƂ�X�`�V�m��^�l����)���F%�1ts�u�a^
���g˚�W�FDҬ�Y�G/��֘|~��><؇�8�Y�tZV�h����2��fV̈́����m�m
s��ܤ�U�pюN�ꯋX5Ó���U7&oڈN�2�Ҵ|�KeSڕ}�z�LoX���A
����!>c\G;Zj��X�/���/�\����{nJՊ���h �,hiE�V�X7�͌�����ǁ����[�%�����
����.�
'�F�-{d�_�
1�{�L즓��a��9
+��IY��E�
i���Z�G�
���!
+�0 at A
M�����
'&go�X�g¬�nY���aGgN+j_��KR�.�w<,�q��q檗Ϛ6p����E
�6h��W�4�� z4�a�4Ӄn����mk��9�r�ǣ�ڨ��V|β
�����my�I�V��a!4b���,e3rb򼖜3�!��ɟ���U��9��x��o��6j�$e-�9��UL�pIs:|���p����^���Gj8>��$��F��e=��Θ��
:d�Àyؠ� /-�pūf\ަ�T�l#�M9�~Rj�ƪ_�
+�;�־�\�%���q��,�km��eLӁ�
+j�
+L�KZ�xZ��}?�n��=�n[�7-�5+�jF�
+��%H
������vm
7��xnge���Ɵ�a��l�	`g���Q9o�a���2�%+V.tAϬ�S��ݘ��
�v^O.
S1r�{i�3:F��0�Z��u��U3���͡A��E�9��	sū�ԍ�����vȬ�[=Ҋ�]T�27��u�qXE�㊯r�R~�$�.Hy���%��To��U�l�. ,�[9kC��U
�lg֯���7�d�U�ٱYˆ��%2}e��0�!d2��p�'7M��-;�fe�n�h��
J���Q����=����es����z���������!n�˄/�	��=��y
�b�ȅxE����c�����_��WE,�i
j�Hoc�H7$ao��[w�����W~Y���w���)��$�ƈ�{�.
�Y�	5���T���t��0� oy�Y[���m�`�X��%U�� ϗ
���Qdχ+�rJ���L
�l��T4�
�Zw�v&�]��fƒ���
��B�_ ~o9p�Y%�Kj弙׸>(�V6f��*�W\dȊ��\�� ˶��5'�~��':���bT⦻U42+fh9�z錁R:kb�fm"���C8e���E�&eO��'��r �~�.��%�tw��8
o��
4
���8͈��<��e�W��i'��cb6Fٴ
id���)й+
>y�B*� tÊ�^�A�:dsTԳ>֮^�杌��Q�lo�߱5J��xHU#}ď�
+b����U_S�_3��f�mGӭ��'��Q�h�xȐ�P6�&��eA� ��K�&��%:}N
�
�@�Ƥ��*䇝A>w�)`��vn��36I˒�]��SZN����ׁ|=��',YX
��6���K�5�L�
���9)���ҜRH��^x�ۈ@��k�Y�JU˞�����0�m����&�U�6F�^����t�B����f\E-����.l���)af X+�拿����׼
ܔ�)kR�K\L������ie/���U��f��ƙ��ARݐ�铱f�B�&��H#m�� �Б>y��A�
2�ʃI�hc�	�
jm�
�4

�'
”�Z ���ڨUݫ)�[-Zy�A5_M)�8� �������Xo�+O8���ݔ�m ��zZ���R�d�B�ϞMRч�\����
Z�@���+�N��S�5m`�
Ҳ�K9eP�>(��4~�7bS���-�jk*j� 騉�S�ޛ�ս۴:�Z� ^�
+���Պ���
+p��r'��9
�hg��r�o�/�H�HE��?�FR��P�pu��\f�'���E'�h�5/����-X_�g�V���y�9;7nn�
��� P�f�zX'�
"�2P�A=.kш���1P�#|κ�K�j���t8�����1~��Tk�֬Ȱ3+�ߝ��V}4䜍
+hH9
��,&'7�g\�]ٶ���c�Vj�� 
�2��]���Abc��9�l�
WՆ�� �m�TnxY��	^۷�V�q^���[v�P�~�s��l��K���\�qw��-��}[c��y1k#�-z(5��
⼝X�dixx|��/�}t��
����PR�'5�Zg/?_P_rf�
��7�gm{Y�U
�����5@�l�0����6��Uʀ&_)��vr�L�
��;�R㒛O���
G�l���2�Tp�
ηV�=X�2�#��f���ǟ	ϛ�Փ*!xT�R��${۪��ȴE
�hb֬8x�	�j\�Eն�Zj���?c�rf�m�3�aH���V�kg
�f�A�p�ʱ�u~�(e.�{AKsJ��Z�T��#��
2� �o�v��ܬƠ��3���l��u�>J͖�T�dg�4ԜY3�h�&��QQ��M+�f��Ƭ{9�u��`�MhHYc�6�r
����~}{��\t5�x��u��5hl!��9ɦNQ��@t�!����+����-�V,��-����ʻ���@�l{��kc�K]v5c�l̚%+�`ΈHX=�
巸��q)<z���
V���t���Z�=a f̝�9so�����*/�<��6&Ī
 �wg�,�3���Q
�ْI�|c�Oߛ� ��M�9��3n�]��o�~��#1�:+�[;S��WwG����b��Y���m�v�w��ޝ	~�� 
��g�'�;�R�n�ó5��͈�9&i�C��k<��dw5!�jJ]zxy��Yp��F
fkL(ݛ�8�&�L+#"�� �?c!�;��呶�-����O�I��&���h�O�펋6Rˤ��=g��m�����
?����c|�\�=E#
γ�WGĵ!>{g�E�;&h�'6���o�x�����⭝fT�<]Ei~���gUr����fm���v����Sj��7�:�[
+�|�� �|8֮���+>
yDK�u*�َ~9��= �
��I�[�u��xĭ�^r�ī(�+l�,�;U���b�����u��N���[���яi�p��n��-w���Fu����V�*˱w�0C����g�YY�fm���L'֑
�J��:@��\�'�p������
��S\���H�S�U8� W����ٚ;kf�M鱟,��u�����V���2�[�ħ�݌� �4�O��[��
v�%`�D��3mf���.T��ds��
-z�[����!������I���
�u��m�΂��9>)1e��^�h]���/#�z�Y3jb�O�Yr�s�f�^�R	��
��'�`�� ^?s��(�
�ՙ�X�H�o��(�Ȼ ���j�\˴tX�N+����Q�h~���D�Y�iK�f켏O�4삛^�>�@�^b��D,x������^��&�{��n�<Q�SF3Ȳ���<Dp�"����r����jZ/�.9���Az�E�ܙ�K����'��� ��2�%.��w�b��Љ3�%�־.�C�Y3a�d�[e"����U�2�)��G�|L�D���)+.ys�K���
ޝ�m��{ɗY^�a����*G����묠ow��Y�ssގ�	Kw����2aj%,���z��K�ޙ`q\��)�h�%n������<�K��L
+�l���!%\o���'�ʞ�U�*�1����@@I�A@��Ԫ���*CB�ʲ�������AC+zm��;��U��z�&��Q�0��q�T2����4m�Eh���j���B�LӶK{��T��
���^���5_@���*im�k�
��pGߌED�*8yvy7D�m@�enlo�+d��I��-
G�D8� d�3(M��|�p>���$�OO�����Cfd�YZ}O���pI�a�B��0�xk_�71�����n�>^BUGu�z�je�*mGg�O!�͘�1Ӏ���[�䶽WEυ��G���_�hx´\�]�I[7�;�"�cШ���kVD��X�|ƫ�p�5l�T��/ĩ��2�J�x̨LZz�#�����XZu�y9����.�m�QnX���N��IšT��Zј

;�σx4|�F�r
�
ݭ��n�Q�S��a,�HFk8œ�z�C
I�,r�M���;��;iI��2�W+s�OX�[cGW�Ϥ�M::x��n[p�*���
�Q��TC�	�η��i�l>M�ç���M�'����rљ�L�Y9��?�
	�s�8��<�����`WH��-R��CD_q53�&Bٔ�V�3+:���ӣ*���2�
�2!G�"�߳��?5A�1U���K(�ʲ�sӠ�K�J�6A*n�	XQ��V�F�G�hԝk~�j�%�㼖�s���)N�δļ9�i[���J�#�~�N��+$��nN{����Fӧ�Ʌ�d�P�`�kɰ�2���-��Ծ?.V�{Zv��C��ew���|�<K���6(�"��k���?r�p?%~�����=�[����xȟw�x	��(}����׵�e���U�t�z�fH*�!�`
M��O�n$�	#�1��[��
a��m�ZS%�UZ�~T�}>�H�sh(�����ʏP��D4V�7�+
�t��oӵ��z���cvM��ٳQH���F�լ��_
��ϕ����t�
+{?q�^vH�;쉗�I!7��C~=�<$2���"�xh�m]�4e����y�	Ve
H�>P��w簙�h"����_�`����\��Ix�"#�p�͂\�/�nF���VtHZT���
�=B55��n�L��g���n�$�>��f�h�e#8�l���o�t����
�V�#M�0F�(�(�
VQ���,�kE
�Jz��g�ˎ+��E�gv���5%:���^d�Mo�U�9�=>$O�/��_�k�nVի�����a��?<^|*�Xx6����'/�!��%�\���&�z�ڣ�𷸓X��yO��gVw�
vtM9�H�^֬V�Z�{f	4�tz=�~;6�������?`),U�N˓���#�ă��!���QI��
T��
Ç䁬��7��Ӛ�ϔbE��]�:���駤:�e(i�(��6[B��{e�+͵j��RB<�O���z%:�წ�����o��:u/�޽��Z�Տ)���T�MMk�!o�X��O��ri�zA�Gg�4��2��PW�<���ך���tT���	%�=�Px�30����7��Ӊ璓j.�'��S��˖lB����4j��
K%C<��o���%�C���g�3�?$�S���1�֋_.�y��6��r�^VH�'�)Q�\ٮy�

���,����Pډ�Αr�p9
�\
+o��C�Q�KIy������|H"�����ǻDjȭ�ʐ߁k]�_��52�q���Hԏe���m�|�B��H8s6�d���3��@��"�d4
��^
<�[k?�'=�4���mP��G�!�	��ޑBn<m���J柈H���
�Td<�

�U�@�:��h�q�^s�Oo{�`h#�\o
�i�AFI����Y�d��|��<�yx��?�e
+N������Ȑ�KB
FaB.�,=�
����u�Xt�Y��m�"�k�}0�Нʐ.������bX5f�f
j�Ve���驘DΩ�����1'.��)�I8���K�SOD���@��ޓQ(�-Ȉ;��fwJ4�m�yX�����A�KO��~z�s">M�CR�������|/��˷���"�(!��B��5��Ta=�Y��
A
��XJ]]��a�ju�s�b����N��m+�T��_
1\�+�8��
���KO�~Vr?�6�����1M'_$0O�͒�̬�\��Ǟ7����^�}@�
��+f-
�OAHP�/xt�+v�hE<�c,��)S��!�}
+���9'^EB
<�
����:\H�'Aȝ��.�B���5\�/�5��5��R�2w�ɥϛ�)A�Уl�����K���B
m8�;q��_/�8Χd����+x��^ŐN���)�?bN�g4���9S�����w�f�B�F�]%��m}~�c��,�MF0���ᚫ	�ͿF��NE$5�x14����^��}Q
������ߚ`�����z�VN��	~5%}XE�p�Y9��
m=�PF���>����Ys�z������ϳB���?e�����zK�9�㏪j�]"^�T��y3�OO��Ӗ�4p��CM��u&9;Y.kK��!���
����^���G�U���	�_����1&�p2!�s2���{~��zB�'k�K�x�wp]9���R��ƴuc�['�w��@
RS�X�e
+݉�H�͏9�g_'�~z�w�i����懄��N�'�C�=�
�
pԋDAH|����z�2˙mR9Z��
�c�x��jP�.V�
A�`�w�ӽQTC�y^�`��3�K+�|�NAȵ��!_BCn�V�\���y"5Kx2�P|���~��i/�50���JC.Ҭ��{�&G�l�) �����3�e(Ó�*韕
�W�1���e�WF�~����H��J(j��R�����	g
�z�ܘ!Ct�ɪ��2�'[z�,�D��)h�PYґR*[��L�?���_"���ھЌ�ֻ�E�{�Ŭ;p��-�i�A2�Q�BU�n at V��u�uRĜ��3���Κ�mSڐ�Q�l$�:E���r�P
��T>�3,��U=7��E
�������>�N���
_��G!v�V)e�Q>Z���i��RӽVeRG̜RW�Y���ׇ��K;M�3�$*�/�"
�?��so�p�wʐ��Y��│;q���� 6������#�-��^��r�I��-x�^+1�b�Z��*�$�b�؞��Y�qD�c8V��
+������[L�Rz
�v%����M�K
�Q�I����3����.*�7"���7��J�TқI%0�6��W�‰�F�'��Nz+5��
�z
���R��6i�y\u�B����u��6*ho�X�?�/�p`�����CS�W��������1�Q��d�BY��X�a)�puQ8r�c8F� ��z�#�"�i��S��՛�/�T��:b��C��I�
��
�;k�����N�I�k5
4�>DGGk
���
C�<���%v\�If�L�o�52
}*����<�
[~J(m=�U��B�uu��]k밊���`K\钝 �eS�]m��
A�D"IiU�㙒`)��B������o3��/��<q�n^��hĉ��Ч
A�p�<���{g���&��	%�͒�T�3*��B̈�_�/�E���%�Np��Z �T�eZP�X� �hRi��L��M
�wC��`Km��~u��@O���

�ڱ{~Vӷ9:���l��Y�`LG͵�{����`�i���T��TEg[rOwW���P)S�!�}�Tj(��w{���mG��4�
��|Լ��]�s���E+�zm��Xp�\"�G�Z��&'ts�oH����<Z�!���xPG�� ����8B�-��b���0|l�
ĵ+��V��<7�ٵ1DiXq@?�{pu{�-ʽ)�{q�s�e�w�5}�^Ee[�._�;
+e���HBo���r�	����J�+8�ݡ�a�V	aD�O��FX(��.Z�
+G���-6fhGiZ����r�ZR�TvT�Z��"EF��P�-2��:�s�@���4�/�,kD�
���?�"���!3*B漚T���7�L䤑^�U5�%�dC)ަ׋���
iW��]�h���
0�F
+�������%������Fy�ρf�]8!+~���/	YSjbʴ�S0�b�y�6aӸ����5���)
�4b�Ck_K�C��0�g�j���6ΦKn����>t޶�.z��3�C|�13�|=�yO�n�$DiXn#�&o)Vu��Z�S�,udS�2�B�D4��H��t�4��U�!����'�f�[���>�u�)�,Ie��ZZ��m�36
ЌY���쾽
aS�a�2;�
�UQ����wN��D�Vc�U����-a
/��W�)�$���:�en�	��."��=�[���M���\�)*��8"b�Kre��#�<?��5nm��
P��2b�AB|k�3M��`�O_
P�����/A��h���<�-���~�}��}SΔ��m�&L�;�;cB��`�p�+���8�5�v�A*����glB�K&���VG؄U/�4g&��(��L���>zVY�r���>+6m
��%W��h5�c�X��$U��E8�����ho�Ne�]��q)�bܺ��aga�Ł���u���ˬ���T���f
L2_�;�g%��	^G�Ʉ9�b���7�᰹��зC
��֠��i,�~���S+�6��t�J�X��	��
^P]�vD�ymDR�aV]���(�1ҊI\�0Kzj�l?��p[�=G��E
�,h‡������[���H[��(��n��^P��.��/VM��
+.cV��Ԑs��tզ�=B�
��i;l���{0D�_�*������x�v/�$ �_�li���@��
������!JmЈ�X�3!Gc
�w?y4FCl:pE��ȸ�^��I.~��nFG,����t��M'��8Cz����m���~F��zZ�|7������S������34
r���rۉ=�kZ�?HG�:u
:hR�O�P�fP�c���1�]@ٔ0n!G�m
�
+nΔ�����/���u�~A_�~�/�ގ�{0�L�:���- R|=Ι�B����8����f�����@���M%Sv1)`�2=>�ֆ��3�j֭��5Kx�Ҙ��Ƃ����}/

+\O�5�z�Z5�E���>\�פ
�1{CT�����	�wU�>��q��4�	�Tʜ�>nύ
���$T�X�1�f���~*��
��傦
�eߙ;�0�־�u���5M��L҉�&r�_M�?�����`��]�'D��
n�����g{vl��!:b�D �x7��
�zVU�b��8�ߙwgFVp�߁&����M�D����
ڷ�v����%m��ɶ�����;�����MУy^��
�e����*���[�ai,�WE�(��ՠWG�x�_�Ć����;h&����
�����v����wk��Xq��&u��q
�`e��o���>���
,Ȓ�Q�?DE
#�
�.L��!\ٷ%�c������`��t[O�y�c �kП�M���~l�
+;�����r��3q��6&jE�˜�4��1b�?��E�
t��@�� 횰��I=�������G0�k��G
}��6�eϷm��]7�v��iZ5�*����Oh��T��Ae���^�+K�� {4���,�0�_�ɐC/�r�I.߰@�畵�'��.�`�l�������6��
�Ӕ�>y݀JZS�GL�s.�v�9�Y:
<gA�M��R�.�$l;h��^l��2�W�z]�{`C&�Y�����n�*�̖�����u8H���a��M�
6kۄJ�s�F�=3��q��lO��
Mu졳>q���f̉�6��{�E^Jݡ�K�q5�6�LxP�LZ՗Dn�j�w�踭a.��X�@?��˚��q�1Q�
sM̮����
���vU�Lٰb3����2�`�P{ A�l��
<a�ޘ�?|����Y�l:�	�#B᎗�ubA�&Hܺ��jnL�q�27m��U�ü��Ց��>Ă�М]GM���,hKcŽ
���8��m�-j�.�){n�[��
����&혠��uKX܆_��$��;�����+>;i�����Ws]������Y�q�O�ɫfxJ��1c��T�?�?
+4~
���m
��nT�q���Ic˂ʜ�-y����G~���i���aGL����
�I^���B��)o�Ϣn��;ntɗQBݮ�P��!�W�D��d�`o�߾d;�®y�� ?_QV�\;�ѱ7&��2C�m����7���k^�ߝ1�
_
�U;FbΞ��?�S�l���т���
+�4�Ok�{1!mx�ob���pq�,޲��
�.
�Ύ�3��@d��h�kh�r?�鲲�ɾ�>��x�dm�LoE�Dw�N�a�����>r���*"؛~uQ�{w�P�fdžN�w�
+w��5]��
+�p��U
<.(�{��;�-Yw��
oM�*B���ǝ���W���-
����yٌ�;3��9��ĝ
�e��kN�}N[璀cz�I�mԪ
SS���!nIQ�4 J��e'^楜��6�ՍY
�{^7B�v���UU]�z��e5$VCO��
�:�I�{����&��:����_�쌽��G|�!3?�1%{6L�q�Ö��ش���аH
{C�����u�R>�Ѕs����ݕ�W���
�����m��XQV��ro{*��R�?B�7���(j�|"�~a���

��
��.�\��?n:��yd��T�y$r�ؘ��#U�qe����3=��&��oOt���6AB.�߭�A�kƊ����¯
l��#���N��>�������u34뛟�۱5�l�`W��_�k�a�H��AJ����r���͡
��Y�R��=
,u�� lm�"n��4lK[�Ջ([R�EMu�<�2Ƞ
�(��!D.a��
+*���vD���h߇+]PU��:��x���$���%5,�EOH
B��ձ{Ct�q��$	~4��<�j�OtؾO�
�/�h�>
�_ց�����\7A� 
#
�Q�� 3L�O�.Lš
:p㊎g U��MS�둎ܫ�⒛s}�כ:R�� 2q������\���$�i�uUU=[��
�~�i.�2�{��ɀ-+��{6T��
����g����孊��iHZ��c�{��}u��
��Ч�P7��ԫ�Nڇ3����J�}U
+b�_�x��#�ҿFQ���+�ҧ��˓œ��rػ�>|�xG�
5�â�!zI]���i�YQA"�$�����a���)iCdW��S�ڤ3.j��@k��ey�]+,e�O0�
+
��?:��Ǐ��\mI<�'�fg^[��_}q��� 
��'�:$̽w4�T;!+}��$�6��~s0R냾�u���Ŏ��p��@�e5"{]�o�2!suĨ�
ė��ߜ��d���A�o��32dƢ�>�t�Q�
�vCV
 �*�����o/���c����3����w���
rRΙ	q�Z�I���O��Ǣ�.j�A*[P|��}=/�z
�-y��.~��0�DM哊�H-%���	��y���4�����֔�kj���g����o~|�G��p��8�o?�Ň� j���Ә���}�ʸ��)z~4
+�ް���<pcj�=M��{��޵4&�
 
ؚqO���Ԛ�>�^��Bf�՟��y��;E��s_�����.�Qg�����= ����6P�T/��_���ѹ{6t�7:o
�ұ��ks��GSX��0
��E$m;�=o���(���S�����u5(f�/;4В|���=���
;�y_�e
U��C��{�0��Ad�|_��II���C�qf���c͂��s��f�ro�QY�NL֖��i��X
(>(L�`�}�uY���lk)�=�/���^
�W��Q

+T̢
�c�]��z���Eo�����c��?F�)�+@w-��o.Fî�X0�W�rˀK�2�?n��6u%O�,��E%蹃����^p}�F��T���ׄ-�j^o��߭��wU>��JB���g�ꢶM��M6-��{�ae]��cN/v�ݛ�����u��NX%�_���mC�[�(����᜕�񜯹�R�m�C�4bӷL��]#�=�O9���T�o��g5�7��x���}����xyi�oh��N_SW<
�$_���<[Q�E�t�ܛ�({}������1��5%�~w�g
:�>,kA/���n���RH��ٌ��s��5���+���zS�ϫ���9~�7g�}n�� 1Z|�YLr�/ؤП�
�?/��N����Wǀn�2���7�ݿ��V���&��8���*�a?�/���Z�5���������E(�1�����hqa��h)�MԔ
���
[c�pK��/���/À���\�M]�v�T�aT�vUGL���A̩+�Otd]_UW��(!o�U�Q;���%#4IO9�Ώ���m[c�Lo�Ù
��y`��
�1��z �a���'�Ҹ4;�����j��_
��[
���Y7����_ >�IK_���
��5M�l[�q+��۫�e�K
+PĮ�*��U��92��J$�"~�K��|��K�۲mC�-(�o��q��W<>�nN{��O�1J������x��_���}3�ՁS�{ޞ�4/ϻ5(�9�y�C_Cę)e�1&㬉RzQ�M�S£�d�O]���NV�#��qa��%
&�-,{���\ݶ��W����J��}kC
P�Q��� �>
kɿ�a |���������\n�>�$�:�ʼ ��Ø��M/"�~UP���^�8�� >�,�2�t
��I
9��	Y�K
3ﶉ�wkN���s�S/��7}����3��1���p=#�� �Å`Oy���!iK�H�66��`i�&p삢�>��bf�8-.�v����!ृ}�/�{����ʟo�+_��I�Ȩ3��6�z1�QxK	�xY^yn��ty�P
��W��M(��A�q at 7w4"���������x�����
,�U=�����amZ�ًj蛅>L���fG[
�,/x0�]xo���麁X�nf��+���
�L\�D{m���{�/(�7�R�h�5������_�mF��v�
Lw�<�����?��Ƚ��<�O+x="��s�

~�#]ܢ[vj�E �_=�zY�����	x�@7詤!��e
<m݄�P��.��^��]���	�p���d7��
�LJ|�J����Px׎-t��[)	ל��?ܴ�

Z�<�R��|:�ц��|�ؔ�g\2� �O���לp�I��e]W��Y"b݂H�w+g�ʟ�H
+��IJ–{˓ ��o͹?ՙu��H�}�t���ަ�.�hT(:���=�`~
�e
 j�P9�����`�O��x�5CC춥�Þ
��m�$���+�1��������go*8��C/�dǁ����
g����
����G+��n���0�*�԰�#
�W��q�(�1?��9��u��*|���
%��g�
��Bo�Q�m'�����
Q��6нy54��R�h���]���٤(�ʔ���JO͋M=��pG�m=.��)18b�H.���.�������
+*c�+c�Nt�_�i�ԬkZb���d�왨��IIm�*d�Oż�ٹW]�4vm�9~ͻ�[&|�g at clꠀ����soMvd_[V�߶@↥5OX�oN��bv�9֖�����[��O��W����>�z�}wV�J��և����_�>�сƒ])a���^N����Vrd.�0�75��C'�j׎��3C>��b64���^e
���v	��7��R�Sn�������:ra
��آ���w&§�FTƊ�	4"�|6�+�h�z997&;
+~�Ю
�3*(����ghU�8!*���_��{X�N�	S/. �fIO䖿����������>l�󉣭��]��R��t�D�ب�+zl� !��>tʵ�Vp�l�͒�.|�
�䕾�E���b�������r�5<�܌��Ѻ���z��U]m�:朑S��!�ը�^v�M7;��H{q�loi�����ߣ��O�
Zxܶ�0�

~���i�9��7�_�ug�P��?A|Ü�棞�yu� I]�qP�3Y�����|
�k�ʰ
K]��(��
�e��T�b����`��3K#`*6�o6,��yeƣٞ�{^\��
�c�d
�{p<�łN9��泏�8tK m���_>�U
:'���F&l�5�z|ʢ�1v���٘toI
}�
��U#,vBR|{��*��_�~������˞��K��m&��Mk\4�2m���3�Ƥ%}S������pƈO<ߏ�:�ż9�|�}I��c�[iY��s�6-�ҹ^d��= ��v��p���β
+�
+�_�|�m�|tp�����gs��k��
+R�`[�.��/�fƚ
����l�)�Z�b/$|NVzo����D'��E��
�nBO��"���eNZzo���� �d��!fv ��ה	`E�

2c��|�ߒpnF�u-����ܗ�xKW��u�����#[j>��3�_�����u�Ҧ;�O��\��ݝ�x2�U��",�[��������Ė
y�y�֪����GFlԹn�S��ӫH
�>�j�;'
܂g
��������{Ƣ^V����sn�H�S����կ֍�,�;�m��;vxP'q��'ݍ��;����ռP�nN��#��uI
�ʤ�.d����nJ�
;$ʾTA���������fV�
)���΂G;ǟ��Q)C��c����͈�Uyq�(�ڸ0��I��Um�����Ě�����
���xN�
�e�ů�
+�L�?ܝlK�iB$m���f�M5"�܂
�����u�
�4@G��Zs#�ϦU������	�V=�q���9CD�'H&�g�D�����d7���/,�kb��(_[��At��0
�e��d�[ 
^�8�Wp{���_��BDo��i�>r���i׆N����;�#����E�fR�����ŀ.���巧;+��)@�	��񗶔��C
2�^�$�Y��E�ݵ!S6���u
<n�5���@Uج
��kL�tR�^A�U;�π���B_��5<nW�T��Cdڋ
�E�����m.gy �~Q�="?��T<��־:�2`�zb�D'<|Eͭ�
����і�?���O�~�2��>��+���+���=7݅˞�<p�r��b�S�v���..fB��d�^��bR?��Ї+ڰ��x���
��.V��e#2u͎�����[�}����KmHJ_�!c�))�f���w
M��#���Ǚ��ڰU=����g���5�]�(wK�K
�*��u�%Z[��)y���{TG��ݪ��垹��T_Y���uI�'�k+�xPy��;��wצ�)���e��;����]9>鼅Uq�&�|��
wm��aQ�
��oFrʟ.^�]���ƫxT�� 91��M������ew�Y��9onWWweeUVT%gFfFd08�03�-[����
fr�Y�,&˲,3H��e"2��g���Q��;w�ռ��ƫ�w,-Y�Gҳ��g���s~����_�ʿ��h�٣�վW�Xv����+9��I"��a�CM)��J�}Pr�����^���A��'��c)���Iy)�:4M��
��Y�
m�Tb҃Zr��9���/]�Ԣ�WVb�wL4Ď���
��k�6�
e��i{�ݲ5E+X#ܶ��^fg~����i[�+��2i13��6��
��|�9����!��_�3��
eW�_M��O:ƚn�����^�
DΙB���X�z
��g׈�
+����ޚg�T�^
:r�]	��s�Y��5zT|�J�k����_��Y�q�������T�h{�t�7é�O0J_�/l�n���J-�)�n�k�֝�rs���
vkG�%q�ȹ��M�(%�|rz{�Z�a�yd���
:�G��l
P�R~��[�����Ǎ݅����5���*�%_y�X���B�K���ID	��M>%��-�f�B����r�{\3���Z���ttPI-K�X����p��n��AN9�Z.���y[���W��?'�uN0��C���~�وJ������aj������iz�:��!%�/�Cݞ}�h}
+O�+��yMk@�yd\XP/a&ד4>Ce򫮙��
����6/n`|�Ċ�>ĥ�)
|a�OXxK����όr�?O�{4{v֯�@���F�D�Rt�C�\���rZ*���0���
���v��5K<��
�2���rr��.ڱ�
+&̯Bg��םY{�p2���3
줨�{���=Â����
����yPrAѝy����ۨ��ёjl/jN�����\b@�G�T�� "�_�\|�O�D*���1ɯ_��]7ܯ�~������瀞��9M�)j����;�����߲�G�������^ٷ��;�<*�q�@i�[y��w��IQ���S�����9 K_{W{�­�7�ӊ��L���iy�.��_\}qu���S��2N����qfΗ#�;�)I%A
�%b�b���
+��Z��Pz&&f�@-mX�C��ޓ�h_R7����>s}�9����ˠ������B{��ȧ,Ky
�$�`3�
+b�{�
/1��Q�,O+��
����#.k���l~X����-��Z!Χ��S�"��߼�
s�	�{k���~�gʶ�?*%E at _����#�ޘ�U��+��	��qFeX�C8'���S��q�2ʖ��y���->�����q��ٻ-�_�������Ab��[Ĺ���۞��qM �؇�=@k�U�Ҩ�����]�	����!9��7E̎�f�m^[\�� �F`�^�$笁|.�)�����+:���}T�}s}}yi�U�iý�-�1J�[
&g&��
h�u�a��{����/�79�D��Id��f}CL�*z�|�{]Q}��`Y,����A��אS�Ij�¤ �V�pv�_��O&D:GhŮab�o��g�en�bn8��!}+}��Rfz��f}��0>�g��iΌi0���h�L���~��%-�nn˄x��Q�g��
+L��PcJ`]O�9A�zI���[�l�[�z6�A5�nu�:!��Ť��W�����\�w�D��3��!�1	I
�as�^�2�M]x�99�����
wq}X��c�3����\�9��a{�r���
�*EX�c�9����3�b�i�=�ȴ3����RT��(�jr��50���5_jZ˾
+(����Ry��&�f���}��+�����>v��ᒮ��')��Kug��
��aYҶ���8���-����gw��ޞ��.�z�Z���~� L���k�_BN��ï�t��-t>��x��Q���|�� ��i�g���_o���`f������!n��8��3
b{�p�;�ψ��	
�"9�
��,���:�
+~���ޚ�l�k~t
�3�rF͎�Ք���)��{�b`���{e�v}��9oG__~�� X'w}�U���Q�U�7�T��
+���B�����
+���=ȅO��Y�m���	j�����'
���3�'Ǎ�ꠒP��;���qA��W��iQ�1��T��
Q1�]�;�гsO*�i۲��+'���T���:5���暦������
uM&�?�\qt�9E�L�wv��@;N�nm
���W�
+v]\#!�\����� �v��/�6�w	v�A-�Q��rRaXN��ڰ9Á{�i�~ba���s�"����m���i�U�ɀ�9!%l�����'t0i��N����T�
��ל�l<�JF'4��=>�9M+9X���f.���&�Rg���}T���y��%I�SAkR�4����K�!
�
ֱ�iB�}��
+��R�}��XG�����~%
�
+�!
�16�!�X���IJ����\K9<{�I�WN+�H饀w��Z&䃅�
+������
�7�sA
3�����ҧ��5?��7�w��Y
9j��X�2����
�A� �U�
+��0.�n���*!ʣ�d����F���k��o����6��y1���SȌ��
��S�
��\��=ϋ[�ϚSTݐA���M\n�&� -��דk��7�]�����H��U�:B�pLS��zfs�*�l��s����1z�@� }T�(h`C��;o�`�o
!A�h:�l<�!o���R�v����JV}h��wk�en.�>�xj�m��[�i.��/qN��
�蹫Ì2��R�5�K[y�<��������su{�gn��z	ec�^jy?i���� =��wĜ��=h:�
%��뾓q����
zvW�&p��E�w?n�!o�".n�n��'�Ϳ�\�i/�K@̈́Gg���w-)��%�L�˾�� R�R쭐�RPq��Rv��8��!� �T|�}y}���GYk�g3�y߯�!���,T��*p��nK�	j����
M{��}���FPW�_5�i��13��Wq�6I���黊������=�/�'E�E�����d}MLUuW�����
�x{y�=���5��5��➦��B��).�*���Rj�>?��
���IB�ro�ɕ޲o
c-�w��苍�m)2�9��Z�OqK1y	�Hr�&y�T�*�������j6�j�O�h؜�g{�)��y�&k[Χ�j�St at 2�J!im �jyZ���[��q�%�
+��� `���2>�yo}�V�u?�O��_�Ψ;��ݫ��_�h�?]z�r=j�z��l�+z����A�5��
|zHϧ�|jP��:@r+������	V�6���<���c
,�?��	y�m'��-
��F�m}���avq|V@ mO���
���,�N5�f}�Q��y�
�@���XX���ys
��>��	I�Ċ�c��Ị{�8���(�&�8 �

|�.9_��1	��>Tw�+E�F�������"f�/
���N�8'P7���N[����x���?��R�ݐ���S2k��Z����ïY�6^]�C�;�x���=k3O{6�
��aF��K�SOٱ)Vֿ+��*��qS�d}�o�����
+���9�C����mUW��� ��7
��KO?�VHI�\!�^b�zb4��wt�J>�>��؟�����<��҉ȶ>|�� �WF� 5,u{q�;�|�������3~�A�N��0���.uc�R�9B-
+j�5�|V��%8�Q�
���\~�t�C�
��[��������&
i���
i���-������B�d����Q��	F�o�pg�z�3�r
�3�3<j��	��������1Ғ�5�p�5����
�3t��~������>�(��n8ayV����j4�?��J�9�ĂD��se�����m��y���\R�+V� �JT���s
+��c�m��3�c��ؼ��ӛ}r\�f�y���O*�ݞdTD

��iV����s�13�d����V:<�.@��ׄnL�����ˣ���W��}���W�Wܓ���A�
;�F��aRz� a�\�� ��}��-#�,Hl�ռ�(i��wt� M�-���/'��&����fpY^Yr�%F�O�ձ�~�z�
=��y���{�K���S�E� df��9>/����>�<@���J��(
��[��c
\�G�/wkiu��_h���x�/<'����(/�+��{/~��M�F�)��A%.�/��q�a3���p�B/y�䢸���=I�XꇟU=(�Bә��櫖3; �[8� � !���Uuq
S�ݣ��������g�*ݫyxi�
}m��5!���U��n����o��oI����G�`+��	k��[����!j�� 9}�Yc��������!/9P�W��7�&�P�R�qM��瞴\�g~�OK��ƻ�S�Y&��}�U�S��^������(�}�������k1#�99g��(=��F���c����'=:�h�*)%�o���4����ڍ1n��>���$�2��\R|�s}�x��
���o
����jri�S���pn�5� �
������3����ϴ]E_�Lj�
%�e�q�UWSJ��Ay���'E_
0���
s�/���,<o:�Պp�w�[���?�
5�
�DԨQD���Ԁ�Z�2�H�liW�=��=s�p�3]��g�{d��Cq�ܞ��U� [...]
+=jtc��U�s�*Z�O�G/㳃:j}bA�
+jY���1��`~�O
D��(���qi�v:fd4�}�gh��%G�L���@����F���i�����u3h��C���Ն��H���]��,I:�s\J@ˀ���ӂFVˁ���e���۫��8��"�82����^������������o<3��.)�l}���5N�q�#��F[.n7^����Rw��c��vr��������̥W��C���0S]␗&[�)�T�0����G�N���B�~-����*:
>�<k8���e�
lOJ�؛�.�U����Y�ڞ����c���+�iZqD���\�§�e��{z��;|��[�	�(�jP�l$��


��Q�5�r�� �B�[F+Y�<���'�4$�%gVt�E�φ�
+1~[�����!��8�
�hmskk����OJ[
��v�9u-휤�5|�GJ)p�#o��w�� ��k��BPE-k:x>MO� /�SMO�ō~J�_J�K��
1
�pS��K�ϛc�z�
���
��Y�Wy;䄲���&��1%�%�e6-
�n�_��-�A�uu��Bb��'���b��0ap?����[h�\ d){�z�z
hŠ��sN�2�[s���g|꜄�ܵ�@���zy
��4w���W��Z�o���
=8�jHDŽ�,m��}�4�3�y�4
���ޕ c.�•ڇa��2D�C͇�͈`�aNф�.��\Z��D�cE(
�HEq�>�#V���;�衅���!B��U퉈��
�;X�|����8b��O+�8нŶ���^z��2���;�ӊo\Rb�OM��E8��SCjb�O��ڵ���
+B�V���ǵ?l�#R�jZ���&���K,KZ�B��-2%`�y���p샽��Ϙ��V���A�A]�5����p��[e�`�ͽh9��i�J�������;�s�eo�zRUr�t�
��dk�U:�������5�9�ue���,`2����U���y
uuk����t-���o̯���z���b/45��d9�İ�z�[ʯ���!^��������c�۟�����(� f��t�1^�
l�'f�{���rb�����
=9�Nc�<*>Bv����s쭨�9�03��«�gϾ(�|�I����c��V����r�'���������
����h}�xF�O?1��}zf�CF��͐K�3�ˆ��
��<
+r�s��픲kC��΍�������	7��O��?��¸�U ڶ�֏M�T�J�wN`�V{K��_�����q,`�{]���,�c�	�c��m���=
��ڻ��V����L|j����1I)Z�gĭ��m�
�K
��Vz
�������aSw�[��X
�Tx��<����S����d��t��Z��r[���8�Ĭ��
�ٰ��R�c����-)2���8�t���l}�\n}�t������Ő�I
#��$��Q^��_X�)���TO�n�>��X^ԝr�#��*|�k� �ϛ�V�]!h��uvt\�OC�ܜ@��E\	��
{K�֏�]o6�U�'�ӛ����Ŏ��l}t0�@���o�������{�{T�]������iQ��Ogg�������A
++[�=cU��Gj~��9���G��E��ot<���3���k(��}��
�Q��%cW�
Q2��Y�ɹ�$�Niʯi#{4���!��װ�����ӼڵAJ��K�5h���
��	H�FU{ g9F���)^�c�xgc��Q���g}J�>ُ���4�9������k�
P�[�{Q
�L'�ǖ�+�!L恑Oܛs<*F��{l��%c����ܣ�c�	�
�!'��W'
bR
�o�Z����YDL�
s�5��ԑK}jJu|��� #����3�����3h�l�Ÿ����O�.�d��	�
��e�y
�����ŭ�y
hcBn@���m�T� {3aQM+/��dq cs�U���
��/E��x�
�]]y�x*������DM�{�Z�b�_��ޞ@��L!��+S������?�t�S�EX��sM�˃*+s,����ֳHK��\�Dӕ��R���� 4��5��b���Ff:����qHQ#��W�n%�:ά��{���|�Z��X��IL�k�1�[@
b�t�z�417�M����T���cЫ�g�_[_5�j�Ůǡ�`�n͗����R�,a�
�6k�m� �T��.�g֩�����+����ћ�vc�ߡ'����fHO��%Ǫ��ӥ�wwy�tss�^1�83�� �����,
�R�+@��x
�w}�V�_C,�Nc�x����zt���!Kg���ݹ<Ϋݚ`T����j���l
��;�a��*/oV���̠�s���ފ�o��m�����/�{
�Zj ڥ�hg��ڔ�U�Pv)�|_��{�e��[�A��������J�.� �1A�X�\Yq�6D��9��_�{�;�1S
�a�[E-y9�>F�v�
j�S�z�8��1N�r������J��^�=����?��|�g��ڻ�S!��1vq2��Z~Kr�č̆
=��'�d�
"..����!NǤl#�Ƶ<Dh�\
�P*|Rd�zo���k
u#:�Azf���ibNPˆDM��d����̘��h��_Z�,�p��g�~�9�,�����%�~\bc�蠆R咢o�)�1hC���
�W
+O��sQ�X��q��q���Z�ԭⶔb�� �squk z	��Ԉ�Z��ogG�"��
�iZ��\+/�<3�������޺����� &��S
+��S�j[-7��;�czC@��Y�o8�����k��j|�Ѳ���4��a���k��[�wsۯ�fo�4]�j�2);�·a���� ����f1#�f7���R���o�h��2P>y���|GWb�U
x��-�֭�3�����yԄ���TSˍ�Ȕ�).�k��
̵	�`��f[�х���e��m�p�F9eڷ�+S=�~C�����;�\�JŨ�
mNOXؤ�%qێ�ѤG-�/���Z
D]�/�=t��u
�&��VzT��0'��9���3|�{��
7�Q�6>u������
+ϋX�Y>0
2:�CX�;��
+���r

03�`U���
�0l$A�*P��uׄ�SX
����u��
+�j�9���V�	֯�����o8M~]r
.$:'aG��
�J ۞�7�fM[�܊�AZ��8�p[ήY
 �\���o$���u�_#@x������t�ϋ@�r��_#>�5Ã����l��?�7�0�~�>LI���j#��csNxVDN��
|3X�1i
��N�O�i��� 9b}^��f�7���o
#�|2|�W��P��]
�	q
�+��'�c�?�d�k�i�5�4.+�Qw��%�]���G�B�]
+�a��;
P#A��26�A��������S���Ql�㐨�Z
�����ز���>�|a
�c�srN󱶦o���p����
"
pf�j?1�>N��+%ĸ��{k��
X�|@ł��l�j��옥��[��؞� ��;��P����-	hH=
��
+�s�̡t�������I\vb��36/��t�ڰ��
T�J�jz}���=�	y`��^����z�!�� ��6���*�����ꀌP�0��,"F��'�Դ�H��-u;skyh�t�
+�����
��k�o?lH��g�>�\K��e!}z|��$���$������o�F�qŏ���6=z�u=�_�#ZBe@
8\N-v�	9;s,��Z��#ȏ-���
Q��*�[�BQ��g��ܖ�Qz�[I���V��_6:_�g9��I@�[
+>lIz�VE�
+���e�O�3�j&a��4n�l�!��U�2rE�@�&lll�$�^�oOu՜�jH�_6،�z#��čl莉��뙍�`��b��طvt�����>�ŭ1J�G!����`�br]�i	<�}��V}�1X�_I(�()�>%�bwN������`��;f�a�V
��ꀪ��u�<J	ʧ�����|��^
+�y�KJ/��	���vЖ�W�i�[)~u��=#�o��%�2b�J?��}�p˫`T�ϕ����o!���"��
�1r�� ���{虀�Z��t���,��Vl�$�z�<�O� gk�B�{��A\*�4���d[����5<�Wɩs��K\
+j�GI/[
�_w�0�bf51��.�)��>Rw�5��6��
P��݀�V�9Us�)Q�%�6�tfsr�/���ʚ����5�<�xX�E��քg[�� q�Ȁ
��MQ��`�G�_l�
+�9󯉩n)��`�����\s���윀�_l�쑣�v@�	��ܐ����D�=���*L�[����va�a�ߖ�B.���r�ZD�}O.i�]��
��_�j��HeA>38/
���>ce ����2>��se�&�%�$Q���o��b:\�k����P�����{�*Z��Q�q��Aび7�'|\ Lm��W�՜Pu�uuW�<
t�x�x(��q����y�����)lO�j
c���@g�I:#�L�OK�M��K�mt(�亸-������U�O�E/�ȧ$a
��!C�9 ��,l
`�w�9os����pq�{K|~��lvL�7�ə�3���<
��S��q��v� K�z`2���������M�E�p2V�b�8!;yM�G�ͱO at .��������*P�4��>��e}S���`���,�r�J�?����fB��e
m��# ��U|�OA�tJ��
��3é�M���Dũ_~�x�5�ΎYMa3
2vw�O�;d�����S��QV�F���q剥7�' [...]
+�A����Ql�[��xub|d���.��-�nnNӊ\�]�E-k�e1=��怂Yr->��P�Ӏ��ʍa�uO�\����q`�S���Ͱ����(�
7��֜X�m�����4�t�7�1

�HmlNH�[��P�^y�͸�	(���a=���a�40ˣ�� .m�%A�����H���z��:MO�q�݂���l�D��>���qR~r
a�4�>�xlV�^|�JQuV~3�J?���������k�8�NL�E���]
��aI���"�l+��+����o��8�8��?y�_ˀ5l���Pjؽ���vk�����;֮	#ӑJ�t��@K�{�Y3u��,t=t�AM4r�;
b�[2C:ح�	W�%���ۛR2$j�~t�����t�M�  x�������W�T��\�Ӄ�ogyUt�WG룰U@�ު�'a���%�;6>ϭ��̽�95����m)�poIē����>֒�0m<�V2� ��^C
+���'�e����^���
;fzCX���
�?�A��
@K�y��,���X�
:�5
M;�0Zs�5���
 �V8�H�^����cr���
nyӥP�>.
�; ��5"�g��o��
�Kꀔ\�
�*�7ê\x�ta{
�5��v�𐑃:��½�V�KՊw�qJ6�o�:
��ם�
+]��B��߼�#���͛�����sM�3lo�O�
�/��B�
bʖ�^�%�T{��@��
�t
m
�$��iշ�ijy�(�$lb�#�>��]�5����m��}Ŏ	����'g��xM �8A�N)�"���=RfEDͨ��
+��6�W7�q�A%�)�����䜥א�k}MCj|~X��	���.4�1E��j;�AcW�C��ZzW�OF.��X��qB�
����^����5M/�v��=�s=���6�SF̟{^y���.#�㓝S��
���v�G.�x��¨
W�csl/�~�}6B�s��
rck��?�Sq
����	�#n���A
�¯'Wz4��������Ki%�IbVbQҶ� Ef����k��A
�*j�aw�
�%l]�l�=
"�U�
+k���A���~
��e��M�}::$� `ڧ����„�L��[š�'х��y.=h&W�.t�
(UK�j����WCg�_�w��.�Vf�/�iwt������s��k�/Bs|�s�R�6�1�����h�_E�:�.n� ���Zh��[�Qvg��p�mk���������'��i�A� �@.��h�!=hBvT�,�AlN�n;��t�9�/gV��
��,�h�ظ�^�WRK�3쪸��LEĐ�]7p`a
�1j`!vf����U6���*:�#NMD'����ixM�c���g
?����]3�99�oc�MB������a2�L �iY�Ȇy4l�,̒�Z��+Y���X8������� �@�
j	��mg����NH
�n63��-��� ���
��|ϓ����m� �
h�2�
&sm���⛼�>�ߠ�tƖ�_�t|t���"x�X��)Z�o
+��"'�#	%���
�8���gV~���[���ZzM䂈69��� 3�iQ
�i{�f}^������Bj:l���<>��б >6�
��eƍ����%-��V{�
���{� _?��Asww@υ��R�
h?-��9�(�b���b�}�]��W�}����!��aF�c�W�q�!%�9N�[x�N	iEl��X�c���Sӫ�bwY(�[�>	�څ�@O�b���NtHɹn%>w���(�
�q��vtŌ��[�����z
��z��s/w|`{��ޔ��u�.��M,�Y��]�b�At�GHX����K��0��gZ�$@��&H��1��)jCDǣ���z�ln܌.wLQʖ�)��A㽗
�Y�_�l�[�w��"�f���	��Ӹ;�㈔��ќԏAm��
������0�z}��	�[�wA��
� �T����|+��U�O�	�v)!{u������?��Z����҃.�ÒD�aY"ڱr��u�Ӱ��
�T�ңZF������x�8�1�9��B�5� 
.ׯe7��l@����t�C!*f�� g�U�����3r;f%ƻ�U��S���j���K�@9�
iy8��u�9��Id{��g{Z��
�g
w+<ì�NM��h;V+:�Ã���2j#fB�O]�7S}�1�p:X`��.��
�r+i5�wU?-�U�qKawfZ3��:P[sm�ث[RF%`�΀��by	9����Ǹ�T�g�"Z�>��_�m6B�p+۩~���>Aș�*�|R����qjN
p at T	��`�i\�Y@�yH��Z�9Tyv����v%>�A����:Z>2
r�O��
ĕ���5e�UX�J̪�iFYd���
��r?ᖢ��G��Ɵ�j���
�f�&��"ⶌY�W���n�O��ٚ�g�=������s��/�X�ߝo�Y���E1g��c����������Bt��!�IƳMrׯa'�D��.���[n����c9���O�~N�� u܏�%�#Fݧn�E�
¨��uoQ���f�C00�K�Zv��8:��
�:�UK*jծ����ȡ�Yi-
 [...]
+.����ݽ ^���NFe���#/��X�1Қ"&9:KGmM��{5�ڐ�
sO"o�^U|g|�u
lS�3K(�qyQPO��|��|�ho��կc7Z�7��?,���+�ߗ^~�a�G��,�|X��w,
T��嘚���e~9�}rqkv�#'f���ڏKB��e�p�" F����.{�� ��	7a�pv- >ۂ�J��(�E
�,���zU�ڵ1l����ۣ؜�
�j���W��=�ַL��Uv2�S�ʕ7�ۡ)rap�������Rx��zo��
3�����
�ܽ�ӷ�

+|��x��
��+E��H�7�2T��$&׭��|�6Nl�M�ks��0����l
c��@;�ud0FɕN�G��H���V�S`2�/���>/��3
��Ѫ�:1�5ë�
c�z�w,Oa']#�;֧U?k;
+�7�
�ͽk��Zv�� ��e�Ɉ��;G���J�2Je@ɆU�����ݐ��vI�w柖~=ͻ���Aȵ��C�ѡ�����*���q�5)�+m�
�EfFM�ҸYH��ܳ�����+<'f:fx��AJ�}�%E&��%�Y�{��½e>ko��A�"dF�X-�y!#��}JV�WF)wI��>
6g�K�_�z�Xy8iW2�}Zu����Ml�k
�my^{������ԯ�ף��[���Z�>nt��|\r
�}��h�ڨY@����H�w�4��
��j��!���;{6r��*��V�S
��k@˳�W�_%�I�&�w��jr��"
{�*�u>����-9�
����Y�j�=w?狙��?/��>��  ��i�%���~��
v�5�,?��Y�ZC@	4�$<%f�@wM��\��o`5Y�1W�o��,��π����*�t����۸���
ݟ�{oG�J�i蕮qȹշ
'
�ȫA9)/�����y
!>�C��	�;@��"�
"3fĔ$�h�`LJv����
�� �c����@�i�y�]�&>&b�!��]��\��k
S@K�inCX�NO��f}�Q�V����\#д� �
,v�Lݝ+��
�!�3�@� =q�C/m�7^pL#ң���#��^
1	).��=ɪ�j���^�=�r�-C^���q0�"Zf}P���)�y[���Z�<���R]�F�f8�N)�nk�W�އ�b}�I*�����}l�U�ل�T�ga��jr�c���9��y��+��g�è�FU�N�����
+��cČ�>T�F�혒X�Q*�@�lM$�����90�(��p���46p
~o��۷��A
:ߧ$�GMLXhV�
��?w+Z)
����!�U�8�Z�D��]``vm
bd�޲r��$�fl^����Э	�5��fHA*ۙ��~���?�
+��F6ͮ��%�}�
�ۖ�>إ�g�V�!�
�M:�`m�mz�xzu
[t��H2��C،�ކ3ީ�s����
��z��ywc��S�/
+������(�7=*8`{B�S	��-G��/�[�C&NKt���_��Z����P1*��l����x�|�WŨvO�n���;iyTzj����xޯ�'�A��z����?����J[w�$$����b��,
�qA�ڛ�"f£��y��[�N ���V|��ή�Xy`c ����}sWwXɬ
��eQ�1��B2r�ڻ���˟�<->
R�J�|��B{G�āoNB//�+��'�?����,؞E@�����`����4�$�I)1�#��5�����
�
7���|�=��WN�ߙ��wfE����
̹�w�J�
�Ur�}��k��Q�PN�1���G
]��IV9� �=�P���g�.�@���F|q��@W����گ7�c��I���V�Z8�d}LX�8�ON�ݙ�ab>:��	t�c��`���7���^��5�*^���
��3lh@���߻���P���	xJPGo����<�4
�Q5��us���L���� ��&����!
RB��I�a�(a�7�Y��-�g�W����5K��;6τ���"Ц��
+|r
G�GP's�ݮv��)0
!��fEt�,�LS����/���~
�&��5�%�ji�
5!7l��ƌ�&����	�)#��{~3n�Vzރ:��UR�����%>+�%V-<�;������|JL�/km�?�w<
j�0�$��c����
30�^9��>Q�����i(U��֎�Ů��{\��|jbEb���M�B��(�Q

��acVc�i��j	hHU{�\>Њ��e��F�xTԒ�Q�
���
1�)�K]�6!�
r�����Q��A]G������Ո��������
+��.���Q:�>�|.
+�Gɪu�%>���2��-.��
���6:&�7�CrfmX!@��)��l��U���֜co� ������������DH�j�5�jš��Ae�Y�qӧ`��"�K��¨�o:������[�I�T�8
ȅ��<��v�*f�Z��P�1Tzb�]��A���t6���bb(YSe������1uwV»&�<ӄl����a���厇	Ga3
��`;I|��c#C
+J�sp��\�벸-:ˀ�ٸ��%!�g6U\Hbp��X�9X�sL�/���&��K[#�T��L�>��R��(�ȧl#�M�˗�	��iJ�{�����%�cE��`�� ��f�eau'a��
SU
��LpK�-y%aj��Y�ZcsBʖ����
M�$�� �ۚ�_]i>�1�t�1���0w܍Y�+�sb�OI-I摄���7_���*��;��+��B+��Mb�GI)�k���Y!�`����JǓ`g����I�Q����am�a�"f
����_�� _ҡ�\�>,��I�O�S7'�Y�}�/��q
�q�R��
��3��Yd��۪�{Q)A�
0���3m_
3������b�����&��u]��e��s
+�Y���`�����3���2$����&���y��⥁�1
����H����7l 4h�)T�s�ٓ�/��#�7�%eT�-��D�q�wL
k�~|���w���S�iB澁��7r`�fvˮ�ٸ;K(ڙ�d���;�9z���}�W�W�o�[�>��	;��*����܋�/<#��=Ck��>%��2�K�FEXƩ� j��<�r�L(�ʰ�|rF%�]mQ��#b�J�g�7YL��1���נ&���e���Q�ͭaJ�/�l����"������_�<��qY$޵
+�B�Jo�q�p�ɘ�Qu`����[y^
�.6+����<޳u?
+��h�D�鍁��>.3ajeX�x��ccf>��j���y&(�g���>����܃�?y���0�B�
��H�<X��w�Y[q��q#�q{���;�w�G9��8H��Q
+8���P�On)�&��sm܏�b�GE.ޜ¦��BB�,$�M̆��Z�>�|zc��䁕X��� c�
M
[��R�cZ~K�r��R
�Ӂ�g�
�K�V�0�SN�hy�ج�p��*L��F
έ��$�{	*����%�I���U�n�7�ٵr��Z;���:�V!3�<ߪ���M휝��'{+
��@39�[.:-jhe��w�;���nF��k��~uK��3�S�0�|@�H
���^����_P�9��E{�C;�{ê�K����los>,��;'
�v�^
�fNJ>۞d�V��z��_��l�tK�}��cu5j9�+����Zr�1T��E���eI�
`���gyU���;�ӈ�������]r��CӤ2�����h{��ƥ�Ͳ[@{�-�E��*u�@-���i���/�9_9��/�����1���;���
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎
9lv��a�#G�
9r��ȑ�fG�
6;r�ّ#�͎ [...]
��ű?���$�R6��G�pI
:�-:~
�u��k�/��P���s��`��l�Do�bPTܙ�����������%�7����P\���������}��NG�p�㿽{
�}�ʕ�g>�|<< ���Ox�)�����AD�E	��
�
O�|��8���qlr��O.��\�|<-�F�qxq95�b��|]�?�N��|.���?_��=���y���{��܋ߚ��D����?s��l��g��~r)�'ap��M��!�@�_��9�$����C�o\����r�x��+�S�_7����~&����s��9��5�)i�����}�''O���� �u<���+��@��-��@cF	5����Jn�w�U�Q3��FFӮ��3��J|aXO�ϲ[b3�e5;e�l��R�aTDu|�QD�$�F�
+���Yɩi�r~�c�^�6��w���3ļ���Ӓ�C*��IH
+
<��;�^���#��������2�̈�^S
+	c+ku�ZbeVE
����-Cް�5_
+)�;j}X�ύ�h�q3�3'fF�����ZTSK
��Ԙ�	�hmoO��p-�%j�V1'2�E����1x�g��fT���������+K�|ﺳ����g� ����2�2+���i;�if�e1333(D�ef�A�X
+fsp�8��j������kɒ�����<�g�}��Y��#=�em�V���&er>ϋ�6_4�}�I���փ�Y\�[�
©欍�\zP���Ӗo�GZ��>��,9�y>C%a����Š�YR�:�
ңW`>cO�j����iEKlR܂{zz�z�r.AC�+gËE��݈UX�1sK3I]b^x%k�b.~��h͗�o~ \�ʂ[��
hy�V�œl�3OoMpJrN�
���q
�rl�u.
cD�<2�V 
%kk�[i��+������*ȰZ]X0A��O�$��u���cN�e��)�
��TB�'�F��6�+nKٹW2~%
��rnA-�Up�~�s�a^���O��<
+^��.ٞg�G��v�/��
��o���=x�BXo�Ccҡ�Ĭ��8u��_Ϋ�%��P�M28������
��*����A
g��
+�0��3RKq���YX�:�l��w

h$��FU��MX@ҍ�Y娗U�u1/�̬s�Ӭ��k�?��Ϧ��z�M
�L?��~46�;�y`,Cz
��0/��2K0;��:"�O��
+��'Gק�g3^}�
�xrF\�٠F\:q�%�L���R�q��eqTv%�6��n�)a���i�1k�8�;��0;�,b�W$,���Uֆx��Uٹ=�<������
S3���y^)iUve��Q��j�
+z�;�Tt%f��������ʿ��%�-��]���P�V��5�n�s��9�I���[��-�*�Q�
��dPC��Uڔ���`y;
+���
]}Q���^��s��?�_i9ȼQ���z�������7��}��1N���K)+�����_��K>Dge��W+�Ow�
}x�V��}�Y�1+�,Z�{�"ԣd"��1�w#�A2���<*Ԃ06
���>��l�f�EU�9Q5�4�
aC�'l ݂jd^�@8�b�ɭ�YX��^���N�U<«�>����sn�8iUvdl:����V���œ_�'�Ω^�Dm���o_���G�7�ŞDD��G�W��xȠVEx$m��W�s�O���|�U�v�
O�;NRG��^%+��uj0�*�������y~{��g�&��C����_�L�9�;f����~*�T2v��w�w�DX��>
z�JN��)�89�i��#O
���`
d�h�}F
�ӈ
+!	�+rI>$��>%�p	�y�syg�k4 
��:"��s>q��tӷ�S�_nM7~���/�_4
�}��c��OI�msl�~�:�z�~ӧ�i�|@-&#�v�>�NU
�T��Z�{e�[o���&��vy{�%j��/���K�yҩ�}&S�%h\{U�����RY
�#


i���9Ɂ1 Mq��
+
a#fg^��t
Z}����
�bڥ�O�..>��fs�{"5����	��,��Y�ͱ�m�*����q<cSv'�����;��3�2��a
+���
j�O���o�u�9��s�
A�G
|�_�����s�)��;>�jDmf�6m��~�s�מ���]��8�F�LL+��Fy�v^qN$^���s�
�c�_�_�`�Y�W�[���
�
*A�{�vt�yӏ���Ӥ�]J:�O�nv9u\A
�
j��2�A�f7�Vb
A]�h�E�V�z▶bNY{ѣ��Uq����� �r>�}!1Y�=2-n$]����u99�q�P
+�"Z�?�����J�s+9�N� / n+���r�/��L�a��zɐF����9օ�
+��P~�p^�垛�E�|��:�w
jҖ�è��(��<�6�[�S�_�a0����%mdPЌ��%������X�g�yaS�w��
ʺ�Mܔ�
�s
q{�)�̇uz<�`����������ǔ�*���]F�9�������9/�d��.�Y����~S�?ժ�H�9��
q��
+>A㮏q	�L9�4�&꿋t����]���M��[�rr�lN��-�d�1�\>psv獨t�E���$�d�#j̻y5y��w��H�NI�z��G/͹4��UڈYmĻ�����s.��U}���cN�,��5����igq��襎���3.I�p���q
�&1%.G�%59
�
sP�
+s+P��
���K���w�>^�>��{b��TfVX��b���a
MLr�f-ª�S�yѶo�%���|\��E-)+���U�
A-�uK�����1�
�i��B��E�
��~.e�<��1�"nڞ�����ش�">ɇ��]�Ov
�~��u|��Gt^R��c��KơĄ���k��Ԩ�t�i�g�k�~
�W�g�,�'�Z	���שc�-ʮ݀�Z�#6�yl�Eه�c���g���繗2�
9
�K��^�����Š� �-���N�'��\�F�-�*xT��e��-/�1o���t���
%8���x���T��]��
Z�[�j9됴��j^Ωf�ࡈKP���!�8�d��G�r<�Q�a�	�b��hY7�BD%�]�w��|T%#�v��Cz#u�]��))��݈B\��EŨ\@�
)+���8U�q��[%(xU|�-�G��3�W�Z �Iڄu)k�
����~��:z	q+(�_�'nE����e����ZM�{��;�,�q
��V"bF�ɯ^z�:�2�;���xw$bT)��t��p+QG������&�I��[��nᡞ"d���>'#}wS0���_&f'H'��PK�����!e����V���\�a�ū/�G]���<��֌�>a��'�Zn�*�A,����o�c3���C�X�f�
=�x��P�n%3mUgl�vօ��W���;3���Ϻ�!��=��DPG�;8�I+�|�ƻ�5�>�=�9y�q@����|-��'dRG��k�~Iz�v|�}�U��
O�>MN
�A�D9x_�� ��9ڏ���͘�M��~L�uC\ҶM��ik�qj8ؑ���a�s�����#�y��Ѷ&z���}��+®�d���퉶}�Ok>Z~\����l�2�.��
�a�����s�.�� ��{9�	����
3�L���S�� {���:J[�!)�HYD at JǼ�0ք��s�kꅱc�
i'�ռ]TJ�Qqw>�oڞ��ޞ��
��]Ri�.�Pg��|��
0��q��
+�	�������^��z�w��^Ł	�P�i�<��W��N2��a���4h���j!ԩvt��K:��JV\T)��� �"�e��;@�n����B�g���Q�"
����J�	���y�좯o� = Y��8�ՠKG �\ʹ��I+�<��)�i{��+%*A>�w�5ݤ�V�]����\4�o$�2|A�D�����w򡡑�+�[�d��t�a���ň��:@�k
�U���@+�1��>ca�NYX�N��+hʁ����D�ꋬW�H��Ǧ�_�ƾ.h�i'����⃜s��WsN�G�)�����Ӗ�#k�U_{S��:h�괮���yl�Y�̼�
�cM�*kN�*���E_�|���o��r��|2
+ʄ�s2/"�ٴ����H凫#��e��ԧn�1�e,�ڴ4�w{����o<�j�r�y�̩�>Cf�
�)���$�hj��hz�}>5�>���9ge��-��Y;���+�)
�dg��H|�
�~>i��؞�
>�u�r�����
��wC�.�	Y�̹�e�Iͱϥf��Vߴ��=��r�
�<<���{��+Ss̳�cM_-?��[|�q|�U����C�+t���[`a�Jvt 5Ä�ů���N��VJWIȲ��]y�W�N�9%�y��
hu�f�<�+d@��/+$��ԏ�{
+P�x@ҕs�/��k�_��3�/-�������ڊ>A
��Vq�/g���ϭ�GD
E�I20� ��缐	�Zq<)f�\L:xeI蕄�q�����5���T�-j
ňJ����:��O�F\�~�� N�#��p�0��j�/k���e��
��2N�9� ��שP��
F!!da�w�q
+�1/uܹ�1��W�C*)�jɈN�_�ꊠ�#
�U>�3���?��

<ƃ=�~��B�0P �� 	��RǬ
+��
`Aঝ�KA#|Z��º�C �My���>�
lg�@��8��]���Cܒ���c3p]9��^��+�`>)��B���;�����G%ܞ�<�J�����
��h�
��[�f~yjNP�=.8O
�~����(��nX�ڜ�]ܞ�@^⮎���3��ul��˔�i_|�ib�jH���
+�k���\��U-�T�%p�����w�U�)�L �ï��*�xc�u��G�A:ō(\��X�w�/k?]{Q�	��)�3ĦyP��+H��3>������ц�}w/����n�/!^=	y�
O
}���R󼒝I���4�D���"<�f�	54�+�=ZQ�!i�k��w��m��ط3J;���]�,��
j�9���n©��F
�U
Rvni�	ri!��.��bNa�
+�l�
�$�.0x�|롌�QB���x��0
�vKQ�f�N��0�.�2�r2$�e��&�Y�/�%�":#u|9�Q� ~qQ��v�������A�U2�{=��>��Wf�º
�����S�%ň�]����'���_��
xH����|�F�|�gh$�_J#���A%tZ��$��%�$� �
���*Y�'jG<B�u�� V�ع��Cjp`ޔ�W
�c�J�yWJ��j~4>6G?Ix%�|?1���F�%��e���`�I�K~�x� �WXPk�N�����
=D@�&�g�0�JD�bq{�&���Q�+��ٗ![�x��%#����۸_)L;x�q3�r�c0|=}Y��%m��_'�7�T�̸�
�
$킚��w)	|�b_��KZ�����Ȼ6,�R���O�_0��^#6M;���g��
�IU��
e�Ƙ�
���n=v���
���W
���i�Qd@���	��>OY8��'�~�
�\ �&mzNٖ�Un���&�����
�YP�[$��Z�{�����H�A�&�̹���'�c��R�m�m��`��I�i­�wB]7�.+5G?��i�&gi=�w�ϑ.�i����
+쓜�dͲ&ܭ`��}Ő�C��	s�YҞs�5�)~	�gu�,nG��:�*��A��jk�����Ưq���;�"Ԯbb
�3��,huo�`c� f疭�a
F
j
zd��
�+�ڜK�!�T*<��Amr��V��@��j�ˮ���:�g=̒\�W[ �-. _DM�
�>x
<(��>+Fe��"��j`���D�YRk��Z^>���@?�f��˯��.�|�#nI;8�ӐYnm�>��
+�&C}7�a)�Zɰ����
J�hPڽm���թ���)
22�x���A%┶�
�*f�����N ��I_��wyק`oR�@�p�������g֤�gj
-8� xB
��
����iԑ��E���G�C�Q�#H��z
��=
je>�Q`^��:N�����с��/zo�F���H�l@ز5�9�:�����(����<p��J�����'��<�w�>5��D�Ѓ�5,�eT��^#�փ?A�[�g�晧��xp��C����4�LvZZ���S�FnlVݶ9-�؁ZZٺog�~�pj��
�	;h�O���E��6�[�_{ݶ?>ûL��J��ۇ@�E��vܦ�E������X
)���X�ש)�)Ԣ�\��q�e�¥��*F��<���������\-�!�jN�^3�h#!Sd�O���>���~��kڏڨ��`�!�������hޣS�Fdk%�1p��q�
+A��=9�*鄯�zr�}i�E��7m�y^j֢vqsXfg�s>���T�� ��4��~���8���j���	�
�R4��]}��n����7�p�P2A
+2z֥�&C�7@U�K#��e2C!��!a+
4���|T)�[�zjv�
���6 /���E�=��R@���"��ނq���� Wc.��(0ύ�
��z<���>8|_ƭ"n�*�6�lݘ\B=ҮݨZ�u�ˊ�?U?p�ϠC���S��I`2<��J�
�j!�
��U)'�,>��3�RK���I�ј����6`m�`9��Q\4�)�?�%�3�������
,�Sd�YQ�r���
�ֶ��f`��6Y+h�i�%l(�B�ᡗ�p� ���-6+,+
=)�R�9-oM���
��b���)ύ�\@�J�y��s;�l��7��Fyנ��j	���!?Y�m���7a1J���fҫW�>�
|���;R�h�2>�9��Ue
=��ג��
�5�
��+
0VPs2�:��e�'��ӈ[Լ�~�7ɡ��_#%}-�ի�E���C�oh?oN�/.?�ޟ�B��Wg��
j�NF#���呚O�
��
��ZS�c���~������4�l
��V0s�9�_��[}��]rNX�����(�tީ�
�
���5��E5����s�
�Eś�ҼO%x
<5�,�TB�s��t���WM_�fD�i�Z
z����cQ)j

څ�P���y�V��K�}��>
+�8�>2E��8]�/?e�T��ݤè���yd
�KX�4ղog�u���J�z�S%�^{�S�XG�C��9�݈�(͚o�B�Z.�ӈ��C�d��\�vU��eU!G��$� �1j�#|ze1�3Di1��*
+��o��dP�ɸ��Ql�;
��U�E
U[�K}�[��]M�&lj:��k��Jf��$b��i>"�
IK�ί$"2V~Q�Ń:-��wH[S
�t׈� +Q��ѳny����+X�C'��*�p�QC�M�����6��.���E]/�n�-��2p3�꿚q��D��?��{'�8�� V��p/.�?������7�_�/�
�������}�dX#/�|�z�^H%�ִ���ٮw���oOoXo>^�5I6�f8X���T�G%L9e��m��<�v�+i�ze
9꾴[����Cq�Q�6),)�L������R�lĩ�f
ʮ�YT��+��l�v�pçۣ–�(䟀�8�wi�
���ӚO�s���څQ�����5��ӓ��ii��=�6�̊*V_�mOr�y��
�_|o�%�l7��jYLB�"n^��T�~������⯨Uؐ0�+6�w
�-J�R�6~e�p|���ғ�O֟6}z�y���{����W��+��BFK[��IK��9�4���}Zp��ޮh�xH �I [...]
+��w���@��^��B�߬W%X��F�
+��
�}�=
�
�'�Vp��,i�(䓸Sܱ^�rj�q��;nT ^zT�d��t�!�R�|��I�A���S�c�3��dD	YB����D�g`s^�Z���B�
B6�MFz����¢�=�+F���<�zL}��ܼ�?�?�����#}����S���.�Y�OԲ���猲���Ⱥ�O�:�#�;{t�h��BD�KYE-�3�
�[ؐ���<��p/	���1�������\�=+.������/)��YiI���uh99೴[Һ2�y�w�������v�xi�^�N�\�{,�Nԡbœ]�P^�
n1�VE�μ�4m�Afi�ؤ��]ё�j�G]��
N����K�z�C�%Am��<�5�ux�Q�7�)G-̹U�Ԙ�J�֫��H[G�~@�����v�!n���K���?�7~���z*,��ד.a]�-i#<Zi1`0���Sɹ���
?m���{��.#�®
�tΡ���ϨSIO�$<jA��)[�
˙�j43f�\�Z�ClFY�b����y[Ƭ�>i�A\��o��:�~�j�#��)2���Rk
Y��W��Y�������]�O;�ҬS�,R�"<���Ջ]�ou��}nV��
��̹et"���
�w�.B2��-�`�~�8�;ǵ�ϋ��W9��ь�꽔K��g`7j��>�=�ִET��)�P��C����RLB�A�ᡁ9���6ֹ�)։������1���F�'g����
�
�e�o�Eus�ҕq��]A���O".�<!�C��FS֯d<Ҏ�YP�8B;�3�l�4��"޾!<�5�ac?��
+a�t��<��Y���C:=��8�.":�\0��
��|H�$�����#;6^��<�<�x��8�����<�*�:yU�OF/Tap�HX�υz�b��GD��
endstream
endobj
134 0 obj
<</Length 65536>>stream
+�2���xPc|��ѓ��q�N�� �<H�Wf\�N�#.�v�#*�޲��3
u�
�R6-;�T3�-������oX'��ꈁ@v�:
r�L<u���ya��$�
0OYrVx%ޱ>F?����?=/k��%��9qe�"kN���_sO���U�Բ_T
+��I`@�Qb�k�Bv�I�em�9qu�,�JL�N����yI
���(v�ߚ�>}����ú��;`���^��ڛ �(+xL���G�5
k�fjݙS��w
+�X��
�Cf����^ǜ=ڜC�C\�S0?��r�ޢ����*�e�c��OQ�1�3�$c�wl����������1�
�	<`�K�բ
�����s�q�%�3�!^Yw��},kg�El�ҧ`!^QS�����G
uo6>+�����M4|�]���O�, �P{
r�kO��kOQ����w���^�e�
�BB��8
��
܂z}�@B2:�5���.�K����s�A�P��� 
�r������a	
u�.l���=9�)���^��GD�b�jI�s��N����
o�A�y��
d�S+��:�U�2����k1
�[�D�7��E��lP�C|��+xV�
<Dq'��m����;q�A�iV���
+�k�t#/���;n
���C��N�l�jT����D���~0QJ��R��˘	�"R��EmϦ�}����`w��4�h���
+
+��>��{���76P���E����hY/���IFrA�#
}Y����u2ĭ�C�	�=h�Gܾ5K?7��jߓC�ޚ��畠�P��7�~}�Ǽ�9Q�����7�7|����&��R:�ԋ����(����nPL���
���P�4�f^P�9
��iY�������1Z���X���YԲ2������_���[�ٙ�/�%&�4�A�'��n�-�Cm��!������=���[�8R�Qb�
z�[[HYJ#����CɆ�z��ɐ�����\��[Ԕ�ke�������L��Z�
�	imvFݝ�U��^n
�7e]�V�cPR���I�5t�f� sp�Vƹ�\�
x�˙��לS֞�
+*q��K�^��r*�7�ǫE����7

Iy�2��;��i�7x2���I��-k��Po��ǀ�n���x�]=��]��wCR���`^����e/,h������u%���ɠ
��Z��
*��[؂:���O΄�P�c�8�
h��pﭴ_�K���,� U��~F	���i'��� #�ޜWځzD͸�_��sʶf��nγΣa� ����=D��
��N|	l5HFM7
+сg�Uj-���
hHJ�]���8az���
P���j�ޒBu+Y
e��Z���ƾ�_���@�7�z���kdT��/(��0�v�\�mq��qa��!���.x����+`}�Zj�j�ԵD
}Ԟ��_Дr@�
j介�#-�$��S���B4t(�a�n�v
ɹ�]Ե�X�u
#��9
kz0�6�����_����I|��x�«'�
+���[^
�3��OXŵ;��
������
��GtƸ�[�0ھ���P`�K�ޙl?yP������bvAKޯ�ŧ�f-�3j�^@-��U~�ُY8uy�������6j���)
�|�,��|�+C�0ߓ
�0��Y�2�Gڝ���{��K΀y��rJ���m{QQ�ۨ�c/"c�E�|"�oθ�2v^�R1S���̴�+='��|�g
+A
����S�
4�m��"1����'�G��O�/&&8WH�JX
��9��>1�~86ݺ��k�=zUΩf�>u�1�����T���)
�%�6�A+���FjM{^ŐΘ�8�!��$
�c]������
��ޡ�g�a��%����vQ��::N��k��ͷ
���Xe)��Ix�
����>�6m��$m��yq��\穬W���
�mȖH`�)|G���`�9�w`>�H at P95�d]��+g��޽e��\ё �������	jp�ݲa�[N
��\�.�
�z�60^\�
�

*����j��/
1
�c�t���#�B��֮�wMX���Gҹff��Q�
��
�/��(�hHܕ
��3~^wq��
�I�DT�ޙk8�C�,Շ��A����K=��`!�V�:%|&�(:�v��y�
߇��\���{�
�޲��hRNƅ�T�O��*ү�@�Ue��*�.e��kE���݀�rs��뮃�9A
�?
�)=焬o�+�Vl
+�'mMBر2��Lq/"��{)�Q��S�''DU�i^ꀚ�\�=�8���
-�9�{P
�SEC�
�6
>� 	�F���AoV�B��<������ߒv��Ҫq�����h;�k��
w���=ԚM�eׁ"��?�e"�ϸ��2� ��!s+Q7���J��.^�Ց�IN��(�{Kځ_��F�sYܩ��]¦��Hܡ`��P[VI�4���O��ޫ;�|{����X㗉��ØW#ܞU4�f�u$0�^�tg7"�~�a���I;j��o��x܄U� Y~�ԩI�-Z���+)����]�p
+�jmj��]/,��Ԛ�GP���4�'����Y�ˁ)�&��\�P�'aܓ6
��ɔq�����g]�G�g��
�`զh[�Wࡡ��Q6�ӣ!mo�oƂ��D����a"ȫMX�s^������J���:�㔧]��\�]����aצ���#���k���վ���ڐ�kG �g�5Q�/"(ad
ݧI��D)��]Ő��ˢB��U���JI�l��+ߚ���Hڨ{(�7�xP�D���ȅ�G����
\7R�������eUxw4�3��'\JFڭd�����SP�B)�a�@O1�3X��{�"je>$gS��	�x�s�v~��naI��Q��5�!A1��Rk܈K	�dýw
+������j�g�'<:�J�_�<�v�ů�Z9%��ǀ��=L�
��� K�մ�S�*��!� �ӖG�{�u{����W���r.��xW �[+��&�2V
����� �6k�߭�B����Y�t|�����ʿn<j9Tt
��Z�����zM!���X��%}:E�3��A
�~���~��g�y>��Avf����<����=��
�Q�s~J��Lī�%
*f֫`Ɯ���Gֱ푶l�	+valw!��>9���ŨRD���
���,�2��UR���
&`�ƜCA'����
|LF��BnԂ��IЛ�	V���Ő��9{�rQqQ&xKݛ^R)���h at -�
5��#��V���C��x$�7��,��k���u��Ꝝ����C��נ��u�a��
L����L&�?4��n�s��!4�Ӣ�,��-��^9����ڄ��3���{�


��ފ+�c�%ӝ�r�m",�]4
��H�4��߱c�Wǐ��Ʀ]͎�T
"(��
�wC�Ν9��=�D����%���N�-�O��lM�OƦ��Q{1���|��+h�
3~�4
^P��Ʃ}/Q��Z�%�eQ�V��)���
�jX@ŃlF'<�v��f��
̦e��δM
l�`Q{�q��C��PYzRJ�ղ�ְ�� �Z-�8�wa�5v�:9�� ��Ƞ�jqзB�g ��6�<�<����XǏ��-�['M���QE�2Г6��rN�KIG
2��d���EX�w�U{aC�‹�;S¦�ۨ��"��^T)+FŴ�HyY��euBR7+[���[ڊ:���ٕ���*��l��"pt!���.Iu�����94���o�
��*��Ww�
+I�ɼD���S�����1j1⁼M=�`Vo���g����j�Ÿ@݇����|����Z	���/�8a~%���
s��.�zz�����Z�ܙ֤��?�.�f]J{�5���W�,z��kqj�S�П���]V�ו��]����3�&�OȞdT�E�F�@;����5��)��ȥ����*��K�����zq�x3�h�5b�]�j��_�аJ
������`�͌_+I{M�Ddp��*�@`rԧW�A�)�+�����o!�����8
鹑�
K�#��'�ݜҲ��'���3�������
�
\V�h5��+h�ؗ��w���(0�� ��s~Qk�J;���/�ܢ�
��.��F40*��A�~ ~t�T
+�!q
6�T>����q8�t���<�W_ABo�t@[Ȑ����%���fq
�K��ǜ���
�lr�ws(:���;c���qΩݐF
� �G �1�vq}�!�����-�ԺQƭb�]j�9'��	I��������%������%�YDUk���1���
�
��V�,���MP�=ÿ��ճ�^�Ϭ�v���ɂ�����]�N��1h��f�u���q~Cڡ�dlZ֮�h�Ǣ���E%�N훃
���Q�0+0��j/$��_���
{�L�
��>�tb.a
���&gY������\� _�B��rNn%��V�>VE�-���z-	^@�������?<,y?�h;��"I�p�V��{
䅜G-ȇ�*`0�:
�����j������$��~�
�.x��%��>
��N����<xu/
�����#�(��]Ui�qN��lN����9���a(�nO�FL�
����dT��]ⷾ�W�ǭ�{uE�lbQ!�[�w�{=���hz~r
��w�!/e ��T�
��X��#a�i�K��A��
�i�OܙrH[2A�Z�=?�e�#}w��u<(c`AaK�˸�skY�����p
��_�{L.�{�nqT��ZJ��!�P��P���̇zo"N�
+
(��^4�+�$}�)����R
+��w�����Wz��FU
+��N�+l@<��/lB��&��M�����
+�)�p*< ��s�Aasb�yrm����Q���9'W�2e�e�9��4�_b�ur�U��#-_�>���tq�I��	sJ[�Y�
+b�cNq�uf�ui����ṭ�!VE{f^\
������
�|b�}*6�<��V���/l�3g���i+�B�:c��̰N�|\�����]�A

+�yj�4���Ӊ��Ø�W��*�S�҂S�
Y� ��9 O8ō�ι�$�Xj�q
w	j�"rȧJy1���
��䬠4g���.Q��Dہ��M�e��U�C'�VA�}�O�D�z�ίN�v
F,��Bfߍ�n��w�Å�<��u	>c�?���bDB#|�F�ƹ���'�:U��'�$L��
c~����ΣY�
+�4S���y[3⊌�{�q ��*��rf�#m�]�F`	`o��z�Z�.,j5E���[A�7T��Y&���n�
�p8��˘���]���21�">K?�v1�#2n��_י��H�B�4��jT���,��$�O��C���B�(��5:<(l%��Z�'h��{��0D֯U���{�%��Q9��qYR��.qSXz�*o[�\B\�C���ogN\����#TpI�g*w�-ܲdR̫⦭���	iE8�
Cz���,�<�d]��S�B�1�GM7���.Y\�{R�1'<*6�R1�6A��xǁ��]V^uL�0�P���VJ�t�wϡP�㺩�
�3�)������
3&�x�_���X�S3���Q��姭��oV�i�I�g�����]�[zN;���\��º,�u�,��瞡�WLL�K7^p���%5[�ܳ�O�������l��E���-�.<��z�%�Gd�[�:�e]��F��̼���}	����S��[c�s�{-���/vEf��̴��� [...]
+�w&9g��о���[6^�|�1R�iv�y���󬳈�}1;ϻ��{:7�jϙU�]E��*�2s���7|x?���ھ�kߟ23Τ
�ˈ�Z�5�����z&f�zǫ�P�������J1�����(��<
+��J�f��L��ԥ�!6�q��yI5�w�Y[z�s!N�=Xy�k��Cc��q�%i��"5+�LؤM���=xa�k�Ǻ�1� fqC1��)B�$=J.b�4#����<�$��ut�hߌ�rfNT��Q�$�Um�]مX�;�3�oG2f��|@FG,�j�!o'�?Q���_-N��JFέ�'l�zޕ��}��;�;��
s�߆��O����S��P��!ic��Mюe
b�/���ݐ��y�dX��B��KX��Y}�=�p���1����g_�G�/;,�� �dA?+�4���f���ׂ�
�XG3��:�Zl�w��*Y�X�h�~x���b��]�C
&C�jT.?�^L�k�[����I����bS�?�&��'�-�s�ǩ��L(��~S?��9��V`�+�'�0�O�qNl���_y����+���ŝ1E��s����OB�Z>�z�9�5*8��Jt�6P���Q�)�*��Ms�A��]�}p�%�H|Lp66�?�3ɻ����k��/I�z�!n��lm�{� [...]
9�䞍O��m������{�a�ߗ�t|����cvBT��dm�݉9���$����
)�dΪ�J�Ϯ�t�h�� z���K�ѕ�
_-?n�b�Q�7�/�G"�ۿXx�:}Һ9����b}�
n�t��`�v�&����F��S���7�3�yjo�AG4�
0=
��
N 
$��5F�l��
N�
�e�9��
��q�{6����f݇�u��X)�G��s
)�N�8t¤EѺ��s<4��������?�	.�*|���4xG�
��r��sY�AxX%)`��1�!���?G�5|�3J�)>�>C=�E4�Kٝ��V%�>�Ӣr��,>�������c���/��sv� w
+�3�Y���
+�sԞۗ�W
�l��\JL2O"VY
hmjV\	�">��y�5��ڳ�o�7����o����ٕNJ

�8���<`
X�C�v�)���=ڷ[#�#����1��y�IIE����k��g�߅�:m���iM�o�wھY{�}8	=	~p~u�sd�9�����o<��k����Z{�z$1��Z��d��Ĭ�n��8ń�O[��L�Od'��V�e��絗�3;c������H�ױ��?$�;&&��
w��_�����#�n�����g����h�&6N;���C_'&�S���W݇�sZf�ܧڙ�u.?�^|(8���.t���G
_�G9g33���׬c�C�B�y(�
CRÂZ��Z�<w��ʘY��1m��fS�r���O��ݪ�K�F�;m��i���#��
���\vVR�|#*�z��i��P�n�_�o�
j����8�։SVe�6��3pYj�yjc����ǝ���[?�\�|\v�_�Cum�pO,=l�|�y�w�ếص忷k�~����է�á��#Ӛ�?�h�~��m�0
>��]�e
��qO�5��:��y�
��r��8d�f�.n�e
ߦ<n�q|�I����?��5|������E�f�	̦�q�6��b�
���y�z㇡��S��C�y�~:9.�@l���)e��Sh3�p�V��fmɯ'�g�%z��#���}�8g��2�vt7̮��7~�=����h�V�'��K�[}��Y�*��C�O;U��UѶ�Zp6z���ǝ�.=h���s�=�P͟7Fh�w�?�j��O0�`
)��Z�sN^U��ud�E��w+��
_~o�u�AϭƯ�S�j§'g��[�\|X�����^
+���������o�rK�[�K?���s40��q�Z�G������>�V_��k����p�}b\R��P�o��+���\{����j�
�5X����s��_ͫ*>N���$�H˗��G��������o˷k>�z����3����ƿ&&t�_��FV���
�`������
�({o�aӧSڲ?x���.?����j�t�i���۾^}����f��6C���
�|�8��v47��&�-�qѥ���c�g?.?��&,�Z����ײ��g�S�qk㥮~mDx:z�����?������W������&�[PO;o��_�n�.?m�:r��s�p��΁K�ޯ�(9�8Oz5ҌYѶ��}��������>��n���'��W��|�<��Ġ6�F�?�?��>r��
�[O�n�朎�ii[3��SŢ�e�ƺ�<i�W��al�����O6}��|�M�g�{���4p��k�IO_��'D%�a���S��_����>��sde�w���o�)����tz���/]���gm3���;T��I���@������ZT]^y���w��O���_�5������x�����TT}��y<5�h�~#����˥���=ПõF
4��2�Җ�	����{tmT\����m�J*�W��:!8�/c���~�����
���Yx�prs�n߼���
ݪ� k��I�u���OOӏc6^�P�����M�O�4��]���
�7��
��|�����쌰�z���~�߂�5G�A~�}bJ�?�^�}�����������}��E�w8G�+��UC on���/=n��s���C�~o�_������ô#�q�~߿n<c�
+=h�tZ}���HJ~5.��of]�oDžg��%�ؿMJ~�8���k�U|���e��Z�gGo�{֞���(/�DŽ�ܿ��j���q��_me_�i�����RW��RZ�hqw	� !�D ��K $!	$�4F�v�;���y/�Yt�]7'��qo���'=�(
+�e
&���y��帶T��b�.�T��./��:0a�
+t�V;9f_�* �-��
���
~��T�^_��T'�t14��
�ۥ��s~���A�؇��]�o�6�WC����Rc�+�;��G�_m�{Z��і\�e�g
(���+�dh�~;[��2S��x���҆0�B6;a^����+M�w��J~��vDԕAb�
� 2�<B�Z�?�f>�1��L	S��U�=]nH{i���I�1.��H�}`0}��N��`�6�)�/'Q����w��_���_���٦�"��n@��
���s��u3��<���g
+��Ӓ!N!�h�b#�m���P�q�
��K/�8�%�-�}�fW�W� >r���cV
~��X�~�i��2�}ִ0��N��R�m��ԣ谅�9q�ˍ�b��s��(�����Uy���Ņ�7:�����O*n������k��/ӂ�7��O��� �;���2J�W��	w�r���@���Ҁ�t�Tm���e]]��ERA\�"E���oG	�OFqI��;|�͝� ��O�1d�B��2��ӝ�N��qM [...]
�_O�<�VHsȘy�1.�8�
��z��俙��~��H|0_���PM���~Yi.��TG����-�A߬6�|\mA�
�����^��}䜒��w97�O97�O;⪔u�P�8Y~S��j����1J���zg�qYŌ��&ݖQ#o���nouz�7!.�	�c����mR��f7��BM�S9=�V/2��Ty��!v�K~�?�������(��lE�����g}ذ��v]�(�pa�+�u?7�}/9��2��6
� m)���Ҝ�B͍�5�������F����w��X���@|�h/�d@|��[l�������^��������]	)�8�
��`B���K�I�=�I\��x?�Jt����af�F*p����Zk����Յ�
R_���$ſs���������
��/lj?�̕G<��$x���l2l�Z?��)#f8�l�
�����b��l�_���;��2�$:JZ������v%M߈��,O{�*��o�-�3���V�
ެ4��lt�|Yn������
*��[`�G,7�4��
�����\�q]��O�Q�.F�g�L��.|9W��l�
�� �/Z������z\�[L�����!�%
�IiG at n�I�|WZ��ϊBnh��w׺K����/x?N�bb-N���;X��ԓ�~�5����횡5��PM�w�������Fn�G[?�;�o��������䯗�
+#\'�e��d ^8n�*��rM�3S��P��6������&�_^Y �T��r�.��J]���z�1��=���m��}%n��c���A at F�4[��t�wkQ
w�=�c�*�H|�؄M�
n`l�r�
�LWf>�qs^)ʡ�H)�6��٧j1w��
��O{:W��Ԕ���T�a�
0]y+.
+��
�
+
���1_��l��V��$�|��Q�i��]Xr�����b
<�_=�i-���Y�Չ �Y�����P_y�GO{��˅r܇�~ll9�vsѷ?Ʊa
a#����5F
�a
-�g�g�|�n�b3���|���]�uY.

�/f*��O2��Ms��{?*K�o7�� �%��k�o �r� <����݌8�q/��55��zW�� -��� &�?
��=1�
h�y�e��ʲ�x�׹:���ZD�L��yWBo�alv{Y����!d�*�є���-�`�(9y�{g�
��<DI��D��"���<��t$�c�$p�-�Չ�Y���R�k�
���L�����=�!B�������+k�Ĩq��8%񦚗��q�
�݇	ۗ��Ʊ����7+�>v)�t���Ջ���-���]���`MU���Nj��Nb�K�!F%�y.�%ߖ3�LГ
�R_�02=��ű_���j��?�5�(�;�	�9CGΫզD������
@�P�2������_]
��G (Y+�{<W�(殒xc�������P`��я����9��z&�>����JwY��}��$>$G���^�x���}:���
c�x+�	�ql�MR2[���r�
�`k
?)� ���6BJ;Pb����O

i��2_:'�E���K�%�
��R�Nw�'� ��.)�j��RwI�U���)j�ܬ�z��	v�K*��|Eދ�qb�?s崳gW‡�Fx��
l�J[�����'^��qj��nX�%C#��4BL֊
_m�����(?���F�a7t�YO�j�ߟ�bh��Lp`'�
�����f��sW��n���'*N�#=�����r�	��<,,]l����*�2'�}����W�?��A�:���fx���8�P͂�
�C
�0��1b�M�(5
���Yg9O�[�ZQƓ9q�{�5y���k�
�k
�GX��?,��aJ᱊�u�%��@�
+�w��~��k2�
�'�D
Lb��������oB)���d\��:��>�F~{�?���~s�<偱�t���~�؍��=�#��P��S���ݙ�f^xm�=��/-�x�����7;�Ĩ�z�K5'�����V���.B��ٚ���My�W��Ib����4��I.�@JI86�!�G��=��r�jR
m�~1�3j�����IR�U��o������l,������פ>[�(���?�U�?��A;�+�-����aT��2�}����a����g��r�T��-�,�� n���o ?�[j-�Է~�i+�
�dJ�	ot��gƮ"?�Pi�
<E��h�����QZ�������)F�}
a(�6%J�7�O{0�O{$�F�4E������ׇ�0�,t	�[m��ZA��!x�C���s��
 ������D O\��
>{ ��<BL���
��#�3�
6�bb�J
�<���
(�Y��~��=�.��
u����H�K
ĀCu�p_ [...]
+�f �.��—�k-�o������b�+�]l*����1
�cd5�����K��AB��>�4�
��|3
����y�\��b
 $�%�"@��O��_L�3_��3
�� ���.T�\
���H9Fӈ�o�\n/��sF���8X濯�������.�$����Z猈m
����!�
-��v���	��9��3R�圄{K��ﬣ�8`ݟ�q���G�ʂ�k������T�_
\���M8���;���v���E�@
�>�D��j. ��m��c6�0Ẇ�g[��O����z��;DItH�y��w2F���1&v_�,�,���Ԟ}~()
ڗ����o��uB
N���ԗc�𿖚3�MU�}
礼^m��t����A����}��z��7Z
�-�%?V��o�3�n��y�O���O���pQBX��ɚ�Ƚ)Z��>�� %��v�9��rK���s�
�'��?�O! ������+�!�׺�?n���n
�|��##-#��\>l�ӏ4b�e����Z��Y�-�%���#o[���}=�=ۃ�+�r���S��HK+�K�q�Q���������ǃ䐇@6��-
+�G?2��c
2!nW&���ؐ�j�
۟%�صT�S�����
��fz
)Yh�${�b� ��[O;�?��B������
ΐ �т�g��泹J��t9�6NJ4�h\��!���hAT�s0\�qJ8�}-�DC)0A��a��qV��w�Jr�V_��u���Zk�ǝ��OG��=9�x�����[C���a~�\�
໿�{��� 柭t���u �q�w�	).�>n�U�ɟo*�4�Kz8Ί�7W��n�
�k�/
ޗS37�?uͅ��
�U��\lJr
&ݞ`�>���Ս	���IN����6�E]��}�U4�9�TC�s�бk�`�ծ�W�k����Z'��7]��
���Td?#��!eƿ�`E?�@�\�0C̵�z���
J�qO�}��b��Г)vف�V�3�*��u_%�G���.l4��v����
+Lܾ��S�k
����qQ�	6�2FN��$>�o*�6K�	f	1�@Ł
�Xv�tk
�ӡ�nu�6
9�,�vO�}C�
mU�����9%
��\�8�����)'Cw�h�۽0�������y���1;#�,���`�e-7�~5`��9���{
�]�O��W��{):r��ޝ�A����*>ѡ�"�l���u����v��U����ѠV����{Rt���W�]%�w��ޒ2 P���X�A�T
+�*�1Y�jn���:a���y�3�P��A|�j6���r�����^�e���8���+q)66�"�$�fظNN�/��]�0�r�o�i�D&
�1�
+Z��95 V��u	)=���
+
�7S�dR�p���/�
��6���,����7�|�{�_y2/�Z�C�O;���>��{J^ٞ�]d�%��S�Vz��-�ħ�L�W�@=����[k��m���]�(�09ũ�ٴ
�"�y�w(g��ǘ`�z��쓌|���jƅ��HQ�vF
&�FT�a�
��G��1r,#�BC75V'�����G�'Dؕr�tU�+U%��j;6�1�F��
+Y�1t�vw��Jk櫕���{
+f�4_��|��D��x�惿-7"��$ƍp�>�A�o/7���]��=�_d-��,��
�G�J�g3�#5!}�)��f'#�"���2S4��� �?��E���=���>,6�"t-�������w��q�8�ˋ����Z7�I��uh�p���ڕ�!�	��&�0�
�:F��v�!_�]�jb�8��Gj1k��

x@��>J恊
�5��"%�[�8���e�9k:͚�f�d9�4FI�����IZ�yd�(*tk �݇�<T�i����ڂ׆�"oc/>�XSNw�Ye�=�hue�K�8-�XWYy�	�RL����b�s�:��B[v��4�
��]%O�~w��� ��ց�����{KwGљ�j�`���dx/8P0�vz����q�e���2n��\}��]Vw����
���m��:NK5��z�^S�c���YF	1���;��b� -��KO�y�� �5�{�-�ss
�1F����
+N��Nj�m�s���L�$
|0ǡ�Z����<�>�W
�XR
�8\�� >���^��7I�b��l��Xp���8��������Il�y����)ߕUQ�#����/`��)pW-���=��H�.X������ch�c��i�b&.�"��!�V�`_�R
+p�U<����-�	��Ġ�f��F;3��̊��$~�]�Cfݛ=�]��.v�|
%h��x�*�{�I��[A��
�u���P��m��&��
�x}��N�|����9��Z�(O�<��h+5�cKy���fl��
+�dXҳ*���*ȷr�H�(5}O�';�Z��*1ˡ���
+=T��'�6~�z#��Y���H�� �5�S���;
��`��d��>x��>��}HX��
���-�vN�2g��������
��O�5|^h�zy!ɩ�–���u�v�������>�@����jf�z�0uo���7,Ƙ��IZQ�s��
/��5��iiC��ۖ�3�JN��t9�d�O�SpJ���[�%��ƈq'*.�2�+n.K�֍ȸ�PI�<i�=�	I۽��

�o�1
�d���x���h�Bh�d�&�yG����M8�c�%�ۃ��+m`��^��f?.�������?�zY�G��}D��h&���(���*�z'�x����<�����b��t��4�x_Y��=g��1t��j*�1�����z9a�x;Cذ�~b����s�[�q�]�a���oD{/��?�5d~\j��9^�U�^���{�z�$�g-����jD���&��JU��2��)�����~�o�y��@Ǟ.�
N+�2^�v9�]}��_��&�Di�BK�����V5:�x�EX�Æ��pR&�(߻)%�[q�7��Ia�C�(	�������Û��W.�\o�	����b·�rN��N?6�%.��
+�aVSs�:�_卤/�j��	>��
��
[rOɼ��I�
�����P���'75�
+56�bZ��__�b��^l�e=�G$=Q
+�[}�$�8
j�"F:	?��
��D����MF�jŖ=��]e&�\BE�_,��v�q��~��w)��
�߁�^��B�=��/��3����,!|W^�ܚ �ݤ� �Z�����CG����~lɣνы*|�P�y�(�����G��wo��߾��H��>D/x��C� t�r�H���iH��
+�k/�VV�}ܖP�����!f�8��
9- at zh(_5��T��v	
t9���ET��URL�B�ߟ���}
�fb��r斌�-EGlK�o�i�@�)A�j��L@�c��u�3�
�"�CC�^.
+
�������
P��gi	a�qIo%�� C2g�sNs1 ��z����⠏t<�}����Q�<�����T��*�n�}�^��^ �D]FE�]&$��JM����R��Ҽ?]Aņުʍ���ONtL�I�i}[��_�C�X� �n� ~�Z��K=�p]��LT���u�
�� j� 7�
+-5�Z���?\��z
�
ܸz}�6(/���1~aȯEA���B�46s�/�[�
�q�Ġ��Ef�%���I|���^dSq�;f�� ������_�ҢnV��_�D��
�!,�vc$>R�2^�0�x5��+
X瀁��
+�'B�]��\*���{��޹�=�s���CЫGwA׮�	zv�&(��5(7��B3,�F���XK�w��P�6hn��8���9TA�������_a�^�F�\s��sP��;(�������-P�7 ��@7�\E| j9��q~���F�M]�	Nѓ�
+�6v�d-'��B~�*�^C$�\������
���5�՝��o���^=}u} �w�/� ��_��u� �����s�Cʄ<_n�~7
0�
�b�T/n���ՌE>m��\P���̔K���⽾�2����|�A�<@�O\@o��xx�6��?� ��{�|/@���?�j^[rT�E�JX(�2�h��^hT�q�}��Q1��
]|���p	���xh 
�t{�����#��+�@w��zs���yB?�^��E<�m,�h�@������qQ���/�
8�1�m��~5
|
w�$<�����=���>���� ��wAo��ݻv
t�����Ϯ��y�R����3O�E{3|�O�Gٮ����O�P��4� �ёb#�/fz��<>}���(��;`��^ܾr{����uХ�������Ȍ�����B��b��Z�;)���2Ӕ���
�k%<�!5ؓ�
?��@
���=s�zz
+\���ˠ�{���t��_ �A��J���5yo6�`�Gst̿������ e孎r������j��n��£�s�󏄯�/|��9P! �xpt8�{@}'~v�F�^�'��\脅Y䥑�|X�m3��>Yp����Mϻ�I�#���G���{���C���/@??�]§fݩG�_M��A���o�)خ�
c�Ѕ��bUWM�PMy@��̸�Ȅ�
e��҃@�_<}^a�A�߽��/`O
�b�|�����RRȽvL�����J?%^�ITU�?O�пO5��:Y��
��*,�!:/�j��'(�����=������t8�� �{�@7��
+r�q��=�,,�z#,���j����I�^a������@�V�f_��ިD���ef\���
z����3/������@�
���ܾz����;\@??{��Y���[�$���b�W��K텟,
+J�a��?��a}���\
+b����
���sP��g��ӧ�
_���O�����7�><vE{�^���r���h�
�+��n��n
�C�ڰ~�Vr� 󪋉{!�An�#�/$�}%x{��?{�<\��n^�
zr���A__���ݼ��mP���
Y!�n�p�=
JFɡ��:X�s�����
#�O֖�U��T!�B�B.�}�J��`�t����� 8|
+��#���7A��u|�
������KP^H����ӵ$��>^�i�IhSU���)��]���NҏVj�DRĥ�OoA����|^���{��u w at o,޾z����8C�go at nO��
+�\��$�э���Տ���"�ڟcbvg�My�8US�&����7h�d|���
b>y{�
�|�t�򟠧7n�����S�k�,���]�f��#2�/t�k�\g9)#��Q1�g�Z�M渵a)O;H��b�%:��VQd�ut2�.5v��U+��)��n�n�5�v�D;����b�tM��dV��K
kc
T�>w��^bҵ�}ڀ��s	�ű�w!1�7陷�I	�))�
h��T-+�0@�_�.���E���
��a�&.�4P��p2�N
"F
�.���")o����r�B�3/��{��?�
��c��{O@����)�৭(���^���I�����"�iB�^�EȔ�吸k�<�Ǹ�����v�"3^ӊ0����/}{�zp��
��^{�~|�v1�[�Ŵ�ԋ���+\X�!.��R9Į���'��$u�V
�U��͈���j�f��x��!^H�?/�̼���G��7(�k���;���;���!���0Z)έ���>�g���0,��ڭ1
��e���-��Ql~��nďTQ�������yQI�S��.{���}Н��@�{�RC����@]�)�q�CU,��UfQв�u��r����p��qK�Aj�I?U���.�M���
R􀜕}��q�4%�Nط��|?x�~���b~\L�y9��HZ�U��UVG	5
�#��j�U^A2+��[���f�g}7=nm���h+O��C]0i1W��}�dE����H��t���K�׷�s$�%�ΌK�L� �ﺸ��z�w9?��Rgi�ɢ��x�' �a�h�V [...]
+�RVQ��>�@�+���
u{�j��4��g���
+�� 3u���s}�[�=V�X
�,T�W�*;�'ۚ2��c䵵Q"�� 
�Z�T�!m�K���{ŕ�������*�E�G[&9НqF�Z'�EBL�g�Nr0ã��`"֤�D�7���0�X�s��%[�ڜ]Gƺ�q��*�c�8�/S������bÐ Ϫ ��4����Ү�i��ַ��6�
�״��p�5�()�qB���쓢�>����d��`�`O��
�-�r��jQ`Ky�GC��k���cU�,�L���z���ڃ���J������ބm���Q1�VF(�Z@���?U�������EIW��@u�T5|f��2��
�|p� ��lGM�V�i����
+�sV��ϢP���#

�5��4
#�Fxy&��
+�)mi����"l
Rb6���z>@��5�I|0��ɚ
i�u�@�m�ة^qኤ�a�l��U
H���hue���!ȷ���l�Y�7ǀ�hyv���1Y_�V�'{*�'ZE���Dy
'L�WW���j��z��09ja��ԇ�sh�t���Y�B~7��~��]3��kS
��u�5�&U�
+x��1R����k]q��9�7]N5��R�R\�q
�Ӧ�:I�ޛ���j��[�T��m�
͵���յ-�kLS\�q���6�
+ڔ����Y�W(:���OW	�T�@�G3��Yj�q��lU�����v'jN��dR�1�2>�$�b;�+ٶqJ�e�
��G�X��l�7�o/�hj{��9"����lR~�ᔈ�+?�!VQ{6�"?���8��h��U�;ɂ����^��ts_Sɵ��x����2Y+�UՊ�
+nɺ��!!D�d�4�)�2Ƀ���R�;+���
��J̀}��j5æ�B�
+t�� �ݡ�$�Z���|�E)���U����z�5����-����
e-{q��4,�՘
%r�gbO��3���=2�y�}mS�|��Kp.V� ���tޏ�DK-:�3��)f�I�+��~<h��!2Ϡ�
��*ʖ��%9b��#t�}�뇎č��p���x�Uw�T�aQ3
+��9�|�
p��l�cZ@�
�e�v�}v�,��lm�Z6L�~�6����E&�h㔀���d�
+2�-
Q�&�
͋��Ԩ�9,�&��l
#C�rZ��u���O�}
��3R�ݟ�y�=���.��$/��Йp0[Y��3�u�?�J�h�Iu���iY�Hiи ��dE��]"��ze�m��K�2+H��^�'�Bѡ�Ox�!���Zr>-�|v,��
+�;�:�<������q�s���ib�c���3\�9X������P���Tv�;U�=MS��4�ġ���$��Ŧ��V1c����LS��q�
g� �9�i�)r�]�O<�0a�S��c���[��sM�s
�,
+��i*ب &��x�$%GՔ�.�x�Z�j?�k�u�Ŭ]))�4R�c�����ݦ�"GE��y>;C��#]m�����9��lS�0��Y�7�!�;����qj�����f��+� �X'z>�|���,!�2V��
��9E�
骛��B�L'2`W�A�k*�4յ�S�=�dk
�#���
�3��s��*8��
+F�]�,��{���mj�Q��aF֡��s��ږ��7�A 
SN���$<���(� �sL���KM���q�\M�MW׾���5*�P�$%Ӧ���g�I�
l��lWv���=�e����_K���9r�MIL>�� Nj�l��Y�>l]X�?����ٔ=5%{�
�]���J��C]U��BU�����,�=4Ԏ�6���k�\�k��ߟ���I�<��Ģ#���x^\����V���;��t��p��[C`ϭ���3
��
�څ��;FN?Ա����������&��^$oLq[Ɩ�/�tm��`�
y6K)9ӟ�lfa�
+t�fov��@a�Vl�3��s�k���v�ۛ¥�'��st��BU��&}T�jQ�Qg��Q����;�Oڔb��1�S���%~��F��4+��f'��&��/���IR�����P��w$E�Z���E��k\�!�o�S���������n��O�L��v'����ƑBo���MQ�]�E.w�s�:�y'���3}9�|�}
j�G���{�E����
�QF�y�i�⣷ʾ�
�8'0Q� 
�[O-��P.:[UΰQ����gK p9ӡ&g�M�![L�F_I��K�棹�F�� 㘠e{˾:%����r�]!Ĩ����T��
D�o��|_�C��9E@�B,RB�]E��i��f%"�ISY��E��X��MML���Qv&�,-
5I ��Ib������C���ㅺ��>�V�;AI�H�A��y��y���Č�֢/�
���ږs�?%$۔�B���o��Dؕ��������)�
� lg
��'K��Wy�=|�'���J
�%^�k�n�6���Lp��Z�pwJ\nQqq@}֟����:���%��'8��mS������#-��l���dX�6ys���\c��y�w:�!�ς9�Q
+�gi�����Rr��|9��e��$�G��شcC��Sr�4
�3�j���
��E'�T��OdR0!�cԌㅊF���>
�����>���
6�h�~0C�
d$�H9�����H��2��Ƨ[���4>�h�Vr�X� �]�Y-��i��y
�l�Vz2��\�L{>H��2%�zs2C��M�����D����:�h
�f����������1t��8"�:I�;������}]E��\��h���hM�p�
+�\�ص<�j?.ԩ���D5�c�g����}�㒏�+���~o��f��N
��x�e�9_߷��!�Jz���
4�����]6��:��<�B�`#\z�����U����DY��`އ��
ץڬ��mE�M���Q�;A��ݽzީ���[[N<�! |�N�)��#���g���֡e��^+�:�3�>ɬ $:4��C
1{_�����4
KvzY9�Qj⾔�f�G��?����%�S?�k�3�Y�+�9���\�8��8NI[�F��#w�x{2n��eQ�sϱw:�8�
�5Ǻr +R�M���q\�YFj�R|8����a׈+g���fh�3-6�P]d�ƒw$���d�u�ѷ�ؔ"��lu��p|�<�ߥ�'/�c�j�O
}��|u롾��9Cɷ�Q	��G��'�-��9��sJD���U�ˆ�������]�;��g�HQ��	d�s�
�<Z�� 6�2N�?���<��ьX�?��:䄴�~x�s�Yh��H�w7:�"�k�f��
�0��p��Z�i@-vyγ�{+��m%��$���ך��_����7D-��)h9��r7F`ߖz˼wFI�ۣ���i.�ל��hZ�<��N5p~Rd�lmړQR�ݭr�5���jq�[���������l����r��2V�s���x���*#�.��[k�=T9m���{�Vf
���W'=����o���O��X�
+i�� �0ɩ�
�`�+<������7��G ���_�4��
�`���Â��_���K<֡�R�I}��Bd�^mT�^>�nrK
+�w�"�3��yb��*��gyL �p�Nm�xo��8аʎ����xЮ�O�i�}[i�D��
�&��RJ�����^�fj�1NM_�G���"o�'y�s zk�1
+�����`��.���
+}�{^(ؔ����熁��
�����r �P'�����o��;��i��!��@WK:�6L�[n(��P��\_��l�2��|e�=�@�7�85s���~���&e�N��{S
��
�;��\���h
/	:�eS
J�.���u��I���c-*vO
����wC}�U\��LC�U�|
>�t��}��9T�
�)�*�����g��7�q���҄�.����Q`�`Œ��_���;���O5��ƹ��ꅜ�@V8�{b��D:�c������ojm�E0+��
l|��<�Ꜣ�*�YN��.�e��		�^��M2Kϟ	=��
�k�*�,
+r�YJJ��A�j8�w�G���f+� Nrj0��Uzd�5{�a��
+l�I���U�!��ʚ�9R��{��s����i�9,pg��<���~ؤ�8����;F��O�r��fWQ�ML�N?<b�G]�P��l�[����߫u�'��M{&Ҧ�'��4�� �kꏱ3NLږ�Ӎ���v}#���*烩��\�e
B��d���^D�MI*��*�;[��D�S�M�(
�͊|��EB�?kl��-o������������۟��[�W�
�SJ�4����"�������\ޡNTy:�c�̳hv-q����^��
\d
A��t@?�d���Ar����iS�6�O�V
���j:ءfY�Iq�q�y��e ��>BN=��
+7۠
�^��j;�C)���Dߜ����%�Ͷ��������$�Z'x�# o�̊+�Rb��*��F*�
�CP���s^ <�(:J]�����i,���|{d��'�z�13���Ӽ��jN꽹�l@ò���q?M#�̾�<��/.y)~O��D��ߒ cM��+�i��[�]w'`���Ұ)q�۽IB�?��9Т�_�@���#�V
rk�-�ぜQd���+�����iy�S��eWPs�#�НAt P+�[}�_�U���
�냤p�C �o
���C<�;s?ن��;�9��{S�OfHeS,��8&��{�$b
C�
.�OV��#@�
Z&Z�Q�m����g@�0)h���P�>�2�
��+	V�R��k��;��|'�Yt5��"!P�[����&ț�����!x�y �3X�w:/ �lU�C�D��C�Ce�k��K]����R��g
����TK���l���_�
j����rD��.��u��6�
+�O��'�7��Y��"��
"���1�
���z��&q__�n�p����@V�Ӱ��u'
��[c���1R�SSY阭�ߔ��������?�1v���*�G|k�/�L�S����y<�P�I�ל�
;�qL���JE;����
+ѵA<���4�
c�b�
Ε��V+�wոD�&iW�Mp�ȹ�z��0���װ�g+-�ӵ���EiW�M2�㢶����p��^���ۨINMDŽs���9U��W��f���)J�]��6t�yhEq׻J��61� ��]�o;
 
����b_����S��L��k���l��ݡmJ.�	���*|���o{��X+��Έ� e
ϲp���"��L#���֒ϋ
y���?���y+��5���d�~b��
����o�{��H$a'�jE�i� Z$b�J"8{7��$9�f��k�%��u`�c
>��П�aZ}S͍��ژ��6��;��t�1J�?u��7;��`���h
!'�
Q�6{1[�h_����V��|
滔��>_]�}g��P��K��Wg1w
c�~��%��hЯY��<ō��vS��
?���w���ӹˆ������-�����o�RR��(!���_�g;g�[���Z�,teF߬.�zQ#Jza�Q��QQo�	�
�r��09Y'���	2�)w���8�?u5�ρ:F�HX�^b�u��+�8�����@����#N�XأY�tN����Qz�����GS��# gنJ|
u�Ow�3_
+�	6)��Ѓ
7a#m�8�8>ag��s��?[��a��$�2�F��c�G:��5
�鬐m�������yQ����r[·�j�lS�]3�)'%�wA���s�
Rd��

a
*��G�,4'���� �^�
hpY69<̩�&��Q�OR�ȍ6"fk�V�Y~����l��,
��R��h��b��K���'K���������å��}=��:�<��|C�U���*I��Y!�d�=�Hx�X��T�i�	b�y���{�]�a^�cr�۟s��(�01A_��ڒ��8P�'�?�	���f=;S�p'��V99���nK���	\�9&~/������ٺ��qJ��b9s[B���A~_�(�\��y���bą�g>c$y�q��a�q?��s_�Vg=��忙g>�Ue���x ��>H�^�B�^D�+#����
9o�!Wdԟ������Y�*ed���g3��_�g�T`
)�]nJz:H����^�(���B��s
+�����	6d�
�m��|���
$�������b�#E+�����k-���	8{@F��-��Ug{Y���r�
Ӳ_.�bSNtt�bS��zO�'��#)2
��
�X�C �k�>����f���V���q�����>T�i�K�&�+Y�QZ�s5/�cT�[nE���i$��;
+F�� ��rC��v*is������"%����>:�XWY�ٗ�A_}g�*�i��k�C?�-��pR}��wG�q�#�X��_W��O�bn�h��73_�))��툸�������~E�?�Dlt}���k.�|M���r4K����W�9F)!��ʚ�s�?��2�Di����~O�	 #l��S`���Ԭ⍎�:Q�iNܝ�����%+��()I��
A�07��rg~��<�t��l����3
S��o-�d�
꘨�
�2Ʉl��
�lđ�K9���������4�$&ˡ%����uV-� ��0+��r\��
!�t�C�k9H��	��VVl
s�':�|
ޑ�������#���v��F���:B����Q��O�����BP� �aGF���yF�>H�=��H�Ŝ���б�2������Ѣ/�Qlԁ��[������s��T�;R��v)!��
#榌
su{��:��|��|p��
wGHq+M�7ڋ>�$���ڌ�ja���6��_��* [...]
�du��4����;��sx!4z�'��jw�kW�͠�6gw�X�1�
+,��W�$_��W/Y�
~��@tԪ} ^��9�)z��#��w���xĠ��Lc>9���y����
�[���@�
��3w�t�)���A�|R�a�ɥ�2Z�C�(��q0~-�0dDf
����T�����>^b� ^��[

�
+b
]�#�M��8뙆�,4�]�p2����C�f�����7wf�Hs{ţq����Iѿ���I�	�Ȩ�n
�DY��j�8���^%��!vU��]�{����5��s

�����yI(�)�}��d��\��T6�5���_�0	!%|f�>�pN�W'�9J~�%3�w^�+8�K97II��:T��}��^��snN�W��0�W#u��šG����ܧ_-<�W����X�3��k�p$�����521^1GK�
-
+�e�O�ފ{Jf�I�8��rg��>��~	��{[?4	�u�OI�rOU���g��z�+/��wJZ*��␊G6�@߭��^���##�;O��̦�����<.cWK.
h�$�&-���
Z2\��'��Y�,��U��!��?����]��z��"
��$�T��}-����Ňt����.�)�k}��a}�4
��4��P�C��td���kU����e��w>5|�6I+���{����}��3UQ�Yh��$i�����
��
V�^xs����pm
p
R������}sZ�4�����W����=
��.�>0�Ai
`�eO�plHE(�?'��u	_�ԥ�9�k��#
w�
�����
-���M���Ptߡ"�j;!�ݳdСA�qOa�V���p�v�UF���y$����h
���Ӏy*
+hh���1{�
����6ё! ����
#�}���a����d�(,jOK%|^n8Z��fw�\�=�Ip
#߭
�b�z�Qra�
� ���4)s����$.|�?�����1F-ٞ"W��S��}b�$�'/
|�_I)��?Z�M:����w�ݏ!%��`��w|�}�6�ț�@,��pчz\�g�5z�Aĺ��	2^ٕ9a���z͖��з��b�ꨊ���*�[z��sӯ9�A�9
Kz��� >#(gV�+�y�h��+��
��e	-��]}m��E�������!г�Q�=-�����<\���٧�f���3ު}�1
{�>
��-�������i|�����,&���Ixځ�ӵg]�4'�2u�&$\
B}�
�@cL�
�?��VD�g��;4�+�Rp�k�,"� `��4�(�@Lx�-#���
�
*��_y��YqK��=/*�:����
�$�F�Q����YB���^�>Ri魼k�)�a�/��W��|]�q��B�CJ/��0j����م-�
+x��趖�~���w���`�,v#_�4|�&�޲�
�O~
��<!'���c��
��K�[�N��,�x��kW�u������e[zlB亦�_,u�^1w����"j�1w�x�b�[J-�l��96�)_Y�-�:��%l�<��T���.h���r.zI�pheSw5�� �����#���⼧?n���YRV at K�	��s:1��-9�j"���om���
̠���pt
Uw6'hE�
+�1�Mq�`�
Ө8���`�wLL䮱u`�cv�u���2��"}���O�
0��e�%����^�׉�[Sذ>ygi�<����5�.ڻ+޸$�TK?,b���~k�
�1,oNp*7&Ii[ ��վ���=�7�+@ܐ�˶��Z�h�uN>�?�I�|�H*w�P)�YlN��ꎞ�j8���o=
��ul�Ժ��xsO՝�aT�k�۔q!�ݴxk+�,�<UQK/̒�N���k�J�R~Up+_{��E�ޚ�M9�<c�����G�����GGfd��_�!A}ܚƧ
���̡�Y���=��L�@�}��6i[M)�Ͳ���
ɡ�g�,��1�����[�����W�ׇ�1+c��nT��]��
\�K��2�8H�x�,�P�
����ߖpN�Хrk���
�ץ�/�cx�k��>~�S��~	H�NT�KJ.�����	ۗ�kC�L�g
�.�_
%%_γ�k��,�0��g��C��8�qX�@��5�x[3�ҀF���X��zj�O�L[�~����
�� [...]
+���D�8���(<fg�X��L�� V~oA��7	�K������/�֩p�/���LG�
�̠�P�1��
#�����^	��9F�T��������Jr�)g�c�
9�4BN�$�
�$\ܘ@��x�]
��k �
��e�y@
�c�s�:��Q�<BI�M�\s��

�&d�+d�_V
�xI\���� �,5�.�7�/��A
��#E�e5}RJq@΅nNR�\�AL���ڔK�Є�ݵ�N��b~� $�7�^
L�
+d
���1�gֆI%~���5�KrNA"�*�{�����*'d���
+�p�q8h��v�����4`K�z&a[C��.r�9.�1�?J�Z�A��P�,<
lfP��t�!c샨h��쎠*��ad��>�6 {�Ŧ��"?Zʞ�OV���ѩ�?zk?([J 9��u�a�8\/�@�r�kK�"�]�u)
%��2����ή��=X��|*|���𶊓qF�������K
���j*D�.zԃJ8{�[��@ ���^;#�j.fs���R���z���|�.���5���,�s

�k��'�҇x��bw��VL���;g���S����
+(+�ևr�
nr��~/(zp�5V��-^붆T�"�}�-�������d����nH�bV��"W�j���<���
Z�
\ڱ�C���N��:}l%֭�@�n�S����14w�D��Qܴo�w�<�_F,�����t��D�8;��Ty��
�5W�pA�}}���{���� &^&̺>���au �y�E�b!��E@�N
�	E!@g����sp_���K��%>�0|-3�f�>��Qc�#|��Wܳt#bd��ǣu����őNa��`Y	�͎���R!��09���Xvdh洞d�2�ϲ.�#åoN��rb��!C�y☥�w���=�&8��)@1�9x:0^ܑ�K�7
+Y{&!/d�����GK|a�o��
`�Ir��!is�A.��[���7i��c�q}}���V�d��ꁌ���R�wR��G/9��R/!�
+@��*fS�۔@^�u)_�$��[��϶��k}W�H��
���m��Ck�؞��5���R�o�
7��>���F���nW�
+���r�:f��䚹���a�{��^=�+��j(}��XW�%�]
�
+Zb�w���n���7U�ڵl���\�s�穵�+

���>5
�2V��vX���V{�������7��и�	X�{�%�eN�n��2�
���;e�"��V4rI
5ᘣ�{�l����]��bːx�S�J]�����ڷk=��kcu��9TڈL�G_�VEmρb�=�L
�WVF��i�K��K?��Y�qE�L�|�G�D
[���-T��Rm�OY�L�x�����ͱ��_m<Ѻ�n
�'z5<�K��?������I��U;:D�J?(�7C+H�5;���J��e�hI��ƥY۪n
.� 
g�,���Wr'�a����J�Mp��n�
�N�+�<�J���+������{�vB_�p��r
Ӥ
�
�2�˃:J�Ѣ@|hi
�[��
-pp�f.�+#��iYx@пX8T��Oڒs��!l���&�T�l��pB�-�
����h[G�
cs�kg���1T�����s�6�P�B�f�Y>)�(�fA�Jt�O�Hp�Bcԍi��řg�Ց_,t�GK�l+�I�
+Xl@O=X B�m���{�R�5ܓ��Bo+h�a~j�]}c�O% ���C��S��3jA�^t��ʄ��Vl���`��|��.��r~��q�?G*���1�̌>b�U#���R@�k�	����р]b3�Կ�B�:�
� /Zڦ������ڶ���B�-uW=Z쪉�
�
+ڑ1�ܬ��)V�{�~A�vf�
�ܚ�>�
&���	
+����3�ͱ�U=�
V=�
+����@��`�z?o6+w�
�g�
�*��!}���%h�C��BB�x�=���@^#���
-=�y:�+�e��C�
�%7V��1
����kt(qe�QTj�(����

l���y�iU
�w�■��}[�X�P2ʃ�z������1�f�٧h�+N�}���!�.���R���~waGMB4�\����}�z���s���.�mf
���c��a[E��V��\Jh–
�n){�Sb
+v�D|�(��4H����s�^m���haf��-2��a˞I�|h���\LH���
2�7�
�w���VP@���m�R���\�
9�;�J\lϽnl,�a�$�A�
ť���/�5�̾6�I=3KN?ki+��&���`O���ԠVHu+�u�
\ځ�y$�X��V�*
@�����lMcSU
9׃sDЮ��3|�#%f.6W��~�����7rN�jq���'�-19>ǯ����L�4n����>���ur�����)[Ր��B}�
{/$
+�E�H��E\��l���S�'���5������AbS�w��#��L�
:c����SB+s�8}+��p����������on���&��}��_Ϭ���S<�� ��,;��|C�=�2J�R�zy�Z��m{��2�
6;�fa�\��e���L"�p��� �k�-��p�ybwY�0
+��������%�CP��\�F&t 3nh��q�1N���6B��?�]uZJ�t��K��
E�heWI$���o�1d_���sH@��ђ�v�e��L��\c�bR��7��b�|�7��[���[��^��pM�c�*B
�FhyC��^L™�p
�6��@��JI.��V3��alܖ�X�~e�RcE�u"ΎA��1���������t
Զ����&�fy�u	�(���

+z�|�Y?2��0&�[g�m� ��B{Y��*��{�w�H�
� ݽ�d�[h��[�
�Qb����c�T��R�q���>=�RQ�
*&�
0Gh��	��
Rz��$�x��92���]��ՆX�o�1��l�^\�c��5�
:���4%;*6�3EHr�""���;K��yI�T���}ܪ?b�������)L��8��R+螭����P��x�C�
!
�h�
�����b at A 
�Snu�{��q� �
��M{��u�h%���S���3��n�+9���4��:0W�qyq��3��jj'oOaRWz
���nhS/
�_�� �� ��_��W�3@_5�OYۘ~I3)�"�
�Y;ں�-I�K�LU䞖>2��>%��@K������7����_�uI�;4�ඁ�k�%O֧�ib������x{7��RK�U�0��$9����߄����g�\�rK�s��_�u�E,w��ۇ M,ť{�h�
):�#�gl΀� �
҈w����T��[��G:g��A=��V9h��\Jd
+�D_��=_�D��""'�B$��}g�Z��%�P��j&��n����X�5
+�
��0FK�9����c�Y�:�ȵ����/L�DF
. G*j��.-�X�T�x���賽aȣ�S�s<D@ţ�e��m	<�=
+M��0Ev��~b��ձ���I|��cDǮO`��RJ��:\�-˭$�Țk^L���4
M������F NVxմ� �o�V�8`���	�N�;�Vĵ�0ʦ���Z��o�z��F_ٝ�
,iW�*���\����ӍE��\�������:�8�UD���>�tLԾI��
#2���K��w>�X�gw���
�0'i�8�eՙ'(i��,�OKBl��y�˼�CK������p�*��	YX�N�<)��
y��|�ӎF���2J��۝È�k����-��Z`��e@��k����9�NT�r.+9��m=��6��
�����:VݎNH�
#RjӮ�`k����/��}�}s�ȑ�/:0sha�X����j�sKc�.��f�h��D�9�څ~mj�{$�W_V�k��(��6�scc�e���>T���_��%A��
㘪��2V���Ync�k�O���C#T� �3T��:泉M�V�R]���=
�xG���k����]����w
�tc��=U��1��hA�,a�]���ٺj
�E����g ��]\���1d�喚�Ab����W���]
��kd�s�q��5^��#+{ᜮ|��+V�j3�@lܚ@&
.��Gf"��L�|�R뎭�_�L��k?~1sy���h��'�/{:bOK(�LA�[���x�׆�#��aF�=uc�c�4&g���x��{
�Oɻ*��E�at��46���$���#3��`�X�k&���L�'�/|����ʩ��"bmÄ�
�H����v����Q>�_e�Z���U��w5�*����R'�o�V�cs���/�+n��T?v�`�
�b[� 
��,�ҧ�
�W���	?����
�s�Z�{��U	��ä��κ�\�o=�wgZ��.�+#��A�~i��Z$�_G�8e�B�<
��qp�F
+��ǫ"��T��0䭾���� ����@��qN-�ƿ�㸴t�S� ��BN�}
Um�}��a at CAY�I��+�����!3
w�B�4��M@
oN�%�۫�ݲ�.`zf9�[�dK��49��nX�=�q�O�OoK�kc��Yz���Ẹ���æ��eȴ�iB����q�\t�;� �Y;�3����2
2�~���R֓%�ظ��K����}9���Yy{����}�a���.zFџV�I�
Ї�m��+A5�+�S"l�e�&���ɧ,}�
d�0�*6?���j���7�e{�zq���:|�e����)���hEĎ�Yۅ���Bci���πf?ВKwՄ��
.�1�x��}�j�����\#d��Oqj7��y�@��vc���HI���͠���EϿ񎣒�J
+��Ȥ�yRՎ��{�#������d�(�oh)}藅��h�v��rlc����]&lޡ_��u#�_;��4��Ae{[A/���u�06d_1�����ʎ���{߉K���g`al��k��j'�	`�/��90� �\�]M�	�pK�)_W \d�v���E6��5QwP��_���f��E�=���g3 �C51�p����zgjι5�|��J�m7.�>)�ٯRN��}#q�H	��� ��*b�[N,�h���9FeP�#��y���,�_v���"y���H�c]s�UCGm�5�� <���wߵ�D�h��9��Y
��b�7�����{
+N�y�,��cI>:w[�)�V�ˁ8 at 9\aP�-t��2���2����O�㵟��Z��+��>=��5Y3;���y��qJ�:�qg��d��y�g�=��JT�k
+�j}��ɞ
[�_��G-$������5�,�����yE����'���_�#�/���	���'
���~9�`e�ꭥ���Jw�}Kw��́�ׁif�W@�}Ya�Cf&�oba��|�6�-M��F�ȯd���YU*n݁RH\��\m#ĺ�y%KM�'���_u���Zq�
/��F\��J!�?/$��L�C�Ip΢��1xe��
���B��W�Z��<���2�QP�V���$��]
���@,��a����bS;���0�����
��h�ݙ'�l�c> ��}��QތyՎ*97M]
�g66�ޘ�Ş�}��
D̏������c��Z�SS
y�_��N�+q ��4��
c䨟��	�M])g׆+_��3�{
���vD��6�
`/���%�?'���u2��2�$�F&-uU?���������~��!
��А�P�5
��qr
*�ɀK:�3�H�Ȩ����{�1Lr at J-���2
+\n at A��QQ�J^��A��c�h	P@�L�i�A
��R߽�c!�M
��42_~���U�騭Q���蚒�~����6ᏍX,���p��O}���r�/�]n+��
+�G�
,vGC ��fs��S�

�!5��5Q��3O,�N!�
��+C�7���
6a2oe���c/:��:��!H�wjJ��j:���~�Ɲm���4�/x0',���{���~ޒ��I���iHt�H�9�<�,�6]���9�-�c�D���?\nط6�o�(�l
+�>�P�G@�rM�D8$���ֲ��èx�$6�1�r��m
V�[�-y���b6��@,�y6�̽�ޏ�_zCN��m����G)��OK��K�A�Ł�gB���'���4�L]�^�s�Ԙ}�+�yP=;XĖ
-�x���yC6���g����=

�3G)��ҋ[�j��q at O���';k>�&*~��2�^Ppc{�.&0G(rL"2�����*$���
�G
+��e��q�N-w���Nb��t
�����Ӊػz
1 ä�d�7I�]K/�#����.i_ǣ�f�%�Z
uW+f9�h9��^h�~:/�~`j�<\
DGmN�J���7圼+����]��<tO+*~��
K�� cD���������S�H/����
y�> �ڞ��?40��3j��6�g���ձ����B�
�1�GK��C2��r]+(�V���|��]��#�el�T�[i-�&g����|�t��q��
+dƸ��9�,���]���U;�oα�NIH�Nߝ��W���i(�<A.}}i����߫��p���F.}WC�wK`1K��4��@����_�T4�w�� ?:F����b�y� ��B[U�_��͉��}2 F����o�l�0
+D�c�z}��i���>��k#H�N
+.o��<2b�{
+��&dm�8��a�Gu#�}��:Mɼ�R���yv��������d�sU8��¥�ڸ���'!q���A}��S�r7$��]2Xڎ��q�x�����h��>���e���#�b��
�D]+\��
+���D(��k?���j"dy��#�|@,�rr/��"�o-}�O)��)��T�_
@<�/y��8-�
3���D�� �HJ��]�H���
h�޲ǽ����/�� ����{�6X�D#̻�o��*�؝G�
���#K��#=�yj�G��
�
�!���=G-rKp	�q�����m���j�~��G��$�}���)�yg�����Ɯ�*~��z䙅��[��3˂9�q����਍�ҧ���'��O�����
�0��Z!�+%�f��GBŞ
+��W"�e،#�֧ �� M
�f�o��㘤�Y�!O����g��'v��=��0f�,�䒾���K�.Yn��?���4��NЛ�����.���>�6�,"���t�����(�o
�#l6�TR����1��cZt��@�/Q����/��H�枚gꆊ�ؼϫ��^�hs�.f}��>�MT�����E�rJY#!�����'��.�L%J>-��]U
+"��Yo�
���X䚧A�ůΏ��^�i�	��@�T����<�t]��S�j�i77gɅ輨3�̘��9�#CLM�7'�1��

~�R��[[�=-��9�gG���W
��@G!���o>Z� 
e�V�����>[D-^3����l��C�J�K�Ks�#?��*�T?Y���)yoF�>�a���C ����Kw�]S��>T�/�������/xf�	�
+t�c�6�ez�y�x�]��ȡ�� �$�簤�e
��ZøSN�ͷ��
�0ȇv~��
+��g�|Y�"��x�S��t�h��)R��@�;� 疊����6��W
+��ș9��Hy��I'0I�ΐ����k#��_�@˸�m�����?�R��c����aH����A<��FЇC-�|��B�f����"��O�1��n5�
@�J��������c�l�b>.6�\�s
�I)?O�N�t`��"��II��M��K��k���;��(*�ً�2ܴ֗��#v�ؕ	9�0�'{�*b�9���,��_���=*�3Rm물�֡��
�F���~�����d��m.5�fՅ�
�CJ�wM1��c�*cK��qL�c��g)��i���ˮ�샱���xr��楩���"����qs�	��U�A76�c��
i�tS[�����.)&�>
+ԑ*BF�1K+�!#ݳ��o����
+ZB:6bs���o.����]�gfQ̃�H�
�U��<�&��_y����GBV�o}��K

���
x�[.`l����Il��Wt�,l�5���ib�J\�`������"��
+>�4
,��
��#�W:g蕛R�k�Q�!�Tϊ!��͸�����>�������W��IB�9sk�à��s��$#��͏m��g�:
+�����*�ɻ:\��"{`b�}j�9Ǩ�U>^�'���8s�LC�4��M	��s��5yģ��~\:#�{l���VF�%�JL�,;����x��\v��Y���[�jG�):X�2�UB�\�}�)ŕ[��>-��3�u�1�.�8�%U��!
��Afѳ��?�ݵZ���-�p��-	���p�}� ��u�[=N��b&��ji5;��h�DE�ڤ��]���Q��O�x�[al��w*qŵX��=ଋ���[�-�;�N�C��w�i
@��0���|rJ�k��5��ڐ2��J~wQ$�y�u)�=�H�A���׋9�Yz�Jo�	B�o��O����(���U��|p������
�h@�?13.,���3�g_
�ƝE�0��tF�-��M~��zWEԑ�Tik/{��e\�	>��
y�mO����~���Hyz�ů.�+(EB�g��\�!?�i����.{i�-��l��Aȋ;�N�]N�>7�M;3Gʽ�$�ܞ%��ə�����/�34�=�q�0s�~ [...]
:�5S�~u
�	�ٛ8l[㜩��
�O��P��
���aP��T]����� ���qJ�e{?.Nӈ��d�^�+
�Gx�+ 
��yT��p
��VAÞ�M\����晵>�p�D�~�s���T�<>ۯ�T���u̒�
3�"�4%o}�q}

����
�Ţ��GpͲ�
Sm�ͱ�:� =e��z��ue�x�>��qM�Kr&�ؤ_��
��m
��QAN)6ku�ʯ�T

�>���MT���2	��.nWE��E7�p��Y�gm�U�2l恑C��c`��JJ��
>ٯ��zՈT�x�;����r�^�0�G�`�����[���[�c w
X�\��Z��`C6���.)��x�q�o�2v��/�f�KC��%>�p�K
���u	-��w8�
�I�g�(�i
�U�Z�4"�M���B}�{?���1q���X{��#*Z�m�^��o��
�7��/m�׽�ӱQA
�j}
+
�6�L<Z5�E��!+��`<JrAp�K
+���'� d����YF��>q���Z\te��s�_~�Y��c/2熌Ux�
��:����W�t�?����[��&���o��y�eNY;j��;+|�k?2�7-��VP�p�e�"|T���r#dd�;��լ
U<p���Y����@��y����������'W�!&G��҅x����%#�!��_bd���(��?���G��k�Aq�g���
�ӣo���<�U<���ojɾ*!ǜ�/���0��	�Tm��$6s��v��\�vOKA�j��
�pGN��(�/cĜZ�(�p��J	�/�õ��AP�rKU�F/2*
bs�Q�K��z���Az���il�&���s��+RZ�վ�{
���
+�b�-�2&���M���
�` ���y��8Z$��,�)�Yt&�0�6Ƒi;J�;�N��bO˨�7�{a��x��!�=Հ�啹��niyc�S�>J���' Z6qu ��1AL�
)kC��.X��V���%~��8��O
p�"�\��
��1�ZZݮI(X
F�>� doT?54&]wN�D���T�
%`�<��R�:�~����|�v?K(X�Ǹ���^)�R\zHO�v$��J}���=#�Va{�<�=0q��&&�!'��%>��E���2�q�@U�B�1�����W]ߙ');ɟt-�Wkôls��� ����}���Uuo�
��>$(Y�Y�i��IV�Zx�v_�=�p�K�,:˭@&Yƪ��zk��.
+�>�'�*6ԧ�"�:.eo���p�e4��¶�rHQ�^�rc����傢+]Ȅm���U욛�}�܅V̇Q|�9}C�9~�[]��CBJsI�k�� D/��E�;_�~��W�bl�g���K� ;��Q��q�F�3S+"zG�����:�OVzj^�S�N1
+嗢(1C�CT���ue�ͽ��qZ�A��o�i��IH|�O|����Q?�
+N�c*�`��O
+JcN�R�.s
+��2E��u�
�� &��B�%���k�\�뭋C'��W��ݯf~ӑ��sM��Ծ��e�W�ϯ�`
,c�<P³��P��
��Nk[�S� �zݛ����������:F�bT|�\w��Ir�C�
.�9�ܙ����+>Lѣ��T>�A�H��
p� ��QRz䡞F�jc��.S��4�<�
�2��tu�ye��C?%�����F��9z���~TŽ�P�
GǯJ�̻�5P��-�S���̍QJ�~i[�̊m)
�!f[;�q��˔���
��?�
@�V�j^����{<f���
4�X
%��ڒ`R�z���ƪ��Qp��qs��Q@\_G*�
� x���f�D���آ�n���6ȳ�qD�o�XRsH�f���Ma�g��S�ٴ�%6鉶#��ί���
-�X�+\��Ua�_��n��T�����&h:PS*�����]���ݰ����כ��o�)�0#ks�Q�3_�vO�
�Kw�
s{�eKGᕭ!L�}���o'������B�u �Z/�:kjʹ�g^pM��jFmP+�M���1�'� 6֧��:���<x`��L�W�J��cK�Κ�pO2
WG��ݨ(
���zw���Ab� [...]
N����S�u�
��g%��*k�+z�m��S
+NiD��}��y����p��1�o�Z�6��U�6��C�.���*�
$fm�䶾1��"��nH܉Qt��
���1Famv̯/���Gs凋ۓ�ĥƜ�&A�y)��	f���C?��� w:�	�O/����T����l�Hٓ��
Jn�o���5Gh�����''�Y�}12p�z�@C9�j?
`���>��>��?�-EO&��/��o�0M�|ҳ9�>����^샾�+��?'ɱ���e/�OO�����{>�����L�]�#S

�w'ȩ'�\:�����W�e��������Α�Gw������A��x�o U�s"~�&?�]�X
��(�~Y�������k0����n2X�6��\��1,��
��B>��ˏlm���d�u�LȲ�����j�
��p���xs
��1�vN��*B������T�çy�Z��2��>x�:�Ј�@�C_,�ݒ�r/��^i�yᔲaڶ�G�nPĞ�:�3`G&&���f��ل�Yf��8-kC.fl�ڛ�%
P���>���d传���#W�U���
T	�+ /�A�3���Լ�q����
+J��֬�!�����l\PM��kHş�L�g
�4��
Rt�Bk�}��А�L}��^9�S�1{
+8�w
����6�I
��
�<� 0�}c��$oʉ��:�1ϪY��5t�"�G���Φpߌ�	j�������ݵɿa�..�ֽ��5�^�Vf���PR֥������ץ��>�hI�2Pa.%6
�
��9
ثf�CF6�6M�\�c�l�Ye!c��!{
`
�
��[f��4=�>BL��ᢦD�[2A�}��al)�7MM��d��^hA�Y�fX�99�>a��O�i
���阄c
��)%d�J0�[Ӥ|��U�V��.��\?o���5y{�H�[{*�.��߰վ�P�.
�ROixe�
��ʙ�h�9����g
_��]so��d����� )y����V�:dm
���ˏWx�����:Z�h��u	���
5�8�ϛ#^�QK�{d�2[K����k:n��^�9}cY��������&m��c��h�|�䨢}����`��rB�KN,�O��w �	�E�"
����Ҙ��J
+�?����m�ߋ�R �~4���Xl+~��'d�y�}U��
>��˦���L#�fk>�[S/��1?�Y8�2�*5t�"�r6(
�]��|`�_���
��_��9I)Z�`��
/�	+��4,d����"�=�Oߜ��o��.uk�S��k�u�tC�0��h�}�G�1I�]����s���w��:�)`��n�K�}��b} ���U���[p?4��k9�U)��2A��h���>ɣ���5Ă-6me��-E&���B��k��Ư�R%��gä�
�J&h[ʬܞcT�L��
�A�^�dU*k"���C����&�?
��Sӫ]rJ��4%{S�,ܒq��=�7�!z�s��
<�֗\�t?X�~�g�]�|��b�L
+��ω*�
llh����X�]
��O��`�&�1��Meg�~��o
���9�����7���*|�D��V�C
�j��ɫ��(�$6q[�Ͱ
�_��o
2j����.&\��
���sm�Ȧ�ݒq��3�J��	
���e>/h��e�w���o���'=:sU�(w���S�x������&س��+Ϝ�9�.�R�6$��	r�� -qy�U��6p�z��
�f}���>��uH� 
1+l����IbZxNv�|���=
+@�ꨵ�>^�2d�1�>�4�/�ϲJ�l[�Fhx�WV���%���\��Zᔓ
�gH��jʺ�
uk��As�@���CN�9
+��]w{'ډ&I=X;����=���_�{��\��	Q��K�ɰ��9r�}�	�4؁��ޫ�y_W�> ǭW<Qp�OO�?���']��	�N膌]�1+­I�1N �����)N��5�܃�4���nL�
+G�9
��<�$X �
h��Ir�[�9�34֯+�5e�"m�k�: ƱA�i�
�:) �P1[C�
�
�ګ��-�2�ZE�ɿ���9�ij�����|c�����{n9�lCQO�R7�=��[��8
�k��u�y(��Y�Q�3���h�
���3k
�
*�!��w�Yد�=s
�OǬsk��
%�.�A��zq`���g������
j�����5p	-�)%g-�a"7&�3��zW�X�`���)��O�#կ
3��m
���_o�}
+-�	^%���z�ԛqg�"�`	��c�b��-=k��f� ��2�(>\i�>�5��4�����&4��]#�:��V,�ž8�q��&*,�#�������!��e�BK?2ҫb�-
�[!ۡ�Ɔ����ί@��+	�Z%Y%�jC*���[���2��Ѯy̥e��Z*�)'�{T
�K)���^�[0�>uS��
��>��ޘf�ا�%��<Ī����joX��(��q���>��@��
�W�c�R�U2�;F{��'d6��g��͒
��ţc��&
ͽ���Tlئ���6�.
=�.��8��qiĴ-�p���Z�%��n�X0���ϻ�6�164o�ؐ���7�,n��(��Zm
�|0
Q�ឫ:諽i���M~lk9���D͡p/C��<,,��	�֧�>MKDZ�E�Ŧ��!b�}���κW��踠^,���;
M]C��.�htHEp�\�_��+�Q�u�藖!�'��[�%k�ݝ~����#R=*zy�_���`��l����Z����Q��k�<�F6J��>n�u\\�ke'�{Y~���2�,�l���hǼY
e�l���n|�� �}
��9Z��P���<Z>ae��i� �; ��6�ܚ&�s����}j61����T�a��8���
+�VI=���Nݜf���,�Oۚ�<z��z��UԼ�� �����k�8|�؀+q�`�?Go��Fھӕ��[w��N)Nqw�,Ĉ{ Xp$�H�%J�'�����[����>���7�0s]�y�d�<��es���3��Z�5�GD�,)t{^�	@'�
+���P�⳥�x
�]3�
�KI/��R�V��ʋw�ϧi5Ǔ
����K�
�yk��+\4����ؘ�a6yu��z4Τ}P0/��X
�&l�;�ښu=!�%�
+ �_��04dA�ᾨ(�6 :�Z� ^���Y��
ɚ���p��2�D��%wo����ѥ\
i��s_�+cn���[�֖���ڕQ~j���l�G-l��\���,� _����o�41
M�IM֩jC�
��N��=��JG�&��
�
+ԹK�K]
�e�ژ����M[q��H?��6��44oM4�nϴ
�̷���[����mtԂ�
+v���NYs����X�|�v������:�KG+�a`�FX8��V�:�Dn�5�N���'%e^6@{��[�:��TS�ץ6�ż�
+
�j�C�:z�����	�O��a���z8�&ؙh�-Zj��zb沅
+]�'-H�+ڪ/��;z�'�^�[���W9Ŵ�i���o�bW�_�¦
�4��Z�p�ZF��3�����c�6�]�fq
�	��W����=

w4�s��
����SJFθ�.��Ê���*����&�Z�3�c
}��F�
����լ�iI
d\�Z`��Y;K?��P��Z
+xY]
]n"NI�K&�}�qy'�)��-k[�s��yC'kN�Pe�"g���yUO�C�
�Xsgkʒ��5�S���g��ݵ3ʚ�%mQ����`�Ys���8״a��v�(�rz���Q�o�Bw,����)���kX�˺v����0�^�b[G�n�X�Mk=~�R
_f�O�ȩ�6�1��\��?r�3v�i�e!o�R�޴����ZI���8uo{��`'lq�ӱa��X��Ý<D����͚��cc�]
+R������[�}�l��N��m�5�VM��}-tEG�^BF�_�
on5qa�=��ymwèT��P4��]�:p�)
9��e/h���6Vr]a��)E3qk�C�`��\�v�M�9^� j6Z�,�mf
LQQ�d��Q?���L|�����V�s4�ޢ����vO���]�o$zN���mZz����=G;o��{e���r��w�:��{���n����� �Ԙ���z���q�~Z�SBH�zxu��Y2�!���0;-=3���N��X�pe��yNK�]4֢W�:{w�����6`�׭�
�����';��=�i1mAM-�ut�:��{ݥ�C&d��y3�;C'/�u��1I�f��L�p�ݶ7I��w2�k֮��.�—�u��@�0IBm����#�%B��א�k��v7��z�f��۠�e�ۚ=Ԍ�7��q�]�=G�p��D�32�↴�!F�
�	�=�
$�����nݳt�m[�Q
�R���H�џ�j�&ț�SZ�L\^��RZ����W�e�J����	y�(�#Խ��a�|\!iU��dm�tW��ZmR�@��Չ�B�8�TN~E��t��ރ8~��e����q
6��:�Y�4�\d��:ۅ6Qg�p�l��X{�2�5�3Jl쒖\�ii�_�z\ށԶ1�hkI�ǹ�l
3=@�\j��k��+&6���.�6שz�f˄�9�n�أekW�}�6OՂ�($៙y��Y]7k��޹j��
2�m=���F�
+�u
-��
9��Ǧ�II9�6v������k��(ۑvIKɌ��h�؄^20���O�b��;�5�A��]����η�*u\n�N(��rUuC���nrD��ߋ\�u�W,��E[3uаKfF���f���Z��j�f��R�7����� �rۅ��&q0��{��깇�d?)�/�A(��t���*ٰc3ny��f�D-ޛn�\̾:��Pn;�j��
���n���fQ���BN�N��B�����:^�Yȅ[�b��'i6
+9�1y3Ʃ&�ǥ��5��=ڧ�r�G�g�����)6�t�����`��^��{�y�l�-؟���t40�ݝSZn���?�n#;�m�AF�����7UW�dfT��USG��x�ns��c��T3i��[�j�o�A�1��4X3��ʠ,`$��0�2���p"�ǽL}F+i��P$�
F_���=uT�R��l��
�tB�ߢ��Ţ!�P4��Ù�5���ty��E
շB�
�9�
.o�k
	�d�p�Qa"�
�x
	b]�;�6,�ҝ�n����n�g��JW���X>׆ma
�5��>���N�dU
ːL%H���(� Y��1�_޽Ϻ��$����� I������j����5y;c�B��"��O��*#94i at o
?PΓ�Ȼ{Sm"|N#�Pr4|~����������MeL���DԬPڰ��i��
M�
�N[��n��m�9�b�$��=��6;L�ؗbk;&�D�im˘�*hl
���^��>�.NF��XUג2;��XQs��uY.=w���h��
ʚM2
�4؏Vqے��
�C��lA�P
�3e�D�����=q
lU� 
,�">�JB?O�����Rs�8���m
��K��EM���Mˀn[2��g��d�P
¢�T5��Yn�+Қ��f�&O0��@*
�
+ۯ����������07��!���i��W}��p��S1��a��3�L�L��X0���4"�B�b��K�{:%)=ݚ��zEd
Q��E�%�h!%Y�o��
+��o3a�@���	�E�캀��6��]@�Ȥ��d
�%��M�g
l��L}��,G�=ի_�
��rZƌ
�X�qD����Y� T&��-�8IK{�V���&NjZ���
��d�h���6(Uݢ+�[��j�X�`)6�*�}L� ^ƽ����%:
�{zrÕ�|�o��n_�����57��zL�KEWg�C��N��bӐA)��{:�v�ÕIo9̢4l����b��O�p�;	�z��܇����s��3r{~���=��
E�	�?�O@
j�p���R5WM(ZV��i`��T�7[XÚ@Qg=��u�S��~���^H�ffs/{�#.=vOs�
+�^�����
���+��|����6�����):{�g
͸K#Q'n�������`���l^Nf���͓�4՗Z�`P
e��=��`���$�OO��@W���R���K��Vi�K���U]
v��\�I
z�V���8�qdW���ӷF��]"�5'��C�MT} �l�*ʭ�� 
�{Q&�^R
���#�L
�v�
+S�$�K1�@\��4�Wj�"�0��oC5�8 at 8��gH��II�Ľ�6�[\&�����Ǐy�3�Z��������}�v�I��$�҃7�nށ�����~��l�H{F��f�PV%�Q*��u����٤�ó�(�/=�/G�c���H���A���}��_(�R@
�҃W%n�^x�L����*�#:A�A�!�Qt�'�0S��	�
��o���s>��vDU�������*eJ+�w�"�?��s���`�ׯR�>���n<�s�|����=��Lr?"���W&$

;�E+�
]�S���#
�I%�ܢP�j�l���/t�8FF�t��~U��y)��h����0ؿ菤$ҵ�譤�
wQ+�`E߂_0ס��"rW����1��o�-#;<RK�W#�)?D'Q�
�v{����-��
n��47��}�T��X�e&I�Q�%[��Uf~c�^2@�
��ޱBr�j"�vŻ���(D[��d���w
�!�����cP4��W��
�X�^f�}�A����_z�����}�۩�2���y-�~A��k���$�`�P�K�'��r`#�2�
W#3{~~Ju��
���M�[p�҇ ����Un/��nq͗|cZ~xĸ�Yw�*�ݓ0k�n�n��j�����L���'��J�����92�����Ο_�/t��]�CD
���kO��~�����e��� �ۭ'�K~_�װ8e��o��*���	m;C.��[�	̞U����]�*�؟��G��kofd�\���
�����̥;c��yA�^},r��(�_ �:��ΣR_�k&L�ג�ˑe7v�gb����1?ǁEw�~y�����!&���Op͏w�3/}
+D_� >�
��=� ��#\�-�]N)5���;{9Z�i��<�#Y��
����Y2�s-Y?�
'�^�V�ng���|����KХg�n/���^zB�<C?{F��
���9�D{N��������Za�AyÄ��h^˄�D�(����f��'S;S�̕O��?��Y����!8���� �۫wen�o��ùyŲݞ�~��Q��+�Q�ߒ���9P��
�8c���X��ĻԴ
�����=���>
+j����G�ʱS/ hǣ�����]?���p�@��s�����n�
����KH�
+(�ܦ���
-D��[�!:tC�T>�e>ɜ�*D��G�5�

O��C��G��_�}v{�Y
+�����?	��/®�
+�\HZг�)5iTBI6K���:��a�6K,�1��Q<,�?
Lj���WS�R��I	M��J�54�y��T�罗t��O
0�攤�
��5���
�j!+N��L�*�'�qt�7�����Lo�J$���(���/�)$��sTJ���٬Ye=�r�⇕X�
:������Q�W�-4��:qLZ
fV�#��<pw����g.�m1G���O"�ۮ�D���!w�/
���K�^g�y��.yG��
|(s�
p�g4�-2��Kn�����
�.��&k"-"��+O"Qa�ܑ�:�L1���
��},������%��z�y�ۃyn�?�ܞx��}���������sVN��d����+o^�,X2ЊU�8?��&��T����j;�I]�p�\hZ�.���aq�~F�,����� ���a�K1M��r;o����"˼���X������a
ƺ�����t+߮�"IeFv׀�V�3������=�n��(��+x$��HȭuOɫ{�`�+k
!�ZM at c�$T1�+2*��Er��Y?��f̫�N9!�.cf�;�q�^Qn/���"
 Ԋ�"�Zﴒ�'�I�^R{�����p��Ȝ�����9ؑ� �蛬��Zmf�t�a�I��
+Rʌ��U�+ܴ77:�]t�b��#�њy�J�h8�v!�7�� 5|7�P��K��K܌s{�
+`3�x��Jl�oG+/�*j/�1�.]+ެ�s4���T��穊:9Ƽ�C�I�#��"��w%pѳ���?Cbpw�2��Wr?�3剆�a�\-Z2����ƌ�W��A�c�
+_���P%c{8���^{��2�YM����{�&$�_A��
�^���X�<��A�!�(K��>�KO��J����aLڢ���"$Yy� ��9G��2e��'�����8����E �����x�����y~��Ȏޞ��>~�@���,V�\�~궥�|4�į���zܡ�ﵨ�|�z�-S���ma�u�1��R��M\N�퐸����~����
��)2�釈��_�@m�R��7+����q�I�k�4Un[��a
h�@�쌳���N�@?;���ķ�'�
Wg
@��+HƷ�ɵ��>O���E��O0�җؚ?r�M�p�G#U��ყ���)1�EK�w)�E��̘��p����(J9\#��G��hK:xrpk�(�͑%л�)���rD�;���d���}�������
s껰�:���eV��|={BA�0(�4�ZѪR�e��\	�;A�����K�	T�<���+�AzzT9}fR���2��B�]5>�*F΂��8܌]64 -��e
�tc���6ʮ�1�3,ʶr9 [...]
�b7-���V��
Ǽ<�;h�
+��2A
_4P�٧�j��X��Tr�5�jFa�è,�GZq�g�)�[��u
�������R��X�r�H9Ny|B�Uc�����]�)��(�.�����EɂU.�]U �UVj�ˬ�\�� �rU��3u4��v�X�sbʢ�\t`�gm[kQ�C�<��1Wáǩ:ɑz��]<0X��ӗ(�bGعfy7�"�A������m�s
i��L>o�?q66�[jr�xy��
���!bꌔ?��/vj�0#���i}
aR�I�)A�
U�bv�SY�NК1,�U23�e�h���~�$�
X�Ƕ��������Y2|N�,]���-��Iu
�.��6K�zak���?��:�R'�#�
T�֗@
xK$��`�zB�$�
���^O�Vܶm�6����!r�������9x�	�=
K
��9/
}H_�X��
�.�V��-Um|;�R��[V��V
+�]#a�O[Z���B�^,%;��E93g�L,�5� ��ښy~�SC�#kG�=���Ø����T��R
w{l���8��7�k��
�5<R��C
+�	��#j6��lf�;i���ƎSW3�|��y2��9�e'Nb��
_0�$��غ:�z
{���ڛhi�
ikٰ�i����
�li���h����[P�&
o��J_c׭L򂆒�f��c������O�#�����w�VJɂ�^䔢"\Ce��FrѤ�
pz�@'=�l��u�&1!Ĭh�5vgL��y�|��n9�oر
+7L�ԣ�Z��b���<Ƕ?���2���<���9�ᨆ�
Vv�T�n�\�hȴ��Q!��
+6hDGJ^�jj9p�7����c-)�8y��Ғ�Zf��6L��YQ�
+�_F;s�
�E��u���}��7@�����t��u
+�Ǚ�MUY��~I
+�\W#"�t��y&EF�x9�W���vdF$�
c�v��GvRņ�\�`�-]��_�>���D��sW���[è��b���\th����������	&����:��#��q����)>*pZ���sk����%.mA���6�
+/fH�!"��Ց
��ω�}f���)-c~�&����>�x��B)9��w�؋\���z}�Y��`�����).w~
9�+���!��bBԤ�
5&�5��Ȩ)�\᪡�e�D�XR}Y���i�G#����V�Wg���bΔ��4X�g��
���X
�5�E!��Av�{j-�f�����n�X�ZdY[��gƂ�8С��'<s6 �N+Y��#G�2^�)���Lс���
�VN�ގ�"��)zÁ�^���f
� �;0c��
�#��5
,dU��8q�0��h�
,�ޙ�|�b����˾���,�7� M�)Y)-�|�Y���G����j��4d=��+�p`�f���%5�o�~���go������4?��ћ�|�����NB�gk����k?�W�L1�_�̧���+�/ӝi�
���]�^'���b�`w��:��b���4�m�վ���[��̉R�������x��IR�߳��ݱ:�KC�_7Ӫ��纆g���	s�H.�V��&���N����k�T�X��\�1��vZ��wj'!�MЙ
W�u�}x�_�jG�K�?��LIL��"gn�jbwոԥl�:#�����
����Z��2˩
+�¤����ǖ����b;�AK���M�����`�~À6d9o�)��w�ȸ}3���ZOXא�W���='�o"�-��ue�Ϣ8���G�2DȒw:J�<������--,nQ\�3�W�~Y����gO���F;�ϖ��aEܦ
+
�!���H�;ߝ�p���c
��%6�P�puy�;L���	����EA�Ϧ�:�H��;Сb]�2�ᆴ["t̕
5!��DC��
����
Y	�==6uW��90�
+Ƅ�����WsD��Kc�d���Ɗ�$bc(=��D
�Њ�=�Rˏ-
�=Scݖ�ᒣb֕�~�&h���3Z�s)�2X�	_�*+����s�h�p��@C�u_�M�,�ge�JT����k�B�T��bٹ�
��c��T��CCu̿����3�5��
n$
����Y�}#���
��"b�5�1{&tʶ
����/J���
Ԛ�,��
+K��&
_dAk���
���
�_gXl��*pE��?0�Q��E�(�1{JX̞�$.�]��ö���=#	thD%�� U|���N����=i�W�����^/
+�<��D��6M��k���C3��p�u��9���7�Ui�ft��̕o�u�
-:e����e��P��&���r{�$bk�;-��o����馮\-�����]G
m�N��3�䟎���Ē=
�n A���3�]+��Y���K"��5q񧍋9:���2ٻ���-eu��
�l�����|:�0K��H�:b�\��~�%q��U	�oe�8�U�9�S��P͂�4�X�����4�ܲ���N4�<�D&���*X�� ���8�ݡ�"��x�;Y:�/
+�� �T�ub%���(��_?���(�Ŗ��O_�th����q�
+�=

�p�u"�%,�������]9OgxE
.�m/,�ƚ
�#C�;�R�jpaW�!(1aWǛ�
��n,���L
Hs�XO+�S�6eUa+�����w++��hS��Ɏ��jb:u	8�͡ʰ=
2n]R�9P�*�
�1�
paW\h��cMMgf"d�7��Xk�������F��
�rb���193
vLu�m}
��1:���\u`'��oF�0:��V�� *�8�-~�.��Ʌ'FD��P���ٙ���_����1r�+�������N.�6VG:��$�i+#�4��ui�ߦ�=|��c
zF�[�T��
UG
�ȥ�f\��� p�?�}�/�������*
ZS��7��O���3
6��1|�g)�
+<'�����R�:����-<b}��gS��VU���P+�̈́�E~���	��Y��@Eā������,
+[��v��gVd��� `����t�I=�Qa�vdƾ�<jC
	p� ޻d�
�{hÁ�$%��&1e ��O��������ਫ਼l�
Mi聝Q{:Y��6MF��c��g�����f;T���l�6
+�ZU@�
+?m�aa ���&h�e�jx�	Stl�̸܋
`�
��.��θ?ڑ�dAP鳭 g����e����5&jC������ ,p���to�
xjd�WE��=:��T���@$7�ӿ[KB�,U1�
+D�l�33��x��&�TX�ak��1�����
~����x+d���H�7O
x��cX��qt���"bMz?ݑzw�%���
4%�GOv��ْ�—EU�+Ҋ�5YUȚ��w�~1�U�)%$��T���~�,*��b�e>r�e�X������ZD��)�� 
}��"�]��
oK�7�}�ˆ�6�Jy�&�|>
F�� :B����ޒ�~>A(���J0��ɉ3��_�/��Ӣ�7 N]�_�"�6���
5*CA
+�SE�tc��}������J����x��e^E���s'�k��ZS|+N���t�
�dCQ[� "�zs�.
s�o
�
����!�� ��;� ����tsY\
p8L.X| -�Y�|t���lJ�>}���P8-*��S�����'�Tؾ� r�K�
m�O6��;��
�!_
�RK{���޼��
T�
�
�ZΑ�:aY���՗�xS���|�m���
+��
�1e��e0�=M���VGo

ؖ�.��xyC]�(��u�WCc��g�������b?+)�p�J�����I��w�=f�`��SD�
���SsM����	��/�g���Q<|Y���52�����qF���P���7��A���5�����{�
�ʓ|������*8� ��;1��T� ��4'��������~2r�Yp��Ĺ���ft����E�l�J}�
?��D����_a�'{��'Z
��4�
Y@��]%
.2`I�Y�Bm��۳}%��e��mEu�K��j�=��xK��E���
��Ĭ�W���vT��
5"bKQ국�w���.����oُv�$�\ɧE!�kU��QW�
@>,��u	�bb�
nU��}��jRֶ
+����X�RoikB�X��O��"r����7���|�S
���:ړ�Y��t��k�Ƽ[CT���z��6iG�I���w���zR"PG
�*��_�7����UQbmJ��%�
+�:iCZ�~�>��,'�Ú��w���>�]�sn���Tt�&ڑ���ʀ��Ҡs3"�x�<|U����yp��{*�n��`1�.r�t�/��{���W����5﫢���~24�y�� ���9>�*&��7l��/Ҫ�_W�S0�s�!����M�A��
h�S[u�4��tW�=#��U��ב渻�*l������R����H?5
�TW_�=9��7==���kY
+
��W'��f�<
����o��o��
)(pW]>ޑx_A��wh��^���N}�.-�ZW��J*����V�`1<D�uV��O@/'��s���������}�Q����* ��glj�C,��w&{Ҽ�o�D�6�+���ŜBG[�s[C�㯓d�)�g�
����t�l�F�g�Q�����IҞ����������#SY�(xc8���s�_
��b����к���\g=31���*z{�ܘ���A�3A�Lp���VJ陕Tx��|>�`r ~�<F�,
+3���C��|�����ʌ�:��|UM�\�`�Ĉ�^�{SC�3c]�=3��dK�&��R��֐~W�NZ�#�ň/���0�66e�> ンhͺ��|���!�����m
��B��}�.��7��2>2췱�_�fA.>䃳#�� >�js���`ϟ���S<�'Em�35=�邨2`�#���H���H{bcg=
��\�-
�<� �V2�^��o��
��U1;rd��!sCO�VCB�Dy/-2/B��qi�\���c�K�����y�6$���şL��krT���~[�{�u�<�"�
+�~�&�c��J��py'fb�
��^~�'k'�q�1;���me���=���=�ղ��q|�wG}ݶ�&mY
+�_`"7E��{�<�Ua��yn��d7����T��aV�t���_�L\�TW����q��.pk�}3֖��ޑ�zG�/���d�s��f{�����q
+��vg<^_�O��kI8��>63P��ܧZ�m �?=�*�
+^Un�����T��\�!7՘d	.�+��nq�e56�
��i.$pI��l�
�O�����N������o
5ꁑ
w�LO�e�'�:2!�� ��}5�o�����!B���|G�4>9�O[c�U#=�ME~ؿ�I�M-2��L*��+�0�������Z�� ��hK9ӛz��V��C
+4՗ᆳ)�<oi?kn��
��d�
+x��U�oA^�w8J�~�i
8������]-4��P�����<M��1\���] �c�?
�u{l���
#c��u������iN{}��K*\��������Ћ��/c�Y��a��P!��Y�g{�?�$���{X��['�Z�.P�K�j����gF֗��֔[����S�`�E),�֚�f^P��~�nϼ7Ӓ�x�깭�G�vg<S�����QrlM���;�+(i�š�Eա���!>
2d����@NJ{�<��i/��
��S�������+㞳���*���

���Ɨ� c[�G���#��twڃUq��]me�h�]]����悐}�sNtfy,�����t�.�v�3p���.X�U9:�� 9�z�!�y�� {��⽜�/��Qw�/2���
Z���R\��c#�d߀�:�T����l�*� {�l��xfj�z�Q��TR�� �����T��	�s���������W����kJx����XS�Sg��Z��x�;��)������qv�S`�_
	�u	"b�=穣%閳%.菉���K��YQ"�
+���
+	��<Pub�f8=ޖ��Ċ{1��.�oOO�XSbS�I75��m����J�q��d/����l/�ʁ�<:
!��$�*J�-)"��\{��Mq���@�Ϻ�,��4��P}~䶕�\��#���'fV������y>�{[��{
Y��YbI��
&A L�Ãx_VÃ�lLy4֐���N}������jA�P2S*6���L��q\ၭ*rCU쵥-9
����j=��׆�B-�����)ߜ��-]���
�(N~3ߟ�~dŕ��1j���#3�.�X�5��hNlL䱑�h���2B�a��u)*j���.*��ˊ���ޒ�`�),h���C��)N޳U~��W���[/	`~��Ļ�ƨ�+B���
+�|n�W/��)����s��%!�T�ycue}} 
pE����D���«
+��R�t��;s���d��x�w�uC^�w=_��#��s�PA�6L�pC�������1���F:�>L�U~9�4274��
,dWI��
ҡ��J�
�}���r����~[jj����
�
���B�}�;��H3��<�*d~# � XwgO�J
m���h��6�I}�l
+��*H}��(�;��m�
+�Vh�53��GS��0<q�;��T[���>�9nѻ���Oږ�E��.�~y��6��Z���+	^�O{3�
�ƅ��<L
�c]U�\}������G�}��P��y0��i�
�)�}�q�9��\<�+���~�
B��9sW�L�3 ��:	sp
�q���讈�7�	���L�!~���%qq̉	���"��L-[WV�����$�
²�E
�dT��.垂
}c�7���Ž
:��y1�[�yS�LY�yL�'?�l�|8��}�./�9�z�J�:9��v
�Գ��t;�fG�ܔ伛�1ݙ�j[����㳆k��H��זx���'�g#ض�2z�
��ޖ���}���E
���.Em�DOɇ=3"�9�?.
+�?
d�_3��}
<��K~<�ykU	
54e�:�>����kN���Lj�:k k
+ ��G�+�d��xl��n
ab��5�[J 㤥^�dܩ	���!g/I��&&lu
5�Q�l���}A~5�u�Ί��#��
�+��J޹z�^g&Zپ
�%�o*acmϗK��`�uEu�����[XY��o���7D��}9!{W�Lsv�u��<;0`2v����A��eYU����Z�~����	_V���z�k҆��Az�k ��z��f<t�
�m���Fǜ؈�k��5Iy聾7ۇK�j��2�e<PBo�Q�O�,Զ�3%���9�w䘄@�
�p�[��KCΣa豩.���*aÀ�]��܌��6���j�U99�OT��!j��9���0�m����b����k]��>�4����>X���쓶�ģ����ha,hU��fI���%���7h]T��@S1#(�V�R�tm����Ky>^�`�#���_��{�i��/f�
+�1׵u9�Gf2��V����G���<����9D�hj�zam�|�7�)�|ye��qn�%�ug��d����5�ݟ���k��12�S=o���?���Ɨ
�ȕ��sܔmɷ'���
�?�I��t�#n��z_�V!b�Ĭc
"fKY� ���T
�*Žl�{Oi0���U��SKU���2��xM�IRժ
gm.�P�S�o�	�k���%euȬ��SF�x"�G���V%�O�j�
$��`Y��}oU]���F�?.
+n]]nj��3ޙ䱡,�rb�%:�%���~���_�o�����Xe�6-�v���z;7�H
!��O�
+\��0�k�@\b����-/�?��"�U�!S�)�f�3�g�
+^��և�)s�r�Uq��� ���?2�v �qv�zhI�W�{ ����
=2fS^�e[��v���n)��{ø�]=1�b����xE����R��%g:�5%�
��]�U��jb$?���sV�؄پʏg�t���`�T�����:2� o�)G���4��>���Щ����R醢*dY
~�1X칣BƮ)��\d���C����
+����S3�|
�ޣ��/e�ߏM��-
&}��
-"nNP2�^�i�����t��#�`	w�z����]�I�q�"��L���fh���R�_Gq��:x����kUC.��R�g��h;�䝂�v�"�h����D/�7vEV�}j�"�&��YE�<�[-=��
����@և����͓1���� �{
��oc,���Z��I
��\
�<��n���qf�!w���jzʳM%*~g_�c��
Z�^V�Xے=�M�
��'g���"{�7�cIPwb!�M��}3�to���?��®jiO7Ԕ�Ł*��֬g�uI�gz@ =�ul!lj�I�����,�}#�xI
^��mI}�"�ޝ�Hq�6�}�&�LJ���g[L���:vU	[� ~!x��譱!��8'��0�\B�F֧E�`�R[��'�.���p����;�&D�����A�ز�ҷG��SDԡ
Wq>NB \����͊�����mM��
+nYR8ۗ��h[v�`0�fX��1
+jAK���\x�ʈ##<ཤ����K�2����[�論�϶�����;ˢb��j�V���%�(���
+�M��
x����4���ib&��,��x=s�"oL�O?�26EՁ�*lƉ�\��F�O�@�L��>�P`S��X[S��9N�{��>�v�N4Z��
h��kRx�����8�jKW�=�Y��|����rf&������j���؀�������f��\۪�Uii��0&cG��^�\OK�~l&�\��
Ntd?\WT�/ˠ^S܂��-Y�NmĢ:vQ�����<��r�e����}�5��`SIm���)aU�t?<h�Ȯ�7�4����Z`0NG���R�g�f]�ΜQS�|f�{)%��ݔ�$m����C��uyUĪ�"`C?��bfĨ���R�龪𱮒WaĹ�"�9Tљ	�w�<��-:��h[zlׂ��:�/�1VĬ��u��_/ށ
Bg�!����q�/4v��S�G|�8D�r_M�{�>����[�R�r��ZX��8�t<JF����fR����RV��__��Z�c��9U��eT����`�R|hD&���f�����tb#���Βc�yO�I�O�� [...]
+S
��^�����ڊ�AR֚����j[V
�������㾏 �/zjC
�ܳ֡��%
������짳�l��AX����͆/�x�dSO��30J�2֒z�֐xsi �q]U� (��N̲�dn�[���ki�-��@M�����ʠk-`�k:B��5�ݑ�V1�+y?ە�����8)ȯc�#Su����~5��,��[GO���G$����S+��Ԍ��
�
]��wv�߶�E��g@� ��mj-{3Ńm�0�ƚ�S+�h[}1�
�ԑϦ�&��TCÎЎCU�k�*�uI�ϙ�����D�I`;�|NRr4�%>�sO��oS ���N
��CM�1�
��DȘ�<hv ��u�������K
?���^�s�=��ns�P'cL�����H[EЎ����ovr�� �~�"�?0T'���~Z
���$�k�I�� V�Za	�����������������g6nk
+����3��A�v&�x��9!��uձ��Meľ�o��)�3^蛲�L��#��؊�O��M҈kjT촰��"K�d����{�=CMʮ����3��I\ّ�7�+��|8!U�)qOz���M�f�\(��c�%�N��g����@�85a�~4F����R�/�߯*q�fZٮ���� ��i�{�.d�KYY$ĞzxG
���\ה��Z��g�um'S�Z;����vֵ�d�D�>KeZ����̙�wI �����h-uQ��Сw�³iqE��^@�o*1�@σ 
�
裔# ��F	�|�5y��� ��w�j��c=4�Ѐ�;4��7U��=>��I��Xѩ;����AЛ%~�5IɧCm}Ց����f at g��E6uC�J\SU���
��7�ƴ{V��
@םٙ�&e���c��H���)�G�u�|�Q c,�ܧzb�uWO����u�m,qV��~Y��~Z
�q���S�
+�aVڭC
��l�AX{�v'�
oM��./���V�Qɇfbẖ���"$m���fJ���^�ﮯ��9���%.
�7�˾O�R����
����бֆ��VVԵ1�횼�w�
z{lC�;Ȩ3���̨8�!D�I����wm��[�]�OόU���Z�4
hnʸ�ߧ�aTҖ
�3T
�&�|^�����j�
�"KwUP[Y��;Zt�?@�\�9����N]�x����7���M3��ޫ+�,K}:]]�+�uV��4ʬT���
�
�{�= �MJ)��6���� �
�̪�s�Ž+��9/�r
��q3G$�;��k�����fM�����9�m�,�`c�%koU�4D�'.)�N���k�8��/g€^���h����B�<�&��~R�c�.r������%��A)��1��6=m�����S;S��>"/m��A]z7��ۜ���mO
3�6��rI�������Iʭ?�_u_�Z��nH{�˃�_[^!��
+��4\jHͥ�\rP�E;�Iim1co��4�f�٤���_��콏�F>�����+c�z��=��is�Y��p`�	QcOozmpx��T�������iZ�g�_�J���$L
t�J�ܞ�l����ZB{rM(��`sF �
<���=JnEN�I	ׯʬ��lu�@�n�6���!��JFKT��v��o
_���度�-?՟2=�<��ypܡ��nH���I鍙u-��f�
�^�<m���
Q��o�?
�Xz:�='�n���X_�O��?�e��2��_������O�95�5�T��sJW��Eۣ���a�-Y����_�o
+N�g�!LNHJ��'�Z�Wy��HPKsU�*?y�<�����������Kv�D�{l���w�R
jX��
�w���i�_W�7��� )���c���QL���b{�\
T�V�����s�!ni�����,��v��<��
+IY
NR�k6�[o�
�~���on������Z��e���i��	\����+�qh�s
��(��7ͣ��]@s^��}
_;ǻ�w�[ϸ'!�S�;#�|����%��9��u��j,?�~gz���y����]��%l}��"$�"����
>߫�+��9���X�k�޷�ߓ"
+��a�]����������ޜ���zPM��-bJ����ٞ�cxR���
�6���w��Ҿ�O
���)�9 ��9�P��q|
�y&tk��
�
<]��U�_⮯�'�_v^ޛ!��4"vP��o�����yA��
Բk#Ы����\y@�h�����8n�
�N���)�_���1$%���0ޅL�%Z�O�/ٕ?����Zhz?
���{�)��/p*�"�
td��"��|N�x���,kJP��GFj��!~�^�Ƭl�G���SR�#n�Z��>l�Q�f&�
�J�|��_�y��|RrEP���_@�'�����&�.z��qumw��o���=(�Tї���ݧ �M,l p��Z����Y�Y^��Q�a�RJr��
E�y����Q7f��;ӂ��1N��{\�:��Ρ����l��bs��6q�1}��3�o�
%�m����2�h��~	=��~�9����
}g���
+Q�B��I����۟Q�����懘���|�1˨�-
��eV��P���]�
�
�W^֜tMu\�i��5��BP����G���b�>yQ#��+%U����[yՑ힣4mM�kU�����0�BJ�=�-p� �k�W~j�_��s��_΃�GX��{�g�?!K#r!�9ϒ��>����N%)�����s�$��G��^z�}^�ߑװ�yh��I��ô�?>G]��iF��Z�w��U
+0�7��!VşT�:�drT+��
|r at FnZ��� m�3�<����7��K�U'��*�,`j�	�!|w
Zꗡ��ǻ.�ghXHœ���j�t�B����|�"�.���&p�JŃ��f�s_�T}�5�y% �3(ew�U\L�$����ۘ㵭N	�7�
��3�7=
� �һ�∎�?�K�g��
�0�|��ҵ5
+�J�w�2J�O�E��a
�*rK��c������L�8X0W?�S�4�}k��fy
�h9��:��=8����Q��`��۷2�Q%	pm
+�5���<m��6��Ա�!
�WS�BF*ܧ"�E����]$�٤���G�j�Z&��ջ/������嚣����Y���zK��۷���$���7޵��i�T�
�zs�|{g�T�7��辰;�v��c�g�{9���y��L��w���w������BӐ��0��~�������'��_t^�,��
S�.�_�
��+�}�6=k=�_���/<{�;#�m�on
㮻��^���9�(S�}�U}�;��
��TDT�u���{�ؼ�����o���x���s~%(gm$ �5�k�V�3�}޷�+
����J��ۺ�ko���o�r/�������gc�e!vw��Za�cf6ƽD.�C��L�JV�7V�I��Y�%�!�	+�X�
��=�r�݃“���A�"��p|�A�0���M��H
�9rsRMl���M at 7��_t}�=Io�.1�
π�}�Y�m�N:�tn�☔�
R�;죘��!gW�� ���CZ>>n��j|��,�,i��{=}�a\�t��Wʣ� W
j��4&^|�����?�f�7S6j�[Z񟦄������w]�6�qa�m�9�ï�T��G��
{��
z�?π~���'A΅d�*��k��s!K�e�U>-h�������X��C2By\Cj����ko��DM<j����2�+־l�.�e ���
l�H�{G4T��)5!�+��#���H��e󳦯LOk�p��K|rb=�_�#�
��}2XA��@�.�*v��N�<n�f{��S:|&�'�*;�R�kxV at 7�$��p����ܧͬHi�)� �yxP�a�>��"r
�5ǮwL3��?v�
��\�������+�s�%o�yRY�O:>�1ͨܙfT�6|�(��[E_����l�o94Y���
�����Iĕ�����M ^��0�,�W�Ò�����,�1\�B��8�po���Y�{�U�_�bnM�n}��_v'P�1�D�S [...]
+��x�u6��/6?+�J3X�o�yt�Gƅ-��>��ΉʹP����hH�^9�P�c�'�'%�d����$b������ٝ��c+�:.:�fBC
+z��E��9n��
�ŧ��8�E�%b��TQ2;cz.��L,u�
+]ș�j�ok
}us��̢��w����%lB~\'恱m�
�oxe|�O&����7��V~=J��q��O�Sh�������
4���i
#N�.���]g��;����W_��0�1
��4
<tΐ�7&��q��7��3�0�#J|�s����۲O=��Rp<dX70��衭O�j���{���q�"6rwU�^F���>%�;�N�k_R1!>9X&U&4�攁�ۙc��_ �W%l��6�5�w
�L/O�_�_���k��c���X����s}Ե	J��I�u�sH����\S���
[�ˆ�? �y{Y�v,�:�ƾ���
�)(u����[��5�5m�?l��ښ��+��Om�p��+���?:0��َk[/
����~m{������U�&H����"�����큝'>4�aiw�g����x��A#��鿽2����+�dK����������"K7�C�T
x@�Gx�x]�f��(�}�V��Y�yX���A�=D���mE^��9�9B��;�i�!ݶ��]u�q)ؐ��G 5��t�s����48��[#�
���7�y�'E�ԙy�t��]�#���w�g�3�€�۽�q�9M��xlz��E�>�r�i�������Yۓ�������*?�Mcr������ڐ�	10ǾYry`�Z�6	���M�,�Rt~PE���I
q={4F@Ɇ�-q:B������7(b"j6�1
��^�]wN�s�6�N�9��ejMXEo=0s���P�Ή���e��tHT!�D���
c�oO33�Գ�j��!r= 
v�!W�~j�!�1��O�:co�\r�տLk؝F���ŠA�U��O[^�����%e�L��g�5A�#y`�s�j�>���
T�־!}_T'��t
��j9whc�Z�/c������)z�O=xwO>�������A��Q-�� fHEm����D����z�A9��1�u��䯖�
��
+
1���8d�&�6~���;��2��a
��
+
|W�C��\�[��e�>s�.�2���oM艹��1�q�I#
�7�z3�&7�2�*�s���]
&�ܞ�VF
V��B%�|V��e��
�[J�c������i�\�_�G�z��9Q5�"jg��7���Nq�v�i
�l��L�8��Q�9���Yݥ����Wi���y�^�s
����(��
+�?ul����]�0����2�2�1�m�W��uɱ�nr.	�v�Ũ�FL�*Ex��ݚ&�o��.��8���ڞ��l
s+��tL�� u��'#W\�sL�
]S�F�,��1�(wN�
+\��a-�ί����bs7�C�IE�X���ƛ�B F
�̊Ll���L�ĵ�ք�X�[D�o��.��B��'����
�_�+9���"� �����o�N�F�ϸ�ףzܳD,ٛ������љ��}�
3�
��kUG����L����Uq��S�
bz|�;}`e"�
+R�{��Вb::��+�%D�wz#�f#�a���8�8��p ���S�1;R!fm�p�5��3�u�Ivd�ܐP�2#J��V�<�4as�{0㐋�o�^y�|fF���@�_�Iy��Yf��=�NX=�7���4�ր
S�:�zvy��/�ٶ+q#�;�"ubXǧ�l��s��]B��/�
w�;.n�v_i�����aX'by9���)���3;BRR�W�6�r.s���,�O��B����͛c����K�f9i�2����[x��,�����=� ȑ�^̍Z{���N�6N����q�ga�����1K�@8��JFkޞ��K���}��'a{4�
���~XA\��{
�ɩ��1�"�yd��0ȓd�
��é�%.|o	W70)�����a���f#��b���G�
�ᆰ׹��U?��ڻȁ ��:X�K���⇵�v�
�e#���_$
+)f՝���Ys��;�?��=7 ��<A��}
�\���Wez�ۣF3j��d<���ͽ��ؙb׮�P����e�����a����]�
��ky~���W�`�e~�O�K�+$`�Uvs��kD�E��8����]�
w|c~
+=�#e�V+�QM��cF+�3=@C*|�o	
pu�bл�j��X�Q0 ��-�+>�
���1Z��s����Ȼ�h�ʹ]�EfC@��x@
��ԝtL6|�^�^u�C�z�1Q���Xx�Yktc�Z5�I�9�u�l�
b
��=�g��t\G�ܜe5�N�o 
o���
�Eh^ڀ�+�śc��7@<�~άi>���k�Zμ׷�^�����>��vLQK�R>n�ؙ&�Z�\@ƀ���v0'
@�3c���{�^�������@�.9[Pj#j*�5.�`�E
+��՛��
3�¤U�3�(!�)�`te�������l|ȱ
+�O����t�sΑ��7�m�V�yP�*
+q
�\ER��<0	h1-�S"�����1�e�A�<2L�W��ƭ"������-�=��ʧa�2���
�O��X��]Y�A^�<=���o�}W܈!�nӣw[���U>7����@�/�+�qE	#����D���ۀ����o
�u� l��
rv���hOJ���������~
+�Y����K��y�;������a�2L��
�����JZ�>���z����d���bmPC�Jژ蠎�����5��x֫ ��b҂���4�ev%tlD\MoK����$��[$��AD��x�=���$���̇�}�`�b�����>���_l�4~��J=RR�OJ�M�Õ��+�����
+*� �>�{�����ev�o�X�_�V</s�Q�*>~��
�R��Y

���
+����j���hmy�1���.�j�~U��!�G�W|ˤr��[
��a�5���Ӂre�$�
h�
���1C��s >5� �6�(e�w�K�L6�i0�����ړ��ty��f��ҽL.�H�իc�k�%Zu�  '�,��U͗���ܳЫc�K9�b��yV��
>+
+��һ6�;No����/��necL�Ŧ4�c�{9���a��P�`+4ȁ���Q��
��JoH��2���ޛc4
��?JY9T�B�U�d�����s�#��<����5!��
R�aq���\�/C��- s6�@��V���u���9R�O.���+{!W?zC-?�_ftGd����v�0�;����aXvX��9�]�W��i�������:
y�BE�T�R�Lә�������{�2J�ܣ�n9�
�6rq�@S����7�������>�)
�
��@�y5
�Dv�$��,B�)�l�{�F\�s��L
+��
Q_�L��)�M�yt��m�e^W�/nDI­�n̵�l�[rE���pI�O�Dnu.�n8�v���I�$����ħ`c>l'�\nXK�t��
����w�(�3���a��t/�+�j�dȜ�S���yZ�F'
j8+˄
+��0�L�G�.rL�_
+	�
����5�Yd��U���#m��zb]�Bj9�;�\�U%e���De�.�2��5G,�,s�<K�fp������U��X-���λg��-�#l`#C�����΅>�� �[�\�������u��_�|�_b�^j
�qg�Ӥ{���~��5���#RJ�o�Ҽ5�/v~���6�ڜg�m�
��1z}\� 9b�ֱ=���[f�{UBl�,�u,��W'p7��)��_��"���ꘚ�xOg`�^�R�Ȯy���iu[c�k�̽�E��ٝ�Vo��n��\HL�E �qs�u�w�o;.x�WB
+T
�Mx��F�:�3�	q4�m�b�͸��
Xf�8�p�i-�|��p.��P7�awp�A7�I��޻^)�Y1XqB~��k�������
zvg�P��#�7�lI
��̕7�,Y_�3����^A���4Z^5��9�ȍ����O�8�C;�s�&�.ӛֆH��_���0�)l�?s�_I�
+*��}3�jؽ����S�Z���	K�������a�`{�;ko���I�	k�C�"��Z66a
�
RAr�:LiT��v/�nm�ۣ�����1i��W1
��j8�����0��t|����
�8ŏ�
|��u�`��c�WE�	����i4�h�������9BY�.�,V~�9�}'n��>�8�_,4xd��m����==�$����S�11-�5a���U��퉖��%d^X������YP�KD�h�Ȑ���]7L��1��\
+���Z�,�»@�>��P5�Ȼ�v~o����aVy����B��,J\sț~9�ݽ��
�<
+t6�U�o�Qg}�q~w
+U�Q�SV:4�e!σ�J�P�JLt��X�$�r�
>G�W��c��\`	W�!��ɸ�[�B�ꔰs{���� �Yl��U穵a�%�]p�FH�Y�V�,�<�{`�_Oz����
�s�cxZ��g�\�
+II�����'^d6y
endstream
endobj
135 0 obj
<</Length 65536>>stream
+�������y��9�����$��2N�9Vh
�
�6(=s�ڈ���_•�
�r���W��0�A)�#�\�"�O�6�w\ɱ%a�( C���n;g�E^e7���q�a
+�oj��-�|
���)��_L
���o�z>ug�Z�K����q�Q���u-�K������4�GT\�kV�0��=�=ά�,�P�ElYT���.��l/:����y�����y���iJ��`�ǀ��Tt�c
��ǖU�Z��X�Q���
v�(�8�(��|ArEԓ��=�RS�a%�!���Gu
t��`2i�|`�
<�
+��>#�ࢢ
6�5 �V�u���q+���T�*jhgB� ��O���#!3�4RV���2�����o����E}����ۺ�};��w��'?�,��
����1d�\󤪍Q�u���o�ǻ
+�2|
��q
>�[�}�#?��!���v�X�y�����
W�Y�p�{�' V�B ��*J]HM�WU3��g���1�\s���Yb��^�2��?�9�+Lt�@m�Kɕ�%f}\Á'�|H�l�kX�����0`	=T2Z�f�WFs�j���� �P>�cusS��[�"�*e�`� ���
F\�ړX֢
+�*��& ��:�eB<
+&�,�ʐ��K�a������Q�7@�4@{�E8���
R��!�T�l��":l��"4�
�l��B���u���.s���`�Ρ w��-�no
7\XyU|��ԓ��}�G�����w��p�YF��R�E�ޛ���-�(D��j�k�R�
C_�?������K�Jjc`AD��!~�w���)Q�cwv���3��Cr*$a|
7��*F�O�ń��<�{�q-�1��}#�"7xA��<|j����>]//h��P�2�ʿ�OI�pMӪ�FiE�E!�1ŬY{���c����Qĥ�1Z�s��X`u��
������R
+� &�;�,�.�'�6DM
Xj�ϋ��>	�z���O��Hlޟ:
�#�ٓbKRF
+��
+�s �&i��Ǵb��m��!����u�ů���K�l�Q;�������nr��H��?��E����KZؔ��M����*v��/'A���	�����YrkD�!��"���[Lv܀�qΒ��C���w�����
��
ܬ�/�w��\�/k<n`����w
��=�
+�i��Tf�ߵ�_�޲�a6����Aܛ�
��˂*B�>ȁ��{hq�F
�1�+\��~�]˷{��WbrtՁ��=�����"A��F ���C�
�A)&/��5$�lx
�sT����2�))���2�
+�
���꓋�e۳�O
)����������a�5�e�)�����Y��6���׈�0�	)9��յ��jڛ��N��mO��r�s�Lbr�K�(ЩI=���Q3
�5��5E
�j���o��s��Th���W�=x�'�4Z���m�}��9Hn�@�z���;�1�9Z
�j}9������5��U������()]�iD��=�qB������
Ӹ����Of�E��7E.�
���5	4�<�v���Ŵ
�_F��
�;�5T��gr9�g!���/#�~I@Ʌ����3ۃ�Ғ:�

�ah%z��<�:b���[
��,KZ��=m�[T��4�m|vP-��.�r1�+
`����il��i��G��
�~
+r�%e�폙��Ԋ��0�}
����������)�
����$�D&�m��~3�&4�:�.�*
8\�0\��R����j.�"���At?��Q}�^JD+�Gu=��P��v�C�� �Ҡ��y�&F�,l at Ci\�* #ק,L��
+���P�#*B��h��y��k���yu���ڻ��wơy�GП=	��㰺�
b)hp��ނx%f�;�Ub�����R:":1��"v��׼
+zSHÄ���o�^�~�}\�1ئ9��UĴ��(��iw`����_�l����N���O�����X����C��*
���	
�y9&g����j�b�e�x���Q�E�"�0��7}���V������h3�t\�,�����L"v�$b�L >���J��,�#
+buHNi��M�肕w
�w'�EI#��9�q����{G�����+�fuk��B�IJ�,�d�M�y)��Ǜo�N&
\|�*��������2�hs���o	]�C�x��7�wvfPw��"�O�Ê{x)���y�q�]W���pp簊r�X�Z��z�i�I
��QZ|˨|ˏ�Z�W}홇ތ�(
~��^�lO��lo�������ql��i��JI�׺�����s�
\L@�l��t����>�ÊSF\�g	W��@�
H��A�TݻRs��9d��i�_�9�~�;�~5��PDDŽT�.��]3�zǘ�m�'B�w��RL�
���>)
+�'e����?lҝK
����1��垃g��e�Y�x����*��^�{3��#�;n��B*
�'e�zH5�9l�O�.I�ل���ɵ�3)����4DuLT\DŽ��P���M�5����Lc����w=�~��5�xe��Ƈ���A-��#���D��ܮ)j�����f�`@��t/@�]��W�
�ܠ������=94�9�
+�<cm�ef���>s����k�W�u� ����k�bw9-�ϴD���l�-���O��y��k8���<�ձ5A(��o�|�
�{
^s`2R&Jk@
+8�
4+�au�t"Z�(�5�������e�i0����3	+LԾ���j�]�ƻ�*15��ֹ��Ϯ�n=�
�_	.��
+�}�+e���z2a����r��vL��L)m 'E	���*
jo��a�y�H����S .��vi�긨����t�#���
�b�s��9Z�{����R3�Y��+���4�����]7> 
=X�
�t}k��F��5�Ң�� >��꺸3�v�9ˋ��>��
xUlTD�'����FmT�C������K{
�k>�N
�^DIo	J��el��</� 7e���!�nP#�K��
�yg�S��
s���9^���؅��l>��j�&�/'V8�y`�:�JL�wrmm��c
q-�D�O������|��$>�="{k��VL�/��Hu~�[v�3���o��,�k�٠����g
]t
6����[��Y��k�::$��a†�����$�[̍�Q��T�ը�Д��P)
�S�w �n��o���W��ڙF\u�"o��	�	3����a����2)�:��#��~�����!�Ϛί
��E�7����qt��e۩�)t���#iH#�o���޶��ζ���"n�7��'�<��T�%��<�aS�&&ڳ
��A���U������}�P
��0�cuG�L쾝'NYؤ�
+W���z&�c࠼Z.�+�5��`n��n>izT���mG��y���yj{�͑���Ư����z�:>.��������z⃕�H����(��^���؋��<'n��M��u6,m��
�a)�9,#WGe̶���-�6��~��\���ӊ!9�2i�������ݞ�d}S��o��\\�+�70 iR�;���@���7�3 &���Er�_�h��L���q
�Qj��A�y	%	=��
H�'�_kQg7�p���
�W�u���s��lϲ �Z�E�nT�/ڞa� �J����
+��Z�/c��
��<�3��Z��z������p<9�!eba2�1i�\S�\�"�NB�A�4\dF�{��7���F)� ~t�+aw������Ns`��XD����dg����44+����4=��ib�o��
U�pQ9��qs�S�Ղ����a�m�Þ�s��
+LO�	���I�-m�A�
��
�����7��AčY̘�	+q�`Ls����:���N&�}�%f��(!h<\@�.��`ޥ�����:�����ƀ���߫��y�;a
�)�et ]�
с:����-Ao�Ml����;P�{�RRž�G�`�2�J|��q�魗5'V_U~哢J~��y�aS�,�dC\3�
+0�
)
�3��wy���l�
*ק �'�b��J���=n0n>9�6if�����纮$t�����
�9蘅GK�9
i��>����(:X��l�v��\�9A��.�:#Z.i���,i㳼 �wE�eJ
�반�K�C�D��CM/;��#/��
�`�Du�ێ�γQP�<RF��"��'�TXeb�}����EE&��6�4����Bh��^��|�
+�����k����W���<����r����J
,�d��
�ư��RP�|ƿ
��[����[�z�V�3�qV�_�����'}����8 
E�����)m2S&>5���o�V}���S��zp�
�
�j!>���
�ژ��I���Vº�aW=�B�2��p��O���IGa�+nb@-�uJń��Iծq������
+{�zZ{�����Y������ۓz����푖�cJl�ϖ
aB-��ó���3�m��'��>i~c�Y�:���̓��f�%,l�?���C� x�[�V��VR�'��g�$m_L��>\�rR��I[z�1#����+���ʊd�� ��3
��9�yfk��s
+��4H��,ϥQ��퓒+38�T������
�_�_���\���z>���uB�GJ��+�u1=�z��s�`M�$�3��[��;Q���sжw����-a�/�L��Ԯ_�
|Fw:f���3����0�䪸���`&5��*
��4l\/����j�-"+��
ysye����1����~j��0Q?o%�l��1=�YS m�Wx,��J�������g�Eԝ_6x��-A�G����|3q���G�_�}o�\����{���cG��%9�6�e����p����V>�����[�е�o�+�����8��~���n�k8�}-
�o`v���
W�У
+bjdn�Hmݚ��8&8�~����U�����%V��^U�5���z�	�iM�>�ɛ~We�
+�6��j8�/m&�%
�r�:ǷH����:���
����U��3�1F4���3����J�������g3�m0p)3��+o<�=]�����a�§��p�ko�N8�OƤ�����6�9^�9������i������tN���n<�[��N���C��AL�E�
\����)3
\���x�pR&����A����
�ȿ��h�uk<�/�¾�E̋�
�R�v�;/L2�~cxT�eZǂ��hU@���=����9�M�3���
����+�g��!5�4�q
�5�$Wo�u��m=y`��
Zh W�]�k�>��B2NgL��N� v�H5a5�~FӁY�=���qP�]�Ē����y�����h9�=�2��Kp�
t>�rori�]��[C
�S�Æ�/���������Vuǯ�e%�����$�À3�Q9�䍨FL���
�6��1�6�~yw����\c]�J؍�[���iJ��G�U��� m{0� �7,k�蚨�����@
楌"����O+���Ӽ�?��0[�V��fߋ��\�g�;�1�q�9�� [...]
R!�M/��*��CDC�p��V������<�p�{�8{�
�ؤ���
ƣ��q�+�5�^����oS���=(��9�r�?�h�������}�_ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q�cG��
;r��ؑ�fǎ
5;v�ٱ#G͎
9jv��Q3����=������*��F|�^���Šk0��F��a~T��I��B&���bhTSp"��҅�WO\l� �'N��'�F'�
�
+~لB�1�O�����.��:q������q)��kYW�g]�t���7��d]�|�fv���7�\?Ae]�q�Jv��뗳��]��_7"g��ƕ��n��v��e�ѵ뙽��dgݸ�u�?7�/�����
�Q�Gԏ>�y����m��B�G���\Vƹ_ǯ�@�����0`D���{�m�>�X��P�;5
U'�k?������߉��U�笛����>q�R։�K�3#����#sJ�s����Ɖ���n�z�WOd����ɓ��d&rNܸv�r�G��=�buŴ"rX!"���V���#�u��������`*�RlYXMi��1��
P2:]
�B�2�·D����ȄV@�iD԰����]�~Y�ui]���
�nc[������e|ILI����:>!�y�8�}��_�'�.�=sԊ�Yt�.�C };�H��I���V�X!W:&��
��+E�.��;&;/��ت����b�DU�����N�������rr�s�
���?Xz{�z&�duG5j�"dE�l�{�X�=	���`
�ڸZH	�y����Cc�~�
�3���k�~�}ݗ���kq9�%�`�Zqg
+vm�u�I��cre{���<"�АT	�A�>$g��4<l��Í�$}~e/�+�!���<�0����AFu����C |R�AE�����T
R0[}2ZMX�h��(͛S�g
3헓:Rþ�G8��i��
s����+�Z1;f��x�*�_c��p�)��1��2R�}��bL�Ä4l�OI�O��k��I+�����q�4�Pa5�<���Ƶ����X���g��&6*f�C#F4�&Մ4�������-I#��6���z�"i���.٣ T�e�҈�	K���C+�����p���
I��+�k�D����f����{�~k1��g)���)S�@� b%�\B���fzYG��θ��H���'$�5ƴ<B�|�I�"d�W���՞�������u1#�)��U���"�V����%�8�
��3=�1%�qL�g�\7�����cV:n�4E��ʸ�ܒ����+i��9l�c�P
2r1�3�|��!�1�3�:6"(Ǖd�b��Y�b�D��}1}�O�o	 [...]
�$����pO�r��CN�'��K����\�R�a5�k����L�!gA.��Z.ҷ
�����{����_�Գ�	��3�1���Ћhq����T+SF$idB��`U�7�� ��A%�ӿ�j�k8��?�:w{�����o����z'DĈLB����A�n����s��LL�-��	%�f�^�U��_Ŗو�Q��.�o��)�d{����[W� kF=f��"������
�%�S
%j�A,��+��+��q�g5�%$�7F���ٙ2���&Z{JOm��X�I��ג�
+|E�bA�Ť�|r�(�$MbN��?Ջ~%
R��1};a��+<Z�̧$A�gr!j�CW��.�OB��풧����I��'�*y��Ó���I�ԓ�ZLQڂ�N��MA=4ߧ�d��Ō<|`NXCm��ȍi+�9m���ոR��fD����9�>
��98��X�'���(1�Q-{�:�� ��!f��OZ��,�^�<bXO�
i��A=
���e�r�`
�)��?a��&!}��D�c��L��Ą�GL�h�1Y��96Jz#!3�,�*�51���\
mgv;�T������A���M��N��?�=
��L��W�'�����E�Hمܸ��L��0w����o�F6jw�T�;O)��90��޵0X��c�X���0L��A
�cg��;�d���Hz�:
�5Oc 0EG��7�:�j\�g	��=�}no�X
ԉ��yr��;�y�(�v`���Rk�
+Bypw�5���z����6?��|Jz�{����T�Ո
]��Р1
�9r'> �()�݇Ic_oL'�F�lH\Gnڷ��h���Ci��
�Ix�]�w�TBl\��t�v_��(���a�MZ�
͈q�En���po�x�7AȏI	e��s�WU_�
w��<o�f�$;��S� ��s�ܝ���yDQJG�NiQ	=�.ӫ�
��%ԁ����*
�����y���8�XY���Y�q-v`2~1�I���C+�*mA����.E
)�@�_���/�s�-<��H��͞���O��ب^̊ ����Q��
?�V������Z���j�@�&d�m\�S�/�r�az����;��{��.y��
<�GK��A<'���Ft����W	����9�����	MY�]	�2e����pL����:�Mަ,�:.&�bt��Զ���j9��'a�R� ������#Qs_��#�̈́ڔ�ذ��@%m
\Ԉ��S*=
+V�s`������?������Ѳ��&jǡ	[����`^p)��˘E,5�Wj#zJg�@jhI5�X��e�w;�p%i˳�z���w
W�6�;�zrs�D�$�ΔI�K��$qC+���JVG\Ʌ&�?�!#��5~�g�ŵ�g�X�
�. C'4��c�o���1!���8g�q7�F]D�l�*(�qM��0�>�g!cf1gc�c}���c�p{c�t{w�TZ���w<3�\�<�8��5F��v�4�5N�90 �0n�CJ�혞ܐ0P[ ^C�f�!%�"��pA�X��#:LI@��	�p�
�6�=�f��e�6�"��;OyI���#o�'��y�P�c2f�s���f��e�Iʝ��zk�����?��T�ED�hKiE̔Q�qdz�+x�CK��}0
)"ok��+�t��ed�WF�i2�v8舚ՙ6
+Y)�Xp`��5��03	�1:zr��'샱<0��������]��Ԏ����Y��2���D��A�D@,�5LHT/ G�|
�Ј��|'a�3��'�U'�"�%Vz�A^܏���
��<\I���*���s�6�.m�dz����rh�2�
��*���2�%�:8UHCm��L���}#�����bZ��޽�_Ek
(�8qC_O�,�g�.E�<l
Կ���
1�����g�5� x������Rc��
7nj��};��R�6f�y[������_�!��i�H�8�4�b��k��]�v��)3�t���<a뻗��?�[���w_��ZǺ�����SZr�E�L�K
��T�s�(�A%�8 ��t�P��b:F�GF(�]b���=~��Uқ#
+L�w	z�1���,1�>vg_b{]����q=�I=�ӛB*P�����\�Q[������Ȭ����`��Of��k��~%�4�"W���ݳ�B�$�*~淓Բ�#�btT&†�(��et�
���D穵�Γ�Ej
�5z
78s`LT���]�;.���A)*/�cA]rF��,����;�mL
��v����n�e���)�幁�?럵�M�{�a5��=��
j�Hz뷸�����ʶ�{��M�T�XkҸ{H��3
��.8��$��m�
w�} �~���V���q�af���������k�����_��[��_��^�&��x�19iG�E at 3bFr&d���i���)��-%
4�OJ ���Q�
+mI�8�|w��!F,
\��
+c
�=~2������&d��}�pNVU�N+Y���Ybd|�ֶ|��?�RK���s�������*�݈�Q1q�1�����ASmc��g�6��	|P�

5ӭ�e,lL���E�B�
A��6d1�V�pgF*�0'�ٙr�B~�=k�\�
5�6D�
mQ{�`�Qݒ��b3|f��//ld�#F5d����8� d�_��]�
+y&9���n+I��&)ߣᠷ�Դ�EH���ŝ5��sUv�%ձ%�G����P�7C&��?�ٚ�>,(ڀ�x
-���
Տy}� �
�]$�LW ZY�2
���;�ib�OKN��%Ђ���e����g���|�㚺߭����H
-9�ԑ�C@��ɫ-�#�
)-5Rs=Ө�K}9?/
�
^�^
�bL���so1缓�Lȏy%��=�/>Jrv����,<��!�337 ����s2�}Z�C�{ϣ,;�Е��b��o�W4	�����iF�G	��>��8���WC[��DŽ�����Ul��R�økk�q�}�8)�5\u9�$�y�q�}jJV�,���))#�W]ch�
���)���a���W���|�m~��+�j�ƪ
j!
M�l��'HI�q����Yӛ�c+��!�9/�W%-�=A���_r|�3��kc���|+��?mOʮ| �$@�c�,ZNH���f�]�B�����?��B��9�3I� ��{���Crz�"���착�>l�m�C}�-�ʀ������-�ec���)VFe��,O��e���Q�����ӒRBfJn���H�NF-�������2�Q��'mN�nk���+[j�8F��D}E�`wV"O8�\`/A
�-���%
�$���,�F��Ž��a�0;�"��K���yIM��,�j�I�s�"0�q�T�3
� [...]
�,��a������9�]��,ϲ�������|����C�6�e
X�B��1�+�ZVq�s�uj�;�����C���s�
�>jx�13�5q0^���徢#���-u���F-�B
	A�G�{瞦g�'�)ø�����
-'b`���PC�Դ�A�
h�%+�忙�R�^�8�ч��x�:��`v�bA a&5�*����z�4j��jJ�G
ri�"d����6����]�4p���1
+u2��L�.z5���vԶ�,5��ݜ h3�&�dm%drf�ƣ�̴�Y��%v
R��rУ���,���"����"�Ƭ5MQk�� ��u�GC������'ܠ%	�w9�'A#� h��mR��$�A6�lՍa��
1s�Q+�U@��Mltb�ώ�� 
1��01�~|]ĉ +zՔT�00�[M�ܜ �����~D��"�4~sw+bdW���Q��&b��V6ng^,��Դ"��Q4Ł��3"q���!>�3�d$yu�"E�g�v��D��YXh����d#��S��&�B���
u4���+����GC�uMQR�"n���)�e�i+����u
+ɕ^=�уm5=ok���
|�!=�M��"�c�U�L�������o��|��(��o���
Ul
K�
2W�eh�
������K�{��x&�w�Ȁ&F�6!
+}�&�.W^Z�'?��k$�	A�{���>H��5BI�
"?Oѳ���•
�Y�㔯��*�C�����1�a���A�i�h9x��nc�t'�Q��1P��a������
+�50�:���:��m��g{���▄�|R�/a㑣Z��T�i�
��ě#���\�

�b����0h�_E�YE_]�->V
�a��T
	!�T3���?f$�N1������d,
��5"j�^�"h��'_��t|rtN(
;%R�MJ�.�l
��Q�H������W|BJ�B͏��&f�/�5O��:x5�Jؚ�&�\j|���p���y0��MQ��Y"k��Z^�.�A?\S��V�
z
��iA�̣!�z �l���U��������=��9�����ڙ�򯕃
Z9U�J䙾RQ��x$
� b�+���Ë}z�_�)���i�m�T�M�0Z�T��g�5�	���3��a��s�<�s{�g"�:���U��Ё<u�/�da���'f%2��5��<X�6>
�	bv1?dӑgiߡ.�5<�2a�m�q6�G
�O|F����b?gs���>
�g���_��˭m7�M�����ʠID
�d��]^�W��A�B��*Bz���4���$����AX+$G��k�p�7�)
����
+�渨|u�����܍:�1��
�J�
w"j�Z�L�<4��2X��Ro�Y�55��	"��:?d[�� 
VIi�i~9�����\���~���{�p;8-�,�a.�t��EtBr at +���	I��Y�^�~�\�ʋ�E��f�_
�Lᝬ��
-8��?�(9T!y���A6\�G�Y��\��¸YQ�Z6s�a3��0��V=
�	9.��"��������%G]����Ԍ���T�J��2���[�
�Zu2 �K��g�)��{
53ynxz�
�4
+55��MO���֨��9 ��
ݧ�WEm�O@�!��
��q�
q���1Pa+�8�dbbNgw��	��r�jZ�T�h�)����I�H /��(�#��� �=��!��6�0��^8�AY�"�D�{��>�^����€��uiL�Z�'
��
���
u����>��3�f��\�7>�tco��-"V�.`�"�f��Bf�Э%d��P�#:'fnj��
+��U�QkC
�x��lͳ�c�.�t�ƃ������:d����A���L��]d�mF,��8m��(��;A
�(c�5�'���1{u�^%�|s���ȫ�jcu����ܚ�����nÓ��E,�RS�VFII�R�af�
yW.	�E�hj�
�I�+��j��lפ�4j�	�&	|�
��y�
+9�	�}�3ǫ�����<cP�06�L����㆑g]wgr�V��뙥
oqW��5<�=~�,�DMrI�(nO�{�.�`/��
ηW���0 ��r���1�v��F�l�|Wޡ��y�*&�
9f�#��Zw�I�(�^
�<��p�˽�ߔ�ڞ`��w����G��
+�����f1�qf������dQ��5-f�? �C
�6!���2Z~~���{���1�x���S�o�i����
8��AƋ�$�Sjz������w�\�_ï\��_�N�>u�4��
�Ր�[��1
+�F�NoLS#Ɔ6���ޭ��G��H� 6��!���*����z��WK(a#�������>,
+��/�yA
%z0hPH�%��d������Y��~�U�D�\�WW���mX#g�RJP#�#��3W�U���&k�T"��$�)�{�-�����91�
4�˶մ숃K��r)a�T47�ti8(�A��U�l���1sq>=�ؒ
5�!���T�
+q�\�6U�&��ڝ9� 1+���O���p.
�>]}�W'cE������g����`%���Y�g���4\��	��?��aۣ^���5d�k��ż8�w�*��ڄ,dMK����qŭM���e�����RL�G �Q�&!+`2�Z.����H��F��l��ȭ ץ�"ZH_��R���)	[M�ά�>1'��|�_+��4�ʭ)f�O-�ZS1�ږ���}��]'�KM=pv]X'�y�i�3�y��'�i�c�}�{{"S͏���j����h�h��S�1��Z��^\�$:��y��w3vl2��YQ�S����6Rz��z���WY?����)Z��;��� �	�>-�y�5��8בuh���7[/��Kƍ=�Ṽ]K�[`|~��%!�y������
1-`d�[_
���IJ���G�I�Fv������fH+ ��T��9���!>�}1
4BPrP�n���5�2~����qk �pq��<Z��s`�t�m8bk��9刯x�����	JV4ckJX�Q�)!㓾����X��C���'�'Y9�I1֭�-vKj��
{uˎ����Y�	3d�xtU7!{��UB�� 9
~�8�hz�7�Fl��Q{��K WWx57:rFP-"�e�	���YbV���e�0�U����az���~#���C���!���}z>9��͜X�|�Ҳ*��K�Z1ǥ�U�T�,��O�
�?ɑ>݁c�DS{���7���0���
Zi�!�,�%L�∭�auRL\
��C�4B6yuT7E
�
�YY
�4ᐈ]���~ѝ#�ɚz����&�i�T�(�{�7v"��a�E���e3o�/;�g�
����u�ʼnj�K[-�;�_�
b�[�,[#=�E�IJJ��,��F��b0�a�u�NDڂ\�>���3'����Yp���i1֧���g
=�0��hzZ|�5�(M8�y4R�G#c��w:�=�|LP#$��%	
~
��n)���4��U ��ī����
+�R�׽����~���L2��
0 y����"$�
W^�}]�{��
3�����g�'T�R�5�Uy&��l���V�w���l+�EV���LTg_H���u���]
1H8	�\
6W�ޞ(�m{���Zw��	
)#�dTn�pw	7
+�
�
+p�	��ADwi��}��)�(
+��9EN�Z,�\ߴ���}c�rBف:��9����T6�t���l��$j����5��b��oZD
+�$B�ZB�he
�VHH �"
���ճC���0g�
�
i;��ր���X�� ���}|F�*�μ'�yǿ��Q��'`~��54�p�d���v���
೰���L3�*AeP'"G�
T�&`E!��¶�W��u1ii�x�5�+H�kzFq��#���G-r�2ܚ�U��f�LP��w��|���t˯�
�������]Q�3
�^�bk��9ۅ��1,(E43l�i���v�<lW�GlRi�.d�NP��y
��̘M*��$
�+�l��(��
���M,�!�[�6TT��$�~���
�>��L����a1ӧ��DL\
x�0���d[uS���:b�{�p�p|��U��0'�E!C��R����xrc�ҫ�a�.p!�2��v�%��I�k�A��έ��<Za}��5ۇ:�5@���C
����|9�y�

Ԉۓ���aj0O��8#= ޱ܏���{�3�-�م��l�4�tk�[0�K��
e��nq����B�bE�
+	d�j���5��uO1s���7����IvAH#f�"�^�6Tu�����R{�WoŹ�$��Q�F�& ;r�y�X-�M1�|SȺ393����0��G�~��t)b�}
�VK1կ���ٙ��vg��
���U�u5���qgP��4�txռ����3��Ч

���g��a��Σ1W��<�O��5��aSM��ȭڜ���S��U����O��%^5p���ޯ��k��qV�
�li��7����&� \��u
u�L�:�����Mr��(#}��x
40=
+�߫��<��f���
���2P������
ࠄ�U4�
�&s��4���9�����1lAr
����v66��>X���y{��sC�� �_�Y�
Vۆ<�IEn73���̏�� ���f�.�Z� #�
�ymstF�%��OF³��>���7!��j��j��mw���
v���̥�KV�Y	gm[
y��<��+���;J^�@G�l��\ZwC�M-���9Yc�!`G�f��%li�#6�(2+�^ՒR�u�v��F��5ma��Bz�\]
�"�P���d�91+D
L��H�.!D
|ztF,����|Z6��r�z)ꍎ�A
X�q�]�-Ï�{҈Hkì
Ϥ �j�f�B+���C���ߦ}���h ��Ї�V�BrJ�   �;V.ffU� GB=�x�}0��̐F�Y��O0r��g+}����K���e�6yu at I�
+�h�>%0��_��9��K�q{��Tr|�̩
+��A-/��T&�S�l���=ە�k
�Aɏ[8�8��Zv�W# Am�ǜ�ƨ�^4`�t��a=�$f�pcvy]j2�̧Tlq�}c�*�86R�6Z�O�F�
r�]0>dϔ�WՈ�9�>%>�3Qq5
<6���׀���)��a����X�$`$g���B&j��H/
+#צ��]nC]����̫:65��LENy���U�S1
+�Po~s�<l�k��ׇ���ӝ�l���GM������㠕���e!#>c[CL�j$��UZ���!����Q���#&
�B��T���E"
�k�<f!u�,����N��gƧĎ�����XA�-uO�Ym�ȩ��a#-ߧ&g��W^[�$��卡>+
����������V�Qg͓���m
jYˋ8�򠍃ݙ�V�80`jw��^!�;�"��
�
u˞�#܄Z��u[f
%`�A�0� �+
E�bYl��	���
S'��o�su��r�;�U���=����Dܨ]"�!���!{fz�[y�*����!��%�[l��Y��Cǁ��V��!����6��б*�c�P2
+f�p�b�.�`��(
h�׷��/�$r
��LS
#F>q�����5)��m)Y���[�U7�jF���*\J�L�tPY+
tB��0���U������!5�,fP]#��i��8�G�"bm�gv��
M�
bF%��细ˑ=^'�����)n�j5ï��
�H
+i��8�q
�*��Y�\���xx��Gn-ؙU��dV~p2*v
\Ү�G��h�^
.٫�f�tB�{\����*=�	s7n��had�ÌX���gm��qa]KG� �FH����Q����
+9
�pk}esu6
+�
6Ȅ��6q�A=�8d�������!wwFZ����+d���O
+�����M��Y`
�M�
+��Č���v�>C�gv���9��,��a�C�i*nnN�ۜ,;��R3�J>!bh~�6���d��[��TmL�
+7&0�}F�hS/�C��[�;C�w�i��Z��|F��'�#HN�	�>
#/h��Ni��H�a��VjA��
f�%P��[�*�hӆ@��3�-����K
��yic�!��|Z���Q�/�7��P�"d��-̊��Y���8Xumk���7�1KS�{d��Lû�Lcw�)�
;���U�
�fjUb��E�.SDa|�;�#N�hc��\r'd���p�*�B_ u)��h�;E��U*�s�B�
͜�0/����f��|NbF,ߝW<�8�b��`s��0�0j����r|jJNP�!DtՏ���;E-�f�Ro���	z�?
�).�����	�z��؏�چ
������<�Z^��\τ�=���Rs��)��c���q쵸�\�
���
+�~�\
��4GL5
Q�5d_v z#�$$�
�ҡW��	�%��M"
+y����� ]�N3
�z��Y��uW�K���g�ˌ���n%����kȔ젞�5�+=:jq���o�7�O
X�s����$
+�s�K�Ǻt����K�'��P[JvID[SӶt&L�M^5%s}sq�����8�J�(f���K7�xQ`�]gͳ
1���!�����^#���dA�o�[��(–	�hJ��@H	C��̱��y����7�=��6t%�Db��^4s�A����w�����*9�0$@oøo���#55^M]�G���O��
|�n� �/��勓������l�KeA��6`�i	Yk�"�zD�["Vj����0`�su��N�k#�zM�L���p��Cvdأ��b}W|��Q
�vg��+� ��������Ț(�W����4Uw�f���*6
��Y>���
ŻN� �Y����6Yy9d`�#�P o��V� h�m��Խ��4���q�lB��, ��29Բ�<���q�
��[:ޣ�AD��)A�Bn�a	Ku}�VݘpȪw
"A��#!��#��!C���L�����Q,�����	����q�u�1a�}�7v�-5M	SM}� �#��������h�>%9%����u [...]
1�4 ��¶�7Qg�sȍ�v^�fq��2���|¦��y��y
31˥@�M�	��u�Eā
�s���M������r�xd�B+r��y>�'�U&^�d�tM��'�~s�3$��rQ �+h�HC��#6䬚���+hk�
+Xk��v�$�q��5
<n�"N�S�xy�[��7>
[[�����Bcb��Yb��i��%��7G�
���f���:4����<YU�H�:!>b�T��i�;6fc�xo2��W�;�������nН�aܭ�Q�혅�N�E<�/b�J��T�)�f1�^�@�Ƒ}/N�
Yύ�u�O�G�u�J�QLY�T�f����O-E��dL����X��|"��?l擣�!H����D�"nbN"ߙ�5D���q���
A��1Jy0W
!��
=�}�[��K��k�]���W\ ~.
�
��O\cfy��=S�܀���]�
�8�:�f��42�]^=�����$�W�c�8=��pN��էg�-�3\Sr�=�砂
+�sRvP
l���T��pt�&bu��:S�
ǧ�b��樥�-nW4�8�l��������!��7)�cD,��6r�#w�wum+l&��u��uȘ�Qw���ٯ��a���0N!���\߆9F��a
�u!+�
+Y�ܘ`���"fZ�OOL�iy���L��6�6��=NNy}
�sg^?P=jN����2�&�ȞQ'r
�<b퀚۝��X��_�qb!f�3v��-���Ă�56�x5R�3_ݶ��x�˃v!ks��	~\�ֵz���XSq4v�>6!
&�d��UQ��0W����m~˓ဵe0�~�
��c��e��\
����
&���m�n�z
�W��.�;$b����UQ�6���
��� �O
H����m%��[�{�3K?�Ȫ�3�h���X�!����+𣶸U at O�Xa
�4��c��s*Z�&6�m�m���ޔJ6���Dm
�{���5B{�b���y���!--�3A��=N}��1[Ìԍ~�
� ���M���G�G ��}jV�O�*����Έ�Ⱥ�W/$zt"�>'zT+eDuBrXϫB޷��Q2��:.fs���4�LY�?�
#%���,�4-k[E�]�%o��Hsݤ��}���A|��n%�p�$��∉�U��~�:H+�h�l�JB�1)��*
}�@��qȾ9�ԭq&�3+�����x��z��B�Fˀ~)�Yؘ��Q�P�lj�S�Ҹ�ѻ��0��2����R��fJN�D�
+�9a�L/@��ԴB˫�,�)�y5�W!�>�"9� ����䅀AD��$B`�`u"�?*j��E�L��"J��F#�4�e�u���e
]՝M�v�̩��g!���k0!39��ݝE�gx��05is�|���˛c�	�"����Y�㨓Mܙ��>�+f�dnj�hvd��ڝ�(v�kہ����=�
��\����X��%/d5�
���6d��a��$�9`m�����!
��pʼV�Z�
���6
v�=����V.>de����^����z�-�k�1a��lݛ茬֧g���j�!� �r"��A�B�pֶ�l��~�\��]؈�����S�Cv~�&` 5��?�/7
$���8�|�?L��(��ya3�$h���fm��䐹�-�
'
[@�l<r��(�#�Z��m�wy��|k��;���NP
z���F��Vz*�,w�
]�(<Ց3�zfIH�)�@~��~=3�eE�\�w�S���:);d�q�J>�;��u�"�}�2�S�
�������( [...]
+x	����0������l�1
7���-�+��7�ʉh�,�m!d�?��w�DT�r=�W�Өs ��8j�D������ 1�1��93�`c#&F�_EN�#ߏ��B�O
�I
�6z
2�	!�`K���SQ�#Zv)�;n���6���j(�a25k��#�
��U
,�-d#��"���Y�8�\������(����Ⱦ��^�6l�h�G�\B��!%`�?88�����������.%�\/���j���qGMK�)��Hfa�m����=�V�0.Q�C����X�2P35?l��"��!`�Y���_��<�9y专K�}N���X%����J^��0=ٯ�o���6&XK��
+�~Fr�g���	�4dR<J~��'+�� ��x8�8�~PKLk)�1-�
�csִ��5O�u��L]G
�<b��:!���g�
V�[�<��Su~k
���7K8�T��}(���zd����閵
��������n�y��{����G�5߉:bo��v�����.r���ZB�{���#?i>�k��`c�r�_qk����|�=��[��[������C�f���W�W��|Uvx�u��n��$%%��d�
U^\�<�xU�d������_�'Y_����%G����������/lW��b��Ք���1L�;߁��7�+[�.�u���o�p/�f�&���Ӥ��Ij�� �N`R�L	�a��
�x'�e�4�>�啞�k���)�]�����!kW�"�sl�@�E��A��1J��� �����$���W�p��_#
埦���h�pNi^8��N���d,�V!pM�s�^eP�-�L����%5m�{q��x���3��r��S#*N��f
~^!�5��U�7�	W�S���MV��
5(�iv������l�������S��lϘ�l{TX
T
*�J
jc�zw} �;Ez�pq�ifnP�CG�?�PO���&pk��^L�R����n%)�;~�wd�y [...]
+X#
����+�o[�䛫�g:�N��P�t�n���1�X���
��_�&__�'��0�
+�]�#��+9����$��{��ίv�����6�hw6��,/Q't�%��A�#V�gK]U����m�:����������8)ycTR�5.������$-v��/�#^\�!^
+�E1-�҅�K?BOu�2ҡ�ooV^X�.9������z��� ���9㫥Β�:
�;INYF��]��F_�Ix�9h�oR�
+i�xЄ<ߤ��=.#��r��/+�YZK�ϼ�8�h/�eu {)��T�!�C���L��":b��JnI�-���H�a=�"���m�>�����5I|�؋�mc <z����K{��pyc����@C�\Ô{�!j�z/�����������:*~]zC��bf��Y>{k���&���G�#%�
+(�[�
]�
ꆜ�Oˏ��I��T
�S~t�5���n�U�S�љW���'��~A������}x�5�
�'گb!������ݣ������Ido�\���`?���0������FWչ�
��$z�[P
++��5�?�M�^6��h~R�g���x?�~��
�
+�)c{��Z�!߰�T
�<*�Q)���OO�����Gx�k���W���3O���)n`��~�E����
/�m�a/��Iw�{�"1ˣTm�rr��>�G������:m�92����{���ZBkE�c�[>)-b��=���

�q��z��[Ä[~%�
�?�=�ʆڿ���_��Ş[z[y��ZzP__|p��}o�
���
����s
���f�aO.wR�ͼ��\�"]���ۄ\�fgm�R�{)7�bN�_

U<�|T���Y��Ko��lCO��_�"_]|G�4���Jg�O���_/�E]�U.���S�ʭqN��{�
�	�;Q�z�p7}���3�s�-��]^���觧l
�
�v�Nl���l
V����h{SyzL���r'��^LGji�m���e�nb�mᮺ������G�)�=U}�o�N�1*�̿eܙm�_w�������]q��G��
c����5b�O��ɐ�߰@֧�֪ �%G�\�O�,�(!��D� ���䨭�p��I�adz�
��?/�Ɵ݀1��&���9�̔���Kk���ϋ~����\�o��|#����JA�:r�3p�{�p{�����Y�K�ã�����nn.ؿ�E�9׎:��┩�`�Z���Z���Q���N��K��Qq�7c�/4�%?z�g\��}�k�~�m8�ˋ]�˫����y7 K��լ��>�u��F�7�:PǴ��ߘ�0ׁ=;][r��Zu3��8r��{�
/ˏ��hk)��=D��pP���;ۃ�
+���qsDP6׉m&_���
���|6ĸ�W瓢��G%�_���]�*��c'n�Z�C�\�+��*8��M�b��������<��
+�J~�R/���9����ɹW���������_�ž�>�]�d^r
�C�Z�Zj�{������#�ϳ�3���Y�Ŝ7���
a�FLb��8#k�
��l{Ώ���=݌K}�;��.n�;)i{f���/�%_����>B��?en)?4*z��^�ʹ��n
�s����냼��҅�wUg
M��hj��μ����v�Ia��{v�� 's��z���x��R�o�����Ӽ�k�+ά�ŝ�>.�ikH��M�K���3��G͍_�k��m���ci��3�^rxD����\um�5������Rg���w�';ˏ�[���_ZZ����o,t`�&$t�0�ls����K�}va�
�W+���)m/�w�j/7k�-���`
q�[Z��Ÿ�|Qv��T�����{e]�w��_m�3נ�6pW����W�m�;�N8^�
1�d~�mH���2{���~�(�x���k���ߵp��-vT�ZA<�wz���[�M� =ejs��pi���7dz��+�'�ꌯVz�w6'$ص1a�K+$"�ҫ">X ���e}�Q����}���|aj)9𒘴��7p�z/閡���!f�G]��u��������|u��z��up{���5D��A��K��Iٽ�T5��
�
���M��+E��^f�k���Ё���R��$�)q��ʚ�o^T���0?g���
��h}��<�}l�9hn5�gK���W�G�|��r�V�
�+ʵ�>V�WUW�����7�4D���~��O�b���r���3���j_��I��ڲ�M��z&��{Pg=��!5+���GY�>���V���紋�g�_
O�~2���0ߎ:�cd*��N����-yW#:��������WK��W��r���Up�?��}F�������\�'ݘ{�:fx��Wߜ������ڼ�[�W?m*<�����۶W��GEɟ
�S>�<%��� ��'݄��S>���῕Ҭ��PӖ�3����5��{�ՙ_�	R?
b$�}B���kZ�/�o�k���pXT�
 �G���+��OL����%]���:�3�K�Mm-���
���a)������ٶ��3������o�չ{
m�
�|�As]������lt��gۉg
ϫN;^�ώJ����$맍
Q�r';��wb�=+i��zs�a�
��Bg�q���������ڌ�mϘW��i��Q�Ͼ�:ii)�om-;�m,�q\^��
���w1
|���p [...]
+z0������ch���`��޿�sn|&�=��aQ���+�����k𽷨���G�k�,v��^]{�ߋ�ؤ-��5JO[2=�:2��p���◙Ug _�T���ly	��v��.�
s[�1M}���'�g:�wV�9gMW�~��{�܊>b~
L�K�i|\r\W_�o�i�Q�/1g'$��
���2S
���3�(
-����=Ʀ�}�g�Sӊ����1<�}O�3�O���~�Ӣ�ό
�[��
����W������$]�����J_-��μ7Q]|����M/5m�8��g}���\x����]t|�������-b���C�kMJn��і���%{����'�˪����'G�e���2JP%�y��Iko����'��+�ٞ�W޴�r��G����5=X��ܳ�^�l��?ly�:
����j�氠h�_R���r}�-���i�CC�����=���/=�̂�w�Sֶ�_͏�WԵUGL��lO0�؞�μ��Pp��楞q��1֗�s#��
�\����?��>v��k(9P���?����~v��0���L�>�V�}:̹�� ��s�Q�Iї?�_��/:E���N�[��8���gcS��#��un�eJ���{Q���?�ϴ$���.��ɚ�5���u�9�wRn���_b~�/g{������
�߭�P�����-�ߠ7NX�
+~��<�W����D���II�ާ��_R�C/%ϼğ�yQy|�
��B'��	�H'���:���X���u�i��k}̬�w�[�=��ȚZHIN	�ɩ�W9�DŽ�߭�J��݂ܙv�eSk�/�g�����ϵΏ(2��R�����|���LS�o�����؜�o�q�3���W+oRN,�g_X���ߖ
q
3r\�-,�'M�ч{���$�m�����{�5F�7X�|��v����,���qY֗�_,w`.,��]���
�>)90�
+s��
}��
s�3��o
JJ�/Y�
+�9���a?�������S�k�=����`�"�2���Oא��/����+���_���#-���S���z����
afy!�����>K�BSs������ט
-����w��j&?X��/��_Y�*=����Y�/}̳9��
�L�K��*/�

X�DߙyS��څ�6�����[�y���Â��y����gL�o�~hlH��Ҕ��R'��g���4��V���)%��_,o�7W���M���
+~�>��;̹��� �{L�[�o�Kp�cr��{�Ȩ�5
��N���T����ܟ6�i����ߘZ))kݏ�s
�,�ԁ���%?�����13�<'�&�%�7�$mKַ�������
��?/�S/M7�
�/�����*�mC񏆺��m�K*���4��~;�����[ܹ��������ԄK��傕^̹�W��^��0G'D�_���w򲾺{|���
��|Ky��z�i[�������{��?����~ƥO�{1E������ %g�-���-�;�����Dž?���~�'�{Z������:̭O[q��Y����[{g��
�K�볾� ��h�se�����;�o׺�Y1cM��(#{�	2�e���o
{}} uZ����T3�ʰ��׵>^�|'���ˊ�+oqW�.ۀ����{�O�����ҧ�>[h������=��p}��p���e�l`.[�g��`]���/q'��I�G�{��Y����
t�o��Iɓ-ٿp3�����qO]_yb����Ii�޹�eG��o�w�on�R�(�-y�/J�l
J+�:���:��g;*NϾ� � [...]
+�z��
�Q�Wޕ
��+?����sy�OB�mV̿��[���r��!��������ƃ�N�
�k�k}r�R��|C�j}^��Ғ��R��� '���U����}f�����G�4�uo��}�5�����n~����V�\
�_���
w�=$��O��Ug6�9�k��B[���6��	q�Wü�/9��������Օ�6�5]C�)]M�*Eƿ���_�v�Oo��s4m�����˞I!n��t��Quf����>ɯtt/O���(
+�q>������FW�wx�='�Ԋ=9��x~�=���{ҵ�w��k�l�o�OqM�1
+��=����-�-����Uȼ�#��a�
�%�;���
���[�Wƫ���0U�Ň�Ӯ�]�������}#�[�T�2�,�$\��f
�x�517��2jN�g���1��4�*〡��G�y�C*	�Hӌ:��͸gh)�7)N�l��_��s���/}�iJ���Z���IK�G_����u�;&a�ٙ��Y���;�o�O̷
56e|5�uj�(��������1f�j���qѱ�W�.uU��{StLߔ���e�����/�
%�
�+
�(�W![l���g��7�늏�s�>,��m�p
�&D�s0�s�eGV�W�}:d~�:��:�~^zk����'J9����~�������[#Uɾ)گ�e�`.�ro}2��o�_�1@���{v�&����=S򬯆%I���oO6]T_����Q��Su�
�;�
uT�H��=��_���}�k)<�	�+ο���G_��Vֵ��Lg��-u�R��R���
���Hpw��@�$$�]�#!Hۙy�����;y~8W�����k�rd-T"�Ol���1���:�Op�2�|
+.Ƨf�7��_,�����a���������� ��41^
%ok�;ׁ��T
<j
�.AE��ߵ
�N��e�V ��t+�{��)��
��Ļ�����k.����M������.c&j��1	��K�qQ�l�e�e���2T �g�����k��d��]
��#-/��$/󶁗q�����
+��ᦺ�7�.J׈��\
|��7� ���`�'����U��q�Q�F�p���m2�����6����ۍv�����aZ�u��.g%\�k�~�=����b�wQ�L���[��E 1��Ss	?f�L����N������n�G�0
����~���B�k˃�2.j�nlȼ��_���
+����!R�K��Sps
NВ�x��h��^�:X��	xf{�aT���"�#�������u���2`���;c����3j��^JY)�[�_쩩�i��W��^TKR��jk�ù��N�Y)����޼��o�qB�� &JP
r^Y�������"��y�f��
ͷ��w��Mm�N�M���C��_
+�׋K]�O�G�>���sHᑶ\�.�W{��>��g�d-���Z�,
��$�#�n�`�
3�9Ճ�+�zz~���OO)uʰq�Qd�e
�xi9;�� ��e/�͕��_��W���ׄ c�b�L�\�g&�{�9N=���gcz�QW�k3}*ҥ�}jz�>��_f|�[Q�-)���
���5���� �-|sh�n>4��{�\�CJH��p\��8.���ʌ��;,B�%,�g����#n
�m
��J9�w�UĜ��Ҡ�Ȼ���'��Y/|�Ȥ
1ko���Mвׇh�ü<S�5���[{aV[��������d�}l�D��ǥ\��c�mKX��Me/�9I����
��ԇk�,�_<rr�� �����W�*ߖ #g���	!gǙ��;Q��F��Z�$��נ>4TD����SS�?L��
!�5��]�.x�ؕz�?�f*d{
����L��ÔTCe��1��S2z��qF���z�%S$��uYƌ��Շ������.��2+�*J��v[����d�ZH���.w��
��^x�@�yd����[�o�aL�k�Yb#&�j�N7A��b�U���Y�>��T3 �c��.cu�{�iȭb�o�@^��o�2o�6�t�IY O�jĩ����Kn9��>F���-�8S�~k�9���0>fs���
�l#���fț�T"�gin6��a���Ť8��7�M���L2�v%<�]�٭��]*6�*AG/w���-z��_�j[���1RJ��g���Ȑ�^ [...]

�g�j!٥���
+u����/��y�
�%��1�=��_�\�]�I]m�x=�
}�5��t�0):�6�Jp��NV�[N޻��a
+i��4��W	-jF��"d����[��
��"!��?���E�1T5Y
�r��bG�õ���s�)�͍)O~��D����Y��4ش}��ګ�wT��
9��6LI��'E-���Z0�7&�7�z�����Ԍ��ڊ��Յ��
&��՜
+����</�O?�ʙ���5N/�j�����T�S-Ø0�!jk��т�;�?^k������!Z�m�]��M�5�K
�vb���B�� 1n���Z~�؎�q�1�?��c
��]�Кyw���厂���C�Lצ�%�]��e���
+��7��$ƌ�*
ׁ���7b������9F��6�_�
A#�2lꡁZ����g���uҒm�z�b/=E�Ͽ���>L��1rܕ	F��٦�c
&�Sy��0�ܯ)!kG���4�*)���
~i��źtd�K�B��L��8��^%�
��\#����7��L51��Rl�O#f,tQ�
�q����U��fU�d�x�gSa�S�
+�lM�UW�lUr�1R�j4dk�VR��5�-������}��]
�b�-{>W[xo��8h�����R�F�|<Z#J�c�R���"ѾY(ؖ��7���϶j�S
δe�N�K~ ��O��M��M�S�:�t���^�g�(2ӣa�.ѭd�^�UЋ7{����������� S}�3�$�_���[��
����P�*��.�A������Ŝ_��j�����wɘ��J�V/5
��1+�%���� S[f��82fu� ^�C��+�f�۶�9��-JJ��Ģ�X���y��l,���UI-8cwQ�b�d��z	,�"������

+|��,���S*L
�O���x�(6ѣ���'��[#����@*ޒ��z�.%Ÿv��_�(�?;�,��,�EZ����+C𐅾�7V	X�*�CQIؐ�K��i	�����f���vz�r3#� ¿��~;�Ϻ0��Z����.f�t
)DI��[�cw$��u	�L]�x3݂��R�֭
1
+,����XsC�=�0��F[�3�(=k���6%�.�Q�j�_�Z�i�~Q�V� wZP5�&�4��Om����Av�� ��s��������!�Z�p)��ME�ռ���m����F�rge�R#��Fge�R3/e��
���N��:L��郖^���;�ek�Џ���An-&s�@������fk{�z
��T�r��$�
In5�|�8_Wxw��$p���k���
��s5=x�Y��3\O��,��$�0��S�f8l�lM��$��*��mȩ��*V�g��۟��w,�� :l�����>n_͆٤����?�a�gD�H�Hk�oB@�腼_� ��
C�OW��MW7�L���^�P��|S|�G��훘��񲰍��O
mOWzK^��c�jKb/����y��^F�O^#p��͸��.R�GR�Y�d�DEO�����QL쎊
+�N�K=��x���u)3��r7�W[S�ϑM� ͵�_�t6��9���֏_n'|ײ��h�ŏ��p��Fd�LK�SC擹���{s
�ϕz寥��
�5�[���=3M������y:nM���˾on˹oW cf���YQ����GL��X�������X���DϴDߟ�N��A���2p+}��
V����Tv��Z���;:�뱲�OG�_����ݹ|t��qP���@�o]<�Ox�����ُ��{�M����Y5�
m�����z��d��3�@�jG�]�3�D�$�~;Ž�9R���;5�$9��1|ڗc�o�b�>8�X�u�
�t]%���ђlRF�r>r��1�Θ��$ʅ��n"�n+��r��zr�qDD�Ѣb"��R�O�?
�z��Hģ�����@ao�
+��
i�f^^jg$�$�]^E_���݄�) �gZ��'��a#4��n�|?�����݋(��P�y�8���g7���?

+p�(-%�!j�]]
<�
�w���1S�Vlj�RU�=ِ�J�zoi��!eA�˙�;�|�s=�AÆ�j*�?CO�v
r"������Ob�O�">�6[���h�$
�6r����
2bC
t�w���n&���&���c̊����[��ȋ%aoN�|�ӽ УK�@_�<JI�v�
��@��	Y��x��r�$��yKBMߔ��Z�g��Zr�lGi��_xs�
+�� �~��K:U��͑��G1Q'�O�B� 'E��}<�ލ#iA/N"b��T�Ɲ��'&��<�sRHݐ��W���
VG`ߍ��
R��
�~B���:Վ�<b�
?7�$%5�Ϩ�GǮ��;�*�]:ut��YP�����xE_���Ya
+ܓ�̅�� }s���9�cVZ� ���Jl�GG-v�Y�M	=e�VTCÅ���iQ�E����?��
~uJP}m��xE�ɸ�܇J��̩�?�``A�* �ƣVr�!,�$�0�xaT$(��3��k�A�Ν=�rt��yП'�<s��
(7$�Hsy�9�0�֞���2RK�C�� 3Q���>TI|^��=�+N?I�I=^��ȷgw�X�J|�����6��3���Ao��:y����O����25"^�� �Y��'+���ژQ�ZVp;�x�QX�',9�Hvh((��{Ч{�@wϝ��z���-Л�K�
�~
�@�?���m�5���dt��v���Z���m�č�(����-ĵD�Yjf���/��Ŀz
�
z�{��
x��>0�Ϟ�v������� q����^���6
"aa����� 5�hK��L��GŸg���3�����G�a� x�gP��۠�7.�^\�:�Oйߏ��_<�	�Oؓ�������X��+��o-RL�b;��|������X]^p
+w�,�
(��KP�G��kA�.�=�x
t��9Ѕ?��<~�8�2 ���׏���|:
}ZX�c�}F
�v91m���ǾnD�/#�#CGF�
z

+�|���P��۠���y?�}�
�镫�K�:~��&p��ׁ Zf�]-��� �%m;5�B���Z���ꡏ�Y%"h�9\j0'aG�?{
+z~���� З�wA7���9qt8Ɲ�W@�N�zv�2���of�=}M��վ��>���roA ^�1�GY��n|���h�]�h�{^S�s
��X›�G� Ǹ��W �_� :	�� �_>A"Žc�����,�f�C"��y������E
��Or>�:=�88&�X��G��=��흋�A�n�}��865�\=zW)ć̷�߹�����\
�̌�J�]59C5��*�?p�qG�	�G*b���	��}�ؾ={z��.�n�sr��ő�O���^hG���
+�,�⍝���j�Km
������(�Հ�_�B�.#�����*��9�ÃG��/�.����'W.�.\ ���P��s��w
�*�%��X���X�
+[��-�1�̽�\I�C

P	��CT^tJ��8���8��%����{@���v���C�����g/�n�p��
�@�_>Q�bO(��V%�Ъ�, �̵��)H��Rv�d#n���
+��V�s,��S��{�@�/A�o� ���~=� �x�
��� PtЇ�1�^�,H�2߆���)��#��ذ�6�Gs+�� u����-,�-�?���=(!(���y�
���'@�������7���.�>��YP��GG���;;��t�he�f
�;�cyLl�K�(_#�+k!u��U����o_���yJ
+|��5�E �/�~����_]��4�*0�'�o�n_�zp��5�7lr��Z§�>N�E�$p����ݤ��.J����J.�K�8
���ōk��w������_@^�= r���w���5
�y���-Pax��*p�nX�������
�*������5y%qK[S�$ �y����ܓ���c��Ϗļx�M(��m�_'~�8u8�u��7@���Lz��9+����h��⋾!+�0�J�&���oG���D��64�F��H
��A�@�G���L.9O�-?�Ϩ��W�TLw������J��|Ωj�m�F���D��9�cm�*��.&�����o4`8O����������S��̳ؤ������$"H[�H_
��/uC^�b"��J��JL[
��ώ4���P!<�\
,捻F
�.��d�I�K	9��3O|xzt�<�WA�.\%}9AJ-�ъ����
��:�ћRv�U.D[ƅșN��r�
��S�A?�
+�����gUD�=J1�Jҗ���
>��3�
�o�A�/�
�xr4-<�(81�$�����r���թ��X��`�����U{&Q͎A,�h�9���ҁ��x
{�(3�ϯo�

�x�
���3���΁b�|=�.�F�`�v����x�/
�54���v}��o�	.�6��X
�O�a4����*rP
yS\v)/*�Dʗ��_^}r�6�A��8z|+�
�Rr��č[
�b�T�
+����1�پ����q�q]Â��	�ս��.�~�
.�D��>���8
II=��]��
?}�
z4����?
���A��Lԑ–��mY5}[^I�*إ료lC3⥹��4^MT�q��%�Pi1�z{2+"�wxF™���?^ݿz�������K�q�g3�NP
+J���ȇ]l�[m=⽜�ue��eVX�7���0׮���jъ��&o��&�/�s����푈�W��oQ�����џ�O��
����Qdn�U��{
J�L��%�"<:�id
6�MM��Y��.����zhQ�f��>�q'���b[
lm���>�Hޞ��:Tb�U!@o�8%�I1�ijU;�U
�IrS��X4܊�
[Rqa��U���z���9��IX�.��G;�s
�ž��>j�OɁ���r�+v�`[�*w��U�]�VM]�B��P��r~�����-̙�+�v7�����
���1qTX�I�=����5#w&*Ei+C
x���jG�P����{&9X���۝0w&+YK�ԙ���!v�Ƙ6? *R�W��:�mM�Һ�ymmԸ��i����i�͐5�%��8A�bQ�D=dEYE��xH��U�)��/u���$����$^��8��X��uC���zV�Pc��ᖖlIksv

�ƪ
���t�����̰�����!~޶�������J��X�蘪o�O5�z�k��;E-�L�R���(Es�
E%|����J;�,/��%n�o�q?
T
?�p����W�M��EI��6٣�����ŵ����B��YT�7�00a�jZ��)V🢙�]���6�_U<+骚�.�v��
̔�&zH����觪�v�xke�n���8Q�vO	X��
+���pE>
�>��\
�G��p�,r1XSʜ��m����bV� wUe� E�e%^��ee�G�'�Z��6a��W\� i�Y�
"��OXDDkD�ׇ���f8�Õf���)yN=����Bge�PeOe�x�0v��&Q����ꫫP�v��c��Y	5qn�53���C~t�T�����A��ڨ�z�m
+���ө����+�ۀ6�
#�)jK�ԕ~=�s�;�\򖔐b�a�����
* W���I�kWok�n
�wS�2��E�o�k�͊k,Z6rKI�\B��I0�+Rl��M��dG]�.��g ��N�K����m5�tg���>^�w����Z��,�*�{R�tHI�Ab�z>b��
�!m���hbc��6"(Y�&8d��]��a��{�U�
�Z����
���t�����8��#�B�d%ݣ�

֭���)kvu�pK�.[��V%�(�9mk��hSrʧ{9����g³P3����X�p��`��1X�̥B%�����<�M�'[
�u=+��ֵɖ�UM{����9;H��,˪Q�*x�LG��C3�����J
D����Գq�YQ
���z�=�}=���LG���b��Y�����>��՝��ʊy5gNN/˹0��_��~�7#n��p�3��{�F�\u�MC+4�7
�.���L�k����d,vC��U
��Tm�R������� ,�8��ZVґ[Z>}S'b��3
�
� '����M>
"�+/s�ʿ��ÜrJ�O�Ax�l��
��1�p�#e6��_.���4֥=Tr"�-w�{�D��a
]VW��b�}
M�=�H��g��G !R~�9ee�
���cE�혩�h,�*P���i�p�ȣ8S�*��[r^���t�r9��ځM`
�)�;-ํ,��D)ޙ�g�����aȇ����?W�ͻ��>���߭n�q隺v&e.)�"!��6���V�3�:K��ʞm��l�8�$�Э%�8�D��^��Rr���ۛnQ홚$�
؟峭��->aK���V�r�M��&�1�~�V��z�1�.#$ZFJ�Z%���;4l���x���vs��3ֶ{t��nmC�C�Aͷg=Z�n�?oJ��jT���e�WR�
b�yTO��)\�m�8d�=��[����Mۓ��
lװ�
]%׫����V2v���ad�
�7-x
"��c�,�]A+r��e
=0�F֡! z��:L���7tz���
I���Ax��)�z|�[	��a���
++�}���b��\�|o�^j3մ;�u�v}u햊ZbS�2
V�g�K؛a��wC��q�;EG�L8�9t���X�Pᓽ:
+xo��t��
�A��.ry��3I;R�b콹�-cBw�U
;3Um�Zj�{^P��\;�sY��?+\�y6�c�T,I�=f|��,n؛��+���}@lqv��<00`n51c}� p�?��_
�����1b�����,r�{����EQ�MO-�7�<]FWxfk��'��	X��������@�Ȅ����́�/�zJ�MN/65���W%_\��y��Ť8����7S�:=�JD�TX��rͨSA̰+�Ik2t�� <Ʈ%U���jVke�)qu739�2�.�5��9��t����Ra�7%��fZ��oɊ#�ؼ]���ZV�w���3S׽���lJB�}��s
�ak�(�*�E��&lu����Nf�z=o_W�|h���} �RT�V?��ROi�F�y�\_��2JK��"�e�����w��o�㨨 �2���]�
+g�ջ&�'�v���"f�4Ĭ�I*x]��Y�+��5'n��j�J>�5N���x�`b'�8�B��4���q��6z`�?��G�A��b V�6.۩�Bwt|ꦲ�.��\o�H��x�m���S
jd�S����*�,��m%>}UF͜��}�������mf'��$А��'[�y/���
Ck���X�o��ů=Zѡb94�|�8*©�&��Ӯ�)�
����7����U��\�p����C3���D�,w��r)���u-�9�.v���V̵�� >��yL?��U��n������g��CSu����6P���X��:��;0�p�^0�FR������*#f�Os����B�
mU����4����&)�co�e�v����y2�`�#�(��1r��Le�S�B�B�?w�o�w
��Щ>:�k �Ғ��X�/���d�T��`�`ӷ5��$6�g����V6 q�k��);z>�p�C=��@�
�̥δ[��W'�¨��J��$��1LLt*��n�8�4*�"�~]���ń��!�7���m%1�7�&x��"���z��(�-Tu���
��笰Ʃ���1an
9��uk
�g��z�kd}Ӣ���c?W�u;j�[G-ݛo1����6U
ض�Z��2�����.�i��"h��^�Uɀՠ#���#o��
+���3^��>��x�9#`�6��Z[�K�(&j@��������5�@]I����
8 O�)Eq�u$��?fԏ�.=
�k�[�5��66ɪ�%�t��]
>ۣ��l��o

�6{9�Qr�GFIs�`#����N)�c�/y�ҙu�*�~q*�9k��\��Q�%%����#W���1N���lG�D��\�
�~ �f���")�2NHZ�b"�T �E�]�
h�S'�NUU(%�zt⮦,d[��)A|�
��l+i`s;6ԡҼSյ
=�����ߥ�&���Bj�ח�P�խ��:�����  ��r(�n�[<�:-IYeBH�E��(bo���TUg����SE����#�&��(i��0���`��<��� �{�
�K�K[����"���8 at H<��Q�?K5C�n����qZ
���X�lgq��4�� n�P1!	)�����.����*l��5~ˮ��:R�n��"hs��1�
ߝd#��U�I}W�A�5����ߦjӮ�"ϯs ���q�
h��\ZR�9��%��p��v���	F�{��eo��g{��;ߞ�p������i3T�/�b{ �u�:骜wq��<�`��v�a��Qh(��In����	)��`w�L��'���> �vM|��y
+b���9&� �0�^3��c���9�a��Ie�İ+�.X���F��y?v���2�'�<�m@�
L��Y�l�Lq�ayg�n}�xg�
��{zZ�}bW����w
ͨȟ�b�O�,��H�;\�z{�S'�.)9}����y��x��c�V�1 ��2P�lq���l��}Eo�3-������[��Ŀ���fy\ oK�@��
��2���?�oB�|��!�
ä����'35���U�7M��Ӣ�
���w)9S�
+
Ϗx�W/"��CF/�+9�
-
��R��qX�RO���,dw�Ir�(p ��;:J�K�M�N"c���

4ru���Jw���M�14�lk�n�&
L�w��b����Ҷ�ؘ�QL�Tc���aL�����U�ɣ�Z%�o[���ۀ��M�tԲ=ͯ�9f�'��uO��Q� �����1��Ě���*��	r�е{�
�[K)�+�Yn5��9A�rHq	 _��(��3��S"����mwFTeS��2B�Z샎�3�N�1UY�0ɭ��;
�>�e�zO�Dn+Щ9&î��̢�����]5���|fJَi���
-g�B�ؤ�P�
� e��p�N%%�
��SMʷHPq�����C���
���wc�~.�I�gEM;::ܡ�&[�4 ���~k⏶)�'mH��[Rj������*籥�q���u� �,�‚
*B�EA����kƃ�:t�MU�Ū��t8�+�{�I�k)y3]����#<3�5^@�.�[��Z}�$Ȏ��_�j�-�g���5
+E�
��4����`��L��E*
���[#�o

%/-���Ab�����P�6{���>�����4��m)!�%��k
�m���bꞜQ��V���[��^�\%����G����~�>JL�j)��
ڒP�
�=΁��|�{J\�%�g˫R�� R>t�jW�q�<��(�(��lS�;]cY ;��K'6��C�1��oLr��kX�L�l�òo:���jf7�y��kG9)��(�x��]��c-Rȗ��{�-�����!�7�8���W�7�{�zd�s
��2��l�#�^���J[���Vl��@zQ���1��s�:é �l���6���X�]�W�>#f�5H��
x��!���v�����ᒠ���+����
�
+����KQ�@ܻ�d��"vw_��H�� �r��HcGi�� *�g��aQPr�a�c�h���z_��0塹6�[N�w��k��ٝ
+�X/\D}Ylߟ�J��
��[�#7�?
L�?[U�R���]�_�C�K݅���8U��R�݇3��=]���ڃY&���w{
�-C�;�o�ZL��������QD�s�Q������
5.ms�ҏ
+��F~頦�\��=��v���]ƿ
x�

v0-�۟��^�ƭ�R�:��5US�&c��!�g��>:F�k�%o�%�( Ob��+>�Ʊ){�4�o[�kD�zt��c�DŽ�_�d�{�误�6��-):�e`��ZfŮ��8\���k0�n-*�>�Np����f
y��1��
-������Y��A'mI1Q�Ȉ�~D�SM)��~4���ܺ�q�d]�[�Ey��|����jI�N9*z�+�^wy����bs�kk,d�
�n�ȇ��g���5>��&�9<���脻��5�.
�P��n��6F����C����|�� d��7�����	���YFHɋ�e/g�����?�
��:i1N�
k?����1�>�絮��Ƽ;���+fҙVؗߖ;�E6����
��S��V��
+�3��ܥβ����g{j*���l�?�� ���
f�1��c
�����ޒ����7��_
B��1as��֋
+^�F~���׵b>Nנ����Ϧ�K�o��`
+a�-9�?�k
��>Z�i{�$��
��My�OzzZ��
?4�xvY��SQ��T
9۝�d�%2`�3������1�K\�Ư�1݆�0W+�E�F�ѧ���
�	�n;'H��������^=W�6LL6��w���KF~�y��~̳ߌ5᷀8FlJ����!R�S�ĸ&�
2旙
+;01о)>�������WO��I��Fr�OK��>�1T�a�.��f{�=:�!�@�{0�[C�H�8.�&�&l⾯� >MUe?^l+�jS2a~<w8��i
cWǂL	�N-�3I�
L
�<Sbц�Wn��58��L�=�-'$�t�_-��>s���;rd��P��8��Lsҝ34��q�W��rȡ��t�E� >	�n�7:���a�7��R�r���s�SL��	�$�[�I�M b��!�w�8����)Ϭ�vw��qw���c���@[�Q1�nH�V ��U�L���� ��Q(؛5�5<�c
g
A}3��=��2̉�JL{���

e
�'���[��l
�}�
�L�M�f�<T30�ӕ��rb�
�W?n����dN����IqSu�������Y.}CB�]끿_�(
���y��U�zy6�ͼIKz~̫�71��soOUg�0��ߟg�0Ve,�>�o�� .z�
䠀
h�}��g
��/v��D=9A�~�#Ǘz���m-ۧ�C
\�@� �T�=�0ߔtc����|Gy�BG�[sm�#�0�Ч��w�3�K��wø俘��@��w��H	�,}�hE6�
}z����<�tma��:��m(��LS��aJ���Vtʾ�
+�mJ��ғ�¥��nJJC,�ea>5�
xbMM�c9/������Z���7�����}�ϖAt�
�Q1����[N�{ר 3ߊ�4AM�$�&�S�r����7�r7�Ik�Ԝ�O�����_��b��������fQ�����QpЏY�;���R�6ƒ/�ߦ��g$�m��Y�J�:I�9��D��ژy�PEʝn����9&,y���@��v�4�.4���S�	�曢�<���aZΖ
�����槉��{�Z�
�|�����:�'�
�dnM�
+m2j�W�(]�(}c&_�dŝA}:1 {|�~mKR��M~�0;��|g�׃i&����i.��
�g����~f�%�鮑��1pp6%
�.%&�&�0��M��\�w�Px h��It�[��r鉐���<�n[O.|s�6���rLʎ�w0�":�,�ME��E���,�Q�����i8�3�:B�]l/y����
��-C訩���3��7����ˀ�pJ��&
gK���
�c��~�tl��4�k����H#�b�7F�_[F�Q^

�$A����}��(�L��ixX�
� ���	Z��	b�RR�'󁚟��5�,���������tH`aS�w4��ˋm%o~+��R�������EAsm�AKͥ���ڛ�goI��[�Ԍ�g�����xt���
m�w�3oz�c���9L�7V�����Ex�̲�ad�j��R �WW�'?�ӟ=��+�~r������V�z0I+57�4B^���I�o����rI	9? O`Q S�ӟ
9���*���:J᾿������_ [...]
+FQ4�A��#]'��ȳ+��/�d���|яy����J��s�N�谹��%�v���v9,�Ԑ
�[R�߀~�V�ɓ
��#�$�LØo�y��%�3^
�ޖ�ܚ0ߒvϭ��z���k��`��ط\3�s����+�����
�KG-�x���`F��f��).���#�����S���[��a�[���]�Ϯ1|Ҏ� h� ���ChX59ou���9����q0�IB�LjLr���۞	���S�8@/R��������}C���M ��I`�SU�׵��K��������uog���i,|>���r� ��,c~?=N�<��U��,�@?l�b���,�C�CxU�,��"�:V��T�rkk 
�k���ǴP�PZ��i[�Ir��iN�S�D����
b��,,u��ޒS����J~a���~Q�H���<���^
�$\]-t��
+Ӯ�٩�F��OV��~���ڛbag��>��^���	~-�m �l�_m���� :|
�s�����m1cg�90
���Ȉ����Jf�)�(��ls���>|TUy�u�ק�-v�G�Nt()E���7:q�ͺ��gxi�N(iq��#�xT<�����J[�;��^~`d������aS<��\���$维\��(&ޭ��
^�_��!�|Xhο�R~���0��Yq��t�U���Y�IZ񁁋���.=<eKh���3��k��ˣ�U��d?s*ʣ�tp,0�?�	r�Z/�c����b�� ��cS}�Վ�Ǯ��`����}��Y�^�=�#���_^�+
\� ���MQ �.��oN�KM+74��V2�Ι�)�|��̫[�9?p{��GE(�[4Ưi|�G
O8\�T������Y@�N�ဎKۙ$f���R
�U�O6U��fH�UJ.�7�8�Ql�rK�ͭ�����ņ�۶at�g��^<��p�G�8:
��l��V
|��5s���vm�#= ����
#� [...]
+���5ŧ;���mi�����S��ƙ���(�{f
����
���7} ��j��}=.�&)y�1P�C|��⿏��&������
+>B__���gSQ����c�G�܄ۛ FK>\��~qv���3�}Jb�k�<d�%���ۍaZ��
��������^5&e����Fٛ�I|Ώy6s���{g�
+�h�W����ZoŻ�^�7�8.ͩ$f�K�1����RL�Y�,~�D��5&���~?oj�z�K�~�q�X�cL]�Dd��?W�
��������mYY�e,��Kh�)���ܦ`�d'���
�*r��h����8#�Jev𩶊�k�~H�b_Y0� �ʖ�P����W�J?ε�ʹ�ݝ�̺�T�|�5�����M=gGˀ
�
+k�Y��
��������+�
�����x��]jnE��h�4`M�+��Ϛ��tAޞ���~ױ�Ϲ��q���k�h�e�—�-���_�5m���ԟflޡ	�f�y3�
0�w��Be��L�ضF$�ʨ�?f�m�F6姙�ۛ�{�7�2�NJ���$hpĵV9훮�ڟgS�Zb����!hH:�(��v���.%%�&��.
���N�:K�=��7:s�o���s��R��ptMEׇh�v�9�����lJPa"̡�$옘H����gn���������	*����`�oВ��L��^��U�7F�~�y��|���A�~m���e7�Y�z���e�_\��+*[��FH��
\�~^
���`��k��|��Y�ш�.-�5�Op�1� 
��FR�U���H���^�;z.ޭ�<: ��,��W��
j�!"gڊ
.��B,���q.d��9�����ļTQ�J��4��'چ��
��3
+.��m��=�^��\�z�6P��|�>�e0���
2e׈�YF�oH�q�&k����r��3,���65:i�+�C��k()�ܧi�7�M �Z(
Z�ϹojH��
{wa��0��jEE�[n)~�?�%���I&���M�H��)}3Y�s��9N�Т�կ��
���ڮ�����"�D���9�g�$S3�EF���{w�Yᓳ�
)b�%ȅ	7�I17�j6v����]�M`<D��q��
�!�^c%oc����
+8��,�OO-v(��+=�A���/�o���,}�()3��� 2ee�/ae>U�3�X�a�w'���jz�W�����.t��]lK�}`���L|�Z?$d�/���@��٦�G[�%!�,�@>5�N����̷m���?�Ff*k�t�
+�0��|]�
� 6`����+�ƙ
X�\	sM�v��J�JZ�J/�3�S߮�c�::�3�e����e[l�ee
#�.��,5d,4��Vs�/�6��Y낽q���.x�R�|}���&���!���#A����)�g���+��fq����Q��s|��

�4���&B��@�1�u�RnlSs��IJz������u9/�)ɑ�:�^���)�>rB39�^7����!D؎���jyD����g��o�_Ѝݚ`�m�j�l%~q�o� f�h��0!��^ C�����Eb`���)o��sZ\�3��n-.�6^b
/
w�(9.9�|}�������d?h��^�,�~�q��$��!�ʌ8�KB�
�5bb.��r��J�� .zk�ѭ�|���/�S�T��
+�*����^��V�c$z
�t����3	v-
�5sٛr\����(�h�
���;����&��qI�d�R7*D.�((
+>�ڋ�Z�G/vU٤ظ�~d�\W~��H�m9:�G�T;�.�)���_�U���z�R��_[R���H�6%�`�
��9zﷴ��wΜ�g25�I2�Lʤ�j���{�]A�wP�W�H�*M��R�d��9�>��!���������
k���=
�yhg��Zt�s��-#金R��P����}ŷb:b��^qk�#��1�nq3
+����j�,�_蘈
�4���t���k���= 'z��h��
�e������������'݈�
)WN~b�~����ԧ�Ƌo�Ee��w��T��*8]��MV��
W��� }�-�������G��{Z��$��W$�N���9X̝e~w��=43I�

�]d��|�{�}u����6���
����c�Z�]V
��"��Z��{FTY\�
I��Cs�W g߷t�_t����o.s
+/��W�M�=ޔ �܂
c��_����?�h��N<�І� buN\���t�.�3vM
�G�h콝��`gӎ���7� �2P�-#����k�Ah��Y}{�=�{-�2I�(��,+my��F� _��d���?�6���
���

�$�,�S�
+T��
<-�–��b�
=�w����=
_�o&4o/��D�M�Q%$X/����X��}+��kf`��\����M̭�7�?�/�
�dnL�^�xuW�^]�4��O�y|x�JO�
w�
5�7
���
��a|�E�0&�@��tG���!m}��k�ы�����%�.�@�BN|'Lx�s>x��G.��Cн
ĕ��P�o��Yx~
��ˑ�O=H�n����5���$<y���wG_�ok�W!�q�UyQ+����X���� ]
7b��lyd	[��m}��jx���J=\qT����E[KĶ�n
��討(0y�1ȋ�e�-��
�hu�=��S�tu��1
���i�rT�
��IR��c Ft�ڀ�P֒�-L\Xǀ���ڈ��
���J�3������T
�C�mHڞ�
�>Y�n�( y',�P��W��|Kٔ��:m��:�lxa�z��[�:���{�����K}Mw�**�S4��ID
�ۊ���{Rʽ/����ژnx���Iѹ�qtFDϢ|t�����
��*��ݰc�f�G��Ge�ʸ�ټ���
���{���v�(���q�4\>�� 
y��/��6Ru%1���|�݇x�=-h�
 ^�Xe�*i�g O�cW���^z����_�gPE�\^T�.�5�k����c���
�_��.3P�
LZD�)�7�Ѐ� t2�Q��b�e\��0=G���$���Y���<
����U^��rN��+/��;^�F۞fڒ�L4XT�-��I�:ZkLϊ���EP��3��%~���lc�G'�6Z�4��-58%��d.c[��$��g���gb&���R����m��L�����u
B_�#�
�d��q�
��ω��O9�����2����h{���/�Լ�1%�:�d#Vƨy#�“�ΦW[>f������n���3S@�el�!�;\�� ^>r�,�ۻ��žM��]��{���[�����qTY/,���Y�Gl�V��Z��\�����.��
���e�Tp��
 �/�D9Gn9%
�6�-��&@g�����"͎�A
/�!���k�ps��f2Xk�.���}
�kؒ}��Y<��Dn��Pyk3����	XrXMl<r�:�T�s�#{���x��e2na��K��0�;��x��ٻe��5��m��}h�?�x�q
��;O*tK�J�_�+��<#���WWˋ�;:\G\�(���x'����+.�����H�� _�;x�--�tK
/j@雊�\�d��Q�g�]S�r��z��f��ڭ�7��Ժo�"��\�':����&bW�B�
�k�u����cKMh��}K�y��H(�)񥑅�
[o�Kg�E�!��5�)T��K���
��ߧ�'񹧜=�׃
�
S��k��m�Cj��2�t�Mn�]!
���x�T{��2[+,����6�Y���`�rl�M�py��
Q��OU����ʤ��y��r���*tQL�ȉ����yP�{��I�����j�y\�VX�۲���w��9�s}�+�����m�����{q
��/ N����� [...]
+�;n�PWg�پ��'q
�����<K��]4tAR�ӌjWo�})"����?ɱoϙYg�MIfB3P�Ĭ|�}h��z`���61p�@��1�jv��5G�TR̎o����ȅ�z�S�}�v�
8{��-'�y�$���s��S�\%��7�H?�
kIئq
�59�,��t��2uS����޽@h�N����<Ǝ�C߱А{+���2�ی��-3�m.�>)�"nb��jrݒtoVpf��7O�N�˽5��
��ȷ�����Cqht�
+�r�$�v����\"�b

��=�`$�&��cFMtxPK��k���9v�. ����u�9B偳i�1d�w
���7�] �1��=�^\SRk�¦�~�
�.��jGK���1��)h�o�񆷿�������Sz~���[ʍS��k_��Gdm�@_ٻ��y��o��7����܌�09�>�{e��!ܛ3q5�)n
��gBK��
3�y��w��8
�2�;��7�$��Մd���A�c������W�Q%����}g�l�ښGd���~�H*.:�OO���ž:-%����6����
w�3~t�P�bRnW��94�
+v
�Y���G!YCҾ�rl�c�l�����_��?���<l��v��L�x��o�I����9|��_f�eW}c�4� ��]\v����y��q˃���?]���3��3+_��
��_hN��X�ʍ(I�a9�0���mȚ�����w�,Q�\�_^��'-M
+,��l� nt���V8���4 �O�`�
�rh�ŵЬ} ��,k��L�XG����rYx~�ǖoN�^��ߜ�&�^R�<K�~ퟢ֯NP����6�����#���I�8 ^;h at Wʻ�o��sn}�
+��Z6!�dA�Z9�@�nI!i�)PnT����K.�b�o�N�����ŮQt�GO��"2rB��8<я� ��V)D��ٕO�za����+Q��ɺ��T�m����-|��(2����"b�1�2J���wqC��
/�Y����g��;*���N��y�
��+L�C
(��~ �uσ

ov�Ԏ+�휀�˩�����Q�����y��X��
@
4��
����ZSԀ�n( %+,�s��ת`$1�*b&��(�X�O���2��
���_;z>%�H�J�oL@����\_���,_�Ԝnzs�i\���
<C�+�U����3�xm}��vL����Hk�1r��	軶��_zz�
wL��iD}��<v�y�)�
�Er�8���:��Jo[���T�5��L�\�'VQ�-��W
��Zp�P��i}`�,��/��7>��>
+J�� #'���߸���kx5WVz��z���ȂmkI�[2bˇe2⃕��Rwd[�����
5���6
+�^~�+�������g�����T���W)����(:�3�|��+<�$g���~ݳ�aY�����K���
��du�1yO��0���
�{����L���a`��aLE�s��嫀ظ9
K?����,�ȁo��"��w�1=,'�j{���d
�y�c{�P�_��d�S��rT\ղ�Ϭ�C_�&ѥ��k�βہD�
���
��2�����
(��+����dڱ��?v1�|��
۸��5�
Tt8Q�B�~\e<S��&{G������SMϔ���,�
+/�$��{|垞ؠ��\���^D���
+Y�m|h��cu��v@~��tL�̡�/�F6=�̡G�����C
xN����D�#@�4�Jߟ�e��?�����8����W~���=���� �R�RLG�Hh
(���%$jd��,��h��W��ʜ��L=�Wlc
o��9���
+0�1;�4�A
�%h�2v�ֶ�{g*n�����%�{�ӿ� ���DD\+� ���\{���!7�H�jyx�Q�9��r��n,�
g|=Ԗ��<�-)�~m��H��.8ў�-G�ĕ�wۉ{�
+X����:�}3�������]���������
+�c��"�

bP#�K�TQC���^tお����c}���
�������V�	O�߮��rM������Q���Q
,�#��5K��e
���s���_
+K�`5����vBF̸���H�o�w��}`DW;��
+~Y�������
t��a��:�/�p���
��=
�$�D����V@��]���Eg�1�?��m����u<v
"_�Fp�K��?DM�'>��td-wUߴ�~��a�;K��

��Ȉ�I̿����W}�,��S$>����"�t�����]Vdɑ��?����
�0����m����&�&�><}�-��sf~��
-�V�W��%�������i�0<���������D~�/QZ�:f�W
+�Tp2~
�A��t>h��vlt���N��op�/]�m}8A-�
+͹}:��g�bZ}��Ɂɖ�GzX���UTty��K��� *�:���wrF�

zhõ
Z0���8�"ZlqH�-
���
%�~[���X�+4쿽L�Gv���d�m��輹���$������������[������徖Y���.�ʯ�%�I�@
ˌ*��[jD��_
�‘�B<p�1;+
J�@�-
��qʹ�=^��
��Q1siq=1��a����
�!���Mx���3�c����|�c�dÝ}���莎��*��-
������SM��_�_�Y�E&�m�Bҝ=�w�yUgb*\�{��s��{���s����Xۓ���O@�}tS�*&f�!�
l�_
��]�
��ЛwT��C-��P�Ů��߬�`RB�*{��:�;#���⊖UzFϯ��=�Ɋ-q1Q�W ���-`
!QCR�:�)���n�_��t��
��sa5�fu�bS
+M������#�bK������ݜ@�YDÀ/���I��%|��
�5nz�poT"��ގ��HM�'�-��gQ)_
�=�l���
�� �~[�nyb
jK�L�����4(�W05z~��i��Y����;�6Q�xo�
+�_�z��k�ȼ������
�����aW�U�:X�}�����w���_m� ��#-����oN�����jn��2ڑAs�
+b����Zd���cJT^\�*��	�;ZB����Ӻ���{3�h���
+�գ˷�DПN���=�2
��%A˳

���B�؜��6�+~װsOB^�G���>	N�V	��Տo���b_��#`�[ț��&����1��R �v at l�P�!���,��������%lmd
�j���<���Us�
���ٕ���yg���ߌ�&�#d|�#Z��_}��S�攳K�Jn��ԫ'?iys�M9
ꝃ��Xh}�k���jT�k��YhK����	0ž鎌���>Z�;p�fޯ��7�#�D�1������R�+cw��Չ���
2�?��<0ќ�)�{��z��g"�'�@,l��H-��E믾�"�}?ۑ������r���yg���{���{\�z�RN�f�9Y{��_t��Yx-"-��T�;�!k�WX����}C:��¦%�W?0sH�zrӎ�P]$W��-7l¶;JF��APƉ����*_}3{���Svqk�=9��T����
��--�5n��̈́��
�����E���qe��jd��od`� ��t4�G�3��q�]T���/-��
xd
+�����
Y���X�g`�
|Z`�T�4������񆵻���|c�Vm�_R1J�-R�o�
����5��{�a�%�ޝ�mɻ���Ρ�[&~�U����o�����Ց�
+=H��1�¶�oT����
T�G7y�@�
ۡ�GVX
��������ߌ�
��YY�a9*o}�ᚻ��w�����_�3/|:�Ͷ�7íy@�I��5��R��-}�����?Jq�~2w���;Z�$�"u���P|�����w����$�e�0�{zLiH
+N���n�Y��n���>�ތkIЈ]����'Ai:a�C)6�=���rO�󘚊R�ks� Fc������dP�jh���o��n���p�k�0�N�~ݜ���؂�<��?�)�R0Z��7�Φk�	l�!�����K��s�º���,��������TA�����?
�x}1��(^��>*�9;&2"�e1�vn��[����&�杨������ӿ���L����=�cjc���;K�ʸۺ2њVb��@,20�ώ4%}�]}�r���r\��_y~
��+v��OgH�?SK�|5	�9m�n�1�?)�?xE�v
��=�I��]����7��_�I��%���7������`�G6��)�|d(�D�
+����%v��#o)�!)*=0�z�����v��-�[V��Ϭ��'f�55�䔁]t��YtU�N9/#'�\�*�
WКË4����铴<_�T�
�V�Y-��6��6 rw����
��J��c=�n_
ɋi�%[
+dޱ��UcK=��X�=�$d��H%��ֻV�2b�	��~�Z��3g�Vu���v/(�W�t7\�A���_}�����'���?��W���V�$�f
�{�9��
�r��S��Q<-�Ėm6�*4���AR�
+h�J�
؉P at S�����˸z�P�=�����,��ê`"��WlL�'�$��1d��]{}�#딅_q#�"�tb
+kN�{b�
RT�j����T���n�}�p��Cs����H t��_��9O��8 ju��������N��9�6����'Q���z�h׈o�v_�C'�.��OqխO==ŗ�
�����R�t�KVcʭC#��5���N��gkn�JJ/D5mo?8y∖���_1�J�|p��àm=�&(E�f`��#��W�����\Bɳo�ٷ�\�{
���
(�9X���Uqu�#�[FɃ��i�ò��-5<�/ky�k�zK$y���{6y�Q�<	�98��
+���5�L at E -��&�)�#/��J�7��>�a�4$��懴���y\�o����StY�z�[l��3�N�pJO��E?��J~�2�Bd���
_q���v_P��KRޥ��
|9��uǻ�L!_}�h}����y��rg��#
h"�n�`o�sĊ���ٱ��!
l��H�e�f��q
SҚ7�olªs&f��R̻o�?������?�q��X9��߽}��7F���S
��
�-��Kޞ��{�����w���=�p�-�?w�����6t徺�]x����Zl8�QXFd�rG��:,kO�*:Ҷ��]
�}�Ā����<�20�n���.� ^~9
{��"���zv�i����^[�`/�Z2N�t6?�v�=���<aa�]ZlJ���V�zc��?ǀ��dkO�U�D㣠
��;y�m���Zh�"��5K
+-�2����s�#�5ҡ��\�����?����}��@�BJ&8���U]5��
+���ט��ߏ@��.�5�t
AޅT
ʦ�
��!�������p��&�eZ~�%Q�
�`��m=����5qhc��zRCXA����R\^p�R�.g4.�[D��]S��w�<���v����s���
��7�Ր
�����(%-o�~�ͼwd$ ?�蔈��gD�ۈ�C+
�1�%�Qɫ��2
+����Sv�B�ꑹRȳ�,�Ip��!��l����_ �|�Umi%��Zf��Q���������;Dš�I��r�*~�ـ
U���E
Ȫ��5%�BdՄʸ���:,b�%Ԋ{�/�瞓#~�&?r�3�+6�-���׭c-�]s��R�9�>w�@j�Q7�����_����
K̊�jz�OZV�[7��G�|����>��f�������M�t���r30	z�!�
c
/�Ԓ

I{zTE(	.��6��rjMH�A��x܈����9�+�6��1�Z$����
�b2�לּ��($�k9���(��Tҍ��td=�������w�ܼ�vq�5����2�+n��/':ޞT1+�#�n��{~���{zknYy猜�?
����P��d��o9%��=�I�㳟m�a��]���$�	�+���'j
���.j�u1%�?���AE(�y
�sR�+>m����/�	H''�/�&�>��,���`�ޠ��
�v�kQ���w'��7�s���|cv at Z���D 훸�

���U�zxAP��ju
�N�ٛ8l�
���t4*�Ƶ��LK��D��������t{�s�!sg�zGQ��Nx�
��YTw�'��Y [...]
))աEJ�o
����p[ǯ87C(:5����Z���0�袂V~�����𗟋:y�S{�>�Lw���%��aּ�����|����Gߍ�ҾW��O8U7�"�s� �V
y�)N��R��Dlռ6^w�?�t�5Pqe����G��j/�3j~s���ج�߻�M���
+\�oRd�YJ��/*��$��Oj��)�)���g�?�������Ǟ��cu׭���R|�	A���':�}�oK[�C��r.ZE���
螞��Ȉ�;*l��X�u%�Ǖ���!�J��|�h+�H�RV�
I�ð���"6�ZިX9g{��|擐����|K(34
IQ�3��I/\
)�v�
~������
Z���g��Ø��]0�Ўm��B�
�pMW��"<`���g`9;
+$2ϑ�R~Rs/���I�IH��8&=4/DlN�jB󜶐\�_�a4�����3�t@�f��!_�g�Y�%.am
S0 N?#���8��;7g o�:��l,��2�ſؖ�e ��Y���	x*�#M CÂ���ƻ���
����!9*�+#LRR�V���m�G/`���2��
\��E� #�Q��&b˟����\ut�X�o!v�4X��<v���Vv�JE�U��=+�y`g�?:�¿V��eBӶ�P
��f�r
!����
;K�
+M?��Q
{�6A*t
t<Y���٘n��
oy`
h�f�m��
�Tهy�ARZ`�V����
���h{^��԰L�t�
�p�=�|"����:&l��$�ۻF�V�S���L�&��##�%ׯ���Rt��Sqn ��UOk�Zz��Z�r7��:�g�������y��r�rr��,�� /WFړ �]j�j��e�_blVx����" ;�G�l��|��
}��a ͉:���;��GS�w��)��t��q�fG�ۯF�k�p
��gH��9e�?%��&��?�i��Ħ=��W���(��
� ��:��1�WF��o�1)�-�S�� R�5��<��_��+������
��\����:��Y����������_4��_|��2�4��)��	S_S��2�u������FN����'���~&C�|�:�/�Խ��.���s���1� 0	N�Y����^ϓ_^���RC��-p���wS�ܤ#��N�s�о�G�D�wJ���3��_�m�G	�w�oO�(Y������
�;jLE`��
+(-����X{���M����ק���l�P�䴖�
[���΢�~%�_��$"�s
T�
i~�%��X�]+
h0Ķ�E
k(05�����>
��u6�nN�<ױ��l��܊���7�6f �
z�!mzz`%�Brd�� 䩭����
4-��V����6��
�PX	όj��6:齝�������e
>�������d~X����
��p5�ؼ�x8]�:B��(�w���� ��O��dc��ٱ��j��l�Pjw���<��?�{�
����-���W~ns
��$�z1O=C�WQ5�=1�
NY��N����

�q
�m��al[yB�4�E�L�x��t���E�C�h��"���-�96��%��bh�Z�:��[�xnd���l�!�fzGڟ�Eg֧(�a���Y喢=�1Pva�����d����P
Y��<cЧA �?Z9
��krl�W��|e |o}���[�kda�,��"�*���:>-,�6m���iN�z����E<vORK,J�"z]�o�4�︫�C����in1�U��f�]�A֜2�.M�+/2
+�|5ӑ�c�ܜ�t��R�Wpa�
+1Y=�I�f��fT�O�\��4?t��_sO$z�^D�ĺ���nX�, U�	ʱ
Qek��Sg���Д/[S���g|���t�>M)o+L��ѹ?տ>�5˰w]�r2~�#
~E-�����'T�֫����?eV>���A������ɚ;+���f���u7>5
++��A)�;'��?�h��ޛH�C=�)0��z
��;v��/�7��Wܙc�?lyu��r��]
W�;|�з:^��Ћ�h�7�1�O��;Z�Xv�'%���_
�ЇU��{��c���T�w�ګ���^)*U��t��s�y�A����W�񪫁ɚ[�ceWZn�/�����揘W�.��
2�������'xo�vMdXL�(�R5'�o�B{�q��n���]	����^ձ�G�ߐP� k��
+�Y�.���ôt��9�/��1�Z���
��3�ZLپY�WT�s�jf�_�hr��^GT���Ј�@߃
�����_�;��q�6?
��`CO�-�`��}-���D[���:e�DǬ-R+WfH�*>eC�۵"���^��^��+�%�rT��_��s����m-�8����D)95������ߨ	i?8�
���9����L"S�u�Ƙ
W��AE~pRq�Vr�_�Y
�B��z\�u� �bC�j6b_OhI̝��e�@�D ��Y at dĭlFh��^�;K��!�6T���2�_�5/�!���;����uaeWbn��,1�3�}`�/�mYߍ#sά
�� ~�	�
�V�!��'	�|rR�_� yY�>9�vg�M:��:w�DpP��4C�_�j��-�:ҳ��_SR�6U��]K���p`����聺M)�ls�\��fGP��y-����!):�"���@|wFC/�cY
{�
%�&E�n�a���"�����N&cC��[�"�6p�A�9�a��z [...]
+���
�Q�ݭM�GT���
+[����8f���&�����T'�8����`���!`��!������S|��Sy�4�),yz��ۧ�fb��
�衃�
.6�qtg�U���ٳ�P�e
�=O�6��*zS"6I���?N�)��w5��F`�Pa��T����*��ww�4X����<4%����X �n��Ġ��+`�v)y��~�cvJ�]�ϑ��y�@.��
�m|�u���3j�h5t�g�`�=�!^��oy�ˮ�.��bzU�lvΒK�.uk��
�5!=�lS��qO�>�a�dyH�*�Ȑin&[ʯ�7��>���6mɩ�[JJ}�D�\L����9Z���9i��$y��#Gp����#7U���BᆔZ��`�lC���qr~`^[
U�;*o�M6>��
O��li��s���J^��m3
���@G�4�U��Zuho��+[_&��
M�IB)uL"R

Z�LF
8���N"dߊm�Ң
+w�	� ?�W'`�sȌ-52�3���1}�W+v }��g"=�C���>ӳ�iݐ�@�
+F�OF����]�~��ڶpi>Yu�,<v�~2l�QWU�ڀ[��H�i��1=�h��[B
��<Ԇ�^�2ץ�B�,�ݲ���2M+�
��\��A>�ɺ)��~�_�X�Z�¤��as{�gaSv �
V��HlK���h���V%�g#���*�"�*�����t��U}n�K�ELEH�)��u��'�:&��|*&(d�
]c��z~��8��w�?^����b�RA�a
����t�3��~L��y��}+�,�lό*��a%��;��K�ೌ�WZ��O7g0
+�Չ�;jf�Os�7'�Й�c�y����7�/�Pkr" 䒠�٘gԭMs
C�$�0���<��6E/Z
��x���2�M�����& ǴD͝��ӱ���^�a���2-�Y'{��s�&KWG��8&/�$5F4���)J�Sq�Ә��u _�_ ;��/uf��
-�R�j������
6
�!#P3@�%2�cu�UԺ��X ���9A��<��ct���=�<��h��y谒�5R�Cz2h]Co�X��^����Q+
�J��綞Һk����LL���m��+#���Yzݺ�6�@W���7�}uw־�l|�����f�h{�e�vw���h�������+�u��-Y;V"r�"
ZS��Lf�s�Ry��^8�tN
8褘�ӷ�����=
�1n ֭
���P�V"x׈����U{�w'SR�ʝ�����ڶ�n�t����[�����O ~�4�D����Ұ.�GL����<�`���	
4P�
P�j�Z
+(������&1"-���d�:�
�p}�V�] W�.���*kM�+t/p��"r�sqb�!�+�`༪���ʈ�
+ٱp�+�C��0����Iw�<q�HǬ,Rh���h��
#�eeQ�z&\F�>gG�|Ҧ�X�pCPM��T�74p�*��z���h]Ko�[Eû+�ޘ� 
ꉍ�1�k�8!͕��j�5������Q��tM
��=+O���b�
�j�4�Ʒ �E���.�Կ��Y���8F )���ǫS��m��
+�;�]q�Ϋ����y����vK�u�Ύ��^�#�8��_�l�Tt�B�����K����a-�61/M�~���]�`���*��t�z�i�<��v�����L�0�,����sԲ9a�uu/����j]!@�I�1�[�
�?JR���2rHa���f1i~@�G
]����XRCK,xTG��0X!��<�ːuB��9�$�T ��г7�ջ|��&m.�;�&�O�`b��m�����'n
��O�'6��B
+pں�%�;���
h�M%k��L��N��<p�g�=iC
+K���
���Q\Gn���7O��L����hp���{y���o�8h������Hֵ��
� ��y�J'~P�:��z]�~VSA1=R�J}�mI��{�4�Z�.��>��<�8�ZQ ^�LVd�o*��RB@tY�s���6G*߶�;��=�Sg� ��� ���OFm�;��e>ÿ��:e�M-�	0X��g���
%����A��#&
}M�ìȻЎ�.�W&�:�$�|zzyN�s,�`��}��M�(n�#�>;b���\ꞷWss�[6~g��5[-l�
+'w�l^�H����ՎYb�c��&�2���S�����y�-��SR�L4t�����(
�c���M��\�j�6�"7l��]'���F�"�/ l�BZ&"n��z��YB�
F����ع�{+]c1[��ѱ��o��͡e6a]M(�+�^
$���U��ݾ�wΧ`�9&(9�YA�v�_" U�0���vM|f��Ą��D�~�-�$b���M0���ӵ��~�-�`�W�
��~�_�';�ie�qf����e��q@�?t5e_ٔ�i;�`��%oy?���"��5%���w��ə���><{SA��\d45<�s�߸2?H�J��)�`Sщ�.��W��,���f
���L�ZV�����qͨ����ۘ��n�����O��p�#�7u��lЮ����{�:��1�}���u)�2�Dk�1��czb�_M9f)��rxS)�:ljﬢ�KQ%�9��BE
llDπ�5�V�,1��yL'&����ٴ���\�U�
DD/���:	�
v��(�4�
Y���:�8�dC
ð��κ�A�2fd}s�5��}��ᾣs8��9�e�PK\�_�h�+	�k����D�!+�si��釽\U�r���h�9~�7a��k;��|@�&
Pv�r����8���-�xj
��;�nŎ�k:be� ��t-�k����]'
���״b��r�Ϸ4*
��]�#}�ၺɮ��IA�ۥ��Zwe�Q���ŭ���v�趓��7�`[v6��l��
;�^}�I���
9k����M\Q�����L��c
+�.�p��Bm�0����ل���>M�ս��$~��U��׵
D��=�:�l�"�
��U�c�bvV�3QG��5�/X[$����3q��w�΢��z�,6sUGj���ăufO�B'��|ֶ�S�ctm��v
4l��#�L���R�r@����L��������)	�<��VvRz�������83+�
u�����:AG恭g~�.��<�EJ+�Np
+4����
D"��ׁ��bP�s���zqW����-�
�=u*�H�o蝔7�'Dӯb*J�9Mi}�
H�tCS!�ȼM*�i%��Ł�Z��p�un�s��e�k�P=��2��g���1���9���JX9�V�b�zo5��
f4C.������f��6��n�01+$�I���u����މF�@WѪ�Q�Ggl(�5=�
��*w(��/
�-��T.���&��5Y'zU�C���=�h⣷[�rk	Qv���&�h���e�dT,�w$��p_�G�ˊE�5l��
�����IZ�`]�v�>L�v���ӄ��Q��/�	kJ.�=/�0O	�
̺
-���5Z?�+�Wg�[�3�)��D5�[��
��CCMJ���Z`���^��kq��qt�cM�C���u#��0솎��Б@K���
�j:>vy~atiV%1��FՒ��!�$M��xI'
�¶��Ƃ��j��"�N��=��_��l��H��a���K��s��&#h�6�=����_�,J�j�c���@�S1�XQ�t�!�~t�
��k%}X���r,������]
�߲�.�xzU����S�w��8��X������'�Wc;.6;b���
��N�P�����\�":]T�
�Գ$dm;��%L�{_
X�Ĭ���r�ح�!W��؆��q��2g\l��q
E"��s1z��a*m�.+�ϥ������
�F�>�Tnm0_�#�_
����a˨aM?:mS����'�e0��
+����Qg
J�ҷ
+��Y%�i։��óPi��j��~�&*_T�`��f��B��';�X�NP�3�����r�W!����j�xvh�C2�C��B�,�K�>�k��	Wڄ,u.7����t������tė7o������O�4|K�$MqtuK}�Ѐ_�����Y���EF�l�H�c�Me:i�9�L:,m������^�x�mq�O>:�2��~1N��#���S�5����H�9U��r���Kh
*e]��,��(ܵuI��9���,k���dR H���&b�l\�R�-S��c��djS�񑾧��J�m�)���
���}L���7K-�
Òݓ<�~f��4;�X�A,
u���r^ʆGJ�ze}}�f:f�&ĸ�#�g�
E��Y]	�bI�bvz���<䙆"�M��L�;�o\
�4��M��6t��<:�.��
���"�����R�
+���B>Y����u̝���(�c|�_H��+)�\��ꋊ��v��A:?U=�ZQ��V5"Zp�K�-�k�
+j�Q>.��[���LU�wO����k��7L��
ד��P^5���h�$߮)��(ʆ��ʯ<���6&`&M�gEcD���@��7�dg��y�&�s��۞>y�9�
+Z&=�>�E;�771�
��
b���
�l�
�b$¾�)��b�3W1��^�w��~�ފx|]�%P�/�OX��5_�^�&��M��C��B[�~*��|��
+�Wa.�DQ���מ�>��R��O��U�������1�ӝk����ʉ�%�z~j��/���t���*�+!q�2�x�
T���x��eB��E����[�%�����Z{��Y�ݎN�c;vw���t���
" "Hc���`�̪����������|���:n����~�my�麓�����'����T��H8�˶�iČB޿�ok���`���x�l�zpH[]ڹT at ._�'r�ܡ�cOR�~���
������釿��1��3�z��
���'��/��9�� ~�˩�G����6��-�kh��*昰
<�2��R�K+/
bq��$A�Zlm�\zO���9X���^f�������;�WA	��[�ITG&��9ڢ�,�G��暭�2ꁱmh�(�Q�*���'im�S���L[�6��c��P3�P+	����l�gaN����_
+3��	?����=54˱�۟���2�O���_z�q*��w�o���c$V�πh%��d�KX�ȑ̛�"%<?C�ss˽��[w+���'w�ã��O^&;�E�n<� w�
+��@���zz�l㨸c��ڹ8^I4Ⱥ��"cCK�
+�_��XDV�������F�9$�5!��_��N.P��
���O�`��t�
��/E�s>C�*lȖ�4�O

+R&���nR{���y%�S;YLW9f�7>.DK���ʇ���]>e�x�8��S�������\��7



�n@��'�q��:}*���x���[�9��r<_߳k����jQz��cT��
�;{�g���w�JjI
��"qfr�It�+��,ȯ���D���h��Ĩtǁ���MU
}UWF

`��(����4z�J�=�ފH�|����7���{�����
�;�;D�
���O
S
�bH7,���E6�[1�ު�h�9 T�j:&
�u[	��M/
wƹ�����o0�!,��]|r���Q<�W�P����
��rp�&:|����K�W~a탮fE�f���l�XUu�M);�GD����
N�T"�>�<k���Tߊ�h��%��p�5����CP��k ��
��'��?��Ot�w�Kn�F���z���=~I�ڰ<^Sj�,�)i��}K*
�8ƄSR^�O>�"RZ~�Km��K���W�w᱂�&�޸�2���[�/��9���8�	����~�J���zͭ�J�fe��yZ�X2,��U����[^�
�)��S�/Q��WP��^zV��ਊ���-?�|��x�,��'��ɭ����������^�n.����賭`��u�
m����
j�Fp�ϱ����?~
+�܈H��.:��{� ���
3nx�n���	�:<s;��2n���L��~'�g:ڔ �P'ac�]d]�0)ղ���%6�y;�P��c�������<��?<{���������
��
���=�􇀔��a�8δ[U�lfo��
�����(� 3r��Ľ�D���~*�۴��lz��~�+�	��wA7>�3
�>!

?B��9x��:��a|�����7��t�ωËl����Za����dm�
gQ���fhg�`|C���i!�Ÿ�DQ��BH3����w�RZ���������s0�ƝG1��
��T�cp$�7P:��Q�E[Q�1%�]���|s�
��u>�S�KL{�%O"S�~	�c��f��sڍ�nvx��仔�����/�-#E��~֪��0#�&N�8I:qY��� ��g
++h���J�>�(�g��W�� }��␒Y�c��������!̟Bb�`�,z�����oz�$vY�J�T�!��jҼ���/���nNl�W��Z��h�1/*W�ci?��D�"9�����
��!2�⇸�����9�34U���i�Ԧ�ۥ�MM
Ϣ*N��ꤍ���npk����[�,��E!���i
����~t
��p��� ���}��W�WT��SW��#��ܣj
"�t?�)�8e�T�h�~M��0=D��`?���"��R�e�/�]�R��r�e���%�������7YO��:���:�t.tx�"��'�x#>����_��b?mOK�\����A��4�с
l�(��bط�y9��b���/��䟲`�Ϡ��'E�����'��q?���oD�Wߌ�i~W��aK���1�}:�Yފ]Ք!��+�
��fe
K,�Զ
����'A�rY ����-� 0�s�}�I�
o�sJ
�s���� t�:�X:�_U'
+�uj�]8�����i�X�q�W���aF�Y"�6��vw
�t��׉��x��+��2(��S ��ga7>��nFd�܍ ��˦�^��2��ťʌN�D�aL�]����p�-�`�\S5�l�K�#�m"#���
��M��KW`��7���G)�?�sG���^��
'�͈���/��&����p�@#�@��[���:�pۨt�I$��z���m���&u��ZDcI>��O0��똬�߃�i3�_C�]���u�8wjX1�����7e��n9N���eU�a!���7��,}���>.���(��}@��W�����d��[
I��������`ʾN�E��X�c3=o���&�ǯ���n����&[.
�$"R_�@vw�pn[�2��R�O��|�S��H��4f�oMm{DSG{pKgo�`��JY��
�}2%�oiI�+�܌��C��
S
�J�}��ֆЊ�7
+G���?�f�>�-�!6����M��"2��
Ϯ�1�p;%��f�=;;��Z�XÄ��o��6�i�M5r0UΝ�6�{j������s��6
�Vf�'�unE,�ǀ��;��$�x�6��;�p�K
��lp�
<�߹�+

k�ϋ9I�B�ߦ��g�	
+��u�IYM�`;߷�O
+o��@Z�Dz������ap}�@dm�$��bHF3�P�jG
+�۽�]�
g

���]�YU
�h��q�ZR��Fy��JE�������
+i�\1ė�u��Z�:�c{�:����n�
��'���˳;u��%gH�n!{/�K�W�5���ꆺ��o�{o�q�;�j��DmŢ��D/k@
wq"�*�/�k)�[z��yd1s�	U���#4Ga�]��zU�^V�*�j
+m���GW�::��\��86fWOC
��
��t
CZe�X�G�
�6wJ3{�����v�!
�jzAӳ���Th�g<�:�U�Mь�1'E����l%��ۍ1F�� +{v�7-o!�%�0���@/nCi��������Ɓ��&yNW�<_�!C�v!
=]��6�g�6�
O�7
�K��"f�]x��(�7�FJr
����6~���
�����C���qKm�z�6G7܊�K�񋪞�
CwSW��1԰���+�f�*�zr�|w��l���3eQ̊[�U at gG(����U
cn��g�V���0��Z�+I��X_}���3!dLIQ���}m�ؑ����H�8
Gm�/I	aˣ���G����)�fIY�N$HW���:z������ľ
�Й[��a�?2ٍoK�ۃ�DIM�=1}��)sJaþq`lGS[�1��?3�7\�4]g�c�&�A�4m��ԝ���"�V�Z�Zm��cz�xNE�N�
co�(�Wu��^����P̞���ֆه:f���97��Wz�_����
Mq��P�IyEa#
����>�
)�M�t΍U�x	�ݬPy+`�_eR�",�5%�Y
־T�tn��\)�MQA�t��,���H�_�1��-�fUw���6]׸oj��1��v��
#�>��[Ssr�Uu�%mw����o�,gZ
��('k[˅n�S�և��V�H�c��u�Iqp�Y��[U�
g��p�2dC�.�S7� N/l��4��pY�V��I��'4��EmvE]�ڟ��;_�<02
+v�Ԕ��R��Z���J��>_�jє�4�����i�'F���\�
+�K+�$ʒA�S*U�Z�i��d���;�������u�O'�r�Vİ�JA֋�JԺ���)��
�L4�8δ�ߐ��[F������A^������l���rJ�ڕ#�օ�u1�ݪ�G�ђV��d	'��r'2��I6�D�O��SSǩ�'fVю�
]U�·
�׹��G��L��s���a{�ĸ#3���.<6s��z�U]���P����|��8-gi�:�K
X�"�]��e)+kUFK]�R��5�����|��pq�*�����K���E1/}e�
��d�\�F��C
�:�4��TB��
P�RxAHO���
�"��Q^����Y!#rN�H�7c&*�%����-uSݮ�U�.+��֗�hS�OLU%s�]W���s�
���!X�MSJ96WU
O�W!kjFޢ��=�j/�Kj �f�謁
�;V^��d at 6��i6
|d���
%X�z���@��`k�����2D��
������s�����B��y~��
��� �f��:Pz�����;�ML��6xk~6ã|]�q��8ss�����/v
)�%նPšSp2gļ�˕��
.j����|#���2��r'��HM�<3��L��:�Ū
�����WD���\癎�7��Y���e���TZ��BY����l^��Zmѝ�U5oþ,4���i�xc,�<�c`/ת�����E.��������{���5Q���@����r��6����$�8�,+��r�:
�x�q�x�e�x���`�\��a����9)3k{��o��Ҳ�������7��c3�|1͡��Y�S-ta��_m6����;
Hi	 ��7�_˘i�mrvƮ�
s����R��D��Ł"_%?�ّ��*%mKi�Km� �%�LG�9Փӷ��~�ڄ�u�
?hK2>�=]^�u�ڑdX�K~�'�w;Tb�:>��P������2���	ٵ
б��b��{�	�ܶ�=Z��ץ���	�����5��=%6vM��^�D�l�p_T��^��D3������_�+'E|��
��f=[��w^��.�Ʃ��om
!"��ؕ^j���
�և��
.9Qc�ƈ1�~��xe��R�o
+F���ʲS�;��910�65�PA�>Ҳ�'��q����9"+=�=	<�TSu����_M�!�zΉ��:�W�mڪ�=M)�2L����|��X�t	�`��f��ö$ؘ#-�pK��2۔�8ݘ�hE�NJ��j���cH���7FM:4p�rb҉����ecT��=9>�X]
��,��2`���ǫ�Ǔuu6C	ή���
+t�m
-��iI��*|�U�
[#>_�p�'&*�ĀM��#N����ő65%��\e��by�e�)%�
��8@��d�h�
mS`cօ(�M	.tOIϱiX�c
1�V�W3��l���Ҟ�~�?��jg����L���+�.p8�Q|�e�8�X�@
�𙗳���X�
+�z�#�_�\��P&8P��z�f��B�Z"�rF �����G`�{#�6lG' �/T��e��-VTΔ��|�MG�;�b��&̦��jĶPU{�XӲ�������> q�B=v��訋c���
ʑ�{��Й.�{]Q�o��l��Q�6�J;cf.��\W{�օ0�-�ws��0݂r�o�|>V���+i_,>C�j���#oM�$?�"$�T��
96hk�%��t<Vz��ΝD�,���w���<3��gFN��0��қ�dc ��
�gS��u�l��#-�� 
��X��PK?�
ЋoL�)o�[�_-v:�tA>v`C�n
q�|�Lu�QZ�oC��_e��[SթόU�wW����6Hp/6�ᩊ�)��L��@��lc���<��Duܝ���7�
+fΆ�8e
xͻ#�P�!�*B��yo��!��ħ]X��,}��?'��/tL�bG�����'

!O�5�
#1�LG�;RQ��g8
h���2⟓|�Y6��̂�oF�8)��H�^
��-uA?Z�
�M�.8��G�>��B����W��BW�_��'�E#�O��~�f6��d�h��dS��m���8�wW���>�XFZ�C�Dh����##n���7D��=��
����@o����-9<p[��)
83P�/�Լ?'��,qgF"x�/�yw�r5SYmS1����p� �{W�ܗ�C.LܢS
��[�w�%$ k�
endstream
endobj
136 0 obj
<</Length 65536>>stream
+�9X~��ůvey�
�n�<���B��(��+���$���S3!�n at E�( ���ס��pb��
i�u���
	�
��B)�n`c6�PA��Y���#sI��\Y��6�r��\�j<�oU}]j��?����.sK
+�[,��U`C
c�L�r 3��c-��TK��h9��8t_�lM2є�r��/egX��Q�]H7����-�D�H�u�\���s
��*���
\��F���
�H��Zrڞ��M�K�f�_�1�R|�R��Bdž��Ӳ�E@���;+���>����vv}>����`>��{�j:��I*��)�D_�-�,4�<Z�K{�я
��G͵"?쉉a��MqQ��-B�,���εx�����N�����ߴ���
o��A��c��
%>r�:˩u��:�]���jH{<Uu[_u{�<��v?���8>v�Rz�/�t��ir��QD��U�N�}\�{6���|w����p��Pqؖ���+�c�t)��w9�㮩���r[�#=1�@��]�&&mtE�g��u9���Б�r�o����=Y��Z@/w��E�>|�rG�����7;��Mq�G��w���җ��X�xoC��?
g�
>#���an�޼��\�oT�1
+��ܤ;V5�l���� ��5��rG
v;*p=V���f�p}c������?g��s#!	���}q��0��ҙ�bW��v9��2����
�^��(��JJ�Y���⨝!��
E��;���|��ɞO~RWex�g�K�c��C}
�ȇ
+��-?��Z�&1�
v^��}�g��^-�<R���u��K��㟮�g��\���t��0!�P# 
�/�J���ȥ�9A/���7�R�g�c�g���d��}O�B����Ӥ�##1�XO��6K_��k}9n
mYo��\����3ӵf�����;�_
�H)�Jʁ��/��X�
+�LuQ�Gia�l
P��:0^���M5���J������>@
+��'��3
,u�\�\о�8�ҟ�4�{o�.��� ��]����
+0v+k����@N�?P����p�}iާ#%$dCv/K��.�z~�b��{`
k��-��@Q�=q]�~���C��ԇ]��_W:Q��
+V澜�`@y��R�+���nt�;.t��9/PQn(�y��c
С
0Ә�PW
v{�~�X��vo�
�����P�D�|8D��T�rvDEc��[��Msu�C`�����`Cu�ݽaL�׉;�BSE�㥶4�mq��rW��|k�����eW�T>�H�3W���ၗ:|��8*lk�1ۖ�܅
�ӎ���L���:�j
�e�������fo�����UI��4���R=�'�]:x�
y���35��G1&䧭>�)���Ax0$���󝐠 �~n,N�g~Xh�z�)�rk�����&��UNM���n��*���Y`�C�,����i�?��qw���bD�MU
?Q����D+<� ���w��
1(�P�6Ք�Dʊz|�'g���_�[S�[�P�m!�oKT�o��n�`���qw�3}��rҡ�8{�7��r����rd��X�߸��QT��"��\{���X���48��
�s
+g��+S^\ͱ�� ��Aޣ�ĻS<�_K%�JH�(��u0�ws �c�E�h��Y��5-�(����^T�k������C9c]��Z[�{K���tU	�g�8���6pй��0�
+�G!�O�l��3����k��L���v��ׇ��mQX
�DI����m��Q�B��b7�E[��ZS��X+H�7WW�vSB����7V�=9T����p���x

+Ԧ���
�������{r��Ғv�������OT���F�2]�|����~�_/!����P� K/�u�)��=�V
���z��JN���n���4㵂��ju �?ݔ�)�0۔��X��b�
�[<����%d�b�ݷ�x�I1�Ä��FƎ��������\�� 1t����҅�9�����}�'�ӎ��m_
�ЖD�
&��v�o�=`����WBl��~�����Gv9�����{�c,wc��+�/m�F�r!�@Z�/+�iL{=ۘ��z���m��l���!����Q"v�~��\��,���lǹV�ˮ���
�����=�:��>߂�4p�����;N��|�l�xmn�z��
���W��NK
y.+
P�嶂�K��/����iYޓuiϖ;!^����2畚� ���@�{o�0AE�������aB�mI�	�
+J���p�<���.h�M5����.H����Q�{��t���̀��Ԭَ|�1n�S
?����r_Ϗ���grA�w:�Q�4��#U_��PN4>;�wcU�-
���]i^�?+,®�}�cA�;
\�۲]W��<�z
���iH{�ؑ�俛l汑���s�EE\N�5^N�T��,(=��� 
�K��]
��
Op�_�O
t�
r�D�
���*t�i� �t�}�hy���H�Ⱥ��S=�6N��_֡
�ܕ�b�I}���rZB?
+�7�/\�L�f>���<@
�QW��`�
��"�Gˮ���M�f,%
���[�7٘�ZS���L}�����G��`�516�X��a��(��w]h�x�X��b��/ÅO����т~^l��
�p������r�H9��j�!w�C�̷B�W%�0!/��0+���1�Ԙ�ڈ��
��/1�G%�GSy���NnB92�v
"�΁�;4ƾ
x��LS����ԧ[��w�Jt�D;�SY����`;�9��3��{ �ӕ��T�
��v�݅>�l�aRԣ�>b�r#��N��M
+��t�y�6��3TD>�^gZ��y�^��i�N5�]M�<E��GP�{�`���-鯵u�Ϛ0��D��G�� �����/���Qj�r'<P����7BJږ1���P����W�
`gCEڋ�����
��iS�Y���~{�a��"|�|c�������u�w�e��N��?X�ͦ
UY��zH������3#5
�����̏��ط��O�B��T��m5y��x��
��� �_�D�m
+Q^s
/M5Ƚt�
���Ć[D� 9'�r{�1�î�;�J������#y�>aML
+7�g�ԕ��L������A~N
+�Yb�ׇ��,���!^7��窒�OV&���Mys ���o

�*A���O6���
U�:��|�Vpd�D�ȡ�{JT����jy�����
A�)��^�s��R
+��
+���`�5a҇��,�
v9YB��(� G��\g�(�q��ќ�S
+��q�H������"7��y� �d�
iq�B�u��)�
��:�
�o�}��
󺚩m����}X_}U�#}U��~�ס��t��o(Hɪ�'���ћ2F��4��-�zԝA��o���ܘ��ݘP���;�Oyx=�h_����v ��΀�V�����7["R� ��nb���>^��i���v#�w��a+�xS3�u���\_%��G�H���2.�`����E{�v�
�����w ��������5��t#|~^m9.��7Հ?��b�W��}�d +bڔĤ���;3�����R��V�>��K�x ��^�x$cw�o="��Z����Lu�}
��Ԛ�|�!��j'��rW��N���.�ma��Ȩw����y�r�}
�֓�a���
�ts��U��)�z
+|��xe��7
b��܏Y�G#9�{���k�^صl�b7�}�
�yw�x�C!զ�'u:ӕ���8��֢�Ǔ�w!+��B/�wK��^B�ϴĜ���:.�*C��SZDh��~d�Z7�db�hY�c);��|G���{+��8s
��t���(!�ڟ�И�t�.��r[�K�0����}
1�V�t�&�\\礛K����]Q������
͉N�
+B��9^Z�RLH��ލ��s���������Q��QN�t�ٮB�%2�d�ǶHK���0W����2��o
���U6�E
+ڮ�e�v'��h���%C������ͩn6z<A'�O��-0�W�dȶ������&|��`�������&�9�J�]ENؓ'�{��	��Zz��(;k]L
?�
+�[C�ȹ���K
���`'S]�sy��!6�t��^h�}�t </�<�]E����J�
�oև`�+�`g��8j_Ãjs���3��6�\����ڇY�RB�lK�Ǚ���GjJ�����5���!�M�A�
��.���ϗnC�ʜ��{m�+�+C�
� !�2 ���Of�-��
�Ӂ�}fdlK`��"Tȑ����IK�oD8��ҟ�!w���;g�r⾶�2?@�Q�d?8�ğ���H��+
+�Wf?/�Ж�<�!��	1[�(���y_��ʯ
<�lȣ�rg��p��fg��NV����)DzZe�S}M�]]�X�����
��s1�Wm
��TЖ$�ú(�E��
��@� ��h�(|�/�K�Ky8 �'�k��zR�Zw򛩊��KMq�,���k�`w�(&�z�n?=���,��D�F\��v.j�1������':�⡪.����!N��
��ܚ�v����|�*��BG��C
9{�$�1���;���}
~jd��C�^�]�o��
̵�^�G}^i!�?h�{�ڗ�c�����1|�
�ڟ�+-�?���	��vx��O�处s=&�L�N�:E��ca���XCM����rgO��n����e��K}��F�K!=�ݞ�t9M#_ΰʗ���"N��-*�ߛ%�Y84����z8՜�#��rf�&�����Q�~���[��<M���="t�?�q�'����#G�@]z�Ji��q6�PǁX�8��Q|��0��L��ؗ���;�_/��;.u�;�Ǚ��j�r�}KX��?����N��� kf[s�����V�!A_�U�!zw��˾�5S��'#%��i9�*f��
��&ЋM1Ʀ������s�LV�?���]����$�m���)��/u��.���c#߮%g
(ё'l<�-#w�	�rd���>H��4qQ'ZRʷ):��Ă�H1�B�!�����-�'u��^��
�%Z��|���s
�
h�ּwR�/�ZF��%m��
%>v�<��Xh�y
i�?d���Pł����<��6d����;���k�����}5A+����V�pϭQ6lQ�)^�%D�ka�����׹G�u�#-	�o̦�un��/�+��YEK��J~�]	����L�?f	Y��)s}�� �����������s��os4ȑ�1��i�;����#
�3�
+~��]1�`�;PSr��
`/��

I��p�����xй	��ԑ���=ӳp�ZҮ��m|���ю
��䥿�Qpr�1~�����_,��\=�y�g��Ui�4��^v
�.���8Mԥ��3B
�5%;~� �����>x����zo��u�)��AB�������S�QS��l�-��0�.F����L�59+߮/-���9�=09-��05�]�O:11��3��=#1m�DJ��g�ʹ��)
��<��4�1vl*��_9�
QA�Rg�ӓ	*�h���d��v�C\U��F��
:�D�K x/q���m]��kM{�'�y��?�b��4&<��z�y������ljN��@��.࿷���'�c�i�b�
+ }������\獩�i�JF��@q�]NM?ӳ�
+R�\;��tC΋
)5eUH�1Vg>Zn+t���R3�g��э�9Rҳ�Ÿ��^����7�	�Ax[%�χ��<��/tL�]�kj�N���ϧjz�}ya4����b��p��qJ����๊�x�TDŽ]�k*3�M7e=�J��6$�����u�N�Ffᦔ�&!�_�o
h9V	p�(o�()�H��ߕ�A�
+.x��Ѓ
�ij��ں�
s%��Ւ�s!�*�|�t�?X��E�+�ss�_�U<��09q_�����c�Ø�-i���(.��\JYS���
����X��� ��P���2��b� 6�f�\����y{*
�PO͹��#4E�[C ��1T���w GH���;*Z���U-gS
܉���&F��<Q�|�Y�2���u.�Y�P�
���N'���)
�P�����[d��
���YXk�Ը�6�dž�
�)):�@�5��-	���	�
�3#����0����W���D���
J���G&\�U�
ܒ�|��ց�Җg=5��<;�~��nǧ��0p�i.����F���^�p�W�����bOS-���T_����,���UA��l�
������*��c����F/|h �>��~Gl�7��
(Y���A�ߟ������f��MX�}Y
�n�
]�Z��m�'?���}k�0����E�C��m9#�p
�mIq�mv�+��f§]�Ԏa3���`�K]9/V��^-ug9�
a���Ԭ�Fz���]'צ.��%x�.徱2��� ��*G���!���!�'�������Gv%t��
)x`��օ�]v�=ƈ����tb�-v�\�Z�^�\��Y�j��y�-�[B\{ �s3�.ua���iU��
3qn`�먙�#�
Q��lK�cY�/65!��,m=��|7.p��t�!��X�����g`o���wG����++Ԁv
�m�1~V��B�ȹ2v

ln�Ya�O&Z��涡ss��<�&b��&g�ܰ5΄L���q�W�e�])��*.p��}�ҕ�|�t�,�x6)���aN������J�C
+P_�l�
�:��)�
����Mr�W��_�쎑��^�f��s6~_�0ݞ����l�=���+��]
9_S��n��8��,`��X�3k+��J�}�F��v%1�n���*�ߪ�3���
ԉ��:5�A����s<涂�Џ��R>��k���Ǧ&'*)ɀ�͸0����ѐ':Z�\7�}��zbb)8�/;
+=o��g�[,p;Pc�ϧل����
�Vf�ȡ��~2��ڴ��]
��<�->vW�C
�+kRv�0���B��� �C��K@�"���ܬ���C!�b���l����V५;�Zz6�b}[�
+ -Vud&d�
�XD����O�r׆�a;c��3��b���
�D���ve�8��A���Q�	�G'
�u���0�o{�E��c��T��?V�c��|Ԯ��h��sOg9�)�@�	��>���<��<���M�`WQ�X�D�I�);*b¶
h�E���|0T�>֗��; t݅Y@ܔR��:`����"J�>\ԣن|�)!Z_��J�L�ci/t��\��Wc���
�e�/b���`q�e�3�[�7^�z�XO�]L�0V��^K�I��S�X��^6%:�TGL:�1
�JF憜�������8����J���4��xe�k�
bWӑ��J��*l�PK�#�Ce�Cy��M!���0�g�
���Hʾ�a�t,�����l��_
�w5W%�7W�=2���_jIxu��$�J�
ݸ ]u�}��y
��$��T��0���}0F��W�
+����d�/JR�_@�\�9�y�(NY��v��ؑA��Xp� }�)�z�)ợ��uq�ׁ�(��
_����eW�O76�^[��)Gz
�P����5��<
#�^���6ť�9�!v�+M8�D�ï���Z3�/��?n�!�v
2��E.
�Ϋ�ʺ�r��Ru�UA�w@>�+
�e��)#�^��],T��k�8�ڂ�
=���&8�S3�rb�N�
��AZ*�r��ls�����o󴢿�ٴ�Wʛ�fy��=O��Y��2V�u�%� {C�H���k���-+��R+�k�N~�����)Y#Ԅ��*�M[Q�
��

}�H*ؒ�#6$�I<����b�
+>����|a�l��^"�<��D��t=�������n
�8۔Ȁ
#=�b��Ņ>>�
x�6V
�;��_���8ג�ً���?+�5�L�]K˺�ky x��A��B+�gC��ݑ��[c���㭵[�
+캄�؉�4U��`�
���B�K���lȫ�sB~�
�:Ȉ��Fn������G=�
씧����S-%}}l�%jJP ����
7�>�؎~������W�
Ҿ�OXb��E�69
ఀ=��6V�=��|U���H`����*!��
a6%�ĭaR‰����2�~9�*ޕ �'������Іoڠ^�Zf��&;5�R7Dy�s�q��;3����(d&�������
�P����=a���0,bG�
+S��=�h��
x��^t��2���04`{8�e_�ؗc����0Ss������;����RS����r���
<ׄ�G�،o3L��E�`�O�f3Ԕ��l䙁�q�'�Y�`�-2rk�;Z�u��Z�|ڐa".���3�����m
�ܖ�3�δ���SP��'*x{c�<me�c�0.�XK�9�b��Y�����c��3�������U)5y���YH���*�>P��.'���ʪE)-uI�=��N&YH��kU���T�	�F:�r�^�粠�j���h�=&��� g�jI��qL�Mu��DͶ��*��mݳ}�ȹ
�+�7p��S7��JI�9�Sߖ����l�I��籯fk�

p/9?�š���_kiӟ����E�ЀM=0�s�g����?��g�\��<i���|]��μ���v-)�D�	?R�C�e�0@φ�J
=mJB•�������
�\t
	O
��������x��
{
h�S3g�U1wF�y���7"��McE�ݝ!d���X�2VGYWT��G���v���8h
��A���
`�'nH� i}��H
a[���"�n�	��m��3Z.[]0��>���yM���
�
jK������G?%�� 9��f_��iZ������d����i����﷤��VY��rW��<��r�^p=3qEJ�x
t�oj�iJ��	����۴Ĥ�
��rO~�����)c���QN{
+F�����Wb#v(����'s��/v�~Gz.bE�L2�幮t����%�;b��^�@F
��Tw�X���*�Ej9��f���*��j��<
�̴$<Q#����G�_l��`3�1S}��Af�]SS�뱎O��䓯fx�c
)�"��n�Ҫg�M���}����7�ϊ=TaR/f�D�{c��#]Q��p����'�(CK�c]�K�,`gfW�ү����9�
I�ЛC�#�%M7��ٕ�
�y�e��8������ʺu%�*��G��S��u!�ˡ�:���>�|���{���z��w�'n��cmZl�MGα�8�U	6��D���ȥ��&��
���ӝ
xSJ-��=W�����Ԃ��U;���p1C+������H']���&�wGqI��K��/'S,��
���L�>�� �&�b�_�uEPq1�"
���aT��$
��$��՚����j������&��^
�Y��I�?���<���e} �v9YB�W�S6�I��rbԁ
�k�B= [...]
+���%��lg�硪��*/-�k�u壩��7ז�r���
������eST쿯b�m�R���
o�9��Q�'c��s��\dB��(6�@%@�P�V��^�`�
)��D���x6Q��UQS��Pw��8���+>P��,��Ζ��w�c`�}5-��T�t1�&�iJ�{ʢ�?����yf���.)
+�
!�.��E��53���A�*��g�PI�ۗ#����0��?r?ё�
l���B�m����
$f
)I9�̄�K)�M	��d�\�8=g�
��ʌ��r���:�m
��K-zj��
a��
��A
PoUU��<��
�pf�%
��[��Y+��s��rQT
���ش\�%�O&8��L�Xi�3uy��]��K|`](9�Ԙ��w��
^צAGX�=,��n��95�
+/��JW����6���
���o@ϝ�0�V	$xW��s ��|Ȃ��0�ϹΚ
�6AC����;���&���&\��/��b�K9]�j^*����v:��� ��{���ϕ���	
+��ɩ�&f��e6

�҇�o�~5ך�b_����	��*�{�C:���:x�Kt�8q{�q�9��� <��'��'x���V�VCq�T/��x����F�?��v���
@r������x�f�d\MrP�z.lW�ʰ�0Rf;�N���g�J�KmY櫥v�g��yR�uN:.�:BO�
�'O�f�P
�6TFݙxeC��x�½QdG�ϰ+��2�϶8���X6P/�/f�b��c�/�
k*黣%��aJ䁒�s8��T����b�e��[��O��I��.�*�vS9}S�N���/DžY�
]�Ը����W�Q�lc�C
���~�nG]�90 ��fh��	b�M����H~<�������\E�MWF�UG��^�Iߦ8�33vj��:A������\�����"D��	IG���s#��r��?��v��JF����rs�1XࢮHt(�v4���R	�j��
�-hi
h��Hv
�;�\�Oz=D�;L�{�/G
��ji��g⦅��4��v�{���S��R�R [...]
Z~Z�ExW�2�Y��ݭiJ��8�Z�!
ȹe�	�;�%�n�w�XzQ�Y at A��C�M��~���<�i
*�y>� 9���%
\��"�o}է�V���~蚚�Y⍘�

�ٰ�"�6c���,t��,�����8�.�z�:Gnp��9n�����i�ɘ��
�#�TIp�q^�㵰u}v��4N�T=h�`~
+������$�j\����"
� |^_�b7�I��pDDž�4���)�qę��ޙ�����CO�f���c�����[>�u�];��9����7y�����;���3�
�p��
n��߶_�z�=�W��&�O��o�&j�s���������������F�<���]��
+�}D�CF4BT`A��g����\��f��B�v~#iٞ���9���{ޡO;�
]}K��3�k[yK����pn
�{LÅ���Q-���ޓ�gx-[�Ē��0�G��O�~R�Kbzh
y��9n��[d����|��҈���}�:�5E��
���vf�
����O�[Ŝ����y�-Z��\s����z�����$<C(K*�-Y���k
��VG��
y����\�� >��^���u!5�%mf���ƈh�0��'f���j1.��"6g`�|�
[S����v
��Ho�똝�v
�c���<�dk��Tt��7��Hy	���7�
�S�V���9m�YTI ���{�٥�����%��s�A�$a��U ;Ë���)��
�
�X�j��;�O
�m ޾��"l���f�
Q�+
����z��vs{��LTGi�8���C�I���2A
y}k�����CJ9İ���+��˓�֐~tį
��"TX��؞Ɣ��07Fv?�A옎��#�Lh����Q5�fs���Q�
Oz�E5r�=t?�&FZ���;���H�q��rG#@m��h���#��m���D��������ǡg�
���rLOm
A��

�n�xߐ.�O�k'a�`2N!'��cfڧ�7�9�GBF)?�!V�0%�9dqR��ɀ��
���I^����������Y{;��v��������
���Ȟ䗄�M���V3�E֟�n���ܥ�:c��9eU"��,�|^��%���<�mkAԷ�(�D
RzP+!�T�����;�7��w�+����7���
�2�X�
�*j-�嫛���IA����cs�U�5I��=�>7R��:z��
�d���RR�ϋ�k�������	v
[Q-�ʙ��ٙѓC
+̵�����k��@�c��ǐg�Z
"�@�Ik(��Y��u�m����7���4s��r��Xղ��&V/������6��� תO:o�ن�O1��%���H��u�
6v��FG5�f�,�8c���LL�
g�
���,�RN�E��9t{�:z?e�� ���k��
���ty{
qv�M�)�'
+jKF?�NhEP+;��h������y;�}���E��Ӓk�	h��!� �a��^�n��Ãi��@�@pe�ם?,���7�u6me���Ri�$"�MBF���5���̕�"�t�}ϩ�w�gb!%��7I8��>8g3jvOLI�
/*6�z.,��8}ϱg�e�R1��-�yj����ʛ��;��u�Y�jj���hy��
+�#V�0
+r$f��΁��W$��$\�8�^��pffq!l��r
ǡ^V*F��x�լ�M*xIJ���t at -�{_�}��u>������
�5��6T��8ȓ,�
������_ ��-lT�ŧf\
|
�]Ċ��8�i�I3��"
�R��{�*x0��9��B�_�8¸��
T��l���%ꇰrN���=j���1������#*Z#�lX;�
�% o8=a
�À۝�J�I���W	`;
�.߂�gc�۸�V�>I��Q�[�oȗ����o��/@���:	)� �����j�����E V�����	�[�u���.���}i����!����[��G�%�vNY%��YD�z��t����"�R �`p��Rq:�`= w;
��v�u�7���q�}㷡y|YP�j
��}�%�� ��6
ݜh��7?盃�
��n$�"j�=�����4�"iR6ga6gڏE�Hc�k�c &��K����3�V�8����U���-���[�:�{b�c�g����?nO����u}
����U�3�.�&^ܜ�W��b�24�1E�	���)��`MZ�g�l÷���Μ	�	ޞ"@�� 9[ѐz:������P":|��x���i\i�)L�����װz�*R]TM�Hd�]��r���s뗞�}Ƿf��;�K���q��Q%�*�%�D�	5Y�w�&b��|BHMkI@�o��c�3��\
�p�A3�vJ�{+����$�6�u!�R�kYȐ
_�<�8�<���<=m��o�mW������˄k�A�+�'�����p�Ư �e�,|ae��^�W-��Úh��
�ֲPw��jn�{�^�WR���1������q37	�e�`oC2�_	3&bG�+]��_��Y��c�a�68 t�0�"7�̓�Z_���FM��g���������U�]���i#�/c��zfW���\^p��)��tO������F`Q�(YQ�"��pN����Y��޶~V*JJUH�h�YE�=���]�|8e�a�V;����j��$�Th��R�+‹�:��U�YzUF'$
`.%����PK)a��ؿ ����kw�eK�ѧ6'	��EF#x_��+���wȳ�EJ5�睛�ҕ7��}�E橵Y�| b����i5���A5�> �le�V�x�<�y��t�z!4W~%��^_P�i�-�k}��ꀒ^�
�-0�S5k�`=O>�|���o~ne
q:� [...]
jkk�,eG�Į��u�{�&zۮ�G-��b���g�E�,�u�=t/������&ھٞ�>����t@��΀ZӋ�1=�6�hy���*�5�<�x�9��n�z�u���RBj���\; ;��sz���"�?�"�G���c@���ݘ�_[z��7s	���>�S̙�K��:e��I at -8訔W�n�~�]�ќ{�֪��6{��O͠�|��|¾hj
����k�P�o���b��o�A�
<�Dn�&�
b
�)⿮
�VB��D��9��
++�������۠u�][��>�/nBK!����8���9���n>��6j��<����14��U�['W�4\���蛬�Ϗ��[s�ҵI���Zm���}�
쯱پdmR��
]���J�@��\l�"�ǡXY$�lMJ���Tزͩ�Sq-�>a�"�JA��հ9�.v<m�|�mױ��ܔwP:v]䞴�о���r
hLlT��
-қ�g��E^W`���ߗ5
+��������o]�0�z�.:f
���ޚ�p�Eb{�U��
+�t��k�ӎ��
�f�K@��n���L?aO��u>뛄��Z���M˷��)�@���q����pϘ��^�9b�ѳ>���/���:1>a�l*8��q���9Z���nQ+�j}JOm��7��lX���$��9��Mkc���0�f\ǁ������.��|XJ�G�q������='���1
�*�Md��ł:Җ�
+Ii4�����r���,�;6�%y����rw6b��W�#N��j�:!m
�g]#A%�]3ZsD=R���ވJDr����1I������
Y��)���~�*R
6�q�u�ӥ��r�6���-ؚD��t\d�($�l<žG��[Iv�mK�)��_Ώ	p����0t�_��jظ�](5�V��C�5���}�q�1t'k� R:Rm\�������?��H��Ҍs���D#�q��_��`�q�2i&���+���c�G��F�N..�y�2�Y|����KO�������;=����I�ɏ[�{q��6j~Y2�u	Xy�d ������V�O��Z��3K��{D<�h�W��7�6&b�ţ~t0��ER����W̫G����/)��2�;3zg\�/_�8X at _� ���	3��HX]��o��Ү�џ�B=੕`�+��mܞ!���{N&�ǔ�N�=�vA
��
+��%q�X UlϢ/�՜n�ԁYru�l�������Sω�I̍��֞s2�1#
x
lG)�uR�O%�oOpj�^�U���m���,�|��*��߻�(Fx'Ž�������௹��
[z?
>
6�)
+z͆��P���l"��35�[Өb����sԆ�QLɺĂ-�?���4��f��xk
+{e�e�Q�3�GU�
s�(�۳�ƨZB�2jFKx�P��Q��}v}
w1���$���8���s���W='cj|E\�+�������[3IJ�v�5ɶfq7<��
͓�B��$��G���<�"l�7��5Q�\
1�މZG�E-2��<��������k	
��=#AYğX�n($��_��㚂
+l�맞��տ~O+�������ba��S��+c:&|s
Q
��WFu�ư���0�#Z7n��7gi����Y�D�qJD	�����q-�%��7'M<l�sg"�����u������1I� ��Q��_�

���i���9�s>���D�
�Τ�E*�YL%�w���\z�Bn�9�#�EF��I۟�8�o,��~��{���-��a�Y!=YX�1f哶�(u+���O��Z~�WV� mO[8ș���{��\˻y����

k;���v���ߋ[�~r
y��
+B
`yXGk�驀�J�z6��
�����,��|#�`6������fc�zGXI�
/���
2kcJvG����5̮���Ș�����7�{�*:X#NkB'�F�
+ix=�	�eãίB
+j]���&��2V�$ړ�7bnDu��& ��>ad�6�,�ژZ�
+Y�q
������^ۗ@�tG
@{�%��v��J�1����la"&|�_��Z6e�`
+��q��;�|0>�9
�������7-'�Oˏ��z�z2��
�����P}Z��au�ghu��u�,�$|iB#��t�#ۓ�ʭ1�y�ݦϝ�[>��<���& $�P	��s���ALK�8=;S�K�Ǖ��?��}LM�e
���v�4�cu�T|\�8  ���6�Z#����:jK�`�( 漷^��2
���ሞ
/R��
`��̞�)F��;FYX!�lN��^�~�9����;��1F��8�#2��)y��IZ���(��AL�7�Ê��	WCjzK��B�BA�6� f� >	t+�z{�t��,��_���Yi�}���
�&���R�k��
�����u�#��廗��?���d
���g`$��r�G)�D���Y���pIIPc#&B��B��,������xg�ڙ����[����-膭J��5��%�Z�x맀�� ܬ6�f��|��%?��l�M�;�+Y�D��^�?F��������W<c���6&f��@��
Ī��TY 9�k���
~�* n�J���~����+����)5�n����y$�=�D�qp��u�s���<�RT����2Z2F.2�9i����م��]DKY�
�fX��
�%؈v�X��4BT�(��f�U�ָ�ՙ2r���nyR��
���[o����0��iy�����Wp��ӂ�	J��a��6�X����)	tj�̣e
"V���|�jm	
�>��8Zh9�5�y,�@�2 I��<�+i������j��?
+�Zh�@O���z�5�=�1�hZm0����~����S�Wi
�!o�ZZ�����
+��{�5�r�V	�7�e
CU������Z�: �ukh�9���E at HyȰ�ڴ�����׍_fag�f:m��$a�G�|d
`Yh�ĕ����)���@+1����	�,r���P�(�������I5�r�Jn-��ܨ^Dܙgև�RbP9�i�8S�kև����k���~�g �;r����M�͹���}�>�ۻ�;�a"�&�7�j!:i�K2P<�$#a
�'<�
}��J���<��
���������H~;m��N�z��0ʅI�L�w���ewA
`" K�Zv�ޒX��s��
pպ��ڜs��{n%��'t��w}��������#Z��M�ѥ�M�l��_>R���ẹ����Q���S�/�� �J��;yϨ���6�d
+�j�H�I�䤙�ژB�j�m1�F^q=i�����O�>�3�&eĕ'A=�[��]�L��˥a
����k�����
�����~������ޒD��qP���)5�;��և}g6�w��x;PK�zf۾G�����9���0B��,R�"���ln�&��l >���J	���,��r}LMk
�Xm+��=vƱeY+�ok���U�7�P��yAoP9�؞a5-=E^�͐��3����
'��s���h:����|8a�
�Ki[������3�l]pU
�E^�ϣnnLcn��RH'㤬2A�%�@�a\z�W�1�)��
בA�����q%�EFc�ĆgM���"��ǚ�
����/'t���NL�-�:�'�U���C�Q�{|��a�7Zy��ѪOÀs�,|\D����;����hB�(�Y	��B���Q���*)!��5��ѾYt��a��x����
t��������}@?VoOs�7�D]K?�.g�O����I�.mR� {r��
Cq�����C���To��_��"��}�9����P���Yy���M�LXY�i���	�!%�38Oi���KClE��%�C?e��No*-!
�%ibc�&6�7�)�=n;c�_|c
+W��
	(���g�r���K�k�/�F>�#[0]bB5nז��i��Y�|4�!�����g����%Q-�$�"w�.�~5���
�
������
3Y3�}'�%�&7�,��P�_|
���
+^�3
I5�-2��z������y�rlg� x.�gm�Ta�������+�9dîM���h�%� �𢔁ӗ3I9�\6�z
�1g-O��lO:��Y�q�M�u�1��4��
+֑[����Л|��?,?�<��y6� �'5��
�/g��f
:c�3��Ŵ����zʈ��Zi] '%���:�?��ĉ�������
qY�Kg���$�<���o}��u�۶f /�e4�渝q� 
�����+����SԳ��ﻴ0t�-��������
�Θ^�H~�H��dߩ�ɮ[s��I����m�NP��$LB�O!D�L��Z&��������#χT��i�{	-�#���-��7ƑW�jt�'��]��[�l���7�xͫ�pg
`����,����'��gM�Ƽ���5[s��`�z�Z\uP;�����1����9
�N�84�
+���kK�P�^�_I)�Ui
�)
x���[_앸��
g�n��Ö]�ϻY���E�j�!%�!ib�bf.n��ؿ(�8_�.��C�ݞ�;�4��rN&�bfz����i��]�
��}S�s����"�>c��>�������M��P��>�<
yۿ�
+v��������	
�M:�`�=������$�zw��2f3��a�����.8���L5i���:�8cp�&�Oo�㫣.-mcc���
h{BͶ~nG��Z�@�c&N���<i����u�愁�5��
4��A��?��������^ݷ�=U>���z:����X}��˰Q�,,Ɇ�&!!c`v���3
����f.2k� j}P-��POA\!�������ش�b �v>�`�+��q�>�bw��BTl�\���k���?/=�9S�j�v>��
��M
��t�i��߆f;��������������� y�(P�|� &g�7
+juX��H[�l���i
Q��^�����ϘEӃ�/���V���3,�W�M����}���"��<�+���!��4�p N�%��|v�ͣ^�Yp�[dQ`Jз��ߥh���K��4���Ԗ�����c�&�lO�JB
+�͌��I�hH��З���� �,�
�EԠJ�ߘd�x^V���#
쾈[��u��L���:zg� ��L��Cs��F at H���g�˓��?�Kʿ�!_Y>�u<��,��A˗q�:k�w�

�������oX�7}�}����H�)����3aq-��iq|����d�:8�[`w,�#]�Qbo$t����K��%�mN��k(�=�p/aPKk
+�	7�&Z[�����;au�/�/�/�m\����KP�eA%���0�=|VRKlv�o�n�I����?����+�����GQ-�=M��ؒ31{Sf_P��ޜj��=�)	i(�Y�T^p�O ���R�v6&8ix��l�D�Hڸ踝�M9�
XӘ��ѐ��^.pEɮ���uQ�*j��8�$���M���g�Q�%���̓���P�);��|;�P�:�
ܼV�����;m��L���7gzH��P���
+FmHE������������Y;�kk
+q~�5�dL�l�/
+�9JMx[�x��ZZ������ ��s�qy at w�1a� Ӳ:sZk\�s:�l�>���
Zd4D�"�O�z�Ѽ1��f��W+Ϻ��f���x 
%���� ��-��s6!=�!T��������ͷ�
�96�F�bb
���Ɣ��˘���V����s���"�k�;��W~7
�(na��m,X�B at _�tldl�R��
�yr�G�X�43��..���bzfgT��������v|����?8d�^��x���5��
t
��{���qvuH)#�L��c���9J��X�����$��x�����>��s��A���E���SܺO�<�5
���4eR6�	��}E	�<	�zS��{�_��akQ���GR��ʤU�
)���d�������滚?z��������f!���Mbf at I�
k�M)����$�]�?H�
b���
�f�("%�<��%쇄�G�˚x�
���o^�h��"B�ss}q}�x��
+�Z��q0�vJ�{�_e��fd��Y��/PEQ�
1��o�gd���1�������)�aE,��*���,tO���O�s
8@�U�$|�w��+��)07?��{k"Y@�����:e������?n
���Za�?��e�nB�_R�F��%�,�9�2�<\"�
S絕�7�z���ﶦھ
��
<d�ȁ,����ٕ3�3f̍�
]���;�&ś����,����ل���
�������Y�=�<o��<�qWgD��K렺�h��sZ�@���IM
�:8�-)M �dI��b��뛿v=��O��v/�T����<�jy�pyc�R���F��+,B�Nh	�[��OU��\ѾW$�9����|�Eӑͱ֣)%�y�(���R^P�jO��Լ}�~�5|/f⢷�����i=��]Ϛ��=��N��Ǧ,|���l$g�`�
+����-GU��X�T�Kp�=;
�0�#�iwI���.
�;��4��i#�kg������,��>ϛ8��,��o�ߵ��?��
x|�*����쀊\�>���
	Y���61;cZj��Xﱵw�Gw
Ć=�*�:�
|-��������	`������g���%�]�D�u[A��hy��Y@�uJ�Y�z����U�Z�w/�E>���Z�4�������^�|�sp��+���W6�v�I��V� /l�d��
���3m+0žy�A�L[FnE�v\z����
HwW��au�a��?o��
�h��|4��)Z��Gʹ�aQ�u�]�޸����xݟ\���h��9�D��<���
������;���U���:���
�뿸9�sbku6j9X+��{\�
+t�	TE�&���+�偆����'UP_�焁���z��
+�����
�
p�[�d�\\J����Q�y�:
T2�
�y���y�S�Lw�~�5�q������C��=����Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�١#�
9hv��A�CG�
:r��Б�f��
4;t�2�?�5
���~u�h
[��>���hi�yxފ�pq�O?9�8U�斓0\��b����N�<s�ȩV
�z����<v:��&Ht�bE�}w�8��
+�>9}����_��}r�R��K'�^�x�™����.
�Tt���sgϟ�x���3�/
��?�t���ӗ/^�p�⥳�P�N�/��^�|���N�;�� ����ŢK�������
��?2&�'�O�>�����#Ǿ;���I����Kм��y
b3�
�����p`N����u��({�W�����9s�;0K�`�@�>����v�H-��
^
):}��H_��#Xh�Vh�gNC#��̝�Xt�ⅿ=����]�
�������_���߇��2�"h��G%��+�۟�8��
+�
+�O�'��q|w����Hw�'}�'~	���<�e�ϟ��R\:����"���S������7���KG΁]�e��@o<��ѣ�

+��#�Ο9s���5���j\#!������#�f�č����ڙ2�j�J|U\Ok����)��Ѳz��	��EJMh�ј������2H�q� �q��f`�Mw����iz��|���<�@,�/+RZRML���6	I1Ý�Q����AqpQ�����g���Y�A�zBA�K)���Q�Z~K��
g6'
���scg
yas��TL���ب
q%�fRGkK[�،U�L�
q5�>���n�c.�T��}��@���%����AD�:Ĝ����)�����4�Fd�ј֋iq� ]�}BxJ5$��0g�Ǻ��x��yh��|Z���hE��QDޘD�_y�yt�5���;����m߆�P�����NL���15�+e�s?m�����RF�)���

��
��&zw��#���5�0	-�-����4�ΐ��ױ:�&Z��d�����g�&JK�, �9���M�M�5ٚ!��̒k�F)7e��J]@I���9�:xԜG�OX�
����TJ/��
\|HKmιE�’�~�ɧf
\|��% [...]
+Y������L�q
��!9�墂P3!I�L����<�9o����3	'c��.
jԝ�2z�66*�q2�=15�5e����i���w���l(�`cfbS�Jl��u5�§ 6��\p<��G�ò�j(���z�+	�R+�0�.�4��`�VZ[BK�M�
P�#p<vX�hݜŗlΓ�cV>n}-��jI�@���������	�<����'�
I��`�<4Ҁ�[@\�k�W2\EZ�-O�i�!
�5����(��|S���W��|��TqZE��i踞�79p�W�ǰ@.b�F>:��(�x_��t�7)�&k�"3&19eSSf	=
Ɣ1Ki�����h�ȵ9+
����y������V)�3���9�i���ǖ���
�����r���ค�P��9�͝1�+O�������_�T�j"Zj�쭲э��)��E�vP���}^�����_������P�X��J�)�����^��Pg@����9��EH��Ȼ�����䳞�S1[�Jf[����Y�y�;g��%T��Q�J)�I
�&o�`��rv!5kѲ6)/�M�%��V����Y�͸$´[�Hڅ�,�s(�&�=�wry~6�?�.>�z���W~j2�sJ�Y
�5S��F\Yށ�ϻ�mQ3�ZH��5�KY�$����ޞ�Q[�NJ{�A��	��y�儎�+X�>�u�}���a=�ޯ�]hq�I� ��
�	�(�摡fY�ݱ��֓�U@��ɍ1#�>j� �P�	'�
+��sȇ26�4c3
.6��k<v��%glr���N��F�<T�*HX�l��Y�+����P;�ޓ��]��(z�Gt��XO�(��_Mq����?��R�9���ޣQ�&��r
1?m�36>	��p�!�"f����LSJw�h�a=01��Gk?�|O��e�]��P�D��o�z{��ۈ�
�HL;�Q���=Gs 0���-X=i=�*����>�ܿ@���$��9j��K��w��~g\IoHjH��E���)�ݽ��m���tLH�������O��K��u9�20�S w`�G��F�f��)���4rai�����Bu�֙�.*m�
":!&8/�I��������?����_,w+m���UlZJ)��;��R�8�zh�t-�$U����;��}�����/�Oa3!=��7�-�x�{!4�*˙H�9#�F�Lj�1A}���u

�:��=�H���;� o2	o��l a��\ĮE��hR����='�.��T��N'���ix(�!օ�������*�;�̤��O����
	���4I�I�v��J�rK�sށ�K�M���-%�* �
+ȑ���;`���:���,��w
? ��Ș��Q
�8eB�$L�Am�٠^
5���5H[����
�9�}�6g#�F\ڜ��6�b�lw^�
�w�&>.�c������Hy��[*˸��4������y��I��P�*���Ɯ��Rp�0Y����k�ZRm@���ZXa�˲H��56%iat%�\x�F�ٳ�k� ?#�
!�}�rHŠ�!�:Rc�L�MX(�#�a{
Q�x����KBE��h�?ͬ_Ü�n�-̞��ڞ�1a3�7g�
+��Ay�"�$Mbj\��Ik���/��Al����{����]i#�Y:N�@i�����{�
+5��b&6l�iҵ4���<�)�b�'5�ƴj�LiN�9�]�[�;��js�t}�5����4��h͓n�	%�9ry\�hM�ݞ1x��{
+���aP��i;�b���Ԗ������̰�ii)���r}��@&L���U
��Jc`{L��
+��]�98GyI�	Ρ�����'1R*v���h�=�bh�^�5A���ԯ���V��_�?7�1�fu�v�*�m.R��z�1t� �#�D]]k���TǷ�EtIPE���FB<lB���[Ŝ�]*�u
�����Y����K�X=3]�I0��VJS���N[%AE�W�v�f@�m��φ��%{�_|X�H>�XI�X�ذ�YDME���	�-�N�%d�W�2^/�
2n�ȋ�i;7�X��{��޲H��
+�Y�?{K�/�.�
j�Րkwm|ڞ�����^
=�d!#ZJ}
+p����
+5�̙��UH˘])#�f���/�z�1:#�A^�2(��EL��T�,��@���X�	+��*�_�r��?�/�1=�
�q{�Ji+xX���ֶ2M��6C-�;G
����+`�q�@�BiIz����ޙ�_����]���k�V�5t/��6�ys�
��>����3R[w
"v~Y~?��;�έ�5F���Y�3Q[@-�J�X}�bg��Ҍ��z	%�e�'4������4�8��n���
�����P��f�f!�f��t��U1
�1m�w���Vߠ�*>j�>4������a-�2����̐��fȥ�	�9>����W�>1'�&U||�V]�^���6�{l�u�Ѱ��p����Μ�4 �DU]'cꞓQ5�BT���0q��jV��
�t�H�
�{.6�[wH�-�(1W�*ܵ�I�����_�u�����q=��7
/Z}�������W_�}�ė�Nc�IE����\�g��� 3�Vr��a
�ү&�
ii ���]� �ղ:!l�uqp���y��uppi+��`���o�֡a0w����J;����]/
�w�z}*\�o����9|�ÊP�a�ڛ2�������J�au��Y+�+k�b�N+S����_!�� Nq5Q�"&ZK��F�<|Z�-dA�#���"F�)�-IeV�C{KB�����u ]b9g����z�sߟ)x��.�E�%>3��_{��Fd�j�" ��F�@ - at Hm �� =S�4���ZRe�&�G

DXK��:��{䧂w��4foU2�_�PR
ZOn���,		;�D�џ��>��NƋ!�t�g���g`4� ��-M�	��/mdv�4����X7�Vzo`A�y�i�}g,n���z>��C#��.I�Q#��������=H�&��>B
���������_٘l�fc���&��u�e{M���u.��7�؞�r�"��
��*��a�W^w������l���1CM@�~FBu€-�ja��޵�i�
�T\�C�lB���jL��j���͡.�����<������)E��&D��<�.2�+��cJ�����"�"8���Ԓ�\e\Oi�����R�G_	. �Z�*�j�u�
���b͏�4ޭ������s��)#�BjrU`�x3�$UD	��ӈ���]�oM*Ӏ�ŠF�ZZKDI(ߞ��a�u۟�3�k���H?q=� \`%)	p �@ �EkM�9(����怖u
��!n��jrmTE,O����=m!7�
bA~���؆F3��[��4��"�׬Nt}럣�\�[I'��3�6:
�x����T7�j�vJ[��D���9n?KYG�'�@Z%��I
�:l�6�A����*0F���D��
+����d`�#��%��V�J�&K���	�
���<)�}�foU$��!���*�9��_5Aʂ�-إ”�ٕ
%�A
�q�{
+pʄ�ޖ�B��Y=Q#�%�rr
�$�J���.��#dPG�y�T�[��
�\�^f���x������}`���*��2z��o�/`JR&>6k� ���L� ����� =&˻��N
�&fQ���
,X\��
+,�qix��u�Ԉ-
��q��cz����/�^���7��в�6��.���?[
vKhy����Q�}3�J����%�{�$��[,�VP�}
+z-�K��)����x`������(8�[�PC1$���r�
?����`|	�u�]����?��i��y����7t�wh-��M_m��?�ga#sFVO
+�sg�������c�_�:P
+�PP�R
:o�s6*���4���d�1ۓ�?l��<��E��=�
j���#*j�w%��_Oh�Y
�/a1�H��X$̤�ݻ5?m{\�۝qd�{���TR�A�9ł$ę�|L�(e�ri�*�G���hh�K
!coI602���{��
��s .�P{T�c|mn���x��
C�vsR �A��Ґ�1���!7�\<j�N�1K��ľG*��<�:����@X��| �_pȤy�Н�s�A�ֺ+j���̌N?��3}�# Kv=
R�#� =AHYi�)�;���6
h#Q�5x;���v6�|�)���ll��
+��_�
,`��Bn��D$,
P�E�,�1=�Ԑ�
�=�)�$�F�Ԇ��V-0>����Z٘4�?�ʺ�⌓��[K
KC����_��) �WX�3n�3{K�F�:d�,�97��D�##�`!�:F+��bV:�'�m
�c�I�s�E~U�c�.`D
Զ��R��
�
�����
�j�\���u?RC�2ffuCx���CjjM��<�*�bò5jᡷ4�z�󾣛c�k+P`��iM1�����	���d��_��N��N]�:�},�–�
@���	9��
�ns}�7E���$Q� 
Q1[|3���<�.<K�ʨ��
�kk����A�n�C��ћR��S�����3�E
�6Tqp:�
�,kQ F���ɘ�ĈW^�9����p9�,
��hT�}�Jjm\��͘��
��]��sкB꾢���H�d��<��϶���H�Y�-�%0)����(W�&z�g�j�(a��BB� ĥ�3����,I��b���Ҹ6�/NDԜ{�甅�+��B�H���܊P��J� 6)Y�D�v�X-���渾�L�/�[�I�� 0ww	�
�Џ��n=�u�y���R
ˤ�]
�z;XCz�%��YB�&�syy���T��VZ�>�낛OKYX���\�%d�c�u��� �rޟȹF
��
B���Ϲ��,����RNƧ�KE��
�Y׀
�*��=q�%a��3�a@�-
�����l��ѻ6>�M��51cR��gqԙ,t
�y�Y�s���u𿼗��BurY"�j\�"�� G����5\X�,�y������P�p���
�����~��;��
?�;��y���I~k`q��u>�����J8	Ӄw�sK�v�m��C�l"Z�%�e��	���2Ʌ)Ӱ<m���r\C(�QJ}�Ԫ�QH�����p3��t�t�G#�rJ`Q�Vp�� �6���gp�Y���GYV��&B�NS��m��NoL���u9�L�5
�$��M���NJKi�p�RL����������yBiJ#@mN�.l��?�5	�I��*�'��ZyV����jV{�,"'��֨��
�1�zD�y,���]\�{6�����p}�����$o�
+
v��ւ����ؙ�	���sbf!@ǥ�\�6� �$�l��~���O���)
�#�g� ��+ȕ!�

Fuh P_z#P>��Q
�3;���Y�;1�Ks �r�;�3�����{�nh���q�s
?�(L���q at P ���03.F�I�)x���W��_
|�T�
���/
�����.=k1v_�_���:GS��:m�q2
�sO
���,�I��8�_�,�?Iz����u���w�]ŴM�@�&m��㘙ٖm13��b;fff1�Af[��d�i�>��x�����\�A���=�o<��=*ǫ�nޚc�̐�|jz��
+������٣
�	<���؇��z.��Ħ|�X�(�uB�C�N��=
*��#]]WH+;��l��6�`^-^�h
<6��~e�O������
0�<��je�Gh�m��w�q:�2���F����c0��ƚ���~��T^q�K�*�Γ����r��Mޝe9e5u��q��m֡n��y
����3��:X0��U5�4�wE���K�M��@~�0�}ʪJ���f[d�4BvH�g_��<*�'Đ�\�s��
vFi��9P�`l�j!���9F �����.�f�"<*J�F?�o��	z����!����9��,��������1����!��C�p-�c����
TЊ,���ֻ3�I)E�c,�Y��so�f�G��U,����h��͞�ۇ
�
K_���1Lđ�C�X��[
�qJ�����:dQ��!�H�!�x
� ���!>G��?���_u�QҜj.��Ur{����[��?�V
�GJ>�+�hۓ/����A�y䬲�a���U�P� ��W3J<Jr��L�݃ELBPS��TVV;�lt@��
�2`#�:� ��^�Y��KM-
�0A [...]
+bۀ\D�Jx�\Ăj�d�
+�VE�ﯚ���K�H�V�ۓ���!����qd�я�L�OM+<�ӂf�h��|����&�9�\*�]����=:ҭb� ���t,�_.����e���U���a���d���	*A�ǻU$p/5�neu�K)�
��G���Gk�CA�J�N^�l䳶��M��<�	F=��f���1d�1������F��Ru�?��/yc�}�ݑ4�X�+h�
�8�
!��P�j١`��:��x�4�GC+rk%^h]Z�%�U���%1uk�
6VԞ�	���l����z<�[�.�/Q2�26|OJ�)s/
?�������]P�eb�j_���L��
"f�y*�T��Ӕ���L�S΀9����yJ�����4>J�{8Ɍ=�?�I>1
+�Z��@�zT���������_�u��ⓐs�K�ԝ��ǁe6*���Rb��a�L�����K�}�w���o;ȯN��Kc>����z�2�SB�8\.y�c�J��3��R��O0�P�<�OC+ޟC�ٛB��+�8�� ��g���堼��y�� 	����9Z��!���*��}�9���-O�ͻP	t�e:h�t��Ő��d��җ�|j h�}�wJyx��i̯�m�h*jݐw�Yh�"5ݹ�C8$��A��r
��T�xb.o�sCX���7ೝJ�k�=�
Rfk�~//l�
+��G��ھ���	���K\�W^%.�'�b��BR at Q���5�&���wk�� `+�׭�6�I�+}�WG��*h�% �
��[�
!�Y��} ��Ԓ-��n�3�6))գa�@��?��>=��U�1ڮ���
�o�]�S��@� ��l�%h���4���.�0�S�,�#� �|������5a�A����1�܈+�Ŋj����
+�ԫ�j82Wu�L�}���N�������'k�d��ap[R��\('�����c3O�P
+��1~9׹����)�ǀ{C�������{�\�
���yj
+���'��ʣu�+�p��p��8/�3��V�1]�X�!�m�\^)op��\H�K� �,�J}r<��)v�ׁ�
+�]�*9X$%:e�l�Y�]Rz�G�*qIx(ew�����7{K�9t��K�,�
�7]�l�;��c�t�撽*�1NK
+K+�9z��`�=�d+
�S
]
�DIK��¼���P��(l�?T���*ZqPͧ��"Q at W��p!���bɓ�����rlrh�\v EFx�|F�O�FO(
��$�
��=�x�]rC at 3�K�8P��
���^S��,�{�Y�Zb�Hz��Qӯ~}8-�t��6	��6�}� c�
�k�97����2���9N��T�n
��"Ԁ�W�M�E�����;�!�+��*2�g�|�
���]��!��:��`E|+oȸ6׏xu��\�v�Rruy�Ɋ���Y at M+r.SҼRv�O��
�c#��
�,`����ߗb��f0�m��찦�«"��L쉩�-�	= ��ɨ9�2J��!qcq(c!WƱo<J;`��
��mW�u
�KM/�/�R�����f�u
MU}��L��Q 86qh@'�)V��$-��(�? rWp��7�*�	@{��y�d}M���P������j�|�V�[�~
�mQ��Iq+�A-	�����1	�^cy��X�
4U���t�>l������@���su'��� �J��Y�Q3 �ˎ�
�G
�3���3��
R>֩�����kcE���7�ez
�#�d'�\��<�
�sч��ԃiB`���yr�x��8��V?�s����r�i�eF�}��mſu�R���s�rXG� �
E
i�|�]�
K�b�5ñDI�Oa^ ��i�~9��bw��{S��+�y����/�FK
�kkx4ho`GƱ�Bt�)��ș�%h��╕�
k1����w at fz�T��+��^9��Q���d�I��FA���h�*������|��q����%c��M߳
�n�{	/5�����ʩ�Rv@�9�?
x���mE�GÀ[��/�2t�G��iY����nSVU{�<
�6k���ۀ�mM��Y��q㣖�>\�u�z�چ>�g��6�V$�Β���0o�&�@�w)DL���ޣ�i���ȧg }J�	࠰�Z�� cm�W�rR��
����6��r
�x����M4�O���
���p
��
ɧa�|���+�]~�j� �y��C�D�N��]f
����,�P�)� �*�
+21�gb< �Y��Ψh��i&�&~�6�	
-���xVeS�q'�1�l�j>ͧ�i�)E��erjx���z�V4
�W௽w�̀�Ttd��)������6�� ��
k��lZ���xu
�]��
����|W�M�Uu�l�͆�*Z.ą�c]y���c����$����k\v�LA�5�T�%萙E
+���UQ�[�F�T�G%`�z#A{�|j*lo
�ζDL�@���\��45ٹ�z
j�͉��s�E'�N�\��'��3�{�
q����tL!�B9ūf����y���� ��P���,�R�r}����@N�����\���]�~4�ʽb�WJLqK �KXp�\�5�X��É��~��C::<�"e���L��^�]�-�.�Ӝr|��`��,
�>�XO�
C����l,����Qm�H*��^%2:������#��*jdR�[�.9��g��p�<�(��g���|��V�Q�ؐv���9�xH����疠��
%��':&Z�*0���Pq����x5�T�7����ѐr�ڴ�~С��q�k[]��mm;�T����
���n)9; �ͣ+�U�!���_���d�/<1�Q!->ӯA'����M�B��|(�$��|f� Z
+��Ak�lr at E.�)�YA-
�B��R�K��/�*[�:���3��|+\�[���ȅ=�4h z��j
+���^
�ħ�4�,�
��7_�bw�3�j��,j �L��~�ghSN
lUZ�h:^��?�
+�����HG��	��8��3���^�	�g��qY�Y
P���1�kP+i~��ʮc�` �7tB���
���h�E��PYKٷ�k�=��U]���O�W}\�
���2�yGе�EUО���<i�1O�D �����h.%%��>|wl tȥ�$�͗>�*�eе
H�٫���
�#��#
�������g]�
��d�*~�]&�5,�e��-!3�
�Kh�P��1�E�+���
��7
�65>su
v�'�� {�
��4챹3���p�-��Tx�cl3���eĻch���K���]��g��/㲏4l�OIʲMC{�n8�QѶ%|w��쑁�=]�3��P�U��n)%Z��(�(�

+:`gj��J�+䒏f��
+�4
\Jd�KFH�+9h�<��9H�~m�c�	���=����R�}��
({}j!�6���O�B*9l�нJR�}��:[t?�9�r�
+.6�e�|*b�_G*��(�W9����
+'�,n�X���X
�i��W�(��8�@���J ���WٌcK�@�\�
+�φM<ޟ�l�k
�kt�[^�ں�uͺX� ��M�IvHX蠺���P�q��RFᡔ
?X��
,��uk\�J���ң����
mj=��(�=�Z0)�T#��V�3}&�xEP����V)H���
\�"���|P��Ac��onQ����V��5#l�L�-�ڠ���X����� �_�,���FE�_G�
�)%Gf<�2���I�
�2>ѣ��n-�#�о�՚��j�p`EX0��>#��k��txx��=h�C`|�wtW�܃���;A���
��P]
+Ao�
�pYG��(d at G/�<��:6
��#�>�U��E�4�x*�:S�0?'��@���e�t���*��ښ'zq%�ͥ[�e�
�lh:ȧH�d}���Q�9�M�ыA8��"f�
ic�cI�p.p`�S�t�,!�'5r��
�s
��X���j��� </���j+jB�נ}�^�A	:��L(�ꌹ:Ɖ����a#��0�^
q t͵L�	�����М�q��A���Z���䐠�y�ZCƧ�T�Đ�V�T�z9����^��YfS?��k�\狁�3l
+¦$�� ���,�CjKB�***��}ame�K�Oٟ)}�;�w�>_�̯���Y�9fv0�Ǖ��3
�
��J�Zz���Չ�]�.��,_lpC[�� G�
jt| ���:
wl��ݠV<ڪ��k5��u.ϭ&��tt�O�$
�h��ka2S�W��mL�a�`���#.yU�S��ǭ|?|��P�#mJYś��Ԁ�~���m}F~�WW��7T�MՐ�7
�,��հi���n�
+
�2�2\Z\�S�����i~�?�a&�Y=x�Z�p
��d�j�h�+:����͉��4�Pn9<"�#�>aS��Բ��I�s������
+�
լKAH�[,{�Wӊ�5�7���3T��V��C�5�.p�~#��ѱq�Pj��<P�x��=���+�(������<���䰰��:l,�
����\����������u�V+ێ��yl��!R�̡Cs�
%�
6&l�l=6��
�+��ڊ�Z���A��K~5�Ss�\|PQ.�(��"�C!bؗ����9c
42Ia�3N����m
iX8�<.ֺ@HY
�5
ibx��9^
���@&b�/��ͅ�
q�'湥��<��j_�/;݅��J����e�Ao4Bޱ��#
41��i
i,/�N���
�9�#_������V7
��������FJ��3.�so�
�W�7���v9�ְ�V%תf��酻
��0�' ���LTPǡ�W����������GR\Z֑�^T>�+g!���hm-`��	�T������
�ٜ�į
�<
����¤���?���u
Z���t����B1��:��㡵�� tfx�OO̵��n�<!oo���Wֵz5M�
]M+����
��g�
� �b��**<��A��y�k����|���p�0�2�q
\~*%�m�1�]��ր�q
�{
oԎ��+ZÖ�A�ǚ�>�У��w�Ze���q���iW��Z�
T�@����'Fr��&�#�D�}���M
h�
9�tgo��:�z{����&.</L����g׺t<�xA�����D�|n��Oɧ��,�G�*�hx$��C �
T�`�S
��~��▰J�R*`[��бp!�!P�=I����:_tb�W�|��^5���ƉF�ϪƯ�1@�e��
�k�@��&�/,�%wv�K
~.
�t���ٟ��:�kʝK�
���%��2��t�}�29�H.�|4��W��

̐�*1�H/�A�~\a3�+T�6���V�9EK�-�������^��A>Ǧ���%�L���
}l��|JZ>��ҁ��Gڪ������$�;Yaќ
+t
�Gp�/�V
<�K��Aކ�',�3vG���&Qo:l�G����!�

�~mm�_�.�d� ��q���Dh}<c�_V]Y�7������9��-�#f�U�8���	��j��c}e=��� ��iET}�牅��&8e�|]_�ShN�A�
��@n��@;@�}����b���`ҏ�t�E>Y5
m�އ7��Gk�&P#'�򖏛�֣u��g�P�ˤ��UCU�Kǧ95�As� ��:������BV� �8�˫+�v�[<��i��q2`.o�

�cp�AY�ʻ�;��
�z�Nm�¡/�\�
�_��h.�c3��_��Uu��g����Tey��Rt(AD:$�X��R�Ǫ��-��?�<0
�_/����Q˱�M
+�%=���c3�u�"nthi�
`����7�
�����t�c��l�!�8���
����}����\�F
�b�rV�}��p0�}e�Ľ=1�aYA�# ���2j�[N�5����eA�F.�Tr�sN��B@)9���	�~���)!gz��R�2%}k��=N���a��
+|�c��z(%e�����B��0���XٓC�?n��	9�D+��E������$��;I�u�4���9ъE�Y7����BCB��@%��)�>�T������$�?���/�_gˆɠ_r��R������1��%F���a �o L|U2����U��B:|z@�I���%��^ ��ze�
}g�Y}W��.y�s�cCPW��>U���W�%
�
�`��1���B:BfPCٞ��ki0�w}:�d]�ɤB�
a�"�
���#�Y�Z�R���9�
�ݓMg'��iB�u��,�������AcMwhM�>�BÜ��� �#->�HC�����-|񉥲
pPxu
M?Z���1RK�@^r��< �&���*���0����u��>+d�"�Zj�CN/t����u
C�r�\��_(��\�ՠ��*>˭�0��5��	��:Z��	�
++�*j���&�\:�/'��i��Ģ�Je󑱲٣q�z6�-DPC.
i�� 
���#�
�����0�]3�(o=Y���J}r�GM�
���>
)hV�U���u�-�@S �qz�]F&��@.�ϡ�l
���
C>�
Ž��C=v-��]
�X'��}�fg����`���ޜK!%.%������ �n)!�#%���ܐ�Q�Z�g;�y(�R@�
��s-R3l�йb�k���X�E��o�����yz��$1fw��-�D;%��k���r0��Pu��l�ɾ�7~_��y�,�<�'��;%��B�3���y�LJ��P�|� �
}��A�PP�
s���i�K�
�U at I��hf�|�f��\�W�,=�'%z�����A%%�`����@���YjzP.������?�i�
}2b�s��g��� ���+�B��|����&�c��锰��j�y
).�>���
7�O
d�#��~��~

�����n)>)��@��Ps	{s�T�
���@�!�~40�Gjzq at I�,؛C�΢B���k|^Z�S�������?@�n�*!�a�S|T�@���0x���h���j�G�q*Q�a3����u
+�C����G+<�GeJ�!x>6h�d
0.!#�C���5� ` u������+��­�|��v�%�V�����u6é���ޗ0�7�Iq
eu�GS^u�@��E>
+X��g(w9���V�I��)a�lO�S�'�DŽ�L�c
�S`�
+|ʑ�V�1=Z�h�T4A��ժ�c0�A5�Sr�N))mo����hك��C�
�
������A����9�<�
+��yg���1����Ճ~h�!�l#:f0�9z������芩9�����
s�wЙu��OX@<v��b�
+r�Եk��}0��W�OQw�p�
��̽I|�f/�}�	��
���*���Yxy�����0�g�S�w��
o��=t,�]Rl�GFH�����IQ����l�ĸ��U�R�K�W�yأ���Yċ�
�䓐3�q�,��;�f��p�͝����ytd at F�q/b"=��X�"!�`�]���K
X@�A��Y��V���=�ӝ��[{���%�;�
��QBsW�\�爠����9���h�4h=�#�
k�t��Yv��# ��<ʳLHt/��=%��5��l�G*�zb�m���3�|rF�sc��
$�ĭ1��q�
�%�er�c�������1Q��r��8���8��g��6
+�� C��l�g�V�Y$&{	��	̋��}s��%�9�.<���d�2��Yt0Ex�?�z�Z��
�H�2%�'g�B�?}���:.�	���`��*
�.%�'$9$��s<�C{��*J�&:2�e��u��0���{(��o� ^��T�k��#��א�B&�o��]Jr������j澥��|���NQUxa{���1��c�e�@?=d�O�K�Αͣ�7�#��yJ6��u��.�ac����u��/�s 6r���B䔈ٖz�c��ݛ��OS�@�����X�a��
+��௠�L�
�tՀ�� �H���҉�cǽ�
B�����!D�
�b�Y���C쒱����0���)�2B���d��?�{��s���(���C����qR�u�q0M��w�P��?Z�Ss�>��߅�c�
~c����g��g��}
w0ˇ���p�J�s���A�í���󀄖{�`�٠��3��,9	����ɲG���Ww
+�m�+��5����'�՗'�d�\���m�g�s?+�~�h�{�]�sP@2݋B���?��2u�\�7\X�.�j�*�}w��HI/99
��;�")1��Â�%a�@��攎�|V@�(	��m)nP�	5þ���
-�s0<z���;J���G?=������H�!Q�i|�m��?�|�;���U��zo�ͭ
�#�%�� k���/�lӘ7��9R���]f��1X�HV�~v�C�U�0��FO�uKO�UK7���0����j'�!蓢�qv��sG���֍���R���
���Yj�����"��J$�y,/`�a�4�
��}�� ����s�
z���p�|��_gO����tM�g�3�XH�=���j:��#��YE�#�W�ƒ_�
��$���㤸OMM���;l�x���RIP��w f�
G>V�f�1��^:C<�Mc�Ag��z
թd���t;���YJ
+�9"k�𻦶�+�=�;�!r�W�'���9���Ԑr�О�aģ�n䃽\�}��#a��r�S�@����
�"
l���24�����u����ÊYm�=�t`
ltb
��"nm�^��#n�
b�[G��V�+܋�_�i��	j��(��f�mSw��Yq�׳��
��7����AO?��
�=�
�>Y�Ȼ�ӗ���9�������9n��83ӵ�-��ӳ��p� &��+��B�vO�ޮ�e��B>�&�;'�ۧ����E7���{�ɒ��i�ccO��9a�W�}��OT<TK���+�C�7����)�s�k�4)�p��;�^��KU��YA���
��Ez�Ҏ�ml.�`�.�n�E��(�{���9���C	1$����58�sqA
�S��ۤ\���Zo�UcK�ySS�esk�o�V�oݨ�`̬�(�<-�p��7�y�7�zlj����o����;��W��ꐰK���΀�

�;c�;�=��W:����~�d����>��� ��zWѕ��������2~�w2~�����_7�0ό
�糼��x���+��9���f	1c��q�[p
O7�Ow'����3_�,Y�Q���0��!��A�Z�-�����Qא{v�q�2�����/�q��n����;�����36�sL�rz��q8I/�Hkk�3���>�f�3cK��%~�WS�ȿ�4�^P5����E��,~qb��X'�n���
+��}IV��fo��^	)��y����JX�[��ȕ���=���;
~��'���g��D<0�!���S�ئ�I~5
���WAHw,�=�ʻ�֖���1���h�CuKލ�rFPˣ
ΓSw���u��S�ŝ&?����Oq���O��!n��^��/�.X:P�u�ŗf�1ߌ^}���o���ۧX9���TK/��� ���.�Gye��Վқ�ן.rR/:�h��K��J'澡���NWί����K���#���b� �KՂ�	F�j7쪮6�[]e�7���S���Sk]��g�ɧ����nZ�����V_񍝁��}��tͅ����􍹿^m�"^x�$�4��:I��ž}���Sz� XR]�x�w��(#u����:Y���l
�#V�
/i�r~��e��T%�<-���:MJ��t0�|�=�x�
���Wx��QpEݘ�&�Ǖ��
�s�萆Gw-���&��ϵ07]��-��yd/�
蕫���׮IR���� ��v_�
sk�
�'����wFq�>bo�S`Sp0P�tI11�'���_�Ź�Uՙ?I���j�/v`�N������?�}���93E��t�i&��f�w�N��A�]Sѯ�3�X�.�9}�K��Ea�WҊ�5�9秹ѧ�&gx$\��(%�6II��-��i��i����/�kIE����L��/���_9fX�����
ص�6���?�Ι;
�����5I/ܙ�u��[c�d���jg������e��������?�������Y��}�;�}w���_Ɩ���e�;�
pO�}�,�_JH
ʹ��Yj�[�':�<�����܊�i�����1󬥫�{��"�˽�u��64f>*E|S���0�����˻CY��͉�,�ٗ<K��V��l��� �͝q����kꆤӪ���_�*3�4"�Y�s��;����΂˳ܸ�'h�Nғ>[d~3I��|��)Q�ר�g�&�޲��ַa��2��+SNI�S��c'|9E��� �L71�lG��/������ܟr|��M;��]|c���(��'���
�׊J���vj��
� ����^�����
��E�UUY?)�3N�[0�fY�_uU%�>>���

S�ֺ0��m����Y��/tM��
�ps��hq��;CԨ���aԣ́�[}���mY��k�O�*�0�R�ڈO6/�:��
ͅ�����E9g�Q��
$�|�9�~�=B����].�85�N�j�<�Gem�O����w�J���OS#N�r�Ӵ�թ���Y?=8?Ŋ�b���+~��Ls.��Y[�ŷ6�����ZiϹ
+���fo�Y�o6�Qv)��6KJ�
�m�_�t��ޗ������-iu�y�-�@
��Utwk��k)�&��?�m*���G�؝d�C��\���F?⡮vE�
0�(���}�ueu���%Wݐgt��_�����)���O�WW]X��?V7��/�Ni�
+ΛZQ���y�q�?Q7 �
�EL��#E�k����&���Cᕃɲ'
6u�>�R��'���k;c�dS%r�<��QR���S��دƈ����_�lc8���8:ʧ��>���ݙ���/>]���ܒ���1�9�s��buޭYQ�5Ǽ�r��y\�^?��V얥�䚱-py�kC:cZ�qE�\t�+#e��ޚuv�#�7Mu�e�����y�#-gX�ٹ;����!�KK?��C�EuM�Ee�)uU�w�EJ�� 춡�즮��LV	��m�]46��n���7$�;������f&�s��J

�3����?��,��&)���a����_,���/�ó;���pR�� ��d�
���<��iz����_�w���~�z��'JqI�R�ܟ�?^�.�MS���
3�^�O���?
q3N�=���Y�ob�.Vd��Wf]VV���ÿ����(��V�R/��S.�Rc~��Gm
�����q�В}n��� ���t�n�m�u�!�B�e�Kq�
���e׷P6����M�+}�'��?���Us7�.��W{c�������KhN�/��d�cg��9N�ϻ���0;c�
�T�\������f��z��8�<1��?)q�l�D������S�����w_)�o��鉿�ٕ�h�h�Ͽb�&��@�Ѓ<�}�<BN�l ��9V�W�Q�c�
6r�2�WJ��Z�h��&��ya�w
˜o�{Km�#Z
+.��/�v��ַ��ZK9�Ť�I~�f?找%���5��-���{�3�K����c
&��&�
�4�ڢ�ʚ�3S̸��
�����W	q��n����1B�c����e����5�[y���%���Mݥ��I��[������Q��
�o��\6���>F����5�s����Y��ؐsq���S�;�za���u��P���2;��'
Eov�q�[�
�jj�~�ץ����r.b��&/*J�|�O�����zp��.I!���!��4�՗�	b�c��ܟb�
���s"�e�
d��򚬟�x�_h��^k��źLL��L�Qی��~�Z��j��..We���g�2+�]�$_Zm�fy��+=�(Ec�O���Ӻ挳����6�O�k
+�.~��v�k�*�|EM�9uU����_%���3~�t_��#������x���:d±J��-}��Yrm�����7�;UM�>f��ﮟ��j�o+���>j̗-���{��C����P����'�o��>�<���}�I|��qOߒ���!��}�9YU��9V�7˼ğ6{P/�J�|ٌ��KMV��_�uz0�����:��^�Og��N�t��`D��7�K=�T��g�i���@�y�A<w�#^�O�U6�_^�G=����c�[��/�:Jn��#�
�����N�|�?��&-�b��肿�
���u�_�Gё�Q�J?*(�։ҧ���_<�l�
�7]��J7��,/��#�cc���i�+�26n�1�wF���Zɑ����/
+N��^���҇{}8IL�O�cT��
��&e뽌��^�õޒ�kݥ���%5Y�W��;�I�v���o�����g'I_ΰ��b&}?LI9?�ʸ��B�*���ٳ_��?��7?�e,�
�L�s��_��	�
�ϯu��1KI�f=�,��/�(IZ
���2�Q��󜧟O�
|�ٗ��:��
�G� �̺T�{0��Rפ��5�\��%|G���o�~�4�_.T�^w.31�qL�.��>r
�R^��������oO��`��*
+A��]���:�qiӥo����kާ�U��8o�ck��/t����S��J�Fw�����kc�w�A��u�>�
���b� ?Sӈ�9�M?݃����2���9&�2|�
+�ޘ�5"�����r/��~������}�
�?�&ؽ�r�����vj�������F��?WTe����ܟ}�܆|���=�<�f��u���7��1����*�~\�?�L�v��q~��n{��L�B|��)����9''��L�n�v�:KK�� _�ZJ�:9ȍa�Ks/��e�����*3b�.�2����\���#�H�QY�yy{���mF�Zk�<�
"��
¾������Xx�"�T\���U/�����˔�]�ygq�i\�c�''['��fԳ�����|��6����?%�7_n�����L�|j��d�� ��g�ݘ��R@�����%|��$쉥3�����+홗�R>0|������09Rݘ~����
��]�_v��|+�K:�oν`�#&V�^|;�L���
������Id�f�
KW�UM]����E�7��������k

��(��c������V;�on
�<\�ɽ��K9��(y<Č�NQ��܅}�1��
��}�U�:�y=_�wu��q�a�}��{0�ȶ/p����\�*��3Tv��%]k�
U[�mY[���Q\�7���"��fW�ݡ�W�x�{�
�H�i���Go>_�({�^b�
L��n
 �/U$}�,J=�$J�~�u~s���bm�cqޓ�V����+
������Rq�wC��"F~�l̹f���z��v\�'>�)#�Yүl����G�E�Y!���Go
��o��m���!vo�잾1낪:�'�uOJ.Ʊ���
���:�O����
"��.���
.��\.za�-}�
t�#/go�ܫog�ѿ'>1}�����]��\������������麢����u�%7vI�{#Ĉ�!������[C�`<�/��O���������//���-�2��D�?���_;&X��.�e��ވ'i�>n�?������e��?n"
�3�

��.;��%x,�O_Yo�Up7'hɆ6�#��=K;���~�6���
������5e]�
%ǂ뾾,��v�����������T�kAH�k�\��Kr,74xdBcw٣Ŋ4PC)���_�� ���9��V�po�3ά��_�֩@�<��%XǸ����KӬ������6bu�����VP{ø7�1ij�2�]|�e �\'�S�%�M9?�x�]Kƥ��ܛ��
�ּ��f������V�R�
���ւK���o��`=�z�7������%me�Y��\]^�}�Q�h��m��Ì(�WmK�e��ԋ�I�;e[�1Aܙ�9r!�ׇ}�ǟ�r_~k���}}����`���	t��)
<��V{�i.I�hg�� [...]
�,q�yF��D��yT̡DL?\�`l��s�]�(���l������b'���=������ÄH��3N���%��n.��=F��
#G;xp�L�9X���c�Y��6y�m����V��:'��8�m)�i��e��Y�N97Ï;e�����Y�^�#Mc�Y}K������f��Tig���o)��9�K }�j�%&Ak
+]�ח���F�3��8\�b����n�Sۂ�l�磶��Q�����E7-��vg1Qv�
 ok��>�Mp̢#-}�q�G课�d>�K?�^�aݲ*��B�:W���ܟ�$�w�o�s��Z`�L��hc>"���&	)�������a|��<!y��3��ߗq	���{���_o3hnU�辴�bk�[
�<3���$�W4"��%�͕S����.�iޚ�]e��
y���3/�ړϩ���DU
��F
�u���QV�:$�t�� a���
3�6�i��
�����٨���F�v�(��B|��J|��E��
�&��})��� [...]
+�a��\S��BU�Mc;>�:�E���ql�����5�CG�M���чy��O;;J��q��~~Q�_߄���0�C��P�����{����֋�G��l
�ZBF�MS|2f�k���iN����Jڙi{��q�Y����"�
��~?�I�M�
��@x!(������WAy�>K Z^�l{
���]xskc�БV	�7�-ܝ��Cu���
?��?�.��oJ8�����6ALw-Vs
]�(�����h�>�k
bg��3K�ݙ'���,�U[׹-ilٞ���i��}�g���(�
��
�Q̫��#K&¹(b��K���
.����l���!Ӷ�A�{�Q�Ui�w&�nEU�GUQ�;����?ж��X�M��i�z�\����{{Ӵ\Es�%���nx���PR�uf�����(6�p�GvȄT�
��{�c�]��S|gI��4'��i~����ԫ�e��g�Au�9JK���q��@�N0R�me����>]E�ғweg�
�ŷNrKv����T���+���֬;ʶ�kS���qJ��S�V6���m�P�,�����%��7���j��<B����a��0�i����d�h�*nk�=��ڟ%���M�@(;
+~ߝ��m��{�5��A���!@ų34��R
銔G�6AE_��}�Q���8�������Nз�
�
����w�'i�9��g+)�1q���o�$?3�P���#�-���*�mq����3����7����]�$u��

u�(&ް�Ւ��ĥ
������օ���!N��
ׂ��z�AQ����m��i���+H7L
�'�:����T[|��<G]^9������WvZ�y�������Qz�}VD�-���9�Yf����ڂ(�Gs�(}���`��651_Z:+�M-�dS��F?A�u��:߇,�A#��;*/]�E>Z�-�c["d8eL�[[�����ؤ"�������
��>\ׂ��o(�e�
vc���:B�pL������Z������p#�>\���f'J+��
Lqk|���wsYLY�a�Zf�����e!ɳ,"�gye�A�������qr�g��ڙ�� R>�F����F�FZ�]��Ko�sG���q\�G]��V׶����s��9z�K.J�$��K؝*}e,zlh˿��
���O���Ŝj���,��
}�[i�wj��n�[�
+U�-P���{�ݍwwĝwHQ���g����#���a��\d��>�#��sL��B���g��V�1��]�H�Xj��^���Q�ۣ�h��\�����d�2��[�����o�ʚJo�li��f��	h��!䏵~l�r;.\�,z��=3�aB
�p������
����s��ͱ?W꥿��L"t�loEж��t�4���:�橘�1p��.�-�ю
}0����
+귧Xe}�����]?�
�G��&�dY�LK���ԧ�
+x��,
�҇
^�a$I��	�WZQ��x�	�##��(
�r,��?�����΁.�>	�9����+ǰqΈ�>��Ȩ�昔�
L�YA�Rv ߉qo����'9��C4��vd�e~A�p`���ǘ�QǪ�S~c&G�&F����{����xcyƝzH�-�j���`��/waÖ;1A̴�NV���Ս�>hEV\�*(:CML:	

9^���1FT�INr�il����

}���&(��mP�W�c���kK���#���Or!�n\���֪LU;x���׍(�ԏ,�>�C��#��za�7��/�|:�w�:���
�����S�B�
"�?P�A� � �ΒQN	j�
��+�e�9�7�%�gi��6�(�%��﫸�.쓂	y�T{����$<"�Tԋ��a!_�ࢾ�Ƅ~�m�
㒓�v�г��S��
<tc
��M�	F�����&~��ޏ�+|���wy9aW��ߝ*������>��W/��?�s���j;*��++`���RR�
*&b��1r��.֡d�=zΦ$f�v��Rp������ʜ��y��
+���.*�,��)L\�bB�i`�'��>����4,:�|Uv��~|�]���T|��3w�4ۑ�iu�o����B�mȏS���-����h�
 V.r�O�����x����?� ��gO�
^� ����qN���Yn��+t�C�L_����4Ǿ؟�]~�Y`�(>nG��u��EV9�9F�]$H��!���{���s���?��.�|}s��ys�]�J��܇H��̪��
���#�O[�ŗ���������a��7~�'7/��^� zv����K�?N��s�
(��!(;��Xsy�E5?��kד�
CȀ�Az���>T�Q��>�)J=M�J>Y
����@��%��ez
+xr�{�<(��#��gw at gO��>b���c�܈?�ao�ueO&E�T��gsm�i-�k;��_�$1�XfP(��GЗ�A.�}�q���]�;����g� �@�~?��,��M��'DԂ���ȏ����Q!\�Ɗ��4#��[P��
��
����_�žy
J��y��}����M�#`>�]� ���	ЃK�sb�D�����Y��,jX��@���F����-9��Ə
+1~����Ը���c�� h�7P��=���WA/o^]:����'A�����'��ϩ��Ы����IX��h�{�*b�
�v��y�y�E(�R]�w
s�4$���5(��S�W at O/_�^�zt�"���N�<�?�{����['d��/
5��o�W:�
�G�!��bG�OY�DŽ*��oa��a�!�"������v
���eP��{��'O�y��w�"���
��?��<~t8^��W Jz�eu-����`k�UhST�w�\��(5EV~��(��S/b�C�9	>��
zq�*��
P�����Ο:�
���렳�~�]���6F����y��W��3MF��ƪ�[�	�E���QF��,�?
aV<
�@^�g]BD���{���s�w��������A����
�w�k?PYh�It�s3��?,Ⲱ�INy%�q3��
+��1��25�dAT‰�/^�~��
+0���\=�}���Itr��z����
�o�~�+Iy65
�<�.��Ȼj��j�_� ����
��E
���<�����m�[`���
���`�~��(���c�|O��_nG$��3�/�b���o�j�ke
����
�I+�ۀ�ިBb��sr��y
+�}���)�������y�����U���ˠs������v�)��Gܟ�������^R�r=����
�"�@}*�2��
�
+`�P�i�B߼=�y
���77���=|zr�t��e�]`�|����&(��
9#���
yl����rJ�� <p���EBH]�`�zh1�5�UH��¸�A�}A�žz
zq�60�g@��
����ʹ��g7|@����G�y{�2/��|*tGL�^A�����ڐ�
��otă.*�
���B^hȱ��Aq�����o@/|n�Ν<����|� �{�
�|�<�@��O�e|�pa����.���

��,��fb�jZ��8.VZ[�XR�y[-�V���ɔw@	�^�|t��+����60��AW�<�������{�n�|}�r���N�����}Y�c��&�xVy�p��i�"�j;qA�Ē[��Г�/�^޾	z�!���+g���"�1���������՝G ��wA�!Aǫ
+�OtCb�X�GD�\�V����
-��&��o)k��D<�0��[�}y"�ՋcQ/� s�zu�
��S��n�=
��ٝ۠��Z&��|���zQI{:�Q�i���2�F�	�F����ռ�n<÷
I�݁c<B(��Ie�²��'_"f�_��E��{*������ڦ�k<�MW-��jK�J����8�F
�"��S�!P�j0�v��K����D�\*��>�IM��N��@IJ���������l�Rwٛ�AT�YQIݔ	)����ّ�f�̇&^�����ƴ
k˜P�clv�Պ��3!�>��=�q	�����o���O��n����5��ԹNr��3�,�#M�|�� +�M��.��c��|1��~hc���𔇤"����ؓ�� = ���"�o_��^8
�!�xJH�������CL��6�w���d�dإL�Gͫڛ�8�B�IY�RՔ
�5��軅��|��D��?(����}?Х?/���}?�,�I*C�v3��9�����ER_�>�*�n�)6�2ŮX
��P�vn�Hѿ�
��**���p*)0�x�/@��b�
+���gw_���cO ��o��1�CU4��Va��2]z.�3_?�� lu�	�
��.�Ew1��0�삢����K���
eI�|����g/@��?���
�

?��˱���3p��T
!xy�
�US�ŕ8��Y�>J��6�^��1K��xI;�]|�u&�������C��Χ��y��>��c�����W�c�/��ĝ"�\�B�O�����z�G1'��\gY��,�no���a����5k�+�*����������=���c��ހ�D�r#�NF~�z�ͣ[�������Ig�P�X���~>tK̆��
�M��mʛ�6 �6YG^����P"�͘�#\ȳN\��Ŷ��@s}���=UM�ʄt������m*!�6�*���*|S�,3)x�)�$cC�'�P���M;=L���[��/��
+�G;�s
�ž��>r�Gʂx���k*i;2J޶�Qn����K�F͊��5	�!����b7=~���5�[W��n,R�qe==�����Q~]p'��W]Vp��?U)HYj��d
UNYC�S^�u�X�]=
����NU%ci��<Ӂ_b�o�
 ��By{u���1W�֔>Q�
%����䳾
��M�i�ƺ�
˿W(��/[�V�,2�"eoNPR�:!�,c�Կ���v�,��"tI��W1���_�+Ç[Z2�Z�3��H�6F��>A{T��V�L��-Y
��lK0�V5��a���5�V]}����w�X�~x@��\l�"$-O`"$�/%m���Z"#�,���v��!����2P����f�h`
�L61�ǚyU�|w���i���7��j�A��ڄUK�l�)9
#�h
��fv������_U4;�U��.UvC���&j@����H_Yg;l��2F=�I_��D:t<�߳<��3l�GM���"–����#�
�XH֔47A�4ta���V' �ʸ;@;?ʈ�j�edh�G���Z
+Dm�he��pa��b�6v\�� ,R!���>T�ao��=\i68�)�
9)Ǧ�W�l�,�L�l�GO5�ċ[?d}u���f�=;F���G�
`�����
�$� 滠�F`A�6j&\�6��t]�M]]i�W�m�9���Ԗ��+�~aW�B:Ul��.�,BEn�#í2 W��L���5���
+��;]��3�2�?]��֘�L�����4
XCE�L�3 �Pt8]�s���Ny=��b����K����m9�ĩ�oڙ��:d<�I�A�Mq&qݡЭ�T� >j���O�ژhb���hlc��6�+^�#�YE�
+��O�{{�U�
N�����=%
�P��v����U�9��w�*�.��iUp�uu�EZ�ۑ��$�ҕ1l��&�4EL���[��rc/+y�S�g��L�jl:
+��4��X`��#7���2D��
_hSq��蜮n��zV���k���UE{����>;H����-���2F��@E�O�.�527X��:�V%1צab
�� ���q�zD�bѡ�
+w(�E&=OR
��*�~>���,�;�
S��2r֜�Z�,fCv�޺��C�a��瞩lݛo�{�;,
+J!��
#����ڪ�`����'�-v����h`���u���В�ti �@E,K��-%����{�iO憱0��F=Fa�G���[E��ׇ��61)ӣd�v�L��
���30�#��6�s_/�'��ץ<��Bo.wf}��	j
�
���$hKF�z��{z�Щ�!�G�&����Q�w$���A�u��k�1/�,����&��<�[�!8S�:ַd����m�e��
���8l:n���8�
��4�ȩ¦ۥ����Ok�%o��ݚ�>����!o����*Z�]BH6��g�J_oK�i�Β�ڦR��|�e�P��
J|�M���US�]JR�
w{���tӘ7�g�L����%��m�0��RB��)�o���h���=���Pi;"\�i��y����v��	�
�
�s�o!�=��v���ӡlh��Y�����k��6��6'�i�jD����#�$9D�7p�ޞV{:L�e�(`�=�C�)�諛�U<���uG���ԕ�]uu�[YIsʩ�����M8d����j\/�lKe;J�MF-ui�9�3�VЃ�/�aJ�[���ґac�_V�@>&�k��)8��@F
��+�}�ەB��\�xo�~�2]�n�׵�h�k�d�b���nU0�]:6no����[�֭��<Ә��9d��4>�*�&�I{�l�MN�py����������3O'8���.�GC#�[D��U
Ι��M%9�1ϫu/׎�\v�g�-<�gr\Ӥ����W.��c6���nC��`���-�X�-
���և�^��g?sk)��R�b,hg
���Ӑ�E6{oUؽ�(h�h�E��$߅ad�k��k}��g���
���o�f�!�ǭ�f~�
(
tkH%1�h�1���*��bG���d��S��轙�V�"u��c��a��5�6	>mG�NX!f�Q;JB��
��`�Vd�	���>�Id�9�*ť�*�Yv*vs���Lk�-QQ�����mGɨ�5V��f꺷�
�E�Kٙ��f�,��5R�oA"�^��dL�|'={������m>4�)�>��	D�V?��RO�+?�����i��l
Ƅm�Б�6J�;&G �2��Yf�g��n-
�X��ֹ V���
+|�SE.XCD������6{�kmR.�>I���x�CE
�����P4cC�1�77z �?�<�K���E@�XD�L��
v���Mi
U I��T�oq�2.Ҫ�&[���
mU��
+�mK���"r�l�E̥���
x�oK���IB�e

�ҝ�|k4�M�MӶ��xT�-^
�R��V�Ъ �&�6:�۟v
�LR��
�vڞ��ݟ�����b��y�\��4�l���]BG
��
X�L��$�Ȧ�v�B�E�D�Yh�н<�#C�y�x{v[����ѐJ���������ĵ��Ӎ�~�QL��4����'���H%��|f>m��&����Mbp�Y�L�[nP zJlW��7��ޙ�J�
���y"�`��7I�k�Ĵ���F��� ΅��b_�!�
�U#�=Zd��=HI�)bd��y�
a�-h�E�N�V���*t�g�T�7[� �]�Y�%95\ʡ�E>4������Δ���7����G�ZR�S��o
��mRo�2�cD��&�ߗ�������qx��$t[����8��X��WV;��<
U]�%~��"�:˯�iX��~T�CA���D��F�iy�]
���g�=FA��r���Un�SK.q��%{�-�c}ߦ�ٖ���Y����L��w�J��^���p��R�z�v���_��ϮɊ����g��i>s���ڊ^�FQ��'܌O��#�y%駆�=�b <�'Y%E_�#iO�6P�^��k(�_K�]j���L�]�Ir���.:ks�5�+��e�F��.)�:���C�&��c�(S�Ό{�1p�MB�Z��e;&h%[���d�J?6lg���b�:�t�EB�����t���k��l�+RM����	T�y�
IJ@��0�A�������PK*>� �݊Ҁm8ps
�}s�-���AV�����ui���o�.	:q�P
��܇�;0V��
Uu-!צ���a�@C
 ���uZ�`���B�ȅ��{3���骺
@;ټ=UD��$4̡�>���>�
�L�s�k;���
+�.%
icR���_
Rj�y
?�����Q�����6�ÀNC�-p]�� $`����m���
��
��4FH�ϒ���ea�������q[�zT��H����
+��Q\��(:ĭb��U
��V���~"�]mʭQ\إ�|�5�qv�c�0�]I(9�c1�Z���L���ܘ�9t�-{��=�S�����'K�y��r��͐������wcu�
1-��joy쁑�t�!a�Qp��	
�fW�I�3L��H�{���
��?�4�{4O�9����
�
�k`�٬�s,�[C(��_7tA2.6J~�{��]|���-<���-�{��ݥcQ�؝i;4UB��	�U�*�4�ҝp�����6�XhF��T	y
)�dWDHu�ab�ۋ|m@,�'��+���m����W�� �Z�(��o+�~�y~�] �����㮉�y��ػ�e�-W��r�@�;�
Y,�0A�q�{?��	���������b�J���d�5Teޙ��0
+/[J>X'���VHHn�ߟ���gV�dG�B;�
讒\�3		[�In�(
p�������T���rt®
+
���E;����O+�ş\r&Ωm��V� ݂N8P�2�rb�]�Is(q)�bt��(*Dט�pu�i-�[�*��S��c�[�eo����%
�ɥ{Z�W_�
<�O�+x�lO""
~�x�)|����	�,��6��yV@��YD��T�#�f8��R�)�:���:�)��y�	u�<����=#��H�f.a��I͈��E&�*�vLr�)�V	�l�2�
+rOM�oK��&1*mGN.80j�뭙� h�9�fx
�R�
f��
-�`� Z&`AV:�1E���Dۤ��]��lrB�i
��uiY��1b
.����nt��ź��YA�SM�Z��D����Q�ߚ���lN`6��[�|0vCc�;CU�3S��Js��,�:E�Z�|��p�G����%�m�8����0�,��r8�)�k�N�Q�rf�J>z�G�f*kvm�(l��"h�	eN5$j��荱-�K�d��|���E�7�H6
r�Hg�\$c\�5���Q��4�O�ħ�[X�VIk�KY[��r�{
+r�]A)ڞ���'(�ZH� *�6�O��
+�ڊ_�z����^���W��sƪ�7��]K��������$b�mO� 
 ���	+�D�LqU���
X�!��v Vwd^\ 4�(<B!H��m*��n,}���p�ԉN4������*V�%#�� ��;�	T�i�����y���qV��[N	k�P��c�h�DY�Bw�CcK���dy��P��0�S�)�
�=�x�m��i �o�#�F���J[��]1��2�/�"�y�c>Ұ�j
�&!fm� �7�߀X�^�+{+���ç��9�
��<��:|����Fg�K�p��f�˕�d�}-�bWI��L b�@�ۥĂ�qX�{[��HF{ �k�p}G��� "�3��
��$!e/ ���ё�h�z_i�����P���!��: Ͳ���q�< �����M�檒�9��!������F.�g�*�2*t���y�"d�;�o�+��M��+U�}8#l��֥���=���������"x�M
��V��l �n����l��������V8嘔�AH�J?"d�
�ANy�>Bź [...]
+N5
r`����v���c��q��@`��ԯ�hy���o3����#����w�c� O���+>Y&�I{F
+�cD���d��[s�[�W�k�w��i����o+x�5�L�k��^�f�+�w�x���3������n��<�s�i�Å��RU�{���Q �&P��е~X�MNʛ�6�
�I���֡d#\rr�G�D�*	�61"r�+煆sm����bs�[s$`�
�a�ȇ�<?S�'�
��S������Ad܃CcM�]��ZeL�্X�j�獡�{.kG�g�������9|�1�B�bk��ن�3u��M�̜�NJ���w��x�~l���m�����1羬2��=�|+$��|�eL�]�|���4	qH�E	�br�Rg��|]�ߞ����4[��z��E�S0c�/6f?��Cb��?P�
+�Ɛ��ƂG���@�.~{�9D�Y�E|]�2{�׵�>kE�\?cu���qD�Ϲ+"���r�.���>~�
)8�Q���$_l��91';�p���;�.
�L��v'<7���,vf?���7F1��=��5
�C[���j���o�y����q5?�m��[�xԎ	{��a
׆�za�=7����tID�~�����&�.ǰ�1Z�z/6r{��g��Q�)\�K��e C�iH��K;��~�������	E�zb�G�O� >�:T�i�.��f{��=2�*b�-��B���a�IL�e
�9�	_�}�Ue>[l+�n��!^<�kY�}#��V3�:
ݦdœ**��ȯr鄂
1�|GS�`UV�w���1.q����R{��]
q��[C��4ˆ�3�	��f(؟
¶]5*�*�p(��	��t ��*�D��~ ��l{�����#�tt8���
2T�e
+��_�ѭc1��Zu�Ya�{���=W��2 \��!͓�(@7�oK��2\�C�cYo���y{����C�Nbc�#������g]�Y�7�)��M�D���q���Ŗ��[������S����ڌ;�rj�XY�-�'Y ~�r��=�J����9gq���+y�=A�9�eS7�p�k=Џ+
%��j���w�]
D���P^�ؕ��������{��ۆ��G:a�m}U��R[�
����
b"�`@�؀��L�s���Ŏ�G��裏��w\bl�K�gm�(�
9��P�&
�ȥ�푲O�M	���N�w��/tT�7�?�f�{���Iz�R;��0&�Oz�?��o"B�MS.R҄m�F�[j)
�g��p
�X��J_���2�8Ӕ�h��y����'�g�n���� ћc%���`��u�XQ��L�I}�Ѳ9��{������>�7� 2�HMǸd4�()񮂕��>�Cͷ¾L�S���/J(Y����;�
ٯ6�`	k�䬴/w�>���#��􂪵��gA�ř��+����YyW�f�0��7B�^��M~�G�/�
.~�P�zCE�:+'���ژ��PF�6�Cb���?�/
+x
+��KK��v���c.7���C�
+��ё.C���0%kK�I�kVP�s����H��M�}�/���D�� r���5�ȷ�ȩ�
+Z�jG�;=?�sq��� ���)Z�ͭ�Ҥ7�-�̨����t�!�ׇF6�� �g����r~�%�׭�œZ�"��O���*:ģg�5����� ZbO�LqHv
��`�j`w�[��!���|��f1*ɩ��
�1�6
j�Q
�A��0���s���<
+�:N�1��ۋ}����#��2BW�xk�:���y{��	h��4��%a�W���{�=j&��H��Z #-R���܍Ѣ��QdĮ��Z����}ι����(8h��½)JԹ)|ԙ�	B�+������>B/���,4>_m/zm
��j��+x��ۊ�
�+���𙖜g��smE�K�%w ����fnM`c���i�T��3/lq���3my��2�/6���u���9���W?��„���ҭax�j�W�8�n֗?z�������n�K|��JanЁ�RbhH�i,{{�s4�|���/��}�ux���kL�;г(G��*���jR��������_�ƣ�#�Z4�XD����R��n1�9�N��.
Xn�{e��}�������Z�|��Rr,�<�c
�A�mt!��9~
E_~���J�
��R��E\��I{��S�s���׳6
,o��:Œ}��\v!wg
i
@��*��蘮�WA��8!�;���!t���.9>c�����`�'�2ɭ�'��Agzf M3��X@���P?���̃9o�z�^o�=00�5�l���;d,�]B+� G��~:�Uzz�va�5����X��<Wp4�`��
�������]jt�j����#�DO7d��P����e\������>�1�0�Yj�����&���R|�[S|�[R
:���]
�hm��]�+�,�
�\�_��Jom�=
aW�
= ^�5,�(5���
�s�cc�
�C�(���B�z�YzK���r�0:t�
��>�MpJ�q����� 
+'�NR27'i�N5
eS�2\zx�C[�����1
54��H� z�$�O������-��6= p�2	�U��R��jy��=�hz��?:���l�Lc��AL�c��sZa�5=��$9��FWI�O��: ��9�Nؖ2�V	�+#d��*B��y���n
 �~�T5
�|��b��/�c���b:U��7
����N�0.����Rw�ۭ1|��9Y�����S��h�ו�<�
L�R܍�
p�BG�%?冘��p��|����O@���{:z���!���9��"�����@��͡��@�O���g�w�tԶ��TQ�
���Ix�R{�3)=��Vwy�9�w�QU
w���o���@��RR�y��Z����yN��))%��,��C��+���V�aWA-?�31�.q�f�$���m�c�wU�\��M�
E�:$��C�Kzk�ZEe��s�����E<9�OzvbV���oe
CE�d�
��Rt�ec]jl�]M��k�<���b����r)(k=�~6Iy䁞� �U |��6E�]�|�N����T�P�} {6]_�n�#�}��c�<|g�,r�3t�)����.�ޗ�j�


���;��#������9�v9�\ې�p[JG�f�t��-0����W�å�]2\��ۢ�~��.%4�p�U��R+:��ag-j�B
��T�3�n�K�y����2b�����<A,��
+X�Qt�rKڝ����恂��
��,�����\<��p�g�$2��L��R|�rX���v=M�� �s�h�
�F���X��y�9q���[E�
��t
�# ov�Ĭ�1T�f/��J&�؆�*�g<��*
�#$�SΏ`����=\lB��
 g�
v�Bo���aD���v
�j���'�^,�G^�Ն^��;�b��

�߱�K=�� oz ,s+��}
&�2V�vc���u
��4�
����L���SK6$\����y?*쏦¯'�
�NP|���q�6���Z���Z76�!�y��T�xy�\K�)֏�Ô��p�W+[��+v娤���7����*l��<����bz��U�N4
dWC���ZoŇ�^ȏ�IL�M�O[�Fij��M�b.�@b��I�������K�-�zq�w{��.�<&n�
��c�=�뿫L��4�`[Td�}k� @G�x{�[$�" �w&	�n5�fG�-v<�k�4IK�^���l[E�MsY�b_�WF���[�"��
+]�+�<�^�t�-��|g�]���ӯYۭ�7E�,��>�����į�hI�����*V��ن�G���
	���
+��Rr)��PW�s��
+^��*{ZL�]͌�h�����٤��
+�_�3�c�k�~��t��4,�4����
�3�s��Be�s�i|[!�E��aۡ�I�i``�T�"��"|�/���xa�_K��VXk��
ce��<����g9 on
�!î
R_����h��D��\bW�����S�v�3��F[�C�8"�{
G�T�d}���#a�7���[���1D�I
�*Qq�i:|W_��14Mx����su�Gs��_�\
��s���ZR�O�(�E6u%sc��'���^�7�<��So.��2
�b�:+�ζ7���k����!V��!vЃ+�o���<zb�
���Ij^�R�v%�5����Q� 
@v��<�
m�@'{{�:5l�C�B��@~ko����,��ʹ>Y�E�����VJ�|#b��ZFι1AL��f>W6���E���
>ZFə��%�
5��,�_Z�^��'�7
f�8��'��ج�aD��6f��؛fbgY����e�
�0ו��*G�(Hy�	f�G�6��m���2P�ܟ�h�!�f/����
H�� :�vq����Mtk�D��� ��"�%����SUf��g�ۃ��7In��c=���X���<�wLc��վR��{��0݌�n3w��V�+<b&�5A/�
b���������9�ҏN��SnY�P� 
"��X��E���]}%gc��cW�Xۓ���\d��cWz��7{!��オ�L}�	z£�x�� 6w���+e��7�C��S��}9�xWB���E/t��_lK�w0M%�Ms9k�e�}�O�Ҟ�6�=�.�{��md2�������/��Ff*k�Դ
+�0��|]�}5/�g�?��?+�ƙ
H�XPl��v��Nؤ���^�7���_�G�쪩0�,����{דK��Б�aL�y���䭳Ԑ�ДrO��<ېr�
��!��溠RA⭵~H�S��9���
����iX����L�{�J�AX�s�~����
��7CEش��4.ۢ%di��?�	I����Y[�)5�zC����'�İK[��/-�Ĥ�>b\31�a7)���,�)�`w�
����7��ݖ���5ńZ�ռ�>R��>�4��p*����'��@,�{��=4
+��)n���g���7
+�=&ޡĤ[&�̓%!V)�.f�����$��ݨ�����[���g[���ꋃ.
᢮�3���(�U����++��l���1���-�쐕ZD�wu�d��
1Kh����^�4�©'仴�T��c��q;J*j��fn�1q�C�룸Bc"�:�.�NzǃNpLb��nD�X���W���j/<b}��U�o�@Ǭ��C�r_��}�#c�|����?�u9� �s-W�
z�Ej	�&om�	X�im���z��@�>�ճ�{F.�*æεe<��⯈iI۠_��R^��af�6D��@�ٵ40~����y�`����i&	�\!,{�҇M���[Cݣa��a޺�*jĹ����֢�����ߟ\�r�Y$"�҂�՞������׿�2}O�r?�w�S��$l��a�����5����J����)_N
Z����< ƃܟᰝ:ѥc���lʡ�E�w����*	y8��.��}Y��� ��pjk���J�K/��LW
+�*�6��4iW�I��aq�ኯ�x ����k
+
��zk���xI�W��}ͽ�ݨ�I~��.��ߗ�ʃ�

��9bŞ�	`u�]��t>�p�K������:4��GF.c�{�b��}f�D߁

��?�k�M�s^�Cc.��Y�����󵀖
.��`�
@.5�b�����I��*�S�'Z���,��-����dض��<��W5��ڜ�����n-��!/�n�Y� q�x1z6ѣ�3��|�K����#���[�� ���у�\���W�?�|t<��*��?�P�j���w�
{G�K}>�K��N�{`l�%��ge �>
	^.��P@�.��lp�����-v=�{M�t���
-
+:��k�3�z�+�JR>�����Iw{�1�����ۻ]A�pK�y[}Ƞ���{3M�wVz�͓ԢQN�YU��S	h]
�`|�]�˰���r|���샸����
�{o�_gU3�b|�
>\`q ~�Z���I\�B�S� �%�h[�I^���?-w��U$��+�6D��N��>J����伭IR�EF)t����ۜ��m+�}
4piXC]���*��FPa���/+meW�1[S�rQ5<��pk�����T������MQ>
}��T���Ɯ�)x��+�ʥqT�����EL����
Α1�Fp�U��f����a��?�
+C~-r*W��q3=؈m%��s�I��\u�������N5,j����u��e�K�r
�`�~�p�n��(���ab�
+�8��|[l�x�ґ�����\�Є��BW[P�4���S���-���Y�g�i�N4�8�9�I�
#�[��D����P�J
<��\u�{V��ұ0�3l��$.٭b`�A�9�"[5\†�]j�W��3c'Y�
+~�
F��v��*����MY�W曳
� �;���A��:�O��(���&EFYŰp�Dy��:��\�puk����9*٢"��H�;���v$fO�/��
��Y���'�4�#��x��Cţ�j�k�2
~�ЃN��
+����<iG&���_��GǬ��*��;��;���'��wmS���).j��
߁O�"�.ܑ�6�bo�P�1`�]z$����Vn�1���Y^�>������ƚ���aX���7��������=��Fx�M;�m��m�A���W�̰K3�iϗz�z	1W&y�=��L���:
+_�u�����PS���tOW���J�3,�E΄lKj�.M��h�_��Rˁ�����z{l�
L���n������!��n�1�+�����
�� ��\�?ǩޔbr��1=O�Yv�u,�]��X�B
�;{3�:�tu㎦Z�)��9TB�^Xwd���+�ХQJ��0+si���9NH1��~!�������
����+Q)["p�R_�Gcs�í)\ꪈ�\
�� ��t8SY�#å�Ȑ�&iy��di�b_����k����33��q?v�\�?��b����Len
�?ǯsOW���+�n�RpPn@����*���ؖ3;R10/Нq\�c��b�"�m�!"
�)���Y��H�
eQ��11��ŒGc�{��+ĸ�s
y�Mc�XMC���vt�C�'��t讎Mٛ��s�5f�`���~h��:FV�|�1�/ޝ�i�>c�
������V��񸘕v����
1��険� ��l��bmt�i�<x�#��F�������rsޛ�QB��*��N��`���+�s�u�3�Y$T
0�yo�
+T�_ N��X3�y.w��}4�W
+����Q
 3MS�xCc��aJ�y����W|�_�
|vV����LU������xD���.Xȕ�6l��(�b����3鶼*��|����q������X���)t�]�@��ٴ�Y.����b`5�ئĦ�U��B��ޮ�ї�`1�C�Ҋ*A�
+o��?P�@�7X9��è�˭%_/��>ZN�ͭ���
-%m�����p�<�(�k�
a�y�����as�����X�(BEwQ�
6@��
-�
z��<@,{�y�v�5�@�l2\*���⪼7��+
]�A��)��f[DH7�YA/��Eo
�]@�/��J���)u%˩�1�zzw�_m�ܦf!vT,�M�2�1�!��2�uSB͗W���'��EE�Yl�{,�%>�5��
!�z��S��=�7
��Y:�3G����"�G�I{3¦�ia�IB�x�cZ5L�IF�ݔ�˶��2
+k �nZQ�WGHY��f�k�M�o���6�QX��2���_\���MU�j��}�x5�.X�SƄ[Fq��~��ծ"ߥ��
+N�%/�n���w߫ A^�
�(*j}h�/~��V��S�js0��6���ri
��F�i�����Q��}�,��vj��A���c���#��� �S�B�y
��
+� f�<
#����9&5�
1�����Ҩ�QT�B{����������g��7�Iaw�:����?�TD\�o��ۆk	.1wO
Ot��Q�E��ㅟ�*|遞��J�{*R�3���\�/#����@�2|W��_���c�ׇ��OW��aK��ƺ�*~�b�źR�
������"v�svV�Ŗܷ�-%aK=�'a⶧(y2�"�į��-ҥT;�����~k3��~ig*3��t:�Nݕ���R����%���+$@�!B<� �\ܩ����>�x��/�o	GH������:ע"�\�����Â�02dh��� �8E'����,
� ����?�p
�ǡy�vh��wGH+:t�� <2�$e�\�
+<?t⊗U�h9&�� 9���!j����V=������� �O�_Ʊ�_$�!��+.L�����������H�f�W�l趝M�2!+74��U(sӄ,�0
+n��ҟ�
6.h1�S���"va�2
�刣~l9�6\������S�n�)j��
�6q�j�A���m�+��
+c��$��a��g�S+�ʛ��s�5�,�U��1�S����^L���'W~ҷ�$�dQǹ���܊�����&~�M������m��^��B?lz��)A��
G�u�I. ����!bƒ�^���C�L���I��K����hv��(�qo���:�6�/�J�Pٯ�u
+��j�Q���5/ix4)��9&?�V\���� >�yH�H���٘��gzk.*j�m>~qӛw�<�[Mkʸqj��>wף���Y��ʯS
�g?�|�

J��_��U
{a��)g�N��B'���ԩn�[_[�S
����Q�pe�X��h|�m)�Ԁ?��k_��W�Y� �F�	����m����
�B'�T�?~��@;vr��0������ lX��+���'�t׊���8󿳂��> �;�勊��U]s֢
�%F�_�P���c�f��x���͔Կ �8'���c�zsR\.���*zu=l��6f�z�a`I!-4~Z����|�f�x
�W�޲P���M� 6.����_�8�?��������e�[���Y��Q>��DK
�R�.l��1�]���N�2/�~�Rb
+Ԝ����g!=2OM�{�&���S꾝	4~ɬ��G%~
�_�$�W?����vߏ����0kGu�4ڏ9�pF��Q`�w
|��#���2.��s�.�@�6B龓Tc�Uܝ��?l���T�T���Ϊ{s��g!8z�N��pP�ۣ\���T���0�Ǹ�u;�#n��
xN��̤⣾G�~��� ����LJ��jЩ�?���qMP
~��1�TQl@��o���!�xm��t3��^b��Q?^;�rӎ/
+(�<
����	c\AȅC�\���	6s�E�
Ԇ���5{S����ɶ��R��L�E�]�J����ir�	�]��9��Y��j:���5�zY�O
t�
�	��z�ɿ�6ŝ�#��oh(���l%��Es܎��mF��
�4�2���
_?.^I(y�>D%
LI
�~{��')�=/����VlB�F��k�I�:׉�=�P�g%�����N�c'��|�WreM�H�S�3�u��w���8hࣾ�6XҌ���5�����g���IP�S�kb
��
&%?��b��`T(����S
�}�h͹���
+�uҚ�����Z�����������P���l��9�A���n�3{k�.d��Al��-
�i�X�.x�T*z��2­��VsVX�����:�Z��+*��m����kvm��/nB���;���]�F��O�LG�0D=�ft��`�뽣�]>T�?���ԣ���6�S�ر�VJ�Q��LW�m�(��� �Ʈ
[i��ؐ����o�t�3�~6'=l��Q~�
�6l;X�Y
(��M�{�J�g��q:zw�A�g��3���� 
+�_+h��.�
ճ���
�����!���T�|���U�>���F��3��^�nd��:�����
���r�q�6����U
�h���-���;N6���&|����3����¾ ���,�n˻1���^I*�/�$��^�ᄸ�����?�%��v*dQ�(
�?�2
.�ȥ@
K�4!�7���
���/�T�a��ݝdRC.*l������)��|��pZس�a��Gy�m?�h�)��$26�H q<��]͜޲�SWt

ʚ�
T���x��
~��o
s�+ZZ�b&��.��C%�v�R_WV�Y�$:j���ˮlY�Eӊ��@o����G����KMo���� ��c����Ӱ[>:���a�;�b�Uv��l��]
�泝�������a��:���
+v�D+�
����[p�%(�og^q
+����æn��.(hB&�
��
��Mģ��9%6GîzB*�𗷽2�˔X�f%V�) �5��}'���(��Ѝ*�0�K}�
/���/�6)�K��cd���lI��ć'��xK2�^vQO��yT��m)�=��=�����^h�/Z|�@
+�=������Sy�gԧ��mh�W�NA��A��_���K��
����`����	��De� ���
ѹ�7D�����$�l�K��}N.��;>;���6����@{&l��hb�=��R
�r~w��f"Ս��>\D�nI�[ftֶ��m%6�ډ
6v��EYC��Q6�u�X�S��&��	{��t衏I\�SG�
Q�r�_V�>�
+Jn�8��@>]����^T�c�U�.��g£�'���w? �ܰA�׭��538v׉֖
+�ri��j!�~
	�
L��Ps���r]��g_�C���n�xҊ̾�u�)"�� "���1愃�|�A�0�ï]��
m��WG8E�ͼ���5�?<�l$@g���%}c� Z�S���}S�
��O�%^�'oY�/���Sm�o�b�%^��i�+�V��Ã�Gw{œ9<qM�J�߇�q˲�
Ҳ7�NrQ�ba�K-��B?
+����b�C�3��_��O�N�s�e
/�j^��Q�;�bϮ�Q��͉
A�]_K��uM��m[���㨊��l�����
�/�~���(�|��횉E�Jɸ���鹙Y���|VR�����9,�O����Ps̶[�B�����
;�q�ŧ
��֌��~�%3�����Zdꁛ���d�A���}�mB�m���5�R�GTи�,���M\&��ؤ}��
ґ� �=&�}1"�}�ko|2'C�_���]��;f�u5��dw� =t�K_LK�ɞ^X
�.�BgCփ�a28�[��#�z0���0��~C��e�=<:3�`BEM�g,��o~��4�Տ,�:���e�X�n�
'83��y��c���Y��5���nZhi���NcRn
W#ޝٱ²Լ�W���kS}��
+���Ux�L�����hˇ����o7-d��
J({��J{�?s
�Ѽ��^e߉-\Հc&ڊ�:Y�7�ݮ����>ٶ���fL�T�
���\�%'7��XG��-+
mT
�����
��{�I۶BS�CuoԵ/�Ξ
�?��vRtmY�HZ3�rVu�����ab6N+P񎖺��
+\���}Y\���#�����٢�
+|����P<!m�V<�w�x/���M+<QS�j����P�!;��=���:�����2�>������1���6���<��
LSq���-Kӧ�t��8�hLY3��6�X�b�_�<�^�����_���@ğ攽>�&�_��=��f\�qAO���snj��6@;K+�I���8U�¥_\V5���<w�
+�yD�O�����X�?G�5 
|�wm�T�f�Uo�pq{n>e�L*Yՠ�Bjt�4�W����
M)��
����7�u�
Z)\�����vN�aJ�_c�yw�M��5

TC��c.��/��_�
�?_�������q!3��ԆC��n�l�_�ت;$k�-�0����R�6���@��ټ9"b�䂩��6vƹaR�Y���m`� cf�eW=-M/W4�����GjT���𓒺wgm5�f�Q����%�B�ϼ�&d�q�WTȄ�aD�W�
�D�F,�Z��
��vQA�>*�p�45�p
Wy0����ֿt��
,�
+��	�VBɒ�9fA�H�
@%�9�����
^A��-
����w}ҋ�#������O=oa�ݰ�§�9Q�=L��1e�
”F\RQ2��;��
z��i?�s����tr�.89w�
�bD�����1���ܶ=7��ךG����S��'q���3
�w\�ꐙސy��6��g7��yN��	"48T�tNVxk�֔�=���iH
#���_p���}T;
�q+V4茐�i�����@��
!�Xu���Ԙ���6Oՠ�@O�;wkɃ>x�ôW?
S/�
7$mX��ᆨ=�[m�oӝv`͔_t*�'>�|�D��3/R�,D�Hga��i*��,���4�x0�)�1I�}�c !+4{�N�[����?8�yw�촿�
�O3JL��[����w^�/8/��F���4L(y8��.�|s��u�>ЫSj��_�i7�T��,(�;�+w
endstream
endobj
7 0 obj
<</Intent 24 0 R/Name(Layer 1)/Type/OCG/Usage 25 0 R>>
endobj
52 0 obj
<</Intent 68 0 R/Name(Layer 1)/Type/OCG/Usage 69 0 R>>
endobj
68 0 obj
[/View/Design]
endobj
69 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
24 0 obj
[/View/Design]
endobj
25 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 18.1)/Subtype/Artwork>>>>
endobj
97 0 obj
[96 0 R]
endobj
137 0 obj
<</CreationDate(D:20141222131647-06'00')/Creator(Adobe Illustrator CC 2014 \(Macintosh\))/ModDate(D:20141222132804-06'00')/Producer(Adobe PDF library 10.01)/Title(Print)>>
endobj
xref
0 138
0000000004 65535 f
+0000000016 00000 n
+0000000173 00000 n
+0000049677 00000 n
+0000000005 00000 f
+0000000006 00000 f
+0000000008 00000 f
+0001627780 00000 n
+0000000010 00000 f
+0000049728 00000 n
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000026 00000 f
+0001628037 00000 n
+0001628068 00000 n
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0001627850 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0001627921 00000 n
+0001627952 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000052875 00000 n
+0000445780 00000 n
+0000445589 00000 n
+0001628153 00000 n
+0000050157 00000 n
+0000454934 00000 n
+0000055718 00000 n
+0000055604 00000 n
+0000052117 00000 n
+0000051357 00000 n
+0000051553 00000 n
+0000051603 00000 n
+0000052375 00000 n
+0000052438 00000 n
+0000052812 00000 n
+0000053071 00000 n
+0000053326 00000 n
+0000055755 00000 n
+0000445662 00000 n
+0000445694 00000 n
+0000446136 00000 n
+0000446392 00000 n
+0000455009 00000 n
+0000455589 00000 n
+0000456743 00000 n
+0000463367 00000 n
+0000528956 00000 n
+0000594545 00000 n
+0000660134 00000 n
+0000725723 00000 n
+0000791312 00000 n
+0000856901 00000 n
+0000922490 00000 n
+0000988079 00000 n
+0001053668 00000 n
+0001103068 00000 n
+0001168657 00000 n
+0001234246 00000 n
+0001299835 00000 n
+0001365424 00000 n
+0001431013 00000 n
+0001496602 00000 n
+0001562191 00000 n
+0001628178 00000 n
+trailer
<</Size 138/Root 1 0 R/Info 137 0 R/ID[<E382E854B58F4B9FB2FF3D8911270784><90640200519A4C229778C04F7C76E654>]>>
startxref
1628367
%%EOF
\ No newline at end of file
diff --git a/doc/_static/logo/favicon.ico b/doc/_static/logo/favicon.ico
new file mode 100644
index 0000000..9dbcce9
Binary files /dev/null and b/doc/_static/logo/favicon.ico differ
diff --git a/doc/_static/logo/pdal_favicon.svg b/doc/_static/logo/pdal_favicon.svg
new file mode 100644
index 0000000..041d4d8
--- /dev/null
+++ b/doc/_static/logo/pdal_favicon.svg
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="744.09448819"
+   height="1052.3622047"
+   id="svg3043"
+   version="1.1"
+   inkscape:version="0.48.1 r9760"
+   sodipodi:docname="New document 3">
+  <defs
+     id="defs3045" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="0.35"
+     inkscape:cx="375"
+     inkscape:cy="520"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="772"
+     inkscape:window-height="689"
+     inkscape:window-x="1220"
+     inkscape:window-y="139"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata3048">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1">
+    <image
+       y="504.36218"
+       x="347"
+       id="image3059"
+       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADgAAAA4CAYAAACohjseAAAABHNCSVQICAgIfAhkiAAAB6JJREFU
+aIHdmntQVNcdxz/37rLA7gq7wm6F8pSMUdT4woIK1FEn1ig2hqoJ0xhBEa3GaHw0scnUjjHGdGwc
+8dXEV4h5VKcRH6NMZ0QaQSqIUYiARhFCeIgIu8hzd9ntH0l3hvAQlitr+vnvnnPuuZ/v3L17H+cn
+2Gw2GxLS2NhITk4O1wu+4ebtUu7evYvRUE9rSzPtFguCIOCuVuPuriQoKJinnwomdPgwJk2ahF6v
+l1IFYIYgRcC6ujpOnjzF8dQzfP9dKZrgseA9HFf9UNz0IcgUSkSFEmRyAKwtDVjbzbTVltFacxtb
+XQkNty+jVquImTWT38XOIyQkpN/p6G/AwsJCdu7eR/alS2hGTEU9Zi7qoAkIosyh+Vpr7mC8fhrD
+16cIDPDntZVJTJs2DUEQHFV0LGBlZSVvbX6HvLw8tJN+j1f4i8hc1Y5KdMJmbac+Pw1D1kG0Sjnb
+t/6F8ePHOzJV3wJaLBZ2793PoSMpeEUm4BW+ENHFzZED9w6bDUPRBWrS3idyUjib/7QRb2/vvszQ
++4BVVVUs+8NqHlg90D+3CYXW1zFpB7CaW6hJ30tLYRp7d33AxIkTe7vrDLE3o3Jzc5nz2xdo9JuK
+X1zygIYDEF3cGTJzHV6zN5O4YjVHPk7p9b6PPIMXLmSwZsMb+Ma+x6CQ8H7L9heToYryT5YTFzuH
+dWtWP2p4z2fwfHo6azduwi8u+YkIB6DQ+BCYcIQvTp3nnW3bHzm+24CZmZm8vmETAa98iMpvlKSS
+/UWu0hIQf4DUf2WSvGdfj2O7DFhRUcGq1WvxiX0XN70kN1zJkbmq8Y9L5sDhFM6fP9/tuE7XoNls
+JmbefNqGPosuMv6xi/aXpvJ8Kj57lTMnv8TPz++n3Z2vweQ9+zAIGrynvDIwhv1E5f8MmvA4Xt/4
+Zpf9HQKWlJTwccpRfJ7fgiD06g7yRKD7dSJl95s4kZraqa9Dine372Dw5JdxGdSnpwWnIwgiXs+u
+Z9v7O2hra+vQZw9YUFDA1esFeEcuHmg/SVAHjsPFdzSffvZ5h3Z7wOT9B/D41UsIonzA5aRCMzme
+/R8dwmw229tE+OF9LjsrE++J850mJwUqv1HIPH3JyMiwt4kAJ06koh05HdFV5Sw3yVCNfYFPPj9u
+3xYBvjx1FuXI3zhNSko0odPIu5JDU1MTAKLRaKS05DaDgsOcrCYNoqsKbeBoLl++/MN2bm4umqBn
+EGQuTlaTDnnARC5mZQMgXs8vQOY7xslK0uLuP4a8awUAiIU37+CqG+pkJWlx04dQdvcOAGJpWSlu
+uiDnGkmMi9oLi8XCtWvXBomG+jrkai9nO0mOu6cXRUVFnmJrcxMyhdLZPpIjd1VRW1urFM2mVoTH
++enPScgU7jx8+NBNlMsV2NpNzvaRHKvFhFKpNIluShXtbc3O9pEcS2sj3t7ezaJqkAftzQZn+0hO
+W5MRX1/fRjEwMJDW+6XO9pEUS7ORdlMr0dHR9eLTIcG0PShztpOktD34Dl//QORyuU0cNXIE1ns3
+nO0kKS2VhYweGQqAOGXKFAzf5mCzWZ2sJR3m0mymRk0GQNTr9Wi0WlqrbzlZSxpsVguGO3lEREQA
+P77wxj4fQ8P1004Vk4qGmxd5atgw+3q/CBAzZzbGgrT/i59pS+E5FsyLsW+LACEhIfj7/RLjje6/
+8f8cMDfUYLiVzaxZs+xt9s+G69eswnDx7yBtVcmAUpd5iLgXF6LRaOxt9oDR0dF4uokYii44Ra6/
+mIzV1OefZUnC4g7t9oCCILBty5+5n/YeVtPP79m09tw2khKXoNPpOrR3WJsICwsjenIEtf/+cEDl
++oux+CtkhlISlyR06uu0hLT57U203DjLw1tZAyLXX0zGau6d2szf/roNhULRqb9TQK1Wy55dH1CZ
++jYmQ9WASDqKrd1M5fENLE9MYMKECV2O6XIRMCwsjNdWJvH90RVYmo2PVdJRbDYr1alvMTZkCEnL
+lnY7rttVzoT4xcTOnkH50RW0P2EhbdZ2qs9sRW+rJXnnjh5r2Xpcxn1j43rmz4yk7OAiTPWVkos6
+gtXSRtWxdfhTScrhj3B1de1xfI8BBUFg44Z1rFr6MqUHF9FYelVS2b5iMlZTfmQpY/3VpBw+gEr1
+6NWwXteqZWRksP6Pm/AIW4B31FJwsGTSUYxF6dw7vYWkpfEsT1rW2xLLvlUb1tTU8Ora9ZRUPED3
+3Juog7r+55KStvoKatPeh7rb7N65g3HjxvVld8fqRU+fOcOWrdtxGTICTVTiY6mEMhmrqcs6gjH/
+HPGLF7EiKfGR11sXOF7xazKZ+OIfx9i1Zx8uWn+Uo2PwDJ2OXOnpyHQA2CwmGr69RNONsxhvZrFg
+4QJWLl/G4MGDHZ2y/zXbJpOJ9PR0Pj32T65c/g+e/qEogsJRBozFTReMwuMX0M310t5spLW2lKby
+AkxlORhLrhAQGMxL8+cxd25Mh7cCB5GmKP1/NDQ0kJuby1eZ2Xyd/w3lZXdpbWnG3cMLuZvKXsFh
+bjZiamkEqwUfv0BCRwxnamQEERER+Pj4SKUDPwacLuWMP6W4uFhZXFzsWVNTozSbzTIAHx+fRp1O
+1xIVFVX/OI8NXP0v+BTKvwlRwQYAAAAASUVORK5CYII=
+"
+       height="56"
+       width="56" />
+  </g>
+</svg>
diff --git a/doc/_static/logo/pdal_logo-horizontal.svg b/doc/_static/logo/pdal_logo-horizontal.svg
new file mode 100644
index 0000000..693bdb3
--- /dev/null
+++ b/doc/_static/logo/pdal_logo-horizontal.svg
@@ -0,0 +1,323 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="pdal_logo-horizontal.svg"
+   inkscape:version="0.48.1 r9760"
+   version="1.1"
+   id="svg2"
+   height="1052.3622047"
+   width="744.09448819"
+   inkscape:export-filename="/Users/hobu/Desktop/pdal_logo.png"
+   inkscape:export-xdpi="250"
+   inkscape:export-ydpi="250">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="220.27249"
+     inkscape:cy="962.32016"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer3"
+     showgrid="false"
+     inkscape:window-width="1719"
+     inkscape:window-height="1047"
+     inkscape:window-x="1200"
+     inkscape:window-y="119"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3113"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="164.14512,985.56039"
+       id="guide3818" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="104.60228,937.28242"
+       id="guide3820" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="160.69669,854.97996"
+       id="guide3822" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="234.72292,903.48783"
+       id="guide3824" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="PDAL text"
+     style="display:inline">
+    <text
+       inkscape:transform-center-x="19.150543"
+       sodipodi:linespacing="120%"
+       id="text3857"
+       y="190.19733"
+       x="239.82965"
+       style="font-size:73.3903656px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#434343;fill-opacity:1;stroke:none;font-family:Bauhaus 93;-inkscape-font-specification:Bauhaus 93 Bold"
+       xml:space="preserve"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90"
+       transform="scale(1.0324093,0.96860809)"><tspan
+         y="190.19733"
+         x="239.82965"
+         id="tspan3859"
+         sodipodi:role="line">pdal</tspan></text>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Color Dots"
+     style="display:inline" />
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Gray Dots"
+     style="display:inline">
+    <g
+       id="g3107">
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1.0387412,0,0,1.0387412,393.22524,-63.905737)"
+         d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+         sodipodi:ry="15.528928"
+         sodipodi:rx="15.528928"
+         sodipodi:cy="141.33174"
+         sodipodi:cx="181.81787"
+         id="path3003"
+         style="display:inline;fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:0.96270370000000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1.169753,0,0,1.169753,342.92204,-33.895972)"
+         d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+         sodipodi:ry="15.528928"
+         sodipodi:rx="15.528928"
+         sodipodi:cy="141.33174"
+         sodipodi:cx="181.81787"
+         id="path3073"
+         style="display:inline;fill:#55a9f6;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.85488134999999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1,0,0,1,384.26161,-62.333932)"
+         d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+         sodipodi:ry="4.2057514"
+         sodipodi:rx="4.2057514"
+         sodipodi:cy="148.77269"
+         sodipodi:cx="154.31873"
+         id="path3075"
+         style="display:inline;fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1.0783049,0,0,1.0783049,327.70526,-161.79578)"
+         sodipodi:type="arc"
+         style="display:inline;fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.92738151999999996;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path3079"
+         sodipodi:cx="197.02327"
+         sodipodi:cy="243.88737"
+         sodipodi:rx="8.0879831"
+         sodipodi:ry="8.0879831"
+         d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1.1037735,0,0,1.1037735,480.8321,-26.231392)"
+         d="m 269.16809,188.88908 a 11.970215,11.970215 0 1 1 -23.94043,0 11.970215,11.970215 0 1 1 23.94043,0 z"
+         sodipodi:ry="11.970215"
+         sodipodi:rx="11.970215"
+         sodipodi:cy="188.88908"
+         sodipodi:cx="257.19788"
+         id="path3081"
+         style="display:inline;fill:#2c7fb8;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.90598297000000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1.0891203,0,0,1.0891203,430.57541,-102.27246)"
+         d="m 243.28654,212.18248 a 24.910988,24.910988 0 1 1 -49.82198,0 24.910988,24.910988 0 1 1 49.82198,0 z"
+         sodipodi:ry="24.910988"
+         sodipodi:rx="24.910988"
+         sodipodi:cy="212.18248"
+         sodipodi:cx="218.37555"
+         id="path3083"
+         style="display:inline;fill:#55a9f6;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.91817223999999997;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         sodipodi:type="arc"
+         style="display:inline;fill:#2c7fb8;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.90598297000000005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+         id="path3111"
+         sodipodi:cx="257.19788"
+         sodipodi:cy="188.88908"
+         sodipodi:rx="11.970215"
+         sodipodi:ry="11.970215"
+         d="m 269.16809,188.88908 a 11.970215,11.970215 0 1 1 -23.94043,0 11.970215,11.970215 0 1 1 23.94043,0 z"
+         transform="matrix(-1.1037735,0,0,1.1037735,405.30333,-25.168442)" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path3838"
+         sodipodi:cx="154.31873"
+         sodipodi:cy="148.77269"
+         sodipodi:rx="4.2057514"
+         sodipodi:ry="4.2057514"
+         d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+         transform="matrix(-1,0,0,1,277.86199,9.564221)"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1,0,0,1,312.59339,-4.689847)"
+         d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+         sodipodi:ry="4.2057514"
+         sodipodi:rx="4.2057514"
+         sodipodi:cy="148.77269"
+         sodipodi:cx="154.31873"
+         id="path3840"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         sodipodi:type="arc" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-0.94090967,0,0,0.94090967,342.27869,-120.03231)"
+         sodipodi:type="arc"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.85024101;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path3844"
+         sodipodi:cx="197.02327"
+         sodipodi:cy="243.88737"
+         sodipodi:rx="8.0879831"
+         sodipodi:ry="8.0879831"
+         d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z" />
+      <path
+         d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z"
+         sodipodi:ry="8.0879831"
+         sodipodi:rx="8.0879831"
+         sodipodi:cy="243.88737"
+         sodipodi:cx="197.02327"
+         id="path3846"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.74190521;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         sodipodi:type="arc"
+         transform="matrix(-1.0783049,0,0,1.0783049,433.52077,-103.18489)"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.75432527;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path3850"
+         sodipodi:cx="181.81787"
+         sodipodi:cy="141.33174"
+         sodipodi:rx="15.528928"
+         sodipodi:ry="15.528928"
+         d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+         transform="matrix(-1.0605504,0,0,1.0605504,350.60249,22.364694)"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-1,0,0,1,327.34063,-65.939185)"
+         d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+         sodipodi:ry="4.2057514"
+         sodipodi:rx="4.2057514"
+         sodipodi:cy="148.77269"
+         sodipodi:cx="154.31873"
+         id="path3828"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         sodipodi:type="arc" />
+      <path
+         d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z"
+         sodipodi:ry="8.0879831"
+         sodipodi:rx="8.0879831"
+         sodipodi:cy="243.88737"
+         sodipodi:cx="197.02327"
+         id="path3830"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.62366605;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         sodipodi:type="arc"
+         transform="matrix(-1.2827378,0,0,1.2827378,395.72688,-226.15381)"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+      <path
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         transform="matrix(-0.76189307,0,0,0.76189307,266.73335,-110.25136)"
+         sodipodi:type="arc"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:1.05001616;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path3961"
+         sodipodi:cx="197.02327"
+         sodipodi:cy="243.88737"
+         sodipodi:rx="8.0879831"
+         sodipodi:ry="8.0879831"
+         d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z" />
+      <path
+         sodipodi:type="arc"
+         style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+         id="path3963"
+         sodipodi:cx="154.31873"
+         sodipodi:cy="148.77269"
+         sodipodi:rx="4.2057514"
+         sodipodi:ry="4.2057514"
+         d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+         transform="matrix(-1,0,0,1,379.84063,37.810815)"
+         inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+    </g>
+  </g>
+</svg>
diff --git a/doc/_static/logo/pdal_logo.svg b/doc/_static/logo/pdal_logo.svg
new file mode 100644
index 0000000..2f226e8
--- /dev/null
+++ b/doc/_static/logo/pdal_logo.svg
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   sodipodi:docname="pdal_logo.svg"
+   inkscape:version="0.48.1 r9760"
+   version="1.1"
+   id="svg2"
+   height="1052.3622047"
+   width="744.09448819"
+   inkscape:export-filename="/Users/hobu/Desktop/pdal_logo.png"
+   inkscape:export-xdpi="250"
+   inkscape:export-ydpi="250">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="103.02249"
+     inkscape:cy="902.32016"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer4"
+     showgrid="false"
+     inkscape:window-width="1719"
+     inkscape:window-height="1047"
+     inkscape:window-x="1200"
+     inkscape:window-y="119"
+     inkscape:window-maximized="0"
+     showguides="false"
+     inkscape:guide-bbox="true">
+    <inkscape:grid
+       type="xygrid"
+       id="grid3113"
+       empspacing="5"
+       visible="true"
+       enabled="true"
+       snapvisiblegridlinesonly="true" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="164.14512,985.56039"
+       id="guide3818" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="104.60228,937.28242"
+       id="guide3820" />
+    <sodipodi:guide
+       orientation="0,1"
+       position="160.69669,854.97996"
+       id="guide3822" />
+    <sodipodi:guide
+       orientation="1,0"
+       position="234.72292,903.48783"
+       id="guide3824" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title />
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="PDAL text"
+     style="display:inline">
+    <text
+       inkscape:transform-center-x="15.014187"
+       sodipodi:linespacing="120%"
+       id="text3857"
+       y="244.32472"
+       x="103.92929"
+       style="font-size:57.53865814px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:120.00000477%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#434343;fill-opacity:1;stroke:none;font-family:Bauhaus 93;-inkscape-font-specification:Bauhaus 93 Bold"
+       xml:space="preserve"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90"
+       transform="scale(1.0324093,0.96860809)"><tspan
+         y="244.32472"
+         x="103.92929"
+         id="tspan3859"
+         sodipodi:role="line">pdal</tspan></text>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer2"
+     inkscape:label="Color Dots"
+     style="display:inline">
+    <path
+       sodipodi:type="arc"
+       style="fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#323232;stroke-width:0.9627037;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3003"
+       sodipodi:cx="181.81787"
+       sodipodi:cy="141.33174"
+       sodipodi:rx="15.528928"
+       sodipodi:ry="15.528928"
+       d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+       transform="matrix(-1.0387412,0,0,1.0387412,393.22524,-63.905737)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#55a9f6;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.85488135;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3073"
+       sodipodi:cx="181.81787"
+       sodipodi:cy="141.33174"
+       sodipodi:rx="15.528928"
+       sodipodi:ry="15.528928"
+       d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+       transform="matrix(-1.169753,0,0,1.169753,342.92204,-33.895972)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3075"
+       sodipodi:cx="154.31873"
+       sodipodi:cy="148.77269"
+       sodipodi:rx="4.2057514"
+       sodipodi:ry="4.2057514"
+       d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+       transform="matrix(-1,0,0,1,384.26161,-62.333932)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z"
+       sodipodi:ry="8.0879831"
+       sodipodi:rx="8.0879831"
+       sodipodi:cy="243.88737"
+       sodipodi:cx="197.02327"
+       id="path3079"
+       style="fill:#b6f2fb;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.92738152;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       sodipodi:type="arc"
+       transform="matrix(-1.0783049,0,0,1.0783049,327.70526,-161.79578)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#2c7fb8;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.90598297;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3081"
+       sodipodi:cx="257.19788"
+       sodipodi:cy="188.88908"
+       sodipodi:rx="11.970215"
+       sodipodi:ry="11.970215"
+       d="m 269.16809,188.88908 a 11.970215,11.970215 0 1 1 -23.94043,0 11.970215,11.970215 0 1 1 23.94043,0 z"
+       transform="matrix(-1.1037735,0,0,1.1037735,480.8321,-26.231392)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#55a9f6;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.91817224;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       id="path3083"
+       sodipodi:cx="218.37555"
+       sodipodi:cy="212.18248"
+       sodipodi:rx="24.910988"
+       sodipodi:ry="24.910988"
+       d="m 243.28654,212.18248 a 24.910988,24.910988 0 1 1 -49.82198,0 24.910988,24.910988 0 1 1 49.82198,0 z"
+       transform="matrix(-1.0891203,0,0,1.0891203,430.57541,-102.27246)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       transform="matrix(-1.1037735,0,0,1.1037735,405.30333,-25.168442)"
+       d="m 269.16809,188.88908 a 11.970215,11.970215 0 1 1 -23.94043,0 11.970215,11.970215 0 1 1 23.94043,0 z"
+       sodipodi:ry="11.970215"
+       sodipodi:rx="11.970215"
+       sodipodi:cy="188.88908"
+       sodipodi:cx="257.19788"
+       id="path3111"
+       style="fill:#2c7fb8;fill-opacity:1;fill-rule:evenodd;stroke:#232323;stroke-width:0.90598297;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+       sodipodi:type="arc"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer3"
+     inkscape:label="Gray Dots"
+     style="display:inline">
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       transform="matrix(-1,0,0,1,277.86199,9.564221)"
+       d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+       sodipodi:ry="4.2057514"
+       sodipodi:rx="4.2057514"
+       sodipodi:cy="148.77269"
+       sodipodi:cx="154.31873"
+       id="path3838"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path3840"
+       sodipodi:cx="154.31873"
+       sodipodi:cy="148.77269"
+       sodipodi:rx="4.2057514"
+       sodipodi:ry="4.2057514"
+       d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+       transform="matrix(-1,0,0,1,312.59339,-4.689847)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z"
+       sodipodi:ry="8.0879831"
+       sodipodi:rx="8.0879831"
+       sodipodi:cy="243.88737"
+       sodipodi:cx="197.02327"
+       id="path3844"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.85024101;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       sodipodi:type="arc"
+       transform="matrix(-0.94090967,0,0,0.94090967,342.27869,-120.03231)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       transform="matrix(-1.0783049,0,0,1.0783049,433.52077,-103.18489)"
+       sodipodi:type="arc"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.74190521;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path3846"
+       sodipodi:cx="197.02327"
+       sodipodi:cy="243.88737"
+       sodipodi:rx="8.0879831"
+       sodipodi:ry="8.0879831"
+       d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z" />
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       transform="matrix(-1.0605504,0,0,1.0605504,350.60249,22.364694)"
+       d="m 197.3468,141.33174 a 15.528928,15.528928 0 1 1 -31.05786,0 15.528928,15.528928 0 1 1 31.05786,0 z"
+       sodipodi:ry="15.528928"
+       sodipodi:rx="15.528928"
+       sodipodi:cy="141.33174"
+       sodipodi:cx="181.81787"
+       id="path3850"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.75432527;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       sodipodi:type="arc" />
+    <path
+       sodipodi:type="arc"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path3828"
+       sodipodi:cx="154.31873"
+       sodipodi:cy="148.77269"
+       sodipodi:rx="4.2057514"
+       sodipodi:ry="4.2057514"
+       d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+       transform="matrix(-1,0,0,1,327.34063,-65.939185)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       transform="matrix(-1.2827378,0,0,1.2827378,395.72688,-226.15381)"
+       sodipodi:type="arc"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.62366605;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       id="path3830"
+       sodipodi:cx="197.02327"
+       sodipodi:cy="243.88737"
+       sodipodi:rx="8.0879831"
+       sodipodi:ry="8.0879831"
+       d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z" />
+    <path
+       d="m 205.11125,243.88737 a 8.0879831,8.0879831 0 1 1 -16.17596,0 8.0879831,8.0879831 0 1 1 16.17596,0 z"
+       sodipodi:ry="8.0879831"
+       sodipodi:rx="8.0879831"
+       sodipodi:cy="243.88737"
+       sodipodi:cx="197.02327"
+       id="path3961"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:1.05001616;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       sodipodi:type="arc"
+       transform="matrix(-0.76189307,0,0,0.76189307,266.73335,-110.25136)"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+    <path
+       inkscape:export-ydpi="90"
+       inkscape:export-xdpi="90"
+       inkscape:export-filename="/Users/patrick/Documents/Consulting/Hobu/pdal/pdal_v2b.png"
+       transform="matrix(-1,0,0,1,379.84063,37.810815)"
+       d="m 158.52448,148.77269 a 4.2057514,4.2057514 0 1 1 -8.41151,0 4.2057514,4.2057514 0 1 1 8.41151,0 z"
+       sodipodi:ry="4.2057514"
+       sodipodi:rx="4.2057514"
+       sodipodi:cy="148.77269"
+       sodipodi:cx="154.31873"
+       id="path3963"
+       style="fill:#d6d6d6;fill-opacity:1;fill-rule:evenodd;stroke:#5a5a5a;stroke-width:0.80000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+       sodipodi:type="arc" />
+  </g>
+</svg>
diff --git a/doc/_static/logo/pdal_logo_only.png b/doc/_static/logo/pdal_logo_only.png
new file mode 100644
index 0000000..a789301
Binary files /dev/null and b/doc/_static/logo/pdal_logo_only.png differ
diff --git a/doc/_static/pdal_bubbles_only.png b/doc/_static/pdal_bubbles_only.png
new file mode 100644
index 0000000..59da46e
Binary files /dev/null and b/doc/_static/pdal_bubbles_only.png differ
diff --git a/doc/_static/pdal_logo.png b/doc/_static/pdal_logo.png
new file mode 100644
index 0000000..7e61207
Binary files /dev/null and b/doc/_static/pdal_logo.png differ
diff --git a/doc/_static/sphinx.css b/doc/_static/sphinx.css
new file mode 100644
index 0000000..d7a19b7
--- /dev/null
+++ b/doc/_static/sphinx.css
@@ -0,0 +1,244 @@
+/**
+ * Sphinx stylesheet -- default theme
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+ 
+ at import url("basic.css");
+ 
+/* -- page layout ----------------------------------------------------------- */
+ 
+body {
+    font-family: Helvetica, Arial, sans-serif;
+    font-size: 100%;
+    background-color: #FFF;
+    color: #555;
+    margin: 0;
+    padding: 0;
+}
+
+div.documentwrapper {
+    float: left;
+    width: 100%;
+}
+
+div.bodywrapper {
+    margin: 0 0 0 230px;
+}
+
+hr{
+    border: 1px solid #B1B4B6;
+}
+ 
+div.document {
+    background-color: #eee;
+}
+ 
+div.body {
+    background-color: #ffffff;
+    color: #3E4349;
+    padding: 0 30px 30px 30px;
+    font-size: 0.8em;
+}
+ 
+div.footer {
+    color: #fff;
+    width: 100%;
+    padding: 13px 0;
+    text-align: center;
+    font-size: 75%;
+    background-color: #2c7fb8;
+}
+ 
+div.footer a {
+    color: #eee;
+}
+ 
+div.footer a.hover {
+    color: #eee;
+    text-decoration: underline;
+}
+
+div.related {
+    background-color: #2c7fb8;
+    line-height: 32px;
+    color: #fff;
+    font-size: 0.80em;
+}
+ 
+div.related a {
+    color: #fff;
+}
+ 
+div.sphinxsidebar {
+    font-size: 0.75em;
+    line-height: 1.5em;
+    z-index: 1000;
+}
+
+div.sphinxsidebarwrapper{
+    padding: 20px 0;
+    background-color: #b6f2fb;
+}
+ 
+div.sphinxsidebar h3,
+div.sphinxsidebar h4 {
+    font-family: Arial, sans-serif;
+    color: #222;
+    font-size: 1.2em;
+    font-weight: normal;
+    margin: 0;
+    padding: 5px 10px;
+    background-color: #b6f2fb;
+
+}
+
+div.sphinxsidebar h4{
+    font-size: 1.1em;
+}
+ 
+div.sphinxsidebar h3 a {
+    color: #444;
+}
+ 
+ 
+div.sphinxsidebar p {
+    color: #888;
+    padding: 5px 20px;
+}
+ 
+div.sphinxsidebar p.topless {
+}
+ 
+div.sphinxsidebar ul {
+    margin: 10px 20px;
+    padding: 0;
+    color: #000;
+}
+ 
+div.sphinxsidebar a {
+    color: #444;
+}
+ 
+div.sphinxsidebar input {
+    border: 1px solid #ccc;
+    font-family: sans-serif;
+    font-size: 1em;
+}
+
+div.sphinxsidebar input[type=text]{
+    margin-left: 20px;
+}
+ 
+/* -- body styles ----------------------------------------------------------- */
+ 
+a {
+    color: #1A1A56;
+    text-decoration: underline;
+}
+ 
+a:hover {
+    color: #A33333;
+    text-decoration: underline;
+}
+ 
+div.body h1,
+div.body h2,
+div.body h3,
+div.body h4,
+div.body h5,
+div.body h6 {
+    font-family: Helvetica, Arial, sans-serif;
+    background-color: #ccc;
+    font-weight: normal;
+    color: #000;
+    margin: 30px 0px 10px 0px;
+    padding: 5px 0 5px 10px;
+    text-shadow: 0px 1px 0 white
+}
+ 
+div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
+div.body h2 { font-size: 150%; background-color: #ccc; }
+div.body h3 { font-size: 120%; background-color: #ccc; }
+div.body h4 { font-size: 110%; background-color: #ccc; }
+div.body h5 { font-size: 100%; background-color: #ccc; }
+div.body h6 { font-size: 100%; background-color: #ccc; }
+ 
+h1 a, 
+h2 a,
+h3 a,
+h1 a:hover,
+h2 a:hover,
+h3 a:hover {
+  text-decoration: none;
+}
+
+a.headerlink {
+    color: #c60f0f;
+    font-size: 0.8em;
+    padding: 0 4px 0 4px;
+    text-decoration: none;
+}
+ 
+a.headerlink:hover {
+    background-color: #c60f0f;
+    color: white;
+}
+ 
+div.body p, div.body dd, div.body li {
+    line-height: 1.5em;
+}
+ 
+div.admonition p.admonition-title + p {
+    display: inline;
+}
+
+div.highlight{
+    background-color: white;
+}
+
+div.note {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+ 
+div.seealso {
+    background-color: #eee;
+    border: 1px solid #ccc;
+}
+ 
+div.topic {
+    background-color: #eee;
+}
+ 
+div.warning {
+    background-color: #ffe4e4;
+    border: 1px solid #f66;
+}
+ 
+p.admonition-title {
+    display: inline;
+}
+ 
+p.admonition-title:after {
+    content: ":";
+}
+ 
+pre {
+    padding: 10px;
+    background-color: #eee;
+    color: #222;
+    line-height: 1.2em;
+    border: 1px solid #C6C9CB;
+    font-size: 1.2em;
+    margin: 1.5em 0 1.5em 0;
+    -webkit-box-shadow: 1px 1px 1px #d8d8d8;
+    -moz-box-shadow: 1px 1px 1px #d8d8d8;
+}
+ 
+tt {
+    background-color: #ecf0f3;
+    color: #222;
+    padding: 1px 2px;
+    font-size: 1.2em;
+    font-family: monospace;
+}
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/bootstrap.js b/doc/_themes/bootstrap/bootstrap.js
new file mode 100755
index 0000000..39ad031
--- /dev/null
+++ b/doc/_themes/bootstrap/bootstrap.js
@@ -0,0 +1,2038 @@
+/* ===================================================
+ * bootstrap-transition.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#transitions
+ * ===================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  $(function () {
+
+    "use strict"; // jshint ;_;
+
+
+    /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
+     * ======================================================= */
+
+    $.support.transition = (function () {
+
+      var transitionEnd = (function () {
+
+        var el = document.createElement('bootstrap')
+          , transEndEventNames = {
+               'WebkitTransition' : 'webkitTransitionEnd'
+            ,  'MozTransition'    : 'transitionend'
+            ,  'OTransition'      : 'oTransitionEnd otransitionend'
+            ,  'transition'       : 'transitionend'
+            }
+          , name
+
+        for (name in transEndEventNames){
+          if (el.style[name] !== undefined) {
+            return transEndEventNames[name]
+          }
+        }
+
+      }())
+
+      return transitionEnd && {
+        end: transitionEnd
+      }
+
+    })()
+
+  })
+
+}(window.jQuery);
+/* =========================================================
+ * bootstrap-modal.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#modals
+ * =========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================= */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* MODAL CLASS DEFINITION
+  * ====================== */
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$element = $(element)
+      .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))
+    this.options.remote && this.$element.find('.modal-body').load(this.options.remote)
+  }
+
+  Modal.prototype = {
+
+      constructor: Modal
+
+    , toggle: function () {
+        return this[!this.isShown ? 'show' : 'hide']()
+      }
+
+    , show: function () {
+        var that = this
+          , e = $.Event('show')
+
+        this.$element.trigger(e)
+
+        if (this.isShown || e.isDefaultPrevented()) return
+
+        $('body').addClass('modal-open')
+
+        this.isShown = true
+
+        this.escape()
+
+        this.backdrop(function () {
+          var transition = $.support.transition && that.$element.hasClass('fade')
+
+          if (!that.$element.parent().length) {
+            that.$element.appendTo(document.body) //don't move modals dom position
+          }
+
+          that.$element
+            .show()
+
+          if (transition) {
+            that.$element[0].offsetWidth // force reflow
+          }
+
+          that.$element
+            .addClass('in')
+            .attr('aria-hidden', false)
+            .focus()
+
+          that.enforceFocus()
+
+          transition ?
+            that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :
+            that.$element.trigger('shown')
+
+        })
+      }
+
+    , hide: function (e) {
+        e && e.preventDefault()
+
+        var that = this
+
+        e = $.Event('hide')
+
+        this.$element.trigger(e)
+
+        if (!this.isShown || e.isDefaultPrevented()) return
+
+        this.isShown = false
+
+        $('body').removeClass('modal-open')
+
+        this.escape()
+
+        $(document).off('focusin.modal')
+
+        this.$element
+          .removeClass('in')
+          .attr('aria-hidden', true)
+
+        $.support.transition && this.$element.hasClass('fade') ?
+          this.hideWithTransition() :
+          this.hideModal()
+      }
+
+    , enforceFocus: function () {
+        var that = this
+        $(document).on('focusin.modal', function (e) {
+          if (that.$element[0] !== e.target && !that.$element.has(e.target).length) {
+            that.$element.focus()
+          }
+        })
+      }
+
+    , escape: function () {
+        var that = this
+        if (this.isShown && this.options.keyboard) {
+          this.$element.on('keyup.dismiss.modal', function ( e ) {
+            e.which == 27 && that.hide()
+          })
+        } else if (!this.isShown) {
+          this.$element.off('keyup.dismiss.modal')
+        }
+      }
+
+    , hideWithTransition: function () {
+        var that = this
+          , timeout = setTimeout(function () {
+              that.$element.off($.support.transition.end)
+              that.hideModal()
+            }, 500)
+
+        this.$element.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          that.hideModal()
+        })
+      }
+
+    , hideModal: function (that) {
+        this.$element
+          .hide()
+          .trigger('hidden')
+
+        this.backdrop()
+      }
+
+    , removeBackdrop: function () {
+        this.$backdrop.remove()
+        this.$backdrop = null
+      }
+
+    , backdrop: function (callback) {
+        var that = this
+          , animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+        if (this.isShown && this.options.backdrop) {
+          var doAnimate = $.support.transition && animate
+
+          this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+            .appendTo(document.body)
+
+          if (this.options.backdrop != 'static') {
+            this.$backdrop.click($.proxy(this.hide, this))
+          }
+
+          if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+          this.$backdrop.addClass('in')
+
+          doAnimate ?
+            this.$backdrop.one($.support.transition.end, callback) :
+            callback()
+
+        } else if (!this.isShown && this.$backdrop) {
+          this.$backdrop.removeClass('in')
+
+          $.support.transition && this.$element.hasClass('fade')?
+            this.$backdrop.one($.support.transition.end, $.proxy(this.removeBackdrop, this)) :
+            this.removeBackdrop()
+
+        } else if (callback) {
+          callback()
+        }
+      }
+  }
+
+
+ /* MODAL PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.modal = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('modal')
+        , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)
+      if (!data) $this.data('modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option]()
+      else if (options.show) data.show()
+    })
+  }
+
+  $.fn.modal.defaults = {
+      backdrop: true
+    , keyboard: true
+    , show: true
+  }
+
+  $.fn.modal.Constructor = Modal
+
+
+ /* MODAL DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {
+      var $this = $(this)
+        , href = $this.attr('href')
+        , $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7
+        , option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+      e.preventDefault()
+
+      $target
+        .modal(option)
+        .one('hide', function () {
+          $this.focus()
+        })
+    })
+  })
+
+}(window.jQuery);
+/* ============================================================
+ * bootstrap-dropdown.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#dropdowns
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle=dropdown]'
+    , Dropdown = function (element) {
+        var $el = $(element).on('click.dropdown.data-api', this.toggle)
+        $('html').on('click.dropdown.data-api', function () {
+          $el.parent().removeClass('open')
+        })
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function (e) {
+      var $this = $(this)
+        , $parent
+        , isActive
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      clearMenus()
+
+      if (!isActive) {
+        $parent.toggleClass('open')
+        $this.focus()
+      }
+
+      return false
+    }
+
+  , keydown: function (e) {
+      var $this
+        , $items
+        , $active
+        , $parent
+        , isActive
+        , index
+
+      if (!/(38|40|27)/.test(e.keyCode)) return
+
+      $this = $(this)
+
+      e.preventDefault()
+      e.stopPropagation()
+
+      if ($this.is('.disabled, :disabled')) return
+
+      $parent = getParent($this)
+
+      isActive = $parent.hasClass('open')
+
+      if (!isActive || (isActive && e.keyCode == 27)) return $this.click()
+
+      $items = $('[role=menu] li:not(.divider) a', $parent)
+
+      if (!$items.length) return
+
+      index = $items.index($items.filter(':focus'))
+
+      if (e.keyCode == 38 && index > 0) index--                                        // up
+      if (e.keyCode == 40 && index < $items.length - 1) index++                        // down
+      if (!~index) index = 0
+
+      $items
+        .eq(index)
+        .focus()
+    }
+
+  }
+
+  function clearMenus() {
+    getParent($(toggle))
+      .removeClass('open')
+  }
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+    $parent.length || ($parent = $this.parent())
+
+    return $parent
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  $.fn.dropdown = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(function () {
+    $('html')
+      .on('click.dropdown.data-api touchstart.dropdown.data-api', clearMenus)
+    $('body')
+      .on('click.dropdown touchstart.dropdown.data-api', '.dropdown', function (e) { e.stopPropagation() })
+      .on('click.dropdown.data-api touchstart.dropdown.data-api'  , toggle, Dropdown.prototype.toggle)
+      .on('keydown.dropdown.data-api touchstart.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown)
+  })
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-scrollspy.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#scrollspy
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* SCROLLSPY CLASS DEFINITION
+  * ========================== */
+
+  function ScrollSpy(element, options) {
+    var process = $.proxy(this.process, this)
+      , $element = $(element).is('body') ? $(window) : $(element)
+      , href
+    this.options = $.extend({}, $.fn.scrollspy.defaults, options)
+    this.$scrollElement = $element.on('scroll.scroll-spy.data-api', process)
+    this.selector = (this.options.target
+      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+      || '') + ' .nav li > a'
+    this.$body = $('body')
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.prototype = {
+
+      constructor: ScrollSpy
+
+    , refresh: function () {
+        var self = this
+          , $targets
+
+        this.offsets = $([])
+        this.targets = $([])
+
+        $targets = this.$body
+          .find(this.selector)
+          .map(function () {
+            var $el = $(this)
+              , href = $el.data('target') || $el.attr('href')
+              , $href = /^#\w/.test(href) && $(href)
+            return ( $href
+              && $href.length
+              && [[ $href.position().top, href ]] ) || null
+          })
+          .sort(function (a, b) { return a[0] - b[0] })
+          .each(function () {
+            self.offsets.push(this[0])
+            self.targets.push(this[1])
+          })
+      }
+
+    , process: function () {
+        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+          , maxScroll = scrollHeight - this.$scrollElement.height()
+          , offsets = this.offsets
+          , targets = this.targets
+          , activeTarget = this.activeTarget
+          , i
+
+        if (scrollTop >= maxScroll) {
+          return activeTarget != (i = targets.last()[0])
+            && this.activate ( i )
+        }
+
+        for (i = offsets.length; i--;) {
+          activeTarget != targets[i]
+            && scrollTop >= offsets[i]
+            && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+            && this.activate( targets[i] )
+        }
+      }
+
+    , activate: function (target) {
+        var active
+          , selector
+
+        this.activeTarget = target
+
+        $(this.selector)
+          .parent('.active')
+          .removeClass('active')
+
+        selector = this.selector
+          + '[data-target="' + target + '"],'
+          + this.selector + '[href="' + target + '"]'
+
+        active = $(selector)
+          .parent('li')
+          .addClass('active')
+
+        if (active.parent('.dropdown-menu').length)  {
+          active = active.closest('li.dropdown').addClass('active')
+        }
+
+        active.trigger('activate')
+      }
+
+  }
+
+
+ /* SCROLLSPY PLUGIN DEFINITION
+  * =========================== */
+
+  $.fn.scrollspy = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('scrollspy')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+  $.fn.scrollspy.defaults = {
+    offset: 10
+  }
+
+
+ /* SCROLLSPY DATA-API
+  * ================== */
+
+  $(window).on('load', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      $spy.scrollspy($spy.data())
+    })
+  })
+
+}(window.jQuery);
+/* ========================================================
+ * bootstrap-tab.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
+ * ========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ======================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TAB CLASS DEFINITION
+  * ==================== */
+
+  var Tab = function (element) {
+    this.element = $(element)
+  }
+
+  Tab.prototype = {
+
+    constructor: Tab
+
+  , show: function () {
+      var $this = this.element
+        , $ul = $this.closest('ul:not(.dropdown-menu)')
+        , selector = $this.attr('data-target')
+        , previous
+        , $target
+        , e
+
+      if (!selector) {
+        selector = $this.attr('href')
+        selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+      }
+
+      if ( $this.parent('li').hasClass('active') ) return
+
+      previous = $ul.find('.active a').last()[0]
+
+      e = $.Event('show', {
+        relatedTarget: previous
+      })
+
+      $this.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      $target = $(selector)
+
+      this.activate($this.parent('li'), $ul)
+      this.activate($target, $target.parent(), function () {
+        $this.trigger({
+          type: 'shown'
+        , relatedTarget: previous
+        })
+      })
+    }
+
+  , activate: function ( element, container, callback) {
+      var $active = container.find('> .active')
+        , transition = callback
+            && $.support.transition
+            && $active.hasClass('fade')
+
+      function next() {
+        $active
+          .removeClass('active')
+          .find('> .dropdown-menu > .active')
+          .removeClass('active')
+
+        element.addClass('active')
+
+        if (transition) {
+          element[0].offsetWidth // reflow for transition
+          element.addClass('in')
+        } else {
+          element.removeClass('fade')
+        }
+
+        if ( element.parent('.dropdown-menu') ) {
+          element.closest('li.dropdown').addClass('active')
+        }
+
+        callback && callback()
+      }
+
+      transition ?
+        $active.one($.support.transition.end, next) :
+        next()
+
+      $active.removeClass('in')
+    }
+  }
+
+
+ /* TAB PLUGIN DEFINITION
+  * ===================== */
+
+  $.fn.tab = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tab')
+      if (!data) $this.data('tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tab.Constructor = Tab
+
+
+ /* TAB DATA-API
+  * ============ */
+
+  $(function () {
+    $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+      e.preventDefault()
+      $(this).tab('show')
+    })
+  })
+
+}(window.jQuery);
+/* ===========================================================
+ * bootstrap-tooltip.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#tooltips
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* TOOLTIP PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Tooltip = function (element, options) {
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.prototype = {
+
+    constructor: Tooltip
+
+  , init: function (type, element, options) {
+      var eventIn
+        , eventOut
+
+      this.type = type
+      this.$element = $(element)
+      this.options = this.getOptions(options)
+      this.enabled = true
+
+      if (this.options.trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (this.options.trigger != 'manual') {
+        eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus'
+        eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur'
+        this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+
+      this.options.selector ?
+        (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+        this.fixTitle()
+    }
+
+  , getOptions: function (options) {
+      options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data())
+
+      if (options.delay && typeof options.delay == 'number') {
+        options.delay = {
+          show: options.delay
+        , hide: options.delay
+        }
+      }
+
+      return options
+    }
+
+  , enter: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (!self.options.delay || !self.options.delay.show) return self.show()
+
+      clearTimeout(this.timeout)
+      self.hoverState = 'in'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'in') self.show()
+      }, self.options.delay.show)
+    }
+
+  , leave: function (e) {
+      var self = $(e.currentTarget)[this.type](this._options).data(this.type)
+
+      if (this.timeout) clearTimeout(this.timeout)
+      if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+      self.hoverState = 'out'
+      this.timeout = setTimeout(function() {
+        if (self.hoverState == 'out') self.hide()
+      }, self.options.delay.hide)
+    }
+
+  , show: function () {
+      var $tip
+        , inside
+        , pos
+        , actualWidth
+        , actualHeight
+        , placement
+        , tp
+
+      if (this.hasContent() && this.enabled) {
+        $tip = this.tip()
+        this.setContent()
+
+        if (this.options.animation) {
+          $tip.addClass('fade')
+        }
+
+        placement = typeof this.options.placement == 'function' ?
+          this.options.placement.call(this, $tip[0], this.$element[0]) :
+          this.options.placement
+
+        inside = /in/.test(placement)
+
+        $tip
+          .remove()
+          .css({ top: 0, left: 0, display: 'block' })
+          .appendTo(inside ? this.$element : document.body)
+
+        pos = this.getPosition(inside)
+
+        actualWidth = $tip[0].offsetWidth
+        actualHeight = $tip[0].offsetHeight
+
+        switch (inside ? placement.split(' ')[1] : placement) {
+          case 'bottom':
+            tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'top':
+            tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2}
+            break
+          case 'left':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth}
+            break
+          case 'right':
+            tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width}
+            break
+        }
+
+        $tip
+          .css(tp)
+          .addClass(placement)
+          .addClass('in')
+      }
+    }
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+
+      $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+      $tip.removeClass('fade in top bottom left right')
+    }
+
+  , hide: function () {
+      var that = this
+        , $tip = this.tip()
+
+      $tip.removeClass('in')
+
+      function removeWithAnimation() {
+        var timeout = setTimeout(function () {
+          $tip.off($.support.transition.end).remove()
+        }, 500)
+
+        $tip.one($.support.transition.end, function () {
+          clearTimeout(timeout)
+          $tip.remove()
+        })
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        removeWithAnimation() :
+        $tip.remove()
+
+      return this
+    }
+
+  , fixTitle: function () {
+      var $e = this.$element
+      if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
+        $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
+      }
+    }
+
+  , hasContent: function () {
+      return this.getTitle()
+    }
+
+  , getPosition: function (inside) {
+      return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), {
+        width: this.$element[0].offsetWidth
+      , height: this.$element[0].offsetHeight
+      })
+    }
+
+  , getTitle: function () {
+      var title
+        , $e = this.$element
+        , o = this.options
+
+      title = $e.attr('data-original-title')
+        || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+      return title
+    }
+
+  , tip: function () {
+      return this.$tip = this.$tip || $(this.options.template)
+    }
+
+  , validate: function () {
+      if (!this.$element[0].parentNode) {
+        this.hide()
+        this.$element = null
+        this.options = null
+      }
+    }
+
+  , enable: function () {
+      this.enabled = true
+    }
+
+  , disable: function () {
+      this.enabled = false
+    }
+
+  , toggleEnabled: function () {
+      this.enabled = !this.enabled
+    }
+
+  , toggle: function () {
+      this[this.tip().hasClass('in') ? 'hide' : 'show']()
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  }
+
+
+ /* TOOLTIP PLUGIN DEFINITION
+  * ========================= */
+
+  $.fn.tooltip = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('tooltip')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.tooltip.Constructor = Tooltip
+
+  $.fn.tooltip.defaults = {
+    animation: true
+  , placement: 'top'
+  , selector: false
+  , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'
+  , trigger: 'hover'
+  , title: ''
+  , delay: 0
+  , html: true
+  }
+
+}(window.jQuery);
+
+/* ===========================================================
+ * bootstrap-popover.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#popovers
+ * ===========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * =========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* POPOVER PUBLIC CLASS DEFINITION
+  * =============================== */
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+
+  /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js
+     ========================================== */
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, {
+
+    constructor: Popover
+
+  , setContent: function () {
+      var $tip = this.tip()
+        , title = this.getTitle()
+        , content = this.getContent()
+
+      $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+      $tip.find('.popover-content > *')[this.options.html ? 'html' : 'text'](content)
+
+      $tip.removeClass('fade top bottom left right in')
+    }
+
+  , hasContent: function () {
+      return this.getTitle() || this.getContent()
+    }
+
+  , getContent: function () {
+      var content
+        , $e = this.$element
+        , o = this.options
+
+      content = $e.attr('data-content')
+        || (typeof o.content == 'function' ? o.content.call($e[0]) :  o.content)
+
+      return content
+    }
+
+  , tip: function () {
+      if (!this.$tip) {
+        this.$tip = $(this.options.template)
+      }
+      return this.$tip
+    }
+
+  , destroy: function () {
+      this.hide().$element.off('.' + this.type).removeData(this.type)
+    }
+
+  })
+
+
+ /* POPOVER PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.popover = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('popover')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.popover.Constructor = Popover
+
+  $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, {
+    placement: 'right'
+  , trigger: 'click'
+  , content: ''
+  , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-affix.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#affix
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* AFFIX CLASS DEFINITION
+  * ====================== */
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, $.fn.affix.defaults, options)
+    this.$window = $(window).on('scroll.affix.data-api', $.proxy(this.checkPosition, this))
+    this.$element = $(element)
+    this.checkPosition()
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var scrollHeight = $(document).height()
+      , scrollTop = this.$window.scrollTop()
+      , position = this.$element.offset()
+      , offset = this.options.offset
+      , offsetBottom = offset.bottom
+      , offsetTop = offset.top
+      , reset = 'affix affix-top affix-bottom'
+      , affix
+
+    if (typeof offset != 'object') offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function') offsetTop = offset.top()
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom()
+
+    affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ?
+      false    : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ?
+      'bottom' : offsetTop != null && scrollTop <= offsetTop ?
+      'top'    : false
+
+    if (this.affixed === affix) return
+
+    this.affixed = affix
+    this.unpin = affix == 'bottom' ? position.top - scrollTop : null
+
+    this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : ''))
+  }
+
+
+ /* AFFIX PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.affix = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('affix')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.affix.Constructor = Affix
+
+  $.fn.affix.defaults = {
+    offset: 0
+  }
+
+
+ /* AFFIX DATA-API
+  * ============== */
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+        , data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      data.offsetBottom && (data.offset.bottom = data.offsetBottom)
+      data.offsetTop && (data.offset.top = data.offsetTop)
+
+      $spy.affix(data)
+    })
+  })
+
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-alert.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#alerts
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* ALERT CLASS DEFINITION
+  * ====================== */
+
+  var dismiss = '[data-dismiss="alert"]'
+    , Alert = function (el) {
+        $(el).on('click', dismiss, this.close)
+      }
+
+  Alert.prototype.close = function (e) {
+    var $this = $(this)
+      , selector = $this.attr('data-target')
+      , $parent
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+    }
+
+    $parent = $(selector)
+
+    e && e.preventDefault()
+
+    $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent())
+
+    $parent.trigger(e = $.Event('close'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      $parent
+        .trigger('closed')
+        .remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent.on($.support.transition.end, removeElement) :
+      removeElement()
+  }
+
+
+ /* ALERT PLUGIN DEFINITION
+  * ======================= */
+
+  $.fn.alert = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('alert')
+      if (!data) $this.data('alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.alert.Constructor = Alert
+
+
+ /* ALERT DATA-API
+  * ============== */
+
+  $(function () {
+    $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
+  })
+
+}(window.jQuery);
+/* ============================================================
+ * bootstrap-button.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#buttons
+ * ============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* BUTTON PUBLIC CLASS DEFINITION
+  * ============================== */
+
+  var Button = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.button.defaults, options)
+  }
+
+  Button.prototype.setState = function (state) {
+    var d = 'disabled'
+      , $el = this.$element
+      , data = $el.data()
+      , val = $el.is('input') ? 'val' : 'html'
+
+    state = state + 'Text'
+    data.resetText || $el.data('resetText', $el[val]())
+
+    $el[val](data[state] || this.options[state])
+
+    // push to event loop to allow forms to submit
+    setTimeout(function () {
+      state == 'loadingText' ?
+        $el.addClass(d).attr(d, d) :
+        $el.removeClass(d).removeAttr(d)
+    }, 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var $parent = this.$element.parent('[data-toggle="buttons-radio"]')
+
+    $parent && $parent
+      .find('.active')
+      .removeClass('active')
+
+    this.$element.toggleClass('active')
+  }
+
+
+ /* BUTTON PLUGIN DEFINITION
+  * ======================== */
+
+  $.fn.button = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('button')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('button', (data = new Button(this, options)))
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  $.fn.button.defaults = {
+    loadingText: 'loading...'
+  }
+
+  $.fn.button.Constructor = Button
+
+
+ /* BUTTON DATA-API
+  * =============== */
+
+  $(function () {
+    $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) {
+      var $btn = $(e.target)
+      if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+      $btn.button('toggle')
+    })
+  })
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-collapse.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#collapse
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* COLLAPSE PUBLIC CLASS DEFINITION
+  * ================================ */
+
+  var Collapse = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.collapse.defaults, options)
+
+    if (this.options.parent) {
+      this.$parent = $(this.options.parent)
+    }
+
+    this.options.toggle && this.toggle()
+  }
+
+  Collapse.prototype = {
+
+    constructor: Collapse
+
+  , dimension: function () {
+      var hasWidth = this.$element.hasClass('width')
+      return hasWidth ? 'width' : 'height'
+    }
+
+  , show: function () {
+      var dimension
+        , scroll
+        , actives
+        , hasData
+
+      if (this.transitioning) return
+
+      dimension = this.dimension()
+      scroll = $.camelCase(['scroll', dimension].join('-'))
+      actives = this.$parent && this.$parent.find('> .accordion-group > .in')
+
+      if (actives && actives.length) {
+        hasData = actives.data('collapse')
+        if (hasData && hasData.transitioning) return
+        actives.collapse('hide')
+        hasData || actives.data('collapse', null)
+      }
+
+      this.$element[dimension](0)
+      this.transition('addClass', $.Event('show'), 'shown')
+      $.support.transition && this.$element[dimension](this.$element[0][scroll])
+    }
+
+  , hide: function () {
+      var dimension
+      if (this.transitioning) return
+      dimension = this.dimension()
+      this.reset(this.$element[dimension]())
+      this.transition('removeClass', $.Event('hide'), 'hidden')
+      this.$element[dimension](0)
+    }
+
+  , reset: function (size) {
+      var dimension = this.dimension()
+
+      this.$element
+        .removeClass('collapse')
+        [dimension](size || 'auto')
+        [0].offsetWidth
+
+      this.$element[size !== null ? 'addClass' : 'removeClass']('collapse')
+
+      return this
+    }
+
+  , transition: function (method, startEvent, completeEvent) {
+      var that = this
+        , complete = function () {
+            if (startEvent.type == 'show') that.reset()
+            that.transitioning = 0
+            that.$element.trigger(completeEvent)
+          }
+
+      this.$element.trigger(startEvent)
+
+      if (startEvent.isDefaultPrevented()) return
+
+      this.transitioning = 1
+
+      this.$element[method]('in')
+
+      $.support.transition && this.$element.hasClass('collapse') ?
+        this.$element.one($.support.transition.end, complete) :
+        complete()
+    }
+
+  , toggle: function () {
+      this[this.$element.hasClass('in') ? 'hide' : 'show']()
+    }
+
+  }
+
+
+ /* COLLAPSIBLE PLUGIN DEFINITION
+  * ============================== */
+
+  $.fn.collapse = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('collapse')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.collapse.defaults = {
+    toggle: true
+  }
+
+  $.fn.collapse.Constructor = Collapse
+
+
+ /* COLLAPSIBLE DATA-API
+  * ==================== */
+
+  $(function () {
+    $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function (e) {
+      var $this = $(this), href
+        , target = $this.attr('data-target')
+          || e.preventDefault()
+          || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+        , option = $(target).data('collapse') ? 'toggle' : $this.data()
+      $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+      $(target).collapse(option)
+    })
+  })
+
+}(window.jQuery);
+/* ==========================================================
+ * bootstrap-carousel.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#carousel
+ * ==========================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ========================================================== */
+
+
+!function ($) {
+
+  "use strict"; // jshint ;_;
+
+
+ /* CAROUSEL CLASS DEFINITION
+  * ========================= */
+
+  var Carousel = function (element, options) {
+    this.$element = $(element)
+    this.options = options
+    this.options.slide && this.slide(this.options.slide)
+    this.options.pause == 'hover' && this.$element
+      .on('mouseenter', $.proxy(this.pause, this))
+      .on('mouseleave', $.proxy(this.cycle, this))
+  }
+
+  Carousel.prototype = {
+
+    cycle: function (e) {
+      if (!e) this.paused = false
+      this.options.interval
+        && !this.paused
+        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+      return this
+    }
+
+  , to: function (pos) {
+      var $active = this.$element.find('.item.active')
+        , children = $active.parent().children()
+        , activePos = children.index($active)
+        , that = this
+
+      if (pos > (children.length - 1) || pos < 0) return
+
+      if (this.sliding) {
+        return this.$element.one('slid', function () {
+          that.to(pos)
+        })
+      }
+
+      if (activePos == pos) {
+        return this.pause().cycle()
+      }
+
+      return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos]))
+    }
+
+  , pause: function (e) {
+      if (!e) this.paused = true
+      if (this.$element.find('.next, .prev').length && $.support.transition.end) {
+        this.$element.trigger($.support.transition.end)
+        this.cycle()
+      }
+      clearInterval(this.interval)
+      this.interval = null
+      return this
+    }
+
+  , next: function () {
+      if (this.sliding) return
+      return this.slide('next')
+    }
+
+  , prev: function () {
+      if (this.sliding) return
+      return this.slide('prev')
+    }
+
+  , slide: function (type, next) {
+      var $active = this.$element.find('.item.active')
+        , $next = next || $active[type]()
+        , isCycling = this.interval
+        , direction = type == 'next' ? 'left' : 'right'
+        , fallback  = type == 'next' ? 'first' : 'last'
+        , that = this
+        , e = $.Event('slide', {
+            relatedTarget: $next[0]
+          })
+
+      this.sliding = true
+
+      isCycling && this.pause()
+
+      $next = $next.length ? $next : this.$element.find('.item')[fallback]()
+
+      if ($next.hasClass('active')) return
+
+      if ($.support.transition && this.$element.hasClass('slide')) {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $next.addClass(type)
+        $next[0].offsetWidth // force reflow
+        $active.addClass(direction)
+        $next.addClass(direction)
+        this.$element.one($.support.transition.end, function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () { that.$element.trigger('slid') }, 0)
+        })
+      } else {
+        this.$element.trigger(e)
+        if (e.isDefaultPrevented()) return
+        $active.removeClass('active')
+        $next.addClass('active')
+        this.sliding = false
+        this.$element.trigger('slid')
+      }
+
+      isCycling && this.cycle()
+
+      return this
+    }
+
+  }
+
+
+ /* CAROUSEL PLUGIN DEFINITION
+  * ========================== */
+
+  $.fn.carousel = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('carousel')
+        , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option)
+        , action = typeof option == 'string' ? option : options.slide
+      if (!data) $this.data('carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.cycle()
+    })
+  }
+
+  $.fn.carousel.defaults = {
+    interval: 5000
+  , pause: 'hover'
+  }
+
+  $.fn.carousel.Constructor = Carousel
+
+
+ /* CAROUSEL DATA-API
+  * ================= */
+
+  $(function () {
+    $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) {
+      var $this = $(this), href
+        , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+        , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data())
+      $target.carousel(options)
+      e.preventDefault()
+    })
+  })
+
+}(window.jQuery);
+/* =============================================================
+ * bootstrap-typeahead.js v2.1.0
+ * http://twitter.github.com/bootstrap/javascript.html#typeahead
+ * =============================================================
+ * Copyright 2012 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function($){
+
+  "use strict"; // jshint ;_;
+
+
+ /* TYPEAHEAD PUBLIC CLASS DEFINITION
+  * ================================= */
+
+  var Typeahead = function (element, options) {
+    this.$element = $(element)
+    this.options = $.extend({}, $.fn.typeahead.defaults, options)
+    this.matcher = this.options.matcher || this.matcher
+    this.sorter = this.options.sorter || this.sorter
+    this.highlighter = this.options.highlighter || this.highlighter
+    this.updater = this.options.updater || this.updater
+    this.$menu = $(this.options.menu).appendTo('body')
+    this.source = this.options.source
+    this.shown = false
+    this.listen()
+  }
+
+  Typeahead.prototype = {
+
+    constructor: Typeahead
+
+  , select: function () {
+      var val = this.$menu.find('.active').attr('data-value')
+      this.$element
+        .val(this.updater(val))
+        .change()
+      return this.hide()
+    }
+
+  , updater: function (item) {
+      return item
+    }
+
+  , show: function () {
+      var pos = $.extend({}, this.$element.offset(), {
+        height: this.$element[0].offsetHeight
+      })
+
+      this.$menu.css({
+        top: pos.top + pos.height
+      , left: pos.left
+      })
+
+      this.$menu.show()
+      this.shown = true
+      return this
+    }
+
+  , hide: function () {
+      this.$menu.hide()
+      this.shown = false
+      return this
+    }
+
+  , lookup: function (event) {
+      var items
+
+      this.query = this.$element.val()
+
+      if (!this.query || this.query.length < this.options.minLength) {
+        return this.shown ? this.hide() : this
+      }
+
+      items = $.isFunction(this.source) ? this.source(this.query, $.proxy(this.process, this)) : this.source
+
+      return items ? this.process(items) : this
+    }
+
+  , process: function (items) {
+      var that = this
+
+      items = $.grep(items, function (item) {
+        return that.matcher(item)
+      })
+
+      items = this.sorter(items)
+
+      if (!items.length) {
+        return this.shown ? this.hide() : this
+      }
+
+      return this.render(items.slice(0, this.options.items)).show()
+    }
+
+  , matcher: function (item) {
+      return ~item.toLowerCase().indexOf(this.query.toLowerCase())
+    }
+
+  , sorter: function (items) {
+      var beginswith = []
+        , caseSensitive = []
+        , caseInsensitive = []
+        , item
+
+      while (item = items.shift()) {
+        if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
+        else if (~item.indexOf(this.query)) caseSensitive.push(item)
+        else caseInsensitive.push(item)
+      }
+
+      return beginswith.concat(caseSensitive, caseInsensitive)
+    }
+
+  , highlighter: function (item) {
+      var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
+      return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) {
+        return '<strong>' + match + '</strong>'
+      })
+    }
+
+  , render: function (items) {
+      var that = this
+
+      items = $(items).map(function (i, item) {
+        i = $(that.options.item).attr('data-value', item)
+        i.find('a').html(that.highlighter(item))
+        return i[0]
+      })
+
+      items.first().addClass('active')
+      this.$menu.html(items)
+      return this
+    }
+
+  , next: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , next = active.next()
+
+      if (!next.length) {
+        next = $(this.$menu.find('li')[0])
+      }
+
+      next.addClass('active')
+    }
+
+  , prev: function (event) {
+      var active = this.$menu.find('.active').removeClass('active')
+        , prev = active.prev()
+
+      if (!prev.length) {
+        prev = this.$menu.find('li').last()
+      }
+
+      prev.addClass('active')
+    }
+
+  , listen: function () {
+      this.$element
+        .on('blur',     $.proxy(this.blur, this))
+        .on('keypress', $.proxy(this.keypress, this))
+        .on('keyup',    $.proxy(this.keyup, this))
+
+      if ($.browser.webkit || $.browser.msie) {
+        this.$element.on('keydown', $.proxy(this.keydown, this))
+      }
+
+      this.$menu
+        .on('click', $.proxy(this.click, this))
+        .on('mouseenter', 'li', $.proxy(this.mouseenter, this))
+    }
+
+  , move: function (e) {
+      if (!this.shown) return
+
+      switch(e.keyCode) {
+        case 9: // tab
+        case 13: // enter
+        case 27: // escape
+          e.preventDefault()
+          break
+
+        case 38: // up arrow
+          e.preventDefault()
+          this.prev()
+          break
+
+        case 40: // down arrow
+          e.preventDefault()
+          this.next()
+          break
+      }
+
+      e.stopPropagation()
+    }
+
+  , keydown: function (e) {
+      this.suppressKeyPressRepeat = !~$.inArray(e.keyCode, [40,38,9,13,27])
+      this.move(e)
+    }
+
+  , keypress: function (e) {
+      if (this.suppressKeyPressRepeat) return
+      this.move(e)
+    }
+
+  , keyup: function (e) {
+      switch(e.keyCode) {
+        case 40: // down arrow
+        case 38: // up arrow
+          break
+
+        case 9: // tab
+        case 13: // enter
+          if (!this.shown) return
+          this.select()
+          break
+
+        case 27: // escape
+          if (!this.shown) return
+          this.hide()
+          break
+
+        default:
+          this.lookup()
+      }
+
+      e.stopPropagation()
+      e.preventDefault()
+  }
+
+  , blur: function (e) {
+      var that = this
+      setTimeout(function () { that.hide() }, 150)
+    }
+
+  , click: function (e) {
+      e.stopPropagation()
+      e.preventDefault()
+      this.select()
+    }
+
+  , mouseenter: function (e) {
+      this.$menu.find('.active').removeClass('active')
+      $(e.currentTarget).addClass('active')
+    }
+
+  }
+
+
+  /* TYPEAHEAD PLUGIN DEFINITION
+   * =========================== */
+
+  $.fn.typeahead = function (option) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('typeahead')
+        , options = typeof option == 'object' && option
+      if (!data) $this.data('typeahead', (data = new Typeahead(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  $.fn.typeahead.defaults = {
+    source: []
+  , items: 8
+  , menu: '<ul class="typeahead dropdown-menu"></ul>'
+  , item: '<li><a href="#"></a></li>'
+  , minLength: 1
+  }
+
+  $.fn.typeahead.Constructor = Typeahead
+
+
+ /*   TYPEAHEAD DATA-API
+  * ================== */
+
+  $(function () {
+    $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) {
+      var $this = $(this)
+      if ($this.data('typeahead')) return
+      e.preventDefault()
+      $this.typeahead($this.data())
+    })
+  })
+
+}(window.jQuery);
diff --git a/doc/_themes/bootstrap/bootstrap.min.js b/doc/_themes/bootstrap/bootstrap.min.js
new file mode 100755
index 0000000..731e0ad
--- /dev/null
+++ b/doc/_themes/bootstrap/bootstrap.min.js
@@ -0,0 +1,7 @@
+/**
+* Bootstrap.js by @fat & @mdo
+* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hi [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/indexsidebar.html b/doc/_themes/bootstrap/indexsidebar.html
new file mode 100644
index 0000000..7d542f2
--- /dev/null
+++ b/doc/_themes/bootstrap/indexsidebar.html
@@ -0,0 +1,42 @@
+
+<p>
+<script src="http://widgets.twimg.com/j/2/widget.js"></script>
+<script>
+new TWTR.Widget({
+  version: 2,
+  type: 'profile',
+  rpp: 4,
+  interval: 6000,
+  width: 'auto',
+  height: 200,
+  theme: {
+    shell: {
+      background: '#2c7fb8',
+      color: '#ffffff'
+    },
+    tweets: {
+      background: '#2c7fb8',
+      color: '#ffffff',
+      links: '#ffffff'
+    }
+  },
+  features: {
+    scrollbar: false,
+    loop: false,
+    live: false,
+    hashtags: true,
+    timestamp: true,
+    avatars: false,
+    behavior: 'all'
+  }
+}).render().setUser('pointcloudpipe').start();
+</script>
+</p>
+
+
+
+<p>
+<script type="text/javascript" src="http://www.ohloh.net/p/585810/widgets/project_thin_badge.js"></script>
+</p>
+
+
diff --git a/doc/_themes/bootstrap/layout.html b/doc/_themes/bootstrap/layout.html
new file mode 100644
index 0000000..7a59145
--- /dev/null
+++ b/doc/_themes/bootstrap/layout.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html>
+
+{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and (sidebars != []) %}
+{%- set url_root = pathto('', 1) %}
+{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
+
+{%- macro relbar(bottom=False) %}
+{%- endmacro %}
+
+{%- macro sidebar() %}
+    {%- if render_sidebar %}
+        <div class="sphinxsidebar">
+            <div class="sphinxsidebarwrapper">
+                {%- if sidebars != None %}
+                    {#- new style sidebar: explicitly include/exclude templates #}
+                    {%- for sidebartemplate in sidebars %}
+                        {%- include sidebartemplate %}
+                    {%- endfor %}
+                {%- else %}
+                    {#- old style sidebars: using blocks -- should be deprecated #}
+                    {%- block sidebartoc %}
+                        {%- include "localtoc.html" %}
+                    {%- endblock %}
+                    {%- block sidebarrel %}
+                        {%- include "relations.html" %}
+                    {%- endblock %}
+                    {%- block sidebarsourcelink %}
+                        {%- include "sourcelink.html" %}
+                    {%- endblock %}
+                    {%- if customsidebar %}
+                        {%- include customsidebar %}
+                    {%- endif %}
+                {%- endif %}
+            </div>
+        </div>
+    {%- endif %}
+{%- endmacro -%}
+
+{%- macro seachbox() %}
+    {%- if pagename != "search" %}
+        <form class="navbar-search" action="{{ pathto('search') }}"
+              method="get">
+            <input type="text" name="q" placeholder="search"/>
+            <input type="hidden" name="check_keywords" value="yes"/>
+            <input type="hidden" name="area" value="default"/>
+        </form>
+    {%- endif %}
+{%- endmacro -%}
+
+<html>
+<head>
+    <meta http-equiv="Content-Type"
+          content="text/html; charset={{ encoding }}"/>
+    {{ metatags }}
+    {%- if not embedded and docstitle %}
+        {%- set titlesuffix = " — "|safe + docstitle|e %}
+    {%- else %}
+        {%- set titlesuffix = "" %}
+    {%- endif %}
+    {%- block htmltitle %}
+        <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
+    {%- endblock %}
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link href='http://fonts.googleapis.com/css?family=Crete+Round' rel='stylesheet' type='text/css'>
+    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css"/>
+    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css"/>
+    {%- for cssfile in css_files %}
+        <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css"/>
+    {%- endfor %}
+    <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+    <!--[if lt IE 9]>
+      <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+    <![endif]-->
+    {%- if not embedded %}
+        <script type="text/javascript">
+            var DOCUMENTATION_OPTIONS = {
+                URL_ROOT:'{{ url_root }}',
+                VERSION:'{{ release|e }}',
+                COLLAPSE_INDEX:false,
+                FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
+                HAS_SOURCE:  {{ has_source|lower }}
+            };
+        </script>
+        {%- for scriptfile in script_files + ["_static/bootstrap-dropdown.js"] %}
+            <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
+        {%- endfor %}
+
+        {%- if use_opensearch %}
+            <link rel="search" type="application/opensearchdescription+xml"
+                  title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
+                  href="{{ pathto('_static/opensearch.xml', 1) }}"/>
+        {%- endif %}
+        {%- if favicon %}
+            <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
+        {%- endif %}
+    {%- endif %}
+
+    {%- block extrahead %} {% endblock %}
+    <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
+    {% if theme_analytics_code %}
+        <!-- analytics -->
+        <script type="text/javascript">
+            var _gaq = _gaq || [];
+            _gaq.push(['_setAccount', '{{ theme_analytics_code }}']);
+            {% if theme_analytics_domain %}
+                _gaq.push(['_setDomainName', '{{ theme_analytics_domain }}']);
+            {% endif %}
+            _gaq.push(['_trackPageview']);
+
+            (function () {
+                var ga = document.createElement('script');
+                ga.type = 'text/javascript';
+                ga.async = true;
+                ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+                var s = document.getElementsByTagName('script')[0];
+                s.parentNode.insertBefore(ga, s);
+            })();
+        </script>
+    {% endif %}
+</head>
+<body>
+
+
+{%- block header %}
+
+    <div class="navbar navbar-static-top">
+        <div class="navbar-inner">
+            <div class="container">
+
+                {%- block headerlogo %}
+                    {%- if logo %}
+                        <a href="{{ pathto('index') }}">
+                            <img class="logo" src="{{ pathto('_static/' + logo, 1) }}"
+                            {% if theme_logo_width %} width="{{ theme_logo_width }}"{% endif %}
+                            {% if theme_logo_height %} height="{{ theme_logo_height }}"{% endif %}
+                            alt="{{ project|e }}" title="{{ project|e }}"/>
+                        </a>
+                    {%- else %}
+{#                        <a class="brand" href="./index.html">Bootstrap</a>#}
+                    {%- endif %}
+                {%- endblock %}
+
+                {%- block relbar1 %}{{ relbar() }}{% endblock %}
+
+
+                <ul class="quick-links">
+                    <li>
+                        <a href="{{ pathto('docs') }}" title="Documentation">Docs</a> 
+                    </li>
+                    <li class="divider">·</li>
+                    <li>
+                        <a href="https://github.com/{{ theme_github_user }}/{{ theme_github_repo }}/">github</a>
+                    </li>
+                    <li class="divider">·</li>
+                    <li>
+                        <a href="https://github.com/{{ theme_github_user }}/{{ theme_github_repo }}/issues">Bugs</a>
+                    </li>
+                    <li class="divider">·</li>
+                    <li>
+                        <a href="{{ pathto('faq') }}" title="FAQ">FAQ</a> 
+                    </li>
+                    <li class="divider">·</li>
+
+                    <li>
+                        <a href="{{ pathto('download') }}" title="Home">Download</a>
+                    </li>
+                    <li class="divider">·</li>
+
+                    <li>
+                        <a href="{{ pathto('community') }}" title="Mailing Lists">Mailing Lists</a>
+                    </li>
+
+                </ul>
+
+            </div>
+        </div>
+    </div>
+{% endblock %}
+
+{%- block content %}
+    {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}
+    <div class="container">
+        <div class="content row">
+            {%- block document %}
+                <div class="span9">
+                    {% block body %} {% endblock %}
+                    {% if theme_disqus_shortname %}
+                        <div id="disqus_thread"></div>
+                        <noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
+                    {% endif %}
+                </div>
+            {%- endblock %}
+            {%- block sidebar2 %}
+                <div class="span3">
+                    {{ sidebar() }}
+                </div>
+            {% endblock %}
+        </div>
+    </div>
+{%- endblock %}
+
+{%- block footer %}
+    <div class="footer">
+        {#        {%- block relbar2 %}{{ relbar(bottom=True) }}{% endblock %}#}
+        <div class="container">
+            {%- if show_copyright %}
+                {%- if hasdoc('copyright') %}
+                    {% trans path=pathto('copyright'), copyright=copyright|e %}©
+                        <a href="{{ path }}">Copyright</a> {{ copyright }}
+                        .{% endtrans %}
+                {%- else %}
+                    {% trans copyright=copyright|e %}©
+                        Copyright {{ copyright }}.{% endtrans %}
+                {%- endif %}
+            {%- endif %}
+            {%- if last_updated %}
+                {% trans last_updated=last_updated|e %}Last updated
+                    on {{ last_updated }}.{% endtrans %}
+            {%- endif %}
+        </div>
+    </div>
+{%- endblock %}
+
+{% if theme_disqus_shortname %}
+    <!-- disqus -->
+    <script type="text/javascript">
+        var disqus_title = '{{ title|striptags|e }}{{ titlesuffix }}';
+        var disqus_identifier ='code' + '.' + "{{ theme_disqus_shortname }}" + window.location.pathname.replace('/', '.');
+    </script>
+
+    <script type="text/javascript">
+        /* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
+        var disqus_shortname = "{{ theme_disqus_shortname }}"; // required: replace example with your forum shortname
+
+        /* * * DON'T EDIT BELOW THIS LINE * * */
+        (function() {
+            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+            dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
+            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+        })();
+    </script>
+{% endif %}
+
+<script type="text/javascript">
+    $('.nav .active').on('click', function () {
+        e.preventDefault()
+        $(this).siblings().toggle()
+    });
+</script>
+
+<!-- plusone -->
+<script type="text/javascript">
+    (function () {
+        var po = document.createElement('script');
+        po.type = 'text/javascript';
+        po.async = true;
+        po.src = 'https://apis.google.com/js/plusone.js';
+        var s = document.getElementsByTagName('script')[0];
+        s.parentNode.insertBefore(po, s);
+    })();
+</script>
+
+<!-- twitter -->
+<script src="http://platform.twitter.com/widgets.js" type="text/javascript"></script>
+
+</body>
+</html>
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.css b/doc/_themes/bootstrap/static/bootstrap-default.css
new file mode 100644
index 0000000..0664207
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-default.css
@@ -0,0 +1,5624 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+
+audio:not([controls]) {
+  display: none;
+}
+
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+      -ms-text-size-adjust: 100%;
+}
+
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+a:hover,
+a:active {
+  outline: 0;
+}
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+img {
+  height: auto;
+  max-width: 100%;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+
+#map_canvas img {
+  max-width: none;
+}
+
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+     -moz-box-sizing: content-box;
+          box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+
+a {
+  color: #0088cc;
+  text-decoration: none;
+}
+
+a:hover {
+  color: #005580;
+  text-decoration: underline;
+}
+
+.img-rounded {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+
+.img-circle {
+  -webkit-border-radius: 500px;
+     -moz-border-radius: 500px;
+          border-radius: 500px;
+}
+
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+
+.row:before,
+.row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row:after {
+  clear: both;
+}
+
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.span12 {
+  width: 940px;
+}
+
+.span11 {
+  width: 860px;
+}
+
+.span10 {
+  width: 780px;
+}
+
+.span9 {
+  width: 700px;
+}
+
+.span8 {
+  width: 620px;
+}
+
+.span7 {
+  width: 540px;
+}
+
+.span6 {
+  width: 460px;
+}
+
+.span5 {
+  width: 380px;
+}
+
+.span4 {
+  width: 300px;
+}
+
+.span3 {
+  width: 220px;
+}
+
+.span2 {
+  width: 140px;
+}
+
+.span1 {
+  width: 60px;
+}
+
+.offset12 {
+  margin-left: 980px;
+}
+
+.offset11 {
+  margin-left: 900px;
+}
+
+.offset10 {
+  margin-left: 820px;
+}
+
+.offset9 {
+  margin-left: 740px;
+}
+
+.offset8 {
+  margin-left: 660px;
+}
+
+.offset7 {
+  margin-left: 580px;
+}
+
+.offset6 {
+  margin-left: 500px;
+}
+
+.offset5 {
+  margin-left: 420px;
+}
+
+.offset4 {
+  margin-left: 340px;
+}
+
+.offset3 {
+  margin-left: 260px;
+}
+
+.offset2 {
+  margin-left: 180px;
+}
+
+.offset1 {
+  margin-left: 100px;
+}
+
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.row-fluid:after {
+  clear: both;
+}
+
+.row-fluid [class*="span"] {
+  display: block;
+  float: left;
+  width: 100%;
+  min-height: 30px;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+
+.container:before,
+.container:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container:after {
+  clear: both;
+}
+
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.container-fluid:after {
+  clear: both;
+}
+
+p {
+  margin: 0 0 10px;
+}
+
+.lead {
+  margin-bottom: 20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 30px;
+}
+
+small {
+  font-size: 85%;
+}
+
+strong {
+  font-weight: bold;
+}
+
+em {
+  font-style: italic;
+}
+
+cite {
+  font-style: normal;
+}
+
+.muted {
+  color: #999999;
+}
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 1;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+
+h1 {
+  font-size: 36px;
+  line-height: 40px;
+}
+
+h2 {
+  font-size: 30px;
+  line-height: 40px;
+}
+
+h3 {
+  font-size: 24px;
+  line-height: 40px;
+}
+
+h4 {
+  font-size: 18px;
+  line-height: 20px;
+}
+
+h5 {
+  font-size: 14px;
+  line-height: 20px;
+}
+
+h6 {
+  font-size: 12px;
+  line-height: 20px;
+}
+
+h1 small {
+  font-size: 24px;
+}
+
+h2 small {
+  font-size: 18px;
+}
+
+h3 small {
+  font-size: 14px;
+}
+
+h4 small {
+  font-size: 14px;
+}
+
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+
+li {
+  line-height: 20px;
+}
+
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+
+dl {
+  margin-bottom: 20px;
+}
+
+dt,
+dd {
+  line-height: 20px;
+}
+
+dt {
+  font-weight: bold;
+}
+
+dd {
+  margin-left: 10px;
+}
+
+.dl-horizontal dt {
+  float: left;
+  width: 120px;
+  overflow: hidden;
+  clear: left;
+  text-align: right;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.dl-horizontal dd {
+  margin-left: 130px;
+}
+
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 25px;
+}
+
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+
+blockquote.pull-right small:before {
+  content: '';
+}
+
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+
+form {
+  margin: 0 0 20px;
+}
+
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+input,
+textarea {
+  width: 210px;
+}
+
+textarea {
+  height: auto;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
+     -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
+       -o-transition: border linear 0.2s, box-shadow linear 0.2s;
+          transition: border linear 0.2s, box-shadow linear 0.2s;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9;
+  *margin-top: 0;
+  line-height: normal;
+  cursor: pointer;
+}
+
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+
+select {
+  width: 220px;
+  background-color: #ffffff;
+  border: 1px solid #bbb;
+}
+
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  cursor: not-allowed;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+}
+
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+
+.input-mini {
+  width: 60px;
+}
+
+.input-small {
+  width: 90px;
+}
+
+.input-medium {
+  width: 150px;
+}
+
+.input-large {
+  width: 210px;
+}
+
+.input-xlarge {
+  width: 270px;
+}
+
+.input-xxlarge {
+  width: 530px;
+}
+
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+
+input.span12,
+textarea.span12,
+.uneditable-input.span12 {
+  width: 926px;
+}
+
+input.span11,
+textarea.span11,
+.uneditable-input.span11 {
+  width: 846px;
+}
+
+input.span10,
+textarea.span10,
+.uneditable-input.span10 {
+  width: 766px;
+}
+
+input.span9,
+textarea.span9,
+.uneditable-input.span9 {
+  width: 686px;
+}
+
+input.span8,
+textarea.span8,
+.uneditable-input.span8 {
+  width: 606px;
+}
+
+input.span7,
+textarea.span7,
+.uneditable-input.span7 {
+  width: 526px;
+}
+
+input.span6,
+textarea.span6,
+.uneditable-input.span6 {
+  width: 446px;
+}
+
+input.span5,
+textarea.span5,
+.uneditable-input.span5 {
+  width: 366px;
+}
+
+input.span4,
+textarea.span4,
+.uneditable-input.span4 {
+  width: 286px;
+}
+
+input.span3,
+textarea.span3,
+.uneditable-input.span3 {
+  width: 206px;
+}
+
+input.span2,
+textarea.span2,
+.uneditable-input.span2 {
+  width: 126px;
+}
+
+input.span1,
+textarea.span1,
+.uneditable-input.span1 {
+  width: 46px;
+}
+
+.controls-row {
+  *zoom: 1;
+}
+
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.controls-row:after {
+  clear: both;
+}
+
+.controls-row [class*="span"] {
+  float: left;
+}
+
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.warning .checkbox:focus,
+.control-group.warning .radio:focus,
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.error .checkbox:focus,
+.control-group.error .radio:focus,
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.control-group.success .checkbox:focus,
+.control-group.success .radio:focus,
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+     -moz-box-shadow: 0 0 6px #f8b9b7;
+          box-shadow: 0 0 6px #f8b9b7;
+}
+
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-actions:after {
+  clear: both;
+}
+
+.help-block,
+.help-inline {
+  color: #595959;
+}
+
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  padding-left: 5px;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap;
+}
+
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  font-size: 14px;
+  vertical-align: top;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn {
+  margin-left: -1px;
+  vertical-align: top;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+/* Allow for input prepend/append in search forms */
+
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+     -moz-border-radius: 0 14px 14px 0;
+          border-radius: 0 14px 14px 0;
+}
+
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+     -moz-border-radius: 14px 0 0 14px;
+          border-radius: 14px 0 0 14px;
+}
+
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  vertical-align: middle;
+  *zoom: 1;
+}
+
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+
+.control-group {
+  margin-bottom: 10px;
+}
+
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.form-horizontal .control-group:after {
+  clear: both;
+}
+
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 160px;
+  *margin-left: 0;
+}
+
+.form-horizontal .controls:first-child {
+  *padding-left: 160px;
+}
+
+.form-horizontal .help-block {
+  margin-top: 10px;
+  margin-bottom: 0;
+}
+
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+
+.table th {
+  font-weight: bold;
+}
+
+.table thead th {
+  vertical-align: bottom;
+}
+
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child,
+.table-bordered tfoot:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+     -moz-border-radius: 0 0 0 4px;
+          border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child,
+.table-bordered tfoot:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -moz-border-right-topleft: 4px;
+}
+
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+
+.table-hover tbody tr:hover td,
+.table-hover tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+
+table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+
+table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+
+table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+
+table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+
+table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+
+table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+
+table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+
+table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+
+table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+
+table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+
+table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+
+table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+
+.table tbody tr.success td {
+  background-color: #dff0d8;
+}
+
+.table tbody tr.error td {
+  background-color: #f2dede;
+}
+
+.table tbody tr.info td {
+  background-color: #d9edf7;
+}
+
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  margin-top: 1px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+}
+
+/* White icons with optional class, or on hover/active states of certain elements */
+
+.icon-white,
+.nav > .active > a > [class^="icon-"],
+.nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+
+.icon-glass {
+  background-position: 0      0;
+}
+
+.icon-music {
+  background-position: -24px 0;
+}
+
+.icon-search {
+  background-position: -48px 0;
+}
+
+.icon-envelope {
+  background-position: -72px 0;
+}
+
+.icon-heart {
+  background-position: -96px 0;
+}
+
+.icon-star {
+  background-position: -120px 0;
+}
+
+.icon-star-empty {
+  background-position: -144px 0;
+}
+
+.icon-user {
+  background-position: -168px 0;
+}
+
+.icon-film {
+  background-position: -192px 0;
+}
+
+.icon-th-large {
+  background-position: -216px 0;
+}
+
+.icon-th {
+  background-position: -240px 0;
+}
+
+.icon-th-list {
+  background-position: -264px 0;
+}
+
+.icon-ok {
+  background-position: -288px 0;
+}
+
+.icon-remove {
+  background-position: -312px 0;
+}
+
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+
+.icon-off {
+  background-position: -384px 0;
+}
+
+.icon-signal {
+  background-position: -408px 0;
+}
+
+.icon-cog {
+  background-position: -432px 0;
+}
+
+.icon-trash {
+  background-position: -456px 0;
+}
+
+.icon-home {
+  background-position: 0 -24px;
+}
+
+.icon-file {
+  background-position: -24px -24px;
+}
+
+.icon-time {
+  background-position: -48px -24px;
+}
+
+.icon-road {
+  background-position: -72px -24px;
+}
+
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+
+.icon-download {
+  background-position: -120px -24px;
+}
+
+.icon-upload {
+  background-position: -144px -24px;
+}
+
+.icon-inbox {
+  background-position: -168px -24px;
+}
+
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+
+.icon-repeat {
+  background-position: -216px -24px;
+}
+
+.icon-refresh {
+  background-position: -240px -24px;
+}
+
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+
+.icon-lock {
+  background-position: -287px -24px;
+}
+
+.icon-flag {
+  background-position: -312px -24px;
+}
+
+.icon-headphones {
+  background-position: -336px -24px;
+}
+
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+
+.icon-barcode {
+  background-position: -456px -24px;
+}
+
+.icon-tag {
+  background-position: 0 -48px;
+}
+
+.icon-tags {
+  background-position: -25px -48px;
+}
+
+.icon-book {
+  background-position: -48px -48px;
+}
+
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+
+.icon-print {
+  background-position: -96px -48px;
+}
+
+.icon-camera {
+  background-position: -120px -48px;
+}
+
+.icon-font {
+  background-position: -144px -48px;
+}
+
+.icon-bold {
+  background-position: -167px -48px;
+}
+
+.icon-italic {
+  background-position: -192px -48px;
+}
+
+.icon-text-height {
+  background-position: -216px -48px;
+}
+
+.icon-text-width {
+  background-position: -240px -48px;
+}
+
+.icon-align-left {
+  background-position: -264px -48px;
+}
+
+.icon-align-center {
+  background-position: -288px -48px;
+}
+
+.icon-align-right {
+  background-position: -312px -48px;
+}
+
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+
+.icon-list {
+  background-position: -360px -48px;
+}
+
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+
+.icon-picture {
+  background-position: -456px -48px;
+}
+
+.icon-pencil {
+  background-position: 0 -72px;
+}
+
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+
+.icon-adjust {
+  background-position: -48px -72px;
+}
+
+.icon-tint {
+  background-position: -72px -72px;
+}
+
+.icon-edit {
+  background-position: -96px -72px;
+}
+
+.icon-share {
+  background-position: -120px -72px;
+}
+
+.icon-check {
+  background-position: -144px -72px;
+}
+
+.icon-move {
+  background-position: -168px -72px;
+}
+
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+
+.icon-backward {
+  background-position: -240px -72px;
+}
+
+.icon-play {
+  background-position: -264px -72px;
+}
+
+.icon-pause {
+  background-position: -288px -72px;
+}
+
+.icon-stop {
+  background-position: -312px -72px;
+}
+
+.icon-forward {
+  background-position: -336px -72px;
+}
+
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+
+.icon-eject {
+  background-position: -408px -72px;
+}
+
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+
+.icon-plus {
+  background-position: -408px -96px;
+}
+
+.icon-minus {
+  background-position: -433px -96px;
+}
+
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+
+.icon-gift {
+  background-position: -24px -120px;
+}
+
+.icon-leaf {
+  background-position: -48px -120px;
+}
+
+.icon-fire {
+  background-position: -72px -120px;
+}
+
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+
+.icon-plane {
+  background-position: -168px -120px;
+}
+
+.icon-calendar {
+  background-position: -192px -120px;
+}
+
+.icon-random {
+  width: 16px;
+  background-position: -216px -120px;
+}
+
+.icon-comment {
+  background-position: -240px -120px;
+}
+
+.icon-magnet {
+  background-position: -264px -120px;
+}
+
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+
+.icon-retweet {
+  background-position: -336px -120px;
+}
+
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+
+.icon-folder-open {
+  width: 16px;
+  background-position: -408px -120px;
+}
+
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+
+.icon-hdd {
+  background-position: 0 -144px;
+}
+
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+
+.icon-bell {
+  background-position: -48px -144px;
+}
+
+.icon-certificate {
+  background-position: -72px -144px;
+}
+
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+
+.icon-globe {
+  background-position: -336px -144px;
+}
+
+.icon-wrench {
+  background-position: -360px -144px;
+}
+
+.icon-tasks {
+  background-position: -384px -144px;
+}
+
+.icon-filter {
+  background-position: -408px -144px;
+}
+
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.dropdown-menu a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+  background-color: #0081c2;
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  background-color: #0088cc;
+  background-color: #0081c2;
+  background-image: linear-gradient(to bottom, #0088cc, #0077b3);
+  background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
+  background-image: -o-linear-gradient(top, #0088cc, #0077b3);
+  background-repeat: repeat-x;
+  outline: 0;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
+}
+
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: #999999;
+}
+
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.open {
+  *z-index: 1000;
+}
+
+.open > .dropdown-menu {
+  display: block;
+}
+
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "\2191";
+}
+
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+
+.dropdown-submenu {
+  position: relative;
+}
+
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+     -moz-border-radius: 0 6px 6px 6px;
+          border-radius: 0 6px 6px 6px;
+}
+
+.dropdown-submenu:hover .dropdown-menu {
+  display: block;
+}
+
+.dropdown-submenu > a:after {
+  display: block;
+  float: right;
+  width: 0;
+  height: 0;
+  margin-top: 5px;
+  margin-right: -10px;
+  border-color: transparent;
+  border-left-color: #cccccc;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  content: " ";
+}
+
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+
+.dropdown .dropdown-menu .nav-header {
+  padding-right: 20px;
+  padding-left: 20px;
+}
+
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+     -moz-transition: opacity 0.15s linear;
+       -o-transition: opacity 0.15s linear;
+          transition: opacity 0.15s linear;
+}
+
+.fade.in {
+  opacity: 1;
+}
+
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  overflow: visible \9;
+  -webkit-transition: height 0.35s ease;
+     -moz-transition: height 0.35s ease;
+       -o-transition: height 0.35s ease;
+          transition: height 0.35s ease;
+}
+
+.collapse.in {
+  height: auto;
+}
+
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+
+.btn {
+  display: inline-block;
+  *display: inline;
+  padding: 4px 14px;
+  margin-bottom: 0;
+  *margin-left: .3em;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  color: #333333;
+  text-align: center;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  vertical-align: middle;
+  cursor: pointer;
+  background-color: #f5f5f5;
+  *background-color: #e6e6e6;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+
+.btn:first-child {
+  *margin-left: 0;
+}
+
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+     -moz-transition: background-position 0.1s linear;
+       -o-transition: background-position 0.1s linear;
+          transition: background-position 0.1s linear;
+}
+
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+
+.btn.active,
+.btn:active {
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #e6e6e6;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-large {
+  padding: 9px 14px;
+  font-size: 16px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+
+.btn-small {
+  padding: 3px 9px;
+  font-size: 12px;
+  line-height: 18px;
+}
+
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 16px;
+}
+
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+
+.btn {
+  border-color: #c5c5c5;
+  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+}
+
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #006dcc;
+  *background-color: #0044cc;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
+  background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
+  background-image: -o-linear-gradient(top, #0088cc, #0044cc);
+  background-image: linear-gradient(to bottom, #0088cc, #0044cc);
+  background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
+  background-repeat: repeat-x;
+  border-color: #0044cc #0044cc #002a80;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0044cc;
+  *background-color: #003bb3;
+}
+
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #003399 \9;
+}
+
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  *background-color: #f89406;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  *background-color: #bd362f;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  *background-color: #51a351;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-repeat: repeat-x;
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  *background-color: #2f96b4;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  *background-color: #222222;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-repeat: repeat-x;
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+
+.btn-link,
+.btn-link:active {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+     -moz-box-shadow: none;
+          box-shadow: none;
+}
+
+.btn-link {
+  color: #0088cc;
+  cursor: pointer;
+  border-color: transparent;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-link:hover {
+  color: #005580;
+  text-decoration: underline;
+  background-color: transparent;
+}
+
+.btn-group {
+  position: relative;
+  *margin-left: .3em;
+  font-size: 0;
+  white-space: nowrap;
+}
+
+.btn-group:first-child {
+  *margin-left: 0;
+}
+
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-toolbar {
+  margin-top: 10px;
+  margin-bottom: 10px;
+  font-size: 0;
+}
+
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-toolbar .btn + .btn,
+.btn-toolbar .btn-group + .btn,
+.btn-toolbar .btn + .btn-group {
+  margin-left: 5px;
+}
+
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: 14px;
+}
+
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-bottom-left-radius: 6px;
+          border-bottom-left-radius: 6px;
+  -webkit-border-top-left-radius: 6px;
+          border-top-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  -moz-border-radius-topleft: 6px;
+}
+
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+          border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+          border-bottom-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  -moz-border-radius-bottomright: 6px;
+}
+
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+.btn-group > .btn + .dropdown-toggle {
+  *padding-top: 5px;
+  padding-right: 8px;
+  *padding-bottom: 5px;
+  padding-left: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group > .btn-mini + .dropdown-toggle {
+  *padding-top: 2px;
+  padding-right: 5px;
+  *padding-bottom: 2px;
+  padding-left: 5px;
+}
+
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+
+.btn-group > .btn-large + .dropdown-toggle {
+  *padding-top: 7px;
+  padding-right: 12px;
+  *padding-bottom: 7px;
+  padding-left: 12px;
+}
+
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0044cc;
+}
+
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+
+.btn-large .caret {
+  border-top-width: 5px;
+  border-right-width: 5px;
+  border-left-width: 5px;
+}
+
+.dropup .btn-large .caret {
+  border-top: 0;
+  border-bottom: 5px solid #000000;
+}
+
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.btn-group-vertical .btn + .btn {
+  margin-top: -1px;
+  margin-left: 0;
+}
+
+.btn-group-vertical .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.btn-group-vertical .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.btn-group-vertical .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+     -moz-border-radius: 6px 6px 0 0;
+          border-radius: 6px 6px 0 0;
+}
+
+.btn-group-vertical .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  color: #c09853;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.alert h4 {
+  margin: 0;
+}
+
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+
+.alert-success {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+}
+
+.alert-danger,
+.alert-error {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #eed3d7;
+}
+
+.alert-info {
+  color: #3a87ad;
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+}
+
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+
+.alert-block p + p {
+  margin-top: 5px;
+}
+
+.nav {
+  margin-bottom: 20px;
+  margin-left: 0;
+  list-style: none;
+}
+
+.nav > li > a {
+  display: block;
+}
+
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+
+.nav > .pull-right {
+  float: right;
+}
+
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+
+.nav-list {
+  padding-right: 15px;
+  padding-left: 15px;
+  margin-bottom: 0;
+}
+
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-right: -15px;
+  margin-left: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0088cc;
+}
+
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+     -moz-border-radius: 4px 4px 0 0;
+          border-radius: 4px 4px 0 0;
+}
+
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  cursor: default;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+}
+
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+     -moz-border-radius: 5px;
+          border-radius: 5px;
+}
+
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #ffffff;
+  background-color: #0088cc;
+}
+
+.nav-stacked > li {
+  float: none;
+}
+
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+          border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+          border-top-left-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+          border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+          border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+
+.nav-tabs.nav-stacked > li > a:hover {
+  z-index: 2;
+  border-color: #ddd;
+}
+
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+}
+
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.nav .dropdown-toggle .caret {
+  margin-top: 6px;
+  border-top-color: #0088cc;
+  border-bottom-color: #0088cc;
+}
+
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: #005580;
+  border-bottom-color: #005580;
+}
+
+/* move down carets for tabs */
+
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+
+.tabbable {
+  *zoom: 1;
+}
+
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.tabbable:after {
+  clear: both;
+}
+
+.tab-content {
+  overflow: auto;
+}
+
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+     -moz-border-radius: 0 0 4px 4px;
+          border-radius: 0 0 4px 4px;
+}
+
+.tabs-below > .nav-tabs > li > a:hover {
+  border-top-color: #ddd;
+  border-bottom-color: transparent;
+}
+
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+     -moz-border-radius: 4px 0 0 4px;
+          border-radius: 4px 0 0 4px;
+}
+
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+     -moz-border-radius: 0 4px 4px 0;
+          border-radius: 0 4px 4px 0;
+}
+
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+
+.nav > .disabled > a {
+  color: #999999;
+}
+
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  cursor: default;
+  background-color: transparent;
+}
+
+.navbar {
+  *position: relative;
+  *z-index: 2;
+  margin-bottom: 20px;
+  overflow: visible;
+  color: #555555;
+}
+
+.navbar-inner {
+  min-height: 40px;
+  padding-right: 20px;
+  padding-left: 20px;
+  background-color: #fafafa;
+  background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
+  background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
+  background-repeat: repeat-x;
+  border: 1px solid #d4d4d4;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+     -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+          box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+
+.navbar .container {
+  width: auto;
+}
+
+.nav-collapse.collapse {
+  height: auto;
+}
+
+.navbar .brand {
+  display: block;
+  float: left;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #555555;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .brand:hover {
+  text-decoration: none;
+}
+
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+}
+
+.navbar-link {
+  color: #555555;
+}
+
+.navbar-link:hover {
+  color: #333333;
+}
+
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-right: 1px solid #ffffff;
+  border-left: 1px solid #f2f2f2;
+}
+
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 6px;
+}
+
+.navbar .btn-group .btn {
+  margin: 0;
+}
+
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.navbar-form:after {
+  clear: both;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+
+.navbar-search .search-query {
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0;
+}
+
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-right: 0;
+  padding-left: 0;
+  -webkit-border-radius: 0;
+     -moz-border-radius: 0;
+          border-radius: 0;
+}
+
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+
+.navbar-fixed-top {
+  top: 0;
+}
+
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
+}
+
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+
+.navbar .nav.pull-right {
+  float: right;
+}
+
+.navbar .nav > li {
+  float: left;
+}
+
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #555555;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: transparent;
+}
+
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #555555;
+  text-decoration: none;
+  background-color: #e5e5e5;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+     -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+          box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-right: 5px;
+  margin-left: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #ededed;
+  *background-color: #e5e5e5;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
+  background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
+  background-repeat: repeat-x;
+  border-color: #e5e5e5 #e5e5e5 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+     -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+          box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
+}
+
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #e5e5e5;
+  *background-color: #d9d9d9;
+}
+
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #cccccc \9;
+}
+
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+     -moz-border-radius: 1px;
+          border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+     -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+          box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+
+.navbar .nav > li > .dropdown-menu:before {
+  position: absolute;
+  top: -7px;
+  left: 9px;
+  display: inline-block;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-left: 7px solid transparent;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  content: '';
+}
+
+.navbar .nav > li > .dropdown-menu:after {
+  position: absolute;
+  top: -6px;
+  left: 10px;
+  display: inline-block;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  border-left: 6px solid transparent;
+  content: '';
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  top: auto;
+  bottom: -7px;
+  border-top: 7px solid #ccc;
+  border-bottom: 0;
+  border-top-color: rgba(0, 0, 0, 0.2);
+}
+
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  top: auto;
+  bottom: -6px;
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #555555;
+  background-color: #e5e5e5;
+}
+
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  right: 12px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  right: 13px;
+  left: auto;
+}
+
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  right: 100%;
+  left: auto;
+  margin-right: -1px;
+  margin-left: 0;
+  -webkit-border-radius: 6px 0 6px 6px;
+     -moz-border-radius: 6px 0 6px 6px;
+          border-radius: 6px 0 6px 6px;
+}
+
+.navbar-inverse {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  border-color: #252525;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+}
+
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+  background-color: transparent;
+}
+
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+
+.navbar-inverse .divider-vertical {
+  border-right-color: #222222;
+  border-left-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  color: #ffffff;
+  background-color: #111111;
+}
+
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
+  -webkit-transition: none;
+     -moz-transition: none;
+       -o-transition: none;
+          transition: none;
+}
+
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  outline: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+          box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+}
+
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  *background-color: #040404;
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-repeat: repeat-x;
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+}
+
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.breadcrumb li {
+  display: inline-block;
+  *display: inline;
+  text-shadow: 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+
+.breadcrumb .active {
+  color: #999999;
+}
+
+.pagination {
+  height: 40px;
+  margin: 20px 0;
+}
+
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  margin-bottom: 0;
+  margin-left: 0;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+  *zoom: 1;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+     -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+          box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.pagination li {
+  display: inline;
+}
+
+.pagination a,
+.pagination span {
+  float: left;
+  padding: 0 14px;
+  line-height: 38px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+
+.pagination a:hover,
+.pagination .active a,
+.pagination .active span {
+  background-color: #f5f5f5;
+}
+
+.pagination .active a,
+.pagination .active span {
+  color: #999999;
+  cursor: default;
+}
+
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  cursor: default;
+  background-color: transparent;
+}
+
+.pagination li:first-child a,
+.pagination li:first-child span {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+     -moz-border-radius: 3px 0 0 3px;
+          border-radius: 3px 0 0 3px;
+}
+
+.pagination li:last-child a,
+.pagination li:last-child span {
+  -webkit-border-radius: 0 3px 3px 0;
+     -moz-border-radius: 0 3px 3px 0;
+          border-radius: 0 3px 3px 0;
+}
+
+.pagination-centered {
+  text-align: center;
+}
+
+.pagination-right {
+  text-align: right;
+}
+
+.pager {
+  margin: 20px 0;
+  text-align: center;
+  list-style: none;
+  *zoom: 1;
+}
+
+.pager:before,
+.pager:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.pager:after {
+  clear: both;
+}
+
+.pager li {
+  display: inline;
+}
+
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+     -moz-border-radius: 15px;
+          border-radius: 15px;
+}
+
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+
+.pager .next a {
+  float: right;
+}
+
+.pager .previous a {
+  float: left;
+}
+
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: #999999;
+  cursor: default;
+  background-color: #fff;
+}
+
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+
+.modal-open .popover {
+  z-index: 2060;
+}
+
+.modal-open .tooltip {
+  z-index: 2080;
+}
+
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+
+.modal-backdrop.fade {
+  opacity: 0;
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  overflow: auto;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+     -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding-box;
+          background-clip: padding-box;
+}
+
+.modal.fade {
+  top: -25%;
+  -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
+     -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
+       -o-transition: opacity 0.3s linear, top 0.3s ease-out;
+          transition: opacity 0.3s linear, top 0.3s ease-out;
+}
+
+.modal.fade.in {
+  top: 50%;
+}
+
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+
+.modal-header .close {
+  margin-top: 2px;
+}
+
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+
+.modal-body {
+  max-height: 400px;
+  padding: 15px;
+  overflow-y: auto;
+}
+
+.modal-form {
+  margin-bottom: 0;
+}
+
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+     -moz-border-radius: 0 0 6px 6px;
+          border-radius: 0 0 6px 6px;
+  *zoom: 1;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+     -moz-box-shadow: inset 0 1px 0 #ffffff;
+          box-shadow: inset 0 1px 0 #ffffff;
+}
+
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.modal-footer:after {
+  clear: both;
+}
+
+.modal-footer .btn + .btn {
+  margin-bottom: 0;
+  margin-left: 5px;
+}
+
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+  visibility: visible;
+}
+
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+
+.tooltip.top {
+  margin-top: -3px;
+}
+
+.tooltip.right {
+  margin-left: 3px;
+}
+
+.tooltip.bottom {
+  margin-top: 3px;
+}
+
+.tooltip.left {
+  margin-left: -3px;
+}
+
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-top-color: #000000;
+  border-width: 5px 5px 0;
+}
+
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-right-color: #000000;
+  border-width: 5px 5px 5px 0;
+}
+
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-left-color: #000000;
+  border-width: 5px 0 5px 5px;
+}
+
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-bottom-color: #000000;
+  border-width: 0 5px 5px;
+}
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+     -moz-background-clip: padding;
+          background-clip: padding-box;
+}
+
+.popover.top {
+  margin-bottom: 10px;
+}
+
+.popover.right {
+  margin-left: 10px;
+}
+
+.popover.bottom {
+  margin-top: 10px;
+}
+
+.popover.left {
+  margin-right: 10px;
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+     -moz-border-radius: 5px 5px 0 0;
+          border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
+
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+
+.popover .arrow:after {
+  z-index: -1;
+  content: "";
+}
+
+.popover.top .arrow {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-top-color: #ffffff;
+  border-width: 10px 10px 0;
+}
+
+.popover.top .arrow:after {
+  bottom: -1px;
+  left: -11px;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 0;
+}
+
+.popover.right .arrow {
+  top: 50%;
+  left: -10px;
+  margin-top: -10px;
+  border-right-color: #ffffff;
+  border-width: 10px 10px 10px 0;
+}
+
+.popover.right .arrow:after {
+  bottom: -11px;
+  left: -1px;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 11px 11px 0;
+}
+
+.popover.bottom .arrow {
+  top: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-bottom-color: #ffffff;
+  border-width: 0 10px 10px;
+}
+
+.popover.bottom .arrow:after {
+  top: -1px;
+  left: -11px;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  border-width: 0 11px 11px;
+}
+
+.popover.left .arrow {
+  top: 50%;
+  right: -10px;
+  margin-top: -10px;
+  border-left-color: #ffffff;
+  border-width: 10px 0 10px 10px;
+}
+
+.popover.left .arrow:after {
+  right: -1px;
+  bottom: -11px;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  border-width: 11px 0 11px 11px;
+}
+
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.thumbnails:after {
+  clear: both;
+}
+
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+     -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+          box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+     -moz-transition: all 0.2s ease-in-out;
+       -o-transition: all 0.2s ease-in-out;
+          transition: all 0.2s ease-in-out;
+}
+
+a.thumbnail:hover {
+  border-color: #0088cc;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+     -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+          box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-right: auto;
+  margin-left: auto;
+}
+
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+
+.label,
+.badge {
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  white-space: nowrap;
+  vertical-align: baseline;
+  background-color: #999999;
+}
+
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+     -moz-border-radius: 3px;
+          border-radius: 3px;
+}
+
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+     -moz-border-radius: 9px;
+          border-radius: 9px;
+}
+
+a.label:hover,
+a.badge:hover {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+
+ at -webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+ at -o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+
+ at keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+
+.progress {
+  height: 20px;
+  margin-bottom: 20px;
+  overflow: hidden;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+     -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+          box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.progress .bar {
+  float: left;
+  width: 0;
+  height: 100%;
+  font-size: 12px;
+  color: #ffffff;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+     -moz-transition: width 0.6s ease;
+       -o-transition: width 0.6s ease;
+          transition: width 0.6s ease;
+}
+
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+     -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+          box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+}
+
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+     -moz-background-size: 40px 40px;
+       -o-background-size: 40px 40px;
+          background-size: 40px 40px;
+}
+
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+     -moz-animation: progress-bar-stripes 2s linear infinite;
+      -ms-animation: progress-bar-stripes 2s linear infinite;
+       -o-animation: progress-bar-stripes 2s linear infinite;
+          animation: progress-bar-stripes 2s linear infinite;
+}
+
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+
+.accordion {
+  margin-bottom: 20px;
+}
+
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+     -moz-border-radius: 4px;
+          border-radius: 4px;
+}
+
+.accordion-heading {
+  border-bottom: 0;
+}
+
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+
+.accordion-toggle {
+  cursor: pointer;
+}
+
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+}
+
+.carousel .item {
+  position: relative;
+  display: none;
+  -webkit-transition: 0.6s ease-in-out left;
+     -moz-transition: 0.6s ease-in-out left;
+       -o-transition: 0.6s ease-in-out left;
+          transition: 0.6s ease-in-out left;
+}
+
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+
+.carousel .active {
+  left: 0;
+}
+
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.carousel .next {
+  left: 100%;
+}
+
+.carousel .prev {
+  left: -100%;
+}
+
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+
+.carousel .active.left {
+  left: -100%;
+}
+
+.carousel .active.right {
+  left: 100%;
+}
+
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+     -moz-border-radius: 23px;
+          border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+
+.carousel-control.right {
+  right: 15px;
+  left: auto;
+}
+
+.carousel-control:hover {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+
+.carousel-caption {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+
+.carousel-caption h4,
+.carousel-caption p {
+  line-height: 20px;
+  color: #ffffff;
+}
+
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+
+.carousel-caption p {
+  margin-bottom: 0;
+}
+
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+     -moz-border-radius: 6px;
+          border-radius: 6px;
+}
+
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  letter-spacing: -1px;
+  color: inherit;
+}
+
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+}
+
+.pull-right {
+  float: right;
+}
+
+.pull-left {
+  float: left;
+}
+
+.hide {
+  display: none;
+}
+
+.show {
+  display: block;
+}
+
+.invisible {
+  visibility: hidden;
+}
+
+.affix {
+  position: fixed;
+}
diff --git a/doc/_themes/bootstrap/static/bootstrap-default.min.css b/doc/_themes/bootstrap/static/bootstrap-default.min.css
new file mode 100644
index 0000000..3119038
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-default.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:- [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-dropdown.js b/doc/_themes/bootstrap/static/bootstrap-dropdown.js
new file mode 100644
index 0000000..15f4677
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-dropdown.js
@@ -0,0 +1,81 @@
+/* ============================================================
+ * bootstrap-dropdown.js v2.0.0
+ * http://twitter.github.com/bootstrap/javascript.html#dropdown
+ * ============================================================
+ * Copyright 2011 Twitter, Inc.
+ *
+ * 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.
+ * ============================================================ */
+
+
+!function( $ ){
+
+  "use strict"
+
+ /* DROPDOWN CLASS DEFINITION
+  * ========================= */
+
+  var toggle = '[data-toggle="dropdown"]'
+    , Dropdown = function ( element ) {
+        $(element).bind('click', this.toggle)
+      }
+
+  Dropdown.prototype = {
+
+    constructor: Dropdown
+
+  , toggle: function ( e ) {
+      var $this = $(this)
+        , selector = $this.attr('data-target') || $this.attr('href')
+        , $parent = $(selector)
+
+      $parent.length || ($parent = $this.parent())
+
+      clearMenus()
+
+      !$parent.hasClass('open') && $parent.toggleClass('open')
+
+      return false
+    }
+
+  }
+
+  function clearMenus() {
+    $(toggle).parent().removeClass('open')
+  }
+
+
+  /* DROPDOWN PLUGIN DEFINITION
+   * ========================== */
+
+  $.fn.dropdown = function ( option ) {
+    return this.each(function () {
+      var $this = $(this)
+        , data = $this.data('dropdown')
+      if (!data) $this.data('dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  /* APPLY TO STANDARD DROPDOWN ELEMENTS
+   * =================================== */
+
+  $(function () {
+    $('html').on('click.dropdown.data-api', clearMenus)
+    $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+  })
+
+}( window.jQuery )
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.css
new file mode 100755
index 0000000..0cc15fd
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-engineauth.css
@@ -0,0 +1,5700 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.clearfix:after {
+  clear: both;
+}
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  max-width: 100%;
+  height: auto;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+#map_canvas img {
+  max-width: none;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #333333;
+  background-color: #ffffff;
+}
+a {
+  color: #0e84b5;
+  text-decoration: none;
+}
+a:hover {
+  color: #f26a1e;
+  text-decoration: underline;
+}
+.img-rounded {
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+.img-circle {
+  -webkit-border-radius: 500px;
+  -moz-border-radius: 500px;
+  border-radius: 500px;
+}
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.span12 {
+  width: 940px;
+}
+.span11 {
+  width: 860px;
+}
+.span10 {
+  width: 780px;
+}
+.span9 {
+  width: 700px;
+}
+.span8 {
+  width: 620px;
+}
+.span7 {
+  width: 540px;
+}
+.span6 {
+  width: 460px;
+}
+.span5 {
+  width: 380px;
+}
+.span4 {
+  width: 300px;
+}
+.span3 {
+  width: 220px;
+}
+.span2 {
+  width: 140px;
+}
+.span1 {
+  width: 60px;
+}
+.offset12 {
+  margin-left: 980px;
+}
+.offset11 {
+  margin-left: 900px;
+}
+.offset10 {
+  margin-left: 820px;
+}
+.offset9 {
+  margin-left: 740px;
+}
+.offset8 {
+  margin-left: 660px;
+}
+.offset7 {
+  margin-left: 580px;
+}
+.offset6 {
+  margin-left: 500px;
+}
+.offset5 {
+  margin-left: 420px;
+}
+.offset4 {
+  margin-left: 340px;
+}
+.offset3 {
+  margin-left: 260px;
+}
+.offset2 {
+  margin-left: 180px;
+}
+.offset1 {
+  margin-left: 100px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid [class*="span"] {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  float: left;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+}
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container-fluid:after {
+  clear: both;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 30px;
+}
+small {
+  font-size: 85%;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+cite {
+  font-style: normal;
+}
+.muted {
+  color: #999999;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: normal;
+  line-height: 1;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+h1 {
+  font-size: 36px;
+  line-height: 40px;
+}
+h2 {
+  font-size: 30px;
+  line-height: 40px;
+}
+h3 {
+  font-size: 24px;
+  line-height: 40px;
+}
+h4 {
+  font-size: 18px;
+  line-height: 20px;
+}
+h5 {
+  font-size: 14px;
+  line-height: 20px;
+}
+h6 {
+  font-size: 12px;
+  line-height: 20px;
+}
+h1 small {
+  font-size: 24px;
+}
+h2 small {
+  font-size: 18px;
+}
+h3 small {
+  font-size: 14px;
+}
+h4 small {
+  font-size: 14px;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+li {
+  line-height: 20px;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+dl {
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 20px;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 10px;
+}
+.dl-horizontal dt {
+  float: left;
+  width: 120px;
+  clear: left;
+  text-align: right;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.dl-horizontal dd {
+  margin-left: 130px;
+}
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 25px;
+}
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+blockquote.pull-right small:before {
+  content: '';
+}
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+.label,
+.badge {
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #999999;
+}
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+  -moz-border-radius: 9px;
+  border-radius: 9px;
+}
+a.label:hover,
+a.badge:hover {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+.table th {
+  font-weight: bold;
+}
+.table thead th {
+  vertical-align: bottom;
+}
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+  border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+  border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child,
+.table-bordered tfoot:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+  -moz-border-radius: 0 0 0 4px;
+  border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child,
+.table-bordered tfoot:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+  border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+  border-top-right-radius: 4px;
+  -moz-border-right-topleft: 4px;
+}
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+.table-hover tbody tr:hover td,
+.table-hover tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+.table tbody tr.success td {
+  background-color: #dff0d8;
+}
+.table tbody tr.error td {
+  background-color: #f2dede;
+}
+.table tbody tr.info td {
+  background-color: #d9edf7;
+}
+form {
+  margin: 0 0 20px;
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+input,
+textarea {
+  width: 210px;
+}
+textarea {
+  height: auto;
+}
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear .2s, box-shadow linear .2s;
+  -moz-transition: border linear .2s, box-shadow linear .2s;
+  -o-transition: border linear .2s, box-shadow linear .2s;
+  transition: border linear .2s, box-shadow linear .2s;
+}
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  *margin-top: 0;
+  /* IE7 */
+
+  margin-top: 1px \9;
+  /* IE8-9 */
+
+  line-height: normal;
+  cursor: pointer;
+}
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+select {
+  width: 220px;
+  border: 1px solid #bbb;
+  background-color: #ffffff;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  cursor: not-allowed;
+}
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+.input-mini {
+  width: 60px;
+}
+.input-small {
+  width: 90px;
+}
+.input-medium {
+  width: 150px;
+}
+.input-large {
+  width: 210px;
+}
+.input-xlarge {
+  width: 270px;
+}
+.input-xxlarge {
+  width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+input.span12, textarea.span12, .uneditable-input.span12 {
+  width: 926px;
+}
+input.span11, textarea.span11, .uneditable-input.span11 {
+  width: 846px;
+}
+input.span10, textarea.span10, .uneditable-input.span10 {
+  width: 766px;
+}
+input.span9, textarea.span9, .uneditable-input.span9 {
+  width: 686px;
+}
+input.span8, textarea.span8, .uneditable-input.span8 {
+  width: 606px;
+}
+input.span7, textarea.span7, .uneditable-input.span7 {
+  width: 526px;
+}
+input.span6, textarea.span6, .uneditable-input.span6 {
+  width: 446px;
+}
+input.span5, textarea.span5, .uneditable-input.span5 {
+  width: 366px;
+}
+input.span4, textarea.span4, .uneditable-input.span4 {
+  width: 286px;
+}
+input.span3, textarea.span3, .uneditable-input.span3 {
+  width: 206px;
+}
+input.span2, textarea.span2, .uneditable-input.span2 {
+  width: 126px;
+}
+input.span1, textarea.span1, .uneditable-input.span1 {
+  width: 46px;
+}
+.controls-row {
+  *zoom: 1;
+}
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.controls-row:after {
+  clear: both;
+}
+.controls-row [class*="span"] {
+  float: left;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.warning .checkbox:focus,
+.control-group.warning .radio:focus,
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.error .checkbox:focus,
+.control-group.error .radio:focus,
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.success .checkbox:focus,
+.control-group.success .radio:focus,
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.form-actions:after {
+  clear: both;
+}
+.help-block,
+.help-inline {
+  color: #595959;
+}
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  font-size: 14px;
+  vertical-align: top;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn {
+  margin-left: -1px;
+  vertical-align: top;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+/* Allow for input prepend/append in search forms */
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+  -moz-border-radius: 14px 0 0 14px;
+  border-radius: 14px 0 0 14px;
+}
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+  -moz-border-radius: 0 14px 14px 0;
+  border-radius: 0 14px 14px 0;
+}
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+  -moz-border-radius: 0 14px 14px 0;
+  border-radius: 0 14px 14px 0;
+}
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+  -moz-border-radius: 14px 0 0 14px;
+  border-radius: 14px 0 0 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+.control-group {
+  margin-bottom: 10px;
+}
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.form-horizontal .control-group:after {
+  clear: both;
+}
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 160px;
+  *margin-left: 0;
+}
+.form-horizontal .controls:first-child {
+  *padding-left: 160px;
+}
+.form-horizontal .help-block {
+  margin-top: 10px;
+  margin-bottom: 0;
+}
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+.btn {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  color: #333333;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  background-color: #f5f5f5;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #e6e6e6;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  *margin-left: .3em;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+.btn:first-child {
+  *margin-left: 0;
+}
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+  -moz-transition: background-position 0.1s linear;
+  -o-transition: background-position 0.1s linear;
+  transition: background-position 0.1s linear;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn.active,
+.btn:active {
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #e6e6e6;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-large {
+  padding: 9px 14px;
+  font-size: 16px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+.btn-small {
+  padding: 3px 9px;
+  font-size: 12px;
+  line-height: 18px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 16px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+.btn {
+  border-color: #c5c5c5;
+  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+}
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e6eb5;
+  background-image: -moz-linear-gradient(top, #0e84b5, #0e4cb5);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));
+  background-image: -webkit-linear-gradient(top, #0e84b5, #0e4cb5);
+  background-image: -o-linear-gradient(top, #0e84b5, #0e4cb5);
+  background-image: linear-gradient(to bottom, #0e84b5, #0e4cb5);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0e4cb5', GradientType=0);
+  border-color: #0e4cb5 #0e4cb5 #092e6e;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #0e4cb5;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #0e4cb5;
+  *background-color: #0c429d;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #0a3886 \9;
+}
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #f89406;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #bd362f;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #51a351;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #2f96b4;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #222222;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+.btn-link,
+.btn-link:active {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link {
+  border-color: transparent;
+  cursor: pointer;
+  color: #0e84b5;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-link:hover {
+  color: #f26a1e;
+  text-decoration: underline;
+  background-color: transparent;
+}
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+  margin-top: 1px;
+}
+/* White icons with optional class, or on hover/active states of certain elements */
+.icon-white,
+.nav > .active > a > [class^="icon-"],
+.nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+.icon-glass {
+  background-position: 0      0;
+}
+.icon-music {
+  background-position: -24px 0;
+}
+.icon-search {
+  background-position: -48px 0;
+}
+.icon-envelope {
+  background-position: -72px 0;
+}
+.icon-heart {
+  background-position: -96px 0;
+}
+.icon-star {
+  background-position: -120px 0;
+}
+.icon-star-empty {
+  background-position: -144px 0;
+}
+.icon-user {
+  background-position: -168px 0;
+}
+.icon-film {
+  background-position: -192px 0;
+}
+.icon-th-large {
+  background-position: -216px 0;
+}
+.icon-th {
+  background-position: -240px 0;
+}
+.icon-th-list {
+  background-position: -264px 0;
+}
+.icon-ok {
+  background-position: -288px 0;
+}
+.icon-remove {
+  background-position: -312px 0;
+}
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+.icon-off {
+  background-position: -384px 0;
+}
+.icon-signal {
+  background-position: -408px 0;
+}
+.icon-cog {
+  background-position: -432px 0;
+}
+.icon-trash {
+  background-position: -456px 0;
+}
+.icon-home {
+  background-position: 0 -24px;
+}
+.icon-file {
+  background-position: -24px -24px;
+}
+.icon-time {
+  background-position: -48px -24px;
+}
+.icon-road {
+  background-position: -72px -24px;
+}
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+.icon-download {
+  background-position: -120px -24px;
+}
+.icon-upload {
+  background-position: -144px -24px;
+}
+.icon-inbox {
+  background-position: -168px -24px;
+}
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+.icon-repeat {
+  background-position: -216px -24px;
+}
+.icon-refresh {
+  background-position: -240px -24px;
+}
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+.icon-lock {
+  background-position: -287px -24px;
+}
+.icon-flag {
+  background-position: -312px -24px;
+}
+.icon-headphones {
+  background-position: -336px -24px;
+}
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+.icon-barcode {
+  background-position: -456px -24px;
+}
+.icon-tag {
+  background-position: 0 -48px;
+}
+.icon-tags {
+  background-position: -25px -48px;
+}
+.icon-book {
+  background-position: -48px -48px;
+}
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+.icon-print {
+  background-position: -96px -48px;
+}
+.icon-camera {
+  background-position: -120px -48px;
+}
+.icon-font {
+  background-position: -144px -48px;
+}
+.icon-bold {
+  background-position: -167px -48px;
+}
+.icon-italic {
+  background-position: -192px -48px;
+}
+.icon-text-height {
+  background-position: -216px -48px;
+}
+.icon-text-width {
+  background-position: -240px -48px;
+}
+.icon-align-left {
+  background-position: -264px -48px;
+}
+.icon-align-center {
+  background-position: -288px -48px;
+}
+.icon-align-right {
+  background-position: -312px -48px;
+}
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+.icon-list {
+  background-position: -360px -48px;
+}
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+.icon-picture {
+  background-position: -456px -48px;
+}
+.icon-pencil {
+  background-position: 0 -72px;
+}
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+.icon-adjust {
+  background-position: -48px -72px;
+}
+.icon-tint {
+  background-position: -72px -72px;
+}
+.icon-edit {
+  background-position: -96px -72px;
+}
+.icon-share {
+  background-position: -120px -72px;
+}
+.icon-check {
+  background-position: -144px -72px;
+}
+.icon-move {
+  background-position: -168px -72px;
+}
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+.icon-backward {
+  background-position: -240px -72px;
+}
+.icon-play {
+  background-position: -264px -72px;
+}
+.icon-pause {
+  background-position: -288px -72px;
+}
+.icon-stop {
+  background-position: -312px -72px;
+}
+.icon-forward {
+  background-position: -336px -72px;
+}
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+.icon-eject {
+  background-position: -408px -72px;
+}
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+.icon-plus {
+  background-position: -408px -96px;
+}
+.icon-minus {
+  background-position: -433px -96px;
+}
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+.icon-gift {
+  background-position: -24px -120px;
+}
+.icon-leaf {
+  background-position: -48px -120px;
+}
+.icon-fire {
+  background-position: -72px -120px;
+}
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+.icon-plane {
+  background-position: -168px -120px;
+}
+.icon-calendar {
+  background-position: -192px -120px;
+}
+.icon-random {
+  background-position: -216px -120px;
+  width: 16px;
+}
+.icon-comment {
+  background-position: -240px -120px;
+}
+.icon-magnet {
+  background-position: -264px -120px;
+}
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+.icon-retweet {
+  background-position: -336px -120px;
+}
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+.icon-folder-open {
+  background-position: -408px -120px;
+  width: 16px;
+}
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+.icon-hdd {
+  background-position: 0 -144px;
+}
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+.icon-bell {
+  background-position: -48px -144px;
+}
+.icon-certificate {
+  background-position: -72px -144px;
+}
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+.icon-globe {
+  background-position: -336px -144px;
+}
+.icon-wrench {
+  background-position: -360px -144px;
+}
+.icon-tasks {
+  background-position: -384px -144px;
+}
+.icon-filter {
+  background-position: -408px -144px;
+}
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+.btn-group {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+  *margin-left: .3em;
+}
+.btn-group:first-child {
+  *margin-left: 0;
+}
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-toolbar {
+  font-size: 0;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-toolbar .btn + .btn,
+.btn-toolbar .btn-group + .btn,
+.btn-toolbar .btn + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: 14px;
+}
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+}
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 6px;
+  -moz-border-radius-topleft: 6px;
+  border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  border-bottom-left-radius: 6px;
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  border-bottom-right-radius: 6px;
+}
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+.btn-group > .btn-mini + .dropdown-toggle {
+  padding-left: 5px;
+  padding-right: 5px;
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+.btn-group > .btn-large + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #0e4cb5;
+}
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+.btn-large .caret {
+  border-left-width: 5px;
+  border-right-width: 5px;
+  border-top-width: 5px;
+}
+.dropup .btn-large .caret {
+  border-bottom: 5px solid #000000;
+  border-top: 0;
+}
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group-vertical .btn + .btn {
+  margin-left: 0;
+  margin-top: -1px;
+}
+.btn-group-vertical .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.btn-group-vertical .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.btn-group-vertical .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+  -moz-border-radius: 6px 6px 0 0;
+  border-radius: 6px 6px 0 0;
+}
+.btn-group-vertical .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+}
+.nav {
+  margin-left: 0;
+  margin-bottom: 20px;
+  list-style: none;
+}
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav > .pull-right {
+  float: right;
+}
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+.nav-list {
+  padding-left: 15px;
+  padding-right: 15px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left: -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #0e84b5;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #ffffff;
+  background-color: #0e84b5;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+}
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.nav .dropdown-toggle .caret {
+  border-top-color: #0e84b5;
+  border-bottom-color: #0e84b5;
+  margin-top: 6px;
+}
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: #f26a1e;
+  border-bottom-color: #f26a1e;
+}
+/* move down carets for tabs */
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+.tabbable {
+  *zoom: 1;
+}
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.tabbable:after {
+  clear: both;
+}
+.tab-content {
+  overflow: auto;
+}
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.tabs-below > .nav-tabs > li > a:hover {
+  border-bottom-color: transparent;
+  border-top-color: #ddd;
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+.nav > .disabled > a {
+  color: #999999;
+}
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
+.navbar {
+  overflow: visible;
+  margin-bottom: 20px;
+  color: #0e84b5;
+  *position: relative;
+  *z-index: 2;
+}
+.navbar-inner {
+  min-height: 40px;
+  padding-left: 20px;
+  padding-right: 20px;
+  background-color: #ffffff;
+  background-image: -moz-linear-gradient(top, #ffffff, #ffffff);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));
+  background-image: -webkit-linear-gradient(top, #ffffff, #ffffff);
+  background-image: -o-linear-gradient(top, #ffffff, #ffffff);
+  background-image: linear-gradient(to bottom, #ffffff, #ffffff);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffffff', GradientType=0);
+  border: 1px solid #e0e0e0;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+.navbar .container {
+  width: auto;
+}
+.nav-collapse.collapse {
+  height: auto;
+}
+.navbar .brand {
+  float: left;
+  display: block;
+  padding: 10px 20px 10px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #0e84b5;
+  text-shadow: 0 1px 0 #ffffff;
+}
+.navbar .brand:hover {
+  text-decoration: none;
+}
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 40px;
+}
+.navbar-link {
+  color: #0e84b5;
+}
+.navbar-link:hover {
+  color: #f26a1e;
+}
+.navbar .divider-vertical {
+  height: 40px;
+  margin: 0 9px;
+  border-left: 1px solid #ffffff;
+  border-right: 1px solid #ffffff;
+}
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 6px;
+}
+.navbar .btn-group .btn {
+  margin: 0;
+}
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.navbar-form:after {
+  clear: both;
+}
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 5px;
+}
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 5px;
+  margin-bottom: 0;
+}
+.navbar-search .search-query {
+  margin-bottom: 0;
+  padding: 4px 14px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0;
+}
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.navbar-fixed-top {
+  top: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+  -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+  box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+  -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+  box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+}
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right;
+}
+.navbar .nav > li {
+  float: left;
+}
+.navbar .nav > li > a {
+  float: none;
+  padding: 10px 15px 10px;
+  color: #0e84b5;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #ffffff;
+}
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  background-color: transparent;
+  color: #f26a1e;
+  text-decoration: none;
+}
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #f26a1e;
+  text-decoration: none;
+  background-color: #f2f2f2;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #f2f2f2;
+  background-image: -moz-linear-gradient(top, #f2f2f2, #f2f2f2);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));
+  background-image: -webkit-linear-gradient(top, #f2f2f2, #f2f2f2);
+  background-image: -o-linear-gradient(top, #f2f2f2, #f2f2f2);
+  background-image: linear-gradient(to bottom, #f2f2f2, #f2f2f2);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#fff2f2f2', GradientType=0);
+  border-color: #f2f2f2 #f2f2f2 #cccccc;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #f2f2f2;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+}
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #f2f2f2;
+  *background-color: #e5e5e5;
+}
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #d9d9d9 \9;
+}
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+.navbar .nav > li > .dropdown-menu:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 9px;
+}
+.navbar .nav > li > .dropdown-menu:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 10px;
+}
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  border-top: 7px solid #ccc;
+  border-top-color: rgba(0, 0, 0, 0.2);
+  border-bottom: 0;
+  bottom: -7px;
+  top: auto;
+}
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+  bottom: -6px;
+  top: auto;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: #f2f2f2;
+  color: #f26a1e;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #0e84b5;
+  border-bottom-color: #0e84b5;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #f26a1e;
+  border-bottom-color: #f26a1e;
+}
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  left: auto;
+  right: 0;
+}
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  left: auto;
+  right: 12px;
+}
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  left: auto;
+  right: 13px;
+}
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  left: auto;
+  right: 100%;
+  margin-left: 0;
+  margin-right: -1px;
+  -webkit-border-radius: 6px 0 6px 6px;
+  -moz-border-radius: 6px 0 6px 6px;
+  border-radius: 6px 0 6px 6px;
+}
+.navbar-inverse {
+  color: #999999;
+}
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+  border-color: #252525;
+}
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+}
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  background-color: transparent;
+  color: #ffffff;
+}
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+.navbar-inverse .divider-vertical {
+  border-left-color: #111111;
+  border-right-color: #222222;
+}
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: #111111;
+  color: #ffffff;
+}
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  outline: 0;
+}
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #040404;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+.breadcrumb {
+  padding: 8px 15px;
+  margin: 0 0 20px;
+  list-style: none;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.breadcrumb li {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  text-shadow: 0 1px 0 #ffffff;
+}
+.breadcrumb .divider {
+  padding: 0 5px;
+  color: #ccc;
+}
+.breadcrumb .active {
+  color: #999999;
+}
+.pagination {
+  height: 40px;
+  margin: 20px 0;
+}
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-left: 0;
+  margin-bottom: 0;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+  display: inline;
+}
+.pagination a,
+.pagination span {
+  float: left;
+  padding: 0 14px;
+  line-height: 38px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a,
+.pagination .active span {
+  background-color: #f5f5f5;
+}
+.pagination .active a,
+.pagination .active span {
+  color: #999999;
+  cursor: default;
+}
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a,
+.pagination li:first-child span {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a,
+.pagination li:last-child span {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
+.pager {
+  margin: 20px 0;
+  list-style: none;
+  text-align: center;
+  *zoom: 1;
+}
+.pager:before,
+.pager:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.pager:after {
+  clear: both;
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: #999999;
+  background-color: #fff;
+  cursor: default;
+}
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.thumbnails:after {
+  clear: both;
+}
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+a.thumbnail:hover {
+  border-color: #0e84b5;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  color: #c09853;
+}
+.alert h4 {
+  margin: 0;
+}
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #468847;
+}
+.alert-danger,
+.alert-error {
+  background-color: #f2dede;
+  border-color: #eed3d7;
+  color: #b94a48;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+  color: #3a87ad;
+}
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
+ at -webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+ at keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  overflow: hidden;
+  height: 20px;
+  margin-bottom: 20px;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.progress .bar {
+  width: 0%;
+  height: 100%;
+  color: #ffffff;
+  float: left;
+  font-size: 12px;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+  -moz-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;
+}
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+}
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+  -moz-background-size: 40px 40px;
+  -o-background-size: 40px 40px;
+  background-size: 40px 40px;
+}
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -moz-animation: progress-bar-stripes 2s linear infinite;
+  -ms-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  color: inherit;
+  letter-spacing: -1px;
+}
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+}
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.tooltip.top {
+  margin-top: -3px;
+}
+.tooltip.right {
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  margin-top: 3px;
+}
+.tooltip.left {
+  margin-left: -3px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: #ffffff;
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+.popover.top {
+  margin-bottom: 10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-right: 10px;
+}
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+  -moz-border-radius: 5px 5px 0 0;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover .arrow:after {
+  content: "";
+  z-index: -1;
+}
+.popover.top .arrow {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-width: 10px 10px 0;
+  border-top-color: #ffffff;
+}
+.popover.top .arrow:after {
+  border-width: 11px 11px 0;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  bottom: -1px;
+  left: -11px;
+}
+.popover.right .arrow {
+  top: 50%;
+  left: -10px;
+  margin-top: -10px;
+  border-width: 10px 10px 10px 0;
+  border-right-color: #ffffff;
+}
+.popover.right .arrow:after {
+  border-width: 11px 11px 11px 0;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  bottom: -11px;
+  left: -1px;
+}
+.popover.bottom .arrow {
+  top: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-width: 0 10px 10px;
+  border-bottom-color: #ffffff;
+}
+.popover.bottom .arrow:after {
+  border-width: 0 11px 11px;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  top: -1px;
+  left: -11px;
+}
+.popover.left .arrow {
+  top: 50%;
+  right: -10px;
+  margin-top: -10px;
+  border-width: 10px 0 10px 10px;
+  border-left-color: #ffffff;
+}
+.popover.left .arrow:after {
+  border-width: 11px 0 11px 11px;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  bottom: -11px;
+  right: -1px;
+}
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+.modal-open .popover {
+  z-index: 2060;
+}
+.modal-open .tooltip {
+  z-index: 2080;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+}
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  /* IE6-7 */
+
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.modal.fade {
+  -webkit-transition: opacity .3s linear, top .3s ease-out;
+  -moz-transition: opacity .3s linear, top .3s ease-out;
+  -o-transition: opacity .3s linear, top .3s ease-out;
+  transition: opacity .3s linear, top .3s ease-out;
+  top: -25%;
+}
+.modal.fade.in {
+  top: 50%;
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+.modal-header .close {
+  margin-top: 2px;
+}
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+.modal-body {
+  overflow-y: auto;
+  max-height: 400px;
+  padding: 15px;
+}
+.modal-form {
+  margin-bottom: 0;
+}
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+  -moz-box-shadow: inset 0 1px 0 #ffffff;
+  box-shadow: inset 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.modal-footer:after {
+  clear: both;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+.dropdown-menu a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  text-decoration: none;
+  color: #ffffff;
+  background-color: #0e84b5;
+  background-color: #0d7dac;
+  background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
+  background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
+}
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  outline: 0;
+  background-color: #0e84b5;
+  background-color: #0d7dac;
+  background-image: -moz-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));
+  background-image: -webkit-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: -o-linear-gradient(top, #0e84b5, #0c739d);
+  background-image: linear-gradient(to bottom, #0e84b5, #0c739d);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0e84b5', endColorstr='#ff0c739d', GradientType=0);
+}
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: #999999;
+}
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
+.open {
+  *z-index: 1000;
+}
+.open  > .dropdown-menu {
+  display: block;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "\2191";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+  -moz-border-radius: 0 6px 6px 6px;
+  border-radius: 0 6px 6px 6px;
+}
+.dropdown-submenu:hover .dropdown-menu {
+  display: block;
+}
+.dropdown-submenu > a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #cccccc;
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+.dropdown .dropdown-menu .nav-header {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.accordion {
+  margin-bottom: 20px;
+}
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.accordion-heading {
+  border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+.accordion-toggle {
+  cursor: pointer;
+}
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+.carousel-inner {
+  overflow: hidden;
+  width: 100%;
+  position: relative;
+}
+.carousel .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -moz-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+.carousel .active {
+  left: 0;
+}
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel .next {
+  left: 100%;
+}
+.carousel .prev {
+  left: -100%;
+}
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+.carousel .active.left {
+  left: -100%;
+}
+.carousel .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+  -moz-border-radius: 23px;
+  border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.carousel-control.right {
+  left: auto;
+  right: 15px;
+}
+.carousel-control:hover {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-caption {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+.carousel-caption h4,
+.carousel-caption p {
+  color: #ffffff;
+  line-height: 20px;
+}
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+.carousel-caption p {
+  margin-bottom: 0;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+.invisible {
+  visibility: hidden;
+}
+.affix {
+  position: fixed;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -moz-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  overflow: visible \9;
+  -webkit-transition: height 0.35s ease;
+  -moz-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+}
+.collapse.in {
+  height: auto;
+}
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+.visible-phone {
+  display: none !important;
+}
+.visible-tablet {
+  display: none !important;
+}
+.hidden-desktop {
+  display: none !important;
+}
+.visible-desktop {
+  display: inherit !important;
+}
+ at media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+ at media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+ at media (max-width: 767px) {
+  body {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-left: -20px;
+    margin-right: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    clear: none;
+    width: auto;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    float: none;
+    display: block;
+    width: auto;
+    margin-left: 0;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    left: 20px;
+    right: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+}
+ at media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+  .modal {
+    top: 10px;
+    left: 10px;
+    right: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+ at media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12, textarea.span12, .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11, textarea.span11, .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10, textarea.span10, .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9, textarea.span9, .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8, textarea.span8, .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7, textarea.span7, .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6, textarea.span6, .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5, textarea.span5, .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4, textarea.span4, .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3, textarea.span3, .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2, textarea.span2, .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1, textarea.span1, .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+ at media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12, textarea.span12, .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11, textarea.span11, .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10, textarea.span10, .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9, textarea.span9, .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8, textarea.span8, .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7, textarea.span7, .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6, textarea.span6, .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5, textarea.span5, .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4, textarea.span4, .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3, textarea.span3, .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2, textarea.span2, .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1, textarea.span1, .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+ at media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #0e84b5;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #0e84b5;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #ffffff;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    margin-top: 5px;
+    padding: 0;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    float: none;
+    display: block;
+    max-width: none;
+    margin: 0 15px;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+    -moz-border-radius: 0;
+    border-radius: 0;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #ffffff;
+    border-bottom: 1px solid #ffffff;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    overflow: hidden;
+    height: 0;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+}
+ at media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
+
+.footer {
+    background-color: #eee;
+}
+
+.quick-links {
+    background-color: #EEEEEE;
+}
+
+.quick-links strong {
+    color: #999999;
+}
diff --git a/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css b/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
new file mode 100755
index 0000000..188425a
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-engineauth.min.css
@@ -0,0 +1,829 @@
+/*!
+ * Bootstrap v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;}
+.clearfix:after{clear:both;}
+.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
+.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{max-width:100%;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
+#map_canvas img{max-width:none;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;}
+a{color:#0e84b5;text-decoration:none;}
+a:hover{color:#f26a1e;text-decoration:underline;}
+.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);}
+.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
+.span12{width:940px;}
+.span11{width:860px;}
+.span10{width:780px;}
+.span9{width:700px;}
+.span8{width:620px;}
+.span7{width:540px;}
+.span6{width:460px;}
+.span5{width:380px;}
+.span4{width:300px;}
+.span3{width:220px;}
+.span2{width:140px;}
+.span1{width:60px;}
+.offset12{margin-left:980px;}
+.offset11{margin-left:900px;}
+.offset10{margin-left:820px;}
+.offset9{margin-left:740px;}
+.offset8{margin-left:660px;}
+.offset7{margin-left:580px;}
+.offset6{margin-left:500px;}
+.offset5{margin-left:420px;}
+.offset4{margin-left:340px;}
+.offset3{margin-left:260px;}
+.offset2{margin-left:180px;}
+.offset1{margin-left:100px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;}
+.row-fluid:after{clear:both;}
+.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;}
+.row-fluid [class*="span"]:first-child{margin-left:0;}
+.row-fluid .span12{width:100%;*width:99.94680851063829%;}
+.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;}
+.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;}
+.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;}
+.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;}
+.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;}
+.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;}
+.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;}
+.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;}
+.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;}
+.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;}
+.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;}
+.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;}
+.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;}
+.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;}
+.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;}
+.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;}
+.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;}
+.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;}
+.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;}
+.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;}
+.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;}
+.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;}
+.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;}
+.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;}
+.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;}
+.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;}
+.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;}
+.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;}
+.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;}
+.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;}
+.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;}
+.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;}
+.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;}
+.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;}
+.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;}
+[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;}
+[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;}
+.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;}
+.container:after{clear:both;}
+.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;}
+.container-fluid:after{clear:both;}
+p{margin:0 0 10px;}
+.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px;}
+small{font-size:85%;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+cite{font-style:normal;}
+.muted{color:#999999;}
+h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:normal;line-height:1;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;}
+h1{font-size:36px;line-height:40px;}
+h2{font-size:30px;line-height:40px;}
+h3{font-size:24px;line-height:40px;}
+h4{font-size:18px;line-height:20px;}
+h5{font-size:14px;line-height:20px;}
+h6{font-size:12px;line-height:20px;}
+h1 small{font-size:24px;}
+h2 small{font-size:18px;}
+h3 small{font-size:14px;}
+h4 small{font-size:14px;}
+.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;}
+ul,ol{padding:0;margin:0 0 10px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+li{line-height:20px;}
+ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:20px;}
+dt,dd{line-height:20px;}
+dt{font-weight:bold;}
+dd{margin-left:10px;}
+.dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
+.dl-horizontal dd{margin-left:130px;}
+hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
+abbr[title]{cursor:help;border-bottom:1px dotted #999999;}
+abbr.initialism{font-size:90%;text-transform:uppercase;}
+blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;}
+blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+blockquote.pull-right small:before{content:'';}
+blockquote.pull-right small:after{content:'\00A0 \2014';}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;}
+code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;}
+pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;}
+pre code{padding:0;color:inherit;background-color:transparent;border:0;}
+.pre-scrollable{max-height:340px;overflow-y:scroll;}
+.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
+.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
+a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
+.label-important,.badge-important{background-color:#b94a48;}
+.label-important[href],.badge-important[href]{background-color:#953b39;}
+.label-warning,.badge-warning{background-color:#f89406;}
+.label-warning[href],.badge-warning[href]{background-color:#c67605;}
+.label-success,.badge-success{background-color:#468847;}
+.label-success[href],.badge-success[href]{background-color:#356635;}
+.label-info,.badge-info{background-color:#3a87ad;}
+.label-info[href],.badge-info[href]{background-color:#2d6987;}
+.label-inverse,.badge-inverse{background-color:#333333;}
+.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
+.btn .label,.btn .badge{position:relative;top:-1px;}
+.btn-mini .label,.btn-mini .badge{top:0;}
+table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
+.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
+.table th{font-weight:bold;}
+.table thead th{vertical-align:bottom;}
+.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
+.table tbody+tbody{border-top:2px solid #dddddd;}
+.table-condensed th,.table-condensed td{padding:4px 5px;}
+.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
+.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
+.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
+.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;}
+.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;}
+.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;}
+.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
+.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px;}
+.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
+.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;}
+table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0;}
+table .span1{float:none;width:44px;margin-left:0;}
+table .span2{float:none;width:124px;margin-left:0;}
+table .span3{float:none;width:204px;margin-left:0;}
+table .span4{float:none;width:284px;margin-left:0;}
+table .span5{float:none;width:364px;margin-left:0;}
+table .span6{float:none;width:444px;margin-left:0;}
+table .span7{float:none;width:524px;margin-left:0;}
+table .span8{float:none;width:604px;margin-left:0;}
+table .span9{float:none;width:684px;margin-left:0;}
+table .span10{float:none;width:764px;margin-left:0;}
+table .span11{float:none;width:844px;margin-left:0;}
+table .span12{float:none;width:924px;margin-left:0;}
+table .span13{float:none;width:1004px;margin-left:0;}
+table .span14{float:none;width:1084px;margin-left:0;}
+table .span15{float:none;width:1164px;margin-left:0;}
+table .span16{float:none;width:1244px;margin-left:0;}
+table .span17{float:none;width:1324px;margin-left:0;}
+table .span18{float:none;width:1404px;margin-left:0;}
+table .span19{float:none;width:1484px;margin-left:0;}
+table .span20{float:none;width:1564px;margin-left:0;}
+table .span21{float:none;width:1644px;margin-left:0;}
+table .span22{float:none;width:1724px;margin-left:0;}
+table .span23{float:none;width:1804px;margin-left:0;}
+table .span24{float:none;width:1884px;margin-left:0;}
+.table tbody tr.success td{background-color:#dff0d8;}
+.table tbody tr.error td{background-color:#f2dede;}
+.table tbody tr.info td{background-color:#d9edf7;}
+form{margin:0 0 20px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;}
+label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;}
+input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
+label{display:block;margin-bottom:5px;}
+select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:3px;-moz-border-radius:3px;border- [...]
+input,textarea{width:210px;}
+textarea{height:auto;}
+textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset  [...]
+input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;}
+input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
+select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;}
+select{width:220px;border:1px solid #bbb;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+.uneditable-input{overflow:hidden;white-space:nowrap;}
+.uneditable-textarea{width:auto;height:auto;}
+input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;}
+input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;}
+input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;}
+.radio,.checkbox{min-height:18px;padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
+.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
+input,textarea,.uneditable-input{margin-left:0;}
+.controls-row [class*="span"]+[class*="span"]{margin-left:20px;}
+input.span12, textarea.span12, .uneditable-input.span12{width:926px;}
+input.span11, textarea.span11, .uneditable-input.span11{width:846px;}
+input.span10, textarea.span10, .uneditable-input.span10{width:766px;}
+input.span9, textarea.span9, .uneditable-input.span9{width:686px;}
+input.span8, textarea.span8, .uneditable-input.span8{width:606px;}
+input.span7, textarea.span7, .uneditable-input.span7{width:526px;}
+input.span6, textarea.span6, .uneditable-input.span6{width:446px;}
+input.span5, textarea.span5, .uneditable-input.span5{width:366px;}
+input.span4, textarea.span4, .uneditable-input.span4{width:286px;}
+input.span3, textarea.span3, .uneditable-input.span3{width:206px;}
+input.span2, textarea.span2, .uneditable-input.span2{width:126px;}
+input.span1, textarea.span1, .uneditable-input.span1{width:46px;}
+.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;}
+.controls-row:after{clear:both;}
+.controls-row [class*="span"]{float:left;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;}
+input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus [...]
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.er [...]
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus [...]
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;}
+.form-actions:after{clear:both;}
+.help-block,.help-inline{color:#595959;}
+.help-block{display:block;margin-bottom:10px;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
+.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-pr [...]
+.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;}
+.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
+.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
+.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
+.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;}
+.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.fo [...]
+.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
+.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;}
+.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
+.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
+.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
+.control-group{margin-bottom:10px;}
+legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;}
+.form-horizontal .help-block{margin-top:10px;margin-bottom:0;}
+.form-horizontal .form-actions{padding-left:160px;}
+.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 14px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);backgroun [...]
+.btn:active,.btn.active{background-color:#cccccc \9;}
+.btn:first-child{*margin-left:0;}
+.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
+.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
+.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-large [class^="icon-"]{margin-top:2px;}
+.btn-small{padding:3px 9px;font-size:12px;line-height:18px;}
+.btn-small [class^="icon-"]{margin-top:0;}
+.btn-mini{padding:2px 6px;font-size:11px;line-height:16px;}
+.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
+.btn-block+.btn-block{margin-top:5px;}
+.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
+.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);}
+.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e6eb5;background-image:-moz-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0e4cb5));background-image:-webkit-linear-gradient(top, #0e84b5, #0e4cb5);background-image:-o-linear-gradient(top, #0e84b5, #0e4cb5);background-image:linear-gradient(to bottom, #0e84b5, #0e4cb5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
+.btn-primary:active,.btn-primary.active{background-color:#0a3886 \9;}
+.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
+.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
+.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
+.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
+.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
+.btn-success:active,.btn-success.active{background-color:#408140 \9;}
+.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradi [...]
+.btn-info:active,.btn-info.active{background-color:#24748c \9;}
+.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gr [...]
+.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
+button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
+button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
+button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
+button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
+.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-link{border-color:transparent;cursor:pointer;color:#0e84b5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-link:hover{color:#f26a1e;text-decoration:underline;background-color:transparent;}
+[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;}
+.icon-white,.nav>.active>a>[class^="icon-"],.nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");}
+.icon-glass{background-position:0 0;}
+.icon-music{background-position:-24px 0;}
+.icon-search{background-position:-48px 0;}
+.icon-envelope{background-position:-72px 0;}
+.icon-heart{background-position:-96px 0;}
+.icon-star{background-position:-120px 0;}
+.icon-star-empty{background-position:-144px 0;}
+.icon-user{background-position:-168px 0;}
+.icon-film{background-position:-192px 0;}
+.icon-th-large{background-position:-216px 0;}
+.icon-th{background-position:-240px 0;}
+.icon-th-list{background-position:-264px 0;}
+.icon-ok{background-position:-288px 0;}
+.icon-remove{background-position:-312px 0;}
+.icon-zoom-in{background-position:-336px 0;}
+.icon-zoom-out{background-position:-360px 0;}
+.icon-off{background-position:-384px 0;}
+.icon-signal{background-position:-408px 0;}
+.icon-cog{background-position:-432px 0;}
+.icon-trash{background-position:-456px 0;}
+.icon-home{background-position:0 -24px;}
+.icon-file{background-position:-24px -24px;}
+.icon-time{background-position:-48px -24px;}
+.icon-road{background-position:-72px -24px;}
+.icon-download-alt{background-position:-96px -24px;}
+.icon-download{background-position:-120px -24px;}
+.icon-upload{background-position:-144px -24px;}
+.icon-inbox{background-position:-168px -24px;}
+.icon-play-circle{background-position:-192px -24px;}
+.icon-repeat{background-position:-216px -24px;}
+.icon-refresh{background-position:-240px -24px;}
+.icon-list-alt{background-position:-264px -24px;}
+.icon-lock{background-position:-287px -24px;}
+.icon-flag{background-position:-312px -24px;}
+.icon-headphones{background-position:-336px -24px;}
+.icon-volume-off{background-position:-360px -24px;}
+.icon-volume-down{background-position:-384px -24px;}
+.icon-volume-up{background-position:-408px -24px;}
+.icon-qrcode{background-position:-432px -24px;}
+.icon-barcode{background-position:-456px -24px;}
+.icon-tag{background-position:0 -48px;}
+.icon-tags{background-position:-25px -48px;}
+.icon-book{background-position:-48px -48px;}
+.icon-bookmark{background-position:-72px -48px;}
+.icon-print{background-position:-96px -48px;}
+.icon-camera{background-position:-120px -48px;}
+.icon-font{background-position:-144px -48px;}
+.icon-bold{background-position:-167px -48px;}
+.icon-italic{background-position:-192px -48px;}
+.icon-text-height{background-position:-216px -48px;}
+.icon-text-width{background-position:-240px -48px;}
+.icon-align-left{background-position:-264px -48px;}
+.icon-align-center{background-position:-288px -48px;}
+.icon-align-right{background-position:-312px -48px;}
+.icon-align-justify{background-position:-336px -48px;}
+.icon-list{background-position:-360px -48px;}
+.icon-indent-left{background-position:-384px -48px;}
+.icon-indent-right{background-position:-408px -48px;}
+.icon-facetime-video{background-position:-432px -48px;}
+.icon-picture{background-position:-456px -48px;}
+.icon-pencil{background-position:0 -72px;}
+.icon-map-marker{background-position:-24px -72px;}
+.icon-adjust{background-position:-48px -72px;}
+.icon-tint{background-position:-72px -72px;}
+.icon-edit{background-position:-96px -72px;}
+.icon-share{background-position:-120px -72px;}
+.icon-check{background-position:-144px -72px;}
+.icon-move{background-position:-168px -72px;}
+.icon-step-backward{background-position:-192px -72px;}
+.icon-fast-backward{background-position:-216px -72px;}
+.icon-backward{background-position:-240px -72px;}
+.icon-play{background-position:-264px -72px;}
+.icon-pause{background-position:-288px -72px;}
+.icon-stop{background-position:-312px -72px;}
+.icon-forward{background-position:-336px -72px;}
+.icon-fast-forward{background-position:-360px -72px;}
+.icon-step-forward{background-position:-384px -72px;}
+.icon-eject{background-position:-408px -72px;}
+.icon-chevron-left{background-position:-432px -72px;}
+.icon-chevron-right{background-position:-456px -72px;}
+.icon-plus-sign{background-position:0 -96px;}
+.icon-minus-sign{background-position:-24px -96px;}
+.icon-remove-sign{background-position:-48px -96px;}
+.icon-ok-sign{background-position:-72px -96px;}
+.icon-question-sign{background-position:-96px -96px;}
+.icon-info-sign{background-position:-120px -96px;}
+.icon-screenshot{background-position:-144px -96px;}
+.icon-remove-circle{background-position:-168px -96px;}
+.icon-ok-circle{background-position:-192px -96px;}
+.icon-ban-circle{background-position:-216px -96px;}
+.icon-arrow-left{background-position:-240px -96px;}
+.icon-arrow-right{background-position:-264px -96px;}
+.icon-arrow-up{background-position:-289px -96px;}
+.icon-arrow-down{background-position:-312px -96px;}
+.icon-share-alt{background-position:-336px -96px;}
+.icon-resize-full{background-position:-360px -96px;}
+.icon-resize-small{background-position:-384px -96px;}
+.icon-plus{background-position:-408px -96px;}
+.icon-minus{background-position:-433px -96px;}
+.icon-asterisk{background-position:-456px -96px;}
+.icon-exclamation-sign{background-position:0 -120px;}
+.icon-gift{background-position:-24px -120px;}
+.icon-leaf{background-position:-48px -120px;}
+.icon-fire{background-position:-72px -120px;}
+.icon-eye-open{background-position:-96px -120px;}
+.icon-eye-close{background-position:-120px -120px;}
+.icon-warning-sign{background-position:-144px -120px;}
+.icon-plane{background-position:-168px -120px;}
+.icon-calendar{background-position:-192px -120px;}
+.icon-random{background-position:-216px -120px;width:16px;}
+.icon-comment{background-position:-240px -120px;}
+.icon-magnet{background-position:-264px -120px;}
+.icon-chevron-up{background-position:-288px -120px;}
+.icon-chevron-down{background-position:-313px -119px;}
+.icon-retweet{background-position:-336px -120px;}
+.icon-shopping-cart{background-position:-360px -120px;}
+.icon-folder-close{background-position:-384px -120px;}
+.icon-folder-open{background-position:-408px -120px;width:16px;}
+.icon-resize-vertical{background-position:-432px -119px;}
+.icon-resize-horizontal{background-position:-456px -118px;}
+.icon-hdd{background-position:0 -144px;}
+.icon-bullhorn{background-position:-24px -144px;}
+.icon-bell{background-position:-48px -144px;}
+.icon-certificate{background-position:-72px -144px;}
+.icon-thumbs-up{background-position:-96px -144px;}
+.icon-thumbs-down{background-position:-120px -144px;}
+.icon-hand-right{background-position:-144px -144px;}
+.icon-hand-left{background-position:-168px -144px;}
+.icon-hand-up{background-position:-192px -144px;}
+.icon-hand-down{background-position:-216px -144px;}
+.icon-circle-arrow-right{background-position:-240px -144px;}
+.icon-circle-arrow-left{background-position:-264px -144px;}
+.icon-circle-arrow-up{background-position:-288px -144px;}
+.icon-circle-arrow-down{background-position:-312px -144px;}
+.icon-globe{background-position:-336px -144px;}
+.icon-wrench{background-position:-360px -144px;}
+.icon-tasks{background-position:-384px -144px;}
+.icon-filter{background-position:-408px -144px;}
+.icon-briefcase{background-position:-432px -144px;}
+.icon-fullscreen{background-position:-456px -144px;}
+.btn-group{position:relative;font-size:0;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;}
+.btn-group+.btn-group{margin-left:5px;}
+.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
+.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;}
+.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group>.btn+.btn{margin-left:-1px;}
+.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;}
+.btn-group>.btn-mini{font-size:11px;}
+.btn-group>.btn-small{font-size:12px;}
+.btn-group>.btn-large{font-size:16px;}
+.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
+.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
+.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
+.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;}
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
+.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;}
+.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;}
+.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;}
+.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;}
+.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
+.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;}
+.btn-group.open .btn-primary.dropdown-toggle{background-color:#0e4cb5;}
+.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;}
+.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;}
+.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;}
+.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;}
+.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;}
+.btn .caret{margin-top:8px;margin-left:0;}
+.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;}
+.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;}
+.dropup .btn-large .caret{border-bottom:5px solid #000000;border-top:0;}
+.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
+.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;}
+.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;}
+.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}
+.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}
+.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;}
+.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
+.nav{margin-left:0;margin-bottom:20px;list-style:none;}
+.nav>li>a{display:block;}
+.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;}
+.nav>.pull-right{float:right;}
+.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;}
+.nav li+.nav-header{margin-top:9px;}
+.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;}
+.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);}
+.nav-list>li>a{padding:3px 15px;}
+.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0e84b5;}
+.nav-list [class^="icon-"]{margin-right:2px;}
+.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
+.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;}
+.nav-tabs:after,.nav-pills:after{clear:both;}
+.nav-tabs>li,.nav-pills>li{float:left;}
+.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;}
+.nav-tabs{border-bottom:1px solid #ddd;}
+.nav-tabs>li{margin-bottom:-1px;}
+.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;}
+.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;}
+.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0e84b5;}
+.nav-stacked>li{float:none;}
+.nav-stacked>li>a{margin-right:0;}
+.nav-tabs.nav-stacked{border-bottom:0;}
+.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;}
+.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;}
+.nav-pills.nav-stacked>li>a{margin-bottom:3px;}
+.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;}
+.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;}
+.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.nav .dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;margin-top:6px;}
+.nav .dropdown-toggle:hover .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
+.nav-tabs .dropdown-toggle .caret{margin-top:8px;}
+.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;}
+.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;}
+.nav>.dropdown.active>a:hover{cursor:pointer;}
+.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;}
+.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);}
+.tabs-stacked .open>a:hover{border-color:#999999;}
+.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;}
+.tabbable:after{clear:both;}
+.tab-content{overflow:auto;}
+.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;}
+.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;}
+.tab-content>.active,.pill-content>.active{display:block;}
+.tabs-below>.nav-tabs{border-top:1px solid #ddd;}
+.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;}
+.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;}
+.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;}
+.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;}
+.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;}
+.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;}
+.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}
+.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;}
+.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;}
+.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;}
+.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}
+.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;}
+.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;}
+.nav>.disabled>a{color:#999999;}
+.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
+.navbar{overflow:visible;margin-bottom:20px;color:#0e84b5;*position:relative;*z-index:2;}
+.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#ffffff;background-image:-moz-linear-gradient(top, #ffffff, #ffffff);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#ffffff));background-image:-webkit-linear-gradient(top, #ffffff, #ffffff);background-image:-o-linear-gradient(top, #ffffff, #ffffff);background-image:linear-gradient(to bottom, #ffffff, #ffffff);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gra [...]
+.navbar .container{width:auto;}
+.nav-collapse.collapse{height:auto;}
+.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#0e84b5;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;}
+.navbar-text{margin-bottom:0;line-height:40px;}
+.navbar-link{color:#0e84b5;}.navbar-link:hover{color:#f26a1e;}
+.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #ffffff;border-right:1px solid #ffffff;}
+.navbar .btn,.navbar .btn-group{margin-top:6px;}
+.navbar .btn-group .btn{margin:0;}
+.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;}
+.navbar-form:after{clear:both;}
+.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
+.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;}
+.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
+.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
+.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.navbar-static-top{position:static;width:100%;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
+.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0;}
+.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
+.navbar-fixed-top{top:0;}
+.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);}
+.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);}
+.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
+.navbar .nav.pull-right{float:right;}
+.navbar .nav>li{float:left;}
+.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#0e84b5;text-decoration:none;text-shadow:0 1px 0 #ffffff;}
+.navbar .nav .dropdown-toggle .caret{margin-top:8px;}
+.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#f26a1e;text-decoration:none;}
+.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#f26a1e;text-decoration:none;background-color:#f2f2f2;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);}
+.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#f2f2f2;background-image:-moz-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:-o-linear-gradient(top, #f2f2f2, #f2f2f2);background-image:linear-gradient(to bottom, #f2f2f [...]
+.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#d9d9d9 \9;}
+.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
+.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
+.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
+.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
+.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
+.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
+.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#f2f2f2;color:#f26a1e;}
+.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#0e84b5;border-bottom-color:#0e84b5;}
+.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#f26a1e;border-bottom-color:#f26a1e;}
+.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;}
+.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;}
+.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
+.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient( [...]
+.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;}
+.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;}
+.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;}
+.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;}
+.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;}
+.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;}
+.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;}
+.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
+.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;}
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;}
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
+.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
+.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransfo [...]
+.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;}
+.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}
+.breadcrumb .divider{padding:0 5px;color:#ccc;}
+.breadcrumb .active{color:#999999;}
+.pagination{height:40px;margin:20px 0;}
+.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);}
+.pagination li{display:inline;}
+.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;}
+.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5;}
+.pagination .active a,.pagination .active span{color:#999999;cursor:default;}
+.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;}
+.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.pagination-centered{text-align:center;}
+.pagination-right{text-align:right;}
+.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;}
+.pager:after{clear:both;}
+.pager li{display:inline;}
+.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;}
+.pager a:hover{text-decoration:none;background-color:#f5f5f5;}
+.pager .next a{float:right;}
+.pager .previous a{float:left;}
+.pager .disabled a,.pager .disabled a:hover{color:#999999;background-color:#fff;cursor:default;}
+.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;}
+.thumbnails:after{clear:both;}
+.row-fluid .thumbnails{margin-left:0;}
+.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;}
+.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;}
+a.thumbnail:hover{border-color:#0e84b5;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);}
+.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;}
+.thumbnail .caption{padding:9px;color:#555555;}
+.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;}
+.alert h4{margin:0;}
+.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;}
+.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;}
+.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;}
+.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;}
+.alert-block{padding-top:14px;padding-bottom:14px;}
+.alert-block>p,.alert-block>ul{margin-bottom:0;}
+.alert-block p+p{margin-top:5px;}
+ at -webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0 [...]
+.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);bac [...]
+.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);}
+.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, [...]
+.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;}
+.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f [...]
+.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, t [...]
+.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
+.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
+.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc [...]
+.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, trans [...]
+.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=' [...]
+.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, [...]
+.hero-unit{padding:60px;margin-bottom:30px;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;}
+.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit;}
+.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);}
+.tooltip.top{margin-top:-3px;}
+.tooltip.right{margin-left:3px;}
+.tooltip.bottom{margin-top:3px;}
+.tooltip.left{margin-left:-3px;}
+.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;}
+.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;}
+.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;}
+.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;}
+.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;}
+.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-bo [...]
+.popover.right{margin-left:10px;}
+.popover.bottom{margin-top:10px;}
+.popover.left{margin-right:10px;}
+.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}
+.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;}
+.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;}
+.popover .arrow:after{content:"";z-index:-1;}
+.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;}
+.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;}
+.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;}
+.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;}
+.modal-open .dropdown-menu{z-index:2050;}
+.modal-open .dropdown.open{*z-index:2050;}
+.modal-open .popover{z-index:2060;}
+.modal-open .tooltip{z-index:2080;}
+.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
+.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
+.modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-cli [...]
+.modal.fade.in{top:50%;}
+.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
+.modal-header h3{margin:0;line-height:30px;}
+.modal-body{overflow-y:auto;max-height:400px;padding:15px;}
+.modal-form{margin-bottom:0;}
+.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;}
+.modal-footer:after{clear:both;}
+.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
+.modal-footer .btn-group .btn+.btn{margin-left:-1px;}
+.dropup,.dropdown{position:relative;}
+.dropdown-toggle{*margin-bottom:-3px;}
+.dropdown-toggle:active,.open .dropdown-toggle{outline:0;}
+.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";}
+.dropdown .caret{margin-top:8px;margin-left:2px;}
+.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-ba [...]
+.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;}
+.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;}
+.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d); [...]
+.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;outline:0;background-color:#0e84b5;background-color:#0d7dac;background-image:-moz-linear-gradient(top, #0e84b5, #0c739d);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0e84b5), to(#0c739d));background-image:-webkit-linear-gradient(top, #0e84b5, #0c739d);background-image:-o-linear-gradient(top, #0e84b5, #0c739d);background-image:linear-gradient(to bottom, #0e84b5, #0c739d);background-r [...]
+.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;}
+.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;}
+.open{*z-index:1000;}.open >.dropdown-menu{display:block;}
+.pull-right>.dropdown-menu{right:0;left:auto;}
+.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"\2191";}
+.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;}
+.dropdown-submenu{position:relative;}
+.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
+.dropdown-submenu:hover .dropdown-menu{display:block;}
+.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
+.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
+.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;}
+.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.accordion{margin-bottom:20px;}
+.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.accordion-heading{border-bottom:0;}
+.accordion-heading .accordion-toggle{display:block;padding:8px 15px;}
+.accordion-toggle{cursor:pointer;}
+.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;}
+.carousel{position:relative;margin-bottom:20px;line-height:1;}
+.carousel-inner{overflow:hidden;width:100%;position:relative;}
+.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}
+.carousel .item>img{display:block;line-height:1;}
+.carousel .active,.carousel .next,.carousel .prev{display:block;}
+.carousel .active{left:0;}
+.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;}
+.carousel .next{left:100%;}
+.carousel .prev{left:-100%;}
+.carousel .next.left,.carousel .prev.right{left:0;}
+.carousel .active.left{left:-100%;}
+.carousel .active.right{left:100%;}
+.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;}
+.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);}
+.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);}
+.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;}
+.carousel-caption h4{margin:0 0 5px;}
+.carousel-caption p{margin-bottom:0;}
+.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
+button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.invisible{visibility:hidden;}
+.affix{position:fixed;}
+.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;}
+.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;}
+.hidden{display:none;visibility:hidden;}
+.visible-phone{display:none !important;}
+.visible-tablet{display:none !important;}
+.hidden-desktop{display:none !important;}
+.visible-desktop{display:inherit !important;}
+ at media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .nav [...]
+
+.footer {
+    background-color: #eee;
+}
+
+.quick-links {
+    background-color: #EEEEEE;
+}
+
+.quick-links strong {
+    color: #999999;
+}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.css b/doc/_themes/bootstrap/static/bootstrap-responsive.css
new file mode 100644
index 0000000..daafa91
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-responsive.css
@@ -0,0 +1,1040 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+.clearfix {
+  *zoom: 1;
+}
+
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  line-height: 0;
+  content: "";
+}
+
+.clearfix:after {
+  clear: both;
+}
+
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+     -moz-box-sizing: border-box;
+          box-sizing: border-box;
+}
+
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+
+.visible-phone {
+  display: none !important;
+}
+
+.visible-tablet {
+  display: none !important;
+}
+
+.hidden-desktop {
+  display: none !important;
+}
+
+.visible-desktop {
+  display: inherit !important;
+}
+
+ at media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+
+ at media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+
+ at media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+
+ at media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    line-height: 0;
+    content: "";
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    float: left;
+    width: 100%;
+    min-height: 30px;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12,
+  textarea.span12,
+  .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11,
+  textarea.span11,
+  .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10,
+  textarea.span10,
+  .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9,
+  textarea.span9,
+  .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8,
+  textarea.span8,
+  .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7,
+  textarea.span7,
+  .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6,
+  textarea.span6,
+  .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5,
+  textarea.span5,
+  .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4,
+  textarea.span4,
+  .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3,
+  textarea.span3,
+  .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2,
+  textarea.span2,
+  .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1,
+  textarea.span1,
+  .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+
+ at media (max-width: 767px) {
+  body {
+    padding-right: 20px;
+    padding-left: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-right: -20px;
+    margin-left: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    width: auto;
+    clear: none;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    display: block;
+    float: none;
+    width: auto;
+    margin-left: 0;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+       -moz-box-sizing: border-box;
+            box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    right: 20px;
+    left: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+}
+
+ at media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+  .modal {
+    top: 10px;
+    right: 10px;
+    left: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+
+ at media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-right: 10px;
+    padding-left: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #555555;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #555555;
+    -webkit-border-radius: 3px;
+       -moz-border-radius: 3px;
+            border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+       -moz-border-radius: 4px;
+            border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #f2f2f2;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    padding: 0;
+    margin-top: 5px;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    display: block;
+    float: none;
+    max-width: none;
+    padding: 0;
+    margin: 0 15px;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+       -moz-border-radius: 0;
+            border-radius: 0;
+    -webkit-box-shadow: none;
+       -moz-box-shadow: none;
+            box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #f2f2f2;
+    border-bottom: 1px solid #f2f2f2;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+       -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    height: 0;
+    overflow: hidden;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-right: 10px;
+    padding-left: 10px;
+  }
+}
+
+ at media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
diff --git a/doc/_themes/bootstrap/static/bootstrap-responsive.min.css b/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
new file mode 100644
index 0000000..ab59da3
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-responsive.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Responsive v2.1.0
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{displa [...]
diff --git a/doc/_themes/bootstrap/static/bootstrap-sapling.css b/doc/_themes/bootstrap/static/bootstrap-sapling.css
new file mode 100644
index 0000000..c50510a
--- /dev/null
+++ b/doc/_themes/bootstrap/static/bootstrap-sapling.css
@@ -0,0 +1,6484 @@
+/*!
+ * vendor/styles/bootstrap v2.0.3
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+  display: block;
+}
+audio,
+canvas,
+video {
+  display: inline-block;
+  *display: inline;
+  *zoom: 1;
+}
+audio:not([controls]) {
+  display: none;
+}
+html {
+  font-size: 100%;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+}
+a:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+a:hover,
+a:active {
+  outline: 0;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sup {
+  top: -0.5em;
+}
+sub {
+  bottom: -0.25em;
+}
+img {
+  max-width: 100%;
+  height: auto;
+  vertical-align: middle;
+  border: 0;
+  -ms-interpolation-mode: bicubic;
+}
+#map_canvas img {
+  max-width: none;
+}
+button,
+input,
+select,
+textarea {
+  margin: 0;
+  font-size: 100%;
+  vertical-align: middle;
+}
+button,
+input {
+  *overflow: visible;
+  line-height: normal;
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"] {
+  cursor: pointer;
+  -webkit-appearance: button;
+}
+input[type="search"] {
+  -webkit-box-sizing: content-box;
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+  -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+  -webkit-appearance: none;
+}
+textarea {
+  overflow: auto;
+  vertical-align: top;
+}
+.clearfix {
+  *zoom: 1;
+}
+.clearfix:before,
+.clearfix:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.clearfix:after {
+  clear: both;
+}
+.hide-text {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+.input-block-level {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+body {
+  margin: 0;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 14px;
+  line-height: 20px;
+  color: #1f444b;
+  background-color: #ffffff;
+}
+a {
+  color: #6e8f4a;
+  text-decoration: none;
+}
+a:hover {
+  color: #f26a1e;
+  text-decoration: underline;
+}
+.img-rounded {
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.img-polaroid {
+  padding: 4px;
+  background-color: #fff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+}
+.img-circle {
+  -webkit-border-radius: 500px;
+  -moz-border-radius: 500px;
+  border-radius: 500px;
+}
+.row {
+  margin-left: -20px;
+  *zoom: 1;
+}
+.row:before,
+.row:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row:after {
+  clear: both;
+}
+[class*="span"] {
+  float: left;
+  margin-left: 20px;
+}
+.container,
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.span12 {
+  width: 940px;
+}
+.span11 {
+  width: 860px;
+}
+.span10 {
+  width: 780px;
+}
+.span9 {
+  width: 700px;
+}
+.span8 {
+  width: 620px;
+}
+.span7 {
+  width: 540px;
+}
+.span6 {
+  width: 460px;
+}
+.span5 {
+  width: 380px;
+}
+.span4 {
+  width: 300px;
+}
+.span3 {
+  width: 220px;
+}
+.span2 {
+  width: 140px;
+}
+.span1 {
+  width: 60px;
+}
+.offset12 {
+  margin-left: 980px;
+}
+.offset11 {
+  margin-left: 900px;
+}
+.offset10 {
+  margin-left: 820px;
+}
+.offset9 {
+  margin-left: 740px;
+}
+.offset8 {
+  margin-left: 660px;
+}
+.offset7 {
+  margin-left: 580px;
+}
+.offset6 {
+  margin-left: 500px;
+}
+.offset5 {
+  margin-left: 420px;
+}
+.offset4 {
+  margin-left: 340px;
+}
+.offset3 {
+  margin-left: 260px;
+}
+.offset2 {
+  margin-left: 180px;
+}
+.offset1 {
+  margin-left: 100px;
+}
+.row-fluid {
+  width: 100%;
+  *zoom: 1;
+}
+.row-fluid:before,
+.row-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.row-fluid:after {
+  clear: both;
+}
+.row-fluid [class*="span"] {
+  display: block;
+  width: 100%;
+  min-height: 30px;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  float: left;
+  margin-left: 2.127659574468085%;
+  *margin-left: 2.074468085106383%;
+}
+.row-fluid [class*="span"]:first-child {
+  margin-left: 0;
+}
+.row-fluid .span12 {
+  width: 100%;
+  *width: 99.94680851063829%;
+}
+.row-fluid .span11 {
+  width: 91.48936170212765%;
+  *width: 91.43617021276594%;
+}
+.row-fluid .span10 {
+  width: 82.97872340425532%;
+  *width: 82.92553191489361%;
+}
+.row-fluid .span9 {
+  width: 74.46808510638297%;
+  *width: 74.41489361702126%;
+}
+.row-fluid .span8 {
+  width: 65.95744680851064%;
+  *width: 65.90425531914893%;
+}
+.row-fluid .span7 {
+  width: 57.44680851063829%;
+  *width: 57.39361702127659%;
+}
+.row-fluid .span6 {
+  width: 48.93617021276595%;
+  *width: 48.88297872340425%;
+}
+.row-fluid .span5 {
+  width: 40.42553191489362%;
+  *width: 40.37234042553192%;
+}
+.row-fluid .span4 {
+  width: 31.914893617021278%;
+  *width: 31.861702127659576%;
+}
+.row-fluid .span3 {
+  width: 23.404255319148934%;
+  *width: 23.351063829787233%;
+}
+.row-fluid .span2 {
+  width: 14.893617021276595%;
+  *width: 14.840425531914894%;
+}
+.row-fluid .span1 {
+  width: 6.382978723404255%;
+  *width: 6.329787234042553%;
+}
+.row-fluid .offset12 {
+  margin-left: 104.25531914893617%;
+  *margin-left: 104.14893617021275%;
+}
+.row-fluid .offset12:first-child {
+  margin-left: 102.12765957446808%;
+  *margin-left: 102.02127659574467%;
+}
+.row-fluid .offset11 {
+  margin-left: 95.74468085106382%;
+  *margin-left: 95.6382978723404%;
+}
+.row-fluid .offset11:first-child {
+  margin-left: 93.61702127659574%;
+  *margin-left: 93.51063829787232%;
+}
+.row-fluid .offset10 {
+  margin-left: 87.23404255319149%;
+  *margin-left: 87.12765957446807%;
+}
+.row-fluid .offset10:first-child {
+  margin-left: 85.1063829787234%;
+  *margin-left: 84.99999999999999%;
+}
+.row-fluid .offset9 {
+  margin-left: 78.72340425531914%;
+  *margin-left: 78.61702127659572%;
+}
+.row-fluid .offset9:first-child {
+  margin-left: 76.59574468085106%;
+  *margin-left: 76.48936170212764%;
+}
+.row-fluid .offset8 {
+  margin-left: 70.2127659574468%;
+  *margin-left: 70.10638297872339%;
+}
+.row-fluid .offset8:first-child {
+  margin-left: 68.08510638297872%;
+  *margin-left: 67.9787234042553%;
+}
+.row-fluid .offset7 {
+  margin-left: 61.70212765957446%;
+  *margin-left: 61.59574468085106%;
+}
+.row-fluid .offset7:first-child {
+  margin-left: 59.574468085106375%;
+  *margin-left: 59.46808510638297%;
+}
+.row-fluid .offset6 {
+  margin-left: 53.191489361702125%;
+  *margin-left: 53.085106382978715%;
+}
+.row-fluid .offset6:first-child {
+  margin-left: 51.063829787234035%;
+  *margin-left: 50.95744680851063%;
+}
+.row-fluid .offset5 {
+  margin-left: 44.68085106382979%;
+  *margin-left: 44.57446808510638%;
+}
+.row-fluid .offset5:first-child {
+  margin-left: 42.5531914893617%;
+  *margin-left: 42.4468085106383%;
+}
+.row-fluid .offset4 {
+  margin-left: 36.170212765957444%;
+  *margin-left: 36.06382978723405%;
+}
+.row-fluid .offset4:first-child {
+  margin-left: 34.04255319148936%;
+  *margin-left: 33.93617021276596%;
+}
+.row-fluid .offset3 {
+  margin-left: 27.659574468085104%;
+  *margin-left: 27.5531914893617%;
+}
+.row-fluid .offset3:first-child {
+  margin-left: 25.53191489361702%;
+  *margin-left: 25.425531914893618%;
+}
+.row-fluid .offset2 {
+  margin-left: 19.148936170212764%;
+  *margin-left: 19.04255319148936%;
+}
+.row-fluid .offset2:first-child {
+  margin-left: 17.02127659574468%;
+  *margin-left: 16.914893617021278%;
+}
+.row-fluid .offset1 {
+  margin-left: 10.638297872340425%;
+  *margin-left: 10.53191489361702%;
+}
+.row-fluid .offset1:first-child {
+  margin-left: 8.51063829787234%;
+  *margin-left: 8.404255319148938%;
+}
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+  display: none;
+}
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+  float: right;
+}
+.container {
+  margin-right: auto;
+  margin-left: auto;
+  *zoom: 1;
+}
+.container:before,
+.container:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container:after {
+  clear: both;
+}
+.container-fluid {
+  padding-right: 20px;
+  padding-left: 20px;
+  *zoom: 1;
+}
+.container-fluid:before,
+.container-fluid:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.container-fluid:after {
+  clear: both;
+}
+p {
+  margin: 0 0 10px;
+}
+.lead {
+  margin-bottom: 20px;
+  font-size: 20px;
+  font-weight: 200;
+  line-height: 30px;
+}
+small {
+  font-size: 85%;
+}
+strong {
+  font-weight: bold;
+}
+em {
+  font-style: italic;
+}
+cite {
+  font-style: normal;
+}
+.muted {
+  color: #999999;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 10px 0;
+  font-family: inherit;
+  font-weight: bold;
+  line-height: 1;
+  color: inherit;
+  text-rendering: optimizelegibility;
+}
+h1 small,
+h2 small,
+h3 small,
+h4 small,
+h5 small,
+h6 small {
+  font-weight: normal;
+  line-height: 1;
+  color: #999999;
+}
+h1 {
+  font-size: 36px;
+  line-height: 40px;
+}
+h2 {
+  font-size: 30px;
+  line-height: 40px;
+}
+h3 {
+  font-size: 24px;
+  line-height: 40px;
+}
+h4 {
+  font-size: 18px;
+  line-height: 20px;
+}
+h5 {
+  font-size: 14px;
+  line-height: 20px;
+}
+h6 {
+  font-size: 12px;
+  line-height: 20px;
+}
+h1 small {
+  font-size: 24px;
+}
+h2 small {
+  font-size: 18px;
+}
+h3 small {
+  font-size: 14px;
+}
+h4 small {
+  font-size: 14px;
+}
+.page-header {
+  padding-bottom: 9px;
+  margin: 20px 0 30px;
+  border-bottom: 1px solid #eeeeee;
+}
+ul,
+ol {
+  padding: 0;
+  margin: 0 0 10px 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+  margin-bottom: 0;
+}
+li {
+  line-height: 20px;
+}
+ul.unstyled,
+ol.unstyled {
+  margin-left: 0;
+  list-style: none;
+}
+dl {
+  margin-bottom: 20px;
+}
+dt,
+dd {
+  line-height: 20px;
+}
+dt {
+  font-weight: bold;
+}
+dd {
+  margin-left: 10px;
+}
+.dl-horizontal dt {
+  float: left;
+  width: 120px;
+  clear: left;
+  text-align: right;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+.dl-horizontal dd {
+  margin-left: 130px;
+}
+hr {
+  margin: 20px 0;
+  border: 0;
+  border-top: 1px solid #eeeeee;
+  border-bottom: 1px solid #ffffff;
+}
+abbr[title] {
+  cursor: help;
+  border-bottom: 1px dotted #999999;
+}
+abbr.initialism {
+  font-size: 90%;
+  text-transform: uppercase;
+}
+blockquote {
+  padding: 0 0 0 15px;
+  margin: 0 0 20px;
+  border-left: 5px solid #eeeeee;
+}
+blockquote p {
+  margin-bottom: 0;
+  font-size: 16px;
+  font-weight: 300;
+  line-height: 25px;
+}
+blockquote small {
+  display: block;
+  line-height: 20px;
+  color: #999999;
+}
+blockquote small:before {
+  content: '\2014 \00A0';
+}
+blockquote.pull-right {
+  float: right;
+  padding-right: 15px;
+  padding-left: 0;
+  border-right: 5px solid #eeeeee;
+  border-left: 0;
+}
+blockquote.pull-right p,
+blockquote.pull-right small {
+  text-align: right;
+}
+blockquote.pull-right small:before {
+  content: '';
+}
+blockquote.pull-right small:after {
+  content: '\00A0 \2014';
+}
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+  content: "";
+}
+address {
+  display: block;
+  margin-bottom: 20px;
+  font-style: normal;
+  line-height: 20px;
+}
+code,
+pre {
+  padding: 0 3px 2px;
+  font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
+  font-size: 12px;
+  color: #333333;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+code {
+  padding: 2px 4px;
+  color: #d14;
+  background-color: #f7f7f9;
+  border: 1px solid #e1e1e8;
+}
+pre {
+  display: block;
+  padding: 9.5px;
+  margin: 0 0 10px;
+  font-size: 13px;
+  line-height: 20px;
+  word-break: break-all;
+  word-wrap: break-word;
+  white-space: pre;
+  white-space: pre-wrap;
+  background-color: #f5f5f5;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.15);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+pre.prettyprint {
+  margin-bottom: 20px;
+}
+pre code {
+  padding: 0;
+  color: inherit;
+  background-color: transparent;
+  border: 0;
+}
+.pre-scrollable {
+  max-height: 340px;
+  overflow-y: scroll;
+}
+form {
+  margin: 0 0 20px;
+}
+fieldset {
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: 20px;
+  font-size: 21px;
+  line-height: 40px;
+  color: #333333;
+  border: 0;
+  border-bottom: 1px solid #e5e5e5;
+}
+legend small {
+  font-size: 15px;
+  color: #999999;
+}
+label,
+input,
+button,
+select,
+textarea {
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+}
+input,
+button,
+select,
+textarea {
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+}
+label {
+  display: block;
+  margin-bottom: 5px;
+}
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  display: inline-block;
+  height: 20px;
+  padding: 4px 6px;
+  margin-bottom: 9px;
+  font-size: 14px;
+  line-height: 20px;
+  color: #555555;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+input,
+textarea {
+  width: 210px;
+}
+textarea {
+  height: auto;
+}
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+  background-color: #ffffff;
+  border: 1px solid #cccccc;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -webkit-transition: border linear .2s, box-shadow linear .2s;
+  -moz-transition: border linear .2s, box-shadow linear .2s;
+  -o-transition: border linear .2s, box-shadow linear .2s;
+  transition: border linear .2s, box-shadow linear .2s;
+}
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="datetime"]:focus,
+input[type="datetime-local"]:focus,
+input[type="date"]:focus,
+input[type="month"]:focus,
+input[type="time"]:focus,
+input[type="week"]:focus,
+input[type="number"]:focus,
+input[type="email"]:focus,
+input[type="url"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="color"]:focus,
+.uneditable-input:focus {
+  border-color: rgba(82, 168, 236, 0.8);
+  outline: 0;
+  outline: thin dotted \9;
+  /* IE6-9 */
+
+  -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+  box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);
+}
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  *margin-top: 0;
+  /* IE7 */
+
+  margin-top: 1px \9;
+  /* IE8-9 */
+
+  line-height: normal;
+  cursor: pointer;
+}
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+  width: auto;
+}
+select,
+input[type="file"] {
+  height: 30px;
+  /* In IE7, the height of the select element cannot be changed by height, only font-size */
+
+  *margin-top: 4px;
+  /* For IE7, add top margin to align select with labels */
+
+  line-height: 30px;
+}
+select {
+  width: 220px;
+  border: 1px solid #bbb;
+  background-color: #ffffff;
+}
+select[multiple],
+select[size] {
+  height: auto;
+}
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.uneditable-input,
+.uneditable-textarea {
+  color: #999999;
+  background-color: #fcfcfc;
+  border-color: #cccccc;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
+  cursor: not-allowed;
+}
+.uneditable-input {
+  overflow: hidden;
+  white-space: nowrap;
+}
+.uneditable-textarea {
+  width: auto;
+  height: auto;
+}
+input:-moz-placeholder,
+textarea:-moz-placeholder {
+  color: #999999;
+}
+input:-ms-input-placeholder,
+textarea:-ms-input-placeholder {
+  color: #999999;
+}
+input::-webkit-input-placeholder,
+textarea::-webkit-input-placeholder {
+  color: #999999;
+}
+.radio,
+.checkbox {
+  min-height: 18px;
+  padding-left: 18px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+  float: left;
+  margin-left: -18px;
+}
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+  padding-top: 5px;
+}
+.radio.inline,
+.checkbox.inline {
+  display: inline-block;
+  padding-top: 5px;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+  margin-left: 10px;
+}
+.input-mini {
+  width: 60px;
+}
+.input-small {
+  width: 90px;
+}
+.input-medium {
+  width: 150px;
+}
+.input-large {
+  width: 210px;
+}
+.input-xlarge {
+  width: 270px;
+}
+.input-xxlarge {
+  width: 530px;
+}
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+  float: none;
+  margin-left: 0;
+}
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+  display: inline-block;
+}
+input,
+textarea,
+.uneditable-input {
+  margin-left: 0;
+}
+.controls-row [class*="span"] + [class*="span"] {
+  margin-left: 20px;
+}
+input.span12, textarea.span12, .uneditable-input.span12 {
+  width: 926px;
+}
+input.span11, textarea.span11, .uneditable-input.span11 {
+  width: 846px;
+}
+input.span10, textarea.span10, .uneditable-input.span10 {
+  width: 766px;
+}
+input.span9, textarea.span9, .uneditable-input.span9 {
+  width: 686px;
+}
+input.span8, textarea.span8, .uneditable-input.span8 {
+  width: 606px;
+}
+input.span7, textarea.span7, .uneditable-input.span7 {
+  width: 526px;
+}
+input.span6, textarea.span6, .uneditable-input.span6 {
+  width: 446px;
+}
+input.span5, textarea.span5, .uneditable-input.span5 {
+  width: 366px;
+}
+input.span4, textarea.span4, .uneditable-input.span4 {
+  width: 286px;
+}
+input.span3, textarea.span3, .uneditable-input.span3 {
+  width: 206px;
+}
+input.span2, textarea.span2, .uneditable-input.span2 {
+  width: 126px;
+}
+input.span1, textarea.span1, .uneditable-input.span1 {
+  width: 46px;
+}
+.controls-row {
+  *zoom: 1;
+}
+.controls-row:before,
+.controls-row:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.controls-row:after {
+  clear: both;
+}
+.controls-row [class*="span"] {
+  float: left;
+}
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+  cursor: not-allowed;
+  background-color: #eeeeee;
+}
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+  background-color: transparent;
+}
+.control-group.warning > label,
+.control-group.warning .help-block,
+.control-group.warning .help-inline {
+  color: #c09853;
+}
+.control-group.warning .checkbox,
+.control-group.warning .radio,
+.control-group.warning input,
+.control-group.warning select,
+.control-group.warning textarea {
+  color: #c09853;
+  border-color: #c09853;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.warning .checkbox:focus,
+.control-group.warning .radio:focus,
+.control-group.warning input:focus,
+.control-group.warning select:focus,
+.control-group.warning textarea:focus {
+  border-color: #a47e3c;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
+}
+.control-group.warning .input-prepend .add-on,
+.control-group.warning .input-append .add-on {
+  color: #c09853;
+  background-color: #fcf8e3;
+  border-color: #c09853;
+}
+.control-group.error > label,
+.control-group.error .help-block,
+.control-group.error .help-inline {
+  color: #b94a48;
+}
+.control-group.error .checkbox,
+.control-group.error .radio,
+.control-group.error input,
+.control-group.error select,
+.control-group.error textarea {
+  color: #b94a48;
+  border-color: #b94a48;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.error .checkbox:focus,
+.control-group.error .radio:focus,
+.control-group.error input:focus,
+.control-group.error select:focus,
+.control-group.error textarea:focus {
+  border-color: #953b39;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
+}
+.control-group.error .input-prepend .add-on,
+.control-group.error .input-append .add-on {
+  color: #b94a48;
+  background-color: #f2dede;
+  border-color: #b94a48;
+}
+.control-group.success > label,
+.control-group.success .help-block,
+.control-group.success .help-inline {
+  color: #468847;
+}
+.control-group.success .checkbox,
+.control-group.success .radio,
+.control-group.success input,
+.control-group.success select,
+.control-group.success textarea {
+  color: #468847;
+  border-color: #468847;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.control-group.success .checkbox:focus,
+.control-group.success .radio:focus,
+.control-group.success input:focus,
+.control-group.success select:focus,
+.control-group.success textarea:focus {
+  border-color: #356635;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
+}
+.control-group.success .input-prepend .add-on,
+.control-group.success .input-append .add-on {
+  color: #468847;
+  background-color: #dff0d8;
+  border-color: #468847;
+}
+input:focus:required:invalid,
+textarea:focus:required:invalid,
+select:focus:required:invalid {
+  color: #b94a48;
+  border-color: #ee5f5b;
+}
+input:focus:required:invalid:focus,
+textarea:focus:required:invalid:focus,
+select:focus:required:invalid:focus {
+  border-color: #e9322d;
+  -webkit-box-shadow: 0 0 6px #f8b9b7;
+  -moz-box-shadow: 0 0 6px #f8b9b7;
+  box-shadow: 0 0 6px #f8b9b7;
+}
+.form-actions {
+  padding: 19px 20px 20px;
+  margin-top: 20px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border-top: 1px solid #e5e5e5;
+  *zoom: 1;
+}
+.form-actions:before,
+.form-actions:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.form-actions:after {
+  clear: both;
+}
+.help-block,
+.help-inline {
+  color: #357581;
+}
+.help-block {
+  display: block;
+  margin-bottom: 10px;
+}
+.help-inline {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  vertical-align: middle;
+  padding-left: 5px;
+}
+.input-append,
+.input-prepend {
+  margin-bottom: 5px;
+  font-size: 0;
+  white-space: nowrap;
+}
+.input-append input,
+.input-prepend input,
+.input-append select,
+.input-prepend select,
+.input-append .uneditable-input,
+.input-prepend .uneditable-input {
+  position: relative;
+  margin-bottom: 0;
+  *margin-left: 0;
+  font-size: 14px;
+  vertical-align: top;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-append input:focus,
+.input-prepend input:focus,
+.input-append select:focus,
+.input-prepend select:focus,
+.input-append .uneditable-input:focus,
+.input-prepend .uneditable-input:focus {
+  z-index: 2;
+}
+.input-append .add-on,
+.input-prepend .add-on {
+  display: inline-block;
+  width: auto;
+  height: 20px;
+  min-width: 16px;
+  padding: 4px 5px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 20px;
+  text-align: center;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #eeeeee;
+  border: 1px solid #ccc;
+}
+.input-append .add-on,
+.input-prepend .add-on,
+.input-append .btn,
+.input-prepend .btn {
+  margin-left: -1px;
+  vertical-align: top;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-append .active,
+.input-prepend .active {
+  background-color: #a9dba9;
+  border-color: #46a546;
+}
+.input-prepend .add-on,
+.input-prepend .btn {
+  margin-right: -1px;
+}
+.input-prepend .add-on:first-child,
+.input-prepend .btn:first-child {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append input,
+.input-append select,
+.input-append .uneditable-input {
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-append .add-on:last-child,
+.input-append .btn:last-child {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.input-prepend.input-append input,
+.input-prepend.input-append select,
+.input-prepend.input-append .uneditable-input {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.input-prepend.input-append .add-on:first-child,
+.input-prepend.input-append .btn:first-child {
+  margin-right: -1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.input-prepend.input-append .add-on:last-child,
+.input-prepend.input-append .btn:last-child {
+  margin-left: -1px;
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+input.search-query {
+  padding-right: 14px;
+  padding-right: 4px \9;
+  padding-left: 14px;
+  padding-left: 4px \9;
+  /* IE7-8 doesn't have border-radius, so don't indent the padding */
+
+  margin-bottom: 0;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+/* Allow for input prepend/append in search forms */
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.form-search .input-append .search-query {
+  -webkit-border-radius: 14px 0 0 14px;
+  -moz-border-radius: 14px 0 0 14px;
+  border-radius: 14px 0 0 14px;
+}
+.form-search .input-append .btn {
+  -webkit-border-radius: 0 14px 14px 0;
+  -moz-border-radius: 0 14px 14px 0;
+  border-radius: 0 14px 14px 0;
+}
+.form-search .input-prepend .search-query {
+  -webkit-border-radius: 0 14px 14px 0;
+  -moz-border-radius: 0 14px 14px 0;
+  border-radius: 0 14px 14px 0;
+}
+.form-search .input-prepend .btn {
+  -webkit-border-radius: 14px 0 0 14px;
+  -moz-border-radius: 14px 0 0 14px;
+  border-radius: 14px 0 0 14px;
+}
+.form-search input,
+.form-inline input,
+.form-horizontal input,
+.form-search textarea,
+.form-inline textarea,
+.form-horizontal textarea,
+.form-search select,
+.form-inline select,
+.form-horizontal select,
+.form-search .help-inline,
+.form-inline .help-inline,
+.form-horizontal .help-inline,
+.form-search .uneditable-input,
+.form-inline .uneditable-input,
+.form-horizontal .uneditable-input,
+.form-search .input-prepend,
+.form-inline .input-prepend,
+.form-horizontal .input-prepend,
+.form-search .input-append,
+.form-inline .input-append,
+.form-horizontal .input-append {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.form-search .hide,
+.form-inline .hide,
+.form-horizontal .hide {
+  display: none;
+}
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+  display: inline-block;
+}
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+  margin-bottom: 0;
+}
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+  padding-left: 0;
+  margin-bottom: 0;
+  vertical-align: middle;
+}
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+  float: left;
+  margin-right: 3px;
+  margin-left: 0;
+}
+.control-group {
+  margin-bottom: 10px;
+}
+legend + .control-group {
+  margin-top: 20px;
+  -webkit-margin-top-collapse: separate;
+}
+.form-horizontal .control-group {
+  margin-bottom: 20px;
+  *zoom: 1;
+}
+.form-horizontal .control-group:before,
+.form-horizontal .control-group:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.form-horizontal .control-group:after {
+  clear: both;
+}
+.form-horizontal .control-label {
+  float: left;
+  width: 140px;
+  padding-top: 5px;
+  text-align: right;
+}
+.form-horizontal .controls {
+  *display: inline-block;
+  *padding-left: 20px;
+  margin-left: 160px;
+  *margin-left: 0;
+}
+.form-horizontal .controls:first-child {
+  *padding-left: 160px;
+}
+.form-horizontal .help-block {
+  margin-top: 10px;
+  margin-bottom: 0;
+}
+.form-horizontal .form-actions {
+  padding-left: 160px;
+}
+table {
+  max-width: 100%;
+  background-color: transparent;
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+.table {
+  width: 100%;
+  margin-bottom: 20px;
+}
+.table th,
+.table td {
+  padding: 8px;
+  line-height: 20px;
+  text-align: left;
+  vertical-align: top;
+  border-top: 1px solid #dddddd;
+}
+.table th {
+  font-weight: bold;
+}
+.table thead th {
+  vertical-align: bottom;
+}
+.table caption + thead tr:first-child th,
+.table caption + thead tr:first-child td,
+.table colgroup + thead tr:first-child th,
+.table colgroup + thead tr:first-child td,
+.table thead:first-child tr:first-child th,
+.table thead:first-child tr:first-child td {
+  border-top: 0;
+}
+.table tbody + tbody {
+  border-top: 2px solid #dddddd;
+}
+.table-condensed th,
+.table-condensed td {
+  padding: 4px 5px;
+}
+.table-bordered {
+  border: 1px solid #dddddd;
+  border-collapse: separate;
+  *border-collapse: collapse;
+  border-left: 0;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.table-bordered th,
+.table-bordered td {
+  border-left: 1px solid #dddddd;
+}
+.table-bordered caption + thead tr:first-child th,
+.table-bordered caption + tbody tr:first-child th,
+.table-bordered caption + tbody tr:first-child td,
+.table-bordered colgroup + thead tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child th,
+.table-bordered colgroup + tbody tr:first-child td,
+.table-bordered thead:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child th,
+.table-bordered tbody:first-child tr:first-child td {
+  border-top: 0;
+}
+.table-bordered thead:first-child tr:first-child th:first-child,
+.table-bordered tbody:first-child tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+  border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+.table-bordered thead:first-child tr:first-child th:last-child,
+.table-bordered tbody:first-child tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+  border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:first-child,
+.table-bordered tbody:last-child tr:last-child td:first-child,
+.table-bordered tfoot:last-child tr:last-child td:first-child {
+  -webkit-border-radius: 0 0 0 4px;
+  -moz-border-radius: 0 0 0 4px;
+  border-radius: 0 0 0 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+}
+.table-bordered thead:last-child tr:last-child th:last-child,
+.table-bordered tbody:last-child tr:last-child td:last-child,
+.table-bordered tfoot:last-child tr:last-child td:last-child {
+  -webkit-border-bottom-right-radius: 4px;
+  border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+}
+.table-bordered caption + thead tr:first-child th:first-child,
+.table-bordered caption + tbody tr:first-child td:first-child,
+.table-bordered colgroup + thead tr:first-child th:first-child,
+.table-bordered colgroup + tbody tr:first-child td:first-child {
+  -webkit-border-top-left-radius: 4px;
+  border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+}
+.table-bordered caption + thead tr:first-child th:last-child,
+.table-bordered caption + tbody tr:first-child td:last-child,
+.table-bordered colgroup + thead tr:first-child th:last-child,
+.table-bordered colgroup + tbody tr:first-child td:last-child {
+  -webkit-border-top-right-radius: 4px;
+  border-top-right-radius: 4px;
+  -moz-border-right-topleft: 4px;
+}
+.table-striped tbody tr:nth-child(odd) td,
+.table-striped tbody tr:nth-child(odd) th {
+  background-color: #f9f9f9;
+}
+.table-hover tbody tr:hover td,
+.table-hover tbody tr:hover th {
+  background-color: #f5f5f5;
+}
+table [class*=span],
+.row-fluid table [class*=span] {
+  display: table-cell;
+  float: none;
+  margin-left: 0;
+}
+table .span1 {
+  float: none;
+  width: 44px;
+  margin-left: 0;
+}
+table .span2 {
+  float: none;
+  width: 124px;
+  margin-left: 0;
+}
+table .span3 {
+  float: none;
+  width: 204px;
+  margin-left: 0;
+}
+table .span4 {
+  float: none;
+  width: 284px;
+  margin-left: 0;
+}
+table .span5 {
+  float: none;
+  width: 364px;
+  margin-left: 0;
+}
+table .span6 {
+  float: none;
+  width: 444px;
+  margin-left: 0;
+}
+table .span7 {
+  float: none;
+  width: 524px;
+  margin-left: 0;
+}
+table .span8 {
+  float: none;
+  width: 604px;
+  margin-left: 0;
+}
+table .span9 {
+  float: none;
+  width: 684px;
+  margin-left: 0;
+}
+table .span10 {
+  float: none;
+  width: 764px;
+  margin-left: 0;
+}
+table .span11 {
+  float: none;
+  width: 844px;
+  margin-left: 0;
+}
+table .span12 {
+  float: none;
+  width: 924px;
+  margin-left: 0;
+}
+table .span13 {
+  float: none;
+  width: 1004px;
+  margin-left: 0;
+}
+table .span14 {
+  float: none;
+  width: 1084px;
+  margin-left: 0;
+}
+table .span15 {
+  float: none;
+  width: 1164px;
+  margin-left: 0;
+}
+table .span16 {
+  float: none;
+  width: 1244px;
+  margin-left: 0;
+}
+table .span17 {
+  float: none;
+  width: 1324px;
+  margin-left: 0;
+}
+table .span18 {
+  float: none;
+  width: 1404px;
+  margin-left: 0;
+}
+table .span19 {
+  float: none;
+  width: 1484px;
+  margin-left: 0;
+}
+table .span20 {
+  float: none;
+  width: 1564px;
+  margin-left: 0;
+}
+table .span21 {
+  float: none;
+  width: 1644px;
+  margin-left: 0;
+}
+table .span22 {
+  float: none;
+  width: 1724px;
+  margin-left: 0;
+}
+table .span23 {
+  float: none;
+  width: 1804px;
+  margin-left: 0;
+}
+table .span24 {
+  float: none;
+  width: 1884px;
+  margin-left: 0;
+}
+.table tbody tr.success td {
+  background-color: #dff0d8;
+}
+.table tbody tr.error td {
+  background-color: #f2dede;
+}
+.table tbody tr.info td {
+  background-color: #d9edf7;
+}
+[class^="icon-"],
+[class*=" icon-"] {
+  display: inline-block;
+  width: 14px;
+  height: 14px;
+  *margin-right: .3em;
+  line-height: 14px;
+  vertical-align: text-top;
+  background-image: url("../img/glyphicons-halflings.png");
+  background-position: 14px 14px;
+  background-repeat: no-repeat;
+  margin-top: 1px;
+}
+/* White icons with optional class, or on hover/active states of certain elements */
+.icon-white,
+.nav > .active > a > [class^="icon-"],
+.nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"] {
+  background-image: url("../img/glyphicons-halflings-white.png");
+}
+.icon-glass {
+  background-position: 0      0;
+}
+.icon-music {
+  background-position: -24px 0;
+}
+.icon-search {
+  background-position: -48px 0;
+}
+.icon-envelope {
+  background-position: -72px 0;
+}
+.icon-heart {
+  background-position: -96px 0;
+}
+.icon-star {
+  background-position: -120px 0;
+}
+.icon-star-empty {
+  background-position: -144px 0;
+}
+.icon-user {
+  background-position: -168px 0;
+}
+.icon-film {
+  background-position: -192px 0;
+}
+.icon-th-large {
+  background-position: -216px 0;
+}
+.icon-th {
+  background-position: -240px 0;
+}
+.icon-th-list {
+  background-position: -264px 0;
+}
+.icon-ok {
+  background-position: -288px 0;
+}
+.icon-remove {
+  background-position: -312px 0;
+}
+.icon-zoom-in {
+  background-position: -336px 0;
+}
+.icon-zoom-out {
+  background-position: -360px 0;
+}
+.icon-off {
+  background-position: -384px 0;
+}
+.icon-signal {
+  background-position: -408px 0;
+}
+.icon-cog {
+  background-position: -432px 0;
+}
+.icon-trash {
+  background-position: -456px 0;
+}
+.icon-home {
+  background-position: 0 -24px;
+}
+.icon-file {
+  background-position: -24px -24px;
+}
+.icon-time {
+  background-position: -48px -24px;
+}
+.icon-road {
+  background-position: -72px -24px;
+}
+.icon-download-alt {
+  background-position: -96px -24px;
+}
+.icon-download {
+  background-position: -120px -24px;
+}
+.icon-upload {
+  background-position: -144px -24px;
+}
+.icon-inbox {
+  background-position: -168px -24px;
+}
+.icon-play-circle {
+  background-position: -192px -24px;
+}
+.icon-repeat {
+  background-position: -216px -24px;
+}
+.icon-refresh {
+  background-position: -240px -24px;
+}
+.icon-list-alt {
+  background-position: -264px -24px;
+}
+.icon-lock {
+  background-position: -287px -24px;
+}
+.icon-flag {
+  background-position: -312px -24px;
+}
+.icon-headphones {
+  background-position: -336px -24px;
+}
+.icon-volume-off {
+  background-position: -360px -24px;
+}
+.icon-volume-down {
+  background-position: -384px -24px;
+}
+.icon-volume-up {
+  background-position: -408px -24px;
+}
+.icon-qrcode {
+  background-position: -432px -24px;
+}
+.icon-barcode {
+  background-position: -456px -24px;
+}
+.icon-tag {
+  background-position: 0 -48px;
+}
+.icon-tags {
+  background-position: -25px -48px;
+}
+.icon-book {
+  background-position: -48px -48px;
+}
+.icon-bookmark {
+  background-position: -72px -48px;
+}
+.icon-print {
+  background-position: -96px -48px;
+}
+.icon-camera {
+  background-position: -120px -48px;
+}
+.icon-font {
+  background-position: -144px -48px;
+}
+.icon-bold {
+  background-position: -167px -48px;
+}
+.icon-italic {
+  background-position: -192px -48px;
+}
+.icon-text-height {
+  background-position: -216px -48px;
+}
+.icon-text-width {
+  background-position: -240px -48px;
+}
+.icon-align-left {
+  background-position: -264px -48px;
+}
+.icon-align-center {
+  background-position: -288px -48px;
+}
+.icon-align-right {
+  background-position: -312px -48px;
+}
+.icon-align-justify {
+  background-position: -336px -48px;
+}
+.icon-list {
+  background-position: -360px -48px;
+}
+.icon-indent-left {
+  background-position: -384px -48px;
+}
+.icon-indent-right {
+  background-position: -408px -48px;
+}
+.icon-facetime-video {
+  background-position: -432px -48px;
+}
+.icon-picture {
+  background-position: -456px -48px;
+}
+.icon-pencil {
+  background-position: 0 -72px;
+}
+.icon-map-marker {
+  background-position: -24px -72px;
+}
+.icon-adjust {
+  background-position: -48px -72px;
+}
+.icon-tint {
+  background-position: -72px -72px;
+}
+.icon-edit {
+  background-position: -96px -72px;
+}
+.icon-share {
+  background-position: -120px -72px;
+}
+.icon-check {
+  background-position: -144px -72px;
+}
+.icon-move {
+  background-position: -168px -72px;
+}
+.icon-step-backward {
+  background-position: -192px -72px;
+}
+.icon-fast-backward {
+  background-position: -216px -72px;
+}
+.icon-backward {
+  background-position: -240px -72px;
+}
+.icon-play {
+  background-position: -264px -72px;
+}
+.icon-pause {
+  background-position: -288px -72px;
+}
+.icon-stop {
+  background-position: -312px -72px;
+}
+.icon-forward {
+  background-position: -336px -72px;
+}
+.icon-fast-forward {
+  background-position: -360px -72px;
+}
+.icon-step-forward {
+  background-position: -384px -72px;
+}
+.icon-eject {
+  background-position: -408px -72px;
+}
+.icon-chevron-left {
+  background-position: -432px -72px;
+}
+.icon-chevron-right {
+  background-position: -456px -72px;
+}
+.icon-plus-sign {
+  background-position: 0 -96px;
+}
+.icon-minus-sign {
+  background-position: -24px -96px;
+}
+.icon-remove-sign {
+  background-position: -48px -96px;
+}
+.icon-ok-sign {
+  background-position: -72px -96px;
+}
+.icon-question-sign {
+  background-position: -96px -96px;
+}
+.icon-info-sign {
+  background-position: -120px -96px;
+}
+.icon-screenshot {
+  background-position: -144px -96px;
+}
+.icon-remove-circle {
+  background-position: -168px -96px;
+}
+.icon-ok-circle {
+  background-position: -192px -96px;
+}
+.icon-ban-circle {
+  background-position: -216px -96px;
+}
+.icon-arrow-left {
+  background-position: -240px -96px;
+}
+.icon-arrow-right {
+  background-position: -264px -96px;
+}
+.icon-arrow-up {
+  background-position: -289px -96px;
+}
+.icon-arrow-down {
+  background-position: -312px -96px;
+}
+.icon-share-alt {
+  background-position: -336px -96px;
+}
+.icon-resize-full {
+  background-position: -360px -96px;
+}
+.icon-resize-small {
+  background-position: -384px -96px;
+}
+.icon-plus {
+  background-position: -408px -96px;
+}
+.icon-minus {
+  background-position: -433px -96px;
+}
+.icon-asterisk {
+  background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+  background-position: 0 -120px;
+}
+.icon-gift {
+  background-position: -24px -120px;
+}
+.icon-leaf {
+  background-position: -48px -120px;
+}
+.icon-fire {
+  background-position: -72px -120px;
+}
+.icon-eye-open {
+  background-position: -96px -120px;
+}
+.icon-eye-close {
+  background-position: -120px -120px;
+}
+.icon-warning-sign {
+  background-position: -144px -120px;
+}
+.icon-plane {
+  background-position: -168px -120px;
+}
+.icon-calendar {
+  background-position: -192px -120px;
+}
+.icon-random {
+  background-position: -216px -120px;
+  width: 16px;
+}
+.icon-comment {
+  background-position: -240px -120px;
+}
+.icon-magnet {
+  background-position: -264px -120px;
+}
+.icon-chevron-up {
+  background-position: -288px -120px;
+}
+.icon-chevron-down {
+  background-position: -313px -119px;
+}
+.icon-retweet {
+  background-position: -336px -120px;
+}
+.icon-shopping-cart {
+  background-position: -360px -120px;
+}
+.icon-folder-close {
+  background-position: -384px -120px;
+}
+.icon-folder-open {
+  background-position: -408px -120px;
+  width: 16px;
+}
+.icon-resize-vertical {
+  background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+  background-position: -456px -118px;
+}
+.icon-hdd {
+  background-position: 0 -144px;
+}
+.icon-bullhorn {
+  background-position: -24px -144px;
+}
+.icon-bell {
+  background-position: -48px -144px;
+}
+.icon-certificate {
+  background-position: -72px -144px;
+}
+.icon-thumbs-up {
+  background-position: -96px -144px;
+}
+.icon-thumbs-down {
+  background-position: -120px -144px;
+}
+.icon-hand-right {
+  background-position: -144px -144px;
+}
+.icon-hand-left {
+  background-position: -168px -144px;
+}
+.icon-hand-up {
+  background-position: -192px -144px;
+}
+.icon-hand-down {
+  background-position: -216px -144px;
+}
+.icon-circle-arrow-right {
+  background-position: -240px -144px;
+}
+.icon-circle-arrow-left {
+  background-position: -264px -144px;
+}
+.icon-circle-arrow-up {
+  background-position: -288px -144px;
+}
+.icon-circle-arrow-down {
+  background-position: -312px -144px;
+}
+.icon-globe {
+  background-position: -336px -144px;
+}
+.icon-wrench {
+  background-position: -360px -144px;
+}
+.icon-tasks {
+  background-position: -384px -144px;
+}
+.icon-filter {
+  background-position: -408px -144px;
+}
+.icon-briefcase {
+  background-position: -432px -144px;
+}
+.icon-fullscreen {
+  background-position: -456px -144px;
+}
+/*  Font Awesome
+    the iconic font designed for use with Twitter Bootstrap
+    -------------------------------------------------------
+    The full suite of pictographic icons, examples, and documentation
+    can be found at: http://fortawesome.github.com/Font-Awesome/
+
+    License
+    -------------------------------------------------------
+    The Font Awesome webfont, CSS, and LESS files are licensed under CC BY 3.0:
+    http://creativecommons.org/licenses/by/3.0/ A mention of
+    'Font Awesome - http://fortawesome.github.com/Font-Awesome' in human-readable
+    source code is considered acceptable attribution (most common on the web).
+    If human readable source code is not available to the end user, a mention in
+    an 'About' or 'Credits' screen is considered acceptable (most common in desktop
+    or mobile software).
+
+    Contact
+    -------------------------------------------------------
+    Email: dave at davegandy.com
+    Twitter: http://twitter.com/fortaweso_me
+    Work: Lead Product Designer @ http://kyruus.com
+
+    */
+ at font-face {
+  font-family: 'FontAwesome';
+  src: url('../font/fontawesome-webfont.eot');
+  src: url('../font/fontawesome-webfont.eot?#iefix') format('embedded-opentype'), url('../font/fontawesome-webfont.woff') format('woff'), url('../font/fontawesome-webfont.ttf') format('truetype'), url('../font/fontawesome-webfont.svg#FontAwesome') format('svg');
+  font-weight: normal;
+  font-style: normal;
+}
+/*  Font Awesome styles
+    ------------------------------------------------------- */
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+  font-family: FontAwesome;
+  font-weight: normal;
+  font-style: normal;
+  display: inline-block;
+  text-decoration: inherit;
+}
+a [class^="icon-"],
+a [class*=" icon-"] {
+  display: inline-block;
+  text-decoration: inherit;
+}
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+  vertical-align: middle;
+  font-size: 1.3333333333333333em;
+}
+.btn [class^="icon-"],
+.nav-tabs [class^="icon-"],
+.btn [class*=" icon-"],
+.nav-tabs [class*=" icon-"] {
+  /* keeps button heights with and without icons the same */
+
+  line-height: .9em;
+}
+li [class^="icon-"],
+li [class*=" icon-"] {
+  display: inline-block;
+  width: 1.25em;
+  text-align: center;
+}
+li .icon-large:before,
+li .icon-large:before {
+  /* 1.5 increased font size for icon-large * 1.25 width */
+
+  width: 1.875em;
+}
+ul.icons {
+  list-style-type: none;
+  margin-left: 2em;
+  text-indent: -0.8em;
+}
+ul.icons li [class^="icon-"],
+ul.icons li [class*=" icon-"] {
+  width: .8em;
+}
+ul.icons li .icon-large:before,
+ul.icons li .icon-large:before {
+  /* 1.5 increased font size for icon-large * 1.25 width */
+
+  vertical-align: initial;
+}
+/*  Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+    readers do not read off random characters that represent icons */
+.icon-glass:before {
+  content: "\f000";
+}
+.icon-music:before {
+  content: "\f001";
+}
+.icon-search:before {
+  content: "\f002";
+}
+.icon-envelope:before {
+  content: "\f003";
+}
+.icon-heart:before {
+  content: "\f004";
+}
+.icon-star:before {
+  content: "\f005";
+}
+.icon-star-empty:before {
+  content: "\f006";
+}
+.icon-user:before {
+  content: "\f007";
+}
+.icon-film:before {
+  content: "\f008";
+}
+.icon-th-large:before {
+  content: "\f009";
+}
+.icon-th:before {
+  content: "\f00a";
+}
+.icon-th-list:before {
+  content: "\f00b";
+}
+.icon-ok:before {
+  content: "\f00c";
+}
+.icon-remove:before {
+  content: "\f00d";
+}
+.icon-zoom-in:before {
+  content: "\f00e";
+}
+.icon-zoom-out:before {
+  content: "\f010";
+}
+.icon-off:before {
+  content: "\f011";
+}
+.icon-signal:before {
+  content: "\f012";
+}
+.icon-cog:before {
+  content: "\f013";
+}
+.icon-trash:before {
+  content: "\f014";
+}
+.icon-home:before {
+  content: "\f015";
+}
+.icon-file:before {
+  content: "\f016";
+}
+.icon-time:before {
+  content: "\f017";
+}
+.icon-road:before {
+  content: "\f018";
+}
+.icon-download-alt:before {
+  content: "\f019";
+}
+.icon-download:before {
+  content: "\f01a";
+}
+.icon-upload:before {
+  content: "\f01b";
+}
+.icon-inbox:before {
+  content: "\f01c";
+}
+.icon-play-circle:before {
+  content: "\f01d";
+}
+.icon-repeat:before {
+  content: "\f01e";
+}
+/* \f020 is not a valid unicode character. all shifted one down */
+.icon-refresh:before {
+  content: "\f021";
+}
+.icon-list-alt:before {
+  content: "\f022";
+}
+.icon-lock:before {
+  content: "\f023";
+}
+.icon-flag:before {
+  content: "\f024";
+}
+.icon-headphones:before {
+  content: "\f025";
+}
+.icon-volume-off:before {
+  content: "\f026";
+}
+.icon-volume-down:before {
+  content: "\f027";
+}
+.icon-volume-up:before {
+  content: "\f028";
+}
+.icon-qrcode:before {
+  content: "\f029";
+}
+.icon-barcode:before {
+  content: "\f02a";
+}
+.icon-tag:before {
+  content: "\f02b";
+}
+.icon-tags:before {
+  content: "\f02c";
+}
+.icon-book:before {
+  content: "\f02d";
+}
+.icon-bookmark:before {
+  content: "\f02e";
+}
+.icon-print:before {
+  content: "\f02f";
+}
+.icon-camera:before {
+  content: "\f030";
+}
+.icon-font:before {
+  content: "\f031";
+}
+.icon-bold:before {
+  content: "\f032";
+}
+.icon-italic:before {
+  content: "\f033";
+}
+.icon-text-height:before {
+  content: "\f034";
+}
+.icon-text-width:before {
+  content: "\f035";
+}
+.icon-align-left:before {
+  content: "\f036";
+}
+.icon-align-center:before {
+  content: "\f037";
+}
+.icon-align-right:before {
+  content: "\f038";
+}
+.icon-align-justify:before {
+  content: "\f039";
+}
+.icon-list:before {
+  content: "\f03a";
+}
+.icon-indent-left:before {
+  content: "\f03b";
+}
+.icon-indent-right:before {
+  content: "\f03c";
+}
+.icon-facetime-video:before {
+  content: "\f03d";
+}
+.icon-picture:before {
+  content: "\f03e";
+}
+.icon-pencil:before {
+  content: "\f040";
+}
+.icon-map-marker:before {
+  content: "\f041";
+}
+.icon-adjust:before {
+  content: "\f042";
+}
+.icon-tint:before {
+  content: "\f043";
+}
+.icon-edit:before {
+  content: "\f044";
+}
+.icon-share:before {
+  content: "\f045";
+}
+.icon-check:before {
+  content: "\f046";
+}
+.icon-move:before {
+  content: "\f047";
+}
+.icon-step-backward:before {
+  content: "\f048";
+}
+.icon-fast-backward:before {
+  content: "\f049";
+}
+.icon-backward:before {
+  content: "\f04a";
+}
+.icon-play:before {
+  content: "\f04b";
+}
+.icon-pause:before {
+  content: "\f04c";
+}
+.icon-stop:before {
+  content: "\f04d";
+}
+.icon-forward:before {
+  content: "\f04e";
+}
+.icon-fast-forward:before {
+  content: "\f050";
+}
+.icon-step-forward:before {
+  content: "\f051";
+}
+.icon-eject:before {
+  content: "\f052";
+}
+.icon-chevron-left:before {
+  content: "\f053";
+}
+.icon-chevron-right:before {
+  content: "\f054";
+}
+.icon-plus-sign:before {
+  content: "\f055";
+}
+.icon-minus-sign:before {
+  content: "\f056";
+}
+.icon-remove-sign:before {
+  content: "\f057";
+}
+.icon-ok-sign:before {
+  content: "\f058";
+}
+.icon-question-sign:before {
+  content: "\f059";
+}
+.icon-info-sign:before {
+  content: "\f05a";
+}
+.icon-screenshot:before {
+  content: "\f05b";
+}
+.icon-remove-circle:before {
+  content: "\f05c";
+}
+.icon-ok-circle:before {
+  content: "\f05d";
+}
+.icon-ban-circle:before {
+  content: "\f05e";
+}
+.icon-arrow-left:before {
+  content: "\f060";
+}
+.icon-arrow-right:before {
+  content: "\f061";
+}
+.icon-arrow-up:before {
+  content: "\f062";
+}
+.icon-arrow-down:before {
+  content: "\f063";
+}
+.icon-share-alt:before {
+  content: "\f064";
+}
+.icon-resize-full:before {
+  content: "\f065";
+}
+.icon-resize-small:before {
+  content: "\f066";
+}
+.icon-plus:before {
+  content: "\f067";
+}
+.icon-minus:before {
+  content: "\f068";
+}
+.icon-asterisk:before {
+  content: "\f069";
+}
+.icon-exclamation-sign:before {
+  content: "\f06a";
+}
+.icon-gift:before {
+  content: "\f06b";
+}
+.icon-leaf:before {
+  content: "\f06c";
+}
+.icon-fire:before {
+  content: "\f06d";
+}
+.icon-eye-open:before {
+  content: "\f06e";
+}
+.icon-eye-close:before {
+  content: "\f070";
+}
+.icon-warning-sign:before {
+  content: "\f071";
+}
+.icon-plane:before {
+  content: "\f072";
+}
+.icon-calendar:before {
+  content: "\f073";
+}
+.icon-random:before {
+  content: "\f074";
+}
+.icon-comment:before {
+  content: "\f075";
+}
+.icon-magnet:before {
+  content: "\f076";
+}
+.icon-chevron-up:before {
+  content: "\f077";
+}
+.icon-chevron-down:before {
+  content: "\f078";
+}
+.icon-retweet:before {
+  content: "\f079";
+}
+.icon-shopping-cart:before {
+  content: "\f07a";
+}
+.icon-folder-close:before {
+  content: "\f07b";
+}
+.icon-folder-open:before {
+  content: "\f07c";
+}
+.icon-resize-vertical:before {
+  content: "\f07d";
+}
+.icon-resize-horizontal:before {
+  content: "\f07e";
+}
+.icon-bar-chart:before {
+  content: "\f080";
+}
+.icon-twitter-sign:before {
+  content: "\f081";
+}
+.icon-facebook-sign:before {
+  content: "\f082";
+}
+.icon-camera-retro:before {
+  content: "\f083";
+}
+.icon-key:before {
+  content: "\f084";
+}
+.icon-cogs:before {
+  content: "\f085";
+}
+.icon-comments:before {
+  content: "\f086";
+}
+.icon-thumbs-up:before {
+  content: "\f087";
+}
+.icon-thumbs-down:before {
+  content: "\f088";
+}
+.icon-star-half:before {
+  content: "\f089";
+}
+.icon-heart-empty:before {
+  content: "\f08a";
+}
+.icon-signout:before {
+  content: "\f08b";
+}
+.icon-linkedin-sign:before {
+  content: "\f08c";
+}
+.icon-pushpin:before {
+  content: "\f08d";
+}
+.icon-external-link:before {
+  content: "\f08e";
+}
+.icon-signin:before {
+  content: "\f090";
+}
+.icon-trophy:before {
+  content: "\f091";
+}
+.icon-github-sign:before {
+  content: "\f092";
+}
+.icon-upload-alt:before {
+  content: "\f093";
+}
+.icon-lemon:before {
+  content: "\f094";
+}
+.icon-phone:before {
+  content: "\f095";
+}
+.icon-check-empty:before {
+  content: "\f096";
+}
+.icon-bookmark-empty:before {
+  content: "\f097";
+}
+.icon-phone-sign:before {
+  content: "\f098";
+}
+.icon-twitter:before {
+  content: "\f099";
+}
+.icon-facebook:before {
+  content: "\f09a";
+}
+.icon-github:before {
+  content: "\f09b";
+}
+.icon-unlock:before {
+  content: "\f09c";
+}
+.icon-credit-card:before {
+  content: "\f09d";
+}
+.icon-rss:before {
+  content: "\f09e";
+}
+.icon-hdd:before {
+  content: "\f0a0";
+}
+.icon-bullhorn:before {
+  content: "\f0a1";
+}
+.icon-bell:before {
+  content: "\f0a2";
+}
+.icon-certificate:before {
+  content: "\f0a3";
+}
+.icon-hand-right:before {
+  content: "\f0a4";
+}
+.icon-hand-left:before {
+  content: "\f0a5";
+}
+.icon-hand-up:before {
+  content: "\f0a6";
+}
+.icon-hand-down:before {
+  content: "\f0a7";
+}
+.icon-circle-arrow-left:before {
+  content: "\f0a8";
+}
+.icon-circle-arrow-right:before {
+  content: "\f0a9";
+}
+.icon-circle-arrow-up:before {
+  content: "\f0aa";
+}
+.icon-circle-arrow-down:before {
+  content: "\f0ab";
+}
+.icon-globe:before {
+  content: "\f0ac";
+}
+.icon-wrench:before {
+  content: "\f0ad";
+}
+.icon-tasks:before {
+  content: "\f0ae";
+}
+.icon-filter:before {
+  content: "\f0b0";
+}
+.icon-briefcase:before {
+  content: "\f0b1";
+}
+.icon-fullscreen:before {
+  content: "\f0b2";
+}
+.icon-group:before {
+  content: "\f0c0";
+}
+.icon-link:before {
+  content: "\f0c1";
+}
+.icon-cloud:before {
+  content: "\f0c2";
+}
+.icon-beaker:before {
+  content: "\f0c3";
+}
+.icon-cut:before {
+  content: "\f0c4";
+}
+.icon-copy:before {
+  content: "\f0c5";
+}
+.icon-paper-clip:before {
+  content: "\f0c6";
+}
+.icon-save:before {
+  content: "\f0c7";
+}
+.icon-sign-blank:before {
+  content: "\f0c8";
+}
+.icon-reorder:before {
+  content: "\f0c9";
+}
+.icon-list-ul:before {
+  content: "\f0ca";
+}
+.icon-list-ol:before {
+  content: "\f0cb";
+}
+.icon-strikethrough:before {
+  content: "\f0cc";
+}
+.icon-underline:before {
+  content: "\f0cd";
+}
+.icon-table:before {
+  content: "\f0ce";
+}
+.icon-magic:before {
+  content: "\f0d0";
+}
+.icon-truck:before {
+  content: "\f0d1";
+}
+.icon-pinterest:before {
+  content: "\f0d2";
+}
+.icon-pinterest-sign:before {
+  content: "\f0d3";
+}
+.icon-google-plus-sign:before {
+  content: "\f0d4";
+}
+.icon-google-plus:before {
+  content: "\f0d5";
+}
+.icon-money:before {
+  content: "\f0d6";
+}
+.icon-caret-down:before {
+  content: "\f0d7";
+}
+.icon-caret-up:before {
+  content: "\f0d8";
+}
+.icon-caret-left:before {
+  content: "\f0d9";
+}
+.icon-caret-right:before {
+  content: "\f0da";
+}
+.icon-columns:before {
+  content: "\f0db";
+}
+.icon-sort:before {
+  content: "\f0dc";
+}
+.icon-sort-down:before {
+  content: "\f0dd";
+}
+.icon-sort-up:before {
+  content: "\f0de";
+}
+.icon-envelope-alt:before {
+  content: "\f0e0";
+}
+.icon-linkedin:before {
+  content: "\f0e1";
+}
+.icon-undo:before {
+  content: "\f0e2";
+}
+.icon-legal:before {
+  content: "\f0e3";
+}
+.icon-dashboard:before {
+  content: "\f0e4";
+}
+.icon-comment-alt:before {
+  content: "\f0e5";
+}
+.icon-comments-alt:before {
+  content: "\f0e6";
+}
+.icon-bolt:before {
+  content: "\f0e7";
+}
+.icon-sitemap:before {
+  content: "\f0e8";
+}
+.icon-umbrella:before {
+  content: "\f0e9";
+}
+.icon-paste:before {
+  content: "\f0ea";
+}
+.icon-user-md:before {
+  content: "\f200";
+}
+.dropup,
+.dropdown {
+  position: relative;
+}
+.dropdown-toggle {
+  *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+  outline: 0;
+}
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  vertical-align: top;
+  border-top: 4px solid #000000;
+  border-right: 4px solid transparent;
+  border-left: 4px solid transparent;
+  content: "";
+}
+.dropdown .caret {
+  margin-top: 8px;
+  margin-left: 2px;
+}
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: 1000;
+  display: none;
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0;
+  list-style: none;
+  background-color: #ffffff;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  *border-right-width: 2px;
+  *border-bottom-width: 2px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+  right: 0;
+  left: auto;
+}
+.dropdown-menu .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+.dropdown-menu a {
+  display: block;
+  padding: 3px 20px;
+  clear: both;
+  font-weight: normal;
+  line-height: 20px;
+  color: #333333;
+  white-space: nowrap;
+}
+.dropdown-menu li > a:hover,
+.dropdown-menu li > a:focus,
+.dropdown-submenu:hover > a {
+  text-decoration: none;
+  color: #ffffff;
+  background-color: #6e8f4a;
+  background-color: #698847;
+  background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
+  background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
+}
+.dropdown-menu .active > a,
+.dropdown-menu .active > a:hover {
+  color: #ffffff;
+  text-decoration: none;
+  outline: 0;
+  background-color: #6e8f4a;
+  background-color: #698847;
+  background-image: -moz-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#617e41));
+  background-image: -webkit-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: -o-linear-gradient(top, #6e8f4a, #617e41);
+  background-image: linear-gradient(to bottom, #6e8f4a, #617e41);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff617e41', GradientType=0);
+}
+.dropdown-menu .disabled > a,
+.dropdown-menu .disabled > a:hover {
+  color: #999999;
+}
+.dropdown-menu .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
+.open {
+  *z-index: 1000;
+}
+.open  > .dropdown-menu {
+  display: block;
+}
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+.dropup .caret,
+.navbar-fixed-bottom .dropdown .caret {
+  border-top: 0;
+  border-bottom: 4px solid #000000;
+  content: "\2191";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+  top: auto;
+  bottom: 100%;
+  margin-bottom: 1px;
+}
+.dropdown-submenu {
+  position: relative;
+}
+.dropdown-submenu > .dropdown-menu {
+  top: 0;
+  left: 100%;
+  margin-top: -6px;
+  margin-left: -1px;
+  -webkit-border-radius: 0 6px 6px 6px;
+  -moz-border-radius: 0 6px 6px 6px;
+  border-radius: 0 6px 6px 6px;
+}
+.dropdown-submenu:hover .dropdown-menu {
+  display: block;
+}
+.dropdown-submenu > a:after {
+  display: block;
+  content: " ";
+  float: right;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #cccccc;
+  margin-top: 5px;
+  margin-right: -10px;
+}
+.dropdown-submenu:hover > a:after {
+  border-left-color: #ffffff;
+}
+.dropdown .dropdown-menu .nav-header {
+  padding-left: 20px;
+  padding-right: 20px;
+}
+.typeahead {
+  margin-top: 2px;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: #f5f5f5;
+  border: 1px solid #e3e3e3;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+.well blockquote {
+  border-color: #ddd;
+  border-color: rgba(0, 0, 0, 0.15);
+}
+.well-large {
+  padding: 24px;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.well-small {
+  padding: 9px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.fade {
+  opacity: 0;
+  -webkit-transition: opacity 0.15s linear;
+  -moz-transition: opacity 0.15s linear;
+  -o-transition: opacity 0.15s linear;
+  transition: opacity 0.15s linear;
+}
+.fade.in {
+  opacity: 1;
+}
+.collapse {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  overflow: visible \9;
+  -webkit-transition: height 0.35s ease;
+  -moz-transition: height 0.35s ease;
+  -o-transition: height 0.35s ease;
+  transition: height 0.35s ease;
+}
+.collapse.in {
+  height: auto;
+}
+.close {
+  float: right;
+  font-size: 20px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #000000;
+  text-shadow: 0 1px 0 #ffffff;
+  opacity: 0.2;
+  filter: alpha(opacity=20);
+}
+.close:hover {
+  color: #000000;
+  text-decoration: none;
+  cursor: pointer;
+  opacity: 0.4;
+  filter: alpha(opacity=40);
+}
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+}
+.btn {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  padding: 4px 14px;
+  margin-bottom: 0;
+  font-size: 14px;
+  line-height: 20px;
+  *line-height: 20px;
+  text-align: center;
+  vertical-align: middle;
+  cursor: pointer;
+  color: #333333;
+  text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+  background-color: #f5f5f5;
+  background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+  background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+  background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
+  border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #e6e6e6;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  border: 1px solid #bbbbbb;
+  *border: 0;
+  border-bottom-color: #a2a2a2;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  *margin-left: .3em;
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn:hover,
+.btn:active,
+.btn.active,
+.btn.disabled,
+.btn[disabled] {
+  color: #333333;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+}
+.btn:active,
+.btn.active {
+  background-color: #cccccc \9;
+}
+.btn:first-child {
+  *margin-left: 0;
+}
+.btn:hover {
+  color: #333333;
+  text-decoration: none;
+  background-color: #e6e6e6;
+  *background-color: #d9d9d9;
+  /* Buttons in IE7 don't get borders, so darken on hover */
+
+  background-position: 0 -15px;
+  -webkit-transition: background-position 0.1s linear;
+  -moz-transition: background-position 0.1s linear;
+  -o-transition: background-position 0.1s linear;
+  transition: background-position 0.1s linear;
+}
+.btn:focus {
+  outline: thin dotted #333;
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
+.btn.active,
+.btn:active {
+  background-color: #e6e6e6;
+  background-color: #d9d9d9 \9;
+  background-image: none;
+  outline: 0;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn.disabled,
+.btn[disabled] {
+  cursor: default;
+  background-color: #e6e6e6;
+  background-image: none;
+  opacity: 0.65;
+  filter: alpha(opacity=65);
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-large {
+  padding: 9px 14px;
+  font-size: 16px;
+  line-height: normal;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.btn-large [class^="icon-"] {
+  margin-top: 2px;
+}
+.btn-small {
+  padding: 3px 9px;
+  font-size: 12px;
+  line-height: 18px;
+}
+.btn-small [class^="icon-"] {
+  margin-top: 0;
+}
+.btn-mini {
+  padding: 2px 6px;
+  font-size: 11px;
+  line-height: 16px;
+}
+.btn-block {
+  display: block;
+  width: 100%;
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+}
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+  color: rgba(255, 255, 255, 0.75);
+}
+.btn {
+  border-color: #c5c5c5;
+  border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
+}
+.btn-primary {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #658f4a;
+  background-image: -moz-linear-gradient(top, #6e8f4a, #578f4a);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#6e8f4a), to(#578f4a));
+  background-image: -webkit-linear-gradient(top, #6e8f4a, #578f4a);
+  background-image: -o-linear-gradient(top, #6e8f4a, #578f4a);
+  background-image: linear-gradient(to bottom, #6e8f4a, #578f4a);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff6e8f4a', endColorstr='#ff578f4a', GradientType=0);
+  border-color: #578f4a #578f4a #385d30;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #578f4a;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.active,
+.btn-primary.disabled,
+.btn-primary[disabled] {
+  color: #ffffff;
+  background-color: #578f4a;
+  *background-color: #4d7e41;
+}
+.btn-primary:active,
+.btn-primary.active {
+  background-color: #436d39 \9;
+}
+.btn-warning {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+  border-color: #f89406 #f89406 #ad6704;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #f89406;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.active,
+.btn-warning.disabled,
+.btn-warning[disabled] {
+  color: #ffffff;
+  background-color: #f89406;
+  *background-color: #df8505;
+}
+.btn-warning:active,
+.btn-warning.active {
+  background-color: #c67605 \9;
+}
+.btn-danger {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #da4f49;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
+  background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
+  border-color: #bd362f #bd362f #802420;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #bd362f;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.active,
+.btn-danger.disabled,
+.btn-danger[disabled] {
+  color: #ffffff;
+  background-color: #bd362f;
+  *background-color: #a9302a;
+}
+.btn-danger:active,
+.btn-danger.active {
+  background-color: #942a25 \9;
+}
+.btn-success {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #5bb75b;
+  background-image: -moz-linear-gradient(top, #62c462, #51a351);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
+  background-image: -webkit-linear-gradient(top, #62c462, #51a351);
+  background-image: -o-linear-gradient(top, #62c462, #51a351);
+  background-image: linear-gradient(to bottom, #62c462, #51a351);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
+  border-color: #51a351 #51a351 #387038;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #51a351;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.active,
+.btn-success.disabled,
+.btn-success[disabled] {
+  color: #ffffff;
+  background-color: #51a351;
+  *background-color: #499249;
+}
+.btn-success:active,
+.btn-success.active {
+  background-color: #408140 \9;
+}
+.btn-info {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #49afcd;
+  background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
+  background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
+  border-color: #2f96b4 #2f96b4 #1f6377;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #2f96b4;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.active,
+.btn-info.disabled,
+.btn-info[disabled] {
+  color: #ffffff;
+  background-color: #2f96b4;
+  *background-color: #2a85a0;
+}
+.btn-info:active,
+.btn-info.active {
+  background-color: #24748c \9;
+}
+.btn-inverse {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #363636;
+  background-image: -moz-linear-gradient(top, #444444, #222222);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
+  background-image: -webkit-linear-gradient(top, #444444, #222222);
+  background-image: -o-linear-gradient(top, #444444, #222222);
+  background-image: linear-gradient(to bottom, #444444, #222222);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
+  border-color: #222222 #222222 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #222222;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.btn-inverse:hover,
+.btn-inverse:active,
+.btn-inverse.active,
+.btn-inverse.disabled,
+.btn-inverse[disabled] {
+  color: #ffffff;
+  background-color: #222222;
+  *background-color: #151515;
+}
+.btn-inverse:active,
+.btn-inverse.active {
+  background-color: #080808 \9;
+}
+button.btn,
+input[type="submit"].btn {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+button.btn::-moz-focus-inner,
+input[type="submit"].btn::-moz-focus-inner {
+  padding: 0;
+  border: 0;
+}
+button.btn.btn-large,
+input[type="submit"].btn.btn-large {
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+button.btn.btn-small,
+input[type="submit"].btn.btn-small {
+  *padding-top: 3px;
+  *padding-bottom: 3px;
+}
+button.btn.btn-mini,
+input[type="submit"].btn.btn-mini {
+  *padding-top: 1px;
+  *padding-bottom: 1px;
+}
+.btn-link,
+.btn-link:active {
+  background-color: transparent;
+  background-image: none;
+  -webkit-box-shadow: none;
+  -moz-box-shadow: none;
+  box-shadow: none;
+}
+.btn-link {
+  border-color: transparent;
+  cursor: pointer;
+  color: #6e8f4a;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-link:hover {
+  color: #f26a1e;
+  text-decoration: underline;
+  background-color: transparent;
+}
+.btn-group {
+  position: relative;
+  font-size: 0;
+  white-space: nowrap;
+  *margin-left: .3em;
+}
+.btn-group:first-child {
+  *margin-left: 0;
+}
+.btn-group + .btn-group {
+  margin-left: 5px;
+}
+.btn-toolbar {
+  font-size: 0;
+  margin-top: 10px;
+  margin-bottom: 10px;
+}
+.btn-toolbar .btn-group {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-toolbar .btn + .btn,
+.btn-toolbar .btn-group + .btn,
+.btn-toolbar .btn + .btn-group {
+  margin-left: 5px;
+}
+.btn-group > .btn {
+  position: relative;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group > .btn + .btn {
+  margin-left: -1px;
+}
+.btn-group > .btn,
+.btn-group > .dropdown-menu {
+  font-size: 14px;
+}
+.btn-group > .btn-mini {
+  font-size: 11px;
+}
+.btn-group > .btn-small {
+  font-size: 12px;
+}
+.btn-group > .btn-large {
+  font-size: 16px;
+}
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+}
+.btn-group > .btn.large:first-child {
+  margin-left: 0;
+  -webkit-border-top-left-radius: 6px;
+  -moz-border-radius-topleft: 6px;
+  border-top-left-radius: 6px;
+  -webkit-border-bottom-left-radius: 6px;
+  -moz-border-radius-bottomleft: 6px;
+  border-bottom-left-radius: 6px;
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+  -webkit-border-top-right-radius: 6px;
+  -moz-border-radius-topright: 6px;
+  border-top-right-radius: 6px;
+  -webkit-border-bottom-right-radius: 6px;
+  -moz-border-radius-bottomright: 6px;
+  border-bottom-right-radius: 6px;
+}
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+  z-index: 2;
+}
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+.btn-group > .btn + .dropdown-toggle {
+  padding-left: 8px;
+  padding-right: 8px;
+  -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);
+  *padding-top: 5px;
+  *padding-bottom: 5px;
+}
+.btn-group > .btn-mini + .dropdown-toggle {
+  padding-left: 5px;
+  padding-right: 5px;
+  *padding-top: 2px;
+  *padding-bottom: 2px;
+}
+.btn-group > .btn-small + .dropdown-toggle {
+  *padding-top: 5px;
+  *padding-bottom: 4px;
+}
+.btn-group > .btn-large + .dropdown-toggle {
+  padding-left: 12px;
+  padding-right: 12px;
+  *padding-top: 7px;
+  *padding-bottom: 7px;
+}
+.btn-group.open .dropdown-toggle {
+  background-image: none;
+  -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+  box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);
+}
+.btn-group.open .btn.dropdown-toggle {
+  background-color: #e6e6e6;
+}
+.btn-group.open .btn-primary.dropdown-toggle {
+  background-color: #578f4a;
+}
+.btn-group.open .btn-warning.dropdown-toggle {
+  background-color: #f89406;
+}
+.btn-group.open .btn-danger.dropdown-toggle {
+  background-color: #bd362f;
+}
+.btn-group.open .btn-success.dropdown-toggle {
+  background-color: #51a351;
+}
+.btn-group.open .btn-info.dropdown-toggle {
+  background-color: #2f96b4;
+}
+.btn-group.open .btn-inverse.dropdown-toggle {
+  background-color: #222222;
+}
+.btn .caret {
+  margin-top: 8px;
+  margin-left: 0;
+}
+.btn-mini .caret,
+.btn-small .caret,
+.btn-large .caret {
+  margin-top: 6px;
+}
+.btn-large .caret {
+  border-left-width: 5px;
+  border-right-width: 5px;
+  border-top-width: 5px;
+}
+.dropup .btn-large .caret {
+  border-bottom: 5px solid #000000;
+  border-top: 0;
+}
+.btn-primary .caret,
+.btn-warning .caret,
+.btn-danger .caret,
+.btn-info .caret,
+.btn-success .caret,
+.btn-inverse .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+.btn-group-vertical {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+}
+.btn-group-vertical .btn {
+  display: block;
+  float: none;
+  width: 100%;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.btn-group-vertical .btn + .btn {
+  margin-left: 0;
+  margin-top: -1px;
+}
+.btn-group-vertical .btn:first-child {
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.btn-group-vertical .btn:last-child {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.btn-group-vertical .btn-large:first-child {
+  -webkit-border-radius: 6px 6px 0 0;
+  -moz-border-radius: 6px 6px 0 0;
+  border-radius: 6px 6px 0 0;
+}
+.btn-group-vertical .btn-large:last-child {
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+}
+.alert {
+  padding: 8px 35px 8px 14px;
+  margin-bottom: 20px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  background-color: #fcf8e3;
+  border: 1px solid #fbeed5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  color: #c09853;
+}
+.alert h4 {
+  margin: 0;
+}
+.alert .close {
+  position: relative;
+  top: -2px;
+  right: -21px;
+  line-height: 20px;
+}
+.alert-success {
+  background-color: #dff0d8;
+  border-color: #d6e9c6;
+  color: #468847;
+}
+.alert-danger,
+.alert-error {
+  background-color: #f2dede;
+  border-color: #eed3d7;
+  color: #b94a48;
+}
+.alert-info {
+  background-color: #d9edf7;
+  border-color: #bce8f1;
+  color: #3a87ad;
+}
+.alert-block {
+  padding-top: 14px;
+  padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+  margin-bottom: 0;
+}
+.alert-block p + p {
+  margin-top: 5px;
+}
+.nav {
+  margin-left: 0;
+  margin-bottom: 20px;
+  list-style: none;
+}
+.nav > li > a {
+  display: block;
+}
+.nav > li > a:hover {
+  text-decoration: none;
+  background-color: #eeeeee;
+}
+.nav > .pull-right {
+  float: right;
+}
+.nav-header {
+  display: block;
+  padding: 3px 15px;
+  font-size: 11px;
+  font-weight: bold;
+  line-height: 20px;
+  color: #999999;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+  text-transform: uppercase;
+}
+.nav li + .nav-header {
+  margin-top: 9px;
+}
+.nav-list {
+  padding-left: 15px;
+  padding-right: 15px;
+  margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+  margin-left: -15px;
+  margin-right: -15px;
+  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+.nav-list > li > a {
+  padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+  background-color: #6e8f4a;
+}
+.nav-list [class^="icon-"] {
+  margin-right: 2px;
+}
+.nav-list .divider {
+  *width: 100%;
+  height: 1px;
+  margin: 9px 1px;
+  *margin: -5px 0 5px;
+  overflow: hidden;
+  background-color: #e5e5e5;
+  border-bottom: 1px solid #ffffff;
+}
+.nav-tabs,
+.nav-pills {
+  *zoom: 1;
+}
+.nav-tabs:before,
+.nav-pills:before,
+.nav-tabs:after,
+.nav-pills:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.nav-tabs:after,
+.nav-pills:after {
+  clear: both;
+}
+.nav-tabs > li,
+.nav-pills > li {
+  float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+  padding-right: 12px;
+  padding-left: 12px;
+  margin-right: 2px;
+  line-height: 14px;
+}
+.nav-tabs {
+  border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+  margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  line-height: 20px;
+  border: 1px solid transparent;
+  -webkit-border-radius: 4px 4px 0 0;
+  -moz-border-radius: 4px 4px 0 0;
+  border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #dddddd;
+}
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover {
+  color: #555555;
+  background-color: #ffffff;
+  border: 1px solid #ddd;
+  border-bottom-color: transparent;
+  cursor: default;
+}
+.nav-pills > li > a {
+  padding-top: 8px;
+  padding-bottom: 8px;
+  margin-top: 2px;
+  margin-bottom: 2px;
+  -webkit-border-radius: 5px;
+  -moz-border-radius: 5px;
+  border-radius: 5px;
+}
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover {
+  color: #ffffff;
+  background-color: #6e8f4a;
+}
+.nav-stacked > li {
+  float: none;
+}
+.nav-stacked > li > a {
+  margin-right: 0;
+}
+.nav-tabs.nav-stacked {
+  border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+  border: 1px solid #ddd;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+  -webkit-border-top-right-radius: 4px;
+  -moz-border-radius-topright: 4px;
+  border-top-right-radius: 4px;
+  -webkit-border-top-left-radius: 4px;
+  -moz-border-radius-topleft: 4px;
+  border-top-left-radius: 4px;
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+  -webkit-border-bottom-right-radius: 4px;
+  -moz-border-radius-bottomright: 4px;
+  border-bottom-right-radius: 4px;
+  -webkit-border-bottom-left-radius: 4px;
+  -moz-border-radius-bottomleft: 4px;
+  border-bottom-left-radius: 4px;
+}
+.nav-tabs.nav-stacked > li > a:hover {
+  border-color: #ddd;
+  z-index: 2;
+}
+.nav-pills.nav-stacked > li > a {
+  margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+  margin-bottom: 1px;
+}
+.nav-tabs .dropdown-menu {
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+}
+.nav-pills .dropdown-menu {
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.nav .dropdown-toggle .caret {
+  border-top-color: #6e8f4a;
+  border-bottom-color: #6e8f4a;
+  margin-top: 6px;
+}
+.nav .dropdown-toggle:hover .caret {
+  border-top-color: #f26a1e;
+  border-bottom-color: #f26a1e;
+}
+/* move down carets for tabs */
+.nav-tabs .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+.nav .active .dropdown-toggle .caret {
+  border-top-color: #fff;
+  border-bottom-color: #fff;
+}
+.nav-tabs .active .dropdown-toggle .caret {
+  border-top-color: #555555;
+  border-bottom-color: #555555;
+}
+.nav > .dropdown.active > a:hover {
+  cursor: pointer;
+}
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover {
+  color: #ffffff;
+  background-color: #999999;
+  border-color: #999999;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+  opacity: 1;
+  filter: alpha(opacity=100);
+}
+.tabs-stacked .open > a:hover {
+  border-color: #999999;
+}
+.tabbable {
+  *zoom: 1;
+}
+.tabbable:before,
+.tabbable:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.tabbable:after {
+  clear: both;
+}
+.tab-content {
+  overflow: auto;
+}
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+  border-bottom: 0;
+}
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+  display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+  display: block;
+}
+.tabs-below > .nav-tabs {
+  border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+  margin-top: -1px;
+  margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+  -webkit-border-radius: 0 0 4px 4px;
+  -moz-border-radius: 0 0 4px 4px;
+  border-radius: 0 0 4px 4px;
+}
+.tabs-below > .nav-tabs > li > a:hover {
+  border-bottom-color: transparent;
+  border-top-color: #ddd;
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover {
+  border-color: transparent #ddd #ddd #ddd;
+}
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+  float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+  min-width: 74px;
+  margin-right: 0;
+  margin-bottom: 3px;
+}
+.tabs-left > .nav-tabs {
+  float: left;
+  margin-right: 19px;
+  border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+  margin-right: -1px;
+  -webkit-border-radius: 4px 0 0 4px;
+  -moz-border-radius: 4px 0 0 4px;
+  border-radius: 4px 0 0 4px;
+}
+.tabs-left > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #dddddd #eeeeee #eeeeee;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover {
+  border-color: #ddd transparent #ddd #ddd;
+  *border-right-color: #ffffff;
+}
+.tabs-right > .nav-tabs {
+  float: right;
+  margin-left: 19px;
+  border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+  margin-left: -1px;
+  -webkit-border-radius: 0 4px 4px 0;
+  -moz-border-radius: 0 4px 4px 0;
+  border-radius: 0 4px 4px 0;
+}
+.tabs-right > .nav-tabs > li > a:hover {
+  border-color: #eeeeee #eeeeee #eeeeee #dddddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover {
+  border-color: #ddd #ddd #ddd transparent;
+  *border-left-color: #ffffff;
+}
+.nav > .disabled > a {
+  color: #999999;
+}
+.nav > .disabled > a:hover {
+  text-decoration: none;
+  background-color: transparent;
+  cursor: default;
+}
+.navbar {
+  overflow: visible;
+  margin-bottom: 20px;
+  color: #1f444b;
+  *position: relative;
+  *z-index: 2;
+}
+.navbar-inner {
+  min-height: 70px;
+  padding-left: 20px;
+  padding-right: 20px;
+  background-color: #e9e7e0;
+  background-image: -moz-linear-gradient(top, #edece6, #e2e1d7);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#edece6), to(#e2e1d7));
+  background-image: -webkit-linear-gradient(top, #edece6, #e2e1d7);
+  background-image: -o-linear-gradient(top, #edece6, #e2e1d7);
+  background-image: linear-gradient(to bottom, #edece6, #e2e1d7);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffedece6', endColorstr='#ffe2e1d7', GradientType=0);
+  border: 1px solid #c9c6b4;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
+}
+.navbar .container {
+  width: auto;
+}
+.nav-collapse.collapse {
+  height: auto;
+}
+.navbar .brand {
+  float: left;
+  display: block;
+  padding: 25px 20px 25px;
+  margin-left: -20px;
+  font-size: 20px;
+  font-weight: 200;
+  color: #1f444b;
+  text-shadow: 0 1px 0 #edece6;
+}
+.navbar .brand:hover {
+  text-decoration: none;
+}
+.navbar-text {
+  margin-bottom: 0;
+  line-height: 70px;
+}
+.navbar-link {
+  color: #1f444b;
+}
+.navbar-link:hover {
+  color: #f26a1e;
+}
+.navbar .divider-vertical {
+  height: 70px;
+  margin: 0 9px;
+  border-left: 1px solid #e2e1d7;
+  border-right: 1px solid #edece6;
+}
+.navbar .btn,
+.navbar .btn-group {
+  margin-top: 21px;
+}
+.navbar .btn-group .btn {
+  margin: 0;
+}
+.navbar-form {
+  margin-bottom: 0;
+  *zoom: 1;
+}
+.navbar-form:before,
+.navbar-form:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.navbar-form:after {
+  clear: both;
+}
+.navbar-form input,
+.navbar-form select,
+.navbar-form .radio,
+.navbar-form .checkbox {
+  margin-top: 20px;
+}
+.navbar-form input,
+.navbar-form select,
+.navbar-form .btn {
+  display: inline-block;
+  margin-bottom: 0;
+}
+.navbar-form input[type="image"],
+.navbar-form input[type="checkbox"],
+.navbar-form input[type="radio"] {
+  margin-top: 3px;
+}
+.navbar-form .input-append,
+.navbar-form .input-prepend {
+  margin-top: 6px;
+  white-space: nowrap;
+}
+.navbar-form .input-append input,
+.navbar-form .input-prepend input {
+  margin-top: 0;
+}
+.navbar-search {
+  position: relative;
+  float: left;
+  margin-top: 20px;
+  margin-bottom: 0;
+}
+.navbar-search .search-query {
+  margin-bottom: 0;
+  padding: 4px 14px;
+  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+  font-size: 13px;
+  font-weight: normal;
+  line-height: 1;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.navbar-static-top {
+  position: static;
+  width: 100%;
+  margin-bottom: 0;
+}
+.navbar-static-top .navbar-inner {
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: 1030;
+  margin-bottom: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner,
+.navbar-static-top .navbar-inner {
+  border: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+  padding-left: 0;
+  padding-right: 0;
+  -webkit-border-radius: 0;
+  -moz-border-radius: 0;
+  border-radius: 0;
+}
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+  width: 940px;
+}
+.navbar-fixed-top {
+  top: 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+  -moz-box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+  box-shadow: inset 0 -1px 0 rgba(0,0,0,.1), 0 1px 10px rgba(0,0,0,.1);
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+}
+.navbar-fixed-bottom .navbar-inner {
+  -webkit-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+  -moz-box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+  box-shadow: inset 0 1px 0 rgba(0,0,0,.1), 0 -1px 10px rgba(0,0,0,.1);
+}
+.navbar .nav {
+  position: relative;
+  left: 0;
+  display: block;
+  float: left;
+  margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+  float: right;
+}
+.navbar .nav > li {
+  float: left;
+}
+.navbar .nav > li > a {
+  float: none;
+  padding: 25px 15px 25px;
+  color: #1f444b;
+  text-decoration: none;
+  text-shadow: 0 1px 0 #edece6;
+}
+.navbar .nav .dropdown-toggle .caret {
+  margin-top: 8px;
+}
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+  background-color: transparent;
+  color: #f26a1e;
+  text-decoration: none;
+}
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+  color: #f26a1e;
+  text-decoration: none;
+  background-color: #d8d5c8;
+  -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+  -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+  box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
+}
+.navbar .btn-navbar {
+  display: none;
+  float: right;
+  padding: 7px 10px;
+  margin-left: 5px;
+  margin-right: 5px;
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #dedcd1;
+  background-image: -moz-linear-gradient(top, #e2e1d7, #d8d5c8);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e2e1d7), to(#d8d5c8));
+  background-image: -webkit-linear-gradient(top, #e2e1d7, #d8d5c8);
+  background-image: -o-linear-gradient(top, #e2e1d7, #d8d5c8);
+  background-image: linear-gradient(to bottom, #e2e1d7, #d8d5c8);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe2e1d7', endColorstr='#ffd8d5c8', GradientType=0);
+  border-color: #d8d5c8 #d8d5c8 #b8b49c;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #d8d5c8;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+  -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+  box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);
+}
+.navbar .btn-navbar:hover,
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active,
+.navbar .btn-navbar.disabled,
+.navbar .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #d8d5c8;
+  *background-color: #cdcaba;
+}
+.navbar .btn-navbar:active,
+.navbar .btn-navbar.active {
+  background-color: #c2bfab \9;
+}
+.navbar .btn-navbar .icon-bar {
+  display: block;
+  width: 18px;
+  height: 2px;
+  background-color: #f5f5f5;
+  -webkit-border-radius: 1px;
+  -moz-border-radius: 1px;
+  border-radius: 1px;
+  -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
+}
+.btn-navbar .icon-bar + .icon-bar {
+  margin-top: 3px;
+}
+.navbar .nav > li > .dropdown-menu:before {
+  content: '';
+  display: inline-block;
+  border-left: 7px solid transparent;
+  border-right: 7px solid transparent;
+  border-bottom: 7px solid #ccc;
+  border-bottom-color: rgba(0, 0, 0, 0.2);
+  position: absolute;
+  top: -7px;
+  left: 9px;
+}
+.navbar .nav > li > .dropdown-menu:after {
+  content: '';
+  display: inline-block;
+  border-left: 6px solid transparent;
+  border-right: 6px solid transparent;
+  border-bottom: 6px solid #ffffff;
+  position: absolute;
+  top: -6px;
+  left: 10px;
+}
+.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
+  border-top: 7px solid #ccc;
+  border-top-color: rgba(0, 0, 0, 0.2);
+  border-bottom: 0;
+  bottom: -7px;
+  top: auto;
+}
+.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
+  border-top: 6px solid #ffffff;
+  border-bottom: 0;
+  bottom: -6px;
+  top: auto;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: #d8d5c8;
+  color: #f26a1e;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #1f444b;
+  border-bottom-color: #1f444b;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #f26a1e;
+  border-bottom-color: #f26a1e;
+}
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+  left: auto;
+  right: 0;
+}
+.navbar .pull-right > li > .dropdown-menu:before,
+.navbar .nav > li > .dropdown-menu.pull-right:before {
+  left: auto;
+  right: 12px;
+}
+.navbar .pull-right > li > .dropdown-menu:after,
+.navbar .nav > li > .dropdown-menu.pull-right:after {
+  left: auto;
+  right: 13px;
+}
+.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
+  left: auto;
+  right: 100%;
+  margin-left: 0;
+  margin-right: -1px;
+  -webkit-border-radius: 6px 0 6px 6px;
+  -moz-border-radius: 6px 0 6px 6px;
+  border-radius: 6px 0 6px 6px;
+}
+.navbar-inverse {
+  color: #999999;
+}
+.navbar-inverse .navbar-inner {
+  background-color: #1b1b1b;
+  background-image: -moz-linear-gradient(top, #222222, #111111);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
+  background-image: -webkit-linear-gradient(top, #222222, #111111);
+  background-image: -o-linear-gradient(top, #222222, #111111);
+  background-image: linear-gradient(to bottom, #222222, #111111);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
+  border-color: #252525;
+}
+.navbar-inverse .brand,
+.navbar-inverse .nav > li > a {
+  color: #999999;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .brand:hover,
+.navbar-inverse .nav > li > a:hover {
+  color: #ffffff;
+}
+.navbar-inverse .nav > li > a:focus,
+.navbar-inverse .nav > li > a:hover {
+  background-color: transparent;
+  color: #ffffff;
+}
+.navbar-inverse .nav .active > a,
+.navbar-inverse .nav .active > a:hover,
+.navbar-inverse .nav .active > a:focus {
+  color: #ffffff;
+  background-color: #111111;
+}
+.navbar-inverse .navbar-link {
+  color: #999999;
+}
+.navbar-inverse .navbar-link:hover {
+  color: #ffffff;
+}
+.navbar-inverse .divider-vertical {
+  border-left-color: #111111;
+  border-right-color: #222222;
+}
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
+  background-color: #111111;
+  color: #ffffff;
+}
+.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
+  border-top-color: #999999;
+  border-bottom-color: #999999;
+}
+.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
+  border-top-color: #ffffff;
+  border-bottom-color: #ffffff;
+}
+.navbar-inverse .navbar-search .search-query {
+  color: #ffffff;
+  background-color: #515151;
+  border-color: #111111;
+  -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);
+  -webkit-transition: none;
+  -moz-transition: none;
+  -o-transition: none;
+  transition: none;
+}
+.navbar-inverse .navbar-search .search-query:-moz-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
+  color: #cccccc;
+}
+.navbar-inverse .navbar-search .search-query:focus,
+.navbar-inverse .navbar-search .search-query.focused {
+  padding: 5px 15px;
+  color: #333333;
+  text-shadow: 0 1px 0 #ffffff;
+  background-color: #ffffff;
+  border: 0;
+  -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
+  outline: 0;
+}
+.navbar-inverse .btn-navbar {
+  color: #ffffff;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e0e0e;
+  background-image: -moz-linear-gradient(top, #151515, #040404);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
+  background-image: -webkit-linear-gradient(top, #151515, #040404);
+  background-image: -o-linear-gradient(top, #151515, #040404);
+  background-image: linear-gradient(to bottom, #151515, #040404);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
+  border-color: #040404 #040404 #000000;
+  border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+  *background-color: #040404;
+  /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.navbar-inverse .btn-navbar:hover,
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active,
+.navbar-inverse .btn-navbar.disabled,
+.navbar-inverse .btn-navbar[disabled] {
+  color: #ffffff;
+  background-color: #040404;
+  *background-color: #000000;
+}
+.navbar-inverse .btn-navbar:active,
+.navbar-inverse .btn-navbar.active {
+  background-color: #000000 \9;
+}
+.pagination {
+  height: 40px;
+  margin: 20px 0;
+}
+.pagination ul {
+  display: inline-block;
+  *display: inline;
+  /* IE7 inline-block hack */
+
+  *zoom: 1;
+  margin-left: 0;
+  margin-bottom: 0;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+.pagination li {
+  display: inline;
+}
+.pagination a,
+.pagination span {
+  float: left;
+  padding: 0 14px;
+  line-height: 38px;
+  text-decoration: none;
+  background-color: #ffffff;
+  border: 1px solid #dddddd;
+  border-left-width: 0;
+}
+.pagination a:hover,
+.pagination .active a,
+.pagination .active span {
+  background-color: #f5f5f5;
+}
+.pagination .active a,
+.pagination .active span {
+  color: #999999;
+  cursor: default;
+}
+.pagination .disabled span,
+.pagination .disabled a,
+.pagination .disabled a:hover {
+  color: #999999;
+  background-color: transparent;
+  cursor: default;
+}
+.pagination li:first-child a,
+.pagination li:first-child span {
+  border-left-width: 1px;
+  -webkit-border-radius: 3px 0 0 3px;
+  -moz-border-radius: 3px 0 0 3px;
+  border-radius: 3px 0 0 3px;
+}
+.pagination li:last-child a,
+.pagination li:last-child span {
+  -webkit-border-radius: 0 3px 3px 0;
+  -moz-border-radius: 0 3px 3px 0;
+  border-radius: 0 3px 3px 0;
+}
+.pagination-centered {
+  text-align: center;
+}
+.pagination-right {
+  text-align: right;
+}
+.pager {
+  margin: 20px 0;
+  list-style: none;
+  text-align: center;
+  *zoom: 1;
+}
+.pager:before,
+.pager:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.pager:after {
+  clear: both;
+}
+.pager li {
+  display: inline;
+}
+.pager a {
+  display: inline-block;
+  padding: 5px 14px;
+  background-color: #fff;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 15px;
+  -moz-border-radius: 15px;
+  border-radius: 15px;
+}
+.pager a:hover {
+  text-decoration: none;
+  background-color: #f5f5f5;
+}
+.pager .next a {
+  float: right;
+}
+.pager .previous a {
+  float: left;
+}
+.pager .disabled a,
+.pager .disabled a:hover {
+  color: #999999;
+  background-color: #fff;
+  cursor: default;
+}
+.modal-open .dropdown-menu {
+  z-index: 2050;
+}
+.modal-open .dropdown.open {
+  *z-index: 2050;
+}
+.modal-open .popover {
+  z-index: 2060;
+}
+.modal-open .tooltip {
+  z-index: 2080;
+}
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: 1040;
+  background-color: #000000;
+}
+.modal-backdrop.fade {
+  opacity: 0;
+}
+.modal-backdrop,
+.modal-backdrop.fade.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.modal {
+  position: fixed;
+  top: 50%;
+  left: 50%;
+  z-index: 1050;
+  overflow: auto;
+  width: 560px;
+  margin: -250px 0 0 -280px;
+  background-color: #ffffff;
+  border: 1px solid #999;
+  border: 1px solid rgba(0, 0, 0, 0.3);
+  *border: 1px solid #999;
+  /* IE6-7 */
+
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding-box;
+  background-clip: padding-box;
+}
+.modal.fade {
+  -webkit-transition: opacity .3s linear, top .3s ease-out;
+  -moz-transition: opacity .3s linear, top .3s ease-out;
+  -o-transition: opacity .3s linear, top .3s ease-out;
+  transition: opacity .3s linear, top .3s ease-out;
+  top: -25%;
+}
+.modal.fade.in {
+  top: 50%;
+}
+.modal-header {
+  padding: 9px 15px;
+  border-bottom: 1px solid #eee;
+}
+.modal-header .close {
+  margin-top: 2px;
+}
+.modal-header h3 {
+  margin: 0;
+  line-height: 30px;
+}
+.modal-body {
+  overflow-y: auto;
+  max-height: 400px;
+  padding: 15px;
+}
+.modal-form {
+  margin-bottom: 0;
+}
+.modal-footer {
+  padding: 14px 15px 15px;
+  margin-bottom: 0;
+  text-align: right;
+  background-color: #f5f5f5;
+  border-top: 1px solid #ddd;
+  -webkit-border-radius: 0 0 6px 6px;
+  -moz-border-radius: 0 0 6px 6px;
+  border-radius: 0 0 6px 6px;
+  -webkit-box-shadow: inset 0 1px 0 #ffffff;
+  -moz-box-shadow: inset 0 1px 0 #ffffff;
+  box-shadow: inset 0 1px 0 #ffffff;
+  *zoom: 1;
+}
+.modal-footer:before,
+.modal-footer:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.modal-footer:after {
+  clear: both;
+}
+.modal-footer .btn + .btn {
+  margin-left: 5px;
+  margin-bottom: 0;
+}
+.modal-footer .btn-group .btn + .btn {
+  margin-left: -1px;
+}
+.tooltip {
+  position: absolute;
+  z-index: 1030;
+  display: block;
+  visibility: visible;
+  padding: 5px;
+  font-size: 11px;
+  opacity: 0;
+  filter: alpha(opacity=0);
+}
+.tooltip.in {
+  opacity: 0.8;
+  filter: alpha(opacity=80);
+}
+.tooltip.top {
+  margin-top: -3px;
+}
+.tooltip.right {
+  margin-left: 3px;
+}
+.tooltip.bottom {
+  margin-top: 3px;
+}
+.tooltip.left {
+  margin-left: -3px;
+}
+.tooltip-inner {
+  max-width: 200px;
+  padding: 3px 8px;
+  color: #ffffff;
+  text-align: center;
+  text-decoration: none;
+  background-color: #000000;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.tooltip.top .tooltip-arrow {
+  bottom: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 5px 5px 0;
+  border-top-color: #000000;
+}
+.tooltip.right .tooltip-arrow {
+  top: 50%;
+  left: 0;
+  margin-top: -5px;
+  border-width: 5px 5px 5px 0;
+  border-right-color: #000000;
+}
+.tooltip.left .tooltip-arrow {
+  top: 50%;
+  right: 0;
+  margin-top: -5px;
+  border-width: 5px 0 5px 5px;
+  border-left-color: #000000;
+}
+.tooltip.bottom .tooltip-arrow {
+  top: 0;
+  left: 50%;
+  margin-left: -5px;
+  border-width: 0 5px 5px;
+  border-bottom-color: #000000;
+}
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: 1010;
+  display: none;
+  width: 236px;
+  padding: 1px;
+  background-color: #ffffff;
+  -webkit-background-clip: padding-box;
+  -moz-background-clip: padding;
+  background-clip: padding-box;
+  border: 1px solid #ccc;
+  border: 1px solid rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+}
+.popover.top {
+  margin-bottom: 10px;
+}
+.popover.right {
+  margin-left: 10px;
+}
+.popover.bottom {
+  margin-top: 10px;
+}
+.popover.left {
+  margin-right: 10px;
+}
+.popover-title {
+  margin: 0;
+  padding: 8px 14px;
+  font-size: 14px;
+  font-weight: normal;
+  line-height: 18px;
+  background-color: #f7f7f7;
+  border-bottom: 1px solid #ebebeb;
+  -webkit-border-radius: 5px 5px 0 0;
+  -moz-border-radius: 5px 5px 0 0;
+  border-radius: 5px 5px 0 0;
+}
+.popover-content {
+  padding: 9px 14px;
+}
+.popover-content p,
+.popover-content ul,
+.popover-content ol {
+  margin-bottom: 0;
+}
+.popover .arrow,
+.popover .arrow:after {
+  position: absolute;
+  display: inline-block;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
+.popover .arrow:after {
+  content: "";
+  z-index: -1;
+}
+.popover.top .arrow {
+  bottom: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-width: 10px 10px 0;
+  border-top-color: #ffffff;
+}
+.popover.top .arrow:after {
+  border-width: 11px 11px 0;
+  border-top-color: rgba(0, 0, 0, 0.25);
+  bottom: -1px;
+  left: -11px;
+}
+.popover.right .arrow {
+  top: 50%;
+  left: -10px;
+  margin-top: -10px;
+  border-width: 10px 10px 10px 0;
+  border-right-color: #ffffff;
+}
+.popover.right .arrow:after {
+  border-width: 11px 11px 11px 0;
+  border-right-color: rgba(0, 0, 0, 0.25);
+  bottom: -11px;
+  left: -1px;
+}
+.popover.bottom .arrow {
+  top: -10px;
+  left: 50%;
+  margin-left: -10px;
+  border-width: 0 10px 10px;
+  border-bottom-color: #ffffff;
+}
+.popover.bottom .arrow:after {
+  border-width: 0 11px 11px;
+  border-bottom-color: rgba(0, 0, 0, 0.25);
+  top: -1px;
+  left: -11px;
+}
+.popover.left .arrow {
+  top: 50%;
+  right: -10px;
+  margin-top: -10px;
+  border-width: 10px 0 10px 10px;
+  border-left-color: #ffffff;
+}
+.popover.left .arrow:after {
+  border-width: 11px 0 11px 11px;
+  border-left-color: rgba(0, 0, 0, 0.25);
+  bottom: -11px;
+  right: -1px;
+}
+.thumbnails {
+  margin-left: -20px;
+  list-style: none;
+  *zoom: 1;
+}
+.thumbnails:before,
+.thumbnails:after {
+  display: table;
+  content: "";
+  line-height: 0;
+}
+.thumbnails:after {
+  clear: both;
+}
+.row-fluid .thumbnails {
+  margin-left: 0;
+}
+.thumbnails > li {
+  float: left;
+  margin-bottom: 20px;
+  margin-left: 20px;
+}
+.thumbnail {
+  display: block;
+  padding: 4px;
+  line-height: 20px;
+  border: 1px solid #ddd;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+  -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
+  -webkit-transition: all 0.2s ease-in-out;
+  -moz-transition: all 0.2s ease-in-out;
+  -o-transition: all 0.2s ease-in-out;
+  transition: all 0.2s ease-in-out;
+}
+a.thumbnail:hover {
+  border-color: #6e8f4a;
+  -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+  box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
+}
+.thumbnail > img {
+  display: block;
+  max-width: 100%;
+  margin-left: auto;
+  margin-right: auto;
+}
+.thumbnail .caption {
+  padding: 9px;
+  color: #555555;
+}
+.label,
+.badge {
+  font-size: 11.844px;
+  font-weight: bold;
+  line-height: 14px;
+  color: #ffffff;
+  vertical-align: baseline;
+  white-space: nowrap;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #999999;
+}
+.label {
+  padding: 1px 4px 2px;
+  -webkit-border-radius: 3px;
+  -moz-border-radius: 3px;
+  border-radius: 3px;
+}
+.badge {
+  padding: 1px 9px 2px;
+  -webkit-border-radius: 9px;
+  -moz-border-radius: 9px;
+  border-radius: 9px;
+}
+a.label:hover,
+a.badge:hover {
+  color: #ffffff;
+  text-decoration: none;
+  cursor: pointer;
+}
+.label-important,
+.badge-important {
+  background-color: #b94a48;
+}
+.label-important[href],
+.badge-important[href] {
+  background-color: #953b39;
+}
+.label-warning,
+.badge-warning {
+  background-color: #f89406;
+}
+.label-warning[href],
+.badge-warning[href] {
+  background-color: #c67605;
+}
+.label-success,
+.badge-success {
+  background-color: #468847;
+}
+.label-success[href],
+.badge-success[href] {
+  background-color: #356635;
+}
+.label-info,
+.badge-info {
+  background-color: #3a87ad;
+}
+.label-info[href],
+.badge-info[href] {
+  background-color: #2d6987;
+}
+.label-inverse,
+.badge-inverse {
+  background-color: #333333;
+}
+.label-inverse[href],
+.badge-inverse[href] {
+  background-color: #1a1a1a;
+}
+.btn .label,
+.btn .badge {
+  position: relative;
+  top: -1px;
+}
+.btn-mini .label,
+.btn-mini .badge {
+  top: 0;
+}
+ at -webkit-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -moz-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -ms-keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+ at -o-keyframes progress-bar-stripes {
+  from {
+    background-position: 0 0;
+  }
+  to {
+    background-position: 40px 0;
+  }
+}
+ at keyframes progress-bar-stripes {
+  from {
+    background-position: 40px 0;
+  }
+  to {
+    background-position: 0 0;
+  }
+}
+.progress {
+  overflow: hidden;
+  height: 20px;
+  margin-bottom: 20px;
+  background-color: #f7f7f7;
+  background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
+  background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
+  background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
+  -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.progress .bar {
+  width: 0%;
+  height: 100%;
+  color: #ffffff;
+  float: left;
+  font-size: 12px;
+  text-align: center;
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+  background-color: #0e90d2;
+  background-image: -moz-linear-gradient(top, #149bdf, #0480be);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
+  background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
+  background-image: -o-linear-gradient(top, #149bdf, #0480be);
+  background-image: linear-gradient(to bottom, #149bdf, #0480be);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
+  -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
+  -webkit-box-sizing: border-box;
+  -moz-box-sizing: border-box;
+  box-sizing: border-box;
+  -webkit-transition: width 0.6s ease;
+  -moz-transition: width 0.6s ease;
+  -o-transition: width 0.6s ease;
+  transition: width 0.6s ease;
+}
+.progress .bar + .bar {
+  -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+  -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+  box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);
+}
+.progress-striped .bar {
+  background-color: #149bdf;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  -webkit-background-size: 40px 40px;
+  -moz-background-size: 40px 40px;
+  -o-background-size: 40px 40px;
+  background-size: 40px 40px;
+}
+.progress.active .bar {
+  -webkit-animation: progress-bar-stripes 2s linear infinite;
+  -moz-animation: progress-bar-stripes 2s linear infinite;
+  -ms-animation: progress-bar-stripes 2s linear infinite;
+  -o-animation: progress-bar-stripes 2s linear infinite;
+  animation: progress-bar-stripes 2s linear infinite;
+}
+.progress-danger .bar,
+.progress .bar-danger {
+  background-color: #dd514c;
+  background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
+  background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
+  background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
+}
+.progress-danger.progress-striped .bar,
+.progress-striped .bar-danger {
+  background-color: #ee5f5b;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-success .bar,
+.progress .bar-success {
+  background-color: #5eb95e;
+  background-image: -moz-linear-gradient(top, #62c462, #57a957);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
+  background-image: -webkit-linear-gradient(top, #62c462, #57a957);
+  background-image: -o-linear-gradient(top, #62c462, #57a957);
+  background-image: linear-gradient(to bottom, #62c462, #57a957);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
+}
+.progress-success.progress-striped .bar,
+.progress-striped .bar-success {
+  background-color: #62c462;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-info .bar,
+.progress .bar-info {
+  background-color: #4bb1cf;
+  background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
+  background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
+  background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
+}
+.progress-info.progress-striped .bar,
+.progress-striped .bar-info {
+  background-color: #5bc0de;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-warning .bar,
+.progress .bar-warning {
+  background-color: #faa732;
+  background-image: -moz-linear-gradient(top, #fbb450, #f89406);
+  background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
+  background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
+  background-image: -o-linear-gradient(top, #fbb450, #f89406);
+  background-image: linear-gradient(to bottom, #fbb450, #f89406);
+  background-repeat: repeat-x;
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
+}
+.progress-warning.progress-striped .bar,
+.progress-striped .bar-warning {
+  background-color: #fbb450;
+  background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
+  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+  background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.accordion {
+  margin-bottom: 20px;
+}
+.accordion-group {
+  margin-bottom: 2px;
+  border: 1px solid #e5e5e5;
+  -webkit-border-radius: 4px;
+  -moz-border-radius: 4px;
+  border-radius: 4px;
+}
+.accordion-heading {
+  border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+  display: block;
+  padding: 8px 15px;
+}
+.accordion-toggle {
+  cursor: pointer;
+}
+.accordion-inner {
+  padding: 9px 15px;
+  border-top: 1px solid #e5e5e5;
+}
+.carousel {
+  position: relative;
+  margin-bottom: 20px;
+  line-height: 1;
+}
+.carousel-inner {
+  overflow: hidden;
+  width: 100%;
+  position: relative;
+}
+.carousel .item {
+  display: none;
+  position: relative;
+  -webkit-transition: 0.6s ease-in-out left;
+  -moz-transition: 0.6s ease-in-out left;
+  -o-transition: 0.6s ease-in-out left;
+  transition: 0.6s ease-in-out left;
+}
+.carousel .item > img {
+  display: block;
+  line-height: 1;
+}
+.carousel .active,
+.carousel .next,
+.carousel .prev {
+  display: block;
+}
+.carousel .active {
+  left: 0;
+}
+.carousel .next,
+.carousel .prev {
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+.carousel .next {
+  left: 100%;
+}
+.carousel .prev {
+  left: -100%;
+}
+.carousel .next.left,
+.carousel .prev.right {
+  left: 0;
+}
+.carousel .active.left {
+  left: -100%;
+}
+.carousel .active.right {
+  left: 100%;
+}
+.carousel-control {
+  position: absolute;
+  top: 40%;
+  left: 15px;
+  width: 40px;
+  height: 40px;
+  margin-top: -20px;
+  font-size: 60px;
+  font-weight: 100;
+  line-height: 30px;
+  color: #ffffff;
+  text-align: center;
+  background: #222222;
+  border: 3px solid #ffffff;
+  -webkit-border-radius: 23px;
+  -moz-border-radius: 23px;
+  border-radius: 23px;
+  opacity: 0.5;
+  filter: alpha(opacity=50);
+}
+.carousel-control.right {
+  left: auto;
+  right: 15px;
+}
+.carousel-control:hover {
+  color: #ffffff;
+  text-decoration: none;
+  opacity: 0.9;
+  filter: alpha(opacity=90);
+}
+.carousel-caption {
+  position: absolute;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  padding: 15px;
+  background: #333333;
+  background: rgba(0, 0, 0, 0.75);
+}
+.carousel-caption h4,
+.carousel-caption p {
+  color: #ffffff;
+  line-height: 20px;
+}
+.carousel-caption h4 {
+  margin: 0 0 5px;
+}
+.carousel-caption p {
+  margin-bottom: 0;
+}
+.hero-unit {
+  padding: 60px;
+  margin-bottom: 30px;
+  background-color: #eeeeee;
+  -webkit-border-radius: 6px;
+  -moz-border-radius: 6px;
+  border-radius: 6px;
+}
+.hero-unit h1 {
+  margin-bottom: 0;
+  font-size: 60px;
+  line-height: 1;
+  color: inherit;
+  letter-spacing: -1px;
+}
+.hero-unit p {
+  font-size: 18px;
+  font-weight: 200;
+  line-height: 30px;
+  color: inherit;
+}
+html,
+body {
+  height: 100%;
+}
+.wrapper {
+  min-height: 100%;
+  height: auto !important;
+  height: 100%;
+  margin: 0 auto -92px;
+}
+.push {
+  height: 92px;
+}
+.wrapper > .container {
+  padding-top: 24px;
+}
+.hidden {
+  display: none;
+  visibility: hidden;
+}
+.visible-phone {
+  display: none !important;
+}
+.visible-tablet {
+  display: none !important;
+}
+.hidden-desktop {
+  display: none !important;
+}
+.visible-desktop {
+  display: inherit !important;
+}
+ at media (min-width: 768px) and (max-width: 979px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important ;
+  }
+  .visible-tablet {
+    display: inherit !important;
+  }
+  .hidden-tablet {
+    display: none !important;
+  }
+}
+ at media (max-width: 767px) {
+  .hidden-desktop {
+    display: inherit !important;
+  }
+  .visible-desktop {
+    display: none !important;
+  }
+  .visible-phone {
+    display: inherit !important;
+  }
+  .hidden-phone {
+    display: none !important;
+  }
+}
+ at media (min-width: 1200px) {
+  .row {
+    margin-left: -30px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 30px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 1170px;
+  }
+  .span12 {
+    width: 1170px;
+  }
+  .span11 {
+    width: 1070px;
+  }
+  .span10 {
+    width: 970px;
+  }
+  .span9 {
+    width: 870px;
+  }
+  .span8 {
+    width: 770px;
+  }
+  .span7 {
+    width: 670px;
+  }
+  .span6 {
+    width: 570px;
+  }
+  .span5 {
+    width: 470px;
+  }
+  .span4 {
+    width: 370px;
+  }
+  .span3 {
+    width: 270px;
+  }
+  .span2 {
+    width: 170px;
+  }
+  .span1 {
+    width: 70px;
+  }
+  .offset12 {
+    margin-left: 1230px;
+  }
+  .offset11 {
+    margin-left: 1130px;
+  }
+  .offset10 {
+    margin-left: 1030px;
+  }
+  .offset9 {
+    margin-left: 930px;
+  }
+  .offset8 {
+    margin-left: 830px;
+  }
+  .offset7 {
+    margin-left: 730px;
+  }
+  .offset6 {
+    margin-left: 630px;
+  }
+  .offset5 {
+    margin-left: 530px;
+  }
+  .offset4 {
+    margin-left: 430px;
+  }
+  .offset3 {
+    margin-left: 330px;
+  }
+  .offset2 {
+    margin-left: 230px;
+  }
+  .offset1 {
+    margin-left: 130px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 2.564102564102564%;
+    *margin-left: 2.5109110747408616%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.45299145299145%;
+    *width: 91.39979996362975%;
+  }
+  .row-fluid .span10 {
+    width: 82.90598290598291%;
+    *width: 82.8527914166212%;
+  }
+  .row-fluid .span9 {
+    width: 74.35897435897436%;
+    *width: 74.30578286961266%;
+  }
+  .row-fluid .span8 {
+    width: 65.81196581196582%;
+    *width: 65.75877432260411%;
+  }
+  .row-fluid .span7 {
+    width: 57.26495726495726%;
+    *width: 57.21176577559556%;
+  }
+  .row-fluid .span6 {
+    width: 48.717948717948715%;
+    *width: 48.664757228587014%;
+  }
+  .row-fluid .span5 {
+    width: 40.17094017094017%;
+    *width: 40.11774868157847%;
+  }
+  .row-fluid .span4 {
+    width: 31.623931623931625%;
+    *width: 31.570740134569924%;
+  }
+  .row-fluid .span3 {
+    width: 23.076923076923077%;
+    *width: 23.023731587561375%;
+  }
+  .row-fluid .span2 {
+    width: 14.52991452991453%;
+    *width: 14.476723040552828%;
+  }
+  .row-fluid .span1 {
+    width: 5.982905982905983%;
+    *width: 5.929714493544281%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.12820512820512%;
+    *margin-left: 105.02182214948171%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.56410256410257%;
+    *margin-left: 102.45771958537915%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.58119658119658%;
+    *margin-left: 96.47481360247316%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.01709401709402%;
+    *margin-left: 93.91071103837061%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.03418803418803%;
+    *margin-left: 87.92780505546462%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.47008547008548%;
+    *margin-left: 85.36370249136206%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.48717948717949%;
+    *margin-left: 79.38079650845607%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 76.92307692307693%;
+    *margin-left: 76.81669394435352%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 70.94017094017094%;
+    *margin-left: 70.83378796144753%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.37606837606839%;
+    *margin-left: 68.26968539734497%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.393162393162385%;
+    *margin-left: 62.28677941443899%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.82905982905982%;
+    *margin-left: 59.72267685033642%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 53.84615384615384%;
+    *margin-left: 53.739770867430444%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.28205128205128%;
+    *margin-left: 51.175668303327875%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.299145299145295%;
+    *margin-left: 45.1927623204219%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.73504273504273%;
+    *margin-left: 42.62865975631933%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 36.75213675213675%;
+    *margin-left: 36.645753773413354%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.18803418803419%;
+    *margin-left: 34.081651209310785%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.205128205128204%;
+    *margin-left: 28.0987452264048%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.641025641025642%;
+    *margin-left: 25.53464266230224%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.65811965811966%;
+    *margin-left: 19.551736679396257%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.094017094017094%;
+    *margin-left: 16.98763411529369%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.11111111111111%;
+    *margin-left: 11.004728132387708%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.547008547008547%;
+    *margin-left: 8.440625568285142%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 30px;
+  }
+  input.span12, textarea.span12, .uneditable-input.span12 {
+    width: 1156px;
+  }
+  input.span11, textarea.span11, .uneditable-input.span11 {
+    width: 1056px;
+  }
+  input.span10, textarea.span10, .uneditable-input.span10 {
+    width: 956px;
+  }
+  input.span9, textarea.span9, .uneditable-input.span9 {
+    width: 856px;
+  }
+  input.span8, textarea.span8, .uneditable-input.span8 {
+    width: 756px;
+  }
+  input.span7, textarea.span7, .uneditable-input.span7 {
+    width: 656px;
+  }
+  input.span6, textarea.span6, .uneditable-input.span6 {
+    width: 556px;
+  }
+  input.span5, textarea.span5, .uneditable-input.span5 {
+    width: 456px;
+  }
+  input.span4, textarea.span4, .uneditable-input.span4 {
+    width: 356px;
+  }
+  input.span3, textarea.span3, .uneditable-input.span3 {
+    width: 256px;
+  }
+  input.span2, textarea.span2, .uneditable-input.span2 {
+    width: 156px;
+  }
+  input.span1, textarea.span1, .uneditable-input.span1 {
+    width: 56px;
+  }
+  .thumbnails {
+    margin-left: -30px;
+  }
+  .thumbnails > li {
+    margin-left: 30px;
+  }
+  .row-fluid .thumbnails {
+    margin-left: 0;
+  }
+}
+ at media (min-width: 768px) and (max-width: 979px) {
+  .row {
+    margin-left: -20px;
+    *zoom: 1;
+  }
+  .row:before,
+  .row:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row:after {
+    clear: both;
+  }
+  [class*="span"] {
+    float: left;
+    margin-left: 20px;
+  }
+  .container,
+  .navbar-static-top .container,
+  .navbar-fixed-top .container,
+  .navbar-fixed-bottom .container {
+    width: 724px;
+  }
+  .span12 {
+    width: 724px;
+  }
+  .span11 {
+    width: 662px;
+  }
+  .span10 {
+    width: 600px;
+  }
+  .span9 {
+    width: 538px;
+  }
+  .span8 {
+    width: 476px;
+  }
+  .span7 {
+    width: 414px;
+  }
+  .span6 {
+    width: 352px;
+  }
+  .span5 {
+    width: 290px;
+  }
+  .span4 {
+    width: 228px;
+  }
+  .span3 {
+    width: 166px;
+  }
+  .span2 {
+    width: 104px;
+  }
+  .span1 {
+    width: 42px;
+  }
+  .offset12 {
+    margin-left: 764px;
+  }
+  .offset11 {
+    margin-left: 702px;
+  }
+  .offset10 {
+    margin-left: 640px;
+  }
+  .offset9 {
+    margin-left: 578px;
+  }
+  .offset8 {
+    margin-left: 516px;
+  }
+  .offset7 {
+    margin-left: 454px;
+  }
+  .offset6 {
+    margin-left: 392px;
+  }
+  .offset5 {
+    margin-left: 330px;
+  }
+  .offset4 {
+    margin-left: 268px;
+  }
+  .offset3 {
+    margin-left: 206px;
+  }
+  .offset2 {
+    margin-left: 144px;
+  }
+  .offset1 {
+    margin-left: 82px;
+  }
+  .row-fluid {
+    width: 100%;
+    *zoom: 1;
+  }
+  .row-fluid:before,
+  .row-fluid:after {
+    display: table;
+    content: "";
+    line-height: 0;
+  }
+  .row-fluid:after {
+    clear: both;
+  }
+  .row-fluid [class*="span"] {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    float: left;
+    margin-left: 2.7624309392265194%;
+    *margin-left: 2.709239449864817%;
+  }
+  .row-fluid [class*="span"]:first-child {
+    margin-left: 0;
+  }
+  .row-fluid .span12 {
+    width: 100%;
+    *width: 99.94680851063829%;
+  }
+  .row-fluid .span11 {
+    width: 91.43646408839778%;
+    *width: 91.38327259903608%;
+  }
+  .row-fluid .span10 {
+    width: 82.87292817679558%;
+    *width: 82.81973668743387%;
+  }
+  .row-fluid .span9 {
+    width: 74.30939226519337%;
+    *width: 74.25620077583166%;
+  }
+  .row-fluid .span8 {
+    width: 65.74585635359117%;
+    *width: 65.69266486422946%;
+  }
+  .row-fluid .span7 {
+    width: 57.18232044198895%;
+    *width: 57.12912895262725%;
+  }
+  .row-fluid .span6 {
+    width: 48.61878453038674%;
+    *width: 48.56559304102504%;
+  }
+  .row-fluid .span5 {
+    width: 40.05524861878453%;
+    *width: 40.00205712942283%;
+  }
+  .row-fluid .span4 {
+    width: 31.491712707182323%;
+    *width: 31.43852121782062%;
+  }
+  .row-fluid .span3 {
+    width: 22.92817679558011%;
+    *width: 22.87498530621841%;
+  }
+  .row-fluid .span2 {
+    width: 14.3646408839779%;
+    *width: 14.311449394616199%;
+  }
+  .row-fluid .span1 {
+    width: 5.801104972375691%;
+    *width: 5.747913483013988%;
+  }
+  .row-fluid .offset12 {
+    margin-left: 105.52486187845304%;
+    *margin-left: 105.41847889972962%;
+  }
+  .row-fluid .offset12:first-child {
+    margin-left: 102.76243093922652%;
+    *margin-left: 102.6560479605031%;
+  }
+  .row-fluid .offset11 {
+    margin-left: 96.96132596685082%;
+    *margin-left: 96.8549429881274%;
+  }
+  .row-fluid .offset11:first-child {
+    margin-left: 94.1988950276243%;
+    *margin-left: 94.09251204890089%;
+  }
+  .row-fluid .offset10 {
+    margin-left: 88.39779005524862%;
+    *margin-left: 88.2914070765252%;
+  }
+  .row-fluid .offset10:first-child {
+    margin-left: 85.6353591160221%;
+    *margin-left: 85.52897613729868%;
+  }
+  .row-fluid .offset9 {
+    margin-left: 79.8342541436464%;
+    *margin-left: 79.72787116492299%;
+  }
+  .row-fluid .offset9:first-child {
+    margin-left: 77.07182320441989%;
+    *margin-left: 76.96544022569647%;
+  }
+  .row-fluid .offset8 {
+    margin-left: 71.2707182320442%;
+    *margin-left: 71.16433525332079%;
+  }
+  .row-fluid .offset8:first-child {
+    margin-left: 68.50828729281768%;
+    *margin-left: 68.40190431409427%;
+  }
+  .row-fluid .offset7 {
+    margin-left: 62.70718232044199%;
+    *margin-left: 62.600799341718584%;
+  }
+  .row-fluid .offset7:first-child {
+    margin-left: 59.94475138121547%;
+    *margin-left: 59.838368402492065%;
+  }
+  .row-fluid .offset6 {
+    margin-left: 54.14364640883978%;
+    *margin-left: 54.037263430116376%;
+  }
+  .row-fluid .offset6:first-child {
+    margin-left: 51.38121546961326%;
+    *margin-left: 51.27483249088986%;
+  }
+  .row-fluid .offset5 {
+    margin-left: 45.58011049723757%;
+    *margin-left: 45.47372751851417%;
+  }
+  .row-fluid .offset5:first-child {
+    margin-left: 42.81767955801105%;
+    *margin-left: 42.71129657928765%;
+  }
+  .row-fluid .offset4 {
+    margin-left: 37.01657458563536%;
+    *margin-left: 36.91019160691196%;
+  }
+  .row-fluid .offset4:first-child {
+    margin-left: 34.25414364640884%;
+    *margin-left: 34.14776066768544%;
+  }
+  .row-fluid .offset3 {
+    margin-left: 28.45303867403315%;
+    *margin-left: 28.346655695309746%;
+  }
+  .row-fluid .offset3:first-child {
+    margin-left: 25.69060773480663%;
+    *margin-left: 25.584224756083227%;
+  }
+  .row-fluid .offset2 {
+    margin-left: 19.88950276243094%;
+    *margin-left: 19.783119783707537%;
+  }
+  .row-fluid .offset2:first-child {
+    margin-left: 17.12707182320442%;
+    *margin-left: 17.02068884448102%;
+  }
+  .row-fluid .offset1 {
+    margin-left: 11.32596685082873%;
+    *margin-left: 11.219583872105325%;
+  }
+  .row-fluid .offset1:first-child {
+    margin-left: 8.56353591160221%;
+    *margin-left: 8.457152932878806%;
+  }
+  input,
+  textarea,
+  .uneditable-input {
+    margin-left: 0;
+  }
+  .controls-row [class*="span"] + [class*="span"] {
+    margin-left: 20px;
+  }
+  input.span12, textarea.span12, .uneditable-input.span12 {
+    width: 710px;
+  }
+  input.span11, textarea.span11, .uneditable-input.span11 {
+    width: 648px;
+  }
+  input.span10, textarea.span10, .uneditable-input.span10 {
+    width: 586px;
+  }
+  input.span9, textarea.span9, .uneditable-input.span9 {
+    width: 524px;
+  }
+  input.span8, textarea.span8, .uneditable-input.span8 {
+    width: 462px;
+  }
+  input.span7, textarea.span7, .uneditable-input.span7 {
+    width: 400px;
+  }
+  input.span6, textarea.span6, .uneditable-input.span6 {
+    width: 338px;
+  }
+  input.span5, textarea.span5, .uneditable-input.span5 {
+    width: 276px;
+  }
+  input.span4, textarea.span4, .uneditable-input.span4 {
+    width: 214px;
+  }
+  input.span3, textarea.span3, .uneditable-input.span3 {
+    width: 152px;
+  }
+  input.span2, textarea.span2, .uneditable-input.span2 {
+    width: 90px;
+  }
+  input.span1, textarea.span1, .uneditable-input.span1 {
+    width: 28px;
+  }
+}
+ at media (max-width: 767px) {
+  body {
+    padding-left: 20px;
+    padding-right: 20px;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    margin-left: -20px;
+    margin-right: -20px;
+  }
+  .container-fluid {
+    padding: 0;
+  }
+  .dl-horizontal dt {
+    float: none;
+    clear: none;
+    width: auto;
+    text-align: left;
+  }
+  .dl-horizontal dd {
+    margin-left: 0;
+  }
+  .container {
+    width: auto;
+  }
+  .row-fluid {
+    width: 100%;
+  }
+  .row,
+  .thumbnails {
+    margin-left: 0;
+  }
+  .thumbnails > li {
+    float: none;
+    margin-left: 0;
+  }
+  [class*="span"],
+  .row-fluid [class*="span"] {
+    float: none;
+    display: block;
+    width: auto;
+    margin-left: 0;
+  }
+  .span12,
+  .row-fluid .span12 {
+    width: 100%;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .input-large,
+  .input-xlarge,
+  .input-xxlarge,
+  input[class*="span"],
+  select[class*="span"],
+  textarea[class*="span"],
+  .uneditable-input {
+    display: block;
+    width: 100%;
+    min-height: 30px;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+  }
+  .input-prepend input,
+  .input-append input,
+  .input-prepend input[class*="span"],
+  .input-append input[class*="span"] {
+    display: inline-block;
+    width: auto;
+  }
+  .modal {
+    position: fixed;
+    top: 20px;
+    left: 20px;
+    right: 20px;
+    width: auto;
+    margin: 0;
+  }
+  .modal.fade.in {
+    top: auto;
+  }
+}
+ at media (max-width: 480px) {
+  .nav-collapse {
+    -webkit-transform: translate3d(0, 0, 0);
+  }
+  .page-header h1 small {
+    display: block;
+    line-height: 20px;
+  }
+  input[type="checkbox"],
+  input[type="radio"] {
+    border: 1px solid #ccc;
+  }
+  .form-horizontal .control-group > label {
+    float: none;
+    width: auto;
+    padding-top: 0;
+    text-align: left;
+  }
+  .form-horizontal .controls {
+    margin-left: 0;
+  }
+  .form-horizontal .control-list {
+    padding-top: 0;
+  }
+  .form-horizontal .form-actions {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+  .modal {
+    top: 10px;
+    left: 10px;
+    right: 10px;
+  }
+  .modal-header .close {
+    padding: 10px;
+    margin: -10px;
+  }
+  .carousel-caption {
+    position: static;
+  }
+}
+ at media (max-width: 979px) {
+  body {
+    padding-top: 0;
+  }
+  .navbar-fixed-top,
+  .navbar-fixed-bottom {
+    position: static;
+  }
+  .navbar-fixed-top {
+    margin-bottom: 20px;
+  }
+  .navbar-fixed-bottom {
+    margin-top: 20px;
+  }
+  .navbar-fixed-top .navbar-inner,
+  .navbar-fixed-bottom .navbar-inner {
+    padding: 5px;
+  }
+  .navbar .container {
+    width: auto;
+    padding: 0;
+  }
+  .navbar .brand {
+    padding-left: 10px;
+    padding-right: 10px;
+    margin: 0 0 0 -5px;
+  }
+  .nav-collapse {
+    clear: both;
+  }
+  .nav-collapse .nav {
+    float: none;
+    margin: 0 0 10px;
+  }
+  .nav-collapse .nav > li {
+    float: none;
+  }
+  .nav-collapse .nav > li > a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > .divider-vertical {
+    display: none;
+  }
+  .nav-collapse .nav .nav-header {
+    color: #1f444b;
+    text-shadow: none;
+  }
+  .nav-collapse .nav > li > a,
+  .nav-collapse .dropdown-menu a {
+    padding: 9px 15px;
+    font-weight: bold;
+    color: #1f444b;
+    -webkit-border-radius: 3px;
+    -moz-border-radius: 3px;
+    border-radius: 3px;
+  }
+  .nav-collapse .btn {
+    padding: 4px 10px 4px;
+    font-weight: normal;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+  }
+  .nav-collapse .dropdown-menu li + li a {
+    margin-bottom: 2px;
+  }
+  .nav-collapse .nav > li > a:hover,
+  .nav-collapse .dropdown-menu a:hover {
+    background-color: #e2e1d7;
+  }
+  .navbar-inverse .nav-collapse .nav > li > a:hover,
+  .navbar-inverse .nav-collapse .dropdown-menu a:hover {
+    background-color: #111111;
+  }
+  .nav-collapse.in .btn-group {
+    margin-top: 5px;
+    padding: 0;
+  }
+  .nav-collapse .dropdown-menu {
+    position: static;
+    top: auto;
+    left: auto;
+    float: none;
+    display: block;
+    max-width: none;
+    margin: 0 15px;
+    padding: 0;
+    background-color: transparent;
+    border: none;
+    -webkit-border-radius: 0;
+    -moz-border-radius: 0;
+    border-radius: 0;
+    -webkit-box-shadow: none;
+    -moz-box-shadow: none;
+    box-shadow: none;
+  }
+  .nav-collapse .dropdown-menu:before,
+  .nav-collapse .dropdown-menu:after {
+    display: none;
+  }
+  .nav-collapse .dropdown-menu .divider {
+    display: none;
+  }
+  .nav-collapse .navbar-form,
+  .nav-collapse .navbar-search {
+    float: none;
+    padding: 10px 15px;
+    margin: 10px 0;
+    border-top: 1px solid #e2e1d7;
+    border-bottom: 1px solid #e2e1d7;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+    box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);
+  }
+  .navbar .nav-collapse .nav.pull-right {
+    float: none;
+    margin-left: 0;
+  }
+  .nav-collapse,
+  .nav-collapse.collapse {
+    overflow: hidden;
+    height: 0;
+  }
+  .navbar .btn-navbar {
+    display: block;
+  }
+  .navbar-static .navbar-inner {
+    padding-left: 10px;
+    padding-right: 10px;
+  }
+}
+ at media (min-width: 980px) {
+  .nav-collapse.collapse {
+    height: auto !important;
+    overflow: visible !important;
+  }
+}
+input.ng-dirty.ng-valid {
+  /*.formFieldState(@successText, @successText, @successBackground);*/
+
+  border-color: #468847;
+}
+input.ng-dirty.ng-invalid {
+  /*.formFieldState(@errorText, @errorText, @errorBackground);*/
+
+  border-color: #b94a48;
+}
+.provider-btn {
+  display: inline-block;
+  list-style: none;
+  padding: 5px;
+}
+.provider-btn .btn img {
+  width: 90px;
+  height: 30px;
+}
+.password-form {
+  padding-top: 20px;
+  border-left: 1px solid #e5e5e5;
+}
+.password-form .form-actions {
+  background-color: transparent;
+  border: none;
+}
+.aeauth-form h4 {
+  text-align: center;
+}
+.pull-right {
+  float: right;
+}
+.pull-left {
+  float: left;
+}
+.hide {
+  display: none;
+}
+.show {
+  display: block;
+}
+.invisible {
+  visibility: hidden;
+}
+.affix {
+  position: fixed;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  font-weight: normal;
+  padding-bottom: .3em;
+  color: #1F444B;
+}
+.nav .brand {
+  padding: 0;
+}
+#user-nav {
+  padding: 25px 15px 25px;
+}
+.clickable {
+  cursor: pointer;
+}
+.form-actions {
+  background-color: transparent;
+  border: none;
+}
+.navbar .brand a:hover {
+  text-decoration: none;
+}
+.nav-list .active > a,
+.nav-list .active > a:hover {
+  -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+  text-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
+}
+.nav-list > li > a {
+  line-height: 24px;
+  padding: 3px 10px;
+}
+section header {
+  padding-bottom: 12px;
+}
+.footer {
+  background-color: #edece6;
+  padding: 30px 0;
+  border-top: 1px solid #e5e5e5;
+  -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
+  -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
+  box-shadow: inset 0 5px 15px rgba(0, 0, 0, 0.025);
+}
+
+.quick-links {
+  background-color: #ECEEEF;
+}
+
+.quick-links strong {
+  color: #1F444B;
+}
diff --git a/doc/_themes/bootstrap/static/jquery.js b/doc/_themes/bootstrap/static/jquery.js
new file mode 100644
index 0000000..fa48099
--- /dev/null
+++ b/doc/_themes/bootstrap/static/jquery.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement( [...]
+    f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special [...]
+    {for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.re [...]
\ No newline at end of file
diff --git a/doc/_themes/bootstrap/static/sphinx-bootstrap.css b/doc/_themes/bootstrap/static/sphinx-bootstrap.css
new file mode 100644
index 0000000..2e7b851
--- /dev/null
+++ b/doc/_themes/bootstrap/static/sphinx-bootstrap.css
@@ -0,0 +1,188 @@
+/* To change themes. Un-comment the theme you would like to use. */
+
+ at import "bootstrap-engineauth.min.css";
+/*@import "bootstrap-default.min.css";*/
+/*@import "bootstrap-sapling.css";*/
+
+ at import "bootstrap-responsive.min.css";
+
+.navbar .brand {
+    font-size: 25px;
+}
+
+.logo {
+    float: left;
+    margin-bottom: 5px;
+}
+
+.content {
+    padding-top: 25px;
+}
+
+.footer {
+    /*background-color: #eee;*/
+    padding: 30px 0;
+    text-shadow: 0 1px 0 #fff;
+    border-top: 1px solid #e5e5e5;
+    -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
+    -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
+    box-shadow: inset 0 5px 15px rgba(0, 0, 0, .025);
+}
+
+.row-odd {
+    background-color: #fafafa;
+}
+
+h1, h2, h3, h4, h5, h6 {
+    padding-bottom: .3em;
+}
+
+.section {
+    margin-bottom: 25px;
+}
+
+code, pre {
+    color: #000;
+}
+
+span.pre {
+    font-family: monospace;
+    color: #007000;
+}
+
+div.admonition {
+    margin: 0 0 10px;
+    padding: .2em .5em .2em .9em;
+}
+
+div.admonition.note {
+    background-color: #fffbe0;
+}
+
+div.admonition.warning {
+    background-color: #ffe0d7;
+}
+
+div.admonition p {
+    margin: .5em;
+    padding: 0;
+}
+p.admonition-title {
+    display: none;
+}
+
+.descname {
+    font-weight: bold;
+}
+
+a.headerlink {
+    visibility: hidden;
+}
+
+h1:hover > a.headerlink,
+h2:hover > a.headerlink,
+h3:hover > a.headerlink,
+h4:hover > a.headerlink,
+h5:hover > a.headerlink,
+h6:hover > a.headerlink,
+dt:hover > a.headerlink {
+    visibility: visible;
+}
+
+a.headerlink {
+    color: #aeaeae;
+    text-decoration: none;
+}
+
+a.headerlink:hover {
+    color: #0E84B5;
+}
+
+.viewcode-link, .viewcode-back {
+    float: right;
+}
+
+tr > td:first-child {
+    font-family: monospace;
+    color: #007000;
+}
+
+tr > td:nth-child(2) {
+    font-family: monospace;
+    color: #4070A0;
+}
+
+.quick-links {
+    border-radius: 3px 3px 3px 3px;
+    box-shadow: 0 1px 0 rgba(0, 0, 0, 0.03) inset;
+    list-style: none outside none;
+    /*margin: 43px 0 0;*/
+    margin: 0;
+    margin-top: 96px;
+    padding: 5px 20px;
+    margin-left: 310px;
+    text-align: center;
+    -webkit-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
+    -moz-box-shadow: inset 0 5px 15px rgba(0, 0, 0, .1);
+}
+
+.quick-links li {
+    display: inline;
+    line-height: 30px;
+    margin: 0 5px;
+}
+
+.quick-links .divider {
+    color: #999999;
+}
+
+.quick-links strong {
+    font-weight: normal;
+}
+
+.quick-links .github-btn, .quick-links .tweet-btn, .quick-links .follow-btn, .plusone-container {
+    position: relative;
+    top: 5px;
+}
+
+input[type="submit"] {
+    display: inline-block;
+    padding: 5px 14px 6px;
+    font-size: 13px;
+    line-height: normal;
+    color: #333;
+    text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+    background-color: #e6e6e6;
+    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), color-stop(25%, #ffffff), to(#e6e6e6));
+    background-image: -webkit-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -moz-linear-gradient(top, #ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -ms-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: -o-linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-image: linear-gradient(#ffffff, #ffffff 25%, #e6e6e6);
+    background-repeat: no-repeat;
+    border: 1px solid #ccc;
+    border-bottom-color: #bbb;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
+    cursor: pointer;
+    -webkit-transition: 0.1s linear all;
+    -moz-transition: 0.1s linear all;
+    -ms-transition: 0.1s linear all;
+    -o-transition: 0.1s linear all;
+    transition: 0.1s linear all;
+}
+input[type="submit"]:hover {
+    color: #404040;
+    text-decoration: none;
+    background-position: 0 -15px;
+}
+
+input[type="submit"].active, input[type="submit"]:active {
+    -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+    -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+    box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
diff --git a/doc/_themes/bootstrap/theme.conf b/doc/_themes/bootstrap/theme.conf
new file mode 100644
index 0000000..def5d44
--- /dev/null
+++ b/doc/_themes/bootstrap/theme.conf
@@ -0,0 +1,16 @@
+[theme]
+inherit = basic
+stylesheet = sphinx-bootstrap.css
+
+[options]
+nosidebar = false
+sidebarwidth = 200
+logo_width =
+logo_height =
+analytics_code =
+analytics_domain =
+github_user =
+github_repo =
+twitter_username =
+home_url =
+disqus_shortname =
diff --git a/doc/api/cpp/bounds.rst b/doc/api/cpp/bounds.rst
new file mode 100644
index 0000000..8839919
--- /dev/null
+++ b/doc/api/cpp/bounds.rst
@@ -0,0 +1,8 @@
+.. _cpp-pdal-bounds:
+
+******************************************************************************
+pdal::BOX3D
+******************************************************************************
+
+.. doxygenclass:: pdal::BOX3D
+   :members:
diff --git a/doc/api/cpp/dimension.rst b/doc/api/cpp/dimension.rst
new file mode 100644
index 0000000..e0ceeb4
--- /dev/null
+++ b/doc/api/cpp/dimension.rst
@@ -0,0 +1,17 @@
+.. _cpp-pdal-dimension:
+
+******************************************************************************
+pdal::Dimension
+******************************************************************************
+
+.. doxygenfunction:: pdal::Dimension::description
+
+.. doxygenfunction:: pdal::Dimension::id
+
+.. doxygenfunction:: pdal::Dimension::name
+
+.. doxygenfunction:: pdal::Dimension::defaultType
+
+.. doxygenfunction:: pdal::Dimension::interpretationName
+
+.. doxygenfunction:: pdal::Dimension::type
diff --git a/doc/api/cpp/index.rst b/doc/api/cpp/index.rst
new file mode 100644
index 0000000..0d51b02
--- /dev/null
+++ b/doc/api/cpp/index.rst
@@ -0,0 +1,21 @@
+.. _cppapi:
+
+******************************************************************************
+C++ API
+******************************************************************************
+
+
+.. toctree::
+   :maxdepth: 2
+
+   dimension
+   bounds
+   log
+   metadata
+   option
+   options
+   pointview
+   pointtable
+   reader
+   stage
+   writer
diff --git a/doc/api/cpp/log.rst b/doc/api/cpp/log.rst
new file mode 100644
index 0000000..7443c4f
--- /dev/null
+++ b/doc/api/cpp/log.rst
@@ -0,0 +1,8 @@
+.. _cpp-pdal-log:
+
+******************************************************************************
+pdal::Log
+******************************************************************************
+
+.. doxygenclass:: pdal::Log
+   :members:
diff --git a/doc/api/cpp/metadata.rst b/doc/api/cpp/metadata.rst
new file mode 100644
index 0000000..49b1cea
--- /dev/null
+++ b/doc/api/cpp/metadata.rst
@@ -0,0 +1,11 @@
+.. _cpp-pdal-metadata:
+
+******************************************************************************
+pdal::Metadata
+******************************************************************************
+
+
+
+.. doxygenclass:: pdal::Metadata
+   :members:
+
diff --git a/doc/api/cpp/option.rst b/doc/api/cpp/option.rst
new file mode 100644
index 0000000..ad93a42
--- /dev/null
+++ b/doc/api/cpp/option.rst
@@ -0,0 +1,11 @@
+.. _cpp-pdal-option:
+
+******************************************************************************
+pdal::Option
+******************************************************************************
+
+
+
+.. doxygenclass:: pdal::Option
+   :members:
+
diff --git a/doc/api/cpp/options.rst b/doc/api/cpp/options.rst
new file mode 100644
index 0000000..b6c4858
--- /dev/null
+++ b/doc/api/cpp/options.rst
@@ -0,0 +1,9 @@
+.. _cpp-pdal-options:
+
+******************************************************************************
+pdal::Options
+******************************************************************************
+
+.. doxygenclass:: pdal::Options
+   :members:
+
diff --git a/doc/api/cpp/pointtable.rst b/doc/api/cpp/pointtable.rst
new file mode 100644
index 0000000..5939286
--- /dev/null
+++ b/doc/api/cpp/pointtable.rst
@@ -0,0 +1,10 @@
+.. _cpp-pdal-pointtable:
+
+******************************************************************************
+pdal::PointTable
+******************************************************************************
+
+
+.. doxygenclass:: pdal::PointTable
+   :members:
+
diff --git a/doc/api/cpp/pointview.rst b/doc/api/cpp/pointview.rst
new file mode 100644
index 0000000..4a30ffc
--- /dev/null
+++ b/doc/api/cpp/pointview.rst
@@ -0,0 +1,11 @@
+.. _cpp-pdal-pointview:
+
+******************************************************************************
+pdal::PointView
+******************************************************************************
+
+.. doxygenclass:: pdal::PointView
+   :members:
+
+
+
diff --git a/doc/api/cpp/reader.rst b/doc/api/cpp/reader.rst
new file mode 100644
index 0000000..c644df5
--- /dev/null
+++ b/doc/api/cpp/reader.rst
@@ -0,0 +1,53 @@
+.. _cpp-reader:
+
+******************************************************************************
+:cpp:class:`pdal::Reader`
+******************************************************************************
+
+:cpp:class:`pdal::Reader` are classes that provided interfaces to various the
+various point cloud formats and hands them off to a PDAL pipeline in a common
+format that is described via the :cpp:class:`pdal::Schema`.
+
+.. doxygenclass:: pdal::Reader
+   :members:
+   :sections: public*
+
+
+`ASPRS LAS`_ Reader
+------------------------------------------------------------------------------
+
+The `ASPRS LAS`_ format is a sequential binary format used to store data from
+LiDAR sensors and by LiDAR processing software for data interchange and archival.
+
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+
+.. doxygenclass:: pdal::drivers::las::Reader
+   :members:
+
+OCI Reader
+------------------------------------------------------------------------------
+
+The OCI reader provides `Oracle Point Cloud`_ support to PDAL.
+
+.. _`Oracle Point Cloud`: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+
+.. doxygenclass:: pdal::drivers::oci::OciReader
+   :members:
+
+QFIT Reader
+------------------------------------------------------------------------------
+`QFIT`_ is a format for the NASA IceBridge sea ice sensor.
+ 
+.. _`QFIT`: http://nsidc.org/data/ilatm1b.html
+
+.. doxygenclass:: pdal::QfitReader
+  :members:
+
+TerraSolid Reader
+------------------------------------------------------------------------------
+
+.. doxygenclass:: pdal::drivers::terrasolid::Reader
+ :members:
+
+
diff --git a/doc/api/cpp/stage.rst b/doc/api/cpp/stage.rst
new file mode 100644
index 0000000..4c2c307
--- /dev/null
+++ b/doc/api/cpp/stage.rst
@@ -0,0 +1,14 @@
+.. _cpp-pdal-stage:
+
+******************************************************************************
+pdal::Stage
+******************************************************************************
+
+:cpp:class:`pdal::Stage` is the base class of :cpp:class:`pdal::Filter`, 
+:cpp:class:`pdal::Reader`, and :cpp:class:`pdal::MultiFilter` classes that 
+implement the reading API in a PDAL pipeline.
+
+.. doxygenclass:: pdal::Stage
+   :members:
+   :sections: public*, protected*
+
diff --git a/doc/api/cpp/writer.rst b/doc/api/cpp/writer.rst
new file mode 100644
index 0000000..8dd9116
--- /dev/null
+++ b/doc/api/cpp/writer.rst
@@ -0,0 +1,11 @@
+.. _cpp-pdal-writer:
+
+******************************************************************************
+pdal::Writer
+******************************************************************************
+
+
+.. doxygenclass:: pdal::Writer
+   :members:
+
+
diff --git a/doc/api/index.rst b/doc/api/index.rst
new file mode 100644
index 0000000..cb23f00
--- /dev/null
+++ b/doc/api/index.rst
@@ -0,0 +1,18 @@
+.. _api:
+
+******************************************************************************
+API documentation for PDAL
+******************************************************************************
+
+PDAL's primary API is its C++ API, however, more `SWIG-based`_ are expected to 
+be developed.
+    
+.. toctree::
+   :maxdepth: 2
+   
+   cpp/index
+   
+   
+   
+
+.. _`SWIG-based`: http://www.swig.org
diff --git a/doc/apps.rst b/doc/apps.rst
new file mode 100644
index 0000000..99873a5
--- /dev/null
+++ b/doc/apps.rst
@@ -0,0 +1,698 @@
+.. _apps:
+
+******************************************************************************
+PDAL Applications
+******************************************************************************
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 6/1/2015
+
+PDAL contains consists of a single application, called ``pdal``. The ```pdal``
+application currently has the following subcommands:
+
+* :ref:`delta <delta_command>`
+* :ref:`diff <diff_command>`
+* :ref:`ground <ground_command>`
+* :ref:`info <info_command>`
+* :ref:`pcl <pcl_command>`
+* :ref:`pipeline <pipeline_command>`
+* :ref:`random <random_command>`
+* :ref:`split <split_command>`
+* :ref:`tindex <tindex_command>`
+* :ref:`translate <translate_command>`
+* :ref:`view <view_command>`
+
+Applications are run by invoking the ``pdal`` application along with the
+command name:
+
+::
+
+    $ pdal info myfile.las
+    $ pdal translate input.las output.las
+    $ pdal pipeline --stdin < myxml.xml
+
+Help for each command can be retrieved via the ``--help`` switch. The
+``--drivers`` and ``--options`` switches can tell you more about particular
+drivers and their options:
+
+::
+
+    $ pdal info --help
+    $ pdal translate --drivers
+    $ pdal pipeline --options writers.las
+
+Additional driver-specific options may be specified by using a
+namespace-prefixed option name. For example, it is possible to set the LAS day
+of year at translation time with the following option:
+
+::
+
+    $ pdal translate \
+        --writers.las.creation_doy="42" \
+        input.las \
+        output.las
+
+.. note::
+
+    Driver specific options can be identified using the ``pdal info --options``
+    invocation.
+
+
+.. _delta_command:
+
+delta command
+------------------------------------------------------------------------------
+
+The ``delta`` command is used to select a nearest point from a candidate file
+for each point in the source file. If the ``--2d`` option is used, the
+query only happens in XY coordinate space.
+
+::
+
+    $ pdal delta <source> <candidate> [output]
+
+Standard out is used if no output file is specified.
+
+::
+
+    --source arg     Non-positional option for specifying source filename
+    --candidate arg  Non-positional option for specifying candidate filename
+    --output arg     Non-positional option for specifying output filename [/dev/stdout]
+    --2d             only 2D comparisons/indexing
+
+Example 1:
+^^^^^^^^^^^^^
+
+::
+
+    $ pdal delta ../../test/data/las/1.2-with-color.las \
+        ../../test/data/las/1.2-with-color.las
+    --------------------------------------------------------------------------------
+    Delta summary for
+         source: '../../test/data/las/1.2-with-color.las'
+         candidate: '../../test/data/las/1.2-with-color.las'
+    --------------------------------------------------------------------------------
+
+    ----------- --------------- --------------- --------------
+     Dimension       X             Y                  Z
+    ----------- --------------- --------------- --------------
+     Min        0.0000            0.0000            0.0000
+     Max        0.0000            0.0000            0.0000
+     Mean       0.0000            0.0000            0.0000
+    ----------- --------------- --------------- --------------
+
+Example 2:
+^^^^^^^^^^
+
+::
+
+    $ pdal delta test/data/1.2-with-color.las \
+        test/data/1.2-with-color.las --detail
+    "ID","DeltaX","DeltaY","DeltaZ"
+    0,0.00,0.00,0.00
+    1,0.00,0.00,0.00
+    2,0.00,0.00,0.00
+    3,0.00,0.00,0.00
+    4,0.00,0.00,0.00
+    5,0.00,0.00,0.00
+    ....
+
+
+.. _diff_command:
+
+diff command
+------------------------------------------------------------------------------
+
+The ``diff`` command is used for executing a simple contextual difference
+between two sources.
+
+::
+
+    $ pdal diff <source> <candidate>
+
+::
+
+    --source arg     Non-positional option for specifying filename of source file.
+    --candidate arg  Non-positional option for specifying filename to test against source.
+
+The command returns 0 and produces no output if the files describe the same
+point data in the same format, otherwise 1 is returned and a JSON-formatted
+description of the differences is produced.
+
+The command checks for the equivalence of the following items:
+
+* Different schema
+* Expected count
+* Metadata
+* Actual point count
+* Byte-by-byte point data
+
+
+.. _ground_command:
+
+ground command
+------------------------------------------------------------------------------
+
+The ``ground`` command is used to segment the input point cloud into ground
+versus non-ground returns. The output is a point cloud containing only ground
+returns. The ``ground`` command invokes `Point Cloud Library
+<http://pointclouds.org/>`_'s `ProgressiveMorphologicalFilter`_.
+
+.. note::
+
+    The ``ground`` command is only available when PDAL is linked with PCL.
+
+::
+
+    $ pdal ground <input> <output>
+
+::
+
+    --input [-i] arg       Non-positional option for specifying input filename
+    --output [-o] arg      Non-positional option for specifying output filename
+    --maxWindowSize arg    max window size [33]
+    --slope arg            slope [1]
+    --maxDistance arg      max distance [2.5]
+    --initialDistance arg  initial distance [0.15]
+    --cellSize arg         cell size [1]
+    --classify             apply classification labels? [true]
+    --extract              extract ground returns? [false]
+    --approximate [-a]     Use significantly faster approximate algorithm? [false]
+
+
+.. _info_command:
+
+info command
+------------------------------------------------------------------------------
+
+Dumps information about a point cloud file, such as:
+
+* basic properties (extents, number of points, point format)
+* coordinate reference system
+* additional metadata
+* summary statistics about the points
+* the plain text format should be reStructured text if possible to allow a user
+  to retransform the output into whatever they want with ease
+
+::
+
+    $ pdal info <input>
+
+::
+
+    --input arg       Non-positional argument to specify input filename.
+    --point [-p] arg  Display points for particular points.  Points can be specified in
+                      a range or list: 4-10, 15, 255-300.
+    --query arg       Add a listing of points based on the distance from the provided
+                      location.  The number of points returned can be limited by
+                      providing an optional count.
+                      --query "25.34,35.123/3" or --query "11532.23 -10e23 1.234/10"
+    --stats           Display the minimum, maximum, average and count of each
+                      dimension.
+    --boundary        Compute a hexagonal boundary that contains all points.
+    --dimensions arg  Use with --stats to limit the dimensions on which statistics
+                      should be computed.
+                      --dimensions "X, Y,Red"
+    --schema          Dump the schema of the internal point storage.
+    --pipeline-serialization
+                      Create a JSON representation of the pipeline used to generate
+                      the output.
+    --summary         Dump the point count, spatial reference, extrema and dimension
+                      names.
+    --metadata        Dump the metadata associated with the input file.
+
+If no options are provided, ``--stats`` is assumed.
+
+Example 1:
+^^^^^^^^^^^^
+
+::
+
+    $ pdal info  test/data/las/1.2-with-color.las \
+        --query="636601.87, 849018.59, 425.10"
+    {
+      "0":
+      {
+        "Blue": 134,
+        "Classssification": 1,
+        "EdgeOfFlightLine": 0,
+        "GpsTime": 245383.38808001476,
+        "Green": 104,
+        "Intensity": 124,
+        "NumberOfReturns": 1,
+        "PointSourceId": 7326,
+        "Red": 134,
+        "ReturnNumber": 1,
+        "ScanAngleRank": -4,
+        "ScanDirectionFlag": 1,
+        "UserData": 126,
+        "X": 636601.87,
+        "Y": 849018.59999999998,
+        "Z": 425.10000000000002
+      },
+      "1":
+      {
+        "Blue": 134,
+        "Classification": 2,
+        "EdgeOfFlightLine": 0,
+        "GpsTime": 246099.17323102333,
+        "Green": 106,
+        "Intensity": 153,
+        "NumberOfReturns": 1,
+        "PointSourceId": 7327,
+        "Red": 143,
+        "ReturnNumber": 1,
+        "ScanAngleRank": -10,
+        "ScanDirectionFlag": 1,
+        "UserData": 126,
+        "X": 636606.76000000001,
+        "Y": 849053.94000000006,
+        "Z": 425.88999999999999
+      },
+      ...
+
+Example 2:
+^^^^^^^^^^
+
+::
+
+    $ pdal info test/data/1.2-with-color.las -p 0-10
+    {
+      "filename": "../../test/data/las/1.2-with-color.las",
+      "pdal_version": "PDAL 1.0.0.b1 (116d7d) with GeoTIFF 1.4.1 GDAL 1.11.2 LASzip 2.2.0",
+      "points":
+      {
+        "point":
+        [
+          {
+            "Blue": 88,
+            "Classification": 1,
+            "EdgeOfFlightLine": 0,
+            "GpsTime": 245380.78254962614,
+            "Green": 77,
+            "Intensity": 143,
+            "NumberOfReturns": 1,
+            "PointId": 0,
+            "PointSourceId": 7326,
+            "Red": 68,
+            "ReturnNumber": 1,
+            "ScanAngleRank": -9,
+            "ScanDirectionFlag": 1,
+            "UserData": 132,
+            "X": 637012.23999999999,
+            "Y": 849028.31000000006,
+            "Z": 431.66000000000003
+          },
+          {
+            "Blue": 68,
+            "Classification": 1,
+            "EdgeOfFlightLine": 0,
+            "GpsTime": 245381.45279923646,
+            "Green": 66,
+            "Intensity": 18,
+            "NumberOfReturns": 2,
+            "PointId": 1,
+            "PointSourceId": 7326,
+            "Red": 54,
+            "ReturnNumber": 1,
+            "ScanAngleRank": -11,
+            "ScanDirectionFlag": 1,
+            "UserData": 128,
+            "X": 636896.32999999996,
+            "Y": 849087.70000000007,
+            "Z": 446.38999999999999
+          },
+          ...
+
+
+.. _pcl_command:
+
+pcl command
+------------------------------------------------------------------------------
+
+The ``pcl`` command is used to invoke a PCL JSON pipeline. See
+:ref:`pcl_block_tutorial` for more information.
+
+.. note::
+
+    The ``pcl`` command is only available when PDAL is linked with PCL.
+
+::
+
+    $ pdal pcl <input> <output> <pcl>
+
+::
+
+    --input [-i] arg   Non-positional argument to specify input file name.
+    --output [-o] arg  Non-positional argument to specify output file name.
+    --pcl [-p] arg     Non-positional argument to specify pcl file name.
+    --compress [-z]    Compress output data (if supported by output format)
+    --metadata [-m]    Forward metadata from previous stages.
+
+
+.. _pipeline_command:
+
+pipeline command
+------------------------------------------------------------------------------
+
+The ``pipeline`` command is used to execute :ref:`pipeline` XML. See
+:ref:`reading` or :ref:`pipeline` for more information.
+
+::
+
+    $ pdal pipeline <input>
+
+::
+
+    --input [-i] arg  Non-positional argument to specify input file name.
+    --pipeline-serialization arg
+                      Write input pipeline along with all metadata and created by the
+                      pipeline to the specified file.
+    --validate        Validate the pipeline (including serialization), but do not execute
+                      writing of points
+
+.. note::
+
+    The ``pipeline`` command can accept option substitutions, but they
+    do not replace existing options that are specified in the input XML
+    pipeline.  For example, to set the output and input LAS files for a
+    pipeline that does a translation, construct XML that does not contain
+    ``filename`` for reader and writer and issue the command with the
+    following arguments:
+
+    ::
+
+        $ pdal pipeline -i translate.xml --writers.las.filename=output.laz \
+            --readers.las.filename=input.las
+
+
+.. _random_command:
+
+random command
+------------------------------------------------------------------------------
+
+The ``random`` command is used to create a random point cloud. It uses
+:ref:`readers.faux` to create a point cloud containing ``count`` points
+drawn randomly from either a uniform or normal distribution. For the uniform
+distribution, the bounds can be specified (they default to a unit cube). For
+the normal distribution, the mean and standard deviation can both be set for
+each of the x, y, and z dimensions.
+
+::
+
+    $ pdal random <output>
+
+::
+
+    --output [-o] arg   Non-positional argument to specify output file name.
+    --compress [-z]     Compress output data (if supported by output format)
+    --count arg         Number of points in created point cloud [0].
+    --bounds arg        Extent (in XYZ to clip output to):
+                        --bounds "([xmin,xmax],[ymin,ymax],[zmin,zmax])"
+    --mean arg          List of means (for --distribution normal)
+                        --mean 0.0,0.0,0.0
+                        --mean "0.0 0.0 0.0"
+    --stdev arg         List of standard deviations (for --distribution normal)
+                        --stdev 0.0,0.0,0.0
+                        --stdev "0.0 0.0 0.0"
+    --distribution arg  Distribution type (uniform or normal) [uniform]
+
+
+.. _split_command:
+
+split command
+------------------------------------------------------------------------------
+
+The ``split`` command will create multiple output files from a single input
+file.  The command takes an input file name and an output filename (used as a
+template) or output directory specification.
+
+::
+
+    $ pdal split <input> <output>
+
+::
+
+    --input [-i] arg   Non-positional option for specifying input file name
+    --output [-o] arg  Non-positional option for specifying output file/directory name
+    --length arg       Edge length for splitter cells.  See :ref:`filters.splitter`.
+    --capacity arg     Point capacity for chipper cells.  See :ref:`filters.chipper`.
+
+If neither the ``--length`` nor ``--capacity`` arguments are specified, an
+implcit argument of capacity with a value of 100000 is added.
+
+The output argument is a template.  If the output argument is, for example,
+``file.ext``, the output files created are ``file_#.ext`` where # is a number
+starting at one and incrementing for each file created.
+
+If the output argument ends in a path separator, it is assumed to be a
+directory and the input argument is appended to create the output template.
+The ``split`` command never creates directories.  Directories must pre-exist.
+
+Example 1:
+^^^^^^^^^^^
+
+::
+
+    $ pdal split --capacity 100000 infile.laz outfile.bpf
+
+This command takes the points from the input file ``infile.laz`` and creates
+output files ``outfile_1.bpf``, ``outfile_2.bpf``, ... where each output file
+contains no more than 100000 points.
+
+
+.. _tindex_command:
+
+tindex command
+------------------------------------------------------------------------------
+
+The ``tindex`` command is used to create a `GDAL`_-style tile index for
+PDAL-readable point cloud types (see `gdaltindex`_).
+
+.. note::
+
+    The ``tindex`` command is only available when PDAL is linked with `GDAL`_.
+
+The ``tindex`` command has two modes.  The first mode creates a spatial index
+file for a set of point cloud files.  The second mode creates a point cloud
+file that is the result of merging the points from files referred to in a
+spatial index file that meet some criteria (usually a geographic region filter).
+
+tindex Creation Mode
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+    $ pdal tindex <tindex> <filespec>
+
+This command will index the files referred to by ``filespec`` and place the
+result in ``tindex``.  The ``tindex`` is a vector file or database that can be
+handled by `OGR <http://www.gdal.org/ogr_formats.html>`_. The type of the index
+file can be specified by specifying the OGR code for the format using the
+``--driver`` option.  If no driver is specified, the format defaults to "ESRI
+Shapefile".
+
+In vector file-speak, each file specified by ``filespec`` is stored as a feature
+in a layer in the index file. The ``filespec`` is a `glob pattern
+<http://man7.org/linux/man-pages/man7/glob.7.html>'_.  and normally needs to be
+quoted to prevent shell expansion of wildcard characters.
+
+::
+
+    --tindex                   Non-positional option for specifying the index file name.
+    --filespec                 Non-positional option for specifying pattern of files to
+                               be indexed.
+    --lyr_name                 Name of layer in which to store the features. Defaults to
+                               the base name of the first file indexed.
+    --tindex_name              Name of the field in the feature in which to store the
+                               indexed file name. ["location"]
+    --driver                   OGR driver name. ["ESRI Shapefile"]
+    --t_srs                    Spatial reference system in which to store index vector
+                               data. ["EPSG:4326"]
+    --a_srs                    Spatial reference assumed to be the reference for the
+                               source data.  If the source data includes spatial reference
+                               information, this value is IGNORED. ["EPSG:4326"]
+    --write_absolute_path arg  Write absolute rather than relative file paths [false]
+
+tindex Merge Mode
+^^^^^^^^^^^^^^^^^^^^^
+
+::
+
+    $ pdal tindex --merge <tindex> <filespec>
+
+This command will read the index file ``tindex`` and merge the points in the
+files listed index file that pass any filter that might be specified, writing
+the output to the point cloud file specified in ``filespec``.  The type of the
+output file is determined automatically from the filename extension.
+
+::
+
+    --tindex    Non-positional option for specifying the index filename.
+    --filespec  Non-positional option for specifying the merge output filename.
+    --polygon   Well-known text representation of geometric filter.  Only
+                points inside the object will be written to the output file.
+    --bounds    Bounding box for clipping points.  Only points inside the box
+                will be written to the output file.
+                --bounds "([xmin,xmax],[ymin,ymax],[zmin,zmax])"
+    --t_srs     Spatial reference system in which the output data should be
+                represented. ["EPSG:4326"]
+
+Example 1:
+^^^^^^^^^^^
+
+Find all LAS files via ``find``, send that file list via STDIN to
+``pdal tindex``, and write a SQLite tile index file with a layer named ``pdal``:
+
+::
+
+    $ find las/ -iname "*.las" | pdal tindex index.sqlite -f "SQLite" \
+        --stdin --lyr_name pdal
+
+Example 2:
+^^^^^^^^^^^
+
+Glob a list of LAS files, output the SRS for the index entries to EPSG:4326, and
+write out an `SQLite`_ file.
+
+::
+
+    $ pdal tindex index.sqlite "*.las" -f "SQLite" --lyr_name "pdal" \
+        --t_srs "EPSG:4326"
+
+
+.. _translate_command:
+
+translate command
+------------------------------------------------------------------------------
+
+The ``translate`` command can be used for simple conversion of files based on
+their file extensions. It can also be used for constructing pipelines directly
+from the command-line.
+
+::
+
+    $ pdal translate <input> <output>
+
+::
+
+    -i [ --input ] arg    input file name
+    -o [ --output ] arg   output file name
+    -p [ --pipeline ] arg pipeline output
+    -r [ --reader ] arg   reader type
+    -f [ --filter ] arg   filter type
+    -w [ --writer ] arg   writer type
+
+The ``--input`` and ``--output`` file names are required options.
+
+The ``--pipeline`` file name is optional. If given, the pipeline constructed
+from the command-line arguments will be written to disk for reuse in the
+:ref:`pipeline_command`.
+
+The ``--filter`` flag is optional. It is used to specify the driver used to
+filter the data. ``--filter`` accepts multiple arguments if provided, thus
+constructing a multi-stage filtering operation.
+
+If no ``--reader`` or ``--writer`` type are given, PDAL will attempt to infer
+the correct drivers from the input and output file name extensions respectively.
+
+Example 1:
+^^^^^^^^^^^
+
+The ``translate`` command can be augmented by specifying full-path options at
+the command-line invocation. For example, the following invocation will
+translate ``1.2-with-color.las`` to ``output.laz`` while doing the following:
+
+* Setting the creation day of year to 42
+* Setting the creation year to 2014
+* Setting the LAS point format to 1
+* Cropping the file with the given polygon
+
+::
+
+    $ pdal translate \
+        --writers.las.creation_doy="42" \
+        --writers.las.creation_year="2014" \
+        --writers.las.format="1" \
+        --filters.crop.polygon="POLYGON ((636889.412951239268295 851528.512293258565478 422.7001953125,636899.14233423944097 851475.000686757150106 422.4697265625,636899.14233423944097 851475.000686757150106 422.4697265625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636976.977398241520859 851513.918218758190051 424.150390625,636976.977398241520859 851513 [...]
+        ./test/data/1.2-with-color.las \
+        output.laz
+
+Example 2:
+^^^^^^^^^^^
+
+Given these tools, we can now construct a custom pipeline on-the-fly. The
+example below uses a simple LAS reader and writer, but stages a PCL-based
+voxel grid filter, followed by the PCL-based ground filter. We can even set
+stage-specific parameters as shown.
+
+::
+
+    $ pdal translate input.las output.las \
+        --filter filters.pclblock filters.ground \
+        --filters.pclblock.json="{\"pipeline\":{\"filters\":[{\"name\":\"VoxelGrid\"}]}}" \
+        --filters.ground.approximate=true --filters.ground.extract=true
+
+
+.. _view_command:
+
+view command
+------------------------------------------------------------------------------
+
+The ``view`` command can be used to visualize a point cloud using the
+PCLVisualizer. The command takes a single argument, the input file name.
+
+.. note::
+
+    The ``view`` command is only available when PDAL is linked with PCL.
+
+::
+
+    $ pdal view <input>
+
+Once the data has been loaded into the viewer, press h or H to display the
+help.
+
+::
+
+    | Help:
+    -------
+              p, P   : switch to a point-based representation
+              w, W   : switch to a wireframe-based representation (where available)
+              s, S   : switch to a surface-based representation (where available)
+
+              j, J   : take a .PNG snapshot of the current window view
+              c, C   : display current camera/window parameters
+              f, F   : fly to point mode
+
+              e, E   : exit the interactor
+              q, Q   : stop and call VTK's TerminateApp
+
+               +/-   : increment/decrement overall point size
+         +/- [+ ALT] : zoom in/out
+
+              g, G   : display scale grid (on/off)
+              u, U   : display lookup table (on/off)
+
+        o, O         : switch between perspective/parallel projection (default = perspective)
+        r, R [+ ALT] : reset camera [to viewpoint = {0, 0, 0} -> center_{x, y, z}]
+        CTRL + s, S  : save camera parameters
+        CTRL + r, R  : restore camera parameters
+
+        ALT + s, S   : turn stereo mode on/off
+        ALT + f, F   : switch between maximized window mode and original size
+
+              l, L           : list all available geometric and color handlers for the current actor map
+        ALT + 0..9 [+ CTRL]  : switch between different geometric handlers (where available)
+              0..9 [+ CTRL]  : switch between different color handlers (where available)
+
+        SHIFT + left click   : select a point (start with -use_point_picking)
+
+              x, X   : toggle rubber band selection mode for left mouse button
+
+
+.. _`SQLite`: http://www.sqlite.org
+.. _`gdaltindex`: http://www.gdal.org/gdaltindex.html
+.. _`GDAL`: http://www.gdal.org
+.. _`ProgressiveMorphologicalFilter`: http://pointclouds.org/documentation/tutorials/progressive_morphological_filtering.php#progressive-morphological-filtering.
diff --git a/doc/community.rst b/doc/community.rst
new file mode 100644
index 0000000..e4a96db
--- /dev/null
+++ b/doc/community.rst
@@ -0,0 +1,27 @@
+.. _community:
+
+******************************************************************************
+Community
+******************************************************************************
+
+Mailing Lists
+..............................................................................
+
+* pdal - http://lists.osgeo.org/mailman/listinfo/pdal
+* pdal-commits - http://lists.osgeo.org/mailman/listinfo/pdal-commits
+
+
+Bugs
+..............................................................................
+
+Visit http://github.com/PDAL/PDAL to file bugs or fork the PDAL respository and
+start hacking on it yourself.
+
+IRC
+..............................................................................
+
+Find the PDAL developers on IRC on #pdal at `Freenode`_.
+
+
+
+.. _`Freenode`: http://freenode.net
diff --git a/doc/compilation/dependencies.rst b/doc/compilation/dependencies.rst
new file mode 100644
index 0000000..e722e4e
--- /dev/null
+++ b/doc/compilation/dependencies.rst
@@ -0,0 +1,211 @@
+.. _dependencies:
+
+==============================================================================
+Dependencies
+==============================================================================
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 11/15/2013
+
+PDAL explicitly stands on the shoulders of giants that have come before it.
+Specifically, PDAL depends on a number of libraries to do its work including:
+
+.. contents::
+    :depth: 1
+    :local:
+
+.. note::
+
+    :ref:`stage_index` contains explicit usages of the various
+    stage types available to PDAL.
+
+Boost
+------------------------------------------------------------------------------
+
+PDAL attempts to constrain its code-love for Boost and not always try to use the
+latest and the greatest, but the instinct is hard to control. Specifically, PDAL
+takes advantage of a number of late-version features in boost::accumulators for
+statistics filtering, and as of this writing, it should be assumed that the
+minimum version required for Boost is 1.55. Other versions less than that may
+work with some minor modifications or ``#ifdef``'ing, but the PDAL developers
+currently track rather late versions of Boost.
+
+
+Boost Packages Used
+..............................................................................
+
+An unexhaustive list includes:
+
+* Accumulators
+* Filesystem
+* Program Options
+* Property Tree
+* IO Streams
+* System
+* String Algorithms
+* Endian
+* UUID
+
+
+GDAL
+------------------------------------------------------------------------------
+
+PDAL uses GDAL for spatial reference system description manipulation, and image
+reading supporting for the NITF driver, and :ref:`writers.oci` support. In conjunction with GeoTIFF_,
+GDAL is used to convert GeoTIFF keys and OGC WKT SRS description strings into
+formats required by specific drivers. While PDAL can be built without GDAL
+support, if you want SRS manipulation and description ability, you must have
+GDAL (and GeoTIFF_) linked in at compile time.
+
+Obtain `GDAL`_ via whatever method is convenient.  Linux platforms such as
+`Debian`_ have `DebianGIS`_, Mac OS X has the `KyngChaos`_ software frameworks,
+and Windows has the `OSGeo4W`_ platform.
+
+* GDAL 1.9+ is required.
+
+.. warning::
+    If you are using `OSGeo4W`_ as your provider of GDAL, you must make sure
+    to use the GDAL 1.9 package.
+
+GeoTIFF
+------------------------------------------------------------------------------
+
+PDAL uses GeoTIFF in conjunction with GDAL for GeoTIFF key support in the
+LAS driver.  Obtain `GeoTIFF`_ from the same place you got `GDAL`_.
+
+* libgeotiff 1.3.0+ is required
+
+.. note::
+    `GDAL` surreptitiously embeds a copy of `GeoTIFF`_ in its library build
+    but there is no way for you to know this.  In addition to embedding
+    libgeotiff, it also strips away the library symbols that PDAL needs,
+    meaning that PDAL can't simply link against `GDAL`_.  If you are
+    building both of these libraries yourself, make sure you build GDAL
+    using the "External libgeotiff" option, which will prevent the
+    insanity that can ensue on some platforms.  `OSGeo4W`_ users, including
+    those using that platform to link and build PDAL themselves, do
+    not need to worry about this issue.
+
+Proj.4
+------------------------------------------------------------------------------
+
+Proj.4_ is the projection engine that PDAL uses for the
+:ref:`filters.reprojection` filter. It is used by GDAL. 
+
+.. note::
+
+    Proj.4 4.9.0+ is required if you need vertical datum 
+    transformation support. Otherwise, older versions should be 
+    sufficient.
+
+libxml2
+------------------------------------------------------------------------------
+
+libxml2_ is used to serialize PDAL dimension descriptions into XML for the 
+database drivers such as :ref:`writers.oci`, :ref:`readers.sqlite`, or 
+:ref:`readers.pgpointcloud`
+
+.. note::
+
+    libxml 2.7.0+ is required. Older versions may also work but are untested.
+
+`OCI`_
+------------------------------------------------------------------------------
+
+Obtain the `Oracle Instant Client`_ and install in a location on your system.
+Be sure to install both the "Basic" and the "SDK" modules. Set your
+``ORACLE_HOME`` environment variable system- or user-wide to point to this
+location so the CMake configuration can find your install. OCI is used by
+both :ref:`writers.oci` and :ref:`readers.oci` for Oracle
+Point Cloud read/write support.
+
+.. warning::
+    `OCI`_'s libraries are inconsistently named.  You may need to create
+    symbolic links for some library names in order for the `CMake`_ to find
+    them::
+
+        cd $ORACLE_HOME
+        ln -s libocci.so.11.1 libocci.so
+        ln -s libclntsh.so.11.1 libclntsh.so
+        ln -s libociei.so.11.1 libociei.so
+
+* OCI 10g+ is required.
+
+.. note::
+    MSVC should only require the oci.lib and oci.dll library and dlls.
+
+Points2Grid
+------------------------------------------------------------------------------
+
+`Points2Grid`_ is a library with a simple `CMake`-based build system that
+provides simple, out-of-process interpolation of large point sets using
+Boost_. It can be obtained via github.com at https://github.com/CRREL/points2grid
+It is used by :ref:`writers.p2g` to output point cloud interpolation.
+
+Hexer
+------------------------------------------------------------------------------
+
+`Hexer`_ is a library with a simple `CMake`-based build system that
+provides simple hexagon gridding of large point sets for density surface
+generation and boundary approximation. It can be obtained via github.com at
+https://github.com/hobu/hexer It is used by :ref:`filters.hexbin` to output
+density surfaces and boundary approximations.
+
+Nitro
+------------------------------------------------------------------------------
+
+Nitro is a library that provides `NITF`_ support for PDAL to write LAS-in-NITF
+files for :ref:`writers.nitf`. PDAL can only use a fork of Nitro located at http://github.com/hobu/nitro instead
+of the mainline tree for two reasons:
+
+1) The fork contains a simple `CMake`-based build system
+2) The fork properly dynamically links on Windows to maintain LGPL compliance.
+
+It is expected that the fork will go away once these items are incorporated into
+the main source tree.
+
+
+LASzip
+------------------------------------------------------------------------------
+
+`LASzip`_ is a library with a simple `CMake`-based build system that
+provides periodic compression of `ASPRS LAS`_ data. It is used by the
+:ref:`writers.las` and :ref:`readers.las` to provide
+compressed LAS support.
+
+
+PCL
+------------------------------------------------------------------------------
+
+The `Point Cloud Library (PCL)`_ is used by the :ref:`ground_command`,
+:ref:`pcl_command`, :ref:`writers.pcd`, :ref:`readers.pcd`, and
+:ref:`filters.pclblock` to provide support for various PCL-related operations.
+
+At the moment, PCL must be built from 1.7.2+. We do our best to keep this
+up-to-date with PCL master.
+
+.. _`ASPRS LAS`: http://www.asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+.. _`LASzip`: http://laszip.org
+.. _`NITF`: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
+.. _`Nitro`: http://nitro-nitf.sourceforge.net/wikka.php?wakka=HomePage
+
+.. _`Oracle Instant Client`: http://www.oracle.com/technology/tech/oci/instantclient/index.html
+.. _`OCI`: http://www.oracle.com/technology/tech/oci/index.html
+.. _`Oracle Point Cloud`: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+.. _`DebianGIS`: http://wiki.debian.org/DebianGis
+.. _`Debian`: http://www.debian.org
+.. _`KyngChaos`: http://www.kyngchaos.com/software/unixport
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
+
+.. _Boost: http://www.boost.org
+.. _GDAL: http://www.gdal.org
+.. _Proj.4: http://trac.osgeo.org/proj
+.. _GeoTIFF: http://trac.osgeo.org/geotiff
+.. _libxml2: http://xmlsoft.org
+.. _CMake: http://www.cmake.org
+.. _`libpq`: http://www.postgresql.org/docs/9.3/static/libpq.html
+
+.. _`Points2Grid`: https://github.com/CRREL/points2grid
+.. _`Point Cloud Library (PCL)`: http://pointclouds.org
+
diff --git a/doc/compilation/index.rst b/doc/compilation/index.rst
new file mode 100644
index 0000000..18f0543
--- /dev/null
+++ b/doc/compilation/index.rst
@@ -0,0 +1,17 @@
+.. _building:
+
+******************************************************************************
+Installation
+******************************************************************************
+
+This section describes how to build and install PDAL under Windows, Linux, and Mac.
+
+Contents:
+
+.. toctree::
+   :maxdepth: 1
+   
+   unix
+   windows
+   dependencies
+   
\ No newline at end of file
diff --git a/doc/compilation/media/OSGeo4WInstallAdvanced.png b/doc/compilation/media/OSGeo4WInstallAdvanced.png
new file mode 100644
index 0000000..5878bbd
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallAdvanced.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallFromInternet.png b/doc/compilation/media/OSGeo4WInstallFromInternet.png
new file mode 100644
index 0000000..b5b2309
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallFromInternet.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallGDALDev.png b/doc/compilation/media/OSGeo4WInstallGDALDev.png
new file mode 100644
index 0000000..920384c
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallGDALDev.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallIConv.png b/doc/compilation/media/OSGeo4WInstallIConv.png
new file mode 100644
index 0000000..f886b7a
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallIConv.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallLASZip.png b/doc/compilation/media/OSGeo4WInstallLASZip.png
new file mode 100644
index 0000000..ea941a3
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallLASZip.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallLibXML2.png b/doc/compilation/media/OSGeo4WInstallLibXML2.png
new file mode 100644
index 0000000..5fcb8a5
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallLibXML2.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallOCI.png b/doc/compilation/media/OSGeo4WInstallOCI.png
new file mode 100644
index 0000000..35a8d69
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallOCI.png differ
diff --git a/doc/compilation/media/OSGeo4WInstallRootDirectory.png b/doc/compilation/media/OSGeo4WInstallRootDirectory.png
new file mode 100644
index 0000000..c54d5d2
Binary files /dev/null and b/doc/compilation/media/OSGeo4WInstallRootDirectory.png differ
diff --git a/doc/compilation/media/ccmake-osx-start.png b/doc/compilation/media/ccmake-osx-start.png
new file mode 100644
index 0000000..6b399ac
Binary files /dev/null and b/doc/compilation/media/ccmake-osx-start.png differ
diff --git a/doc/compilation/media/cmake-gui-osx-configured.png b/doc/compilation/media/cmake-gui-osx-configured.png
new file mode 100644
index 0000000..f6a8f51
Binary files /dev/null and b/doc/compilation/media/cmake-gui-osx-configured.png differ
diff --git a/doc/compilation/media/cmake-gui-osx-start.png b/doc/compilation/media/cmake-gui-osx-start.png
new file mode 100644
index 0000000..2690b80
Binary files /dev/null and b/doc/compilation/media/cmake-gui-osx-start.png differ
diff --git a/doc/compilation/media/xcode-lasinfo-arguments.png b/doc/compilation/media/xcode-lasinfo-arguments.png
new file mode 100644
index 0000000..87f8a93
Binary files /dev/null and b/doc/compilation/media/xcode-lasinfo-arguments.png differ
diff --git a/doc/compilation/media/xcode-set-default-executable.png b/doc/compilation/media/xcode-set-default-executable.png
new file mode 100644
index 0000000..a123ce2
Binary files /dev/null and b/doc/compilation/media/xcode-set-default-executable.png differ
diff --git a/doc/compilation/media/xcode-start.png b/doc/compilation/media/xcode-start.png
new file mode 100644
index 0000000..5e4dbe0
Binary files /dev/null and b/doc/compilation/media/xcode-start.png differ
diff --git a/doc/compilation/unix.rst b/doc/compilation/unix.rst
new file mode 100644
index 0000000..0d2bc79
--- /dev/null
+++ b/doc/compilation/unix.rst
@@ -0,0 +1,309 @@
+.. _building_unix:
+
+******************************************************************************
+Unix Compilation
+******************************************************************************
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 11/16/2013
+
+`CMake`_ 2.8.6+ is the prescribed tool for building from source as well as
+running unit tests. `CMake`_ is a cross-platform build system that provides a
+number of benefits, and its usage ensures a single, up-to-date build system
+for all PDAL-supported operating systems and compiler platforms.
+
+Like a combination of autoconf/autotools, except that it actually works on
+Windows (and works without eye-stabbing pain in general), `CMake`_ is somewhat
+of a meta-building tool. It can be used to generate MSVC project files, GNU
+Makefiles, NMake files for MSVC, XCode projects on Mac OS X, and Eclipse
+projects (as well as many others).  This functionality allows the PDAL project 
+to avoid maintaining these build options by hand and target a single configuration
+and build platform.
+
+This tutorial will describe how to build PDAL using CMake on a 
+Unix platform.  PDAL is known to compile on Linux 2.6's of various flavors and 
+OSX Snow Leopard and Lion with XCode 4.2.
+
+:ref:`dependencies` contains more information about specific library version
+requirements and notes about building or acquiring them.
+
+Using "Unix Makefiles" on Linux
+..............................................................................
+
+Get the source code
+------------------------------------------------------------------------------
+
+See :ref:`source` for how to obtain the latest development version or visit
+:ref:`download` to get the latest released version.
+
+Prepare a build directory
+------------------------------------------------------------------------------
+
+CMake allows you to generate different builders for a project, and in this
+example, we are going to generate a "Unix Makefiles" builder
+for PDAL on Mac OS X.
+
+::
+    
+    $ cd PDAL
+    $ mkdir makefiles
+    $ cd makefiles
+
+Configure base library
+------------------------------------------------------------------------------
+
+Configure the basic core library for the "Unix Makefiles" target:
+
+::
+
+    $ cmake -G "Unix Makefiles" ../
+    -- The C compiler identification is GNU
+    -- The CXX compiler identification is GNU
+    -- Checking whether C compiler has -isysroot
+    -- Checking whether C compiler has -isysroot - yes
+    -- Check for working C compiler: /usr/bin/gcc
+    -- Check for working C compiler: /usr/bin/gcc -- works
+    -- Detecting C compiler ABI info
+    -- Detecting C compiler ABI info - done
+    -- Checking whether CXX compiler has -isysroot
+    -- Checking whether CXX compiler has -isysroot - yes
+    -- Check for working CXX compiler: /usr/bin/c++
+    -- Check for working CXX compiler: /usr/bin/c++ -- works
+    -- Detecting CXX compiler ABI info
+    -- Detecting CXX compiler ABI info - done
+    -- Enable PDAL utilities to build - done
+    -- Configuring done
+    -- Generating done
+    -- Build files have been written to: /Users/hobu/dev/git/PDAL-cmake/makefiles
+
+
+.. note::
+
+    The ``hobu-config.sh`` shell script contains a number of common 
+    settings that I use to configure my `Homebrew`-based Macintosh 
+    system.
+
+.. _`Homebrew`: http://brew.sh/
+ 
+Issue the `make` command
+------------------------------------------------------------------------------
+
+This will build a base build of the library, with no extra libraries being
+configured.
+
+
+.. _make_install:
+
+Run ``make install`` and test your installation with a :ref:`pdal_test` command
+-------------------------------------------------------------------------------
+
+``make install`` will install the :ref:`utilities <apps>` in the location
+that was specified for 'CMAKE_INSTALL_PREFIX'.  Once installed, ensure that 
+you can run `pdal info`.
+
+
+.. _configure_optional_libraries:
+
+Configure your :ref:`Optional Libraries <dependencies>`.
+------------------------------------------------------------------------------
+
+By checking the "on" button for each, CMake may find your installations of
+these libraries, but in case it does not, set the following variables,
+substituting accordingly, to values that match your system layout.
+
+.. csv-table::
+
+    "`GDAL`_","GDAL_CONFIG", "/usr/local/bin/gdal-config"
+    "","GDAL_INCLUDE_DIR", "/usr/local/include"
+    "","GDAL_LIBRARY", "/usr/local/lib/libgdal.so"
+    "`GeoTIFF`_","GEOTIFF_INCLUDE_DIR","/usr/local/include"
+    "","GEOTIFF_LIBRARY","/usr/local/lib/libgeotiff.so"
+    "`OCI`_","ORACLE_INCLUDE_DIR","/home/oracle/sdk/include"
+    "","ORACLE_NNZ_LIBRARY","/home/oracle/libnnz10.so"
+    "","ORACLE_OCCI_LIBRARY","/home/oracle/libocci.so"
+    "","ORACLE_OCIEI_LIBRARY","/home/oracle/libociei.so"
+    "","ORACLE_OCI_LIBRARY","/home/oracle/libclntsh.so"
+
+.. _GDAL: http://www.gdal.org
+.. _Proj.4: http://trac.osgeo.org/proj
+.. _GeoTIFF: http://trac.osgeo.org/geotiff
+.. _libxml2: http://xmlsoft.org
+.. _`OCI`: http://www.oracle.com/technology/tech/oci/index.html
+.. _`Oracle Instant Client`: http://www.oracle.com/technology/tech/oci/instantclient/index.html
+.. _`Oracle Point Cloud`: http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+.. _`DebianGIS`: http://wiki.debian.org/DebianGis
+.. _`Debian`: http://www.debian.org
+.. _`KyngChaos`: http://www.kyngchaos.com/software/unixport
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/  
+
+
+CCMake and cmake-gui
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+.. warning::
+    
+    The following was just swiped from the libLAS compilation document 
+    and it has not been updated for PDAL. The basics should be the same, however. 
+    Please ask on the :ref:`mailing list<community>` if you run into any issues.
+    
+While `CMake`_ can be run from the command-line, and this is the preferred
+way for many individuals, it can be much easier to run CMake from a GUI.
+Now that we have a basic library building, we will use CMake's GUIs to
+help us configure the rest of the optional components of the library. Run
+``ccmake ../`` for the `Curses`_ interface or ``cmake-gui ../`` for a GUI
+version.
+
+  
+.. figure:: media/ccmake-osx-start.png
+    :alt: Running CCMake in OS X
+
+    Running the `Curses`_ `CMake`_ interface.  This interface is available to 
+    all unix-like operating systems. 
+    
+.. note::
+    If your arrow keys are not working with in CCMake, use CTRL-N and 
+    CTRL-P to move back and forth between the options.
+
+.. figure:: media/cmake-gui-osx-start.png
+    :alt: Running cmake-gui in OS X
+
+    Running the cmake-gui `CMake`_ interface.  This interface is available 
+    on Linux, Windows, and Mac OS X.
+
+Build and install 
+------------------------------------------------------------------------------
+
+Once you have configured your additional libraries, you can install the 
+software.  The main pieces that will be installed are:
+
+* PDAL headers (typically in a location ./include/pdal/...)
+* PDAL C++ (PDAL.a or PDAL.so) library
+* PDAL C (PDAL_c.a or PDAL_c.so) library
+* :ref:`Utility <apps>` programs
+
+::
+
+    make install
+
+Using "XCode" on OS X
+..............................................................................
+
+
+Get the source code
+------------------------------------------------------------------------------
+
+See :ref:`source` for how to obtain the latest development version or visit
+:ref:`download` to get the latest released version.
+
+Prepare a build directory
+------------------------------------------------------------------------------
+
+CMake allows you to generate different builders for a project, and in this
+example, we are going to generate an "Xcode" builder for PDAL on Mac OS X.
+Additionally, we're going to use an alternative compiler -- `LLVM`_ -- which 
+under certain situations can produce much faster code on Mac OS X.
+
+::
+
+    $ export CC=/usr/bin/llvm-gcc
+    $ export CXX=/usr/bin/llvm-g++
+    $ cd PDAL
+    $ mkdir xcode
+    $ cd xcode/
+
+Configure base library
+------------------------------------------------------------------------------
+
+Configure the basic core library for the Xcode build:
+
+::
+
+    $ cmake -G "Xcode" ..
+    -- The C compiler identification is GNU
+    -- The CXX compiler identification is GNU
+    -- Checking whether C compiler has -isysroot
+    -- Checking whether C compiler has -isysroot - yes
+    -- Check for working C compiler: /usr/bin/llvm-gcc
+    -- Check for working C compiler: /usr/bin/llvm-gcc -- works
+    -- Detecting C compiler ABI info
+    -- Detecting C compiler ABI info - done
+    -- Checking whether CXX compiler has -isysroot
+    -- Checking whether CXX compiler has -isysroot - yes
+    -- Check for working CXX compiler: /usr/bin/llvm-g++
+    -- Check for working CXX compiler: /usr/bin/llvm-g++ -- works
+    -- Detecting CXX compiler ABI info
+    -- Detecting CXX compiler ABI info - done
+    -- Enable PDAL utilities to build - done
+    -- Enable PDAL unit tests to build - done
+    -- Configuring done
+    -- Generating done
+    -- Build files have been written to: /Users/hobu/hg/PDAL-cmake/xcode
+
+
+Alternatively, if you have `KyngChaos`_ frameworks for `GDAL`_ and
+`GeoTIFF`_ installed, you can provide locations for those as part of your
+``cmake`` invocation:
+
+::
+
+    $ cmake -G "Xcode" \
+      -D GDAL_CONFIG=/Library/Frameworks/GDAL.framework/Programs/gdal-config \
+      -D GEOTIFF_INCLUDE_DIR=/Library/Frameworks/UnixImageIO.framework/unix/include \
+      -D GEOTIFF_LIBRARY=/Library/Frameworks/UnixImageIO.framework/unix/lib/libgeotiff.dylib \
+      ..
+
+    
+:: 
+    
+    $ open PDAL.xcodeproj/
+
+.. figure:: media/xcode-start.png
+    :alt: Building PDAL using the XCode project
+
+Set default command for XCode
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set the default executable for the project to be ``lasinfo`` by opening the 
+"Executables" tree, choosing "lasinfo," and clicking the bubble next to 
+the "Executable name" in the right-hand panel.  
+
+.. figure:: media/xcode-set-default-executable.png
+    :alt: Setting the default executable
+
+Set arguments for :ref:`pdal_test`
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Set the arguments for :ref:`pdal_test` so it can be run from within XCode. We
+use the ${PROJECT_DIR} environment variable to be able to tell pdal_test the
+location of our test file. This is similar to the :ref:`same command
+<make_install>` above in the "Unix Makefiles" section.
+
+.. figure:: media/xcode-lasinfo-arguments.png
+    :alt: Setting the arguments for lasinfo
+
+
+
+Configure :ref:`Optional Libraries <dependencies>`
+------------------------------------------------------------------------------
+
+As :ref:`before <configure_optional_libraries>`, use ``ccmake ../`` or ``cmake-gui ../`` to 
+configure your :ref:`dependencies`.
+
+
+.. figure:: media/cmake-gui-osx-configured.png
+    :alt: Configuring optional libraries with CMake GUI
+    
+  
+.. _`CMake`: http://www.cmake.org/
+.. _`CTest`: http://cmake.org/cmake/help/ctest-2-8-docs.html
+.. _`CMake 2.8.0+`: http://www.cmake.org/cmake/help/cmake-2-8-docs.html
+.. _`CDash`: http://www.cdash.org/
+.. _`continuous integration`: http://en.wikipedia.org/wiki/Continuous_integration
+.. _`PDAL CDash`: http://my.cdash.org/index.php?project=PDAL
+.. _`Curses`: http://en.wikipedia.org/wiki/Curses_%28programming_library%29
+.. _`Autoconf`: http://www.gnu.org/software/autoconf/
+.. _`LLVM`: http://llvm.org/
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
+.. _`Boost`: http://www.boost.org/
+
diff --git a/doc/compilation/windows.rst b/doc/compilation/windows.rst
new file mode 100644
index 0000000..5d5da4a
--- /dev/null
+++ b/doc/compilation/windows.rst
@@ -0,0 +1,259 @@
+.. _building_windows:
+
+==============================================================================
+Building Under Windows
+==============================================================================
+
+:Author: Michael Rosen
+:Contact: unknown at lizardtech dot com
+:Date: 3/19/2012
+
+Most Users
+------------------------------------------------------------------------------
+
+If you just want to build PDAL so you can
+
+a. use the utilities or
+b. investigate PDAL integration
+c. test / fix / extend the library and
+
+you are OK with doing all this with a 32 bit compiler, check the
+`Prerequisites`_ and follow the `Basic Build Steps`_ below.
+
+
+Advanced Users
+------------------------------------------------------------------------------
+
+If your needs go beyond this, then check the `Prerequisites`_ and use the
+`Advanced Build Steps`_ below as a guide to configuring the library.
+
+
+Prerequisites
+------------------------------------------------------------------------------
+
+- Ensure you have git. We used version 1.7.3.1.msysgit.0 from
+  http://code.google.com/p/msysgit
+- Ensure you have a Visual Studio 2010 environment setup. We used VStudio 2010
+  Premium.
+- Ensure you have CMake_. We used version 2.8.4 from http://www.cmake.org
+
+The steps below assume that these tools are available from your command line.
+For Git and CMake, that's just adding them to your %PATH%. For VStudio, you
+need to run `vsvars32.bat` ("Microsoft Visual Studio
+10.0\\Common7\\Tools\\vsvars32.bat")
+
+.. _CMake: http://www.cmake.org
+
+Basic Build Steps
+------------------------------------------------------------------------------
+
+Most users can use this procedure to build PDAL on Windows. We satisfy all
+dependencies using OSGeo4W and use the Boost subset that is included with the
+library.
+
+0. If you plan to use LAZ support (compressed LAS), get the LASzip source code
+and build it (http://www.laszip.org). Add the directory with laszip.dll to
+your %PATH% (or copy the laszip.* files into the bin directory of PDAL
+itself). Make sure it appears in your PATH before OSGeo4W (as per step 4
+below).
+
+While LASzip is included in the OSGeo4W distribution below (see step 1), the
+version there is compiled with Visual Studio 2008 and we have some suspicion
+that it is incompatible with the version of PDAL you are about to build with
+Visual Studio 2010. Building the LASzip library should be no more complicated
+than::
+
+    set G="Visual Studio 10"
+    set BUILD_TYPE=Debug
+    cmake -G %G% ^
+        -DCMAKE_BUILD_TYPE=%BUILD_TYPE% ^
+        -DCMAKE_VERBOSE_MAKEFILE=OFF ^
+        .
+
+1. Install OSGeo4W (http://download.osgeo.org/osgeo4w/osgeo4w-setup.exe) using
+the "Advanced Install" option and include the following: gdal-dev, laszip,
+libxml2, iconv.
+
+   .. figure::  media/OSGeo4WInstallAdvanced.png
+
+  Install from Internet
+   .. figure::  media/OSGeo4WInstallFromInternet.png
+  Leave the "Root Directory" for the installation unchanged.
+   .. figure::  media/OSGeo4WInstallRootDirectory.png
+  You can leave the "Select Local Package Directory" and "Internet Connection Type" at the defaults. Under the "libs" tree, select "gdal-dev" for installation. (You should probably use the latest version, e.g. 1.8pre-6.)
+   .. figure::  media/OSGeo4WInstallGDALDev.png
+  Select "laszip" (this is not required currently -- see step 0 above).
+   .. figure::  media/OSGeo4WInstallLASZip.png
+  Select "libxml2".
+   .. figure::  media/OSGeo4WInstallLibXML2.png
+  Select "iconv".
+   .. figure::  media/OSGeo4WInstallIconv.png
+  Select "oci".
+   .. figure::  media/OSGeo4WInstallOCI.png
+
+  There are some other required dependencies (e.g. libtiff, libgeotiff) but
+  they are installed by default.
+
+  Select Next to continue on to install the packages.
+
+2.  Get the source code for PDAL:
+
+  ::
+
+     c:\dev> git clone https://github.com/PDAL/PDAL.git
+
+3. From the root of your PDAL tree, run "./cmake/examples/mpg-config.bat". This will create the
+   VStudio solution file and .vcxproj files.
+
+  ::
+
+     c:\dev\PDAL> ./cmake/examples/mpg-config.bat
+
+  .. note::
+
+      The config.bat file is set up to build PDAL in the "officially supported"
+      configuration -- that is, with Oracle, and GDAL, and LASzip, and such. If you
+      followed the previous steps, you should be fine to use this default
+      configuration. You may modify this file if you need to (such as to use a local
+      copy of GDAL or to use NMake instead of Visual Studio); see the `Advanced Build Steps`_
+      below for more instructions.
+
+4.  Verify your system environment variables are set properly:
+
+  - PATH should include %OSGeo4W%\bin
+  - GDAL_DATA should be set to %OSGeo4W%\share\epsg_csv
+  - PROJ_LIB should be set to %OSGeo4W%\share\proj
+
+5.  Start Visual Studio and open PDAL.sln.  Build the solution (F6).
+
+6. Set pdal_test as the startup project and run it (F5). You should see a
+   console window startup, print something like "Running 158 test cases..."
+   (exact number may vary), and then after a short period print something like
+   "\*\*\* No errors detected". If you do get errors, that means either something is
+   broken on the version of PDAL you checked out OR something is wrong with your
+   installation.
+
+7. PYTHON/PLANG NOTE: If you build WITH_PLANG=ON in Debug mode, the system will
+   try to link against "python27d.lib". You need to change .../Python27/include/pyconfig.h
+   as follows:
+
+    - change the line #pragma comment(lib,"python27d.lib") to refer to python27.lib instead
+	- comment out the line "#define Py_DEBUG"
+
+
+
+Advanced Build Steps
+------------------------------------------------------------------------------
+
+Advanced users can use this procedure to customize their PDAL build on
+Windows. This enables the use of custom-built external libraries to satisify
+situations (including x64 support) where using OSGeo4W is inadequate.
+
+1. Acquire and stage the required dependent libraries. PDAL depends on the
+   following external libraries. You'll need to get them and build them (or
+   perhaps, download prebuilt binary packages).
+
+  - Boost (get version 1.4.8 or later from http://boost.org) [ required ]
+  - GDAL (get version 1.6 or later from http://gdal.org) [ optional ]
+  - LASZip (get version 1.0.1 or later from http://laszip.org) [ optional ]
+  - libxml2 (http://libxml2.org) [ optional ]
+  - iconv (http://www.gnu.org/software/libiconv/) [ optional (required by libxml2) ]
+  - oci (optional, http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html)
+  - libtiff (optional)
+  - libgeotiff (optional)
+
+  One option for all dependencies except Boost is OSGeo4W (free, win32
+  installer, no x64 -- see "Basic Build Steps"_ above).
+
+  Boost Build Notes
+
+  Options for Boost include might include BoostPro (free win32 installer, no
+  x64) or the internal "BCP'ed" extract in PDAL. We say "might" because PDAL
+  requires Boost version 1.48 or later and at this writing that's not supported
+  by BoostPro. If you need to build Boost from source, the following notes will
+  be helpful.
+
+  Boost libraries include an "ABI" description as part of the name.
+  For example
+  ::
+
+
+      "libboost_filesystem-vc100-mt-gd-1_48.lib"
+                                    ^^  This is the <abi-tag>
+
+  <abi-tag> - This is a string of one or more characters. For us, the characters of interest are s, g, d.
+
+
+      s - indicates that the library is statically linked to the C++ Standard Library and Runtime Library.
+
+      g - indicates that the debug versions of the standard and runtime support libraries are linked against. On a typical Windows installation you will get a debug version of the runtime libraries to link against, but this need not be the case on Unix boxes.
+
+      d - indicates all debug symbols are available in the library, no inlining and optimization has been done while building the code.
+
+  This is particularly important on Windows. Unlike other platforms, CRT
+  configuration (debug vs release and statically linked vs shared dll), needs to
+  match you PDAL configuration.
+
+  After you get the Boost archive (source) from http://www.boost.org from the
+  root of the boost distribution run "bootstrap.bat" and then "b2" with the
+  appropriate options.
+
+  Our default release configuration uses /MD, so you want the release shared CRT, like "libboost_filesystem-vc100-mt-1_48.lib"::
+
+     c:\utils\boost_1_48_0>.\bootstrap.bat
+     c:\utils\boost_1_48_0>.\b2 variant=release link=static threading=multi runtime-link=shared stage
+
+  Our default debug configuration uses /MDd, so you want the debug shared CRT, like "libboost_filesystem-vc100-mt-gd-1_48.lib"::
+
+     c:\utils\boost_1_48_0>.\bootstrap.bat
+     c:\utils\boost_1_48_0>.\b2 variant=debug link=static threading=multi runtime-link=shared stage
+
+  Finally, we've seen problems with b2.exe if the path includes some paths that are quoted ("c:\\Program Files (x86)\\doxygen\\bin").  You can unquote or remove them from the %PATH% while building Boost.
+
+2. Having staged the above libs, you need to specify where they are by editing
+   the appropriate lines in the "config.bat" file. Each dependency has a short
+   section of the config.bat file. Check these are specified correctly. For
+   example
+
+  ::
+
+     :: LASZIP
+     set LASZIP_ENABLED=ON
+     set LASZIP_LIBRARY=%DEV_DIR%\laszip\bin\Debug\laszip.lib
+     set LASZIP_INCLUDE_DIR=%DEV_DIR%\laszip\include
+
+3. While you're still in config.bat, configure the "Generator" for CMake.
+
+  ::
+
+     :: Pick your Generator.  NMake will pick up architecture (x32, x64) from your environment
+     rem set GENERATOR="NMake Makefiles"
+     rem set GENERATOR="Visual Studio 10 Win64"
+     set GENERATOR="Visual Studio 10"
+
+     set BUILD_TYPE=Release
+     rem set BUILD_TYPE=Debug
+
+4. Run "config.bat" in the PDAL directory. This will create the VStudio solution file and .vcxproj files.
+
+  ::
+
+     c:\dev\PDAL> config.bat
+
+5. Start Visual Studio and open PDAL.sln (or if you picked "NMake Makefiles", run NMake).
+
+Testing
+------------------------------------------------------------------------------
+
+Set pdal_test as the default/startup application in Visual Studio
+Run with debug (F5)
+
+Troubleshooting
+------------------------------------------------------------------------------
+
+* Missing liblas.dll - double check that ``C:\OSGeo4W\bin`` is on your system PATH variable
+* libtiff.dll errors - double check that other versions of the lib are not on the path. For example, ArcGIS installs a version of libtiff that is not compatible.
+* "ERROR 4: Unable to open EPSG support file gcs.csv" or GDAL_DATA variable errors - Set GDAL_DATA system variable to ``C:\OSGeo4W\share\gdal``
+* PROJ errors - Set PROJ_LIB system variable to ``C:\OSGeo4W\share\proj``
+* link failures due to _ITERATOR_DEBUG_LEVEL mismatches between (external) boost and PDAL.  Most likely problem is that you are mixing Release and Debug libs (e.g. PDAL is debug but Boost is release).  You can also set _ITERATOR_DEBUG_LEVEL=0 as in Project Pages / Configuration Properties / C,C++ / Preprocessor / Preprocessor Definitions.
+
diff --git a/doc/conf.py b/doc/conf.py
new file mode 100644
index 0000000..85886ef
--- /dev/null
+++ b/doc/conf.py
@@ -0,0 +1,307 @@
+# -*- coding: utf-8 -*-
+#
+# PDAL documentation build configuration file, created by
+# sphinx-quickstart on Tue Mar 15 15:22:19 2011.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os, re
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.insert(0, os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# If your documentation needs a minimal Sphinx version, state it here.
+#needs_sphinx = '1.0'
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['breathe', 'sphinx.ext.autodoc','rst2pdf.pdfbuilder']
+
+# Add any paths that contain templates here, relative to this directory.
+# templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8-sig'
+
+# The master toctree document.
+master_doc = 'docs'
+
+# General information about the project.
+project = u'PDAL'
+copyright = u'2015, Howard Butler, Michael Gerlek and others'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+
+def read_version(filename):
+    #
+    # set(PDAL_VERSION_STRING 0.9.8 CACHE STRING "PDAL version")
+    data = open(filename).readlines()
+
+    token = 'PDAL_VERSION_STRING'
+
+    import string
+    punct = string.punctuation
+    punct = string.punctuation.replace('.', '')
+    version = 'None'
+    for line in data:
+        if str(token) in line:
+            import re
+            parts = re.split('[\sd\.d\.d*]', line)
+            parts = [a.translate(None, punct) for a in parts]
+            ints = [ int (i) for i in (parts[1], parts[2], parts[3])]
+            version = '%d.%d.%d' % (ints[0], ints[1], ints[2])
+            break
+    return '%s'%(version)
+
+release = read_version('../CMakeLists.txt')
+
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+exclude_patterns = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  See the documentation for
+# a list of builtin themes.
+html_theme = 'bootstrap'
+# html_style = "sphinx.css"
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+html_theme_options = {
+    'analytics_code': 'UA-00000000-1',
+    'github_user': 'PDAL',
+    'github_repo': 'PDAL',
+    'twitter_username': 'pointcloudpipe',
+    'home_url': 'http://pdal.io',
+    'disqus_shortname': 'pdal',
+}
+
+# Add any paths that contain custom themes here, relative to this directory.
+html_theme_path = ['./_themes']
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+html_title = "pdal.io"
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+html_short_title = "Documentation"
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+html_logo = './_static/pdal_logo.png'
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+html_sidebars = {
+    '**': ['localtoc.html', 'relations.html' ],
+"index":["indexsidebar.html",'searchbox.html'],
+"docs":['searchbox.html']
+}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_domain_indices = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
+#html_show_sphinx = True
+
+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
+#html_show_copyright = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# This is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = None
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'PDALdoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+# latex_documents = [
+#   ('index', 'PDAL.tex', u'PDAL Documentation',
+#    u'Howard Butler', 'manual'),
+# ]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# If true, show page references after internal links.
+#latex_show_pagerefs = False
+
+# If true, show URL addresses after external links.
+#latex_show_urls = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_domain_indices = True
+
+
+# -- Options for manual page output --------------------------------------------
+
+# One entry per manual page. List of tuples
+# (source start file, name, description, authors, manual section).
+man_pages = [
+    ('index', 'pdal', u'PDAL Documentation',
+     [u'Howard Butler'], 1)
+]
+
+
+# -- Options for Epub output ---------------------------------------------------
+
+# Bibliographic Dublin Core info.
+epub_title = u'PDAL'
+epub_author = u'Howard Butler'
+epub_publisher = u'Howard Butler'
+epub_copyright = u'2011, Howard Butler'
+
+# The language of the text. It defaults to the language option
+# or en if the language is not set.
+#epub_language = ''
+
+# The scheme of the identifier. Typical schemes are ISBN or URL.
+#epub_scheme = ''
+
+# The unique identifier of the text. This can be a ISBN number
+# or the project homepage.
+#epub_identifier = ''
+
+# A unique identification for the text.
+#epub_uid = ''
+
+# HTML files that should be inserted before the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_pre_files = []
+
+# HTML files shat should be inserted after the pages created by sphinx.
+# The format is a list of tuples containing the path and title.
+#epub_post_files = []
+
+# A list of files that should not be packed into the epub file.
+#epub_exclude_files = []
+
+# The depth of the table of contents in toc.ncx.
+#epub_tocdepth = 3
+
+# Allow duplicate toc entries.
+#epub_tocdup = True
+
+
+breathe_projects = {
+    'api':'doxygen/xml'
+}
+breathe_default_project = 'api'
+breathe_domain_by_extension = {
+        "hpp" : "cpp",
+        "h":"cpp"
+        }
+
+breathe_diagram = {
+    'path': "./doxygen/html",
+    'html-path': '../../../doxygen/html',
+    'project' : 'api',
+    'no-link' : False
+}
+
diff --git a/doc/copyright.rst b/doc/copyright.rst
new file mode 100644
index 0000000..404804c
--- /dev/null
+++ b/doc/copyright.rst
@@ -0,0 +1,7 @@
+.. _license:
+
+******************************************************************************
+License
+******************************************************************************
+
+.. include:: ../LICENSE.txt
\ No newline at end of file
diff --git a/doc/development/conventions.rst b/doc/development/conventions.rst
new file mode 100644
index 0000000..50cc14c
--- /dev/null
+++ b/doc/development/conventions.rst
@@ -0,0 +1,121 @@
+.. _development_conventions:
+
+==================
+Coding Conventions
+==================
+
+To the extent possible and reasonable, we value consistency of source code
+formatting, class and variable naming, and so forth.
+
+This Note lists some such conventions that we would like to follow, where
+it makes sense to do so.
+
+
+Source Formatting
+=================
+
+We use astyle (http://astyle.sourceforge.net) as a tool to reformat C++
+source code files in a consistent fashion.  The file astylerc, at the top
+of the github repo, contains the default settings we use.
+
+Our conventions are:
+
+* LF endings (unix style), not CRLF (windows style)
+
+* spaces, not tabs
+
+* indent to four (4) spaces ("Four shalt be the number thou shalt count, 
+  and the number of the counting shall be four. Three shalt thou not count, 
+  neither count thou five...")
+
+* braces shall be on their own lines, like this::
+
+    if (p)
+    {
+       foo();
+    }
+
+* copyright header on every file 
+
+* two spaces between major units, e.g. function bodies
+
+
+Naming Conventions
+==================
+
+* classes should be names using UpperCamelCase
+
+* functions should be in lowerCamelCase
+
+* member variables should be prefixed with "m\_", followed by the name in
+  lowerCamelCase -- for example, "m_numberOfPoints"
+
+* there should be only one class per file, and the name of the file should 
+  match the class name -- that is, class PointData should live in files
+  PointData.hpp and PointData.cpp
+
+
+Other Conventions
+=================
+
+* the use of getter and setter methods is preferred to exposing member
+  variables
+  
+* Surround all code with "namespace pdal {...}"; where justifiable, you 
+  may introduce a nested namespace.
+  
+* Use exceptions for exceptional events that are not going to be handled 
+  directly within the context of where the event occurs.  Avoid status
+  codes.  See exceptions.hpp for a set of pdal-specific exception types 
+  you may throw.  (See Note on error handling)
+
+* Describe use of "debug" and "verbose" settings.
+
+* Don't put member function bodies in the class declaration in the
+  header file, unless clearly justified for performance reasons.
+  Use the "inline" keyword in these cases(?).
+  
+* Use const.
+
+* Don't put "using" declarations in headers.
+
+* Document all public (and protected) member functions using
+  doxygen markup.
+
+Layout/Organization of Source Tree
+==================================
+
+* public headers in ./include
+    
+* private headers alongside source files in src/
+
+* ...
+
+
+#include Conventions
+====================
+
+* For public headers from the ./include/pdal directory, use angle brackets:
+  #include <pdal/Stage.h>
+
+* For private headers (from somehwere in ./src), use quotes:
+  #include "support.hpp"
+
+* #include lines should be grouped and arranged in this order: C++/std headers,
+  3rd-party headers (e.g. gdal or boost), pdal headers, local headers.  The
+  pdal headers may be further grouped by subdirectory, e.g. drivers/liblas,
+  filters, etc.
+
+* Exception to the above: source files (.cpp) should #include their
+  corresponding .hpp file first.  This assures that the header is including
+  all the files it needs to.
+  
+* Don't #include a file where a simple forward declaration will do.
+  (Note: this only applies to pdal files; don't forward declare from system
+  or 3rd party headers.)
+
+* Don't include a file unless it actually is required to compile the source unit.
+
+* Include guards should spell out the full path, like this:
+  #ifndef INCLUDED_DRIVERS_FAUX_READER_ITERATOR_HPP
+ 
diff --git a/doc/development/docs.rst b/doc/development/docs.rst
new file mode 100644
index 0000000..1bf2ff8
--- /dev/null
+++ b/doc/development/docs.rst
@@ -0,0 +1,41 @@
+.. _development_docs:
+
+====
+Docs
+====
+
+
+Building the Documentation
+==========================
+
+To build the PDAL documentation yourself, you need to install sphinx_, breathe_, and other python dependencies, preferably with PyPI_.
+If you have `pip installed <http://www.pip-installer.org/en/latest/installing.html>`_, install the documentation dependencies with:
+
+.. code-block:: bash
+
+    (sudo) pip install sphinx breathe rst2pdf
+
+If you are installing these packages to a system-wide directory, you may need the **sudo** in front of the **pip**, though it might be better that instead you use `virtual environments`_ instead of installing the packages system-wide.
+
+The PDAL documentation also depends on `doxygen`_, which can be installed from source or from binaries from the `doxygen website <http://www.stack.nl/~dimitri/doxygen/download.html>`_.
+If you are on Max OS X and use `homebrew`_, you can install doxygen with a simple ``brew install doxygen``.
+
+Once you have installed all the doc dependencies, you can then build the documentation itself.
+The :file:`doc/` directory in the PDAL source tree contains a Makefile which can be used to build all documentation.
+For a list of the output formats supported by Sphinx, simply type ``make``.
+For example, to build html documentation:
+
+.. code-block:: bash
+
+    cd doc
+    make doxygen html
+
+The html docs will be placed in :file:`doc/build/html/`.
+The ``make doxygen`` is necessary to re-generate the API documentation from the source code.
+
+.. _sphinx: http://sphinx-doc.org/
+.. _breathe: https://github.com/michaeljones/breathe
+.. _virtual environments: https://pypi.python.org/pypi/virtualenv
+.. _pypi: https://pypi.python.org/pypi
+.. _doxygen: http://www.stack.nl/~dimitri/doxygen/
+.. _homebrew: http://mxcl.github.io/homebrew/
diff --git a/doc/development/errorhandling.rst b/doc/development/errorhandling.rst
new file mode 100644
index 0000000..947f336
--- /dev/null
+++ b/doc/development/errorhandling.rst
@@ -0,0 +1,41 @@
+.. _development_errorhandling:
+
+=========================
+Errors and Error Handling
+=========================
+
+Exceptions
+==========
+
+* throw exceptions, don't use status codes
+
+* use the pdal_error hiearchy (list)
+
+
+PDAL Position on (Non)conformance
+==================================
+
+PDAL proudly and unabashedly supports formal standards/specifications for
+file formats.  We recognize, however, that in some cases files will not
+follow a given standard precisely, due to an unclear spec or simply out of
+carelessness.
+
+When reading files that are not formatted correctly:
+
+* PDAL may try to compensate for the error.  This is typically done when as 
+  a practical matter the market needs support for well-known or pervasive,
+  but nonetheless "broken", upstream implementations.
+
+* PDAL may explicitly reject such files.  This is typically done where we do 
+  not wish to continue to promote or support mistakes that should be fixed 
+  upstream.
+
+PDAL will always write correctly formatted files.  In some cases, however,
+PDAL may choose to offer as an option the ability to break the standard if,
+as a practical matter, doing so would significantly aid the market.  Such an
+option would never be the default behavior, however.
+
+For files that are conformant but which lie, such as the extents in the
+header being wrong, we will generally offer both the ability to propagate 
+the "wrong" information and the ability to helpfully correct it on the fly;
+the latter is generally our default position.
diff --git a/doc/development/goals.rst b/doc/development/goals.rst
new file mode 100644
index 0000000..e89ef61
--- /dev/null
+++ b/doc/development/goals.rst
@@ -0,0 +1,29 @@
+.. _development_goals:
+
+=============
+Project Goals
+=============
+
+1. PDAL is a library which provides APIs for reading, writing, and 
+   processing geospatial point cloud data of various formats.  Additionally, some 
+   command line tools are provided.  As GDAL is to 2D pixels, PDAL is to 
+   multidimensional points.
+    
+2. From a market perspective, PDAL is "version 2" of libLAS.  The actual 
+   code base will be different, however, and the APIs will not be
+   compatible.
+
+3. The PDAL implementation has high performance, yet the API remains 
+   flexible.  We recognize that these two goals will conflict at times and 
+   will weigh the tradeoffs pragmatically.
+  
+4. The architecture of a PDAL-based workflow will be a pipeline of 
+   connected stages, each stage being either a data source (such as a file
+   reader), a filter (such as a point thinner), or data sink (such as a
+   file writer).
+
+5. The PDAL library will be in C++, but will have SWIG bindings for languages
+   like Python and C#. PDAL will support multiple platforms, specifically
+   Windows, Linux, and Mac.
+
+6. PDAL is open source and is released under a BSD license.
diff --git a/doc/development/index.rst b/doc/development/index.rst
new file mode 100644
index 0000000..22575b8
--- /dev/null
+++ b/doc/development/index.rst
@@ -0,0 +1,37 @@
+.. _development_index:
+
+******************************************************************************
+Development 
+******************************************************************************
+
+The design, architecture, and implementation of PDAL is captured in this
+set of Notes.  Each Note focues on a single major topic, such
+as Use Cases, Pipeline Design, or Testing.  These Notes are intended to
+capture design decisions, rationales, and points still to be decided.
+
+Editorial comments, and points yet to be resolved, are noted in the text
+**[like this]**.
+
+The proper spelling of the project name is PDAL, in uppercase.  It is
+pronounced to rhyme with "GDAL".
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+   
+   conventions
+   docs
+   errorhandling
+   goals
+   testing
+   usecases
+  
+ 
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/doc/development/testing.rst b/doc/development/testing.rst
new file mode 100644
index 0000000..d614bab
--- /dev/null
+++ b/doc/development/testing.rst
@@ -0,0 +1,172 @@
+.. _pdal_test:
+
+=======
+Testing
+=======
+
+
+Unit Tests
+==========
+
+A unit test framework is provided, with the goal that all (nontrivial) classes
+will have unit tests.  At the very least, each new class should have a
+corresponding unit test file stubbed in, even if there aren't any tests yet.
+
+Our unit tests also include testing of each of the command line apps and
+(known) plugins.
+
+We use the Google C++ Test Framework.
+
+Unit tests for features that are configuration-dependent, e.g. laszip
+compression, should be put under the same ``#ifdef`` guards as the classes
+being tested.
+
+The Support class, in the ``./test/unit`` directory, provides some functions
+for comparing files, etc, that are useful in writing test cases.
+
+Unit tests should not be long-running. (As of this writing, a full test run
+executes 163 tests in under 10 seconds in Debug mode on mpg's little laptop.
+This is good.)
+
+To run all unit tests, issue the following command from your build directory::
+
+  $ ctest
+
+``make test`` or ``ninja test`` should still work as well.
+
+Depending on the which optional components you've chose to build, your output
+should resemble the following::
+
+  Test project /path/to/pdal/build
+        Start  1: pdal_base_test
+   1/10 Test  #1: pdal_base_test ...................   Passed    3.13 sec
+        Start  2: pdal_io_test
+   2/10 Test  #2: pdal_io_test .....................   Passed    1.19 sec
+        Start  3: pdal_filters_test
+   3/10 Test  #3: pdal_filters_test ................   Passed    6.27 sec
+        Start  4: pdal_plang_test
+   4/10 Test  #4: pdal_plang_test ..................   Passed    1.32 sec
+        Start  5: pc2pc_test
+   5/10 Test  #5: pc2pc_test .......................   Passed    5.62 sec
+        Start  6: xml_schema_test
+   6/10 Test  #6: xml_schema_test ..................   Passed    0.02 sec
+        Start  7: hexbintest
+   7/10 Test  #7: hexbintest .......................   Passed    1.15 sec
+        Start  8: icetest
+   8/10 Test  #8: icetest ..........................   Passed    1.12 sec
+        Start  9: nitftest
+   9/10 Test  #9: nitftest .........................   Passed    1.28 sec
+        Start 10: pcltest
+  10/10 Test #10: pcltest ..........................   Passed    1.47 sec
+
+  100% tests passed, 0 tests failed out of 10
+
+  Total Test time (real) =  22.61 sec
+
+For a more verbose output, use the ``-V`` flag. Or, to run an individual test
+suite, use ``-R <suite name>``. For example::
+
+  $ ctest -V -R pdal_io_test
+
+Should produce output similar to::
+
+  UpdateCTestConfiguration  from :/path/to/pdal/build/DartConfiguration.tcl
+  UpdateCTestConfiguration  from :/path/to/pdal/build/DartConfiguration.tcl
+  Test project /path/to/pdal/build
+  Constructing a list of tests
+  Done constructing a list of tests
+  Checking test dependency graph...
+  Checking test dependency graph end
+  test 2
+      Start 2: pdal_io_test
+
+  2: Test command: /path/to/pdal/build/bin/pdal_io_test
+  2: Test timeout computed to be: 9.99988e+06
+  2: Running main() from gtest_main.cc
+  2: [==========] Running 28 tests from 8 test cases.
+  2: [----------] Global test environment set-up.
+  2: [----------] 7 tests from BPFTest
+  2: [ RUN      ] BPFTest.test_point_major
+  2: [       OK ] BPFTest.test_point_major (8 ms)
+  2: [ RUN      ] BPFTest.test_dim_major
+  2: [       OK ] BPFTest.test_dim_major (2 ms)
+  2: [ RUN      ] BPFTest.test_byte_major
+  2: [       OK ] BPFTest.test_byte_major (3 ms)
+  2: [ RUN      ] BPFTest.test_point_major_zlib
+  2: [       OK ] BPFTest.test_point_major_zlib (4 ms)
+  2: [ RUN      ] BPFTest.test_dim_major_zlib
+  2: [       OK ] BPFTest.test_dim_major_zlib (3 ms)
+  2: [ RUN      ] BPFTest.test_byte_major_zlib
+  2: [       OK ] BPFTest.test_byte_major_zlib (4 ms)
+  2: [ RUN      ] BPFTest.inspect
+  2: [       OK ] BPFTest.inspect (0 ms)
+  2: [----------] 7 tests from BPFTest (24 ms total)
+  2:
+         ...
+  2:
+  2: [----------] Global test environment tear-down
+  2: [==========] 28 tests from 8 test cases ran. (1195 ms total)
+  2: [  PASSED  ] 28 tests.
+  1/1 Test #2: pdal_io_test .....................   Passed    1.24 sec
+
+  The following tests passed:
+          pdal_io_test
+
+  100% tests passed, 0 tests failed out of 1
+
+  Total Test time (real) =   1.24 sec
+
+Alternately, one can run individual unit tests directly::
+
+  $ bin/pdal_io_test
+
+Again, the output should resemble the following::
+
+  Running main() from gtest_main.cc
+  [==========] Running 28 tests from 8 test cases.
+  [----------] Global test environment set-up.
+  [----------] 7 tests from BPFTest
+  [ RUN      ] BPFTest.test_point_major
+  [       OK ] BPFTest.test_point_major (5 ms)
+  [ RUN      ] BPFTest.test_dim_major
+  [       OK ] BPFTest.test_dim_major (2 ms)
+  [ RUN      ] BPFTest.test_byte_major
+  [       OK ] BPFTest.test_byte_major (3 ms)
+  [ RUN      ] BPFTest.test_point_major_zlib
+  [       OK ] BPFTest.test_point_major_zlib (4 ms)
+  [ RUN      ] BPFTest.test_dim_major_zlib
+  [       OK ] BPFTest.test_dim_major_zlib (3 ms)
+  [ RUN      ] BPFTest.test_byte_major_zlib
+  [       OK ] BPFTest.test_byte_major_zlib (3 ms)
+  [ RUN      ] BPFTest.inspect
+  [       OK ] BPFTest.inspect (0 ms)
+  [----------] 7 tests from BPFTest (21 ms total)
+
+      ...
+
+  [----------] Global test environment tear-down
+  [==========] 28 tests from 8 test cases ran. (1180 ms total)
+  [  PASSED  ] 28 tests.
+
+This invocation allows us to alter Google Test's default behavior. For more on
+the available flags type::
+
+  $ bin/<test_name> --help
+
+Key among these flags are the ability to list tests (``--gtest_list_tests``)
+and to run only select tests (``--gtest_filter``).
+
+Test Data
+=========
+
+Use the directory ``./test/data`` to store files used for unit tests.  A
+vfunction is provided in the Support class for referencing that directory in a
+configuration-independent manner.
+
+Temporary output files from unit tests should go into the ``./test/temp``
+directory.  A Support function is provided for referencing this directory as
+well.
+
+Unit tests should always clean up and remove any files that they create (except
+perhaps in case of a failed test, in which case leaving the output around might
+be helpful for debugging).
diff --git a/doc/development/usecases.rst b/doc/development/usecases.rst
new file mode 100644
index 0000000..bad513d
--- /dev/null
+++ b/doc/development/usecases.rst
@@ -0,0 +1,99 @@
+.. _development_usecases:
+
+================================
+Use Cases
+================================
+
+This document lists some use cases that we would like PDAL to be able to
+satisfy.  We are speaking here about PDAL at the API level, and not the 
+command line apps that come with it (although in many cases the apps will
+directly address these use cases).
+
+Note we have the cases explicitly numbered, so we can refer back to them 
+from elsewhere.
+
+Many of these cases these use cases are composable (such as 1a and 3a).
+
+This list is intended to be representative of workflows we want to target, 
+but is by no means intended to be an exhaustive list.
+
+
+The Use Cases
+=============
+
+1. straight format conversion
+
+   a. convert an ASCII file to LAS
+
+   b. compress LAS to lossless LAZ
+   
+2. mosaicking and demosaicking
+
+   a. user has a set of N tiles and wants to merge them into 1 file
+
+   b. user has 1 large file and wants to chop up into N files, based on
+      a given bbox size or a given target file size (or point count)
+   
+3. basic filtering/processing operations
+
+   a. crop a file to a given spatial extent
+
+   b. remove points with a given classification
+
+   c. decimate the file (discard 9 of every 10 points)
+
+   d. ...
+   
+4. info and metadata
+
+   a. display (or dump to XML) the properties of the point cloud (extents,
+      number of points, etc)
+
+   b. display/dump the spatial reference system of the file
+
+   c. display/dump any metadata in the file, such as creation date, weather
+      conditions, etc
+
+   d. collect and display statistics about the file, such as the elevation
+      distribution, point density, etc
+
+5. projection
+
+   a. assign an SRS to a file that does not have one (or overwrite the
+      existing one)
+
+   b. reproject the points in a file to a new SRS
+
+6. indexing and caching
+
+   a. construct a spatial index for a point cloud, such that points within a
+      relatively small given region can quickly be accessed
+
+   b. merge (mosaic) two files that are both indexed
+
+   c. given a file, allow for repeated access to a point during a single run
+      without additional I/O
+
+7. DEM construction, rasterization, colorization
+
+   a. given an XYZ point cloud, produce a regular XY grid of the Z elevation
+      points
+
+   b. similar to 7a, but colorize each point based on a given color ramp and
+      the elevation height Z
+
+8. 3D visualization
+
+   a. basic, static display of a point cloud
+
+   b. same as (a), but with colorization of Z, simple filtering, etc
+
+   c. use indexing and caching (6a and 6c) to provide useful interactive 
+      behaviour
+
+   d. given a DEM and a raster, display the raster draped over the surface
+
+9. Fixup, Cleanup
+
+   a. given a file with an incorrect header (such as incorrect extents),
+      create a file with the header corrected by otherwise identical
diff --git a/doc/docs.rst b/doc/docs.rst
new file mode 100644
index 0000000..7dd4e25
--- /dev/null
+++ b/doc/docs.rst
@@ -0,0 +1,34 @@
+.. _docs:
+
+******************************************************************************
+PDAL Documentation
+******************************************************************************
+
+
+Contents:
+
+.. toctree::
+   :maxdepth: 2
+
+   download
+   compilation/index
+   commandline/index
+   apps
+   stages/index
+   pipeline
+   vagranttutorial
+   community
+   faq
+   development/index
+   tutorial/index
+   api/index
+   metadata
+   copyright
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
+
diff --git a/doc/download.rst b/doc/download.rst
new file mode 100644
index 0000000..8f89849
--- /dev/null
+++ b/doc/download.rst
@@ -0,0 +1,47 @@
+.. _download:
+
+******************************************************************************
+Download
+******************************************************************************
+
+
+Current Release(s)
+------------------------------------------------------------------------------
+
+
+
+Past Releases
+------------------------------------------------------------------------------
+
+
+.. _source:
+
+Development Source
+..............................................................................
+
+The main repository for PDAL is located on github at https://github.com/PDAL/PDAL
+
+You can obtain a copy of the active source code by issuing the following command::
+
+    git clone git at github.com:PDAL/PDAL.git pdal
+    
+
+
+Binaries
+------------------------------------------------------------------------------
+
+A pre-1.0.0 release of PDAL is available via `OSGeo4W`_, however it is only 
+64-bit at this time. 
+
+RPMs
+................................................................................
+
+RPMs for PDAL are available at http://pdal.s3-website-us-east-1.amazonaws.com/rpms/
+    
+.. _`OSGeo4W`: http://trac.osgeo.org/osgeo4w/
+
+
+.. _`DebianGIS`: http://wiki.debian.org/DebianGis
+
+
+.. _`LASzip`: http://laszip.org
diff --git a/doc/faq.rst b/doc/faq.rst
new file mode 100644
index 0000000..f4a660c
--- /dev/null
+++ b/doc/faq.rst
@@ -0,0 +1,38 @@
+.. _faq:
+
+******************************************************************************
+FAQ
+******************************************************************************
+
+* How do you pronounce PDAL?
+
+  The proper spelling of the project name is PDAL, in uppercase. It is
+  pronounced to rhyme with "GDAL".
+
+* What is PDAL's relationship to PCL?
+
+  PDAL is PCL's data translation cousin. PDAL is focused on providing a
+  declarative pipeline syntax for orchestrating translation operations.
+  PDAL can also use PCL through the :ref:`filters.pclblock` mechanism.
+
+* What is PDAL's relationship to libLAS?
+
+  The idea behind libLAS was limited to LIDAR data and basic
+  manipulation. libLAS was also trying to be partially compatible
+  with LASlib and LAStools. PDAL, on the other hand, aims to be
+  a ultimate library and a set of tools for manipulating and processing
+  point clouds and is easily extensible by its users.
+
+* Are there any command line tools in PDAL similar to LAStools?
+
+  Yes. The ``pdal`` command provides a wide range of features which go
+  far beyond basic LIDAR data processing. Additionally, PDAL is licensed
+  under an open source license (this applies to the whole library and
+  all command line tools).
+
+* Is there any compatibility with libLAS's LAS Utility Applications or LAStools?
+
+  No. The the command line interface was developed from scratch with
+  focus on usability and readability. You will find that the ``pdal``
+  command has several well-organized subcommands such as ``info``
+  or ``translate`` (see :ref:`apps`).
diff --git a/doc/index.rst b/doc/index.rst
new file mode 100644
index 0000000..c8c5e4d
--- /dev/null
+++ b/doc/index.rst
@@ -0,0 +1,45 @@
+.. _home:
+
+******************************************************************************
+PDAL - Point Data Abstraction Library
+******************************************************************************
+
+PDAL is a `BSD licensed`_ library for translating and manipulating `point cloud
+data`_ of various formats.  PDAL can be used to read, write and translate
+point cloud data in many formats.  Support is included for input files of
+LAS, LAZ, SBET, BPF, QFIT and others.  PDAL can also read from and write to
+databases that support point cloud storage, including Oracle, Postgres
+and SQLite.
+
+PDAL should not be confused with `PCL`_ (Point Cloud Library).  PCL is a
+library specifically designed
+to provide algorithmic analysis and modification of point clouds.  PDAL
+provides a limited interface to the facilities of PCL, but does not in
+general attempt to duplicate its capabilites.  See :ref:`filters.pclblock`
+for more background
+
+
+Developers and Sponsorship
+------------------------------------------------------------------------------
+
+PDAL is developed by `Howard Butler`_, `Michael Gerlek`_, `Andrew Bell`_,
+`Brad Chambers`_ and others.
+
+PDAL's development is in coordination with efforts by the
+`U.S. Army Cold Regions Research and Engineering Laboratory`_.
+
+.. _`Aerial Services, Inc`: http://www.asi-gis.com/
+.. _`Point Cloud Library (PCL)`: http://pointclouds.org
+.. _`GDAL`: http://www.gdal.org
+.. _`BSD licensed`: http://www.opensource.org/licenses/bsd-license.php
+.. _`point cloud data`: http://en.wikipedia.org/wiki/Point_cloud
+.. _`LIDAR`: http://en.wikipedia.org/wiki/LIDAR
+.. _`U.S. Army Cold Regions Research and Engineering Laboratory` : http://www.crrel.usace.army.mil/
+.. _`PDL`: http://pointclouds.org
+.. _`Howard Butler`: http://hobu.co
+.. _`Andrew Bell`: http://hobu.co
+.. _`Michael Gerlek`: http://www.radiantblue.com
+.. _`Brad Chambers`: http://www.radiantblue.com
+
+
+
diff --git a/doc/make.bat b/doc/make.bat
new file mode 100644
index 0000000..27ae0d0
--- /dev/null
+++ b/doc/make.bat
@@ -0,0 +1,179 @@
+ at ECHO OFF
+
+REM Command file for Sphinx documentation
+
+if "%SPHINXBUILD%" == "" (
+	set SPHINXBUILD=sphinx-build
+)
+set BUILDDIR=build
+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
+if NOT "%PAPER%" == "" (
+	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
+)
+
+if "%1" == "" goto help
+
+if "%1" == "help" (
+	:help
+	echo.Please use `make ^<target^>` where ^<target^> is one of
+	echo.  html       to make standalone HTML files
+	echo.  dirhtml    to make HTML files named index.html in directories
+	echo.  singlehtml to make a single large HTML file
+	echo.  pickle     to make pickle files
+	echo.  json       to make JSON files
+	echo.  htmlhelp   to make HTML files and a HTML help project
+	echo.  qthelp     to make HTML files and a qthelp project
+	echo.  devhelp    to make HTML files and a Devhelp project
+	echo.  epub       to make an epub
+	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
+	echo.  text       to make text files
+	echo.  pdf        to make PDF files
+	echo.  man        to make manual pages
+	echo.  changes    to make an overview over all changed/added/deprecated items
+	echo.  linkcheck  to check all external links for integrity
+	echo.  doctest    to run all doctests embedded in the documentation if enabled
+	goto end
+)
+
+if "%1" == "clean" (
+	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
+	del /q /s %BUILDDIR%\*
+	goto end
+)
+
+if "%1" == "html" (
+	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
+	goto end
+)
+
+if "%1" == "dirhtml" (
+	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
+	goto end
+)
+
+if "%1" == "singlehtml" (
+	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
+	goto end
+)
+
+if "%1" == "pickle" (
+	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the pickle files.
+	goto end
+)
+
+if "%1" == "json" (
+	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can process the JSON files.
+	goto end
+)
+
+if "%1" == "htmlhelp" (
+	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run HTML Help Workshop with the ^
+.hhp project file in %BUILDDIR%/htmlhelp.
+	goto end
+)
+
+if "%1" == "qthelp" (
+	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; now you can run "qcollectiongenerator" with the ^
+.qhcp project file in %BUILDDIR%/qthelp, like this:
+	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\PDAL.qhcp
+	echo.To view the help file:
+	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\PDAL.ghc
+	goto end
+)
+
+if "%1" == "devhelp" (
+	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished.
+	goto end
+)
+
+if "%1" == "epub" (
+	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The epub file is in %BUILDDIR%/epub.
+	goto end
+)
+
+if "%1" == "latex" (
+	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
+	goto end
+)
+
+if "%1" == "text" (
+	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/text.
+	goto end
+)
+
+if "%1" == "pdf" (
+	%SPHINXBUILD% -b pdf %ALLSPHINXOPTS% %BUILDDIR%/pdf
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The text files are in %BUILDDIR%/pdf.
+	goto end
+)
+
+if "%1" == "man" (
+	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Build finished. The manual pages are in %BUILDDIR%/man.
+	goto end
+)
+
+if "%1" == "changes" (
+	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.The overview file is in %BUILDDIR%/changes.
+	goto end
+)
+
+if "%1" == "linkcheck" (
+	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Link check complete; look for any errors in the above output ^
+or in %BUILDDIR%/linkcheck/output.txt.
+	goto end
+)
+
+if "%1" == "doctest" (
+	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
+	if errorlevel 1 exit /b 1
+	echo.
+	echo.Testing of doctests in the sources finished, look at the ^
+results in %BUILDDIR%/doctest/output.txt.
+	goto end
+)
+
+:end
diff --git a/doc/metadata.rst b/doc/metadata.rst
new file mode 100644
index 0000000..e362ff5
--- /dev/null
+++ b/doc/metadata.rst
@@ -0,0 +1,231 @@
+.. _metadata:
+
+******************************************************************************
+Metadata
+******************************************************************************
+
+:Author: Howard Butler
+:Contact: hobu.inc at gmail dot com
+:Date: 5/30/2012
+
+Metadata is an important component of any data processing story. PDAL attempts
+to allow users to operate with metadata in a relatively free-form way, with
+its main Metadata utility, :cpp:class:`pdal::Metadata`, being a lightly
+wrapped `boost::property_tree`_.
+
+The basic structure of a :cpp:class:`pdal::Metadata` instance is the following
+tree structure:
+
+.. code-block:: javascript
+
+    {
+        "type": "blank",
+        "value": "",
+        "name": "name",
+        "metadata": {}
+    }
+
+.. note::
+
+    Metadata instances can contain other Metadata instances by adding them
+    with the :cpp:func:`pdal::Metadata::addMetadata` method.  They will be
+    added to the `metadata` sub-tree of the internal property_tree.
+
+Metadata Types
+------------------------------------------------------------------------------
+
+:cpp:class:`pdal::Metadata` instances are essentially a specially-organized
+boost::property_tree, and as such, require that any classes that are added
+to them be copy-constructable and have an ostream<< operator for them.  While
+these constraints mean they are all serializable to strings,
+:cpp:class:`pdal::Metadata` also keeps an explicit type variable, `type` for
+each instance. This property allows us to say something extra about the
+Metadata entry, and allows them to go in and out of :cpp:class:`pdal::Stage` and
+:cpp:class:`pdal::PointView` with type fidelity.
+
+The metadata `type` variable roughly maps to the `XSD type names`_.  The following
+types are valid for current PDAL versions, though more may be added.
+
+.. csv-table:: PDAL :cpp:class:`pdal::Metadata` types
+
+    double, float, integer
+    nonNegativeInteger, boolean, string
+    base64Binary, uuid, bounds
+    spatialreference, blank
+
+.. _`XSD type names`:  http://infohost.nmt.edu/tcc/help/pubs/rnc/xsd.html
+
+.. warning::
+
+    Explicitly-sized types are not supported. Assume that `integer` or
+    `nonNegativeInteger` map to the typical 4-byte signed and unsigned types.
+    You might be required to adjust the value based on an explicit
+    interpretation and cast it into these larger types.
+
+`JSON`_ representation
+------------------------------------------------------------------------------
+
+A more interesting metadata tree might come from the
+:cpp:class:`pdal::drivers::las::Reader`.  Interesting things to note include
+
+
+
+.. _`JSON`: http://www.json.org/
+
+.. code-block:: javascript
+
+    {
+        "name": "readers.las",
+        "type": "blank",
+        "value": "",
+        "metadata":
+        {
+            "compressed":
+            {
+                "name": "compressed",
+                "description": "true if this LAS file is compressed",
+                "type": "boolean",
+                "value": "false"
+            },
+            "dataformatid":
+            {
+                "name": "dataformatid",
+                "description": "The Point Format ID as specified in the LAS specification",
+                "type": "nonNegativeInteger",
+                "value": "3"
+            },
+            ...
+            "project_id":
+            {
+                "name": "project_id",
+                "description": "Project ID (GUID data): The four fields that comprise a complete Globally Unique Identifier (GUID) are now reserved for use as a Project Identifier (Project ID). The field remains optional. The time of assignment of the Project ID is at the discretion of processing software. The Project ID should be the same for all files that are associated with a unique project. By assigning a Project ID and using a File Source ID (defined above) every file within a proj [...]
+                "type": "uuid",
+                "value": "00000000-0000-0000-0000-000000000000"
+            },
+            "system_id":
+            {
+                "name": "system_id",
+                "description": "",
+                "type": "string",
+                "value": "HOBU-SYSTEMID"
+            },
+            ...
+            "vlr_0":
+            {
+                "name": "vlr_0",
+                "description": "A Polygon WKT entry",
+                "type": "base64Binary",
+                "value": "UE9MWUdPTigoNiAxNSwgMTAgMTAsIDIwIDEwLCAyNSAxNSwgMjUgMzUsIDE5IDQwLCAxMSA0MCwgNiAyNSwgNiAxNSkpCg==",
+                "metadata":
+                {
+                    "reserved":
+                    {
+                        "name": "reserved",
+                        "description": "Two bytes of padded, unused space. Some softwares expect the values of these bytes to be 0xAABB as specified in the 1.0 version of the LAS specification",
+                        "type": "nonNegativeInteger",
+                        "value": "43707"
+                    },
+                    "user_id":
+                    {
+                        "name": "user_id",
+                        "description": "The User ID field is ASCII character data that identifies the user which created the variable length record. It is possible to have many Variable Length Records from different sources with different User IDs. If the character data is less than 16 characters, the remaining data must be null. The User ID must be registered with the LAS specification managing body. The management of these User IDs ensures that no two individuals accidentally use the s [...]
+                        "type": "string",
+                        "value": "hobu"
+                    },
+                    "record_id":
+                    {
+                        "name": "record_id",
+                        "description": "The Record ID is dependent upon the User ID. There can be 0 to 65535 Record IDs for every User ID. The LAS specification manages its own Record IDs (User IDs owned by the specification), otherwise Record IDs will be managed by the owner of the given User ID. Thus each User ID is allowed to assign 0 to 65535 Record IDs in any manner they desire. Publicizing the meaning of a given Record ID is left to the owner of the given User ID. Unknown User ID\/ [...]
+                        "type": "nonNegativeInteger",
+                        "value": "1234"
+                    },
+                    "description":
+                    {
+                        "name": "description",
+                        "description": "",
+                        "type": "string",
+                        "value": "A Polygon WKT entry"
+                    }
+                }
+            },
+            ...
+        }
+    }
+
+.. _metadataxml:
+
+:ref:`Pipeline` XML representation
+------------------------------------------------------------------------------
+
+The :ref:`Pipeline` representation of the :cpp:class:`pdal::Metadata` is a
+little bit flatter...
+
+
+::
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Reader type="readers.las">
+      <Option name="debug">false</Option>
+      <Option name="filename">test/data/interesting.las</Option>
+      <Option name="verbose">0</Option>
+      <Metadata name="writers.las" type="blank">
+        <Metadata name="compressed" type="boolean">false</Metadata>
+        <Metadata name="dataformatid" type="nonNegativeInteger">3</Metadata>
+        <Metadata name="version_major" type="nonNegativeInteger">1</Metadata>
+        <Metadata name="version_minor" type="nonNegativeInteger">2</Metadata>
+        <Metadata name="filesource_id" type="nonNegativeInteger">0</Metadata>
+        <Metadata name="reserved" type="nonNegativeInteger">0</Metadata>
+        <Metadata name="project_id" type="uuid">00000000-0000-0000-0000-000000000000</Metadata>
+        <Metadata name="system_id" type="string">HOBU-SYSTEMID</Metadata>
+        <Metadata name="software_id" type="string">HOBU-GENERATING</Metadata>
+        <Metadata name="creation_doy" type="nonNegativeInteger">145</Metadata>
+        <Metadata name="creation_year" type="nonNegativeInteger">2012</Metadata>
+        <Metadata name="header_size" type="nonNegativeInteger">227</Metadata>
+        <Metadata name="dataoffset" type="nonNegativeInteger">1488</Metadata>
+        <Metadata name="scale_x" type="double">0.01</Metadata>
+        <Metadata name="scale_y" type="double">0.01</Metadata>
+        <Metadata name="scale_z" type="double">0.01</Metadata>
+        <Metadata name="offset_x" type="double">-0</Metadata>
+        <Metadata name="offset_y" type="double">-0</Metadata>
+        <Metadata name="offset_z" type="double">-0</Metadata>
+        <Metadata name="minx" type="double">635619.85</Metadata>
+        <Metadata name="miny" type="double">848899.7000000001</Metadata>
+        <Metadata name="minz" type="double">406.59</Metadata>
+        <Metadata name="maxx" type="double">638982.55</Metadata>
+        <Metadata name="maxy" type="double">853535.4300000001</Metadata>
+        <Metadata name="maxz" type="double">586.38</Metadata>
+        <Metadata name="count" type="nonNegativeInteger">1065</Metadata>
+        <Metadata name="vlr_0" type="base64Binary">UE9MWUdPTigoNiAxNSwgMTAgMTAsIDIwIDEwLCAyNSAxNSwgMjUgMzUsIDE5IDQwLCAxMSA0MCwgNiAyNSwgNiAxNSkpCg==
+            <Metadata name="reserved" type="nonNegativeInteger">43707</Metadata>
+            <Metadata name="user_id" type="string">hobu</Metadata>
+            <Metadata name="record_id" type="nonNegativeInteger">1234</Metadata>
+            <Metadata name="description" type="string">A Polygon WKT entry</Metadata>
+        </Metadata>
+        <Metadata name="vlr_1" type="base64Binary">AQABAAAAFQAABAAAAQABAAEEAAABAAEAAgSxhywAAAAACAAAAQD/fwEIsYdqACwAAggAAAEA/38GCAAAAQCOIwgIAAABAP9/CQiwhwEABgALCLCHAQAHAA0IsIcBAAgAAAwAAAEA/38CDAAAAQD/fwMMAAABAAgABAwAAAEAKiMGDLCHAQACAAcMsIcBAAMADAywhwEAAQANDLCHAQAAAA4MsIcBAAQADwywhwEABQAAAAAAAAAAAA==
+            <Metadata name="reserved" type="nonNegativeInteger">43707</Metadata>
+            <Metadata name="user_id" type="string">LASF_Projection</Metadata>
+            <Metadata name="record_id" type="nonNegativeInteger">34735</Metadata>
+            <Metadata name="description" type="string">GeoTIFF GeoKeyDirectoryTag</Metadata>
+        </Metadata>
+        <Metadata name="vlr_2" type="base64Binary">AAAAAADgREAAAAAAACBewAAAAAAAgEVAAAAAAADARkD//////2kYQQAAAAAAAAAAAAAAQKZUWEGo+euUHaRyQAAAAAAAAAAA
+            <Metadata name="reserved" type="nonNegativeInteger">43707</Metadata>
+            <Metadata name="user_id" type="string">LASF_Projection</Metadata>
+            <Metadata name="record_id" type="nonNegativeInteger">34736</Metadata>
+            <Metadata name="description" type="string">GeoTIFF GeoDoubleParamsTag</Metadata>
+        </Metadata>
+        <Metadata name="vlr_3" type="base64Binary">TkFEXzE5ODNfT3JlZ29uX1N0YXRld2lkZV9MYW1iZXJ0X0ZlZXRfSW50bHxHQ1MgTmFtZSA9IEdDU19Ob3J0aF9BbWVyaWNhbl8xOTgzfERhdHVtID0gRF9Ob3J0aF9BbWVyaWNhbl8xOTgzfEVsbGlwc29pZCA9IEdSU18xOTgwfFByaW1lbSA9IEdyZWVud2ljaHx8AA==
+            <Metadata name="reserved" type="nonNegativeInteger">43707</Metadata>
+            <Metadata name="user_id" type="string">LASF_Projection</Metadata>
+            <Metadata name="record_id" type="nonNegativeInteger">34737</Metadata>
+            <Metadata name="description" type="string">GeoTIFF GeoAsciiParamsTag</Metadata>
+        </Metadata>
+        <Metadata name="vlr_4" type="base64Binary">UFJPSkNTWyJOQURfMTk4M19PcmVnb25fU3RhdGV3aWRlX0xhbWJlcnRfRmVldF9JbnRsIixHRU9HQ1NbIkdDU19Ob3J0aF9BbWVyaWNhbl8xOTgzIixEQVRVTVsiRF9Ob3J0aF9BbWVyaWNhbl8xOTgzIixTUEhFUk9JRFsiR1JTXzE5ODAiLDYzNzgxMzcuMCwyOTguMjU3MjIyMTAxXV0sUFJJTUVNWyJHcmVlbndpY2giLDAuMF0sVU5JVFsiRGVncmVlIiwwLjAxNzQ1MzI5MjUxOTk0MzI5NV1dLFBST0pFQ1RJT05bIkxhbWJlcnRfQ29uZm9ybWFsX0NvbmljXzJTUCJdLFBBUkFNRVRFUlsiRmFsc2VfRWFzdGluZyIsMTMxMjMzNS45NTgwMDUyNDldLFBBUkFNRVRFUlsiRmFsc2VfTm9yd [...]
+            <Metadata name="reserved" type="nonNegativeInteger">43707</Metadata>
+            <Metadata name="user_id" type="string">liblas</Metadata>
+            <Metadata name="record_id" type="nonNegativeInteger">2112</Metadata>
+            <Metadata name="description" type="string">OGR variant of OpenGIS WKT SRS</Metadata>
+        </Metadata>
+      </Metadata>
+    </Reader>
+
+.. _`boost::property_tree`: http://www.boost.org/doc/libs/release/libs/property_tree/
diff --git a/doc/pipeline.rst b/doc/pipeline.rst
new file mode 100644
index 0000000..4478dbe
--- /dev/null
+++ b/doc/pipeline.rst
@@ -0,0 +1,244 @@
+.. _pipeline:
+
+******************************************************************************
+Pipeline
+******************************************************************************
+
+:Author: Howard Butler
+:Contact: howard at hobu.co
+:Date: 12/26/2014
+
+Pipelines are the operative construct in PDAL -- you must construct pipelines
+to perform data translation operations, filter data, or simply to provide data
+to an endpoint. This document describes some features and background of PDAL
+Pipelines and give some examples you can use to execute translation
+operations.
+
+Playing Dolls
+------------------------------------------------------------------------------
+
+A `Pipeline` is composed as a set of `Matryoshka dolls`_, with the outside
+or largest doll being the final endpoint of the pipeline, and the inner-most
+doll being the starting point. Each "doll" in the set represents a
+:cpp:class:`pdal::Stage` with its subsequent operations happening at that
+point as data are pulled through the pipeline from the starting point to
+end point.
+
+There are two primary building blocks in PDAL, :cpp:class:`pdal::Stage` and
+:cpp:class:`pdal::PointView`. :cpp:class:`pdal::Reader`,
+:cpp:class:`pdal::Writer`, and :cpp:class:`pdal::Filter` are all subclasses of
+:cpp:class:`pdal::Stage` that provide the concrete dolls for the Matryoshka
+set.
+
+:cpp:class:`pdal::PointView` is the substrate that flows between stages in a
+pipeline and transfers the actual data as it moves through the pipeline. A
+:cpp:class:`pdal::PointView` contains a :cpp:class:`pdal::PointTablePtr`, which
+itself contains a list of :cpp:class:`pdal::Dimension` objects that define the
+actual channels that are stored in the :cpp:class:`pdal::PointView`.
+
+PDAL provides four types of stages -- :cpp:class:`pdal::Reader`,
+:cpp:class:`pdal::Writer`, :cpp:class:`pdal::Filter`, and
+:cpp:class:`pdal::MultiFilter` -- with the latter being hardly used at this
+point. A Reader is a producer of data, a Writer is a consumer of data, and a
+Filter is an actor on data.
+
+.. note::
+
+   As a consumer, you are generally not supposed to worry about the underlying storage of the
+   PointView, but there might be times when you simply just "want the data."
+   In those situations, you can use the :cpp:class:`pdal::PointView::getBytes`
+   method to stream out the raw storage.
+
+.. _`Matryoshka dolls`: http://en.wikipedia.org/wiki/Matryoshka_doll
+
+A Basic Example
+------------------------------------------------------------------------------
+
+While pipeline objects are manipulable through C++ objects, the other, more
+convenient way is through an XML syntax. The XML syntax mirrors the Matryoshka
+arrangement of the Pipeline, with options and auxiliary metadata added on a
+per-stage basis.
+
+We have two use cases specifically in mind:
+
+    * a command-line application that reads an XML file to allow a user to
+      easily construct arbitrary writer pipelines, as opposed to having to
+      build applications custom to individual needs with arbitrary options,
+      filters, etc.
+
+    * a user can provide XML for a reader pipeline, construct it via a simple
+      call to the PipelineManager API, and then use the Stage read() function
+      to perform the read and then do any processing of the points.  This style
+      of operation is very appropriate for using PDAL from within environments
+      like Python where the focus is on just getting the points, as opposed to
+      complex pipeline construction.
+
+Let's start with the following basic example:
+
+::
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                output.las
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ./path/to/my/file.las
+                </Option>
+            </Reader>
+        </Writer>
+    </Pipeline>
+
+.. note::
+
+    https://github.com/PDAL/PDAL/blob/master/test/data/pipeline/ contains
+    test suite pipeline files that provide an excellent example of the
+    currently possible operations.
+
+Pipeline textual description
+..............................................................................
+
+The first element, Pipeline, tells us what we are and gives a version number.
+Next, we have the Writer element, and provides the `type` of writer stage
+that we are going to have as the endpoint of our pipeline (see more about this
+in `Stage Types`_). After that, we have an Option element, which provides the
+filename that the Writer is going to use when outputting the file. Then we
+have the final doll in our Matryoshka set, the Reader, which has a stage
+type of `readers.las` with its own Option giving a filename to use
+to read the file.
+
+
+Stage Types
+..............................................................................
+
+
+:cpp:class:`pdal::Reader`, :cpp:class:`pdal::Writer`, and
+:cpp:class:`pdal::Filter` are the C++ classes that define the stage types in
+PDAL. Readers follow the pattern of :ref:`readers.las` or
+:ref:`readers.oci`, Writers follow the pattern of :ref:`writers.las` or
+:ref:`readers.oci`, with Filters using :ref:`filters.reprojection` or
+:ref:`filters.crop`.
+
+.. note::
+
+    :ref:`stage_index` contains a full listing of possible stages and
+    descriptions of their options.
+
+.. note::
+
+    Issuing the command ``pdal info --options`` will list all available
+    stages and their options.
+
+Options
+------------------------------------------------------------------------------
+
+Options are the mechanism that PDAL uses to inform :cpp:class:`pdal::Stage`
+entities how to process data. A stage option can itself have options, going
+on ad infinitum. The following example sorts the data using a `Morton
+ordering`_ using :ref:`filters.mortonorder` and writes out a `LASzip`_ file as the result.
+
+.. _`LASzip`: http://www.laszip.org
+.. _`Morton ordering`: http://en.wikipedia.org/wiki/Z-order_curve
+::
+
+    <?xml version="1.0"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                compressed.laz
+            </Option>
+            <Option name="compression">
+                true
+            </Option>
+            <Filter type="filters.mortonorder">
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        uncompressed.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+
+.. note::
+
+    :ref:`metadata` is quite similar to `Options`_ except that Option/Options
+    instances are used to denote an action to be done during a stage rather
+    than simply a data value to be set or fetched.  PDAL is indeed still hazy
+    here and there is ample room to clean this up, but the general gestalt is
+    that you use Options to tell a Stage what to do, and you use Metadata to
+    set a value or data member for something related to a stage.
+
+Syntax Specification
+------------------------------------------------------------------------------
+
+
+* <Pipeline>
+    * this is the root element for all pipeline xml
+    * mandatory
+    * child elements:
+        * exactly one of the following four:
+            * <Writer> element, for writer pipelines
+            * <Reader> or <Filter> or <MultiFilter> element, for reader
+              pipelines
+    * attributes:
+        * the "version" attribute must appear exactly once; the value of this
+          attribute shall be the string "1.0"
+
+* <Writer> :cpp:class:`pdal::Writer`
+    * indicates a writer stage
+    * child elements:
+        * zero or more <Option> elements
+        * exactly one <Reader> or <Filter> or <MultiFilter> element
+    * attributes:
+        * the "type" attribute must appear exactly once; the value of this
+          attribute shall be the string corresponding to the name of
+          the Writer stage type, e.g. "writers.las"
+
+* <Reader> :cpp:class:`pdal::Reader`
+    * indicates a reader stage
+    * child elements:
+        * zero or more <Option> elements
+    * attributes:
+        * the "type" attribute must appear exactly once; the value of this
+          attribute shall be the string corresponding to the name of
+          the Reader stage type, e.g. "readers.las"
+
+* <Filter> :cpp:class:`pdal::Filter`
+    * indicates a filter stage
+    * child elements:
+        * zero or more <Option> elements
+        * exactly one <Reader> or <Filter> or <MultiFilter> element
+    * attributes:
+        * the "type" attribute must appear exactly once; the value of this
+          attribute shall be the string corresponding to the name of
+          the filter stage type, e.g. "filters.crop"
+
+* <MultiFilter> :cpp:class:`pdal::MultiFilter`
+    * indicates a multifilter stage (filter than takes >1 input stage)
+    * child elements:
+        * zero or more <Option> elements
+        * one or more <Reader> or <Filter> or <MultiFilter> elements
+
+    * attributes:
+        * the "type" attribute must appear exactly once; the value of this
+          attribute shall be the string corresponding to the name of
+          the MultiFilter stage type, e.g. "filter.mosaic"
+
+* <Option> :cpp:class:`pdal::Option`
+    * indicates an option parameter to the pipeline stage
+    * may only be a child of a <Reader>, <Writer>, <Filter>, or <MultiFilter>
+      element
+    * attributes:
+        * the "name" attribute must appear exactly once; the value of this
+          attribute shall be the name of the option, e.g. "filename"
+    * any number of recursively-defined <Option> elements
+    * content:
+        * the content of the element shall be the string representing the
+          value of the option, e.g. "input.las"
+
+
+
diff --git a/doc/stages/filters.attribute.rst b/doc/stages/filters.attribute.rst
new file mode 100644
index 0000000..b60c9cf
--- /dev/null
+++ b/doc/stages/filters.attribute.rst
@@ -0,0 +1,127 @@
+.. _filters.attribute:
+
+filters.attribute
+===================
+
+The attribute filter allows you to set the values of a
+selected dimension. There are three possible scenarios that
+are currently supported:
+
+* Set all points in a dimension to single value
+
+* Set points inside an OGR-readable Polygon or MultiPolygon
+
+OGR SQL support
+----------------
+
+You can limit your queries based on OGR's SQL support. If the
+filter has both a `datasource` and a `query` option, those will
+be used instead of the entire OGR data source. At this time it is
+not possible to further filter the OGR query based on a geometry
+but that may be added in the future.
+
+.. note::
+
+    The OGR SQL support follows the rules specified in `ExecuteSQL`_
+    documentation, and it will pass SQL down to the underlying
+    datasource if it can do so.
+
+.. _`ExecuteSQL`: http://www.gdal.org/ogr__api_8h.html#a9892ecb0bf61add295bd9decdb13797a
+
+
+.. warning::
+
+    If no `datasource` is given, it is assumed that the query
+    is setting all of the values for the given dimension to the
+    `value` option.
+
+Example
+-------
+
+In this scenario, we are altering the attributes of three
+dimensions -- `Classification`, `PointSourceId`, and `Intensity`. The
+`PointSourceId` will simply be set to the single value `26`, while
+`Classification` and `Intensity` will have their values set when the
+candidate point is inside a polygon with that polygon's attribute.
+
+.. code-block:: xml
+
+    <?xml version="2.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                attributed.las
+            </Option>
+            <Option name="scale_x">
+                0.0000001
+            </Option>
+            <Option name="scale_y">
+                0.0000001
+            </Option>
+            <Filter type="filters.attribute">
+                <Option name="dimension">
+                    Classification
+                    <Options>
+                        <Option name="datasource">
+                            ./test/data/autzen/attributes.shp
+                        </Option>
+                        <Option name="layer">
+                            attributes
+                        </Option>
+                        <Option name="column">
+                            CLS
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Intensity
+                    <Options>
+                        <Option name="datasource">
+                            ./test/data/autzen/attributes.shp
+                        </Option>
+                        <Option name="query">
+                            SELECT CLS FROM attributes where cls!=6
+                        </Option>
+                        <Option name="column">
+                            CLS
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    PointSourceId
+                    <Options>
+                        <Option name="value">
+                            26
+                        </Option>
+                    </Options>
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        ../autzen/autzen-dd.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+
+Options
+-------
+
+dimension
+  A dimension Option with an Options block containing at least a "value"
+  Option to set all points.
+
+  * value: The value to set all points to for the given dimension
+
+  * datasource: OGR-readable datasource for Polygon or MultiPolygon data
+
+  * column: The column from which to read the attribute. If none is
+    specified, the first column is used.
+
+  * query: The OGR SQL query to execute on the datasource to fetch
+    geometry and attributes.
+
+  * layer: The data source's layer to use. If none is specified, the
+    first one is used.
+
diff --git a/doc/stages/filters.chipper.img1.png b/doc/stages/filters.chipper.img1.png
new file mode 100644
index 0000000..86720a9
Binary files /dev/null and b/doc/stages/filters.chipper.img1.png differ
diff --git a/doc/stages/filters.chipper.img2.png b/doc/stages/filters.chipper.img2.png
new file mode 100644
index 0000000..60abe67
Binary files /dev/null and b/doc/stages/filters.chipper.img2.png differ
diff --git a/doc/stages/filters.chipper.rst b/doc/stages/filters.chipper.rst
new file mode 100644
index 0000000..77803a9
--- /dev/null
+++ b/doc/stages/filters.chipper.rst
@@ -0,0 +1,52 @@
+.. _filters.chipper:
+
+filters.chipper
+===============
+
+The chipper filter takes a single large point cloud and converts it into a set
+of smaller clouds, or chips. The chips are all spatially contiguous and
+non-overlapping, so the result is a an irregular tiling of the input data.
+
+.. figure:: filters.chipper.img1.png
+    :scale: 100 %
+    :alt: Points before chipping
+
+    Before chipping, the points are all in one collection.
+
+
+.. figure:: filters.chipper.img2.png
+    :scale: 100 %
+    :alt: Points after chipping
+
+    After chipping, the points are tiled into smaller contiguous chips.
+   
+Chipping is usually applied to data read from files (which produce one large
+stream of points) before the points are written to a database (which prefer
+data segmented into smaller blocks). 
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.pgpointcloud">
+      <Option name="connection">dbname='lidar' user='user'</Option>
+      <Filter type="filters.chipper">
+        <Option name="capacity">400</Option>
+        <Reader type="readers.las">
+            <Option name="filename">example.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+capacity
+  How many points to fit into each chip. The number of points in each chip will
+  not exceed this value, and will sometimes be less than it. [Default:
+  **5000**]
+  
diff --git a/doc/stages/filters.colorization.img1.jpg b/doc/stages/filters.colorization.img1.jpg
new file mode 100644
index 0000000..1c53f40
Binary files /dev/null and b/doc/stages/filters.colorization.img1.jpg differ
diff --git a/doc/stages/filters.colorization.rst b/doc/stages/filters.colorization.rst
new file mode 100644
index 0000000..64bc0be
--- /dev/null
+++ b/doc/stages/filters.colorization.rst
@@ -0,0 +1,76 @@
+.. _filters.colorization:
+
+filters.colorization
+====================
+
+The colorization filter populates dimensions in the point buffer using input values read from a raster file. Commonly this is used to add Red/Green/Blue values to points from an aerial photograph of an area. However, any band can be read from the raster and applied to any dimension name desired.
+
+.. figure:: filters.colorization.img1.jpg
+    :scale: 50 %
+    :alt: Points after colorization
+
+    After colorization, points take on the colors provided by the input image
+
+The bands of the raster to apply to each are selected using the "band" option, and the values of the band may be scaled before being written to the dimension. If the band range is 0-1, for example, it might make sense to scale by 256 to fit into a traditional 1-byte color value range.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">colorized.las</Option>
+      <Filter type="filters.colorization">
+        <Option name="dimension">
+          Red
+          <Options>
+            <Option name="band">1</Option>
+            <Option name="scale">1.0</Option>
+          </Options>
+        </Option>
+        <Option name="dimension">
+          Green
+          <Options>
+              <Option name="band">2</Option>
+              <Option name="scale">1.0</Option>
+          </Options>
+        </Option>
+        <Option name="dimension">
+          Blue
+          <Options>
+            <Option name="band">3</Option>
+            <Option name="scale">256</Option>
+          </Options>
+        </Option>
+        <Option name="raster">aerial.tif</Option>
+        <Reader type="readers.las">
+          <Option name="filename">uncolored.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+
+Options
+-------
+
+raster
+  The raster file to read the band from. Any format supported by `GDAL`_ may be read.
+
+dimension
+  A dimension to populate with values from the raster file. There may be multiple dimension options declared. The dimension name should be supplied, and an options list indicating the raster band to read from and the scaling to apply.
+  
+  band
+    The raster band from which to read values for this dimension.
+  
+  scale
+    The scaling factor to apply to the value read from the raster. [Default: **1.0**]
+
+x_dim
+  The point dimension to use for the x dimension [Default: **X**]
+  
+y_dim
+  The point dimension to use for the y dimension [Default: **Y**]
+
+
+.. _GDAL: http://gdal.org
diff --git a/doc/stages/filters.crop.rst b/doc/stages/filters.crop.rst
new file mode 100644
index 0000000..d9a1e42
--- /dev/null
+++ b/doc/stages/filters.crop.rst
@@ -0,0 +1,48 @@
+.. _filters.crop:
+
+filters.crop
+============
+
+The crop filter removes points that fall outside or inside a cropping bounding
+box (2D)
+or polygon.  If more than one bounding region is specified, the filter will
+pass all input points through each bounding region, creating an output point
+set for each input crop region.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        file-cropped.las
+      </Option>
+      <Filter type="filters.crop">
+        <Option name="bounds">
+          ([0,1000000],[0,1000000])
+        </Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            file-input.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+bounds
+  The extent of the clipping rectangle, expressed in a string, eg: *([xmin, xmax], [ymin, ymax])*
+  
+polygon
+  The clipping polygon, expressed in a well-known text string, eg: *POLYGON((0 0, 5000 10000, 10000 0, 0 0))* 
+  
+outside
+  Invert the cropping logic and only take points **outside** the cropping bounds or polygon. [Default: **false**]
+  
diff --git a/doc/stages/filters.decimation.rst b/doc/stages/filters.decimation.rst
new file mode 100644
index 0000000..49efc22
--- /dev/null
+++ b/doc/stages/filters.decimation.rst
@@ -0,0 +1,33 @@
+.. _filters_decimation:
+
+filters.decimation
+==================
+
+The decimation filter takes a stream of points and steps through it, taking only every Nth point. With a step of 2, the filter takes every second point, for a reduction of 50%. With a step of 10, the filter takes every tenth point, for a reduction of 90%.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">smaller.las</Option>
+      <Filter type="filters.decimation">
+        <Option name="step">10</Option>
+        <Reader type="readers.las">
+            <Option name="filename">larger.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+step
+  How many points to skip between each sample point? A step of 1 will skip no point, and leave the stream unchanged. A step of 100 will reduce the stream by 99%. [Default: **1**]
+  
+offset
+  Start sampling with what point? [Default: **0**]
diff --git a/doc/stages/filters.ferry.rst b/doc/stages/filters.ferry.rst
new file mode 100644
index 0000000..3a9c5af
--- /dev/null
+++ b/doc/stages/filters.ferry.rst
@@ -0,0 +1,80 @@
+.. _filters.ferry:
+
+filters.ferry
+============
+
+The ferry filter is used to stash intermediate variables as part of
+processing data. For example, a common scenario is to keep both the
+original value and the reprojected X and Y variables in a
+scenario that uses the :ref:`filters.reprojection` filter. In the
+normal case, the X and Y data would be overwritten with the new
+longitude and latitude values as part of the reprojection. The
+ferry filter will allow you to keep this around for later use.
+
+
+Example
+-------
+
+In this scenario, we are doing what is described above --
+stashing the pre-projection X and Y values into the
+`StatePlaneX` and `StatePlaneY` dimensions. Future
+processing, can then operate on these data.
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                colorized.las
+            </Option>
+            <Filter type="filters.reprojection">
+                <Option name="out_srs">
+                    EPSG:4326+4326
+                </Option>
+                <Option name="scale_x">
+                    0.0000001
+                </Option>
+                <Option name="scale_y">
+                    0.0000001
+                </Option>
+                <Filter type="filters.ferry">
+                    <Option name="dimension">
+                        X
+                        <Options>
+                            <Option name="to">
+                                StatePlaneX
+                            </Option>
+                        </Options>
+                    </Option>
+                    <Option name="dimension">
+                        Y
+                        <Options>
+                            <Option name="to">
+                                StatePlaneY
+                            </Option>
+                        </Options>
+                    </Option>
+                    <Reader type="readers.las">
+                        <Option name="filename">
+                            ../las/1.2-with-color.las
+                        </Option>
+                        <Option name="spatialreference">
+                            EPSG:2993
+                        </Option>
+                    </Reader>
+                </Filter>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+Options
+-------
+
+dimension
+  A dimension Option with an Options block containing at least a "to" dimension
+  name.  If the "to" dimension already exists, it will be used. If it does not,
+  it will be created as a dimension of type `double`.
+
+  * to: The dimension to copy the data to. The data are currently read as
+    doubles and put into the output dimension as double.
diff --git a/doc/stages/filters.hexbin.img1.jpg b/doc/stages/filters.hexbin.img1.jpg
new file mode 100644
index 0000000..23c9392
Binary files /dev/null and b/doc/stages/filters.hexbin.img1.jpg differ
diff --git a/doc/stages/filters.hexbin.rst b/doc/stages/filters.hexbin.rst
new file mode 100644
index 0000000..86547aa
--- /dev/null
+++ b/doc/stages/filters.hexbin.rst
@@ -0,0 +1,107 @@
+.. _filters.hexbin:
+
+filters.hexbin
+==============
+
+A common questions for users of point clouds is what the spatial extent of a point cloud collection is. Files generally provide only rectangular bounds, but often the points inside the files only fill up a small percentage of the area within the bounds.
+
+.. figure:: filters.hexbin.img1.jpg
+    :scale: 50 %
+    :alt: Hexbin derive from input point buffer
+
+    Hexbin output shows boundary of actual points in point buffer, not just rectangular extents.
+
+The hexbin filter reads a point stream and writes out a metadata record that contains a much tighter data bound, expressed as a well-known text polygon. In order to write out the metadata record, the `pdal` pipeline command must be invoked using the `--pipeline-serialization` option:
+
+::
+
+    $ pdal hexbin-pipeline.xml --pipeline-serialization hexbin-out.xml
+
+After running with the pipeline serialization option, the output file looks like this:
+
+.. code-block:: xml
+
+  <PointView>
+    <Metadata name="pointbuffer" type="blank">
+      <Metadata name="filters.hexbin" type="blank">
+        <Metadata name="edge_size" type="double">
+          0.002218331916495204
+        </Metadata>
+        <Metadata name="threshold" type="nonNegativeInteger">
+          15
+        </Metadata>
+        <Metadata name="sample_size" type="nonNegativeInteger">
+          5000
+        </Metadata>
+        <Metadata name="boundary" type="string">
+          MULTIPOLYGON (((
+          -80.8466 35.2183, -80.8460 35.2194,
+          -80.8447 35.2194, -80.8441 35.2205,
+          -80.8428 35.2205, -80.8421 35.2216,
+          ...
+          -80.8498 35.2194, -80.8486 35.2194,
+          -80.8479 35.2183, -80.8466 35.2183
+          )))
+        </Metadata>
+      </Metadata>
+    </Metadata>
+  </PointView>
+
+In addition, if you have defined a writer you will have the usual point data output file.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        file-output.las
+      </Option>
+      <Filter type="filters.hexbin">
+        <Option name="x_dim">readers.las.X</Option>
+        <Option name="y_dim">readers.las.Y</Option>
+        <Option name="threshold">10</Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            file-input.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+x_dim
+  The name of the dimension to use as the X coordinate in the cropping process. [Default: **X**]
+
+y_dim
+  The name of the dimension to use as the Y coordinate in the cropping process. [Default: **Y**]
+
+edge_size
+  If not set, the hexbin filter will estimate a hex size based on a sample of the data. If set, hexbin will use the provided size in constructing the hexbins to test.
+
+sample_size
+  How many points to sample when automatically calculating the edge size? [Default: **5000**]
+
+threshold
+  Number of points that have to fall within a hexbin before it is considered "in" the data set. [Default: **15**]
+
+precision
+  Coordinate precision to use in writing out the well-known text of the boundary polygon. [Default: **8**]
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/stages/filters.merge.rst b/doc/stages/filters.merge.rst
new file mode 100644
index 0000000..3aee80d
--- /dev/null
+++ b/doc/stages/filters.merge.rst
@@ -0,0 +1,42 @@
+.. _filters.merge:
+
+filters.merge
+============
+
+The merge filter combines input from multiple sources into a single output.
+No checks are made to ensure that points from the various sources have similar
+dimensions or are generally compatible.  Notably, dimensions are not
+initialized when points merged from various sources do not have dimensions in
+common. 
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        merged.las
+      </Option>
+      <Filter type="filters.merge">
+        <Reader type="readers.las">
+          <Option name="filename">
+            file1.las
+          </Option>
+        </Reader>
+        <Reader type="readers.las">
+          <Option name="filename">
+            file2.las
+          </Option>
+        </Reader>
+        <Reader type="readers.bpf">
+          <Option name="filename">
+            file3.bpf
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
diff --git a/doc/stages/filters.mortonorder.rst b/doc/stages/filters.mortonorder.rst
new file mode 100644
index 0000000..a24e0ff
--- /dev/null
+++ b/doc/stages/filters.mortonorder.rst
@@ -0,0 +1,35 @@
+.. _filters.mortonorder:
+
+filters.mortonorder
+===========
+
+Sorts the XY data using `Morton ordering`_.
+
+.. _`Morton ordering`: http://en.wikipedia.org/wiki/Z-order_curve
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        sorted.las
+      </Option>
+      <Filter type="filters.mortonorder">
+        <Reader type="readers.las">
+          <Option name="filename">
+            unsorted.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+
+Notes
+-----
+
diff --git a/doc/stages/filters.pclblock.rst b/doc/stages/filters.pclblock.rst
new file mode 100644
index 0000000..ed641aa
--- /dev/null
+++ b/doc/stages/filters.pclblock.rst
@@ -0,0 +1,148 @@
+.. _filters.pclblock:
+
+===============================================================================
+filters.pclblock
+===============================================================================
+
+The PCL Block filter allows users to specify a block of Point Cloud Library
+(`PCL`_) operations on a PDAL ``PointView``, applying the necessary conversions
+between PDAL and PCL point cloud representations.
+
+This filter is under active development. The current implementation serves as a
+proof of concept for linking PCL into PDAL and converting data. The PCL Block
+filter creates a PCL ``Pipeline`` object and passes it a single argument, the JSON
+file containing the PCL block definition. After filtering, the resulting indices
+can be retrieved and used to create a new PDAL ``PointView`` containing only
+those points that passed the filtering stages.
+
+At this stage in its development, the PCL ``Pipeline`` does not allow complex
+operations that may change the point type (e.g., ``PointXYZ`` to ``PointNormal``) or
+alter points.  We will continue to look into use cases that are of value and
+feasible, but for now are limited primarily to PCL functions that filter or
+segment the point cloud, returning a list of indices of the filtered points
+(e.g., ground or object, noise or signal). The main reason for this design
+decision is that we want to avoid converting all ``PointView`` dimensions to the
+PCL ``PointCloud``. In the case of an LAS reader, we may very well not want to
+operate on fields such as return number, but we do not want to lose this
+information post PCL filtering. The easy solution is to simply retain the index
+between the ``PointView`` and ``PointCloud`` objects and update as necessary.
+
+.. seealso::
+
+    See :ref:`pcl_block_tutorial` for more on using the PCL Block including
+    examples.
+
+    See :ref:`pcl_json_specification` for complete details on the PCL Block JSON syntax
+    and the filters available.
+
+.. _`PCL`: http://www.pointclouds.org
+
+
+
+Options
+-------------------------------------------------------------------------------
+
+filename
+  JSON file to read [Required]
+
+
+
+PCL Block Schema
+-------------------------------------------------------------------------------
+
+The PCL Block json object describes the filter chain to be constructed within
+PCL. Here is an example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "PCL-Block-Name",
+            "help": "This is an example pipeline with two filters.",
+            "author": "mpg",
+            "filters":
+            [
+                {
+                    "name": "FilterOne",
+                    "setFooParameter": "value"
+                },
+                {
+                    "name": "FilterTwo",
+                    "setBarParameter": false,
+                    "setBounds":
+                    {
+                        "upper": 42,
+                        "lower": 17
+                    }
+                }
+            ]
+        }
+    }
+
+
+
+Implemented Filters
+-------------------------------------------------------------------------------
+
+The list of PCL filters that are accessible through the PCL Block depends on PCL
+itself. PDAL is rather dumb in this respect, merely converting the PDAL
+``PointView`` to a PCL ``PointCloud`` object and passing the JSON filename. The
+parsing of the JSON file and implementation of the PCL filters is entirely
+embedded within the PCL ``Pipeline``.
+
+A summary of the currently available filters is listed below. For full details
+of the filters and their parameters, see the :ref:`pcl_json_specification`.
+
+ApproximateProgressiveMorphologicalFilter
+    faster (and potentially less accurate) version of the
+    **ProgressiveMorphologicalFilter**
+
+ConditionalRemoval
+    filters the data to remove normals outside of a given Z range
+
+GridMinimum
+    assembles a local 2D grid over a given PointCloud, then downsamples the data
+
+NormalEstimation
+    computes the surfaces normals of the points in the input
+
+PassThrough
+    allows the user to set min/max bounds on one dimension of the data
+
+ProgressiveMorphologicalFilter
+    removes nonground points to produce a bare-earth point cloud
+
+RadiusOutlierRemoval
+    removes outliers if the number of neighbors in a certain search radius is
+    smaller than a given K
+
+StatisticalOutlierRemoval
+    uses point neighborhood statistics to filter outlier data
+
+VoxelGrid
+    assembles a local 3D grid over a given PointCloud, then downsamples and
+    filters the data
+
+
+
+Adding a New Filter
+-------------------------------------------------------------------------------
+
+Adding a new PCL filter to the PCLBlock ecosystem is mostly a process of
+judicious copying and pasting.
+
+1. Add the filter function declaration of the form ``applyMyFilter`` to
+   ``PCLPipeline.h``.
+
+2. Add the implementation of ``applyMyFilter`` to ``PCLPipeline.hpp``.
+
+3. Add a one-line description of the shiny new filter to this file,
+   ``filters.pclblock.rst``.
+
+4. Add a full description of the new filter to :ref:`pcl_spec.rst
+   <pcl_json_specification>`, including example JSON, all parameters, and
+   default settings.
+
+5. Add a test to ``PCLBlockFilterTest.cpp``. Make sure each parameter is
+   independently verified.
diff --git a/doc/stages/filters.predicate.rst b/doc/stages/filters.predicate.rst
new file mode 100644
index 0000000..4c50ec2
--- /dev/null
+++ b/doc/stages/filters.predicate.rst
@@ -0,0 +1,92 @@
+.. _filters.predicate:
+
+filters.predicate
+=================
+
+Like the ref:`filters.programmable` filter, the predicate filter applies a `Python`_ function to a stream of points. Points can be retained/removed from the stream by setting true/false values into a special "Mask" dimension in the output point array.
+
+.. code-block:: python
+
+  import numpy as np
+
+  def filter(ins,outs):
+     cls = ins['Classification']
+
+     keep_classes = [1,2]
+
+     # Use the first test for our base array.
+     keep = np.equal(cls, keep_classes[0])
+
+     # For 1:n, test each predicate and join back
+     # to our existing predicate array
+     for k in range(1,len(keep_classes)):
+         t = np.equal(cls, keep_classes[k])
+         keep = keep + t
+
+     outs['Mask'] = keep
+     return True
+
+The example above sets the "mask" to true for points that are in classifications 1 or 2 and to false otherwise, causing points that are not classified 1 or 2 to be dropped from the point stream.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        file-cropped.las
+      </Option>
+      <Filter type="filters.predicate">
+      <Option name="function">filter</Option>
+      <Option name="module">anything</Option>        
+      <Option name="source">
+
+  import numpy as np
+  
+  def filter(ins,outs):
+     cls = ins['Classification']
+  
+     keep_classes = [1,2]
+  
+     # Use the first test for our base array.
+     keep = np.equal(cls, keep_classes[0])
+  
+     # For 1:n, test each predicate and join back
+     # to our existing predicate array
+     for k in range(1,len(keep_classes)):
+         t = np.equal(cls, keep_classes[k])
+         keep = keep + t
+  
+     outs['Mask'] = keep
+     return True
+     
+          </Option>      
+          <Reader type="readers.las">
+            <Option name="filename">
+              file-input.las
+            </Option>
+          </Reader>
+        </Filter>
+      </Writer>
+    </Pipeline>
+
+
+Options
+-------
+
+script
+  When reading a function from a separate `Python`_ file, the file name to read from. [Example: functions.py]
+
+module
+  The Python module that is holding the function to run. [Required]
+
+function
+  The function to call.
+
+
+
+.. _Python: http://python.org
+.. _NumPy: http://www.numpy.org/
diff --git a/doc/stages/filters.programmable.rst b/doc/stages/filters.programmable.rst
new file mode 100644
index 0000000..9230332
--- /dev/null
+++ b/doc/stages/filters.programmable.rst
@@ -0,0 +1,94 @@
+.. _filters.programmable:
+
+filters.programmable
+====================
+
+The programmable filter takes a stream of points and applies a `Python`_
+function to each point in the stream.
+
+The function must have two `NumPy`_ arrays as arguments, `ins` and `outs`. The
+`ins` array represents input points, the `outs` array represents output points.
+Each array contains all the dimensions of the point schema, for a number of
+points (depending on how large a point buffer the pipeline is processing at the
+time, a run-time consideration). Individual arrays for each dimension can be
+read from the input point and written to the output point.
+
+
+.. code-block:: python
+
+  import numpy as np
+
+  def multiply_z(ins,outs):
+      Z = ins['Z']
+      Z = Z * 10.0
+      outs['Z'] = Z
+      return True
+
+Note that the function always returns `True`. If the function returned `False`,
+an error would be thrown and the translation shut down.
+
+If you want to write a dimension that might not be available, use can use one
+or more `add_dimension` options.
+
+To filter points based on a `Python`_ function, use the
+:ref:`filters.predicate` filter.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        file-filtered.las
+      </Option>
+      <Filter type="filters.programmable">
+        <Option name="script">multiply_z.py</Option>
+        <Option name="function">multiply_z</Option>
+        <Option name="module">anything</Option>  
+        <Reader type="readers.las">
+          <Option name="filename">
+            file-input.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+The XML pipeline file referenced the external `multiply_z.py` `Python`_ script,
+which scales up the Z coordinate by a factor of 10.
+
+.. code-block:: python
+
+  import numpy as np
+
+  def multiply_z(ins,outs):
+      Z = ins['Z']
+      Z = Z * 10.0
+      outs['Z'] = Z
+      return True
+
+
+Options
+-------
+
+script
+  When reading a function from a separate `Python`_ file, the file name to read
+  from. [Example: functions.py]
+
+module
+  The Python module that is holding the function to run. [Required]
+
+function
+  The function to call.
+
+source
+  The literal `Python`_ code to execute, when the script option is not being used.
+
+add_dimension
+  The name of a dimension to add to the pipeline that does not already exist.
+
+.. _Python: http://python.org/
+.. _NumPy: http://www.numpy.org/
diff --git a/doc/stages/filters.range.rst b/doc/stages/filters.range.rst
new file mode 100644
index 0000000..b9775d4
--- /dev/null
+++ b/doc/stages/filters.range.rst
@@ -0,0 +1,58 @@
+.. _filters.range:
+
+filters.range
+======================
+
+The range filter applies rudimentary filtering to the input point cloud
+based on a set of criteria on the given dimensions.
+
+Example
+-------
+
+This example passes through all points whose Z value is in the range [0,100]
+and whose classification equals 2 (corresponding to ground in LAS).
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        filtered.las
+      </Option>
+      <Filter type="filters.range">
+        <Option name="dimension">
+          Z
+          <Options>
+            <Option name="min">0</Option>
+            <Option name="max">100</Option>
+          </Options>
+        </Option>
+        <Option name="dimension">
+          Classification
+          <Options>
+            <Option name="equals">2</Option>
+          </Options>
+        </Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            input.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+dimension
+  A dimension Option with an Options block containing the range criteria.
+
+  * min: The minimum allowable value (inclusive) to pass through to the filtered point cloud.
+
+  * max: The maximum allowable value (inclusive) to pass through to the filtered point cloud.
+
+  * equals: The exact value to pass through to the filtered point cloud (i.e., min = max).
+
diff --git a/doc/stages/filters.reprojection.rst b/doc/stages/filters.reprojection.rst
new file mode 100644
index 0000000..2fe986f
--- /dev/null
+++ b/doc/stages/filters.reprojection.rst
@@ -0,0 +1,62 @@
+.. _filters.reprojection:
+
+filters.reprojection
+===========================
+
+The reprojection filter converts the X, Y and/or Z dimensions to a new spatial
+reference system. The old coordinates are replaced by the new ones,
+if you want to preserve the old coordinates for future processing, use a
+:ref:`filters.ferry` to create a new dimension and stuff them there.
+
+.. note::
+
+    X, Y, and Z dimensions in PDAL are carried as doubles, with their
+    scale information applied. Set the output scale (`scale_x`, `scale_y`, or
+    `scale_z`) on your writer to descale the data on the way out.
+
+    Many LIDAR formats store coordinate information in 32-bit address spaces, and
+    use scaling and offsetting to ensure that accuracy is not lost while fitting
+    the information into a limited address space. When changing projections, the
+    coordinate values will change, which may change the optimal scale and offset
+    for storing the data.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+    <Option name="filename">example-geog.las</Option>
+    <Option name="scale_x">0.0000001</Option>
+    <Option name="scale_y">0.0000001</Option>
+    <Option name="scale_z">0.1</Option>
+    <Option name="offset_x">-100</Option>
+    <Option name="offset_y">40</Option>
+    <Option name="offset_z">0</Option>
+    <Option name="spatialreference">EPSG:4326</Option>
+      <Filter type="filters.reprojection">
+        <Option name="in_srs">EPSG:26916</Option>
+        <Option name="out_srs">EPSG:4326</Option>
+        <Reader type="readers.las">
+          <Option name="filename">example-utm.las</Option>
+          <Option name="spatialreference">EPSG:26916</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+in_srs
+  Spatial reference system of the input data. Express as an EPSG string (eg
+  "EPSG:4326" for WGS86 geographic) or a well-known text string. [Required if
+  input reader does not supply SRS information]
+
+out_srs
+  Spatial reference system of the output data. Express as an EPSG string (eg
+  "EPSG:4326" for WGS86 geographic) or a well-known text string. [Required]
+
diff --git a/doc/stages/filters.sort.rst b/doc/stages/filters.sort.rst
new file mode 100644
index 0000000..f4da854
--- /dev/null
+++ b/doc/stages/filters.sort.rst
@@ -0,0 +1,46 @@
+.. _filters.sort:
+
+filters.sort
+============
+
+The sort filter orders a point buffer based on the values of a dimension.
+The current filter only supports sorting based on a single dimension in
+increasing order.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        sorted.las
+      </Option>
+      <Filter type="filters.sort">
+        <Option name="dimension">
+          X
+        </Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            unsorted.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+dimension
+  The dimension on which to sort the points.
+
+Notes
+-----
+
+The sorting algorithm used is not stable, meaning that one cannot chain
+multiple Sort filters to sort order point buffer heirarchically (say,
+primarily by the dimension X and secondairly by the dimension Y).
diff --git a/doc/stages/filters.splitter.rst b/doc/stages/filters.splitter.rst
new file mode 100644
index 0000000..28917dc
--- /dev/null
+++ b/doc/stages/filters.splitter.rst
@@ -0,0 +1,49 @@
+.. _filters.splitter:
+
+filters.splitter
+===============
+
+The splitter filter breaks a point cloud into square tiles of a size that
+you choose.  The origin of the tiles is chosen arbitrarily unless specified
+as an option.
+
+The splitter takes a single PointView as its input and creates a PointView
+for each tile as its output.
+
+Splitting is usually applied to data read from files (which produce one large
+stream of points) before the points are written to a database (which prefer
+data segmented into smaller blocks). 
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.pgpointcloud">
+      <Option name="connection">dbname='lidar' user='user'</Option>
+      <Filter type="filters.chipper">
+        <Option name="length">100</Option>
+        <Option name="origin_x">638900.0</Option>
+        <Option name="origin_y">835500.0</Option>
+        <Reader type="readers.las">
+            <Option name="filename">example.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+length
+  Length of the sides of the tiles that are created to hold points.
+  [Default: 1000]
+  
+origin_x
+  X Origin of the tiles.  [Default: none (chosen arbitarily)]
+
+origin_y
+  Y Origin of the tiles.  [Default: none (chosen arbitarily)]
+  
diff --git a/doc/stages/filters.stats.rst b/doc/stages/filters.stats.rst
new file mode 100644
index 0000000..fa58692
--- /dev/null
+++ b/doc/stages/filters.stats.rst
@@ -0,0 +1,52 @@
+.. _filters.stats:
+
+filters.stats
+============
+
+The stats filter calculates the minimum, maximum and average (mean) values
+of dimensions.  On request it will also provide an enumeration of values of
+a dimension.
+
+The output of the stats filter is metadata that can be stored by writers or
+used through the PDAL API.  Output from the stats filter can also be
+quickly obtained in JSON format by using the command ``pdal info --stats``.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        sorted.las
+      </Option>
+      <Filter type="filters.stats">
+        <Option name="dimensions">X,Y,Z,Classification</Option>
+        <Option name="enumerate">Classification</Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            unsorted.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+dimensions
+  A comma-separated list of dimensions whose statistics should be
+  processed.  If not provided, statistics for all dimensions are calculated.
+  
+enumerate
+  A comma-separated list of dimensions whose values should be enumerated.
+  Note that this list does not add to the list of dimensions that may be
+  provided in the **dimensions** option.
+
+count
+  Identical to the --enumerate option, but provides a count of the number
+  of points in each enumerated category.
diff --git a/doc/stages/filters.transformation.rst b/doc/stages/filters.transformation.rst
new file mode 100644
index 0000000..5a9fe98
--- /dev/null
+++ b/doc/stages/filters.transformation.rst
@@ -0,0 +1,51 @@
+.. _filters.transformation:
+
+filters.transformation
+======================
+
+The transformation filter applies an arbitrary rotation+translation transformation, represented as a 4x4 matrix, to each xyz triplet.
+The filter does *no* checking to ensure the matrix is a valid affine transformation — buyer beware.
+
+
+Example
+-------
+
+This example rotates the points around the z-axis while translating them.
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        transformed.las
+      </Option>
+      <Filter type="filters.transformation">
+        <Option name="matrix">
+          0 -1  0  1
+          1  0  0  2
+          0  0  1  3
+          0  0  0  1
+        </Option>
+        <Reader type="readers.las">
+          <Option name="filename">
+            untransformed.las
+          </Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+matrix
+  A whitespace-delimited transformation matrix.
+  The matrix is assumed to be presented in row-major order.
+  Only matrices with sixteen elements are allowed.
+
+Notes
+-----
+
+The transformation filter does not apply any spatial reference information — if spatial reference information is desired, it must be specified on another filter.
diff --git a/doc/stages/index.rst b/doc/stages/index.rst
new file mode 100644
index 0000000..a032f21
--- /dev/null
+++ b/doc/stages/index.rst
@@ -0,0 +1,74 @@
+.. _stage_index:
+
+******************************************************************************
+Stage Reference
+******************************************************************************
+
+
+Readers
+=======
+
+.. toctree::
+   :maxdepth: 1
+
+   readers.buffer
+   readers.faux
+   readers.geowave
+   readers.greyhound
+   readers.las
+   readers.mrsid
+   readers.nitf
+   readers.oci
+   readers.optech
+   readers.pcd
+   readers.pgpointcloud
+   readers.ply
+   readers.qfit
+   readers.rxp
+   readers.sbet
+   readers.sqlite
+
+Writers
+=======
+
+.. toctree::
+   :maxdepth: 1
+
+   writers.derivative
+   writers.geowave
+   writers.las
+   writers.matlab
+   writers.nitf
+   writers.oci
+   writers.ply
+   writers.p2g
+   writers.pcd
+   writers.pgpointcloud
+   writers.pclvisualizer
+   writers.rialto
+   writers.sqlite
+   writers.text
+
+Filters
+=======
+
+.. toctree::
+   :maxdepth: 1
+
+   filters.attribute
+   filters.colorization
+   filters.chipper
+   filters.crop
+   filters.decimation
+   filters.ferry
+   filters.hexbin
+   filters.mortonorder
+   filters.merge
+   filters.pclblock
+   filters.predicate
+   filters.programmable
+   filters.range
+   filters.reprojection
+   filters.sort
+   filters.stats
+   filters.transformation
diff --git a/doc/stages/readers.bpf.rst b/doc/stages/readers.bpf.rst
new file mode 100644
index 0000000..0d70e28
--- /dev/null
+++ b/doc/stages/readers.bpf.rst
@@ -0,0 +1,38 @@
+.. _readers.bpf:
+
+readers.bpf
+===========
+
+BPF is an NGA specification for point cloud data. The specification can be
+found at https://nsgreg.nga.mil/doc/view?i=4202 The **BPF Reader** supports
+reading from BPF files that are encoded as version 1, 2 or 3.
+
+This BPF reader only supports Zlib compression.  It does NOT support the
+deprecated compression types QuickLZ and FastLZ.  The reader will consume files
+containing ULEM frame data and polarimetric data, although these data are not
+made accessible to PDAL; they are essentially ignored.
+
+Data that follows the standard header but precedes point data is taken to
+be metadata and is UTF-encoded and added to the reader's metadata.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.bpf">
+        <Option name="filename">inputfile.bpf</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+    BPF file to read [Required]
+
diff --git a/doc/stages/readers.buffer.rst b/doc/stages/readers.buffer.rst
new file mode 100644
index 0000000..7dc11fa
--- /dev/null
+++ b/doc/stages/readers.buffer.rst
@@ -0,0 +1,20 @@
+.. _readers.buffer.
+
+readers.buffer
+==============
+
+The `readers.buffer`_ stage is a special stage that allows
+you to read data from your own PointView rather than
+fetching the data from a specific reader. In the :ref:`writing` example,
+it is used to take a simple listing of points and turn them into an
+LAS file.
+
+
+Example
+-------
+
+See :ref:`writing` for an example usage scenario for `readers.buffer`.
+
+Options
+-------
+
diff --git a/doc/stages/readers.faux.rst b/doc/stages/readers.faux.rst
new file mode 100644
index 0000000..8626765
--- /dev/null
+++ b/doc/stages/readers.faux.rst
@@ -0,0 +1,51 @@
+.. _readers.faux:
+
+readers.faux
+============
+
+The "**faux reader**" is used for testing pipelines. It does not read from a
+file or database, but generates synthetic data to feed into the pipeline.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.faux">
+        <Option name="bounds">([0,1000000],[0,1000000],[0,100])</Option>
+        <Option name="num_points">10000</Option>
+        <Option name="mode">random</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+bounds
+  What spatial extent should points be generated within? Text string of the
+  form "([xmin,xmax],[ymin,ymax],[zmin,zmax])". [Default: unit cube]
+
+num_points
+  How many synthetic points to generate before finishing? [Required]
+ 
+mean_x|y|z
+  Mean value in the x, y, or z dimension respectively. (Normal mode only)
+  [Default: 0]
+
+stdev_x|y|z
+  Standard deviation in the x, y, or z dimension respectively. (Normal mode
+  only) [Default: 1]
+
+mode
+  How to generate synthetic points. One of "constant" (repeat single value),
+  "random" (random values within bounds), "ramp" (steadily increasing values
+  within the bounds), "uniform" (uniformly distributed within bounds), or
+  "normal" (normal distribution with given mean and standard deviation).
+  [Required]
+  
diff --git a/doc/stages/readers.geowave.rst b/doc/stages/readers.geowave.rst
new file mode 100644
index 0000000..f991da5
--- /dev/null
+++ b/doc/stages/readers.geowave.rst
@@ -0,0 +1,65 @@
+.. _readers.geowave:
+
+readers.geowave
+============
+
+The **GeoWave reader** uses `GeoWave`_ to read from Accumulo.  GeoWave entries are stored using EPSG:4326.  Instructions for configuring the GeoWave plugin can be found `here`_
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.geowave">
+        <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+        <Option name="instanceName">GeoWave</Option>
+        <Option name="username">user</Option>
+        <Option name="password">pass</Option>
+        <Option name="tableNamespace">PDAL_Table</Option>
+        <Option name="featureTypeName">PDAL_Point</Option>
+        <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
+        <Option name="pointsPerEntry">5000u</Option>
+        <Option name="bounds">([0,1000000],[0,1000000],[0,100])</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+zookeeperUrl
+  The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
+
+instanceName
+  The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
+
+username
+  The username for the account to establish an Accumulo connector. [Required]
+
+password
+  The password for the account to establish an Accumulo connector. [Required]
+
+tableNamespace
+  The table name to be used when interacting with GeoWave. [Required]
+
+featureTypeName
+  The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
+
+dataAdapter
+  FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
+
+pointsPerEntry
+  Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]
+
+bounds
+  The extent of the bounding rectangle to use to query points, expressed as a string, eg: “([xmin,xmax],[ymin,ymax],[zmin,zmax])”. [Default: unit cube] 
+
+
+.. _GeoWave: https://ngageoint.github.io/geowave/
+.. _here: https://ngageoint.github.io/geowave/documentation.html#jace-jni-proxies-2
+
diff --git a/doc/stages/readers.greyhound.rst b/doc/stages/readers.greyhound.rst
new file mode 100644
index 0000000..04b3b5d
--- /dev/null
+++ b/doc/stages/readers.greyhound.rst
@@ -0,0 +1,35 @@
+.. _readers.greyhound:
+
+readers.greyhound
+=================
+
+The **Greyhound Reader** allows you to read point data from a `Greyhound`_ server.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">output.txt</Option>
+      <Option name="spatialreference">EPSG:26910</Option>
+      <Reader type="readers.greyhound">
+        <Option name="url">greyhound.organization.com:8080</Option>
+        <Option name="pipelineId">a87d0a50e03a880c75e9f872c925f984</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+url
+  Greyhound server URL string. [Required]
+
+pipelineId
+  Greyhound pipelineId to read. [Required]
+
+
+.. _Greyhound: https://github.com/hobu/greyhound
diff --git a/doc/stages/readers.las.rst b/doc/stages/readers.las.rst
new file mode 100644
index 0000000..0a46294
--- /dev/null
+++ b/doc/stages/readers.las.rst
@@ -0,0 +1,49 @@
+.. _readers.las:
+
+readers.las
+===========
+
+The **LAS Reader** supports reading from `LAS format`_ files, the standard
+interchange format for LIDAR data.  The reader does NOT support point formats
+containing waveform data (4, 5, 9 and 10).
+
+The reader will accept version 1.4 LAS files and will interpret the extra bytes
+VLR (User ID: LASF_Spec, Record ID: 4) if present.  Two dimensions are
+created for each
+extra byte field with types 11 - 20, "0" and "1" being appended to the field
+name to create the dimension names. Three dimensions are created for each
+extra byte field with types 21-30, "0", "1" and "2" being appended to the field
+name to create the dimension names.  Field type 0 is understood, but the data
+associated with field type 0 is ignored (no PDAL dimension is created).  The
+presence of this VLR overrides the **extra_dims** option.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.las">
+        <Option name="filename">inputfile.las</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  LAS file to read [Required] 
+
+extra_dims
+  Extra dimensions to be read as part of each point beyond those specified by
+  the LAS point format.  The format of the option is
+  <dimension_name>=<type>, ... where type is one of:
+      int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+  '_t' may be added to any of the type names as well (e.g., uint32_t)
+
+.. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+  
diff --git a/doc/stages/readers.mrsid.rst b/doc/stages/readers.mrsid.rst
new file mode 100644
index 0000000..8bedd37
--- /dev/null
+++ b/doc/stages/readers.mrsid.rst
@@ -0,0 +1,38 @@
+.. _readers.mrsid:
+
+readers.mrsid
+=============
+
+Implements MrSID 4.0 LiDAR Compressor. It requires the `Lidar_DSDK`_ to be able to
+decompress and read data.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">outputfile.las</Option>
+      <Reader type="readers.mrsid">
+        <Option name="filename">myfile.sid</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+filename
+  Filename to read from [Required]
+
+
+.. _Lidar_DSDK: https://www.lizardtech.com/developer/
+
+.. _NITF: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
+
+.. _NITF 2.1: http://www.gwg.nga.mil/ntb/baseline/docs/2500c/index.html
+
+.. _DES segment: http://jitc.fhu.disa.mil/cgi/nitf/registers/desreg.aspx
diff --git a/doc/stages/readers.nitf.rst b/doc/stages/readers.nitf.rst
new file mode 100644
index 0000000..87130e4
--- /dev/null
+++ b/doc/stages/readers.nitf.rst
@@ -0,0 +1,51 @@
+.. _readers.nitf:
+
+readers.nitf
+============
+
+The `NITF`_ format is used primarily by the US Department of Defence and
+supports many kinds of data inside a generic wrapper. The `NITF 2.1`_ version
+added support for LIDAR point cloud data, and the **NITF file reader** supports
+reading that data, if the NITF file supports it.
+
+* The file must be NITF 2.1
+* There must be at least one Image segment ("IM").
+* There must be at least one `DES segment`_ ("DE") named "LIDARA".
+* Only LAS or LAZ data may be stored in the LIDARA segment
+
+The dimensions produced by the reader match exactly to the LAS dimension names
+and types for convenience in file format transformation.
+
+.. note::
+    
+    Only LAS or LAZ data may be stored in the LIDARA segment
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">outputfile.las</Option>
+      <Reader type="readers.nitf">
+        <Option name="filename">mynitf.nitf</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+filename
+  Filename to read from [Required]
+
+
+
+.. _NITF: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
+
+.. _NITF 2.1: http://www.gwg.nga.mil/ntb/baseline/docs/2500c/index.html
+
+.. _DES segment: http://jitc.fhu.disa.mil/cgi/nitf/registers/desreg.aspx
diff --git a/doc/stages/readers.oci.rst b/doc/stages/readers.oci.rst
new file mode 100644
index 0000000..eb75c89
--- /dev/null
+++ b/doc/stages/readers.oci.rst
@@ -0,0 +1,61 @@
+.. _readers.oci:
+
+readers.oci
+===========
+
+The OCI reader is used to read data from `Oracle point cloud`_ databases.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">outputfile.las</Option>
+      <Reader type="readers.oci">
+        <Option name="query">
+          SELECT 
+            l."OBJ_ID", l."BLK_ID", l."BLK_EXTENT", 
+            l."BLK_DOMAIN", l."PCBLK_MIN_RES", 
+            l."PCBLK_MAX_RES", l."NUM_POINTS",
+            l."NUM_UNSORTED_POINTS", l."PT_SORT_DIM", 
+            l."POINTS", b.cloud
+          FROM AUTZEN_BLOCKS l, AUTZEN_CLOUD b
+          WHERE l.obj_id = b.id and l.obj_id in (1,2)
+          ORDER BY l.obj_id
+        </Option>
+        <Option name="connection">
+          grid/grid at localhost/orcl
+        </Option>
+        <Option name="populate_pointsourceid">
+          true
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+connection
+  Oracle connection string to connect to database, in the form "user/pass at host/instance" [Required] 
+
+query
+  SELECT statement that returns an SDO_PC object as its first and only queried item [Required]
+  
+spatialreference
+  Spatial reference system of the data being read. E.g. "EPSG:26910".  
+
+xml_schema_dump
+  Filename to dump the XML schema to.
+
+populate_pointsourceid
+  Boolean value. If true, then add in a point cloud to every point read on the PointSourceId dimension. [Default: **false**]
+
+
+.. _Oracle point cloud: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+
diff --git a/doc/stages/readers.optech.rst b/doc/stages/readers.optech.rst
new file mode 100644
index 0000000..700edd8
--- /dev/null
+++ b/doc/stages/readers.optech.rst
@@ -0,0 +1,29 @@
+.. _readers.optech:
+
+readers.optech
+==============
+
+The **Optech reader** reads Corrected Sensor Data (.csd) files.
+These files contain scan angles, ranges, IMU and GNSS information, and boresight calibration values, all of which are combined in the reader into XYZ points using the WGS84 reference frame.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.optech">
+        <Option name="filename">inputfile.csd</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  csd file to read [Required] 
diff --git a/doc/stages/readers.pcd.rst b/doc/stages/readers.pcd.rst
new file mode 100644
index 0000000..101ad52
--- /dev/null
+++ b/doc/stages/readers.pcd.rst
@@ -0,0 +1,34 @@
+.. _readers.pcd:
+
+readers.pcd
+===========
+
+The **PCD Reader** supports reading from `Point Cloud Data (PCD)`_ formatted
+files, which are used by the `Point Cloud Library (PCL)`_.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.pcd">
+        <Option name="filename">inputfile.pcd</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  PCD file to read [Required] 
+
+
+
+.. _Point Cloud Data (PCD): http://pointclouds.org/documentation/tutorials/pcd_file_format.php
+.. _Point Cloud Library (PCL): http://pointclouds.org
+  
diff --git a/doc/stages/readers.pgpointcloud.rst b/doc/stages/readers.pgpointcloud.rst
new file mode 100644
index 0000000..0502d56
--- /dev/null
+++ b/doc/stages/readers.pgpointcloud.rst
@@ -0,0 +1,51 @@
+.. _readers.pgpointcloud:
+
+readers.pgpointcloud
+====================
+
+The **PostgreSQL Pointcloud Reader** allows you to read from a PostgreSQL database that the `PostgreSQL Pointcloud`_ extension enabled. The Pointcloud extension stores point cloud data in tables that contain rows of patches. Each patch in turn contains a large number of spatially nearby points.
+
+The reader pulls patches from a table, potentially sub-setting the query on the way with a "where" clause.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">output.txt</Option>
+      <Option name="spatialreference">EPSG:26910</Option>
+      <Reader type="readers.pgpointcloud">
+        <Option name="connection">dbname='lidar' user='user'</Option>
+        <Option name="table">lidar</Option>
+        <Option name="column">pa</Option>
+        <Option name="spatialreference">EPSG:26910</Option>
+        <Option name="where">
+          PC_Intersects(pa, ST_MakeEnvelope(560037.36, 5114846.45, 562667.31, 5118943.24, 26910))
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+connection
+  PostgreSQL connection string. In the form *"host=hostname dbname=database user=username password=pw port=5432"* [Required] 
+
+table
+  Database table to read from. [Required] 
+
+schema
+  Database schema to read from. [Default: **public**]
+
+column
+  Table column to read patches from. [Default: **pa**]
+
+spatialreference
+  The spatial reference to use for the points. Over-rides the value read from the database.
+
+
+.. _PostgreSQL Pointcloud: https://github.com/pramsey/pointcloud
diff --git a/doc/stages/readers.ply.rst b/doc/stages/readers.ply.rst
new file mode 100644
index 0000000..862ef64
--- /dev/null
+++ b/doc/stages/readers.ply.rst
@@ -0,0 +1,36 @@
+.. _readers.pcd:
+
+readers.ply
+===========
+
+The **ply reader** reads the `polygon file format`_, a common file format for storing three dimensional models.
+The `rply library`_ is included with the PDAL source, so there are no external dependencies.
+
+The ply reader can read ASCII and binary ply files.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">outputfile.txt</Option>
+      <Reader type="readers.ply">
+        <Option name="filename">inputfile.ply</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  ply file to read [Required]
+
+
+
+.. _polygon file format: http://paulbourke.net/dataformats/ply/
+.. _rply library: http://w3.impa.br/~diego/software/rply/
diff --git a/doc/stages/readers.qfit.rst b/doc/stages/readers.qfit.rst
new file mode 100644
index 0000000..213e0c6
--- /dev/null
+++ b/doc/stages/readers.qfit.rst
@@ -0,0 +1,50 @@
+.. _readers.qfit:
+
+readers.qfit
+============
+
+The **QFIT reader** read from files in the `QFIT format`_ originated for the Airborne Topographic Mapper (ATM) project at NASA Goddard Space Flight Center.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">output.las</Option>
+      <Reader type="readers.qfit">
+        <Option name="filename">
+          qfitfile.qi
+        </Option>
+        <Option name="flip_coordinates">
+          false
+        </Option>
+        <Option name="scale_z">
+          1.0
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  File to read from [Required]
+
+flip_coordinates
+  Flip coordinates from 0-360 to -180-180 [Default: **true**] 
+
+scale_z
+  Z scale. Use 0.001 to go from mm to m. [Default: **1**] 
+  
+little_endian
+  Are data in little endian format? This should be automatically detected by the driver.
+
+
+.. _QFIT format: http://nsidc.org/data/docs/daac/icebridge/ilatm1b/docs/ReadMe.qfit.txt
+
+
diff --git a/doc/stages/readers.rxp.rst b/doc/stages/readers.rxp.rst
new file mode 100644
index 0000000..d749dc8
--- /dev/null
+++ b/doc/stages/readers.rxp.rst
@@ -0,0 +1,127 @@
+.. _readers.rxp:
+
+readers.rxp
+===========
+
+The **RXP reader** read from files in the RXP format, the in-house streaming format used by `RIEGL Laser Measurement Systems`_.
+
+.. warning::
+   This software has not been developed by RIEGL, and RIEGL will not provide any support for this driver.
+   Please do not contact RIEGL with any questions or issues regarding this driver.
+   RIEGL is not responsible for damages or other issues that arise from use of this driver.
+   This driver has been tested against RiVLib version 1.39 on a Ubuntu 14.04 using gcc43.
+
+
+Installation
+------------
+
+To build PDAL with rxp support, set RiVLib_DIR to the path of your local RiVLib installation.
+RiVLib can be obtained from the `RIEGL download pages`_ with a properly enabled user account.
+The RiVLib files do not need to be in a system-level directory, though they could be (e.g. they could be in ``/usr/local``, or just in your home directory somewhere).
+For help building PDAL with optional libraries, see `the optional library documentation`_.
+
+
+Example
+-------
+
+This example rescales the points, given in the scanner's own coordinate system, to values that can be written to a las file.
+Only points with a valid gps time, as determined by a pps pulse, are read from the rxp, since the ``sync_to_pps`` option is "true".
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">output.las</Option>
+            <Option name="discard_high_return_numbers">true</Option>
+            <Filter type="filters.scaling">
+                <Option name="dimension">
+                    X
+                    <Options>
+                        <Option name="scale">0.001</Option>
+                        <Option name="offset">0</Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Y
+                    <Options>
+                        <Option name="scale">0.001</Option>
+                        <Option name="offset">0</Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Z
+                    <Options>
+                        <Option name="scale">0.001</Option>
+                        <Option name="offset">0</Option>
+                    </Options>
+                </Option>
+                <Filter type="filters.programmable">
+                    <Option name="source">
+    import numpy
+    def reflectance_to_intensity(ins, outs):
+        ref = ins["Reflectance"]
+        min = numpy.amin(ref)
+        max = numpy.amax(ref)
+        outs["Intensity"] = (65535 * (ref - min) / (max - min)).astype(numpy.uint16)
+        return True
+                    </Option>
+                    <Option name="function">reflectance_to_intensity</Option>
+                    <Option name="module">pyrxp</Option>
+                    <Option name="add_dimension">Intensity</Option>
+                    <Reader type="readers.rxp">
+                        <Option name="filename">120304_204030.rxp</Option>
+                        <Option name="sync_to_pps">true</Option>
+                    </Reader>
+                </Filter>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+A few things to note:
+
+- We use a ``filters.programmable`` to remap Reflectance values to Intensity values, scaling them so the entire range of Reflectance values fit into the Intensity field.
+  This is analogous to the "Export reflectance as intensity" option in RiSCAN Pro.
+  You could also explicitly set the minimum and maximum Reflectance values as you would in RiSCAN Pro using the same programmable filter.
+  You could also use "Amplitude" instead of "Reflectance".
+  If you do not need Intensity values in your output file, you can delete the programmable filter.
+- We set the ``discard_high_return_numbers`` option to ``true`` on the las writer.
+  RXP files can contain more returns per shot than is supported by las, and so we need to explicitly tell the las writer to ignore those high return number points.
+  You could also use ``filters.predicate`` to filter those points earlier in the pipeline, or modify the return values with a ``filters.programmable``.
+
+
+Options
+-------
+
+filename
+  File to read from [Required if rdtp is not provided]
+
+rdtp
+  URI for a network-assessable scanner [Required if filename is not provided]
+
+sync_to_pps
+  If "true", ensure all incoming points have a valid pps timestamp, usually provided by some sort of GPS clock.
+  If "false", use the scanner's internal time.
+  Defaults to "true"
+
+minimal
+  If "true", only write X, Y, Z, and time values to the data stream.
+  If "false", write all available values as derived from the rxp file.
+  Use this feature to reduce the memory footprint of a PDAL run, if you don't need any values but the points themselves.
+  Defaults to "false".
+
+inclination_fix
+  *EXPERIMENTAL*: If "true", use inclination values in the rxp file to dynamically correct for inclination changes throughout the scan, using a moving average of 2 * ``inclination_fix_window`` inclination readings (see below).
+  This is an experimental feature that will remove some points from the data stream and modify many others.
+  Use with caution.
+  If "false", disable this feature.
+  Defaults to "false".
+
+inclination_fix_window
+  *EXPERIMENTAL*: Sets the half-size of the inclination fix window (see above).
+  Use of this feature should be considered highly experimental.
+
+
+.. _RIEGL Laser Measurement Systems: http://www.riegl.com
+.. _RIEGL download pages: http://www.riegl.com/members-area/software-downloads/libraries/
+.. _the optional library documentation: http://www.pdal.io/compilation/unix.html#configure-your-optional-libraries
diff --git a/doc/stages/readers.sbet.rst b/doc/stages/readers.sbet.rst
new file mode 100644
index 0000000..182a106
--- /dev/null
+++ b/doc/stages/readers.sbet.rst
@@ -0,0 +1,30 @@
+.. _readers.sbet:
+
+readers.sbet
+============
+
+The **SBET reader** read from files in the SBET format, used for exchange data from interital measurement units (IMUs).
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">output.las</Option>
+      <Reader type="readers.sbet">
+        <Option name="filename">
+          sbetfile.sbet
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  File to read from [Required]
diff --git a/doc/stages/readers.sqlite.rst b/doc/stages/readers.sqlite.rst
new file mode 100644
index 0000000..f2ac849
--- /dev/null
+++ b/doc/stages/readers.sqlite.rst
@@ -0,0 +1,50 @@
+.. _readers.sqlite:
+
+readers.sqlite
+====================
+
+The `SQLite`_ point cloud reader allows you to 
+read data stored in a SQLite database using a scheme that 
+PDAL wrote using the :ref:`writers.sqlite` writer. Much like 
+the :ref:`writers.oci` and :ref:`writers.pgpointcloud`, the 
+SQLite driver stores data in tables that contain rows of 
+patches. Each patch contains a number of spatially contiguous points
+
+
+Example
+-------
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                output.las
+            </Option>
+            <Reader type="readers.sqlite">
+                <Option name="query">
+                    SELECT b.schema, l.cloud, l.block_id, l.num_points, l.bbox, l.extent, l.points, b.cloud
+                      FROM simple_blocks l, simple_cloud b
+                     WHERE l.cloud = b.cloud and l.cloud in (1)
+                    order by l.cloud
+                </Option>
+                <Option name="connection">
+                    /Users/hobu/dev/git/pdal/test/data/thedata.sqlite
+                </Option>
+            </Reader>
+        </Writer>
+    </Pipeline>
+
+
+Options
+-------
+
+query
+  SQL statement that selects a schema XML, cloud id, bbox, and extent [Required] 
+
+spatialreference
+  The spatial reference to use for the points. Over-rides the value read from the database.
+
+
+.. _SQLite: https://sqlite.org/
diff --git a/doc/stages/writers.bpf.rst b/doc/stages/writers.bpf.rst
new file mode 100644
index 0000000..91b3a8a
--- /dev/null
+++ b/doc/stages/writers.bpf.rst
@@ -0,0 +1,89 @@
+.. _writers.bpf:
+
+writers.bpf
+===========
+
+BPF is an NGA specification for point cloud data. The specification can be
+found at https://nsgreg.nga.mil/doc/view?i=4202 The PDAL **BPF Writer**
+only supports writing of version 3 BPF format files.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.bpf">
+      <Option name="filename">
+        outputfile.bpf
+      </Option>
+      <Reader type="readers.las">
+        <Option name="filename">
+          inputfile.las
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+    BPF file to read.  The writer will accept a filename containing
+    a single placeholder character ('#').  If input to the writer consists
+    of multiple PointViews, each will be written to a separate file, where
+    the placeholder will be replaced with an incrementing integer.  If no
+    placeholder is found, all PointViews provided to the writer are
+    aggregated into a single file for output.  Multiple PointViews are usually
+    the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+    [Required]
+
+compression
+    This option can be set to true to cause the file to be written with Zlib
+    compression as described in the BPF specification.  [Default: false]
+
+format
+    Specifies the format for storing points in the file. [Default: dim]
+
+    * dim == Dimension-major (non-interleaved).  All data for a single dimension
+      are stored contiguously.
+    * point == Point-major (interleaved).  All data for a single point are stored
+      contiguously.
+    * byte == Byte-major (byte-segregated).  All data for a single dimension are
+      stored contiguously, but bytes are arranged such that the first bytes for
+      all points are stored contiguously, followed by the second bytes of all
+      points, etc.  See the BPF specification for further information.
+
+bundledfile
+    Path of file to be written as a bundled file (see specification).  The path
+    part of the filespec is removed and the filename is stored as part of the
+    data.  This option can be specified as many times as desired.
+
+header_data
+    Base64-encoded data that will be decoded and written following the
+    standard BPF header.
+
+coord_id
+    The coordinate ID (UTM zone) of the data.  NOTE: Only the UTM coordinate
+    type is currently supported. [Default: 0, with coordinate type set to none]
+
+scale_x, scale_y, scale_z
+    Scale to be divided from the X, Y and Z nominal values, respectively, after
+    the offset has been applied.  The special value "auto" can be specified,
+    which causes the writer to select a scale to set the stored values of the
+    dimensions to range from [0, 2147483647].  [Default: .01]
+
+    .. note::
+
+        written value = (nominal value - offset) / scale.
+
+offset_x, offset_y, offset_z
+    Offset to be subtracted from the X, Y and Z nominal values, respectively,
+    before the value is scaled.  The special value "auto" can be specified,
+    which causes the writer to set the offset to the minimum value of the
+    dimension.  [Default: 0]
+
+    .. note::
+
+        written value = (nominal value - offset) / scale.
diff --git a/doc/stages/writers.derivative.rst b/doc/stages/writers.derivative.rst
new file mode 100644
index 0000000..8997a57
--- /dev/null
+++ b/doc/stages/writers.derivative.rst
@@ -0,0 +1,52 @@
+.. _writers.derivative:
+
+writers.derivative
+==================
+
+The **Derivative Writer** supports writing of primary topographic attributes.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.derivative">
+      <Option name="filename">
+        outputfile.tiff
+      </Option>
+      <Option name="primitive_type">
+        slope_d8
+      </Option>
+      <Reader type="readers.las">
+        <Option name="filename">
+          inputfile.las
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  GeoTiff file to write.  [Required]
+
+primitive_type
+  Topographic attribute to compute.  [Default: slope_d8]
+
+  * slope_d8
+  * slope_fd
+  * aspect_d8
+  * aspect_fd
+  * contour_curvature
+  * profile_curvature
+  * tangential_curvature
+  * total_curvature
+  * hillshade
+  * catchment_area
+
+grid_dist_x, grid_dist_y
+  Size of grid cell in X and Y dimensions using native units of the input point
+  cloud.  [Default: 15.0]
diff --git a/doc/stages/writers.geowave.rst b/doc/stages/writers.geowave.rst
new file mode 100644
index 0000000..06d921f
--- /dev/null
+++ b/doc/stages/writers.geowave.rst
@@ -0,0 +1,66 @@
+.. _writers.geowave:
+
+writers.geowave
+============
+
+The **GeoWave writer** uses `GeoWave`_ to write to Accumulo.  GeoWave entries are stored using EPSG:4326.  Instructions for configuring the GeoWave plugin can be found `here`_
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.geowave">
+      <Option name="zookeeperUrl">zookeeper1:2181,zookeeper2:2181,zookeeper3:2181</Option>
+      <Option name="instanceName">GeoWave</Option>
+      <Option name="username">user</Option>
+      <Option name="password">pass</Option>
+      <Option name="tableNamespace">PDAL_Table</Option>
+      <Option name="featureTypeName">PDAL_Point</Option>
+      <Option name="dataAdapter">FeatureCollectionDataAdapter</Option>
+      <Option name="pointsPerEntry">5000u</Option>
+      <Filter type="filters.reprojection">
+        <Option name="out_srs">EPSG:4326</Option>
+        <Reader type="readers.qfit">
+          <Option name="filename">qfitfile.qi</Option>
+          <Option name="flip_coordinates">false</Option>
+          <Option name="scale_z">1.0</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+zookeeperUrl
+  The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance. [Required]
+
+instanceName
+  The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance. [Required]
+
+username
+  The username for the account to establish an Accumulo connector. [Required]
+
+password
+  The password for the account to establish an Accumulo connector. [Required]
+
+tableNamespace
+  The table name to be used when interacting with GeoWave. [Required]
+
+featureTypeName
+  The feature type name to be used when ineracting GeoWave. [Default: PDAL_Point]
+
+dataAdapter
+  FeatureCollectionDataAdapter stores multiple points per Accumulo entry. FeatureDataAdapter stores a single point per Accumulo entry. [Default: FeatureCollectionDataAdapter]
+
+pointsPerEntry
+  Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter. [Default: 5000u]  
+
+
+.. _GeoWave: https://ngageoint.github.io/geowave/
+.. _here: https://ngageoint.github.io/geowave/documentation.html#jace-jni-proxies-2
+
diff --git a/doc/stages/writers.las.rst b/doc/stages/writers.las.rst
new file mode 100644
index 0000000..2492a4a
--- /dev/null
+++ b/doc/stages/writers.las.rst
@@ -0,0 +1,155 @@
+.. _writers.las:
+
+writers.las
+===========
+
+The **LAS Writer** supports writing to `LAS format`_ files, the standard
+interchange file format for LIDAR data.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.las">
+      <Option name="filename">
+        outputfile.las
+      </Option>
+      <Reader type="readers.las">
+        <Option name="filename">
+          inputfile.las
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  LAS file to read. The writer will accept a filename containing
+  a single placeholder character ('#').  If input to the writer consists
+  of multiple PointViews, each will be written to a separate file, where
+  the placeholder will be replaced with an incrementing integer.  If no
+  placeholder is found, all PointViews provided to the writer are
+  aggregated into a single file for output.  Multiple PointViews are usually
+  the result of using :ref:`filters.splitter` or :ref:`filters.chipper`. 
+  [Required]
+
+forward
+  List of header fields whose values should be preserved from a source
+  LAS file.  The
+  option can be specified multiple times, which has the same effect as
+  listing values separated by a comma.  The following values are valid:
+  'major_version', 'minor_version', 'dataformat_id', 'filesource_id',
+  'global_encoding', 'project_id', 'system_id', 'software_id', 'creation_doy',
+  'creation_year', 'scale_x', 'scale_y', 'scale_z', 'offset_x', 'offset_y',
+  'offset_z'.  In addition, the special value 'header' can be specified,
+  which is equivalent to specifying all the values EXCEPT the scale and
+  offset values.  Scale and offset values can be forwarded as a group by
+  using the special values 'scale' and 'offset' respectively.  The special
+  value 'all' is equivalent to specifying 'header', 'scale', 'offset' and
+  'vlr' (see below).
+  If a header option is specified explicitly, it will override any forwarded
+  header value.
+  If a LAS file is the result of multiple LAS input files, the header values
+  to be forwarded must match or they will be ignored and a default will
+  be used instead.
+
+  VLRs can be forwarded by using the special value 'vlr'.  VLRs containing
+  the following User IDs are NOT forwarded: 'LASF_Projection', 'LASF_Spec',
+  'liblas', 'laszip encoded'.  These VLRs are known to contain information
+  regarding the formatting of the data and will be rebuilt properly in the
+  output file as necessary.  Unlike header values, VLRs from multiple input
+  files are accumulated and each is written to the output file.  Forwarded
+  VLRs may contain duplicate User ID/Record ID pairs.
+  
+minor_version
+  All LAS files are version 1, but the minor version (0 - 4) can be specified
+  with this option. [Default: 3]
+
+software_id
+  String identifying the software that created this LAS file.
+  [Default: PDAL version num (build num)]"
+
+creation_doy
+  Number of the day of the year (January 1 == 0, Dec 31 == 365) this file is
+  being created.
+  
+creation_year
+  Year (Gregorian) this file is being created.
+  
+dataformat_id
+  Controls whether information about color and time are stored with the point
+  information in the LAS file. [Default: 3]
+  
+  * 0 == no color or time stored
+  * 1 == time is stored
+  * 2 == color is stored
+  * 3 == color and time are stored 
+  * 4 [Not Currently Supported]
+  * 5 [Not Currently Supported]
+  * 6 == time is stored (version 1.4+ only)
+  * 7 == time and color are stored (version 1.4+ only)
+  * 8 == time, color and near infrared are stored (version 1.4+ only)
+  * 9 [Not Currently Supported]
+  * 10 [Not Currently Supported]
+  
+system_id
+  String identifying the system that created this LAS file. [Default: "PDAL"]
+  
+a_srs
+  The spatial reference system of the file to be written. Can be an EPSG string (eg "EPSG:268910") or a WKT string. [Default: Not set]
+  
+global_encoding
+  Various indicators to describe the data.  See the LAS documentation.  Note
+  that PDAL will always set bit four when creating LAS version output.
+  [Default: 0]
+
+project_id
+  UID reserved for the user [Default: Nil UID]
+
+compression
+  Set to true to apply compression to the output, creating a LAZ file instead
+  of an LAS file.  Requires PDAL to have been built with compression support
+  by linking with LASzip.  [Default: false]
+
+scale_x, scale_y, scale_z
+  Scale to be divided from the X, Y and Z nominal values, respectively, after
+  the offset has been applied.  The special value "auto" can be specified,
+  which causes the writer to select a scale to set the stored values of the
+  dimensions to range from [0, 2147483647].  [Default: .01]
+
+  Note: written value = (nominal value - offset) / scale.
+
+offset_x, offset_y, offset_z
+   Offset to be subtracted from the X, Y and Z nominal values, respectively,
+   before the value is scaled.  The special value "auto" can be specified,
+   which causes the writer to set the offset to the minimum value of the
+   dimension.  [Default: 0]
+
+   Note: written value = (nominal value - offset) / scale.
+  
+filesource_id
+  The file source id number to use for this file (a value between
+  1 and 65535) [Default: 0]
+
+discard_high_return_numbers
+  If true, discard all points with a return number greater than the maximum
+  supported by the point format (5 for formats 0-5, 15 for formats 6-10).
+  [Default: false]
+
+extra_dims
+  Extra dimensions to be written as part of each point beyond those specified
+  by the LAS point format.  The format of the option is
+  <dimension_name>=<type>, ... where type is one of:
+      int8, int16, int32, int64, uint8, uint16, uint32, uint64, float, double
+  '_t' may be added to any of the type names as well (e.g., uint32_t).  When
+  the version of the output file is specified as 1.4 or greater, an extra
+  bytes VLR (User ID: LASF_Spec, Record ID: 4), is created that describes the
+  extra dimensions specified by this option.
+
+.. _LAS format: http://asprs.org/Committee-General/LASer-LAS-File-Format-Exchange-Activities.html
+  
diff --git a/doc/stages/writers.matlab.rst b/doc/stages/writers.matlab.rst
new file mode 100644
index 0000000..4b9eb0b
--- /dev/null
+++ b/doc/stages/writers.matlab.rst
@@ -0,0 +1,41 @@
+.. _writers.matlab:
+
+writers.matlab
+==============
+
+The **Matlab Writer** supports writing Matlab `.mat` files.
+
+The produced files have two variables, `Dimensions` and `Points`.
+`Dimensions` is a comma-delimited list of dimension names, and `Points` is a double array of all dimensions of every points.
+Note that this output array can get very large very quickly.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.matlab">
+      <Option name="filename">
+        outputfile.mat
+      </Option>
+      <Option name="output_dims">
+        X,Y,Z,Intensity
+      </Option>
+      <Reader type="readers.las">
+        <Option name="filename">
+          inputfile.las
+        </Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  Output file name [REQUIRED]
+
+output_dims
+  Dimensions to include in the output file [OPTIONAL, defaults to all available dimensions]
diff --git a/doc/stages/writers.nitf.rst b/doc/stages/writers.nitf.rst
new file mode 100644
index 0000000..3f75326
--- /dev/null
+++ b/doc/stages/writers.nitf.rst
@@ -0,0 +1,89 @@
+.. _writers.nitf:
+
+writers.nitf
+============
+
+The `NITF`_ format is a US Department of Defense format for the transmission
+of imagery.  It supports various formats inside a generic wrapper.  However,
+the PDAL NITF writer only supports LAS/LAZ data.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.nitf">
+      <Option name="filename">mynitf.nitf</Option>
+      <Option name="ONAME">James Alexander</Option>
+      <Option name="OPHONE">646-322-3123</Option>
+      <Reader type="readers.las">
+        <Option name="filename">inputfile.las</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+
+Options
+-------
+
+filename
+  NITF file to write.  The writer will accept a filename containing
+  a single placeholder character ('#').  If input to the writer consists
+  of multiple PointViews, each will be written to a separate file, where
+  the placeholder will be replaced with an incrementing integer.  If no
+  placeholder is found, all PointViews provided to the writer are
+  aggregated into a single file for output.  Multiple PointViews are usually
+  the result of using :ref:`filters.splitter` or :ref:`filters.chipper`.
+
+CLEVEL
+  File complexity level (2 characters) [Default: **03**]
+  
+STYPE
+  Standard type (4 characters) [Default: **BF01**]
+
+OSTAID
+  Originating station ID (10 characters) [Default: **PDAL**]
+
+FTITLE
+  File title (80 characters) [Default: <spaces>]
+
+FSCLAS
+  File security classification ('T', 'S', 'C', 'R' or 'U') [Default: **U**]
+
+ONAME
+  Originator name (24 characters) [Default: <spaces>]
+
+OPHONE
+  Originator phone (18 characters) [Default: <spaces>]
+
+FSCTLH
+  File control and handling (2 characters) [Default: <spaces>]
+
+FSCLSY
+  File classification system (2 characters) [Default: <spaces>]
+
+IDATIM
+  Image date and time (format: 'CCYYMMDDhhmmss') [Default: <spaces>]
+
+IID2
+  Image identifier 2 (80 characters) [Default: <spaces>]
+
+FSCLTX
+  File classification text (43 characters) [Default: <spaces>]
+
+AIMIDB
+  Option tag that should contain further options to complete the AIMIDB
+  (Additional Image ID) TRE record [Default: None]
+
+ACFTB
+  Option tag that should contain further options to complete the ACFTB
+  (Aircraft Information) TRE record [Default: None]
+
+
+.. _NITF: http://en.wikipedia.org/wiki/National_Imagery_Transmission_Format
+
+.. _NITF 2.1: http://www.gwg.nga.mil/ntb/baseline/docs/2500c/index.html
+
+.. _DES segment: http://jitc.fhu.disa.mil/cgi/nitf/registers/desreg.aspx
diff --git a/doc/stages/writers.null.rst b/doc/stages/writers.null.rst
new file mode 100644
index 0000000..7f7d90d
--- /dev/null
+++ b/doc/stages/writers.null.rst
@@ -0,0 +1,33 @@
+.. _writers.text:
+
+writers.null
+============
+
+The **null writer** discards its input.  No point output is produced when using
+a **null writer**.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.null">
+      <Filter type="filters.hexbin">
+        <Reader type="readers.las">
+          <Option name="filename">simple.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+When used with an option that forces metadata output, like
+--pipeline-serialization, this pipeline will create a hex boundary for
+the input file, but no output point data file will be produced.
+
+Options
+-------
+
+The **null writer** discards all passed options.
+
diff --git a/doc/stages/writers.oci.rst b/doc/stages/writers.oci.rst
new file mode 100644
index 0000000..415d994
--- /dev/null
+++ b/doc/stages/writers.oci.rst
@@ -0,0 +1,167 @@
+.. _writers.oci:
+
+writers.oci
+===========
+
+The OCI writer is used to write data to `Oracle point cloud`_ databases.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.oci">
+      <Option name="connection">
+        lidar/lidar at oracle.hobu.biz/lidar
+      </Option>
+      <Option name="base_table_name">
+        QFIT_CLOUD
+      </Option>
+      <Option name="block_table_name">
+        QFIT_BLOCKS
+      </Option>
+      <Option name="cloud_column_name">
+        CLOUD
+      </Option>
+      <Option name="is3d">
+        false
+      </Option>
+      <Option name="solid">
+        false
+      </Option>
+      <Option name="overwrite">
+        false
+      </Option>
+      <Option name="srid">
+        4269
+      </Option>
+      <Option name="capacity">
+        5000
+      </Option>
+      <Option name="stream_output_precision">
+        8
+      </Option>
+      <Filter type="filters.chipper">
+        <Option name="capacity">
+          5000
+        </Option>
+        <Filter type="filters.cache">
+          <Option name="max_cache_blocks">
+            1
+          </Option>
+          <Option name="cache_block_size">
+            50000000
+          </Option>
+          <Reader type="readers.las">
+            <Option name="filename">
+              file.las
+            </Option>
+          </Reader>
+        </Filter>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+
+
+Options
+-------
+
+connection
+  Oracle connection string to connect to database
+
+is3d
+  Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, and indexing [Default: **false**]
+
+solid
+  Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) instead of the normal (1,1003,3), and use gtype 3008/2008 vs 3003/2003 for BLK_EXTENT geometry values.  [Default: **false**]
+
+overwrite
+  Wipe the block table and recreate it before loading data [Default: **false**]
+
+verbose
+  Wipe the block table and recreate it before loading data  [Default: **false**]
+  
+srid
+  The Oracle numerical SRID value to use for PC_EXTENT, BLK_EXTENT, and indexing  [Default: **0**]
+  
+capacity
+  The block capacity or maximum number of points a block can contain  [Default: **0**]
+
+stream_output_precision
+  The number of digits past the decimal place for outputting floats/doubles to streams. This is used for creating the SDO_PC object and adding the index entry to the USER_SDO_GEOM_METADATA for the block table  [Default: **8**]
+
+cloud_id 
+  The point cloud id that links the point cloud object to the entries in the block table.  [Default: **-1**]
+
+block_table_name
+  The table in which block data for the created SDO_PC will be placed  [Default: **output**]
+
+block_table_partition_column
+  The column name for which 'block_table_partition_value' will be placed in the 'block_table_name'
+  
+block_table_partition_value
+  Integer value to use to assing partition IDs in the block table. Used in conjunction with 'block_table_partition_column'  [Default: **0**]
+  
+base_table_name
+  The name of the table which will contain the SDO_PC object [Default: **hobu**]
+
+cloud_column_name
+ The column name in 'base_table_name' that will hold the SDO_PC object [Default: **CLOUD**]
+
+base_table_aux_columns
+  Quoted, comma-separated list of columns to add to the SQL that gets executed as part of the point cloud insertion into the 'base_table_name' table
+  
+base_table_aux_values
+  Quoted, comma-separated values that correspond to 'base_table_aux_columns', entries that will get inserted as part of the creation of the SDO_PC entry in the 'base_table_name' table
+
+base_table_boundary_column
+  The SDO_GEOMETRY column in 'base_table_name' in which to insert the WKT in 'base_table_boundary_wkt' representing a boundary for the SDO_PC object. Note this is not the same as the 'base_table_bounds', which is just a bounding box that is placed on the SDO_PC object itself.
+  
+base_table_boundary_wkt
+  WKT, in the form of a string or a file location, to insert into the SDO_GEOMTRY column defined by 'base_table_boundary_column'
+
+pre_block_sql
+  SQL, in the form of a string or file location, that is executed after the SDO_PC object has been created but before the block data in 'block_table_name' are inserted into the database
+
+pre_sql
+  SQL, in the form of a string or file location, that is executed before the SDO_PC object is created.
+
+post_block_sql
+  SQL, in the form of a string or file location, that is executed after the block data in 'block_table_name' have been inserted
+
+base_table_bounds
+  A bounding box, given in the Oracle SRID specified in 'srid' to set on the PC_EXTENT object of the SDO_PC. If none is specified, the cumulated bounds of all of the block data are used.
+
+pc_id
+  Point Cloud id [Default: **-1**]
+
+pack_ignored_fields
+  Pack ignored dimensions out of the data buffer that is written [Default: **true**]
+  
+do_trace
+  turn on server-side binds/waits tracing -- needs ALTER SESSION privs [Default: **false**]
+  
+stream_chunks
+  Stream block data chunk-wise by the DB's chunk size rather than as an entire blob" [Default: **false**]
+  
+blob_chunk_count
+  When streaming, the number of chunks per write to use [Default: **16**]
+
+scale_x, scale_y, scale_z / offset_x, offset_y, offset_z
+  If ANY of these options are specified the X, Y and Z dimensions are adjusted
+  by subtracting the offset and then dividing the values by the specified
+  scaling factor before being written as 32-bit integers (as opposed to double
+  precision values).  If any of these options is specified, unspecified
+  scale_<x,y,x> options are given the value of 1.0 and unspecified
+  offset_<x,y,z> are given the value of 0.0.
+
+output_dims
+  If specified, limits the dimensions written for each point.  Dimensions
+  are listed by name and separated by commas.
+
+.. _Oracle point cloud: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+
diff --git a/doc/stages/writers.p2g.rst b/doc/stages/writers.p2g.rst
new file mode 100644
index 0000000..52f2864
--- /dev/null
+++ b/doc/stages/writers.p2g.rst
@@ -0,0 +1,103 @@
+.. _writers.p2g:
+
+writers.p2g
+===========
+
+The **points to grid writer** takes in a stream of point data and writes out
+gridded summaries of the stream. Each cell in the output grids can give one of
+the: minimum value, maximum value, average value, average value, inverse
+distance weighted interpolation (for sparse points), or density. The points to
+grid writer supports creating multiple output grids simultaneously, so it is
+possible to generate all grid variants in one pass.
+
+
+.. note::
+
+    A project called `lidar2dems`_ by `Applied GeoSolutions`_ integrates the P2G
+    writer and other PDAL components into a series of scripts and utilities that
+    make it more convenient to do DEM production with PDAL.
+
+.. _`lidar2dems`: https://github.com/Applied-GeoSolutions/lidar2dems
+.. _`Applied GeoSolutions`: http://www.appliedgeosolutions.com/
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.p2g">
+      <Option name="grid_dist_x">
+        6.0
+      </Option>
+      <Option name="grid_dist_y">
+        6.0
+      </Option>
+      <Option name="radius">
+        8.4852813742385713
+      </Option>
+      <Option name="filename">
+        autzen_grid
+      </Option>
+      <Option name="output_type">
+        min
+      </Option>
+      <Option name="output_type">
+        max
+      </Option>
+      <Option name="output_type">
+        mean
+      </Option>
+      <Option name="output_type">
+        idw
+      </Option>
+      <Option name="output_type">
+        den
+      </Option>
+      <Option name="output_format">
+        grid
+      </Option>
+        <Filter type="filters.inplacereprojection">
+          <Option name="out_srs">
+            EPSG:26910
+          </Option>
+          <Option name="scale_x">
+            0.01
+          </Option>
+          <Option name="scale_y">
+            0.01
+          </Option>
+          <Reader type="readers.las">
+            <Option name="filename">
+              ../1.2-with-color.las
+            </Option>
+            <Option name="spatialreference">
+              ../1.2-with-color.las.wkt
+            </Option>
+          </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+grid_dist_x
+  Size of grid cell in x dimension [Default: **6**]
+
+grid_dist_y
+  Size of grid cell in y dimension. [Default: **6**]
+
+radius
+  ??? [Default: **8.48528**]
+
+filename
+  Base file name for output files. [Required]
+
+output_type
+  One or many options, specifying "min", "max", "mean", "idw" (inverse distance weighted), "den" (density), or "all" to get all variants with just one option. [Default: **all**]
+
+output_format
+  File output format to use, one of "grid", "tif", or "asc". [Default: **grid**]
+
diff --git a/doc/stages/writers.pcd.rst b/doc/stages/writers.pcd.rst
new file mode 100644
index 0000000..3889ef3
--- /dev/null
+++ b/doc/stages/writers.pcd.rst
@@ -0,0 +1,42 @@
+.. _writers.pcd:
+
+writers.pcd
+===========
+
+The **PCD Writer** supports writing to `Point Cloud Data (PCD)`_ formatted
+files, which are used by the `Point Cloud Library (PCL)`_.
+
+By default, compression is not enabled, and the PCD writer will output ASCII
+formatted data. When compression is enabled, the output is PCD's
+binary-compressed format.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.pcd">
+      <Option name="filename">outputfile.pcd</Option>
+      
+      <Reader type="readers.pcd">
+        <Option name="filename">inputfile.pcd</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  PCD file to write [Required] 
+
+compression
+  Apply compression to the PCD file? [Default: false]
+  
+
+
+.. _Point Cloud Data (PCD): http://pointclouds.org/documentation/tutorials/pcd_file_format.php
+.. _Point Cloud Library (PCL): http://pointclouds.org
+ 
diff --git a/doc/stages/writers.pclvisualizer.rst b/doc/stages/writers.pclvisualizer.rst
new file mode 100644
index 0000000..a19f9bb
--- /dev/null
+++ b/doc/stages/writers.pclvisualizer.rst
@@ -0,0 +1,21 @@
+.. _writers.pclvisualizer:
+
+writers.pclvisualizer
+=====================
+
+The **PCLVisualizer Writer** enables use of the `Point Cloud Library (PCL)`_
+PCLVisualizer. This is primarily used by :ref:`pdal view <view_command>`.
+
+Options
+-------
+
+filename
+  PCD file to write [Required] 
+
+.. note::
+
+    A filename is currently required by PDAL, but no data is written to disk.
+
+
+.. _Point Cloud Library (PCL): http://pointclouds.org
+ 
diff --git a/doc/stages/writers.pgpointcloud.rst b/doc/stages/writers.pgpointcloud.rst
new file mode 100644
index 0000000..c6e9099
--- /dev/null
+++ b/doc/stages/writers.pgpointcloud.rst
@@ -0,0 +1,85 @@
+.. _writers.pgpointcloud:
+
+writers.pgpointcloud
+====================
+
+The **PostgreSQL Pointcloud Writer** allows you to write to PostgreSQL database that have the `PostgreSQL Pointcloud`_ extension enabled. The Pointcloud extension stores point cloud data in tables that contain rows of patches. Each patch in turn contains a large number of spatially nearby points.
+
+While you can theoretically store the contents of a whole file of points in a single patch, it is more practical to store a table full of smaller patches, where the patches are under the PostgreSQL page size (8kb). For most LIDAR data, this practically means a patch size of between 400 and 600 points.
+
+In order to create patches of the right size, the Pointcloud writer should be preceded in the pipeline file by :ref:`filters.chipper`.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.pgpointcloud">
+      <Option name="connection">
+        host='localhost' dbname='lidar' user='pramsey'
+      </Option>
+      <Option name="table">example</Option>
+      <Option name="compression">dimensional</Option>
+      <Option name="srid">26916</Option>
+      <Filter type="filters.chipper">
+        <Option name="capacity">400</Option>
+        <Reader type="readers.las">
+            <Option name="filename">example.las</Option>
+            <Option name="spatialreference">EPSG:26916</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+connection
+  PostgreSQL connection string. In the form *"host=hostname dbname=database user=username password=pw port=5432"* [Required] 
+
+table
+  Database table to write to. [Required] 
+
+schema
+  Database schema to write to. [Default: **public**]
+
+column
+  Table column to put patches into. [Default: **pa**]
+  
+compression
+  Patch compression type to use. [Default: **dimensional**]
+  
+  * **none** applies no compression
+  * **dimensional** applies dynamic compression to each dimension separately
+  * **ght** applies a "geohash tree" compression by sorting the points into a prefix tree
+  
+overwrite
+  To drop the table before writing set to 'true'. To append to the table set to 'false'. [Default: **true**]
+
+srid
+  Spatial reference ID (relative to the `spatial_ref_sys` table in PostGIS) to store with the point cloud schema. [Default: **4326**]
+  
+pcid
+  An optional existing PCID to use for the point cloud schema. If specified, the schema must be present. If not specified, a match will still be looked for, or a new schema will be inserted.
+
+pre_sql
+  Optional SQL to execute *before* running the translation. If the value references a file, the file is read and any SQL inside is executed. Otherwise the value is executed as SQL itself.
+
+post_sql
+  Optional SQL to execute *after* running the translation. If the value references a file, the file is read and any SQL inside is executed. Otherwise the value is executed as SQL itself.
+  
+scale_x, scale_y, scale_z / offset_x, offset_y, offset_z
+  If ANY of these options are specified the X, Y and Z dimensions are adjusted
+  by subtracting the offset and then dividing the values by the specified
+  scaling factor before being written as 32-bit integers (as opposed to double
+  precision values).  If any of these options is specified, unspecified
+  scale_<x,y,x> options are given the value of 1.0 and unspecified
+  offset_<x,y,z> are given the value of 0.0.
+
+output_dims
+  If specified, limits the dimensions written for each point.  Dimensions
+  are listed by name and separated by commas.
+
+.. _PostgreSQL Pointcloud: http://github.com/pramsey/pointcloud
diff --git a/doc/stages/writers.ply.rst b/doc/stages/writers.ply.rst
new file mode 100644
index 0000000..325195e
--- /dev/null
+++ b/doc/stages/writers.ply.rst
@@ -0,0 +1,46 @@
+.. _writers.ply:
+
+writers.ply
+===========
+
+The **ply writer** writes the `polygon file format`_, a common file format for storing three dimensional models.
+The `rply library`_ is included with the PDAL source, so there are no external dependencies.
+
+Use the ``storage_mode`` option to choose the type of ply file to write.
+You can choose from:
+
+- ``default``: write a binary ply file using your host's byte ordering.
+  If you do not specify a ``storage_mode``, this is the default.
+- ``ascii``: write an ascii file (warning: these can be HUGE).
+- ``little endian``: write a binary ply file with little endian byte ordering.
+- ``big endian``: write a binary ply file with big endian byte ordering.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.ply">
+      <Option name="filename">outputfile.ply</Option>
+      <Option name="storage_mode">little endian</Option>
+      <Reader type="readers.las">
+        <Option name="filename">inputfile.las</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  ply file to write [Required] 
+
+storage_mode
+  Type of ply file to write [default: host-ordered binary]
+  
+
+.. _polygon file format: http://paulbourke.net/dataformats/ply/
+.. _rply library: http://w3.impa.br/~diego/software/rply/
diff --git a/doc/stages/writers.rialto.rst b/doc/stages/writers.rialto.rst
new file mode 100644
index 0000000..1034c37
--- /dev/null
+++ b/doc/stages/writers.rialto.rst
@@ -0,0 +1,44 @@
+.. _writers.rialto:
+
+writers.rialto
+==============
+
+The **RialtoWriter** supports writing to `Rialto-formatted
+tiles <http://lists.osgeo.org/pipermail/pointdown/2015-February/000001.html>`__.
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.rialto">
+      <Option name="filename">output.ria</Option>
+      <Option name="max_levels">18</Option>
+      <Option name="overwrite">true</Option>
+      <Filter type="filters.reprojection">
+        <Option name="out_srs">EPSG:4326</Option>
+        <Reader type="readers.las">
+          <Option name="filename">input.las</Option>
+        </Reader>
+      </Filter>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  The **directory** to stage the Rialto tiles in. An exception will be thrown
+  if the directory exists, unless the overwrite option is set to true (see
+  below). [Required]
+
+max_levels
+  The maximum number of levels in the quadtree. Each rectangular node at level
+  L reduces to 4 equally-sized nodes at level L+1. Each tile at level N-1
+  contains 1/4 of the points contained in the level N nodes. [Default: 16]
+
+overwrite
+  Delete the target directory prior to writing results? [Default: false]
+  
diff --git a/doc/stages/writers.sqlite.rst b/doc/stages/writers.sqlite.rst
new file mode 100644
index 0000000..5dca0b7
--- /dev/null
+++ b/doc/stages/writers.sqlite.rst
@@ -0,0 +1,89 @@
+.. _writers.sqlite:
+
+writers.sqlite
+====================
+
+The `SQLite`_ driver outputs point cloud data into a PDAL-sepecific scheme 
+that matches the approach of :ref:`readers.pgpointcloud` and :ref:`readers.oci`. 
+
+Example
+-------
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.sqlite">
+            <Option name="connection">
+                output.sqlite
+            </Option>
+            <Option name="cloud_table_name">
+                SIMPLE_CLOUD
+            </Option>
+            <Option name="pre_sql"/>
+            <Option name="post_sql"/>
+            <Option name="block_table_name">
+                SIMPLE_BLOCKS
+            </Option>
+            <Option name="cloud_column_name">
+                CLOUD
+            </Option>
+      
+            <Filter type="filters.chipper">
+                <Option name="capacity">
+                    50
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        latlon.las
+                    </Option>
+                    <Option name="spatialreference">
+                        EPSG:4326
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+
+
+Options
+-------
+
+connection
+  SQLite filename [Required] 
+
+cloud_table_name
+  Name of table to store cloud (file) information [Required]
+
+block_table_name
+  Name of table to store patch information [Required]
+
+cloud_column_name
+  Name of column to store primary cloud_id key [Default: **cloud**]
+
+compression
+  Use https://github.com/verma/laz-perf compression technique to store patches
+
+overwrite
+  To drop the table before writing set to 'true'. To append to the table set to 'false'. [Default: **true**]
+
+pre_sql
+  Optional SQL to execute *before* running the translation. If the value references a file, the file is read and any SQL inside is executed. Otherwise the value is executed as SQL itself.
+
+post_sql
+  Optional SQL to execute *after* running the translation. If the value references a file, the file is read and any SQL inside is executed. Otherwise the value is executed as SQL itself.
+  
+scale_x, scale_y, scale_z / offset_x, offset_y, offset_z
+  If ANY of these options are specified the X, Y and Z dimensions are adjusted
+  by subtracting the offset and then dividing the values by the specified
+  scaling factor before being written as 32-bit integers (as opposed to double
+  precision values).  If any of these options is specified, unspecified
+  scale_<x,y,x> options are given the value of 1.0 and unspecified
+  offset_<x,y,z> are given the value of 0.0.
+
+output_dims
+  If specified, limits the dimensions written for each point.  Dimensions
+  are listed by name and separated by commas.
+
+.. _SQLite: http://sqlite.org
diff --git a/doc/stages/writers.text.rst b/doc/stages/writers.text.rst
new file mode 100644
index 0000000..e7e8c26
--- /dev/null
+++ b/doc/stages/writers.text.rst
@@ -0,0 +1,59 @@
+.. _writers.text:
+
+writers.text
+============
+
+The **text writer** writes out to a text file. This is useful for debugging or getting smaller files into an easily parseable format.  The text writer supports both `GeoJson`_ and `CSV`_ output.
+
+
+Example
+-------
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="utf-8"?>
+  <Pipeline version="1.0">
+    <Writer type="writers.text">
+      <Option name="filename">output.js</Option>
+      <Option name="format">geojson</Option>
+      <Option name="order">X,Y,Z</Option>
+      <Option name="keep_unspecified">false</Option>
+      <Reader type="readers.qfit">
+        <Option name="filename">qfitfile.qi</Option>
+        <Option name="flip_coordinates">false</Option>
+        <Option name="scale_z">1.0</Option>
+      </Reader>
+    </Writer>
+  </Pipeline>
+
+Options
+-------
+
+filename
+  File to write to, or "STDOUT" to write to standard out [Required]
+
+format
+  Output format to use. One of "geojson" or "csv". [Default: **csv**] 
+
+order
+  Comma-separated list of dimension names, giving the desired column order in the output file, for example "X,Y,Z,Red,Green,Blue". [Default: none]
+  
+keep_unspecified
+  Should we output any fields that are not specified in the dimension order? [Default: **true**]
+
+jscallback
+  When producing GeoJSON, the callback allows you to wrap the data in a function, so the output can be evaluated in a <script> tag.
+  
+quote_header
+  When producing CSV, should the column header named by quoted? [Default: **true**]
+  
+newline
+  When producing CSV, what newline character should be used? (For Windows, "\\r\\n" is common.) [Default: **\\n**]
+  
+delimiter
+  When producing CSV, what character to use as a delimiter? [Default: **,**]  
+
+
+.. _GeoJson: http://geojson.org
+.. _CSV: http://en.wikipedia.org/wiki/Comma-separated_values
+
diff --git a/doc/tutorial/after-front1.png b/doc/tutorial/after-front1.png
new file mode 100644
index 0000000..edeb25f
Binary files /dev/null and b/doc/tutorial/after-front1.png differ
diff --git a/doc/tutorial/after-front2.png b/doc/tutorial/after-front2.png
new file mode 100644
index 0000000..a4b24b2
Binary files /dev/null and b/doc/tutorial/after-front2.png differ
diff --git a/doc/tutorial/after-front3.png b/doc/tutorial/after-front3.png
new file mode 100644
index 0000000..1d2549e
Binary files /dev/null and b/doc/tutorial/after-front3.png differ
diff --git a/doc/tutorial/after-top1.png b/doc/tutorial/after-top1.png
new file mode 100644
index 0000000..a5593ea
Binary files /dev/null and b/doc/tutorial/after-top1.png differ
diff --git a/doc/tutorial/after-top2.png b/doc/tutorial/after-top2.png
new file mode 100644
index 0000000..1404fd7
Binary files /dev/null and b/doc/tutorial/after-top2.png differ
diff --git a/doc/tutorial/after-top3.png b/doc/tutorial/after-top3.png
new file mode 100644
index 0000000..c6fd2c9
Binary files /dev/null and b/doc/tutorial/after-top3.png differ
diff --git a/doc/tutorial/index.rst b/doc/tutorial/index.rst
new file mode 100644
index 0000000..bcf7754
--- /dev/null
+++ b/doc/tutorial/index.rst
@@ -0,0 +1,40 @@
+.. _tutorial:
+
+******************************************************************************
+Tutorials
+******************************************************************************
+
+This section provides tutorial-level information on various aspects of PDAL,
+from command-line use to plugin development.
+
+Getting Started
+---------------
+
+.. toctree::
+   :maxdepth: 1
+
+   using
+   overview
+
+Using PDAL
+----------
+
+.. toctree::
+   :maxdepth: 1
+
+   reading
+   writing
+   pcl_block_tutorial
+   pcl_ground
+
+Developing
+----------
+
+.. toctree::
+   :maxdepth: 1
+
+   writing-filter
+   writing-kernel
+   writing-reader
+   writing-writer
+   liblas_to_pdal
diff --git a/doc/tutorial/liblas_to_pdal.rst b/doc/tutorial/liblas_to_pdal.rst
new file mode 100644
index 0000000..3192493
--- /dev/null
+++ b/doc/tutorial/liblas_to_pdal.rst
@@ -0,0 +1,350 @@
+.. _liblas-to-pdal:
+
+libLAS C API to PDAL transition guide
+=====================================
+
+This page shows how to port code using libLAS C API to PDAL API
+(which is C++). The new code is not using full power of PDAL but
+it uses just what is necessary to read content of a LAS file.
+
+
+Includes
+--------
+
+libLAS include:
+
+.. code-block:: cpp
+
+    #include <liblas/capi/liblas.h>
+
+For PDAL, in addition to PDAL headers, we also include standard headers
+which will be useful later:
+
+.. code-block:: cpp
+
+    #include <memory>
+    #include <pdal/PointTable.hpp>
+    #include <pdal/PointView.hpp>
+    #include <pdal/LasReader.hpp>
+    #include <pdal/LasHeader.hpp>
+    #include <pdal/Options.hpp>
+
+Initial steps
+-------------
+
+Opening the dataset in libLAS:
+
+.. code-block:: cpp
+
+    LASReaderH LAS_reader;
+    LASHeaderH LAS_header;
+    LASSRSH LAS_srs;
+    LAS_reader = LASReader_Create(in_opt->answer);
+    LAS_header = LASReader_GetHeader(LAS_reader);
+
+The higher level of abstraction in PDAL requires a little bit more code
+for the initial steps:
+
+.. code-block:: cpp
+
+    pdal::Option las_opt("filename", in_opt->answer);
+    pdal::Options las_opts;
+    las_opts.add(las_opt);
+    pdal::PointTable table;
+    pdal::LasReader las_reader;
+    las_reader.setOptions(las_opts);
+    las_reader.prepare(table);
+    pdal::PointViewSet point_view_set = las_reader.execute(table);
+    pdal::PointViewPtr point_view = *point_view_set.begin();
+    pdal::Dimension::IdList dims = point_view->dims();
+    pdal::LasHeader las_header = las_reader.header();
+
+The PDAL code is also different in the way that we read all the data
+right away while in libLAS we just open the file.
+To make use of other readers supported by PDAL, see ``StageFactory`` class.
+
+The test if the file was loaded successfully, the test of the header
+pointer was used with libLAS:
+
+.. code-block:: cpp
+
+if (LAS_header == NULL) {
+    /* fail */
+}
+
+In general, PDAL will throw a ``pdal_error`` exception in case something
+is wrong and it can't recover such in the case when the file can't be opened.
+To handle the exceptional state by yourself, you can wrap the code
+in ``try-catch`` block:
+
+.. code-block:: cpp
+
+try {
+    /* actual code */
+} catch {
+    /* fail in your own way */
+}
+
+
+Dataset properties
+------------------
+
+We assume we defined all the following variables as ``double``.
+
+The general properties from the LAS file are retrieved from the
+header in libLAS:
+
+.. code-block:: cpp
+
+    scale_x = LASHeader_GetScaleX(LAS_header);
+    scale_y = LASHeader_GetScaleY(LAS_header);
+    scale_z = LASHeader_GetScaleZ(LAS_header);
+
+    offset_x = LASHeader_GetOffsetX(LAS_header);
+    offset_y = LASHeader_GetOffsetY(LAS_header);
+    offset_z = LASHeader_GetOffsetZ(LAS_header);
+
+    xmin = LASHeader_GetMinX(LAS_header);
+    xmax = LASHeader_GetMaxX(LAS_header);
+    ymin = LASHeader_GetMinY(LAS_header);
+    ymax = LASHeader_GetMaxY(LAS_header);
+
+And the same applies PDAL:
+
+.. code-block:: cpp
+
+
+    scale_x = las_header.scaleX();
+    scale_y = las_header.scaleY();
+    scale_z = las_header.scaleZ();
+
+    offset_x = las_header.offsetX();
+    offset_y = las_header.offsetY();
+    offset_z = las_header.offsetZ();
+
+    xmin = las_header.minX();
+    xmax = las_header.maxX();
+    ymin = las_header.minY();
+    ymax = las_header.maxY();
+
+The point record count in libLAS:
+
+.. code-block:: cpp
+
+    unsigned int n_features = LASHeader_GetPointRecordsCount(LAS_header);
+
+is just point count in PDAL:
+
+.. code-block:: cpp
+
+    unsigned int n_features = las_header.pointCount();
+
+WKT of a spatial reference system is obtained from the header in libLAS:
+
+.. code-block:: cpp
+
+    LAS_srs = LASHeader_GetSRS(LAS_header);
+    char* projstr = LASSRS_GetWKT_CompoundOK(LAS_srs);
+
+In PDAL, spatial reference is part of the ``PointTable``:
+
+.. code-block:: cpp
+
+    char* projstr = table.spatialRef().getWKT(pdal::SpatialReference::eCompoundOK).c_str();
+
+Whether the time or color is supported by the LAS format, one would
+have to determine from the format ID in libLAS:
+
+.. code-block:: cpp
+
+    las_point_format = LASHeader_GetDataFormatId(LAS_header);
+    have_time = (las_point_format == 1 ...
+
+In PDAL, there is a convenient function for it in the header:
+
+.. code-block:: cpp
+
+    have_time = las_header.hasTime();
+    have_color = las_header.hasColor();
+
+The presence of color, time and other dimensions can be also determined
+with:
+
+.. code-block:: cpp
+
+    pdal::Dimension::IdList dims = point_view->dims();
+
+
+Iterating over points
+---------------------
+
+libLAS:
+
+.. code-block:: cpp
+
+    while ((LAS_point = LASReader_GetNextPoint(LAS_reader)) != NULL) {
+        // ...
+    }
+
+PDAL:
+
+.. code-block:: cpp
+
+    for (pdal::PointId idx = 0; idx < point_view->size(); ++idx) {
+        // ...
+    }
+
+Point validity
+--------------
+
+The correct usage of libLAS required to test point validity:
+
+.. code-block:: cpp
+
+    LASPoint_IsValid(LAS_point)
+
+In PDAL, there is no need to do that and the caller can assume that
+all the points provided by PDAL are valid.
+
+
+Coordinates
+-----------
+
+libLAS:
+
+.. code-block:: cpp
+
+    x = LASPoint_GetX(LAS_point);
+    y = LASPoint_GetY(LAS_point);
+    z = LASPoint_GetZ(LAS_point);
+
+In PDAL, point coordinates are one of the dimensions:
+
+.. code-block:: cpp
+
+    using namespace pdal::Dimension;
+    x = point_view->getFieldAs<double>(Id::X, idx);
+    y = point_view->getFieldAs<double>(Id::Y, idx);
+    z = point_view->getFieldAs<double>(Id::Z, idx);
+
+Thanks to ``using namespace pdal::Dimension`` we can just write ``Id::X`` etc.
+
+
+Returns
+-------
+
+libLAS:
+
+.. code-block:: cpp
+
+    int return_no = LASPoint_GetReturnNumber(LAS_point);
+    int n_returns = LASPoint_GetNumberOfReturns(LAS_point);
+
+PDAL:
+
+.. code-block:: cpp
+
+    int return_no = point_view->getFieldAs<int>(Id::ReturnNumber, idx);
+    int n_returns = point_view->getFieldAs<int>(Id::NumberOfReturns, idx);
+
+
+Classes
+-------
+
+libLAS:
+
+.. code-block:: cpp
+
+    int point_class = (int) LASPoint_GetClassification(LAS_point);
+
+PDAL:
+
+.. code-block:: cpp
+
+    int point_class = point_view->getFieldAs<int>(Id::Classification, idx);
+
+
+Color
+-----
+
+libLAS:
+
+.. code-block:: cpp
+
+    LASColorH LAS_color = LASPoint_GetColor(LAS_point);
+    int red = LASColor_GetRed(LAS_color);
+    int green = LASColor_GetGreen(LAS_color);
+    int blue = LASColor_GetBlue(LAS_color);
+
+PDAL:
+
+.. code-block:: cpp
+
+    int red = point_view->getFieldAs<int>(Id::Red, idx);
+    int green = point_view->getFieldAs<int>(Id::Green, idx);
+    int blue = point_view->getFieldAs<int>(Id::Blue, idx);
+
+For LAS format, ``hasColor()`` method of ``LasHeader`` to see if the
+format supports RGB. However, in general, you can test use
+``hasDim(Id::Red)``, ``hasDim(Id::Green)`` and ``hasDim(Id::Blue)``
+method calls on the point, to see if the color was defined.
+
+
+Time
+----
+
+libLAS:
+
+.. code-block:: cpp
+
+    double time = LASPoint_GetTime(LAS_point);
+
+PDAL:
+
+.. code-block:: cpp
+
+    double time = point_view->getFieldAs<double>(Id::GpsTime, idx);
+
+
+
+Other point attributes
+----------------------
+
+libLAS:
+
+.. code-block:: cpp
+
+    LASPoint_GetIntensity(LAS_point)
+    LASPoint_GetScanDirection(LAS_point)
+    LASPoint_GetFlightLineEdge(LAS_point)
+    LASPoint_GetScanAngleRank(LAS_point)
+    LASPoint_GetPointSourceId(LAS_point)
+    LASPoint_GetUserData(LAS_point)
+
+PDAL:
+
+.. code-block:: cpp
+
+    point_view->getFieldAs<int>(Id::Intensity, idx)
+    point_view->getFieldAs<int>(Id::ScanDirectionFlag, idx)
+    point_view->getFieldAs<int>(Id::EdgeOfFlightLine, idx)
+    point_view->getFieldAs<int>(Id::ScanAngleRank, idx)
+    point_view->getFieldAs<int>(Id::PointSourceId, idx)
+    point_view->getFieldAs<int>(Id::UserData, idx)
+
+
+Memory management
+-----------------
+
+In libLAS C API, we need to explicitly take care of freeing the memory:
+
+.. code-block:: cpp
+
+    LASSRS_Destroy(LAS_srs);
+    LASHeader_Destroy(LAS_header);
+    LASReader_Destroy(LAS_reader);
+
+When using C++ and PDAL, the objects created on stack free the memory
+when they go out of scope. When using smart pointers, they will take
+care of the memory they manage. This does not apply to special cases
+such as ``exit()`` function calls.
diff --git a/doc/tutorial/original.png b/doc/tutorial/original.png
new file mode 100644
index 0000000..6da4e52
Binary files /dev/null and b/doc/tutorial/original.png differ
diff --git a/doc/tutorial/overview.rst b/doc/tutorial/overview.rst
new file mode 100644
index 0000000..44b2633
--- /dev/null
+++ b/doc/tutorial/overview.rst
@@ -0,0 +1,438 @@
+.. _overview
+
+******************************************************************************
+PDAL Architecture Overview
+******************************************************************************
+
+:Author: Andrew Bell
+:Contact: andrew at hobu.co
+:Date: 9/3/2014
+
+PDAL is a set of applications and library to facilitate translation of point
+cloud data between various formats.  In addition, it provides some facilities
+for transformation of data between various geometric projections and
+manipulations and can calculate some statistical, boundary and density data.
+PDAL provides an API that can be used by programmers for integration into their
+own projects or to allow extension of existing capabilities.
+
+The PDAL model
+--------------------------------------------------------------------------------
+
+PDAL reads data from a set of input sources using format-specific readers.
+Point data can be passed through various filters that transform data or create
+metadata.  If desired, points can be written to an output stream using a
+format-specific writer.  PDAL can merge data from various input sources into a
+single output source, preserving attribute data where supported by the input and
+output formats.
+
+.. image:: pipeline.png
+
+The above diagram shows a possible arrangement of PDAL readers, filters and
+writers, all of which are known as stages.  Any merge operation or filter may be
+placed after any reader.  Output filters are distinct from other filters only in
+that they may create more than one set of points to be further filtered or
+written.  The arrangement of readers, filters and writers is called a PDAL
+pipeline.  Pipelines can be specified using XML as detailed later.
+
+Extending PDAL
+................................................................................
+
+PDAL is simple to extend by implementing subclasses of existing stages.  All
+processing in PDAL is completely synchronous.  No parallel processing occurs,
+eliminating locking or other concurrency issues.  Understanding of several
+auxiliary classes is necessary to effectively create a new stage.
+
+Dimension
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Point cloud formats support various data elements.  In order to be useful, all
+formats must provide some notion of location for points (X, Y and perhaps Z),
+but beyond that, the data collected in formats may or may not have common data
+fields.  Some formats predefine the elements that make up a point.  Other
+formats provide this information in a header or preamble.  PDAL calls each of
+the elements that make up a point a dimension.  PDAL predefines the dimensions
+that are in common use by the formats that it currently supports.  Readers may
+register their use of a predefined dimension or may have PDAL create a
+dimension with a name and type as requested.  Dimensions are described by the
+enumeration pdal::Dimension::Id::Enum and associated functions in
+Dimension.hpp.
+
+PDAL has a default type (Double, Float, Signed32, etc.) for each of its
+predefined dimensions which is believed to be sufficient to accurately
+hold the necessary data.  Only when the default data type is deemed
+insufficient should a request be made to "upgrade" a storage datatype.  There
+is no facility to "downsize" a dimension type to save memory.  Dimension.hpp
+can be examined to determine the default storage type of each predefined
+dimension.  In most cases knowledge of the storage data type for
+a dimension isn't required.  PDAL properly converts data to and from the
+internal storage type transparently.  Invalid conversion raise an exception.
+
+When a storage type is explicitly requested for a dimension, PDAL examines the
+existing storage type and requested type and chooses the storage type so
+that it can hold both types.  In some cases this results in a storage type
+different from either the existing or requested storage type.  For instance,
+if the current storage type is a 16 bit signed integer (Signed16) and the
+requested type is a 16 bit unsigned integer (Unsigned16), PDAL will use a
+32 bit signed integer as the storage type for the dimension so that both
+16 bit storage types can be successfully accommodated.
+
+Point Layout
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+PDAL stores orientation information in a point layout structure (PointLayout
+object).  This structure contains information about what dimensions are stored
+in a structure containing points, like their names, types, and offsets.
+
+Point Table
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+PDAL stores points in what is called a point table (PointTable object).  Each
+point table has an associated point layout describing its format.  All
+points in a single point table have the same dimensions and all operations on
+a PDAL pipeline make use of a single point table.  In addition to storing
+points, a point table also stores pipeline metadata that may get created as
+pipeline stages are executed.  Most functions receive a PointTablePtr object,
+which refers to the active point table.  A PointTablePtr can be stored
+or copied cheaply.
+
+Point View
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A point view (PointView object) stores references to points.  All storage
+and retrieval of points is done through a point view rather than directly
+through a point table.  Point data is accessed from a point view through a
+point ID (type PointId), which is an integer value.  The first point reference
+in a point view has a point ID of 0, the second has a point ID of 1, the third
+has a point ID of 2 and so on.  There are no null point references in a point
+view.  The size of a point view is the number of point references contained
+in the view.  A point view acts like a self-expanding array or vector of
+point references, but it is always full.  For example, one can’t set the field
+value of point with a PointId of 9 unless there already exist at least 8 point
+references in the point view.
+
+Point references can be copied from one point view to another by appending an
+existing reference to a destination point view. The point ID of the appended
+point in the destination view may be different than the point ID of the same
+point in the source view.  The point ID of an appended point reference is the
+same as the size of the point view after the operation.  Note that appending a
+point reference does not create a new point, rather, it creates another
+reference to an existing point.  There are currently no built-in facilities for
+creating copies of points.
+
+Making a Stage (Reader, Filter or Writer):
+................................................................................
+
+All stages (Stage object) share a common interface, though readers, filters and
+writers each have a simplified interface if the generic stage interface is more
+complex than necessary.  One should create a new stage by creating a subclass of
+reader (Reader object), filter (Filter or MultiFilter object) or writer (Writer
+object).  When a pipeline is created, each stage is created using its default
+constructor.
+
+Each stage class should invoke two or three public macros to allow the stage to
+be hooked into the PDAL infrastructure:
+
+    SET_STAGE_NAME(<name>, <description>)
+
+    name:  A character array (string) constant that will be used to reference
+    the stage from the command line.  Typically, readers are named
+    “readers.<something>”, filters are “filters.<something>” and writers
+    are ”writers.<something>”.
+
+    description: A character array (string) constant that may be more meaningful
+    than the name.  It appears in some debug and informational output.
+
+    SET_STAGE_LINK(<http_link>)  [optional]:
+
+    http_link:  A character array (string) constant that references a web site
+    containing documentation about the stage.  It allows the information to be
+    integrated into PDAL’s web site and user information.
+
+When a pipeline is started, each of its stages is processed in two distinct
+steps.  First, all stages are prepared.
+
+Stage Preparation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Preparation of a stage consists of executing the following private virtual
+functions calls, none of which need to be implemented in a stage unless desired.
+Each stage is guaranteed to be prepared after all stages that precede it in the
+pipeline.
+
+1) void processOptions(const Options& options)
+
+    PDAL allows users to specify various options at the command line and in
+    pipeline files.  Those options relevant to a stage are passed to the stage
+    during preparation through this method.  This method should extract any
+    necessary data from the options and set data in member variables or perform
+    other configuration as necessary.  It is not recommended that options passed
+    into this function be copied, as they may become non-copyable in a future
+    version of the library.  Handling all option processing at this point also
+    allows an exception to be thrown in the case of an invalid option that can
+    be properly interpreted by the pipeline.
+
+2) void initialize()
+
+    Some stages, particularly readers, may need to do things such as open files
+    to extract header information before the next step in processing.  Other
+    general processing that needs to take place before any stage is executed
+    should occur at this time.  Initialization that can be deferred until the
+    execution stage should be performed in the ready() method (see below).
+
+3) void addDimensions(PointLayoutPtr layout)
+
+    This method allows stages to inform a point table's layout of the dimensions
+    that it would like as part of the record of each point.  Normally, only
+    readers add dimensions to a point table, but there is no prohibition on
+    filters or writers from adding dimensions if necessary.  Dimensions should
+    not be added to the layout of a pipeline’s point table except in this
+    method.
+
+
+
+Stage Execution
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+After all stages are prepared, processing continues with the execution of each
+stage.  Each stage will be executed only after all stages preceding it in a
+pipeline have been executed.  A stage is executed by invoking the following
+private virtual methods.  It is important to note that ready() and done() are
+called only once for each stage while run() is called once for each point view
+to be processed by the stage.
+
+1) void ready(PointTablePtr table)
+
+    This function allows preprocessing to be performed prior to actual
+    processing of the points in a point view.  For example, filters may
+    initialize internal data structures or libraries, readers may connect to
+    databases and writers may write a file header.  If there is a choice between
+    performing operations in the preparation stage (in the initialize() method)
+    or the execution stage (in ready()), prefer to defer the operation until
+    this point.
+
+2) PointViewSet run(PointViewPtr buf)
+
+    This is the method in which processing of individual points occurs.  One
+    might read points into the view, transform point values in some way, or
+    distribute the point references in the input view into numerous output
+    views.  This method is called once for each point view passed to the
+    stage.
+
+3) void done(PointTablePtr table)
+
+    This function allows a stage to clean up resources not released by a
+    stage’s destructor.  It also allows other termination functions, such
+    a closing of databases, writing file footers, rewriting headers or
+    closing or renaming files.
+
+
+Implementing a Reader
+................................................................................
+
+A reader is a stage that takes input from a point clould format supported by
+PDAL and loads points into a point table through a point view.
+
+A reader needs to register or assign those dimensions that it will reference
+when adding point data to the point table.  Dimensions that are predefined
+in PDAL can be registered by using the point table's registerDim()
+method.  Dimensions that are not predefined can be added using assignDim().
+If dimensions are determined as named entities from a point cloud source,
+it may not be known whether the dimensions are predefined or not.  In this
+case the function registerOrAssignDim() can be used.  When a dimension is
+assigned, rather than registered, the reader needs to inform PDAL of the
+type of the variable using the enumeration Dimension::Type::Enum.
+
+In this example, the reader informs the point table's layout that it will
+reference the dimensions X, Y and Z.
+
+    ::
+
+        void Reader::addDimensions(PointLayoutPtr layout)
+        {
+           layout->registerDim(Dimension::Id::X);
+           layout->registerDim(Dimension::Id::Y);
+           layout->registerDim(Dimension::Id::Z);
+        }
+
+Here a reader determines dimensions from an input source and registers or
+assigns them.  All of the input dimension values are in this case double
+precision floating point.
+
+::
+
+    void Reader::addDimensions(PointLayoutPtr layout)
+    {
+        FileHeader header;
+
+        for (auto di = header.names.begin(), di != header.names.end(); ++di)
+        {
+            std::string dimName = *di;
+            Dimension::Id::Enum id = layout->registerOrAssignDim(
+                dimName,
+                Dimension::Type::Double);
+        }
+    }
+
+Readers should use the ready() function to reset the input data to a state
+where the first point can be read from the source.  The done() function
+should be used to free resources or reset the state initialized in ready().
+
+Readers should implement a function, read(), that will place the data from
+the input source into the provided point view:
+
+point_count_t read(PointViewPtr view, point_count_t count)
+
+    The reader should read at most 'count' points from the input source and
+    place them in the view.  The reader must keep track of its current
+    position in the input source and points should be read until no points
+    remain or 'count' points have been added to the view.  The current
+    location in the input source is typically tracked with a integer variable
+    called the index.
+
+    As each point is read from the input source, it must be placed at the end
+    of the point view.  The ID of the end of the point view can be
+    determined by calling size() function of the point view.  read() should
+    return the number of points read by during the function call.
+
+    ::
+
+        point_count_t MyFormat::read(PointViewPtr view, point_count_t count)
+        {
+            // Determine the number of points remaining in the input.
+            point_count_t remainingInput = m_totalNumPts - m_index;
+
+            // Determine the number of points to read.
+            count = std::min(count, remainingInput);
+
+            // Determine the ID of the next point in the point view
+            PointId nextId = view->size();
+
+            // Determine the current input position.
+            auto pos = m_pointSize * m_index;
+
+            point_count_t remaining = count;
+            while (remaining--)
+            {
+                double x, y, z;
+
+                // Read X, Y and from input source.
+                x = m_file.read<double>(pos);
+                pos += sizeof(double);
+                y = m_file.read<double>(pos);
+                pos += sizeof(double);
+                z = m_file.read<double>(pos);
+                pos += sizeof(double);
+
+                // Set X, Y and Z into the pointView.
+                view->setField(Dimension::Id::X, nextId, x);
+                view->setField(Dimension::Id::Y, nextId, y);
+                view->setField(Dimension::Id::Z, nextId, z);
+
+                nextId++;
+            }
+            m_index += count;
+            return count;
+        }
+
+    Note that we don't read more points than requested, we don't read past
+    the end of the input stream and we keep track of our location in the
+    input so that subsequent calls to read() will result in all points being
+    read.
+
+
+Implementing a Filter
+................................................................................
+
+A filter is a stage that allows processing of data after it has been read into a
+pipeline’s point table.  In many filters, the only function that need be
+implemented is filter(), a simplified version of the stage’s run() method whose
+input and output is a point view provided by the previous stage:
+
+void filter(PointViewPtr view)
+
+    One should implement filter() instead of run() if its interface is
+    sufficient.  The expectation is that a filter will iterate through the
+    points currently in the point view and apply some transformation or gather
+    some data to be output as pipeline metadata.
+
+    Here as an example is the actual filter function from the reprojection
+    filter:
+
+    ::
+
+        void Reprojection::filter(PointViewPtr view)
+        {
+            for (PointId id = 0; id < view->size(); ++id)
+            {
+                double x = view->getFieldAs<double>(Dimension::Id::X, id);
+                double y = view->getFieldAs<double>(Dimension::Id::Y, id);
+                double z = view->getFieldAs<double>(Dimension::Id::Z, id);
+
+                transform(x, y, z);
+
+                view->setField(Dimension::Id::X, id, x);
+                view->setField(Dimension::Id::Y, id, y);
+                view->setField(Dimension::Id::Z, id, z);
+            }
+        }
+
+    The filter simply loops through the points, retrieving the X, Y and Z values
+    of each point, transforms those value using a reprojection algorithm and
+    then stores the transformed values in the point table using the point
+    view’s setField() function.
+
+    A filter may need to use the run() function instead of filter(), typically
+    because it needs to create multiple output point views from a single input
+    view.  The following example puts every other input point into one of two
+    output point views:
+
+    ::
+
+        PointViewSet Alternator::run(PointViewPtr view)
+        {
+            PointViewSet viewSet;
+            PointViewPtr even = view();
+            PointViewPtr odd = view();
+            viewSet.insert(even);
+            viewSet.insert(odd);
+            for (PointId idx = 0; idx < view->size(); ++idx)
+            {
+                PointViewPtr out = idx % 2 ? even : odd;
+                out->appendPoint(*view.get(), idx);
+            }
+            return viewSet;
+        }
+
+
+Implementing a Writer:
+................................................................................
+
+Analogous to the filter() method in a filter is the write() method of a writer.
+This function is usually the appropriate one to override when implementing
+a writer -- it would be unusual to need to implement run().  A
+typical writer will open its output file when ready() is called, write
+individual points in write() and close the file in done().
+
+Like a filter, a writer may receive multiple point views during processing
+of a pipeline.  This will result in the write() function being called once
+for each of the input point views.  Some current writers do not produce
+correct output when provided with multiple point views.  Users should
+use a merge filter immediately prior to such writers to avoid errors.
+As new writers are created, developers should try to make sure
+that they behave reasonably if passed multiple point views -- they
+correctly handle write() being called multiple times after a single
+call to ready().
+
+::
+
+    void write(const PointViewPtr view)
+    {
+        ostream& out = *m_out;
+
+        for (PointId id = 0; id < view->size(); ++id)
+        {
+            out << setw(10) << view->getFieldAs<double>(Dimension::Id::X, id);
+            out << setw(10) << view->getFieldAs<double>(Dimension::Id::Y, id);
+            out << setw(10) << view->getFieldAs<double>(Dimension::Id::Z, id);
+        }
+    }
diff --git a/doc/tutorial/pcl_block_tutorial.rst b/doc/tutorial/pcl_block_tutorial.rst
new file mode 100644
index 0000000..3d61eac
--- /dev/null
+++ b/doc/tutorial/pcl_block_tutorial.rst
@@ -0,0 +1,353 @@
+.. _pcl_block_tutorial:
+
+===============================================================================
+Filtering data with PCL
+===============================================================================
+
+Introduction
+------------------------------------------------------------------------------
+
+PDAL is both a C++ library and a collection of command-line utilities for data
+processing operations. While the PDAL library addresses point cloud exploitation
+and filtering, this takes a back seat to its primary objective of being a data
+translation library, helping developers to navigate the a wide variety of point
+cloud formats. `PCL`_ is another C++ library that is focused on developing a
+rich set of point cloud processing routines, with less of a focus on formats and
+data translation. Acknowledging this, the PCL Block filter was developed to
+serve as a bridge between the two libraries, enabling rapid development of point
+cloud processing pipelines.
+
+.. seealso::
+
+    See :ref:`filters.pclblock` for details on PDAL's PCL Block filter.
+
+.. _`PCL`: http://www.pointclouds.org
+
+.. contents:: Contents
+   :depth: 3
+   :backlinks: none
+
+
+
+Quick Start
+------------------------------------------------------------------------------
+
+.. note::
+
+    Instructions for getting started with PDAL using Vagrant and VirtualBox can
+    be found in the :ref:`vagrant` document.
+
+PDAL's Vagrant configuration now includes the PCL Block and all necessary
+dependencies. Assuming you've got Vagrant all set up, once you checkout the PDAL
+source code, just do the following:
+
+::
+
+    $ cd pdal
+    $ vagrant up
+    $ vagrant ssh
+
+The ``vagrant up`` command will take a considerable amount of time, but once its
+completed you have a fully functional VM with both PCL and PDAL installed. Try
+entering
+
+::
+
+    $ pdal pipeline --version
+
+at the command line. You should see output similar to the following:
+
+::
+
+    ------------------------------------------------------------------------------------------
+    pdal pipeline (PDAL 0.9.9 (2c6aa8) with GeoTIFF 1.4.0 GDAL 1.9.2 LASzip 2.2.0 System )
+    ------------------------------------------------------------------------------------------
+
+
+
+PDAL Pipeline kernel
+------------------------------------------------------------------------------
+
+.. note::
+
+    A full description of the PDAL pipeline concept is beyond the scope of this
+    tutorial but the :ref:`pipeline`, :ref:`pipeline_command`, and
+    :ref:`reading` documents contain detailed examples and background
+    information.
+
+The :ref:`filters.pclblock` is implemented as a PDAL filter stage and as such is
+easily accessed via the PDAL pipeline. It accepts a single, required option -
+the name of the `JSON`_ file describing the PCL Block.
+
+A sample pipeline XML which reads/writes LAS and has a single PCL Block filter
+is shown below.
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                ../../../temp/foo.las
+            </Option>
+            <Filter type="filters.pclblock">
+                <Option name="filename">
+                    ./passthrough.json
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        ../../autzen/autzen-point-format-3.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Writer>
+    </Pipeline>
+
+
+And is run from the command line thusly.
+
+::
+
+    $ cd pdal # your PDAL source tree
+    $ cd test/data
+    $ ../../bin/pdal pipeline -i filters/pcl/passthrough.xml -v4
+
+This simple pipeline reads the input LAS (``autzen-point-format-3.las``), passes
+it through the PCL Block (``passthrough.json``), and writes the output LAS
+(``foo.las``). Note that the file paths are interpreted relative to the
+directory containing the XML file.
+
+When run, it should produce output similar to this:
+
+::
+
+    Requested to read 106 points
+    Requested to write 106 points
+    0
+    Processing /home/vagrant/pdal/test/data/filters/pcl/passthrough.json
+
+    --------------------------------------------------------------------------------
+    NAME:   PassThroughExample ()
+    HELP:
+    AUTHOR:
+    --------------------------------------------------------------------------------
+    106 points copied
+
+       Step 1) PassThrough
+
+          Field name: z
+          Limits: 410.000000, 440.000000
+
+    76(writers.las DEBUG: 3): Wrote 81 points to the LAS file
+    .100
+
+
+
+PDAL PCL kernel
+------------------------------------------------------------------------------
+
+For users that would like to bypass the creation (and subsequent modification)
+of the pipeline XML for every file they wish to process, there is another
+option: the ``pdal pcl`` command.
+
+::
+
+    $ pdal pcl -i /path/to/input/las -p /path/to/pcl/block/json -o /path/to/output/las
+
+This is functionally equivalent to the original `pdal pipeline` command, but
+does not afford the flexibility of constructing the pipeline (i.e., none the
+other PDAL filters are accessible).
+
+The same can be accomplished with the ``pdal pcl`` command. The basic syntax for
+the command is
+
+::
+
+    $ pdal pcl -i <input cloud> -p <PCL Block JSON> -o <output cloud>
+
+where the JSON file specified with ``-p`` is the same file that would be
+embedded in the pipeline XML file. This can be useful when the pipeline does not
+change frequently, but the input/output filenames do.
+
+For example, the above `pdal pipeline` example can be written with `pdal pcl`
+like this:
+
+::
+
+    $ cd pdal  # your PDAL source tree
+    $ cd test/data
+    $ ../../bin/pdal pcl -i autzen/autzen-point-format-3.las -p filters/pcl/example_PassThrough_1.json -o ../temp/foo.las -v4
+
+This should produce the output
+
+::
+
+    Requested to read 106 points
+    Requested to write 106 points
+    0
+    Processing /home/vagrant/pdal/test/data/filters/pcl/passthrough.json
+
+    --------------------------------------------------------------------------------
+    NAME:   PassThroughExample ()
+    HELP:
+    AUTHOR:
+    --------------------------------------------------------------------------------
+    106 points copied
+
+       Step 1) PassThrough
+
+          Field name: z
+          Limits: 410.000000, 440.000000
+
+    76(writers.las DEBUG: 3): Wrote 81 points to the LAS file
+    .100
+
+
+
+Examples
+------------------------------------------------------------------------------
+
+
+
+Simple point cloud cropping
+..............................................................................
+
+The power of the PCL Block is really exposed through the JSON description. In
+this example, we apply a single PCL filter to the PointView. The
+`PassThrough`_ filter removes points that lie outside a given range for the
+specified dimension. Here, we are asking PCL to crop the input point cloud,
+returning only those points with z values in the range 100 to 200.
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "PassThroughExample",
+            "filters":
+            [
+                {
+                    "name": "PassThrough",
+                    "setFilterFieldName": "z",
+                    "setFilterLimits":
+                    {
+                        "min": 410.0,
+                        "max": 440.0
+                    }
+                }
+            ]
+        }
+    }
+
+(This example is taken from the unit test
+`PCLBlockFilterTest_example_PassThrough_1`.)
+
+
+
+Point cloud cropping with outlier removal
+..............................................................................
+
+Building on the previous example, we can string together multiple PCL filtering
+stages, such as the `StatisticalOutlierRemoval`_ filter. Note that the name
+field identifies the PCL filter by its class name, and furthermore that as of
+now only a handful of the PCL filtering options are accessible through the PCL
+Block. Similarly, select parameters of these classes can be set by specifying
+their public member functions by name.
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "CombinedExample",
+            "help": "Apply passthrough filter followed by statistical outlier removal",
+            "version": 1.0,
+            "author": "Bradley J Chambers",
+            "filters":
+            [
+                {
+                    "name": "PassThrough",
+                    "help": "filter z values to the range [410,440]",
+                    "setFilterFieldName": "z",
+                    "setFilterLimits":
+                    {
+                        "min": 410.0,
+                        "max": 440.0
+                    }
+                },
+                {
+                    "name": "StatisticalOutlierRemoval",
+                    "help": "apply outlier removal",
+                    "setMeanK": 8,
+                    "setStddevMulThresh": 0.2
+                }
+            ]
+        }
+    }
+
+(This example is taken from the unit test
+`PCLBlockFilterTest_example_PassThrough_2`.)
+
+
+Ground return filtering
+..............................................................................
+
+The Progressive Morphological Filter (PMF) is an openly published approach to
+identifying ground vs. non-ground returns in point cloud data. An implementation
+of PMF is included with PCL and accessible through the PDAL's PCL Block filter.
+
+A complete description of the algorithm can be found in the article `"A
+Progressive Morphological Filter for Removing Nonground Measurements from
+Airborne LIDAR Data" <http://users.cis.fiu.edu/~chens/PDF/TGRS.pdf>`_ by K.
+Zhang, S.  Chen, D. Whitman, M. Shyu, J. Yan, and C. Zhang.
+
+To run the PMF with default settings, the PCL Block JSON is simply:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "ProgressiveMorphologicalFilterExample",
+            "filters":
+            [
+                {
+                    "name": "ProgressiveMorphologicalFilter"
+                    "setMaxWindowSize": 200,
+                }
+            ]
+        }
+    }
+
+Additional parameters can be set by advanced users:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "ProgressiveMorphologicalFilterAdvancedExample",
+            "filters":
+            [
+                {
+                    "name": "ProgressiveMorphologicalFilter",
+                    "setCellSize": 1.0,
+                    "setMaxWindowSize": 200,
+                    "setSlope": 1.0,
+                    "setInitialDistance": 0.5,
+                    "setMaxDistance": 3.0,
+                    "setExponential": true
+                }
+            ]
+        }
+    }
+
+(These examples are taken from the unit tests
+`PCLBlockFilterTest_example_PMF_1` and `PCLBlockFilterTest_example_PMF_2`.)
+
+See :ref:`here <pcl_ground>` for a more detailed
+explanation of the PMF parameters.
+
+.. _`JSON`: http://www.json.org/
+.. _`PassThrough`: http://pointclouds.org/documentation/tutorials/passthrough.php
+.. _`StatisticalOutlierRemoval`: http://pointclouds.org/documentation/tutorials/statistical_outlier.php
diff --git a/doc/tutorial/pcl_ground.rst b/doc/tutorial/pcl_ground.rst
new file mode 100644
index 0000000..d8ab794
--- /dev/null
+++ b/doc/tutorial/pcl_ground.rst
@@ -0,0 +1,193 @@
+.. _pcl_ground:
+
+===============================================================================
+Identifying ground returns using ProgressiveMorphologicalFilter segmentation
+===============================================================================
+
+Implements the Progressive Morphological Filter for segmentation of ground
+points. 
+
+Background
+------------------------------------------------------------------------------
+
+A complete description of the algorithm can be found in the article `"A
+Progressive Morphological Filter for Removing Nonground Measurements from
+Airborne LIDAR Data" <http://users.cis.fiu.edu/~chens/PDF/TGRS.pdf>`_ by K.
+Zhang, S.  Chen, D. Whitman, M. Shyu, J. Yan, and C. Zhang.
+
+For more information on how to invoke this PCL-based filter programmatically,
+see the `ProgressiveMorphologicalFilter`_ tutorial on the PCL website.
+
+We have chosen to demonstrate the algorithm using data from the 2003 report
+"ISPRS Comparison of Filters." For more on the data and the study itself,
+please see http://www.itc.nl/isprswgIII-3/filtertest/ as well as `"Experimental
+comparison of filter algorithms for bare-earth extraction from airborne laser
+scanning point clouds" <http://dx.doi.org/10.1016/j.isprsjprs.2004.05.004>`_ by
+G. Sithole and G.  Vosselman.
+
+First, download the dataset `CSite1_orig-utm.laz
+<https://raw.github.com/PDAL/data/master/isprs/CSite1_orig-utm.laz>`_
+and save it somewhere to disk.
+
+.. image:: original.png
+   :height: 400px
+
+Using the Ground kernel
+------------------------------------------------------------------------------
+
+The :ref:`pdal ground <ground_command>` kernel can be used to filter ground
+returns, allowing the user to tweak filtering parameters at the command-line.
+
+Let's start by running ``pdal ground`` with the default parameters.
+
+::
+
+    $ pdal ground -i CSite1_orig-utm.laz -o CSite1_orig-utm-ground.laz --visualize
+
+.. note::
+
+   In this tutorial, we use ``--visualize`` to visualize results, but this is
+   only available if PCL is built with VTK and visualization support. If your
+   install does not support VTK/visualization, simply drop ``--visualize`` and
+   visualize the result with the viewer of your choice.
+
+To get an idea of what's happening during each iteration, you can optionally
+increase the verbosity of the output. We'll try ``-v4``.  Here we see a summary
+of the parameters, along with height threshold, window size, and number of
+remaining ground points.
+
+::
+
+    $ pdal ground -i CSite1_orig-utm.laz -o CSite1_orig-utm-ground.laz --visualize -v4
+
+    --------------------------------------------------------------------------------
+    NAME:    ()
+    HELP:
+    AUTHOR:
+    --------------------------------------------------------------------------------
+    process tile 0 through the pipeline
+
+       Step 1) ProgressiveMorphologicalFilter
+
+          max window size: 33
+          slope: 1.000000
+          max distance: 2.500000
+          initial distance: 0.150000
+          cell size: 1.000000
+          base: 2.000000
+          exponential: true
+          negative: false
+          Iteration 0 (height threshold = 0.150000, window size = 3.000000)...ground now has 872413  points
+          Iteration 1 (height threshold = 2.150000, window size = 5.000000)...ground now has 833883 points
+          Iteration 2 (height threshold = 2.500000, window size = 9.000000)...ground now has 757030 points
+          Iteration 3 (height threshold = 2.500000, window size = 17.000000)...ground now has 625333 points
+          Iteration 4 (height threshold = 2.500000, window size = 33.000000)...ground now has 580852 points
+          1366408 points filtered to 580852 following progressive morphological filter
+
+The resulting filtered cloud can be seen in this top-down and front view. When
+viewed from the side, it is apparent that there are a number of low noise
+points that have fooled the PMF filter.
+
+.. image:: after-top1.png
+   :height: 400px
+
+.. image:: after-front1.png
+   :height: 400px
+
+
+To address, we introduce an alternate way to call PMF, as part of a PCL
+pipeline, where we preprocess with an outlier removal step. The command is
+nearly identical, replacing ``ground`` with ``pcl`` and adding a pipeline JSON
+specified with ``-p``.
+
+.. literalinclude:: sor_pmf.json
+
+::
+
+    $ pdal pcl -i CSite1_orig-utm.laz -o CSite1_orig-utm-ground.laz -p sor-pmf.json --visualize -v4
+
+    --------------------------------------------------------------------------------
+    NAME:   Progressive Morphological Filter with Outlier Removal (1.0)
+    HELP:
+    AUTHOR:
+    --------------------------------------------------------------------------------
+    process tile 0 through the pipeline
+
+       Step 1) StatisticalOutlierRemoval
+
+          8 neighbors and 3.000000 multiplier
+          1366408 points filtered to 1356744 following outlier removal
+
+       Step 2) ProgressiveMorphologicalFilter
+
+          max window size: 33
+          slope: 1.000000
+          max distance: 2.500000
+          initial distance: 0.150000
+          cell size: 1.000000
+          base: 2.000000
+          exponential: true
+          negative: false
+          Iteration 0 (height threshold = 0.150000, window size = 3.000000)...ground now has 874094 points
+          Iteration 1 (height threshold = 2.150000, window size = 5.000000)...ground now has 837141 points
+          Iteration 2 (height threshold = 2.500000, window size = 9.000000)...ground now has 762213 points
+          Iteration 3 (height threshold = 2.500000, window size = 17.000000)...ground now has 632827 points
+          Iteration 4 (height threshold = 2.500000, window size = 33.000000)...ground now has 596620 points
+          1356744 points filtered to 596620 following progressive morphological filter
+
+The result is noticeably cleaner in both the top-down and front views.
+
+.. image:: after-top2.png
+   :height: 400px
+
+.. image:: after-front2.png
+   :height: 400px
+
+Unfortunately, you may notice that we still have a rather large building in the
+lower right of the image. By tweaking the parameters slightly, in this case,
+increasing the cell size, we can do a better job of removing such features.
+
+.. literalinclude:: sor_pmf2.json
+
+::
+
+    $ pdal pcl -i CSite1_orig-utm.laz -o CSite1_orig-utm-ground.laz -p sor-pmf2.json --visualize -v4
+
+    --------------------------------------------------------------------------------
+    NAME:   Progressive Morphological Filter with Outlier Removal (1.0)
+    HELP:
+    AUTHOR:
+    --------------------------------------------------------------------------------
+    process tile 0 through the pipeline
+
+       Step 1) StatisticalOutlierRemoval
+
+          8 neighbors and 3.000000 multiplier
+          1366408 points filtered to 1356744 following outlier removal
+
+       Step 2) ProgressiveMorphologicalFilter
+
+          max window size: 33
+          slope: 1.000000
+          max distance: 2.500000
+          initial distance: 0.150000
+          cell size: 1.500000
+          base: 2.000000
+          exponential: true
+          negative: false
+          Iteration 0 (height threshold = 0.150000, window size = 4.500000)...ground now has 785496 points
+          Iteration 1 (height threshold = 2.500000, window size = 7.500000)...ground now has 728738 points
+          Iteration 2 (height threshold = 2.500000, window size = 13.500000)...ground now has 623385 points
+          Iteration 3 (height threshold = 2.500000, window size = 25.500000)...ground now has 581679 points
+          Iteration 4 (height threshold = 2.500000, window size = 49.500000)...ground now has 551006 points
+          1356744 points filtered to 551006 following progressive morphological filter
+
+Once again, the result is noticeably cleaner in both the top-down and front views.
+
+.. image:: after-top3.png
+   :height: 400px
+
+.. image:: after-front3.png
+   :height: 400px
+
+.. _`ProgressiveMorphologicalFilter`: http://pointclouds.org/documentation/tutorials/progressive_morphological_filtering.php
diff --git a/doc/tutorial/pcl_spec.rst b/doc/tutorial/pcl_spec.rst
new file mode 100644
index 0000000..4c7ac35
--- /dev/null
+++ b/doc/tutorial/pcl_spec.rst
@@ -0,0 +1,578 @@
+.. _pcl_json_specification:
+
+============================
+Draft PCL JSON Specification
+============================
+
+:Author: Bradley J. Chambers (RadiantBlue Technologies, Inc.)
+:Revision: 0.1
+:Date: 28 February 2014
+:Copyright: Copyright (c) 2014, RadiantBlue Technologies, Inc. This work is licensed under a Creative Commons Attribution 3.0 United States License.
+
+The PCL JSON specification is a point cloud processing pipeline interchange
+format based on JavaScript Object Notation (JSON), drawing inspiration from
+both GeoJSON and TopoJSON.
+
+.. sectnum::
+.. contents::
+   :depth: 4
+   :backlinks: none
+
+
+
+============
+Introduction
+============
+
+A PCL JSON object represents a processing pipeline.
+
+A complete PCL JSON data structure is always an object (in JSON terms). In PCL
+JSON, an object consists of a collection of name/value pairs -- also called
+members. For each member, the name is always a string. Member values are either
+a string, number, object, array or one of the literals: "true", "false", and
+"null". An array consists of elements where each element is a value as
+described above.
+
+
+
+Examples
+--------
+
+A very simple PCL JSON pipeline:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "My cool pipeline",
+            "filters":
+            [
+                {
+                    "name": "VoxelGrid",
+                    "setLeafSize":
+                    {
+                        "x": 1.0,
+                        "y": 1.0,
+                        "z": 1.0
+                    }
+                }
+            ]
+        }
+    }
+
+A more complex pipeline, containing two filters:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "name": "CombinedExample",
+            "help": "Apply passthrough filter followed by statistical outlier removal",
+            "version": 1.0,
+            "author": "Bradley J Chambers",
+            "filters":
+            [
+                {
+                    "name": "PassThrough",
+                    "help": "filter z values to the range [410,440]",
+                    "setFilterFieldName": "z",
+                    "setFilterLimits":
+                    {
+                        "min": 410.0,
+                        "max": 440.0
+                    }
+                },
+                {
+                    "name": "StatisticalOutlierRemoval",
+                    "help": "apply outlier removal",
+                    "setMeanK": 8,
+                    "setStddevMulThresh": 0.2
+                }
+            ]
+        }
+    }
+
+
+
+Definitions
+-----------
+
+* JavaScript Object Notation (JSON), and the terms object, name, value, array,
+  and number, are defined in IETF RTC 4627, at
+  http://www.ietf.org/rfc/rfc4627.txt.
+
+* The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
+  "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this documention are to
+  be interpreted as described in IETF RFC 2119, at
+  http://www.ietf.org/rfc/rfc2119.txt.
+
+
+
+================
+PCL JSON Objects
+================
+
+PCL JSON always consists of a single object. This object (referred to as the
+PCL JSON object below) represents a processing pipeline.
+
+* The PCL JSON object may have any number of members (name/value pairs).
+
+* The PCL JSON object must have a "pipeline" object.
+
+
+
+Pipeline Objects
+----------------
+
+* A pipeline may have a member with the name "name" whose value is a string.
+
+* A pipeline may have a member with the name "help" whose value is a string.
+
+* A pipeline may have a member with the name "version" whose value is a number.
+
+* A pipeline must have a member with the name "filters" whose value is an array
+  of filters.
+
+
+
+Filters
+.......
+
+A pipeline must have a "filters" member whose value is an array of zero or more
+filters.
+
+A filter is any of the PCL filters that has been exposed through the PCL
+pipeline class.
+
+In the following descriptions, all parameters are optional unless otherwise
+noted.
+
+Any JSON keys not recognized by the spec are blissfully ignored.
+
+
+
+ApproximateProgressiveMorphologicalFilter (APMF)
+````````````````````````````````````````````````
+
+:pcl:`ApproximateProgressiveMorphologicalFilter <pcl::ApproximateProgressiveMorphologicalFilter>`
+
+This filter removes nonground points to produce a bare-earth point cloud. It is
+similar to the ProgressiveMorphologicalFilter, but is potentially faster (and
+correspondingly less accurate).
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_approximate_progressive_morphological_filter.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "ApproximateProgressiveMorphologicalFilter",
+                    "setMaxWindowSize": 65,
+                    "setSlope": 0.7,
+                    "setMaxDistance": 10,
+                    "setInitialDistance": 0.3,
+                    "setCellSize": 1,
+                    "setBase": 2,
+                    "setExponential": false,
+                    "setNegative": false
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setMaxWindowSize: int
+  Set the maximum window size to be used for filtering ground returns.
+  [float, default: 33]
+
+setSlope: float
+  Set the slope value to be used in computing the height threshold. [default:
+  1.0]
+
+setMaxDistance: float
+  Set the maximum height above the parameterized ground surface to be
+  considered a ground return. [default: 2.5]
+
+setInitialDistance: float
+  Set the initial height above the parameterized ground surface to be
+  considered a ground return. [default: 0.15]
+
+setCellSize: float
+  Set the cell size. [default: 1.0]
+
+setBase: float
+  Set the base to be used in computing progressive window sizes. [default: 2.0]
+
+setExponential: bool
+  Set flag indicating whether or not to exponentially grow window sizes.
+  [default: true]
+
+setNegative: bool
+  If set to false, include all points indicated by the indices (treat as
+  "inliers"). If true, include the "outlier" points. [default: false]
+
+
+
+ConditionalRemoval
+``````````````````
+
+:pcl:`ConditionalRemoval <pcl::ConditionalRemoval>`
+
+This filter removes normals outside of a given Z range.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_conditional_removal.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "ConditionalRemoval",
+                    "normalZ":
+                    {
+                        "min": 0,
+                        "max": 0.95
+                    }
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+normalZ: object `{"min": float, "max": float}`
+  Set the numerical limits for filtering points based on the z component of
+  their normal. [default: `{"min": 0.0, "max": FLT_MAX}`]
+
+
+
+GridMinimum
+```````````
+
+:pcl:`GridMinimum <pcl::GridMinimum>`
+
+This filter assembles a local 2D grid over a given PointCloud, then downsamples
+the data.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_grid_minimum.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "GridMinimum",
+                    "setResolution": 2.0
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setResolution: float
+  Set the grid resolution. [default: 1.0]
+
+
+
+NormalEstimation
+````````````````
+
+:pcl:`NormalEstimation <pcl::NormalEstimation>`
+
+**Description**
+
+This filter computes the surfaces normals of the points in the input.
+
+PCL details: http://docs.pointclouds.org/1.7.1/classpcl_1_1_normal_estimation.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "NormalEstimation",
+                    "setRadiusSearch": 2
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setKSearch: float
+    Set the number of k nearest neighbors to use for the feature estimation.
+    [default: 0.0]
+
+setRadiusSearch: float
+    Set the sphere radius that is to be used for determining the nearest
+    neighbors used for the feature estimation. [default: 1.0]
+
+
+
+PassThrough
+```````````
+
+:pcl:`PassThrough <pcl::PassThrough>`
+
+**Description**
+
+This filter allows the user to set min/max bounds on one dimension of the data.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_pass_through_3_01pcl_1_1_p_c_l_point_cloud2_01_4.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "PassThrough",
+                    "setFilterFieldName": "z",
+                    "setFilterLimits":
+                    {
+                        "min": 3850100,
+                        "max": 3850200
+                    }
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setFilterFieldName: string (required)
+  Provide the name of the field to be used for filtering data.
+
+.. note::
+
+    Only the `X`, `Y`, `Z`, `R`, `G`, `B`, and `Intensity` dimensions are
+    supported.
+    
+.. note::
+    
+    Although PDAL capitalizes the dimension names ("Z", "Intensity"), PCL
+    requires the names be given in lower case ("z", "intensity").
+
+setFilterLimits: object `{"min": float, "max": float}`
+  Set the numerical limits for the field for filtering data.
+  [default: `{"min": -FLT_MAX, "max": +FLT_MAX}`]
+
+
+
+ProgressiveMorphologicalFilter (PMF)
+````````````````````````````````````
+
+:pcl:`ProgressiveMorphologicalFilter <pcl::ProgressiveMorphologialFilter>`
+
+**Description**
+
+This filter removes nonground points to produce a bare-earth point cloud.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_progressive_morphological_filter.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "ProgressiveMorphologicalFilter",
+                    "setMaxWindowSize": 65,
+                    "setSlope": 0.7,
+                    "setMaxDistance": 10,
+                    "setInitialDistance": 0.3,
+                    "setCellSize": 1,
+                    "setBase": 2,
+                    "setExponential": false,
+                    "setNegative": true
+                }
+            ]
+        }
+    }
+   
+**Parameters**
+
+setMaxWindowSize: int
+  Set the maximum window size to be used for filtering ground returns.
+  [default: 33]
+
+setSlope: float
+  Set the slope value to be used in computing the height threshold. [default:
+  1]
+
+setMaxDistance: float
+  Set the maximum height above the parameterized ground surface to be
+  considered a ground return. [default: 2.5]
+
+setInitialdistance: float
+  Set the initial height above the parameterized ground surface to be
+  considered a ground return. [default: 0.15]
+
+setCellSize: float
+  Set the cell size. [default: 1]
+
+setBase: float
+  Set the base to be used in computing progressive window sizes. [default: 2]
+
+setExponential: bool
+  Set flag indicating whether or not to exponentially grow window sizes.
+  [default: true]
+
+setNegative: bool
+  If set to false, include all points indicated by the indices (treat as
+  "inliers"). If true, include the "outlier" points. [default: false]
+
+
+
+RadiusOutlierRemoval
+````````````````````
+
+:pcl:`RadiusOutlierRemoval <pcl::RadiusOutlierRemoval>`
+
+**Description**
+
+This filter removes outliers if the number of neighbors in a certain search
+radius is smaller than a given K.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_radius_outlier_removal_3_01pcl_1_1_p_c_l_point_cloud2_01_4.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "RadiusOutlierRemoval",
+                    "setMinNeighborsInRadius": 8,
+                    "setRadiusSearch": 1.0
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setMinNeighborsInRadius: int
+  Set the number of neighbors that need to be present in order to be
+  classified as an inlier. [default: 2]
+
+setRadiusSearch: float
+  Set te radius of the sphere that will determine which points are neighbors.
+  [default: 1.0]
+
+
+
+StatisticalOutlierRemoval
+`````````````````````````
+
+:pcl:`StatisticalOutlierRemoval <pcl::StatisticalOutlierRemoval>`
+
+**Description**
+
+This filter uses point neighborhood statistics to filter outlier data.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_statistical_outlier_removal_3_01pcl_1_1_p_c_l_point_cloud2_01_4.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "StatisticalOutlierRemoval",
+                    "setMeanK": 8,
+                    "setStddevMulThresh": 1.17
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setMeanK: int
+  Set the number of nearest neighbors to use for mean distance estimation.
+  [default: 2]
+
+setStddevMulThresh: float
+  Set the standard deviation multiplier for the distance threshold
+  calculation. [default: 0.0]
+
+
+
+VoxelGrid
+`````````
+
+:pcl:`VoxelGrid <pcl::VoxelGrid>`
+
+This filter assembles a local 3D grid over a given PointCloud, then downsamples
+and filters the data.
+
+PCL details: http://docs.pointclouds.org/trunk/classpcl_1_1_voxel_grid_3_01pcl_1_1_p_c_l_point_cloud2_01_4.html
+
+Example:
+
+.. code-block:: json
+
+    {
+        "pipeline":
+        {
+            "filters":
+            [
+                {
+                    "name": "VoxelGrid",
+                    "setLeafSize":
+                    {
+                        "x": 1.0,
+                        "y": 1.0,
+                        "z": 1.0
+                    }
+                }
+            ]
+        }
+    }
+
+**Parameters**
+
+setLeafSize: object `{"x": float, "y": float, "z": float}`
+  Set the voxel grid leaf size. [default: `{"x": 1.0, "y": 1.0, "z": 1.0}`]
diff --git a/doc/tutorial/pipeline.png b/doc/tutorial/pipeline.png
new file mode 100644
index 0000000..47d20fc
Binary files /dev/null and b/doc/tutorial/pipeline.png differ
diff --git a/doc/tutorial/reading.rst b/doc/tutorial/reading.rst
new file mode 100644
index 0000000..23dfad9
--- /dev/null
+++ b/doc/tutorial/reading.rst
@@ -0,0 +1,274 @@
+.. _reading:
+
+===============================================================================
+Reading with PDAL
+===============================================================================
+
+
+.. contents:: Contents
+   :depth: 3
+   :backlinks: none
+
+This tutorial will be presented in two parts -- the first being an introduction
+to the command-line utilities that can be used to perform processing operations
+with PDAL, and the second being an introductory C++ tutorial of how to use the
+:ref:`PDAL API <cppapi>` to accomplish similar tasks.
+
+Introduction
+------------------------------------------------------------------------------
+
+PDAL is both a C++ library and a collection of command-line utilities for
+data processing operations.  While it is similar to `LAStools`_ in a few
+aspects, and borrows some of its lineage in others, the PDAL library
+is an attempt to construct a library that is primarily intended as a
+data translation library first, and a exploitation and filtering library
+second.  PDAL exists to provide an abstract API for software developers
+wishing to navigate the multitude of point cloud formats that are out there.
+Its value and niche is explicitly modeled after the hugely successful `GDAL`_
+library, which provides an abstract API for data formats in the GIS raster
+data space.
+
+.. _`GDAL`: http://www.gdal.org
+.. _`LAStools`: http://lastools.org
+
+A basic inquiry example
+------------------------------------------------------------------------------
+
+Our first example to demonstrate PDAL's utility will be to simply query an
+`ASPRS LAS`_ file to determine the data that are in it in the very first point.
+
+.. note::
+
+    The `interesting.las`_ file in these examples can be found on github.
+
+`reStructuredText`_ output
+................................................................................
+
+By default, PDAL outputs `reStructuredText`_. This makes it convenient for
+transforming the output into more pleasing formats like PDF (using `rst2pdf`_)
+or HTML (using `rst2html`_) as part of a processing pipeline.
+
+.. _`rst2pdf`: https://code.google.com/p/rst2pdf/
+.. _`rst2html`: http://docutils.sourceforge.net/docs/user/tools.html#rst2html-py
+
+.. _`reStructuredText`: http://docutils.sourceforge.net/rst.html
+
+::
+
+    $ pdal info interesting.las -p 0
+
+::
+
+    Point 0
+    --------------------------------------------------------------------------------
+
+    =================== ======================================= ===================
+                Name                                Value        Namespace
+    =================== ======================================= ===================
+    X                                        637012.23999999999  readers.las
+    Y                                        849028.31000000006  readers.las
+    Z                                        431.66000000000003  readers.las
+    Intensity                                               143  readers.las
+    ReturnNumber                                              1  readers.las
+    NumberOfReturns                                           1  readers.las
+    ScanDirectionFlag                                         1  readers.las
+    EdgeOfFlightLine                                          0  readers.las
+    Classification                                            1  readers.las
+    ScanAngleRank                                            -9  readers.las
+    UserData                                                132  readers.las
+    PointSourceId                                          7326  readers.las
+    Time                                     245380.78254962614  readers.las
+    Red                                                      68  readers.las
+    Green                                                    77  readers.las
+    Blue                                                     88  readers.las
+    =================== ======================================= ===================
+
+JavaScript output
+................................................................................
+
+JavaScript `JSON`_ can also be output.
+
+.. _`JSON`: http://www.json.org/
+
+::
+
+    $ pdal info interesting.las -p 0 --json
+
+.. code-block:: javascript
+
+    {
+        "X": "637012.23999999999",
+        "Y": "849028.31000000006",
+        "Z": "431.66000000000003",
+        "Intensity": "143",
+        "ReturnNumber": "1",
+        "NumberOfReturns": "1",
+        "ScanDirectionFlag": "1",
+        "EdgeOfFlightLine": "0",
+        "Classification": "1",
+        "ScanAngleRank": "-9",
+        "UserData": "132",
+        "PointSourceId": "7326",
+        "Time": "245380.78254962614",
+        "Red": "68",
+        "Green": "77",
+        "Blue": "88"
+    }
+
+
+
+XML output
+................................................................................
+
+XML output of this same point is as simple as adding the appropriate
+switch:
+
+::
+
+    $ pdal info interesting.las -p 0 --xml
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <point>
+      <X>637012.23999999999</X>
+      <Y>849028.31000000006</Y>
+      <Z>431.66000000000003</Z>
+      <Intensity>143</Intensity>
+      <ReturnNumber>1</ReturnNumber>
+      <NumberOfReturns>1</NumberOfReturns>
+      <ScanDirectionFlag>1</ScanDirectionFlag>
+      <EdgeOfFlightLine>0</EdgeOfFlightLine>
+      <Classification>1</Classification>
+      <ScanAngleRank>-9</ScanAngleRank>
+      <UserData>132</UserData>
+      <PointSourceId>7326</PointSourceId>
+      <Time>245380.78254962614</Time>
+      <Red>68</Red>
+      <Green>77</Green>
+      <Blue>88</Blue>
+    </point>
+
+
+A conversion example
+------------------------------------------------------------------------------
+
+Conversion of one file format to another can be a hairy topic. You should
+expect *leakage* of details of data in the source format as it is converted to
+the destination format. :ref:`metadata`, file organization, and data themselves
+may not be able to be represented as you move from one format to another.
+Conversion is by definition lossy, if not in terms of the actual data
+themselves, but possibly in terms of the auxiliary data the format also
+carries.
+
+It is also important to recognize that both fixed and flexible point cloud
+formats exist, and conversion of flexible formats to fixed formats will often
+leak. The dimensions might even match in terms of type or name, but not in
+terms of width or interpretation.
+
+.. seealso::
+
+    See :cpp:class:`pdal::Dimension` for details on PDAL dimensions.
+
+::
+
+    $ pdal translate interesting.las output.txt
+
+::
+
+    "X","Y","Z","Intensity","ReturnNumber","NumberOfReturns","ScanDirectionFlag","EdgeOfFlightLine","Classification","ScanAngleRank","UserData","PointSourceId","Time","Red","Green","Blue"
+    637012.24,849028.31,431.66,143,1,1,1,0,1,-9,132,7326,245381,68,77,88
+    636896.33,849087.70,446.39,18,1,2,1,0,1,-11,128,7326,245381,54,66,68
+    636784.74,849106.66,426.71,118,1,1,0,0,1,-10,122,7326,245382,112,97,114
+    636699.38,848991.01,425.39,100,1,1,0,0,1,-6,124,7326,245383,178,138,162
+    636601.87,849018.60,425.10,124,1,1,1,0,1,-4,126,7326,245383,134,104,134
+    636451.97,849250.59,435.17,48,1,1,0,0,1,-9,122,7326,245384,99,85,95
+    ...
+
+The text format, of course, is the ultimate flexible-definition format -- at
+least for the point data themselves. For the other header information, like
+the spatial reference system, or the `ASPRS LAS`_ `UUID`_, the conversion
+leaks. In short, you may need to preserve some more information as part of
+your conversion to make it useful down the road.
+
+:ref:`metadata`
+..............................................................................
+
+PDAL transmits this other information in the form of :ref:`metadata` that is
+carried per-stage throughout the PDAL :ref:`processing pipeline <pipeline>`.
+We can capture this metadata using the :ref:`info_command` utility.
+
+::
+
+    $ pdal info --metadata --xml interesting.las
+
+This produces metadata that looks like :ref:`this <metadataxml>`. You can use
+your favorite `XML`_ or `JSON`_ manipulation tools to extract this information
+and do what you need with it. For formats that do not have the ability to
+preserve this metadata internally, you can keep a ``.xml`` or ``.json`` file
+alongside the ``.txt`` file as auxiliary information.
+
+.. seealso::
+    :ref:`metadata` contains much more detail of metadata workflow in PDAL.
+
+A :ref:`pipeline_command` example
+------------------------------------------------------------------------------
+
+The full power of PDAL comes in the form of :ref:`pipeline_command` invocations.
+While :ref:`translate_command` provides some utility as far as simple conversion of
+one format to another, it does not provide much power to a user to be able
+to filter or alter data as they are converted.  Pipelines are the way to take
+advantage of PDAL's ability to manipulate data as they are converted. This
+section will provide a basic example and demonstration of :ref:`pipeline`,
+but the :ref:`pipeline` document contains more detailed exposition of the
+topic.
+
+.. note::
+
+    The :ref:`pipeline_command` document contains detailed examples and background
+    information.
+
+The :ref:`pipeline_command` PDAL utility is one that takes in a ``.xml`` file
+containing :ref:`pipeline <pipeline_command>` description that defines a PDAL
+processing pipeline. Options can be given at each :cpp:class:`pdal::Stage` of
+the pipeline to affect different aspects of the processing pipeline, and
+stages may be chained together into multiple combinations to have varying
+effects.
+
+Simple conversion
+..............................................................................
+
+The following XML document defines a :ref:`pipeline` that takes the ``file.las``
+`ASPRS LAS`_ file and converts it to a new file called ``output.las``.
+
+::
+
+    <?xml version="1.0" encoding="utf-8"?>
+    <Pipeline version="1.0">
+        <Writer type="writers.las">
+            <Option name="filename">
+                output.las
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ./path/to/my/file.las
+                </Option>
+            </Reader>
+        </Writer>
+    </Pipeline>
+
+Loop a directory and filter it through a pipeline
+................................................................................
+
+This little bash script loops through a directory and pushes the las files through
+a pipeline, substituting the input and output as it goes.
+
+::
+
+    ls *.las | cut -d. -f1 | xargs -P20 -I{} pdal pipeline -i /path/to/proj.xml --readers.las.filename={}.las --writers.las.filename=output/{}.laz
+
+.. _`JSON`: http://www.json.org/
+.. _`XML`: http://en.wikipedia.org/wiki/XML
+.. _`UUID`: http://en.wikipedia.org/wiki/Universally_unique_identifier
+.. _`interesting.las`: https://github.com/PDAL/PDAL/blob/master/test/data/interesting.las?raw=true
+.. _`ASPRS LAS`: http://www.asprs.org/a/society/committees/standards/lidar_exchange_format.html
diff --git a/doc/tutorial/sor_pmf.json b/doc/tutorial/sor_pmf.json
new file mode 100644
index 0000000..33af015
--- /dev/null
+++ b/doc/tutorial/sor_pmf.json
@@ -0,0 +1,14 @@
+{
+  "pipeline": {
+    "name": "Progressive Morphological Filter with Outlier Removal",
+    "version": 1.0,
+    "filters": [{
+        "name": "StatisticalOutlierRemoval",
+        "setMeanK": 8,
+        "setStddevMulThresh": 3.0
+      }, {
+        "name": "ProgressiveMorphologicalFilter"
+    }]
+  }
+}
+
diff --git a/doc/tutorial/sor_pmf2.json b/doc/tutorial/sor_pmf2.json
new file mode 100644
index 0000000..c7b3448
--- /dev/null
+++ b/doc/tutorial/sor_pmf2.json
@@ -0,0 +1,15 @@
+{
+  "pipeline": {
+    "name": "Progressive Morphological Filter with Outlier Removal",
+    "version": 1.0,
+    "filters": [{
+        "name": "StatisticalOutlierRemoval",
+        "setMeanK": 8,
+        "setStddevMulThresh": 3.0
+      }, {
+        "name": "ProgressiveMorphologicalFilter",
+        "setCellSize": 1.5
+    }]
+  }
+}
+
diff --git a/doc/tutorial/using.rst b/doc/tutorial/using.rst
new file mode 100644
index 0000000..86ad4bf
--- /dev/null
+++ b/doc/tutorial/using.rst
@@ -0,0 +1,120 @@
+.. _using:
+
+===============================================================================
+Using PDAL with CMake
+===============================================================================
+
+This tutorial will explain how to use PDAL in your own projects using CMake. A
+more complete, working example can be found :ref:`here <writing>`.
+
+.. note::
+
+   We assume you have either :ref:`built or installed<building>` PDAL.
+
+Basic CMake configuration
+-------------------------------------------------------------------------------
+
+Begin by creating a file named CMakeLists.txt that contains:
+
+.. code-block:: cmake
+
+  cmake_minimum_required(VERSION 2.8)
+  project(MY_PDAL_PROJECT)
+  find_package(PDAL 1.0.0 REQUIRED CONFIG)
+  include_directories(${PDAL_INCLUDE_DIRS})
+  link_directories(${PDAL_LIBRARY_DIRS})
+  add_definitions(${PDAL_DEFINITIONS})
+  set(CMAKE_CXX_FLAGS "-std=c++11")
+  add_executable(tutorial tutorial.cpp)
+  target_link_libraries(tutorial ${PDAL_LIBRARIES})
+
+CMakeLists explained
+-------------------------------------------------------------------------------
+
+.. code-block:: cmake
+
+  cmake_minimum_required(VERSION 2.8.12)
+
+The `cmake_minimum_required` command specifies the minimum required version of
+CMake. We use some recent additions to CMake in PDAL that require version
+2.8.12.
+
+.. code-block:: cmake
+
+  project(MY_PDAL_PROJECT)
+
+The CMake `project` command names your project and sets a number of useful
+CMake variables.
+
+.. code-block:: cmake
+
+  find_package(PDAL 1.0.0 REQUIRED CONFIG)
+
+We next ask CMake to locate the PDAL package, requiring version 1.0.0 or higher.
+
+.. code-block:: cmake
+
+  include_directories(${PDAL_INCLUDE_DIRS})
+  link_directories(${PDAL_LIBRARY_DIRS})
+  add_definitions(${PDAL_DEFINITIONS})
+
+If PDAL is found, the following variables will be set:
+
+* *PDAL_FOUND*: set to 1 if PDAL is found, otherwise unset
+* *PDAL_INCLUDE_DIRS*: set to the paths to PDAL installed headers and the dependency headers
+* *PDAL_LIBRARIES*: set to the file names of the built and installed PDAL libraries
+* *PDAL_LIBRARY_DIRS*: set to the paths where PDAL libraries and 3rd party dependencies reside
+* *PDAL_VERSION*: the detected version of PDAL
+* *PDAL_DEFINITIONS*: list the needed preprocessor definitions and compiler flags
+
+.. code-block:: cmake
+
+  set(CMAKE_CXX_FLAGS "-std=c++11")
+
+We haven't quite implemented the setting of *PDAL_DEFINITIONS* within the
+`PDALConfig.cmake` file, so for now you should specify the c++11 compiler flag,
+as we use it extensively throughout PDAL.
+
+.. code-block:: cmake
+
+  add_executable(tutorial tutorial.cpp)
+
+We use the `add_executable` command to tell CMake to create an executable named
+`tutorial` from the source file `tutorial.cpp`.
+
+.. code-block:: cmake
+
+  target_link_libraries(tutorial ${PDAL_LIBRARIES})
+
+We assume that the tutorial executable makes calls to PDAL functions. To make
+the linker aware of the PDAL libraries, we use `target_link_libraries` to link
+`tutorial` against the *PDAL_LIBRARIES*.
+
+Compiling the project
+-------------------------------------------------------------------------------
+
+Make a `build` directory, where compilation will occur:
+
+.. code-block:: bash
+
+  $ cd /PATH/TO/MY/PDAL/PROJECT
+  $ mkdir build
+
+Run cmake from within the build directory:
+
+.. code-block:: bash
+
+  $ cd build
+  $ cmake ..
+
+Now, build the project:
+
+.. code-block:: bash
+
+  $ make
+
+The project is now built and ready to run:
+
+.. code-block:: bash
+
+  $ ./tutorial
diff --git a/doc/tutorial/writing-filter.rst b/doc/tutorial/writing-filter.rst
new file mode 100644
index 0000000..a16d8c5
--- /dev/null
+++ b/doc/tutorial/writing-filter.rst
@@ -0,0 +1,76 @@
+.. _writing-filter:
+
+===============================================================================
+Writing a filter
+===============================================================================
+
+PDAL's command-line application can be extended through the development of
+kernel functions. In this tutorial, we will give a brief example.
+
+The header
+-------------------------------------------------------------------------------
+
+First, we provide a full listing of the filter header.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+   :language: cpp
+
+In your MyFilter class, you will use two macros defined in Filter.hpp to
+register some useful information about your filter. SET_STAGE_NAME sets the
+filter name and description. These are extracted by the PDAL application to
+inform the user of the filter's name and purpose. The name will be displayed
+when the user types `pdal --help`.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+   :language: cpp
+   :lines: 25
+
+SET_STAGE_LINK will provide a link to a webpage that documents the filter.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+   :language: cpp
+   :lines: 26
+
+Plugin filters should also SET_PLUGIN_VERSION to register the version number of
+the plugin.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.hpp
+   :language: cpp
+   :lines: 27
+
+The source
+-------------------------------------------------------------------------------
+
+Again, we start with a full listing of the filter source.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+
+In your filter implementation, you will use a third macro defined in
+pdal_macros. This macro registers the plugin with the Filter factory. It is
+only required by plugins.
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+   :lines: 11
+
+Native filters will use a different set of macros added directly to the
+StageFactory.cpp file to register themselves.
+
+.. code-block:: cpp
+
+  MAKE_FILTER_CREATOR(myfilter, pdal::MyFilter)
+  REGISTER_FILTER(myfilter, pdal::MyFilter);
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+   :lines: 13-16
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+   :lines: 18-21
+
+.. literalinclude:: ../../examples/writing-filter/MyFilter.cpp
+   :language: cpp
+   :lines: 23-28
+
diff --git a/doc/tutorial/writing-kernel.rst b/doc/tutorial/writing-kernel.rst
new file mode 100644
index 0000000..b128720
--- /dev/null
+++ b/doc/tutorial/writing-kernel.rst
@@ -0,0 +1,103 @@
+.. _writing-kernel:
+
+===============================================================================
+Writing a kernel
+===============================================================================
+
+PDAL's command-line application can be extended through the development of
+kernel functions. In this tutorial, we will give a brief example.
+
+The header
+-------------------------------------------------------------------------------
+
+First, we provide a full listing of the kernel header.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
+   :language: cpp
+
+In your MyKernel class, you will use two macros defined in Kernel.hpp to
+register some useful information about your kernel. SET_KERNEL_NAME sets the
+kernel name and description. These are extracted by the PDAL application to
+inform the user of the kernel's name and purpose. The name will be displayed
+when the user types `pdal --help`.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
+   :language: cpp
+   :lines: 12
+
+SET_KERNEL_LINK will provide a link to a webpage that documents the kernel.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.hpp
+   :language: cpp
+   :lines: 13
+
+The source
+-------------------------------------------------------------------------------
+
+Again, we start with a full listing of the kernel source.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+
+In your kernel implementation, you will use a third macro defined in
+pdal_macros. This macro registers the plugin with the Kernel factory. It is
+only required by plugins.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 24
+
+Native kernels will use a different set of macros added directly to the
+KernelFactory.cpp file to register themselves.
+
+.. code-block:: cpp
+
+  MAKE_KERNEL_CREATOR(mykernel, pdal::MyKernel)
+  REGISTER_KERNEL(mykernel, pdal::MyKernel);
+
+To build up a processing pipeline in this
+example, we need to create two objects: the
+PointContext and the StageFactory. The latter is
+used to create the various stages that will be
+used within the kernel.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 50-51
+
+The Reader is created from the StageFactory, and
+is specified by the stage name, in this case an
+LAS reader. For brevity, we provide the reader a
+single option, the filename of the file to be
+read.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 53-56
+
+The Filter is also created from the StageFactory.
+Here, we create a decimation filter that will
+pass every tenth point to subsequent stages. We
+also specify the input to this stage, which is
+the reader.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 58-62
+
+Finally, the Writer is created from the
+StageFactory. This text writer, takes as input
+the previous stage (the decimation filter) and
+the output filename as its sole option.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 64-68
+
+The final two steps are to prepare and execute
+the pipeline. This is achieved by calling prepare
+and execute on the final stage.
+
+.. literalinclude:: ../../examples/writing-kernel/MyKernel.cpp
+   :language: cpp
+   :lines: 69-70
diff --git a/doc/tutorial/writing-reader.rst b/doc/tutorial/writing-reader.rst
new file mode 100644
index 0000000..b88f87a
--- /dev/null
+++ b/doc/tutorial/writing-reader.rst
@@ -0,0 +1,95 @@
+.. _writing-reader:
+
+===============================================================================
+Writing a reader
+===============================================================================
+
+PDAL's command-line application can be extended through the development of
+reader functions. In this tutorial, we will give a brief example.
+
+The header
+-------------------------------------------------------------------------------
+
+First, we provide a full listing of the reader header.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+   :language: cpp
+
+In your MyReader class, you will use two macros defined in Reader.hpp to
+register some useful information about your reader. SET_STAGE_NAME sets the
+reader name and description. These are extracted by the PDAL application to
+inform the user of the reader's name and purpose. The name will be displayed
+when the user types `pdal --help`.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+   :language: cpp
+   :lines: 12
+
+SET_STAGE_LINK will provide a link to a webpage that documents the reader.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.hpp
+   :language: cpp
+   :lines: 13
+
+The source
+-------------------------------------------------------------------------------
+
+Again, we start with a full listing of the reader source.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+
+In your reader implementation, you will use a third macro defined in
+pdal_macros. This macro registers the plugin with the Reader factory. It is
+only required by plugins.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 24
+
+Native readers will use a different set of macros added directly to the
+ReaderFactory.cpp file to register themselves.
+
+.. code-block:: cpp
+
+  MAKE_READER_CREATOR(myreader, pdal::MyReader)
+  REGISTER_READER(myreader, pdal::MyReader);
+
+To build up a processing pipeline in this example, we need to create two
+objects: the PointContext and the StageFactory. The latter is used to create
+the various stages that will be used within the reader.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 50-51
+
+The Reader is created from the StageFactory, and is specified by the stage
+name, in this case an LAS reader. For brevity, we provide the reader a single
+option, the filename of the file to be read.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 53-56
+
+The Filter is also created from the StageFactory.  Here, we create a decimation
+filter that will pass every tenth point to subsequent stages. We also specify
+the input to this stage, which is the reader.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 58-62
+
+Finally, the Writer is created from the StageFactory. This text writer, takes
+as input the previous stage (the decimation filter) and the output filename as
+its sole option.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 64-68
+
+The final two steps are to prepare and execute the pipeline. This is achieved
+by calling prepare and execute on the final stage.
+
+.. literalinclude:: ../../examples/writing-reader/MyReader.cpp
+   :language: cpp
+   :lines: 69-70
diff --git a/doc/tutorial/writing-writer.rst b/doc/tutorial/writing-writer.rst
new file mode 100644
index 0000000..41e6b7a
--- /dev/null
+++ b/doc/tutorial/writing-writer.rst
@@ -0,0 +1,103 @@
+.. _writing-writer:
+
+===============================================================================
+Writing a writer
+===============================================================================
+
+PDAL's command-line application can be extended through the development of
+writer functions. In this tutorial, we will give a brief example.
+
+The header
+-------------------------------------------------------------------------------
+
+First, we provide a full listing of the writer header.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+
+In your MyWriter class, you will use two macros defined in Writer.hpp to
+register some useful information about your writer. SET_STAGE_NAME sets the
+writer name and description. These are extracted by the PDAL application to
+inform the user of the writer's name and purpose. The name will be displayed
+when the user types `pdal --help`.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+   :lines: 12
+
+SET_STAGE_LINK will provide a link to a webpage that documents the writer.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.hpp
+   :language: cpp
+   :lines: 13
+
+The source
+-------------------------------------------------------------------------------
+
+Again, we start with a full listing of the writer source.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+
+In your writer implementation, you will use a third macro defined in
+pdal_macros. This macro registers the plugin with the Writer factory. It is
+only required by plugins.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 25
+
+Native writers will use a different set of macros added directly to the
+WriterFactory.cpp file to register themselves.
+
+.. code-block:: cpp
+
+  MAKE_WRITER_CREATOR(mywriter, pdal::MyWriter)
+  REGISTER_WRITER(mywriter, pdal::MyWriter);
+
+To build up a processing pipeline in this
+example, we need to create two objects: the
+PointContext and the StageFactory. The latter is
+used to create the various stages that will be
+used within the writer.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 50-51
+
+The Reader is created from the StageFactory, and
+is specified by the stage name, in this case an
+LAS reader. For brevity, we provide the reader a
+single option, the filename of the file to be
+read.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 53-56
+
+The Filter is also created from the StageFactory.
+Here, we create a decimation filter that will
+pass every tenth point to subsequent stages. We
+also specify the input to this stage, which is
+the reader.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 58-62
+
+Finally, the Writer is created from the
+StageFactory. This text writer, takes as input
+the previous stage (the decimation filter) and
+the output filename as its sole option.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 64-68
+
+The final two steps are to prepare and execute
+the pipeline. This is achieved by calling prepare
+and execute on the final stage.
+
+.. literalinclude:: ../../examples/writing-writer/MyWriter.cpp
+   :language: cpp
+   :lines: 69-70
diff --git a/doc/tutorial/writing.rst b/doc/tutorial/writing.rst
new file mode 100644
index 0000000..9103d7e
--- /dev/null
+++ b/doc/tutorial/writing.rst
@@ -0,0 +1,88 @@
+.. _writing:
+
+=====================
+Writing with PDAL
+=====================
+
+This tutorial will describe a complete example of using PDAL C++ objects to write
+a LAS file. The example will show fetching data from your own data source rather than
+interacting with a :ref:`reader stage <stage_index>`.
+
+.. note::
+
+     If you implement your own :ref:`reader <stage_index>` that conforms to
+     PDAL's :cpp:class:`pdal::Stage`, you can implement a simple read-filter-write
+     pipeline using :ref:`pipeline` and not have to code anything explicit
+     yourself.
+
+Includes
+-------------------------------------------------------------------------------
+
+First, our code.
+
+.. literalinclude:: ../../examples/writing/tutorial.cpp
+   :language: cpp
+
+Take a closer look. We will need to include several PDAL headers.
+
+.. literalinclude:: ../../examples/writing/tutorial.cpp
+   :language: cpp
+   :lines: 1-8
+
+`BufferReader` will not be required by all users. Here is it used to populate a
+bare `PointBuffer`. This will often be accomplished by a `Reader` stage.
+
+Instead of directly including headers for individual stages, e.g., `LasWriter`,
+we rely on the `StageFactory` which has the ability to query available stages
+at runtime and return pointers to the created stages.
+
+We proceed by providing a mechanism for generating dummy data for the x, y, and
+z dimensions.
+
+.. literalinclude:: ../../examples/writing/tutorial.cpp
+   :language: cpp
+   :lines: 10-30
+
+.. literalinclude:: ../../examples/writing/tutorial.cpp
+   :language: cpp
+   :lines: 32-41
+
+.. literalinclude:: ../../examples/writing/tutorial.cpp
+   :language: cpp
+   :lines: 43-70
+
+Compiling and running the program
+-------------------------------------------------------------------------------
+
+.. note::
+
+  Refer to :ref:`building` for information on how to build PDAL.
+
+To build this example, simply copy the files tutorial.cpp and CMakeLists.txt
+from the examples/writing directory of the PDAL source tree.
+
+.. literalinclude:: ../../examples/writing/CMakeLists.txt
+   :language: cmake
+
+.. note::
+
+  Refer to :ref:`using` for an explanation of the basic CMakeLists.
+
+Begin by configuring your project using CMake (shown here on Unix) and building
+using make.
+
+.. code-block:: bash
+
+  $ cd /PATH/TO/WRITING/TUTORIAL
+  $ mkdir build
+  $ cd build
+  $ cmake ..
+  $ make
+
+After the project is built, you can run it by typing:
+
+.. code-block:: bash
+
+  $ ./tutorial
+
+
diff --git a/doc/vagrant.rst b/doc/vagrant.rst
new file mode 100644
index 0000000..c9cf98b
--- /dev/null
+++ b/doc/vagrant.rst
@@ -0,0 +1,139 @@
+.. _vagrant:
+
+******************************************************************************
+Getting Started with PDAL using `Vagrant`_ and `VirtualBox`_
+******************************************************************************
+
+
+:Author: Howard Butler
+:Contact: hobu.inc at gmail dot com
+:Date: 11/04/2013
+
+Introduction
+------------------------------------------------------------------------------
+
+Because of PDAL's relatively short lifespan, there are not so many 
+distributions and packaging solutions that have it available. This means that 
+prospective users of PDAL are pretty much on their own to build up PDAL 
+and use it. Folks who've climbed this mountain with other well-entangled 
+software like `GDAL`_, `MapServer`_, or `Mapnik`_ should be able to manage 
+the compilation challenges listed in the full set of dependencies in :ref:`building_unix`.
+
+For everyone else, suffering all of the compilation challenges, including 
+at least three different build systems is simply too much. "Give me a 
+binary and be done with it," they might ask, and for them, there is an 
+answer. Surrender the requirement of running PDAL in your own customized 
+system for the buildout of PDAL on a known quantity -- a pre-configured 
+virtual machine.
+
+Installation
+------------------------------------------------------------------------------
+
+.. note::
+
+    This document assumes you are starting with a basic Macintosh system 
+    because this is the only system the author assumes people could 
+    ever want to run :). This document has not been tested on any other 
+    platforms, but it is expected that things should work if you're 
+    starting from Windows or some Linux.
+
+`Vagrant`_ is configuration management for virtual machines. Its focus is 
+on reproducibility of configuration. The idea is to codify the configuration 
+using simple text files, press a button, and out spits a fully configured 
+virtual machine with the specified options. And for the most part, this is 
+what actually happens.
+
+`Vagrant`_ is simply the configuration management software, however. `VirtualBox`_ 
+is the virtual machine container. These two tools are used in concert, 
+and both are required to complete this tutorial.
+
+1) Download and install `VirtualBox <https://www.virtualbox.org/wiki/Downloads>`__.
+2) Download and install `Vagrant <http://downloads.vagrantup.com/>`__.
+3) Clone PDAL to your environment:
+  
+    ::
+  
+        $ git clone https://github.com/PDAL/PDAL.git
+
+4) Execute the vagrant configuration:
+
+    ::
+    
+        vagrant up
+
+5) Wait ...
+6) Wait ...
+7) Wait ...
+8) Look for the following when it's all done:
+
+    ::
+    
+        vagrant at pdal-development:~$ pdal info --input readpgpointcloud.xml -p 0
+        {
+            "X": "560974.95000000007",
+            "Y": "5115235.6900000004",
+            "Z": "1881.71",
+            "Intensity": "0",
+            "ReturnNumber": "0",
+            "NumberOfReturns": "0",
+            "ScanDirectionFlag": "0",
+            "EdgeOfFlightLine": "0",
+            "Classification": "2",
+            "ScanAngleRank": "0",
+            "UserData": "0",
+            "PointSourceId": "21",
+            "Time": "0",
+            "Red": "248",
+            "Green": "250",
+            "Blue": "246",
+            "PointID": "772536",
+            "BlockID": "0"
+        }
+        
+9) Start playing around:
+
+    ::
+        
+        $ vagrant ssh
+        $ pdal
+        
+        ------------------------------------------------------------------------------------------
+        pdal (PDAL 0.9.9 (b632df) with GeoTIFF 1.4.0 GDAL 1.11dev LASzip 2.1.0 System )
+        ------------------------------------------------------------------------------------------
+          available actions:
+             - info
+             - pipeline
+             - query
+             - translate
+        
+What you get
+------------------------------------------------------------------------------
+
+The `Vagrant`_ configuration that PDAL provides contains nearly 
+every possible feature except for `Oracle Point Cloud`_ support. Things it 
+includes are:
+
+* Full `pgpointcloud`_ support including example database
+* :ref:`filters.hexbin`
+* :ref:`filters.reprojection` 
+* :ref:`readers.nitf` and :ref:`writers.nitf` 
+* `LASzip`_ support in :ref:`readers.las` and :ref:`writers.las`
+* Interpolation with `Points2Grid`_ using :ref:`writers.p2g`
+* Python manipulation using :ref:`filters.predicate` and :ref:`filters.programmable`
+* `PCL`_ support via :ref:`filters.pclblock`, :ref:`readers.pcd`,
+  :ref:`writers.pcd`, :ref:`ground_command`, and :ref:`pcl_command`
+
+Head to :ref:`pipeline` for more information on using PDAL pipelines. Two pipelines 
+are provided in ``/home/vagrant`` that are used to load the ``st-helens-small.las`` 
+file into `pgpointcloud`_.
+
+.. _`Points2Grid`: https://github.com/CRREL/points2grid
+.. _`Oracle Point Cloud`: http://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_pc_pkg_ref.htm
+.. _`pgpointcloud`: https://github.com/pramsey/pointcloud
+
+.. _`LASzip`: http://laszip.org
+.. _`VirtualBox`: https://www.virtualbox.org/
+.. _`GDAL`: http://gdal.org
+.. _`MapServer`: http://mapserver.org
+.. _`Mapnik`: http://mapnik.org
+.. _`PCL`: http://www.pointclouds.org
diff --git a/examples/writing-filter/CMakeLists.txt b/examples/writing-filter/CMakeLists.txt
new file mode 100644
index 0000000..587a352
--- /dev/null
+++ b/examples/writing-filter/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(FilterTutorial)
+
+find_package(PDAL 1.0.0 REQUIRED CONFIG)
+include_directories(${PDAL_INCLUDE_DIRS})
+
+include_directories(/Users/chambbj/loki/pdal/repo/filters)
+
+set(CMAKE_CXX_FLAGS "-std=c++11")
+add_library(pdal_plugin_filter_myfilter SHARED MyFilter.cpp)
+target_link_libraries(pdal_plugin_filter_myfilter ${PDAL_LIBRARIES})
diff --git a/examples/writing-filter/MyFilter.cpp b/examples/writing-filter/MyFilter.cpp
new file mode 100644
index 0000000..f8ef958
--- /dev/null
+++ b/examples/writing-filter/MyFilter.cpp
@@ -0,0 +1,29 @@
+// MyFilter.cpp
+
+#include "MyFilter.hpp"
+
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointBuffer.hpp>
+#include <pdal/PointContext.hpp>
+#include <pdal/StageFactory.hpp>
+
+CREATE_FILTER_PLUGIN(myfilter, MyFilter)
+
+void MyFilter::processOptions(const pdal::Options& options)
+{
+  m_value = options.getValueOrDefault<double>("param", 1.0);
+}
+
+void MyFilter::addDimensions(PointContextRef ctx)
+{
+  ctx.registerDim(pdal::Dimension::Id::Intensity);
+}
+
+PointBufferSet MyFilter::run(PointBufferPtr input)
+{
+  PointBufferSet pbSet;
+  pbSet.insert(input);
+  return pbSet;
+}
+
diff --git a/examples/writing-filter/MyFilter.hpp b/examples/writing-filter/MyFilter.hpp
new file mode 100644
index 0000000..cc1fa9f
--- /dev/null
+++ b/examples/writing-filter/MyFilter.hpp
@@ -0,0 +1,39 @@
+// MyFilter.hpp
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/Stage.hpp>
+
+#include <memory>
+#include <set>
+
+namespace pdal
+{
+class Options;
+class PointBuffer;
+class PointContext;
+}
+
+typedef std::shared_ptr<pdal::PointBuffer> PointBufferPtr;
+typedef std::set<PointBufferPtr> PointBufferSet;
+typedef PointContext PointContextRef;
+
+class MyFilter : public pdal::Filter
+{
+public:
+  SET_STAGE_NAME ("filters.name", "My Awesome Filter")
+  SET_STAGE_LINK ("http://link/to/documentation")
+  SET_PLUGIN_VERSION("1.0.0")
+
+  MyFilter() : Filter() {};
+
+private:
+  virtual void addDimensions(PointContextRef ctx);
+  virtual void processOptions(const Options& options);
+  virtual PointBufferSet run(PointBufferPtr buf);
+
+  MyFilter& operator=(const MyFilter&); // not implemented
+  MyFilter(const MyFilter&); // not implemented
+};
+
diff --git a/examples/writing-kernel/CMakeLists.txt b/examples/writing-kernel/CMakeLists.txt
new file mode 100644
index 0000000..635c01a
--- /dev/null
+++ b/examples/writing-kernel/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(KernelTutorial)
+
+find_package(PDAL 1.0.0 REQUIRED CONFIG)
+include_directories(${PDAL_INCLUDE_DIRS})
+
+include_directories(/Users/chambbj/loki/pdal/repo/kernels)
+
+set(CMAKE_CXX_FLAGS "-std=c++11")
+add_library(pdal_plugin_kernel_mykernel SHARED MyKernel.cpp)
+target_link_libraries(pdal_plugin_kernel_mykernel ${PDAL_LIBRARIES})
diff --git a/examples/writing-kernel/MyKernel.cpp b/examples/writing-kernel/MyKernel.cpp
new file mode 100644
index 0000000..693ba36
--- /dev/null
+++ b/examples/writing-kernel/MyKernel.cpp
@@ -0,0 +1,73 @@
+// MyKernel.cpp
+
+#include "MyKernel.hpp"
+
+#include <boost/program_options.hpp>
+
+#include <pdal/Filter.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointBuffer.hpp>
+#include <pdal/PointContext.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/Writer.hpp>
+
+#include <memory>
+#include <string>
+
+namespace po = boost::program_options;
+
+CREATE_KERNEL_PLUGIN(mykernel, MyKernel)
+
+void MyKernel::validateSwitches()
+{
+  if (m_input_file == "")
+    throw pdal::app_usage_error("--input/-i required");
+  if (m_output_file == "")
+    throw pdal::app_usage_error("--output/-o required");
+}
+
+void MyKernel::addSwitches()
+{
+  po::options_description* options = new po::options_description("file options");
+  options->add_options()
+  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+  ;
+
+  addSwitchSet(options);
+  addPositionalSwitch("input", 1);
+  addPositionalSwitch("output", 1);
+}
+
+int MyKernel::execute()
+{
+  pdal::PointContextRef ctx;
+  pdal::StageFactory f;
+
+  std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
+  pdal::Options readerOptions;
+  readerOptions.add("filename", m_input_file);
+  reader->setOptions(readerOptions);
+
+  std::unique_ptr<pdal::Filter> filter(f.createFilter("filters.decimation"));
+  pdal::Options filterOptions;
+  filterOptions.add("step", 10);
+  filter->setOptions(filterOptions);
+  filter->setInput(reader.get());
+
+  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
+  pdal::Options writerOptions;
+  writerOptions.add("filename", m_output_file);
+  writer->setOptions(writerOptions);
+  writer->setInput(filter.get());
+  writer->prepare(ctx);
+  writer->execute(ctx);
+
+  return 0;
+}
+
diff --git a/examples/writing-kernel/MyKernel.hpp b/examples/writing-kernel/MyKernel.hpp
new file mode 100644
index 0000000..4f6f22b
--- /dev/null
+++ b/examples/writing-kernel/MyKernel.hpp
@@ -0,0 +1,25 @@
+// MyKernel.hpp
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+
+#include <string>
+
+class MyKernel : public pdal::Kernel
+{
+public:
+  SET_KERNEL_NAME ("MyKernel", "My Awesome Kernel")
+  SET_KERNEL_LINK ("http://link/to/documentation")
+
+  MyKernel() : Kernel() {};
+  int execute();
+
+private:
+  void validateSwitches();
+  void addSwitches();
+
+  std::string m_input_file;
+  std::string m_output_file;
+};
+
diff --git a/examples/writing-reader/CMakeLists.txt b/examples/writing-reader/CMakeLists.txt
new file mode 100644
index 0000000..6176580
--- /dev/null
+++ b/examples/writing-reader/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(ReaderTutorial)
+
+find_package(PDAL 1.0.0 REQUIRED CONFIG)
+include_directories(${PDAL_INCLUDE_DIRS})
+
+include_directories(/Users/chambbj/loki/pdal/repo/readers)
+
+set(CMAKE_CXX_FLAGS "-std=c++11")
+add_library(pdal_plugin_reader_myreader SHARED MyReader.cpp)
+target_link_libraries(pdal_plugin_reader_myreader ${PDAL_LIBRARIES})
diff --git a/examples/writing-reader/MyReader.cpp b/examples/writing-reader/MyReader.cpp
new file mode 100644
index 0000000..3419593
--- /dev/null
+++ b/examples/writing-reader/MyReader.cpp
@@ -0,0 +1,73 @@
+// MyReader.cpp
+
+#include "MyReader.hpp"
+
+#include <boost/program_options.hpp>
+
+#include <pdal/Reader.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointBuffer.hpp>
+#include <pdal/PointContext.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/Writer.hpp>
+
+#include <memory>
+#include <string>
+
+namespace po = boost::program_options;
+
+CREATE_FILTER_PLUGIN(myfilter, MyReader)
+
+void MyReader::validateSwitches()
+{
+  if (m_input_file == "")
+    throw pdal::app_usage_error("--input/-i required");
+  if (m_output_file == "")
+    throw pdal::app_usage_error("--output/-o required");
+}
+
+void MyReader::addSwitches()
+{
+  po::options_description* options = new po::options_description("file options");
+  options->add_options()
+  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+  ;
+
+  addSwitchSet(options);
+  addPositionalSwitch("input", 1);
+  addPositionalSwitch("output", 1);
+}
+
+int MyReader::execute()
+{
+  pdal::PointContextRef ctx;
+  pdal::StageFactory f;
+
+  std::unique_ptr<pdal::Reader> reader(f.createReader("readers.las"));
+  pdal::Options readerOptions;
+  readerOptions.add("filename", m_input_file);
+  reader->setOptions(readerOptions);
+
+  std::unique_ptr<pdal::Reader> filter(f.createReader("filters.decimation"));
+  pdal::Options filterOptions;
+  filterOptions.add("step", 10);
+  filter->setOptions(filterOptions);
+  filter->setInput(reader.get());
+
+  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
+  pdal::Options writerOptions;
+  writerOptions.add("filename", m_output_file);
+  writer->setOptions(writerOptions);
+  writer->setInput(filter.get());
+  writer->prepare(ctx);
+  writer->execute(ctx);
+
+  return 0;
+}
+
diff --git a/examples/writing-reader/MyReader.hpp b/examples/writing-reader/MyReader.hpp
new file mode 100644
index 0000000..46ba8f0
--- /dev/null
+++ b/examples/writing-reader/MyReader.hpp
@@ -0,0 +1,25 @@
+// MyReader.hpp
+
+#pragma once
+
+#include "Reader.hpp"
+
+#include <string>
+
+class MyReader : public pdal::Reader
+{
+public:
+  SET_STAGE_NAME ("MyReader", "My Awesome Reader")
+  SET_STAGE_LINK ("http://link/to/documentation")
+
+  MyReader() : Reader() {};
+  int execute();
+
+private:
+  void validateSwitches();
+  void addSwitches();
+
+  std::string m_input_file;
+  std::string m_output_file;
+};
+
diff --git a/examples/writing-writer/CMakeLists.txt b/examples/writing-writer/CMakeLists.txt
new file mode 100644
index 0000000..7572883
--- /dev/null
+++ b/examples/writing-writer/CMakeLists.txt
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(WriterTutorial)
+
+find_package(PDAL 1.0.0 REQUIRED CONFIG)
+include_directories(${PDAL_INCLUDE_DIRS})
+
+include_directories(/Users/chambbj/loki/pdal/repo/writers)
+
+set(CMAKE_CXX_FLAGS "-std=c++11")
+add_library(pdal_plugin_writer_mywriter SHARED MyWriter.cpp)
+target_link_libraries(pdal_plugin_writer_mywriter ${PDAL_LIBRARIES})
diff --git a/examples/writing-writer/MyWriter.cpp b/examples/writing-writer/MyWriter.cpp
new file mode 100644
index 0000000..6d92281
--- /dev/null
+++ b/examples/writing-writer/MyWriter.cpp
@@ -0,0 +1,73 @@
+// MyWriter.cpp
+
+#include "MyWriter.hpp"
+
+#include <boost/program_options.hpp>
+
+#include <pdal/Writer.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointBuffer.hpp>
+#include <pdal/PointContext.hpp>
+#include <pdal/Writer.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/Writer.hpp>
+
+#include <memory>
+#include <string>
+
+namespace po = boost::program_options;
+
+CREATE_FILTER_PLUGIN(myfilter, MyWriter)
+
+void MyWriter::validateSwitches()
+{
+  if (m_input_file == "")
+    throw pdal::app_usage_error("--input/-i required");
+  if (m_output_file == "")
+    throw pdal::app_usage_error("--output/-o required");
+}
+
+void MyWriter::addSwitches()
+{
+  po::options_description* options = new po::options_description("file options");
+  options->add_options()
+  ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+  ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+  ;
+
+  addSwitchSet(options);
+  addPositionalSwitch("input", 1);
+  addPositionalSwitch("output", 1);
+}
+
+int MyWriter::execute()
+{
+  pdal::PointContextRef ctx;
+  pdal::StageFactory f;
+
+  std::unique_ptr<pdal::Writer> reader(f.createWriter("readers.las"));
+  pdal::Options readerOptions;
+  readerOptions.add("filename", m_input_file);
+  reader->setOptions(readerOptions);
+
+  std::unique_ptr<pdal::Writer> filter(f.createWriter("filters.decimation"));
+  pdal::Options filterOptions;
+  filterOptions.add("step", 10);
+  filter->setOptions(filterOptions);
+  filter->setInput(reader.get());
+
+  std::unique_ptr<pdal::Writer> writer(f.createWriter("writers.text"));
+  pdal::Options writerOptions;
+  writerOptions.add("filename", m_output_file);
+  writer->setOptions(writerOptions);
+  writer->setInput(filter.get());
+  writer->prepare(ctx);
+  writer->execute(ctx);
+
+  return 0;
+}
+
diff --git a/examples/writing-writer/MyWriter.hpp b/examples/writing-writer/MyWriter.hpp
new file mode 100644
index 0000000..23f86ae
--- /dev/null
+++ b/examples/writing-writer/MyWriter.hpp
@@ -0,0 +1,25 @@
+// MyWriter.hpp
+
+#pragma once
+
+#include "Writer.hpp"
+
+#include <string>
+
+class MyWriter : public pdal::Writer
+{
+public:
+  SET_STAGE_NAME ("MyWriter", "My Awesome Writer")
+  SET_STAGE_LINK ("http://link/to/documentation")
+
+  MyWriter() : Writer() {};
+  int execute();
+
+private:
+  void validateSwitches();
+  void addSwitches();
+
+  std::string m_input_file;
+  std::string m_output_file;
+};
+
diff --git a/examples/writing/CMakeLists.txt b/examples/writing/CMakeLists.txt
new file mode 100644
index 0000000..97d09e8
--- /dev/null
+++ b/examples/writing/CMakeLists.txt
@@ -0,0 +1,9 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(WritingTutorial)
+
+find_package(PDAL 1.0.0 REQUIRED CONFIG)
+include_directories(${PDAL_INCLUDE_DIRS})
+
+set(CMAKE_CXX_FLAGS "-std=c++11")
+add_executable(tutorial tutorial.cpp)
+target_link_libraries(tutorial ${PDAL_LIBRARIES})
diff --git a/examples/writing/tutorial.cpp b/examples/writing/tutorial.cpp
new file mode 100644
index 0000000..bf814c6
--- /dev/null
+++ b/examples/writing/tutorial.cpp
@@ -0,0 +1,72 @@
+#include <pdal/PointView.hpp>
+#include <pdal/BufferReader.hpp>
+#include <pdal/Pointtable->hpp>
+#include <pdal/Dimension.hpp>
+#include <pdal/Options.hpp>
+
+#include <vector>
+
+struct Point
+{
+    double x;
+    double y;
+    double z;
+};
+
+std::vector<Point> getMyData()
+{
+    std::vector<Point> output;
+    Point p;
+
+    for (int i = 0; i < 1000; ++i)
+    {
+        p.x = -93.0 + i*0.001;
+        p.y = 42.0 + i*0.001;
+        p.z = 106.0 + i;
+        output.push_back(p);
+    }
+    return output;
+}
+
+
+void fillView(pdal::PointViewPtr view, std::vector<Point> const& data)
+{
+    for (int i = 0; i < data.size(); ++i)
+    {
+        Point const& pt = data[i];
+        view->setField<double>(pdal::Dimension::Id::X, i, pt.x);
+        view->setField<double>(pdal::Dimension::Id::Y, i, pt.y);
+        view->setField<double>(pdal::Dimension::Id::Z, i, pt.z);
+    }
+}
+
+
+int main(int argc, char* argv[])
+{
+    using namespace pdal;
+
+    Options options;
+    options.add("filename", "myfile.las");
+
+    PointTable table;
+    table.registerDim(Dimension::Id::X);
+    table.registerDim(Dimension::Id::Y);
+    table.registerDim(Dimension::Id::Z);
+
+    {
+        PointViewPtr view(new PointView(table));
+
+        std::vector<Point> data = getMyData();
+        fillView(view, data);
+
+        BufferReader reader;
+        reader.addView(view);
+
+        LasWriter writer;
+
+        writer.setInput(&reader);
+        writer.setOptions(options);
+        writer.prepare(table);
+        writer.execute(table);
+    }
+}
diff --git a/filters/CMakeLists.txt b/filters/CMakeLists.txt
new file mode 100644
index 0000000..8dc67d4
--- /dev/null
+++ b/filters/CMakeLists.txt
@@ -0,0 +1,15 @@
+add_subdirectory(chipper)
+add_subdirectory(colorization)
+add_subdirectory(crop)
+add_subdirectory(decimation)
+add_subdirectory(ferry)
+add_subdirectory(merge)
+add_subdirectory(mortonorder)
+add_subdirectory(range)
+add_subdirectory(reprojection)
+add_subdirectory(sort)
+add_subdirectory(splitter)
+add_subdirectory(stats)
+add_subdirectory(transformation)
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} PARENT_SCOPE)
diff --git a/filters/chipper/CMakeLists.txt b/filters/chipper/CMakeLists.txt
new file mode 100644
index 0000000..9b75e10
--- /dev/null
+++ b/filters/chipper/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Chipper filter CMake configuration
+#
+
+#
+# Chipper Filter
+#
+set(srcs
+    ChipperFilter.cpp
+)
+
+set(incs
+    ChipperFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter chipper "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/chipper/ChipperFilter.cpp b/filters/chipper/ChipperFilter.cpp
new file mode 100644
index 0000000..debadb0
--- /dev/null
+++ b/filters/chipper/ChipperFilter.cpp
@@ -0,0 +1,327 @@
+/******************************************************************************
+ * Copyright (c) 2010, Andrew Bell
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Andrew Bell or libLAS nor the names of
+ *       its contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "ChipperFilter.hpp"
+
+#include <iostream>
+#include <limits>
+
+/**
+The objective is to split the region into non-overlapping blocks, each
+containing approximately the same number of points, as specified by the
+user.  We'd also like the blocks closer to square than not.
+
+First, the points are read into arrays - one for the x direction, and one for
+the y direction.  The arrays are sorted and are initialized with indices into
+the other array of the location of the other coordinate of the same point.
+
+Partitions are created that place the maximum number of points in a
+block, subject to the user-defined threshold, using a cumulate and round
+procedure.
+
+The distance of the point-space is checked in each direction and the
+wider dimension is chosen for splitting at an appropriate partition point.
+The points in the narrower direction are copied to locations in the spare
+array at one side or the other of the chosen partition, and that portion
+of the spare array then becomes the active array for the narrow direction.
+This avoids resorting of the arrays, which are already sorted.
+
+This procedure is then recursively applied to the created blocks until
+they contains only one or two partitions.  In the case of one partition,
+we are done, and we simply store away the contents of the block.  If there are
+two partitions in a block, we avoid the recopying the narrow array to the
+spare since the wide array already contains the desired points partitioned
+into two blocks.  We simply need to locate the maximum and minimum values
+from the narrow array so that the approriate extrema of the block can
+be stored.
+**/
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.chipper",
+    "Organize points into spatially contiguous, squarish, and non-overlapping chips.",
+    "http://pdal.io/stages/filters.chipper.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, ChipperFilter, Filter, s_info)
+
+std::string ChipperFilter::getName() const { return s_info.name; }
+
+void ChipperFilter::processOptions(const Options& options)
+{
+    m_threshold = options.getValueOrDefault<uint32_t>("capacity", 5000u);
+}
+
+
+Options ChipperFilter::getDefaultOptions()
+{
+    Options options;
+    Option capacity("capacity", 5000u, "Tile capacity");
+    options.add(capacity);
+    return options;
+}
+
+
+PointViewSet ChipperFilter::run(PointViewPtr view)
+{
+    if (view->size() == 0)
+        return m_outViews;
+
+    m_inView = view;
+    load(*view.get(), m_xvec, m_yvec, m_spare);
+    partition(m_xvec.size());
+    decideSplit(m_xvec, m_yvec, m_spare, 0, m_partitions.size() - 1);
+    return m_outViews;
+}
+
+
+void ChipperFilter::load(PointView& view, ChipRefList& xvec, ChipRefList& yvec,
+    ChipRefList& spare)
+{
+    point_count_t idx;
+    std::vector<ChipPtRef>::iterator it;
+
+    xvec.reserve(view.size());
+    yvec.reserve(view.size());
+    spare.resize(view.size());
+
+    for (PointId i = 0; i < view.size(); ++i)
+    {
+        ChipPtRef xref;
+
+        xref.m_pos = view.getFieldAs<double>(Dimension::Id::X, i);
+        xref.m_ptindex = i;
+        xvec.push_back(xref);
+
+        ChipPtRef yref;
+
+        yref.m_pos = view.getFieldAs<double>(Dimension::Id::Y, i);
+        yref.m_ptindex = i;
+        yvec.push_back(yref);
+    }
+
+    // Sort xvec and assign other index in yvec to sorted indices in xvec.
+    std::stable_sort(xvec.begin(), xvec.end());
+    for (size_t i = 0; i < xvec.size(); ++i)
+    {
+        idx = xvec[i].m_ptindex;
+        yvec[idx].m_oindex = i;
+    }
+
+    // Sort yvec.
+    std::stable_sort(yvec.begin(), yvec.end());
+
+    // Iterate through the yvector, setting the xvector appropriately.
+    for (size_t i = 0; i < yvec.size(); ++i)
+        xvec[yvec[i].m_oindex].m_oindex = i;
+}
+
+
+// Build a list of partitions.  The partition is the size of each block in
+// the x and y directions in number of points.
+void ChipperFilter::partition(point_count_t size)
+{
+    size_t num_partitions;
+
+    num_partitions = size / m_threshold;
+    if (size % m_threshold)
+        num_partitions++;
+
+    // This is a standard statistics cumulate and round.  It distributes
+    // the points into partitions such the "extra" points are reasonably
+    // distributed among the partitions.
+    double total(0.0);
+    double partition_size = static_cast<double>(size) / num_partitions;
+    m_partitions.push_back(0);
+    for (size_t i = 0; i < num_partitions; ++i)
+    {
+        total += partition_size;
+        size_t itotal = lround(total);
+        m_partitions.push_back(itotal);
+    }
+}
+
+
+void ChipperFilter::decideSplit(ChipRefList& v1, ChipRefList& v2, ChipRefList& spare,
+    PointId pleft, PointId pright)
+{
+    double v1range;
+    double v2range;
+    uint32_t left = m_partitions[pleft];
+    uint32_t right = m_partitions[pright] - 1;
+
+    // Decide the wider direction of the block, and split in that direction
+    // to maintain squareness.
+    v1range = v1[right].m_pos - v1[left].m_pos;
+    v2range = v2[right].m_pos - v2[left].m_pos;
+    if (v1range > v2range)
+        split(v1, v2, spare, pleft, pright);
+    else
+        split(v2, v1, spare, pleft, pright);
+}
+
+void ChipperFilter::split(ChipRefList& wide, ChipRefList& narrow, ChipRefList& spare,
+    PointId pleft, PointId pright)
+{
+    PointId lstart;
+    PointId rstart;
+    PointId pcenter;
+    PointId left;
+    PointId right;
+    PointId center;
+
+    left = m_partitions[pleft];
+    right = m_partitions[pright] - 1;
+
+    // There are two cases in which we are done.
+    // 1) We have a distance of two between left and right.
+    // 2) We have a distance of three between left and right.
+
+    if (pright - pleft == 1)
+        emit(wide, left, right);
+    else if (pright - pleft == 2)
+        finalSplit(wide, narrow, pleft, pright);
+    else
+    {
+        pcenter = (pleft + pright) / 2;
+        center = m_partitions[pcenter];
+
+        // We are splitting in the wide direction - split elements in the
+        // narrow array by copying them to the spare array in the correct
+        // partition.  The spare array then becomes the active narrow array
+        // for the [left,right] partition.
+        lstart = left;
+        rstart = center;
+        for (PointId i = left; i <= right; ++i)
+        {
+            if (narrow[i].m_oindex < center)
+            {
+                spare[lstart] = narrow[i];
+                wide[narrow[i].m_oindex].m_oindex = lstart;
+                lstart++;
+            }
+            else
+            {
+                spare[rstart] = narrow[i];
+                wide[narrow[i].m_oindex].m_oindex = rstart;
+                rstart++;
+            }
+        }
+
+        // Save away the direction so we know which array is X and which is Y
+        // so that when we emit, we can properly label the max/min points.
+        Direction dir = narrow.m_dir;
+        spare.m_dir = dir;
+        decideSplit(wide, spare, narrow, pleft, pcenter);
+        decideSplit(wide, spare, narrow, pcenter, pright);
+        narrow.m_dir = dir;
+    }
+}
+
+// In this case the wide array is like we want it.  The narrow array is
+// ordered, but not for our split, so we have to find the max/min entries
+// for each partition in the final split.
+void ChipperFilter::finalSplit(ChipRefList& wide, ChipRefList& narrow,
+    PointId pleft, PointId pright)
+{
+
+    int64_t left1 = -1;
+    int64_t left2 = -1;
+    int64_t right1 = -1;
+    int64_t right2 = -1;
+
+    // It appears we're using int64_t here because we're using -1 as
+    // an indicator.  I'm not 100% sure that i ends up <0, but I don't
+    // think so.  These casts will at least shut up the compiler, but
+    // I think this code should be revisited to use std::vector<uint32_t>::const_iterator
+    // or std::vector<uint32_t>::size_type instead of this int64_t stuff -- hobu 11/15/10
+    int64_t left = m_partitions[pleft];
+    int64_t right = static_cast<int64_t>(m_partitions[pright] - 1);
+    int64_t center = static_cast<int64_t>(m_partitions[pright - 1]);
+
+    // Find left values for the partitions.
+    for (int64_t i = left; i <= right; ++i)
+    {
+        int64_t idx = static_cast<int64_t>(narrow[static_cast<uint32_t>(i)].m_oindex);
+        if (left1 < 0 && (idx < center))
+        {
+            left1 = i;
+            if (left2 >= 0)
+                break;
+        }
+        else if (left2 < 0 && (idx >= center))
+        {
+            left2 = i;
+            if (left1 >= 0)
+                break;
+        }
+    }
+    // Find right values for the partitions.
+    for (int64_t i = right; i >= left; --i)
+    {
+        int64_t idx = static_cast<int64_t>(narrow[static_cast<uint32_t>(i)].m_oindex);
+        if (right1 < 0 && (idx < center))
+        {
+            right1 = i;
+            if (right2 >= 0)
+                break;
+        }
+        else if (right2 < 0 && (idx >= center))
+        {
+            right2 = i;
+            if (right1 >= 0)
+                break;
+        }
+    }
+
+    // Emit results.
+    emit(wide,
+         left,
+         center - 1);
+    emit(wide,
+         center,
+         right);
+}
+
+void ChipperFilter::emit(ChipRefList& wide, PointId widemin, PointId widemax)
+{
+    PointViewPtr view = m_inView->makeNew();
+    for (size_t idx = widemin; idx <= widemax; ++idx)
+        view->appendPoint(*m_inView.get(), wide[idx].m_ptindex);
+
+    m_outViews.insert(view);
+}
+
+} // namespace pdal
+
diff --git a/filters/chipper/ChipperFilter.hpp b/filters/chipper/ChipperFilter.hpp
new file mode 100644
index 0000000..363b4b9
--- /dev/null
+++ b/filters/chipper/ChipperFilter.hpp
@@ -0,0 +1,177 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  PDAL - http://pdal.org - A BSD library for point cloud data.
+ * Purpose:  PDAL chipper class
+ * Author:   Howard Butler, hobu.inc at gmail.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2011, Howard Butler
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/PointView.hpp>
+
+#include <vector>
+
+extern "C" int32_t ChipperFilter_ExitFunc();
+extern "C" PF_ExitFunc ChipperFilter_InitPlugin();
+
+namespace pdal
+{
+
+class Stage;
+
+
+class PDAL_DLL ChipperFilter;
+
+enum Direction
+{
+    DIR_X,
+    DIR_Y,
+    DIR_NONE
+};
+
+
+class PDAL_DLL ChipPtRef
+{
+    friend class ChipRefList;
+    friend class ChipperFilter;
+
+private:
+    double m_pos;
+    point_count_t m_ptindex;
+    uint32_t m_oindex;
+
+public:
+    bool operator < (const ChipPtRef& pt) const
+    {
+        return m_pos < pt.m_pos;
+    }
+};
+
+
+class PDAL_DLL ChipRefList
+{
+    friend class ChipperFilter;
+
+private:
+    std::vector<ChipPtRef> m_vec;
+    Direction m_dir;
+
+    ChipRefList(Direction dir = DIR_NONE) : m_dir(dir)
+    {}
+    std::vector<ChipPtRef>::size_type size() const
+    {
+        return m_vec.size();
+    }
+    void reserve(std::vector<ChipPtRef>::size_type n)
+    {
+        m_vec.reserve(n);
+    }
+    void resize(std::vector<ChipPtRef>::size_type n)
+    {
+        m_vec.resize(n);
+    }
+    void push_back(const ChipPtRef& ref)
+    {
+        m_vec.push_back(ref);
+    }
+    std::vector<ChipPtRef>::iterator begin()
+    {
+        return m_vec.begin();
+    }
+    std::vector<ChipPtRef>::iterator end()
+    {
+        return m_vec.end();
+    }
+    ChipPtRef& operator[](uint32_t pos)
+    {
+        return m_vec[pos];
+    }
+    std::string Dir()
+    {
+        if (m_dir == DIR_X)
+            return "X";
+        else if (m_dir == DIR_Y)
+            return "Y";
+        else
+            return "NONE";
+    }
+};
+
+
+class PDAL_DLL ChipperFilter : public pdal::Filter
+{
+public:
+    ChipperFilter() : Filter(),
+        m_xvec(DIR_X), m_yvec(DIR_Y), m_spare(DIR_NONE)
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void processOptions(const Options& options);
+    virtual PointViewSet run(PointViewPtr view);
+
+    void load(PointView& view, ChipRefList& xvec,
+        ChipRefList& yvec, ChipRefList& spare);
+    void partition(point_count_t size);
+    void decideSplit(ChipRefList& v1, ChipRefList& v2,
+        ChipRefList& spare, PointId left, PointId right);
+    void split(ChipRefList& wide, ChipRefList& narrow,
+        ChipRefList& spare, PointId left, PointId right);
+    void finalSplit(ChipRefList& wide, ChipRefList& narrow,
+        PointId pleft, PointId pcenter);
+    void emit(ChipRefList& wide, PointId widemin, PointId widemax);
+
+    PointId m_threshold;
+    PointViewPtr m_inView;
+    PointViewSet m_outViews;
+    std::vector<PointId> m_partitions;
+    ChipRefList m_xvec;
+    ChipRefList m_yvec;
+    ChipRefList m_spare;
+
+    ChipperFilter& operator=(const ChipperFilter&); // not implemented
+    ChipperFilter(const ChipperFilter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/filters/colorization/CMakeLists.txt b/filters/colorization/CMakeLists.txt
new file mode 100644
index 0000000..21c35e3
--- /dev/null
+++ b/filters/colorization/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Colorization filter CMake configuration
+#
+
+#
+# Colorization Filter
+#
+set(srcs
+    ColorizationFilter.cpp
+)
+
+set(incs
+    ColorizationFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter colorization "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/colorization/ColorizationFilter.cpp b/filters/colorization/ColorizationFilter.cpp
new file mode 100644
index 0000000..96767fb
--- /dev/null
+++ b/filters/colorization/ColorizationFilter.cpp
@@ -0,0 +1,254 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "ColorizationFilter.hpp"
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/PointView.hpp>
+
+#include <gdal.h>
+#include <ogr_spatialref.h>
+
+#include <array>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.colorization",
+    "Fetch and assign RGB color information from a GDAL-readable datasource.",
+    "http://pdal.io/stages/filters.colorization.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, ColorizationFilter, Filter, s_info)
+
+std::string ColorizationFilter::getName() const { return s_info.name; }
+
+struct GDALSourceDeleter
+{
+    template <typename T>
+    void operator()(T* ptr)
+    {
+        ::GDALClose(ptr);
+    }
+};
+
+
+void ColorizationFilter::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log());
+}
+
+
+Options ColorizationFilter::getDefaultOptions()
+{
+    Options options;
+
+    pdal::Option red("dimension", "Red", "");
+    pdal::Option b0("band",1, "");
+    pdal::Option s0("scale", 1.0f, "scale factor for this dimension");
+    pdal::Options redO;
+    redO.add(b0);
+    redO.add(s0);
+    red.setOptions(redO);
+
+    pdal::Option green("dimension", "Green", "");
+    pdal::Option b1("band",2, "");
+    pdal::Option s1("scale", 1.0f, "scale factor for this dimension");
+    pdal::Options greenO;
+    greenO.add(b1);
+    greenO.add(s1);
+    green.setOptions(greenO);
+
+    pdal::Option blue("dimension", "Blue", "");
+    pdal::Option b2("band",3, "");
+    pdal::Option s2("scale", 1.0f, "scale factor for this dimension");
+    pdal::Options blueO;
+    blueO.add(b2);
+    blueO.add(s2);
+    blue.setOptions(blueO);
+
+    pdal::Option reproject("reproject", false,
+        "Reproject the input data into the same coordinate system as "
+        "the raster?");
+
+    options.add(red);
+    options.add(green);
+    options.add(blue);
+    options.add(reproject);
+
+    return options;
+}
+
+
+void ColorizationFilter::processOptions(const Options& options)
+{
+    m_rasterFilename = options.getValueOrThrow<std::string>("raster");
+    std::vector<Option> dimensions = options.getOptions("dimension");
+
+    if (dimensions.size() == 0)
+    {
+        m_bands.emplace_back("Red", Dimension::Id::Red, 1, 1.0);
+        m_bands.emplace_back("Green", Dimension::Id::Green, 2, 1.0);
+        m_bands.emplace_back("Blue", Dimension::Id::Blue, 3, 1.0);
+        log()->get(LogLevel::Debug) << "No dimension mappings were given. "
+            "Using default mappings." << std::endl;
+    }
+    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    {
+        std::string name = i->getValue<std::string>();
+        boost::optional<Options const&> dimensionOptions = i->getOptions();
+        if (!dimensionOptions)
+        {
+            std::ostringstream oss;
+            oss << "No band and scaling information given for dimension '" <<
+                name << "'";
+            throw pdal_error(oss.str());
+        }
+        uint32_t bandId =
+            dimensionOptions->getValueOrThrow<uint32_t>("band");
+        double scale =
+            dimensionOptions->getValueOrDefault<double>("scale", 1.0);
+        m_bands.emplace_back(name, Dimension::Id::Unknown, bandId, scale);
+    }
+}
+
+
+void ColorizationFilter::addDimensions(PointLayoutPtr layout)
+{
+    for (auto& band : m_bands)
+        band.m_dim = layout->registerOrAssignDim(band.m_name,
+            Dimension::defaultType(Dimension::Id::Red));
+}
+
+
+void ColorizationFilter::ready(PointTableRef table)
+{
+    m_forward_transform.assign(0.0);
+    m_inverse_transform.assign(0.0);
+
+    log()->get(LogLevel::Debug) << "Using " << m_rasterFilename <<
+        " for raster" << std::endl;
+    m_ds = GDALOpen(m_rasterFilename.c_str(), GA_ReadOnly);
+    if (m_ds == NULL)
+        throw pdal_error("Unable to open GDAL datasource!");
+
+    if (GDALGetGeoTransform(m_ds, &(m_forward_transform.front())) != CE_None)
+        throw pdal_error("unable to fetch forward geotransform for raster!");
+
+    if (!GDALInvGeoTransform(&(m_forward_transform.front()),
+        &(m_inverse_transform.front())))
+        throw pdal_error("unable to fetch inverse geotransform for raster!");
+
+    for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
+    {
+        if (bi->m_dim == Dimension::Id::Unknown)
+            bi->m_dim = table.layout()->findDim(bi->m_name);
+        if (bi->m_dim == Dimension::Id::Unknown)
+            throw pdal_error((std::string)"Can't colorize - no dimension " +
+                bi->m_name);
+    }
+}
+
+
+void ColorizationFilter::filter(PointView& view)
+{
+    int32_t pixel(0);
+    int32_t line(0);
+
+    std::array<double, 2> pix = { {0.0, 0.0} };
+    for (PointId idx = 0; idx < view.size(); ++idx)
+    {
+        double x = view.getFieldAs<double>(Dimension::Id::X, idx);
+        double y = view.getFieldAs<double>(Dimension::Id::Y, idx);
+
+        if (!getPixelAndLinePosition(x, y, m_inverse_transform, pixel,
+                line, m_ds))
+            continue;
+
+        for (auto bi = m_bands.begin(); bi != m_bands.end(); ++bi)
+        {
+            BandInfo& b = *bi;
+            GDALRasterBandH hBand = GDALGetRasterBand(m_ds, b.m_band);
+            if (hBand == NULL)
+            {
+                std::ostringstream oss;
+                oss << "Unable to get band " << b.m_band <<
+                    " from data source!";
+                throw pdal_error(oss.str());
+            }
+            if (GDALRasterIO(hBand, GF_Read, pixel, line, 1, 1,
+                &pix[0], 1, 1, GDT_CFloat64, 0, 0) == CE_None)
+                view.setField(b.m_dim, idx, pix[0] * b.m_scale);
+        }
+    }
+}
+
+
+// Determines the pixel/line position given an x/y.
+// No reprojection is done at this time.
+bool ColorizationFilter::getPixelAndLinePosition(double x, double y,
+    boost::array<double, 6> const& inverse, int32_t& pixel,
+    int32_t& line, void *ds)
+{
+    pixel = (int32_t)std::floor(inverse[0] + (inverse[1] * x) +
+        (inverse[2] * y));
+    line = (int32_t) std::floor(inverse[3] + (inverse[4] * x) +
+        (inverse[5] * y));
+
+    int xs = GDALGetRasterXSize(ds);
+    int ys = GDALGetRasterYSize(ds);
+
+    if (!xs || !ys)
+        throw pdal_error("Unable to get X or Y size from raster!");
+
+    if (pixel < 0 || line < 0 || pixel >= xs || line  >= ys)
+    {
+        // The x, y is not coincident with this raster
+        return false;
+    }
+
+    return true;
+}
+
+
+void ColorizationFilter::done(PointTableRef /*table*/)
+{
+    if (m_ds != 0)
+    {
+        GDALClose(m_ds);
+        m_ds = 0;
+    }
+}
+
+} // namespace pdal
diff --git a/filters/colorization/ColorizationFilter.hpp b/filters/colorization/ColorizationFilter.hpp
new file mode 100644
index 0000000..9095850
--- /dev/null
+++ b/filters/colorization/ColorizationFilter.hpp
@@ -0,0 +1,108 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <boost/array.hpp>
+
+#include <gdal.h>
+#include <ogr_spatialref.h>
+#include <pdal/GDALUtils.hpp>
+
+#include <map>
+
+extern "C" int32_t ColorizationFilter_ExitFunc();
+extern "C" PF_ExitFunc ColorizationFilter_InitPlugin();
+
+namespace pdal
+{
+
+namespace gdal
+{ class GlobalDebug; }
+
+// Provides GDAL-based raster overlay that places output data in
+// specified dimensions. It also supports scaling the data by a multiplier
+// on a per-dimension basis.
+class PDAL_DLL ColorizationFilter : public Filter
+{
+
+struct BandInfo
+{
+    BandInfo(const std::string& name, Dimension::Id::Enum dim, uint32_t band,
+        double scale) : m_name(name), m_dim(dim), m_band(band), m_scale(scale)
+    {}
+
+    std::string m_name;
+    Dimension::Id::Enum m_dim;
+    uint32_t m_band;
+    double m_scale;
+};
+
+public:
+    ColorizationFilter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void initialize();
+    virtual void processOptions(const Options&);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual void filter(PointView& view);
+    virtual void done(PointTableRef table);
+
+    bool getPixelAndLinePosition(double x, double y,
+        boost::array<double, 6> const& inverse, int32_t& pixel,
+        int32_t& line, void *ds);
+
+    std::string m_rasterFilename;
+    std::vector<BandInfo> m_bands;
+
+    boost::array<double, 6> m_forward_transform;
+    boost::array<double, 6> m_inverse_transform;
+
+    GDALDatasetH m_ds;
+
+    ColorizationFilter& operator=(const ColorizationFilter&); // not implemented
+    ColorizationFilter(const ColorizationFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/crop/CMakeLists.txt b/filters/crop/CMakeLists.txt
new file mode 100644
index 0000000..71920eb
--- /dev/null
+++ b/filters/crop/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Crop filter CMake configuration
+#
+
+#
+# Crop Filter
+#
+set(srcs
+    CropFilter.cpp
+)
+
+set(incs
+    CropFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter crop "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/crop/CropFilter.cpp b/filters/crop/CropFilter.cpp
new file mode 100644
index 0000000..683c39c
--- /dev/null
+++ b/filters/crop/CropFilter.cpp
@@ -0,0 +1,332 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "CropFilter.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/GDALUtils.hpp>
+
+#include <sstream>
+#include <cstdarg>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.crop",
+    "Filter points inside or outside a bounding box or a polygon if PDAL was built with GEOS support.",
+    "http://pdal.io/stages/filters.crop.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, CropFilter, Filter, s_info)
+
+std::string CropFilter::getName() const { return s_info.name; }
+
+#ifdef PDAL_HAVE_GEOS
+namespace geos
+{
+
+static void _GEOSErrorHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    va_start(args, fmt);
+    char buf[1024];
+
+    vsnprintf(buf, sizeof(buf), fmt, args);
+    std::cerr << "GEOS Error: " << buf << std::endl;
+
+    va_end(args);
+}
+
+static void _GEOSWarningHandler(const char *fmt, ...)
+{
+    va_list args;
+
+    char buf[1024];
+    vsnprintf(buf, sizeof(buf), fmt, args);
+    std::cout << "GEOS warning: " << buf << std::endl;
+
+    va_end(args);
+}
+
+} // geos
+#endif
+
+CropFilter::CropFilter() : pdal::Filter()
+{
+    m_cropOutside = false;
+#ifdef PDAL_HAVE_GEOS
+    m_geosEnvironment = 0;
+#endif
+}
+
+
+void CropFilter::processOptions(const Options& options)
+{
+    m_cropOutside = options.getValueOrDefault<bool>("outside", false);
+    m_assignedSRS = options.getValueOrDefault<SpatialReference>("a_srs");
+    try
+    {
+        m_bounds = options.getValues<BOX2D>("bounds");
+    }
+    catch (boost::bad_lexical_cast)
+    {
+        try
+        {
+            std::vector<BOX3D>  b3d = options.getValues<BOX3D>("bounds");
+            for (auto& i: b3d)
+                m_bounds.push_back(i.to2d());
+//             m_bounds = b3d.to2d();
+        }
+        catch (boost::bad_lexical_cast)
+        {
+            std::ostringstream oss;
+            oss << "Invalid bounds for " << getName() << ".  "
+                "Format: '([xmin,xmax],[ymin,ymax])'.";
+            throw pdal_error(oss.str());
+        }
+    }
+
+    m_polys = options.getValues<std::string>("polygon");
+#ifdef PDAL_HAVE_GEOS
+    if (m_polys.size())
+    {
+        m_geosEnvironment = initGEOS_r(pdal::geos::_GEOSWarningHandler,
+            pdal::geos::_GEOSErrorHandler);
+        for (std::string poly : m_polys)
+        {
+            GeomPkg g;
+
+            // Throws if invalid.
+            g.m_geom = validatePolygon(poly);
+            m_geoms.push_back(g);
+        }
+    }
+#else
+    if (m_polys.size())
+    {
+        std::ostringstream oss;
+
+        oss << "Can't specify polygons for " << getName() <<
+            " without PDAL built with GEOS.";
+        throw pdal_error(oss.str());
+    }
+#endif
+}
+
+
+void CropFilter::ready(PointTableRef table)
+{
+#ifdef PDAL_HAVE_GEOS
+    for (auto& g : m_geoms)
+        preparePolygon(g, table.spatialRef());
+#endif
+}
+
+
+#ifdef PDAL_HAVE_GEOS
+GEOSGeometry *CropFilter::validatePolygon(const std::string& poly)
+{
+    GEOSGeometry *geom = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
+    if (!geom)
+    {
+        std::ostringstream oss;
+        oss << "Invalid polygon specification for " << getName() <<
+            ": " << poly << ".";
+        throw pdal_error(oss.str());
+    }
+
+    int gtype = GEOSGeomTypeId_r(m_geosEnvironment, geom);
+    if (gtype != GEOS_POLYGON && gtype != GEOS_MULTIPOLYGON)
+    {
+        std::ostringstream oss;
+        oss << "Invalid polygon type for " << getName() << ": " <<
+            poly << ".  Must be POLYGON or MULTIPOLYGON.";
+        throw pdal_error(oss.str());
+    }
+
+    if (!GEOSisValid_r(m_geosEnvironment, geom))
+    {
+        char *reason = GEOSisValidReason_r(m_geosEnvironment, geom);
+        std::ostringstream oss;
+        oss << "WKT representation of (multi)polygon '" << poly <<
+            "' invalid: " << reason << ".";
+        GEOSFree_r(m_geosEnvironment, reason);
+        throw pdal_error(oss.str());
+    }
+    return geom;
+}
+
+
+void CropFilter::preparePolygon(GeomPkg& g, const SpatialReference& to)
+{
+    char* out_wkt = GEOSGeomToWKT_r(m_geosEnvironment, g.m_geom);
+    std::string poly(out_wkt);
+    poly = transformWkt(poly, m_assignedSRS, to);
+    log()->get(LogLevel::Debug2) << "Ingested WKT for filters.crop: " <<
+        poly <<std::endl;
+    GEOSFree_r(m_geosEnvironment, out_wkt);
+
+    // Store transformed geometry.
+    GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
+    g.m_geom = GEOSGeomFromWKT_r(m_geosEnvironment, poly.c_str());
+    g.m_prepGeom = GEOSPrepare_r(m_geosEnvironment, g.m_geom);
+    if (!g.m_prepGeom)
+        throw pdal_error("unable to prepare geometry for index-accelerated "
+            "intersection");
+}
+#endif
+
+
+Options CropFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("bounds", BOX2D(), "bounds to crop to");
+    options.add("polygon", std::string(""), "WKT POLYGON() string to "
+        "use to filter points");
+    options.add("inside", true, "Keep points that are inside or outside "
+        "the given polygon");
+
+    return options;
+}
+
+
+PointViewSet CropFilter::run(PointViewPtr view)
+{
+    PointViewSet viewSet;
+
+    // Don't do anything if no bounds have been specified.
+    if (m_geoms.empty() && m_bounds.empty())
+    {
+        viewSet.insert(view);
+        return viewSet;
+    }
+
+#ifdef PDAL_HAVE_GEOS
+    for (const auto& geom : m_geoms)
+    {
+        PointViewPtr outView = view->makeNew();
+        crop(geom, *view, *outView);
+        viewSet.insert(outView);
+    }
+#endif
+    for (auto& box : m_bounds)
+    {
+        PointViewPtr outView = view->makeNew();
+        crop(box, *view, *outView);
+        viewSet.insert(outView);
+    }
+    return viewSet;
+}
+
+void CropFilter::crop(const BOX2D& box, PointView& input, PointView& output)
+{
+    for (PointId idx = 0; idx < input.size(); ++idx)
+    {
+        double x = input.getFieldAs<double>(Dimension::Id::X, idx);
+        double y = input.getFieldAs<double>(Dimension::Id::Y, idx);
+
+        bool contained = box.contains(x, y);
+        if (m_cropOutside != box.contains(x, y))
+            output.appendPoint(input, idx);
+    }
+}
+
+#ifdef PDAL_HAVE_GEOS
+GEOSGeometry *CropFilter::createPoint(double x, double y, double z)
+{
+    // precise filtering based on the geometry
+    GEOSCoordSequence* coords = GEOSCoordSeq_create_r(m_geosEnvironment, 1, 3);
+    if (!coords)
+        throw pdal_error("Unable to allocate coordinate sequence");
+
+    if (!GEOSCoordSeq_setX_r(m_geosEnvironment, coords, 0, x))
+        throw pdal_error("unable to set x for coordinate sequence");
+    if (!GEOSCoordSeq_setY_r(m_geosEnvironment, coords, 0, y))
+        throw pdal_error("unable to set y for coordinate sequence");
+    if (!GEOSCoordSeq_setZ_r(m_geosEnvironment, coords, 0, z))
+        throw pdal_error("unable to set z for coordinate sequence");
+    GEOSGeometry* p = GEOSGeom_createPoint_r(m_geosEnvironment, coords);
+    if (!p)
+        throw pdal_error("unable to allocate candidate test point");
+    return p;
+}
+
+
+
+void CropFilter::crop(const GeomPkg& g, PointView& input, PointView& output)
+{
+    bool logOutput = (log()->getLevel() > LogLevel::Debug4);
+    if (logOutput)
+        log()->floatPrecision(8);
+
+    for (PointId idx = 0; idx < input.size(); ++idx)
+    {
+        double x = input.getFieldAs<double>(Dimension::Id::X, idx);
+        double y = input.getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = input.getFieldAs<double>(Dimension::Id::Z, idx);
+
+        if (logOutput)
+        {
+            log()->floatPrecision(10);
+            log()->get(LogLevel::Debug5) << "input: " << x << " y: " << y <<
+                " z: " << z << std::endl;
+        }
+
+        GEOSGeometry *p = createPoint(x, y, z);
+        bool covers = (bool)(GEOSPreparedCovers_r(m_geosEnvironment,
+            g.m_prepGeom, p));
+        if (m_cropOutside != covers)
+            output.appendPoint(input, idx);
+        GEOSGeom_destroy_r(m_geosEnvironment, p);
+    }
+}
+#endif
+
+
+void CropFilter::done(PointTableRef /*table*/)
+{
+#ifdef PDAL_HAVE_GEOS
+    for (auto& g : m_geoms)
+    {
+        GEOSPreparedGeom_destroy_r(m_geosEnvironment, g.m_prepGeom);
+        GEOSGeom_destroy_r(m_geosEnvironment, g.m_geom);
+    }
+    if (m_geosEnvironment)
+        finishGEOS_r(m_geosEnvironment);
+#endif
+}
+
+} // namespace pdal
diff --git a/filters/crop/CropFilter.hpp b/filters/crop/CropFilter.hpp
new file mode 100644
index 0000000..7e1d324
--- /dev/null
+++ b/filters/crop/CropFilter.hpp
@@ -0,0 +1,100 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#ifdef PDAL_HAVE_GEOS
+#include <geos_c.h>
+#endif
+
+extern "C" int32_t CropFilter_ExitFunc();
+extern "C" PF_ExitFunc CropFilter_InitPlugin();
+
+namespace pdal
+{
+
+// removes any points outside of the given range
+// updates the header accordingly
+class PDAL_DLL CropFilter : public Filter
+{
+public:
+    CropFilter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    std::vector<BOX2D> m_bounds;
+    bool m_cropOutside;
+    StringList m_polys;
+    SpatialReference m_assignedSRS;
+
+#ifndef PDAL_HAVE_GEOS
+    typedef void *GEOSContextHandle_t;
+    typedef void GEOSGeometry;
+    typedef void GEOSPreparedGeometry;
+#endif
+
+	GEOSContextHandle_t m_geosEnvironment;
+    struct GeomPkg
+    {
+        GEOSGeometry *m_geom;
+        const GEOSPreparedGeometry *m_prepGeom;
+    };
+
+    std::vector<GeomPkg> m_geoms;
+
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual PointViewSet run(PointViewPtr view);
+    virtual void done(PointTableRef table);
+    void crop(const BOX2D& box, PointView& input, PointView& output);
+    void crop(const GeomPkg& g, PointView& input, PointView& output);
+#ifdef PDAL_HAVE_GEOS
+    GEOSGeometry *validatePolygon(const std::string& poly);
+    void preparePolygon(GeomPkg& g, const SpatialReference& to);
+    BOX2D computeBounds(GEOSGeometry const *geometry);
+    GEOSGeometry *createPoint(double x, double y, double z);
+#endif
+
+    CropFilter& operator=(const CropFilter&); // not implemented
+    CropFilter(const CropFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/decimation/CMakeLists.txt b/filters/decimation/CMakeLists.txt
new file mode 100644
index 0000000..162ba23
--- /dev/null
+++ b/filters/decimation/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Decimation filter CMake configuration
+#
+
+#
+# Decimation Filter
+#
+set(srcs
+    DecimationFilter.cpp
+)
+
+set(incs
+    DecimationFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter decimation "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/decimation/DecimationFilter.cpp b/filters/decimation/DecimationFilter.cpp
new file mode 100644
index 0000000..fd8e51d
--- /dev/null
+++ b/filters/decimation/DecimationFilter.cpp
@@ -0,0 +1,76 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "DecimationFilter.hpp"
+
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.decimation",
+    "Rank decimation filter. Keep every Nth point",
+    "http://pdal.io/stages/filters.decimation.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, DecimationFilter, Filter,  s_info)
+
+std::string DecimationFilter::getName() const { return s_info.name; }
+
+void DecimationFilter::processOptions(const Options& options)
+{
+    m_step = options.getValueOrDefault<uint32_t>("step", 1);
+    m_offset = options.getValueOrDefault<uint32_t>("offset", 0);
+    m_limit = options.getValueOrDefault<point_count_t>("limit", 0);
+}
+
+
+PointViewSet DecimationFilter::run(PointViewPtr inView)
+{
+    PointViewSet viewSet;
+    PointViewPtr outView = inView->makeNew();
+    decimate(*inView.get(), *outView.get());
+    viewSet.insert(outView);
+    return viewSet;
+}
+
+
+void DecimationFilter::decimate(PointView& input, PointView& output)
+{
+    PointId last_idx = (m_limit > 0) ? m_limit : input.size();
+    for (PointId idx = m_offset; idx < last_idx; idx += m_step)
+        output.appendPoint(input, idx);
+}
+
+} // pdal
diff --git a/filters/decimation/DecimationFilter.hpp b/filters/decimation/DecimationFilter.hpp
new file mode 100644
index 0000000..b96c819
--- /dev/null
+++ b/filters/decimation/DecimationFilter.hpp
@@ -0,0 +1,69 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+extern "C" int32_t DecimationFilter_ExitFunc();
+extern "C" PF_ExitFunc DecimationFilter_InitPlugin();
+
+namespace pdal
+{
+
+// we keep only 1 out of every step points; if step=100, we get 1% of the file
+class PDAL_DLL DecimationFilter : public Filter
+{
+public:
+    DecimationFilter()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    uint32_t m_step;
+    uint32_t m_offset;
+    point_count_t m_limit;
+
+    virtual void processOptions(const Options& options);
+    PointViewSet run(PointViewPtr view);
+    void decimate(PointView& input, PointView& output);
+
+    DecimationFilter& operator=(const DecimationFilter&); // not implemented
+    DecimationFilter(const DecimationFilter&); // not implemented
+};
+
+} // pdal
diff --git a/filters/ferry/CMakeLists.txt b/filters/ferry/CMakeLists.txt
new file mode 100644
index 0000000..9c5328b
--- /dev/null
+++ b/filters/ferry/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Ferry filter CMake configuration
+#
+
+#
+# Ferry Filter
+#
+set(srcs
+    FerryFilter.cpp
+)
+
+set(incs
+    FerryFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter ferry "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/ferry/FerryFilter.cpp b/filters/ferry/FerryFilter.cpp
new file mode 100644
index 0000000..197770f
--- /dev/null
+++ b/filters/ferry/FerryFilter.cpp
@@ -0,0 +1,128 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, howard at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "FerryFilter.hpp"
+
+#include <pdal/pdal_export.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.ferry",
+    "Copy date from one dimension to another.",
+    "http://pdal.io/stages/filters.ferry.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, FerryFilter, Filter, s_info)
+
+std::string FerryFilter::getName() const { return s_info.name; }
+
+Options FerryFilter::getDefaultOptions()
+{
+    Options options;
+
+    pdal::Option red("dimension", "Red", "");
+    pdal::Option b0("to","Red2", "");
+    pdal::Option def("def","Red2", "");
+    pdal::Options redO;
+    redO.add(b0);
+    redO.add(def);
+    red.setOptions(redO);
+
+    options.add(red);
+
+    return options;
+}
+
+
+void FerryFilter::processOptions(const Options& options)
+{
+    std::vector<Option> dimensions = options.getOptions("dimension");
+    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    {
+        std::string name = i->getValue<std::string>();
+        boost::optional<Options const&> dimensionOptions = i->getOptions();
+        if (!dimensionOptions)
+        {
+            std::ostringstream oss;
+            oss << "No 'to' dimension given for dimension '" <<
+                name << "'";
+            throw pdal_error(oss.str());
+        }
+        std::string to_dim =
+            dimensionOptions->getValueOrThrow<std::string>("to");
+        if (boost::algorithm::iequals(name, to_dim))
+        {
+            std::ostringstream oss;
+            oss << "The from and to dimension cannot be the same"
+                << " name for dimension '" << name << "'";
+            throw pdal_error(oss.str());
+        }
+        m_name_map.insert(std::make_pair(name, to_dim));
+    }
+}
+void FerryFilter::addDimensions(PointLayoutPtr layout)
+{
+    for (const auto& dim_par : m_name_map)
+    {
+        layout->registerOrAssignDim(dim_par.second, Dimension::Type::Double);
+    }
+}
+
+void FerryFilter::ready(PointTableRef table)
+{
+    const PointLayoutPtr layout(table.layout());
+    for (const auto& dim_par : m_name_map)
+    {
+        Dimension::Id::Enum f = layout->findDim(dim_par.first);
+        Dimension::Id::Enum t = layout->findDim(dim_par.second);
+        m_dimensions_map.insert(std::make_pair(f,t));
+    }
+}
+
+
+void FerryFilter::filter(PointView& view)
+{
+    for (PointId id = 0; id < view.size(); ++id)
+    {
+        for (const auto& dim_par : m_dimensions_map)
+        {
+            double v = view.getFieldAs<double>(dim_par.first, id);
+            view.setField(dim_par.second, id, v);
+        }
+    }
+}
+
+
+} // namespace pdal
diff --git a/filters/ferry/FerryFilter.hpp b/filters/ferry/FerryFilter.hpp
new file mode 100644
index 0000000..6305728
--- /dev/null
+++ b/filters/ferry/FerryFilter.hpp
@@ -0,0 +1,73 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <map>
+#include <string>
+
+extern "C" int32_t FerryFilter_ExitFunc();
+extern "C" PF_ExitFunc FerryFilter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL FerryFilter : public Filter
+{
+public:
+    FerryFilter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void processOptions(const Options&);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual void filter(PointView& view);
+
+    FerryFilter& operator=(const FerryFilter&); // not implemented
+    FerryFilter(const FerryFilter&); // not implemented
+
+    std::map<std::string, std::string> m_name_map;
+    std::map< Dimension::Id::Enum ,  Dimension::Id::Enum > m_dimensions_map;
+};
+
+} // namespace pdal
diff --git a/filters/merge/CMakeLists.txt b/filters/merge/CMakeLists.txt
new file mode 100644
index 0000000..2f12079
--- /dev/null
+++ b/filters/merge/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(srcs MergeFilter.cpp)
+set(incs MergeFilter.hpp)
+
+PDAL_ADD_DRIVER(filter merge "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/merge/MergeFilter.cpp b/filters/merge/MergeFilter.cpp
new file mode 100644
index 0000000..d0b409b
--- /dev/null
+++ b/filters/merge/MergeFilter.cpp
@@ -0,0 +1,50 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+ * Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Andrew Bell or libLAS nor the names of
+ *       its contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "MergeFilter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.merge",
+    "Merge data from two different readers into a single stream.",
+    "http://pdal.io/stages/filters.merge.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, MergeFilter, Filter, s_info)
+
+std::string MergeFilter::getName() const { return s_info.name; }
+
+} // namespace pdal
+
diff --git a/filters/merge/MergeFilter.hpp b/filters/merge/MergeFilter.hpp
new file mode 100644
index 0000000..e71b77a
--- /dev/null
+++ b/filters/merge/MergeFilter.hpp
@@ -0,0 +1,75 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+extern "C" int32_t MergeFilter_ExitFunc();
+extern "C" PF_ExitFunc MergeFilter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL MergeFilter : public MultiFilter
+{
+public:
+    MergeFilter ()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    PointViewPtr m_view;
+
+    virtual void ready(PointTableRef table)
+        { m_view.reset(new PointView(table)); }
+
+    virtual PointViewSet run(PointViewPtr in)
+    {
+        PointViewSet viewSet;
+
+        m_view->append(*in.get());
+        viewSet.insert(m_view);
+        return viewSet;
+    }
+
+    MergeFilter& operator=(const MergeFilter&); // not implemented
+    MergeFilter(const MergeFilter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/filters/mortonorder/CMakeLists.txt b/filters/mortonorder/CMakeLists.txt
new file mode 100644
index 0000000..47b3e77
--- /dev/null
+++ b/filters/mortonorder/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# MortonOrder filter CMake configuration
+#
+
+#
+# MortonOrder Filter
+#
+set(srcs
+    MortonOrderFilter.cpp
+)
+
+set(incs
+    MortonOrderFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter mortonorder "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/mortonorder/MortonOrderFilter.cpp b/filters/mortonorder/MortonOrderFilter.cpp
new file mode 100644
index 0000000..0f72fa6
--- /dev/null
+++ b/filters/mortonorder/MortonOrderFilter.cpp
@@ -0,0 +1,128 @@
+/******************************************************************************
+ * Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "MortonOrderFilter.hpp"
+
+#include <iostream>
+#include <limits>
+#include <map>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.mortonorder",
+    "Morton or z-order sorting of points. See http://en.wikipedia.org/wiki/Z-order_curve for more detail.",
+    "http://pdal.io/stages/filters.mortonorder.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, MortonOrderFilter, Filter, s_info)
+
+std::string MortonOrderFilter::getName() const { return s_info.name; }
+
+Options MortonOrderFilter::getDefaultOptions()
+{
+    Options options;
+    return options;
+}
+
+
+//This used to be a lambda, but the VS compiler exploded, I guess.
+typedef std::pair<double, double> Coord;
+namespace
+{
+bool less_msb(const int& x, const int& y)
+{
+    return x < y && x < (x ^ y);
+};
+
+class CmpZOrder
+{
+public:
+    bool operator()(const Coord& c1, const Coord& c2) const
+    {
+        int a[2] = {(int)(c1.first * INT_MAX), (int)(c1.second * INT_MAX)};
+        int b[2] = {(int)(c2.first * INT_MAX), (int)(c2.second * INT_MAX)};
+
+        int j = 0;
+        int x = 0;
+
+        for (int k = 0; k < 2; k++)
+        {
+            int y = a[k] ^ b[k];
+            if (less_msb(x, y))
+            {
+                j = k;
+                x = y;
+            }
+        }
+        return (a[j] - b[j]) < 0;
+    };
+};
+}
+
+PointViewSet MortonOrderFilter::run(PointViewPtr inView)
+{
+    PointViewSet viewSet;
+    if (!inView->size())
+        return viewSet;
+    CmpZOrder compare;
+    std::multimap<Coord, PointId, CmpZOrder> sorted(compare);
+
+    BOX2D buffer_bounds;
+    inView->calculateBounds(buffer_bounds);
+    double xrange = buffer_bounds.maxx - buffer_bounds.minx;
+    double yrange = buffer_bounds.maxy - buffer_bounds.miny;
+
+    for (PointId idx = 0; idx < inView->size(); idx++)
+    {
+        double xpos = (inView->getFieldAs<double>(Dimension::Id::X, idx) -
+            buffer_bounds.minx) / xrange;
+        double ypos = (inView->getFieldAs<double>(Dimension::Id::Y, idx) -
+            buffer_bounds.miny) / yrange;
+        Coord loc(xpos, ypos);
+        sorted.insert(std::make_pair(loc, idx));
+    }
+
+    PointViewPtr outView = inView->makeNew();
+    std::multimap<Coord, PointId, CmpZOrder>::iterator pos;
+    for (pos = sorted.begin(); pos != sorted.end(); ++pos)
+    {
+        outView->appendPoint(*inView, pos->second);
+    }
+    viewSet.insert(outView);
+
+    return viewSet;
+}
+
+} // pdal
diff --git a/filters/mortonorder/MortonOrderFilter.hpp b/filters/mortonorder/MortonOrderFilter.hpp
new file mode 100644
index 0000000..e8e192a
--- /dev/null
+++ b/filters/mortonorder/MortonOrderFilter.hpp
@@ -0,0 +1,65 @@
+/******************************************************************************
+ * Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+extern "C" int32_t MortonOrderFilter_ExitFunc();
+extern "C" PF_ExitFunc MortonOrderFilter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL MortonOrderFilter : public pdal::Filter
+{
+public:
+    MortonOrderFilter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void processOptions(const Options& ) {};
+    virtual PointViewSet run(PointViewPtr view);
+
+    MortonOrderFilter& operator=(const MortonOrderFilter&); // not implemented
+    MortonOrderFilter(const MortonOrderFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/range/CMakeLists.txt b/filters/range/CMakeLists.txt
new file mode 100644
index 0000000..6575bf5
--- /dev/null
+++ b/filters/range/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(srcs RangeFilter.cpp)
+set(incs RangeFilter.hpp)
+
+PDAL_ADD_DRIVER(filter range "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/range/RangeFilter.cpp b/filters/range/RangeFilter.cpp
new file mode 100644
index 0000000..f4d6b64
--- /dev/null
+++ b/filters/range/RangeFilter.cpp
@@ -0,0 +1,129 @@
+/******************************************************************************
+ * Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "RangeFilter.hpp"
+
+#include <cmath>
+#include <limits>
+#include <map>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.range",
+    "Pass only points given a dimension/range.",
+    "http://pdal.io/stages/filters.range.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, RangeFilter, Filter, s_info)
+
+std::string RangeFilter::getName() const { return s_info.name; }
+
+void RangeFilter::processOptions(const Options& options)
+{
+    std::vector<Option> dimensions = options.getOptions("dimension");
+    if (dimensions.size() == 0)
+        throw pdal_error("No dimensions given");
+
+    for (auto const& d : dimensions)
+    {
+        std::string name = d.getValue<std::string>();
+        boost::optional<Options const&> dimensionOptions = d.getOptions();
+        if (!dimensionOptions)
+            throw pdal_error("No dimension options");
+
+        double val =dimensionOptions->getValueOrDefault<double>("equals",
+            (std::numeric_limits<double>::max)());
+        double min = dimensionOptions->getValueOrDefault<double>("min",
+            -(std::numeric_limits<double>::max)());
+        double max = dimensionOptions->getValueOrDefault<double>("max",
+            (std::numeric_limits<double>::max)());
+
+        if (val != (std::numeric_limits<double>::max)())
+            min = max = val;
+
+        Range range;
+        range.min = min;
+        range.max = max;
+
+        m_name_map.insert(std::make_pair(name, range));
+    }
+}
+
+void RangeFilter::ready(PointTableRef table)
+{
+    const PointLayoutPtr layout(table.layout());
+    for (auto const& d : m_name_map)
+    {
+        m_dimensions_map.insert(
+                std::make_pair(
+                    layout->findDim(d.first),
+                    d.second));
+    }
+}
+
+PointViewSet RangeFilter::run(PointViewPtr inView)
+{
+    PointViewSet viewSet;
+    if (!inView->size())
+        return viewSet;
+
+    PointViewPtr outView = inView->makeNew();
+
+    for (PointId i = 0; i < inView->size(); ++i)
+    {
+        bool keep_point = true;
+        for (auto const& d : m_dimensions_map)
+        {
+            double v = inView->getFieldAs<double>(d.first, i);
+            if (v < d.second.min || v > d.second.max)
+            {
+                keep_point = false;
+                break;
+            }
+        }
+        if (keep_point)
+            outView->appendPoint(*inView, i);
+    }
+
+    viewSet.insert(outView);
+
+    return viewSet;
+}
+
+} // pdal
+
diff --git a/filters/range/RangeFilter.hpp b/filters/range/RangeFilter.hpp
new file mode 100644
index 0000000..48daafe
--- /dev/null
+++ b/filters/range/RangeFilter.hpp
@@ -0,0 +1,79 @@
+/******************************************************************************
+ * Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <memory>
+#include <map>
+#include <string>
+
+extern "C" int32_t RangeFilter_ExitFunc();
+extern "C" PF_ExitFunc RangeFilter_InitPlugin();
+
+namespace pdal
+{
+
+class Options;
+
+struct Range
+{
+    double min;
+    double max;
+};
+
+class PDAL_DLL RangeFilter : public pdal::Filter
+{
+public:
+    RangeFilter() : Filter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    std::map<std::string, Range> m_name_map;
+    std::map<Dimension::Id::Enum, Range> m_dimensions_map;
+
+    virtual void processOptions(const Options&options);
+    virtual void ready(PointTableRef table);
+    virtual PointViewSet run(PointViewPtr view);
+
+    RangeFilter& operator=(const RangeFilter&); // not implemented
+    RangeFilter(const RangeFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/reprojection/CMakeLists.txt b/filters/reprojection/CMakeLists.txt
new file mode 100644
index 0000000..b7a738c
--- /dev/null
+++ b/filters/reprojection/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Reprojection filter CMake configuration
+#
+
+#
+# Reprojection Filter
+#
+set(srcs
+    ReprojectionFilter.cpp
+)
+
+set(incs
+    ReprojectionFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter reprojection "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/reprojection/ReprojectionFilter.cpp b/filters/reprojection/ReprojectionFilter.cpp
new file mode 100644
index 0000000..ad35927
--- /dev/null
+++ b/filters/reprojection/ReprojectionFilter.cpp
@@ -0,0 +1,194 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "ReprojectionFilter.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+
+#include <gdal.h>
+#include <ogr_spatialref.h>
+
+#include <memory>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.reprojection",
+    "Reproject data using GDAL from one coordinate system to another.",
+    "http://pdal.io/stages/filters.reprojection.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, ReprojectionFilter, Filter, s_info)
+
+std::string ReprojectionFilter::getName() const { return s_info.name; }
+
+ReprojectionFilter::ReprojectionFilter() : m_inferInputSRS(true),
+    m_in_ref_ptr(NULL), m_out_ref_ptr(NULL), m_transform_ptr(NULL)
+{}
+
+ReprojectionFilter::~ReprojectionFilter()
+{
+    if (m_transform_ptr)
+        OCTDestroyCoordinateTransformation(m_transform_ptr);
+    if (m_in_ref_ptr)
+        OSRDestroySpatialReference(m_in_ref_ptr);
+    if (m_out_ref_ptr)
+        OSRDestroySpatialReference(m_out_ref_ptr);
+}
+
+void ReprojectionFilter::processOptions(const Options& options)
+{
+    try
+    {
+       m_outSRS = options.getValueOrThrow<pdal::SpatialReference>("out_srs");
+    }
+    catch (std::invalid_argument)
+    {
+        std::string srs = options.getValueOrDefault<std::string>("out_srs", "");
+        std::ostringstream oss;
+        oss << "Stage " << getName() << " has invalid spatial reference "
+            "specification for 'out_srs' option: '" << srs << "'.";
+        throw pdal_error(oss.str());
+    }
+    catch (Option::not_found)
+    {
+        std::ostringstream oss;
+        oss << "Stage " << getName() << " missing required option 'out_srs'.";
+        throw Option::not_found(oss.str());
+    }
+
+    if (options.hasOption("in_srs"))
+    {
+        try
+        {
+            m_inSRS = options.getValueOrThrow<pdal::SpatialReference>("in_srs");
+        }
+        catch (std::invalid_argument)
+        {
+            std::string srs =
+                options.getValueOrDefault<std::string>("in_srs", "");
+            std::ostringstream oss;
+            oss << "Stage " << getName() << " has invalid spatial reference "
+                "specification for 'in_srs' option: '" << srs << "'.";
+            throw pdal_error(oss.str());
+        }
+        m_inferInputSRS = false;
+    }
+}
+
+void ReprojectionFilter::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+}
+
+void ReprojectionFilter::ready(PointTableRef table)
+{
+    if (m_inferInputSRS)
+    {
+        m_inSRS = table.spatialRef();
+        if (m_inSRS.getWKT().empty())
+            throw pdal_error("Source data has no spatial reference and none "
+                "is specified with the 'in_srs' option.");
+    }
+
+    m_in_ref_ptr = OSRNewSpatialReference(0);
+    m_out_ref_ptr = OSRNewSpatialReference(0);
+
+    int result =
+        OSRSetFromUserInput(m_in_ref_ptr,
+            m_inSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
+    if (result != OGRERR_NONE)
+    {
+        std::ostringstream msg;
+        msg << "Invalid input spatial reference '" << m_inSRS.getWKT() <<
+            "'.  This is usually caused by a bad value for the 'in_srs'"
+            "option or an invalid spatial reference in the source file.";
+        throw pdal_error(msg.str());
+    }
+
+
+    result = OSRSetFromUserInput(m_out_ref_ptr,
+        m_outSRS.getWKT(pdal::SpatialReference::eCompoundOK).c_str());
+    if (result != OGRERR_NONE)
+    {
+        std::ostringstream msg;
+        msg << "Invalid output spatial reference '" << m_outSRS.getWKT() <<
+            "'.  This is usually caused by a bad value for the 'out_srs'"
+            "option.";
+        throw pdal_error(msg.str());
+    }
+
+    m_transform_ptr = OCTNewCoordinateTransformation(m_in_ref_ptr, m_out_ref_ptr);
+    if (!m_transform_ptr)
+    {
+        std::string msg = "Could not construct CoordinateTransformation in "
+            "ReprojectionFilter:: ";
+        throw std::runtime_error(msg);
+    }
+
+    setSpatialReference(m_outSRS);
+}
+
+
+void ReprojectionFilter::transform(double& x, double& y, double& z)
+{
+    int ret = OCTTransform(m_transform_ptr, 1, &x, &y, &z);
+    if (ret == 0)
+    {
+        std::ostringstream msg;
+        msg << "Could not project point for ReprojectionTransform::" <<
+            CPLGetLastErrorMsg() << ret;
+        throw pdal_error(msg.str());
+    }
+}
+
+
+void ReprojectionFilter::filter(PointView& view)
+{
+    for (PointId id = 0; id < view.size(); ++id)
+    {
+        double x = view.getFieldAs<double>(Dimension::Id::X, id);
+        double y = view.getFieldAs<double>(Dimension::Id::Y, id);
+        double z = view.getFieldAs<double>(Dimension::Id::Z, id);
+
+        transform(x, y, z);
+
+        view.setField(Dimension::Id::X, id, x);
+        view.setField(Dimension::Id::Y, id, y);
+        view.setField(Dimension::Id::Z, id, z);
+    }
+}
+
+} // namespace pdal
diff --git a/filters/reprojection/ReprojectionFilter.hpp b/filters/reprojection/ReprojectionFilter.hpp
new file mode 100644
index 0000000..e7898bf
--- /dev/null
+++ b/filters/reprojection/ReprojectionFilter.hpp
@@ -0,0 +1,85 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <memory>
+
+extern "C" int32_t ReprojectionFilter_ExitFunc();
+extern "C" PF_ExitFunc ReprojectionFilter_InitPlugin();
+
+namespace pdal
+{
+
+namespace gdal
+{
+    class Debug;
+}
+
+class PDAL_DLL ReprojectionFilter : public Filter
+{
+public:
+    ReprojectionFilter();
+    ~ReprojectionFilter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual void initialize();
+    virtual void filter(PointView& view);
+
+    void updateBounds();
+    void transform(double& x, double& y, double& z);
+
+    SpatialReference m_inSRS;
+    SpatialReference m_outSRS;
+    bool m_inferInputSRS;
+
+    typedef void* ReferencePtr;
+    typedef void* TransformPtr;
+    ReferencePtr m_in_ref_ptr;
+    ReferencePtr m_out_ref_ptr;
+    TransformPtr m_transform_ptr;
+
+    ReprojectionFilter& operator=(const ReprojectionFilter&); // not implemented
+    ReprojectionFilter(const ReprojectionFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/sort/CMakeLists.txt b/filters/sort/CMakeLists.txt
new file mode 100644
index 0000000..275a9bd
--- /dev/null
+++ b/filters/sort/CMakeLists.txt
@@ -0,0 +1,5 @@
+set(srcs SortFilter.cpp)
+set(incs SortFilter.hpp)
+
+PDAL_ADD_DRIVER(filter sort "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/sort/SortFilter.cpp b/filters/sort/SortFilter.cpp
new file mode 100644
index 0000000..17f32f3
--- /dev/null
+++ b/filters/sort/SortFilter.cpp
@@ -0,0 +1,50 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ * Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Andrew Bell or libLAS nor the names of
+ *       its contributors may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "SortFilter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.sort",
+    "Sort data based on a given dimension.",
+    "http://pdal.io/stages/filters.sort.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SortFilter, Filter, s_info)
+
+std::string SortFilter::getName() const { return s_info.name; }
+
+} // namespace pdal
+
diff --git a/filters/sort/SortFilter.hpp b/filters/sort/SortFilter.hpp
new file mode 100644
index 0000000..7ec16c5
--- /dev/null
+++ b/filters/sort/SortFilter.hpp
@@ -0,0 +1,83 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/PointViewIter.hpp>
+
+extern "C" int32_t SortFilter_ExitFunc();
+extern "C" PF_ExitFunc SortFilter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SortFilter : public Filter
+{
+public:
+    SortFilter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    // Dimension on which to sort.
+    Dimension::Id::Enum m_dim;
+    // Dimension name.
+    std::string m_dimName;
+
+    virtual void processOptions(const Options& options)
+        { m_dimName = options.getValueOrThrow<std::string>("dimension"); }
+
+    virtual void ready(PointTableRef table)
+        { m_dim = table.layout()->findDim(m_dimName); }
+
+    virtual void filter(PointView& view)
+    {
+        if (m_dim == Dimension::Id::Unknown)
+            return;
+
+        auto cmp = [this](const PointRef& p1, const PointRef& p2)
+            { return p1.compare(m_dim, p2); };
+
+        std::sort(view.begin(), view.end(), cmp);
+    }
+
+    SortFilter& operator=(const SortFilter&); // not implemented
+    SortFilter(const SortFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/splitter/CMakeLists.txt b/filters/splitter/CMakeLists.txt
new file mode 100644
index 0000000..ef64905
--- /dev/null
+++ b/filters/splitter/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Splitter filter CMake configuration
+#
+
+#
+# Splitter Filter
+#
+set(srcs
+    SplitterFilter.cpp
+)
+
+set(incs
+    SplitterFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter splitter "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/splitter/SplitterFilter.cpp b/filters/splitter/SplitterFilter.cpp
new file mode 100644
index 0000000..2929b4a
--- /dev/null
+++ b/filters/splitter/SplitterFilter.cpp
@@ -0,0 +1,131 @@
+/******************************************************************************
+ * Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "SplitterFilter.hpp"
+
+#include <pdal/pdal_macros.hpp>
+
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.splitter",
+    "Split data based on a X/Y box length.",
+    "http://pdal.io/stages/filters.splitter.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SplitterFilter, Filter, s_info)
+
+std::string SplitterFilter::getName() const { return s_info.name; }
+
+void SplitterFilter::processOptions(const Options& options)
+{
+    m_length = options.getValueOrDefault<double>("length", 1000.0);
+    m_xOrigin = options.getValueOrDefault<double>("origin_x",
+        std::numeric_limits<double>::quiet_NaN());
+    m_yOrigin = options.getValueOrDefault<double>("origin_y",
+        std::numeric_limits<double>::quiet_NaN());
+}
+
+
+Options SplitterFilter::getDefaultOptions()
+{
+    Options options;
+    Option length("length", 1000.0, "Splitter length");
+    options.add(length);
+
+    return options;
+}
+
+
+//This used to be a lambda, but the VS compiler exploded, I guess.
+typedef std::pair<int, int> Coord;
+namespace
+{
+class CoordCompare
+{
+public:
+    bool operator () (const Coord& c1, const Coord& c2) const
+    {
+        return c1.first < c2.first ? true :
+            c1.first > c2.first ? false :
+            c1.second < c2.second ? true :
+            false;
+    };
+};
+}
+
+PointViewSet SplitterFilter::run(PointViewPtr inView)
+{
+    PointViewSet viewSet;
+    if (!inView->size())
+        return viewSet;
+
+    CoordCompare compare;
+    std::map<Coord, PointViewPtr, CoordCompare> viewMap(compare);
+
+    // Use the location of the first point as the origin, unless specified.
+    // (!= test == isnan(), which doesn't exist on windows)
+    if (m_xOrigin != m_xOrigin)
+        m_xOrigin = inView->getFieldAs<double>(Dimension::Id::X, 0);
+    if (m_yOrigin != m_yOrigin)
+        m_yOrigin = inView->getFieldAs<double>(Dimension::Id::Y, 0);
+    // Overlay a grid of squares on the points (m_length sides).  Each square
+    // corresponds to a new point buffer.  Place the points falling in the
+    // each square in the corresponding point buffer.
+    for (PointId idx = 0; idx < inView->size(); idx++)
+    {
+        double x = inView->getFieldAs<double>(Dimension::Id::X, idx);
+        int xpos = (x - m_xOrigin) / m_length;
+        double y = inView->getFieldAs<double>(Dimension::Id::Y, idx);
+        int ypos = (y - m_yOrigin) / m_length;
+
+        Coord loc(xpos, ypos);
+        PointViewPtr& outView = viewMap[loc];
+        if (!outView)
+            outView = inView->makeNew();
+        outView->appendPoint(*inView.get(), idx);
+    }
+
+    // Pull the buffers out of the map and stick them in the standard
+    // output set, setting the bounds as we go.
+    for (auto bi = viewMap.begin(); bi != viewMap.end(); ++bi)
+        viewSet.insert(bi->second);
+    return viewSet;
+}
+
+} // pdal
diff --git a/filters/splitter/SplitterFilter.hpp b/filters/splitter/SplitterFilter.hpp
new file mode 100644
index 0000000..17486f0
--- /dev/null
+++ b/filters/splitter/SplitterFilter.hpp
@@ -0,0 +1,69 @@
+/******************************************************************************
+ * Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+extern "C" int32_t SplitterFilter_ExitFunc();
+extern "C" PF_ExitFunc SplitterFilter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SplitterFilter : public pdal::Filter
+{
+public:
+    SplitterFilter() : Filter()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    double m_length;
+    double m_xOrigin;
+    double m_yOrigin;
+
+    virtual void processOptions(const Options& options);
+    virtual PointViewSet run(PointViewPtr view);
+
+    SplitterFilter& operator=(const SplitterFilter&); // not implemented
+    SplitterFilter(const SplitterFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/filters/stats/CMakeLists.txt b/filters/stats/CMakeLists.txt
new file mode 100644
index 0000000..fe1cabe
--- /dev/null
+++ b/filters/stats/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Stats filter CMake configuration
+#
+
+#
+# Stats Filter
+#
+set(srcs
+    StatsFilter.cpp
+)
+
+set(incs
+    StatsFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter stats "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/filters/stats/StatsFilter.cpp b/filters/stats/StatsFilter.cpp
new file mode 100644
index 0000000..bd7f551
--- /dev/null
+++ b/filters/stats/StatsFilter.cpp
@@ -0,0 +1,200 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "StatsFilter.hpp"
+
+#include <unordered_map>
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/PDALUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.stats",
+    "Compute statistics about each dimension (mean, min, max, etc.)",
+    "http://pdal.io/stages/filters.stats.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, StatsFilter, Filter, s_info)
+
+std::string StatsFilter::getName() const { return s_info.name; }
+
+namespace stats
+{
+
+void Summary::extractMetadata(MetadataNode &m) const
+{
+    uint32_t cnt = static_cast<uint32_t>(count());
+    m.add("count", cnt, "count");
+    m.add("minimum", minimum(), "minimum");
+    m.add("maximum", maximum(), "maximum");
+    m.add("average", average(), "average");
+    m.add("name", m_name, "name");
+    if (m_enumerate == Enumerate)
+        for (auto& v : m_values)
+            m.addList("values", v.first);
+    else if (m_enumerate == Count)
+        for (auto& v : m_values)
+        {
+            std::string val =
+                std::to_string(v.first) + "/" + std::to_string(v.second);
+            m.addList("counts", val);
+        }
+}
+
+} // namespace stats
+
+using namespace stats;
+
+void StatsFilter::filter(PointView& view)
+{
+    for (PointId idx = 0; idx < view.size(); ++idx)
+    {
+        for (auto p = m_stats.begin(); p != m_stats.end(); ++p)
+        {
+            Dimension::Id::Enum d = p->first;
+            Summary& c = p->second;
+            c.insert(view.getFieldAs<double>(d, idx));
+        }
+    }
+}
+
+
+void StatsFilter::done(PointTableRef table)
+{
+    extractMetadata();
+}
+
+
+void StatsFilter::processOptions(const Options& options)
+{
+    m_dimNames = options.getValueOrDefault<StringList>("dimensions");
+    m_enums = options.getValueOrDefault<StringList>("enumerate");
+    m_counts = options.getValueOrDefault<StringList>("count");
+}
+
+
+void StatsFilter::prepared(PointTableRef table)
+{
+    PointLayoutPtr layout(table.layout());
+
+    std::unordered_map<std::string, Summary::EnumType> dims;
+
+    // Add dimensions to the list.
+    if (m_dimNames.empty())
+    {
+        for (auto id : layout->dims())
+            dims[layout->dimName(id)] = Summary::NoEnum;
+    }
+    else
+    {
+        for (auto& s : m_dimNames)
+        {
+            if (layout->findDim(s) == Dimension::Id::Unknown)
+            {
+                std::ostringstream out;
+                out << "Dimension '" << s << "' listed in --dimensions option "
+                   "does not exist.  Ignoring.";
+                Utils::printError(out.str());
+            }
+            else
+                dims[s] = Summary::NoEnum;
+        }
+    }
+
+    // Set the enumeration flag for those dimensions specified.
+    for (auto& s : m_enums)
+    {
+        if (dims.find(s) == dims.end())
+        {
+            std::ostringstream out;
+            out << "Dimension '" << s << "' listed in --enumerate option "
+                "does not exist.  Ignoring.";
+            Utils::printError(out.str());
+        }
+        else
+            dims[s] = Summary::Enumerate;
+    }
+
+    // Set the enumeration flag for those dimensions specified.
+    for (auto& s : m_counts)
+    {
+        if (dims.find(s) == dims.end())
+        {
+            std::ostringstream out;
+            out << "Dimension '" << s << "' listed in --count option "
+                "does not exist.  Ignoring.";
+            Utils::printError(out.str());
+        }
+        else
+            dims[s] = Summary::Count;
+    }
+
+    // Create the summary objects.
+    for (auto& dv : dims)
+        m_stats.insert(std::make_pair(layout->findDim(dv.first),
+            Summary(dv.first, dv.second)));
+}
+    
+
+void StatsFilter::extractMetadata()
+{
+    uint32_t position(0);
+
+    for (auto di = m_stats.begin(); di != m_stats.end(); ++di)
+    {
+        const Summary& s = di->second;
+
+        MetadataNode t = m_metadata.addList("statistic");
+        t.add("position", position++);
+        s.extractMetadata(t);
+    }
+}
+
+
+const Summary& StatsFilter::getStats(Dimension::Id::Enum dim) const
+{
+    for (auto di = m_stats.begin(); di != m_stats.end(); ++di)
+    {
+        Dimension::Id::Enum d = di->first;
+        if (d == dim)
+            return di->second;
+    }
+    throw pdal_error("Dimension not found");
+}
+
+} // namespace pdal
diff --git a/filters/stats/StatsFilter.hpp b/filters/stats/StatsFilter.hpp
new file mode 100644
index 0000000..6ec4d94
--- /dev/null
+++ b/filters/stats/StatsFilter.hpp
@@ -0,0 +1,139 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+extern "C" int32_t StatsFilter_ExitFunc();
+extern "C" PF_ExitFunc StatsFilter_InitPlugin();
+
+namespace pdal
+{
+namespace stats
+{
+
+class PDAL_DLL Summary
+{
+public:
+    enum EnumType
+    {
+        NoEnum,
+        Enumerate,
+        Count
+    };
+
+typedef std::map<double, point_count_t> EnumMap;
+
+public:
+    Summary(std::string name, EnumType enumerate) :
+        m_name(name), m_enumerate(enumerate)
+    { reset(); }
+
+    double minimum() const
+        { return m_min; }
+    double maximum() const
+        { return m_max; }
+    double average() const
+        { return m_avg; }
+    point_count_t count() const
+        { return m_cnt; }
+    std::string name() const
+        { return m_name; }
+    const EnumMap& values() const
+        { return m_values; }
+
+    void extractMetadata(MetadataNode &m) const;
+
+    void reset()
+    {
+        m_max = (std::numeric_limits<double>::lowest)();
+        m_min = (std::numeric_limits<double>::max)();
+        m_cnt = 0;
+        m_avg = 0.0;
+    }
+
+    void insert(double value)
+    {
+        m_cnt++;
+        m_min = (std::min)(m_min, value);
+        m_max = (std::max)(m_max, value);
+        m_avg += (value - m_avg) / m_cnt;
+        if (m_enumerate != NoEnum)
+            m_values[value]++;
+    }
+
+private:
+    std::string m_name;
+    EnumType m_enumerate;
+    double m_max;
+    double m_min;
+    double m_avg;
+    EnumMap m_values;
+    point_count_t m_cnt;
+};
+
+} // namespace stats
+
+// This is just a pass-through filter, which collects some stats about
+// the points that are fed through it
+class PDAL_DLL StatsFilter : public Filter
+{
+public:
+    StatsFilter() : Filter()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    const stats::Summary& getStats(Dimension::Id::Enum d) const;
+    void reset();
+
+private:
+    StatsFilter& operator=(const StatsFilter&); // not implemented
+    StatsFilter(const StatsFilter&); // not implemented
+    virtual void processOptions(const Options& options);
+    virtual void prepared(PointTableRef table);
+    virtual void done(PointTableRef table);
+    virtual void filter(PointView& view);
+    void extractMetadata();
+
+    StringList m_dimNames;
+    StringList m_enums;
+    StringList m_counts;
+    std::map<Dimension::Id::Enum, stats::Summary> m_stats;
+};
+
+} // namespace pdal
diff --git a/filters/transformation/CMakeLists.txt b/filters/transformation/CMakeLists.txt
new file mode 100644
index 0000000..6890fa8
--- /dev/null
+++ b/filters/transformation/CMakeLists.txt
@@ -0,0 +1,18 @@
+#
+# Transformation filter CMake configuration
+#
+
+#
+# Transformation Filter
+#
+set(srcs
+    TransformationFilter.cpp
+)
+
+set(incs
+    TransformationFilter.hpp
+)
+
+PDAL_ADD_DRIVER(filter transformation "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
+
diff --git a/filters/transformation/TransformationFilter.cpp b/filters/transformation/TransformationFilter.cpp
new file mode 100644
index 0000000..5df43db
--- /dev/null
+++ b/filters/transformation/TransformationFilter.cpp
@@ -0,0 +1,112 @@
+/******************************************************************************
+* Copyright (c) 2014, Pete Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TransformationFilter.hpp"
+
+#include <pdal/pdal_export.hpp>
+
+#include <sstream>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.transformation",
+    "Transform each point using a 4x4 transformation matrix",
+    "http://pdal.io/stages/filters.transformation.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TransformationFilter, Filter, s_info)
+
+std::string TransformationFilter::getName() const { return s_info.name; }
+
+TransformationMatrix transformationMatrixFromString(const std::string& s)
+{
+    std::istringstream iss(s);
+    TransformationMatrix matrix;
+    double entry;
+    TransformationMatrix::size_type i = 0;
+    while (iss >> entry)
+    {
+        if (i + 1 > matrix.size())
+        {
+            std::stringstream msg;
+            msg << "Too many entries in transformation matrix, should be "
+                << matrix.size();
+            throw pdal_error(msg.str());
+        }
+        matrix[i++] = entry;
+    }
+
+    if (i != matrix.size())
+    {
+        std::stringstream msg;
+        msg << "Too few entries in transformation matrix: "
+            << i
+            << " (should be "
+            << matrix.size()
+            << ")";
+
+        throw pdal_error(msg.str());
+    }
+
+    return matrix;
+}
+
+
+void TransformationFilter::processOptions(const Options& options)
+{
+    m_matrix = transformationMatrixFromString(options.getValueOrThrow<std::string>("matrix"));
+}
+
+
+void TransformationFilter::filter(PointView& view)
+{
+    for (PointId idx = 0; idx < view.size(); ++idx)
+    {
+        double x = view.getFieldAs<double>(Dimension::Id::X, idx);
+        double y = view.getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = view.getFieldAs<double>(Dimension::Id::Z, idx);
+
+        view.setField(Dimension::Id::X, idx,
+            x * m_matrix[0] + y * m_matrix[1] + z * m_matrix[2] + m_matrix[3]);
+
+        view.setField(Dimension::Id::Y, idx,
+            x * m_matrix[4] + y * m_matrix[5] + z * m_matrix[6] + m_matrix[7]);
+
+        view.setField(Dimension::Id::Z, idx,
+            x * m_matrix[8] + y * m_matrix[9] + z * m_matrix[10] + m_matrix[11]);
+    }
+}
+
+} // namespace pdal
diff --git a/filters/transformation/TransformationFilter.hpp b/filters/transformation/TransformationFilter.hpp
new file mode 100644
index 0000000..5c44e57
--- /dev/null
+++ b/filters/transformation/TransformationFilter.hpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2014, Pete Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <array>
+#include <string>
+
+#include <pdal/Filter.hpp>
+#include <pdal/pdal_export.hpp>
+
+extern "C" int32_t TransformationFilter_ExitFunc();
+extern "C" PF_ExitFunc TransformationFilter_InitPlugin();
+
+namespace pdal
+{
+
+
+// Transformation matrices are assumed to be stored in row-major order
+typedef std::array<double, 16> TransformationMatrix;
+
+
+TransformationMatrix PDAL_DLL transformationMatrixFromString(const std::string& s);
+
+
+class PDAL_DLL TransformationFilter : public Filter
+{
+public:
+    TransformationFilter() : Filter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    TransformationFilter& operator=(const TransformationFilter&); // not implemented
+    TransformationFilter(const TransformationFilter&); // not implemented
+    virtual void processOptions(const Options& options);
+    virtual void filter(PointView& view);
+
+    TransformationMatrix m_matrix;
+};
+
+
+} // namespace pdal
diff --git a/gitsha.cpp.in b/gitsha.cpp.in
new file mode 100644
index 0000000..32f6a5c
--- /dev/null
+++ b/gitsha.cpp.in
@@ -0,0 +1,3 @@
+#include <pdal/gitsha.h>
+#define GIT_SHA1 "@GIT_SHA1@"
+const char g_GIT_SHA1[] = GIT_SHA1;
diff --git a/include/pdal/BufferReader.hpp b/include/pdal/BufferReader.hpp
new file mode 100644
index 0000000..cc4b4bc
--- /dev/null
+++ b/include/pdal/BufferReader.hpp
@@ -0,0 +1,60 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL BufferReader : public pdal::Reader
+{
+public:
+    BufferReader() : Reader()
+        {}
+    void addView(const PointViewPtr& view)
+        { m_views.insert(view); }
+    std::string getName() const { return "readers.buffer"; }
+
+private:
+    PointViewSet m_views;
+
+    virtual PointViewSet run(PointViewPtr /*view*/)
+        { return m_views; }
+};
+
+} // namespace pdal
diff --git a/include/pdal/Compression.hpp b/include/pdal/Compression.hpp
new file mode 100644
index 0000000..de0f802
--- /dev/null
+++ b/include/pdal/Compression.hpp
@@ -0,0 +1,243 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <boost/algorithm/string.hpp>
+
+#ifdef PDAL_HAVE_LAZPERF
+#include <laz-perf/common/common.hpp>
+#include <laz-perf/compressor.hpp>
+#include <laz-perf/decompressor.hpp>
+
+#include <laz-perf/encoder.hpp>
+#include <laz-perf/decoder.hpp>
+#include <laz-perf/formats.hpp>
+#include <laz-perf/las.hpp>
+#endif
+
+#include <pdal/Dimension.hpp>
+
+#include <map>
+#include <vector>
+
+namespace pdal
+{
+
+namespace
+{
+
+template<typename LasZipEngine>
+size_t addFields(LasZipEngine& engine, const DimTypeList& dims)
+{
+    using namespace Dimension;
+
+    size_t pointSize = 0;
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+    {
+        switch (di->m_type)
+        {
+        case Type::Signed64:
+            engine->template add_field<int32_t>();
+            engine->template add_field<int32_t>();
+            break;
+        case Type::Signed32:
+        case Type::Float:
+            engine->template add_field<int32_t>();
+            break;
+        case Type::Signed16:
+            engine->template add_field<int16_t>();
+            break;
+        case Type::Signed8:
+            engine->template add_field<int8_t>();
+            break;
+        case Type::Unsigned64:
+        case Type::Double:
+            engine->template add_field<uint32_t>();
+            engine->template add_field<uint32_t>();
+            break;
+        case Type::Unsigned32:
+            engine->template add_field<uint32_t>();
+            break;
+        case Type::Unsigned16:
+            engine->template add_field<uint16_t>();
+            break;
+        case Type::Unsigned8:
+            engine->template add_field<uint8_t>();
+            break;
+        default:
+            return 0;
+        }
+        pointSize += Dimension::size(di->m_type);
+    }
+    return pointSize;
+}
+
+} // anonymous namespace
+
+
+namespace CompressionType
+{
+
+enum Enum
+{
+    None = 0,
+    Ght = 1,
+    Dimensional = 2,
+    Lazperf = 3,
+    Unknown = 256
+};
+
+} // namespace CompressionType
+
+
+// This is a utility input/output buffer for the compressor/decompressor.
+template <typename CTYPE = unsigned char>
+class TypedLazPerfBuf
+{
+    typedef std::vector<CTYPE> LazPerfRawBuf;
+private:
+
+    LazPerfRawBuf& m_buf;
+    size_t m_idx;
+
+public:
+    TypedLazPerfBuf(LazPerfRawBuf& buf) : m_buf(buf), m_idx(0)
+    {}
+
+    void putBytes(const unsigned char *b, size_t len)
+        { m_buf.insert(m_buf.end(), (CTYPE *)b, (CTYPE *)(b + len)); }
+    void putByte(const unsigned char b)
+        {   m_buf.push_back((CTYPE)b); }
+    unsigned char getByte()
+        { return (unsigned char)m_buf[m_idx++]; }
+    void getBytes(unsigned char *b, int len)
+    {
+        memcpy(b, m_buf.data() + m_idx, len);
+        m_idx += len;
+    }
+};
+typedef TypedLazPerfBuf<char> SignedLazPerfBuf;
+typedef TypedLazPerfBuf<unsigned char> LazPerfBuf;
+
+
+#ifdef PDAL_HAVE_LAZPERF
+template<typename OutputStream>
+class LazPerfCompressor
+{
+public:
+    LazPerfCompressor(OutputStream& output, const DimTypeList& dims) :
+        m_encoder(output),
+        m_compressor(laszip::formats::make_dynamic_compressor(m_encoder)),
+        m_pointSize(0),
+        m_done(false)
+    { m_pointSize = addFields(m_compressor, dims); }
+
+    ~LazPerfCompressor()
+    {
+        if (!m_done)
+            std::cerr << "LasPerfCompressor destroyed without a call "
+               "to done()";
+    }
+
+    size_t pointSize() const
+        { return m_pointSize; }
+    point_count_t compress(const char *inbuf, size_t bufsize)
+    {
+        point_count_t numRead = 0;
+
+        const char *end = inbuf + bufsize;
+        while (inbuf + m_pointSize <= end)
+        {
+            m_compressor->compress(inbuf);
+            inbuf += m_pointSize;
+            numRead++;
+        }
+        return numRead;
+    }
+    void done()
+    {
+        if (!m_done)
+           m_encoder.done();
+        m_done = true;
+    }
+
+private:
+    typedef laszip::encoders::arithmetic<OutputStream> Encoder;
+    Encoder m_encoder;
+    typedef typename laszip::formats::dynamic_field_compressor<Encoder>::ptr
+            Compressor;
+    Compressor m_compressor;
+    size_t m_pointSize;
+    bool m_done;
+};
+
+
+template<typename InputStream>
+class LazPerfDecompressor
+{
+public:
+    LazPerfDecompressor(InputStream& input, const DimTypeList& dims) :
+        m_decoder(input),
+        m_decompressor(laszip::formats::make_dynamic_decompressor(m_decoder))
+    { m_pointSize = addFields(m_decompressor, dims); }
+
+    size_t pointSize() const
+        { return m_pointSize; }
+    point_count_t decompress(char *outbuf, size_t bufsize)
+    {
+        point_count_t numWritten = 0;
+
+        char *end = outbuf + bufsize;
+        while (outbuf + m_pointSize <= end)
+        {
+            m_decompressor->decompress(outbuf);
+            outbuf += m_pointSize;
+            numWritten++;
+        }
+        return numWritten;
+    }
+
+private:
+    typedef laszip::decoders::arithmetic<InputStream> Decoder;
+    Decoder m_decoder;
+    typedef typename laszip::formats::dynamic_field_decompressor<Decoder>::ptr
+        Decompressor;
+    Decompressor m_decompressor;
+    size_t m_pointSize;
+};
+#endif  // PDAL_HAVE_LAZPERF
+
+} // namespace pdal
+
diff --git a/include/pdal/DbReader.hpp b/include/pdal/DbReader.hpp
new file mode 100644
index 0000000..95d8680
--- /dev/null
+++ b/include/pdal/DbReader.hpp
@@ -0,0 +1,72 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+#include <pdal/XMLSchema.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL DbReader : public Reader
+{
+protected:
+    DbReader() : m_orientation(Orientation::PointMajor), m_packedPointSize(0)
+    {}
+
+    DimTypeList dbDimTypes() const;
+    void loadSchema(PointLayoutPtr layout, const std::string& schemaString);
+    void loadSchema(PointLayoutPtr layout, const XMLSchema& schema);
+    void updateSchema(const XMLSchema& schema);
+    void writeField(PointView& view, const char *pos, const DimType& dim,
+        PointId idx);
+    void writePoint(PointView& view, PointId idx, const char *buf);
+    size_t packedPointSize() const
+        { return m_packedPointSize; }
+    size_t dimOffset(Dimension::Id::Enum id) const;
+    Orientation::Enum orientation() const
+        { return m_orientation; }
+
+private:
+    PointLayoutPtr m_layout;
+    XMLDimList m_dims;
+    Orientation::Enum m_orientation;
+    size_t m_packedPointSize;
+
+    DbReader& operator=(const DbReader&); // not implemented
+    DbReader(const DbReader&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/DbWriter.hpp b/include/pdal/DbWriter.hpp
new file mode 100644
index 0000000..7c445ad
--- /dev/null
+++ b/include/pdal/DbWriter.hpp
@@ -0,0 +1,90 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+#include <pdal/XMLSchema.hpp>
+
+#include <string>
+#include <unordered_map>
+
+namespace pdal
+{
+
+class SQLiteWriter;
+class PgWriter;
+class OciWriter;
+
+class PDAL_DLL DbWriter : public Writer
+{
+protected:
+    DbWriter()
+    {}
+
+    virtual void setAutoXForm(const PointViewPtr view);
+    XMLDimList dbDimTypes() const
+        { return m_dbDims; }
+    size_t readField(const PointView& view, char *pos, Dimension::Id::Enum id,
+        PointId idx);
+    size_t readPoint(const PointView& view, PointId idx, char *outbuf);
+    size_t packedPointSize() const
+        { return m_packedPointSize; }
+
+    // Allows subclass access to ready() without the mess of friends.
+    void doReady(PointTableRef table)
+        { DbWriter::ready(table); }
+
+private:
+    virtual void prepared(PointTableRef table);
+    virtual void ready(PointTableRef table);
+
+    DimTypeList m_dimTypes;
+    XMLDimList m_dbDims;
+    std::unordered_map<int, DimType> m_dimMap;
+    std::pair<int, int> m_xOffsets;
+    std::pair<int, int> m_yOffsets;
+    std::pair<int, int> m_zOffsets;
+
+    // Size of point data as read from PointTable.
+    size_t m_packedPointSize;
+    // Size of point data as written to DB.
+    size_t m_dbPointSize;
+    bool m_locationScaling;
+
+    DbWriter& operator=(const DbWriter&); // not implemented
+    DbWriter(const DbWriter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/Dimension.hpp b/include/pdal/Dimension.hpp
new file mode 100644
index 0000000..7f98498
--- /dev/null
+++ b/include/pdal/Dimension.hpp
@@ -0,0 +1,799 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/pdal_internal.hpp>
+
+//NOTE: How to add a predefined dimension.
+//
+// A dimension is easily added to PDAL by doing the following:
+// 1) Add an entry to the enumeration pdal::Dimension::Id::Enum with an
+//   appropriate name.
+// 2) Add an appropriate entry to the switch statement in the function
+//   pdal::Dimension::name() to supply the string name of the dimension.
+// 3) Add an appropriate entry to the switch statement in the function
+//   pdal::Dimension::id() to return the dimension ID given a matching
+//   name.  Make sure that names don't map to more than one dimension.
+// 4) Add an appropriate entry to the switch statement in the function
+//   pdal::Dimension::description() to return a description of the dimension.
+// 5) Add an appropriate entry to the switch statement in the function
+//   pdal::Dimension::defaultType() to return a type sufficiently
+//   large to hold values of the dimension for all relevant formats.
+
+//This should be generated from another format - JSON?
+namespace pdal
+{
+namespace Dimension
+{
+
+namespace BaseType
+{
+enum Enum
+{
+    Signed = 0x100,
+    Unsigned = 0x200,
+    Floating = 0x400
+};
+}
+
+inline BaseType::Enum fromName(std::string name)
+{
+    if (name == "signed")
+        return BaseType::Signed;
+    else if (name == "unsigned")
+        return BaseType::Unsigned;
+    else if (name == "floating")
+        return BaseType::Floating;
+    else
+        throw pdal_error("Invalid BaseType name");
+}
+
+inline std::string toName(BaseType::Enum b)
+{
+    switch (b)
+    {
+    case BaseType::Signed:
+        return "signed";
+    case BaseType::Unsigned:
+        return "unsigned";
+    case BaseType::Floating:
+        return "floating";
+    default:
+        return "";
+    }
+}
+
+namespace Type
+{
+enum Enum
+{
+    None = 0,
+    Unsigned8 = BaseType::Unsigned | 1,
+    Signed8 = BaseType::Signed | 1,
+    Unsigned16 = BaseType::Unsigned | 2,
+    Signed16 = BaseType::Signed | 2,
+    Unsigned32 = BaseType::Unsigned | 4,
+    Signed32 = BaseType::Signed | 4,
+    Unsigned64 = BaseType::Unsigned | 8,
+    Signed64 = BaseType::Signed | 8,
+    Float = BaseType::Floating | 4,
+    Double = BaseType::Floating | 8
+};
+}
+
+inline size_t size(Type::Enum t)
+{
+    return t & 0xFF;
+}
+
+inline BaseType::Enum base(Type::Enum t)
+{
+    return BaseType::Enum(t & 0xFF00);
+}
+
+namespace Id
+{
+enum Enum
+{
+    Unknown,
+    X,
+    Y,
+    Z,
+    Intensity,
+    Amplitude,
+    Reflectance,
+    ReturnNumber,
+    NumberOfReturns,
+    ScanDirectionFlag,
+    EdgeOfFlightLine,
+    Classification,
+    ScanAngleRank,
+    UserData,
+    PointSourceId,
+    Red,
+    Green,
+    Blue,
+    GpsTime,
+    InternalTime,
+    OffsetTime,
+    IsPpsLocked,
+    StartPulse,
+    ReflectedPulse,
+    Pdop,
+    Pitch,
+    Roll,
+    PulseWidth,
+    Deviation,
+    PassiveSignal,
+    BackgroundRadiation,
+    PassiveX,
+    PassiveY,
+    PassiveZ,
+    XVelocity,
+    YVelocity,
+    ZVelocity,
+    PlatformHeading,
+    WanderAngle,
+    XBodyAccel,
+    YBodyAccel,
+    ZBodyAccel,
+    XBodyAngRate,
+    YBodyAngRate,
+    ZBodyAngRate,
+    Flag,
+    Mark,
+    Alpha,
+    EchoRange,
+    ScanChannel,
+    Infrared,
+    HeightAboveGround
+};
+} // namespace Id
+typedef std::vector<Id::Enum> IdList;
+
+static const int COUNT = std::numeric_limits<uint16_t>::max();
+static const int PROPRIETARY = 0xFF00;
+
+/// Get a description of a predefined dimension.
+/// \param[in] id  Dimension ID.
+/// \return  Dimension description.
+inline std::string description(Id::Enum id)
+{
+    switch (id)
+    {
+    case Id::X:
+        return "X coordinate";
+    case Id::Y:
+        return "Y coordinate";
+    case Id::Z:
+        return "Z coordinate";
+    case Id::Intensity:
+        return "Representation of the pulse return magnitude";
+    case Id::Amplitude:
+        return "This is the ratio of the received power to the "
+            "power received at the detection limit expressed in dB";
+    case Id::Reflectance:
+        return "This is the ratio of the received power to the "
+            "power that would be received from a white diffuse target "
+            "at the same distance expressed in dB. The reflectance "
+            "represents a range independent property of the target. "
+            "The surface normal of this target is assumed to be in "
+            "parallel to the laser beam direction.";
+    case Id::ReturnNumber:
+        return "Pulse return number for a given output pulse. A given output "
+            "laser pulse can have many returns, and they must be marked in "
+            "order, starting with 1";
+    case Id::NumberOfReturns:
+        return "Total number of returns for a given pulse.";
+    case Id::ScanDirectionFlag:
+        return "Direction at which the scanner mirror was traveling at the "
+            "time of the output pulse. A value of 1 is a positive scan "
+            "direction, and a bit value of 0 is a negative scan direction, "
+            "where positive scan direction is a scan moving from the left "
+            "side of the in-track direction to the right side and negative "
+            "the opposite";
+    case Id::EdgeOfFlightLine:
+        return "Indicates the end of scanline before a direction change "
+            "with a value of 1 - 0 otherwise";
+    case Id::Classification:
+        return "ASPRS classification.  0 for no classification.  See "
+            "LAS specification for details";
+    case Id::ScanAngleRank:
+        return "Angle degree at which the laster point was output from "
+            "the system, including the roll of the aircraft.  The scan "
+            "angle is based on being nadir, and -90 the left side of the "
+            "aircraft in the direction of flight";
+    case Id::UserData:
+        return "Unspecified user data";
+    case Id::PointSourceId:
+        return "File source ID from which the point originated.  Zero "
+            "indicates that the point originated in the current file";
+    case Id::GpsTime:
+        return "GPS time that the point was acquired";
+    case Id::InternalTime:
+        return "Scanner's internal time when the point was aquired, in seconds";
+    case Id::OffsetTime:
+        return "Milliseconds from first acquired point";
+    case Id::IsPpsLocked:
+        return "The external PPS signal was found to be synchronized at the "
+            "time of the current laser shot.";
+    case Id::Red:
+        return "Red image channel value";
+    case Id::Green:
+        return "Green image channel value";
+    case Id::Blue:
+        return "Blue image channel value";
+    case Id::Alpha:
+        return "Alpha image channel value";
+    case Id::StartPulse:
+        return "Relative pulse signal strength";
+    case Id::ReflectedPulse:
+        return "Relative reflected pulse signal strength";
+    case Id::Pitch:
+        return "Pitch in degrees";
+    case Id::Roll:
+        return "Roll in degrees";
+    case Id::Pdop:
+        return "GPS PDOP (dilution of precision)";
+    case Id::PulseWidth:
+        return "Laser received pulse width (digitizer samples)";
+    case Id::Deviation:
+        return "A larger value for deviation indicates larger distortion.";
+    case Id::PassiveSignal:
+        return "Relative passive signal";
+    case Id::BackgroundRadiation:
+        return "A measure of background radiation.";
+    case Id::PassiveX:
+        return "Passive X footprint";
+    case Id::PassiveY:
+        return "Passive Y footprint";
+    case Id::PassiveZ:
+        return "Passive Z footprint";
+    case Id::XVelocity:
+        return "X Velocity";
+    case Id::YVelocity:
+        return "Y Velocity";
+    case Id::ZVelocity:
+        return "Z Velocity";
+    case Id::PlatformHeading:
+        return "Platform Heading";
+    case Id::WanderAngle:
+        return "Wander Angle";
+    case Id::XBodyAccel:
+        return "X Body Acceleration";
+    case Id::YBodyAccel:
+        return "Y Body Acceleration";
+    case Id::ZBodyAccel:
+        return "Z Body Acceleration";
+    case Id::XBodyAngRate:
+        return "X Body Angle Rate";
+    case Id::YBodyAngRate:
+        return "Y Body Angle Rate";
+    case Id::ZBodyAngRate:
+        return "Z Body Angle Rate";
+    case Id::Mark:
+        return "Mark";
+    case Id::Flag:
+        return "Flag";
+    case Id::EchoRange:
+        return "The distance from the laser origin to the target.";
+    case Id::ScanChannel:
+        return "Scan Channel";
+    case Id::Infrared:
+        return "Near Infrared";
+    case Id::HeightAboveGround:
+        return "Height above ground";
+    case Id::Unknown:
+        return "";
+    }
+    return "";
+}
+
+/// Get a predefined dimension ID given a dimension name.  Multiple names
+/// may map to the same dimension for convenience.  Names are case-insensitive.
+/// \param[in] s  Name of dimension.
+/// \return  Dimension ID associated with the name.  Id::Unknown is returned
+///    if the name doesn't map to a predefined dimension.
+inline Id::Enum id(std::string s)
+{
+    boost::to_upper(s);
+    if (s == "X")
+        return Id::X;
+    else if (s == "Y")
+        return Id::Y;
+    else if (s == "Z")
+        return Id::Z;
+    else if (s == "INTENSITY")
+        return Id::Intensity;
+    else if (s == "AMPLITUDE")
+        return Id::Amplitude;
+    else if (s == "REFLECTANCE")
+        return Id::Reflectance;
+    else if (s == "RETURNNUMBER")
+        return Id::ReturnNumber;
+    else if (s == "NUMBEROFRETURNS")
+        return Id::NumberOfReturns;
+    else if (s == "SCANDIRECTIONFLAG")
+        return Id::ScanDirectionFlag;
+    else if (s == "EDGEOFFLIGHTLINE")
+        return Id::EdgeOfFlightLine;
+    else if (s == "CLASSIFICATION")
+        return Id::Classification;
+    else if (s == "SCANANGLERANK" || s == "SCANANGLE")
+        return Id::ScanAngleRank;
+    else if (s == "USERDATA")
+        return Id::UserData;
+    else if (s == "POINTSOURCEID")
+        return Id::PointSourceId;
+    else if (s == "RED")
+        return Id::Red;
+    else if (s == "GREEN")
+        return Id::Green;
+    else if (s == "BLUE")
+        return Id::Blue;
+    else if (s == "ALPHA")
+        return Id::Alpha;
+    else if (s == "GPSTIME")
+        return Id::GpsTime;
+    else if (s == "INTERNALTIME")
+        return Id::InternalTime;
+    else if (s == "TIME" || s == "OFFSETTIME")
+        return Id::OffsetTime;
+    else if (s == "ISPPSLOCKED")
+        return Id::IsPpsLocked;
+    else if (s == "STARTPULSE")
+        return Id::StartPulse;
+    else if (s == "RELFECTEDPULSE")
+        return Id::ReflectedPulse;
+    else if (s == "PITCH")
+        return Id::Pitch;
+    else if (s == "ROLL")
+        return Id::Roll;
+    else if (s == "PDOP")
+        return Id::Pdop;
+    else if (s == "PULSEWIDTH")
+        return Id::PulseWidth;
+    else if (s == "DEVIATION")
+        return Id::Deviation;
+    else if (s == "PASSIVESIGNAL")
+        return Id::PassiveSignal;
+    else if (s == "BACKGROUNDRADIATION")
+        return Id::BackgroundRadiation;
+    else if (s == "PASSIVEX")
+        return Id::PassiveX;
+    else if (s == "PASSIVEY")
+        return Id::PassiveY;
+    else if (s == "PASSIVEZ")
+        return Id::PassiveZ;
+    else if (s == "XVELOCITY")
+        return Id::XVelocity;
+    else if (s == "YVELOCITY")
+        return Id::YVelocity;
+    else if (s == "ZVELOCITY")
+        return Id::ZVelocity;
+    else if (s == "PLATFORMHEADING")
+        return Id::PlatformHeading;
+    else if (s == "WANDERANGLE")
+        return Id::WanderAngle;
+    else if (s == "XBODYACCEL")
+        return Id::XBodyAccel;
+    else if (s == "YBODYACCEL")
+        return Id::YBodyAccel;
+    else if (s == "ZBODYACCEL")
+        return Id::ZBodyAccel;
+    else if (s == "XBODYANGRATE")
+        return Id::XBodyAngRate;
+    else if (s == "YBODYANGRATE")
+        return Id::YBodyAngRate;
+    else if (s == "ZBODYANGRATE")
+        return Id::ZBodyAngRate;
+    else if (s == "MARK")
+        return Id::Mark;
+    else if (s == "FLAG")
+        return Id::Flag;
+    else if (s == "ECHORANGE")
+        return Id::EchoRange;
+    else if (s == "SCANCHANNEL")
+        return Id::ScanChannel;
+    else if (s == "INFRARED" || s == "NEARINFRARED")
+        return Id::Infrared;
+    else if (s == "HEIGHTABOVEGROUND")
+        return Id::HeightAboveGround;
+    return Id::Unknown;
+}
+
+/// Get the name of a predefined dimension.
+/// \param[in] id  Dimension ID
+/// \return  Dimension name.
+inline std::string name(Id::Enum id)
+{
+    switch (id)
+    {
+    case Id::X:
+        return "X";
+    case Id::Y:
+        return "Y";
+    case Id::Z:
+        return "Z";
+    case Id::Intensity:
+        return "Intensity";
+    case Id::Amplitude:
+        return "Amplitude";
+    case Id::Reflectance:
+        return "Reflectance";
+    case Id::ReturnNumber:
+        return "ReturnNumber";
+    case Id::NumberOfReturns:
+        return "NumberOfReturns";
+    case Id::ScanDirectionFlag:
+        return "ScanDirectionFlag";
+    case Id::EdgeOfFlightLine:
+        return "EdgeOfFlightLine";
+    case Id::Classification:
+        return "Classification";
+    case Id::ScanAngleRank:
+        return "ScanAngleRank";
+    case Id::UserData:
+        return "UserData";
+    case Id::PointSourceId:
+        return "PointSourceId";
+    case Id::Red:
+        return "Red";
+    case Id::Green:
+        return "Green";
+    case Id::Blue:
+        return "Blue";
+    case Id::Alpha:
+        return "Alpha";
+    case Id::GpsTime:
+        return "GpsTime";
+    case Id::InternalTime:
+        return "InternalTime";
+    case Id::OffsetTime:
+        return "OffsetTime";
+    case Id::IsPpsLocked:
+        return "IsPpsLocked";
+    case Id::StartPulse:
+        return "StartPulse";
+    case Id::ReflectedPulse:
+        return "ReflectedPulse";
+    case Id::Pitch:
+        return "Pitch";
+    case Id::Roll:
+        return "Roll";
+    case Id::Pdop:
+        return "Pdop";
+    case Id::PulseWidth:
+        return "PulseWidth";
+    case Id::Deviation:
+        return "Deviation";
+    case Id::PassiveSignal:
+        return "PassiveSignal";
+    case Id::BackgroundRadiation:
+        return "BackgroundRadiation";
+    case Id::PassiveX:
+        return "PassiveX";
+    case Id::PassiveY:
+        return "PassiveY";
+    case Id::PassiveZ:
+        return "PassiveZ";
+    case Id::XVelocity:
+        return "XVelocity";
+    case Id::YVelocity:
+        return "YVelocity";
+    case Id::ZVelocity:
+        return "ZVelocity";
+    case Id::PlatformHeading:
+        return "PlatformHeading";
+    case Id::WanderAngle:
+        return "WanderAngle";
+    case Id::XBodyAccel:
+        return "XBodyAccel";
+    case Id::YBodyAccel:
+        return "YBodyAccel";
+    case Id::ZBodyAccel:
+        return "ZBodyAccel";
+    case Id::XBodyAngRate:
+        return "XBodyAngRate";
+    case Id::YBodyAngRate:
+        return "YBodyAngRate";
+    case Id::ZBodyAngRate:
+        return "ZBodyAngRate";
+    case Id::Mark:
+        return "Mark";
+    case Id::Flag:
+        return "Flag";
+    case Id::EchoRange:
+        return "EchoRange";
+    case Id::ScanChannel:
+        return "ScanChannel";
+    case Id::Infrared:
+        return "Infrared";
+    case Id::HeightAboveGround:
+        return "HeightAboveGround";
+    case Id::Unknown:
+        return "";
+    }
+    return "";
+}
+
+
+/// Get the default storage type of a predefined dimension.
+/// \param[in] id  ID of the predefined dimension.
+/// \return  The dimension's default storage type.  An exception is thrown if
+///   the id doesn't represent a predefined dimension.
+inline Type::Enum defaultType(Id::Enum id)
+{
+    using namespace Type;
+
+    switch (id)
+    {
+    case Id::X:
+        return Double;
+    case Id::Y:
+        return Double;
+    case Id::Z:
+        return Double;
+    case Id::Intensity:
+        return Unsigned16;
+    case Id::Amplitude:
+        return Float;
+    case Id::Reflectance:
+        return Float;
+    case Id::ReturnNumber:
+        return Unsigned8;
+    case Id::NumberOfReturns:
+        return Unsigned8;
+    case Id::ScanDirectionFlag:
+        return Unsigned8;
+    case Id::EdgeOfFlightLine:
+        return Unsigned8;
+    case Id::Classification:
+        return Unsigned8;
+    case Id::ScanAngleRank:
+        return Float;
+    case Id::UserData:
+        return Unsigned8;
+    case Id::PointSourceId:
+        return Unsigned16;
+    case Id::GpsTime:
+        return Double;
+    case Id::InternalTime:
+        return Double;
+    case Id::OffsetTime:
+        return Unsigned32;
+    case Id::IsPpsLocked:
+        return Unsigned8;
+    case Id::Red:
+        return Unsigned16;
+    case Id::Green:
+        return Unsigned16;
+    case Id::Blue:
+        return Unsigned16;
+    case Id::Alpha:
+        return Unsigned16;
+    case Id::StartPulse:
+        return Signed32;
+    case Id::ReflectedPulse:
+        return Signed32;
+    case Id::Pitch:
+        return Float;
+    case Id::Roll:
+        return Float;
+    case Id::Pdop:
+        return Float;
+    case Id::PulseWidth:
+        return Float;
+    case Id::Deviation:
+        return Float;
+    case Id::PassiveSignal:
+        return Signed32;
+    case Id::BackgroundRadiation:
+        return Float;
+    case Id::PassiveX:
+        return Double;
+    case Id::PassiveY:
+        return Double;
+    case Id::PassiveZ:
+        return Double;
+    case Id::XVelocity:
+        return Double;
+    case Id::YVelocity:
+        return Double;
+    case Id::ZVelocity:
+        return Double;
+    case Id::PlatformHeading:
+        return Double;
+    case Id::WanderAngle:
+        return Double;
+    case Id::XBodyAccel:
+        return Double;
+    case Id::YBodyAccel:
+        return Double;
+    case Id::ZBodyAccel:
+        return Double;
+    case Id::XBodyAngRate:
+        return Double;
+    case Id::YBodyAngRate:
+        return Double;
+    case Id::ZBodyAngRate:
+        return Double;
+    case Id::Mark:
+        return Unsigned8;
+    case Id::Flag:
+        return Unsigned8;
+    case Id::EchoRange:
+        return Double;
+    case Id::ScanChannel:
+        return Unsigned8;
+    case Id::Infrared:
+        return Unsigned16;
+    case Id::HeightAboveGround:
+        return Double;
+    case Id::Unknown:
+        throw pdal_error("No type for undefined dimension ID.");
+    }
+    throw pdal_error("No type for undefined dimension ID.");
+}
+
+/// Get a string reresentation of a datatype.
+/// \param[in] dimtype  Dimension type.
+/// \return  String representation of dimension type.
+inline std::string interpretationName(Type::Enum dimtype)
+{
+    switch (dimtype)
+    {
+    case Type::None:
+        return "unknown";
+    case Type::Signed8:
+        return "int8_t";
+    case Type::Signed16:
+        return "int16_t";
+    case Type::Signed32:
+        return "int32_t";
+    case Type::Signed64:
+        return "int64_t";
+    case Type::Unsigned8:
+        return "uint8_t";
+    case Type::Unsigned16:
+        return "uint16_t";
+    case Type::Unsigned32:
+        return "uint32_t";
+    case Type::Unsigned64:
+        return "uint64_t";
+    case Type::Float:
+        return "float";
+    case Type::Double:
+        return "double";
+    }
+    return "unknown";
+}
+
+
+/// Get the type corresponding to a type name.
+/// \param[in] s  Name of type.
+/// \return  Corresponding type enumeration value.
+inline Type::Enum type(std::string s)
+{
+    boost::to_lower(s);
+
+    if (s == "int8_t" || s == "int8")
+       return Type::Signed8;
+    if (s == "int16_t" || s == "int16")
+       return Type::Signed16;
+    if (s == "int32_t" || s == "int32")
+       return Type::Signed32;
+    if (s == "int64_t" || s == "int64")
+       return Type::Signed64;
+    if (s == "uint8_t" || s == "uint8")
+        return Type::Unsigned8;
+    if (s == "uint16_t" || s == "uint16")
+        return Type::Unsigned16;
+    if (s == "uint32_t" || s == "uint32")
+        return Type::Unsigned32;
+    if (s == "uint64_t" || s == "uint64")
+        return Type::Unsigned64;
+    if (s == "float")
+        return Type::Float;
+    if (s == "double")
+        return Type::Double;
+    return Type::None;
+}
+
+class Detail
+{
+public:
+    Detail() : m_id(Id::Unknown), m_offset(-1), m_type(Type::None)
+    {}
+    //NOTE - This is strange, but for some reason things run faster with
+    // this NOOP virtual dtor.  Perhaps it has something to do with
+    // an inlining optimization or perhaps alignment (though a void * doesn't
+    // cause the same performance improvement) It may help on no machine
+    // except mine, but it doesn't hurt anything, either.
+    virtual ~Detail()
+    {}
+
+    void setOffset(int offset)
+        { m_offset = offset; }
+    void setType(Type::Enum type)
+        { m_type = type; }
+    void setId(Id::Enum id)
+        { m_id = id; }
+    Id::Enum id() const
+        { return m_id; }
+    int offset() const
+        { return m_offset; }
+    Type::Enum type() const
+        { return m_type; }
+    size_t size() const
+        { return Dimension::size(m_type); }
+    BaseType::Enum base() const
+        { return Dimension::base(m_type); }
+
+private:
+    Id::Enum m_id; 
+    int m_offset;
+    Type::Enum m_type;
+};
+typedef std::vector<Detail> DetailList;
+
+} // namespace Dimension
+
+struct DimType
+{
+    DimType() : m_id(Dimension::Id::Unknown), m_type(Dimension::Type::None)
+    {}
+    DimType(Dimension::Id::Enum id, Dimension::Type::Enum type,
+        double scale = 1.0, double offset = 0.0) :
+        m_id(id), m_type(type), m_xform(scale, offset)
+    {}
+    DimType(Dimension::Id::Enum id, Dimension::Type::Enum type, XForm xform) :
+        m_id(id), m_type(type), m_xform(xform)
+    {}
+
+    Dimension::Id::Enum m_id;
+    Dimension::Type::Enum m_type;
+    XForm m_xform;  // A convenience for some formats.
+};
+typedef std::vector<DimType> DimTypeList;
+
+} // namespace pdal
+
diff --git a/include/pdal/Filter.hpp b/include/pdal/Filter.hpp
new file mode 100644
index 0000000..b83f0ce
--- /dev/null
+++ b/include/pdal/Filter.hpp
@@ -0,0 +1,88 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <pdal/Stage.hpp>
+
+namespace pdal
+{
+
+class Filter;
+
+//
+// supported options:
+//   <uint32>id
+//   <bool>debug
+//   <uint32>verbose
+//
+
+class FilterWrapper;
+
+class PDAL_DLL Filter : public Stage
+{
+    friend class FilterWrapper;
+public:
+    Filter() : Stage()
+        {}
+
+    // for xml serializion of pipelines
+    virtual boost::property_tree::ptree serializePipeline() const;
+
+private:
+    virtual PointViewSet run(PointViewPtr view)
+    {
+        PointViewSet viewSet;
+        filter(*view);
+        viewSet.insert(view);
+        return viewSet;
+    }
+    virtual void filter(PointView& /*view*/)
+    {}
+
+    Filter& operator=(const Filter&); // not implemented
+    Filter(const Filter&); // not implemented
+};
+
+class PDAL_DLL MultiFilter : public Filter
+{
+public:
+    MultiFilter() : Filter()
+        {}
+};
+
+}  // namespace pdal
+
diff --git a/include/pdal/FlexWriter.hpp b/include/pdal/FlexWriter.hpp
new file mode 100644
index 0000000..726dc32
--- /dev/null
+++ b/include/pdal/FlexWriter.hpp
@@ -0,0 +1,135 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL FlexWriter : public Writer
+{
+protected:
+    FlexWriter() : m_hashPos(std::string::npos), m_filenum(1)
+    {}
+
+private:
+    virtual void writerProcessOptions(const Options& options)
+    {
+        Writer::writerProcessOptions(options);
+        if (m_filename.empty())
+        {
+            std::ostringstream oss;
+            oss << "Can't write with " << getName() << " without filename.";
+            throw pdal_error(oss.str());
+        }
+        std::string::size_type suffixPos = m_filename.find_last_of('.');
+        m_hashPos = m_filename.find_first_of('#');
+        if (m_hashPos != std::string::npos)
+        {
+            if (m_hashPos > suffixPos)
+            {
+                throw pdal_error("File number placeholder ('#') is not "
+                    "allowed in filename suffix.");
+            }
+            if (m_filename.find_first_of('#', m_hashPos + 1) !=
+                std::string::npos)
+            {
+                std::ostringstream oss;
+                oss << getName() << " filename specification can only contain "
+                    "a single '#' placeholder.";
+                throw pdal_error(oss.str());
+            }
+        }
+    }
+
+    std::string generateFilename()
+    {
+        std::string filename = m_filename;
+        if (m_hashPos != std::string::npos) {
+            std::string fileCount = std::to_string(m_filenum++);
+            filename.replace(m_hashPos, 1, fileCount);
+        }
+        return filename;
+    }
+
+#if (__GNUG__ < 4 || (__GNUG__ == 4 && __GNUG_MINOR__ < 7))
+#define final
+#endif
+
+    virtual void ready(PointTableRef table) final
+    {
+        readyTable(table);
+        if (m_hashPos == std::string::npos)
+            readyFile(generateFilename());
+    }
+
+    virtual void write(const PointViewPtr view) final
+    {
+        if (m_hashPos != std::string::npos)
+            readyFile(generateFilename());
+        writeView(view);
+        if (m_hashPos != std::string::npos)
+            doneFile();
+    }
+
+    virtual void done(PointTableRef table) final
+    {
+        if (m_hashPos == std::string::npos)
+            doneFile();
+        doneTable(table);
+    }
+
+#undef final
+
+    virtual void readyTable(PointTableRef table)
+    {}
+
+    virtual void doneTable(PointTableRef table)
+    {}
+
+    virtual void readyFile(const std::string& filename) = 0;
+    virtual void writeView(const PointViewPtr view) = 0;
+    virtual void doneFile()
+    {}
+
+    std::string::size_type m_hashPos;
+    size_t m_filenum;
+
+    FlexWriter& operator=(const FlexWriter&); // not implemented
+    FlexWriter(const FlexWriter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/GDALUtils.hpp b/include/pdal/GDALUtils.hpp
new file mode 100644
index 0000000..0459d21
--- /dev/null
+++ b/include/pdal/GDALUtils.hpp
@@ -0,0 +1,177 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <pdal/Log.hpp>
+
+#include <sstream>
+#include <vector>
+
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+
+#include <cpl_port.h>
+#include "gdal.h"
+#include <cpl_vsi.h>
+#include <cpl_conv.h>
+#include <ogr_api.h>
+#include <ogr_srs_api.h>
+
+namespace pdal
+{
+
+class SpatialReference;
+
+namespace gdal
+{
+
+typedef std::shared_ptr<void> RefPtr;
+
+class SpatialRef
+{
+public:
+    SpatialRef()
+        { newRef(OSRNewSpatialReference("")); }
+    SpatialRef(const std::string& srs)
+    {
+        newRef(OSRNewSpatialReference(""));
+        OSRSetFromUserInput(get(), srs.data());
+    }
+
+    void setFromLayer(OGRLayerH layer)
+        { newRef(OSRClone(OGR_L_GetSpatialRef(layer))); }
+    operator bool () const
+        { return m_ref.get() != NULL; }
+    OGRSpatialReferenceH get() const
+        { return m_ref.get(); }
+    bool empty() const
+    {
+        char *pszWKT = NULL;
+        OSRExportToWkt(m_ref.get(), &pszWKT);
+        bool valid = (bool)*pszWKT;
+        CPLFree(pszWKT);
+        return (!valid);
+    }
+
+private:
+    void newRef(void *v)
+    {
+        m_ref = RefPtr(v, [](void* t){ OSRDestroySpatialReference(t); } );
+    }
+
+    RefPtr m_ref;
+};
+
+class Geometry
+{
+public:
+    Geometry()
+        {}
+    Geometry(const std::string& wkt, const SpatialRef& srs)
+    {
+        OGRGeometryH geom;
+
+        char *p_wkt = const_cast<char *>(wkt.data());
+        OGR_G_CreateFromWkt(&p_wkt, srs.get(), &geom);
+        newRef(geom);
+    }
+
+    operator bool () const
+        { return get() != NULL; }
+    OGRGeometryH get() const
+        { return m_ref.get(); }
+
+    void transform(const SpatialRef& out_srs)
+    {
+        OGR_G_TransformTo(m_ref.get(), out_srs.get());
+    }
+
+    std::string wkt() const
+    {
+        char* p_wkt = 0;
+        OGRErr err = OGR_G_ExportToWkt(m_ref.get(), &p_wkt);
+        return std::string(p_wkt);
+    }
+
+
+private:
+    void newRef(void *v)
+    {
+        m_ref = RefPtr(v, [](void* t){ OGR_G_DestroyGeometry(t); } );
+    }
+    RefPtr m_ref;
+};
+
+class PDAL_DLL ErrorHandler
+{
+public:
+
+    ErrorHandler(bool isDebug, pdal::LogPtr log);
+    ~ErrorHandler();
+
+    static void CPL_STDCALL trampoline(::CPLErr code, int num, char const* msg)
+    {
+        ErrorHandler* debug =
+            static_cast<ErrorHandler*>(CPLGetErrorHandlerUserData());
+        if (!debug)
+            return;
+
+        // if (!debug->m_log->get()) return;
+        debug->m_gdal_callback(code, num, msg);
+    }
+
+    void log(::CPLErr code, int num, char const* msg);
+    void error(::CPLErr code, int num, char const* msg);
+
+    inline LogPtr getLogger() const { return m_log; }
+    inline void setLogger(LogPtr logger) { m_log = logger; }
+
+private:
+    boost::function<void(CPLErr, int, char const*)> m_gdal_callback;
+    bool m_isDebug;
+    pdal::LogPtr m_log;
+};
+
+} // namespace gdal
+
+
+PDAL_DLL std::string transformWkt(std::string wkt, const SpatialReference& from,
+    const SpatialReference& to);
+
+
+} // namespace pdal
+
diff --git a/include/pdal/GlobalEnvironment.hpp b/include/pdal/GlobalEnvironment.hpp
new file mode 100644
index 0000000..dd5b290
--- /dev/null
+++ b/include/pdal/GlobalEnvironment.hpp
@@ -0,0 +1,70 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Log.hpp>
+
+#include <mutex>
+#include <memory>
+
+namespace pdal
+{
+namespace gdal
+{
+class ErrorHandler;
+}
+
+class PDAL_DLL GlobalEnvironment
+{
+public:
+    static GlobalEnvironment& get();
+    static void startup();
+    static void shutdown();
+
+    void initializeGDAL(LogPtr log, bool bGDALDebugOutput = false);
+
+private:
+    GlobalEnvironment();
+    ~GlobalEnvironment();
+
+    std::unique_ptr<gdal::ErrorHandler> m_gdalDebug;
+
+    GlobalEnvironment(const GlobalEnvironment&); // nope
+    GlobalEnvironment& operator=(const GlobalEnvironment&); // nope
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/KDIndex.hpp b/include/pdal/KDIndex.hpp
new file mode 100644
index 0000000..50ad28f
--- /dev/null
+++ b/include/pdal/KDIndex.hpp
@@ -0,0 +1,334 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "nanoflann.hpp"
+
+#include <memory>
+#include <pdal/PointView.hpp>
+
+namespace nanoflann
+{
+    template<typename Distance, class DatasetAdaptor, int DIM,
+        typename IndexType> class KDTreeSingleIndexAdaptor;
+
+    template<class T, class DataSource, typename _DistanceType>
+    struct L2_Adaptor;
+}
+
+namespace pdal
+{
+
+template<int DIM>
+class PDAL_DLL KDIndex
+{
+protected:
+    KDIndex(const PointView& buf) : m_buf(buf)
+    {}
+   
+    ~KDIndex()
+    {}
+
+public:
+    std::size_t kdtree_get_point_count() const
+        { return m_buf.size(); }
+
+    double kdtree_get_pt(const PointId idx, int dim) const;
+    double kdtree_distance(const double *p1, const PointId p2_idx,
+        size_t /*numDims*/) const;
+    template <class BBOX> bool kdtree_get_bbox(BBOX& bb) const;
+    void build()
+    {
+        m_index.reset(new my_kd_tree_t(DIM, *this,
+            nanoflann::KDTreeSingleIndexAdaptorParams(10, DIM)));
+        m_index->buildIndex();
+    }
+
+protected:
+    const PointView& m_buf;
+
+    typedef nanoflann::KDTreeSingleIndexAdaptor<nanoflann::L2_Simple_Adaptor<
+        double, KDIndex, double>, KDIndex, -1, std::size_t> my_kd_tree_t;
+
+    std::unique_ptr<my_kd_tree_t> m_index;
+
+private:
+    KDIndex(const KDIndex&);
+    KDIndex& operator=(KDIndex&);
+};
+
+class PDAL_DLL KD2Index : public KDIndex<2>
+{
+public:
+    KD2Index(const PointView& buf) : KDIndex<2>(buf)
+    {
+        if (!buf.hasDim(Dimension::Id::X))
+            throw pdal_error("KD2Index: point view missing 'X' dimension.");
+        if (!buf.hasDim(Dimension::Id::Y))
+            throw pdal_error("KD2Index: point view missing 'Y' dimension.");
+    }
+
+    PointId neighbor(double x, double y)
+    {
+        std::vector<PointId> ids = neighbors(x, y, 1);
+        return (ids.size() ? ids[0] : 0);
+    }
+
+    std::vector<PointId> neighbors(double x, double y, point_count_t k)
+    {
+        k = std::min(m_buf.size(), k);
+        std::vector<PointId> output(k);
+        std::vector<double> out_dist_sqr(k);
+        nanoflann::KNNResultSet<double, PointId, point_count_t> resultSet(k);
+
+        resultSet.init(&output[0], &out_dist_sqr[0]);
+
+        std::vector<double> pt;
+        pt.push_back(x);
+        pt.push_back(y);
+        m_index->findNeighbors(resultSet, &pt[0], nanoflann::SearchParams(10));
+        return output;
+    }
+
+    std::vector<PointId> radius(double const& x, double const& y,
+        double const& r) const
+    {
+        std::vector<PointId> output;
+        std::vector<std::pair<std::size_t, double>> ret_matches;
+        nanoflann::SearchParams params;
+        params.sorted = true;
+
+        std::vector<double> pt;
+        pt.push_back(x);
+        pt.push_back(y);
+
+        // Our distance metric is square distance, so we use the square of
+        // the radius.
+        const std::size_t count =
+            m_index->radiusSearch(&pt[0], r * r, ret_matches, params);
+
+        for (std::size_t i = 0; i < count; ++i)
+            output.push_back(ret_matches[i].first);
+        return output;
+    }
+};
+
+class PDAL_DLL KD3Index : public KDIndex<3>
+{
+public:
+    KD3Index(const PointView& buf) : KDIndex<3>(buf)
+    {
+        if (!buf.hasDim(Dimension::Id::X))
+            throw pdal_error("KD3Index: point view missing 'X' dimension.");
+        if (!buf.hasDim(Dimension::Id::Y))
+            throw pdal_error("KD3Index: point view missing 'Y' dimension.");
+        if (!buf.hasDim(Dimension::Id::Z))
+            throw pdal_error("KD3Index: point view missing 'Z' dimension.");
+    }
+
+    PointId neighbor(double x, double y, double z)
+    {
+        std::vector<PointId> ids = neighbors(x, y, z, 1);
+        return (ids.size() ? ids[0] : 0);
+    }
+
+    std::vector<PointId> neighbors(double x, double y, double z,
+        point_count_t k)
+    {
+        k = std::min(m_buf.size(), k);
+        std::vector<PointId> output(k);
+        std::vector<double> out_dist_sqr(k);
+        nanoflann::KNNResultSet<double, PointId, point_count_t> resultSet(k);
+
+        resultSet.init(&output[0], &out_dist_sqr[0]);
+
+        std::vector<double> pt;
+        pt.push_back(x);
+        pt.push_back(y);
+        pt.push_back(z);
+        m_index->findNeighbors(resultSet, &pt[0], nanoflann::SearchParams(10));
+        return output;
+    }
+
+    std::vector<PointId> radius(double x, double y, double z, double r) const
+    {
+        std::vector<PointId> output;
+        std::vector<std::pair<std::size_t, double>> ret_matches;
+        nanoflann::SearchParams params;
+        params.sorted = true;
+
+        std::vector<double> pt;
+        pt.push_back(x);
+        pt.push_back(y);
+        pt.push_back(z);
+
+        // Our distance metric is square distance, so we use the square of
+        // the radius.
+        const std::size_t count =
+            m_index->radiusSearch(&pt[0], r * r, ret_matches, params);
+
+        for (std::size_t i = 0; i < count; ++i)
+            output.push_back(ret_matches[i].first);
+        return output;
+    }
+};
+
+template<>
+inline
+double KDIndex<2>::kdtree_get_pt(const PointId idx, int dim) const
+{
+    if (idx >= m_buf.size())
+        return 0.0;
+
+    Dimension::Id::Enum id = Dimension::Id::Unknown;
+    switch (dim)
+    {
+    case 0:
+        id = Dimension::Id::X;
+        break;
+    case 1:
+        id = Dimension::Id::Y;
+        break;
+    default:
+        throw pdal_error("kdtree_get_pt: Request for invalid dimension "
+            "from nanoflann");
+    }
+    return m_buf.getFieldAs<double>(id, idx);
+}
+
+template<>
+inline
+double KDIndex<3>::kdtree_get_pt(const PointId idx, int dim) const
+{
+    if (idx >= m_buf.size())
+        return 0.0;
+
+    Dimension::Id::Enum id = Dimension::Id::Unknown;
+    switch (dim)
+    {
+    case 0:
+        id = Dimension::Id::X;
+        break;
+    case 1:
+        id = Dimension::Id::Y;
+        break;
+    case 2:
+        id = Dimension::Id::Z;
+        break;
+    default:
+        throw pdal_error("kdtree_get_pt: Request for invalid dimension "
+            "from nanoflann");
+    }
+    return m_buf.getFieldAs<double>(id, idx);
+}
+
+// nanoflann hands us a vector that represents the position of p1.  We fetch
+// the position of p2 and and compute the square distance.
+template<>
+inline double KDIndex<2>::kdtree_distance(const double *p1, const PointId idx,
+    size_t /*numDims*/) const
+{
+    double d0 = p1[0] - m_buf.getFieldAs<double>(Dimension::Id::X, idx);
+    double d1 = p1[1] - m_buf.getFieldAs<double>(Dimension::Id::Y, idx);
+
+    return (d0 * d0 + d1 * d1);
+}
+
+template<>
+inline double KDIndex<3>::kdtree_distance(const double *p1, const PointId idx,
+    size_t /*numDims*/) const
+{
+    double d0 = p1[0] - m_buf.getFieldAs<double>(Dimension::Id::X, idx);
+    double d1 = p1[1] - m_buf.getFieldAs<double>(Dimension::Id::Y, idx);
+    double d2 = p1[2] - m_buf.getFieldAs<double>(Dimension::Id::Z, idx);
+
+    return (d0 * d0 + d1 * d1 + d2 * d2);
+}
+
+
+template<>
+template <class BBOX>
+bool KDIndex<2>::kdtree_get_bbox(BBOX& bb) const
+{
+    if (m_buf.empty())
+    {
+        bb[0].low = 0.0;
+        bb[0].high = 0.0;
+        bb[1].low = 0.0;
+        bb[1].high = 0.0;
+    }
+    else
+    {
+        BOX2D bounds;
+        m_buf.calculateBounds(bounds);
+
+        bb[0].low = bounds.minx;
+        bb[0].high = bounds.maxx;
+        bb[1].low = bounds.miny;
+        bb[1].high = bounds.maxy;
+    }
+    return true;
+}
+
+template<>
+template <class BBOX>
+bool KDIndex<3>::kdtree_get_bbox(BBOX& bb) const
+{
+    if (m_buf.empty())
+    {
+        bb[0].low = 0.0;
+        bb[0].high = 0.0;
+        bb[1].low = 0.0;
+        bb[1].high = 0.0;
+        bb[2].low = 0.0;
+        bb[2].high = 0.0;
+    }
+    else
+    {
+        BOX3D bounds;
+        m_buf.calculateBounds(bounds);
+
+        bb[0].low = bounds.minx;
+        bb[0].high = bounds.maxx;
+        bb[1].low = bounds.miny;
+        bb[1].high = bounds.maxy;
+        bb[2].low = bounds.minz;
+        bb[2].high = bounds.maxz;
+    }
+    return true;
+}
+
+} // namespace pdal
+
diff --git a/include/pdal/Kernel.hpp b/include/pdal/Kernel.hpp
new file mode 100644
index 0000000..9d418ae
--- /dev/null
+++ b/include/pdal/Kernel.hpp
@@ -0,0 +1,195 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/KernelSupport.hpp>
+#include <pdal/pdal_export.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4512)  // assignment operator could not be generated
+#endif
+#include <boost/program_options.hpp>
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(pop)
+#endif
+
+#include <cstdint>
+#include <iosfwd>
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace po = boost::program_options;
+
+namespace pdal
+{
+
+class Options;
+class PointView;
+
+typedef std::shared_ptr<PointView> PointViewPtr;
+
+//
+// The application base class gives us these common options:
+//    --help / -h
+//    --verbose / -v
+//    --version
+//
+class PDAL_DLL Kernel
+{
+public:
+    virtual ~Kernel()
+    {}
+
+    // call this, to start the machine
+    int run(int argc, const char* argv[], const std::string& appName);
+
+    bool isDebug() const;
+    uint32_t getVerboseLevel() const;
+    virtual std::string getName() const = 0;
+    bool isVisualize() const;
+    void visualize(PointViewPtr view);
+
+protected:
+    // this is protected; your derived class ctor will be the public entry point
+    Kernel();
+    Stage& makeReader(const std::string& inputFile);
+    Stage& makeWriter(const std::string& outputFile, Stage& parent);
+
+public:
+    // implement this, with calls to addOptionSet()
+    virtual void addSwitches() {}
+
+    // implement this, to do sanity checking of cmd line
+    // will throw if the user gave us bad options
+    virtual void validateSwitches() {}
+
+    // implement this, to do your actual work
+    // it will be wrapped in a global catch try/block for you
+    virtual int execute() = 0;
+
+    void addSwitchSet(po::options_description* options);
+    void addHiddenSwitchSet(po::options_description* options);
+    void addPositionalSwitch(const char* name, int max_count);
+    void setCommonOptions(Options &options);
+
+    void setProgressShellCommand(std::vector<std::string> const& command)
+    {
+        m_heartbeat_shell_command = command;
+    }
+    std::vector<std::string> getProgressShellCommand()
+    {
+        return m_heartbeat_shell_command;
+    }
+
+    const Options& extraStageOptions(const std::string& stage)
+    {
+        static Options nullOpts;
+
+        auto oi = m_extraStageOptions.find(stage);
+        if (oi == m_extraStageOptions.end())
+            return nullOpts;
+        return oi->second;
+    }
+
+    void applyExtraStageOptionsRecursive(Stage *s)
+    {
+        s->addOptions(extraStageOptions(s->getName()));
+        auto stages = s->getInputs();
+        for (Stage *s : stages)
+            applyExtraStageOptionsRecursive(s);
+    }
+
+protected:
+    Stage& ownStage(Stage *s)
+    {
+        m_stages.push_back(std::unique_ptr<Stage>(s));
+        return *s;
+    }
+    bool argumentExists(const std::string& name)
+        { return (bool)m_variablesMap.count(name); }
+    bool argumentSpecified(const std::string& name);
+
+    bool m_usestdin;
+    int m_argc;
+    const char** m_argv;
+    Log m_log;
+
+private:
+    int innerRun();
+    void parseSwitches();
+    void outputHelp();
+    void outputVersion();
+    void addBasicSwitchSet();
+    void collectExtraOptions();
+
+    int do_switches();
+    int do_startup();
+    int do_execution();
+    int do_shutdown();
+
+    bool m_isDebug;
+    uint32_t m_verboseLevel;
+    bool m_showHelp;
+    std::string m_showOptions;
+    bool m_showVersion;
+    bool m_showTime;
+    std::string m_appName;
+    bool m_hardCoreDebug;
+    std::vector<std::string> m_heartbeat_shell_command;
+    bool m_reportDebug;
+    std::string m_scales;
+    std::string m_offsets;
+    bool m_visualize;
+    std::string m_label;
+
+    std::vector<po::options_description*> m_public_options;
+    std::vector<po::options_description*> m_hidden_options;
+    po::positional_options_description m_positionalOptions;
+    po::variables_map m_variablesMap;
+    std::vector<std::string> m_extra_options;
+    std::map<std::string, Options> m_extraStageOptions;
+    std::vector<std::unique_ptr<Stage>> m_stages;
+
+    Kernel& operator=(const Kernel&); // not implemented
+    Kernel(const Kernel&); // not implemented
+};
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Kernel&);
+
+} // namespace pdal
+
diff --git a/include/pdal/KernelFactory.hpp b/include/pdal/KernelFactory.hpp
new file mode 100644
index 0000000..018ac93
--- /dev/null
+++ b/include/pdal/KernelFactory.hpp
@@ -0,0 +1,71 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/pdal_export.hpp>
+
+
+namespace pdal
+{
+
+// This class provides a mechanism for creating Kernel objects using only a
+// string (the kernel type name) and an Options block.
+//
+// We keep a list of (kernel type name, creation function) pairs, which
+// acts as a registry of creator functions.  The list is initialized with
+// the core kernels we know about (I wish C++ had anonymous functions.).
+// We allow the user to add his own "external" drivers to the registry list
+// as well.
+//
+// We use 4 different functions for each kind of operation, since we have
+// 4 types of derived classes from Kernel and they all have slightly different
+// parameters.  That makes it kinda messy.
+
+class PDAL_DLL KernelFactory
+{
+public:
+    KernelFactory(bool no_plugins=true);
+    virtual ~KernelFactory() {};
+
+    static std::unique_ptr<Kernel> createKernel(std::string const& kernel_name);
+    static std::vector<std::string> getKernelNames();
+
+private:
+    KernelFactory& operator=(const KernelFactory&); // not implemented
+    KernelFactory(const KernelFactory&); // not implemented
+};
+
+} // namespace pdal
diff --git a/include/pdal/KernelSupport.hpp b/include/pdal/KernelSupport.hpp
new file mode 100644
index 0000000..cbf1189
--- /dev/null
+++ b/include/pdal/KernelSupport.hpp
@@ -0,0 +1,110 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <string>
+
+#include <pdal/Options.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/UserCallback.hpp>
+#include <pdal/PipelineManager.hpp>
+
+namespace pdal
+{
+
+class app_usage_error : public pdal::pdal_error
+{
+public:
+    inline app_usage_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+
+class app_runtime_error : public pdal::pdal_error
+{
+public:
+    inline app_runtime_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+
+// this is a static class with some helper functions the cmd line apps need
+class PDAL_DLL KernelSupport
+{
+public:
+    // makes a writer, from just the filename and some other
+    // options (and the input stage)
+    static PipelineManager* makePipeline(const std::string& filename);
+
+private:
+    KernelSupport& operator=(const KernelSupport&); // not implemented
+    KernelSupport(const KernelSupport&); // not implemented
+};
+
+
+class PDAL_DLL PercentageCallback : public pdal::UserCallback
+{
+public:
+    PercentageCallback(double major = 10.0, double minor = 2.0);
+    virtual void callback();
+
+protected:
+    double m_lastMajorPerc;
+    double m_lastMinorPerc;
+    bool m_done;
+};
+
+
+class PDAL_DLL HeartbeatCallback : public pdal::UserCallback
+{
+public:
+    virtual void callback()
+        { std::cerr << "."; }
+};
+
+
+class PDAL_DLL ShellScriptCallback : public PercentageCallback
+{
+public:
+    ShellScriptCallback(const std::vector<std::string>& command);
+    virtual void callback();
+
+private:
+    std::string m_command;
+};
+
+} // namespace pdal
diff --git a/include/pdal/Log.hpp b/include/pdal/Log.hpp
new file mode 100644
index 0000000..2fd19a5
--- /dev/null
+++ b/include/pdal/Log.hpp
@@ -0,0 +1,135 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <iosfwd>
+#include <memory>
+
+// Adapted from http://drdobbs.com/cpp/201804215
+
+namespace pdal
+{
+
+
+/// pdal::Log is a logging object that is provided by pdal::Stage to
+/// facilitate logging operations.
+class PDAL_DLL Log
+{
+public:
+
+    /// Constructs a pdal::Log instance.
+    /// @param leaderString A string to presage all log entries with
+    /// @param outputName A filename or one of 'stdout', 'stdlog', or 'stderr'
+    ///                   to use for outputting log information.
+    Log(std::string const& leaderString, std::string const& outputName);
+
+    /// Constructs a pdal::Log instance.
+    /// @param leaderString A string to presage all log entries with
+    /// @param v An existing std::ostream to use for logging (instead of the
+    ///          the instance creating its own)
+    Log(std::string const& leaderString, std::ostream* v);
+
+    /** @name Destructor
+    */
+    /// The destructor will clean up its own internal log stream, but it will
+    /// not touch one that is given via the constructor
+    ~Log();
+
+    /** @name Logging level
+    */
+    /// @return the logging level of the pdal::Log instance
+    LogLevel::Enum getLevel()
+    {
+        return m_level;
+    }
+
+    /// Sets the logging level of the pdal::Log instance
+    /// @param v logging level to use for get() comparison operations
+    void setLevel(LogLevel::Enum v)
+    {
+        m_level = v;
+    }
+
+    /// Set the leader string.
+    /// \param[in]  leader  Leader string.
+    void setLeader(const std::string& leader)
+        { m_leader = leader; }
+
+    /// @return A string representing the LogLevel
+    std::string getLevelString(LogLevel::Enum v) const;
+
+    /** @name Log stream operations
+    */
+    /// @return the stream object that is currently being used to for log
+    /// operations regardless of logging level of the instance.
+    std::ostream* getLogStream()
+    {
+        return m_log;
+    }
+
+    /// Returns the log stream given the logging level.
+    /// @param level logging level to request
+    /// If the logging level asked for with
+    /// pdal::Log::get is less than the logging level of the pdal::Log instance
+    std::ostream& get(LogLevel::Enum level = LogLevel::Info);
+
+    /// Sets the floating point precision
+    void floatPrecision(int level);
+
+    /// Clears the floating point precision settings of the streams
+    void clearFloat();
+
+protected:
+    std::ostream *m_log;
+    std::ostream *m_nullStream;
+
+private:
+    Log(const Log&);
+    Log& operator =(const Log&);
+
+    void makeNullStream();
+
+    LogLevel::Enum m_level;
+    bool m_deleteStreamOnCleanup;
+    std::string m_leader;
+};
+
+typedef std::shared_ptr<Log> LogPtr;
+
+} // namespace pdal
+
diff --git a/include/pdal/Metadata.hpp b/include/pdal/Metadata.hpp
new file mode 100644
index 0000000..6d2a052
--- /dev/null
+++ b/include/pdal/Metadata.hpp
@@ -0,0 +1,750 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <boost/uuid/uuid.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+#include <pdal/util/Bounds.hpp>
+#include <pdal/util/Utils.hpp>
+#include <pdal/SpatialReference.hpp>
+
+#include <map>
+#include <memory>
+#include <vector>
+#include <stdint.h>
+
+namespace pdal
+{
+
+namespace MetadataType
+{
+enum Enum
+{
+    Instance,
+    Array
+};
+} // namespace MetadataType
+
+class Metadata;
+class MetadataNode;
+class MetadataNodeImpl;
+typedef std::shared_ptr<MetadataNodeImpl> MetadataNodeImplPtr;
+typedef std::vector<MetadataNodeImplPtr> MetadataImplList;
+typedef std::map<std::string, MetadataImplList> MetadataSubnodes;
+typedef std::vector<MetadataNode> MetadataNodeList;
+
+class MetadataNodeImpl
+{
+    friend class MetadataNode;
+
+private:
+    MetadataNodeImpl(const std::string& name) : m_kind(MetadataType::Instance)
+        { m_name = name; }
+
+    MetadataNodeImpl() : m_kind(MetadataType::Instance)
+    {}
+
+    void makeArray(MetadataImplList& l)
+    {
+        for (auto li = l.begin(); li != l.end(); ++li)
+        {
+            MetadataNodeImplPtr node = *li;
+            node->m_kind = MetadataType::Array;
+        }
+    }
+
+    MetadataNodeImplPtr add(const std::string& name)
+    {
+        MetadataNodeImplPtr sub(new MetadataNodeImpl(name));
+        MetadataImplList& l = m_subnodes[name];
+        l.push_back(sub);
+        if (l.size() > 1)
+            makeArray(l);
+        return sub;
+    }
+
+    MetadataNodeImplPtr addList(const std::string& name)
+    {
+        MetadataNodeImplPtr sub(new MetadataNodeImpl(name));
+        MetadataImplList& l = m_subnodes[name];
+        l.push_back(sub);
+        makeArray(l);
+        return sub;
+    }
+
+    MetadataNodeImplPtr add(MetadataNodeImplPtr node)
+    {
+        MetadataImplList& l = m_subnodes[node->m_name];
+        l.push_back(node);
+        if (l.size() > 1)
+            makeArray(l);
+        return node;
+    }
+
+    MetadataNodeImplPtr addList(MetadataNodeImplPtr node)
+    {
+        MetadataImplList& l = m_subnodes[node->m_name];
+        l.push_back(node);
+        makeArray(l);
+        return node;
+    }
+
+    bool operator == (const MetadataNodeImpl& m) const
+    {
+        if (m_name != m.m_name || m_descrip != m.m_descrip ||
+            m_type != m.m_type || m_value != m.m_value)
+            return false;
+        if (m_subnodes.size() != m.m_subnodes.size())
+            return false;
+
+        auto mi2 = m.m_subnodes.begin();
+        for (auto mi = m_subnodes.begin(); mi != m_subnodes.end(); ++mi, ++mi2)
+        {
+            if (mi->first != mi2->first)
+                return false;
+            const MetadataImplList& ml = mi->second;
+            const MetadataImplList& ml2 = mi->second;
+            if (ml.size() != ml2.size())
+                return false;
+            auto li2 = ml2.begin();
+            for (auto li = ml.begin(); li != ml.end(); ++li, ++li2)
+            {
+                auto node1 = *li;
+                auto node2 = *li2;
+                if (!(*node1 == *node2))
+                    return false;
+            }
+        }
+        return true;
+    }
+
+    template <typename T>
+    inline void setValue(const T& t);
+
+    template <std::size_t N>
+    inline void setValue(const char(& c)[N]);
+
+    MetadataImplList& subnodes(const std::string &name)
+    {
+        auto si = m_subnodes.find(name);
+        if (si != m_subnodes.end())
+            return si->second;
+
+        static MetadataImplList l;
+        return l;
+    }
+
+    const MetadataImplList& subnodes(const std::string& name) const
+    {
+        MetadataNodeImpl *nc_this = const_cast<MetadataNodeImpl *>(this);
+        return nc_this->subnodes(name);
+    }
+
+    MetadataType::Enum nodeType(const std::string& name) const
+    {
+        const MetadataImplList& l = subnodes(name);
+        if (l.size())
+        {
+            MetadataNodeImplPtr node = *l.begin();
+            return node->m_kind;
+        }
+        return MetadataType::Instance;
+    }
+
+    std::string m_name;
+    std::string m_descrip;
+    std::string m_type;
+    std::string m_value;
+    MetadataType::Enum m_kind;
+    MetadataSubnodes m_subnodes;
+};
+
+template <>
+inline void MetadataNodeImpl::setValue(const bool& b)
+{
+    m_type = "boolean";
+    m_value = b ? "true" : "false";
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const std::string& s)
+{
+    m_type = "string";
+    m_value = s;
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const char * const & c)
+{
+    m_type = "string";
+    m_value = c;
+}
+
+template <std::size_t N>
+inline void MetadataNodeImpl::setValue(const char(& c)[N])
+{
+    m_type = "string";
+    m_value = c;
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const float& f)
+{
+    m_type = "float";
+    m_value = Utils::toString(f);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue<double>(const double& d)
+{
+    m_type = "double";
+
+    // Get rid of -0.
+    double dd = d;
+    if (dd == 0.0)
+        dd = 0.0;
+    m_value = Utils::toString(dd);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const SpatialReference& ref)
+{
+    m_type = "spatialreference";
+    m_value = Utils::toString(ref);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const BOX3D& b)
+{
+    m_type = "bounds";
+    m_value = Utils::toString(b);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const unsigned char& u)
+{
+    m_type = "nonNegativeInteger";
+    m_value = Utils::toString(u);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const unsigned short& u)
+{
+    m_type = "nonNegativeInteger";
+    m_value = Utils::toString(u);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const unsigned int& u)
+{
+    m_type = "nonNegativeInteger";
+    m_value = Utils::toString(u);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const unsigned long& u)
+{
+    m_type = "nonNegativeInteger";
+    m_value = Utils::toString(u);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const unsigned long long& u)
+{
+    m_type = "nonNegativeInteger";
+    m_value = Utils::toString(u);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const char& i)
+{
+    m_type = "integer";
+    m_value = Utils::toString(i);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const signed char& i)
+{
+    m_type = "integer";
+    m_value = Utils::toString(i);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const short& s)
+{
+    m_type = "integer";
+    m_value = Utils::toString(s);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const int& i)
+{
+    m_type = "integer";
+    m_value = Utils::toString(i);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const long& l)
+{
+    m_type = "integer";
+    m_value = Utils::toString(l);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const long long& l)
+{
+    m_type = "integer";
+    m_value = Utils::toString(l);
+}
+
+template <>
+inline void MetadataNodeImpl::setValue(const boost::uuids::uuid& u)
+{
+    m_type = "uuid";
+    m_value = Utils::toString(u);
+}
+
+
+class PDAL_DLL MetadataNode
+{
+    friend class Metadata;
+    friend inline
+        bool operator == (const MetadataNode& m1, const MetadataNode& m2);
+    friend inline
+        bool operator != (const MetadataNode& m1, const MetadataNode& m2);
+
+public:
+    MetadataNode() : m_impl(new MetadataNodeImpl())
+        {}
+
+    MetadataNode(const std::string& name) : m_impl(new MetadataNodeImpl(name))
+        {}
+
+    MetadataNode add(const std::string& name)
+        { return MetadataNode(m_impl->add(name)); }
+
+    MetadataNode addList(const std::string& name)
+        { return MetadataNode(m_impl->addList(name)); }
+
+    MetadataNode clone(const std::string& name)
+    {
+        MetadataNode node;
+        node.m_impl.reset(new MetadataNodeImpl(*m_impl));
+        node.m_impl->m_name = name;
+        return node;
+    }
+
+    MetadataNode add(MetadataNode node)
+        { return MetadataNode(m_impl->add(node.m_impl)); }
+
+    MetadataNode addList(MetadataNode node)
+        { return MetadataNode(m_impl->addList(node.m_impl)); }
+
+    MetadataNode addEncoded(const std::string& name,
+        const unsigned char *buf, size_t size,
+        const std::string& descrip = std::string())
+    {
+        MetadataNodeImplPtr impl = m_impl->add(name);
+        impl->setValue(Utils::base64_encode(buf, size));
+        impl->m_type = "base64Binary";
+        impl->m_descrip = descrip;
+        return MetadataNode(impl);
+    }
+
+    MetadataNode addListEncoded(const std::string& name,
+        const unsigned char *buf, size_t size,
+        const std::string& descrip = std::string())
+    {
+        MetadataNodeImplPtr impl = m_impl->addList(name);
+        impl->setValue(Utils::base64_encode(buf, size));
+        impl->m_type = "base64Binary";
+        impl->m_descrip = descrip;
+        return MetadataNode(impl);
+    }
+
+    MetadataNode addWithType(const std::string& name, const std::string& value,
+        const std::string& type, const std::string& descrip)
+    {
+        MetadataNodeImplPtr impl = m_impl->add(name);
+        impl->m_type = type;
+        impl->m_value = value;
+        impl->m_descrip = descrip;
+        return MetadataNode(impl);
+    }
+
+    template<typename T>
+    MetadataNode add(const std::string& name, const T& value,
+        const std::string& descrip = std::string())
+    {
+        MetadataNodeImplPtr impl = m_impl->add(name);
+        impl->setValue(value);
+        impl->m_descrip = descrip;
+        return MetadataNode(impl);
+    }
+
+    template<typename T>
+    MetadataNode addList(const std::string& name, const T& value,
+        const std::string& descrip = std::string())
+    {
+        MetadataNodeImplPtr impl = m_impl->addList(name);
+        impl->setValue(value);
+        impl->m_descrip = descrip;
+        return MetadataNode(impl);
+    }
+
+    template<typename T>
+    MetadataNode addOrUpdate(const std::string& lname, const T& value)
+    {
+        if (m_impl->nodeType(lname) == MetadataType::Array)
+            throw pdal_error("Can't call addOrUpdate() on subnode list.");
+        MetadataImplList& l = m_impl->subnodes(lname);
+
+        if (l.empty())
+            return add(lname, value);
+        MetadataNodeImplPtr impl = *l.begin();
+        impl->setValue(value);
+        return MetadataNode(impl);
+    }
+
+    template<typename T>
+    MetadataNode addOrUpdate(const std::string& lname, const T& value,
+        const std::string& descrip)
+    {
+        MetadataNode m = addOrUpdate(lname, value);
+        m_impl->m_descrip = descrip;
+        return m;
+    }
+
+    std::string type() const
+        { return m_impl->m_type; }
+
+    MetadataType::Enum kind() const
+        { return m_impl->m_kind; }
+
+    std::string name() const
+        { return m_impl->m_name; }
+
+    template<typename T>
+    T value() const
+    {
+        T t;
+
+        if (m_impl->m_type == "base64Binary")
+        {
+            std::vector<uint8_t> encVal =
+                Utils::base64_decode(m_impl->m_value);
+            encVal.resize(sizeof(T));
+            memcpy(&t, encVal.data(), sizeof(T));
+        }
+        else
+        {
+            if (!Utils::fromString<T>(m_impl->m_value, t))
+            {
+                // Static to get default initialization.
+                static T t2;
+                std::cerr << "Error converting metadata [" << name() <<
+                    "] = " << m_impl->m_value << " to type " <<
+                    Utils::typeidName<T>() << " -- return default initialized.";
+                t = t2;
+            }
+        }
+        return t;
+    }
+
+    std::string value() const
+        { return m_impl->m_value; }
+
+    std::string jsonValue() const
+    {
+        std::string val;
+        if (m_impl->m_type == "string" || m_impl->m_type == "base64Binary" ||
+            m_impl->m_type == "uuid")
+        {
+            std::string val("\"");
+            val += escapeQuotes(value()) + "\"";
+            return val;
+        }
+        return value();
+    }
+
+    std::string description() const
+        { return m_impl->m_descrip; }
+
+    MetadataNodeList children() const
+    {
+        MetadataNodeList outnodes;
+
+        const MetadataSubnodes& nodes = m_impl->m_subnodes;
+        for (auto si = nodes.begin(); si != nodes.end(); ++si)
+        {
+            const MetadataImplList& l = si->second;
+            for (auto li = l.begin(); li != l.end(); ++li)
+                outnodes.push_back(MetadataNode(*li));
+        }
+        return outnodes;
+    }
+
+    MetadataNodeList children(const std::string& name) const
+    {
+        MetadataNodeList outnodes;
+
+        auto si = m_impl->m_subnodes.find(name);
+        if (si != m_impl->m_subnodes.end())
+        {
+            const MetadataImplList& l = si->second;
+            for (auto li = l.begin(); li != l.end(); ++li)
+                outnodes.push_back(MetadataNode(*li));
+        }
+        return outnodes;
+    }
+
+    bool hasChildren() const
+        { return m_impl->m_subnodes.size(); }
+
+    std::vector<std::string> childNames() const
+    {
+        std::vector<std::string> names;
+
+        MetadataSubnodes& nodes = m_impl->m_subnodes;
+        for (auto si = nodes.begin(); si != nodes.end(); ++si)
+            names.push_back(si->first);
+        return names;
+    }
+
+    bool operator ! ()
+        { return empty(); }
+    bool valid() const
+        { return !empty(); }
+    bool empty() const
+        { return m_impl->m_name.empty() && !hasChildren(); }
+
+    template <typename PREDICATE>
+    MetadataNode find(PREDICATE p) const
+    {
+        if (p(*this))
+            return *this;
+        auto nodes = children();
+        for (auto ai = nodes.begin(); ai != nodes.end(); ++ai)
+        {
+            MetadataNode n = ai->find(p);
+            if (!n.empty())
+                return n;
+        }
+        return MetadataNode();
+    }
+
+    template <typename PREDICATE>
+    MetadataNodeList findChildren(PREDICATE p)
+    {
+        MetadataNodeList matches;
+
+        auto nodes = children();
+        for (auto ai = nodes.begin(); ai != nodes.end(); ++ai)
+        {
+            MetadataNode& n = *ai;
+            if (p(n))
+                matches.push_back(n);
+        }
+        return matches;
+    }
+
+    template <typename PREDICATE>
+    MetadataNode findChild(PREDICATE p) const
+    {
+        auto nodes = children();
+        for (auto ai = nodes.begin(); ai != nodes.end(); ++ai)
+        {
+            MetadataNode& n = *ai;
+            if (p(n))
+                return n;
+        }
+        return MetadataNode();
+    }
+
+    MetadataNode findChild(const char *s) const
+        { return findChild(std::string(s)); }
+
+    MetadataNode findChild(std::string s) const
+    {
+        auto splitString = [](std::string& s) -> std::string
+        {
+            std::string val;
+            size_t pos = s.find(':');
+            if (pos == std::string::npos)
+            {
+                val = s;
+                s.clear();
+            }
+            else
+            {
+                val = s.substr(0, pos);
+                s = (pos == s.size() - 1) ? "" : s.substr(pos + 1);
+            }
+            return val;
+        };
+
+        if (s.empty())
+            return *this;
+        std::string lname = splitString(s);
+        auto nodes = children(lname);
+        for (auto ai = nodes.begin(); ai != nodes.end(); ++ai)
+        {
+            MetadataNode& n = *ai;
+            MetadataNode child = n.findChild(s);
+            if (!child.empty())
+                return child;
+        }
+        return MetadataNode();
+    }
+
+private:
+    MetadataNodeImplPtr m_impl;
+
+    MetadataNode(MetadataNodeImplPtr node) : m_impl(node)
+        {}
+
+    std::string escapeQuotes(const std::string& in) const
+    {
+        std::string out;
+        for (std::size_t i(0); i < in.size(); ++i)
+        {
+            if (in[i] == '"' && ((i && in[i - 1] != '\\') || !i))
+            {
+                out.push_back('\\');
+            }
+            out.push_back(in[i]);
+        }
+        return out;
+    }
+};
+
+inline bool operator == (const MetadataNode& m1, const MetadataNode& m2)
+{
+    return m1.m_impl == m2.m_impl;
+}
+
+inline bool operator != (const MetadataNode& m1, const MetadataNode& m2)
+{
+    return !(m1.m_impl == m2.m_impl);
+}
+
+
+class Metadata
+{
+    friend class BasePointTable;
+
+public:
+    Metadata() : m_root("root"), m_private("private")
+    {}
+
+    Metadata(const std::string& name) : m_name(name)
+    {}
+
+    MetadataNode getNode() const
+        { return m_root; }
+
+    inline static std::string inferType(const std::string& val);
+private:
+    MetadataNode m_root;
+    MetadataNode m_private;
+    std::string m_name;
+};
+typedef std::shared_ptr<Metadata> MetadataPtr;
+
+inline std::string Metadata::inferType(const std::string& val)
+{
+    size_t pos;
+
+    long l;
+    try
+    {
+        pos = 0;
+        l = std::stol(val, &pos);
+    }
+    catch (std::invalid_argument)
+    {}
+    if (pos == val.length())
+        return (l < 0 ? "nonNegativeInteger" : "integer");
+
+    try
+    {
+        pos = 0;
+        std::stod(val, &pos);
+    }
+    catch(std::invalid_argument)
+    {}
+
+    if (pos == val.length())
+        return "double";
+
+    BOX2D b2d;
+    std::istringstream iss1(val);
+    iss1 >> b2d;
+    if (iss1.good())
+        return "bounds";
+
+    BOX3D b3d;
+    std::istringstream iss2(val);
+    iss2 >> b3d;
+    if (iss2.good())
+        return "bounds";
+
+    if (val == "true" || val == "false")
+        return "boolean";
+
+    try
+    {
+        SpatialReference s(val);
+        return "spatialreference";
+    }
+    catch (pdal_error&)
+    {
+    }
+
+    boost::uuids::uuid uuid;
+    std::istringstream iss3(val);
+    iss3 >> uuid;
+    if (iss3.good())
+        return "uuid";
+
+    return "string";
+}
+
+} // namespace pdal
+
+
diff --git a/include/pdal/Options.hpp b/include/pdal/Options.hpp
new file mode 100644
index 0000000..8ca769a
--- /dev/null
+++ b/include/pdal/Options.hpp
@@ -0,0 +1,564 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Metadata.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <boost/property_tree/ptree.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/optional.hpp>
+
+#include <map>
+#include <memory>
+#include <vector>
+
+namespace pdal
+{
+
+class Options;
+class Option;
+
+namespace options
+{
+typedef std::multimap<std::string, Option> map_t;
+typedef std::shared_ptr<Options> OptionsPtr;
+}
+
+/*!
+    \verbatim embed:rst
+     An Option is just a record with three fields: name, value, and description.
+     The value is stored as a string, and we rely on boost::lexical_cast to do the
+     serialization magic for us.  This means that an object you insert as an option
+     value must satisfay the requirements for being lexically-castable:
+        - copy ctor
+        - operator=
+        - operator>>
+        - operator<<
+
+     Dumped as XML, it looks like this although of course that's not valid
+     XML, since it has no single root element.
+
+     ::
+
+         <?xml...>
+         <Name>myname</Name>
+         <Value>17</Value>
+         <Description>my descr</Description>
+
+     .. warning::
+
+            you should avoid using int8/uint8 types, as these tend to get confused
+            with chars.
+    \endverbatim
+*/
+
+class PDAL_DLL Option
+{
+public:
+
+    class not_found : public pdal_error
+    {
+    public:
+        not_found() : pdal_error("Option not found.")
+        {}
+        not_found(const std::string& msg) : pdal_error(msg)
+        {}
+    };
+
+/// @name Constructors
+
+    /// Empty constructor
+    Option() : m_options(0)
+    {}
+
+    /// Primary constructor
+    template <typename T>
+    Option(std::string const& name, const T& value,
+            std::string const& description = "") :
+        m_name(name), m_description(description)
+    {
+        try
+        {
+            setValue<T>(value);
+        }
+        catch (boost::bad_lexical_cast)
+        {
+        }
+    }
+
+    /// Construct from an existing boost::property_tree
+    Option(const boost::property_tree::ptree& tree);
+
+/// @name Equality
+    /// Equality
+    bool equals(const Option& rhs) const
+    {
+        return (m_name == rhs.getName() &&
+            m_value == rhs.getValue<std::string>() &&
+            m_description == rhs.getDescription() &&
+            m_options == rhs.m_options);
+    }
+
+    /// Equality operator
+    bool operator==(const Option& rhs) const
+    {
+        return equals(rhs);
+    }
+
+    /// Inequality operator
+    bool operator!=(const Option& rhs) const
+    {
+        return (!equals(rhs));
+    }
+
+/// @name Attribute access
+
+    /// Overwrites the name given in the constructor
+    /// @param name new value to use for the name of the Option
+    inline void setName(const std::string& name)
+    {
+        m_name = name;
+    }
+
+    /// @return the name for the Option instance
+    inline std::string const& getName() const
+    {
+        return m_name;
+    }
+
+    /// Overwrites the description given in the constructor
+    /// @param description new value to use for the description of the Option
+    inline void setDescription(const std::string& description)
+    {
+        m_description = description;
+    }
+
+    /// @return the description of the Option
+    inline std::string const& getDescription() const
+    {
+        return m_description;
+    }
+
+    /// @return the value of the Option as casted by boost::lexical_cast
+    template<typename T>
+    T getValue() const
+    {
+        T t;
+        getValue(t);
+        return t;
+    }
+
+    /// sets the value of the Option to T after boost::lexical_cast'ing
+    /// it to a std::string
+    template<typename T> void setValue(const T& value)
+    {
+        m_value = boost::lexical_cast<std::string>(value);
+    }
+
+/// @name pdal::Options access
+
+    /*! \return a boost::optional-wrapped const& of the Options set for this Option.
+    \verbatim embed:rst
+
+    .. note::
+
+            An Option may have an Options map of of
+            infinite depth (Option->Options->Option->Options...)
+    \endverbatim
+    */
+
+    boost::optional<Options const&> getOptions() const;
+
+    /// sets the Options set for this Option instance
+    /// @param op Options set to use
+    void setOptions(Options const& op);
+
+    bool empty() const;
+
+#if defined(PDAL_COMPILER_MSVC)
+    /// explicit specialization to insert a bool as "true" and "false" rather
+    /// than "0" or "1" (which is what lexical_cast would do)
+    template<> void setValue(const bool& value)
+    {
+        m_value = value ? "true" : "false";
+    }
+
+    /// explicit specialization to insert a string so no lexical_cast happens
+    template<> void setValue(const std::string& value)
+    {
+        m_value = value;
+    }
+#endif
+
+    void toMetadata(MetadataNode& parent) const;
+
+/// @name Private attributes
+private:
+    std::string m_name;
+    std::string m_value;
+    std::string m_description; // optional field
+    options::OptionsPtr m_options; // Sub-options.
+
+    template <typename T>
+    void getValue(T& t) const
+    {
+        t = boost::lexical_cast<T>(m_value);
+    }
+
+    void getValue(StringList& values) const
+    {
+        values = Utils::split2(m_value, ',');
+        for (std::string& s : values)
+            Utils::trim(s);
+    }
+
+    void getValue(bool& value) const
+    {
+        if (m_value == "true")
+            value = true;
+        else if (m_value == "false")
+            value = false;
+        else
+            value = boost::lexical_cast<bool>(m_value);
+    }
+
+    /// Avoid lexical cast.
+    void getValue(std::string& value) const
+        { value = m_value; }
+
+    void getValue(char& value)
+        { value = (char)std::stoi(m_value); }
+
+    void getValue(unsigned char& value) const
+        { value = (unsigned char)std::stoi(m_value); }
+
+    void getValue(signed char& value) const
+        { value = (signed char)std::stoi(m_value); }
+};
+
+
+/// @name Specializations
+#if !defined(PDAL_COMPILER_VC10)
+
+/// explicit specialization to insert a bool as "true" and "false" rather
+/// than "0" or "1" (which is what lexical_cast would do)
+template<> void Option::setValue(const bool& value);
+
+/// explicit specialization to insert a string so no lexical_cast happens
+template<> void Option::setValue(const std::string& value);
+#endif
+
+/*!
+    \verbatim embed:rst
+     An Options object is just a map of names to Option objects.
+
+     Dumped as XML, an Options object with two Option objects looks like this:
+
+     ::
+
+        <?xml...>
+        <Option>
+          <Name>myname</name>
+          <Value>17</value>
+          <Description>my descr</description>
+        </Option>
+        <Option>
+          <Name>myname2</name>
+          <Value>13</value>
+          <Description>my descr2</description>
+        </Option>
+    \endverbatim
+*/
+class PDAL_DLL Options
+{
+public:
+    Options()  {}
+
+    // copy ctor
+    Options(const Options&);
+
+    // assignment operator
+    Options& operator+=(const Options& rhs)
+    {
+        if (&rhs != this)
+        {
+            for (auto i = rhs.m_options.begin(); i != rhs.m_options.end(); ++i)
+            {
+                m_options.insert(std::pair<std::string, Option>(
+                    i->first, i->second));
+            }
+        }
+        return *this;
+    }
+
+    bool empty() const
+    {
+        return (m_options.size() == 0);
+    }
+
+    size_t size() const
+    {
+        return m_options.size();
+    }
+
+    Options const operator+(const Options& rhs)
+    {
+        return Options(*this) += rhs;
+    }
+
+    bool equals(const Options& rhs) const
+    {
+        return m_options == rhs.m_options;
+    }
+
+    bool operator==(const Options& rhs) const
+    {
+        return equals(rhs);
+    }
+
+    bool operator!=(const Options& rhs) const
+    {
+        return (!equals(rhs));
+    }
+
+    Options(const Option&);
+
+    Options(const boost::property_tree::ptree& tree);
+
+    // add an option
+    void add(const Option& option);
+
+    // if option name not present, just returns
+    void remove(const std::string& name);
+
+    MetadataNode toMetadata() const
+    {
+        MetadataNode cur("options");
+        std::vector<Option> optList = getOptions();
+        for (auto oi = optList.begin(); oi != optList.end(); ++oi)
+        {
+            Option& opt = *oi;
+            opt.toMetadata(cur);
+        }
+        return cur;
+    }
+
+    void toMetadata(MetadataNode& parent) const
+    {
+        MetadataNode cur = parent.add("options");
+        std::vector<Option> optList = getOptions();
+        for (auto oi = optList.begin(); oi != optList.end(); ++oi)
+        {
+            Option& opt = *oi;
+            opt.toMetadata(cur);
+        }
+    }
+
+    // add an option (shortcut version, bypass need for an Option object)
+    template<typename T> void add(const std::string& name, T value,
+        const std::string& description="")
+    {
+        Option opt(name, value, description);
+        add(opt);
+    }
+
+    // get an option, by name
+    // throws not_found if the option name is not valid
+    const Option& getOption(const std::string & name) const;
+    Option& getOptionByRef(const std::string& name);
+
+    template<typename T>
+    std::vector<T> getValues(const std::string& name) const
+    {
+        std::vector<T> vals;
+
+        auto ops = getOptions(name);
+        for (Option& op : ops)
+            vals.push_back(op.getValue<T>());
+        return vals;
+    }
+
+    StringList getValues(const std::string& name) const
+    {
+        StringList s;
+
+        auto ops = getOptions(name);
+        for (Option& op : ops)
+        {
+            StringList t = op.getValue<StringList>();
+            s.insert(s.end(), t.begin(), t.end());
+        }
+        return s;
+    }
+
+    // get value of an option, or throw not_found if option not present
+    template<typename T> T getValueOrThrow(std::string const& name) const
+    {
+        const Option& opt = getOption(name);  // might throw
+        return opt.getValue<T>();
+    }
+
+    // get value of an option, or use given default if option not present
+    template<typename T>
+    T getValueOrDefault(std::string const& name, T defaultValue) const
+    {
+        T result;
+
+        try
+        {
+            const Option& opt = getOption(name);  // might throw
+            result = opt.getValue<T>();
+        }
+        catch (Option::not_found)
+        {
+            result = defaultValue;
+        }
+        return result;
+    }
+
+    // get value of an option or use a value-initialized default
+    template<typename T>
+    T getValueOrDefault(std::string const& name) const
+    {
+        T out;
+
+#if defined(PDAL_COMPILER_MSVC)
+        T *t = new T();
+        out = getValueOrDefault(name, *t);
+        delete t;
+#else
+        if (std::is_fundamental<T>::value)
+        {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
+            T t{};
+            out = getValueOrDefault(name, t);
+#pragma GCC diagnostic pop
+        }
+        else
+        {
+            T t;
+            out = getValueOrDefault(name, t);
+        }
+#endif
+        return out;
+    }
+
+    // returns true iff the option name is valid
+    bool hasOption(std::string const& name) const;
+
+    // the empty options list
+    // BUG: this should be a member variable, not a function, but doing so
+    // causes vs2010 to fail to link
+    static const Options& none();
+
+    void dump() const;
+
+    std::vector<Option> getOptions(std::string const& name="") const;
+
+
+    template<typename T>
+    boost::optional<T> getMetadataOption(std::string const& name) const
+    {
+        // <Reader type="writers.las">
+        //     <Option name="metadata">
+        //         <Options>
+        //             <Option name="dataformatid">
+        //             3
+        //             </Option>
+        //             <Option name="filesourceid">
+        //             forward
+        //             </Option>
+        //             <Option name="year">
+        //             forward
+        //             </Option>
+        //             <Option name="day_of_year">
+        //             forward
+        //             </Option>
+        //             <Option name="vlr">
+        //             forward
+        //             <Options>
+        //                 <Option name="user_id">
+        //                 hobu
+        //                 </Option>
+        //                 <Option name="record">
+        //                 1234
+        //                 </Option>
+        //             </Options>
+        //             </Option>
+        //         </Options>
+        //     </Option>
+        // </Reader>
+
+        Option const* doMetadata(0);
+        try
+        {
+            doMetadata = &getOption("metadata");
+        }
+        catch (Option::not_found)
+        {
+            return boost::optional<T>();
+        }
+
+        boost::optional<Options const&> meta = doMetadata->getOptions();
+        if (meta)
+        {
+            try
+            {
+                meta->getOption(name);
+            }
+            catch (Option::not_found)
+            {
+                return boost::optional<T>();
+            }
+
+            return boost::optional<T>(meta->getOption(name).getValue<T>());
+        }
+        return boost::optional<T>();
+    }
+
+private:
+    options::map_t m_options;
+};
+
+
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Options&);
+
+
+} // namespace pdal
+
diff --git a/include/pdal/PDALUtils.hpp b/include/pdal/PDALUtils.hpp
new file mode 100644
index 0000000..e493e11
--- /dev/null
+++ b/include/pdal/PDALUtils.hpp
@@ -0,0 +1,322 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Metadata.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/algorithm/string.hpp>
+#include <pdal/Dimension.hpp>
+#include <pdal/pdal_defines.h>
+#include <pdal/pdal_export.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Options.hpp>
+
+namespace pdal
+{
+
+namespace Utils
+{
+
+inline void printError(const std::string& s)
+{
+    std::cerr << "PDAL: " << s << std::endl;
+    std::cerr << std::endl;
+}
+
+inline double toDouble(const Everything& e, Dimension::Type::Enum type)
+{
+    using namespace Dimension::Type;
+
+    double d = 0;
+    switch (type)
+    {
+    case Unsigned8:
+        d = e.u8;
+        break;
+    case Unsigned16:
+        d = e.u16;
+        break;
+    case Unsigned32:
+        d = e.u32;
+        break;
+    case Unsigned64:
+        d = e.u64;
+        break;
+    case Signed8:
+        d = e.s8;
+        break;
+    case Signed16:
+        d = e.s16;
+        break;
+    case Signed32:
+        d = e.s32;
+        break;
+    case Signed64:
+        d = e.s64;
+        break;
+    case Float:
+        d = e.f;
+        break;
+    case Double:
+        d = e.d;
+        break;
+    default:
+        break;
+    }
+    return d;
+}
+
+using namespace boost::property_tree;
+
+inline ptree toPTree(MetadataNode const& node)
+{
+    typedef ptree::path_type path;
+
+    ptree tree;
+    tree.put("name", node.name());
+    tree.put("description", node.description());
+    tree.put("type", node.type());
+    tree.put("value", node.value());
+
+    MetadataNodeList children = node.children();
+    for (auto n = children.begin(); n != children.end(); ++n)
+    {
+        ptree pnode = toPTree(*n);
+        if (node.kind() == MetadataType::Array)
+        {
+            boost::optional<ptree&> opt =
+                tree.get_child_optional(path(node.name(), '/'));
+            if (opt)
+                opt->push_back(std::make_pair("", pnode));
+            else
+            {
+                tree.push_back(ptree::value_type(node.name(), ptree()));
+                auto& p = tree.get_child(path(node.name(), '/'));
+                p.push_back(std::make_pair("", pnode));
+
+            }
+        }
+        else if (node.name().size())
+            tree.push_back(std::make_pair(node.name(), pnode));
+    }
+    return tree;
+}
+
+
+inline MetadataNode toMetadata(PointTableRef table)
+{
+    const PointLayoutPtr layout(table.layout());
+    MetadataNode root;
+
+    for (const auto& id : layout->dims())
+    {
+        MetadataNode dim("dimensions");
+        dim.add("name", layout->dimName(id));
+        Dimension::Type::Enum t = layout->dimType(id);
+        dim.add("type", Dimension::toName(Dimension::base(t)));
+        dim.add("size", layout->dimSize(id));
+        root.addList(dim);
+    }
+
+    return root;
+}
+
+
+inline MetadataNode toMetadata(const PointViewPtr view)
+{
+    MetadataNode node;
+
+    const Dimension::IdList& dims = view->dims();
+
+    for (PointId idx = 0; idx < view->size(); idx++)
+    {
+        MetadataNode pointnode = node.add(std::to_string(idx));
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            double v = view->getFieldAs<double>(*di, idx);
+            pointnode.add(Dimension::name(*di), v);
+        }
+    }
+
+    return node;
+}
+
+/// Outputs a string-based boost::property_tree::ptree representation
+/// of the BOX3D instance
+inline ptree toPTree(const BOX3D& bounds)
+{
+    ptree tree;
+    ptree x;
+    ptree y;
+    ptree z;
+
+    x.add("minimum", bounds.minx);
+    x.add("maximum", bounds.maxx);
+    tree.add_child("0", x);
+
+    y.add("minimum", bounds.miny);
+    y.add("maximum", bounds.maxy);
+    tree.add_child("1", y);
+
+    z.add("minimum", bounds.minz);
+    z.add("maximum", bounds.maxz);
+    tree.add_child("2", z);
+
+    return tree;
+}
+
+/// Outputs a string-based boost::property_tree::ptree representation
+/// of the BOX2D instance
+inline ptree toPTree(const BOX2D& bounds)
+{
+    ptree tree;
+    ptree x;
+    ptree y;
+    ptree z;
+
+    x.add("minimum", bounds.minx);
+    x.add("maximum", bounds.maxx);
+    tree.add_child("0", x);
+
+    y.add("minimum", bounds.miny);
+    y.add("maximum", bounds.maxy);
+    tree.add_child("1", y);
+
+    return tree;
+}
+
+ptree toPTree(const Options& options);
+inline ptree toPTree(const Option& option)
+{
+    ptree t;
+    t.put("Name", option.getName());
+    t.put("Value", option.getValue<std::string>());
+    if (option.getDescription() != "")
+    {
+        t.put("Description", option.getDescription());
+    }
+    boost::optional<Options const&> options = option.getOptions();
+
+    if (options != boost::none)
+    {
+        t.add_child("Options", toPTree(*options));
+    }
+    return t;
+}
+
+
+inline ptree toPTree(const Options& options)
+{
+    ptree tree;
+    std::vector<Option> opts = options.getOptions();
+    for (auto citer = opts.begin(); citer != opts.end(); ++citer)
+    {
+        const Option& option = *citer;
+        ptree subtree = toPTree(option);
+        tree.add_child("Option", subtree);
+    }
+    return tree;
+}
+
+
+
+inline ptree toPTree(const SpatialReference& ref)
+{
+    ptree srs;
+
+    srs.put("proj4", ref.getProj4());
+    srs.put("prettywkt", ref.getWKT(SpatialReference::eHorizontalOnly, true));
+    srs.put("wkt", ref.getWKT(SpatialReference::eHorizontalOnly, false));
+    srs.put("compoundwkt", ref.getWKT(SpatialReference::eCompoundOK, false));
+    srs.put("prettycompoundwkt", ref.getWKT(SpatialReference::eCompoundOK,
+       true));
+
+    return srs;
+}
+
+inline int openProgress(const std::string& filename)
+{
+#ifdef WIN32
+    return -1;
+#else
+    int fd = open(filename.c_str(), O_WRONLY | O_NONBLOCK);
+    if (fd == -1)
+    {
+        std::string out = "Can't open progress file '";
+        out += filename + "'.";
+        printError(out);
+    }
+    return fd;
+#endif
+}
+
+
+inline void closeProgress(int fd)
+{
+#ifdef WIN32
+#else
+    if (fd >= 0)
+        close(fd);
+#endif
+}
+
+
+inline void writeProgress(int fd, const std::string& type,
+    const std::string& text)
+{
+#ifdef WIN32
+#else
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wunused-result"
+    if (fd >= 0)
+    {
+        std::string out = type + ':' + text + '\n';
+
+        // This may error, but we don't care.
+        write(fd, out.c_str(), out.length());
+    }
+#pragma GCC diagnostic pop
+#endif
+}
+
+std::string PDAL_DLL toJSON(const MetadataNode& m);
+void PDAL_DLL toJSON(const MetadataNode& m, std::ostream& o);
+std::string PDAL_DLL toJSON(const Options& opts);
+void PDAL_DLL toJSON(const Options& opts, std::ostream& o);
+
+} // namespace Utils
+} // namespace pdal
+
diff --git a/include/pdal/PipelineManager.hpp b/include/pdal/PipelineManager.hpp
new file mode 100644
index 0000000..9d45e96
--- /dev/null
+++ b/include/pdal/PipelineManager.hpp
@@ -0,0 +1,106 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <vector>
+#include <string>
+
+namespace pdal
+{
+
+class Options;
+
+class PDAL_DLL PipelineManager
+{
+public:
+    PipelineManager() : m_tablePtr(new PointTable()), m_table(*m_tablePtr),
+            m_progressFd(-1)
+        {}
+    PipelineManager(int progressFd) : m_tablePtr(new PointTable()),
+            m_table(*m_tablePtr), m_progressFd(progressFd)
+        {}
+    PipelineManager(PointTableRef table) : m_table(table), m_progressFd(-1)
+        {}
+    PipelineManager(PointTableRef table, int progressFd) : m_table(table),
+            m_progressFd(progressFd)
+        {}
+
+    // Use these to manually add stages into the pipeline manager.
+    Stage& addReader(const std::string& type);
+    Stage& addFilter(const std::string& type);
+    Stage& addWriter(const std::string& type);
+
+    // returns true if the pipeline endpoint is a writer
+    bool isWriterPipeline() const
+        { return (bool)getStage(); }
+
+    // return the pipeline reader endpoint (or NULL, if not a reader pipeline)
+    Stage* getStage() const
+        { return m_stages.empty() ? NULL : m_stages.back().get(); }
+
+    void prepare() const;
+    point_count_t execute();
+
+    // Get the resulting point views.
+    const PointViewSet& views() const
+        { return m_viewSet; }
+
+    // Get the point table data.
+    PointTableRef pointTable() const
+        { return m_table; }
+
+    MetadataNode getMetadata() const;
+
+private:
+    StageFactory m_factory;
+    std::unique_ptr<PointTable> m_tablePtr;
+    PointTableRef m_table;
+
+    PointViewSet m_viewSet;
+
+    typedef std::vector<std::unique_ptr<Stage> > StagePtrList;
+    StagePtrList m_stages;
+    int m_progressFd;
+
+    PipelineManager& operator=(const PipelineManager&); // not implemented
+    PipelineManager(const PipelineManager&); // not implemented
+};
+
+
+} // namespace pdal
+
diff --git a/include/pdal/PipelineReader.hpp b/include/pdal/PipelineReader.hpp
new file mode 100644
index 0000000..5cbfe90
--- /dev/null
+++ b/include/pdal/PipelineReader.hpp
@@ -0,0 +1,94 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <vector>
+#include <string>
+
+
+namespace pdal
+{
+
+class Options;
+class PipelineManager;
+
+class PDAL_DLL PipelineReader
+{
+private:
+    class StageParserContext;
+
+public:
+    PipelineReader(PipelineManager&, bool debug=false,
+        uint32_t verbose = 0);
+
+    // Use this to fill in a pipeline manager with an XML file that
+    // contains a <Writer> as the last pipeline stage.
+    //
+    // returns true iff the xml file is a writer pipeline (otherwise it is
+    // assumed to be a reader pipeline)
+    bool readPipeline(const std::string& filename);
+    bool readPipeline(std::istream& input);
+
+private:
+    typedef std::map<std::string, std::string> map_t;
+
+    bool parseElement_Pipeline(const boost::property_tree::ptree&);
+    Stage *parseElement_anystage(const std::string& name,
+        const boost::property_tree::ptree& subtree);
+    Stage *parseElement_Reader(const boost::property_tree::ptree& tree);
+    Stage *parseElement_Filter(const boost::property_tree::ptree& tree);
+    Stage *parseElement_Writer(const boost::property_tree::ptree& tree);
+    Option parseElement_Option(const boost::property_tree::ptree& tree);
+    void collect_attributes(map_t& attrs,
+        const boost::property_tree::ptree& tree);
+    void parse_attributes(map_t& attrs,
+        const boost::property_tree::ptree& tree);
+
+private:
+    PipelineManager& m_manager;
+    bool m_isDebug;
+    uint32_t m_verboseLevel;
+    Options m_baseOptions;
+    std::string m_inputXmlFile;
+
+    PipelineReader& operator=(const PipelineReader&); // not implemented
+    PipelineReader(const PipelineReader&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/PipelineWriter.hpp b/include/pdal/PipelineWriter.hpp
new file mode 100644
index 0000000..9ca8c44
--- /dev/null
+++ b/include/pdal/PipelineWriter.hpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/Metadata.hpp>
+
+#include <string>
+
+#include <boost/property_tree/ptree.hpp>
+
+namespace pdal
+{
+
+class PipelineManager;
+
+class PDAL_DLL PipelineWriter
+{
+public:
+    PipelineWriter(const PipelineManager& manager) : m_manager(manager)
+        {}
+
+    void writePipeline(const std::string& filename) const;
+    void writePipeline(std::ostream& strm) const;
+
+    static void write_option_ptree(boost::property_tree::ptree& tree,
+        const Options& opts);
+
+    static void writeMetadata(boost::property_tree::ptree& tree,
+        const MetadataNode& input);
+    static void writeMetadata(boost::property_tree::ptree& tree,
+        const MetadataNodeList& input);
+
+    static boost::property_tree::ptree getMetadataEntry(
+        const MetadataNode& input);
+private:
+    const PipelineManager& m_manager;
+
+    PipelineWriter& operator=(const PipelineWriter&); // not implemented
+    PipelineWriter(const PipelineWriter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/PluginManager.hpp b/include/pdal/PluginManager.hpp
new file mode 100644
index 0000000..7a736e8
--- /dev/null
+++ b/include/pdal/PluginManager.hpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// The PluginManager was modeled very closely after the work of Gigi Sayfan in
+// the Dr. Dobbs article:
+// http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/206503957
+// The original work was released under the Apache License v2.
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/plugin.hpp>
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace pdal
+{
+
+class DynamicLibrary;
+
+/*
+ * I think PluginManager can eventually be a private header, only accessible
+ * through the factories, but we'll leave it as public for now.
+ */
+class PDAL_DLL PluginManager
+{
+    typedef std::shared_ptr<DynamicLibrary> DynLibPtr;
+    typedef std::map<std::string, std::shared_ptr<DynamicLibrary>>
+        DynamicLibraryMap;
+    typedef std::vector<PF_ExitFunc> ExitFuncVec;
+    typedef std::vector<PF_RegisterParams> RegistrationVec;
+
+public:
+    typedef std::map<std::string, PF_RegisterParams> RegistrationMap;
+
+    static PluginManager & getInstance();
+
+    // Returns true if initialization was successful.
+    static bool initializePlugin(PF_InitFunc initFunc);
+
+    void loadAll(PF_PluginType type);
+    void loadAll(const std::string & pluginDirectory, PF_PluginType type);
+    bool loadPlugin(const std::string & pluginFilename);
+
+    void * createObject(const std::string & objectType);
+
+    static bool registerObject(const std::string& objectType,
+        const PF_RegisterParams* params);
+    const RegistrationMap& getRegistrationMap();
+
+private:
+    PluginManager();
+    ~PluginManager();
+
+    // These functions return true if successful.
+    bool shutdown();
+    bool guessLoadByPath(const std::string & driverName);
+    bool loadByPath(const std::string & path, PF_PluginType type);
+
+    DynamicLibrary *loadLibrary(const std::string& path,
+        std::string& errorString);
+
+    PF_PluginAPI_Version m_version;
+    DynamicLibraryMap m_dynamicLibraryMap;
+    ExitFuncVec m_exitFuncVec;
+    RegistrationMap m_tempExactMatchMap;
+    RegistrationMap m_exactMatchMap;
+
+    // Disable copy/assignment.
+    PluginManager(const PluginManager&);
+    PluginManager& operator=(const PluginManager&);
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/PointLayout.hpp b/include/pdal/PointLayout.hpp
new file mode 100644
index 0000000..b80df48
--- /dev/null
+++ b/include/pdal/PointLayout.hpp
@@ -0,0 +1,117 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <cstddef>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "pdal/Dimension.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL PointLayout
+{
+public:
+    PointLayout();
+    virtual ~PointLayout() {}
+
+    void finalize();
+
+    void registerDims(std::vector<Dimension::Id::Enum> ids);
+    void registerDims(Dimension::Id::Enum *id);
+    void registerDim(Dimension::Id::Enum id);
+
+    // Register the dimension with the requested type if it hasn't already
+    // been registered with a "larger" type.  If the type of the dimension
+    // is already larger, this does nothing.
+    void registerDim(Dimension::Id::Enum id, Dimension::Type::Enum type);
+
+    // The type and size are REQUESTS, not absolutes.  If someone else
+    // has already registered with the same name, you get the existing
+    // dimension size/type.
+    Dimension::Id::Enum assignDim(
+            const std::string& name,
+            Dimension::Type::Enum type);
+
+    Dimension::Id::Enum registerOrAssignDim(
+            const std::string name,
+            Dimension::Type::Enum type);
+
+    DimTypeList dimTypes() const;
+    DimType findDimType(const std::string& name) const;
+    Dimension::Id::Enum findDim(const std::string& name) const;
+    Dimension::Id::Enum findProprietaryDim(const std::string& name) const;
+    std::string dimName(Dimension::Id::Enum id) const;
+
+    // @return whether or not the PointLayout contains a given id
+    bool hasDim(Dimension::Id::Enum id) const;
+
+    // @return reference to vector of currently used dimensions
+    const Dimension::IdList& dims() const;
+
+    // @return the current type for a given id
+    Dimension::Type::Enum dimType(Dimension::Id::Enum id) const;
+
+    // @return the current size in bytes of the dimension
+    //         with the given id.
+    size_t dimSize(Dimension::Id::Enum id) const;
+    size_t dimOffset(Dimension::Id::Enum id) const;
+    size_t pointSize() const;
+
+    const Dimension::Detail *dimDetail(Dimension::Id::Enum id) const;
+
+private:
+    virtual bool update(Dimension::Detail dd, const std::string& name);
+
+    Dimension::Type::Enum resolveType(
+            Dimension::Type::Enum t1,
+            Dimension::Type::Enum t2);
+
+protected:
+    std::vector<Dimension::Detail> m_detail;
+    Dimension::IdList m_used;
+    std::map<std::string, Dimension::Id::Enum> m_propIds;
+    int m_nextFree;
+    std::size_t m_pointSize;
+    bool m_finalized;
+};
+
+typedef PointLayout* PointLayoutPtr;
+
+} // namespace pdal
+
diff --git a/include/pdal/PointTable.hpp b/include/pdal/PointTable.hpp
new file mode 100644
index 0000000..41ad128
--- /dev/null
+++ b/include/pdal/PointTable.hpp
@@ -0,0 +1,123 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <map>
+#include <memory>
+#include <vector>
+
+#include "pdal/Dimension.hpp"
+#include "pdal/PointLayout.hpp"
+#include "pdal/Metadata.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL BasePointTable
+{
+    friend class PointView;
+
+public:
+    BasePointTable() : m_metadata(new Metadata())
+        {}
+    virtual ~BasePointTable()
+        {}
+
+public:
+    // Layout operations.
+    virtual PointLayoutPtr layout() const = 0;
+
+    // Metadata operations.
+    MetadataNode metadata()
+        { return m_metadata->getNode(); }
+    SpatialReference spatialRef() const;
+    void setSpatialRef(const SpatialReference& sref);
+    MetadataNode privateMetadata(const std::string& name);
+
+private:
+    // Point data operations.
+    virtual PointId addPoint() = 0;
+    virtual char *getPoint(PointId idx) = 0;
+    virtual void setField(const Dimension::Detail *d, PointId idx,
+        const void *value) = 0;
+    virtual void getField(const Dimension::Detail *d, PointId idx,
+        void *value) = 0;
+
+protected:
+    MetadataPtr m_metadata;
+};
+typedef BasePointTable& PointTableRef;
+typedef BasePointTable const & ConstPointTableRef;
+
+
+// This provides a context for processing a set of points and allows the library
+// to be used to process multiple point sets simultaneously.
+class PDAL_DLL PointTable : public BasePointTable
+{
+private:
+    // Point storage.
+    std::vector<char *> m_blocks;
+    point_count_t m_numPts;
+    std::unique_ptr<PointLayout> m_layout;
+
+public:
+    PointTable() : m_numPts(0), m_layout(new PointLayout())
+        {}
+    virtual ~PointTable();
+
+    virtual PointLayoutPtr layout() const
+        { return m_layout.get(); }
+
+private:
+    // Point data operations.
+    virtual PointId addPoint();
+    virtual char *getPoint(PointId idx);
+    virtual void setField(const Dimension::Detail *d, PointId idx,
+        const void *value);
+    virtual void getField(const Dimension::Detail *d, PointId idx,
+        void *value);
+
+    // The number of points in each memory block.
+    static const point_count_t m_blockPtCnt = 65536;
+
+    char *getDimension(const Dimension::Detail *d, PointId idx)
+        { return getPoint(idx) + d->offset(); }
+
+    std::size_t pointsToBytes(point_count_t numPts)
+        { return m_layout->pointSize() * numPts; }
+};
+
+} //namespace
+
diff --git a/include/pdal/PointView.hpp b/include/pdal/PointView.hpp
new file mode 100644
index 0000000..d4260e0
--- /dev/null
+++ b/include/pdal/PointView.hpp
@@ -0,0 +1,570 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/util/Bounds.hpp>
+#include <pdal/pdal_internal.hpp>
+#include <pdal/PointLayout.hpp>
+#include <pdal/PointTable.hpp>
+
+#include <memory>
+#include <queue>
+#include <set>
+#include <vector>
+#include <deque>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4244)  // conversion from 'type1' to 'type2', possible loss of data
+#endif
+
+namespace pdal
+{
+namespace plang
+{
+    class BufferedInvocation;
+}
+
+struct PointViewLess;
+class PointView;
+class PointViewIter;
+
+typedef std::shared_ptr<PointView> PointViewPtr;
+typedef std::set<PointViewPtr, PointViewLess> PointViewSet;
+
+class PDAL_DLL PointView
+{
+    friend class plang::BufferedInvocation;
+    friend class PointRef;
+    friend struct PointViewLess;
+public:
+    PointView(PointTableRef pointTable) : m_pointTable(pointTable),
+        m_size(0), m_id(0)
+    {
+        static int lastId = 0;
+        m_id = ++lastId;
+    }
+
+    virtual ~PointView()
+    {}
+
+    PointViewIter begin();
+    PointViewIter end();
+
+    int id() const
+        { return m_id; }
+
+    point_count_t size() const
+        { return m_size; }
+
+    bool empty() const
+        { return m_size == 0; }
+
+    inline void appendPoint(const PointView& buffer, PointId id);
+    void append(const PointView& buf)
+    {
+        // We use size() instead of the index end because temp points
+        // might have been placed at the end of the buffer.
+        auto thisEnd = m_index.begin() + size();
+        auto bufEnd = buf.m_index.begin() + buf.size();
+        m_index.insert(thisEnd, buf.m_index.begin(), bufEnd);
+        m_size += buf.size();
+        clearTemps();
+    }
+
+    /// Return a new point view with the same point table as this
+    /// point buffer.
+    PointViewPtr makeNew() const
+        { return PointViewPtr(new PointView(m_pointTable)); }
+
+    template<class T>
+    T getFieldAs(Dimension::Id::Enum dim, PointId pointIndex) const;
+
+    inline void getField(char *pos, Dimension::Id::Enum d,
+        Dimension::Type::Enum type, PointId id) const;
+
+    template<typename T>
+    void setField(Dimension::Id::Enum dim, PointId idx, T val);
+
+    inline void setField(Dimension::Id::Enum dim, Dimension::Type::Enum type,
+        PointId idx, const void *val);
+
+    template <typename T>
+    bool compare(Dimension::Id::Enum dim, PointId id1, PointId id2)
+    {
+        return (getFieldInternal<T>(dim, id1) < getFieldInternal<T>(dim, id2));
+    }
+
+    bool compare(Dimension::Id::Enum dim, PointId id1, PointId id2)
+    {
+        const Dimension::Detail *dd = m_pointTable.layout()->dimDetail(dim);
+
+        switch (dd->type())
+        {
+            case Dimension::Type::Float:
+                return compare<float>(dim, id1, id2);
+                break;
+            case Dimension::Type::Double:
+                return compare<double>(dim, id1, id2);
+                break;
+            case Dimension::Type::Signed8:
+                return compare<int8_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Signed16:
+                return compare<int16_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Signed32:
+                return compare<int32_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Signed64:
+                return compare<int64_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Unsigned8:
+                return compare<uint8_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Unsigned16:
+                return compare<uint16_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Unsigned32:
+                return compare<uint32_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::Unsigned64:
+                return compare<uint64_t>(dim, id1, id2);
+                break;
+            case Dimension::Type::None:
+            default:
+                return false;
+                break;
+        }
+    }
+
+    void getRawField(Dimension::Id::Enum dim, PointId idx, void *buf) const
+    {
+        getFieldInternal(dim, idx, buf);
+    }
+
+    /*! @return a cumulated bounds of all points in the PointView.
+        \verbatim embed:rst
+        .. note::
+
+            This method requires that an `X`, `Y`, and `Z` dimension be
+            available, and that it can be casted into a *double* data
+            type using the :cpp:func:`pdal::Dimension::applyScaling`
+            method. Otherwise, an exception will be thrown.
+        \endverbatim
+    */
+    void calculateBounds(BOX2D& box) const;
+    static void calculateBounds(const PointViewSet&, BOX2D& box);
+    void calculateBounds(BOX3D& box) const;
+    static void calculateBounds(const PointViewSet&, BOX3D& box);
+
+    void dump(std::ostream& ostr) const;
+    bool hasDim(Dimension::Id::Enum id) const
+        { return m_pointTable.layout()->hasDim(id); }
+    std::string dimName(Dimension::Id::Enum id) const
+        { return m_pointTable.layout()->dimName(id); }
+    Dimension::IdList dims() const
+        { return m_pointTable.layout()->dims(); }
+    std::size_t pointSize() const
+        { return m_pointTable.layout()->pointSize(); }
+    std::size_t dimSize(Dimension::Id::Enum id) const
+        { return m_pointTable.layout()->dimSize(id); }
+    Dimension::Type::Enum dimType(Dimension::Id::Enum id) const
+     { return m_pointTable.layout()->dimType(id);}
+    DimTypeList dimTypes() const
+        { return m_pointTable.layout()->dimTypes(); }
+
+    PointLayoutPtr layout() const { return m_pointTable.layout(); }
+
+    /// Fill a buffer with point data specified by the dimension list.
+    /// \param[in] dims  List of dimensions/types to retrieve.
+    /// \param[in] idx   Index of point to get.
+    /// \param[in] buf   Pointer to buffer to fill.
+    void getPackedPoint(const DimTypeList& dims, PointId idx, char *buf) const
+    {
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            getField(buf, di->m_id, di->m_type, idx);
+            buf += Dimension::size(di->m_type);
+        }
+    }
+
+    /// Load the point buffer from memory whose arrangement is specified
+    /// by the dimension list.
+    /// \param[in] dims  Dimension/types of data in packed order
+    /// \param[in] idx   Index of point to write.
+    /// \param[in] buf   Packed data buffer.
+    void setPackedPoint(const DimTypeList& dims, PointId idx, const char *buf)
+    {
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            setField(di->m_id, di->m_type, idx, (const void *)buf);
+            buf += Dimension::size(di->m_type);
+        }
+    }
+
+
+    /// Provides access to the memory storing the point data.  Though this
+    /// function is public, other access methods are safer and preferred.
+    char *getPoint(PointId id)
+        { return m_pointTable.getPoint(m_index[id]); }
+
+    // The standard idiom is swapping with a stack-created empty queue, but
+    // that invokes the ctor and probably allocates.  We've probably only got
+    // one or two things in our queue, so just pop until we're empty.
+    void clearTemps()
+    {
+        while (!m_temps.empty())
+            m_temps.pop();
+    }
+
+protected:
+    PointTableRef m_pointTable;
+    std::deque<PointId> m_index;
+    // The index might be larger than the size to support temporary point
+    // references.
+    point_count_t m_size;
+    int m_id;
+    std::queue<PointId> m_temps;
+
+private:
+    template<typename T_IN, typename T_OUT>
+    bool convertAndSet(Dimension::Id::Enum dim, PointId idx, T_IN in);
+
+    inline void setFieldInternal(Dimension::Id::Enum dim, PointId pointIndex,
+        const void *value);
+    template<class T>
+    T getFieldInternal(Dimension::Id::Enum dim, PointId pointIndex) const;
+    inline void getFieldInternal(Dimension::Id::Enum dim, PointId pointIndex,
+        void *value) const;
+    inline PointId getTemp(PointId id);
+    void freeTemp(PointId id)
+        { m_temps.push(id); }
+
+    // Awfulness to avoid exceptions in numeric cast.
+    static bool m_ok;
+};
+
+struct PointViewLess
+{
+    bool operator () (const PointViewPtr& p1, const PointViewPtr& p2) const
+        { return p1->m_id < p2->m_id; }
+};
+
+template <class T>
+T PointView::getFieldInternal(Dimension::Id::Enum dim, PointId id) const
+{
+    T t;
+
+    getFieldInternal(dim, id, &t);
+    return t;
+}
+
+inline void PointView::getField(char *pos, Dimension::Id::Enum d,
+    Dimension::Type::Enum type, PointId id) const
+{
+    Everything e;
+
+    switch (type)
+    {
+    case Dimension::Type::Float:
+        e.f = getFieldAs<float>(d, id);
+        break;
+    case Dimension::Type::Double:
+        e.d = getFieldAs<double>(d, id);
+        break;
+    case Dimension::Type::Signed8:
+        e.s8 = getFieldAs<int8_t>(d, id);
+        break;
+    case Dimension::Type::Signed16:
+        e.s16 = getFieldAs<int16_t>(d, id);
+        break;
+    case Dimension::Type::Signed32:
+        e.s32 = getFieldAs<int32_t>(d, id);
+        break;
+    case Dimension::Type::Signed64:
+        e.s64 = getFieldAs<int64_t>(d, id);
+        break;
+    case Dimension::Type::Unsigned8:
+        e.u8 = getFieldAs<uint8_t>(d, id);
+        break;
+    case Dimension::Type::Unsigned16:
+        e.u16 = getFieldAs<uint16_t>(d, id);
+        break;
+    case Dimension::Type::Unsigned32:
+        e.u32 = getFieldAs<uint32_t>(d, id);
+        break;
+    case Dimension::Type::Unsigned64:
+        e.u64 = getFieldAs<uint64_t>(d, id);
+        break;
+    case Dimension::Type::None:
+        break;
+    }
+    memcpy(pos, &e, Dimension::size(type));
+}
+
+inline void PointView::setField(Dimension::Id::Enum dim,
+    Dimension::Type::Enum type, PointId idx, const void *val)
+{
+    Everything e;
+
+    memcpy(&e, val, Dimension::size(type));
+    switch (type)
+    {
+        case Dimension::Type::Float:
+            setField(dim, idx, e.f);
+            break;
+        case Dimension::Type::Double:
+            setField(dim, idx, e.d);
+            break;
+        case Dimension::Type::Signed8:
+            setField(dim, idx, e.s8);
+            break;
+        case Dimension::Type::Signed16:
+            setField(dim, idx, e.s16);
+            break;
+        case Dimension::Type::Signed32:
+            setField(dim, idx, e.s32);
+            break;
+        case Dimension::Type::Signed64:
+            setField(dim, idx, e.s64);
+            break;
+        case Dimension::Type::Unsigned8:
+            setField(dim, idx, e.u8);
+            break;
+        case Dimension::Type::Unsigned16:
+            setField(dim, idx, e.u16);
+            break;
+        case Dimension::Type::Unsigned32:
+            setField(dim, idx, e.u32);
+            break;
+        case Dimension::Type::Unsigned64:
+            setField(dim, idx, e.u64);
+            break;
+        case Dimension::Type::None:
+            break;
+    }
+}
+
+template <class T>
+inline T PointView::getFieldAs(Dimension::Id::Enum dim,
+    PointId pointIndex) const
+{
+    T retval;
+    const Dimension::Detail *dd = m_pointTable.layout()->dimDetail(dim);
+    double val;
+
+    switch (dd->type())
+    {
+    case Dimension::Type::Float:
+        val = getFieldInternal<float>(dim, pointIndex);
+        break;
+    case Dimension::Type::Double:
+        val = getFieldInternal<double>(dim, pointIndex);
+        break;
+    case Dimension::Type::Signed8:
+        val = getFieldInternal<int8_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Signed16:
+        val = getFieldInternal<int16_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Signed32:
+        val = getFieldInternal<int32_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Signed64:
+        val = static_cast<double>(getFieldInternal<int64_t>(dim, pointIndex));
+        break;
+    case Dimension::Type::Unsigned8:
+        val = getFieldInternal<uint8_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Unsigned16:
+        val = getFieldInternal<uint16_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Unsigned32:
+        val = getFieldInternal<uint32_t>(dim, pointIndex);
+        break;
+    case Dimension::Type::Unsigned64:
+        val = static_cast<double>(getFieldInternal<uint64_t>(dim, pointIndex));
+        break;
+    case Dimension::Type::None:
+    default:
+        val = 0;
+        break;
+    }
+
+    if (!Utils::numericCast(val, retval))
+    {
+        std::ostringstream oss;
+        oss << "Unable to fetch data and convert as requested: ";
+        oss << Dimension::name(dim) << ":" <<
+            Dimension::interpretationName(dd->type()) <<
+            "(" << (double)val << ") -> " << Utils::typeidName<T>();
+        throw pdal_error(oss.str());
+    }
+
+    return retval;
+}
+
+
+template<typename T_IN, typename T_OUT>
+bool PointView::convertAndSet(Dimension::Id::Enum dim, PointId idx, T_IN in)
+{
+    T_OUT out;
+
+    bool success = Utils::numericCast(in, out);
+    if (success)
+        setFieldInternal(dim, idx, &out);
+    return success;
+}
+
+
+template<typename T>
+void PointView::setField(Dimension::Id::Enum dim, PointId idx, T val)
+{
+    const Dimension::Detail *dd = m_pointTable.layout()->dimDetail(dim);
+
+    bool ok = true;
+    switch (dd->type())
+    {
+    case Dimension::Type::Float:
+        ok = convertAndSet<T, float>(dim, idx, val);
+        break;
+    case Dimension::Type::Double:
+        ok = convertAndSet<T, double>(dim, idx, val);
+        break;
+    case Dimension::Type::Signed8:
+        setFieldInternal(dim, idx, &val);
+        break;
+    case Dimension::Type::Signed16:
+        ok = convertAndSet<T, int16_t>(dim, idx, val);
+        break;
+    case Dimension::Type::Signed32:
+        ok = convertAndSet<T, int32_t>(dim, idx, val);
+        break;
+    case Dimension::Type::Signed64:
+        ok = convertAndSet<T, int64_t>(dim, idx, val);
+        break;
+    case Dimension::Type::Unsigned8:
+        setFieldInternal(dim, idx, &val);
+        break;
+    case Dimension::Type::Unsigned16:
+        ok = convertAndSet<T, uint16_t>(dim, idx, val);
+        break;
+    case Dimension::Type::Unsigned32:
+        ok = convertAndSet<T, uint32_t>(dim, idx, val);
+        break;
+    case Dimension::Type::Unsigned64:
+        ok = convertAndSet<T, uint64_t>(dim, idx, val);
+        break;
+    case Dimension::Type::None:
+        val = 0;
+        break;
+    }
+    if (!ok)
+    {
+        std::ostringstream oss;
+        oss << "Unable to set data and convert as requested: ";
+        oss << Dimension::name(dim) << ":" << Utils::typeidName<T>() <<
+            "(" << (double)val << ") -> " <<
+            Dimension::interpretationName(dd->type());
+        throw pdal_error(oss.str());
+    }
+}
+
+
+inline void PointView::getFieldInternal(Dimension::Id::Enum dim,
+    PointId id, void *buf) const
+{
+    m_pointTable.getField(m_pointTable.layout()->dimDetail(dim),
+        m_index[id], buf);
+}
+
+
+inline void PointView::setFieldInternal(Dimension::Id::Enum dim,
+    PointId id, const void *value)
+{
+    PointId rawId = 0;
+    if (id == size())
+    {
+        rawId = m_pointTable.addPoint();
+        m_index.push_back(rawId);
+        m_size++;
+        assert(m_temps.empty());
+    }
+    else if (id > size())
+    {
+        std::cerr << "Point index must increment.\n";
+        //error - throw?
+        return;
+    }
+    else
+    {
+        rawId = m_index[id];
+    }
+    m_pointTable.setField(m_pointTable.layout()->dimDetail(dim),
+        rawId, value);
+}
+
+
+inline void PointView::appendPoint(const PointView& buffer, PointId id)
+{
+    // Invalid 'id' is a programmer error.
+    PointId rawId = buffer.m_index[id];
+    m_index.push_back(rawId);
+    m_size++;
+    assert(m_temps.empty());
+}
+
+
+// Make a temporary copy of a point by adding an entry to the index.
+inline PointId PointView::getTemp(PointId id)
+{
+    PointId newid;
+    if (m_temps.size())
+    {
+        newid = m_temps.front();
+        m_temps.pop();
+        m_index[newid] = m_index[id];
+    }
+    else
+    {
+        newid = (PointId)m_index.size();
+        m_index.push_back(m_index[id]);
+    }
+    return newid;
+}
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const PointView&);
+
+} // namespace pdal
diff --git a/include/pdal/PointViewIter.hpp b/include/pdal/PointViewIter.hpp
new file mode 100644
index 0000000..9974fed
--- /dev/null
+++ b/include/pdal/PointViewIter.hpp
@@ -0,0 +1,171 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <iterator>
+
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+
+class PointRef
+{
+private:
+    PointView *m_buf;
+    PointId m_id;
+    bool m_tmp;
+
+public:
+    PointRef() : m_buf(NULL), m_id(0), m_tmp(false)
+    {}
+    PointRef(const PointRef& r) : m_buf(r.m_buf)
+    {
+        m_id = m_buf->getTemp(r.m_id);
+        m_tmp = true;
+    }
+    // This is the ctor used to make a PointRef from an iterator.
+    PointRef(PointView *buf, PointId id) : m_buf(buf), m_id(id), m_tmp(false)
+    {}
+
+    ~PointRef()
+    {
+        if (m_tmp)
+            m_buf->freeTemp(m_id);
+    }
+
+    PointRef& operator=(const PointRef& r)
+    {
+        assert(m_buf == NULL || r.m_buf == m_buf);
+        if (!m_buf)
+        {
+            m_buf = r.m_buf;
+            m_id = m_buf->getTemp(r.m_id);
+            m_tmp = true;
+        }
+        else
+            m_buf->m_index[m_id] = r.m_buf->m_index[r.m_id];
+        return *this;
+    }
+
+    bool compare(Dimension::Id::Enum dim, const PointRef& p) const
+        { return m_buf->compare(dim, m_id, p.m_id); }
+
+    void swap(PointRef& p)
+    {
+        PointId id = m_buf->m_index[m_id];
+        m_buf->m_index[m_id] = p.m_buf->m_index[p.m_id];
+        p.m_buf->m_index[p.m_id] = id;
+    }
+};
+
+inline void swap(PointRef && p1, PointRef && p2)
+{
+    p1.swap(p2);
+}
+
+class PointViewIter :
+    public std::iterator<std::random_access_iterator_tag, PointRef,
+        point_count_t>
+{
+protected:
+    PointView *m_buf;
+    PointId m_id;
+
+public:
+    typedef std::random_access_iterator_tag iterator_category;
+    typedef std::iterator<iterator_category, PointRef>::value_type
+            value_type;
+    typedef std::iterator<iterator_category, PointRef>::difference_type
+            difference_type;
+    typedef PointRef reference;
+    typedef void * pointer;
+
+
+    PointViewIter(PointView *buf, PointId id) : m_buf(buf), m_id(id)
+    {}
+
+    PointViewIter& operator++()
+        { ++m_id; return *this; }
+    PointViewIter operator++(int)
+        { return PointViewIter(m_buf, m_id++); }
+    PointViewIter& operator--()
+        { --m_id; return *this; }
+    PointViewIter operator--(int)
+        { return PointViewIter(m_buf, m_id--); }
+
+    PointViewIter operator+(const difference_type& n) const
+        { return PointViewIter(m_buf, m_id + n); }
+    PointViewIter operator+=(const difference_type& n)
+        { m_id += n; return *this; }
+    PointViewIter operator-(const difference_type& n) const
+        { return PointViewIter(m_buf, m_id - n); }
+    PointViewIter operator-=(const difference_type& n)
+        { m_id -= n; return *this; }
+    difference_type operator-(const PointViewIter& i)
+        { return m_id - i.m_id; }
+
+    bool operator==(const PointViewIter& i)
+        { return m_id == i.m_id; }
+    bool operator!=(const PointViewIter& i)
+        { return m_id != i.m_id; }
+    bool operator>=(const PointViewIter& i)
+        { return m_id <= i.m_id; }
+    bool operator<(const PointViewIter& i)
+        { return m_id < i.m_id; }
+    bool operator>(const PointViewIter& i)
+        { return m_id > i.m_id; }
+
+    PointRef operator*() const
+        { return PointRef(m_buf, m_id); }
+    pointer operator->() const
+        { return NULL; }
+    PointRef operator[](const difference_type& /*n*/) const
+        { return PointRef(m_buf, m_id); }
+};
+
+} // namespace pdal
+
+/**
+namespace std
+{
+template<>
+inline void iter_swap(pdal::PointViewIter a, pdal::PointViewIter b)
+{
+    swap(*a, *b);
+}
+}
+**/
+
diff --git a/include/pdal/QuadIndex.hpp b/include/pdal/QuadIndex.hpp
new file mode 100644
index 0000000..a5fbda2
--- /dev/null
+++ b/include/pdal/QuadIndex.hpp
@@ -0,0 +1,182 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <vector>
+#include <memory>
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/pdal_types.hpp>
+#include <pdal/util/Bounds.hpp>
+
+namespace pdal
+{
+
+class PointView;
+
+struct Point
+{
+    Point(double x, double y) : x(x), y(y) { }
+    Point(const Point& other) : x(other.x), y(other.y) { }
+
+    // Calculates the distance-squared to another point.
+    double sqDist(const Point& other) const
+    {
+        return (x - other.x) * (x - other.x) + (y - other.y) * (y - other.y);
+    }
+
+    const double x;
+    const double y;
+
+    Point& operator=(const Point&); // not implemented
+};
+
+struct QuadPointRef
+{
+    QuadPointRef(const Point& point, std::size_t pbIndex)
+        : point(point)
+        , pbIndex(pbIndex)
+    { }
+
+    const Point point;
+    const std::size_t pbIndex;
+
+    QuadPointRef& operator=(const QuadPointRef&); // not implemented
+    QuadPointRef(const QuadPointRef&); // not implemented
+};
+
+class PDAL_DLL QuadIndex
+{
+public:
+    QuadIndex(const PointView& view, std::size_t topLevel = 0);
+    QuadIndex(
+            const PointView& view,
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t topLevel = 0);
+    QuadIndex(
+            const std::vector<std::shared_ptr<QuadPointRef> >& points,
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t topLevel = 0);
+    ~QuadIndex();
+
+    void getBounds(
+            double& xMin,
+            double& yMin,
+            double& xMax,
+            double& yMax) const;
+
+    std::size_t getDepth() const;
+
+    std::vector<std::size_t> getFills() const;
+
+    // Return all points at depth levels strictly less than depthEnd.
+    // A depthEnd value of zero returns all points in the tree.
+    std::vector<PointId> getPoints(
+            std::size_t depthEnd = 0) const;
+
+    // Return all points at depth levels between [depthBegin, depthEnd).
+    // A depthEnd value of zero will return all points at levels >= depthBegin.
+    std::vector<PointId> getPoints(
+            std::size_t depthBegin,
+            std::size_t depthEnd) const;
+
+    // Rasterize a single level of the tree.  Empty positions will contain
+    // std::numeric_limits<PointId>::max().
+    std::vector<PointId> getPoints(
+            std::size_t rasterize,
+            double& xBegin,
+            double& xEnd,
+            double& xStep,
+            double& yBegin,
+            double& yEnd,
+            double& yStep) const;
+
+    // Get custom raster via bounds and resolution query.  Empty positions will
+    // contain std::numeric_limits<PointId>::max().
+    std::vector<PointId> getPoints(
+            double xBegin,
+            double xEnd,
+            double xStep,
+            double yBegin,
+            double yEnd,
+            double yStep) const;
+
+    // Return all points within the query bounding box, searching only up to
+    // depth levels strictly less than depthEnd.
+    // A depthEnd value of zero will return all existing points that fall
+    // within the query range regardless of depth.
+    std::vector<PointId> getPoints(
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t depthEnd = 0) const;
+
+    std::vector<PointId> getPoints(
+            const BOX3D& box,
+            std::size_t depthEnd=0) const
+    {
+        return getPoints(box.minx, box.miny, box.maxx, box.maxy, depthEnd);
+    }
+
+    // Return all points within the bounding box, searching at tree depth
+    // levels from [depthBegin, depthEnd).
+    // A depthEnd value of zero will return all points within the query range
+    // that have a tree level >= depthBegin.
+    std::vector<PointId> getPoints(
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t depthBegin,
+            std::size_t depthEnd) const;
+
+private:
+    struct QImpl;
+    std::unique_ptr<QImpl> m_qImpl;
+
+    // Disable copying and assignment.
+    QuadIndex(const QuadIndex&);
+    QuadIndex& operator=(QuadIndex&);
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/QuickInfo.hpp b/include/pdal/QuickInfo.hpp
new file mode 100644
index 0000000..e44bcf2
--- /dev/null
+++ b/include/pdal/QuickInfo.hpp
@@ -0,0 +1,62 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <vector>
+
+#include <pdal/util/Bounds.hpp>
+#include <pdal/SpatialReference.hpp>
+
+namespace pdal
+{
+
+struct QuickInfo
+{
+public:
+    BOX3D m_bounds;
+    SpatialReference m_srs;
+    point_count_t m_pointCount;
+    std::vector<std::string> m_dimNames;
+    bool m_valid;
+
+    QuickInfo() : m_pointCount(0), m_valid(false)
+        {}
+
+    bool valid() const
+        { return m_valid; }
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/Reader.hpp b/include/pdal/Reader.hpp
new file mode 100644
index 0000000..1e8b42b
--- /dev/null
+++ b/include/pdal/Reader.hpp
@@ -0,0 +1,78 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Stage.hpp>
+#include <pdal/Options.hpp>
+
+namespace pdal
+{
+
+class Reader;
+
+class PDAL_DLL Reader : public Stage
+{
+public:
+    typedef std::function<void(PointView&, PointId)> PointReadFunc;
+
+    Reader() : m_count(std::numeric_limits<point_count_t>::max())
+    {}
+
+    void setReadCb(PointReadFunc cb)
+        { m_cb = cb; }
+
+protected:
+    std::string m_filename;
+    point_count_t m_count;
+    PointReadFunc m_cb;
+
+private:
+    virtual PointViewSet run(PointViewPtr view)
+    {
+        PointViewSet viewSet;
+
+        view->clearTemps();
+        read(view, m_count);
+        viewSet.insert(view);
+        return viewSet;
+    }
+    virtual void readerProcessOptions(const Options& options);
+    virtual point_count_t read(PointViewPtr /*view*/, point_count_t /*num*/)
+        { return 0; }
+    virtual boost::property_tree::ptree serializePipeline() const;
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/SpatialReference.hpp b/include/pdal/SpatialReference.hpp
new file mode 100644
index 0000000..a301a15
--- /dev/null
+++ b/include/pdal/SpatialReference.hpp
@@ -0,0 +1,130 @@
+/******************************************************************************
+ * Copyright (c) 2009, Howard Butler
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL BOX3D;
+class PDAL_DLL SpatialReference
+{
+public:
+    enum WKTModeFlag
+    {
+        eHorizontalOnly = 1,
+        eCompoundOK = 2
+    };
+
+    /// Default constructor.
+    SpatialReference()
+    {}
+
+    // calls setFromUserInput() with the given string
+    SpatialReference(const std::string& userInput);
+
+    bool equals(const SpatialReference& other) const;
+    bool operator==(const SpatialReference& other) const;
+    bool operator!=(const SpatialReference& other) const;
+
+    // Returns true iff the object doesn't contain a valid srs.
+    // (this is a cleaner way of saying "getWKT() == "")
+    bool empty() const;
+
+    /// Returns the OGC WKT describing Spatial Reference System.
+    /// If GDAL is linked, it uses GDAL's operations and methods to determine
+    /// the WKT.  If GDAL is not linked, no WKT is returned.
+    /// \param mode_flag May be eHorizontalOnly indicating the WKT will not
+    /// include vertical coordinate system info (the default), or
+    /// eCompoundOK indicating the the returned WKT may be a compound
+    /// coordinate system if there is vertical coordinate system info
+    /// available.
+    std::string getWKT(WKTModeFlag mode_flag = eHorizontalOnly) const;
+    std::string getWKT(WKTModeFlag mode_flag, bool pretty) const;
+    std::string getRawWKT() const
+        { return m_wkt; }
+
+    /// Sets the SRS using GDAL's OGC WKT. If GDAL is not linked, this
+    /// operation has no effect.
+    /// \param v - a string containing the WKT string.
+    void setWKT(std::string const& v)
+        { m_wkt = v; }
+
+    /// Sets the SRS using GDAL's SetFromUserInput function. If GDAL is
+    /// not linked, this operation has no effect.
+    /// \param v - a string containing the definition (filename, proj4,
+    ///    wkt, etc).
+    void setFromUserInput(std::string const& v);
+
+    /// Returns the Proj.4 string describing the Spatial Reference System.
+    /// If GDAL is linked, it uses GDAL's operations and methods to determine
+    /// the Proj.4 string -- otherwise, if libgeotiff is linked, it uses
+    /// that.  Note that GDAL's operations are much more mature and
+    /// support more coordinate systems and descriptions.
+    std::string getProj4() const;
+
+    std::string getHorizontal() const;
+    std::string getVertical() const;
+
+    /// Sets the Proj.4 string describing the Spatial Reference System.
+    /// If GDAL is linked, it uses GDAL's operations and methods to determine
+    /// the Proj.4 string -- otherwise, if libgeotiff is linked, it uses
+    /// that.  Note that GDAL's operations are much more mature and
+    /// support more coordinate systems and descriptions.
+    /// \param v - a string containing the Proj.4 string.
+    void setProj4(std::string const& v);
+
+    void dump() const;
+
+    bool isGeographic() const;
+    int computeUTMZone(const BOX3D& box) const;
+    const std::string& getName() const;
+    static int calculateZone(double lon, double lat);
+
+private:
+    std::string m_wkt;
+    friend PDAL_DLL std::ostream& operator<<(std::ostream& ostr,
+        const SpatialReference& srs);
+    friend PDAL_DLL std::istream& operator>>(std::istream& istr,
+        SpatialReference& srs);
+};
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr,
+    const SpatialReference& srs);
+PDAL_DLL std::istream& operator>>(std::istream& istr, SpatialReference& srs);
+
+} // namespace pdal
+
diff --git a/include/pdal/Stage.hpp b/include/pdal/Stage.hpp
new file mode 100644
index 0000000..689486e
--- /dev/null
+++ b/include/pdal/Stage.hpp
@@ -0,0 +1,184 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/plugin.hpp>
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Log.hpp>
+#include <pdal/Metadata.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/QuickInfo.hpp>
+#include <pdal/SpatialReference.hpp>
+#include <pdal/UserCallback.hpp>
+
+#include <boost/property_tree/ptree.hpp>
+
+namespace pdal
+{
+
+class Iterator;
+class StageSequentialIterator;
+class StageRandomIterator;
+class StageBlockIterator;
+class StageRunner;
+class StageWrapper;
+
+class PDAL_DLL Stage
+{
+    friend class StageWrapper;
+    friend class StageRunner;
+public:
+    Stage();
+    virtual ~Stage()
+        {}
+
+    void setInput(Stage& input)
+        { m_inputs.push_back(&input); }
+
+    void setProgressFd(int fd)
+        { m_progressFd = fd; }
+
+    QuickInfo preview()
+    {
+        l_processOptions(m_options);
+        processOptions(m_options);
+        return inspect();
+    }
+    void prepare(PointTableRef table);
+    PointViewSet execute(PointTableRef table);
+
+    void setSpatialReference(SpatialReference const&);
+    const SpatialReference& getSpatialReference() const;
+    const Options& getOptions() const
+        { return m_options; }
+    void setOptions(Options options)
+        { m_options = options; }
+    void addConditionalOptions(const Options& opts);
+    void addOptions(const Options& opts)
+    {
+        for (const auto& o : opts.getOptions())
+            m_options.add(o);
+    }
+    virtual boost::property_tree::ptree serializePipeline() const = 0;
+    virtual LogPtr log() const
+        { return m_log; }
+    bool isDebug() const
+        {
+            return m_options.getValueOrDefault<bool>("debug", false);
+        }
+    bool isVerbose() const
+        { return (getVerboseLevel() != 0 ); }
+    uint32_t getVerboseLevel() const
+        {
+            return m_options.getValueOrDefault<uint32_t>("verbose", 0);
+        }
+    virtual std::string getName() const = 0;
+    const std::vector<Stage*>& getInputs() const
+        { return m_inputs; }
+    std::vector<Stage *> findStage(std::string name);
+    virtual Options getDefaultOptions()
+        { return Options(); }
+    static Dimension::IdList getDefaultDimensions()
+        { return Dimension::IdList(); }
+    static std::string s_getInfoLink()
+        { return std::string(); }
+    static std::string s_getPluginVersion()
+        { return std::string(); }
+    virtual boost::property_tree::ptree toPTree(PointTableRef table) const
+        { return boost::property_tree::ptree(); }
+
+    virtual StageSequentialIterator* createSequentialIterator() const
+        { return NULL; }
+    inline MetadataNode getMetadata() const
+        { return m_metadata; }
+
+    /// Sets the UserCallback to manage progress/cancel operations
+    void setUserCallback(UserCallback* userCallback)
+        { m_callback.reset(userCallback); }
+
+protected:
+    std::unique_ptr<UserCallback> m_callback;
+    Options m_options;
+    MetadataNode m_metadata;
+    int m_progressFd;
+
+    void setSpatialReference(MetadataNode& m, SpatialReference const&);
+
+private:
+    bool m_debug;
+    uint32_t m_verbose;
+    std::vector<Stage *> m_inputs;
+    LogPtr m_log;
+    SpatialReference m_spatialReference;
+
+    Stage& operator=(const Stage&); // not implemented
+    Stage(const Stage&); // not implemented
+    void Construct();
+    void l_processOptions(const Options& options);
+    virtual void processOptions(const Options& /*options*/)
+        {}
+    virtual void readerProcessOptions(const Options& /*options*/)
+        {}
+    virtual void writerProcessOptions(const Options& /*options*/)
+        {}
+    void l_initialize(PointTableRef table);
+    void l_done(PointTableRef table);
+    virtual QuickInfo inspect()
+        { return QuickInfo(); }
+    virtual void initialize()
+        {}
+    virtual void addDimensions(PointLayoutPtr /*layout*/)
+        {}
+    virtual void prepared(PointTableRef /*table*/)
+        {}
+    virtual void ready(PointTableRef /*table*/)
+        {}
+    virtual void done(PointTableRef /*table*/)
+        {}
+    virtual PointViewSet run(PointViewPtr /*view*/)
+    {
+        std::cerr << "Can't run stage = " << getName() << "!\n";
+        return PointViewSet();
+    }
+};
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const Stage&);
+
+} // namespace pdal
+
diff --git a/include/pdal/StageFactory.hpp b/include/pdal/StageFactory.hpp
new file mode 100644
index 0000000..38deadd
--- /dev/null
+++ b/include/pdal/StageFactory.hpp
@@ -0,0 +1,94 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/Stage.hpp>
+
+#include <map>
+#include <string>
+#include <vector>
+
+
+namespace pdal
+{
+
+class Options;
+
+
+// This class provides a mechanism for creating Stage objects using only a
+// string (the stage type name) and an Options block.
+//
+// We keep a list of (stage type name, creation function) pairs, which
+// acts as a registry of creator functions.  The list is initialized with
+// the core stages we know about (I wish C++ had anonymous functions.).
+// We allow the user to add his own "external" drivers to the registry list
+// as well.
+//
+// We use 4 different functions for each kind of operation, since we have
+// 4 types of derived classes from Stage and they all have slightly different
+// parameters.  That makes it kinda messy.
+
+class PDAL_DLL StageFactory
+{
+public:
+    StageFactory(bool no_plugins = true);
+
+    // infer the driver to use based on filename extension
+    // returns "" if no driver found
+    static std::string inferReaderDriver(const std::string& filename);
+
+    // infer the driver to use based on filename extension
+    // returns "" if no driver found
+    static std::string inferWriterDriver(const std::string& filename);
+
+    // modify options based upon expectations implicit in a given filename
+    // e.g. output files ending in .laz should be compressed
+    static pdal::Options inferWriterOptionsChanges(const std::string& filename);
+
+    Stage *createStage(const std::string& type, bool ownStage = false);
+
+    StringList getStageNames() const;
+    std::map<std::string, std::string> getStageMap() const;
+
+private:
+    StageFactory& operator=(const StageFactory&); // not implemented
+    StageFactory(const StageFactory&); // not implemented
+
+    std::vector<std::unique_ptr<Stage>> m_ownedStages;
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/StageWrapper.hpp b/include/pdal/StageWrapper.hpp
new file mode 100644
index 0000000..9af1b9f
--- /dev/null
+++ b/include/pdal/StageWrapper.hpp
@@ -0,0 +1,50 @@
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/Writer.hpp>
+
+namespace pdal
+{
+
+// Provide access to private members of stage.
+class StageWrapper
+{
+public:
+    static void initialize(std::shared_ptr<Stage> s, PointTableRef table)
+    {
+        s->l_initialize(table);
+        s->initialize();
+    }
+    static void processOptions(Stage& s, const Options& options)
+        { s.processOptions(options); }
+    static void addDimensions(Stage& s, PointLayoutPtr layout)
+        { s.addDimensions(layout); }
+    static void ready(Stage& s, PointTableRef table)
+        { s.ready(table); }
+    static void done(Stage& s, PointTableRef table)
+    {
+        s.l_done(table);
+        s.done(table);
+    }
+    static PointViewSet run(Stage& s, PointViewPtr view)
+        { return s.run(view); }
+};
+
+// Provide access to private members of Filter.
+class FilterWrapper : public StageWrapper
+{
+public:
+    static void filter(Filter& f, PointView& view)
+        { f.filter(view); }
+};
+
+// Provide access to private members of Writer.
+class WriterWrapper : public StageWrapper
+{
+public:
+    static void write(Writer& w, PointViewPtr view)
+        { w.write(view); }
+};
+
+} //namespace pdal
diff --git a/include/pdal/UserCallback.hpp b/include/pdal/UserCallback.hpp
new file mode 100644
index 0000000..9ab8c65
--- /dev/null
+++ b/include/pdal/UserCallback.hpp
@@ -0,0 +1,127 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+namespace pdal
+{
+
+// This is the base class used for out-of-band interactions
+// between the executing pipeline and the main app:
+//   - recording and reporting a "hearbeat"
+//   - recording and reporting percent-complete
+//   - requesting the pipeline to be interrupted
+//
+// (The heartbeat feature can be used when the pipeline can't report
+// a meaningful percentage complete value, e.g. when the number of
+// points being processed is not a prioi known.)
+//
+// Apps should override the callback() function as desired.
+//
+class PDAL_DLL UserCallback
+{
+public:
+    class interrupted : public pdal_error
+    {
+    public:
+        interrupted() : pdal_error("UserCallback: interrupted by user")
+            {}
+    };
+
+    UserCallback() : m_percentComplete(0.0), m_interruptFlag(false),
+        m_heartbeats(0), m_total(1)
+    {}
+
+    void setTotal(point_count_t total)
+        { m_total = std::max((point_count_t)1, total); }
+
+    // The pipeline calls this to report the percentage progress, check for
+    // interrupts, and call the user's callback function.
+    //
+    // returns true if everything is okay, or false if an interrupt has
+    // been requested
+    void invoke(point_count_t count)
+    {
+        m_percentComplete = 100.0 * count / m_total;
+        invoke();
+    }
+
+    // The pipeline calls this to report the progress in an indeterminate way,
+    // check for interrupts, and call the user's callback function.
+    //
+    // This is same as the check(double) function, except it doesn't record
+    // a percent-complete value.
+    //
+    // returns true if everything is okay, or false if an interrupt has
+    // been requested
+    //
+    void invoke()
+    {
+        ++m_heartbeats;
+        callback();
+        if (m_interruptFlag)
+            throw interrupted();
+    }
+
+    // This will be called by the pipeline (via check()) at various times
+    // during the execution. Applications should override this to perform
+    // any desired actions.
+    //
+    // Examples of things you might do here include printing the percent done,
+    // printing a '.' representing a heartbeat, checking some external condition
+    // to raise the interrupt flag, etc.
+    virtual void callback()
+    {}
+
+    double getPercentComplete() const
+        { return m_percentComplete; }
+
+    inline uint64_t getHeartbeats() const
+        { return m_heartbeats; }
+
+protected:
+    void setInterruptFlag(bool value)
+        { m_interruptFlag = value; }
+
+private:
+    double m_percentComplete;  // in range [0..100]
+    bool m_interruptFlag; // true iff user would like the pipeline to abort
+    uint64_t m_heartbeats; // number of times the check routine has been called
+    point_count_t m_total;
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/Writer.hpp b/include/pdal/Writer.hpp
new file mode 100644
index 0000000..af61a56
--- /dev/null
+++ b/include/pdal/Writer.hpp
@@ -0,0 +1,92 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Stage.hpp>
+
+#include <string>
+
+namespace pdal
+{
+
+class Writer;
+
+class UserCallback;
+
+/// End-stage consumer of PDAL pipeline
+class PDAL_DLL Writer : public Stage
+{
+    friend class WriterWrapper;
+    friend class FlexWriter;
+
+public:
+    /// Constructs an end-stage consumer of a pipeline of data -- a writer
+    Writer()
+        {}
+
+    /// Serialize the pipeline to a boost::property_tree::ptree
+    /// @return boost::property_tree::ptree with xml attributes
+    virtual boost::property_tree::ptree serializePipeline() const;
+
+protected:
+    std::string m_filename;
+    XForm m_xXform;
+    XForm m_yXform;
+    XForm m_zXform;
+    StringList m_outputDims;
+
+    virtual void setAutoXForm(const PointViewPtr view);
+
+private:
+    virtual PointViewSet run(PointViewPtr view)
+    {
+        PointViewSet viewSet;
+        write(view);
+        viewSet.insert(view);
+        return viewSet;
+    }
+    virtual void writerProcessOptions(const Options& options);
+    virtual void write(const PointViewPtr /*view*/)
+        { std::cerr << "Can't write with stage = " << getName() << "!\n"; }
+
+    Writer& operator=(const Writer&); // not implemented
+    Writer(const Writer&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/XMLSchema.hpp b/include/pdal/XMLSchema.hpp
new file mode 100644
index 0000000..b88c0c4
--- /dev/null
+++ b/include/pdal/XMLSchema.hpp
@@ -0,0 +1,144 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#define PDAL_XML_SCHEMA_VERSION "1.3"
+
+#ifndef PDAL_HAVE_LIBXML2
+#error "Including XMLSchema.hpp without libxml2 - build problem."
+#endif
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Metadata.hpp>
+#include <pdal/PointLayout.hpp>
+
+#include <string>
+#include <stdarg.h>
+#include <vector>
+
+#include <libxml/parser.h>
+#include <libxml/xmlschemas.h>
+
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xinclude.h>
+#include <libxml/xmlIO.h>
+#include <libxml/encoding.h>
+#include <libxml/xmlwriter.h>
+
+namespace pdal
+{
+
+void OCISchemaGenericErrorHandler(void * ctx, const char* message, ...);
+void OCISchemaStructuredErrorHandler(void * userData, xmlErrorPtr error);
+
+class XMLSchema;
+
+struct XMLDim
+{
+    friend class XMLSchema;
+
+public:
+    XMLDim() : m_min(0.0), m_max(0.0)
+    {}
+    XMLDim(const DimType& dim, const std::string& name) :
+        m_name(name), m_min(0.0), m_max(0.0), m_dimType(dim)
+    {}
+
+    std::string m_name;
+    std::string m_description;
+    uint32_t m_position;
+    double m_min;
+    double m_max;
+    DimType m_dimType;
+};
+typedef std::vector<XMLDim> XMLDimList;
+inline bool operator < (const XMLDim& d1, const XMLDim& d2)
+    { return d1.m_position < d2.m_position; }
+
+class PDAL_DLL XMLSchema
+{
+public:
+    XMLSchema(std::string xml, std::string xsd = "",
+        Orientation::Enum orientation = Orientation::PointMajor);
+    XMLSchema(const XMLDimList& dims, MetadataNode m = MetadataNode(),
+        Orientation::Enum orientation = Orientation::PointMajor);
+    XMLSchema(const PointLayoutPtr& pointTable, MetadataNode m = MetadataNode(),
+        Orientation::Enum orientation = Orientation::PointMajor);
+    XMLSchema() : m_orientation(Orientation::PointMajor)
+    {}
+
+    ~XMLSchema()
+        { xmlCleanupParser(); }
+
+    std::string xml() const;
+    DimTypeList dimTypes() const;
+    XMLDimList xmlDims() const
+        { return m_dims; }
+
+    MetadataNode getMetadata() const
+        { return m_metadata;}
+    void setId(const std::string& name, Dimension::Id::Enum id)
+        { xmlDim(name).m_dimType.m_id = id; }
+    void setXForm(Dimension::Id::Enum id, XForm xform)
+        { xmlDim(id).m_dimType.m_xform = xform; }
+    XForm xForm(Dimension::Id::Enum id) const
+        { return xmlDim(id).m_dimType.m_xform; }
+    void setOrientation(Orientation::Enum orientation)
+        { m_orientation = orientation; }
+    Orientation::Enum orientation() const
+        { return m_orientation; }
+
+private:
+    Orientation::Enum m_orientation;
+    XMLDimList m_dims;
+    void* m_global_context;
+    MetadataNode m_metadata;
+
+    XMLDim& xmlDim(Dimension::Id::Enum id);
+    const XMLDim& xmlDim(Dimension::Id::Enum id) const;
+    XMLDim& xmlDim(const std::string& name);
+    xmlDocPtr init(const std::string& xml, const std::string& xsd);
+    bool validate(xmlDocPtr doc, const std::string& xsd);
+    std::string remapOldNames(const std::string& input);
+    bool loadMetadata(xmlNode *startNode, MetadataNode& input);
+    bool load(xmlDocPtr doc);
+    void writeXml(xmlTextWriterPtr w) const;
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/gitsha.h b/include/pdal/gitsha.h
new file mode 100644
index 0000000..e6e0842
--- /dev/null
+++ b/include/pdal/gitsha.h
@@ -0,0 +1 @@
+extern const char g_GIT_SHA1[];
\ No newline at end of file
diff --git a/include/pdal/pdal.hpp b/include/pdal/pdal.hpp
new file mode 100644
index 0000000..06d8ebd
--- /dev/null
+++ b/include/pdal/pdal.hpp
@@ -0,0 +1,42 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#ifndef INCLUDED_PDAL_TOP_INCUDE_HPP
+#define INCLUDED_PDAL_TOP_INCUDE_HPP
+
+#include <pdal/pdal_config.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+#endif
diff --git a/include/pdal/pdal_config.hpp b/include/pdal/pdal_config.hpp
new file mode 100644
index 0000000..f539af8
--- /dev/null
+++ b/include/pdal/pdal_config.hpp
@@ -0,0 +1,68 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  libLAS - http://liblas.org - A BSD library for LAS format data.
+ * Purpose:  LAS version related functions.
+ * Author:   Mateusz Loskot, mateusz at loskot.net
+ *           Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Mateusz Loskot
+ * Copyright (c) 2010, Frank Warmerdam
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <string>
+
+namespace pdal
+{
+
+PDAL_DLL bool IsLibLASEnabled();
+PDAL_DLL bool IsGDALEnabled();
+PDAL_DLL bool IsLibGeoTIFFEnabled();
+PDAL_DLL bool IsLasZipEnabled();
+
+PDAL_DLL std::string GetFullVersionString();
+PDAL_DLL std::string GetVersionString();
+PDAL_DLL int GetVersionInteger();
+PDAL_DLL std::string GetSHA1();
+PDAL_DLL int GetVersionMajor();
+PDAL_DLL int GetVersionMinor();
+PDAL_DLL int GetVersionPatch();
+PDAL_DLL std::string getPDALDebugInformation();
+
+} // namespace pdal
+
diff --git a/include/pdal/pdal_export.hpp b/include/pdal/pdal_export.hpp
new file mode 100644
index 0000000..0c09705
--- /dev/null
+++ b/include/pdal/pdal_export.hpp
@@ -0,0 +1,60 @@
+/******************************************************************************
+ * Copyright (c) 2010, Howard Butler
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_defines.h>
+
+#ifndef PDAL_DLL
+#if defined(PDAL_COMPILER_MSVC)
+#if defined(PDAL_DLL_EXPORT)
+#   define PDAL_DLL   __declspec(dllexport)
+#elif defined(PDAL_DLL_IMPORT)
+#   define PDAL_DLL   __declspec(dllimport)
+#else
+#   define PDAL_DLL
+#endif
+#else
+#  if defined(USE_GCC_VISIBILITY_FLAG)
+#    define PDAL_DLL     __attribute__ ((visibility("default")))
+#  else
+#    define PDAL_DLL
+#  endif
+#endif
+#endif
+
+#ifdef PDAL_COMPILER_MSVC
+#pragma warning(disable:4251)// [templated class] needs to have dll-interface...
+#endif
+
diff --git a/include/pdal/pdal_internal.hpp b/include/pdal/pdal_internal.hpp
new file mode 100644
index 0000000..a7728e2
--- /dev/null
+++ b/include/pdal/pdal_internal.hpp
@@ -0,0 +1,67 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+// This file is for all the things that basically everybody has to include.
+
+#include <iostream>
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/pdal_defines.h>
+#include <pdal/pdal_types.hpp>
+#include <pdal/pdal_macros.hpp>
+
+#include <boost/version.hpp>
+
+// See http://stackoverflow.com/questions/1814548/boostsystem-category-defined-but-not-used
+#ifndef BOOST_SYSTEM_NO_DEPRECATED
+#define BOOST_SYSTEM_NO_DEPRECATED 1
+#endif
+
+
+#define PDAL_CURRENT_BOOST_MINOR_VERSION BOOST_VERSION/100%1000
+#ifdef __cplusplus
+#  define PDAL_C_START           extern "C" {
+#  define PDAL_C_END             }
+#else
+#  define PDAL_C_START
+#  define PDAL_C_END
+#endif
+
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4068)  // ignore unknown pragmas (due to boost's use of GCC pragmas)
+#endif
+
diff --git a/include/pdal/pdal_macros.hpp b/include/pdal/pdal_macros.hpp
new file mode 100644
index 0000000..2a88a6f
--- /dev/null
+++ b/include/pdal/pdal_macros.hpp
@@ -0,0 +1,120 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/plugin.hpp>
+#include <pdal/PluginManager.hpp>
+
+namespace {
+
+typedef struct PluginInfo {
+    std::string name;
+    std::string description;
+    std::string link;
+    PluginInfo(const std::string& n, const std::string& d, const std::string& l)
+      : name(n), description(d), link(l)
+    {}
+} PluginInfo;
+
+}
+
+#define CREATE_SHARED_PLUGIN(version_major, version_minor, T, type, info) \
+    extern "C" PDAL_DLL int32_t ExitFunc() \
+    { return 0; } \
+    extern "C" PDAL_DLL PF_ExitFunc PF_initPlugin() \
+    { \
+        int res = 0; \
+        PF_RegisterParams rp; \
+        rp.version.major = version_major; \
+        rp.version.minor = version_minor; \
+        rp.createFunc = pdal::T::create; \
+        rp.destroyFunc = pdal::T::destroy; \
+        rp.description = info.description; \
+        rp.link = info.link; \
+        rp.pluginType = PF_PluginType_ ## type; \
+        if (!pdal::PluginManager::registerObject(info.name, &rp)) \
+            return NULL; \
+        return ExitFunc; \
+    } \
+    void * pdal::T::create() { return new pdal::T(); } \
+    int32_t pdal::T::destroy(void *p) \
+    { \
+        if (!p) \
+            return -1; \
+        delete (pdal::T *)p; \
+        return 0; \
+    }
+
+#define CREATE_STATIC_PLUGIN(version_major, version_minor, T, type, info) \
+    extern "C" PDAL_DLL int32_t T ## _ExitFunc() \
+    { return 0; } \
+    extern "C" PDAL_DLL PF_ExitFunc T ## _InitPlugin() \
+    { \
+        int res = 0; \
+        PF_RegisterParams rp; \
+        rp.version.major = version_major; \
+        rp.version.minor = version_minor; \
+        rp.createFunc = pdal::T::create; \
+        rp.destroyFunc = pdal::T::destroy; \
+        rp.description = info.description; \
+        rp.link = info.link; \
+        rp.pluginType = PF_PluginType_ ## type; \
+        if (!pdal::PluginManager::registerObject(info.name, &rp)) \
+            return NULL; \
+        return T ## _ExitFunc; \
+    } \
+    void * pdal::T::create() { return new pdal::T(); } \
+    int32_t pdal::T::destroy(void *p) \
+    { \
+        if (!p) \
+            return -1; \
+        delete (pdal::T *)p; \
+        return 0; \
+    }
+
+#ifdef _WIN32
+inline long lround(double d)
+{
+    long l;
+
+    if (d < 0)
+        l = (long)ceil(d - .5);
+    else
+        l = (long)floor(d + .5);
+    return l;
+}
+#endif
+
diff --git a/include/pdal/pdal_test_main.hpp b/include/pdal/pdal_test_main.hpp
new file mode 100644
index 0000000..22b4e22
--- /dev/null
+++ b/include/pdal/pdal_test_main.hpp
@@ -0,0 +1,46 @@
+/******************************************************************************
+* Copyright (c) 2015,  Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its
+*       contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "gtest/gtest.h"
+
+// NOTE:  This file contains main() for all tests, and therefore 
+//   should be included only once for each test executable.  Usually test
+//   executables consist of a single source file, but if this isn't the case
+//   you may need to take precautions or define your own main().
+
+GTEST_API_ int main(int argc, char **argv) {
+    testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
+
diff --git a/include/pdal/pdal_types.hpp b/include/pdal/pdal_types.hpp
new file mode 100644
index 0000000..b520b28
--- /dev/null
+++ b/include/pdal/pdal_types.hpp
@@ -0,0 +1,139 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <stdint.h>
+#include <cstdlib>
+#include <stdexcept>
+#include <string>
+#include <vector>
+
+#include <pdal/pdal_internal.hpp>
+
+namespace pdal
+{
+
+typedef uint32_t PointId;
+typedef uint32_t point_count_t;
+typedef std::vector<std::string> StringList;
+
+typedef union
+{
+    float f;
+    double d;
+    int8_t s8;
+    int16_t s16;
+    int32_t s32;
+    int64_t s64;
+    uint8_t u8;
+    uint16_t u16;
+    uint32_t u32;
+    uint64_t u64;
+} Everything;
+
+struct XForm
+{
+public:
+    XForm() : m_scale(1.0), m_autoScale(false), m_offset(0.0),
+        m_autoOffset(false)
+    {}
+
+    XForm(double scale, double offset) : m_scale(scale), m_autoScale(false),
+        m_offset(offset), m_autoOffset(false)
+    {}
+
+    double m_scale;
+    // Whether a scale value should be determined by examining the data.
+    bool m_autoScale;
+    double m_offset;
+    // Whether an offset value should be determined by examining the data.
+    bool m_autoOffset;
+
+    bool nonstandard() const
+    {
+        return m_autoScale || m_autoOffset || m_scale != 1.0 || m_offset != 0.0;
+    }
+
+    void setOffset(const std::string& sval)
+    {
+        if (sval == "auto")
+            m_autoOffset = true;
+        else
+            m_offset = std::strtod(sval.c_str(), NULL);
+    }
+
+    void setScale(const std::string& sval)
+    {
+        if (sval == "auto")
+            m_autoScale = true;
+        else
+            m_scale = std::strtod(sval.c_str(), NULL);
+    }
+};
+
+namespace LogLevel
+{
+enum Enum
+{
+    Error = 0,
+    Warning,
+    Info,
+    Debug,
+    Debug1,
+    Debug2,
+    Debug3,
+    Debug4,
+    Debug5
+};
+} // namespace LogLevel
+
+namespace Orientation
+{
+enum Enum
+{
+    PointMajor,
+    DimensionMajor
+};
+} // namespace Orientation
+
+class pdal_error : public std::runtime_error
+{
+public:
+    inline pdal_error(std::string const& msg) : std::runtime_error(msg)
+        {}
+};
+
+} // namespace pdal
+
diff --git a/include/pdal/plang/Array.hpp b/include/pdal/plang/Array.hpp
new file mode 100644
index 0000000..b1bcb42
--- /dev/null
+++ b/include/pdal/plang/Array.hpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/PointView.hpp>
+
+
+// forward declare PyObject so we don't need the python headers everywhere
+// see: http://mail.python.org/pipermail/python-dev/2003-August/037601.html
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+
+namespace pdal
+{
+namespace plang
+{
+
+
+class PDAL_DLL Array
+{
+public:
+    Array();
+    ~Array();
+
+    void update(PointViewPtr view);
+
+    inline PyObject* getPythonArray() const { return m_py_array; }
+
+
+private:
+    void cleanup();
+    PyObject* buildNumpyDescription(PointViewPtr view) const;
+
+    PyObject* m_py_array;
+    std::unique_ptr<std::vector<uint8_t> > m_data_array;
+
+    Array& operator=(Array const& rhs);
+};
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plang/BufferedInvocation.hpp b/include/pdal/plang/BufferedInvocation.hpp
new file mode 100644
index 0000000..134358c
--- /dev/null
+++ b/include/pdal/plang/BufferedInvocation.hpp
@@ -0,0 +1,61 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "../plang/Invocation.hpp"
+
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+namespace plang
+{
+
+class PDAL_DLL BufferedInvocation : public Invocation
+{
+public:
+    BufferedInvocation(const Script& script);
+
+    void begin(PointView& view, MetadataNode m);
+    void end(PointView& view, MetadataNode m);
+
+private:
+    std::vector<void *> m_buffers;
+    BufferedInvocation& operator=(BufferedInvocation const& rhs); // nope
+};
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plang/Environment.hpp b/include/pdal/plang/Environment.hpp
new file mode 100644
index 0000000..972f10c
--- /dev/null
+++ b/include/pdal/plang/Environment.hpp
@@ -0,0 +1,85 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+
+
+// forward declare PyObject so we don't need the python headers everywhere
+// see: http://mail.python.org/pipermail/python-dev/2003-August/037601.html
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Metadata.hpp>
+#include <pdal/Dimension.hpp>
+
+#include "Redirector.hpp"
+
+namespace pdal
+{
+namespace plang
+{
+
+PyObject *fromMetadata(MetadataNode m);
+void addMetadata(PyObject *list, MetadataNode m);
+
+std::string getTraceback();
+
+class Environment;
+typedef Environment *EnvironmentPtr;
+
+class PDAL_DLL Environment
+{
+public:
+    Environment();
+    ~Environment();
+
+    // these just forward into the Redirector class
+    void set_stdout(std::ostream* ostr);
+    void reset_stdout();
+
+    static EnvironmentPtr get();
+    static int getPythonDataType(Dimension::Type::Enum t);
+
+private:
+    Redirector m_redirector;
+};
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plang/Invocation.hpp b/include/pdal/plang/Invocation.hpp
new file mode 100644
index 0000000..76cc237
--- /dev/null
+++ b/include/pdal/plang/Invocation.hpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include "Script.hpp"
+#include "Environment.hpp"
+
+#include <pdal/Dimension.hpp>
+
+namespace pdal
+{
+namespace plang
+{
+
+
+class PDAL_DLL Invocation
+{
+public:
+    Invocation(const Script&);
+    ~Invocation();
+
+    void compile();
+
+    void resetArguments();
+
+
+    // creates a Python variable pointing to a (one dimensional) C array
+    // adds the new variable to the arguments dictionary
+    void insertArgument(std::string const& name,
+                        uint8_t* data,
+                        Dimension::Type::Enum t,
+                        point_count_t count);
+    void *extractResult(const std::string& name,
+                        Dimension::Type::Enum dataType);
+
+    bool hasOutputVariable(const std::string& name) const;
+
+    // returns true iff the called python function returns true,
+    // as would be used for a predicate function
+    // (that is, the return value is NOT an error indicator)
+    bool execute();
+
+    // after a call to execute, this function will return you a list of
+    // the names in the 'outs' dictionary (this is used by the
+    // BufferedInvocation class to find the returned data -- faster to
+    // examine what's already in there than it is to iterate over all the
+    // possible names from the schema)
+    void getOutputNames(std::vector<std::string>& names);
+
+protected:
+    PyObject* m_metaIn;
+    PyObject* m_metaOut;
+
+private:
+    void cleanup();
+
+    Script m_script;
+
+    PyObject* m_bytecode;
+    PyObject* m_module;
+    PyObject* m_dictionary;
+    PyObject* m_function;
+
+    PyObject* m_varsIn;
+    PyObject* m_varsOut;
+    PyObject* m_scriptArgs;
+    PyObject* m_scriptResult;
+    std::vector<PyObject*> m_pyInputArrays;
+
+    Invocation& operator=(Invocation const& rhs); // nope
+};
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plang/Redirector.hpp b/include/pdal/plang/Redirector.hpp
new file mode 100644
index 0000000..f669af4
--- /dev/null
+++ b/include/pdal/plang/Redirector.hpp
@@ -0,0 +1,50 @@
+//
+// Copyright (C) 2011 Mateusz Loskot <mateusz at loskot.net>
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// Blog article: http://mateusz.loskot.net/?p=2819
+
+// http://python3porting.com/cextensions.html
+
+#pragma once
+
+#include <Python.h>
+#undef toupper
+#undef tolower
+#undef isspace
+
+#include <boost/function.hpp>
+#include <boost/bind.hpp>
+
+namespace pdal
+{
+namespace plang
+{
+
+PyMODINIT_FUNC redirector_init(void);
+
+class Redirector
+{
+public:
+    Redirector();
+    ~Redirector();
+
+    static PyObject* init();
+    void set_stdout(std::ostream* ostr);
+    void reset_stdout();
+
+    typedef boost::function<void(std::string)> stdout_write_type;
+
+private:
+    void set_stdout(stdout_write_type write);
+
+    // Internal state
+    PyObject* m_stdout;
+    PyObject* m_stdout_saved;
+};
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plang/Script.hpp b/include/pdal/plang/Script.hpp
new file mode 100644
index 0000000..0a0f664
--- /dev/null
+++ b/include/pdal/plang/Script.hpp
@@ -0,0 +1,78 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <pdal/Options.hpp>
+
+namespace pdal
+{
+namespace plang
+{
+
+class PDAL_DLL Script
+{
+public:
+    Script(const std::string& sourceCode, const std::string& moduleName,
+        const std::string& functionName);
+
+    // the Py functions want char* or const char* things, not std::string things
+    const char* source() const
+    {
+        return m_source.c_str();
+    }
+    const char* module() const
+    {
+        return m_module.c_str();
+    }
+    const char* function() const
+    {
+        return m_function.c_str();
+    }
+
+private:
+    std::string m_source;
+    std::string m_module;
+    std::string m_function;
+
+    Script& operator=(Script const& rhs); // nope
+};
+
+PDAL_DLL std::ostream& operator<<(std::ostream& os, Script const& d);
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/include/pdal/plugin.hpp b/include/pdal/plugin.hpp
new file mode 100644
index 0000000..b46b3a9
--- /dev/null
+++ b/include/pdal/plugin.hpp
@@ -0,0 +1,99 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// plugin.h was modeled very closely after the work of Gigi Sayfan in the Dr.
+// Dobbs article:
+// http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/206503957
+// The original work was released under the Apache License v2.
+
+#pragma once
+
+#include <string>
+
+#include <pdal/pdal_export.hpp>
+
+#include <cstdint>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum PF_PluginType
+{
+    PF_PluginType_Kernel,
+    PF_PluginType_Reader,
+    PF_PluginType_Filter,
+    PF_PluginType_Writer
+} PF_PluginType;
+
+typedef struct PF_PluginAPI_Version
+{
+    int32_t major;
+    int32_t minor;
+} PF_PluginAPI_Version;
+
+typedef void * (*PF_CreateFunc)();
+typedef int32_t (*PF_DestroyFunc)(void *);
+
+typedef struct PF_RegisterParams
+{
+    PF_PluginAPI_Version version;
+    PF_CreateFunc createFunc;
+    PF_DestroyFunc destroyFunc;
+    std::string description;
+    std::string link;
+    PF_PluginType pluginType;
+} PF_RegisterParams;
+
+typedef int32_t (*PF_ExitFunc)();
+typedef PF_ExitFunc (*PF_InitFunc)();
+
+#ifndef PDAL_DLL
+  #ifdef _WIN32
+    #define PDAL_DLL __declspec(dllimport)
+  #else
+    #define PDAL_DLL
+  #endif
+#endif
+
+extern
+#ifdef __cplusplus
+"C"
+#endif
+PDAL_DLL PF_ExitFunc PF_initPlugin();
+
+#ifdef __cplusplus
+}
+#endif
+
diff --git a/include/pdal/util/Algorithm.hpp b/include/pdal/util/Algorithm.hpp
new file mode 100644
index 0000000..9a8d336
--- /dev/null
+++ b/include/pdal/util/Algorithm.hpp
@@ -0,0 +1,49 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <algorithm>
+
+namespace pdal
+{
+
+template<typename CONTAINER, typename VALUE>
+bool contains(const CONTAINER& cont, const VALUE& val)
+{
+    return std::find(cont.begin(), cont.end(), val) != cont.end();
+}
+
+} // namespace pdal
+
diff --git a/include/pdal/util/Bounds.hpp b/include/pdal/util/Bounds.hpp
new file mode 100644
index 0000000..9a10bd1
--- /dev/null
+++ b/include/pdal/util/Bounds.hpp
@@ -0,0 +1,377 @@
+/******************************************************************************
+ * Copyright (c) 2010, Howard Butler
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <cstdint>
+#include <sstream>
+
+#ifndef PDAL_DLL
+#if defined(_WIN32)
+#   define PDAL_DLL   __declspec(dllexport)
+#else
+#  if defined(USE_GCC_VISIBILITY_FLAG)
+#    define PDAL_DLL     __attribute__ ((visibility("default")))
+#  else
+#    define PDAL_DLL
+#  endif
+#endif
+#endif
+
+namespace pdal
+{
+
+/*!
+    \verbatim embed:rst
+
+    Bounds is for manipulating n-dimensional ranges of data.  Typically
+    used for defining the spatial extents of XYZ data, this class can also be
+    used for defining bounds of other dimensions.
+
+    \endverbatim
+*/
+
+class PDAL_DLL BOX2D
+{
+protected:
+    static const double LOWEST;
+    static const double HIGHEST;
+
+public:
+    double minx;
+    double maxx;
+    double miny;
+    double maxy;
+
+    BOX2D()
+        { clear(); }
+
+    BOX2D(const BOX2D& box) :
+        minx(box.minx), maxx(box.maxx), miny(box.miny), maxy(box.maxy)
+    {}
+
+    BOX2D(double minx, double miny, double maxx, double maxy) :
+        minx(minx), maxx(maxx), miny(miny), maxy(maxy)
+    {}
+
+    bool empty() const;
+    void clear();
+    void grow(double x, double y);
+
+    bool contains(double x, double y) const
+        { return minx <= x && x <= maxx && miny <= y && y <= maxy; }
+
+    bool contains(const BOX2D& other) const
+    {
+        return minx <= other.minx && other.maxx <= maxx &&
+            miny <= other.miny && other.maxy <= maxy;
+    }
+
+    bool equal(const BOX2D& other) const
+    {
+        return  minx == other.minx && maxx == other.maxx &&
+            miny == other.miny && maxy == other.maxy;
+    }
+
+    bool operator==(BOX2D const& rhs) const
+    {
+        return equal(rhs);
+    }
+
+    bool operator!=(BOX2D const& rhs) const
+    {
+        return (!equal(rhs));
+    }
+
+    void grow(const BOX2D& other)
+    {
+        if (other.minx < minx) minx = other.minx;
+        if (other.maxx > maxx) maxx = other.maxx;
+
+        if (other.miny < miny) miny = other.miny;
+        if (other.maxy > maxy) maxy = other.maxy;
+    }
+
+    void clip(double x, double y)
+    {
+        if (x > minx) minx = x;
+        if (x < maxx) maxx = x;
+
+        if (y > maxy) miny = y;
+        if (y < maxy) maxy = y;
+    }
+
+    void clip(const BOX2D& other)
+    {
+        if (other.minx > minx) minx = other.minx;
+        if (other.maxx < maxx) maxx = other.maxx;
+
+        if (other.miny > miny) miny = other.miny;
+        if (other.maxy < maxy) maxy = other.maxy;
+    }
+
+    bool overlaps(const BOX2D& other)
+    {
+        return minx <= other.maxx && maxx >= other.minx &&
+            miny <= other.maxy && maxy >= other.miny;
+    }
+
+    std::string toBox(uint32_t precision = 8) const
+    {
+        std::stringstream oss;
+
+        oss.precision(precision);
+        oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+
+        oss << "box2d(";
+            oss << minx << " " << miny << ", ";
+            oss << maxx << " " << maxy << ")";
+        return oss.str();
+    }
+
+    std::string toWKT(uint32_t precision = 8) const
+    {
+        std::stringstream oss;
+
+        oss.precision(precision);
+        oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+
+        oss << "POLYGON ((";
+
+        oss << minx << " " << miny << ", ";
+        oss << minx << " " << maxy << ", ";
+        oss << maxx << " " << maxy << ", ";
+        oss << maxx << " " << miny << ", ";
+        oss << minx << " " << miny;
+        oss << "))";
+
+        return oss.str();
+    }
+
+    /// Returns a staticly-allocated Bounds extent that represents infinity
+    static const BOX2D& getDefaultSpatialExtent();
+};
+
+class PDAL_DLL BOX3D : private BOX2D
+{
+public:
+    using BOX2D::minx;
+    using BOX2D::maxx;
+    using BOX2D::miny;
+    using BOX2D::maxy;
+    double minz;
+    double maxz;
+
+    BOX3D()
+       { clear(); }
+
+    BOX3D(const BOX3D& box) :
+        BOX2D(box), minz(box.minz), maxz(box.maxz)
+    {}
+
+    BOX3D(double minx, double miny, double minz, double maxx, double maxy,
+        double maxz) : BOX2D(minx, miny, maxx, maxy), minz(minz), maxz(maxz)
+    {}
+
+
+    bool empty() const;
+    void grow(double x, double y, double z);
+    void clear();
+
+    bool contains(double x, double y, double z) const
+    {
+        return BOX2D::contains(x, y) && minz <= z && z <= maxz;
+    }
+
+    bool contains(const BOX3D& other) const
+    {
+        return BOX2D::contains(other) &&
+            minz <= other.minz && other.maxz <= maxz;
+    }
+
+    bool equal(const BOX3D& other) const
+    {
+        return  BOX2D::contains(other) &&
+            minz == other.minz && maxz == other.maxz;
+    }
+
+    bool operator==(BOX3D const& rhs) const
+    {
+        return equal(rhs);
+    }
+
+    bool operator!=(BOX3D const& rhs) const
+    {
+        return (!equal(rhs));
+    }
+
+    void grow(const BOX3D& other)
+    {
+        BOX2D::grow(other);
+        if (other.minz < minz) minz = other.minz;
+        if (other.maxz > maxz) maxz = other.maxz;
+    }
+
+    void clip(double x, double y, double z)
+    {
+        BOX2D::clip(x, y);
+        if (z > maxz) minz = z;
+        if (z < maxz) maxz = z;
+    }
+
+    void clip(const BOX3D& other)
+    {
+        BOX2D::clip(other);
+        if (other.minz < minz) minz = other.minz;
+        if (other.maxz > maxz) maxz = other.maxz;
+    }
+
+    bool overlaps(const BOX3D& other)
+    {
+        return BOX2D::overlaps(other) &&
+           minz <= other.maxz && maxz >= other.minz;
+    }
+
+    BOX2D to2d() const
+    {
+        return *this;
+    }
+    std::string toBox(uint32_t precision = 8) const
+    {
+        std::stringstream oss;
+
+        oss.precision(precision);
+        oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+
+        oss << "box3d(" << minx << " " << miny << " " << minz << ", " <<
+            maxx << " " << maxy << " " << maxz << ")";
+        return oss.str();
+    }
+
+    std::string toWKT(uint32_t precision = 8) const
+    {
+        std::stringstream oss;
+
+        oss.precision(precision);
+        oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+
+        oss << "POLYHEDRON Z ( ";
+
+        oss << "((" << minx << " " << miny << " " << minz << ", " <<
+                       maxx << " " << miny << " " << minz << ", " <<
+                       maxx << " " << maxy << " " << minz << ", " <<
+                       minx << " " << maxy << " " << minz << ", " <<
+                       minx << " " << miny << " " << minz << ", " <<
+               ")), ";
+        oss << "((" << minx << " " << miny << " " << minz << ", " <<
+                       maxx << " " << miny << " " << minz << ", " <<
+                       maxx << " " << miny << " " << maxz << ", " <<
+                       minx << " " << miny << " " << maxz << ", " <<
+                       minx << " " << miny << " " << minz << ", " <<
+               ")), ";
+        oss << "((" << maxx << " " << miny << " " << minz << ", " <<
+                       maxx << " " << maxy << " " << minz << ", " <<
+                       maxx << " " << maxy << " " << maxz << ", " <<
+                       maxx << " " << miny << " " << maxz << ", " <<
+                       maxx << " " << miny << " " << minz << ", " <<
+               ")), ";
+        oss << "((" << maxx << " " << maxy << " " << minz << ", " <<
+                       minx << " " << maxy << " " << minz << ", " <<
+                       minx << " " << maxy << " " << maxz << ", " <<
+                       maxx << " " << maxy << " " << maxz << ", " <<
+                       maxx << " " << maxy << " " << minz << ", " <<
+               ")), ";
+        oss << "((" << minx << " " << maxy << " " << minz << ", " <<
+                       minx << " " << miny << " " << minz << ", " <<
+                       minx << " " << miny << " " << maxz << ", " <<
+                       minx << " " << maxy << " " << maxz << ", " <<
+                       minx << " " << maxy << " " << minz << ", " <<
+               ")), ";
+        oss << "((" << minx << " " << miny << " " << maxz << ", " <<
+                       maxx << " " << miny << " " << maxz << ", " <<
+                       maxx << " " << maxy << " " << maxz << ", " <<
+                       minx << " " << maxy << " " << maxz << ", " <<
+                       minx << " " << miny << " " << maxz << ", " <<
+               "))";
+
+        oss << " )";
+
+        return oss.str();
+    }
+
+    /// Returns a staticly-allocated Bounds extent that represents infinity
+    static const BOX3D& getDefaultSpatialExtent();
+};
+
+inline std::ostream& operator << (std::ostream& ostr, const BOX2D& bounds)
+{
+    if (bounds.empty())
+    {
+        ostr << "()";
+        return ostr;
+    }
+
+    auto savedPrec = ostr.precision();
+    ostr.precision(16); // or..?
+    ostr << "(";
+    ostr << "[" << bounds.minx << ", " << bounds.maxx << "], " <<
+            "[" << bounds.miny << ", " << bounds.maxy << "]";
+    ostr << ")";
+    ostr.precision(savedPrec);
+    return ostr;
+}
+
+inline std::ostream& operator << (std::ostream& ostr, const BOX3D& bounds)
+{
+    if (bounds.empty())
+    {
+        ostr << "()";
+        return ostr;
+    }
+
+    auto savedPrec = ostr.precision();
+    ostr.precision(16); // or..?
+    ostr << "(";
+    ostr << "[" << bounds.minx << ", " << bounds.maxx << "], " <<
+            "[" << bounds.miny << ", " << bounds.maxy << "], " <<
+            "[" << bounds.minz << ", " << bounds.maxz << "]";
+    ostr << ")";
+    ostr.precision(savedPrec);
+    return ostr;
+}
+
+extern PDAL_DLL std::istream& operator>>(std::istream& istr, BOX2D& bounds);
+extern PDAL_DLL std::istream& operator>>(std::istream& istr, BOX3D& bounds);
+
+} // namespace pdal
diff --git a/include/pdal/util/Charbuf.hpp b/include/pdal/util/Charbuf.hpp
new file mode 100644
index 0000000..9807851
--- /dev/null
+++ b/include/pdal/util/Charbuf.hpp
@@ -0,0 +1,74 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <streambuf>
+#include <iostream>
+#include <vector>
+
+namespace pdal
+{
+
+// Turns a vector into a streambuf.
+class PDAL_DLL Charbuf : public std::streambuf
+{
+public:
+    Charbuf() : m_bufOffset(0)
+        {}
+    Charbuf (std::vector<char>& v, pos_type bufOffset = 0)
+        { initialize(v.data(), v.size(), bufOffset); }
+    Charbuf (char *buf, size_t count, pos_type bufOffset = 0)
+        { initialize(buf, count, bufOffset); }
+
+    void initialize(char *buf, size_t count, pos_type bufOffset = 0);
+
+protected:
+    std::ios::pos_type seekpos(std::ios::pos_type pos,
+        std::ios_base::openmode which = std::ios_base::in | std::ios_base::out);
+    std::ios::pos_type seekoff(std::ios::off_type off,
+        std::ios_base::seekdir dir,
+        std::ios_base::openmode which = std::ios_base::in | std::ios_base::out);
+
+private:
+    // The offset allows one to use offsets when seeking that refer not to
+    // the positions in the backing vector, but to some other reference point.
+    std::ios::pos_type m_bufOffset;
+    // For the put pointer, it seems we need the beginning of the buffer
+    // in order to deal with offsets.
+    char *m_buf;
+};
+
+} //namespace pdal
diff --git a/include/pdal/util/Endian.hpp b/include/pdal/util/Endian.hpp
new file mode 100644
index 0000000..66eacc7
--- /dev/null
+++ b/include/pdal/util/Endian.hpp
@@ -0,0 +1,110 @@
+// Stolen from libLAS' endian.hpp
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  libLAS - http://liblas.org - A BSD library for LAS format data.
+ * Purpose:  Endian macros
+ * Author:   Mateusz Loskot, mateusz at loskot.net
+ *
+ * This file has been stolen from <boost/endian.hpp> and
+ * modified for libLAS purposes.
+ *
+ * (C) Copyright Mateusz Loskot 2007, mateusz at loskot.net
+ * (C) Copyright Caleb Epstein 2005
+ * (C) Copyright John Maddock 2006
+ * Distributed under the Boost  Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ * Revision History
+ * 06 Feb 2006 - Initial Revision
+ * 09 Nov 2006 - fixed variant and version bits for v4 guids
+ * 13 Nov 2006 - added serialization
+ * 17 Nov 2006 - added name-based guid creation
+ * 20 Nov 2006 - add fixes for gcc (from Tim Blechmann)
+ * 07 Mar 2007 - converted to header only
+ * 20 Jan 2008 - removed dependency of Boost and modified for libLAS (by Mateusz Loskot)
+ ******************************************************************************
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ *
+ * Copyright notice reproduced from <boost/detail/limits.hpp>, from
+ * which this code was originally taken.
+ *
+ * Modified by Caleb Epstein to use <endian.h> with GNU libc and to
+ * defined the BOOST_ENDIAN macro.
+ ****************************************************************************/
+
+#pragma once
+
+# define SWAP_BE_TO_LE(p) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + sizeof(p) - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
+
+# define SWAP_LE_TO_BE(p) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + sizeof(p) - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
+
+# define SWAP_BE_TO_LE_N(p, n) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + n - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
+
+# define SWAP_LE_TO_BE_N(p, n) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + n - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
+
+# define SWAP_ENDIANNESS(p) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + sizeof(p) - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
+
+
+# define SWAP_ENDIANNESS_N(p, n) \
+    do { \
+        char* first = static_cast<char*>(static_cast<void*>(&p)); \
+        char* last = first + n - 1; \
+        for(; first < last; ++first, --last) { \
+            char const x = *last; \
+            *last = *first; \
+            *first = x; \
+        }} while(false)
diff --git a/include/pdal/util/Extractor.hpp b/include/pdal/util/Extractor.hpp
new file mode 100644
index 0000000..9014f2b
--- /dev/null
+++ b/include/pdal/util/Extractor.hpp
@@ -0,0 +1,398 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Dimension.hpp>
+#include <pdal/pdal_macros.hpp>
+
+#include "portable_endian.hpp"
+
+namespace pdal
+{
+
+/// Stream wrapper for input of binary data from a buffer.
+class PDAL_DLL Extractor
+{
+public:
+    Extractor(const char *buf, std::size_t size) : m_eback(buf),
+        m_egptr(buf + size), m_gptr(buf)
+    {}
+
+public:
+    operator bool ()
+        { return good(); }
+    void seek(std::size_t pos)
+        { m_gptr = m_eback + pos; }
+    void skip(std::size_t cnt)
+        { m_gptr += cnt; }
+    size_t position() const
+        { return m_gptr - m_eback; }
+    bool good() const
+        { return m_gptr < m_egptr; }
+
+    void get(std::string& s, size_t size)
+    {
+        s = std::string(m_gptr, size);
+        m_gptr += size;
+        while (--size)
+        {
+            if (s[size] != '\0')
+                break;
+            else if (size == 0)
+            {
+                s.clear();
+                return;
+            }
+        }
+        s.resize(size + 1);
+    }
+
+    void get(std::vector<char>& buf)
+    {
+        memcpy((char *)buf.data(), m_gptr, buf.size());
+        m_gptr += buf.size();
+    }
+
+    void get(std::vector<unsigned char>& buf)
+    {
+        memcpy((char *)buf.data(), m_gptr, buf.size());
+        m_gptr += buf.size();
+    }
+
+    void get(char *buf, size_t size)
+    {
+        memcpy(buf, m_gptr, size);
+        m_gptr += size;
+    }
+
+    void get(unsigned char *buf, size_t size)
+    {
+        memcpy(buf, m_gptr, size);
+        m_gptr += size;
+    }
+
+protected:
+    // Beginning of the buffer (names come from std::streambuf)
+    const char *m_eback;
+    // End of the buffer.
+    const char *m_egptr;
+    // Current get location.
+    const char *m_gptr;
+};
+
+/// Stream wrapper for input of binary data that converts from little-endian
+/// to host ordering.
+class PDAL_DLL LeExtractor : public Extractor
+{
+public:
+    LeExtractor(const char *buf, std::size_t size) : Extractor(buf, size)
+    {}
+
+    using Extractor::get;
+    void get(Dimension::Type::Enum type, Everything& e)
+    {
+        using namespace Dimension::Type;
+
+        switch (type)
+        {
+        case Unsigned8:
+            *this >> e.u8;
+            break;
+        case Unsigned16:
+            *this >> e.u16;
+            break;
+        case Unsigned32:
+            *this >> e.u32;
+            break;
+        case Unsigned64:
+            *this >> e.u64;
+            break;
+        case Signed8:
+            *this >> e.s8;
+            break;
+        case Signed16:
+            *this >> e.s16;
+            break;
+        case Signed32:
+            *this >> e.s32;
+            break;
+        case Signed64:
+            *this >> e.s64;
+            break;
+        case Float:
+            *this >> e.f;
+            break;
+        case Double:
+            *this >> e.d;
+            break;
+        case None:
+            break;
+        }
+    }
+
+    LeExtractor& operator >> (uint8_t& v)
+    {
+        v = *(const uint8_t *)m_gptr++;
+        return *this;
+    }
+
+    LeExtractor& operator >> (int8_t& v)
+    {
+        v = *(const int8_t *)m_gptr++;
+        return *this;
+    }
+
+    LeExtractor& operator >> (uint16_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = le16toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (int16_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = (int16_t)le16toh((uint16_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (uint32_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = le32toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (int32_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = (int32_t)le32toh((uint32_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (uint64_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = le64toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (int64_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = (int64_t)le64toh((uint64_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (float& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        uint32_t tmp = le32toh(*(uint32_t *)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    LeExtractor& operator >> (double& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        uint64_t tmp = le64toh(*(uint64_t *)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        m_gptr += sizeof(v);
+        return *this;
+    }
+};
+
+
+/// Stream wrapper for input of binary data that converts from little-endian
+/// to host ordering.
+class PDAL_DLL SwitchableExtractor : public Extractor
+{
+public:
+    static const bool DefaultIsLittleEndian = true;
+
+    SwitchableExtractor(const char* buf, std::size_t size)
+        : Extractor(buf, size)
+        , m_isLittleEndian(DefaultIsLittleEndian)
+    {
+    }
+
+    SwitchableExtractor(const char* buf, std::size_t size, bool isLittleEndian)
+        : Extractor(buf, size)
+        , m_isLittleEndian(isLittleEndian)
+    {
+    }
+
+    bool isLittleEndian() const { return m_isLittleEndian; }
+    void switchToLittleEndian() { m_isLittleEndian = true; }
+    void switchToBigEndian() { m_isLittleEndian = false; }
+
+    using Extractor::get;
+    void get(Dimension::Type::Enum type, Everything& e)
+    {
+        using namespace Dimension::Type;
+
+        switch (type)
+        {
+        case Unsigned8:
+            *this >> e.u8;
+            break;
+        case Unsigned16:
+            *this >> e.u16;
+            break;
+        case Unsigned32:
+            *this >> e.u32;
+            break;
+        case Unsigned64:
+            *this >> e.u64;
+            break;
+        case Signed8:
+            *this >> e.s8;
+            break;
+        case Signed16:
+            *this >> e.s16;
+            break;
+        case Signed32:
+            *this >> e.s32;
+            break;
+        case Signed64:
+            *this >> e.s64;
+            break;
+        case Float:
+            *this >> e.f;
+            break;
+        case Double:
+            *this >> e.d;
+            break;
+        case None:
+            break;
+        }
+    }
+
+    SwitchableExtractor& operator>>(uint8_t& v)
+    {
+        v = *(const uint8_t*)m_gptr++;
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(int8_t& v)
+    {
+        v = *(const int8_t*)m_gptr++;
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(uint16_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? le16toh(v) : be16toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(int16_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? (int16_t)le16toh((uint16_t)v)
+                             : (int16_t)be16toh((uint16_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(uint32_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? le32toh(v) : be32toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(int32_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? (int32_t)le32toh((uint32_t)v)
+                             : (int32_t)be32toh((uint32_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(uint64_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? le64toh(v) : be64toh(v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(int64_t& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        v = isLittleEndian() ? (int64_t)le64toh((uint64_t)v)
+                             : (int64_t)be64toh((uint64_t)v);
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(float& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        uint32_t tmp = isLittleEndian() ? le32toh(*(uint32_t*)(&v))
+                                        : be32toh(*(uint32_t*)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+    SwitchableExtractor& operator>>(double& v)
+    {
+        memcpy(&v, m_gptr, sizeof(v));
+        uint64_t tmp = isLittleEndian() ? le64toh(*(uint64_t*)(&v))
+                                        : be64toh(*(uint64_t*)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        m_gptr += sizeof(v);
+        return *this;
+    }
+
+private:
+    bool m_isLittleEndian;
+};
+
+
+} // namespace pdal
diff --git a/include/pdal/util/FileUtils.hpp b/include/pdal/util/FileUtils.hpp
new file mode 100644
index 0000000..2150ac3
--- /dev/null
+++ b/include/pdal/util/FileUtils.hpp
@@ -0,0 +1,127 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <cassert>
+#include <cmath>
+#include <cstdint>
+#include <istream>
+#include <ostream>
+#include <stdexcept>
+#include <string>
+
+#ifndef PDAL_DLL
+#if defined(_WIN32)
+#   define PDAL_DLL   __declspec(dllexport)
+#else
+#  if defined(USE_GCC_VISIBILITY_FLAG)
+#    define PDAL_DLL     __attribute__ ((visibility("default")))
+#  else
+#    define PDAL_DLL
+#  endif
+#endif
+#endif
+
+namespace pdal
+{
+
+// this is a static class -- do not instantiate]
+class PDAL_DLL FileUtils
+{
+public:
+    // open existing file for reading
+    static std::istream* openFile(std::string const& filename,
+        bool asBinary=true);
+
+    // open new file for writing
+    static std::ostream* createFile(std::string const& filename,
+        bool asBinary=true);
+
+    static bool directoryExists(std::string const& dirname);
+    static bool createDirectory(std::string const& dirname);
+    static void deleteDirectory(std::string const& dirname);
+
+    static void closeFile(std::ostream* ofs);
+    static void closeFile(std::istream* ifs);
+
+    static bool deleteFile(const std::string& filename);
+    static void renameFile(const std::string& dest, const std::string& src);
+    static bool fileExists(const std::string& filename);
+    static uintmax_t fileSize(const std::string& filename);
+
+    // reads a file into a text string for you
+    static std::string readFileIntoString(const std::string& filename);
+
+    // return current working dir
+    // the result will always have a trailing '/'
+    static std::string getcwd();
+
+    // return the file component of the given path,
+    // e.g. "d:/foo/bar/a.c" -> "a.c"
+    static std::string getFilename(const std::string& path);
+
+    // return the directory component of the given path,
+    // e.g. "d:/foo/bar/a.c" -> "d:/foo/bar"
+    // the result will always have a trailing '/'
+    static std::string getDirectory(const std::string& path);
+
+    // returns true iff the path is not relative
+    static bool isAbsolutePath(const std::string& path);
+
+    // if the filename is an absolute path, just return it
+    // otherwise, make it absolute (relative to current working dir)
+    // and return that
+    static std::string toAbsolutePath(const std::string& filename);
+
+    // if the filename is an absolute path, just return it
+    // otherwise, make it absolute (relative to base dir) and return that
+    //
+    // note: if base dir is not absolute, first make it absolute via
+    // toAbsolutePath(base)
+    static std::string toAbsolutePath(const std::string& filename,
+        const std::string base);
+    
+    static std::string readFileAsString(std::string const& filename);
+    static void fileTimes(const std::string& filename, struct tm *createTime,
+        struct tm *modTime);
+
+private:
+    static std::string addTrailingSlash(std::string path);
+
+    FileUtils& operator=(const FileUtils&); // not implemented
+    FileUtils(const FileUtils&); // not implemented;
+};
+
+} // namespace pdal
diff --git a/include/pdal/util/Georeference.hpp b/include/pdal/util/Georeference.hpp
new file mode 100644
index 0000000..983a4c1
--- /dev/null
+++ b/include/pdal/util/Georeference.hpp
@@ -0,0 +1,92 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+
+namespace pdal
+{
+namespace georeference
+{
+
+
+struct Xyz
+{
+    Xyz(double x, double y, double z)
+        : X(x)
+        , Y(y)
+        , Z(z)
+    {
+    }
+
+    double X;
+    double Y;
+    double Z;
+};
+
+
+struct RotationMatrix
+{
+    // Row-major
+    RotationMatrix(double m00, double m01, double m02, double m10, double m11,
+                   double m12, double m20, double m21, double m22)
+        : m00(m00)
+        , m01(m01)
+        , m02(m02)
+        , m10(m10)
+        , m11(m11)
+        , m12(m12)
+        , m20(m20)
+        , m21(m21)
+        , m22(m22)
+    {
+    }
+
+    double m00, m01, m02, m10, m11, m12, m20, m21, m22;
+};
+
+
+inline RotationMatrix createIdentityMatrix()
+{
+    return RotationMatrix(1, 0, 0, 0, 1, 0, 0, 0, 1);
+}
+
+
+// Returns Latitude, Longitude, Height triplet with angles in radians
+PDAL_DLL Xyz georeferenceWgs84(double range, double scanAngle,
+                      const RotationMatrix& boresightMatrix,
+                      const RotationMatrix& imuMatrix, const Xyz& gpsPoint);
+}
+}
diff --git a/include/pdal/util/IStream.hpp b/include/pdal/util/IStream.hpp
new file mode 100644
index 0000000..e008ff5
--- /dev/null
+++ b/include/pdal/util/IStream.hpp
@@ -0,0 +1,346 @@
+/******************************************************************************
+* Copyright (c) 2014, Andrew Bell
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <sys/types.h>
+#include <stdint.h>
+
+#include <fstream>
+#include <memory>
+#include <stack>
+#include <vector>
+#include <cstring>
+
+#include <pdal/pdal_export.hpp>
+
+#include "portable_endian.hpp"
+
+namespace pdal
+{
+
+class IStreamMarker;
+
+/// Stream wrapper for input of binary data.
+class PDAL_DLL IStream
+{
+public:
+    IStream() : m_stream(NULL), m_fstream(NULL)
+        {}
+    IStream(const std::string& filename) : m_stream(NULL), m_fstream(NULL)
+        { open(filename); }
+    IStream(std::istream *stream) : m_stream(stream), m_fstream(NULL)
+        {}
+    ~IStream()
+        { delete m_fstream; }
+
+    int open(const std::string& filename)
+    {
+        if (m_stream)
+             return -1;
+        m_stream = m_fstream = new std::ifstream(filename,
+            std::ios_base::in | std::ios_base::binary);
+        return 0;
+    }
+    operator bool ()
+        { return (bool)(*m_stream); }
+    void seek(std::streampos pos)
+        { m_stream->seekg(pos, std::istream::beg); }
+    void seek(std::streampos pos, std::ios_base::seekdir way)
+        { m_stream->seekg(pos, way); }
+    void skip(std::streamoff offset)
+        { m_stream->seekg(offset, std::istream::cur); }
+    std::streampos position() const
+        { return m_stream->tellg(); }
+    bool good() const
+        { return m_stream->good(); }
+    std::istream *stream()
+        { return m_stream; }
+    void pushStream(std::istream *strm)
+    {
+        m_streams.push(m_stream);
+        m_stream = strm;
+    }
+    std::istream *popStream()
+    {
+        // Can't pop the last stream for now.
+        if (m_streams.empty())
+            return nullptr;
+        std::istream *strm = m_stream;
+        m_stream = m_streams.top();
+        m_streams.pop();
+        return strm;
+    }
+
+    void get(std::string& s, size_t size)
+    {
+        // Could do this by appending to a string with a stream, but this
+        // is probably fast enough for now (there's only a simple increment
+        // to advance an istream iterator, which you'd have to call in a loop).
+        std::unique_ptr<char[]> buf(new char[size+1]);
+        m_stream->read(buf.get(), size);
+        buf[size] = '\0';
+        s = buf.get();
+    }
+
+    void get(std::vector<char>& buf)
+        { m_stream->read(&buf[0], buf.size()); }
+
+    void get(std::vector<unsigned char>& buf)
+        { m_stream->read((char *)&buf[0], buf.size()); }
+
+    void get(char *buf, size_t size)
+        { m_stream->read(buf, size); }
+
+    void get(unsigned char *buf, size_t size)
+        { m_stream->read((char *)buf, size); }
+
+protected:
+    std::istream *m_stream;
+    std::istream *m_fstream; // Dup of above to facilitate cleanup.
+
+private:
+    std::stack<std::istream *> m_streams;
+	IStream(const IStream&);
+};
+
+/// Stream wrapper for input of binary data that converts from little-endian
+/// to host ordering.
+class ILeStream : public IStream
+{
+public:
+    ILeStream()
+    {}
+    ILeStream(const std::string& filename) : IStream(filename)
+    {}
+    ILeStream(std::istream *stream) : IStream(stream)
+    {}
+
+    ILeStream& operator >> (uint8_t& v)
+    {
+        v = (uint8_t)m_stream->get();
+        return *this;
+    }
+
+    ILeStream& operator >> (int8_t& v)
+    {
+        v = (int8_t)m_stream->get();
+        return *this;
+    }
+
+    ILeStream& operator >> (uint16_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = le16toh(v);
+        return *this;
+    }
+
+    ILeStream& operator >> (int16_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = (int16_t)le16toh((uint16_t)v);
+        return *this;
+    }
+
+    ILeStream& operator >> (uint32_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = le32toh(v);
+        return *this;
+    }
+
+    ILeStream& operator >> (int32_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = (int32_t)le32toh((uint32_t)v);
+        return *this;
+    }
+
+    ILeStream& operator >> (uint64_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = le64toh(v);
+        return *this;
+    }
+
+    ILeStream& operator >> (int64_t& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        v = (int64_t)le64toh((uint64_t)v);
+        return *this;
+    }
+
+    ILeStream& operator >> (float& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        uint32_t tmp = le32toh(*(uint32_t *)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        return *this;
+    }
+
+    ILeStream& operator >> (double& v)
+    {
+        m_stream->read((char *)&v, sizeof(v));
+        uint64_t tmp = le64toh(*(uint64_t *)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        return *this;
+    }
+};
+
+
+/// Stream wrapper for input of binary data that converts from
+/// either little-endian or big-endian to host ordering,
+/// depending on object settings
+class ISwitchableStream : public IStream
+{
+public:
+    static const bool DefaultIsLittleEndian = true;
+
+    ISwitchableStream()
+        : m_isLittleEndian(DefaultIsLittleEndian)
+    {
+    }
+    ISwitchableStream(const std::string& filename)
+        : IStream(filename)
+        , m_isLittleEndian(DefaultIsLittleEndian)
+    {
+    }
+    ISwitchableStream(std::istream* stream)
+        : IStream(stream)
+        , m_isLittleEndian(DefaultIsLittleEndian)
+    {
+    }
+
+    bool isLittleEndian() const { return m_isLittleEndian; }
+    void switchToLittleEndian() { m_isLittleEndian = true; }
+    void switchToBigEndian() { m_isLittleEndian = false; }
+
+    ISwitchableStream& operator>>(uint8_t& v)
+    {
+        v = (uint8_t)m_stream->get();
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(int8_t& v)
+    {
+        v = (int8_t)m_stream->get();
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(uint16_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? le16toh(v) : be16toh(v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(int16_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? (int16_t)le16toh((uint16_t)v)
+                             : (int16_t)be16toh((uint16_t)v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(uint32_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? le32toh(v) : be32toh(v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(int32_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? (int32_t)le32toh((uint32_t)v)
+                             : (int32_t)be32toh((uint32_t)v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(uint64_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? le64toh(v) : be64toh(v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(int64_t& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        v = isLittleEndian() ? (int64_t)le64toh((uint64_t)v)
+                             : (int64_t)be64toh((uint64_t)v);
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(float& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        uint32_t tmp = isLittleEndian() ? le32toh(*(uint32_t*)(&v))
+                                        : be32toh(*(uint32_t*)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        return *this;
+    }
+
+    ISwitchableStream& operator>>(double& v)
+    {
+        m_stream->read((char*)&v, sizeof(v));
+        uint64_t tmp = isLittleEndian() ? be64toh(*(uint64_t*)(&v))
+                                        : be64toh(*(uint64_t*)(&v));
+        std::memcpy(&v, &tmp, sizeof(tmp));
+        return *this;
+    }
+
+private:
+    bool m_isLittleEndian;
+};
+
+
+/// Stream position marker with rewinding support.
+class IStreamMarker
+{
+public:
+    IStreamMarker(IStream& stream) : m_stream(stream)
+        { m_pos = m_stream.position(); }
+
+    void rewind()
+        { m_stream.seek(m_pos); }
+
+private:
+    std::streampos m_pos;
+    IStream& m_stream;
+	IStreamMarker(const IStreamMarker&);
+    IStreamMarker& operator=(const IStreamMarker&); // not implemented
+};
+
+} // namespace pdal
diff --git a/include/pdal/util/Inserter.hpp b/include/pdal/util/Inserter.hpp
new file mode 100644
index 0000000..bb481c0
--- /dev/null
+++ b/include/pdal/util/Inserter.hpp
@@ -0,0 +1,230 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+#pragma once
+
+#include "portable_endian.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL Inserter
+{
+public:
+    Inserter(unsigned char *buf, std::size_t size) : m_pbase((char *)buf),
+        m_epptr((char *)buf + size), m_pptr((char *)buf)
+    {}
+    Inserter(char *buf, std::size_t size) : m_pbase(buf),
+        m_epptr(buf + size), m_pptr(buf)
+    {}
+
+protected:
+    // Base pointer - start of buffer (names taken from std::streambuf).
+    char *m_pbase;
+    // End pointer.
+    char *m_epptr;
+    // Current position.
+    char *m_pptr;
+
+public:
+    operator bool() const
+        { return good(); }
+    bool good() const
+        { return m_pptr < m_epptr; }
+    void seek(std::size_t pos)
+        { m_pptr = m_pbase + pos; }
+    void put(const std::string& s)
+        { put(s, s.size()); }
+    void put(std::string s, size_t len)
+    {
+        s.resize(len);
+        put(s.data(), len);
+    }
+    void put(const char *c, size_t len)
+    {
+        memcpy(m_pptr, c, len);
+        m_pptr += len;
+    }
+    void put(const unsigned char *c, size_t len)
+    {
+        memcpy(m_pptr, c, len);
+        m_pptr += len;
+    }
+    std::size_t position() const
+        { return m_pptr - m_pbase; }
+};
+
+/// Stream wrapper for output of binary data that converts from host ordering
+/// to little endian format
+class PDAL_DLL LeInserter : public Inserter
+{
+public:
+    LeInserter(char *buf, std::size_t size) : Inserter(buf, size)
+    {}
+    LeInserter(unsigned char *buf, std::size_t size) : Inserter(buf, size)
+    {}
+
+    using Inserter::put;
+    void put(Dimension::Type::Enum type, const Everything& e)
+    {
+       using namespace Dimension::Type;
+
+        switch (type)
+        {
+        case Unsigned8:
+            *this << e.u8;
+            break;
+        case Unsigned16:
+            *this << e.u16;
+            break;
+        case Unsigned32:
+            *this << e.u32;
+            break;
+        case Unsigned64:
+            *this << e.u64;
+            break;
+        case Signed8:
+            *this << e.s8;
+            break;
+        case Signed16:
+            *this << e.s16;
+            break;
+        case Signed32:
+            *this << e.s32;
+            break;
+        case Signed64:
+            *this << e.s64;
+            break;
+        case Float:
+            *this << e.f;
+            break;
+        case Double:
+            *this << e.d;
+            break;
+        case None:
+            break;
+        }
+    }
+
+    LeInserter& operator << (uint8_t v)
+    {
+        *m_pptr++ = (char)v;
+        return *this;
+    }
+
+    LeInserter& operator << (int8_t v)
+    {
+        *m_pptr++ = v;
+        return *this;
+    }
+
+    LeInserter& operator << (uint16_t v)
+    {
+        v = htole16(v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (int16_t v)
+    {
+        v = (int16_t)htole16((uint16_t)v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (uint32_t v)
+    {
+        v = htole32(v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (int32_t v)
+    {
+        v = (int32_t)htole32((uint32_t)v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (uint64_t v)
+    {
+        v = htole64(v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (int64_t v)
+    {
+        v = (int64_t)htole64((uint64_t)v);
+        memcpy(m_pptr, &v, sizeof(v));
+        m_pptr += sizeof(v);
+        return *this;
+    }
+
+    LeInserter& operator << (float v)
+    {
+        union
+        {
+            float f;
+            uint32_t u;
+        } uu;
+
+        uu.f = v;
+        uu.u = htole32(uu.u);
+        memcpy(m_pptr, &uu.f, sizeof(uu.f));
+        m_pptr += sizeof(uu.f);
+        return *this;
+    }
+
+    LeInserter& operator << (double v)
+    {
+        union
+        {
+            double d;
+            uint64_t u;
+        } uu;
+
+        uu.d = v;
+        uu.u = htole64(uu.u);
+        memcpy(m_pptr, &uu.d, sizeof(uu.d));
+        m_pptr += sizeof(uu.d);
+        return *this;
+    }
+};
+
+} // namespace pdal
diff --git a/include/pdal/util/OStream.hpp b/include/pdal/util/OStream.hpp
new file mode 100644
index 0000000..f288e8a
--- /dev/null
+++ b/include/pdal/util/OStream.hpp
@@ -0,0 +1,227 @@
+/******************************************************************************
+* Copyright (c) 2014, Andrew Bell
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+#pragma once
+
+#include <sys/types.h>
+#include <stdint.h>
+
+#include <fstream>
+#include <cstring>
+#include <stack>
+
+#include <pdal/pdal_internal.hpp>
+
+#include "portable_endian.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL OStream
+{
+public:
+    OStream() : m_stream(NULL), m_fstream(NULL)
+        {}
+    OStream(const std::string& filename) : m_stream(NULL), m_fstream(NULL)
+        { open(filename); }
+    OStream(std::ostream *stream) : m_stream(stream), m_fstream(NULL)
+        {}
+    ~OStream()
+        { delete m_fstream; }
+
+    int open(const std::string& filename)
+    {
+        if (m_stream)
+            return -1;
+        m_stream = m_fstream = new std::ofstream(filename,
+            std::ios_base::out | std::ios_base::binary);
+        return 0;
+    }
+    void close()
+    {
+        flush();
+        delete m_fstream;
+        m_fstream = NULL;
+        m_stream = NULL;
+    }
+    void flush()
+        { m_stream->flush(); }
+    operator bool ()
+        { return (bool)(*m_stream); }
+    void seek(std::streampos pos)
+        { m_stream->seekp(pos, std::ostream::beg); }
+    void put(const std::string& s)
+        { put(s, s.size()); }
+    void put(const std::string& s, size_t len)
+    {
+        std::string os = s;
+        os.resize(len);
+        m_stream->write(os.c_str(), len);
+    }
+    void put(const char *c, size_t len)
+        { m_stream->write(c, len); }
+    void put(const unsigned char *c, size_t len)
+        { m_stream->write((const char *)c, len); }
+    std::streampos position() const
+        { return m_stream->tellp(); }
+    void pushStream(std::ostream *strm)
+    {
+        m_streams.push(m_stream);
+        m_stream = strm;
+    }
+    std::ostream *popStream()
+    {
+        // Can't pop the last stream for now.
+        if (m_streams.empty())
+            return nullptr;
+        std::ostream *strm = m_stream;
+        m_stream = m_streams.top();
+        m_streams.pop();
+        return strm;
+    }
+
+protected:
+    std::ostream *m_stream;
+    std::ostream *m_fstream; // Dup of above to facilitate cleanup.
+
+private:
+    std::stack<std::ostream *> m_streams;
+    OStream(const OStream&);
+};
+
+/// Stream wrapper for output of binary data that converts from host ordering
+/// to little endian format
+class PDAL_DLL OLeStream : public OStream
+{
+public:
+    OLeStream()
+    {}
+    OLeStream(const std::string& filename) : OStream(filename)
+    {}
+    OLeStream(std::ostream *stream) : OStream(stream)
+    {}
+
+    OLeStream& operator << (uint8_t v)
+    {
+        m_stream->put((char)v);
+        return *this;
+    }
+
+    OLeStream& operator << (int8_t v)
+    {
+        m_stream->put((char)v);
+        return *this;
+    }
+
+    OLeStream& operator << (uint16_t v)
+    {
+        v = htole16(v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (int16_t v)
+    {
+        v = (int16_t)htole16((uint16_t)v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (uint32_t v)
+    {
+        v = htole32(v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (int32_t v)
+    {
+        v = (int32_t)htole32((uint32_t)v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (uint64_t v)
+    {
+        v = htole64(v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (int64_t v)
+    {
+        v = (int64_t)htole64((uint64_t)v);
+        m_stream->write((char *)&v, sizeof(v));
+        return *this;
+    }
+
+    OLeStream& operator << (float v)
+    {
+        uint32_t tmp(0);
+        std::memcpy(&tmp, &v, sizeof(v));
+        tmp = htole32(tmp);
+        m_stream->write((char *)&tmp, sizeof(tmp));
+        return *this;
+    }
+
+    OLeStream& operator << (double v)
+    {
+        uint64_t tmp(0);
+        std::memcpy(&tmp, &v, sizeof(v));
+        tmp = htole64(tmp);
+        m_stream->write((char *)&tmp, sizeof(tmp));
+        return *this;
+    }
+};
+
+/// Stream position marker with rewinding/reset support.
+class OStreamMarker
+{
+public:
+    OStreamMarker(OStream& stream) : m_stream(stream)
+        { m_pos = m_stream.position(); }
+
+    void mark()
+        { m_pos = m_stream.position(); }
+    void rewind()
+        { m_stream.seek(m_pos); }
+
+private:
+    std::streampos m_pos;
+    OStream& m_stream;
+        
+    OStreamMarker(const OStreamMarker&);  // not implemented
+    OStreamMarker& operator=(const OStreamMarker&);  // not implemented
+};
+
+} // namespace pdal
diff --git a/include/pdal/util/Utils.hpp b/include/pdal/util/Utils.hpp
new file mode 100644
index 0000000..4fc220d
--- /dev/null
+++ b/include/pdal/util/Utils.hpp
@@ -0,0 +1,490 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <algorithm>
+#include <string>
+#include <cassert>
+#include <cctype>
+#include <stdexcept>
+#include <cmath>
+#include <fstream>
+#include <istream>
+#include <limits>
+#include <cstring>
+#include <sstream>
+#include <vector>
+#include <map>
+
+#include <boost/numeric/conversion/cast.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace pdal
+{
+
+namespace Utils
+{
+    template<typename T>
+    char *as_buffer(T& data)
+        { return static_cast<char*>(static_cast<void*>(&data)); }
+
+    template<typename T>
+    char *as_buffer(T* data)
+        { return static_cast<char*>(static_cast<void*>(data)); }
+
+    template <typename C, typename T>
+    bool check_stream_state(std::basic_ios<C, T>& srtm)
+    {
+        // Test stream state bits
+        if (srtm.eof())
+            throw std::out_of_range("end of file encountered");
+        else if (srtm.fail())
+            throw std::runtime_error("non-fatal I/O error occured");
+        else if (srtm.bad())
+            throw std::runtime_error("fatal I/O error occured");
+        return true;
+    }
+
+    PDAL_DLL void random_seed(unsigned int seed);
+    PDAL_DLL double random(double minimum, double maximum);
+    PDAL_DLL double uniform(const double& minimum=0.0f,
+        const double& maximum=1.0f, uint32_t seed=0);
+    PDAL_DLL double normal(const double& mean=0.0f, const double& sigma=1.0f,
+        uint32_t seed=0);
+
+    // compares two values to within a given tolerance
+    // the value |tolerance| is compared to |actual - expected|
+    template<class T>
+    bool compare_approx(const T& actual, const T& expected, const T& tolerance)
+    {
+        double diff = std::abs((double)actual - (double)expected);
+        return diff <= std::abs((double) tolerance);
+    }
+
+    // compares two values to within the datatype's epsilon
+    template<class T>
+    bool compare_distance(const T& actual, const T& expected)
+    {
+        const T epsilon = std::numeric_limits<T>::epsilon();
+        return compare_approx<T>(actual, expected, epsilon);
+    }
+
+    // From http://stackoverflow.com/questions/485525/round-for-float-in-c
+    inline double sround(double r)
+        { return (r > 0.0) ? floor(r + 0.5) : ceil(r - 0.5); }
+
+    inline std::vector<uint8_t>
+    hex_string_to_binary(std::string const& source)
+    {
+        // Stolen from http://stackoverflow.com/questions/7363774/  ...
+        //    c-converting-binary-data-to-a-hex-string-and-back
+        static int nibbles[] =
+            { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0,
+              10, 11, 12, 13, 14, 15 };
+        std::vector<unsigned char> retval;
+        for (auto it = source.begin(); it < source.end(); it += 2) {
+            unsigned char v = 0;
+            if (::isxdigit(*it))
+                v = (unsigned char)nibbles[::toupper(*it) - '0'] << 4;
+            if (it + 1 < source.end() && ::isxdigit(*(it + 1)))
+                v += (unsigned char)nibbles[::toupper(*(it + 1)) - '0'];
+            retval.push_back(v);
+        }
+        return retval;
+    }
+
+    inline void binary_to_hex_stream(unsigned char* source,
+        std::ostream& destination, int start, int end )
+    {
+        static char syms[] = "0123456789ABCDEF";
+        for (int i = start; i != end; i++)
+            destination << syms[((source[i] >> 4) & 0xf)] <<
+                           syms[source[i] & 0xf];
+    }
+
+    inline std::string binary_to_hex_string(
+        const std::vector<unsigned char>& source)
+    {
+        static char syms[] = "0123456789ABCDEF";
+        std::stringstream ss;
+        for (std::vector<unsigned char>::const_iterator it = source.begin();
+                it != source.end(); it++)
+            ss << syms[((*it >> 4) & 0xf)] << syms[*it & 0xf];
+
+        return ss.str();
+    }
+
+    inline std::string tolower(const std::string& s)
+    {
+        std::string out;
+        for (size_t i = 0; i < s.size(); ++i)
+            out += (char)std::tolower(s[i]);
+        return out;
+    }
+
+    inline std::string toupper(const std::string& s)
+    {
+        std::string out;
+        for (size_t i = 0; i < s.size(); ++i)
+            out += (char)std::toupper(s[i]);
+        return out;
+    }
+
+    inline bool iequals(const std::string& s, const std::string& s2)
+    {
+        if (s.length() != s2.length())
+            return false;
+        for (size_t i = 0; i < s.length(); ++i)
+            if (std::toupper(s[i]) != std::toupper(s2[i]))
+                return false;
+        return true;
+    }
+
+    inline bool startsWith(const std::string& s, const std::string& prefix)
+    {
+        if (prefix.size() > s.size())
+            return false;
+        return (strncmp(prefix.data(), s.data(), prefix.size()) == 0);
+    }
+
+    inline int cksum(char *buf, size_t size)
+    {
+        int i = 0;
+        while (size--)
+            i += *buf++;
+        return i;
+    }
+
+    PDAL_DLL void *registerPlugin(void *stageFactoryPtr,
+        std::string const& filename, std::string const& registerMethodName,
+        std::string const& versionMethodName);
+
+    PDAL_DLL char *getenv(const char *env);
+    PDAL_DLL std::string getenv(std::string const& name);
+    PDAL_DLL int putenv(const char *env);
+
+    // aid to operator>> parsers
+    PDAL_DLL void eatwhitespace(std::istream& s);
+    PDAL_DLL void trimLeading(std::string& s);
+    PDAL_DLL void trimTrailing(std::string& s);
+    inline void trim(std::string& s)
+    {
+        trimLeading(s);
+        trimTrailing(s);
+    }
+    // if char found, eats it and returns true; otherwise, don't eat it and
+    // then return false
+    PDAL_DLL bool eatcharacter(std::istream& s, char x);
+    PDAL_DLL uint32_t getStreamPrecision(double scale);
+    PDAL_DLL void *getDLLSymbol(std::string const& library,
+        std::string const& name);
+    PDAL_DLL std::string base64_encode(const unsigned char *buf, size_t size);
+    inline std::string base64_encode(std::vector<uint8_t> const& bytes)
+        { return base64_encode(bytes.data(), bytes.size()); }
+    PDAL_DLL std::vector<uint8_t>
+    base64_decode(std::string const& input);
+
+    PDAL_DLL FILE* portable_popen(const std::string& command,
+        const std::string& mode);
+    PDAL_DLL int portable_pclose(FILE* fp);
+    PDAL_DLL int run_shell_command(const std::string& cmd, std::string& output);
+    PDAL_DLL std::string replaceAll(std::string result,
+        const std::string& replaceWhat, const std::string& replaceWithWhat);
+    PDAL_DLL StringList wordWrap(std::string const& inputString,
+        size_t lineLength);
+    PDAL_DLL std::string escapeJSON(const std::string &s);
+    PDAL_DLL std::string demangle(const std::string& s);
+    PDAL_DLL int screenWidth();
+    PDAL_DLL std::string escapeNonprinting(const std::string& s);
+    PDAL_DLL std::string hexDump(const char *buf, size_t count);
+
+    /// Split a string into substrings.  Characters matching the predicate are
+    ///   discarded.
+    /// \param[in] s  String to split.
+    /// \param[in] p  Predicate returns true if a char in a string is a split
+    ///   location.
+    /// \return  Vector of substrings.
+    template<typename PREDICATE>
+    PDAL_DLL std::vector<std::string> split(const std::string& s, PREDICATE p)
+    {
+        std::vector<std::string> result;
+
+        if (s.empty())
+            return result;
+
+        auto it = s.begin();
+        decltype(it) endIt;
+        do
+        {
+            endIt = std::find_if(it, s.end(), p);
+            result.push_back(std::string(it, endIt));
+            it = endIt + 1;
+        } while (endIt != s.end());
+        return result;
+    }
+
+    /// Split a string into substrings.  Characters matching the predicate are
+    ///   discarded, as are empty strings otherwise produced by split().
+    /// \param[in] s  String to split.
+    /// \param[in] p  Predicate returns true if a char in a string is a split
+    ///   location.
+    /// \return  Vector of substrings.
+    template<typename PREDICATE>
+    PDAL_DLL std::vector<std::string> split2(const std::string& s, PREDICATE p)
+    {
+        std::vector<std::string> result;
+
+        if (s.empty())
+            return result;
+
+        auto it = s.begin();
+        decltype(it) endIt;
+        do
+        {
+            endIt = std::find_if(it, s.end(), p);
+            if (it != endIt)
+                result.push_back(std::string(it, endIt));
+            it = endIt + 1;
+        } while (endIt != s.end());
+        return result;
+    }
+
+    inline PDAL_DLL std::vector<std::string>
+    split(const std::string& s, char tChar)
+    {
+        auto pred = [tChar](char c){ return(c == tChar); };
+        return split(s, pred);
+    }
+
+
+    inline PDAL_DLL std::vector<std::string>
+    split2(const std::string& s, char tChar)
+    {
+        auto pred = [tChar](char c){ return(c == tChar); };
+        return split2(s, pred);
+    }
+
+    template<typename T>
+    std::string typeidName()
+        { return Utils::demangle(typeid(T).name()); }
+
+    template<typename KEY, typename VALUE>
+    bool contains(const std::map<KEY, VALUE>& c, const KEY& v)
+        { return c.find(v) != c.end(); }
+
+    template<typename COLLECTION, typename VALUE>
+    bool contains(const COLLECTION& c, const VALUE& v)
+        { return (std::find(c.begin(), c.end(), v) != c.end()); }
+
+    struct RedirectStream
+    {
+        std::ofstream *m_out;
+        std::streambuf *m_buf;
+    };
+
+    /// Redirect a stream to some file, by default /dev/null.
+    /// \param[in] out   Stream to redirect.
+    /// \param[in] file  Name of file where stream should be redirected.
+    /// \return  Context for stream restoration (see restore()).
+    inline RedirectStream redirect(std::ostream& out,
+        const std::string& file = "/dev/null")
+    {
+        RedirectStream redir;
+
+        redir.m_out = new std::ofstream(file);
+        redir.m_buf = out.rdbuf();
+        out.rdbuf(redir.m_out->rdbuf());
+        return redir;
+    }
+
+    /// Restore a stream redirected with redirect().
+    /// \param[in] out  Stream to be restored.
+    /// \param[in] redir RedirectStream returned from corresponding
+    /// redirect() call.
+    inline void restore(std::ostream& out, RedirectStream redir)
+    {
+        out.rdbuf(redir.m_buf);
+        redir.m_out->close();
+    }
+
+    //ABELL - This is certainly not as efficient as boost::numeric_cast, but
+    //  has the advantage of not requiring an exception to indicate an error.
+    //  We should investigate incorporating a version of boost::numeric_cast
+    //  that avoids the exception for an error.
+    // Determine whether a value of a given input type may be safely
+    // statically casted to the given output type without over/underflow.  If
+    // the output type is integral, inRange() will determine whether the
+    // rounded input value, rather than truncated, may be safely converted.
+    template<typename T_OUT>
+    bool inRange(double in)
+    {
+        if (std::is_integral<T_OUT>::value)
+        {
+            in = sround((double)in);
+        }
+
+        return std::is_same<double, T_OUT>::value ||
+           (in >= static_cast<double>(std::numeric_limits<T_OUT>::lowest()) &&
+            in <= static_cast<double>(std::numeric_limits<T_OUT>::max()));
+    }
+
+    template<typename T_IN, typename T_OUT>
+    bool inRange(T_IN in)
+    {
+        return std::is_same<T_IN, T_OUT>::value ||
+            inRange<T_OUT>(static_cast<double>(in));
+    }
+
+    template<typename T_IN, typename T_OUT>
+    bool numericCast(T_IN in, T_OUT& out)
+    {
+        if (std::is_same<T_IN, T_OUT>::value)
+        {
+            out = static_cast<T_OUT>(in);
+            return true;
+        }
+        if (std::is_integral<T_OUT>::value)
+            in = static_cast<T_IN>(sround((double)in));
+        if ((std::is_same<T_OUT, double>::value) ||
+            (in <= static_cast<double>(std::numeric_limits<T_OUT>::max()) &&
+             in >= static_cast<double>(std::numeric_limits<T_OUT>::lowest())))
+        {
+            out = static_cast<T_OUT>(in);
+            return true;
+        }
+        return false;
+    }
+
+    template<typename T>
+    std::string toString(const T& from)
+    {
+        std::ostringstream oss;
+        oss << from;
+        return oss.str();
+    }
+
+    // There is an overload of std::to_string() for float and double, but
+    // its behavior is different from streaming and doesn't match what
+    // we have been doing historically.
+
+    inline std::string toString(long long from)
+        { return std::to_string(from); }
+
+    inline std::string toString(unsigned long from)
+        { return std::to_string(from); }
+
+    inline std::string toString(long from)
+        { return std::to_string(from); }
+
+    inline std::string toString(unsigned int from)
+        { return std::to_string(from); }
+
+    inline std::string toString(int from)
+        { return std::to_string(from); }
+
+    inline std::string toString(unsigned short from)
+        { return std::to_string((int)from); }
+
+    inline std::string toString(short from)
+        { return std::to_string((int)from); }
+
+    inline std::string toString(char from)
+        { return std::to_string((int)from); }
+
+    inline std::string toString(unsigned char from)
+        { return std::to_string((int)from); }
+
+    inline std::string toString(signed char from)
+        { return std::to_string((int)from); }
+
+    template<typename T>
+    bool fromString(const std::string& from, T& to)
+    {
+        try
+        {
+            to = boost::lexical_cast<T>(from);
+        }
+        catch (boost::bad_lexical_cast&)
+        {
+            return false;
+        }
+        return true;
+    }
+
+    template<>
+    inline bool fromString<char>(const std::string& s, char& to)
+    {
+        int i = std::stoi(s);
+        if (i >= std::numeric_limits<char>::lowest() &&
+            i <= std::numeric_limits<char>::max())
+        {
+            to = static_cast<char>(i);
+            return true;
+        }
+        return false;
+    }
+
+    template<>
+    inline bool fromString<unsigned char>(const std::string& s,
+        unsigned char& to)
+    {
+        int i = std::stoi(s);
+        if (i >= std::numeric_limits<unsigned char>::lowest() &&
+            i <= std::numeric_limits<unsigned char>::max())
+        {
+            to = static_cast<unsigned char>(i);
+            return true;
+        }
+        return false;
+    }
+
+    template<>
+    inline bool fromString<signed char>(const std::string& s, signed char& to)
+    {
+        int i = std::stoi(s);
+        if (i >= std::numeric_limits<signed char>::lowest() &&
+            i <= std::numeric_limits<signed char>::max())
+        {
+            to = static_cast<signed char>(i);
+            return true;
+        }
+        return false;
+    }
+
+} // namespace Utils
+} // namespace pdal
+
diff --git a/include/pdal/util/portable_endian.hpp b/include/pdal/util/portable_endian.hpp
new file mode 100644
index 0000000..7a5fa21
--- /dev/null
+++ b/include/pdal/util/portable_endian.hpp
@@ -0,0 +1,115 @@
+// (c) Mathias Panzenböck
+// http://github.com/panzi/mathfun/blob/master/examples/portable_endian.h
+//
+
+#pragma once
+ 
+#if (defined(_WIN16) || defined(_WIN32) || defined(_WIN64)) && !defined(__WINDOWS__)
+  
+#   define __WINDOWS__
+   
+#endif
+    
+#if defined(__linux__) || defined(__CYGWIN__)
+     
+#   include <endian.h>
+      
+#elif defined(__APPLE__)
+       
+#   include <machine/endian.h>
+#   include <libkern/OSByteOrder.h>
+        
+#   define htobe16 OSSwapHostToBigInt16
+#   define htole16 OSSwapHostToLittleInt16
+#   define be16toh OSSwapBigToHostInt16
+#   define le16toh OSSwapLittleToHostInt16
+         
+#   define htobe32 OSSwapHostToBigInt32
+#   define htole32 OSSwapHostToLittleInt32
+#   define be32toh OSSwapBigToHostInt32
+#   define le32toh OSSwapLittleToHostInt32
+          
+#   define htobe64 OSSwapHostToBigInt64
+#   define htole64 OSSwapHostToLittleInt64
+#   define be64toh OSSwapBigToHostInt64
+#   define le64toh OSSwapLittleToHostInt64
+           
+/**
+#   define __BYTE_ORDER    BYTE_ORDER
+#   define __BIG_ENDIAN    BIG_ENDIAN
+#   define __LITTLE_ENDIAN LITTLE_ENDIAN
+#   define __PDP_ENDIAN    PDP_ENDIAN
+**/
+            
+#elif defined(__OpenBSD__)
+             
+#   include <sys/endian.h>
+              
+#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
+               
+#   include <sys/endian.h>
+                
+#   define be16toh betoh16
+#   define le16toh letoh16
+                 
+#   define be32toh betoh32
+#   define le32toh letoh32
+                  
+#   define be64toh betoh64
+#   define le64toh letoh64
+                   
+#elif defined(__WINDOWS__)
+                    
+#   include <winsock2.h>
+                     
+#   if BYTE_ORDER == LITTLE_ENDIAN
+                      
+#       define htobe16 htons
+#       define htole16(x) (x)
+#       define be16toh ntohs
+#       define le16toh(x) (x)
+                       
+#       define htobe32 htonl
+#       define htole32(x) (x)
+#       define be32toh ntohl
+#       define le32toh(x) (x)
+                        
+#       define htobe64 htonll
+#       define htole64(x) (x)
+#       define be64toh ntohll
+#       define le64toh(x) (x)
+                         
+#   elif BYTE_ORDER == BIG_ENDIAN
+                          
+                                /* that would be xbox 360 */
+#       define htobe16(x) (x)
+#       define htole16(x) __builtin_bswap16(x)
+#       define be16toh(x) (x)
+#       define le16toh(x) __builtin_bswap16(x)
+                                 
+#       define htobe32(x) (x)
+#       define htole32(x) __builtin_bswap32(x)
+#       define be32toh(x) (x)
+#       define le32toh(x) __builtin_bswap32(x)
+                                  
+#       define htobe64(x) (x)
+#       define htole64(x) __builtin_bswap64(x)
+#       define be64toh(x) (x)
+#       define le64toh(x) __builtin_bswap64(x)
+                                   
+#   else
+                                    
+#       error byte order not supported
+                                     
+#   endif
+                                      
+#   define __BYTE_ORDER    BYTE_ORDER
+#   define __BIG_ENDIAN    BIG_ENDIAN
+#   define __LITTLE_ENDIAN LITTLE_ENDIAN
+#   define __PDP_ENDIAN    PDP_ENDIAN
+                                       
+#else
+                                        
+#   error platform not supported
+                                         
+#endif
diff --git a/io/CMakeLists.txt b/io/CMakeLists.txt
new file mode 100644
index 0000000..cbf5787
--- /dev/null
+++ b/io/CMakeLists.txt
@@ -0,0 +1,13 @@
+add_subdirectory(bpf)
+add_subdirectory(derivative)
+add_subdirectory(faux)
+add_subdirectory(las)
+add_subdirectory(null)
+add_subdirectory(optech)
+add_subdirectory(ply)
+add_subdirectory(qfit)
+add_subdirectory(sbet)
+add_subdirectory(text)
+add_subdirectory(terrasolid)
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} PARENT_SCOPE)
diff --git a/io/bpf/BpfCompressor.cpp b/io/bpf/BpfCompressor.cpp
new file mode 100644
index 0000000..a7ad226
--- /dev/null
+++ b/io/bpf/BpfCompressor.cpp
@@ -0,0 +1,132 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "BpfCompressor.hpp"
+
+#include <pdal/pdal_internal.hpp>
+
+namespace pdal
+{
+
+void BpfCompressor::startBlock()
+{
+    // Initialize the stream.
+    m_strm.zalloc = Z_NULL;
+    m_strm.zfree = Z_NULL;
+    m_strm.opaque = Z_NULL;
+    if (deflateInit(&m_strm, Z_DEFAULT_COMPRESSION) != Z_OK)
+        throw pdal_error("Could not initialize BPF compressor.");
+
+    m_rawSize = 0;
+    m_compressedSize = 0;
+    uint32_t rawSize = 0;
+    uint32_t compressedSize = 0;
+
+    // Initiailize the streambuf with the backing buffer.
+    m_charbuf.initialize(m_inbuf.data(), m_inbuf.size());
+
+    // Note our position so that we can rewind here.
+    m_blockStart.mark();
+    m_out << rawSize << compressedSize;
+
+    // Make a new stream from our charbuf and push it so that future writes
+    // to our stream go to the backing vector.
+    m_out.pushStream(new std::ostream(&m_charbuf));
+}
+
+
+void BpfCompressor::compress()
+{
+    // Note our position so that we know how much we've written.
+    std::size_t rawWritten = m_out.position();
+
+    // Pop our temp stream so that we can write the real output file.
+    m_out.popStream();
+
+    m_rawSize += rawWritten;
+
+    // Deflate the data in the buffer and write it to the output stream.
+    m_strm.avail_in = rawWritten;
+    m_strm.next_in = (unsigned char *)m_inbuf.data();
+    m_strm.avail_out = CHUNKSIZE;
+    m_strm.next_out = m_tmpbuf;
+    while (m_strm.avail_in)
+    {
+        int ret = ::deflate(&m_strm, Z_NO_FLUSH);
+        size_t written = CHUNKSIZE - m_strm.avail_out;
+        m_compressedSize += written;
+        m_out.put(m_tmpbuf, written);
+        m_strm.avail_out = CHUNKSIZE;
+        m_strm.next_out = m_tmpbuf;
+    }
+
+    // All data has been written.  Reinitialize input buffer's streambuf and
+    // push it.
+    m_charbuf.initialize(m_inbuf.data(), m_inbuf.size());
+    m_out.pushStream(new std::ostream(&m_charbuf));
+}
+
+
+void BpfCompressor::finish()
+{
+    // Pop our special stream so that we can write the the file.
+    m_out.popStream();
+
+    // Deflate and write the result to the output file.
+    int ret = Z_OK;
+    while (ret == Z_OK)
+    {
+        ret = ::deflate(&m_strm, Z_FINISH);
+        size_t written = CHUNKSIZE - m_strm.avail_out;
+        m_compressedSize += written;
+        m_out.put(m_tmpbuf, written);
+        m_strm.avail_out = CHUNKSIZE;
+        m_strm.next_out = m_tmpbuf;
+    }
+    if (ret != Z_STREAM_END)
+        throw pdal_error("Couldn't close BPF compression stream.");
+    deflateEnd(&m_strm);
+
+    // Mark our position so that we can get back here.
+    OStreamMarker blockEnd(m_out);
+
+    // Rewind to the start of the block and write the size bytes.
+    m_blockStart.rewind();
+    m_out << (uint32_t)m_rawSize << (uint32_t)m_compressedSize;
+
+    // Set the position back to the end of the block.
+    blockEnd.rewind();
+}
+   
+} // namespace pdal
diff --git a/io/bpf/BpfCompressor.hpp b/io/bpf/BpfCompressor.hpp
new file mode 100644
index 0000000..4852293
--- /dev/null
+++ b/io/bpf/BpfCompressor.hpp
@@ -0,0 +1,70 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <ostream>
+#include <zlib.h>
+
+#include <pdal/util/Charbuf.hpp>
+#include <pdal/util/OStream.hpp>
+
+namespace pdal
+{
+
+class BpfCompressor
+{
+public:
+    BpfCompressor(OLeStream& out, size_t maxSize) :
+        m_out(out), m_inbuf(maxSize), m_blockStart(out), m_rawSize(0),
+        m_compressedSize(0)
+    {}
+    void startBlock();
+    void finish();
+    void compress();
+   
+private:
+    static const int CHUNKSIZE = 1000000;
+
+    OLeStream& m_out;
+    Charbuf m_charbuf;
+    std::vector<char> m_inbuf;
+    z_stream m_strm;
+    unsigned char m_tmpbuf[CHUNKSIZE];
+    OStreamMarker m_blockStart;
+    size_t m_rawSize;
+    size_t m_compressedSize;
+};
+
+} // namespace pdal
diff --git a/io/bpf/BpfHeader.cpp b/io/bpf/BpfHeader.cpp
new file mode 100644
index 0000000..0632dc6
--- /dev/null
+++ b/io/bpf/BpfHeader.cpp
@@ -0,0 +1,391 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <iostream>
+
+#include <boost/lexical_cast.hpp>
+
+#include <pdal/util/IStream.hpp>
+#include <pdal/util/OStream.hpp>
+
+#include "BpfHeader.hpp"
+
+namespace pdal
+{
+
+ILeStream& operator >> (ILeStream& stream, BpfMuellerMatrix& m)
+{
+    for (size_t i = 0; i < (sizeof(m.m_vals) / sizeof(m.m_vals[0])); ++i)
+        stream >> m.m_vals[i];
+    return stream;
+}
+
+
+OLeStream& operator << (OLeStream& stream, BpfMuellerMatrix& m)
+{
+    for (size_t i = 0; i < (sizeof(m.m_vals) / sizeof(m.m_vals[0])); ++i)
+        stream << m.m_vals[i];
+    return stream;
+}
+
+
+bool BpfHeader::read(ILeStream& stream)
+{
+    IStreamMarker mark(stream);
+    if (!readV3(stream))
+    {
+        mark.rewind();
+        if (!readV1(stream))
+        {
+            if (m_version < 1 || m_version > 3)
+                m_log->get(LogLevel::Error) << "Unsupported BPF version = " <<
+                    m_version << ".\n";
+            else
+                m_log->get(LogLevel::Error) << "Couldn't read BPF header.\n";
+            return false;
+        }
+    }
+    return true;
+}
+
+bool BpfHeader::readV3(ILeStream& stream)
+{
+    m_log->get(LogLevel::Debug) << "BPF: Reading V3\n";
+
+    uint8_t dummyChar;
+    uint8_t interleave;
+    std::string magic;
+
+    stream.get(magic, 4);
+    if (magic != "BPF!")
+        return false;
+
+    stream.get(m_ver, 4);
+    m_version = boost::lexical_cast<int32_t>(m_ver);
+
+    uint8_t numDim;
+    stream >> m_len >> numDim >> interleave >> m_compression >>
+        dummyChar >> m_numPts >> m_coordType >> m_coordId >> m_spacing >>
+        m_xform >> m_startTime >> m_endTime;
+    m_numDim = (int32_t)numDim;
+
+    switch (interleave)
+    {
+    case 0:
+        m_pointFormat = BpfFormat::DimMajor;
+        break;
+    case 1:
+        m_pointFormat = BpfFormat::PointMajor;
+        break;
+    case 2:
+        m_pointFormat = BpfFormat::ByteMajor;
+        break;
+    default:
+        throw "Invalid BPF file: unknown interleave type.";
+    }
+    return (bool)stream;
+}
+
+
+bool BpfHeader::readV1(ILeStream& stream)
+{
+    m_log->get(LogLevel::Debug) << "BPF: Reading V1\n";
+
+    stream >> m_len;
+    stream >> m_version;
+
+    stream >> m_numPts >> m_numDim >> m_coordType >> m_coordId >> m_spacing;
+
+    if (m_version == 1)
+        m_pointFormat = BpfFormat::DimMajor;
+    else if (m_version == 2)
+        m_pointFormat = BpfFormat::PointMajor;
+    else
+        return false;
+
+    // Dimensions should include X, Y, and Z
+    m_numDim += 3;
+
+    BpfDimension xDim;
+    BpfDimension yDim;
+    BpfDimension zDim;
+
+    xDim.m_label = "X";
+    yDim.m_label = "Y";
+    zDim.m_label = "Z";
+
+    stream >> xDim.m_offset >> yDim.m_offset >> zDim.m_offset;
+    stream >> xDim.m_min >> yDim.m_min >> zDim.m_min;
+    stream >> xDim.m_max >> yDim.m_max >> zDim.m_max;
+
+    m_staticDims.resize(3);
+    m_staticDims[0] = xDim;
+    m_staticDims[1] = yDim;
+    m_staticDims[2] = zDim;
+    return (bool)stream;
+}
+
+
+bool BpfHeader::write(OLeStream& stream)
+{
+    uint8_t dummyChar = 0;
+    uint8_t numDim;
+
+    if (!Utils::numericCast(m_numDim, numDim))
+        throw pdal_error("Can't write a BPF file of more than 255 dimensions.");
+
+    stream.put("BPF!");
+    stream.put("0003");
+
+    stream << m_len << numDim << (uint8_t)m_pointFormat << m_compression <<
+        dummyChar << m_numPts << m_coordType << m_coordId << m_spacing <<
+        m_xform << m_startTime << m_endTime;
+    return (bool)stream;
+}
+
+
+bool BpfHeader::readDimensions(ILeStream& stream, BpfDimensionList& dims)
+{
+    size_t staticCnt = m_staticDims.size();
+
+    dims.resize(m_numDim);
+
+    if (static_cast<std::size_t>(m_numDim) < staticCnt)
+    {
+        m_log->get(LogLevel::Error) << "BPF dimension range looks bad.\n";
+        m_log->get(LogLevel::Error) <<
+            "BPF: num dims: " << m_numDim << "\n" <<
+            "BPF: static count: " << staticCnt << "\n";
+
+        m_log->get(LogLevel::Error) << "Dims:\n";
+        for (auto d : dims)
+            m_log->get(LogLevel::Error) << "\t" << d.m_label << "\n";
+
+        m_log->get(LogLevel::Error) << "Static:\n";
+        for (auto d : m_staticDims)
+            m_log->get(LogLevel::Error) << "\t" << d.m_label << "\n";
+    }
+
+    for (size_t d = 0; d < staticCnt; d++)
+        dims.at(d) = m_staticDims[d];
+    if (!BpfDimension::read(stream, dims, staticCnt))
+        return false;
+
+    // Verify that we have an X, Y and Z, so that we don't have to worry
+    // about it later.
+    bool x = false;
+    bool y = false;
+    bool z = false;
+    for (auto d : dims)
+    {
+        if (d.m_label == "X")
+            x = true;
+        if (d.m_label == "Y")
+            y = true;
+        if (d.m_label == "Z")
+            z = true;
+    }
+    if (!x || !y || !z)
+        throw pdal_error("BPF file missing at least one of X, Y or Z "
+            "dimensions.");
+    return true;
+}
+
+
+// This just exists for symmetry.
+void BpfHeader::writeDimensions(OLeStream& stream, BpfDimensionList& dims)
+{
+    BpfDimension::write(stream, dims);
+}
+
+
+void BpfHeader::dump()
+{
+    using namespace std;
+
+    cerr << "Length: " << m_len << "!\n";
+    cerr << "Diemsions: " << (int)m_numDim << "!\n";
+    cerr << "Interleave: " << (int)m_pointFormat << "!\n";
+    cerr << "Compression: " << (int)m_compression << "!\n";
+    cerr << "Point count: " << m_numPts << "!\n";
+    cerr << "Coordinate type: " << m_coordType << "!\n";
+    cerr << "Coordinate ID: " << m_coordId << "!\n";
+    cerr << "Spacing: " << m_spacing << "!\n";
+    cerr << "Start time: " << m_startTime << "!\n";
+    cerr << "End time: " << m_endTime << "!\n";
+}
+
+
+bool BpfDimension::read(ILeStream& stream, BpfDimensionList& dims, size_t start)
+{
+    for (size_t d = start; d < dims.size(); ++d)
+        stream >> dims[d].m_offset;
+    for (size_t d = start; d < dims.size(); ++d)
+        stream >> dims[d].m_min;
+    for (size_t d = start; d < dims.size(); ++d)
+        stream >> dims[d].m_max;
+    for (size_t d = start; d < dims.size(); ++d)
+        stream.get(dims[d].m_label, 32);
+    return (bool)stream;
+}
+
+
+bool BpfDimension::write(OLeStream& stream, BpfDimensionList& dims)
+{
+    for (size_t d = 0; d < dims.size(); ++d)
+        stream << dims[d].m_offset;
+    for (size_t d = 0; d < dims.size(); ++d)
+        stream << dims[d].m_min;
+    for (size_t d = 0; d < dims.size(); ++d)
+        stream << dims[d].m_max;
+    for (size_t d = 0; d < dims.size(); ++d)
+        stream.put(dims[d].m_label, 32);
+    return (bool)stream;
+}
+
+
+bool BpfUlemHeader::read(ILeStream& stream)
+{
+    std::string magic;
+    IStreamMarker mark(stream);
+
+    stream.get(magic, 4);
+    if (magic != "ULEM")
+    {
+        mark.rewind();
+        return false;
+    }
+    stream >> m_numFrames >> m_year >> m_month >> m_day >> m_lidarMode >>
+        m_wavelen >> m_pulseFreq >> m_focalWidth >> m_focalHeight >>
+        m_pixelPitchWidth >> m_pixelPitchHeight;
+    stream.get(m_classCode, 32);
+    return (bool)stream;
+}
+
+bool BpfUlemFrame::read(ILeStream& stream)
+{
+    stream >> m_num >> m_roll >> m_pitch >> m_heading >> m_xform >>
+        m_shortEncoder >> m_longEncoder;
+    return (bool)stream;
+}
+
+bool BpfUlemFile::read(ILeStream& stream)
+{
+    IStreamMarker mark(stream);
+    std::string magic;
+
+    stream.get(magic, 4);
+    if (magic != "FILE")
+    {
+        mark.rewind();
+        return false;
+    }
+    stream >> m_len;
+    stream.get(m_filename, 32);
+    Utils::trimTrailing(m_filename);
+    m_buf.resize(m_len);
+    stream.get(m_buf);
+
+    return (bool)stream;
+}
+
+bool BpfUlemFile::write(OLeStream& stream)
+{
+    stream.put("FILE", 4);
+    stream << m_len;
+    stream.put(m_filename, 32);
+
+    std::ifstream in(m_filespec);
+    uint32_t len = m_len;
+
+    const uint32_t MAX_BLOCKSIZE = 1000000;
+    char buf[MAX_BLOCKSIZE];
+    while (len)
+    {
+        uint32_t blocksize = std::min(MAX_BLOCKSIZE, len);
+        in.read(buf, blocksize);
+        stream.put(buf, blocksize);
+        len -= blocksize;
+    }
+    return true;
+}
+
+bool BpfPolarStokesParam::read(ILeStream& stream)
+{
+    stream >> m_x >> m_y >> m_z >> m_a;
+    return (bool)stream;
+}
+
+bool BpfPolarHeader::read(ILeStream& stream)
+{
+    IStreamMarker mark(stream);
+
+    std::string magic;
+    stream.get(magic, 4);
+    if (magic != "POL$")
+    {
+        mark.rewind();
+        return false;
+    }
+
+    int16_t size;
+    stream >> size >> m_numFrames >> m_fpaId >> m_numXmit >> m_numRcv;
+    for (decltype(m_numXmit) i = 0; i < m_numXmit; ++i)
+    {
+        BpfPolarStokesParam vec;
+        vec.read(stream);
+        m_xmitStates.push_back(vec);
+    }
+    for (decltype(m_numRcv) i = 0; i < m_numRcv; ++i)
+    {
+        BpfMuellerMatrix mat;
+        stream >> mat;
+        m_psaSettings.push_back(mat);
+    }
+    return (bool)stream;
+}
+
+bool BpfPolarFrame::read(ILeStream& stream)
+{
+    stream >> m_num >> m_stokesIdx;
+    for (int i = 0; i < 4; ++i)
+        stream >> m_stokesParam[i];
+    for (int i = 0; i < 4; ++i)
+        stream >> m_stokesOutParam[i];
+    stream >> m_xform >> m_truncation;
+    return (bool)stream;
+}
+
+} // namespace pdal
+
diff --git a/io/bpf/BpfHeader.hpp b/io/bpf/BpfHeader.hpp
new file mode 100644
index 0000000..8fc1b44
--- /dev/null
+++ b/io/bpf/BpfHeader.hpp
@@ -0,0 +1,258 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <stdint.h>
+#include <string>
+#include <vector>
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Log.hpp>
+#include <pdal/Metadata.hpp>
+
+namespace pdal
+{
+
+class ILeStream;
+class OLeStream;
+
+struct BpfMuellerMatrix
+{
+    BpfMuellerMatrix()
+    {
+        static const double vals[] = {1.0, 0.0, 0.0, 0.0,
+                         0.0, 1.0, 0.0, 0.0,
+                         0.0, 0.0, 1.0, 0.0,
+                         0.0, 0.0, 0.0, 1.0};
+        memcpy(m_vals, vals, sizeof(vals));
+    }
+
+    double m_vals[16];
+
+    void dump()
+    {
+        for (size_t i = 0; i < 4; ++i)
+            std::cerr << m_vals[i] << '\t';
+        std::cerr << "\n";
+        for (size_t i = 4; i < 8; ++i)
+            std::cerr << m_vals[i] << '\t';
+        std::cerr << "\n";
+        for (size_t i = 8; i < 12; ++i)
+            std::cerr << m_vals[i] << '\t';
+        std::cerr << "\n";
+        for (size_t i = 12; i < 16; ++i)
+            std::cerr << m_vals[i] << '\t';
+        std::cerr << "\n\n";
+        
+    }
+
+    void apply(double& x, double& y, double& z)
+    {
+        double w = x * m_vals[12] + y * m_vals[13] + z * m_vals[14] +
+            m_vals[15];
+
+        x = (x * m_vals[0] + y * m_vals[1] + z * m_vals[2] + m_vals[3]) / w;
+        y = (x * m_vals[4] + y * m_vals[5] + z * m_vals[6] + m_vals[7]) / w;
+        z = (x * m_vals[8] + y * m_vals[9] + z * m_vals[10] + m_vals[11]) / w;
+    }
+};
+ILeStream& operator >> (ILeStream& stream, BpfMuellerMatrix& m);
+OLeStream& operator << (OLeStream& stream, BpfMuellerMatrix& m);
+
+namespace BpfFormat
+{
+enum Enum
+{
+    DimMajor,
+    PointMajor,
+    ByteMajor
+};
+}
+
+namespace BpfCoordType
+{
+enum Enum
+{
+    None,
+    UTM,
+    TCR,
+    ENU
+};
+}
+
+namespace BpfCompression
+{
+enum Enum
+{
+    None,
+    QuickLZ,
+    FastLZ,
+    Zlib
+};
+}
+
+struct BpfDimension
+{
+    BpfDimension() : m_offset(0.0),
+        m_min((std::numeric_limits<double>::max)()),
+        m_max(std::numeric_limits<double>::lowest()),
+        m_id(Dimension::Id::Unknown)
+    {}
+
+    double m_offset;
+    double m_min;
+    double m_max;
+    std::string m_label;
+    Dimension::Id::Enum m_id;
+
+    static bool read(ILeStream& stream, std::vector<BpfDimension>& dims,
+        size_t start);
+    static bool write(OLeStream& stream, std::vector<BpfDimension>& dims);
+};
+typedef std::vector<BpfDimension> BpfDimensionList;
+
+struct BpfHeader
+{
+    BpfHeader() : m_version(0), m_len(176), m_numDim(0),
+        m_compression(BpfCompression::None), m_numPts(0),
+        m_coordType(BpfCoordType::None), m_coordId(0), m_spacing(0.0),
+        m_startTime(0.0), m_endTime(0.0)
+    {}
+
+    int32_t m_version;
+    std::string m_ver;
+    int32_t m_len;
+    int32_t m_numDim;
+    BpfFormat::Enum m_pointFormat;
+    uint8_t m_compression;
+    int32_t m_numPts;
+    int32_t m_coordType;
+    int32_t m_coordId;
+    float m_spacing;
+    BpfMuellerMatrix m_xform;
+    double m_startTime;
+    double m_endTime;
+    std::vector<BpfDimension> m_staticDims;
+    LogPtr m_log;
+
+    void setLog(const LogPtr& log)
+         { m_log = log; }
+    bool read(ILeStream& stream);
+    bool write(OLeStream& stream);
+    bool readV3(ILeStream& stream);
+    bool readV1(ILeStream& stream);
+    bool readDimensions(ILeStream& stream, std::vector<BpfDimension>& dims);
+    void writeDimensions(OLeStream& stream, std::vector<BpfDimension>& dims);
+    void dump();
+};
+
+struct BpfUlemHeader
+{
+    uint32_t m_numFrames;
+    uint16_t m_year;
+    uint8_t m_month;
+    uint8_t m_day;
+    uint16_t m_lidarMode;
+    uint16_t m_wavelen;  // In nm.
+    uint16_t m_pulseFreq;  // In Hz.
+    uint16_t m_focalWidth;
+    uint16_t m_focalHeight;
+    float m_pixelPitchWidth;
+    float m_pixelPitchHeight;
+    std::string m_classCode;
+
+    bool read(ILeStream& stream);
+};
+
+struct BpfUlemFrame
+{
+    int32_t m_num;
+    double m_roll; //x
+    double m_pitch; //y
+    double m_heading; //z
+    BpfMuellerMatrix m_xform;
+    int16_t m_shortEncoder;
+    int16_t m_longEncoder;
+
+    bool read(ILeStream& stream);
+};
+
+struct BpfUlemFile
+{
+    uint32_t m_len;
+    std::string m_filename;
+    std::vector<char> m_buf;
+    std::string m_filespec;
+
+    bool read(ILeStream& stream);
+    bool write(OLeStream& stream);
+};
+
+struct BpfPolarStokesParam
+{
+    float m_x;
+    float m_y;
+    float m_z;
+    float m_a;
+
+    bool read(ILeStream& stream);
+};
+
+struct BpfPolarHeader
+{
+    uint32_t m_numFrames;
+    uint16_t m_fpaId;
+    uint32_t m_numXmit;
+    uint32_t m_numRcv;
+    std::vector<BpfPolarStokesParam> m_xmitStates;
+    std::vector<BpfMuellerMatrix> m_psaSettings;
+
+    bool read(ILeStream& stream);
+};
+
+struct BpfPolarFrame
+{
+public:
+    uint32_t m_num;
+    int16_t m_stokesIdx;
+    float m_stokesParam[4];
+    float m_stokesOutParam[4];
+    BpfMuellerMatrix m_xform;
+    int16_t m_truncation;
+
+    bool read(ILeStream& stream);
+};
+
+} //namespace pdal
diff --git a/io/bpf/BpfReader.cpp b/io/bpf/BpfReader.cpp
new file mode 100644
index 0000000..7ddb45f
--- /dev/null
+++ b/io/bpf/BpfReader.cpp
@@ -0,0 +1,475 @@
+/******************************************************************************
+* Copyright (c) 2014, Andrew Bell
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "BpfReader.hpp"
+
+#include <zlib.h>
+
+#include <pdal/Options.hpp>
+#include <pdal/pdal_export.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.bpf",
+    "\"Binary Point Format\" (BPF) reader support. BPF is a simple \n" \
+        "DoD and research format that is used by some sensor and \n" \
+        "processing chains.",
+    "http://pdal.io/stages/readers.bpf.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, BpfReader, Reader, s_info)
+
+std::string BpfReader::getName() const { return s_info.name; }
+
+void BpfReader::processOptions(const Options&)
+{
+    if (m_filename.empty())
+        throw pdal_error("Can't read BPF file without filename.");
+
+    // Logfile doesn't get set until options are processed.
+    m_header.setLog(log());
+}
+
+
+QuickInfo BpfReader::inspect()
+{
+    QuickInfo qi;
+
+    initialize();
+    qi.m_valid = true;
+    qi.m_pointCount = m_header.m_numPts;
+    qi.m_srs = getSpatialReference();
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        BpfDimension& dim = *di;
+        qi.m_dimNames.push_back(dim.m_label);
+        if (dim.m_label == "X")
+        {
+            qi.m_bounds.minx = dim.m_min;
+            qi.m_bounds.maxx = dim.m_max;
+        }
+        if (dim.m_label == "Y")
+        {
+            qi.m_bounds.miny = dim.m_min;
+            qi.m_bounds.maxy = dim.m_max;
+        }
+        if (dim.m_label == "Z")
+        {
+            qi.m_bounds.minz = dim.m_min;
+            qi.m_bounds.maxz = dim.m_max;
+        }
+    }
+    return qi;
+}
+
+
+// When the stage is intialized, the schema needs to be populated with the
+// dimensions in order to allow subsequent stages to be aware of or append to
+// the dimensions in the PointView.
+void BpfReader::initialize()
+{
+    m_stream.open(m_filename);
+
+    // Resets the stream position in case it was already open.
+    m_stream.seek(0);
+    // In order to know the dimensions we must read the file header.
+    if (!m_header.read(m_stream))
+        return;
+
+    if (!m_header.readDimensions(m_stream, m_dims))
+        return;
+
+    uint32_t zone(abs(m_header.m_coordId));
+    std::string code("");
+    if (m_header.m_coordId > 0)
+        code = "EPSG:326" + boost::lexical_cast<std::string>(zone);
+    else
+        code = "EPSG:327" + boost::lexical_cast<std::string>(zone);
+    SpatialReference srs(code);
+    setSpatialReference(srs);
+
+    if (m_header.m_version >= 3)
+    {
+        readUlemData();
+        if (!m_stream)
+            return;
+        readUlemFiles();
+        if (!m_stream)
+            return;
+        readPolarData();
+    }
+
+    // Read thing after the standard header as metadata->
+    readHeaderExtraData();
+
+    // Fast forward file to end of header as reported by base header.
+    std::streampos pos = m_stream.position();
+    if (pos > m_header.m_len)
+        throw pdal_error("BPF Header length exceeded that reported by file.");
+    else if (pos < m_header.m_len)
+        m_stream.seek(m_header.m_len);
+}
+
+
+void BpfReader::addDimensions(PointLayoutPtr layout)
+{
+    for (size_t i = 0; i < m_dims.size(); ++i)
+    {
+        Dimension::Type::Enum type = Dimension::Type::Float;
+
+        BpfDimension& dim = m_dims[i];
+        if (dim.m_label == "X" ||
+            dim.m_label == "Y" ||
+            dim.m_label == "Z")
+            type = Dimension::Type::Double;
+        dim.m_id = layout->registerOrAssignDim(dim.m_label, type);
+    }
+}
+
+
+bool BpfReader::readUlemData()
+{
+    if (!m_ulemHeader.read(m_stream))
+        return false;
+
+    for (size_t i = 0; i < m_ulemHeader.m_numFrames; i++)
+    {
+        BpfUlemFrame frame;
+        if (!frame.read(m_stream))
+            return false;
+        m_ulemFrames.push_back(frame);
+    }
+    return (bool)m_stream;
+}
+
+
+bool BpfReader::readUlemFiles()
+{
+    BpfUlemFile file;
+    while (file.read(m_stream))
+        m_metadata.addEncoded(file.m_filename,
+            (const unsigned char *)file.m_buf.data(), file.m_len);
+    return (bool)m_stream;
+}
+
+
+/// Encode all data that follows the headers as metadata->
+/// \return  Whether the stream is still valid.
+bool BpfReader::readHeaderExtraData()
+{
+    if (m_stream.position() < m_header.m_len)
+    {
+        std::streampos size = m_header.m_len - m_stream.position();
+        std::vector<uint8_t> buf(size);
+        m_stream.get(buf);
+        m_metadata.addEncoded("header_data", buf.data(), buf.size());
+    }
+    return (bool)m_stream;
+}
+
+
+bool BpfReader::readPolarData()
+{
+    if (!m_polarHeader.read(m_stream))
+        return false;
+    for (size_t i = 0; i < m_polarHeader.m_numFrames; ++i)
+    {
+        BpfPolarFrame frame;
+        if (!frame.read(m_stream))
+            return false;
+        m_polarFrames.push_back(frame);
+    }
+    return (bool)m_stream;
+}
+
+
+void BpfReader::ready(PointTableRef)
+{
+    m_index = 0;
+    m_start = m_stream.position();
+    if (m_header.m_compression)
+    {
+        m_deflateBuf.resize(numPoints() * m_dims.size() * sizeof(float));
+        size_t index = 0;
+        size_t bytesRead = 0;
+        do
+        {
+            bytesRead = readBlock(m_deflateBuf, index);
+            index += bytesRead;
+        } while (bytesRead > 0 && index < m_deflateBuf.size());
+        m_charbuf.initialize(m_deflateBuf.data(), m_deflateBuf.size(), m_start);
+        m_stream.pushStream(new std::istream(&m_charbuf));
+    }
+}
+
+
+void BpfReader::done(PointTableRef)
+{
+     delete m_stream.popStream();
+}
+
+
+point_count_t BpfReader::read(PointViewPtr data, point_count_t count)
+{
+    switch (m_header.m_pointFormat)
+    {
+    case BpfFormat::PointMajor:
+        return readPointMajor(data, count);
+    case BpfFormat::DimMajor:
+        return readDimMajor(data, count);
+    case BpfFormat::ByteMajor:
+        return readByteMajor(data, count);
+    default:
+        break;
+    }
+    return 0;
+}
+
+
+size_t BpfReader::readBlock(std::vector<char>& outBuf, size_t index)
+{
+    uint32_t finalBytes;
+    uint32_t compressBytes;
+
+    m_stream >> finalBytes;
+    m_stream >> compressBytes;
+
+    std::vector<char> in(compressBytes);
+
+    // Fill the input bytes from the stream.
+    m_stream.get(in);
+    int ret = inflate(in.data(), compressBytes,
+        outBuf.data() + index, finalBytes);
+    return (ret ? 0 : finalBytes);
+}
+
+
+bool BpfReader::eof()
+{
+    return m_index >= numPoints();
+}
+
+
+point_count_t BpfReader::readPointMajor(PointViewPtr data, point_count_t count)
+{
+    PointId nextId = data->size();
+    PointId idx = m_index;
+    point_count_t numRead = 0;
+    seekPointMajor(idx);
+    while (numRead < count && idx < numPoints())
+    {
+        for (size_t d = 0; d < m_dims.size(); ++d)
+        {
+            float f;
+
+            m_stream >> f;
+            data->setField(m_dims[d].m_id, nextId, f + m_dims[d].m_offset);
+        }
+
+        // Transformation only applies to X, Y and Z
+        double x = data->getFieldAs<double>(Dimension::Id::X, nextId);
+        double y = data->getFieldAs<double>(Dimension::Id::Y, nextId);
+        double z = data->getFieldAs<double>(Dimension::Id::Z, nextId);
+        m_header.m_xform.apply(x, y, z);
+        data->setField(Dimension::Id::X, nextId, x);
+        data->setField(Dimension::Id::Y, nextId, y);
+        data->setField(Dimension::Id::Z, nextId, z);
+
+        if (m_cb)
+            m_cb(*data, nextId);
+
+        idx++;
+        numRead++;
+        nextId++;
+    }
+    m_index = idx;
+    return numRead;
+}
+
+point_count_t BpfReader::readDimMajor(PointViewPtr data, point_count_t count)
+{
+    PointId idx(0);
+    PointId startId = data->size();
+    point_count_t numRead = 0;
+    for (size_t d = 0; d < m_dims.size(); ++d)
+    {
+        idx = m_index;
+        PointId nextId = startId;
+        numRead = 0;
+        seekDimMajor(d, idx);
+        for (; numRead < count && idx < numPoints(); idx++, numRead++, nextId++)
+        {
+            float f;
+
+            m_stream >> f;
+            data->setField(m_dims[d].m_id, nextId, f + m_dims[d].m_offset);
+        }
+    }
+    m_index = idx;
+
+    // Transformation only applies to X, Y and Z
+    for (PointId idx = startId; idx < data->size(); idx++)
+    {
+        double x = data->getFieldAs<double>(Dimension::Id::X, idx);
+        double y = data->getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = data->getFieldAs<double>(Dimension::Id::Z, idx);
+        m_header.m_xform.apply(x, y, z);
+        data->setField(Dimension::Id::X, idx, x);
+        data->setField(Dimension::Id::Y, idx, y);
+        data->setField(Dimension::Id::Z, idx, z);
+
+        if (m_cb)
+            m_cb(*data, idx);
+    }
+
+    return numRead;
+}
+
+point_count_t BpfReader::readByteMajor(PointViewPtr data, point_count_t count)
+{
+    PointId idx(0);
+    PointId startId = data->size();
+    point_count_t numRead = 0;
+
+    // We need a temp buffer for the point data->
+    union uu
+    {
+        float f;
+        uint32_t u32;
+    };
+    std::unique_ptr<union uu> uArr(
+        new uu[std::min(count, numPoints() - m_index)]);
+
+    for (size_t d = 0; d < m_dims.size(); ++d)
+    {
+        for (size_t b = 0; b < sizeof(float); ++b)
+        {
+            idx = m_index;
+            numRead = 0;
+            PointId nextId = startId;
+            seekByteMajor(d, b, idx);
+
+            for (;numRead < count && idx < numPoints();
+                idx++, numRead++, nextId++)
+            {
+                union uu& u = *(uArr.get() + numRead);
+
+                if (b == 0)
+                    u.u32 = 0;
+                uint8_t u8;
+                m_stream >> u8;
+                u.u32 |= ((uint32_t)u8 << (b * CHAR_BIT));
+                if (b == 3)
+                {
+                    u.f += m_dims[d].m_offset;
+                    data->setField(m_dims[d].m_id, nextId, u.f);
+                }
+            }
+        }
+    }
+    m_index = idx;
+
+    // Transformation only applies to X, Y and Z
+    for (PointId idx = startId; idx < data->size(); idx++)
+    {
+        double x = data->getFieldAs<double>(Dimension::Id::X, idx);
+        double y = data->getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = data->getFieldAs<double>(Dimension::Id::Z, idx);
+        m_header.m_xform.apply(x, y, z);
+        data->setField(Dimension::Id::X, idx, x);
+        data->setField(Dimension::Id::Y, idx, y);
+        data->setField(Dimension::Id::Z, idx, z);
+
+        if (m_cb)
+            m_cb(*data, idx);
+    }
+
+    return numRead;
+}
+
+
+void BpfReader::seekPointMajor(PointId ptIdx)
+{
+    std::streamoff offset = ptIdx * sizeof(float) * m_dims.size();
+    m_stream.seek(m_start + offset);
+}
+
+
+void BpfReader::seekDimMajor(size_t dimIdx, PointId ptIdx)
+{
+    std::streamoff offset = ((sizeof(float) * dimIdx * numPoints()) +
+        (sizeof(float) * ptIdx));
+    m_stream.seek(m_start + offset);
+}
+
+
+void BpfReader::seekByteMajor(size_t dimIdx, size_t byteIdx, PointId ptIdx)
+{
+    std::streamoff offset =
+        (dimIdx * numPoints() * sizeof(float)) +
+        (byteIdx * numPoints()) +
+        ptIdx;
+    m_stream.seek(m_start + offset);
+}
+
+
+int BpfReader::inflate(char *buf, size_t insize, char *outbuf, size_t outsize)
+{
+   if (insize == 0)
+        return 0;
+
+    int ret;
+    z_stream strm;
+
+    /* allocate inflate state */
+    strm.zalloc = Z_NULL;
+    strm.zfree = Z_NULL;
+    strm.opaque = Z_NULL;
+    strm.avail_in = 0;
+    strm.next_in = Z_NULL;
+    if (inflateInit(&strm) != Z_OK)
+        return -2;
+
+    strm.avail_in = insize;
+    strm.next_in = (unsigned char *)buf;
+    strm.avail_out = outsize;
+    strm.next_out = (unsigned char *)outbuf;
+
+    ret = ::inflate(&strm, Z_NO_FLUSH);
+    (void)inflateEnd(&strm);
+    return ret == Z_STREAM_END ? 0 : -1;
+}
+
+} //namespace pdal
diff --git a/io/bpf/BpfReader.hpp b/io/bpf/BpfReader.hpp
new file mode 100644
index 0000000..051ea8a
--- /dev/null
+++ b/io/bpf/BpfReader.hpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2014, Andrew Bell
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// BPF is an NGA specification for point cloud data. The specification can be
+// found at https://nsgreg.nga.mil/doc/view?i=4202
+
+#pragma once
+
+#include <vector>
+
+#include <pdal/Reader.hpp>
+#include <pdal/util/Charbuf.hpp>
+#include <pdal/util/IStream.hpp>
+#include <pdal/pdal_export.hpp>
+
+#include "BpfHeader.hpp"
+
+#include <vector>
+
+extern "C" int32_t BpfReader_ExitFunc();
+extern "C" PF_ExitFunc BpfReader_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL BpfReader : public Reader
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    virtual point_count_t numPoints() const
+        {  return (point_count_t)m_header.m_numPts; }
+private:
+    ILeStream m_stream;
+    BpfHeader m_header;
+    BpfDimensionList m_dims;
+    Dimension::IdList m_schemaDims;
+    BpfUlemHeader m_ulemHeader;
+    std::vector<BpfUlemFrame> m_ulemFrames;
+    BpfPolarHeader m_polarHeader;
+    std::vector<BpfPolarFrame> m_polarFrames;
+    /// Stream position at the beginning of point records.
+    std::streampos m_start;
+    /// Index of the next point to read.
+    point_count_t m_index;
+    /// Buffer for deflated data.
+    std::vector<char> m_deflateBuf;
+    /// Streambuf for deflated data.
+    Charbuf m_charbuf;
+
+    virtual void processOptions(const Options& options);
+    virtual QuickInfo inspect();
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr Layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr data, point_count_t num);
+    virtual void done(PointTableRef table);
+    virtual bool eof();
+
+    bool readUlemData();
+    bool readUlemFiles();
+    bool readHeaderExtraData();
+    bool readPolarData();
+    point_count_t readPointMajor(PointViewPtr data, point_count_t count);
+    point_count_t readDimMajor(PointViewPtr data, point_count_t count);
+    point_count_t readByteMajor(PointViewPtr data, point_count_t count);
+    size_t readBlock(std::vector<char>& outBuf, size_t index);
+
+    int inflate(char *inbuf, size_t insize, char *outbuf, size_t outsize);
+
+    void seekPointMajor(PointId ptIdx);
+    void seekDimMajor(size_t dimIdx, PointId ptIdx);
+    void seekByteMajor(size_t dimIdx, size_t byteIdx, PointId ptIdx);
+};
+
+} // namespace pdal
diff --git a/io/bpf/BpfWriter.cpp b/io/bpf/BpfWriter.cpp
new file mode 100644
index 0000000..3873f80
--- /dev/null
+++ b/io/bpf/BpfWriter.cpp
@@ -0,0 +1,338 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "BpfWriter.hpp"
+
+#include <pdal/Options.hpp>
+#include <pdal/pdal_export.hpp>
+
+#include <zlib.h>
+
+#include "BpfCompressor.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.bpf",
+    "\"Binary Point Format\" (BPF) writer support. BPF is a simple \n" \
+        "DoD and research format that is used by some sensor and \n" \
+        "processing chains.",
+    "http://pdal.io/stages/writers.bpf.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, BpfWriter, Writer, s_info)
+
+std::string BpfWriter::getName() const { return s_info.name; }
+
+Options BpfWriter::getDefaultOptions()
+{
+    Options ops;
+
+    ops.add("filename", "", "Filename for BPF output");
+    ops.add("compression", false, "Whether zlib compression should be used");
+    ops.add("format", "dimension", "Point output format: "
+        "non-interleaved(\"dimension\"), interleaved(\"point\") or "
+        "byte-segregated(\"byte\")");
+    ops.add("coord_id", 0, "Coordinate ID (UTM zone).");
+    return ops;
+}
+
+
+void BpfWriter::processOptions(const Options& options)
+{
+    bool compression = options.getValueOrDefault("compression", false);
+    m_header.m_compression = compression ? BpfCompression::Zlib :
+        BpfCompression::None;
+
+    std::string encodedHeader =
+        options.getValueOrDefault<std::string>("header_data");
+    m_extraData = Utils::base64_decode(encodedHeader);
+
+    std::string fileFormat =
+        options.getValueOrDefault<std::string>("format", "POINT");
+    std::transform(fileFormat.begin(), fileFormat.end(), fileFormat.begin(),
+        ::toupper);
+    if (fileFormat.find("POINT") != std::string::npos)
+        m_header.m_pointFormat = BpfFormat::PointMajor;
+    else if (fileFormat.find("BYTE") != std::string::npos)
+        m_header.m_pointFormat = BpfFormat::ByteMajor;
+    else
+        m_header.m_pointFormat = BpfFormat::DimMajor;
+    if (options.hasOption("coord_id"))
+    {
+        m_header.m_coordType = BpfCoordType::UTM;
+        m_header.m_coordId = options.getValueOrThrow<int>("coord_id");
+    }
+    else
+    {
+        m_header.m_coordType = BpfCoordType::None;
+        m_header.m_coordId = 0;
+    }
+    StringList files = options.getValues<std::string>("bundledfile");
+    for (auto file : files)
+    {
+        if (!FileUtils::fileExists(file))
+        {
+            std::ostringstream oss;
+
+            oss << getName() << ": bundledfile '" << file << "' doesn't exist.";
+            throw pdal_error(oss.str());
+        }
+
+        size_t size = FileUtils::fileSize(file);
+        if (size > (std::numeric_limits<uint32_t>::max)())
+        {
+            std::ostringstream oss;
+            oss << getName() << ": bundledfile '" << file << "' too large.";
+            throw pdal_error(oss.str());
+        }
+
+        BpfUlemFile ulemFile;
+        ulemFile.m_len = size;
+        ulemFile.m_filespec = file;
+        ulemFile.m_filename = FileUtils::getFilename(file);
+        if (ulemFile.m_filename.length() > 32)
+        {
+            std::ostringstream oss;
+            oss << getName() << ": bundledfile '" << file << "' name "
+                "exceeds maximum length of 32.";
+            throw pdal_error(oss.str());
+        }
+        m_bundledFiles.push_back(ulemFile);
+    }
+}
+
+
+void BpfWriter::readyTable(PointTableRef table)
+{
+    loadBpfDimensions(table.layout());
+}
+
+
+void BpfWriter::readyFile(const std::string& filename)
+{
+    m_stream.open(filename);
+    m_header.m_version = 3;
+    m_header.m_numDim = m_dims.size();
+    m_header.m_numPts = 0;
+    m_header.setLog(log());
+
+    // We will re-write the header and dimensions to account for the point
+    // count and dimension min/max.
+    m_header.write(m_stream);
+    m_header.writeDimensions(m_stream, m_dims);
+    for (auto& file : m_bundledFiles)
+        file.write(m_stream);
+    m_stream.put((const char *)m_extraData.data(), m_extraData.size());
+
+    m_header.m_len = m_stream.position();
+
+    m_header.m_xform.m_vals[0] = m_xXform.m_scale;
+    m_header.m_xform.m_vals[5] = m_yXform.m_scale;
+    m_header.m_xform.m_vals[10] = m_zXform.m_scale;
+}
+
+
+void BpfWriter::loadBpfDimensions(PointLayoutPtr layout)
+{
+    // Verify that we have X, Y and Z and that they're the first three
+    // dimensions.
+    Dimension::IdList dims = layout->dims();
+    std::sort(dims.begin(), dims.end());
+    if (dims.size() < 3 || dims[0] != Dimension::Id::X ||
+        dims[1] != Dimension::Id::Y || dims[2] != Dimension::Id::Z)
+    {
+        throw pdal_error("Missing one of dimensions X, Y or Z.  "
+            "Can't write BPF.");
+    }
+
+    for (auto id : dims)
+    {
+        BpfDimension dim;
+        dim.m_id = id;
+        dim.m_label = layout->dimName(id);
+        m_dims.push_back(dim);
+    }
+}
+
+
+void BpfWriter::writeView(const PointViewPtr dataShared)
+{
+    setAutoXForm(dataShared);
+
+    // Avoid reference count overhead internally.
+    const PointView* data(dataShared.get());
+
+    // We know that X, Y and Z are dimensions 0, 1 and 2.
+    m_dims[0].m_offset = m_xXform.m_offset;
+    m_dims[1].m_offset = m_yXform.m_offset;
+    m_dims[2].m_offset = m_zXform.m_offset;
+
+    switch (m_header.m_pointFormat)
+    {
+    case BpfFormat::PointMajor:
+        writePointMajor(data);
+        break;
+    case BpfFormat::DimMajor:
+        writeDimMajor(data);
+        break;
+    case BpfFormat::ByteMajor:
+        writeByteMajor(data);
+        break;
+    }
+    m_header.m_numPts += data->size();
+}
+
+
+void BpfWriter::writePointMajor(const PointView* data)
+{
+    // Blocks of 10,000 points will ensure that we're under 16MB, even
+    // for 255 dimensions.
+    size_t blockpoints = std::min<point_count_t>(10000UL, data->size());
+
+    // For compression we're going to write to a buffer so that it can be
+    // compressed before it's written to the file stream.
+    BpfCompressor compressor(m_stream,
+        blockpoints * sizeof(float) * m_dims.size());
+    PointId idx = 0;
+    while (idx < data->size())
+    {
+        if (m_header.m_compression)
+            compressor.startBlock();
+        size_t blockId;
+        for (blockId = 0; idx < data->size() && blockId < blockpoints;
+            ++idx, ++blockId)
+        {
+            for (auto & bpfDim : m_dims)
+            {
+                double d = getAdjustedValue(data, bpfDim, idx);
+                m_stream << (float)d;
+            }
+        }
+        if (m_header.m_compression)
+        {
+            compressor.compress();
+            compressor.finish();
+        }
+    }
+}
+
+
+void BpfWriter::writeDimMajor(const PointView* data)
+{
+    // We're going to pretend for now that we only even have one point buffer.
+    BpfCompressor compressor(m_stream, data->size() * sizeof(float));
+
+    for (auto & bpfDim : m_dims)
+    {
+
+        if (m_header.m_compression)
+            compressor.startBlock();
+        for (PointId idx = 0; idx < data->size(); ++idx)
+        {
+            double d = getAdjustedValue(data, bpfDim, idx);
+            m_stream << (float)d;
+        }
+        if (m_header.m_compression)
+        {
+            compressor.compress();
+            compressor.finish();
+        }
+    }
+}
+
+
+void BpfWriter::writeByteMajor(const PointView* data)
+{
+    union
+    {
+        float f;
+        uint32_t u32;
+    } uu;
+
+    // We're going to pretend for now that we only ever have one point buffer.
+    BpfCompressor compressor(m_stream,
+        data->size() * sizeof(float) * m_dims.size());
+
+    if (m_header.m_compression)
+        compressor.startBlock();
+    for (auto & bpfDim : m_dims)
+    {
+        for (size_t b = 0; b < sizeof(float); b++)
+        {
+            for (PointId idx = 0; idx < data->size(); ++idx)
+            {
+                uu.f = (float)getAdjustedValue(data, bpfDim, idx);
+                uint8_t u8 = (uint8_t)(uu.u32 >> (b * CHAR_BIT));
+                m_stream << u8;
+            }
+        }
+    }
+    if (m_header.m_compression)
+    {
+        compressor.compress();
+        compressor.finish();
+    }
+}
+
+
+double BpfWriter::getAdjustedValue(const PointView* data,
+    BpfDimension& bpfDim, PointId idx)
+{
+    double d = data->getFieldAs<double>(bpfDim.m_id, idx);
+    bpfDim.m_min = std::min(bpfDim.m_min, d);
+    bpfDim.m_max = std::max(bpfDim.m_max, d);
+
+    if (bpfDim.m_id == Dimension::Id::X)
+        d /= m_xXform.m_scale;
+    else if (bpfDim.m_id == Dimension::Id::Y)
+        d /= m_yXform.m_scale;
+    else if (bpfDim.m_id == Dimension::Id::Z)
+        d /= m_zXform.m_scale;
+    return (d - bpfDim.m_offset);
+}
+
+
+void BpfWriter::doneFile()
+{
+    // Rewrite the header to update the the correct number of points and
+    // statistics.
+    m_stream.seek(0);
+    m_header.write(m_stream);
+    m_header.writeDimensions(m_stream, m_dims);
+    m_stream.close();
+}
+
+} //namespace pdal
+
diff --git a/io/bpf/BpfWriter.hpp b/io/bpf/BpfWriter.hpp
new file mode 100644
index 0000000..09d0995
--- /dev/null
+++ b/io/bpf/BpfWriter.hpp
@@ -0,0 +1,85 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// BPF is an NGA specification for point cloud data. The specification can be
+// found at https://nsgreg.nga.mil/doc/view?i=4202
+
+#pragma once
+
+#include "BpfHeader.hpp"
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/FlexWriter.hpp>
+#include <pdal/util/OStream.hpp>
+
+#include <vector>
+
+extern "C" int32_t BpfWriter_ExitFunc();
+extern "C" PF_ExitFunc BpfWriter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL BpfWriter : public FlexWriter
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    OLeStream m_stream;
+    BpfHeader m_header;
+    BpfDimensionList m_dims;
+    std::vector<uint8_t> m_extraData;
+    std::vector<BpfUlemFile> m_bundledFiles;
+
+    virtual void processOptions(const Options& options);
+    virtual void readyTable(PointTableRef table);
+    virtual void readyFile(const std::string& filename);
+    virtual void writeView(const PointViewPtr data);
+    virtual void doneFile();
+
+    double getAdjustedValue(const PointView* data, BpfDimension& bpfDim,
+        PointId idx);
+    void loadBpfDimensions(PointLayoutPtr layout);
+    void writePointMajor(const PointView* data);
+    void writeDimMajor(const PointView* data);
+    void writeByteMajor(const PointView* data);
+    void writeCompressedBlock(char *buf, size_t size);
+};
+
+} // namespace pdal
diff --git a/io/bpf/CMakeLists.txt b/io/bpf/CMakeLists.txt
new file mode 100644
index 0000000..09623a3
--- /dev/null
+++ b/io/bpf/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# BPF driver CMake configuration
+#
+
+#
+# BPF Reader
+#
+set(srcs
+    BpfCompressor.cpp
+    BpfHeader.cpp
+    BpfReader.cpp
+    BpfWriter.cpp
+)
+
+set(incs
+    BpfCompressor.hpp
+    BpfHeader.hpp
+    BpfReader.hpp
+    BpfWriter.hpp
+)
+
+PDAL_ADD_DRIVER(reader bpf "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/derivative/CMakeLists.txt b/io/derivative/CMakeLists.txt
new file mode 100644
index 0000000..ddae4ef
--- /dev/null
+++ b/io/derivative/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Derivative driver CMake configuration
+#
+
+#
+# Derivative Writer
+#
+set(srcs
+    DerivativeWriter.cpp
+)
+
+set(incs
+    DerivativeWriter.hpp
+)
+
+PDAL_ADD_DRIVER(writer derivative "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/derivative/DerivativeWriter.cpp b/io/derivative/DerivativeWriter.cpp
new file mode 100644
index 0000000..03b7979
--- /dev/null
+++ b/io/derivative/DerivativeWriter.cpp
@@ -0,0 +1,1671 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "DerivativeWriter.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <algorithm>
+#include <cmath>
+#include <iostream>
+#include <limits>
+
+#include <boost/filesystem.hpp>
+
+#include "gdal_priv.h" // For File I/O
+#include "ogr_spatialref.h"  //For Geographic Information/Transformations
+
+namespace pdal
+{
+static PluginInfo const s_info = PluginInfo(
+                                     "writers.derivative",
+                                     "Derivative writer",
+                                     "http://pdal.io/stages/writers.derivative.html");
+
+CREATE_STATIC_PLUGIN(1, 0, DerivativeWriter, Writer, s_info)
+
+std::string DerivativeWriter::getName() const
+{
+    return s_info.name;
+}
+
+const double c_pi = 3.14159265358979323846; /*!< PI value */
+const float c_background = FLT_MIN;
+
+DerivativeWriter::DerivativeWriter()
+    : Writer()
+    , m_primitive_type(0)
+//    , m_outputTypes(0)
+{
+    GDALAllRegister();
+}
+
+
+void DerivativeWriter::ready(PointTableRef table)
+{
+    m_inSRS = table.spatialRef();
+}
+
+void DerivativeWriter::initialize()
+{
+    m_GRID_DIST_X = getOptions().getValueOrDefault<double>("grid_dist_x", 15.0);
+    m_GRID_DIST_Y = getOptions().getValueOrDefault<double>("grid_dist_y", 15.0);
+    m_filename = getOptions().getValueOrThrow<std::string>("filename");
+
+    // maybe we eventually introduce an option to do more than slope
+    //std::vector<Option> types = options.getOptions("output_type");
+
+    //if (!types.size())
+    //    m_outputTypes = OUTPUT_TYPE_ALL;
+    //else
+    //{
+    //    for (auto i = types.begin(); i != types.end(); ++i)
+    //    {
+    //        if (Utils::iequals(i->getValue<std::string>(), "min"))
+    //            m_outputTypes |= OUTPUT_TYPE_MIN;
+    //        if (Utils::iequals(i->getValue<std::string>(), "max"))
+    //            m_outputTypes |= OUTPUT_TYPE_MAX;
+    //        if (Utils::iequals(i->getValue<std::string>(), "mean"))
+    //            m_outputTypes |= OUTPUT_TYPE_MEAN;
+    //        if (Utils::iequals(i->getValue<std::string>(), "idw"))
+    //            m_outputTypes |= OUTPUT_TYPE_IDW;
+    //        if (Utils::iequals(i->getValue<std::string>(), "den"))
+    //            m_outputTypes |= OUTPUT_TYPE_DEN;
+    //        if (Utils::iequals(i->getValue<std::string>(), "all"))
+    //            m_outputTypes = OUTPUT_TYPE_ALL;
+    //    }
+    //}
+    std::string primitive_type =
+        getOptions().getValueOrDefault<std::string>("primitive_type", "slope_d8");
+
+    if (Utils::iequals(primitive_type, "slope_d8"))
+        m_primitive_type = SLOPE_D8;
+    else if (Utils::iequals(primitive_type, "slope_fd"))
+        m_primitive_type = SLOPE_FD;
+    else if (Utils::iequals(primitive_type, "aspect_d8"))
+        m_primitive_type = ASPECT_D8;
+    else if (Utils::iequals(primitive_type, "aspect_fd"))
+        m_primitive_type = ASPECT_FD;
+    else if (Utils::iequals(primitive_type, "hillshade"))
+        m_primitive_type = HILLSHADE;
+    else if (Utils::iequals(primitive_type, "contour_curvature"))
+        m_primitive_type = CONTOUR_CURVATURE;
+    else if (Utils::iequals(primitive_type, "profile_curvature"))
+        m_primitive_type = PROFILE_CURVATURE;
+    else if (Utils::iequals(primitive_type, "tangential_curvature"))
+        m_primitive_type = TANGENTIAL_CURVATURE;
+    else if (Utils::iequals(primitive_type, "total_curvature"))
+        m_primitive_type = TOTAL_CURVATURE;
+    else if (Utils::iequals(primitive_type, "catchment_area"))
+        m_primitive_type = CATCHMENT_AREA;
+    else
+    {
+        std::ostringstream oss;
+        oss << "Unrecognized primitive type " << primitive_type;
+        throw pdal_error(oss.str().c_str());
+    }
+
+    setBounds(BOX2D());
+}
+
+
+Options DerivativeWriter::getDefaultOptions()
+{
+    Options options;
+
+    options.add("grid_dist_x", 15.0, "X grid distance");
+    options.add("grid_dist_y", 15.0, "Y grid distance");
+    options.add("primitive_type", "slope_d8", "Primitive type");
+
+    return options;
+}
+
+double DerivativeWriter::GetNeighbor(Eigen::MatrixXd* data, int row, int col, Direction d)
+{
+    double val;
+    switch (d)
+    {
+        case NORTH:
+            val = ((*data)(row-1, col));
+            break;
+        case SOUTH:
+            val = ((*data)(row+1, col));
+            break;
+        case EAST:
+            val = ((*data)(row, col+1));
+            break;
+        case WEST:
+            val = ((*data)(row, col-1));
+            break;
+        case NORTHEAST:
+            val = ((*data)(row-1, col+1));
+            break;
+        case NORTHWEST:
+            val = ((*data)(row-1, col-1));
+            break;
+        case SOUTHEAST:
+            val = ((*data)(row+1, col+1));
+            break;
+        case SOUTHWEST:
+            val = ((*data)(row+1, col-1));
+            break;
+        default:
+            val = ((*data)(row, col));
+            break;
+    }
+    return val;
+}
+
+double DerivativeWriter::determineSlopeFD(Eigen::MatrixXd* data, int row,
+        int col, double postSpacing, double valueToIgnore)
+{
+    double tSlopeVal = valueToIgnore;
+    double tSlopeValDegree = valueToIgnore;
+
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double val = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(val);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+
+    mean /= nvals;
+
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+
+    double zX = (east - west) / (2 * postSpacing);
+    double zY = (north - south) / (2 * postSpacing);
+    double p = (zX * zX) + (zY * zY);
+
+    tSlopeVal = std::sqrt(p);
+
+    if (tSlopeVal != valueToIgnore)
+        tSlopeValDegree = atan(tSlopeVal) * (180.0f / c_pi);
+
+    return tSlopeValDegree;
+}
+
+double DerivativeWriter::determineSlopeD8(Eigen::MatrixXd* data, int row,
+        int col, double postSpacing, double valueToIgnore)
+{
+    double tPhi1 = 1.0f;
+    double tPhi2 = sqrt(2.0f);
+    double tSlopeVal = valueToIgnore;
+    double tSlopeValDegree = valueToIgnore;
+
+    double val = static_cast<double>((*data)(row, col));
+    if (val == valueToIgnore)
+        return val;
+
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+    double northeast = GetNeighbor(data, row, col, NORTHEAST);
+    double northwest = GetNeighbor(data, row, col, NORTHWEST);
+    double southeast = GetNeighbor(data, row, col, SOUTHEAST);
+    double southwest = GetNeighbor(data, row, col, SOUTHWEST);
+
+    auto checkVal =
+        [val, &tSlopeVal, valueToIgnore, postSpacing](double neighbor, double phi)
+    {
+        if (neighbor != valueToIgnore)
+        {
+            neighbor = (val - neighbor) / (postSpacing * phi);
+            if (std::fabs(neighbor) > std::fabs(tSlopeVal) || tSlopeVal == valueToIgnore)
+                tSlopeVal = neighbor;
+        }
+    };
+
+    checkVal(north, tPhi1);
+    checkVal(south, tPhi1);
+    checkVal(east, tPhi1);
+    checkVal(west, tPhi1);
+    checkVal(northeast, tPhi2);
+    checkVal(northwest, tPhi2);
+    checkVal(southeast, tPhi2);
+    checkVal(southwest, tPhi2);
+
+    if (tSlopeVal != valueToIgnore)
+        tSlopeValDegree = atan(tSlopeVal) * (180.0f / c_pi);
+
+    return tSlopeValDegree;
+}
+
+
+double DerivativeWriter::determineAspectFD(Eigen::MatrixXd* data, int row,
+        int col, double postSpacing, double valueToIgnore)
+{
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double val = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(val);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+
+    mean /= nvals;
+
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+
+    double zX = (east - west) / (2 * postSpacing);
+    double zY = (north - south) / (2 * postSpacing);
+    double p = (zX * zX) + (zY * zY);
+
+    return 180.0 - std::atan(zY/zX) + 90.0 * (zX / std::fabs(zX));
+}
+
+double DerivativeWriter::determineAspectD8(Eigen::MatrixXd* data, int row,
+        int col, double postSpacing)
+{
+    double tPhi1 = 1.0f;
+    double tPhi2 = sqrt(2.0f);
+    double tH = postSpacing;
+    double tVal, tN, tS, tE, tW, tNW, tNE, tSW, tSE, nextTVal;
+    double tSlopeVal = std::numeric_limits<double>::max(), tSlopeValDegree;
+    int tNextY, tNextX;
+    unsigned int j = 0;
+
+    tVal = (*data)(row, col);
+    if (tVal == std::numeric_limits<double>::max())
+        return tVal;
+
+    //North
+    nextTVal = GetNeighbor(data, row, col, NORTH);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tN = (tVal - nextTVal) / (tH * tPhi1);
+        if (tN > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tN;
+            j = 8;
+        }
+    }
+    //South
+    nextTVal = GetNeighbor(data, row, col, SOUTH);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tS = (tVal - nextTVal) / (tH * tPhi1);
+        if (tS > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tS;
+            j = 4;
+        }
+    }
+    //East
+    nextTVal = GetNeighbor(data, row, col, EAST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tE = (tVal - nextTVal) / (tH * tPhi1);
+        if (tE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tE;
+            j = 2;
+        }
+    }
+    //West
+    nextTVal = GetNeighbor(data, row, col, WEST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tW = (tVal - nextTVal) / (tH * tPhi1);
+        if (tW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tW;
+            j = 6;
+        }
+    }
+    //NorthEast
+    nextTVal = GetNeighbor(data, row, col, NORTHEAST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tNE = (tVal - nextTVal) / (tH * tPhi2);
+        if (tNE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tNE;
+            j = 1;
+        }
+    }
+    //NorthWest
+    nextTVal = GetNeighbor(data, row, col, NORTHWEST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tNW = (tVal - nextTVal) / (tH * tPhi2);
+        if (tNW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tNW;
+            j = 7;
+        }
+    }
+    //SouthEast
+    nextTVal = GetNeighbor(data, row, col, SOUTHEAST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tSE = (tVal - nextTVal) / (tH * tPhi2);
+        if (tSE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tSE;
+            j = 3;
+        }
+    }
+    //SouthWest
+    nextTVal = GetNeighbor(data, row, col, SOUTHWEST);
+    if (nextTVal < std::numeric_limits<double>::max())
+    {
+        tSW = (tVal - nextTVal) / (tH * tPhi2);
+        if (tSW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        {
+            tSlopeVal = tSW;
+            j = 5;
+        }
+    }
+
+    //tSlopeValDegree = 45 * j;
+    tSlopeValDegree = std::pow(2.0,j-1);
+
+    return tSlopeValDegree;
+}
+
+int DerivativeWriter::determineCatchmentAreaD8(Eigen::MatrixXd* data,
+        Eigen::MatrixXd* area, int row, int col, double postSpacing)
+{
+    if ((*area)(row, col) > 0)
+    {
+        return (*area)(row, col);
+    }
+    else
+    {
+        (*area)(row, col) = 1;
+
+        for (int i = 1; i < 9; ++i)
+        {
+            int j, k;
+            switch (i)
+            {
+                case 1:
+                    j = row - 1;
+                    k = col + 1;
+                    break;
+
+                case 2:
+                    j = row;
+                    k = col + 1;
+                    break;
+
+                case 3:
+                    j = row + 1;
+                    k = col + 1;
+                    break;
+
+                case 4:
+                    j = row + 1;
+                    k = col;
+                    break;
+
+                case 5:
+                    j = row + 1;
+                    k = col - 1;
+                    break;
+
+                case 6:
+                    j = row;
+                    k = col - 1;
+                    break;
+
+                case 7:
+                    j = row - 1;
+                    k = col - 1;
+                    break;
+
+                case 8:
+                    j = row - 1;
+                    k = col;
+                    break;
+            }
+
+            if ((*area)(j, k) > 0)
+                (*area)(row, col) += determineCatchmentAreaD8(data, area, j, k,
+                                     postSpacing);
+
+            // not quite complete here...
+        }
+
+        //double tPhi1 = 1.0f;
+        //double tPhi2 = sqrt(2.0f);
+        //double tH = postSpacing;
+        //double tVal, tN, tS, tE, tW, tNW, tNE, tSW, tSE, nextTVal;
+        //double tSlopeVal = std::numeric_limits<double>::max(), tSlopeValDegree;
+        //int tNextY, tNextX;
+        //unsigned int j = 0;
+
+        //tVal = (*data)(row, col);
+        //if (tVal == std::numeric_limits<double>::max())
+        //  return tVal;
+
+        ////North
+        //tNextY = row - 1;
+        //tNextX = col;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tN = (tVal - nextTVal) / (tH * tPhi1);
+        //  if (tN > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tN;
+        //    j = 8;
+        //  }
+        //}
+        ////South
+        //tNextY = row + 1;
+        //tNextX = col;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tS = (tVal - nextTVal) / (tH * tPhi1);
+        //  if (tS > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tS;
+        //    j = 4;
+        //  }
+        //}
+        ////East
+        //tNextY = row;
+        //tNextX = col + 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tE = (tVal - nextTVal) / (tH * tPhi1);
+        //  if (tE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tE;
+        //    j = 2;
+        //  }
+        //}
+        ////West
+        //tNextY = row;
+        //tNextX = col - 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tW = (tVal - nextTVal) / (tH * tPhi1);
+        //  if (tW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tW;
+        //    j = 6;
+        //  }
+        //}
+        ////NorthEast
+        //tNextY = row - 1;
+        //tNextX = col + 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tNE = (tVal - nextTVal) / (tH * tPhi2);
+        //  if (tNE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tNE;
+        //    j = 1;
+        //  }
+        //}
+        ////NorthWest
+        //tNextY = row - 1;
+        //tNextX = col - 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tNW = (tVal - nextTVal) / (tH * tPhi2);
+        //  if (tNW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tNW;
+        //    j = 7;
+        //  }
+        //}
+        ////SouthEast
+        //tNextY = row + 1;
+        //tNextX = col + 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tSE = (tVal - nextTVal) / (tH * tPhi2);
+        //  if (tSE > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tSE;
+        //    j = 3;
+        //  }
+        //}
+        ////SouthWest
+        //tNextY = row + 1;
+        //tNextX = col - 1;
+        //nextTVal = (*data)(tNextY, tNextX);
+        //if (nextTVal < std::numeric_limits<double>::max())
+        //{
+        //  tSW = (tVal - nextTVal) / (tH * tPhi2);
+        //  if (tSW > tSlopeVal || tSlopeVal == std::numeric_limits<double>::max())
+        //  {
+        //    tSlopeVal = tSW;
+        //    j = 5;
+        //  }
+        //}
+
+        //switch (j)
+        //{
+        //case 1:
+        //  tNextY = row - 1;
+        //  tNextX = col + 1;
+        //  break;
+
+        //case 2:
+        //  tNextY = row;
+        //  tNextX = col + 1;
+        //  break;
+
+        //case 3:
+        //  tNextY = row + 1;
+        //  tNextX = col + 1;
+        //  break;
+
+        //case 4:
+        //  tNextY = row + 1;
+        //  tNextX = col;
+        //  break;
+
+        //case 5:
+        //  tNextY = row + 1;
+        //  tNextX = col - 1;
+        //  break;
+
+        //case 6:
+        //  tNextY = row;
+        //  tNextX = col - 1;
+        //  break;
+
+        //case 7:
+        //  tNextY = row - 1;
+        //  tNextX = col - 1;
+        //  break;
+
+        //case 8:
+        //  tNextY = row - 1;
+        //  tNextX = col;
+        //  break;
+        //}
+        //(*area)(row, col) = determineCatchmentAreaD8(data, area, tNextY, tNextX, postSpacing);
+    }
+    //ABELL - Returning something.
+    return 0;
+}
+
+double DerivativeWriter::determineHillshade(Eigen::MatrixXd* data, int row,
+        int col, double zenithRad, double azimuthRad, double postSpacing)
+{
+    //ABELL - tEVar not currently used.
+    //double tAVar, tBVar, tCVar, tDVar, tEVar, tFVar, tGVar, tHVar, tIVar;
+    double tAVar, tBVar, tCVar, tDVar, tFVar, tGVar, tHVar, tIVar;
+    double tDZDX, tDZDY, tSlopeRad, tAspectRad = 0.0;
+    double tHillShade;
+
+    tAVar = GetNeighbor(data, row, col, NORTHWEST);
+    tBVar = GetNeighbor(data, row, col, NORTH);
+    tCVar = GetNeighbor(data, row, col, NORTHWEST);
+    tDVar = GetNeighbor(data, row, col, WEST);
+    //tEVar = (double)(*data)(row, col);
+    tFVar = GetNeighbor(data, row, col, EAST);
+    tGVar = GetNeighbor(data, row, col, SOUTHWEST);
+    tHVar = GetNeighbor(data, row, col, SOUTH);
+    tIVar = GetNeighbor(data, row, col, SOUTHEAST);
+
+    tDZDX = ((tCVar + 2 * tFVar + tIVar) - (tAVar + 2 * tDVar + tGVar)) /
+            (8 * postSpacing);
+    tDZDY = ((tGVar + 2* tHVar + tIVar) - (tAVar + 2 * tBVar + tCVar))  /
+            (8 * postSpacing);
+    tSlopeRad = atan(sqrt(pow(tDZDX, 2) + pow(tDZDY, 2)));
+
+    if (tDZDX == 0)
+    {
+        if (tDZDY > 0)
+        {
+            tAspectRad = c_pi / 2;
+        }
+        else if (tDZDY < 0)
+        {
+            tAspectRad = (2 * c_pi) - (c_pi / 2);
+        }
+        else
+        {
+            //ABELL - This looks wrong.  At least needs a comment.
+            // tAspectRad = tAspectRad;
+            ;
+        }
+    }
+    else
+    {
+        tAspectRad = atan2(tDZDY, -1 * tDZDX);
+        if (tAspectRad < 0)
+        {
+            tAspectRad = 2 * c_pi + tAspectRad;
+        }
+    }
+
+    tHillShade = (((cos(zenithRad) * cos(tSlopeRad)) + (sin(zenithRad) *
+                   sin(tSlopeRad) * cos(azimuthRad - tAspectRad))));
+
+    return tHillShade;
+}
+
+
+double DerivativeWriter::determineContourCurvature(Eigen::MatrixXd* data,
+        int row, int col, double postSpacing, double valueToIgnore)
+{
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double value = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+    double northeast = GetNeighbor(data, row, col, NORTHEAST);
+    double northwest = GetNeighbor(data, row, col, NORTHWEST);
+    double southeast = GetNeighbor(data, row, col, SOUTHEAST);
+    double southwest = GetNeighbor(data, row, col, SOUTHWEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(value);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+    accumulate(northeast);
+    accumulate(northwest);
+    accumulate(southeast);
+    accumulate(southwest);
+
+    mean /= nvals;
+
+    if (value == valueToIgnore) value = mean;
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+    if (northeast == valueToIgnore) northeast = mean;
+    if (northwest == valueToIgnore) northwest = mean;
+    if (southeast == valueToIgnore) southeast = mean;
+    if (southwest == valueToIgnore) southwest = mean;
+
+    double zXX = (east - 2.0 * value + west) / (postSpacing * postSpacing);
+    double zYY = (north - 2.0 * value + south) / (postSpacing * postSpacing);
+    double zXY = ((-1.0 * northwest) + northeast + southwest - southeast) / (4.0 * postSpacing * postSpacing);
+    double zX = (east - west) / (2 * postSpacing);
+    double zY = (north - south) / (2 * postSpacing);
+    double p = (zX * zX) + (zY * zY);
+    double q = p + 1;
+
+    return static_cast<float>(((zXX*zX*zX)-(2*zXY*zX*zY)+(zYY*zY*zY))/(p*std::sqrt(q*q*q)));
+}
+
+
+double DerivativeWriter::determineProfileCurvature(Eigen::MatrixXd* data,
+        int row, int col, double postSpacing, double valueToIgnore)
+{
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double value = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+    double northeast = GetNeighbor(data, row, col, NORTHEAST);
+    double northwest = GetNeighbor(data, row, col, NORTHWEST);
+    double southeast = GetNeighbor(data, row, col, SOUTHEAST);
+    double southwest = GetNeighbor(data, row, col, SOUTHWEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(value);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+    accumulate(northeast);
+    accumulate(northwest);
+    accumulate(southeast);
+    accumulate(southwest);
+
+    mean /= nvals;
+
+    if (value == valueToIgnore) value = mean;
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+    if (northeast == valueToIgnore) northeast = mean;
+    if (northwest == valueToIgnore) northwest = mean;
+    if (southeast == valueToIgnore) southeast = mean;
+    if (southwest == valueToIgnore) southwest = mean;
+
+    double zXX = (east - 2.0 * value + west) / (postSpacing * postSpacing);
+    double zYY = (north - 2.0 * value + south) / (postSpacing * postSpacing);
+    double zXY = ((-1.0 * northwest) + northeast + southwest - southeast) / (4.0 * postSpacing * postSpacing);
+    double zX = (east - west) / (2 * postSpacing);
+    double zY = (north - south) / (2 * postSpacing);
+    double p = (zX * zX) + (zY * zY);
+    double q = p + 1;
+
+    return static_cast<float>(((zXX*zX*zX)+(2*zXY*zX*zY)+(zYY*zY*zY))/(p*std::sqrt(q*q*q)));
+}
+
+
+double DerivativeWriter::determineTangentialCurvature(Eigen::MatrixXd* data,
+        int row, int col, double postSpacing, double valueToIgnore)
+{
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double value = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+    double northeast = GetNeighbor(data, row, col, NORTHEAST);
+    double northwest = GetNeighbor(data, row, col, NORTHWEST);
+    double southeast = GetNeighbor(data, row, col, SOUTHEAST);
+    double southwest = GetNeighbor(data, row, col, SOUTHWEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(value);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+    accumulate(northeast);
+    accumulate(northwest);
+    accumulate(southeast);
+    accumulate(southwest);
+
+    mean /= nvals;
+
+    if (value == valueToIgnore) value = mean;
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+    if (northeast == valueToIgnore) northeast = mean;
+    if (northwest == valueToIgnore) northwest = mean;
+    if (southeast == valueToIgnore) southeast = mean;
+    if (southwest == valueToIgnore) southwest = mean;
+
+    double zXX = (east - 2.0 * value + west) / (postSpacing * postSpacing);
+    double zYY = (north - 2.0 * value + south) / (postSpacing * postSpacing);
+    double zXY = ((-1.0 * northwest) + northeast + southwest - southeast) / (4.0 * postSpacing * postSpacing);
+    double zX = (east - west) / (2 * postSpacing);
+    double zY = (north - south) / (2 * postSpacing);
+    double p = (zX * zX) + (zY * zY);
+    double q = p + 1;
+
+    return static_cast<float>(((zXX*zY*zY)-(2*zXY*zX*zY)+(zYY*zX*zX))/(p*std::sqrt(q)));
+}
+
+
+double DerivativeWriter::determineTotalCurvature(Eigen::MatrixXd* data, int row,
+        int col, double postSpacing, double valueToIgnore)
+{
+    double mean = 0.0;
+    unsigned int nvals = 0;
+
+    double value = static_cast<double>((*data)(row, col));
+    double north = GetNeighbor(data, row, col, NORTH);
+    double south = GetNeighbor(data, row, col, SOUTH);
+    double east = GetNeighbor(data, row, col, EAST);
+    double west = GetNeighbor(data, row, col, WEST);
+    double northeast = GetNeighbor(data, row, col, NORTHEAST);
+    double northwest = GetNeighbor(data, row, col, NORTHWEST);
+    double southeast = GetNeighbor(data, row, col, SOUTHEAST);
+    double southwest = GetNeighbor(data, row, col, SOUTHWEST);
+
+    auto accumulate = [&nvals, &mean, valueToIgnore](double val)
+    {
+        if (val != valueToIgnore)
+        {
+            mean += val;
+            nvals++;
+        }
+    };
+
+    accumulate(value);
+    accumulate(north);
+    accumulate(south);
+    accumulate(east);
+    accumulate(west);
+    accumulate(northeast);
+    accumulate(northwest);
+    accumulate(southeast);
+    accumulate(southwest);
+
+    mean /= nvals;
+
+    if (value == valueToIgnore) value = mean;
+    if (north == valueToIgnore) north = mean;
+    if (south == valueToIgnore) south = mean;
+    if (east == valueToIgnore) east = mean;
+    if (west == valueToIgnore) west = mean;
+    if (northeast == valueToIgnore) northeast = mean;
+    if (northwest == valueToIgnore) northwest = mean;
+    if (southeast == valueToIgnore) southeast = mean;
+    if (southwest == valueToIgnore) southwest = mean;
+
+    double zXX = (east - 2.0 * value + west) / (postSpacing * postSpacing);
+    double zYY = (north - 2.0 * value + south) / (postSpacing * postSpacing);
+    double zXY = ((-1.0 * northwest) + northeast + southwest - southeast) / (4.0 * postSpacing * postSpacing);
+
+    return static_cast<float>((zXX * zXX) + (2.0 * zXY * zXY) + (zYY * zYY));
+}
+
+
+GDALDataset* DerivativeWriter::createFloat32GTIFF(std::string filename,
+        int cols, int rows)
+{
+    char **papszMetadata;
+
+    // parse the format driver, hardcoded for the time being
+    std::string tFormat("GTIFF");
+    const char *pszFormat = tFormat.c_str();
+    GDALDriver* tpDriver = GetGDALDriverManager()->GetDriverByName(pszFormat);
+
+    // try to create a file of the requested format
+    if (tpDriver != NULL)
+    {
+        papszMetadata = tpDriver->GetMetadata();
+        if (CSLFetchBoolean(papszMetadata, GDAL_DCAP_CREATE, FALSE))
+        {
+            char **papszOptions = NULL;
+
+            boost::filesystem::path p(filename);
+            p.replace_extension(".tif");
+            GDALDataset *dataset;
+            dataset = tpDriver->Create(p.string().c_str(), cols, rows, 1,
+                                       GDT_Float32, papszOptions);
+
+            BOX2D& extent = getBounds();
+
+            // set the geo transformation
+            double adfGeoTransform[6];
+            adfGeoTransform[0] = extent.minx; // - 0.5*m_GRID_DIST_X;
+            adfGeoTransform[1] = m_GRID_DIST_X;
+            adfGeoTransform[2] = 0.0;
+            adfGeoTransform[3] = extent.maxy; // + 0.5*m_GRID_DIST_Y;
+            adfGeoTransform[4] = 0.0;
+            adfGeoTransform[5] = -1 * m_GRID_DIST_Y;
+            dataset->SetGeoTransform(adfGeoTransform);
+
+            // set the projection
+            log()->get(LogLevel::Debug5) << m_inSRS.getWKT() << std::endl;
+            dataset->SetProjection(m_inSRS.getWKT().c_str());
+
+            if (dataset)
+                return dataset;
+        }
+    }
+    //ABELL
+    return NULL;
+}
+
+
+void DerivativeWriter::writeSlope(Eigen::MatrixXd* tDemData,
+                                  const PointViewPtr data, SlopeMethod method)
+{
+    BOX2D& extent = getBounds();
+
+    // use the max grid size as the post spacing
+    double tPostSpacing = std::max(m_GRID_DIST_X, m_GRID_DIST_Y);
+
+    GDALDataset *mpDstDS;
+    mpDstDS = createFloat32GTIFF(m_filename, m_GRID_SIZE_X, m_GRID_SIZE_Y);
+
+    // if we have a valid file
+    if (mpDstDS)
+    {
+        // loop over the raster and determine max slope at each location
+        int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+        int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+        float *poRasterData = new float[m_GRID_SIZE_X*m_GRID_SIZE_Y];
+        for (uint32_t i=0; i<m_GRID_SIZE_X*m_GRID_SIZE_Y; i++)
+        {
+            poRasterData[i] = c_background;
+        }
+
+        #pragma omp parallel for
+        for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        {
+            int tXIn = tXOut;
+            for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+            {
+                int tYIn = tYOut;
+
+                float tSlopeValDegree(0);
+
+                //Compute Slope Value
+                switch (method)
+                {
+                    case SD8:
+                        tSlopeValDegree = (float)determineSlopeD8(tDemData,
+                                          tYOut, tXOut, tPostSpacing,
+                                          c_background);
+                        break;
+
+                    case SFD:
+                        tSlopeValDegree = (double)determineSlopeFD(tDemData,
+                                          tYOut, tXOut, tPostSpacing,
+                                          c_background);
+                        break;
+                }
+
+                poRasterData[(tYIn * m_GRID_SIZE_X) + tXIn] =
+                    std::tan(tSlopeValDegree*c_pi/180.0)*100.0;
+            }
+        }
+
+        // write the data
+        if (poRasterData)
+        {
+            GDALRasterBand *tBand = mpDstDS->GetRasterBand(1);
+
+            tBand->SetNoDataValue((double)c_background);
+
+            if (m_GRID_SIZE_X > 0 && m_GRID_SIZE_Y > 0)
+                tBand->RasterIO(GF_Write, 0, 0, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                poRasterData, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                GDT_Float32, 0, 0);
+        }
+
+        GDALClose((GDALDatasetH) mpDstDS);
+
+        delete [] poRasterData;
+    }
+}
+
+
+void DerivativeWriter::writeAspect(Eigen::MatrixXd* tDemData,
+                                   const PointViewPtr data, AspectMethod method)
+{
+    BOX2D& extent = getBounds();
+
+    // use the max grid size as the post spacing
+    double tPostSpacing = std::max(m_GRID_DIST_X, m_GRID_DIST_Y);
+
+    GDALDataset *mpDstDS;
+    mpDstDS = createFloat32GTIFF(m_filename, m_GRID_SIZE_X, m_GRID_SIZE_Y);
+
+    // if we have a valid file
+    if (mpDstDS)
+    {
+        // loop over the raster and determine max slope at each location
+        int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+        int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+        float *poRasterData = new float[m_GRID_SIZE_X*m_GRID_SIZE_Y];
+        for (uint32_t i=0; i<m_GRID_SIZE_X*m_GRID_SIZE_Y; i++)
+        {
+            poRasterData[i] = 0;    // Initialize all elements to zero.
+        }
+
+        #pragma omp parallel for
+        for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        {
+            int tXIn = tXOut;
+            for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+            {
+                int tYIn = tYOut;
+
+                float tSlopeValDegree(0);
+
+                //Compute Aspect Value
+                switch (method)
+                {
+                    case AD8:
+                        tSlopeValDegree = (float)determineAspectD8(tDemData,
+                                          tYOut, tXOut, tPostSpacing);
+                        break;
+
+                    case SFD:
+                        tSlopeValDegree = (float)determineAspectFD(tDemData,
+                                          tYOut, tXOut, tPostSpacing, c_background);
+                        break;
+                }
+
+                if (tSlopeValDegree == std::numeric_limits<double>::max())
+                    poRasterData[(tYIn * m_GRID_SIZE_X) + tXIn] = c_background;
+                else
+                    poRasterData[(tYIn * m_GRID_SIZE_X) + tXIn] = tSlopeValDegree;
+            }
+        }
+
+        // write the data
+        if (poRasterData)
+        {
+            GDALRasterBand *tBand = mpDstDS->GetRasterBand(1);
+
+            tBand->SetNoDataValue((double)c_background);
+
+            if (m_GRID_SIZE_X > 0 && m_GRID_SIZE_Y > 0)
+                tBand->RasterIO(GF_Write, 0, 0, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                poRasterData, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                GDT_Float32, 0, 0);
+        }
+
+        GDALClose((GDALDatasetH) mpDstDS);
+
+        delete [] poRasterData;
+    }
+}
+
+
+void DerivativeWriter::writeCatchmentArea(Eigen::MatrixXd* tDemData,
+        const PointViewPtr data)
+{
+    Eigen::MatrixXd area(m_GRID_SIZE_Y, m_GRID_SIZE_X);
+    area.setZero();
+
+    BOX2D& extent = getBounds();
+
+    // use the max grid size as the post spacing
+    double tPostSpacing = std::max(m_GRID_DIST_X, m_GRID_DIST_Y);
+
+    GDALDataset *mpDstDS;
+    mpDstDS = createFloat32GTIFF(m_filename, m_GRID_SIZE_X, m_GRID_SIZE_Y);
+
+    // if we have a valid file
+    if (mpDstDS)
+    {
+        // loop over the raster and determine max slope at each location
+        int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+        int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+        float *poRasterData = new float[m_GRID_SIZE_X*m_GRID_SIZE_Y];
+        for (uint32_t i=0; i<m_GRID_SIZE_X*m_GRID_SIZE_Y; i++)
+        {
+            poRasterData[i] = c_background;    // Initialize all elements to zero.
+        }
+
+
+        int tXOut = tXStart;
+        int tYOut = tYStart;
+        //for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        //{
+        //    for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+        //    {
+        //Compute Aspect Value
+        //switch (method)
+        //{
+        //case AD8:
+        //tSlopeValDegree = (float)determineAspectD8(tDemData, tYOut, tXOut, tPostSpacing);
+        //break;
+        //
+        //case SFD:
+        //  tSlopeValDegree = (float)determineAspectFD(tDemData, tYOut, tXOut, tPostSpacing, c_background);
+        //break;
+        //}
+        area(tYOut, tXOut) = determineCatchmentAreaD8(tDemData, &area, tYOut,
+                             tXOut, tPostSpacing);
+        //    }
+        // }
+
+        #pragma omp parallel for
+        for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        {
+            for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+            {
+                poRasterData[(tYOut * m_GRID_SIZE_X) + tXOut] = area(tYOut, tXOut);
+            }
+        }
+
+        //stretchData(poRasterData);
+
+        // write the data
+        if (poRasterData)
+        {
+            GDALRasterBand *tBand = mpDstDS->GetRasterBand(1);
+
+            tBand->SetNoDataValue((double)c_background);
+
+            if (m_GRID_SIZE_X > 0 && m_GRID_SIZE_Y > 0)
+                tBand->RasterIO(GF_Write, 0, 0, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                poRasterData, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                GDT_Float32, 0, 0);
+        }
+
+        GDALClose((GDALDatasetH) mpDstDS);
+
+        delete [] poRasterData;
+    }
+}
+
+// void DerivativeWriter::stretchData(float *data)
+// {
+//     unsigned int nvals = 0;
+//
+//     int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+//     int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+//
+//     // pass #1: compute mean
+//     double mean = 0.0;
+//     for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+//     {
+//         for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+//         {
+//             float val = data[(tYOut * m_GRID_SIZE_X) + tXOut];
+//             if (val != c_background && !_isnanf(val))
+//             {
+//                 //std::cerr << val << std::endl;
+//                 mean += val;
+//                 nvals++;
+//             }
+//         }
+//     }
+//     mean /= nvals;
+//
+//     // pass #2: compute standard deviation
+//     double stdev = 0.0;
+//     for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+//     {
+//         for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+//         {
+//             float val = data[(tYOut * m_GRID_SIZE_X) + tXOut];
+//             if (val != c_background && !_isnanf(val))
+//             {
+//                 stdev += std::pow(val - mean, 2);
+//                 nvals++;
+//             }
+//         }
+//     }
+//     stdev /= (nvals - 1);
+//     stdev = std::sqrt(stdev);
+//
+//     std::cerr << mean << ", " << stdev << ", " << nvals << std::endl;
+//
+//     // pass #3: scale to +/- 2x standard deviations from mean
+//     double min_val = mean - 2*stdev;
+//     double max_val = mean + 2*stdev;
+//     double range = max_val - min_val;
+//     double scale = 256.0 / range;
+//
+//     std::cerr << min_val << " < " << max_val << std::endl;
+//
+//     #pragma omp parallel for
+//
+//     for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+//     {
+//         for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+//         {
+//             data[(tYOut * m_GRID_SIZE_X) + tXOut] =
+//                 (data[(tYOut * m_GRID_SIZE_X) + tXOut] - min_val) * scale;
+//         }
+//     }
+// }
+
+
+void DerivativeWriter::writeHillshade(Eigen::MatrixXd* tDemData,
+                                      const PointViewPtr data)
+{
+    BOX2D& extent = getBounds();
+
+    // use the max grid size as the post spacing
+    double tPostSpacing = std::max(m_GRID_DIST_X, m_GRID_DIST_Y);
+
+    GDALDataset *mpDstDS;
+    mpDstDS = createFloat32GTIFF(m_filename, m_GRID_SIZE_X, m_GRID_SIZE_Y);
+
+    // if we have a valid file
+    if (mpDstDS)
+    {
+        // loop over the raster and determine max slope at each location
+        int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+        int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+        float *poRasterData = new float[m_GRID_SIZE_X*m_GRID_SIZE_Y];
+        for (uint32_t i=0; i<m_GRID_SIZE_X*m_GRID_SIZE_Y; i++)
+        {
+            poRasterData[i] = 0;    // Initialize all elements to zero.
+        }
+
+        // Parameters for hill shade
+        double illumAltitudeDegree = 45.0;
+        double illumAzimuthDegree = 315.0;
+        double tZenithRad = (90 - illumAltitudeDegree) * (c_pi / 180.0);
+        double tAzimuthMath = 360.0 - illumAzimuthDegree + 90;
+
+        if (tAzimuthMath >= 360.0)
+        {
+            tAzimuthMath = tAzimuthMath - 360.0;
+        }
+
+        double tAzimuthRad = tAzimuthMath * (c_pi / 180.0);
+
+        double min_val = std::numeric_limits<double>::max();
+        double max_val = -std::numeric_limits<double>::max();
+
+        #pragma omp parallel for
+        for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        {
+            for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+            {
+                //Compute Slope Value
+                float tSlopeValDegree = (float)determineHillshade(tDemData,
+                                        tYOut, tXOut, tZenithRad, tAzimuthRad,
+                                        tPostSpacing);
+
+                if (tSlopeValDegree == std::numeric_limits<double>::max())
+                    poRasterData[(tYOut * m_GRID_SIZE_X) + tXOut] = c_background;
+                else
+                    poRasterData[(tYOut * m_GRID_SIZE_X) + tXOut] = tSlopeValDegree;
+
+                if (tSlopeValDegree < min_val) min_val = tSlopeValDegree;
+                if (tSlopeValDegree > max_val) max_val = tSlopeValDegree;
+            }
+        }
+
+        // stretchData(poRasterData);
+
+        // write the data
+        if (poRasterData)
+        {
+            GDALRasterBand *tBand = mpDstDS->GetRasterBand(1);
+
+            tBand->SetNoDataValue((double)c_background);
+
+            if (m_GRID_SIZE_X > 0 && m_GRID_SIZE_Y > 0)
+                tBand->RasterIO(GF_Write, 0, 0, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                poRasterData, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                GDT_Float32, 0, 0);
+        }
+
+        GDALClose((GDALDatasetH) mpDstDS);
+
+        delete [] poRasterData;
+    }
+}
+
+
+void DerivativeWriter::writeCurvature(Eigen::MatrixXd* tDemData,
+                                      const PointViewPtr data,
+                                      CurvatureType curveType,
+                                      double valueToIgnore)
+{
+    BOX2D& extent = getBounds();
+
+    // use the max grid size as the post spacing
+    double tPostSpacing = std::max(m_GRID_DIST_X, m_GRID_DIST_Y);
+
+    GDALDataset *mpDstDS;
+    mpDstDS = createFloat32GTIFF(m_filename, m_GRID_SIZE_X, m_GRID_SIZE_Y);
+
+    // if we have a valid file
+    if (mpDstDS)
+    {
+        // loop over the raster and determine max slope at each location
+        int tXStart = 1, tXEnd = m_GRID_SIZE_X - 1;
+        int tYStart = 1, tYEnd = m_GRID_SIZE_Y - 1;
+        float *poRasterData = new float[m_GRID_SIZE_X*m_GRID_SIZE_Y];
+        for (uint32_t i=0; i<m_GRID_SIZE_X*m_GRID_SIZE_Y; i++)
+        {
+            poRasterData[i] = c_background;
+        }
+
+        #pragma omp parallel for
+        for (int tXOut = tXStart; tXOut < tXEnd; tXOut++)
+        {
+            int tXIn = tXOut;
+            for (int tYOut = tYStart; tYOut < tYEnd; tYOut++)
+            {
+                int tYIn = tYOut;
+
+                double curve(0);
+
+                //Compute Slope Value
+                switch (curveType)
+                {
+                    case CONTOUR:
+                        curve = determineContourCurvature(tDemData,
+                                                          tYOut, tXOut,
+                                                          tPostSpacing,
+                                                          c_background);
+                        break;
+
+                    case PROFILE:
+                        curve = determineProfileCurvature(tDemData,
+                                                          tYOut, tXOut,
+                                                          tPostSpacing,
+                                                          c_background);
+                        break;
+
+                    case TANGENTIAL:
+                        curve = determineTangentialCurvature(tDemData,
+                                                             tYOut, tXOut,
+                                                             tPostSpacing,
+                                                             c_background);
+                        break;
+
+                    case TOTAL:
+                        curve = determineTotalCurvature(tDemData,
+                                                        tYOut, tXOut,
+                                                        tPostSpacing,
+                                                        c_background);
+                        break;
+                }
+
+                poRasterData[(tYOut * m_GRID_SIZE_X) + tXOut] = static_cast<float>(curve);
+            }
+        }
+
+        //stretchData(poRasterData);
+
+        // write the data
+        if (poRasterData)
+        {
+            GDALRasterBand *tBand = mpDstDS->GetRasterBand(1);
+
+            tBand->SetNoDataValue((double)c_background);
+
+            if (m_GRID_SIZE_X > 0 && m_GRID_SIZE_Y > 0)
+                tBand->RasterIO(GF_Write, 0, 0, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                poRasterData, m_GRID_SIZE_X, m_GRID_SIZE_Y,
+                                GDT_Float32, 0, 0);
+        }
+
+        GDALClose((GDALDatasetH) mpDstDS);
+
+        delete [] poRasterData;
+    }
+}
+
+
+void DerivativeWriter::write(const PointViewPtr data)
+{
+    data->calculateBounds(m_bounds);
+
+    // calculate grid based off bounds and post spacing
+    calculateGridSizes();
+    log()->get(LogLevel::Debug2) << "X grid size: " << m_GRID_SIZE_X << std::endl;
+    log()->get(LogLevel::Debug2) << "Y grid size: " << m_GRID_SIZE_Y << std::endl;
+
+    log()->floatPrecision(6);
+    log()->get(LogLevel::Debug2) << "X grid distance: " << m_GRID_DIST_X << std::endl;
+    log()->get(LogLevel::Debug2) << "Y grid distance: " << m_GRID_DIST_Y << std::endl;
+    log()->clearFloat();
+
+    BOX2D& extent = getBounds();
+    double yMax = extent.miny + m_GRID_SIZE_Y * m_GRID_DIST_Y;
+    log()->get(LogLevel::Debug4) << yMax << ", " << extent.maxy << std::endl;
+
+    // need to create the min DEM
+    Eigen::MatrixXd tDemData(m_GRID_SIZE_Y, m_GRID_SIZE_X);
+    tDemData.setConstant(c_background);
+    for (PointId idx = 0; idx < data->size(); ++idx)
+    {
+        double x = data->getFieldAs<double>(Dimension::Id::X, idx);
+        double y = data->getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = data->getFieldAs<double>(Dimension::Id::Z, idx);
+
+        auto clamp = [](double t, double min, double max)
+        {
+            return ((t < min) ? min : ((t > max) ? max : t));
+        };
+
+        int xIndex = clamp(static_cast<int>(floor((x - extent.minx) / m_GRID_DIST_X)), 0, m_GRID_SIZE_X-1);
+        int yIndex = clamp(static_cast<int>(floor((yMax - y) / m_GRID_DIST_Y)), 0, m_GRID_SIZE_Y-1);
+
+        double tDemValue = tDemData(yIndex, xIndex);
+
+        if (tDemValue == c_background)
+        {
+            tDemData(yIndex, xIndex) = z;
+        }
+        else
+        {
+            if (z > tDemValue)
+                tDemData(yIndex, xIndex) = z;
+        }
+    }
+
+    auto CleanRasterScanLine = [](Eigen::MatrixXd data, Eigen::VectorXd datarow,
+                                  int mDim, int row, bool* prevSetCols,
+                                  bool* curSetCols)
+    {
+
+        auto InterpolateRasterPixelScanLine = [](Eigen::MatrixXd data, int mDim,
+                                              int x, int y, bool* prevSetCols)
+        {
+            int yMinus, yPlus, xMinus, xPlus;
+            float tInterpValue;
+            bool tPrevInterp;
+
+            yMinus = y - 1;
+            yPlus = y + 1;
+            xMinus = x - 1;
+            xPlus = x + 1;
+
+            //North
+            tInterpValue = data(yMinus, x);
+            tPrevInterp = prevSetCols[x];
+            if (tInterpValue != c_background && tPrevInterp != true)
+                return tInterpValue;
+
+            //South
+            tInterpValue = data(yPlus, x);
+            if (tInterpValue != c_background)
+                return tInterpValue;
+
+            //East
+            tInterpValue = data(y, xPlus);
+            if (tInterpValue != c_background)
+                return tInterpValue;
+
+            //West
+            tInterpValue = data(y, xMinus);
+            if (tInterpValue != c_background)
+                return tInterpValue;
+
+            //NorthWest
+            tInterpValue = data(yMinus, xMinus);
+            tPrevInterp = prevSetCols[xMinus];
+            if (tInterpValue != c_background && tPrevInterp != true)
+                return tInterpValue;
+
+            //NorthWest
+            tInterpValue = data(yMinus, xPlus);
+            tPrevInterp = prevSetCols[xPlus];
+            if (tInterpValue != c_background && tPrevInterp != true)
+                return tInterpValue;
+
+            //SouthWest
+            tInterpValue = data(yPlus, xMinus);
+            if (tInterpValue != c_background)
+                return tInterpValue;
+
+            //SouthEast
+            tInterpValue = data(yPlus, xPlus);
+            if (tInterpValue != c_background)
+                return tInterpValue;
+
+            //ABELL - Returning something.
+            return 0.0f;
+        };
+
+        float tInterpValue;
+        float tValue;
+
+        int y = row;
+        for (int x = 1; x < mDim-1; ++x)
+        {
+            tValue = datarow(x);
+
+            if (tValue == c_background)
+            {
+                tInterpValue = InterpolateRasterPixelScanLine(data, mDim, x, y,
+                               prevSetCols);
+                if (tInterpValue != c_background)
+                {
+                    curSetCols[x] = true;
+                    datarow(x) = tInterpValue;
+                }
+            }
+        }
+    };
+
+    bool* prevSetCols = new bool[m_GRID_SIZE_X];
+    bool* curSetCols = new bool[m_GRID_SIZE_X];
+
+    for (uint32_t y = 1; y < m_GRID_SIZE_Y; ++y)
+    {
+        CleanRasterScanLine(tDemData, tDemData.row(1), m_GRID_SIZE_X, y,
+                            prevSetCols, curSetCols);
+        memcpy(prevSetCols, curSetCols, m_GRID_SIZE_X);
+        memset(curSetCols, 0, m_GRID_SIZE_X);
+    }
+
+    delete[] prevSetCols;
+    delete[] curSetCols;
+
+    switch (m_primitive_type)
+    {
+        case SLOPE_D8:
+            writeSlope(&tDemData, data, SD8);
+            break;
+
+        case SLOPE_FD:
+            writeSlope(&tDemData, data, SFD);
+            break;
+
+        case ASPECT_D8:
+            writeAspect(&tDemData, data, AD8);
+            break;
+
+        case ASPECT_FD:
+            writeAspect(&tDemData, data, AFD);
+            break;
+
+        case HILLSHADE:
+            writeHillshade(&tDemData, data);
+            break;
+
+        case CONTOUR_CURVATURE:
+            writeCurvature(&tDemData, data, CONTOUR, c_background);
+            break;
+
+        case PROFILE_CURVATURE:
+            writeCurvature(&tDemData, data, PROFILE, c_background);
+            break;
+
+        case TANGENTIAL_CURVATURE:
+            writeCurvature(&tDemData, data, TANGENTIAL, c_background);
+            break;
+
+        case TOTAL_CURVATURE:
+            writeCurvature(&tDemData, data, TOTAL, c_background);
+            break;
+
+        case CATCHMENT_AREA:
+            writeCatchmentArea(&tDemData, data);
+            break;
+    }
+}
+
+void DerivativeWriter::calculateGridSizes()
+{
+    BOX2D& extent = getBounds();
+
+    m_GRID_SIZE_X = (int)(ceil((extent.maxx - extent.minx)/m_GRID_DIST_X)) + 1;
+    m_GRID_SIZE_Y = (int)(ceil((extent.maxy - extent.miny)/m_GRID_DIST_Y)) + 1;
+}
+
+} // namespace pdal
diff --git a/io/derivative/DerivativeWriter.hpp b/io/derivative/DerivativeWriter.hpp
new file mode 100644
index 0000000..198f7ed
--- /dev/null
+++ b/io/derivative/DerivativeWriter.hpp
@@ -0,0 +1,173 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers, brad.chambers at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+
+#include <Eigen/Core>
+
+#include <string>
+
+#include "gdal_priv.h" // For File I/O
+
+extern "C" int32_t DerivativeWriter_ExitFunc();
+extern "C" PF_ExitFunc DerivativeWriter_InitPlugin();
+
+namespace pdal
+{
+
+class BOX2D;
+
+class PDAL_DLL DerivativeWriter : public Writer
+{
+    enum SlopeMethod
+    {
+        SD8,
+        SFD
+    };
+
+    enum AspectMethod
+    {
+        AD8,
+        AFD
+    };
+
+    enum PrimitiveType
+    {
+        SLOPE_D8,
+        SLOPE_FD,
+        ASPECT_D8,
+        ASPECT_FD,
+        HILLSHADE,
+        CONTOUR_CURVATURE,
+        PROFILE_CURVATURE,
+        TANGENTIAL_CURVATURE,
+        TOTAL_CURVATURE,
+        CATCHMENT_AREA
+    };
+
+    enum CurvatureType
+    {
+        CONTOUR,
+        PROFILE,
+        TANGENTIAL,
+        TOTAL
+    };
+
+    enum Direction
+    {
+        NORTH,
+        SOUTH,
+        EAST,
+        WEST,
+        NORTHEAST,
+        NORTHWEST,
+        SOUTHEAST,
+        SOUTHWEST
+    };
+
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    DerivativeWriter();
+
+    Options getDefaultOptions();
+
+private:
+    virtual void initialize();
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+
+    void setBounds(const BOX2D& v)
+    {
+        m_bounds = v;
+    }
+
+    BOX2D& getBounds()
+    {
+        return m_bounds;
+    }
+
+    void calculateGridSizes();
+    double determineSlopeFD(Eigen::MatrixXd* data, int row, int col,
+                            double postSpacing, double valueToIgnore);
+    double determineSlopeD8(Eigen::MatrixXd* data, int row, int col,
+                            double postSpacing, double valueToIgnore);
+    double determineAspectFD(Eigen::MatrixXd* data, int row, int col,
+                             double postSpacing, double valueToIgnore);
+    double determineAspectD8(Eigen::MatrixXd* data, int row, int col,
+                             double postSpacing);
+    int determineCatchmentAreaD8(Eigen::MatrixXd* data, Eigen::MatrixXd* area,
+                                 int row, int col, double postSpacing);
+    double determineContourCurvature(Eigen::MatrixXd* data, int row, int col,
+                                     double postSpacing, double valueToIgnore);
+    double determineProfileCurvature(Eigen::MatrixXd* data, int row, int col,
+                                     double postSpacing, double valueToIgnore);
+    double determineTangentialCurvature(Eigen::MatrixXd* data, int row, int col,
+                                        double postSpacing, double valueToIgnore);
+    double determineTotalCurvature(Eigen::MatrixXd* data, int row, int col,
+                                   double postSpacing, double valueToIgnore);
+    double determineHillshade(Eigen::MatrixXd* data, int row, int col,
+                              double zenithRad, double azimuthRad,
+                              double postSpacing);
+    double GetNeighbor(Eigen::MatrixXd* data, int row, int col, Direction d);
+    void writeSlope(Eigen::MatrixXd* dem, const PointViewPtr cloud,
+                    SlopeMethod method=SD8);
+    void writeAspect(Eigen::MatrixXd* dem, const PointViewPtr cloud,
+                     AspectMethod method=AD8);
+    void writeCatchmentArea(Eigen::MatrixXd* dem, const PointViewPtr cloud);
+    void writeHillshade(Eigen::MatrixXd* dem, const PointViewPtr cloud);
+    void writeCurvature(Eigen::MatrixXd* dem, const PointViewPtr cloud,
+                        CurvatureType curveType, double valueToIgnore);
+    GDALDataset* createFloat32GTIFF(std::string filename, int cols, int rows);
+    void stretchData(float *data);
+
+    uint64_t m_pointCount;
+    uint32_t m_GRID_SIZE_X;
+    uint32_t m_GRID_SIZE_Y;
+    double m_GRID_DIST_X;
+    double m_GRID_DIST_Y;
+    unsigned int m_primitive_type;
+    BOX2D m_bounds;
+    std::string m_filename;
+    SpatialReference m_inSRS;
+
+    DerivativeWriter& operator=(const DerivativeWriter&); // not implemented
+    DerivativeWriter(const DerivativeWriter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/io/faux/CMakeLists.txt b/io/faux/CMakeLists.txt
new file mode 100644
index 0000000..61b4a95
--- /dev/null
+++ b/io/faux/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Faux driver CMake configuration
+#
+
+#
+# Faux Reader
+#
+set(srcs
+    FauxReader.cpp
+)
+
+set(incs
+    FauxReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader faux "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/faux/FauxReader.cpp b/io/faux/FauxReader.cpp
new file mode 100644
index 0000000..fc5b85e
--- /dev/null
+++ b/io/faux/FauxReader.cpp
@@ -0,0 +1,211 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "FauxReader.hpp"
+
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+
+#include <boost/algorithm/string.hpp>
+
+#include <ctime>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.faux",
+    "Faux Reader",
+    "http://pdal.io/stages/readers.faux.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, FauxReader, Reader, s_info)
+
+std::string FauxReader::getName() const { return s_info.name; }
+
+static Mode string2mode(const std::string& str)
+{
+    if (boost::iequals(str, "constant")) return Constant;
+    if (boost::iequals(str, "random")) return Random;
+    if (boost::iequals(str, "ramp")) return Ramp;
+    if (boost::iequals(str, "uniform")) return Uniform;
+    if (boost::iequals(str, "normal")) return Normal;
+    throw pdal_error("invalid Mode option: " + str);
+}
+
+
+FauxReader::FauxReader()
+    : pdal::Reader()
+{
+    m_count = 0;
+}
+
+void FauxReader::processOptions(const Options& options)
+{
+    BOX3D bounds;
+    try
+    {
+        bounds = options.getValueOrDefault<BOX3D>("bounds",
+            BOX3D(0, 0, 0, 1, 1, 1));
+    }
+    catch (boost::bad_lexical_cast)
+    {
+        std::string s = options.getValueOrDefault<std::string>("bounds");
+
+        std::ostringstream oss;
+        oss << "Invalid 'bounds' specification for " << getName() <<
+            ": '" << s << ".  Format: '([xmin,xmax],[ymin,ymax],[zmin,zmax])'.";
+        throw pdal_error(oss.str());
+    }
+    m_minX = bounds.minx;
+    m_maxX = bounds.maxx;
+    m_minY = bounds.miny;
+    m_maxY = bounds.maxy;
+    m_minZ = bounds.minz;
+    m_maxZ = bounds.maxz;
+
+    // For backward compatibility.
+    if (m_count == 0)
+        m_count = options.getValueOrThrow<point_count_t>("num_points");
+
+    m_mean_x = options.getValueOrDefault<double>("mean_x",0.0);
+    m_mean_y = options.getValueOrDefault<double>("mean_y",0.0);
+    m_mean_z = options.getValueOrDefault<double>("mean_z",0.0);
+    m_stdev_x = options.getValueOrDefault<double>("stdev_x",1.0);
+    m_stdev_y = options.getValueOrDefault<double>("stdev_y",1.0);
+    m_stdev_z = options.getValueOrDefault<double>("stdev_z",1.0);
+    m_mode = string2mode(options.getValueOrThrow<std::string>("mode"));
+    m_numReturns = options.getValueOrDefault("number_of_returns", 0);
+    if (m_numReturns > 10)
+        throw pdal_error("faux: number_of_returns option must be 10 or less.");
+}
+
+Options FauxReader::getDefaultOptions()
+{
+    Options options;
+    Option count("num_points", 10, "Number of points");
+    options.add(count);
+    return options;
+}
+
+
+void FauxReader::addDimensions(PointLayoutPtr layout)
+{
+    layout->registerDims(getDefaultDimensions());
+    if (m_numReturns > 0)
+    {
+        layout->registerDim(Dimension::Id::ReturnNumber);
+        layout->registerDim(Dimension::Id::NumberOfReturns);
+    }
+}
+
+
+Dimension::IdList FauxReader::getDefaultDimensions()
+{
+    Dimension::IdList ids;
+
+    ids.push_back(Dimension::Id::X);
+    ids.push_back(Dimension::Id::Y);
+    ids.push_back(Dimension::Id::Z);
+    ids.push_back(Dimension::Id::OffsetTime);
+    return ids;
+}
+
+
+point_count_t FauxReader::read(PointViewPtr view, point_count_t count)
+{
+    const double numDeltas = (double)count - 1.0;
+    const double delX = (m_maxX - m_minX) / numDeltas;
+    const double delY = (m_maxY - m_minY) / numDeltas;
+    const double delZ = (m_maxZ - m_minZ) / numDeltas;
+
+    log()->get(LogLevel::Debug5) << "Reading a point view of " <<
+        count << " points." << std::endl;
+
+    uint32_t seed = static_cast<uint32_t>(std::time(NULL));
+
+    for (PointId idx = 0; idx < count; ++idx)
+    {
+        double x;
+        double y;
+        double z;
+        switch (m_mode)
+        {
+            case Random:
+                x = Utils::random(m_minX, m_maxX);
+                y = Utils::random(m_minY, m_maxY);
+                z = Utils::random(m_minZ, m_maxZ);
+                break;
+            case Constant:
+                x = m_minX;
+                y = m_minY;
+                z = m_minZ;
+                break;
+            case Ramp:
+                x = m_minX + delX * idx;
+                y = m_minY + delY * idx;
+                z = m_minZ + delZ * idx;
+                break;
+            case Uniform:
+                x = Utils::uniform(m_minX, m_maxX, seed++);
+                y = Utils::uniform(m_minY, m_maxY, seed++);
+                z = Utils::uniform(m_minZ, m_maxZ, seed++);
+                break;
+            case Normal:
+                x = Utils::normal(m_mean_x, m_stdev_x, seed++);
+                y = Utils::normal(m_mean_y, m_stdev_y, seed++);
+                z = Utils::normal(m_mean_z, m_stdev_z, seed++);
+                break;
+            default:
+                throw pdal_error("invalid mode in FauxReader");
+                break;
+        }
+
+        view->setField(Dimension::Id::X, idx, x);
+        view->setField(Dimension::Id::Y, idx, y);
+        view->setField(Dimension::Id::Z, idx, z);
+        view->setField(Dimension::Id::OffsetTime, idx, m_time++);
+        if (m_numReturns > 0)
+        {
+            view->setField(Dimension::Id::ReturnNumber, idx, m_returnNum);
+            view->setField(Dimension::Id::NumberOfReturns, idx, m_numReturns);
+            m_returnNum = (m_returnNum % m_numReturns) + 1;
+        }
+
+        if (m_cb)
+            m_cb(*view, idx);
+    }
+    return count;
+}
+
+} // namespace pdal
diff --git a/io/faux/FauxReader.hpp b/io/faux/FauxReader.hpp
new file mode 100644
index 0000000..f2d229e
--- /dev/null
+++ b/io/faux/FauxReader.hpp
@@ -0,0 +1,128 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+
+extern "C" int32_t FauxReader_ExitFunc();
+extern "C" PF_ExitFunc FauxReader_InitPlugin();
+
+namespace pdal
+{
+
+enum Mode
+{
+    Constant,
+    Random,
+    Ramp,
+    Uniform,
+    Normal
+};
+
+
+// The FauxReader doesn't read from disk, but instead just makes up data for its
+// points.  The reader is constructed with a given bounding box and a given
+// number of points.
+//
+// This reader knows about these fields (Dimensions):
+//    X,Y,Z - floats
+//    Time  - uint64
+//    ReturnNumber (optional) - uint8
+//    NumberOfReturns (optional) - uint8
+//
+// It supports a few modes:
+//   - "random" generates points that are randomly distributed within the
+//     given bounding box
+//   - "constant" generates its points to always be at the minimum of the
+//      bounding box
+//   - "ramp" generates its points as a linear ramp from the minimum of the
+//     bbox to the maximum
+//   - "uniform" generates points that are uniformly distributed within the
+//     given bounding box
+//   - "normal" generates points that are normally distributed with a given
+//     mean and standard deviation in each of the XYZ dimensions
+// In all these modes, however, the Time field is always set to the point
+// number.
+//
+// ReturnNumber and NumberOfReturns are not included by default, but can be
+// activated by passing a numeric value as "number_of_returns" to the
+// reader constructor.
+//
+class PDAL_DLL FauxReader : public Reader
+{
+public:
+    FauxReader();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    static Dimension::IdList getDefaultDimensions();
+    Options getDefaultOptions();
+
+private:
+    Mode m_mode;
+    double m_minX;
+    double m_maxX;
+    double m_minY;
+    double m_maxY;
+    double m_minZ;
+    double m_maxZ;
+    double m_mean_x;
+    double m_mean_y;
+    double m_mean_z;
+    double m_stdev_x;
+    double m_stdev_y;
+    double m_stdev_z;
+    uint64_t m_time;
+    int m_numReturns;
+    int m_returnNum;
+
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table)
+    {
+        m_returnNum = 1;
+        m_time = 0;
+    }
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual bool eof()
+        { return false; }
+
+    FauxReader& operator=(const FauxReader&); // not implemented
+    FauxReader(const FauxReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/io/las/CMakeLists.txt b/io/las/CMakeLists.txt
new file mode 100644
index 0000000..d5d9d9b
--- /dev/null
+++ b/io/las/CMakeLists.txt
@@ -0,0 +1,66 @@
+#
+# LAS driver CMake configuration
+#
+
+if ((GEOTIFF_FOUND) AND (GDAL_FOUND))
+    set (PDAL_DRIVERS_LAS_GTIFF GeotiffSupport.cpp)
+endif()
+
+if (LASZIP_FOUND)
+    set(PDAL_DRIVERS_LAS_LASZIP ZipPoint.cpp)
+endif()
+
+set (srcs
+  ${PDAL_DRIVERS_LAS_GTIFF}
+  ${PDAL_DRIVERS_LAS_LASZIP}
+  LasHeader.cpp
+  LasUtils.cpp
+  SummaryData.cpp
+  VariableLengthRecord.cpp
+)
+
+set(incs
+  GeotiffSupport.hpp
+  HeaderVal.hpp
+  LasError.hpp
+  LasHeader.hpp
+  LasUtils.hpp
+  SummaryData.hpp
+  VariableLengthRecord.hpp
+  ZipPoint.hpp
+)
+
+set(objs "")
+
+add_library(lascommon OBJECT ${srcs} ${incs})
+set(objs ${objs} $<TARGET_OBJECTS:lascommon>)
+
+#
+# LAS Reader
+#
+set(srcs
+    LasReader.cpp
+)
+
+set(incs
+    LasReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader las "${srcs}" "${incs}" reader_objs)
+set(objs ${objs} ${reader_objs})
+
+#
+# LAS Writer
+#
+set(srcs
+    LasWriter.cpp
+)
+
+set(incs
+    LasWriter.hpp
+)
+
+PDAL_ADD_DRIVER(writer las "${srcs}" "${incs}" writer_objs)
+set(objs ${objs} ${writer_objs})
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/las/GeotiffSupport.cpp b/io/las/GeotiffSupport.cpp
new file mode 100644
index 0000000..c06e896
--- /dev/null
+++ b/io/las/GeotiffSupport.cpp
@@ -0,0 +1,313 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GeotiffSupport.hpp"
+
+// GDAL
+#include <geo_normalize.h>
+#include <ogr_spatialref.h>
+
+#include <sstream>
+
+PDAL_C_START
+#ifdef __geotiff_h_
+
+char PDAL_DLL * GTIFGetOGISDefn(GTIF*, GTIFDefn*);
+int PDAL_DLL GTIFSetFromOGISDefn(GTIF*, const char*);
+
+#endif // defined __geotiff_h_
+PDAL_C_END
+
+
+namespace pdal
+{
+
+GeotiffSupport::~GeotiffSupport()
+{
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    if (m_gtiff != 0)
+    {
+        GTIFFree(m_gtiff);
+        m_gtiff = 0;
+    }
+    if (m_tiff != 0)
+    {
+        ST_Destroy(m_tiff);
+        m_tiff = 0;
+    }
+#endif
+}
+
+
+void GeotiffSupport::resetTags()
+{
+    // If we already have m_gtiff and m_tiff, that is because we have
+    // already called GetGTIF once before.  VLRs ultimately drive how the
+    // SpatialReference is defined, not the GeoTIFF keys.
+    if (m_tiff != 0)
+    {
+        ST_Destroy(m_tiff);
+        m_tiff = 0;
+    }
+
+    if (m_gtiff != 0)
+    {
+        GTIFFree(m_gtiff);
+        m_gtiff = 0;
+    }
+
+    m_tiff = ST_Create();
+
+    return;
+}
+
+
+int GeotiffSupport::setKey(int tag, void *data, int size, int type)
+{
+    int count;
+    switch (type)
+    {
+    case STT_SHORT:
+        count = size / sizeof(short);
+        break;
+    case STT_DOUBLE:
+        count = size / sizeof(double);
+        break;
+    default:
+        count = size; 
+        break;
+    }
+    return ST_SetKey(m_tiff, tag, count, type, data);
+}
+
+
+/// Get the geotiff data associated with a tag.
+/// \param tag - geotiff tag.
+/// \param count - Number of items fetched.
+/// \param data_ptr - Pointer to fill with address of filled data.
+/// \return  Size of data referred to by \c data_ptr
+size_t GeotiffSupport::getKey(int tag, int *count, void **data_ptr) const
+{
+    int st_type;
+
+    if (m_tiff == 0)
+        return 0;
+    if (!ST_GetKey(m_tiff, tag, count, &st_type, data_ptr))
+        return 0;
+
+    if (st_type == STT_ASCII)
+        return *count;
+    else if (st_type == STT_SHORT)
+        return 2 * *count;
+    else if (st_type == STT_DOUBLE)
+        return 8 * *count;
+    return 8 * *count;
+}
+
+
+void GeotiffSupport::setTags()
+{
+    m_gtiff = GTIFNewSimpleTags(m_tiff);
+    if (!m_gtiff)
+        throw std::runtime_error("The geotiff keys could not be read from VLR records");
+    return;
+}
+
+
+std::string GeotiffSupport::getWkt(bool horizOnly, bool pretty) const
+{
+    GTIFDefn sGTIFDefn;
+    char* pszWKT = 0;
+
+    if (!m_gtiff)
+    {
+        return std::string();
+    }
+
+    if (!GTIFGetDefn(m_gtiff, &sGTIFDefn))
+    {
+        return std::string();
+    }
+
+    pszWKT = GTIFGetOGISDefn(m_gtiff, &sGTIFDefn);
+
+    if (pretty)
+    {
+        OGRSpatialReference* poSRS = (OGRSpatialReference*) OSRNewSpatialReference(NULL);
+        char *pszOrigWKT = pszWKT;
+        poSRS->importFromWkt(&pszOrigWKT);
+
+        CPLFree(pszWKT);
+        pszWKT = NULL;
+        poSRS->exportToPrettyWkt(&pszWKT, false);
+        OSRDestroySpatialReference(poSRS);
+
+    }
+
+    if (pszWKT
+            && horizOnly
+            && strstr(pszWKT,"COMPD_CS") != NULL)
+    {
+        OGRSpatialReference* poSRS = (OGRSpatialReference*) OSRNewSpatialReference(NULL);
+        char *pszOrigWKT = pszWKT;
+        poSRS->importFromWkt(&pszOrigWKT);
+
+        CPLFree(pszWKT);
+        pszWKT = NULL;
+
+        poSRS->StripVertical();
+        if (pretty)
+            poSRS->exportToPrettyWkt(&pszWKT, false);
+        else
+            poSRS->exportToWkt(&pszWKT);
+
+        OSRDestroySpatialReference(poSRS);
+    }
+
+    if (pszWKT)
+    {
+        std::string tmp(pszWKT);
+        CPLFree(pszWKT);
+        return tmp;
+    }
+
+    return std::string();
+}
+
+
+void GeotiffSupport::rebuildGTIF()
+{
+    // If we already have m_gtiff and m_tiff, that is because we have
+    // already called GetGTIF once before.  VLRs ultimately drive how the
+    // SpatialReference is defined, not the GeoTIFF keys.
+    if (m_tiff != 0)
+    {
+        ST_Destroy(m_tiff);
+        m_tiff = 0;
+    }
+
+    if (m_gtiff != 0)
+    {
+        GTIFFree(m_gtiff);
+        m_gtiff = 0;
+    }
+
+    m_tiff = ST_Create();
+
+    // (here it used to read in the VLRs)
+
+    m_gtiff = GTIFNewSimpleTags(m_tiff);
+    if (!m_gtiff)
+        throw std::runtime_error("The geotiff keys could not be read from VLR records");
+
+    return;
+}
+
+
+void GeotiffSupport::setWkt(const std::string& v)
+{
+    if (!m_gtiff)
+    {
+        rebuildGTIF();
+    }
+
+    if (v == "")
+    {
+        return;
+    }
+
+    int ret = 0;
+    ret = GTIFSetFromOGISDefn(m_gtiff, v.c_str());
+    if (!ret)
+    {
+        throw std::invalid_argument("could not set m_gtiff from WKT");
+    }
+
+    ret = GTIFWriteKeys(m_gtiff);
+    if (!ret)
+    {
+        throw std::runtime_error("The geotiff keys could not be written");
+    }
+
+    return;
+}
+
+
+// Utility functor with accompanying to print GeoTIFF directory.
+struct geotiff_dir_printer
+{
+    geotiff_dir_printer() {}
+
+    std::string output() const
+    {
+        return m_oss.str();
+    }
+    std::string::size_type size() const
+    {
+        return m_oss.str().size();
+    }
+
+    void operator()(char* data, void* /*aux*/)
+    {
+        if (0 != data)
+        {
+            m_oss << data;
+        }
+    }
+
+private:
+    std::ostringstream m_oss;
+};
+
+
+static int pdalGeoTIFFPrint(char* data, void* aux)
+{
+    geotiff_dir_printer* printer = reinterpret_cast<geotiff_dir_printer*>(aux);
+    (*printer)(data, 0);
+    return static_cast<int>(printer->size());
+}
+
+
+std::string GeotiffSupport::getText() const
+{
+    if (m_gtiff == NULL)
+        return std::string("");
+
+    geotiff_dir_printer geotiff_printer;
+    GTIFPrint(m_gtiff, pdalGeoTIFFPrint, &geotiff_printer);
+    const std::string s = geotiff_printer.output();
+    return s;
+}
+
+} // namespace pdal
diff --git a/io/las/GeotiffSupport.hpp b/io/las/GeotiffSupport.hpp
new file mode 100644
index 0000000..a63c147
--- /dev/null
+++ b/io/las/GeotiffSupport.hpp
@@ -0,0 +1,86 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+// See http://lists.osgeo.org/pipermail/gdal-dev/2013-November/037429.html
+#define CPL_SERV_H_INCLUDED
+
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+#include <geo_simpletags.h>
+#include <cpl_conv.h>
+#endif
+
+// Fake out the compiler if we don't have libgeotiff includes already
+#if !defined(__geotiff_h_)
+typedef struct GTIFS *GTIF;
+#endif
+#if !defined(__geo_simpletags_h_)
+typedef struct ST_TIFFS *ST_TIFF;
+#endif
+
+#include <string>
+#include <stdexcept>
+
+namespace pdal
+{
+
+class PDAL_DLL GeotiffSupport
+{
+public:
+    GeotiffSupport() : m_gtiff(0), m_tiff(0)
+    {}
+    ~GeotiffSupport();
+    
+    void resetTags();
+    int setKey(int tag, void *data, int size, int type);
+    size_t getKey(int tag, int *count, void **data_ptr) const;
+    void setTags();
+
+    std::string getWkt(bool horizOnly, bool pretty) const;
+    void setWkt(const std::string&);
+
+    std::string getText() const;
+
+private:
+    void rebuildGTIF();
+
+    GTIF* m_gtiff;
+    ST_TIFF* m_tiff;
+};
+
+} // namespace pdal
diff --git a/io/las/HeaderVal.hpp b/io/las/HeaderVal.hpp
new file mode 100644
index 0000000..db1bbc6
--- /dev/null
+++ b/io/las/HeaderVal.hpp
@@ -0,0 +1,136 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+namespace pdal
+{
+
+template <typename T>
+class BaseHeaderVal
+{
+protected:
+//    std::string m_name;
+    T m_val;
+    T m_defVal;
+    bool m_forward;
+    bool m_valSet;
+
+    BaseHeaderVal() : m_forward(false), m_valSet(false)
+    {}
+
+public:
+    bool valSet() const
+        { return m_valSet; }
+
+    void setDefault(const T& t)
+        { m_defVal = t; }
+};
+
+template <typename T, T MIN = std::numeric_limits<T>::lowest(),
+    T MAX = std::numeric_limits<T>::max()>
+class NumHeaderVal : public BaseHeaderVal<T>
+{
+public:
+    typedef T type;
+
+    bool setVal(T val)
+    {
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wtype-limits"
+        if (val >= MIN && val <= MAX)
+        {
+            this->m_val = val;
+            this->m_valSet = true;
+            return true;
+        }
+        return false;
+#pragma GCC diagnostic pop
+    }
+
+    T val()
+        { return (this->m_valSet ? this->m_val : this->m_defVal); }
+};
+
+class DoubleHeaderVal : public BaseHeaderVal<double>
+{
+public:
+    typedef double type;
+
+    bool setVal(double val)
+    {
+        m_val = val;
+        m_valSet = true;
+        return true;
+    }
+
+    double val()
+        { return (m_valSet ? m_val : m_defVal); }
+};
+
+template <size_t LEN>
+class StringHeaderVal : public BaseHeaderVal<std::string>
+{
+public:
+    typedef std::string type;
+
+    bool setVal(std::string val)
+    {
+        m_valSet = true;
+        m_val = val;
+        m_val.resize(std::min(m_val.length(), LEN));
+        return val.length() <= LEN;
+    }
+
+    std::string val()
+        { return m_valSet ? m_val : m_defVal; }
+};
+
+class UuidHeaderVal : public BaseHeaderVal<boost::uuids::uuid>
+{
+public:
+    typedef boost::uuids::uuid type;
+
+    bool setVal(boost::uuids::uuid val)
+    {
+        m_valSet = true;
+        m_val = val;
+        return true;
+    }
+
+    boost::uuids::uuid val()
+        { return m_valSet ? m_val : m_defVal; }
+};
+
+} // namespace pdal
+
diff --git a/io/las/LasError.hpp b/io/las/LasError.hpp
new file mode 100644
index 0000000..b7a6dbb
--- /dev/null
+++ b/io/las/LasError.hpp
@@ -0,0 +1,84 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc., hobu at hobu.co
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Hobu Inc. nor the names of contributors
+ *       to this software may be used to endorse or promote products derived
+ *       from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <vector>
+
+#include <pdal/util/Utils.hpp>
+#include <pdal/Log.hpp>
+
+namespace pdal
+{
+
+class LasError
+{
+public:
+    LasError() : m_filename("<unknown>")
+    {}
+
+    void setFilename(const std::string& filename)
+        { m_filename = filename; }
+
+    void setLog(LogPtr log) { m_log = log; }
+
+    void returnNumWarning(int returnNum)
+    {
+        static std::vector<int> warned;
+
+        if (!Utils::contains(warned, returnNum))
+        {
+            warned.push_back(returnNum);
+            m_log->get(LogLevel::Warning) << m_filename << ": Found invalid value of '" <<
+                returnNum << "' for point's return number.\n";
+        }
+    }
+
+    void numReturnsWarning(int numReturns)
+    {
+        static std::vector<int> warned;
+
+        if (!Utils::contains(warned, numReturns))
+        {
+            warned.push_back(numReturns);
+            m_log->get(LogLevel::Warning) << m_filename << ": Found invalid value "
+                "of '" << numReturns << "' for point's number of returns.\n";
+        }
+    }
+
+private:
+    std::string m_filename;
+    LogPtr m_log;
+};
+
+} // namespace pdal
diff --git a/io/las/LasHeader.cpp b/io/las/LasHeader.cpp
new file mode 100644
index 0000000..243c4e5
--- /dev/null
+++ b/io/las/LasHeader.cpp
@@ -0,0 +1,346 @@
+/******************************************************************************
+ * Copyright (c) 2008, Mateusz Loskot
+ * Copyright (c) 2008, Phil Vachon
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "LasHeader.hpp"
+
+#include <boost/uuid/uuid_generators.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+#include <pdal/util/Utils.hpp>
+#include <pdal/pdal_config.hpp>
+
+#include "SummaryData.hpp"
+
+namespace pdal
+{
+
+const std::string LasHeader::FILE_SIGNATURE("LASF");
+#ifndef _WIN32
+const size_t LasHeader::LEGACY_RETURN_COUNT;
+const size_t LasHeader::RETURN_COUNT;
+#endif
+
+std::string GetDefaultSoftwareId()
+{
+    std::string ver(PDAL_VERSION_STRING);
+    std::stringstream oss;
+    std::ostringstream revs;
+    revs << GetSHA1();
+
+
+    oss << "PDAL " << ver << " (" << revs.str().substr(0, 6) <<")";
+    return oss.str();
+}
+
+LasHeader::LasHeader() : m_fileSig(FILE_SIGNATURE), m_sourceId(0),
+    m_globalEncoding(0), m_versionMinor(2), m_systemId(getSystemIdentifier()),
+    m_createDOY(0), m_createYear(0), m_vlrOffset(0), m_pointOffset(0),
+    m_vlrCount(0), m_pointFormat(0), m_pointLen(0), m_pointCount(0),
+    m_isCompressed(false), m_eVlrOffset(0), m_eVlrCount(0)
+{
+    std::time_t now;
+    std::time(&now);
+    std::tm* ptm = std::gmtime(&now);
+    if (ptm)
+    {
+        m_createDOY = static_cast<uint16_t>(ptm->tm_yday);
+        m_createYear = static_cast<uint16_t>(ptm->tm_year + 1900);
+    }
+
+    m_pointLen = basePointLen(m_pointFormat);
+    m_pointCountByReturn.fill(0);
+    m_scales.fill(1.0);
+    m_offsets.fill(0.0);
+}
+
+
+void LasHeader::setSummary(const SummaryData& summary)
+{
+    m_pointCount = summary.getTotalNumPoints();
+    for (size_t num = 0; num < RETURN_COUNT; ++num)
+        m_pointCountByReturn[num] = summary.getReturnCount(num);
+    m_bounds = summary.getBounds();
+}
+
+
+void LasHeader::setScale(double x, double y, double z)
+{
+    if (Utils::compare_distance(0.0, x))
+        throw std::invalid_argument("X scale of 0.0 is invalid!");
+
+    if (Utils::compare_distance(0.0, y))
+        throw std::invalid_argument("Y scale of 0.0 is invalid!");
+
+    if (Utils::compare_distance(0.0, z))
+        throw std::invalid_argument("Z scale of 0.0 is invalid!");
+
+    m_scales[0] = x;
+    m_scales[1] = y;
+    m_scales[2] = z;
+}
+
+
+void LasHeader::setOffset(double x, double y, double z)
+{
+    m_offsets[0] = x;
+    m_offsets[1] = y;
+    m_offsets[2] = z;
+}
+
+
+uint16_t LasHeader::basePointLen(uint8_t type)
+{
+    switch (type)
+    {
+    case 0:
+        return 20;
+    case 1:
+        return 28;
+    case 2:
+        return 26;
+    case 3:
+        return 34;
+    case 6:
+        return 30;
+    case 7:
+        return 36;
+    case 8:
+        return 38;
+    }
+    return 0;
+}
+
+
+bool LasHeader::valid() const
+{
+    if (m_fileSig != FILE_SIGNATURE)
+        return false;
+    if (m_versionMinor > 10)
+        return false;
+    if (m_createDOY > 366)
+        return false;
+    if (m_createYear < 1970 || m_createYear > 2100)
+       return false;
+    return true;
+}
+
+
+void LasHeader::get(ILeStream& in, boost::uuids::uuid& uuid)
+{
+    union
+    {
+        char buf[16];
+        struct
+        {
+            uint32_t uidPart1;
+            uint16_t uidPart2;
+            uint16_t uidPart3;
+            char uidPart4[8];
+        };
+    } u;
+
+    in >> u.uidPart1 >> u.uidPart2 >> u.uidPart3;
+    in.get(u.uidPart4, sizeof(u.uidPart4));
+    memcpy(uuid.data, u.buf, sizeof(u.buf));
+}
+
+
+void LasHeader::put(OLeStream& out, boost::uuids::uuid uuid)
+{
+    union
+    {
+        char buf[16];
+        struct
+        {
+            uint32_t uidPart1;
+            uint16_t uidPart2;
+            uint16_t uidPart3;
+            char uidPart4[8];
+        };
+    } u;
+
+    memcpy(u.buf, uuid.data, sizeof(u.buf));
+    out << u.uidPart1 << u.uidPart2 << u.uidPart3;
+    out.put(u.uidPart4, sizeof(u.uidPart4));
+}
+
+
+ILeStream& operator>>(ILeStream& in, LasHeader& h)
+{
+    uint8_t versionMajor;
+    uint32_t legacyPointCount;
+    uint32_t legacyReturnCount;
+
+    in.get(h.m_fileSig, 4);
+    if (!Utils::iequals(h.m_fileSig, "LASF"))
+    {
+        throw pdal::pdal_error("File signature is not 'LASF', is this an LAS/LAZ file?");
+    }
+    in >> h.m_sourceId >> h.m_globalEncoding;
+    LasHeader::get(in, h.m_projectGuid);
+    in >> versionMajor >> h.m_versionMinor;
+    in.get(h.m_systemId, 32);
+
+    in.get(h.m_softwareId, 32);
+    in >> h.m_createDOY >> h.m_createYear >> h.m_vlrOffset >>
+        h.m_pointOffset >> h.m_vlrCount >> h.m_pointFormat >>
+        h.m_pointLen >> legacyPointCount;
+    h.m_pointCount = legacyPointCount;
+
+    // Although it isn't part of the LAS spec, the two high bits have been used
+    // to indicate compression, though only the high bit is currently used.
+    if (h.m_pointFormat & 0x80)
+        h.setCompressed(true);
+    h.m_pointFormat &= ~0xC0;
+
+    for (size_t i = 0; i < LasHeader::LEGACY_RETURN_COUNT; ++i)
+    {
+        in >> legacyReturnCount;
+        h.m_pointCountByReturn[i] = legacyReturnCount;
+    }
+
+    in >> h.m_scales[0] >> h.m_scales[1] >> h.m_scales[2];
+    in >> h.m_offsets[0] >> h.m_offsets[1] >> h.m_offsets[2];
+
+    double maxX, minX;
+    double maxY, minY;
+    double maxZ, minZ;
+    in >> maxX >> minX >> maxY >> minY >> maxZ >> minZ;
+    h.m_bounds = BOX3D(minX, minY, minZ, maxX, maxY, maxZ);
+
+    if (h.versionAtLeast(1, 3))
+    {
+        uint64_t waveformOffset;
+        in >> waveformOffset;
+    }
+    if (h.versionAtLeast(1, 4))
+    {
+        in >> h.m_eVlrOffset >> h.m_eVlrCount >> h.m_pointCount;
+        for (size_t i = 0; i < LasHeader::RETURN_COUNT; ++i)
+            in >> h.m_pointCountByReturn[i];
+    }
+
+    return in;
+}
+
+
+OLeStream& operator<<(OLeStream& out, const LasHeader& h)
+{
+    uint32_t legacyPointCount = 0;
+    if (h.m_pointCount <= (std::numeric_limits<uint32_t>::max)())
+        legacyPointCount = h.m_pointCount;
+
+    out.put(h.m_fileSig, 4);
+    if (h.versionEquals(1, 0))
+        out << (uint32_t)0;
+    else if (h.versionEquals(1, 1))
+        out << h.m_sourceId << (uint16_t)0;
+    else
+        out << h.m_sourceId << h.m_globalEncoding;
+    LasHeader::put(out, h.m_projectGuid);
+    out << (uint8_t)1 << h.m_versionMinor;
+    out.put(h.m_systemId, 32);
+    out.put(h.m_softwareId, 32);
+
+    uint8_t pointFormat = h.m_pointFormat;
+    if (h.compressed())
+        pointFormat |= 0x80;
+
+    out << h.m_createDOY << h.m_createYear << h.m_vlrOffset <<
+        h.m_pointOffset << h.m_vlrCount << pointFormat <<
+        h.m_pointLen << legacyPointCount;
+
+    for (size_t i = 0; i < LasHeader::LEGACY_RETURN_COUNT; ++i)
+    {
+        uint32_t legacyReturnCount = std::min(h.m_pointCountByReturn[i],
+            (uint64_t)(std::numeric_limits<uint32_t>::max)());
+        out << legacyReturnCount;
+    }
+
+    out << h.m_scales[0] << h.m_scales[1] << h.m_scales[2];
+    out << h.m_offsets[0] << h.m_offsets[1] << h.m_offsets[2];
+
+    out << h.maxX() << h.minX() << h.maxY() << h.minY() << h.maxZ() << h.minZ();
+
+    if (h.versionAtLeast(1, 3))
+        out << (uint64_t)0;
+    if (h.versionAtLeast(1, 4))
+    {
+        out << h.m_eVlrOffset << h.m_eVlrCount << h.m_pointCount;
+        for (size_t i = 0; i < LasHeader::RETURN_COUNT; ++i)
+            out << h.m_pointCountByReturn[i];
+    }
+
+    return out;
+}
+
+
+std::ostream& operator<<(std::ostream& out, const LasHeader& h)
+{
+    out << "File version = " << "1." << (int)h.m_versionMinor << "\n";
+    out << "File signature: " << h.m_fileSig << "\n";
+    out << "File source ID: " << h.m_sourceId << "\n";
+    out << "Global encoding: " << h.m_globalEncoding << "\n";
+    out << "Project GUID: " << h.m_projectGuid << "\n";
+    out << "System ID: " << h.m_systemId << "\n";
+    out << "Software ID: " << h.m_softwareId << "\n";
+    out << "Creation DOY: " << h.m_createDOY << "\n";
+    out << "Creation Year: " << h.m_createYear << "\n";
+    out << "VLR offset (header size): " << h.m_vlrOffset << "\n";
+    out << "VLR Count: " << h.m_vlrCount << "\n";
+    out << "Point format: " << (int)h.m_pointFormat << "\n";
+    out << "Point offset: " << h.m_pointOffset << "\n";
+    out << "Point count: " << h.m_pointCount << "\n";
+    for (size_t i = 0; i < LasHeader::RETURN_COUNT; ++i)
+        out << "Point count by return[" << i << "]: " <<
+            h.m_pointCountByReturn[i] << "\n";
+    out << "Scales X/Y/Z: " << h.m_scales[0] << "/" <<
+        h.m_scales[1] << "/" << h.m_scales[2] << "\n";
+    out << "Offsets X/Y/Z: " << h.m_offsets[0] << "/" <<
+        h.m_offsets[1] << "/" << h.m_offsets[2] << "\n";
+    out << "Max X/Y/Z: " << h.maxX() << "/" <<
+        h.maxY() << "/" << h.maxZ() << "\n";
+    out << "Min X/Y/Z: " << h.minX() << "/" <<
+        h.minY() << "/" << h.minZ() << "\n";
+    if (h.versionAtLeast(1, 4))
+    {
+        out << "Ext. VLR offset: " << h.m_eVlrOffset << "\n";
+        out << "Ext. VLR count: " << h.m_eVlrCount << "\n";
+    }
+    out << "Compressed: " << (h.m_isCompressed ? "true" : "false") << "\n";
+    return out;
+}
+
+} // namespace pdal
diff --git a/io/las/LasHeader.hpp b/io/las/LasHeader.hpp
new file mode 100644
index 0000000..c8513fb
--- /dev/null
+++ b/io/las/LasHeader.hpp
@@ -0,0 +1,403 @@
+/******************************************************************************
+ * Copyright (c) 2008, Mateusz Loskot
+ * Copyright (c) 2008, Phil Vachon
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <array>
+#include <vector>
+
+#include <boost/uuid/uuid.hpp>
+#include <boost/property_tree/ptree.hpp>
+
+#include <pdal/util/Bounds.hpp>
+#include <pdal/pdal_config.hpp>
+#include <pdal/gitsha.h>
+
+#include "VariableLengthRecord.hpp"
+
+namespace pdal
+{
+class OLeStream;
+class ILeStream;
+
+typedef uint8_t PointFormat;
+std::string GetDefaultSoftwareId();
+class SummaryData;
+
+class PDAL_DLL LasHeader
+{
+public:
+    static const size_t LEGACY_RETURN_COUNT = 5;
+    static const size_t RETURN_COUNT = 15;
+    static const std::string FILE_SIGNATURE;
+    inline std::string getSystemIdentifier() const { return "PDAL"; }
+
+    LasHeader();
+
+    /// Get ASPRS LAS file signature.
+    /// \return 4-characters long string - \b "LASF".
+    std::string fileSignature() const
+        { return m_fileSig; }
+
+    /// Set ASPRS LAS file signature.
+    /// The only value allowed as file signature is \b "LASF",
+    /// defined as FileSignature constant.
+    /// \exception std::invalid_argument - if invalid signature given.
+    /// \param v - string contains file signature, at least 4-bytes long
+    /// with "LASF" as first four bytes.
+    void SetFileSignature(std::string const& v);
+
+    /// Get file source identifier.
+    /// \exception No throw
+    uint16_t fileSourceId() const
+        { return m_sourceId; }
+
+    /// Set file source identifier.
+    /// \param v - should be set to a value between 1 and 65535.
+    /// \exception No throw
+    void setFileSourceId(uint16_t v)
+        { m_sourceId = v; }
+
+    uint16_t globalEncoding() const
+        { return m_globalEncoding; }
+    void setGlobalEncoding(uint16_t globalEncoding)
+        { m_globalEncoding = globalEncoding; }
+
+    /// Get project identifier.
+    /// \return Global Unique Identifier as an instance of liblas::guid class.
+    boost::uuids::uuid projectId() const
+        { return m_projectGuid; }
+
+    /// Set project identifier.
+    void setProjectId(boost::uuids::uuid const& v)
+        { m_projectGuid = v; }
+
+    /// Get the LAS major version.
+    /// \return  LAS major version
+    uint8_t versionMajor() const
+        { return (uint8_t)1; }
+
+    /// Get minor component of version of LAS format.
+    /// \return Valid values are 0, 1, 2, 3.
+    uint8_t versionMinor() const
+        { return m_versionMinor; }
+
+    /// Set minor component of version of LAS format.
+    /// \exception std::out_of_range - invalid value given.
+    /// \param v - value between eVersionMinorMin and eVersionMinorMax.
+    void setVersionMinor(uint8_t v)
+    {
+        assert(v <= 4);
+        m_versionMinor = v;
+    }
+
+    /// Determine if the header is for a LAS file version of at least
+    ///   a certain level.
+    /// \param major - Major version.
+    /// \param minor - Minor version.
+    /// \return  Whether the version meets the criteria.
+    bool versionAtLeast(uint8_t major, uint8_t minor) const
+        { return (1 >= major && m_versionMinor >= minor); }
+
+    /// Determine if the header is for a particular LAS file version.
+    /// \param major - Major version.
+    /// \param minor - Minor version.
+    /// \return  Whether the version meets the criteria.
+    bool versionEquals(uint8_t major, uint8_t minor) const
+        { return (major == 1 && minor == m_versionMinor); }
+
+    /// Get system identifier.
+    /// Default value is \b "libLAS" specified as the SystemIdentifier constant.
+    /// \param pad - if true the returned string is padded right with spaces and
+    /// its length is 32 bytes, if false (default) no padding occurs and
+    /// length of the returned string is <= 32 bytes.
+    /// \return value of system identifier field.
+    std::string systemId() const
+        { return m_systemId; }
+
+    /// Set system identifier.
+    /// \param v - system identifiers string.
+    void setSystemId(std::string const& v)
+        { m_systemId = v; }
+
+    /// Get software identifier.
+    /// Default value is \b "libLAS 1.0", specified as the SoftwareIdentifier
+    /// constant.
+    std::string softwareId() const
+        { return m_softwareId; }
+
+    /// Set software identifier.
+    /// \param v - software identifiers string.
+    void setSoftwareId(std::string const& v)
+        { m_softwareId = v; }
+
+    /// Get day of year of file creation date.
+    uint16_t creationDOY() const
+        { return m_createDOY; }
+
+    /// Set day of year of file creation date.
+    /// \exception std::out_of_range - given value is higher than number 366.
+    void setCreationDOY(uint16_t v)
+        { m_createDOY = v; }
+
+    /// Set year of file creation date.
+    uint16_t creationYear() const
+        { return m_createYear; }
+
+    /// Get year of file creation date.
+    /// \exception std::out_of_range - given value is higher than number 9999.
+    void setCreationYear(uint16_t v)
+        { m_createYear = v; }
+
+    /// Get number of bytes of generic verion of public header block storage.
+    /// Standard version of the public header block is 227 bytes long.
+    uint16_t vlrOffset() const
+        { return m_vlrOffset; }
+
+    void setVlrOffset(uint16_t offset)
+        { m_vlrOffset = offset; }
+
+    /// Get number of bytes from the beginning to the first point record.
+    uint32_t pointOffset() const
+        { return m_pointOffset; }
+
+    /// Set number of bytes from the beginning to the first point record.
+    /// \param  offset - Offset to start of point data.
+    void setPointOffset(uint32_t offset)
+          { m_pointOffset = offset; }
+
+    /// Set the point format.
+    /// \param format  Point format
+    void setPointFormat(uint8_t format)
+        { m_pointFormat = format; }
+
+    /// Get identifier of point data (record) format.
+    uint8_t pointFormat() const
+        { return m_pointFormat; }
+    bool pointFormatSupported() const
+    {
+        if (versionAtLeast(1, 4))
+            return m_pointFormat <= 10 && !hasWave();
+        else
+            return m_pointFormat <= 5 && !hasWave();
+    }
+
+    /// The length in bytes of each point.  All points in the file are
+    /// considered to be fixed in size, and the PointFormatName is used
+    /// to determine the fixed portion of the dimensions in the point.
+    uint16_t pointLen() const
+        { return m_pointLen; }
+	void setPointLen(uint16_t v)
+        { m_pointLen = v; }
+    uint16_t basePointLen()
+        { return basePointLen(m_pointFormat); }
+    uint16_t basePointLen(uint8_t format);
+
+    /// Set the number of points.
+    /// \param pointCount  Number of points in the file.
+    void setPointCount(uint64_t pointCount)
+        { m_pointCount = pointCount; }
+    /// Get total number of point records stored in the LAS file.
+    uint64_t pointCount() const
+        { return m_pointCount; }
+    //
+    /// Set values point count by return number.
+    /// \param index - Return number.
+    /// \param v - Point count for return number.
+    void setPointCountByReturn(std::size_t index, uint64_t v)
+        { m_pointCountByReturn[index] = v; }
+
+    /// Get the point count by return number.
+    /// \param index - Return number.
+    /// \return - Point count.
+    uint64_t pointCountByReturn(std::size_t index)
+        { return m_pointCountByReturn[index]; }
+
+    size_t maxReturnCount() const
+        { return (versionAtLeast(1, 4) ? RETURN_COUNT : LEGACY_RETURN_COUNT); }
+
+    /// Get scale factor for X coordinate.
+    double scaleX() const
+        { return m_scales[0]; }
+
+    /// Get scale factor for Y coordinate.
+    double scaleY() const
+        { return m_scales[1]; }
+
+    /// Get scale factor for Z coordinate.
+    double scaleZ() const
+        { return m_scales[2]; }
+
+    /// Set values of scale factor for X, Y and Z coordinates.
+    void setScale(double x, double y, double z);
+
+    /// Get X coordinate offset.
+    double offsetX() const
+        { return m_offsets[0]; }
+
+    /// Get Y coordinate offset.
+    double offsetY() const
+        { return m_offsets[1]; }
+
+    /// Get Z coordinate offset.
+    double offsetZ() const
+        { return m_offsets[2]; }
+
+    /// Set values of X, Y and Z coordinates offset.
+    void setOffset(double x, double y, double z);
+
+    /// Get minimum value of extent of X coordinate.
+    double maxX() const
+        { return m_bounds.maxx; }
+
+    /// Get maximum value of extent of X coordinate.
+    double minX() const
+        { return m_bounds.minx; }
+
+    /// Get minimum value of extent of Y coordinate.
+    double maxY() const
+        { return m_bounds.maxy; }
+
+    /// Get maximum value of extent of Y coordinate.
+    double minY() const
+        { return m_bounds.miny; }
+
+    /// Get minimum value of extent of Z coordinate.
+    double maxZ() const
+        { return m_bounds.maxz; }
+
+    /// Get maximum value of extent of Z coordinate.
+    double minZ() const
+       { return m_bounds.minz; }
+
+    const BOX3D& getBounds() const
+        { return m_bounds; }
+    void setBounds(const BOX3D& bounds)
+        { m_bounds = bounds; }
+
+    bool hasTime() const
+    {
+        PointFormat f = pointFormat();
+        return f == 1 || f >= 3;
+    }
+
+    bool hasColor() const
+    {
+        PointFormat f = pointFormat();
+        return f == 2 || f == 3 || f == 5 || f == 7 || f == 8 || f == 10;
+    }
+
+    bool hasWave() const
+    {
+        PointFormat f = pointFormat();
+        return f == 4 || f == 5 || f == 9 || f == 10;
+    }
+
+    bool hasInfrared() const
+    {
+        PointFormat f = pointFormat();
+        return f == 8;
+    }
+
+    bool has14Format() const
+    {
+        PointFormat f = pointFormat();
+        return f > 5;
+    }
+
+    /// Returns true iff the file is compressed (laszip),
+    /// as determined by the high bit in the point type
+    bool compressed() const
+        { return m_isCompressed; }
+
+    /// Sets whether or not the points are compressed.
+    void setCompressed(bool b)
+        { m_isCompressed = b; }
+
+    void setVlrCount(uint32_t vlrCount)
+        { m_vlrCount = vlrCount; }
+    uint32_t vlrCount() const
+        { return m_vlrCount; }
+    void setEVlrOffset(uint64_t offset)
+        { m_eVlrOffset = offset; }
+    uint64_t eVlrOffset() const
+        { return m_eVlrOffset; }
+    void setEVlrCount(uint32_t count)
+        { m_eVlrCount = count; }
+    uint32_t eVlrCount() const
+        { return m_eVlrCount; }
+
+    std::string const& compressionInfo() const
+        { return m_compressionInfo; }
+    void setCompressionInfo(std::string const& info)
+        { m_compressionInfo = info; }
+
+    void setSummary(const SummaryData& summary);
+    bool valid() const;
+
+    friend ILeStream& operator>>(ILeStream&, LasHeader& h);
+    friend OLeStream& operator<<(OLeStream&, const LasHeader& h);
+    friend std::ostream& operator<<(std::ostream& ostr, const LasHeader& h);
+
+private:
+    std::string m_fileSig;
+    uint16_t m_sourceId;
+    uint16_t m_globalEncoding;
+    boost::uuids::uuid m_projectGuid;
+    uint8_t m_versionMinor;
+    std::string m_systemId;
+    std::string m_softwareId;
+    uint16_t m_createDOY;
+    uint16_t m_createYear;
+    uint16_t m_vlrOffset;  // Same as header size.
+    uint32_t m_pointOffset;
+    uint32_t m_vlrCount;
+    uint8_t m_pointFormat;
+    uint16_t m_pointLen;
+    uint64_t m_pointCount;
+    std::array<uint64_t, RETURN_COUNT> m_pointCountByReturn;
+    std::array<double, 3> m_scales;
+    std::array<double, 3> m_offsets;
+    bool m_isCompressed;
+    uint64_t m_eVlrOffset;
+    uint32_t m_eVlrCount;
+    BOX3D m_bounds;
+    std::string m_compressionInfo;
+
+    static void get(ILeStream& in, boost::uuids::uuid& uuid);
+    static void put(OLeStream& in, boost::uuids::uuid uuid);
+};
+
+} // namespace pdal
diff --git a/io/las/LasReader.cpp b/io/las/LasReader.cpp
new file mode 100644
index 0000000..4967073
--- /dev/null
+++ b/io/las/LasReader.cpp
@@ -0,0 +1,836 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "LasReader.hpp"
+
+#include <sstream>
+#include <string.h>
+
+#include <pdal/Metadata.hpp>
+#include <pdal/PDALUtils.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/QuickInfo.hpp>
+#include <pdal/util/Extractor.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/IStream.hpp>
+
+#include "GeotiffSupport.hpp"
+#include "LasHeader.hpp"
+#include "VariableLengthRecord.hpp"
+#include "ZipPoint.hpp"
+
+namespace pdal
+{
+
+namespace
+{
+
+class invalid_stream : public pdal_error
+{
+public:
+    invalid_stream(const std::string& msg) : pdal_error(msg)
+        {}
+};
+
+} // unnamed namespace
+
+void LasReader::processOptions(const Options& options)
+{
+    StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
+    m_extraDims = LasUtils::parse(extraDims);
+
+    m_error.setFilename(m_filename);
+}
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.las",
+    "ASPRS LAS 1.0 - 1.4 read support. LASzip support is also \n" \
+        "enabled through this driver if LASzip was found during \n" \
+        "compilation.",
+    "http://pdal.io/stages/readers.las.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, LasReader, Reader, s_info)
+
+std::string LasReader::getName() const { return s_info.name; }
+
+QuickInfo LasReader::inspect()
+{
+    QuickInfo qi;
+    std::unique_ptr<PointLayout> layout(new PointLayout());
+
+    addDimensions(layout.get());
+    initialize();
+
+    Dimension::IdList dims = layout->dims();
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+        qi.m_dimNames.push_back(layout->dimName(*di));
+    if (!Utils::numericCast(m_lasHeader.pointCount(), qi.m_pointCount))
+        qi.m_pointCount = std::numeric_limits<point_count_t>::max();
+    qi.m_bounds = m_lasHeader.getBounds();
+    qi.m_srs = getSrsFromVlrs();
+    qi.m_valid = true;
+
+    PointTable table;
+    done(table);
+
+    return qi;
+}
+
+
+void LasReader::initialize()
+{
+    if (m_initialized)
+        return;
+    m_istream = createStream();
+
+    m_istream->seekg(0);
+    ILeStream in(m_istream);
+    in >> m_lasHeader;
+
+    if (!m_lasHeader.pointFormatSupported())
+    {
+        std::ostringstream oss;
+        oss << "Unsupported LAS input point format: " <<
+            (int)m_lasHeader.pointFormat() << ".";
+       throw pdal_error(oss.str());
+    }
+
+    // We need to read the VLRs in initialize() because they may contain an
+    // extra-bytes VLR that is needed to determine dimensions.
+    m_istream->seekg(m_lasHeader.vlrOffset());
+    for (size_t i = 0; i < m_lasHeader.vlrCount(); ++i)
+    {
+        VariableLengthRecord r;
+        in >> r;
+        m_vlrs.push_back(std::move(r));
+    }
+
+    if (m_lasHeader.versionAtLeast(1, 4))
+    {
+        m_istream->seekg(m_lasHeader.eVlrOffset());
+        for (size_t i = 0; i < m_lasHeader.eVlrCount(); ++i)
+        {
+            ExtVariableLengthRecord r;
+            in >> r;
+            m_vlrs.push_back(std::move(r));
+        }
+        readExtraBytesVlr();
+    }
+    fixupVlrs();
+    m_initialized = true;
+}
+
+
+void LasReader::ready(PointTableRef table, MetadataNode& m)
+{
+    m_index = 0;
+
+    setSrsFromVlrs(m);
+    MetadataNode forward = table.privateMetadata("lasforward");
+    extractHeaderMetadata(forward, m);
+    extractVlrMetadata(forward, m);
+
+    if (m_lasHeader.compressed())
+    {
+#ifdef PDAL_HAVE_LASZIP
+        VariableLengthRecord *vlr = findVlr(LASZIP_USER_ID, LASZIP_RECORD_ID);
+        m_zipPoint.reset(new ZipPoint(vlr));
+
+        if (!m_unzipper)
+        {
+            m_unzipper.reset(new LASunzipper());
+
+            m_istream->seekg(m_lasHeader.pointOffset(), std::ios::beg);
+
+            // Once we open the zipper, don't touch the stream until the
+            // zipper is closed or bad things happen.
+            if (!m_unzipper->open(*m_istream, m_zipPoint->GetZipper()))
+            {
+                std::ostringstream oss;
+                const char* err = m_unzipper->get_error();
+                if (err == NULL)
+                    err = "(unknown error)";
+                oss << "Failed to open LASzip stream: " << std::string(err);
+                throw pdal_error(oss.str());
+            }
+        }
+#else
+        throw pdal_error("LASzip is not enabled.  Can't read LAZ data.");
+#endif
+    }
+    m_error.setLog(log());
+
+}
+
+
+Options LasReader::getDefaultOptions()
+{
+    Options options;
+    options.add("filename", "", "file to read from");
+    options.add("extra_dims", "", "Extra dimensions not part of the LAS "
+        "point format to be read from each point.");
+    return options;
+}
+
+
+// Store data in the normal metadata place.  Also store it in the private
+// lasforward metadata node.
+template <typename T>
+void addForwardMetadata(MetadataNode& forward, MetadataNode& m,
+    const std::string& name, T val, const std::string description = "")
+{
+    MetadataNode n = m.add(name, val, description);
+
+    // If the entry doesn't already exist, just add it.
+    MetadataNode f = forward.findChild(name);
+    if (!f.valid())
+    {
+        forward.add(n);
+        return;
+    }
+
+    // If the old value and new values aren't the same, set an invalid flag.
+    MetadataNode temp = f.addOrUpdate("temp", val);
+    if (f.value<std::string>() != temp.value<std::string>())
+        forward.addOrUpdate(name + "INVALID", "");
+}
+
+
+void LasReader::extractHeaderMetadata(MetadataNode& forward, MetadataNode& m)
+{
+    m.add<bool>("compressed", m_lasHeader.compressed(),
+        "true if this LAS file is compressed");
+
+    addForwardMetadata(forward, m, "major_version", m_lasHeader.versionMajor(),
+        "The major LAS version for the file, always 1 for now");
+    addForwardMetadata(forward, m, "minor_version", m_lasHeader.versionMinor(),
+        "The minor LAS version for the file");
+    addForwardMetadata(forward, m, "dataformat_id", m_lasHeader.pointFormat(),
+        "LAS Point Data Format");
+    if (m_lasHeader.versionAtLeast(1, 1))
+        addForwardMetadata(forward, m, "filesource_id",
+            m_lasHeader.fileSourceId(), "File Source ID (Flight Line Number "
+            "if this file was derived from an original flight line).");
+    if (m_lasHeader.versionAtLeast(1, 2))
+    {
+        // For some reason we've written global encoding as a base 64
+        // encoded value in the past.  In an effort to standardize things,
+        // I'm writing this as a special value, and will also write
+        // global_encoding like we write all other header metadata.
+        uint16_t globalEncoding = m_lasHeader.globalEncoding();
+        m.addEncoded("global_encoding_base64", (uint8_t *)&globalEncoding,
+            sizeof(globalEncoding),
+            "Global Encoding: general property bit field.");
+
+        addForwardMetadata(forward, m, "global_encoding",
+            m_lasHeader.globalEncoding(),
+            "Global Encoding: general property bit field.");
+    }
+
+    addForwardMetadata(forward, m, "project_id", m_lasHeader.projectId(),
+        "Project ID.");
+    addForwardMetadata(forward, m, "system_id", m_lasHeader.systemId());
+    addForwardMetadata(forward, m, "software_id", m_lasHeader.softwareId(),
+        "Generating software description.");
+    addForwardMetadata(forward, m, "creation_doy", m_lasHeader.creationDOY(),
+        "Day, expressed as an unsigned short, on which this file was created. "
+        "Day is computed as the Greenwich Mean Time (GMT) day. January 1 is "
+        "considered day 1.");
+    addForwardMetadata(forward, m, "creation_year", m_lasHeader.creationYear(),
+        "The year, expressed as a four digit number, in which the file was "
+        "created.");
+    addForwardMetadata(forward, m, "scale_x", m_lasHeader.scaleX(),
+        "The scale factor for X values.");
+    addForwardMetadata(forward, m, "scale_y", m_lasHeader.scaleY(),
+        "The scale factor for Y values.");
+    addForwardMetadata(forward, m, "scale_z", m_lasHeader.scaleZ(),
+        "The scale factor for Z values.");
+    addForwardMetadata(forward, m, "offset_x", m_lasHeader.offsetX(),
+        "The offset for X values.");
+    addForwardMetadata(forward, m, "offset_y", m_lasHeader.offsetY(),
+        "The offset for Y values.");
+    addForwardMetadata(forward, m, "offset_z", m_lasHeader.offsetZ(),
+        "The offset for Z values.");
+
+    m.add("header_size", m_lasHeader.vlrOffset(),
+        "The size, in bytes, of the header block, including any extension "
+        "by specific software.");
+    m.add("dataoffset", m_lasHeader.pointOffset(),
+        "The actual number of bytes from the beginning of the file to the "
+        "first field of the first point record data field. This data offset "
+        "must be updated if any software adds data from the Public Header "
+        "Block or adds/removes data to/from the Variable Length Records.");
+    m.add<double>("minx", m_lasHeader.minX(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<double>("miny", m_lasHeader.minY(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<double>("minz", m_lasHeader.minZ(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<double>("maxx", m_lasHeader.maxX(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<double>("maxy", m_lasHeader.maxY(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<double>("maxz", m_lasHeader.maxZ(),
+        "The max and min data fields are the actual unscaled extents of the "
+        "LAS point file data, specified in the coordinate system of the LAS "
+        "data.");
+    m.add<uint32_t>("count",
+        m_lasHeader.pointCount(), "This field contains the total "
+        "number of point records within the file.");
+}
+
+
+void LasReader::fixupVlrs()
+{
+    const size_t KEY_SIZE = 8;
+    char zeros[8] = {};
+
+    // There is currently only one fixup - for the geotiff directory VLR.
+    VariableLengthRecord *vlr =
+        findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID);
+    if (vlr)
+    {
+        while (vlr->dataLen() > 8)
+        {
+            // If the key at the end has a zero value, remove it
+            // by resizing the array and decrementing the size.
+            char *testPos = const_cast<char *>(
+                vlr->data() + vlr->dataLen() - KEY_SIZE);
+            if (memcmp(zeros, testPos, KEY_SIZE))
+                break;
+            uint16_t size;
+            vlr->setDataLen(vlr->dataLen() - 8);
+
+            // Reduce the size of the data by one.  The size field is
+            // at offset 6 from the beginning of the data.
+            memcpy((void *)&size, vlr->data() + 6, 2);
+            size = le16toh(size);
+            size--;
+            size = htole16(size);
+            memcpy((void *)(vlr->data()  + 6), &size, 2);
+        }
+    }
+}
+
+
+void LasReader::readExtraBytesVlr()
+{
+    VariableLengthRecord *vlr = findVlr(SPEC_USER_ID, EXTRA_BYTES_RECORD_ID);
+    if (!vlr)
+        return;
+    const char *pos = vlr->data();
+    size_t size = vlr->dataLen();
+    if (size % sizeof(ExtraBytesSpec) != 0)
+    {
+        log()->get(LogLevel::Warning) << "Bad size for extra bytes VLR.  "
+            "Ignoring.";
+        return;
+    }
+    size /= sizeof(ExtraBytesSpec);
+    std::vector<ExtraBytesIf> ebList;
+    while (size--)
+    {
+        ExtraBytesIf eb;
+        eb.readFrom(pos);
+        ebList.push_back(eb);
+        pos += sizeof(ExtraBytesSpec);
+    }
+
+    std::vector<ExtraDim> extraDims;
+    for (ExtraBytesIf& eb : ebList)
+    {
+       std::vector<ExtraDim> eds = eb.toExtraDims();
+       for (auto& ed : eds)
+           extraDims.push_back(std::move(ed));
+    }
+    if (m_extraDims.size() && m_extraDims != extraDims)
+        log()->get(LogLevel::Warning) << "Extra byte dimensions specified "
+            "in pineline and VLR don't match.  Ignoring pipeline-specified "
+            "dimensions";
+    m_extraDims = extraDims;
+}
+
+
+void LasReader::setSrsFromVlrs(MetadataNode& m)
+{
+    // If the user is already overriding this by setting it on the stage, we'll
+    // take their overridden value
+    SpatialReference srs = getSpatialReference();
+
+    if (srs.getWKT(pdal::SpatialReference::eCompoundOK).empty())
+        setSpatialReference(m, getSrsFromVlrs());
+}
+
+
+SpatialReference LasReader::getSrsFromVlrs()
+{
+    SpatialReference srs = getSrsFromWktVlr();
+    if (srs.empty())
+        srs = getSrsFromGeotiffVlr();
+    return srs;
+}
+
+
+VariableLengthRecord *LasReader::findVlr(const std::string& userId,
+    uint16_t recordId)
+{
+    for (auto vi = m_vlrs.begin(); vi != m_vlrs.end(); ++vi)
+    {
+        VariableLengthRecord& vlr = *vi;
+        if (vlr.matches(userId, recordId))
+            return &vlr;
+    }
+    return NULL;
+}
+
+
+SpatialReference LasReader::getSrsFromWktVlr()
+{
+    SpatialReference srs;
+
+    VariableLengthRecord *vlr = findVlr(TRANSFORM_USER_ID, WKT_RECORD_ID);
+    if (!vlr)
+        vlr = findVlr(LIBLAS_USER_ID, WKT_RECORD_ID);
+    if (!vlr || vlr->dataLen() == 0)
+        return srs;
+
+    // There is supposed to be a NULL byte at the end of the data,
+    // but sometimes there isn't because some people don't follow the
+    // rules.  If there is a NULL byte, don't stick it in the
+    // wkt string.
+    size_t len = vlr->dataLen();
+    const char *c = vlr->data() + len - 1;
+    if (*c == 0)
+        len--;
+    std::string wkt(vlr->data(), len);
+    srs.setWKT(wkt);
+    return srs;
+}
+
+
+SpatialReference LasReader::getSrsFromGeotiffVlr()
+{
+    SpatialReference srs;
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    GeotiffSupport geotiff;
+    geotiff.resetTags();
+
+    VariableLengthRecord *vlr;
+
+    vlr = findVlr(TRANSFORM_USER_ID, GEOTIFF_DIRECTORY_RECORD_ID);
+    // We must have a directory entry.
+    if (!vlr)
+        return srs;
+    geotiff.setKey(vlr->recordId(), (void *)vlr->data(), vlr->dataLen(),
+        STT_SHORT);
+
+    vlr = findVlr(TRANSFORM_USER_ID, GEOTIFF_DOUBLES_RECORD_ID);
+    if (vlr)
+        geotiff.setKey(vlr->recordId(), (void *)vlr->data(), vlr->dataLen(),
+            STT_DOUBLE);
+    vlr = findVlr(TRANSFORM_USER_ID, GEOTIFF_ASCII_RECORD_ID);
+    if (vlr)
+        geotiff.setKey(vlr->recordId(), (void *)vlr->data(), vlr->dataLen(),
+            STT_ASCII);
+
+    geotiff.setTags();
+    std::string wkt(geotiff.getWkt(false, false));
+    if (wkt.size())
+        srs.setFromUserInput(geotiff.getWkt(false, false));
+
+#endif
+    return srs;
+}
+
+
+void LasReader::extractVlrMetadata(MetadataNode& forward, MetadataNode& m)
+{
+    static const size_t DATA_LEN_MAX = 1000000;
+
+    int i = 0;
+    for (auto vi = m_vlrs.begin(); vi != m_vlrs.end(); ++vi, ++i)
+    {
+        const VariableLengthRecord& vlr = *vi;
+        if (vlr.dataLen() > DATA_LEN_MAX)
+            continue;
+
+        std::ostringstream name;
+        name << "vlr_" << i;
+        MetadataNode vlrNode = m.addEncoded(name.str(),
+            (const uint8_t *)vlr.data(), vlr.dataLen(), vlr.description());
+
+        vlrNode.add("user_id", vlr.userId(),
+            "User ID of the record or pre-defined value from the "
+            "specification.");
+        vlrNode.add("record_id", vlr.recordId(),
+            "Record ID specified by the user.");
+        vlrNode.add("description", vlr.description());
+
+        if ((vlr.userId() != TRANSFORM_USER_ID) &&
+            (vlr.userId() != SPEC_USER_ID) &&
+            (vlr.userId() != LASZIP_USER_ID) &&
+            (vlr.userId() != LIBLAS_USER_ID))
+            forward.add(vlrNode);
+    }
+}
+
+
+void LasReader::addDimensions(PointLayoutPtr layout)
+{
+    using namespace Dimension;
+
+    layout->registerDim(Id::X, Type::Double);
+    layout->registerDim(Id::Y, Type::Double);
+    layout->registerDim(Id::Z, Type::Double);
+    layout->registerDim(Id::Intensity, Type::Unsigned16);
+    layout->registerDim(Id::ReturnNumber, Type::Unsigned8);
+    layout->registerDim(Id::NumberOfReturns, Type::Unsigned8);
+    layout->registerDim(Id::ScanDirectionFlag, Type::Unsigned8);
+    layout->registerDim(Id::EdgeOfFlightLine, Type::Unsigned8);
+    layout->registerDim(Id::Classification, Type::Unsigned8);
+    layout->registerDim(Id::ScanAngleRank, Type::Float);
+    layout->registerDim(Id::UserData, Type::Unsigned8);
+    layout->registerDim(Id::PointSourceId, Type::Unsigned16);
+
+    if (m_lasHeader.hasTime())
+        layout->registerDim(Id::GpsTime, Type::Double);
+    if (m_lasHeader.hasColor())
+    {
+        layout->registerDim(Id::Red, Type::Unsigned16);
+        layout->registerDim(Id::Green, Type::Unsigned16);
+        layout->registerDim(Id::Blue, Type::Unsigned16);
+    }
+    if (m_lasHeader.hasInfrared())
+        layout->registerDim(Id::Infrared);
+    if (m_lasHeader.versionAtLeast(1, 4))
+        layout->registerDim(Id::ScanChannel);
+
+    for (auto& dim : m_extraDims)
+    {
+        Dimension::Type::Enum type = dim.m_dimType.m_type;
+        if (type == Dimension::Type::None)
+            continue;
+        if (dim.m_dimType.m_xform.nonstandard())
+            type = Dimension::Type::Double;
+        dim.m_dimType.m_id = layout->assignDim(dim.m_name, type);
+    }
+}
+
+
+point_count_t LasReader::read(PointViewPtr view, point_count_t count)
+{
+    size_t pointByteCount = m_lasHeader.pointLen();
+    count = std::min(count, getNumPoints() - m_index);
+
+    PointId i = 0;
+    if (m_zipPoint)
+    {
+#ifdef PDAL_HAVE_LASZIP
+        for (i = 0; i < count; i++)
+        {
+            if (!m_unzipper->read(m_zipPoint->m_lz_point))
+            {
+                std::string error = "Error reading compressed point data: ";
+                const char* err = m_unzipper->get_error();
+                if (!err)
+                    err = "(unknown error)";
+                error += err;
+                throw pdal_error(error);
+            }
+            loadPoint(*view.get(), (char *)m_zipPoint->m_lz_point_data.data(),
+                pointByteCount);
+        }
+#else
+        throw pdal_error("LASzip is not enabled for this "
+            "LasReader::processBuffer");
+#endif
+    }
+    else
+    {
+        m_istream->seekg(m_lasHeader.pointOffset());
+        point_count_t remaining = count;
+
+        // Make a buffer at most a meg.
+        size_t bufsize = std::min<size_t>((point_count_t)1000000,
+            count * pointByteCount);
+        std::vector<char> buf(bufsize);
+        try
+        {
+            do
+            {
+                point_count_t blockPoints = readFileBlock(buf, remaining);
+                remaining -= blockPoints;
+                char *pos = buf.data();
+                while (blockPoints--)
+                {
+                    loadPoint(*view.get(), pos, pointByteCount);
+                    pos += pointByteCount;
+                    i++;
+                }
+            } while (remaining);
+        }
+        catch (std::out_of_range&)
+        {}
+        catch (invalid_stream&)
+        {}
+    }
+    m_index += i;
+    return (point_count_t)i;
+}
+
+
+point_count_t LasReader::readFileBlock(std::vector<char>& buf,
+    point_count_t maxpoints)
+{
+    size_t ptLen = m_lasHeader.pointLen();
+    point_count_t blockpoints = buf.size() / ptLen;
+
+    blockpoints = std::min(maxpoints, blockpoints);
+    if (m_istream->eof())
+        throw invalid_stream("stream is done");
+
+    m_istream->read(buf.data(), blockpoints * ptLen);
+    if (m_istream->gcount() != (std::streamsize)(blockpoints * ptLen))
+    {
+        // we read fewer bytes than we asked for
+        // because the file was either truncated
+        // or the header is bunk.
+        blockpoints = m_istream->gcount() / ptLen;
+    }
+    return blockpoints;
+}
+
+
+void LasReader::loadPoint(PointView& data, char *buf, size_t bufsize)
+{
+    if (m_lasHeader.has14Format())
+        loadPointV14(data, buf, bufsize);
+    else
+        loadPointV10(data, buf, bufsize);
+}
+
+
+void LasReader::loadPointV10(PointView& data, char *buf, size_t bufsize)
+{
+    LeExtractor istream(buf, bufsize);
+
+    PointId nextId = data.size();
+
+    int32_t xi, yi, zi;
+    istream >> xi >> yi >> zi;
+
+    const LasHeader& h = m_lasHeader;
+
+    double x = xi * h.scaleX() + h.offsetX();
+    double y = yi * h.scaleY() + h.offsetY();
+    double z = zi * h.scaleZ() + h.offsetZ();
+
+    uint16_t intensity;
+    uint8_t flags;
+    uint8_t classification;
+    int8_t scanAngleRank;
+    uint8_t user;
+    uint16_t pointSourceId;
+
+    istream >> intensity >> flags >> classification >> scanAngleRank >>
+        user >> pointSourceId;
+
+    uint8_t returnNum = flags & 0x07;
+    uint8_t numReturns = (flags >> 3) & 0x07;
+    uint8_t scanDirFlag = (flags >> 6) & 0x01;
+    uint8_t flight = (flags >> 7) & 0x01;
+
+    if (returnNum == 0 || returnNum > 5)
+        m_error.returnNumWarning(returnNum);
+
+    if (numReturns == 0 || numReturns > 5)
+        m_error.numReturnsWarning(numReturns);
+
+    data.setField(Dimension::Id::X, nextId, x);
+    data.setField(Dimension::Id::Y, nextId, y);
+    data.setField(Dimension::Id::Z, nextId, z);
+    data.setField(Dimension::Id::Intensity, nextId, intensity);
+    data.setField(Dimension::Id::ReturnNumber, nextId, returnNum);
+    data.setField(Dimension::Id::NumberOfReturns, nextId, numReturns);
+    data.setField(Dimension::Id::ScanDirectionFlag, nextId, scanDirFlag);
+    data.setField(Dimension::Id::EdgeOfFlightLine, nextId, flight);
+    data.setField(Dimension::Id::Classification, nextId, classification);
+    data.setField(Dimension::Id::ScanAngleRank, nextId, scanAngleRank);
+    data.setField(Dimension::Id::UserData, nextId, user);
+    data.setField(Dimension::Id::PointSourceId, nextId, pointSourceId);
+
+    if (h.hasTime())
+    {
+        double time;
+        istream >> time;
+        data.setField(Dimension::Id::GpsTime, nextId, time);
+    }
+
+    if (h.hasColor())
+    {
+        uint16_t red, green, blue;
+        istream >> red >> green >> blue;
+        data.setField(Dimension::Id::Red, nextId, red);
+        data.setField(Dimension::Id::Green, nextId, green);
+        data.setField(Dimension::Id::Blue, nextId, blue);
+    }
+
+    if (m_extraDims.size())
+        loadExtraDims(istream, data, nextId);
+    if (m_cb)
+        m_cb(data, nextId);
+}
+
+void LasReader::loadPointV14(PointView& data, char *buf, size_t bufsize)
+{
+    LeExtractor istream(buf, bufsize);
+
+    PointId nextId = data.size();
+
+    int32_t xi, yi, zi;
+    istream >> xi >> yi >> zi;
+
+    const LasHeader& h = m_lasHeader;
+
+    double x = xi * h.scaleX() + h.offsetX();
+    double y = yi * h.scaleY() + h.offsetY();
+    double z = zi * h.scaleZ() + h.offsetZ();
+
+    uint16_t intensity;
+    uint8_t returnInfo;
+    uint8_t flags;
+    uint8_t classification;
+    uint8_t user;
+    int16_t scanAngle;
+    uint16_t pointSourceId;
+    double gpsTime;
+
+    istream >> intensity >> returnInfo >> flags >> classification >> user >>
+        scanAngle >> pointSourceId >> gpsTime;
+
+    uint8_t returnNum = returnInfo & 0x0F;
+    uint8_t numReturns = (returnInfo >> 4) & 0x0F;
+    uint8_t classFlags = flags & 0x0F;
+    uint8_t scanChannel = (flags >> 4) & 0x03;
+    uint8_t scanDirFlag = (flags >> 6) & 0x01;
+    uint8_t flight = (flags >> 7) & 0x01;
+
+    //ABELL - Need to do something with the classFlags;
+    data.setField(Dimension::Id::X, nextId, x);
+    data.setField(Dimension::Id::Y, nextId, y);
+    data.setField(Dimension::Id::Z, nextId, z);
+    data.setField(Dimension::Id::Intensity, nextId, intensity);
+    data.setField(Dimension::Id::ReturnNumber, nextId, returnNum);
+    data.setField(Dimension::Id::NumberOfReturns, nextId, numReturns);
+    data.setField(Dimension::Id::ScanChannel, nextId, scanChannel);
+    data.setField(Dimension::Id::ScanDirectionFlag, nextId, scanDirFlag);
+    data.setField(Dimension::Id::EdgeOfFlightLine, nextId, flight);
+    data.setField(Dimension::Id::Classification, nextId, classification);
+    data.setField(Dimension::Id::ScanAngleRank, nextId, scanAngle * .006);
+    data.setField(Dimension::Id::UserData, nextId, user);
+    data.setField(Dimension::Id::PointSourceId, nextId, pointSourceId);
+    data.setField(Dimension::Id::GpsTime, nextId, gpsTime);
+
+    if (h.hasColor())
+    {
+        uint16_t red, green, blue;
+        istream >> red >> green >> blue;
+        data.setField(Dimension::Id::Red, nextId, red);
+        data.setField(Dimension::Id::Green, nextId, green);
+        data.setField(Dimension::Id::Blue, nextId, blue);
+    }
+
+    if (h.hasInfrared())
+    {
+        uint16_t nearInfraRed;
+
+        istream >> nearInfraRed;
+        data.setField(Dimension::Id::Infrared, nextId, nearInfraRed);
+    }
+
+    if (m_extraDims.size())
+        loadExtraDims(istream, data, nextId);
+}
+
+
+void LasReader::loadExtraDims(LeExtractor& istream, PointView& data,
+    PointId nextId)
+{
+    Everything e;
+    for (auto& dim : m_extraDims)
+    {
+        // Dimension type of None is undefined and unprocessed
+        if (dim.m_dimType.m_type == Dimension::Type::None)
+        {
+            istream.skip(dim.m_size);
+            continue;
+        }
+
+        istream.get(dim.m_dimType.m_type, e);
+
+        if (dim.m_dimType.m_xform.nonstandard())
+        {
+            double d = Utils::toDouble(e, dim.m_dimType.m_type);
+            d = d * dim.m_dimType.m_xform.m_scale +
+                dim.m_dimType.m_xform.m_offset;
+            data.setField(dim.m_dimType.m_id, nextId, d);
+        }
+        else
+            data.setField(dim.m_dimType.m_id, dim.m_dimType.m_type, nextId, &e);
+    }
+}
+
+
+void LasReader::done(PointTableRef)
+{
+#ifdef PDAL_HAVE_LASZIP
+    m_zipPoint.reset();
+    m_unzipper.reset();
+#endif
+    destroyStream();
+    m_initialized = false;
+}
+
+} // namespace pdal
diff --git a/io/las/LasReader.hpp b/io/las/LasReader.hpp
new file mode 100644
index 0000000..2fd511b
--- /dev/null
+++ b/io/las/LasReader.hpp
@@ -0,0 +1,143 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/Reader.hpp>
+
+#include "LasError.hpp"
+#include "LasHeader.hpp"
+#include "LasUtils.hpp"
+#include "ZipPoint.hpp"
+
+extern "C" int32_t LasReader_ExitFunc();
+extern "C" PF_ExitFunc LasReader_InitPlugin();
+
+namespace pdal
+{
+
+class NitfReader;
+class LasHeader;
+class LeExtractor;
+class PointDimensions;
+
+class PDAL_DLL LasReader : public pdal::Reader
+{
+    friend class NitfReader;
+public:
+    LasReader() : pdal::Reader(), m_index(0), m_istream(NULL),
+        m_initialized(false)
+        {}
+
+    virtual ~LasReader()
+        {  destroyStream(); }
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    Options getDefaultOptions();
+
+    const LasHeader& header() const
+        { return m_lasHeader; }
+    point_count_t getNumPoints() const
+        { return m_lasHeader.pointCount(); }
+
+protected:
+    virtual std::istream *createStream()
+    {
+        m_istream = FileUtils::openFile(m_filename);
+        if (!m_istream)
+        {
+            std::ostringstream oss;
+            oss << "Unable to create open stream for '"
+                << m_filename <<"' with error '" << strerror(errno) <<"'";
+            throw pdal_error(oss.str());
+        }
+        return m_istream;
+    }
+    virtual void destroyStream()
+    {
+        if (m_istream && m_initialized)
+        {
+            FileUtils::closeFile(m_istream);
+            m_istream = NULL;
+            m_initialized = false;
+        }
+    }
+
+private:
+    LasError m_error;
+    LasHeader m_lasHeader;
+    std::unique_ptr<ZipPoint> m_zipPoint;
+    std::unique_ptr<LASunzipper> m_unzipper;
+    point_count_t m_index;
+    std::istream* m_istream;
+    VlrList m_vlrs;
+    std::vector<ExtraDim> m_extraDims;
+
+    virtual void processOptions(const Options& options);
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+    void fixupVlrs();
+    VariableLengthRecord *findVlr(const std::string& userId, uint16_t recordId);
+    void setSrsFromVlrs(MetadataNode& m);
+    void readExtraBytesVlr();
+    SpatialReference getSrsFromVlrs();
+    SpatialReference getSrsFromWktVlr();
+    SpatialReference getSrsFromGeotiffVlr();
+    void extractHeaderMetadata(MetadataNode& forward, MetadataNode& m);
+    void extractVlrMetadata(MetadataNode& forward, MetadataNode& m);
+    virtual QuickInfo inspect();
+    virtual void ready(PointTableRef table)
+        { ready(table, m_metadata); }
+    virtual void ready(PointTableRef table, MetadataNode& m);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+    virtual bool eof()
+        { return m_index >= getNumPoints(); }
+    void loadPoint(PointView& data, char *buf, size_t bufsize);
+    void loadPointV10(PointView& data, char *buf, size_t bufsize);
+    void loadPointV14(PointView& data, char *buf, size_t bufsize);
+    void loadExtraDims(LeExtractor& istream, PointView& data, PointId nextId);
+    point_count_t readFileBlock(
+            std::vector<char>& buf,
+            point_count_t maxPoints);
+
+    LasReader& operator=(const LasReader&); // not implemented
+    LasReader(const LasReader&); // not implemented
+    bool m_initialized;
+};
+
+} // namespace pdal
diff --git a/io/las/LasUtils.cpp b/io/las/LasUtils.cpp
new file mode 100644
index 0000000..a84a1fc
--- /dev/null
+++ b/io/las/LasUtils.cpp
@@ -0,0 +1,219 @@
+/******************************************************************************
+ * Copyright (c) 2015, Hobu Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "LasUtils.hpp"
+
+#include <pdal/util/Extractor.hpp>
+#include <pdal/util/Inserter.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <string>
+
+namespace pdal
+{
+
+uint8_t ExtraBytesIf::lasType()
+{
+    using namespace Dimension::Type;
+    
+    uint8_t lastype = 0;
+
+    Dimension::Type::Enum lastypes[] = {
+        None, Unsigned8, Signed8, Unsigned16, Signed16,
+        Unsigned32, Signed32, Unsigned64, Signed64, Float, Double
+    };
+    for (size_t i = 0; i < sizeof(lastypes) / sizeof(lastypes[0]); ++i)
+        if (m_type == lastypes[i])
+        {
+            lastype = i;
+            break;
+        }
+    if (m_fieldCnt == 0 || lastype == 0)
+        return 0;
+    return 10 * (m_fieldCnt - 1) + lastype;
+}
+
+
+void ExtraBytesIf::setType(uint8_t lastype)
+{
+    using namespace Dimension::Type;
+
+    m_fieldCnt = 1;
+    while (lastype > 10)
+    {
+        m_fieldCnt++;
+        lastype -= 10;
+    }
+
+    Dimension::Type::Enum lastypes[] = {
+        None, Unsigned8, Signed8, Unsigned16, Signed16,
+        Unsigned32, Signed32, Unsigned64, Signed64, Float, Double
+    };
+    m_type = lastypes[lastype];
+    if (m_type == None)
+        m_fieldCnt = 0;
+}
+
+
+void ExtraBytesIf::appendTo(std::vector<uint8_t>& ebBytes)
+{
+    size_t offset = ebBytes.size();
+    ebBytes.resize(ebBytes.size() + sizeof(ExtraBytesSpec));
+    LeInserter inserter(ebBytes.data() + offset, sizeof(ExtraBytesSpec));
+
+    uint8_t lastype = lasType();
+    uint8_t options = lastype ? 0 : m_size;
+
+    inserter << (uint16_t)0 << lastype << options;
+    inserter.put(m_name, 32);
+    inserter << (uint32_t)0;  // Reserved.
+    for (size_t i = 0; i < 3; ++i)
+        inserter << (uint64_t)0;  // No data field.
+    for (size_t i = 0; i < 3; ++i)
+        inserter << (double)0.0; // Min.
+    for (size_t i = 0; i < 3; ++i)
+        inserter << (double)0.0; // Max.
+    for (size_t i = 0; i < 3; ++i)
+        inserter << m_scale[i];
+    for (size_t i = 0; i < 3; ++i)
+        inserter << m_offset[i];
+    inserter.put(m_description, 32);
+}
+
+
+void ExtraBytesIf::readFrom(const char *buf)
+{
+    LeExtractor extractor(buf, sizeof(ExtraBytesSpec));
+    uint16_t dummy16;
+    uint32_t dummy32;
+    uint64_t dummy64;
+    double dummyd;
+    uint8_t options;
+    uint8_t type;
+
+    uint8_t SCALE_MASK = 1 << 3;
+    uint8_t OFFSET_MASK = 1 << 4;
+
+    extractor >> dummy16 >> type >> options;
+    extractor.get(m_name, 32);
+    extractor >> dummy32;
+    for (size_t i = 0; i < 3; ++i)
+        extractor >> dummy64;  // No data field.
+    for (size_t i = 0; i < 3; ++i)
+        extractor >> dummyd;  // Min.
+    for (size_t i = 0; i < 3; ++i)
+        extractor >> dummyd;  // Max.
+    for (size_t i = 0; i < 3; ++i)
+        extractor >> m_scale[i];
+    for (size_t i = 0; i < 3; ++i)
+        extractor >> m_offset[i];
+    extractor.get(m_description, 32);
+
+    setType(type);
+    if (m_type == 0)
+        m_size = options;
+    if (!(options & SCALE_MASK))
+        for (size_t i = 0; i < 3; ++i)
+            m_scale[i] = 1.0;
+    if (!(options & OFFSET_MASK))
+        for (size_t i = 0; i < 3; ++i)
+            m_offset[i] = 0.0;
+}
+
+
+std::vector<ExtraDim> ExtraBytesIf::toExtraDims()
+{
+    std::vector<ExtraDim> eds;
+
+    if (m_type == Dimension::Type::None)
+    {
+        ExtraDim ed(m_name, Dimension::Type::None);
+        ed.m_size = m_size;
+        eds.push_back(ed);
+    }
+    else if (m_fieldCnt == 1)
+    {
+        ExtraDim ed(m_name, m_type, m_scale[0], m_offset[0]);
+        eds.push_back(ed);
+    }
+    else
+    {
+        for (size_t i = 0; i < m_fieldCnt; ++i)
+        {
+            ExtraDim ed(m_name + std::to_string(i), m_type,
+                m_scale[i], m_offset[i]);
+            eds.push_back(ed);
+        }
+    }
+    return eds;
+}
+
+namespace LasUtils
+{
+
+std::vector<ExtraDim> parse(const StringList& dimString)
+{
+    std::vector<ExtraDim> extraDims;
+
+    for (auto& dim : dimString)
+    {
+        StringList s = Utils::split2(dim, '=');
+        if (s.size() != 2)
+        {
+            std::ostringstream oss;
+            oss << "Invalid extra dimension specified: '" << dim <<
+                "'.  Need <dimension>=<type>.  See documentation "
+                " for details.";
+            throw pdal_error(oss.str());
+        }
+        Utils::trim(s[0]);
+        Utils::trim(s[1]);
+        Dimension::Type::Enum type = Dimension::type(s[1]);
+        if (type == Dimension::Type::None)
+        {
+            std::ostringstream oss;
+            oss << "Invalid extra dimension type specified: '" <<
+                dim << "'.  Need <dimension>=<type>.  See documentations "
+                " for details.";
+            throw pdal_error(oss.str());
+        }
+        ExtraDim ed(s[0], type);
+        extraDims.push_back(ed);
+    }
+    return extraDims;
+}
+
+} // namespace LasUtils
+
+} // namespace pdal
diff --git a/io/las/LasUtils.hpp b/io/las/LasUtils.hpp
new file mode 100644
index 0000000..d0712b3
--- /dev/null
+++ b/io/las/LasUtils.hpp
@@ -0,0 +1,135 @@
+/******************************************************************************
+ * Copyright (c) 2015, Hobu Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Dimension.hpp>
+#include <string>
+
+namespace pdal
+{
+
+struct ExtraDim
+{
+    ExtraDim(const std::string name, Dimension::Type::Enum type,
+            double scale = 1.0, double offset = 0.0) :
+        m_name(name), m_dimType(Dimension::Id::Unknown, type, scale, offset),
+        m_size(0)
+    {}
+
+    friend bool operator == (const ExtraDim& ed1, const ExtraDim& ed2);
+
+    std::string m_name;
+    DimType m_dimType;
+    size_t m_size;  // Only set when type is None.
+};
+
+inline bool operator == (const ExtraDim& ed1, const ExtraDim& ed2)
+{
+    // This is an incomplete comparison, but it should suffice since we
+    // only use it to compare an ExtraDim specified in an option with
+    // one created from a VLR entry.
+    return (ed1.m_name == ed2.m_name &&
+        ed1.m_dimType.m_type == ed2.m_dimType.m_type &&
+        ed1.m_size == ed2.m_size);
+}
+
+// This is the structure of each record in the extra bytes spec.  Not used
+// directly for storage, but here mostly for reference.
+struct ExtraBytesSpec
+{
+    char m_reserved[2];
+    uint8_t m_dataType;
+    uint8_t m_options;
+    char m_name[32];
+    char m_reserved2[4];
+    uint64_t m_noData[3]; // 24 = 3*8 bytes
+    double m_min[3]; // 24 = 3*8 bytes
+    double m_max[3]; // 24 = 3*8 bytes
+    double m_scale[3]; // 24 = 3*8 bytes
+    double m_offset[3]; // 24 = 3*8 bytes
+    char m_description[32];
+};
+
+class ExtraBytesIf
+{
+public:
+    ExtraBytesIf() : m_type(Dimension::Type::None), m_fieldCnt(0), m_size(0)
+    {
+        for (size_t i = 0; i < 3; ++i)
+        {
+            m_scale[i] = 1.0;
+            m_offset[i] = 0.0;
+        }
+    }
+
+    ExtraBytesIf(const std::string& name, Dimension::Type::Enum type,
+            const std::string& description) :
+        m_type(type), m_name(name), m_description(description), m_size(0)
+    {
+        for (size_t i = 0; i < 3; ++i)
+        {
+            // Setting the scale to 0 looks wrong, but it isn't.  If the
+            // scale option flag isn't set, the scale is supposed to be 0.
+            // When we write the VLR, we always clear the scale flag.
+            m_scale[i] = 0.0;
+            m_offset[i] = 0.0;
+        }
+        m_fieldCnt = (m_type == Dimension::Type::None ? 0 : 1);
+    }
+
+    void appendTo(std::vector<uint8_t>& ebBytes);
+    void readFrom(const char *buf);
+    uint8_t lasType();
+    void setType(uint8_t lastype);
+    std::vector<ExtraDim> toExtraDims();
+
+private:
+    Dimension::Type::Enum m_type;
+    unsigned m_fieldCnt; // Must be 0 - 3;
+    double m_scale[3];
+    double m_offset[3];
+    std::string m_name;
+    std::string m_description;
+    size_t m_size;
+};
+
+namespace LasUtils
+{
+
+std::vector<ExtraDim> parse(const StringList& dimString);
+
+} // namespace LasUtils
+
+} // namespace pdal
diff --git a/io/las/LasWriter.cpp b/io/las/LasWriter.cpp
new file mode 100644
index 0000000..2ff252c
--- /dev/null
+++ b/io/las/LasWriter.cpp
@@ -0,0 +1,930 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "LasWriter.hpp"
+
+#include <type_traits>
+#include <boost/uuid/uuid_generators.hpp>
+#include <iostream>
+
+#include <pdal/PDALUtils.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/util/Inserter.hpp>
+#include <pdal/util/OStream.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include "GeotiffSupport.hpp"
+#include "ZipPoint.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.las",
+    "ASPRS LAS 1.0 - 1.4 writer. LASzip support is also \n" \
+        "available if enabled at compile-time. Note that LAZ \n" \
+        "does not provide LAS 1.4 support at this time.",
+    "http://pdal.io/stages/writers.las.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, LasWriter, Writer, s_info)
+
+std::string LasWriter::getName() const { return s_info.name; }
+
+LasWriter::LasWriter() : m_ostream(NULL)
+{
+    m_majorVersion.setDefault(1);
+    m_minorVersion.setDefault(2);
+    m_dataformatId.setDefault(3);
+    m_filesourceId.setDefault(0);
+    m_globalEncoding.setDefault(0);
+    m_systemId.setDefault(m_lasHeader.getSystemIdentifier());
+    m_softwareId.setDefault(GetDefaultSoftwareId());
+
+    std::time_t now;
+    std::time(&now);
+    std::tm* ptm = std::gmtime(&now);
+    uint16_t year = ptm->tm_year + 1900;
+    uint16_t doy = ptm->tm_yday;
+
+    m_creationDoy.setDefault(doy);
+    m_creationYear.setDefault(year);
+    m_scaleX.setDefault(".01");
+    m_scaleY.setDefault(".01");
+    m_scaleZ.setDefault(".01");
+    m_offsetX.setDefault("0");
+    m_offsetY.setDefault("0");
+    m_offsetZ.setDefault("0");
+}
+
+
+Options LasWriter::getDefaultOptions()
+{
+    Options options;
+    LasHeader header;
+
+    options.add("filename", "", "Name of the file for LAS/LAZ output.");
+    options.add("compression", false, "Do we LASzip-compress the data?");
+    options.add("major_version", 1, "LAS Major version");
+    options.add("minor_version", 2, "LAS Minor version");
+    options.add("dataformat_id", 3, "Point format to write");
+    options.add("filesource_id", 0, "File Source ID for this file");
+    options.add("global_encoding", 0, "Global encoding bits");
+    options.add("system_id", header.getSystemIdentifier(),
+        "System ID for this file");
+    options.add("software_id", GetDefaultSoftwareId(),
+        "Software ID for this file");
+
+    std::time_t now;
+    std::time(&now);
+    std::tm* ptm = std::gmtime(&now);
+    uint16_t year = ptm->tm_year + 1900;
+    uint16_t doy = ptm->tm_yday;
+
+    options.add("creation_doy", doy, "Day of Year for file");
+    options.add("creation_year", year, "4-digit year value for file");
+    options.add("extra_dims", "", "Extra dimensions not part of the LAS "
+        "point format to be added to each point.");
+
+    return options;
+}
+
+
+void LasWriter::processOptions(const Options& options)
+{
+    if (options.hasOption("a_srs"))
+        setSpatialReference(options.getValueOrDefault("a_srs", std::string()));
+    m_lasHeader.setCompressed(options.getValueOrDefault("compression", false));
+    m_discardHighReturnNumbers = options.getValueOrDefault(
+        "discard_high_return_numbers", false);
+    StringList extraDims = options.getValueOrDefault<StringList>("extra_dims");
+    m_extraDims = LasUtils::parse(extraDims);
+
+#ifndef PDAL_HAVE_LASZIP
+    if (m_lasHeader.compressed())
+        throw pdal_error("Can't write LAZ output.  "
+            "PDAL not built with LASzip.");
+#endif // PDAL_HAVE_LASZIP
+    fillForwardList(options);
+    getHeaderOptions(options);
+    getVlrOptions(options);
+}
+
+
+void LasWriter::prepared(PointTableRef table)
+{
+    m_extraByteLen = 0;
+    for (auto& dim : m_extraDims)
+    {
+        dim.m_dimType.m_id = table.layout()->findDim(dim.m_name);
+        if (dim.m_dimType.m_id == Dimension::Id::Unknown)
+        {
+            std::ostringstream oss;
+            oss << "Dimension '" << dim.m_name << "' specified in "
+                "'extra_dim' option not found.";
+            throw pdal_error(oss.str());
+        }
+        m_extraByteLen += Dimension::size(dim.m_dimType.m_type);
+    }
+}
+
+
+// Get header info from options and store in map for processing with
+// metadata.
+void LasWriter::fillForwardList(const Options &options)
+{
+    StringList forwards = options.getValues("forward");
+
+    StringList header;
+    header.push_back("dataformat_id");
+    header.push_back("major_version");
+    header.push_back("minor_version");
+    header.push_back("filesource_id");
+    header.push_back("global_encoding");
+    header.push_back("project_id");
+    header.push_back("system_id");
+    header.push_back("software_id");
+    header.push_back("creation_doy");
+    header.push_back("creation_year");
+
+    StringList scale;
+    scale.push_back("scale_x");
+    scale.push_back("scale_y");
+    scale.push_back("scale_z");
+
+    StringList offset;
+    offset.push_back("offset_x");
+    offset.push_back("offset_y");
+    offset.push_back("offset_z");
+
+    StringList all;
+    all.insert(all.begin(), header.begin(), header.end());
+    all.insert(all.begin(), scale.begin(), scale.end());
+    all.insert(all.begin(), offset.begin(), offset.end());
+
+    // Build the forward list, replacing special keywords with the proper
+    // field names.
+    for (auto& name : forwards)
+    {
+        if (name == "all")
+        {
+            m_forwards.insert(all.begin(), all.end());
+            m_forwardVlrs = true;
+        }
+        else if (name == "header")
+            m_forwards.insert(header.begin(), header.end());
+        else if (name == "scale")
+            m_forwards.insert(scale.begin(), scale.end());
+        else if (name == "offset")
+            m_forwards.insert(offset.begin(), offset.end());
+        else if (name == "format")
+            m_forwards.insert("dataformat_id");
+        else if (name == "vlr")
+            m_forwardVlrs = true;
+        else if (Utils::contains(all, name))
+            m_forwards.insert(name);
+        else
+        {
+            std::ostringstream oss;
+
+            oss << "Error in 'forward' option.  Unknown field for "
+                "forwarding: '" << name << "'.";
+            throw pdal_error(oss.str());
+        }
+    }
+}
+
+
+template<typename T>
+void setHeaderOption(const std::string& name, T& headerVal, const Options& ops)
+{
+    if (ops.hasOption(name))
+        headerVal.setVal(ops.getValueOrDefault<typename T::type>(name));
+}
+
+
+// Get header info from options and store in map for processing with
+// metadata.
+void LasWriter::getHeaderOptions(const Options &options)
+{
+    setHeaderOption("major_version", m_majorVersion, options);
+    setHeaderOption("minor_version", m_minorVersion, options);
+    setHeaderOption("dataformat_id", m_dataformatId, options);
+    setHeaderOption("format", m_dataformatId, options);
+    setHeaderOption("global_encoding", m_globalEncoding, options);
+    setHeaderOption("project_id", m_projectId, options);
+    setHeaderOption("system_id", m_systemId, options);
+    setHeaderOption("software_id", m_softwareId, options);
+    setHeaderOption("creation_doy", m_creationDoy, options);
+    setHeaderOption("creation_year", m_creationYear, options);
+    setHeaderOption("scale_x", m_scaleX, options);
+    setHeaderOption("scale_y", m_scaleY, options);
+    setHeaderOption("scale_z", m_scaleZ, options);
+    setHeaderOption("offset_x", m_offsetX, options);
+    setHeaderOption("offset_y", m_offsetY, options);
+    setHeaderOption("offset_z", m_offsetZ, options);
+}
+
+/// Get VLR-specific options and store for processing with metadata.
+/// \param opts  Options to check for VLR info.
+void LasWriter::getVlrOptions(const Options& opts)
+{
+    std::vector<pdal::Option> options = opts.getOptions("vlr");
+    for (auto o = options.begin(); o != options.end(); ++o)
+    {
+        if (!boost::algorithm::istarts_with(o->getName(), "vlr"))
+            continue;
+
+        boost::optional<pdal::Options const&> vo = o->getOptions();
+        if (!vo)
+            continue;
+
+        VlrOptionInfo info;
+        info.m_name = o->getName().substr(strlen("vlr"));
+        info.m_value = o->getValue<std::string>();
+        try
+        {
+            info.m_recordId = vo->getOption("record_id").getValue<int16_t>();
+            info.m_userId = vo->getOption("user_id").getValue<std::string>();
+        }
+        catch (Option::not_found)
+        {
+            continue;
+        }
+        info.m_description = vo->getValueOrDefault<std::string>
+            ("description", "");
+        m_optionInfos.push_back(info);
+    }
+}
+
+
+void LasWriter::readyTable(PointTableRef table)
+{
+    m_srs = getSpatialReference().empty() ?
+        table.spatialRef() : getSpatialReference();
+
+    setVlrsFromSpatialRef();
+    setExtraBytesVlr();
+    MetadataNode forward = table.privateMetadata("lasforward");
+    fillHeader(forward);
+    setVlrsFromMetadata(forward);
+}
+
+
+void LasWriter::readyFile(const std::string& filename)
+{
+    m_error.setFilename(filename);
+    std::ostream *out = FileUtils::createFile(filename, true);
+    if (!out)
+    {
+        std::stringstream out;
+
+        out << "writers.las couldn't open file '" << filename <<
+            "' for output.";
+        throw pdal_error(out.str());
+    }
+    m_curFilename = filename;
+    Utils::writeProgress(m_progressFd, "READYFILE", filename);
+    prepOutput(out);
+}
+
+
+void LasWriter::prepOutput(std::ostream *outStream)
+{
+    m_summaryData.reset(new SummaryData());
+    m_ostream = outStream;
+    if (m_lasHeader.compressed())
+        readyCompression();
+
+    // Write the header.
+    OLeStream out(m_ostream);
+    out << m_lasHeader;
+
+    m_lasHeader.setVlrOffset((uint32_t)m_ostream->tellp());
+
+    for (auto vi = m_vlrs.begin(); vi != m_vlrs.end(); ++vi)
+    {
+        VariableLengthRecord& vlr = *vi;
+        vlr.write(out, m_lasHeader.versionEquals(1, 0) ? 0xAABB : 0);
+    }
+
+    // Write the point data start signature for version 1.0.
+    if (m_lasHeader.versionEquals(1, 0))
+        out << (uint16_t)0xCCDD;
+    m_lasHeader.setPointOffset((uint32_t)m_ostream->tellp());
+    if (m_lasHeader.compressed())
+        openCompression();
+
+    m_error.setLog(log());
+}
+
+
+/// Search for metadata associated with the provided recordId and userId.
+/// \param  node - Top-level node to use for metadata search.
+/// \param  recordId - Record ID to match.
+/// \param  userId - User ID to match.
+MetadataNode LasWriter::findVlrMetadata(MetadataNode node,
+    uint16_t recordId, const std::string& userId)
+{
+    std::string sRecordId = std::to_string(recordId);
+
+    // Find a node whose name starts with vlr and that has child nodes
+    // with the name and recordId we're looking for.
+    auto pred = [sRecordId,userId](MetadataNode n)
+    {
+        auto recPred = [sRecordId](MetadataNode n)
+        {
+            return n.name() == "record_id" &&
+                n.value() == sRecordId;
+        };
+        auto userPred = [userId](MetadataNode n)
+        {
+            return n.name() == "user_id" &&
+                n.value() == userId;
+        };
+        return (boost::algorithm::istarts_with(n.name(), "vlr") &&
+            !n.findChild(recPred).empty() &&
+            !n.findChild(userPred).empty());
+    };
+    return node.find(pred);
+}
+
+
+/// Set VLRs from metadata for forwarded info, or from option-provided data
+/// otherwise.
+void LasWriter::setVlrsFromMetadata(MetadataNode& forward)
+{
+    std::vector<uint8_t> data;
+
+    if (!m_forwardVlrs)
+        return;
+
+    auto pred = [](MetadataNode n)
+        { return Utils::startsWith(n.name(), "vlr_"); };
+
+    MetadataNodeList nodes = forward.findChildren(pred);
+    for (auto& n : nodes)
+    {
+        const MetadataNode& userIdNode = n.findChild("user_id");
+        const MetadataNode& recordIdNode = n.findChild("record_id");
+        if (recordIdNode.valid() && userIdNode.valid())
+        {
+            data = Utils::base64_decode(n.value());
+            uint16_t recordId = (uint16_t)std::stoi(recordIdNode.value());
+            addVlr(userIdNode.value(), recordId, n.description(), data);
+        }
+    }
+}
+
+
+/// Set VLRs from the active spatial reference.
+/// \param  srs - Active spatial reference.
+void LasWriter::setVlrsFromSpatialRef()
+{
+    VlrList vlrs;
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    GeotiffSupport geotiff;
+    geotiff.resetTags();
+
+    std::string wkt = m_srs.getWKT(SpatialReference::eCompoundOK, false);
+    geotiff.setWkt(wkt);
+
+    addGeotiffVlr(geotiff, GEOTIFF_DIRECTORY_RECORD_ID,
+        "GeoTiff GeoKeyDirectoryTag");
+    addGeotiffVlr(geotiff, GEOTIFF_DOUBLES_RECORD_ID,
+        "GeoTiff GeoDoubleParamsTag");
+    addGeotiffVlr(geotiff, GEOTIFF_ASCII_RECORD_ID,
+        "GeoTiff GeoAsciiParamsTag");
+    addWktVlr();
+#endif // PDAL_HAVE_LIBGEOTIFF
+}
+
+
+/// Add a geotiff VLR from the information associated with the record ID.
+/// \param  geotiff - Geotiff support structure reference.
+/// \param  recordId - Record ID associated with the VLR/Geotiff ref.
+/// \param  description - Description to use with the VLR
+/// \return  Whether the VLR was added.
+bool LasWriter::addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+    const std::string& description)
+{
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    void *data;
+    int count;
+
+    size_t size = geotiff.getKey(recordId, &count, &data);
+    if (size == 0)
+        return false;
+
+    std::vector<uint8_t> buf(size);
+    memcpy(buf.data(), data, size);
+    addVlr(TRANSFORM_USER_ID, recordId, description, buf);
+    return true;
+#else
+    return false;
+#endif // PDAL_HAVE_LIBGEOTIFF
+}
+
+
+/// Add a Well-known Text VLR associated with the spatial reference.
+/// \return  Whether the VLR was added.
+bool LasWriter::addWktVlr()
+{
+    std::string wkt = m_srs.getWKT(SpatialReference::eCompoundOK);
+    if (wkt.empty())
+        return false;
+
+    std::vector<uint8_t> wktBytes(wkt.begin(), wkt.end());
+    // This tacks a NULL to the end of the data, which is required by the spec.
+    wktBytes.resize(wktBytes.size() + 1, 0);
+    addVlr(TRANSFORM_USER_ID, WKT_RECORD_ID, "OGC Tranformation Record",
+        wktBytes);
+
+    // The data in the vector gets moved to the VLR, so we have to recreate it.
+    std::vector<uint8_t> wktBytes2(wkt.begin(), wkt.end());
+    wktBytes2.resize(wktBytes2.size() + 1, 0);
+    addVlr(LIBLAS_USER_ID, WKT_RECORD_ID,
+        "OGR variant of OpenGIS WKT SRS", wktBytes2);
+    return true;
+}
+
+
+void LasWriter::setExtraBytesVlr()
+{
+    if (m_extraDims.empty())
+        return;
+
+    std::vector<uint8_t> ebBytes;
+    for (auto& dim : m_extraDims)
+    {
+        ExtraBytesIf eb(dim.m_name, dim.m_dimType.m_type,
+            Dimension::description(dim.m_dimType.m_id));
+        eb.appendTo(ebBytes);
+    }
+
+    addVlr(SPEC_USER_ID, EXTRA_BYTES_RECORD_ID, "Extra Bytes Record", ebBytes);
+}
+
+
+/// Add a standard or variable-length VLR depending on the data size.
+/// \param  userId - VLR user ID
+/// \param  recordId - VLR record ID
+/// \param  description - VLR description
+/// \param  data - Raw VLR data
+void LasWriter::addVlr(const std::string& userId, uint16_t recordId,
+   const std::string& description, std::vector<uint8_t>& data)
+{
+    if (data.size() > VariableLengthRecord::MAX_DATA_SIZE)
+    {
+        ExtVariableLengthRecord evlr(userId, recordId, description, data);
+        m_eVlrs.push_back(std::move(evlr));
+    }
+    else
+    {
+        VariableLengthRecord vlr(userId, recordId, description, data);
+        m_vlrs.push_back(std::move(vlr));
+    }
+}
+
+template <typename T>
+void LasWriter::handleForward(const std::string& s, T& headerVal,
+    const MetadataNode& base)
+{
+    if (Utils::contains(m_forwards, s) && !headerVal.valSet())
+    {
+        MetadataNode invalid = base.findChild(s + "INVALID");
+        MetadataNode m = base.findChild(s);
+        if (!invalid.valid() && m.valid())
+            headerVal.setVal(m.value<typename T::type>());
+    }
+}
+
+void LasWriter::handleForwards(MetadataNode& forward)
+{
+    handleForward("major_version", m_majorVersion, forward);
+    handleForward("minor_version", m_minorVersion, forward);
+    handleForward("dataformat_id", m_dataformatId, forward);
+    handleForward("filesource_id", m_filesourceId, forward);
+    handleForward("global_encoding", m_globalEncoding, forward);
+    handleForward("project_id", m_projectId, forward);
+    handleForward("system_id", m_systemId, forward);
+    handleForward("software_id", m_softwareId, forward);
+    handleForward("creation_doy", m_creationDoy, forward);
+    handleForward("creation_year", m_creationYear, forward);
+
+    handleForward("scale_x", m_scaleX, forward);
+    handleForward("scale_y", m_scaleY, forward);
+    handleForward("scale_z", m_scaleZ, forward);
+    handleForward("offset_x", m_offsetX, forward);
+    handleForward("offset_y", m_offsetY, forward);
+    handleForward("offset_z", m_offsetZ, forward);
+
+    m_xXform.setScale(m_scaleX.val());
+    m_yXform.setScale(m_scaleY.val());
+    m_zXform.setScale(m_scaleZ.val());
+    m_xXform.setOffset(m_offsetX.val());
+    m_yXform.setOffset(m_offsetY.val());
+    m_zXform.setOffset(m_offsetZ.val());
+}
+
+/// Fill the LAS header with values as provided in options or forwarded
+/// metadata.
+void LasWriter::fillHeader(MetadataNode& forward)
+{
+    handleForwards(forward);
+
+    const uint16_t WKT_MASK = (1 << 4);
+
+    m_lasHeader.setScale(m_xXform.m_scale, m_yXform.m_scale, m_zXform.m_scale);
+    m_lasHeader.setOffset(m_xXform.m_offset, m_yXform.m_offset,
+        m_zXform.m_offset);
+    m_lasHeader.setVlrCount(m_vlrs.size());
+    m_lasHeader.setEVlrCount(m_eVlrs.size());
+
+    m_lasHeader.setPointFormat(m_dataformatId.val());
+    m_lasHeader.setPointLen(m_lasHeader.basePointLen() + m_extraByteLen);
+    m_lasHeader.setVersionMinor(m_minorVersion.val());
+    m_lasHeader.setCreationYear(m_creationYear.val());
+    m_lasHeader.setCreationDOY(m_creationDoy.val());
+    m_lasHeader.setSoftwareId(m_softwareId.val());
+    m_lasHeader.setSystemId(m_systemId.val());
+    m_lasHeader.setProjectId(m_projectId.val());
+    m_lasHeader.setFileSourceId(m_filesourceId.val());
+    // We always write a WKT VLR, but we need to be sure to set the WKT
+    // bit when the version is at least 1.4.
+    uint16_t globalEncoding = m_globalEncoding.val();
+    if (m_lasHeader.versionAtLeast(1, 4))
+        globalEncoding |= WKT_MASK;
+    m_lasHeader.setGlobalEncoding(globalEncoding);
+
+    if (!m_lasHeader.pointFormatSupported())
+    {
+        std::ostringstream oss;
+        oss << "Unsupported LAS output point format: " <<
+            (int)m_lasHeader.pointFormat() << ".";
+        throw pdal_error(oss.str());
+    }
+}
+
+
+void LasWriter::readyCompression()
+{
+#ifdef PDAL_HAVE_LASZIP
+    m_zipPoint.reset(new ZipPoint(m_lasHeader.pointFormat(),
+        m_lasHeader.pointLen()));
+    m_zipper.reset(new LASzipper());
+    // Note: this will make the VLR count in the header incorrect, but we
+    // rewrite that bit in finishOutput() to fix it up.
+    std::vector<uint8_t> data = m_zipPoint->vlrData();
+    addVlr(LASZIP_USER_ID, LASZIP_RECORD_ID, "http://laszip.org", data);
+#endif
+}
+
+
+/// Prepare the compressor to write points.
+/// \param  pointFormat - Formt of points we're writing.
+void LasWriter::openCompression()
+{
+#ifdef PDAL_HAVE_LASZIP
+    if (!m_zipper->open(*m_ostream, m_zipPoint->GetZipper()))
+    {
+        std::ostringstream oss;
+        const char* err = m_zipper->get_error();
+        if (err == NULL)
+            err = "(unknown error)";
+        oss << "Error opening LASzipper: " << std::string(err);
+        throw pdal_error(oss.str());
+    }
+#endif
+}
+
+
+void LasWriter::writeView(const PointViewPtr view)
+{
+    Utils::writeProgress(m_progressFd, "READYVIEW",
+        std::to_string(view->size()));
+    setAutoXForm(view);
+
+    size_t pointLen = m_lasHeader.pointLen();
+
+    // Make a buffer of at most a meg.
+    std::vector<char> buf(std::min((size_t)1000000, pointLen * view->size()));
+
+    const PointView& viewRef(*view.get());
+
+    //ABELL - Removed callback handling for now.
+    point_count_t remaining = view->size();
+    PointId idx = 0;
+    while (remaining)
+    {
+        point_count_t filled = fillWriteBuf(viewRef, idx, buf);
+        idx += filled;
+        remaining -= filled;
+
+#ifdef PDAL_HAVE_LASZIP
+        if (m_lasHeader.compressed())
+        {
+            char *pos = buf.data();
+            for (point_count_t i = 0; i < filled; i++)
+            {
+                memcpy(m_zipPoint->m_lz_point_data.data(), pos, pointLen);
+                if (!m_zipper->write(m_zipPoint->m_lz_point))
+                {
+                    std::ostringstream oss;
+                    const char* err = m_zipper->get_error();
+                    if (err == NULL)
+                        err = "(unknown error)";
+                    oss << "Error writing point: " << std::string(err);
+                    throw pdal_error(oss.str());
+                }
+                pos += pointLen;
+            }
+        }
+        else
+            m_ostream->write(buf.data(), filled * pointLen);
+#else
+        m_ostream->write(buf.data(), filled * pointLen);
+#endif
+    }
+    Utils::writeProgress(m_progressFd, "DONEVIEW",
+        std::to_string(view->size()));
+}
+
+
+point_count_t LasWriter::fillWriteBuf(const PointView& view,
+    PointId startId, std::vector<char>& buf)
+{
+    point_count_t blocksize = buf.size() / m_lasHeader.pointLen();
+    blocksize = std::min(blocksize, view.size() - startId);
+
+    bool has14Format = m_lasHeader.has14Format();
+    bool hasColor = m_lasHeader.hasColor();
+    bool hasTime = m_lasHeader.hasTime();
+    bool hasInfrared = m_lasHeader.hasInfrared();
+
+    PointId lastId = startId + blocksize;
+    static const size_t maxReturnCount = m_lasHeader.maxReturnCount();
+    LeInserter ostream(buf.data(), buf.size());
+    for (PointId idx = startId; idx < lastId; idx++)
+    {
+        // we always write the base fields
+        using namespace Dimension;
+
+        uint8_t returnNumber(1);
+        uint8_t numberOfReturns(1);
+        if (view.hasDim(Id::ReturnNumber))
+        {
+            returnNumber = view.getFieldAs<uint8_t>(Id::ReturnNumber,
+                idx);
+            if (returnNumber < 1 || returnNumber > maxReturnCount)
+                m_error.returnNumWarning(returnNumber);
+        }
+        if (view.hasDim(Id::NumberOfReturns))
+            numberOfReturns = view.getFieldAs<uint8_t>(
+                Id::NumberOfReturns, idx);
+        if (numberOfReturns == 0)
+            m_error.numReturnsWarning(0);
+        if (numberOfReturns > maxReturnCount)
+        {
+            if (m_discardHighReturnNumbers)
+            {
+                // If this return number is too high, pitch the point.
+                if (returnNumber > maxReturnCount)
+                    continue;
+                numberOfReturns = maxReturnCount;
+            }
+            else
+                m_error.numReturnsWarning(numberOfReturns);
+        }
+
+        double xOrig = view.getFieldAs<double>(Id::X, idx);
+        double yOrig = view.getFieldAs<double>(Id::Y, idx);
+        double zOrig = view.getFieldAs<double>(Id::Z, idx);
+
+        double x = (xOrig - m_xXform.m_offset) / m_xXform.m_scale;
+        double y = (yOrig - m_yXform.m_offset) / m_yXform.m_scale;
+        double z = (zOrig - m_zXform.m_offset) / m_zXform.m_scale;
+
+        auto converter = [this](double d, Dimension::Id::Enum dim) -> int32_t
+        {
+            int32_t i;
+
+            if (!Utils::numericCast(d, i))
+            {
+                std::ostringstream oss;
+                oss << "Unable to convert scaled value (" << d << ") to "
+                    "int32 for dimension '" << Dimension::name(dim) <<
+                    "' when writing LAS/LAZ file " << m_curFilename << ".";
+                throw pdal_error(oss.str());
+            }
+            return i;
+        };
+
+        ostream << converter(x, Id::X);
+        ostream << converter(y, Id::Y);
+        ostream << converter(z, Id::Z);
+
+        uint16_t intensity = 0;
+        if (view.hasDim(Id::Intensity))
+            intensity = view.getFieldAs<uint16_t>(Id::Intensity, idx);
+        ostream << intensity;
+
+        uint8_t scanChannel(0);
+        if (view.hasDim(Id::ScanChannel))
+            scanChannel = view.getFieldAs<uint8_t>(Id::ScanChannel, idx);
+
+        uint8_t scanDirectionFlag(0);
+        if (view.hasDim(Id::ScanDirectionFlag))
+            scanDirectionFlag = view.getFieldAs<uint8_t>(
+                Id::ScanDirectionFlag, idx);
+
+        uint8_t edgeOfFlightLine(0);
+        if (view.hasDim(Id::EdgeOfFlightLine))
+            edgeOfFlightLine = view.getFieldAs<uint8_t>(
+                Id::EdgeOfFlightLine, idx);
+
+        if (has14Format)
+        {
+            uint8_t bits = returnNumber | (numberOfReturns << 4);
+            ostream << bits;
+            bits = (scanChannel << 4) | (scanDirectionFlag << 6) |
+                (edgeOfFlightLine << 7);
+            ostream << bits;
+        }
+        else
+        {
+            uint8_t bits = returnNumber | (numberOfReturns << 3) |
+                (scanDirectionFlag << 6) | (edgeOfFlightLine << 7);
+            ostream << bits;
+        }
+
+        uint8_t classification = 0;
+        if (view.hasDim(Id::Classification))
+        {
+            classification = view.getFieldAs<uint8_t>(Id::Classification,
+                idx);
+        }
+        ostream << classification;
+
+        uint8_t userData = 0;
+        if (view.hasDim(Id::UserData))
+            userData = view.getFieldAs<uint8_t>(Id::UserData, idx);
+        if (has14Format)
+        {
+            int16_t scanAngleRank = 0;
+            if (view.hasDim(Id::ScanAngleRank))
+                scanAngleRank =
+                    view.getFieldAs<float>(Id::ScanAngleRank, idx) / .006;
+            ostream << userData << scanAngleRank;
+        }
+        else
+        {
+            int8_t scanAngleRank = 0;
+            if (view.hasDim(Id::ScanAngleRank))
+                scanAngleRank = view.getFieldAs<int8_t>(Id::ScanAngleRank, idx);
+
+            ostream << scanAngleRank << userData;
+        }
+
+        uint16_t pointSourceId = 0;
+        if (view.hasDim(Id::PointSourceId))
+            pointSourceId = view.getFieldAs<uint16_t>(Id::PointSourceId,
+                idx);
+        ostream << pointSourceId;
+
+        if (hasTime)
+        {
+            double t = 0.0;
+            if (view.hasDim(Id::GpsTime))
+                t = view.getFieldAs<double>(Id::GpsTime, idx);
+            ostream << t;
+        }
+
+        if (hasColor)
+        {
+            uint16_t red = 0;
+            uint16_t green = 0;
+            uint16_t blue = 0;
+            if (view.hasDim(Id::Red))
+                red = view.getFieldAs<uint16_t>(Id::Red, idx);
+            if (view.hasDim(Id::Green))
+                green = view.getFieldAs<uint16_t>(Id::Green, idx);
+            if (view.hasDim(Id::Blue))
+                blue = view.getFieldAs<uint16_t>(Id::Blue, idx);
+
+            ostream << red << green << blue;
+        }
+
+        if (hasInfrared)
+        {
+            uint16_t nearInfraRed = 0;
+
+            if (view.hasDim(Id::Infrared))
+                nearInfraRed = view.getFieldAs<uint16_t>(Id::Infrared, idx);
+            ostream << nearInfraRed;
+        }
+
+        Everything e;
+        for (auto& dim : m_extraDims)
+        {
+            view.getField((char *)&e, dim.m_dimType.m_id,
+                dim.m_dimType.m_type, idx);
+            ostream.put(dim.m_dimType.m_type, e);
+        }
+
+        using namespace Dimension;
+        m_summaryData->addPoint(xOrig, yOrig, zOrig, returnNumber);
+    }
+    return blocksize;
+}
+
+
+void LasWriter::doneFile()
+{
+    finishOutput();
+    Utils::writeProgress(m_progressFd, "DONEFILE", m_curFilename);
+    m_curFilename.clear();
+    delete m_ostream;
+    m_ostream = NULL;
+}
+
+
+void LasWriter::finishOutput()
+{
+    //ABELL - The zipper has to be closed right after all the points
+    // are written or bad things happen since this call expects the
+    // stream to be positioned at a particular position.
+#ifdef PDAL_HAVE_LASZIP
+    if (m_lasHeader.compressed())
+        m_zipper->close();
+#endif
+
+    log()->get(LogLevel::Debug) << "Wrote " <<
+        m_summaryData->getTotalNumPoints() <<
+        " points to the LAS file" << std::endl;
+
+    OLeStream out(m_ostream);
+
+    for (auto vi = m_eVlrs.begin(); vi != m_eVlrs.end(); ++vi)
+    {
+        ExtVariableLengthRecord evlr = *vi;
+        out << evlr;
+    }
+
+    // Reset the offset/scale since it may have been auto-computed
+    m_lasHeader.setOffset(m_xXform.m_offset, m_yXform.m_offset,
+        m_zXform.m_offset);
+    m_lasHeader.setScale(m_xXform.m_scale, m_yXform.m_scale,
+        m_zXform.m_scale);
+
+    // The summary is calculated as points are written.
+    m_lasHeader.setSummary(*m_summaryData);
+    // VLR count may change as LAS records are written.
+    m_lasHeader.setVlrCount(m_vlrs.size());
+
+    out.seek(0);
+    out << m_lasHeader;
+    out.seek(m_lasHeader.pointOffset());
+
+#ifdef PDAL_HAVE_LASZIP
+    if (m_lasHeader.compressed())
+    {
+        m_zipper.reset();
+        m_zipPoint.reset();
+    }
+#endif
+    m_ostream->flush();
+}
+
+} // namespace pdal
diff --git a/io/las/LasWriter.hpp b/io/las/LasWriter.hpp
new file mode 100644
index 0000000..a6b56c6
--- /dev/null
+++ b/io/las/LasWriter.hpp
@@ -0,0 +1,155 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/FlexWriter.hpp>
+
+#include "HeaderVal.hpp"
+#include "LasError.hpp"
+#include "LasHeader.hpp"
+#include "LasUtils.hpp"
+#include "SummaryData.hpp"
+#include "ZipPoint.hpp"
+
+extern "C" int32_t LasWriter_ExitFunc();
+extern "C" PF_ExitFunc LasWriter_InitPlugin();
+
+namespace pdal
+{
+class LasTester;
+class NitfWriter;
+class GeotiffSupport;
+
+struct VlrOptionInfo
+{
+    std::string m_name;
+    std::string m_value;
+    std::string m_userId;
+    uint16_t m_recordId;
+    std::string m_description;
+};
+
+class PDAL_DLL LasWriter : public FlexWriter
+{
+    friend class LasTester;
+    friend class NitfWriter;
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    LasWriter();
+
+    Options getDefaultOptions();
+
+protected:
+    void prepOutput(std::ostream *out);
+    void finishOutput();
+
+private:
+    LasError m_error;
+    LasHeader m_lasHeader;
+    std::unique_ptr<SummaryData> m_summaryData;
+    std::unique_ptr<LASzipper> m_zipper;
+    std::unique_ptr<ZipPoint> m_zipPoint;
+    bool m_discardHighReturnNumbers;
+    std::map<std::string, std::string> m_headerVals;
+    std::vector<VlrOptionInfo> m_optionInfos;
+    std::ostream *m_ostream;
+    std::vector<VariableLengthRecord> m_vlrs;
+    std::vector<ExtVariableLengthRecord> m_eVlrs;
+    std::vector<ExtraDim> m_extraDims;
+    uint16_t m_extraByteLen;
+    SpatialReference m_srs;
+    std::string m_curFilename;
+    std::set<std::string> m_forwards;
+    bool m_forwardVlrs;
+
+    NumHeaderVal<uint8_t, 1, 1> m_majorVersion;
+    NumHeaderVal<uint8_t, 1, 4> m_minorVersion;
+    NumHeaderVal<uint8_t, 0, 10> m_dataformatId;
+    // MSVC doesn't see numeric_limits::max() as constexpr do doesn't allow
+    // it as defaults for templates.  Remove when possible.
+    NumHeaderVal<uint16_t, 0, 65535> m_filesourceId;
+    NumHeaderVal<uint16_t, 0, 15> m_globalEncoding;
+    UuidHeaderVal m_projectId;
+    StringHeaderVal<32> m_systemId;
+    StringHeaderVal<32> m_softwareId;
+    NumHeaderVal<uint16_t, 0, 366> m_creationDoy;
+    // MSVC doesn't see numeric_limits::max() as constexpr do doesn't allow
+    // them as defaults for templates.  Remove when possible.
+    NumHeaderVal<uint16_t, 0, 65535> m_creationYear;
+    StringHeaderVal<20> m_scaleX;
+    StringHeaderVal<20> m_scaleY;
+    StringHeaderVal<20> m_scaleZ;
+    StringHeaderVal<20> m_offsetX;
+    StringHeaderVal<20> m_offsetY;
+    StringHeaderVal<20> m_offsetZ;
+
+    virtual void processOptions(const Options& options);
+    virtual void prepared(PointTableRef table);
+    virtual void readyTable(PointTableRef table);
+    virtual void readyFile(const std::string& filename);
+    virtual void writeView(const PointViewPtr view);
+    virtual void doneFile();
+
+    void fillForwardList(const Options& options);
+    void getHeaderOptions(const Options& options);
+    void getVlrOptions(const Options& opts);
+    template <typename T>
+    void handleForward(const std::string& s, T& headerVal,
+        const MetadataNode& base);
+    void handleForwards(MetadataNode& forward);
+    void fillHeader(MetadataNode& forward);
+    point_count_t fillWriteBuf(const PointView& view, PointId startId,
+        std::vector<char>& buf);
+    void setVlrsFromMetadata(MetadataNode& forward);
+    MetadataNode findVlrMetadata(MetadataNode node, uint16_t recordId,
+        const std::string& userId);
+    void setExtraBytesVlr();
+    void setVlrsFromSpatialRef();
+    void readyCompression();
+    void openCompression();
+    void addVlr(const std::string& userId, uint16_t recordId,
+        const std::string& description, std::vector<uint8_t>& data);
+    bool addGeotiffVlr(GeotiffSupport& geotiff, uint16_t recordId,
+        const std::string& description);
+    bool addWktVlr();
+
+    LasWriter& operator=(const LasWriter&); // not implemented
+    LasWriter(const LasWriter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/io/las/SummaryData.cpp b/io/las/SummaryData.cpp
new file mode 100644
index 0000000..c02cf89
--- /dev/null
+++ b/io/las/SummaryData.cpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SummaryData.hpp"
+
+namespace pdal
+{
+
+SummaryData::SummaryData() :
+    m_minX((std::numeric_limits<double>::max)()),
+    m_minY((std::numeric_limits<double>::max)()),
+    m_minZ((std::numeric_limits<double>::max)()),
+    m_maxX(std::numeric_limits<double>::lowest()),
+    m_maxY(std::numeric_limits<double>::lowest()),
+    m_maxZ(std::numeric_limits<double>::lowest()),
+    m_totalNumPoints(0)
+{
+    m_returnCounts.fill(0);
+}
+
+
+void SummaryData::addPoint(double x, double y, double z, int returnNumber)
+{
+    ++m_totalNumPoints;
+    m_minX = (std::min)(m_minX, x);
+    m_minY = (std::min)(m_minY, y);
+    m_minZ = (std::min)(m_minZ, z);
+    m_maxX = (std::max)(m_maxX, x);
+    m_maxY = (std::max)(m_maxY, y);
+    m_maxZ = (std::max)(m_maxZ, z);
+
+    // Returns numbers are indexed from one, but the array indexes from 0.
+    returnNumber--;
+    if (returnNumber >= 0 && (size_t)returnNumber < m_returnCounts.size())
+        m_returnCounts[returnNumber]++;
+}
+
+
+BOX3D SummaryData::getBounds() const
+{
+    BOX3D output(m_minX, m_minY, m_minZ, m_maxX, m_maxY, m_maxZ);
+    return output;
+}
+
+
+point_count_t SummaryData::getReturnCount(int returnNumber) const
+{
+    if (returnNumber < 0 || (size_t)returnNumber >= m_returnCounts.size())
+        throw pdal_error("getReturnCount: point returnNumber is out of range");
+    return m_returnCounts[returnNumber];
+}
+
+
+void SummaryData::dump(std::ostream& str) const
+{
+    str << "MinX: " << m_minX << "\n";
+    str << "MinY: " << m_minY << "\n";
+    str << "MinZ: " << m_minZ << "\n";
+    str << "MaxX: " << m_maxX << "\n";
+    str << "MaxY: " << m_maxY << "\n";
+    str << "MaxZ: " << m_maxZ << "\n";
+
+    str << "Number of returns:";
+    for (size_t i = 0; i < m_returnCounts.size(); ++i)
+        str << " " << m_returnCounts[i];
+    str << "\n";
+
+    str << "Total number of points: " << m_totalNumPoints << "\n";
+}
+
+
+std::ostream& operator<<(std::ostream& ostr, const SummaryData& data)
+{
+    data.dump(ostr);
+    return ostr;
+}
+
+} // namespace pdal
diff --git a/io/las/SummaryData.hpp b/io/las/SummaryData.hpp
new file mode 100644
index 0000000..d7570fc
--- /dev/null
+++ b/io/las/SummaryData.hpp
@@ -0,0 +1,76 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <ostream>
+#include <array>
+
+#include <pdal/pdal_internal.hpp>
+
+#include "LasHeader.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL SummaryData
+{
+public:
+    SummaryData();
+
+    void addPoint(double x, double y, double z, int returnNumber);
+    uint32_t getTotalNumPoints() const
+        { return m_totalNumPoints; }
+    BOX3D getBounds() const;
+    point_count_t getReturnCount(int returnNumber) const;
+
+    void dump(std::ostream&) const;
+
+private:
+    double m_minX;
+    double m_minY;
+    double m_minZ;
+    double m_maxX;
+    double m_maxY;
+    double m_maxZ;
+    std::array<point_count_t, LasHeader::RETURN_COUNT> m_returnCounts;
+    point_count_t m_totalNumPoints;
+
+    SummaryData& operator=(const SummaryData&); // not implemented
+    SummaryData(const SummaryData&); // not implemented
+};
+
+PDAL_DLL std::ostream& operator<<(std::ostream& ostr, const SummaryData&);
+
+} // namespace pdal
diff --git a/io/las/VariableLengthRecord.cpp b/io/las/VariableLengthRecord.cpp
new file mode 100644
index 0000000..982880d
--- /dev/null
+++ b/io/las/VariableLengthRecord.cpp
@@ -0,0 +1,103 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "VariableLengthRecord.hpp"
+
+namespace pdal
+{
+
+const uint16_t VariableLengthRecord::MAX_DATA_SIZE =
+    (std::numeric_limits<uint16_t>::max)();
+
+ILeStream& operator>>(ILeStream& in, VariableLengthRecord& v)
+{
+    uint16_t reserved;
+    uint16_t dataLen;
+
+    in >> reserved;
+    in.get(v.m_userId, 16);
+    in >> v.m_recordId >> dataLen;
+    in.get(v.m_description, 32);
+    v.m_data.resize(dataLen);
+    in.get(v.m_data);
+
+    return in;
+}
+
+
+OLeStream& operator<<(OLeStream& out, const VariableLengthRecord& v)
+{
+    out << v.m_recordSig;
+    out.put(v.m_userId, 16);
+    out << v.m_recordId << (uint16_t)v.dataLen();
+    out.put(v.m_description, 32);
+    out.put(v.data(), v.dataLen());
+
+    return out;
+}
+
+
+ILeStream& operator>>(ILeStream& in, ExtVariableLengthRecord& v)
+{
+    uint64_t dataLen;
+
+    in >> v.m_recordSig;
+    in.get(v.m_userId, 16);
+    in >> v.m_recordId >> dataLen;
+    in.get(v.m_description, 32);
+    v.m_data.resize(dataLen);
+    in.get(v.m_data);
+
+    return in;
+}
+
+
+OLeStream& operator<<(OLeStream& out, const ExtVariableLengthRecord& v)
+{
+    out << (uint16_t)0;
+    out.put(v.userId(), 16);
+    out << v.recordId() << v.dataLen();
+    out.put(v.description(), 32);
+    out.put(v.data(), v.dataLen());
+
+    return out;
+}
+
+    void VariableLengthRecord::write(OLeStream& out, uint16_t recordSig)
+    {
+        m_recordSig = recordSig;
+        out << *this;
+    }
+
+} // namespace pdal
diff --git a/io/las/VariableLengthRecord.hpp b/io/las/VariableLengthRecord.hpp
new file mode 100644
index 0000000..805b307
--- /dev/null
+++ b/io/las/VariableLengthRecord.hpp
@@ -0,0 +1,124 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <limits>
+#include <string>
+#include <vector>
+
+#include <pdal/SpatialReference.hpp>
+#include <pdal/util/IStream.hpp>
+#include <pdal/util/OStream.hpp>
+
+namespace pdal
+{
+
+static const int WKT_RECORD_ID = 2112;
+static const uint16_t GEOTIFF_DIRECTORY_RECORD_ID = 34735;
+static const uint16_t GEOTIFF_DOUBLES_RECORD_ID = 34736;
+static const uint16_t GEOTIFF_ASCII_RECORD_ID = 34737;
+static const uint16_t LASZIP_RECORD_ID = 22204;
+static const uint16_t EXTRA_BYTES_RECORD_ID = 4;
+
+static const char TRANSFORM_USER_ID[] = "LASF_Projection";
+static const char SPEC_USER_ID[] = "LASF_Spec";
+static const char LIBLAS_USER_ID[] = "liblas";
+static const char LASZIP_USER_ID[] = "laszip encoded";
+
+class VariableLengthRecord;
+typedef std::vector<VariableLengthRecord> VlrList;
+
+class PDAL_DLL VariableLengthRecord
+{
+public:
+    static const uint16_t MAX_DATA_SIZE;
+
+    VariableLengthRecord(const std::string& userId, uint16_t recordId,
+            const std::string& description, std::vector<uint8_t>& data) :
+        m_userId(userId), m_recordId(recordId), m_description(description),
+        m_data(std::move(data)), m_recordSig(0)
+    {}
+    VariableLengthRecord() : m_recordId(0), m_recordSig(0)
+    {}
+
+    std::string userId() const
+        { return m_userId;}
+    uint16_t recordId() const
+        { return m_recordId; }
+    std::string description() const
+        { return m_description; }
+    
+    bool matches(const std::string& userId) const
+        { return userId == m_userId; }
+    bool matches(const std::string& userId, uint16_t recordId) const
+        { return matches(userId) && (recordId == m_recordId); }
+
+    const char* data() const
+        { return (const char *)m_data.data(); }
+    char* data()
+        { return (char *)m_data.data(); }
+    uint64_t dataLen() const
+        { return m_data.size(); }
+    void setDataLen(uint64_t size)
+        { m_data.resize((size_t)size); }
+    void write(OLeStream& out, uint16_t recordSig);
+
+    friend ILeStream& operator>>(ILeStream& in, VariableLengthRecord& v);
+    friend OLeStream& operator<<(OLeStream& out, const VariableLengthRecord& v);
+
+protected:
+    std::string m_userId;
+    uint16_t m_recordId;
+    std::string m_description;
+    std::vector<uint8_t> m_data;
+    uint16_t m_recordSig;
+};
+
+class ExtVariableLengthRecord : public VariableLengthRecord
+{
+public:
+    ExtVariableLengthRecord(const std::string& userId, uint16_t recordId,
+            const std::string& description, std::vector<uint8_t>& data) :
+        VariableLengthRecord(userId, recordId, description, data)
+    {}
+    ExtVariableLengthRecord()
+    {}
+
+    friend ILeStream& operator>>(ILeStream& in, ExtVariableLengthRecord& v);
+    friend OLeStream& operator<<(OLeStream& out,
+        const ExtVariableLengthRecord& v);
+};
+
+} // namespace pdal
diff --git a/io/las/ZipPoint.cpp b/io/las/ZipPoint.cpp
new file mode 100644
index 0000000..247328d
--- /dev/null
+++ b/io/las/ZipPoint.cpp
@@ -0,0 +1,123 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <sstream>
+#include <string.h>
+
+#include <pdal/pdal_internal.hpp>
+
+#ifdef PDAL_HAVE_LASZIP
+
+#include "VariableLengthRecord.hpp"
+#include "ZipPoint.hpp"
+
+namespace pdal
+{
+
+// Read-mode ctor.
+ZipPoint::ZipPoint(VariableLengthRecord *vlr) :
+    m_zip(new LASzip()), m_lz_point(NULL), m_lz_point_size(0)
+{
+    if (!vlr || !m_zip->unpack((unsigned char *)vlr->data(), vlr->dataLen()))
+    {
+        std::ostringstream oss;
+        const char* err = m_zip->get_error();
+        if (err == NULL) 
+            err = "(unknown error)";
+        oss << "Error unpacking zip VLR data: " << std::string(err);
+        throw pdal_error(oss.str());
+    }
+    ConstructItems();
+}
+
+
+// Write-mode ctor.
+ZipPoint::ZipPoint(uint8_t format, uint16_t pointLen) :
+    m_zip(new LASzip()), m_lz_point(NULL), m_lz_point_size(0)
+{
+    if (!m_zip->setup(format, pointLen))
+    {
+        std::ostringstream oss;
+        const char* err = m_zip->get_error();
+        if (err == NULL)
+            err = "(unknown error)";
+        oss << "Error setting up LASzip for format " << format << ": " <<
+            err;
+        throw pdal_error(oss.str());
+    }
+    ConstructItems();
+}
+
+
+ZipPoint::~ZipPoint()
+{
+    delete[] m_lz_point;
+}
+
+
+void ZipPoint::ConstructItems()
+{
+    // construct the object that will hold a laszip point
+
+    // compute the point size
+    m_lz_point_size = 0;
+    for (unsigned int i = 0; i < m_zip->num_items; i++)
+        m_lz_point_size += m_zip->items[i].size;
+
+    // create the point data
+    unsigned int point_offset = 0;
+    m_lz_point = new unsigned char*[m_zip->num_items];
+
+    m_lz_point_data.resize(m_lz_point_size);
+    for (unsigned i = 0; i < m_zip->num_items; i++)
+    {
+        m_lz_point[i] = &(m_lz_point_data[point_offset]);
+        point_offset += m_zip->items[i].size;
+    }
+}
+
+
+std::vector<uint8_t> ZipPoint::vlrData() const
+{
+    // This puts a bunch of data into an array of data pointed to by 'data',
+    // suitable for storage in a VLR.
+    uint8_t* data;
+    int num;
+    m_zip->pack(data, num);
+    return std::vector<uint8_t>(data, data + num);
+}
+
+} // namespace pdal
+
+#endif // PDAL_HAVE_LASZIP
diff --git a/io/las/ZipPoint.hpp b/io/las/ZipPoint.hpp
new file mode 100644
index 0000000..76dffcd
--- /dev/null
+++ b/io/las/ZipPoint.hpp
@@ -0,0 +1,83 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <vector>
+
+#ifdef PDAL_HAVE_LASZIP
+#include <laszip/laszip.hpp>
+#include <laszip/lasunzipper.hpp>
+#include <laszip/laszipper.hpp>
+#endif
+
+namespace pdal
+{
+
+#ifdef PDAL_HAVE_LASZIP
+
+class VariableLengthRecord;
+
+class PDAL_DLL ZipPoint
+{
+public:
+    ZipPoint(VariableLengthRecord *lasHeader);
+    ZipPoint(uint8_t format, uint16_t pointLen);
+    ~ZipPoint();
+
+    std::vector<uint8_t> vlrData() const;
+    LASzip* GetZipper() const
+        { return m_zip.get(); }
+    
+private:
+    std::unique_ptr<LASzip> m_zip;
+
+//ABELL - This block should be made private.
+public:
+    unsigned char** m_lz_point;
+    unsigned int m_lz_point_size;
+    std::vector<uint8_t> m_lz_point_data;
+
+private:
+    void ConstructItems();
+};
+#else // PDAL_HAVE_LASZIP
+// The types here just need to be something suitable for a smart pointer.
+// They aren't ever used beyond testing for NULL.
+typedef char LASzipper;
+typedef char LASunzipper;
+typedef char ZipPoint;
+#endif
+
+} // namespace pdal
diff --git a/io/null/CMakeLists.txt b/io/null/CMakeLists.txt
new file mode 100644
index 0000000..d3533cf
--- /dev/null
+++ b/io/null/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+# NULL writer CMake configuration
+#
+
+set(srcs
+    NullWriter.cpp
+)
+
+set(incs
+    NullWriter.hpp
+)
+
+PDAL_ADD_DRIVER(writer null "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/null/NullWriter.cpp b/io/null/NullWriter.cpp
new file mode 100644
index 0000000..327b918
--- /dev/null
+++ b/io/null/NullWriter.cpp
@@ -0,0 +1,16 @@
+#include "NullWriter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.null",
+    "Null writer.  Provides a sink for points in a pipeline.  "\
+        "It's the same as sending pipeline output to /dev/null.",
+    "http://pdal.io/stages/writers.null.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, NullWriter, Writer, s_info)
+
+std::string NullWriter::getName() const { return s_info.name; }
+
+}
diff --git a/io/null/NullWriter.hpp b/io/null/NullWriter.hpp
new file mode 100644
index 0000000..7ba0111
--- /dev/null
+++ b/io/null/NullWriter.hpp
@@ -0,0 +1,58 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+
+#include <pdal/Writer.hpp>
+
+extern "C" int32_t NullWriter_ExitFunc();
+extern "C" PF_ExitFunc NullWriter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL NullWriter : public Writer
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+private:
+    virtual void write(const PointViewPtr /*view*/)
+        {}
+};
+
+} // namespace pdal
diff --git a/io/optech/CMakeLists.txt b/io/optech/CMakeLists.txt
new file mode 100644
index 0000000..53c4d9e
--- /dev/null
+++ b/io/optech/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(srcs
+    OptechReader.cpp
+    )
+
+set(incs
+    OptechReader.hpp
+    )
+
+PDAL_ADD_DRIVER(reader optech "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/optech/OptechCommon.hpp b/io/optech/OptechCommon.hpp
new file mode 100644
index 0000000..483cec8
--- /dev/null
+++ b/io/optech/OptechCommon.hpp
@@ -0,0 +1,110 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/util/Georeference.hpp>
+
+namespace pdal
+{
+
+
+class optech_error : public pdal_error
+{
+public:
+    optech_error(const std::string& msg)
+        : pdal_error(msg)
+    {
+    }
+};
+
+
+// Optech csd files contain misalignment angles and IMU offsets.
+// Misalignment angles and IMU offsets combine to form the boresight matrix.
+typedef struct
+{
+    char signature[4];
+    char vendorId[64];
+    char softwareVersion[32];
+    float formatVersion;
+    uint16_t headerSize;
+    uint16_t gpsWeek;
+    double minTime; // seconds
+    double maxTime; // seconds
+    uint32_t numRecords;
+    uint16_t numStrips;
+    uint32_t stripPointers[256];
+    double misalignmentAngles[3]; // radians
+    double imuOffsets[3];         // radians
+    double temperature;           // degrees
+    double pressure;              // mbar
+    char freeSpace[830];
+} CsdHeader;
+
+
+typedef struct
+{
+    double gpsTime;
+    uint8_t returnCount;
+    float range[4]; // metres
+    uint16_t intensity[4];
+    float scanAngle;  // radians
+    float roll;       // radians
+    float pitch;      // radians
+    float heading;    // radians
+    double latitude;  // radians
+    double longitude; // radians
+    float elevation;  // metres
+} CsdPulse;
+
+
+// Optech does it like R3(heading) * R1(-pitch) * R2(-roll)
+inline pdal::georeference::RotationMatrix
+createOptechRotationMatrix(double roll, double pitch, double heading)
+{
+    return georeference::RotationMatrix(
+        std::cos(roll) * std::cos(heading) +
+            std::sin(pitch) * std::sin(roll) * std::sin(heading), // m00
+        std::cos(pitch) * std::sin(heading),                      // m01
+        std::cos(heading) * std::sin(roll) -
+            std::cos(roll) * std::sin(pitch) * std::sin(heading), // m02
+        std::cos(heading) * std::sin(pitch) * std::sin(roll) -
+            std::cos(roll) * std::sin(heading), // m10
+        std::cos(pitch) * std::cos(heading),    // m11
+        -std::sin(roll) * std::sin(heading) -
+            std::cos(roll) * std::cos(heading) * std::sin(pitch), // m12
+        -std::cos(pitch) * std::sin(roll),                        // m20
+        std::sin(pitch),                                          // m21
+        std::cos(pitch) * std::cos(roll)                          // m22
+        );
+}
+}
diff --git a/io/optech/OptechReader.cpp b/io/optech/OptechReader.cpp
new file mode 100644
index 0000000..0543680
--- /dev/null
+++ b/io/optech/OptechReader.cpp
@@ -0,0 +1,283 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#define _USE_MATH_DEFINES
+#include "OptechReader.hpp"
+
+#include <cmath>
+#include <cstring>
+#include <sstream>
+
+#include <pdal/SpatialReference.hpp>
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.optech",
+    "Optech reader support.",
+    "http://pdal.io/stages/readers.optech.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, OptechReader, Reader, s_info);
+
+std::string OptechReader::getName() const
+{
+    return s_info.name;
+}
+
+#ifndef _WIN32
+const size_t OptechReader::MaximumNumberOfReturns;
+const size_t OptechReader::MaxNumRecordsInBuffer;
+const size_t OptechReader::NumBytesInRecord;
+#endif
+
+OptechReader::OptechReader()
+    : Reader()
+    , m_header()
+    , m_boresightMatrix(georeference::createIdentityMatrix())
+    , m_istream()
+    , m_buffer()
+    , m_extractor(m_buffer.data(), 0)
+    , m_recordIndex(0)
+    , m_returnIndex(0)
+    , m_pulse()
+{
+    // The Optech docs say that their lat/longs are referenced
+    // to the WGS84 reference frame.
+    SpatialReference spatialReference;
+    spatialReference.setFromUserInput("EPSG:4326");
+    setSpatialReference(spatialReference);
+}
+
+
+Dimension::IdList OptechReader::getDefaultDimensions()
+{
+    Dimension::IdList dims;
+    dims.push_back(Dimension::Id::X);
+    dims.push_back(Dimension::Id::Y);
+    dims.push_back(Dimension::Id::Z);
+    dims.push_back(Dimension::Id::GpsTime);
+    dims.push_back(Dimension::Id::ReturnNumber);
+    dims.push_back(Dimension::Id::NumberOfReturns);
+    dims.push_back(Dimension::Id::EchoRange);
+    dims.push_back(Dimension::Id::Intensity);
+    dims.push_back(Dimension::Id::ScanAngleRank);
+    return dims;
+}
+
+
+const CsdHeader& OptechReader::getHeader() const { return m_header; }
+
+
+void OptechReader::initialize()
+{
+    ILeStream stream(FileUtils::openFile(m_filename));
+    if (!stream)
+    {
+        std::stringstream ss;
+        ss << "Unable to open " << m_filename << " for reading.";
+        throw pdal_error(ss.str());
+    }
+
+    stream.get(m_header.signature, 4);
+    if (strcmp(m_header.signature, "CSD") != 0)
+    {
+        std::stringstream ss;
+        ss << "Invalid header signature when reading CSD file: '"
+           << m_header.signature << "'";
+        throw optech_error(ss.str());
+    }
+    stream.get(m_header.vendorId, 64);
+    stream.get(m_header.softwareVersion, 32);
+    stream >> m_header.formatVersion >> m_header.headerSize >>
+        m_header.gpsWeek >> m_header.minTime >> m_header.maxTime >>
+        m_header.numRecords >> m_header.numStrips;
+    for (size_t i = 0; i < 256; ++i)
+    {
+        stream >> m_header.stripPointers[i];
+    }
+    stream >> m_header.misalignmentAngles[0] >>
+        m_header.misalignmentAngles[1] >> m_header.misalignmentAngles[2] >>
+        m_header.imuOffsets[0] >> m_header.imuOffsets[1] >>
+        m_header.imuOffsets[2] >> m_header.temperature >> m_header.pressure;
+    stream.get(m_header.freeSpace, 830);
+
+    m_boresightMatrix = createOptechRotationMatrix(
+        m_header.misalignmentAngles[0] + m_header.imuOffsets[0],
+        m_header.misalignmentAngles[1] + m_header.imuOffsets[1],
+        m_header.misalignmentAngles[2] + m_header.imuOffsets[2]);
+}
+
+
+void OptechReader::addDimensions(PointLayoutPtr layout)
+{
+    for (auto it : getDefaultDimensions())
+    {
+        layout->registerDim(it);
+    }
+}
+
+
+void OptechReader::ready(PointTableRef)
+{
+    m_istream.reset(new IStream(m_filename));
+    if (!*m_istream)
+    {
+        std::stringstream ss;
+        ss << "Unable to open " << m_filename << " for reading.";
+        throw pdal_error(ss.str());
+    }
+
+    m_istream->seek(m_header.headerSize);
+    m_recordIndex = 0;
+    m_returnIndex = 0;
+    m_pulse = CsdPulse();
+}
+
+
+point_count_t OptechReader::read(PointViewPtr data,
+                                 point_count_t countRequested)
+{
+    point_count_t numRead = 0;
+    point_count_t dataIndex = data->size();
+
+    while (numRead < countRequested)
+    {
+        if (m_returnIndex == 0)
+        {
+            if (!m_extractor.good())
+            {
+                if (m_recordIndex >= m_header.numRecords)
+                {
+                    break;
+                }
+                m_recordIndex += fillBuffer();
+            }
+
+            m_extractor >> m_pulse.gpsTime >> m_pulse.returnCount >>
+                m_pulse.range[0] >> m_pulse.range[1] >> m_pulse.range[2] >>
+                m_pulse.range[3] >> m_pulse.intensity[0] >>
+                m_pulse.intensity[1] >> m_pulse.intensity[2] >>
+                m_pulse.intensity[3] >> m_pulse.scanAngle >> m_pulse.roll >>
+                m_pulse.pitch >> m_pulse.heading >> m_pulse.latitude >>
+                m_pulse.longitude >> m_pulse.elevation;
+
+            if (m_pulse.returnCount == 0)
+            {
+                m_returnIndex = 0;
+                continue;
+            }
+
+            // In all the csd files that we've tested, the longitude
+            // values have been less than -2pi.
+            if (m_pulse.longitude < -M_PI * 2)
+            {
+                m_pulse.longitude = m_pulse.longitude + M_PI * 2;
+            }
+            else if (m_pulse.longitude > M_PI * 2)
+            {
+                m_pulse.longitude = m_pulse.longitude - M_PI * 2;
+            }
+        }
+
+        georeference::Xyz gpsPoint = georeference::Xyz(
+            m_pulse.longitude, m_pulse.latitude, m_pulse.elevation);
+        georeference::RotationMatrix rotationMatrix =
+            createOptechRotationMatrix(m_pulse.roll, m_pulse.pitch,
+                                       m_pulse.heading);
+        georeference::Xyz point = pdal::georeference::georeferenceWgs84(
+            m_pulse.range[m_returnIndex], m_pulse.scanAngle,
+            m_boresightMatrix, rotationMatrix, gpsPoint);
+
+        data->setField(Dimension::Id::X, dataIndex, point.X * 180 / M_PI);
+        data->setField(Dimension::Id::Y, dataIndex, point.Y * 180 / M_PI);
+        data->setField(Dimension::Id::Z, dataIndex, point.Z);
+        data->setField(Dimension::Id::GpsTime, dataIndex, m_pulse.gpsTime);
+        if (m_returnIndex == MaximumNumberOfReturns - 1)
+        {
+            data->setField(Dimension::Id::ReturnNumber, dataIndex,
+                          m_pulse.returnCount);
+        }
+        else
+        {
+            data->setField(Dimension::Id::ReturnNumber, dataIndex,
+                          m_returnIndex + 1);
+        }
+        data->setField(Dimension::Id::NumberOfReturns, dataIndex,
+                      m_pulse.returnCount);
+        data->setField(Dimension::Id::EchoRange, dataIndex,
+                      m_pulse.range[m_returnIndex]);
+        data->setField(Dimension::Id::Intensity, dataIndex,
+                      m_pulse.intensity[m_returnIndex]);
+        data->setField(Dimension::Id::ScanAngleRank, dataIndex,
+                      m_pulse.scanAngle * 180 / M_PI);
+
+        if (m_cb)
+            m_cb(*data, dataIndex);
+
+        ++dataIndex;
+        ++numRead;
+        ++m_returnIndex;
+
+        if (m_returnIndex >= m_pulse.returnCount ||
+            m_returnIndex >= MaximumNumberOfReturns)
+        {
+            m_returnIndex = 0;
+        }
+    }
+    return numRead;
+}
+
+
+size_t OptechReader::fillBuffer()
+{
+    size_t numRecords = std::min<size_t>(m_header.numRecords - m_recordIndex,
+                                         MaxNumRecordsInBuffer);
+
+    buffer_size_t bufferSize = NumBytesInRecord * numRecords;
+    m_buffer.resize(bufferSize);
+    m_istream->get(m_buffer);
+    m_extractor = LeExtractor(m_buffer.data(), m_buffer.size());
+    return numRecords;
+}
+
+
+void OptechReader::done(PointTableRef)
+{
+    m_istream.reset();
+}
+
+} // namespace pdal
+
diff --git a/io/optech/OptechReader.hpp b/io/optech/OptechReader.hpp
new file mode 100644
index 0000000..ec98ae9
--- /dev/null
+++ b/io/optech/OptechReader.hpp
@@ -0,0 +1,91 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <memory>
+#include <vector>
+
+#include <pdal/Reader.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/util/Extractor.hpp>
+#include <pdal/util/Georeference.hpp>
+#include <pdal/util/IStream.hpp>
+#include <pdal/pdal_export.hpp>
+
+#include "OptechCommon.hpp"
+
+extern "C" int32_t OptechReader_ExitFunc();
+extern "C" PF_ExitFunc OptechReader_InitPlugin();
+
+namespace pdal
+{
+
+
+class PDAL_DLL OptechReader : public Reader
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    static const size_t MaximumNumberOfReturns = 4;
+    static const size_t NumBytesInRecord = 69;
+    static const size_t MaxNumRecordsInBuffer = 1e6 / NumBytesInRecord;
+
+    OptechReader();
+
+    static Dimension::IdList getDefaultDimensions();
+    const CsdHeader& getHeader() const;
+
+private:
+    typedef std::vector<char> buffer_t;
+    typedef buffer_t::size_type buffer_size_t;
+
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t num);
+    size_t fillBuffer();
+    virtual void done(PointTableRef table);
+
+    CsdHeader m_header;
+    georeference::RotationMatrix m_boresightMatrix;
+    std::unique_ptr<IStream> m_istream;
+    buffer_t m_buffer;
+    LeExtractor m_extractor;
+    size_t m_recordIndex;
+    size_t m_returnIndex;
+    CsdPulse m_pulse;
+};
+}
diff --git a/io/optech/OptechRotationMatrix.hpp b/io/optech/OptechRotationMatrix.hpp
new file mode 100644
index 0000000..cc3e72d
--- /dev/null
+++ b/io/optech/OptechRotationMatrix.hpp
@@ -0,0 +1,46 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <cmath>
+
+#include <pdal/RotationMatrix.hpp>
+
+
+namespace pdal
+{
+
+
+}
diff --git a/io/ply/CMakeLists.txt b/io/ply/CMakeLists.txt
new file mode 100644
index 0000000..10b7705
--- /dev/null
+++ b/io/ply/CMakeLists.txt
@@ -0,0 +1,14 @@
+set(src
+    PlyReader.cpp
+    PlyWriter.cpp
+    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.c
+)
+
+set(inc
+    PlyReader.hpp
+    PlyWriter.hpp
+    ${PROJECT_SOURCE_DIR}/vendor/rply-1.1.3/rply.h
+)
+
+PDAL_ADD_DRIVER(reader ply "${src}" "${inc}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/ply/PlyReader.cpp b/io/ply/PlyReader.cpp
new file mode 100644
index 0000000..36c18b6
--- /dev/null
+++ b/io/ply/PlyReader.cpp
@@ -0,0 +1,260 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PlyReader.hpp"
+
+#include <sstream>
+
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+namespace
+{
+
+
+struct CallbackContext
+{
+    PointViewPtr view;
+    DimensionMap dimensionMap;
+};
+
+
+void plyErrorCallback(p_ply ply, const char * message)
+{
+    std::stringstream ss;
+    ss << "Error opening ply file: " << message;
+    throw pdal_error(ss.str());
+}
+
+
+p_ply openPly(std::string filename)
+{
+    p_ply ply = ply_open(filename.c_str(), &plyErrorCallback, 0, nullptr);
+    if (!ply)
+    {
+        std::stringstream ss;
+        ss << "Unable to open file " << filename << " for reading.";
+        throw pdal_error(ss.str());
+    }
+    if (!ply_read_header(ply))
+    {
+        std::stringstream ss;
+        ss << "Unable to read header of " << filename << ".";
+        throw pdal_error(ss.str());
+    }
+    return ply;
+}
+
+
+int readPlyCallback(p_ply_argument argument)
+{
+    p_ply_element element;
+    long index;
+    void * contextAsVoid;
+    long numToRead;
+    p_ply_property property;
+    const char * propertyName;
+
+    if (!ply_get_argument_element(argument, &element, &index))
+    {
+        std::stringstream ss;
+        ss << "Error getting argument element.";
+        throw pdal_error(ss.str());
+    }
+    if (!ply_get_argument_user_data(argument, &contextAsVoid, &numToRead))
+    {
+        std::stringstream ss;
+        ss << "Error getting argument user data.";
+        throw pdal_error(ss.str());
+    }
+    // We've read enough, abort the callback cycle
+    if (numToRead <= index)
+    {
+        return 0;
+    }
+
+    if (!ply_get_argument_property(argument, &property, nullptr, nullptr))
+    {
+        std::stringstream ss;
+        ss << "Error getting argument property.";
+        throw pdal_error(ss.str());
+    }
+    if (!ply_get_property_info(property, &propertyName, nullptr, nullptr, nullptr))
+    {
+        std::stringstream ss;
+        ss << "Error getting property info.";
+        throw pdal_error(ss.str());
+    }
+
+    CallbackContext * context = static_cast<CallbackContext *>(contextAsVoid);
+    double value = ply_get_argument_value(argument);
+    Dimension::Id::Enum dimension = context->dimensionMap.at(propertyName);
+    context->view->setField(dimension, index, value);
+
+    return 1;
+}
+
+
+}
+
+
+static PluginInfo const s_info = PluginInfo(
+        "readers.ply",
+        "Read ply files.",
+        "http://pdal.io/stages/reader.ply.html");
+
+
+CREATE_STATIC_PLUGIN(1, 0, PlyReader, Reader, s_info);
+
+
+std::string PlyReader::getName() const
+{
+    return s_info.name;
+}
+
+
+PlyReader::PlyReader()
+    : m_ply(nullptr)
+    , m_vertexDimensions()
+{}
+
+
+void PlyReader::initialize()
+{
+    p_ply ply = openPly(m_filename);
+    p_ply_element vertex_element = nullptr;
+    bool found_vertex_element = false;
+    const char* element_name;
+    long element_count;
+    while ((vertex_element = ply_get_next_element(ply, vertex_element)))
+    {
+        if (!ply_get_element_info(vertex_element, &element_name, &element_count))
+        {
+            std::stringstream ss;
+            ss << "Error reading element info in " << m_filename << ".";
+            throw pdal_error(ss.str());
+        }
+        if (strcmp(element_name, "vertex") == 0)
+        {
+            found_vertex_element = true;
+            break;
+        }
+    }
+    if (!found_vertex_element)
+    {
+        std::stringstream ss;
+        ss << "File " << m_filename << " does not contain a vertex element.";
+        throw pdal_error(ss.str());
+    }
+
+    p_ply_property property = nullptr;
+    while ((property = ply_get_next_property(vertex_element, property)))
+    {
+        const char* name;
+        e_ply_type type;
+        e_ply_type length_type;
+        e_ply_type value_type;
+        if (!ply_get_property_info(property, &name, &type, &length_type, &value_type))
+        {
+            std::stringstream ss;
+            ss << "Error reading property info in " << m_filename << ".";
+            throw pdal_error(ss.str());
+        }
+        // For now, we'll just use PDAL's built in dimension matching.
+        // We could be smarter about this, e.g. by using the length
+        // and value type attributes.
+        Dimension::Id::Enum dim = Dimension::id(name);
+        if (dim != Dimension::Id::Unknown)
+        {
+            m_vertexDimensions[name] = dim;
+        }
+    }
+    ply_close(ply);
+}
+
+
+void PlyReader::addDimensions(PointLayoutPtr layout)
+{
+    for (auto it : m_vertexDimensions)
+    {
+        layout->registerDim(it.second);
+    }
+}
+
+
+void PlyReader::ready(PointTableRef table)
+{
+    m_ply = openPly(m_filename);
+}
+
+
+point_count_t PlyReader::read(PointViewPtr view, point_count_t num)
+{
+    CallbackContext context;
+    context.view = view;
+    context.dimensionMap = m_vertexDimensions;
+
+    // It's possible that point_count_t holds a value that's larger than the
+    // long that is the maximum rply (don't know about ply) point count.
+    long cnt;
+    cnt = Utils::inRange<long>(num) ? num : (std::numeric_limits<long>::max)();
+    for (auto it : m_vertexDimensions)
+    {
+        ply_set_read_cb(m_ply, "vertex", it.first.c_str(), readPlyCallback,
+            &context, cnt);
+    }
+    if (!ply_read(m_ply))
+    {
+        std::stringstream ss;
+        ss << "Error reading " << m_filename << ".";
+        throw pdal_error(ss.str());
+    }
+    return view->size();
+}
+
+
+void PlyReader::done(PointTableRef table)
+{
+    if (!ply_close(m_ply))
+    {
+        std::stringstream ss;
+        ss << "Error closing " << m_filename << ".";
+        throw pdal_error(ss.str());
+    }
+}
+
+}
diff --git a/io/ply/PlyReader.hpp b/io/ply/PlyReader.hpp
new file mode 100644
index 0000000..32e6452
--- /dev/null
+++ b/io/ply/PlyReader.hpp
@@ -0,0 +1,80 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <string>
+
+#include "rply.h"
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+
+
+extern "C" int32_t PlyReader_ExitFunc();
+extern "C" PF_ExitFunc PlyReader_InitPlugin();
+
+
+namespace pdal
+{
+
+
+typedef std::map<std::string, Dimension::Id::Enum> DimensionMap;
+
+
+class PDAL_DLL PlyReader : public Reader
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    PlyReader();
+
+    static Dimension::IdList getDefaultDimensions();
+
+private:
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t num);
+    virtual void done(PointTableRef table);
+
+    p_ply m_ply;
+    DimensionMap m_vertexDimensions;
+
+};
+}
+
diff --git a/io/ply/PlyWriter.cpp b/io/ply/PlyWriter.cpp
new file mode 100644
index 0000000..9f63438
--- /dev/null
+++ b/io/ply/PlyWriter.cpp
@@ -0,0 +1,209 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PlyWriter.hpp"
+
+#include <sstream>
+
+
+namespace pdal
+{
+namespace
+{
+
+
+void createErrorCallback(p_ply ply, const char* message)
+{
+    std::stringstream ss;
+    ss << "Error when creating ply file: " << message;
+    throw pdal_error(ss.str());
+}
+
+
+e_ply_type getPlyType(Dimension::Type::Enum type)
+{
+    using namespace Dimension::Type;
+    switch (type)
+    {
+    case Unsigned8:
+        return PLY_UINT8;
+    case Signed8:
+        return PLY_INT8;
+    case Unsigned16:
+        return PLY_UINT16;
+    case Signed16:
+        return PLY_INT16;
+    case Unsigned32:
+        return PLY_UIN32;
+    case Signed32:
+        return PLY_INT32;
+    case Unsigned64:
+        return PLY_FLOAT64;
+    case Signed64:
+        return PLY_FLOAT64;
+    case Float:
+        return PLY_FLOAT32;
+    case Double:
+        return PLY_FLOAT64;
+    default:
+        // I went back and forth about throwing here, but since it's not
+        // wrong to fall back onto a double (just bad, b/c it can take up
+        // extra space), I chose to default rather than throw.
+        return PLY_FLOAT64;
+    }
+}
+}
+
+
+static PluginInfo const s_info = PluginInfo(
+        "writers.ply",
+        "ply writer",
+        "http://pdal.io/stages/writers.ply.html"
+        );
+
+CREATE_STATIC_PLUGIN(1, 0, PlyWriter, Writer, s_info)
+
+std::string PlyWriter::getName() const { return s_info.name; }
+
+
+PlyWriter::PlyWriter()
+    : m_ply(nullptr)
+    , m_pointCollector(nullptr)
+    , m_storageMode(PLY_DEFAULT)
+{}
+
+
+void PlyWriter::processOptions(const Options& options)
+{
+    std::string storageMode = options.getValueOrDefault<std::string>("storage_mode", "default");
+    if (storageMode == "ascii")
+    {
+        m_storageMode = PLY_ASCII;
+    }
+    else if (storageMode == "little endian")
+    {
+        m_storageMode = PLY_LITTLE_ENDIAN;
+    }
+    else if (storageMode == "big endian")
+    {
+        m_storageMode = PLY_BIG_ENDIAN;
+    }
+    else if (storageMode == "default")
+    {
+        m_storageMode = PLY_DEFAULT;
+    }
+    else
+    {
+        std::stringstream ss;
+        ss << "Unknown storage mode '" << storageMode <<
+            "'. Known storage modes are: 'ascii', 'little endian', 'big endian', and 'default'";
+        throw pdal_error(ss.str());
+    }
+}
+
+
+void PlyWriter::ready(PointTableRef table)
+{
+    m_ply = ply_create(m_filename.c_str(), m_storageMode, createErrorCallback, 0, nullptr);
+    if (!m_ply)
+    {
+        std::stringstream ss;
+        ss << "Could not open file for writing: " << m_filename;
+        throw pdal_error(ss.str());
+    }
+    m_pointCollector.reset(new PointView(table));
+}
+
+
+void PlyWriter::write(const PointViewPtr data)
+{
+    m_pointCollector->append(*data);
+}
+
+
+void PlyWriter::done(PointTableRef table)
+{
+    if (!ply_add_element(m_ply, "vertex", m_pointCollector->size()))
+    {
+        std::stringstream ss;
+        ss << "Could not add vertex element";
+        throw pdal_error(ss.str());
+    }
+    auto dimensions = table.layout()->dims();
+    for (auto dim : dimensions) {
+        std::string name = Dimension::name(dim);
+        e_ply_type plyType = getPlyType(Dimension::defaultType(dim));
+        if (!ply_add_scalar_property(m_ply, name.c_str(), plyType))
+        {
+            std::stringstream ss;
+            ss << "Could not add scalar property '" << name << "'";
+            throw pdal_error(ss.str());
+        }
+    }
+    if (!ply_add_comment(m_ply, "Generated by PDAL"))
+    {
+        std::stringstream ss;
+        ss << "Could not add comment";
+        throw pdal_error(ss.str());
+    }
+    if (!ply_write_header(m_ply))
+    {
+        std::stringstream ss;
+        ss << "Could not write ply header";
+        throw pdal_error(ss.str());
+    }
+
+    for (PointId index = 0; index < m_pointCollector->size(); ++index)
+    {
+        for (auto dim : dimensions)
+        {
+            double value = m_pointCollector->getFieldAs<double>(dim, index);
+            if (!ply_write(m_ply, value))
+            {
+                std::stringstream ss;
+                ss << "Error writing dimension '" << Dimension::name(dim) <<
+                    "' of point number " << index;
+                throw pdal_error(ss.str());
+            }
+        }
+    }
+
+    if (!ply_close(m_ply))
+    {
+        throw pdal_error("Error closing ply file");
+    }
+}
+
+
+}
diff --git a/io/ply/PlyWriter.hpp b/io/ply/PlyWriter.hpp
new file mode 100644
index 0000000..4881366
--- /dev/null
+++ b/io/ply/PlyWriter.hpp
@@ -0,0 +1,71 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "rply.h"
+
+#include <pdal/PointView.hpp>
+#include <pdal/Writer.hpp>
+
+
+extern "C" int32_t PlyWriter_ExitFunc();
+extern "C" PF_ExitFunc PlyWriter_InitPlugin();
+
+
+namespace pdal
+{
+
+
+class PDAL_DLL PlyWriter : public Writer
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    PlyWriter();
+
+private:
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr data);
+    virtual void done(PointTableRef table);
+
+    p_ply m_ply;
+    PointViewPtr m_pointCollector;
+    e_ply_storage_mode m_storageMode;
+
+};
+
+
+}
diff --git a/io/qfit/CMakeLists.txt b/io/qfit/CMakeLists.txt
new file mode 100644
index 0000000..b544bff
--- /dev/null
+++ b/io/qfit/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# QFIT driver CMake configuration
+#
+
+#
+# QFIT Reader
+#
+set(srcs
+    QfitReader.cpp
+)
+
+set(incs
+    QfitReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader qfit "${srcs}" "${incs}" objs)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/qfit/QfitReader.cpp b/io/qfit/QfitReader.cpp
new file mode 100644
index 0000000..0dd8777
--- /dev/null
+++ b/io/qfit/QfitReader.cpp
@@ -0,0 +1,459 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+/*
+
+Airborne Topographic Mapper (ATM) Project
+NASA, Goddard Space Flight Center, Wallops Flight Facility
+Principal Investigator: Bill Krabill (William.B.Krabill at nasa.gov)
+
+Description of ATM QFIT Output Data
+(revised 2009-feb-13 sm)
+
+ATM data is generally distributed in the output format of the
+processing  program, qfit, which combines airborne laser ranging
+data and aircraft attitude from the INS with positioning
+information from a processed kinematic  differential GPS
+trajectory.  Qfit output files, which usually have names ending
+in a .qi extension, are organized as 32-bit (4-byte)
+binary  words, equivalent to a C or IDL long integer, which are
+scaled to retain the precision of the measurements.  The format
+and the scaling factors are presented below.  The qfit program is
+run on an Apple PowerPC processor (and formerly Sun/Motorola).
+Accordingly, the output is written in a big-endian format and
+must be byte-swapped to be read with a PC (Intel processor)
+which uses a little-endian format to store 32-bit integers.
+
+The files are organized into fixed-length logical records. The
+beginning of the file contains a header of one or more records
+followed by a data segment, in which there is one record per
+laser shot. It is not necessary to interpret the header
+to use the laser data->
+
+The first word of the header (and the file) is a 32-bit  binary
+integer giving the number of bytes in each logical record.  Commonly
+qfit files have 12 words per record and this integer will be the
+number 48.  The remainder of the initial logical record is padded
+with blank bytes (in this case 44 blank bytes). 10-word and 14-word
+formats have also been used, as described below.
+
+The remainder of the header is generally a series of logical
+records  containing the processing history of the file.  In these
+logical records, the  initial word contains a 32-bit binary
+integer with a value between -9000000 and -9000008.  The
+remaining bytes in each header record is filled with a string of
+ascii characters containing information on file processing
+history.  In this case, the byte offset (as a longword integer)
+from the start of file to the start of laser data will be the
+second word of the second record of the header.  (Note: The header
+records can be removed by eliminating records that begin with a
+negative value since the first word of records in the data segment
+is always a positive number.)
+
+In the data segment of the file, the information contained in
+words 1-11 of the output record pertains to the  laser pulse, its
+footprint, and aircraft attitude.  The last word of each record is
+always the GPS time of day when the laser measurement was acquired.
+
+Prior to 2008 surveys, the GPS trajectory was edited to restrict PDOP<9
+in order to limit GPS errors to be less than roughly 5cm.  The output
+survey data would therefore have occasional gaps where the PDOP>9.
+Some applications of ATM data have less stringent accuracy requirements
+that would be better served by preserving the data in these gaps.
+Starting in 2008, the PDOP limit was changed to 20, which could allow
+occasional GPS errors up to about 15cm.  The PDOP value is carried in
+the qfit output and can be used to edit data for applications requiring
+greater precision.   Any file in the 10-word format, or files in the 12-word
+format processed prior to January 2009, will have PDOP limited
+<9.
+
+The three data formats are described below.  The format is designated by
+the logical record length given in the first word of the data file.
+
+The qi 12-word format (in use since 2006):
+Word #       Content
+   1    Relative Time (msec from start of data file)
+   2    Laser Spot Latitude (degrees X 1,000,000)
+   3    Laser Spot Longitude (degrees X 1,000,000)
+   4    Elevation (millimeters)
+   5    Start Pulse Signal Strength (relative)
+   6    Reflected Laser Signal Strength (relative)
+   7    Scan Azimuth (degrees X 1,000)
+   8    Pitch (degrees X 1,000)
+   9    Roll (degrees X 1,000)
+  10    GPS PDOP (dilution of precision) (X 10)
+  11    Laser received pulse width (digitizer samples)
+  12    GPS Time packed (example: 153320100 = 15h 33m 20s 100ms)
+
+10-word format (used prior to 2006):
+Word #       Content
+   1    Relative Time (msec from start of data file)
+   2    Laser Spot Latitude (degrees X 1,000,000)
+   3    Laser Spot Longitude (degrees X 1,000,000)
+   4    Elevation (millimeters)
+   5    Start Pulse Signal Strength (relative)
+   6    Reflected Laser Signal Strength (relative)
+   7    Scan Azimuth (degrees X 1,000)
+   8    Pitch (degrees X 1,000)
+   9    Roll (degrees X 1,000)
+  10    GPS Time packed (example: 153320100 = 15h 33m 20s 100ms)
+
+
+Between 1997 and 2004 some ATM surveys included
+a separate sensor to measure passive brightness.
+In the 14-word format, words 10-13 pertain to the
+passive brightness signal, which is essentially a relative
+measure of radiance reflected from the  earth's surface within
+the vicinity of the laser pulse.  The horizontal position of the
+passive footprint is determined relative to the laser footprint
+by a  delay formulated during ground testing at Wallops.  The
+elevation of the footprint is synthesized from surrounding laser
+elevation data->  NOTE:  The passive data is not calibrated and
+its use, if any, should  be qualitative in nature.  It may aid
+the interpretation of terrain features. The measurement capability
+was engineered into the ATM sensors to aid in the identification
+of the water/beach interface acquired with  the instrument in
+coastal mapping applications.
+
+14-word format:
+Word #       Content
+   1    Relative Time (msec from start of data file)
+   2    Laser Spot Latitude (degrees X 1,000,000)
+   3    Laser Spot Longitude (degrees X 1,000,000)
+   4    Elevation (millimeters)
+   5    Start Pulse Signal Strength (relative)
+   6    Reflected Laser Signal Strength (relative)
+   7    Scan Azimuth (degrees X 1,000)
+   8    Pitch (degrees X 1,000)
+   9    Roll (degrees X 1,000)
+  10    Passive Signal (relative)
+  11    Passive Footprint Latitude (degrees X 1,000,000)
+  12    Passive Footprint Longitude (degrees X 1,000,000)
+  13    Passive Footprint Synthesized Elevation (millimeters)
+  14    GPS Time packed (example: 153320100 = 15h 33m 20s 100ms)
+*/
+
+#include "QfitReader.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/util/Extractor.hpp>
+#include <pdal/util/portable_endian.hpp>
+
+#include <algorithm>
+#include <map>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.qfit",
+    "QFIT Reader",
+    "http://pdal.io/stages/readers.qfit.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, QfitReader, Reader, s_info)
+
+std::string QfitReader::getName() const { return s_info.name; }
+
+QfitReader::QfitReader()
+    : pdal::Reader()
+    , m_format(QFIT_Format_Unknown)
+    , m_size(0)
+    , m_littleEndian(false)
+    , m_istream()
+{}
+
+
+void QfitReader::initialize()
+{
+    ISwitchableStream str(m_filename);
+    if (!str)
+    {
+        std::ostringstream oss;
+        oss << "Unable to open file '" << m_filename << "'";
+        throw qfit_error(oss.str());
+    }
+    str.seek(0);
+
+    int32_t int4(0);
+
+    str >> int4;
+
+    // They started writting little-endian data->
+
+    /* For years we produced ATM data in big-endian format. With changes in
+    computer hardware, we reluctantly changed our standard output to
+    little-endian. The transition occurred between the two 2010 campaigns. The
+    format of the binary ( .qi, for example) files can be identified by
+    examining the first four bytes of the file. Read as a long integer (one
+    4-byte word), the value will contain the record length (in bytes) of the
+    data records. For example, a .qi file containing 14 words per record will
+    have a value 56 (=4*14). If the format of the file matches the format of
+    your processor, the value will be reasonable without byte-swapping. If the
+    format of the file differs from your processor, then the value is
+    interpreted as some very large number, unless you swap the byte order. If
+    you use Intel or equivalent processors, then you had to byte-swap files
+    from spring 2010 and earlier, you do not swap the ones from fall 2010 and
+    later. */
+
+    // If the size comes back something other than 4*no_dimensions, we assume
+    // The data were flipped
+    if (int4 < 100)
+    {
+        m_littleEndian = true;
+    }
+    else
+    {
+        str.switchToBigEndian();
+    }
+
+    if (!m_littleEndian)
+        int4 = int32_t(be32toh(uint32_t(int4)));
+
+    if (int4 % 4 != 0)
+        throw qfit_error("Base QFIT format is not a multiple of 4, "
+            "unrecognized format!");
+
+    m_size = int4;
+    m_format = static_cast<QFIT_Format_Type>(m_size / sizeof(m_size));
+
+    // The offset to start reading point data should be here.
+    str.seek(m_size + sizeof(int4));
+
+    str >> int4;
+    m_offset = static_cast<std::size_t>(int4);
+
+    // Seek to the end
+    str.seek(0, std::istream::end);
+    std::ios::pos_type end = str.position();
+
+    // First integer is the format of the file
+    std::ios::off_type offset = static_cast<std::ios::off_type>(m_offset);
+    m_point_bytes = end - offset;
+}
+
+
+Options QfitReader::getDefaultOptions()
+{
+    Options options;
+    Option filename("filename", "", "file to read from");
+    Option flip_coordinates("flip_coordinates", true,
+        "Flip coordinates from 0-360 to -180-180");
+    Option convert_z_units("scale_z", 0.001f,
+        "Z scale. Use 0.001 to go from mm to m");
+    Option little_endian("little_endian", false,
+        "Are data in little endian format?");
+    options.add(filename);
+    options.add(flip_coordinates);
+    options.add(convert_z_units);
+    options.add(little_endian);
+    return options;
+}
+
+
+void QfitReader::processOptions(const Options& ops)
+{
+    m_flip_x = ops.getValueOrDefault("flip_coordinates", true);
+    m_scale_z = ops.getValueOrDefault("scale_z", 0.001);
+}
+
+
+void QfitReader::addDimensions(PointLayoutPtr layout)
+{
+    using namespace Dimension;
+
+    m_size = 0;
+    layout->registerDim(Id::OffsetTime);
+    layout->registerDim(Id::Y);
+    layout->registerDim(Id::X);
+    layout->registerDim(Id::Z);
+    layout->registerDim(Id::StartPulse);
+    layout->registerDim(Id::ReflectedPulse);
+    layout->registerDim(Id::ScanAngleRank);
+    layout->registerDim(Id::Pitch);
+    layout->registerDim(Id::Roll);
+    m_size += 36;
+
+    if (m_format == QFIT_Format_12)
+    {
+        layout->registerDim(Id::Pdop);
+        layout->registerDim(Id::PulseWidth);
+        m_size += 8;
+    }
+    else if (m_format == QFIT_Format_14)
+    {
+        layout->registerDim(Id::PassiveSignal);
+        layout->registerDim(Id::PassiveY);
+        layout->registerDim(Id::PassiveX);
+        layout->registerDim(Id::PassiveZ);
+        m_size += 16;
+    }
+    m_size += 4;  // For the GPS time that we currently discard.
+}
+
+
+void QfitReader::ready(PointTableRef)
+{
+    m_numPoints = m_point_bytes / m_size;
+    if (m_point_bytes % m_size)
+    {
+        std::ostringstream msg;
+        msg << "Error calculating file point count.  File size is "
+            "inconsistent with point size.";
+        throw qfit_error(msg.str());
+    }
+    m_index = 0;
+    m_istream.reset(new IStream(m_filename));
+    m_istream->seek(getPointDataOffset());
+}
+
+
+point_count_t QfitReader::read(PointViewPtr data, point_count_t count)
+{
+    if (!m_istream->good())
+    {
+        throw pdal_error("QFIT file stream is no good!");
+    }
+    if (m_istream->stream()->eof())
+    {
+        throw pdal_error("QFIT file stream is eof!");
+    }
+
+    count = std::min(m_numPoints - m_index, count);
+    std::vector<char> buf(m_size);
+    PointId nextId = data->size();
+    point_count_t numRead = 0;
+    while (count--)
+    {
+        m_istream->get(buf);
+        SwitchableExtractor extractor(buf.data(), m_size, m_littleEndian);
+
+        // always read the base fields
+        {
+            int32_t time, y, xi, z, start_pulse, reflected_pulse, scan_angle,
+                pitch, roll;
+            extractor >> time >> y >> xi >> z >> start_pulse >>
+                reflected_pulse >> scan_angle >> pitch >> roll;
+            double x = xi / 1000000.0;
+            if (m_flip_x && x > 180)
+                x -= 360;
+
+            data->setField(Dimension::Id::OffsetTime, nextId, time);
+            data->setField(Dimension::Id::Y, nextId, y / 1000000.0);
+            data->setField(Dimension::Id::X, nextId, x);
+            data->setField(Dimension::Id::Z, nextId, z * m_scale_z);
+            data->setField(Dimension::Id::StartPulse, nextId, start_pulse);
+            data->setField(Dimension::Id::ReflectedPulse, nextId,
+                reflected_pulse);
+            data->setField(Dimension::Id::ScanAngleRank, nextId,
+                scan_angle / 1000.0);
+            data->setField(Dimension::Id::Pitch, nextId, pitch / 1000.0);
+            data->setField(Dimension::Id::Roll, nextId, roll / 1000.0);
+        }
+
+        if (m_format == QFIT_Format_12)
+        {
+            int32_t pdop, pulse_width;
+            extractor >> pdop >> pulse_width;
+            data->setField(Dimension::Id::Pdop, nextId, pdop / 10.0);
+            data->setField(Dimension::Id::PulseWidth, nextId, pulse_width);
+        }
+        else if (m_format == QFIT_Format_14)
+        {
+            int32_t passive_signal, passive_y, passive_x, passive_z;
+            extractor >> passive_signal >> passive_y >> passive_x >> passive_z;
+            double x = passive_x / 1000000.0;
+            if (m_flip_x && x > 180)
+                x -= 360;
+            data->setField(Dimension::Id::PassiveSignal, nextId, passive_signal);
+            data->setField(Dimension::Id::PassiveY, nextId,
+                passive_y / 1000000.0);
+            data->setField(Dimension::Id::PassiveX, nextId, x);
+            data->setField(Dimension::Id::PassiveZ, nextId,
+                passive_z * m_scale_z);
+        }
+        // GPS time is really a GPS offset from the start of the GPS day
+        // encoded in this odd way: 153320100 = 15 hours 33 minutes
+        // 20 seconds 100 milliseconds.
+        // Not sure why we have that AND the other offset time.  For now
+        // we'll just extract this time and drop it.
+        int32_t gpstime;
+        extractor >> gpstime;
+
+        if (m_cb)
+            m_cb(*data, nextId);
+
+        numRead++;
+        nextId++;
+    }
+    m_index += numRead;
+
+    return numRead;
+}
+
+
+Dimension::IdList QfitReader::getDefaultDimensions()
+{
+    Dimension::IdList ids;
+
+    ids.push_back(Dimension::Id::OffsetTime);
+    ids.push_back(Dimension::Id::Y);
+    ids.push_back(Dimension::Id::X);
+    ids.push_back(Dimension::Id::Z);
+    ids.push_back(Dimension::Id::StartPulse);
+    ids.push_back(Dimension::Id::ReflectedPulse);
+    ids.push_back(Dimension::Id::ScanAngleRank);
+    ids.push_back(Dimension::Id::Pitch);
+    ids.push_back(Dimension::Id::Roll);
+    ids.push_back(Dimension::Id::Pdop);
+    ids.push_back(Dimension::Id::PulseWidth);
+    ids.push_back(Dimension::Id::PassiveSignal);
+    ids.push_back(Dimension::Id::PassiveY);
+    ids.push_back(Dimension::Id::PassiveX);
+    ids.push_back(Dimension::Id::PassiveZ);
+
+    return ids;
+}
+
+
+void QfitReader::done(PointTableRef)
+{
+    m_istream.reset();
+}
+
+} // namespace pdal
diff --git a/io/qfit/QfitReader.hpp b/io/qfit/QfitReader.hpp
new file mode 100644
index 0000000..d895874
--- /dev/null
+++ b/io/qfit/QfitReader.hpp
@@ -0,0 +1,118 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <memory>
+#include <vector>
+
+#include <pdal/Reader.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/util/IStream.hpp>
+
+
+extern "C" int32_t QfitReader_ExitFunc();
+extern "C" PF_ExitFunc QfitReader_InitPlugin();
+
+namespace pdal
+{
+
+enum QFIT_Format_Type
+{
+    QFIT_Format_10 = 10,
+    QFIT_Format_12 = 12,
+    QFIT_Format_14 = 14,
+    QFIT_Format_Unknown = 128
+};
+
+class qfit_error : public pdal_error
+{
+public:
+
+    qfit_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+class PDAL_DLL QfitReader : public pdal::Reader
+{
+public:
+    QfitReader();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions();
+
+    std::string getFileName() const;
+
+    std::size_t getPointDataOffset() const
+        { return m_offset; }
+    uint32_t getPointDataSize() const
+        { return m_size; }
+    point_count_t getNumPoints() const
+        { return m_numPoints; }
+    bool eof()
+        { return m_index >= m_numPoints; }
+
+    // this is called by the stage's iterator
+    point_count_t processBuffer(PointViewPtr view, std::istream& stream,
+        point_count_t count) const;
+
+private:
+    QFIT_Format_Type m_format;
+    std::ios::off_type m_point_bytes;
+    std::size_t m_offset;
+    uint32_t m_size;
+    bool m_flip_x;
+    double m_scale_z;
+    bool m_littleEndian;
+    point_count_t m_numPoints;
+    std::unique_ptr<IStream> m_istream;
+    point_count_t m_index;
+
+    virtual void processOptions(const Options& ops);
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr buf, point_count_t count);
+    virtual void done(PointTableRef table);
+
+    QfitReader& operator=(const QfitReader&); // not implemented
+    QfitReader(const QfitReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/io/sbet/CMakeLists.txt b/io/sbet/CMakeLists.txt
new file mode 100644
index 0000000..9c0c67f
--- /dev/null
+++ b/io/sbet/CMakeLists.txt
@@ -0,0 +1,38 @@
+#
+# SBET driver CMake configuration
+#
+
+set(objs "")
+
+add_library(sbetcommon OBJECT SbetCommon.cpp SbetCommon.hpp)
+set(objs ${objs} $<TARGET_OBJECTS:sbetcommon>)
+
+#
+# SBET Reader
+#
+set(srcs
+    SbetReader.cpp
+)
+
+set(incs
+    SbetReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader sbet "${srcs}" "${incs}" reader_objs)
+set(objs ${objs} ${reader_objs})
+
+#
+# SBET Writer
+#
+set(srcs
+    SbetWriter.cpp
+)
+
+set(incs
+    SbetWriter.hpp
+)
+
+PDAL_ADD_DRIVER(writer sbet "${srcs}" "${incs}" writer_objs)
+set(objs ${objs} ${writer_objs})
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objs} PARENT_SCOPE)
diff --git a/io/sbet/SbetCommon.cpp b/io/sbet/SbetCommon.cpp
new file mode 100644
index 0000000..f06b924
--- /dev/null
+++ b/io/sbet/SbetCommon.cpp
@@ -0,0 +1,72 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SbetCommon.hpp"
+
+namespace pdal
+{
+
+Dimension::IdList fileDimensions()
+{
+    Dimension::IdList ids;
+
+    // Data for each point is in the source file in the order these dimensions
+    // are listed, I would suppose.  Would be really nice to have a reference
+    // to the file spec.  I searched the Internet and found that it is from
+    // some company called Applanix (Trimble), but I can't find anything
+    // describing the file format on their website.
+
+    using namespace Dimension;
+    ids.push_back(Id::GpsTime);
+    ids.push_back(Id::Y);
+    ids.push_back(Id::X);
+    ids.push_back(Id::Z);
+    ids.push_back(Id::XVelocity);
+    ids.push_back(Id::YVelocity);
+    ids.push_back(Id::ZVelocity);
+    ids.push_back(Id::Roll);
+    ids.push_back(Id::Pitch);
+    ids.push_back(Id::PlatformHeading);
+    ids.push_back(Id::WanderAngle);
+    ids.push_back(Id::XBodyAccel);
+    ids.push_back(Id::YBodyAccel);
+    ids.push_back(Id::ZBodyAccel);
+    ids.push_back(Id::XBodyAngRate);
+    ids.push_back(Id::YBodyAngRate);
+    ids.push_back(Id::ZBodyAngRate);
+
+    return ids;
+}
+
+} // namespace pdal
diff --git a/io/sbet/SbetCommon.hpp b/io/sbet/SbetCommon.hpp
new file mode 100644
index 0000000..94c45c9
--- /dev/null
+++ b/io/sbet/SbetCommon.hpp
@@ -0,0 +1,44 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Dimension.hpp>
+
+namespace pdal
+{
+
+PDAL_DLL Dimension::IdList fileDimensions();
+
+} // namespace pdal
diff --git a/io/sbet/SbetReader.cpp b/io/sbet/SbetReader.cpp
new file mode 100644
index 0000000..1a005c0
--- /dev/null
+++ b/io/sbet/SbetReader.cpp
@@ -0,0 +1,114 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SbetReader.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.sbet",
+    "SBET Reader",
+    "http://pdal.io/stages/readers.sbet.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SbetReader, Reader, s_info)
+
+std::string SbetReader::getName() const { return s_info.name; }
+
+Options SbetReader::getDefaultOptions()
+{
+    Options options;
+    return options;
+}
+
+
+void SbetReader::addDimensions(PointLayoutPtr layout)
+{
+    layout->registerDims(getDefaultDimensions());
+}
+
+
+void SbetReader::ready(PointTableRef)
+{
+    size_t fileSize = FileUtils::fileSize(m_filename);
+    size_t pointSize = getDefaultDimensions().size() * sizeof(double);
+    if (fileSize % pointSize != 0)
+        throw pdal_error("invalid sbet file size");
+    m_numPts = fileSize / pointSize;
+    m_index = 0;
+    m_stream.reset(new ILeStream(m_filename));
+}
+
+
+point_count_t SbetReader::read(PointViewPtr view, point_count_t count)
+{
+    PointId nextId = view->size();
+    PointId idx = m_index;
+    point_count_t numRead = 0;
+    seek(idx);
+    Dimension::IdList dims = getDefaultDimensions();
+    while (numRead < count && idx < m_numPts)
+    {
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            double d;
+            *m_stream >> d;
+            Dimension::Id::Enum dim = *di;
+            view->setField(dim, nextId, d);
+        }
+
+        if (m_cb)
+            m_cb(*view, nextId);
+
+        idx++;
+        nextId++;
+        numRead++;
+    }
+    m_index = idx;
+    return numRead;
+}
+
+
+bool SbetReader::eof()
+{
+    return m_index >= m_numPts;
+}
+
+
+void SbetReader::seek(PointId idx)
+{
+    m_stream->seek(idx * sizeof(double) * getDefaultDimensions().size());
+}
+
+} // namespace pdal
diff --git a/io/sbet/SbetReader.hpp b/io/sbet/SbetReader.hpp
new file mode 100644
index 0000000..656c37e
--- /dev/null
+++ b/io/sbet/SbetReader.hpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
+
+#include "SbetCommon.hpp"
+
+extern "C" int32_t SbetReader_ExitFunc();
+extern "C" PF_ExitFunc SbetReader_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SbetReader : public pdal::Reader
+{
+public:
+    SbetReader() : Reader()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions()
+        { return fileDimensions(); }
+
+private:
+    std::unique_ptr<ILeStream> m_stream;
+    // Number of points in the file.
+    point_count_t m_numPts;
+    point_count_t m_index;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual bool eof();
+
+    void seek(PointId idx);
+};
+
+} // namespace pdal
diff --git a/io/sbet/SbetWriter.cpp b/io/sbet/SbetWriter.cpp
new file mode 100644
index 0000000..8af0a87
--- /dev/null
+++ b/io/sbet/SbetWriter.cpp
@@ -0,0 +1,84 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SbetWriter.hpp"
+
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.sbet",
+    "SBET Writer",
+    "http://pdal.io/stages/writers.sbet.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SbetWriter, Writer, s_info)
+
+std::string SbetWriter::getName() const { return s_info.name; }
+
+void SbetWriter::processOptions(const Options& options)
+{
+    m_filename = options.getOption("filename").getValue<std::string>();
+}
+
+
+void SbetWriter::ready(PointTableRef)
+{
+    m_stream.reset(new OLeStream(m_filename));
+}
+
+
+void SbetWriter::write(const PointViewPtr view)
+{
+    m_callback->setTotal(view->size());
+    m_callback->invoke(0);
+
+    Dimension::IdList dims = getDefaultDimensions();
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            // If a dimension doesn't exist, write 0.
+            Dimension::Id::Enum dim = *di;
+            *m_stream << (view->hasDim(dim) ?
+                view->getFieldAs<double>(dim, idx) : 0.0);
+        }
+        if (idx % 100 == 0)
+            m_callback->invoke(idx + 1);
+    }
+    m_callback->invoke(view->size());
+}
+
+} // namespace pdal
diff --git a/io/sbet/SbetWriter.hpp b/io/sbet/SbetWriter.hpp
new file mode 100644
index 0000000..75b1443
--- /dev/null
+++ b/io/sbet/SbetWriter.hpp
@@ -0,0 +1,67 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/util/OStream.hpp>
+#include <pdal/Writer.hpp>
+
+#include "SbetCommon.hpp"
+
+extern "C" int32_t SbetWriter_ExitFunc();
+extern "C" PF_ExitFunc SbetWriter_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SbetWriter : public Writer
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    static Dimension::IdList getDefaultDimensions()
+        { return fileDimensions(); }
+
+private:
+    std::unique_ptr<OLeStream> m_stream;
+    std::string m_filename;
+
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+};
+
+} // namespace pdal
diff --git a/io/terrasolid/CMakeLists.txt b/io/terrasolid/CMakeLists.txt
new file mode 100644
index 0000000..267e311
--- /dev/null
+++ b/io/terrasolid/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Terrasolid driver CMake configuration
+#
+
+#
+# Terrasolid Reader
+#
+set(srcs
+    TerrasolidReader.cpp
+)
+
+set(incs
+    TerrasolidReader.hpp
+)
+
+PDAL_ADD_DRIVER(reader terrasolid "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/terrasolid/TerrasolidReader.cpp b/io/terrasolid/TerrasolidReader.cpp
new file mode 100644
index 0000000..87a5dd4
--- /dev/null
+++ b/io/terrasolid/TerrasolidReader.cpp
@@ -0,0 +1,293 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TerrasolidReader.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/util/Extractor.hpp>
+
+#include <map>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.terrasolid",
+    "TerraSolid Reader",
+    "http://pdal.io/stages/readers.terrasolid.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TerrasolidReader, Reader, s_info)
+
+std::string TerrasolidReader::getName() const { return s_info.name; }
+
+void TerrasolidReader::initialize()
+{
+    ILeStream stream(m_filename);
+
+    TerraSolidHeaderPtr h(new TerraSolidHeader);
+    m_header.swap(h);
+
+    stream >> m_header->HdrSize >> m_header->HdrVersion >> m_header->RecogVal;
+    stream.get(m_header->RecogStr, 4);
+    stream >> m_header->PntCnt >> m_header->Units >> m_header->OrgX >>
+        m_header->OrgY >> m_header->OrgZ >> m_header->Time >> m_header->Color;
+
+    if (m_header->RecogVal != 970401)
+        throw terrasolid_error("Header identifier was not '970401', is this "
+            "a TerraSolid .bin file?");
+
+    m_haveColor = (m_header->Color != 0);
+    m_haveTime = (m_header->Time != 0);
+    m_format = static_cast<TERRASOLID_Format_Type>(m_header->HdrVersion);
+
+    if ((m_format != TERRASOLID_Format_1) && (m_format != TERRASOLID_Format_2))
+    {
+        std::ostringstream oss;
+        oss << "Version was '" << m_format << "', not '" <<
+            TERRASOLID_Format_1 << "' or '" << TERRASOLID_Format_2 << "'";
+        throw terrasolid_error(oss.str());
+    }
+
+    log()->get(LogLevel::Debug) << "TerraSolid Reader::initialize format: " <<
+        m_format << std::endl;
+    log()->get(LogLevel::Debug) << "OrgX: " << m_header->OrgX << std::endl;
+    log()->get(LogLevel::Debug) << "OrgY: " << m_header->OrgY << std::endl;
+    log()->get(LogLevel::Debug) << "OrgZ: " << m_header->OrgZ << std::endl;
+    log()->get(LogLevel::Debug) << "Units: " << m_header->Units << std::endl;
+    log()->get(LogLevel::Debug) << "Time: " << m_header->Time << std::endl;
+    log()->get(LogLevel::Debug) << "Color: " << m_header->Color << std::endl;
+    log()->get(LogLevel::Debug) << "Count: " << m_header->PntCnt << std::endl;
+    log()->get(LogLevel::Debug) << "RecogVal: " << m_header->RecogVal <<
+        std::endl;
+}
+
+
+void TerrasolidReader::addDimensions(PointLayoutPtr layout)
+{
+    m_size = 0;
+    layout->registerDim(Dimension::Id::Classification);
+    layout->registerDim(Dimension::Id::PointSourceId);
+    layout->registerDim(Dimension::Id::Intensity);
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+    layout->registerDim(Dimension::Id::ReturnNumber);
+    layout->registerDim(Dimension::Id::NumberOfReturns);
+    if (m_format == TERRASOLID_Format_2)
+    {
+        layout->registerDim(Dimension::Id::Flag);
+        layout->registerDim(Dimension::Id::Mark);
+    }
+    if (m_format == TERRASOLID_Format_1)
+        m_size = 16;
+    else if (m_format == TERRASOLID_Format_2)
+        m_size = 20;
+
+    if (m_haveTime)
+    {
+        layout->registerDim(Dimension::Id::OffsetTime);
+        m_size += 4;
+    }
+
+    if (m_haveColor)
+    {
+        layout->registerDim(Dimension::Id::Red);
+        layout->registerDim(Dimension::Id::Green);
+        layout->registerDim(Dimension::Id::Blue);
+        layout->registerDim(Dimension::Id::Alpha);
+        m_size += 4;
+    }
+}
+
+
+Dimension::IdList TerrasolidReader::getDefaultDimensions()
+{
+    using namespace Dimension;
+
+    IdList dims;
+
+    dims.push_back(Id::Classification);
+    dims.push_back(Id::PointSourceId);
+    dims.push_back(Id::ReturnNumber);
+    dims.push_back(Id::NumberOfReturns);
+    dims.push_back(Id::Flag);
+    dims.push_back(Id::Mark);
+    dims.push_back(Id::Intensity);
+    dims.push_back(Id::X);
+    dims.push_back(Id::Y);
+    dims.push_back(Id::Z);
+    dims.push_back(Id::Red);
+    dims.push_back(Id::Green);
+    dims.push_back(Id::Blue);
+    dims.push_back(Id::Alpha);
+    dims.push_back(Id::OffsetTime);
+    return dims;
+}
+
+
+void TerrasolidReader::ready(PointTableRef)
+{
+    m_istream.reset(new IStream(m_filename));
+    // Skip to the beginning of points.
+    m_istream->seek(56);
+    m_index = 0;
+}
+
+
+point_count_t TerrasolidReader::read(PointViewPtr view, point_count_t count)
+{
+    count = std::min(count, getNumPoints() - m_index);
+
+    std::vector<char> buf(m_size * count);
+    m_istream->get(buf);
+    LeExtractor extractor(buf.data(), buf.size());
+
+    // See https://www.terrasolid.com/download/tscan.pdf
+    // This spec is awful, but it's something.
+    // The scaling adjustments are different than what we used to do and
+    // seem wrong (scaling the offset is odd), but that's what the document
+    // says.
+    // Also modified the fetch of time/color based on header flag (rather
+    // than just not write the data into the buffer).
+    PointId nextId = view->size();
+    while (!eof())
+    {
+        if (m_format == TERRASOLID_Format_1)
+        {
+            uint8_t classification, flight_line, echo_int, x, y, z;
+
+            extractor >> classification >> flight_line >> echo_int >> x >> y >>
+                z;
+
+            view->setField(Dimension::Id::Classification, nextId,
+                          classification);
+            view->setField(Dimension::Id::PointSourceId, nextId, flight_line);
+            switch (echo_int)
+            {
+            case 0: // only echo
+                view->setField(Dimension::Id::ReturnNumber, nextId, 1);
+                view->setField(Dimension::Id::NumberOfReturns, nextId, 1);
+                break;
+            case 1: // first of many echos
+                view->setField(Dimension::Id::ReturnNumber, nextId, 1);
+                break;
+            default: // intermediate echo or last of many echos
+                break;
+            }
+            view->setField(Dimension::Id::X, nextId,
+                          (x - m_header->OrgX) / m_header->Units);
+            view->setField(Dimension::Id::Y, nextId,
+                          (y - m_header->OrgY) / m_header->Units);
+            view->setField(Dimension::Id::Z, nextId,
+                          (z - m_header->OrgZ) / m_header->Units);
+        }
+
+        if (m_format == TERRASOLID_Format_2)
+        {
+            int32_t x, y, z;
+            uint8_t classification, echo_int, flag, mark;
+            uint16_t flight_line, intensity;
+
+            extractor >> x >> y >> z >> classification >> echo_int >> flag >>
+                mark >> flight_line >> intensity;
+
+            view->setField(Dimension::Id::X, nextId,
+                          (x - m_header->OrgX) / m_header->Units);
+            view->setField(Dimension::Id::Y, nextId,
+                          (y - m_header->OrgY) / m_header->Units);
+            view->setField(Dimension::Id::Z, nextId,
+                          (z - m_header->OrgZ) / m_header->Units);
+            view->setField(Dimension::Id::Classification, nextId,
+                          classification);
+            switch (echo_int)
+            {
+            case 0: // only echo
+                view->setField(Dimension::Id::ReturnNumber, nextId, 1);
+                view->setField(Dimension::Id::NumberOfReturns, nextId, 1);
+                break;
+            case 1: // first of many echos
+                view->setField(Dimension::Id::ReturnNumber, nextId, 1);
+                break;
+            default: // intermediate echo or last of many echos
+                break;
+            }
+            view->setField(Dimension::Id::Flag, nextId, flag);
+            view->setField(Dimension::Id::Mark, nextId, mark);
+            view->setField(Dimension::Id::PointSourceId, nextId, flight_line);
+            view->setField(Dimension::Id::Intensity, nextId, intensity);
+        }
+
+        if (m_haveTime)
+        {
+            uint32_t t;
+
+            extractor >> t;
+
+            if (m_index == 0)
+                m_baseTime = t;
+            t -= m_baseTime; // Offset from the beginning of the read.
+            // instead of GPS week.
+            t /= 5; // 5000ths of a second to milliseconds
+            view->setField(Dimension::Id::OffsetTime, nextId, t);
+        }
+
+        if (m_haveColor)
+        {
+            uint8_t red, green, blue, alpha;
+
+            extractor >> red >> green >> blue >> alpha;
+
+            view->setField(Dimension::Id::Red, nextId, red);
+            view->setField(Dimension::Id::Green, nextId, green);
+            view->setField(Dimension::Id::Blue, nextId, blue);
+            view->setField(Dimension::Id::Alpha, nextId, alpha);
+        }
+
+        if (m_cb)
+            m_cb(*view, nextId);
+
+        nextId++;
+        m_index++;
+    }
+
+    return count;
+}
+
+
+void TerrasolidReader::done(PointTableRef)
+{
+    m_istream.reset();
+}
+
+} // namespace pdal
diff --git a/io/terrasolid/TerrasolidReader.hpp b/io/terrasolid/TerrasolidReader.hpp
new file mode 100644
index 0000000..f4b2add
--- /dev/null
+++ b/io/terrasolid/TerrasolidReader.hpp
@@ -0,0 +1,140 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Options.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/util/IStream.hpp>
+
+#include <memory>
+#include <vector>
+
+extern "C" int32_t TerrasolidReader_ExitFunc();
+extern "C" PF_ExitFunc TerrasolidReader_InitPlugin();
+
+namespace pdal
+{
+
+
+enum TERRASOLID_Format_Type
+{
+    TERRASOLID_Format_1 = 20010712,
+    TERRASOLID_Format_2 = 20020715,
+    TERRASOLID_Format_Unknown = 999999999
+};
+
+struct TerraSolidHeader
+{
+    TerraSolidHeader() :
+        HdrSize(0),
+        HdrVersion(0),
+        RecogVal(0),
+        PntCnt(0),
+        Units(0),
+        OrgX(0),
+        OrgY(0),
+        OrgZ(0),
+        Time(0),
+        Color(0)
+    {}
+
+    int32_t HdrSize;
+    int32_t HdrVersion;
+    int32_t RecogVal;
+    char RecogStr[4];
+    int32_t PntCnt;
+    int32_t Units;
+    double OrgX;
+    double OrgY;
+    double OrgZ;
+    int32_t Time;
+    int32_t Color;
+};
+
+typedef std::unique_ptr<TerraSolidHeader> TerraSolidHeaderPtr;
+class terrasolid_error : public pdal_error
+{
+public:
+
+    terrasolid_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+class PDAL_DLL TerrasolidReader : public pdal::Reader
+{
+public:
+    TerrasolidReader() : pdal::Reader(),
+        m_format(TERRASOLID_Format_Unknown)
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    static Dimension::IdList getDefaultDimensions();
+
+    point_count_t getNumPoints() const
+        { return m_header->PntCnt; }
+
+    const TerraSolidHeader& getHeader() const { return *m_header; }
+
+    // this is called by the stage's iterator
+    uint32_t processBuffer(PointViewPtr view, std::istream& stream,
+        uint64_t numPointsLeft) const;
+
+private:
+    TerraSolidHeaderPtr m_header;
+    TERRASOLID_Format_Type m_format;
+    uint32_t m_size;
+    bool m_haveColor;
+    bool m_haveTime;
+    uint32_t m_baseTime;
+    std::unique_ptr<IStream> m_istream;
+    point_count_t m_index;
+
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+    virtual bool eof()
+        { return m_index >= getNumPoints(); }
+
+    TerrasolidReader& operator=(const TerrasolidReader&); // not implemented
+    TerrasolidReader(const TerrasolidReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/io/text/CMakeLists.txt b/io/text/CMakeLists.txt
new file mode 100644
index 0000000..61f6b1b
--- /dev/null
+++ b/io/text/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Text driver CMake configuration
+#
+
+#
+# Text Writer
+#
+set(srcs
+    TextWriter.cpp
+)
+
+set(incs
+    TextWriter.hpp
+)
+
+PDAL_ADD_DRIVER(writer text "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/io/text/TextWriter.cpp b/io/text/TextWriter.cpp
new file mode 100644
index 0000000..18664a3
--- /dev/null
+++ b/io/text/TextWriter.cpp
@@ -0,0 +1,264 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TextWriter.hpp"
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/util/Algorithm.hpp>
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/erase.hpp>
+#include <boost/tokenizer.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.text",
+    "Text Writer",
+    "http://pdal.io/stages/writers.text.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TextWriter, Writer, s_info)
+
+std::string TextWriter::getName() const { return s_info.name; }
+
+struct FileStreamDeleter
+{
+
+    template <typename T>
+    void operator()(T* ptr)
+    {
+        if (ptr)
+        {
+            ptr->flush();
+            FileUtils::closeFile(ptr);
+        }
+    }
+};
+
+
+Options TextWriter::getDefaultOptions()
+{
+    Options options;
+
+    options.add("delimiter", ",", "Delimiter to use for writing text");
+    options.add("newline", "\n", "Newline character to use for additional "
+        "lines");
+    options.add("quote_header", true, "Write dimension names in quotes");
+    options.add("filename", "", "Filename to write CSV file to");
+
+    return options;
+}
+
+
+void TextWriter::processOptions(const Options& ops)
+{
+    m_filename = ops.getValueOrThrow<std::string>("filename");
+    m_stream = FileStreamPtr(FileUtils::createFile(m_filename, true),
+        FileStreamDeleter());
+    if (!m_stream)
+    {
+        std::stringstream out;
+        out << "writers.text couldn't open '" << m_filename <<
+            "' for output.";
+        throw pdal_error(out.str());
+    }
+    m_outputType = ops.getValueOrDefault<std::string>("format", "csv");
+    boost::to_upper(m_outputType);
+    m_callback = ops.getValueOrDefault<std::string>("jscallback", "");
+    m_writeAllDims = ops.getValueOrDefault<bool>("keep_unspecified", true);
+    m_dimOrder = ops.getValueOrDefault<std::string>("order", "");
+    m_writeHeader = ops.getValueOrDefault<bool>("write_header", true);
+    m_newline = ops.getValueOrDefault<std::string>("newline", "\n");
+    m_delimiter = ops.getValueOrDefault<std::string>("delimiter", ",");
+    if (m_delimiter.empty())
+        m_delimiter = " ";
+    m_quoteHeader = ops.getValueOrDefault<bool>("quote_header", true);
+    m_packRgb = ops.getValueOrDefault<bool>("pack_rgb", true);
+    m_precision = ops.getValueOrDefault<int>("precision", 3);
+}
+
+
+void TextWriter::ready(PointTableRef table)
+{
+    m_stream->precision(m_precision);
+    *m_stream << std::fixed;
+
+    typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
+
+    // Find the dimensions listed and put them on the id list.
+    boost::char_separator<char> separator(",");
+    boost::erase_all(m_dimOrder, " "); // Wipe off spaces
+    tokenizer sdims(m_dimOrder, separator);
+    for (tokenizer::iterator ti = sdims.begin(); ti != sdims.end(); ++ti)
+    {
+        Dimension::Id::Enum d = table.layout()->findDim(*ti);
+        if (d == Dimension::Id::Unknown)
+        {
+            std::ostringstream oss;
+            oss << "Dimension not found with name '" << *ti <<"'";
+            throw pdal_error(oss.str());
+        }
+        m_dims.push_back(d);
+    }
+    // Add the rest of the dimensions to the list if we're doing that.
+    // Yes, this isn't efficient when, but it's simple.
+    if (m_dimOrder.empty() || m_writeAllDims)
+    {
+        Dimension::IdList all = table.layout()->dims();
+        for (auto di = all.begin(); di != all.end(); ++di)
+            if (!contains(m_dims, *di))
+                m_dims.push_back(*di);
+    }
+
+    if (!m_writeHeader)
+        log()->get(LogLevel::Debug) << "Not writing header" << std::endl;
+    else
+        writeHeader(table);
+}
+
+
+void TextWriter::writeHeader(PointTableRef table)
+{
+    log()->get(LogLevel::Debug) << "Writing header to filename: " <<
+        m_filename << std::endl;
+    if (m_outputType == "GEOJSON")
+        writeGeoJSONHeader();
+    else if (m_outputType == "CSV")
+        writeCSVHeader(table);
+}
+
+
+void TextWriter::writeFooter()
+{
+    if (m_outputType == "GEOJSON")
+    {
+        *m_stream << "]}";
+        if (m_callback.size())
+            *m_stream  <<")";
+    }
+    m_stream.reset();
+}
+
+
+void TextWriter::writeGeoJSONHeader()
+{
+    if (m_callback.size())
+        *m_stream << m_callback <<"(";
+    *m_stream << "{ \"type\": \"FeatureCollection\", \"features\": [";
+}
+
+
+void TextWriter::writeCSVHeader(PointTableRef table)
+{
+    const PointLayoutPtr layout(table.layout());
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        if (di != m_dims.begin())
+            *m_stream << m_delimiter;
+
+        if (m_quoteHeader)
+            *m_stream << "\"" << layout->dimName(*di) << "\"";
+        else
+            *m_stream << layout->dimName(*di);
+    }
+    *m_stream << m_newline;
+}
+
+void TextWriter::writeCSVBuffer(const PointViewPtr view)
+{
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        {
+            if (di != m_dims.begin())
+                *m_stream << m_delimiter;
+            *m_stream << view->getFieldAs<double>(*di, idx);
+        }
+        *m_stream << m_newline;
+    }
+}
+
+void TextWriter::writeGeoJSONBuffer(const PointViewPtr view)
+{
+    using namespace Dimension;
+
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        if (idx)
+            *m_stream << ",";
+
+        *m_stream << "{ \"type\":\"Feature\",\"geometry\": "
+            "{ \"type\": \"Point\", \"coordinates\": [";
+        *m_stream << view->getFieldAs<double>(Id::X, idx) << ",";
+        *m_stream << view->getFieldAs<double>(Id::Y, idx) << ",";
+        *m_stream << view->getFieldAs<double>(Id::Z, idx) << "]},";
+
+        *m_stream << "\"properties\": {";
+
+        for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        {
+            if (di != m_dims.begin())
+                *m_stream << ",";
+
+            *m_stream << "\"" << view->dimName(*di) << "\":";
+            *m_stream << "\"";
+            *m_stream << view->getFieldAs<double>(*di, idx);
+            *m_stream <<"\"";
+        }
+        *m_stream << "}"; // end properties
+        *m_stream << "}"; // end feature
+    }
+}
+
+void TextWriter::write(const PointViewPtr view)
+{
+    if (m_outputType == "CSV")
+        writeCSVBuffer(view);
+    else if (m_outputType == "GEOJSON")
+        writeGeoJSONBuffer(view);
+}
+
+
+void TextWriter::done(PointTableRef /*table*/)
+{
+    writeFooter();
+}
+
+} // namespace pdal
diff --git a/io/text/TextWriter.hpp b/io/text/TextWriter.hpp
new file mode 100644
index 0000000..00ca9b9
--- /dev/null
+++ b/io/text/TextWriter.hpp
@@ -0,0 +1,99 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_export.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/Writer.hpp>
+
+#include <memory>
+#include <vector>
+#include <string>
+
+extern "C" int32_t TextWriter_ExitFunc();
+extern "C" PF_ExitFunc TextWriter_InitPlugin();
+
+namespace pdal
+{
+
+typedef std::shared_ptr<std::ostream> FileStreamPtr;
+
+class PDAL_DLL TextWriter : public Writer
+{
+public:
+    TextWriter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void processOptions(const Options&);
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    void writeHeader(PointTableRef table);
+    void writeFooter();
+    void writeGeoJSONHeader();
+    void writeCSVHeader(PointTableRef table);
+
+    void writeGeoJSONBuffer(const PointViewPtr view);
+    void writeCSVBuffer(const PointViewPtr view);
+
+    std::string m_filename;
+    std::string m_outputType;
+    std::string m_callback;
+    bool m_writeAllDims;
+    std::string m_dimOrder;
+    bool m_writeHeader;
+    std::string m_newline;
+    std::string m_delimiter;
+    bool m_quoteHeader;
+    bool m_packRgb;
+    int m_precision;
+
+    FileStreamPtr m_stream;
+    Dimension::IdList m_dims;
+
+    TextWriter& operator=(const TextWriter&); // not implemented
+    TextWriter(const TextWriter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/kernels/CMakeLists.txt b/kernels/CMakeLists.txt
new file mode 100644
index 0000000..4c58fe4
--- /dev/null
+++ b/kernels/CMakeLists.txt
@@ -0,0 +1,13 @@
+
+add_subdirectory(delta)
+add_subdirectory(diff)
+add_subdirectory(info)
+add_subdirectory(merge)
+add_subdirectory(pipeline)
+add_subdirectory(random)
+add_subdirectory(sort)
+add_subdirectory(tindex)
+add_subdirectory(split)
+add_subdirectory(translate)
+
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} PARENT_SCOPE)
diff --git a/kernels/delta/CMakeLists.txt b/kernels/delta/CMakeLists.txt
new file mode 100644
index 0000000..7ce7714
--- /dev/null
+++ b/kernels/delta/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Delta kernel CMake configuration
+#
+
+#
+# Delta Kernel
+#
+set(srcs
+    DeltaKernel.cpp
+)
+
+set(incs
+    DeltaKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel delta "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/delta/DeltaKernel.cpp b/kernels/delta/DeltaKernel.cpp
new file mode 100644
index 0000000..28c61ad
--- /dev/null
+++ b/kernels/delta/DeltaKernel.cpp
@@ -0,0 +1,245 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "DeltaKernel.hpp"
+
+#include <pdal/PDALUtils.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.delta",
+    "Delta Kernel",
+    "http://pdal.io/kernels/kernels.delta.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, DeltaKernel, Kernel, s_info)
+
+std::string DeltaKernel::getName() const { return s_info.name; }
+
+DeltaKernel::DeltaKernel() : m_3d(true), m_detail(false), m_allDims(false)
+{}
+
+
+void DeltaKernel::addSwitches()
+{
+    namespace po = boost::program_options;
+
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("source", po::value<std::string>(&m_sourceFile),
+         "source file name")
+        ("candidate", po::value<std::string>(&m_candidateFile),
+         "candidate file name")
+        ("output", po::value<std::string>(&m_outputFile),
+         "output file name")
+        ("2d", po::value<bool>(&m_3d)->zero_tokens()->implicit_value(false),
+         "only 2D comparisons/indexing")
+        ("detail",
+         po::value<bool>(&m_detail)->zero_tokens()->implicit_value(true),
+         "Output deltas per-point")
+        ("alldims",
+         po::value<bool>(&m_allDims)->zero_tokens()->implicit_value(true),
+         "Compute diffs for all dimensions (not just X,Y,Z)");
+    addSwitchSet(file_options);
+
+    po::options_description* processing_options =
+        new po::options_description("processing options");
+
+    processing_options->add_options();
+    addSwitchSet(processing_options);
+
+    addPositionalSwitch("source", 1);
+    addPositionalSwitch("candidate", 2);
+    addPositionalSwitch("output", 3);
+}
+
+
+PointViewPtr DeltaKernel::loadSet(const std::string& filename,
+    PointTable& table)
+{
+    Options ops;
+
+    ops.add<std::string>("filename", filename);
+    ops.add<bool>("debug", isDebug());
+    ops.add<uint32_t>("verbose", getVerboseLevel());
+
+    Stage& reader = makeReader(filename);
+    reader.setOptions(ops);
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    assert(viewSet.size() == 1);
+    return *viewSet.begin();
+}
+
+
+int DeltaKernel::execute()
+{
+    PointTable srcTable;
+    PointTable candTable;
+    DimIndexMap dims;
+
+    PointViewPtr srcView = loadSet(m_sourceFile, srcTable);
+    PointViewPtr candView = loadSet(m_candidateFile, candTable);
+
+    PointLayoutPtr srcLayout = srcTable.layout();
+    PointLayoutPtr candLayout = candTable.layout();
+
+    Dimension::IdList ids = srcLayout->dims();
+    for (Dimension::Id::Enum dim : ids)
+    {
+        std::string name = srcLayout->dimName(dim);
+        if (!m_allDims)
+            if (name != "X" && name != "Y" && name != "Z")
+                continue;
+        DimIndex d;
+        d.m_name = name;
+        d.m_srcId = dim;
+        dims[name] = d;
+    }
+    ids = candLayout->dims();
+    for (Dimension::Id::Enum dim : ids)
+    {
+        std::string name = candLayout->dimName(dim);
+        auto di = dims.find(name);
+        if (di == dims.end())
+            continue;
+        DimIndex& d = di->second;
+        d.m_candId = dim;
+    }
+
+    // Remove dimensions that aren't in both the source and candidate lists.
+    for (auto di = dims.begin(); di != dims.end();)
+    {
+        DimIndex& d = di->second;
+        if (d.m_candId == Dimension::Id::Unknown)
+            dims.erase(di++);
+        else
+            ++di;
+    }
+
+    // Index the candidate data.
+    KD3Index index(*candView);
+    index.build();
+
+    MetadataNode root;
+
+    if (m_detail)
+        root = dumpDetail(srcView, candView, index, dims);
+    else
+        root = dump(srcView, candView, index, dims);
+    Utils::toJSON(root, std::cout);
+
+    return 0;
+}
+
+
+MetadataNode DeltaKernel::dump(PointViewPtr& srcView, PointViewPtr& candView,
+    KD3Index& index, DimIndexMap& dims)
+{
+    MetadataNode root;
+
+    for (PointId id = 0; id < srcView->size(); ++id)
+    {
+        double x = srcView->getFieldAs<double>(Dimension::Id::X, id);
+        double y = srcView->getFieldAs<double>(Dimension::Id::Y, id);
+        double z = srcView->getFieldAs<double>(Dimension::Id::Z, id);
+
+        PointId candId = index.neighbor(x, y, z);
+
+        // It may be faster to put in a special case to avoid having to
+        // fetch X, Y and Z, more than once but this is simpler and
+        // I'm thinking in most cases it will make no practical difference.
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            DimIndex& d = di->second;
+            double sv = srcView->getFieldAs<double>(d.m_srcId, id);
+            double cv = candView->getFieldAs<double>(d.m_candId, candId);
+            accumulate(d, sv - cv);
+        }
+    }
+
+    root.add("source", m_sourceFile);
+    root.add("candidate", m_candidateFile);
+    for (auto dpair : dims)
+    {
+        DimIndex& d = dpair.second;
+
+        MetadataNode dimNode = root.add(d.m_name);
+        dimNode.add("min", d.m_min);
+        dimNode.add("max", d.m_max);
+        dimNode.add("mean", d.m_avg);
+    }
+    return root;
+}
+
+
+void DeltaKernel::accumulate(DimIndex& d, double v)
+{
+    d.m_cnt++;
+    d.m_min = std::min(v, d.m_min);
+    d.m_max = std::max(v, d.m_max);
+    d.m_avg += (v - d.m_avg) / d.m_cnt;
+}
+
+
+MetadataNode DeltaKernel::dumpDetail(PointViewPtr& srcView,
+    PointViewPtr& candView, KD3Index& index, DimIndexMap& dims)
+{
+    MetadataNode root;
+
+    for (PointId id = 0; id < srcView->size(); ++id)
+    {
+        double x = srcView->getFieldAs<double>(Dimension::Id::X, id);
+        double y = srcView->getFieldAs<double>(Dimension::Id::Y, id);
+        double z = srcView->getFieldAs<double>(Dimension::Id::Z, id);
+        PointId candId = index.neighbor(x, y, z);
+
+        MetadataNode delta = root.add("delta");
+        delta.add("i", id);
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            DimIndex& d = di->second;
+            double sv = srcView->getFieldAs<double>(d.m_srcId, id);
+            double cv = candView->getFieldAs<double>(d.m_candId, candId);
+
+            delta.add(d.m_name, sv - cv);
+        }
+    }
+    return root;
+}
+
+} // pdal
diff --git a/kernels/delta/DeltaKernel.hpp b/kernels/delta/DeltaKernel.hpp
new file mode 100644
index 0000000..499cde0
--- /dev/null
+++ b/kernels/delta/DeltaKernel.hpp
@@ -0,0 +1,100 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <map>
+
+#include <pdal/KDIndex.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/PointView.hpp>
+
+extern "C" int32_t DeltaKernel_ExitFunc();
+extern "C" PF_ExitFunc DeltaKernel_InitPlugin();
+
+namespace pdal
+{
+
+struct DimIndex
+{
+    std::string m_name;
+    Dimension::Id::Enum m_srcId;
+    Dimension::Id::Enum m_candId;
+    double m_min;
+    double m_max;
+    double m_avg;
+    point_count_t m_cnt;
+
+    DimIndex() : m_srcId(Dimension::Id::Unknown),
+        m_candId(Dimension::Id::Unknown),
+        m_min((std::numeric_limits<double>::max)()),
+        m_max((std::numeric_limits<double>::lowest)()),
+        m_avg(0.0), m_cnt(0)
+    {}
+};
+typedef std::map<std::string, DimIndex> DimIndexMap;
+
+class PDAL_DLL DeltaKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    DeltaKernel();
+    void addSwitches();
+    PointViewPtr loadSet(const std::string& filename, PointTable& table);
+    MetadataNode dump(PointViewPtr& srcView, PointViewPtr& candView,
+        KD3Index& index, DimIndexMap& dims);
+    MetadataNode dumpDetail(PointViewPtr& srcView, PointViewPtr& candView,
+        KD3Index& index, DimIndexMap& dims);
+    void accumulate(DimIndex& d, double v);
+
+    std::string m_sourceFile;
+    std::string m_candidateFile;
+    std::string m_outputFile;
+
+    /**
+    std::ostream* m_outputStream;
+    **/
+
+    bool m_3d;
+    bool m_detail;
+    bool m_allDims;
+};
+
+} // namespace pdal
+
diff --git a/kernels/diff/CMakeLists.txt b/kernels/diff/CMakeLists.txt
new file mode 100644
index 0000000..6869c27
--- /dev/null
+++ b/kernels/diff/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Diff kernel CMake configuration
+#
+
+#
+# Diff Kernel
+#
+set(srcs
+    DiffKernel.cpp
+)
+
+set(incs
+    DiffKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel diff "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/diff/DiffKernel.cpp b/kernels/diff/DiffKernel.cpp
new file mode 100644
index 0000000..04d03fd
--- /dev/null
+++ b/kernels/diff/DiffKernel.cpp
@@ -0,0 +1,223 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "DiffKernel.hpp"
+
+#include <memory>
+
+#include <pdal/PDALUtils.hpp>
+#include <pdal/PointView.hpp>
+
+#include <boost/program_options.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+
+using boost::property_tree::ptree;
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.diff",
+    "Diff Kernel",
+    "http://pdal.io/kernels/kernels.diff.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, DiffKernel, Kernel, s_info)
+
+std::string DiffKernel::getName() const { return s_info.name; }
+
+void DiffKernel::validateSwitches()
+{
+    if (!m_sourceFile.size())
+        throw app_runtime_error("No source file given!");
+    if (!m_candidateFile.size())
+        throw app_runtime_error("No candidate file given!");
+}
+
+
+void DiffKernel::addSwitches()
+{
+    namespace po = boost::program_options;
+
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("source", po::value<std::string>(&m_sourceFile), "source file name")
+        ("candidate", po::value<std::string>(&m_candidateFile),
+            "candidate file name")
+    ;
+
+    addSwitchSet(file_options);
+    po::options_description* processing_options =
+        new po::options_description("processing options");
+
+    processing_options->add_options();
+
+    addSwitchSet(processing_options);
+
+    addPositionalSwitch("source", 1);
+    addPositionalSwitch("candidate", 2);
+}
+
+
+void DiffKernel::checkPoints(const PointView& source_data,
+    const PointView& candidate_data, ptree& errors)
+{
+    uint32_t MAX_BADBYTES(20);
+    uint32_t badbytes(0);
+
+    // Both schemas have already been determined to be equal, so are the
+    // same size and in the same order.
+    Dimension::IdList const& sourceDims = source_data.dims();
+    Dimension::IdList const& candidateDims = candidate_data.dims();
+
+    char sbuf[8];
+    char cbuf[8];
+    for (PointId idx = 0; idx < source_data.size(); ++idx)
+    {
+        for (size_t d = 0; d < sourceDims.size(); ++d)
+        {
+            Dimension::Id::Enum sd = sourceDims[d];
+            Dimension::Id::Enum cd = candidateDims[d];
+
+            source_data.getRawField(sd, idx, (void *)sbuf);
+            candidate_data.getRawField(cd, idx, (void *)cbuf);
+            Dimension::Type::Enum t = Dimension::defaultType(cd);
+            size_t size = Dimension::size(t);
+            if (memcmp(sbuf, cbuf, size))
+            {
+                std::ostringstream oss;
+
+                oss << "Point " << idx << " differs for dimension \"" <<
+                    Dimension::name(sd) << "\" for source and candidate";
+                errors.put<std::string>("data.error", oss.str());
+                badbytes++;
+            }
+        }
+        if (badbytes > MAX_BADBYTES )
+            break;
+    }
+}
+
+
+int DiffKernel::execute()
+{
+    PointTable sourceTable;
+
+    Options sourceOptions;
+    sourceOptions.add<std::string>("filename", m_sourceFile);
+    sourceOptions.add<bool>("debug", isDebug());
+    sourceOptions.add<uint32_t>("verbose", getVerboseLevel());
+
+    Stage& source = makeReader(m_sourceFile);
+    source.setOptions(sourceOptions);
+    source.prepare(sourceTable);
+    PointViewSet sourceSet = source.execute(sourceTable);
+
+    ptree errors;
+
+    PointTable candidateTable;
+    Options candidateOptions;
+    candidateOptions.add<std::string>("filename", m_candidateFile);
+    candidateOptions.add<bool>("debug", isDebug());
+    candidateOptions.add<uint32_t>("verbose", getVerboseLevel());
+
+    Stage& candidate = makeReader(m_candidateFile);
+    candidate.setOptions(candidateOptions);
+    candidate.prepare(candidateTable);
+    PointViewSet candidateSet = candidate.execute(candidateTable);
+
+    assert(sourceSet.size() == 1);
+    assert(candidateSet.size() == 1);
+    PointViewPtr sourceView = *sourceSet.begin();
+    PointViewPtr candidateView = *candidateSet.begin();
+    if (candidateView->size() != sourceView->size())
+    {
+        std::ostringstream oss;
+
+        oss << "Source and candidate files do not have the same point count";
+        errors.put("count.error", oss.str());
+        errors.put("count.candidate", candidateView->size());
+        errors.put("count.source", sourceView->size());
+    }
+
+    MetadataNode source_metadata = sourceTable.metadata();
+    MetadataNode candidate_metadata = candidateTable.metadata();
+    if (source_metadata != candidate_metadata)
+    {
+        std::ostringstream oss;
+
+        oss << "Source and candidate files do not have the same metadata count";
+        errors.put("metadata.error", oss.str());
+        errors.put_child("metadata.source", Utils::toPTree(source_metadata));
+        errors.put_child("metadata.candidate",
+            Utils::toPTree(candidate_metadata));
+    }
+
+    if (candidateTable.layout()->dims().size() !=
+        sourceTable.layout()->dims().size())
+    {
+        std::ostringstream oss;
+
+        oss << "Source and candidate files do not have the same "
+            "number of dimensions";
+        errors.put<std::string>("schema.error", oss.str());
+        //Need to "ptree" the PointTable dimension list in some way
+        // errors.put_child("schema.source", sourceTable.schema()->toPTree());
+        // errors.put_child("schema.candidate",
+        //     candidateTable.schema()->toPTree());
+    }
+
+    if (errors.size())
+    {
+        write_json(std::cout, errors);
+        return 1;
+    }
+    else
+    {
+        // If we made it this far with no errors, now we'll
+        // check the points.
+        checkPoints(*sourceView, *candidateView, errors);
+        if (errors.size())
+        {
+            write_json(std::cout, errors);
+            return 1;
+        }
+    }
+    return 0;
+}
+
+} // namespace pdal
+
diff --git a/kernels/diff/DiffKernel.hpp b/kernels/diff/DiffKernel.hpp
new file mode 100644
index 0000000..f2e55c7
--- /dev/null
+++ b/kernels/diff/DiffKernel.hpp
@@ -0,0 +1,72 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include <boost/property_tree/ptree.hpp>
+
+extern "C" int32_t DiffKernel_ExitFunc();
+extern "C" PF_ExitFunc DiffKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PointView;
+
+class PDAL_DLL DiffKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute(); // overrride
+
+
+private:
+    void addSwitches(); // overrride
+    void validateSwitches(); // overrride
+
+    void checkPoints(const PointView& source_data,
+        const PointView& candidate_data,
+        boost::property_tree::ptree& errors);
+    std::string m_sourceFile;
+    std::string m_candidateFile;
+};
+
+} // namespace pdal
+
diff --git a/kernels/info/CMakeLists.txt b/kernels/info/CMakeLists.txt
new file mode 100644
index 0000000..a40b34a
--- /dev/null
+++ b/kernels/info/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Info kernel CMake configuration
+#
+
+#
+# Info Kernel
+#
+set(srcs
+    InfoKernel.cpp
+)
+
+set(incs
+    InfoKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel info "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/info/InfoKernel.cpp b/kernels/info/InfoKernel.cpp
new file mode 100644
index 0000000..78d6568
--- /dev/null
+++ b/kernels/info/InfoKernel.cpp
@@ -0,0 +1,472 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "InfoKernel.hpp"
+
+#include <algorithm>
+
+#include <pdal/KDIndex.hpp>
+#include <pdal/PipelineWriter.hpp>
+#include <pdal/PDALUtils.hpp>
+#include <pdal/pdal_config.hpp>
+#ifdef PDAL_HAVE_LIBXML2
+#include <pdal/XMLSchema.hpp>
+#endif
+
+#include <boost/program_options.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.info",
+    "Info Kernel",
+    "http://pdal.io/kernels/kernels.info.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, InfoKernel, Kernel, s_info)
+
+std::string InfoKernel::getName() const { return s_info.name; }
+
+InfoKernel::InfoKernel()
+    : m_showStats(false)
+    , m_showSchema(false)
+    , m_showAll(false)
+    , m_showMetadata(false)
+    , m_boundary(false)
+    , m_showSummary(false)
+    , m_needPoints(false)
+    , m_statsStage(NULL)
+{}
+
+
+void InfoKernel::validateSwitches()
+{
+    int functions = 0;
+
+    if (!m_usestdin && m_inputFile.empty())
+        throw pdal_error("No input file specified.");
+
+    // All isn't really all.
+    if (m_showAll)
+    {
+        m_showStats = true;
+        m_showMetadata = true;
+        m_showSchema = true;
+    }
+
+    if (m_boundary)
+    {
+        functions++;
+        m_needPoints = true;
+    }
+    if (m_queryPoint.size())
+    {
+        functions++;
+        m_needPoints = true;
+    }
+    if (m_pointIndexes.size())
+    {
+        functions++;
+        m_needPoints = true;
+    }
+    if (m_showSchema)
+        functions++;
+    if (m_showMetadata)
+        functions++;
+    if (m_showSummary)
+        functions++;
+    if (m_showStats || functions == 0 )
+    {
+        functions++;
+        m_showStats = true;
+        m_needPoints = true;
+    }
+
+    if (m_pointIndexes.size() && m_queryPoint.size())
+        throw pdal_error("--point option incompatible with --query option.");
+
+    if (m_showSummary && functions > 1)
+        throw pdal_error("--summary option incompatible with other "
+            "specified options.");
+}
+
+
+void InfoKernel::addSwitches()
+{
+    namespace po = boost::program_options;
+
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+         "input file name")
+        ;
+
+    addSwitchSet(file_options);
+
+    po::options_description* processing_options =
+        new po::options_description("processing options");
+
+    processing_options->add_options()
+        ("all",
+         po::value<bool>(&m_showAll)->zero_tokens()->implicit_value(true),
+         "dump the schema")
+        ("point,p", po::value<std::string >(&m_pointIndexes), "point to dump")
+        ("query", po::value< std::string>(&m_queryPoint),
+         "Return points in order of distance from the specified "
+         "location (2D or 3D)\n"
+         "--query Xcoord,Ycoord[,Zcoord][/count]")
+        ("stats",
+         po::value<bool>(&m_showStats)->zero_tokens()->implicit_value(true),
+         "dump stats on all points (reads entire dataset)")
+        ("boundary",
+         po::value<bool>(&m_boundary)->zero_tokens()->implicit_value(true),
+         "compute a hexagonal hull/boundary of dataset")
+        ("dimensions", po::value<std::string >(&m_dimensions),
+         "dimensions on which to compute statistics")
+        ("schema",
+         po::value<bool>(&m_showSchema)->zero_tokens()->implicit_value(true),
+         "dump the schema")
+        ("pipeline-serialization",
+         po::value<std::string>(&m_pipelineFile)->default_value(""), "")
+        ("summary",
+         po::value<bool>(&m_showSummary)->zero_tokens()->implicit_value(true),
+        "dump summary of the info")
+        ("metadata",
+         po::value<bool>(&m_showMetadata)->zero_tokens()->implicit_value(true),
+        "dump file metadata info")
+        ;
+
+    po::options_description* hidden =
+        new po::options_description("Hidden options");
+    hidden->add_options()
+        ("pointcloudschema",
+         po::value<std::string>(&m_PointCloudSchemaOutput),
+        "dump PointCloudSchema XML output")
+            ;
+
+    addSwitchSet(processing_options);
+    addHiddenSwitchSet(hidden);
+    addPositionalSwitch("input", 1);
+}
+
+// Support for parsing point numbers.  Points can be specified singly or as
+// dash-separated ranges.  i.e. 6-7,8,19-20
+namespace {
+
+using namespace std;
+
+uint32_t parseInt(const string& s)
+{
+    try
+    {
+        return boost::lexical_cast<uint32_t>(s);
+    }
+    catch (boost::bad_lexical_cast)
+    {
+        throw app_runtime_error(string("Invalid integer: ") + s);
+    }
+}
+
+
+void addRange(const string& begin, const string& end, vector<PointId>& points)
+{
+    PointId low = parseInt(begin);
+    PointId high = parseInt(end);
+    if (low > high)
+        throw app_runtime_error(string("Range invalid: ") + begin + "-" + end);
+    while (low <= high)
+        points.push_back(low++);
+}
+
+
+vector<PointId> getListOfPoints(std::string p)
+{
+    vector<PointId> output;
+
+    //Remove whitespace from string with awful remove/erase idiom.
+    p.erase(remove_if(p.begin(), p.end(), ::isspace), p.end());
+
+    vector<string> ranges = Utils::split2(p, ',');
+    for (string s : ranges)
+    {
+        vector<string> limits = Utils::split(s, '-');
+        if (limits.size() == 1)
+            output.push_back(parseInt(limits[0]));
+        else if (limits.size() == 2)
+            addRange(limits[0], limits[1], output);
+        else
+            throw app_runtime_error(string("Invalid point range: ") + s);
+    }
+    return output;
+}
+
+} //namespace
+
+MetadataNode InfoKernel::dumpPoints(PointViewPtr inView) const
+{
+    MetadataNode root;
+    PointViewPtr outView = inView->makeNew();
+
+    // Stick points in a inViewfer.
+    std::vector<PointId> points = getListOfPoints(m_pointIndexes);
+    for (size_t i = 0; i < points.size(); ++i)
+    {
+        PointId id = (PointId)points[i];
+        if (id < inView->size())
+            outView->appendPoint(*inView.get(), id);
+    }
+
+    MetadataNode tree = Utils::toMetadata(outView);
+    std::string prefix("point ");
+    for (size_t i = 0; i < outView->size(); ++i)
+    {
+        MetadataNode n = tree.findChild(std::to_string(i));
+        n.add("PointId", points[i]);
+        root.add(n.clone("point"));
+    }
+    return root;
+}
+
+
+MetadataNode InfoKernel::dumpSummary(const QuickInfo& qi)
+{
+    MetadataNode summary;
+    summary.add("num_points", qi.m_pointCount);
+    summary.add("spatial_reference", qi.m_srs.getWKT());
+    MetadataNode bounds = summary.add("bounds");
+    MetadataNode x = bounds.add("X");
+    x.add("min", qi.m_bounds.minx);
+    x.add("max", qi.m_bounds.maxx);
+    MetadataNode y = bounds.add("Y");
+    y.add("min", qi.m_bounds.miny);
+    y.add("max", qi.m_bounds.maxy);
+    MetadataNode z = bounds.add("Z");
+    z.add("min", qi.m_bounds.minz);
+    z.add("max", qi.m_bounds.maxz);
+
+    std::string dims;
+    auto di = qi.m_dimNames.begin();
+    while (di != qi.m_dimNames.end())
+    {
+        dims += *di;
+        ++di;
+        if (di != qi.m_dimNames.end())
+           dims += ", ";
+    }
+    summary.add("dimensions", dims);
+    return summary;
+}
+
+
+void InfoKernel::setup(const std::string& filename)
+{
+    Options readerOptions;
+
+    readerOptions.add("filename", filename);
+    if (!m_needPoints)
+        readerOptions.add("count", 0);
+
+    m_manager = std::unique_ptr<PipelineManager>(
+        KernelSupport::makePipeline(filename));
+    m_reader = m_manager->getStage();
+    Stage *stage = m_reader;
+
+    if (m_dimensions.size())
+        m_options.add("dimensions", m_dimensions, "List of dimensions");
+
+    Options options = m_options + readerOptions;
+    m_reader->setOptions(options);
+
+    if (m_showStats)
+    {
+        m_statsStage = &(m_manager->addFilter("filters.stats"));
+        m_statsStage->setOptions(options);
+        m_statsStage->setInput(*stage);
+        stage = m_statsStage;
+    }
+    if (m_boundary)
+    {
+        m_hexbinStage = &(m_manager->addFilter("filters.hexbin"));
+        m_hexbinStage->setOptions(options);
+        m_hexbinStage->setInput(*stage);
+        stage = m_hexbinStage;
+        Options readerOptions;
+    }
+}
+
+
+MetadataNode InfoKernel::run(const std::string& filename)
+{
+    MetadataNode root;
+
+    root.add("filename", filename);
+    if (m_showSummary)
+    {
+        QuickInfo qi = m_reader->preview();
+        MetadataNode summary = dumpSummary(qi).clone("summary");
+        root.add(summary);
+    }
+    else
+    {
+        applyExtraStageOptionsRecursive(m_manager->getStage());
+        if (m_needPoints || m_showMetadata)
+            m_manager->execute();
+        else
+            m_manager->prepare();
+        dump(root);
+    }
+    root.add("pdal_version", pdal::GetFullVersionString());
+    return root;
+}
+
+
+void InfoKernel::dump(MetadataNode& root)
+{
+    if (m_showSchema)
+        root.add(Utils::toMetadata(m_manager->pointTable()).clone("schema"));
+
+    if (m_PointCloudSchemaOutput.size() > 0)
+    {
+#ifdef PDAL_HAVE_LIBXML2
+        XMLSchema schema(m_manager->pointTable().layout());
+
+        std::ostream *out = FileUtils::createFile(m_PointCloudSchemaOutput);
+        std::string xml(schema.xml());
+        out->write(xml.c_str(), xml.size());
+        FileUtils::closeFile(out);
+#else
+        std::cerr << "libxml2 support not enabled, no schema is produced" <<
+            std::endl;
+#endif
+
+    }
+    if (m_showStats)
+        root.add(m_statsStage->getMetadata().clone("stats"));
+
+    if (m_pipelineFile.size() > 0)
+        PipelineWriter(*m_manager).writePipeline(m_pipelineFile);
+
+    if (m_pointIndexes.size())
+    {
+        PointViewSet viewSet = m_manager->views();
+        assert(viewSet.size() == 1);
+        root.add(dumpPoints(*viewSet.begin()).clone("points"));
+    }
+    if (m_queryPoint.size())
+    {
+        PointViewSet viewSet = m_manager->views();
+        assert(viewSet.size() == 1);
+        root.add(dumpQuery(*viewSet.begin()));
+    }
+    if (m_showMetadata)
+        root.add(m_reader->getMetadata().clone("metadata"));
+    if (m_boundary)
+    {
+        PointViewSet viewSet = m_manager->views();
+        assert(viewSet.size() == 1);
+        root.add(m_hexbinStage->getMetadata().clone("boundary"));
+    }
+}
+
+
+MetadataNode InfoKernel::dumpQuery(PointViewPtr inView) const
+{
+    int count;
+    std::string location;
+
+    // See if there's a provided point count.
+    StringList parts = Utils::split2(m_queryPoint, '/');
+    if (parts.size() == 2)
+    {
+        location = parts[0];
+        count = atoi(parts[1].c_str());
+    }
+    else if (parts.size() == 1)
+    {
+        location = parts[0];
+        count = inView->size();
+    }
+    else
+        count = 0;
+    if (count == 0)
+        throw pdal_error("Invalid location specificiation. "
+            "--query=\"X,Y[/count]\"");
+
+    auto seps = [](char c){ return (c == ',' || c == '|' || c == ' '); };
+
+    std::vector<std::string> tokens = Utils::split2(location, seps);
+    std::vector<double> values;
+    for (auto ti = tokens.begin(); ti != tokens.end(); ++ti)
+        values.push_back(boost::lexical_cast<double>(*ti));
+
+    if (values.size() != 2 && values.size() != 3)
+        throw app_runtime_error("--points must be two or three values");
+
+    PointViewPtr outView = inView->makeNew();
+
+    std::vector<PointId> ids;
+    if (values.size() >= 3)
+    {
+        KD3Index kdi(*inView);
+        kdi.build();
+        ids = kdi.neighbors(values[0], values[1], values[2], count);
+    }
+    else
+    {
+        KD2Index kdi(*inView);
+        kdi.build();
+        ids = kdi.neighbors(values[0], values[1], count);
+    }
+
+    for (auto i = ids.begin(); i != ids.end(); ++i)
+        outView->appendPoint(*inView.get(), *i);
+
+    return Utils::toMetadata(outView);
+}
+
+
+int InfoKernel::execute()
+{
+    std::string filename = m_usestdin ? std::string("STDIN") : m_inputFile;
+    setup(filename);
+    MetadataNode root = run(filename);
+    Utils::toJSON(root, std::cout);
+
+    return 0;
+}
+
+
+} // namespace pdal
diff --git a/kernels/info/InfoKernel.hpp b/kernels/info/InfoKernel.hpp
new file mode 100644
index 0000000..b992520
--- /dev/null
+++ b/kernels/info/InfoKernel.hpp
@@ -0,0 +1,110 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#ifdef __clang__
+#pragma GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare"
+#endif
+
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/tokenizer.hpp>
+
+typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+
+extern "C" int32_t InfoKernel_ExitFunc();
+extern "C" PF_ExitFunc InfoKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL InfoKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute(); // overrride
+
+
+    void setup(const std::string& filename);
+    MetadataNode run(const std::string& filename);
+
+    inline bool showAll() { return m_showAll; }
+    inline void doShowAll(bool value) { m_showAll = value; }
+    inline void doComputeSummary(bool value) { m_showSummary = value; }
+    inline void doComputeBoundary(bool value) { m_boundary = value; }
+
+private:
+    InfoKernel();
+    void addSwitches(); // overrride
+    void validateSwitches(); // overrride
+
+    void dump(MetadataNode& root);
+    MetadataNode dumpPoints(PointViewPtr inView) const;
+    MetadataNode dumpStats() const;
+    void dumpPipeline() const;
+    MetadataNode dumpSummary(const QuickInfo& qi);
+    MetadataNode dumpQuery(PointViewPtr inView) const;
+
+    std::string m_inputFile;
+    bool m_showStats;
+    bool m_showSchema;
+    bool m_showAll;
+    bool m_showMetadata;
+    bool m_boundary;
+    pdal::Options m_options;
+    std::string m_pointIndexes;
+    std::string m_dimensions;
+    std::string m_queryPoint;
+    std::string m_pipelineFile;
+    bool m_showSummary;
+    bool m_needPoints;
+    std::string m_PointCloudSchemaOutput;
+
+    Stage *m_statsStage;
+    Stage *m_hexbinStage;
+    Stage *m_reader;
+
+    MetadataNode m_tree;
+    std::unique_ptr<PipelineManager> m_manager;
+};
+
+} // namespace pdal
diff --git a/kernels/merge/CMakeLists.txt b/kernels/merge/CMakeLists.txt
new file mode 100644
index 0000000..b48f257
--- /dev/null
+++ b/kernels/merge/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Merge kernel CMake configuration
+#
+
+#
+# Merge Kernel
+#
+set(srcs
+    MergeKernel.cpp
+)
+
+set(incs
+    MergeKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel merge "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/merge/MergeKernel.cpp b/kernels/merge/MergeKernel.cpp
new file mode 100644
index 0000000..7cf1545
--- /dev/null
+++ b/kernels/merge/MergeKernel.cpp
@@ -0,0 +1,114 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "MergeKernel.hpp"
+
+#include <merge/MergeFilter.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <boost/program_options.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.merge",
+    "Merge Kernel",
+    "http://pdal.io/kernels/kernels.merge.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, MergeKernel, Kernel, s_info)
+
+std::string MergeKernel::getName() const
+{
+    return s_info.name;
+}
+
+
+void MergeKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("files,f", po::value<StringList>(&m_files)->multitoken(),
+         "input/output files")
+        ;
+
+    addSwitchSet(file_options);
+    addPositionalSwitch("files", 10000);
+}
+
+
+void MergeKernel::validateSwitches()
+{
+    if (m_files.size() < 2)
+        throw pdal_error("Must specify an input and output file.");
+    m_outputFile = m_files.back();
+    m_files.resize(m_files.size() - 1);
+}
+
+
+int MergeKernel::execute()
+{
+    PointTable table;
+
+    MergeFilter filter;
+
+    std::vector<std::unique_ptr<Stage>> m_readers;
+    for (size_t i = 0; i < m_files.size(); ++i)
+    {
+        Options readerOpts;
+        readerOpts.add("filename", m_files[i]);
+        readerOpts.add("debug", isDebug());
+        readerOpts.add("verbose", getVerboseLevel());
+
+        Stage& reader = makeReader(m_files[i]);
+        reader.setOptions(readerOpts);
+
+        filter.setInput(reader);
+    }
+
+    Options writerOpts;
+
+    Stage& writer = makeWriter(m_outputFile, filter);
+    applyExtraStageOptionsRecursive(&writer);
+
+    writer.prepare(table);
+    writer.execute(table);
+    return 0;
+}
+
+} // namespace pdal
+
diff --git a/kernels/merge/MergeKernel.hpp b/kernels/merge/MergeKernel.hpp
new file mode 100644
index 0000000..0428eb6
--- /dev/null
+++ b/kernels/merge/MergeKernel.hpp
@@ -0,0 +1,62 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/plugin.hpp>
+
+extern "C" int32_t MergeKernel_ExitFunc();
+extern "C" PF_ExitFunc MergeKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL MergeKernel : public Kernel
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    void addSwitches();
+    void validateSwitches();
+
+    StringList m_files;
+    std::string m_outputFile;
+};
+
+} // namespace pdal
diff --git a/kernels/pipeline/CMakeLists.txt b/kernels/pipeline/CMakeLists.txt
new file mode 100644
index 0000000..0297059
--- /dev/null
+++ b/kernels/pipeline/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Pipeline kernel CMake configuration
+#
+
+#
+# Pipeline Kernel
+#
+set(srcs
+    PipelineKernel.cpp
+)
+
+set(incs
+    PipelineKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel pipeline "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/pipeline/PipelineKernel.cpp b/kernels/pipeline/PipelineKernel.cpp
new file mode 100644
index 0000000..b5eaf89
--- /dev/null
+++ b/kernels/pipeline/PipelineKernel.cpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PipelineKernel.hpp"
+
+#ifdef PDAL_HAVE_LIBXML2
+#include <pdal/XMLSchema.hpp>
+#endif
+
+#include <boost/program_options.hpp>
+
+#include <pdal/PDALUtils.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.pipeline",
+    "Pipeline Kernel",
+    "http://pdal.io/kernels/kernels.pipeline.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, PipelineKernel, Kernel, s_info)
+
+std::string PipelineKernel::getName() const { return s_info.name; }
+
+PipelineKernel::PipelineKernel() : m_validate(false), m_progressFd(-1)
+{}
+
+
+void PipelineKernel::validateSwitches()
+{
+    if (m_usestdin)
+        m_inputFile = "STDIN";
+
+    if (m_inputFile.empty())
+        throw app_usage_error("input file name required");
+}
+
+
+void PipelineKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+            "input file name")
+        ("pipeline-serialization",
+            po::value<std::string>(&m_pipelineFile)->default_value(""), "")
+        ("validate",
+            po::value<bool>(&m_validate)->zero_tokens()->implicit_value(true),
+            "Validate the pipeline (including serialization), but do not "
+            "execute writing of points")
+        ("progress", po::value<std::string>(&m_progressFile),
+            "Name of file or FIFO to which stages should write progress "
+            "information.  The file/FIFO must exist.  PDAL will not create "
+            "the progress file.")
+        ;
+
+    addSwitchSet(file_options);
+    addPositionalSwitch("input", 1);
+
+    po::options_description* hidden =
+        new po::options_description("Hidden options");
+    hidden->add_options()
+        ("pointcloudschema",
+         po::value<std::string>(&m_PointCloudSchemaOutput),
+        "dump PointCloudSchema XML output")
+            ;
+
+    addHiddenSwitchSet(hidden);
+}
+
+int PipelineKernel::execute()
+{
+    if (!FileUtils::fileExists(m_inputFile))
+        throw app_runtime_error("file not found: " + m_inputFile);
+    if (m_progressFile.size())
+        m_progressFd = Utils::openProgress(m_progressFile);
+
+    pdal::PipelineManager manager(m_progressFd);
+
+    pdal::PipelineReader reader(manager, isDebug(), getVerboseLevel());
+    bool isWriter = reader.readPipeline(m_inputFile);
+    if (!isWriter)
+        throw app_runtime_error("Pipeline file does not contain a writer. "
+            "Use 'pdal info' to read the data.");
+
+    applyExtraStageOptionsRecursive(manager.getStage());
+    manager.execute();
+    if (m_pipelineFile.size() > 0)
+    {
+        pdal::PipelineWriter writer(manager);
+        writer.writePipeline(m_pipelineFile);
+    }
+    if (m_PointCloudSchemaOutput.size() > 0)
+    {
+#ifdef PDAL_HAVE_LIBXML2
+        XMLSchema schema(manager.pointTable().layout());
+        
+        std::ostream *out = FileUtils::createFile(m_PointCloudSchemaOutput);
+        std::string xml(schema.xml());
+        out->write(xml.c_str(), xml.size());
+        FileUtils::closeFile(out);
+#else
+        std::cerr << "libxml2 support not available, no schema is produced" <<
+            std::endl;
+#endif
+
+    }
+    Utils::closeProgress(m_progressFd);
+    return 0;
+}
+
+} // pdal
diff --git a/kernels/pipeline/PipelineKernel.hpp b/kernels/pipeline/PipelineKernel.hpp
new file mode 100644
index 0000000..3ad5165
--- /dev/null
+++ b/kernels/pipeline/PipelineKernel.hpp
@@ -0,0 +1,70 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineWriter.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+extern "C" int32_t PipelineKernel_ExitFunc();
+extern "C" PF_ExitFunc PipelineKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL PipelineKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    PipelineKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    std::string m_inputFile;
+    std::string m_pipelineFile;
+    bool m_validate;
+    std::string m_PointCloudSchemaOutput;
+    std::string m_progressFile;
+    int m_progressFd;
+};
+
+} // pdal
diff --git a/kernels/random/CMakeLists.txt b/kernels/random/CMakeLists.txt
new file mode 100644
index 0000000..c240b3c
--- /dev/null
+++ b/kernels/random/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Random kernel CMake configuration
+#
+
+#
+# Random Kernel
+#
+set(srcs
+    RandomKernel.cpp
+)
+
+set(incs
+    RandomKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel random "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/random/RandomKernel.cpp b/kernels/random/RandomKernel.cpp
new file mode 100644
index 0000000..730856f
--- /dev/null
+++ b/kernels/random/RandomKernel.cpp
@@ -0,0 +1,191 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "RandomKernel.hpp"
+
+#include <boost/program_options.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.random",
+    "Random Kernel",
+    "http://pdal.io/kernels/kernels.random.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, RandomKernel, Kernel, s_info)
+
+std::string RandomKernel::getName() const { return s_info.name; }
+
+RandomKernel::RandomKernel()
+    : m_bCompress(false)
+    , m_numPointsToWrite(0)
+    , m_distribution("uniform")
+{
+}
+
+
+void RandomKernel::validateSwitches()
+{
+    if (m_outputFile == "")
+        throw app_usage_error("--output/-o required");
+}
+
+
+void RandomKernel::addSwitches()
+{
+    po::options_description* file_options = new po::options_description("file options");
+
+    file_options->add_options()
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""), "output file name")
+    ("compress,z", po::value<bool>(&m_bCompress)->zero_tokens()->implicit_value(true), "Compress output data (if supported by output format)")
+    ("count", po::value<uint64_t>(&m_numPointsToWrite)->default_value(0), "How many points should we write?")
+    ("bounds", po::value<BOX3D>(&m_bounds), "Extent (in XYZ to clip output to)")
+    ("mean", po::value< std::string >(&m_means), "A comma-separated or quoted, space-separated list of means (normal mode): \n--mean 0.0,0.0,0.0\n--mean \"0.0 0.0 0.0\"")
+    ("stdev", po::value< std::string >(&m_stdevs), "A comma-separated or quoted, space-separated list of standard deviations (normal mode): \n--stdev 0.0,0.0,0.0\n--stdev \"0.0 0.0 0.0\"")
+    ("distribution", po::value<std::string>(&m_distribution)->default_value("uniform"), "Distribution (uniform / normal)")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("output", 1);
+}
+
+
+Stage& RandomKernel::makeReader(Options readerOptions)
+{
+    if (isDebug())
+    {
+        readerOptions.add<bool>("debug", true);
+        uint32_t verbosity(getVerboseLevel());
+        if (!verbosity)
+            verbosity = 1;
+
+        readerOptions.add<uint32_t>("verbose", verbosity);
+        readerOptions.add<std::string>("log", "STDERR");
+    }
+
+    StageFactory factory;
+    Stage& readerStage = ownStage(factory.createStage("readers.faux"));
+    readerStage.setOptions(readerOptions);
+
+    return readerStage;
+}
+
+
+int RandomKernel::execute()
+{
+    Options readerOptions;
+    {
+        boost::char_separator<char> sep(SEPARATORS);
+        std::vector<double> means;
+        tokenizer mean_tokens(m_means, sep);
+        for (tokenizer::iterator t = mean_tokens.begin();
+            t != mean_tokens.end(); ++t)
+        {
+            means.push_back(boost::lexical_cast<double>(*t));
+        }
+
+        if (means.size())
+        {
+            readerOptions.add<double >("mean_x", means[0]);
+            readerOptions.add<double >("mean_y", means[1]);
+            readerOptions.add<double >("mean_z", means[2]);
+        }
+
+        std::vector<double> stdevs;
+        tokenizer stdev_tokens(m_stdevs, sep);
+        for (tokenizer::iterator t = stdev_tokens.begin();
+            t != stdev_tokens.end(); ++t)
+        {
+            stdevs.push_back(boost::lexical_cast<double>(*t));
+        }
+
+        if (stdevs.size())
+        {
+            readerOptions.add<double >("stdev_x", stdevs[0]);
+            readerOptions.add<double >("stdev_y", stdevs[1]);
+            readerOptions.add<double >("stdev_z", stdevs[2]);
+        }
+
+        if (!m_bounds.empty())
+            readerOptions.add<BOX3D >("bounds", m_bounds);
+
+        if (boost::iequals(m_distribution, "uniform"))
+            readerOptions.add<std::string>("mode", "uniform");
+        else if (boost::iequals(m_distribution, "normal"))
+            readerOptions.add<std::string>("mode", "normal");
+        else if (boost::iequals(m_distribution, "random"))
+            readerOptions.add<std::string>("mode", "random");
+        else
+            throw pdal_error("invalid distribution: " + m_distribution);
+        readerOptions.add<int>("num_points", m_numPointsToWrite);
+        readerOptions.add<bool>("debug", isDebug());
+        readerOptions.add<uint32_t>("verbose", getVerboseLevel());
+    }
+
+    Options writerOptions;
+    {
+        writerOptions.add<std::string>("filename", m_outputFile);
+        setCommonOptions(writerOptions);
+
+        if (m_bCompress)
+        {
+            writerOptions.add<bool>("compression", true);
+        }
+    }
+
+    Stage& writer = makeWriter(m_outputFile, makeReader(readerOptions));
+    writer.setOptions(writerOptions);
+
+    PointTable table;
+
+    UserCallback* callback;
+    if (!getProgressShellCommand().size())
+        callback = static_cast<UserCallback*>(new PercentageCallback);
+    else
+        callback = static_cast<UserCallback*>(
+            new ShellScriptCallback(getProgressShellCommand()));
+    writer.setUserCallback(callback);
+    writer.prepare(table);
+    PointViewSet viewSet = writer.execute(table);
+
+    if (isVisualize())
+        visualize(*viewSet.begin());
+
+    return 0;
+}
+
+} // pdal
+
diff --git a/kernels/random/RandomKernel.hpp b/kernels/random/RandomKernel.hpp
new file mode 100644
index 0000000..0683328
--- /dev/null
+++ b/kernels/random/RandomKernel.hpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+
+#define SEPARATORS ",| "
+
+#include <boost/tokenizer.hpp>
+typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+
+extern "C" int32_t RandomKernel_ExitFunc();
+extern "C" PF_ExitFunc RandomKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL RandomKernel : public Kernel
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+
+    std::string getName() const;
+    int execute();
+
+private:
+    RandomKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    Stage& makeReader(Options readerOptions);
+
+    std::string m_outputFile;
+    bool m_bCompress;
+    uint64_t m_numPointsToWrite;
+    BOX3D m_bounds;
+    std::string m_distribution;
+    std::string m_means;
+    std::string m_stdevs;
+};
+
+} // pdal
diff --git a/kernels/sort/CMakeLists.txt b/kernels/sort/CMakeLists.txt
new file mode 100644
index 0000000..9c5ed71
--- /dev/null
+++ b/kernels/sort/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Sort kernel CMake configuration
+#
+
+#
+# Sort Kernel
+#
+set(srcs
+    SortKernel.cpp
+)
+
+set(incs
+    SortKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel sort "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/sort/SortKernel.cpp b/kernels/sort/SortKernel.cpp
new file mode 100644
index 0000000..0a5c3a4
--- /dev/null
+++ b/kernels/sort/SortKernel.cpp
@@ -0,0 +1,184 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SortKernel.hpp"
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <boost/program_options.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.sort",
+    "Sort Kernel",
+    "http://pdal.io/kernels/kernels.sort.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SortKernel, Kernel, s_info)
+
+std::string SortKernel::getName() const
+{
+    return s_info.name;
+}
+
+
+SortKernel::SortKernel() : m_bCompress(false), m_bForwardMetadata(false)
+{}
+
+
+void SortKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+        throw app_usage_error("--input/-i required");
+    if (m_outputFile == "")
+        throw app_usage_error("--output/-o required");
+}
+
+
+void SortKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+     "input file name")
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""),
+     "output file name")
+    ("compress,z",
+     po::value<bool>(&m_bCompress)->zero_tokens()->implicit_value(true),
+     "Compress output data (if supported by output format)")
+    ("metadata,m",
+     po::value< bool >(&m_bForwardMetadata)->implicit_value(true),
+     "Forward metadata (VLRs, header entries, etc) from previous stages")
+    ;
+
+    addSwitchSet(file_options);
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+}
+
+
+Stage& SortKernel::makeReader(Options readerOptions)
+{
+    if (isDebug())
+    {
+        readerOptions.add<bool>("debug", true);
+        uint32_t verbosity(getVerboseLevel());
+        if (!verbosity)
+            verbosity = 1;
+
+        readerOptions.add<uint32_t>("verbose", verbosity);
+        readerOptions.add<std::string>("log", "STDERR");
+    }
+
+    Stage& stage = Kernel::makeReader(m_inputFile);
+    stage.setOptions(readerOptions);
+
+    return stage;
+}
+
+
+int SortKernel::execute()
+{
+    PointTable table;
+
+    Options readerOptions;
+    readerOptions.add("filename", m_inputFile);
+    readerOptions.add("debug", isDebug());
+    readerOptions.add("verbose", getVerboseLevel());
+
+    Stage& readerStage = makeReader(readerOptions);
+
+    // go ahead and prepare/execute on reader stage only to grab input
+    // PointViewSet, this makes the input PointView available to both the
+    // processing pipeline and the visualizer
+    readerStage.prepare(table);
+    PointViewSet viewSetIn = readerStage.execute(table);
+
+    // the input PointViewSet will be used to populate a BufferReader that is
+    // consumed by the processing pipeline
+    PointViewPtr inView = *viewSetIn.begin();
+
+    BufferReader bufferReader;
+    bufferReader.setOptions(readerOptions);
+    bufferReader.addView(inView);
+
+    Options sortOptions;
+    sortOptions.add<bool>("debug", isDebug());
+    sortOptions.add<uint32_t>("verbose", getVerboseLevel());
+
+    StageFactory f;
+    Stage& sortStage = ownStage(f.createStage("filters.mortonorder"));
+    sortStage.setInput(bufferReader);
+    sortStage.setOptions(sortOptions);
+
+    Options writerOptions;
+    writerOptions.add("filename", m_outputFile);
+    setCommonOptions(writerOptions);
+
+    if (m_bCompress)
+        writerOptions.add("compression", true);
+    if (m_bForwardMetadata)
+        writerOptions.add("forward_metadata", true);
+
+    std::vector<std::string> cmd = getProgressShellCommand();
+    UserCallback *callback =
+        cmd.size() ? (UserCallback *)new ShellScriptCallback(cmd) :
+        (UserCallback *)new HeartbeatCallback();
+
+    Stage& writer = makeWriter(m_outputFile, sortStage);
+
+    // Some options are inferred by makeWriter based on filename
+    // (compression, driver type, etc).
+    writer.setOptions(writerOptions + writer.getOptions());
+    writer.setUserCallback(callback);
+
+    applyExtraStageOptionsRecursive(&writer);
+    writer.prepare(table);
+
+    // process the data, grabbing the PointViewSet for visualization of the
+    PointViewSet viewSetOut = writer.execute(table);
+
+    if (isVisualize())
+        visualize(*viewSetOut.begin());
+
+    return 0;
+}
+
+} // namespace pdal
+
diff --git a/kernels/sort/SortKernel.hpp b/kernels/sort/SortKernel.hpp
new file mode 100644
index 0000000..53a14a6
--- /dev/null
+++ b/kernels/sort/SortKernel.hpp
@@ -0,0 +1,66 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+
+extern "C" int32_t SortKernel_ExitFunc();
+extern "C" PF_ExitFunc SortKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SortKernel : public Kernel
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    SortKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    Stage& makeReader(Options readerOptions);
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+    bool m_bCompress;
+    bool m_bForwardMetadata;
+};
+
+} // namespace pdal
diff --git a/kernels/split/CMakeLists.txt b/kernels/split/CMakeLists.txt
new file mode 100644
index 0000000..f2b41b9
--- /dev/null
+++ b/kernels/split/CMakeLists.txt
@@ -0,0 +1,17 @@
+#
+# Split kernel CMake configuration
+#
+
+#
+# Split Kernel
+#
+set(srcs
+    SplitKernel.cpp
+)
+
+set(incs
+    SplitKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel split "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/split/SplitKernel.cpp b/kernels/split/SplitKernel.cpp
new file mode 100644
index 0000000..db8aaa7
--- /dev/null
+++ b/kernels/split/SplitKernel.cpp
@@ -0,0 +1,168 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SplitKernel.hpp"
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <boost/program_options.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.split",
+    "Split Kernel",
+    "http://pdal.io/kernels/kernels.split.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, SplitKernel, Kernel, s_info)
+
+std::string SplitKernel::getName() const
+{
+    return s_info.name;
+}
+
+    double m_length;
+    double m_xOrigin;
+    double m_yOrigin;
+
+void SplitKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("length", po::value<double>(&m_length)->default_value(0.0),
+         "Edge length for splitter cells")
+        ("capacity", po::value<uint32_t>(&m_capacity)->default_value(0),
+         "Point capacity of chipper cells")
+        ("origin_x", po::value<double>(&m_xOrigin)->default_value(std::numeric_limits<double>::quiet_NaN()),
+         "Origin in X axis for splitter cells")
+        ("origin_y", po::value<double>(&m_yOrigin)->default_value(std::numeric_limits<double>::quiet_NaN()),
+         "Origin in Y axis for splitter cells")
+        ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+         "input file name")
+        ("output,o", po::value<std::string>(&m_outputFile)->default_value(""),
+         "output file name")
+        ;
+
+    addSwitchSet(file_options);
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+}
+
+
+void SplitKernel::validateSwitches()
+{
+#ifdef WIN32
+    char pathSeparator = '\\';
+#else
+    char pathSeparator = '/';
+#endif
+    
+    if (m_length && m_capacity)
+        throw pdal_error("Can't specify for length and capacity.");
+    if (!m_length && !m_capacity)
+        m_capacity = 100000;
+    if (m_outputFile.back() == pathSeparator)
+        m_outputFile += m_inputFile;
+}
+
+
+namespace
+{
+std::string makeFilename(const std::string& s, int i)
+{
+    std::string out = s;
+    auto pos = out.find_last_of('.');
+    if (pos == out.npos)
+        pos = out.length();
+    out.insert(pos, std::string("_") + std::to_string(i));
+    return out;
+}
+}
+
+
+int SplitKernel::execute()
+{
+    PointTable table;
+
+    Options readerOpts;
+    readerOpts.add("filename", m_inputFile);
+    readerOpts.add("debug", isDebug());
+    readerOpts.add("verbose", getVerboseLevel());
+
+    Stage& reader = makeReader(m_inputFile);
+    reader.setOptions(readerOpts);
+
+    std::unique_ptr<Stage> f;
+    StageFactory factory;
+    Options filterOpts;
+    if (m_length)
+    {
+        f.reset(factory.createStage("filters.splitter"));
+        filterOpts.add("length", m_length);
+        filterOpts.add("origin_x", m_xOrigin);
+        filterOpts.add("origin_y", m_yOrigin);
+    }
+    else
+    {
+        f.reset(factory.createStage("filters.chipper"));
+        filterOpts.add("capacity", m_capacity);
+    }
+    f->setInput(reader);
+    f->setOptions(filterOpts);
+
+    f->prepare(table);
+    PointViewSet pvSet = f->execute(table);
+
+    int filenum = 1;
+    for (auto& pvp : pvSet)
+    {
+        BufferReader reader;
+        reader.addView(pvp);
+
+        std::string filename = makeFilename(m_outputFile, filenum++);
+        Stage& writer = makeWriter(filename, reader);
+
+        writer.prepare(table);
+        writer.execute(table);
+    }
+    return 0;
+}
+
+} // namespace pdal
+
diff --git a/kernels/split/SplitKernel.hpp b/kernels/split/SplitKernel.hpp
new file mode 100644
index 0000000..b60b870
--- /dev/null
+++ b/kernels/split/SplitKernel.hpp
@@ -0,0 +1,66 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/plugin.hpp>
+
+extern "C" int32_t SplitKernel_ExitFunc();
+extern "C" PF_ExitFunc SplitKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL SplitKernel : public Kernel
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    void addSwitches();
+    void validateSwitches();
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+    uint32_t m_capacity;
+    double m_length;
+    double m_xOrigin;
+    double m_yOrigin;
+};
+
+} // namespace pdal
diff --git a/kernels/tindex/CMakeLists.txt b/kernels/tindex/CMakeLists.txt
new file mode 100644
index 0000000..5e5dac4
--- /dev/null
+++ b/kernels/tindex/CMakeLists.txt
@@ -0,0 +1,18 @@
+#
+# TIndex kernel CMake configuration
+#
+
+#
+# TIndex Kernel
+#
+
+set(srcs
+    TIndexKernel.cpp
+)
+
+set(incs
+    TIndexKernel.hpp
+)
+
+PDAL_ADD_DRIVER(kernel tindex "${srcs}" "${incs}" objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/tindex/TIndexKernel.cpp b/kernels/tindex/TIndexKernel.cpp
new file mode 100644
index 0000000..716a740
--- /dev/null
+++ b/kernels/tindex/TIndexKernel.cpp
@@ -0,0 +1,778 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TIndexKernel.hpp"
+
+#ifndef WIN32
+#include <glob.h>
+#include <time.h>
+#endif
+
+#include <memory>
+#include <vector>
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/KernelFactory.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <merge/MergeFilter.hpp>
+#include <pdal/PDALUtils.hpp>
+
+#include <cpl_string.h>
+
+#include <boost/program_options.hpp>
+
+namespace
+{
+
+void setDate(OGRFeatureH feature, const tm& tyme, int fieldNumber)
+{
+    OGR_F_SetFieldDateTime(feature, fieldNumber,
+        tyme.tm_year + 1900, tyme.tm_mon + 1, tyme.tm_mday, tyme.tm_hour,
+        tyme.tm_min, tyme.tm_sec, 100);
+}
+
+
+} // anonymous namespace
+
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.tindex",
+    "TIndex Kernel",
+    "http://pdal.io/kernels/kernels.tindex.html" );
+
+CREATE_STATIC_PLUGIN(1, 0, TIndexKernel, Kernel, s_info)
+
+std::string TIndexKernel::getName() const { return s_info.name; }
+
+TIndexKernel::TIndexKernel()
+    : Kernel()
+//ABELL - need to option this.
+    , m_srsColumnName("srs")
+    , m_merge(false)
+    , m_dataset(NULL)
+    , m_layer(NULL)
+    , m_fastBoundary(false)
+
+{
+    m_log.setLeader("pdal tindex");
+}
+
+
+void TIndexKernel::addSwitches()
+{
+    namespace po = boost::program_options;
+
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("tindex", po::value<std::string>(&m_idxFilename),
+            "OGR-readable/writeable tile index output")
+        ("filespec", po::value<std::string>(&m_filespec),
+            "Build: Pattern of files to index. Merge: Output filename")
+        ("fast_boundary", po::value<bool>(&m_fastBoundary)->
+            zero_tokens()->implicit_value(true),
+            "use extend instead of exact boundary")
+        ("lyr_name", po::value<std::string>(&m_layerName),
+            "OGR layer name to write into datasource")
+        ("tindex_name", po::value<std::string>(&m_tileIndexColumnName)->
+            default_value("location"), "Tile index column name")
+        ("driver,f", po::value<std::string>(&m_driverName)->
+            default_value("ESRI Shapefile"), "OGR driver name to use ")
+        ("t_srs", po::value<std::string>(&m_tgtSrsString)->
+            default_value("EPSG:4326"), "Target SRS of tile index")
+        ("a_srs", po::value<std::string>(&m_assignSrsString)->
+            default_value("EPSG:4326"),
+            "Assign SRS of tile with no SRS to this value")
+        ("bounds", po::value<BOX2D>(&m_bounds),
+            "Extent (in XYZ) to clip output to")
+        ("polygon", po::value<std::string>(&m_wkt),
+            "Well-known text of polygon to clip output")
+        ("write_absolute_path", po::value<bool>(&m_absPath)->
+            default_value(false),
+            "Write absolute rather than relative file paths")
+        ("merge", "Whether we're merging the entries in a tindex file.")
+    ;
+
+    addSwitchSet(file_options);
+    po::options_description* processing_options =
+        new po::options_description("processing options");
+
+    processing_options->add_options();
+
+    addSwitchSet(processing_options);
+
+    addPositionalSwitch("tindex", 1);
+    addPositionalSwitch("filespec", 1);
+}
+
+
+void TIndexKernel::validateSwitches()
+{
+    m_merge = argumentExists("merge");
+
+    if (m_idxFilename.empty())
+        throw pdal_error("No index filename provided.");
+
+    if (m_merge)
+    {
+        if (!m_wkt.empty() && !m_bounds.empty())
+            throw pdal_error("Can't specify both --polygon and "
+                "--bounds options.");
+        if (!m_bounds.empty())
+            m_wkt = m_bounds.toWKT();
+        if (m_filespec.empty())
+            throw pdal_error("No output filename provided.");
+        StringList invalidArgs;
+        invalidArgs.push_back("a_srs");
+        invalidArgs.push_back("src_srs_name");
+        for (auto arg : invalidArgs)
+            if (argumentSpecified(arg))
+            {
+                std::ostringstream out;
+
+                out << "option '--" << arg << "' not supported during merge.";
+                throw pdal_error(out.str());
+            }
+    }
+    else
+    {
+        if (m_filespec.empty() && !m_usestdin)
+            throw pdal_error("No input pattern specified and STDIN not given");
+        if (argumentExists("polygon"))
+            throw pdal_error("--polygon option not supported when building "
+                "index.");
+        if (argumentExists("bounds"))
+            throw pdal_error("--bounds option not supported when building "
+                "index.");
+    }
+}
+
+
+int TIndexKernel::execute()
+{
+    GlobalEnvironment::get().initializeGDAL(0);
+
+    if (m_merge)
+        mergeFile();
+    else
+    {
+        try
+        {
+            createFile();
+        }
+        catch (pdal_error&)
+        {
+            if (m_dataset)
+                OGR_DS_Destroy(m_dataset);
+            throw;
+        }
+    }
+    return 0;
+}
+
+
+StringList TIndexKernel::glob(std::string& path)
+{
+    StringList filenames;
+
+#ifndef WIN32
+    glob_t glob_result;
+
+    ::glob(path.c_str(), GLOB_TILDE, NULL, &glob_result);
+    for (unsigned int i = 0; i < glob_result.gl_pathc; ++i)
+    {
+        std::string filename = glob_result.gl_pathv[i];
+        if (m_absPath)
+            filename = FileUtils::toAbsolutePath(filename);
+        filenames.push_back(filename);
+    }
+    globfree(&glob_result);
+#endif
+
+    return filenames;
+}
+
+
+StringList readSTDIN()
+{
+    std::string line;
+    StringList output;
+    while (std::getline(std::cin, line))
+    {
+        output.push_back(line);
+    }
+    return output;
+}
+
+
+bool TIndexKernel::isFileIndexed(const FieldIndexes& indexes,
+    const FileInfo& fileInfo)
+{
+    std::ostringstream qstring;
+    qstring << Utils::toupper(m_tileIndexColumnName) << "=\"" <<
+        fileInfo.m_filename << "\"";
+    OGRErr err = OGR_L_SetAttributeFilter(m_layer, qstring.str().c_str());
+    if (err != OGRERR_NONE)
+    {
+        std::ostringstream oss;
+        oss << "Unable to set attribute filter for file '" <<
+             fileInfo.m_filename << "'";
+        throw pdal_error(oss.str());
+    }
+
+    bool output(false);
+    OGR_L_ResetReading(m_layer);
+    if (OGR_L_GetNextFeature(m_layer))
+        output = true;
+
+    OGR_L_ResetReading(m_layer);
+    OGR_L_SetAttributeFilter(m_layer, NULL);
+    return output;
+}
+
+
+void TIndexKernel::createFile()
+{
+    if (!m_usestdin)
+        m_files = glob(m_filespec);
+    else
+        m_files = readSTDIN();
+
+    if (m_files.empty())
+    {
+        std::ostringstream out;
+        out << "Couldn't find files to index: " << m_filespec << ".";
+        throw pdal_error(out.str());
+    }
+
+//ABELL - Remove CPLGetBasename use.
+    const std::string filename = m_files.front();
+    if (m_layerName.empty())
+       m_layerName = CPLGetBasename(filename.c_str());
+
+    // Open or create the dataset.
+    if (!openDataset(m_idxFilename))
+        if (!createDataset(m_idxFilename))
+        {
+            std::ostringstream out;
+            out << "Couldn't open or create index dataset file '" <<
+                m_idxFilename << "'.";
+            throw pdal_error(out.str());
+        }
+
+    // Open or create a layer
+    if (!openLayer(m_layerName))
+        if (!createLayer(m_layerName))
+        {
+            std::ostringstream out;
+            out << "Couldn't open or create layer '" << m_layerName <<
+                "' in output file '" << m_idxFilename << "'.";
+            throw pdal_error(out.str());
+        }
+
+    FieldIndexes indexes = getFields();
+
+    KernelFactory factory(false);
+    for (auto f : m_files)
+    {
+        //ABELL - Not sure why we need to get absolute path here.
+        f = FileUtils::toAbsolutePath(f);
+        FileInfo info = getFileInfo(factory, f);
+        if (!isFileIndexed(indexes, info))
+        {
+            if (createFeature(indexes, info))
+                m_log.get(LogLevel::Info) << "Indexed file " << f << std::endl;
+            else
+                m_log.get(LogLevel::Error) << "Failed to create feature for "
+                    "file '" << f << "'" << std::endl;
+
+        }
+    }
+    OGR_DS_Destroy(m_dataset);
+}
+
+
+void TIndexKernel::mergeFile()
+{
+    using namespace gdal;
+
+    std::ostringstream out;
+
+    if (!openDataset(m_idxFilename))
+    {
+        std::ostringstream out;
+        out << "Couldn't open index dataset file '" << m_idxFilename << "'.";
+        throw pdal_error(out.str());
+    }
+    if (!openLayer(m_layerName))
+    {
+        std::ostringstream out;
+        out << "Couldn't open layer '" << m_layerName <<
+            "' in output file '" << m_idxFilename << "'.";
+        throw pdal_error(out.str());
+    }
+
+    FieldIndexes indexes = getFields();
+
+    SpatialRef outSrs(m_tgtSrsString);
+    if (!outSrs)
+        throw pdal_error("Couldn't interpret target SRS string.");
+
+    if (!m_wkt.empty())
+    {
+        Geometry g(m_wkt, outSrs);
+
+        if (!g)
+            throw pdal_error("Couldn't interpret geometry filter string.");
+        OGR_L_SetSpatialFilter(m_layer, g.get());
+    }
+
+    std::vector<FileInfo> files;
+
+    // Docs are bad here.  You need this call even if you haven't read anything
+    // or nothing happens.
+    OGR_L_ResetReading(m_layer);
+    while (true)
+    {
+        OGRFeatureH feature = OGR_L_GetNextFeature(m_layer);
+        if (!feature)
+            break;
+
+        FileInfo fileInfo;
+        fileInfo.m_filename =
+            OGR_F_GetFieldAsString(feature, indexes.m_filename);
+        fileInfo.m_srs =
+            OGR_F_GetFieldAsString(feature, indexes.m_srs);
+        files.push_back(fileInfo);
+
+        OGR_F_Destroy(feature);
+    }
+
+    StageFactory factory;
+
+    MergeFilter merge;
+
+    Options cropOptions;
+    if (!m_bounds.empty())
+        cropOptions.add("bounds", m_bounds);
+    else
+        cropOptions.add("polygon", m_wkt);
+
+    for (auto f : files)
+    {
+        Stage *premerge = NULL;
+        std::string driver = factory.inferReaderDriver(f.m_filename);
+        Stage *reader = factory.createStage(driver, true);
+        if (!reader)
+        {
+            out << "Unable to create reader for file '" << f.m_filename << "'.";
+            throw pdal_error(out.str());
+        }
+        Options readerOptions;
+        readerOptions.add("filename", f.m_filename);
+        reader->setOptions(readerOptions);
+        premerge = reader;
+
+        if (m_tgtSrsString != f.m_srs)
+        {
+            Stage *repro = factory.createStage("filters.reprojection", true);
+            repro->setInput(*reader);
+            Options reproOptions;
+            reproOptions.add("out_srs", m_tgtSrsString);
+            reproOptions.add("in_srs", f.m_srs);
+    std::cerr << "Repro = " << m_tgtSrsString << "/" << f.m_srs << "!\n";
+            repro->setOptions(reproOptions);
+            premerge = repro;
+        }
+
+        // WKT is set, even if we're using a bounding box for fitering, so
+        // can be used as a test here.
+        if (!m_wkt.empty())
+        {
+            Stage *crop = factory.createStage("filters.crop", true);
+            crop->setOptions(cropOptions);
+            crop->setInput(*premerge);
+            premerge = crop;
+        }
+
+        merge.setInput(*premerge);
+    }
+
+    std::string driver = factory.inferWriterDriver(m_filespec);
+    Options factoryOptions = factory.inferWriterOptionsChanges(m_filespec);
+    Stage *writer = factory.createStage(driver, true);
+    if (!writer)
+    {
+        out << "Unable to create reader for file '" << m_filespec << "'.";
+        throw pdal_error(out.str());
+    }
+    writer->setInput(merge);
+
+    applyExtraStageOptionsRecursive(writer);
+
+    Options writerOptions(factoryOptions);
+    setCommonOptions(writerOptions);
+
+    writerOptions.add("filename", m_filespec);
+    writerOptions.add("offset_x", "auto");
+    writerOptions.add("offset_y", "auto");
+    writerOptions.add("offset_z", "auto");
+    writer->addConditionalOptions(writerOptions);
+
+    PointTable table;
+    writer->prepare(table);
+    writer->execute(table);
+}
+
+
+bool TIndexKernel::createFeature(const FieldIndexes& indexes,
+    FileInfo& fileInfo)
+{
+    using namespace gdal;
+
+    OGRFeatureH hFeature = OGR_F_Create(OGR_L_GetLayerDefn(m_layer));
+
+    // Set the creation time into the feature.
+    setDate(hFeature, fileInfo.m_ctime, indexes.m_ctime);
+
+    // Set the file mod time into the feature.
+    setDate(hFeature, fileInfo.m_mtime, indexes.m_mtime);
+
+    // Set the filename into the feature.
+    OGR_F_SetFieldString(hFeature, indexes.m_filename,
+        fileInfo.m_filename.c_str());
+
+    // Set the SRS into the feature.
+    if (fileInfo.m_srs.empty())
+        fileInfo.m_srs = m_assignSrsString;
+
+    SpatialRef srcSrs(fileInfo.m_srs);
+    if (srcSrs.empty())
+    {
+        std::ostringstream oss;
+
+        oss << "Unable to import source spatial reference '" <<
+            fileInfo.m_srs << "' for file '" <<
+            fileInfo.m_filename << "'.";
+        throw pdal_error(oss.str());
+    }
+
+    // We have a limit of like 254 characters in some formats (notably
+    // shapefile), so try to get the condensed version of the SRS.
+
+    // Failing that, get the proj.4 version.  Not sure what's supposed to
+    // happen if we overflow 254 with proj.4.
+
+    const char* pszAuthorityCode = OSRGetAuthorityCode(srcSrs.get(), NULL);
+    const char* pszAuthorityName = OSRGetAuthorityName(srcSrs.get(), NULL);
+    if (pszAuthorityName && pszAuthorityCode)
+    {
+        std::string auth = std::string(pszAuthorityName) + ":" +
+            pszAuthorityCode;
+        OGR_F_SetFieldString(hFeature, indexes.m_srs, auth.data());
+    }
+    else
+    {
+        char* pszProj4 = NULL;
+        int err = -1;
+        try
+        {
+            err = OSRExportToProj4(srcSrs.get(), &pszProj4);
+        }
+        catch (pdal_error)
+        {}
+        if (err != OGRERR_NONE)
+        {
+            m_log.get(LogLevel::Warning) << "Unable to convert SRS to "
+                "proj.4 format for file '" << fileInfo.m_filename << "'" <<
+                std::endl;
+            return false;
+        }
+        std::string srs = std::string(pszProj4);
+        OGR_F_SetFieldString(hFeature, indexes.m_srs, srs.c_str());
+        CPLFree(pszProj4);
+    }
+
+    // Set the geometry in the feature
+    Geometry g = prepareGeometry(fileInfo);
+    char *pgeom;
+    OGR_G_ExportToWkt(g.get(), &pgeom);
+    OGR_F_SetGeometry(hFeature, g.get());
+
+    bool ok = (OGR_L_CreateFeature(m_layer, hFeature) == OGRERR_NONE);
+    OGR_F_Destroy(hFeature);
+    return ok;
+}
+
+
+TIndexKernel::FileInfo TIndexKernel::getFileInfo(KernelFactory& factory,
+    const std::string& filename)
+{
+    FileInfo fileInfo;
+
+    StageFactory f;
+
+    std::string driverName = f.inferReaderDriver(filename);
+    Stage *s = f.createStage(driverName, true);
+    Options ops;
+    ops.add("filename", filename);
+    s->setOptions(ops);
+
+    if (m_fastBoundary)
+    {
+        QuickInfo qi = s->preview();
+
+        std::stringstream polygon;
+        polygon << "POLYGON ((";
+
+        polygon <<         qi.m_bounds.minx << " " << qi.m_bounds.miny;
+        polygon << ", " << qi.m_bounds.maxx << " " << qi.m_bounds.miny;
+        polygon << ", " << qi.m_bounds.maxx << " " << qi.m_bounds.maxy;
+        polygon << ", " << qi.m_bounds.minx << " " << qi.m_bounds.maxy;
+        polygon << ", " << qi.m_bounds.minx << " " << qi.m_bounds.miny;
+        polygon << "))";
+        fileInfo.m_boundary = polygon.str();
+        if (!qi.m_srs.empty())
+            fileInfo.m_srs = qi.m_srs.getWKT();
+    }
+    else
+    {
+        PointTable table;
+
+        Stage *hexer = f.createStage("filters.hexbin", true);
+        if (! hexer)
+        {
+
+            std::ostringstream oss;
+
+            oss << "Unable to create hexer stage to create boundaries. "
+                << "Is PDAL_DRIVER_PATH environment variable set?";
+            throw pdal_error(oss.str());
+        }
+        hexer->setInput(*s);
+
+        hexer->prepare(table);
+        hexer->execute(table);
+
+        fileInfo.m_boundary =
+            table.metadata().findChild("filters.hexbin:boundary").value();
+        if (!table.spatialRef().empty())
+            fileInfo.m_srs = table.spatialRef().getWKT();
+    }
+
+    FileUtils::fileTimes(filename, &fileInfo.m_ctime, &fileInfo.m_mtime);
+    fileInfo.m_filename = filename;
+
+    return fileInfo;
+}
+
+
+bool TIndexKernel::openDataset(const std::string& filename)
+{
+    m_dataset = OGROpen(filename.c_str(), TRUE, NULL);
+    return (bool)m_dataset;
+}
+
+
+bool TIndexKernel::createDataset(const std::string& filename)
+{
+    OGRSFDriverH hDriver = OGRGetDriverByName(m_driverName.c_str());
+    if (!hDriver)
+    {
+        std::ostringstream oss;
+
+        oss << "Can't create dataset using driver '" << m_driverName <<
+            "'. Driver is not available.";
+        throw pdal_error(oss.str());
+    }
+
+    std::string dsname = FileUtils::toAbsolutePath(filename);
+    m_dataset = OGR_Dr_CreateDataSource(hDriver, dsname.c_str(), NULL);
+    return (bool)m_dataset;
+}
+
+
+bool TIndexKernel::openLayer(const std::string& layerName)
+{
+    if (OGR_DS_GetLayerCount(m_dataset) == 1)
+        m_layer = OGR_DS_GetLayer(m_dataset, 0);
+    else if (layerName.size())
+        m_layer = OGR_DS_GetLayerByName(m_dataset, m_layerName.c_str());
+
+    return (bool)m_layer;
+}
+
+
+bool TIndexKernel::createLayer(std::string const& layername)
+{
+    using namespace gdal;
+
+    SpatialRef srs(m_tgtSrsString);
+    if (!srs)
+        m_log.get(LogLevel::Error) << "Unable to import srs for layer "
+           "creation" << std::endl;
+
+    m_layer = OGR_DS_CreateLayer(m_dataset, m_layerName.c_str(),
+        srs.get(), wkbPolygon, NULL);
+
+    if (m_layer)
+        createFields();
+
+    //ABELL - At this point we should essentially "sync" things so that
+    //  index file gets created with the proper fields.  If this doesn't
+    //  and a failure occurs, the file may be left with a layer that doesn't
+    //  have the requisite fields.  Note that OGR_DS_SyncToDisk doesn't seem
+    //  to work reliably enough to warrant use.
+    return (bool)m_layer;
+}
+
+
+void TIndexKernel::createFields()
+{
+    OGRFieldDefnH hFieldDefn = OGR_Fld_Create(
+        m_tileIndexColumnName.c_str(), OFTString);
+    OGR_Fld_SetWidth(hFieldDefn, 254);
+    OGR_L_CreateField(m_layer, hFieldDefn, TRUE);
+    OGR_Fld_Destroy(hFieldDefn);
+
+    hFieldDefn = OGR_Fld_Create(m_srsColumnName.c_str(), OFTString);
+    OGR_Fld_SetWidth(hFieldDefn, 254);
+    OGR_L_CreateField(m_layer, hFieldDefn, TRUE );
+    OGR_Fld_Destroy(hFieldDefn);
+
+    hFieldDefn = OGR_Fld_Create("modified", OFTDateTime);
+    OGR_L_CreateField(m_layer, hFieldDefn, TRUE);
+    OGR_Fld_Destroy(hFieldDefn);
+
+    hFieldDefn = OGR_Fld_Create("created", OFTDateTime);
+    OGR_L_CreateField(m_layer, hFieldDefn, TRUE);
+    OGR_Fld_Destroy(hFieldDefn);
+}
+
+
+TIndexKernel::FieldIndexes TIndexKernel::getFields()
+{
+    FieldIndexes indexes;
+
+    void *fDefn = OGR_L_GetLayerDefn(m_layer);
+
+    indexes.m_filename = OGR_FD_GetFieldIndex(fDefn,
+        m_tileIndexColumnName.c_str());
+    if (indexes.m_filename < 0)
+    {
+        std::ostringstream out;
+
+        out << "Unable to find field '" << m_tileIndexColumnName <<
+            "' in file '" << m_idxFilename << "'.";
+        throw pdal_error(out.str());
+    }
+    indexes.m_srs = OGR_FD_GetFieldIndex(fDefn, m_srsColumnName.c_str());
+    if (indexes.m_srs < 0)
+    {
+        std::ostringstream out;
+
+        out << "Unable to find field '" << m_srsColumnName << "' in file '" <<
+            m_idxFilename << "'.";
+        throw pdal_error(out.str());
+    }
+
+    indexes.m_ctime = OGR_FD_GetFieldIndex(fDefn, "created");
+    indexes.m_mtime = OGR_FD_GetFieldIndex(fDefn, "modified");
+
+//     /* Load in memory existing file names in SHP */
+//     int nExistingFiles = (int)OGR_L_GetFeatureCount(m_layer, FALSE);
+//     for (auto i = 0; i < nExistingFiles; i++)
+//     {
+//         OGRFeatureH hFeature = OGR_L_GetNextFeature(m_layer);
+//         m_files.push_back(OGR_F_GetFieldAsString(hFeature, indexes.m_filename));
+//         OGR_F_Destroy(hFeature);
+//     }
+    return indexes;
+}
+
+
+gdal::Geometry TIndexKernel::prepareGeometry(const FileInfo& fileInfo)
+{
+    using namespace gdal;
+
+    std::ostringstream oss;
+
+
+    SpatialRef srcSrs(fileInfo.m_srs);
+    SpatialRef tgtSrs(m_tgtSrsString);
+    if (!tgtSrs)
+        throw pdal_error("Unable to import target SRS.");
+
+    Geometry g;
+
+    try
+    {
+       g = prepareGeometry(fileInfo.m_boundary, srcSrs, tgtSrs);
+    }
+    catch (pdal_error)
+    {
+        oss << "Unable to transform geometry from source to target SRS for " <<
+            fileInfo.m_filename << "'.";
+        throw pdal_error(oss.str());
+    }
+    if (!g)
+    {
+        oss << "Update to create geometry from WKT for '" <<
+            fileInfo.m_filename << "'.";
+        throw pdal_error(oss.str());
+    }
+    return g;
+}
+
+
+gdal::Geometry TIndexKernel::prepareGeometry(const std::string& wkt,
+   const gdal::SpatialRef& inSrs, const gdal::SpatialRef& outSrs)
+{
+    // Create OGR geometry from text.
+
+    gdal::Geometry g(wkt, inSrs);
+
+    if (g)
+        if (OGR_G_TransformTo(g.get(), outSrs.get()) != OGRERR_NONE)
+            throw pdal_error("Unable to transform geometry.");
+
+    return g;
+}
+
+} // namespace pdal
+
diff --git a/kernels/tindex/TIndexKernel.hpp b/kernels/tindex/TIndexKernel.hpp
new file mode 100644
index 0000000..705e67f
--- /dev/null
+++ b/kernels/tindex/TIndexKernel.hpp
@@ -0,0 +1,119 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/GDALUtils.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/plugin.hpp>
+
+
+extern "C" int32_t TIndexKernel_ExitFunc();
+extern "C" PF_ExitFunc TIndexKernel_InitPlugin();
+
+namespace pdal
+{
+
+class KernelFactory;
+
+class PDAL_DLL TIndexKernel : public Kernel
+{
+    struct FileInfo
+    {
+        std::string m_filename;
+        std::string m_srs;
+        std::string m_boundary;
+        struct tm m_ctime;
+        struct tm m_mtime;
+    };
+
+    struct FieldIndexes
+    {
+        int m_filename;
+        int m_srs;
+        int m_ctime;
+        int m_mtime;
+    };
+
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute(); // overrride
+
+private:
+    TIndexKernel();
+    void addSwitches(); // overrride
+    void validateSwitches(); // overrride
+
+    StringList glob(std::string& path);
+    void createFile();
+    void mergeFile();
+    bool openDataset(const std::string& filename);
+    bool createDataset(const std::string& filename);
+    bool openLayer(const std::string& layerName);
+    bool createLayer(const std::string& layerName);
+    FieldIndexes getFields();
+    FileInfo getFileInfo(KernelFactory& factory, const std::string& filename);
+    bool createFeature(const FieldIndexes& indexes, FileInfo& info);
+    gdal::Geometry prepareGeometry(const FileInfo& fileInfo);
+    gdal::Geometry prepareGeometry(const std::string& wkt,
+        const gdal::SpatialRef& inSrs, const gdal::SpatialRef& outSrs);
+    void createFields();
+
+    bool isFileIndexed( const FieldIndexes& indexes, const FileInfo& fileInfo);
+
+    std::string m_idxFilename;
+    std::string m_filespec;
+    StringList m_files;
+    std::string m_layerName;
+    std::string m_driverName;
+    std::string m_tileIndexColumnName;
+    std::string m_srsColumnName;
+    std::string m_wkt;
+    BOX2D m_bounds;
+    bool m_merge;
+    bool m_absPath;
+
+    void *m_dataset;
+    void *m_layer;
+    std::string m_tgtSrsString;
+    std::string m_assignSrsString;
+    bool m_fastBoundary;
+};
+
+} // namespace pdal
+
diff --git a/kernels/translate/CMakeLists.txt b/kernels/translate/CMakeLists.txt
new file mode 100644
index 0000000..3a142db
--- /dev/null
+++ b/kernels/translate/CMakeLists.txt
@@ -0,0 +1,3 @@
+# Translate Kernel
+PDAL_ADD_DRIVER(kernel translate TranslateKernel.cpp TranslateKernel.hpp objects)
+set(PDAL_TARGET_OBJECTS ${PDAL_TARGET_OBJECTS} ${objects} PARENT_SCOPE)
diff --git a/kernels/translate/TranslateKernel.cpp b/kernels/translate/TranslateKernel.cpp
new file mode 100644
index 0000000..7627f91
--- /dev/null
+++ b/kernels/translate/TranslateKernel.cpp
@@ -0,0 +1,214 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TranslateKernel.hpp"
+
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PipelineWriter.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace pdal
+{
+
+static PluginInfo const s_info =
+    PluginInfo("kernels.translate",
+               "The Translate kernel allows users to construct a pipeline " \
+               "consisting of a reader, a writer, and N filter stages. " \
+               "Any supported stage type can be specified from the command " \
+               "line, reducing the need to create custom kernels for every " \
+               "combination.",
+               "http://pdal.io/kernels/kernels.translate.html");
+
+CREATE_STATIC_PLUGIN(1, 0, TranslateKernel, Kernel, s_info)
+
+std::string TranslateKernel::getName() const
+{
+    return s_info.name;
+}
+
+TranslateKernel::TranslateKernel()
+    : Kernel()
+    , m_inputFile("")
+    , m_outputFile("")
+    , m_pipelineOutput("")
+    , m_readerType("")
+    , m_writerType("")
+{}
+
+void TranslateKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+        throw app_usage_error("--input/-i required");
+
+    if (m_outputFile == "")
+        throw app_usage_error("--output/-o required");
+}
+
+void TranslateKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+     "input file name")
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""),
+     "output file name")
+    ("pipeline,p", po::value<std::string>(&m_pipelineOutput)->default_value(""),
+     "pipeline output")
+    ("reader,r", po::value<std::string>(&m_readerType)->default_value(""),
+     "reader type")
+    ("filter,f",
+     po::value<std::vector<std::string> >(&m_filterType)->multitoken(),
+     "filter type")
+    ("writer,w", po::value<std::string>(&m_writerType)->default_value(""),
+     "writer type")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+    addPositionalSwitch("filter", -1);
+}
+
+int TranslateKernel::execute()
+{
+    // setting common options for each stage propagates the debug flag and
+    // verbosity level
+    Options readerOptions, filterOptions, writerOptions;
+    setCommonOptions(readerOptions);
+    setCommonOptions(filterOptions);
+    setCommonOptions(writerOptions);
+
+    m_manager = std::unique_ptr<PipelineManager>(new PipelineManager);
+
+    if (!m_readerType.empty())
+    {
+        m_manager->addReader(m_readerType);
+    }
+    else
+    {
+        StageFactory factory;
+        std::string driver = factory.inferReaderDriver(m_inputFile);
+
+        if (driver.empty())
+            throw app_runtime_error("Cannot determine input file type of " +
+                                    m_inputFile);
+        m_manager->addReader(driver);
+    }
+
+    if (m_manager == NULL)
+        throw pdal_error("Error making pipeline\n");
+
+    Stage* reader = m_manager->getStage();
+
+    if (reader == NULL)
+        throw pdal_error("Error getting reader\n");
+
+    readerOptions.add("filename", m_inputFile);
+    reader->setOptions(readerOptions);
+
+    Stage* stage = reader;
+
+    // add each filter provided on the command-line, updating the stage pointer
+    for (auto const f : m_filterType)
+    {
+        std::string filter_name(f);
+
+        if (!Utils::startsWith(f, "filters."))
+            filter_name.insert(0, "filters.");
+
+        Stage* filter = &(m_manager->addFilter(filter_name));
+
+        if (filter == NULL)
+            throw pdal_error("Error getting filter\n");
+
+        filter->setOptions(filterOptions);
+        filter->setInput(*stage);
+        stage = filter;
+    }
+
+    if (!m_writerType.empty())
+    {
+        m_manager->addWriter(m_writerType);
+    }
+    else
+    {
+        StageFactory factory;
+        std::string driver = factory.inferWriterDriver(m_outputFile);
+
+        if (driver.empty())
+            throw app_runtime_error("Cannot determine output file type of " +
+                                    m_outputFile);
+        Options options = factory.inferWriterOptionsChanges(m_outputFile);
+        writerOptions += options;
+        m_manager->addWriter(driver);
+    }
+
+    Stage* writer = m_manager->getStage();
+
+    if (writer == NULL)
+        throw pdal_error("Error getting writer\n");
+
+    writerOptions.add("filename", m_outputFile);
+    writer->setOptions(writerOptions);
+    writer->setInput(*stage);
+
+    // be sure to recurse through any extra stage options provided by the user
+    applyExtraStageOptionsRecursive(writer);
+
+    m_manager->execute();
+
+    if (m_pipelineOutput.size() > 0)
+    {
+        PipelineWriter writer(*m_manager);
+        writer.writePipeline(m_pipelineOutput);
+    }
+
+    return 0;
+}
+
+} // namespace pdal
diff --git a/kernels/translate/TranslateKernel.hpp b/kernels/translate/TranslateKernel.hpp
new file mode 100644
index 0000000..3665336
--- /dev/null
+++ b/kernels/translate/TranslateKernel.hpp
@@ -0,0 +1,75 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+* Copyright (c) 2015, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/pdal_export.hpp>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+extern "C" int32_t TranslateKernel_ExitFunc();
+extern "C" PF_ExitFunc TranslateKernel_InitPlugin();
+
+namespace pdal
+{
+
+class PDAL_DLL TranslateKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    TranslateKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+    std::string m_pipelineOutput;
+    std::string m_readerType;
+    std::vector<std::string> m_filterType;
+    std::string m_writerType;
+
+    std::unique_ptr<PipelineManager> m_manager;
+};
+
+} // namespace pdal
diff --git a/pdal_defines.h.in b/pdal_defines.h.in
new file mode 100644
index 0000000..961efe1
--- /dev/null
+++ b/pdal_defines.h.in
@@ -0,0 +1,77 @@
+/*
+ * pdal_defines.h.in is used by cmake to generate pdal_defines.h
+ *
+ * Do not edit pdal_defines.h!
+ *
+ * Note this is a C-style header.  Do not use C++ syntax.
+ */
+#ifndef PDAL_DEFINES_H
+#define PDAL_DEFINES_H
+
+/*
+ * version settings
+ */
+#define PDAL_VERSION_MAJOR @PDAL_VERSION_MAJOR@
+#define PDAL_VERSION_MINOR @PDAL_VERSION_MINOR@
+#define PDAL_VERSION_PATCH @PDAL_VERSION_PATCH@
+
+#define PDAL_VERSION_STRING "@PDAL_VERSION_STRING@"
+
+#define PDAL_PLUGIN_VERSION 1
+
+/* (note this will look yucky until we get to major>=1) */
+#define PDAL_VERSION_INTEGER ((PDAL_VERSION_MAJOR*100*100)+(PDAL_VERSION_MINOR*100)+PDAL_VERSION_PATCH)
+
+#cmakedefine PDAL_PLUGIN_INSTALL_PATH "@PDAL_PLUGIN_INSTALL_PATH@"
+/*
+ * availability of 3rd-party libraries
+ */
+#cmakedefine PDAL_HAVE_GEOS
+#cmakedefine PDAL_HAVE_HDF5
+#cmakedefine PDAL_HAVE_HEXER
+#cmakedefine PDAL_HAVE_LASZIP
+#cmakedefine PDAL_HAVE_LAZPERF
+#cmakedefine PDAL_HAVE_LIBXML2
+#cmakedefine PDAL_HAVE_LIBGEOTIFF
+#cmakedefine PDAL_HAVE_MRSID
+#cmakedefine PDAL_HAVE_NITRO
+#cmakedefine PDAL_HAVE_ORACLE
+#cmakedefine PDAL_HAVE_P2G
+#cmakedefine PDAL_HAVE_SQLITE
+#cmakedefine PDAL_HAVE_POSTGRESQL
+
+/*
+ * platform endianness
+ */
+#cmakedefine PDAL_ENDIAN_AWARE
+
+/*
+ * Debug or Release build?
+ */
+#define PDAL_BUILD_TYPE "@PDAL_BUILD_TYPE@"
+
+/*
+ * platform OS
+ */
+#cmakedefine PDAL_PLATFORM_WIN32
+#cmakedefine PDAL_PLATFORM_OSX
+#cmakedefine PDAL_PLATFORM_LINUX
+
+/*
+ * platform compiler
+ */
+#cmakedefine PDAL_COMPILER_MSVC
+#cmakedefine PDAL_COMPILER_VC12
+#cmakedefine PDAL_COMPILER_VC11
+#cmakedefine PDAL_COMPILER_VC10
+#cmakedefine PDAL_COMPILER_VC9
+#cmakedefine PDAL_COMPILER_VC8
+#cmakedefine PDAL_COMPILER_GCC
+#cmakedefine PDAL_COMPILER_CLANG
+
+/*
+ * built pdal app as application bundle on OSX?
+ */
+#cmakedefine PDAL_APP_BUNDLE
+
+#endif
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt
new file mode 100644
index 0000000..04b7865
--- /dev/null
+++ b/plugins/CMakeLists.txt
@@ -0,0 +1,64 @@
+if(BUILD_PLUGIN_ATTRIBUTE)
+    add_subdirectory(attribute)
+endif()
+
+if(BUILD_PLUGIN_CPD)
+    add_subdirectory(cpd)
+endif(BUILD_PLUGIN_CPD)
+
+if(BUILD_PLUGIN_GEOWAVE)
+    add_subdirectory(geowave)
+endif(BUILD_PLUGIN_GEOWAVE)
+
+if(BUILD_PLUGIN_GREYHOUND)
+    add_subdirectory(greyhound)
+endif()
+
+if(BUILD_PLUGIN_HEXBIN)
+    add_subdirectory(hexbin)
+endif()
+
+if(BUILD_PLUGIN_ICEBRIDGE)
+    add_subdirectory(icebridge)
+endif()
+
+if(BUILD_PLUGIN_MATLAB)
+    add_subdirectory(matlab)
+endif()
+
+if(BUILD_PLUGIN_MRSID)
+    add_subdirectory(mrsid)
+endif()
+
+if(BUILD_PLUGIN_NITF)
+    add_subdirectory(nitf)
+endif()
+
+if(BUILD_PLUGIN_OCI)
+    add_subdirectory(oci)
+endif()
+
+if(BUILD_PLUGIN_P2G)
+    add_subdirectory(p2g)
+endif()
+
+if(BUILD_PLUGIN_PCL)
+    add_subdirectory(pcl)
+endif()
+
+if(BUILD_PLUGIN_PGPOINTCLOUD)
+    add_subdirectory(pgpointcloud)
+endif()
+
+if(BUILD_PLUGIN_PYTHON)
+    add_subdirectory(python)
+endif()
+
+if(BUILD_PLUGIN_RIVLIB)
+    add_subdirectory(rxp)
+endif(BUILD_PLUGIN_RIVLIB)
+
+if(BUILD_PLUGIN_SQLITE)
+    add_subdirectory(sqlite)
+endif()
+
diff --git a/plugins/attribute/CMakeLists.txt b/plugins/attribute/CMakeLists.txt
new file mode 100644
index 0000000..7bce37b
--- /dev/null
+++ b/plugins/attribute/CMakeLists.txt
@@ -0,0 +1,21 @@
+#
+# Attribute filter CMake configuration
+#
+
+find_package(GEOS QUIET 3.3)
+set_package_properties(GEOS PROPERTIES PURPOSE "Enables attribute filter")
+
+find_package(GDAL QUIET 1.9.0)
+set_package_properties(GDAL PROPERTIES PURPOSE "Enables attribute filter")
+
+if (GEOS_FOUND AND GDAL_FOUND)
+
+    set(srcs filters/AttributeFilter.cpp)
+    set(incs filters/AttributeFilter.hpp)
+
+    PDAL_ADD_PLUGIN(libname filter attribute
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${GEOS_LIBRARY} ${GDAL_LIBRARY})
+else()
+    message(STATUS "BUILD_PLUGIN_ATTRIBUTE disabled because GEOS and/or GDAL was not found")
+endif()
diff --git a/plugins/attribute/filters/AttributeFilter.cpp b/plugins/attribute/filters/AttributeFilter.cpp
new file mode 100644
index 0000000..f98c06d
--- /dev/null
+++ b/plugins/attribute/filters/AttributeFilter.cpp
@@ -0,0 +1,356 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, howard at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "AttributeFilter.hpp"
+
+#include <memory>
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/GDALUtils.hpp>
+
+#include <pdal/StageFactory.hpp>
+#include <pdal/QuadIndex.hpp>
+
+#include <ogr_geometry.h>
+#include <geos_c.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.attribute",
+    "Assign values for a dimension using a specified value, \n" \
+        "an OGR-readable data source, or an OGR SQL query.",
+    "http://pdal.io/stages/filters.attribute.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, AttributeFilter, Filter, s_info)
+
+struct OGRDataSourceDeleter
+{
+    template <typename T>
+    void operator()(T* ptr)
+    {
+        if (ptr)
+            ::OGR_DS_Destroy(ptr);
+    }
+};
+
+struct OGRGeometryDeleter
+{
+    template <typename T>
+    void operator()(T* ptr)
+    {
+        if (ptr)
+            ::OGR_G_DestroyGeometry(ptr);
+    }
+};
+
+
+struct OGRFeatureDeleter
+{
+    template <typename T>
+    void operator()(T* ptr)
+    {
+        if (ptr)
+            ::OGR_F_Destroy(ptr);
+    }
+};
+
+void AttributeFilter::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+}
+
+
+Options AttributeFilter::getDefaultOptions()
+{
+    Options options;
+
+    pdal::Option red("dimension", "Classification", "");
+    pdal::Option b0("value","0", "");
+    pdal::Option geometry("geometry","POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))", "");
+    pdal::Option query("query","", "");
+    pdal::Option layer("layer","", "");
+    pdal::Option datasource("datasource","", "");
+    pdal::Options redO;
+    redO.add(b0);
+    redO.add(geometry);
+    redO.add(query);
+    redO.add(layer);
+    redO.add(datasource);
+    red.setOptions(redO);
+
+    options.add(red);
+
+    return options;
+}
+
+
+void AttributeFilter::processOptions(const Options& options)
+{
+    std::vector<Option> dimensions = options.getOptions("dimension");
+    for (auto i = dimensions.begin(); i != dimensions.end(); ++i)
+    {
+        std::string name = i->getValue<std::string>();
+        boost::optional<Options const&> dimensionOptions = i->getOptions();
+        if (!dimensionOptions)
+        {
+            std::ostringstream oss;
+            oss << "No options dimension given for dimension '" <<
+                name << "'";
+            throw pdal_error(oss.str());
+        }
+
+        AttributeInfo info;
+        info.datasource = dimensionOptions->getValueOrDefault<std::string>("datasource", "");
+
+
+        // If we have no datasource, then we're simply setting a value.
+        // If we have no value, throw an exception.
+        if (!info.datasource.size())
+        {
+            info.value = dimensionOptions->getValueOrThrow<std::string>("value");
+            info.isogr = false;
+        } else
+        {
+            info.column = dimensionOptions->getValueOrDefault<std::string>("column",""); // take first column
+            info.query = dimensionOptions->getValueOrDefault<std::string>("query","");
+            info.layer = dimensionOptions->getValueOrDefault<std::string>("layer",""); // take first layer
+
+        }
+
+        m_dimensions.insert(std::make_pair(name, info));
+    }
+}
+
+void AttributeFilter::ready(PointTableRef table)
+{
+    for (auto& dim_par : m_dimensions)
+    {
+        Dimension::Id::Enum t = table.layout()->findDim(dim_par.first);
+        dim_par.second.dim = t;
+
+        if (dim_par.second.isogr)
+        {
+
+            OGRDSPtr ds = OGRDSPtr(OGROpen(dim_par.second.datasource.c_str(), 0, 0), OGRDataSourceDeleter());
+            if (!ds)
+            {
+                std::ostringstream oss;
+                oss << "Unable to open data source '" << dim_par.second.datasource <<"'";
+                throw pdal_error(oss.str());
+            }
+            dim_par.second.ds = ds;
+        }
+
+    }
+}
+
+BOX3D computeBounds(GEOSContextHandle_t ctx, GEOSGeometry const *geometry)
+{
+    uint32_t numInputDims;
+    BOX3D output;
+
+
+    GEOSGeometry const* ring = GEOSGetExteriorRing_r(ctx,
+        geometry);
+    GEOSCoordSequence const* coords = GEOSGeom_getCoordSeq_r(ctx,
+        ring);
+
+    GEOSCoordSeq_getDimensions_r(ctx, coords, &numInputDims);
+
+    uint32_t count(0);
+    GEOSCoordSeq_getSize_r(ctx, coords, &count);
+
+    double x(0.0);
+    double y(0.0);
+    double z(0.0);
+    for (unsigned i = 0; i < count; ++i)
+    {
+        GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 0, &x);
+        GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 1, &y);
+        if (numInputDims > 2)
+            GEOSCoordSeq_getOrdinate_r(ctx, coords, i, 2, &z);
+        output.grow(x, y, z);
+    }
+    return output;
+}
+
+
+GEOSGeometry* createGEOSPoint(GEOSContextHandle_t ctx, double x, double y, double z)
+{
+    int ret(0);
+
+    // precise filtering based on the geometry
+    GEOSCoordSequence* coords =
+        GEOSCoordSeq_create_r(ctx, 1, 3);
+    if (!coords)
+        throw pdal_error("unable to allocate coordinate sequence");
+    ret = GEOSCoordSeq_setX_r(ctx, coords, 0, x);
+    if (!ret)
+        throw pdal_error("unable to set x for coordinate sequence");
+    ret = GEOSCoordSeq_setY_r(ctx, coords, 0, y);
+    if (!ret)
+        throw pdal_error("unable to set y for coordinate sequence");
+    ret = GEOSCoordSeq_setZ_r(ctx, coords, 0, z);
+    if (!ret)
+        throw pdal_error("unable to set z for coordinate sequence");
+
+    GEOSGeometry* p = GEOSGeom_createPoint_r(ctx, coords);
+    if (!p)
+        throw pdal_error("unable to allocate candidate test point");
+    return p;
+}
+
+void AttributeFilter::UpdateGEOSBuffer(PointView& view, AttributeInfo& info)
+{
+    QuadIndex idx(view);
+
+    if (!info.lyr) // wake up the layer
+    {
+        if (info.layer.size())
+            info.lyr = OGR_DS_GetLayerByName(info.ds.get(), info.layer.c_str());
+        else if (info.query.size())
+        {
+            info.lyr = OGR_DS_ExecuteSQL(info.ds.get(), info.query.c_str(), 0, 0);
+        }
+        else
+            info.lyr = OGR_DS_GetLayer(info.ds.get(), 0);
+        if (!info.lyr)
+        {
+            std::ostringstream oss;
+            oss << "Unable to select layer '" << info.layer << "'";
+            throw pdal_error(oss.str());
+        }
+    }
+
+    OGRFeaturePtr feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+
+    int field_index(1); // default to first column if nothing was set
+    if (info.column.size())
+    {
+
+        field_index = OGR_F_GetFieldIndex(feature.get(), info.column.c_str());
+        if (field_index == -1)
+        {
+            std::ostringstream oss;
+            oss << "No column name '" << info.column << "' was found.";
+            throw pdal_error(oss.str());
+        }
+    }
+
+    while(feature)
+    {
+        OGRGeometryH geom = OGR_F_GetGeometryRef(feature.get());
+        OGRwkbGeometryType t = OGR_G_GetGeometryType(geom);
+
+        if (!(t == wkbPolygon ||
+            t == wkbMultiPolygon ||
+            t == wkbPolygon25D ||
+            t == wkbMultiPolygon25D))
+        {
+            std::ostringstream oss;
+            oss << "Geometry is not Polygon or MultiPolygon!";
+            throw pdal::pdal_error(oss.str());
+        }
+
+        OGRGeometry* ogr_g = (OGRGeometry*) geom;
+        GEOSGeometry* geos_g (0);
+        if (!m_geosEnvironment)
+        {
+
+#if (GDAL_VERSION_MINOR < 11) && (GDAL_VERSION_MAJOR == 1)
+        geos_g = ogr_g->exportToGEOS();
+#else
+        m_geosEnvironment = ogr_g->createGEOSContext();
+        geos_g = ogr_g->exportToGEOS(m_geosEnvironment);
+
+#endif
+        }
+
+        GEOSPreparedGeometry const* geos_pg = GEOSPrepare_r(m_geosEnvironment, geos_g);
+        if (!geos_pg)
+            throw pdal_error("unable to prepare geometry for index-accelerated intersection");
+
+        // Compute a total bounds for the geometry. Query the QuadTree to
+        // find out the points that are inside the bbox. Then test each
+        // point in the bbox against the prepared geometry.
+        BOX3D box = computeBounds(m_geosEnvironment, geos_g);
+        std::vector<PointId> ids = idx.getPoints(box);
+        for (const auto& i : ids)
+        {
+
+            double x = view.getFieldAs<double>(Dimension::Id::X, i);
+            double y = view.getFieldAs<double>(Dimension::Id::Y, i);
+            double z = view.getFieldAs<double>(Dimension::Id::Z, i);
+
+            GEOSGeometry* p = createGEOSPoint(m_geosEnvironment, x, y ,z);
+
+            if (static_cast<bool>(GEOSPreparedContains_r(m_geosEnvironment, geos_pg, p)))
+            {
+                // We're in the poly, write the attribute value
+                int32_t v = OGR_F_GetFieldAsInteger(feature.get(), field_index);
+                view.setField(info.dim, i, v);
+//                 log()->get(LogLevel::Debug) << "Setting value: " << v << std::endl;
+            }
+
+            GEOSGeom_destroy_r(m_geosEnvironment, p);
+
+        }
+
+        feature = OGRFeaturePtr(OGR_L_GetNextFeature(info.lyr), OGRFeatureDeleter());
+    }
+}
+
+void AttributeFilter::filter(PointView& view)
+{
+
+    for (auto& dim_par : m_dimensions)
+    {
+        if (dim_par.second.isogr)
+        {
+            UpdateGEOSBuffer(view, dim_par.second);
+        }  else
+        {
+            for (PointId i = 0; i < view.size(); ++i)
+            {
+                double v = boost::lexical_cast<double>(dim_par.second.value);
+                view.setField(dim_par.second.dim, i, v);
+            }
+
+        }
+    }
+}
+
+} // namespace pdal
diff --git a/plugins/attribute/filters/AttributeFilter.hpp b/plugins/attribute/filters/AttributeFilter.hpp
new file mode 100644
index 0000000..d9be09b
--- /dev/null
+++ b/plugins/attribute/filters/AttributeFilter.hpp
@@ -0,0 +1,140 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler <hobu.inc at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <map>
+#include <memory>
+#include <string>
+
+typedef struct GEOSContextHandle_HS *GEOSContextHandle_t;
+
+typedef void *OGRLayerH;
+
+
+namespace pdal
+{
+
+namespace gdal
+{
+    class ErrorHandler;
+}
+
+
+typedef std::shared_ptr<void> OGRDSPtr;
+typedef std::shared_ptr<void> OGRFeaturePtr;
+typedef std::shared_ptr<void> OGRGeometryPtr;
+
+class AttributeInfo
+{
+public:
+    AttributeInfo() : ds(0), lyr(0), isogr(true) {};
+
+    std::string connection;
+    std::string column;
+    std::string datasource;
+    OGRDSPtr ds;
+    OGRLayerH lyr;
+    std::string query;
+    std::string layer;
+    std::string value;
+    bool isogr;
+    Dimension::Id::Enum dim;
+    AttributeInfo(const AttributeInfo& other)
+        : connection(other.connection)
+        , column(other.column)
+        , datasource(other.datasource)
+        , ds(other.ds)
+        , lyr(other.lyr)
+        , query(other.query)
+        , layer(other.layer)
+        , value(other.value)
+        , isogr(other.isogr)
+        , dim(other.dim) {};
+    AttributeInfo& operator=(const AttributeInfo& other)
+    {
+        if (&other != this)
+        {
+            connection = other.connection;
+            column = other.column;
+            datasource = other.datasource;
+            ds = other.ds;
+            lyr = other.lyr;
+            query = other.query;
+            value = other.value;
+            layer = other.layer;
+            isogr = other.isogr;
+            dim = other.dim;
+        }
+        return *this;
+    }
+
+};
+
+
+typedef std::map< std::string, AttributeInfo> AttributeInfoMap;
+
+
+class PDAL_DLL AttributeFilter : public Filter
+{
+public:
+    AttributeFilter() : Filter(), m_geosEnvironment(0) {};
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const { return "filters.attribute"; }
+
+    Options getDefaultOptions();
+
+private:
+    virtual void initialize();
+    virtual void processOptions(const Options&);
+    virtual void ready(PointTableRef table);
+    virtual void filter(PointView& view);
+
+    AttributeFilter& operator=(const AttributeFilter&); // not implemented
+    AttributeFilter(const AttributeFilter&); // not implemented
+
+    typedef std::shared_ptr<void> OGRDSPtr;
+
+    AttributeInfoMap m_dimensions;
+    GEOSContextHandle_t m_geosEnvironment;
+    std::unique_ptr<pdal::gdal::ErrorHandler> m_gdal_debug;
+    void UpdateGEOSBuffer(PointView& view, AttributeInfo& info);
+
+};
+
+} // namespace pdal
diff --git a/plugins/cpd/CMakeLists.txt b/plugins/cpd/CMakeLists.txt
new file mode 100644
index 0000000..acda39f
--- /dev/null
+++ b/plugins/cpd/CMakeLists.txt
@@ -0,0 +1,41 @@
+# CPD plugin CMake configuration
+#
+# CPD is Coherent Point Drift: https://github.com/gadomski/cpd
+
+find_package(CPD 0.2 REQUIRED)
+
+set_package_properties(CPD PROPERTIES
+    DESCRIPTION "Coherent Point Drift"
+    URL "https://github.com/gadomski/cpd"
+    TYPE OPTIONAL
+    PURPOSE "Run the coherent point drift registration/change algorithm on two datasets via a kernel"
+    )
+
+include_directories(
+    ${CMAKE_CURRENT_LIST_DIR}
+    include
+    ${CPD_INCLUDE_DIRS}
+    )
+
+set(src
+    kernel/Cpd.cpp
+    )
+
+set(deps
+    cpd
+    )
+
+PDAL_ADD_PLUGIN(cpd_kernel_lib_name kernel cpd
+    FILES ${src}
+    LINK_WITH ${deps}
+    )
+
+if (WITH_TESTS)
+    include_directories(
+        ${PROJECT_SOURCE_DIR}/test/unit
+        )
+    PDAL_ADD_TEST(pdal_plugins_cpd_kernel_test
+        FILES test/CpdKernelTest.cpp
+        LINK_WITH ${deps}
+        )
+endif(WITH_TESTS)
diff --git a/plugins/cpd/kernel/Cpd.cpp b/plugins/cpd/kernel/Cpd.cpp
new file mode 100644
index 0000000..314a323
--- /dev/null
+++ b/plugins/cpd/kernel/Cpd.cpp
@@ -0,0 +1,333 @@
+/******************************************************************************
+ * Copyright (c) 2014, Pete Gadomski (pete.gadomski at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "kernel/Cpd.hpp"
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/KernelFactory.hpp>
+
+#include "chipper/ChipperFilter.hpp"
+#include "crop/CropFilter.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.cpd",
+    "CPD Kernel",
+    "http://pdal.io/kernels/kernels.cpd.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, CpdKernel, Kernel, s_info)
+
+std::string CpdKernel::getName() const { return s_info.name; }
+
+void CpdKernel::validateSwitches()
+{
+    if (m_filex == "")
+        throw app_usage_error("--filex/-x required");
+    if (m_filey == "")
+        throw app_usage_error("--filey/-y required");
+    if (m_output == "")
+        throw app_usage_error("--output/-o required");
+}
+
+
+void CpdKernel::addSwitches()
+{
+    using namespace cpd;
+
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+        ("filex,x", po::value<std::string>(&m_filex)->default_value(""),
+         "input file containing the source points")
+        ("filey,y", po::value<std::string>(&m_filey)->default_value(""),
+         "input file containg target points, i.e. the points that will be registered")
+        ("output,o", po::value<std::string>(&m_output)->default_value(""),
+         "output file name")
+        ("tolerance,t", po::value<float>(&m_tolerance)->default_value(DefaultTolerance),
+            "tolerance criterium")
+        ("max-iterations,m", po::value<int>(&m_max_it)->default_value(DefaultMaxIterations),
+            "maximum number of iterations allowed")
+        ("outliers,O", po::value<float>(&m_outliers)->default_value(DefaultOutliers),
+            "the weight of noise and outliers")
+        ("fgt,f", po::value<bool>(&m_fgt)->default_value(DefaultFgt),
+            "use a fast gauss transform (less accurate but faster)")
+        ("epsilon,e", po::value<float>(&m_epsilon)->default_value(DefaultEpsilon),
+            "tolerance level for the fast gauss transform")
+        ("beta,b", po::value<float>(&m_beta)->default_value(DefaultBeta),
+            "std of gaussian filter (Green's function, used for nonrigid registrations only)")
+        ("lambda,l", po::value<float>(&m_lambda)->default_value(DefaultLambda),
+            "regularization weight (used for nonrigid registrations only)")
+        ("numeig,n", po::value<arma::uword>(&m_numeig)->default_value(DefaultNumeig),
+            "number of eigenvectors/eigenvalues to find for nonrigid_lowrank registrations (if zero, default to N ^ (1/2) where N is the number of points in Y)")
+        ("bounds", po::value<BOX3D>(&m_bounds),
+            "Extent (in XYZ) to clip output to")
+        ("auto-z-exaggeration", po::value<bool>(&m_auto_z_exaggeration)->default_value(false),
+            "Use the domain of the XY dimensions to automatically exaggerate the Z dimensions")
+        ("auto-z-exaggeration-ratio", po::value<float>(&m_auto_z_exaggeration_ratio)->default_value(5.0 / 8.0),
+            "The scaling ratio for the Z-exaggeration. Z's range will be scaled to this ratio of the extent of the smallest XY extent.")
+        ("chipped", po::value<bool>(&m_chipped)->default_value(false),
+            "Run chipped registration")
+        ("chip-capacity", po::value<int>(&m_chip_capacity)->default_value(8000),
+            "The maximum number of points in each chip (before buffer)")
+        ("chip-buffer", po::value<float>(&m_chip_buffer)->default_value(50),
+            "The width of the buffer around each chip")
+        ("sigma2", po::value<float>(&m_sigma2)->default_value(DefaultSigma2),
+            "The starting sigma2 value. To improve CPD runs, set to a bit more than you expect the average motion to be")
+        ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("filex", 1);
+    addPositionalSwitch("filey", 1);
+    addPositionalSwitch("output", 1);
+}
+
+
+PointViewPtr CpdKernel::readFile(const std::string& filename,
+    PointTableRef table, arma::mat& mat)
+{
+    Options opt;
+    opt.add<std::string>("filename", filename);
+    opt.add<bool>("debug", isDebug());
+    opt.add<boost::uint32_t>("verbose", getVerboseLevel());
+
+    Stage& reader = makeReader(filename);
+    reader.setOptions(opt);
+
+    PointViewSet viewSet;
+    if (!m_bounds.empty())
+    {
+        Options boundsOptions;
+        boundsOptions.add("bounds", m_bounds);
+        StageFactory f;
+
+        Stage& crop = ownStage(f.createStage("filters.crop"));
+        crop.setInput(reader);
+        crop.setOptions(boundsOptions);
+        crop.prepare(table);
+        viewSet = crop.execute(table);
+    }
+    else
+    {
+        reader.prepare(table);
+        viewSet = reader.execute(table);
+    }
+
+
+    const arma::uword D = 3;
+    for (auto it = viewSet.begin(); it != viewSet.end(); ++it)
+    {
+        PointViewPtr view = *it;
+
+        point_count_t rowidx;
+        if (mat.is_empty())
+        {
+            rowidx = 0;
+            mat.set_size(view->size(), D);
+        }
+        else
+        {
+            rowidx = mat.n_rows;
+            mat.set_size(mat.n_rows + (*it)->size(), D);
+        }
+
+        for (point_count_t bufidx = 0; bufidx < view->size(); ++bufidx, ++rowidx)
+        {
+            mat(rowidx, 0) = view->getFieldAs<double>(Dimension::Id::X, bufidx);
+            mat(rowidx, 1) = view->getFieldAs<double>(Dimension::Id::Y, bufidx);
+            mat(rowidx, 2) = view->getFieldAs<double>(Dimension::Id::Z, bufidx);
+        }
+    }
+    // Return a pointer to the first point view because we assume
+    // that readers only produce one point view. If that assumption
+    // ever is invalid, this will presumably bork.
+    return (*viewSet.begin());
+}
+
+
+int CpdKernel::execute()
+{
+    PointTable tableX;
+    PointTable tableY;
+
+    arma::mat X, Y;
+    PointViewPtr viewX = readFile(m_filex, tableX, X);
+    readFile(m_filey, tableY, Y);
+
+    if (X.n_rows == 0 || Y.n_rows == 0)
+    {
+        throw pdal_error("No points to process.");
+    }
+
+    cpd::NonrigidLowrank reg(m_tolerance,
+                             m_max_it,
+                             m_outliers,
+                             m_fgt,
+                             m_epsilon,
+                             m_beta,
+                             m_lambda,
+                             m_numeig);
+    reg.set_sigma2(m_sigma2);
+    if (m_auto_z_exaggeration)
+    {
+        BOX3D bounds;
+        viewX->calculateBounds(bounds);
+        double min_range = std::min(bounds.maxx - bounds.minx, bounds.maxy - bounds.miny);
+        double exaggeration = m_auto_z_exaggeration_ratio * min_range / (bounds.maxz - bounds.minz);
+        reg.set_z_exaggeration(exaggeration);
+    }
+
+    cpd::Registration::ResultPtr result;
+    PointTable outTable;
+    PointLayoutPtr outLayout(outTable.layout());
+    outLayout->registerDim(Dimension::Id::X);
+    outLayout->registerDim(Dimension::Id::Y);
+    outLayout->registerDim(Dimension::Id::Z);
+    outLayout->registerDim(Dimension::Id::XVelocity);
+    outLayout->registerDim(Dimension::Id::YVelocity);
+    outLayout->registerDim(Dimension::Id::ZVelocity);
+    PointViewPtr outView(new PointView(outTable));
+
+    if (m_chipped)
+    {
+        result = chipThenRegister(reg, X, Y, viewX, tableX);
+        for (arma::uword i = 0; i < result->Y.n_rows; ++i)
+        {
+            outView->setField<double>(Dimension::Id::X, i, result->Y(i, 0));
+            outView->setField<double>(Dimension::Id::Y, i, result->Y(i, 1));
+            outView->setField<double>(Dimension::Id::Z, i, result->Y(i, 2));
+            outView->setField<double>(Dimension::Id::XVelocity, i, result->Y(i, 3));
+            outView->setField<double>(Dimension::Id::YVelocity, i, result->Y(i, 4));
+            outView->setField<double>(Dimension::Id::ZVelocity, i, result->Y(i, 5));
+        }
+    }
+    else
+    {
+        result = reg.run(X, Y);
+        for (arma::uword i = 0; i < Y.n_rows; ++i)
+        {
+            outView->setField<double>(Dimension::Id::X, i, result->Y(i, 0));
+            outView->setField<double>(Dimension::Id::Y, i, result->Y(i, 1));
+            outView->setField<double>(Dimension::Id::Z, i, result->Y(i, 2));
+            outView->setField<double>(Dimension::Id::XVelocity, i,
+                Y(i, 0) - result->Y(i, 0));
+            outView->setField<double>(Dimension::Id::YVelocity, i,
+                Y(i, 1) - result->Y(i, 1));
+            outView->setField<double>(Dimension::Id::ZVelocity, i,
+                Y(i, 2) - result->Y(i, 2));
+        }
+    }
+
+    BufferReader reader;
+    reader.addView(outView);
+
+    Options writerOpts;
+    writerOpts.add<std::string>("filename", m_output);
+    writerOpts.add<std::string>("order", "X,Y,Z,XVelocity,YVelocity,ZVelocity");
+    writerOpts.add<bool>("keep_unspecified", false);
+    setCommonOptions(writerOpts);
+
+    Stage& writer = makeWriter(m_output, reader);
+    writer.setOptions(writerOpts + writer.getOptions());
+    writer.prepare(outTable);
+    writer.execute(outTable);
+
+    return 0;
+}
+
+
+arma::mat getChip(const arma::mat& X, const BOX3D& bounds)
+{
+    std::vector<arma::uword> idx;
+    for (arma::uword i = 0; i < X.n_rows; ++i)
+    {
+        if (bounds.contains(X(i, 0), X(i, 1), X(i, 2)))
+        {
+            idx.push_back(i);
+        }
+    }
+    arma::uvec idxvec(idx);
+
+    return X.rows(idxvec);
+}
+
+
+cpd::Registration::ResultPtr CpdKernel::chipThenRegister(
+    const cpd::NonrigidLowrank& reg, const arma::mat& X, const arma::mat& Y,
+    const PointViewPtr& viewX, PointTableRef table)
+{
+    BufferReader reader;
+    reader.addView(viewX);
+
+    ChipperFilter chipper;
+    chipper.setInput(reader);
+    Options options;
+    options.add<int>("capacity", m_chip_capacity);
+    chipper.setOptions(options);
+
+    chipper.prepare(table);
+    PointViewSet viewSet = chipper.execute(table);
+    std::cerr << "Number of chips: " << viewSet.size() << std::endl;
+
+    cpd::Registration::ResultPtr result(new cpd::Registration::Result());
+    int count = 0;
+    for (auto it = viewSet.begin(); it != viewSet.end(); ++it)
+    {
+        BOX3D bounds;
+        (*it)->calculateBounds(bounds);
+        BOX3D chipBounds(bounds.minx - m_chip_buffer,
+                         bounds.miny - m_chip_buffer,
+                         bounds.minz,
+                         bounds.maxx + m_chip_buffer,
+                         bounds.maxy + m_chip_buffer,
+                         bounds.maxz);
+
+        arma::mat Xchip = getChip(X, chipBounds);
+        arma::mat Ychip = getChip(Y, chipBounds);
+
+        cpd::Registration::ResultPtr tmpresult = reg.run(Xchip, Ychip);
+        result->Y.insert_rows(result->Y.n_rows, getChip(
+            arma::join_horiz(tmpresult->Y, Ychip - tmpresult->Y), bounds));
+        std::cerr << "Done with chip #" << ++count << " of " <<
+            viewSet.size() << std::endl;
+    }
+
+    return result;
+}
+
+} // namespace pdal
+
diff --git a/plugins/cpd/kernel/Cpd.hpp b/plugins/cpd/kernel/Cpd.hpp
new file mode 100644
index 0000000..f1fc5ac
--- /dev/null
+++ b/plugins/cpd/kernel/Cpd.hpp
@@ -0,0 +1,84 @@
+/******************************************************************************
+ * Copyright (c) 2014, Pete Gadomski (pete.gadomski at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <cpd/nonrigid_lowrank.hpp>
+
+#include <pdal/Kernel.hpp>
+#include <pdal/pdal_export.hpp>
+
+
+namespace pdal
+{
+
+class PDAL_DLL CpdKernel : public Kernel
+{
+public:
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    CpdKernel() {};
+    void addSwitches();
+    void validateSwitches();
+    PointViewPtr readFile(const std::string& filename, PointTableRef table,
+        arma::mat& mat);
+    cpd::Registration::ResultPtr chipThenRegister(
+        const cpd::NonrigidLowrank& reg, const arma::mat& X, const arma::mat& Y,
+        const PointViewPtr& bufX, PointTableRef table);
+
+    std::string m_filex;
+    std::string m_filey;
+    std::string m_output;
+    float m_tolerance;
+    int m_max_it;
+    float m_outliers;
+    bool m_fgt;
+    float m_epsilon;
+    float m_beta;
+    float m_lambda;
+    arma::uword m_numeig;
+    BOX3D m_bounds;
+    bool m_auto_z_exaggeration;
+    float m_auto_z_exaggeration_ratio;
+    bool m_chipped;
+    int m_chip_capacity;
+    float m_chip_buffer;
+    float m_sigma2;
+};
+
+} // namespace pdal
diff --git a/plugins/cpd/test/CpdKernelTest.cpp b/plugins/cpd/test/CpdKernelTest.cpp
new file mode 100644
index 0000000..e48dc27
--- /dev/null
+++ b/plugins/cpd/test/CpdKernelTest.cpp
@@ -0,0 +1,126 @@
+/******************************************************************************
+* Copyright (c) 2015, Pete Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+#include "kernel/Cpd.hpp"
+
+#include <pdal/KernelFactory.hpp>
+#include <pdal/Filter.hpp>
+#include <pdal/Reader.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+namespace
+{
+
+
+class CpdKernelTest : public ::testing::Test
+{
+public:
+
+    CpdKernelTest()
+        : m_x(Support::datapath("las/simple.las"))
+        , m_y(Support::datapath("las/simple_transformed.las"))
+        , m_outfile(Support::datapath("las/simple_cpd.las"))
+    {}
+
+protected:
+
+    virtual void SetUp()
+    {
+        PipelineManager mrManager;
+
+        Options readerOptions;
+        readerOptions.add("filename", m_x);
+        Stage& reader = mrManager.addReader("readers.las");
+        reader.setOptions(readerOptions);
+
+        Options transformationOptions;
+        transformationOptions.add("matrix", "0.36 0.48 -0.8 1\n-0.8 0.6 0.0 2\n0.48 0.64 0.60 3\n0 0 0 1");
+        Stage& filter = mrManager.addFilter("filters.transformation");
+        filter.setInput(reader);
+        filter.setOptions(transformationOptions);
+
+        Options writerOptions;
+        writerOptions.add("filename", m_y);
+        Stage& writer = mrManager.addWriter("writers.las");
+        writer.setInput(filter);
+        writer.setOptions(writerOptions);
+
+        point_count_t np = mrManager.execute();
+    }
+
+    virtual void TearDown()
+    {
+        FileUtils::deleteFile(m_y);
+        FileUtils::deleteFile(m_outfile);
+    }
+
+    std::string m_x;
+    std::string m_y;
+    std::string m_outfile;
+
+};
+
+
+} // namespace
+
+
+TEST_F(CpdKernelTest, Execution)
+{
+    KernelFactory f;
+    std::unique_ptr<Kernel> cpdKernel = f.createKernel("kernels.cpd");
+
+    int argc = 7;
+    const char * argv[7] = {
+        "cpd",
+        "-x",
+        m_x.c_str(),
+        "-y",
+        m_y.c_str(),
+        "-o",
+        m_outfile.c_str()
+    };
+
+    int retval = cpdKernel->run(argc, argv, "cpd");
+    EXPECT_EQ(0, retval);
+}
+
+
+} // namespace pdal
+
diff --git a/plugins/geowave/CMakeLists.txt b/plugins/geowave/CMakeLists.txt
new file mode 100644
index 0000000..9dae78e
--- /dev/null
+++ b/plugins/geowave/CMakeLists.txt
@@ -0,0 +1,47 @@
+#
+# GeoWave driver CMake configuration
+#
+
+include(${PDAL_CMAKE_DIR}/jni.cmake)
+include(${PDAL_CMAKE_DIR}/jace.cmake)
+include(${PDAL_CMAKE_DIR}/geowave.cmake)
+
+set(GEOWAVE_LIBRARIES "")
+set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${Boost_LIBRARIES})
+set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JNI_LIBRARIES})
+set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JACE_LIBRARY})
+set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_AWT_LIBRARY})
+set(GEOWAVE_LIBRARIES ${GEOWAVE_LIBRARIES} ${JAVA_JVM_LIBRARY})
+
+set(objs "")
+
+#
+# GeoWave Reader
+#
+set(srcs
+    io/GeoWaveReader.cpp
+)
+
+set(incs
+    io/GeoWaveReader.hpp
+)
+
+PDAL_ADD_PLUGIN(reader_libname reader geowave 
+    FILES "${srcs}" "${incs}" 
+    LINK_WITH ${GEOWAVE_LIBRARIES})
+
+#
+# GeoWave Writer
+#
+set(srcs
+    io/GeoWaveWriter.cpp
+)
+
+set(incs
+    io/GeoWaveWriter.hpp
+)
+
+PDAL_ADD_PLUGIN(writer_libname writer geowave 
+    FILES "${srcs}" "${incs}" 
+    LINK_WITH ${GEOWAVE_LIBRARIES})
+
diff --git a/plugins/geowave/io/GeoWaveReader.cpp b/plugins/geowave/io/GeoWaveReader.cpp
new file mode 100644
index 0000000..b835895
--- /dev/null
+++ b/plugins/geowave/io/GeoWaveReader.cpp
@@ -0,0 +1,399 @@
+/******************************************************************************
+* Copyright (c) 2015, James W. O'Meara (james.w.omeara at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GeoWaveReader.hpp"
+
+#include <jace/Jace.h>
+using jace::java_cast;
+using jace::java_new;
+
+#include "jace/JNIException.h"
+using jace::JNIException;
+
+#include "jace/VirtualMachineShutdownError.h"
+using jace::VirtualMachineShutdownError;
+
+#include "jace/OptionList.h"
+using jace::OptionList;
+using jace::Option;
+using jace::ClassPath;
+using jace::Verbose;
+using jace::CustomOption;
+
+#include <jace/StaticVmLoader.h>
+using jace::StaticVmLoader;
+
+#ifdef _WIN32
+#include "jace/Win32VmLoader.h"
+using jace::Win32VmLoader;
+const std::string os_pathsep(";");
+#else
+#include "jace/UnixVmLoader.h"
+using ::jace::UnixVmLoader;
+const std::string os_pathsep(":");
+#endif
+
+#include "jace/JArray.h"
+using jace::JArray;
+
+#include "jace/proxy/types/JBoolean.h"
+using jace::proxy::types::JBoolean;
+#include "jace/proxy/types/JDouble.h"
+using jace::proxy::types::JDouble;
+#include "jace/proxy/types/JInt.h"
+using jace::proxy::types::JInt;
+
+#include "jace/proxy/java/lang/Double.h"
+using jace::proxy::java::lang::Double;
+#include "jace/proxy/java/lang/String.h"
+using jace::proxy::java::lang::String;
+#include "jace/proxy/java/util/List.h"
+using jace::proxy::java::util::List;
+
+#include "jace/proxy/org/geotools/data/simple/SimpleFeatureCollection.h"
+using jace::proxy::org::geotools::data::simple::SimpleFeatureCollection;
+#include "jace/proxy/org/geotools/data/simple/SimpleFeatureIterator.h"
+using jace::proxy::org::geotools::data::simple::SimpleFeatureIterator;
+
+#include "jace/proxy/com/vividsolutions/jts/geom/Polygon.h"
+using jace::proxy::com::vividsolutions::jts::geom::Polygon;
+#include "jace/proxy/com/vividsolutions/jts/geom/Coordinate.h"
+using jace::proxy::com::vividsolutions::jts::geom::Coordinate;
+#include "jace/proxy/com/vividsolutions/jts/geom/GeometryFactory.h"
+using jace::proxy::com::vividsolutions::jts::geom::GeometryFactory;
+#include "jace/proxy/com/vividsolutions/jts/geom/Point.h"
+using jace::proxy::com::vividsolutions::jts::geom::Point;
+
+#include "jace/proxy/org/apache/accumulo/core/client/AccumuloException.h"
+using jace::proxy::org::apache::accumulo::core::client::AccumuloException;
+#include "jace/proxy/org/apache/accumulo/core/client/AccumuloSecurityException.h"
+using jace::proxy::org::apache::accumulo::core::client::AccumuloSecurityException;
+
+#include "jace/proxy/org/opengis/feature/simple/SimpleFeature.h"
+using jace::proxy::org::opengis::feature::simple::SimpleFeature;
+#include "jace/proxy/org/opengis/feature/simple/SimpleFeatureType.h"
+using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
+#include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
+using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
+
+#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/store/query/Query.h"
+using jace::proxy::mil::nga::giat::geowave::store::query::Query;
+#include "jace/proxy/mil/nga/giat/geowave/store/query/SpatialQuery.h"
+using jace::proxy::mil::nga::giat::geowave::store::query::SpatialQuery;
+
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/metadata/AccumuloAdapterStore.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::metadata::AccumuloAdapterStore;
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.geowave",
+    "\"GeoWave\"  reader support. ",
+    "http://pdal.io/stages/drivers.geowave.reader.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, GeoWaveReader, Reader, s_info)
+
+std::string pdal::GeoWaveReader::getName() const { return s_info.name; }
+
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+namespace pdal
+{
+
+    Options GeoWaveReader::getDefaultOptions()
+    {
+        Options options;
+
+        Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance");
+        Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance");
+        Option username("username", "", "The username for the account to establish an Accumulo connector");
+        Option password("password", "", "The password for the account to establish an Accumulo connector");
+        Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave");
+        Option featureTypeName("featureTypeName", "", "The feature type name to be used when interacting with GeoWave");
+        Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
+        Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+        Option bounds("bounds", "", "The extent of the bounding rectangle to use to query points, expressed as a string, eg: ([xmin, xmax], [ymin, ymax], [zmin, zmax])");
+
+        options.add(zookeeperUrl);
+        options.add(instanceName);
+        options.add(username);
+        options.add(password);
+        options.add(tableNamespace);
+        options.add(featureTypeName);
+        options.add(dataAdapter);
+        options.add(pointsPerEntry);
+        options.add(bounds);
+
+        return options;
+    }
+
+    void GeoWaveReader::initialize()
+    {
+        if (!jace::isRunning())
+        {
+            int status = createJvm();
+            if (status == 0)
+                log()->get(LogLevel::Debug) << "JVM Creation Successful" << std::endl;
+            else
+                log()->get(LogLevel::Error) << "JVM Creation Failed: Error ["  << status << "]" << std::endl;
+        }
+    }
+
+    void GeoWaveReader::processOptions(const Options& ops)
+    {
+        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
+        m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+        m_username = ops.getValueOrThrow<std::string>("username");
+        m_password = ops.getValueOrThrow<std::string>("password");
+        m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
+        m_featureTypeName =  ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
+        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+        m_bounds = ops.getValueOrDefault<BOX3D>("bounds", BOX3D());
+    }
+
+    void GeoWaveReader::addDimensions(PointLayoutPtr layout)
+    {
+        layout->registerDims(getDefaultDimensions());
+
+        BasicAccumuloOperations accumuloOperations;
+        try 
+        {
+            accumuloOperations = java_new<BasicAccumuloOperations>(
+                java_new<String>(m_zookeeperUrl),
+                java_new<String>(m_instanceName),
+                java_new<String>(m_username),
+                java_new<String>(m_password),
+                java_new<String>(m_tableNamespace));
+        }
+        catch (AccumuloException& e)
+        {
+            log()->get(LogLevel::Error) << "There was a problem establishing a connector. " << e;
+            return;
+        }
+        catch (AccumuloSecurityException& e)
+        {
+            log()->get(LogLevel::Error) << "The credentials passed are invalid. " << e;
+            return;
+        }
+        
+        AccumuloAdapterStore accumuloAdapterStore = java_new<AccumuloAdapterStore>(accumuloOperations);
+
+        List attribs;
+        if (m_useFeatCollDataAdapter)
+            attribs = java_cast<FeatureCollectionDataAdapter>(accumuloAdapterStore.getAdapter(java_new<ByteArrayId>(std::to_string(m_pointsPerEntry) + m_featureTypeName))).getType().getAttributeDescriptors();
+        else
+            attribs = java_cast<FeatureDataAdapter>(accumuloAdapterStore.getAdapter(java_new<ByteArrayId>(m_featureTypeName))).getType().getAttributeDescriptors();
+
+        for (int i = 0; i < attribs.size(); ++i){
+            std::string name = java_cast<AttributeDescriptor>(attribs.get(i)).getLocalName();
+            if (name.compare("location") != 0 && name.compare("X") != 0 && name.compare("Y") != 0)
+                layout->registerDim(Dimension::id(name));
+        }
+    }
+
+    Dimension::IdList GeoWaveReader::getDefaultDimensions()
+    {
+        Dimension::IdList ids;
+        ids.push_back(Dimension::Id::X);
+        ids.push_back(Dimension::Id::Y);
+        return ids;
+    }
+
+    void GeoWaveReader::ready(PointTableRef table)
+    {
+        if (m_bounds.empty())
+            return;
+
+        BasicAccumuloOperations accumuloOperations;
+        try 
+        {
+            accumuloOperations = java_new<BasicAccumuloOperations>(
+                java_new<String>(m_zookeeperUrl),
+                java_new<String>(m_instanceName),
+                java_new<String>(m_username),
+                java_new<String>(m_password),
+                java_new<String>(m_tableNamespace));
+        }
+        catch (AccumuloException& e)
+        {
+            log()->get(LogLevel::Error) << "There was a problem establishing a connector. " << e;
+            return;
+        }
+        catch (AccumuloSecurityException& e)
+        {
+            log()->get(LogLevel::Error) << "The credentials passed are invalid. " << e;
+            return;
+        }
+        
+        AccumuloDataStore accumuloDataStore = java_new<AccumuloDataStore>(
+            accumuloOperations);
+
+        Index index = IndexType_JaceIndexType::createSpatialVectorIndex();
+
+        GeometryFactory factory = java_new<GeometryFactory>();
+
+        JDouble lonMin = m_bounds.minx;
+        JDouble lonMax = m_bounds.maxx;
+        JDouble latMin = m_bounds.miny;
+        JDouble latMax = m_bounds.maxy;
+
+        JArray<Coordinate> coordArray(5);
+        coordArray[0] = java_new<Coordinate>(lonMin, latMin);
+        coordArray[1] = java_new<Coordinate>(lonMax, latMin);
+        coordArray[2] = java_new<Coordinate>(lonMax, latMax);
+        coordArray[3] = java_new<Coordinate>(lonMin, latMax);
+        coordArray[4] = java_new<Coordinate>(lonMin, latMin);
+
+        Polygon geom = factory.createPolygon(coordArray);
+        Query query = java_new<SpatialQuery>(geom);
+
+        JInt count = m_count;
+        m_iterator = accumuloDataStore.query(index, query, count);
+    }
+
+    point_count_t GeoWaveReader::read(PointViewPtr view, point_count_t count)
+    {
+        using namespace Dimension;
+
+        String location = java_new<String>("location");
+        point_count_t numRead = 0;
+
+        if (m_useFeatCollDataAdapter)
+        {
+            while (m_iterator.hasNext() && count > 0)
+            {
+                SimpleFeatureCollection featureCollection = java_cast<SimpleFeatureCollection>(m_iterator.next());
+                SimpleFeatureIterator featItr = featureCollection.features();
+
+                while (featItr.hasNext() && count-- > 0)
+                {
+                    SimpleFeature simpleFeature = java_cast<SimpleFeature>(featItr.next());
+                    List attribs = simpleFeature.getType().getAttributeDescriptors();
+
+                    for (int i = 0; i < attribs.size(); ++i){
+                        String name = java_cast<AttributeDescriptor>(attribs.get(i)).getLocalName();
+
+                        if (!name.equals(location))
+                            view->setField(id(name), numRead, java_cast<Double>(simpleFeature.getAttribute(name)).doubleValue());
+                    }
+
+                    if (m_cb)
+                        m_cb(*view, numRead);
+
+                    ++numRead;
+                }
+                featItr.close();
+            }
+        }
+        else
+        {
+            while (m_iterator.hasNext() && count-- > 0){
+                SimpleFeature simpleFeature = java_cast<SimpleFeature>(m_iterator.next());
+                List attribs = simpleFeature.getType().getAttributeDescriptors();
+
+                for (int i = 0; i < attribs.size(); ++i){
+                    String name = java_cast<AttributeDescriptor>(attribs.get(i)).getLocalName();
+
+                    if (!name.equals(location))
+                        view->setField(id(name), numRead, java_cast<Double>(simpleFeature.getAttribute(name)).doubleValue());
+                }
+
+                if (m_cb)
+                    m_cb(*view, numRead);
+
+                ++numRead;
+            }
+        }
+
+        return numRead;
+    }
+
+    void GeoWaveReader::done(PointTableRef table)
+    {
+        m_iterator.close();
+    }
+
+    int GeoWaveReader::createJvm()
+    {
+        try
+        {
+            StaticVmLoader loader(JNI_VERSION_1_2);
+
+            std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
+            std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
+
+            OptionList options;
+            //options.push_back(CustomOption("-Xdebug"));
+            //options.push_back(CustomOption("-Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y"));
+            //options.push_back(CustomOption("-Xcheck:jni"));
+            //options.push_back(Verbose (Verbose::JNI));
+            //options.push_back(Verbose (Verbose::CLASS));
+            options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+
+            jace::createVm(loader, options);
+        }
+        catch (VirtualMachineShutdownError&)
+        {
+            log()->get(LogLevel::Error) << "The JVM was terminated in mid-execution. " << std::endl;
+            return -1;
+        }
+        catch (JNIException& jniException)
+        {
+            log()->get(LogLevel::Error) << "An unexpected JNI error has occured: " << jniException.what() << std::endl;
+            return -2;
+        }
+        catch (std::exception& e)
+        {
+            log()->get(LogLevel::Error) << "An unexpected C++ error has occurred: " << e.what() << std::endl;
+            return -3;
+        }
+
+        return 0;
+    }
+} // namespace pdal
diff --git a/plugins/geowave/io/GeoWaveReader.hpp b/plugins/geowave/io/GeoWaveReader.hpp
new file mode 100644
index 0000000..e3fd571
--- /dev/null
+++ b/plugins/geowave/io/GeoWaveReader.hpp
@@ -0,0 +1,89 @@
+/******************************************************************************
+* Copyright (c) 2015, James W. O'Meara (james.w.omeara at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/util/Bounds.hpp>
+
+#ifdef PDAL_HAVE_GEOS
+#include <geos_c.h>
+#endif
+
+#include "jace/proxy/mil/nga/giat/geowave/store/CloseableIterator.h"
+using jace::proxy::mil::nga::giat::geowave::store::CloseableIterator;
+
+extern "C" int32_t GeoWaveReader_ExitFunc();
+extern "C" PF_ExitFunc GeoWaveReader_InitPlugin();
+
+
+namespace pdal
+{
+
+    class PDAL_DLL GeoWaveReader : public Reader
+    {
+    public:
+        static void * create();
+        static int32_t destroy(void *);
+        std::string getName() const;
+
+	Options getDefaultOptions();
+
+    private:
+        virtual void initialize();
+        virtual void processOptions(const Options& ops);
+        virtual void addDimensions(PointLayoutPtr layout);
+        virtual void ready(PointTableRef table);
+        virtual point_count_t read(PointViewPtr view, point_count_t count);
+        virtual void done(PointTableRef table);
+
+	Dimension::IdList getDefaultDimensions();
+        int createJvm();
+
+        std::string m_zookeeperUrl;
+        std::string m_instanceName;
+        std::string m_username;
+        std::string m_password;
+        std::string m_tableNamespace;
+        std::string m_featureTypeName;
+        bool m_useFeatCollDataAdapter;
+        uint32_t m_pointsPerEntry;
+
+        BOX3D m_bounds;
+
+        CloseableIterator m_iterator;
+    };
+
+} // namespace pdal
diff --git a/plugins/geowave/io/GeoWaveWriter.cpp b/plugins/geowave/io/GeoWaveWriter.cpp
new file mode 100644
index 0000000..d865a1e
--- /dev/null
+++ b/plugins/geowave/io/GeoWaveWriter.cpp
@@ -0,0 +1,350 @@
+/******************************************************************************
+* Copyright (c) 2015, James W. O'Meara (james.w.omeara at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GeoWaveWriter.hpp"
+
+#include <pdal/util/Algorithm.hpp>
+
+#include <jace/Jace.h>
+using jace::java_cast;
+using jace::java_new;
+
+#include "jace/JNIException.h"
+using jace::JNIException;
+
+#include "jace/VirtualMachineShutdownError.h"
+using jace::VirtualMachineShutdownError;
+
+#include "jace/OptionList.h"
+using jace::OptionList;
+using jace::Option;
+using jace::ClassPath;
+using jace::Verbose;
+using jace::CustomOption;
+
+#include <jace/StaticVmLoader.h>
+using jace::StaticVmLoader;
+
+#ifdef _WIN32
+#include "jace/Win32VmLoader.h"
+using jace::Win32VmLoader;
+const std::string os_pathsep(";");
+#else
+#include "jace/UnixVmLoader.h"
+using ::jace::UnixVmLoader;
+const std::string os_pathsep(":");
+#endif
+
+#include "jace/proxy/types/JDouble.h"
+using jace::proxy::types::JDouble;
+
+#include "jace/JArray.h"
+using jace::JArray;
+
+#include "jace/proxy/java/lang/Object.h"
+using jace::proxy::java::lang::Object;
+#include "jace/proxy/java/lang/Double.h"
+using jace::proxy::java::lang::Double;
+#include "jace/proxy/java/lang/String.h"
+using jace::proxy::java::lang::String;
+#include "jace/proxy/java/util/Iterator.h"
+using jace::proxy::java::util::Iterator;
+#include "jace/proxy/java/util/List.h"
+using jace::proxy::java::util::List;
+#include "jace/proxy/java/util/ArrayList.h"
+using jace::proxy::java::util::ArrayList;
+#include "jace/proxy/java/util/UUID.h"
+using jace::proxy::java::util::UUID;
+
+#include "jace/proxy/com/vividsolutions/jts/geom/Coordinate.h"
+using jace::proxy::com::vividsolutions::jts::geom::Coordinate;
+#include "jace/proxy/com/vividsolutions/jts/geom/GeometryFactory.h"
+using jace::proxy::com::vividsolutions::jts::geom::GeometryFactory;
+#include "jace/proxy/com/vividsolutions/jts/geom/Point.h"
+using jace::proxy::com::vividsolutions::jts::geom::Point;
+
+#include "jace/proxy/org/geotools/data/DataUtilities.h"
+using jace::proxy::org::geotools::data::DataUtilities;
+#include "jace/proxy/org/geotools/feature/simple/SimpleFeatureBuilder.h"
+using jace::proxy::org::geotools::feature::simple::SimpleFeatureBuilder;
+#include "jace/proxy/org/geotools/feature/simple/SimpleFeatureTypeBuilder.h"
+using jace::proxy::org::geotools::feature::simple::SimpleFeatureTypeBuilder;
+#include "jace/proxy/org/geotools/feature/DefaultFeatureCollection.h"
+using jace::proxy::org::geotools::feature::DefaultFeatureCollection;
+#include "jace/proxy/org/geotools/geometry/jts/JTSFactoryFinder.h"
+using jace::proxy::org::geotools::geometry::jts::JTSFactoryFinder;
+
+#include "jace/proxy/org/apache/accumulo/core/client/AccumuloException.h"
+using jace::proxy::org::apache::accumulo::core::client::AccumuloException;
+#include "jace/proxy/org/apache/accumulo/core/client/AccumuloSecurityException.h"
+using jace::proxy::org::apache::accumulo::core::client::AccumuloSecurityException;
+
+#include "jace/proxy/org/opengis/feature/simple/SimpleFeature.h"
+using jace::proxy::org::opengis::feature::simple::SimpleFeature;
+#include "jace/proxy/org/opengis/feature/simple/SimpleFeatureType.h"
+using jace::proxy::org::opengis::feature::simple::SimpleFeatureType;
+#include "jace/proxy/org/opengis/feature/type/AttributeDescriptor.h"
+using jace::proxy::org::opengis::feature::type::AttributeDescriptor;
+
+#include "jace/proxy/mil/nga/giat/geowave/index/ByteArrayId.h"
+using jace::proxy::mil::nga::giat::geowave::index::ByteArrayId;
+#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/vector/adapter/FeatureCollectionDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::vector::adapter::FeatureCollectionDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/store/adapter/WritableDataAdapter.h"
+using jace::proxy::mil::nga::giat::geowave::store::adapter::WritableDataAdapter;
+#include "jace/proxy/mil/nga/giat/geowave/store/index/Index.h"
+using jace::proxy::mil::nga::giat::geowave::store::index::Index;
+#include "jace/proxy/mil/nga/giat/geowave/store/index/IndexType_JaceIndexType.h"
+using jace::proxy::mil::nga::giat::geowave::store::index::IndexType_JaceIndexType;
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/BasicAccumuloOperations.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::BasicAccumuloOperations;
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloDataStore.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloDataStore;
+#include "jace/proxy/mil/nga/giat/geowave/accumulo/AccumuloIndexWriter.h"
+using jace::proxy::mil::nga::giat::geowave::accumulo::AccumuloIndexWriter;
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.geowave",
+    "Write data using GeoWave.",
+    "http://pdal.io/stages/drivers.geowave.writer.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, GeoWaveWriter, Writer, s_info)
+
+std::string pdal::GeoWaveWriter::getName() const { return s_info.name; }
+
+
+#define STRINGIFY(x) #x
+#define TOSTRING(x) STRINGIFY(x)
+
+namespace pdal
+{
+
+    Options GeoWaveWriter::getDefaultOptions()
+    {
+        Options options;
+
+        Option zookeeperUrl("zookeeperUrl", "", "The comma-delimited URLs for all zookeeper servers, this will be directly used to instantiate a ZookeeperInstance.");
+        Option instanceName("instanceName", "", "The zookeeper instance name, this will be directly used to instantiate a ZookeeperInstance.");
+        Option username("username", "", "The username for the account to establish an Accumulo connector.");
+        Option password("password", "", "The password for the account to establish an Accumulo connector.");
+        Option tableNamespace("tableNamespace", "", "The table name to be used when interacting with GeoWave.");
+        Option featureTypeName("featureTypeName", "PDAL_Point", "The feature type name to be used when interacting with GeoWave.");
+        Option dataAdapter("dataAdapter", "FeatureDataAdapter", "FeatureCollectionDataAdapter stores multiple points per Accumulo entry.  FeatureDataAdapter stores a single point per Accumulo entry.");
+        Option pointsPerEntry("pointsPerEntry", 5000u, "Sets the maximum number of points per Accumulo entry when using FeatureCollectionDataAdapter.");
+
+        options.add(zookeeperUrl);
+        options.add(instanceName);
+        options.add(username);
+        options.add(password);
+        options.add(tableNamespace);
+        options.add(featureTypeName);
+        options.add(dataAdapter);
+        options.add(pointsPerEntry);
+
+        return options;
+    }
+
+    void GeoWaveWriter::processOptions(const Options& ops)
+    {
+        m_zookeeperUrl = ops.getValueOrThrow<std::string>("zookeeperUrl");
+        m_instanceName = ops.getValueOrThrow<std::string>("instanceName");
+        m_username = ops.getValueOrThrow<std::string>("username");
+        m_password = ops.getValueOrThrow<std::string>("password");
+        m_tableNamespace = ops.getValueOrThrow<std::string>("tableNamespace");
+        m_featureTypeName = ops.getValueOrDefault<std::string>("featureTypeName", "PDAL_Point");
+        m_useFeatCollDataAdapter = !(ops.getValueOrDefault<std::string>("dataAdapter", "FeatureCollectionDataAdapter").compare("FeatureDataAdapter") == 0);
+        m_pointsPerEntry = ops.getValueOrDefault<uint32_t>("pointsPerEntry", 5000u);
+    }
+
+    void GeoWaveWriter::initialize()
+    {
+        if (!jace::isRunning())
+        {
+            int status = createJvm();
+            if (status == 0)
+                log()->get(LogLevel::Debug) << "JVM Creation Successful" << std::endl;
+            else
+                log()->get(LogLevel::Error) << "JVM Creation Failed: Error ["  << status << "]" << std::endl;
+        }
+    }
+
+    void GeoWaveWriter::ready(PointTableRef table)
+    {
+        // get a list of all the dimensions & their types
+        Dimension::IdList all = table.layout()->dims();
+        for (auto di = all.begin(); di != all.end(); ++di)
+            if (!contains(m_dims, *di))
+                m_dims.push_back(*di);
+    }
+
+    void GeoWaveWriter::write(const PointViewPtr view)
+    {
+
+        using namespace Dimension;
+
+        std::ostringstream os;
+
+        BasicAccumuloOperations accumuloOperations;
+        try 
+        {
+            accumuloOperations = java_new<BasicAccumuloOperations>(
+                java_new<String>(m_zookeeperUrl),
+                java_new<String>(m_instanceName),
+                java_new<String>(m_username),
+                java_new<String>(m_password),
+                java_new<String>(m_tableNamespace));
+        }
+        catch (AccumuloException& e)
+        {
+            log()->get(LogLevel::Error) << "There was a problem establishing a connector. " << e;
+            return;
+        }
+        catch (AccumuloSecurityException& e)
+        {
+            log()->get(LogLevel::Error) << "The credentials passed are invalid. " << e;
+            return;
+        }
+
+        AccumuloDataStore accumuloDataStore = java_new<AccumuloDataStore>(
+            accumuloOperations);
+
+        Index index = IndexType_JaceIndexType::createSpatialVectorIndex();
+
+        AccumuloIndexWriter accumuloIndexWriter = java_new<AccumuloIndexWriter>(
+            index,
+            accumuloOperations,
+            accumuloDataStore);
+
+        // treat all types as double
+        os << "location:Point:srid=4326";
+        for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+            os << "," << view->dimName(*di) << ":Double";
+
+        SimpleFeatureType TYPE = DataUtilities::createType(
+            java_new<String>(m_featureTypeName),
+            java_new<String>(os.str()));
+
+        String location = java_new<String>("location");
+
+        WritableDataAdapter dataAdapter;
+        if (m_useFeatCollDataAdapter)
+            dataAdapter = java_new<FeatureCollectionDataAdapter>(
+            TYPE,
+            m_pointsPerEntry);
+        else
+            dataAdapter = java_new<FeatureDataAdapter>(TYPE);
+
+
+        GeometryFactory geometryFactory = JTSFactoryFinder::getGeometryFactory();
+        SimpleFeatureBuilder builder = java_new<SimpleFeatureBuilder>(TYPE);
+
+        DefaultFeatureCollection featureCollection = java_new<DefaultFeatureCollection>(
+            UUID::randomUUID().toString(),
+            TYPE);
+
+        for (PointId idx = 0; idx < view->size(); ++idx)
+        {
+            JDouble X = view->getFieldAs<double>(Id::X, idx);
+            JDouble Y = view->getFieldAs<double>(Id::Y, idx);
+
+            Point point = geometryFactory.createPoint(
+                java_new<Coordinate>(
+                X,
+                Y));
+
+            builder.set(location, point);
+
+            for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+                if (view->hasDim(*di))
+                    builder.set(java_new<String>(view->dimName(*di)), java_new<Double>(view->getFieldAs<double>(*di, idx)));
+
+            SimpleFeature feature = builder.buildFeature(UUID::randomUUID().toString());
+
+            if (m_useFeatCollDataAdapter)
+                featureCollection.add(feature);
+            else
+                accumuloIndexWriter.write(
+                dataAdapter,
+                feature);
+        }
+
+        if (m_useFeatCollDataAdapter)
+            accumuloIndexWriter.write(
+            dataAdapter,
+            featureCollection);
+
+        accumuloIndexWriter.close();
+    }
+
+    int GeoWaveWriter::createJvm()
+    {
+        try
+        {
+            StaticVmLoader loader(JNI_VERSION_1_2);
+
+            std::string jaceClasspath = TOSTRING(JACE_RUNTIME_JAR);
+            std::string geowaveClasspath = TOSTRING(GEOWAVE_RUNTIME_JAR);
+
+            OptionList options;
+            //options.push_back(CustomOption("-Xdebug"));
+            //options.push_back(CustomOption("-Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=y"));
+            //options.push_back(CustomOption("-Xcheck:jni"));
+            //options.push_back(Verbose (Verbose::JNI));
+            //options.push_back(Verbose (Verbose::CLASS));
+            options.push_back(ClassPath(jaceClasspath + os_pathsep + geowaveClasspath));
+
+            jace::createVm(loader, options);
+        }
+        catch (VirtualMachineShutdownError&)
+        {
+            log()->get(LogLevel::Error) << "The JVM was terminated in mid-execution. " << std::endl;
+            return -1;
+        }
+        catch (JNIException& jniException)
+        {
+            log()->get(LogLevel::Error) << "An unexpected JNI error has occured: " << jniException.what() << std::endl;
+            return -2;
+        }
+        catch (std::exception& e)
+        {
+            log()->get(LogLevel::Error) << "An unexpected C++ error has occurred: " << e.what() << std::endl;
+            return -3;
+        }
+
+        return 0;
+    }
+
+} // namespaces
diff --git a/plugins/geowave/io/GeoWaveWriter.hpp b/plugins/geowave/io/GeoWaveWriter.hpp
new file mode 100644
index 0000000..5905fd3
--- /dev/null
+++ b/plugins/geowave/io/GeoWaveWriter.hpp
@@ -0,0 +1,78 @@
+/******************************************************************************
+* Copyright (c) 2015, James W. O'Meara (james.w.omeara at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <vector>
+#include <string>
+
+pdal::Writer* createGeoWaveWriter();
+
+namespace pdal
+{
+
+    class PDAL_DLL GeoWaveWriter : public Writer
+    {
+    public:
+
+        static void * create();
+        static int32_t destroy(void *);
+        std::string getName() const;
+
+        Options getDefaultOptions();
+
+    private:
+        virtual void initialize();
+        virtual void processOptions(const Options&);
+        virtual void ready(PointTableRef table);
+        virtual void write(const PointViewPtr view);
+
+        int createJvm();
+
+        std::string m_zookeeperUrl;
+        std::string m_instanceName;
+        std::string m_username;
+        std::string m_password;
+        std::string m_tableNamespace;
+        std::string m_featureTypeName;
+        bool m_useFeatCollDataAdapter;
+        uint32_t m_pointsPerEntry;
+        Dimension::IdList m_dims;
+        std::vector<Dimension::Type::Enum> m_dimTypes;
+    };
+
+} // namespace pdal
diff --git a/plugins/greyhound/CMakeLists.txt b/plugins/greyhound/CMakeLists.txt
new file mode 100644
index 0000000..fb26595
--- /dev/null
+++ b/plugins/greyhound/CMakeLists.txt
@@ -0,0 +1,35 @@
+#
+# Greyhound plugin CMake configuration
+#
+
+find_package(JSONCPP)
+find_package(WEBSOCKETPP)
+if(JSONCPP_FOUND AND WEBSOCKETPP_FOUND)
+    # add JSONCPP stuff
+    include_directories(${JSONCPP_INCLUDE_DIR})
+    add_definitions(-DHAVE_JSONCPP=1)
+
+    # add WEBSOCKETPP stuff
+    include_directories(${WEBSOCKETPP_INCLUDE_DIR})
+    add_definitions(-D_WEBSOCKETPP_NULLPTR_TOKEN_=0)
+    add_definitions(-D_WEBSOCKETPP_CPP11_RANDOM_DEVICE_=1)
+    add_definitions(-DHAVE_WEBSOCKETPP=1)
+
+    set(srcs
+        io/CompressionStream.cpp
+        io/Exchanges.cpp
+        io/GreyhoundReader.cpp
+        io/WebSocketClient.cpp
+    )
+
+    set(incs
+        io/CompressionStream.hpp
+        io/Exchanges.hpp
+        io/GreyhoundReader.hpp
+        io/WebSocketClient.hpp
+    )
+
+    PDAL_ADD_PLUGIN(libname reader greyhound
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${JSONCPP_LIBRARY})
+endif()
diff --git a/plugins/greyhound/io/CompressionStream.cpp b/plugins/greyhound/io/CompressionStream.cpp
new file mode 100644
index 0000000..840dbf8
--- /dev/null
+++ b/plugins/greyhound/io/CompressionStream.cpp
@@ -0,0 +1,45 @@
+#include <stdexcept>
+#include <cstring>
+
+#include "CompressionStream.hpp"
+
+CompressionStream::CompressionStream()
+    : m_data()
+    , m_index(0)
+    , m_mutex()
+    , m_cv()
+{ }
+
+void CompressionStream::putBytes(const uint8_t* bytes, const std::size_t length)
+{
+    std::unique_lock<std::mutex> lock(m_mutex);
+
+    const std::size_t offset(m_data.size());
+    m_data.resize(m_data.size() + length);
+    std::memcpy(m_data.data() + offset, bytes, length);
+
+    lock.unlock();
+    m_cv.notify_all();
+}
+
+uint8_t CompressionStream::getByte()
+{
+    // Make sure we have enough data to hand out before continuing.
+    std::unique_lock<std::mutex> lock(m_mutex);
+    m_cv.wait(lock, [this]()->bool { return m_index < m_data.size(); });
+    return m_data.at(m_index++);
+}
+
+void CompressionStream::getBytes(uint8_t* bytes, std::size_t length)
+{
+    std::unique_lock<std::mutex> lock(m_mutex);
+
+    // Make sure we have enough data to hand out before continuing.
+    m_cv.wait(lock, [this, length]()->bool {
+        return m_index + length <= m_data.size();
+    });
+
+    std::memcpy(bytes, m_data.data() + m_index, length);
+    m_index += length;
+}
+
diff --git a/plugins/greyhound/io/CompressionStream.hpp b/plugins/greyhound/io/CompressionStream.hpp
new file mode 100644
index 0000000..456d7b4
--- /dev/null
+++ b/plugins/greyhound/io/CompressionStream.hpp
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <cstdint>
+#include <vector>
+#include <mutex>
+#include <condition_variable>
+
+class CompressionStream
+{
+public:
+    CompressionStream();
+
+    // Called by us as we receive data.
+    void putBytes(const uint8_t* bytes, std::size_t length);
+
+    // Called by laz-perf as it decompresses.
+    uint8_t getByte();
+    void getBytes(uint8_t* bytes, std::size_t length);
+
+private:
+    std::vector<uint8_t> m_data;
+    std::size_t m_index;
+
+    std::mutex m_mutex;
+    std::condition_variable m_cv;
+};
+
diff --git a/plugins/greyhound/io/Exchanges.cpp b/plugins/greyhound/io/Exchanges.cpp
new file mode 100644
index 0000000..3ae1916
--- /dev/null
+++ b/plugins/greyhound/io/Exchanges.cpp
@@ -0,0 +1,424 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "Exchanges.hpp"
+
+namespace pdal
+{
+namespace exchanges
+{
+
+// Base Greyhound exchange
+
+Exchange::Exchange(const std::string& command)
+{
+    m_req["command"] = command;
+}
+
+bool Exchange::checkStatus() const
+{
+    bool valid(false);
+
+    if (res().size())
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        jsonReader.parse(res().at(0)->get_payload(), jsonResponse);
+
+        if (jsonResponse.isMember("status") &&
+            jsonResponse["status"].isIntegral() &&
+            jsonResponse["status"].asInt() == 1)
+        {
+            valid = true;
+        }
+    }
+
+    return valid;
+}
+
+
+
+// CreateSession exchange
+
+CreateSession::CreateSession(const std::string& pipelineId)
+    : Exchange("create")
+    , m_session()
+{
+    m_req["pipelineId"] = pipelineId;
+}
+
+bool CreateSession::check()
+{
+    bool valid(false);
+
+    if (checkStatus() && res().size() == 1)
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        jsonReader.parse(res().at(0)->get_payload(), jsonResponse);
+
+        if (jsonResponse.isMember("session") &&
+            jsonResponse["session"].isString())
+        {
+            m_session = jsonResponse["session"].asString();
+            valid = true;
+        }
+    }
+
+    return valid;
+}
+
+std::string CreateSession::getSession() const
+{
+    return m_session;
+}
+
+
+
+// GetNumPoints exchange
+
+GetNumPoints::GetNumPoints(const std::string& sessionId)
+    : Exchange("pointsCount")
+    , m_count()
+{
+    m_req["session"] = sessionId;
+}
+
+bool GetNumPoints::check()
+{
+    bool valid(false);
+
+    if (checkStatus() && res().size() == 1)
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        jsonReader.parse(res().at(0)->get_payload(), jsonResponse);
+
+        if (jsonResponse.isMember("count") &&
+            jsonResponse["count"].isIntegral())
+        {
+            m_count = jsonResponse["count"].asUInt();
+            valid = true;
+        }
+    }
+
+    return valid;
+}
+
+std::size_t GetNumPoints::count() const
+{
+    return m_count;
+}
+
+
+
+// GetSchema exchange
+
+GetSchema::GetSchema(const std::string& sessionId)
+    : Exchange("schema")
+    , m_dimData()
+{
+    m_req["session"] = sessionId;
+}
+
+bool GetSchema::check()
+{
+    bool valid(false);
+
+    if (checkStatus() && res().size() == 1)
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        jsonReader.parse(res().at(0)->get_payload(), jsonResponse);
+
+        if (jsonResponse.isMember("schema") &&
+            jsonResponse["schema"].isArray())
+        {
+            Json::Value jsonDimArray(jsonResponse["schema"]);
+
+            for (std::size_t i(0); i < jsonDimArray.size(); ++i)
+            {
+                const Json::Value& jsonDim(
+                        jsonDimArray[static_cast<Json::ArrayIndex>(i)]);
+
+                const Dimension::Id::Enum id(
+                        Dimension::id(jsonDim["name"].asString()));
+
+                const Dimension::Type::Enum type(
+                    static_cast<Dimension::Type::Enum>(
+                        static_cast<int>(Dimension::fromName(
+                            jsonDim["type"].asString())) |
+                        std::stoi(jsonDim["size"].asString())));
+
+                m_dimData.push_back(DimData(id, type));
+            }
+
+            valid = true;
+        }
+    }
+
+    return valid;
+}
+
+std::vector<DimData> GetSchema::schema() const
+{
+    return m_dimData;
+}
+
+
+
+// Read exchange
+
+Read::Read(
+        PointViewPtr view,
+        const PointLayoutPtr layout,
+        const std::string& sessionId,
+        bool compress,
+        int offset,
+        int count)
+    : Exchange("read")
+    , m_view(view)
+    , m_layout(layout)
+    , m_initialized(false)
+    , m_error(false)
+    , m_pointsToRead(0)
+    , m_numBytes(0)
+    , m_numBytesReceived(0)
+    , m_data()
+{
+    m_req["session"] = sessionId;
+    m_req["compress"] = compress;
+    m_req["start"] = offset;
+    if (count != -1) m_req["count"] = count;
+}
+
+bool Read::check()
+{
+    bool valid(false);
+
+    if (!m_error && checkStatus() && res().size() >= 1)
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        jsonReader.parse(res().at(0)->get_payload(), jsonResponse);
+
+        if (jsonResponse.isMember("numPoints") &&
+            jsonResponse["numPoints"].isIntegral() &&
+            jsonResponse.isMember("numBytes") &&
+            jsonResponse["numBytes"].isIntegral())
+        {
+            m_pointsToRead =
+                std::max<int>(jsonResponse["numPoints"].asInt(), 0);
+            m_numBytes =
+                std::max<int>(jsonResponse["numBytes"].asInt(), 0);
+
+            if (m_pointsToRead * m_layout->pointSize() != m_numBytes)
+            {
+                valid = false;
+                m_error = true;
+            }
+            else
+            {
+                valid = true;
+            }
+        }
+    }
+
+    return valid;
+}
+
+std::size_t Read::numRead() const
+{
+    return m_pointsToRead;
+}
+
+ReadUncompressed::ReadUncompressed(
+        PointViewPtr view,
+        const PointLayoutPtr layout,
+        const std::string& sessionId,
+        int offset,
+        int count)
+    : Read(view, layout, sessionId, false, offset, count)
+{ }
+
+bool ReadUncompressed::done()
+{
+    return (m_initialized && m_numBytesReceived >= m_numBytes) || m_error;
+}
+
+void ReadUncompressed::handleRx(const message_ptr message)
+{
+    if (!m_initialized)
+    {
+        m_initialized = check();
+        if (!m_initialized) m_error = true;
+    }
+    else
+    {
+        if (message->get_opcode() == websocketpp::frame::opcode::binary)
+        {
+            const std::string& bytes(message->get_payload());
+            const std::size_t rawNumBytes(bytes.size());
+            const std::size_t stride(m_layout->pointSize());
+
+            m_data.insert(m_data.end(), bytes.begin(), bytes.end());
+
+            const std::size_t wholePoints(m_data.size() / stride);
+
+            PointId nextId(m_view->size());
+            const PointId doneId(nextId + wholePoints);
+
+            const char* pos(m_data.data());
+
+            while (nextId < doneId)
+            {
+                for (const auto& dim : m_layout->dims())
+                {
+                    m_view->setField(
+                            dim,
+                            m_layout->dimType(dim),
+                            nextId,
+                            pos);
+
+                    pos += m_layout->dimSize(dim);
+                }
+
+                ++nextId;
+            }
+
+            m_numBytesReceived += rawNumBytes;
+            m_data.assign(
+                    m_data.begin() + wholePoints * stride,
+                    m_data.end());
+        }
+        else
+        {
+            m_error = true;
+        }
+    }
+}
+
+#ifdef PDAL_HAVE_LAZPERF
+ReadCompressed::ReadCompressed(
+        PointViewPtr view,
+        const PointLayoutPtr layout,
+        const std::string& sessionId,
+        int offset,
+        int count)
+    : Read(view, layout, sessionId, true, offset, count)
+    , m_decompressionThread()
+    , m_compressionStream()
+    , m_decompressor(m_compressionStream, layout->dimTypes())
+    , m_done(false)
+    , m_doneCv()
+    , m_doneMutex()
+    , m_mutex()
+{ }
+
+bool ReadCompressed::done()
+{
+    std::unique_lock<std::mutex> lock(m_doneMutex);
+    m_doneCv.wait(lock, [this]()->bool { return m_done; });
+    return true;
+}
+
+void ReadCompressed::handleRx(const message_ptr message)
+{
+    std::lock_guard<std::mutex> lock(m_mutex);
+    if (!m_initialized)
+    {
+        m_initialized = check();
+        if (!m_initialized) m_error = true;
+
+        m_data.resize(m_numBytes);
+
+        m_decompressionThread = std::thread([this]()->void {
+            m_decompressor.decompress(m_data.data(), m_data.size());
+
+            const char* pos(m_data.data());
+            for (PointId i(0); i < m_pointsToRead; ++i)
+            {
+                for (const auto& dim : m_layout->dims())
+                {
+                    m_view->setField(
+                            dim,
+                            m_layout->dimType(dim),
+                            i,
+                            pos);
+
+                    pos += m_layout->dimSize(dim);
+                }
+            }
+
+            m_done = true;
+            m_doneCv.notify_all();
+        });
+
+        m_decompressionThread.detach();
+    }
+    else
+    {
+        if (message->get_opcode() == websocketpp::frame::opcode::binary)
+        {
+            const std::string& bytes(message->get_payload());
+
+            m_compressionStream.putBytes(
+                    reinterpret_cast<const uint8_t*>(bytes.data()),
+                    bytes.size());
+        }
+        else
+        {
+            m_error = true;
+        }
+    }
+}
+#endif
+
+
+// Destroy exchange
+
+Destroy::Destroy(const std::string& sessionId)
+    : Exchange("destroy")
+{
+    m_req["session"] = sessionId;
+}
+
+bool Destroy::check()
+{
+    return checkStatus() && res().size() == 1;
+}
+
+} // namespace exchanges
+} // namespace pdal
+
diff --git a/plugins/greyhound/io/Exchanges.hpp b/plugins/greyhound/io/Exchanges.hpp
new file mode 100644
index 0000000..d232ab6
--- /dev/null
+++ b/plugins/greyhound/io/Exchanges.hpp
@@ -0,0 +1,196 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <string>
+#include <vector>
+#include <mutex>
+#include <condition_variable>
+#include <thread>
+
+#include <pdal/Dimension.hpp>
+#include <pdal/Compression.hpp>
+
+#include "WebSocketClient.hpp"
+#include "GreyhoundReader.hpp"
+#include "CompressionStream.hpp"
+
+namespace pdal
+{
+namespace exchanges
+{
+
+struct DimData
+{
+    DimData(Dimension::Id::Enum id, Dimension::Type::Enum type)
+        : id(id)
+        , type(type)
+    { }
+
+    const Dimension::Id::Enum id;
+    const Dimension::Type::Enum type;
+};
+
+class Exchange : public WebSocketExchange
+{
+protected:
+    Exchange(const std::string& command);
+
+    bool checkStatus() const;
+};
+
+class CreateSession : public Exchange
+{
+public:
+    CreateSession(const std::string& pipelineId);
+
+    virtual bool check();
+
+    std::string getSession() const;
+
+private:
+    std::string m_session;
+};
+
+class GetNumPoints : public Exchange
+{
+public:
+    GetNumPoints(const std::string& sessionId);
+
+    virtual bool check();
+
+    std::size_t count() const;
+
+private:
+    std::size_t m_count;
+};
+
+class GetSchema : public Exchange
+{
+public:
+    GetSchema(const std::string& sessionId);
+
+    virtual bool check();
+
+
+    std::vector<DimData> schema() const;
+
+private:
+    std::vector<DimData> m_dimData;
+};
+
+class Read : public Exchange
+{
+public:
+    Read(
+            PointViewPtr view,
+            const PointLayoutPtr layout,
+            const std::string& sessionId,
+            bool compress,
+            int offset,
+            int count);
+
+    virtual bool check();
+    virtual bool done() = 0;
+    virtual void handleRx(const message_ptr message) = 0;
+
+    std::size_t numRead() const;
+
+protected:
+    PointViewPtr m_view;
+    const PointLayoutPtr m_layout;
+
+    bool m_initialized;
+    bool m_error;
+    std::size_t m_pointsToRead;
+    std::size_t m_numBytes;
+    std::size_t m_numBytesReceived;
+    std::vector<char> m_data;
+};
+
+class ReadUncompressed : public Read
+{
+public:
+    ReadUncompressed(
+            PointViewPtr view,
+            const PointLayoutPtr,
+            const std::string& sessionId,
+            int offset = 0,
+            int count = -1);
+
+    virtual bool done();
+    virtual void handleRx(const message_ptr message);
+};
+
+#ifdef PDAL_HAVE_LAZPERF
+class ReadCompressed : public Read
+{
+public:
+    ReadCompressed(
+            PointViewPtr view,
+            const PointLayoutPtr,
+            const std::string& sessionId,
+            int offset = 0,
+            int count = -1);
+
+    virtual bool done();
+    virtual void handleRx(const message_ptr message);
+
+private:
+    std::thread m_decompressionThread;
+
+    CompressionStream m_compressionStream;
+
+    LazPerfDecompressor<CompressionStream> m_decompressor;
+
+    bool m_done;
+    std::condition_variable m_doneCv;
+    std::mutex m_doneMutex;
+
+    std::mutex m_mutex;
+};
+#endif
+
+class Destroy: public Exchange
+{
+public:
+    Destroy(const std::string& sessionId);
+
+    virtual bool check();
+};
+
+} // namespace exchanges
+} // namespace pdal
+
diff --git a/plugins/greyhound/io/GreyhoundReader.cpp b/plugins/greyhound/io/GreyhoundReader.cpp
new file mode 100644
index 0000000..ff8c102
--- /dev/null
+++ b/plugins/greyhound/io/GreyhoundReader.cpp
@@ -0,0 +1,134 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GreyhoundReader.hpp"
+
+#include "Exchanges.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.greyhound",
+    "Greyhound Reader",
+    "http://pdal.io/stages/readers.greyhound.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, GreyhoundReader, Reader, s_info)
+
+std::string GreyhoundReader::getName() const { return s_info.name; }
+
+GreyhoundReader::GreyhoundReader()
+    : Reader()
+    , m_url()
+    , m_pipelineId()
+    , m_sessionId()
+    , m_wsClient()
+    , m_numPoints(0)
+    , m_index(0)
+{ }
+
+GreyhoundReader::~GreyhoundReader()
+{
+    // Tell Greyhound we're done using this session.
+    exchanges::Destroy destroyExchange(m_sessionId);
+    m_wsClient.exchange(destroyExchange);
+}
+
+void GreyhoundReader::initialize()
+{
+    // Create remote PDAL session.
+    exchanges::CreateSession createExchange(m_pipelineId);
+    m_wsClient.exchange(createExchange);
+    m_sessionId = createExchange.getSession();
+}
+
+void GreyhoundReader::processOptions(const Options& options)
+{
+    m_url = options.getValueOrThrow<std::string>("url");
+    m_pipelineId = options.getValueOrThrow<std::string>("pipelineId");
+
+    m_wsClient.initialize(m_url);
+}
+
+void GreyhoundReader::addDimensions(PointLayoutPtr layout)
+{
+    // Get Greyhound schema.
+    exchanges::GetSchema schemaExchange(m_sessionId);
+    m_wsClient.exchange(schemaExchange);
+
+    std::vector<exchanges::DimData> dimData = schemaExchange.schema();
+
+    for (const auto& dim : dimData)
+    {
+        layout->registerDim(dim.id, dim.type);
+    }
+
+    m_layout = layout;
+}
+
+void GreyhoundReader::ready(PointTableRef)
+{
+    // Get number of points.
+    exchanges::GetNumPoints numPointsExchange(m_sessionId);
+    m_wsClient.exchange(numPointsExchange);
+    m_numPoints = numPointsExchange.count();
+}
+
+point_count_t GreyhoundReader::read(
+        PointViewPtr view,
+        const point_count_t count)
+{
+    // Read data.
+#ifdef PDAL_HAVE_LAZPERF
+    exchanges::ReadCompressed readExchange(
+#else
+    exchanges::ReadUncompressed readExchange(
+#endif
+            view,
+            m_layout,
+            m_sessionId,
+            m_index,
+            count);
+
+    m_wsClient.exchange(readExchange);
+    return readExchange.numRead();
+}
+
+bool GreyhoundReader::eof() const
+{
+    return m_index >= m_numPoints;
+}
+
+} // namespace pdal
+
diff --git a/plugins/greyhound/io/GreyhoundReader.hpp b/plugins/greyhound/io/GreyhoundReader.hpp
new file mode 100644
index 0000000..722864a
--- /dev/null
+++ b/plugins/greyhound/io/GreyhoundReader.hpp
@@ -0,0 +1,73 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "WebSocketClient.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL GreyhoundReader : public pdal::Reader
+{
+public:
+    GreyhoundReader();
+    ~GreyhoundReader();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    std::string m_url;
+    std::string m_pipelineId;
+    std::string m_sessionId;
+    PointLayoutPtr m_layout;
+    WebSocketClient m_wsClient;
+    point_count_t m_numPoints;
+    point_count_t m_index;
+
+    virtual void initialize();
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual bool eof() const;
+};
+
+} // namespace pdal
+
diff --git a/plugins/greyhound/io/WebSocketClient.cpp b/plugins/greyhound/io/WebSocketClient.cpp
new file mode 100644
index 0000000..ecef27a
--- /dev/null
+++ b/plugins/greyhound/io/WebSocketClient.cpp
@@ -0,0 +1,158 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <thread>
+
+#include "WebSocketClient.hpp"
+
+#include <websocketpp/config/asio_no_tls_client.hpp>
+#include <websocketpp/client.hpp>
+#include <pdal/pdal_types.hpp>
+
+namespace pdal
+{
+
+WebSocketClient::WebSocketClient(bool enableLogging)
+    : m_uri()
+    , m_client()
+    , m_jsonReader()
+    , m_cv()
+    , m_mutex()
+    , m_initialized(false)
+{
+    if (!enableLogging)
+    {
+        m_client.clear_access_channels(websocketpp::log::alevel::all);
+        m_client.clear_error_channels(websocketpp::log::elevel::all);
+    }
+
+    m_client.init_asio();
+}
+
+WebSocketClient::WebSocketClient(const std::string& uri, bool enableLogging)
+    : m_uri(uri)
+    , m_client()
+    , m_jsonReader()
+    , m_cv()
+    , m_mutex()
+    , m_initialized(true)
+{
+    if (!enableLogging)
+    {
+        m_client.clear_access_channels(websocketpp::log::alevel::all);
+        m_client.clear_error_channels(websocketpp::log::elevel::all);
+    }
+
+    m_client.init_asio();
+}
+
+void WebSocketClient::initialize(const std::string& uri)
+{
+    m_uri = uri;
+    m_initialized = true;
+}
+
+void WebSocketClient::exchange(WebSocketExchange& exchange)
+{
+    if (!m_initialized) return;
+
+    bool done(false);
+
+    std::thread t([this, &exchange, &done]()
+    {
+        m_client.set_open_handler(
+            [this, &exchange](websocketpp::connection_hdl hdl)
+        {
+            m_client.send(
+                    hdl,
+                    exchange.req().toStyledString(),
+                    websocketpp::frame::opcode::text);
+        });
+
+        m_client.set_message_handler(
+                [this, &exchange, &done](
+                    websocketpp::connection_hdl,
+                    message_ptr msg)
+        {
+            exchange.addResponse(msg);
+
+            std::thread tDone([this, &exchange, &done]() {
+                if (exchange.done())
+                {
+                    std::unique_lock<std::mutex> lock(this->m_mutex);
+                    done = true;
+                    lock.unlock();
+                    this->m_cv.notify_all();
+                }
+            });
+
+            tDone.detach();
+        });
+
+        websocketpp::lib::error_code ec;
+        m_client.reset();
+        m_client.connect(m_client.get_connection(m_uri, ec));
+        m_client.run();
+    });
+
+    t.detach();
+
+    std::unique_lock<std::mutex> lock(m_mutex);
+    m_cv.wait(lock, [&done]()->bool { return done; });
+
+    m_client.stop();
+
+    if (!exchange.check())
+    {
+        Json::Value jsonResponse;
+        Json::Reader jsonReader;
+        std::string message("Websocket exchange response validation failed");
+
+        if (exchange.res().size())
+        {
+            jsonReader.parse(
+                    exchange.res().at(0)->get_payload(),
+                    jsonResponse);
+
+            message += ":\n" + jsonResponse.toStyledString();
+
+            std::cout << message << std::endl;
+        }
+
+        throw new pdal::pdal_error(message);
+    }
+}
+
+} // namespace pdal
+
diff --git a/plugins/greyhound/io/WebSocketClient.hpp b/plugins/greyhound/io/WebSocketClient.hpp
new file mode 100644
index 0000000..b645b6d
--- /dev/null
+++ b/plugins/greyhound/io/WebSocketClient.hpp
@@ -0,0 +1,96 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <condition_variable>
+#include <mutex>
+
+#include <websocketpp/config/asio_no_tls_client.hpp>
+#include <websocketpp/client.hpp>
+
+#include <json/json.h>
+
+namespace pdal
+{
+
+typedef websocketpp::client<websocketpp::config::asio_client> asioClient;
+typedef websocketpp::config::asio_client::message_type::ptr message_ptr;
+
+class WebSocketExchange
+{
+public:
+    const Json::Value& req() const { return m_req; }
+    const std::vector<message_ptr>& res() const { return m_res; }
+    void addResponse(message_ptr message)
+    {
+        m_res.push_back(message);
+        handleRx(message);
+    }
+
+    virtual bool done() { return true; }
+    virtual bool check() { return true; }
+
+protected:
+    WebSocketExchange() : m_req(), m_res() { }
+    virtual void handleRx(const message_ptr) { }
+
+    Json::Value m_req;
+
+private:
+    std::vector<message_ptr> m_res;
+};
+
+class WebSocketClient
+{
+public:
+    WebSocketClient(bool enableLogging = false);
+    WebSocketClient(const std::string& uri, bool enableLogging = false);
+
+    void initialize(const std::string& uri);
+    void exchange(WebSocketExchange& exchange);
+
+private:
+    std::string m_uri;
+    asioClient m_client;
+    Json::Reader m_jsonReader;
+
+    std::condition_variable m_cv;
+    std::mutex m_mutex;
+
+    bool m_initialized;
+};
+
+} // namespace pdal
+
diff --git a/plugins/hexbin/CMakeLists.txt b/plugins/hexbin/CMakeLists.txt
new file mode 100644
index 0000000..a0bc9e7
--- /dev/null
+++ b/plugins/hexbin/CMakeLists.txt
@@ -0,0 +1,22 @@
+#
+# HexBin plugin CMake configuration
+#
+
+find_package(Hexer)
+if (HEXER_FOUND)
+    include_directories(${HEXER_INCLUDE_DIR})
+    add_definitions(-DHAVE_HEXER=1)
+
+    set(srcs filters/HexBin.cpp)
+    set(incs filters/HexBin.hpp)
+
+    PDAL_ADD_PLUGIN(libname filter hexbin
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${HEXER_LIBRARY})
+
+    if (WITH_TESTS)
+        PDAL_ADD_TEST(hexbintest
+            FILES test/HexbinFilterTest.cpp
+            LINK_WITH ${libname})
+    endif()
+endif()
diff --git a/plugins/hexbin/filters/HexBin.cpp b/plugins/hexbin/filters/HexBin.cpp
new file mode 100644
index 0000000..95266bb
--- /dev/null
+++ b/plugins/hexbin/filters/HexBin.cpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2013, Andrew Bell (andrew.bell.ia at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "HexBin.hpp"
+
+#include <hexer/HexIter.hpp>
+#include <pdal/StageFactory.hpp>
+
+using namespace hexer;
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.hexbin",
+    "Tessellate the point's X/Y domain and determine point density and/or point boundary.",
+    "http://pdal.io/stages/filters.hexbin.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, HexBin, Filter, s_info)
+
+void HexBin::processOptions(const Options& options)
+{
+    m_sampleSize = options.getValueOrDefault<uint32_t>("sample_size", 5000);
+    m_density = options.getValueOrDefault<uint32_t>("threshold", 15);
+    m_outputTesselation = options.getValueOrDefault<bool>("output_tesselation", false);
+
+    if (options.hasOption("edge_length"))
+        m_edgeLength = options.getValueOrDefault<double>("edge_length", 0.0);
+    else
+        // Backward compatability.
+        m_edgeLength = options.getValueOrDefault<double>("edge_size", 0.0);
+}
+
+
+void HexBin::ready(PointTableRef table)
+{
+    if (m_edgeLength == 0.0)  // 0 can always be represented exactly.
+    {
+        m_grid.reset(new HexGrid(m_density));
+        m_grid->setSampleSize(m_sampleSize);
+    }
+    else
+        m_grid.reset(new HexGrid(m_edgeLength * sqrt(3), m_density));
+}
+
+
+void HexBin::filter(PointView& view)
+{
+    for (PointId idx = 0; idx < view.size(); ++idx)
+    {
+        double x = view.getFieldAs<double>(pdal::Dimension::Id::X, idx);
+        double y = view.getFieldAs<double>(pdal::Dimension::Id::Y, idx);
+        m_grid->addPoint(x, y);
+    }
+}
+
+
+void HexBin::done(PointTableRef table)
+{
+    m_grid->processSample();
+    m_grid->findShapes();
+    m_grid->findParentPaths();
+
+    std::ostringstream offsets;
+    offsets << "MULTIPOINT (";
+    for (int i = 0; i < 6; ++i)
+    {
+        hexer::Point p = m_grid->offset(i);
+        offsets << p.m_x << " " << p.m_y;
+        if (i != 5)
+            offsets << ", ";
+    }
+    offsets << ")";
+
+    m_metadata.add("edge_length", m_edgeLength, "The edge length of the "
+        "hexagon to use in situations where you do not want to estimate "
+        "based on a sample");
+    m_metadata.add("threshold", m_density, "Minimum number of points inside "
+        "a hexagon to be considered full");
+    m_metadata.add("sample_size", m_sampleSize, "Number of samples to use "
+        "when estimating hexagon edge size. Specify 0.0 or omit options "
+        "for edge_size if you want to compute one.");
+    m_metadata.add("hex_offsets", offsets.str(), "Offset of hex corners from "
+        "hex centers.");
+    if (m_outputTesselation)
+    {
+
+        MetadataNode hexes = m_metadata.add("hexagons");
+        for (HexIter hi = m_grid->hexBegin(); hi != m_grid->hexEnd(); ++hi)
+        {
+            using namespace boost;
+
+            HexInfo h = *hi;
+
+            MetadataNode hex = hexes.addList("hexagon");
+            hex.add("density", h.density());
+
+            hex.add("gridpos", lexical_cast<std::string>(h.xgrid()) + " " +
+                lexical_cast<std::string>(h.ygrid()));
+            std::ostringstream oss;
+            // Using stream limits precision (default 6)
+            oss << "POINT (" << h.x() << " " << h.y() << ")";
+            hex.add("center", oss.str());
+        }
+    }
+
+    std::ostringstream polygon;
+    polygon.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    polygon.precision(m_options.getValueOrDefault<uint32_t>("precision", 8));
+    m_grid->toWKT(polygon);
+    m_metadata.add("boundary", polygon.str(),
+        "Boundary MULTIPOLYGON of domain");
+}
+
+} // namespace pdal
diff --git a/plugins/hexbin/filters/HexBin.hpp b/plugins/hexbin/filters/HexBin.hpp
new file mode 100644
index 0000000..2a73bcc
--- /dev/null
+++ b/plugins/hexbin/filters/HexBin.hpp
@@ -0,0 +1,75 @@
+/******************************************************************************
+* Copyright (c) 2013, Andrew Bell (andrew.bell.ia at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+
+#include <hexer/Mathpair.hpp>
+#include <hexer/HexGrid.hpp>
+#include <hexer/Processor.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL HexBin : public Filter
+{
+public:
+    HexBin() : Filter()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const { return "filters.hexbin"; }
+
+private:
+
+    std::unique_ptr<hexer::HexGrid> m_grid;
+    std::string m_xDimName;
+    std::string m_yDimName;
+    uint32_t m_sampleSize;
+    int32_t m_density;
+    double m_edgeLength;
+    bool m_outputTesselation;
+
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual void filter(PointView& view);
+    virtual void done(PointTableRef table);
+
+    HexBin& operator=(const HexBin&); // not implemented
+    HexBin(const HexBin&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/hexbin/test/HexbinFilterTest.cpp b/plugins/hexbin/test/HexbinFilterTest.cpp
new file mode 100644
index 0000000..4293cc6
--- /dev/null
+++ b/plugins/hexbin/test/HexbinFilterTest.cpp
@@ -0,0 +1,96 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/SpatialReference.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/PointView.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+void printChildren(std::ostream& out, MetadataNode m, int depth = 0)
+{
+    std::vector<MetadataNode> children = m.children();
+    for (auto mi = children.begin(); mi != children.end(); ++mi)
+    {
+        MetadataNode& c = *mi;
+        for (int i = 0; i < depth; i++)
+            out << "\t";
+        out << c.name() << " : " << c.value() << "\n";
+        printChildren(out, c, depth + 1);
+    }
+}
+
+TEST(HexbinFilterTest, HexbinFilterTest_test_1)
+{
+    StageFactory f;
+
+    Options options;
+    options.add("filename", Support::datapath("las/hextest.las"));
+    options.add("output_tesselation", true);
+    options.add("sample_size", 5000, "Number of samples to use "
+        "when estimating hexagon edge size. Specify 0.0 for edge_size if "
+        "you want to compute one.");
+    options.add("threshold", 1, "Number of points necessary inside "
+        "a hexagon to be considered full");
+    options.add("edge_length", 0.666666666, "The edge size of the hexagon to "
+        "use in situations where you do not want to estimate based on "
+        "a sample");
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.las"));
+    EXPECT_TRUE(reader.get());
+    reader->setOptions(options);
+
+    std::unique_ptr<Stage> hexbin(f.createStage("filters.hexbin"));
+    EXPECT_TRUE(hexbin.get());
+    hexbin->setOptions(options);
+    hexbin->setInput(*reader);
+
+    PointTable table;
+
+    hexbin->prepare(table);
+    hexbin->execute(table);
+
+    MetadataNode m = table.metadata();
+    m = m.findChild(hexbin->getName());
+
+    std::string filename = Support::temppath("hexbin.txt");
+    std::ofstream out(filename);
+    printChildren(out, m);
+    out.close();
+    FileUtils::deleteFile(filename);
+}
diff --git a/plugins/icebridge/CMakeLists.txt b/plugins/icebridge/CMakeLists.txt
new file mode 100644
index 0000000..d0f3400
--- /dev/null
+++ b/plugins/icebridge/CMakeLists.txt
@@ -0,0 +1,29 @@
+#
+# Icebridge plugin CMake configuration
+#
+
+include (${PDAL_CMAKE_DIR}/hdf5.cmake)
+
+if (NOT PDAL_HAVE_HDF5)
+    message(FATAL "HDF5 not found but is required for Icebridge.")
+else()
+    set(srcs
+        io/IcebridgeReader.cpp
+        io/Hdf5Handler.cpp
+    )
+
+    set(incs
+        io/IcebridgeReader.hpp
+        io/Hdf5Handler.hpp
+    )
+
+    PDAL_ADD_PLUGIN(libname reader icebridge
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${HDF5_LIBRARIES})
+
+    if (WITH_TESTS)
+        PDAL_ADD_TEST(icetest
+            FILES test/IcebridgeReaderTest.cpp
+            LINK_WITH ${libname})
+    endif()
+endif()
diff --git a/plugins/icebridge/io/Hdf5Handler.cpp b/plugins/icebridge/io/Hdf5Handler.cpp
new file mode 100644
index 0000000..03700bc
--- /dev/null
+++ b/plugins/icebridge/io/Hdf5Handler.cpp
@@ -0,0 +1,155 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning, connor at hobu.co
+* 
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "Hdf5Handler.hpp"
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/pdal_types.hpp>
+
+#include <boost/numeric/conversion/cast.hpp>
+
+
+namespace pdal
+{
+
+using namespace hdf5;
+
+Hdf5Handler::Hdf5Handler()
+    : m_numPoints(0)
+    , m_columnDataMap()
+{ }
+
+void Hdf5Handler::initialize(
+        const std::string& filename,
+        const std::vector<Hdf5ColumnData>& columns)
+{
+    try
+    {
+        m_h5File.reset(new H5::H5File(filename, H5F_ACC_RDONLY));
+    }
+    catch (const H5::FileIException&)
+    {
+        throw pdal_error("Could not open HDF5 file.");
+    }
+
+    try
+    {
+        // Open each HDF5 DataSet and its corresponding DataSpace.
+        for (const auto& col : columns)
+        {
+            const std::string dataSetName = col.name;
+            const H5::PredType predType = col.predType;
+            const H5::DataSet dataSet = m_h5File->openDataSet(dataSetName);
+            const H5::DataSpace dataSpace = dataSet.getSpace();
+
+            m_columnDataMap.insert(std::make_pair(
+                        dataSetName,
+                        ColumnData(predType, dataSet, dataSpace)));
+
+            // Does not check whether all the columns are the same length.
+            m_numPoints =
+                std::max((uint64_t)getColumnNumEntries(dataSetName), m_numPoints);
+        }
+    }
+    catch (const H5::Exception&)
+    {
+        throw pdal_error("Could not initialize data set information.");
+    }
+}
+
+void Hdf5Handler::close()
+{
+    m_h5File->close();
+}
+
+uint64_t Hdf5Handler::getNumPoints() const
+{
+    return m_numPoints;
+}
+
+void Hdf5Handler::getColumnEntries(
+        void* data,
+        const std::string& dataSetName,
+        const hsize_t numEntries,
+        const hsize_t offset) const
+{
+    try
+    {
+        const ColumnData& columnData(getColumnData(dataSetName));
+
+        columnData.dataSpace.selectHyperslab(
+                H5S_SELECT_SET,
+                &numEntries,
+                &offset);
+
+        const hsize_t outOffset = 0;
+        const H5::DataSpace outSpace(1, &numEntries);
+        outSpace.selectHyperslab(H5S_SELECT_SET, &numEntries, &outOffset);
+
+        columnData.dataSet.read(
+                data,
+                columnData.predType,
+                outSpace, 
+                columnData.dataSpace);
+    }
+    catch (const H5::Exception&)
+    {
+        throw pdal_error("Could not read from dataset.");
+    }
+}
+
+hsize_t 
+Hdf5Handler::getColumnNumEntries(const std::string& dataSetName) const
+{
+    hsize_t entries = 0;
+
+    getColumnData(dataSetName).dataSpace.getSimpleExtentDims(&entries);
+
+    return entries;
+}
+
+const Hdf5Handler::ColumnData&
+Hdf5Handler::getColumnData(const std::string& dataSetName) const
+{
+    const auto columnDataIt(m_columnDataMap.find(dataSetName));
+
+    if (columnDataIt == m_columnDataMap.end())
+    {
+        throw pdal_error("Could not retrieve column data.");
+    }
+
+    return columnDataIt->second;
+}
+
+} // namespace pdal
+
diff --git a/plugins/icebridge/io/Hdf5Handler.hpp b/plugins/icebridge/io/Hdf5Handler.hpp
new file mode 100644
index 0000000..e33eb67
--- /dev/null
+++ b/plugins/icebridge/io/Hdf5Handler.hpp
@@ -0,0 +1,112 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning, connor at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "H5Cpp.h"
+
+#include <memory>
+#include <vector>
+#include <string>
+#include <map>
+
+namespace pdal
+{
+
+namespace hdf5
+{
+    struct Hdf5ColumnData
+    {
+        Hdf5ColumnData(const std::string& name, const H5::PredType predType)
+            : name(name)
+            , predType(predType)
+        { }
+
+        const std::string name;
+        const H5::PredType predType;
+    };
+}
+
+class Hdf5Handler
+{
+public:
+    Hdf5Handler();
+
+    void initialize(
+            const std::string& filename,
+            const std::vector<hdf5::Hdf5ColumnData>& columns);
+    void close();
+
+    uint64_t getNumPoints() const;
+
+    void getColumnEntries(
+            void* data,
+            const std::string& dataSetName,
+            const hsize_t numEntries,
+            const hsize_t offset) const;
+
+private:
+    struct ColumnData
+    {
+        ColumnData(
+                H5::PredType predType,
+                H5::DataSet dataSet,
+                H5::DataSpace dataSpace)
+            : predType(predType)
+            , dataSet(dataSet)
+            , dataSpace(dataSpace)
+        { }
+
+        ColumnData(H5::PredType predType)
+            : predType(predType)
+            , dataSet()
+            , dataSpace()
+        { }
+
+        H5::PredType predType;
+        H5::DataSet dataSet;
+        H5::DataSpace dataSpace;
+    };
+
+    hsize_t getColumnNumEntries(const std::string& dataSetName) const;
+    const ColumnData& getColumnData(const std::string& dataSetName) const;
+
+    std::unique_ptr<H5::H5File> m_h5File;
+    uint64_t m_numPoints;
+
+    std::map<std::string, ColumnData> m_columnDataMap;
+};
+
+} // namespace pdal
+
diff --git a/plugins/icebridge/io/IcebridgeReader.cpp b/plugins/icebridge/io/IcebridgeReader.cpp
new file mode 100644
index 0000000..3de0e05
--- /dev/null
+++ b/plugins/icebridge/io/IcebridgeReader.cpp
@@ -0,0 +1,193 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning, connor at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "IcebridgeReader.hpp"
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/PointView.hpp>
+
+#include <map>
+
+namespace
+{
+    const std::vector<pdal::hdf5::Hdf5ColumnData> hdf5Columns =
+    {
+        { "instrument_parameters/time_hhmmss",  H5::PredType::NATIVE_FLOAT },
+        { "latitude",                           H5::PredType::NATIVE_FLOAT },
+        { "longitude",                          H5::PredType::NATIVE_FLOAT },
+        { "elevation",                          H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/xmt_sigstr",   H5::PredType::NATIVE_INT   },
+        { "instrument_parameters/rcv_sigstr",   H5::PredType::NATIVE_INT   },
+        { "instrument_parameters/azimuth",      H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/pitch",        H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/roll",         H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/gps_pdop",     H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/pulse_width",  H5::PredType::NATIVE_FLOAT },
+        { "instrument_parameters/rel_time",     H5::PredType::NATIVE_FLOAT }
+    };
+}
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.icebridge",
+    "NASA HDF5-based IceBridge ATM reader. \n" \
+        "See http://nsidc.org/data/docs/daac/icebridge/ilatm1b/index.html \n" \
+        "for more information.",
+    "http://pdal.io/stages/readers.icebridge.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, IcebridgeReader, Reader, s_info)
+
+std::string IcebridgeReader::getName() const { return s_info.name; }
+
+Options IcebridgeReader::getDefaultOptions()
+{
+    Options options;
+    options.add("filename", "", "file to read from");
+    return options;
+}
+
+
+Dimension::IdList IcebridgeReader::getDefaultDimensions()
+{
+    Dimension::IdList ids;
+
+    using namespace Dimension;
+
+    ids.push_back(Id::OffsetTime);
+    ids.push_back(Id::Y);
+    ids.push_back(Id::X);
+    ids.push_back(Id::Z);
+    ids.push_back(Id::StartPulse);
+    ids.push_back(Id::ReflectedPulse);
+    ids.push_back(Id::ScanAngleRank);
+    ids.push_back(Id::Pitch);
+    ids.push_back(Id::Roll);
+    ids.push_back(Id::Pdop);
+    ids.push_back(Id::PulseWidth);
+    ids.push_back(Id::GpsTime);
+    return ids;
+}
+
+
+void IcebridgeReader::addDimensions(PointLayoutPtr layout)
+{
+    return layout->registerDims(getDefaultDimensions());
+}
+
+
+void IcebridgeReader::ready(PointTableRef table)
+{
+    m_hdf5Handler.initialize(m_filename, hdf5Columns);
+    m_index = 0;
+}
+
+
+point_count_t IcebridgeReader::read(PointViewPtr view, point_count_t count)
+{
+    //All data we read for icebridge is currently 4 bytes wide, so
+    //  just allocate once and forget it.
+    //This could be a huge allocation.  Perhaps we should do something
+    //  in the icebridge handler?
+
+    PointId startId = view->size();
+    point_count_t remaining = m_hdf5Handler.getNumPoints() - m_index;
+    count = std::min(count, remaining);
+
+    std::unique_ptr<unsigned char>
+        rawData(new unsigned char[count * sizeof(float)]);
+
+    //Not loving the position-linked data, but fine for now.
+    Dimension::IdList dims = getDefaultDimensions();
+    auto di = dims.begin();
+    for (auto ci = hdf5Columns.begin(); ci != hdf5Columns.end(); ++ci, ++di)
+    {
+        PointId nextId = startId;
+        PointId idx = m_index;
+        const hdf5::Hdf5ColumnData& column = *ci;
+
+        try
+        {
+            m_hdf5Handler.getColumnEntries(rawData.get(), column.name, count,
+                m_index);
+            void *p = (void *)rawData.get();
+
+            // This is ugly but avoids a test in a tight loop.
+            if (column.predType == H5::PredType::NATIVE_FLOAT)
+            {
+                // Offset time is in ms but icebridge stores in seconds.
+                if (*di == Dimension::Id::OffsetTime)
+                {
+                    float *fval = (float *)p;
+                    for (PointId i = 0; i < count; ++i)
+                    {
+                        view->setField(*di, nextId++, *fval * 1000);
+                        fval++;
+                    }
+                }
+                else
+                {
+                    float *fval = (float *)p;
+                    for (PointId i = 0; i < count; ++i)
+                        view->setField(*di, nextId++, *fval++);
+                }
+            }
+            else if (column.predType == H5::PredType::NATIVE_INT)
+            {
+                int32_t *ival = (int32_t *)p;
+                for (PointId i = 0; i < count; ++i)
+                    view->setField(*di, nextId++, *ival++);
+            }
+        }
+        catch(...)
+        {
+            throw icebridge_error("Error fetching column data");
+        }
+    }
+    return count;
+}
+
+
+void IcebridgeReader::done(PointTableRef table)
+{
+    m_hdf5Handler.close();
+}
+
+
+bool IcebridgeReader::eof()
+{
+    return m_index >= m_hdf5Handler.getNumPoints();
+}
+
+} // namespace pdal
diff --git a/plugins/icebridge/io/IcebridgeReader.hpp b/plugins/icebridge/io/IcebridgeReader.hpp
new file mode 100644
index 0000000..c869de8
--- /dev/null
+++ b/plugins/icebridge/io/IcebridgeReader.hpp
@@ -0,0 +1,82 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning, connor at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "Hdf5Handler.hpp"
+
+#include <vector>
+
+namespace pdal
+{
+
+class icebridge_error : public pdal_error
+{
+public:
+    icebridge_error(std::string const& msg) : pdal_error(msg)
+    { }
+};
+
+class PDAL_DLL IcebridgeReader : public pdal::Reader
+{
+public:
+    IcebridgeReader() : pdal::Reader()
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions();
+
+private:
+    Hdf5Handler m_hdf5Handler;
+    point_count_t m_index;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+    virtual bool eof();
+
+    IcebridgeReader& operator=(const IcebridgeReader&);   // Not implemented.
+    IcebridgeReader(const IcebridgeReader&);              // Not implemented.
+};
+
+} // namespace pdal
diff --git a/plugins/icebridge/test/IcebridgeReaderTest.cpp b/plugins/icebridge/test/IcebridgeReaderTest.cpp
new file mode 100644
index 0000000..b8c16e0
--- /dev/null
+++ b/plugins/icebridge/test/IcebridgeReaderTest.cpp
@@ -0,0 +1,153 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning, connor at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+template <typename T>
+void checkDimension(const PointView& data, std::size_t index,
+    Dimension::Id::Enum dim, T expected)
+{
+    float actual = data.getFieldAs<T>(dim, index);
+    EXPECT_FLOAT_EQ(expected, actual);
+}
+
+void checkPoint(
+        const PointView& data,
+        std::size_t index,
+        float time,
+        float latitude,
+        float longitude,
+        float elevation,
+        int xmtSig,
+        int rcvSig,
+        float azimuth,
+        float pitch,
+        float roll,
+        float gpsPdop,
+        float pulseWidth,
+        float relTime)
+{
+    using namespace Dimension;
+    checkDimension(data, index, Id::OffsetTime, time);
+    checkDimension(data, index, Id::Y, latitude);
+    checkDimension(data, index, Id::X, longitude);
+    checkDimension(data, index, Id::Z, elevation);
+    checkDimension(data, index, Id::StartPulse, xmtSig);
+    checkDimension(data, index, Id::ReflectedPulse, rcvSig);
+    checkDimension(data, index, Id::ScanAngleRank, azimuth);
+    checkDimension(data, index, Id::Pitch, pitch);
+    checkDimension(data, index, Id::Roll, roll);
+    checkDimension(data, index, Id::Pdop, gpsPdop);
+    checkDimension(data, index, Id::PulseWidth, pulseWidth);
+    checkDimension(data, index, Id::GpsTime, relTime);
+}
+
+std::string getFilePath()
+{
+    return Support::datapath("icebridge/twoPoints.h5");
+}
+
+TEST(IcebridgeReaderTest, testRead)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> reader(f.createStage("readers.icebridge"));
+    EXPECT_TRUE(reader.get());
+
+    Option filename("filename", getFilePath(), "");
+    Options options(filename);
+    reader->setOptions(options);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 2u);
+
+    checkPoint(
+            *view,
+            0,
+            141437548,     // time
+            82.605319,      // latitude
+            301.406196,     // longitude
+            18.678,         // elevation
+            2408,           // xmtSig
+            181,            // rcvSig
+            49.91,          // azimuth
+            -4.376,         // pitch
+            0.608,          // roll
+            2.9,            // gpsPdop
+            20.0,           // pulseWidth
+            0.0);           // relTime
+
+    checkPoint(
+            *view,
+            1,
+            141437548,     // time
+            82.605287,      // latitude
+            301.404862,     // longitude
+            18.688,         // elevation
+            2642,           // xmtSig
+            173,            // rcvSig
+            52.006,         // azimuth
+            -4.376,         // pitch
+            0.609,          // roll
+            2.9,            // gpsPdop
+            17.0,           // pulseWidth
+            0.0);           // relTime
+}
+
+TEST(IcebridgeReaderTest, testPipeline)
+{
+    PipelineManager manager;
+    PipelineReader reader(manager);
+
+    bool isWriter =
+        reader.readPipeline(Support::configuredpath("icebridge/pipeline.xml"));
+    EXPECT_TRUE(isWriter);
+
+    point_count_t numPoints = manager.execute();
+    EXPECT_EQ(numPoints, 2u);
+    FileUtils::deleteFile(Support::datapath("icebridge/outfile.txt"));
+}
diff --git a/plugins/matlab/CMakeLists.txt b/plugins/matlab/CMakeLists.txt
new file mode 100644
index 0000000..b0f5609
--- /dev/null
+++ b/plugins/matlab/CMakeLists.txt
@@ -0,0 +1,23 @@
+# Matlab plugin
+
+find_package(Matlab REQUIRED)
+
+include_directories(${MATLAB_INCLUDE_DIR})
+add_definitions(-DHAVE_MATLAB=1)
+
+set(inc io/MatlabWriter.hpp)
+set(src io/MatlabWriter.cpp)
+
+PDAL_ADD_PLUGIN(libname writer matlab
+    FILES "${src}" "${inc}"
+    LINK_WITH ${MATLAB_LIBRARIES}
+    )
+
+if (WITH_TESTS)
+    include_directories(io)
+    PDAL_ADD_TEST(matlabtest
+        FILES test/MatlabWriterTest.cpp
+        LINK_WITH ${libname}
+        )
+
+endif()
diff --git a/plugins/matlab/io/MatlabWriter.cpp b/plugins/matlab/io/MatlabWriter.cpp
new file mode 100644
index 0000000..c267846
--- /dev/null
+++ b/plugins/matlab/io/MatlabWriter.cpp
@@ -0,0 +1,164 @@
+/******************************************************************************
+ * Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "MatlabWriter.hpp"
+
+
+namespace pdal
+{
+
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.matlab",
+    "Matlab .mat file writer.",
+    "http://pdal.io/stages/writers.matlab.html");
+
+
+CREATE_SHARED_PLUGIN(1, 0, MatlabWriter, Writer, s_info)
+std::string MatlabWriter::getName() const { return s_info.name; }
+
+
+MatlabWriter::MatlabWriter()
+{}
+
+
+void MatlabWriter::processOptions(const Options& options)
+{}
+
+
+void MatlabWriter::prepared(PointTableRef table)
+{
+    if (m_outputDims.empty())
+    {
+        m_dimTypes = table.layout()->dimTypes();
+    }
+    else
+    {
+        for (std::string& s : m_outputDims)
+        {
+            DimType dimType = table.layout()->findDimType(s);
+            if (dimType.m_id == Dimension::Id::Unknown)
+            {
+                std::ostringstream oss;
+                oss << "Invalid dimension '" << s << "' specified for "
+                    "'output_dims' option.";
+                throw pdal_error(oss.str());
+            }
+            m_dimTypes.push_back(dimType);
+        }
+    }
+}
+
+
+void MatlabWriter::ready(PointTableRef table)
+{
+    m_matfile = matOpen(m_filename.c_str(), "w");
+    if (!m_matfile)
+    {
+        std::stringstream ss;
+        ss << "Could not open file for writing: " << m_filename;
+        throw pdal_error(ss.str());
+    }
+}
+
+
+void MatlabWriter::write(const PointViewPtr view)
+{
+    point_count_t nPoints = view->size();
+    auto nDimensions = m_dimTypes.size();
+
+    std::stringstream dimensionsString;
+    for (size_t i = 0; i < nDimensions; ++i)
+    {
+        if (i > 0) dimensionsString << ",";
+        dimensionsString << Dimension::name(m_dimTypes[i].m_id);
+    }
+    mxArray * dimensionNames = mxCreateString(dimensionsString.str().c_str());
+    if (!dimensionNames)
+    {
+        std::stringstream ss;
+        ss << "Could not create string '" << dimensionsString.str() << "'";
+        throw pdal_error(ss.str());
+    }
+    int result = matPutVariable(m_matfile, "Dimensions", dimensionNames);
+    if (result != 0)
+    {
+        std::stringstream ss;
+        ss << "Could not write dimension names to file: " << m_filename;
+        throw pdal_error(ss.str());
+    }
+
+    mxArray * points = mxCreateDoubleMatrix(nPoints, nDimensions, mxREAL);
+    if (!points) {
+        std::stringstream ss;
+        ss << "Could not create a points array with dimensions " << nPoints << "x" << nDimensions;
+        throw pdal_error(ss.str());
+    }
+
+    double * pointsPtr = mxGetPr(points);
+    // Matlab is column-major
+    for (size_t j = 0; j < nDimensions; ++j)
+    {
+        for (point_count_t i = 0; i < nPoints; ++i)
+        {
+            double value = view->getFieldAs<double>(m_dimTypes[j].m_id, i);
+            memcpy(static_cast<void*>(pointsPtr++),
+                    static_cast<void*>(&value),
+                    sizeof(double));
+        }
+    }
+    result = matPutVariable(m_matfile, "Points", points);
+    if (result != 0)
+    {
+        std::stringstream ss;
+        ss << "Could not write points to file: " << m_filename;
+        throw pdal_error(ss.str());
+    }
+    mxDestroyArray(points);
+}
+
+
+void MatlabWriter::done(PointTableRef table)
+{
+    int result = matClose(m_matfile);
+    if (result != 0)
+    {
+        std::stringstream ss;
+        ss << "Unsuccessful write: " << m_filename;
+        throw pdal_error(ss.str());
+    }
+}
+
+
+}
diff --git a/plugins/matlab/io/MatlabWriter.hpp b/plugins/matlab/io/MatlabWriter.hpp
new file mode 100644
index 0000000..4f8557f
--- /dev/null
+++ b/plugins/matlab/io/MatlabWriter.hpp
@@ -0,0 +1,76 @@
+/******************************************************************************
+ * Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <string>
+
+#include <mat.h>
+
+#include <pdal/Writer.hpp>
+
+
+extern "C" int32_t MatlabWriter_ExitFunc();
+extern "C" PF_ExitFunc MatlabWriter_InitPlugin();
+
+
+namespace pdal
+{
+
+
+class PDAL_DLL MatlabWriter : public Writer
+{
+public:
+
+    static void* create();
+    static int32_t destroy(void*);
+    std::string getName() const;
+
+    MatlabWriter();
+
+private:
+
+    virtual void processOptions(const Options& options);
+    virtual void prepared(PointTableRef table);
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    // Can't use unique_ptr b/c MATFile is an incomplete type.
+    MATFile * m_matfile;
+    DimTypeList m_dimTypes;
+};
+
+
+}
diff --git a/plugins/matlab/test/MatlabWriterTest.cpp b/plugins/matlab/test/MatlabWriterTest.cpp
new file mode 100644
index 0000000..89c490b
--- /dev/null
+++ b/plugins/matlab/test/MatlabWriterTest.cpp
@@ -0,0 +1,107 @@
+/******************************************************************************
+ * Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include "MatlabWriter.hpp"
+
+#include <faux/FauxReader.hpp>
+#include <pdal/StageFactory.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+class MatlabWriterTest : public ::testing::Test
+{
+protected:
+    virtual void SetUp()
+    {
+        Options options;
+        options.add("mode", "ramp");
+        options.add("num_points", 100);
+        m_reader.setOptions(options);
+    }
+
+    FauxReader m_reader;
+
+};
+
+
+TEST_F(MatlabWriterTest, constructor)
+{
+    MatlabWriter writer;
+}
+
+
+TEST_F(MatlabWriterTest, findStage)
+{
+    StageFactory factory;
+    std::unique_ptr<Stage> stage(factory.createStage("writers.matlab"));
+    EXPECT_TRUE(stage.get());
+}
+
+
+TEST_F(MatlabWriterTest, write)
+{
+    Options options;
+    options.add("filename", Support::temppath("out.mat"));
+    MatlabWriter writer;
+    writer.setOptions(options);
+    writer.setInput(m_reader);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+}
+
+
+TEST_F(MatlabWriterTest, outputDims)
+{
+    Options options;
+    options.add("filename", Support::temppath("out.mat"));
+    options.add("output_dims", "X,Y");
+    MatlabWriter writer;
+    writer.setOptions(options);
+    writer.setInput(m_reader);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+}
+
+
+}
diff --git a/plugins/mrsid/CMakeLists.txt b/plugins/mrsid/CMakeLists.txt
new file mode 100644
index 0000000..68284de
--- /dev/null
+++ b/plugins/mrsid/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# MrSID plugin CMake configuration
+#
+
+set(MRSID_ROOT "/Users/hobu/installs/mrsid/Lidar_DSDK" CACHE STRING "Root directory of MrSID install")
+find_package(MrSID)
+if(MRSID_FOUND)
+    message(STATUS "Building with MrSID support")
+
+    include_directories(${MRSID_INCLUDE_DIR})
+    add_definitions(-DHAVE_MRSID=1)
+
+    set(srcs io/MrsidReader.cpp)
+    set(incs io/MrsidReader.hpp)
+
+    PDAL_ADD_PLUGIN(libname reader mrsid
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${MRSID_LIBRARY})
+    if (WITH_TESTS)
+        PDAL_ADD_TEST(mrsidtest
+            FILES test/MrsidTest.cpp
+            LINK_WITH ${libname})
+    endif()
+else()
+    message(STATUS "Building without MrSID support")
+endif()
diff --git a/plugins/mrsid/io/MrsidReader.cpp b/plugins/mrsid/io/MrsidReader.cpp
new file mode 100644
index 0000000..d070be1
--- /dev/null
+++ b/plugins/mrsid/io/MrsidReader.cpp
@@ -0,0 +1,386 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael S. Rosen (michael.rosen at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "MrsidReader.hpp"
+
+#include <lidar/MG4PointReader.h>
+#include <lidar/FileIO.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.mrsid",
+    "MrSID Reader",
+    "http://www.pdal.io/stages/readers.mrsid.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, MrsidReader, Reader, s_info)
+
+std::string MrsidReader::getName() const { return s_info.name; }
+
+MrsidReader::MrsidReader()
+    : pdal::Reader()
+    , m_PS(0), m_iter(NULL)
+    , m_initialized(false)
+{
+}
+
+void MrsidReader::done(PointTableRef)
+{
+    m_iter->release();
+    m_PS->release();
+    m_initialized = false;
+    m_PS = 0;
+    m_iter = 0;
+}
+
+pdal::Dimension::Type::Enum getPDALType(LizardTech::DataType t)
+{
+
+   using namespace Dimension;
+   using namespace Dimension::Type;
+   using namespace LizardTech;
+   switch (t)
+   {
+       case DATATYPE_SINT8:
+           return Signed8;
+       case DATATYPE_UINT8:
+           return Unsigned8;
+       case DATATYPE_SINT16:
+           return Signed16;
+       case DATATYPE_UINT16:
+           return Unsigned16;
+       case DATATYPE_SINT32:
+           return Signed32;
+       case DATATYPE_UINT32:
+           return Unsigned32;
+       case DATATYPE_SINT64:
+           return Signed64;
+       case DATATYPE_UINT64:
+           return Unsigned64;
+       case DATATYPE_FLOAT32:
+           return Float;
+       case DATATYPE_FLOAT64:
+           return Double;
+
+       default:
+           return Double;
+   }
+}
+
+void MrsidReader::addDimensions(PointLayoutPtr layout)
+{
+    using namespace Dimension;
+
+    if (!m_PS)
+        throw pdal_error("MrSID object not initialized!");
+    const LizardTech::PointInfo& pointinfo = m_PS->getPointInfo();
+
+    // add a map for PDAL names that aren't the same as LT ones (GPSTime vs Time)
+    std::map<std::string, std::string> dimensionTranslations;
+    dimensionTranslations.insert(std::pair<std::string, std::string>("Time", "GPSTime"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("NumReturns", "NumberOfReturns"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("ReturnNum", "ReturnNumber"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("ScanDir", "ScanDirectionFlag"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("EdgeFlightLine", "EdgeOfFlightLine"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("ScanAngle", "ScanAngleRank"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("ClassId", "Classification"));
+    dimensionTranslations.insert(std::pair<std::string, std::string>("SourceId", "PointSourceId"));
+
+    for (unsigned int i=0; i<pointinfo.getNumChannels(); i++)
+    {
+        const LizardTech::ChannelInfo &channel = pointinfo.getChannel(i);
+        const char* name = channel.getName();
+        auto translated = dimensionTranslations.find(name);
+        if (translated != dimensionTranslations.end())
+            name = translated->second.c_str();
+
+        LizardTech::DataType t = channel.getDataType();
+        Dimension::Type::Enum pdal_type = getPDALType(t);
+        layout->registerOrAssignDim(name, pdal_type);
+    }
+    m_layout = layout;
+
+}
+
+void MrsidReader::initialize()
+{
+    LT_USE_LIDAR_NAMESPACE
+
+    if (m_initialized)
+        return;
+
+    FileIO *file = FileIO::create();
+    file->init(m_filename.c_str(), "r");
+    m_PS = MG4PointReader::create();
+    m_PS->init(file);
+    file->release();
+    file = NULL;
+
+    m_iter = m_PS->createIterator(m_PS->getBounds(), 1.0,
+        m_PS->getPointInfo(), NULL);
+    m_initialized = true;
+}
+
+void MrsidReader::ready(PointTableRef table, MetadataNode& m)
+{
+    m_index = 0;
+}
+
+Options MrsidReader::getDefaultOptions()
+{
+    Options options;
+    options.add("filename", "", "file to read from");
+    return options;
+}
+
+
+QuickInfo MrsidReader::inspect()
+{
+    QuickInfo qi;
+    std::unique_ptr<PointLayout> layout(new PointLayout());
+
+    MrsidReader::initialize();
+    addDimensions(layout.get());
+
+    BOX3D b(m_PS->getBounds().x.min, m_PS->getBounds().x.max,
+        m_PS->getBounds().y.min, m_PS->getBounds().y.max,
+        m_PS->getBounds().z.min,m_PS->getBounds().z.max);
+
+    Dimension::IdList dims = layout->dims();
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+        qi.m_dimNames.push_back(layout->dimName(*di));
+    if (!Utils::numericCast(m_PS->getNumPoints(), qi.m_pointCount))
+        qi.m_pointCount = std::numeric_limits<point_count_t>::max();
+    qi.m_bounds = b;
+    qi.m_srs = pdal::SpatialReference(m_PS->getWKT());
+    qi.m_valid = true;
+
+    PointTable table;
+    done(table);
+
+    return qi;
+}
+
+void MrsidReader::LayoutToPointInfo(const PointLayout &layout, LizardTech::PointInfo &pointInfo) const
+{
+    using namespace pdal::Dimension;
+    using namespace pdal::Dimension::Type;
+    const Dimension::IdList& dims = layout.dims();
+
+    pointInfo.init(dims.size());
+    for (unsigned int idx=0; idx<dims.size(); idx++)
+    {
+        std::string name = layout.dimName(dims[idx]);
+        Dimension::Type::Enum t = layout.dimType(dims[idx]);
+        size_t size = layout.dimSize(dims[idx]);
+
+        if (Utils::iequals(name, "EdgeOfFlightLine")) name = CHANNEL_NAME_EdgeFlightLine;
+        if (Utils::iequals(name, "Classification")) name = CHANNEL_NAME_ClassId;
+        if (Utils::iequals(name, "ScanAngleRank")) name = CHANNEL_NAME_ScanAngle;
+        if (Utils::iequals(name, "ScanDirectionFlag")) name = CHANNEL_NAME_ScanDir;
+        if (Utils::iequals(name, "GpsTime")) name = CHANNEL_NAME_GPSTime;
+        if (Utils::iequals(name, "PointSourceId")) name = CHANNEL_NAME_SourceId;
+        if (Utils::iequals(name, "ReturnNumber")) name = CHANNEL_NAME_ReturnNum;
+        if (Utils::iequals(name, "NumberOfReturns")) name = CHANNEL_NAME_NumReturns;
+
+        if (t == Double)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_FLOAT64, 64);
+        else if (t == Float)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_FLOAT32, 32);
+        else if (t == Signed64)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_SINT64, 64);
+        else if (t == Signed32)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_SINT32, 32);
+        else if (t == Signed16)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_SINT16, 16);
+        else if (t == Signed8)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_SINT8, 8);
+        else if (t == Unsigned64)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_UINT64, 64);
+        else if (t == Unsigned32)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_UINT32, 32);
+        else if (t == Unsigned16)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_UINT16, 16);
+        else if (t == Unsigned8)
+            pointInfo.getChannel(idx).init(name.c_str(), LizardTech::DATATYPE_UINT8, 8);
+    }
+}
+
+template<typename T>
+T getData(LizardTech::PointData& points, const char* channelId, point_count_t pointIndex)
+{
+    T *pData = static_cast<T*>(points.getChannel(channelId)->getData());
+    T value = static_cast<T>(pData[pointIndex]);
+    return value;
+}
+
+point_count_t MrsidReader::read(PointViewPtr view, point_count_t count)
+{
+    using namespace pdal::Dimension::Type;
+
+    LizardTech::PointData points;
+    LayoutToPointInfo(*m_layout, m_pointInfo);
+
+    points.init(m_pointInfo, (size_t)count);
+    count = m_iter->getNextPoints(points);
+    Dimension::IdList dims = view->dims();
+
+    for (point_count_t pointIndex=0; pointIndex<count; pointIndex++)
+    {
+        for (Dimension::IdList::size_type i=0; i < dims.size(); i++)
+        {
+            Dimension::Id::Enum const& d = dims[i];
+            std::string name = m_layout->dimName(d);
+            Dimension::Type::Enum t = m_layout->dimType(d);
+
+            if (Utils::iequals(name, "X") &&
+                m_pointInfo.hasChannel(CHANNEL_NAME_X))
+            {
+                if (t == Double)
+                {
+                    view->setField<double>( d,
+                                            pointIndex,
+                                            getData<double>(points, CHANNEL_NAME_X, pointIndex));
+                } else if (t == Signed32)
+                {
+                    view->setField<int32_t>(d,
+                                            pointIndex,
+                                            getData<int32_t>(points, CHANNEL_NAME_X, pointIndex));
+                }
+            } else if (Utils::iequals(name, "Y") &&
+                       m_pointInfo.hasChannel(CHANNEL_NAME_Y))
+            {
+                if (t == Double)
+                {
+                    view->setField<double>( d,
+                                            pointIndex,
+                                            getData<double>(points, CHANNEL_NAME_Y, pointIndex));
+                } else if (t == Signed32)
+                {
+                    view->setField<int32_t>(d,
+                                            pointIndex,
+                                            getData<int32_t>(points, CHANNEL_NAME_Y, pointIndex));
+                }
+            } else if (Utils::iequals(name, "Z") &&
+                       m_pointInfo.hasChannel(CHANNEL_NAME_Z))
+            {
+                if (t == Double)
+                {
+                    view->setField<double>( d,
+                                            pointIndex,
+                                            getData<double>(points, CHANNEL_NAME_Z, pointIndex));
+                } else if (t == Signed32)
+                {
+                    view->setField<int32_t>(d,
+                                            pointIndex,
+                                            getData<int32_t>(points, CHANNEL_NAME_Z, pointIndex));
+                }
+            } else if (Utils::iequals(name, "GpsTime") &&
+                       m_pointInfo.hasChannel(CHANNEL_NAME_GPSTime))
+            {
+                view->setField<double>( d,
+                                        pointIndex,
+                                        getData<double>(points, CHANNEL_NAME_GPSTime, pointIndex));
+            }
+            else if (Utils::iequals(name, "Intensity") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_Intensity))
+            {
+                view->setField<uint16_t>(   d,
+                                            pointIndex,
+                                            getData<uint16_t>(points, CHANNEL_NAME_Intensity, pointIndex));
+            }
+            else if (Utils::iequals(name, "ReturnNumber") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_ReturnNum))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_ReturnNum, pointIndex));
+            }
+            else if (Utils::iequals(name, "NumberOfReturns") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_NumReturns))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_NumReturns, pointIndex));
+            }
+            else if (Utils::iequals(name, "ScanDirectionFlag") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_ScanDir))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_ScanDir, pointIndex));
+            }
+            else if (Utils::iequals(name, "ScanAngleRank") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_ScanAngle))
+            {
+                view->setField<int8_t>( d,
+                                        pointIndex,
+                                        getData<int8_t>(points, CHANNEL_NAME_ScanAngle, pointIndex));
+            }
+            else if (Utils::iequals(name, "EdgeOfFlightLine") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_EdgeFlightLine))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_EdgeFlightLine, pointIndex));
+            }
+            else if (Utils::iequals(name, "Classification") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_ClassId))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_ClassId, pointIndex));
+            }
+            else if (Utils::iequals(name, "UserData") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_UserData))
+            {
+                view->setField<uint8_t>(d,
+                                        pointIndex,
+                                        getData<uint8_t>(points, CHANNEL_NAME_UserData, pointIndex));
+            }
+            else if (Utils::iequals(name, "PointSourceId") &&
+                     m_pointInfo.hasChannel(CHANNEL_NAME_SourceId))
+            {
+                view->setField<uint16_t>(   d,
+                                            pointIndex,
+                                            getData<uint16_t>(points, CHANNEL_NAME_SourceId, pointIndex));
+            }
+        }
+    }
+
+    return count;
+}
+
+} // namespaces
diff --git a/plugins/mrsid/io/MrsidReader.hpp b/plugins/mrsid/io/MrsidReader.hpp
new file mode 100644
index 0000000..d1c021f
--- /dev/null
+++ b/plugins/mrsid/io/MrsidReader.hpp
@@ -0,0 +1,103 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael S. Rosen (michael.rosen at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Reader.hpp>
+
+#include <pdal/util/Bounds.hpp>
+
+#include <lidar/PointSource.h>
+#include <lidar/PointData.h>
+#include <lidar/MG4PointReader.h>
+
+
+extern "C" int32_t MrsidReader_ExitFunc();
+extern "C" PF_ExitFunc MrsidReader_InitPlugin();
+
+
+namespace pdal
+{
+
+
+// The MrSIDReader wraps LT's PointSource abstraction
+//
+class PDAL_DLL MrsidReader : public pdal::Reader
+{
+
+public:
+    virtual ~MrsidReader(){};
+    MrsidReader();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+    point_count_t getNumPoints() const
+        { if (m_PS)
+            return m_PS->getNumPoints();
+          else
+            return 0;
+        }
+
+protected:
+    virtual void initialize();
+    virtual void addDimensions(PointLayoutPtr layout);
+private:
+    LizardTech::MG4PointReader *m_PS;
+    LizardTech::PointIterator *m_iter;
+    LizardTech::PointInfo m_pointInfo;
+    PointLayoutPtr m_layout;
+
+    point_count_t m_index;
+
+    MrsidReader& operator=(const MrsidReader&); // not implemented
+    MrsidReader(const MrsidReader&); // not implemented
+
+    void LayoutToPointInfo(const PointLayout &layout, LizardTech::PointInfo &pointInfo) const;
+    virtual QuickInfo inspect();
+    virtual void ready(PointTableRef table)
+        { ready(table, m_metadata); }
+    virtual void ready(PointTableRef table, MetadataNode& m);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+    virtual bool eof()
+        { return m_index >= getNumPoints(); }
+    bool m_initialized;
+};
+
+
+} // namespaces
diff --git a/plugins/mrsid/test/MrsidTest.cpp b/plugins/mrsid/test/MrsidTest.cpp
new file mode 100644
index 0000000..6101ece
--- /dev/null
+++ b/plugins/mrsid/test/MrsidTest.cpp
@@ -0,0 +1,82 @@
+/******************************************************************************
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+
+#include <pdal/PointView.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <las/LasWriter.hpp>
+
+#include "Support.hpp"
+
+#include <iostream>
+
+#ifdef PDAL_COMPILER_GCC
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#endif
+
+
+using namespace pdal;
+
+TEST(MrsidReaderTest, test_one)
+{
+    StageFactory f;
+
+    Options sid_opts;
+    sid_opts.add("filename", Support::datapath("mrsid/Tetons_200k.las.sid"));
+    sid_opts.add("count", 750);
+
+    PointTable table;
+
+    std::shared_ptr<Stage> sid_reader(f.createStage("readers.mrsid"));
+    EXPECT_TRUE(sid_reader.get());
+    sid_reader->setOptions(sid_opts);
+    sid_reader->prepare(table);
+    PointViewSet pbSet = sid_reader->execute(table);
+    EXPECT_EQ(pbSet.size(), 1u);
+    PointViewPtr view = *pbSet.begin();
+    EXPECT_EQ(view->size(), 750u);
+    int32_t sid_x = view->getFieldAs<int32_t>(Dimension::Id::X, 10);
+    int32_t sid_y = view->getFieldAs<int32_t>(Dimension::Id::Y, 10);
+    int32_t sid_z = view->getFieldAs<int32_t>(Dimension::Id::Z, 10);
+    EXPECT_EQ(sid_x, 504577);
+    EXPECT_EQ(sid_y, 4795801);
+    EXPECT_EQ(sid_z, 2505);
+
+}
+
+
diff --git a/plugins/nitf/CMakeLists.txt b/plugins/nitf/CMakeLists.txt
new file mode 100644
index 0000000..5a3b016
--- /dev/null
+++ b/plugins/nitf/CMakeLists.txt
@@ -0,0 +1,63 @@
+#
+# NITF plugin CMake configuration
+#
+
+include(${PDAL_CMAKE_DIR}/nitro.cmake)
+if (NOT NITRO_FOUND)
+    message(FATAL_ERROR "Can't find NITRO support required by NITF.")
+endif()
+
+#
+# NITF Reader
+#
+set(srcs
+    io/NitfFile.cpp
+    io/MetadataReader.cpp
+    io/tre_plugins.cpp
+    io/NitfReader.cpp
+)
+
+set(incs
+    io/NitfFile.hpp
+    io/MetadataReader.hpp
+    io/tre_plugins.hpp
+    io/NitfReader.hpp
+)
+
+PDAL_ADD_PLUGIN(reader_libname reader nitf
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${NITRO_LIBRARIES})
+
+#
+# NITF Writer
+#
+set(srcs
+    io/NitfWriter.cpp
+    io/tre_plugins.cpp
+)
+
+set(incs
+    io/NitfWriter.hpp
+    io/tre_plugins.hpp
+)
+
+PDAL_ADD_PLUGIN(writer_libname writer nitf
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${NITRO_LIBRARIES})
+
+if (WITH_TESTS)
+	set(srcs
+        test/NitfWriterTest.cpp
+    )
+
+    PDAL_ADD_TEST(pdal_io_nitf_writer_test
+        FILES "${srcs}"
+        LINK_WITH ${writer_libname})
+
+    set(srcs
+        test/NitfReaderTest.cpp
+    )
+    PDAL_ADD_TEST(pdal_io_nitf_reader_test
+        FILES "${srcs}"
+        LINK_WITH ${reader_libname})
+endif()
diff --git a/plugins/nitf/io/MetadataReader.cpp b/plugins/nitf/io/MetadataReader.cpp
new file mode 100644
index 0000000..fed6214
--- /dev/null
+++ b/plugins/nitf/io/MetadataReader.cpp
@@ -0,0 +1,415 @@
+/******************************************************************************
+* Copyright (c) 2014, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "MetadataReader.hpp"
+
+#include <pdal/Metadata.hpp>
+
+#include <boost/algorithm/string.hpp>
+
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic ignored "-Wenum-compare"
+#endif
+
+
+namespace pdal
+{
+
+
+MetadataReader::MetadataReader(::nitf::Record& record,
+                               MetadataNode& node,
+                               bool showEmptyFields) :
+    m_record(record),
+    m_node(node),
+    m_showEmptyFields(showEmptyFields)
+{
+    return;
+}
+
+
+MetadataReader::~MetadataReader()
+{
+    return;
+}
+
+
+void MetadataReader::read()
+{
+    //
+    // dump the file header
+    //
+    ::nitf::FileHeader header = m_record.getHeader();
+    ::nitf::FileSecurity security = header.getSecurityGroup();        
+    
+    doFileHeader("FH", header);
+    doSecurity("FH", "F", security);
+    
+    ::nitf::Extensions ext = header.getExtendedSection();
+    doExtensions("FH", ext);
+
+    ::nitf::ListIterator iter;
+    ::nitf::Uint32 num;
+    ::nitf::Uint32 i;
+
+    //
+    // dump the image info, for each image
+    //
+    iter = m_record.getImages().begin();
+    num = m_record.getNumImages();
+    for (i=0; i<num; i++)
+    {
+        const std::string key = "IM:" + std::to_string(i);
+        
+        ::nitf::ImageSegment segment = *iter;
+        ::nitf::ImageSubheader header = segment.getSubheader();
+        
+        doImageSubheader(key, header);
+        
+        ::nitf::Extensions ext = header.getExtendedSection();
+        doExtensions(key, ext);
+        
+        ::nitf::Extensions ext2 = header.getUserDefinedSection();
+        doExtensions(key, ext2);
+    }
+    
+    //
+    // dump the DE info, for each DE
+    //
+    iter = m_record.getDataExtensions().begin();
+    num = m_record.getNumDataExtensions();
+    for (i=0; i<num; i++)
+    {
+        const std::string key = "DE:" + std::to_string(i);
+        
+        ::nitf::DESegment segment = *iter;
+        ::nitf::DESubheader header = segment.getSubheader();
+        ::nitf::FileSecurity security = header.getSecurityGroup();
+        
+        doDESubheader(key, header);
+        
+        ::nitf::Extensions ext = header.getUserDefinedSection();
+        doExtensions(key, ext);
+    }
+}
+
+
+void MetadataReader::writeField(const std::string& parentkey,
+                                const std::string& key,
+                                ::nitf::Field field)
+{
+    std::string v;
+  
+    if (field.getType() == (::nitf::Field::FieldType)NITF_BCS_A)
+    {
+        v = field.toString();
+    }
+    else if (field.getType() == (::nitf::Field::FieldType)NITF_BCS_N)
+    {
+        v = field.toString();
+    }
+    else if (field.getType() == (::nitf::Field::FieldType)NITF_BINARY)
+    {
+	if (key == "FBKGC")
+	{
+            // special case: field is three distinct bytes
+            std::string t = field.toString();
+            v = std::to_string((unsigned int)t[0]) + ", " +
+                std::to_string((unsigned int)t[1]) + ", " +
+                std::to_string((unsigned int)t[2]);
+        }
+        else
+        {
+            v = "(binary)";
+        }
+    }
+    else
+    {
+        throw pdal_error("error reading nitf (2)");
+    }    
+   
+    boost::algorithm::trim(v);
+    const bool blank = (v.length() == 0);    
+    if (!blank || (blank && m_showEmptyFields))
+    {
+        m_node.add<std::string>(parentkey + "." + key, v);
+    }
+    
+    return;
+}
+
+
+void MetadataReader::writeInt(const std::string& parentkey,
+                              const std::string& key,
+                              int thevalue)
+{   
+    m_node.add<std::string>(parentkey + "." + key, std::to_string(thevalue));
+}
+
+
+void MetadataReader::writeString(const std::string& parentkey,
+                                 const std::string& key,
+                                 const std::string& thevalue)
+{   
+    m_node.add<std::string>(parentkey + "." + key, thevalue);
+}
+    
+   
+void MetadataReader::doFileHeader(const std::string& parentkey,
+                                  ::nitf::FileHeader& header)
+{
+    writeField("FH", "FHDR", header.getFileHeader());
+    writeField("FH", "FVER", header.getFileVersion());
+    writeField("FH", "CLEVEL", header.getComplianceLevel());
+    writeField("FH", "STYPE", header.getSystemType());
+    writeField("FH", "OSTAID", header.getOriginStationID());
+    writeField("FH", "FDT", header.getFileDateTime());
+    writeField("FH", "FTITLE", header.getFileTitle());
+    writeField("FH", "FSCLAS", header.getClassification());
+    writeField("FH", "FSCOP", header.getMessageCopyNum());
+    writeField("FH", "FSCPYS", header.getMessageNumCopies());
+    writeField("FH", "ENCRYP", header.getEncrypted());
+    writeField("FH", "FBKGC", header.getBackgroundColor());
+    writeField("FH", "ONAME", header.getOriginatorName());
+    writeField("FH", "OPHONE", header.getOriginatorPhone());
+    writeField("FH", "FL", header.getFileLength());
+    writeField("FH", "HL", header.getHeaderLength());
+    writeField("FH", "NUMI", header.getNumImages());
+    writeField("FH", "NUMS", header.getNumGraphics());
+    //writeField("FH", "???", header.getNumLabels()); //unsupported in 2500c spec
+    writeField("FH", "NUMT", header.getNumTexts());
+    writeField("FH", "NUMDES", header.getNumDataExtensions());
+    writeField("FH", "NUMRES", header.getNumReservedExtensions());
+}
+    
+
+void MetadataReader::doSecurity(const std::string& parentkey,
+                                const std::string& prefix,
+                                ::nitf::FileSecurity& security)
+{
+    writeField(parentkey, prefix + "SCLSY", security.getClassificationSystem());
+    writeField(parentkey, prefix + "SCODE", security.getCodewords());
+    writeField(parentkey, prefix + "SCTLH", security.getControlAndHandling());
+    writeField(parentkey, prefix + "SREL", security.getReleasingInstructions());
+    writeField(parentkey, prefix + "SDCTP", security.getDeclassificationType());
+    writeField(parentkey, prefix + "SDCDT", security.getDeclassificationDate());
+    writeField(parentkey, prefix + "SDCXM", security.getDeclassificationExemption());
+    writeField(parentkey, prefix + "SDG", security.getDowngrade());
+    writeField(parentkey, prefix + "SDGDT", security.getDowngradeDateTime());
+    writeField(parentkey, prefix + "SCLTX", security.getClassificationText());
+    writeField(parentkey, prefix + "SCATP", security.getClassificationAuthorityType());
+    writeField(parentkey, prefix + "SCAUT", security.getClassificationAuthority());
+    writeField(parentkey, prefix + "SCRSN", security.getClassificationReason());
+    writeField(parentkey, prefix + "SSRDT", security.getSecuritySourceDate());
+    writeField(parentkey, prefix + "SCTLN", security.getSecurityControlNumber());
+}
+
+    
+void MetadataReader::doBands(const std::string& key,
+                             ::nitf::ImageSubheader& header)
+{
+    const int nbands = (int)header.getNumImageBands();
+    for (int i=0; i<nbands; i++)
+    {
+        ::nitf::BandInfo bandinfo = header.getBandInfo(i);
+        std::string subkey = key + ".BAND:" + std::to_string(i);
+        doBand(subkey, bandinfo);
+    }
+}
+    
+
+void MetadataReader::doBand(const std::string& key,
+                            ::nitf::BandInfo& band)
+{
+    writeField(key, "IREPBAND", band.getRepresentation());    
+    writeField(key, "ISUBCAT", band.getSubcategory());
+    writeField(key, "IFC", band.getImageFilterCondition());
+    writeField(key, "IMFLT", band.getImageFilterCode());
+    writeField(key, "NLUTS", band.getNumLUTs());
+    writeField(key, "NELUT", band.getBandEntriesPerLUT());
+
+    ::nitf::LookupTable lut = band.getLookupTable();
+    writeInt(key, "num_lookup_tables", lut.getTables());
+    writeInt(key, "num_lookup_entries", lut.getEntries());
+}
+
+
+void MetadataReader::doImageSubheader(const std::string& key,
+                                      ::nitf::ImageSubheader& subheader)
+{
+    writeField(key, "IID1", subheader.getImageId());
+    writeField(key, "IDATIM", subheader.getImageDateAndTime());
+    writeField(key, "TGTID", subheader.getTargetId());
+    writeField(key, "IID2", subheader.getImageTitle());
+    writeField(key, "ISCLAS", subheader.getImageSecurityClass());
+    
+    ::nitf::FileSecurity security = subheader.getSecurityGroup();
+    doSecurity(key, "I", security);
+
+    writeField(key, "ENCRYP", subheader.getEncrypted());
+    writeField(key, "ISORCE", subheader.getImageSource());
+    writeField(key, "NROWS", subheader.getNumRows());
+    writeField(key, "NCOLS", subheader.getNumCols());
+    writeField(key, "PVTYPE", subheader.getPixelValueType());
+    writeField(key, "IREP", subheader.getImageRepresentation());
+    writeField(key, "ICAT", subheader.getImageCategory());
+    writeField(key, "ABPP", subheader.getActualBitsPerPixel());
+    writeField(key, "PJUST", subheader.getPixelJustification());
+    writeField(key, "ICORDS", subheader.getImageCoordinateSystem());
+    writeField(key, "IGEOLO", subheader.getCornerCoordinates());
+    writeField(key, "NICOM", subheader.getNumImageComments());
+
+    ::nitf::List list = subheader.getImageComments();
+    doComments(key, list);
+    
+    writeField(key, "IC", subheader.getImageCompression());
+    writeField(key, "COMRAT", subheader.getCompressionRate());
+    writeField(key, "NBANDS", subheader.getNumImageBands());
+    writeField(key, "XBANDS", subheader.getNumMultispectralImageBands());
+
+    doBands(key, subheader);
+
+    writeField(key, "ISYNC", subheader.getImageSyncCode());
+    writeField(key, "IMODE", subheader.getImageMode());
+    writeField(key, "NBPR", subheader.getNumBlocksPerRow());
+    writeField(key, "NBPC", subheader.getNumBlocksPerCol());
+    writeField(key, "NPPBH", subheader.getNumPixelsPerHorizBlock());
+    writeField(key, "NPPVB", subheader.getNumPixelsPerVertBlock());
+    writeField(key, "NBPP", subheader.getNumBitsPerPixel());
+    writeField(key, "IDLVL", subheader.getImageDisplayLevel());
+    writeField(key, "IALVL", subheader.getImageAttachmentLevel());
+    writeField(key, "ILOC", subheader.getImageLocation());
+    writeField(key, "IMAG", subheader.getImageMagnification());
+}
+    
+
+void MetadataReader::doDESubheader(const std::string& key,
+                                   ::nitf::DESubheader& subheader)
+{
+    writeField(key, "DESID", subheader.getTypeID());
+    writeField(key, "DESVER", subheader.getVersion());
+    writeField(key, "DECLAS", subheader.getSecurityClass());
+
+    ::nitf::FileSecurity security = subheader.getSecurityGroup();
+    doSecurity(key, "DE", security);
+
+    // this is not an internal field, not interesting to users
+    //writeField(key, "DESSHL", subheader.getDataLength());
+}
+
+
+void MetadataReader::doTRE(const std::string& key,
+                           ::nitf::TRE& tre)
+{
+    const std::string& tag = key + "." + tre.getTag();
+
+    // The C interface to nitro has a TREDescription object which
+    // (I think) allows you to enumerate the keys in the
+    // TRE. However, there is no C++ interface for it, so instead
+    // we will use the raw iterator to access each (Key,Value)
+    // pair. we won't use the Value from pair.second() directly,
+    // however: instead, we'll call getField(key) and get the
+    // value as represented by a Field object (which will tell us
+    // the formatting, etc).
+    
+    ::nitf::TREFieldIterator iter = tre.begin();
+    while (iter != tre.end())
+    {
+        try
+        {
+            // nitro will explicitly throw when dereferencing iter
+            // if there's no pair object set (would be nice if
+            // there was a is_valid() function or something...)
+            ::nitf::Pair pair = *iter;
+            
+            const char* key = pair.first();
+            
+            // only put into metadata things that look like legit
+            // stringy things
+            if (strcmp(key, "raw_data") != 0)
+            {
+                ::nitf::Field field = tre.getField(key);
+                writeField(tag, key, field);
+            }
+        }            
+        catch (::except::NullPointerReference&)
+        {
+            // oh, well - skip this one, go to the next iteration
+        }
+        
+        ++iter;
+    }
+
+    return;
+}
+
+    
+void MetadataReader::doExtensions(const std::string& key,
+                                  ::nitf::Extensions& ext)
+{
+    ::nitf::ExtensionsIterator iter = ext.begin();
+    while (iter != ext.end())
+    {
+        ::nitf::TRE tre = *iter;
+
+        doTRE(key, tre);
+
+        ++iter;
+    }
+
+    return;
+}
+    
+
+void MetadataReader::doComments(const std::string& key,
+                                ::nitf::List& list)
+{
+    int i = 0;
+    ::nitf::ListIterator iter = list.begin();
+    while (iter != list.end())
+    {
+        ::nitf::Field field = *iter;
+
+        const std::string subkey = "ICOM:" + std::to_string(i);
+        
+        writeField(key, subkey, field);
+
+        ++i;
+        ++iter;
+    }
+
+    return;
+}
+    
+
+} // namespaces
diff --git a/plugins/nitf/io/MetadataReader.hpp b/plugins/nitf/io/MetadataReader.hpp
new file mode 100644
index 0000000..8ee5692
--- /dev/null
+++ b/plugins/nitf/io/MetadataReader.hpp
@@ -0,0 +1,132 @@
+/******************************************************************************
+* Copyright (c) 2014, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <vector>
+
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wredundant-decls"
+#  pragma GCC diagnostic ignored "-Wextra"
+#  pragma GCC diagnostic ignored "-Wcast-qual"
+   // The following pragma doesn't actually work:
+   //   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653
+   //#  pragma GCC diagnostic ignored "-Wliteral-suffix"
+#endif
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wunused-private-field"
+#endif
+
+#define IMPORT_NITRO_API
+#include <nitro/c++/import/nitf.hpp>
+
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic pop
+#endif
+
+namespace pdal
+{
+    class MetadataNode;
+}
+
+
+namespace pdal
+{
+
+//
+// helper class for processing all the metadata fields
+//
+class PDAL_DLL MetadataReader
+{
+public:
+    MetadataReader(::nitf::Record&, MetadataNode&, bool showEmptyFields=true);
+    ~MetadataReader();
+
+    void read();
+
+private:
+    ::nitf::Record m_record;
+    MetadataNode& m_node;
+    const bool m_showEmptyFields;
+
+    void writeField(const std::string& parentkey,
+                    const std::string& key,
+                    ::nitf::Field field);
+    void writeInt(const std::string& parentkey,
+                  const std::string& key,
+                  int thevalue);
+    void writeString(const std::string& parentkey,
+                     const std::string& key,
+                     const std::string& thevalue);
+
+    void doFileHeader(const std::string& parentkey,
+                      ::nitf::FileHeader&);
+
+    void doSecurity(const std::string& parentkey,
+                    const std::string& prefix,
+                    ::nitf::FileSecurity&);
+
+    void doBands(const std::string& key,
+                 ::nitf::ImageSubheader&);
+    void doBand(const std::string& key,
+                 ::nitf::BandInfo&);
+
+    void doImageSubheader(const std::string& key,
+                          ::nitf::ImageSubheader&);
+
+    void doDESubheader(const std::string& key,
+                      ::nitf::DESubheader&);
+
+    void doExtensions(const std::string& key,
+                      ::nitf::Extensions&);
+
+    void doComments(const std::string& key,
+                    ::nitf::List&);
+
+    void doTRE(const std::string& key,
+               ::nitf::TRE&);
+
+    MetadataReader(const MetadataReader&); // nope
+    MetadataReader& operator=(const MetadataReader&); // nope
+};
+
+
+} // namespaces
diff --git a/plugins/nitf/io/NitfFile.cpp b/plugins/nitf/io/NitfFile.cpp
new file mode 100644
index 0000000..309be5b
--- /dev/null
+++ b/plugins/nitf/io/NitfFile.cpp
@@ -0,0 +1,251 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "NitfFile.hpp"
+
+#include <pdal/Metadata.hpp>
+
+#include <boost/algorithm/string.hpp>
+
+#include "MetadataReader.hpp"
+#include "tre_plugins.hpp"
+
+
+// Set to true if you want the metadata to contain
+// NITF fields that are empty; if false, those fields
+// will be skipped.
+static const bool SHOW_EMPTY_FIELDS = true;
+
+// Set to true to if you want an error thrown if the
+// NITF file does not have a LAS data segment and a
+// corresponding image segment. (Set to false for
+// testing robustness of metadata parsing.)
+static const bool REQUIRE_LIDAR_SEGMENTS = true;
+
+
+namespace pdal
+{
+
+
+NitfFile::NitfFile(const std::string& filename) :
+    m_reader(NULL),
+    m_io(NULL),
+    m_filename(filename),
+    m_validLidarSegments(false),
+    m_lidarImageSegment(0),
+    m_lidarDataSegment(0)
+{
+    register_tre_plugins();
+}
+
+
+NitfFile::~NitfFile()
+{
+    close();
+}
+
+
+void NitfFile::open()
+{
+    if (::nitf::Reader::getNITFVersion(m_filename.c_str()) == NITF_VER_UNKNOWN)
+        throw pdal_error("Unable to determine NITF file version");
+
+    // read the major NITF data structures, courtesy Nitro
+    m_reader = new ::nitf::Reader();
+    try
+    {
+        m_io = new ::nitf::IOHandle(m_filename.c_str());
+    }
+    catch (::nitf::NITFException& e)
+    {
+        throw pdal_error("unable to open NITF file (" + e.getMessage() + ")");
+    }
+    try
+    {
+        m_record = m_reader->read(*m_io);
+    }
+    catch (::nitf::NITFException& e)
+    {
+        throw pdal_error("unable to read NITF file (" + e.getMessage() + ")");
+    }
+
+
+    // find the image segment corresponding the the lidar data, if any
+    const bool imageOK = locateLidarImageSegment();
+    if (REQUIRE_LIDAR_SEGMENTS && !imageOK)
+    {
+        throw pdal_error("Unable to find lidar-compatible image "
+            "segment in NITF file");
+    }
+
+    // find the LAS data hidden in a DE field, if any
+    const bool dataOK = locateLidarDataSegment();
+    if (REQUIRE_LIDAR_SEGMENTS && !dataOK)
+    {
+        throw pdal_error("Unable to find LIDARA data extension segment "
+            "in NITF file");
+    }
+
+    m_validLidarSegments = dataOK && imageOK;
+}
+
+
+void NitfFile::close()
+{
+    if (m_io)
+    {
+        m_io->close();
+        delete m_io;
+        m_io = NULL;
+    }
+
+    delete m_reader;
+    m_reader = NULL;
+}
+
+
+void NitfFile::getLasOffset(uint64_t& offset,
+                            uint64_t& length)
+{
+    offset = 0;
+    length = 0;
+
+    if (!m_validLidarSegments)
+        return;
+
+    ::nitf::ListIterator iter = m_record.getDataExtensions().begin();
+    const ::nitf::Uint32 numSegs = m_record.getNumDataExtensions();
+    for (::nitf::Uint32 segNum=0; segNum<numSegs; segNum++)
+    {
+        if (segNum == m_lidarDataSegment)
+        {
+            ::nitf::DESegment seg = *iter;
+            const ::nitf::Uint64 seg_offset = seg.getOffset();
+            const ::nitf::Uint64 seg_end = seg.getEnd();
+
+            offset = seg_offset;
+            length = seg_end - seg_offset;
+
+            return;
+        }
+
+        iter++;
+    }
+
+    throw pdal_error("error reading nitf (1)");
+}
+
+
+void NitfFile::extractMetadata(MetadataNode& node)
+{
+    MetadataReader mr(m_record, node, SHOW_EMPTY_FIELDS);
+    mr.read();
+}
+
+
+// set the number of the first segment that is likely to be an image
+// of the lidar data, and return true iff we found one
+bool NitfFile::locateLidarImageSegment()
+{
+    // as per 3.2.3 (pag 19) and 3.2.4 (page 39)
+
+    ::nitf::ListIterator iter = m_record.getImages().begin();
+    const ::nitf::Uint32 numSegs = m_record.getNumImages();
+
+    for (::nitf::Uint32 segNum=0; segNum<numSegs; segNum++)
+    {
+        ::nitf::ImageSegment imseg = *iter;
+
+        ::nitf::ImageSubheader subheader = imseg.getSubheader();
+
+        ::nitf::Field field = subheader.getImageId();
+        ::nitf::Field::FieldType fieldType = field.getType();
+        if (fieldType != (::nitf::Field::FieldType)NITF_BCS_A)
+            throw pdal_error("error reading nitf (5)");
+        std::string iid1 = field.toString();
+
+        // BUG: shouldn't allow "None" here!
+        if (iid1 == "INTENSITY " || iid1 == "ELEVATION " ||
+            iid1 == "None      ")
+        {
+            m_lidarImageSegment = segNum;
+            return true;
+        }
+
+        iter++;
+    }
+
+    return false;
+}
+
+
+// set the number of the first segment that is likely to be the LAS
+// file, and return true iff we found it
+bool NitfFile::locateLidarDataSegment()
+{
+    // as per 3.2.5, page 59
+
+    ::nitf::ListIterator iter = m_record.getDataExtensions().begin();
+    const ::nitf::Uint32 numSegs = m_record.getNumDataExtensions();
+    for (::nitf::Uint32 segNum=0; segNum<numSegs; segNum++)
+    {
+        ::nitf::DESegment seg = *iter;
+
+        ::nitf::DESubheader subheader = seg.getSubheader();
+
+        ::nitf::Field idField = subheader.getTypeID();
+        if (idField.getType() != (::nitf::Field::FieldType)NITF_BCS_A)
+            throw pdal_error("error reading nitf (6)");
+
+        ::nitf::Field verField = subheader.getVersion();
+        if (verField.getType() != (::nitf::Field::FieldType)NITF_BCS_N)
+            throw pdal_error("error reading nitf (7)");
+
+        const std::string id = idField.toString();
+        const int ver = (int)verField;
+
+        if (id == "LIDARA DES               " && ver == 1)
+        {
+            m_lidarDataSegment = segNum;
+            return true;
+        }
+
+        iter++;
+    }
+
+    return false;
+}
+
+
+} // namespaces
diff --git a/plugins/nitf/io/NitfFile.hpp b/plugins/nitf/io/NitfFile.hpp
new file mode 100644
index 0000000..847cd05
--- /dev/null
+++ b/plugins/nitf/io/NitfFile.hpp
@@ -0,0 +1,108 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#include <vector>
+
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wredundant-decls"
+#  pragma GCC diagnostic ignored "-Wextra"
+#  pragma GCC diagnostic ignored "-Wcast-qual"
+   // The following pragma doesn't actually work:
+   //   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653
+   //#  pragma GCC diagnostic ignored "-Wliteral-suffix"
+#endif
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wunused-private-field"
+#endif
+
+#define IMPORT_NITRO_API
+#include <nitro/c++/import/nitf.hpp>
+
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic pop
+#endif
+
+namespace pdal
+{
+    class MetadataNode;
+}
+
+
+namespace pdal
+{
+
+//
+// all the processing that is NITF-file specific goes in here
+//
+class PDAL_DLL NitfFile
+{
+public:
+    NitfFile(const std::string& filename);
+    ~NitfFile();
+
+    void open();
+    void close();
+
+    void getLasOffset(uint64_t& offset, uint64_t& length);
+
+    void extractMetadata(MetadataNode& metadata);
+
+private:
+    bool locateLidarImageSegment();
+    bool locateLidarDataSegment();
+
+    ::nitf::Reader *m_reader;
+    ::nitf::IOHandle *m_io;
+    ::nitf::Record m_record;
+
+    const std::string m_filename;
+    bool m_validLidarSegments;
+    ::nitf::Uint32 m_lidarImageSegment;
+    ::nitf::Uint32 m_lidarDataSegment;
+
+    NitfFile(const NitfFile&); // nope
+    NitfFile& operator=(const NitfFile&); // nope
+};
+
+
+} // namespaces
diff --git a/plugins/nitf/io/NitfReader.cpp b/plugins/nitf/io/NitfReader.cpp
new file mode 100644
index 0000000..f3c6941
--- /dev/null
+++ b/plugins/nitf/io/NitfReader.cpp
@@ -0,0 +1,121 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "NitfFile.hpp"
+#include "NitfReader.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.nitf",
+    "NITF Reader",
+    "http://pdal.io/stages/readers.nitf.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, NitfReader, Reader, s_info)
+
+std::string NitfReader::getName() const { return s_info.name; }
+
+//
+// References:
+//   - NITF 2.1 standard: MIL-STD-2500C (01 May 2006)
+//   - Lidar implementation profile v1.0 (2010-09-07)
+//
+// To be a proper lidar NITF file, the file must:
+//   - have at least one Image segment ("IM")
+//   - have at least one DES segment ("DE") named LIDARA
+//
+// You could have multiple image segments and LIDARA segments, but the
+// standard doesn't seem to say anything about how you associate which
+// image segment(s) with which LIDARA segment(s). We will assume only
+// one image segment and only one LIDARA segment.
+//
+// We don't support LIDARA segments that are split into multiple DES
+// segments via the DES INDEX mechanism. We also don't support wierd
+// things that Nitro doesn't support: NITF 1.0, streaming segments,
+// and so on.
+//
+// For the metadata, we store:
+//    - the file header fields    --> FH.field_name
+//    - the file header TREs      --> FH.TRE.tre_name
+//    - the IM segment fields     --> IM:0.field_name
+//    - the IM segment TREs       --> IM:0.tre_name.field_name
+//    - the DES fields            --> DE:0.field_name
+//    - the DES TREs              --> DE:0.field_name
+//
+// Note we use a ":N" syntax to indicate which segment is being used,
+// so there is no ambiuity with multisegment NITFs
+//
+// We parse out the TRE fields for those TREs that Nitro recognizes
+// (see tre_plugins.cpp).
+//
+// The dimensions we write out are (precisely) the LAS dimensions; we
+// use the same names, so as not to require upstream stgaes to
+// understand both LAS dimension names and NITF dimension names.
+//
+
+//
+// BUG: we should provide an option to set the SRS of the Stage using
+// the IGEOLO field.
+//
+// BUG: need to implement addDefaultDimensions() so it does what LAS
+// does.
+//
+// BUG: findIMSegment() allows "None" as an image type (for now, just
+// to support the autzen test input)
+//
+
+
+void NitfReader::initialize()
+{
+    NitfFile nitf(m_filename);
+    nitf.open();
+    nitf.getLasOffset(m_offset, m_length);
+    nitf.extractMetadata(m_metadata);
+    m_metadata.add("DESDATA_OFFSET", m_offset);
+    m_metadata.add("DESDATA_LENGTH", m_length);
+
+    nitf.close();
+    LasReader::initialize();
+}
+
+
+void NitfReader::ready(PointTableRef table)
+{
+    // Initialize the LAS stuff with its own metadata node.
+    MetadataNode lasNode = m_metadata.add(LasReader::getName());
+    LasReader::ready(table, lasNode);
+}
+
+} // namespace pdal
diff --git a/plugins/nitf/io/NitfReader.hpp b/plugins/nitf/io/NitfReader.hpp
new file mode 100644
index 0000000..6a4cdfb
--- /dev/null
+++ b/plugins/nitf/io/NitfReader.hpp
@@ -0,0 +1,93 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <boost/iostreams/stream.hpp>
+#include <boost/iostreams/restrict.hpp>
+
+#include <las/LasReader.hpp>
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+
+class PDAL_DLL NitfReader : public LasReader
+{
+typedef boost::iostreams::restriction<std::istream> RDevice;
+typedef boost::iostreams::stream<RDevice> RStream;
+
+public:
+    NitfReader() : LasReader(), m_offset(0), m_length(0), m_istream(NULL)
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+protected:
+    virtual std::istream *createStream()
+    {
+        m_istream = FileUtils::openFile(m_filename);
+        if (!m_istream)
+            return NULL;
+        m_rdevice.reset(new RDevice(*m_istream, m_offset, m_length));
+        m_rstream.reset(new RStream(*m_rdevice));
+        return m_rstream.get();
+    }
+
+    virtual void destroyStream()
+    {
+        m_rstream.reset();
+        m_rdevice.reset();
+        FileUtils::closeFile(m_istream);
+        m_istream = NULL;
+    }
+
+private:
+    uint64_t m_offset;
+    uint64_t m_length;
+
+    std::istream *m_istream;
+    std::unique_ptr<RDevice> m_rdevice;
+    std::unique_ptr<RStream> m_rstream;
+
+    virtual void initialize();
+    virtual void ready(PointTableRef table);
+    NitfReader& operator=(const NitfReader&); // not implemented
+    NitfReader(const NitfReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/nitf/io/NitfWriter.cpp b/plugins/nitf/io/NitfWriter.cpp
new file mode 100644
index 0000000..80e546f
--- /dev/null
+++ b/plugins/nitf/io/NitfWriter.cpp
@@ -0,0 +1,377 @@
+/****************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <memory>
+#include <vector>
+
+#include "NitfWriter.hpp"
+
+#include <pdal/pdal_macros.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wredundant-decls"
+#  pragma GCC diagnostic ignored "-Wextra"
+#  pragma GCC diagnostic ignored "-Wcast-qual"
+   // The following pragma doesn't actually work:
+   //   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653
+   //#  pragma GCC diagnostic ignored "-Wliteral-suffix"
+#endif
+#include <ogr_spatialref.h>
+#include <cpl_conv.h>
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wunused-private-field"
+#endif
+
+#define IMPORT_NITRO_API
+#include <nitro/c++/import/nitf.hpp>
+#include "tre_plugins.hpp"
+
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic pop
+#endif
+
+// NOTES
+//
+// is it legal to write a LAZ file?
+// syntactically, how do we name all the LAS writer options that we will pass to the las writer?
+//
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.nitf",
+    "NITF Writer",
+    "http://pdal.io/stages/writers.nitf.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, NitfWriter, Writer, s_info)
+
+std::string NitfWriter::getName() const { return s_info.name; }
+
+BOX3D reprojectBoxToDD(const SpatialReference& reference, const BOX3D& box)
+{
+    if (reference.empty())
+        return BOX3D();
+
+    BOX3D output(box);
+
+    OGRSpatialReferenceH current =
+        OSRNewSpatialReference(reference.getWKT(SpatialReference::eCompoundOK,
+            false).c_str());
+    OGRSpatialReferenceH dd = OSRNewSpatialReference(0);
+
+    OGRErr err = OSRSetFromUserInput(dd, const_cast<char *>("EPSG:4326"));
+    if (err != OGRERR_NONE)
+        throw std::invalid_argument("could not import coordinate system "
+            "into OGRSpatialReference SetFromUserInput");
+
+    OGRCoordinateTransformationH transform =
+        OCTNewCoordinateTransformation(current, dd);
+
+    int ret = OCTTransform(transform, 1,
+        &output.minx, &output.miny, &output.minz);
+    if (ret == 0)
+    {
+        std::ostringstream msg;
+        msg << "Could not project point for reprojectBoxToDD::min" <<
+            CPLGetLastErrorMsg() << ret;
+        throw pdal_error(msg.str());
+    }
+
+    OCTTransform(transform, 1, &output.maxx, &output.maxy, &output.maxz);
+    if (ret == 0)
+    {
+        std::ostringstream msg;
+        msg << "Could not project point for reprojectBoxToDD::max" <<
+            CPLGetLastErrorMsg() << ret;
+        throw pdal_error(msg.str());
+    }
+
+    OCTDestroyCoordinateTransformation(transform);
+    OSRDestroySpatialReference(current);
+    OSRDestroySpatialReference(dd);
+
+    return output;
+}
+
+
+NitfWriter::NitfWriter()
+{
+    register_tre_plugins();
+}
+
+
+void NitfWriter::processOptions(const Options& options)
+{
+    LasWriter::processOptions(options);
+    m_cLevel = options.getValueOrDefault<std::string>("CLEVEL","03");
+    m_sType = options.getValueOrDefault<std::string>("STYPE","BF01");
+    m_oStationId = options.getValueOrDefault<std::string>("OSTAID","PDAL");
+    m_fileTitle = options.getValueOrDefault<std::string>("FTITLE", "");
+    m_fileClass = options.getValueOrDefault<std::string>("FSCLAS","U");
+    m_origName = options.getValueOrDefault<std::string>("ONAME","");
+    m_origPhone = options.getValueOrDefault<std::string>("OPHONE","");
+    m_securityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
+    m_securityControlAndHandling =
+        options.getValueOrDefault<std::string>("FSCTLH","");
+    m_securityClassificationSystem =
+        options.getValueOrDefault<std::string>("FSCLSY","");
+    m_imgSecurityClass = options.getValueOrDefault<std::string>("FSCLAS","U");
+    m_imgDate = getOptions().getValueOrDefault<std::string>("IDATIM", "");
+    m_imgIdentifier2 = getOptions().getValueOrDefault<std::string>("IID2", "");
+    m_sic = getOptions().getValueOrDefault<std::string>("FSCLTX", "");
+    try
+    {
+        m_aimidb = getOptions().getOption("AIMIDB");
+    }
+    catch (Option::not_found)
+    {}
+    try
+    {
+        m_acftb = getOptions().getOption("ACFTB");
+    }
+    catch (Option::not_found)
+    {}
+}
+
+
+void NitfWriter::writeView(const PointViewPtr view)
+{
+    view->calculateBounds(m_bounds);
+
+    LasWriter::writeView(view);
+}
+
+
+void NitfWriter::readyFile(const std::string& filename)
+{
+    m_error.setFilename(filename);
+    m_nitfFilename = filename;
+    prepOutput(&m_oss);
+}
+
+
+void NitfWriter::doneFile()
+{
+    finishOutput();
+
+    try
+    {
+        ::nitf::Record record(NITF_VER_21);
+        ::nitf::FileHeader header = record.getHeader();
+        header.getFileHeader().set("NITF");
+        header.getComplianceLevel().set(m_cLevel);
+        header.getSystemType().set(m_sType);
+        header.getOriginStationID().set(m_oStationId);
+        if (m_fileTitle.empty())
+            m_fileTitle = m_nitfFilename;
+        header.getFileTitle().set(m_fileTitle);
+        header.getClassification().set(m_fileClass);
+        header.getMessageCopyNum().set("00000");
+        header.getMessageNumCopies().set("00000");
+        header.getEncrypted().set("0");
+        header.getBackgroundColor().setRawData(const_cast<char*>("000"), 3);
+        header.getOriginatorName().set(m_origName);
+        header.getOriginatorPhone().set(m_origPhone);
+        header.getSecurityGroup().getClassificationSystem().set(
+            m_securityClassificationSystem);
+        header.getSecurityGroup().getControlAndHandling().set(
+            m_securityControlAndHandling);
+        header.getSecurityGroup().getClassificationText().set(m_sic);
+
+        ::nitf::DESegment des = record.newDataExtensionSegment();
+
+        des.getSubheader().getFilePartType().set("DE");
+        des.getSubheader().getTypeID().set("LIDARA DES");
+        des.getSubheader().getVersion().set("01");
+        des.getSubheader().getSecurityClass().set(m_securityClass);
+        ::nitf::FileSecurity security = record.getHeader().getSecurityGroup();
+        des.getSubheader().setSecurityGroup(security.clone());
+
+        ::nitf::TRE usrHdr("LIDARA DES", "raw_data");
+        usrHdr.setField("raw_data", "not");
+        ::nitf::Field fld = usrHdr.getField("raw_data");
+        fld.setType(::nitf::Field::BINARY);
+
+        std::streambuf *buf = m_oss.rdbuf();
+        long size = buf->pubseekoff(0, m_oss.end);
+        buf->pubseekoff(0, m_oss.beg);
+
+        std::vector<char> bytes(size);
+        buf->sgetn(bytes.data(), size);
+        m_oss.clear();
+
+        des.getSubheader().setSubheaderFields(usrHdr);
+
+        ::nitf::ImageSegment image = record.newImageSegment();
+        ::nitf::ImageSubheader subheader = image.getSubheader();
+
+        BOX3D bounds =  reprojectBoxToDD(m_srs, m_bounds);
+
+        //NITF decimal degree values for corner coordinates only has a
+        // precision of 3 after the decimal. This may cause an invalid
+        // polygon due to rounding errors with a small tile. Therefore
+        // instead of rounding min values will use the floor value and
+        // max values will use the ceiling values.
+        bounds.minx = (floor(bounds.minx * 1000)) / 1000.0;
+        bounds.miny = (floor(bounds.miny * 1000)) / 1000.0;
+        bounds.maxx = (ceil(bounds.maxx * 1000)) / 1000.0;
+        bounds.maxy = (ceil(bounds.maxy * 1000)) / 1000.0;
+
+        double corners[4][2];
+        corners[0][0] = bounds.maxy;
+        corners[0][1] = bounds.minx;
+        corners[1][0] = bounds.maxy;
+        corners[1][1] = bounds.maxx;
+        corners[2][0] = bounds.miny;
+        corners[2][1] = bounds.maxx;
+        corners[3][0] = bounds.miny;
+        corners[3][1] = bounds.minx;
+        subheader.setCornersFromLatLons(NRT_CORNERS_DECIMAL, corners);
+
+        subheader.getImageSecurityClass().set(m_imgSecurityClass);
+        subheader.setSecurityGroup(security.clone());
+        if (m_imgDate.size())
+            subheader.getImageDateAndTime().set(m_imgDate);
+
+        ::nitf::BandInfo info;
+        ::nitf::LookupTable lt(0,0);
+        info.init("G",    /* The band representation, Nth band */
+                  " ",      /* The band subcategory */
+                  "N",      /* The band filter condition */
+                  "   ",    /* The band standard image filter code */
+                  0,        /* The number of look-up tables */
+                  0,        /* The number of entries/LUT */
+                  lt);     /* The look-up tables */
+
+        std::vector< ::nitf::BandInfo> bands;
+        bands.push_back(info);
+        subheader.setPixelInformation(
+            "INT",      /* Pixel value type */
+            8,         /* Number of bits/pixel */
+            8,         /* Actual number of bits/pixel */
+            "R",       /* Pixel justification */
+            "NODISPLY",     /* Image representation */
+            "VIS",     /* Image category */
+            1,         /* Number of bands */
+            bands);
+
+        subheader.setBlocking(
+            8,   /*!< The number of rows */
+            8,  /*!< The number of columns */
+            8, /*!< The number of rows/block */
+            8,  /*!< The number of columns/block */
+            "P");                /*!< Image mode */
+
+        //Image Header fields to set
+        subheader.getImageId().set("None");
+        subheader.getImageTitle().set(m_imgIdentifier2);
+
+        // 64 char string
+        std::string zeros(64, '0');
+
+        std::unique_ptr< ::nitf::BandSource> band(new ::nitf::MemorySource(
+            const_cast<char*>(zeros.c_str()),
+            zeros.size() /* memory size */,
+            0 /* starting offset */,
+            1 /* bytes per pixel */,
+            0 /*skip*/));
+        ::nitf::ImageSource iSource;
+        iSource.addBand(*band);
+
+        //AIMIDB
+        if (!m_aimidb.empty())
+        {
+            boost::optional<const Options&> options = m_aimidb.getOptions();
+            if (options)
+            {
+                ::nitf::TRE tre("AIMIDB");
+                std::vector<Option> opts = options->getOptions();
+                for (auto i = opts.begin(); i != opts.end(); ++i)
+                {
+                    tre.setField(i->getName(), i->getValue<std::string>());
+                }
+                subheader.getExtendedSection().appendTRE(tre);
+            }
+        }
+
+        //ACFTB
+        if (!m_acftb.empty())
+        {
+            boost::optional<const Options&> options = m_acftb.getOptions();
+            if (options)
+            {
+                ::nitf::TRE tre("ACFTB");
+                std::vector<Option> opts = options->getOptions();
+                for (auto i = opts.begin(); i != opts.end(); ++i)
+                {
+                    tre.setField(i->getName(), i->getValue<std::string>());
+                }
+                subheader.getExtendedSection().appendTRE(tre);
+            }
+        }
+
+        ::nitf::Writer writer;
+        ::nitf::IOHandle output_io(m_nitfFilename.c_str(),
+            NITF_ACCESS_WRITEONLY, NITF_CREATE);
+        writer.prepare(output_io, record);
+
+        ::nitf::SegmentWriter sWriter = writer.newDEWriter(0);
+
+        ::nitf::SegmentMemorySource sSource(bytes.data(), size, 0, 0, false);
+        sWriter.attachSource(sSource);
+
+        ::nitf::ImageWriter iWriter = writer.newImageWriter(0);
+        iWriter.attachSource(iSource);
+
+        writer.write();
+        output_io.close();
+    }
+    catch (except::Throwable & t)
+    {
+        std::ostringstream oss;
+        // std::cout << t.getTrace();
+        throw pdal_error(t.getMessage());
+    }
+}
+
+} // namespaces
diff --git a/plugins/nitf/io/NitfWriter.hpp b/plugins/nitf/io/NitfWriter.hpp
new file mode 100644
index 0000000..e446f7f
--- /dev/null
+++ b/plugins/nitf/io/NitfWriter.hpp
@@ -0,0 +1,83 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/StageFactory.hpp>
+#include <las/LasWriter.hpp>
+
+namespace pdal
+{
+
+
+class PDAL_DLL NitfWriter : public LasWriter
+{
+public:
+    NitfWriter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    virtual void processOptions(const Options& options);
+    virtual void readyFile(const std::string& filename);
+    virtual void doneFile();
+    virtual void writeView(const PointViewPtr view);
+
+    std::string m_nitfFilename;
+    BOX3D m_bounds;
+    std::string m_cLevel;
+    std::string m_sType;
+    std::string m_oStationId;
+    std::string m_fileTitle;
+    std::string m_fileClass;
+    std::string m_origName;
+    std::string m_origPhone;
+    std::string m_securityClass;
+    std::string m_securityControlAndHandling;
+    std::string m_securityClassificationSystem;
+    std::string m_imgSecurityClass;
+    std::string m_imgDate;
+    pdal::Option m_aimidb;
+    pdal::Option m_acftb;
+    std::string m_imgIdentifier2;
+    std::string m_sic;
+    std::stringstream m_oss;
+
+    NitfWriter& operator=(const NitfWriter&); // not implemented
+    NitfWriter(const NitfWriter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/nitf/io/nitflib.h b/plugins/nitf/io/nitflib.h
new file mode 100644
index 0000000..8979ce9
--- /dev/null
+++ b/plugins/nitf/io/nitflib.h
@@ -0,0 +1,413 @@
+/******************************************************************************
+ * $Id: nitflib.h 22843 2011-07-31 23:22:42Z rouault $
+ *
+ * Project:  NITF Read/Write Library
+ * Purpose:  Main GDAL independent include file for NITF support.  
+ * Author:   Frank Warmerdam, warmerdam at pobox.com
+ *
+ **********************************************************************
+ * Copyright (c) 2002, Frank Warmerdam
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#ifndef NITFLIB_H_INCLUDED
+#define NITFLIB_H_INCLUDED
+
+#include "cpl_port.h"
+#include "cpl_error.h"
+#include "cpl_vsi.h"
+#include "cpl_minixml.h"
+
+CPL_C_START
+
+typedef struct { 
+    char szSegmentType[3]; /* one of "IM", ... */
+
+    GUIntBig nSegmentHeaderStart;
+    GUInt32 nSegmentHeaderSize;
+    GUIntBig nSegmentStart;
+    GUIntBig nSegmentSize;
+
+    void *hAccess;
+
+    /* extra info related to relative display */
+    int     nDLVL;
+    int     nALVL;
+    int     nLOC_R;
+    int     nLOC_C;
+    int     nCCS_R;
+    int     nCCS_C;
+} NITFSegmentInfo;
+
+typedef struct {
+    VSILFILE  *fp;
+
+    char    szVersion[10];
+
+    int     nSegmentCount;
+    NITFSegmentInfo *pasSegmentInfo;
+
+    char    *pachHeader;
+
+    int     nTREBytes;
+    char    *pachTRE;
+
+    char    **papszMetadata;
+
+    CPLXMLNode *psNITFSpecNode;
+    
+} NITFFile;
+
+/* -------------------------------------------------------------------- */
+/*      File level prototypes.                                          */
+/* -------------------------------------------------------------------- */
+NITFFile CPL_DLL *NITFOpen( const char *pszFilename, int bUpdatable );
+void     CPL_DLL  NITFClose( NITFFile * );
+
+int      CPL_DLL  NITFCreate( const char *pszFilename, 
+                              int nPixels, int nLines, int nBands, 
+                              int nBitsPerSample, const char *pszPVType,
+                              char **papszOptions );
+
+const char CPL_DLL *NITFFindTRE( const char *pszTREData, int nTREBytes, 
+                                 const char *pszTag, int *pnFoundTRESize );
+const char CPL_DLL *NITFFindTREByIndex( const char *pszTREData, int nTREBytes,
+                                const char *pszTag, int nTreIndex,
+                                int *pnFoundTRESize );
+
+int CPL_DLL NITFCollectAttachments( NITFFile *psFile );
+int CPL_DLL NITFReconcileAttachments( NITFFile *psFile );
+
+/* -------------------------------------------------------------------- */
+/*      Image level access.                                             */
+/* -------------------------------------------------------------------- */
+typedef struct {
+    char      szIREPBAND[3];
+    char      szISUBCAT[7];
+
+    int       nSignificantLUTEntries;
+    int       nLUTLocation;
+    unsigned char *pabyLUT;
+
+} NITFBandInfo;
+
+typedef struct { 
+    GUInt16 nLocId;
+    GUInt32 nLocOffset;
+    GUInt32 nLocSize;
+} NITFLocation;
+
+typedef struct
+{
+  unsigned short   tableId;
+  unsigned int     nRecords;
+  unsigned char    elementLength;
+  unsigned short   histogramRecordLength;
+  unsigned int     colorTableOffset;
+  unsigned int     histogramTableOffset;
+} NITFColormapRecord;
+
+
+typedef struct {
+    NITFFile  *psFile;
+    int        iSegment;
+    char      *pachHeader;
+
+    int        nRows;
+    int        nCols;
+    int        nBands;
+    int        nBitsPerSample;
+
+    NITFBandInfo *pasBandInfo;
+    
+    char       chIMODE;
+
+    int        nBlocksPerRow;
+    int        nBlocksPerColumn;
+    int        nBlockWidth;
+    int        nBlockHeight;
+
+    char       szPVType[4];
+    char       szIREP[9];
+    char       szICAT[9];
+    int        nABPP; /* signficant bits per pixel */
+
+    char       chICORDS;
+    int        bHaveIGEOLO;
+
+    int        nZone;
+    double     dfULX;
+    double     dfULY;
+    double     dfURX;
+    double     dfURY;
+    double     dfLRX;
+    double     dfLRY;
+    double     dfLLX;
+    double     dfLLY;
+    int        bIsBoxCenterOfPixel;
+
+    char       *pszComments;
+    char       szIC[3];
+    char       szCOMRAT[5];
+
+    int        nILOCColumn;
+    int        nILOCRow;
+    int        nIALVL;
+    int        nIDLVL;
+    char       szIMAG[5];
+    
+    int        bNoDataSet;
+    int        nNoDataValue;
+
+    int     nTREBytes;
+    char    *pachTRE;
+
+    /* Internal information not for application use. */
+    
+    int        nWordSize;
+    GUIntBig   nPixelOffset;
+    GUIntBig   nLineOffset;
+    GUIntBig   nBlockOffset;
+    GUIntBig   nBandOffset;
+
+    GUIntBig    *panBlockStart;
+
+    char       **papszMetadata;
+    
+    GUInt32 *apanVQLUT[4];
+
+    int     nLocCount;
+    NITFLocation *pasLocations;
+
+} NITFImage;
+
+NITFImage CPL_DLL *NITFImageAccess( NITFFile *, int iSegment );
+void      CPL_DLL  NITFImageDeaccess( NITFImage * );
+
+int       CPL_DLL  NITFReadImageBlock( NITFImage *, int nBlockX, int nBlockY,
+                                       int nBand, void *pData );
+int       CPL_DLL  NITFReadImageLine( NITFImage *, int nLine, int nBand, 
+                                      void *pData );
+int       CPL_DLL  NITFWriteImageBlock( NITFImage *, int nBlockX, int nBlockY,
+                                        int nBand, void *pData );
+int       CPL_DLL  NITFWriteImageLine( NITFImage *, int nLine, int nBand, 
+                                       void *pData );
+int       CPL_DLL  NITFWriteLUT( NITFImage *psImage, int nBand, int nColors, 
+                                 unsigned char *pabyLUT );
+int       CPL_DLL  NITFWriteIGEOLO( NITFImage *psImage, char chICORDS,
+                                    int nZone,
+                                    double dfULX, double dfULY,
+                                    double dfURX, double dfURY,
+                                    double dfLRX, double dfLRY,
+                                    double dfLLX, double dfLLY );
+char      CPL_DLL **NITFReadCSEXRA( NITFImage *psImage );
+char      CPL_DLL **NITFReadPIAIMC( NITFImage *psImage );
+char      CPL_DLL **NITFReadUSE00A( NITFImage *psImage );
+char      CPL_DLL **NITFReadSTDIDC( NITFImage *psImage );
+char      CPL_DLL **NITFReadBLOCKA( NITFImage *psImage );
+
+GUIntBig  CPL_DLL NITFIHFieldOffset( NITFImage *psImage, 
+                                     const char *pszFieldName );
+
+#define BLKREAD_OK    0
+#define BLKREAD_NULL  1
+#define BLKREAD_FAIL  2
+
+int NITFUncompressARIDPCM( NITFImage *psImage,
+                           GByte *pabyInputData, int nInputBytes,
+                           GByte *pabyOutputImage );
+int NITFUncompressBILEVEL( NITFImage *psImage, 
+                           GByte *pabyInputData, int nInputBytes,
+                           GByte *pabyOutputImage );
+
+NITFLocation* NITFReadRPFLocationTable(VSILFILE* fp, int* pnLocCount);
+
+/* -------------------------------------------------------------------- */
+/*      DE segment access.                                              */
+/* -------------------------------------------------------------------- */
+typedef struct {
+    NITFFile  *psFile;
+    int        iSegment;
+    char      *pachHeader;
+
+    char       **papszMetadata;
+} NITFDES;
+
+NITFDES   CPL_DLL *NITFDESAccess( NITFFile *, int iSegment );
+void      CPL_DLL  NITFDESDeaccess( NITFDES * );
+
+int       CPL_DLL  NITFDESGetTRE(   NITFDES* psDES,
+                                    int nOffset,
+                                    char szTREName[7],
+                                    char** ppabyTREData,
+                                    int* pnFoundTRESize);
+void      CPL_DLL  NITFDESFreeTREData( char* pabyTREData );
+
+int       CPL_DLL  NITFDESExtractShapefile(NITFDES* psDES, const char* pszRadixFileName);
+int       CPL_DLL  NITFDESExtractLAS(NITFDES* psDES, const char* pszRadixFileName);
+
+/* -------------------------------------------------------------------- */
+/*      These are really intended to be private helper stuff for the    */
+/*      library.                                                        */
+/* -------------------------------------------------------------------- */
+char *NITFGetField( char *pszTarget, const char *pszSource, 
+                    int nStart, int nLength );
+void NITFExtractMetadata( char ***ppapszMetadata, const char *pachHeader,
+                          int nStart, int nLength, const char *pszName );
+
+/* -------------------------------------------------------------------- */
+/*      location ids from the location table (from MIL-STD-2411-1).     */
+/* -------------------------------------------------------------------- */
+
+typedef enum {
+    LID_HeaderComponent = 128,
+    LID_LocationComponent = 129,
+    LID_CoverageSectionSubheader = 130,
+    LID_CompressionSectionSubsection = 131,
+    LID_CompressionLookupSubsection = 132,
+    LID_CompressionParameterSubsection = 133,
+    LID_ColorGrayscaleSectionSubheader = 134,
+    LID_ColormapSubsection = 135,
+    LID_ImageDescriptionSubheader = 136,
+    LID_ImageDisplayParametersSubheader = 137,
+    LID_MaskSubsection = 138,
+    LID_ColorConverterSubsection = 139,
+    LID_SpatialDataSubsection = 140,
+    LID_AttributeSectionSubheader = 141,
+    LID_AttributeSubsection = 142,
+    LID_ExplicitArealCoverageTable = 143,
+    LID_RelatedImagesSectionSubheader = 144,
+    LID_RelatedImagesSubsection = 145,
+    LID_ReplaceUpdateSectionSubheader = 146,
+    LID_ReplaceUpdateTable = 147,
+    LID_BoundaryRectangleSectionSubheader = 148,
+    LID_BoundaryRectangleTable = 149,
+    LID_FrameFileIndexSectionSubHeader = 150,
+    LID_FrameFileIndexSubsection = 151,
+    LID_ColorTableIndexSectionSubheader = 152,
+    LID_ColorTableIndexRecord = 153
+} NITFLocId;
+
+/* -------------------------------------------------------------------- */
+/*      RPC structure, and function to fill it.                         */
+/* -------------------------------------------------------------------- */
+typedef struct  {
+    int			SUCCESS;
+
+    double		ERR_BIAS;
+    double      ERR_RAND;
+
+    double      LINE_OFF;
+    double      SAMP_OFF;
+    double      LAT_OFF;
+    double      LONG_OFF;
+    double      HEIGHT_OFF;
+
+    double      LINE_SCALE;
+    double      SAMP_SCALE;
+    double      LAT_SCALE;
+    double      LONG_SCALE;
+    double      HEIGHT_SCALE;
+
+    double      LINE_NUM_COEFF[20];
+    double      LINE_DEN_COEFF[20];
+    double      SAMP_NUM_COEFF[20];
+    double      SAMP_DEN_COEFF[20];
+} NITFRPC00BInfo;
+
+int CPL_DLL NITFReadRPC00B( NITFImage *psImage, NITFRPC00BInfo * );
+int CPL_DLL NITFRPCGeoToImage(NITFRPC00BInfo *, double, double, double,
+                              double *, double *);
+
+/* -------------------------------------------------------------------- */
+/*      ICHIP structure, and function to fill it.                         */
+/* -------------------------------------------------------------------- */
+typedef struct {
+	int		XFRM_FLAG;
+	double	SCALE_FACTOR;
+	int		ANAMORPH_CORR;
+	int		SCANBLK_NUM;
+
+	double	OP_ROW_11;
+	double	OP_COL_11;
+
+	double	OP_ROW_12;
+	double	OP_COL_12;
+
+	double	OP_ROW_21;
+	double	OP_COL_21;
+
+	double	OP_ROW_22;
+	double	OP_COL_22;
+
+	double	FI_ROW_11;
+	double	FI_COL_11;
+
+	double	FI_ROW_12;
+	double	FI_COL_12;
+
+	double	FI_ROW_21;
+	double	FI_COL_21;
+
+	double	FI_ROW_22;
+	double	FI_COL_22;
+
+	int		FI_ROW;
+	int		FI_COL;
+} NITFICHIPBInfo;
+
+int CPL_DLL NITFReadICHIPB( NITFImage *psImage, NITFICHIPBInfo * );
+
+double CPL_DLL 
+        NITF_WGS84_Geocentric_Latitude_To_Geodetic_Latitude( double dfLat );
+
+
+
+
+typedef struct
+{
+    const char* code;
+    const char* abbreviation;
+    const char* scaleResolution;
+    const char* name;
+    const char* rpfDataType;
+} NITFSeries;
+
+/** Return not freeable (maybe NULL if no matching) */
+const NITFSeries CPL_DLL *NITFGetSeriesInfo(const char* pszFilename);
+
+/* -------------------------------------------------------------------- */
+/*                           Internal use                               */
+/* -------------------------------------------------------------------- */
+
+char **NITFGenericMetadataRead(char **papszMD,
+                               NITFFile* psFile,
+                               NITFImage *psImage,
+                               const char* pszSpecificTREName);
+
+CPLXMLNode* NITFCreateXMLTre(NITFFile* psFile,
+                             const char* pszTREName,
+                             const char *pachTRE,
+                             int nTRESize);
+
+CPL_C_END
+
+#endif /* ndef NITFLIB_H_INCLUDED */
+
diff --git a/plugins/nitf/io/tre_plugins.cpp b/plugins/nitf/io/tre_plugins.cpp
new file mode 100644
index 0000000..178f4f1
--- /dev/null
+++ b/plugins/nitf/io/tre_plugins.cpp
@@ -0,0 +1,253 @@
+/******************************************************************************
+* Copyright (c) 2014, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "tre_plugins.hpp"
+
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wredundant-decls"
+#  pragma GCC diagnostic ignored "-Wextra"
+#  pragma GCC diagnostic ignored "-Wcast-qual"
+   // The following pragma doesn't actually work:
+   //   https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653
+   //#  pragma GCC diagnostic ignored "-Wliteral-suffix"
+#endif
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wunused-private-field"
+#endif
+
+#define IMPORT_NITRO_API
+#include <nitro/c++/import/nitf.hpp>
+#include <nitro/c++/except/Trace.h>
+
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic pop
+#endif
+
+namespace pdal
+{
+
+// these are all the ones listed in nitro's c/nitf/shared/ directory
+NITF_TRE_STATIC_HANDLER_REF(ACCHZB);
+NITF_TRE_STATIC_HANDLER_REF(ACCPOB);
+NITF_TRE_STATIC_HANDLER_REF(ACCVTB);
+NITF_TRE_STATIC_HANDLER_REF(ACFTA);
+NITF_TRE_STATIC_HANDLER_REF(ACFTB);
+NITF_TRE_STATIC_HANDLER_REF(AIMIDA);
+NITF_TRE_STATIC_HANDLER_REF(AIMIDB);
+NITF_TRE_STATIC_HANDLER_REF(AIPBCA);
+NITF_TRE_STATIC_HANDLER_REF(ASTORA);
+NITF_TRE_STATIC_HANDLER_REF(BANDSA);
+NITF_TRE_STATIC_HANDLER_REF(BANDSB);
+NITF_TRE_STATIC_HANDLER_REF(BCKGDA);
+NITF_TRE_STATIC_HANDLER_REF(BLOCKA);
+NITF_TRE_STATIC_HANDLER_REF(BNDPLB);
+NITF_TRE_STATIC_HANDLER_REF(CLCTNA);
+NITF_TRE_STATIC_HANDLER_REF(CLCTNB);
+NITF_TRE_STATIC_HANDLER_REF(CMETAA);
+NITF_TRE_STATIC_HANDLER_REF(CSCCGA);
+NITF_TRE_STATIC_HANDLER_REF(CSCRNA);
+NITF_TRE_STATIC_HANDLER_REF(CSDIDA);
+NITF_TRE_STATIC_HANDLER_REF(CSEPHA);
+NITF_TRE_STATIC_HANDLER_REF(CSEXRA);
+NITF_TRE_STATIC_HANDLER_REF(CSPROA);
+NITF_TRE_STATIC_HANDLER_REF(CSSFAA);
+NITF_TRE_STATIC_HANDLER_REF(CSSHPA);
+NITF_TRE_STATIC_HANDLER_REF(ENGRDA);
+NITF_TRE_STATIC_HANDLER_REF(EXOPTA);
+NITF_TRE_STATIC_HANDLER_REF(EXPLTA);
+NITF_TRE_STATIC_HANDLER_REF(EXPLTB);
+NITF_TRE_STATIC_HANDLER_REF(GEOLOB);
+NITF_TRE_STATIC_HANDLER_REF(GEOPSB);
+NITF_TRE_STATIC_HANDLER_REF(GRDPSB);
+NITF_TRE_STATIC_HANDLER_REF(HISTOA);
+NITF_TRE_STATIC_HANDLER_REF(ICHIPB);
+NITF_TRE_STATIC_HANDLER_REF(IMGDTA);
+NITF_TRE_STATIC_HANDLER_REF(IOMAPA);
+NITF_TRE_STATIC_HANDLER_REF(J2KLRA);
+NITF_TRE_STATIC_HANDLER_REF(JITCID);
+NITF_TRE_STATIC_HANDLER_REF(MAPLOB);
+NITF_TRE_STATIC_HANDLER_REF(MENSRA);
+NITF_TRE_STATIC_HANDLER_REF(MENSRB);
+NITF_TRE_STATIC_HANDLER_REF(MPDSRA);
+NITF_TRE_STATIC_HANDLER_REF(MSTGTA);
+NITF_TRE_STATIC_HANDLER_REF(MTIRPA);
+NITF_TRE_STATIC_HANDLER_REF(MTIRPB);
+NITF_TRE_STATIC_HANDLER_REF(NBLOCA);
+NITF_TRE_STATIC_HANDLER_REF(OBJCTA);
+NITF_TRE_STATIC_HANDLER_REF(OFFSET);
+NITF_TRE_STATIC_HANDLER_REF(PATCHA);
+NITF_TRE_STATIC_HANDLER_REF(PATCHB);
+NITF_TRE_STATIC_HANDLER_REF(PIAEQA);
+NITF_TRE_STATIC_HANDLER_REF(PIAEVA);
+NITF_TRE_STATIC_HANDLER_REF(PIAIMB);
+NITF_TRE_STATIC_HANDLER_REF(PIAIMC);
+NITF_TRE_STATIC_HANDLER_REF(PIAPEA);
+NITF_TRE_STATIC_HANDLER_REF(PIAPEB);
+NITF_TRE_STATIC_HANDLER_REF(PIAPRC);
+NITF_TRE_STATIC_HANDLER_REF(PIAPRD);
+NITF_TRE_STATIC_HANDLER_REF(PIATGA);
+NITF_TRE_STATIC_HANDLER_REF(PIATGB);
+NITF_TRE_STATIC_HANDLER_REF(PIXQLA);
+NITF_TRE_STATIC_HANDLER_REF(PLTFMA);
+NITF_TRE_STATIC_HANDLER_REF(PRJPSB);
+NITF_TRE_STATIC_HANDLER_REF(REGPTB);
+NITF_TRE_STATIC_HANDLER_REF(RPC00B);
+NITF_TRE_STATIC_HANDLER_REF(RPFDES);
+NITF_TRE_STATIC_HANDLER_REF(RPFHDR);
+NITF_TRE_STATIC_HANDLER_REF(RPFIMG);
+NITF_TRE_STATIC_HANDLER_REF(RSMAPA);
+NITF_TRE_STATIC_HANDLER_REF(RSMDCA);
+NITF_TRE_STATIC_HANDLER_REF(RSMECA);
+NITF_TRE_STATIC_HANDLER_REF(RSMGGA);
+NITF_TRE_STATIC_HANDLER_REF(RSMGIA);
+NITF_TRE_STATIC_HANDLER_REF(RSMIDA);
+NITF_TRE_STATIC_HANDLER_REF(RSMPCA);
+NITF_TRE_STATIC_HANDLER_REF(RSMPIA);
+NITF_TRE_STATIC_HANDLER_REF(SECTGA);
+NITF_TRE_STATIC_HANDLER_REF(SENSRA);
+NITF_TRE_STATIC_HANDLER_REF(SENSRB);
+NITF_TRE_STATIC_HANDLER_REF(SNSPSB);
+NITF_TRE_STATIC_HANDLER_REF(SNSRA);
+NITF_TRE_STATIC_HANDLER_REF(SOURCB);
+NITF_TRE_STATIC_HANDLER_REF(STDIDC);
+NITF_TRE_STATIC_HANDLER_REF(STEROB);
+NITF_TRE_STATIC_HANDLER_REF(STREOB);
+NITF_TRE_STATIC_HANDLER_REF(TRGTA);
+NITF_TRE_STATIC_HANDLER_REF(USE00A);
+
+void register_tre_handler(NITF_PLUGIN_INIT_FUNCTION init, NITF_PLUGIN_TRE_HANDLER_FUNCTION handler)
+{
+  nitf_Error error;
+  if (!nitf_PluginRegistry_registerTREHandler(init, handler, &error))
+    throw ::nitf::NITFException(&error);
+}
+
+void register_tre_plugins()
+{
+    register_tre_handler(ACCHZB_init, ACCHZB_handler);
+    register_tre_handler(ACCPOB_init, ACCPOB_handler);
+    register_tre_handler(ACCVTB_init, ACCVTB_handler);
+    register_tre_handler(ACFTA_init, ACFTA_handler);
+    register_tre_handler(ACFTB_init, ACFTB_handler);
+    register_tre_handler(AIMIDA_init, AIMIDA_handler);
+    register_tre_handler(AIMIDB_init, AIMIDB_handler);
+    register_tre_handler(AIPBCA_init, AIPBCA_handler);
+    register_tre_handler(ASTORA_init, ASTORA_handler);
+    register_tre_handler(BANDSA_init, BANDSA_handler);
+    register_tre_handler(BANDSB_init, BANDSB_handler);
+    register_tre_handler(BCKGDA_init, BCKGDA_handler);
+    register_tre_handler(BLOCKA_init, BLOCKA_handler);
+    register_tre_handler(BNDPLB_init, BNDPLB_handler);
+    register_tre_handler(CLCTNA_init, CLCTNA_handler);
+    register_tre_handler(CLCTNB_init, CLCTNB_handler);
+    register_tre_handler(CMETAA_init, CMETAA_handler);
+    register_tre_handler(CSCCGA_init, CSCCGA_handler);
+    register_tre_handler(CSCRNA_init, CSCRNA_handler);
+    register_tre_handler(CSDIDA_init, CSDIDA_handler);
+    register_tre_handler(CSEPHA_init, CSEPHA_handler);
+    register_tre_handler(CSEXRA_init, CSEXRA_handler);
+    register_tre_handler(CSPROA_init, CSPROA_handler);
+    register_tre_handler(CSSFAA_init, CSSFAA_handler);
+    register_tre_handler(CSSHPA_init, CSSHPA_handler);
+    register_tre_handler(ENGRDA_init, ENGRDA_handler);
+    register_tre_handler(EXOPTA_init, EXOPTA_handler);
+    register_tre_handler(EXPLTA_init, EXPLTA_handler);
+    register_tre_handler(EXPLTB_init, EXPLTB_handler);
+    register_tre_handler(GEOLOB_init, GEOLOB_handler);
+    register_tre_handler(GEOPSB_init, GEOPSB_handler);
+    register_tre_handler(GRDPSB_init, GRDPSB_handler);
+    register_tre_handler(HISTOA_init, HISTOA_handler);
+    register_tre_handler(ICHIPB_init, ICHIPB_handler);
+    register_tre_handler(IMGDTA_init, IMGDTA_handler);
+    register_tre_handler(IOMAPA_init, IOMAPA_handler);
+    register_tre_handler(J2KLRA_init, J2KLRA_handler);
+    register_tre_handler(JITCID_init, JITCID_handler);
+    register_tre_handler(MAPLOB_init, MAPLOB_handler);
+    register_tre_handler(MENSRA_init, MENSRA_handler);
+    register_tre_handler(MENSRB_init, MENSRB_handler);
+    register_tre_handler(MPDSRA_init, MPDSRA_handler);
+    register_tre_handler(MSTGTA_init, MSTGTA_handler);
+    register_tre_handler(MTIRPA_init, MTIRPA_handler);
+    register_tre_handler(MTIRPB_init, MTIRPB_handler);
+    register_tre_handler(NBLOCA_init, NBLOCA_handler);
+    register_tre_handler(OBJCTA_init, OBJCTA_handler);
+    register_tre_handler(OFFSET_init, OFFSET_handler);
+    register_tre_handler(PATCHA_init, PATCHA_handler);
+    register_tre_handler(PATCHB_init, PATCHB_handler);
+    register_tre_handler(PIAEQA_init, PIAEQA_handler);
+    register_tre_handler(PIAEVA_init, PIAEVA_handler);
+    register_tre_handler(PIAIMB_init, PIAIMB_handler);
+    register_tre_handler(PIAIMC_init, PIAIMC_handler);
+    register_tre_handler(PIAPEA_init, PIAPEA_handler);
+    register_tre_handler(PIAPEB_init, PIAPEB_handler);
+    register_tre_handler(PIAPRC_init, PIAPRC_handler);
+    register_tre_handler(PIAPRD_init, PIAPRD_handler);
+    register_tre_handler(PIATGA_init, PIATGA_handler);
+    register_tre_handler(PIATGB_init, PIATGB_handler);
+    register_tre_handler(PIXQLA_init, PIXQLA_handler);
+    register_tre_handler(PLTFMA_init, PLTFMA_handler);
+    register_tre_handler(PRJPSB_init, PRJPSB_handler);
+    register_tre_handler(REGPTB_init, REGPTB_handler);
+    register_tre_handler(RPC00B_init, RPC00B_handler);
+    register_tre_handler(RPFDES_init, RPFDES_handler);
+    register_tre_handler(RPFHDR_init, RPFHDR_handler);
+    register_tre_handler(RPFIMG_init, RPFIMG_handler);
+    register_tre_handler(RSMAPA_init, RSMAPA_handler);
+    register_tre_handler(RSMDCA_init, RSMDCA_handler);
+    register_tre_handler(RSMECA_init, RSMECA_handler);
+    register_tre_handler(RSMGGA_init, RSMGGA_handler);
+    register_tre_handler(RSMGIA_init, RSMGIA_handler);
+    register_tre_handler(RSMIDA_init, RSMIDA_handler);
+    register_tre_handler(RSMPCA_init, RSMPCA_handler);
+    register_tre_handler(RSMPIA_init, RSMPIA_handler);
+    register_tre_handler(SECTGA_init, SECTGA_handler);
+    register_tre_handler(SENSRA_init, SENSRA_handler);
+    register_tre_handler(SENSRB_init, SENSRB_handler);
+    register_tre_handler(SNSPSB_init, SNSPSB_handler);
+    register_tre_handler(SNSRA_init, SNSRA_handler);
+    register_tre_handler(SOURCB_init, SOURCB_handler);
+    register_tre_handler(STDIDC_init, STDIDC_handler);
+    register_tre_handler(STEROB_init, STEROB_handler);
+    register_tre_handler(STREOB_init, STREOB_handler);
+    register_tre_handler(TRGTA_init, TRGTA_handler);
+    register_tre_handler(USE00A_init, USE00A_handler);
+}
+
+
+} // namespaces
diff --git a/plugins/nitf/io/tre_plugins.hpp b/plugins/nitf/io/tre_plugins.hpp
new file mode 100644
index 0000000..486a3a4
--- /dev/null
+++ b/plugins/nitf/io/tre_plugins.hpp
@@ -0,0 +1,52 @@
+/******************************************************************************
+* Copyright (c) 2014, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+
+#define IMPORT_NITRO_API
+#include <nitro/c++/import/nitf.hpp>
+#include <nitro/c++/except/Trace.h>
+
+namespace pdal
+{
+
+void register_tre_handler(NITF_PLUGIN_INIT_FUNCTION init, NITF_PLUGIN_TRE_HANDLER_FUNCTION handler);
+
+void register_tre_plugins();
+
+
+} // namespaces
+
diff --git a/plugins/nitf/test/NitfReaderTest.cpp b/plugins/nitf/test/NitfReaderTest.cpp
new file mode 100644
index 0000000..11e809c
--- /dev/null
+++ b/plugins/nitf/test/NitfReaderTest.cpp
@@ -0,0 +1,175 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <boost/uuid/uuid_io.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <las/LasWriter.hpp>
+
+#include "Support.hpp"
+
+#include <iostream>
+
+#ifdef PDAL_COMPILER_GCC
+#pragma GCC diagnostic ignored "-Wsign-compare"
+#endif
+
+
+using namespace pdal;
+
+TEST(NitfReaderTest, test_one)
+{
+    StageFactory f;
+
+    Options nitf_opts;
+    nitf_opts.add("filename", Support::datapath("nitf/autzen-utm10.ntf"));
+    nitf_opts.add("count", 750);
+
+    PointTable table;
+
+    std::shared_ptr<Stage> nitf_reader(f.createStage("readers.nitf"));
+    EXPECT_TRUE(nitf_reader.get());
+    nitf_reader->setOptions(nitf_opts);
+    nitf_reader->prepare(table);
+    PointViewSet pbSet = nitf_reader->execute(table);
+    EXPECT_EQ(pbSet.size(), 1u);
+    PointViewPtr view = *pbSet.begin();
+
+    // check metadata
+//ABELL
+/**
+    {
+        Metadata metadata = nitf_reader.getMetadata();
+        /////////////////////////////////////////////////EXPECT_EQ(metadatums.size(), 80u);
+        EXPECT_EQ(metadata.toPTree().get<std::string>("metadata.FH_FDT.value"), "20120323002946");
+    }
+**/
+
+    //
+    // read LAS
+    //
+    Options las_opts;
+    las_opts.add("count", 750);
+    las_opts.add("filename", Support::datapath("nitf/autzen-utm10.las"));
+
+    PointTable table2;
+
+    std::shared_ptr<Stage> las_reader(f.createStage("readers.las"));
+    EXPECT_TRUE(las_reader.get());
+    las_reader->setOptions(las_opts);
+    las_reader->prepare(table2);
+    PointViewSet pbSet2 = las_reader->execute(table2);
+    EXPECT_EQ(pbSet2.size(), 1u);
+    PointViewPtr view2 = *pbSet.begin();
+    //
+    //
+    // compare the two views
+    //
+    EXPECT_EQ(view->size(), view2->size());
+
+    for (PointId i = 0; i < view2->size(); i++)
+    {
+        int32_t nitf_x = view->getFieldAs<int32_t>(Dimension::Id::X, i);
+        int32_t nitf_y = view->getFieldAs<int32_t>(Dimension::Id::Y, i);
+        int32_t nitf_z = view->getFieldAs<int32_t>(Dimension::Id::Z, i);
+
+        int32_t las_x = view2->getFieldAs<int32_t>(Dimension::Id::X, i);
+        int32_t las_y = view2->getFieldAs<int32_t>(Dimension::Id::Y, i);
+        int32_t las_z = view2->getFieldAs<int32_t>(Dimension::Id::Z, i);
+
+        EXPECT_EQ(nitf_x, las_x);
+        EXPECT_EQ(nitf_y, las_y);
+        EXPECT_EQ(nitf_z, las_z);
+    }
+}
+
+
+TEST(NitfReaderTest, test_chipper)
+{
+    Option option("filename", Support::configuredpath("nitf/chipper.xml"));
+    Options options(option);
+
+    PointTable table;
+
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(Support::configuredpath("nitf/chipper.xml"));
+    //ABELL - need faux writer or something.
+    /**
+    mgr.execute();
+    StageSequentialIterator* iter = reader.createSequentialIterator(data);
+    const uint32_t num_read = iter->read(data);
+    EXPECT_EQ(num_read, 13u);
+
+    uint32_t num_blocks = chipper->GetBlockCount();
+    EXPECT_EQ(num_blocks, 8u);
+    **/
+}
+
+TEST(NitfReaderTest, optionSrs)
+{
+    StageFactory f;
+
+    Options nitfOpts;
+    nitfOpts.add("filename", Support::datapath("nitf/autzen-utm10.ntf"));
+
+    std::string sr = "PROJCS[\"NAD83 / UTM zone 11N\",GEOGCS[\"NAD83\",DATUM[\"North_American_Datum_1983\",SPHEROID[\"GRS 1980\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"7019\"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY[\"EPSG\",\"6269\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4269\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-123],P [...]
+
+    nitfOpts.add("spatialreference", sr);
+
+    PointTable table;
+
+    std::shared_ptr<Stage> nitfReader(f.createStage("readers.nitf"));
+    EXPECT_TRUE(nitfReader.get());
+    nitfReader->setOptions(nitfOpts);
+
+    Options lasOpts;
+    lasOpts.add("filename", "/dev/null");
+
+    LasWriter writer;
+    writer.setInput(*nitfReader);
+    writer.setOptions(lasOpts);;
+
+    writer.prepare(table);
+    PointViewSet pbSet = writer.execute(table);
+
+    EXPECT_EQ(sr, nitfReader->getSpatialReference().getWKT());
+    EXPECT_EQ("", writer.getSpatialReference().getWKT());
+    EXPECT_EQ(sr, table.spatialRef().getWKT());
+}
diff --git a/plugins/nitf/test/NitfWriterTest.cpp b/plugins/nitf/test/NitfWriterTest.cpp
new file mode 100644
index 0000000..0d0f881
--- /dev/null
+++ b/plugins/nitf/test/NitfWriterTest.cpp
@@ -0,0 +1,306 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+
+void compare_contents(const std::string& las_file, const std::string& ntf_file)
+{
+    //
+    // read the LAS file
+    //
+    Option las_opt("filename", las_file);
+    Options las_opts;
+    las_opts.add(las_opt);
+
+    PointTable lasPoints;
+
+    StageFactory f;
+
+    std::unique_ptr<Stage> las_reader(f.createStage("readers.las"));
+    las_reader->setOptions(las_opts);
+    las_reader->prepare(lasPoints);
+    PointViewSet lasViews = las_reader->execute(lasPoints);
+    EXPECT_EQ(lasViews.size(), 1u);
+    PointViewPtr lasView = *lasViews.begin();
+
+    //
+    // read the NITF file
+    //
+    Option ntf_opt("filename", ntf_file);
+    Options ntf_opts;
+    ntf_opts.add(ntf_opt);
+
+    PointTable ntfPoints;
+    std::unique_ptr<Stage> ntf_reader(f.createStage("readers.nitf"));
+    ntf_reader->setOptions(ntf_opts);
+    ntf_reader->prepare(ntfPoints);
+    PointViewSet ntfViews = ntf_reader->execute(ntfPoints);
+    EXPECT_EQ(ntfViews.size(), 1u);
+    PointViewPtr ntfView = *ntfViews.begin();
+
+    //
+    // compare the two views
+    //
+    EXPECT_EQ(ntfView->size(), lasView->size());
+
+    for (PointId i = 0; i < ntfView->size(); ++i)
+    {
+        EXPECT_DOUBLE_EQ(ntfView->getFieldAs<double>(Dimension::Id::X, i),
+            lasView->getFieldAs<double>(Dimension::Id::X, i));
+        EXPECT_DOUBLE_EQ(ntfView->getFieldAs<double>(Dimension::Id::Y, i),
+            lasView->getFieldAs<double>(Dimension::Id::Y, i));
+        EXPECT_DOUBLE_EQ(ntfView->getFieldAs<double>(Dimension::Id::Z, i),
+            lasView->getFieldAs<double>(Dimension::Id::Z, i));
+    }
+}
+
+} // Unnamed namespace
+
+TEST(NitfWriterTest, test1)
+{
+    StageFactory f;
+
+    const std::string las_input(Support::datapath("las/1.2-with-color.las"));
+    const std::string nitf_output(Support::temppath("temp_nitf.ntf"));
+    const std::string reference_output(
+        Support::datapath("nitf/write_test1.ntf"));
+
+    FileUtils::deleteFile(nitf_output);
+
+    //
+    // write the NITF
+    //
+    {
+        Options reader_opts;
+        Option reader_opt1("filename", las_input);
+        reader_opts.add(reader_opt1);
+
+        Options writer_opts;
+        Option writer_opt1("filename", nitf_output);
+        Option debug("debug", true);
+        Option verbose("verbose", 8);
+
+        Option datetime("IDATIM", "20110516183337");
+        writer_opts.add(datetime);
+
+        Option cls("FSCLAS", "S");
+        writer_opts.add(cls);
+
+        Option phone("OPHONE", "5159664628");
+        writer_opts.add(phone);
+
+        Option name("ONAME", "Howard Butler");
+        writer_opts.add(name);
+
+        Option ftitle("FTITLE", "LiDAR from somewhere");
+        writer_opts.add(ftitle);
+
+        // writer_opts.add(debug);
+        // writer_opts.add(verbose);
+        writer_opts.add(writer_opt1);
+
+        std::unique_ptr<Stage> reader(f.createStage("readers.las"));
+        EXPECT_TRUE(reader.get());
+        reader->setOptions(reader_opts);
+
+        std::unique_ptr<Stage> writer(f.createStage("writers.nitf"));
+        EXPECT_TRUE(writer.get());
+        writer->setOptions(writer_opts);
+        writer->setInput(*reader);
+        {
+            // writer.setCompressed(false);
+            // // writer.setDate(0, 0);
+            // // writer.setPointFormat(::drivers::las::PointFormat3);
+            // // writer.setSystemIdentifier("");
+            // writer.setGeneratingSoftware("PDAL-NITF");
+            // writer.setChunkSize(100);
+        }
+        PointTable table;
+        writer->prepare(table);
+        writer->execute(table);
+    }
+
+    //
+    // check the generated NITF
+    //
+    //ABELL - This doesn't work and is probably broken because the reference
+    //  file is out of date, but some method of comparing the NITF wrapper
+    //  instead of a byte-by-byte file diff is probably in order.
+/**
+    bool filesSame = Support::compare_files(nitf_output, reference_output);
+    EXPECT_TRUE(filesSame);
+**/
+
+    //
+    // check the LAS contents against the source image
+    //
+    //ABELL - This tells us that the packaged file (LAS) is fine, but it
+    //  doesn't tell us much about the NITF wrapper.
+    compare_contents(las_input, nitf_output);
+
+//    if (filesSame)
+        FileUtils::deleteFile(Support::temppath(nitf_output));
+}
+
+// Test that data from three input views gets written to separate output files.
+TEST(NitfWriterTest, flex)
+{
+    StageFactory f;
+
+    std::array<std::string, 3> outname =
+        {{ "test_1.ntf", "test_2.ntf", "test_3.ntf" }};
+
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("nitf/autzen-utm10.ntf"));
+
+    PointTable table;
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.nitf"));
+    reader->setOptions(readerOps);
+
+    reader->prepare(table);
+    PointViewSet views = reader->execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+        FileUtils::deleteFile(Support::temppath(outname[i]));
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", Support::temppath("test_#.ntf"));
+
+    std::unique_ptr<Stage> writer(f.createStage("writers.nitf"));
+    writer->setOptions(writerOps);
+    writer->setInput(reader2);
+
+    writer->prepare(table);
+    writer->execute(table);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+    {
+        std::string filename = Support::temppath(outname[i]);
+        EXPECT_TRUE(FileUtils::fileExists(filename));
+
+        Options ops;
+        ops.add("filename", filename);
+
+        std::unique_ptr<Stage> r(f.createStage("readers.nitf"));
+        r->setOptions(ops);
+        EXPECT_EQ(r->preview().m_pointCount, vs[i]->size());
+    }
+}
+
+
+// Test that data from three input views gets written to a single output file.
+TEST(NitfWriterTest, flex2)
+{
+    StageFactory f;
+
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("nitf/autzen-utm10.ntf"));
+
+    PointTable table;
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.nitf"));
+    reader->setOptions(readerOps);
+
+    reader->prepare(table);
+    PointViewSet views = reader->execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    std::string outfile(Support::temppath("test_flex.ntf"));
+    FileUtils::deleteFile(outfile);
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", outfile);
+
+    std::unique_ptr<Stage> writer(f.createStage("writers.nitf"));
+    writer->setOptions(writerOps);
+    writer->setInput(reader2);
+
+    writer->prepare(table);
+    writer->execute(table);
+
+    EXPECT_TRUE(FileUtils::fileExists(outfile));
+
+    Options ops;
+    ops.add("filename", outfile);
+
+    std::unique_ptr<Stage> r(f.createStage("readers.nitf"));
+    r->setOptions(ops);
+    EXPECT_EQ(r->preview().m_pointCount, v->size());
+}
diff --git a/plugins/oci/CMakeLists.txt b/plugins/oci/CMakeLists.txt
new file mode 100644
index 0000000..c6e8756
--- /dev/null
+++ b/plugins/oci/CMakeLists.txt
@@ -0,0 +1,55 @@
+#
+# Oracle OCI plugin CMake configuration
+#
+
+find_package(Oracle REQUIRED)
+include_directories(${ORACLE_INCLUDE_DIR})
+set(OCI_CONNECTION "scott/tiger at localhost/test" CACHE STRING
+    "OCI connection string <username/password at instance>")
+
+#
+# OCI Reader
+#
+set(srcs
+    io/OciCommon.cpp
+    io/OciReader.cpp
+    io/OciWrapper.cpp
+)
+
+set(incs
+    io/OciCommon.hpp
+    io/OciReader.hpp
+    io/OciWrapper.h
+)
+
+PDAL_ADD_PLUGIN(reader_libname reader oci
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${ORACLE_LIBRARY})
+
+#
+# OCI Writer
+#
+set(srcs
+    io/OciCommon.cpp
+    io/OciWrapper.cpp
+    io/OciWriter.cpp
+)
+
+set(incs
+    io/OciCommon.hpp
+    io/OciWrapper.h
+    io/OciWriter.hpp
+)
+
+PDAL_ADD_PLUGIN(writer_libname writer oci
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${ORACLE_LIBRARY})
+
+#
+# OCI tests
+#
+if(BUILD_OCI_TESTS)
+    PDAL_ADD_TEST(ocitest
+        FILES test/OCITest.cpp
+        LINK_WITH ${reader_libname} ${writer_libname})
+endif()
diff --git a/plugins/oci/io/OciCommon.cpp b/plugins/oci/io/OciCommon.cpp
new file mode 100644
index 0000000..2404d7a
--- /dev/null
+++ b/plugins/oci/io/OciCommon.cpp
@@ -0,0 +1,159 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "OciCommon.hpp"
+
+#include <iostream>
+
+#include <pdal/Dimension.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+namespace pdal
+{
+
+Connection connect(std::string connSpec)
+{
+    using namespace std;
+
+    std::string connection(connSpec);
+
+    if (FileUtils::fileExists(connection))
+    {
+        std::istream::pos_type size;
+        std::istream* input = FileUtils::openFile(connection, true);
+        if (!input->good())
+        {
+            FileUtils::closeFile(input);
+            throw pdal_error("Unable to open connection filename for Oracle!");
+        }
+
+        std::string output;
+        std::string line;
+        while (input->good())
+        {
+            getline(*input, line);
+            if (output.size())
+                output += "\n" + line;
+            else
+                output = line;
+        }
+        connection = output;
+
+        FileUtils::closeFile(input);
+    }
+
+    Connection con;
+
+    auto pos = connection.find("/", 0);
+    if (pos == string::npos)
+        return con;
+
+    string username = connection.substr(0, pos);
+    connection = connection.substr(pos + 1);
+    pos = connection.find("@", 0);
+    if (pos == string::npos)
+        return con;
+    string password = connection.substr(0, pos);
+    string instance = connection.substr(pos + 1);
+
+    con = make_shared<pdal::OWConnection>(username.c_str(),
+        password.c_str(), instance.c_str());
+    return con;
+}
+
+
+XMLSchema fetchSchema(Statement stmt, BlockPtr block)
+{
+    // Fetch the XML that defines the schema for this point cloud
+    std::ostringstream schemaQuery;
+    OCILobLocator* metadata = NULL;
+    schemaQuery <<
+        "DECLARE" << std::endl << "PC_TABLE VARCHAR2(32) := '" <<
+            stmt->GetString(block->pc->base_table) << "';" << std::endl <<
+        "PC_ID NUMBER := " << stmt->GetInteger(&(block->pc->pc_id)) <<
+            ";" << std::endl <<
+        "PC_COLUMN VARCHAR2(32) := '" <<
+            stmt->GetString(block->pc->base_column) << "';" << std::endl <<
+        "BEGIN" << std::endl <<
+        std::endl <<
+        "EXECUTE IMMEDIATE" << std::endl <<
+        " 'SELECT T.'||PC_COLUMN||'.PC_OTHER_ATTRS.getClobVal()"
+            "FROM '||pc_table||' T WHERE T.ID='||"
+            "PC_ID INTO :metadata;" << std::endl <<
+        "END;" << std::endl;
+
+    Statement getSchemaStmt(
+        block->m_connection->CreateStatement(schemaQuery.str().c_str()));
+    getSchemaStmt->BindName(":metadata", &metadata);
+
+    getSchemaStmt->Execute();
+
+    char* pc_schema = getSchemaStmt->ReadCLob(metadata);
+    std::string pc_schema_xml;
+    if (pc_schema)
+    {
+        pc_schema_xml = pc_schema;
+        CPLFree(pc_schema);
+    }
+    std::ostringstream fname;
+    int cloudId = stmt->GetInteger(&(block->pc->pc_id)) ;
+    return XMLSchema(pc_schema_xml);
+}
+
+
+Block::Block(Connection connection) : num_points(0), m_connection(connection),
+    m_num_remaining(0), m_fetched(false)
+{
+    m_connection->CreateType(&blk_extent);
+    m_connection->CreateType(&blk_extent->sdo_ordinates,
+        m_connection->GetOrdinateType());
+    m_connection->CreateType(&blk_extent->sdo_elem_info,
+        m_connection->GetElemInfoType());
+    m_connection->CreateType(&blk_domain);
+    m_connection->CreateType(&pc);
+}
+
+
+Block::~Block()
+{
+    m_connection->DestroyType(&blk_domain);
+    m_connection->DestroyType(&blk_extent->sdo_elem_info);
+    m_connection->DestroyType(&blk_extent->sdo_ordinates);
+    m_connection->DestroyType(&pc);
+    // For some reason having the dtor destroy this
+    // causes a segfault
+    // m_connection->DestroyType(&blk_extent);
+}
+
+} // namespace pdal
diff --git a/plugins/oci/io/OciCommon.hpp b/plugins/oci/io/OciCommon.hpp
new file mode 100644
index 0000000..8ecd7f6
--- /dev/null
+++ b/plugins/oci/io/OciCommon.hpp
@@ -0,0 +1,124 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include "OciWrapper.h"
+
+#include <memory>
+
+#include <cpl_port.h>
+
+#include <pdal/PointTable.hpp>
+#include <pdal/XMLSchema.hpp>
+
+namespace pdal
+{
+
+typedef std::shared_ptr<OWConnection> Connection;
+typedef std::shared_ptr<OWStatement> Statement;
+
+class connection_failed : public pdal_error
+{
+public:
+    connection_failed(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+
+class buffer_too_small : public pdal_error
+{
+public:
+    buffer_too_small(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+
+class read_error : public pdal_error
+{
+public:
+    read_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+class Block
+{
+public:
+    Block(Connection connection);
+    ~Block();
+
+    point_count_t numRemaining() const
+        { return m_num_remaining; }
+    void setNumRemaining(point_count_t num_remaining)
+        { m_num_remaining = num_remaining; }
+    point_count_t numRead() const
+        { return num_points - m_num_remaining; }
+    point_count_t numPoints() const
+        { return num_points; }
+    char *data() const
+        { return (char *)chunk.data(); }
+    void reset()
+        { m_num_remaining = num_points; }
+    bool fetched() const
+        { return m_fetched; }
+    void setFetched()
+        { m_fetched = true; }
+    void clearFetched()
+        { m_fetched = false; }
+
+    int32_t obj_id;
+    int32_t blk_id;
+    sdo_geometry *blk_extent;
+    sdo_orgscl_type *blk_domain;
+    double pcblk_min_res;
+    double pcblk_max_res;
+    int32_t num_points;
+    int32_t num_unsorted_points;
+    int32_t pt_sort_dim;
+    std::vector<uint8_t> chunk;
+    OCILobLocator *locator;
+    Connection m_connection;
+    sdo_pc* pc;
+    int32_t m_num_remaining;
+    bool m_fetched;  // Set when fetched but not initialized
+};
+typedef std::shared_ptr<Block> BlockPtr;
+
+PDAL_DLL Connection connect(std::string connSpec);
+PDAL_DLL XMLSchema fetchSchema(Statement stmt, BlockPtr block);
+
+} // namespace pdal
diff --git a/plugins/oci/io/OciReader.cpp b/plugins/oci/io/OciReader.cpp
new file mode 100644
index 0000000..3a8125b
--- /dev/null
+++ b/plugins/oci/io/OciReader.cpp
@@ -0,0 +1,453 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/Compression.hpp>
+#include <pdal/GDALUtils.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+#include "OciReader.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.oci",
+    "Read point cloud data from Oracle SDO_POINTCLOUD.",
+    "http://pdal.io/stages/readers.oci.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, OciReader, Reader, s_info)
+
+std::string OciReader::getName() const { return s_info.name; }
+
+void OciReader::processOptions(const Options& options)
+{
+    m_schemaFile = options.getValueOrDefault<std::string>(
+        "xml_schema_dump", std::string());
+    if (options.hasOption("spatialreference"))
+        m_spatialRef = boost::optional<SpatialReference>(
+            options.getValueOrThrow<pdal::SpatialReference>(
+                "spatialreference"));
+    m_query = options.getValueOrThrow<std::string>("query");
+    m_connSpec = options.getValueOrDefault<std::string>("connection", "");
+
+    m_updatePointSourceId =  options.getValueOrDefault<bool>(
+        "populate_pointsourceid", false);
+}
+
+void OciReader::initialize()
+{
+    m_compression = false;
+    GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+    m_connection = connect(m_connSpec);
+    m_block = BlockPtr(new Block(m_connection));
+
+    if (m_query.empty())
+        throw pdal_error("'query' statement is empty. No data can be read "
+            "from pdal::OciReader");
+
+    m_stmt = Statement(m_connection->CreateStatement(m_query.c_str()));
+    m_stmt->Execute(0);
+
+    validateQuery();
+
+    // Map the query to the block in which data is to be stored.
+    defineBlock(m_stmt, m_block);
+
+    // Fetch an initial row of data.
+    if (!m_stmt->Fetch())
+        throw pdal_error("Unable to fetch a point cloud entry entry!");
+    m_block->setFetched();
+
+    // Set the spatial reference from options or set the one from the block.
+    if (m_spatialRef)
+        setSpatialReference(*m_spatialRef);
+    else
+        setSpatialReference(fetchSpatialReference(m_stmt, m_block));
+}
+
+
+void OciReader::defineBlock(Statement stmt, BlockPtr block) const
+{
+    int   iCol = 0;
+    char  szFieldName[OWNAME];
+    int   hType = 0;
+    int   nSize = 0;
+    int   nPrecision = 0;
+    signed short nScale = 0;
+    char szTypeName[OWNAME];
+
+    while (stmt->GetNextField(iCol, szFieldName, &hType, &nSize,
+        &nPrecision, &nScale, szTypeName))
+    {
+        if (hType == SQLT_NTY && boost::iequals(szTypeName, "SDO_PC"))
+            stmt->Define(&(block->pc));
+        else if (boost::iequals(szFieldName, "OBJ_ID"))
+            stmt->Define(&(block->obj_id));
+        else if (boost::iequals(szFieldName, "BLK_ID"))
+            stmt->Define(&(block->blk_id));
+        else if (boost::iequals(szFieldName, "BLK_EXTENT"))
+            stmt->Define(&(block->blk_extent));
+        else if (boost::iequals(szFieldName, "BLK_DOMAIN"))
+            stmt->Define(&(block->blk_domain));
+        else if (boost::iequals(szFieldName, "PCBLK_MIN_RES"))
+            stmt->Define(&(block->pcblk_min_res));
+        else if (boost::iequals(szFieldName, "PCBLK_MAX_RES"))
+            stmt->Define(&(block->pcblk_max_res));
+        else if (boost::iequals(szFieldName, "NUM_POINTS"))
+            stmt->Define(&(block->num_points));
+        else if (boost::iequals(szFieldName, "NUM_UNSORTED_POINTS"))
+            stmt->Define(&(block->num_unsorted_points));
+        else if (boost::iequals(szFieldName, "PT_SORT_DIM"))
+            stmt->Define(&(block->pt_sort_dim));
+        else if (boost::iequals(szFieldName, "POINTS"))
+            stmt->Define(&(block->locator));
+        iCol++;
+    }
+}
+
+
+Options OciReader::getDefaultOptions()
+{
+    Options options;
+
+    Option connection("connection", std::string(), "Oracle connection "
+        "string to connect to database");
+
+    Option query("query", std::string(), "SELECT statement that returns "
+        "an SDO_PC object as its first and only queried item.");
+
+    Option xml_schema_dump("xml_schema_dump", std::string(),
+        "Filename to dump the XML schema to.");
+
+    options.add(connection);
+    options.add(query);
+    options.add(xml_schema_dump);
+
+    return options;
+}
+
+
+// Throws an exception if a query is invalid.
+void OciReader::validateQuery()
+{
+    int col = 0;
+    char fieldName[OWNAME];
+    int hType = 0;
+    int size = 0;
+    int precision = 0;
+    signed short scale = 0;
+    char typeName[OWNAME];
+    bool typeCorrect = false;
+
+    // We must have all of these field names present to be considered block
+    // data.
+    std::set<std::string> reqFields;
+    reqFields.insert("OBJ_ID");
+    reqFields.insert("BLK_ID");
+    reqFields.insert("BLK_EXTENT");
+    reqFields.insert("BLK_DOMAIN");
+    reqFields.insert("PCBLK_MIN_RES");
+    reqFields.insert("PCBLK_MAX_RES");
+    reqFields.insert("NUM_POINTS");
+    reqFields.insert("NUM_UNSORTED_POINTS");
+    reqFields.insert("PT_SORT_DIM");
+    reqFields.insert("POINTS");
+
+    while (m_stmt->GetNextField(col, fieldName, &hType, &size,
+        &precision, &scale, typeName))
+    {
+        reqFields.erase(fieldName);
+        if (hType == SQLT_NTY)
+        {
+            if (strcmp(typeName,"SDO_PC") == 0)
+                typeCorrect = true;
+        }
+        col++;
+    }
+
+    if (!typeCorrect)
+    {
+        std::ostringstream oss;
+        oss << "Select statement '" << m_query <<
+            "' does not fetch a SDO_PC object.";
+        throw pdal_error(oss.str());
+    }
+
+    // If we found all the fields, the list of required fields will be empty.
+    // If not, throw an exception.
+    if (!reqFields.empty())
+    {
+        std::ostringstream oss;
+
+        oss << "Query returns a block but is missing reqired fields: ";
+        auto i = reqFields.begin();
+        while (i != reqFields.end())
+        {
+            oss << *i;
+            i++;
+            if (i != reqFields.end())
+               oss << ",";
+        }
+        throw pdal_error(oss.str());
+    }
+}
+
+
+pdal::SpatialReference OciReader::fetchSpatialReference(Statement stmt,
+    BlockPtr block) const
+{
+    // Fetch the WKT for the SRID to set the coordinate system of this stage
+    int srid = stmt->GetInteger(&(block->pc->pc_geometry.sdo_srid));
+    if (srid)
+    {
+        std::ostringstream oss;
+        oss << "EPSG:" << srid;
+        return pdal::SpatialReference(oss.str());
+    }
+    return pdal::SpatialReference();
+}
+
+
+void OciReader::addDimensions(PointLayoutPtr layout)
+{
+    log()->get(LogLevel::Debug) << "Fetching schema from SDO_PC object" <<
+        std::endl;
+
+    XMLSchema schema = fetchSchema(m_stmt, m_block);
+    loadSchema(layout, schema);
+    MetadataNode comp = schema.getMetadata().findChild("compression");
+    m_compression = (comp.value() == "lazperf");
+
+    if (m_schemaFile.size())
+    {
+        std::string pcSchema = schema.xml();
+        std::ostream *out = FileUtils::createFile(m_schemaFile);
+        out->write(pcSchema.c_str(), pcSchema.size());
+        FileUtils::closeFile(out);
+    }
+}
+
+
+point_count_t OciReader::read(PointViewPtr view, point_count_t count)
+{
+    if (eof())
+        return 0;
+
+    point_count_t totalNumRead = 0;
+    while (totalNumRead < count)
+    {
+        if (m_block->numRemaining() == 0)
+            if (!readOci(m_stmt, m_block))
+                return totalNumRead;
+        PointId bufBegin = view->size();
+
+        point_count_t numRead = 0;
+        if (orientation() == Orientation::DimensionMajor)
+            numRead = readDimMajor(*view, m_block, count - totalNumRead);
+        else if (orientation() == Orientation::PointMajor)
+            numRead = readPointMajor(*view, m_block, count - totalNumRead);
+        PointId bufEnd = bufBegin + numRead;
+        totalNumRead += numRead;
+    }
+    return totalNumRead;
+}
+
+
+point_count_t OciReader::readDimMajor(PointView& view, BlockPtr block,
+    point_count_t numPts)
+{
+    using namespace Dimension;
+
+    point_count_t numRemaining = block->numRemaining();
+    PointId startId = view.size();
+    point_count_t blockRemaining = numRemaining;
+    point_count_t numRead = 0;
+
+    DimTypeList dims = dbDimTypes();
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+    {
+        PointId nextId = startId;
+        char *pos = seekDimMajor(*di, block);
+        blockRemaining = numRemaining;
+        numRead = 0;
+        while (numRead < numPts && blockRemaining > 0)
+        {
+            writeField(view, pos, *di, nextId);
+            pos += Dimension::size(di->m_type);
+
+            if (di->m_id == Id::PointSourceId && m_updatePointSourceId)
+                view.setField(Id::PointSourceId, nextId, block->obj_id);
+
+            if (m_cb && di == dims.rbegin().base() - 1)
+                m_cb(view, nextId);
+
+            nextId++;
+            numRead++;
+            blockRemaining--;
+        }
+    }
+    block->setNumRemaining(blockRemaining);
+    return numRead;
+}
+
+
+point_count_t OciReader::readPointMajor(PointView& view,
+    BlockPtr block, point_count_t numPts)
+{
+    size_t numRemaining = block->numRemaining();
+    PointId nextId = view.size();
+    point_count_t numRead = 0;
+
+    if (m_compression)
+    {
+#ifdef PDAL_HAVE_LAZPERF
+        LazPerfBuf buf(block->chunk);
+        LazPerfDecompressor<LazPerfBuf> decompressor(buf, dbDimTypes());
+
+        std::vector<char> ptBuf(decompressor.pointSize());
+        while (numRead < numPts && numRemaining > 0)
+        {
+            point_count_t numWritten =
+                decompressor.decompress(ptBuf.data(), ptBuf.size());
+            writePoint(view, nextId, ptBuf.data());
+            if (m_cb)
+                m_cb(view, nextId);
+            numRemaining--;
+            nextId++;
+            numRead++;
+        }
+#else
+        throw pdal_error("Can't decompress without LAZperf.");
+#endif
+    }
+    else
+    {
+        char *pos = seekPointMajor(block);
+        while (numRead < numPts && numRemaining > 0)
+        {
+            writePoint(view, nextId, pos);
+
+            if (m_cb)
+                m_cb(view, nextId);
+
+            pos += packedPointSize();
+            numRemaining--;
+            nextId++;
+            numRead++;
+        }
+    }
+    block->setNumRemaining(numRemaining);
+    return numRead;
+}
+
+
+char *OciReader::seekDimMajor(const DimType& d, BlockPtr block)
+{
+    return block->data() +
+        (dimOffset(d.m_id) * block->numPoints()) +
+        (Dimension::size(d.m_type) * block->numRead());
+}
+
+
+char *OciReader::seekPointMajor(BlockPtr block)
+{
+    return block->data() + (block->numRead() * packedPointSize());
+}
+
+
+// Read a block (set of points) from the database.
+bool OciReader::readOci(Statement stmt, BlockPtr block)
+{
+    if (!block->fetched())
+    {
+        if (!stmt->Fetch())
+        {
+            m_atEnd = true;
+            return false;
+        }
+        block->setFetched();
+    }
+    // Read the points from the blob in the row.
+    readBlob(stmt, block);
+    XMLSchema *s = findSchema(stmt, block);
+    updateSchema(*s);
+    MetadataNode comp = s->getMetadata().findChild("compression");
+    m_compression = (comp.value() == "lazperf");
+
+    block->reset();
+    block->clearFetched();
+    return true;
+}
+
+
+void OciReader::readBlob(Statement stmt, BlockPtr block)
+{
+    uint32_t amountRead = 0;
+    uint32_t blobLength = stmt->GetBlobLength(block->locator);
+
+    if (block->chunk.size() < blobLength)
+        block->chunk.resize(blobLength);
+
+    if (!stmt->ReadBlob(block->locator, (void*)(block->chunk.data()),
+                        block->chunk.size() , &amountRead))
+        throw pdal_error("Did not read all blob data!");
+
+    block->chunk.resize(amountRead);
+}
+
+
+// All of the schemas should be the same with regard to actual dimension
+// name, order, etc, but each cloud may have its own scaling for X, Y and Z.
+// Store it away so that it can be applied later if necessary.
+// HOBU -- nope. Each Block/cloud combo could potentially have a different
+// schema, with same names but different composition.
+// ABELL -- the setup doesn't allow this.  Dimensions and order is all stored
+// when the first block is read.  We don't have any facility for modifying
+// dimensions as blocks are read.  If this were to actually happen, things
+// would break.  Should we do something about it?
+XMLSchema *OciReader::findSchema(Statement stmt, BlockPtr block)
+{
+    int32_t cloudId = stmt->GetInteger(&block->pc->pc_id);
+    auto si = m_schemas.find(cloudId);
+    if (si == m_schemas.end())
+    {
+        XMLSchema s = fetchSchema(stmt, block);
+        auto i = m_schemas.insert(std::make_pair(cloudId, s));
+        si = i.first;
+    }
+    return &(si->second);
+}
+
+} // namespace pdal
diff --git a/plugins/oci/io/OciReader.hpp b/plugins/oci/io/OciReader.hpp
new file mode 100644
index 0000000..5a7bea5
--- /dev/null
+++ b/plugins/oci/io/OciReader.hpp
@@ -0,0 +1,100 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <vector>
+
+#include <pdal/DbReader.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "OciCommon.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL OciReader : public DbReader
+{
+public:
+    OciReader()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void initialize();
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table)
+        { m_atEnd = false; }
+    virtual point_count_t read(PointViewPtr view, point_count_t);
+    virtual bool eof()
+        { return m_atEnd; }
+
+    void validateQuery();
+    void defineBlock(Statement statement, BlockPtr block) const;
+    pdal::SpatialReference fetchSpatialReference(Statement statement,
+        BlockPtr block) const;
+
+    void readBlob(Statement stmt, BlockPtr block);
+    point_count_t readDimMajor(PointView& view, BlockPtr block,
+        point_count_t numPts);
+    point_count_t readPointMajor(PointView& view, BlockPtr block,
+        point_count_t numPts);
+    char *seekDimMajor(const DimType& d, BlockPtr block);
+    char *seekPointMajor(BlockPtr block);
+    bool readOci(Statement stmt, BlockPtr block);
+    XMLSchema *findSchema(Statement stmt, BlockPtr block);
+
+    Connection m_connection;
+    Statement m_stmt;
+    BlockPtr m_block;
+    std::string m_query;
+    std::string m_schemaFile;
+    std::string m_connSpec;
+    bool m_updatePointSourceId;
+    boost::optional<SpatialReference> m_spatialRef;
+    bool m_atEnd;
+    std::map<int32_t, XMLSchema> m_schemas;
+    bool m_compression;
+
+    OciReader& operator=(const OciReader&); // not implemented
+    OciReader(const OciReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/oci/io/OciWrapper.cpp b/plugins/oci/io/OciWrapper.cpp
new file mode 100644
index 0000000..d5a4179
--- /dev/null
+++ b/plugins/oci/io/OciWrapper.cpp
@@ -0,0 +1,2498 @@
+/******************************************************************************
+ * $Id: $
+ *
+ * Name:     oci_wrapper.cpp
+ * Project:  Oracle Spatial GeoRaster Driver
+ * Purpose:  Limited wrapper for OCI (Oracle Call Interfaces)
+ * Author:   Ivan Lucena [ivan.lucena at pmldnet.com]
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Ivan Lucena
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#include "OciWrapper.h"
+
+#include <iostream>
+
+namespace pdal 
+{
+
+
+static const OW_CellDepth ahOW_CellDepth[] =
+{
+    {"8BIT_U",          GDT_Byte},
+    {"16BIT_U",         GDT_UInt16},
+    {"16BIT_S",         GDT_Int16},
+    {"32BIT_U",         GDT_UInt32},
+    {"32BIT_S",         GDT_Int32},
+    {"32BIT_REAL",      GDT_Float32},
+    {"64BIT_REAL",      GDT_Float64},
+    {"32BIT_COMPLEX",   GDT_CFloat32},
+    {"64BIT_COMPLEX",   GDT_CFloat64},
+    {"1BIT",            GDT_Byte},
+    {"2BIT",            GDT_Byte},
+    {"4BIT",            GDT_Byte}
+};
+
+/*****************************************************************************/
+/*                            OWConnection                                   */
+/*****************************************************************************/
+
+OWConnection::OWConnection(const char* pszUserIn,
+                           const char* pszPasswordIn,
+                           const char* pszServerIn)
+{
+    pszUser         = CPLStrdup(pszUserIn);
+    pszPassword     = CPLStrdup(pszPasswordIn);
+    pszServer       = CPLStrdup(pszServerIn);
+    hEnv            = NULL;
+    hError          = NULL;
+    hSvcCtx         = NULL;
+    hDescribe       = NULL;
+    hNumArrayTDO    = NULL;
+    hGeometryTDO    = NULL;
+    hGeoRasterTDO   = NULL;
+    hElemArrayTDO   = NULL;
+    hOrdnArrayTDO   = NULL;
+    bSuceeeded      = false;
+    nCharSize       = 1;
+
+    // ------------------------------------------------------
+    //  Operational Systems's authentication option
+    // ------------------------------------------------------
+
+    const char* pszUserId = "/";
+
+    ub4 eCred = OCI_CRED_RDBMS;
+
+    if (EQUAL(pszServer, "") &&
+            EQUAL(pszPassword, "") &&
+            EQUAL(pszUser, ""))
+    {
+        eCred = OCI_CRED_EXT;
+    }
+    else
+    {
+        pszUserId = pszUser;
+    }
+
+    // ------------------------------------------------------
+    //  Initialize Environment handler                                  */
+    // ------------------------------------------------------
+
+    if (OCIEnvCreate(&hEnv,
+        (ub4)(OCI_DEFAULT | OCI_OBJECT | OCI_THREADED),
+        (dvoid *) 0, (dvoid * (*)(dvoid *, size_t)) 0,
+        (dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
+        (void (*)(dvoid *, dvoid *)) 0, (size_t) 0,
+        (dvoid **) 0), NULL)
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Initialize Error handler
+    // ------------------------------------------------------
+
+    if (CheckError(OCIHandleAlloc((dvoid *) hEnv, (dvoid **) &hError,
+        OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0), NULL))
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Initialize Server Context
+    // ------------------------------------------------------
+
+    if (CheckError(OCIHandleAlloc((dvoid *) hEnv, (dvoid **) &hSvcCtx,
+        OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0), hError))
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Allocate Server and Authentication (Session) handler
+    // ------------------------------------------------------
+
+    if (CheckError(OCIHandleAlloc((dvoid *) hEnv, (dvoid **) &hServer,
+        (ub4) OCI_HTYPE_SERVER, (size_t) 0, (dvoid **) 0), hError))
+    {
+        return;
+    }
+
+    if (CheckError(OCIHandleAlloc((dvoid *) hEnv, (dvoid **)&hSession,
+        (ub4) OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0), hError))
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Attach to the server
+    // ------------------------------------------------------
+
+    if (CheckError(OCIServerAttach(hServer, hError, (text*) pszServer,
+        strlen((char*) pszServer), 0), hError))
+    {
+        return;
+    }
+
+    if (CheckError(OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION,
+        (dvoid*)const_cast<char *>( pszUserId), (ub4) strlen(pszUserId),
+        (ub4) OCI_ATTR_USERNAME, hError), hError))
+    {
+        return;
+    }
+
+    if (CheckError(OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION,
+        (dvoid *) pszPassword, (ub4) strlen((char *) pszPassword),
+        (ub4) OCI_ATTR_PASSWORD, hError), hError))
+    {
+        return;
+    }
+
+    if (CheckError(OCIAttrSet((dvoid *) hSvcCtx, OCI_HTYPE_SVCCTX,
+        (dvoid *)hServer, (ub4) 0, OCI_ATTR_SERVER, (OCIError *) hError),
+        hError))
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Initialize Session
+    // ------------------------------------------------------
+
+    if (CheckError(OCISessionBegin(hSvcCtx, hError, hSession, eCred,
+                                   (ub4) OCI_DEFAULT), hError))
+    {
+        return;
+    }
+
+    // ------------------------------------------------------
+    //  Initialize Service
+    // ------------------------------------------------------
+
+    if (CheckError(OCIAttrSet((dvoid *) hSvcCtx, (ub4) OCI_HTYPE_SVCCTX,
+                              (dvoid *) hSession, (ub4) 0,
+                              (ub4) OCI_ATTR_SESSION, hError), hError))
+    {
+        return;
+    }
+
+    bSuceeeded = true;
+
+    // ------------------------------------------------------
+    //  Get Character Size based on current Locale
+    // ------------------------------------------------------
+
+    OCINlsNumericInfoGet(hEnv, hError,
+                         &nCharSize, OCI_NLS_CHARSET_MAXBYTESZ);
+
+    // ------------------------------------------------------
+    //  Get Server Version
+    // ------------------------------------------------------
+
+    char szVersionTxt[OWTEXT];
+
+    OCIServerVersion(
+        hSvcCtx,
+        hError,
+        (text*) szVersionTxt,
+        (ub4) OWTEXT,
+        (ub1) OCI_HTYPE_SVCCTX);
+
+    nVersion = OWParseServerVersion(szVersionTxt);
+
+    // ------------------------------------------------------
+    //  Initialize/Describe types
+    // ------------------------------------------------------
+
+    CheckError(OCIHandleAlloc(
+                   (dvoid*) hEnv,
+                   (dvoid**)(dvoid*) &hDescribe,
+                   (ub4) OCI_HTYPE_DESCRIBE,
+                   (size_t) 0,
+                   (dvoid**) NULL), hError);
+
+    hNumArrayTDO    = DescribeType(SDO_NUMBER_ARRAY);
+    hGeometryTDO    = DescribeType(SDO_GEOMETRY);
+    hGeoRasterTDO   = DescribeType(SDO_GEORASTER);
+    hElemArrayTDO   = DescribeType(SDO_ELEM_INFO_ARRAY);
+    hOrdnArrayTDO   = DescribeType(SDO_ORDINATE_ARRAY);
+
+    if (nVersion > 10)
+    {
+        hPCTDO      = DescribeType(SDO_PC);
+        hPC_BLK_TDO = DescribeType(SDO_PC_BLK);
+    }
+}
+
+OWConnection::~OWConnection()
+{
+    OCIHandleFree((dvoid*) hDescribe, (ub4) OCI_HTYPE_DESCRIBE);
+
+    if (hSvcCtx && hError && hSession)
+        OCISessionEnd(hSvcCtx, hError, hSession, (ub4) 0);
+
+    if (hSvcCtx && hError)
+        OCIServerDetach(hServer, hError, (ub4) OCI_DEFAULT);
+
+    if (hServer)
+        OCIHandleFree((dvoid *) hServer, (ub4) OCI_HTYPE_SERVER);
+
+    if (hSvcCtx)
+        OCIHandleFree((dvoid *) hSvcCtx, (ub4) OCI_HTYPE_SVCCTX);
+
+    if (hError)
+        OCIHandleFree((dvoid *) hError, (ub4) OCI_HTYPE_ERROR);
+
+    if (hSession)
+        OCIHandleFree((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION);
+}
+
+OCIType* OWConnection::DescribeType(const char *pszTypeName)
+{
+    OCIParam* hParam    = NULL;
+    OCIRef*   hRef      = NULL;
+    OCIType*  hType     = NULL;
+
+    CheckError(OCIDescribeAny(
+                   hSvcCtx,
+                   hError,
+                   (dvoid*)const_cast<char *>( pszTypeName),
+                   (ub4) strlen(pszTypeName),
+                   (ub1) OCI_OTYPE_NAME,
+                   (ub1) OCI_DEFAULT,
+                   (ub1) OCI_PTYPE_TYPE,
+                   hDescribe), hError);
+
+    CheckError(OCIAttrGet(
+                   hDescribe,
+                   (ub4) OCI_HTYPE_DESCRIBE,
+                   (dvoid*) &hParam,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_PARAM,
+                   hError), hError);
+
+    CheckError(OCIAttrGet(
+                   hParam,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &hRef,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_REF_TDO,
+                   hError), hError);
+
+    CheckError(OCIObjectPin(
+                   hEnv,
+                   hError,
+                   hRef,
+                   (OCIComplexObject*) NULL,
+                   (OCIPinOpt) OCI_PIN_ANY,
+                   (OCIDuration) OCI_DURATION_SESSION,
+                   (OCILockOpt) OCI_LOCK_NONE,
+                   (dvoid**)(dvoid*) &hType), hError);
+
+    return hType;
+}
+
+void OWConnection::CreateType(sdo_geometry** pphData)
+{
+    CheckError(OCIObjectNew(
+                   hEnv,
+                   hError,
+                   hSvcCtx,
+                   OCI_TYPECODE_OBJECT,
+                   hGeometryTDO,
+                   (dvoid *) 0,
+                   OCI_DURATION_CALL,
+                   TRUE,
+                   (dvoid **) pphData), hError);
+}
+
+void OWConnection::DestroyType(sdo_geometry** pphData)
+{
+    CheckError(OCIObjectFree(
+                   hEnv,
+                   hError,
+                   (dvoid*) *pphData,
+                   (ub2) 0), NULL);
+}
+
+void OWConnection::CreateType(sdo_pc** pphData)
+{
+    CheckError(OCIObjectNew(
+                   hEnv,
+                   hError,
+                   hSvcCtx,
+                   OCI_TYPECODE_OBJECT,
+                   hPCTDO,
+                   (dvoid *) 0,
+                   OCI_DURATION_CALL,
+                   TRUE,
+                   (dvoid **) pphData), hError);
+}
+
+void OWConnection::DestroyType(sdo_pc** pphData)
+{
+    CheckError(OCIObjectFree(
+                   hEnv,
+                   hError,
+                   (dvoid*) *pphData,
+                   (ub2) 0), NULL);
+}
+
+void OWConnection::CreateType(sdo_pc_blk** pphData)
+{
+    CheckError(OCIObjectNew(
+                   hEnv,
+                   hError,
+                   hSvcCtx,
+                   OCI_TYPECODE_OBJECT,
+                   hPC_BLK_TDO,
+                   (dvoid *) 0,
+                   OCI_DURATION_CALL,
+                   TRUE,
+                   (dvoid **) pphData), hError);
+}
+
+void OWConnection::DestroyType(sdo_pc_blk** pphData)
+{
+    CheckError(OCIObjectFree(
+                   hEnv,
+                   hError,
+                   (dvoid*) *pphData,
+                   (ub2) 0), NULL);
+}
+
+
+void OWConnection::CreateType(sdo_orgscl_type** pphData)
+{
+    CheckError(OCIObjectNew(
+                   hEnv,
+                   hError,
+                   hSvcCtx,
+                   OCI_TYPECODE_OBJECT,
+                   hPCTDO,
+                   (dvoid *) 0,
+                   OCI_DURATION_CALL,
+                   TRUE,
+                   (dvoid **) pphData), hError);
+}
+
+void OWConnection::DestroyType(sdo_orgscl_type** pphData)
+{
+    CheckError(OCIObjectFree(
+                   hEnv,
+                   hError,
+                   (dvoid*) *pphData,
+                   (ub2) 0), NULL);
+}
+
+
+void OWConnection::CreateType(OCIArray** phData, OCIType* otype)
+{
+    CheckError(OCIObjectNew(hEnv,
+                            hError,
+                            hSvcCtx,
+                            OCI_TYPECODE_VARRAY,
+                            otype,
+                            (dvoid *)NULL,
+                            OCI_DURATION_SESSION,
+                            FALSE,
+                            (dvoid **)phData), hError);
+}
+
+void OWConnection::DestroyType(OCIArray** phData)
+{
+    CheckError(OCIObjectFree(
+                   hEnv,
+                   hError,
+                   (OCIColl*) *phData,
+                   (ub2) 0), NULL);
+}
+
+OWStatement* OWConnection::CreateStatement(const char* pszStatement)
+{
+    OWStatement* poStatement = new OWStatement(this, pszStatement);
+
+    return poStatement;
+}
+
+OCIParam* OWConnection::GetDescription(char* pszTable)
+{
+    OCIParam*    phParam    = NULL;
+    OCIParam*    phAttrs    = NULL;
+
+    CheckError(OCIDescribeAny(
+                   hSvcCtx,
+                   hError,
+                   (text*) pszTable,
+                   (ub4) strlen(pszTable),
+                   (ub1) OCI_OTYPE_NAME,
+                   (ub1) OCI_DEFAULT,
+                   (ub1) OCI_PTYPE_TABLE,
+                   hDescribe), hError);
+
+    CheckError(OCIAttrGet(
+                   hDescribe,
+                   (ub4) OCI_HTYPE_DESCRIBE,
+                   (dvoid*) &phParam,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_PARAM,
+                   hError), hError);
+
+    CheckError(OCIAttrGet(
+                   phParam,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &phAttrs,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_LIST_COLUMNS,
+                   hError), hError);
+
+    return phAttrs;
+}
+
+bool OWConnection::GetNextField(OCIParam* phTable,
+                                int nIndex,
+                                char* pszName,
+                                int* pnType,
+                                int* pnSize,
+                                int* pnPrecision,
+                                signed short* pnScale)
+{
+    OCIParam* hParmDesc = NULL;
+
+    sword nStatus = 0;
+
+    nStatus = OCIParamGet(
+                  phTable,
+                  (ub4) OCI_DTYPE_PARAM,
+                  hError,
+                  (dvoid**) &hParmDesc,   //Warning
+                  (ub4) nIndex + 1);
+
+    if (nStatus != OCI_SUCCESS)
+    {
+        return false;
+    }
+
+    char* pszFieldName = NULL;
+    ub4 nNameLength = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &pszFieldName,
+                   (ub4*) &nNameLength,
+                   (ub4) OCI_ATTR_NAME,
+                   hError), hError);
+
+    ub2 nOCIType = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &nOCIType,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_DATA_TYPE,
+                   hError), hError);
+
+    ub2 nOCILen = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &nOCILen,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_DATA_SIZE,
+                   hError), hError);
+
+    unsigned short nOCIPrecision = 0;
+    sb1 nOCIScale = 0;
+
+    if (nOCIType == SQLT_NUM)
+    {
+        CheckError(OCIAttrGet(
+                       hParmDesc,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &nOCIPrecision,
+                       (ub4*) 0,
+                       (ub4) OCI_ATTR_PRECISION,
+                       hError), hError);
+
+        CheckError(OCIAttrGet(
+                       hParmDesc,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &nOCIScale,
+                       (ub4*) 0,
+                       (ub4) OCI_ATTR_SCALE,
+                       hError), hError);
+
+        if (nOCIPrecision > 255)  // Lesson learned from ogrocisession.cpp
+        {
+            nOCIPrecision = nOCIPrecision / 256;
+        }
+    }
+
+    nNameLength = MIN(nNameLength, OWNAME);
+
+    strncpy(pszName, pszFieldName, nNameLength);
+    pszName[nNameLength] = '\0';
+
+    *pnType      = (int) nOCIType;
+    *pnSize      = (int) nOCILen;
+    *pnPrecision = (int) nOCIPrecision;
+    *pnScale     = (signed short) nOCIScale;
+
+    return true;
+
+}
+
+bool OWConnection::StartTransaction()
+{
+    CheckError(OCITransStart(
+                   hSvcCtx,
+                   hError,
+                   (uword) 30,
+                   OCI_TRANS_NEW), hError);
+
+    return true;
+}
+
+bool OWConnection::Commit()
+{
+    CheckError(OCITransCommit(
+                   hSvcCtx,
+                   hError,
+                   OCI_DEFAULT), hError);
+
+    return true;
+}
+
+/*****************************************************************************/
+/*                           OWStatement                                     */
+/*****************************************************************************/
+
+OWStatement::OWStatement(OWConnection* pConnect, const char* pszStatement)
+{
+    poConnection    = pConnect;
+    nStmtMode       = OCI_DEFAULT;
+    nNextCol        = 0;
+    nNextBnd        = 0;
+    hError          = poConnection->hError;
+
+    //  -----------------------------------------------------------
+    //  Create Statement handler
+    //  -----------------------------------------------------------
+
+    OCIStmt* hStatement;
+
+    CheckError(OCIHandleAlloc((dvoid*) poConnection->hEnv,
+                              (dvoid**)(dvoid*) &hStatement,
+                              (ub4) OCI_HTYPE_STMT,
+                              (size_t) 0,
+                              (dvoid**) NULL), hError);
+
+    hStmt = hStatement;   // Save Statement Handle
+
+    //  -----------------------------------------------------------
+    //  Prepare Statement
+    //  -----------------------------------------------------------
+
+    CheckError(OCIStmtPrepare(hStmt,
+                              hError,
+                              (const text*) pszStatement,
+                              (ub4) strlen(pszStatement),
+                              (ub4) OCI_NTV_SYNTAX,
+                              (ub4) OCI_DEFAULT), hError);
+
+    //  -----------------------------------------------------------
+    //  Get Statement type
+    //  -----------------------------------------------------------
+
+    ub2 nStmtType;
+
+    CheckError(OCIAttrGet((dvoid*) hStmt,
+                          (ub4) OCI_HTYPE_STMT,
+                          (dvoid*) &nStmtType,
+                          (ub4*) 0,
+                          (ub4) OCI_ATTR_STMT_TYPE,
+                          hError), hError);
+
+    //  -----------------------------------------------------------
+    //  Set Statement mode
+    //  -----------------------------------------------------------
+
+    if (nStmtType != OCI_STMT_SELECT)
+    {
+        nStmtMode = OCI_DEFAULT;
+    }
+}
+
+OWStatement::~OWStatement()
+{
+    OCIHandleFree((dvoid*) hStmt, (ub4) OCI_HTYPE_STMT);
+}
+
+bool OWStatement::Execute(int nRows)
+{
+    sword nStatus = OCIStmtExecute(poConnection->hSvcCtx,
+                                   hStmt,
+                                   hError,
+                                   (ub4) nRows,
+                                   (ub4) 0,
+                                   (OCISnapshot*) NULL,
+                                   (OCISnapshot*) NULL,
+                                   nStmtMode);
+
+    if (CheckError(nStatus, hError))
+    {
+        return false;
+    }
+
+
+    if (nStatus == OCI_SUCCESS_WITH_INFO || nStatus == OCI_NO_DATA)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool OWStatement::Fetch(int nRows)
+{
+    sword nStatus = 0;
+
+    nStatus = OCIStmtFetch2(
+                  (OCIStmt*) hStmt,
+                  (OCIError*) poConnection->hError,
+                  (ub4) nRows,
+                  (ub2) OCI_FETCH_NEXT,
+                  (sb4) 0,
+                  (ub4) OCI_DEFAULT);
+
+    if (nStatus == OCI_NO_DATA)
+    {
+        return false;
+    }
+
+    if (CheckError(nStatus, poConnection->hError))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+
+bool OWStatement::GetNextField(
+    int nIndex,
+    char* pszName,
+    int* pnType,
+    int* pnSize,
+    int* pnPrecision,
+    signed short* pnScale ,
+    char* pszTypeName)
+{
+    OCIParam* hParmDesc = NULL;
+
+    sword nStatus = 0;
+
+    nStatus = OCIParamGet(
+                  hStmt,
+                  (ub4) OCI_HTYPE_STMT,
+                  hError,
+                  (dvoid**) &hParmDesc,   //Warning
+                  (ub4) nIndex + 1);
+
+    if (nStatus != OCI_SUCCESS)
+    {
+        return false;
+    }
+
+    char* pszFieldName = NULL;
+    ub4 nNameLength = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &pszFieldName,
+                   (ub4*) &nNameLength,
+                   (ub4) OCI_ATTR_NAME,
+                   hError), hError);
+
+    ub2 nOCIType = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &nOCIType,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_DATA_TYPE,
+                   hError), hError);
+
+    ub2 nOCILen = 0;
+
+    CheckError(OCIAttrGet(
+                   hParmDesc,
+                   (ub4) OCI_DTYPE_PARAM,
+                   (dvoid*) &nOCILen,
+                   (ub4*) NULL,
+                   (ub4) OCI_ATTR_DATA_SIZE,
+                   hError), hError);
+
+    unsigned short nOCIPrecision = 0;
+    sb1 nOCIScale = 0;
+
+    if (nOCIType == SQLT_NUM)
+    {
+        CheckError(OCIAttrGet(
+                       hParmDesc,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &nOCIPrecision,
+                       (ub4*) 0,
+                       (ub4) OCI_ATTR_PRECISION,
+                       hError), hError);
+
+        CheckError(OCIAttrGet(
+                       hParmDesc,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &nOCIScale,
+                       (ub4*) 0,
+                       (ub4) OCI_ATTR_SCALE,
+                       hError), hError);
+
+        if (nOCIPrecision > 255)  // Lesson learned from ogrocisession.cpp
+        {
+            nOCIPrecision = nOCIPrecision / 256;
+        }
+    }
+
+    if (nOCIType == SQLT_NTY)
+    {
+        OCIRef* type_ref;
+
+        OCIParam* typeParam = NULL;
+
+        CheckError(OCIAttrGet(
+                       hParmDesc,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &type_ref,
+                       (ub4*) NULL,
+                       (ub4) OCI_ATTR_REF_TDO,
+                       hError), hError);
+
+        CheckError(OCIDescribeAny(
+                       poConnection->hSvcCtx,
+                       hError,
+                       (dvoid*) type_ref,
+                       0,
+                       (ub1) OCI_OTYPE_REF,
+                       (ub1) OCI_DEFAULT,
+                       (ub1) OCI_PTYPE_TYPE,
+                       poConnection->hDescribe), hError);
+
+        CheckError(OCIAttrGet(
+                       poConnection->hDescribe,
+                       (ub4) OCI_HTYPE_DESCRIBE,
+                       (dvoid*) &typeParam,
+                       (ub4*) 0,
+                       (ub4) OCI_ATTR_PARAM,
+                       hError), hError);
+
+        text* pszFieldTypeName = NULL;
+        ub4 nFieldTypeNameSize = 0;
+
+        CheckError(OCIAttrGet(
+                       typeParam,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &pszFieldTypeName,
+                       (ub4*) &nFieldTypeNameSize,
+                       (ub4) OCI_ATTR_SCHEMA_NAME,
+                       hError), hError);
+
+        // Get Type's name and set it to pszFieldTypeName
+        CheckError(OCIAttrGet(
+                       typeParam,
+                       (ub4) OCI_DTYPE_PARAM,
+                       (dvoid*) &pszFieldTypeName,
+                       (ub4*) &nFieldTypeNameSize,
+                       (ub4) OCI_ATTR_NAME,
+                       hError), hError);
+
+        nFieldTypeNameSize = MIN(nFieldTypeNameSize, OWNAME);
+        strncpy(pszTypeName, (char*)pszFieldTypeName, nFieldTypeNameSize);
+        pszTypeName[nFieldTypeNameSize] = '\0';
+
+    }
+
+    nNameLength = MIN(nNameLength, OWNAME);
+
+
+    strncpy(pszName, pszFieldName, nNameLength);
+    pszName[nNameLength] = '\0';
+
+
+    *pnType      = (int) nOCIType;
+    *pnSize      = (int) nOCILen;
+    *pnPrecision = (int) nOCIPrecision;
+    *pnScale     = (signed short) nOCIScale;
+
+    return true;
+
+}
+
+void OWStatement::Bind(int* pnData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pnData,
+                   (sb4) sizeof(int),
+                   (ub2) SQLT_INT,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Bind(long* pnData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pnData,
+                   (sb4) sizeof(long),
+                   (ub2) SQLT_INT,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Bind(double* pnData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pnData,
+                   (sb4) sizeof(double),
+                   (ub2) SQLT_BDOUBLE,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Bind(char* pData, long nData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pData,
+                   (sb4) nData,
+                   (ub2) SQLT_LBI,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindClob(char* pData, long nData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pData,
+                   (sb4) nData,
+                   (ub2) SQLT_LNG,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Bind(sdo_geometry** pphData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) NULL,
+                   (sb4) 0,
+                   (ub2) SQLT_NTY,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+
+    CheckError(OCIBindObject(
+                   hBind,
+                   hError,
+                   poConnection->hGeometryTDO,
+                   (dvoid**) pphData,
+                   (ub4*) 0,
+                   (dvoid**) 0,
+                   (ub4*) 0),
+               hError);
+
+}
+
+void OWStatement::Bind(sdo_pc_blk** pphData)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) NULL,
+                   (sb4) 0,
+                   (ub2) SQLT_NTY,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+
+    CheckError(OCIBindObject(
+                   hBind,
+                   hError,
+                   poConnection->hPC_BLK_TDO,
+                   (dvoid**) pphData,
+                   (ub4*) 0,
+                   (dvoid**) 0,
+                   (ub4*) 0),
+               hError);
+
+}
+
+void OWStatement::BindBlob(OCILobLocator** pphLocator)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pphLocator,
+                   (sb4) -1,
+                   (ub2) SQLT_BLOB,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindClob(OCILobLocator** pphLocator)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pphLocator,
+                   (sb4) -1,
+                   (ub2) SQLT_CLOB,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Bind(OCIArray** pphData, OCIType* type)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) 0,
+                   (sb4) 0,
+                   (ub2) SQLT_NTY,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+
+    CheckError(OCIBindObject(
+                   hBind,
+                   hError,
+                   type,
+                   (dvoid **)pphData,
+                   (ub4 *)0,
+                   (dvoid **)0,
+                   (ub4 *)0),
+               hError);
+
+}
+
+void OWStatement::Bind(char* pszData, int nSize)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pszData,
+                   (sb4) nSize,
+                   (ub2) SQLT_STR,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Define(int* pnData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pnData,
+                              (sb4) sizeof(int),
+                              (ub2) SQLT_INT,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+void OWStatement::Define(long* pnData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pnData,
+                              (sb4) sizeof(long int),
+                              (ub2) SQLT_INT,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+void OWStatement::Define(long long* pnData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pnData,
+                              (sb4) sizeof(long int),
+                              (ub2) SQLT_INT,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+void OWStatement::Define(double* pfdData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pfdData,
+                              (sb4) sizeof(double),
+                              (ub2) SQLT_BDOUBLE,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+void OWStatement::Define(char* pszData, int nSize)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(
+                   hStmt,
+                   &hDefine,
+                   hError,
+                   (ub4) nNextCol,
+                   (dvoid*) pszData,
+                   (sb4) nSize,
+                   (ub2) SQLT_STR,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::Define(OCILobLocator** pphLocator)
+{
+    OCIDefine*  hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDescriptorAlloc(
+                   poConnection->hEnv,
+                   (void**) pphLocator,
+                   OCI_DTYPE_LOB,
+                   0,
+                   0),
+               hError);
+
+    CheckError(OCIDefineByPos(
+                   hStmt,
+                   &hDefine,
+                   hError,
+                   (ub4) nNextCol,
+                   (dvoid*) pphLocator,
+                   (sb4) 0,
+                   (ub2) SQLT_BLOB,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+void OWStatement::DefineClob(OCILobLocator** pphLocator, long nIterations)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    long i;
+
+    for (i = 0; i < nIterations; i++)
+    {
+        OCIDescriptorAlloc(
+            poConnection->hEnv,
+            (void**) &pphLocator[i],
+            OCI_DTYPE_LOB, (size_t) 0, (void**) 0);
+    }
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pphLocator,
+                              (sb4) -1,
+                              (ub2) SQLT_CLOB,
+                              (void*) 0,
+                              (ub2*) 0,
+                              (ub2*) 0,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+
+void OWStatement::WriteCLob(OCILobLocator** pphLocator, char* pszData)
+{
+    nNextCol++;
+
+    CheckError(OCIDescriptorAlloc(
+                   poConnection->hEnv,
+                   (void**) pphLocator,
+                   OCI_DTYPE_LOB,
+                   (size_t) 0,
+                   (dvoid **) 0),
+               hError);
+
+    CheckError(OCILobCreateTemporary(
+                   poConnection->hSvcCtx,
+                   poConnection->hError,
+                   (OCILobLocator*) *pphLocator,
+                   (ub4) OCI_DEFAULT,
+                   (ub1) OCI_DEFAULT,
+                   (ub1) OCI_TEMP_CLOB,
+                   false,
+                   OCI_DURATION_SESSION),
+               hError);
+
+    ub4 nAmont = (ub4) strlen(pszData);
+
+    CheckError(OCILobWrite(
+                   poConnection->hSvcCtx,
+                   hError,
+                   *pphLocator,
+                   (ub4*) &nAmont,
+                   (ub4) 1,
+                   (dvoid*) pszData,
+                   (ub4) strlen(pszData),
+                   (ub1) OCI_ONE_PIECE,
+                   (dvoid*) NULL,
+                   NULL,
+                   (ub2) 0,
+                   (ub1) SQLCS_IMPLICIT),
+               hError);
+}
+
+void OWStatement::Define(OCIArray** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hNumArrayTDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+
+void OWStatement::Define(sdo_georaster** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hGeoRasterTDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+
+void OWStatement::Define(sdo_geometry** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hGeometryTDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+
+void OWStatement::Define(sdo_pc_blk** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hPC_BLK_TDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+
+
+void OWStatement::Define(sdo_pc** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hPCTDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+
+void OWStatement::Define(sdo_orgscl_type** pphData)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) NULL,
+                              (sb4) 0,
+                              (ub2) SQLT_NTY,
+                              (void*) NULL,
+                              (ub2*) NULL,
+                              (ub2*) NULL,
+                              (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIDefineObject(hDefine,
+                               hError,
+                               poConnection->hPCTDO,
+                               (dvoid**) pphData,
+                               (ub4*) NULL,
+                               (dvoid**) NULL,
+                               (ub4*) NULL), hError);
+}
+void OWStatement::Define(OCILobLocator** pphLocator, long nIterations)
+{
+    OCIDefine* hDefine = NULL;
+
+    nNextCol++;
+
+    long i;
+
+    for (i = 0; i < nIterations; i++)
+    {
+        OCIDescriptorAlloc(
+            poConnection->hEnv,
+            (void**) &pphLocator[i],
+            OCI_DTYPE_LOB, (size_t) 0, (void**) 0);
+    }
+
+    CheckError(OCIDefineByPos(hStmt,
+                              &hDefine,
+                              hError,
+                              (ub4) nNextCol,
+                              (dvoid*) pphLocator,
+                              (sb4) -1,
+                              (ub2) SQLT_BLOB,
+                              (void*) 0,
+                              (ub2*) 0,
+                              (ub2*) 0,
+                              (ub4) OCI_DEFAULT), hError);
+}
+
+int OWStatement::GetInteger(OCINumber* ppoData)
+{
+    sb4 nRetVal;
+
+    CheckError(OCINumberToInt(
+                   hError,
+                   ppoData,
+                   (uword) sizeof(sb4),
+                   OCI_NUMBER_SIGNED,
+                   (dvoid *) &nRetVal),
+               hError);
+
+    return nRetVal;
+}
+
+double OWStatement::GetDouble(OCINumber* ppoData)
+{
+    double dfRetVal = 0.0;
+
+    CheckError(OCINumberToReal(
+                   hError,
+                   ppoData,
+                   (uword) sizeof(dfRetVal),
+                   (dvoid*) &dfRetVal),
+               hError);
+
+    return dfRetVal;
+}
+
+char* OWStatement::GetString(OCIString* ppoData)
+{
+    return (char*) OCIStringPtr(
+               poConnection->hEnv,
+               ppoData);
+}
+
+void OWStatement::Free(OCILobLocator** pphLocator, int nCount)
+{
+    if (nCount > 0 && pphLocator != NULL)
+    {
+        int i = 0;
+        for (i = 0; i < nCount; i++)
+        {
+            if (pphLocator[i] != NULL)
+            {
+                OCIDescriptorFree(&pphLocator[i], OCI_DTYPE_LOB);
+            }
+        }
+    }
+}
+
+signed long int OWStatement::GetArrayLength(OCIArray** ppoData)
+{
+    sb4            length;
+
+    if (CheckError(OCICollSize(
+                       poConnection->hEnv,
+                       hError,
+                       (OCIColl*) *ppoData,
+                       (sb4*) &length), hError))
+    {
+        return 0;
+    }
+    return length;
+}
+int OWStatement::GetElement(OCIArray** ppoData, int nIndex, int* pnResult)
+{
+    boolean        exists;
+    OCINumber      *oci_number;
+    ub4            element_type;
+
+    *pnResult = 0;
+
+    if (CheckError(OCICollGetElem(
+                       poConnection->hEnv,
+                       hError,
+                       (OCIColl*) *ppoData,
+                       (sb4) nIndex,
+                       (boolean*) &exists,
+                       (dvoid**)(dvoid*) &oci_number,
+                       (dvoid**) NULL), hError))
+    {
+        return *pnResult;
+    }
+
+    if (CheckError(OCINumberToInt(
+                       hError,
+                       oci_number,
+                       (uword) sizeof(ub4),
+                       OCI_NUMBER_UNSIGNED,
+                       (dvoid *) &element_type), hError))
+    {
+        return *pnResult;
+    }
+
+    *pnResult = (int) element_type;
+
+    return *pnResult;
+}
+
+double OWStatement::GetElement(OCIArray** ppoData,
+                               int nIndex, double* pdfResult)
+{
+    boolean        exists;
+    OCINumber      *oci_number;
+    double         element_type;
+
+    *pdfResult = 0.0;
+
+    if (CheckError(OCICollGetElem(
+                       poConnection->hEnv,
+                       hError,
+                       (OCIColl*) *ppoData,
+                       (sb4) nIndex,
+                       (boolean*) &exists,
+                       (dvoid**)(dvoid*) &oci_number, NULL), hError))
+    {
+        return *pdfResult;
+    }
+
+    if (CheckError(OCINumberToReal(
+                       hError,
+                       oci_number,
+                       (uword) sizeof(double),
+                       (dvoid *) &element_type), hError))
+    {
+        return *pdfResult;
+    }
+
+    *pdfResult = (double) element_type;
+
+    return *pdfResult;
+}
+
+void OWStatement::AddElement(OCIArray* poData,
+                             int nValue)
+{
+    OCINumber      oci_number;
+
+    CheckError(OCINumberFromInt(hError,
+                                (dvoid*) &nValue,
+                                (uword) sizeof(ub4),
+                                OCI_NUMBER_UNSIGNED,
+                                (OCINumber*) &oci_number), hError);
+
+    CheckError(OCICollAppend(poConnection->hEnv,
+                             hError,
+                             (OCINumber*) &oci_number,
+                             (dvoid*) 0,
+                             (OCIColl*) poData), hError);
+}
+
+void OWStatement::AddElement(OCIArray* poData,
+                             double dfValue)
+{
+    OCINumber      oci_number;
+
+    CheckError(OCINumberFromReal(hError,
+                                 (dvoid*) &dfValue,
+                                 (uword) sizeof(double),
+                                 (OCINumber*) &oci_number), hError);
+
+    CheckError(OCICollAppend(poConnection->hEnv,
+                             hError,
+                             (OCINumber*) &oci_number,
+                             (dvoid*) 0,
+                             (OCIColl*) poData), hError);
+}
+
+bool OWStatement::ReadBlob(OCILobLocator* phLocator,
+                           void* pBuffer,
+                           int nSize,
+                           unsigned int* nAmountRead)
+{
+
+    // sword status = OCILobRead(
+    //                    poConnection->hSvcCtx,
+    //                    hError,
+    //                    phLocator,
+    //                    (ub4*) nAmountRead,
+    //                    (ub4) 1,
+    //                    (dvoid*) pBuffer,
+    //                    (ub4) nSize,
+    //                    (dvoid *) 0,
+    //                    (OCICallbackLobRead) 0,
+    //                    (ub2) 0,
+    //                    (ub1) SQLCS_IMPLICIT);
+    oraub8 char_amtp = 0;
+    oraub8 offset = 1;
+    oraub8 amountRead8 = static_cast<oraub8>(nSize);
+    oraub8 bufl = static_cast<oraub8>(nSize);
+    sword status = OCILobRead2(
+                       poConnection->hSvcCtx, //svchp
+                       hError, //errhp
+                       phLocator, // locp
+                       &amountRead8, //byte_amtp
+                       &char_amtp, // char_amtp
+                       offset, // offset
+                       (dvoid*) pBuffer, //buffer ptr
+                       (oraub8) bufl, // bufl
+                       (ub1) OCI_ONE_PIECE, // piece
+                       (void*) NULL, // ctx ptr
+                       (OCICallbackLobRead2) NULL, //cbfp
+                       (ub2) 0, // csid
+                       (ub1) SQLCS_IMPLICIT); //csfrm
+
+    if (status == OCI_NEED_DATA)
+    {
+        return false;
+    }
+
+    *nAmountRead = static_cast<unsigned int>(amountRead8);
+
+    if (CheckError(status, hError)) return true;
+
+    return true;
+}
+
+unsigned long OWStatement::GetBlobLength(OCILobLocator* phLocator)
+{
+    oraub8 nLength      = (oraub8) 0;
+
+    if (CheckError(OCILobGetLength2(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator,
+                       &nLength), hError))
+    {
+        return 0;
+    }
+
+    return nLength;
+}
+
+bool OWStatement::OpenBlob(OCILobLocator* phLocator,
+                           bool bReadOnly)
+{
+
+    ub1 mode(OCI_LOB_READONLY);
+    if (!bReadOnly)
+        mode = OCI_LOB_READWRITE;
+
+    if (CheckError(OCILobOpen(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator,
+                       mode), hError))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool OWStatement::CloseBlob(OCILobLocator* phLocator)
+{
+    if (CheckError(OCILobClose(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator), hError))
+    {
+        return false;
+    }
+
+    return true;
+}
+bool OWStatement::EnableBuffering(OCILobLocator* phLocator)
+{
+
+
+    if (CheckError(OCILobEnableBuffering(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator), hError))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool OWStatement::DisableBuffering(OCILobLocator* phLocator)
+{
+
+
+    if (CheckError(OCILobDisableBuffering(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator), hError))
+    {
+        return false;
+    }
+
+    return true;
+}
+
+bool OWStatement::AllocBlob(OCILobLocator** pphLocator)
+{
+    CheckError(OCIDescriptorAlloc(
+                   poConnection->hEnv,
+                   (void**) pphLocator,
+                   OCI_DTYPE_LOB,
+                   0,
+                   0),
+               hError);
+    return true;
+}
+
+typedef struct cbctx
+{
+    ub1 *buffer;
+    ub4 buffer_len;
+    oraub8 position;
+    oraub8 length;
+} cbctx;
+
+sb4 callback(void *ctxp, void *bufp, oraub8 *lenp,
+             ub1 *piece, void **changed_bufpp,
+             oraub8 *changed_lenp)
+{
+    ub4 nbytes(0);
+    cbctx * ctx = (cbctx *) ctxp;
+    oraub8 amt = (*lenp > ctx->buffer_len) ? ctx->buffer_len : *lenp;
+    oraub8 rem = ctx->length - (ctx->position - 1);
+    *piece = OCI_NEXT_PIECE;
+
+    if (rem > amt)
+    {
+        nbytes = amt;
+    }
+    else
+    {
+        nbytes = rem;
+        *piece = OCI_LAST_PIECE;
+    }
+
+    memcpy(bufp, ctx->buffer, nbytes);
+    *lenp = nbytes;
+
+    ctx->position += nbytes;
+    *changed_bufpp = NULL;
+    // *changed_lenp = 0;
+    return OCI_CONTINUE;
+}
+
+bool OWStatement::WriteBlob(OCILobLocator** pphLocator,
+                            void* pBuffer,
+                            int nSize,
+                            int numChunks)
+{
+
+
+
+    CheckError(OCIDescriptorAlloc(
+                   poConnection->hEnv,
+                   (void**) pphLocator,
+                   OCI_DTYPE_LOB,
+                   (size_t) 0,
+                   (dvoid **) 0),
+               hError);
+
+    ub1 mode(OCI_LOB_READWRITE);
+
+
+    CheckError(OCILobCreateTemporary(
+                   poConnection->hSvcCtx,
+                   poConnection->hError,
+                   (OCILobLocator*) *pphLocator,
+                   (ub4) OCI_DEFAULT,
+                   (ub1) OCI_DEFAULT,
+                   (ub1) OCI_TEMP_BLOB,
+                   TRUE,
+                   OCI_DURATION_SESSION),
+               hError);
+
+    CheckError(OCILobOpen(
+                   poConnection->hSvcCtx,
+                   hError,
+                   *pphLocator,
+                   mode), hError);
+
+
+
+    ub4 nChunkSize(0);
+    CheckError(OCILobGetChunkSize(poConnection->hSvcCtx,
+                                  hError,
+                                  *pphLocator,
+                                  &nChunkSize),
+               hError);
+    nChunkSize = nChunkSize * numChunks;
+    oraub8 nAmount  = (oraub8) nSize;
+    oraub8 nAmountWritten(0);
+    oraub8 charAmount(0);
+
+    cbctx ctx;
+    ctx.buffer = (ub1*) pBuffer;
+    ctx.buffer_len = nChunkSize;
+    ctx.position = 1;
+    ctx.length = nAmount;
+
+    ub1* chunkBuffer = (ub1*) malloc(nChunkSize * sizeof(ub1) +1);
+
+    // CheckError(OCILobEnableBuffering(
+    //                      poConnection->hSvcCtx,
+    //                      hError,
+    //                      *pphLocator), hError);
+    CheckError(OCILobWrite2(
+                   poConnection->hSvcCtx,
+                   hError,
+                   (OCILobLocator*) *pphLocator,
+                   (oraub8*) &nAmountWritten,
+                   (oraub8*) &charAmount,
+                   (oraub8) 1,
+                   (dvoid*) chunkBuffer,
+                   (oraub8) nChunkSize,
+                   (ub1) OCI_FIRST_PIECE,
+                   (dvoid*) &ctx,
+                   (OCICallbackLobWrite2) callback,
+                   (ub2) 0,
+                   (ub1) SQLCS_IMPLICIT),
+               hError);
+
+    // CheckError(OCILobWrite2(
+    //                    poConnection->hSvcCtx,
+    //                    hError,
+    //                    (OCILobLocator*) *pphLocator,
+    //                    (oraub8*) &nAmount,
+    //                    (oraub8*) &charAmount,
+    //                    (oraub8) 1,
+    //                    (dvoid*) pBuffer,
+    //                    (oraub8) nSize,
+    //                    (ub1) OCI_ONE_PIECE,
+    //                    (dvoid*) &ctx,
+    //                    NULL,
+    //                    (ub2) 0,
+    //                    (ub1) SQLCS_IMPLICIT),
+    //                hError);
+
+    // CheckError(OCILobFlushBuffer(
+    //                        poConnection->hSvcCtx,
+    //                        hError,
+    //                        (OCILobLocator*) *pphLocator, OCI_LOB_BUFFER_FREE), hError);
+    //
+    //  CheckError(OCILobDisableBuffering(
+    //                         poConnection->hSvcCtx,
+    //                         hError,
+    //                         (OCILobLocator*) *pphLocator), hError);
+
+
+
+    CheckError(OCILobClose(
+                   poConnection->hSvcCtx,
+                   hError,
+                   *pphLocator), hError);
+    free(chunkBuffer);
+    return (nAmount == (ub4) nSize);
+}
+
+char* OWStatement::ReadCLob(OCILobLocator* phLocator)
+{
+    ub4 nSize  = 0;
+    ub4 nAmont = 0;
+
+    char* pszBuffer = NULL;
+
+    if (CheckError(OCILobGetLength(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator,
+                       (ub4*) &nSize),
+                   hError))
+    {
+        return NULL;
+    }
+
+    nSize *= this->poConnection->nCharSize;
+
+    pszBuffer = (char*) VSIMalloc(sizeof(char*) * nSize);
+
+    if (pszBuffer == NULL)
+    {
+        return NULL;
+    }
+
+    if (CheckError(OCILobRead(
+                       poConnection->hSvcCtx,
+                       hError,
+                       phLocator,
+                       (ub4*) &nAmont,
+                       (ub4) 1,
+                       (dvoid*) pszBuffer,
+                       (ub4) nSize,
+                       (dvoid*) NULL,
+                       NULL,
+                       (ub2) 0,
+                       (ub1) SQLCS_IMPLICIT),
+                   hError))
+    {
+        CPLFree(pszBuffer);
+        return NULL;
+    }
+
+    pszBuffer[nAmont] = '\0';
+
+    return pszBuffer;
+}
+
+void OWStatement::BindName(const char* pszName, int* pnData)
+{
+    OCIBind* hBind = NULL;
+
+    CheckError(OCIBindByName(
+                   (OCIStmt*) hStmt,
+                   (OCIBind**) &hBind,
+                   (OCIError*) hError,
+                   (const text*) pszName,
+                   (sb4) -1,
+                   (dvoid*) pnData,
+                   (sb4) sizeof(int),
+                   (ub2) SQLT_INT,
+                   (dvoid*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindName(const char* pszName, double* pnData)
+{
+    OCIBind* hBind = NULL;
+
+    CheckError(OCIBindByName(
+                   (OCIStmt*) hStmt,
+                   (OCIBind**) &hBind,
+                   (OCIError*) hError,
+                   (const text*) pszName,
+                   (sb4) -1,
+                   (dvoid*) pnData,
+                   (sb4) sizeof(double),
+                   (ub2) SQLT_BDOUBLE,
+                   (dvoid*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindName(const char* pszName, char* pszData, int nSize)
+{
+    OCIBind* hBind = NULL;
+
+    CheckError(OCIBindByName(
+                   (OCIStmt*) hStmt,
+                   (OCIBind**) &hBind,
+                   (OCIError*) hError,
+                   (const text*) pszName,
+                   (sb4) -1,
+                   (dvoid*) pszData,
+                   (sb4) nSize,
+                   (ub2) SQLT_STR,
+                   (dvoid*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindName(const char* pszName, OCILobLocator** pphLocator)
+{
+    OCIBind* hBind = NULL;
+
+    CheckError(OCIDescriptorAlloc(
+                   poConnection->hEnv,
+                   (void**) pphLocator,
+                   OCI_DTYPE_LOB,
+                   0,
+                   0),
+               hError);
+
+    CheckError(OCIBindByName(
+                   (OCIStmt*) hStmt,
+                   (OCIBind**) &hBind,
+                   (OCIError*) hError,
+                   (const text*) pszName,
+                   (sb4) -1,
+                   (dvoid*) pphLocator,
+                   (sb4) -1,
+                   (ub2) SQLT_CLOB,
+                   (dvoid*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) 0,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT),
+               hError);
+}
+
+void OWStatement::BindArray(void* pData, long nSize)
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;
+
+    CheckError(OCIBindByPos(
+                   hStmt,
+                   &hBind,
+                   hError,
+                   (ub4) nNextBnd,
+                   (dvoid*) pData,
+                   (sb4) nSize * sizeof(double),
+                   (ub2) SQLT_BIN,
+                   (void*) NULL,
+                   (ub2*) NULL,
+                   (ub2*) NULL,
+                   (ub4) NULL,
+                   (ub4*) NULL,
+                   (ub4) OCI_DEFAULT), hError);
+
+    CheckError(OCIBindArrayOfStruct(
+                   hBind,
+                   hError,
+                   (ub4) nSize * sizeof(double),
+                   (ub4) 0,
+                   (ub4) 0,
+                   (ub4) 0), hError);
+}
+
+/*****************************************************************************/
+/*               Check for valid integer number in a string                  */
+/*****************************************************************************/
+
+bool OWIsNumeric(const char *pszText)
+{
+    if (pszText == NULL)
+    {
+        return false;
+    }
+
+    const char* pszPos = pszText;
+
+    while (*pszPos != '\0')
+    {
+        if (*pszPos < '0' ||
+                *pszPos > '9')
+            return false;
+        pszPos++;
+    }
+
+    return true;
+}
+
+/*****************************************************************************/
+/*                            Replace String at given token                  */
+/*****************************************************************************/
+
+/* Input Examples:
+ *
+ * "ID, RASTER, NAME VALUES (102, SDO_GEOR.INIT('RDT_80', 80), 'Nashua')"
+ * "SDO_GEOR.INIT"
+ * "SDO_GEOR.createBlank(20001, SDO_NUMBER_ARRAY(0, 0)..."
+ */
+const char* OWReplaceString(const char* pszBaseString,
+                            const char* pszToken,
+                            const char* pszStopToken,
+                            const char* pszOWReplaceToken)
+{
+    char szUpcaseBase[OWTEXT];
+    char szUpcaseToken[OWTEXT];
+    char szUpcaseStopT[OWTEXT];
+    char szResult[OWTEXT];
+
+    strcpy(szUpcaseBase, pszBaseString);
+    strcpy(szUpcaseToken, pszToken);
+    strcpy(szUpcaseStopT, pszStopToken);
+    strcpy(szResult, pszBaseString);
+
+    char* pszIn = NULL;
+
+    // Upper case a copy of the base string
+
+    for (pszIn = szUpcaseBase; *pszIn != '\0'; pszIn++)
+    {
+        *pszIn = (char) toupper(*pszIn);
+    }
+
+    // Upper case a copy of the token
+
+    for (pszIn = szUpcaseToken; *pszIn != '\0'; pszIn++)
+    {
+        *pszIn = (char) toupper(*pszIn);
+    }
+
+    // Upper case a copy of the stop token
+
+    for (pszIn = szUpcaseStopT; *pszIn != '\0'; pszIn++)
+    {
+        *pszIn = (char) toupper(*pszIn);
+    }
+
+    // Search for Token, Stop Token on the Base String
+
+    char* pszStart = strstr(szUpcaseBase, szUpcaseToken);
+    char* pszEnd   = strstr(szUpcaseBase, szUpcaseStopT);
+
+    if (pszStart)
+    {
+        // Concatenate the result
+
+        int nStart = (int)(pszStart - szUpcaseBase);
+        int nEnd   = (int)(pszEnd   - szUpcaseBase);
+
+        strncpy(szResult, pszBaseString, nStart);
+        szResult[nStart] = '\0';
+        strcat(szResult, pszOWReplaceToken);
+        strcat(szResult, &pszBaseString[nEnd + 1]);
+    }
+
+    return CPLStrdup(szResult);
+}
+
+/*****************************************************************************/
+/*                     Parse Value after a Hint on a string                  */
+/*****************************************************************************/
+
+const char *OWParseValue(const char* pszText,
+                         const char* pszSeparators,
+                         const char* pszHint,
+                         int nOffset)
+{
+    if (pszText == NULL) return 0;
+
+    int i       = 0;
+    int nCount  = 0;
+
+    char **papszTokens = CSLTokenizeString2(pszText, pszSeparators,
+                                            CSLT_PRESERVEQUOTES);
+
+    nCount = CSLCount(papszTokens);
+    const char* pszResult = "";
+
+    for (i = 0; (i + nOffset) < nCount; i++)
+    {
+        if (EQUAL(papszTokens[i], pszHint))
+        {
+            pszResult = CPLStrdup(papszTokens[i + nOffset]);
+            break;
+        }
+    }
+
+    CSLDestroy(papszTokens);
+
+    return pszResult;
+}
+
+/*****************************************************************************/
+/*                            Parse SDO_GEOR.INIT entries                    */
+/*****************************************************************************/
+
+/* Input Examples:
+ *
+ * "ID, RASTER, NAME VALUES (102, SDO_GEOR.INIT('RDT_80', 80), 'Nashua')"
+ *
+ */
+
+const char* OWParseSDO_GEOR_INIT(const char* pszInsert, int nField)
+{
+    char  szUpcase[OWTEXT];
+    char* pszIn = NULL;
+
+    strcpy(szUpcase, pszInsert);
+
+    for (pszIn = szUpcase; *pszIn != '\0'; pszIn++)
+    {
+        *pszIn = (char) toupper(*pszIn);
+    }
+
+    char* pszStart = strstr(szUpcase, "SDO_GEOR.INIT");
+
+    if (pszStart == NULL)
+    {
+        return "";
+    }
+
+    char* pszEnd   = strstr(pszStart, ")");
+
+    if (pszEnd == NULL)
+    {
+        return "";
+    }
+
+    pszEnd++;
+
+    int nLength = pszEnd - pszStart + 1;
+
+    char szBuffer[OWTEXT];
+
+    strncpy(szBuffer, pszStart, nLength);
+    szBuffer[nLength] = '\0';
+
+    const char* pszValue = OWParseValue(szBuffer, " .(,)", "INIT", nField);
+
+    return EQUAL(pszValue, "") ? "NULL" : pszValue;
+}
+
+/*****************************************************************************/
+/*                            Parse Release Version                          */
+/*****************************************************************************/
+
+/* Input Examples:
+ *
+ * "Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
+ * With the Partitioning, OLAP, Data Mining and Real Application Testing options"
+ *
+ */
+
+int OWParseServerVersion(const char* pszText)
+{
+    const char* pszValue = OWParseValue(pszText, " .", "Release", 1);
+
+    return pszValue == NULL ? 0 : atoi(pszValue);
+}
+
+/*****************************************************************************/
+/*                            Parse EPSG Codes                               */
+/*****************************************************************************/
+
+/* Input Examples:
+*
+*      DATUM["World Geodetic System 1984 (EPSG ID 6326)",
+*      SPHEROID["WGS 84 (EPSG ID 7030)",6378137,298.257223563]],
+*      PROJECTION["UTM zone 50N (EPSG OP 16050)"],
+*/
+
+int OWParseEPSG(const char* pszText)
+{
+    const char* pszValue = OWParseValue(pszText, " ()", "EPSG", 2);
+
+    return pszValue == NULL ? 0 : atoi(pszValue);
+}
+
+/*****************************************************************************/
+/*                            Convert Data type description                  */
+/*****************************************************************************/
+
+GDALDataType OWGetDataType(const char* pszCellDepth)
+{
+    unsigned int i;
+
+    for (i = 0;
+            i < (sizeof(ahOW_CellDepth) / sizeof(OW_CellDepth));
+            i++)
+    {
+        if (EQUAL(ahOW_CellDepth[i].pszValue, pszCellDepth))
+        {
+            return ahOW_CellDepth[i].eDataType;
+        }
+    }
+
+    return GDT_Unknown;
+}
+
+/*****************************************************************************/
+/*                            Convert Data type description                  */
+/*****************************************************************************/
+
+const char* OWSetDataType(const GDALDataType eType)
+
+{
+    unsigned int i;
+
+    for (i = 0;
+            i < (sizeof(ahOW_CellDepth) / sizeof(OW_CellDepth));
+            i++)
+    {
+        if (ahOW_CellDepth[i].eDataType == eType)
+        {
+            return ahOW_CellDepth[i].pszValue;
+        }
+    }
+
+    return "Unknown";
+}
+
+/*****************************************************************************/
+/*                            Check for Failure                              */
+/*****************************************************************************/
+
+bool CheckError(sword nStatus, OCIError* hError)
+{
+    text    szMsg[OWTEXT];
+    sb4     nCode = 0;
+
+    switch (nStatus)
+    {
+        case OCI_SUCCESS:
+            return false;
+            break;
+        case OCI_NEED_DATA:
+            CPLError(CE_Failure, CPLE_AppDefined, "OCI_NEED_DATA\n");
+            break;
+        case OCI_NO_DATA:
+            CPLError(CE_Failure, CPLE_AppDefined, "OCI_NODATA\n");
+            break;
+        case OCI_INVALID_HANDLE:
+            CPLError(CE_Failure, CPLE_AppDefined, "OCI_INVALID_HANDLE");
+            break;
+        case OCI_STILL_EXECUTING:
+            CPLError(CE_Failure, CPLE_AppDefined, "OCI_STILL_EXECUTE\n");
+            break;
+        case OCI_CONTINUE:
+            CPLError(CE_Failure, CPLE_AppDefined, "OCI_CONTINUE\n");
+            break;
+        case OCI_SUCCESS_WITH_INFO:
+        case OCI_ERROR:
+
+            if (hError == NULL)
+            {
+                CPLError(CE_Failure, CPLE_AppDefined,
+                         "OCI_ERROR with no error handler");
+            }
+
+            OCIErrorGet((dvoid *) hError, (ub4) 1,
+                        (text *) NULL, &nCode, szMsg,
+                        (ub4) sizeof(szMsg), OCI_HTYPE_ERROR);
+
+            if (nCode == 1405)  // Null field
+            {
+                return false;
+            }
+
+            CPLError(CE_Failure, CPLE_AppDefined, "%.*s",
+                     static_cast<int>(sizeof(szMsg)), szMsg);
+            break;
+
+        default:
+
+            if (hError == NULL)
+            {
+                CPLError(CE_Failure, CPLE_AppDefined,
+                         "OCI_ERROR with no error handler");
+            }
+
+            OCIErrorGet((dvoid *) hError, (ub4) 1,
+                        (text *) NULL, &nCode, szMsg,
+                        (ub4) sizeof(szMsg), OCI_HTYPE_ERROR);
+
+            CPLError(CE_Failure, CPLE_AppDefined, "%.*s",
+                     static_cast<int>(sizeof(szMsg)), szMsg);
+            break;
+
+    }
+
+    return true;
+}
+
+
+} //namespace pdal
diff --git a/plugins/oci/io/OciWrapper.h b/plugins/oci/io/OciWrapper.h
new file mode 100644
index 0000000..e40aeda
--- /dev/null
+++ b/plugins/oci/io/OciWrapper.h
@@ -0,0 +1,483 @@
+/******************************************************************************
+ * $Id: $
+ *
+ * Name:     oci_wrapper.h
+ * Project:  Oracle Spatial GeoRaster Driver
+ * Purpose:  Limited wrapper for OCI (Oracle Call Interfaces)
+ * Author:   Ivan Lucena [ivan.lucena at pmldnet.com]
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Ivan Lucena
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ ****************************************************************************/
+
+#ifndef _OCI_WRAPPER_H_INCLUDED
+#define _OCI_WRAPPER_H_INCLUDED
+
+#include <pdal/pdal_export.hpp>
+
+// GDAL supporting types
+
+#include "gdal.h"
+#include "gdal_priv.h"
+
+// Oracle Class Interface
+
+#include <oci.h>
+
+namespace pdal
+{
+
+/***************************************************************************/
+/*                            Data type conversion table record type       */
+/***************************************************************************/
+
+struct OW_CellDepth {
+    const char*     pszValue;
+    GDALDataType    eDataType;
+};
+
+/***************************************************************************/
+/*                            OCI Error check                              */
+/***************************************************************************/
+
+bool CheckError( sword nStatus, OCIError* hError );
+
+/***************************************************************************/
+/*                            Auxiliar functions                           */
+/***************************************************************************/
+
+GDALDataType  OWGetDataType( const char* pszCellDepth );
+const char*         OWSetDataType( const GDALDataType eType );
+int                 OWParseServerVersion( const char* pszText );
+int                 OWParseEPSG( const char* pszText );
+bool                OWIsNumeric( const char *pszText );
+const char*         OWParseSDO_GEOR_INIT( const char* pszInsert, int nField );
+const char*         OWReplaceString( const char* pszBaseString,
+                        const char* pszToken,
+                        const char* pszStopToken,
+                        const char* pszOWReplaceToken );
+
+/***************************************************************************/
+/*                            Arbitrary limits                             */
+/***************************************************************************/
+
+#define OWCODE      64
+#define OWNAME      512
+#define OWTEXT      1024
+
+/***************************************************************************/
+/*                                  TYPES                                  */
+/***************************************************************************/
+
+#define TYPE_OWNER                  "MDSYS"
+#define SDO_GEOMETRY                TYPE_OWNER".SDO_GEOMETRY"
+#define SDO_GEORASTER               TYPE_OWNER".SDO_GEORASTER"
+#define SDO_PC                      TYPE_OWNER".SDO_PC"
+#define SDO_PC_BLK                  TYPE_OWNER".SDO_PC_BLK"
+#define SDO_NUMBER_ARRAY            TYPE_OWNER".SDO_NUMBER_ARRAY"
+#define SDO_ORDINATE_ARRAY          TYPE_OWNER".SDO_ORDINATE_ARRAY"
+#define SDO_ELEM_INFO_ARRAY         TYPE_OWNER".SDO_ELEM_INFO_ARRAY"
+
+#define OW_XMLNS        "xmlns=\"http://xmlns.oracle.com/spatial/georaster\""
+
+/***************************************************************************/
+/*                   USER DEFINED (actualy Oracle's) types                 */
+/***************************************************************************/
+
+typedef OCIRef SDO_GEORASTER_ref;
+typedef OCIRef SDO_GEOMETRY_ref;
+typedef OCIRef SDO_POINT_TYPE_ref;
+
+typedef OCIArray sdo_elem_info_array;
+typedef OCIArray sdo_ordinate_array;
+typedef OCIArray SDO_NUMBER_ARRAY_TYPE;
+
+/***************************************************************************/
+/*                            Point type                                   */
+/***************************************************************************/
+
+struct sdo_point_type
+{
+    OCINumber x;
+    OCINumber y;
+    OCINumber z;
+};
+
+typedef struct sdo_point_type sdo_point_type;
+
+struct sdo_point_type_ind
+{
+    OCIInd      _atomic;
+    OCIInd      x;
+    OCIInd      y;
+    OCIInd      z;
+};
+
+typedef struct sdo_point_type_ind sdo_point_type_ind;
+
+/***************************************************************************/
+/*                            Geometry type                                */
+/***************************************************************************/
+
+struct sdo_geometry
+{
+    OCINumber       sdo_gtype;
+    OCINumber       sdo_srid;
+    sdo_point_type  sdo_point;
+    OCIArray*       sdo_elem_info;
+    OCIArray*       sdo_ordinates;
+};
+
+typedef struct sdo_geometry SDO_GEOMETRY_TYPE;
+
+struct sdo_geometry_ind
+{
+    OCIInd      _atomic;
+    OCIInd      sdo_gtype;
+    OCIInd      sdo_srid;
+    struct      sdo_point_type_ind sdo_point;
+    OCIInd      sdo_elem_info;
+    OCIInd      sdo_ordinates;
+};
+
+typedef struct SDO_GEOMETRY_ind SDO_GEOMETRY_ind;
+
+/***************************************************************************/
+/*                            GeoRaster type                               */
+/***************************************************************************/
+
+struct sdo_georaster
+{
+    OCINumber          rastertype;
+    SDO_GEOMETRY_TYPE  spatialextent;
+    OCIString*         rasterdatatable;
+    OCINumber          rasterid;
+    void*              metadata;
+};
+
+typedef struct sdo_georaster SDO_GEORASTER_TYPE;
+
+struct sdo_georaster_ind
+{
+    OCIInd            _atomic;
+    OCIInd            rastertype;
+    sdo_geometry_ind  spatialextent;
+    OCIInd            rasterdatatable;
+    OCIInd            rasterid;
+    OCIInd            metadata;
+};
+
+typedef struct sdo_georaster_ind SDO_GEORASTER_ind;
+
+/***************************************************************************/
+/*                            Point Cloud type                             */
+/***************************************************************************/
+
+struct sdo_mbr
+{
+   OCIArray*            lower_left;
+   OCIArray*            upper_right;
+};
+typedef struct sdo_mbr SDO_MBR_TYPE;
+
+struct sdo_mbr_ind
+{
+   OCIInd               _atomic;
+   OCIInd               lower_left;
+   OCIInd               upper_right;
+};
+typedef struct sdo_mbr_ind SDO_MBR_ind;
+
+struct sdo_orgscl_type
+{
+   SDO_MBR_TYPE         extent;
+   OCIArray*            scale;
+   OCIArray*            ord_cmp_type;
+};
+typedef struct sdo_orgscl_type SDO_ORGSCL_TYPE;
+
+struct sdo_orgscl_type_ind
+{
+   OCIInd               _atomic;
+   SDO_MBR_ind          extent;
+   OCIInd               scale;
+   OCIInd               ord_cmp_type;
+};
+typedef struct sdo_orgscl_type_ind SDO_ORGSCL_TYPE_ind;
+
+struct sdo_pc
+{
+    OCIString*          base_table;
+    OCIString*          base_column;
+    OCINumber           pc_id;
+    OCIString*          blk_table;
+    OCIString*          ptn_params;
+    SDO_GEOMETRY_TYPE   pc_geometry;
+    OCINumber           pc_tol;
+    OCINumber           pc_tot_dimensions;
+    SDO_ORGSCL_TYPE     pc_domain;
+    OCIString*          pc_val_attr_tables;
+    void*               pc_other_attrs;
+};
+typedef struct sdo_pc SDO_PC_TYPE;
+
+struct sdo_pc_ind
+{
+    OCIInd              _atomic;
+    OCIInd              base_table;
+    OCIInd              base_column;
+    OCIInd              pc_id;
+    OCIInd              blk_table;
+    OCIInd              ptn_params;
+    sdo_geometry_ind    pc_geometry;
+    OCIInd              pc_tol;
+    OCIInd              pc_tot_dimensions;
+    OCIInd              pc_domain;
+    OCIInd              pc_val_attr_tables;
+    OCIInd              pc_other_attrs;
+};
+typedef struct sdo_pc_ind SDO_PC_ind;
+
+struct sdo_pc_blk
+{
+    SDO_PC_TYPE              inp;
+    SDO_GEOMETRY_TYPE   ind_dimqry;
+    SDO_MBR_TYPE     other_dimqry;
+    OCINumber           qry_min_res;
+    OCINumber           qry_max_res;
+    OCINumber           blkno;
+};
+
+typedef struct sdo_pc_blk SDO_PC_BLK_TYPE;
+
+struct sdo_pc_blk_type_ind
+{
+    OCIInd              _atomic;
+    OCIInd              obj_id;
+    OCIInd              blk_id;
+    sdo_geometry_ind    blk_extent;
+    sdo_orgscl_type_ind blk_domain;
+    OCIInd              pcblk_min_res;
+    OCIInd              pcblk_max_res;
+    OCIInd              num_points;
+    OCIInd              num_unsorted_points;
+    OCIInd              pt_sort_dim;
+};
+typedef struct sdo_pc_blk_type_ind SDO_PC_BLK_TYPE_ind;
+/***************************************************************************/
+/*                            Oracle class wrappers                        */
+/***************************************************************************/
+
+class OWConnection;
+class OWStatement;
+
+//  ---------------------------------------------------------------------------
+//  OWConnection
+//  ---------------------------------------------------------------------------
+
+class PDAL_DLL OWConnection
+{
+    friend class OWStatement;
+
+public:
+
+                        OWConnection(
+                            const char* pszUserIn,
+                            const char* pszPasswordIn,
+                            const char* pszServerIn );
+    virtual            ~OWConnection();
+
+private:
+
+    OCIEnv*             hEnv;
+    OCIError*           hError;
+    OCISvcCtx*          hSvcCtx;
+    OCIServer*          hServer;
+    OCISession*         hSession;
+    OCIDescribe*        hDescribe;
+
+    int                 nVersion;
+    sb4                 nCharSize;
+
+    bool                bSuceeeded;
+
+    char*               pszUser;
+    char*               pszPassword;
+    char*               pszServer;
+
+    OCIType*            hNumArrayTDO;
+    OCIType*            hGeometryTDO;
+    OCIType*            hGeoRasterTDO;
+    OCIType*            hPCTDO;
+    OCIType*            hPC_BLK_TDO;
+
+    OCIType*            hElemArrayTDO;
+    OCIType*            hOrdnArrayTDO;
+
+public:
+
+    OWStatement*        CreateStatement( const char* pszStatement );
+    OCIParam*           GetDescription( char* pszTable );
+    bool                GetNextField(
+                            OCIParam* phTable,
+                            int nIndex,
+                            char* pszName,
+                            int* pnType,
+                            int* pnSize,
+                            int* pnPrecision,
+                            signed short* pnScale );
+
+    void                CreateType( sdo_geometry** pphData );
+    void                DestroyType( sdo_geometry** pphData );
+    void                CreateType( sdo_pc** pphData );
+    void                DestroyType( sdo_pc** pphData );
+    void                CreateType( sdo_pc_blk** pphData );
+    void                DestroyType( sdo_pc_blk** pphData );
+    void                CreateType( sdo_orgscl_type** pphData );
+    void                DestroyType( sdo_orgscl_type** pphData );
+    void                CreateType( OCIArray** phData , OCIType* type);
+    void                DestroyType( OCIArray** phData );
+    OCIType*            DescribeType( const char *pszTypeName );
+
+    bool                Succeeded() { return bSuceeeded; }
+
+    char*               GetUser() { return pszUser; }
+    char*               GetPassword() { return pszPassword; }
+    char*               GetServer() { return pszServer; }
+    int                 GetVersion () { return nVersion; }
+    sb4                 GetCharSize () { return nCharSize; }
+
+    OCIType*            GetGeometryType() { return hGeometryTDO; }
+    OCIType*            GetGeoRasterType() { return hGeoRasterTDO; }
+    OCIType*            GetElemInfoType() {return hElemArrayTDO; }
+    OCIType*            GetOrdinateType() {return hOrdnArrayTDO; }
+    OCIType*            GetPCType() {return hPCTDO; }
+
+    bool                Commit(); // OCITransCommit()
+    bool                StartTransaction(); //  //OCITransStart()
+    bool                EndTransaction() {return Commit(); }
+
+};
+
+/***************************************************************************/
+/*                           OWStatement                                   */
+/***************************************************************************/
+
+class PDAL_DLL OWStatement
+{
+
+public:
+
+                        OWStatement( OWConnection* poConnect, 
+                            const char* pszStatement );
+    virtual            ~OWStatement();
+
+private:
+
+    OWConnection*       poConnection;
+    OCIStmt*            hStmt;
+    OCIError*           hError;
+
+    int                 nNextCol;
+    int                 nNextBnd;
+
+    ub4                 nStmtMode;
+
+public:
+
+    bool                Execute( int nRows = 1 );
+    bool                Fetch( int nRows = 1 );
+    unsigned int        nFetchCount;
+
+    bool                GetNextField(
+                            int nIndex,
+                            char* pszName,
+                            int* pnType,
+                            int* pnSize,
+                            int* pnPrecision,
+                            signed short* pnScale,
+                            char* pszTypeName);
+
+
+    int                 GetInteger( OCINumber* ppoData );
+    double              GetDouble( OCINumber* ppoData );
+    char*               GetString( OCIString* ppoData );
+
+    void                Bind( int* pnData );
+    void                Bind( long* pnData );
+    void                Bind( double* pnData );
+    void                Bind( char* pData, long nData );
+    void                BindClob( char* pData, long nData );    
+    void                Bind( sdo_geometry** pphData );
+    void                Bind( sdo_pc_blk** pphData );
+    void                BindBlob( OCILobLocator** pphLocator );
+    bool                AllocBlob(OCILobLocator** phLocator);
+    void                BindClob( OCILobLocator** pphLocator );
+    void                Bind( OCIArray** pphData, OCIType* type );
+    void                Bind( char* pszData, int nSize = OWNAME );
+    void                Define( int* pnData );
+    void                Define( long* pnData );
+    void                Define( long long* pnData );
+    void                Define( double* pnData );
+    void                Define( char* pszData, int nSize = OWNAME );
+    void                Define( OCILobLocator** pphLocator );
+    void                Define( OCIArray** pphData );
+    void                Define( sdo_georaster** pphData );
+    void                Define( sdo_geometry** pphData );
+    void                Define( sdo_pc** pphData );
+    void                Define( sdo_pc_blk** pphData );
+    void                Define( sdo_orgscl_type** pphData );
+    void                Define( OCILobLocator** pphLocator, long nIterations );
+    void                DefineClob( OCILobLocator** pphLocator, long nIterations );
+    void                BindName( const char* pszName, int* pnData );
+    void                BindName( const char* pszName, double* pnData );
+    void                BindName( const char* pszName, char* pszData,
+                            int nSize = OWNAME );
+    void                BindName( const char* pszName,
+                            OCILobLocator** pphLocator );
+    void                BindArray( void* pData, long nSize = 1);
+    static void         Free( OCILobLocator** ppphLocator,
+                            int nCount );
+    bool                OpenBlob(OCILobLocator* phLocator, bool bReadOnly=true);
+    bool                CloseBlob(OCILobLocator* phLocator);
+    bool                EnableBuffering(OCILobLocator* phLocator);
+    bool                DisableBuffering(OCILobLocator* phLocator);
+
+    bool                ReadBlob( OCILobLocator* phLocator,
+                            void* pBuffer, int nSize, unsigned int* nAmountRead );
+    char*               ReadCLob( OCILobLocator* phLocator );
+    unsigned long       GetBlobLength(OCILobLocator* phLocator);
+    signed long         GetArrayLength( OCIArray** ppoData);
+    void                WriteCLob( OCILobLocator** pphLocator, char* pszData );
+    bool                WriteBlob( OCILobLocator** phLocator,
+                            void* pBuffer, int nSize, int numChunks=8 );
+    int                 GetElement( OCIArray** ppoData,
+                            int nIndex, int* pnResult );
+    double              GetElement( OCIArray** ppoData,
+                            int nIndex, double* pdfResult );
+    void                AddElement( OCIArray* ppoData,
+                            int nValue );
+    void                AddElement( OCIArray* ppoData,
+                            double dfValue );
+};
+
+} // namespace pdal
+#endif /* ifndef _ORCL_WRAP_H_INCLUDED */
diff --git a/plugins/oci/io/OciWriter.cpp b/plugins/oci/io/OciWriter.cpp
new file mode 100644
index 0000000..379ad34
--- /dev/null
+++ b/plugins/oci/io/OciWriter.cpp
@@ -0,0 +1,1139 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/Compression.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/GlobalEnvironment.hpp>
+
+#include "OciWriter.hpp"
+
+#include <fstream>
+
+#include <boost/algorithm/string.hpp>
+
+#include <ogr_api.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.oci",
+    "Write data using SDO_PC objects to Oracle.",
+    "http://pdal.io/stages/writers.oci.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, OciWriter, Writer, s_info)
+
+std::string OciWriter::getName() const { return s_info.name; }
+
+OciWriter::OciWriter()
+    : m_createIndex(false)
+    , m_bDidCreateBlockTable(false)
+    , m_pc_id(0)
+    , m_srid(0)
+    , m_3d(false)
+    , m_solid(false)
+    , m_sdo_pc_is_initialized(false)
+    , m_chunkCount(16)
+    , m_capacity(0)
+    , m_streamChunks(false)
+    , m_orientation(Orientation::PointMajor)
+{}
+
+
+void OciWriter::initialize()
+{
+    GlobalEnvironment::get().initializeGDAL(log(), isDebug());
+    m_connection = connect(m_connSpec);
+    m_gtype = getGType();
+}
+
+
+Options OciWriter::getDefaultOptions()
+{
+    Options options;
+
+    Option is3d("is3d",  false,
+        "Should we use 3D objects for SDO_PC PC_EXTENT, BLK_EXTENT, "
+        "and indexing");
+    Option solid("solid", false,
+        "Define the point cloud's PC_EXTENT geometry gtype as (1,1007,3) "
+        "instead of the normal (1,1003,3), and use gtype 3008/2008 vs "
+        " 3003/2003 for BLK_EXTENT geometry values.");
+    Option overwrite("overwrite", false,
+        "Wipe the block table and recreate it before loading data");
+    Option srid("srid", 0,
+        "The Oracle numerical SRID value to use for PC_EXTENT, "
+        "BLK_EXTENT, and indexing");
+    Option stream_output_precision("stream_output_precision", 8,
+        "The number of digits past the decimal place for outputting "
+        "floats/doubles to streams. This is used for creating the SDO_PC "
+        "object and adding the index entry to the USER_SDO_GEOM_METADATA "
+        "for the block table");
+    Option connection("connection", "",
+        "Oracle connection string to connect to database");
+    Option block_table_name("block_table_name", "output",
+        "The table in which block data for the created SDO_PC will be placed");
+    Option block_table_partition_column("block_table_partition_column", "",
+        "The column name for which 'block_table_partition_value' will "
+        "be placed in the 'block_table_name'");
+    Option block_table_partition_value("block_table_partition_value", 0,
+        "Integer value to use to assing partition IDs in the block table. "
+        "Used in conjunction with 'block_table_partition_column'");
+    Option base_table_name("base_table_name", "hobu",
+        "The name of the table which will contain the SDO_PC object");
+    Option cloud_column_name("cloud_column_name", "CLOUD",
+        "The column name in 'base_table_name' that will hold the SDO_PC "
+        "object");
+    Option base_table_aux_columns("base_table_aux_columns", "",
+        "Quoted, comma-separated list of columns to add to the SQL that "
+        "gets executed as part of the point cloud insertion into the "
+        "'base_table_name' table");
+    Option base_table_aux_values("base_table_aux_values", "",
+        "Quoted, comma-separated values that correspond to "
+        "'base_table_aux_columns', entries that will get inserted as part "
+        "of the creation of the SDO_PC entry in the 'base_table_name' table");
+    Option base_table_boundary_column("base_table_boundary_column", "",
+        "The SDO_GEOMETRY column in 'base_table_name' in which to insert "
+        "the WKT in 'base_table_boundary_wkt' representing a boundary for "
+        "the SDO_PC object. Note this is not the same as the "
+        "'base_table_bounds', which is just a bounding box that is placed "
+        "on the SDO_PC object itself.");
+    Option base_table_boundary_wkt("base_table_boundary_wkt", "",
+        "WKT, in the form of a string or a file location, to insert into "
+        "the SDO_GEOMTRY column defined by 'base_table_boundary_column'");
+    Option pre_block_sql("pre_block_sql", "",
+        "SQL, in the form of a string or file location, that is executed "
+        "after the SDO_PC object has been created but before the block data "
+        "in 'block_table_name' are inserted into the database");
+    Option pre_sql("pre_sql", "",
+        "SQL, in the form of a string or file location, that is executed "
+        "before the SDO_PC object is created.");
+    Option post_block_sql("post_block_sql", "",
+        "SQL, in the form of a string or file location, that is executed "
+        "after the block data in 'block_table_name' have been inserted");
+    Option base_table_bounds("base_table_bounds", BOX3D(),
+        "A bounding box, given in the Oracle SRID specified in 'srid' to "
+        "set on the PC_EXTENT object of the SDO_PC. If none is specified, "
+        "the cumulated bounds of all of the block data are used.");
+    Option pc_id("pc_id", -1, "Point Cloud id");
+    Option do_trace("do_trace", false,
+        "turn on server-side binds/waits tracing -- needs ALTER SESSION privs");
+    Option stream_chunks("stream_chunks", false,
+        "Stream block data chunk-wise by the DB's chunk size rather than "
+        "as an entire blob");
+    Option blob_chunk_count("blob_chunk_count", 16,
+        "When streaming, the number of chunks per write to use");
+    Option store_dimensional_orientation("store_dimensional_orientation", false,
+        "Store the points oriented in DIMENSION_INTERLEAVED instead of "
+        "POINT_INTERLEAVED orientation");
+    options.add(is3d);
+    options.add(solid);
+    options.add(overwrite);
+    options.add(srid);
+    options.add(stream_output_precision);
+    options.add(connection);
+    options.add(block_table_name);
+    options.add(block_table_partition_column);
+    options.add(block_table_partition_value);
+    options.add(base_table_name);
+    options.add(cloud_column_name);
+    options.add(base_table_aux_columns);
+    options.add(base_table_aux_values);
+    options.add(base_table_boundary_column);
+    options.add(base_table_boundary_wkt);
+    options.add(pre_block_sql);
+    options.add(pre_sql);
+    options.add(post_block_sql);
+    options.add(base_table_bounds);
+    options.add(pc_id);
+    options.add(do_trace);
+    options.add(stream_chunks);
+    options.add(blob_chunk_count);
+    options.add(store_dimensional_orientation);
+
+    return options;
+}
+
+
+void OciWriter::runCommand(std::ostringstream const& command)
+{
+    Statement statement(m_connection->CreateStatement(command.str().c_str()));
+
+    // Because of OCIGDALErrorHandler, this is going to throw if there is a
+    // problem.  When it does, the statement should go out of scope and
+    // be destroyed without leaking.
+    statement->Execute();
+}
+
+
+void OciWriter::wipeBlockTable()
+{
+    std::ostringstream oss;
+
+    oss << "DELETE FROM " << m_blockTableName;
+    try
+    {
+        runCommand(oss);
+    }
+    catch (pdal_error const&)
+    {
+        // if we failed, let's try dropping the spatial index for the
+        // block_table_name
+        oss.str("");
+        if (isDebug())
+            std::cout << "Dropping index " << m_blockTableName
+                      << "_cloud_idx for block_table_name"
+                      << std::endl;
+        oss << "DROP INDEX " << m_blockTableName << "_cloud_idx" ;
+        runCommand(oss);
+        oss.str("");
+
+        oss << "DELETE FROM " << m_blockTableName;
+        runCommand(oss);
+    }
+
+    oss.str("");
+    oss << "declare\n"
+        "begin \n"
+        "  mdsys.sdo_pc_pkg.drop_dependencies('"
+        << m_baseTableName <<
+        "', '"
+        << m_cloudColumnName <<
+        "'); end;";
+    runCommand(oss);
+
+    oss.str("");
+    oss << "DROP TABLE " << m_blockTableName;
+    runCommand(oss);
+
+    // Oracle upper cases the table name when inserting it in the
+    // USER_SDO_GEOM_METADATA.  We'll use std::transform to do it.
+    // See http://forums.devx.com/showthread.php?t=83058 for the
+    // technique
+
+    oss.str("");
+    oss << "DELETE FROM USER_SDO_GEOM_METADATA WHERE TABLE_NAME='" <<
+        m_blockTableName << "'" ;
+    runCommand(oss);
+}
+
+
+void OciWriter::createBlockIndex()
+{
+    std::ostringstream oss;
+
+    std::ostringstream index_name;
+    index_name << m_blockTableName << "_cloud_idx";
+    std::string name = index_name.str().substr(0, 29);
+
+    oss << "CREATE INDEX "<< name << " on "
+        << m_blockTableName << "(blk_extent) INDEXTYPE IS MDSYS.SPATIAL_INDEX";
+
+    if (m_3d)
+        oss << " PARAMETERS('sdo_indx_dims=3')";
+
+    runCommand(oss);
+
+    index_name.str("");
+    index_name << m_blockTableName << "_objectid_idx";
+    name = index_name.str().substr(0, 29);
+
+    oss.str("");
+    oss << "ALTER TABLE "<< m_blockTableName <<  " ADD CONSTRAINT "<< name <<
+        "  PRIMARY KEY (OBJ_ID, BLK_ID) ENABLE VALIDATE";
+    runCommand(oss);
+}
+
+
+void OciWriter::createSDOEntry()
+{
+    std::ostringstream oss;
+    oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    oss.precision(m_precision);
+
+    std::ostringstream s_srid;
+    if (m_srid == 0)
+        s_srid << "NULL";
+    else
+        s_srid << m_srid;
+
+    double tolerance = 0.05;
+    BOX3D e = m_bounds;
+    if (isGeographic(m_srid))
+    {
+        //This should be overrideable
+        e.minx = -180.0;
+        e.maxx = 180.0;
+        e.miny = -90.0;
+        e.maxy = 90.0;
+        e.minz = 0.0;
+        e.maxz = 20000.0;
+
+        tolerance = 0.0005;
+    }
+
+    oss <<  "INSERT INTO user_sdo_geom_metadata VALUES ('" <<
+        m_blockTableName << "','blk_extent', MDSYS.SDO_DIM_ARRAY(";
+    oss << "MDSYS.SDO_DIM_ELEMENT('X', " << e.minx << "," <<
+        e.maxx <<"," << tolerance << "),"
+        "MDSYS.SDO_DIM_ELEMENT('Y', " << e.miny << "," <<
+        e.maxy <<"," << tolerance << ")";
+
+    if (m_3d)
+    {
+        oss << ",";
+        oss <<"MDSYS.SDO_DIM_ELEMENT('Z', "<< e.minz << "," <<
+            e.maxz << "," << tolerance << ")";
+    }
+    oss << ")," << s_srid.str() << ")";
+
+    runCommand(oss);
+}
+
+
+bool OciWriter::blockTableExists()
+{
+    std::ostringstream oss;
+
+    char szTable[OWNAME] = "";
+    oss << "select table_name from user_tables";
+
+    log()->get(LogLevel::Debug) << "checking for " << m_blockTableName <<
+        " existence ... " << std::endl;
+
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+
+    // Because of OCIGDALErrorHandler, this is going to throw if there is a
+    // problem.  When it does, the statement should go out of scope and
+    // be destroyed without leaking.
+    statement->Define(szTable);
+    statement->Execute();
+
+    log()->get(LogLevel::Debug) << "checking ... " << szTable << std::endl;
+    do
+    {
+        if (boost::iequals(szTable, m_blockTableName))
+            return true;
+    } while (statement->Fetch());
+
+    log()->get(LogLevel::Debug) << " -- '" << m_blockTableName <<
+        "' not found." << std::endl;
+    return false;
+}
+
+
+void OciWriter::createBlockTable()
+{
+    std::ostringstream oss;
+    oss << "CREATE TABLE " << m_blockTableName <<
+        " AS SELECT * FROM MDSYS.SDO_PC_BLK_TABLE";
+
+    runCommand(oss);
+    m_connection->Commit();
+    m_bDidCreateBlockTable = true;
+}
+
+
+bool OciWriter::isGeographic(int32_t srid)
+{
+    std::unique_ptr<char> kind(new char[OWNAME]);
+    std::string stmt("SELECT COORD_REF_SYS_KIND from "
+        "MDSYS.SDO_COORD_REF_SYSTEM WHERE SRID = :1");
+
+    Statement statement(m_connection->CreateStatement(stmt.c_str()));
+    long l_srid = srid;
+    statement->Bind(&l_srid);
+    statement->Define(kind.get());
+
+    try
+    {
+        statement->Execute();
+    }
+    catch (pdal_error const& e)
+    {
+        std::ostringstream oss;
+        oss << "Failed to fetch geographicness of srid " << srid << std::endl;
+        oss << e.what() << std::endl;
+        throw std::runtime_error(oss.str());
+    }
+
+    return (boost::iequals(kind.get(), "GEOGRAPHIC2D") ||
+        boost::iequals(kind.get(), "GEOGRAPHIC3D"));
+}
+
+
+std::string OciWriter::loadSQLData(std::string const& filename)
+{
+    if (!FileUtils::fileExists(filename))
+    {
+        std::ostringstream oss;
+        oss << filename << " does not exist";
+        throw pdal_error(oss.str());
+    }
+
+    std::istream::pos_type size;
+    std::istream* input = FileUtils::openFile(filename, true);
+    if (!input->good())
+    {
+        FileUtils::closeFile(input);
+        return std::string();
+    }
+
+    std::string output;
+    std::string line;
+    while (input->good())
+    {
+        getline(*input, line);
+        if (output.size())
+            output += "\n" + line;
+        else
+            output = line;
+    }
+
+    FileUtils::closeFile(input);
+
+    return output;
+}
+
+
+void OciWriter::runFileSQL(std::string const& filename)
+{
+    std::ostringstream oss;
+    std::string sql = getOptions().getValueOrDefault<std::string>(filename, "");
+
+    if (!sql.size())
+        return;
+
+    if (!FileUtils::fileExists(sql))
+        oss << sql;
+    else
+        // Our "sql" is really the filename in the ptree
+        oss << loadSQLData(sql);
+
+    if (isDebug())
+        std::cout << "running "<< filename << " ..." <<std::endl;
+    runCommand(oss);
+}
+
+
+// Get the geometry type
+long OciWriter::getGType()
+{
+    if (m_3d)
+        return (m_solid ? 3008 : 3003);
+    return (m_solid ? 2008 : 2003);
+}
+
+
+std::string OciWriter::createPCElemInfo()
+{
+    if (m_3d)
+        return m_solid ? "(1,1007,3)" : "(1,1003,3)";
+    return m_solid ? "(1,1007,3)" : "(1,1003,3)";
+}
+
+
+void OciWriter::createPCEntry()
+{
+    std::ostringstream oss;
+
+    oss.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    oss.precision(m_precision);
+
+    std::ostringstream columns;
+    std::ostringstream values;
+
+    columns << m_cloudColumnName;
+    values << "pc";
+    if (!m_baseTableAuxColumns.empty())
+    {
+        columns << "," << m_baseTableAuxColumns;
+        values << "," << m_baseTableAuxValues;
+    }
+
+    int nPCPos = 1;
+    int nSchemaPos = 1;
+    nSchemaPos++;
+
+    int nPos = nSchemaPos; // Bind column position
+
+    if (!m_baseTableBoundaryColumn.empty())
+    {
+        columns << "," << m_baseTableBoundaryColumn;
+        nPos++;
+        values << ", SDO_GEOMETRY(:" << nPos;
+        nPos++;
+        values << ", :"<< nPos << ")";
+    }
+
+    std::ostringstream s_srid;
+    std::ostringstream s_geom;
+    std::ostringstream s_schema;
+
+    if (m_srid == 0)
+        s_srid << "NULL";
+    else
+        s_srid << m_srid;
+    s_schema << "xmltype(:" << nSchemaPos << ")";
+
+    std::string eleminfo = createPCElemInfo();
+    BOX3D bounds = m_baseTableBounds;
+    if (bounds.empty())
+    {
+        if (isGeographic(m_srid))
+        {
+            bounds.minx = -179.99;
+            bounds.miny = -89.99;
+            bounds.minz = 0.0;
+            bounds.maxx = 179.99;
+            bounds.maxy = 89.99;
+            bounds.maxz = 20000.0;
+        }
+        else
+        {
+            bounds.minx = 0.0;
+            bounds.miny = 0.0;
+            bounds.minz = 0.0;
+            bounds.maxx = 100.0;
+            bounds.maxy = 100.0;
+            bounds.maxz = 20000.0;
+        }
+    }
+    s_geom << "           mdsys.sdo_geometry(" << m_gtype << ", " <<
+        s_srid.str() << ", null,\n"
+        "              mdsys.sdo_elem_info_array"<< eleminfo <<",\n"
+        "              mdsys.sdo_ordinate_array(\n";
+    s_geom << bounds.minx << "," << bounds.miny << ",";
+    if (m_3d)
+        s_geom << bounds.minz << ",";
+    s_geom << bounds.maxy<< "," << bounds.maxy;
+    if (m_3d)
+        s_geom << "," << bounds.maxy;
+    s_geom << "))";
+
+    MetadataNode node;
+    if (m_compression)
+    {
+        MetadataNode r = node.add("root");
+        r.add("compression", "lazperf");
+        r.add("version", "1.0");
+    }
+    XMLSchema schema(dbDimTypes(), node, m_orientation);
+    std::string schemaData = schema.xml();
+
+    oss << "declare\n"
+        "  pc_id NUMBER := :" << nPCPos << ";\n"
+        "  pc sdo_pc;\n"
+
+        "begin\n"
+        "  -- Initialize the Point Cloud object.\n"
+        "  pc := sdo_pc_pkg.init( \n"
+        "          '" << m_baseTableName <<
+        "', -- Table that has the SDO_POINT_CLOUD column defined\n"
+        "          '" << m_cloudColumnName <<
+        "',   -- Column name of the SDO_POINT_CLOUD object\n"
+        "          '" << m_blockTableName <<
+        "', -- Table to store blocks of the point cloud\n"
+        "           'blk_capacity="<< m_capacity <<"', -- max # of points "
+                    "per block\n"
+        << s_geom.str() <<
+        ",  -- Extent\n"
+        "     0.5, -- Tolerance for point cloud\n"
+        "           " << dbDimTypes().size() <<
+        ", -- Total number of dimensions\n"
+        "           NULL,"
+        "            NULL,"
+        "            " << s_schema.str() << ");\n"
+        "  :" << nPCPos << " := pc.pc_id;\n"
+
+        "  -- Insert the Point Cloud object  into the \"base\" table.\n"
+        "  insert into " << m_baseTableName << " ( ID, "<< columns.str() <<
+        ") values ( pc.pc_id, " << values.str() << ");\n"
+
+        "  "
+        "end;\n";
+
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+    statement->Bind(&m_pc_id);
+
+    OCILobLocator *schema_locator;
+    OCILobLocator *boundary_locator;
+
+    statement->WriteCLob(&schema_locator, const_cast<char *>(schemaData.c_str()));
+    statement->BindClob(&schema_locator);
+
+    std::ostringstream wkt_s;
+    if (!m_baseTableBoundaryColumn.empty())
+    {
+        if (!FileUtils::fileExists(m_baseTableBoundaryWkt))
+        {
+            if (!isValidWKT(m_baseTableBoundaryWkt))
+            {
+                std::ostringstream oss;
+                oss << "WKT for base_table_boundary_wkt was not valid and '" <<
+                    m_baseTableBoundaryWkt << "' doesn't exist as a file";
+                throw pdal::pdal_error(oss.str());
+            }
+            wkt_s << m_baseTableBoundaryWkt;
+        }
+        else
+        {
+            std::string wkt = loadSQLData(m_baseTableBoundaryWkt);
+            if (!isValidWKT(wkt))
+            {
+                std::ostringstream oss;
+                oss << "WKT for base_table_boundary_wkt was from file '" <<
+                    m_baseTableBoundaryWkt << "' is not valid";
+                throw pdal::pdal_error(oss.str());
+            }
+            wkt_s << wkt;
+        }
+    }
+
+    if (!m_baseTableBoundaryColumn.empty())
+    {
+        statement->WriteCLob(&boundary_locator,
+            const_cast<char *>(wkt_s.str().c_str()));
+        statement->BindClob(&boundary_locator);
+        statement->Bind((int*)&m_srid);
+    }
+
+    try
+    {
+        statement->Execute();
+    }
+    catch (std::runtime_error const& e)
+    {
+        std::ostringstream oss;
+        oss << "Failed at creating Point Cloud entry into " <<
+            m_baseTableName << " table. Does the table exist? " << e.what();
+        throw pdal_error(oss.str());
+    }
+
+    try
+    {
+        Option& pc_id = m_options.getOptionByRef("pc_id");
+        pc_id.setValue(m_pc_id);
+    }
+    catch (Option::not_found)
+    {
+        Option pc_id("pc_id", m_pc_id, "Point Cloud Id");
+        m_options.add(pc_id);
+    }
+}
+
+
+bool OciWriter::isValidWKT(std::string const& input)
+{
+    OGRGeometryH g;
+
+    char* wkt = const_cast<char*>(input.c_str());
+    OGRErr e = OGR_G_CreateFromWkt(&wkt, NULL, &g);
+    OGR_G_DestroyGeometry(g);
+    return (e == 0);
+}
+
+
+void OciWriter::processOptions(const Options& options)
+{
+    m_precision = getDefaultedOption<uint32_t>(options,
+        "stream_output_precision");
+    m_createIndex = options.getValueOrDefault<bool>("create_index", true);
+    m_overwrite = getDefaultedOption<bool>(options, "overwrite");
+    m_reenableCloudTrigger =
+        options.getValueOrDefault<bool>("reenable_cloud_trigger", false);
+    m_disableCloudTrigger =
+        options.getValueOrDefault<bool>("disable_cloud_trigger", false);
+    m_trace = options.getValueOrDefault<bool>("do_trace", false);
+    m_solid = getDefaultedOption<bool>(options, "solid");
+    m_3d = getDefaultedOption<bool>(options, "is3d");
+    m_srid = options.getValueOrThrow<uint32_t>("srid");
+    m_baseTableBounds =
+        getDefaultedOption<BOX3D>(options, "base_table_bounds");
+    m_baseTableName = boost::to_upper_copy(
+        options.getValueOrThrow<std::string>("base_table_name"));
+    m_blockTableName = boost::to_upper_copy(
+        options.getValueOrThrow<std::string>("block_table_name"));
+    m_cloudColumnName = boost::to_upper_copy(
+        options.getValueOrThrow<std::string>("cloud_column_name"));
+    m_blockTablePartitionColumn = boost::to_upper_copy(
+        getDefaultedOption<std::string>(options,
+            "block_table_partition_column"));
+    m_blockTablePartitionValue =
+        getDefaultedOption<uint32_t>(options, "block_table_partition_value");
+    m_baseTableAuxColumns =
+        getDefaultedOption<std::string>(options, "base_table_aux_columns");
+    m_baseTableAuxValues =
+        getDefaultedOption<std::string>(options, "base_table_aux_values");
+    m_baseTableBoundaryColumn =
+        getDefaultedOption<std::string>(options, "base_table_boundary_column");
+    m_baseTableBoundaryWkt =
+        getDefaultedOption<std::string>(options, "base_table_boundary_wkt");
+
+    m_chunkCount =
+        options.getValueOrDefault<uint32_t>("blob_chunk_count", 16);
+    m_streamChunks = options.getValueOrDefault<bool>("stream_chunks", false);
+
+    bool dimInterleaved =
+        options.getValueOrDefault<bool>("store_dimensional_orientation", false);
+    m_orientation = dimInterleaved ? Orientation::DimensionMajor :
+        Orientation::PointMajor;
+    m_capacity = options.getValueOrThrow<uint32_t>("capacity");
+    m_connSpec = options.getValueOrDefault<std::string>("connection", "");
+    m_compression = options.getValueOrDefault<bool>("compression", false);
+
+    if (m_compression && (m_orientation == Orientation::DimensionMajor))
+        throw pdal_error("LAZperf compression not supported for "
+            "dimension-major point storage.");
+}
+
+
+void OciWriter::write(const PointViewPtr view)
+{
+    // While we'd like a separate offset for each tile, the schema is stored
+    // for the entire point cloud.
+    if (m_lastBlockId == 0)
+        setAutoXForm(view);
+    writeInit();
+    writeTile(view);
+}
+
+
+void OciWriter::writeInit()
+{
+    if (m_sdo_pc_is_initialized)
+        return;
+
+    if (m_trace)
+    {
+        log()->get(LogLevel::Debug) << "Setting database trace..." << std::endl;
+        std::ostringstream oss;
+        oss << "BEGIN " << std::endl;
+        oss << "DBMS_SESSION.set_sql_trace(sql_trace => TRUE);" << std::endl;
+        oss << "DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, "
+            "binds => TRUE);" << std::endl;
+        oss << "END;" << std::endl;
+        runCommand(oss);
+
+        char selectCmd[] = "SELECT VALUE FROM V$DIAG_INFO WHERE NAME = "
+            "'Default Trace File'";
+        Statement statement(m_connection->CreateStatement(selectCmd));
+
+        char traceTableName[1024] = {0};
+        statement->Define(traceTableName, sizeof(traceTableName));
+        statement->Execute();
+        log()->get(LogLevel::Debug) << "Trace location name:  " <<
+            traceTableName << std::endl;
+
+    }
+    createPCEntry();
+    m_triggerName = shutOff_SDO_PC_Trigger();
+    m_sdo_pc_is_initialized = true;
+}
+
+
+void OciWriter::ready(PointTableRef table)
+{
+    bool haveOutputTable = blockTableExists();
+    if (m_overwrite && haveOutputTable)
+        wipeBlockTable();
+    runFileSQL("pre_sql");
+    if (!haveOutputTable)
+        createBlockTable();
+
+    m_pcExtent.clear();
+    m_lastBlockId = 0;
+    DbWriter::doReady(table);
+}
+
+
+void OciWriter::done(PointTableRef table)
+{
+    if (!m_connection)
+        return;
+
+    m_connection->Commit();
+    if (m_createIndex && m_bDidCreateBlockTable)
+    {
+        createSDOEntry();
+        createBlockIndex();
+    }
+
+    // Update extent of SDO_PC entry
+    updatePCExtent();
+
+    if (m_reenableCloudTrigger)
+        turnOn_SDO_PC_Trigger(m_triggerName);
+    m_connection->Commit();
+    runFileSQL("post_block_sql");
+}
+
+
+void OciWriter::setElements(Statement statement, OCIArray* elem_info)
+{
+    statement->AddElement(elem_info, 1);
+    if (m_solid == true)
+    {
+        //"(1,1007,3)";
+        statement->AddElement(elem_info, 1007);
+    }
+    else
+    {
+        //"(1,1003,3)";
+        statement->AddElement(elem_info, 1003);
+    }
+    statement->AddElement(elem_info, 3);
+}
+
+
+void OciWriter::setOrdinates(Statement statement, OCIArray* ordinates,
+    const BOX3D& extent)
+{
+
+    statement->AddElement(ordinates, extent.minx);
+    statement->AddElement(ordinates, extent.miny);
+    if (m_3d)
+        statement->AddElement(ordinates, extent.minz);
+
+    statement->AddElement(ordinates, extent.maxx);
+    statement->AddElement(ordinates, extent.maxy);
+    if (m_3d)
+        statement->AddElement(ordinates, extent.maxz);
+}
+
+void OciWriter::writePointMajor(PointViewPtr view, std::vector<char>& outbuf)
+{
+    m_callback->setTotal(view->size());
+    m_callback->invoke(0);
+    if (m_compression)
+    {
+        outbuf.resize(0);
+#ifdef PDAL_HAVE_LAZPERF
+        XMLDimList xmlDims = dbDimTypes();
+        DimTypeList dimTypes;
+        for (XMLDim& xmlDim : xmlDims)
+            dimTypes.push_back(xmlDim.m_dimType);
+
+        SignedLazPerfBuf compBuf(outbuf);
+        LazPerfCompressor<SignedLazPerfBuf> compressor(compBuf, dimTypes);
+
+        try
+        {
+            std::vector<char> ptBuf(packedPointSize());
+            for (PointId idx = 0; idx < view->size(); ++idx)
+            {
+                size_t size = readPoint(*view, idx, ptBuf.data());
+                compressor.compress(ptBuf.data(), size);
+            }
+        }
+        catch (pdal_error)
+        {
+            compressor.done();
+            throw;
+        }
+        compressor.done();
+#else
+        throw pdal_error("Can't compress without LAZperf.");
+#endif
+    }
+    else
+    {
+        size_t totalSize = 0;
+        char *pos = outbuf.data();
+        for (PointId idx = 0; idx < view->size(); ++idx)
+        {
+            size_t size = readPoint(*view.get(), idx, pos);
+            totalSize += size;
+            if (idx % 100 == 0)
+                m_callback->invoke(idx);
+            pos += size;
+        }
+        outbuf.resize(totalSize);
+    }
+    m_callback->invoke(view->size());
+}
+
+
+void OciWriter::writeDimMajor(PointViewPtr view, std::vector<char>& outbuf)
+{
+    size_t clicks = 0;
+    size_t interrupt = dbDimTypes().size() * 100;
+    size_t totalSize = 0;
+    char *pos = outbuf.data();
+
+    XMLDimList xmlDims = dbDimTypes();
+    for (auto& xmlDim : xmlDims)
+    {
+        for (PointId idx = 0; idx < view->size(); ++idx)
+        {
+            size_t size = readField(*view.get(), pos,
+                xmlDim.m_dimType.m_id, idx);
+            pos += size;
+            totalSize += size;
+            if (clicks++ % interrupt == 0)
+                m_callback->invoke(clicks / xmlDims.size());
+        }
+    }
+    outbuf.resize(totalSize);
+}
+
+
+void OciWriter::writeTile(const PointViewPtr view)
+{
+    bool usePartition = (m_blockTablePartitionColumn.size() != 0);
+
+    std::ostringstream oss;
+    oss << "INSERT INTO "<< m_blockTableName <<
+        "(OBJ_ID, BLK_ID, NUM_POINTS, POINTS, PCBLK_MIN_RES, BLK_EXTENT, "
+        "PCBLK_MAX_RES, NUM_UNSORTED_POINTS, PT_SORT_DIM";
+    if (usePartition)
+        oss << "," << m_blockTablePartitionColumn;
+    oss << ") "
+        "VALUES ( :1, :2, :3, :4, 1, mdsys.sdo_geometry(:5, :6, null,:7, :8)"
+        ", 1, 0, 1";
+    if (usePartition)
+        oss << ", :9";
+    oss <<")";
+
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+
+    // :1
+    statement->Bind(&m_pc_id);
+    log()->get(LogLevel::Debug4) << "Block obj_id " << m_pc_id << std::endl;
+
+    // :2
+    statement->Bind(&m_lastBlockId);
+    m_lastBlockId++;
+    log()->get(LogLevel::Debug4) << "Last BlockId " <<
+        m_lastBlockId << std::endl;
+
+    // :3
+    long long_num_points = static_cast<long>(view->size());
+    statement->Bind(&long_num_points);
+    log()->get(LogLevel::Debug4) << "Num points " <<
+        long_num_points << std::endl;
+
+    // :4
+
+    //NOTE: packed point size is guaranteed to be of sufficient size to hold
+    // a point's data, but it may be larger than the actual size of a point
+    // if location scaling is being used.
+    std::vector<char> outbuf(packedPointSize() * view->size());
+    size_t totalSize = 0;
+    if (m_orientation == Orientation::DimensionMajor)
+        writeDimMajor(view, outbuf);
+    else if (m_orientation == Orientation::PointMajor)
+        writePointMajor(view, outbuf);
+
+
+    log()->get(LogLevel::Debug4) << "Blob size " << outbuf.size() << std::endl;
+    OCILobLocator* locator;
+    if (m_streamChunks)
+    {
+        statement->WriteBlob(&locator, outbuf.data(), (long)outbuf.size(),
+            m_chunkCount);
+        statement->BindBlob(&locator);
+    }
+    else
+        statement->Bind(outbuf.data(), (long)outbuf.size());
+
+    // :5
+    long long_gtype = static_cast<long>(m_gtype);
+    statement->Bind(&long_gtype);
+    log()->get(LogLevel::Debug4) << "OCI geometry type " <<
+        m_gtype << std::endl;
+
+    // :6
+    long srid;
+
+    if (m_srid != 0)
+        srid = m_srid;
+    statement->Bind(&srid);
+    log()->get(LogLevel::Debug4) << "OCI SRID " << srid << std::endl;
+
+
+    // :7
+    OCIArray* sdo_elem_info = 0;
+    m_connection->CreateType(&sdo_elem_info, m_connection->GetElemInfoType());
+    setElements(statement, sdo_elem_info);
+    statement->Bind(&sdo_elem_info, m_connection->GetElemInfoType());
+
+    // :8
+    OCIArray* sdo_ordinates = 0;
+    m_connection->CreateType(&sdo_ordinates, m_connection->GetOrdinateType());
+
+    BOX3D bounds;
+    view->calculateBounds(bounds);
+    // Cumulate a total bounds for the file.
+    m_pcExtent.grow(bounds);
+
+    setOrdinates(statement, sdo_ordinates, bounds);
+    statement->Bind(&sdo_ordinates, m_connection->GetOrdinateType());
+    log()->get(LogLevel::Debug4) << "Bounds " << bounds << std::endl;
+
+    // :9
+    if (usePartition)
+    {
+        long long_partition_id = (long)m_blockTablePartitionValue;
+        statement->Bind(&long_partition_id);
+        log()->get(LogLevel::Debug4) << "Partition ID " << long_partition_id <<
+            std::endl;
+    }
+
+    try
+    {
+        statement->Execute();
+    }
+    catch (std::runtime_error const& e)
+    {
+        std::ostringstream oss;
+        oss << "Failed to insert block # into '" << m_blockTableName <<
+            "' table. Does the table exist? "  << std::endl;
+        oss << e.what() << std::endl;
+        throw std::runtime_error(oss.str());
+    }
+
+    if (m_streamChunks)
+        // We don't use a locator unless we're stream-writing the data.
+        OWStatement::Free(&locator, 1);
+
+    m_connection->DestroyType(&sdo_elem_info);
+    m_connection->DestroyType(&sdo_ordinates);
+}
+
+
+std::string OciWriter::shutOff_SDO_PC_Trigger()
+{
+    // Don't monkey with the trigger unless the user says to.
+    if (!m_disableCloudTrigger)
+        return std::string("");
+
+    std::ostringstream oss;
+    char szTrigger[OWNAME] = "";
+    char szStatus[OWNAME] = "";
+
+    oss << "select trigger_name, status from all_triggers where "
+        "table_name = '" << m_baseTableName <<
+        "' AND TRIGGER_NAME like upper('%%MDTNPC_%%') ";
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+
+    statement->Define(szTrigger);
+    statement->Define(szStatus);
+    statement->Execute();
+
+    // Yes, we're assuming there's only one trigger that met these criteria.
+
+    if (!strlen(szStatus))
+    {
+        // No rows returned, no trigger exists
+        return std::string();
+    }
+
+    if (boost::iequals(szStatus, "ENABLED"))
+    {
+        oss.str("");
+        oss << "ALTER TRIGGER " << szTrigger << " DISABLE ";
+
+        statement = Statement(m_connection->CreateStatement(oss.str().c_str()));
+        statement->Execute();
+        return std::string(szTrigger);
+    }
+    return std::string();
+}
+
+
+void OciWriter::turnOn_SDO_PC_Trigger(std::string trigger_name)
+{
+    if (!trigger_name.size())
+        return;
+
+    std::ostringstream oss;
+    oss << "ALTER TRIGGER " << trigger_name << " ENABLE ";
+
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+    statement->Execute();
+}
+
+
+void OciWriter::updatePCExtent()
+{
+    BOX3D bounds = m_baseTableBounds;
+    if (bounds.empty())
+        bounds = m_pcExtent;
+
+    std::ostringstream s_geom;
+    s_geom.setf(std::ios_base::fixed, std::ios_base::floatfield);
+    s_geom.precision(m_precision);
+
+    s_geom << "           mdsys.sdo_geometry(" << m_gtype << ", " << m_srid <<
+        ", null,\n"
+        "              mdsys.sdo_elem_info_array" << createPCElemInfo() << ",\n"
+        "              mdsys.sdo_ordinate_array(\n";
+
+    s_geom << bounds.minx << "," << bounds.miny << ",";
+    if (m_3d)
+        s_geom << bounds.minz << ",";
+
+    s_geom << bounds.maxx << "," << bounds.maxy;
+    if (m_3d)
+        s_geom << "," << bounds.maxz;
+    s_geom << "))";
+
+    std::ostringstream oss;
+
+    oss << "UPDATE "<< m_baseTableName <<
+        " A SET A." << m_cloudColumnName <<".PC_EXTENT = " << s_geom.str() <<
+        " WHERE A.ID = " << m_pc_id;
+
+    Statement statement(m_connection->CreateStatement(oss.str().c_str()));
+    try
+    {
+        statement->Execute();
+    }
+    catch (std::runtime_error const& e)
+    {
+        std::ostringstream oss;
+        oss << "Failed to update cloud extent in '" << m_baseTableName <<
+            "' table with id " << m_pc_id << ". Does the table exist? " <<
+            std::endl << e.what() << std::endl;
+        throw std::runtime_error(oss.str());
+    }
+    m_connection->Commit();
+}
+
+
+} // namespace pdal
diff --git a/plugins/oci/io/OciWriter.hpp b/plugins/oci/io/OciWriter.hpp
new file mode 100644
index 0000000..38d34e1
--- /dev/null
+++ b/plugins/oci/io/OciWriter.hpp
@@ -0,0 +1,141 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/DbWriter.hpp>
+#include <pdal/GDALUtils.hpp>
+
+pdal::Writer* createOciWriter();
+
+#include "OciCommon.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL OciWriter : public DbWriter
+{
+public:
+    OciWriter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    template<typename T>
+    T getDefaultedOption(const Options& options,
+        const std::string& option_name)
+    {
+        T default_value =
+            getDefaultOptions().getOption(option_name).getValue<T>();
+        return options.getValueOrDefault<T>(option_name, default_value);
+    }
+
+    virtual void processOptions(const Options& options);
+    virtual void initialize();
+    virtual void ready(PointTableRef table);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+    void writeInit();
+    void writeTile(const PointViewPtr view);
+
+    void runCommand(std::ostringstream const& command);
+    void wipeBlockTable();
+    void createBlockIndex();
+    void createBlockTable();
+    void createSDOEntry();
+    void createPCEntry();
+    long getGType();
+    std::string createPCElemInfo();
+    bool blockTableExists();
+    void runFileSQL(std::string const& filename);
+    bool isGeographic(int32_t srid);
+    std::string loadSQLData(std::string const& filename);
+    void setOrdinates(Statement statement, OCIArray* ordinates,
+        const BOX3D& extent);
+    void setElements(Statement statement, OCIArray* elem_info);
+    void updatePCExtent();
+    std::string shutOff_SDO_PC_Trigger();
+    void turnOn_SDO_PC_Trigger(std::string trigger_name);
+    bool isValidWKT(std::string const& wkt);
+    void writeDimMajor(PointViewPtr view, std::vector<char>& outbuf);
+    void writePointMajor(PointViewPtr view, std::vector<char>& outbuf);
+
+    long m_lastBlockId;
+    BOX3D m_bounds; // Bounds of the entire point cloud
+    Connection m_connection;
+    bool m_createIndex;
+    bool m_bDidCreateBlockTable;
+    BOX3D m_pcExtent;
+    BOX3D m_baseTableBounds;
+    int m_pc_id;
+    std::string m_blockTableName;
+    std::string m_blockTablePartitionColumn;
+    int32_t m_blockTablePartitionValue;
+    uint32_t m_srid;
+    long m_gtype;
+    bool m_3d;
+    bool m_solid;
+    uint32_t m_precision;
+    bool m_overwrite;
+    bool m_trace;
+    bool m_compression;
+
+    std::string m_baseTableName;
+    std::string m_cloudColumnName;
+    std::string m_baseTableAuxColumns;
+    std::string m_baseTableAuxValues;
+
+    std::string m_baseTableBoundaryColumn;
+    std::string m_baseTableBoundaryWkt;
+
+    std::string m_triggerName;
+    bool m_reenableCloudTrigger;
+    bool m_disableCloudTrigger;
+    bool m_sdo_pc_is_initialized;
+    uint32_t m_chunkCount;
+    uint32_t m_capacity;
+    bool m_streamChunks;
+    Orientation::Enum m_orientation;
+    std::string m_connSpec;
+
+    OciWriter& operator=(const OciWriter&); // not implemented
+    OciWriter(const OciWriter&); // not implemented
+
+};
+
+} // namespace pdal
diff --git a/plugins/oci/test/OCITest.cpp b/plugins/oci/test/OCITest.cpp
new file mode 100644
index 0000000..e0ca4b5
--- /dev/null
+++ b/plugins/oci/test/OCITest.cpp
@@ -0,0 +1,402 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "gtest/gtest.h"
+
+#include <boost/property_tree/ptree.hpp>
+
+#include <pdal/Filter.hpp>
+#include <pdal/StageFactory.hpp>
+#include <las/LasReader.hpp>
+
+#include "../io/OciCommon.hpp"
+#include "Support.hpp"
+#include "TestConfig.hpp"
+
+using namespace pdal;
+
+GTEST_API_ int main(int argc, char **argv)
+{
+    testing::InitGoogleTest(&argc, argv);
+    for (int i = 0; i < argc; ++i)
+    {
+        std::string s = argv[i];
+        if (Utils::startsWith(s, "--connection"))
+        {
+            auto pos = s.find_first_of('=');
+            if (pos == std::string::npos)
+                throw pdal_error("Invalid command line connection string.");
+            TestConfig::g_oracle_connection = s.substr(pos + 1);
+            break;
+        }
+    }
+    return RUN_ALL_TESTS();
+}
+
+
+bool ShouldRunTest()
+{
+    return TestConfig::g_oracle_connection.size() > 0;
+}
+
+
+Options getOCIOptions()
+{
+    Options options;
+
+    options.add("overwrite", false);
+    options.add("connection", std::string(TestConfig::g_oracle_connection));
+    options.add("block_table_name", "PDAL_TEST_BLOCKS");
+    options.add("base_table_name", "PDAL_TEST_BASE");
+    options.add("cloud_column_name", "CLOUD");
+    options.add("srid", 26910);
+    options.add("disable_cloud_trigger", true);
+    options.add("filename", Support::datapath("autzen/autzen-utm.las"));
+    options.add("xml_schema_dump", "pcs-oracle-xml-schema-dump.xml");
+    return options;
+}
+
+class SplitFilter : public Filter
+{
+public:
+   SplitFilter(point_count_t viewSize = 100) : m_viewSize(viewSize)
+       {}
+
+   virtual std::string getName() const
+       { return "split_filter"; }
+
+private:
+    point_count_t m_viewSize;
+
+    virtual PointViewSet run(PointViewPtr view)
+    {
+        PointViewSet out;
+        PointViewPtr v = view->makeNew();
+        for (PointId i = 0; i < view->size(); ++i)
+        {
+            if (i && (i % m_viewSize == 0))
+            {
+                out.insert(v);
+                v = v->makeNew();
+            }
+            v->appendPoint(*view, i);
+        }
+        out.insert(v);
+        return out;
+    }
+};
+
+class OCITest : public testing::Test
+{
+protected:
+    virtual void SetUp()
+    {
+        m_options = getOCIOptions();
+
+        connect();
+        cleanup();
+
+        std::string base_table_name =
+            m_options.getValueOrThrow<std::string>("base_table_name");
+        std::string create_pc_table("CREATE TABLE " + base_table_name +
+            " (id number, CLOUD SDO_PC, DESCRIPTION VARCHAR2(20), HEADER "
+            "BLOB, BOUNDARY SDO_GEOMETRY)");
+        run(create_pc_table);
+
+        std::string block_table_name =
+            m_options.getValueOrThrow<std::string>("block_table_name");
+        std::string create_block_table = "CREATE TABLE " + block_table_name +
+            " AS SELECT * FROM MDSYS.SDO_PC_BLK_TABLE";
+        run(create_block_table);
+    }
+
+    void connect()
+    {
+        if (!m_connection.get())
+            m_connection = pdal::connect(TestConfig::g_oracle_connection);
+        if (!m_connection.get() || !m_connection->Succeeded())
+        {
+            std::ostringstream oss;
+
+            oss << "Couldn't connect via OCI using spec '" <<
+                TestConfig::g_oracle_connection << "'";
+            throw pdal_error(oss.str());
+        }
+    }
+
+    void run(std::string sql)
+    {
+        Statement statement(m_connection->CreateStatement(sql.c_str()));
+        statement->Execute();
+    }
+
+    Options m_options;
+    Connection m_connection;
+
+    virtual void TearDown()
+    {
+    }
+
+    void cleanup()
+    {
+        std::string base_table_name =
+            m_options.getValueOrThrow<std::string>("base_table_name");
+        std::string block_table_name =
+            m_options.getValueOrThrow<std::string>("block_table_name");
+
+        std::string drop_base_table = "DROP TABLE " + base_table_name;
+        std::string drop_block_table = "DROP TABLE " + block_table_name;
+        run(drop_base_table);
+        run(drop_block_table);
+
+        std::string cleanup_metadata = "DELETE FROM USER_SDO_GEOM_METADATA "
+            "WHERE TABLE_NAME ='" + block_table_name + "'";
+        run(cleanup_metadata);
+    }
+
+};
+
+/**
+TEST_F(OCITest, throughput)
+{
+    Options options;
+
+    options.add("capacity", 10000);
+    options.add("connection", std::string(TestConfig::g_oracle_connection));
+    options.add("block_table_name", "PDAL_TEST_BLOCKS");
+    options.add("base_table_name", "PDAL_TEST_BASE");
+    options.add("cloud_column_name", "CLOUD");
+    options.add("srid", 26910);
+    options.add("disable_cloud_trigger", true);
+    options.add("store_dimensional_orientation", false);
+    options.add("filename", "/Volumes/acbell-lidar1/big.ntf");
+
+    {
+        options.add("offset_x", "auto");
+        options.add("offset_y", "auto");
+        options.add("offset_z", "auto");
+        options.add("scale_x", 1e-6);
+        options.add("scale_y", 1e-6);
+        options.add("scale_z", 1e-6);
+    }
+    //if (compression)
+        options.add("compression", true);
+
+    PointTable table;
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader(f.createStage("readers.nitf"));
+    reader->setOptions(options);
+
+    SplitFilter split(10000);
+    split.setInput(*reader);
+
+    std::unique_ptr<Stage> writer(f.createStage("writers.oci"));
+    EXPECT_TRUE(writer.get());
+    writer->setOptions(options);
+    writer->setInput(split);
+
+    writer->prepare(table);
+    writer->execute(table);
+}
+***/
+
+
+void writeData(Orientation::Enum orient, bool scaling, bool compression = false)
+{
+    Options options;
+
+    options.add("capacity", 10000);
+    options.add("connection", std::string(TestConfig::g_oracle_connection));
+    options.add("debug", "true");
+    options.add("block_table_name", "PDAL_TEST_BLOCKS");
+    options.add("base_table_name", "PDAL_TEST_BASE");
+    options.add("cloud_column_name", "CLOUD");
+    options.add("srid", 26910);
+    options.add("disable_cloud_trigger", true);
+    options.add("store_dimensional_orientation",
+        orient == Orientation::DimensionMajor);
+    if (scaling)
+    {
+        options.add("offset_x", "auto");
+        options.add("offset_y", "auto");
+        options.add("offset_z", "auto");
+        options.add("scale_x", 1e-6);
+        options.add("scale_y", 1e-6);
+        options.add("scale_z", 1e-6);
+    }
+    if (compression)
+        options.add("compression", true);
+
+    PointTable table;
+
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("autzen/autzen-utm.las"));
+
+    StageFactory f;
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    SplitFilter split;
+    split.setInput(reader);
+
+    std::unique_ptr<Stage> writer(f.createStage("writers.oci"));
+    EXPECT_TRUE(writer.get());
+    writer->setOptions(options);
+    writer->setInput(split);
+
+    writer->prepare(table);
+    writer->execute(table);
+}
+
+
+// Compare the source LAS file with the extracted OCI data.
+// Candidate is the OCI reader's view.
+void compare(const PointViewPtr candidate, std::string filename)
+{
+    Options options;
+    Option fn("filename", filename);
+    options.add(fn);
+
+    PointTable table;
+
+    LasReader reader;
+    reader.setOptions(options);
+
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr source = *viewSet.begin();
+
+    EXPECT_EQ(source->size(), candidate->size());
+    PointId limit = std::min(source->size(), candidate->size());
+    
+    for (PointId i = 0; i < limit; ++i)
+    {
+        using namespace Dimension;
+
+        int32_t sx = source->getFieldAs<int32_t>(Id::X, i);
+        int32_t sy = source->getFieldAs<int32_t>(Id::Y, i);
+        int32_t sz = source->getFieldAs<int32_t>(Id::Z, i);
+        uint16_t sintensity = source->getFieldAs<uint16_t>(Id::Intensity, i);
+        uint16_t sred = source->getFieldAs<uint16_t>(Id::Red, i);
+        uint16_t sgreen = source->getFieldAs<uint16_t>(Id::Green, i);
+        uint16_t sblue = source->getFieldAs<uint16_t>(Id::Blue, i);
+
+        int32_t cx = candidate->getFieldAs<int32_t>(Id::X, i);
+        int32_t cy = candidate->getFieldAs<int32_t>(Id::Y, i);
+        int32_t cz = candidate->getFieldAs<int32_t>(Id::Z, i);
+        uint16_t cintensity = candidate->getFieldAs<uint16_t>(Id::Intensity, i);
+        uint16_t cred = candidate->getFieldAs<uint16_t>(Id::Red, i);
+        uint16_t cgreen = candidate->getFieldAs<uint16_t>(Id::Green, i);
+        uint16_t cblue = candidate->getFieldAs<uint16_t>(Id::Blue, i);
+
+        EXPECT_EQ(sx, cx);
+        EXPECT_EQ(sy, cy);
+        EXPECT_EQ(sz, cz);
+        EXPECT_EQ(sintensity, cintensity);
+        EXPECT_EQ(sred, cred);
+        EXPECT_EQ(sgreen, cgreen);
+        EXPECT_EQ(sblue, cblue);
+    }
+}
+
+
+void readData()
+{
+    std::ostringstream oss;
+
+    oss << "SELECT  l.\"OBJ_ID\", l.\"BLK_ID\", l.\"BLK_EXTENT\", " <<
+        "l.\"BLK_DOMAIN\", l.\"PCBLK_MIN_RES\", l.\"PCBLK_MAX_RES\", " <<
+        "l.\"NUM_POINTS\", l.\"NUM_UNSORTED_POINTS\", l.\"PT_SORT_DIM\", " <<
+        "l.\"POINTS\", b.cloud "
+           "FROM PDAL_TEST_BLOCKS l, PDAL_TEST_BASE b "
+        "WHERE b.id = l.obj_id ORDER BY l.blk_id ";
+
+    Options options = getOCIOptions();
+    options.add("query", oss.str());
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader(f.createStage("readers.oci"));
+    EXPECT_TRUE(reader.get());
+
+    reader->setOptions(options);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1065u);
+
+    compare(view, Support::datapath("autzen/autzen-utm.las"));
+}
+
+
+TEST_F(OCITest, dim_major_unscaled)
+{
+    writeData(Orientation::DimensionMajor, false);
+    readData();
+}
+
+
+TEST_F(OCITest, dim_major_scaled)
+{
+    writeData(Orientation::DimensionMajor, true);
+    readData();
+}
+
+
+TEST_F(OCITest, point_major_unscaled)
+{
+    writeData(Orientation::PointMajor, false);
+    readData();
+}
+
+
+TEST_F(OCITest, point_major_unscaled_compressed)
+{
+    writeData(Orientation::PointMajor, false, true);
+    readData();
+}
+
+
+TEST_F(OCITest, point_major_scaled)
+{
+    writeData(Orientation::PointMajor, true);
+    readData();
+}
+
diff --git a/plugins/p2g/CMakeLists.txt b/plugins/p2g/CMakeLists.txt
new file mode 100644
index 0000000..756db05
--- /dev/null
+++ b/plugins/p2g/CMakeLists.txt
@@ -0,0 +1,16 @@
+#
+# Points2grid plugin CMake configuration
+#
+
+find_package(P2G)
+if (P2G_FOUND)
+    include_directories(${P2G_INCLUDE_DIR})
+    add_definitions(-DHAVE_P2G=1)
+
+    set(srcs io/P2gWriter.cpp)
+    set(incs io/P2gWriter.hpp)
+
+    PDAL_ADD_PLUGIN(libname writer p2g
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${P2G_LIBRARY})
+endif()
diff --git a/plugins/p2g/io/P2gWriter.cpp b/plugins/p2g/io/P2gWriter.cpp
new file mode 100644
index 0000000..b6b5d8d
--- /dev/null
+++ b/plugins/p2g/io/P2gWriter.cpp
@@ -0,0 +1,231 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "P2gWriter.hpp"
+#include <pdal/PointView.hpp>
+
+#include <iostream>
+#include <algorithm>
+
+#include <boost/algorithm/string.hpp>
+#include <points2grid/Interpolation.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.p2g",
+    "Points2Grid Writer",
+    "http://pdal.io/stages/writers.p2g.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, P2gWriter, Writer, s_info)
+
+std::string P2gWriter::getName() const { return s_info.name; }
+
+void P2gWriter::processOptions(const Options& options)
+{
+    m_GRID_DIST_X = options.getValueOrDefault<double>("grid_dist_x", 6.0);
+    m_GRID_DIST_Y = options.getValueOrDefault<double>("grid_dist_y", 6.0);
+    m_RADIUS = options.getValueOrDefault<double>("radius",
+        8.4852813742385713);
+    m_fill_window_size = options.getValueOrDefault<uint32_t>(
+        "fill_window_size", 3);
+    m_filename = options.getValueOrThrow<std::string>("filename");
+
+    std::vector<Option> types = options.getOptions("output_type");
+
+    if (!types.size())
+        m_outputTypes = OUTPUT_TYPE_ALL;
+    else
+    {
+        for (auto i = types.begin(); i != types.end(); ++i)
+        {
+            if (boost::iequals(i->getValue<std::string>(), "min"))
+                m_outputTypes |= OUTPUT_TYPE_MIN;
+            if (boost::iequals(i->getValue<std::string>(), "max"))
+                m_outputTypes |= OUTPUT_TYPE_MAX;
+            if (boost::iequals(i->getValue<std::string>(), "mean"))
+                m_outputTypes |= OUTPUT_TYPE_MEAN;
+            if (boost::iequals(i->getValue<std::string>(), "idw"))
+                m_outputTypes |= OUTPUT_TYPE_IDW;
+            if (boost::iequals(i->getValue<std::string>(), "den"))
+                m_outputTypes |= OUTPUT_TYPE_DEN;
+            if (boost::iequals(i->getValue<std::string>(), "std"))
+                m_outputTypes |= OUTPUT_TYPE_STD;
+            if (boost::iequals(i->getValue<std::string>(), "all"))
+                m_outputTypes = OUTPUT_TYPE_ALL;
+        }
+    }
+
+    std::string output_format =
+        options.getValueOrDefault<std::string>("output_format", "grid");
+    if (boost::iequals(output_format, "grid"))
+        m_outputFormat = OUTPUT_FORMAT_GRID_ASCII;
+    else if (boost::iequals(output_format, "asc"))
+        m_outputFormat = OUTPUT_FORMAT_ARC_ASCII;
+    else if (boost::iequals(output_format, "tif"))
+        m_outputFormat = OUTPUT_FORMAT_GDAL_GTIFF;
+    else if (boost::iequals(output_format, "all"))
+        m_outputFormat = OUTPUT_FORMAT_ALL;
+    else
+    {
+        std::ostringstream oss;
+        oss << "Unrecognized output format " << output_format;
+        throw p2g_error("Unrecognized output format");
+    }
+}
+
+
+/*
+void P2gWriter::ready(PointTableRef table)
+{
+    double min_x = (std::numeric_limits<double>::max)();
+    double max_x = (std::numeric_limits<double>::min)();
+    double min_y = (std::numeric_limits<double>::max)();
+    double max_y = (std::numeric_limits<double>::min)();
+    setBounds(pdal::Bounds<double>(min_x, min_y, max_x, max_y));
+}
+*/
+
+
+Options P2gWriter::getDefaultOptions()
+{
+    Options options;
+
+    Option grid_x("grid_dist_x", 6.0, "X grid distance");
+    Option grid_y("grid_dist_y", 6.0, "Y grid distance");
+
+    double default_radius = (double) sqrt(2.0) * grid_x.getValue<double>();
+    Option radius("radius", default_radius);
+
+    Option fill_window_size("fill_window_size", 3);
+    Option dim_z("Z", "Z", "Name of Z dimension to interpolate");
+    options.add(dim_z);
+    options.add(grid_x);
+    options.add(grid_y);
+    options.add(radius);
+    options.add(fill_window_size);
+    return options;
+}
+
+
+void P2gWriter::write(const PointViewPtr view)
+{
+    std::string z_name = getOptions().getValueOrDefault<std::string>("Z", "Z");
+
+
+    for (point_count_t idx = 0; idx < view->size(); idx++)
+    {
+        double x = view->getFieldAs<double>(Dimension::Id::X, idx);
+        double y = view->getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = view->getFieldAs<double>(Dimension::Id::Z, idx);
+        m_coordinates.push_back(boost::tuple<double, double, double>(x, y, z));
+    }
+
+    view->calculateBounds(m_bounds);
+}
+
+void P2gWriter::done(PointTableRef table)
+{
+    // If we never got any points, we're done.
+    if (! m_coordinates.size()) return;
+
+    m_GRID_SIZE_X = (int)(ceil((m_bounds.maxx - m_bounds.minx)/m_GRID_DIST_X)) + 1;
+    m_GRID_SIZE_Y = (int)(ceil((m_bounds.maxy - m_bounds.miny)/m_GRID_DIST_Y)) + 1;
+
+    log()->get(LogLevel::Debug) << "X grid size: " << m_GRID_SIZE_X << std::endl;
+    log()->get(LogLevel::Debug) << "Y grid size: " << m_GRID_SIZE_Y << std::endl;
+
+
+    log()->floatPrecision(6);
+    log()->get(LogLevel::Debug) << "X grid distance: " << m_GRID_DIST_X << std::endl;
+    log()->get(LogLevel::Debug) << "Y grid distance: " << m_GRID_DIST_Y << std::endl;
+    log()->clearFloat();
+
+    std::unique_ptr<OutCoreInterp> p(new OutCoreInterp(m_GRID_DIST_X,
+                                       m_GRID_DIST_Y,
+                                       m_GRID_SIZE_X,
+                                       m_GRID_SIZE_Y,
+                                       m_RADIUS * m_RADIUS,
+                                       m_bounds.minx,
+                                       m_bounds.maxx,
+                                       m_bounds.miny,
+                                       m_bounds.maxy,
+                                       m_fill_window_size));
+    m_interpolator.swap(p);
+
+    if (m_interpolator->init() < 0)
+    {
+        throw p2g_error("unable to initialize interpolator");
+    }
+
+    int rc(0);
+
+    std::vector<boost::tuple<double, double, double> >::const_iterator i;
+    for (i = m_coordinates.begin(); i!= m_coordinates.end(); ++i)
+    {
+        double x = i->get<0>();
+        double y = i->get<1>();
+        x = x - m_bounds.minx;
+        y = y - m_bounds.miny;
+
+        rc = m_interpolator->update(x, y, i->get<2>());
+        if (rc < 0)
+        {
+            throw p2g_error("interp->update() error while processing ");
+        }
+    }
+
+    double adfGeoTransform[6];
+    adfGeoTransform[0] = m_bounds.minx - 0.5*m_GRID_DIST_X;
+    adfGeoTransform[1] = m_GRID_DIST_X;
+    adfGeoTransform[2] = 0.0;
+    adfGeoTransform[3] = m_bounds.maxy + 0.5*m_GRID_DIST_Y;
+    adfGeoTransform[4] = 0.0;
+    adfGeoTransform[5] = -1 * m_GRID_DIST_Y;
+
+    SpatialReference const& srs = table.spatialRef();
+
+    log()->get(LogLevel::Debug) << "Output SRS  :'" << srs.getWKT() << "'" << std::endl;
+    if ((rc = m_interpolator->finish(const_cast<char*>(m_filename.c_str()), m_outputFormat, m_outputTypes, adfGeoTransform, srs.getWKT().c_str())) < 0)
+    {
+        throw p2g_error("interp->finish() error");
+    }
+
+    return;
+}
+
+
+
+} // namespaces
diff --git a/plugins/p2g/io/P2gWriter.hpp b/plugins/p2g/io/P2gWriter.hpp
new file mode 100644
index 0000000..2ef645b
--- /dev/null
+++ b/plugins/p2g/io/P2gWriter.hpp
@@ -0,0 +1,104 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <memory>
+
+#include <boost/tuple/tuple.hpp>
+
+#include <points2grid/config.h>
+#include <points2grid/Interpolation.hpp>
+#include <points2grid/Global.hpp>
+#include <points2grid/OutCoreInterp.hpp>
+
+namespace pdal
+{
+
+
+class p2g_error : public pdal_error
+{
+public:
+    p2g_error(std::string const& msg)
+        : pdal_error(msg)
+    {}
+};
+
+
+
+class CoreInterp;
+
+class PDAL_DLL P2gWriter : public Writer
+{
+public:
+    P2gWriter() : m_outputTypes(0), m_outputFormat(OUTPUT_FORMAT_ARC_ASCII)
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    P2gWriter& operator=(const P2gWriter&); // not implemented
+
+    virtual void processOptions(const Options& options);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    std::unique_ptr<OutCoreInterp> m_interpolator;
+    uint64_t m_pointCount;
+
+    uint32_t m_GRID_SIZE_X;
+    uint32_t m_GRID_SIZE_Y;
+
+    double m_GRID_DIST_X;
+    double m_GRID_DIST_Y;
+
+    double m_RADIUS;
+    unsigned int m_outputTypes;
+    uint32_t m_fill_window_size;
+    BOX3D m_bounds;
+
+    std::string m_filename;
+    int m_outputFormat;
+
+    std::vector<boost::tuple<double, double, double> > m_coordinates;
+};
+
+} // namespaces
diff --git a/plugins/pcl/CMakeLists.txt b/plugins/pcl/CMakeLists.txt
new file mode 100644
index 0000000..54d8e61
--- /dev/null
+++ b/plugins/pcl/CMakeLists.txt
@@ -0,0 +1,178 @@
+#
+# PCL plugin CMake configuration
+#
+# The PCL integration still has a few warts that need to be resolved:
+#
+#     1. src/kernel/Kernel.cpp requires PCL for invoking the PCLVisualizer with
+#        two point buffers.
+#
+#        This is currently disabled (commented out), and should be somehow
+#        fully integrated as a plugin behavior.
+#
+#     2. PCL unit tests still live within main test directory.
+#
+#        We should be able to move plugin tests to plugin directories without
+#        too much hassle. PCL unit tests will pass with a warning if the PCL
+#        plugins are not installed in PDAL_DRIVER_PATH (just assumes you didn't
+#        intend to test with PCL support).
+#
+
+#------------------------------------------------------------------------------
+# settings for PCL
+#------------------------------------------------------------------------------
+
+find_package(PCL QUIET 1.7 REQUIRED)
+
+set_package_properties(PCL PROPERTIES DESCRIPTION "Point Cloud Library"
+    URL "http://pointclouds.org" TYPE RECOMMENDED
+    PURPOSE "Enables PCD reader/writer, PCLVisualizer, PCLBlock filter, and ground, pcl, smooth, and view kernels")
+
+include_directories(${PCL_INCLUDE_DIRS})
+include_directories(${CMAKE_CURRENT_LIST_DIR})
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/filters)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/pipeline)
+link_directories(${PCL_LIBRARY_DIRS})
+add_definitions(${PCL_DEFINITIONS})
+if (NOT WIN32)
+    add_definitions("-fvisibility-inlines-hidden")
+endif()
+
+# PCL's configuration clobbers Boost find_package - do it again
+find_package(Boost QUIET 1.52 COMPONENTS program_options iostreams filesystem system thread)
+
+if (PCL_VISUALIZATION_FOUND)
+#
+# PCLVisualizer Writer
+#
+    set(srcs io/PCLVisualizer.cpp)
+    set(incs
+        io/PCLVisualizer.hpp
+        PCLConversions.hpp
+    )
+
+    PDAL_ADD_PLUGIN(pclvisualizer_libname writer pclvisualizer
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${PCL_LIBRARIES})
+
+    #
+    # View Kernel
+    #
+    set(srcs kernel/ViewKernel.cpp)
+    set(incs kernel/ViewKernel.hpp)
+
+    PDAL_ADD_PLUGIN(view_libname kernel view
+        FILES "${srcs}" "${incs}"
+        LINK_WITH ${PCL_LIBRARIES})
+else()
+    message(STATUS "PCLVisualizer disabled because PCL_VISUALIZATION was not found")
+endif()
+
+#
+# PCD Reader
+#
+set(srcs
+    io/PcdCommon.cpp
+    io/PcdReader.cpp
+)
+
+set(incs
+    io/PcdCommon.hpp
+    io/PcdReader.hpp
+    io/point_types.hpp
+    PCLConversions.hpp
+)
+
+PDAL_ADD_PLUGIN(pcd_reader_libname reader pcd
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PCL_LIBRARIES})
+
+#
+# PCD Writer
+#
+set(srcs
+    io/PcdCommon.cpp
+    io/PcdWriter.cpp
+)
+
+set(incs
+    io/PcdCommon.hpp
+    io/PcdWriter.hpp
+    io/point_types.hpp
+    PCLConversions.hpp
+)
+
+PDAL_ADD_PLUGIN(pcd_writer_libname writer pcd
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PCL_LIBRARIES})
+
+#
+# PCLBlock Filter
+#
+set(srcs
+    pipeline/PCLPipeline.cpp
+    filters/PCLBlock.cpp
+)
+
+set(incs
+   pipeline/PCLPipeline.h
+   pipeline/PCLPipeline.hpp
+   filters/PCLBlock.hpp
+   PCLConversions.hpp
+)
+
+PDAL_ADD_PLUGIN(pclblock_libname filter pclblock
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PCL_LIBRARIES})
+
+#
+# Ground Filter
+#
+PDAL_ADD_PLUGIN(ground_filter_libname filter ground
+    FILES filters/GroundFilter.hpp filters/GroundFilter.cpp
+    LINK_WITH ${PCL_LIBRARIES})
+
+#
+# PCL Kernel
+#
+set(srcs kernel/PCLKernel.cpp)
+set(incs kernel/PCLKernel.hpp)
+
+PDAL_ADD_PLUGIN(pcl_libname kernel pcl
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PCL_LIBRARIES} ${pclblock_libname})
+
+#
+# Height Above Ground Kernel
+#
+#PDAL_ADD_PLUGIN(hag_libname kernel height
+#    FILES kernel/HeightAboveGroundKernel.cpp
+#    LINK_WITH ${PCL_LIBRARIES})
+
+#
+# Ground Kernel
+#
+set(srcs kernel/GroundKernel.cpp)
+set(incs kernel/GroundKernel.hpp)
+
+PDAL_ADD_PLUGIN(ground_kernel_libname kernel ground
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${ground_filter_libname})
+
+#
+# Smooth Kernel
+#
+set(srcs kernel/SmoothKernel.cpp)
+set(incs kernel/SmoothKernel.hpp)
+
+PDAL_ADD_PLUGIN(smooth_libname kernel smooth
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PCL_LIBRARIES} ${pclblock_libname})
+
+if (WITH_TESTS)
+    PDAL_ADD_TEST(pcltest
+    FILES test/PCLBlockFilterTest.cpp
+    LINK_WITH ${pclvisualizer_libname} ${pcd_reader_libname}
+        ${pcd_writer_libname} ${pclblock_libname} ${ground_filter_libname}
+        ${pcl_libname} ${ground_kernel_libname} ${smooth_libname}
+    )
+endif()
diff --git a/plugins/pcl/PCLConversions.hpp b/plugins/pcl/PCLConversions.hpp
new file mode 100755
index 0000000..a93381f
--- /dev/null
+++ b/plugins/pcl/PCLConversions.hpp
@@ -0,0 +1,200 @@
+/******************************************************************************
+* Copyright (c) 2012-2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+*
+* Inspired, and partially borrowed from VTK_PCL_Conversions
+* https://github.com/daviddoria/VTK_PCL_Conversions
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/PointView.hpp>
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/for_each_type.h>
+#include <pcl/point_types.h>
+#include <pcl/point_traits.h>
+
+namespace pdal
+{
+namespace pclsupport
+{
+
+template<typename CLOUDFETCH>
+void setValues(PointViewPtr view, Dimension::Id::Enum dim, size_t numPts,
+    CLOUDFETCH fetcher)
+{
+    for (size_t i = 0; i < numPts; ++i)
+        view->setField(dim, i, fetcher(i));
+}
+
+/**
+ * \brief Convert PCD point cloud to PDAL.
+ *
+ * Converts PCD data to PDAL format.
+ */
+template <typename CloudT>
+void PCDtoPDAL(CloudT &cloud, PointViewPtr view, BOX3D const& bounds)
+{
+    typedef typename pcl::traits::fieldList<typename CloudT::PointType>::type
+        FieldList;
+
+    if (pcl::traits::has_xyz<typename CloudT::PointType>::value)
+    {
+        auto getX = [&cloud, &bounds](size_t i)
+            { return cloud.points[i].x + bounds.minx; };
+        auto getY = [&cloud, &bounds](size_t i)
+            { return cloud.points[i].y + bounds.miny; };
+        auto getZ = [&cloud, &bounds](size_t i)
+            { return cloud.points[i].z + bounds.minz; };
+        setValues(view, Dimension::Id::X, cloud.points.size(), getX);
+        setValues(view, Dimension::Id::Y, cloud.points.size(), getY);
+        setValues(view, Dimension::Id::Z, cloud.points.size(), getZ);
+    }
+
+    if (pcl::traits::has_intensity<typename CloudT::PointType>::value)
+    {
+        for (size_t i = 0; i < cloud.points.size(); ++i)
+        {
+            float f;
+            bool hasIntensity = true;
+
+            typename CloudT::PointType p = cloud.points[i];
+            pcl::for_each_type<FieldList>
+                (pcl::CopyIfFieldExists<typename CloudT::PointType, float>
+                    (p, "intensity", hasIntensity, f));
+            view->setField(Dimension::Id::Intensity, i, f);
+        }
+    }
+
+    if (pcl::traits::has_color<typename CloudT::PointType>::value)
+    {
+        for (size_t i = 0; i < cloud.points.size(); ++i)
+        {
+            uint32_t v;
+
+            typename CloudT::PointType p = cloud.points[i];
+            pcl::for_each_type<FieldList>
+               (pcl::CopyIfFieldExists<typename CloudT::PointType, uint32_t>
+                   (p, "rgba", v));
+            view->setField<uint8_t>(Dimension::Id::Red, i, (v & 0x00FF0000) >> 16);
+            view->setField<uint8_t>(Dimension::Id::Green, i, (v & 0x0000FF00) >> 8);
+            view->setField<uint8_t>(Dimension::Id::Blue, i, (v & 0x000000FF));
+        }
+    }
+}
+
+
+template <typename CloudT>
+void PCDtoPDAL(CloudT &cloud, PointViewPtr view)
+{
+    BOX3D buffer_bounds(0,0,0,0,0,0);
+    pdal::pclsupport::PCDtoPDAL(cloud, view, buffer_bounds);
+}
+
+
+/**
+ * \brief Convert PDAL point cloud to PCD.
+ *
+ * Converts PDAL data to PCD format.
+ */
+template <typename CloudT>
+void PDALtoPCD(PointViewPtr view, CloudT &cloud, BOX3D const& bounds)
+{
+    typedef typename pcl::traits::fieldList<typename CloudT::PointType>::type
+        FieldList;
+
+    cloud.width = view->size();
+    cloud.height = 1;  // unorganized point cloud
+    cloud.is_dense = false;
+    cloud.points.resize(cloud.width);
+
+    if (pcl::traits::has_xyz<typename CloudT::PointType>::value)
+    {
+        for (size_t i = 0; i < cloud.points.size(); ++i)
+        {
+            double xd = view->getFieldAs<double>(Dimension::Id::X, i) - bounds.minx;
+            double yd = view->getFieldAs<double>(Dimension::Id::Y, i) - bounds.miny;
+            double zd = view->getFieldAs<double>(Dimension::Id::Z, i) - bounds.minz;
+
+            typename CloudT::PointType p = cloud.points[i];
+            p.x = (float)xd;
+            p.y = (float)yd;
+            p.z = (float)zd;
+            cloud.points[i] = p;
+        }
+    }
+
+    if (pcl::traits::has_intensity<typename CloudT::PointType>::value)
+    {
+        for (size_t i = 0; i < cloud.points.size(); ++i)
+        {
+            typename CloudT::PointType p = cloud.points[i];
+
+            float f = view->getFieldAs<float>(Dimension::Id::Intensity, i);
+            pcl::for_each_type<FieldList>
+                (pcl::SetIfFieldExists<typename CloudT::PointType, float>
+                    (p, "intensity", f));
+            cloud.points[i] = p;
+        }
+    }
+
+    if (pcl::traits::has_color<typename CloudT::PointType>::value)
+    {
+        for (size_t i = 0; i < cloud.points.size(); ++i)
+        {
+            typename CloudT::PointType p = cloud.points[i];
+
+            uint8_t r = view->getFieldAs<uint8_t>(Dimension::Id::Red, i);
+            uint8_t g = view->getFieldAs<uint8_t>(Dimension::Id::Green, i);
+            uint8_t b = view->getFieldAs<uint8_t>(Dimension::Id::Blue, i);
+            pcl::for_each_type<FieldList> (
+                pcl::SetIfFieldExists<typename CloudT::PointType, uint32_t> (
+                    p, "rgba", ((uint8_t)r) << 16 | ((uint8_t)g) << 8 | ((uint8_t)b)
+                )
+            );
+            cloud.points[i] = p;
+        }
+    }
+}
+
+
+template <typename CloudT>
+void PDALtoPCD(PointViewPtr view, CloudT &cloud)
+{
+    BOX3D buffer_bounds(0,0,0,0,0,0);
+    PDALtoPCD(view, cloud, buffer_bounds);
+}
+
+
+}  // namespace pcl
+}  // namespace pdal
diff --git a/plugins/pcl/filters/GroundFilter.cpp b/plugins/pcl/filters/GroundFilter.cpp
new file mode 100644
index 0000000..7072d4f
--- /dev/null
+++ b/plugins/pcl/filters/GroundFilter.cpp
@@ -0,0 +1,195 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GroundFilter.hpp"
+
+#include "PCLConversions.hpp"
+
+#include <pdal/Options.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <pcl/point_types.h>
+#include <pcl/console/print.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/io/pcd_io.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.ground",
+    "Progressive morphological filter",
+    "http://pdal.io/stages/filters.ground.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, GroundFilter, Filter, s_info)
+
+std::string GroundFilter::getName() const { return s_info.name; }
+
+void GroundFilter::processOptions(const Options& options)
+{
+    m_maxWindowSize = options.getValueOrDefault<double>("maxWindowSize", 33);
+    m_slope = options.getValueOrDefault<double>("slope", 1);
+    m_maxDistance = options.getValueOrDefault<double>("maxDistance", 2.5);
+    m_initialDistance = options.getValueOrDefault<double>("initialDistance", 0.15);
+    m_cellSize = options.getValueOrDefault<double>("cellSize", 1);
+    m_classify = options.getValueOrDefault<bool>("classify", true);
+    m_extract = options.getValueOrDefault<bool>("extract", false);
+    m_approximate = options.getValueOrDefault<bool>("approximate", false);
+}
+
+void GroundFilter::addDimensions(PointLayoutPtr layout)
+{
+    layout->registerDim(Dimension::Id::Classification);
+}
+
+PointViewSet GroundFilter::run(PointViewPtr input)
+{
+    bool logOutput = log()->getLevel() > LogLevel::Debug1;
+    if (logOutput)
+        log()->floatPrecision(8);
+    log()->get(LogLevel::Debug2) << "Process GroundFilter...\n";
+
+    // convert PointView to PointXYZ
+    typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+    Cloud::Ptr cloud(new Cloud);
+    BOX3D bounds;
+    input->calculateBounds(bounds);
+    pclsupport::PDALtoPCD(input, *cloud, bounds);
+
+    // PCL should provide console output at similar verbosity level as PDAL
+    int level = log()->getLevel();
+    switch (level)
+    {
+        case 0:
+            pcl::console::setVerbosityLevel(pcl::console::L_ALWAYS);
+            break;
+        case 1:
+            pcl::console::setVerbosityLevel(pcl::console::L_ERROR);
+            break;
+        case 2:
+            pcl::console::setVerbosityLevel(pcl::console::L_WARN);
+            break;
+        case 3:
+            pcl::console::setVerbosityLevel(pcl::console::L_INFO);
+            break;
+        case 4:
+            pcl::console::setVerbosityLevel(pcl::console::L_DEBUG);
+            break;
+        default:
+            pcl::console::setVerbosityLevel(pcl::console::L_VERBOSE);
+            break;
+    }
+
+    // setup the PMF filter
+    pcl::PointIndicesPtr idx(new pcl::PointIndices);
+    if (!m_approximate)
+    {
+
+        pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
+        pmf.setInputCloud(cloud);
+        pmf.setMaxWindowSize(m_maxWindowSize);
+        pmf.setSlope(m_slope);
+        pmf.setMaxDistance(m_maxDistance);
+        pmf.setInitialDistance(m_initialDistance);
+        pmf.setCellSize(m_cellSize);
+
+        // run the PMF filter, grabbing indices of ground returns
+        pmf.extract(idx->indices);
+    } else
+    {
+        pcl::ApproximateProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
+        pmf.setInputCloud(cloud);
+        pmf.setMaxWindowSize(m_maxWindowSize);
+        pmf.setSlope(m_slope);
+        pmf.setMaxDistance(m_maxDistance);
+        pmf.setInitialDistance(m_initialDistance);
+        pmf.setCellSize(m_cellSize);
+
+        // run the PMF filter, grabbing indices of ground returns
+        pmf.extract(idx->indices);
+
+    }
+
+    PointViewSet viewSet;
+    if (!idx->indices.empty() && (m_classify || m_extract))
+    {
+
+        if (m_classify)
+        {
+            log()->get(LogLevel::Debug2) << "Labeled " << idx->indices.size() << " ground returns!\n";
+
+            // set the classification label of ground returns as 2
+            // (corresponding to ASPRS LAS specification)
+            for (const auto& i : idx->indices)
+            { input->setField(Dimension::Id::Classification, i, 2); }
+
+            viewSet.insert(input);
+        }
+
+        if (m_extract)
+        {
+            log()->get(LogLevel::Debug2) << "Extracted " << idx->indices.size() << " ground returns!\n";
+
+            // create new PointView containing only ground returns
+            PointViewPtr output = input->makeNew();
+            for (const auto& i : idx->indices)
+            {
+                output->appendPoint(*input, i);
+            }
+
+            viewSet.erase(input);
+            viewSet.insert(output);
+        }
+    }
+    else
+    {
+        if (idx->indices.empty())
+            log()->get(LogLevel::Debug2) << "Filtered cloud has no ground returns!\n";
+
+        if (!(m_classify || m_extract))
+            log()->get(LogLevel::Debug2) << "Must choose --classify or --extract\n";
+
+        // return the input buffer unchanged
+        viewSet.insert(input);
+    }
+
+    return viewSet;
+}
+
+} // namespace pdal
+
diff --git a/plugins/pcl/filters/GroundFilter.hpp b/plugins/pcl/filters/GroundFilter.hpp
new file mode 100644
index 0000000..448c9f3
--- /dev/null
+++ b/plugins/pcl/filters/GroundFilter.hpp
@@ -0,0 +1,79 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/Stage.hpp>
+
+#include <memory>
+
+namespace pdal
+{
+
+class Options;
+class PointLayout;
+class PointTable;
+class PointView;
+
+class PDAL_DLL GroundFilter : public Filter
+{
+public:
+    GroundFilter() : Filter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    double m_maxWindowSize;
+    double m_slope;
+    double m_maxDistance;
+    double m_initialDistance;
+    double m_cellSize;
+    bool m_classify;
+    bool m_extract;
+    bool m_approximate;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
+    virtual PointViewSet run(PointViewPtr view);
+
+    GroundFilter& operator=(const GroundFilter&); // not implemented
+    GroundFilter(const GroundFilter&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/plugins/pcl/filters/PCLBlock.cpp b/plugins/pcl/filters/PCLBlock.cpp
new file mode 100644
index 0000000..a5b5cb6
--- /dev/null
+++ b/plugins/pcl/filters/PCLBlock.cpp
@@ -0,0 +1,149 @@
+/******************************************************************************
+* Copyright (c) 2013-2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PCLBlock.hpp"
+
+#include "PCLConversions.hpp"
+#include "PCLPipeline.h"
+
+#include <pcl/console/print.h>
+#include <pcl/point_types.h>
+#include <pcl/io/pcd_io.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.pclblock",
+    "PCL Block implementation",
+    "http://pdal.io/stages/filters.pclblock.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PCLBlock, Filter, s_info)
+
+std::string PCLBlock::getName() const { return s_info.name; }
+
+/** \brief This method processes the PointView through the given pipeline. */
+
+void PCLBlock::processOptions(const Options& options)
+{
+    m_filename = options.getValueOrDefault<std::string>("filename", "");
+    m_json = options.getValueOrDefault<std::string>("json", "");
+}
+
+PointViewSet PCLBlock::run(PointViewPtr input)
+{
+    PointViewPtr output = input->makeNew();
+    PointViewSet viewSet;
+    viewSet.insert(output);
+
+    bool logOutput = log()->getLevel() > LogLevel::Debug1;
+    if (logOutput)
+        log()->floatPrecision(8);
+
+    log()->get(LogLevel::Debug2) <<
+        input->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
+        input->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
+        input->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+    log()->get(LogLevel::Debug2) << "Process PCLBlock..." << std::endl;
+
+    BOX3D buffer_bounds;
+    input->calculateBounds(buffer_bounds);
+
+    // convert PointView to PointNormal
+    typedef pcl::PointCloud<pcl::PointXYZ> Cloud;
+    Cloud::Ptr cloud(new Cloud);
+    pclsupport::PDALtoPCD(input, *cloud, buffer_bounds);
+
+    log()->get(LogLevel::Debug2) << cloud->points[0].x << ", " <<
+        cloud->points[0].y << ", " << cloud->points[0].z << std::endl;
+
+    int level = log()->getLevel();
+    switch (level)
+    {
+        case 0:
+            pcl::console::setVerbosityLevel(pcl::console::L_ALWAYS);
+            break;
+        case 1:
+            pcl::console::setVerbosityLevel(pcl::console::L_ERROR);
+            break;
+        case 2:
+            pcl::console::setVerbosityLevel(pcl::console::L_WARN);
+            break;
+        case 3:
+            pcl::console::setVerbosityLevel(pcl::console::L_INFO);
+            break;
+        case 4:
+            pcl::console::setVerbosityLevel(pcl::console::L_DEBUG);
+            break;
+        default:
+            pcl::console::setVerbosityLevel(pcl::console::L_VERBOSE);
+            break;
+    }
+
+    pcl::Pipeline<pcl::PointXYZ> pipeline;
+    pipeline.setInputCloud(cloud);
+    if (!m_filename.empty())
+        pipeline.setFilename(m_filename);
+    else if (!m_json.empty())
+        pipeline.setJSON(m_json);
+    else
+        throw pdal_error("No PCL pipeline specified!");
+    // PDALtoPCD subtracts min values in each XYZ dimension to prevent rounding
+    // errors in conversion to float. These offsets need to be conveyed to the
+    // pipeline to offset any bounds entered as part of a PassThrough filter.
+    pipeline.setOffsets(buffer_bounds.minx, buffer_bounds.miny, buffer_bounds.minz);
+
+    // create PointCloud for results
+    Cloud::Ptr cloud_f(new Cloud);
+    pipeline.filter(*cloud_f);
+
+    if (cloud_f->points.empty())
+    {
+        log()->get(LogLevel::Debug2) << "Filtered cloud has no points!" << std::endl;
+        return viewSet;
+    }
+
+    pclsupport::PCDtoPDAL(*cloud_f, output, buffer_bounds);
+
+    log()->get(LogLevel::Debug2) << cloud->points.size() << " before, " <<
+                                 cloud_f->points.size() << " after" << std::endl;
+    log()->get(LogLevel::Debug2) << output->size() << std::endl;
+    log()->get(LogLevel::Debug2) << output->getFieldAs<double>(Dimension::Id::X, 0) << ", " <<
+                                 output->getFieldAs<double>(Dimension::Id::Y, 0) << ", " <<
+                                 output->getFieldAs<double>(Dimension::Id::Z, 0) << std::endl;
+    return viewSet;
+}
+
+} // namespace pdal
+
diff --git a/plugins/pcl/filters/PCLBlock.hpp b/plugins/pcl/filters/PCLBlock.hpp
new file mode 100644
index 0000000..0255828
--- /dev/null
+++ b/plugins/pcl/filters/PCLBlock.hpp
@@ -0,0 +1,65 @@
+/******************************************************************************
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Filter.hpp>
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL PCLBlock : public Filter
+{
+public:
+    PCLBlock() : Filter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    std::string m_filename;
+    std::string m_json;
+
+    virtual void processOptions(const Options& options);
+    virtual PointViewSet run(PointViewPtr view);
+
+    PCLBlock& operator=(const PCLBlock&); // not implemented
+    PCLBlock(const PCLBlock&); // not implemented
+};
+
+} // namespace pdal
+
diff --git a/plugins/pcl/io/PCLVisualizer.cpp b/plugins/pcl/io/PCLVisualizer.cpp
new file mode 100644
index 0000000..9d85202
--- /dev/null
+++ b/plugins/pcl/io/PCLVisualizer.cpp
@@ -0,0 +1,196 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PCLVisualizer.hpp"
+
+#include <pcl/conversions.h>
+#include <pcl/io/pcd_io.h>
+
+#include <pcl/visualization/pcl_visualizer.h>
+#include <pcl/visualization/impl/pcl_visualizer.hpp>
+#include <pcl/visualization/point_cloud_handlers.h>
+#include <pcl/visualization/impl/point_cloud_handlers.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "PCLConversions.hpp"
+#include "point_types.hpp"
+
+#include <chrono>
+#include <memory>
+#include <thread>
+
+bool
+isValidFieldName(const std::string &field)
+{
+    if (field == "_")
+        return (false);
+
+    return (true);
+}
+
+namespace pcl
+{
+namespace visualization
+{
+template <typename PointT>
+class PointCloudColorHandlerIntensity : public PointCloudColorHandler<PointT>
+{
+    using PointCloudColorHandler<PointT>::capable_;
+    using PointCloudColorHandler<PointT>::cloud_;
+
+    typedef typename PointCloudColorHandler<PointT>::PointCloud::ConstPtr PointCloudConstPtr;
+
+public:
+    typedef std::shared_ptr<PointCloudColorHandlerIntensity<PointT> > Ptr;
+    typedef std::shared_ptr<const PointCloudColorHandlerIntensity<PointT> > ConstPtr;
+
+    PointCloudColorHandlerIntensity(const PointCloudConstPtr& cloud) :
+        PointCloudColorHandler<PointT> (cloud)
+    {
+        capable_ = true;
+    }
+
+    virtual bool
+    getColor(vtkSmartPointer<vtkDataArray> &scalars) const
+    {
+        if (!capable_ || !cloud_)
+            return (false);
+
+        if (!scalars)
+            scalars = vtkSmartPointer<vtkUnsignedCharArray>::New();
+        scalars->SetNumberOfComponents(3);
+
+        vtkIdType nr_points = cloud_->width * cloud_->height;
+        reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->SetNumberOfTuples(nr_points);
+        unsigned char* colors = reinterpret_cast<vtkUnsignedCharArray*>(&(*scalars))->GetPointer(0);
+
+        int int_idx = pcl::getFieldIndex(*cloud_, "intensity");
+
+        if (int_idx != -1)
+        {
+            float int_data;
+            int int_point_offset = cloud_->fields[int_idx].offset;
+            for (vtkIdType cp = 0; cp < nr_points; ++cp, int_point_offset += cloud_->point_step)
+            {
+                int idx = cp * 3;
+                memcpy(&int_data, &cloud_->data[int_point_offset], sizeof(float));
+                colors[idx + 0] = int_data * 255;
+                colors[idx + 1] = int_data * 255;
+                colors[idx + 2] = int_data * 255;
+            }
+        }
+        return (true);
+    }
+
+private:
+    virtual std::string getFieldName() const
+    {
+        return ("intensity");
+    }
+    virtual inline std::string getName() const
+    {
+        return ("PointCloudColorHandlerIntensity");
+    }
+};
+}
+}
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.pclvisualizer",
+    "PCL Visualizer",
+    "http://pdal.io/stages/writers.pclvisualizer.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PclVisualizer, Writer, s_info)
+
+std::string PclVisualizer::getName() const { return s_info.name; }
+
+void PclVisualizer::write(const PointViewPtr view)
+{
+    // Determine XYZ bounds
+    BOX3D buffer_bounds;
+
+    view->calculateBounds(buffer_bounds);
+
+    typedef XYZIRGBA PointType;
+
+    // Convert PointView to a PCL PointCloud
+    pcl::PointCloud<PointType>::Ptr cloud(new pcl::PointCloud<PointType>);
+    pclsupport::PDALtoPCD(view, *cloud, buffer_bounds);
+
+    // Create PCLVisualizer
+    std::shared_ptr<pcl::visualization::PCLVisualizer> p(new pcl::visualization::PCLVisualizer("3D Viewer"));
+
+    // Set background to black
+    p->setBackgroundColor(0, 0, 0);
+
+    pcl::PCLPointCloud2::Ptr cloud_blob(new pcl::PCLPointCloud2);
+    toPCLPointCloud2(*cloud, *cloud_blob);
+
+    typedef pcl::visualization::PointCloudColorHandler<pcl::PCLPointCloud2> ColorHandler;
+    typedef ColorHandler::Ptr ColorHandlerPtr;
+    ColorHandlerPtr color_handler;
+    for (size_t f = 0; f < cloud_blob->fields.size(); ++f)
+    {
+        if (cloud_blob->fields[f].name == "rgb" || cloud_blob->fields[f].name == "rgba")
+        {
+            color_handler.reset(new pcl::visualization::PointCloudColorHandlerRGBField<pcl::PCLPointCloud2> (cloud_blob));
+        }
+        else if (cloud_blob->fields[f].name == "intensity")
+        {
+            color_handler.reset(new pcl::visualization::PointCloudColorHandlerIntensity<pcl::PCLPointCloud2> (cloud_blob));
+        }
+        else
+        {
+            if (!isValidFieldName(cloud_blob->fields[f].name))
+                continue;
+            color_handler.reset(new pcl::visualization::PointCloudColorHandlerGenericField<pcl::PCLPointCloud2> (cloud_blob, cloud_blob->fields[f].name));
+        }
+        p->addPointCloud(cloud_blob, color_handler, cloud->sensor_origin_, cloud->sensor_orientation_);
+    }
+    p->updateColorHandlerIndex("cloud", 2);
+
+    while (!p->wasStopped())
+    {
+        p->spinOnce(100);
+        std::this_thread::sleep_for(std::chrono::microseconds(100000));
+    }
+}
+
+
+} // namespaces
diff --git a/plugins/pcl/io/PCLVisualizer.hpp b/plugins/pcl/io/PCLVisualizer.hpp
new file mode 100644
index 0000000..bcb5949
--- /dev/null
+++ b/plugins/pcl/io/PCLVisualizer.hpp
@@ -0,0 +1,61 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+
+#include <string>
+
+namespace pdal
+{
+
+class PDAL_DLL PclVisualizer : public Writer
+{
+public:
+    PclVisualizer()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+    virtual void write(const PointViewPtr view);
+
+    PclVisualizer& operator=(const PclVisualizer&); // not implemented
+    PclVisualizer(const PclVisualizer&); // not implemented
+};
+
+} // namespaces
diff --git a/plugins/pcl/io/PcdCommon.cpp b/plugins/pcl/io/PcdCommon.cpp
new file mode 100644
index 0000000..3f38c4e
--- /dev/null
+++ b/plugins/pcl/io/PcdCommon.cpp
@@ -0,0 +1,56 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PcdCommon.hpp"
+
+namespace pdal
+{
+
+Dimension::IdList fileDimensions()
+{
+    Dimension::IdList ids;
+
+    using namespace Dimension;
+    ids.push_back(Id::X);
+    ids.push_back(Id::Y);
+    ids.push_back(Id::Z);
+    ids.push_back(Id::Intensity);
+    ids.push_back(Id::Red);
+    ids.push_back(Id::Green);
+    ids.push_back(Id::Blue);
+
+    return ids;
+}
+
+} // namespace pdal
diff --git a/plugins/pcl/io/PcdCommon.hpp b/plugins/pcl/io/PcdCommon.hpp
new file mode 100644
index 0000000..98f3599
--- /dev/null
+++ b/plugins/pcl/io/PcdCommon.hpp
@@ -0,0 +1,44 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Dimension.hpp>
+
+namespace pdal
+{
+
+PDAL_DLL Dimension::IdList fileDimensions();
+
+} // namespace pdal
diff --git a/plugins/pcl/io/PcdReader.cpp b/plugins/pcl/io/PcdReader.cpp
new file mode 100644
index 0000000..5dbcb47
--- /dev/null
+++ b/plugins/pcl/io/PcdReader.cpp
@@ -0,0 +1,85 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PcdReader.hpp"
+#include "point_types.hpp"
+
+#include <boost/algorithm/string.hpp>
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/impl/pcd_io.hpp>
+
+#include <pdal/PointView.hpp>
+#include "PCLConversions.hpp"
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.pcd",
+    "Read data in the Point Cloud Library (PCL) format.",
+    "http://pdal.io/stages/readers.pclvisualizer.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PcdReader, Reader, s_info)
+
+std::string PcdReader::getName() const { return s_info.name; }
+
+void PcdReader::ready(PointTableRef table)
+{
+    pcl::PCLPointCloud2 cloud;
+    pcl::PCDReader r;
+    r.readHeader(m_filename, cloud);
+    m_numPts = cloud.height * cloud.width;
+}
+
+
+void PcdReader::addDimensions(PointLayoutPtr layout)
+{
+    layout->registerDims(getDefaultDimensions());
+}
+
+
+point_count_t PcdReader::read(PointViewPtr view, point_count_t /*count*/)
+{
+    pcl::PointCloud<XYZIRGBA>::Ptr cloud(new pcl::PointCloud<XYZIRGBA>);
+
+    pcl::PCDReader r;
+    r.read<XYZIRGBA>(m_filename, *cloud);
+
+    pclsupport::PCDtoPDAL(*cloud, view);
+
+    return cloud->points.size();
+}
+
+} // namespace pdal
diff --git a/plugins/pcl/io/PcdReader.hpp b/plugins/pcl/io/PcdReader.hpp
new file mode 100644
index 0000000..c824bb9
--- /dev/null
+++ b/plugins/pcl/io/PcdReader.hpp
@@ -0,0 +1,68 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "PcdCommon.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL PcdReader : public pdal::Reader
+{
+public:
+    PcdReader() : Reader() {};
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    static Dimension::IdList getDefaultDimensions()
+    {
+        return fileDimensions();
+    };
+
+private:
+    point_count_t m_numPts;
+
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+};
+
+} // namespace pdal
diff --git a/plugins/pcl/io/PcdWriter.cpp b/plugins/pcl/io/PcdWriter.cpp
new file mode 100644
index 0000000..bc612ed
--- /dev/null
+++ b/plugins/pcl/io/PcdWriter.cpp
@@ -0,0 +1,98 @@
+/******************************************************************************
+* Copyright (c) 2011, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PcdWriter.hpp"
+#include "point_types.hpp"
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/erase.hpp>
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/impl/pcd_io.hpp>
+
+#include "PCLConversions.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/pdal_macros.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.pcd",
+    "Write data in the Point Cloud Library (PCL) format.",
+    "http://pdal.io/stages/writers.pclvisualizer.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PcdWriter, Writer, s_info)
+
+std::string PcdWriter::getName() const { return s_info.name; }
+
+void PcdWriter::processOptions(const Options& ops)
+{
+    m_filename = ops.getValueOrThrow<std::string>("filename");
+    m_compressed = ops.getValueOrDefault("compression", false);
+}
+
+
+Options PcdWriter::getDefaultOptions()
+{
+    Options options;
+
+    options.add("filename", "", "Filename to write PCD file to");
+    options.add("compression", false, "Write binary compressed data?");
+
+    return options;
+}
+
+
+void PcdWriter::write(const PointViewPtr view)
+{
+    pcl::PointCloud<XYZIRGBA>::Ptr cloud(new pcl::PointCloud<XYZIRGBA>);
+    BOX3D buffer_bounds;
+    view->calculateBounds(buffer_bounds);
+    pclsupport::PDALtoPCD(view, *cloud, buffer_bounds);
+
+    pcl::PCDWriter w;
+
+    if (m_compressed)
+        w.writeBinaryCompressed<XYZIRGBA>(m_filename, *cloud);
+    else
+        w.writeASCII<XYZIRGBA>(m_filename, *cloud);
+}
+
+
+} // namespaces
diff --git a/plugins/pcl/io/PcdWriter.hpp b/plugins/pcl/io/PcdWriter.hpp
new file mode 100644
index 0000000..906faf8
--- /dev/null
+++ b/plugins/pcl/io/PcdWriter.hpp
@@ -0,0 +1,70 @@
+/******************************************************************************
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Writer.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <vector>
+#include <string>
+
+namespace pdal
+{
+
+class PDAL_DLL PcdWriter : public Writer
+{
+public:
+    PcdWriter()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    virtual void processOptions(const Options&);
+    virtual void write(const PointViewPtr view);
+
+    std::string m_filename;
+    bool m_compressed;
+
+    PcdWriter& operator=(const PcdWriter&); // not implemented
+    PcdWriter(const PcdWriter&); // not implemented
+};
+
+} // namespaces
diff --git a/plugins/pcl/io/point_types.hpp b/plugins/pcl/io/point_types.hpp
new file mode 100644
index 0000000..f9aeb78
--- /dev/null
+++ b/plugins/pcl/io/point_types.hpp
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <pcl/io/pcd_io.h>
+#include <pcl/io/impl/pcd_io.hpp>
+
+struct XYZIRGBA
+{
+    PCL_ADD_POINT4D;
+    float intensity;
+    uint32_t rgba;
+    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+} EIGEN_ALIGN16;
+
+
+POINT_CLOUD_REGISTER_POINT_STRUCT(XYZIRGBA,
+                                  (float, x, x)
+                                  (float, y, y)
+                                  (float, z, z)
+                                  (float, intensity, intensity)
+                                  (uint32_t, rgba, rgba)
+                                 )
+
diff --git a/plugins/pcl/kernel/GroundKernel.cpp b/plugins/pcl/kernel/GroundKernel.cpp
new file mode 100644
index 0000000..f1b9c34
--- /dev/null
+++ b/plugins/pcl/kernel/GroundKernel.cpp
@@ -0,0 +1,170 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+* Copyright (c) 2014-2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "GroundKernel.hpp"
+
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.ground",
+    "Ground Kernel",
+    "http://pdal.io/kernels/kernels.ground.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, GroundKernel, Kernel, s_info)
+
+std::string GroundKernel::getName() const { return s_info.name; }
+
+GroundKernel::GroundKernel()
+    : Kernel()
+    , m_inputFile("")
+    , m_outputFile("")
+    , m_maxWindowSize(33)
+    , m_slope(1)
+    , m_maxDistance(2.5)
+    , m_initialDistance(0.15)
+    , m_cellSize(1)
+    , m_classify(true)
+    , m_extract(false)
+    , m_approximate(false)
+{}
+
+void GroundKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+    {
+        throw app_usage_error("--input/-i required");
+    }
+
+    if (m_outputFile == "")
+    {
+        throw app_usage_error("--output/-o required");
+    }
+}
+
+void GroundKernel::addSwitches()
+{
+    po::options_description* file_options = new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""), "input file name")
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""), "output file name")
+    ("maxWindowSize", po::value<double>(&m_maxWindowSize)->default_value(33), "max window size")
+    ("slope", po::value<double>(&m_slope)->default_value(1), "slope")
+    ("maxDistance", po::value<double>(&m_maxDistance)->default_value(2.5), "max distance")
+    ("initialDistance", po::value<double>(&m_initialDistance)->default_value(0.15, "0.15"), "initial distance")
+    ("cellSize", po::value<double>(&m_cellSize)->default_value(1), "cell size")
+    ("classify", po::bool_switch(&m_classify), "apply classification labels?")
+    ("extract", po::bool_switch(&m_extract), "extract ground returns?")
+    ("approximate,a", po::bool_switch(&m_approximate), "use approximate algorithm? (much faster)")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+}
+
+int GroundKernel::execute()
+{
+    PointTable table;
+
+    Options readerOptions;
+    readerOptions.add<std::string>("filename", m_inputFile);
+    setCommonOptions(readerOptions);
+
+    Stage& readerStage(Kernel::makeReader(m_inputFile));
+    readerStage.setOptions(readerOptions);
+
+    Options groundOptions;
+    groundOptions.add<double>("maxWindowSize", m_maxWindowSize);
+    groundOptions.add<double>("slope", m_slope);
+    groundOptions.add<double>("maxDistance", m_maxDistance);
+    groundOptions.add<double>("initialDistance", m_initialDistance);
+    groundOptions.add<double>("cellSize", m_cellSize);
+    groundOptions.add<bool>("classify", m_classify);
+    groundOptions.add<bool>("extract", m_extract);
+    groundOptions.add<bool>("approximate", m_approximate);
+    groundOptions.add<bool>("debug", isDebug());
+    groundOptions.add<uint32_t>("verbose", getVerboseLevel());
+
+    StageFactory f;
+    std::unique_ptr<Stage> groundStage(f.createStage("filters.ground"));
+    groundStage->setOptions(groundOptions);
+    groundStage->setInput(readerStage);
+
+    // setup the Writer and write the results
+    Options writerOptions;
+    writerOptions.add<std::string>("filename", m_outputFile);
+    setCommonOptions(writerOptions);
+
+    Stage& writer(Kernel::makeWriter(m_outputFile, *groundStage));
+    writer.setOptions(writerOptions);
+
+    std::vector<std::string> cmd = getProgressShellCommand();
+    UserCallback *callback =
+        cmd.size() ? (UserCallback *)new ShellScriptCallback(cmd) :
+        (UserCallback *)new HeartbeatCallback();
+
+    writer.setUserCallback(callback);
+
+    applyExtraStageOptionsRecursive(&writer);
+    writer.prepare(table);
+
+    // process the data, grabbing the PointViewSet for visualization of the
+    // resulting PointView
+    PointViewSet viewSetOut = writer.execute(table);
+
+    if (isVisualize())
+        visualize(*viewSetOut.begin());
+    //visualize(*viewSetIn.begin(), *viewSetOut.begin());
+
+    return 0;
+}
+
+} // namespace pdal
diff --git a/plugins/pcl/kernel/GroundKernel.hpp b/plugins/pcl/kernel/GroundKernel.hpp
new file mode 100644
index 0000000..29fba7f
--- /dev/null
+++ b/plugins/pcl/kernel/GroundKernel.hpp
@@ -0,0 +1,79 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+* Copyright (c) 2014-2015, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/pdal_export.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include <memory>
+#include <string>
+
+namespace pdal
+{
+
+class Options;
+class Stage;
+
+class PDAL_DLL GroundKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    GroundKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    std::shared_ptr<Stage> makeReader(Options readerOptions);
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+    double m_maxWindowSize;
+    double m_slope;
+    double m_maxDistance;
+    double m_initialDistance;
+    double m_cellSize;
+    bool m_classify;
+    bool m_extract;
+    bool m_approximate;
+};
+
+} // namespace pdal
+
diff --git a/plugins/pcl/kernel/HeightAboveGroundKernel.cpp b/plugins/pcl/kernel/HeightAboveGroundKernel.cpp
new file mode 100644
index 0000000..25e9c8f
--- /dev/null
+++ b/plugins/pcl/kernel/HeightAboveGroundKernel.cpp
@@ -0,0 +1,237 @@
+/******************************************************************************
+* Copyright (c) 2015, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "HeightAboveGroundKernel.hpp"
+
+#include "PCLConversions.hpp"
+
+#include <boost/program_options.hpp>
+
+#include <pcl/ModelCoefficients.h>
+#include <pcl/filters/project_inliers.h>
+#include <pcl/kdtree/kdtree_flann.h>
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/Filter.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/KernelFactory.hpp>
+#include <pdal/KernelSupport.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointBuffer.hpp>
+#include <pdal/PointContext.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/Writer.hpp>
+
+#include <memory>
+#include <string>
+#include <vector>
+
+namespace po = boost::program_options;
+
+CREATE_KERNEL_PLUGIN(height, pdal::HeightAboveGroundKernel)
+
+namespace pdal
+{
+
+void HeightAboveGroundKernel::validateSwitches()
+{
+    if (m_input_file == "")
+        throw app_usage_error("--input/-i required");
+    if (m_ground_file == "" && !m_use_classification)
+        throw app_usage_error("--ground/-g or --use_classification/-c required");
+    if (m_output_file == "")
+        throw app_usage_error("--output/-o required");
+
+    // should probably verify that the output is BPF
+    // should probably also verify that there is a classification dimension if --use_classification == true
+}
+
+void HeightAboveGroundKernel::addSwitches()
+{
+    po::options_description* options = new po::options_description("file options");
+    options->add_options()
+    ("input,i", po::value<std::string>(&m_input_file)->default_value(""), "input file name")
+    ("ground,g", po::value<std::string>(&m_ground_file)->default_value(""), "ground file name")
+    ("output,o", po::value<std::string>(&m_output_file)->default_value(""), "output file name")
+    ("use_classification,c", po::bool_switch(&m_use_classification)->default_value(false), "use existing classification labels?")
+    ;
+
+    addSwitchSet(options);
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("ground", 1);
+    addPositionalSwitch("output", 1);
+}
+
+int HeightAboveGroundKernel::execute()
+{
+    // we require separate contexts for the input and ground files
+    PointContextRef input_ctx;
+    PointContextRef ground_ctx;
+
+    // because we are appending HeightAboveGround to the input buffer, we must
+    // register it's Dimension
+    input_ctx.registerDim(Dimension::Id::HeightAboveGround);
+
+    // StageFactory will be used to create required stages
+    StageFactory f;
+
+    // setup the reader, inferring driver type from the filename
+    std::string reader_driver = f.inferReaderDriver(m_input_file);
+    std::unique_ptr<Reader> input(f.createReader(reader_driver));
+    Options readerOptions;
+    readerOptions.add("filename", m_input_file);
+    input->setOptions(readerOptions);
+
+    // go ahead and execute to get the PointBuffer
+    input->prepare(input_ctx);
+    PointBufferSet pbSetInput = input->execute(input_ctx);
+    PointBufferPtr input_buf = *pbSetInput.begin();
+
+    PointBufferSet pbSetGround;
+    PointBufferPtr ground_buf;
+
+    if (m_use_classification)
+    {
+        // the user has indicated that the classification dimension exists, so
+        // we will find all ground returns
+        Option source("source",
+                      "import numpy as np\n"
+                      "def yow1(ins,outs):\n"
+                      "  cls = ins['Classification']\n"
+                      "  keep_classes = [2]\n"
+                      "  keep = np.equal(cls, keep_classes[0])\n"
+                      "  outs['Mask'] = keep\n"
+                      "  return True\n"
+                     );
+        Option module("module", "MyModule");
+        Option function("function", "yow1");
+        Options opts;
+        opts.add(source);
+        opts.add(module);
+        opts.add(function);
+
+        // and create a PointBuffer of only ground returns
+        std::unique_ptr<Filter> pred(f.createFilter("filters.predicate"));
+        pred->setOptions(opts);
+        pred->setInput(input.get());
+        pred->prepare(ground_ctx);
+        pbSetGround = pred->execute(ground_ctx);
+        ground_buf = *pbSetGround.begin();
+    }
+    else
+    {
+        // the user has provided a file containing only ground returns, setup
+        // the reader, inferring driver type from the filename
+        std::string ground_driver = f.inferReaderDriver(m_ground_file);
+        std::unique_ptr<Reader> ground(f.createReader(ground_driver));
+        Options ro;
+        ro.add("filename", m_ground_file);
+        ground->setOptions(ro);
+
+        // go ahead and execute to get the PointBuffer
+        ground->prepare(ground_ctx);
+        pbSetGround = ground->execute(ground_ctx);
+        ground_buf = *pbSetGround.begin();
+    }
+
+    typedef pcl::PointXYZ PointT;
+    typedef pcl::PointCloud<PointT> Cloud;
+    typedef Cloud::Ptr CloudPtr;
+
+    // convert the input PointBuffer to a PointCloud
+    CloudPtr cloud(new Cloud);
+    BOX3D const& bounds = input_buf->calculateBounds();
+    pclsupport::PDALtoPCD(*input_buf, *cloud, bounds);
+
+    // convert the ground PointBuffer to a PointCloud
+    CloudPtr cloud_g(new Cloud);
+    // here, we offset the ground cloud by the input bounds so that the two are aligned
+    pclsupport::PDALtoPCD(*ground_buf, *cloud_g, bounds);
+
+    // create a set of planar coefficients with X=Y=0,Z=1
+    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
+    coefficients->values.resize(4);
+    coefficients->values[0] = coefficients->values[1] = 0;
+    coefficients->values[2] = 1.0;
+    coefficients->values[3] = 0;
+
+    // create the filtering object and project ground returns into xy plane
+    pcl::ProjectInliers<PointT> proj;
+    proj.setModelType(pcl::SACMODEL_PLANE);
+    proj.setInputCloud(cloud_g);
+    proj.setModelCoefficients(coefficients);
+    CloudPtr cloud_projected(new Cloud);
+    proj.filter(*cloud_projected);
+
+    // setup the KdTree
+    pcl::KdTreeFLANN<PointT> tree;
+    tree.setInputCloud(cloud_projected);
+
+    // loop over all points in the input cloud, finding the nearest neighbor in
+    // the ground returns (XY plane only), and calculating the difference in z
+    int32_t k = 1;
+    for (size_t idx = 0; idx < cloud->points.size(); ++idx)
+    {
+        // Search for nearesrt neighbor of the query point
+        std::vector<int32_t> neighbors(k);
+        std::vector<float> distances(k);
+        PointT temp_pt = cloud->points[idx];
+        temp_pt.z = 0.0f;
+        int num_neighbors = tree.nearestKSearch(temp_pt, k, neighbors, distances);
+
+        double hag = cloud->points[idx].z - cloud_g->points[neighbors[0]].z;
+        input_buf->setField(Dimension::Id::HeightAboveGround, idx, hag);
+    }
+
+    // populate BufferReader with the input PointBuffer, which now has the
+    // HeightAboveGround dimension
+    BufferReader bufferReader;
+    bufferReader.addBuffer(input_buf);
+
+    // we require that the output be BPF for now, to house our non-standard
+    // dimension
+    Options wo;
+    wo.add("filename", m_output_file);
+    std::unique_ptr<Writer> writer(f.createWriter("writers.bpf"));
+    writer->setOptions(wo);
+    writer->setInput(&bufferReader);
+    writer->prepare(input_ctx);
+    writer->execute(input_ctx);
+
+    return 0;
+}
+
+} // namespace pdal
diff --git a/plugins/pcl/kernel/HeightAboveGroundKernel.hpp b/plugins/pcl/kernel/HeightAboveGroundKernel.hpp
new file mode 100644
index 0000000..b56c365
--- /dev/null
+++ b/plugins/pcl/kernel/HeightAboveGroundKernel.hpp
@@ -0,0 +1,66 @@
+/******************************************************************************
+* Copyright (c) 2015, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+
+#include <string>
+
+namespace pdal
+{
+
+class HeightAboveGroundKernel : public Kernel
+{
+public:
+    SET_KERNEL_NAME("height", "Height above ground")
+    SET_KERNEL_LINK("http://pdal.io/kernels/kernels.height.html")
+
+    HeightAboveGroundKernel() : Kernel()
+    {}
+
+    int execute();
+
+private:
+    void validateSwitches();
+    void addSwitches();
+
+    bool m_use_classification;
+
+    std::string m_input_file;
+    std::string m_ground_file;
+    std::string m_output_file;
+};
+
+} // namespace pdal
diff --git a/plugins/pcl/kernel/PCLKernel.cpp b/plugins/pcl/kernel/PCLKernel.cpp
new file mode 100644
index 0000000..e9c60ff
--- /dev/null
+++ b/plugins/pcl/kernel/PCLKernel.cpp
@@ -0,0 +1,170 @@
+/******************************************************************************
+ * Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "PCLKernel.hpp"
+
+#include "PCLBlock.hpp"
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/KernelFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.pcl",
+    "PCL Kernel",
+    "http://pdal.io/kernels/kernels.pcl.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PCLKernel, Kernel, s_info)
+
+std::string PCLKernel::getName() const { return s_info.name; }
+
+PCLKernel::PCLKernel()
+    : Kernel()
+    , m_bCompress(false)
+    , m_bForwardMetadata(false)
+{
+}
+
+void PCLKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+        throw app_usage_error("--input/-i required");
+    if (m_outputFile == "")
+        throw app_usage_error("--output/-o required");
+    if (m_pclFile == "")
+        throw app_usage_error("--pcl/-p required");
+}
+
+
+void PCLKernel::addSwitches()
+{
+    po::options_description* file_options =
+        new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""),
+     "input file name")
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""),
+     "output file name")
+    ("pcl,p", po::value<std::string>(&m_pclFile)->default_value(""),
+     "pcl file name")
+    ("compress,z",
+        po::value<bool>(&m_bCompress)->zero_tokens()->implicit_value(true),
+        "Compress output data (if supported by output format)")
+    ("metadata,m",
+        po::value< bool >(&m_bForwardMetadata)->implicit_value(true),
+        "Forward metadata (VLRs, header entries, etc) from previous stages")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+    addPositionalSwitch("pcl", 1);
+}
+
+
+int PCLKernel::execute()
+{
+    PointTable table;
+
+    Options readerOptions;
+    readerOptions.add<std::string>("filename", m_inputFile);
+    setCommonOptions(readerOptions);
+
+    Stage& readerStage(Kernel::makeReader(m_inputFile));
+    readerStage.setOptions(readerOptions);
+
+    // go ahead and prepare/execute on reader stage only to grab input
+    // PointViewSet, this makes the input PointView available to both the
+    // processing pipeline and the visualizer
+    readerStage.prepare(table);
+    PointViewSet viewSetIn = readerStage.execute(table);
+
+    // the input PointViewSet will be used to populate a BufferReader that is
+    // consumed by the processing pipeline
+    PointViewPtr input_view = *viewSetIn.begin();
+    std::shared_ptr<BufferReader> bufferReader(new BufferReader);
+    bufferReader->addView(input_view);
+
+    Options pclOptions;
+    pclOptions.add<std::string>("filename", m_pclFile);
+    pclOptions.add<bool>("debug", isDebug());
+    pclOptions.add<uint32_t>("verbose", getVerboseLevel());
+
+    std::shared_ptr<Stage> pclStage(new PCLBlock());
+    pclStage->setInput(*bufferReader);
+    pclStage->setOptions(pclOptions);
+
+    // the PCLBlock stage consumes the BufferReader rather than the
+    // readerStage
+
+    Options writerOptions;
+    writerOptions.add<std::string>("filename", m_outputFile);
+    setCommonOptions(writerOptions);
+
+    if (m_bCompress)
+        writerOptions.add<bool>("compression", true);
+    if (m_bForwardMetadata)
+        writerOptions.add("forward_metadata", true);
+
+    std::vector<std::string> cmd = getProgressShellCommand();
+    UserCallback *callback =
+        cmd.size() ? (UserCallback *)new ShellScriptCallback(cmd) :
+        (UserCallback *)new HeartbeatCallback();
+
+    Stage& writer(Kernel::makeWriter(m_outputFile, *pclStage));
+
+    // Some options are inferred by makeWriter based on filename
+    // (compression, driver type, etc).
+    writer.setOptions(writerOptions+writer.getOptions());
+
+    writer.setUserCallback(callback);
+    applyExtraStageOptionsRecursive(&writer);
+    writer.prepare(table);
+
+    // process the data, grabbing the PointViewSet for visualization of the
+    // resulting PointView
+    PointViewSet viewSetOut = writer.execute(table);
+
+    if (isVisualize())
+        visualize(*viewSetOut.begin());
+    //visualize(*viewSetIn.begin(), *viewSetOut.begin());
+
+    return 0;
+}
+
+} // namespace pdal
diff --git a/plugins/pcl/kernel/PCLKernel.hpp b/plugins/pcl/kernel/PCLKernel.hpp
new file mode 100644
index 0000000..bb13f09
--- /dev/null
+++ b/plugins/pcl/kernel/PCLKernel.hpp
@@ -0,0 +1,65 @@
+/******************************************************************************
+ * Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL PCLKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    PCLKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    std::unique_ptr<PipelineManager> m_manager;
+    std::shared_ptr<Stage> makeReader(Options readerOptions);
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+    std::string m_pclFile;
+    bool m_bCompress;
+    bool m_bForwardMetadata;
+};
+
+} // pdal
diff --git a/plugins/pcl/kernel/SmoothKernel.cpp b/plugins/pcl/kernel/SmoothKernel.cpp
new file mode 100644
index 0000000..5b7b3de
--- /dev/null
+++ b/plugins/pcl/kernel/SmoothKernel.cpp
@@ -0,0 +1,157 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SmoothKernel.hpp"
+
+#include "PCLBlock.hpp"
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/KernelFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.smooth",
+    "Smooth Kernel",
+    "http://pdal.io/kernels/kernels.smooth.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, SmoothKernel, Kernel, s_info)
+
+std::string SmoothKernel::getName() const { return s_info.name; }
+
+void SmoothKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+    {
+        throw app_usage_error("--input/-i required");
+    }
+
+    if (m_outputFile == "")
+    {
+        throw app_usage_error("--output/-o required");
+    }
+
+    return;
+}
+
+
+void SmoothKernel::addSwitches()
+{
+    po::options_description* file_options = new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""), "input file name")
+    ("output,o", po::value<std::string>(&m_outputFile)->default_value(""), "output file name")
+//        ("compress,z", po::value<bool>(&m_bCompress)->zero_tokens()->implicit_value(true), "Compress output data (if supported by output format)")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("input", 1);
+    addPositionalSwitch("output", 1);
+}
+
+
+int SmoothKernel::execute()
+{
+    PointTable table;
+
+    Options readerOptions;
+    readerOptions.add("filename", m_inputFile);
+    setCommonOptions(readerOptions);
+
+    Stage& readerStage(Kernel::makeReader(m_inputFile));
+    readerStage.setOptions(readerOptions);
+
+    // go ahead and prepare/execute on reader stage only to grab input
+    // PointViewSet, this makes the input PointView available to both the
+    // processing pipeline and the visualizer
+    readerStage.prepare(table);
+    PointViewSet viewSetIn = readerStage.execute(table);
+
+    // the input PointViewSet will be used to populate a BufferReader that is
+    // consumed by the processing pipeline
+    PointViewPtr input_view = *viewSetIn.begin();
+    std::shared_ptr<BufferReader> bufferReader(new BufferReader);
+    bufferReader->setOptions(readerOptions);
+    bufferReader->addView(input_view);
+
+    Options smoothOptions;
+    std::ostringstream ss;
+    ss << "{";
+    ss << "  \"pipeline\": {";
+    ss << "    \"filters\": [{";
+    ss << "      \"name\": \"MovingLeastSquares\"";
+    ss << "      }]";
+    ss << "    }";
+    ss << "}";
+    std::string json = ss.str();
+    smoothOptions.add("json", json);
+    smoothOptions.add("debug", isDebug());
+    smoothOptions.add("verbose", getVerboseLevel());
+
+    std::shared_ptr<Stage> smoothStage(new PCLBlock());
+    smoothStage->setOptions(smoothOptions);
+    smoothStage->setInput(*bufferReader);
+
+    Options writerOptions;
+    writerOptions.add("filename", m_outputFile);
+    setCommonOptions(writerOptions);
+
+    Stage& writer(Kernel::makeWriter(m_outputFile, *smoothStage));
+    writer.setOptions(writerOptions);
+
+    std::vector<std::string> cmd = getProgressShellCommand();
+    UserCallback *callback =
+        cmd.size() ? (UserCallback *)new ShellScriptCallback(cmd) :
+        (UserCallback *)new HeartbeatCallback();
+
+    writer.setUserCallback(callback);
+    applyExtraStageOptionsRecursive(&writer);
+    writer.prepare(table);
+
+    // process the data, grabbing the PointViewSet for visualization of the
+    // resulting PointView
+    PointViewSet viewSetOut = writer.execute(table);
+
+    if (isVisualize())
+        visualize(*viewSetOut.begin());
+    //visualize(*viewSetIn.begin(), *viewSetOut.begin());
+
+    return 0;
+}
+
+} // pdal
diff --git a/plugins/pcl/kernel/SmoothKernel.hpp b/plugins/pcl/kernel/SmoothKernel.hpp
new file mode 100644
index 0000000..7aa7313
--- /dev/null
+++ b/plugins/pcl/kernel/SmoothKernel.hpp
@@ -0,0 +1,64 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/pdal_export.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL SmoothKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    SmoothKernel() {};
+    void addSwitches();
+    void validateSwitches();
+
+    std::shared_ptr<Stage> makeReader(Options readerOptions);
+
+    std::string m_inputFile;
+    std::string m_outputFile;
+};
+
+} // pdal
diff --git a/plugins/pcl/kernel/ViewKernel.cpp b/plugins/pcl/kernel/ViewKernel.cpp
new file mode 100644
index 0000000..2d38a06
--- /dev/null
+++ b/plugins/pcl/kernel/ViewKernel.cpp
@@ -0,0 +1,192 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "ViewKernel.hpp"
+
+#include <pdal/KernelFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "kernels.view",
+    "View Kernel",
+    "http://pdal.io/kernels/kernels.view.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, ViewKernel, Kernel, s_info)
+
+std::string ViewKernel::getName() const { return s_info.name; }
+
+// Support for parsing point numbers.  Points can be specified singly or as
+// dash-separated ranges.  i.e. 6-7,8,19-20
+namespace {
+
+using namespace std;
+
+vector<string> tokenize(const string s, char c)
+{
+    string::const_iterator begin;
+    string::const_iterator end;
+    vector<string> strings;
+    begin = s.begin();
+    while (true)
+    {
+        end = find(begin, s.end(), c);
+        strings.push_back(string(begin, end));
+        if (end == s.end())
+            break;
+        begin = end + 1;
+    }
+    return strings;
+}
+
+uint32_t parseInt(const string& s)
+{
+    try
+    {
+        return boost::lexical_cast<uint32_t>(s);
+    }
+    catch (boost::bad_lexical_cast)
+    {
+        throw app_runtime_error(string("Invalid integer: ") + s);
+    }
+}
+
+
+void addSingle(const string& s, vector<uint32_t>& points)
+{
+    points.push_back(parseInt(s));
+}
+
+
+void addRange(const string& begin, const string& end,
+    vector<uint32_t>& points)
+{
+    uint32_t low = parseInt(begin);
+    uint32_t high = parseInt(end);
+    if (low > high)
+        throw app_runtime_error(string("Range invalid: ") + begin + "-" + end);
+    while (low <= high)
+        points.push_back(low++);
+}
+
+
+vector<uint32_t> getListOfPoints(std::string p)
+{
+    vector<uint32_t> output;
+
+    //Remove whitespace from string with awful remove/erase idiom.
+    p.erase(remove_if(p.begin(), p.end(), ::isspace), p.end());
+
+    vector<string> ranges = tokenize(p, ',');
+    for (string s : ranges)
+    {
+        vector<string> limits = tokenize(s, '-');
+        if (limits.size() == 1)
+            addSingle(limits[0], output);
+        else if (limits.size() == 2)
+            addRange(limits[0], limits[1], output);
+        else
+            throw app_runtime_error(string("Invalid point range: ") + s);
+    }
+    return output;
+}
+
+} //namespace
+
+ViewKernel::ViewKernel()
+    : Kernel()
+    , m_inputFile("")
+{}
+
+
+void ViewKernel::validateSwitches()
+{
+    if (m_inputFile == "")
+    {
+        throw app_usage_error("--input/-i required");
+    }
+}
+
+
+void ViewKernel::addSwitches()
+{
+    po::options_description* file_options = new po::options_description("file options");
+
+    file_options->add_options()
+    ("input,i", po::value<std::string>(&m_inputFile)->default_value(""), "input file name")
+    ("point,p", po::value<std::string >(&m_pointIndexes), "point to dump")
+    ;
+
+    addSwitchSet(file_options);
+
+    addPositionalSwitch("input", 1);
+}
+
+int ViewKernel::execute()
+{
+    Options readerOptions;
+    readerOptions.add<std::string>("filename", m_inputFile);
+    setCommonOptions(readerOptions);
+
+    Stage& readerStage(Kernel::makeReader(m_inputFile));
+    readerStage.setOptions(readerOptions);
+
+    PointTable table;
+    readerStage.prepare(table);
+    PointViewSet viewSetIn = readerStage.execute(table);
+
+    PointViewPtr buf = *viewSetIn.begin();
+    if (m_pointIndexes.size())
+    {
+        PointViewPtr outbuf = buf->makeNew();
+
+        std::vector<uint32_t> points = getListOfPoints(m_pointIndexes);
+        for (size_t i = 0; i < points.size(); ++i)
+        {
+            PointId id = (PointId)points[i];
+            if (id < buf->size())
+                outbuf->appendPoint(*buf, id);
+        }
+
+        visualize(outbuf);
+    }
+    else
+    {
+        visualize(buf);
+    }
+    return 0;
+}
+
+} // pdal
diff --git a/plugins/pcl/kernel/ViewKernel.hpp b/plugins/pcl/kernel/ViewKernel.hpp
new file mode 100644
index 0000000..0334a63
--- /dev/null
+++ b/plugins/pcl/kernel/ViewKernel.hpp
@@ -0,0 +1,64 @@
+/******************************************************************************
+* Copyright (c) 2013, Howard Butler (hobu.inc at gmail.com)
+* Copyright (c) 2014, Brad Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Kernel.hpp>
+#include <pdal/pdal_export.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL ViewKernel : public Kernel
+{
+public:
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+    int execute();
+
+private:
+    ViewKernel();
+    void addSwitches();
+    void validateSwitches();
+
+    std::shared_ptr<Stage> makeReader(Options readerOptions);
+
+    std::string m_inputFile;
+    std::string m_pointIndexes;
+};
+
+} // pdal
diff --git a/plugins/pcl/pipeline/PCLPipeline.cpp b/plugins/pcl/pipeline/PCLPipeline.cpp
new file mode 100644
index 0000000..539ff81
--- /dev/null
+++ b/plugins/pcl/pipeline/PCLPipeline.cpp
@@ -0,0 +1,52 @@
+/*
+ * Software License Agreement (BSD License)
+ *
+ *  Point Cloud Library (PCL) - www.pointclouds.org
+ *  Copyright (c) 2009-2012, Willow Garage, Inc.
+ *  Copyright (c) 2012-, Open Perception, Inc.
+ *  Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of the copyright holder(s) nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *  POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#include "PCLPipeline.hpp"
+
+#ifndef PCL_NO_PRECOMPILE
+#include <pcl/impl/instantiate.hpp>
+#include <pcl/point_types.h>
+
+// Instantiations of specific point types
+PCL_INSTANTIATE(Pipeline, (pcl::PointXYZ))
+//PCL_INSTANTIATE(Pipeline, (pcl::PointNormal)(pcl::PointXYZRGBNormal)(pcl::PointXYZINormal))
+
+#endif    // PCL_NO_PRECOMPILE
diff --git a/plugins/pcl/pipeline/PCLPipeline.h b/plugins/pcl/pipeline/PCLPipeline.h
new file mode 100644
index 0000000..c98e6ef
--- /dev/null
+++ b/plugins/pcl/pipeline/PCLPipeline.h
@@ -0,0 +1,248 @@
+/*
+ * Software License Agreement (BSD License)
+ *
+ *  Point Cloud Library (PCL) - www.pointclouds.org
+ *  Copyright (c) 2009-2012, Willow Garage, Inc.
+ *  Copyright (c) 2012-, Open Perception, Inc.
+ *  Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of the copyright holder(s) nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *  POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#pragma once
+
+#include <memory>
+
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+
+#include <pcl/filters/filter_indices.h>
+
+
+// Pipeline needs to be in the `pcl` namespace in order for the instantiation
+// macros to work
+namespace pcl
+{
+
+
+/** \brief @b Pipeline composes a linear series of PCL operations to be applied to the source point cloud.
+* \details TBD
+* <br><br>
+* Usage example:
+* \code
+* pcl::Pipeline<PointType> pipeline (true); // Initializing with true will allow us to extract the removed indices
+* pipeline.setInputCloud (cloud_in);
+* pipeline.setFilename (filename);
+* pipeline.filter (*cloud_out);
+* \endcode
+* \author Bradley J Chambers
+* \ingroup pipeline
+*/
+template <typename PointT>
+class Pipeline : public Filter<PointT>
+{
+protected:
+    typedef typename Filter<PointT>::PointCloud PointCloud;
+    typedef typename PointCloud::Ptr PointCloudPtr;
+    typedef typename PointCloud::ConstPtr PointCloudConstPtr;
+    typedef typename pcl::traits::fieldList<PointT>::type FieldList;
+
+public:
+
+    typedef boost::shared_ptr< Pipeline<PointT> > Ptr;
+    typedef boost::shared_ptr< const Pipeline<PointT> > ConstPtr;
+
+
+    /** \brief Constructor.
+      * \param[in] extract_removed_indices Set to true if you want to be able to extract the indices of points being removed (default = false).
+      */
+    Pipeline()
+    {
+        filter_name_ = "Pipeline";
+        filename_set_ = false;
+        json_set_ = false;
+    }
+
+    /** \brief Provide the name of the JSON file describing the PCL pipeline.
+      * \param[in] filename the name of the JSON file describing the PCL pipeline
+      */
+    inline void
+    setFilename(const std::string &filename)
+    {
+        filename_set_ = true;
+        boost::property_tree::read_json(filename.c_str(), pt_);
+        json_set_ = true;
+    }
+
+    inline void
+    setJSON(const std::string &json)
+    {
+        if (filename_set_)
+            PCL_WARN("Filename and JSON string have both been specified. Using only the string!\n");
+        std::stringstream ss(json);
+        boost::property_tree::read_json(ss, pt_);
+        json_set_ = true;
+    }
+
+    /** \brief Set the offsets to the data in the x, y, and z dimension.
+      * \param[in] x the x offset
+      * \param[in] y the y offset
+      * \param[in] z the z offset
+      */
+    inline void
+    setOffsets(const double x, const double y, const double z)
+    {
+        x_offset_ = x;
+        y_offset_ = y;
+        z_offset_ = z;
+    }
+
+    void dumper(PointCloud &output);
+
+protected:
+    using PCLBase<PointT>::input_;
+    using PCLBase<PointT>::indices_;
+    using Filter<PointT>::filter_name_;
+    using Filter<PointT>::getClassName;
+
+    /** \brief Filtered results are stored in a separate point cloud.
+      * \param[out] output The resultant point cloud.
+      */
+    void
+    applyFilter(PointCloud &output);
+
+    /** \brief Apply passthrough filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyPassThrough(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply statistical outlier removal filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyStatisticalOutlierRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply radius outlier removal filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyRadiusOutlierRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply voxel grid filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyVoxelGrid(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply grid minimum filter to input cloud, using parameters specified in property tree.
+      *  \param[in] cloud The input point cloud.
+      *  \param[out] output The resultant point cloud.
+      *  \param[in] value_type The parameters.
+      */
+    void
+    applyGridMinimum(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply approximate progressive morphological filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyApproximateProgressiveMorphologicalFilter(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply progressive morphological filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyProgressiveMorphologicalFilter(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply normal estimation to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    //void
+    //applyNormalEstimation(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply conditional removal filter to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    //void
+    //applyConditionalRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+    /** \brief Apply moving least squares to input cloud, using parameters specified in property tree.
+     *  \param[in] cloud The input point cloud.
+     *  \param[out] output The resultant point cloud.
+     *  \param[in] value_type The parameters.
+     */
+    void
+    applyMovingLeastSquares(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt);
+
+
+    /** \brief Generate tile indices for input point cloud at the given resolution.
+     *  \param[in] cloud The input point cloud.
+     *  \param[in] resolution The tile size (resolution).
+     *  \param[out] tile_indices Vector of tile indices for each point in the cloud.
+     */
+    void
+    generateTileIndices(PointCloudConstPtr cloud, const float &resolution, std::vector<PointIndices> &tile_indices);
+
+private:
+    bool filename_set_, json_set_;
+
+    boost::property_tree::ptree pt_;
+
+    /** \brief The offsets to the data in the x, y, and z dimension. */
+    double x_offset_, y_offset_, z_offset_;
+};
+
+
+} // namespace pcl
+
+
+#ifdef PCL_NO_PRECOMPILE
+#include <pcl/pipeline/impl/pipeline.hpp>
+#endif
diff --git a/plugins/pcl/pipeline/PCLPipeline.hpp b/plugins/pcl/pipeline/PCLPipeline.hpp
new file mode 100644
index 0000000..b6dd968
--- /dev/null
+++ b/plugins/pcl/pipeline/PCLPipeline.hpp
@@ -0,0 +1,696 @@
+/*
+ * Software License Agreement (BSD License)
+ *
+ *  Point Cloud Library (PCL) - www.pointclouds.org
+ *  Copyright (c) 2009-2012, Willow Garage, Inc.
+ *  Copyright (c) 2012-, Open Perception, Inc.
+ *  Copyright (c) 2014, RadiantBlue Technologies, Inc.
+ *
+ *  All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions
+ *  are met:
+ *
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the following
+ *     disclaimer in the documentation and/or other materials provided
+ *     with the distribution.
+ *   * Neither the name of the copyright holder(s) nor the names of its
+ *     contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ *  POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id$
+ *
+ */
+
+#pragma once
+
+#include <exception>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/foreach.hpp>
+
+#include <pcl/for_each_type.h>
+#include <pcl/point_traits.h>
+#include <pcl/common/common.h>
+#include <pcl/features/normal_3d.h>
+#include <pcl/filters/conditional_removal.h>
+#include <pcl/filters/extract_indices.h>
+#include <pcl/filters/passthrough.h>
+#include <pcl/filters/radius_outlier_removal.h>
+#include <pcl/filters/statistical_outlier_removal.h>
+#include <pcl/filters/voxel_grid.h>
+#include <pcl/filters/grid_minimum.h>
+#include <pcl/search/search.h>
+#include <pcl/segmentation/approximate_progressive_morphological_filter.h>
+#include <pcl/segmentation/progressive_morphological_filter.h>
+#include <pcl/surface/mls.h>
+
+#include "PCLPipeline.h"
+
+
+namespace pdal
+{
+namespace pclsupport
+{
+
+
+struct tile_point_idx
+{
+    unsigned int tile_idx;
+    unsigned int point_idx;
+
+    tile_point_idx(unsigned int tile_idx_, unsigned int point_idx_) : tile_idx(tile_idx_), point_idx(point_idx_) {}
+    bool operator < (const tile_point_idx &p) const
+    {
+        return (tile_idx < p.tile_idx);
+    }
+};
+
+
+} // namespace pclsupport
+} // namespace pdal
+
+
+template <typename PointT> void
+pcl::Pipeline<PointT>::dumper(PointCloud &cloud)
+{
+    for (size_t i = 0; i < cloud.points.size(); ++i)
+    {
+        if (pcl::traits::has_xyz<PointT>::value)
+        {
+            std::cout << cloud.points[i].x << " "
+                      << cloud.points[i].y << " "
+                      << cloud.points[i].z << " ";
+        }
+        //if (pcl::traits::has_normal<PointT>::value)
+        //{
+        //    std::cout << cloud.points[i].normal[0] << " "
+        //              << cloud.points[i].normal[1] << " "
+        //              << cloud.points[i].normal[2] << " ";
+        //}
+        std::cout << std::endl;
+    }
+}
+
+
+template <typename PointT> void
+pcl::Pipeline<PointT>::generateTileIndices(PointCloudConstPtr cloud, const float& resolution, std::vector<PointIndices> &tile_indices)
+{
+    Eigen::Vector4f leaf_size;
+    Eigen::Array4f inverse_leaf_size;
+    Eigen::Vector4i min_b, max_b, div_b, divb_mul;
+
+    leaf_size[0] = resolution;
+    leaf_size[1] = resolution;
+    leaf_size[2] = resolution;
+    leaf_size[3] = resolution;
+
+    inverse_leaf_size = Eigen::Array4f::Ones() / leaf_size.array();
+
+    PCL_DEBUG("experimental, tiling with leaf size %f\n", resolution);
+
+    Eigen::Vector4f min_p, max_p;
+    // Get the minimum and maximum dimensions
+    pcl::getMinMax3D<PointT> (*cloud, *indices_, min_p, max_p);
+
+    // Check that the leaf size is not too small, given the size of the data
+    int64_t dx = static_cast<int64_t>((max_p[0] - min_p[0]) * inverse_leaf_size[0])+1;
+    int64_t dy = static_cast<int64_t>((max_p[1] - min_p[1]) * inverse_leaf_size[1])+1;
+
+    if ((dx*dy) > static_cast<int64_t>(std::numeric_limits<int32_t>::max()))
+    {
+        PCL_WARN("[pcl::%s::applyFilter] Leaf size is too small for the input dataset. Integer indices would overflow.", getClassName().c_str());
+        // is this really relevant anymore? don't think so, but maybe something like it
+        //output = *input_;
+        return;
+    }
+
+    // Compute the minimum and maximum bounding box values
+    min_b[0] = static_cast<int>(floor(min_p[0] * inverse_leaf_size[0]));
+    max_b[0] = static_cast<int>(floor(max_p[0] * inverse_leaf_size[0]));
+    min_b[1] = static_cast<int>(floor(min_p[1] * inverse_leaf_size[1]));
+    max_b[1] = static_cast<int>(floor(max_p[1] * inverse_leaf_size[1]));
+
+    // Compute the number of divisions needed along all axis
+    div_b = max_b - min_b + Eigen::Vector4i::Ones();
+    div_b[3] = 0;
+
+    PCL_DEBUG("%d and %d divisions in x and y\n", div_b[0], div_b[1]);
+
+    // Set up the division multiplier
+    divb_mul = Eigen::Vector4i(1, div_b[0], div_b[0] * div_b[1], 0);
+
+    std::vector<pdal::pclsupport::tile_point_idx> index_vector;
+    index_vector.reserve(indices_->size());
+
+    // First pass: go over all points and insert them into the index_vector vector
+    // with calculated idx. Points with the same idx value will contribute to the
+    // same point of resulting CloudPoint
+    for (std::vector<int>::const_iterator it = indices_->begin(); it != indices_->end(); ++it)
+    {
+        if (!input_->is_dense)
+            // Check if the point is invalid
+            if (!pcl_isfinite(input_->points[*it].x) ||
+                    !pcl_isfinite(input_->points[*it].y) ||
+                    !pcl_isfinite(input_->points[*it].z))
+                continue;
+
+        int ijk0 = static_cast<int>(floor(input_->points[*it].x * inverse_leaf_size[0]) - static_cast<float>(min_b[0]));
+        int ijk1 = static_cast<int>(floor(input_->points[*it].y * inverse_leaf_size[1]) - static_cast<float>(min_b[1]));
+
+        // Compute the centroid leaf index
+        int idx = ijk0 * divb_mul[0] + ijk1 * divb_mul[1];
+        index_vector.push_back(pdal::pclsupport::tile_point_idx(static_cast<unsigned int>(idx), *it));
+    }
+
+    // Second pass: sort the index_vector vector using value representing target cell as index
+    // in effect all points belonging to the same output cell will be next to each other
+    std::sort(index_vector.begin(), index_vector.end(), std::less<pdal::pclsupport::tile_point_idx> ());
+
+    // Third pass: count output cells
+    // we need to skip all the same, adjacenent idx values
+    unsigned int index = 0;
+    // first_and_last_indices_vector[i] represents the index in index_vector of the first point in
+    // index_vector belonging to the voxel which corresponds to the i-th output point,
+    // and of the first point not belonging to.
+    std::vector<std::pair<unsigned int, unsigned int> > first_and_last_indices_vector;
+    // Worst case size
+    first_and_last_indices_vector.reserve(index_vector.size());
+    while (index < index_vector.size())
+    {
+        unsigned int i = index + 1;
+        while (i < index_vector.size() && index_vector[i].tile_idx == index_vector[index].tile_idx)
+            ++i;
+        first_and_last_indices_vector.push_back(std::pair<unsigned int, unsigned int> (index, i));
+        index = i;
+    }
+
+    tile_indices.resize(first_and_last_indices_vector.size());
+
+    for (unsigned int cp = 0; cp < first_and_last_indices_vector.size(); ++cp)
+    {
+        // calculate centroid - sum values from all input points, that have the same idx value in index_vector array
+        unsigned int first_index = first_and_last_indices_vector[cp].first;
+        unsigned int last_index = first_and_last_indices_vector[cp].second;
+
+        tile_indices[cp].indices.resize(last_index - first_index);
+
+        PCL_DEBUG("tile %d will have %d points\n", cp, last_index - first_index);
+
+        index = 0;
+
+        for (unsigned int i = first_index + 1; i < last_index; ++i)
+        {
+            tile_indices[cp].indices[index] = index_vector[i].point_idx;
+            ++index;
+        }
+    }
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyPassThrough(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    // initial setup
+    pcl::PassThrough<PointT> pass;
+    pass.setInputCloud(cloud);
+
+    // parse params
+    std::string field = vt.second.get<std::string> ("setFilterFieldName");
+    float m1 = vt.second.get<float> ("setFilterLimits.min", -std::numeric_limits<float>::max());
+    float m2 = vt.second.get<float> ("setFilterLimits.max", std::numeric_limits<float>::max());
+
+    // summarize settings
+    PCL_DEBUG("      Field name: %s\n", field.c_str());
+    PCL_DEBUG("      Limits: %f, %f\n", m1, m2);
+
+    if (field.compare("x") == 0)
+    {
+        if (m1 != -std::numeric_limits<float>::max()) m1 -= x_offset_;
+        if (m2 != std::numeric_limits<float>::max()) m2 -= x_offset_;
+    }
+
+    if (field.compare("y") == 0)
+    {
+        if (m1 != -std::numeric_limits<float>::max()) m1 -= y_offset_;
+        if (m2 != std::numeric_limits<float>::max()) m2 -= y_offset_;
+    }
+
+    if (field.compare("z") == 0)
+    {
+        if (m1 != -std::numeric_limits<float>::max()) m1 -= z_offset_;
+        if (m2 != std::numeric_limits<float>::max()) m2 -= z_offset_;
+    }
+
+    // set params and apply filter
+    pass.setFilterFieldName(field);
+    pass.setFilterLimits(m1, m2);
+    pass.filter(output);
+
+    PCL_DEBUG("%d filtered to %d in passthrough\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyStatisticalOutlierRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    // initial setup
+    pcl::StatisticalOutlierRemoval<PointT> sor;
+    sor.setInputCloud(cloud);
+
+    // parse params
+    int nr_k = vt.second.get<int> ("setMeanK", 2);
+    double stddev_mult = vt.second.get<double> ("setStddevMulThresh", 0.0);
+
+    // summarize settings
+    PCL_DEBUG("      %d neighbors and %f multiplier\n", nr_k, stddev_mult);
+
+    // set params and apply filter
+    sor.setMeanK(nr_k);
+    sor.setStddevMulThresh(stddev_mult);
+    sor.filter(output);
+
+    PCL_DEBUG("      %d points filtered to %d following outlier removal\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyRadiusOutlierRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    // initial setup
+    pcl::RadiusOutlierRemoval<PointT> ror;
+    ror.setInputCloud(cloud);
+
+    // parse params
+    int min_neighbors = vt.second.get<int> ("setMinNeighborsInRadius", 2);
+    double radius = vt.second.get<double> ("setRadiusSearch", 1.0);
+
+    // summarize settings
+    PCL_DEBUG("      %d neighbors and %f radius\n", min_neighbors, radius);
+
+    // set params and apply filter
+    ror.setMinNeighborsInRadius(min_neighbors);
+    ror.setRadiusSearch(radius);
+    ror.filter(output);
+
+    PCL_DEBUG("      %d points filtered to %d following outlier removal\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyVoxelGrid(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    // initial setup
+    pcl::VoxelGrid<PointT> vg;
+    vg.setInputCloud(cloud);
+
+    // parse params
+    float x = vt.second.get<float> ("setLeafSize.x", 1.0);
+    float y = vt.second.get<float> ("setLeafSize.y", 1.0);
+    float z = vt.second.get<float> ("setLeafSize.z", 1.0);
+
+    // summarize settings
+    PCL_DEBUG("      leaf size: %f, %f, %f\n", x, y, z);
+
+    // set params and apply filter
+    vg.setLeafSize(x, y, z);
+    vg.filter(output);
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyGridMinimum(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    // parse params
+    float r = vt.second.get<float> ("setResolution", 1.0);
+
+    // summarize settings
+    PCL_DEBUG("      resolution: %f\n", r);
+
+    // initial setup
+    pcl::GridMinimum<PointT> vgm(r);
+    vgm.setInputCloud(cloud);
+
+    // apply filter
+    vgm.filter(output);
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyApproximateProgressiveMorphologicalFilter(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    pcl::ApproximateProgressiveMorphologicalFilter<PointT> pmf;
+
+    // parse params
+    int w = vt.second.get<int> ("setMaxWindowSize", 33);
+    float s = vt.second.get<float> ("setSlope", 1.0);
+    float md = vt.second.get<float> ("setMaxDistance", 2.5);
+    float id = vt.second.get<float> ("setInitialDistance", 0.15);
+    float c = vt.second.get<float> ("setCellSize", 1.0);
+    float b = vt.second.get<float> ("setBase", 2.0);
+    bool e = vt.second.get<bool> ("setExponential", true);
+    bool n = vt.second.get<bool> ("setNegative", false);
+
+    // summarize settings
+    PCL_DEBUG("      max window size: %d\n", w);
+    PCL_DEBUG("      slope: %f\n", s);
+    PCL_DEBUG("      max distance: %f\n", md);
+    PCL_DEBUG("      initial distance: %f\n", id);
+    PCL_DEBUG("      cell size: %f\n", c);
+    PCL_DEBUG("      base: %f\n", b);
+    PCL_DEBUG("      exponential: %s\n", e?"true":"false");
+    PCL_DEBUG("      negative: %s\n", n?"true":"false");
+
+    pmf.setInputCloud(cloud);
+    pmf.setMaxWindowSize(w);
+    pmf.setSlope(s);
+    pmf.setMaxDistance(md);
+    pmf.setInitialDistance(id);
+    pmf.setCellSize(c);
+    pmf.setBase(b);
+    pmf.setExponential(e);
+
+    PointIndicesPtr idx(new PointIndices);
+    pmf.extract(idx->indices);
+
+    pcl::ExtractIndices<PointT> extract;
+    extract.setInputCloud(cloud);
+    extract.setIndices(idx);
+    extract.setNegative(n);
+    extract.filter(output);
+
+    PCL_DEBUG("      %d points filtered to %d following approximate progressive morphological filter\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyProgressiveMorphologicalFilter(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    pcl::ProgressiveMorphologicalFilter<PointT> pmf;
+
+    // parse params
+    int w = vt.second.get<int> ("setMaxWindowSize", 33);
+    float s = vt.second.get<float> ("setSlope", 1.0);
+    float md = vt.second.get<float> ("setMaxDistance", 2.5);
+    float id = vt.second.get<float> ("setInitialDistance", 0.15);
+    float c = vt.second.get<float> ("setCellSize", 1.0);
+    float b = vt.second.get<float> ("setBase", 2.0);
+    bool e = vt.second.get<bool> ("setExponential", true);
+    bool n = vt.second.get<bool> ("setNegative", false);
+
+    // summarize settings
+    PCL_DEBUG("      max window size: %d\n", w);
+    PCL_DEBUG("      slope: %f\n", s);
+    PCL_DEBUG("      max distance: %f\n", md);
+    PCL_DEBUG("      initial distance: %f\n", id);
+    PCL_DEBUG("      cell size: %f\n", c);
+    PCL_DEBUG("      base: %f\n", b);
+    PCL_DEBUG("      exponential: %s\n", e?"true":"false");
+    PCL_DEBUG("      negative: %s\n", n?"true":"false");
+
+    pmf.setInputCloud(cloud);
+    pmf.setMaxWindowSize(w);
+    pmf.setSlope(s);
+    pmf.setMaxDistance(md);
+    pmf.setInitialDistance(id);
+    pmf.setCellSize(c);
+    pmf.setBase(b);
+    pmf.setExponential(e);
+
+    PointIndicesPtr idx(new PointIndices);
+    pmf.extract(idx->indices);
+
+    pcl::ExtractIndices<PointT> extract;
+    extract.setInputCloud(cloud);
+    extract.setIndices(idx);
+    extract.setNegative(n);
+    extract.filter(output);
+
+    PCL_DEBUG("      %d points filtered to %d following progressive morphological filter\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+/*
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyNormalEstimation(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    if (pcl::traits::has_normal<PointT>::value && pcl::traits::has_curvature<PointT>::value)
+    {
+        // parse params
+        float r = vt.second.get<float> ("setRadiusSearch", 1.0);
+        float k = vt.second.get<float> ("setKSearch", 0);
+
+        PCL_DEBUG("      radius: %f\n", r);
+
+        pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
+
+        typename pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT> ());
+        pcl::NormalEstimation<PointT, pcl::Normal> ne;
+        ne.setInputCloud(cloud);
+        //ne.setSearchSurface (cloud); // or maybe not
+        ne.setViewPoint(0.0f, 0.0f, std::numeric_limits<float>::max());
+        ne.setSearchMethod(tree);
+        ne.setRadiusSearch(r);
+        ne.setKSearch(k);
+        ne.compute(*normals);
+
+        pcl::concatenateFields(*cloud, *normals, output);
+    }
+    else
+    {
+        PCL_ERROR("Requested point type does not support NormalEstimation...\n");
+    }
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyConditionalRemoval(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+    typename pcl::ConditionAnd<PointT>::Ptr cond(new pcl::ConditionAnd<PointT> ());
+
+    if (pcl::traits::has_normal<PointT>::value)
+    {
+        // parse params
+        float m1 = vt.second.get<float> ("normalZ.min", 0);
+        float m2 = vt.second.get<float> ("normalZ.max", std::numeric_limits<float>::max());
+
+        // summarize settings
+        PCL_DEBUG("      Limits: %f, %f\n", m1, m2);
+
+        typedef typename pcl::traits::fieldList<PointT>::type FieldList;
+        float min_normal_z = std::numeric_limits<float>::max();
+        float max_normal_z = -std::numeric_limits<float>::max();
+        for (size_t ii = 0; ii < cloud->points.size(); ++ii)
+        {
+            bool has_normal_z = false;
+            float normal_z_val = 0.0f;
+            pcl::for_each_type<FieldList> (pcl::CopyIfFieldExists<PointT, float> (cloud->points[ii], "normal_z", has_normal_z, normal_z_val));
+            if (has_normal_z)
+            {
+                if (normal_z_val < min_normal_z) min_normal_z = normal_z_val;
+                if (normal_z_val > max_normal_z) max_normal_z = normal_z_val;
+            }
+        }
+        PCL_DEBUG("min/max normal_z [%f, %f]\n", min_normal_z, max_normal_z);
+
+        cond->addComparison(typename pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT> ("normal_z", pcl::ComparisonOps::GT, m1)));
+        cond->addComparison(typename pcl::FieldComparison<PointT>::ConstPtr(new pcl::FieldComparison<PointT> ("normal_z", pcl::ComparisonOps::LT, m2)));
+    }
+    else
+    {
+        PCL_WARN("Requested point type does not support ConditionalRemoval by normals...\n");
+    }
+
+    pcl::ConditionalRemoval<PointT> condrem;
+    condrem.setCondition(cond);
+    condrem.setInputCloud(cloud);
+    condrem.filter(output);
+
+    return;
+}
+*/
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyMovingLeastSquares(PointCloudConstPtr cloud, PointCloud &output, boost::property_tree::ptree::value_type &vt)
+{
+        // parse params
+//        float r = vt.second.get<float> ("setRadiusSearch", 1.0);
+//        float k = vt.second.get<float> ("setKSearch", 0);
+
+//        PCL_DEBUG("      radius: %f\n", r);
+
+//        typename pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT> ());
+        pcl::MovingLeastSquares<PointT, PointT> mls;
+        mls.setInputCloud(cloud);
+        //mls.setSearchMethod(tree);
+        mls.setSearchRadius(1);
+        mls.setPolynomialFit(true);
+        mls.setPolynomialOrder(2);
+        mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointT, PointT>::SAMPLE_LOCAL_PLANE);
+        //mls.setDilationIterations(1);
+        //mls.setDilationVoxelSize(0.5);
+        //mls.setPointDensity(20);
+        mls.setUpsamplingRadius(2);
+        mls.setUpsamplingStepSize(1);
+        PCL_DEBUG("%f radius \n", mls.getUpsamplingRadius());
+        PCL_DEBUG("%f step\n", mls.getUpsamplingStepSize());
+        mls.process(output);
+
+    PCL_DEBUG("%d filtered to %d in moving least squares\n", cloud->points.size(), output.points.size());
+
+    return;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template <typename PointT> void
+pcl::Pipeline<PointT>::applyFilter(PointCloud &output)
+{
+    // Has the input dataset been set already?
+    if (!input_)
+    {
+        PCL_WARN("[pcl::%s::applyFilter] No input dataset given!\n", getClassName().c_str());
+        output.width = output.height = 0;
+        output.points.clear();
+        return;
+    }
+
+    // Do we have a JSON string to process?
+    if (!json_set_)
+    {
+        PCL_WARN("[pcl::%s::applyFilter] No input JSON given!\n", getClassName().c_str());
+        output = *input_;
+        return;
+    }
+
+    output.is_dense = true;
+
+    try
+    {
+        PCL_DEBUG("\n");
+        PCL_DEBUG("--------------------------------------------------------------------------------\n");
+        PCL_DEBUG("NAME:   %s (%s)\n", pt_.get<std::string> ("pipeline.name","").c_str(), pt_.get<std::string> ("pipeline.version","").c_str());
+        PCL_DEBUG("HELP:   %s\n", pt_.get<std::string> ("pipeline.help","").c_str());
+        PCL_DEBUG("AUTHOR: %s\n", pt_.get<std::string> ("pipeline.author","").c_str());
+        PCL_DEBUG("--------------------------------------------------------------------------------\n");
+
+        // generate tile indices, can use vector of PointIndices (itself a vector of indices belonging to each tile)
+        std::vector<PointIndices> tile_indices;
+        PointIndices foo; // okay, this is totally ugly. i just want to make sure we have a single tile of all indices if no tile_size is specified.
+        foo.indices = *indices_;
+        tile_indices.push_back(foo);
+        float ts = pt_.get<float> ("pipeline.tile_size", 0.0f);
+        if (ts > 0.0f)
+            generateTileIndices(input_, ts, tile_indices);
+
+        // loop over each tile (each PointIndices)
+        #pragma omp parallel for shared(output) num_threads(4)
+        for (size_t tile = 0; tile < tile_indices.size(); ++tile)
+        {
+            typename pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
+            typename pcl::PointCloud<PointT>::Ptr cloud_f(new pcl::PointCloud<PointT>);
+
+            // move the copyPointCloud at line 84 here, and only copy the indices belonging to the current tile (and somehow marry that with the *indices_)
+            pcl::copyPointCloud<PointT> (*input_, tile_indices[tile].indices, *cloud);
+
+            PCL_DEBUG("process tile %d through the pipeline\n", tile);
+
+            int step = 1;
+
+            BOOST_FOREACH(boost::property_tree::ptree::value_type &vt, pt_.get_child("pipeline.filters"))
+            {
+                std::string name = vt.second.get<std::string> ("name", "");
+                std::string help = vt.second.get<std::string> ("help", "");
+
+                PCL_DEBUG("\n");
+                PCL_DEBUG("   Step %d) %s\n", step++, name.c_str());
+                PCL_DEBUG("      %s\n", help.c_str());
+
+                if (boost::iequals(name, "PassThrough"))
+                    applyPassThrough(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "StatisticalOutlierRemoval"))
+                    applyStatisticalOutlierRemoval(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "RadiusOutlierRemoval"))
+                    applyRadiusOutlierRemoval(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "VoxelGrid"))
+                    applyVoxelGrid(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "GridMinimum"))
+                    applyGridMinimum(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "ApproximateProgressiveMorphologicalFilter"))
+                    applyApproximateProgressiveMorphologicalFilter(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "ProgressiveMorphologicalFilter"))
+                    applyProgressiveMorphologicalFilter(cloud, *cloud_f, vt);
+                //else if (boost::iequals(name, "NormalEstimation"))
+                //    applyNormalEstimation(cloud, *cloud_f, vt);
+                //else if (boost::iequals(name, "ConditionalRemoval"))
+                //    applyConditionalRemoval(cloud, *cloud_f, vt);
+                else if (boost::iequals(name, "MovingLeastSquares"))
+                    applyMovingLeastSquares(cloud, *cloud_f, vt);
+                else
+                    PCL_WARN("Requested filter `%s` not implemented! Skipping...\n", name.c_str());
+
+                cloud.swap(cloud_f);
+
+                if (cloud->points.size() == 0)
+                {
+                    PCL_WARN("No points in filtered cloud. Skipping remaining filters...\n");
+                    break;
+                }
+            }
+
+            // after processing each tile, we need to merge them back together into output
+            #pragma omp critical
+            output += *cloud;
+
+            PCL_DEBUG("tile %d filtered to %d points, adding to output, which now has %d points\n", tile, cloud->points.size(), output.points.size());
+        }
+
+        PCL_DEBUG("\n");
+    }
+    catch (std::exception const& e)
+    {
+        PCL_WARN("[pcl::%s::applyFilterIndices] Error parsing JSON and creating pipeline! %s\n", getClassName().c_str(), e.what());
+    }
+
+    // Resize the output arrays
+    output.width = static_cast<uint32_t>(output.points.size());
+}
+
+#define PCL_INSTANTIATE_Pipeline(T) template class PCL_EXPORTS pcl::Pipeline<T>;
diff --git a/plugins/pcl/test/PCLBlockFilterTest.cpp b/plugins/pcl/test/PCLBlockFilterTest.cpp
new file mode 100644
index 0000000..edb1ac5
--- /dev/null
+++ b/plugins/pcl/test/PCLBlockFilterTest.cpp
@@ -0,0 +1,244 @@
+/******************************************************************************
+* Copyright (c) 2013, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PluginManager.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "Support.hpp"
+
+#undef RUN_SLOW_TESTS
+
+using namespace pdal;
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_example_passthrough_xml)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> filter(f.createStage("filters.pclblock"));
+    EXPECT_TRUE(filter.get());
+
+    PipelineManager pipeline;
+    PipelineReader pipelineReader(pipeline);
+    pipelineReader.readPipeline(
+        Support::datapath("filters/pcl/passthrough.xml"));
+    pipeline.execute();
+
+    PointViewSet viewSet = pipeline.views();
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 81u);
+}
+
+
+static void test_filter(const std::string& jsonFile,
+                        size_t expectedPointCount,
+                        bool useThin=false)
+{
+    StageFactory f;
+    Options options;
+
+    const std::string& autzenThick = "autzen/autzen-point-format-3.las";
+    const std::string& autzenThin = "autzen/autzen-thin.las";
+    const std::string& autzen = useThin ? autzenThin : autzenThick;
+
+    Option filename("filename", Support::datapath(autzen));
+    Option debug("debug", true, "");
+    Option verbose("verbose", 9, "");
+
+    options.add(filename);
+    options.add(debug);
+    options.add(verbose);
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.las"));
+    EXPECT_TRUE(reader.get());
+    reader->setOptions(options);
+
+    Option fname("filename", Support::datapath(jsonFile));
+    Options filter_options;
+    filter_options.add(fname);
+
+    std::shared_ptr<Stage> pcl_block(f.createStage("filters.pclblock"));
+    EXPECT_TRUE(pcl_block.get());
+    pcl_block->setOptions(filter_options);
+    pcl_block->setInput(*reader);
+
+    PointTable table;
+    pcl_block->prepare(table);
+    PointViewSet viewSet = pcl_block->execute(table);
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), expectedPointCount);
+}
+
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_example_PassThrough_1)
+{
+    test_filter("filters/pcl/example_PassThrough_1.json", 81);
+}
+
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_example_PassThrough_2)
+{
+    test_filter("filters/pcl/example_PassThrough_2.json", 50);
+}
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_example_PMF_1)
+{
+    test_filter("filters/pcl/example_PMF_1.json", 93);
+}
+
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_example_PMF_2)
+{
+    test_filter("filters/pcl/example_PMF_2.json", 94);
+}
+
+//
+// For the filter tests, we attempt to verify that each parameter "works" (as
+// defined by affecting at least one point, using a setting other than the
+// default).
+//
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_APMF)
+{
+    // BUG: tests still to be developed (seems to either hang or crash inside
+    // Eigen)
+
+    //test_filter("filters/pcl/filter_APMF_1.json", 106, false);
+}
+
+/*
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_ConditionalRemoval)
+{
+    // NormalEstimation: KSearch 0, RadiusSearch 50
+    // ConditionalRemoval: (0.0, 0.087156)
+    test_filter("filters/pcl/filter_ConditionalRemoval_1.json", 158, true);
+
+    // NormalEstimation: KSearch 0, RadiusSearch 50
+    // ConditionalRemoval: (0.01, 0.10)
+    test_filter("filters/pcl/filter_ConditionalRemoval_2.json", 160, true);
+}
+*/
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_GridMinimum)
+{
+    test_filter("filters/pcl/filter_GridMinimum.json", 19);
+}
+
+/*
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_NormalEstimation)
+{
+    // NormalEstimation: KSearch default (0), RadiusSearch 50
+    test_filter("filters/pcl/filter_NormalEstimation_1.json", 158, true);
+
+    // NormalEstimation: KSearch default (0), RadiusSearch 51
+    test_filter("filters/pcl/filter_NormalEstimation_2.json", 162, true);
+
+    // BUG: need to test KSearch values
+}
+*/
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_PassThrough)
+{
+    // test FilterLimits for Z
+    test_filter("filters/pcl/filter_PassThrough_1.json", 81);
+
+    // test FilterLimits for X
+    test_filter("filters/pcl/filter_PassThrough_2.json", 33);
+}
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_PMF)
+{
+    // explicitly with all defaults
+    // (with the default autzen file, this isn't a meaningful test: it will just
+    // verify the filter is minimally functioning)
+    test_filter("filters/pcl/filter_PMF_1.json", 106, false);
+
+#if RUN_SLOW_TESTS
+    // explicitly with all defaults
+    test_filter("filters/pcl/filter_PMF_1.json", 9223, true);
+
+    // with CellSize=3
+    test_filter("filters/pcl/filter_PMF_2.json", 8298, true);
+
+    // with WindowSize=50
+    test_filter("filters/pcl/filter_PMF_3.json", 7970, true);
+
+    // with Slope=0.25
+    test_filter("filters/pcl/filter_PMF_4.json", 9206, true);
+
+    // with MaxDistance=5
+    test_filter("filters/pcl/filter_PMF_5.json", 9373, true);
+
+    // with InitialDistance=0.25
+    test_filter("filters/pcl/filter_PMF_6.json", 9229, true);
+
+    // with Base=3
+    test_filter("filters/pcl/filter_PMF_7.json", 8298, true);
+
+    // with Exponential=false
+    test_filter("filters/pcl/filter_PMF_8.json", 9138, true);
+
+    // with Negative=true
+    test_filter("filters/pcl/filter_PMF_9.json", 1430, true);
+#endif
+}
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_RadiusOutlierRemoval)
+{
+    // test MinNeighbors=1 and RadiusSearch=200
+    test_filter("filters/pcl/filter_RadiusOutlierRemoval_1.json", 60);
+
+    // test MinNeighbors=2 and RadiusSearch=100
+    test_filter("filters/pcl/filter_RadiusOutlierRemoval_2.json", 3);
+}
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_StatisticalOutlierRemoval)
+{
+    // test StdDev=2, MeanK=1.5
+    test_filter("filters/pcl/filter_StatisticalOutlierRemoval_1.json", 96);
+
+    // test StdDev=5, MeanK=0(default)
+    test_filter("filters/pcl/filter_StatisticalOutlierRemoval_2.json", 63);
+}
+
+TEST(PCLBlockFilterTest, PCLBlockFilterTest_filter_VoxelGrid)
+{
+    // test LeafSize
+    test_filter("filters/pcl/filter_VoxelGrid.json", 81);
+}
diff --git a/plugins/pgpointcloud/CMakeLists.txt b/plugins/pgpointcloud/CMakeLists.txt
new file mode 100644
index 0000000..d42d1fa
--- /dev/null
+++ b/plugins/pgpointcloud/CMakeLists.txt
@@ -0,0 +1,63 @@
+#
+# PgPointCloud plugin CMake configuration
+#
+
+include(${PDAL_CMAKE_DIR}/postgres.cmake)
+
+#
+# PgPointCloud Reader
+#
+set(srcs io/PgReader.cpp)
+set(incs
+    io/PgCommon.hpp
+    io/PgReader.hpp
+)
+
+PDAL_ADD_PLUGIN(reader_libname reader pgpointcloud
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${POSTGRESQL_LIBRARIES})
+
+#
+# PgPointCloud Writer
+#
+set(srcs io/PgWriter.cpp)
+set(incs
+    io/PgCommon.hpp
+    io/PgWriter.hpp
+)
+
+PDAL_ADD_PLUGIN(writer_libname writer pgpointcloud
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${POSTGRESQL_LIBRARIES})
+
+#
+# PgPointCloud tests
+#
+if (BUILD_PGPOINTCLOUD_TESTS)
+	set(PGPOINTCLOUD_TEST_DB_USER $ENV{PGUSER} CACHE STRING
+            "Postgres test database user, must be able to create databases")
+	set(PGPOINTCLOUD_TEST_DB_HOST $ENV{PGHOST} CACHE STRING
+            "Postgres test database host")
+	set(PGPOINTCLOUD_TEST_DB_PORT $ENV{PGPORT} CACHE STRING
+            "Postgres test database port")
+	set(PGPOINTCLOUD_TEST_DB_NAME template1 CACHE STRING
+            "Postgres master database name, must exist")
+	set(PGPOINTCLOUD_TEST_DB_TEMPNAME pdal_test_tmp CACHE STRING
+            "Postgres test database temp database name")
+
+	configure_file(
+        test/Pgtest-Support.hpp.in
+        ${CMAKE_CURRENT_BINARY_DIR}/Pgtest-Support.hpp
+    )
+
+    set(srcs
+        test/PgpointcloudWriterTest.cpp
+        ${CMAKE_CURRENT_BINARY_DIR}/Pgtest-Support.hpp
+    )
+
+    include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+	PDAL_ADD_TEST(pgpointcloudtest
+        FILES "${srcs}"
+        LINK_WITH ${reader_libname} ${writer_libname})
+endif()
diff --git a/plugins/pgpointcloud/io/PgCommon.hpp b/plugins/pgpointcloud/io/PgCommon.hpp
new file mode 100644
index 0000000..f70592f
--- /dev/null
+++ b/plugins/pgpointcloud/io/PgCommon.hpp
@@ -0,0 +1,159 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+* Copyright (c) 2013, Paul Ramsey, pramsey at cleverelephant.ca
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <boost/algorithm/string.hpp>
+
+#include "libpq-fe.h"
+
+#include <pdal/Options.hpp>
+#include <pdal/Compression.hpp>
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+inline pdal::CompressionType::Enum getCompressionType(
+    std::string const& compression_type)
+{
+    if (boost::iequals(compression_type, "dimensional"))
+        return CompressionType::Dimensional;
+    else if (boost::iequals(compression_type, "ght"))
+        return CompressionType::Ght;
+    else if (boost::iequals(compression_type, "laszperf"))
+        return CompressionType::Lazperf;
+    return CompressionType::None;
+}
+
+inline PGconn* pg_connect(std::string const& connection)
+{
+    PGconn* conn;
+    if ( ! connection.size() )
+        throw pdal_error("unable to connect to database, no connection "
+            "string was given!");
+
+    /* Validate the connection string and get verbose error (?) */
+#ifdef PQconninfoParse
+    char *errstr;
+    PQconninfoOption *connOptions =
+        PQconninfoParse(connection.c_str(), &errstr);
+    if ( ! connOptions )
+    {
+        throw pdal_error(errstr);
+    }
+#endif
+
+    /* connect to database */
+    conn = PQconnectdb(connection.c_str());
+    if ( PQstatus(conn) != CONNECTION_OK )
+    {
+        throw pdal_error(PQerrorMessage(conn));
+    }
+
+    return conn;
+}
+
+inline void pg_execute(PGconn* session, std::string const& sql)
+{
+    PGresult *result = PQexec(session, sql.c_str());
+    if ( (!result) || (PQresultStatus(result) != PGRES_COMMAND_OK) )
+    {
+        std::string errmsg = std::string(PQerrorMessage(session));
+        throw pdal_error(errmsg);
+    }
+    PQclear(result);
+}
+
+inline void pg_begin(PGconn* session)
+{
+    std::string sql = "BEGIN";
+    pg_execute(session, sql);
+}
+
+inline void pg_commit(PGconn* session)
+{
+    std::string sql = "COMMIT";
+    pg_execute(session, sql);
+}
+
+inline char* pg_query_once(PGconn* session, std::string const& sql)
+{
+    PGresult *result = PQexec(session, sql.c_str());
+
+    if ( (!result) ||
+         PQresultStatus(result) != PGRES_TUPLES_OK ||
+         PQntuples(result) == 0 )
+    {
+        PQclear(result);
+        return NULL;
+    }
+
+    char *str = strdup(PQgetvalue(result, 0, 0));
+    PQclear(result);
+    return str;
+}
+
+inline PGresult* pg_query_result(PGconn* session, std::string const& sql)
+{
+    std::string errmsg;
+    PGresult *result = PQexec(session, sql.c_str());
+    if ( ! result )
+    {
+        errmsg = std::string(PQerrorMessage(session));
+        throw pdal_error(errmsg);
+    }
+
+    if ( PQresultStatus(result) != PGRES_TUPLES_OK )
+    {
+        errmsg = std::string(PQresultErrorMessage(result));
+        PQclear(result);
+        throw pdal_error(errmsg);
+    }
+
+    return result;
+}
+
+inline std::string pg_quote_identifier(std::string const& name)
+{
+    return std::string("\"") + Utils::replaceAll(name, "\"", "\"\"") + "\"";
+}
+
+inline std::string pg_quote_literal(std::string const& lit)
+{
+    return std::string("'") + Utils::replaceAll(lit, "'", "'") + "'";
+}
+
+} // pdal
diff --git a/plugins/pgpointcloud/io/PgReader.cpp b/plugins/pgpointcloud/io/PgReader.cpp
new file mode 100644
index 0000000..2b55ae4
--- /dev/null
+++ b/plugins/pgpointcloud/io/PgReader.cpp
@@ -0,0 +1,385 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+* Copyright (c) 2013, Paul Ramsey, pramsey at cleverelephant.ca
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "PgReader.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/XMLSchema.hpp>
+
+#include <iostream>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.pgpointcloud",
+    "Read data from pgpointcloud format. \"query\" option needs to be a \n" \
+        "SQL statment selecting the data.",
+    "http://pdal.io/stages/readers.pgpointcloud.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PgReader, Reader, s_info)
+
+std::string PgReader::getName() const { return s_info.name; }
+
+PgReader::PgReader() : m_session(NULL), m_pcid(0), m_cached_point_count(0),
+    m_cached_max_points(0)
+{}
+
+
+PgReader::~PgReader()
+{
+    //ABELL - Do bad things happen if we don't do this?  Already in done().
+    if (m_session)
+        PQfinish(m_session);
+}
+
+
+Options PgReader::getDefaultOptions()
+{
+    Options ops;
+
+    ops.add("connection", "", "Connection string to connect to database");
+    ops.add("table", "", "Table to read out of");
+    ops.add("schema", "", "Schema to read out of");
+    ops.add("column", "", "Column to read out of");
+    ops.add("where", "", "SQL where clause to filter query");
+    ops.add("spatialreference", "",
+        "override the source data spatialreference");
+
+    return ops;
+}
+
+
+void PgReader::processOptions(const Options& options)
+{
+    // If we don't know the table name, we're SOL
+    m_table_name = options.getValueOrThrow<std::string>("table");
+
+    // Connection string needs to exist and actually work
+    m_connection = options.getValueOrThrow<std::string>("connection");
+
+    // Schema and column name can be defaulted safely
+    m_column_name = options.getValueOrDefault<std::string>("column", "pa");
+    m_schema_name = options.getValueOrDefault<std::string>("schema", "");
+
+    // Read other preferences
+    m_where = options.getValueOrDefault<std::string>("where", "");
+
+    // Spatial reference.
+    setSpatialReference(options.getValueOrDefault<SpatialReference>(
+        "spatialreference", SpatialReference()));
+}
+
+
+point_count_t PgReader::getNumPoints() const
+{
+    if (m_cached_point_count)
+        return m_cached_point_count;
+
+    std::ostringstream oss;
+    oss << "SELECT Sum(PC_NumPoints(" << pg_quote_identifier(m_column_name) << ")) AS numpoints, ";
+    oss << "Max(PC_NumPoints(" << pg_quote_identifier(m_column_name) << ")) AS maxpoints FROM ";
+    if (m_schema_name.size())
+        oss << pg_quote_identifier(m_schema_name) << ".";
+    oss << pg_quote_identifier(m_table_name);
+    if (m_where.size())
+        oss << " WHERE " << m_where;
+
+    PGresult *result = pg_query_result(m_session, oss.str());
+
+    if (PQresultStatus(result) != PGRES_TUPLES_OK)
+    {
+        throw pdal_error("unable to get point count");
+    }
+
+    m_cached_point_count = atoi(PQgetvalue(result, 0, 0));
+    m_cached_max_points = atoi(PQgetvalue(result, 0, 1));
+    PQclear(result);
+
+    return m_cached_point_count;
+}
+
+
+std::string PgReader::getDataQuery() const
+{
+    std::ostringstream oss;
+    oss << "SELECT text(PC_Uncompress(" << pg_quote_identifier(m_column_name) <<
+        ")) AS pa, ";
+    oss << "PC_NumPoints(" << pg_quote_identifier(m_column_name) <<
+        ") AS npoints FROM ";
+    if (!m_schema_name.empty())
+        oss << pg_quote_identifier(m_schema_name) << ".";
+    oss << pg_quote_identifier(m_table_name);
+    if (!m_where.empty())
+        oss << " WHERE " << m_where;
+
+    log()->get(LogLevel::Debug) << "Constructed data query " <<
+        oss.str() << std::endl;
+    return oss.str();
+}
+
+
+point_count_t PgReader::getMaxPoints() const
+{
+    if (m_cached_point_count == 0)
+        getNumPoints();  // Fills m_cached_max_points.
+    return m_cached_max_points;
+}
+
+
+uint32_t PgReader::fetchPcid() const
+{
+    if (m_pcid)
+        return m_pcid;
+
+    log()->get(LogLevel::Debug) << "Fetching pcid ..." << std::endl;
+
+    std::ostringstream oss;
+    oss << "SELECT PC_Typmod_Pcid(a.atttypmod) AS pcid ";
+    oss << "FROM pg_class c, pg_attribute a";
+    if (!m_schema_name.empty())
+    {
+      oss << ", pg_namespace n";
+    }
+    oss << " WHERE c.relname = " << pg_quote_literal(m_table_name);
+    oss << " AND a.attname = " << pg_quote_literal(m_column_name);
+    if (!m_schema_name.empty())
+    {
+        oss << " AND c.relnamespace = n.oid AND n.nspname = " <<
+            pg_quote_literal(m_schema_name);
+    }
+
+    char *pcid_str = pg_query_once(m_session, oss.str());
+
+    uint32_t pcid = 0;
+    if (pcid_str)
+    {
+       pcid = atoi(pcid_str);
+       free(pcid_str);
+    }
+
+    if (!pcid) // Are pcid == 0 valid?
+    {
+        std::ostringstream oss;
+        oss << "Unable to fetch pcid with column '"
+            << m_column_name <<"' and  table ";
+        if (!m_schema_name.empty())
+          oss << "'" << m_schema_name << "'.";
+        oss << "'" << m_table_name << "'";
+        throw pdal_error(oss.str());
+    }
+
+    log()->get(LogLevel::Debug) << "     got pcid = " << pcid << std::endl;
+    m_pcid = pcid;
+    return pcid;
+}
+
+
+void PgReader::addDimensions(PointLayoutPtr layout)
+{
+    log()->get(LogLevel::Debug) << "Fetching schema object" << std::endl;
+
+    uint32_t pcid = fetchPcid();
+
+    std::ostringstream oss;
+    oss << "SELECT schema FROM pointcloud_formats WHERE pcid = " << pcid;
+
+    char *xmlStr = pg_query_once(m_session, oss.str());
+    if (!xmlStr)
+        throw pdal_error("Unable to fetch schema from `pointcloud_formats`");
+
+    loadSchema(layout, xmlStr);
+    free(xmlStr);
+}
+
+
+pdal::SpatialReference PgReader::fetchSpatialReference() const
+{
+    // Fetch the WKT for the SRID to set the coordinate system of this stage
+    log()->get(LogLevel::Debug) << "Fetching SRID ..." << std::endl;
+
+    uint32_t pcid = fetchPcid();
+
+    std::ostringstream oss;
+    oss << "SELECT srid FROM pointcloud_formats WHERE pcid = " << pcid;
+
+    char *srid_str = pg_query_once(m_session, oss.str());
+    if (! srid_str)
+        throw pdal_error("Unable to fetch srid for this table and column");
+
+    int32_t srid = atoi(srid_str);
+    log()->get(LogLevel::Debug) << "     got SRID = " << srid << std::endl;
+
+    oss.str("");
+    oss << "EPSG:" << srid;
+
+    if (srid >= 0)
+        return pdal::SpatialReference(oss.str());
+    else
+        return pdal::SpatialReference();
+}
+
+
+void PgReader::ready(PointTableRef /*table*/)
+{
+    m_atEnd = false;
+    m_cur_row = 0;
+    m_cur_nrows = 0;
+    m_cur_result = NULL;
+
+    if (getSpatialReference().empty())
+        setSpatialReference(fetchSpatialReference());
+
+    CursorSetup();
+}
+
+
+void PgReader::done(PointTableRef /*table*/)
+{
+    CursorTeardown();
+    if (m_session)
+        PQfinish(m_session);
+    m_session = NULL;
+    if (m_cur_result)
+        PQclear(m_cur_result);
+}
+
+void PgReader::initialize()
+{
+    // First thing we do, is set up a connection
+    if (!m_session)
+        m_session = pg_connect(m_connection);
+
+}
+
+
+void PgReader::CursorSetup()
+{
+    std::ostringstream oss;
+    oss << "DECLARE cur CURSOR FOR " << getDataQuery();
+    pg_begin(m_session);
+    pg_execute(m_session, oss.str());
+
+    log()->get(LogLevel::Debug) << "SQL cursor prepared: " <<
+        oss.str() << std::endl;
+}
+
+
+void PgReader::CursorTeardown()
+{
+    pg_execute(m_session, "CLOSE cur");
+    pg_commit(m_session);
+    log()->get(LogLevel::Debug) << "SQL cursor closed." << std::endl;
+}
+
+
+point_count_t PgReader::readPgPatch(PointViewPtr view, point_count_t numPts)
+{
+    point_count_t numRemaining = m_patch.remaining;
+    PointId nextId = view->size();
+    point_count_t numRead = 0;
+
+    size_t offset = (m_patch.count - m_patch.remaining) * packedPointSize();
+    char *pos = (char *)(m_patch.binary.data() + offset);
+
+    while (numRead < numPts && numRemaining > 0)
+    {
+        writePoint(*view.get(), nextId, pos);
+        pos += packedPointSize();
+        numRemaining--;
+        nextId++;
+        numRead++;
+    }
+    m_patch.remaining = numRemaining;
+    return numRead;
+}
+
+
+bool PgReader::NextBuffer()
+{
+    if (m_cur_row >= m_cur_nrows || !m_cur_result)
+    {
+        static std::string fetch = "FETCH 2 FROM cur";
+        if (m_cur_result)
+            PQclear(m_cur_result);
+        m_cur_result = pg_query_result(m_session, fetch);
+        bool logOutput = (log()->getLevel() > LogLevel::Debug3);
+        if (logOutput)
+            log()->get(LogLevel::Debug3) << "SQL: " << fetch << std::endl;
+        if ((PQresultStatus(m_cur_result) != PGRES_TUPLES_OK) ||
+            (PQntuples(m_cur_result) == 0))
+        {
+            PQclear(m_cur_result);
+            m_cur_result = NULL;
+            m_atEnd = true;
+            return false;
+        }
+
+        m_cur_row = 0;
+        m_cur_nrows = PQntuples(m_cur_result);
+    }
+    m_patch.hex = PQgetvalue(m_cur_result, m_cur_row, 0);
+    m_patch.count = atoi(PQgetvalue(m_cur_result, m_cur_row, 1));
+    m_patch.remaining = m_patch.count;
+    m_patch.update_binary();
+
+    m_cur_row++;
+    return true;
+}
+
+
+point_count_t PgReader::read(PointViewPtr view, point_count_t count)
+{
+    if (eof())
+        return 0;
+
+    log()->get(LogLevel::Debug) << "readBufferImpl called with "
+        "PointView filled to " << view->size() << " points" <<
+        std::endl;
+
+    point_count_t totalNumRead = 0;
+    while (totalNumRead < count)
+    {
+        if (m_patch.remaining == 0)
+            if (!NextBuffer())
+                return totalNumRead;
+        PointId bufBegin = view->size();
+        point_count_t numRead = readPgPatch(view, count - totalNumRead);
+        PointId bufEnd = bufBegin + numRead;
+        totalNumRead += numRead;
+    }
+    return totalNumRead;
+}
+
+} // pdal
diff --git a/plugins/pgpointcloud/io/PgReader.hpp b/plugins/pgpointcloud/io/PgReader.hpp
new file mode 100644
index 0000000..73938e6
--- /dev/null
+++ b/plugins/pgpointcloud/io/PgReader.hpp
@@ -0,0 +1,139 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/DbReader.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/XMLSchema.hpp>
+
+#include "PgCommon.hpp"
+
+#include <vector>
+
+namespace pdal
+{
+
+class PDAL_DLL PgReader : public DbReader
+{
+    class Patch
+    {
+    public:
+        Patch() : count(0), remaining(0)
+        {}
+
+        point_count_t count;
+        point_count_t remaining;
+        std::string hex;
+
+        std::vector<uint8_t> binary;
+        static const uint32_t trim = 26;
+
+#define _base(x) ((x >= '0' && x <= '9') ? '0' : \
+             (x >= 'a' && x <= 'f') ? 'a' - 10 : \
+             (x >= 'A' && x <= 'F') ? 'A' - 10 : \
+                '\255')
+#define HEXOF(x) (x - _base(x))
+
+        inline void update_binary()
+        {
+            // http://stackoverflow.com/questions/8197838/convert-a-long-hex-string-in-to-int-array-with-sscanf
+            binary.resize((hex.size() - trim)/2);
+
+            char const* source = hex.c_str() + trim;
+            char const* p = 0;
+
+            for (p = source; p && *p; p += 2)
+                binary[(p - source) >> 1] =
+                    ((HEXOF(*p)) << 4) + HEXOF(*(p + 1));
+        }
+    };
+
+public:
+    PgReader();
+    ~PgReader();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    virtual point_count_t getNumPoints() const;
+    point_count_t getMaxPoints() const;
+    std::string getDataQuery() const;
+    std::string connString() const
+        { return m_connection; }
+    void getSession() const;
+
+private:
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual void initialize();
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+    virtual bool eof()
+        { return m_atEnd; }
+
+    SpatialReference fetchSpatialReference() const;
+    uint32_t fetchPcid() const;
+    point_count_t readPgPatch(PointViewPtr view, point_count_t numPts);
+
+    // Internal functions for managing scroll cursor
+    void CursorSetup();
+    void CursorTeardown();
+    bool NextBuffer();
+
+    PGconn* m_session;
+    std::string m_connection;
+    std::string m_table_name;
+    std::string m_schema_name;
+    std::string m_column_name;
+    std::string m_where;
+    mutable uint32_t m_pcid;
+    mutable point_count_t m_cached_point_count;
+    mutable point_count_t m_cached_max_points;
+
+    bool m_atEnd;
+    uint32_t m_cur_row;
+    uint32_t m_cur_nrows;
+    PGresult* m_cur_result;
+    Patch m_patch;
+
+    PgReader& operator=(const PgReader&); // not implemented
+    PgReader(const PgReader&); // not implemented
+};
+
+} // pdal
diff --git a/plugins/pgpointcloud/io/PgWriter.cpp b/plugins/pgpointcloud/io/PgWriter.cpp
new file mode 100644
index 0000000..8701d64
--- /dev/null
+++ b/plugins/pgpointcloud/io/PgWriter.cpp
@@ -0,0 +1,514 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+* Copyright (c) 2013, Paul Ramsey, pramsey at cleverelephant.ca
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <boost/format.hpp>
+
+#include "PgWriter.hpp"
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Endian.hpp>
+#include <pdal/XMLSchema.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.pgpointcloud",
+    "Write points to PostgreSQL pgpointcloud output",
+    "http://pdal.io/stages/writers.pgpointcloud.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PgWriter, Writer, s_info)
+
+std::string PgWriter::getName() const { return s_info.name; }
+
+// TO DO:
+// - change INSERT into COPY
+//
+// - PCID / Schema consistency. If a PCID is specified,
+// must it be consistent with the buffer schema? Or should
+// the writer shove the data into the database schema as best
+// it can?
+//
+// - Load information table. Should PDAL write into a metadata
+// table information about each load? If so, how to distinguish
+// between loads? Leave to pre/post SQL?
+
+PgWriter::PgWriter()
+    : m_session(0)
+    , m_patch_compression_type(CompressionType::None)
+    , m_srid(0)
+    , m_pcid(0)
+    , m_overwrite(true)
+    , m_schema_is_initialized(false)
+{}
+
+
+PgWriter::~PgWriter()
+{
+    if (m_session)
+        PQfinish(m_session);
+}
+
+
+void PgWriter::processOptions(const Options& options)
+{
+    // If we don't know the table name, we're SOL
+    m_table_name = options.getValueOrThrow<std::string>("table");
+
+    // Schema and column name can be defaulted safely
+    m_column_name = options.getValueOrDefault<std::string>("column", "pa");
+    m_schema_name = options.getValueOrDefault<std::string>("schema");
+    //
+    // Read compression type and turn into an integer
+    std::string compression_str =
+        options.getValueOrDefault<std::string>("compression", "dimensional");
+    m_patch_compression_type = getCompressionType(compression_str);
+
+    // Connection string needs to exist and actually work
+    m_connection = options.getValueOrThrow<std::string>("connection");
+
+    // Read other preferences
+    m_overwrite = options.getValueOrDefault<bool>("overwrite", true);
+    m_srid = options.getValueOrDefault<uint32_t>("srid", 4326);
+    m_pcid = options.getValueOrDefault<uint32_t>("pcid", 0);
+    m_pre_sql = options.getValueOrDefault<std::string>("pre_sql");
+    // Post-SQL can be *either* a SQL file to execute, *or* a SQL statement
+    // to execute. We find out which one here.
+    std::string post_sql = options.getValueOrDefault<std::string>("post_sql");
+}
+
+//
+// Called from PDAL core during start-up. Do everything
+// here that you are going to absolutely require later.
+// Optional things you can defer or attempt to initialize
+// here.
+//
+void PgWriter::initialize()
+{
+    m_session = pg_connect(m_connection);
+}
+
+//
+// Called from somewhere (?) in PDAL core presumably to provide a user-friendly
+// means of editing the reader options.
+//
+Options PgWriter::getDefaultOptions()
+{
+    Options options;
+
+    Option table("table", "", "table to write to");
+    Option schema("schema", "", "schema table resides in");
+    Option column("column", "", "column to write to");
+    Option compression("compression", "dimensional",
+        "patch compression format to use (none, dimensional, ght)");
+    Option overwrite("overwrite", true, "replace any existing table");
+    Option srid("srid", 4326, "spatial reference id to store data in");
+    Option pcid("pcid", 0, "use this existing pointcloud schema id, if it "
+        "exists");
+    Option pre_sql("pre_sql", "", "before the pipeline runs, read and "
+        "execute this SQL file, or run this SQL command");
+    Option post_sql("post_sql", "", "after the pipeline runs, read and "
+        "execute this SQL file, or run this SQL command");
+
+    options.add(table);
+    options.add(schema);
+    options.add(column);
+    options.add(compression);
+    options.add(overwrite);
+    options.add(srid);
+    options.add(pcid);
+    options.add(pre_sql);
+    options.add(post_sql);
+
+    return options;
+}
+
+void PgWriter::writeInit()
+{
+    if (m_schema_is_initialized)
+        return;
+
+    // Start up the database connection
+    pg_begin(m_session);
+
+    // Pre-SQL can be *either* a SQL file to execute, *or* a SQL statement
+    // to execute. We find out which one here.
+    if (m_pre_sql.size())
+    {
+        std::string sql = FileUtils::readFileAsString(m_pre_sql);
+        if (!sql.size())
+        {
+            // if there was no file to read because the data in pre_sql was
+            // actually the sql code the user wanted to run instead of the
+            // filename to open, we'll use that instead.
+            sql = m_pre_sql;
+        }
+        pg_execute(m_session, sql);
+    }
+
+    bool bHaveTable = CheckTableExists(m_table_name);
+
+    // Apply the over-write preference if it is set
+    if (m_overwrite && bHaveTable)
+    {
+        DeleteTable(m_schema_name, m_table_name);
+        bHaveTable = false;
+    }
+
+    // Read or create a PCID for our new table
+    m_pcid = SetupSchema(m_srid);
+
+    // Create the table!
+    if (! bHaveTable)
+    {
+        CreateTable(m_schema_name, m_table_name, m_column_name, m_pcid);
+    }
+
+    m_schema_is_initialized = true;
+}
+
+void PgWriter::write(const PointViewPtr view)
+{
+    writeInit();
+    writeTile(view);
+}
+
+
+void PgWriter::done(PointTableRef /*table*/)
+{
+    //CreateIndex(m_schema_name, m_table_name, m_column_name);
+
+    if (m_post_sql.size())
+    {
+        std::string sql = FileUtils::readFileAsString(m_post_sql);
+        if (!sql.size())
+        {
+            // if there was no file to read because the data in post_sql was
+            // actually the sql code the user wanted to run instead of the
+            // filename to open, we'll use that instead.
+            sql = m_post_sql;
+        }
+        pg_execute(m_session, sql);
+    }
+
+    pg_commit(m_session);
+    return;
+}
+
+
+uint32_t PgWriter::SetupSchema(uint32_t srid)
+{
+
+    // If the user has specified a PCID they want to use,
+    // does it exist in the database?
+    std::ostringstream oss;
+    long schema_count;
+    if (m_pcid)
+    {
+        oss << "SELECT Count(pcid) FROM pointcloud_formats WHERE pcid = " <<
+            m_pcid;
+        char *count_str = pg_query_once(m_session, oss.str());
+        if (!count_str)
+            throw pdal_error("Unable to count pcid's in table "
+                "`pointcloud_formats`");
+        schema_count = atoi(count_str);
+        free(count_str);
+        oss.str("");
+        if (schema_count == 0)
+        {
+            oss << "requested PCID '" << m_pcid <<
+                "' does not exist in POINTCLOUD_FORMATS";
+            throw pdal_error(oss.str());
+        }
+        return m_pcid;
+    }
+
+    // Do we have any existing schemas in the POINTCLOUD_FORMATS table?
+    uint32_t pcid = 0;
+    oss << "SELECT Count(pcid) FROM pointcloud_formats";
+    char *schema_count_str = pg_query_once(m_session, oss.str());
+    if (!schema_count_str)
+        throw pdal_error("Unable to count pcid's in table "
+            "`pointcloud_formats`");
+    schema_count = atoi(schema_count_str);
+    free(schema_count_str);
+    oss.str("");
+
+    // Create an XML output schema.
+    std::string compression;
+    /* If the writer specifies a compression, we should set that */
+    if (m_patch_compression_type == CompressionType::Dimensional)
+        compression = "dimensional";
+    else if (m_patch_compression_type == CompressionType::Ght)
+        compression = "ght";
+
+    Metadata metadata;
+    MetadataNode m = metadata.getNode();
+    m.add("compression", compression);
+
+    XMLSchema schema(dbDimTypes(), m);
+    std::string xml = schema.xml();
+
+    // Do any of the existing schemas match the one we want to use?
+    if (schema_count > 0)
+    {
+        PGresult *result = pg_query_result(m_session,
+            "SELECT pcid, schema FROM pointcloud_formats");
+        for (int i = 0; i < PQntuples(result); ++i)
+        {
+            char *pcid_str = PQgetvalue(result, i, 0);
+            char *schema_str = PQgetvalue(result, i, 1);
+
+            if (xml == schema_str)
+            {
+                m_pcid = atoi(pcid_str);
+                PQclear(result);
+                return m_pcid;
+            }
+        }
+        PQclear(result);
+    }
+
+    if (schema_count == 0)
+        pcid = 1;
+    else
+    {
+        char *pcid_str = pg_query_once(m_session,
+                "SELECT Max(pcid)+1 AS pcid FROM pointcloud_formats");
+        if (!pcid_str)
+            throw pdal_error("Unable to get the max pcid from "
+                "`pointcloud_formats`");
+        pcid = atoi(pcid_str);
+    }
+
+    const char* paramValues = xml.c_str();
+    oss << "INSERT INTO pointcloud_formats (pcid, srid, schema) "
+        "VALUES (" << pcid << "," << srid << ",$1)";
+    PGresult *result = PQexecParams(m_session, oss.str().c_str(), 1,
+            NULL, &paramValues, NULL, NULL, 0);
+    if (PQresultStatus(result) != PGRES_COMMAND_OK)
+        throw pdal_error(PQresultErrorMessage(result));
+    PQclear(result);
+    m_pcid = pcid;
+    return m_pcid;
+}
+
+
+void PgWriter::DeleteTable(std::string const& schema_name,
+                         std::string const& table_name)
+{
+    std::ostringstream oss;
+
+    oss << "DROP TABLE IF EXISTS ";
+
+    if (schema_name.size())
+    {
+        oss << schema_name << ".";
+    }
+    oss << table_name;
+
+    pg_execute(m_session, oss.str());
+}
+
+
+bool PgWriter::CheckPointCloudExists()
+{
+    log()->get(LogLevel::Debug) << "checking for pointcloud existence ... " <<
+        std::endl;
+
+    std::string q = "SELECT PC_Version()";
+    try
+    {
+        pg_execute(m_session, q);
+    }
+    catch (pdal_error const &e)
+    {
+        return false;
+    }
+    return true;
+}
+
+
+bool PgWriter::CheckPostGISExists()
+{
+    log()->get(LogLevel::Debug) << "checking for PostGIS existence ... " <<
+        std::endl;
+
+    std::string q = "SELECT PostGIS_Version()";
+    try
+    {
+        pg_execute(m_session, q);
+    }
+    catch (pdal_error const &e)
+    {
+        return false;
+    }
+    return true;
+}
+
+
+bool PgWriter::CheckTableExists(std::string const& name)
+{
+    std::ostringstream oss;
+    oss << "SELECT count(*) FROM pg_tables WHERE tablename ILIKE '" <<
+        name << "'";
+
+    log()->get(LogLevel::Debug) << "checking for table '" << name <<
+        "' existence ... " << std::endl;
+
+    char *count_str = pg_query_once(m_session, oss.str());
+    if (!count_str)
+        throw pdal_error("Unable to check for the existence of `pg_table`");
+    int count = atoi(count_str);
+    free(count_str);
+
+    if (count == 1)
+        return true;
+    else if (count > 1)
+        log()->get(LogLevel::Debug) << "found more than 1 table named '" <<
+            name << "'" << std::endl;
+    return false;
+}
+
+void PgWriter::CreateTable(std::string const& schema_name,
+    std::string const& table_name, std::string const& column_name,
+    uint32_t pcid)
+{
+    std::ostringstream oss;
+    oss << "CREATE TABLE ";
+    if (schema_name.size())
+        oss << pg_quote_identifier(schema_name) << ".";
+    oss << pg_quote_identifier(table_name);
+    oss << " (id SERIAL PRIMARY KEY, " <<
+        pg_quote_identifier(column_name) << " PcPatch";
+    if (pcid)
+        oss << "(" << pcid << ")";
+    oss << ")";
+
+    pg_execute(m_session, oss.str());
+}
+
+
+// Make sure you test for the presence of PostGIS before calling this
+void PgWriter::CreateIndex(std::string const& schema_name,
+    std::string const& table_name, std::string const& column_name)
+{
+    std::ostringstream oss;
+
+    oss << "CREATE INDEX ";
+    if (schema_name.size())
+        oss << schema_name << "_";
+    oss << table_name << "_pc_gix";
+    oss << " USING GIST (Geometry(" << column_name << "))";
+
+    pg_execute(m_session, oss.str());
+}
+
+
+void PgWriter::writeTile(const PointViewPtr view)
+{
+    std::vector<char> storage(packedPointSize());
+    std::string hexrep;
+    size_t maxHexrepSize = packedPointSize() * view->size() * 2;
+    hexrep.reserve(maxHexrepSize);
+
+    m_insert.clear();
+    m_insert.reserve(maxHexrepSize + 3000);
+
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        size_t size = readPoint(*view.get(), idx, storage.data());
+
+        /* We are always getting uncompressed bytes off the block_data */
+        /* so we always used compression type 0 (uncompressed) in writing */
+        /* our WKB */
+        static char syms[] = "0123456789ABCDEF";
+        for (size_t i = 0; i != size; i++)
+        {
+            hexrep.push_back(syms[((storage[i] >> 4) & 0xf)]);
+            hexrep.push_back(syms[storage[i] & 0xf]);
+        }
+    }
+
+    std::string insert_into("INSERT INTO ");
+    std::string values(" (" + pg_quote_identifier(m_column_name) +
+                       ") VALUES ('");
+
+    m_insert.append(insert_into);
+
+    if (m_schema_name.size())
+    {
+        m_insert.append(pg_quote_identifier(m_schema_name));
+        m_insert.append(".");
+    }
+
+    m_insert.append(pg_quote_identifier(m_table_name));
+    m_insert.append(values);
+
+    std::ostringstream options;
+
+    uint32_t num_points = view->size();
+    int32_t pcid = m_pcid;
+    CompressionType::Enum compression_v = CompressionType::None;
+    uint32_t compression = static_cast<uint32_t>(compression_v);
+
+#ifdef BOOST_LITTLE_ENDIAN
+    // needs to be 1 byte
+    options << boost::format("%02x") % 1;
+    SWAP_ENDIANNESS(pcid);
+    SWAP_ENDIANNESS(compression);
+    SWAP_ENDIANNESS(num_points);
+#elif BOOST_BIG_ENDIAN
+    // needs to be 1 byte
+    options << boost::format("%02x") % 0;
+#endif
+
+    // needs to be 4 bytes
+    options << boost::format("%08x") % pcid;
+    // needs to be 4 bytes
+    options << boost::format("%08x") % compression;
+    // needs to be 4 bytes
+    options << boost::format("%08x") % num_points;
+
+    m_insert.append(options.str());
+    m_insert.append(hexrep);
+    m_insert.append("')");
+
+    pg_execute(m_session, m_insert);
+}
+
+} // namespace pdal
diff --git a/plugins/pgpointcloud/io/PgWriter.hpp b/plugins/pgpointcloud/io/PgWriter.hpp
new file mode 100644
index 0000000..86bdfb7
--- /dev/null
+++ b/plugins/pgpointcloud/io/PgWriter.hpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+* Copyright (c) 2013, Paul Ramsey, pramsey at cleverelephant.ca
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/DbWriter.hpp>
+#include <pdal/StageFactory.hpp>
+#include "PgCommon.hpp"
+
+namespace pdal
+{
+
+class PDAL_DLL PgWriter : public DbWriter
+{
+public:
+    PgWriter();
+    ~PgWriter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+
+
+    PgWriter& operator=(const PgWriter&); // not implemented
+    PgWriter(const PgWriter&); // not implemented
+
+    virtual void processOptions(const Options& options);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+    virtual void initialize();
+
+    void writeInit();
+    void writeTile(const PointViewPtr view);
+
+    bool CheckTableExists(std::string const& name);
+    bool CheckPointCloudExists();
+    bool CheckPostGISExists();
+    uint32_t SetupSchema(uint32_t srid);
+
+    void CreateTable(std::string const& schema_name,
+                     std::string const& table_name,
+                     std::string const& column_name,
+                     uint32_t pcid);
+
+    void DeleteTable(std::string const& schema_name,
+                     std::string const& table_name);
+
+    void CreateIndex(std::string const& schema_name,
+                     std::string const& table_name,
+                     std::string const& column_name);
+
+    bool WriteBlock(const PointViewPtr view);
+
+    PGconn* m_session;
+    std::string m_schema_name;
+    std::string m_table_name;
+    std::string m_column_name;
+    std::string m_connection;
+    CompressionType::Enum m_patch_compression_type;
+    uint32_t m_patch_capacity;
+    uint32_t m_srid;
+    uint32_t m_pcid;
+    bool m_overwrite;
+    std::string m_insert;
+    Orientation::Enum m_orientation;
+    std::string m_pre_sql;
+    std::string m_post_sql;
+
+    // lose this
+    bool m_schema_is_initialized;
+};
+
+} // namespace pdal
diff --git a/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
new file mode 100644
index 0000000..333c1b8
--- /dev/null
+++ b/plugins/pgpointcloud/test/PgpointcloudWriterTest.cpp
@@ -0,0 +1,254 @@
+/******************************************************************************
+* Copyright (c) 2014, Pete Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Writer.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include "Support.hpp"
+#include "Pgtest-Support.hpp"
+#include "../io/PgCommon.hpp"
+
+using namespace pdal;
+
+namespace { // anonymous
+
+std::string getTestConnBase()
+{
+    std::string s;
+    if ( ! testDbPort.empty() )
+        s += " port='" + testDbPort + "'";
+    if ( ! testDbHost.empty() )
+        s += " host='" + testDbHost + "'";
+    if ( ! testDbUser.empty() )
+        s += " user='" + testDbUser + "'";
+    return s;
+}
+
+
+std::string getConnectionString(const std::string& dbname)
+{
+    return getTestConnBase() + " dbname='" + dbname + "'";
+}
+
+
+std::string getTestDBTempConn()
+{
+    return getConnectionString(testDbTempname);
+}
+
+std::string getMasterDBConn()
+{
+    return getConnectionString(testDbName);
+}
+
+} // anonymous namespace
+
+Options getDbOptions()
+{
+    Options options;
+
+    options.add(Option("connection", getTestDBTempConn()));
+    options.add(Option("table", "pdal-\"test\"-table")); // intentional quotes
+    options.add(Option("column", "p\"a")); // intentional quotes
+    options.add(Option("srid", "4326"));
+    options.add(Option("capacity", "10000"));
+
+    return options;
+}
+
+class PgpointcloudWriterTest : public testing::Test
+{
+public:
+    PgpointcloudWriterTest() : m_masterConnection(0), m_testConnection(0) {};
+protected:
+    virtual void SetUp()
+    {
+        std::string connstr = getMasterDBConn();
+        m_masterConnection = pg_connect( connstr );
+        m_testConnection = NULL;
+
+        // Silence those pesky notices
+        executeOnMasterDb("SET client_min_messages TO WARNING");
+
+        dropTestDb();
+
+        std::stringstream createDbSql;
+        createDbSql << "CREATE DATABASE " <<
+            testDbTempname << " TEMPLATE template0";
+        executeOnMasterDb(createDbSql.str());
+
+        m_testConnection = pg_connect( getTestDBTempConn() );
+
+        executeOnTestDb("CREATE EXTENSION pointcloud");
+    }
+
+    void executeOnTestDb(const std::string& sql)
+    {
+        pg_execute(m_testConnection, sql);
+    }
+
+    virtual void TearDown()
+    {
+        if (!m_testConnection || !m_masterConnection) return;
+        if (m_testConnection)
+        {
+            PQfinish(m_testConnection);
+        }
+        dropTestDb();
+        if (m_masterConnection)
+        {
+            PQfinish(m_masterConnection);
+        }
+    }
+
+private:
+
+    void executeOnMasterDb(const std::string& sql)
+    {
+        pg_execute(m_masterConnection, sql);
+    }
+
+    void execute(PGconn* connection, const std::string& sql)
+    {
+        pg_execute(connection, sql);
+    }
+
+    void dropTestDb()
+    {
+        std::stringstream dropDbSql;
+        dropDbSql << "DROP DATABASE IF EXISTS " << testDbTempname;
+        executeOnMasterDb(dropDbSql.str());
+    }
+
+    PGconn* m_masterConnection;
+    PGconn* m_testConnection;
+};
+
+namespace
+{
+
+void optionsWrite(const Options& writerOps)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> writer(f.createStage("writers.pgpointcloud"));
+    std::unique_ptr<Stage> reader(f.createStage("readers.las"));
+
+    EXPECT_TRUE(writer.get());
+    EXPECT_TRUE(reader.get());
+    if (!writer.get() || !reader.get())
+        return;
+
+    const std::string file(Support::datapath("las/1.2-with-color.las"));
+    Options options;
+    options.add("filename", file);
+    reader->setOptions(options);
+    writer->setOptions(writerOps);
+    writer->setInput(*reader);
+
+    PointTable table;
+    writer->prepare(table);
+
+    PointViewSet written = writer->execute(table);
+
+    point_count_t count(0);
+    for(auto i = written.begin(); i != written.end(); ++i)
+	    count += (*i)->size();
+    EXPECT_EQ(written.size(), 1U);
+    EXPECT_EQ(count, 1065U);
+}
+
+} // unnamed namespace
+
+TEST_F(PgpointcloudWriterTest, write)
+{
+    optionsWrite(getDbOptions());
+}
+
+TEST_F(PgpointcloudWriterTest, writeScaled)
+{
+    Options ops = getDbOptions();
+    ops.add("scale_x", .01);
+    ops.add("scale_y", .01);
+    ops.add("scale_z", .01);
+
+    optionsWrite(ops);
+}
+
+TEST_F(PgpointcloudWriterTest, writeXYZ)
+{
+    Options ops = getDbOptions();
+    ops.add("output_dims", "X,Y,Z");
+
+    optionsWrite(ops);
+
+    PointTable table;
+    std::unique_ptr<Stage> reader(
+        StageFactory().createStage("readers.pgpointcloud"));
+    reader->setOptions(getDbOptions());
+
+    reader->prepare(table);
+    Dimension::IdList dims = table.layout()->dims();
+    EXPECT_EQ(dims.size(), (size_t)3);
+    EXPECT_TRUE(Utils::contains(dims, Dimension::Id::X));
+    EXPECT_TRUE(Utils::contains(dims, Dimension::Id::Y));
+    EXPECT_TRUE(Utils::contains(dims, Dimension::Id::Z));
+}
+
+TEST_F(PgpointcloudWriterTest, writetNoPointcloudExtension)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> writer(f.createStage("writers.pgpointcloud"));
+    EXPECT_TRUE(writer.get());
+
+    executeOnTestDb("DROP EXTENSION pointcloud");
+
+    const std::string file(Support::datapath("las/1.2-with-color.las"));
+
+    const Option opt_filename("filename", file);
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.las"));
+    EXPECT_TRUE(reader.get());
+    Options options;
+    options.add(opt_filename);
+    reader->setOptions(options);
+    writer->setOptions(getDbOptions());
+    writer->setInput(*reader);
+
+    PointTable table;
+    writer->prepare(table);
+
+    EXPECT_THROW(writer->execute(table), pdal_error);
+}
diff --git a/plugins/pgpointcloud/test/Pgtest-Support.hpp.in b/plugins/pgpointcloud/test/Pgtest-Support.hpp.in
new file mode 100644
index 0000000..5f32785
--- /dev/null
+++ b/plugins/pgpointcloud/test/Pgtest-Support.hpp.in
@@ -0,0 +1,54 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+namespace pdal
+{
+
+
+static const std::string testDbUser("@PGPOINTCLOUD_TEST_DB_USER@");
+static const std::string testDbHost("@PGPOINTCLOUD_TEST_DB_HOST@");
+static const std::string testDbPort("@PGPOINTCLOUD_TEST_DB_PORT@");
+static const std::string testDbName("@PGPOINTCLOUD_TEST_DB_NAME@");
+static const std::string testDbTempname("@PGPOINTCLOUD_TEST_DB_TEMPNAME@");
+
+
+
+//boost::property_tree::ptree Reader::serializePipeline(PointTablePtr table) const
+//{
+//    return m_stage->serializePipeline(table);
+//}
+
+} // namespace pdal
diff --git a/plugins/python/CMakeLists.txt b/plugins/python/CMakeLists.txt
new file mode 100644
index 0000000..f86fb42
--- /dev/null
+++ b/plugins/python/CMakeLists.txt
@@ -0,0 +1,10 @@
+#
+# Python plugin CMake configuration
+#
+
+add_subdirectory(filters)
+if (WITH_TESTS)
+    include_directories(SYSTEM ${PYTHON_INCLUDE_DIR})
+    PDAL_ADD_TEST(plangtest FILES ./test/PLangTest.cpp
+        LINK_WITH ${PDAL_PLANG_LIB_NAME})
+endif()
diff --git a/plugins/python/filters/CMakeLists.txt b/plugins/python/filters/CMakeLists.txt
new file mode 100644
index 0000000..57ae073
--- /dev/null
+++ b/plugins/python/filters/CMakeLists.txt
@@ -0,0 +1,31 @@
+
+# Predicate Filter
+#
+include_directories(SYSTEM ${PYTHON_INCLUDE_DIR})
+
+set(srcs PredicateFilter.cpp)
+set(incs PredicateFilter.hpp)
+
+PDAL_ADD_PLUGIN(predicate_libname filter predicate
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PDAL_PLANG_LIB_NAME})
+
+#
+# Programmable Filter
+#
+set(srcs ProgrammableFilter.cpp)
+set(incs ProgrammableFilter.hpp)
+
+PDAL_ADD_PLUGIN(programmable_libname filter programmable
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${PDAL_PLANG_LIB_NAME})
+
+if (WITH_TESTS)
+    PDAL_ADD_TEST(python_predicate_test
+            FILES ../test/PredicateFilterTest.cpp
+            LINK_WITH ${predicate_libname} ${PDAL_PLANG_LIB_NAME})
+
+    PDAL_ADD_TEST(python_programmable_test
+            FILES ../test/ProgrammableFilterTest.cpp
+            LINK_WITH ${programmable_libname} ${PDAL_PLANG_LIB_NAME})
+endif()
diff --git a/plugins/python/filters/PredicateFilter.cpp b/plugins/python/filters/PredicateFilter.cpp
new file mode 100644
index 0000000..2fe99d1
--- /dev/null
+++ b/plugins/python/filters/PredicateFilter.cpp
@@ -0,0 +1,117 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_internal.hpp>
+
+#include "PredicateFilter.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.predicate",
+    "Filter data using inline Python expressions.",
+    "http://pdal.io/stages/filters.predicate.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, PredicateFilter, Filter, s_info)
+
+std::string PredicateFilter::getName() const { return s_info.name; }
+
+void PredicateFilter::processOptions(const Options& options)
+{
+    m_source = options.getValueOrDefault<std::string>("source", "");
+    if (m_source.empty())
+        m_source = FileUtils::readFileIntoString(
+            options.getValueOrThrow<std::string>("script"));
+    m_module = options.getValueOrThrow<std::string>("module");
+    m_function = options.getValueOrThrow<std::string>("function");
+}
+
+
+Options PredicateFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("script", "");
+    options.add("module", "");
+    options.add("function", "");
+    return options;
+}
+
+
+void PredicateFilter::ready(PointTableRef table)
+{
+    plang::Environment::get()->set_stdout(log()->getLogStream());
+    m_script = new plang::Script(m_source, m_module, m_function);
+    m_pythonMethod = new plang::BufferedInvocation(*m_script);
+    m_pythonMethod->compile();
+}
+
+
+PointViewSet PredicateFilter::run(PointViewPtr view)
+{
+    MetadataNode n;
+
+    m_pythonMethod->resetArguments();
+    m_pythonMethod->begin(*view, n);
+    m_pythonMethod->execute();
+
+    if (!m_pythonMethod->hasOutputVariable("Mask"))
+        throw pdal::pdal_error("Mask variable not set in predicate "
+            "filter function.");
+
+    PointViewPtr outview = view->makeNew();
+
+    void *pydata =
+        m_pythonMethod->extractResult("Mask", Dimension::Type::Unsigned8);
+    char *ok = (char *)pydata;
+    for (PointId idx = 0; idx < view->size(); ++idx)
+        if (*ok++)
+            outview->appendPoint(*view, idx);
+
+    PointViewSet viewSet;
+    viewSet.insert(outview);
+    return viewSet;
+}
+
+
+void PredicateFilter::done(PointTableRef table)
+{
+    plang::Environment::get()->reset_stdout();
+    delete m_pythonMethod;
+    delete m_script;
+}
+
+} // namespace pdal
diff --git a/plugins/python/filters/PredicateFilter.hpp b/plugins/python/filters/PredicateFilter.hpp
new file mode 100644
index 0000000..070de13
--- /dev/null
+++ b/plugins/python/filters/PredicateFilter.hpp
@@ -0,0 +1,73 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Filter.hpp>
+
+#include <pdal/plang/BufferedInvocation.hpp>
+
+namespace pdal
+{
+
+class PDAL_DLL PredicateFilter : public Filter
+{
+public:
+    PredicateFilter() : Filter(), m_script(NULL)
+        {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    plang::BufferedInvocation* m_pythonMethod;
+    plang::Script* m_script;
+    std::string m_source;
+    std::string m_module;
+    std::string m_function;
+
+    virtual void processOptions(const Options& options);
+    virtual void ready(PointTableRef table);
+    virtual PointViewSet run(PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    PredicateFilter& operator=(const PredicateFilter&); // not implemented
+    PredicateFilter(const PredicateFilter&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/python/filters/ProgrammableFilter.cpp b/plugins/python/filters/ProgrammableFilter.cpp
new file mode 100644
index 0000000..236e9ad
--- /dev/null
+++ b/plugins/python/filters/ProgrammableFilter.cpp
@@ -0,0 +1,119 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_internal.hpp>
+
+#include "ProgrammableFilter.hpp"
+#include "../plang/Plang.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "filters.programmable",
+    "Manipulate data using inline Python",
+    "http://pdal.io/stages/filters.programmable.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, ProgrammableFilter, Filter, s_info)
+
+std::string ProgrammableFilter::getName() const { return s_info.name; }
+
+Options ProgrammableFilter::getDefaultOptions()
+{
+    Options options;
+    options.add("script", "");
+    options.add("module", "");
+    options.add("function", "");
+    return options;
+}
+
+
+void ProgrammableFilter::processOptions(const Options& options)
+{
+    m_source = options.getValueOrDefault<std::string>("source", "");
+    if (m_source.empty())
+        m_source = FileUtils::readFileIntoString(
+            options.getValueOrThrow<std::string>("script"));
+    m_module = options.getValueOrThrow<std::string>("module");
+    m_function = options.getValueOrThrow<std::string>("function");
+
+    auto addDims = options.getOptions("add_dimension");
+    for (auto it = addDims.cbegin(); it != addDims.cend(); ++it)
+    {
+        m_addDimensions.push_back(it->getValue<std::string>());
+    }
+}
+
+
+void ProgrammableFilter::addDimensions(PointLayoutPtr layout)
+{
+    for (auto it = m_addDimensions.cbegin(); it != m_addDimensions.cend(); ++it)
+    {
+        Dimension::Id::Enum id = layout->registerOrAssignDim(*it,
+                                    pdal::Dimension::Type::Double);
+    }
+}
+
+
+void ProgrammableFilter::ready(PointTableRef table)
+{
+    plang::Environment::get()->set_stdout(log()->getLogStream());
+    m_script = new plang::Script(m_source, m_module, m_function);
+    m_pythonMethod = new plang::BufferedInvocation(*m_script);
+    m_pythonMethod->compile();
+    m_totalMetadata = table.metadata();
+}
+
+
+void ProgrammableFilter::filter(PointView& view)
+{
+    log()->get(LogLevel::Debug5) << "Python script " << *m_script <<
+        " processing " << view.size() << " points." << std::endl;
+    m_pythonMethod->resetArguments();
+    m_pythonMethod->begin(view, m_totalMetadata);
+    m_pythonMethod->execute();
+    m_pythonMethod->end(view, getMetadata());
+}
+
+
+void ProgrammableFilter::done(PointTableRef table)
+{
+    plang::Environment::get()->reset_stdout();
+    delete m_pythonMethod;
+    delete m_script;
+}
+
+} // namespace pdal
diff --git a/plugins/python/filters/ProgrammableFilter.hpp b/plugins/python/filters/ProgrammableFilter.hpp
new file mode 100644
index 0000000..2dac6ea
--- /dev/null
+++ b/plugins/python/filters/ProgrammableFilter.hpp
@@ -0,0 +1,79 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/pdal_internal.hpp>
+#include <pdal/Filter.hpp>
+
+#include <pdal/plang/BufferedInvocation.hpp>
+
+namespace pdal
+{
+
+class ProgrammableFilterSequentialIterator;
+
+class PDAL_DLL ProgrammableFilter : public Filter
+{
+public:
+    ProgrammableFilter() : Filter(), m_script(NULL)
+        {}
+
+    static void *create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+
+private:
+    plang::Script* m_script;
+    plang::BufferedInvocation *m_pythonMethod;
+    std::string m_source;
+    std::string m_module;
+    std::string m_function;
+    std::vector<std::string> m_addDimensions;
+
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual void filter(PointView& view);
+    virtual void done(PointTableRef table);
+
+    ProgrammableFilter& operator=(const ProgrammableFilter&); // not implemented
+    ProgrammableFilter(const ProgrammableFilter&); // not implemented
+
+    MetadataNode m_totalMetadata;
+};
+
+} // namespace pdal
diff --git a/plugins/python/plang/CMakeLists.txt b/plugins/python/plang/CMakeLists.txt
new file mode 100644
index 0000000..ec53803
--- /dev/null
+++ b/plugins/python/plang/CMakeLists.txt
@@ -0,0 +1,34 @@
+
+set(plang_srcs
+    BufferedInvocation.cpp
+    Invocation.cpp
+    Environment.cpp
+    Plang.cpp
+    Redirector.cpp
+    Script.cpp
+)
+
+set(plang_headers
+    BufferedInvocation.hpp
+    Invocation.hpp
+    Environment.hpp
+    Plang.hpp
+    Redirector.hpp
+    Script.hpp
+)
+
+set(PYTHON_LIBRARY ${PDAL_NO_AS_NEEDED_START}
+    ${PYTHON_LIBRARY}
+    ${PDAL_NO_AS_NEEDED_END})
+PDAL_ADD_LIBRARY(${PLANG_LIB_NAME} ${plang_srcs} ${plang_headers})
+target_link_libraries(${PLANG_LIB_NAME} ${PDAL_BASE_LIB_NAME} ${PYTHON_LIBRARY})
+install(TARGETS ${PLANG_LIB_NAME}
+    RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
+    LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
+    ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
+
+if (WITH_TESTS)
+    PDAL_ADD_TEST(plangtest FILES ../test/PLangTest.cpp
+        LINK_WITH ${PLANG_LIB_NAME})
+
+endif()
diff --git a/plugins/python/plang/Plang.cpp b/plugins/python/plang/Plang.cpp
new file mode 100644
index 0000000..11d0dc7
--- /dev/null
+++ b/plugins/python/plang/Plang.cpp
@@ -0,0 +1,78 @@
+#include <Python.h>
+
+#include <boost/uuid/string_generator.hpp>
+
+//#include <pdal/plang/Plang.hpp>
+#include <pdal/Metadata.hpp>
+
+namespace pdal
+{
+namespace plang
+{
+
+PyObject *fromMetadata(MetadataNode m)
+{
+    std::string name = m.name();
+    std::string value = m.value();
+    std::string type = m.type();
+    std::string description = m.description();
+
+    MetadataNodeList children = m.children();
+    PyObject *submeta = NULL;
+    if (children.size())
+    {
+        submeta = PyList_New(0);
+        for (MetadataNode& child : children)
+            PyList_Append(submeta, fromMetadata(child));
+    }
+    PyObject *data = PyTuple_New(5);
+    PyTuple_SetItem(data, 0, PyString_FromString(name.data()));
+    PyTuple_SetItem(data, 1, PyString_FromString(value.data()));
+    PyTuple_SetItem(data, 2, PyString_FromString(type.data()));
+    PyTuple_SetItem(data, 3, PyString_FromString(description.data()));
+    PyTuple_SetItem(data, 4, submeta);
+
+    return data;
+}
+
+void addMetadata(PyObject *list, MetadataNode m)
+{
+    if (!PyList_Check(list))
+        return;
+    for (Py_ssize_t i = 0; i < PyList_Size(list); ++i)
+    {
+        PyObject *tuple = PyList_GetItem(list, i);
+        if (!PyTuple_Check(tuple) || PyTuple_Size(tuple) != 5)
+            continue;
+        PyObject *o;
+        o = PyTuple_GetItem(tuple, 0);
+        if (!o || !PyString_Check(o))
+            continue;
+        std::string name = PyString_AsString(o);
+
+        o = PyTuple_GetItem(tuple, 1);
+        if (!o || !PyString_Check(o))
+            continue;
+        std::string value = PyString_AsString(o);
+
+        o = PyTuple_GetItem(tuple, 2);
+        if (!o || !PyString_Check(o))
+            continue;
+        std::string type = PyString_AsString(o);
+        if (type.empty())
+            type = Metadata::inferType(value);
+
+        o = PyTuple_GetItem(tuple, 3);
+        if (!o || !PyString_Check(o))
+            continue;
+        std::string description = PyString_AsString(o);
+
+        PyObject *submeta = PyTuple_GetItem(tuple, 4);
+        MetadataNode child =  m.add(name, value, type, description);
+        if (submeta)
+            addMetadata(submeta, child);
+    }
+}
+
+} // namespace plang
+} // namespace pdal
diff --git a/plugins/python/plang/Plang.hpp b/plugins/python/plang/Plang.hpp
new file mode 100644
index 0000000..f132790
--- /dev/null
+++ b/plugins/python/plang/Plang.hpp
@@ -0,0 +1,55 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Metadata.hpp>
+
+// forward declare PyObject so we don't need the python headers everywhere
+// see: http://mail.python.org/pipermail/python-dev/2003-August/037601.html
+#ifndef PyObject_HEAD
+struct _object;
+typedef _object PyObject;
+#endif
+
+namespace pdal
+{
+namespace plang
+{
+
+PyObject *fromMetadata(MetadataNode m);
+void addMetadata(PyObject *list, MetadataNode m);
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/plugins/python/test/CMakeLists.txt b/plugins/python/test/CMakeLists.txt
new file mode 100644
index 0000000..e69de29
diff --git a/plugins/python/test/PLangTest.cpp b/plugins/python/test/PLangTest.cpp
new file mode 100644
index 0000000..9c32b6f
--- /dev/null
+++ b/plugins/python/test/PLangTest.cpp
@@ -0,0 +1,463 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/plang/Invocation.hpp>
+#include <pdal/plang/Array.hpp>
+
+#include <Support.hpp>
+#include <faux/FauxReader.hpp>
+#include <pdal/StageFactory.hpp>
+
+using namespace pdal;
+using namespace pdal::plang;
+
+TEST(PLangTest, PLangTest_basic)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  #print 'hi'\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+    meth.execute();
+}
+
+
+//---------------------------------------------------------------------------
+//
+// Error tests
+//
+//---------------------------------------------------------------------------
+
+TEST(PLangTest, PLangTest_compile_error)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+
+    ASSERT_THROW(meth.compile(), pdal::pdal_error);
+}
+
+
+TEST(PLangTest, PLangTest_runtime_error)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  z['s'] = 9\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    ASSERT_THROW(meth.execute(), pdal::pdal_error);
+}
+
+
+TEST(PLangTest, PLangTest_returnvoid)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs,mids):\n"
+        "  #print 'foo'\n"
+        "  return\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    ASSERT_THROW(meth.execute(), pdal::pdal_error);
+}
+
+
+TEST(PLangTest, PLangTest_returnint)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs,mids):\n"
+        "  #print 'foo'\n"
+        "  return 7\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    ASSERT_THROW(meth.execute(), pdal::pdal_error);
+}
+
+
+//---------------------------------------------------------------------------
+//
+// PARAM tests
+//
+//---------------------------------------------------------------------------
+
+
+TEST(PLangTest, PLangTest_ins)
+{
+    double data[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
+
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  #print ins['X']\n"
+        "  X = ins['X']\n"
+        "  #print X\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+    meth.insertArgument("X", (uint8_t*)data, Dimension::Type::Double, 5);
+    meth.execute();
+}
+
+
+TEST(PLangTest, PLangTest_outs)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  #print outs['X']\n"
+        "  X = np.ones(5)\n"
+        "  #print X\n"
+        "  outs['X'] = X\n"
+        "  #print outs['X']\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+    meth.execute();
+    EXPECT_TRUE(meth.hasOutputVariable("X"));
+    void *output = meth.extractResult("X", Dimension::Type::Double);
+
+    double *d = (double *)output;
+    EXPECT_FLOAT_EQ(*d++, 1.0);
+    EXPECT_FLOAT_EQ(*d++, 1.0);
+    EXPECT_FLOAT_EQ(*d++, 1.0);
+    EXPECT_FLOAT_EQ(*d++, 1.0);
+    EXPECT_FLOAT_EQ(*d++, 1.0);
+}
+
+
+TEST(PLangTest, PLangTest_aliases)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  \n"
+        "  #print ins['X']\n"
+        "  #print ins['prefix.X']\n"
+        "  \n"
+        "  X = ins['X']\n"
+        "  prefixX = ins['prefix.X']\n"
+        "  \n"
+        "  #print X\n"
+        "  #print prefixX\n"
+        "  \n"
+        "  Y = X + prefixX\n"
+        "  prefixY = Y\n"
+        "  \n"
+        "  #print Y\n"
+        "  #print prefixY\n"
+        "  \n"
+        "  outs['Y'] = Y\n"
+        "  outs['prefix.Y'] = prefixY\n"
+        "  \n"
+        "  #print outs['Y']\n"
+        "  #print outs['prefix.Y']\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    {
+        double data[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
+        meth.insertArgument("X", (uint8_t*)data, Dimension::Type::Double, 5);
+        meth.insertArgument("prefix.X", (uint8_t*)data,
+            Dimension::Type::Double, 5);
+    }
+    meth.execute();
+
+    {
+        EXPECT_TRUE(meth.hasOutputVariable("Y"));
+        EXPECT_TRUE(meth.hasOutputVariable("prefix.Y"));
+
+        void *output = meth.extractResult("Y", Dimension::Type::Double);
+        double *d = (double *)output;
+        EXPECT_FLOAT_EQ(*d++, 2.0);
+        EXPECT_FLOAT_EQ(*d++, 4.0);
+        EXPECT_FLOAT_EQ(*d++, 6.0);
+        EXPECT_FLOAT_EQ(*d++, 8.0);
+        EXPECT_FLOAT_EQ(*d++, 10.0);
+
+        output = meth.extractResult("prefix.Y", Dimension::Type::Double);
+        d = (double *)output;
+        EXPECT_FLOAT_EQ(*d++, 2.0);
+        EXPECT_FLOAT_EQ(*d++, 4.0);
+        EXPECT_FLOAT_EQ(*d++, 6.0);
+        EXPECT_FLOAT_EQ(*d++, 8.0);
+        EXPECT_FLOAT_EQ(*d++, 10.0);
+    }
+
+    {
+        std::vector<std::string> names;
+        meth.getOutputNames(names);
+
+        // We're getting stuff from a hash, so it
+        // isn't stable
+        std::sort(names.begin(), names.end());
+        EXPECT_EQ(names.size(), 2u);
+        EXPECT_EQ(names[0], "Y");
+        EXPECT_EQ(names[1], "prefix.Y");
+    }
+}
+
+
+TEST(PLangTest, PLangTest_returntrue)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    bool sts = meth.execute();
+    EXPECT_TRUE(sts);
+}
+
+
+TEST(PLangTest, PLangTest_returnfalse)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  return False\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    bool sts = meth.execute();
+    EXPECT_TRUE(!sts);
+}
+
+
+//---------------------------------------------------------------------------
+//
+// MISC tests
+//
+//---------------------------------------------------------------------------
+
+TEST(PLangTest, PLangTest_reentry)
+{
+    const char* source =
+        "import numpy as np\n"
+        "def yow(ins,outs):\n"
+        "  X = ins['X']\n"
+        "  Y = X + 1.0\n"
+        "  #print Y\n"
+        "  outs['Y'] = Y\n"
+        "  return True\n"
+        ;
+    Script script(source, "MyTest", "yow");
+    Invocation meth(script);
+    meth.compile();
+
+    {
+        double indata1[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
+        meth.insertArgument("X", (uint8_t*)indata1, Dimension::Type::Double, 5);
+        meth.execute();
+        void *output = meth.extractResult("Y", Dimension::Type::Double);
+
+        double *d = (double *)output;
+        EXPECT_FLOAT_EQ(*d++, 1.0);
+        EXPECT_FLOAT_EQ(*d++, 2.0);
+        EXPECT_FLOAT_EQ(*d++, 3.0);
+        EXPECT_FLOAT_EQ(*d++, 4.0);
+        EXPECT_FLOAT_EQ(*d++, 5.0);
+    }
+
+    {
+        double indata2[5] = {10.0, 20.0, 30.0, 40.0, 50.0};
+        meth.insertArgument("X", (uint8_t*)indata2, Dimension::Type::Double, 5);
+        meth.execute();
+        void *output = meth.extractResult("Y", Dimension::Type::Double);
+
+        double *d = (double *)output;
+        EXPECT_FLOAT_EQ(*d++, 11.0);
+        EXPECT_FLOAT_EQ(*d++, 21.0);
+        EXPECT_FLOAT_EQ(*d++, 31.0);
+        EXPECT_FLOAT_EQ(*d++, 41.0);
+        EXPECT_FLOAT_EQ(*d++, 51.0);
+    }
+}
+
+TEST(PLangTest, log)
+{
+    StageFactory f;
+    // verify we can redirect the stdout inside the python script
+
+    Options reader_opts;
+    {
+        BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+        Option opt1("bounds", bounds);
+        Option opt2("num_points", 750);
+        Option opt3("mode", "constant");
+
+        reader_opts.add(opt1);
+        reader_opts.add(opt2);
+        reader_opts.add(opt3);
+
+        Option optlog("log", Support::temppath("mylog_three.txt"));
+        reader_opts.add(optlog);
+    }
+
+    Options xfilter_opts;
+    {
+        const Option source("source",
+            "import numpy as np\n"
+            "def xfunc(ins,outs):\n"
+            "  X = ins['X']\n"
+            "  print (\"Testing log output through python script.\")\n"
+            "  X = X + 1.0\n"
+            "  outs['X'] = X\n"
+            "  return True\n"
+            );
+        const Option module("module", "xModule");
+        const Option function("function", "xfunc");
+        xfilter_opts.add("log", Support::temppath("mylog_three.txt"));
+        xfilter_opts.add(source);
+        xfilter_opts.add(module);
+        xfilter_opts.add(function);
+    }
+
+    {
+        FauxReader reader;
+
+        reader.setOptions(reader_opts);
+
+        std::unique_ptr<Stage> xfilter(f.createStage("filters.programmable"));
+        xfilter->setOptions(xfilter_opts);
+        xfilter->setInput(reader);
+
+        PointTable table;
+        xfilter->prepare(table);
+        PointViewSet pvSet = xfilter->execute(table);
+        EXPECT_EQ(pvSet.size(), 1u);
+        PointViewPtr view = *pvSet.begin();
+        EXPECT_EQ(view->size(), 750u);
+    }
+
+    bool ok = Support::compare_text_files(
+        Support::temppath("mylog_three.txt"),
+        Support::datapath("logs/log_py.txt"));
+
+    if (ok)
+        FileUtils::deleteFile(Support::temppath("mylog_three.txt"));
+
+    EXPECT_TRUE(ok);
+}
+
+
+
+PointViewPtr makeTestView(PointTableRef table, point_count_t cnt = 17)
+{
+    PointLayoutPtr layout(table.layout());
+
+    layout->registerDim(Dimension::Id::Classification);
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+
+    PointViewPtr view(new PointView(table));
+
+    // write the data into the view
+    for (PointId i = 0; i < cnt; i++)
+    {
+        const uint8_t x = (uint8_t)(i + 1);
+        const int32_t y = i * 10;
+        const double z = i * 100;
+
+        view->setField(Dimension::Id::Classification, i, x);
+        view->setField(Dimension::Id::X, i, y);
+        view->setField(Dimension::Id::Y, i, z);
+    }
+    EXPECT_EQ(view->size(), cnt);
+    return view;
+}
+
+void verifyTestView(const PointView& view, point_count_t cnt = 17)
+{
+    // read the view back out
+    for (PointId i = 0; i < cnt; i++)
+    {
+        uint8_t x = view.getFieldAs<uint8_t>(
+            Dimension::Id::Classification, i);
+        int32_t y = view.getFieldAs<uint32_t>(Dimension::Id::X, i);
+        double z = view.getFieldAs<double>(Dimension::Id::Y, i);
+
+        EXPECT_EQ(x, (uint8_t)(i + 1));
+        EXPECT_EQ(y, (int32_t)(i * 10));
+        EXPECT_TRUE(Utils::compare_approx(z, static_cast<double>(i) * 100.0,
+            (std::numeric_limits<double>::min)()));
+    }
+}
+
+TEST(PLangTest, PLangTest_array)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table, 40);
+
+    plang::Array array;
+    array.update(view);
+    verifyTestView(*view.get(), 4);
+
+}
+
+
diff --git a/plugins/python/test/PredicateFilterTest.cpp b/plugins/python/test/PredicateFilterTest.cpp
new file mode 100644
index 0000000..da4c6f6
--- /dev/null
+++ b/plugins/python/test/PredicateFilterTest.cpp
@@ -0,0 +1,375 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/StageWrapper.hpp>
+#include <stats/StatsFilter.hpp>
+#include <faux/FauxReader.hpp>
+
+
+#include "Support.hpp"
+
+
+using namespace pdal;
+
+#include <pdal/plang/Environment.hpp>
+
+class PredicateFilterTest : public ::testing::Test
+{
+public:
+    virtual void SetUp()
+    {
+        pdal::plang::Environment::get();
+    }
+
+};
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_test1)
+{
+    StageFactory f;
+
+
+    BOX3D bounds(0.0, 0.0, 0.0, 2.0, 2.0, 2.0);
+    Options readerOps;
+    readerOps.add("bounds", bounds);
+    readerOps.add("num_points", 1000);
+    readerOps.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(readerOps);
+
+    // keep all points where x less than 1.0
+    const Option source("source",
+        // "X < 1.0"
+        "import numpy as np\n"
+        "def yow1(ins,outs):\n"
+        "  X = ins['X']\n"
+        "  Mask = np.less(X, 1.0)\n"
+        "  #print X\n"
+        "  #print Mask\n"
+        "  outs['Mask'] = Mask\n"
+        "  return True\n"
+    );
+    const Option module("module", "MyModule1");
+    const Option function("function", "yow1");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.predicate"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    Options statOpts;
+    std::unique_ptr<StatsFilter> stats(new StatsFilter);
+    stats->setOptions(statOpts);
+    stats->setInput(*filter);
+
+    PointTable table;
+
+    stats->prepare(table);
+    PointViewSet viewSet = stats->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+
+    const stats::Summary& statsX = stats->getStats(Dimension::Id::X);
+    const stats::Summary& statsY = stats->getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = stats->getStats(Dimension::Id::Z);
+
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.minimum(), 0.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.minimum(), 0.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.minimum(), 0.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.maximum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.maximum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.maximum(), 1.0, 0.01));
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_test2)
+{
+    StageFactory f;
+    // same as above, but with 'Y >' instead of 'X <'
+
+    BOX3D bounds(0.0, 0.0, 0.0, 2.0, 2.0, 2.0);
+    Options readerOps;
+    readerOps.add("bounds", bounds);
+    readerOps.add("num_points", 1000);
+    readerOps.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(readerOps);
+
+    Option source("source",
+        // "Y > 1.0"
+        "import numpy as np\n"
+        "def yow2(ins,outs):\n"
+        "  Y = ins['Y']\n"
+        "  Mask = np.greater(Y, 1.0)\n"
+        "  #print Mask\n"
+        "  outs['Mask'] = Mask\n"
+        "  return True\n"
+    );
+    Option module("module", "MyModule1");
+    Option function("function", "yow2");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.predicate"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    Options statOpts;
+    std::unique_ptr<StatsFilter> stats(new StatsFilter);
+    stats->setOptions(statOpts);
+    stats->setInput(*filter);
+
+    PointTable table;
+
+    stats->prepare(table);
+    PointViewSet viewSet = stats->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+
+    const stats::Summary& statsX = stats->getStats(Dimension::Id::X);
+    const stats::Summary& statsY = stats->getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = stats->getStats(Dimension::Id::Z);
+
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.minimum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.minimum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.minimum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.maximum(), 2.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.maximum(), 2.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.maximum(), 2.0, 0.01));
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_test3)
+{
+    StageFactory f;
+    // can we make a pipeline with TWO python filters in it?
+
+    BOX3D bounds(0.0, 0.0, 0.0, 2.0, 2.0, 2.0);
+    Options readerOpts;
+    readerOpts.add("bounds", bounds);
+    readerOpts.add("num_points", 1000);
+    readerOpts.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(readerOpts);
+
+    // keep all points where x less than 1.0
+    const Option source1("source",
+        // "X < 1.0"
+        "import numpy as np\n"
+        "def yow1(ins,outs):\n"
+        "  X = ins['X']\n"
+        "  Mask = np.less(X, 1.0)\n"
+        "  #print X\n"
+        "  #print Mask\n"
+        "  outs['Mask'] = Mask\n"
+        "  return True\n"
+    );
+    const Option module1("module", "MyModule1");
+    const Option function1("function", "yow1");
+    Options opts1;
+    opts1.add(source1);
+    opts1.add(module1);
+    opts1.add(function1);
+
+    std::unique_ptr<Stage> filter1(f.createStage("filters.predicate"));
+    filter1->setOptions(opts1);
+    filter1->setInput(reader);
+
+    // keep all points where y greater than 0.5
+    const Option source2("source",
+        // "Y > 0.5"
+        "import numpy as np\n"
+        "def yow2(ins,outs):\n"
+        "  Y = ins['Y']\n"
+        "  Mask = np.greater(Y, 0.5)\n"
+        "  #print X\n"
+        "  #print Mask\n"
+        "  outs['Mask'] = Mask\n"
+        "  return True\n"
+    );
+    const Option module2("module", "MyModule2");
+    const Option function2("function", "yow2");
+    Options opts2;
+    opts2.add(source2);
+    opts2.add(module2);
+    opts2.add(function2);
+
+    std::unique_ptr<Stage> filter2(f.createStage("filters.predicate"));
+    filter2->setOptions(opts2);
+    filter2->setInput(*filter1);
+
+    Options statOpts;
+    std::unique_ptr<StatsFilter> stats(new StatsFilter);
+    stats->setOptions(statOpts);
+    stats->setInput(*filter2);
+
+    PointTable table;
+    stats->prepare(table);
+    stats->execute(table);
+
+    const stats::Summary& statsX = stats->getStats(Dimension::Id::X);
+    const stats::Summary& statsY = stats->getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = stats->getStats(Dimension::Id::Z);
+
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.minimum(), 0.5, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.minimum(), 0.5, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.minimum(), 0.5, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsX.maximum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsY.maximum(), 1.0, 0.01));
+    EXPECT_TRUE(Utils::compare_approx<double>(statsZ.maximum(), 1.0, 0.01));
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_test4)
+{
+    StageFactory f;
+    // test the point counters in the Predicate's iterator
+
+    BOX3D bounds(0.0, 0.0, 0.0, 2.0, 2.0, 2.0);
+    Options readerOpts;
+    readerOpts.add("bounds", bounds);
+    readerOpts.add("num_points", 1000);
+    readerOpts.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(readerOpts);
+
+    const Option source("source",
+        // "Y > 0.5"
+        "import numpy as np\n"
+        "def yow2(ins,outs):\n"
+        "  Y = ins['Y']\n"
+        "  Mask = np.greater(Y, 0.5)\n"
+        "  #print Mask\n"
+        "  outs['Mask'] = Mask\n"
+        "  return True\n"
+    );
+    const Option module("module", "MyModule1");
+    const Option function("function", "yow2");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.predicate"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    PointTable table;
+    PointViewPtr buf(new PointView(table));
+
+    filter->prepare(table);
+
+    StageWrapper::ready(reader, table);
+    PointViewSet viewSet = StageWrapper::run(reader, buf);
+    StageWrapper::done(reader, table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    buf = *viewSet.begin();
+    EXPECT_EQ(buf->size(), 1000u);
+
+    StageWrapper::ready(*filter, table);
+    viewSet = StageWrapper::run(*filter, buf);
+    StageWrapper::done(*filter, table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    buf = *viewSet.begin();
+    EXPECT_EQ(buf->size(), 750u);
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_test5)
+{
+    StageFactory f;
+    // test error handling if missing Mask
+
+    BOX3D bounds(0.0, 0.0, 0.0, 2.0, 2.0, 2.0);
+    Options readerOpts;
+    readerOpts.add("bounds", bounds);
+    readerOpts.add("num_points", 1000);
+    readerOpts.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(readerOpts);
+
+    const Option source("source",
+        // "Y > 0.5"
+        "import numpy as np\n"
+        "def yow2(ins,outs):\n"
+        "  Y = ins['Y']\n"
+        "  Mask = np.greater(Y, 0.5)\n"
+        "  #print Mask\n"
+        "  outs['xxxMaskxxx'] = Mask # delierbately rong\n"
+        "  return True\n"
+    );
+    const Option module("module", "MyModule1");
+    const Option function("function", "yow2");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.predicate"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    PointTable table;
+    filter->prepare(table);
+
+    ASSERT_THROW(filter->execute(table), pdal::pdal_error);
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_Pipeline)
+{
+    PipelineManager mgr;
+    PipelineReader reader(mgr);
+
+    reader.readPipeline(Support::configuredpath("plang/from-module.xml"));
+    point_count_t cnt = mgr.execute();
+    EXPECT_EQ(cnt, 1u);
+}
+
+TEST_F(PredicateFilterTest, PredicateFilterTest_Embed)
+{
+    PipelineManager mgr;
+    PipelineReader reader(mgr);
+
+    reader.readPipeline(Support::configuredpath("plang/predicate-embed.xml"));
+    point_count_t cnt = mgr.execute();
+    EXPECT_EQ(cnt, 1u);
+}
diff --git a/plugins/python/test/ProgrammableFilterTest.cpp b/plugins/python/test/ProgrammableFilterTest.cpp
new file mode 100644
index 0000000..35dc35f
--- /dev/null
+++ b/plugins/python/test/ProgrammableFilterTest.cpp
@@ -0,0 +1,239 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/StageFactory.hpp>
+#include <stats/StatsFilter.hpp>
+#include <faux/FauxReader.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+#include <pdal/plang/Environment.hpp>
+
+class ProgrammableFilterTest : public ::testing::Test
+{
+public:
+    virtual void SetUp()
+    {
+        pdal::plang::Environment::get();
+    }
+
+};
+TEST_F(ProgrammableFilterTest, ProgrammableFilterTest_test1)
+{
+    StageFactory f;
+
+    BOX3D bounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
+
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("num_points", 10);
+    ops.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Option source("source", "import numpy as np\n"
+        "def myfunc(ins,outs):\n"
+        "  X = ins['X']\n"
+        "  Y = ins['Y']\n"
+        "  Z = ins['Z']\n"
+        "  #print ins['X']\n"
+        "  X = X + 10.0\n"
+        "  # Y: leave as-is, don't export back out\n"
+        "  # Z: goofiness to make it a numpy array of a constant\n"
+        "  Z = np.zeros(X.size) + 3.14\n"
+        "  outs['X'] = X\n"
+        "  #print outs['X']\n"
+        "  outs['Z'] = Z\n"
+        "  return True\n"
+    );
+    Option module("module", "MyModule");
+    Option function("function", "myfunc");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.programmable"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    std::unique_ptr<StatsFilter> stats(new StatsFilter);
+    stats->setInput(*filter);
+
+    PointTable table;
+
+    stats->prepare(table);
+    PointViewSet viewSet = stats->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    const stats::Summary& statsX = stats->getStats(Dimension::Id::X);
+    const stats::Summary& statsY = stats->getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = stats->getStats(Dimension::Id::Z);
+
+    EXPECT_DOUBLE_EQ(statsX.minimum(), 10.0);
+    EXPECT_DOUBLE_EQ(statsX.maximum(), 11.0);
+
+    EXPECT_DOUBLE_EQ(statsY.minimum(), 0.0);
+    EXPECT_DOUBLE_EQ(statsY.maximum(), 1.0);
+
+    EXPECT_DOUBLE_EQ(statsZ.minimum(), 3.14);
+    EXPECT_DOUBLE_EQ(statsZ.maximum(), 3.14);
+}
+
+TEST_F(ProgrammableFilterTest, pipeline)
+{
+    PipelineManager manager;
+    PipelineReader reader(manager);
+
+    reader.readPipeline(
+        Support::configuredpath("plang/programmable-update-y-dims.xml"));
+    manager.execute();
+    PointViewSet viewSet = manager.views();
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    for (PointId idx = 0; idx < 10; ++idx)
+    {
+        int32_t y = view->getFieldAs<int32_t>(Dimension::Id::Y, idx);
+        EXPECT_EQ(y, 314);
+    }
+}
+
+
+TEST_F(ProgrammableFilterTest, add_dimension)
+{
+    StageFactory f;
+
+    BOX3D bounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
+
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("num_points", 10);
+    ops.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Option source("source", "import numpy\n"
+        "def myfunc(ins,outs):\n"
+        "  outs['AddedIntensity'] = np.zeros(ins['X'].size, dtype=numpy.double) + 1\n"
+        "  outs['AddedPointSourceId'] = np.zeros(ins['X'].size, dtype=numpy.double) + 2\n"
+        "  return True\n"
+    );
+    Option module("module", "MyModule");
+    Option function("function", "myfunc");
+    Option intensity("add_dimension", "AddedIntensity");
+    Option scanDirection("add_dimension", "AddedPointSourceId");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+    opts.add(intensity);
+    opts.add(scanDirection);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.programmable"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    PointTable table;
+    filter->prepare(table);
+    PointViewSet viewSet = filter->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    PointLayoutPtr layout(table.layout());
+
+    Dimension::Id::Enum int_id = layout->findDim("AddedIntensity");
+    Dimension::Id::Enum psid_id = layout->findDim("AddedPointSourceId");
+
+    for (unsigned int i = 0; i < view->size(); ++i)
+    {
+        EXPECT_EQ(view->getFieldAs<uint16_t>(int_id, i), 1);
+        EXPECT_EQ(view->getFieldAs<uint16_t>(psid_id, i), 2);
+    }
+}
+
+
+TEST_F(ProgrammableFilterTest, metadata)
+{
+    StageFactory f;
+
+    BOX3D bounds(0.0, 0.0, 0.0, 1.0, 1.0, 1.0);
+
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("num_points", 10);
+    ops.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Option source("source", "import numpy\n"
+        "def myfunc(ins,outs,inmeta,outmeta):\n"
+        "  t = ('name', 'value', '', '', [])\n"
+        "  outmeta.append(t)\n"
+        "  return True\n"
+    );
+    Option module("module", "MyModule");
+    Option function("function", "myfunc");
+    Options opts;
+    opts.add(source);
+    opts.add(module);
+    opts.add(function);
+
+    std::unique_ptr<Stage> filter(f.createStage("filters.programmable"));
+    filter->setOptions(opts);
+    filter->setInput(reader);
+
+    PointTable table;
+    filter->prepare(table);
+    PointViewSet viewSet = filter->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    PointLayoutPtr layout(table.layout());
+    MetadataNode m = table.metadata();
+    m = m.findChild("filters.programmable");
+    MetadataNodeList l = m.children();
+    EXPECT_EQ(l.size(), 1u);
+//     EXPECT_EQ(l[0].name(), "name");
+//     EXPECT_EQ(l[0].value(), "value");
+}
diff --git a/plugins/rxp/CMakeLists.txt b/plugins/rxp/CMakeLists.txt
new file mode 100644
index 0000000..8c2d340
--- /dev/null
+++ b/plugins/rxp/CMakeLists.txt
@@ -0,0 +1,38 @@
+set(RXP_TEST_NAME rxptest)
+
+find_package(RiVLib COMPONENTS scanlib REQUIRED)
+set_package_properties(RiVLib PROPERTIES
+    TYPE REQUIRED
+    PURPOSE "Read data from Riegl sensors"
+    )
+
+include_directories(${RiVLib_INCLUDE_DIRS})
+message(STATUS "Found RiVLib at: ${RiVLib_INCLUDE_DIRS}")
+
+set(incs
+    io/RxpPointcloud.hpp
+    io/RxpReader.hpp
+    )
+
+set(srcs
+    io/RxpPointcloud.cpp
+    io/RxpReader.cpp
+    )
+
+PDAL_ADD_PLUGIN(libname reader rxp
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${RiVLib_SCANLIB_LIBRARY})
+
+if (BUILD_RIVLIB_TESTS)
+    configure_file(
+        test/Config.hpp.in
+        "${CMAKE_CURRENT_BINARY_DIR}/test/Config.hpp"
+    )
+
+    include_directories("${CMAKE_CURRENT_BINARY_DIR}/test")
+    include_directories(${PROJECT_SOURCE_DIR}/plugins/rxp/io)
+
+    PDAL_ADD_TEST(${RXP_TEST_NAME}
+        FILES test/RxpReaderTest.cpp
+        LINK_WITH ${libname})
+endif (BUILD_RIVLIB_TESTS)
diff --git a/plugins/rxp/io/RxpPointcloud.cpp b/plugins/rxp/io/RxpPointcloud.cpp
new file mode 100644
index 0000000..14160ca
--- /dev/null
+++ b/plugins/rxp/io/RxpPointcloud.cpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+*
+*
+* This software has not been developed by RIEGL, and RIEGL will not provide any
+* support for this driver. Please do not contact RIEGL with any questions or
+* issues regarding this driver. RIEGL is not responsible for damages or other
+* issues that arise from use of this driver. This driver has been tested
+* against RiVLib version 1.39 on a Ubuntu 14.04 using gcc43.
+ ****************************************************************************/
+
+#include "RxpPointcloud.hpp"
+
+
+namespace pdal
+{
+
+
+Dimension::Id::Enum getTimeDimensionId(bool syncToPps)
+{
+    return syncToPps ? Dimension::Id::GpsTime : Dimension::Id::InternalTime;
+}
+
+
+RxpPointcloud::RxpPointcloud(
+        const std::string& uri,
+        bool syncToPps,
+        bool minimal,
+        PointTableRef table)
+    : scanlib::pointcloud(syncToPps)
+    , m_view(new PointView(table))
+    , m_idx(0)
+    , m_syncToPps(syncToPps)
+    , m_minimal(minimal)
+    , m_rc(scanlib::basic_rconnection::create(uri))
+    , m_dec(m_rc)
+{}
+
+
+RxpPointcloud::~RxpPointcloud()
+{
+    m_rc->close();
+}
+
+
+point_count_t RxpPointcloud::read(PointViewPtr view, point_count_t count)
+{
+    point_count_t numRead = 0;
+
+    if (m_idx < m_view->size())
+    {
+        numRead += writeSavedPoints(view, count);
+        if (numRead == count)
+            return numRead;
+    }
+
+    for (m_dec.get(m_rxpbuf); !m_dec.eoi(); m_dec.get(m_rxpbuf))
+    {
+        dispatch(m_rxpbuf.begin(), m_rxpbuf.end());
+        if (m_view->size() - m_idx + numRead >= count) break;
+    }
+
+    numRead += writeSavedPoints(view, count - numRead);
+
+    return numRead;
+}
+
+
+point_count_t RxpPointcloud::writeSavedPoints(PointViewPtr view, point_count_t count)
+{
+    point_count_t numRead = 0;
+    while (m_idx < m_view->size() && numRead < count)
+    {
+        view->appendPoint(*m_view, m_idx);
+        ++m_idx, ++numRead;
+    }
+    return numRead;
+};
+
+
+void RxpPointcloud::on_echo_transformed(echo_type echo)
+{
+    if (!(scanlib::pointcloud::single == echo || scanlib::pointcloud::last == echo))
+    {
+        // Come back later, when we've got all the echos
+        return;
+    }
+
+    using namespace Dimension;
+
+    point_count_t idx = m_view->size();
+    unsigned int returnNumber = 1;
+    Id::Enum timeId = getTimeDimensionId(m_syncToPps);
+    for (const auto& t : targets)
+    {
+        m_view->setField(Id::X, idx, t.vertex[0]);
+        m_view->setField(Id::Y, idx, t.vertex[1]);
+        m_view->setField(Id::Z, idx, t.vertex[2]);
+        m_view->setField(timeId, idx, t.time);
+        if (!m_minimal)
+        {
+            m_view->setField(Id::Amplitude, idx, t.amplitude);
+            m_view->setField(Id::Reflectance, idx, t.reflectance);
+            m_view->setField(Id::ReturnNumber, idx, returnNumber);
+            m_view->setField(Id::NumberOfReturns, idx, targets.size());
+            m_view->setField(Id::EchoRange, idx, t.echo_range);
+            m_view->setField(Id::Deviation, idx, t.deviation);
+            m_view->setField(Id::BackgroundRadiation, idx, t.background_radiation);
+            m_view->setField(Id::IsPpsLocked, idx, t.is_pps_locked);
+        }
+        ++idx, ++returnNumber;
+    }
+}
+
+
+}
diff --git a/plugins/rxp/io/RxpPointcloud.hpp b/plugins/rxp/io/RxpPointcloud.hpp
new file mode 100644
index 0000000..efeaecd
--- /dev/null
+++ b/plugins/rxp/io/RxpPointcloud.hpp
@@ -0,0 +1,92 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+*
+*
+* This software has not been developed by RIEGL, and RIEGL will not provide any
+* support for this driver. Please do not contact RIEGL with any questions or
+* issues regarding this driver. RIEGL is not responsible for damages or other
+* issues that arise from use of this driver. This driver has been tested
+* against RiVLib version 1.39 on a Ubuntu 14.04 using gcc43.
+ ****************************************************************************/
+
+#pragma once
+
+#include <riegl/scanlib.hpp>
+
+#include <pdal/pdal_macros.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/PointView.hpp>
+
+
+namespace pdal
+{
+
+
+Dimension::Id::Enum getTimeDimensionId(bool syncToPps);
+
+
+class PDAL_DLL RxpPointcloud : public scanlib::pointcloud
+{
+public:
+    RxpPointcloud(
+            const std::string& uri,
+            bool isSyncToPps,
+            bool m_minimal,
+            PointTableRef table);
+    virtual ~RxpPointcloud();
+
+    point_count_t read(PointViewPtr view, point_count_t count);
+
+    inline bool isSyncToPps() const
+    {
+        return m_syncToPps;
+    }
+
+protected:
+    void on_echo_transformed(echo_type echo);
+
+private:
+    virtual point_count_t writeSavedPoints(PointViewPtr view, point_count_t count);
+
+    PointViewPtr m_view;
+    point_count_t m_idx;
+    bool m_syncToPps;
+    bool m_minimal;
+    std::shared_ptr<scanlib::basic_rconnection> m_rc;
+    scanlib::decoder_rxpmarker m_dec;
+    scanlib::buffer m_rxpbuf;
+
+};
+
+
+} // namespace pdal
diff --git a/plugins/rxp/io/RxpReader.cpp b/plugins/rxp/io/RxpReader.cpp
new file mode 100644
index 0000000..51a38b2
--- /dev/null
+++ b/plugins/rxp/io/RxpReader.cpp
@@ -0,0 +1,142 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+*
+* This software has not been developed by RIEGL, and RIEGL will not provide any
+* support for this driver. Please do not contact RIEGL with any questions or
+* issues regarding this driver. RIEGL is not responsible for damages or other
+* issues that arise from use of this driver. This driver has been tested
+* against RiVLib version 1.39 on a Ubuntu 14.04 using gcc43.
+****************************************************************************/
+
+#include "RxpReader.hpp"
+
+#include <pdal/StageFactory.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.rxp",
+    "RXP Reader",
+    "http://pdal.io/stages/readers.rxp.html" );
+
+CREATE_SHARED_PLUGIN(1, 0, RxpReader, Reader, s_info)
+
+std::string RxpReader::getName() const { return s_info.name; }
+
+std::string extractRivlibURI(const Options& options)
+{
+    if (options.hasOption("filename"))
+    {
+        if (options.hasOption("rdtp"))
+        {
+            throw pdal_error("Cannot create URI when both filename "
+                "and rdtp are provided");
+        }
+        return "file:" + options.getValueOrThrow<std::string>("filename");
+    }
+    else
+    {
+        return "rdtp://" + options.getValueOrThrow<std::string>("rdtp");
+    }
+}
+
+
+Dimension::IdList getRxpDimensions(bool syncToPps, bool minimal)
+{
+    using namespace Dimension;
+    Dimension::IdList ids;
+
+    ids.push_back(Id::X);
+    ids.push_back(Id::Y);
+    ids.push_back(Id::Z);
+    ids.push_back(getTimeDimensionId(syncToPps));
+    if (!minimal)
+    {
+        ids.push_back(Id::ReturnNumber);
+        ids.push_back(Id::NumberOfReturns);
+        ids.push_back(Id::Amplitude);
+        ids.push_back(Id::Reflectance);
+        ids.push_back(Id::EchoRange);
+        ids.push_back(Id::Deviation);
+        ids.push_back(Id::BackgroundRadiation);
+        ids.push_back(Id::IsPpsLocked);
+    }
+
+    return ids;
+}
+
+
+Options RxpReader::getDefaultOptions()
+{
+    Options options;
+    options.add("sync_to_pps", DEFAULT_SYNC_TO_PPS, "");
+    options.add("minimal", DEFAULT_MINIMAL, "");
+    return options;
+}
+
+
+void RxpReader::processOptions(const Options& options)
+{
+    m_uri = extractRivlibURI(options);
+    m_syncToPps = options.getValueOrDefault<bool>("sync_to_pps",
+                                                  DEFAULT_SYNC_TO_PPS);
+}
+
+
+void RxpReader::addDimensions(PointLayoutPtr layout)
+{
+    layout->registerDims(getRxpDimensions(m_syncToPps, m_minimal));
+}
+
+
+void RxpReader::ready(PointTableRef table)
+{
+    m_pointcloud.reset(new RxpPointcloud(m_uri, m_syncToPps, m_minimal, table));
+}
+
+
+point_count_t RxpReader::read(PointViewPtr view, point_count_t count)
+{
+    point_count_t numRead = m_pointcloud->read(view, count);
+    return numRead;
+}
+
+
+void RxpReader::done(PointTableRef table)
+{
+    m_pointcloud.reset();
+}
+
+
+} // namespace pdal
diff --git a/plugins/rxp/io/RxpReader.hpp b/plugins/rxp/io/RxpReader.hpp
new file mode 100644
index 0000000..041059e
--- /dev/null
+++ b/plugins/rxp/io/RxpReader.hpp
@@ -0,0 +1,98 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+*
+*
+* This software has not been developed by RIEGL, and RIEGL will not provide any
+* support for this driver. Please do not contact RIEGL with any questions or
+* issues regarding this driver. RIEGL is not responsible for damages or other
+* issues that arise from use of this driver. This driver has been tested
+* against RiVLib version 1.39 on a Ubuntu 14.04 using gcc43.
+ ****************************************************************************/
+
+#pragma once
+
+#include <memory>
+
+#include <pdal/PointView.hpp>
+#include <pdal/Reader.hpp>
+#include "RxpPointcloud.hpp"
+
+
+namespace pdal
+{
+
+
+const bool DEFAULT_SYNC_TO_PPS = true;
+const bool DEFAULT_MINIMAL = false;
+
+
+std::string extractRivlibURI(const Options& options);
+Dimension::IdList getRxpDimensions(bool syncToPps, bool minimal);
+
+
+class PDAL_DLL RxpReader : public pdal::Reader
+{
+public:
+    RxpReader()
+        : pdal::Reader()
+        , m_uri("")
+        , m_syncToPps(DEFAULT_SYNC_TO_PPS)
+        , m_pointcloud()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    static Dimension::IdList getDefaultDimensions()
+    {
+        return getRxpDimensions(DEFAULT_SYNC_TO_PPS, DEFAULT_MINIMAL);
+    }
+
+private:
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    virtual point_count_t read(PointViewPtr view, point_count_t count);
+    virtual void done(PointTableRef table);
+
+    std::string m_uri;
+    bool m_syncToPps;
+    bool m_minimal;
+    std::unique_ptr<RxpPointcloud> m_pointcloud;
+
+};
+
+
+} // namespace pdal
diff --git a/plugins/rxp/test/Config.hpp.in b/plugins/rxp/test/Config.hpp.in
new file mode 100644
index 0000000..752a990
--- /dev/null
+++ b/plugins/rxp/test/Config.hpp.in
@@ -0,0 +1,13 @@
+#pragma once
+
+namespace pdal
+{
+
+
+inline std::string testDataPath()
+{
+    return "@CMAKE_SOURCE_DIR@/plugins/rxp/test/data/";
+}
+
+
+}
diff --git a/plugins/rxp/test/RxpReaderTest.cpp b/plugins/rxp/test/RxpReaderTest.cpp
new file mode 100644
index 0000000..458e0e3
--- /dev/null
+++ b/plugins/rxp/test/RxpReaderTest.cpp
@@ -0,0 +1,166 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, view, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Options.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PointView.hpp>
+
+#include "RxpReader.hpp"
+#include "Config.hpp"
+
+using namespace pdal;
+
+Options defaultRxpReaderOptions()
+{
+    Options options;
+    Option filename("filename",
+        testDataPath() + "130501_232206_cut.rxp", "");
+    options.add(filename);
+    return options;
+}
+
+template <typename T>
+void checkDimensionClose(const PointViewPtr view,
+                         std::size_t index,
+                         Dimension::Id::Enum dim,
+                         T expected)
+{
+    T actual = view->getFieldAs<T>(dim, index);
+    EXPECT_FLOAT_EQ(expected, actual);
+}
+
+template <typename T>
+void checkDimensionEqual(const PointViewPtr view,
+                         std::size_t index,
+                         Dimension::Id::Enum dim,
+                         T expected)
+{
+    T actual = view->getFieldAs<T>(dim, index);
+    EXPECT_EQ(expected, actual);
+}
+
+void checkPoint(const PointViewPtr view, std::size_t index,
+                float x, float y, float z,
+                double time, double echoRange, float amplitude,
+                float reflectance, float deviation,
+                bool isPpsLocked, uint8_t returnNumber,
+                uint8_t numberOfReturns
+                )
+{
+    using namespace Dimension;
+    checkDimensionClose(view, index, Id::X, x);
+    checkDimensionClose(view, index, Id::Y, y);
+    checkDimensionClose(view, index, Id::Z, z);
+    checkDimensionClose(view,
+                        index,
+                        getTimeDimensionId(isPpsLocked),
+                        time);
+    checkDimensionClose(view, index, Id::EchoRange, echoRange);
+    checkDimensionClose(view, index, Id::Amplitude, amplitude);
+    checkDimensionClose(view, index, Id::Reflectance, reflectance);
+    checkDimensionClose(view, index, Id::Deviation, deviation);
+    checkDimensionEqual(view, index, Id::IsPpsLocked, isPpsLocked);
+    checkDimensionEqual(view, index, Id::ReturnNumber, returnNumber);
+    checkDimensionEqual(view, index, Id::NumberOfReturns, numberOfReturns);
+}
+
+TEST(RxpReaderTest, testConstructor)
+{
+    Options options = defaultRxpReaderOptions();
+    RxpReader reader;
+    reader.setOptions(options);
+    EXPECT_EQ(reader.getName(), "readers.rxp");
+}
+
+TEST(RxpReaderTest, testRead)
+{
+    Options options = defaultRxpReaderOptions();
+    RxpReader reader;
+    reader.setOptions(options);
+
+    PointTable table;
+    reader.prepare(table);
+
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 177208);
+
+    checkPoint(view, 0, 2.2630672454833984, -0.038407701998949051, -1.3249952793121338, 342656.34233957872,
+            2.6865001276019029, 19.8699989, 5.70246553, 4, true, 1, 1);
+    checkPoint(view, 1, 2.2641847133636475, -0.038409631699323654, -1.3245694637298584, 342656.34235912003,
+            2.687250127637526, 19.5299988, 5.36292124, 2, true, 1, 1);
+    checkPoint(view, 2, 2.26853346824646, -0.038410264998674393, -1.3260456323623657, 342656.34237866144,
+            2.6917501278512646, 19.3699989, 5.2056551, 5, true, 1, 1);
+}
+
+TEST(RxpReaderTest, testNoPpsSync)
+{
+    Options options = defaultRxpReaderOptions();
+    Option syncToPps("sync_to_pps", "false", "");
+    options.add(syncToPps);
+    RxpReader reader;
+    reader.setOptions(options);
+
+    PointTable table;
+    reader.prepare(table);
+
+    PointViewSet viewSet = reader.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    checkPoint(view, 0, 0.0705248788, -0.0417557284, 0.0304775704, 31.917255942733149,
+            0.14050000667339191, 0.689999998, -14.4898596, 3, false, 1, 1);
+}
+
+TEST(RxpReaderTest, testURILogic)
+{
+    Option fileOption("filename", "foobar", "");
+    Options fileOptions(fileOption);
+    EXPECT_EQ(extractRivlibURI(fileOptions), "file:foobar");
+
+    Option rdtpOption("rdtp", "192.168.0.33", "");
+    Options rdtpOptions(rdtpOption);
+    EXPECT_EQ(extractRivlibURI(rdtpOptions), "rdtp://192.168.0.33");
+
+    Options emptyOptions;
+    EXPECT_THROW(extractRivlibURI(emptyOptions), Option::not_found);
+
+    Options bothOptions;
+    bothOptions.add(fileOption);
+    bothOptions.add(rdtpOption);
+    EXPECT_THROW(extractRivlibURI(bothOptions), pdal_error);
+}
diff --git a/plugins/rxp/test/data/130501_232206_cut.rxp b/plugins/rxp/test/data/130501_232206_cut.rxp
new file mode 100644
index 0000000..13b0fd4
Binary files /dev/null and b/plugins/rxp/test/data/130501_232206_cut.rxp differ
diff --git a/plugins/sqlite/CMakeLists.txt b/plugins/sqlite/CMakeLists.txt
new file mode 100644
index 0000000..19d1935
--- /dev/null
+++ b/plugins/sqlite/CMakeLists.txt
@@ -0,0 +1,39 @@
+#
+# SQLite plugin CMake configuration
+#
+
+include (${PDAL_CMAKE_DIR}/sqlite.cmake)
+#
+# SQLite Reader
+#
+set(srcs io/SQLiteReader.cpp)
+set(incs
+    io/SQLiteCommon.hpp
+    io/SQLiteReader.hpp
+)
+
+PDAL_ADD_PLUGIN(reader_libname reader sqlite
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${SQLITE3_LIBRARY})
+
+#
+# SQLite Writer
+#
+set(srcs io/SQLiteWriter.cpp)
+set(incs
+    io/SQLiteCommon.hpp
+    io/SQLiteWriter.hpp
+)
+
+PDAL_ADD_PLUGIN(writer_libname writer sqlite
+    FILES "${srcs}" "${incs}"
+    LINK_WITH ${SQLITE3_LIBRARY})
+
+#
+# SQLite tests
+#
+if(BUILD_SQLITE_TESTS)
+	PDAL_ADD_TEST(sqlitetest
+        FILES test/SQLiteTest.cpp
+        LINK_WITH ${reader_libname} ${writer_libname})
+endif()
diff --git a/plugins/sqlite/io/SQLiteCommon.hpp b/plugins/sqlite/io/SQLiteCommon.hpp
new file mode 100644
index 0000000..20b17dc
--- /dev/null
+++ b/plugins/sqlite/io/SQLiteCommon.hpp
@@ -0,0 +1,578 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/Options.hpp>
+#include <pdal/Log.hpp>
+#include <pdal/XMLSchema.hpp>
+#include <pdal/Compression.hpp>
+
+#include <sqlite3.h>
+#include <memory>
+#include <sstream>
+
+namespace pdal
+{
+
+class column
+{
+public:
+
+    column() : null(true), blobBuf(0), blobLen(0){};
+    template<typename T> column( T v) : null(false), blobBuf(0), blobLen(0)
+    {
+        data = boost::lexical_cast<std::string>(v);
+    }
+    column(std::string v) : null(false), blobBuf(0), blobLen(0)
+    {
+        data = v;
+    }
+
+    std::string data;
+    bool null;
+    std::vector<uint8_t> blobBuf;
+    std::size_t blobLen;
+};
+
+class blob : public column
+{
+public:
+    blob(const char* buffer, std::size_t size) : column()
+    {
+        blobBuf.resize(size);
+        std::copy(buffer, buffer+size, blobBuf.begin());
+        blobLen = size;
+        null = false;
+
+    }
+};
+
+typedef std::vector<column> row;
+typedef std::vector<row> records;
+
+class Patch
+{
+public:
+    Patch() : count(0), remaining(0), m_isCompressed(false), idx(0)
+    {}
+
+    point_count_t count;
+    point_count_t remaining;
+
+    MetadataNode m_metadata;
+    bool m_isCompressed;
+    std::string m_compVersion;
+    std::vector<unsigned char> buf;
+    size_t idx;
+
+    void putBytes(const unsigned char* b, size_t len) {
+        while(len --) {
+            buf.push_back(*b++);
+        }
+    }
+
+    void putByte(const unsigned char b) {
+        buf.push_back(b);
+    }
+
+    unsigned char getByte() {
+        return buf[idx++];
+    }
+
+    void getBytes(unsigned char *b, int len) {
+        for (int i = 0 ; i < len ; i ++) {
+            b[i] = getByte();
+        }
+    }
+
+    void setBytes(const std::vector<uint8_t>& data)
+        { buf = data; }
+
+    const std::vector<uint8_t>& getBytes() const
+        { return buf; }
+
+    size_t byte_size()
+        { return buf.size(); }
+};
+typedef std::shared_ptr<Patch> PatchPtr;
+
+
+class SQLite
+{
+public:
+    SQLite(std::string const& connection, LogPtr log)
+        : m_log(log)
+        , m_connection(connection)
+        , m_session(0)
+        , m_statement(0)
+        , m_position(-1)
+    {
+        m_log->get(LogLevel::Debug3) << "Setting up config " << std::endl;
+        sqlite3_shutdown();
+        sqlite3_config(SQLITE_CONFIG_LOG, log_callback, this);
+        sqlite3_initialize();
+        m_log->get(LogLevel::Debug3) << "Set up config " << std::endl;
+        m_log->get(LogLevel::Debug3) << "SQLite version: " << sqlite3_libversion() << std::endl;
+    }
+
+    ~SQLite()
+    {
+
+        if (m_session)
+        {
+#ifdef sqlite3_close_v2
+            sqlite3_close_v2(m_session);
+#else
+            sqlite3_close(m_session);
+#endif
+        }
+        sqlite3_shutdown();
+
+    }
+
+    static void log_callback(void *p, int num, char const* msg)
+    {
+        SQLite* sql = reinterpret_cast<SQLite*>(p);
+        sql->log()->get(LogLevel::Debug) << "SQLite code: "
+            << num << " msg: '" << msg << "'"
+            << std::endl;
+    }
+
+
+    void connect(bool bWrite=false)
+    {
+        if (!m_connection.size())
+        {
+            throw pdal_error("Unable to connect to database: empty connection string [SQLite::connect]");
+        }
+
+        int flags = SQLITE_OPEN_NOMUTEX;
+        if (bWrite)
+        {
+            m_log->get(LogLevel::Debug3) << "Connecting db for write"<< std::endl;
+            flags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE;
+        }
+        else
+        {
+            m_log->get(LogLevel::Debug3) << "Connecting db for read"<< std::endl;
+            flags |= SQLITE_OPEN_READONLY;
+        }
+
+        int status = sqlite3_open_v2(m_connection.c_str(), &m_session, flags, 0);
+        if (status != SQLITE_OK)
+        {
+            error("Unable to open database", "connect");
+        }
+    }
+
+    void execute(std::string const& sql)
+    {
+        checkSession();
+
+        m_log->get(LogLevel::Debug3) << "Executing '" << sql <<"'"<< std::endl;
+
+        int status = sqlite3_exec(m_session, sql.c_str(), NULL, NULL, NULL);
+        if (status != SQLITE_OK)
+        {
+            std::ostringstream oss;
+            oss << "Database operation failed: "
+                << sql;
+            error(oss.str(), "execute");
+        }
+    }
+
+    void begin()
+    {
+        execute("BEGIN");
+    }
+
+    void commit()
+    {
+        execute("COMMIT");
+    }
+
+    // Executes an SQL query statement and provides the returned rows via
+    // an iterator.
+    //
+    // Usage example:
+    //   query("SELECT * from TABLE");
+    //     do
+    //     {
+    //       const row* r = get();
+    //       if (!r) break ; // no more rows
+    //       column const& c = r->at(0); // get 1st column of this row
+    //       ... use c.data ...
+    //     } while (next());
+    //
+    void query(std::string const& query)
+    {
+        checkSession();
+
+        m_position = 0;
+        m_columns.clear();
+        m_data.clear();
+        assert(!m_statement);
+
+        int status;
+
+        m_log->get(LogLevel::Debug3) << "Querying '" << query.c_str() <<"'"<< std::endl;
+
+        char const* tail = 0; // unused;
+        status = sqlite3_prepare_v2(m_session,
+                                    query.c_str(),
+                                    static_cast<int>(query.size()),
+                                    &m_statement,
+                                    &tail);
+        if (status != SQLITE_OK)
+        {
+            error("query preparation failed", "query");
+        }
+
+        int numCols = -1;
+
+        while (status != SQLITE_DONE)
+        {
+            status = sqlite3_step(m_statement);
+
+            if (SQLITE_ROW == status)
+            {
+                // only need to set the number of columns once
+                if (-1 == numCols)
+                {
+                    numCols = sqlite3_column_count(m_statement);
+                }
+
+                row r;
+                for (int v = 0; v < numCols; ++v)
+                {
+
+                    if (m_columns.size() != static_cast<std::vector<std::string>::size_type > (numCols))
+                    {
+                        std::string ccolumnName = Utils::toupper(std::string(sqlite3_column_name(m_statement, v)));
+                        const char* coltype = sqlite3_column_decltype(m_statement, v);
+                        if (!coltype)
+                        {
+                            coltype = "unknown";
+                        }
+                        std::string ccolumnType = Utils::toupper(std::string(coltype));
+                        m_columns.insert(std::pair<std::string, int32_t>(ccolumnName, v));
+                        m_types.push_back(ccolumnType);
+                    }
+
+                    column c;
+
+                    if (sqlite3_column_type(m_statement, v) == SQLITE_BLOB)
+                    {
+                        int len = sqlite3_column_bytes(m_statement, v);
+                        const char* buf = (const char*) sqlite3_column_blob(m_statement, v);
+                        c.blobLen = len;
+                        c.blobBuf.resize(len);
+                        std::copy(buf, buf+len, c.blobBuf.begin());
+                    } else if (sqlite3_column_type(m_statement, v) == SQLITE_NULL)
+                    {
+                        c.null = true;
+                    } else
+                    {
+                        char const* buf =
+                            reinterpret_cast<char const*>(sqlite3_column_text(m_statement, v));
+
+                        if (0 == buf)
+                        {
+                            c.null = true;
+                            buf = "";
+                        }
+                        c.data = buf;
+                    }
+
+
+                    r.push_back(c);
+                }
+                m_data.push_back(r);
+            }
+            else if (status == SQLITE_DONE)
+            {
+                // ok
+            }
+            else
+            {
+                error("query step failed", "query");
+            }
+        }
+
+        status = sqlite3_finalize(m_statement);
+        if (status != SQLITE_OK)
+        {
+            error("query finalization failed", "query");
+        }
+
+        m_statement = NULL;
+    }
+
+    bool next()
+    {
+        m_position++;
+
+        if (m_position >= m_data.size())
+            return false;
+        return true;
+    }
+
+    const row* get() const
+    {
+        if ( m_position >= m_data.size() )
+            return 0;
+        else
+            return &m_data[m_position];
+    }
+
+    std::map<std::string, int32_t> const& columns() const
+    {
+        return m_columns;
+    }
+
+    std::vector<std::string> const& types() const
+    {
+        return m_types;
+    }
+
+
+    int64_t last_row_id() const
+    {
+        return (int64_t)sqlite3_last_insert_rowid(m_session);
+    }
+
+    void insert(std::string const& statement, records const& rs)
+    {
+        checkSession();
+
+        int status;
+
+        records::size_type rows = rs.size();
+
+        assert(!m_statement);
+        status = sqlite3_prepare_v2(m_session,
+                                    statement.c_str(),
+                                    static_cast<int>(statement.size()),
+                                    &m_statement,
+                                    0);
+        if (status != SQLITE_OK)
+        {
+            error("insert preparation failed", "insert");
+        }
+
+        m_log->get(LogLevel::Debug3) << "Inserting '" << statement << "'"<<
+            std::endl;
+
+        for (records::size_type r = 0; r < rows; ++r)
+        {
+            int const totalPositions = static_cast<int>(rs[0].size());
+            for (int pos = 0; pos <= totalPositions-1; ++pos)
+            {
+                const column& c = rs[r][pos];
+                if (c.null)
+                {
+                    status = sqlite3_bind_null(m_statement, pos+1);
+                }
+                else if (c.blobLen != 0)
+                {
+                    status = sqlite3_bind_blob(m_statement, pos+1,
+                                               &(c.blobBuf.front()),
+                                               static_cast<int>(c.blobLen),
+                                               SQLITE_STATIC);
+                }
+                else
+                {
+                    status = sqlite3_bind_text(m_statement, pos+1,
+                                               c.data.c_str(),
+                                               static_cast<int>(c.data.length()),
+                                               SQLITE_STATIC);
+                }
+
+                if (SQLITE_OK != status)
+                {
+                    std::ostringstream oss;
+                    oss << "insert bind failed (row=" << r
+                        <<", position=" << pos
+                        << ")";
+                    error(oss.str(), "insert");
+                }
+            }
+
+            status = sqlite3_step(m_statement);
+
+            if (status != SQLITE_DONE && status != SQLITE_ROW)
+            {
+                error("insert step failed", "insert");
+            }
+        }
+
+        status = sqlite3_finalize(m_statement);
+        if (status != SQLITE_OK)
+        {
+            error("insert finalize failed", "insert");
+        }
+
+        m_statement = NULL;
+    }
+
+    bool loadSpatialite(const std::string& module_name="")
+    {
+        std::string so_extension;
+        std::string lib_extension;
+#ifdef __APPLE__
+        so_extension = "dylib";
+        lib_extension = "mod_";
+#endif
+
+#ifdef __linux__
+        so_extension = "so";
+        lib_extension = "lib";
+#endif
+
+#ifdef _WIN32
+        so_extension = "dll";
+        lib_extension = "mod_";
+#endif
+
+// #if !defined(sqlite3_enable_load_extension)
+// #error "sqlite3_enable_load_extension and spatialite is required for sqlite PDAL support"
+// #endif
+        int status = sqlite3_enable_load_extension(m_session, 1);
+        if (status != SQLITE_OK)
+        {
+            error("spatialite library load failed", "loadSpatialite");
+        }
+
+        std::ostringstream oss;
+
+        oss << "SELECT load_extension('";
+        if (module_name.size())
+            oss << module_name;
+        else
+            oss << lib_extension << "spatialite" << "." << so_extension;
+        oss << "')";
+        execute(oss.str());
+        oss.str("");
+
+        m_log->get(LogLevel::Debug3) <<  "SpatiaLite version: " << getSpatialiteVersion() << std::endl;
+
+        return true;
+
+    }
+
+    bool haveSpatialite()
+    {
+        return doesTableExist("geometry_columns");
+    }
+
+    void initSpatialiteMetadata()
+    {
+        execute("SELECT InitSpatialMetadata(1)");
+    }
+
+    bool doesTableExist(std::string const& name)
+    {
+        const std::string sql("SELECT name FROM sqlite_master WHERE type = 'table'");
+
+        query(sql);
+
+        do
+        {
+            const row* r = get();
+            if (!r)
+                break ;// didn't have anything
+
+            column const& c = r->at(0); // First column is table name!
+            if (Utils::iequals(c.data, name))
+            {
+                return true;
+            }
+        } while (next());
+        return false;
+    }
+
+    std::string getSpatialiteVersion()
+    {
+        // TODO: ought to parse this numerically, so we can do version checks
+        const std::string sql("SELECT spatialite_version()");
+        query(sql);
+
+        const row* r = get();
+        assert(r); // should get back exactly one row
+        std::string ver = r->at(0).data;
+        return ver;
+    }
+
+    std::string getSQLiteVersion()
+    {
+         // TODO: parse this numerically, so we can do version checks
+         std::string v(sqlite3_libversion());
+         return v;
+    }
+
+    LogPtr log() { return m_log; };
+
+private:
+    pdal::LogPtr m_log;
+    std::string m_connection;
+    sqlite3* m_session;
+    sqlite3_stmt* m_statement;
+    records m_data;
+    records::size_type m_position;
+    std::map<std::string, int32_t> m_columns;
+    std::vector<std::string> m_types;
+
+    void error(std::string const& userMssg, std::string const& func)
+    {
+        char const* sqlMssg = sqlite3_errmsg(m_session);
+
+        std::ostringstream oss;
+        oss << userMssg
+           << " [SQLite::" << func << "]"
+           << std::endl
+           << "sqlite3 error: " << sqlMssg;
+        throw pdal_error(oss.str());
+    }
+
+    void checkSession()
+    {
+        if (!m_session)
+        {
+            throw pdal_error("Database session not opened [SQLite::execute]");
+        }
+    }
+};
+
+} // namespace pdal
diff --git a/plugins/sqlite/io/SQLiteReader.cpp b/plugins/sqlite/io/SQLiteReader.cpp
new file mode 100644
index 0000000..48b7029
--- /dev/null
+++ b/plugins/sqlite/io/SQLiteReader.cpp
@@ -0,0 +1,343 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, howard at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SQLiteReader.hpp"
+#include <pdal/PointView.hpp>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "readers.sqlite",
+    "Read data from SQLite3 database files.",
+    "" );
+
+CREATE_SHARED_PLUGIN(1, 0, SQLiteReader, Reader, s_info)
+
+std::string SQLiteReader::getName() const { return s_info.name; }
+
+void SQLiteReader::initialize()
+{
+    try
+    {
+        log()->get(LogLevel::Debug) << "Connection: '" << m_connection << "'" <<
+            std::endl;
+        m_session = std::unique_ptr<SQLite>(new SQLite(m_connection, log()));
+        m_session->connect(false); // don't connect in write mode
+        log()->get(LogLevel::Debug) << "Connected to database" << std::endl;
+        
+        bool bHaveSpatialite = m_session->haveSpatialite();
+        log()->get(LogLevel::Debug) << "Have spatialite?: " <<
+            bHaveSpatialite << std::endl;
+        m_session->loadSpatialite(m_modulename);
+
+        if (!bHaveSpatialite)
+        {
+            throw pdal_error("no spatialite enabled!");
+        }
+
+    }
+    catch (pdal_error const& e)
+    {
+        std::stringstream oss;
+        oss << "Unable to connect to database with error '" << e.what() << "'";
+        throw pdal_error(oss.str());
+    }
+    try
+    {
+        setSpatialReference(
+            m_options.getValueOrThrow<pdal::SpatialReference>(
+                "spatialreference"));
+    }
+    catch (Option::not_found)
+    {
+        // If one wasn't set on the options, we'll ignore at this
+        setSpatialReference(fetchSpatialReference(m_query));
+    }
+
+    m_patch = PatchPtr(new Patch());
+}
+
+
+Options SQLiteReader::getDefaultOptions()
+{
+    Options options;
+
+    Option connection("connection", "",
+        "Connection string to connect to database");
+    Option query("query", "",
+        "SELECT statement that returns point cloud");
+
+    options.add(connection);
+    options.add(query);
+
+    return options;
+}
+
+
+pdal::SpatialReference
+SQLiteReader::fetchSpatialReference(std::string const& query) const
+{
+    // Fetch the WKT for the SRID to set the coordinate system of this stage
+    log()->get(LogLevel::Debug) << "Fetching srid object" << std::endl;
+
+    // ::soci::row r;
+    // ::soci::indicator ind = ::soci::i_null;
+    int64_t srid(0);
+    // ::soci::statement clouds =
+   //      (m_session->prepare << query, ::soci::into(r, ind));
+   //  clouds.execute();
+   //
+   //  if (ind == ::soci::i_null)
+   //      return pdal::SpatialReference();
+   //
+   //  bool bDidRead = clouds.fetch();
+   //
+   //  srid = (int64_t)r.get<int32_t>("srid");
+   //
+   //  if (!bDidRead)
+   //      return pdal::SpatialReference();
+   //
+   //  log()->get(LogLevel::Debug) << "query returned " << srid << std::endl;
+   //  std::ostringstream oss;
+   //  oss <<"EPSG:" << srid;
+
+    // if (srid >= 0)
+    //     return pdal::SpatialReference(oss.str());
+    // else
+        return pdal::SpatialReference();
+}
+
+void SQLiteReader::processOptions(const Options& options)
+{
+    m_schemaFile = options.getValueOrDefault<std::string>(
+        "xml_schema_dump", std::string());
+
+    if (options.hasOption("spatialreference"))
+        m_spatialRef = boost::optional<SpatialReference>(
+            options.getValueOrThrow<pdal::SpatialReference>(
+                "spatialreference"));
+    m_query = options.getValueOrThrow<std::string>("query");
+    m_connection = options.getValueOrDefault<std::string>("connection", "");
+    m_modulename = options.getValueOrDefault<std::string>("module", "");
+}
+
+
+void SQLiteReader::validateQuery() const
+{
+    std::set<std::string> reqFields;
+    reqFields.insert("POINTS");
+    reqFields.insert("SCHEMA");
+    reqFields.insert("NUM_POINTS");
+    reqFields.insert("CLOUD");
+
+    for (auto r = reqFields.begin(); r != reqFields.end(); ++r)
+    {
+        auto p = m_session->columns().find(*r);
+        if (p == m_session->columns().end())
+        {
+            std::ostringstream oss;
+            oss << "Unable to find required column name '" << *r << "'";
+            throw pdal_error(oss.str());
+        }
+    }
+}
+
+
+void SQLiteReader::addDimensions(PointLayoutPtr layout)
+{
+    log()->get(LogLevel::Debug) << "Fetching schema object" << std::endl;
+
+    std::ostringstream oss;
+    oss << "SELECT SCHEMA FROM (" << m_query <<") as q LIMIT 1";
+    std::string q(oss.str());
+
+    m_session->query(q);
+    const row* r = m_session->get(); // First result better have our schema
+    if (!r)
+        throw pdal_error("Unable to select schema from query!");
+
+    column const& s = r->at(0); // First column is schema
+
+    if (m_schemaFile.size())
+    {
+        std::ostream* out = FileUtils::createFile(m_schemaFile);
+        out->write(s.data.c_str(), s.data.size());
+        FileUtils::closeFile(out);
+    }
+
+    XMLSchema schema(s.data);
+    m_patch->m_metadata = schema.getMetadata();
+
+    loadSchema(layout, schema);
+}
+
+
+void SQLiteReader::ready(PointTableRef table)
+{
+    m_at_end = false;
+    b_doneQuery = false;
+
+    m_session.reset(new SQLite(m_connection, log()));
+    m_session->connect(false); // don't connect in write mode
+}
+
+
+bool SQLiteReader::nextBuffer()
+{
+    return m_session->next();
+}
+
+
+point_count_t SQLiteReader::readPatch(PointViewPtr view, point_count_t numPts)
+{
+    const row* r = m_session->get();
+    if (!r)
+        throw pdal_error("readPatch with no data in session!");
+    std::map<std::string, int32_t> const& columns = m_session->columns();
+
+    // Availability of positions already validated
+    int32_t position = columns.find("POINTS")->second;
+
+    MetadataNode comp = m_patch->m_metadata.findChild("compression");
+    m_patch->m_isCompressed = boost::iequals(comp.value(), "lazperf");
+    m_patch->m_compVersion = m_patch->m_metadata.findChild("version").value();
+
+    position = columns.find("NUM_POINTS")->second;
+    int32_t count = boost::lexical_cast<int32_t>((*r)[position].data);
+    m_patch->remaining = count;
+    m_patch->count = count;
+
+    log()->get(LogLevel::Debug3) << "patch compression? "
+                                 << m_patch->m_isCompressed << std::endl;
+
+    if (m_patch->m_isCompressed)
+        log()->get(LogLevel::Debug3) << "patch compression version: "
+                                     << m_patch->m_compVersion << std::endl;
+
+    position = columns.find("POINTS")->second;
+
+    point_count_t numRead = 0;
+    PointId nextId = view->size();
+    if (m_patch->m_isCompressed)
+    {
+#ifdef PDAL_HAVE_LAZPERF
+        LazPerfDecompressor<Patch> decompressor(*m_patch, dbDimTypes());
+
+        // Set the data into the patch.
+        m_patch->setBytes((*r)[position].blobBuf);
+        std::vector<char> tmpBuf(decompressor.pointSize());
+        while (numRead < numPts && count > 0)
+        {
+            decompressor.decompress(tmpBuf.data(), tmpBuf.size());
+            writePoint(*view.get(), nextId, tmpBuf.data());
+
+            if (m_cb)
+                m_cb(*view, nextId);
+
+            nextId++;
+            numRead++;
+            count--;
+        }
+#else
+        throw pdal_error("Can't decompress without LAZperf.");
+#endif
+
+        log()->get(LogLevel::Debug3) << "Compressed byte size: " <<
+            m_patch->byte_size() << std::endl;
+        if (!m_patch->byte_size())
+            throw pdal_error("Compressed patch size was 0!");
+        log()->get(LogLevel::Debug3) << "Uncompressed byte size: " <<
+            (m_patch->count * packedPointSize()) << std::endl;
+    }
+    else
+    {
+        const char *pos = (const char *)&((*r)[position].blobBuf[0]);
+        while (numRead < numPts && count > 0)
+        {
+            writePoint(*view.get(), nextId, pos);
+
+            pos += packedPointSize();
+            if (m_cb)
+                m_cb(*view, nextId);
+            nextId++;
+            numRead++;
+            count--;
+        }
+    }
+    m_patch->remaining -= numRead;
+    return numRead;
+}
+
+
+point_count_t SQLiteReader::read(PointViewPtr view, point_count_t count)
+{
+    if (eof())
+        return 0;
+
+    log()->get(LogLevel::Debug4) << "read called with "
+        "PointView filled to " << view->size() << " points" <<
+        std::endl;
+
+    point_count_t totalNumRead = 0;
+    if (! b_doneQuery)
+    {
+        // read first patch
+        m_session->query(m_query);
+        validateQuery();
+        b_doneQuery = true;
+        totalNumRead = readPatch(view, count);
+    }
+
+    int patch_count(0);
+    while (totalNumRead < count)
+    {
+        if (m_patch->remaining == 0)
+        {
+            if (!nextBuffer())
+            {
+                m_at_end = true;
+                return totalNumRead;
+            }
+        }
+        PointId bufBegin = view->size();
+        point_count_t numRead = readPatch(view, count - totalNumRead);
+        PointId bufEnd = bufBegin + numRead;
+        totalNumRead += numRead;
+        patch_count++;
+    }
+    return totalNumRead;
+}
+
+} // namespace pdal
diff --git a/plugins/sqlite/io/SQLiteReader.hpp b/plugins/sqlite/io/SQLiteReader.hpp
new file mode 100644
index 0000000..706a682
--- /dev/null
+++ b/plugins/sqlite/io/SQLiteReader.hpp
@@ -0,0 +1,91 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler, howard at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/DbReader.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/XMLSchema.hpp>
+
+#include "SQLiteCommon.hpp"
+
+#include <vector>
+
+namespace pdal
+{
+
+class PDAL_DLL SQLiteReader : public DbReader
+{
+public:
+    SQLiteReader()
+    {}
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+    Options getDefaultOptions();
+    SpatialReference fetchSpatialReference(std::string const& query) const;
+    SQLite& getSession()
+        { return *m_session.get(); }
+
+private:
+    std::unique_ptr<SQLite> m_session;
+    std::string m_query;
+    std::string m_schemaFile;
+    std::string m_connection;
+    std::string m_modulename;
+    boost::optional<SpatialReference> m_spatialRef;
+    PatchPtr m_patch;
+
+    bool m_at_end;
+    bool b_doneQuery;
+
+    virtual void initialize();
+    virtual void processOptions(const Options& options);
+    virtual void addDimensions(PointLayoutPtr layout);
+    virtual void ready(PointTableRef table);
+    point_count_t read(PointViewPtr view, point_count_t count);
+    bool eof()
+        { return m_at_end; }
+
+    void validateQuery() const;
+    point_count_t readPatch(PointViewPtr view, point_count_t count);
+    bool nextBuffer();
+
+    SQLiteReader& operator=(const SQLiteReader&); // not implemented
+    SQLiteReader(const SQLiteReader&); // not implemented
+};
+
+} // namespace pdal
diff --git a/plugins/sqlite/io/SQLiteWriter.cpp b/plugins/sqlite/io/SQLiteWriter.cpp
new file mode 100644
index 0000000..7e4d4d9
--- /dev/null
+++ b/plugins/sqlite/io/SQLiteWriter.cpp
@@ -0,0 +1,583 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "SQLiteWriter.hpp"
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/pdal_internal.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include <boost/format.hpp>
+
+#include <sstream>
+
+#include <gdal.h>
+#include <ogr_api.h>
+
+namespace pdal
+{
+
+static PluginInfo const s_info = PluginInfo(
+    "writers.sqlite",
+    "Write data to SQLite3 database files.",
+    "" );
+
+CREATE_SHARED_PLUGIN(1, 0, SQLiteWriter, Writer, s_info)
+
+std::string SQLiteWriter::getName() const { return s_info.name; }
+
+SQLiteWriter::SQLiteWriter() :
+    m_doCreateIndex(false)
+    , m_sdo_pc_is_initialized(false)
+    , m_obj_id(0)
+    , m_block_id(0)
+    , m_srid(0)
+    , m_num_points(0)
+    , m_orientation(Orientation::PointMajor)
+    , m_is3d(false)
+    , m_doCompression(false)
+{}
+
+
+void SQLiteWriter::processOptions(const Options& options)
+{
+    m_connection =
+        options.getValueOrDefault<std::string>("connection", "");
+    if (!m_connection.size())
+    {
+        m_connection =
+            options.getValueOrDefault<std::string>("filename", "");
+
+        if (!m_connection.size())
+        throw pdal_error("unable to connect to database, "
+            "no connection string was given!");
+    }
+    m_block_table =
+        options.getValueOrThrow<std::string>("block_table_name");
+    m_cloud_table =
+        options.getValueOrThrow<std::string>("cloud_table_name");
+    m_cloud_column =
+        options.getValueOrDefault<std::string>("cloud_column_name", "id");
+    m_modulename =
+        options.getValueOrDefault<std::string>("module", "");
+    m_srid =
+        m_options.getValueOrDefault<uint32_t>("srid", 4326);
+    m_is3d = m_options.getValueOrDefault<bool>("is3d", false);
+    m_doCompression = m_options.getValueOrDefault<bool>("compression", false);
+}
+
+
+void SQLiteWriter::initialize()
+{
+    try
+    {
+        log()->get(LogLevel::Debug) << "Connection: '" << m_connection <<
+            "'" << std::endl;
+        m_session = std::unique_ptr<SQLite>(new SQLite(m_connection, log()));
+        m_session->connect(true);
+        log()->get(LogLevel::Debug) << "Connected to database" << std::endl;
+        
+        bool bHaveSpatialite = m_session->haveSpatialite();
+        log()->get(LogLevel::Debug) << "Have spatialite?: " <<
+            bHaveSpatialite << std::endl;
+        m_session->loadSpatialite(m_modulename);
+
+        if (!bHaveSpatialite)
+        {
+            m_session->initSpatialiteMetadata();
+        }
+
+    }
+    catch (pdal_error const& e)
+    {
+        std::stringstream oss;
+        oss << "Unable to connect to database with error '" << e.what() << "'";
+        throw pdal_error(oss.str());
+    }
+
+    m_patch = PatchPtr(new Patch());
+}
+
+
+void SQLiteWriter::write(const PointViewPtr view)
+{
+    writeInit();
+    writeTile(view);
+}
+
+void SQLiteWriter::writeInit()
+{
+    if (m_sdo_pc_is_initialized)
+        return;
+
+    // m_block_insert_query << "INSERT INTO " <<
+    //     boost::to_lower_copy(m_block_table) << " ("<<
+    //     boost::to_lower_copy(m_cloud_column) <<
+    //     ", block_id, num_points, points, extent, bbox) VALUES (" <<
+    //     " ?, ?, ?, decode(?, 'hex'), "
+    //     "ST_Force_2D(ST_GeometryFromText(?,?)), ?)";
+    m_block_insert_query << "INSERT INTO " <<
+        boost::to_lower_copy(m_block_table) << " ("<<
+        boost::to_lower_copy(m_cloud_column) <<
+        ", block_id, num_points, points, extent, bbox) VALUES (" <<
+        " ?, ?, ?, ?, "
+        "ST_GeometryFromText(?,?), ?)";
+
+    // m_block_insert_query << "INSERT INTO " <<
+    //     boost::to_lower_copy(m_block_table) << " ("<<
+    //     boost::to_lower_copy(m_cloud_column) <<
+    //     ", block_id, num_points, points, extent, bbox) VALUES (" <<
+    //     " :obj_id, :block_id, :num_points, decode(:hex, 'hex'), "
+    //     "ST_Force_2D(ST_GeometryFromText(:extent,:srid)), :bbox)";
+
+    m_session->begin();
+
+    bool bHaveBlockTable = m_session->doesTableExist(m_block_table);
+    bool bHaveCloudTable = m_session->doesTableExist(m_cloud_table);
+
+    log()->get(LogLevel::Debug) << "bHaveBlockTable '"
+                         << bHaveBlockTable
+                         <<"'"<< std::endl;
+    log()->get(LogLevel::Debug) << "bHaveCloudTable '"
+                         << bHaveCloudTable
+                         <<"'"<< std::endl;
+
+    if (m_options.getValueOrDefault<bool>("overwrite", true))
+    {
+        if (bHaveBlockTable)
+        {
+            DeleteBlockTable();
+            bHaveBlockTable = false;
+        }
+        if (bHaveCloudTable)
+        {
+            DeleteCloudTable();
+            bHaveCloudTable = false;
+        }
+    }
+
+    std::string pre_sql =
+        m_options.getValueOrDefault<std::string>("pre_sql", "");
+    if (pre_sql.size())
+    {
+        std::string sql = FileUtils::readFileAsString(pre_sql);
+        if (!sql.size())
+        {
+            // if there was no file to read because the data in pre_sql was
+            // actually the sql code the user wanted to run instead of the
+            // filename to open, we'll use that instead.
+            sql = pre_sql;
+        }
+        m_session->execute(sql);
+    }
+
+    if (!bHaveCloudTable)
+    {
+        CreateCloudTable();
+    }
+
+    if (!bHaveBlockTable)
+    {
+        m_doCreateIndex = true;
+        CreateBlockTable();
+    }
+    CreateCloud();
+    m_sdo_pc_is_initialized = true;
+}
+
+
+
+void SQLiteWriter::CreateBlockTable()
+{
+    std::ostringstream oss;
+
+    oss << "CREATE TABLE " << boost::to_lower_copy(m_block_table)
+        << "(" << boost::to_lower_copy(m_cloud_column)  <<
+        " INTEGER REFERENCES " << boost::to_lower_copy(m_cloud_column)  <<
+        "," << " block_id INTEGER," << " num_points INTEGER," <<
+        " points BLOB," << " bbox box3d " << ")";
+
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Created block table '"
+                         << boost::to_lower_copy(m_block_table)
+                         << "'" <<std::endl;
+
+    {
+        std::ostringstream oss;
+        oss << "SELECT AddGeometryColumn('" <<
+            boost::to_lower_copy(m_block_table) << "'," << "'extent'" << ","
+            << m_srid << ", 'POLYGON', 'XY')";
+        m_session->execute(oss.str());
+        log()->get(LogLevel::Debug) <<
+            "Added geometry column for block table '" <<
+            boost::to_lower_copy(m_block_table) <<"'"<< std::endl;
+    }
+}
+
+void SQLiteWriter::DeleteBlockTable()
+{
+    std::ostringstream oss;
+
+    // Delete all the items from the table first
+    oss << "DELETE FROM " << m_block_table;
+    m_session->execute(oss.str());
+    oss.str("");
+    log()->get(LogLevel::Debug) << "Deleted rows from block table '"
+                         << boost::to_lower_copy(m_block_table)
+                         << "'" <<std::endl;
+
+    // Drop the table's dependencies
+    // We need to clean up the geometry column before dropping the table
+    oss << "SELECT DiscardGeometryColumn('" <<
+        boost::to_lower_copy(m_block_table) << "', 'extent')";
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Dropped geometry column for block table"
+                         << std::endl;
+    oss.str("");
+
+    oss << "DROP TABLE " << boost::to_lower_copy(m_block_table);
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Dropped block table '" <<
+        boost::to_lower_copy(m_block_table) << "'" <<std::endl;
+}
+
+
+void SQLiteWriter::CreateCloudTable()
+{
+    std::ostringstream oss;
+
+    oss << "CREATE TABLE " << boost::to_lower_copy(m_cloud_table) << " (" <<
+        boost::to_lower_copy(m_cloud_column) <<
+        " INTEGER PRIMARY KEY AUTOINCREMENT," << " schema TEXT," <<
+        " block_table varchar(64)" << ")";
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Created cloud table '"
+                         << boost::to_lower_copy(m_cloud_table)
+                         << "'" <<std::endl;
+
+    uint32_t nDim = 2;
+
+    oss.str("");
+    oss << "SELECT AddGeometryColumn('"
+        << boost::to_lower_copy(m_cloud_table)
+        << "'," << "'extent'" << "," << m_srid << ", 'POLYGON', 'XY')";
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Added geometry column to cloud table '" <<
+        boost::to_lower_copy(m_cloud_table) << "'" <<std::endl;
+}
+
+
+void SQLiteWriter::DeleteCloudTable()
+{
+    std::ostringstream oss;
+
+    // Delete all the items from the table first
+    oss << "DELETE FROM " << m_cloud_table;
+    m_session->execute(oss.str());
+    oss.str("");
+    log()->get(LogLevel::Debug) << "Deleted records from cloud table '"
+                         << boost::to_lower_copy(m_cloud_table)
+                         << "'" <<std::endl;
+
+    // Go drop the table
+    // We need to clean up the geometry column before dropping the table
+    oss << "SELECT DiscardGeometryColumn('" <<
+        boost::to_lower_copy(m_cloud_table) << "', 'extent')";
+    m_session->execute(oss.str());
+    oss.str("");
+    log()->get(LogLevel::Debug) << "Dropped geometry column from cloud table '"
+                         << boost::to_lower_copy(m_cloud_table)
+                         << "'" <<std::endl;
+
+    oss << "DROP TABLE " << boost::to_lower_copy(m_cloud_table);
+    m_session->execute(oss.str());
+    oss.str("");
+    log()->get(LogLevel::Debug) << "Dropped cloud table '"
+                         << boost::to_lower_copy(m_cloud_table)
+                         << "'" <<std::endl;
+}
+
+
+void SQLiteWriter::CreateIndexes(std::string const& table_name,
+    std::string const& spatial_column_name, bool is3d)
+{
+    std::ostringstream oss;
+    std::ostringstream index_name_ss;
+
+    index_name_ss << table_name << "_cloud_idx";
+    std::string index_name = index_name_ss.str().substr(0,29);
+
+    // Spatial indexes
+    oss << "SELECT CreateSpatialIndex('"<< boost::to_lower_copy(table_name) <<
+        "', 'extent')";
+    m_session->execute(oss.str());
+    log()->get(LogLevel::Debug) << "Created spatial index for'" <<
+        table_name << "'" << std::endl;
+}
+
+
+std::string
+SQLiteWriter::loadGeometryWKT(std::string const& filename_or_wkt) const
+{
+    std::ostringstream wkt_s;
+
+    if (filename_or_wkt.empty())
+        return std::string();
+
+    if (!FileUtils::fileExists(filename_or_wkt))
+    {
+        if (!IsValidGeometryWKT(filename_or_wkt))
+        {
+            std::ostringstream oss;
+            oss << "WKT for not valid and '" << filename_or_wkt
+                << "' doesn't exist as a file";
+            throw pdal::pdal_error(oss.str());
+        }
+        wkt_s << filename_or_wkt;
+    }
+    else
+    {
+        std::string wkt = FileUtils::readFileAsString(filename_or_wkt);
+        if (!IsValidGeometryWKT(wkt))
+        {
+            std::ostringstream oss;
+            oss << "WKT for was from file '" << filename_or_wkt
+                << "' is not valid";
+            throw pdal::pdal_error(oss.str());
+        }
+        wkt_s << wkt;
+    }
+    return wkt_s.str();
+}
+
+
+bool SQLiteWriter::IsValidGeometryWKT(std::string const& input) const
+{
+    OGRGeometryH g;
+
+    char* wkt = const_cast<char*>(input.c_str());
+    OGRErr e = OGR_G_CreateFromWkt(&wkt, NULL, &g);
+    OGR_G_DestroyGeometry(g);
+    return (!e);
+}
+
+void SQLiteWriter::done(PointTableRef table)
+{
+    if (m_doCreateIndex)
+    {
+        CreateIndexes(m_block_table, "extent", m_is3d);
+    }
+
+    std::string post_sql =
+        m_options.getValueOrDefault<std::string>("post_sql", "");
+    if (post_sql.size())
+    {
+        std::string sql = FileUtils::readFileAsString(post_sql);
+        if (!sql.size())
+        {
+            // if there was no file to read because the data in post_sql was
+            // actually the sql code the user wanted to run instead of the
+            // filename to open, we'll use that instead.
+            sql = post_sql;
+        }
+        m_session->execute(sql);
+    }
+
+    m_session->commit();
+
+}
+
+
+void SQLiteWriter::CreateCloud()
+{
+    using namespace std;
+
+    ostringstream oss;
+
+    bool pack =
+        m_options.getValueOrDefault<bool>("pack_ignored_fields", true);
+
+    string bounds = m_options.getValueOrDefault<string>(
+        "cloud_boundary_wkt", "");
+    if (bounds.size())
+    {
+        log()->get(LogLevel::Debug2) << "have cloud_boundary_wkt of size " <<
+            bounds.size() << std::endl;
+        bounds = loadGeometryWKT(bounds);
+    }
+
+    string cloud_column =
+        m_options.getValueOrDefault<string>("cloud_column", "id");
+
+    oss << "INSERT INTO " << boost::to_lower_copy(m_cloud_table) << "(" <<
+        " block_table, schema) VALUES ('" <<
+        boost::to_lower_copy(m_block_table) << "',?) ";
+
+    MetadataNode m;
+    if (m_doCompression)
+    {
+        Metadata metadata;
+        m = metadata.getNode();
+        m.add("compression", "lazperf");
+        m.add("version", "1.0");
+    }
+    XMLSchema schema(dbDimTypes(), m);
+    std::string xml = schema.xml();
+
+    records rs;
+    row r;
+    r.push_back(column(xml));
+    rs.push_back(r);
+    m_session->insert(oss.str(), rs);
+    oss.str("");
+
+    long id = m_session->last_row_id();
+    m_obj_id = id;
+
+    log()->get(LogLevel::Debug) << "Point cloud id was " << id << std::endl;
+    try
+    {
+        Option& pc_id = m_options.getOptionByRef("pc_id");
+        pc_id.setValue(id);
+    }
+    catch (Option::not_found)
+    {
+        Option pc_id("pc_id", id, "Point Cloud Id");
+        m_options.add(pc_id);
+    }
+    if (bounds.size())
+    {
+        records rs;
+        row r;
+
+        r.push_back(column(bounds));
+        r.push_back(column(m_srid));
+        r.push_back(column(id));
+        rs.push_back(r);
+
+        oss << "UPDATE " << boost::to_lower_copy(m_cloud_table) <<
+            " SET extent="
+            "ST_GeometryFromText(?,?) where " <<
+            boost::to_lower_copy(m_cloud_column) <<"=?";
+
+        m_session->insert(oss.str(), rs);
+        log()->get(LogLevel::Debug) <<
+            "Inserted boundary wkt into cloud table " << std::endl;
+    }
+}
+
+
+void SQLiteWriter::writeTile(const PointViewPtr view)
+{
+    using namespace std;
+
+    Patch outpatch;
+
+    if (m_doCompression)
+    {
+#ifdef PDAL_HAVE_LAZPERF
+        XMLDimList xmlDims = dbDimTypes();
+        DimTypeList dimTypes;
+        for (XMLDim& xmlDim : xmlDims)
+            dimTypes.push_back(xmlDim.m_dimType);
+
+        LazPerfCompressor<Patch> compressor(*m_patch, dimTypes);
+
+        try
+        {
+            std::vector<char> outbuf(packedPointSize());
+            for (PointId idx = 0; idx < view->size(); idx++)
+            {
+                size_t size = readPoint(*view.get(), idx, outbuf.data());
+                // Read the data and write to the patch.
+                compressor.compress(outbuf.data(), size);
+            }
+        }
+        catch (pdal_error)
+        {
+            compressor.done();
+            throw;
+        }
+        compressor.done();
+#else
+        throw pdal_error("Can't compress without LAZperf.");
+#endif
+
+        size_t viewSize = view->size() * view->pointSize();
+        double percent = (double) m_patch->byte_size()/(double) viewSize;
+        percent = percent * 100;
+        log()->get(LogLevel::Debug3) << "Compressing tile by " <<
+            boost::str(boost::format("%.2f") % (100 - percent)) <<
+            "%" << std::endl;
+    }
+    else
+    {
+        std::vector<char> storage(packedPointSize());
+
+        for (PointId idx = 0; idx < view->size(); idx++)
+        {
+            size_t size = readPoint(*view.get(), idx, storage.data());
+            m_patch->putBytes((const unsigned char *)storage.data(), size);
+        }
+        log()->get(LogLevel::Debug3) << "uncompressed size: " <<
+            m_patch->getBytes().size() << std::endl;
+    }
+
+    records rs;
+    row r;
+
+    uint32_t precision(9);
+    BOX3D b;
+    view->calculateBounds(b);
+    std::string bounds = b.toWKT(precision); // polygons are only 2d, not cubes
+
+    std::string box = b.toBox(precision);
+    log()->get(LogLevel::Debug3) << "extent: " << bounds << std::endl;
+    log()->get(LogLevel::Debug3) << "bbox: " << box << std::endl;
+
+    r.push_back(column(m_obj_id));
+    r.push_back(column(m_block_id));
+    r.push_back(column(view->size()));
+    r.push_back(blob((const char*)(&m_patch->getBytes()[0]),
+        m_patch->getBytes().size()));
+    r.push_back(column(bounds));
+    r.push_back(column(m_srid));
+    r.push_back(column(box));
+    rs.push_back(r);
+    m_session->insert(m_block_insert_query.str(), rs);
+    m_block_id++;
+
+}
+
+} // namespaces
diff --git a/plugins/sqlite/io/SQLiteWriter.hpp b/plugins/sqlite/io/SQLiteWriter.hpp
new file mode 100644
index 0000000..45d31d2
--- /dev/null
+++ b/plugins/sqlite/io/SQLiteWriter.hpp
@@ -0,0 +1,101 @@
+/******************************************************************************
+* Copyright (c) 2012, Howard Butler, hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <pdal/DbWriter.hpp>
+#include <pdal/StageFactory.hpp>
+#include "SQLiteCommon.hpp"
+
+namespace pdal
+{
+
+
+class PDAL_DLL SQLiteWriter : public DbWriter
+{
+public:
+    SQLiteWriter();
+
+    static void * create();
+    static int32_t destroy(void *);
+    std::string getName() const;
+
+private:
+
+    SQLiteWriter& operator=(const SQLiteWriter&); // not implemented
+    SQLiteWriter(const SQLiteWriter&); // not implemented
+
+    virtual void initialize();
+    virtual void processOptions(const Options& options);
+    virtual void write(const PointViewPtr view);
+    virtual void done(PointTableRef table);
+
+    void writeInit();
+    void writeTile(const PointViewPtr view);
+    void CreateBlockTable();
+    void CreateCloudTable();
+    bool CheckTableExists(std::string const& name);
+    void DeleteBlockTable();
+    void DeleteCloudTable();
+    void CreateIndexes(std::string const& table_name,
+                       std::string const& spatial_column_name,
+                       bool is3d);
+
+    bool IsValidGeometryWKT(std::string const& wkt) const;
+    std::string loadGeometryWKT(std::string const& filename_or_wkt) const;
+    void CreateCloud();
+
+    std::unique_ptr<SQLite> m_session;
+
+    bool m_doCreateIndex;
+    BOX3D m_bounds; // Bounds of the entire point cloud
+    bool m_sdo_pc_is_initialized;
+	std::ostringstream m_block_insert_query;
+	int32_t m_obj_id;
+	int32_t m_block_id;
+	uint32_t m_srid;
+	int64_t m_num_points;
+    Orientation::Enum m_orientation;
+    bool m_pack;
+    std::string m_block_table;
+    std::string m_cloud_table;
+    std::string m_cloud_column;
+    std::string m_connection;
+    std::string m_modulename;
+    bool m_is3d;
+    bool m_doCompression;;
+    PatchPtr m_patch;
+};
+
+} // namespaces
diff --git a/plugins/sqlite/test/SQLiteTest.cpp b/plugins/sqlite/test/SQLiteTest.cpp
new file mode 100644
index 0000000..a864925
--- /dev/null
+++ b/plugins/sqlite/test/SQLiteTest.cpp
@@ -0,0 +1,285 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/pdal_defines.h>
+#include <las/LasReader.hpp>
+
+#include "../io/SQLiteCommon.hpp"
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+Options getSQLITEOptions()
+{
+    Options options;
+
+    options.add("capacity", 15U, "capacity");
+    options.add("overwrite", true, "overwrite");
+    options.add("connection",
+        Support::temppath("temp-SqliteWriterTest_test_simple_las.sqlite"),
+        "connection");
+    options.add("block_table_name", "PDAL_TEST_BLOCKS", "block_table_name");
+    options.add("cloud_table_name", "PDAL_TEST_BASE");
+    options.add("is3d", false);
+    options.add("srid", 4326);
+    options.add("out_srs", "EPSG:4269");
+    options.add("filename", Support::datapath("las/1.2-with-color.las"));
+    options.add("query", "SELECT b.schema, l.cloud, l.block_id, "
+        "l.num_points, l.bbox, l.extent, l.points, b.cloud "
+        "FROM PDAL_TEST_BLOCKS l, PDAL_TEST_BASE b "
+        "WHERE l.cloud = b.cloud and l.cloud in (1) "
+        "order by l.cloud", "");
+    options.add("spatialreference", "EPSG:2926");
+    options.add("pack_ignored_fields", true);
+    options.add("cloud_column_name", "CLOUD");
+//     options.add("xml_schema_dump", "sqlite-xml-schema-dump.xml");
+    options.add("type", "sqlite");
+
+    return options;
+}
+
+void testReadWrite(bool compression, bool scaling)
+{
+    // remove file from earlier run, if needed
+    std::string tempFilename =
+        getSQLITEOptions().getValueOrThrow<std::string>("connection");
+
+    FileUtils::deleteFile(tempFilename);
+
+    Options sqliteOptions = getSQLITEOptions();
+    if (scaling)
+    {
+        sqliteOptions.add("scale_x", 0.01);
+        sqliteOptions.add("scale_y", 0.01);
+    }
+    sqliteOptions.add("compression", compression, "");
+
+    {
+        // remove file from earlier run, if needed
+        std::string temp_filename =
+        sqliteOptions.getValueOrThrow<std::string>("connection");
+
+        Options lasReadOpts;
+        lasReadOpts.add("filename", Support::datapath("las/1.2-with-color.las"));
+        lasReadOpts.add("count", 11);
+
+        LasReader reader;
+        reader.setOptions(lasReadOpts);
+
+        StageFactory f;
+        std::unique_ptr<Stage> sqliteWriter(f.createStage("writers.sqlite"));
+        sqliteWriter->setOptions(sqliteOptions);
+        sqliteWriter->setInput(reader);
+
+        PointTable table;
+        sqliteWriter->prepare(table);
+        sqliteWriter->execute(table);
+    }
+    
+    {
+        // Done - now read back.
+        StageFactory f;
+        std::unique_ptr<Stage> sqliteReader(f.createStage("readers.sqlite"));
+        sqliteReader->setOptions(sqliteOptions);
+
+        PointTable table2;
+        sqliteReader->prepare(table2);
+        PointViewSet viewSet = sqliteReader->execute(table2);
+        EXPECT_EQ(viewSet.size(), 1U);
+        PointViewPtr view = *viewSet.begin();
+
+        using namespace Dimension;
+
+        uint16_t reds[] = {68, 54, 112, 178, 134, 99, 90, 106, 106, 100, 64};
+        for (PointId idx = 0; idx < 11; idx++)
+        {
+            uint16_t r = view->getFieldAs<uint16_t>(Id::Red, idx);
+            EXPECT_EQ(r, reds[idx]);
+        }
+        int32_t x = view->getFieldAs<int32_t>(Id::X, 10);
+        EXPECT_EQ(x, 636038);
+        double xd = view->getFieldAs<double>(Id::X, 10);
+        EXPECT_FLOAT_EQ(xd, 636037.53);
+    }
+
+    FileUtils::deleteFile(tempFilename);
+}
+
+
+TEST(SQLiteTest, readWrite)
+{
+    testReadWrite(false, false);
+}
+
+#ifdef PDAL_HAVE_LAZPERF
+TEST(SQLiteTest, readWriteCompress)
+{
+    testReadWrite(true, false);
+}
+#endif
+
+TEST(SQLiteTest, readWriteScale)
+{
+    testReadWrite(false, true);
+}
+
+#ifdef PDAL_HAVE_LAZPERF
+TEST(SQLiteTest, readWriteCompressScale)
+{
+    testReadWrite(true, true);
+}
+#endif
+
+TEST(SQLiteTest, Issue895)
+{
+    LogPtr log(new pdal::Log("Issue895", "stdout"));
+    log->setLevel(LogLevel::Debug);
+
+    const std::string filename(Support::temppath("issue895.sqlite"));
+
+    FileUtils::deleteFile(filename);
+
+    bool ok;
+    const char* sql;
+
+    // make a DB, put a table in it
+    {
+        SQLite db(filename, LogPtr(log));
+        db.connect(true);
+        sql = "CREATE TABLE MyTable (id INTEGER PRIMARY KEY AUTOINCREMENT, data)";
+        db.execute(sql);
+    }
+
+    // open the DB, manually check the tables
+    {
+        SQLite db(filename, LogPtr(log));
+        db.connect(false);
+        sql = "SELECT name FROM sqlite_master WHERE type = \"table\"";
+        db.query(sql);
+
+        // because order of the returned rows is undefined
+        bool foundMine = false;
+        bool foundTheirs = false;
+
+        {
+            const row* r = db.get();
+            column const& c = r->at(0);
+
+            foundMine = (strcmp(c.data.c_str(), "MyTable") == 0);
+            foundTheirs = (strcmp(c.data.c_str(), "sqlite_sequence") == 0);
+            //printf("%s %d %d\n", c.data.c_str(), (int)foundMine, (int)foundTheirs);
+            EXPECT_TRUE(foundMine || foundTheirs);
+        }
+
+        ok = db.next();
+        EXPECT_TRUE(ok);
+
+        {
+            const row* r = db.get();
+            column const& c = r->at(0);
+            foundMine |= (strcmp(c.data.c_str(), "MyTable") == 0);
+            foundTheirs |= (strcmp(c.data.c_str(), "sqlite_sequence") == 0);
+            //printf("%s %d %d\n", c.data.c_str(), (int)foundMine, (int)foundTheirs);
+            EXPECT_TRUE(foundMine && foundTheirs);
+        }
+
+        ok = db.next();
+        EXPECT_FALSE(ok);
+    }
+
+    // open the DB, ask if the tables exist
+    {
+        SQLite db(filename, LogPtr(log));
+        db.connect(false);
+
+        ok = db.doesTableExist("MyTable");
+        EXPECT_TRUE(ok);
+
+        ok = db.doesTableExist("sqlite_sequence");
+        EXPECT_TRUE(ok);
+    }
+}
+
+
+TEST(SQLiteTest, testSpatialite)
+{
+    LogPtr log(new pdal::Log("spat", "stdout"));
+    log->setLevel(LogLevel::Debug);
+
+    const std::string filename(Support::temppath("spat.sqlite"));
+
+    FileUtils::deleteFile(filename);
+
+    SQLite db(filename, LogPtr(log));
+    db.connect(true);
+
+    EXPECT_FALSE(db.haveSpatialite());
+
+    db.loadSpatialite();
+    db.initSpatialiteMetadata();
+
+    EXPECT_TRUE(db.haveSpatialite());
+
+    FileUtils::deleteFile(filename);
+}
+
+
+TEST(SQLiteTest, testVersionInfo)
+{
+    LogPtr log = std::shared_ptr<pdal::Log>(new pdal::Log("spver", "stdout"));
+    log->setLevel(LogLevel::Debug);
+
+    const std::string filename(Support::temppath("spver.sqlite"));
+
+    FileUtils::deleteFile(filename);
+
+    SQLite db(filename, LogPtr(log));
+    db.connect(true);
+    db.loadSpatialite();
+
+    const std::string p = db.getSQLiteVersion();
+    EXPECT_EQ(p[0], '3'); // 3.8.9 as of this commit
+
+    const std::string q = db.getSpatialiteVersion();
+    EXPECT_EQ(q[0], '4'); // 4.2.0 as of this commit
+
+    FileUtils::deleteFile(filename);
+}
diff --git a/python/CHANGES.txt b/python/CHANGES.txt
new file mode 100644
index 0000000..e5767d5
--- /dev/null
+++ b/python/CHANGES.txt
@@ -0,0 +1,3 @@
+Changes
+================================================================================
+
diff --git a/python/MANIFEST.in b/python/MANIFEST.in
new file mode 100644
index 0000000..0ad9024
--- /dev/null
+++ b/python/MANIFEST.in
@@ -0,0 +1,5 @@
+exclude *.txt
+exclude MANIFEST.in
+include CHANGES.txt README.rst VERSION.txt
+recursive-include test *.py
+recursive-include pdal *.pyx
diff --git a/python/README.rst b/python/README.rst
new file mode 100644
index 0000000..3ce1d14
--- /dev/null
+++ b/python/README.rst
@@ -0,0 +1,11 @@
+================================================================================
+PDAL
+================================================================================
+
+Requirements
+================================================================================
+
+PDAL 1.0+ requires
+
+* Python >=2.7 (including Python 3.x)
+
diff --git a/python/VERSION.txt b/python/VERSION.txt
new file mode 100644
index 0000000..afaf360
--- /dev/null
+++ b/python/VERSION.txt
@@ -0,0 +1 @@
+1.0.0
\ No newline at end of file
diff --git a/python/pdal/Pipeline.cpp b/python/pdal/Pipeline.cpp
new file mode 100644
index 0000000..9f07a7c
--- /dev/null
+++ b/python/pdal/Pipeline.cpp
@@ -0,0 +1,61 @@
+#include "Pipeline.hpp"
+#ifdef PDAL_HAVE_LIBXML2
+#include <pdal/XMLSchema.hpp>
+#endif
+
+#include <pdal/plang/Array.hpp>
+
+
+namespace libpdalpython
+{
+
+Pipeline::Pipeline(std::string const& xml)
+    : m_xml(xml)
+    , m_schema("")
+    , m_manager(-1)
+{
+    auto initNumpy = []()
+    {
+#undef NUMPY_IMPORT_ARRAY_RETVAL
+#define NUMPY_IMPORT_ARRAY_RETVAL
+        import_array();
+    };
+    initNumpy();
+}
+
+void Pipeline::execute()
+{
+    pdal::PipelineReader reader(m_manager, false, 0 );
+    std::stringstream strm;
+    strm << m_xml;
+//     bool isWriter = reader.readPipeline(strm);
+    reader.readPipeline(strm);
+    m_manager.execute();
+#ifdef PDAL_HAVE_LIBXML2
+    pdal::XMLSchema schema(m_manager.pointTable().layout());
+    m_schema = schema.xml();
+#endif
+
+    pdal::PipelineWriter writer(m_manager);
+    strm.str("");
+    writer.writePipeline(strm);
+    m_xml = strm.str();
+
+}
+
+std::vector<PArray> Pipeline::getArrays() const
+{
+    std::vector<PArray> output;
+    const pdal::PointViewSet& pvset = m_manager.views();
+
+
+    for (auto i: pvset)
+    {
+        PArray array = new pdal::plang::Array;
+        array->update(i);
+        output.push_back(array);
+    }
+    return output;
+}
+} //namespace libpdalpython
+
diff --git a/python/pdal/Pipeline.hpp b/python/pdal/Pipeline.hpp
new file mode 100644
index 0000000..38a640e
--- /dev/null
+++ b/python/pdal/Pipeline.hpp
@@ -0,0 +1,40 @@
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineWriter.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/plang/Array.hpp>
+
+#include <string>
+#include <Python.h>
+#undef toupper
+#undef tolower
+#undef isspace
+
+#define PY_ARRAY_UNIQUE_SYMBOL LIBPDALPYTHON_ARRAY_API
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+
+#include <numpy/arrayobject.h>
+
+
+namespace libpdalpython
+{
+//     typedef std::shared_ptr<pdal::plang::Array> PArray;
+    typedef pdal::plang::Array* PArray;
+class Pipeline {
+public:
+    Pipeline(std::string const& xml);
+    ~Pipeline(){};
+
+    void execute();
+    inline const char* getXML() const { return m_xml.c_str(); }
+    inline const char* getSchema() const { return m_schema.c_str(); }
+    std::vector<PArray> getArrays() const;
+
+private:
+    std::string m_xml;
+    std::string m_schema;
+    pdal::PipelineManager m_manager; // no progress reporting
+
+};
+
+}
diff --git a/python/pdal/__init__.py b/python/pdal/__init__.py
new file mode 100644
index 0000000..a5675f6
--- /dev/null
+++ b/python/pdal/__init__.py
@@ -0,0 +1 @@
+__version__='1.0.0'
diff --git a/python/pdal/libpdalpython.pyx b/python/pdal/libpdalpython.pyx
new file mode 100644
index 0000000..8753475
--- /dev/null
+++ b/python/pdal/libpdalpython.pyx
@@ -0,0 +1,55 @@
+# distutils: language = c++
+
+from libcpp.vector cimport vector
+from libcpp.string cimport string
+from cpython.version cimport PY_MAJOR_VERSION
+cimport numpy as np
+np.import_array()
+
+from cpython cimport PyObject, Py_INCREF
+from cython.operator cimport dereference as deref, preincrement as inc
+
+cdef extern from "pdal/plang/Array.hpp" namespace "pdal::plang":
+    cdef cppclass Array:
+        void* getPythonArray() except+
+
+cdef extern from "Pipeline.hpp" namespace "libpdalpython":
+    cdef cppclass Pipeline:
+        Pipeline(const char* ) except +
+        void execute() except +
+        const char* getXML()
+        vector[Array*] getArrays() except +
+
+cdef class PyPipeline:
+    cdef Pipeline *thisptr      # hold a c++ instance which we're wrapping
+    def __cinit__(self, unicode xml):
+        cdef char* x
+        if PY_MAJOR_VERSION >= 3:
+            self.thisptr = new Pipeline(xml.encode('UTF-8'))
+        else:
+            self.thisptr = new Pipeline(xml)
+    def __dealloc__(self):
+        del self.thisptr
+
+    property xml:
+        def __get__(self):
+            return self.thisptr.getXML().decode('UTF-8')
+
+    def arrays(self):
+        v = self.thisptr.getArrays()
+        output = []
+        cdef vector[Array*].iterator it = v.begin()
+        cdef Array* a
+        while it != v.end():
+            ptr = deref(it)
+            a = ptr#.get()
+            o = a.getPythonArray()
+            output.append(<object>o)
+            inc(it)
+        return output
+
+    def execute(self):
+        if not self.thisptr:
+            raise Exception("C++ Pipeline object not constructed!")
+        self.thisptr.execute()
+
diff --git a/python/pdal/pipeline_xml.py b/python/pdal/pipeline_xml.py
new file mode 100644
index 0000000..1b809f0
--- /dev/null
+++ b/python/pdal/pipeline_xml.py
@@ -0,0 +1,62 @@
+from xml.etree import ElementTree
+import pdal
+
+
+class XMLElement(object):
+
+    def __init__(self):
+        self.source = None
+
+    def xml(self):
+        element = ElementTree.Element(self.tag, self.attrib)
+        if self.source:
+            try:
+                sources = iter(self.source)
+            except TypeError:
+                sources = [self.source]
+            for source in sources:
+                element.append(source.xml())
+        return element
+
+
+class Pipeline(XMLElement):
+
+    tag = 'Pipeline'
+
+    def __init__(self, customversion=None):
+        super(Pipeline, self).__init__()
+        self.attrib = {'version': customversion or pdal.__version__}
+
+    def xml(self):
+        element = super(Pipeline, self).xml()
+        return ElementTree.ElementTree(element)
+
+
+class PipelineComponent(XMLElement):
+
+    def __init__(self, drivertype):
+        super(PipelineComponent, self).__init__()
+        self.attrib = {'type': self.typeformat % drivertype}
+
+
+class Stage(PipelineComponent):
+    pass
+
+
+class Reader(Stage):
+    tag = 'Reader'
+    typeformat = 'readers.%s'
+
+
+class Filter(Stage):
+    tag = 'Filter'
+    typeformat = 'filters.%s'
+
+
+class MultiFilter(Filter):
+    tag = 'MultiFilter'
+
+
+class Writer(PipelineComponent):
+    tag = 'Writer'
+    typeformat = 'writers.%s'
diff --git a/python/setup.py b/python/setup.py
new file mode 100644
index 0000000..41f5fa7
--- /dev/null
+++ b/python/setup.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python
+
+# Stolen from Shapely's setup.py
+# Two environment variables influence this script.
+#
+# PDAL_LIBRARY_PATH: a path to a PDAL C++ shared library.
+#
+# GEOS_CONFIG: the path to a pdal-config program that points to GEOS version,
+# headers, and libraries.
+#
+# NB: within this setup scripts, software versions are evaluated according
+# to https://www.python.org/dev/peps/pep-0440/.
+
+import logging
+import os
+import platform
+import sys
+import numpy
+from Cython.Build import cythonize
+
+USE_CYTHON = True
+try:
+    from Cython.Build import cythonize
+except ImportError:
+    USE_CYTHON = False
+
+ext = '.pyx' if USE_CYTHON else '.cpp'
+
+from setuptools import setup
+from packaging.version import Version
+
+
+logging.basicConfig()
+log = logging.getLogger(__file__)
+
+# python -W all setup.py ...
+if 'all' in sys.warnoptions:
+    log.level = logging.DEBUG
+
+
+# Second try: use PDAL_CONFIG environment variable
+if 'PDAL_CONFIG' in os.environ:
+    pdal_config = os.environ['GEOS_CONFIG']
+    log.debug('pdal_config: %s', pdal_config)
+else:
+    pdal_config = 'pdal-config'
+
+
+def get_pdal_config(option):
+    '''Get configuration option from the `pdal-config` development utility
+
+    This code was adapted from Shaply's pdal-config stuff
+    '''
+    import subprocess
+    pdal_config = globals().get('pdal_config')
+    if not pdal_config or not isinstance(pdal_config, str):
+        raise OSError('Path to pdal-config is not set')
+    try:
+        stdout, stderr = subprocess.Popen(
+            [pdal_config, option],
+            stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+    except OSError as ex:
+        # e.g., [Errno 2] No such file or directory
+        raise OSError(
+            'Could not find pdal-config %r: %s' % (pdal_config, ex))
+    if stderr and not stdout:
+        raise ValueError(stderr.strip())
+    if sys.version_info[0] >= 3:
+        result = stdout.decode('ascii').strip()
+    else:
+        result = stdout.strip()
+    log.debug('%s %s: %r', pdal_config, option, result)
+    return result
+
+# Get the version from the pdal module
+module_version = None
+with open('pdal/__init__.py', 'r') as fp:
+    for line in fp:
+        if line.startswith("__version__"):
+
+            module_version = Version(
+                line.split("=")[1].strip().strip("\"'"))
+            break
+
+if not module_version:
+    raise ValueError("Could not determine PDAL's version")
+
+# Handle UTF-8 encoding of certain text files.
+open_kwds = {}
+if sys.version_info >= (3,):
+    open_kwds['encoding'] = 'utf-8'
+
+with open('VERSION.txt', 'w', **open_kwds) as fp:
+    fp.write(str(module_version))
+
+with open('README.rst', 'r', **open_kwds) as fp:
+    readme = fp.read()
+
+with open('CHANGES.txt', 'r', **open_kwds) as fp:
+    changes = fp.read()
+
+long_description = readme + '\n\n' +  changes
+
+include_dirs = []
+library_dirs = []
+libraries = []
+extra_link_args = []
+
+from setuptools.extension import Extension as DistutilsExtension
+
+if pdal_config:
+    # Collect other options from PDAL
+    for item in get_pdal_config('--includes').split():
+        if item.startswith("-I"):
+            include_dirs.extend(item[2:].split(":"))
+    for item in get_pdal_config('--libs').split():
+        if item.startswith("-L"):
+            library_dirs.extend(item[2:].split(":"))
+        elif item.startswith("-l"):
+            libraries.append(item[2:])
+
+include_dirs.append(numpy.get_include())
+extra_compile_args = ['-std=c++11',]
+libraries.append('pdal_plang')
+
+DEBUG=False
+if DEBUG:
+    extra_compile_args += ['-g','-O0']
+
+sources=['pdal/libpdalpython'+ext,"pdal/Pipeline.cpp",  ]
+extensions = [DistutilsExtension("*",
+                                   sources,
+                                   include_dirs=include_dirs,
+                                   library_dirs=library_dirs,
+                                   extra_compile_args=extra_compile_args,
+                                   libraries=libraries,
+                                   extra_link_args=extra_link_args,)]
+if USE_CYTHON:
+    from Cython.Build import cythonize
+    extensions= cythonize(extensions, language="c++")
+
+setup_args = dict(
+    name                = 'PDAL',
+    version             = str(module_version),
+    requires            = ['Python (>=2.7)', ],
+    description         = 'Point cloud data processing',
+    license             = 'BSD',
+    keywords            = 'point cloud spatial',
+    author              = 'Howard Butler',
+    author_email        = 'howard at hobu.co',
+    maintainer          = 'Howard Butler',
+    maintainer_email    = 'howard at hobu.co',
+    url                 = 'http://pdal.io',
+    long_description    = long_description,
+    test_suite          = 'test',
+    packages            = [
+        'pdal',
+    ],
+    classifiers         = [
+        'Development Status :: 5 - Production/Stable',
+        'Intended Audience :: Developers',
+        'Intended Audience :: Science/Research',
+        'License :: OSI Approved :: BSD License',
+        'Operating System :: OS Independent',
+        'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3',
+        'Topic :: Scientific/Engineering :: GIS',
+    ],
+    cmdclass           = {},
+)
+setup(ext_modules=extensions, **setup_args)
+
diff --git a/python/test/__init__.py b/python/test/__init__.py
new file mode 100644
index 0000000..51f0a62
--- /dev/null
+++ b/python/test/__init__.py
@@ -0,0 +1,2 @@
+from test.test_libpdal import test_suite
+from test.test_pipeline import test_suite
diff --git a/python/test/test_libpdal.py b/python/test/test_libpdal.py
new file mode 100644
index 0000000..77d20f7
--- /dev/null
+++ b/python/test/test_libpdal.py
@@ -0,0 +1,55 @@
+import pdal
+from pdal import libpdalpython
+# import pdal.libpdalpython
+import unittest
+
+def fetch_xml(filename):
+    output = ''
+    with open(filename, 'rb') as f:
+        output = f.read().decode('UTF-8')
+    return output
+
+class TestPDALArray(unittest.TestCase):
+
+  def test_construction(self):
+    """Can we construct a PDAL pipeline"""
+    xml = fetch_xml('../test/data/pipeline/pipeline_read.xml')
+    r = libpdalpython.PyPipeline(xml)
+
+  def test_execution(self):
+    """Can we execute a PDAL pipeline"""
+    xml = fetch_xml('../test/data/pipeline/pipeline_read.xml')
+    r = libpdalpython.PyPipeline(xml)
+    r.execute()
+    self.assertEqual(len(r.xml), 2184)
+
+  def test_array(self):
+    """Can we fetch PDAL data as a numpy array"""
+    xml = fetch_xml('../test/data/pipeline/pipeline_read.xml')
+    r = libpdalpython.PyPipeline(xml)
+    r.execute()
+    arrays = r.arrays()
+    self.assertEqual(len(arrays), 1)
+
+    a = arrays[0]
+    self.assertAlmostEqual(a[0][0], 637012.24, 7)
+    self.assertAlmostEqual(a[1064][2], 423.92, 7)
+
+  def test_merged_arrays(self):
+    """Can we fetch merged PDAL data """
+    xml = fetch_xml('../test/data/filters/chip.xml')
+    r = libpdalpython.PyPipeline(xml)
+    r.execute()
+    arrays = r.arrays()
+    self.assertEqual(len(arrays), 43)
+    # data are going to all be a little different
+    # due to sorting not being stable
+#     for a in arrays:
+#         self.assertAlmostEqual(a[0][0], 494057.30, 2)
+#         self.assertAlmostEqual(a[0][2], 130.63, 2)
+def test_suite():
+    return unittest.TestSuite(
+        [TestPDALArray])
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/python/test/test_pipeline.py b/python/test/test_pipeline.py
new file mode 100644
index 0000000..cd6be3d
--- /dev/null
+++ b/python/test/test_pipeline.py
@@ -0,0 +1,51 @@
+import unittest
+import pdal
+import pdal.pipeline_xml as pxml
+
+class TestXML(unittest.TestCase):
+
+    def test_simplest_xml(self):
+        p = pxml.Pipeline()
+        p.source = pxml.Reader('foo')
+        xml = p.xml()
+        self.assertEqual(xml.getroot().attrib['version'], pdal.__version__)
+        self.assertEqual(xml.find('Reader').attrib['type'],
+                         'readers.foo')
+
+    def test_writer(self):
+        xml = pxml.Writer('bar').xml()
+        self.assertEqual(xml.tag, 'Writer')
+        self.assertEqual(xml.attrib['type'], 'writers.bar')
+
+    def test_pipeline_version(self):
+        xml = pxml.Pipeline('custom version').xml()
+        self.assertEqual(xml.getroot().attrib['version'], 'custom version')
+
+    def test_filter(self):
+        xml = pxml.Filter('foo').xml()
+        self.assertEqual(xml.tag, 'Filter')
+        self.assertEqual(xml.attrib['type'], 'filters.foo')
+
+    def test_multifilter(self):
+        xml = pxml.MultiFilter('foo').xml()
+        self.assertEqual(xml.tag, 'MultiFilter')
+        self.assertEqual(xml.attrib['type'], 'filters.foo')
+
+    def test_writer_source(self):
+        writer = pxml.Writer('foo')
+        writer.source = pxml.Reader('bar')
+        xml = writer.xml()
+        self.assertTrue(xml.find('Reader') is not None)
+
+    def test_multifilter_source(self):
+        mfilter = pxml.MultiFilter('multi')
+        mfilter.source = [pxml.Reader('foo'), pxml.Reader('bar')]
+        xml = mfilter.xml()
+        self.assertEqual(len(xml.findall('Reader')), 2)
+
+def test_suite():
+    return unittest.TestSuite(
+        [TestXML])
+
+if __name__ == '__main__':
+    unittest.main()
diff --git a/schemas/16-dim-schema.xml b/schemas/16-dim-schema.xml
new file mode 100644
index 0000000..476f375
--- /dev/null
+++ b/schemas/16-dim-schema.xml
@@ -0,0 +1,218 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <pc:dimension>
+    <pc:position>1</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>X coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>X</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>2ee118d1-119e-4906-99c3-42934203f872</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>2</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>Y coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>Y</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>87707eee-2f30-4979-9987-8ef747e30275</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>3</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>Z coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>Z</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>e74b5e41-95e6-4cf2-86ad-e3f5a996da5d</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>4</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>The intensity value is the integer representation of the pulse return magnitude. This value is optional and system specific. However, it should always be included if available.</pc:description>
+    <pc:name>Intensity</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>61e90c9a-42fc-46c7-acd3-20d67bd5626f</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>5</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>Return Number: The Return Number is the pulse return number for a given output pulse. A given output laser pulse can have many returns, and they must be marked in sequence of return. The first return will have a Return Number of one, the second a Return Number of two, and so on up to five returns.</pc:description>
+    <pc:name>ReturnNumber</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>ffe5e5f8-4cec-4560-abf0-448008f7b89e</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>6</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>Number of Returns (for this emitted pulse): The Number of Returns is the total number of returns for a given pulse. For example, a laser data point may be return two (Return Number) within a total number of five returns.</pc:description>
+    <pc:name>NumberOfReturns</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>7c28bfd4-a9ed-4fb2-b07f-931c076fbaf0</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>7</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>The Scan Direction Flag denotes the direction at which the scanner mirror was traveling at the time of the output pulse. A bit value of 1 is a positive scan direction, and a bit value of 0 is a negative scan direction (where positive scan direction is a scan moving from the left side of the in-track direction to the right side and negative the opposite).</pc:description>
+    <pc:name>ScanDirectionFlag</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>13019a2c-cf88-480d-a995-0162055fe5f9</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>8</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>The Edge of Flight Line data bit has a value of 1 only when the point is at the end of a scan. It is the last point on a given scan line before it changes direction.</pc:description>
+    <pc:name>EdgeOfFlightLine</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>108c18f2-5cc0-4669-ae9a-f41eb4006ea5</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>9</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>Classification in LAS 1.0 was essentially user defined and optional. LAS 1.1 defines a standard set of ASPRS classifications. In addition, the field is now mandatory. If a point has never been classified, this byte must be set to zero. There are no user defined classes since both point format 0 and point format 1 supply 8 bits per point for user defined operations. Note that the format for classification is a bit encoded field with the lower five bits used for class a [...]
+    <pc:name>Classification</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>b4c67de9-cef1-432c-8909-7c751b2a4e0b</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>10</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>The Scan Angle Rank is a signed one-byte number with a valid range from -90 to +90. The Scan Angle Rank is the angle (rounded to the nearest integer in the absolute value sense) at which the laser point was output from the laser system including the roll of the aircraft. The scan angle is within 1 degree of accuracy from +90 to 90 degrees. The scan angle is an angle based on 0 degrees being nadir, and 90 degrees to the left side of the aircraft in the direction of fli [...]
+    <pc:name>ScanAngleRank</pc:name>
+    <pc:interpretation>int8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>aaadaf77-e0c9-4df0-81a7-27060794cd69</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>11</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>This field may be used at the users discretion</pc:description>
+    <pc:name>UserData</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>70eb558e-63d4-4804-b1db-fc2fd716927c</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>12</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>This value indicates the file from which this point originated. Valid values for this field are 1 to 65,535 inclusive with zero being used for a special case discussed below. The numerical value corresponds to the File Source ID from which this point originated. Zero is reserved as a convenience to system implementers. A Point Source ID of zero implies that this point originated in this file. This implies that processing software should set the Point Source ID equal t [...]
+    <pc:name>PointSourceId</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>4e42e96a-6af0-4fdd-81cb-6216ff47bf6b</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>13</pc:position>
+    <pc:size>8</pc:size>
+    <pc:description>The GPS Time is the double floating point time tag value at which the point was acquired. It is GPS Week Time if the Global Encoding low bit is clear and Adjusted Standard GPS Time if the Global Encoding low bit is set (see Global Encoding in the Public Header Block description).</pc:description>
+    <pc:name>GpsTime</pc:name>
+    <pc:interpretation>double</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>aec43586-2711-4e59-9df0-65aca78a4ffc</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>14</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>The red image channel value associated with this point</pc:description>
+    <pc:name>Red</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>a42ce297-6aa2-4a62-bd29-2db19ba862d5</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>15</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>The green image channel value associated with this point</pc:description>
+    <pc:name>Green</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>7752759d-5713-48cd-9842-51db350cc979</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>16</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>The blue image channel value associated with this point</pc:description>
+    <pc:name>Blue</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>5c1a99c8-1829-4d5b-8735-4f6f393a7970</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:metadata>
+    <Reader type="readers.pipeline">
+      <Option name="debug">false</Option>
+      <Option name="filename">pipeline_reproject.xml</Option>
+      <Option name="verbose">0</Option>
+      <Metadata name="filters.inplacereprojection" type="blank">
+        <Metadata name="spatialreference" type="spatialreference" description="the coordinate system">PROJCS["NAD83(HARN) / Oregon Lambert",
+    GEOGCS["NAD83(HARN)",
+        DATUM["NAD83_High_Accuracy_Reference_Network",
+            SPHEROID["GRS 1980",6378137,298.257222101,
+                AUTHORITY["EPSG","7019"]],
+            TOWGS84[0,0,0,0,0,0,0],
+            AUTHORITY["EPSG","6152"]],
+        PRIMEM["Greenwich",0,
+            AUTHORITY["EPSG","8901"]],
+        UNIT["degree",0.0174532925199433,
+            AUTHORITY["EPSG","9122"]],
+        AUTHORITY["EPSG","4152"]],
+    PROJECTION["Lambert_Conformal_Conic_2SP"],
+    PARAMETER["standard_parallel_1",43],
+    PARAMETER["standard_parallel_2",45.5],
+    PARAMETER["latitude_of_origin",41.75],
+    PARAMETER["central_meridian",-120.5],
+    PARAMETER["false_easting",400000],
+    PARAMETER["false_northing",0],
+    UNIT["metre",1,
+        AUTHORITY["EPSG","9001"]],
+    AXIS["X",EAST],
+    AXIS["Y",NORTH],
+    AUTHORITY["EPSG","2993"]]</Metadata>
+      <Metadata name="a_number" type="integer">32</Metadata>    
+      <Metadata name="a_boolean" type="boolean">true</Metadata>
+      <Metadata name="a_float" type="float">1234.5678</Metadata>
+      <Metadata name="a_double" type="double">1234.5678</Metadata>
+      <Metadata name="a_string" type="string">some string</Metadata>
+      <Metadata name="a_binary" type="base64Binary">true</Metadata>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw==</Metadata>
+    </Reader>
+  </pc:metadata>
+  <pc:orientation>point</pc:orientation>
+</pc:PointCloudSchema>
diff --git a/schemas/6-dim-schema.xml b/schemas/6-dim-schema.xml
new file mode 100644
index 0000000..05a892b
--- /dev/null
+++ b/schemas/6-dim-schema.xml
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <pc:dimension>
+    <pc:position>1</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>X coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>X</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>2ee118d1-119e-4906-99c3-42934203f872</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>2</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>Y coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>Y</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>87707eee-2f30-4979-9987-8ef747e30275</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>3</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>Z coordinate as a long integer. You must use the scale and offset information of the header to determine the double value.</pc:description>
+    <pc:name>Z</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>e74b5e41-95e6-4cf2-86ad-e3f5a996da5d</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>4</pc:position>
+    <pc:size>2</pc:size>
+    <pc:description>The intensity value is the integer representation of the pulse return magnitude. This value is optional and system specific. However, it should always be included if available.</pc:description>
+    <pc:name>Intensity</pc:name>
+    <pc:interpretation>uint16_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>61e90c9a-42fc-46c7-acd3-20d67bd5626f</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>5</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>Return Number: The Return Number is the pulse return number for a given output pulse. A given output laser pulse can have many returns, and they must be marked in sequence of return. The first return will have a Return Number of one, the second a Return Number of two, and so on up to five returns.</pc:description>
+    <pc:name>ReturnNumber</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>ffe5e5f8-4cec-4560-abf0-448008f7b89e</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:dimension>
+    <pc:position>6</pc:position>
+    <pc:size>1</pc:size>
+    <pc:description>Number of Returns (for this emitted pulse): The Number of Returns is the total number of returns for a given pulse. For example, a laser data point may be return two (Return Number) within a total number of five returns.</pc:description>
+    <pc:name>NumberOfReturns</pc:name>
+    <pc:interpretation>uint8_t</pc:interpretation>
+    <pc:scale>1</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>7c28bfd4-a9ed-4fb2-b07f-931c076fbaf0</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:metadata>
+    <Reader type="readers.pipeline">
+      <Option name="debug">false</Option>
+      <Option name="filename">pipeline_reproject.xml</Option>
+      <Option name="verbose">0</Option>
+      <Metadata name="filters.inplacereprojection" type="blank">
+        <Metadata name="spatialreference" type="spatialreference" description="the coordinate system">PROJCS["NAD83(HARN) / Oregon Lambert",
+    GEOGCS["NAD83(HARN)",
+        DATUM["NAD83_High_Accuracy_Reference_Network",
+            SPHEROID["GRS 1980",6378137,298.257222101,
+                AUTHORITY["EPSG","7019"]],
+            TOWGS84[0,0,0,0,0,0,0],
+            AUTHORITY["EPSG","6152"]],
+        PRIMEM["Greenwich",0,
+            AUTHORITY["EPSG","8901"]],
+        UNIT["degree",0.0174532925199433,
+            AUTHORITY["EPSG","9122"]],
+        AUTHORITY["EPSG","4152"]],
+    PROJECTION["Lambert_Conformal_Conic_2SP"],
+    PARAMETER["standard_parallel_1",43],
+    PARAMETER["standard_parallel_2",45.5],
+    PARAMETER["latitude_of_origin",41.75],
+    PARAMETER["central_meridian",-120.5],
+    PARAMETER["false_easting",400000],
+    PARAMETER["false_northing",0],
+    UNIT["metre",1,
+        AUTHORITY["EPSG","9001"]],
+    AXIS["X",EAST],
+    AXIS["Y",NORTH],
+    AUTHORITY["EPSG","2993"]]</Metadata>
+      <Metadata name="a_number" type="integer">32</Metadata>    
+      <Metadata name="a_boolean" type="boolean">true</Metadata>
+      <Metadata name="a_float" type="float">1234.5678</Metadata>
+      <Metadata name="a_double" type="double">1234.5678</Metadata>
+      <Metadata name="a_string" type="string">some string</Metadata>
+      <Metadata name="a_binary" type="base64Binary">true</Metadata>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw==</Metadata>
+    </Reader>
+  </pc:metadata>
+  <pc:orientation>point</pc:orientation>
+</pc:PointCloudSchema>
diff --git a/schemas/LAS.xsd b/schemas/LAS.xsd
new file mode 100644
index 0000000..c807efd
--- /dev/null
+++ b/schemas/LAS.xsd
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<xs:schema xmlns:pc="http://pointcloud.org/schemas/PC/" xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://pointcloud.org/schemas/PC/" version="1.3">
+
+    <xs:simpleType name="interpretationType">
+        <xs:annotation>
+      <xs:documentation>
+            Common interpretations of the data that may be used.  This
+            type may be extended under the expectation that clients
+            know how to consume the data.  In the case of string-like
+            data, use uint8_t (common byte) as the interpretation
+            and transform accordingly.  Because nulls (or even
+            multi-byte strings) might be allowed, there are
+            no common string interpretations provided by default.
+        </xs:documentation>
+    </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="int8_t"/>
+            <xs:enumeration value="uint8_t"/>
+            <xs:enumeration value="int16_t"/>
+            <xs:enumeration value="uint16_t"/>
+            <xs:enumeration value="int32_t"/>
+            <xs:enumeration value="uint32_t"/>
+            <xs:enumeration value="int64_t"/>
+            <xs:enumeration value="uint64_t"/>
+            <xs:enumeration value="double"/>
+            <xs:enumeration value="float"/>
+            <xs:enumeration value="unknown"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:complexType name="rangeType">
+        <xs:attribute name="units" type="pc:interpretationType"/>
+        <xs:attribute name="value" type="xs:decimal"/>
+    </xs:complexType>
+
+    <xs:simpleType name="endiannessType">
+        <xs:annotation>
+      <xs:documentation>
+            Used to describe the storage endianness of the data in the dimension.
+        </xs:documentation>
+    </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="big"/>
+            <xs:enumeration value="little"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:complexType name="dimensionType">
+        <xs:all>
+            <xs:element name="position" type="xs:positiveInteger">
+                <xs:annotation>
+                    <xs:documentation>
+                        The dimension's position in the block of point data
+                        (counting from 1)
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+            <xs:element name="size" type="xs:positiveInteger">
+                <xs:annotation>
+                    <xs:documentation>
+                        The size of this dimension in bytes.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+            <xs:element minOccurs="0" name="name" type="xs:string"/>
+            <xs:element minOccurs="0" name="description" type="xs:string"/>
+
+            <xs:element minOccurs="0" name="active" type="xs:boolean">
+                <xs:annotation>
+                    <xs:documentation>
+                    A dimension may have be holding its place in bytes but
+                    might not have actual values that mean anything. This flag
+                    can be used to skip the dimension in that case.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+
+            <xs:element minOccurs="0" name="interpretation" type="pc:interpretationType">
+                <xs:annotation>
+                    <xs:documentation>
+                        This element describes how the data should be
+                        interpreted. In the case of conflicting data, for
+                        example when then size is 2,  but the
+                        interpretation is "uint32_t", the size determines how
+                        much precision is available.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+            <xs:element minOccurs="0" name="minimum" type="pc:rangeType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The minimum value of this dimension.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+            <xs:element minOccurs="0" name="maximum" type="pc:rangeType">
+                <xs:annotation>
+                    <xs:documentation>
+                        The maximum value of this dimension.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+
+            <xs:element minOccurs="0" name="offset" type="xs:double">
+                <xs:annotation>
+                    <xs:documentation>
+                        The double offset to use when applying a scaling
+                        factor to an integer dimension
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element minOccurs="0" name="scale" type="xs:double">
+                <xs:annotation>
+                    <xs:documentation>
+                        The scale of this dimension.  Used to support scaled integer types
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element minOccurs="0" name="endianness" type="pc:endiannessType">
+                <xs:annotation>
+                    <xs:documentation>
+                        Describes the storage endianness of the dimension.
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element name="metadata" minOccurs="0" maxOccurs="1" type="xs:anyType"/>
+
+            <xs:element minOccurs="0" name="uuid" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unused
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+            <xs:element minOccurs="0" name="parent_uuid" type="xs:string">
+                <xs:annotation>
+                    <xs:documentation>
+                        Unused
+                    </xs:documentation>
+                </xs:annotation>
+            </xs:element>
+        </xs:all>
+    </xs:complexType>
+
+    <xs:simpleType name="orientationType">
+        <xs:annotation>
+      <xs:documentation>
+            Used to describe the storage orientation of the word. The
+            orientation of dimension might be point-major or dimension-major.
+            A point-major dimension, the default orientation,
+            has its dimensions composed as XYZXYZXYZ. A dimension-major
+            one has data composed as XXXYYYZZZ.
+        </xs:documentation>
+    </xs:annotation>
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="point"/>
+            <xs:enumeration value="dimension"/>
+            <xs:enumeration value="unknown"/>
+        </xs:restriction>
+    </xs:simpleType>
+
+    <xs:element name="PointCloudSchema">
+        <xs:complexType>
+            <xs:sequence>
+                <xs:element maxOccurs="unbounded" minOccurs="1" name="dimension" type="pc:dimensionType"/>
+                <xs:element name="metadata" minOccurs="0" maxOccurs="1" type="xs:anyType"/>
+                <xs:element name="orientation" minOccurs="0" maxOccurs="1" type="pc:orientationType"/>
+                <xs:element name="version" minOccurs="0" maxOccurs="1" type="xs:decimal"/>
+            </xs:sequence>
+        </xs:complexType>
+    </xs:element>
+
+
+</xs:schema>
diff --git a/schemas/pdal_pipeline.xsd b/schemas/pdal_pipeline.xsd
new file mode 100644
index 0000000..4b0c816
--- /dev/null
+++ b/schemas/pdal_pipeline.xsd
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+
+    <xsd:element name="Pipeline" type="PipelineType" />
+
+    <xsd:complexType name="PipelineType">
+        <xsd:choice>
+            <xsd:element name="Writer" type="WriterType" />
+            <xsd:element name="Reader" type="ReaderType" />
+            <xsd:element name="Filter" type="FilterType" />
+            <xsd:element name="MultiFilter" type="MultiFilterType" />
+        </xsd:choice>
+        <xsd:attribute name="type" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="TypeAndOptionsType">
+        <xsd:sequence>
+            <xsd:element name="Option" type="OptionType" minOccurs="0" maxOccurs="unbounded" />
+        </xsd:sequence>
+        <xsd:attribute name="type" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="OptionType" mixed="true">
+        <xsd:attribute name="name" type="xsd:string" use="required" />
+    </xsd:complexType>
+
+    <xsd:complexType name="StageType">
+        <xsd:complexContent>
+            <xsd:extension base="TypeAndOptionsType" />
+        </xsd:complexContent>
+    </xsd:complexType>
+
+    <xsd:complexType name="WriterType">
+        <xsd:complexContent>
+            <xsd:extension base="TypeAndOptionsType">
+                <xsd:choice>
+                    <xsd:element name="Reader" type="ReaderType" />
+                    <xsd:element name="Filter" type="FilterType" />
+                    <xsd:element name="MultiFilter" type="MultiFilterType" />
+                </xsd:choice>
+            </xsd:extension>
+        </xsd:complexContent>
+    </xsd:complexType>
+
+    <xsd:complexType name="ReaderType">
+        <xsd:complexContent>
+            <xsd:extension base="StageType" />
+        </xsd:complexContent>
+    </xsd:complexType>
+
+    <xsd:complexType name="FilterType">
+        <xsd:complexContent>
+            <xsd:extension base="StageType">
+                <xsd:choice>
+                    <xsd:element name="Reader" type="ReaderType" />
+                    <xsd:element name="Filter" type="FilterType" />
+                    <xsd:element name="MultiFilter" type="MultiFilterType" />
+                </xsd:choice>
+            </xsd:extension>
+        </xsd:complexContent>
+    </xsd:complexType>
+
+    <xsd:complexType name="MultiFilterType">
+        <xsd:complexContent>
+            <xsd:extension base="StageType">
+                <xsd:choice maxOccurs="unbounded">
+                    <xsd:element name="Reader" type="ReaderType" />
+                    <xsd:element name="Filter" type="FilterType" />
+                    <xsd:element name="MultiFilter" type="MultiFilterType" />
+                </xsd:choice>
+            </xsd:extension>
+        </xsd:complexContent>
+    </xsd:complexType>
+    
+</xsd:schema>
diff --git a/schemas/utf8-schema.xml b/schemas/utf8-schema.xml
new file mode 100644
index 0000000..e92919e
--- /dev/null
+++ b/schemas/utf8-schema.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pc:PointCloudSchema xmlns:pc="http://pointcloud.org/schemas/PC/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <pc:dimension>
+    <pc:position>1</pc:position>
+    <pc:size>4</pc:size>
+    <pc:description>Ég get etið gler án þess að meiða mig.</pc:description>
+    <pc:name>X</pc:name>
+    <pc:interpretation>int32_t</pc:interpretation>
+    <pc:scale>0.01</pc:scale>
+    <pc:active>true</pc:active>
+    <pc:uuid>2ee118d1-119e-4906-99c3-42934203f872</pc:uuid>
+    <pc:parent_uuid>00000000-0000-0000-0000-000000000000</pc:parent_uuid>
+  </pc:dimension>
+  <pc:metadata>
+    <Metadata name="אני יכול לאכול זכוכית וזה לא מזיק לי." type="string">أنا قادر على أكل الزجاج و هذا لا يؤلمني</Metadata>
+  </pc:metadata>
+  <pc:orientation>point</pc:orientation>
+</pc:PointCloudSchema>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 0000000..4dc48e7
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,215 @@
+###############################################################################
+#
+# src/CMakeLists.txt controls building of PDAL library
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+###############################################################################
+
+###############################################################################
+# Source files specification
+#
+# Naming format:
+#   PDAL_CPP - all the .cpp files
+#   PDAL_HPP - all the .hpp files
+#   PDAL_<dirname>_CPP - all the .cpp files for the given subdir/namespace
+#   ...
+
+
+set(PDAL_HPP "")
+set(PDAL_CPP "")
+
+if (PDAL_HAVE_LIBXML2)
+    set(PDAL_XML_HEADER ${PDAL_HEADERS_DIR}/XMLSchema.hpp)
+    set(DB_DRIVER_HEADERS
+        "${PDAL_HEADERS_DIR}/DbReader.hpp"
+        "${PDAL_HEADERS_DIR}/DbWriter.hpp"
+    )
+    set(PDAL_XML_SRC XMLSchema.cpp)
+    set(DB_DRIVER_SRCS
+        DbReader.cpp
+        DbWriter.cpp
+    )
+endif()
+
+#
+# base
+#
+set(PDAL_BASE_HPP
+  "${PDAL_HEADERS_DIR}/pdal_types.hpp"
+  "${PDAL_HEADERS_DIR}/BufferReader.hpp"
+  "${PDAL_HEADERS_DIR}/Compression.hpp"
+  "${PDAL_HEADERS_DIR}/Dimension.hpp"
+  "${PDAL_HEADERS_DIR}/Filter.hpp"
+  "${PDAL_HEADERS_DIR}/FlexWriter.hpp"
+  "${PDAL_HEADERS_DIR}/GDALUtils.hpp"
+  "${PDAL_HEADERS_DIR}/GlobalEnvironment.hpp"
+  "${PDAL_HEADERS_DIR}/gitsha.h"
+  "${PDAL_HEADERS_DIR}/KDIndex.hpp"
+  "${PDAL_HEADERS_DIR}/KernelFactory.hpp"
+  "${PDAL_HEADERS_DIR}/Kernel.hpp"
+  "${PDAL_HEADERS_DIR}/KernelSupport.hpp"
+  "${PDAL_HEADERS_DIR}/Log.hpp"
+  "${PDAL_HEADERS_DIR}/Metadata.hpp"
+  "${PDAL_HEADERS_DIR}/Options.hpp"
+  "${PDAL_HEADERS_DIR}/PipelineManager.hpp"
+  "${PDAL_HEADERS_DIR}/PipelineReader.hpp"
+  "${PDAL_HEADERS_DIR}/PipelineWriter.hpp"
+  "${PDAL_HEADERS_DIR}/PointLayout.hpp"
+  "${PDAL_HEADERS_DIR}/PointTable.hpp"
+  "${PDAL_HEADERS_DIR}/PointView.hpp"
+  "${PDAL_HEADERS_DIR}/PointViewIter.hpp"
+  "${PDAL_HEADERS_DIR}/QuadIndex.hpp"
+  "${PDAL_HEADERS_DIR}/Reader.hpp"
+  "${PDAL_HEADERS_DIR}/SpatialReference.hpp"
+  "${PDAL_HEADERS_DIR}/Stage.hpp"
+  "${PDAL_HEADERS_DIR}/StageFactory.hpp"
+  "${PDAL_HEADERS_DIR}/StageWrapper.hpp"
+  "${PDAL_HEADERS_DIR}/UserCallback.hpp"
+  "${PDAL_HEADERS_DIR}/Writer.hpp"
+  "${PDAL_SRC_DIR}/StageRunner.hpp"
+    ${PDAL_XML_HEADER}
+    ${DB_DRIVER_HEADERS}
+)
+
+set(PDAL_BASE_CPP
+  DynamicLibrary.cpp
+  Filter.cpp
+  gitsha.cpp
+  GDALUtils.cpp
+  GlobalEnvironment.cpp
+  Kernel.cpp
+  KernelFactory.cpp
+  KernelSupport.cpp
+  Log.cpp
+  Options.cpp
+  PDALUtils.cpp
+
+  PointLayout.cpp
+  PointTable.cpp
+  PointView.cpp
+
+  PipelineManager.cpp
+  PipelineReader.cpp
+  PipelineWriter.cpp
+  PluginManager.cpp
+  QuadIndex.cpp
+  Reader.cpp
+  SpatialReference.cpp
+  Stage.cpp
+  StageFactory.cpp
+  Writer.cpp
+  ${PDAL_XML_SRC}
+  ${PDAL_LAZPERF_SRC}
+  ${DB_DRIVER_SRCS}
+)
+
+list (APPEND PDAL_CPP ${PDAL_BASE_CPP} )
+list (APPEND PDAL_HPP ${PDAL_BASE_HPP} )
+
+#
+# config
+#
+
+set(PDAL_CONFIG_HPP
+  "${PDAL_HEADERS_DIR}/pdal_export.hpp"
+  "${PDAL_HEADERS_DIR}/pdal_internal.hpp"
+  "${PDAL_HEADERS_DIR}/pdal_config.hpp"
+  "${PROJECT_BINARY_DIR}/include/pdal/pdal_defines.h"
+)
+
+set (PDAL_CONFIG_CPP
+  "${PROJECT_SOURCE_DIR}/src/pdal_config.cpp"
+)
+
+list (APPEND PDAL_CPP ${PDAL_CONFIG_CPP} )
+list (APPEND PDAL_HPP ${PDAL_CONFIG_HPP} )
+
+# Standard include directory of PDAL library
+
+###############################################################################
+# Targets settings
+
+set(PDAL_SOURCES
+  ${PDAL_HPP}
+  ${PDAL_CPP}
+  ${PDAL_TARGET_OBJECTS}
+)
+
+# see https://github.com/PDAL/PDAL/issues/108 for discussion on this
+#SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "../pdal_defines.h;../include/pdal/pdal_defines.h")
+
+# NOTE:
+# This hack is required to correctly link static into shared library.
+# Such practice is not recommended as not portable, instead each library,
+# static and shared should be built from sources separately.
+#if(UNIX)
+#  add_definitions("-fPIC")
+#endif()
+
+if(WIN32)
+    if (NOT WITH_STATIC_LASZIP)
+        add_definitions("-DLASZIP_DLL_IMPORT=1")
+    endif()
+endif()
+
+PDAL_ADD_LIBRARY(${PDAL_BASE_LIB_NAME} ${PDAL_SOURCES})
+
+set_target_properties(${PDAL_BASE_LIB_NAME} PROPERTIES VERSION "${PDAL_BUILD_VERSION}"
+    SOVERSION "${PDAL_API_VERSION}"
+    CLEAN_DIRECT_OUTPUT 1)
+
+if (WITH_LASZIP)
+    target_link_libraries(${PDAL_BASE_LIB_NAME} ${LASZIP_LIBRARY})
+endif()
+
+if (PDAL_HAVE_LIBXML2)
+    target_link_libraries(${PDAL_BASE_LIB_NAME} ${LIBXML2_LIBRARIES})
+endif()
+
+#
+# On OSX we reexport the symbols in libpdal_util.dylib into libpdalcpp.dylib
+# so that users only need link libpdalcpp.
+#
+if (APPLE)
+    set(UTIL_LIB "-Wl,-reexport_library,$<TARGET_SONAME_FILE:${PDAL_UTIL_LIB_NAME}>")
+else()
+    set(UTIL_LIB ${PDAL_UTIL_LIB_NAME})
+endif()
+
+
+target_link_libraries(${PDAL_BASE_LIB_NAME}
+    ${CMAKE_THREAD_LIBS_INIT}
+    ${GDAL_LIBRARY}
+    ${GEOS_LIBRARY}
+    ${ZLIB_LIBRARIES}
+    ${UTIL_LIB}
+)
+
+if (WITH_GEOTIFF)
+    target_link_libraries(${PDAL_BASE_LIB_NAME} ${GEOTIFF_LIBRARY})
+endif()
+
+target_link_libraries(${PDAL_BASE_LIB_NAME} ${Boost_LIBRARIES})
+
+if(WIN32)
+    target_link_libraries(${PDAL_BASE_LIB_NAME} ws2_32)
+endif()
+
+###############################################################################
+# Targets installation
+
+#
+# On Linux, we install a linker script as libpdalcpp.so.  That file
+# specifies linking in libpdal_base.so and libpdal_util.so.  This allows
+# users to link a single library, libpdalcpp
+#
+if (UNIX AND NOT APPLE)
+    set(LIBNAME ${CMAKE_SHARED_LIBRARY_PREFIX}${PDAL_LIB_NAME})
+    install(FILES ${LIBNAME} DESTINATION ${PDAL_LIB_INSTALL_DIR}
+        RENAME ${LIBNAME}${CMAKE_SHARED_LIBRARY_SUFFIX})
+endif()
+
+install(DIRECTORY "${PDAL_HEADERS_DIR}/"
+  DESTINATION "${PDAL_INCLUDE_INSTALL_DIR}"
+  FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp")
diff --git a/src/DbReader.cpp b/src/DbReader.cpp
new file mode 100644
index 0000000..299dd10
--- /dev/null
+++ b/src/DbReader.cpp
@@ -0,0 +1,139 @@
+/******************************************************************************
+* Copyright (c) 2014,  Hobu Inc., hobu at hobu.co
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/DbReader.hpp>
+#include <pdal/PDALUtils.hpp>
+
+namespace pdal
+{
+
+void DbReader::loadSchema(PointLayoutPtr layout,
+    const std::string& schemaString)
+{
+    XMLSchema schema(schemaString);
+    loadSchema(layout, schema);
+}
+
+void DbReader::loadSchema(PointLayoutPtr layout, const XMLSchema& schema)
+{
+    m_layout = layout;
+    m_dims = schema.xmlDims();
+
+    // Override XYZ to doubles and use those going forward
+    // we will apply any scaling set before handing it off
+    // to PDAL.
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+
+    m_orientation = schema.orientation();
+    m_packedPointSize = 0;
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        di->m_dimType.m_id =
+            layout->registerOrAssignDim(di->m_name, di->m_dimType.m_type);
+        m_packedPointSize += Dimension::size(di->m_dimType.m_type);
+    }
+}
+
+
+// If we start reading from a DB block with a different schema, reflect that
+// in the dimensions and size.
+void DbReader::updateSchema(const XMLSchema& schema)
+{
+    m_dims = schema.xmlDims();
+    m_orientation = schema.orientation();
+    m_packedPointSize = 0;
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        di->m_dimType.m_id = m_layout->findDim(di->m_name);
+        m_packedPointSize += Dimension::size(di->m_dimType.m_type);
+    }
+}
+
+
+DimTypeList DbReader::dbDimTypes() const
+{
+    DimTypeList dimTypes;
+
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        dimTypes.push_back(di->m_dimType);
+    return dimTypes;
+}
+
+
+size_t DbReader::dimOffset(Dimension::Id::Enum id) const
+{
+    size_t offset = 0;
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        if (di->m_dimType.m_id == id)
+            break;
+        offset += Dimension::size(di->m_dimType.m_type);
+    }
+    return offset;
+}
+
+
+void DbReader::writeField(PointView& view, const char *pos, const DimType& dim,
+    PointId idx)
+{
+    using namespace Dimension;
+
+    if (dim.m_id == Id::X || dim.m_id == Id::Y || dim.m_id == Id::Z)
+    {
+        Everything e;
+
+        memcpy(&e, pos, Dimension::size(dim.m_type));
+        double d = Utils::toDouble(e, dim.m_type);
+        d = (d * dim.m_xform.m_scale) + dim.m_xform.m_offset;
+        view.setField(dim.m_id, idx, d);
+    }
+    else
+        view.setField(dim.m_id, dim.m_type, idx, pos);
+}
+
+
+/// Write a point's packed data into a buffer.
+/// \param[in] view PointView to write to.
+/// \param[in] idx  Index of point to write.
+/// \param[in] buf  Pointer to packed DB point data.
+void DbReader::writePoint(PointView& view, PointId idx, const char *buf)
+{
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+    {
+        writeField(view, buf, di->m_dimType, idx);
+        buf += Dimension::size(di->m_dimType.m_type);
+    }
+}
+
+} // namespace pdal
diff --git a/src/DbWriter.cpp b/src/DbWriter.cpp
new file mode 100644
index 0000000..9e5e063
--- /dev/null
+++ b/src/DbWriter.cpp
@@ -0,0 +1,258 @@
+/******************************************************************************
+* Copyright (c) 2014,  Hobu Inc., hobu at hobu.co
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/DbWriter.hpp>
+
+namespace pdal
+{
+
+// Build the list of dimensions for the output schema.
+// Placing this here allows validation of dimensions before execution begins.
+void DbWriter::prepared(PointTableRef table)
+{
+    using namespace Dimension;
+
+    PointLayoutPtr layout = table.layout();
+
+    if (m_outputDims.empty())
+    {
+        for (auto& dimType : layout->dimTypes())
+            m_dbDims.push_back(XMLDim(dimType, layout->dimName(dimType.m_id)));
+        return;
+    }
+
+    DimTypeList dims;
+    for (std::string& s : m_outputDims)
+    {
+        DimType dt = layout->findDimType(s);
+        if (dt.m_id == Id::Unknown)
+        {
+            std::ostringstream oss;
+            oss << "Invalid dimension '" << s << "' specified for "
+                "'output_dims' option.";
+            throw pdal_error(oss.str());
+        }
+        m_dbDims.push_back(XMLDim(dt, layout->dimName(dt.m_id)));
+    }
+}
+
+
+void DbWriter::ready(PointTableRef /*table*/)
+{
+    using namespace Dimension;
+
+    // Determine if X, Y and Z values should be written as Signed32 along with
+    // a scale factor and offset instead of being written as Double.
+    m_locationScaling = (m_xXform.nonstandard() || m_yXform.nonstandard() ||
+        m_zXform.nonstandard());
+
+    auto cmp = [](const XMLDim& d1, const XMLDim& d2) -> bool
+    {
+        long id1 = d1.m_dimType.m_id;
+        long id2 = d2.m_dimType.m_id;
+
+        // Put X, Y and Z at the end of the list.
+        if (id1 == Id::X || id1 == Id::Y || id1 == Id::Z)
+            id1 += 1000000;
+        if (id2 == Id::X || id2 == Id::Y || id2 == Id::Z)
+            id2 += 1000000;
+        return id1 < id2;
+    };
+
+    // Sort the dimensions so that X, Y & Z are at the end.
+    std::sort(m_dbDims.begin(), m_dbDims.end(), cmp);
+
+    // Suck the dimTypes out of the dbDims so that they can be used to
+    // retrieve data from the point table.
+    // Set the packed type into the dbDim if necessary and save off the
+    // index of X, Y and Z for location scaling.
+    m_dimTypes.clear();
+    m_xOffsets = std::make_pair(-1, -1);
+    m_yOffsets = std::make_pair(-1, -1);
+    m_zOffsets = std::make_pair(-1, -1);
+    m_packedPointSize = 0;
+    m_dbPointSize = 0;
+    for (auto& xmlDim : m_dbDims)
+    {
+        m_dimTypes.push_back(xmlDim.m_dimType);
+        DimType& dt = m_dimTypes.back();
+        // Dim types are stored in the map to allow fast access in readField.
+        m_dimMap[(int)dt.m_id] = dt;
+
+        if (m_locationScaling)
+        {
+            if (xmlDim.m_dimType.m_id == Id::X)
+            {
+                xmlDim.m_dimType.m_xform = m_xXform;
+                xmlDim.m_dimType.m_type = Type::Signed32;
+                m_xOffsets = std::make_pair(m_packedPointSize, m_dbPointSize);
+            }
+            if (xmlDim.m_dimType.m_id == Id::Y)
+            {
+                xmlDim.m_dimType.m_xform = m_yXform;
+                xmlDim.m_dimType.m_type = Type::Signed32;
+                m_yOffsets = std::make_pair(m_packedPointSize, m_dbPointSize);
+            }
+            if (xmlDim.m_dimType.m_id == Id::Z)
+            {
+                xmlDim.m_dimType.m_xform = m_zXform;
+                xmlDim.m_dimType.m_type = Type::Signed32;
+                m_zOffsets = std::make_pair(m_packedPointSize, m_dbPointSize);
+            }
+        }
+        m_packedPointSize += Dimension::size(dt.m_type);
+        m_dbPointSize += Dimension::size(xmlDim.m_dimType.m_type);
+    }
+}
+
+
+/// Make sure that computed offsets are stored in the schema.
+void DbWriter::setAutoXForm(const PointViewPtr view)
+{
+    using namespace Dimension;
+
+    Writer::setAutoXForm(view);
+    for (auto& xmlDim : m_dbDims)
+    {
+        if (xmlDim.m_dimType.m_id == Id::X)
+            xmlDim.m_dimType.m_xform = m_xXform;
+        if (xmlDim.m_dimType.m_id == Id::Y)
+            xmlDim.m_dimType.m_xform = m_yXform;
+        if (xmlDim.m_dimType.m_id == Id::Z)
+            xmlDim.m_dimType.m_xform = m_zXform;
+    }
+}
+
+
+/// Read a field from a PointView and write its value as formatted for output
+/// to the DB schema to the location as requested.
+/// \param[in] view     PointView to read from.
+/// \param[in] pos      Location in which to store field value.
+/// \param[in] id       ID of the dimension to read.
+/// \param[in] idx      Index of point to read.
+/// \return  Size of field as read.
+size_t DbWriter::readField(const PointView& view, char *pos,
+    Dimension::Id::Enum id, PointId idx)
+{
+    using namespace Dimension;
+
+    DimType& dt = m_dimMap[(int)id];
+    size_t size = Dimension::size(dt.m_type);
+
+    // Using the ID instead of a dimType as the arugment hides the complication
+    // of the "type" of the dimension to retrieve in the case of location
+    // scaling.
+    view.getField(pos, id, dt.m_type, idx);
+
+    auto iconvert = [pos](const XForm& xform, Dimension::Id::Enum dim)
+    {
+        double d;
+        int32_t i;
+
+        memcpy(&d, pos, sizeof(double));
+        d = (d - xform.m_offset) / xform.m_scale;
+        if (!Utils::numericCast(d, i))
+        {
+            std::ostringstream oss;
+            oss << "Unable to convert double to int32 for packed DB output: ";
+            oss << Dimension::name(dim) << ": (" << d << ").";
+            throw pdal_error(oss.str());
+        }
+        memcpy(pos, &i, sizeof(int32_t));
+    };
+
+    if (m_locationScaling)
+    {
+        // For X, Y or Z.
+        if (id == Id::X)
+        {
+            iconvert(m_xXform, Id::X);
+            size = sizeof(int32_t);
+        }
+        else if (id == Id::Y)
+        {
+            iconvert(m_yXform, Id::Y);
+            size = sizeof(int32_t);
+        }
+        else if (id == Id::Z)
+        {
+            iconvert(m_zXform, Id::Z);
+            size = sizeof(int32_t);
+        }
+    }
+    return size;
+}
+
+
+/// Read a point's data packed into a buffer.
+/// \param[in] view  PointView to read from.
+/// \param[in] idx  Index of point to read.
+/// \param[in] outbuf  Buffer to write to.
+/// \return  Number of bytes written to buffer.
+size_t DbWriter::readPoint(const PointView& view, PointId idx, char *outbuf)
+{
+    using namespace Dimension;
+
+    // Read the data for the output dimensions from the view into the outbuf.
+    view.getPackedPoint(m_dimTypes, idx, outbuf);
+
+    auto iconvert = [](const XForm& xform, Id::Enum dim,
+        const char *inpos, char *outpos)
+    {
+        double d;
+        int32_t i;
+
+        memcpy(&d, inpos, sizeof(double));
+        d = (d - xform.m_offset) / xform.m_scale;
+        if (!Utils::numericCast(d, i))
+        {
+            std::ostringstream oss;
+            oss << "Unable to convert double to int32 for packed DB output: ";
+            oss << Dimension::name(dim) << ": (" << d << ").";
+            throw pdal_error(oss.str());
+        }
+        memcpy(outpos, &i, sizeof(int32_t));
+    };
+
+    if (m_xOffsets.first >= 0)
+        iconvert(m_xXform, Id::X, outbuf + m_xOffsets.first,
+            outbuf + m_xOffsets.second);
+    if (m_yOffsets.first >= 0)
+        iconvert(m_yXform, Id::Y, outbuf + m_yOffsets.first,
+            outbuf + m_yOffsets.second);
+    if (m_zOffsets.first >= 0)
+        iconvert(m_zXform, Id::Z, outbuf + m_zOffsets.first,
+            outbuf + m_zOffsets.second);
+    return m_dbPointSize;
+}
+
+} // namespace pdal
diff --git a/src/DynamicLibrary.cpp b/src/DynamicLibrary.cpp
new file mode 100755
index 0000000..67ea492
--- /dev/null
+++ b/src/DynamicLibrary.cpp
@@ -0,0 +1,120 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// The DynamicLibrary was modeled very closely after the work of Gigi Sayfan in
+// the Dr. Dobbs article:
+// http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/206503957
+// The original work was released under the Apache License v2.
+
+#ifdef _WIN32
+  #include <Windows.h>
+#else
+  #include <dlfcn.h>
+#endif
+
+#include "DynamicLibrary.h"
+#include <sstream>
+#include <iostream>
+
+namespace pdal
+{
+
+DynamicLibrary::~DynamicLibrary()
+{
+    if (m_handle)
+    {
+#ifndef _WIN32
+        ::dlclose(m_handle);
+#else
+        ::FreeLibrary((HMODULE)m_handle);
+#endif
+    }
+}
+
+DynamicLibrary *DynamicLibrary::load(const std::string &name, 
+    std::string &errorString)
+{
+    if (name.empty()) 
+    {
+        errorString = "Empty path.";
+        return NULL;
+    }
+
+    void *handle = NULL;
+
+#ifdef _WIN32
+    handle = ::LoadLibraryA(name.c_str());
+    if (handle == NULL)
+    {
+        DWORD errorCode = ::GetLastError();
+        std::stringstream ss;
+        ss << std::string("LoadLibrary(") << name 
+            << std::string(") Failed. errorCode: ") 
+            << errorCode; 
+        errorString = ss.str();
+    }
+#else
+    handle = ::dlopen(name.c_str(), RTLD_NOW);
+    if (!handle) 
+    {
+        std::string dlErrorString;
+        const char *zErrorString = ::dlerror();
+        if (zErrorString)
+            dlErrorString = zErrorString;
+        errorString += "Failed to load \"" + name + '"';
+        if (dlErrorString.size())
+            errorString += ": " + dlErrorString;
+        return NULL;
+    }
+#endif
+    return new DynamicLibrary(handle);
+}
+
+
+void *DynamicLibrary::getSymbol(const std::string& symbol)
+{
+    if (!m_handle)
+        return NULL;
+
+    void *sym;
+#ifdef _WIN32
+    sym = ::GetProcAddress((HMODULE)m_handle, symbol.c_str());
+#else
+    sym = ::dlsym(m_handle, symbol.c_str());
+#endif
+    return sym;
+}
+
+} // namespace pdal
+
diff --git a/src/DynamicLibrary.h b/src/DynamicLibrary.h
new file mode 100755
index 0000000..f04fcda
--- /dev/null
+++ b/src/DynamicLibrary.h
@@ -0,0 +1,68 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// The DynamicLibrary was modeled very closely after the work of Gigi Sayfan in
+// the Dr. Dobbs article:
+// http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/206503957
+// The original work was released under the Apache License v2.
+
+#pragma once
+
+#include <string>
+
+namespace pdal
+{
+
+class DynamicLibrary
+{
+public:
+    static DynamicLibrary *load(const std::string &path,
+        std::string &errorString);
+
+    ~DynamicLibrary();
+    void *getSymbol(const std::string& name);
+
+private:
+    DynamicLibrary(void *handle) : m_handle(handle)
+    {}
+
+    DynamicLibrary();  // Unimplemented
+    DynamicLibrary(const DynamicLibrary &);  // Unimplemented
+  
+private:
+    void *m_handle;
+};
+
+} // namespace pdal
+
diff --git a/src/Filter.cpp b/src/Filter.cpp
new file mode 100644
index 0000000..d3f6a9b
--- /dev/null
+++ b/src/Filter.cpp
@@ -0,0 +1,62 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/Filter.hpp>
+#include <pdal/PipelineWriter.hpp>
+
+namespace pdal
+{
+
+boost::property_tree::ptree Filter::serializePipeline() const
+{
+    boost::property_tree::ptree tree;
+
+    tree.add("<xmlattr>.type", getName());
+
+    PipelineWriter::write_option_ptree(tree, getOptions());
+    PipelineWriter::writeMetadata(tree, m_metadata);
+
+    const Stage& stage = *getInputs()[0];
+    boost::property_tree::ptree subtree = stage.serializePipeline();
+
+    tree.add_child(subtree.begin()->first, subtree.begin()->second);
+
+    boost::property_tree::ptree root;
+    root.add_child("Filter", tree);
+
+    return root;
+}
+
+
+} // namespace pdal
diff --git a/src/GDALUtils.cpp b/src/GDALUtils.cpp
new file mode 100644
index 0000000..523f524
--- /dev/null
+++ b/src/GDALUtils.cpp
@@ -0,0 +1,120 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/GDALUtils.hpp>
+#include <pdal/SpatialReference.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <functional>
+#include <map>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+namespace pdal
+{
+namespace gdal
+{
+
+ErrorHandler::ErrorHandler(bool isDebug, pdal::LogPtr log)
+    : m_isDebug(isDebug)
+    , m_log(log)
+{
+    if (m_isDebug)
+    {
+        const char* gdal_debug = ::pdal::Utils::getenv("CPL_DEBUG");
+        if (gdal_debug == 0)
+        {
+            pdal::Utils::putenv("CPL_DEBUG=ON");
+        }
+        m_gdal_callback = std::bind(&ErrorHandler::log, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
+    }
+    else
+    {
+        m_gdal_callback = std::bind(&ErrorHandler::error, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
+    }
+
+    CPLPushErrorHandlerEx(&ErrorHandler::trampoline, this);
+}
+
+void ErrorHandler::log(::CPLErr code, int num, char const* msg)
+{
+    std::ostringstream oss;
+
+    if (code == CE_Failure || code == CE_Fatal)
+        error(code, num, msg);
+    else if (code == CE_Debug)
+    {
+        oss << "GDAL debug: " << msg;
+        if (m_log)
+            m_log->get(LogLevel::Debug) << oss.str() << std::endl;
+    }
+}
+
+
+void ErrorHandler::error(::CPLErr code, int num, char const* msg)
+{
+    std::ostringstream oss;
+    if (code == CE_Failure || code == CE_Fatal)
+    {
+        oss << "GDAL Failure number = " << num << ": " << msg;
+        throw pdal_error(oss.str());
+    }
+}
+
+
+ErrorHandler::~ErrorHandler()
+{
+    CPLPopErrorHandler();
+}
+
+} // namespace gdal
+
+std::string transformWkt(std::string wkt, const SpatialReference& from,
+    const SpatialReference& to)
+{
+    //ABELL - Should this throw?  Return empty string?
+    if (from.empty() || to.empty())
+        return wkt;
+
+    gdal::SpatialRef fromRef(from.getWKT());
+    gdal::SpatialRef toRef(to.getWKT());
+    gdal::Geometry geom(wkt, fromRef);
+    geom.transform(toRef);
+    return geom.wkt();
+}
+
+} // namespace pdal
+
diff --git a/src/GlobalEnvironment.cpp b/src/GlobalEnvironment.cpp
new file mode 100644
index 0000000..9e51eb2
--- /dev/null
+++ b/src/GlobalEnvironment.cpp
@@ -0,0 +1,106 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <mutex>
+
+//#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/GDALUtils.hpp>
+
+namespace pdal
+{
+
+static GlobalEnvironment* s_environment = 0;
+
+GlobalEnvironment& GlobalEnvironment::get()
+{
+    static std::once_flag flag;
+
+    auto init = []()
+    {
+        s_environment = new GlobalEnvironment();
+    };
+
+    std::call_once(flag, init);
+    return *s_environment;
+}
+
+
+void GlobalEnvironment::startup()
+{
+    if (s_environment)
+        throw pdal_error("attempt to reinitialize global environment");
+    get();
+}
+
+
+void GlobalEnvironment::shutdown()
+{
+    if (!s_environment)
+        throw pdal_error("bad global shutdown call -- was called more "
+            "than once or was called without corresponding startup");
+    delete s_environment;
+    s_environment = 0;
+}
+
+
+GlobalEnvironment::GlobalEnvironment() : m_gdalDebug()
+{}
+
+
+GlobalEnvironment::~GlobalEnvironment()
+{
+    if (m_gdalDebug)
+        GDALDestroyDriverManager();
+}
+
+
+void GlobalEnvironment::initializeGDAL(LogPtr log, bool gdalDebugOutput)
+{
+    static std::once_flag flag;
+
+    auto init = [this](LogPtr log, bool gdalDebugOutput) -> void
+    {
+        GDALAllRegister();
+        OGRRegisterAll();
+        m_gdalDebug.reset(new gdal::ErrorHandler(gdalDebugOutput, log));
+    };
+
+    std::call_once(flag, init, log, gdalDebugOutput);
+}
+
+
+} //namespaces
+
diff --git a/src/Kernel.cpp b/src/Kernel.cpp
new file mode 100644
index 0000000..7c516a2
--- /dev/null
+++ b/src/Kernel.cpp
@@ -0,0 +1,641 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/PDALUtils.hpp>
+#include <iostream>
+
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/pdal_config.hpp>
+#include <pdal/StageFactory.hpp>
+
+#include <pdal/pdal_config.hpp>
+
+#include <pdal/BufferReader.hpp>
+
+#include <memory>
+#include <vector>
+
+#include <boost/tokenizer.hpp>
+typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
+
+namespace po = boost::program_options;
+
+namespace pdal
+{
+
+Kernel::Kernel()
+    : m_usestdin(false)
+    , m_log("pdal", "stderr")
+    , m_isDebug(false)
+    , m_verboseLevel(0)
+    , m_showHelp(false)
+    , m_showVersion(false)
+    , m_showTime(false)
+    , m_hardCoreDebug(false)
+    , m_reportDebug(false)
+    , m_visualize(false)
+{}
+
+
+std::ostream& operator<<(std::ostream& ostr, const Kernel& kernel)
+{
+    ostr << "  Name: " << kernel.getName() << std::endl;
+    return ostr;
+}
+
+
+int Kernel::do_switches()
+{
+    try
+    {
+        // add -h, -v, etc
+        addBasicSwitchSet();
+
+        // add the options for the derived application
+        addSwitches();
+
+        // parse the command line
+        parseSwitches();
+    }
+    catch (std::exception const& e)
+    {
+        Utils::printError(e.what());
+        return 1;
+    }
+    catch (...)
+    {
+        Utils::printError("Caught unknown exception handling switches");
+        return 1;
+    }
+    return 0;
+}
+
+
+int Kernel::do_startup()
+{
+    try
+    {
+        pdal::GlobalEnvironment::startup();
+    }
+    catch (std::exception const& e)
+    {
+        const std::string s("Caught exception in initialization: ");
+        Utils::printError(s + e.what());
+        return 1;
+    }
+    catch (...)
+    {
+        Utils::printError("Caught unknown exception in initialization");
+        return 1;
+    }
+
+    return 0;
+}
+
+
+int Kernel::do_execution()
+{
+
+    if (m_reportDebug)
+    {
+        std::cout << getPDALDebugInformation() << std::endl;
+        return 0;
+    }
+
+    if (m_hardCoreDebug)
+    {
+        int status = innerRun();
+        return status;
+    }
+
+    int status = 1;
+
+    try
+    {
+        status = innerRun();
+    }
+    catch (pdal::pdal_error const& e)
+    {
+        Utils::printError(e.what());
+        return 1;
+    }
+    catch (std::exception const& e)
+    {
+        Utils::printError(e.what());
+        return 1;
+    }
+    catch (...)
+    {
+        Utils::printError("Caught unexpected exception.");
+        return 1;
+    }
+
+    return status;
+}
+
+
+int Kernel::do_shutdown()
+{
+    try
+    {
+        pdal::GlobalEnvironment::shutdown();
+    }
+    catch (std::exception const& e)
+    {
+        const std::string s("Caught exception during shutdown: ");
+        Utils::printError(s + e.what());
+        return 1;
+    }
+    catch (...)
+    {
+        Utils::printError("Caught unknown exception during shutdown.");
+        return 1;
+    }
+
+    return 0;
+}
+
+
+// this just wraps ALL the code in total catch block
+int Kernel::run(int argc, const char* argv[], const std::string& appName)
+{
+    m_argc = argc;
+    m_argv = argv;
+    m_appName = appName;
+
+    int switches_status = do_switches();
+    if (switches_status)
+        return switches_status;
+
+    int startup_status = do_startup();
+    if (startup_status)
+        return startup_status;
+
+    int execution_status = do_execution();
+
+    // note we will try to shutdown cleanly even if we got an error condition
+    // in the execution phase
+
+    int shutdown_status = do_shutdown();
+
+    if (execution_status)
+        return execution_status;
+
+    return shutdown_status;
+}
+
+
+void Kernel::collectExtraOptions()
+{
+    for (const auto& o : m_extra_options)
+    {
+        typedef boost::tokenizer<boost::char_separator<char>> tokenizer;
+
+        // if we don't have --, we're not an option we
+        // even care about
+        if (!boost::algorithm::find_first(o, "--"))
+            continue;
+
+        // Find the dimensions listed and put them on the id list.
+        boost::char_separator<char> equal("=");
+        boost::char_separator<char> dot(".");
+        tokenizer option_tokens(o, equal);
+        std::vector<std::string> option_split;
+        for (auto const& ti : option_tokens)
+            option_split.push_back(boost::lexical_cast<std::string>(ti));
+        if (!(option_split.size() == 2))
+        {
+//             std::ostringstream oss;
+//             oss << "option '" << o << "' did not split correctly. Is it "
+//                 "in the form --readers.las.option=foo?";
+//             throw app_usage_error(oss.str());
+            continue;
+        }
+
+        std::string option_value(option_split[1]);
+        std::string stage_value(option_split[0]);
+        boost::algorithm::erase_all(stage_value, "--");
+
+        tokenizer name_tokens(stage_value, dot);
+        std::vector<std::string> stage_values;
+        for (auto const& ti : name_tokens)
+            stage_values.push_back(ti);
+
+        std::string option_name = *stage_values.rbegin();
+        std::ostringstream stage_name_ostr;
+        bool bFirst(true);
+        for (auto s = stage_values.begin(); s != stage_values.end() - 1; ++s)
+        {
+            auto s2 = boost::algorithm::erase_all_copy(*s, " ");
+
+            if (bFirst)
+            {
+                bFirst = false;
+            }
+            else
+                stage_name_ostr <<".";
+            stage_name_ostr << s2;
+        }
+        std::string stageName(stage_name_ostr.str());
+
+        Option op(option_name, option_value);
+        m_extraStageOptions[stageName].add(op);
+    }
+}
+
+
+bool Kernel::argumentSpecified(const std::string& name)
+{
+    auto ai = m_variablesMap.find(name);
+    if (ai == m_variablesMap.end())
+        return false;
+    return !(ai->second.defaulted());
+}
+
+
+int Kernel::innerRun()
+{
+    // handle the well-known options
+    if (m_showVersion)
+    {
+        outputVersion();
+        return 0;
+    }
+
+    if (m_showHelp)
+    {
+        outputHelp();
+        return 0;
+    }
+
+    if (!m_showOptions.empty())
+    {
+        return 0;
+    }
+
+    try
+    {
+        // do any user-level sanity checking
+        validateSwitches();
+        collectExtraOptions();
+    }
+    catch (app_usage_error e)
+    {
+        Utils::printError(std::string("Usage error: ") + e.what());
+        outputHelp();
+        return 1;
+    }
+
+    return execute();
+}
+
+
+bool Kernel::isDebug() const
+{
+    return m_isDebug;
+}
+
+
+uint32_t Kernel::getVerboseLevel() const
+{
+    return m_verboseLevel;
+}
+
+
+bool Kernel::isVisualize() const
+{
+    return m_visualize;
+}
+
+
+void Kernel::visualize(PointViewPtr view)
+{
+    BufferReader bufferReader;
+    bufferReader.addView(view);
+
+    StageFactory f;
+    Stage& writer = ownStage(f.createStage("writers.pclvisualizer"));
+    writer.setInput(bufferReader);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+}
+
+
+/*
+void Kernel::visualize(PointViewPtr input_view, PointViewPtr output_view) const
+{
+#ifdef PDAL_HAVE_PCL_VISUALIZE
+    int viewport = 0;
+
+    // Determine XYZ bounds
+    BOX3D const& input_bounds = input_view->calculateBounds();
+    BOX3D const& output_bounds = output_view->calculateBounds();
+
+    // Convert PointView to a PCL PointCloud
+    pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+    pclsupport::PDALtoPCD(const_cast<PointViewPtr>(*input_view), *input_cloud, input_bounds);
+    pcl::PointCloud<pcl::PointXYZ>::Ptr output_cloud(new pcl::PointCloud<pcl::PointXYZ>);
+    pclsupport::PDALtoPCD(const_cast<PointViewPtr>(*output_view), *output_cloud, output_bounds);
+
+    // Create PCLVisualizer
+    std::shared_ptr<pcl::visualization::PCLVisualizer> p(new pcl::visualization::PCLVisualizer("3D Viewer"));
+
+    // Set background to black
+    p->setBackgroundColor(0, 0, 0);
+
+    // Use Z dimension to colorize points
+    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> input_color(input_cloud, "z");
+    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> output_color(output_cloud, "z");
+
+    // Add point cloud to the viewer with the Z dimension color handler
+    p->createViewPort(0, 0, 0.5, 1, viewport);
+    p->addPointCloud<pcl::PointXYZ> (input_cloud, input_color, "cloud");
+    p->createViewPort(0.5, 0, 1, 1, viewport);
+    p->addPointCloud<pcl::PointXYZ> (output_cloud, output_color, "cloud1");
+
+    p->resetCamera();
+
+    while (!p->wasStopped())
+    {
+        p->spinOnce(100);
+        std::this_thread::sleep_for(std::chrono::microseconds(100000));
+    }
+#endif
+}
+*/
+
+
+void Kernel::addSwitchSet(po::options_description* options)
+{
+    if (options)
+        m_public_options.push_back(options);
+}
+
+
+void Kernel::addHiddenSwitchSet(po::options_description* options)
+{
+    if (options)
+        m_hidden_options.push_back(options);
+}
+
+
+void Kernel::setCommonOptions(Options &options)
+{
+    options.add("visualize", m_visualize);
+
+    if (m_isDebug)
+    {
+        options.add("debug", true);
+        uint32_t verbosity(m_verboseLevel);
+        if (!verbosity)
+            verbosity = 1;
+
+        options.add("verbose", verbosity);
+        options.add("log", "STDERR");
+    }
+
+    boost::char_separator<char> sep(",| ");
+
+    if (argumentExists("scale"))
+    {
+        std::vector<double> scales;
+        tokenizer scale_tokens(m_scales, sep);
+        for (auto const& t : scale_tokens)
+            scales.push_back(boost::lexical_cast<double>(t));
+        if (scales.size())
+        {
+            if (scales.size() <= 1)
+            {
+                options.add<double >("scale_x", scales[0]);
+            }
+            else if (scales.size() <= 2)
+            {
+                options.add<double >("scale_x", scales[0]);
+                options.add<double >("scale_y", scales[1]);
+            }
+            else if (scales.size() <= 3)
+            {
+                options.add<double >("scale_x", scales[0]);
+                options.add<double >("scale_y", scales[1]);
+                options.add<double >("scale_z", scales[2]);
+            }
+        }
+    }
+
+    if (argumentExists("offset"))
+    {
+        std::vector<std::string> offsets;
+        tokenizer offset_tokens(m_offsets, sep);
+        for (auto const& t : offset_tokens)
+            offsets.push_back(boost::lexical_cast<std::string>(t));
+        if (offsets.size())
+        {
+            if (offsets.size() <= 1)
+            {
+                options.add<std::string>("offset_x", offsets[0]);
+            }
+            else if (offsets.size() <= 2)
+            {
+                options.add<std::string>("offset_x", offsets[0]);
+                options.add<std::string>("offset_y", offsets[1]);
+            }
+            else if (offsets.size() <= 3)
+            {
+                options.add<std::string>("offset_x", offsets[0]);
+                options.add<std::string>("offset_y", offsets[1]);
+                options.add<std::string>("offset_z", offsets[2]);
+            }
+        }
+    }
+}
+
+
+void Kernel::addPositionalSwitch(const char* name, int max_count)
+{
+    m_positionalOptions.add(name, max_count);
+}
+
+
+void Kernel::outputHelp()
+{
+    outputVersion();
+
+    for (auto const& iter : m_public_options)
+    {
+        std::cout << *iter;
+        std::cout << std::endl;
+    }
+
+    std::cout <<"\nFor more information, see the full documentation for "
+        "PDAL at http://pdal.io/\n" << std::endl << std::endl;
+}
+
+
+void Kernel::outputVersion()
+{
+    std::cout << "pdal " << m_appName << " (" <<
+        GetFullVersionString() << ")\n";
+    std::cout << std::endl;
+}
+
+
+void Kernel::addBasicSwitchSet()
+{
+    po::options_description* basic_options =
+        new po::options_description("basic options");
+
+    basic_options->add_options()
+    ("help,h",
+        po::value<bool>(&m_showHelp)->zero_tokens()->implicit_value(true),
+        "Print help message")
+    ("options", po::value<std::string>(&m_showOptions)->implicit_value("all"),
+        "Show available options for a driver")
+    ("debug,d",
+        po::value<bool>(&m_isDebug)->zero_tokens()->implicit_value(true),
+        "Enable debug mode")
+    ("report-debug",
+        po::value<bool>(&m_reportDebug)->zero_tokens()->implicit_value(true),
+        "Report PDAL compilation DEBUG status")
+    ("developer-debug",
+        po::value<bool>(&m_hardCoreDebug)->zero_tokens()->implicit_value(true),
+        "Enable developer debug mode (don't trap exceptions so segfaults "
+        "are thrown)")
+    ("label",
+        po::value<std::string>(&m_label)->default_value(""),
+        "A string to label the process with")
+    ("verbose,v", po::value<uint32_t>(&m_verboseLevel)->default_value(0),
+        "Set verbose message level")
+    ("version",
+        po::value<bool>(&m_showVersion)->zero_tokens()->implicit_value(true),
+        "Show version info")
+    ("visualize",
+        po::value<bool>(&m_visualize)->zero_tokens()->implicit_value(true),
+        "Visualize result")
+    ("stdin,s",
+        po::value<bool>(&m_usestdin)->zero_tokens()->implicit_value(true),
+        "Read pipeline XML from stdin")
+    ("heartbeat",
+        po::value< std::vector<std::string> >(&m_heartbeat_shell_command),
+        "Shell command to run for every progress heartbeat")
+    ("scale", po::value< std::string >(&m_scales),
+         "A comma-separated or quoted, space-separated list of scales to "
+         "set on the output file: \n--scale 0.1,0.1,0.00001\n--scale \""
+         "0.1 0.1 0.00001\"")
+    ("offset", po::value< std::string >(&m_offsets),
+         "A comma-separated or quoted, space-separated list of offsets to "
+         "set on the output file: \n--offset 0,0,0\n--offset "
+         "\"1234 5678 91011\"")
+    ;
+
+    addSwitchSet(basic_options);
+}
+
+
+void Kernel::parseSwitches()
+{
+    po::options_description options;
+
+    for (auto const& iter : m_public_options)
+        options.add(*iter);
+    for (auto const& iter : m_hidden_options)
+        options.add(*iter);
+
+    try
+    {
+        auto parsed = po::command_line_parser(m_argc, m_argv).
+            options(options).allow_unregistered().
+            positional(m_positionalOptions).run();
+        m_extra_options = po::collect_unrecognized(parsed.options,
+            po::include_positional);
+
+        po::store(parsed, m_variablesMap);
+    }
+    catch (boost::program_options::unknown_option e)
+    {
+        throw app_usage_error("unknown option: " + e.get_option_name());
+    }
+    po::notify(m_variablesMap);
+}
+
+
+Stage& Kernel::makeReader(const std::string& inputFile)
+{
+    if (!FileUtils::fileExists(inputFile))
+        throw app_runtime_error("file not found: " + inputFile);
+
+    StageFactory factory;
+    std::string driver = factory.inferReaderDriver(inputFile);
+    if (driver.empty())
+        throw app_runtime_error("Cannot determine input file type of " +
+            inputFile);
+
+    Stage *stage = factory.createStage(driver);
+    if (!stage)
+        throw app_runtime_error("reader creation failed");
+    ownStage(stage);
+    return *stage;
+}
+
+
+Stage& Kernel::makeWriter(const std::string& outputFile, Stage& parent)
+{
+    pdal::StageFactory factory;
+
+    std::string driver = factory.inferWriterDriver(outputFile);
+    if (driver.empty())
+        throw pdal_error("Cannot determine output file type of " +
+            outputFile);
+    Options options = factory.inferWriterOptionsChanges(outputFile);
+
+    Stage *writer = factory.createStage(driver);
+    if (!writer)
+    {
+        std::ostringstream ss;
+        ss << "Error creating writer stage for file '" << outputFile << "'.";
+        throw pdal_error(ss.str());
+    }
+    ownStage(writer);
+    writer->setInput(parent);
+    writer->setOptions(options + writer->getOptions());
+
+    return *writer;
+}
+
+} // namespace pdal
+
diff --git a/src/KernelFactory.cpp b/src/KernelFactory.cpp
new file mode 100644
index 0000000..0c8d069
--- /dev/null
+++ b/src/KernelFactory.cpp
@@ -0,0 +1,98 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/KernelFactory.hpp>
+#include <pdal/Kernel.hpp>
+#include <pdal/PluginManager.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <delta/DeltaKernel.hpp>
+#include <diff/DiffKernel.hpp>
+#include <info/InfoKernel.hpp>
+#include <merge/MergeKernel.hpp>
+#include <pipeline/PipelineKernel.hpp>
+#include <random/RandomKernel.hpp>
+#include <sort/SortKernel.hpp>
+#include <split/SplitKernel.hpp>
+#include <tindex/TIndexKernel.hpp>
+#include <translate/TranslateKernel.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/tokenizer.hpp>
+
+#include <sstream>
+#include <stdio.h> // for funcptr
+#include <string>
+#include <vector>
+
+namespace pdal
+{
+
+KernelFactory::KernelFactory(bool no_plugins)
+{
+    PluginManager & pm = PluginManager::getInstance();
+    if (!no_plugins) { pm.loadAll(PF_PluginType_Kernel); }
+    PluginManager::initializePlugin(DeltaKernel_InitPlugin);
+    PluginManager::initializePlugin(DiffKernel_InitPlugin);
+    PluginManager::initializePlugin(InfoKernel_InitPlugin);
+    PluginManager::initializePlugin(MergeKernel_InitPlugin);
+    PluginManager::initializePlugin(PipelineKernel_InitPlugin);
+    PluginManager::initializePlugin(RandomKernel_InitPlugin);
+    PluginManager::initializePlugin(SortKernel_InitPlugin);
+    PluginManager::initializePlugin(SplitKernel_InitPlugin);
+    PluginManager::initializePlugin(TIndexKernel_InitPlugin);
+    PluginManager::initializePlugin(TranslateKernel_InitPlugin);
+}
+
+std::unique_ptr<Kernel> KernelFactory::createKernel(std::string const& name)
+{
+    PluginManager & pm = PluginManager::getInstance();
+    return std::unique_ptr<Kernel>(static_cast<Kernel*>(pm.createObject(name)));
+}
+
+std::vector<std::string> KernelFactory::getKernelNames()
+{
+    PluginManager & pm = PluginManager::getInstance();
+    PluginManager::RegistrationMap rm = pm.getRegistrationMap();
+    std::vector<std::string> nv;
+    for (auto r : rm)
+    {
+        if (r.second.pluginType == PF_PluginType_Kernel)
+            nv.push_back(r.first);
+    }
+    return nv;
+}
+
+} // namespace pdal
diff --git a/src/KernelSupport.cpp b/src/KernelSupport.cpp
new file mode 100644
index 0000000..cef6e09
--- /dev/null
+++ b/src/KernelSupport.cpp
@@ -0,0 +1,152 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/KernelSupport.hpp>
+
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+PipelineManager* KernelSupport::makePipeline(const std::string& inputFile)
+{
+    if (!pdal::FileUtils::fileExists(inputFile))
+        throw app_runtime_error("file not found: " + inputFile);
+
+    PipelineManager* output = new PipelineManager;
+
+    if (inputFile == "STDIN")
+    {
+        PipelineReader pipeReader(*output);
+        pipeReader.readPipeline(std::cin);
+    }
+    else if (boost::filesystem::extension(inputFile) == ".xml")
+    {
+        PipelineReader pipeReader(*output);
+        pipeReader.readPipeline(inputFile);
+    }
+    else
+    {
+        StageFactory factory;
+        std::string driver = factory.inferReaderDriver(inputFile);
+
+        if (driver.empty())
+            throw app_runtime_error("Cannot determine input file type of " +
+                inputFile);
+        output->addReader(driver);
+    }
+    return output;
+}
+
+
+PercentageCallback::PercentageCallback(double major, double minor)
+    : m_lastMajorPerc(-1 * major)
+    , m_lastMinorPerc(-1 * minor)
+    , m_done(false)
+{}
+
+
+void PercentageCallback::callback()
+{
+    if (m_done)
+        return;
+
+    double currPerc = getPercentComplete();
+
+    if (pdal::Utils::compare_distance<double>(currPerc, 100.0))
+    {
+        std::cerr << ".100" << std::endl;
+        m_done = true;
+    }
+    else if (currPerc >= m_lastMajorPerc + 10.0)
+    {
+        std::cerr << (int)currPerc << std::flush;
+        m_lastMajorPerc = currPerc;
+        m_lastMinorPerc = currPerc;
+    }
+    else if (currPerc >= m_lastMinorPerc + 2.0)
+    {
+        std::cerr << '.' << std::flush;
+        m_lastMinorPerc = currPerc;
+    }
+}
+
+ShellScriptCallback::ShellScriptCallback(
+    const std::vector<std::string>& command)
+{
+    double major_tick(10.0);
+    double minor_tick(2.0);
+
+    if (command.size())
+    {
+        m_command = command[0];
+        if (command.size() == 3)
+        {
+            major_tick = boost::lexical_cast<double>(command[1]);
+            minor_tick = boost::lexical_cast<double>(command[2]);
+        }
+        else if (command.size() == 2)
+            major_tick = boost::lexical_cast<double>(command[1]);
+    }
+    PercentageCallback(major_tick, minor_tick);
+}
+
+
+void ShellScriptCallback::callback()
+{
+    if (m_done)
+        return;
+
+    double currPerc = getPercentComplete();
+    if (Utils::compare_distance<double>(currPerc, 100.0))
+        m_done = true;
+    else if (currPerc >= m_lastMajorPerc + 10.0)
+    {
+        std::string output;
+        Utils::run_shell_command(m_command + " " +
+            boost::lexical_cast<std::string>(static_cast<int>(currPerc)),
+            output);
+        m_lastMajorPerc = currPerc;
+        m_lastMinorPerc = currPerc;
+    }
+    else if (currPerc >= m_lastMinorPerc + 2.0)
+        m_lastMinorPerc = currPerc;
+}
+
+} // namespace pdal
diff --git a/src/Log.cpp b/src/Log.cpp
new file mode 100644
index 0000000..60db79e
--- /dev/null
+++ b/src/Log.cpp
@@ -0,0 +1,149 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/Log.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include <fstream>
+#include <ostream>
+
+namespace pdal
+{
+
+using namespace LogLevel;
+
+Log::Log(std::string const& leaderString,
+         std::string const& outputName)
+    : m_level(Error)
+    , m_deleteStreamOnCleanup(false)
+    , m_leader(leaderString)
+{
+
+    if (Utils::iequals(outputName, "stdlog"))
+        m_log = &std::clog;
+    else if (Utils::iequals(outputName, "stderr"))
+        m_log = &std::cerr;
+    else if (Utils::iequals(outputName, "stdout"))
+        m_log = &std::cout;
+    else
+    {
+        m_log = FileUtils::createFile(outputName);
+        m_deleteStreamOnCleanup = true;
+    }
+    makeNullStream();
+}
+
+
+Log::Log(std::string const& leaderString,
+         std::ostream* v)
+    : m_level(Error)
+    , m_deleteStreamOnCleanup(false)
+    , m_leader(leaderString)
+{
+    m_log = v;
+    makeNullStream();
+}
+
+
+Log::~Log()
+{
+
+    if (m_deleteStreamOnCleanup)
+    {
+        m_log->flush();
+        delete m_log;
+    }
+    delete m_nullStream;
+}
+
+
+void Log::makeNullStream()
+{
+#ifdef _WIN32
+    std::string nullFilename = "nul";
+#else
+    std::string nullFilename = "/dev/null";
+#endif
+
+    m_nullStream = new std::ofstream(nullFilename);
+}
+
+
+void Log::floatPrecision(int level)
+{
+    m_log->setf(std::ios_base::fixed, std::ios_base::floatfield);
+    m_log->precision(level);
+}
+
+
+void Log::clearFloat()
+{
+    m_log->unsetf(std::ios_base::fixed);
+    m_log->unsetf(std::ios_base::floatfield);
+}
+
+
+std::ostream& Log::get(LogLevel::Enum level)
+{
+    if (level <= m_level)
+    {
+        *m_log << "(" << m_leader << " "<< getLevelString(level) <<": " <<
+            level << "): " <<
+            std::string(level < Debug ? 0 : level - Debug, '\t');
+        return *m_log;
+    }
+    return *m_nullStream;
+
+}
+
+
+std::string Log::getLevelString(LogLevel::Enum level) const
+{
+    switch (level)
+    {
+        case Error:
+            return "Error";
+            break;
+        case Warning:
+            return "Warning";
+            break;
+        case Info:
+            return "Info";
+            break;
+        default:
+            return "Debug";
+    }
+}
+
+} // namespace
diff --git a/src/Options.cpp b/src/Options.cpp
new file mode 100644
index 0000000..43c2834
--- /dev/null
+++ b/src/Options.cpp
@@ -0,0 +1,235 @@
+/******************************************************************************
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/Options.hpp>
+#include <pdal/PDALUtils.hpp>
+
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/optional.hpp>
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <iostream>
+#include <sstream>
+#include <iostream>
+
+
+namespace pdal
+{
+
+Option::Option(const boost::property_tree::ptree& tree)
+{
+    using namespace boost::property_tree;
+
+    m_name = tree.get<std::string>("Name");
+    m_value = tree.get<std::string>("Value");
+    m_description =
+    tree.count("Description") ? tree.get<std::string>("Description") : "";
+
+    boost::property_tree::ptree opts;
+    ptree const& options = tree.get_child("Options", opts);
+    if (options.size())
+        m_options = options::OptionsPtr(new Options(options));
+}
+
+
+boost::optional<Options const&> Option::getOptions() const
+{
+    if (m_options.get())
+        return boost::optional<Options const&>(*m_options.get());
+    else
+        return boost::optional<Options const&>();
+}
+
+void Option::setOptions(Options const& options)
+{
+    m_options = options::OptionsPtr(new Options(options));
+}
+
+#if !defined(PDAL_COMPILER_MSVC)
+
+// explicit specialization:
+//   if insert a bool, we don't want it to be "0" or "1" (which is
+//   what lexical_cast would do)
+template<> void Option::setValue(const bool& value)
+{
+    m_value = value ? "true" : "false";
+}
+
+// explicit specialization:
+//   if we want to insert a string, we don't need lexical_cast
+template<> void Option::setValue(const std::string& value)
+{
+    m_value = value;
+}
+#endif
+
+bool Option::empty() const
+{
+    if (m_options)
+        return m_options->empty();
+    else
+        return false;
+}
+
+void Option::toMetadata(MetadataNode& parent) const
+{
+    MetadataNode child = parent.add(getName());
+    child.add("value", getValue<std::string>());
+    child.add("description", getDescription());
+
+    auto opts = getOptions();
+    if (opts)
+        opts->toMetadata(child);
+}
+
+//---------------------------------------------------------------------------
+
+
+Options::Options(const Options& rhs)
+    : m_options(rhs.m_options)
+{}
+
+
+Options::Options(const Option& opt)
+{
+    add(opt);
+}
+
+
+Options::Options(const boost::property_tree::ptree& tree)
+{
+    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
+    {
+        assert(iter->first == "Option");
+        Option opt(iter->second);
+        add(opt);
+    }
+}
+
+
+void Options::add(const Option& option)
+{
+    m_options.insert(std::pair<std::string, Option>(option.getName(), option));
+}
+
+
+Option& Options::getOptionByRef(const std::string& name)
+{
+    auto iter = m_options.find(name);
+    if (iter == m_options.end())
+    {
+        std::ostringstream oss;
+        oss << "Options::getOptionByRef: Required option '" << name <<
+            "' was not found on this stage";
+        throw Option::not_found(oss.str());
+    }
+    return iter->second;
+}
+
+
+const Option& Options::getOption(const std::string& name) const
+{
+    auto iter = m_options.find(name);
+    if (iter == m_options.end())
+    {
+        std::ostringstream oss;
+        oss << "Options::getOption: Required option '" << name <<
+            "' was not found on this stage";
+        throw Option::not_found(oss.str());
+    }
+    return iter->second;
+}
+
+std::vector<Option> Options::getOptions(std::string const& name) const
+{
+    std::vector<Option> output;
+
+    // If we have an empty name, return them all
+    if (boost::iequals(name, ""))
+    {
+        for (auto it = m_options.begin(); it != m_options.end(); ++it)
+        {
+            output.push_back(it->second);
+        }
+    }
+    else
+    {
+        auto ret = m_options.equal_range(name);
+        for (auto it = ret.first; it != ret.second; ++it)
+        {
+            output.push_back(it->second);
+        }
+    }
+    return output;
+}
+
+// the empty options set
+static const Options s_none;
+const Options& Options::none()
+{
+    return s_none;
+}
+
+
+bool Options::hasOption(std::string const& name) const
+{
+    try
+    {
+        (void)getOption(name);
+        return true;
+    }
+    catch (Option::not_found)
+    {}
+    return false;
+}
+
+
+void Options::dump() const
+{
+    std::cout << *this;
+}
+
+
+std::ostream& operator<<(std::ostream& ostr, const Options& options)
+{
+    const boost::property_tree::ptree tree = pdal::Utils::toPTree(options);
+
+    boost::property_tree::write_json(ostr, tree);
+
+    return ostr;
+}
+
+
+} // namespace pdal
diff --git a/src/PDALUtils.cpp b/src/PDALUtils.cpp
new file mode 100644
index 0000000..a5c9ae6
--- /dev/null
+++ b/src/PDALUtils.cpp
@@ -0,0 +1,228 @@
+/******************************************************************************
+* Copyright (c) 2014, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PDALUtils.hpp>
+
+using namespace std;
+
+namespace pdal
+{
+
+namespace {
+
+void toJSON(const MetadataNode& m, std::ostream& o, int level);
+void arrayToJSON(const MetadataNodeList& children, std::ostream& o, int level);
+void arrayEltToJSON(const MetadataNode& m, std::ostream& o, int level);
+void subnodesToJSON(const MetadataNode& parent, std::ostream& o, int level)
+{
+    const std::string indent(level * 2, ' ');
+
+    std::vector<std::string> names = parent.childNames();
+
+    o << indent << "{" << endl;
+    for (auto ni = names.begin(); ni != names.end(); ++ni)
+    {
+        MetadataNodeList children = parent.children(*ni);
+
+        MetadataNode& node = *children.begin();
+        if (node.kind() == MetadataType::Array)
+        {
+            o << indent << "  \"" << node.name() << "\":" << std::endl;
+            arrayToJSON(children, o, level + 1);
+        }
+        else
+            toJSON(node, o, level + 1);
+        if (ni != names.rbegin().base() - 1)
+            o << ",";
+        o << std::endl;
+    }
+    o << indent << "}";
+}
+
+void arrayToJSON(const MetadataNodeList& children, std::ostream& o, int level)
+{
+    const std::string indent(level * 2, ' ');
+
+    o << indent << "[" << std::endl;
+    for (auto ci = children.begin(); ci != children.end(); ++ci)
+    {
+        const MetadataNode& m = *ci;
+
+        arrayEltToJSON(m, o, level + 1);
+        if (ci != children.rbegin().base() - 1)
+            o << ",";
+        o << std::endl;
+    }
+    o << indent << "]";
+}
+
+void arrayEltToJSON(const MetadataNode& m, std::ostream& o, int level)
+{
+    std::string indent(level * 2, ' ');
+    std::string value = m.jsonValue();
+    bool children = m.hasChildren();
+
+    // This is a case from XML.  In JSON, you can't have two values.
+    if (!value.empty() && children)
+    {
+        o << value << "," << std::endl;
+        subnodesToJSON(m, o, level);
+    }
+    else if (!value.empty())
+        o << indent << value;
+    else
+        subnodesToJSON(m, o, level);
+    // There is the case where we have a name and no value to handle.  What
+    // should be done?
+}
+
+void toJSON(const MetadataNode& m, std::ostream& o, int level)
+{
+    std::string indent(level * 2, ' ');
+    std::string name = m.name();
+    std::string value = m.jsonValue();
+    bool children = m.hasChildren();
+
+    if (name.empty())
+        name = "unnamed";
+
+    // This is a case from XML.  In JSON, you can't have two values.
+    if (!value.empty() && children)
+    {
+        o << indent << "\"" << name << "\": " << value << "," << std::endl;
+        o << indent << "\"" << name << "\": ";
+        subnodesToJSON(m, o, level);
+    }
+    else if (!value.empty())
+        o << indent << "\"" << name << "\": " << value;
+    else
+    {
+        o << indent << "\"" << name << "\":" << std::endl;
+        subnodesToJSON(m, o, level);
+    }
+    // There is the case where we have a name and no value to handle.  What
+    // should be done?
+}
+
+
+void toJSON(const Options& opts, std::ostream& o, int level);
+void toJSON(const Option& opt, std::ostream& o, int level)
+{
+    std::string indent(level * 2, ' ');
+    std::string indent2((level + 1) * 2, ' ');
+
+    std::string quote("\"");
+    std::string name = quote + opt.getName() + quote;
+    std::string description = quote + opt.getDescription() + quote;
+    std::string value = quote + opt.getValue<std::string>() + quote;
+
+    o << indent << name << " :" << endl;
+    o << indent << "{" << endl;
+    o << indent2 << "\"value\" : " << value << "," << endl;
+    o << indent2 << "\"description\" : " << description << endl;
+
+    boost::optional<Options const&> opts = opt.getOptions();
+    if (opts)
+        toJSON(*opts, o, level + 1);
+    o << indent << "}";
+}
+
+
+void toJSON(const Options& opts, std::ostream& o, int level)
+{
+    const std::string indent(level * 2, ' ');
+
+    std::vector<Option> optList = opts.getOptions();
+    if (optList.empty())
+        return;
+
+    o << indent << "\"options\" :" << endl;
+    o << indent << "{" << endl;
+    for (auto oi = optList.begin(); oi != optList.end(); ++oi)
+    {
+        Option& opt = *oi;
+        toJSON(opt, o, level + 1);
+        if (oi != optList.rbegin().base() - 1)
+            o << ",";
+        o << endl;
+    }
+    o << indent << "}" << endl;
+}
+
+} // unnamed namespace
+
+namespace Utils
+{
+
+std::string toJSON(const MetadataNode& m)
+{
+    std::ostringstream o;
+
+    toJSON(m, o);
+    return o.str();
+}
+
+void toJSON(const MetadataNode& m, std::ostream& o)
+{
+    if (m.name().empty())
+        pdal::subnodesToJSON(m, o, 0);
+    else if (m.kind() == MetadataType::Array)
+        pdal::arrayToJSON(m.children(), o, 0);
+    else
+    {
+        o << "{" << std::endl;
+        pdal::toJSON(m, o, 1);
+        o << std::endl;
+        o << "}";
+    }
+    o << std::endl;
+}
+
+std::string toJSON(const Options& opts)
+{
+    std::ostringstream o;
+
+    toJSON(opts, o);
+    return o.str();
+}
+
+void toJSON(const Options& opts, std::ostream& o)
+{
+    o << "{" << endl;
+    pdal::toJSON(opts, o, 1);
+    o << "}" << endl;
+}
+
+} // namespace Utils
+} // namespace pdal
diff --git a/src/PipelineManager.cpp b/src/PipelineManager.cpp
new file mode 100644
index 0000000..89178eb
--- /dev/null
+++ b/src/PipelineManager.cpp
@@ -0,0 +1,123 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PipelineManager.hpp>
+
+namespace pdal
+{
+
+Stage& PipelineManager::addReader(const std::string& type)
+{
+    Stage *r = m_factory.createStage(type);
+    if (!r)
+    {
+        std::ostringstream ss;
+        ss << "Couldn't create reader stage of type '" << type << "'.";
+        throw pdal_error(ss.str());
+    }
+    r->setProgressFd(m_progressFd);
+    m_stages.push_back(std::unique_ptr<Stage>(r));
+    return *r;
+}
+
+
+Stage& PipelineManager::addFilter(const std::string& type)
+{
+    Stage *stage = m_factory.createStage(type);
+    if (!stage)
+    {
+        std::ostringstream ss;
+        ss << "Couldn't create filter stage of type '" << type << "'.";
+        throw pdal_error(ss.str());
+    }
+    stage->setProgressFd(m_progressFd);
+    m_stages.push_back(std::unique_ptr<Stage>(stage));
+    return *stage;
+}
+
+
+Stage& PipelineManager::addWriter(const std::string& type)
+{
+    Stage *writer = m_factory.createStage(type);
+    if (!writer)
+    {
+        std::ostringstream ss;
+        ss << "Couldn't create writer stage of type '" << type << "'.";
+        throw pdal_error(ss.str());
+    }
+    writer->setProgressFd(m_progressFd);
+    m_stages.push_back(std::unique_ptr<Stage>(writer));
+    return *writer;
+}
+
+
+void PipelineManager::prepare() const
+{
+    Stage *s = getStage();
+    if (s)
+       s->prepare(m_table);
+}
+
+
+point_count_t PipelineManager::execute()
+{
+    prepare();
+
+    Stage *s = getStage();
+    if (!s)
+        return 0;
+    m_viewSet = s->execute(m_table);
+    point_count_t cnt = 0;
+    for (auto pi = m_viewSet.begin(); pi != m_viewSet.end(); ++pi)
+    {
+        PointViewPtr view = *pi;
+        cnt += view->size();
+    }
+    return cnt;
+}
+
+
+MetadataNode PipelineManager::getMetadata() const
+{
+    MetadataNode output("stages");
+
+    for (auto si = m_stages.begin(); si != m_stages.end(); ++si)
+    {
+        Stage *s = si->get();
+        output.add(s->getMetadata());
+    }
+    return output;
+}
+
+} // namespace pdal
diff --git a/src/PipelineReader.cpp b/src/PipelineReader.cpp
new file mode 100644
index 0000000..93f7bdd
--- /dev/null
+++ b/src/PipelineReader.cpp
@@ -0,0 +1,546 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PipelineReader.hpp>
+
+#include <pdal/Filter.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/optional.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string/trim.hpp>
+
+#ifndef _WIN32
+#include <wordexp.h>
+#endif
+
+namespace pdal
+{
+
+using namespace boost::property_tree;
+
+// ------------------------------------------------------------------------
+
+// this class helps keep tracks of what child nodes we've seen, so we
+// can keep all the error checking in one place
+class PipelineReader::StageParserContext
+{
+public:
+    enum Cardinality { None, One, Many };
+
+    StageParserContext()
+        : m_numTypes(0)
+        , m_cardinality(One)
+        , m_numStages(0)
+    {}
+
+    void setCardinality(Cardinality cardinality)
+    {
+        m_cardinality = cardinality;
+    }
+
+    void addType()
+    {
+        ++m_numTypes;
+    }
+
+    int getNumTypes()
+    {
+        return m_numTypes;
+    }
+
+    void addStage()
+    {
+        ++m_numStages;
+    }
+
+    void addUnknown(const std::string& name)
+    {
+        throw pdal_error("unknown child of element: " + name);
+    }
+
+    void validate()
+    {
+        if (m_numTypes == 0)
+            throw pdal_error("PipelineReader: expected Type element missing");
+        if (m_numTypes > 1)
+            throw pdal_error("PipelineReader: extra Type element found");
+
+        if (m_cardinality == None)
+        {
+            if (m_numStages != 0)
+                throw pdal_error("PipelineReader: found child stages where "
+                    "none were expected");
+        }
+        if (m_cardinality == One)
+        {
+            if (m_numStages == 0)
+                throw pdal_error("PipelineReader: "
+                    "expected child stage missing");
+            if (m_numStages > 1)
+                throw pdal_error("PipelineReader: extra child stages found");
+        }
+        if (m_cardinality == Many)
+        {
+            if (m_numStages == 0)
+                throw pdal_error("PipelineReader: expected child stage "
+                    "missing");
+        }
+    }
+
+private:
+    int m_numTypes;
+    Cardinality m_cardinality; // num child stages allowed
+    int m_numStages;
+};
+
+
+PipelineReader::PipelineReader(PipelineManager& manager, bool isDebug,
+        uint32_t verboseLevel) :
+    m_manager(manager) , m_isDebug(isDebug) , m_verboseLevel(verboseLevel)
+{
+    if (m_isDebug)
+    {
+        Option opt("debug", true);
+        m_baseOptions.add(opt);
+    }
+    if (m_verboseLevel)
+    {
+        Option opt("verbose", m_verboseLevel);
+        m_baseOptions.add(opt);
+    }
+}
+
+
+Option PipelineReader::parseElement_Option(const ptree& tree)
+{
+    // cur is an option element, such as this:
+    //     <option>
+    //       <name>myname</name>
+    //       <description>my descr</description>
+    //       <value>17</value>
+    //     </option>
+    // this function will process the element and return an Option from it
+
+    map_t attrs;
+    collect_attributes(attrs, tree);
+
+    std::string name = attrs["name"];
+    std::string value = tree.get_value<std::string>();
+    boost::algorithm::trim(value);
+    Option option(name, value);
+
+    boost::optional<ptree const&> moreOptions =
+        tree.get_child_optional("Options");
+
+    if (moreOptions)
+    {
+        ptree::const_iterator iter = moreOptions->begin();
+
+        Options options;
+        while (iter != moreOptions->end())
+        {
+            if (iter->first == "Option")
+            {
+                Option o2 = parseElement_Option(iter->second);
+                options.add(o2);
+            }
+            ++iter;
+        }
+        option.setOptions(options);
+    }
+
+    // filenames in the XML are fixed up as follows:
+    //   - if absolute path, leave it alone
+    //   - if relative path, make it absolute using the XML file's directory
+    // The toAbsolutePath function does exactly that magic for us.
+    if (option.getName() == "filename")
+    {
+        std::string path = option.getValue<std::string>();
+#ifndef _WIN32
+        wordexp_t result;
+        if (wordexp(path.c_str(), &result, 0) == 0)
+        {
+            if (result.we_wordc == 1)
+                path = result.we_wordv[0];
+        }
+        wordfree(&result);
+#endif
+        if (!FileUtils::isAbsolutePath(path))
+        {
+            std::string abspath = FileUtils::toAbsolutePath(m_inputXmlFile);
+            std::string absdir = FileUtils::getDirectory(abspath);
+            path = FileUtils::toAbsolutePath(path, absdir);
+
+            assert(FileUtils::isAbsolutePath(path));
+        }
+        option.setValue(path);
+    }
+    else if (option.getName() == "plugin")
+    {
+       PluginManager& pm = PluginManager::getInstance();
+       std::string path = option.getValue<std::string>();
+       pm.loadPlugin(path);
+    }
+    return option;
+}
+
+
+Stage *PipelineReader::parseElement_anystage(const std::string& name,
+    const ptree& subtree)
+{
+    if (name == "Filter")
+    {
+        return parseElement_Filter(subtree);
+    }
+    else if (name == "Reader")
+    {
+        return parseElement_Reader(subtree);
+    }
+    else if (name == "<xmlattr>")
+    {
+        // ignore: will parse later
+    }
+    else
+    {
+        throw pdal_error("PipelineReader: encountered unknown stage type");
+    }
+
+    return NULL;
+}
+
+
+Stage *PipelineReader::parseElement_Reader(const ptree& tree)
+{
+    Options options(m_baseOptions);
+
+    StageParserContext context;
+    context.setCardinality(StageParserContext::None);
+
+    map_t attrs;
+    collect_attributes(attrs, tree);
+
+    auto iter = tree.begin();
+    while (iter != tree.end())
+    {
+        const std::string& name = iter->first;
+        const ptree& subtree = iter->second;
+
+        if (name == "<xmlattr>")
+        {
+            // already parsed
+        }
+        else if (name == "Option")
+        {
+            Option option = parseElement_Option(subtree);
+            options.add(option);
+        }
+        else if (name == "Metadata")
+        {
+            // ignored for now
+        }
+        else
+        {
+            context.addUnknown(name);
+        }
+        ++iter;
+    }
+
+    std::string type;
+    if (attrs.count("type"))
+    {
+        type = attrs["type"];
+        context.addType();
+    }
+
+    // If we aren't provided a type, try to infer the type from the filename
+    // #278
+    if (context.getNumTypes() == 0)
+    {
+        try
+        {
+            const std::string filename = options.getValueOrThrow<std::string>("filename");
+            type = StageFactory::inferReaderDriver(filename);
+            if (!type.empty())
+            {
+                context.addType();
+            }
+        }
+        catch (Option::not_found)
+        {}
+    }
+
+    context.validate();
+
+    Stage& reader(m_manager.addReader(type));
+    reader.setOptions(options);
+    return &reader;
+}
+
+
+Stage *PipelineReader::parseElement_Filter(const ptree& tree)
+{
+    Options options(m_baseOptions);
+
+    StageParserContext context;
+
+    map_t attrs;
+    collect_attributes(attrs, tree);
+
+    std::vector<Stage*> prevStages;
+    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
+    {
+        const std::string& name = iter->first;
+        const ptree& subtree = iter->second;
+
+        if (name == "<xmlattr>")
+        {
+            // already parsed
+        }
+        else if (name == "Option")
+        {
+            Option option = parseElement_Option(subtree);
+            options.add(option);
+        }
+        else if (name == "Metadata")
+        {
+            // ignored
+        }
+        else if (name == "Filter" || name == "Reader")
+        {
+            context.addStage();
+            prevStages.push_back(parseElement_anystage(name, subtree));
+        }
+        else
+        {
+            context.addUnknown(name);
+        }
+    }
+
+    std::string type;
+    if (attrs.count("type"))
+    {
+        type = attrs["type"];
+        context.addType();
+    }
+
+    Stage& filter(m_manager.addFilter(type));
+    filter.setOptions(options);
+    for (auto sp : prevStages)
+        filter.setInput(*sp);
+    context.setCardinality(StageParserContext::Many);
+    context.validate();
+    return &filter;
+}
+
+
+void PipelineReader::parse_attributes(map_t& attrs, const ptree& tree)
+{
+    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
+    {
+        std::string name = iter->first;
+        std::string value = tree.get<std::string>(name);
+        boost::algorithm::trim(value);
+
+        attrs[name] = value;
+    }
+}
+
+
+void PipelineReader::collect_attributes(map_t& attrs, const ptree& tree)
+{
+    if (tree.count("<xmlattr>"))
+    {
+        const ptree& subtree = tree.get_child("<xmlattr>");
+        parse_attributes(attrs, subtree);
+    }
+}
+
+
+Stage *PipelineReader::parseElement_Writer(const ptree& tree)
+{
+    Options options(m_baseOptions);
+    StageParserContext context;
+
+    map_t attrs;
+    collect_attributes(attrs, tree);
+
+    std::vector<Stage *> prevStages;
+    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
+    {
+        const std::string& name = iter->first;
+        const ptree& subtree = iter->second;
+
+        if (name == "<xmlattr>")
+        {
+            // already parsed -- ignore it
+        }
+        else if (name == "Option")
+        {
+            Option option = parseElement_Option(subtree);
+            options.add(option);
+        }
+        else if (name == "Metadata")
+        {
+            // ignored
+        }
+        else if (name == "Filter" || name == "Reader")
+        {
+            context.addStage();
+            prevStages.push_back(parseElement_anystage(name, subtree));
+        }
+        else
+        {
+            context.addUnknown(name);
+        }
+    }
+
+    std::string type;
+    if (attrs.count("type"))
+    {
+        type = attrs["type"];
+        context.addType();
+    }
+
+    context.validate();
+    Stage& writer(m_manager.addWriter(type));
+    for (auto sp : prevStages)
+        writer.setInput(*sp);
+    writer.setOptions(options);
+    return &writer;
+}
+
+
+bool PipelineReader::parseElement_Pipeline(const ptree& tree)
+{
+    Stage *stage = NULL;
+    Stage *writer = NULL;
+
+    map_t attrs;
+    collect_attributes(attrs, tree);
+
+    std::string version = "";
+    if (attrs.count("version"))
+        version = attrs["version"];
+    if (version != "1.0")
+        throw pdal_error("PipelineReader: unsupported pipeline xml version");
+
+    bool isWriter = false;
+
+    for (auto iter = tree.begin(); iter != tree.end(); ++iter)
+    {
+        const std::string& name = iter->first;
+        const ptree subtree = iter->second;
+
+        if (name == "Reader" || name == "Filter" )
+        {
+            stage = parseElement_anystage(name, subtree);
+        }
+        else if (name == "Writer")
+        {
+            writer = parseElement_Writer(subtree);
+            isWriter = true;
+        }
+        else if (name == "<xmlattr>")
+        {
+            // ignore it, already parsed
+        }
+        else
+        {
+            throw pdal_error("PipelineReader: xml reader invalid child of "
+                "ReaderPipeline element");
+        }
+    }
+
+    if (writer && stage)
+    {
+        throw pdal_error("PipelineReader: extra nodes at front of "
+            "writer pipeline");
+    }
+
+    return isWriter;
+}
+
+bool PipelineReader::readPipeline(std::istream& input)
+{
+
+    ptree tree;
+
+    xml_parser::read_xml(input, tree, xml_parser::no_comments);
+
+    boost::optional<ptree> opt(tree.get_child_optional("Pipeline"));
+    if (!opt.is_initialized())
+        throw pdal_error("PipelineReader: root element is not Pipeline");
+    ptree subtree = opt.get();
+    return parseElement_Pipeline(subtree);
+}
+
+
+bool PipelineReader::readPipeline(const std::string& filename)
+{
+    m_inputXmlFile = filename;
+
+    std::istream* input = FileUtils::openFile(filename);
+
+    bool isWriter = false;
+
+    try
+    {
+        isWriter = readPipeline(*input);
+    }
+    catch (const pdal_error& error)
+    {
+        throw error;
+    }
+    catch (...)
+    {
+        FileUtils::closeFile(input);
+        std::ostringstream oss;
+        oss << "Unable to process pipeline file \"" << filename << "\"." <<
+            "  XML is invalid.";
+        throw pdal_error(oss.str());
+    }
+
+    FileUtils::closeFile(input);
+
+    m_inputXmlFile = "";
+
+    return isWriter;
+}
+
+
+} // namespace pdal
diff --git a/src/PipelineWriter.cpp b/src/PipelineWriter.cpp
new file mode 100644
index 0000000..43b3778
--- /dev/null
+++ b/src/PipelineWriter.cpp
@@ -0,0 +1,166 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PipelineWriter.hpp>
+
+#include <pdal/Filter.hpp>
+#include <pdal/Reader.hpp>
+#include <pdal/Writer.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PDALUtils.hpp>
+
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/optional.hpp>
+#include <boost/foreach.hpp>
+#include <boost/algorithm/string.hpp>
+
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+using namespace boost::property_tree;
+
+namespace pdal
+{
+
+static ptree generateTreeFromStage(const Stage& stage)
+{
+    ptree tree;
+    ptree& attrtree = tree.add_child("Pipeline", stage.serializePipeline());
+    attrtree.put("<xmlattr>.version", "1.0");
+    return tree;
+}
+
+
+void PipelineWriter::write_option_ptree(ptree& tree, const Options& opts)
+{
+    ptree m_tree = Utils::toPTree(opts);
+
+    auto iter = m_tree.begin();
+    while (iter != m_tree.end())
+    {
+        if (iter->first != "Option")
+            throw pdal_error("malformed Options ptree");
+        const ptree& optionTree = iter->second;
+
+        // we want to create this:
+        //      ...
+        //      <Option name="file">foo.las</Option>
+        //      ...
+
+        const std::string& name =
+            optionTree.get_child("Name").get_value<std::string>();
+        const std::string& value =
+            optionTree.get_child("Value").get_value<std::string>();
+
+        ptree& subtree = tree.add("Option", value);
+        subtree.put("<xmlattr>.name", name);
+
+        boost::optional<ptree const&> moreOptions =
+            optionTree.get_child_optional("Options");
+
+        if (moreOptions)
+        {
+            ptree newOpts;
+            write_option_ptree(newOpts, moreOptions.get());
+            subtree.put_child("Options", newOpts);
+        }
+        ++iter;
+    }
+}
+
+
+ptree PipelineWriter::getMetadataEntry(const MetadataNode& input)
+{
+    ptree entry;
+
+    entry.put_value(input.value());
+    entry.put("<xmlattr>.name", input.name());
+    entry.put("<xmlattr>.type", input.type());
+
+    std::vector<MetadataNode> children = input.children();
+    for (auto ci = children.begin(); ci != children.end(); ++ci)
+        entry.add_child("Metadata", getMetadataEntry(*ci));
+    return entry;
+}
+
+
+void PipelineWriter::writeMetadata(boost::property_tree::ptree& tree,
+    const MetadataNode& input)
+{
+    tree.add_child("Metadata", getMetadataEntry(input));
+}
+
+
+void PipelineWriter::writeMetadata(boost::property_tree::ptree& tree,
+    const MetadataNodeList& input)
+{
+    for (auto mi = input.begin(); mi != input.end(); ++mi)
+        tree.add_child("Metadata", getMetadataEntry(*mi));
+}
+
+
+void PipelineWriter::writePipeline(const std::string& filename) const
+{
+    Stage *stage = m_manager.getStage();
+
+    ptree tree = generateTreeFromStage(*stage);
+#if BOOST_VERSION >= 105600
+    const xml_parser::xml_writer_settings<std::string> settings(' ', 4);
+#else
+    const xml_parser::xml_writer_settings<char> settings(' ', 4);
+#endif
+
+    if (boost::iequals(filename, "STDOUT"))
+        xml_parser::write_xml(std::cout, tree);
+    else
+        xml_parser::write_xml(filename, tree, std::locale(), settings);
+}
+
+void PipelineWriter::writePipeline(std::ostream& strm) const
+{
+    Stage *stage = m_manager.getStage();
+
+    ptree tree = generateTreeFromStage(*stage);
+#if BOOST_VERSION >= 105600
+    const xml_parser::xml_writer_settings<std::string> settings(' ', 4);
+#else
+    const xml_parser::xml_writer_settings<char> settings(' ', 4);
+#endif
+
+    xml_parser::write_xml(strm, tree);
+
+}
+} // namespace pdal
+
diff --git a/src/PluginManager.cpp b/src/PluginManager.cpp
new file mode 100644
index 0000000..c4e6fca
--- /dev/null
+++ b/src/PluginManager.cpp
@@ -0,0 +1,432 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+// The PluginManager was modeled very closely after the work of Gigi Sayfan in
+// the Dr. Dobbs article:
+// http://www.drdobbs.com/cpp/building-your-own-plugin-framework-part/206503957
+// The original work was released under the Apache License v2.
+
+#include <pdal/PluginManager.hpp>
+
+#include <boost/filesystem.hpp>
+
+#include <pdal/pdal_defines.h>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include "DynamicLibrary.h"
+
+#include <memory>
+#include <sstream>
+#include <string>
+
+namespace pdal
+{
+
+namespace
+{
+#if defined(__APPLE__) && defined(__MACH__)
+    const std::string dynamicLibraryExtension(".dylib");
+#elif defined __linux__
+    const std::string dynamicLibraryExtension(".so");
+#elif defined _WIN32
+    const std::string dynamicLibraryExtension(".dll");
+#endif
+
+    bool isValid(const PF_RegisterParams * params)
+    {
+        return (params && params->createFunc && params->destroyFunc);
+    }
+
+    bool pluginTypeValid(std::string pathname, PF_PluginType type)
+    {
+        bool valid(false);
+
+        if (Utils::startsWith(pathname, "libpdal_plugin_kernel"))
+        {
+            if (type == PF_PluginType_Kernel)
+                valid = true;
+        }
+        else if (Utils::startsWith(pathname, "libpdal_plugin_filter"))
+        {
+            if (type == PF_PluginType_Filter)
+                valid = true;
+        }
+        else if (Utils::startsWith(pathname, "libpdal_plugin_reader"))
+        {
+            if (type == PF_PluginType_Reader)
+                valid = true;
+        }
+        else if (Utils::startsWith(pathname, "libpdal_plugin_writer"))
+        {
+            if (type == PF_PluginType_Writer)
+                valid = true;
+        }
+
+        return valid;
+    }
+}
+
+
+bool PluginManager::registerObject(const std::string& objectType,
+    const PF_RegisterParams* params)
+{
+    bool registered(false);
+
+    if (isValid(params))
+    {
+        PluginManager& pm = PluginManager::getInstance();
+
+        if (pm.m_version.major == params->version.major)
+        {
+            auto entry(std::make_pair(objectType, *params));
+            registered = pm.m_exactMatchMap.insert(entry).second;
+        }
+    }
+
+    return registered;
+}
+
+
+PluginManager& PluginManager::getInstance()
+{
+    static PluginManager instance;
+    return instance;
+}
+
+
+void PluginManager::loadAll(PF_PluginType type)
+{
+    std::string driver_path("PDAL_DRIVER_PATH");
+    std::string pluginDir = Utils::getenv(driver_path);
+
+    // If we don't have a driver path, defaults are set.
+    if (pluginDir.size() == 0)
+    {
+        std::ostringstream oss;
+        oss << PDAL_PLUGIN_INSTALL_PATH <<
+            ":/usr/local/lib:./lib:../lib:../bin";
+        pluginDir = oss.str();
+    }
+
+    std::vector<std::string> pluginPathVec = Utils::split2(pluginDir, ':');
+
+    for (const auto& pluginPath : pluginPathVec)
+    {
+        loadAll(pluginPath, type);
+    }
+}
+
+
+void PluginManager::loadAll(const std::string& pluginDirectory,
+    PF_PluginType type)
+{
+    const bool pluginDirectoryValid =
+            pluginDirectory.size() &&
+                (FileUtils::fileExists(pluginDirectory) ||
+                boost::filesystem::is_directory(pluginDirectory));
+
+    if (pluginDirectoryValid)
+    {
+        boost::filesystem::directory_iterator dir(pluginDirectory), it, end;
+
+        // Looks like directory_iterator doesn't support range-based for loop in
+        // Boost v1.55. It fails Travis anyway, so I reverted it.
+        for (it = dir; it != end; ++it)
+        {
+            boost::filesystem::path full_path = it->path();
+
+            if (boost::filesystem::is_directory(full_path))
+                continue;
+
+            std::string ext = full_path.extension().string();
+            if (ext != dynamicLibraryExtension)
+                continue;
+
+            loadByPath(full_path.string(), type);
+        }
+    }
+}
+
+
+bool PluginManager::initializePlugin(PF_InitFunc initFunc)
+{
+    bool initialized(false);
+
+    PluginManager& pm = PluginManager::getInstance();
+
+    if (PF_ExitFunc exitFunc = initFunc())
+    {
+        initialized = true;
+        pm.m_exitFuncVec.push_back(exitFunc);
+    }
+
+    return initialized;
+}
+
+
+PluginManager::PluginManager()
+{
+    m_version.major = 1;
+    m_version.minor = 0;
+}
+
+
+PluginManager::~PluginManager()
+{
+    if (!shutdown())
+    {
+        std::cerr << "Error destructing PluginManager" << std::endl;
+    }
+}
+
+
+bool PluginManager::shutdown()
+{
+    bool success(true);
+
+    for (auto const& func : m_exitFuncVec)
+    {
+        try
+        {
+            // Exit functions return 0 if successful.
+            if ((*func)() != 0)
+            {
+                success = false;
+            }
+        }
+        catch (...)
+        {
+            success = false;
+        }
+    }
+
+    m_dynamicLibraryMap.clear();
+    m_exactMatchMap.clear();
+    m_exitFuncVec.clear();
+
+    return success;
+}
+
+bool PluginManager::loadPlugin(const std::string& driverFileName)
+{
+    std::vector<std::string> driverPathVec;
+    driverPathVec = Utils::split2(driverFileName, '.');
+
+    boost::filesystem::path full_path(driverFileName);
+
+    if (boost::filesystem::is_directory(full_path))
+        return false;
+
+    std::string ext = full_path.extension().string();
+    if (ext != dynamicLibraryExtension)
+        return false;
+    std::string stem = full_path.stem().string();
+    std::vector<std::string> driverNameVec;
+    driverNameVec = Utils::split2(driverPathVec[0], '_');
+
+    std::string ptype;
+    if (driverNameVec.size() >=3)
+        ptype = driverNameVec[2];
+
+    PF_PluginType type;
+    if (Utils::iequals(ptype, "reader"))
+        type = PF_PluginType_Reader;
+    else if (Utils::iequals(ptype,"kernel"))
+        type = PF_PluginType_Kernel;
+    else if (Utils::iequals(ptype, "filter"))
+        type = PF_PluginType_Filter;
+    else if (Utils::iequals(ptype, "writer"))
+        type = PF_PluginType_Writer;
+    else
+        throw pdal_error("Unknown plugin type '" + ptype +"'");
+
+    if (loadByPath(full_path.string(), type))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+bool PluginManager::guessLoadByPath(const std::string& driverName)
+{
+    // parse the driver name into an expected pluginName, e.g.,
+    // writers.las => libpdal_plugin_writer_las
+
+    std::vector<std::string> driverNameVec;
+    driverNameVec = Utils::split2(driverName, '.');
+
+    std::string pluginName = "libpdal_plugin_" + driverNameVec[0] + "_" +
+        driverNameVec[1];
+
+    std::string driver_path("PDAL_DRIVER_PATH");
+    std::string pluginDir = Utils::getenv(driver_path);
+
+    // Default path below if not set.
+    if (pluginDir.size() == 0)
+    {
+        std::ostringstream oss;
+        oss << PDAL_PLUGIN_INSTALL_PATH <<
+            ":/usr/local/lib:./lib:../lib:../bin";
+        pluginDir = oss.str();
+    }
+
+    std::vector<std::string> pluginPathVec = Utils::split2(pluginDir, ':');
+    for (const auto& pluginPath : pluginPathVec)
+    {
+        boost::filesystem::path path(pluginPath);
+
+        if (!FileUtils::fileExists(path.string()) ||
+            !boost::filesystem::is_directory(path))
+            continue;
+
+        boost::filesystem::directory_iterator dir(path), it, end;
+        // Looks like directory_iterator doesn't support range-based for loop in
+        // Boost v1.55. It fails Travis anyway, so I reverted it.
+        for (it = dir; it != end; ++it)
+        {
+            boost::filesystem::path full_path = it->path();
+
+            if (boost::filesystem::is_directory(full_path))
+                continue;
+
+            std::string ext = full_path.extension().string();
+            if (ext != dynamicLibraryExtension)
+                continue;
+
+            std::string stem = full_path.stem().string();
+            std::string::size_type pos = stem.find_last_of('_');
+            if (pos == std::string::npos || pos == stem.size() - 1 ||
+                    stem.substr(pos + 1) != driverNameVec[1])
+                continue;
+
+            PF_PluginType type;
+            if (driverNameVec[0] == "readers")
+                type = PF_PluginType_Reader;
+            else if (driverNameVec[0] == "kernels")
+                type = PF_PluginType_Kernel;
+            else if (driverNameVec[0] == "filters")
+                type = PF_PluginType_Filter;
+            else if (driverNameVec[0] == "writers")
+                type = PF_PluginType_Writer;
+            else
+                type = PF_PluginType_Reader;
+
+            if (loadByPath(full_path.string(), type))
+            {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+
+bool PluginManager::loadByPath(const std::string& pluginPath,
+    PF_PluginType type)
+{
+    // Only filenames that start with libpdal_plugin are candidates to be loaded
+    // at runtime.  PDAL plugins are to be named in a specified form:
+
+    // libpdal_plugin_{stagetype}_{name}
+
+    // For example, libpdal_plugin_writer_text or libpdal_plugin_filter_color
+
+    bool loaded(false);
+
+    boost::filesystem::path path(pluginPath);
+    std::string pathname = Utils::tolower(path.filename().string());
+
+    // If we are a valid type, and we're not yet already
+    // loaded in the LibraryMap, load it.
+    if (pluginTypeValid(pathname, type) &&
+        m_dynamicLibraryMap.find(path.string()) == m_dynamicLibraryMap.end())
+    {
+        std::string errorString;
+        auto completePath(boost::filesystem::complete(path).string());
+
+        if (DynamicLibrary *d = loadLibrary(completePath, errorString))
+        {
+            if (PF_InitFunc initFunc =
+                    (PF_InitFunc)(d->getSymbol("PF_initPlugin")))
+            {
+                loaded = initializePlugin(initFunc);
+            }
+        }
+    }
+
+    return loaded;
+}
+
+void *PluginManager::createObject(const std::string& objectType)
+{
+    void* obj(0);
+
+    auto find([this, &objectType]()->bool
+    {
+        return m_exactMatchMap.count(objectType);
+    });
+
+    if (find() || (guessLoadByPath(objectType) && find()))
+    {
+        obj = m_exactMatchMap[objectType].createFunc();
+    }
+
+    return obj;
+}
+
+
+DynamicLibrary *PluginManager::loadLibrary(const std::string& path,
+    std::string & errorString)
+{
+    DynamicLibrary *d = DynamicLibrary::load(path, errorString);
+
+    if (d)
+    {
+        m_dynamicLibraryMap[boost::filesystem::complete(path).string()] =
+            DynLibPtr(d);
+    }
+
+    return d;
+}
+
+
+const PluginManager::RegistrationMap& PluginManager::getRegistrationMap()
+{
+    return m_exactMatchMap;
+}
+
+} // namespace pdal
diff --git a/src/PointLayout.cpp b/src/PointLayout.cpp
new file mode 100644
index 0000000..5803ac6
--- /dev/null
+++ b/src/PointLayout.cpp
@@ -0,0 +1,297 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PointLayout.hpp>
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+PointLayout::PointLayout()
+    : m_detail(Dimension::COUNT)
+    , m_used()
+    , m_propIds()
+    , m_nextFree(Dimension::PROPRIETARY)
+    , m_pointSize(0)
+    , m_finalized(false)
+{
+    int id = 0;
+    for (auto& d : m_detail)
+    {
+        d.setId((Dimension::Id::Enum)id);
+        id++;
+    }
+}
+
+void PointLayout::finalize()
+{
+    m_finalized = true;
+}
+
+void PointLayout::registerDims(std::vector<Dimension::Id::Enum> ids)
+{
+    for (auto ii = ids.begin(); ii != ids.end(); ++ii)
+        registerDim(*ii);
+}
+
+void PointLayout::registerDims(Dimension::Id::Enum *id)
+{
+    while (*id != Dimension::Id::Unknown)
+        registerDim(*id++);
+}
+
+void PointLayout::registerDim(Dimension::Id::Enum id)
+{
+    registerDim(id, Dimension::defaultType(id));
+}
+
+void PointLayout::registerDim(Dimension::Id::Enum id, Dimension::Type::Enum type)
+{
+    Dimension::Detail dd = m_detail[id];
+    dd.setType(resolveType(type, dd.type()));
+    update(dd, Dimension::name(id));
+}
+
+Dimension::Id::Enum PointLayout::assignDim(const std::string& name,
+    Dimension::Type::Enum type)
+{
+    Dimension::Id::Enum id = (Dimension::Id::Enum)m_nextFree;
+
+    auto di = m_propIds.find(name);
+    if (di != m_propIds.end())
+        id = di->second;
+    Dimension::Detail dd = m_detail[id];
+    dd.setType(resolveType(type, dd.type()));
+    if (update(dd, name))
+    {
+        if (di == m_propIds.end())
+        {
+            m_nextFree++;
+            m_propIds[name] = id;
+        }
+        return id;
+    }
+    return Dimension::Id::Unknown;
+}
+
+Dimension::Id::Enum PointLayout::registerOrAssignDim(const std::string name,
+   Dimension::Type::Enum type)
+{
+    Dimension::Id::Enum id = Dimension::id(name);
+    if (id != Dimension::Id::Unknown)
+    {
+        registerDim(id, type);
+        return id;
+    }
+    return assignDim(name, type);
+}
+
+DimTypeList PointLayout::dimTypes() const
+{
+    DimTypeList dimTypes;
+
+    const Dimension::IdList& ids = dims();
+    for (auto ii = ids.begin(); ii != ids.end(); ++ii)
+        dimTypes.push_back(DimType(*ii, dimType(*ii)));
+    return dimTypes;
+}
+
+DimType PointLayout::findDimType(const std::string& name) const
+{
+    Dimension::Id::Enum id = findDim(name);
+    return DimType(id, dimType(id));
+}
+
+Dimension::Id::Enum PointLayout::findDim(const std::string& name) const
+{
+    Dimension::Id::Enum id = Dimension::id(name);
+    if (dimType(id) != Dimension::Type::None)
+        return id;
+    return findProprietaryDim(name);
+}
+
+Dimension::Id::Enum PointLayout::findProprietaryDim(const std::string& name) const
+{
+    auto di = m_propIds.find(name);
+    return (di != m_propIds.end() ? di->second :
+        Dimension::Id::Unknown);
+}
+
+std::string PointLayout::dimName(Dimension::Id::Enum id) const
+{
+    std::string name = Dimension::name(id);
+    if (!name.empty())
+        return name;
+    for (auto pi = m_propIds.begin();
+            pi != m_propIds.end(); ++pi)
+        if (pi->second == id)
+            return pi->first;
+    return "";
+}
+
+bool PointLayout::hasDim(Dimension::Id::Enum id) const
+{
+    return m_detail[id].type() != Dimension::Type::None;
+}
+
+const Dimension::IdList& PointLayout::dims() const
+{
+    return m_used;
+}
+
+Dimension::Type::Enum PointLayout::dimType(Dimension::Id::Enum id) const
+{
+    return dimDetail(id)->type();
+}
+
+size_t PointLayout::dimSize(Dimension::Id::Enum id) const
+{
+    return dimDetail(id)->size();
+}
+
+size_t PointLayout::dimOffset(Dimension::Id::Enum id) const
+{
+    return dimDetail(id)->offset();
+}
+
+size_t PointLayout::pointSize() const
+{
+    return m_pointSize;
+}
+
+const Dimension::Detail* PointLayout::dimDetail(Dimension::Id::Enum id) const
+{
+    return &(m_detail[(size_t)id]);
+}
+
+bool PointLayout::update(Dimension::Detail dd, const std::string& name)
+{
+    if (m_finalized)
+    {
+        throw pdal_error("Can't update layout after points have been added.");
+    }
+
+    Dimension::DetailList detail;
+
+    bool used = Utils::contains(m_used, dd.id());
+    for (auto id : m_used)
+    {
+        if (id == dd.id())
+            detail.push_back(dd);
+        else
+            detail.push_back(m_detail[id]);
+    }
+    if (!used)
+        detail.push_back(dd);
+
+    // Find the dimension in the list that we're referring to with
+    // this update.
+    auto di = std::find_if(detail.begin(), detail.end(),
+        [dd](const Dimension::Detail& td){ return td.id() == dd.id(); });
+    Dimension::Detail *cur = &(*di);
+
+    {
+        auto sorter = [this](const Dimension::Detail& d1,
+                const Dimension::Detail& d2) -> bool
+        {
+            if (d1.size() > d2.size())
+                return true;
+            if (d1.size() < d2.size())
+                return false;
+            return d1.id() < d2.id();
+        };
+
+        int offset = 0;
+        std::sort(detail.begin(), detail.end(), sorter);
+        for (auto& d : detail)
+        {
+            d.setOffset(offset);
+            offset += (int)d.size();
+        }
+        //NOTE - I tried forcing all points to be aligned on 8-byte boundaries
+        // in case this would matter to the optimized memcpy, but it made
+        // no difference.  No sense wasting space for no difference.
+        m_pointSize = (size_t)offset;
+    }
+
+    if (!used)
+        m_used.push_back(dd.id());
+
+    for (auto& dtemp : detail)
+        m_detail[dtemp.id()] = dtemp;
+
+    return true;
+}
+
+Dimension::Type::Enum PointLayout::resolveType(
+        Dimension::Type::Enum t1,
+        Dimension::Type::Enum t2)
+{
+    using namespace Dimension;
+    using namespace Dimension::BaseType;
+    if (t1 == Type::None && t2 != Type::None)
+       return t2;
+    if (t2 == Type::None && t1 != Type::None)
+       return t1;
+    if (t1 == t2)
+        return t1;
+    if (base(t1) == base(t2))
+        return std::max(t1, t2);
+    //Prefer floating to non-floating.
+    if (base(t1) == Floating && base(t2) != Floating)
+        return t1;
+    if (base(t2) == Floating && base(t1) != Floating)
+        return t2;
+    // Now we're left with cases of a signed/unsigned mix.
+    // If the unsigned type is smaller, take the signed type.
+    if (base(t1) == Unsigned && size(t1) < size(t2))
+        return t2;
+    if (base(t2) == Unsigned && size(t2) < size(t1))
+        return t1;
+    // Signed type is smaller or the the sizes are equal.
+    switch (std::max(size(t1), size(t2)))
+    {
+    case 1:
+        return Type::Signed16;
+    case 2:
+        return Type::Signed32;
+    case 4:
+        return Type::Signed64;
+    default:
+        return Type::Double;
+    }
+}
+
+} // namespace pdal
+
diff --git a/src/PointTable.cpp b/src/PointTable.cpp
new file mode 100644
index 0000000..6f5cc64
--- /dev/null
+++ b/src/PointTable.cpp
@@ -0,0 +1,104 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/PointTable.hpp>
+
+namespace pdal
+{
+
+SpatialReference BasePointTable::spatialRef() const
+{
+    MetadataNode m = m_metadata->m_private.findChild("spatialreference");
+    SpatialReference sref;
+    sref.setWKT(m.value());
+    return sref;
+}
+
+
+void BasePointTable::setSpatialRef(const SpatialReference& sref)
+{
+    MetadataNode mp = m_metadata->m_private;
+    mp.addOrUpdate("spatialreference", sref.getRawWKT());
+}
+
+
+MetadataNode BasePointTable::privateMetadata(const std::string& name)
+{
+    MetadataNode mp = m_metadata->m_private;
+    MetadataNode m = mp.findChild(name);
+    if (!m.valid())
+        m = mp.add(name);
+    return m;
+}
+
+
+PointTable::~PointTable()
+{
+    for (auto vi = m_blocks.begin(); vi != m_blocks.end(); ++vi)
+        delete [] *vi;
+}
+
+PointId PointTable::addPoint()
+{
+    if (m_numPts % m_blockPtCnt == 0)
+    {
+        size_t size = pointsToBytes(m_blockPtCnt);
+        char *buf = new char[size];
+        memset(buf, 0, size);
+        m_blocks.push_back(buf);
+    }
+    return m_numPts++;
+}
+
+
+char *PointTable::getPoint(PointId idx)
+{
+    char *buf = m_blocks[idx / m_blockPtCnt];
+    return buf + pointsToBytes(idx % m_blockPtCnt);
+}
+
+
+void PointTable::setField(const Dimension::Detail *d, PointId idx,
+    const void *value)
+{
+    std::memcpy(getDimension(d, idx), value, d->size());
+}
+
+void PointTable::getField(const Dimension::Detail *d, PointId idx, void *value)
+{
+    std::memcpy(value, getDimension(d, idx), d->size());
+}
+
+} // namespace pdal
+
diff --git a/src/PointView.cpp b/src/PointView.cpp
new file mode 100644
index 0000000..241e988
--- /dev/null
+++ b/src/PointView.cpp
@@ -0,0 +1,190 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <iomanip>
+
+#include <pdal/PointView.hpp>
+#include <pdal/PointViewIter.hpp>
+
+#include <boost/lexical_cast.hpp>
+
+namespace pdal
+{
+
+bool PointView::m_ok;
+
+PointViewIter PointView::begin()
+{
+    return PointViewIter(this, 0);
+}
+
+
+PointViewIter PointView::end()
+{
+    return PointViewIter(this, size());
+}
+
+
+void PointView::calculateBounds(BOX2D& output) const
+{
+    for (PointId idx = 0; idx < size(); idx++)
+    {
+        double x = getFieldAs<double>(Dimension::Id::X, idx);
+        double y = getFieldAs<double>(Dimension::Id::Y, idx);
+
+        output.grow(x, y);
+    }
+}
+
+
+void PointView::calculateBounds(const PointViewSet& set, BOX2D& output)
+{
+    for (auto iter = set.begin(); iter != set.end(); ++iter)
+    {
+        PointViewPtr buf = *iter;
+        buf->calculateBounds(output);
+    }
+}
+
+
+void PointView::calculateBounds(BOX3D& output) const
+{
+    for (PointId idx = 0; idx < size(); idx++)
+    {
+        double x = getFieldAs<double>(Dimension::Id::X, idx);
+        double y = getFieldAs<double>(Dimension::Id::Y, idx);
+        double z = getFieldAs<double>(Dimension::Id::Z, idx);
+
+        output.grow(x, y, z);
+    }
+}
+
+
+void PointView::calculateBounds(const PointViewSet& set, BOX3D& output)
+{
+    for (auto iter = set.begin(); iter != set.end(); ++iter)
+    {
+        PointViewPtr buf = *iter;
+        buf->calculateBounds(output);
+    }
+}
+
+
+void PointView::dump(std::ostream& ostr) const
+{
+    using std::endl;
+    PointLayoutPtr layout = m_pointTable.layout();
+    const Dimension::IdList& dims = layout->dims();
+
+    point_count_t numPoints = size();
+    ostr << "Contains " << numPoints << "  points" << endl;
+    for (PointId idx = 0; idx < numPoints; idx++)
+    {
+        ostr << "Point: " << idx << endl;
+
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            Dimension::Id::Enum d = *di;
+            const Dimension::Detail *dd = layout->dimDetail(d);
+            ostr << Dimension::name(d) << " (" <<
+                Dimension::interpretationName(dd->type()) << ") : ";
+
+            switch (dd->type())
+            {
+            case Dimension::Type::Signed8:
+                {
+                    ostr << (int)(getFieldInternal<int8_t>(d, idx));
+                    break;
+                }
+            case Dimension::Type::Signed16:
+                {
+                    ostr << getFieldInternal<int16_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Signed32:
+                {
+                    ostr << getFieldInternal<int32_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Signed64:
+                {
+                    ostr << getFieldInternal<int64_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Unsigned8:
+                {
+                    ostr << (unsigned)(getFieldInternal<uint8_t>(d, idx));
+                    break;
+                }
+            case Dimension::Type::Unsigned16:
+                {
+                    ostr << getFieldInternal<uint16_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Unsigned32:
+                {
+                    ostr << getFieldInternal<uint32_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Unsigned64:
+                {
+                    ostr << getFieldInternal<uint64_t>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Float:
+                {
+                    ostr << getFieldInternal<float>(d, idx);
+                    break;
+                }
+            case Dimension::Type::Double:
+                {
+                    ostr << getFieldInternal<double>(d, idx);
+                    break;
+                }
+            default:
+                throw;
+            }
+            ostr << endl;
+        }
+    }
+}
+
+
+std::ostream& operator<<(std::ostream& ostr, const PointView& buf)
+{
+    buf.dump(ostr);
+    return ostr;
+}
+
+} // namespace pdal
diff --git a/src/QuadIndex.cpp b/src/QuadIndex.cpp
new file mode 100644
index 0000000..893bcf5
--- /dev/null
+++ b/src/QuadIndex.cpp
@@ -0,0 +1,906 @@
+/******************************************************************************
+* Copyright (c) 2014, Connor Manning (connor at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <limits>
+#include <cmath>
+#include <memory>
+
+#include <pdal/PointView.hpp>
+#include <pdal/QuadIndex.hpp>
+#include <pdal/util/Utils.hpp>
+
+namespace
+{
+    using namespace pdal;
+
+    struct BBox
+    {
+        BBox(Point min, Point max)
+            : min(min)
+            , max(max)
+            , center(min.x + (max.x - min.x) / 2, min.y + (max.y - min.y) / 2)
+            , halfWidth(center.x - min.x)
+            , halfHeight(center.y - min.y)
+        { }
+
+        BBox(const BBox& other)
+            : min(other.min)
+            , max(other.max)
+            , center(other.center)
+            , halfWidth(other.halfWidth)
+            , halfHeight(other.halfHeight)
+        { }
+
+        // Returns true if this BBox shares any area in common with another.
+        bool overlaps(const BBox& other) const
+        {
+            return
+                std::abs(center.x - other.center.x) <
+                    halfWidth + other.halfWidth &&
+                std::abs(center.y - other.center.y) <
+                    halfHeight + other.halfHeight;
+        }
+
+        bool overlaps(
+            const double xBegin,
+            const double xEnd,
+            const double yBegin,
+            const double yEnd) const
+        {
+            const BBox other(
+                    Point(xBegin, yBegin),
+                    Point(xEnd, yEnd));
+
+            return overlaps(other);
+        }
+
+        // Returns true if the requested point is contained within this BBox.
+        bool contains(const Point& p) const
+        {
+            return p.x >= min.x && p.y >= min.y && p.x < max.x && p.y < max.y;
+        }
+
+        const Point min;
+        const Point max;
+
+        // Pre-calculate these properties, rather than exposing functions to
+        // calculate them on-demand, due to the large number of times that
+        // these will be needed when querying the quad tree.
+        const Point center;
+        const double halfWidth;
+        const double halfHeight;
+
+        BBox& operator=(const BBox&); // not implemented
+    };
+
+} // anonymous namespace
+
+namespace pdal
+{
+
+// Recursive quadtree implementation.
+struct Tree
+{
+    Tree(BBox bbox, const QuadPointRef* data = 0)
+        : bbox(bbox)
+        , data(data)
+        , nw()
+        , ne()
+        , se()
+        , sw()
+    { }
+
+    void getFills(std::vector<std::size_t>& fills, std::size_t level = 0) const;
+
+    // Returns depth resulting from the insertion of this point.
+    std::size_t addPoint(const QuadPointRef* toAdd, std::size_t curDepth = 0);
+
+    void getPoints(
+            std::vector<PointId>& results,
+            std::size_t depthBegin,
+            std::size_t depthEnd,
+            std::size_t curDepth) const;
+
+    void getPoints(
+            std::vector<PointId>& results,
+            std::size_t rasterize,
+            double xBegin,
+            double xEnd,
+            double xStep,
+            double yBegin,
+            double yEnd,
+            double yStep,
+            std::size_t curDepth) const;
+
+    void getPoints(
+            std::vector<PointId>& results,
+            double xBegin,
+            double xEnd,
+            double xStep,
+            double yBegin,
+            double yEnd,
+            double yStep) const;
+
+    void getPoints(
+            std::vector<PointId>& results,
+            const BBox& query,
+            std::size_t depthBegin,
+            std::size_t depthEnd,
+            std::size_t curDepth) const;
+
+    const BBox bbox;
+    const QuadPointRef* data;
+
+    std::unique_ptr<Tree> nw;
+    std::unique_ptr<Tree> ne;
+    std::unique_ptr<Tree> se;
+    std::unique_ptr<Tree> sw;
+};
+
+std::size_t Tree::addPoint(const QuadPointRef* toAdd, const std::size_t curDepth)
+{
+    if (data)
+    {
+        const Point& center(bbox.center);
+
+        if (toAdd->point.sqDist(center) < data->point.sqDist(center))
+        {
+            std::swap(data, toAdd);
+        }
+
+        const std::size_t nextDepth(curDepth + 1);
+
+        if (toAdd->point.x < center.x)
+        {
+            if (toAdd->point.y < center.y)
+            {
+                if (sw)
+                {
+                    return sw->addPoint(toAdd, nextDepth);
+                }
+                else
+                {
+                    sw.reset(new Tree(
+                            BBox(
+                                Point(bbox.min.x, bbox.min.y),
+                                Point(center.x, center.y)),
+                            toAdd));
+
+                    return nextDepth;
+                }
+            }
+            else
+            {
+                if (nw)
+                {
+                    return nw->addPoint(toAdd, nextDepth);
+                }
+                else
+                {
+                    nw.reset(new Tree(
+                            BBox(
+                                Point(bbox.min.x, center.y),
+                                Point(center.x, bbox.max.y)),
+                            toAdd));
+
+                    return nextDepth;
+                }
+            }
+        }
+        else
+        {
+            if (toAdd->point.y < center.y)
+            {
+                if (se)
+                {
+                    return se->addPoint(toAdd, nextDepth);
+                }
+                else
+                {
+                    se.reset(new Tree(
+                            BBox(
+                                Point(center.x, bbox.min.y),
+                                Point(bbox.max.x, center.y)),
+                            toAdd));
+
+                    return nextDepth;
+                }
+            }
+            else
+            {
+                if (ne)
+                {
+                    return ne->addPoint(toAdd, nextDepth);
+                }
+                else
+                {
+                    ne.reset(new Tree(
+                            BBox(
+                                Point(center.x, center.y),
+                                Point(bbox.max.x, bbox.max.y)),
+                            toAdd));
+
+                    return nextDepth;
+                }
+            }
+        }
+    }
+    else
+    {
+        data = toAdd;
+        return curDepth;
+    }
+}
+
+// Fills are a count of the number of points at each level of the quad tree.
+void Tree::getFills(std::vector<std::size_t>& fills, std::size_t level) const
+{
+    if (data)
+    {
+        if (level >= fills.size())
+            fills.resize(level + 1);
+        (fills[level])++;
+    }
+
+    ++level;
+    if (nw) nw->getFills(fills, level);
+    if (ne) ne->getFills(fills, level);
+    if (sw) sw->getFills(fills, level);
+    if (se) se->getFills(fills, level);
+}
+
+
+void Tree::getPoints(
+        std::vector<PointId>& results,
+        const std::size_t depthBegin,
+        const std::size_t depthEnd,
+        std::size_t curDepth) const
+{
+    if (data && curDepth >= depthBegin)
+    {
+        results.push_back(data->pbIndex);
+    }
+
+    if (++curDepth < depthEnd || depthEnd == 0)
+    {
+        if (nw) nw->getPoints(results, depthBegin, depthEnd, curDepth);
+        if (ne) ne->getPoints(results, depthBegin, depthEnd, curDepth);
+        if (se) se->getPoints(results, depthBegin, depthEnd, curDepth);
+        if (sw) sw->getPoints(results, depthBegin, depthEnd, curDepth);
+    }
+}
+
+void Tree::getPoints(
+        std::vector<PointId>& results,
+        const std::size_t rasterize,
+        const double xBegin,
+        const double xEnd,
+        const double xStep,
+        const double yBegin,
+        const double yEnd,
+        const double yStep,
+        std::size_t curDepth) const
+{
+    if (curDepth == rasterize)
+    {
+        if (data)
+        {
+            const std::size_t xOffset(
+                    Utils::sround((bbox.center.x - xBegin) / xStep));
+            const double yOffset(
+                    Utils::sround((bbox.center.y - yBegin) / yStep));
+
+            const std::size_t index(
+                Utils::sround(yOffset * (xEnd - xBegin) / xStep + xOffset));
+
+            results.at(index) = data->pbIndex;
+        }
+    }
+    else if (++curDepth <= rasterize)
+    {
+        if (nw) nw->getPoints(
+                results,
+                rasterize,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep,
+                curDepth);
+
+        if (ne) ne->getPoints(
+                results,
+                rasterize,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep,
+                curDepth);
+
+        if (se) se->getPoints(
+                results,
+                rasterize,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep,
+                curDepth);
+
+        if (sw) sw->getPoints(
+                results,
+                rasterize,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep,
+                curDepth);
+    }
+}
+
+void Tree::getPoints(
+        std::vector<PointId>& results,
+        const double xBegin,
+        const double xEnd,
+        const double xStep,
+        const double yBegin,
+        const double yEnd,
+        const double yStep) const
+{
+    if (!bbox.overlaps(xBegin, xEnd, yBegin, yEnd))
+    {
+        return;
+    }
+
+    if (nw) nw->getPoints(
+            results,
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+
+    if (ne) ne->getPoints(
+            results,
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+
+    if (se) se->getPoints(
+            results,
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+
+    if (sw) sw->getPoints(
+            results,
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+
+    // Add data after calling child nodes so we prefer upper levels of the tree.
+    if (
+            data &&
+            data->point.x >= xBegin &&
+            data->point.y >= yBegin &&
+            data->point.x < xEnd - xStep &&
+            data->point.y < yEnd - yStep)
+    {
+        const std::size_t xOffset(
+                Utils::sround((data->point.x - xBegin) / xStep));
+        const std::size_t yOffset(
+                Utils::sround((data->point.y - yBegin) / yStep));
+
+        const std::size_t index(
+            Utils::sround(yOffset * (xEnd - xBegin) / xStep + xOffset));
+
+        if (index < results.size())
+        {
+            results.at(index) = data->pbIndex;
+        }
+    }
+}
+
+void Tree::getPoints(
+        std::vector<PointId>& results,
+        const BBox& query,
+        const std::size_t depthBegin,
+        const std::size_t depthEnd,
+        std::size_t curDepth) const
+{
+    if (!query.overlaps(bbox))
+    {
+        return;
+    }
+
+    if (data &&
+        query.contains(data->point) &&
+        curDepth >= depthBegin &&
+        (curDepth < depthEnd || depthEnd == 0))
+    {
+        results.push_back(data->pbIndex);
+    }
+
+    if (++curDepth < depthEnd || depthEnd == 0)
+    {
+        if (nw) nw->getPoints(results, query, depthBegin, depthEnd, curDepth);
+        if (ne) ne->getPoints(results, query, depthBegin, depthEnd, curDepth);
+        if (se) se->getPoints(results, query, depthBegin, depthEnd, curDepth);
+        if (sw) sw->getPoints(results, query, depthBegin, depthEnd, curDepth);
+    }
+}
+
+struct QuadIndex::QImpl
+{
+    QImpl(const PointView& view, std::size_t topLevel);
+    QImpl(
+            const PointView& view,
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t topLevel);
+    QImpl(
+            const std::vector<std::shared_ptr<QuadPointRef> >& points,
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t topLevel);
+
+    void getBounds(
+            double& xMin,
+            double& yMin,
+            double& xMax,
+            double& yMax) const;
+
+    std::size_t getDepth() const;
+
+    std::vector<std::size_t> getFills();
+
+    std::vector<PointId> getPoints(
+            std::size_t depthBegin,
+            std::size_t depthEnd) const;
+
+    std::vector<PointId> getPoints(
+            std::size_t rasterize,
+            double& xBegin,
+            double& xEnd,
+            double& xStep,
+            double& yBegin,
+            double& yEnd,
+            double& yStep) const;
+
+    std::vector<PointId> getPoints(
+            double xBegin,
+            double xEnd,
+            double xStep,
+            double yBegin,
+            double yEnd,
+            double yStep) const;
+
+    std::vector<PointId> getPoints(
+            double xMin,
+            double yMin,
+            double xMax,
+            double yMax,
+            std::size_t depthBegin,
+            std::size_t depthEnd) const;
+
+    std::size_t m_topLevel;
+    std::vector<std::shared_ptr<QuadPointRef> > m_pointRefVec;
+    std::unique_ptr<Tree> m_tree;
+    std::size_t m_depth;
+    std::vector<std::size_t> m_fills;
+};
+
+QuadIndex::QImpl::QImpl(const PointView& view, std::size_t topLevel)
+    : m_topLevel(topLevel)
+    , m_pointRefVec()
+    , m_tree()
+    , m_depth(0)
+    , m_fills()
+{
+    m_pointRefVec.resize(view.size());
+
+    double xMin(std::numeric_limits<double>::max());
+    double yMin(std::numeric_limits<double>::max());
+    double xMax(std::numeric_limits<double>::min());
+    double yMax(std::numeric_limits<double>::min());
+
+    for (PointId i(0); i < view.size(); ++i)
+    {
+        m_pointRefVec[i].reset(
+                new QuadPointRef(
+                    Point(
+                        view.getFieldAs<double>(Dimension::Id::X, i),
+                        view.getFieldAs<double>(Dimension::Id::Y, i)),
+                i));
+
+        const QuadPointRef* pointRef(m_pointRefVec[i].get());
+        if (pointRef->point.x < xMin) xMin = pointRef->point.x;
+        if (pointRef->point.x > xMax) xMax = pointRef->point.x;
+        if (pointRef->point.y < yMin) yMin = pointRef->point.y;
+        if (pointRef->point.y > yMax) yMax = pointRef->point.y;
+    }
+
+    m_tree.reset(new Tree(BBox(Point(xMin, yMin), Point(xMax, yMax))));
+
+    for (std::size_t i = 0; i < m_pointRefVec.size(); ++i)
+    {
+        m_depth = std::max(m_tree->addPoint(m_pointRefVec[i].get()), m_depth);
+    }
+}
+
+QuadIndex::QImpl::QImpl(
+        const PointView& view,
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t topLevel)
+    : m_topLevel(topLevel)
+    , m_pointRefVec()
+    , m_tree()
+    , m_depth(0)
+    , m_fills()
+{
+    m_pointRefVec.resize(view.size());
+
+    for (PointId i(0); i < view.size(); ++i)
+    {
+        m_pointRefVec[i].reset(
+                new QuadPointRef(
+                    Point(
+                        view.getFieldAs<double>(Dimension::Id::X, i),
+                        view.getFieldAs<double>(Dimension::Id::Y, i)),
+                i));
+    }
+
+    m_tree.reset(new Tree(BBox(Point(xMin, yMin), Point(xMax, yMax))));
+
+    for (std::size_t i = 0; i < m_pointRefVec.size(); ++i)
+    {
+        m_depth = std::max(m_tree->addPoint(m_pointRefVec[i].get()), m_depth);
+    }
+}
+
+QuadIndex::QImpl::QImpl(
+        const std::vector<std::shared_ptr<QuadPointRef> >& points,
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t topLevel)
+    : m_topLevel(topLevel)
+    , m_pointRefVec(points.size())
+    , m_tree()
+    , m_depth(0)
+    , m_fills()
+{
+    m_tree.reset(new Tree(BBox(Point(xMin, yMin), Point(xMax, yMax))));
+
+    for (std::size_t i = 0; i < points.size(); ++i)
+    {
+        m_pointRefVec[i] = points[i];
+        m_depth = std::max(m_tree->addPoint(m_pointRefVec[i].get()), m_depth);
+    }
+}
+
+void QuadIndex::QImpl::getBounds(
+        double& xMin,
+        double& yMin,
+        double& xMax,
+        double& yMax) const
+{
+    if (m_tree)
+    {
+        xMin = m_tree->bbox.min.x;
+        yMin = m_tree->bbox.min.y;
+        xMax = m_tree->bbox.max.x;
+        yMax = m_tree->bbox.max.y;
+    }
+}
+
+std::size_t QuadIndex::QImpl::getDepth() const
+{
+    return m_depth;
+}
+
+std::vector<std::size_t> QuadIndex::QImpl::getFills()
+{
+    if (m_tree && !m_fills.size())
+    {
+        m_tree->getFills(m_fills);
+    }
+
+    return m_fills;
+}
+
+std::vector<PointId> QuadIndex::QImpl::getPoints(
+        const std::size_t minDepth,
+        const std::size_t maxDepth) const
+{
+    std::vector<PointId> results;
+
+    if (m_tree)
+    {
+        m_tree->getPoints(results, minDepth, maxDepth, m_topLevel);
+    }
+
+    return results;
+}
+
+std::vector<PointId> QuadIndex::QImpl::getPoints(
+        const std::size_t rasterize,
+        double& xBegin,
+        double& xEnd,
+        double& xStep,
+        double& yBegin,
+        double& yEnd,
+        double& yStep) const
+{
+    std::vector<PointId> results;
+
+    if (m_tree)
+    {
+        const std::size_t exp(std::pow(2, rasterize));
+        const double xWidth(m_tree->bbox.max.x - m_tree->bbox.min.x);
+        const double yWidth(m_tree->bbox.max.y - m_tree->bbox.min.y);
+
+        xStep = xWidth / exp;
+        yStep = yWidth / exp;
+        xBegin =    m_tree->bbox.min.x + (xStep / 2);
+        yBegin =    m_tree->bbox.min.y + (yStep / 2);
+        xEnd =      m_tree->bbox.max.x + (xStep / 2); // One tick past the end.
+        yEnd =      m_tree->bbox.max.y + (yStep / 2);
+
+        results.resize(exp * exp, std::numeric_limits<PointId>::max());
+
+        m_tree->getPoints(
+                results,
+                rasterize,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep,
+                m_topLevel);
+    }
+
+    return results;
+}
+
+std::vector<PointId> QuadIndex::QImpl::getPoints(
+        const double xBegin,
+        const double xEnd,
+        const double xStep,
+        const double yBegin,
+        const double yEnd,
+        const double yStep) const
+{
+    std::vector<PointId> results;
+
+    if (m_tree)
+    {
+        const std::size_t width (Utils::sround((xEnd - xBegin) / xStep));
+        const std::size_t height(Utils::sround((yEnd - yBegin) / yStep));
+        results.resize(width * height, std::numeric_limits<PointId>::max());
+
+        m_tree->getPoints(
+                results,
+                xBegin,
+                xEnd,
+                xStep,
+                yBegin,
+                yEnd,
+                yStep);
+    }
+
+    return results;
+}
+
+std::vector<PointId> QuadIndex::QImpl::getPoints(
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t minDepth,
+        std::size_t maxDepth) const
+{
+    std::vector<PointId> results;
+
+    // Making BBox from external parameters here, so do some light validation.
+    if (m_tree)
+    {
+        m_tree->getPoints(
+                results,
+                BBox(
+                    Point(std::min(xMin, xMax), std::min(yMin, yMax)),
+                    Point(std::max(xMin, xMax), std::max(yMin, yMax))),
+                minDepth,
+                maxDepth,
+                m_topLevel);
+    }
+
+    return results;
+}
+
+QuadIndex::QuadIndex(const PointView& view, std::size_t topLevel)
+    : m_qImpl(new QImpl(view, topLevel))
+{ }
+
+QuadIndex::QuadIndex(
+        const PointView& view,
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t topLevel)
+    : m_qImpl(new QImpl(view, xMin, yMin, xMax, yMax, topLevel))
+{ }
+
+QuadIndex::QuadIndex(
+        const std::vector<std::shared_ptr<QuadPointRef> >& points,
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t topLevel)
+    : m_qImpl(new QImpl(points, xMin, yMin, xMax, yMax, topLevel))
+{ }
+
+QuadIndex::~QuadIndex()
+{ }
+
+void QuadIndex::getBounds(
+        double& xMin,
+        double& yMin,
+        double& xMax,
+        double& yMax) const
+{
+    m_qImpl->getBounds(xMin, yMin, xMax, yMax);
+}
+
+std::size_t QuadIndex::getDepth() const
+{
+    return m_qImpl->getDepth();
+}
+
+std::vector<std::size_t> QuadIndex::getFills() const
+{
+    return m_qImpl->getFills();
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        std::size_t depthEnd) const
+{
+    return m_qImpl->getPoints(0, depthEnd);
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        std::size_t depthBegin,
+        std::size_t depthEnd) const
+{
+    return m_qImpl->getPoints(depthBegin, depthEnd);
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        const std::size_t rasterize,
+        double& xBegin,
+        double& xEnd,
+        double& xStep,
+        double& yBegin,
+        double& yEnd,
+        double& yStep) const
+{
+    return m_qImpl->getPoints(
+            rasterize,
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        const double xBegin,
+        const double xEnd,
+        const double xStep,
+        const double yBegin,
+        const double yEnd,
+        const double yStep) const
+{
+    return m_qImpl->getPoints(
+            xBegin,
+            xEnd,
+            xStep,
+            yBegin,
+            yEnd,
+            yStep);
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t depthEnd) const
+{
+    return m_qImpl->getPoints(
+            xMin,
+            yMin,
+            xMax,
+            yMax,
+            0,
+            depthEnd);
+}
+
+std::vector<PointId> QuadIndex::getPoints(
+        double xMin,
+        double yMin,
+        double xMax,
+        double yMax,
+        std::size_t depthBegin,
+        std::size_t depthEnd) const
+{
+    return m_qImpl->getPoints(
+            xMin,
+            yMin,
+            xMax,
+            yMax,
+            depthBegin,
+            depthEnd);
+}
+
+} // namespace pdal
+
diff --git a/src/Reader.cpp b/src/Reader.cpp
new file mode 100644
index 0000000..f4dd957
--- /dev/null
+++ b/src/Reader.cpp
@@ -0,0 +1,65 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/Reader.hpp>
+#include <pdal/PipelineWriter.hpp>
+
+namespace pdal
+{
+
+void Reader::readerProcessOptions(const Options& options)
+{
+    if (options.hasOption("filename"))
+        m_filename = options.getValueOrThrow<std::string>("filename");
+    if (options.hasOption("count"))
+        m_count = options.getValueOrThrow<point_count_t>("count");
+}
+
+
+boost::property_tree::ptree Reader::serializePipeline() const
+{
+    boost::property_tree::ptree tree;
+
+    tree.add("<xmlattr>.type", getName());
+
+    PipelineWriter::write_option_ptree(tree, getOptions());
+    PipelineWriter::writeMetadata(tree, m_metadata);
+
+    boost::property_tree::ptree root;
+    root.add_child("Reader", tree);
+
+    return root;
+}
+
+} // namespace pdal
diff --git a/src/SpatialReference.cpp b/src/SpatialReference.cpp
new file mode 100644
index 0000000..05c3f67
--- /dev/null
+++ b/src/SpatialReference.cpp
@@ -0,0 +1,411 @@
+/******************************************************************************
+ * Copyright (c) 2009, Howard Butler
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <pdal/SpatialReference.hpp>
+#include <pdal/PDALUtils.hpp>
+
+// gdal
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wfloat-equal"
+#endif
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored "-Wfloat-equal"
+#endif
+#include <ogr_spatialref.h>
+#ifdef PDAL_COMPILER_GCC
+#  pragma GCC diagnostic pop
+#endif
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+#include <cpl_conv.h>
+
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+SpatialReference::SpatialReference(const std::string& s)
+{
+    setFromUserInput(s);
+}
+
+
+bool SpatialReference::empty() const
+{
+    return getWKT().empty();
+}
+
+
+std::string SpatialReference::getWKT(WKTModeFlag mode_flag) const
+{
+    return getWKT(mode_flag, false);
+}
+
+
+/// Fetch the SRS as WKT
+std::string SpatialReference::getWKT(WKTModeFlag mode_flag , bool pretty) const
+{
+    std::string result_wkt = m_wkt;
+
+    if ((mode_flag == eHorizontalOnly
+            && strstr(result_wkt.c_str(),"COMPD_CS") != NULL)
+            || pretty)
+    {
+        OGRSpatialReference* poSRS =
+            (OGRSpatialReference*)OSRNewSpatialReference(result_wkt.c_str());
+        char *pszWKT = NULL;
+
+        if (mode_flag == eHorizontalOnly)
+            poSRS->StripVertical();
+        if (pretty)
+            poSRS->exportToPrettyWkt(&pszWKT, FALSE);
+        else
+            poSRS->exportToWkt(&pszWKT);
+
+        OSRDestroySpatialReference(poSRS);
+
+        result_wkt = pszWKT;
+        CPLFree(pszWKT);
+    }
+
+    return result_wkt;
+}
+
+
+void SpatialReference::setFromUserInput(std::string const& v)
+{
+    char* poWKT = 0;
+    const char* input = v.c_str();
+
+    OGRSpatialReference srs(NULL);
+    OGRErr err = srs.SetFromUserInput(const_cast<char *>(input));
+    if (err != OGRERR_NONE)
+    {
+
+        std::ostringstream oss;
+        oss << "Could not import coordinate system '" << input << "'";
+        oss << " message '" << CPLGetLastErrorMsg() << "'";
+        throw pdal_error(oss.str());
+    }
+
+    srs.exportToWkt(&poWKT);
+    std::string tmp(poWKT);
+    CPLFree(poWKT);
+    setWKT(tmp);
+}
+
+
+std::string SpatialReference::getProj4() const
+{
+    std::string tmp;
+
+    std::string wkt = getWKT(eCompoundOK);
+    const char* poWKT = wkt.c_str();
+
+    OGRSpatialReference srs(NULL);
+    if (OGRERR_NONE == srs.importFromWkt(const_cast<char **>(&poWKT)))
+    {
+        char* proj4 = 0;
+        srs.exportToProj4(&proj4);
+        tmp = proj4;
+        CPLFree(proj4);
+
+        Utils::trim(tmp);
+    }
+
+    return tmp;
+}
+
+std::string SpatialReference::getVertical() const
+{
+    std::string tmp("");
+
+    OGRSpatialReference* poSRS =
+        (OGRSpatialReference*)OSRNewSpatialReference(m_wkt.c_str());
+    char *pszWKT = NULL;
+
+    OGR_SRSNode* node = poSRS->GetAttrNode("VERT_CS");
+    if (node && poSRS)
+    {
+        node->exportToWkt(&pszWKT);
+        tmp = pszWKT;
+        CPLFree(pszWKT);
+        OSRDestroySpatialReference(poSRS);
+    }
+
+    return tmp;
+}
+
+std::string SpatialReference::getHorizontal() const
+{
+    std::string tmp("");
+
+    OGRSpatialReference* poSRS =
+        (OGRSpatialReference*)OSRNewSpatialReference(m_wkt.c_str());
+    char *pszWKT = NULL;
+
+    if (poSRS)
+    {
+        poSRS->StripVertical();
+
+        poSRS->exportToWkt(&pszWKT);
+        tmp = pszWKT;
+        CPLFree(pszWKT);
+        OSRDestroySpatialReference(poSRS);
+    }
+
+    return tmp;
+}
+
+void SpatialReference::setProj4(std::string const& v)
+{
+    char* poWKT = 0;
+    const char* poProj4 = v.c_str();
+
+    OGRSpatialReference srs(NULL);
+    if (OGRERR_NONE != srs.importFromProj4(const_cast<char *>(poProj4)))
+    {
+        throw std::invalid_argument("could not import proj4 into OSRSpatialReference SetProj4");
+    }
+
+    srs.exportToWkt(&poWKT);
+    m_wkt = poWKT;
+    CPLFree(poWKT);
+}
+
+
+bool SpatialReference::equals(const SpatialReference& input) const
+{
+    OGRSpatialReferenceH current =
+        OSRNewSpatialReference(getWKT(eCompoundOK, false).c_str());
+    OGRSpatialReferenceH other =
+        OSRNewSpatialReference(input.getWKT(eCompoundOK, false).c_str());
+
+    int output = OSRIsSame(current, other);
+    OSRDestroySpatialReference(current);
+    OSRDestroySpatialReference(other);
+
+    return (output == 1);
+}
+
+
+bool SpatialReference::operator==(const SpatialReference& input) const
+{
+    return this->equals(input);
+}
+
+
+bool SpatialReference::operator!=(const SpatialReference& input) const
+{
+    return !(this->equals(input));
+}
+
+
+const std::string& SpatialReference::getName() const
+{
+    static std::string name("pdal.spatialreference");
+    return name;
+}
+
+
+bool SpatialReference::isGeographic() const
+{
+    OGRSpatialReferenceH current =
+        OSRNewSpatialReference(getWKT(eCompoundOK, false).c_str());
+    bool output = OSRIsGeographic(current);
+    OSRDestroySpatialReference(current);
+    return output;
+}
+
+
+int SpatialReference::calculateZone(double lon, double lat)
+{
+    // Force longitude [-180, 180)
+    lon = fmod(lon, 360.0);
+    if (lon < -180.0)
+        lon += 360.0;
+    else if (lon >= 180.0)
+        lon -= 360.0;
+
+    int zone = 0;
+
+    // Special Norway processing.
+    if (lat >= 56.0 && lat < 64.0 && lon >= 3.0 && lon < 12.0 )
+        zone = 32;
+    // Special Svalbard processing.
+    else if (lat >= 72.0 && lat < 84.0) 
+    {
+        if (lon >= 0.0  && lon < 9.0)
+            zone = 31;
+        else if (lon >= 9.0  && lon < 21.0)
+            zone = 33;
+        else if (lon >= 21.0  && lon < 33.0)
+            zone = 35;
+        else if (lon >= 33.0  && lon < 42.0)
+            zone = 37;
+    }
+    // Everywhere else.
+    else
+    {
+        zone = floor((lon + 180.0) / 6) + 1;
+        if (lat < 0)
+            zone = -zone;
+    }
+
+    return zone;
+}
+
+
+int SpatialReference::computeUTMZone(const BOX3D& box) const
+{
+    // Nothing we can do if we're an empty SRS
+    if (empty())
+        return 0;
+
+    OGRSpatialReferenceH current =
+        OSRNewSpatialReference(getWKT(eHorizontalOnly, false).c_str());
+    if (! current)
+        throw std::invalid_argument("Could not fetch current SRS");
+
+    OGRSpatialReferenceH wgs84 = OSRNewSpatialReference(0);
+
+    if (OSRSetFromUserInput(wgs84, "EPSG:4326") != OGRERR_NONE)
+    {
+        OSRDestroySpatialReference(current);
+        OSRDestroySpatialReference(wgs84);
+        std::ostringstream msg;
+        msg << "Could not import GDAL input spatial reference for WGS84";
+        throw std::runtime_error(msg.str());
+    }
+
+    void* transform = OCTNewCoordinateTransformation(current, wgs84);
+
+    if (! transform)
+    {
+        OSRDestroySpatialReference(current);
+        OSRDestroySpatialReference(wgs84);
+        throw std::invalid_argument("could not comput transform from "
+            "coordinate system to WGS84");
+    }
+
+    double minx(0.0), miny(0.0), minz(0.0);
+    double maxx(0.0), maxy(0.0), maxz(0.0);
+
+    // OCTTransform modifies values in-place
+    minx = box.minx; miny = box.miny; minz = box.minz;
+    maxx = box.maxx; maxy = box.maxy; maxz = box.maxz;
+
+    int ret = OCTTransform(transform, 1, &minx, &miny, &minz);
+    if (ret == 0)
+    {
+        OCTDestroyCoordinateTransformation(transform);
+        OSRDestroySpatialReference(current);
+        OSRDestroySpatialReference(wgs84);
+        std::ostringstream msg;
+        msg << "Could not project minimum point for computeUTMZone::" <<
+            CPLGetLastErrorMsg() << ret;
+        throw pdal_error(msg.str());
+    }
+
+    ret = OCTTransform(transform, 1, &maxx, &maxy, &maxz);
+    if (ret == 0)
+    {
+        OCTDestroyCoordinateTransformation(transform);
+        OSRDestroySpatialReference(current);
+        OSRDestroySpatialReference(wgs84);
+        std::ostringstream msg;
+        msg << "Could not project maximum point for computeUTMZone::" <<
+            CPLGetLastErrorMsg() << ret;
+        throw pdal_error(msg.str());
+    }
+
+    int min_zone(0);
+    int max_zone(0);
+    min_zone = calculateZone(minx, miny);
+    std::cerr << "Min X/Y/zone = " << minx << "/" << miny << "/" << min_zone << "!\n";
+    max_zone = calculateZone(maxx, maxy);
+    std::cerr << "Max X/Y/zone = " << maxx << "/" << maxy << "/" << max_zone << "!\n";
+
+    if (min_zone != max_zone)
+    {
+        OCTDestroyCoordinateTransformation(transform);
+        OSRDestroySpatialReference(current);
+        OSRDestroySpatialReference(wgs84);
+        std::ostringstream msg;
+        msg << "Minimum zone is " << min_zone <<"' and maximum zone is '" <<
+            max_zone << "'. They do not match because they cross a "
+            "zone boundary";
+        throw pdal_error(msg.str());
+    }
+
+    OCTDestroyCoordinateTransformation(transform);
+    OSRDestroySpatialReference(current);
+    OSRDestroySpatialReference(wgs84);
+
+    return min_zone;
+}
+
+
+void SpatialReference::dump() const
+{
+    std::cout << *this;
+}
+
+
+std::ostream& operator<<(std::ostream& ostr, const SpatialReference& srs)
+{
+    std::string wkt = Utils::toPTree(srs).get<std::string>("prettycompoundwkt");
+    ostr << wkt;
+    return ostr;
+}
+
+
+std::istream& operator>>(std::istream& istr, SpatialReference& srs)
+{
+    SpatialReference ref;
+
+    std::ostringstream oss;
+    oss << istr.rdbuf();
+
+    std::string wkt = oss.str();
+    ref.setFromUserInput(wkt.c_str());
+
+    srs = ref;
+    return istr;
+}
+
+} // namespace pdal
diff --git a/src/Stage.cpp b/src/Stage.cpp
new file mode 100644
index 0000000..fc190bc
--- /dev/null
+++ b/src/Stage.cpp
@@ -0,0 +1,254 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/GlobalEnvironment.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/SpatialReference.hpp>
+#include <pdal/UserCallback.hpp>
+
+#include "StageRunner.hpp"
+
+#include <memory>
+
+namespace pdal
+{
+
+
+Stage::Stage()
+  : m_callback(new UserCallback), m_progressFd(-1)
+{
+    Construct();
+}
+
+
+/// Only add options if an option with the same name doesn't already exist.
+///
+/// \param[in] ops  Options to add.
+///
+void Stage::addConditionalOptions(const Options& opts)
+{
+    for (const auto& o : opts.getOptions())
+        if (!m_options.hasOption(o.getName()))
+            m_options.add(o);
+}
+
+
+void Stage::Construct()
+{
+    m_debug = false;
+    m_verbose = 0;
+}
+
+
+void Stage::prepare(PointTableRef table)
+{
+    for (size_t i = 0; i < m_inputs.size(); ++i)
+    {
+        Stage *prev = m_inputs[i];
+        prev->prepare(table);
+    }
+    l_processOptions(m_options);
+    processOptions(m_options);
+    l_initialize(table);
+    initialize();
+    addDimensions(table.layout());
+    prepared(table);
+}
+
+
+PointViewSet Stage::execute(PointTableRef table)
+{
+    table.layout()->finalize();
+
+    PointViewSet views;
+    if (m_inputs.empty())
+    {
+        views.insert(PointViewPtr(new PointView(table)));
+    }
+    else
+    {
+        for (size_t i = 0; i < m_inputs.size(); ++i)
+        {
+            Stage *prev = m_inputs[i];
+            PointViewSet temp = prev->execute(table);
+            views.insert(temp.begin(), temp.end());
+        }
+    }
+
+    PointViewSet outViews;
+    std::vector<StageRunnerPtr> runners;
+
+    ready(table);
+    for (auto const& it : views)
+    {
+        StageRunnerPtr runner(new StageRunner(this, it));
+        runners.push_back(runner);
+        runner->run();
+    }
+    for (auto const& it : runners)
+    {
+        StageRunnerPtr runner(it);
+        PointViewSet temp = runner->wait();
+        outViews.insert(temp.begin(), temp.end());
+    }
+    l_done(table);
+    done(table);
+    return outViews;
+}
+
+
+void Stage::l_initialize(PointTableRef table)
+{
+    m_metadata = table.metadata().add(getName());
+}
+
+
+void Stage::l_processOptions(const Options& options)
+{
+    m_debug = options.getValueOrDefault<bool>("debug", false);
+    m_verbose = options.getValueOrDefault<uint32_t>("verbose", 0);
+    if (m_debug && !m_verbose)
+        m_verbose = 1;
+    if (m_debug && !m_verbose)
+        m_verbose = 1;
+
+    if (m_inputs.empty())
+    {
+        std::string logname =
+            options.getValueOrDefault<std::string>("log", "stdlog");
+        m_log = std::shared_ptr<pdal::Log>(new Log(getName(), logname));
+    }
+    else
+    {
+        if (options.hasOption("log"))
+        {
+            std::string logname = options.getValueOrThrow<std::string>("log");
+            m_log.reset(new Log(getName(), logname));
+        }
+        else
+        {
+            // We know we're not empty at this point
+            std::ostream* v = m_inputs[0]->log()->getLogStream();
+            m_log.reset(new Log(getName(), v));
+        }
+    }
+    m_log->setLevel((LogLevel::Enum)m_verbose);
+
+    // If the user gave us an SRS via options, take that.
+    try
+    {
+        m_spatialReference = options.
+            getValueOrThrow<pdal::SpatialReference>("spatialreference");
+    }
+    catch (pdal_error const&)
+    {
+        // If one wasn't set on the options, we'll ignore at this
+        // point.  Maybe another stage might forward/set it later.
+    }
+
+    // Process reader-specific options.
+    readerProcessOptions(options);
+    // Process writer-specific options.
+    writerProcessOptions(options);
+}
+
+
+void Stage::l_done(PointTableRef table)
+{
+    if (!m_spatialReference.empty())
+        table.setSpatialRef(m_spatialReference);
+}
+
+const SpatialReference& Stage::getSpatialReference() const
+{
+    return m_spatialReference;
+}
+
+
+void Stage::setSpatialReference(const SpatialReference& spatialRef)
+{
+    setSpatialReference(m_metadata, spatialRef);
+}
+
+void Stage::setSpatialReference(MetadataNode& m,
+    const SpatialReference& spatialRef)
+{
+    m_spatialReference = spatialRef;
+
+    auto pred = [](MetadataNode m){ return m.name() == "spatialreference"; };
+
+    MetadataNode spatialNode = m.findChild(pred);
+    if (spatialNode.empty())
+    {
+        m.add("spatialreference",
+           spatialRef.getWKT(SpatialReference::eHorizontalOnly, false),
+           "SRS of this stage");
+        m.add("comp_spatialreference",
+            spatialRef.getWKT(SpatialReference::eCompoundOK, false),
+            "SRS of this stage");
+    }
+}
+
+std::vector<Stage *> Stage::findStage(std::string name)
+{
+    std::vector<Stage *> output;
+
+    if (boost::iequals(getName(), name))
+        output.push_back(this);
+
+    for (auto const& stage : m_inputs)
+    {
+        if (boost::iequals(stage->getName(), name))
+            output.push_back(stage);
+        if (stage->getInputs().size())
+        {
+            auto hits = stage->findStage(name);
+            if (hits.size())
+                output.insert(output.end(), hits.begin(), hits.end());
+        }
+    }
+
+    return output;
+}
+
+std::ostream& operator<<(std::ostream& ostr, const Stage& stage)
+{
+    ostr << "  Name: " << stage.getName() << std::endl;
+    ostr << "  Spatial Reference:" << std::endl;
+    ostr << "    WKT: " << stage.getSpatialReference().getWKT() << std::endl;
+
+    return ostr;
+}
+
+} // namespace pdal
diff --git a/src/StageFactory.cpp b/src/StageFactory.cpp
new file mode 100644
index 0000000..59ac097
--- /dev/null
+++ b/src/StageFactory.cpp
@@ -0,0 +1,270 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/StageFactory.hpp>
+#include <pdal/PluginManager.hpp>
+
+// filters
+#include <chipper/ChipperFilter.hpp>
+#include <colorization/ColorizationFilter.hpp>
+#include <crop/CropFilter.hpp>
+#include <decimation/DecimationFilter.hpp>
+#include <ferry/FerryFilter.hpp>
+#include <merge/MergeFilter.hpp>
+#include <mortonorder/MortonOrderFilter.hpp>
+#include <range/RangeFilter.hpp>
+#include <reprojection/ReprojectionFilter.hpp>
+#include <sort/SortFilter.hpp>
+#include <splitter/SplitterFilter.hpp>
+#include <stats/StatsFilter.hpp>
+#include <transformation/TransformationFilter.hpp>
+
+// readers
+#include <bpf/BpfReader.hpp>
+#include <faux/FauxReader.hpp>
+#include <las/LasReader.hpp>
+#include <optech/OptechReader.hpp>
+#include <pdal/BufferReader.hpp>
+#include <ply/PlyReader.hpp>
+#include <qfit/QfitReader.hpp>
+#include <sbet/SbetReader.hpp>
+#include <terrasolid/TerrasolidReader.hpp>
+
+// writers
+#include <bpf/BpfWriter.hpp>
+#include <las/LasWriter.hpp>
+#include <ply/PlyWriter.hpp>
+#include <sbet/SbetWriter.hpp>
+#include <derivative/DerivativeWriter.hpp>
+#include <text/TextWriter.hpp>
+#include <null/NullWriter.hpp>
+
+#include <boost/filesystem.hpp>
+
+#include <sstream>
+#include <string>
+#include <stdio.h> // for funcptr
+
+namespace pdal
+{
+
+std::string StageFactory::inferReaderDriver(const std::string& filename)
+{
+    // filename may actually be a greyhound uri + pipelineId
+    std::string http = filename.substr(0, 4);
+    if (Utils::iequals(http, "http"))
+        return "readers.greyhound";
+
+    std::string ext = boost::filesystem::extension(filename);
+    std::map<std::string, std::string> drivers;
+    drivers["bin"] = "readers.terrasolid";
+    drivers["bpf"] = "readers.bpf";
+    drivers["cpd"] = "readers.optech";
+    drivers["greyhound"] = "readers.greyhound";
+    drivers["icebridge"] = "readers.icebridge";
+    drivers["las"] = "readers.las";
+    drivers["laz"] = "readers.las";
+    drivers["nitf"] = "readers.nitf";
+    drivers["nsf"] = "readers.nitf";
+    drivers["ntf"] = "readers.nitf";
+    drivers["pcd"] = "readers.pcd";
+    drivers["ply"] = "readers.ply";
+    drivers["qi"] = "readers.qfit";
+    drivers["rxp"] = "readers.rxp";
+    drivers["sbet"] = "readers.sbet";
+    drivers["sqlite"] = "readers.sqlite";
+    drivers["sid"] = "readers.mrsid";
+
+    if (ext == "") return "";
+    ext = ext.substr(1, ext.length()-1);
+    if (ext == "") return "";
+
+    ext = Utils::tolower(ext);
+    std::string driver = drivers[ext];
+    return driver; // will be "" if not found
+}
+
+
+std::string StageFactory::inferWriterDriver(const std::string& filename)
+{
+    std::string ext = Utils::tolower(boost::filesystem::extension(filename));
+
+    std::map<std::string, std::string> drivers;
+    drivers["bpf"] = "writers.bpf";
+    drivers["csv"] = "writers.text";
+    drivers["json"] = "writers.text";
+    drivers["las"] = "writers.las";
+    drivers["laz"] = "writers.las";
+    drivers["mat"] = "writers.matlab";
+    drivers["ntf"] = "writers.nitf";
+    drivers["pcd"] = "writers.pcd";
+    drivers["pclviz"] = "writers.pclvisualizer";
+    drivers["ply"] = "writers.ply";
+    drivers["sbet"] = "writers.sbet";
+    drivers["derivative"] = "writers.derivative";
+    drivers["sqlite"] = "writers.sqlite";
+    drivers["txt"] = "writers.text";
+    drivers["xyz"] = "writers.text";
+
+    if (Utils::iequals(filename, "STDOUT"))
+        return drivers["txt"];
+
+    if (ext == "")
+        return drivers["txt"];
+    ext = ext.substr(1, ext.length()-1);
+    if (ext == "")
+        return drivers["txt"];
+
+    ext = Utils::tolower(ext);
+    std::string driver = drivers[ext];
+    return driver; // will be "" if not found
+}
+
+
+pdal::Options StageFactory::inferWriterOptionsChanges(
+    const std::string& filename)
+{
+    std::string ext = boost::filesystem::extension(filename);
+    ext = Utils::tolower(ext);
+    Options options;
+
+    if (Utils::iequals(ext,".laz"))
+        options.add("compression", true);
+
+    PluginManager & pm = PluginManager::getInstance();
+    if (Utils::iequals(ext, ".pcd") && pm.createObject("writers.pcd"))
+    {
+        options.add("format","PCD");
+    }
+
+    options.add<std::string>("filename", filename);
+    return options;
+}
+
+StageFactory::StageFactory(bool no_plugins)
+{
+    PluginManager & pm = PluginManager::getInstance();
+    if (!no_plugins)
+    {
+        pm.loadAll(PF_PluginType_Filter);
+        pm.loadAll(PF_PluginType_Reader);
+        pm.loadAll(PF_PluginType_Writer);
+    }
+
+    // filters
+    PluginManager::initializePlugin(ChipperFilter_InitPlugin);
+    PluginManager::initializePlugin(ColorizationFilter_InitPlugin);
+    PluginManager::initializePlugin(CropFilter_InitPlugin);
+    PluginManager::initializePlugin(DecimationFilter_InitPlugin);
+    PluginManager::initializePlugin(FerryFilter_InitPlugin);
+    PluginManager::initializePlugin(MergeFilter_InitPlugin);
+    PluginManager::initializePlugin(MortonOrderFilter_InitPlugin);
+    PluginManager::initializePlugin(RangeFilter_InitPlugin);
+    PluginManager::initializePlugin(ReprojectionFilter_InitPlugin);
+    PluginManager::initializePlugin(SortFilter_InitPlugin);
+    PluginManager::initializePlugin(SplitterFilter_InitPlugin);
+    PluginManager::initializePlugin(StatsFilter_InitPlugin);
+    PluginManager::initializePlugin(TransformationFilter_InitPlugin);
+
+    // readers
+    PluginManager::initializePlugin(BpfReader_InitPlugin);
+    PluginManager::initializePlugin(FauxReader_InitPlugin);
+    PluginManager::initializePlugin(LasReader_InitPlugin);
+    PluginManager::initializePlugin(OptechReader_InitPlugin);
+    PluginManager::initializePlugin(PlyReader_InitPlugin);
+    PluginManager::initializePlugin(QfitReader_InitPlugin);
+    PluginManager::initializePlugin(SbetReader_InitPlugin);
+    PluginManager::initializePlugin(TerrasolidReader_InitPlugin);
+
+    // writers
+    PluginManager::initializePlugin(BpfWriter_InitPlugin);
+    PluginManager::initializePlugin(LasWriter_InitPlugin);
+    PluginManager::initializePlugin(PlyWriter_InitPlugin);
+    PluginManager::initializePlugin(SbetWriter_InitPlugin);
+    PluginManager::initializePlugin(DerivativeWriter_InitPlugin);
+    PluginManager::initializePlugin(TextWriter_InitPlugin);
+    PluginManager::initializePlugin(NullWriter_InitPlugin);
+}
+
+/// Create a stage and return a pointer to the created stage.  Caller takes
+/// ownership unless the ownStage argument is true.
+///
+/// \param[in] stage_name  Type of stage to by created.
+/// \param[in] ownStage    Whether the factory should own the stage.
+/// \return  Pointer to created stage.
+///
+Stage *StageFactory::createStage(std::string const& stage_name,
+    bool ownStage)
+{
+    PluginManager& pm = PluginManager::getInstance();
+    Stage *s = static_cast<Stage*>(pm.createObject(stage_name));
+    if (s && ownStage)
+        m_ownedStages.push_back(std::unique_ptr<Stage>(s));
+    return s;
+}
+
+
+StringList StageFactory::getStageNames() const
+{
+    PluginManager & pm = PluginManager::getInstance();
+    PluginManager::RegistrationMap rm = pm.getRegistrationMap();
+    StringList nv;
+    for (auto r : rm)
+    {
+        if (r.second.pluginType == PF_PluginType_Filter ||
+            r.second.pluginType == PF_PluginType_Reader ||
+            r.second.pluginType == PF_PluginType_Writer)
+            nv.push_back(r.first);
+    }
+    return nv;
+}
+
+
+std::map<std::string, std::string> StageFactory::getStageMap() const
+{
+    PluginManager& pm = PluginManager::getInstance();
+    PluginManager::RegistrationMap rm = pm.getRegistrationMap();
+    std::map<std::string, std::string> sm;
+    for (auto r : rm)
+    {
+        if (r.second.pluginType == PF_PluginType_Filter ||
+            r.second.pluginType == PF_PluginType_Reader ||
+            r.second.pluginType == PF_PluginType_Writer)
+            sm.insert(std::make_pair(r.first, r.second.description));
+    }
+    return sm;
+}
+
+} // namespace pdal
+
diff --git a/src/StageRunner.hpp b/src/StageRunner.hpp
new file mode 100644
index 0000000..fedf18c
--- /dev/null
+++ b/src/StageRunner.hpp
@@ -0,0 +1,66 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+#include <memory>
+
+#include <pdal/Stage.hpp>
+
+namespace pdal
+{
+
+class StageRunner
+{
+public:
+    StageRunner(Stage *s, PointViewPtr view) :
+        m_stage(s), m_view(view)
+    {}
+
+    // For now this is all synchronous
+    void run()
+        { m_viewSet = m_stage->run(m_view); }
+
+    PointViewSet wait()
+        { return m_viewSet; }
+
+private:
+    Stage *m_stage;
+    PointViewPtr m_view;
+    PointViewSet m_viewSet;
+};
+typedef std::shared_ptr<StageRunner> StageRunnerPtr;
+
+} // namespace pdal
+
diff --git a/src/Writer.cpp b/src/Writer.cpp
new file mode 100644
index 0000000..6889de4
--- /dev/null
+++ b/src/Writer.cpp
@@ -0,0 +1,160 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/Writer.hpp>
+#include <pdal/Stage.hpp>
+#include <pdal/UserCallback.hpp>
+
+#include <pdal/PipelineWriter.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+namespace pdal
+{
+
+void Writer::writerProcessOptions(const Options& options)
+{
+    auto setOffset = [options](XForm& xform, const std::string& opName)
+    {
+        if (options.hasOption(opName))
+            xform.setOffset(options.getValueOrThrow<std::string>(opName));
+    };
+
+    auto setScale = [options](XForm& xform, const std::string& opName)
+    {
+        if (options.hasOption(opName))
+            xform.setScale(options.getValueOrThrow<std::string>(opName));
+    };
+
+    setOffset(m_xXform, "offset_x");
+    setOffset(m_yXform, "offset_y");
+    setOffset(m_zXform, "offset_z");
+
+    setScale(m_xXform, "scale_x");
+    setScale(m_yXform, "scale_y");
+    setScale(m_zXform, "scale_z");
+
+    if (options.hasOption("filename"))
+        m_filename = options.getValueOrThrow<std::string>("filename");
+    m_outputDims = options.getValueOrDefault<StringList>("output_dims");
+}
+
+
+void Writer::setAutoXForm(const PointViewPtr view)
+{
+   double xmin = (std::numeric_limits<double>::max)();
+   double xmax = (std::numeric_limits<double>::lowest)();
+   bool xmod = m_xXform.m_autoOffset || m_xXform.m_autoScale;
+
+   double ymin = (std::numeric_limits<double>::max)();
+   double ymax = (std::numeric_limits<double>::lowest)();
+   bool ymod = m_yXform.m_autoOffset || m_yXform.m_autoScale;
+
+   double zmin = (std::numeric_limits<double>::max)();
+   double zmax = (std::numeric_limits<double>::lowest)();
+   bool zmod = m_zXform.m_autoOffset || m_zXform.m_autoScale;
+
+   if (!xmod && !ymod && !zmod)
+       return;
+   if (view->empty())
+        return;
+
+    for (PointId idx = 0; idx < view->size(); idx++)
+    {
+        if (xmod)
+        {
+            double x = view->getFieldAs<double>(Dimension::Id::X, idx);
+            xmin = std::min(x, xmin);
+            xmax = std::max(x, xmax);
+        }
+        if (ymod)
+        {
+            double y = view->getFieldAs<double>(Dimension::Id::Y, idx);
+            ymin = std::min(y, ymin);
+            ymax = std::max(y, ymax);
+        }
+        if (zmod)
+        {
+            double z = view->getFieldAs<double>(Dimension::Id::Z, idx);
+            zmin = std::min(z, zmin);
+            zmax = std::max(z, zmax);
+        }
+    }
+
+    if (m_xXform.m_autoOffset)
+    {
+        m_xXform.m_offset = xmin;
+        xmax -= xmin;
+    }
+    if (m_yXform.m_autoOffset)
+    {
+        m_yXform.m_offset = ymin;
+        ymax -= ymin;
+    }
+    if (m_zXform.m_autoOffset)
+    {
+        m_zXform.m_offset = zmin;
+        zmax -= zmin;
+    }
+    if (m_xXform.m_autoScale)
+        m_xXform.m_scale = xmax / (std::numeric_limits<int>::max)();
+    if (m_yXform.m_autoScale)
+        m_yXform.m_scale = ymax / (std::numeric_limits<int>::max)();
+    if (m_zXform.m_autoScale)
+        m_zXform.m_scale = zmax / (std::numeric_limits<int>::max)();
+}
+
+
+boost::property_tree::ptree Writer::serializePipeline() const
+{
+    boost::property_tree::ptree tree;
+
+    tree.add("<xmlattr>.type", getName());
+
+    PipelineWriter::write_option_ptree(tree, getOptions());
+
+    const Stage& stage = *getInputs()[0];
+    boost::property_tree::ptree subtree = stage.serializePipeline();
+
+    tree.add_child(subtree.begin()->first, subtree.begin()->second);
+
+    boost::property_tree::ptree root;
+    root.add_child("Writer", tree);
+
+    return root;
+}
+
+} // namespace pdal
diff --git a/src/XMLSchema.cpp b/src/XMLSchema.cpp
new file mode 100644
index 0000000..7e53099
--- /dev/null
+++ b/src/XMLSchema.cpp
@@ -0,0 +1,631 @@
+/******************************************************************************
+* Copyright (c) 2011, Howard Butler, hobu.inc at gmail.com *
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/XMLSchema.hpp>
+#include <pdal/PipelineWriter.hpp>
+#include <pdal/PDALUtils.hpp>
+
+#include <sstream>
+#include <iostream>
+#include <iostream>
+#include <list>
+#include <cstdlib>
+#include <map>
+#include <algorithm>
+
+#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/erase.hpp>
+#include <boost/property_tree/xml_parser.hpp>
+#include <boost/uuid/string_generator.hpp>
+#include <boost/uuid/uuid_generators.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+#include <string.h>
+#include <stdlib.h>
+
+namespace
+{
+
+/**
+void print_element_names(xmlNode * a_node)
+{
+
+    xmlNode *cur_node = NULL;
+
+    for (cur_node = a_node; cur_node; cur_node = cur_node->next)
+    {
+        if (cur_node->type == XML_ELEMENT_NODE)
+        {
+            printf("node type: Element, name: %s\n", cur_node->name);
+        }
+        print_element_names(cur_node->children);
+    }
+}
+**/
+
+} // anonymous namespace
+
+namespace pdal
+{
+
+void OCISchemaStructuredErrorHandler
+(void * /*userData*/, xmlErrorPtr error)
+{
+    std::ostringstream oss;
+
+    oss << "XML error: '" << error->message <<"' ";
+
+    if (error->str1)
+        oss << " extra info1: '" << error->str1 << "' ";
+    if (error->str2)
+        oss << " extra info2: '" << error->str2 << "' ";
+    if (error->str3)
+        oss << " extra info3: '" << error->str3 << "' ";
+    oss << "on line " << error->line;
+
+    if (error->ctxt)
+    {
+        xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) error->ctxt;
+        xmlParserInputPtr input = ctxt->input;
+
+        xmlParserPrintFileContext(input);
+    }
+    std::cerr << oss.str() << std::endl;
+}
+
+void OCISchemaParserStructuredErrorHandler
+(void * /*userData*/, xmlErrorPtr error)
+{
+    std::cerr << "Schema parsing error: '" << error->message << "' " <<
+        "on line " << error->line << std::endl;
+}
+
+void OCISchemaValidationStructuredErrorHandler
+(void * /*userData*/, xmlErrorPtr error)
+{
+    std::cerr << "Schema validation error: '" << error->message << "' " <<
+        "on line " << error->line << std::endl;
+}
+
+void OCISchemaValidityError
+(void * /*ctx*/, const char* message, ...)
+{
+    const int ERROR_MESSAGE_SIZE = 256;
+    char error[ERROR_MESSAGE_SIZE];
+    va_list arg_ptr;
+
+    va_start(arg_ptr, message);
+    vsnprintf(error, ERROR_MESSAGE_SIZE, message, arg_ptr);
+    va_end(arg_ptr);
+
+    std::cerr << "Schema validity error: '" << error << "' " << std::endl;
+}
+
+void OCISchemaValidityDebug
+(void * /*ctx*/, const char* message, ...)
+{
+    const int ERROR_MESSAGE_SIZE = 256;
+    char error[ERROR_MESSAGE_SIZE];
+    va_list arg_ptr;
+
+    va_start(arg_ptr, message);
+    vsnprintf(error, ERROR_MESSAGE_SIZE, message, arg_ptr);
+    va_end(arg_ptr);
+
+    std::cout << "Schema validity debug: '" << error << "' " << "\n";
+}
+
+
+void OCISchemaGenericErrorHandler
+(void * /*ctx*/, const char* message, ...)
+{
+    const int ERROR_MESSAGE_SIZE = 256;
+    char error[ERROR_MESSAGE_SIZE];
+    va_list arg_ptr;
+
+    va_start(arg_ptr, message);
+    vsnprintf(error, ERROR_MESSAGE_SIZE, message, arg_ptr);
+    va_end(arg_ptr);
+
+    std::ostringstream oss;
+
+    std::cerr << "Generic error: '" << error << "'" << std::endl;
+}
+
+XMLSchema::XMLSchema(std::string xml, std::string xsd,
+    Orientation::Enum orientation) : m_orientation(orientation)
+{
+    xmlDocPtr doc = init(xml, xsd);
+    if (doc)
+    {
+        load(doc);
+        xmlFreeDoc(doc);
+    }
+}
+
+
+XMLSchema::XMLSchema(const XMLDimList& dims, MetadataNode m,
+    Orientation::Enum orientation) : m_orientation(orientation), m_dims(dims),
+    m_metadata(m)
+{}
+
+
+XMLSchema::XMLSchema(const PointLayoutPtr& layout, MetadataNode m,
+    Orientation::Enum orientation) : m_orientation(orientation), m_metadata(m)
+{
+    DimTypeList dimTypes = layout->dimTypes();
+    for (DimType& d : dimTypes)
+        m_dims.push_back(XMLDim(d, layout->dimName(d.m_id)));
+}
+
+
+std::string XMLSchema::xml() const
+{
+    xmlBuffer *b = xmlBufferCreate();
+    xmlTextWriterPtr w = xmlNewTextWriterMemory(b, 0);
+
+    xmlTextWriterSetIndent(w, 1);
+    xmlTextWriterStartDocument(w, NULL, "utf-8", NULL);
+    xmlTextWriterStartElementNS(w, (const xmlChar*)"pc",
+        (const xmlChar*)"PointCloudSchema", NULL);
+    xmlTextWriterWriteAttributeNS(w, (const xmlChar*) "xmlns",
+        (const xmlChar*)"pc", NULL,
+        (const xmlChar*)"http://pointcloud.org/schemas/PC/");
+    xmlTextWriterWriteAttributeNS(w, (const xmlChar*)"xmlns",
+        (const xmlChar*)"xsi", NULL,
+        (const xmlChar*)"http://www.w3.org/2001/XMLSchema-instance");
+
+    writeXml(w);
+
+    xmlTextWriterEndElement(w);
+    xmlTextWriterEndDocument(w);
+
+    std::string output((const char *)b->content, b->use);
+    xmlFreeTextWriter(w);
+    xmlBufferFree(b);
+
+    return output;
+}
+
+
+DimTypeList XMLSchema::dimTypes() const
+{
+    DimTypeList dimTypes;
+
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        dimTypes.push_back(di->m_dimType);
+    return dimTypes;
+}
+
+
+xmlDocPtr XMLSchema::init(const std::string& xml, const std::string& xsd)
+{
+    xmlParserOption parserOption(XML_PARSE_NONET);
+
+    LIBXML_TEST_VERSION
+
+    xmlSetGenericErrorFunc(m_global_context,
+        (xmlGenericErrorFunc)&OCISchemaGenericErrorHandler);
+    xmlSetStructuredErrorFunc(m_global_context,
+        (xmlStructuredErrorFunc)&OCISchemaStructuredErrorHandler);
+
+    xmlDocPtr doc = xmlReadMemory(xml.c_str(), xml.size(), NULL, NULL,
+        parserOption);
+
+    if (xsd.size() && !validate(doc, xsd))
+    {
+        xmlFreeDoc(doc);
+        doc = NULL;
+        std::cerr << "Document did not validate against schema." << std::endl;
+    }
+    return doc;
+}
+
+
+bool XMLSchema::validate(xmlDocPtr doc, const std::string& xsd)
+{
+    xmlParserOption parserOption(XML_PARSE_NONET);
+
+    xmlDocPtr schemaDoc = xmlReadMemory(xsd.c_str(), xsd.size(),
+        NULL, NULL, parserOption);
+    xmlSchemaParserCtxtPtr parserCtxt = xmlSchemaNewDocParserCtxt(schemaDoc);
+    xmlSchemaSetParserStructuredErrors(parserCtxt,
+        &OCISchemaParserStructuredErrorHandler, m_global_context);
+    xmlSchemaPtr schema = xmlSchemaParse(parserCtxt);
+    xmlSchemaValidCtxtPtr validCtxt = xmlSchemaNewValidCtxt(schema);
+    xmlSchemaSetValidErrors(validCtxt, &OCISchemaValidityError,
+        &OCISchemaValidityDebug, m_global_context);
+    bool valid = (xmlSchemaValidateDoc(validCtxt, doc) == 0);
+
+    xmlFreeDoc(schemaDoc);
+    xmlSchemaFreeParserCtxt(parserCtxt);
+    xmlSchemaFree(schema);
+    xmlSchemaFreeValidCtxt(validCtxt);
+
+    return valid;
+}
+
+
+std::string XMLSchema::remapOldNames(const std::string& input)
+{
+    if (boost::iequals(input, "Unnamed field 512") ||
+            boost::iequals(input, "Chipper Point ID"))
+        return std::string("Chipper:PointID");
+
+    if (boost::iequals(input, "Unnamed field 513") ||
+            boost::iequals(input, "Chipper Block ID"))
+        return std::string("Chipper:BlockID");
+
+    return input;
+}
+
+
+bool XMLSchema::loadMetadata(xmlNode *startNode, MetadataNode& input)
+{
+//     Expect metadata in the following form
+//     We are going to skip the root element because we are
+//     expecting to be given one with our input
+//     <pc:metadata>
+//         <Metadata name="root" type="">
+//             <Metadata name="compression" type="string">lazperf</Metadata>
+//             <Metadata name="version" type="string">1.0</Metadata>
+//         </Metadata>
+//     </pc:metadata>
+
+    xmlNode *node = startNode;
+    for (node = startNode; node; node = node->next)
+    {
+        if (node->type != XML_ELEMENT_NODE)
+            continue;
+        if (boost::equals((const char*)node->name, "Metadata"))
+        {
+            const char *fieldname =
+                (const char*)xmlGetProp(node, (const xmlChar*)"name");
+            const char *etype =
+                (const char*)xmlGetProp(node, (const xmlChar*)"type");
+            const char *description =
+                (const char*)xmlGetProp(node, (const xmlChar*) "description");
+            const char *text = (const char*)xmlNodeGetContent(node);
+
+            if (!boost::iequals(fieldname, "root"))
+            {
+                if (!fieldname)
+                {
+                    std::cerr << "Unable to read metadata for node '" <<
+                        (const char*)node->name << "' no \"name\" was given";
+                    return false;
+                }
+                input.add(fieldname, text ? text : "",
+                    description ? description : "");
+            }
+        }
+        loadMetadata(node->children, input);
+    }
+    return true;
+}
+
+
+bool XMLSchema::load(xmlDocPtr doc)
+{
+    xmlNode* root = xmlDocGetRootElement(doc);
+    // print_element_names(root);
+
+    if (!boost::iequals((const char*)root->name, "PointCloudSchema"))
+    {
+        std::cerr << "First node of document was not named 'PointCloudSchema'";
+        return false;
+    }
+
+    const unsigned SENTINEL_POS = 100000;
+    unsigned missingPos = SENTINEL_POS + 1;
+
+    xmlNode* dimension = root->children;
+    pdal::Metadata metadata;
+    for (xmlNode *dimension = root->children; dimension;
+        dimension = dimension->next)
+    {
+        // Read off orientation setting
+        if (boost::equals((const char*)dimension->name, "orientation"))
+        {
+            xmlChar* n = xmlNodeListGetString(doc, dimension->children, 1);
+            if (!n)
+            {
+                std::cerr << "Unable to fetch orientation.\n";
+                return false;
+            }
+            std::string orientation = std::string((const char*)n);
+            xmlFree(n);
+
+            if (boost::iequals(orientation, "dimension"))
+                m_orientation = Orientation::DimensionMajor;
+            else
+                m_orientation = Orientation::PointMajor;
+            continue;
+        }
+
+        if (boost::equals((const char*)dimension->name, "metadata"))
+        {
+            m_metadata = MetadataNode("root");
+            if (!loadMetadata(dimension, m_metadata))
+                return false;
+            continue;
+        }
+
+        if (dimension->type != XML_ELEMENT_NODE ||
+            !boost::iequals((const char*)dimension->name, "dimension"))
+            continue;
+
+        XMLDim dim;
+        dim.m_position = SENTINEL_POS;
+        for (xmlNode *properties = dimension->children; properties;
+            properties = properties->next)
+        {
+            if (properties->type != XML_ELEMENT_NODE)
+                continue;
+
+            if (boost::iequals((const char*)properties->name, "name"))
+            {
+                xmlChar *n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch name from XML node.";
+                    return false;
+                }
+                dim.m_name = remapOldNames(std::string((const char*)n));
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "description"))
+            {
+                xmlChar* n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch description.\n";
+                    return false;
+                }
+                dim.m_description = std::string((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "interpretation"))
+            {
+                xmlChar* n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch interpretation.\n";
+                    return false;
+                }
+                dim.m_dimType.m_type = Dimension::type((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "minimum"))
+            {
+                xmlChar* n = xmlGetProp(properties, (const xmlChar*) "value");
+                if (!n)
+                {
+                    return false;
+                    std::cerr << "Unable to fetch minimum value.\n";
+                }
+                dim.m_min = std::atof((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "maximum"))
+            {
+                xmlChar* n = xmlGetProp(properties, (const xmlChar*) "value");
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch maximum value.\n";
+                    return false;
+                }
+                dim.m_max = std::atof((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "position"))
+            {
+                xmlChar* n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch position value.\n";
+                    return false;
+                }
+                dim.m_position = std::atoi((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "offset"))
+            {
+                xmlChar* n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch offset value!";
+                    return false;
+                }
+                dim.m_dimType.m_xform.m_offset = std::atof((const char*)n);
+                xmlFree(n);
+            }
+            if (boost::iequals((const char*)properties->name, "scale"))
+            {
+                xmlChar* n = xmlNodeListGetString(doc, properties->children, 1);
+                if (!n)
+                {
+                    std::cerr << "Unable to fetch scale value!";
+                    return false;
+                }
+                dim.m_dimType.m_xform.m_scale = std::atof((const char*)n);
+                xmlFree(n);
+            }
+        }
+        // If we don't have a position, set it to some value larger than all
+        // previous values.
+        if (dim.m_position == SENTINEL_POS)
+            dim.m_position = missingPos++;
+        m_dims.push_back(dim);
+    }
+    std::sort(m_dims.begin(), m_dims.end());
+
+    // Renumber dimension positions to be 1..N
+    for (unsigned pos = 0; pos < m_dims.size(); pos++)
+        m_dims[pos].m_position = pos + 1;
+
+    return true;
+}
+
+
+XMLDim& XMLSchema::xmlDim(Dimension::Id::Enum id)
+{
+    static XMLDim nullDim;
+
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        if (di->m_dimType.m_id == id)
+            return *di;
+    return nullDim;
+}
+
+
+const XMLDim& XMLSchema::xmlDim(Dimension::Id::Enum id) const
+{
+    static XMLDim nullDim;
+
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        if (di->m_dimType.m_id == id)
+            return *di;
+    return nullDim;
+}
+
+
+XMLDim& XMLSchema::xmlDim(const std::string& name)
+{
+    static XMLDim nullDim;
+
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di)
+        if (di->m_name == name)
+            return *di;
+    return nullDim;
+}
+
+
+void XMLSchema::writeXml(xmlTextWriterPtr w) const
+{
+    int pos = 0;
+    for (auto di = m_dims.begin(); di != m_dims.end(); ++di, ++pos)
+    {
+        xmlTextWriterStartElementNS(w, (const xmlChar*)"pc",
+            (const xmlChar*)"dimension", NULL);
+
+        std::ostringstream position;
+        position << (pos + 1);
+        xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+            (const xmlChar*)"position", NULL,
+            (const xmlChar*)position.str().c_str());
+
+        std::ostringstream size;
+        size << Dimension::size(di->m_dimType.m_type);
+        xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+            (const xmlChar*)"size", NULL, (const xmlChar*)size.str().c_str());
+
+        std::string description = Dimension::description(di->m_dimType.m_id);
+        if (description.size())
+            xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+                (const xmlChar*)"description", NULL,
+                (const xmlChar*)description.c_str());
+
+        XForm xform = di->m_dimType.m_xform;
+        if (xform.nonstandard())
+        {
+            std::ostringstream out;
+            out.precision(15);
+
+            out << xform.m_scale;
+            std::string scale = out.str();
+
+            out.str(std::string());
+            out << xform.m_offset;
+            std::string offset = out.str();
+
+            out << xform.m_scale;
+            xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+                (const xmlChar *)"scale", NULL,
+                (const xmlChar *)scale.data());
+            xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+                (const xmlChar *)"offset", NULL,
+                (const xmlChar *)offset.data());
+        }
+
+        std::string name = di->m_name;
+        if (name.size())
+            xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+                (const xmlChar*)"name", NULL, (const xmlChar*)name.c_str());
+
+        xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+            (const xmlChar*)"interpretation", NULL,
+            (const xmlChar*)
+                Dimension::interpretationName(di->m_dimType.m_type).c_str());
+
+        xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc",
+            (const xmlChar*)"active", NULL, (const xmlChar*)"true");
+
+        xmlTextWriterEndElement(w);
+        xmlTextWriterFlush(w);
+    }
+    std::ostringstream orientation;
+    if (m_orientation == Orientation::PointMajor)
+        orientation << "point";
+    if (m_orientation == Orientation::DimensionMajor)
+        orientation << "dimension";
+    if (!m_metadata.empty())
+    {
+        xmlTextWriterStartElementNS(w, (const xmlChar*) "pc",
+            (const xmlChar*) "metadata", NULL);
+
+        boost::property_tree::ptree output;
+        PipelineWriter::writeMetadata(output, m_metadata.children());
+        std::ostringstream oss;
+        boost::property_tree::xml_parser::write_xml(oss, output);
+        std::string xml = oss.str();
+
+        // wipe off write_xml's xml declaration
+        boost::algorithm::erase_all(xml,
+            "<?xml version=\"1.0\" encoding=\"utf-8\"?>");
+        xmlTextWriterWriteRawLen(w, (const xmlChar*) xml.c_str(), xml.size());
+        xmlTextWriterEndElement(w);
+    }
+    xmlTextWriterWriteElementNS(w, (const xmlChar*) "pc",
+        (const xmlChar*)"orientation", NULL,
+        (const xmlChar*)orientation.str().c_str());
+
+    xmlTextWriterWriteElementNS(w, (const xmlChar*)"pc", (const xmlChar*)"version", NULL,
+                                (const xmlChar*)PDAL_XML_SCHEMA_VERSION);
+
+
+    xmlTextWriterEndElement(w);
+    xmlTextWriterFlush(w);
+}
+
+} // namespace pdal
diff --git a/src/gitsha.cpp b/src/gitsha.cpp
new file mode 100644
index 0000000..ec6a8a6
--- /dev/null
+++ b/src/gitsha.cpp
@@ -0,0 +1,3 @@
+#include <pdal/gitsha.h>
+#define GIT_SHA1 "89eea705470bbb83c9109532759a012b2c802670"
+const char g_GIT_SHA1[] = GIT_SHA1;
diff --git a/src/libpdalcpp b/src/libpdalcpp
new file mode 100644
index 0000000..445c4ad
--- /dev/null
+++ b/src/libpdalcpp
@@ -0,0 +1 @@
+INPUT (-lpdal_base -lpdal_util)
diff --git a/src/pdal_config.cpp b/src/pdal_config.cpp
new file mode 100644
index 0000000..2988a0b
--- /dev/null
+++ b/src/pdal_config.cpp
@@ -0,0 +1,238 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  libLAS - http://liblas.org - A BSD library for LAS format data.
+ * Purpose:  LAS version related functions.
+ * Author:   Mateusz Loskot, mateusz at loskot.net
+ *           Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 2008, Mateusz Loskot
+ * Copyright (c) 2010, Frank Warmerdam
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <pdal/pdal_config.hpp>
+
+#include <sstream>
+#include <iomanip>
+
+#include <pdal/pdal_defines.h>
+#include <pdal/gitsha.h>
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+#include <geotiff.h>
+#endif
+
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic push
+#  pragma clang diagnostic ignored "-Wfloat-equal"
+#endif
+#include <gdal.h>
+#ifdef PDAL_COMPILER_CLANG
+#  pragma clang diagnostic pop
+#endif
+
+#ifdef PDAL_HAVE_LASZIP
+#include <laszip/laszip.hpp>
+#endif
+
+#ifdef PDAL_HAVE_GEOS
+#include <geos/version.h>
+#endif
+
+#ifdef PDAL_HAVE_HEXER
+#include <hexer/hexer.hpp>
+#endif
+
+#ifdef PDAL_HAVE_LIBXML2
+#include <libxml/xmlversion.h>
+#endif
+
+#include <pdal/util/Utils.hpp>
+
+namespace pdal
+{
+
+/// Check if GeoTIFF support has been built in to PDAL
+bool IsLibGeoTIFFEnabled()
+{
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    return true;
+#else
+    return false;
+#endif
+}
+
+/// Check if LasZip compression support has been built in to PDAL
+bool IsLasZipEnabled()
+{
+#ifdef PDAL_HAVE_LASZIP
+    return true;
+#else
+    return false;
+#endif
+}
+
+int GetVersionMajor()
+{
+    return PDAL_VERSION_MAJOR;
+}
+
+int GetVersionMinor()
+{
+    return PDAL_VERSION_MINOR;
+}
+
+int GetVersionPatch()
+{
+    return PDAL_VERSION_PATCH;
+}
+
+std::string GetVersionString()
+{
+    return std::string(PDAL_VERSION_STRING);
+}
+
+int GetVersionInteger()
+{
+    return PDAL_VERSION_INTEGER;
+}
+
+std::string GetSHA1()
+{
+	return g_GIT_SHA1;
+}
+
+
+/// Tell the user a bit about PDAL's compilation
+std::string GetFullVersionString()
+{
+    std::ostringstream os;
+
+    std::string sha = GetSHA1();
+    if (!Utils::iequals(sha, "Release"))
+        sha = sha.substr(0,6);
+
+    os << PDAL_VERSION_STRING << " (git-version: " << sha << ")";
+
+    return os.str();
+}
+
+
+std::string getPDALDebugInformation()
+{
+    Utils::screenWidth();
+    std::string headline(Utils::screenWidth(), '-');
+
+    std::ostringstream os;
+
+    os << headline << std::endl;
+    os << "PDAL debug information" << std::endl ;
+    os << headline << std::endl << std::endl;
+
+    os << "Version information" << std::endl;
+    os << headline << std::endl;
+    os << "(" << pdal::GetFullVersionString() << ")" << std::endl;
+    os << std::endl;
+
+    os << "Debug build status" << std::endl;
+    os << headline << std::endl;
+    os << PDAL_BUILD_TYPE << std::endl << std::endl;
+
+    os << "Enabled libraries" << std::endl;
+    os << headline << std::endl << std::endl;
+
+#ifdef PDAL_HAVE_GEOS
+    os << "GEOS (" << GEOS_VERSION << ") - " <<
+        "http://trac.osgeo.org/geos" << std::endl;
+#endif
+
+    os << "GDAL (" << GDALVersionInfo("RELEASE_NAME") << ") - " <<
+        "http://www.gdal.org" << std::endl;
+
+#ifdef PDAL_HAVE_HEXER
+    os << "Hexer (" << HEXER_VERSION_MAJOR << '.' << HEXER_VERSION_MINOR <<
+        '.' << HEXER_VERSION_PATCH << ") - " <<
+        "http://github.com/hobu/hexer" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_LASZIP
+    os << "LASzip (" << LASZIP_VERSION_MAJOR << "." << LASZIP_VERSION_MINOR <<
+        "." << LASZIP_VERSION_REVISION << ") - " <<
+        "http://laszip.org" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_LIBXML2
+    os << "libxml (" << LIBXML_DOTTED_VERSION << ") - " <<
+              "http://www.xmlsoft.org/" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    os << "libgeotiff (" << LIBGEOTIFF_VERSION << ") - " <<
+        "http://trac.osgeo.org/geotiff" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_MRSID
+    os << "MrSID - " << "http://www.lizardtech.com" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_NITRO
+    os << "Nitro - " << "http://github.com/hobu/nitro" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_ORACLE
+    os << "Oracle - " << "http://www.oracle.com" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_P2G
+    os << "Points2grid = " <<
+        "http://github.com/CRREL/points2grid" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_PYTHON
+    os << "Python - " << "http://www.python.org" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_SQLITE
+    os << "SQLite - " << "http://www.sqlite.org" << std::endl;
+#endif
+
+#ifdef PDAL_HAVE_POSTGRESQL
+    os << "PostgreSQL - " <<
+        "http://github.com/pramsey/pointcloud" << std::endl;
+#endif
+
+    return os.str();
+}
+
+} // namespace pdal
diff --git a/src/plang/Array.cpp b/src/plang/Array.cpp
new file mode 100644
index 0000000..a8825cd
--- /dev/null
+++ b/src/plang/Array.cpp
@@ -0,0 +1,199 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+* Copyright (c) 2015, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/plang/Array.hpp>
+#include <pdal/plang/Environment.hpp>
+
+#include <algorithm>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127) // conditional expression is constant
+#endif
+
+#include <Python.h>
+#undef toupper
+#undef tolower
+#undef isspace
+
+
+#define PY_ARRAY_UNIQUE_SYMBOL PDALARRAY_ARRAY_API
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#include <numpy/arrayobject.h>
+
+namespace pdal
+{
+namespace plang
+{
+
+Array::Array()
+    : m_py_array(0)
+{
+    auto initNumpy = []()
+    {
+#undef NUMPY_IMPORT_ARRAY_RETVAL
+#define NUMPY_IMPORT_ARRAY_RETVAL
+        import_array();
+    };
+    initNumpy();
+}
+
+
+Array::~Array()
+{
+    cleanup();
+}
+
+void Array::cleanup()
+{
+    PyObject* p = (PyObject*)(m_py_array);
+    Py_XDECREF(p);
+    m_data_array.reset();
+}
+PyObject* Array::buildNumpyDescription(PointViewPtr view) const
+{
+
+    // Build up a numpy dtype dictionary
+    //
+    // {'formats': ['f8', 'f8', 'f8', 'u2', 'u1', 'u1', 'u1', 'u1', 'u1', 'f4', 'u1', 'u2', 'f8', 'u2', 'u2', 'u2'],
+    // 'names': ['X', 'Y', 'Z', 'Intensity', 'ReturnNumber', 'NumberOfReturns',
+    // 'ScanDirectionFlag', 'EdgeOfFlightLine', 'Classification',
+    // 'ScanAngleRank', 'UserData', 'PointSourceId', 'GpsTime', 'Red', 'Green',
+    // 'Blue']}
+    //
+    std::stringstream oss;
+    Dimension::IdList dims = view->dims();
+
+    PyObject* dict = PyDict_New();
+    PyObject* sizes = PyList_New(dims.size());
+    PyObject* formats = PyList_New(dims.size());
+    PyObject* titles = PyList_New(dims.size());
+
+    for (Dimension::IdList::size_type i=0; i < dims.size(); ++i)
+    {
+        Dimension::Id::Enum id = (dims[i]);
+        Dimension::Type::Enum t = view->dimType(id);
+        npy_intp stride = view->dimSize(id);
+
+        std::string name = view->dimName(id);
+
+        std::string kind("i");
+        Dimension::BaseType::Enum b = Dimension::base(t);
+        if (b == Dimension::BaseType::Unsigned)
+            kind = "u";
+        else if (b == Dimension::BaseType::Floating)
+            kind = "f";
+        else
+        {
+            std::stringstream o;
+            oss << "unable to map kind '" << kind <<"' to PDAL dimension type";
+            throw pdal::pdal_error(o.str());
+        }
+
+        oss << kind << stride;
+        PyObject* pySize = PyLong_FromLong(stride);
+        PyObject* pyTitle = PyUnicode_FromString(name.c_str());
+        PyObject* pyFormat = PyUnicode_FromString(oss.str().c_str());
+
+        PyList_SetItem(sizes, i, pySize);
+        PyList_SetItem(titles, i, pyTitle);
+        PyList_SetItem(formats, i, pyFormat);
+
+        oss.str("");
+    }
+
+    PyDict_SetItemString(dict, "names", titles);
+    PyDict_SetItemString(dict, "formats", formats);
+
+//     PyObject* obj = PyUnicode_AsASCIIString(PyObject_Str(dict));
+//     const char* s = PyBytes_AsString(obj);
+//     std::string output(s);
+//     std::cout << "array: " << output << std::endl;
+    return dict;
+}
+void Array::update(PointViewPtr view)
+{
+    typedef std::unique_ptr<std::vector<uint8_t>> DataPtr;
+    cleanup();
+    int nd = 1;
+    Dimension::IdList dims = view->dims();
+    npy_intp mydims = view->size();
+    npy_intp* ndims = &mydims;
+    std::vector<npy_intp> strides(dims.size());
+
+
+    DataPtr pdata( new std::vector<uint8_t>(view->pointSize()* view->size(), 0));
+
+    PyArray_Descr *dtype(0);
+    PyObject * dtype_dict = (PyObject*)buildNumpyDescription(view);
+    if (!dtype_dict)
+        throw pdal_error("Unable to build numpy dtype description dictionary");
+    int did_convert = PyArray_DescrConverter(dtype_dict, &dtype);
+    if (did_convert == NPY_FAIL)
+        throw pdal_error("Unable to build numpy dtype");
+    Py_XDECREF(dtype_dict);
+
+#ifdef NPY_ARRAY_CARRAY
+    int flags = NPY_ARRAY_CARRAY;
+#else
+    int flags = NPY_CARRAY;
+#endif
+    uint8_t* sp = pdata.get()->data();
+    PyObject * pyArray = PyArray_NewFromDescr(&PyArray_Type,
+                                              dtype,
+                                              nd,
+                                              ndims,
+                                              0,
+                                              sp,
+                                              flags,
+                                              NULL);
+
+    // copy the data
+    uint8_t* p(sp);
+    DimTypeList types = view->dimTypes();
+    for (PointId idx = 0; idx < view->size(); idx++)
+    {
+        p = sp + (view->pointSize() * idx);
+        view->getPackedPoint(types, idx, (char*)p);
+    }
+
+    m_py_array = pyArray;
+    m_data_array = std::move(pdata);
+
+}
+
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/src/plang/BufferedInvocation.cpp b/src/plang/BufferedInvocation.cpp
new file mode 100644
index 0000000..e9ef9f3
--- /dev/null
+++ b/src/plang/BufferedInvocation.cpp
@@ -0,0 +1,121 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/plang/BufferedInvocation.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#  pragma warning(disable: 4505)  // unreferenced local function has been removed
+#endif
+
+using namespace pdal;
+
+namespace pdal
+{
+namespace plang
+{
+
+
+BufferedInvocation::BufferedInvocation(const Script& script)
+    : Invocation(script)
+{}
+
+
+void BufferedInvocation::begin(PointView& view, MetadataNode m)
+{
+    PointLayoutPtr layout(view.m_pointTable.layout());
+    Dimension::IdList const& dims = layout->dims();
+
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+    {
+        Dimension::Id::Enum d = *di;
+        const Dimension::Detail *dd = layout->dimDetail(d);
+        void *data = malloc(dd->size() * view.size());
+        m_buffers.push_back(data);  // Hold pointer for deallocation
+        char *p = (char *)data;
+        for (PointId idx = 0; idx < view.size(); ++idx)
+        {
+            view.getFieldInternal(d, idx, (void *)p);
+            p += dd->size();
+        }
+        std::string name = layout->dimName(*di);
+        insertArgument(name, (uint8_t *)data, dd->type(), view.size());
+    }
+    Py_XDECREF(m_metaIn);
+    m_metaIn = plang::fromMetadata(m);
+}
+
+
+void BufferedInvocation::end(PointView& view, MetadataNode m)
+{
+    // for each entry in the script's outs dictionary,
+    // look up that entry's name in the schema and then
+    // copy the data into the right dimension spot in the
+    // buffer
+
+    std::vector<std::string> names;
+    getOutputNames(names);
+
+    PointLayoutPtr layout(view.m_pointTable.layout());
+    Dimension::IdList const& dims = layout->dims();
+
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+    {
+        Dimension::Id::Enum d = *di;
+        const Dimension::Detail *dd = layout->dimDetail(d);
+        std::string name = layout->dimName(*di);
+        auto found = std::find(names.begin(), names.end(), name);
+        if (found == names.end()) continue; // didn't have this dim in the names
+
+        assert(name == *found);
+        assert(hasOutputVariable(name));
+
+        size_t size = dd->size();
+        void *data = extractResult(name, dd->type());
+        char *p = (char *)data;
+        for (PointId idx = 0; idx < view.size(); ++idx)
+        {
+            view.setField(d, dd->type(), idx, (void *)p);
+            p += size;
+        }
+    }
+    for (auto bi = m_buffers.begin(); bi != m_buffers.end(); ++bi)
+        free(*bi);
+    m_buffers.clear();
+    addMetadata(m_metaOut, m);
+}
+
+} //namespace plang
+} //namespace pdal
+
diff --git a/src/plang/CMakeLists.txt b/src/plang/CMakeLists.txt
new file mode 100644
index 0000000..c027663
--- /dev/null
+++ b/src/plang/CMakeLists.txt
@@ -0,0 +1,35 @@
+
+set(plang_srcs
+    Array.cpp
+    BufferedInvocation.cpp
+    Invocation.cpp
+    Environment.cpp
+    Redirector.cpp
+    Script.cpp
+)
+
+set(plang_headers
+    "${PDAL_HEADERS_DIR}/plang/Array.hpp"
+    "${PDAL_HEADERS_DIR}/plang/BufferedInvocation.hpp"
+    "${PDAL_HEADERS_DIR}/plang/Invocation.hpp"
+    "${PDAL_HEADERS_DIR}/plang/Environment.hpp"
+    "${PDAL_HEADERS_DIR}/plang/Redirector.hpp"
+    "${PDAL_HEADERS_DIR}/plang/Script.hpp"
+)
+
+include(${PDAL_CMAKE_DIR}/python.cmake)
+include_directories(SYSTEM ${PYTHON_INCLUDE_DIR})
+
+PDAL_ADD_LIBRARY(${PDAL_PLANG_LIB_NAME} ${plang_srcs} )
+set_target_properties(${PDAL_PLANG_LIB_NAME} PROPERTIES
+    VERSION "${PDAL_BUILD_VERSION}"
+    SOVERSION "${PDAL_API_VERSION}"
+    CLEAN_DIRECT_OUTPUT 1)
+
+target_link_libraries(${PDAL_PLANG_LIB_NAME} ${PDAL_BASE_LIB_NAME} ${PYTHON_LIBRARY})
+install(TARGETS ${PLANG_LIB_NAME}
+    RUNTIME DESTINATION ${PDAL_BIN_INSTALL_DIR}
+    LIBRARY DESTINATION ${PDAL_LIB_INSTALL_DIR}
+    ARCHIVE DESTINATION ${PDAL_LIB_INSTALL_DIR})
+
+
diff --git a/src/plang/Environment.cpp b/src/plang/Environment.cpp
new file mode 100644
index 0000000..f6702a3
--- /dev/null
+++ b/src/plang/Environment.cpp
@@ -0,0 +1,322 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/plang/Environment.hpp>
+#include <pdal/plang/Redirector.hpp>
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+#define PY_ARRAY_UNIQUE_SYMBOL PDAL_ARRAY_API
+#include <numpy/arrayobject.h>
+
+#include <sstream>
+#include <mutex>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+#include <Python.h>
+#include <pystate.h>
+#undef toupper
+#undef tolower
+#undef isspace
+
+
+// http://www.linuxjournal.com/article/3641
+// http://www.codeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I
+// http://stackoverflow.com/questions/6596016/python-threads-in-c
+
+namespace pdal
+{
+namespace plang
+{
+
+static Environment* g_environment=0;
+
+EnvironmentPtr Environment::get()
+{
+    static std::once_flag flag;
+
+    auto init = []()
+    {
+        g_environment = new Environment();
+    };
+
+    std::call_once(flag, init);
+
+    return g_environment;
+}
+
+
+Environment::Environment()
+{
+    // This awfulness is due to the import_array MACRO that returns a value
+    // in some cases and returns nothing at other times.  Defining
+    // NUMPY_IMPORT_ARRAY_RETVAL to nothing makes it so we don't ever return
+    // a value.  The function needs to be stuck in a function to deal with
+    // the return.
+    auto initNumpy = []()
+    {
+#undef NUMPY_IMPORT_ARRAY_RETVAL
+#define NUMPY_IMPORT_ARRAY_RETVAL
+        import_array();
+    };
+
+    PyImport_AppendInittab(const_cast<char*>("redirector"), redirector_init);
+
+    Py_Initialize();
+    initNumpy();
+    PyImport_ImportModule("redirector");
+}
+
+
+Environment::~Environment()
+{
+    Py_Finalize();
+}
+
+
+void Environment::set_stdout(std::ostream* ostr)
+{
+    m_redirector.set_stdout(ostr);
+}
+
+
+void Environment::reset_stdout()
+{
+    m_redirector.reset_stdout();
+}
+
+
+std::string getTraceback()
+{
+    // get exception info
+    PyObject *type, *value, *traceback;
+    PyErr_Fetch(&type, &value, &traceback);
+    PyErr_NormalizeException(&type, &value, &traceback);
+
+    std::ostringstream mssg;
+    if (traceback)
+    {
+        PyObject* tracebackModule;
+        PyObject* tracebackDictionary;
+        PyObject* tracebackFunction;
+
+        tracebackModule = PyImport_ImportModule("traceback");
+        if (!tracebackModule)
+            throw pdal::pdal_error("Unable to load traceback module.");
+
+        tracebackDictionary = PyModule_GetDict(tracebackModule);
+        if (!tracebackDictionary)
+            throw pdal::pdal_error("Unable to load traceback dictionary.");
+        tracebackFunction =
+            PyDict_GetItemString(tracebackDictionary, "format_exception");
+        if (!tracebackFunction)
+            throw pdal::pdal_error("Unable to find traceback function.");
+
+        if (!PyCallable_Check(tracebackFunction))
+            throw pdal::pdal_error("Invalid traceback function.");
+
+        // create an argument for "format exception"
+        PyObject* args = PyTuple_New(3);
+        PyTuple_SetItem(args, 0, type);
+        PyTuple_SetItem(args, 1, value);
+        PyTuple_SetItem(args, 2, traceback);
+
+        // get a list of string describing what went wrong
+        PyObject* output = PyObject_CallObject(tracebackFunction, args);
+
+        // print error message
+        int n = PyList_Size(output);
+
+        for (int i = 0; i < n; i++)
+        {
+            PyObject* l = PyList_GetItem(output, i);
+            if (!l)
+                throw pdal::pdal_error("unable to get list item in getTraceback");
+            PyObject* r = PyObject_Repr(l);
+            if (!r)
+                throw pdal::pdal_error("unable to get repr in getTraceback");
+            Py_ssize_t size;
+#if PY_MAJOR_VERSION >= 3
+            char* d = PyUnicode_AsUTF8AndSize(r, &size);
+#else
+            char* d = PyString_AsString(r);
+#endif
+            mssg << d;
+        }
+
+        // clean up
+        Py_XDECREF(args);
+        Py_XDECREF(output);
+    }
+    else if (value != NULL)
+    {
+        PyObject* r = PyObject_Repr(value);
+        if (!r)
+            throw pdal::pdal_error("couldn't make string representation of traceback value");
+        Py_ssize_t size;
+#if PY_MAJOR_VERSION >= 3
+            char* d = PyUnicode_AsUTF8AndSize(r, &size);
+#else
+            char* d = PyString_AsString(r);
+#endif
+        mssg << d;
+    }
+    else
+        mssg << "unknown error that we are unable to get a traceback for."
+            "Was it already printed/taken?";
+
+    Py_XDECREF(value);
+    Py_XDECREF(type);
+    Py_XDECREF(traceback);
+
+    return mssg.str();
+}
+
+PyObject *fromMetadata(MetadataNode m)
+{
+    std::string name = m.name();
+    std::string value = m.value();
+    std::string type = m.type();
+    std::string description = m.description();
+
+    MetadataNodeList children = m.children();
+    PyObject *submeta = NULL;
+    if (children.size())
+    {
+        submeta = PyList_New(0);
+        for (MetadataNode& child : children)
+            PyList_Append(submeta, fromMetadata(child));
+    }
+    PyObject *data = PyTuple_New(5);
+    PyTuple_SetItem(data, 0, PyUnicode_FromString(name.data()));
+    PyTuple_SetItem(data, 1, PyUnicode_FromString(value.data()));
+    PyTuple_SetItem(data, 2, PyUnicode_FromString(type.data()));
+    PyTuple_SetItem(data, 3, PyUnicode_FromString(description.data()));
+    PyTuple_SetItem(data, 4, submeta);
+
+    return data;
+}
+
+std::string readPythonString(PyObject* list, Py_ssize_t index)
+{
+    std::stringstream ss;
+
+    PyObject* o = PyTuple_GetItem(list, index);
+    if (!o)
+    {
+        std::stringstream oss;
+        oss << "Unable to get list item number " << index << " for list of length " << PyTuple_Size(list);
+        throw pdal_error(oss.str());
+    }
+    PyObject* r = PyObject_Repr(o);
+    if (!r)
+        throw pdal::pdal_error("unable to get repr in readPythonString");
+    Py_ssize_t size;
+#if PY_MAJOR_VERSION >= 3
+            char* d = PyUnicode_AsUTF8AndSize(r, &size);
+#else
+            char* d = PyString_AsString(r);
+#endif
+    ss << d;
+
+    return ss.str();
+}
+void addMetadata(PyObject *list, MetadataNode m)
+{
+
+    if (!PyList_Check(list))
+        return;
+
+    for (Py_ssize_t i = 0; i < PyList_Size(list); ++i)
+    {
+        PyObject *tuple = PyList_GetItem(list, i);
+        if (!PyTuple_Check(tuple) || PyTuple_Size(tuple) != 5)
+            continue;
+
+        std::string name = readPythonString(tuple, 0);
+        std::string value = readPythonString(tuple, 1);
+
+        std::string type = readPythonString(tuple, 2);
+        if (type.empty())
+            type = Metadata::inferType(value);
+
+        std::string description = readPythonString(tuple, 3);
+
+        PyObject *submeta = PyTuple_GetItem(tuple, 4);
+        MetadataNode child =  m.addWithType(name, value, type, description);
+        if (submeta)
+            addMetadata(submeta, child);
+    }
+}
+
+int Environment::getPythonDataType(Dimension::Type::Enum t)
+{
+    using namespace Dimension;
+
+    switch (t)
+    {
+    case Type::Float:
+        return NPY_FLOAT;
+    case Type::Double:
+        return NPY_DOUBLE;
+    case Type::Signed8:
+        return NPY_BYTE;
+    case Type::Signed16:
+        return NPY_SHORT;
+    case Type::Signed32:
+        return NPY_INT;
+    case Type::Signed64:
+        return NPY_LONGLONG;
+    case Type::Unsigned8:
+        return NPY_UBYTE;
+    case Type::Unsigned16:
+        return NPY_USHORT;
+    case Type::Unsigned32:
+        return NPY_UINT;
+    case Type::Unsigned64:
+        return NPY_ULONGLONG;
+    default:
+        return -1;
+    }
+    assert(0);
+
+    return -1;
+}
+
+
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/src/plang/Invocation.cpp b/src/plang/Invocation.cpp
new file mode 100644
index 0000000..9d86d56
--- /dev/null
+++ b/src/plang/Invocation.cpp
@@ -0,0 +1,290 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/plang/Invocation.hpp>
+#include <pdal/plang/Environment.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127) // conditional expression is constant
+#endif
+
+#include <Python.h>
+#undef toupper
+#undef tolower
+#undef isspace
+
+#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
+
+#define NO_IMPORT_ARRAY
+#define PY_ARRAY_UNIQUE_SYMBOL PDAL_ARRAY_API
+#include <numpy/arrayobject.h>
+
+namespace
+{
+
+int argCount(PyObject *function)
+{
+    PyObject *module = PyImport_ImportModule("inspect");
+    if (!module)
+        return false;
+    PyObject *dictionary = PyModule_GetDict(module);
+    PyObject *getargFunc = PyDict_GetItemString(dictionary, "getargspec");
+    PyObject *inArgs = PyTuple_New(1);
+    PyTuple_SetItem(inArgs, 0, function);
+    PyObject *outArgs = PyObject_CallObject(getargFunc, inArgs);
+    PyObject *arglist = PyTuple_GetItem(outArgs, 0);
+    return PyList_Size(arglist);
+}
+
+}
+
+namespace pdal
+{
+namespace plang
+{
+
+Invocation::Invocation(const Script& script) :
+    m_metaIn(NULL)
+    , m_metaOut(NULL)
+    , m_script(script)
+    , m_bytecode(NULL)
+    , m_module(NULL)
+    , m_dictionary(NULL)
+    , m_function(NULL)
+    , m_varsIn(NULL)
+    , m_varsOut(NULL)
+    , m_scriptArgs(NULL)
+    , m_scriptResult(NULL)
+{
+    plang::Environment::get();
+    resetArguments();
+}
+
+
+Invocation::~Invocation()
+{
+    cleanup();
+}
+
+
+void Invocation::compile()
+{
+    m_bytecode = Py_CompileString(m_script.source(), m_script.module(),
+        Py_file_input);
+    if (!m_bytecode)
+        throw pdal::pdal_error(getTraceback());
+
+    Py_INCREF(m_bytecode);
+
+    m_module = PyImport_ExecCodeModule(const_cast<char*>(m_script.module()),
+        m_bytecode);
+    if (!m_module)
+        throw pdal::pdal_error(getTraceback());
+
+    m_dictionary = PyModule_GetDict(m_module);
+    m_function = PyDict_GetItemString(m_dictionary, m_script.function());
+    if (!m_function)
+    {
+        std::ostringstream oss;
+        oss << "unable to find target function '" << m_script.function() <<
+            "' in module.";
+        throw pdal::pdal_error(oss.str());
+    }
+    if (!PyCallable_Check(m_function))
+        throw pdal::pdal_error(getTraceback());
+}
+
+
+void Invocation::cleanup()
+{
+    Py_XDECREF(m_varsIn);
+    Py_XDECREF(m_varsOut);
+    Py_XDECREF(m_scriptResult);
+    Py_XDECREF(m_scriptArgs); // also decrements script and vars
+    for (size_t i = 0; i < m_pyInputArrays.size(); i++)
+        Py_XDECREF(m_pyInputArrays[i]);
+    m_pyInputArrays.clear();
+    Py_XDECREF(m_bytecode);
+    Py_XDECREF(m_metaIn);
+    Py_XDECREF(m_metaOut);
+}
+
+
+void Invocation::resetArguments()
+{
+    cleanup();
+    m_varsIn = PyDict_New();
+    m_varsOut = PyDict_New();
+    m_metaIn = PyList_New(0);
+    m_metaOut = PyList_New(0);
+}
+
+
+void Invocation::insertArgument(std::string const& name, uint8_t* data,
+    Dimension::Type::Enum t, point_count_t count)
+{
+    npy_intp mydims = count;
+    int nd = 1;
+    npy_intp* dims = &mydims;
+    npy_intp stride = Dimension::size(t);
+    npy_intp* strides = &stride;
+
+#ifdef NPY_ARRAY_CARRAY
+    int flags = NPY_ARRAY_CARRAY;
+#else
+    int flags = NPY_CARRAY;
+#endif
+
+    const int pyDataType = plang::Environment::getPythonDataType(t);
+
+    PyObject* pyArray = PyArray_New(&PyArray_Type, nd, dims, pyDataType,
+        strides, data, 0, flags, NULL);
+    m_pyInputArrays.push_back(pyArray);
+    PyDict_SetItemString(m_varsIn, name.c_str(), pyArray);
+}
+
+
+void *Invocation::extractResult(std::string const& name,
+    Dimension::Type::Enum t)
+{
+    PyObject* xarr = PyDict_GetItemString(m_varsOut, name.c_str());
+    if (!xarr)
+        throw pdal::pdal_error("plang output variable '" + name + "' not found.");
+    if (!PyArray_Check(xarr))
+        throw pdal::pdal_error("Plang output variable  '" + name +
+            "' is not a numpy array");
+
+    PyArrayObject* arr = (PyArrayObject*)xarr;
+
+    npy_intp one = 0;
+    const int pyDataType = pdal::plang::Environment::getPythonDataType(t);
+    PyArray_Descr *dtype = PyArray_DESCR(arr);
+
+    if (static_cast<uint32_t>(dtype->elsize) != Dimension::size(t))
+    {
+        std::ostringstream oss;
+        oss << "dtype of array has size " << dtype->elsize
+            << " but PDAL dimension '" << name << "' has byte size of "
+            << Dimension::size(t) << " bytes.";
+        throw pdal::pdal_error(oss.str());
+    }
+
+    using namespace Dimension;
+    BaseType::Enum b = Dimension::base(t);
+    if (dtype->kind == 'i' && b != BaseType::Signed)
+    {
+        std::ostringstream oss;
+        oss << "dtype of array has a signed integer type but the " <<
+            "dimension data type of '" << name <<
+            "' is not pdal::Signed.";
+        throw pdal::pdal_error(oss.str());
+    }
+
+    if (dtype->kind == 'u' && b != BaseType::Unsigned)
+    {
+        std::ostringstream oss;
+        oss << "dtype of array has a unsigned integer type but the " <<
+            "dimension data type of '" << name <<
+            "' is not pdal::Unsigned.";
+        throw pdal::pdal_error(oss.str());
+    }
+
+    if (dtype->kind == 'f' && b != BaseType::Floating)
+    {
+        std::ostringstream oss;
+        oss << "dtype of array has a float type but the " <<
+            "dimension data type of '" << name << "' is not pdal::Floating.";
+        throw pdal::pdal_error(oss.str());
+    }
+    return PyArray_GetPtr(arr, &one);
+}
+
+
+void Invocation::getOutputNames(std::vector<std::string>& names)
+{
+    names.clear();
+
+    PyObject *key, *value;
+    Py_ssize_t pos = 0;
+
+    while (PyDict_Next(m_varsOut, &pos, &key, &value))
+    {
+        const char* p(0);
+#if PY_MAJOR_VERSION >= 3
+        p = PyBytes_AsString(PyUnicode_AsUTF8String(key));
+#else
+        p = PyString_AsString(key);
+#endif
+        if (p)
+            names.push_back(p);
+    }
+}
+
+
+bool Invocation::hasOutputVariable(const std::string& name) const
+{
+    return (PyDict_GetItemString(m_varsOut, name.c_str()) != NULL);
+}
+
+
+bool Invocation::execute()
+{
+    if (!m_bytecode)
+        throw pdal::pdal_error("No code has been compiled");
+
+    Py_INCREF(m_varsIn);
+    Py_INCREF(m_varsOut);
+    Py_ssize_t numArgs = argCount(m_function);
+    m_scriptArgs = PyTuple_New(numArgs);
+    PyTuple_SetItem(m_scriptArgs, 0, m_varsIn);
+    if (numArgs > 1)
+        PyTuple_SetItem(m_scriptArgs, 1, m_varsOut);
+    if (numArgs > 2)
+        PyTuple_SetItem(m_scriptArgs, 2, m_metaIn);
+    if (numArgs > 3)
+        PyTuple_SetItem(m_scriptArgs, 3, m_metaOut);
+
+    m_scriptResult = PyObject_CallObject(m_function, m_scriptArgs);
+    if (!m_scriptResult)
+        throw pdal::pdal_error(getTraceback());
+
+    if (!PyBool_Check(m_scriptResult))
+        throw pdal::pdal_error("User function return value not a boolean type.");
+
+    return (m_scriptResult == Py_True);
+}
+
+} // namespace plang
+} // namespace pdal
+
diff --git a/src/plang/Redirector.cpp b/src/plang/Redirector.cpp
new file mode 100644
index 0000000..6bdcee8
--- /dev/null
+++ b/src/plang/Redirector.cpp
@@ -0,0 +1,216 @@
+//
+// Copyright (C) 2011 Mateusz Loskot <mateusz at loskot.net>
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// Blog article: http://mateusz.loskot.net/?p=2819
+
+#include <pdal/plang/Redirector.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+#include <functional>
+#include <ostream>
+
+namespace pdal
+{
+namespace plang
+{
+
+struct Stdout
+{
+    PyObject_HEAD
+    Redirector::stdout_write_type write;
+};
+
+
+static PyObject* Stdout_write(PyObject* self, PyObject* args)
+{
+    std::size_t written(0);
+    Stdout* selfimpl = reinterpret_cast<Stdout*>(self);
+    if (selfimpl->write)
+    {
+        char* data;
+        if (!PyArg_ParseTuple(args, "s", &data))
+            return 0;
+
+        std::string str(data);
+        selfimpl->write(str);
+        written = str.size();
+    }
+    return PyLong_FromSize_t(written);
+}
+
+
+static PyObject* Stdout_flush(PyObject* /*self*/, PyObject* /*args*/)
+{
+    // no-op
+    return Py_BuildValue("");
+}
+
+
+static PyMethodDef Stdout_methods[] =
+{
+    {"write", Stdout_write, METH_VARARGS, "sys.stdout.write"},
+    {"flush", Stdout_flush, METH_VARARGS, "sys.stdout.write"},
+    {0, 0, 0, 0} // sentinel
+};
+
+
+static PyTypeObject StdoutType =
+{
+    PyVarObject_HEAD_INIT(0, 0)
+    "redirector.StdoutType", /* tp_name */
+    sizeof(Stdout), /* tp_basicsize */
+    0, /* tp_itemsize */
+    0, /* tp_dealloc */
+    0, /* tp_print */
+    0, /* tp_getattr */
+    0, /* tp_setattr */
+    0, /* tp_reserved */
+    0, /* tp_repr */
+    0, /* tp_as_number */
+    0, /* tp_as_sequence */
+    0, /* tp_as_mapping */
+    0, /* tp_hash */
+    0, /* tp_call */
+    0, /* tp_str */
+    0, /* tp_getattro */
+    0, /* tp_setattro */
+    0, /* tp_as_buffer */
+    Py_TPFLAGS_DEFAULT, /* tp_flags */
+    "redirector.Stdout objects", /* tp_doc */
+    0, /* tp_traverse */
+    0, /* tp_clear */
+    0, /* tp_richcompare */
+    0, /* tp_weaklistoffset */
+    0, /* tp_iter */
+    0, /* tp_iternext */
+    Stdout_methods, /* tp_methods */
+    0, /* tp_members */
+    0, /* tp_getset */
+    0, /* tp_base */
+    0, /* tp_dict */
+    0, /* tp_descr_get */
+    0, /* tp_descr_set */
+    0, /* tp_dictoffset */
+    0, /* tp_init */
+    0, /* tp_alloc */
+    0, /* tp_new */
+    0, /* tp_free */
+    0, /* tp_is_gc */
+    0, /* tp_bases */
+    0, /* tp_mro */
+    0, /* tp_cache */
+    0, /* tp_subclasses */
+    0, /* tp_weaklist */
+    0, /* tp_del */
+    0, /* tp_version_tag */
+};
+
+
+Redirector::Redirector()
+    : m_stdout(NULL)
+    , m_stdout_saved(NULL)
+{
+    return;
+}
+
+
+Redirector::~Redirector()
+{
+    return;
+}
+
+
+PyMODINIT_FUNC redirector_init(void)
+{
+#if PY_MAJOR_VERSION >= 3
+    return Redirector::init();
+#else
+    Redirector::init();
+#endif
+}
+
+#if PY_MAJOR_VERSION >= 3
+    static struct PyModuleDef redirectordef = {
+        PyModuleDef_HEAD_INIT,
+        "redirector",     /* m_name */
+        "redirector.Stdout objects",  /* m_doc */
+        -1,                  /* m_size */
+        Stdout_methods,    /* m_methods */
+        NULL,                /* m_reload */
+        NULL,                /* m_traverse */
+        NULL,                /* m_clear */
+        NULL,                /* m_free */
+    };
+#endif
+
+PyObject* Redirector::init()
+{
+    StdoutType.tp_new = PyType_GenericNew;
+    if (PyType_Ready(&StdoutType) < 0)
+        return NULL;
+#if PY_MAJOR_VERSION >= 3
+    PyObject* m = PyModule_Create(&redirectordef);
+#else
+    PyObject* m = Py_InitModule3("redirector", 0, 0);
+#endif
+    if (m)
+    {
+        //ABELL - This is bad code as the type cast is invalid. (type pun
+        //  warning.)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"
+        Py_INCREF(reinterpret_cast<PyObject*>(&StdoutType));
+        PyModule_AddObject(m, "Stdout", reinterpret_cast<PyObject*>(&StdoutType));
+#pragma GCC diagnostic pop
+    }
+    return m;
+}
+
+
+static void my2argwriterfunction(std::ostream* ostr, const std::string& mssg)
+{
+    *ostr << mssg;
+}
+
+
+void Redirector::set_stdout(std::ostream* ostr)
+{
+    stdout_write_type my1argwriterfunction = std::bind(&my2argwriterfunction, ostr, std::placeholders::_1);
+    this->set_stdout(my1argwriterfunction);
+
+    return;
+}
+
+
+void Redirector::set_stdout(stdout_write_type write)
+{
+    if (!m_stdout)
+    {
+        m_stdout_saved = PySys_GetObject(const_cast<char*>("stdout")); // borrowed
+        m_stdout = StdoutType.tp_new(&StdoutType, 0, 0);
+    }
+
+    Stdout* impl = reinterpret_cast<Stdout*>(m_stdout);
+    impl->write = write;
+    PySys_SetObject(const_cast<char*>("stdout"), m_stdout);
+}
+
+
+void Redirector::reset_stdout()
+{
+    if (m_stdout_saved)
+        PySys_SetObject(const_cast<char*>("stdout"), m_stdout_saved);
+
+    Py_XDECREF(m_stdout);
+    m_stdout = 0;
+}
+
+} //namespace plang
+} //namespace pdal
+
diff --git a/src/plang/Script.cpp b/src/plang/Script.cpp
new file mode 100644
index 0000000..dfc9177
--- /dev/null
+++ b/src/plang/Script.cpp
@@ -0,0 +1,65 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/plang/Script.hpp>
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127) // conditional expression is constant
+#endif
+
+namespace pdal
+{
+namespace plang
+{
+
+Script::Script(const std::string& source, const std::string& module,
+    const std::string& function) : m_source(source) , m_module(module),
+    m_function(function)
+{
+}
+
+
+std::ostream& operator << (std::ostream& os, Script const& script)
+{
+    os << "source=[" << strlen(script.source()) << " bytes], ";
+    os << "module=" << script.module() << ", ";
+    os << "function=" << script.function();
+    os << std::endl;
+
+    return os;
+}
+
+} //namespace plang
+} //namespace pdal
+
diff --git a/src/prototype.vcxproj b/src/prototype.vcxproj
new file mode 100644
index 0000000..1d39b39
--- /dev/null
+++ b/src/prototype.vcxproj
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{893EB6C9-C6AE-4A81-A2B4-81C1E3F4D2F4}</ProjectGuid>
+    <Keyword>Win32Proj</Keyword>
+    <RootNamespace>proto</RootNamespace>
+    <ProjectName>prototype</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <AdditionalIncludeDirectories>../include</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <PrecompiledHeader>NotUsing</PrecompiledHeader>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </ClCompile>
+    <Link>
+      <SubSystem>Console</SubSystem>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="Bounds.cpp" />
+    <ClCompile Include="ColorFilter.cpp" />
+    <ClCompile Include="CropFilter.cpp" />
+    <ClCompile Include="FauxReader.cpp" />
+    <ClCompile Include="FauxWriter.cpp" />
+    <ClCompile Include="Field.cpp" />
+    <ClCompile Include="Filter.cpp" />
+    <ClCompile Include="Header.cpp" />
+    <ClCompile Include="MosaicFilter.cpp" />
+    <ClCompile Include="PointLayout.cpp" />
+    <ClCompile Include="main.cpp" />
+    <ClCompile Include="PointData.cpp" />
+    <ClCompile Include="Reader.cpp" />
+    <ClCompile Include="Stage.cpp" />
+    <ClCompile Include="Utils.cpp" />
+    <ClCompile Include="Writer.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\include\pdal\Bounds.hpp" />
+    <ClInclude Include="..\include\pdal\ColorFilter.hpp" />
+    <ClInclude Include="..\include\pdal\CropFilter.hpp" />
+    <ClInclude Include="..\include\pdal\FauxReader.hpp" />
+    <ClInclude Include="..\include\pdal\FauxWriter.hpp" />
+    <ClInclude Include="..\include\pdal\Field.hpp" />
+    <ClInclude Include="..\include\pdal\Filter.hpp" />
+    <ClInclude Include="..\include\pdal\Header.hpp" />
+    <ClInclude Include="..\include\pdal\MosaicFilter.hpp" />
+    <ClInclude Include="..\include\pdal\PointLayout.hpp" />
+    <ClInclude Include="..\include\pdal\PointData.hpp" />
+    <ClInclude Include="..\include\pdal\Reader.hpp" />
+    <ClInclude Include="..\include\pdal\Stage.hpp" />
+    <ClInclude Include="..\include\pdal\Utils.hpp" />
+    <ClInclude Include="..\include\pdal\Writer.hpp" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/src/util/Bounds.cpp b/src/util/Bounds.cpp
new file mode 100644
index 0000000..0a97663
--- /dev/null
+++ b/src/util/Bounds.cpp
@@ -0,0 +1,252 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <iostream>
+#include <limits>
+#include <vector>
+
+#include <pdal/util/Bounds.hpp>
+
+namespace
+{
+
+template <typename PREDICATE>
+void eat(std::istream& in, PREDICATE p)
+{
+    while (p((char)in.get()))
+        ;
+    if (in.eof())
+        in.clear(in.rdstate() & ~std::ios::failbit);
+    else
+        in.unget();
+}
+
+bool eat(std::istream& in, char c)
+{
+    if ((char)in.get() == c)
+        return true;
+    in.unget();
+    return false;
+}
+
+void readpair(std::istream& istr, double& low, double& high)
+{
+    eat(istr, isspace);
+    if (!eat(istr,'['))
+        istr.setstate(std::ios_base::failbit);
+
+    eat(istr, isspace);
+    istr >> low;
+
+    eat(istr, isspace);
+    if (!eat(istr,','))
+        istr.setstate(std::ios_base::failbit);
+
+    eat(istr, isspace);
+    istr >> high;
+
+    if (!eat(istr,']'))
+        istr.setstate(std::ios_base::failbit);
+}
+
+} // unnamed namespace
+
+namespace pdal
+{
+
+const double BOX2D::LOWEST = (std::numeric_limits<double>::lowest)();
+const double BOX2D::HIGHEST = (std::numeric_limits<double>::max)();
+    
+void BOX2D::clear()
+{
+    minx = HIGHEST; miny = HIGHEST;
+    maxx = LOWEST; maxy = LOWEST;
+}
+
+void BOX3D::clear()
+{
+    BOX2D::clear();
+    minz = HIGHEST;
+    maxz = LOWEST;
+}
+
+bool BOX2D::empty() const
+{
+    return  minx == HIGHEST && maxx == LOWEST &&
+        miny == HIGHEST && maxy == LOWEST;
+}
+
+bool BOX3D::empty() const
+{
+    return  BOX2D::empty() && minz == HIGHEST && maxz == LOWEST;
+}
+
+void BOX2D::grow(double x, double y)
+{
+    if (x < minx) minx = x;
+    if (x > maxx) maxx = x;
+
+    if (y < miny) miny = y;
+    if (y > maxy) maxy = y;
+}
+
+void BOX3D::grow(double x, double y, double z)
+{
+    BOX2D::grow(x, y);
+    if (z < minz) minz = z;
+    if (z > maxz) maxz = z;
+}
+
+const BOX2D& BOX2D::getDefaultSpatialExtent()
+{
+    static BOX2D v(LOWEST, LOWEST, HIGHEST, HIGHEST);
+    return v;
+}    
+
+
+const BOX3D& BOX3D::getDefaultSpatialExtent()
+{
+    static BOX3D v(LOWEST, LOWEST, LOWEST, HIGHEST, HIGHEST, HIGHEST);
+    return v;
+}    
+
+
+std::istream& operator>>(std::istream& istr, BOX2D& bounds)
+{
+    //ABELL - Not sure the point of this.  I get that one can have an "empty"
+    // BOX2D, but when would it be useful to create one from a string?
+    // A really dirty way to check for an empty bounds object right off
+    // the bat
+    char left_paren = (char)istr.get();
+    if (!istr.good())
+    {
+        istr.setstate(std::ios_base::failbit);
+        return istr;
+    }
+    const char right_paren = (char)istr.get();
+
+    if (left_paren == '(' && right_paren == ')')
+    {
+        bounds = BOX2D();
+        return istr;
+    }
+    istr.unget();
+    istr.unget(); // ()
+
+    std::vector<double> v;
+
+    eat(istr, isspace);
+    if (!eat(istr,'('))
+        istr.setstate(std::ios_base::failbit);
+
+    bool done = false;
+    for (int i = 0; i < 2; ++i)
+    {
+        double low, high;
+
+        readpair(istr, low, high);
+
+        eat(istr, isspace);
+        if (!eat(istr, i == 1 ? ')' : ','))
+            istr.setstate(std::ios_base::failbit);
+        v.push_back(low);
+        v.push_back(high);
+    }
+
+    if (istr.good())
+    {
+        bounds.minx = v[0];
+        bounds.maxx = v[1];
+        bounds.miny = v[2];
+        bounds.maxy = v[3];
+    }
+    return istr;
+}
+
+std::istream& operator>>(std::istream& istr, BOX3D& bounds)
+{
+    //ABELL - Not sure the point of this.  I get that one can have an "empty"
+    // BOX3D, but when would it be useful to create one from a string?
+    // A really dirty way to check for an empty bounds object right off
+    // the bat
+    char left_paren = (char)istr.get();
+    if (!istr.good())
+    {
+        istr.setstate(std::ios_base::failbit);
+        return istr;
+    }
+    const char right_paren = (char)istr.get();
+
+    if (left_paren == '(' && right_paren == ')')
+    {
+        BOX3D output;
+        bounds = output;
+        return istr;
+    }
+    istr.unget();
+    istr.unget(); // ()
+
+    std::vector<double> v;
+
+    eat(istr, isspace);
+    if (!eat(istr,'('))
+        istr.setstate(std::ios_base::failbit);
+
+    bool done = false;
+    for (int i = 0; i < 3; ++i)
+    {
+        double low, high;
+
+        readpair(istr, low, high);
+
+        eat(istr, isspace);
+        if (!eat(istr, i == 2 ? ')' : ','))
+            istr.setstate(std::ios_base::failbit);
+        v.push_back(low);
+        v.push_back(high);
+    }
+
+    if (istr.good())
+    {
+        bounds.minx = v[0];
+        bounds.maxx = v[1];
+        bounds.miny = v[2];
+        bounds.maxy = v[3];
+        bounds.minz = v[4];
+        bounds.maxz = v[5];
+    }
+    return istr;
+}
+
+} // namespace pdal
diff --git a/src/util/CMakeLists.txt b/src/util/CMakeLists.txt
new file mode 100644
index 0000000..cc02409
--- /dev/null
+++ b/src/util/CMakeLists.txt
@@ -0,0 +1,52 @@
+#
+# Make sure we don't attempt to add a library more than once
+#
+get_property(EXISTS GLOBAL PROPERTY _UTIL_INCLUDED)
+if(EXISTS)
+    return()
+endif()
+
+set(PDAL_UTIL_HPP
+    "${PDAL_INCLUDE_DIR}/pdal/util/Algorithm.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Bounds.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Charbuf.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Endian.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Extractor.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/FileUtils.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Georeference.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Inserter.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/IStream.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/OStream.hpp"
+    "${PDAL_INCLUDE_DIR}/pdal/util/Utils.hpp"
+    )
+
+set(PDAL_UTIL_CPP
+    "${PDAL_UTIL_DIR}/Bounds.cpp"
+    "${PDAL_UTIL_DIR}/Charbuf.cpp"
+    "${PDAL_UTIL_DIR}/FileUtils.cpp"
+    "${PDAL_UTIL_DIR}/Georeference.cpp"
+    "${PDAL_UTIL_DIR}/Utils.cpp"
+    )
+
+set(PDAL_UTIL_SOURCES
+    ${PDAL_UTIL_CPP}
+    ${PDAL_UTIL_HPP})
+
+PDAL_ADD_LIBRARY(${PDAL_UTIL_LIB_NAME} SHARED ${PDAL_UTIL_SOURCES})
+target_link_libraries(${PDAL_UTIL_LIB_NAME} ${Boost_LIBRARIES})
+
+set_target_properties(${PDAL_UTIL_LIB_NAME} PROPERTIES
+    VERSION "${PDAL_BUILD_VERSION}"
+    SOVERSION "${PDAL_API_VERSION}"
+    CLEAN_DIRECT_OUTPUT 1)
+
+if (NOT WIN32)
+    target_link_libraries(${PDAL_UTIL_LIB_NAME} dl)
+endif (NOT WIN32)
+
+if (NOT WIN32)
+    target_link_libraries(${PDAL_UTIL_LIB_NAME} dl)
+endif (NOT WIN32)
+
+set_property(GLOBAL PROPERTY _UTIL_INCLUDED TRUE)
+
diff --git a/src/util/Charbuf.cpp b/src/util/Charbuf.cpp
new file mode 100644
index 0000000..ca09681
--- /dev/null
+++ b/src/util/Charbuf.cpp
@@ -0,0 +1,122 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/util/Charbuf.hpp>
+
+namespace pdal
+{
+
+
+void Charbuf::initialize(char *buf, size_t count, std::ios::pos_type bufOffset)
+{
+    m_bufOffset = bufOffset;
+    m_buf = buf;
+    setg(buf, buf, buf + count);
+    setp(buf, buf + count);
+}
+
+
+std::ios::pos_type Charbuf::seekpos(std::ios::pos_type pos,
+    std::ios_base::openmode which)
+{
+    pos -= m_bufOffset;
+    if (which & std::ios_base::in)
+    {
+        if (pos >= egptr() - eback())
+            return -1;
+        char *cpos = eback() + pos;
+        setg(eback(), cpos, egptr());
+    }
+    if (which & std::ios_base::out)
+    {
+        if (pos > epptr() - m_buf)
+            return -1;
+        char *cpos = m_buf + pos;
+        setp(cpos, epptr());
+    }
+    return pos;
+}
+
+std::ios::pos_type
+Charbuf::seekoff(std::ios::off_type off, std::ios_base::seekdir dir,
+    std::ios_base::openmode which)
+{
+    std::ios::pos_type pos;
+    char *cpos = nullptr;
+    if (which & std::ios_base::in)
+    {
+        switch (dir)
+        {
+        case std::ios::beg:
+            cpos = eback() + off - m_bufOffset;
+            break;
+        case std::ios::cur:
+            cpos = gptr() + off;
+            break;
+        case std::ios::end:
+            cpos = egptr() - off;
+            break;
+        default:
+            break;  // Should never happen.
+        }
+        if (cpos < eback() || cpos > egptr())
+            return -1;
+        setg(eback(), cpos, egptr());
+        pos = cpos - eback();
+    }
+    if (which & std::ios_base::out)
+    {
+        switch (dir)
+        {
+        case std::ios::beg:
+            cpos = m_buf + off - m_bufOffset;
+            break;
+        case std::ios::cur:
+            cpos = pptr() + off;
+            break;
+        case std::ios::end:
+            cpos = egptr() - off;
+            break;
+        default:
+            break;  // Should never happen.
+        }
+        if (cpos < m_buf || cpos > epptr())
+            return -1;
+        setp(cpos, epptr());
+        pos = cpos - m_buf;
+    }
+    return pos;
+}
+
+} //namespace
diff --git a/src/util/FileUtils.cpp b/src/util/FileUtils.cpp
new file mode 100644
index 0000000..8c2e959
--- /dev/null
+++ b/src/util/FileUtils.cpp
@@ -0,0 +1,358 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <sys/stat.h>
+
+#include <iostream>
+#include <sstream>
+
+#include <boost/filesystem.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+using namespace std;
+
+namespace pdal
+{
+
+namespace
+{
+
+bool isStdin(std::string filename)
+{
+    return Utils::toupper(filename) == "STDIN";
+}
+
+bool isStdout(std::string filename)
+{
+    return Utils::toupper(filename) == "STOUT" ||
+        Utils::toupper(filename) == "STDOUT";
+}
+
+} // unnamed namespace
+
+istream* FileUtils::openFile(string const& filename, bool asBinary)
+{
+    if (isStdin(filename))
+        return &cin;
+
+    if (!FileUtils::fileExists(filename))
+        throw pdal_error(std::string("File '") + filename + "' not found");
+
+    ios::openmode mode = ios::in;
+    if (asBinary)
+        mode |= ios::binary;
+
+    std::ifstream *ifs = new std::ifstream(filename, mode);
+    if (!ifs->good())
+    {
+        delete ifs;
+        return NULL;
+    }
+    return ifs;
+}
+
+
+ostream* FileUtils::createFile(string const& filename, bool asBinary)
+{
+    if (isStdout(filename))
+        return &cout;
+
+    ios::openmode mode = ios::out;
+    if (asBinary)
+        mode |= ios::binary;
+
+    std::ostream *ofs = new std::ofstream(filename, mode);
+    if (! ofs->good())
+    {
+        delete ofs;
+        return NULL;
+    }
+    return ofs;
+}
+
+
+bool FileUtils::directoryExists(std::string const& dirname)
+{
+    return boost::filesystem::exists(dirname);
+}
+
+
+bool FileUtils::createDirectory(std::string const& dirname)
+{
+    return boost::filesystem::create_directory(dirname); 
+}
+
+
+void FileUtils::deleteDirectory(std::string const& dirname)
+{
+    boost::filesystem::remove_all(dirname);
+}
+
+
+void FileUtils::closeFile(ostream *out)
+{
+    // An ofstream is closeable and deletable, but
+    // an ostream like &std::cout isn't.
+    if (!out)
+        return;
+    ofstream *ofs = dynamic_cast<ofstream *>(out);
+    if (ofs)
+    {
+        ofs->close();
+        delete ofs;
+    }
+}
+
+
+void FileUtils::closeFile(istream* in)
+{
+    // An ifstream is closeable and deletable, but
+    // an istream like &std::cin isn't.
+    if (!in)
+        return;
+    ifstream *ifs = dynamic_cast<ifstream *>(in);
+    if (ifs)
+    {
+        ifs->close();
+        delete ifs;
+    }
+}
+
+
+bool FileUtils::deleteFile(const string& file)
+{
+    if (!fileExists(file))
+        return false;
+
+    return boost::filesystem::remove(file);
+}
+
+
+void FileUtils::renameFile(const string& dest, const string& src)
+{
+    boost::filesystem::rename(src, dest);
+}
+
+
+bool FileUtils::fileExists(const string& name)
+{
+    // filename may actually be a greyhound uri + pipelineId
+    std::string http = name.substr(0, 4);
+    if (Utils::iequals(http, "http"))
+        return true;
+ 
+    boost::system::error_code ec;
+    boost::filesystem::exists(name, ec);
+    return boost::filesystem::exists(name) || isStdin(name);
+}
+
+
+uintmax_t FileUtils::fileSize(const string& file)
+{
+    return boost::filesystem::file_size(file);
+}
+
+
+string FileUtils::readFileIntoString(const string& filename)
+{
+    istream* stream = FileUtils::openFile(filename, false);
+    assert(stream);
+    string str((istreambuf_iterator<char>(*stream)),
+        istreambuf_iterator<char>());
+    FileUtils::closeFile(stream);
+    return str;
+}
+
+
+string FileUtils::addTrailingSlash(string path)
+{
+    if (path[path.size() - 1] != '/' && path[path.size() - 1] != '\\')
+        path += "/";
+    return path;
+}
+
+
+string FileUtils::getcwd()
+{
+    const boost::filesystem::path p = boost::filesystem::current_path();
+    return addTrailingSlash(p.string());
+}
+
+
+/***
+// Non-boost alternative.  Requires file existence.
+string FileUtils::toAbsolutePath(const string& filename)
+{
+    std::string result;
+
+#ifdef WIN32
+    char buf[MAX_PATH]
+    if (GetFullPathName(filename.c_str(), MAX_PATH, buf, NULL))
+        result = buf;
+#else
+    char buf[PATH_MAX];
+    if (realpath(filename.c_str(), buf))
+        result = buf;
+#endif
+    return result;
+}
+***/
+
+// if the filename is an absolute path, just return it
+// otherwise, make it absolute (relative to current working dir) and return that
+string FileUtils::toAbsolutePath(const string& filename)
+{
+
+#if BOOST_VERSION >= 104600 && BOOST_FILESYSTEM_VERSION >= 3
+    const boost::filesystem::path p = boost::filesystem::absolute(filename);
+#else
+    const boost::filesystem::path p = boost::filesystem::complete(filename);
+#endif
+
+    return p.string();
+}
+
+
+// if the filename is an absolute path, just return it
+// otherwise, make it absolute (relative to base dir) and return that
+//
+// note: if base dir is not absolute, first make it absolute via
+// toAbsolutePath(base)
+string FileUtils::toAbsolutePath(const string& filename, const string base)
+{
+    const string newbase = toAbsolutePath(base);
+
+#if BOOST_VERSION >= 104600 && BOOST_FILESYSTEM_VERSION >= 3
+    const boost::filesystem::path p = boost::filesystem::absolute(filename, newbase);
+#else
+    const boost::filesystem::path p = boost::filesystem::complete(filename, newbase);
+#endif
+
+    return p.string();
+}
+
+string FileUtils::getFilename(const string& path)
+{
+#ifdef _WIN32
+    char pathsep = '\\';
+#else
+    char pathsep = '/';
+#endif
+
+    std::string::size_type pos = path.find_last_of(pathsep);
+    if (pos == std::string::npos)
+        return path;
+    return path.substr(pos + 1);
+}
+
+// Get the directory part of a filename.
+string FileUtils::getDirectory(const string& path)
+{
+    const boost::filesystem::path dir =
+         boost::filesystem::path(path).parent_path();
+    return addTrailingSlash(dir.string());
+}
+
+
+// Determine if the path is an absolute path
+bool FileUtils::isAbsolutePath(const string& path)
+{
+#if BOOST_VERSION >= 104600 && BOOST_FILESYSTEM_VERSION >= 3
+    return boost::filesystem::path(path).is_absolute();
+#else
+    return boost::filesystem::path(path).is_complete();
+#endif
+}
+
+
+void FileUtils::fileTimes(const std::string& filename,
+    struct tm *createTime, struct tm *modTime)
+{
+#ifdef WIN32
+    struct _stat statbuf;
+    _stat(filename.c_str(), &statbuf);
+
+    if (createTime)
+        *createTime = *gmtime(&statbuf.st_ctime);
+    if (modTime)
+        *modTime = *gmtime(&statbuf.st_mtime);
+#else
+    struct stat statbuf;
+    stat(filename.c_str(), &statbuf);
+
+    if (createTime)
+        gmtime_r(&statbuf.st_ctime, createTime);
+    if (modTime)
+        gmtime_r(&statbuf.st_mtime, modTime);
+#endif
+}
+
+
+string FileUtils::readFileAsString(string const& filename)
+{
+    if (!FileUtils::fileExists(filename))
+    {
+        ostringstream oss;
+        oss << filename << " does not exist";
+        throw pdal_error(oss.str());
+    }
+
+    istream::pos_type size;
+    istream* input = FileUtils::openFile(filename, true);
+
+    if (input->good())
+    {
+        string output;
+        string line;
+        while (input->good())
+        {
+            getline(*input, line);
+            if (output.size())
+            {
+                output = output + "\n" + line;
+            }
+            else
+            {
+                output = line;
+            }
+        }
+        return output;
+    }
+    FileUtils::closeFile(input);
+    return string();
+}
+
+} // namespace pdal
diff --git a/src/util/Georeference.cpp b/src/util/Georeference.cpp
new file mode 100644
index 0000000..e78cc89
--- /dev/null
+++ b/src/util/Georeference.cpp
@@ -0,0 +1,90 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/util/Georeference.hpp>
+
+#include <cmath>
+#include <iostream>
+#include <vector>
+
+
+namespace pdal
+{
+namespace georeference
+{
+
+
+namespace
+{
+
+
+static const double a = 6378137.0;
+static const double f = 1 / 298.257223563;
+static const double e2 = 2 * f - f * f;
+
+
+Xyz rotate(const Xyz& point, const RotationMatrix& matrix)
+{
+    return Xyz(
+        matrix.m00 * point.X + matrix.m01 * point.Y + matrix.m02 * point.Z,
+        matrix.m10 * point.X + matrix.m11 * point.Y + matrix.m12 * point.Z,
+        matrix.m20 * point.X + matrix.m21 * point.Y + matrix.m22 * point.Z);
+}
+
+
+Xyz cartesianToCurvilinear(const Xyz& point, double latitude)
+{
+    double w = std::sqrt(1 - e2 * std::sin(latitude) * std::sin(latitude));
+    double n = a / w;
+    double m = a * (1 - e2) / (w * w * w);
+    return Xyz(point.X / (n * std::cos(latitude)), point.Y / m, point.Z);
+}
+}
+
+
+Xyz georeferenceWgs84(double range, double scanAngle,
+                      const RotationMatrix& boresightMatrix,
+                      const RotationMatrix& imuMatrix, const Xyz& gpsPoint)
+{
+    Xyz pSocs = Xyz(range * std::sin(scanAngle), 0, -range * std::cos(scanAngle));
+
+    Xyz pSocsAligned = rotate(pSocs, boresightMatrix);
+    Xyz pLocalLevel = rotate(pSocsAligned, imuMatrix);
+    Xyz pCurvilinear = cartesianToCurvilinear(pLocalLevel, gpsPoint.Y);
+
+    return Xyz(gpsPoint.X + pCurvilinear.X, gpsPoint.Y + pCurvilinear.Y,
+               gpsPoint.Z + pCurvilinear.Z);
+}
+}
+}
diff --git a/src/util/Utils.cpp b/src/util/Utils.cpp
new file mode 100644
index 0000000..d1dae07
--- /dev/null
+++ b/src/util/Utils.cpp
@@ -0,0 +1,740 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <boost/algorithm/string/erase.hpp>
+#include <boost/filesystem.hpp>
+
+#include <pdal/util/Utils.hpp>
+
+#include <cassert>
+#include <cstdlib>
+#include <cctype>
+#include <random>
+
+#ifndef _WIN32
+#include <cxxabi.h>
+#include <sys/ioctl.h>
+#endif
+
+#ifdef PDAL_COMPILER_MSVC
+#  pragma warning(disable: 4127)  // conditional expression is constant
+#endif
+
+#if !defined(_WIN32)
+#include <dlfcn.h>
+#define DLL_LOAD_UNIX
+#else
+#include <windows.h>
+#define DLL_LOAD_WINDOWS
+#endif
+
+#include <stdio.h>
+#include <iomanip>
+
+using namespace std;
+
+namespace pdal
+{
+
+
+void Utils::random_seed(unsigned int seed)
+{
+    srand(seed);
+}
+
+
+double Utils::random(double minimum, double maximum)
+{
+    double r = (double)rand();  // [0..32767]
+    double v = (maximum - minimum) / (double)RAND_MAX;
+    double s = r * v; // [0..(max-min)]
+    double t = minimum + s; // [min..max]
+
+    assert(t >= minimum);
+    assert(t <= maximum);
+
+    return t;
+}
+
+
+double Utils::uniform(const double& minimum, const double& maximum,
+    uint32_t seed)
+{
+    std::mt19937 gen(seed);
+    std::uniform_real_distribution<double> dist(minimum, maximum);
+
+    return dist(gen);
+}
+
+
+double Utils::normal(const double& mean, const double& sigma, uint32_t seed)
+{
+    std::mt19937 gen(seed);
+    std::normal_distribution<double> dist(mean, sigma);
+
+    return dist(gen);
+}
+
+
+void* Utils::registerPlugin(void* stageFactoryPtr, string const& filename,
+    string const& registerMethod, string const& versionMethod)
+{
+    void* pRegister;
+    void* pVersion;
+
+    pVersion = Utils::getDLLSymbol(filename, versionMethod);
+
+    int plugins_version = ((int (*)()) pVersion)();
+
+    if (plugins_version != PDAL_PLUGIN_VERSION)
+    {
+        ostringstream oss;
+        oss << "Unable to register shared library '" << filename <<
+            "' with method name '" << registerMethod <<
+            "' version of plugin, '" << plugins_version <<
+            "' did not match PDALs version '" << PDAL_PLUGIN_VERSION << "'";
+        throw pdal_error(oss.str());
+    }
+
+
+    pRegister = Utils::getDLLSymbol(filename, registerMethod);
+    if (pRegister != NULL)
+    {
+        ((void (*)(void*)) pRegister)(stageFactoryPtr);
+    }
+    else
+    {
+        ostringstream oss;
+        oss << "Unable to register shared library '" << filename <<
+            "' with method name '" << registerMethod << "'";
+        throw pdal_error(oss.str());
+    }
+
+    return pRegister;
+}
+
+
+char* Utils::getenv(const char* env)
+{
+    return ::getenv(env);
+}
+
+
+string Utils::getenv(string const& name)
+{
+    char* value = ::getenv(name.c_str());
+    return value ? string(value) : string();
+}
+
+int Utils::putenv(const char* env)
+{
+#ifdef _WIN32
+    return ::_putenv(env);
+#else
+    return ::putenv(const_cast<char*>(env));
+#endif
+}
+
+void Utils::eatwhitespace(istream& s)
+{
+    while (true)
+    {
+        const char c = (char)s.peek();
+        if (!isspace(c))
+            break;
+
+        // throw it away
+        s.get();
+    }
+    return;
+}
+
+
+void Utils::trimLeading(std::string& s)
+{
+    size_t pos = 0;
+    // Note, that this should be OK in C++11, which guarantees a NULL.
+    while (isspace(s[pos]))
+        pos++;
+    s = s.substr(pos);
+}
+
+
+void Utils::trimTrailing(std::string& s)
+{
+    size_t pos = s.size() - 1;
+    while (isspace(s[pos]))
+    {
+        if (pos == 0)
+        {
+            s.clear();
+            return;
+        }
+        else
+            pos--;
+    }
+    s = s.substr(0, pos + 1);
+}
+
+
+bool Utils::eatcharacter(istream& s, char x)
+{
+    const char c = (char)s.peek();
+    if (c != x)
+        return false;
+
+    // throw it away
+    s.get();
+
+    return true;
+}
+
+uint32_t Utils::getStreamPrecision(double scale)
+{
+    double frac = 0;
+    double integer = 0;
+
+    frac = modf(scale, &integer);
+    return abs(floorl(log10(frac)));
+}
+
+void* Utils::getDLLSymbol(string const& library, string const& name)
+{
+    // Completely stolen from GDAL.
+    /***************************************************************************
+     * $Id: cplgetsymbol.cpp 16702 2009-04-01 20:42:49Z rouault $
+     *
+     * Project:  Common Portability Library
+     * Purpose:  Fetch a function pointer from a shared library / DLL.
+     * Author:   Frank Warmerdam, warmerdam at pobox.com
+     *
+     ***************************************************************************
+     * Copyright (c) 1999, Frank Warmerdam
+     *
+     * Permission is hereby granted, free of charge, to any person obtaining a
+     * copy of this software and associated documentation files
+     * (the "Software"),
+     * to deal in the Software without restriction, including without limitation
+     * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+     * and/or sell copies of the Software, and to permit persons to whom the
+     * Software is furnished to do so, subject to the following conditions:
+     *
+     * The above copyright notice and this permission notice shall be included
+     * in all copies or substantial portions of the Software.
+     *
+     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+     * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+     * MERCHANTABILITY,
+     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+     * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+     * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+     * OTHER DEALINGS IN THE SOFTWARE.
+     ****************************************************************************/
+
+    void* pLibrary = NULL;
+    void* pSymbol = NULL;
+
+#ifdef DLL_LOAD_UNIX
+    pLibrary = dlopen(library.c_str(), RTLD_LAZY);
+    if (pLibrary == NULL)
+    {
+        ostringstream oss;
+        oss << "Unable to open '" << library <<"' with error " << dlerror();
+        throw pdal_error(oss.str());
+    }
+
+    pSymbol = dlsym(pLibrary, name.c_str());
+#if (defined(__APPLE__) && defined(__MACH__))
+    /* On mach-o systems, C symbols have a leading underscore and depending
+     * on how dlcompat is configured it may or may not add the leading
+     * underscore.  So if dlsym() fails add an underscore and try again.
+     */
+    if (pSymbol == NULL)
+    {
+        ostringstream prefixed;
+        prefixed << "_" << name;
+        pSymbol = dlsym(pLibrary, prefixed.str().c_str());
+    }
+#endif
+
+    if (pSymbol == NULL)
+    {
+        ostringstream oss;
+        oss << "Opened library '" << library << "', but unable to open symbol "
+            "'" << name << "' with error " << dlerror();
+        throw pdal_error(oss.str());
+    }
+
+#endif
+
+#ifdef DLL_LOAD_WINDOWS
+
+    pLibrary = LoadLibrary(library.c_str());
+    if (pLibrary == NULL)
+    {
+        LPVOID      lpMsgBuf = NULL;
+        int         nLastError = GetLastError();
+
+        FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER
+                      | FORMAT_MESSAGE_FROM_SYSTEM
+                      | FORMAT_MESSAGE_IGNORE_INSERTS,
+                      NULL, nLastError,
+                      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                      (LPTSTR) &lpMsgBuf, 0, NULL);
+
+        ostringstream oss;
+        oss << "Can't load requested DLL '" << library <<
+            " with error code " << nLastError <<
+            " and message \"" << (const char *) lpMsgBuf <<"\"";
+        throw pdal_error(oss.str());
+    }
+
+    pSymbol = (void *) GetProcAddress((HINSTANCE) pLibrary, name.c_str());
+
+    if (pSymbol == NULL)
+    {
+        ostringstream oss;
+        oss << "Can't find requested entry point '" << name <<"'";
+        throw pdal_error(oss.str());
+    }
+
+
+#endif
+    return pSymbol;
+}
+
+
+string Utils::base64_encode(const unsigned char *bytes_to_encode, size_t in_len)
+{
+
+    /*
+        base64.cpp and base64.h
+
+        Copyright (C) 2004-2008 René Nyffenegger
+
+        This source code is provided 'as-is', without any express or implied
+        warranty. In no event will the author be held liable for any damages
+        arising from the use of this software.
+
+        Permission is granted to anyone to use this software for any purpose,
+        including commercial applications, and to alter it and redistribute it
+        freely, subject to the following restrictions:
+
+        1. The origin of this source code must not be misrepresented;
+           you must not claim that you wrote the original source code. If you
+           use this source code in a product, an acknowledgment in the product
+           documentation would be appreciated but is not required.
+
+        2. Altered source versions must be plainly marked as such, and must
+           not be misrepresented as being the original source code.
+
+        3. This notice may not be removed or altered from any source
+           distribution.
+
+        René Nyffenegger rene.nyffenegger at adp-gmbh.ch
+    */
+
+    if (in_len == 0)
+        return string();
+
+    const string base64_chars =
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz"
+        "0123456789+/";
+    string ret;
+    int i = 0;
+    int j = 0;
+    uint8_t char_array_3[3];
+    uint8_t char_array_4[4];
+
+    while (in_len--)
+    {
+        char_array_3[i++] = *(bytes_to_encode++);
+        if (i == 3)
+        {
+            char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+            char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
+                ((char_array_3[1] & 0xf0) >> 4);
+            char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
+                ((char_array_3[2] & 0xc0) >> 6);
+            char_array_4[3] = char_array_3[2] & 0x3f;
+
+            for (i = 0; (i <4) ; i++)
+                ret += base64_chars[char_array_4[i]];
+            i = 0;
+        }
+    }
+
+    if (i)
+    {
+        for (j = i; j < 3; j++)
+            char_array_3[j] = '\0';
+
+        char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+        char_array_4[1] = ((char_array_3[0] & 0x03) << 4) +
+            ((char_array_3[1] & 0xf0) >> 4);
+        char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) +
+            ((char_array_3[2] & 0xc0) >> 6);
+        char_array_4[3] = char_array_3[2] & 0x3f;
+
+        for (j = 0; (j < i + 1); j++)
+            ret += base64_chars[char_array_4[j]];
+
+        while ((i++ < 3))
+            ret += '=';
+    }
+    return ret;
+}
+
+
+static inline bool is_base64(unsigned char c)
+{
+    return (isalnum(c) || (c == '+') || (c == '/'));
+}
+
+
+vector<uint8_t> Utils::base64_decode(string const& encoded_string)
+{
+    const string base64_chars =
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+        "abcdefghijklmnopqrstuvwxyz"
+        "0123456789+/";
+
+    string::size_type in_len = encoded_string.size();
+    int i = 0;
+    int j = 0;
+    int in_ = 0;
+    unsigned char char_array_4[4], char_array_3[3];
+    vector<uint8_t> ret;
+
+    while (in_len-- && (encoded_string[in_] != '=') &&
+        is_base64(encoded_string[in_]))
+    {
+        char_array_4[i++] = encoded_string[in_];
+        in_++;
+        if (i == 4)
+        {
+            for (i = 0; i <4; i++)
+                char_array_4[i] = static_cast<unsigned char>(
+                    base64_chars.find(char_array_4[i]));
+
+            char_array_3[0] = (char_array_4[0] << 2) +
+                ((char_array_4[1] & 0x30) >> 4);
+            char_array_3[1] = ((char_array_4[1] & 0xf) << 4) +
+                ((char_array_4[2] & 0x3c) >> 2);
+            char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+            for (i = 0; (i < 3); i++)
+                ret.push_back(char_array_3[i]);
+            i = 0;
+        }
+    }
+
+    if (i)
+    {
+        for (j = i; j <4; j++)
+            char_array_4[j] = 0;
+
+        for (j = 0; j <4; j++)
+            char_array_4[j] =
+                static_cast<unsigned char>(base64_chars.find(char_array_4[j]));
+
+        char_array_3[0] = (char_array_4[0] << 2) +
+            ((char_array_4[1] & 0x30) >> 4);
+        char_array_3[1] = ((char_array_4[1] & 0xf) << 4) +
+            ((char_array_4[2] & 0x3c) >> 2);
+        char_array_3[2] = ((char_array_4[2] & 0x3) << 6) +
+            char_array_4[3];
+
+        for (j = 0; (j < i - 1); j++)
+            ret.push_back(char_array_3[j]);
+    }
+    return ret;
+}
+
+FILE* Utils::portable_popen(const string& command, const string& mode)
+{
+#ifdef _WIN32
+    const string dos_command = Utils::replaceAll(command, "/", "\\");
+    return _popen(dos_command.c_str(), mode.c_str());
+#else
+    return popen(command.c_str(), mode.c_str());
+#endif
+}
+
+int Utils::portable_pclose(FILE* fp)
+{
+    int status = 0;
+
+#ifdef _WIN32
+    status = _pclose(fp);
+#else
+    status = pclose(fp);
+    if (status == -1)
+    {
+        throw runtime_error("error executing command");
+    }
+    if (WIFEXITED(status) != 0)
+    {
+        status = WEXITSTATUS(status);
+    }
+    else
+    {
+        status = 0;
+    }
+#endif
+
+    return status;
+}
+
+
+// BUG:
+// Under unix, the pclose() operation causes the boost unit test system
+// to produce a fatal error iff the process started by popen returns a
+// nonzero status code.  For this reason, I've put all the "negative"
+// cmd line app tests under #ifdef PDAL_COMPILER_MSVC.
+//
+// This problem shows up on mpg's Ubuntu 11.4 machine (gcc 4.5.2, boost 1.47.0)
+// as well as on Hobu's machine.
+
+// Boost's unit test system has a flag on the execution monitor that catches
+// all signals --  p_catch_system_errors, and throws unittest errors when
+// it sees them. We can use --catch_system_errors=no as part of the invocation,
+// or manually turn them off in the execution monitor. -- hobu 7/12/2012
+//  boost::unit_test::unit_test_monitor.p_catch_system_errors.set (false);
+// #include <boost/test/unit_test_monitor.hpp>
+
+int Utils::run_shell_command(const string& cmd, string& output)
+{
+    const int maxbuf = 4096;
+    char buf[maxbuf];
+
+    output = "";
+
+    const char* gdal_debug = ::pdal::Utils::getenv("CPL_DEBUG");
+    if (gdal_debug == 0)
+    {
+        pdal::Utils::putenv("CPL_DEBUG=OFF");
+    }
+
+    FILE* fp = portable_popen(cmd.c_str(), "r");
+
+    while (!feof(fp))
+    {
+        if (fgets(buf, maxbuf, fp) == NULL)
+        {
+            if (feof(fp)) break;
+            if (ferror(fp)) break;
+        }
+        output += buf;
+    }
+    return portable_pclose(fp);
+}
+
+
+string Utils::replaceAll(string result, const string& replaceWhat,
+    const string& replaceWithWhat)
+{
+    size_t pos = 0;
+    while (1)
+    {
+        pos = result.find(replaceWhat, pos);
+        if (pos == string::npos)
+            break;
+        result.replace(pos, replaceWhat.size(), replaceWithWhat);
+        pos += replaceWithWhat.size();
+        if (pos >= result.size())
+            break;
+    }
+    return result;
+}
+
+
+// Adapted from http://stackoverflow.com/a/11969098.
+std::string Utils::escapeJSON(const string &str)
+{
+    std::string escaped(str);
+
+    escaped.erase
+    (
+        remove_if
+        (
+            escaped.begin(),
+            escaped.end(),
+            [](const char c)
+            {
+                return (c <= 31);
+            }
+        ),
+        escaped.end()
+    );
+
+    size_t pos(0);
+
+    while((pos = escaped.find_first_of("\"\\/", pos)) != string::npos)
+    {
+        escaped.insert(pos, "\\");
+        pos += 2;
+    }
+
+    return escaped;
+}
+
+/// Break a string into a list of strings, none of which exceeds a specified
+/// length.
+/// \param[in] inputString  String to split
+/// \param[in] lineLength  Maximum length of any of the output strings
+/// \return  List of string split from input.
+///
+StringList Utils::wordWrap(string const& inputString, size_t lineLength)
+{
+    // stolen from http://stackoverflow.com/questions/5815227/fix-improve-word-wrap-function
+
+    StringList output;
+
+    istringstream iss(inputString);
+    string line;
+    do
+    {
+        string word;
+        iss >> word;
+
+        if (line.length() + word.length() > lineLength)
+        {
+            output.push_back(line);
+            line.clear();
+        }
+        line += word + " ";
+
+    } while (iss);
+
+    if (!line.empty())
+        output.push_back(line);
+    return output;
+}
+
+
+/// Demangle strings using the compiler-provided demangle function.
+/// \param[in] s  String to be demangled.
+/// \return  Demangled string
+std::string Utils::demangle(const std::string& s)
+{
+#ifndef _WIN32
+    int status;
+    std::unique_ptr<char[], void (*)(void*)> result(
+            abi::__cxa_demangle(s.c_str(), 0, 0, &status), std::free);
+    return std::string(result.get());
+#else
+    return s;
+#endif
+}
+
+
+int Utils::screenWidth()
+{
+#ifdef WIN32
+    return 80;
+#else
+    struct winsize ws;
+    ioctl(0, TIOCGWINSZ, &ws);
+
+    return ws.ws_col;
+#endif
+}
+
+
+std::string Utils::escapeNonprinting(const std::string& s)
+{
+    std::string out;
+
+    for (size_t i = 0; i < s.size(); ++i)
+    {
+        if (s[i] == '\n')
+            out += "\\n";
+        else if (s[i] == '\a')
+            out += "\\a";
+        else if (s[i] == '\b')
+            out += "\\b";
+        else if (s[i] == '\r')
+            out += "\\r";
+        else if (s[i] == '\v')
+            out += "\\v";
+        else if (s[i] < 32)
+        {
+            std::stringstream oss;
+            oss << std::hex << std::setfill('0') << std::setw(2) << (int)s[i];
+            out += "\\x" + oss.str();
+        }
+        else
+            out += s[i];
+    }
+    return out;
+}
+
+// Useful for debug on occasion.
+std::string Utils::hexDump(const char *buf, size_t count)
+{
+   const unsigned char *cp = reinterpret_cast<const unsigned char *>(buf);
+   char foo[80];
+   int bytes, i, address = 0;
+   std::string out;
+
+   bytes = (count > 16) ? 16 : count;
+
+   while (bytes) {
+      sprintf(foo, "0x%06x ", address);
+      address += 16;
+      for (i = 0; i < 16; i++) {
+         if (i < bytes) {
+            sprintf(foo, "%02X ", cp[i]);
+            out += foo;
+         }
+         else
+            out += "   ";
+      }
+      out += "|";
+      for (i = 0; i < bytes; i++) {
+         sprintf(foo, "%c", isprint(cp[i]) ? cp[i] : '.');
+         out += foo;
+      }
+      out += "|\n";
+      count -= bytes;
+      cp += bytes;
+      bytes = (count > 16) ? 16 : count;
+   }
+   return (out);
+}
+
+} // namespace pdal
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..1bb2934
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,8 @@
+###############################################################################
+#
+# test/CMakeLists.txt controls building of PDAL tests
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+###############################################################################
+add_subdirectory(unit)
diff --git a/test/data/apps/pdalinfo_point.txt b/test/data/apps/pdalinfo_point.txt
new file mode 100644
index 0000000..05469ee
--- /dev/null
+++ b/test/data/apps/pdalinfo_point.txt
@@ -0,0 +1,28 @@
+Point 0
+--------------------------------------------------------------------------------
+
+=================== ======================================= =================== 
+            Name                                Value        Namespace
+=================== ======================================= =================== 
+X                                        636896.32999999996  readers.las
+Y                                        849087.70000000007  readers.las
+Z                                        446.38999999999999  readers.las
+Intensity                                                18  readers.las
+ReturnNumber                                              1  readers.las
+NumberOfReturns                                           2  readers.las
+ScanDirectionFlag                                         1  readers.las
+EdgeOfFlightLine                                          0  readers.las
+Classification                                            1  readers.las
+ScanAngleRank                                           -11  readers.las
+UserData                                                128  readers.las
+PointSourceId                                          7326  readers.las
+Time                                     245381.45279923646  readers.las
+Red                                                      54  readers.las
+Green                                                    66  readers.las
+Blue                                                     68  readers.las
+=================== ======================================= =================== 
+
+
+
+
+
diff --git a/test/data/apps/pdalinfo_schema.txt b/test/data/apps/pdalinfo_schema.txt
new file mode 100644
index 0000000..a6ff78f
--- /dev/null
+++ b/test/data/apps/pdalinfo_schema.txt
@@ -0,0 +1,453 @@
+
+Schema
+--------------------------------------------------------------------------------
+
+point-oriented schema has 16 dimensions and a total size of 37 bytes. 
+
+===================================== ========== ========== ========= ========= 
+                              Name      Scale     Offset      Type      Size
+===================================== ========== ========== ========= ========= 
+readers.las.X                        0.01         -0   int32_t         4
+readers.las.Y                        0.01         -0   int32_t         4
+readers.las.Z                        0.01         -0   int32_t         4
+readers.las.Intensity                   1          0  uint16_t         2
+readers.las.ReturnNumber                1          0   uint8_t         1
+readers.las.NumberOfReturns             1          0   uint8_t         1
+readers.las.ScanDirectionFlag           1          0   uint8_t         1
+readers.las.EdgeOfFlightLine            1          0   uint8_t         1
+readers.las.Classification              1          0   uint8_t         1
+readers.las.ScanAngleRank               1          0    int8_t         1
+readers.las.UserData                    1          0   uint8_t         1
+readers.las.PointSourceId               1          0  uint16_t         2
+readers.las.Time                        1          0    double         8
+readers.las.Red                         1          0  uint16_t         2
+readers.las.Green                       1          0  uint16_t         2
+readers.las.Blue                        1          0  uint16_t         2
+===================================== ========== ========== ========= ========= 
+
+readers.las.X
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                    X
+Namespace                                              readers.las
+Position                                                                0
+ByteSize                                                                4
+Ignored?                                                                0
+UUID                                 2ee118d1-119e-4906-99c3-42934203f872
+Parent                                                               None
+Offset                                                                  0
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                0.01
+Offset                                                                 -0
+Description                      X coordinate as a long integer. You must 
+                                 use the scale and offset information of  
+                                 the header to determine the double       
+                                 value.                                   
+================================ ======================================== 
+
+readers.las.Y
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                    Y
+Namespace                                              readers.las
+Position                                                                1
+ByteSize                                                                4
+Ignored?                                                                0
+UUID                                 87707eee-2f30-4979-9987-8ef747e30275
+Parent                                                               None
+Offset                                                                  4
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                0.01
+Offset                                                                 -0
+Description                      Y coordinate as a long integer. You must 
+                                 use the scale and offset information of  
+                                 the header to determine the double       
+                                 value.                                   
+================================ ======================================== 
+
+readers.las.Z
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                    Z
+Namespace                                              readers.las
+Position                                                                2
+ByteSize                                                                4
+Ignored?                                                                0
+UUID                                 e74b5e41-95e6-4cf2-86ad-e3f5a996da5d
+Parent                                                               None
+Offset                                                                  8
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                0.01
+Offset                                                                 -0
+Description                      Z coordinate as a long integer. You must 
+                                 use the scale and offset information of  
+                                 the header to determine the double       
+                                 value.                                   
+================================ ======================================== 
+
+readers.las.Intensity
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                            Intensity
+Namespace                                              readers.las
+Position                                                                3
+ByteSize                                                                2
+Ignored?                                                                0
+UUID                                 61e90c9a-42fc-46c7-acd3-20d67bd5626f
+Parent                                                               None
+Offset                                                                 12
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The intensity value is the integer       
+                                 representation of the pulse return       
+                                 magnitude. This value is optional and    
+                                 system specific. However, it should      
+                                 always be included if available.         
+================================ ======================================== 
+
+readers.las.ReturnNumber
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                         ReturnNumber
+Namespace                                              readers.las
+Position                                                                4
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 ffe5e5f8-4cec-4560-abf0-448008f7b89e
+Parent                                                               None
+Offset                                                                 14
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      Return Number: The Return Number is the  
+                                 pulse return number for a given output   
+                                 pulse. A given output laser pulse can    
+                                 have many returns, and they must be      
+                                 marked in sequence of return. The first  
+                                 return will have a Return Number of one, 
+                                 the second a Return Number of two, and   
+                                 so on up to five returns.                
+================================ ======================================== 
+
+readers.las.NumberOfReturns
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                      NumberOfReturns
+Namespace                                              readers.las
+Position                                                                5
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 7c28bfd4-a9ed-4fb2-b07f-931c076fbaf0
+Parent                                                               None
+Offset                                                                 15
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      Number of Returns (for this emitted      
+                                 pulse): The Number of Returns is the     
+                                 total number of returns for a given      
+                                 pulse. For example, a laser data point   
+                                 may be return two (Return Number) within 
+                                 a total number of five returns.          
+================================ ======================================== 
+
+readers.las.ScanDirectionFlag
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                    ScanDirectionFlag
+Namespace                                              readers.las
+Position                                                                6
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 13019a2c-cf88-480d-a995-0162055fe5f9
+Parent                                                               None
+Offset                                                                 16
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The Scan Direction Flag denotes the      
+                                 direction at which the scanner mirror    
+                                 was traveling at the time of the output  
+                                 pulse. A bit value of 1 is a positive    
+                                 scan direction, and a bit value of 0 is  
+                                 a negative scan direction (where         
+                                 positive scan direction is a scan moving 
+                                 from the left side of the in-track       
+                                 direction to the right side and negative 
+                                 the opposite).                           
+================================ ======================================== 
+
+readers.las.EdgeOfFlightLine
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                     EdgeOfFlightLine
+Namespace                                              readers.las
+Position                                                                7
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 108c18f2-5cc0-4669-ae9a-f41eb4006ea5
+Parent                                                               None
+Offset                                                                 17
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The Edge of Flight Line data bit has a   
+                                 value of 1 only when the point is at the 
+                                 end of a scan. It is the last point on a 
+                                 given scan line before it changes        
+                                 direction.                               
+================================ ======================================== 
+
+readers.las.Classification
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                       Classification
+Namespace                                              readers.las
+Position                                                                8
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 b4c67de9-cef1-432c-8909-7c751b2a4e0b
+Parent                                                               None
+Offset                                                                 18
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      Classification in LAS 1.0 was            
+                                 essentially user defined and optional.   
+                                 LAS 1.1 defines a standard set of ASPRS  
+                                 classifications. In addition, the field  
+                                 is now mandatory. If a point has never   
+                                 been classified, this byte must be set   
+                                 to zero. There are no user defined       
+                                 classes since both point format 0 and    
+                                 point format 1 supply 8 bits per point   
+                                 for user defined operations. Note that   
+                                 the format for classification is a bit   
+                                 encoded field with the lower five bits   
+                                 used for class and the three high bits   
+                                 used for flags.                          
+================================ ======================================== 
+
+readers.las.ScanAngleRank
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                        ScanAngleRank
+Namespace                                              readers.las
+Position                                                                9
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 aaadaf77-e0c9-4df0-81a7-27060794cd69
+Parent                                                               None
+Offset                                                                 19
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The Scan Angle Rank is a signed one-byte 
+                                 number with a valid range from -90 to    
+                                 +90. The Scan Angle Rank is the angle    
+                                 (rounded to the nearest integer in the   
+                                 absolute value sense) at which the laser 
+                                 point was output from the laser system   
+                                 including the roll of the aircraft. The  
+                                 scan angle is within 1 degree of         
+                                 accuracy from +90 to 90 degrees. The     
+                                 scan angle is an angle based on 0        
+                                 degrees being nadir, and 90 degrees to   
+                                 the left side of the aircraft in the     
+                                 direction of flight.                     
+================================ ======================================== 
+
+readers.las.UserData
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                             UserData
+Namespace                                              readers.las
+Position                                                               10
+ByteSize                                                                1
+Ignored?                                                                0
+UUID                                 70eb558e-63d4-4804-b1db-fc2fd716927c
+Parent                                                               None
+Offset                                                                 20
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      This field may be used at the users      
+                                 discretion                               
+================================ ======================================== 
+
+readers.las.PointSourceId
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                        PointSourceId
+Namespace                                              readers.las
+Position                                                               11
+ByteSize                                                                2
+Ignored?                                                                0
+UUID                                 4e42e96a-6af0-4fdd-81cb-6216ff47bf6b
+Parent                                                               None
+Offset                                                                 21
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      This value indicates the file from which 
+                                 this point originated. Valid values for  
+                                 this field are 1 to 65,535 inclusive     
+                                 with zero being used for a special case  
+                                 discussed below. The numerical value     
+                                 corresponds to the File Source ID from   
+                                 which this point originated. Zero is     
+                                 reserved as a convenience to system      
+                                 implementers. A Point Source ID of zero  
+                                 implies that this point originated in    
+                                 this file. This implies that processing  
+                                 software should set the Point Source ID  
+                                 equal to the File Source ID of the file  
+                                 containing this point at some time       
+                                 during processing.                       
+================================ ======================================== 
+
+readers.las.Time
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                 Time
+Namespace                                              readers.las
+Position                                                               12
+ByteSize                                                                8
+Ignored?                                                                0
+UUID                                 aec43586-2711-4e59-9df0-65aca78a4ffc
+Parent                                                               None
+Offset                                                                 23
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The GPS Time is the double floating      
+                                 point time tag value at which the point  
+                                 was acquired. It is GPS Week Time if the 
+                                 Global Encoding low bit is clear and     
+                                 Adjusted Standard GPS Time if the Global 
+                                 Encoding low bit is set (see Global      
+                                 Encoding in the Public Header Block      
+                                 description).                            
+================================ ======================================== 
+
+readers.las.Red
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                  Red
+Namespace                                              readers.las
+Position                                                               13
+ByteSize                                                                2
+Ignored?                                                                0
+UUID                                 a42ce297-6aa2-4a62-bd29-2db19ba862d5
+Parent                                                               None
+Offset                                                                 31
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The red image channel value associated   
+                                 with this point                          
+================================ ======================================== 
+
+readers.las.Green
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                Green
+Namespace                                              readers.las
+Position                                                               14
+ByteSize                                                                2
+Ignored?                                                                0
+UUID                                 7752759d-5713-48cd-9842-51db350cc979
+Parent                                                               None
+Offset                                                                 33
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The green image channel value associated 
+                                 with this point                          
+================================ ======================================== 
+
+readers.las.Blue
+................................................................................
+
+================================ ======================================== 
+Name                                                           Value
+================================ ======================================== 
+Name                                                                 Blue
+Namespace                                              readers.las
+Position                                                               15
+ByteSize                                                                2
+Ignored?                                                                0
+UUID                                 5c1a99c8-1829-4d5b-8735-4f6f393a7970
+Parent                                                               None
+Offset                                                                 35
+Maximum                                                                 0
+Minimum                                                                 0
+Scale                                                                   1
+Offset                                                                  0
+Description                      The blue image channel value associated  
+                                 with this point                          
+================================ ======================================== 
+
+
+
diff --git a/test/data/apps/pdalinfo_stage.txt b/test/data/apps/pdalinfo_stage.txt
new file mode 100644
index 0000000..9999470
--- /dev/null
+++ b/test/data/apps/pdalinfo_stage.txt
@@ -0,0 +1,28 @@
+{
+    "name": "readers.las",
+    "id": "0",
+    "description": "Las Reader",
+    "options":
+    {
+        "Option":
+        {
+            "Name": "debug",
+            "Value": "false"
+        },
+        "Option":
+        {
+            "Name": "filename",
+            "Value": ".\/apps\/simple.las"
+        },
+        "Option":
+        {
+            "Name": "verbose",
+            "Value": "0"
+        }
+    },
+    "NumPoints": "1065",
+    "Bounds": "([635620, 638983], [848900, 853535], [406.59, 586.38])",
+    "SRS": "",
+    "Compression": "false"
+}
+
diff --git a/test/data/apps/pdalinfo_stage_nosrs.txt b/test/data/apps/pdalinfo_stage_nosrs.txt
new file mode 100644
index 0000000..d26e615
--- /dev/null
+++ b/test/data/apps/pdalinfo_stage_nosrs.txt
@@ -0,0 +1,27 @@
+{
+    "name": "readers.las",
+    "id": "0",
+    "description": "Las Reader",
+    "options":
+    {
+        "Option":
+        {
+            "Name": "debug",
+            "Value": "false"
+        },
+        "Option":
+        {
+            "Name": "filename",
+            "Value": "..\/..\/test\/data\/apps\/simple.las"
+        },
+        "Option":
+        {
+            "Name": "verbose",
+            "Value": "0"
+        }
+    },
+    "NumPoints": "1065",
+    "Bounds": "([635620, 638983], [848900, 853535], [406.59, 586.38])",
+    "SRS": "SpatialReference data is not available without GDAL+libgeotiff support",
+    "Compression": "false"
+}
diff --git a/test/data/apps/pdalinfo_stats-win32.txt b/test/data/apps/pdalinfo_stats-win32.txt
new file mode 100644
index 0000000..80dd1a5
--- /dev/null
+++ b/test/data/apps/pdalinfo_stats-win32.txt
@@ -0,0 +1,2017 @@
+{
+    "stats":
+    {
+        "X":
+        {
+            "count": "1065",
+            "minimum": "635619.85",
+            "maximum": "638982.5500000001",
+            "average": "637296.7351830986",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "635451.715",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "635619.85",
+                    "count": "41"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "635787.985",
+                    "count": "48"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "635956.12",
+                    "count": "62"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "636124.255",
+                    "count": "54"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "636292.39",
+                    "count": "58"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "636460.525",
+                    "count": "55"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "636628.66",
+                    "count": "57"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "636796.795",
+                    "count": "54"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "636964.9300000001",
+                    "count": "50"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "637133.0650000001",
+                    "count": "49"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "637301.2",
+                    "count": "60"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "637469.335",
+                    "count": "61"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "637637.47",
+                    "count": "50"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "637805.605",
+                    "count": "56"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "637973.74",
+                    "count": "60"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "638141.875",
+                    "count": "52"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "638310.01",
+                    "count": "46"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "638478.145",
+                    "count": "51"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "638646.28",
+                    "count": "53"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "638814.415",
+                    "count": "47"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "638982.5500000001",
+                    "count": "1"
+                }
+            },
+            "sample": "637012 636896 636785 636699 636602 636452 636327 636268 636199 636146 636038 636044 635883 635869 635795 635752 635718 635674 635620 635640 635742 635761 635684 635681 635791 635873 635817 635816 635823 635852 635948 635980 635961 635979 636075 636046 635994 636052 636052 636087 636272 636145 636216 636341 636216 636238 636340 636460 636407 636525 636541 636551 636598 636451 636642 636726 636645 636770 636739 636579 636607 636703 636896 636873 636699 636952 636757  [...]
+            "position": "0"
+        },
+        "Y":
+        {
+            "count": "1065",
+            "minimum": "848899.7000000001",
+            "maximum": "853535.4300000001",
+            "average": "851249.5384882618",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "848667.9135",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "848899.7000000001",
+                    "count": "38"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "849131.4865000001",
+                    "count": "54"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "849363.273",
+                    "count": "41"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "849595.0595000001",
+                    "count": "41"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "849826.846",
+                    "count": "73"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "850058.6325000001",
+                    "count": "70"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "850290.4190000001",
+                    "count": "45"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "850522.2055",
+                    "count": "73"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "850753.9920000001",
+                    "count": "41"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "850985.7785",
+                    "count": "44"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "851217.5650000001",
+                    "count": "60"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "851449.3515000001",
+                    "count": "56"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "851681.138",
+                    "count": "44"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "851912.9245000001",
+                    "count": "65"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "852144.711",
+                    "count": "53"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "852376.4975000001",
+                    "count": "59"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "852608.2840000001",
+                    "count": "47"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "852840.0705",
+                    "count": "50"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "853071.8570000001",
+                    "count": "71"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "853303.6435",
+                    "count": "39"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "853535.4300000001",
+                    "count": "1"
+                }
+            },
+            "sample": "849028 849088 849107 848991 849019 849251 849372 849261 849238 849170 849338 849006 849391 849206 849310 849347 849050 849017 850064 849759 850053 849985 849494 849363 849751 850003 849587 849427 849299 849271 849589 849609 849380 849336 849719 849442 849048 849248 849107 849150 850050 849152 849401 849987 849010 849008 849452 849996 849568 850058 849980 849845 849903 849039 849804 850063 849592 850057 849828 849032 849054 849271 850024 849839 848972 850014 849035  [...]
+            "position": "1"
+        },
+        "Z":
+        {
+            "count": "1065",
+            "minimum": "406.59",
+            "maximum": "586.38",
+            "average": "434.0978403755871",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "397.6005",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "406.59",
+                    "count": "59"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "415.5795000000001",
+                    "count": "443"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "424.569",
+                    "count": "255"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "433.5585",
+                    "count": "78"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "442.548",
+                    "count": "62"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "451.5375",
+                    "count": "37"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "460.527",
+                    "count": "34"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "469.5165",
+                    "count": "28"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "478.506",
+                    "count": "18"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "487.4955",
+                    "count": "15"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "496.485",
+                    "count": "9"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "505.4745",
+                    "count": "4"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "514.4639999999999",
+                    "count": "7"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "523.4535",
+                    "count": "7"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "532.443",
+                    "count": "5"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "541.4325",
+                    "count": "1"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "550.422",
+                    "count": "1"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "559.4114999999999",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "568.401",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "577.3905",
+                    "count": "1"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "586.38",
+                    "count": "1"
+                }
+            },
+            "sample": "431.66 446.39 426.71 425.39 425.1 435.17 408.6 427.92 428.05 428.15 423.06 427.95 423.69 444.46 426.61 426.25 428.67 428.02 447.01 422.74 424.64 425.72 407.12 421.56 413.42 424.44 407.32 447.57 426.61 428.54 407.25 407.22 438.02 424.28 410.47 406.59 427.95 427.99 427.99 427.95 425.2 428.02 407.97 494.03 428.12 428.15 409.06 426.05 410.27 445.96 426.61 414.93 487.83 428.61 417.55 447.21 411.19 447.01 500.26 428.15 425.89 411.15 455.41 531.2 425.62 495.44 426.48 426. [...]
+            "position": "2"
+        },
+        "Intensity":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "254",
+            "average": "76.39530516431925",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "-12.7",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "0",
+                    "count": "186"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "12.7",
+                    "count": "131"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "25.4",
+                    "count": "106"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "38.09999999999999",
+                    "count": "56"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "50.8",
+                    "count": "64"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "63.5",
+                    "count": "52"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "76.19999999999999",
+                    "count": "39"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "88.89999999999999",
+                    "count": "48"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "101.6",
+                    "count": "48"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "114.3",
+                    "count": "48"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "127",
+                    "count": "66"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "139.7",
+                    "count": "64"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "152.4",
+                    "count": "52"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "165.1",
+                    "count": "37"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "177.8",
+                    "count": "30"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "190.5",
+                    "count": "12"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "203.2",
+                    "count": "9"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "215.9",
+                    "count": "9"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "228.6",
+                    "count": "5"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "241.3",
+                    "count": "2"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "254",
+                    "count": "1"
+                }
+            },
+            "sample": "143 18 118 100 124 48 3 207 142 124 147 75 63 1 146 91 167 153 1 25 188 4 48 58 77 33 224 4 179 181 182 2 2 98 63 23 120 154 116 118 57 115 4 2 67 93 95 0 142 17 108 2 98 183 159 137 139 136 1 98 153 37 6 10 96 8 171 157 35 27 11 5 125 6 154 83 158 151 57 3 56 81 82 10 1 5 142 5 105 7 188 24 27 2 216 233 165 7 3 0 0 228 156 239 217 127 1 38 2 124 43 158 97 12 2 22 74 12 70 2 33 51 0 128 143 159 22 1 63 136 141 83 9 15 133 21 127 24 13 141 153 104 109 133 64 114 0 2 [...]
+            "position": "3"
+        },
+        "ReturnNumber":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "4",
+            "average": "1.16056338028169",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "0.85",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "1",
+                    "count": "925"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "1.15",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "1.3",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "1.45",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "1.6",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "1.75",
+                    "count": "-0"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "1.9",
+                    "count": "114"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "2.05",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "2.2",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "2.35",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "2.5",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "2.65",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "2.8",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "2.95",
+                    "count": "21"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "3.1",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "3.25",
+                    "count": "-0"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "3.4",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "3.55",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "3.7",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "3.85",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "4",
+                    "count": "5"
+                }
+            },
+            "sample": "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 3 1 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 2 2 2 2 1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 4 1 1 1 1 2 1 1 1 1 3 1 1 2 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 2 1 1 1 1 1 2 1 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 1 2 1 2 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 1 1 1 1 1 1 2 3 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 [...]
+            "counts":
+            {
+                "count-1":
+                {
+                    "value": "1",
+                    "count": "925"
+                },
+                "count-2":
+                {
+                    "value": "2",
+                    "count": "114"
+                },
+                "count-3":
+                {
+                    "value": "3",
+                    "count": "21"
+                },
+                "count-4":
+                {
+                    "value": "4",
+                    "count": "5"
+                }
+            },
+            "position": "4"
+        },
+        "NumberOfReturns":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "4",
+            "average": "1.344600938967136",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "0.85",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "1",
+                    "count": "789"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "1.15",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "1.3",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "1.45",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "1.6",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "1.75",
+                    "count": "-0"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "1.9",
+                    "count": "195"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "2.05",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "2.2",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "2.35",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "2.5",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "2.65",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "2.8",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "2.95",
+                    "count": "71"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "3.1",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "3.25",
+                    "count": "-0"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "3.4",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "3.55",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "3.7",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "3.85",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "4",
+                    "count": "10"
+                }
+            },
+            "sample": "1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 3 1 2 1 1 1 3 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 3 1 1 1 3 1 3 1 2 1 1 1 1 1 1 2 1 1 1 2 2 1 1 1 1 1 2 2 2 2 1 1 1 1 1 2 1 1 2 2 3 3 2 1 3 2 1 1 1 2 3 1 1 1 2 3 2 4 1 1 1 1 2 1 2 1 1 3 1 1 2 2 1 1 3 1 1 1 2 2 1 1 1 1 1 1 1 1 2 2 3 1 1 1 1 2 1 1 1 1 1 2 1 3 1 2 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 2 3 2 1 3 1 2 1 1 1 2 1 3 2 2 2 1 1 1 3 1 1 1 1 1 1 1 2 2 2 1 1 3 1 1 1 1 1 1 2 2 1 1 4 4 1 2 2 3 1 3 2 3 1 3 1 1 3 2 1 1 1 1 2 1 3 1 1 1 1 1 [...]
+            "counts":
+            {
+                "count-1":
+                {
+                    "value": "1",
+                    "count": "789"
+                },
+                "count-2":
+                {
+                    "value": "2",
+                    "count": "195"
+                },
+                "count-3":
+                {
+                    "value": "3",
+                    "count": "71"
+                },
+                "count-4":
+                {
+                    "value": "4",
+                    "count": "10"
+                }
+            },
+            "position": "5"
+        },
+        "ScanDirectionFlag":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "1",
+            "average": "0.5323943661971831",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "-0.05",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "0",
+                    "count": "498"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "0.05",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "0.1",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "0.15",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "0.2",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "0.25",
+                    "count": "-0"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "0.3",
+                    "count": "-0"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "0.35",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "0.4",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "0.45",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "0.5",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "0.55",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "0.6000000000000001",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "0.65",
+                    "count": "-0"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "0.7000000000000001",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "0.75",
+                    "count": "-0"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "0.8",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "0.8500000000000001",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "0.9",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "0.9500000000000001",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "1",
+                    "count": "567"
+                }
+            },
+            "sample": "1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 0 [...]
+            "position": "6"
+        },
+        "EdgeOfFlightLine":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "0",
+            "average": "0",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "0",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "0",
+                    "count": "1065"
+                }
+            },
+            "sample": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [...]
+            "position": "7"
+        },
+        "Classification":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "2",
+            "average": "1.259154929577465",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "0.95",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "1",
+                    "count": "789"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "1.05",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "1.1",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "1.15",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "1.2",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "1.25",
+                    "count": "-0"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "1.3",
+                    "count": "-0"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "1.35",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "1.4",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "1.45",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "1.5",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "1.55",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "1.6",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "1.65",
+                    "count": "-0"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "1.7",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "1.75",
+                    "count": "-0"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "1.8",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "1.85",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "1.9",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "1.95",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "2",
+                    "count": "276"
+                }
+            },
+            "sample": "1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 2 1 1 1 2 2 1 1 1 2 2 1 1 2 1 1 2 1 1 1 1 1 1 2 2 1 1 1 2 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 2 2 1 1 1 1 2 1 1 1 2 1 1 1 1 1 2 2 1 2 2 1 1 1 1 1 2 1 1 2 2 1 1 2 1 2 2 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2 1 2 1 1 1 1 2 1 2 2 1 1 1 2 2 2 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 2 2 1 1 2 1 2 1 2 1 1 2 2 [...]
+            "counts":
+            {
+                "count-1":
+                {
+                    "value": "1",
+                    "count": "789"
+                },
+                "count-2":
+                {
+                    "value": "2",
+                    "count": "276"
+                }
+            },
+            "position": "8"
+        },
+        "ScanAngleRank":
+        {
+            "count": "1065",
+            "minimum": "-19",
+            "maximum": "18",
+            "average": "-0.7577464788732394",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "-20.85",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "-19",
+                    "count": "6"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "-17.15",
+                    "count": "12"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "-15.3",
+                    "count": "36"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "-13.45",
+                    "count": "67"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "-11.6",
+                    "count": "94"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "-9.75",
+                    "count": "78"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "-7.899999999999999",
+                    "count": "41"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "-6.049999999999999",
+                    "count": "66"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "-4.199999999999999",
+                    "count": "70"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "-2.349999999999998",
+                    "count": "57"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "-0.5",
+                    "count": "106"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "1.350000000000001",
+                    "count": "57"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "3.200000000000003",
+                    "count": "82"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "5.050000000000001",
+                    "count": "41"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "6.900000000000002",
+                    "count": "59"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "8.75",
+                    "count": "67"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "10.6",
+                    "count": "64"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "12.45",
+                    "count": "40"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "14.3",
+                    "count": "17"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "16.15",
+                    "count": "2"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "18",
+                    "count": "3"
+                }
+            },
+            "sample": "-9 -11 -10 -6 -4 -9 -12 -9 -9 -6 -9 -1 -11 -9 -9 -10 -7 -7 15 6 12 11 1 -1 7 13 4 1 -1 -1 5 5 0 0 7 1 -7 -3 -6 -5 13 -5 0 11 -10 -10 -1 9 0 10 8 5 7 -10 6 12 1 10 5 -11 -10 -5 11 7 -10 11 -9 -8 -10 8 10 9 10 9 -11 3 2 -12 -2 -1 -6 -3 9 -4 10 -1 -8 6 6 9 6 4 4 5 2 2 -4 -2 -2 -2 -3 -2 -8 1 0 0 7 1 11 -2 0 -5 -8 0 5 -10 1 2 0 15 -11 -10 -8 -4 -11 -13 -7 -7 -8 -10 -8 -11 -13 -14 -14 -13 -14 -18 -19 -12 -15 -8 -11 -10 -12 -4 -5 -11 -8 -11 -10 -9 -11 -12 -9 -7 -4 -13 -10 [...]
+            "position": "9"
+        },
+        "UserData":
+        {
+            "count": "1065",
+            "minimum": "117",
+            "maximum": "149",
+            "average": "126.4441314553991",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "115.4",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "117",
+                    "count": "5"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "118.6",
+                    "count": "15"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "120.2",
+                    "count": "2"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "121.8",
+                    "count": "94"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "123.4",
+                    "count": "301"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "125",
+                    "count": "299"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "126.6",
+                    "count": "168"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "128.2",
+                    "count": "12"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "129.8",
+                    "count": "69"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "131.4",
+                    "count": "24"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "133",
+                    "count": "30"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "134.6",
+                    "count": "20"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "136.2",
+                    "count": "6"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "137.8",
+                    "count": "6"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "139.4",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "141",
+                    "count": "2"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "142.6",
+                    "count": "4"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "144.2",
+                    "count": "3"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "145.8",
+                    "count": "3"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "147.4",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "149",
+                    "count": "2"
+                }
+            },
+            "sample": "132 128 122 124 126 122 128 128 126 124 124 124 124 126 126 124 124 126 125 124 128 126 126 126 122 126 124 126 126 124 124 122 122 122 122 128 124 122 124 122 128 126 124 127 126 121 122 128 122 124 124 124 124 124 126 124 120 124 122 124 126 124 124 124 124 124 126 124 126 124 126 124 128 128 124 126 128 128 126 124 124 130 134 135 128 134 126 135 132 130 132 128 135 134 135 136 128 132 137 128 133 135 128 134 135 126 132 126 133 124 126 124 122 130 128 124 128 1 [...]
+            "position": "10"
+        },
+        "PointSourceId":
+        {
+            "count": "1065",
+            "minimum": "7326",
+            "maximum": "7334",
+            "average": "7329.906103286385",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "7325.6",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "7326",
+                    "count": "44"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "7326.4",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "7326.8",
+                    "count": "128"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "7327.2",
+                    "count": "-0"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "7327.6",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "7328",
+                    "count": "147"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "7328.4",
+                    "count": "-0"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "7328.8",
+                    "count": "165"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "7329.2",
+                    "count": "-0"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "7329.6",
+                    "count": "-0"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "7330",
+                    "count": "135"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "7330.4",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "7330.8",
+                    "count": "150"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "7331.2",
+                    "count": "-0"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "7331.6",
+                    "count": "-0"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "7332",
+                    "count": "161"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "7332.4",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "7332.8",
+                    "count": "93"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "7333.2",
+                    "count": "-0"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "7333.6",
+                    "count": "-0"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "7334",
+                    "count": "42"
+                }
+            },
+            "sample": "7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 [...]
+            "position": "11"
+        },
+        "Time":
+        {
+            "count": "1065",
+            "minimum": "245370.4170645598",
+            "maximum": "249783.1621583719",
+            "average": "247610.149662709",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "245149.7798098692",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "245370.4170645598",
+                    "count": "44"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "245591.0543192504",
+                    "count": "-0"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "245811.691573941",
+                    "count": "-0"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "246032.3288286316",
+                    "count": "128"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "246252.9660833222",
+                    "count": "-0"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "246473.6033380128",
+                    "count": "147"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "246694.2405927034",
+                    "count": "-0"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "246914.877847394",
+                    "count": "-0"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "247135.5151020846",
+                    "count": "165"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "247356.1523567752",
+                    "count": "135"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "247576.7896114659",
+                    "count": "-0"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "247797.4268661565",
+                    "count": "-0"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "248018.0641208471",
+                    "count": "-0"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "248238.7013755377",
+                    "count": "150"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "248459.3386302283",
+                    "count": "89"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "248679.9758849189",
+                    "count": "72"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "248900.6131396095",
+                    "count": "-0"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "249121.2503943001",
+                    "count": "-0"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "249341.8876489907",
+                    "count": "93"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "249562.5249036813",
+                    "count": "41"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "249783.1621583719",
+                    "count": "1"
+                }
+            },
+            "sample": "245381 245381 245382 245383 245383 245384 245384 245385 245385 245386 245386 245386 245387 245387 245387 245388 245388 245389 246092 246093 246093 246093 246093 246093 246094 246094 246094 246094 246094 246094 246095 246095 246095 246095 246095 246095 246095 246096 246096 246096 246096 246096 246096 246097 246097 246097 246097 246097 246097 246098 246098 246098 246098 246098 246098 246098 246099 246099 246099 246099 246099 246099 246100 246100 246100 246100 246100  [...]
+            "position": "12"
+        },
+        "Red":
+        {
+            "count": "1065",
+            "minimum": "39",
+            "maximum": "249",
+            "average": "121.6591549295775",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "28.5",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "39",
+                    "count": "10"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "49.5",
+                    "count": "56"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "60",
+                    "count": "82"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "70.5",
+                    "count": "98"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "81",
+                    "count": "72"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "91.5",
+                    "count": "95"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "102",
+                    "count": "97"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "112.5",
+                    "count": "72"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "123",
+                    "count": "56"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "133.5",
+                    "count": "69"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "144",
+                    "count": "71"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "154.5",
+                    "count": "58"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "165",
+                    "count": "67"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "175.5",
+                    "count": "85"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "186",
+                    "count": "30"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "196.5",
+                    "count": "11"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "207",
+                    "count": "13"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "217.5",
+                    "count": "13"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "228",
+                    "count": "8"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "238.5",
+                    "count": "1"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "249",
+                    "count": "1"
+                }
+            },
+            "sample": "68 54 112 178 134 99 90 106 106 100 64 152 71 51 101 98 163 146 52 39 95 80 78 64 72 98 76 52 116 128 75 103 73 99 114 79 145 170 174 168 50 102 104 77 113 104 99 80 102 62 84 57 76 120 44 92 73 56 84 227 143 70 66 60 207 80 156 140 160 48 84 95 105 52 102 58 97 140 70 54 119 106 80 59 52 102 127 53 69 74 54 103 57 58 50 92 122 58 47 52 46 84 129 79 80 98 110 87 109 106 62 136 141 53 56 71 98 46 228 101 109 164 56 133 58 64 127 152 134 48 62 60 56 102 88 60 118 65  [...]
+            "position": "13"
+        },
+        "Green":
+        {
+            "count": "1065",
+            "minimum": "57",
+            "maximum": "239",
+            "average": "111.3446009389671",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "47.9",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "57",
+                    "count": "38"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "66.09999999999999",
+                    "count": "63"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "75.2",
+                    "count": "112"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "84.3",
+                    "count": "117"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "93.40000000000001",
+                    "count": "140"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "102.5",
+                    "count": "146"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "111.6",
+                    "count": "105"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "120.7",
+                    "count": "74"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "129.8",
+                    "count": "86"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "138.9",
+                    "count": "51"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "148",
+                    "count": "65"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "157.1",
+                    "count": "17"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "166.2",
+                    "count": "11"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "175.3",
+                    "count": "6"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "184.4",
+                    "count": "3"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "193.5",
+                    "count": "6"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "202.6",
+                    "count": "10"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "211.7",
+                    "count": "7"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "220.8",
+                    "count": "6"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "229.9",
+                    "count": "1"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "239",
+                    "count": "1"
+                }
+            },
+            "sample": "77 66 97 138 104 85 95 100 95 94 70 108 73 61 94 82 118 104 65 57 89 83 88 73 78 104 88 66 101 112 86 98 76 89 90 89 108 123 126 126 57 94 104 79 97 93 95 80 92 72 89 66 86 100 68 93 84 75 94 209 106 82 77 75 177 88 121 104 125 66 86 95 105 66 102 71 96 112 82 64 99 101 82 69 71 101 99 70 84 88 66 112 74 80 65 100 106 70 65 58 60 86 102 83 82 97 92 93 97 99 74 105 106 64 73 61 102 60 220 95 104 136 71 104 62 72 97 110 106 66 80 76 67 104 89 74 96 74 86 102 89 90 65 [...]
+            "position": "14"
+        },
+        "Blue":
+        {
+            "count": "1065",
+            "minimum": "56",
+            "maximum": "249",
+            "average": "126.5389671361502",
+            "histogram":
+            {
+                "bin-0":
+                {
+                    "lower_bound": "46.35",
+                    "count": "-0"
+                },
+                "bin-1":
+                {
+                    "lower_bound": "56",
+                    "count": "21"
+                },
+                "bin-2":
+                {
+                    "lower_bound": "65.65000000000001",
+                    "count": "68"
+                },
+                "bin-3":
+                {
+                    "lower_bound": "75.3",
+                    "count": "71"
+                },
+                "bin-4":
+                {
+                    "lower_bound": "84.95",
+                    "count": "87"
+                },
+                "bin-5":
+                {
+                    "lower_bound": "94.59999999999999",
+                    "count": "69"
+                },
+                "bin-6":
+                {
+                    "lower_bound": "104.25",
+                    "count": "60"
+                },
+                "bin-7":
+                {
+                    "lower_bound": "113.9",
+                    "count": "111"
+                },
+                "bin-8":
+                {
+                    "lower_bound": "123.55",
+                    "count": "112"
+                },
+                "bin-9":
+                {
+                    "lower_bound": "133.2",
+                    "count": "113"
+                },
+                "bin-10":
+                {
+                    "lower_bound": "142.85",
+                    "count": "97"
+                },
+                "bin-11":
+                {
+                    "lower_bound": "152.5",
+                    "count": "91"
+                },
+                "bin-12":
+                {
+                    "lower_bound": "162.15",
+                    "count": "77"
+                },
+                "bin-13":
+                {
+                    "lower_bound": "171.8",
+                    "count": "35"
+                },
+                "bin-14":
+                {
+                    "lower_bound": "181.45",
+                    "count": "12"
+                },
+                "bin-15":
+                {
+                    "lower_bound": "191.1",
+                    "count": "7"
+                },
+                "bin-16":
+                {
+                    "lower_bound": "200.75",
+                    "count": "5"
+                },
+                "bin-17":
+                {
+                    "lower_bound": "210.4",
+                    "count": "12"
+                },
+                "bin-18":
+                {
+                    "lower_bound": "220.05",
+                    "count": "12"
+                },
+                "bin-19":
+                {
+                    "lower_bound": "229.7",
+                    "count": "3"
+                },
+                "bin-20":
+                {
+                    "lower_bound": "239.35",
+                    "count": "1"
+                },
+                "bin-21":
+                {
+                    "lower_bound": "249",
+                    "count": "1"
+                }
+            },
+            "sample": "88 68 114 162 134 95 106 125 124 122 74 134 93 65 121 114 150 140 68 56 113 102 94 78 90 118 93 66 133 142 90 112 92 113 112 95 139 153 154 152 60 124 114 93 123 120 102 96 102 80 105 73 88 128 61 118 90 74 99 223 134 84 80 77 196 100 150 132 148 64 98 116 125 68 126 74 117 142 88 66 133 124 96 72 67 124 134 66 83 94 69 119 70 72 65 110 127 74 64 66 60 101 135 101 98 104 109 111 110 114 74 138 141 68 72 81 114 60 231 119 122 154 68 130 64 82 130 148 140 62 80 75 70 [...]
+            "position": "15"
+        }
+    }
+}
+
diff --git a/test/data/apps/pdalinfo_stats.txt b/test/data/apps/pdalinfo_stats.txt
new file mode 100644
index 0000000..3d6c16d
--- /dev/null
+++ b/test/data/apps/pdalinfo_stats.txt
@@ -0,0 +1,150 @@
+{
+    "stats":
+    {
+        "X":
+        {
+            "count": "1065",
+            "minimum": "635619.85",
+            "maximum": "638982.55",
+            "average": "637296.7351830986",
+            "sample": "637012 636896 636785 636699 636602 636452 636327 636268 636199 636146 636038 636044 635883 635869 635795 635752 635792 635718 635674 635620 635640 635742 635761 635684 635681 635791 635873 635817 635816 635823 635852 635948 635980 635961 635979 636075 636046 635994 636052 636052 636087 636272 636145 636216 636341 636301 636216 636238 636340 636460 636407 636525 636541 636551 636598 636451 636642 636726 636645 636770 636739 636579 636607 636672 636703 636896 636873  [...]
+            "position": "0"
+        },
+        "Y":
+        {
+            "count": "1065",
+            "minimum": "848899.7000000001",
+            "maximum": "853535.4300000001",
+            "average": "851249.5384882618",
+            "sample": "849028 849088 849107 848991 849019 849251 849372 849261 849238 849170 849338 849006 849391 849206 849310 849347 848992 849050 849017 850064 849759 850053 849985 849494 849363 849751 850003 849587 849427 849299 849271 849589 849609 849380 849336 849719 849442 849048 849248 849107 849150 850050 849152 849401 849987 849613 849010 849008 849452 849996 849568 850058 849980 849845 849903 849039 849804 850063 849592 850056 849828 849032 849054 849236 849271 850024 849839  [...]
+            "position": "1"
+        },
+        "Z":
+        {
+            "count": "1065",
+            "minimum": "406.59",
+            "maximum": "586.38",
+            "average": "434.0978403755871",
+            "sample": "431.66 446.39 426.71 425.39 425.1 435.17 408.6 427.92 428.05 428.15 423.06 427.95 423.69 444.46 426.61 426.25 428.58 428.67 428.02 447.01 422.74 424.64 425.72 407.12 421.56 413.42 424.44 407.32 447.57 426.61 428.54 407.25 407.22 438.02 424.28 410.47 406.59 427.95 427.99 427.99 427.95 425.2 428.02 407.97 494.03 409.12 428.12 428.15 409.06 426.05 410.27 445.96 426.61 414.93 487.83 428.61 417.55 447.21 411.19 447.01 500.26 428.15 425.89 411.98 411.15 455.41 531.2 425. [...]
+            "position": "2"
+        },
+        "Intensity":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "254",
+            "average": "76.39530516431925",
+            "sample": "143 18 118 100 124 48 3 207 142 124 147 75 63 1 146 91 134 167 153 1 25 188 4 48 58 77 33 224 4 179 181 182 2 2 98 63 23 120 154 116 118 57 115 4 2 186 67 93 95 0 142 17 108 2 98 183 159 137 139 136 1 98 153 11 37 6 10 96 8 171 157 35 27 11 5 125 6 154 83 158 151 27 57 3 56 81 82 10 1 146 5 142 5 105 7 188 24 27 2 216 233 165 7 3 0 0 228 156 239 217 127 1 38 2 150 124 2 43 158 97 12 2 22 74 12 70 2 33 51 0 128 143 159 22 158 1 63 136 141 83 9 15 133 21 127 24 13 14 [...]
+            "position": "3"
+        },
+        "ReturnNumber":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "4",
+            "average": "1.16056338028169",
+            "sample": "1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 3 1 3 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 3 1 1 1 2 2 2 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 2 2 4 1 1 1 1 2 1 1 1 1 1 1 3 1 1 2 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 2 2 2 1 1 1 1 2 1 1 1 1 1 2 2 1 3 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 2 2 1 2 1 2 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 4 4 1 1 1 1 1 1 2 3 1 1 [...]
+            "position": "4"
+        },
+        "NumberOfReturns":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "4",
+            "average": "1.344600938967136",
+            "sample": "1 2 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 3 1 2 1 1 1 3 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 3 1 1 1 1 3 1 3 1 2 1 1 1 1 1 1 2 1 1 1 1 2 2 1 1 1 1 1 2 2 2 2 1 1 1 1 1 3 2 1 1 2 2 3 3 1 2 1 3 2 1 1 1 2 3 1 1 1 2 3 2 4 1 1 1 1 2 1 2 1 1 1 3 3 1 1 2 2 1 1 3 1 1 1 2 2 1 1 1 1 1 1 1 1 1 2 2 3 1 1 1 1 2 1 1 1 1 1 2 2 1 3 1 2 2 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 2 3 2 1 3 1 2 1 1 1 2 2 1 3 2 2 2 1 1 1 3 1 1 1 1 1 1 1 1 2 2 2 1 2 1 1 3 1 1 1 1 1 1 1 2 2 1 1 4 4 1 2 2 3 1 3 2 3 1 3 [...]
+            "position": "5"
+        },
+        "ScanDirectionFlag":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "1",
+            "average": "0.5323943661971831",
+            "sample": "1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 1 0 1 1 1 1 0 1 0 0 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 0 1 1 [...]
+            "position": "6"
+        },
+        "EdgeOfFlightLine":
+        {
+            "count": "1065",
+            "minimum": "0",
+            "maximum": "0",
+            "average": "0",
+            "sample": "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [...]
+            "position": "7"
+        },
+        "Classification":
+        {
+            "count": "1065",
+            "minimum": "1",
+            "maximum": "2",
+            "average": "1.259154929577465",
+            "sample": "1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 2 1 2 1 1 1 1 1 1 2 1 1 1 2 1 1 1 2 2 1 1 1 2 1 2 1 1 2 1 1 2 1 1 1 1 1 1 2 2 1 1 2 1 2 1 1 1 1 1 2 1 2 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 2 1 1 1 2 2 1 1 1 1 2 1 1 1 2 1 1 1 1 1 2 2 2 1 2 2 1 1 1 1 1 2 1 1 2 2 1 1 2 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 2 1 2 2 1 1 1 2 2 1 2 1 1 1 1 1 1 1 1 1 2 2 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 [...]
+            "position": "8"
+        },
+        "ScanAngleRank":
+        {
+            "count": "1065",
+            "minimum": "-19",
+            "maximum": "18",
+            "average": "-0.7577464788732394",
+            "sample": "-9 -11 -10 -6 -4 -9 -12 -9 -9 -6 -9 -1 -11 -9 -9 -10 -4 -7 -7 15 6 12 11 1 -1 7 13 4 1 -1 -1 5 5 0 0 7 1 -7 -3 -6 -5 13 -5 0 11 2 -10 -10 -1 9 0 10 8 5 7 -10 6 12 1 10 5 -11 -10 -6 -5 11 7 -10 11 -9 -8 -10 8 10 9 10 9 -11 3 2 -12 -3 -2 -1 -6 -3 9 -4 10 -6 -1 -8 6 6 9 6 4 4 5 2 2 -4 -2 -2 -2 -3 -2 -8 1 0 0 7 1 11 -1 -2 2 0 -5 -8 0 5 -10 1 2 0 15 -11 -10 -8 -4 -11 -13 -7 -12 -7 -8 -10 -8 -11 -13 -14 -14 -13 -14 -18 -19 -12 -15 -8 -11 -10 -12 -11 -4 -5 -11 -7 -8 -11 - [...]
+            "position": "9"
+        },
+        "UserData":
+        {
+            "count": "1065",
+            "minimum": "117",
+            "maximum": "149",
+            "average": "126.4441314553991",
+            "sample": "132 128 122 124 126 122 128 128 126 124 124 124 124 126 126 124 124 124 126 125 124 128 126 126 126 122 126 124 126 126 124 124 122 122 122 122 128 124 122 124 122 128 126 124 127 124 126 121 122 128 122 124 124 124 124 124 126 124 120 124 122 124 126 124 124 124 124 124 124 126 124 126 124 126 124 128 128 124 126 128 128 132 126 124 124 130 134 135 128 126 134 126 135 132 130 132 128 135 134 135 136 128 132 137 128 133 135 128 134 135 126 132 126 133 124 124 132 1 [...]
+            "position": "10"
+        },
+        "PointSourceId":
+        {
+            "count": "1065",
+            "minimum": "7326",
+            "maximum": "7334",
+            "average": "7329.906103286385",
+            "sample": "7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7326 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7327 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 7328 [...]
+            "position": "11"
+        },
+        "Time":
+        {
+            "count": "1065",
+            "minimum": "245370.4170645598",
+            "maximum": "249783.1621583719",
+            "average": "247610.149662709",
+            "sample": "245381 245381 245382 245383 245383 245384 245384 245385 245385 245386 245386 245386 245387 245387 245387 245388 245388 245388 245389 246092 246093 246093 246093 246093 246093 246094 246094 246094 246094 246094 246094 246095 246095 246095 246095 246095 246095 246095 246096 246096 246096 246096 246096 246096 246097 246097 246097 246097 246097 246097 246097 246098 246098 246098 246098 246098 246098 246098 246099 246099 246099 246099 246099 246099 246099 246100 246100  [...]
+            "position": "12"
+        },
+        "Red":
+        {
+            "count": "1065",
+            "minimum": "39",
+            "maximum": "249",
+            "average": "121.6591549295775",
+            "sample": "68 54 112 178 134 99 90 106 106 100 64 152 71 51 101 98 142 163 146 52 39 95 80 78 64 72 98 76 52 116 128 75 103 73 99 114 79 145 170 174 168 50 102 104 77 102 113 104 99 80 102 62 84 57 76 120 44 92 73 56 84 227 143 82 70 66 60 207 80 156 140 160 48 84 95 105 52 102 58 97 140 79 70 54 119 106 80 59 52 78 102 127 53 69 74 54 103 57 58 50 92 122 58 47 52 46 84 129 79 80 98 110 87 109 48 106 103 62 136 141 53 56 71 98 46 228 101 109 164 56 133 58 64 127 132 152 134 4 [...]
+            "position": "13"
+        },
+        "Green":
+        {
+            "count": "1065",
+            "minimum": "57",
+            "maximum": "239",
+            "average": "111.3446009389671",
+            "sample": "77 66 97 138 104 85 95 100 95 94 70 108 73 61 94 82 102 118 104 65 57 89 83 88 73 78 104 88 66 101 112 86 98 76 89 90 89 108 123 126 126 57 94 104 79 85 97 93 95 80 92 72 89 66 86 100 68 93 84 75 94 209 106 80 82 77 75 177 88 121 104 125 66 86 95 105 66 102 71 96 112 83 82 64 99 101 82 69 71 88 101 99 70 84 88 66 112 74 80 65 100 106 70 65 58 60 86 102 83 82 97 92 93 97 65 99 101 74 105 106 64 73 61 102 60 220 95 104 136 71 104 62 72 97 100 110 106 66 80 76 67 104  [...]
+            "position": "14"
+        },
+        "Blue":
+        {
+            "count": "1065",
+            "minimum": "56",
+            "maximum": "249",
+            "average": "126.5389671361502",
+            "sample": "88 68 114 162 134 95 106 125 124 122 74 134 93 65 121 114 137 150 140 68 56 113 102 94 78 90 118 93 66 133 142 90 112 92 113 112 95 139 153 154 152 60 124 114 93 97 123 120 102 96 102 80 105 73 88 128 61 118 90 74 99 223 134 91 84 80 77 196 100 150 132 148 64 98 116 125 68 126 74 117 142 90 88 66 133 124 96 72 67 96 124 134 66 83 94 69 119 70 72 65 110 127 74 64 66 60 101 135 101 98 104 109 111 110 62 114 118 74 138 141 68 72 81 114 60 231 119 122 154 68 130 64 82  [...]
+            "position": "15"
+        }
+    }
+}
+
diff --git a/test/data/apps/simple.las b/test/data/apps/simple.las
new file mode 100644
index 0000000..5d883ec
Binary files /dev/null and b/test/data/apps/simple.las differ
diff --git a/test/data/apps/simple.laz b/test/data/apps/simple.laz
new file mode 100644
index 0000000..a867f27
Binary files /dev/null and b/test/data/apps/simple.laz differ
diff --git a/test/data/autzen/attributes.dbf b/test/data/autzen/attributes.dbf
new file mode 100644
index 0000000..085acc6
Binary files /dev/null and b/test/data/autzen/attributes.dbf differ
diff --git a/test/data/autzen/attributes.prj b/test/data/autzen/attributes.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/test/data/autzen/attributes.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/test/data/autzen/attributes.qix b/test/data/autzen/attributes.qix
new file mode 100644
index 0000000..b0edeeb
Binary files /dev/null and b/test/data/autzen/attributes.qix differ
diff --git a/test/data/autzen/attributes.qpj b/test/data/autzen/attributes.qpj
new file mode 100644
index 0000000..5fbc831
--- /dev/null
+++ b/test/data/autzen/attributes.qpj
@@ -0,0 +1 @@
+GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
diff --git a/test/data/autzen/attributes.shp b/test/data/autzen/attributes.shp
new file mode 100644
index 0000000..1e37fa9
Binary files /dev/null and b/test/data/autzen/attributes.shp differ
diff --git a/test/data/autzen/attributes.shx b/test/data/autzen/attributes.shx
new file mode 100644
index 0000000..0188d17
Binary files /dev/null and b/test/data/autzen/attributes.shx differ
diff --git a/test/data/autzen/autzen-dd.las b/test/data/autzen/autzen-dd.las
new file mode 100644
index 0000000..4330b18
Binary files /dev/null and b/test/data/autzen/autzen-dd.las differ
diff --git a/test/data/autzen/autzen-point-format-3.las b/test/data/autzen/autzen-point-format-3.las
new file mode 100644
index 0000000..b4786d3
Binary files /dev/null and b/test/data/autzen/autzen-point-format-3.las differ
diff --git a/test/data/autzen/autzen-point-format-3.txt b/test/data/autzen/autzen-point-format-3.txt
new file mode 100644
index 0000000..4a5df9d
--- /dev/null
+++ b/test/data/autzen/autzen-point-format-3.txt
@@ -0,0 +1,107 @@
+"Red","Green","X","Y","Blue","Z"
+0,0,636083.30,849398.65,0,407.35
+0,0,635616.31,849984.78,0,423.95
+0,0,635918.31,849737.43,0,414.21
+0,0,636082.68,849271.42,0,427.92
+0,0,636454.69,849950.89,0,425.23
+0,0,636679.04,849644.36,0,411.15
+0,0,636926.61,849800.43,0,425.98
+0,0,637095.87,849274.70,0,411.25
+0,0,636992.03,849974.97,0,480.74
+0,0,636685.14,849892.32,0,432.32
+0,0,636328.84,849966.93,0,486.06
+0,0,635969.65,850223.46,0,426.25
+0,0,635742.81,850120.87,0,425.36
+0,0,636292.52,850470.57,0,431.10
+0,0,636717.98,850439.86,0,437.43
+0,0,637140.55,850135.56,0,478.77
+0,0,638332.51,849367.19,0,426.31
+0,0,637986.68,849230.68,0,462.37
+0,0,637371.00,850034.61,0,429.86
+0,0,637489.70,849423.23,0,411.02
+0,0,637743.83,849702.66,0,430.28
+0,0,637917.29,849304.00,0,536.84
+0,0,638091.73,848977.79,0,427.59
+0,0,638511.61,850026.74,0,435.47
+0,0,638788.45,849495.24,0,417.32
+0,0,638472.80,850277.03,0,426.84
+0,0,638290.78,849373.95,0,456.56
+0,0,637913.88,849967.42,0,427.26
+0,0,637700.46,849934.32,0,428.25
+0,0,637566.80,850019.00,0,425.92
+0,0,637351.84,849987.93,0,424.05
+0,0,637286.22,850026.44,0,429.79
+0,0,637925.72,850414.47,0,424.84
+0,0,638429.49,849995.64,0,444.55
+0,0,637099.93,850669.32,0,426.25
+0,0,636029.36,850522.90,0,425.98
+0,0,635993.60,851224.11,0,418.77
+0,0,636300.79,851193.47,0,417.52
+0,0,636318.27,850528.71,0,431.59
+0,0,636712.43,850847.18,0,435.43
+0,0,637179.66,851307.12,0,425.23
+0,0,637181.36,850671.36,0,474.51
+0,0,636736.19,851723.69,0,475.59
+0,0,636570.77,851103.18,0,494.49
+0,0,636417.03,850806.33,0,430.22
+0,0,636053.25,851369.65,0,419.85
+0,0,635777.40,851542.78,0,453.12
+0,0,635748.69,852257.84,0,416.99
+0,0,635891.27,852001.35,0,416.08
+0,0,636000.72,851466.04,0,416.27
+0,0,636428.02,852527.59,0,421.72
+0,0,636638.32,852350.03,0,417.32
+0,0,636784.38,852110.24,0,471.33
+0,0,637118.44,852409.84,0,424.08
+0,0,637257.09,852442.45,0,425.26
+0,0,636982.91,851998.46,0,443.18
+0,0,636648.00,852437.83,0,420.24
+0,0,636338.48,852695.28,0,470.24
+0,0,635983.83,852885.99,0,418.73
+0,0,635748.39,852813.12,0,462.14
+0,0,636175.72,852861.48,0,422.41
+0,0,636799.05,852851.87,0,455.68
+0,0,638570.70,850527.33,0,432.97
+0,0,637616.57,850626.05,0,452.13
+0,0,637294.55,850719.13,0,422.38
+0,0,637664.76,850643.37,0,437.93
+0,0,638040.45,851267.22,0,420.96
+0,0,638317.62,850430.81,0,425.03
+0,0,638739.93,851223.88,0,534.06
+0,0,638854.23,851767.45,0,512.50
+0,0,638671.72,851434.94,0,495.34
+0,0,638414.27,851304.99,0,421.00
+0,0,638144.49,851019.91,0,421.03
+0,0,637816.11,851492.95,0,424.80
+0,0,637720.41,851026.05,0,420.51
+0,0,637347.57,851895.96,0,417.16
+0,0,637434.02,852480.18,0,425.72
+0,0,637688.22,852550.30,0,424.11
+0,0,637911.38,852563.22,0,424.44
+0,0,637883.56,851511.65,0,424.44
+0,0,638040.88,851284.02,0,421.06
+0,0,638404.36,851708.33,0,424.67
+0,0,638749.90,852044.82,0,461.94
+0,0,638742.72,851360.40,0,490.62
+0,0,638864.60,852417.16,0,419.29
+0,0,638585.99,852644.98,0,421.49
+0,0,638392.95,852045.77,0,419.65
+0,0,637997.77,851987.76,0,424.41
+0,0,637533.96,852692.29,0,423.13
+0,0,637327.56,852610.07,0,422.74
+0,0,637926.90,852727.95,0,424.08
+0,0,638738.78,852761.29,0,422.18
+0,0,636842.36,853116.21,0,433.27
+0,0,636242.78,853217.59,0,416.60
+0,0,635781.17,853044.69,0,414.01
+0,0,636421.39,853317.65,0,416.50
+0,0,636903.64,853069.85,0,454.20
+0,0,636866.60,853362.37,0,430.84
+0,0,636281.33,853299.44,0,415.75
+0,0,638727.79,852959.28,0,416.73
+0,0,638133.33,852952.43,0,423.29
+0,0,637319.69,853088.29,0,429.23
+0,0,637961.09,853052.03,0,445.80
+0,0,638588.39,852885.86,0,421.65
+0,0,638627.40,853357.38,0,419.52
+0,0,637857.41,853213.98,0,424.87
diff --git a/test/data/autzen/autzen-selection-dd.wkt b/test/data/autzen/autzen-selection-dd.wkt
new file mode 100644
index 0000000..c56c18a
--- /dev/null
+++ b/test/data/autzen/autzen-selection-dd.wkt
@@ -0,0 +1 @@
+POLYGON ((-123.070314549836326 44.057089038234523 128.839019531250017,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.069979815780442 44.057056534650307 129.281039062500014,-123.069979815780442 44.057056534650307 129.281039062500014,-1 [...]
\ No newline at end of file
diff --git a/test/data/autzen/autzen-selection.wkt b/test/data/autzen/autzen-selection.wkt
new file mode 100644
index 0000000..f10ad33
--- /dev/null
+++ b/test/data/autzen/autzen-selection.wkt
@@ -0,0 +1 @@
+POLYGON ((636889.412951239268295 851528.512293258565478 422.7001953125,636899.14233423944097 851475.000686757150106 422.4697265625,636899.14233423944097 851475.000686757150106 422.4697265625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636976.977398241520859 851513.918218758190051 424.150390625,636976.977398241520859 851513.918218758190051 424.150390625,6 [...]
diff --git a/test/data/autzen/autzen-srs.wkt b/test/data/autzen/autzen-srs.wkt
new file mode 100644
index 0000000..e20fa66
--- /dev/null
+++ b/test/data/autzen/autzen-srs.wkt
@@ -0,0 +1,17 @@
+PROJCS["NAD_1983_HARN_Lambert_Conformal_Conic",
+    GEOGCS["GCS_North_American_1983_HARN",
+            DATUM["NAD83_High_Accuracy_Regional_Network",
+                        SPHEROID["GRS_1980",6378137,298.257222101,
+                                        AUTHORITY["EPSG","7019"]],
+                                                    AUTHORITY["EPSG","6152"]],
+                                                            PRIMEM["Greenwich",0],
+                                                                    UNIT["degree",0.0174532925199433]],
+                                                                        PROJECTION["Lambert_Conformal_Conic_2SP"],
+                                                                            PARAMETER["standard_parallel_1",43],
+                                                                                PARAMETER["standard_parallel_2",45.5],
+                                                                                    PARAMETER["latitude_of_origin",41.75],
+                                                                                        PARAMETER["central_meridian",-120.5],
+                                                                                            PARAMETER["false_easting",1312335.958005249],
+                                                                                                PARAMETER["false_northing",0],
+                                                                                                    UNIT["foot",0.3048,
+                                                                                                            AUTHORITY["EPSG","9002"]]]
diff --git a/test/data/autzen/autzen-thin-srs.las b/test/data/autzen/autzen-thin-srs.las
new file mode 100644
index 0000000..292e404
Binary files /dev/null and b/test/data/autzen/autzen-thin-srs.las differ
diff --git a/test/data/autzen/autzen-thin.las b/test/data/autzen/autzen-thin.las
new file mode 100644
index 0000000..ce9ce3a
Binary files /dev/null and b/test/data/autzen/autzen-thin.las differ
diff --git a/test/data/autzen/autzen-utm-chipped-25.las b/test/data/autzen/autzen-utm-chipped-25.las
new file mode 100644
index 0000000..a3d4ed0
Binary files /dev/null and b/test/data/autzen/autzen-utm-chipped-25.las differ
diff --git a/test/data/autzen/autzen-utm.las b/test/data/autzen/autzen-utm.las
new file mode 100644
index 0000000..d4ed9bf
Binary files /dev/null and b/test/data/autzen/autzen-utm.las differ
diff --git a/test/data/autzen/autzen.jpg b/test/data/autzen/autzen.jpg
new file mode 100644
index 0000000..0b19df2
Binary files /dev/null and b/test/data/autzen/autzen.jpg differ
diff --git a/test/data/autzen/autzen.jpg.aux.xml b/test/data/autzen/autzen.jpg.aux.xml
new file mode 100644
index 0000000..f527a0f
--- /dev/null
+++ b/test/data/autzen/autzen.jpg.aux.xml
@@ -0,0 +1,78 @@
+<PAMDataset>
+  <SRS>PROJCS["NAD_1983_HARN_Lambert_Conformal_Conic",GEOGCS["GCS_North_American_1983_HARN",DATUM["NAD83_High_Accuracy_Regional_Network",SPHEROID["GRS_1980",6378137,298.257222101,AUTHORITY["EPSG","7019"]],AUTHORITY["EPSG","6152"]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["standard_parallel_1",43],PARAME [...]
+  <GeoTransform>  6.3561542786591221e+05,  1.0000000000000000e+00,  0.0000000000000000e+00,  8.5336264308515214e+05,  0.0000000000000000e+00, -1.0000000000000000e+00</GeoTransform>
+  <Metadata domain="IMAGE_STRUCTURE">
+    <MDI key="SOURCE_COLOR_SPACE">YCbCr</MDI>
+    <MDI key="INTERLEAVE">PIXEL</MDI>
+    <MDI key="COMPRESSION">JPEG</MDI>
+  </Metadata>
+  <Metadata>
+    <MDI key="AREA_OR_POINT">Area</MDI>
+  </Metadata>
+  <PAMRasterBand band="1">
+    <NoDataValue>0.00000000000000E+00</NoDataValue>
+    <Metadata domain="IMAGE_STRUCTURE">
+      <MDI key="COMPRESSION">JPEG</MDI>
+    </Metadata>
+    <Metadata>
+      <MDI key="STATISTICS_MINIMUM">35</MDI>
+      <MDI key="STATISTICS_MAXIMUM">255</MDI>
+      <MDI key="STATISTICS_MEAN">123.1901795373</MDI>
+      <MDI key="STATISTICS_MEDIAN">119</MDI>
+      <MDI key="STATISTICS_MODE">76</MDI>
+      <MDI key="STATISTICS_STDDEV">44.35868517657</MDI>
+      <MDI key="STATISTICS_SKIPFACTORX">1</MDI>
+      <MDI key="STATISTICS_SKIPFACTORY">1</MDI>
+      <MDI key="STATISTICS_EXCLUDEDVALUES">0</MDI>
+      <MDI key="LAYER_TYPE">athematic</MDI>
+      <MDI key="STATISTICS_HISTOMIN">0</MDI>
+      <MDI key="STATISTICS_HISTOMAX">255</MDI>
+      <MDI key="STATISTICS_HISTONUMBINS">256</MDI>
+      <MDI key="STATISTICS_HISTOBINVALUES">0|0|0|0|0|0|0|0|0|0|0|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|21|9|48|224|385|714|2161|2696|8309|7588|24900|17765|46882|27814|61448|34450|77782|42827|98100|53888|120702|65717|148077|78027|166077|84982|174335|89293|177578|90284|180801|93282|190772|101305|210012|115008|243452|135342|284901|148646|302429|148077|298916|144663|280671|134631|256550|120687|215877|108429|202384|104044|203128|102544|206102|105665|201844|103450|193536|102048|19 [...]
+    </Metadata>
+  </PAMRasterBand>
+  <PAMRasterBand band="2">
+    <NoDataValue>0.00000000000000E+00</NoDataValue>
+    <Metadata domain="IMAGE_STRUCTURE">
+      <MDI key="COMPRESSION">JPEG</MDI>
+    </Metadata>
+    <Metadata>
+      <MDI key="STATISTICS_MINIMUM">49</MDI>
+      <MDI key="STATISTICS_MAXIMUM">255</MDI>
+      <MDI key="STATISTICS_MEAN">126.93814343797</MDI>
+      <MDI key="STATISTICS_MEDIAN">128</MDI>
+      <MDI key="STATISTICS_MODE">138</MDI>
+      <MDI key="STATISTICS_STDDEV">35.775545093364</MDI>
+      <MDI key="STATISTICS_SKIPFACTORX">1</MDI>
+      <MDI key="STATISTICS_SKIPFACTORY">1</MDI>
+      <MDI key="STATISTICS_EXCLUDEDVALUES">0</MDI>
+      <MDI key="LAYER_TYPE">athematic</MDI>
+      <MDI key="STATISTICS_HISTOMIN">0</MDI>
+      <MDI key="STATISTICS_HISTOMAX">255</MDI>
+      <MDI key="STATISTICS_HISTONUMBINS">256</MDI>
+      <MDI key="STATISTICS_HISTOBINVALUES">0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|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|9|28|44|153|455|649|1909|2802|9343|8425|25725|18685|48050|28223|67362|37470|82241|45761|101584|55711|126075|68487|152172|84794|185524|96559|202617|102919|207709|107658|221607|112434|225654|114200|226284|117806|236558|121474|249767|133466|279408|147634|311941|156605|304328|144515|265805|128428|242913|119590|220174|109344|197377|98997|179184|93175| [...]
+    </Metadata>
+  </PAMRasterBand>
+  <PAMRasterBand band="3">
+    <NoDataValue>0.00000000000000E+00</NoDataValue>
+    <Metadata domain="IMAGE_STRUCTURE">
+      <MDI key="COMPRESSION">JPEG</MDI>
+    </Metadata>
+    <Metadata>
+      <MDI key="STATISTICS_MINIMUM">46</MDI>
+      <MDI key="STATISTICS_MAXIMUM">255</MDI>
+      <MDI key="STATISTICS_MEAN">112.16139266402</MDI>
+      <MDI key="STATISTICS_MEDIAN">106</MDI>
+      <MDI key="STATISTICS_MODE">96</MDI>
+      <MDI key="STATISTICS_STDDEV">30.726139906689</MDI>
+      <MDI key="STATISTICS_SKIPFACTORX">1</MDI>
+      <MDI key="STATISTICS_SKIPFACTORY">1</MDI>
+      <MDI key="STATISTICS_EXCLUDEDVALUES">0</MDI>
+      <MDI key="LAYER_TYPE">athematic</MDI>
+      <MDI key="STATISTICS_HISTOMIN">0</MDI>
+      <MDI key="STATISTICS_HISTOMAX">255</MDI>
+      <MDI key="STATISTICS_HISTONUMBINS">256</MDI>
+      <MDI key="STATISTICS_HISTOBINVALUES">0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|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|16|69|70|103|397|270|819|995|2190|2835|5936|6759|14962|13403|33486|26770|62511|42952|103342|61300|133575|72938|152680|81852|162560|91043|186667|107722|228069|130398|285507|158372|341260|183090|377369|198397|410282|208868|420529|209239|415785|207731|406405|204345|410580|211696|418652|216557|426333|212853|412247|202892|401270|199707|386659|197533|378993 [...]
+    </Metadata>
+  </PAMRasterBand>
+</PAMDataset>
diff --git a/test/data/autzen/autzen.las b/test/data/autzen/autzen.las
new file mode 100644
index 0000000..c1ab4d2
Binary files /dev/null and b/test/data/autzen/autzen.las differ
diff --git a/test/data/autzen/autzen.wld b/test/data/autzen/autzen.wld
new file mode 100644
index 0000000..09945b5
--- /dev/null
+++ b/test/data/autzen/autzen.wld
@@ -0,0 +1,6 @@
+1.0000000000
+0.0000000000
+0.0000000000
+-1.0000000000
+635615.9278659122
+853362.1430851521
diff --git a/test/data/bpf/autzen-dd.bpf b/test/data/bpf/autzen-dd.bpf
new file mode 100644
index 0000000..ca44d5f
Binary files /dev/null and b/test/data/bpf/autzen-dd.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-deflate-interleaved.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-deflate-interleaved.bpf
new file mode 100644
index 0000000..68afc86
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-deflate-interleaved.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-deflate-segregated.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-deflate-segregated.bpf
new file mode 100644
index 0000000..2d1d519
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-deflate-segregated.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-deflate.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-deflate.bpf
new file mode 100644
index 0000000..ae69be1
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-deflate.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-interleaved.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-interleaved.bpf
new file mode 100644
index 0000000..e45811e
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-interleaved.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-segregated.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-segregated.bpf
new file mode 100644
index 0000000..4ab7363
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz-segregated.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-fastlz.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz.bpf
new file mode 100644
index 0000000..a2dc3b6
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-fastlz.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-interleaved.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-interleaved.bpf
new file mode 100644
index 0000000..b3ebd1b
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-interleaved.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3-segregated.bpf b/test/data/bpf/autzen-utm-chipped-25-v3-segregated.bpf
new file mode 100644
index 0000000..8235e63
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3-segregated.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25-v3.bpf b/test/data/bpf/autzen-utm-chipped-25-v3.bpf
new file mode 100644
index 0000000..8dd98c1
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25-v3.bpf differ
diff --git a/test/data/bpf/autzen-utm-chipped-25.bpf b/test/data/bpf/autzen-utm-chipped-25.bpf
new file mode 100644
index 0000000..b8aee54
Binary files /dev/null and b/test/data/bpf/autzen-utm-chipped-25.bpf differ
diff --git a/test/data/bpf/autzen-utm.bpf b/test/data/bpf/autzen-utm.bpf
new file mode 100644
index 0000000..f0ab373
Binary files /dev/null and b/test/data/bpf/autzen-utm.bpf differ
diff --git a/test/data/bpf/bpf.xml.in b/test/data/bpf/bpf.xml.in
new file mode 100644
index 0000000..e7a1ea1
--- /dev/null
+++ b/test/data/bpf/bpf.xml.in
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Option name="scale_x">0.01</Option>
+        <Option name="offset_x">311898.23</Option>
+        <Option name="scale_y">0.01</Option>
+        <Option name="offset_y">4703909.84</Option>
+        <Option name="scale_z">0.01</Option>
+        <Option name="offset_z">7.385474</Option>
+        <Reader type="readers.bpf">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/bpf/utm15.bpf
+            </Option>
+        </Reader>
+</Writer>
+</Pipeline>
diff --git a/test/data/bpf/bpf2nitf.xml.in b/test/data/bpf/bpf2nitf.xml.in
new file mode 100644
index 0000000..97031fc
--- /dev/null
+++ b/test/data/bpf/bpf2nitf.xml.in
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.nitf">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/output.ntf
+        </Option>
+        <Option name="scale_x">0.01</Option>
+        <Option name="offset_x">311898.23</Option>
+        <Option name="scale_y">0.01</Option>
+        <Option name="offset_y">4703909.84</Option>
+        <Option name="scale_z">0.01</Option>
+        <Option name="offset_z">7.385474</Option>
+        <Option name="FSCLAS">U</Option>
+        <Option name="IDATIM" type="string">20131206140713</Option>
+        <Option name="FSCLTX" type="string">SIC:0 CH_FO</Option>
+        <Option name="FTITLE" type="string">output.ntf</Option>
+        <Option name="GEOLOB" type="string">GEOLOB00048017898386021508996+063.7163336371+034.</Option>
+        <Option name="metadata">
+            <Options>
+                <Option name="software_id">
+                    forward
+                </Option>
+                <Option name="system_id">
+                    PDAL2NTF
+                </Option>
+                <Option name="creation_doy">
+                    forward
+                </Option>
+                <Option name="creation_year">
+                    forward
+                </Option>
+                <Option name="vlr">
+                    dGhpcyBpcyBzb21lIG5ldyB2bHIgdGV4dA==
+                    <Options>
+                        <Option name="record_id">
+                            4321
+                        </Option>
+                        <Option name="user_id">
+                            new VLR
+                        </Option>
+                        <Option name="description">
+                            a description of a new VLR
+                        </Option>
+                    </Options>
+                </Option>
+            </Options>
+        </Option>
+        <Reader type="readers.bpf">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/bpf/utm15.bpf
+            </Option>
+        </Reader>
+</Writer>
+</Pipeline>
diff --git a/test/data/bpf/bundle1 b/test/data/bpf/bundle1
new file mode 100644
index 0000000..0527e6b
--- /dev/null
+++ b/test/data/bpf/bundle1
@@ -0,0 +1 @@
+This is a test
diff --git a/test/data/bpf/bundle2 b/test/data/bpf/bundle2
new file mode 100644
index 0000000..d73906c
--- /dev/null
+++ b/test/data/bpf/bundle2
@@ -0,0 +1 @@
+This is another test
diff --git a/test/data/bpf/utm15.bpf b/test/data/bpf/utm15.bpf
new file mode 100644
index 0000000..7fa506a
Binary files /dev/null and b/test/data/bpf/utm15.bpf differ
diff --git a/test/data/filters/attribute.xml.in b/test/data/filters/attribute.xml.in
new file mode 100644
index 0000000..1a361b8
--- /dev/null
+++ b/test/data/filters/attribute.xml.in
@@ -0,0 +1,58 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/attributed.las
+        </Option>
+        <Option name="scale_x">
+            0.0000001
+        </Option>
+        <Option name="scale_y">
+            0.0000001
+        </Option>
+        <Filter type="filters.attribute">
+            <Option name="dimension">
+                Classification
+                <Options>
+                    <Option name="datasource">
+                        @CMAKE_SOURCE_DIR@/test/data/autzen/attributes.shp
+                    </Option>
+                    <Option name="layer">
+                        attributes
+                    </Option>
+                    <Option name="column">
+                        CLS
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Intensity
+                <Options>
+                    <Option name="datasource">
+                        @CMAKE_SOURCE_DIR@/test/data/autzen/attributes.shp
+                    </Option>
+                    <Option name="query">
+                        SELECT CLS FROM attributes where cls!=6
+                    </Option>
+                    <Option name="column">
+                        CLS
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                PointSourceId
+                <Options>
+                    <Option name="value">
+                        26
+                    </Option>
+                </Options>
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-dd.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
+
diff --git a/test/data/filters/chip.xml.in b/test/data/filters/chip.xml.in
new file mode 100644
index 0000000..3a0badf
--- /dev/null
+++ b/test/data/filters/chip.xml.in
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen-utm-chipped-25.las
+        </Option>
+        <Filter type="filters.chipper">
+            <Option name="capacity">
+                25
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-utm.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/chipper.xml.in b/test/data/filters/chipper.xml.in
new file mode 100644
index 0000000..bda918f
--- /dev/null
+++ b/test/data/filters/chipper.xml.in
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen-utm-chipped-25.las
+        </Option>
+        <Filter type="filters.merge">
+            <!-- Merge the chips back together into a single file -->
+            <Filter type="filters.chipper">
+                <Option name="capacity">
+                    25
+                </Option>
+
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-utm.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/colorize-multi.xml.in b/test/data/filters/colorize-multi.xml.in
new file mode 100644
index 0000000..76af580
--- /dev/null
+++ b/test/data/filters/colorize-multi.xml.in
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/sometext.txt
+        </Option>
+        <Filter type="filters.colorization">
+            <Option name="dimension">
+                Red
+                <Options>
+                    <Option name="band">
+                        1
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Green
+                <Options>
+                    <Option name="band">
+                        2
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Blue
+                <Options>
+                    <Option name="band">
+                        3
+                    </Option>
+                    <Option name="scale">
+                        256
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="raster">
+                ./autzen.tif
+            </Option>
+            <Filter type="filters.colorization">
+                <Option name="dimension">
+                    Red1
+                    <Options>
+                        <Option name="band">
+                            1
+                        </Option>
+                        <Option name="scale">
+                            1.0
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Green1
+                    <Options>
+                        <Option name="band">
+                            2
+                        </Option>
+                        <Option name="scale">
+                            1.0
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Blue1
+                    <Options>
+                        <Option name="band">
+                            3
+                        </Option>
+                        <Option name="scale">
+                            256
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="raster">
+                    ./autzen-warped.tif
+                </Option>
+		<Reader type="readers.las">
+		    <Option name="filename">
+			@CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+		    </Option>
+		    <Option name="spatialreference">
+			EPSG:2993
+		    </Option>
+		</Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/colorize.xml.in b/test/data/filters/colorize.xml.in
new file mode 100644
index 0000000..5fc7c0b
--- /dev/null
+++ b/test/data/filters/colorize.xml.in
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/colorized.las
+        </Option>
+        <Filter type="filters.colorization">
+            <Option name="dimension">
+                Red
+                <Options>
+                    <Option name="band">
+                        1
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Green
+                <Options>
+                    <Option name="band">
+                        2
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Blue
+                <Options>
+                    <Option name="band">
+                        3
+                    </Option>
+                    <Option name="scale">
+                        256
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="raster">
+                @CMAKE_SOURCE_DIR@/test/data/autzen/autzen.jpg
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/crop_reproject.xml.in b/test/data/filters/crop_reproject.xml.in
new file mode 100644
index 0000000..a013c0c
--- /dev/null
+++ b/test/data/filters/crop_reproject.xml.in
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/cropped.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Filter type="filters.crop">
+	    <Option name="outside">false</Option>
+	    <Option name="y_dim">filters.inplacereprojection.Y</Option>
+	    <Option name="z_dim">filters.inplacereprojection.Z</Option>
+	    <Option name="polygon">POLYGON ((-123.070314549836326 44.057089038234523 128.839019531250017,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.069979815780442 44.057056534650307 129.281039062500014,-123.069979815780442 44.0570565346 [...]
+	    <Option name="x_dim">filters.inplacereprojection.X</Option>             
+	    <!-- <Option name="outside">false</Option>
+	    <Option name="y_dim">drivers.las.reader.Y</Option>
+	    <Option name="z_dim">drivers.las.reader.Z</Option>
+	    <Option name="x_dim">drivers.las.reader.X</Option>            
+	    <Option name="polygon">POLYGON ((636889.412951239268295 851528.512293258565478 422.7001953125,636899.14233423944097 851475.000686757150106 422.4697265625,636899.14233423944097 851475.000686757150106 422.4697265625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636928.33048324030824 851494.459452757611871 422.5400390625,636976.977398241520859 851513.918218758190051 424.150390625,636976.977398241520859 851513.918 [...]
+</Option> -->
+	    <Reader type="readers.las">
+		    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-colorized-1.2-3.las
+		    </Option>
+		    <Option name="spatialreference">
+			EPSG:2994
+		    </Option>
+		    <!-- <Option name="log">
+			oracle-pipeline-write.log
+		    </Option>     -->
+	    </Reader>
+	</Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/crop_wkt.xml.in b/test/data/filters/crop_wkt.xml.in
new file mode 100644
index 0000000..9e44fa7
--- /dev/null
+++ b/test/data/filters/crop_wkt.xml.in
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/crop-wkt.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="polygon">
+                POLYGON ((636889.412951239268295 851528.512293258565478
+                422.7001953125,636899.14233423944097 851475.000686757150106
+                422.4697265625,636899.14233423944097 851475.000686757150106
+                422.4697265625,636928.33048324030824 851494.459452757611871
+                422.5400390625,636928.33048324030824 851494.459452757611871
+                422.5400390625,636928.33048324030824 851494.459452757611871
+                422.5400390625,636976.977398241520859 851513.918218758190051
+                424.150390625,636976.977398241520859 851513.918218758190051
+                424.150390625,637069.406536744092591 851475.000686757150106
+                438.7099609375,637132.647526245797053 851445.812537756282836
+                425.9501953125,637132.647526245797053 851445.812537756282836
+                425.9501953125,637336.964569251285866 851411.759697255445644
+                425.8203125,637336.964569251285866 851411.759697255445644
+                425.8203125,637473.175931254867464 851158.795739248627797
+                435.6298828125,637589.928527257987298 850711.244121236610226
+                420.509765625,637244.535430748714134 850511.791769731207751
+                420.7998046875,636758.066280735656619 850667.461897735483944
+                434.609375,636539.155163229792379 851056.63721774588339
+                422.6396484375,636889.412951239268295 851528.512293258565478
+                422.7001953125))
+            </Option>
+            <Option name="outside">
+                false
+            </Option>
+            <Option name="x_dim">readers.las.X</Option>
+            <Reader type="readers.las">
+                <!-- <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen-colorized-1.2-3.las
+                </Option> -->
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/crop_wkt_2d.xml.in b/test/data/filters/crop_wkt_2d.xml.in
new file mode 100644
index 0000000..fefadbc
--- /dev/null
+++ b/test/data/filters/crop_wkt_2d.xml.in
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen-colorized-1.2.3-hole.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="polygon">
+                POLYGON ((636889.4129512392682955 851528.5122932585654780, 636899.1423342394409701 851475.0006867571501061, 636899.1423342394409701 851475.0006867571501061, 636928.3304832403082401 851494.4594527576118708, 636928.3304832403082401 851494.4594527576118708, 636928.3304832403082401 851494.4594527576118708, 636976.9773982415208593 851513.9182187581900507, 636976.9773982415208593 851513.9182187581900507, 637069.4065367440925911 851475.0006867571501061, 637132.6475262457970530 8 [...]
+            </Option>
+            <Option name="outside">
+                true
+            </Option>
+            <Reader type="readers.las">
+                <!-- <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen-colorized-1.2-3.las
+                </Option> -->
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/crop_wkt_2d_classification.xml.in b/test/data/filters/crop_wkt_2d_classification.xml.in
new file mode 100644
index 0000000..e1d8788
--- /dev/null
+++ b/test/data/filters/crop_wkt_2d_classification.xml.in
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/crop-wkt-2d-classification.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Filter type="filters.predicate"><Option name="function">filter</Option><Option name="source">
+import numpy as np
+
+def filter(ins,outs):
+   cls = ins['Classification']
+
+   keep_classes = [1,2]
+
+   # Use the first test for our base array.
+   keep = np.equal(cls, keep_classes[0])
+
+   # For 1:n, test each predicate and join back
+   # to our existing predicate array
+   for k in range(1,len(keep_classes)):
+       t = np.equal(cls, keep_classes[k])
+       keep = keep + t
+
+   outs['Mask'] = keep
+   return True
+        </Option><Option name="module">anything</Option>
+        <Filter type="filters.crop">
+            <Option name="polygon">
+                POLYGON ((636889.4129512392682955 851528.5122932585654780, 636899.1423342394409701 851475.0006867571501061, 636899.1423342394409701 851475.0006867571501061, 636928.3304832403082401 851494.4594527576118708, 636928.3304832403082401 851494.4594527576118708, 636928.3304832403082401 851494.4594527576118708, 636976.9773982415208593 851513.9182187581900507, 636976.9773982415208593 851513.9182187581900507, 637069.4065367440925911 851475.0006867571501061, 637132.6475262457970530 8 [...]
+
+            </Option>
+            <Option name="outside">
+                false
+            </Option>
+            <Reader type="readers.las">
+                <!-- <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen-colorized-1.2-3.las
+                </Option> -->
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/decimate.xml.in b/test/data/filters/decimate.xml.in
new file mode 100644
index 0000000..c894cd4
--- /dev/null
+++ b/test/data/filters/decimate.xml.in
@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+  <Writer type="writers.text">
+    <Option name="delimiter">,</Option>
+    <Option name="write_header">false</Option>
+    <Option name="filename">@CMAKE_SOURCE_DIR@/test/temp/junk.txt</Option>
+    <Filter type="filters.colorization">
+      <Option name="raster">./autzen.tif</Option>
+      <Option name="dimension">Red<Options><Option name="band">1</Option><Option name="scale">1</Option></Options></Option>
+      <Option name="dimension">Green<Options><Option name="band">2</Option><Option name="scale">1</Option></Options></Option>
+      <Option name="dimension">Blue<Options><Option name="band">3</Option><Option name="scale">1</Option></Options></Option>
+      <Filter type="filters.decimation">
+        <Option name="step">2</Option>
+        <Option name="offset">1</Option>
+        <Reader type="readers.las">
+          <Option name="filename">@CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las</Option>
+          <Option name="spatialreference">EPSG:2993</Option>
+        </Reader>
+      </Filter>
+    </Filter>
+  </Writer>
+</Pipeline>
diff --git a/test/data/filters/ferry.xml.in b/test/data/filters/ferry.xml.in
new file mode 100644
index 0000000..849e7a8
--- /dev/null
+++ b/test/data/filters/ferry.xml.in
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/colorized.las
+        </Option>
+        <Filter type="filters.reprojection">
+            <Option name="out_srs">
+                EPSG:4326+4326
+            </Option>
+            <Option name="scale_x">
+                0.0000001
+            </Option>
+            <Option name="scale_y">
+                0.0000001
+            </Option>
+            <Filter type="filters.ferry">
+                <Option name="dimension">
+                    X
+                    <Options>
+                        <Option name="to">
+                            StatePlaneX
+                        </Option>
+                    </Options>
+                </Option>
+                <Option name="dimension">
+                    Y
+                    <Options>
+                        <Option name="to">
+                            StatePlaneY
+                        </Option>
+                    </Options>
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                    </Option>
+                    <Option name="spatialreference">
+                        EPSG:2993
+                    </Option>
+                </Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/hexbin-info.xml.in b/test/data/filters/hexbin-info.xml.in
new file mode 100644
index 0000000..d7aa2f7
--- /dev/null
+++ b/test/data/filters/hexbin-info.xml.in
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Filter type="filters.hexbin">
+        <Option name="edge_size">
+            0.0
+        </Option>
+        <Option name="threshold">
+            10
+        </Option>
+        <Option name="sample_size">
+            5000
+        </Option>
+        <Option name="x_dim">
+            readers.las.X
+        </Option>
+        <Option name="y_dim">
+            Y
+        </Option>
+        <Option name="precision">
+            4
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/filters/hexbin.txt b/test/data/filters/hexbin.txt
new file mode 100644
index 0000000..6fe1baa
--- /dev/null
+++ b/test/data/filters/hexbin.txt
@@ -0,0 +1,34 @@
+boundary : MULTIPOLYGON (((1.66666666 -0.57735027, 2.00000000 0.00000000, 2.66666666 0.00000000, 3.00000000 0.57735027, 2.66666666 1.15470054, 3.00000000 1.73205081, 2.66666666 2.30940107, 2.00000000 2.30940107, 1.66666666 2.88675134, 1.00000000 2.88675134, 0.66666667 2.30940107, 0.00000000 2.30940107, -0.33333333 1.73205081, 0.00000000 1.15470054, -0.33333333 0.57735027, 0.00000000 0.00000000, 0.66666667 0.00000000, 1.00000000 -0.57735027, 1.66666666 -0.57735027)))
+edge_length : 0.66666666600000002
+hex_offsets : MULTIPOINT (0 0, -0.333333 0.57735, 0 1.1547, 0.666667 1.1547, 1 0.57735, 0.666667 0)
+hexagons : 
+	hexagon : 
+		center : POINT (2 1.1547)
+		density : 1
+		gridpos : 2 1
+	hexagon : 
+		center : POINT (2 0)
+		density : 1
+		gridpos : 2 0
+	hexagon : 
+		center : POINT (1 1.1547)
+		density : 1
+		gridpos : 1 1
+	hexagon : 
+		center : POINT (1 0)
+		density : 1
+		gridpos : 1 0
+	hexagon : 
+		center : POINT (1 -1.1547)
+		density : 1
+		gridpos : 1 -1
+	hexagon : 
+		center : POINT (0 1.1547)
+		density : 1
+		gridpos : 0 1
+	hexagon : 
+		center : POINT (0 0)
+		density : 2
+		gridpos : 0 0
+sample_size : 5000
+threshold : 1
diff --git a/test/data/filters/hexbin.xml.in b/test/data/filters/hexbin.xml.in
new file mode 100644
index 0000000..c7fee7e
--- /dev/null
+++ b/test/data/filters/hexbin.xml.in
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/hexbin.las
+        </Option>
+        <Filter type="filters.hexbin">
+            <Option name="edge_size">
+                0.0
+            </Option>
+            <Option name="threshold">
+                10
+            </Option>
+            <Option name="sample_size">
+                5000
+            </Option>
+            <Option name="x_dim">
+                readers.las.X
+            </Option>
+            <Option name="y_dim">
+                Y
+            </Option>
+            <Option name="precision">
+                4
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/hextest.txt b/test/data/filters/hextest.txt
new file mode 100644
index 0000000..130daad
--- /dev/null
+++ b/test/data/filters/hextest.txt
@@ -0,0 +1,8 @@
+0      0      0
+.5     .5     0
+.5     1.65   0
+1      0      0
+1      1.54   0
+1      2.31   0
+2      .5     0
+2      1.65   0
diff --git a/test/data/filters/merge.xml.in b/test/data/filters/merge.xml.in
new file mode 100644
index 0000000..66618a6
--- /dev/null
+++ b/test/data/filters/merge.xml.in
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.merge">
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/filters/pcl/example_PMF_1.json b/test/data/filters/pcl/example_PMF_1.json
new file mode 100644
index 0000000..f70886f
--- /dev/null
+++ b/test/data/filters/pcl/example_PMF_1.json
@@ -0,0 +1,13 @@
+{
+    "pipeline":
+    {
+        "name": "ProgressiveMorphologicalFilterExample",
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 200
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/example_PMF_2.json b/test/data/filters/pcl/example_PMF_2.json
new file mode 100644
index 0000000..4548743
--- /dev/null
+++ b/test/data/filters/pcl/example_PMF_2.json
@@ -0,0 +1,18 @@
+{
+    "pipeline":
+    {
+        "name": "ProgressiveMorphologicalFilterAdvancedExample",
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setCellSize": 1.0,
+                "setMaxWindowSize": 200,
+                "setSlope": 1.0,
+                "setInitialDistance": 0.05,
+                "setMaxDistance": 3.0,
+                "setExponential": true
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/example_PassThrough_1.json b/test/data/filters/pcl/example_PassThrough_1.json
new file mode 100644
index 0000000..88bacaf
--- /dev/null
+++ b/test/data/filters/pcl/example_PassThrough_1.json
@@ -0,0 +1,18 @@
+{
+    "pipeline":
+    {
+        "name": "PassThroughExample",
+        "filters":
+        [
+            {
+                "name": "PassThrough",
+                "setFilterFieldName": "z",
+                "setFilterLimits":
+                {
+                    "min": 410.0,
+                    "max": 440.0
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/example_PassThrough_2.json b/test/data/filters/pcl/example_PassThrough_2.json
new file mode 100644
index 0000000..de32a5c
--- /dev/null
+++ b/test/data/filters/pcl/example_PassThrough_2.json
@@ -0,0 +1,28 @@
+{
+    "pipeline":
+    {
+        "name": "CombinedExample",
+        "help": "Apply passthrough filter followed by statistical outlier removal",
+        "version": 1.0,
+        "author": "Bradley J Chambers",
+        "filters":
+        [
+            {
+                "name": "PassThrough",
+                "help": "filter z values to the range [410,440]",
+                "setFilterFieldName": "z",
+                "setFilterLimits":
+                {
+                    "min": 410.0,
+                    "max": 440.0
+                }
+            },
+            {
+                "name": "StatisticalOutlierRemoval",
+                "help": "apply outlier removal",
+                "setMeanK": 8,
+                "setStddevMulThresh": 0.2
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_APMF_1.json b/test/data/filters/pcl/filter_APMF_1.json
new file mode 100644
index 0000000..0d90a73
--- /dev/null
+++ b/test/data/filters/pcl/filter_APMF_1.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ApproximateProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_ConditionalRemoval_1.json b/test/data/filters/pcl/filter_ConditionalRemoval_1.json
new file mode 100644
index 0000000..b4c0d97
--- /dev/null
+++ b/test/data/filters/pcl/filter_ConditionalRemoval_1.json
@@ -0,0 +1,21 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "NormalEstimation",
+                "setKSearch": 0.0,
+                "setRadiusSearch": 50.0
+            },
+            {
+                "name": "ConditionalRemoval",
+                "normalZ":
+                {
+                    "min": 0.0,
+                    "max": 0.087156
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_ConditionalRemoval_2.json b/test/data/filters/pcl/filter_ConditionalRemoval_2.json
new file mode 100644
index 0000000..dde6a94
--- /dev/null
+++ b/test/data/filters/pcl/filter_ConditionalRemoval_2.json
@@ -0,0 +1,21 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "NormalEstimation",
+                "setKSearch": 0.0,
+                "setRadiusSearch": 50.0
+            },
+            {
+                "name": "ConditionalRemoval",
+                "normalZ":
+                {
+                    "min": 0.01,
+                    "max": 0.10
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_GridMinimum.json b/test/data/filters/pcl/filter_GridMinimum.json
new file mode 100644
index 0000000..c8aac61
--- /dev/null
+++ b/test/data/filters/pcl/filter_GridMinimum.json
@@ -0,0 +1,12 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "GridMinimum",
+                "setResolution": 1000.0
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_NormalEstimation_1.json b/test/data/filters/pcl/filter_NormalEstimation_1.json
new file mode 100644
index 0000000..b4c0d97
--- /dev/null
+++ b/test/data/filters/pcl/filter_NormalEstimation_1.json
@@ -0,0 +1,21 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "NormalEstimation",
+                "setKSearch": 0.0,
+                "setRadiusSearch": 50.0
+            },
+            {
+                "name": "ConditionalRemoval",
+                "normalZ":
+                {
+                    "min": 0.0,
+                    "max": 0.087156
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_NormalEstimation_2.json b/test/data/filters/pcl/filter_NormalEstimation_2.json
new file mode 100644
index 0000000..74c26bf
--- /dev/null
+++ b/test/data/filters/pcl/filter_NormalEstimation_2.json
@@ -0,0 +1,21 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "NormalEstimation",
+                "setKSearch": 0.0,
+                "setRadiusSearch": 51.0
+            },
+            {
+                "name": "ConditionalRemoval",
+                "normalZ":
+                {
+                    "min": 0.0,
+                    "max": 0.087156
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_1.json b/test/data/filters/pcl/filter_PMF_1.json
new file mode 100644
index 0000000..4544a29
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_1.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_2.json b/test/data/filters/pcl/filter_PMF_2.json
new file mode 100644
index 0000000..6f368e8
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_2.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 3.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_3.json b/test/data/filters/pcl/filter_PMF_3.json
new file mode 100644
index 0000000..2eb2115
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_3.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 50,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_4.json b/test/data/filters/pcl/filter_PMF_4.json
new file mode 100644
index 0000000..74b0244
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_4.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 0.25,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_5.json b/test/data/filters/pcl/filter_PMF_5.json
new file mode 100644
index 0000000..effb884
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_5.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_6.json b/test/data/filters/pcl/filter_PMF_6.json
new file mode 100644
index 0000000..c3d33a2
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_6.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.25,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_7.json b/test/data/filters/pcl/filter_PMF_7.json
new file mode 100644
index 0000000..c1a330f
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_7.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 3.0,
+                "setExponential": true,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_8.json b/test/data/filters/pcl/filter_PMF_8.json
new file mode 100644
index 0000000..da7c954
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_8.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": false,
+                "setNegative": false
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PMF_9.json b/test/data/filters/pcl/filter_PMF_9.json
new file mode 100644
index 0000000..c9fdd72
--- /dev/null
+++ b/test/data/filters/pcl/filter_PMF_9.json
@@ -0,0 +1,19 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "ProgressiveMorphologicalFilter",
+                "setMaxWindowSize": 33,
+                "setSlope": 1.0,
+                "setMaxDistance": 2.5,
+                "setInitialDistance": 0.15,
+                "setCellSize": 1.0,
+                "setBase": 2.0,
+                "setExponential": true,
+                "setNegative": true
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PassThrough_1.json b/test/data/filters/pcl/filter_PassThrough_1.json
new file mode 100644
index 0000000..e851c88
--- /dev/null
+++ b/test/data/filters/pcl/filter_PassThrough_1.json
@@ -0,0 +1,17 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "PassThrough",
+                "setFilterFieldName": "z",
+                "setFilterLimits":
+                {
+                    "min": 410.0,
+                    "max": 440.0
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_PassThrough_2.json b/test/data/filters/pcl/filter_PassThrough_2.json
new file mode 100644
index 0000000..9bb8a17
--- /dev/null
+++ b/test/data/filters/pcl/filter_PassThrough_2.json
@@ -0,0 +1,17 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "PassThrough",
+                "setFilterFieldName": "x",
+                "setFilterLimits":
+                {
+                    "min": 636000,
+                    "max": 637000
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_RadiusOutlierRemoval_1.json b/test/data/filters/pcl/filter_RadiusOutlierRemoval_1.json
new file mode 100644
index 0000000..f46bb24
--- /dev/null
+++ b/test/data/filters/pcl/filter_RadiusOutlierRemoval_1.json
@@ -0,0 +1,13 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "RadiusOutlierRemoval",
+                "setMinNeighborsInRadius": 1,
+                "setRadiusSearch": 200.0
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_RadiusOutlierRemoval_2.json b/test/data/filters/pcl/filter_RadiusOutlierRemoval_2.json
new file mode 100644
index 0000000..1a0aa91
--- /dev/null
+++ b/test/data/filters/pcl/filter_RadiusOutlierRemoval_2.json
@@ -0,0 +1,13 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "RadiusOutlierRemoval",
+                "setMinNeighborsInRadius": 2,
+                "setRadiusSearch": 100.0
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_StatisticalOutlierRemoval_1.json b/test/data/filters/pcl/filter_StatisticalOutlierRemoval_1.json
new file mode 100644
index 0000000..19301e0
--- /dev/null
+++ b/test/data/filters/pcl/filter_StatisticalOutlierRemoval_1.json
@@ -0,0 +1,13 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "StatisticalOutlierRemoval",
+                "setMeanK": 2,
+                "setStddevMulThresh": 1.5
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_StatisticalOutlierRemoval_2.json b/test/data/filters/pcl/filter_StatisticalOutlierRemoval_2.json
new file mode 100644
index 0000000..06f5909
--- /dev/null
+++ b/test/data/filters/pcl/filter_StatisticalOutlierRemoval_2.json
@@ -0,0 +1,13 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "StatisticalOutlierRemoval",
+                "setMeanK": 5,
+                "setStddevMulThresh": 0.0
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/filter_VoxelGrid.json b/test/data/filters/pcl/filter_VoxelGrid.json
new file mode 100644
index 0000000..25dde95
--- /dev/null
+++ b/test/data/filters/pcl/filter_VoxelGrid.json
@@ -0,0 +1,17 @@
+{
+    "pipeline":
+    {
+        "filters":
+        [
+            {
+                "name": "VoxelGrid",
+                "setLeafSize":
+                {
+                    "x": 500.0,
+                    "y": 500.0,
+                    "z": 10.0
+                }
+            }
+        ]
+    }
+}
diff --git a/test/data/filters/pcl/passthrough.xml b/test/data/filters/pcl/passthrough.xml
new file mode 100644
index 0000000..4fd39dc
--- /dev/null
+++ b/test/data/filters/pcl/passthrough.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            ../../../temp/foo.las
+        </Option>
+	<Filter type="filters.pclblock">
+	    <Option name="filename">
+                ./example_PassThrough_1.json
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../../autzen/autzen-point-format-3.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/range_classification.xml.in b/test/data/filters/range_classification.xml.in
new file mode 100644
index 0000000..489c17f
--- /dev/null
+++ b/test/data/filters/range_classification.xml.in
@@ -0,0 +1,22 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/only_class_equals_2.las
+        </Option>
+        <Filter type="filters.range">
+            <Option name="dimension">
+                Classification
+                <Options>
+                    <Option name="equals">2</Option>
+                </Options>
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
+
diff --git a/test/data/filters/range_z.xml.in b/test/data/filters/range_z.xml.in
new file mode 100644
index 0000000..1fa29ba
--- /dev/null
+++ b/test/data/filters/range_z.xml.in
@@ -0,0 +1,23 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/only_z_400-500.las
+        </Option>
+        <Filter type="filters.range">
+            <Option name="dimension">
+                Z
+                <Options>
+                    <Option name="min">400</Option>
+                    <Option name="max">500</Option>
+                </Options>
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
+
diff --git a/test/data/filters/range_z_classification.xml.in b/test/data/filters/range_z_classification.xml.in
new file mode 100644
index 0000000..9785a73
--- /dev/null
+++ b/test/data/filters/range_z_classification.xml.in
@@ -0,0 +1,29 @@
+<?xml version="2.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/only_z_400-500_class_equals_2.las
+        </Option>
+        <Filter type="filters.range">
+            <Option name="dimension">
+                Z
+                <Options>
+                    <Option name="min">400</Option>
+                    <Option name="max">500</Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Classification
+                <Options>
+                    <Option name="equals">2</Option>
+                </Options>
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
+
diff --git a/test/data/filters/reproject.xml.in b/test/data/filters/reproject.xml.in
new file mode 100644
index 0000000..d674d4b
--- /dev/null
+++ b/test/data/filters/reproject.xml.in
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Filter type="filters.predicate">
+            <Option name="function">filter</Option>
+            <Option name="source">
+import numpy as np
+
+def filter(ins,outs):
+    cls = ins['Classification']
+
+    keep_classes = [1]
+
+    # Use the first test for our base array.
+    keep = np.equal(cls, keep_classes[0])
+
+    # For 1:n, test each predicate and join back
+    # to our existing predicate array
+    for k in range(1,len(keep_classes)):
+        t = np.equal(cls, keep_classes[k])
+        keep = keep + t
+
+    outs['Mask'] = keep
+    return True
+            </Option>
+            <Option name="module">anything</Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+                <Option name="spatialreference">
+                    EPSG:2993
+                </Option>
+                <Option name="debug">
+                    true
+                </Option>
+                <Option name="verbose">
+                    6
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/sort.xml.in b/test/data/filters/sort.xml.in
new file mode 100644
index 0000000..6b647f3
--- /dev/null
+++ b/test/data/filters/sort.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.sort">
+        <Option name="dimension">
+            X
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/filters/splitter.xml.in b/test/data/filters/splitter.xml.in
new file mode 100644
index 0000000..31b7356
--- /dev/null
+++ b/test/data/filters/splitter.xml.in
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/tiled.las
+        </Option>
+        <Filter type="filters.splitter">
+            <Option name="length">
+                100
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/filters/stats.xml.in b/test/data/filters/stats.xml.in
new file mode 100644
index 0000000..825ff49
--- /dev/null
+++ b/test/data/filters/stats.xml.in
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/pdal-stats.las
+        </Option>
+        <Filter type="filters.stats">
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/hole/autzen-dd.las b/test/data/hole/autzen-dd.las
new file mode 100644
index 0000000..4330b18
Binary files /dev/null and b/test/data/hole/autzen-dd.las differ
diff --git a/test/data/hole/crop.xml.in b/test/data/hole/crop.xml.in
new file mode 100644
index 0000000..edd4d86
--- /dev/null
+++ b/test/data/hole/crop.xml.in
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR/test/temp/hole.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>    
+        <Filter type="filters.crop">
+            <Option name="polygon">
+                POLYGON ((-123.070497025496451 44.058766662574463,-123.065624990686828 44.058248360998967,-123.068009177934087 44.057108097532883,-123.066350612892521 44.056486135642295,-123.066661593837807 44.054101948395022,-123.070289704866255 44.054412929340323,-123.070497025496451 44.058766662574463))
+            </Option>
+            <Option name="outside">
+                true
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/hole/spurious.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/hole/hole.dbf b/test/data/hole/hole.dbf
new file mode 100644
index 0000000..e30ee08
Binary files /dev/null and b/test/data/hole/hole.dbf differ
diff --git a/test/data/hole/hole.las b/test/data/hole/hole.las
new file mode 100644
index 0000000..900d261
Binary files /dev/null and b/test/data/hole/hole.las differ
diff --git a/test/data/hole/hole.prj b/test/data/hole/hole.prj
new file mode 100644
index 0000000..a30c00a
--- /dev/null
+++ b/test/data/hole/hole.prj
@@ -0,0 +1 @@
+GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]
\ No newline at end of file
diff --git a/test/data/hole/hole.qpj b/test/data/hole/hole.qpj
new file mode 100644
index 0000000..5fbc831
--- /dev/null
+++ b/test/data/hole/hole.qpj
@@ -0,0 +1 @@
+GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]
diff --git a/test/data/hole/hole.shp b/test/data/hole/hole.shp
new file mode 100644
index 0000000..e1cf196
Binary files /dev/null and b/test/data/hole/hole.shp differ
diff --git a/test/data/hole/hole.shx b/test/data/hole/hole.shx
new file mode 100644
index 0000000..7988335
Binary files /dev/null and b/test/data/hole/hole.shx differ
diff --git a/test/data/hole/make-spurious.py b/test/data/hole/make-spurious.py
new file mode 100644
index 0000000..86c2c09
--- /dev/null
+++ b/test/data/hole/make-spurious.py
@@ -0,0 +1,29 @@
+from laspy.file import File
+import copy
+inFile = File("autzen-dd.las", mode = "r")
+header = inFile.header
+points = copy.deepcopy(inFile.points)
+
+import numpy as np
+
+X = inFile.X
+Y = inFile.Y
+
+minx = np.min(X)
+miny = np.min(Y)
+
+maxx = np.max(X)
+maxy = np.max(Y)
+
+print minx, miny, maxx, maxy
+x = ((maxx - minx)/2.0 + minx) - 1.0/header.scale[0]
+y = (maxy - miny)/2.0 + miny
+
+print x, y
+
+points[0][0][0] = x
+
+print points[0][0][0]
+outfile = File("spurious.las", mode='w', header = header)
+outfile.points = points
+import pdb;pdb.set_trace()
\ No newline at end of file
diff --git a/test/data/hole/spurious.las b/test/data/hole/spurious.las
new file mode 100644
index 0000000..5ea8503
Binary files /dev/null and b/test/data/hole/spurious.las differ
diff --git a/test/data/icebridge/pipeline.xml.in b/test/data/icebridge/pipeline.xml.in
new file mode 100644
index 0000000..246019f
--- /dev/null
+++ b/test/data/icebridge/pipeline.xml.in
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">@CMAKE_SOURCE_DIR@/test/temp/outfile.txt</Option>
+        <Reader type="readers.icebridge">
+            <Option name="filename">@CMAKE_SOURCE_DIR@/test/data/icebridge/twoPoints.h5</Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/icebridge/twoPoints.h5 b/test/data/icebridge/twoPoints.h5
new file mode 100644
index 0000000..2531ee8
Binary files /dev/null and b/test/data/icebridge/twoPoints.h5 differ
diff --git a/test/data/io/header.json b/test/data/io/header.json
new file mode 100644
index 0000000..8c0002a
--- /dev/null
+++ b/test/data/io/header.json
@@ -0,0 +1,38 @@
+{
+    "version": 3,
+    "tilebbox": [-180.000000, -90.000000, 180.000000, 90.000000],
+    "numTilesX": 2,
+    "numTilesY": 1,
+    "databbox": [1.000000, 2.000000, 11.000000, 12.000000],
+    "numPoints": 10,
+    "dimensions": [
+        {
+            "datatype": "double",
+            "name": "X",
+            "min": 1.000000,
+            "mean": 6.000000,
+            "max": 11.000000
+        },
+        {
+            "datatype": "double",
+            "name": "Y",
+            "min": 2.000000,
+            "mean": 7.000000,
+            "max": 12.000000
+        },
+        {
+            "datatype": "double",
+            "name": "Z",
+            "min": 3.000000,
+            "mean": 8.000000,
+            "max": 13.000000
+        },
+        {
+            "datatype": "uint32_t",
+            "name": "OffsetTime",
+            "min": 0.000000,
+            "mean": 4.500000,
+            "max": 9.000000
+        }
+    ]
+}
diff --git a/test/data/io/p2g-writer.xml.in b/test/data/io/p2g-writer.xml.in
new file mode 100644
index 0000000..4177e48
--- /dev/null
+++ b/test/data/io/p2g-writer.xml.in
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.p2g">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen_grid
+        </Option>
+        <Option name="output_type">
+            min
+        </Option>
+        <Option name="output_format">
+            tif
+        </Option> -->
+	<Reader type="readers.las">
+	    <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+	    </Option>
+	</Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/io/sqlite-reader.xml.in b/test/data/io/sqlite-reader.xml.in
new file mode 100644
index 0000000..13fac99
--- /dev/null
+++ b/test/data/io/sqlite-reader.xml.in
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/written-from-sqlite.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Reader type="readers.sqlite">
+            <Option name="query">
+                SELECT b.schema, l.cloud, l.block_id, l.num_points, l.bbox, l.extent, l.points, b.cloud
+                  FROM simple_blocks l, simple_cloud b
+                 WHERE l.cloud = b.cloud and l.cloud in (1)
+                order by l.cloud
+            </Option>
+            <Option name="connection">
+                /Users/hobu/dev/git/pdal/test/data/autzen-dd.sqlite
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/io/sqlite-writer.xml.in b/test/data/io/sqlite-writer.xml.in
new file mode 100644
index 0000000..35d2a55
--- /dev/null
+++ b/test/data/io/sqlite-writer.xml.in
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.sqlite">
+        <Option name="connection">
+            autzen-dd.sqlite
+        </Option>
+        <Option name="cloud_table_name">
+            SIMPLE_CLOUD
+        </Option>
+        <Option name="block_table_name">
+            SIMPLE_BLOCKS
+        </Option>
+        
+        <Option name="cloud_column_name">
+            CLOUD
+        </Option>
+        <Option name="is3d">
+            false
+        </Option>
+        <Option name="overwrite">
+            true
+        </Option>
+        <Option name="srid">
+            4326
+        </Option>
+        <Option name="base_table_boundary_wkt">
+        </Option>
+        <Option name="pre_block_sql">
+        </Option>
+        <Option name="pre_sql">
+        </Option>
+        <Option name="post_block_sql">
+        </Option>
+        <Option name="capacity">
+            50
+        </Option>
+        <Option name="stream_output_precision">
+            8
+        </Option>
+        <Option name="pack_ignored_fields">
+            true
+        </Option>
+  
+        <Filter type="filters.chipper">
+        <Option name="capacity">
+            50
+        </Option>
+            <Option name="max_cache_blocks">
+                1
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-dd.las
+                </Option>
+                <Option name="spatialreference">
+                    EPSG:4326
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/io/text-writer-csv.xml.in b/test/data/io/text-writer-csv.xml.in
new file mode 100644
index 0000000..a6036f4
--- /dev/null
+++ b/test/data/io/text-writer-csv.xml.in
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen-point-format-3.txt
+        </Option>
+        <Option name="order">
+            Red,Green,X,Y,Blue,Z
+        </Option>
+        <Option name="keep_unspecified">
+            false
+        </Option>        
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-point-format-3.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/io/text-writer-geojson.xml.in b/test/data/io/text-writer-geojson.xml.in
new file mode 100644
index 0000000..14e91dd
--- /dev/null
+++ b/test/data/io/text-writer-geojson.xml.in
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen-point-format-3.txt
+        </Option>
+        <Option name="order">
+            Red,Green,X,Y,Blue,Z
+        </Option>
+        <Option name="keep_unspecified">
+            true    
+        </Option>        
+        <Option name="format">
+            geojson
+        </Option>
+        <Option name="jscallback">
+            pointcloud_callback
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-point-format-3.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/io/text-writer-space-delimited.xml.in b/test/data/io/text-writer-space-delimited.xml.in
new file mode 100644
index 0000000..c33b20d
--- /dev/null
+++ b/test/data/io/text-writer-space-delimited.xml.in
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">
+            STDOUT
+        </Option>
+        <Option name="delimiter"> </Option>
+        <Option name="write_header">true</Option>
+        <Option name="order">X,Y,Z,Red,Green,Blue</Option>
+        <Option name="keep_unspecified">true</Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+            <Option name="spatialreference">
+                EPSG:2993
+	    </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/las/1.2-with-color-clipped.las b/test/data/las/1.2-with-color-clipped.las
new file mode 100644
index 0000000..5953a1d
Binary files /dev/null and b/test/data/las/1.2-with-color-clipped.las differ
diff --git a/test/data/las/1.2-with-color.las b/test/data/las/1.2-with-color.las
new file mode 100644
index 0000000..44cdb3e
Binary files /dev/null and b/test/data/las/1.2-with-color.las differ
diff --git a/test/data/las/1.2-with-color.las.wkt b/test/data/las/1.2-with-color.las.wkt
new file mode 100644
index 0000000..d7d3e70
--- /dev/null
+++ b/test/data/las/1.2-with-color.las.wkt
@@ -0,0 +1 @@
+PROJCS["NAD_1983_Oregon_Statewide_Lambert_Feet_Intl",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1312335.958005249],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-120.5],PARAMETER["Standard_Parallel_1",43.0],PARAMETER["Standard_Parallel_2",45.5],PARAMETER["Latitude_Of_Origin",41.75] [...]
\ No newline at end of file
diff --git a/test/data/las/4_1.las b/test/data/las/4_1.las
new file mode 100644
index 0000000..b006d45
Binary files /dev/null and b/test/data/las/4_1.las differ
diff --git a/test/data/las/4_6.las b/test/data/las/4_6.las
new file mode 100644
index 0000000..0717b32
Binary files /dev/null and b/test/data/las/4_6.las differ
diff --git a/test/data/las/epsg_4326.las b/test/data/las/epsg_4326.las
new file mode 100644
index 0000000..0a7a085
Binary files /dev/null and b/test/data/las/epsg_4326.las differ
diff --git a/test/data/las/extrabytes.las b/test/data/las/extrabytes.las
new file mode 100644
index 0000000..a90481a
Binary files /dev/null and b/test/data/las/extrabytes.las differ
diff --git a/test/data/las/hextest.las b/test/data/las/hextest.las
new file mode 100644
index 0000000..2e3cdd0
Binary files /dev/null and b/test/data/las/hextest.las differ
diff --git a/test/data/las/interesting.las b/test/data/las/interesting.las
new file mode 100644
index 0000000..6b28d2f
Binary files /dev/null and b/test/data/las/interesting.las differ
diff --git a/test/data/las/lots_of_vlr.las b/test/data/las/lots_of_vlr.las
new file mode 100644
index 0000000..6b84fc1
Binary files /dev/null and b/test/data/las/lots_of_vlr.las differ
diff --git a/test/data/las/mvk-thin.las b/test/data/las/mvk-thin.las
new file mode 100644
index 0000000..bc66dd2
Binary files /dev/null and b/test/data/las/mvk-thin.las differ
diff --git a/test/data/las/mvk-thin.las.wkt b/test/data/las/mvk-thin.las.wkt
new file mode 100644
index 0000000..89c3f19
--- /dev/null
+++ b/test/data/las/mvk-thin.las.wkt
@@ -0,0 +1 @@
+PROJCS["NAD83 / Mississippi West",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.2572221010002]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",29.5],PARAMETER["central_meridian",-90.33333333333333],PARAMETER["scale_factor",0.99995],PARAMETER["false_easting",2296583.333333333],PARAMETER["false_northing",0],UNIT["Foot_US",0.30480060960121924]]
\ No newline at end of file
diff --git a/test/data/las/no-points.las b/test/data/las/no-points.las
new file mode 100644
index 0000000..f471d6f
Binary files /dev/null and b/test/data/las/no-points.las differ
diff --git a/test/data/las/noise-clean.las b/test/data/las/noise-clean.las
new file mode 100644
index 0000000..44cdb3e
Binary files /dev/null and b/test/data/las/noise-clean.las differ
diff --git a/test/data/las/noise-dirty.las b/test/data/las/noise-dirty.las
new file mode 100644
index 0000000..1d95fd6
Binary files /dev/null and b/test/data/las/noise-dirty.las differ
diff --git a/test/data/las/permutations/1.0_0.las b/test/data/las/permutations/1.0_0.las
new file mode 100644
index 0000000..f060f68
Binary files /dev/null and b/test/data/las/permutations/1.0_0.las differ
diff --git a/test/data/las/permutations/1.0_1.las b/test/data/las/permutations/1.0_1.las
new file mode 100644
index 0000000..7df7fab
Binary files /dev/null and b/test/data/las/permutations/1.0_1.las differ
diff --git a/test/data/las/permutations/1.1_0.las b/test/data/las/permutations/1.1_0.las
new file mode 100644
index 0000000..5354b00
Binary files /dev/null and b/test/data/las/permutations/1.1_0.las differ
diff --git a/test/data/las/permutations/1.1_1.las b/test/data/las/permutations/1.1_1.las
new file mode 100644
index 0000000..dbbf8d7
Binary files /dev/null and b/test/data/las/permutations/1.1_1.las differ
diff --git a/test/data/las/permutations/1.2-no-points.las b/test/data/las/permutations/1.2-no-points.las
new file mode 100644
index 0000000..add3f15
Binary files /dev/null and b/test/data/las/permutations/1.2-no-points.las differ
diff --git a/test/data/las/permutations/1.2_0.las b/test/data/las/permutations/1.2_0.las
new file mode 100644
index 0000000..be74ae2
Binary files /dev/null and b/test/data/las/permutations/1.2_0.las differ
diff --git a/test/data/las/permutations/1.2_1.las b/test/data/las/permutations/1.2_1.las
new file mode 100644
index 0000000..04e04f3
Binary files /dev/null and b/test/data/las/permutations/1.2_1.las differ
diff --git a/test/data/las/permutations/1.2_2.las b/test/data/las/permutations/1.2_2.las
new file mode 100644
index 0000000..a4c264d
Binary files /dev/null and b/test/data/las/permutations/1.2_2.las differ
diff --git a/test/data/las/permutations/1.2_3.las b/test/data/las/permutations/1.2_3.las
new file mode 100644
index 0000000..e671a35
Binary files /dev/null and b/test/data/las/permutations/1.2_3.las differ
diff --git a/test/data/las/simple.las b/test/data/las/simple.las
new file mode 100644
index 0000000..5d883ec
Binary files /dev/null and b/test/data/las/simple.las differ
diff --git a/test/data/las/utm15.las b/test/data/las/utm15.las
new file mode 100644
index 0000000..814158b
Binary files /dev/null and b/test/data/las/utm15.las differ
diff --git a/test/data/las/utm17.las b/test/data/las/utm17.las
new file mode 100644
index 0000000..74f3d3d
Binary files /dev/null and b/test/data/las/utm17.las differ
diff --git a/test/data/laszip/basefile.las b/test/data/laszip/basefile.las
new file mode 100644
index 0000000..44cdb3e
Binary files /dev/null and b/test/data/laszip/basefile.las differ
diff --git a/test/data/laszip/laszip-generated.laz b/test/data/laszip/laszip-generated.laz
new file mode 100644
index 0000000..84ef4e1
Binary files /dev/null and b/test/data/laszip/laszip-generated.laz differ
diff --git a/test/data/laszip/laszip-generated_with2bytespadding.laz b/test/data/laszip/laszip-generated_with2bytespadding.laz
new file mode 100644
index 0000000..f14127b
Binary files /dev/null and b/test/data/laszip/laszip-generated_with2bytespadding.laz differ
diff --git a/test/data/laszip/liblas-generated.laz b/test/data/laszip/liblas-generated.laz
new file mode 100644
index 0000000..0a42330
Binary files /dev/null and b/test/data/laszip/liblas-generated.laz differ
diff --git a/test/data/laz/simple.laz b/test/data/laz/simple.laz
new file mode 100644
index 0000000..a867f27
Binary files /dev/null and b/test/data/laz/simple.laz differ
diff --git a/test/data/logs/log_py.txt b/test/data/logs/log_py.txt
new file mode 100644
index 0000000..586a766
--- /dev/null
+++ b/test/data/logs/log_py.txt
@@ -0,0 +1 @@
+Testing log output through python script.
diff --git a/test/data/logs/logtest.txt b/test/data/logs/logtest.txt
new file mode 100644
index 0000000..6d821b3
--- /dev/null
+++ b/test/data/logs/logtest.txt
@@ -0,0 +1 @@
+(readers.faux Debug: 8): 					Reading a point view of 750 points.
diff --git a/test/data/logs/logtest_1.txt b/test/data/logs/logtest_1.txt
new file mode 100644
index 0000000..6d821b3
--- /dev/null
+++ b/test/data/logs/logtest_1.txt
@@ -0,0 +1 @@
+(readers.faux Debug: 8): 					Reading a point view of 750 points.
diff --git a/test/data/logs/logtest_123.txt b/test/data/logs/logtest_123.txt
new file mode 100644
index 0000000..d816f82
--- /dev/null
+++ b/test/data/logs/logtest_123.txt
@@ -0,0 +1,5 @@
+(readers.faux Debug: 8): 					Reading a point view of 750 points.
+(filters.programmable Debug: 8): 					Python script source=[117 bytes], module=xModule, function=xfunc
+ processing 750 points.
+(filters.programmable Debug: 8): 					Python script source=[117 bytes], module=yModule, function=yfunc
+ processing 750 points.
diff --git a/test/data/logs/logtest_2.txt b/test/data/logs/logtest_2.txt
new file mode 100644
index 0000000..3e20d30
--- /dev/null
+++ b/test/data/logs/logtest_2.txt
@@ -0,0 +1,2 @@
+(filters.programmable Debug: 8): 					Python script source=[117 bytes], module=xModule, function=xfunc
+ processing 750 points.
diff --git a/test/data/logs/logtest_3.txt b/test/data/logs/logtest_3.txt
new file mode 100644
index 0000000..37245e2
--- /dev/null
+++ b/test/data/logs/logtest_3.txt
@@ -0,0 +1,2 @@
+(filters.programmable Debug: 8): 					Python script source=[117 bytes], module=yModule, function=yfunc
+ processing 750 points.
diff --git a/test/data/misc/data1.dat b/test/data/misc/data1.dat
new file mode 100644
index 0000000..6a81654
--- /dev/null
+++ b/test/data/misc/data1.dat
@@ -0,0 +1 @@
+abcde
\ No newline at end of file
diff --git a/test/data/misc/data1.txt b/test/data/misc/data1.txt
new file mode 100644
index 0000000..ef72365
--- /dev/null
+++ b/test/data/misc/data1.txt
@@ -0,0 +1,3 @@
+The quick brown fox
+jumped over
+the lazy dog.
diff --git a/test/data/misc/data2.dat b/test/data/misc/data2.dat
new file mode 100644
index 0000000..3f33d77
--- /dev/null
+++ b/test/data/misc/data2.dat
@@ -0,0 +1 @@
+abcdf
\ No newline at end of file
diff --git a/test/data/misc/data2.txt b/test/data/misc/data2.txt
new file mode 100644
index 0000000..49095f4
--- /dev/null
+++ b/test/data/misc/data2.txt
@@ -0,0 +1,3 @@
+The quick brown fox
+jumped o'er
+the lazy dog.
diff --git a/test/data/misc/data3.dat b/test/data/misc/data3.dat
new file mode 100644
index 0000000..f2ba8f8
--- /dev/null
+++ b/test/data/misc/data3.dat
@@ -0,0 +1 @@
+abc
\ No newline at end of file
diff --git a/test/data/misc/data3.txt b/test/data/misc/data3.txt
new file mode 100644
index 0000000..ee4de51
--- /dev/null
+++ b/test/data/misc/data3.txt
@@ -0,0 +1,5 @@
+The quick brown fox
+jumped over
+the lazy dog.
+Oh, that
+lazy dog.
diff --git a/test/data/misc/data4a.dat b/test/data/misc/data4a.dat
new file mode 100644
index 0000000..e85d5b4
--- /dev/null
+++ b/test/data/misc/data4a.dat
@@ -0,0 +1 @@
+abcdefghijklmnopqrstuvwxyz
\ No newline at end of file
diff --git a/test/data/misc/data4b.dat b/test/data/misc/data4b.dat
new file mode 100644
index 0000000..769fe18
--- /dev/null
+++ b/test/data/misc/data4b.dat
@@ -0,0 +1 @@
+abcDEFGhijklmnopqrstuvw**z
\ No newline at end of file
diff --git a/test/data/misc/opts2json.txt b/test/data/misc/opts2json.txt
new file mode 100644
index 0000000..7bf6c6c
--- /dev/null
+++ b/test/data/misc/opts2json.txt
@@ -0,0 +1,43 @@
+{
+  "options" :
+  {
+    "test1" :
+    {
+      "value" : "This is a test",
+      "description" : ""
+    },
+    "test2" :
+    {
+      "value" : "56",
+      "description" : ""
+    },
+    "test3" :
+    {
+      "value" : "27.5",
+      "description" : "Testing test3"
+    },
+    "test3.5" :
+    {
+      "value" : "3.5",
+      "description" : ""
+      "options" :
+      {
+        "subtest1" :
+        {
+          "value" : "Subtest1",
+          "description" : ""
+        },
+        "subtest2" :
+        {
+          "value" : "Subtest2",
+          "description" : ""
+        }
+      }
+    },
+    "test4" :
+    {
+      "value" : "Testing option test 4",
+      "description" : ""
+    }
+  }
+}
diff --git a/test/data/misc/opts2json_meta.txt b/test/data/misc/opts2json_meta.txt
new file mode 100644
index 0000000..57b7950
--- /dev/null
+++ b/test/data/misc/opts2json_meta.txt
@@ -0,0 +1,43 @@
+{
+  "options":
+  {
+    "test1":
+    {
+      "description": "",
+      "value": "This is a test"
+    },
+    "test2":
+    {
+      "description": "",
+      "value": "56"
+    },
+    "test3":
+    {
+      "description": "Testing test3",
+      "value": "27.5"
+    },
+    "test3.5":
+    {
+      "description": "",
+      "options":
+      {
+        "subtest1":
+        {
+          "description": "",
+          "value": "Subtest1"
+        },
+        "subtest2":
+        {
+          "description": "",
+          "value": "Subtest2"
+        }
+      },
+      "value": "3.5"
+    },
+    "test4":
+    {
+      "description": "",
+      "value": "Testing option test 4"
+    }
+  }
+}
diff --git a/test/data/mrsid/Tetons_200k.las.sid b/test/data/mrsid/Tetons_200k.las.sid
new file mode 100644
index 0000000..4ffd1b0
Binary files /dev/null and b/test/data/mrsid/Tetons_200k.las.sid differ
diff --git a/test/data/nitf/autzen-utm10.las b/test/data/nitf/autzen-utm10.las
new file mode 100644
index 0000000..0def026
Binary files /dev/null and b/test/data/nitf/autzen-utm10.las differ
diff --git a/test/data/nitf/autzen-utm10.ntf b/test/data/nitf/autzen-utm10.ntf
new file mode 100644
index 0000000..7680952
Binary files /dev/null and b/test/data/nitf/autzen-utm10.ntf differ
diff --git a/test/data/nitf/chipper.xml.in b/test/data/nitf/chipper.xml.in
new file mode 100644
index 0000000..17f25cf
--- /dev/null
+++ b/test/data/nitf/chipper.xml.in
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+      <Filter type="filters.chipper">
+        <Option name="capacity">15</Option>
+          <Reader type="readers.nitf">
+            <Option name="spatialreference">EPSG:32610</Option>
+	    <Option name="filename">@CMAKE_SOURCE_DIR@/test/data/nitf/autzen-utm10.ntf</Option>
+            <Option name="debug">true</Option>
+            <Option name="verbose">7</Option>
+          </Reader>
+      </Filter>
+</Pipeline>
diff --git a/test/data/nitf/conversion.xml.in b/test/data/nitf/conversion.xml.in
new file mode 100644
index 0000000..20ef595
--- /dev/null
+++ b/test/data/nitf/conversion.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/nitf.las
+        </Option>
+            <Reader type="readers.nitf">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/nitf/autzen-utm10.ntf
+                </Option>
+            </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/nitf/las2nitf.xml.in b/test/data/nitf/las2nitf.xml.in
new file mode 100644
index 0000000..7bbf35a
--- /dev/null
+++ b/test/data/nitf/las2nitf.xml.in
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.nitf">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/output.ntf
+        </Option>
+        <Option name="scale_x">0.01</Option>
+        <Option name="offset_x">311898.23</Option>
+        <Option name="scale_y">0.01</Option>
+        <Option name="offset_y">4703909.84</Option>
+        <Option name="scale_z">0.01</Option>
+        <Option name="offset_z">7.385474</Option>
+        <Option name="FSCLAS">U</Option>
+        <Option name="IDATIM" type="string">20131206140713</Option>
+        <Option name="FSCLTX" type="string">SIC:0 CH_FO</Option>
+        <Option name="FTITLE" type="string">output.ntf</Option>
+        <Option name="GEOLOB" type="string">GEOLOB00048017898386021508996+063.7163336371+034.</Option>
+        <Option name="metadata">
+            <Options>
+                <Option name="software_id">
+                    forward
+                </Option>
+                <Option name="system_id">
+                    PDAL2NTF
+                </Option>
+                <Option name="creation_doy">
+                    forward
+                </Option>
+                <Option name="creation_year">
+                    forward
+                </Option>
+                <Option name="vlr">
+                    dGhpcyBpcyBzb21lIG5ldyB2bHIgdGV4dA==
+                    <Options>
+                        <Option name="record_id">
+                            4321
+                        </Option>
+                        <Option name="user_id">
+                            new VLR
+                        </Option>
+                        <Option name="description">
+                            a description of a new VLR
+                        </Option>
+                    </Options>
+                </Option>
+            </Options>
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/utm15.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/nitf/reader.xml b/test/data/nitf/reader.xml
new file mode 100644
index 0000000..02ca9ed
--- /dev/null
+++ b/test/data/nitf/reader.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+            <Reader type="readers.nitf">
+                <Option name="filename">
+                    ../07015_Hamrin_Mountains_Tile_000249_nga.ntf
+                </Option>
+                <Option name="debug">
+                    true
+                </Option>  
+                <Option name="verbose">
+                    7
+                </Option> 
+            </Reader>
+</Pipeline>
diff --git a/test/data/nitf/write_laz.xml.in b/test/data/nitf/write_laz.xml.in
new file mode 100644
index 0000000..e20f499
--- /dev/null
+++ b/test/data/nitf/write_laz.xml.in
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.nitf">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/pdal-compressed.ntf
+        </Option>
+        <Option name="compression">
+            true
+        </Option>
+        <Option name="FSCLASS">
+            U
+        </Option>
+        <Option name="OPHONE">
+            5159664628
+        </Option>
+        <Option name="ONAME">
+            Howard Butler
+        </Option>
+        <Option name="IDATIM">
+            20110516183337
+        </Option>
+        <Option name="FTITLE">
+            This is the title
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/nitf/write_options.xml.in b/test/data/nitf/write_options.xml.in
new file mode 100644
index 0000000..412bf0d
--- /dev/null
+++ b/test/data/nitf/write_options.xml.in
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.nitf">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/pdal-compressed.ntf
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Option name="FSCLASS">
+            U
+        </Option>
+        <Option name="OPHONE">
+            5159664628
+        </Option>
+        <Option name="ONAME">
+            Howard Butler
+        </Option>
+        <Option name="IDATIM">
+            20110516183337
+        </Option>
+        <Option name="FTITLE">
+            This is the title
+        </Option>
+        <Option name="FSCTLH">
+            N
+        </Option>
+        <Option name="AIMIDB">
+            <Options>
+                <Option name="COUNTRY">
+                    US
+                </Option>
+                <Option name="ACQUISITION_DATE">
+                    Someday
+                </Option>
+                <Option name="MISSION_IDENTIFICATION">
+                    IDENT
+                </Option>
+                <Option name="LOCATION">
+                    Somewhere
+                </Option>
+            </Options>
+        </Option>
+        <Option name="ACFTB">
+            <Options>
+                <Option name="AC_MSN_ID">
+                    ID
+                </Option>
+            </Options>
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+                <Option name="spatialreference"> PROJCS["NAD_1983_Oregon_Statewide_Lambert_Feet_Intl",GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]],PROJECTION["Lambert_Conformal_Conic_2SP"],PARAMETER["False_Easting",1312335.958005249],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-120.5],PARAMETER["Standard_Parallel_1",43.0],PARAMETER["Standard_Parall [...]
+                </Option>                
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/nitf/write_test1.ntf b/test/data/nitf/write_test1.ntf
new file mode 100644
index 0000000..cd46470
Binary files /dev/null and b/test/data/nitf/write_test1.ntf differ
diff --git a/test/data/optech/sample.csd b/test/data/optech/sample.csd
new file mode 100644
index 0000000..2e2c050
Binary files /dev/null and b/test/data/optech/sample.csd differ
diff --git a/test/data/oracle/big-read.xml b/test/data/oracle/big-read.xml
new file mode 100644
index 0000000..05dc88b
--- /dev/null
+++ b/test/data/oracle/big-read.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Option name="chunk_size">
+            80000
+        </Option>
+        <Option name="xml_schema_dump">
+            schema-document.xml
+        </Option>
+        <Reader type="readers.oci">
+            <Option name="query">
+                select l."OBJ_ID", l."BLK_ID", l."BLK_EXTENT", l."BLK_DOMAIN", l."PCBLK_MIN_RES", l."PCBLK_MAX_RES", l."NUM_POINTS", l."NUM_UNSORTED_POINTS", l."PT_SORT_DIM", l."POINTS", b.cloud from AUTZEN_COPY_CLOUD b, autzen_COPY_blocks l 
+                                where b.cloud.pc_id = l.obj_id
+                                and b.id = 1
+            </Option>
+            <Option name="connection">
+                grid/grid at localhost/vm
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/big-write.xml b/test/data/oracle/big-write.xml
new file mode 100644
index 0000000..d6b7214
--- /dev/null
+++ b/test/data/oracle/big-write.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.oci">
+        <Option name="debug">
+            true
+        </Option>
+        <Option name="verbose">
+            1
+        </Option>
+        <Option name="connection">
+            grid/grid at localhost/vm
+        </Option>
+        <Option name="base_table_name">
+            AUTZEN_COPY_CLOUD
+        </Option>
+        <Option name="block_table_name">
+            AUTZEN_COPY_BLOCKS
+        </Option>
+        <Option name="cloud_column_name">
+            CLOUD
+        </Option>
+        <Option name="is3d">
+            false
+        </Option>
+        <Option name="solid">
+            false
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="srid">
+            4269
+        </Option>
+        <Option name="base_table_aux_columns">
+        </Option>
+        <Option name="base_table_aux_values">
+        </Option>
+        <Option name="base_table_boundary_column">
+        </Option>
+        <Option name="base_table_boundary_wkt">
+        </Option>
+        <Option name="pre_block_sql">
+        </Option>
+        <Option name="pre_sql">
+        </Option>
+        <Option name="post_block_sql">
+        </Option>
+        <Option name="capacity">
+            25000
+        </Option>
+        <Option name="stream_output_precision">
+            8
+        </Option>
+        <Option name="disable_cloud_trigger">
+            true
+        </Option>
+        <Option name="pack_ignored_fields">
+            false
+        </Option>
+
+                <Filter type="filters.chipper">
+                    <Option name="capacity">
+                        25000
+                    </Option>
+                    <Reader type="readers.las">
+                        <Option name="filename">
+                            ../local/autzen/autzen-colorized-1.2.3-hole.laz
+                        </Option>
+                        <Option name="spatialreference">
+                            EPSG:2926
+                        </Option>
+                    </Reader>
+            </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/cleanup.sql b/test/data/oracle/cleanup.sql
new file mode 100644
index 0000000..0082d4e
--- /dev/null
+++ b/test/data/oracle/cleanup.sql
@@ -0,0 +1,34 @@
+set echo on;
+declare 
+    blks VARCHAR(40);
+    clouds VARCHAR(40);
+    name VARCHAR(40);
+metadata VARCHAR(200);
+begin
+
+name := '&1';
+clouds := name ||'_CLOUD';
+blks := name ||'_BLOCKS';
+
+FOR i IN (SELECT table_name FROM user_tables WHERE table_name = clouds) LOOP
+    EXECUTE IMMEDIATE 'DROP TABLE ' || clouds || ' PURGE';
+END LOOP;
+
+FOR i IN (SELECT table_name FROM user_tables WHERE table_name = blks) LOOP
+    EXECUTE IMMEDIATE 'delete from ' || blks;
+    EXECUTE IMMEDIATE 'DROP TABLE ' || blks || ' PURGE';
+END LOOP;
+
+
+execute immediate 'purge recyclebin';
+execute immediate 'purge tablespace GRID';
+execute immediate 'CREATE TABLE '|| clouds ||'(id number, CLOUD SDO_PC, BOUNDARY SDO_GEOMETRY)';
+metadata := q'{delete from user_sdo_geom_metadata where table_name =  :blks}';
+
+execute immediate metadata using blks;
+commit;
+
+end;
+/
+
+exit;
\ No newline at end of file
diff --git a/test/data/oracle/qfit-read.xml b/test/data/oracle/qfit-read.xml
new file mode 100644
index 0000000..983c88d
--- /dev/null
+++ b/test/data/oracle/qfit-read.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Reader type="readers.oci">
+        <Option name="query">
+            SELECT CLOUD FROM QFIT_CLOUD where ID=1
+        </Option>
+        <Option name="connection">
+            lidar/lidar at oracle.hobu.biz/lidar
+        </Option>
+        <Option name="debug">
+            true
+        </Option>
+    </Reader>
+</Pipeline>
diff --git a/test/data/oracle/qfit-write.xml b/test/data/oracle/qfit-write.xml
new file mode 100644
index 0000000..2c8c7cb
--- /dev/null
+++ b/test/data/oracle/qfit-write.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.oci">
+        <Option name="debug">
+            true
+        </Option>
+        <Option name="verbose">
+            1
+        </Option>
+        <Option name="connection">
+            lidar/lidar at oracle.hobu.biz/lidar
+        </Option>
+        <Option name="base_table_name">
+            QFIT_CLOUD
+        </Option>
+        <Option name="block_table_name">
+            QFIT_BLOCKS
+        </Option>
+        <Option name="cloud_column_name">
+            CLOUD
+        </Option>
+        <Option name="is3d">
+            false
+        </Option>
+        <Option name="solid">
+            false
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="srid">
+            4269
+        </Option>
+        <Option name="base_table_aux_columns">
+        </Option>
+        <Option name="base_table_aux_values">
+        </Option>
+        <Option name="base_table_boundary_column">
+        </Option>
+        <Option name="base_table_boundary_wkt">
+        </Option>
+        <Option name="pre_block_sql">
+        </Option>
+        <Option name="pre_sql">
+        </Option>
+        <Option name="post_block_sql">
+        </Option>
+        <Option name="capacity">
+            50
+        </Option>
+        <Option name="stream_output_precision">
+            8
+        </Option>
+  
+        <Filter type="filters.chipper">
+            <Option name="capacity">
+                50
+            </Option>
+	    <Reader type="readers.qfit">
+		<Option name="filename">
+		    ../qfit/14-word.qi
+		</Option>
+		<Option name="debug">
+		    true
+		</Option>
+		<Option name="verbose">
+		    1
+		</Option>
+		<Option name="flip_coordinates">
+		    true
+		</Option>
+		<Option name="convert_z_units">
+		    true
+		</Option>
+		<Option name="spatialreference">
+		    EPSG:4269+3855
+		</Option>
+	    </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/read-colorize.xml b/test/data/oracle/read-colorize.xml
new file mode 100644
index 0000000..97c9e43
--- /dev/null
+++ b/test/data/oracle/read-colorize.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Filter type="filters.colorization">
+            <Option name="dimension">
+                Red
+                <Options>
+                    <Option name="band">
+                        0
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Green
+                <Options>
+                    <Option name="band">
+                        0
+                    </Option>
+                    <Option name="scale">
+                        1.0
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="dimension">
+                Blue
+                <Options>
+                    <Option name="band">
+                        0
+                    </Option>
+                    <Option name="scale">
+                        256
+                    </Option>
+                </Options>
+            </Option>
+            <Option name="raster">
+                ../autzen.jpg
+            </Option>
+            <Reader type="readers.oci">
+                <Option name="query">
+                    SELECT CLOUD FROM SIMPLE_CLOUD
+                </Option>
+                <Option name="xml_schema_dump">
+                    oracle-schema.xml
+                </Option>
+                <Option name="connection">
+                    lidar/lidar at lidar.hobu.biz/lidar
+                </Option>
+                <Option name="debug">
+                    true
+                </Option>
+                <Option name="verbose">
+                    3
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/read.xml b/test/data/oracle/read.xml
new file mode 100644
index 0000000..a375eb7
--- /dev/null
+++ b/test/data/oracle/read.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Reader type="readers.oci">
+            <Option name="query">
+                            
+                SELECT l."OBJ_ID", l."BLK_ID", l."BLK_EXTENT", l."BLK_DOMAIN",
+                       l."PCBLK_MIN_RES", l."PCBLK_MAX_RES", l."NUM_POINTS",
+                       l."NUM_UNSORTED_POINTS", l."PT_SORT_DIM", l."POINTS", b.cloud
+                  FROM SIMPLE_BLOCKS l, SIMPLE_CLOUD b
+                 WHERE l.obj_id = b.id and l.obj_id in (1)
+                order by l.obj_id
+            </Option>
+            <Option name="xml_schema_dump">
+                flipped-dimensions.xml
+            </Option>
+            <Option name="connection">
+                grid/grid at localhost/vm
+            </Option>
+            
+            <!-- <Option name="populate_pointsourceid">
+                true
+            </Option>       -->      
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/view-read.xml b/test/data/oracle/view-read.xml
new file mode 100644
index 0000000..693b92e
--- /dev/null
+++ b/test/data/oracle/view-read.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+	<Filter type="filters.crop">
+	    <Option name="outside">false</Option>
+	    <Option name="y_dim">readers.oci.Y</Option>
+	    <Option name="z_dim">readers.oci.Z</Option>
+	    <Option name="polygon">POLYGON ((-123.070314549836326 44.057089038234523 128.839019531250017,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070271177640294 44.056943121718128 128.768772656250007,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.070162496376781 44.056998992754814 128.790203906250014,-123.069979815780442 44.057056534650307 129.281039062500014,-123.069979815780442 44.0570565346 [...]
+	    <Option name="x_dim">readers.oci.X</Option>                    
+	    <Reader type="readers.oci">
+		<Option name="query">
+		    
+SELECT l."OBJ_ID", l."BLK_ID", l."BLK_EXTENT", l."BLK_DOMAIN",
+l."PCBLK_MIN_RES", l."PCBLK_MAX_RES", l."NUM_POINTS",
+l."NUM_UNSORTED_POINTS", l."PT_SORT_DIM", l."POINTS", b.cloud
+FROM SIMPLE_BLOCKS l, SIMPLE_CLOUD b
+WHERE l.obj_id = b.id and l.obj_id in (1,2)
+order by l.obj_id
+		</Option>
+		<Option name="connection">
+		    grid/grid at localhost/vm
+		</Option>
+		<Option name="debug">
+		    true
+		</Option>
+		<Option name="populate_pointsourceid">
+		    true
+		</Option>
+	     
+	    </Reader>
+	</Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/oracle/wake-hobu-environment.sh b/test/data/oracle/wake-hobu-environment.sh
new file mode 100755
index 0000000..db72724
--- /dev/null
+++ b/test/data/oracle/wake-hobu-environment.sh
@@ -0,0 +1,3 @@
+export ORACLE_HOME=$HOME/oracle
+export PATH=$PATH:$ORACLE_HOME
+export DYLD_LIBRARY_PATH=$ORACLE_HOME:$DYLD_LIBRARY_PATH
diff --git a/test/data/oracle/write.xml b/test/data/oracle/write.xml
new file mode 100644
index 0000000..deae518
--- /dev/null
+++ b/test/data/oracle/write.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.oci">
+        <Option name="connection">
+            grid/grid at localhost/vm
+        </Option>
+        <Option name="base_table_name">
+            SIMPLE_CLOUD
+        </Option>
+        <Option name="block_table_name">
+            SIMPLE_BLOCKS
+        </Option>
+        <Option name="store_dimensional_orientation">true</Option>
+        
+        <Option name="cloud_column_name">
+            CLOUD
+        </Option>
+        <Option name="is3d">
+            false
+        </Option>
+        <Option name="solid">
+            false
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="disable_cloud_trigger">
+            true
+        </Option>
+        <Option name="srid">
+            4269
+        </Option>
+        <Option name="base_table_aux_columns">
+        </Option>
+        <Option name="base_table_aux_values">
+        </Option>
+        <Option name="base_table_boundary_column">
+        </Option>
+        <Option name="base_table_boundary_wkt">
+        </Option>
+        <Option name="pre_block_sql">
+        </Option>
+        <Option name="pre_sql">
+        </Option>
+        <Option name="post_block_sql">
+        </Option>
+        <Option name="capacity">
+            50
+        </Option>
+        <Option name="stream_output_precision">
+            8
+        </Option>
+        <Option name="pack_ignored_fields">
+            true
+        </Option>
+        <Filter type="filters.stats">
+           <Option name="exact_dimensions">Classification</Option>
+           <Option name="dimensions">readers.las.X, readers.las.Y, readers.las.Z, Classification</Option>        
+                <Filter type="filters.chipper">
+                    <Option name="capacity">
+                        50
+                    </Option>
+		    <Reader type="readers.las">
+			    <Option name="filename">
+				../autzen-dd-pf0.las
+			    </Option>
+			    <Option name="spatialreference">
+				EPSG:4326
+			    </Option>
+			    <!-- <Option name="log">
+				oracle-pipeline-write.log
+			    </Option>     -->
+		    </Reader>
+            </Filter>            
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad01.xml b/test/data/pipeline/bad/pipeline_bad01.xml
new file mode 100644
index 0000000..9c092bc
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad01.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer>
+        <!-- bad: no Type element -->
+        <!-- <Type>writers.las</Type> -->
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad02.xml b/test/data/pipeline/bad/pipeline_bad02.xml
new file mode 100644
index 0000000..f647911
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad02.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <!-- bad: no child of Filter -->
+            <!--<Reader type="readers.las">
+                <Option name="filename">
+                    1.2-with-color.las
+                </Option>
+            </Reader>-->
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad03.xml b/test/data/pipeline/bad/pipeline_bad03.xml
new file mode 100644
index 0000000..4527ca2
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad03.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <MultiFilter type="filters.mosaic">
+            <!-- bad: no child of MultiFilter -->
+            <!--<Reader type="readers.las">
+                <Option name="filename">
+					1.2-with-color.las
+                </Option>
+            </Reader>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    1.2-with-color.las
+                </Option>
+            </Reader>-->
+        </MultiFilter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad04.xml b/test/data/pipeline/bad/pipeline_bad04.xml
new file mode 100644
index 0000000..6bb0a17
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad04.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <!-- bad: no child of Writer -->
+        <!--<Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>-->
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad05.xml b/test/data/pipeline/bad/pipeline_bad05.xml
new file mode 100644
index 0000000..f538245
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad05.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reader>
+            <!-- bad: extra child of Filter -->
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad06.xml b/test/data/pipeline/bad/pipeline_bad06.xml
new file mode 100644
index 0000000..0cd5e03
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad06.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+        <!-- bad: extra child of Writer -->
+        <Reader type="readers.las">
+            <Option name="filename">
+                ../las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad07.xml b/test/data/pipeline/bad/pipeline_bad07.xml
new file mode 100644
index 0000000..b482729
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad07.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+         </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    las/1.2-with-color.las
+                </Option>
+                <!-- bad: child of reader -->
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        ../las/1.2-with-color.las
+                    </Option>
+                </Reader>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad08.xml b/test/data/pipeline/bad/pipeline_bad08.xml
new file mode 100644
index 0000000..8b18877
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad08.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <!-- bad: unknown element type -->
+            <Reafdsadsafdsafdsafder type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reafdsadsafdsafdsafder>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/bad/pipeline_bad09.xml b/test/data/pipeline/bad/pipeline_bad09.xml
new file mode 100644
index 0000000..9cf91c7
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad09.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- bad: root element not Pipeline -->
+<!--<Pipeline version="1.0">-->
+    <Writer type="writers.las">
+        <Option name="filename">
+            out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+<!--</Pipeline>-->
diff --git a/test/data/pipeline/bad/pipeline_bad10.xml b/test/data/pipeline/bad/pipeline_bad10.xml
new file mode 100644
index 0000000..37f1aca
--- /dev/null
+++ b/test/data/pipeline/bad/pipeline_bad10.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- bad: root element not Pipeline -->
+<!--<Pipeline version="1.0">-->
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    ../1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+<!--</Pipeline>-->
diff --git a/test/data/pipeline/drop_color.xml.in b/test/data/pipeline/drop_color.xml.in
new file mode 100644
index 0000000..a8c429c
--- /dev/null
+++ b/test/data/pipeline/drop_color.xml.in
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/pdal-compressed.laz
+        </Option>
+        <Option name="compression">
+            true
+        </Option>
+	<Filter type="filters.crop">
+	    <Option name="bounds">
+		([0,1000000],[0,1000000],[0,1000000])
+	    </Option>
+	    <Reader type="readers.las">
+		<Option name="filename">
+		    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+		</Option>
+	    </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_interpolate.xml.in b/test/data/pipeline/pipeline_interpolate.xml.in
new file mode 100644
index 0000000..e137e10
--- /dev/null
+++ b/test/data/pipeline/pipeline_interpolate.xml.in
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.p2g">
+        <Option name="grid_dist_x">
+            6.0
+        </Option>
+        <Option name="grid_dist_y">
+            6.0
+        </Option>
+        <Option name="radius">
+            8.4852813742385713
+        </Option>
+        <Option name="chunk_size">
+            1234
+        </Option>
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/autzen_grid
+        </Option>
+        <Option name="output_type">
+            min
+        </Option>
+        <Option name="output_type">
+            max
+        </Option>
+        <Option name="output_type">
+            mean
+        </Option>
+        <Option name="output_type">
+            idw
+        </Option>
+        <Option name="output_type">
+            den
+        </Option>
+        <!-- <Option name="output_type">
+            all
+        </Option> -->
+        <Option name="output_format">
+            asc
+        </Option> -->
+        <!-- <Option name="output_format">
+            grid
+        </Option>     -->
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+            <Option name="spatialreference">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las.wkt
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+            <Option name="verbose">
+                6
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_metadata_reader.xml.in b/test/data/pipeline/pipeline_metadata_reader.xml.in
new file mode 100644
index 0000000..f2f9a1c
--- /dev/null
+++ b/test/data/pipeline/pipeline_metadata_reader.xml.in
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Reader type="readers.las">
+        <Option name="filename">
+	    @CMAKE_SOURCE_DIR@/test/data/las/interesting.las
+        </Option>
+    </Reader>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_metadata_writer.xml.in b/test/data/pipeline/pipeline_metadata_writer.xml.in
new file mode 100644
index 0000000..bfea24b
--- /dev/null
+++ b/test/data/pipeline/pipeline_metadata_writer.xml.in
@@ -0,0 +1,54 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/metadata-output.las
+        </Option>
+        <Option name="metadata">
+            <Options>
+                <Option name="software_id">
+                    forward
+                </Option>
+                <Option name="system_id">
+                    SOMEVALUE
+                </Option>
+                <Option name="creation_doy">
+                    forward
+                </Option>            
+                <Option name="creation_year">
+                    forward
+                </Option>            
+                <Option name="vlr">
+                    forward
+                    <Options>
+                        <Option name="record_id">
+                            1234
+                        </Option>
+                        <Option name="user_id">
+                            hobu
+                        </Option>                
+                    </Options>
+                </Option>
+                <Option name="vlr">
+                    dGhpcyBpcyBzb21lIG5ldyB2bHIgdGV4dA==
+                    <Options>
+                        <Option name="record_id">
+                            4321
+                        </Option>
+                        <Option name="user_id">
+                            new VLR
+                        </Option>                
+                        <Option name="description">
+                            a description of a new VLR
+                        </Option>                
+                    </Options>
+                </Option>
+            </Options>
+        </Option>    
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/interesting.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_mississippi.xml.in b/test/data/pipeline/pipeline_mississippi.xml.in
new file mode 100644
index 0000000..ff1f4aa
--- /dev/null
+++ b/test/data/pipeline/pipeline_mississippi.xml.in
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is Mississippi data that has different vertical units (ft) -->
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/mvk-thin.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_mississippi_reverse.xml.in b/test/data/pipeline/pipeline_mississippi_reverse.xml.in
new file mode 100644
index 0000000..0aa10fe
--- /dev/null
+++ b/test/data/pipeline/pipeline_mississippi_reverse.xml.in
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- This file is Mississippi data that has different vertical units (ft) -->
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out3.las
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/temp/out2.las
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_multioptions.xml.in b/test/data/pipeline/pipeline_multioptions.xml.in
new file mode 100644
index 0000000..5675303
--- /dev/null
+++ b/test/data/pipeline/pipeline_multioptions.xml.in
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.crop">
+        <Option name="bounds">
+            ([0,1000000],[0,1000000],[0,1000000])
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                <Options>
+                    <Option name="somemore">
+                        42
+                        <Options>
+                            <Option name="evensomemore">44</Option>
+                        </Options>
+                    </Option>
+                </Options>
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_read.xml.in b/test/data/pipeline/pipeline_read.xml.in
new file mode 100644
index 0000000..c410b1b
--- /dev/null
+++ b/test/data/pipeline/pipeline_read.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.crop">
+        <Option name="bounds">
+            ([0,1000000],[0,1000000],[0,1000000])
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_read_notype.xml.in b/test/data/pipeline/pipeline_read_notype.xml.in
new file mode 100644
index 0000000..24b3b6c
--- /dev/null
+++ b/test/data/pipeline/pipeline_read_notype.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.crop">
+        <Option name="bounds">
+            ([0,1000000],[0,1000000],[0,1000000])
+        </Option>
+        <Reader>
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_readcomments.xml.in b/test/data/pipeline/pipeline_readcomments.xml.in
new file mode 100644
index 0000000..139b25c
--- /dev/null
+++ b/test/data/pipeline/pipeline_readcomments.xml.in
@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.crop">
+        <Option name="bounds">
+            ([0,1000000],[0,1000000],[0,1000000])
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+            <!-- This is a comment -->
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_write.xml.in b/test/data/pipeline/pipeline_write.xml.in
new file mode 100644
index 0000000..17fa30b
--- /dev/null
+++ b/test/data/pipeline/pipeline_write.xml.in
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="metadata">
+            <Options/>
+          </Option>
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/pdal-compressed.laz
+        </Option>
+        <Option name="compression">
+            true
+        </Option>
+        <Option name="format">
+            2
+        </Option>        
+        <Filter type="filters.stats">
+            <Option name="exact_dimensions">Classification</Option>
+            <Option name="dimensions">readers.las.X, readers.las.Y, readers.las.Z, Classification</Option>
+            <Filter type="filters.crop">
+                <Option name="bounds">
+                    ([0,1000000],[0,1000000],[0,1000000])
+                </Option>
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_write2.xml.in b/test/data/pipeline/pipeline_write2.xml.in
new file mode 100644
index 0000000..a3f4eff
--- /dev/null
+++ b/test/data/pipeline/pipeline_write2.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/utm15.las
+            </Option>              
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/pipeline/pipeline_writecomments.xml.in b/test/data/pipeline/pipeline_writecomments.xml.in
new file mode 100644
index 0000000..c92ea01
--- /dev/null
+++ b/test/data/pipeline/pipeline_writecomments.xml.in
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out.las
+        </Option>
+        <Filter type="filters.crop">
+            <Option name="bounds">
+                ([0,1000000],[0,1000000],[0,1000000])
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+    <!-- This is a comment -->
+</Pipeline>
diff --git a/test/data/plang/from-module.xml.in b/test/data/plang/from-module.xml.in
new file mode 100644
index 0000000..9829945
--- /dev/null
+++ b/test/data/plang/from-module.xml.in
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.predicate">
+        <Option name="script">@CMAKE_SOURCE_DIR@/test/data/plang/test1.py</Option>
+        <Option name="module">anything</Option>
+        <Option name="function">fff</Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/plang/predicate-embed.xml.in b/test/data/plang/predicate-embed.xml.in
new file mode 100644
index 0000000..faa48bb
--- /dev/null
+++ b/test/data/plang/predicate-embed.xml.in
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.predicate">
+        <Option name="module">anything</Option>
+        <Option name="function">fff</Option>
+        <Option name="source">
+import numpy as np
+
+def fff(ins,outs):
+    X = ins['X']
+    Result = np.equal(X, 637501.67)
+    #print X
+    #print Mask
+    outs['Mask'] = Result
+    return True
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/las/1.2-with-color.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/plang/predicate-keep-ground-and-unclass.xml.in b/test/data/plang/predicate-keep-ground-and-unclass.xml.in
new file mode 100644
index 0000000..0a5560c
--- /dev/null
+++ b/test/data/plang/predicate-keep-ground-and-unclass.xml.in
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>    
+        <Filter type="filters.predicate">
+            <Option name="module">anything</Option>
+            <Option name="function">filter</Option>
+            <Option name="source">
+import numpy as np
+
+def filter(ins,outs):
+    cls = ins['Classification']
+    
+    keep_classes = [1,2]
+    
+    # Use the first test for our base array.
+    keep = np.equal(cls, keep_classes[0])
+    
+    # For 1:n, test each predicate and join back 
+    # to our existing predicate array
+    for k in range(1,len(keep_classes)):
+        t = np.equal(cls, keep_classes[k])
+        keep = keep + t
+
+    outs['Mask'] = keep
+    return True
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen/autzen.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/plang/predicate-keep-last-return.xml.in b/test/data/plang/predicate-keep-last-return.xml.in
new file mode 100644
index 0000000..131348e
--- /dev/null
+++ b/test/data/plang/predicate-keep-last-return.xml.in
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Filter type="filters.predicate">
+            <Option name="module">anything</Option>
+            <Option name="function">filter</Option>
+            <Option name="source">
+import numpy as np
+
+def filter(ins,outs):
+    ret = ins['ReturnNumber']
+    ret_no = ins['NumberOfReturns']
+
+    # Use the first test for our base array.
+    rets = np.equal(ret, ret_no)
+
+    outs['Mask'] = rets
+    return True
+            </Option>
+            <Filter type="filters.stats">
+                <Reader type="readers.las">
+                    <Option name="filename">
+                        @CMAKE_SOURCE_DIR@/test/data/autzen/autzen.las
+                    </Option>
+                </Reader>
+            </Filter>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/plang/predicate-keep-specified-returns.xml.in b/test/data/plang/predicate-keep-specified-returns.xml.in
new file mode 100644
index 0000000..f5c8f7c
--- /dev/null
+++ b/test/data/plang/predicate-keep-specified-returns.xml.in
@@ -0,0 +1,37 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Filter type="filters.predicate">
+            <Option name="module">anything</Option>
+            <Option name="function">filter</Option>
+            <Option name="source">
+import numpy as np
+
+def filter(ins,outs):
+    ret = ins['ReturnNumber']
+
+    keep_ret = [0, 1,2]
+
+    # Use the first test for our base array.
+    keep = np.equal(ret, keep_ret[0])
+
+    # For 1:n, test each predicate and join back
+    # to our existing predicate array
+    for k in range(1, len(keep_ret)):
+        t = np.equal(ret, keep_ret[k])
+        keep = keep + t
+
+    outs['Mask'] = keep
+    return True
+            </Option>
+            <Reader type="readers.las">
+                <Option name="filename">
+                    @CMAKE_SOURCE_DIR@/test/data/autzen/autzen.las
+                </Option>
+            </Reader>
+        </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/plang/programmable-update-classifications.xml.in b/test/data/plang/programmable-update-classifications.xml.in
new file mode 100644
index 0000000..f2fb780
--- /dev/null
+++ b/test/data/plang/programmable-update-classifications.xml.in
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">output.las</Option>
+    <Filter type="filters.programmable">
+        <Option name="function">myfunc</Option>
+        <Option name="module">derive</Option>
+        <Option name="source">
+import numpy as np
+def myfunc(ins,outs):
+    kls = ins['Classification']
+    class_map = {2:2, 3:1, 4:1, 5:1, 1:0}
+
+    for value in np.nditer(kls, op_flags=['readwrite']):
+        try:
+            new_value = class_map[int(value)]
+        except KeyError:
+            pass # if we didn't define the key, do nothing
+
+        # see http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html#modifying-array-values
+        value[...] = new_value
+
+    outs['Classification'] = kls
+    return True
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-utm.las
+            </Option>
+        </Reader>
+    </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/plang/programmable-update-y-dims.xml.in b/test/data/plang/programmable-update-y-dims.xml.in
new file mode 100644
index 0000000..5b92a5a
--- /dev/null
+++ b/test/data/plang/programmable-update-y-dims.xml.in
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Filter type="filters.programmable">
+        <Option name="function">myfunc</Option>
+        <Option name="module">derive</Option>
+        <Option name="source">
+import numpy as np
+def myfunc(ins,outs):
+    X = ins['Y']
+    X1 = np.zeros(X.size, dtype=type(X[0])) + 314
+    outs['Y'] = X1
+    return True
+        </Option>
+        <Reader type="readers.las">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/autzen/autzen-utm.las
+            </Option>
+        </Reader>
+    </Filter>
+</Pipeline>
diff --git a/test/data/plang/test1.py b/test/data/plang/test1.py
new file mode 100644
index 0000000..188f10e
--- /dev/null
+++ b/test/data/plang/test1.py
@@ -0,0 +1,9 @@
+import numpy as np
+
+def fff(ins,outs):
+  X = ins['X']
+  Result = np.equal(X, 637501.67)
+  #print X
+  #print Mask
+  outs['Mask'] = Result
+  return True
diff --git a/test/data/ply/no_vertex.ply b/test/data/ply/no_vertex.ply
new file mode 100644
index 0000000..e56aa54
--- /dev/null
+++ b/test/data/ply/no_vertex.ply
@@ -0,0 +1,3 @@
+ply 
+format ascii 1.0
+end_header
diff --git a/test/data/ply/simple_binary.ply b/test/data/ply/simple_binary.ply
new file mode 100644
index 0000000..b495ca7
Binary files /dev/null and b/test/data/ply/simple_binary.ply differ
diff --git a/test/data/ply/simple_text.ply b/test/data/ply/simple_text.ply
new file mode 100644
index 0000000..842ec59
--- /dev/null
+++ b/test/data/ply/simple_text.ply
@@ -0,0 +1,10 @@
+ply 
+format ascii 1.0
+element vertex 3
+property float x
+property float y
+property float z 
+end_header
+-1 0 0
+ 0 1 0
+ 1 0 0 
diff --git a/test/data/pointbuffer/metadata.txt b/test/data/pointbuffer/metadata.txt
new file mode 100644
index 0000000..5ffd8f1
--- /dev/null
+++ b/test/data/pointbuffer/metadata.txt
@@ -0,0 +1,14 @@
+{
+  "0":
+  {
+    "Classification": 1,
+    "X": 0,
+    "Y": 0
+  },
+  "1":
+  {
+    "Classification": 2,
+    "X": 10,
+    "Y": 100
+  }
+}
diff --git a/test/data/qfit/10-word.qi b/test/data/qfit/10-word.qi
new file mode 100644
index 0000000..e36ba16
Binary files /dev/null and b/test/data/qfit/10-word.qi differ
diff --git a/test/data/qfit/14-word.qi b/test/data/qfit/14-word.qi
new file mode 100644
index 0000000..c6d1955
Binary files /dev/null and b/test/data/qfit/14-word.qi differ
diff --git a/test/data/qfit/20100515_152839.atm4bT2.qi b/test/data/qfit/20100515_152839.atm4bT2.qi
new file mode 100644
index 0000000..131294a
Binary files /dev/null and b/test/data/qfit/20100515_152839.atm4bT2.qi differ
diff --git a/test/data/qfit/conversion.xml.in b/test/data/qfit/conversion.xml.in
new file mode 100644
index 0000000..e742c40
--- /dev/null
+++ b/test/data/qfit/conversion.xml.in
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Option name="debug">
+            true
+        </Option>
+        <Reader type="readers.qfit">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/qfit/14-word.qi
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+            <Option name="verbose">
+                1
+            </Option>
+            <Option name="flip_coordinates">
+                true
+            </Option>
+            <Option name="scale_z">
+                0.001
+            </Option>
+            <Option name="spatialreference">
+                EPSG:4269+3855
+            </Option>
+            <Option name="log">
+                stdlog
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/qfit/little-endian-conversion.xml.in b/test/data/qfit/little-endian-conversion.xml.in
new file mode 100644
index 0000000..c3974ae
--- /dev/null
+++ b/test/data/qfit/little-endian-conversion.xml.in
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/temp/out2.las
+        </Option>
+        <Option name="debug">
+            true
+        </Option>
+        <Reader type="readers.qfit">
+            <Option name="filename">
+                @CMAKE_SOURCE_DIR@/test/data/qfit/20101120_000244.ATM4BT2.qi
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+            <Option name="verbose">
+                1
+            </Option>
+            <Option name="flip_coordinates">
+                true
+            </Option>
+            <Option name="scale_z">
+                0.001
+            </Option>
+            <Option name="spatialreference">
+                EPSG:4269+3855
+            </Option>
+            <Option name="log">
+                stdlog
+            </Option>
+            <Option name="little_endian">
+                true
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/qfit/pipeline.xml.in b/test/data/qfit/pipeline.xml.in
new file mode 100644
index 0000000..f815262
--- /dev/null
+++ b/test/data/qfit/pipeline.xml.in
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">@CMAKE_SOURCE_DIR@/test/temp/qfit-foo.las</Option>
+        <Reader type="readers.qfit">
+            <Option name="flip_coordinates">true</Option>
+            <Option name="scale_z">0.001</Option>
+            <Option name="spatialreference">EPSG:4919+3855</Option>
+            <Option name="filename">@CMAKE_SOURCE_DIR@/test/data/qfit/20100515_152839.atm4bT2.qi</Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/qfit/reader.xml.in b/test/data/qfit/reader.xml.in
new file mode 100644
index 0000000..05ca05f
--- /dev/null
+++ b/test/data/qfit/reader.xml.in
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Reader type="readers.qfit">
+        <Option name="filename">
+            @CMAKE_SOURCE_DIR@/test/data/qfit/14-word.qi
+        </Option>
+        <Option name="debug">
+            true
+        </Option>
+        <Option name="verbose">
+            1
+        </Option>
+        <Option name="flip_coordinates">
+            true
+        </Option>
+        <Option name="convert_z_units">
+            true
+        </Option>
+    </Reader>
+</Pipeline>
diff --git a/test/data/sbet/2-points.sbet b/test/data/sbet/2-points.sbet
new file mode 100644
index 0000000..6fcb356
Binary files /dev/null and b/test/data/sbet/2-points.sbet differ
diff --git a/test/data/sbet/badfile.sbet b/test/data/sbet/badfile.sbet
new file mode 100644
index 0000000..280d97d
Binary files /dev/null and b/test/data/sbet/badfile.sbet differ
diff --git a/test/data/sbet/pipeline.xml.in b/test/data/sbet/pipeline.xml.in
new file mode 100644
index 0000000..67de0fb
--- /dev/null
+++ b/test/data/sbet/pipeline.xml.in
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<Pipeline version="1.0">
+    <Writer type="writers.text">
+        <Option name="filename">@CMAKE_SOURCE_DIR@/test/temp/outfile.txt</Option>
+        <Reader type="readers.sbet">
+            <Option name="filename">@CMAKE_SOURCE_DIR@/test/data/sbet/2-points.sbet</Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/soci/read-cloud.xml b/test/data/soci/read-cloud.xml
new file mode 100644
index 0000000..a339198
--- /dev/null
+++ b/test/data/soci/read-cloud.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Reader type="readers.soci">
+            <Option name="query">
+                select  cloud.cloud_id, 
+                        cloud.schema, 
+                        cloud.block_table,
+                        ST_AsText(cloud.extent) as extent,
+                        ST_SRID(cloud.extent) as srid
+                from 
+                    cloud
+                where 
+                    cloud.cloud_id in (1,2)
+            </Option>
+            <Option name="type">
+                postgresql
+            </Option>
+            <Option name="xml_schema_dump">
+                oracle-schema.xml
+            </Option>
+            <Option name="connection">
+                host='localhost' dbname='lidar' user='hobu'
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+            <Option name="verbose">
+                3
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/soci/read.xml b/test/data/soci/read.xml
new file mode 100644
index 0000000..575e6df
--- /dev/null
+++ b/test/data/soci/read.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.las">
+        <Option name="filename">
+            written-from-oracle.las
+        </Option>
+        <Option name="compression">
+            false
+        </Option>
+        <Reader type="readers.soci">
+            <Option name="query">
+                select  cloud.cloud_id, 
+                        cloud.schema, 
+                        cloud.block_table, 
+                        blocks.cloud_id, 
+                        blocks.block_id, 
+                        blocks.num_points,
+                        blocks.points,
+                        ST_AsText(cloud.extent) as extent,
+                        ST_SRID(cloud.extent) as srid
+                from 
+                    cloud, blocks 
+                where 
+                    blocks.cloud_id = 1 and
+                    blocks.cloud_id = cloud.cloud_id
+            </Option>
+            <Option name="type">
+                postgresql
+            </Option>
+            <Option name="xml_schema_dump">
+                oracle-schema.xml
+            </Option>
+            <Option name="connection">
+                host='localhost' dbname='lidar' user='hobu'
+            </Option>
+            <Option name="debug">
+                true
+            </Option>
+            <Option name="verbose">
+                3
+            </Option>
+        </Reader>
+    </Writer>
+</Pipeline>
diff --git a/test/data/soci/sthelens-write.xml b/test/data/soci/sthelens-write.xml
new file mode 100644
index 0000000..a6570a7
--- /dev/null
+++ b/test/data/soci/sthelens-write.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.soci">
+        <Option name="connection">
+            host='localhost' dbname='lidar' user='hobu'
+        </Option>
+        <Option name="type">
+            postgresql
+        </Option>        
+        <Option name="cloud_table">
+            STHELENS_CLOUD
+        </Option>
+        <Option name="block_table">
+            STHELENS_BLOCK
+        </Option>
+        <Option name="kdtreeify">
+            true
+        </Option>        
+        <Option name="cloud_column">
+            CLOUD_ID
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="srid">
+            26910
+        </Option>
+        <Option name="capacity">
+            131072
+        </Option>
+        <Option name="is3d">
+            true
+        </Option>        
+                <Filter type="filters.chipper">
+                    <Option name="capacity">
+                        131072
+                    </Option>
+		    <Reader type="readers.las">
+			    <Option name="filename">
+				/Users/hobu/dev/git/pdal/test/data/local/mtsthelens/st-helens.las
+			    </Option>
+			    <!-- <Option name="spatialreference">
+				EPSG:26910
+			    </Option> -->
+			    <!-- <Option name="log">
+				oracle-pipeline-write.log
+			    </Option>     -->
+		    </Reader>
+            </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/soci/write-utm.xml b/test/data/soci/write-utm.xml
new file mode 100644
index 0000000..14d7127
--- /dev/null
+++ b/test/data/soci/write-utm.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.soci">
+        <Option name="connection">
+            host='localhost' dbname='lidar' user='howardbutler'
+        </Option>
+        <Option name="type">
+            postgresql
+        </Option>        
+        <Option name="cloud_table">
+            STHELENS_CLOUD
+        </Option>
+        <Option name="block_table">
+            STHELENS_BLOCK
+        </Option>
+        <Option name="cloud_column">
+            CLOUD_ID
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="srid">
+            2926
+        </Option>
+        <Option name="capacity">
+            80000
+        </Option>
+        <Option name="is3d">
+            true
+        </Option>        
+                <Filter type="filters.chipper">
+                    <Option name="capacity">
+                        80000
+                    </Option>
+		    <Reader type="readers.las">
+			    <Option name="filename">
+				/Users/howardbutler/dev/git/pdal/test/data/local/sthelens/st-helens.las
+			    </Option>
+			    <Option name="spatialreference">
+				EPSG:2926
+			    </Option>
+			    <!-- <Option name="log">
+				oracle-pipeline-write.log
+			    </Option>     -->
+		    </Reader>
+            </Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/soci/write.xml b/test/data/soci/write.xml
new file mode 100644
index 0000000..46510a8
--- /dev/null
+++ b/test/data/soci/write.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Pipeline version="1.0">
+    <Writer type="writers.soci">
+        <Option name="connection">
+            host='localhost' dbname='lidar' user='hobu'
+        </Option>
+        <Option name="type">
+            postgresql
+        </Option>        
+        <Option name="cloud_table">
+            CLOUD
+        </Option>
+        <Option name="block_table">
+            BLOCKS
+        </Option>
+        <Option name="cloud_column">
+            CLOUD_ID
+        </Option>
+        <Option name="overwrite">
+            false
+        </Option>
+        <Option name="cloud_boundary_wkt">
+            ./autzen-selection.wkt
+        </Option>
+        <Option name="srid">
+            4326
+        </Option>
+        <Option name="capacity">
+            50
+        </Option>
+        <Option name="is3d">
+            true
+        </Option>        
+	<Filter type="filters.chipper">
+	    <Option name="capacity">
+		50
+	    </Option>
+	    <Reader type="readers.las">
+		    <Option name="filename">
+			../1.2-with-color.las
+		    </Option>
+		    <Option name="spatialreference">
+			EPSG:2926
+		    </Option>
+		    <!-- <Option name="log">
+			oracle-pipeline-write.log
+		    </Option>     -->
+	    </Reader>
+	</Filter>
+    </Writer>
+</Pipeline>
diff --git a/test/data/terrasolid/20020715-time-color.bin b/test/data/terrasolid/20020715-time-color.bin
new file mode 100644
index 0000000..1349ce6
Binary files /dev/null and b/test/data/terrasolid/20020715-time-color.bin differ
diff --git a/test/data/text/TextWriterTest-geojson.json b/test/data/text/TextWriterTest-geojson.json
new file mode 100644
index 0000000..532b4d8
--- /dev/null
+++ b/test/data/text/TextWriterTest-geojson.json
@@ -0,0 +1 @@
+{ "type": "FeatureCollection", "features": [{ "type":"Feature","geometry": { "type": "Point", "coordinates": [637012.24,849028.31,431.66]},"properties": {"X":"637012.24","Y":"849028.31","Z":"431.66","Intensity":"143","ReturnNumber":"1"}},{ "type":"Feature","geometry": { "type": "Point", "coordinates": [636896.33,849087.70,446.39]},"properties": {"X":"636896.33","Y":"849087.70","Z":"446.39","Intensity":"18","ReturnNumber":"1"}},{ "type":"Feature","geometry": { "type": "Point", "coordinate [...]
\ No newline at end of file
diff --git a/test/data/text/text.txt b/test/data/text/text.txt
new file mode 100644
index 0000000..9761434
--- /dev/null
+++ b/test/data/text/text.txt
@@ -0,0 +1 @@
+This is a file that allows us to test that we can read a text file into a string through the file utils.
diff --git a/test/data/wkt/0102.las.wkt b/test/data/wkt/0102.las.wkt
new file mode 100644
index 0000000..8bbadcd
--- /dev/null
+++ b/test/data/wkt/0102.las.wkt
@@ -0,0 +1 @@
+POLYGON ((-71.609744516719971 43.304973585411346,-71.609612478188822 43.3049765999708,-71.609603979403232 43.304976794000552,-71.608786744191093 43.304995448763208,-71.608707669007273 43.304997253476301,-71.59646197966083 43.305276072748903,-71.595047469806332 43.30530819476855,-71.592819525118472 43.305358753488562,-71.591924551508939 43.30537905087202,-71.590827574515714 43.305403919982446,-71.589281998948607 43.305438941197075,-71.589157254998142 43.305442487183271,-71.589127355543766 [...]
\ No newline at end of file
diff --git a/test/temp/README.txt b/test/temp/README.txt
new file mode 100644
index 0000000..239e10c
--- /dev/null
+++ b/test/temp/README.txt
@@ -0,0 +1 @@
+The unit tests write files into this directory.  This directory must exist.
diff --git a/test/unit/BoundsTest.cpp b/test/unit/BoundsTest.cpp
new file mode 100644
index 0000000..9f5355b
--- /dev/null
+++ b/test/unit/BoundsTest.cpp
@@ -0,0 +1,296 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <boost/property_tree/xml_parser.hpp>
+
+#include <pdal/pdal_test_main.hpp>
+#include <pdal/util/Bounds.hpp>
+#include <pdal/PDALUtils.hpp>
+
+using namespace pdal;
+
+TEST(BoundsTest, test_ctor)
+{
+    BOX3D b1;
+    EXPECT_TRUE(b1.empty());
+
+    b1.clear();
+    BOX3D b2;
+    EXPECT_EQ(b1, b2);
+}
+
+TEST(BoundsTest, test_equals)
+{
+    BOX2D b1(1,2,3,4);
+    BOX2D b2(1,2,3,4);
+    BOX2D b3(1,2,3,6);
+
+    EXPECT_TRUE(b1 == b1);
+    EXPECT_TRUE(b1 == b2);
+    EXPECT_TRUE(b1 != b3);
+    EXPECT_TRUE(b2 != b3);
+
+    BOX3D b4(1,2,3,4,5,6);
+    BOX3D b5(1,2,3,4,5,6);
+    BOX3D b6(1,2,3,4,5,7);
+
+    EXPECT_TRUE(b4 == b4);
+    EXPECT_TRUE(b4 == b5);
+    EXPECT_TRUE(b5 == b4);
+    EXPECT_TRUE(b4 != b6);
+    EXPECT_TRUE(b6 == b6);
+}
+
+TEST(BoundsTest, test_copy)
+{
+    BOX2D b1(1,2,3,4);
+    BOX2D b2(b1);
+    EXPECT_TRUE(b1==b2);
+
+    BOX3D b3(1,2,3,4,5,6);
+    BOX3D b4(b3);
+    EXPECT_TRUE(b1==b2);
+}
+
+TEST(BoundsTest, test_accessor)
+{
+    BOX2D b1(1,2,3,4);
+    EXPECT_FLOAT_EQ(b1.minx, 1);
+    EXPECT_FLOAT_EQ(b1.miny, 2);
+    EXPECT_FLOAT_EQ(b1.maxx, 3);
+    EXPECT_FLOAT_EQ(b1.maxy, 4);
+
+    BOX3D b2(1,2,3,4,5,6);
+    EXPECT_FLOAT_EQ(b2.minx, 1);
+    EXPECT_FLOAT_EQ(b2.miny, 2);
+    EXPECT_FLOAT_EQ(b2.minz, 3);
+    EXPECT_FLOAT_EQ(b2.maxx, 4);
+    EXPECT_FLOAT_EQ(b2.maxy, 5);
+    EXPECT_FLOAT_EQ(b2.maxz, 6);
+}
+
+TEST(BoundsTest, test_clip)
+{
+    BOX2D r1(0,0,10,10);
+    BOX2D r2(1,1,11,11);
+    r1.clip(r2);
+
+    BOX2D r3(1,1,10,10);
+    EXPECT_TRUE(r1==r3);
+
+    BOX2D r4(2,4,6,8);
+    r1.clip(r4);
+
+    EXPECT_TRUE(r1==r4);
+
+    BOX2D r5(20,40,60,80);
+    r1.clip(r5);
+
+    // BUG: seems wrong -- need to better define semantics of clip, etc
+    // .clip() can make an invalid bounds, this should be fixed.
+    BOX2D r6(20,6, 40,8);
+
+    EXPECT_FLOAT_EQ(r1.minx, 20);
+    EXPECT_FLOAT_EQ(r1.maxx, 6);
+    EXPECT_FLOAT_EQ(r1.miny, 40);
+    EXPECT_FLOAT_EQ(r1.maxy, 8);
+
+//ABELL - Need BOX3D example.
+}
+
+TEST(BoundsTest, test_intersect)
+{
+    BOX2D r1(0,0,10,10);
+    BOX2D r2(1,1,11,11);
+    BOX2D r3(100,100,101,101);
+    BOX2D r4(2,4,6,8);
+
+    EXPECT_TRUE(r1.overlaps(r1));
+
+    EXPECT_TRUE(r1.overlaps(r2));
+    EXPECT_TRUE(r2.overlaps(r1));
+
+    EXPECT_TRUE(!r1.overlaps(r3));
+    EXPECT_TRUE(!r3.overlaps(r1));
+
+    EXPECT_TRUE(r1.contains(r1));
+    EXPECT_TRUE(!r1.contains(r2));
+    EXPECT_TRUE(r1.contains(r4));
+
+//ABELL - Need BOX3D example.
+}
+
+TEST(BoundsTest, test_grow)
+{
+    BOX2D r1(50,51,100,101);
+    BOX2D r2(0,1,10,201);
+
+    r1.grow(r2);
+
+    BOX2D r3(0,1,100,201);
+    EXPECT_TRUE(r1 == r3);
+//ABELL - Need BOX3D example.
+}
+
+TEST(BoundsTest, test_static)
+{
+    BOX2D t(BOX2D::getDefaultSpatialExtent());
+    double mind = (std::numeric_limits<double>::lowest)();
+    double maxd = (std::numeric_limits<double>::max)();
+    EXPECT_DOUBLE_EQ(t.minx, mind);
+    EXPECT_DOUBLE_EQ(t.maxx, maxd);
+    EXPECT_DOUBLE_EQ(t.miny, mind);
+    EXPECT_DOUBLE_EQ(t.maxy, maxd);
+
+    BOX3D u = BOX3D::getDefaultSpatialExtent();
+    EXPECT_DOUBLE_EQ(u.minx, mind);
+    EXPECT_DOUBLE_EQ(u.maxx, maxd);
+    EXPECT_DOUBLE_EQ(u.miny, mind);
+    EXPECT_DOUBLE_EQ(u.maxy, maxd);
+    EXPECT_DOUBLE_EQ(u.minz, mind);
+    EXPECT_DOUBLE_EQ(u.maxz, maxd);
+}
+
+TEST(BoundsTest, test_invalid)
+{
+    BOX2D t;
+    double mind = (std::numeric_limits<double>::lowest)();
+    double maxd = (std::numeric_limits<double>::max)();
+    EXPECT_DOUBLE_EQ(t.minx, maxd);
+    EXPECT_DOUBLE_EQ(t.maxx, mind);
+    EXPECT_DOUBLE_EQ(t.miny, maxd);
+    EXPECT_DOUBLE_EQ(t.maxy, mind);
+
+    BOX3D u;
+    EXPECT_DOUBLE_EQ(u.minx, maxd);
+    EXPECT_DOUBLE_EQ(u.maxx, mind);
+    EXPECT_DOUBLE_EQ(u.miny, maxd);
+    EXPECT_DOUBLE_EQ(u.maxy, mind);
+    EXPECT_DOUBLE_EQ(u.minz, maxd);
+    EXPECT_DOUBLE_EQ(u.maxz, mind);
+}
+
+TEST(BoundsTest, test_output)
+{
+    const BOX2D b2(1,2,101,102);
+    const BOX3D b3(1.1,2.2,3.3,101.1,102.2,103.3);
+
+    std::stringstream ss2(std::stringstream::in | std::stringstream::out);
+    std::stringstream ss3(std::stringstream::in | std::stringstream::out);
+
+    ss2 << b2;
+    ss3 << b3;
+
+    const std::string out2 = ss2.str();
+    const std::string out3 = ss3.str();
+
+    EXPECT_EQ(out2, "([1, 101], [2, 102])");
+    EXPECT_EQ(out3, "([1.1, 101.1], [2.2, 102.2], [3.3, 103.3])");
+}
+
+TEST(BoundsTest, BoundsTest_ptree)
+{
+    const BOX2D b2(1,2,101,102);
+
+    std::stringstream ss1(std::stringstream::in | std::stringstream::out);
+
+    boost::property_tree::ptree tree = Utils::toPTree(b2);
+    boost::property_tree::write_xml(ss1, tree);
+
+    const std::string out1 = ss1.str();
+
+    static std::string xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+    const std::string ref = xml_header + "<0><minimum>1</minimum><maximum>101</maximum></0><1><minimum>2</minimum><maximum>102</maximum></1>";
+
+    EXPECT_EQ(ref, out1);
+}
+
+TEST(BoundsTest, test_input)
+{
+    std::stringstream ss("([1.1, 101.1], [2.2, 102.2], [3.3, 103.3])",
+        std::stringstream::in | std::stringstream::out);
+
+    BOX3D rr;
+    ss >> rr;
+    BOX3D r(1.1,2.2,3.3,101.1,102.2,103.3);
+    EXPECT_TRUE(r == rr);
+}
+
+TEST(BoundsTest, test_lexicalcast_whitespace)
+{
+    const BOX3D b1 = boost::lexical_cast<BOX3D>("([1,101],[2,102],[3,103])");
+    const BOX3D b2 =
+        boost::lexical_cast<BOX3D>("([1, 101], [2, 102], [3, 103])");
+
+    EXPECT_EQ(b1, b2);
+}
+
+TEST(BoundsTest, test_wkt)
+{
+    BOX2D b(1.1,2.2,101.1,102.2);
+    std::string out = "POLYGON ((1.1 2.2, 1.1 102.2, 101.1 102.2, 101.1 2.2, 1.1 2.2))";
+    EXPECT_EQ(b.toWKT(1), out);
+
+    BOX3D b2(1.1,2.2,3.3,101.1,102.2,103.3);
+    std::string out2 = "POLYHEDRON Z ( ((1.1 2.2 3.3, 101.1 2.2 3.3, 101.1 102.2 3.3, 1.1 102.2 3.3, 1.1 2.2 3.3, )), ((1.1 2.2 3.3, 101.1 2.2 3.3, 101.1 2.2 103.3, 1.1 2.2 103.3, 1.1 2.2 3.3, )), ((101.1 2.2 3.3, 101.1 102.2 3.3, 101.1 102.2 103.3, 101.1 2.2 103.3, 101.1 2.2 3.3, )), ((101.1 102.2 3.3, 1.1 102.2 3.3, 1.1 102.2 103.3, 101.1 102.2 103.3, 101.1 102.2 3.3, )), ((1.1 102.2 3.3, 1.1 2.2 3.3, 1.1 2.2 103.3, 1.1 102.2 103.3, 1.1 102.2 3.3, )), ((1.1 2.2 103.3, 101.1 2.2 103.3,  [...]
+    EXPECT_EQ(b2.toWKT(1), out2);
+}
+
+TEST(BoundsTest, test_2d_input)
+{
+    std::stringstream ss("([1.1, 101.1], [2.2, 102.2])", std::stringstream::in | std::stringstream::out);
+    BOX2D rr;
+    ss >> rr;
+    BOX2D r(1.1,2.2,101.1,102.2);
+    EXPECT_EQ(r, rr);
+}
+
+TEST(BoundsTest, test_precisionloss)
+{
+    const BOX2D b1(0.123456789,0.0,0,0);
+    EXPECT_DOUBLE_EQ(b1.minx, 0.123456789);
+
+    // convert it to a string, which is what happens
+    // when you do something like:
+    //   options.getValueOrDefault<BOX3D>("bounds", BOX3D());
+    std::ostringstream oss;
+    oss << b1; 
+
+    // convert it back
+    std::istringstream iss(oss.str());
+    BOX2D b2;
+    iss >> b2;
+
+    EXPECT_DOUBLE_EQ(b2.minx, 0.123456789);
+}
diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt
new file mode 100644
index 0000000..ec161f0
--- /dev/null
+++ b/test/unit/CMakeLists.txt
@@ -0,0 +1,119 @@
+###############################################################################
+#
+# test/unit/CMakeLists.txt controls building of PDAL unit tests suite
+#
+# Copyright (c) 2009 Mateusz Loskot <mateusz at loskot.net>
+#
+###############################################################################
+
+configure_file(TestConfig.hpp.in "${CMAKE_CURRENT_BINARY_DIR}/TestConfig.hpp")
+
+file(GLOB_RECURSE inFiles RELATIVE "${CMAKE_SOURCE_DIR}" "${CMAKE_SOURCE_DIR}/test/data/*.in")
+foreach(infileName ${inFiles})
+    string(REGEX REPLACE ".in\$" "" outfileName "${infileName}")
+    configure_file("${CMAKE_SOURCE_DIR}/${infileName}" "${CMAKE_BINARY_DIR}/${outfileName}")
+endforeach()
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+include_directories(
+    ${PROJECT_SOURCE_DIR}/include
+    ${GDAL_INCLUDE_DIR}
+    ${PROJECT_SOURCE_DIR}/io/bpf
+    ${PROJECT_SOURCE_DIR}/io/buffer
+    ${PROJECT_SOURCE_DIR}/io/faux
+    ${PROJECT_SOURCE_DIR}/io/las
+    ${PROJECT_SOURCE_DIR}/io/optech
+    ${PROJECT_SOURCE_DIR}/io/ply
+    ${PROJECT_SOURCE_DIR}/io/qfit
+    ${PROJECT_SOURCE_DIR}/io/sbet
+    ${PROJECT_SOURCE_DIR}/io/text
+    ${PROJECT_SOURCE_DIR}/io/terrasolid
+    ${PROJECT_SOURCE_DIR}/filters/chipper
+    ${PROJECT_SOURCE_DIR}/filters/colorization
+    ${PROJECT_SOURCE_DIR}/filters/crop
+    ${PROJECT_SOURCE_DIR}/filters/decimation
+    ${PROJECT_SOURCE_DIR}/filters/ferry
+    ${PROJECT_SOURCE_DIR}/filters/mortonorder
+    ${PROJECT_SOURCE_DIR}/filters/reprojection
+    ${PROJECT_SOURCE_DIR}/filters/range
+    ${PROJECT_SOURCE_DIR}/filters/sort
+    ${PROJECT_SOURCE_DIR}/filters/splitter
+    ${PROJECT_SOURCE_DIR}/filters/stats
+    ${PROJECT_SOURCE_DIR}/filters/transformation
+    ${PROJECT_SOURCE_DIR}/kernels/info
+)
+
+if (WITH_GEOTIFF)
+    include_directories(${GEOTIFF_INCLUDE_DIR})
+endif()
+
+PDAL_ADD_TEST(pdal_bounds_test FILES BoundsTest.cpp)
+PDAL_ADD_TEST(pdal_config_test FILES ConfigTest.cpp)
+PDAL_ADD_TEST(pdal_file_utils_test FILES FileUtilsTest.cpp)
+PDAL_ADD_TEST(pdal_georeference_test FILES GeoreferenceTest.cpp)
+PDAL_ADD_TEST(pdal_kdindex_test FILES KDIndexTest.cpp)
+PDAL_ADD_TEST(pdal_log_test FILES LogTest.cpp)
+PDAL_ADD_TEST(pdal_metadata_test FILES MetadataTest.cpp)
+PDAL_ADD_TEST(pdal_options_test FILES OptionsTest.cpp)
+PDAL_ADD_TEST(pdal_pdalutils_test FILES PDALUtilsTest.cpp)
+PDAL_ADD_TEST(pdal_pipeline_manager_test FILES PipelineManagerTest.cpp)
+PDAL_ADD_TEST(pdal_point_view_test FILES PointViewTest.cpp)
+PDAL_ADD_TEST(pdal_point_table_test FILES PointTableTest.cpp)
+PDAL_ADD_TEST(pdal_spatial_reference_test FILES SpatialReferenceTest.cpp)
+PDAL_ADD_TEST(pdal_support_test FILES SupportTest.cpp)
+PDAL_ADD_TEST(pdal_user_callback_test FILES UserCallbackTest.cpp)
+PDAL_ADD_TEST(pdal_utils_test FILES UtilsTest.cpp)
+
+if (PDAL_HAVE_LAZPERF)
+    PDAL_ADD_TEST(pdal_lazperf_test FILES CompressionTest.cpp)
+endif()
+
+#
+# sources for the native io
+#
+PDAL_ADD_TEST(pdal_io_bpf_test FILES io/bpf/BPFTest.cpp)
+PDAL_ADD_TEST(pdal_io_buffer_test FILES io/buffer/BufferTest.cpp)
+PDAL_ADD_TEST(pdal_io_faux_test FILES io/faux/FauxReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_las_reader_test FILES io/las/LasReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_las_writer_test FILES io/las/LasWriterTest.cpp)
+PDAL_ADD_TEST(pdal_io_optech_test FILES io/optech/OptechReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_ply_reader_test FILES io/ply/PlyReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_ply_writer_test FILES io/ply/PlyWriterTest.cpp)
+PDAL_ADD_TEST(pdal_io_qfit_test FILES io/qfit/QFITReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_sbet_reader_test FILES io/sbet/SbetReaderTest.cpp)
+PDAL_ADD_TEST(pdal_io_sbet_writer_test FILES io/sbet/SbetWriterTest.cpp)
+PDAL_ADD_TEST(pdal_io_terrasolid_test FILES io/terrasolid/TerrasolidReaderTest.cpp)
+
+#
+# sources for the native filters
+#
+PDAL_ADD_TEST(pdal_filters_chipper_test FILES filters/ChipperTest.cpp)
+PDAL_ADD_TEST(pdal_filters_colorization_test FILES filters/ColorizationFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_crop_test FILES filters/CropFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_decimation_test FILES filters/DecimationFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_ferry_test FILES filters/FerryFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_merge_test FILES filters/MergeTest.cpp)
+PDAL_ADD_TEST(pdal_filters_reprojection_test FILES filters/ReprojectionFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_range_test FILES filters/RangeFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_sort_test FILES filters/SortFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_splitter_test FILES filters/SplitterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_stats_test FILES filters/StatsFilterTest.cpp)
+PDAL_ADD_TEST(pdal_filters_transformation_test FILES filters/TransformationFilterTest.cpp)
+
+#
+# conditionally append apps/libxml2 sources
+#
+if (WITH_APPS)
+    if (LASZIP_FOUND)
+        PDAL_ADD_TEST(pdal_merge_test FILES apps/MergeTest.cpp)
+    endif()
+    PDAL_ADD_TEST(pc2pc_test FILES apps/pc2pcTest.cpp)
+
+    if (BUILD_PIPELINE_TESTS)
+        PDAL_ADD_TEST(pcpipeline_test FILES apps/pcpipelineTest.cpp)
+    endif()
+endif(WITH_APPS)
+
+if(LIBXML2_FOUND)
+    PDAL_ADD_TEST(xml_schema_test FILES XMLSchemaTest.cpp)
+endif()
diff --git a/test/unit/CompressionTest.cpp b/test/unit/CompressionTest.cpp
new file mode 100644
index 0000000..370c858
--- /dev/null
+++ b/test/unit/CompressionTest.cpp
@@ -0,0 +1,285 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <iterator>
+#include <sstream>
+#include <iostream>
+#include <string>
+#include <random>
+
+#include "Support.hpp"
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+#include <LasReader.hpp>
+#include <pdal/Compression.hpp>
+
+using namespace pdal;
+
+std::vector<char> getBytes(PointViewPtr view)
+{
+    std::vector<char> bytes(view->pointSize() * view->size());
+    DimTypeList dimTypes = view->dimTypes();
+
+    char *p = bytes.data();
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        view->getPackedPoint(dimTypes, idx, p);
+        p += view->pointSize();
+    }
+    return bytes;
+}
+
+
+TEST(Compression, Simple)
+{
+    const std::string file(Support::datapath("las/1.2-with-color.las"));
+
+    const pdal::Option opt_filename("filename", file);
+    pdal::Options opts;
+    opts.add(opt_filename);
+
+    LasReader reader;
+    reader.setOptions(opts);
+
+    PointTable table;
+    PointLayoutPtr layout(table.layout());
+
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(layout->pointSize(), 52U);
+
+    std::vector<unsigned char> rawBuf;
+    LazPerfBuf b(rawBuf);
+
+    DimTypeList dimTypes = layout->dimTypes();
+    LazPerfCompressor<LazPerfBuf> compressor(b, dimTypes);
+
+    std::vector<char> tmpbuf(compressor.pointSize());
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        view->getPackedPoint(dimTypes, idx, tmpbuf.data());
+        compressor.compress(tmpbuf.data(), compressor.pointSize());
+    }
+    compressor.done();
+
+    EXPECT_EQ(view->size() * compressor.pointSize(), (size_t)55380);
+    EXPECT_EQ(rawBuf.size(), (size_t)30945);
+
+    LazPerfBuf b2(rawBuf);
+
+    LazPerfDecompressor<LazPerfBuf> decompressor(b2, dimTypes);
+
+    size_t outbufSize = decompressor.pointSize() * view->size();
+    std::vector<char> outbuf(outbufSize);
+    decompressor.decompress(outbuf.data(), outbufSize);
+
+    PointViewPtr otherView(new PointView(table));
+
+    char *pos = outbuf.data();
+    for (PointId nextId = 0; nextId < 11; nextId++)
+    {
+        otherView->setPackedPoint(dimTypes, nextId, pos);
+        pos += decompressor.pointSize();
+    }
+    EXPECT_EQ(otherView->size(), 11U);
+    EXPECT_EQ(getBytes(otherView).size(), (size_t)(52 * 11));
+
+    uint16_t r = otherView->getFieldAs<uint16_t>(Dimension::Id::Red, 10);
+    EXPECT_EQ(r, 64U);
+    int32_t x = otherView->getFieldAs<int32_t>(Dimension::Id::X, 10);
+    EXPECT_EQ(x, 636038);
+    double xd = otherView->getFieldAs<double>(Dimension::Id::X, 10);
+    EXPECT_FLOAT_EQ(xd, 636037.53);
+    int32_t y = otherView->getFieldAs<int32_t>(Dimension::Id::Y, 10);
+    EXPECT_EQ(y, 849338);
+}
+
+
+TEST(Compression, types)
+{
+    using namespace Dimension;
+    Type::Enum types[] = {
+        Type::Unsigned8, Type::Unsigned16, Type::Unsigned32, Type::Unsigned64,
+        Type::Signed8, Type::Signed16, Type::Signed32, Type::Signed64,
+        Type::Float, Type::Double
+    };
+    // Size is 42.
+
+    std::default_random_engine generator;
+    std::uniform_int_distribution<int> dist(std::numeric_limits<int>::min());
+    char pts[3][42];
+
+    // Fill three "points" with some random data.
+    char *c = &pts[0][0];
+    for (size_t i = 0; i < 3 * 42; ++i)
+    {
+        int v = dist(generator);
+        memcpy(c++, &v, sizeof(char));
+    }
+
+    DimTypeList dimTypes;
+    for (auto ti = std::begin(types); ti != std::end(types); ++ti)
+        dimTypes.push_back(DimType(Dimension::Id::Unknown, *ti));
+
+    std::vector<unsigned char> rawBuf;
+    LazPerfBuf b(rawBuf);
+    LazPerfCompressor<LazPerfBuf> compressor(b, dimTypes);
+    for (size_t i = 0; i < 50; i++)
+    {
+        compressor.compress(pts[0], 42);
+        compressor.compress(pts[1], 42);
+        compressor.compress(pts[2], 42);
+    }
+    compressor.done();
+
+    LazPerfBuf b2(rawBuf);
+
+    LazPerfDecompressor<LazPerfBuf> decompressor(b2, dimTypes);
+    char oPts[3][42];
+    for (size_t i = 0; i < 50; ++i)
+    {
+        decompressor.decompress(oPts[0], 42);
+        decompressor.decompress(oPts[1], 42);
+        decompressor.decompress(oPts[2], 42);
+        EXPECT_EQ(memcmp(pts[0], oPts[0], 42), 0);
+        EXPECT_EQ(memcmp(pts[1], oPts[1], 42), 0);
+        EXPECT_EQ(memcmp(pts[2], oPts[2], 42), 0);
+        memset(oPts[0], 0, 42);
+        memset(oPts[1], 0, 42);
+        memset(oPts[2], 0, 42);
+    }
+}
+
+//
+// BOOST_AUTO_TEST_CASE(test_compress_copied_view)
+// {
+//     using namespace pdal;
+//
+//
+//     const std::string file(Support::datapath("las/1.2-with-color.las"));
+//     const pdal::Option opt_filename("filename", file);
+//     pdal::Options opts;
+//     opts.add(opt_filename);
+//     pdal::drivers::las::Reader reader;
+//     reader.setOptions(opts);
+//     PointTable ftable;
+//     reader.prepare(ftable);
+//     PointViewSet viewSet = reader.execute(ftable);
+//     PointViewPtr view = *viewSet.begin();
+//
+//     PointTable table;
+//     table->registerDim(Dimension::Id::X);
+//     table->registerDim(Dimension::Id::Y);
+//     table->registerDim(Dimension::Id::Z);
+//     PointView new_view(table);
+// //
+//     for (PointId i = 0; i < view->size(); ++i)
+//     {
+//         new_view->setField(Dimension::Id::X, i, view->getFieldAs<double>(Dimension::Id::X, i));
+//         new_view->setField(Dimension::Id::Y, i, view->getFieldAs<double>(Dimension::Id::Y, i));
+//         new_view->setField(Dimension::Id::Z, i, view->getFieldAs<double>(Dimension::Id::Z, i));
+//     }
+//     SQLiteTestStream s;
+//     compression::Compress<SQLiteTestStream>(table, new_view, s, compression::CompressionType::Lazperf, 0, 0);
+//     SQLiteTestStream s2;
+//     s2.buf = s.buf;
+//     PointViewPtr b = compression::Decompress<SQLiteTestStream>(table, s2, 11, compression::CompressionType::Lazperf);
+//
+//     int32_t y = b->getFieldAs<int32_t>(Dimension::Id::Y, 10);
+//     BOOST_CHECK_EQUAL(y, 849338);
+//     int32_t x = b->getFieldAs<int32_t>(Dimension::Id::X, 10);
+//     BOOST_CHECK_EQUAL(x, 636038);
+//     double xd = b->getFieldAs<double>(Dimension::Id::X, 10);
+//     BOOST_CHECK_CLOSE(xd, 636037.53, 0.001);
+//
+// }
+//
+//
+//
+// BOOST_AUTO_TEST_CASE(test_compress_simple_view)
+// {
+//     using namespace pdal;
+//
+//     PointTable table;
+//     table->registerDim(Dimension::Id::X);
+//     table->registerDim(Dimension::Id::Y);
+//     table->registerDim(Dimension::Id::Z);
+//     table->registerDim(Dimension::Id::GpsTime);
+//     table->registerDim(Dimension::Id::Intensity);
+//     table->registerDim(Dimension::Id::PointSourceId);
+//     table->registerDim(Dimension::Id::ScanAngleRank);
+//     table->registerDim(Dimension::Id::Red);
+//     table->registerDim(Dimension::Id::Green);
+//     table->registerDim(Dimension::Id::Blue);
+//     table->registerDim(Dimension::Id::ReturnNumber);
+//     table->registerDim(Dimension::Id::NumberOfReturns);
+//     table->registerDim(Dimension::Id::ScanDirectionFlag);
+//     table->registerDim(Dimension::Id::EdgeOfFlightLine);
+//     table->registerDim(Dimension::Id::Classification);
+//     table->registerDim(Dimension::Id::UserData);
+//     PointView view(table);
+//     for (PointId i = 0; i < 100; ++i)
+//     {
+//         view->setField(Dimension::Id::X, i, i);
+//         view->setField(Dimension::Id::Y, i, i+100);
+//         view->setField(Dimension::Id::Z, i, i+1000);
+//         view->setField(Dimension::Id::GpsTime, i, i+10000);
+//         view->setField(Dimension::Id::Intensity, i, 600);
+//         view->setField(Dimension::Id::PointSourceId, i, 60);
+//         view->setField(Dimension::Id::ScanAngleRank, i, 1003.23);
+//         view->setField(Dimension::Id::Red, i, 26);
+//         view->setField(Dimension::Id::Green, i, 42);
+//         view->setField(Dimension::Id::Blue, i, 255);
+//         view->setField(Dimension::Id::ReturnNumber, i, 2);
+//         view->setField(Dimension::Id::NumberOfReturns, i, 2);
+//         view->setField(Dimension::Id::ScanDirectionFlag, i, 1);
+//         view->setField(Dimension::Id::EdgeOfFlightLine, i, 1);
+//         view->setField(Dimension::Id::Classification, i, 2);
+//         view->setField(Dimension::Id::UserData, i, 25);
+//     }
+//
+//     SQLiteTestStream s;
+//     compression::Compress<SQLiteTestStream>(table, view, s, compression::CompressionType::Lazperf, 0, 0);
+//     SQLiteTestStream s2;
+//     s2.buf = s.buf;
+//     PointViewPtr b = compression::Decompress<SQLiteTestStream>(table, s2, 11, compression::CompressionType::Lazperf);
+// //     std::cout << *b << std::endl;
+//     uint16_t r = b->getFieldAs<uint16_t>(Dimension::Id::Red, 10);
+//     BOOST_CHECK_EQUAL(r, 26u);
+// }
+
diff --git a/test/unit/ConfigTest.cpp b/test/unit/ConfigTest.cpp
new file mode 100644
index 0000000..c4f0570
--- /dev/null
+++ b/test/unit/ConfigTest.cpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/pdal_config.hpp>
+
+using namespace pdal;
+
+TEST(ConfigTest, test_3rdparty_libs)
+{
+    bool geotiff = IsLibGeoTIFFEnabled();
+    bool laszip = IsLasZipEnabled();
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    EXPECT_TRUE(geotiff);
+#else
+    EXPECT_TRUE(!geotiff);
+#endif
+
+#ifdef PDAL_HAVE_LASZIP
+    EXPECT_TRUE(laszip);
+#else
+    EXPECT_TRUE(!laszip);
+#endif
+}
+
+TEST(ConfigTest, test_version)
+{
+    // just verify these functions can be called, don't worry about the values
+
+    std::string version = GetVersionString();
+    EXPECT_TRUE(!version.empty());
+    std::string fullVersion = GetFullVersionString();
+    EXPECT_TRUE(!fullVersion.empty());
+
+    int major = GetVersionMajor();
+    EXPECT_TRUE(major >= 0);
+    int minor = GetVersionMinor();
+    EXPECT_TRUE(minor >= 0);
+    int patch = GetVersionPatch();
+    EXPECT_TRUE(patch >= 0);
+
+    int bignum = GetVersionInteger();
+    EXPECT_TRUE(bignum > 0);
+}
diff --git a/test/unit/FileUtilsTest.cpp b/test/unit/FileUtilsTest.cpp
new file mode 100644
index 0000000..8a40708
--- /dev/null
+++ b/test/unit/FileUtilsTest.cpp
@@ -0,0 +1,171 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(FileUtilsTest, test_file_ops)
+{
+    std::string tmp1(Support::temppath("unittest1.tmp"));
+    std::string tmp2(Support::temppath("unittest2.tmp"));
+
+    // first, clean up from any previous test run
+    FileUtils::deleteFile(tmp1);
+    FileUtils::deleteFile(tmp2);
+    EXPECT_TRUE(FileUtils::fileExists(tmp1)==false);
+    EXPECT_TRUE(FileUtils::fileExists(tmp2)==false);
+
+    // write test
+    std::ostream* ostr = FileUtils::createFile(tmp1);
+    *ostr << "yow";
+    FileUtils::closeFile(ostr);
+
+    EXPECT_EQ(FileUtils::fileExists(tmp1), true);
+    EXPECT_EQ(FileUtils::fileSize(tmp1), 3U);
+
+    // rename test
+    FileUtils::renameFile(tmp2,tmp1);
+    EXPECT_TRUE(FileUtils::fileExists(tmp1)==false);
+    EXPECT_TRUE(FileUtils::fileExists(tmp2)==true);
+
+    // read test
+    std::istream* istr = FileUtils::openFile(tmp2);
+    std::string yow;
+    *istr >> yow;
+    FileUtils::closeFile(istr);
+    EXPECT_TRUE(yow=="yow");
+
+    // delete test
+    FileUtils::deleteFile(tmp2);
+    EXPECT_TRUE(FileUtils::fileExists(tmp2)==false);
+}
+
+TEST(FileUtilsTest, test_readFileIntoString)
+{
+    const std::string filename = Support::datapath("text/text.txt");
+    EXPECT_TRUE(FileUtils::fileExists(filename));
+
+    std::string source = FileUtils::readFileIntoString(filename);
+
+    std::string ref = "This is a file that allows us to test that we "
+        "can read a text file into a string through the file utils.\n";
+
+    EXPECT_TRUE(source == ref);
+}
+
+TEST(FileUtilsTest, test_getcwd)
+{
+#if 0
+    // this is hardcoded for mpg's environment
+    const std::string cwd = FileUtils::getcwd();
+    EXPECT_TRUE(cwd == "D:/dev/pdal/test/unit/");
+#endif
+}
+
+#ifdef _WIN32
+static const std::string drive = "A:";
+#else
+static const std::string drive = "";
+#endif
+
+static std::string normalize(const std::string p)
+{
+    return Utils::replaceAll(p, "\\", "/");
+}
+
+static void compare_paths(const std::string a, const std::string b)
+{
+    EXPECT_EQ(normalize(a), normalize(b));
+}
+
+TEST(FileUtilsTest, test_toAbsolutePath)
+{
+    using namespace std;
+
+    const string root = FileUtils::getcwd();
+
+    // check 1-arg version: make absolute when file is relative, via current working dir
+    const string a = FileUtils::toAbsolutePath("foo.txt");
+    compare_paths(a, root + "foo.txt");
+
+    // check 1-arg version: make absolute when file is already absolute
+    const string b = FileUtils::toAbsolutePath(drive + "/baz/foo.txt");
+    compare_paths(b, drive + "/baz/foo.txt");
+
+    // check 2-arg version: make absolute when file relative, via given base
+    const string c = FileUtils::toAbsolutePath("foo.txt", drive + "/a/b/c/d");
+    compare_paths(c, drive + "/a/b/c/d/foo.txt");
+
+    // check 2-arg version: make absolute when file is relative, via given base (which isn't absolute)
+    const string d = FileUtils::toAbsolutePath("foo.txt", "x/y/z");
+    compare_paths(d, root + "x/y/z/" + "foo.txt");
+
+    // check 1-arg version: make absolute when file is already absolute
+    const string e = FileUtils::toAbsolutePath(drive+"/baz/foo.txt", drive+"/a/b/c/d");
+    compare_paths(e, drive + "/baz/foo.txt");
+}
+
+TEST(FileUtilsTest, test_getDirectory)
+{
+    // test absolute case
+    const std::string a = FileUtils::getDirectory(drive + "/a/b/foo.txt");
+    compare_paths(a, drive + "/a/b/");
+
+    // test relative case
+    const std::string b = FileUtils::getDirectory("a/b/foo.txt");
+    compare_paths(b, "a/b/");
+}
+
+TEST(FileUtilsTest, test_isAbsolute)
+{
+    // test absolute case
+    const bool a = FileUtils::isAbsolutePath(drive + "/a/b/foo.txt");
+    EXPECT_TRUE(a);
+
+    // test relative case
+    const bool b = FileUtils::isAbsolutePath("a/b/foo.txt");
+    EXPECT_TRUE(!b);
+}
+
+TEST(FileUtilsTest, filename)
+{
+    std::string filename = "/foo//bar//baz.c";
+    EXPECT_EQ(FileUtils::getFilename(filename), "baz.c");
+}
diff --git a/test/unit/GeoreferenceTest.cpp b/test/unit/GeoreferenceTest.cpp
new file mode 100644
index 0000000..317f30d
--- /dev/null
+++ b/test/unit/GeoreferenceTest.cpp
@@ -0,0 +1,128 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#define _USE_MATH_DEFINES
+#include <pdal/pdal_test_main.hpp>
+#include <pdal/util/Georeference.hpp>
+
+#include <cmath>
+
+
+namespace pdal
+{
+namespace georeference
+{
+
+
+TEST(RotationMatrix, Constructor)
+{
+    RotationMatrix matrix(1, 0, 0, 0, 1, 0, 0, 0, 1);
+    EXPECT_DOUBLE_EQ(1, matrix.m00);
+    EXPECT_DOUBLE_EQ(0, matrix.m01);
+    EXPECT_DOUBLE_EQ(0, matrix.m01);
+    EXPECT_DOUBLE_EQ(0, matrix.m10);
+    EXPECT_DOUBLE_EQ(1, matrix.m11);
+    EXPECT_DOUBLE_EQ(0, matrix.m12);
+    EXPECT_DOUBLE_EQ(0, matrix.m20);
+    EXPECT_DOUBLE_EQ(0, matrix.m21);
+    EXPECT_DOUBLE_EQ(1, matrix.m22);
+}
+
+
+TEST(RotationMatrix, IdentityMatrix)
+{
+    RotationMatrix matrix = createIdentityMatrix();
+    EXPECT_DOUBLE_EQ(1, matrix.m00);
+    EXPECT_DOUBLE_EQ(0, matrix.m01);
+    EXPECT_DOUBLE_EQ(0, matrix.m01);
+    EXPECT_DOUBLE_EQ(0, matrix.m10);
+    EXPECT_DOUBLE_EQ(1, matrix.m11);
+    EXPECT_DOUBLE_EQ(0, matrix.m12);
+    EXPECT_DOUBLE_EQ(0, matrix.m20);
+    EXPECT_DOUBLE_EQ(0, matrix.m21);
+    EXPECT_DOUBLE_EQ(1, matrix.m22);
+}
+
+
+TEST(Georeference, Zeros)
+{
+    Xyz point = georeferenceWgs84(0, 0, createIdentityMatrix(),
+                                  createIdentityMatrix(), Xyz(0, 0, 0));
+    EXPECT_DOUBLE_EQ(0, point.X);
+    EXPECT_DOUBLE_EQ(0, point.Y);
+    EXPECT_DOUBLE_EQ(0, point.Z);
+}
+
+
+TEST(Georeference, LatLonElev)
+{
+    Xyz point = georeferenceWgs84(0, 0, createIdentityMatrix(),
+                                  createIdentityMatrix(), Xyz(1, 2, 3));
+    EXPECT_DOUBLE_EQ(1, point.X);
+    EXPECT_DOUBLE_EQ(2, point.Y);
+    EXPECT_DOUBLE_EQ(3, point.Z);
+}
+
+
+TEST(Georeference, Range)
+{
+    Xyz point = georeferenceWgs84(3, 0, createIdentityMatrix(),
+                                  createIdentityMatrix(), Xyz(1, 2, 3));
+    EXPECT_DOUBLE_EQ(1, point.X);
+    EXPECT_DOUBLE_EQ(2, point.Y);
+    EXPECT_DOUBLE_EQ(0, point.Z);
+}
+
+
+TEST(Georeference, RangeAndAngle)
+{
+    Xyz point = georeferenceWgs84(3, M_PI / 2, createIdentityMatrix(),
+                                  createIdentityMatrix(), Xyz(1, 2, 3));
+    EXPECT_DOUBLE_EQ(0.9999988728659957, point.X);
+    EXPECT_DOUBLE_EQ(2, point.Y);
+    EXPECT_DOUBLE_EQ(3, point.Z);
+}
+
+
+TEST(Georeference, WithImu)
+{
+    RotationMatrix imuMatrix(0, 1, 0, 0, 0, -1, -1, 0, 0);
+    Xyz point =
+        georeferenceWgs84(3, 0, imuMatrix, createIdentityMatrix(), Xyz(1, 2, 3));
+    EXPECT_DOUBLE_EQ(1, point.X);
+    EXPECT_DOUBLE_EQ(2.0000004696006983, point.Y);
+    EXPECT_DOUBLE_EQ(3, point.Z);
+}
+}
+}
diff --git a/test/unit/KDIndexTest.cpp b/test/unit/KDIndexTest.cpp
new file mode 100644
index 0000000..608ca37
--- /dev/null
+++ b/test/unit/KDIndexTest.cpp
@@ -0,0 +1,290 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc. (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/KDIndex.hpp>
+
+using namespace pdal;
+
+TEST(KDIndex, neighbors2D)
+{
+    PointTable table;
+    PointLayoutPtr layout = table.layout();
+    PointView view(table);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Y, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Y, 1, 1);
+    
+    view.setField(Dimension::Id::X, 2, 3);
+    view.setField(Dimension::Id::Y, 2, 3);
+    
+    view.setField(Dimension::Id::X, 3, 6);
+    view.setField(Dimension::Id::Y, 3, 6);
+    
+    view.setField(Dimension::Id::X, 4, 10);
+    view.setField(Dimension::Id::Y, 4, 10);
+    
+    KD2Index index(view);
+    index.build();
+
+    EXPECT_EQ(index.neighbor(0, 0), 0u);
+    EXPECT_EQ(index.neighbor(1.1, 1.1), 1u);
+    EXPECT_EQ(index.neighbor(3.3, 3.3), 2u);
+    EXPECT_EQ(index.neighbor(6.1, 6.1), 3u);
+    EXPECT_EQ(index.neighbor(15, 15), 4u);
+
+    std::vector<PointId> ids;
+    ids = index.neighbors(0, 0, 5);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+    EXPECT_EQ(ids[3], 3u);
+    EXPECT_EQ(ids[4], 4u);
+
+    ids = index.neighbors(0, 0, 25);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+    EXPECT_EQ(ids[3], 3u);
+    EXPECT_EQ(ids[4], 4u);
+
+    ids = index.neighbors(3.1, 3.1, 5);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 2u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 3u);
+    EXPECT_EQ(ids[3], 0u);
+    EXPECT_EQ(ids[4], 4u);
+}
+
+TEST(KDIndex, neighbors3D)
+{
+    PointTable table;
+    PointLayoutPtr layout = table.layout();
+    PointView view(table);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Y, 0, 0);
+    view.setField(Dimension::Id::Z, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Y, 1, 1);
+    view.setField(Dimension::Id::Z, 1, 1);
+    
+    view.setField(Dimension::Id::X, 2, 3);
+    view.setField(Dimension::Id::Y, 2, 3);
+    view.setField(Dimension::Id::Z, 2, 3);
+    
+    view.setField(Dimension::Id::X, 3, 6);
+    view.setField(Dimension::Id::Y, 3, 6);
+    view.setField(Dimension::Id::Z, 3, 6);
+    
+    view.setField(Dimension::Id::X, 4, 10);
+    view.setField(Dimension::Id::Y, 4, 10);
+    view.setField(Dimension::Id::Z, 4, 10);
+    
+    KD3Index index(view);
+    index.build();
+
+    EXPECT_EQ(index.neighbor(0, 0, 0), 0u);
+    EXPECT_EQ(index.neighbor(1.1, 1.1, 1.1), 1u);
+    EXPECT_EQ(index.neighbor(3.3, 3.3, 3.3), 2u);
+    EXPECT_EQ(index.neighbor(6.1, 6.1, 6.1), 3u);
+    EXPECT_EQ(index.neighbor(15, 15, 15), 4u);
+
+    std::vector<PointId> ids;
+    ids = index.neighbors(0, 0, 0, 5);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+    EXPECT_EQ(ids[3], 3u);
+    EXPECT_EQ(ids[4], 4u);
+
+    ids = index.neighbors(0, 0, 0, 25);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+    EXPECT_EQ(ids[3], 3u);
+    EXPECT_EQ(ids[4], 4u);
+
+    ids = index.neighbors(3.1, 3.1, 3.1, 5);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 2u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 3u);
+    EXPECT_EQ(ids[3], 0u);
+    EXPECT_EQ(ids[4], 4u);
+}
+
+TEST(KDIndex, neighbordims)
+{
+    PointTable table;
+    PointLayoutPtr layout = table.layout();
+    PointView view(table);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Z);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Z, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Z, 1, 1);
+    
+    EXPECT_THROW(KD2Index index(view), pdal_error);
+
+    PointTable table2;
+    PointLayoutPtr layout2 = table.layout();
+    PointView view2(table2);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Y, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Y, 1, 1);
+    
+    EXPECT_THROW(KD3Index index(view2), pdal_error);
+}
+
+TEST(KDIndex, radius2D)
+{
+    PointTable table;
+    PointLayoutPtr layout = table.layout();
+    PointView view(table);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Y, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Y, 1, 1);
+    
+    view.setField(Dimension::Id::X, 2, 3);
+    view.setField(Dimension::Id::Y, 2, 3);
+    
+    view.setField(Dimension::Id::X, 3, 6);
+    view.setField(Dimension::Id::Y, 3, 6);
+    
+    view.setField(Dimension::Id::X, 4, 10);
+    view.setField(Dimension::Id::Y, 4, 10);
+    
+    KD2Index index(view);
+    index.build();
+
+    std::vector<PointId> ids;
+    ids = index.radius(0, 0, 4.25);
+    
+    EXPECT_EQ(ids.size(), 3u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+
+    ids = index.radius(3.1, 3.1, 10);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 2u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 3u);
+    EXPECT_EQ(ids[3], 0u);
+    EXPECT_EQ(ids[4], 4u);
+}
+
+TEST(KDIndex, radius3D)
+{
+    PointTable table;
+    PointLayoutPtr layout = table.layout();
+    PointView view(table);
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+
+    view.setField(Dimension::Id::X, 0, 0);
+    view.setField(Dimension::Id::Y, 0, 0);
+    view.setField(Dimension::Id::Z, 0, 0);
+    
+    view.setField(Dimension::Id::X, 1, 1);
+    view.setField(Dimension::Id::Y, 1, 1);
+    view.setField(Dimension::Id::Z, 1, 1);
+    
+    view.setField(Dimension::Id::X, 2, 3);
+    view.setField(Dimension::Id::Y, 2, 3);
+    view.setField(Dimension::Id::Z, 2, 3);
+    
+    view.setField(Dimension::Id::X, 3, 6);
+    view.setField(Dimension::Id::Y, 3, 6);
+    view.setField(Dimension::Id::Z, 3, 6);
+    
+    view.setField(Dimension::Id::X, 4, 10);
+    view.setField(Dimension::Id::Y, 4, 10);
+    view.setField(Dimension::Id::Z, 4, 10);
+    
+    KD3Index index(view);
+    index.build();
+
+    std::vector<PointId> ids;
+    ids = index.radius(0, 0, 0, 5.2);
+    
+    EXPECT_EQ(ids.size(), 3u);
+    EXPECT_EQ(ids[0], 0u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 2u);
+
+    ids = index.radius(3.1, 3.1, 3.1, 12.2);
+    EXPECT_EQ(ids.size(), 5u);
+    EXPECT_EQ(ids[0], 2u);
+    EXPECT_EQ(ids[1], 1u);
+    EXPECT_EQ(ids[2], 3u);
+    EXPECT_EQ(ids[3], 0u);
+    EXPECT_EQ(ids[4], 4u);
+}
+
diff --git a/test/unit/LogTest.cpp b/test/unit/LogTest.cpp
new file mode 100644
index 0000000..28c2885
--- /dev/null
+++ b/test/unit/LogTest.cpp
@@ -0,0 +1,85 @@
+/******************************************************************************
+* Copyright (c) 2012, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Consulting LLC nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <FauxReader.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(LogTest, test_one)
+{
+    StageFactory f;
+
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+
+    Option opt1("bounds", bounds);
+    Option opt2("log", Support::temppath("mylog_one.txt"));
+    Option opt3("num_points", 750);
+    Option opt4("mode", "constant");
+
+    Options opts;
+    opts.add(opt1);
+    opts.add(opt2);
+    opts.add(opt3);
+    opts.add(opt4);
+
+    {
+        PointTable table;
+
+        FauxReader reader;
+        reader.setOptions(opts);
+        reader.prepare(table);
+
+        EXPECT_EQ(reader.log()->getLevel(), LogLevel::Error);
+        reader.log()->setLevel(LogLevel::Debug5);
+        EXPECT_EQ(reader.log()->getLevel(), LogLevel::Debug5);
+
+        PointViewSet viewSet = reader.execute(table);
+        EXPECT_EQ(viewSet.size(), 1u);
+        PointViewPtr view = *viewSet.begin();
+        EXPECT_EQ(view->size(), 750u);
+    }
+    bool ok = Support::compare_text_files(
+        Support::temppath("mylog_one.txt"),
+        Support::datapath("logs/logtest.txt"));
+
+    if (ok)
+        FileUtils::deleteFile(Support::temppath("mylog_one.txt"));
+
+    EXPECT_TRUE(ok);
+}
diff --git a/test/unit/MetadataTest.cpp b/test/unit/MetadataTest.cpp
new file mode 100644
index 0000000..ceece14
--- /dev/null
+++ b/test/unit/MetadataTest.cpp
@@ -0,0 +1,312 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <boost/algorithm/string.hpp>
+
+#include <pdal/Metadata.hpp>
+
+using namespace pdal;
+
+TEST(MetadataTest, assign)
+{
+    MetadataNode m1("Test");
+    MetadataNode m2 = m1;
+    EXPECT_EQ(m1.name(), "Test");
+    EXPECT_EQ(m2.name(), "Test");
+}
+
+TEST(MetadataTest, test_construction)
+{
+    uint32_t u32(32u);
+    int32_t i32(-32);
+    uint64_t u64(64u);
+    int64_t i64(-64);
+    int8_t i8(-8);
+    uint8_t u8(8);
+    int16_t i16(-16);
+    uint16_t u16(16);
+
+    {
+        std::vector<uint8_t> v;
+        for (uint8_t i = 0; i < 100; i++)
+            v.push_back(i);
+
+        MetadataNode m;
+        MetadataNode m2 = m.addEncoded("name", v.data(), v.size());
+        EXPECT_EQ(m2.type(), "base64Binary");
+
+        std::string base64("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiYw==");
+        EXPECT_EQ(m2.value(), base64);
+    }
+
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add<int8_t>("name", i8);
+        EXPECT_EQ(m2.value(), "-8");
+        EXPECT_EQ(m2.type(), "integer");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", i16);
+        EXPECT_EQ(m2.value(), "-16");
+        EXPECT_EQ(m2.type(), "integer");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", i32);
+        EXPECT_EQ(m2.value(), "-32");
+        EXPECT_EQ(m2.type(), "integer");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", i64);
+        EXPECT_EQ(m2.value(), "-64");
+        EXPECT_EQ(m2.type(), "integer");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", i64);
+        EXPECT_EQ(m2.value(), "-64");
+        EXPECT_EQ(m2.type(), "integer");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add<uint8_t>("name", u8);
+        EXPECT_EQ(m2.value(), "8");
+        EXPECT_EQ(m2.type(), "nonNegativeInteger");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", u16);
+        EXPECT_EQ(m2.value(), "16");
+        EXPECT_EQ(m2.type(), "nonNegativeInteger");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", u32);
+        EXPECT_EQ(m2.value(), "32");
+        EXPECT_EQ(m2.type(), "nonNegativeInteger");
+    }
+
+    {
+        MetadataNode m;
+        MetadataNode m2 = m.add("name", u64);
+        EXPECT_EQ(m2.value(), "64");
+        EXPECT_EQ(m2.type(), "nonNegativeInteger");
+    }
+}
+
+TEST(MetadataTest, typed_value)
+{
+    MetadataNode m;
+    MetadataNode m2 = m.add("name", 127);
+
+    EXPECT_EQ(127, m2.value<int>());
+
+    double d = 123.45;
+    MetadataNode m3 = m.addEncoded("name", (unsigned char *)&d, sizeof(d));
+    EXPECT_DOUBLE_EQ(d, m3.value<double>());
+    EXPECT_EQ("zczMzMzcXkA=", m3.value());
+
+    MetadataNode m4 = m.add("name", "65539");
+    EXPECT_EQ(65539u, m4.value<unsigned>());
+
+    auto redir = Utils::redirect(std::cerr);
+    EXPECT_EQ(0u, m4.value<unsigned short>());
+    Utils::restore(std::cerr, redir);
+}
+
+
+TEST(MetadataTest, test_construction_with_srs)
+{
+    MetadataNode m;
+    SpatialReference ref("EPSG:4326");
+    MetadataNode m2 = m.add("spatialreference", ref);
+    EXPECT_EQ(m2.type(), "spatialreference");
+
+    //SpatialReference ref2 = m.getValue<SpatialReference>();
+    // std::string ref_text("GEOGCS[\"WGS 84\","
+    //     DATUM[\"WGS_1984\","
+    //         SPHEROID[\"WGS 84\",6378137,298.257223563,
+    //             AUTHORITY[\"EPSG\",\"7030\"]],
+    //         AUTHORITY[\"EPSG\",\"6326\"]],
+    //     PRIMEM[\"Greenwich\",0,
+    //         AUTHORITY[\"EPSG\",\"8901\"]],
+    //     UNIT[\"degree\",0.0174532925199433,
+    //         AUTHORITY[\"EPSG\",\"9122\"]],
+    //     AUTHORITY[\"EPSG\",\"4326\"]]");
+
+    // std::cout << boost::lexical_cast<std::string>(m.getValue<SpatialReference>());
+}
+
+
+TEST(MetadataTest, test_metadata_copy)
+{
+    MetadataNode m;
+    MetadataNode m2 = m.add("val", 2u);
+    uint32_t t = boost::lexical_cast<uint32_t>(m2.value());
+    EXPECT_EQ(t, 2u);
+}
+
+TEST(MetadataTest, test_metadata_set)
+{
+    MetadataNode m;
+
+    MetadataNode m1 = m.add("m1", 1u);
+    MetadataNode m2 = m.add("m2", 2);
+    MetadataNode m1prime = m.add("m1prime", "Some other metadata");
+
+    MetadataNode mm(m);
+
+    std::vector<MetadataNode> ms = mm.children();
+    EXPECT_EQ(ms.size(), 3u);
+
+    class Predicate
+    {
+    public:
+        Predicate(const std::string& name) : m_name(name)
+        {}
+
+        bool operator()(MetadataNode m)
+            { return m.name() == m_name; }
+    private:
+        std::string m_name;
+    };
+
+    MetadataNode node = mm.findChild(Predicate("m1"));
+    EXPECT_EQ(node.value(), "1");
+    node = mm.find(Predicate("m2"));
+    EXPECT_EQ(node.value(), "2");
+    node = mm.find(Predicate("m1prime"));
+    EXPECT_EQ(node.value(), "Some other metadata");
+    node = mm.find(Predicate("foo"));
+    EXPECT_EQ(node.value(), "");
+}
+
+TEST(MetadataTest, test_vlr_metadata)
+{
+    MetadataNode m;
+
+    MetadataNode bogusvlr = m.add("vlr1", "VLR1VALUE", "VLR1DESC");
+    MetadataNode vlr = m.add("vlr2", "VLR2VALUE", "VLR2DESC");
+    std::string recordId("MYRECOREDID");
+    std::string userId("MYUSERID");
+    vlr.add("record_id", recordId);
+    vlr.add("user_id", userId);
+    // Find a node whose name starts with vlr and that has child nodes
+    // with the name and recordId we're looking for.
+    auto pred = [recordId,userId](MetadataNode n)
+    {
+        auto recPred = [recordId](MetadataNode n)
+        {
+            return n.name() == "record_id" &&
+                n.value() == recordId;
+        };
+        auto userPred = [userId](MetadataNode n)
+        {
+            return n.name() == "user_id" &&
+                n.value() == userId;
+        };
+        return (boost::algorithm::istarts_with(n.name(), "vlr") &&
+            !n.findChild(recPred).empty() &&
+            !n.findChild(userPred).empty());
+    };
+
+    MetadataNode found = m.find(pred);
+    EXPECT_EQ(found.name(), "vlr2");
+    EXPECT_EQ(found.value(), "VLR2VALUE");
+    EXPECT_EQ(found.description(), "VLR2DESC");
+}
+
+TEST(MetadataTest, find_child_string)
+{
+    MetadataNode top;
+    MetadataNode m = top.add("level1");
+    MetadataNode l21 = m.add("level2");
+    MetadataNode l22 = m.add("level2");
+    l21.add("210", "210");
+    l22.add("220", "220");
+
+    MetadataNode n = top.findChild("level1:level2:210");
+    EXPECT_EQ(n.value(), "210");
+    n = top.findChild("level1:level2:220");
+    EXPECT_EQ(n.value(), "220");
+}
+
+/**
+TEST(MetadataTest, sanitize)
+{
+    MetadataNode top(" Test;semicolon:colon space'apostrophe\"quote:");
+    EXPECT_EQ(top.name(),
+        "_Test_semicolon_colon_space_apostrophe_quote_");
+}
+**/
+
+TEST(MetadataTest, test_metadata_stage)
+{
+//ABELL
+/**
+    PointTable table;
+
+    LasReader reader(Support::datapath("interesting.las"));
+    reader.prepare(table);
+
+    MetadataNode file_metadata = table->metadata();
+
+    EXPECT_EQ(file_metadata.toPTree().get_child("metadata").size(),
+        32);
+
+    PointTable readerTable;
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(
+        Support::datapath("pipeline/pipeline_metadata_reader.xml"));
+    std::shared_ptr<Stage> stage(mgr.getStage());
+
+    stage->prepare(readerTable);
+    MetadataNode pipeline_metadata = readerTable->metadata();
+    EXPECT_EQ(
+        pipeline_metadata.toPTree().get_child("metadata").size(), 32);
+**/
+}
diff --git a/test/unit/OptionsTest.cpp b/test/unit/OptionsTest.cpp
new file mode 100644
index 0000000..35f88fb
--- /dev/null
+++ b/test/unit/OptionsTest.cpp
@@ -0,0 +1,363 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Options.hpp>
+#include <pdal/PDALUtils.hpp>
+#include <CropFilter.hpp>
+#include <FauxReader.hpp>
+
+#include "Support.hpp"
+
+#include <boost/property_tree/xml_parser.hpp>
+
+static std::string xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+static std::string xml_int_ref = "<Name>my_int</Name><Value>17</Value><Description>This is my integral option.</Description>";
+static std::string xml_str_ref = "<Name>my_string</Name><Value>Yow.</Value><Description>This is my stringy option.</Description>";
+
+using namespace pdal;
+
+TEST(OptionsTest, test_static_options)
+{
+    Options ops;
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    CropFilter crop;
+    crop.setOptions(ops);
+    crop.setInput(reader);
+    auto opts = crop.getDefaultOptions();
+    EXPECT_EQ(opts.getOptions().size(), 3u);
+    EXPECT_TRUE(opts.hasOption("bounds"));
+    EXPECT_TRUE(opts.hasOption("inside"));
+    EXPECT_TRUE(opts.hasOption("polygon"));
+    EXPECT_FALSE(opts.hasOption("metes"));
+}
+
+TEST(OptionsTest, test_option_writing)
+{
+    std::ostringstream ostr_i;
+    const std::string ref_i = xml_header + xml_int_ref;
+    std::ostringstream ostr_s;
+    const std::string ref_s = xml_header + xml_str_ref;
+
+    const Option option_i("my_int", (uint16_t)17,
+        "This is my integral option.");
+    EXPECT_TRUE(option_i.getName() == "my_int");
+    EXPECT_TRUE(option_i.getDescription() == "This is my integral option.");
+    EXPECT_TRUE(option_i.getValue<uint16_t>() == 17);
+    EXPECT_TRUE(option_i.getValue<std::string>() == "17");
+
+    const Option option_s("my_string", "Yow.", "This is my stringy option.");
+    EXPECT_TRUE(option_s.getName() == "my_string");
+    EXPECT_TRUE(option_s.getDescription() == "This is my stringy option.");
+    EXPECT_TRUE(option_s.getValue<std::string>() == "Yow.");
+    EXPECT_TRUE(option_s.getValue<std::string>() == "Yow.");
+
+    const boost::property_tree::ptree tree_i = Utils::toPTree(option_i);
+    boost::property_tree::xml_parser::write_xml(ostr_i, tree_i);
+    const std::string str_i = ostr_i.str();
+    EXPECT_TRUE(str_i == ref_i);
+
+    const boost::property_tree::ptree tree_s = Utils::toPTree(option_s);
+    boost::property_tree::xml_parser::write_xml(ostr_s, tree_s);
+    const std::string str_s = ostr_s.str();
+    EXPECT_TRUE(str_s == ref_s);
+}
+
+TEST(OptionsTest, test_option_reading)
+{
+    // from an xml stream
+    std::istringstream istr(xml_int_ref);
+    boost::property_tree::ptree tree1;
+    boost::property_tree::read_xml(istr,tree1);
+    Option opt_from_istr(tree1);
+
+    EXPECT_TRUE(opt_from_istr.getName() == "my_int");
+    EXPECT_TRUE(opt_from_istr.getDescription() == "This is my integral option.");
+    EXPECT_TRUE(opt_from_istr.getValue<std::string>() == "17");
+    EXPECT_TRUE(opt_from_istr.getValue<int>() == 17);
+
+    // from a ptree (assumed to be built correctly)
+    const boost::property_tree::ptree tree2 = Utils::toPTree(opt_from_istr);
+    Option opt_from_ptree(tree2);
+
+    EXPECT_TRUE(opt_from_ptree.getName() == "my_int");
+    EXPECT_TRUE(opt_from_ptree.getDescription() == "This is my integral option.");
+    EXPECT_TRUE(opt_from_ptree.getValue<std::string>() == "17");
+    EXPECT_TRUE(opt_from_ptree.getValue<int>() == 17);
+}
+
+TEST(OptionsTest, test_options_copy_ctor)
+{
+    Option opt_i("my_int", 17, "This is my integral option.");
+    const Option opt_s("my_string", "Yow.", "This is my stringy option.");
+
+    Options opts;
+    opts.add(opt_i);
+    opts.add(opt_s);
+
+    Options copy(opts);
+
+    opt_i.setOptions(copy);
+
+    EXPECT_TRUE(copy.hasOption("my_int"));
+    EXPECT_TRUE(copy.hasOption("my_string"));
+}
+
+TEST(OptionsTest, test_options_multi)
+{
+    Option opt_i("a", 1, "This is my integral option.");
+    const Option opt_s("b", "2", "This is my stringy option.");
+
+    Options opts;
+    opts.add(opt_i);
+    opts.add(opt_s);
+
+    Option opt;
+    opt.setOptions(opts);
+
+    boost::optional<Options const&> o = opt.getOptions();
+
+    Option const& i = o->getOption("a");
+    EXPECT_EQ(i.getValue<int>(), 1);
+
+    Option const& s = o->getOption("b");
+    EXPECT_EQ(s.getValue<std::string>(), "2");
+}
+
+TEST(OptionsTest, test_options_writing)
+{
+    Options opts;
+
+    const Option option_i("my_int", 17, "This is my integral option.");
+    opts.add(option_i);
+
+    opts.add("my_string", "Yow.", "This is my stringy option.");
+
+    std::ostringstream ostr;
+    const std::string ref = xml_header + "<Option>" + xml_int_ref + "</Option><Option>" + xml_str_ref + "</Option>";
+
+    const boost::property_tree::ptree& tree = Utils::toPTree(opts);
+    boost::property_tree::xml_parser::write_xml(ostr, tree);
+    const std::string str = ostr.str();
+    EXPECT_TRUE(str == ref);
+
+    int val_i = opts.getOption("my_int").getValue<int>();
+    std::string desc_i = opts.getOption("my_int").getDescription();
+    std::string val_s = opts.getOption("my_string").getValue<std::string>();
+    std::string desc_s = opts.getOption("my_string").getDescription();
+    EXPECT_TRUE(val_i == 17);
+    EXPECT_TRUE(val_s == "Yow.");
+    EXPECT_TRUE(desc_i == "This is my integral option.");
+    EXPECT_TRUE(desc_s == "This is my stringy option.");
+}
+
+TEST(OptionsTest, test_options_reading)
+{
+    const std::string ref = xml_header + "<Option>" + xml_int_ref + "</Option><Option>" + xml_str_ref + "</Option>";
+    std::istringstream istr(ref);
+
+    boost::property_tree::ptree tree;
+    boost::property_tree::read_xml(istr,tree);
+    Options opts_from_istr(tree);
+
+    const Option& opt = opts_from_istr.getOption("my_int");
+
+    EXPECT_TRUE(opt.getValue<std::string>() == "17");
+    EXPECT_TRUE(opt.getValue<int>() == 17);
+}
+
+TEST(OptionsTest, test_valid_options)
+{
+    Options opts;
+
+    bool reached = false;
+    try
+    {
+        opts.getOption("foo").getValue<int>();
+    }
+    catch (Option::not_found ex)
+    {
+        EXPECT_EQ((std::string)ex.what(),
+            (std::string)"Options::getOption: Required option 'foo' was "
+            "not found on this stage");
+        reached = true;
+    }
+    EXPECT_TRUE(reached);
+
+    EXPECT_FALSE(opts.hasOption("bar"));
+    {
+        Options optI;
+
+        optI.add("foo", 19, "foo as an int");
+        EXPECT_TRUE(optI.hasOption("foo"));
+
+        EXPECT_EQ(optI.getValueOrThrow<int>("foo"), 19);
+
+        optI.add("foo", "nineteen", "foo as a string");
+        EXPECT_TRUE(optI.hasOption("foo"));
+
+        // Options is backed by a std::multimap,
+        // Adding new options will mean the first will
+        // continue to be returned.
+        EXPECT_EQ(optI.getValueOrThrow<int>("foo"), 19);
+
+        std::vector<Option> options = optI.getOptions("foo");
+        EXPECT_EQ(options[1].getValue<std::string>(), "nineteen");
+    }
+}
+
+TEST(OptionsTest, Options_test_add_vs_put)
+{
+    Options opts;
+
+    opts.add<int>("a",1);
+    opts.add<int>("a",2);
+    opts.add<int>("a",3);
+
+    std::vector<Option> options = opts.getOptions("a");
+    EXPECT_TRUE(opts.hasOption("a"));
+    EXPECT_EQ(options[0].getValue<int>(), 1);
+    EXPECT_EQ(options[1].getValue<int>(), 2);
+    EXPECT_EQ(options[2].getValue<int>(), 3);
+}
+
+TEST(OptionsTest, Options_test_bool)
+{
+    Option a("a", "true", "");
+    Option b("b", "false", "");
+    Option c("c", true);
+    Option d("d", false);
+
+    bool av = a.getValue<bool>();
+    bool bv = b.getValue<bool>();
+    bool cv = c.getValue<bool>();
+    bool dv = d.getValue<bool>();
+
+    EXPECT_EQ(av, true);
+    EXPECT_EQ(bv, false);
+    EXPECT_EQ(cv, true);
+    EXPECT_EQ(dv, false);
+}
+
+TEST(OptionsTest, stringsplit)
+{
+    Option a("a", "This, is,a, test  ,,");
+    std::vector<std::string> slist = a.getValue<std::vector<std::string>>();
+    EXPECT_EQ(slist.size(), (size_t)4);
+    EXPECT_EQ(slist[0], "This");
+    EXPECT_EQ(slist[1], "is");
+    EXPECT_EQ(slist[2], "a");
+    EXPECT_EQ(slist[3], "test");
+}
+
+TEST(OptionsTest, implicitdefault)
+{
+    Options ops;
+    ops.add("a", "This, is,a, test  ,,");
+    ops.add("b", 25);
+
+    int i = ops.getValueOrDefault<int>("c");
+    EXPECT_EQ(i, 0);
+    i = ops.getValueOrDefault<int>("b");
+    EXPECT_EQ(i, 25);
+    std::vector<std::string> slist =
+        ops.getValueOrDefault<std::vector<std::string>>("d");
+    EXPECT_EQ(slist.size(), (size_t)0);
+    slist = ops.getValueOrDefault<std::vector<std::string>>("a");
+    EXPECT_EQ(slist.size(), (size_t)4);
+}
+
+TEST(OptionsTest, metadata)
+{
+    Options ops;
+    ops.add("test1", "This is a test");
+    ops.add("test2", 56);
+    ops.add("test3", 27.5, "Testing test3");
+
+    Option op35("test3.5", 3.5);
+
+    Options subops;
+    subops.add("subtest1", "Subtest1");
+    subops.add("subtest2", "Subtest2");
+
+    op35.setOptions(subops);
+
+    ops.add(op35);
+    ops.add("test4", "Testing option test 4");
+
+    MetadataNode node = ops.toMetadata();
+
+    std::string goodfile(Support::datapath("misc/opts2json_meta.txt"));
+    std::string testfile(Support::temppath("opts2json.txt"));
+    {
+        std::ofstream out(testfile);
+        Utils::toJSON(node, out);
+    }
+    EXPECT_TRUE(Support::compare_files(goodfile, testfile));
+}
+
+TEST(OptionsTest, conditional)
+{
+    CropFilter s;
+
+    Options ops;
+    ops.add("foo", "foo");
+    ops.add("bar", "bar");
+    ops.add("baz", "baz");
+
+    s.setOptions(ops);
+
+    Options condOps;
+    condOps.add("foo", "lose");
+    condOps.add("bar", "lose");
+    condOps.add("baz", "lose");
+    condOps.add("foot", "win");
+    condOps.add("barf", "win");
+    condOps.add("bazel", "win");
+
+    s.addConditionalOptions(condOps);
+    ops = s.getOptions();
+    EXPECT_EQ(ops.size(), 6u);
+    EXPECT_EQ(ops.getValueOrDefault("foo", std::string()), "foo");
+    EXPECT_EQ(ops.getValueOrDefault("bar", std::string()), "bar");
+    EXPECT_EQ(ops.getValueOrDefault("baz", std::string()), "baz");
+    EXPECT_EQ(ops.getValueOrDefault("foot", std::string()), "win");
+    EXPECT_EQ(ops.getValueOrDefault("barf", std::string()), "win");
+    EXPECT_EQ(ops.getValueOrDefault("bazel", std::string()), "win");
+}
+
diff --git a/test/unit/PDALUtilsTest.cpp b/test/unit/PDALUtilsTest.cpp
new file mode 100644
index 0000000..3a1c731
--- /dev/null
+++ b/test/unit/PDALUtilsTest.cpp
@@ -0,0 +1,70 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., hobu at hobu.co
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of its contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <sstream>
+
+#include <pdal/PDALUtils.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(PDALUtilsTest, options1)
+{
+    Options ops;
+    ops.add("test1", "This is a test");
+    ops.add("test2", 56);
+    ops.add("test3", 27.5, "Testing test3");
+
+    Option op35("test3.5", 3.5);
+
+    Options subops;
+    subops.add("subtest1", "Subtest1");
+    subops.add("subtest2", "Subtest2");
+
+    op35.setOptions(subops);
+
+    ops.add(op35);
+    ops.add("test4", "Testing option test 4");
+
+    std::string goodfile(Support::datapath("misc/opts2json.txt"));
+    std::string testfile(Support::temppath("opts2json.txt"));
+
+    {
+        std::ofstream out(testfile);
+        Utils::toJSON(ops, out);
+    }
+    EXPECT_TRUE(Support::compare_files(goodfile, testfile));
+}
+
diff --git a/test/unit/PipelineManagerTest.cpp b/test/unit/PipelineManagerTest.cpp
new file mode 100644
index 0000000..0580784
--- /dev/null
+++ b/test/unit/PipelineManagerTest.cpp
@@ -0,0 +1,126 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include "Support.hpp"
+
+#include <pdal/PipelineManager.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+using namespace pdal;
+
+TEST(PipelineManagerTest, basic)
+{
+    const char * outfile = "temp.las";
+    FileUtils::deleteFile(outfile);
+
+    PipelineManager mgr;
+
+    std::cout << "R" << std::endl;
+    Options optsR;
+    optsR.add("filename", Support::datapath("las/1.2-with-color.las"));
+    Stage& reader = mgr.addReader("readers.las");
+    reader.setOptions(optsR);
+
+    std::cout << "W" << std::endl;
+    Options optsW;
+    optsW.add("filename", outfile, "file to write to");
+    Stage& writer = mgr.addWriter("writers.las");
+    writer.setInput(reader);
+    writer.setOptions(optsW);
+
+    std::cout << "E" << std::endl;
+    point_count_t np = mgr.execute();
+    std::cout << "Done" << std::endl;
+    EXPECT_TRUE(np == 1065U);
+
+    EXPECT_TRUE(!std::ifstream(outfile).fail());
+    FileUtils::deleteFile(outfile);
+}
+
+
+//ABELL - Mosaic
+/**
+TEST(PipelineManagerTest, PipelineManagerTest_test2)
+{
+    FileUtils::deleteFile("temp.las");
+
+    {
+        PipelineManager mgr;
+
+        Options optsR1;
+        optsR1.add("filename", Support::datapath("1.2-with-color.las"));
+        std::shared_ptr<Stage> reader1(mgr.addReader("readers.las", optsR1));
+
+        Options optsR2;
+        optsR2.add("filename", Support::datapath("1.2-with-color.las"));
+        std::shared_ptr<Stage> reader2(mgr.addReader("readers.las", optsR2));
+
+        Options optsMF;
+        std::vector<std::shared_ptr<Stage> > vec;
+        vec.push_back(reader1);
+        vec.push_back(reader2);
+        MultiFilter* multifilter = mgr.addMultiFilter("filters.mosaic", vec, optsMF);
+
+        Options optsF;
+        optsF.add("bounds", Bounds<double>(0,0,0,1000000,1000000,1000000));
+        Filter* filter = mgr.addFilter("filters.crop", multifilter, optsF);
+
+        Options optsW;
+        optsW.add("filename", "temp.las", "file to write to");
+        std::shared_ptr<Stage> writer(mgr.addWriter("writers.las", *filter, optsW));
+        point_count_t np = mgr.execute();
+
+        EXPECT_TRUE(np == 1065 * 2);
+
+        std::vector<std::shared_ptr<Stage> > reader1_inputs = reader1->getInputs();
+        std::vector<std::shared_ptr<Stage> > reader2_inputs = reader2->getInputs();
+        std::vector<std::shared_ptr<Stage> > multifilter_inputs = multifilter->getInputs();
+        std::vector<std::shared_ptr<Stage> > filter_inputs = filter->getInputs();
+        std::vector<std::shared_ptr<Stage> > writer_inputs = writer->getInputs();
+
+        EXPECT_TRUE(reader1_inputs.size() == 0);
+        EXPECT_TRUE(reader2_inputs.size() == 0);
+        EXPECT_TRUE(multifilter_inputs.size() == 2);
+        EXPECT_TRUE(multifilter_inputs[0] == reader1);
+        EXPECT_TRUE(multifilter_inputs[1] == reader2);
+        EXPECT_TRUE(filter_inputs.size() == 1);
+        EXPECT_TRUE(filter_inputs[0] == multifilter);
+        EXPECT_TRUE(writer_inputs.size() == 1);
+    }
+
+    FileUtils::deleteFile("temp.las");
+}
+**/
diff --git a/test/unit/PointContextTest.cpp b/test/unit/PointContextTest.cpp
new file mode 100644
index 0000000..7796461
--- /dev/null
+++ b/test/unit/PointContextTest.cpp
@@ -0,0 +1,186 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointContext.hpp>
+#include <las/LasReader.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(PointContext, resolveType)
+{
+    using namespace Dimension;
+
+    PointContext ctx;
+
+    // Start with a default-defined dimension.
+    ctx.registerDim(Id::X);
+    EXPECT_EQ(ctx.dimSize(Id::X), 8u);
+    EXPECT_EQ(ctx.dimType(Id::X), Type::Double);
+
+    ctx.registerDim(Id::X, Type::Signed32);
+    EXPECT_EQ(ctx.dimSize(Id::X), 8u);
+    EXPECT_EQ(ctx.dimType(Id::X), Type::Double);
+
+    ctx.registerDim(Dimension::Id::X, Type::Unsigned8);
+    EXPECT_EQ(ctx.dimSize(Id::X), 8u);
+    EXPECT_EQ(ctx.dimType(Id::X), Type::Double);
+
+    /// Build as we go.
+    ctx.registerDim(Id::Y, Type::Unsigned8);
+    EXPECT_EQ(ctx.dimSize(Id::Y), 1u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Unsigned8);
+
+    ctx.registerDim(Id::Y, Type::Unsigned8);
+    EXPECT_EQ(ctx.dimSize(Id::Y), 1u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Unsigned8);
+
+    ctx.registerDim(Id::Y, Type::Signed8);
+    // Signed 8 and Unsigned 8 should yeild signed 16.
+    EXPECT_EQ(ctx.dimSize(Id::Y), 2u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Signed16);
+
+    ctx.registerDim(Id::Y, Type::Signed16);
+    EXPECT_EQ(ctx.dimSize(Id::Y), 2u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Signed16);
+
+    ctx.registerDim(Id::Y, Type::Float);
+    EXPECT_EQ(ctx.dimSize(Id::Y), 4u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Float);
+
+    ctx.registerDim(Id::Y, Type::Double);
+    EXPECT_EQ(ctx.dimSize(Id::Y), 8u);
+    EXPECT_EQ(ctx.dimType(Id::Y), Type::Double);
+
+    ///
+    ctx.registerDim(Id::Z, Type::Unsigned16);
+    EXPECT_EQ(ctx.dimSize(Id::Z), 2u);
+    EXPECT_EQ(ctx.dimType(Id::Z), Type::Unsigned16);
+
+    ctx.registerDim(Id::Z, Type::Signed8);
+    EXPECT_EQ(ctx.dimSize(Id::Z), 4u);
+    EXPECT_EQ(ctx.dimType(Id::Z), Type::Signed32);
+
+    ctx.registerDim(Id::Z, Type::Signed16);
+    EXPECT_EQ(ctx.dimSize(Id::Z), 4u);
+    EXPECT_EQ(ctx.dimType(Id::Z), Type::Signed32);
+
+    ctx.registerDim(Id::Z, Type::Double);
+    EXPECT_EQ(ctx.dimSize(Id::Z), 8u);
+    EXPECT_EQ(ctx.dimType(Id::Z), Type::Double);
+}
+
+TEST(PointContext, userBuffer)
+{
+    class UserBuf : public RawPtBuf
+    {
+    private:
+        double m_x;
+        double m_y;
+        double m_z;
+
+    public:
+        PointId addPoint()
+            { return 0; }
+        char *getPoint(PointId /*idx*/)
+            { return NULL; }
+        void setField(Dimension::Detail *d, PointId /*idx*/, const void *value)
+        {
+            if (d->id() == Dimension::Id::X)
+               m_x = *(double *)value; 
+            else if (d->id() == Dimension::Id::Y)
+               m_y = *(double *)value; 
+            else if (d->id() == Dimension::Id::Z)
+               m_z = *(double *)value; 
+        }
+        void getField(Dimension::Detail *d, PointId /*idx*/, void *value)
+        {
+            if (d->id() == Dimension::Id::X)
+               *(double *)value = m_x; 
+            else if (d->id() == Dimension::Id::Y)
+               *(double *)value = m_y; 
+            else if (d->id() == Dimension::Id::Z)
+               *(double *)value = m_z; 
+        }
+
+        bool update(Dimension::DetailList& /*detail*/, Dimension::Detail *cur,
+            const std::string& /*name*/)
+        {
+            Dimension::Id::Enum id = cur->id();
+
+            if (id != Dimension::Id::X && id != Dimension::Id::Y &&
+                id != Dimension::Id::Z)
+                return false;
+            cur->setType(Dimension::Type::Double);
+            return true;    
+        }
+    };
+
+    LasReader reader;
+
+    Options opts;
+    opts.add("filename", Support::datapath("las/simple.las"));
+    opts.add("count", 100);
+
+    reader.setOptions(opts);
+
+    PointContext defCtx;
+    reader.prepare(defCtx);
+    PointBufferSet pbSet = reader.execute(defCtx);
+    PointBufferPtr pb = *pbSet.begin();
+
+    auto readCb = [pb](PointBuffer& buf, PointId id)
+    {
+        double xDef = pb->getFieldAs<double>(Dimension::Id::X, id);
+        double yDef = pb->getFieldAs<double>(Dimension::Id::Y, id);
+        double zDef = pb->getFieldAs<double>(Dimension::Id::Z, id);
+
+        double x = buf.getFieldAs<double>(Dimension::Id::X, id);
+        double y = buf.getFieldAs<double>(Dimension::Id::Y, id);
+        double z = buf.getFieldAs<double>(Dimension::Id::Z, id);
+
+        EXPECT_FLOAT_EQ(xDef, x);
+        EXPECT_FLOAT_EQ(yDef, y);
+        EXPECT_FLOAT_EQ(zDef, z);
+    };
+
+    reader.setReadCb(readCb);
+    PointContext ctx(RawPtBufPtr(new UserBuf()));
+
+    reader.prepare(ctx);
+    reader.execute(ctx);
+}
+
diff --git a/test/unit/PointTableTest.cpp b/test/unit/PointTableTest.cpp
new file mode 100644
index 0000000..446a522
--- /dev/null
+++ b/test/unit/PointTableTest.cpp
@@ -0,0 +1,178 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointTable.hpp>
+#include <las/LasReader.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(PointTable, resolveType)
+{
+    using namespace Dimension;
+
+    PointTable table;
+    PointLayoutPtr layout(table.layout());
+
+    // Start with a default-defined dimension.
+    layout->registerDim(Id::X);
+    EXPECT_EQ(layout->dimSize(Id::X), 8u);
+    EXPECT_EQ(layout->dimType(Id::X), Type::Double);
+
+    layout->registerDim(Id::X, Type::Signed32);
+    EXPECT_EQ(layout->dimSize(Id::X), 8u);
+    EXPECT_EQ(layout->dimType(Id::X), Type::Double);
+
+    layout->registerDim(Dimension::Id::X, Type::Unsigned8);
+    EXPECT_EQ(layout->dimSize(Id::X), 8u);
+    EXPECT_EQ(layout->dimType(Id::X), Type::Double);
+
+    /// Build as we go.
+    layout->registerDim(Id::Y, Type::Unsigned8);
+    EXPECT_EQ(layout->dimSize(Id::Y), 1u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Unsigned8);
+
+    layout->registerDim(Id::Y, Type::Unsigned8);
+    EXPECT_EQ(layout->dimSize(Id::Y), 1u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Unsigned8);
+
+    layout->registerDim(Id::Y, Type::Signed8);
+    // Signed 8 and Unsigned 8 should yeild signed 16.
+    EXPECT_EQ(layout->dimSize(Id::Y), 2u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Signed16);
+
+    layout->registerDim(Id::Y, Type::Signed16);
+    EXPECT_EQ(layout->dimSize(Id::Y), 2u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Signed16);
+
+    layout->registerDim(Id::Y, Type::Float);
+    EXPECT_EQ(layout->dimSize(Id::Y), 4u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Float);
+
+    layout->registerDim(Id::Y, Type::Double);
+    EXPECT_EQ(layout->dimSize(Id::Y), 8u);
+    EXPECT_EQ(layout->dimType(Id::Y), Type::Double);
+
+    ///
+    layout->registerDim(Id::Z, Type::Unsigned16);
+    EXPECT_EQ(layout->dimSize(Id::Z), 2u);
+    EXPECT_EQ(layout->dimType(Id::Z), Type::Unsigned16);
+
+    layout->registerDim(Id::Z, Type::Signed8);
+    EXPECT_EQ(layout->dimSize(Id::Z), 4u);
+    EXPECT_EQ(layout->dimType(Id::Z), Type::Signed32);
+
+    layout->registerDim(Id::Z, Type::Signed16);
+    EXPECT_EQ(layout->dimSize(Id::Z), 4u);
+    EXPECT_EQ(layout->dimType(Id::Z), Type::Signed32);
+
+    layout->registerDim(Id::Z, Type::Double);
+    EXPECT_EQ(layout->dimSize(Id::Z), 8u);
+    EXPECT_EQ(layout->dimType(Id::Z), Type::Double);
+}
+
+TEST(PointTable, userView)
+{
+    class UserTable : public PointTable
+    {
+    private:
+        double m_x;
+        double m_y;
+        double m_z;
+
+    public:
+        PointId addPoint()
+            { return 0; }
+        char *getPoint(PointId idx)
+            { return NULL; }
+        void setField(const Dimension::Detail *d, PointId idx, const void *value)
+        {
+            if (d->id() == Dimension::Id::X)
+               m_x = *(const double *)value;
+            else if (d->id() == Dimension::Id::Y)
+               m_y = *(const double *)value;
+            else if (d->id() == Dimension::Id::Z)
+               m_z = *(const double *)value;
+        }
+        void getField(const Dimension::Detail *d, PointId idx, void *value)
+        {
+            if (d->id() == Dimension::Id::X)
+               *(double *)value = m_x;
+            else if (d->id() == Dimension::Id::Y)
+               *(double *)value = m_y;
+            else if (d->id() == Dimension::Id::Z)
+               *(double *)value = m_z;
+        }
+    };
+
+    LasReader reader;
+
+    Options opts;
+    opts.add("filename", Support::datapath("las/simple.las"));
+    opts.add("count", 100);
+
+    reader.setOptions(opts);
+
+    PointTable defTable;
+    reader.prepare(defTable);
+    PointViewSet viewSet = reader.execute(defTable);
+    PointViewPtr defView = *viewSet.begin();
+
+    bool called(false);
+    auto readCb = [defView, &called](PointView& customView, PointId id)
+    {
+        called = true;
+        double xDef = defView->getFieldAs<double>(Dimension::Id::X, id);
+        double yDef = defView->getFieldAs<double>(Dimension::Id::Y, id);
+        double zDef = defView->getFieldAs<double>(Dimension::Id::Z, id);
+
+        double x = customView.getFieldAs<double>(Dimension::Id::X, id);
+        double y = customView.getFieldAs<double>(Dimension::Id::Y, id);
+        double z = customView.getFieldAs<double>(Dimension::Id::Z, id);
+
+        EXPECT_FLOAT_EQ(xDef, x);
+        EXPECT_FLOAT_EQ(yDef, y);
+        EXPECT_FLOAT_EQ(zDef, z);
+    };
+
+    reader.setReadCb(readCb);
+    UserTable table;
+
+    reader.prepare(table);
+    reader.execute(table);
+    EXPECT_TRUE(called);
+}
+
diff --git a/test/unit/PointViewTest.cpp b/test/unit/PointViewTest.cpp
new file mode 100644
index 0000000..ce62a3c
--- /dev/null
+++ b/test/unit/PointViewTest.cpp
@@ -0,0 +1,448 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, view, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <random>
+
+#include <boost/property_tree/xml_parser.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/PointViewIter.hpp>
+#include <pdal/PDALUtils.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+PointViewPtr makeTestView(PointTableRef table, point_count_t cnt = 17)
+{
+    PointLayoutPtr layout(table.layout());
+
+    layout->registerDim(Dimension::Id::Classification);
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+
+    PointViewPtr view(new PointView(table));
+
+    // write the data into the view
+    for (PointId i = 0; i < cnt; i++)
+    {
+        const uint8_t x = (uint8_t)(i + 1);
+        const int32_t y = i * 10;
+        const double z = i * 100;
+
+        view->setField(Dimension::Id::Classification, i, x);
+        view->setField(Dimension::Id::X, i, y);
+        view->setField(Dimension::Id::Y, i, z);
+    }
+    EXPECT_EQ(view->size(), cnt);
+    return view;
+}
+
+
+void verifyTestView(const PointView& view, point_count_t cnt = 17)
+{
+    // read the view back out
+    for (PointId i = 0; i < cnt; i++)
+    {
+        uint8_t x = view.getFieldAs<uint8_t>(
+            Dimension::Id::Classification, i);
+        int32_t y = view.getFieldAs<uint32_t>(Dimension::Id::X, i);
+        double z = view.getFieldAs<double>(Dimension::Id::Y, i);
+
+        EXPECT_EQ(x, (uint8_t)(i + 1));
+        EXPECT_EQ(y, (int32_t)(i * 10));
+        EXPECT_TRUE(Utils::compare_approx(z, static_cast<double>(i) * 100.0,
+            (std::numeric_limits<double>::min)()));
+    }
+}
+
+TEST(PointViewTest, getSet)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table, 1);
+    verifyTestView(*view.get(), 1);
+}
+
+TEST(PointViewTest, getAsUint8)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    // read the view back out
+    for (int i = 0; i < 3; i++)
+    {
+        uint8_t x = view->getFieldAs<uint8_t>(Dimension::Id::Classification, i);
+        uint8_t y = view->getFieldAs<uint8_t>(Dimension::Id::X, i);
+        uint8_t z = view->getFieldAs<uint8_t>(Dimension::Id::Y, i);
+
+        EXPECT_EQ(x, i + 1u);
+        EXPECT_EQ(y, i * 10u);
+        EXPECT_EQ(z, i * 100u);
+    }
+
+    // read the view back out
+    for (int i = 3; i < 17; i++)
+    {
+        uint8_t x = view->getFieldAs<uint8_t>(Dimension::Id::Classification, i);
+        uint8_t y = view->getFieldAs<uint8_t>(Dimension::Id::X, i);
+        EXPECT_THROW(view->getFieldAs<uint8_t>(Dimension::Id::Y, i),
+            pdal_error);
+        EXPECT_EQ(x, i + 1u);
+        EXPECT_EQ(y, i * 10u);
+    }
+}
+
+TEST(PointViewTest, getAsInt32)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    // read the view back out
+    for (int i = 0; i < 17; i++)
+    {
+        int32_t x = view->getFieldAs<int32_t>(Dimension::Id::Classification, i);
+        int32_t y = view->getFieldAs<int32_t>(Dimension::Id::X, i);
+        int32_t z = view->getFieldAs<int32_t>(Dimension::Id::Y, i);
+
+        EXPECT_EQ(x, i + 1);
+        EXPECT_EQ(y, i * 10);
+        EXPECT_EQ(z, i * 100);
+    }
+}
+
+
+TEST(PointViewTest, getFloat)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    // read the view back out
+    for (int i = 0; i < 17; i++)
+    {
+        float x = view->getFieldAs<float>(Dimension::Id::Classification, i);
+        float y = view->getFieldAs<float>(Dimension::Id::X, i);
+        float z = view->getFieldAs<float>(Dimension::Id::Y, i);
+
+        EXPECT_FLOAT_EQ(x, i + 1.0f);
+        EXPECT_FLOAT_EQ(y, i * 10.0f);
+        EXPECT_FLOAT_EQ(z, i * 100.0f);
+    }
+}
+
+
+TEST(PointViewTest, copy)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    PointView d2(*view);
+
+    // read the view back out
+    {
+        EXPECT_EQ(
+            d2.getFieldAs<uint8_t>(Dimension::Id::Classification, 0),
+            view->getFieldAs<uint8_t>(Dimension::Id::Classification, 0));
+        EXPECT_EQ(d2.getFieldAs<int32_t>(Dimension::Id::X, 0),
+            view->getFieldAs<int32_t>(Dimension::Id::X, 0));
+        EXPECT_FLOAT_EQ(d2.getFieldAs<double>(Dimension::Id::Y, 0),
+            view->getFieldAs<double>(Dimension::Id::Y, 0));
+    }
+
+    for (int i = 1; i < 17; i++)
+    {
+        uint8_t x = d2.getFieldAs<uint8_t>(Dimension::Id::Classification, i);
+        int32_t y = d2.getFieldAs<int32_t>(Dimension::Id::X, i);
+        double z = d2.getFieldAs<double>(Dimension::Id::Y, i);
+
+        EXPECT_EQ(x, i + 1u);
+        EXPECT_EQ(y, i * 10);
+        EXPECT_TRUE(Utils::compare_approx(z, i * 100.0,
+            (std::numeric_limits<double>::min)()));
+    }
+    EXPECT_EQ(view->size(), d2.size());
+
+}
+
+TEST(PointViewTest, copyCtor)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    PointView d2(*view);
+    verifyTestView(d2);
+}
+
+TEST(PointViewTest, assignment)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table);
+
+    PointView d2 = *view;
+    verifyTestView(d2);
+}
+
+
+TEST(PointViewTest, metaview)
+{
+    PointTable table;
+    PointViewPtr view = makeTestView(table, 2);
+
+    std::stringstream ss1(std::stringstream::in | std::stringstream::out);
+    MetadataNode tree = Utils::toMetadata(view);
+
+    std::ifstream str1(Support::datapath("pointbuffer/metaview.txt"));
+    std::istringstream str2(Utils::toJSON(tree));
+    //EXPECT_TRUE(Support::compare_text_files(str1, str2));
+}
+
+
+TEST(PointViewTest, bigfile)
+{
+    PointTable table;
+
+    point_count_t NUM_PTS = 1000000;
+
+    PointLayoutPtr layout(table.layout());
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+
+    PointView view(table);
+
+    for (PointId id = 0; id < NUM_PTS; ++id)
+    {
+        view.setField(Dimension::Id::X, id, id);
+        view.setField(Dimension::Id::Y, id, 2 * id);
+        view.setField(Dimension::Id::Z, id, -(int)id);
+    }
+
+    for (PointId id = 0; id < NUM_PTS; ++id)
+    {
+        EXPECT_EQ(
+            view.getFieldAs<PointId>(Dimension::Id::X, id), id);
+        EXPECT_EQ(
+            view.getFieldAs<PointId>(Dimension::Id::Y, id), id * 2);
+        EXPECT_EQ(
+            view.getFieldAs<int>(Dimension::Id::Z, id), -(int)id);
+    }
+
+    // Test some random access.
+    std::unique_ptr<PointId[]> ids(new PointId[NUM_PTS]);
+    for (PointId idx = 0; idx < NUM_PTS; ++idx)
+        ids[idx] = idx;
+    // Do a bunch of random swaps.
+    std::default_random_engine generator;
+    std::uniform_int_distribution<PointId> distribution(0, NUM_PTS-1);
+    for (PointId idx = 0; idx < NUM_PTS; ++idx)
+    {
+        PointId y = distribution(generator);
+        PointId temp = std::move(ids[idx]);
+        ids[idx] = std::move(ids[y]);
+        ids[y] = std::move(temp);
+    }
+
+    for (PointId idx = 0; idx < NUM_PTS; ++idx)
+    {
+        PointId id = ids[idx];
+        view.setField(Dimension::Id::X, id, idx);
+        view.setField(Dimension::Id::Y, id, 2 * idx);
+        view.setField(Dimension::Id::Z, id, -(int)idx);
+    }
+
+    for (PointId idx = 0; idx < NUM_PTS; ++idx)
+    {
+        PointId id = ids[idx];
+        EXPECT_EQ(
+            view.getFieldAs<PointId>(Dimension::Id::X, id), idx);
+        EXPECT_EQ(
+            view.getFieldAs<PointId>(Dimension::Id::Y, id), idx * 2);
+        EXPECT_EQ(
+            view.getFieldAs<int>(Dimension::Id::Z, id), -(int)idx);
+    }
+}
+
+
+//ABELL - Move to KdIndex
+/**
+TEST(PointViewTest, kdindex)
+{
+    LasReader reader(Support::viewpath("1.2-with-color.las"));
+    reader.prepare();
+
+    const Schema& schema = reader.getSchema();
+    uint32_t capacity(1000);
+    PointView view(schema, capacity);
+
+    StageSequentialIterator* iter = reader.createSequentialIterator(view);
+
+    {
+        uint32_t numRead = iter->read(view);
+        EXPECT_EQ(numRead, capacity);
+    }
+
+    EXPECT_EQ(view.getCapacity(), capacity);
+    EXPECT_EQ(view.getSchema(), schema);
+
+
+    IndexedPointView iview(view);
+    EXPECT_EQ(iview.getCapacity(), capacity);
+    EXPECT_EQ(iview.getSchema(), schema);
+
+    iview.build();
+
+    unsigned k = 8;
+
+    // If the query distance is 0, just return the k nearest neighbors
+    std::vector<size_t> ids = idata.neighbors(636199, 849238, 428.05, k);
+    EXPECT_EQ(ids.size(), k);
+    EXPECT_EQ(ids[0], 8u);
+    EXPECT_EQ(ids[1], 7u);
+    EXPECT_EQ(ids[2], 9u);
+    EXPECT_EQ(ids[3], 42u);
+    EXPECT_EQ(ids[4], 40u);
+
+    std::vector<size_t> dist_ids = idata.neighbors(636199, 849238, 428.05, 3);
+
+    EXPECT_EQ(dist_ids.size(), 3u);
+    EXPECT_EQ(dist_ids[0], 8u);
+
+    std::vector<size_t> nids = idata.neighbors(636199, 849238, 428.05, k);
+
+    EXPECT_EQ(nids.size(), k);
+    EXPECT_EQ(nids[0], 8u);
+    EXPECT_EQ(nids[1], 7u);
+    EXPECT_EQ(nids[2], 9u);
+    EXPECT_EQ(nids[3], 42u);
+    EXPECT_EQ(nids[4], 40u);
+
+    std::vector<size_t> rids = iview.radius(637012.24, 849028.31,
+        431.66, 100000);
+    EXPECT_EQ(rids.size(), 11u);
+
+    delete iter;
+}
+**/
+
+
+static void check_bounds(const BOX3D& box,
+                         double minx, double maxx,
+                         double miny, double maxy,
+                         double minz, double maxz)
+{
+    EXPECT_FLOAT_EQ(box.minx, minx);
+    EXPECT_FLOAT_EQ(box.maxx, maxx);
+    EXPECT_FLOAT_EQ(box.miny, miny);
+    EXPECT_FLOAT_EQ(box.maxy, maxy);
+    EXPECT_FLOAT_EQ(box.minz, minz);
+    EXPECT_FLOAT_EQ(box.maxz, maxz);
+}
+
+
+TEST(PointViewTest, calcBounds)
+{
+    auto set_points = [](PointViewPtr view, PointId i, double x, double y,
+        double z)
+    {
+        view->setField(Dimension::Id::X, i, x);
+        view->setField(Dimension::Id::Y, i, y);
+        view->setField(Dimension::Id::Z, i, z);
+    };
+
+    PointTable table;
+    PointLayoutPtr layout(table.layout());
+
+    layout->registerDim(Dimension::Id::X);
+    layout->registerDim(Dimension::Id::Y);
+    layout->registerDim(Dimension::Id::Z);
+
+    const double lim_min = (std::numeric_limits<double>::lowest)();
+    const double lim_max = (std::numeric_limits<double>::max)();
+    PointViewPtr b0(new PointView(table));
+    BOX3D box_b0;
+    b0->calculateBounds(box_b0);
+    check_bounds(box_b0, lim_max, lim_min, lim_max, lim_min, lim_max, lim_min);
+
+    PointViewPtr b1(new PointView(table));
+    set_points(b1, 0, 0.0, 0.0, 0.0);
+    set_points(b1, 1, 2.0, 2.0, 2.0);
+
+    PointViewPtr b2(new PointView(table));
+    set_points(b2, 0, 3.0, 3.0, 3.0);
+    set_points(b2, 1, 1.0, 1.0, 1.0);
+
+    PointViewSet bs;
+    bs.insert(b1);
+    bs.insert(b2);
+
+    BOX3D box_b1;
+    b1->calculateBounds(box_b1);
+    check_bounds(box_b1, 0.0, 2.0, 0.0, 2.0, 0.0, 2.0);
+
+    BOX3D box_b2;
+    b2->calculateBounds(box_b2);
+    check_bounds(box_b2, 1.0, 3.0, 1.0, 3.0, 1.0, 3.0);
+
+    BOX3D box_bs;
+    PointView::calculateBounds(bs, box_bs);
+    check_bounds(box_bs, 0.0, 3.0, 0.0, 3.0, 0.0, 3.0);
+}
+
+TEST(PointViewTest, order)
+{
+    PointTable table;
+
+    const size_t COUNT(1000);
+    std::array<PointViewPtr, COUNT> views;
+
+    std::random_device dev;
+    std::mt19937 generator(dev());
+   
+    for (size_t i = 0; i < COUNT; ++i)
+        views[i] = PointViewPtr(new PointView(table));
+    std::shuffle(views.begin(), views.end(), generator);
+
+    PointViewSet set;
+    for (size_t i = 0; i < COUNT; ++i)
+        set.insert(views[i]);
+
+    PointViewSet::iterator pi;
+    for (auto si = set.begin(); si != set.end(); ++si)
+    {
+        if (si != set.begin())
+           EXPECT_TRUE((*pi)->id() < (*si)->id());
+        pi = si;
+    }
+}
diff --git a/test/unit/SpatialReferenceTest.cpp b/test/unit/SpatialReferenceTest.cpp
new file mode 100644
index 0000000..138c549
--- /dev/null
+++ b/test/unit/SpatialReferenceTest.cpp
@@ -0,0 +1,334 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/SpatialReference.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <LasWriter.hpp>
+#include <LasReader.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(SpatialReferenceTest, test_env_vars)
+{
+
+#ifdef _MSC_VER
+    const char* gdal_data = getenv("GDAL_DATA");
+    const char* proj_lib = getenv("PROJ_LIB");
+
+    EXPECT_TRUE(FileUtils::fileExists(gdal_data));
+    EXPECT_TRUE(FileUtils::fileExists(proj_lib));
+#endif
+}
+
+
+TEST(SpatialReferenceTest, test_ctor)
+{
+    SpatialReference srs;
+
+    EXPECT_TRUE(srs.getProj4() == "");
+    EXPECT_TRUE(srs.getWKT() == "");
+    EXPECT_TRUE(srs.empty());
+}
+
+
+// Test round-tripping proj.4 string
+TEST(SpatialReferenceTest, test_proj4_roundtrip)
+{
+    std::string proj4 = "+proj=utm +zone=15 +datum=WGS84 +units=m +no_defs";
+    std::string proj4_ellps =
+        "+proj=utm +zone=15 +ellps=WGS84 +datum=WGS84 +units=m +no_defs";
+    std::string proj4_out =
+        "+proj=utm +zone=15 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m "
+        "+no_defs";
+
+    {
+        SpatialReference ref;
+        ref.setProj4(proj4);
+        EXPECT_TRUE(!ref.empty());
+        const std::string ret = ref.getProj4();
+        EXPECT_TRUE(ret == proj4_out);
+    }
+
+    {
+        SpatialReference ref;
+        ref.setProj4(proj4_ellps);
+        const std::string ret = ref.getProj4();
+        //EXPECT_TRUE(ret == proj4);
+        EXPECT_TRUE(ret == proj4_out);
+    }
+
+    {
+        SpatialReference ref;
+        ref.setProj4(proj4_out);
+        const std::string ret = ref.getProj4();
+        EXPECT_TRUE(ret == proj4_out);
+    }
+}
+
+
+// Test setting EPSG:4326 from User string
+TEST(SpatialReferenceTest, test_userstring_roundtrip)
+{
+    SpatialReference ref;
+
+    std::string code = "EPSG:4326";
+    std::string proj4 = "+proj=longlat +datum=WGS84 +no_defs";
+    std::string proj4_ellps =
+        "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs";
+    const std::string wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
+    ref.setFromUserInput(code);
+
+    std::string ret_proj = ref.getProj4();
+    std::string ret_wkt = ref.getWKT();
+
+    EXPECT_TRUE(ret_proj == proj4);
+    EXPECT_TRUE(ret_wkt == wkt);
+}
+
+
+// Test fetching UTM zone
+TEST(SpatialReferenceTest, test_get_utmzone)
+{
+    SpatialReference ref;
+
+    // from test/data/autzen-srs.wkt
+    std::string code = "+proj=lcc +lat_1=43 +lat_2=45.5 +lat_0=41.75 +lon_0=-120.5 +x_0=399999.9999999999 +y_0=0 +ellps=GRS80 +units=ft +no_defs";
+    ref.setFromUserInput(code);
+
+    BOX3D box(635589.01, 848886.45, 638994.75, 853535.43, 0, 0);
+
+    int zone = ref.computeUTMZone(box);
+
+    EXPECT_EQ(zone, 10);
+}
+
+
+TEST(SpatialReferenceTest, calcZone)
+{
+    int zone = 1;
+    for (double lon = -537.0; lon < 537.0; lon += 6.0)
+    {   
+       EXPECT_EQ(zone, SpatialReference::calculateZone(lon, 25));
+       EXPECT_EQ(-zone, SpatialReference::calculateZone(lon, -25));
+       zone++;
+       if (zone > 60)
+           zone = 1;
+    }
+    EXPECT_EQ(32, SpatialReference::calculateZone(5, 60));
+    EXPECT_EQ(31, SpatialReference::calculateZone(5, 80));
+    EXPECT_EQ(33, SpatialReference::calculateZone(10, 80));
+    EXPECT_EQ(35, SpatialReference::calculateZone(25, 80));
+    EXPECT_EQ(37, SpatialReference::calculateZone(40, 80));
+}
+
+
+#if defined(PDAL_HAVE_GEOS) && defined(PDAL_HAVE_LIBGEOTIFF)
+// Test fetching SRS from an existing file
+TEST(SpatialReferenceTest, test_read_srs)
+{
+    PointTable table;
+
+    Options ops;
+    ops.add("filename", Support::datapath("las/utm17.las"));
+    LasReader reader;
+    reader.setOptions(ops);
+    reader.prepare(table);
+    reader.execute(table);
+
+    const SpatialReference& ref = reader.getSpatialReference();
+
+    const std::string ret_wkt = ref.getWKT();
+    const std::string ret_proj4 = ref.getProj4();
+
+    const std::string wkt = "PROJCS[\"WGS 84 / UTM zone 17N\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Transverse_Mercator\"],PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",-81],PARAMETER[\"scale_factor\",0.9996],PARAMETER[\"false_easting\",500000],PARAMETER[\"false_nort [...]
+
+    EXPECT_TRUE(ret_wkt == wkt);
+
+    std::string proj4 = "+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs";
+    EXPECT_TRUE(ret_proj4 == proj4);
+}
+#endif
+
+
+//NOTE - The source file uses Geotiff spatial reference, so this only
+//  works if we have the necessary library.
+#ifdef PDAL_HAVE_LIBGEOTIFF
+
+// Try writing a compound coordinate system to file and ensure we get back
+// WKT with the geoidgrids (from the WKT VLR).
+TEST(SpatialReferenceTest, test_vertical_datums)
+{
+    std::string tmpfile(Support::temppath("tmp_srs.las"));
+    FileUtils::deleteFile(tmpfile);
+
+    const std::string wkt = "COMPD_CS[\"WGS 84 + VERT_CS\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003con [...]
+
+    SpatialReference ref;
+    ref.setFromUserInput(wkt);
+    const std::string wktCheck = ref.getWKT(SpatialReference::eCompoundOK);
+    EXPECT_TRUE(wkt == wktCheck); // just to make sure
+
+    PointTable table;
+    // Write a very simple file with our SRS and one point.
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las"));
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    // need to scope the writer, so that's it dtor can use the stream
+    Options opts;
+    opts.add("filename", tmpfile);
+
+    LasWriter writer;
+    writer.setOptions(opts);
+    writer.setInput(reader);
+    writer.setSpatialReference(ref);
+    writer.prepare(table);
+    writer.execute(table);
+    SpatialReference sr = writer.getSpatialReference();
+
+    // Reopen and check contents.
+    PointTable table2;
+    LasReader reader2;
+    reader2.setOptions(opts);
+    reader2.prepare(table2);
+    reader2.execute(table2);
+
+    const SpatialReference ref2 = reader2.getSpatialReference();
+    const std::string wkt2 = ref2.getWKT(SpatialReference::eCompoundOK);
+
+    EXPECT_TRUE(wkt == wkt2);
+
+    // Cleanup
+    FileUtils::deleteFile(tmpfile);
+}
+#endif //PDAL_HAVE_LIBGEOTIFF
+
+
+#if defined(PDAL_HAVE_GEOS) && defined(PDAL_HAVE_LIBGEOTIFF)
+// Try writing only the WKT VLR to a file, and see if the resulting
+// file still works ok.
+TEST(SpatialReferenceTest, test_writing_vlr)
+{
+    std::string tmpfile(Support::temppath("tmp_srs_9.las"));
+    SpatialReference ref;
+
+    const std::string reference_wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
+
+    ref.setFromUserInput("EPSG:4326");
+    std::string wkt = ref.getWKT();
+    EXPECT_TRUE(wkt == reference_wkt);
+
+    // Write a very simple file with our SRS and one point.
+    {
+        FileUtils::deleteFile(tmpfile);
+
+        PointTable table;
+        LasReader readerx;
+        Options readerOpts;
+
+        readerOpts.add("filename",
+            ::Support::datapath("las/1.2-with-color.las"));
+        readerx.setOptions(readerOpts);
+
+        Options writerOpts;
+        LasWriter writer;
+
+        writerOpts.add("filename", tmpfile);
+        writer.setOptions(writerOpts);
+        writer.setInput(readerx);
+        writer.prepare(table);
+        writer.setSpatialReference(ref);
+        writer.execute(table);
+    }
+
+    // Reopen and check contents.
+    {
+        PointTable table;
+        Options ops;
+        ops.add("filename", tmpfile);
+        LasReader reader;
+        reader.setOptions(ops);
+        reader.prepare(table);
+        reader.execute(table);
+
+        SpatialReference result_ref = reader.getSpatialReference();
+
+        EXPECT_EQ(reader.header().vlrCount(), 5u);
+        std::string wkt = result_ref.getWKT();
+        EXPECT_EQ(wkt, reference_wkt);
+    }
+
+    // Cleanup
+    FileUtils::deleteFile(tmpfile);
+}
+#endif
+
+
+TEST(SpatialReferenceTest, test_io)
+{
+    const std::string wkt = "COMPD_CS[\"WGS 84 + VERT_CS\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003con [...]
+
+    SpatialReference ref;
+    ref.setFromUserInput(wkt);
+
+    std::stringstream ss(std::stringstream::in | std::stringstream::out);
+
+    ss << ref;
+
+    SpatialReference ref2;
+    ss >> ref2;
+
+    EXPECT_TRUE(ref == ref2);
+}
+
+TEST(SpatialReferenceTest, test_vertical_and_horizontal)
+{
+
+    const std::string wkt = "COMPD_CS[\"WGS 84 + VERT_CS\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003con [...]
+    SpatialReference srs(wkt);
+
+    std::string horiz = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]]";
+    std::string vert = "VERT_CS[\"NAVD88 height\",VERT_DATUM[\"North American Vertical Datum 1988\",2005,AUTHORITY[\"EPSG\",\"5103\"],EXTENSION[\"PROJ4_GRIDS\",\"g2003conus.gtx\"]],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"Up\",UP],AUTHORITY[\"EPSG\",\"5703\"]]";
+    std::string horizontal = srs.getHorizontal();
+    std::string vertical = srs.getVertical();
+
+    EXPECT_EQ(horiz, horizontal);
+    EXPECT_EQ(vert, vertical);
+
+}
diff --git a/test/unit/Support.cpp b/test/unit/Support.cpp
new file mode 100644
index 0000000..349c110
--- /dev/null
+++ b/test/unit/Support.cpp
@@ -0,0 +1,363 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "gtest/gtest.h"
+
+#include "Support.hpp"
+
+#include <iostream>
+#include <string>
+
+#include <stdio.h>
+
+#include <boost/filesystem.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/Stage.hpp>
+#include "TestConfig.hpp"
+
+using namespace pdal;
+using namespace std;
+
+string Support::datapath()
+{
+    return TestConfig::g_data_path;
+}
+
+std::string Support::datapath(const std::string& file)
+{
+    return datapath() + file;
+}
+
+string Support::configuredpath()
+{
+    return TestConfig::g_configured_path;
+}
+
+std::string Support::configuredpath(const std::string& file)
+{
+    return configuredpath() + file;
+}
+
+std::string Support::temppath()
+{
+    return TestConfig::g_data_path + "../temp/";
+}
+
+std::string Support::temppath(const std::string& file)
+{
+    return temppath() + file;
+}
+
+std::string Support::binpath()
+{
+    std::string binpath = TestConfig::g_binary_path;
+
+#ifdef PDAL_APP_BUNDLE
+    return binpath + "/pdal.app/Contents/MacOS/";
+#else
+    return binpath;
+#endif
+}
+
+std::string Support::binpath(const std::string& file)
+{
+    return binpath() + file;
+}
+
+std::string Support::exename(const std::string& name)
+{
+#ifdef _WIN32
+    return name + ".exe";
+#else
+    return name;
+#endif
+}
+
+
+// do a comparison by line of two (text) files, ignoring CRLF differences
+uint32_t Support::diff_text_files(const std::string& file1,
+    const std::string& file2, int32_t ignoreLine1)
+{
+    if (!pdal::FileUtils::fileExists(file1) ||
+            !pdal::FileUtils::fileExists(file2))
+        return (std::numeric_limits<uint32_t>::max)();
+
+    std::istream* str1 = pdal::FileUtils::openFile(file1, false);
+    std::istream* str2 = pdal::FileUtils::openFile(file2, false);
+
+    int32_t diffs = diff_text_files(*str1, *str2, ignoreLine1);
+
+    pdal::FileUtils::closeFile(str1);
+    pdal::FileUtils::closeFile(str2);
+    return diffs;
+}
+
+uint32_t Support::diff_text_files(std::istream& str1, std::istream& str2,
+    int32_t ignoreLine1)
+{
+    uint32_t numdiffs = 0;
+    int32_t currLine = 1;
+
+    while (!str1.eof() && !str2.eof())
+    {
+        std::string buf1;
+        std::string buf2;
+        std::getline(str1, buf1);
+        std::getline(str2, buf2);
+
+        if (currLine == ignoreLine1)
+        {
+            ++currLine;
+            continue;
+        }
+
+        if (str1.eof() && str2.eof())
+        {
+            // hit end on both together
+            break;
+        }
+        else if (str1.eof() && !str2.eof())
+        {
+            // str1 ended, but str2 still going
+            while (!str2.eof())
+            {
+                std::getline(str2, buf2);
+                ++numdiffs;
+            }
+            break;
+        }
+        else if (!str1.eof() && str2.eof())
+        {
+            // str2 ended, but str1 still going
+            while (!str1.eof())
+            {
+                std::getline(str1, buf1);
+                ++numdiffs;
+            }
+            break;
+        }
+
+        if (buf1 != buf2)
+            ++numdiffs;
+
+        ++currLine;
+    }
+
+    assert(str1.eof());
+    assert(str2.eof());
+
+    return numdiffs;
+}
+
+
+uint32_t Support::diff_files(const std::string& file1,
+    const std::string& file2, uint32_t ignorable_start,
+    uint32_t ignorable_length)
+{
+    uint32_t start[] = { ignorable_start };
+    uint32_t len[] = { ignorable_length };
+    return diff_files(file1, file2, start, len, 1);
+}
+
+
+// do a byte-wise comparison of two (binary) files
+uint32_t Support::diff_files(const std::string& file1,
+    const std::string& file2, uint32_t* ignorable_start,
+    uint32_t* ignorable_length, uint32_t num_ignorables)
+{
+    if (!pdal::FileUtils::fileExists(file1) ||
+            !pdal::FileUtils::fileExists(file2))
+        return (std::numeric_limits<uint32_t>::max)();
+
+    std::istream* str1 = pdal::FileUtils::openFile(file1);
+    std::istream* str2 = pdal::FileUtils::openFile(file2);
+
+    return diff_files(*str1, *str2, ignorable_start, ignorable_length,
+        num_ignorables);
+}
+
+
+uint32_t Support::diff_files(std::istream& str1, std::istream& str2,
+    uint32_t* ignorable_start, uint32_t* ignorable_length,
+    uint32_t num_ignorables)
+{
+    uint32_t numdiffs = 0;
+    char p, q;
+
+    for (uint32_t i = 0; ; ++i)
+    {
+        str1.get(p);
+        str2.get(q);
+        if (!str1 || !str2)
+        {
+            if (!str1 != !str2)
+                numdiffs++;
+            break;
+        }
+        if (p == q)
+            continue;
+
+        if (num_ignorables == 0)
+            ++numdiffs;
+        else
+        {
+            // only count the difference if we are NOT in an ignorable
+            // region
+            bool is_ignorable = false;
+            for (uint32_t region = 0; region < num_ignorables; region++)
+            {
+                uint32_t start = ignorable_start[region];
+                uint32_t end = start + ignorable_length[region];
+                if (i >= start && i < end)
+                {
+                    // we are in an ignorable region!
+                    is_ignorable = true;
+                    break;
+                }
+            }
+            if (!is_ignorable)
+                ++numdiffs;
+        }
+    }
+    return numdiffs;
+}
+
+
+uint32_t Support::diff_files(const std::string& file1,
+    const std::string& file2)
+{
+    return diff_files(file1, file2, NULL, NULL, 0);
+}
+
+uint32_t Support::diff_files(std::istream& str1, std::istream& str2)
+{
+    return diff_files(str1, str2, NULL, NULL, 0);
+}
+
+bool Support::compare_files(const std::string& file1, const std::string& file2)
+{
+    return diff_files(file1, file2) == 0;
+}
+
+bool Support::compare_text_files(const std::string& file1,
+    const std::string& file2)
+{
+    return diff_text_files(file1, file2) == 0;
+}
+
+bool Support::compare_text_files(std::istream& str1, std::istream& str2)
+{
+    return diff_text_files(str1, str2) == 0;
+}
+
+void Support::check_pN(const pdal::PointView& data, PointId index,
+    double xref, double yref, double zref)
+{
+    double x0 = data.getFieldAs<double>(Dimension::Id::X, index);
+    double y0 = data.getFieldAs<double>(Dimension::Id::Y, index);
+    double z0 = data.getFieldAs<double>(Dimension::Id::Z, index);
+
+    EXPECT_FLOAT_EQ(x0, xref);
+    EXPECT_FLOAT_EQ(y0, yref);
+    EXPECT_FLOAT_EQ(z0, zref);
+}
+
+
+void Support::check_pN(const PointView& data, PointId index,
+    double xref, double yref, double zref, double tref,
+    uint16_t rref, uint16_t gref, uint16_t bref)
+{
+    check_pN(data, index, xref, yref, zref);
+
+    if (data.hasDim(Dimension::Id::GpsTime))
+    {
+        double t0 = data.getFieldAs<double>(Dimension::Id::GpsTime, index);
+        EXPECT_FLOAT_EQ(t0, tref);
+    }
+
+    if (data.hasDim(Dimension::Id::Red))
+    {
+        uint16_t r0 = data.getFieldAs<uint16_t>(Dimension::Id::Red, index);
+        uint16_t g0 = data.getFieldAs<uint16_t>(Dimension::Id::Green, index);
+        uint16_t b0 = data.getFieldAs<uint16_t>(Dimension::Id::Blue, index);
+        EXPECT_EQ(r0, rref);
+        EXPECT_EQ(g0, gref);
+        EXPECT_EQ(b0, bref);
+    }
+}
+
+
+void Support::check_p0_p1_p2(const pdal::PointView& data)
+{
+    Support::check_pN(data, 0, 637012.240000, 849028.310000, 431.660000);
+    Support::check_pN(data, 1, 636896.330000, 849087.700000, 446.390000);
+    Support::check_pN(data, 2, 636784.740000, 849106.660000, 426.710000);
+}
+
+
+void Support::check_p100_p101_p102(const pdal::PointView& data)
+{
+    Support::check_pN(data, 0, 636661.060000, 849854.130000, 424.900000);
+    Support::check_pN(data, 1, 636568.180000, 850179.490000, 441.800000);
+    Support::check_pN(data, 2, 636554.630000, 850040.030000, 499.110000);
+}
+
+
+void Support::check_p355_p356_p357(const pdal::PointView& data)
+{
+    Support::check_pN(data, 0, 636462.600000, 850566.110000, 432.610000);
+    Support::check_pN(data, 1, 636356.140000, 850530.480000, 432.680000);
+    Support::check_pN(data, 2, 636227.530000, 850592.060000, 428.670000);
+}
+
+
+void Support::check_p710_p711_p712(const pdal::PointView& data)
+{
+    Support::check_pN(data, 0, 638720.670000, 850926.640000, 417.320000);
+    Support::check_pN(data, 1, 638672.380000, 851081.660000, 420.670000);
+    Support::check_pN(data, 2, 638598.880000, 851445.370000, 422.150000);
+}
+
+
+void Support::compareBounds(const BOX3D& p, const BOX3D& q)
+{
+    EXPECT_FLOAT_EQ(p.minx, q.minx);
+    EXPECT_FLOAT_EQ(p.miny, q.miny);
+    EXPECT_FLOAT_EQ(p.minz, q.minz);
+    EXPECT_FLOAT_EQ(p.maxx, q.maxx);
+    EXPECT_FLOAT_EQ(p.maxy, q.maxy);
+    EXPECT_FLOAT_EQ(p.maxz, q.maxz);
+}
diff --git a/test/unit/Support.hpp b/test/unit/Support.hpp
new file mode 100644
index 0000000..6b68be8
--- /dev/null
+++ b/test/unit/Support.hpp
@@ -0,0 +1,144 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#pragma once
+
+// support functions for unit testing
+
+#include <pdal/pdal_types.hpp>
+#include <pdal/util/Bounds.hpp>
+
+namespace pdal
+{
+    class PointView;
+    class Stage;
+}
+
+#include <string>
+
+class Support
+{
+public:
+    // this is where the reference files (input data) live
+    static std::string datapath();
+
+    // returns "datapath + / + file"
+    static std::string datapath(const std::string& file);
+
+    // this is where the reference files (input data) live
+    static std::string configuredpath();
+
+    // returns "configuredpath + / + file"
+    static std::string configuredpath(const std::string& file);
+
+
+    // this is where the temporary output files go
+    static std::string temppath();
+
+    // returns "temppath + / + file"
+    static std::string temppath(const std::string& file);
+
+    // this is where the pdal executables live
+    static std::string binpath();
+
+    // return "bindir + / + file"
+    static std::string binpath(const std::string& file);
+
+    // returns "name" on unix and "name + .exe" on windows
+    static std::string exename(const std::string& name);
+
+    // returns number of bytes different for two binary files (or maxint
+    // if a file doesn't exist)
+    static uint32_t diff_files(const std::string& file1,
+       const std::string& file2);
+    static uint32_t diff_files(std::istream& str1, std::istream& str2);
+
+    // same as diff_files, but allows for a region of the file be to be ignored
+    // (region is specified with a starting offset and a length)
+    static uint32_t diff_files(const std::string& file1,
+        const std::string& file2, uint32_t ignorable_start,
+        uint32_t ignorable_length);
+
+    // same as above diff_files with ignorable region, but for multiple regions
+    static uint32_t diff_files(const std::string& file1,
+        const std::string& file2, uint32_t* ignorable_start,
+        uint32_t* ignorable_length, uint32_t num_ignorables);
+
+    // same as above diff_files with ignorable region, but for multiple regions
+    static uint32_t diff_files(std::istream& str1, std::istream& str2,
+        uint32_t* ignorable_start, uint32_t* ignorable_length,
+        uint32_t num_ignorables);
+
+    // returns number of lines different for two text files (or maxint
+    // if a file doesn't exist) if ignoreLine is not -1, that line will
+    // be "ignored" when comparing the two files
+    static uint32_t diff_text_files(const std::string& file1,
+        const std::string& file2, int32_t ignoreLine1=-1);
+    static uint32_t diff_text_files(std::istream& str1, std::istream& str2,
+        int32_t ignoreLine1=-1);
+
+    // returns true iff the two (binary or ascii) files are the same,
+    // using the above diff_files/diff_text_files functions
+
+    static bool compare_files(const std::string& file1,
+        const std::string& file2);
+    static bool compare_text_files(const std::string& file1,
+        const std::string& file2);
+    static bool compare_text_files(std::istream& str1, std::istream& str2);
+
+    // validate a point's XYZ values
+    static void check_pN(const pdal::PointView& data,
+                         pdal::PointId index,
+                         double xref, double yref, double zref);
+
+    // validate a point's XYZ, Time, and Color values
+    static void check_pN(const pdal::PointView& data,
+        pdal::PointId index, double xref, double yref, double zref,
+        double tref, uint16_t rref, uint16_t gref, uint16_t bref);
+
+    // these are for the 1.2-with-color image
+    static void check_p0_p1_p2(const pdal::PointView& data);
+    static void check_p100_p101_p102(const pdal::PointView& data);
+    static void check_p355_p356_p357(const pdal::PointView& data);
+    static void check_p710_p711_p712(const pdal::PointView& data);
+
+    static void compareBounds(const pdal::BOX3D& p,
+        const pdal::BOX3D& q);
+
+    // executes "cmd" via popen, copying stdout into output and returning
+    // the status code note: under windows, all "/" characrters in cmd will
+    // be converted to "\\" for you
+    // static int run_command(const std::string& cmd, std::string& output);
+};
+
diff --git a/test/unit/SupportTest.cpp b/test/unit/SupportTest.cpp
new file mode 100644
index 0000000..299f066
--- /dev/null
+++ b/test/unit/SupportTest.cpp
@@ -0,0 +1,222 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include "Support.hpp"
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+using namespace pdal;
+using namespace std;
+
+TEST(SupportTest, test_paths)
+{
+    // does the data path work?
+    string data_file = Support::datapath("las/simple.las");
+    EXPECT_TRUE(FileUtils::fileExists(data_file));
+
+    // make sure we have read access
+    istream* istr = FileUtils::openFile(data_file);
+    string yow;
+    *istr >> yow;
+    FileUtils::closeFile(istr);
+
+    // does the temp path work?
+    string temp_file_ok = Support::temppath("README.txt");
+    EXPECT_TRUE(FileUtils::fileExists(temp_file_ok));
+    string temp_file = Support::temppath("my_temp_file.dat");
+    EXPECT_TRUE(!FileUtils::fileExists(temp_file));
+
+    // make sure we have write access to the temp dir
+    ostream* ostr = FileUtils::createFile(temp_file);
+    *ostr << "yow";
+    FileUtils::closeFile(ostr);
+    EXPECT_TRUE(FileUtils::fileExists(temp_file));
+    EXPECT_TRUE(FileUtils::deleteFile(temp_file));
+    EXPECT_TRUE(!FileUtils::fileExists(temp_file));
+
+    // does binpath (and exename) work?
+    string this_bin = Support::exename("pdal");
+#ifdef _WIN32
+    EXPECT_EQ(this_bin, "pdal.exe");
+#else
+    EXPECT_EQ(this_bin, "pdal");
+#endif
+    this_bin = Support::binpath(this_bin);
+    EXPECT_TRUE(FileUtils::fileExists(this_bin));
+}
+
+
+TEST(SupportTest, test_diff_file)
+{
+    uint32_t diffs = 0;
+    bool same = false;
+
+    diffs = Support::diff_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data0.dat"));
+    same = Support::compare_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data0.dat"));
+    EXPECT_TRUE(diffs > 0);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_files(Support::datapath("misc/data0.dat"), Support::datapath("misc/data1.dat"));
+    same = Support::compare_files(Support::datapath("misc/data0.dat"), Support::datapath("misc/data1.dat"));
+    EXPECT_TRUE(diffs > 0);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data1.dat"));
+    same = Support::compare_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data1.dat"));
+    EXPECT_EQ(diffs, 0U);
+    EXPECT_TRUE(same == true);
+
+    diffs = Support::diff_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data2.dat"));
+    same = Support::compare_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data2.dat"));
+    EXPECT_EQ(diffs, 1U);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_files(Support::datapath("misc/data2.dat"), Support::datapath("misc/data1.dat"));
+    same = Support::compare_files(Support::datapath("misc/data2.dat"), Support::datapath("misc/data1.dat"));
+    EXPECT_EQ(diffs, 1U);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data3.dat"));
+    same = Support::compare_files(Support::datapath("misc/data1.dat"), Support::datapath("misc/data3.dat"));
+    EXPECT_EQ(diffs, 1U);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_files(Support::datapath("misc/data3.dat"), Support::datapath("misc/data1.dat"));
+    same = Support::compare_files(Support::datapath("misc/data3.dat"), Support::datapath("misc/data1.dat"));
+    EXPECT_EQ(diffs, 1U);
+    EXPECT_TRUE(same == false);
+}
+
+
+TEST(SupportTest, test_diff_file_ignorable)
+{
+    uint32_t diffs = 0;
+
+    // no ignorable region
+    {
+        diffs = Support::diff_files(Support::datapath("misc/data4a.dat"), Support::datapath("misc/data4b.dat"));
+        EXPECT_TRUE(diffs == 6U);
+        EXPECT_TRUE(Support::compare_files(Support::datapath("misc/data4a.dat"), Support::datapath("misc/data4b.dat")) == false);
+    }
+
+    // treat whole file as ignorable
+    {
+        uint32_t start[1] = {0};
+        uint32_t len[1] = {100};
+        diffs = Support::diff_files(Support::datapath("misc/data4a.dat"), Support::datapath("misc/data4b.dat"), start, len, 1);
+        EXPECT_EQ(diffs, 0U);
+    }
+
+    // just ignore the first region
+    {
+        uint32_t start[1] = {3};
+        uint32_t len[1] = {4};
+        diffs = Support::diff_files(Support::datapath("misc/data4a.dat"), Support::datapath("misc/data4b.dat"), start, len, 1);
+        EXPECT_EQ(diffs, 2U);
+    }
+
+    // ignore the first and second regions
+    {
+        uint32_t start[2] = {3, 23};
+        uint32_t len[2] = {4, 2};
+        diffs = Support::diff_files(Support::datapath("misc/data4a.dat"), Support::datapath("misc/data4b.dat"), start, len, 2);
+        EXPECT_EQ(diffs, 0U);
+    }
+
+    // ignore first and part of second region
+    {
+        uint32_t start[2] = {3, 22};
+        uint32_t len[2] = {4, 2};
+        diffs = Support::diff_files(Support::datapath("misc/data4a.dat"),
+            Support::datapath("misc/data4b.dat"), start, len, 2);
+        EXPECT_EQ(diffs, 1U);
+    }
+}
+
+
+TEST(SupportTest, test_diff_text_file)
+{
+    uint32_t diffs = 0;
+    bool same = false;
+    diffs = Support::diff_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data0.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data0.txt"));
+    EXPECT_TRUE(diffs > 0);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data0.txt"), Support::datapath("misc/data1.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data0.txt"), Support::datapath("misc/data1.txt"));
+    EXPECT_TRUE(diffs > 0);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data1.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data1.txt"));
+    EXPECT_TRUE(diffs == 0);
+    EXPECT_TRUE(same == true);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data2.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data2.txt"));
+    EXPECT_TRUE(diffs == 1);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data2.txt"), Support::datapath("misc/data1.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data2.txt"), Support::datapath("misc/data1.txt"));
+    EXPECT_TRUE(diffs == 1);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data3.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data1.txt"), Support::datapath("misc/data3.txt"));
+    EXPECT_TRUE(diffs == 2);
+    EXPECT_TRUE(same == false);
+
+    diffs = Support::diff_text_files(Support::datapath("misc/data3.txt"), Support::datapath("misc/data1.txt"));
+    same = Support::compare_text_files(Support::datapath("misc/data3.txt"), Support::datapath("misc/data1.txt"));
+    EXPECT_TRUE(diffs == 2);
+    EXPECT_TRUE(same == false);
+}
+
+
+TEST(SupportTest, test_run_command)
+{
+    // amazingly, this command works under both dos *and* unix shells
+    string cmd = "echo foo";
+
+    string output;
+    const int stat = Utils::run_shell_command(cmd, output);
+
+    EXPECT_EQ(output.substr(0, 3), "foo");
+    EXPECT_EQ(stat, 0);
+}
diff --git a/test/unit/TestConfig.cpp b/test/unit/TestConfig.cpp
new file mode 100644
index 0000000..6d969b2
--- /dev/null
+++ b/test/unit/TestConfig.cpp
@@ -0,0 +1,41 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "TestConfig.hpp"
+
+std::string TestConfig::g_data_path = UNITTEST_TESTCONFIG_DATA_PATH;
+std::string TestConfig::g_configured_path = UNITTEST_TESTCONFIG_CONFIGURED_PATH;
+std::string TestConfig::g_binary_path = UNITTEST_TESTCONFIG_BINARY_PATH;
+std::string TestConfig::g_oracle_connection =
+    UNITTEST_TESTCONFIG_OCI_CONNECTION;
diff --git a/test/unit/TestConfig.hpp.in b/test/unit/TestConfig.hpp.in
new file mode 100644
index 0000000..dbad766
--- /dev/null
+++ b/test/unit/TestConfig.hpp.in
@@ -0,0 +1,55 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#ifndef UNITTEST_TESTCONFIG_INCLUDED
+#define UNITTEST_TESTCONFIG_INCLUDED
+
+#define UNITTEST_TESTCONFIG_DATA_PATH "@CMAKE_SOURCE_DIR@/test/data/"
+#define UNITTEST_TESTCONFIG_CONFIGURED_PATH "@CMAKE_BINARY_DIR@/test/data/"
+#define UNITTEST_TESTCONFIG_BINARY_PATH "@CMAKE_BINARY_DIR@/bin/"
+#define UNITTEST_TESTCONFIG_OCI_CONNECTION "@OCI_CONNECTION@"
+
+#include <string>
+
+struct TestConfig 
+{
+    TestConfig();
+    static std::string g_data_path;
+    static std::string g_configured_path;
+    static std::string g_binary_path;
+    static std::string g_oracle_connection;
+};
+
+
+#endif
diff --git a/test/unit/UserCallbackTest.cpp b/test/unit/UserCallbackTest.cpp
new file mode 100644
index 0000000..864e2b3
--- /dev/null
+++ b/test/unit/UserCallbackTest.cpp
@@ -0,0 +1,109 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/UserCallback.hpp>
+
+using namespace pdal;
+
+// our implementation will be that we will request an interrupt
+// when we are more than half done
+class MyUserCallback : public UserCallback
+{
+public:
+    virtual void callback()
+    {
+        if (getPercentComplete() > 50.0)
+            setInterruptFlag(true);
+    }
+};
+
+
+class Worker
+{
+public:
+    Worker(UserCallback& cb) : m_cb(cb), m_ticks(0)
+    {
+        m_cb.setTotal(300);
+    }
+
+    // each invocation of doWork will represent 1% more done
+    // returns true if work is going along okay, false otherwise
+    bool doWork()
+    {
+        m_cb.invoke(++m_ticks);
+        m_cb.invoke(++m_ticks);
+        m_cb.invoke(++m_ticks);
+        return true;
+    }
+
+private:
+    UserCallback& m_cb;
+    int m_ticks;
+
+    Worker& operator=(const Worker&); // not implemented
+};
+
+
+TEST(UserCallbackTest, test1)
+{
+    MyUserCallback cb;
+
+    Worker worker(cb);
+    bool ok;
+
+    // first 50%
+    for (int i = 0; i < 50; i++)
+    {
+        ok = worker.doWork();
+        EXPECT_TRUE(ok);
+        uint32_t hb = 3 * (i + 1);
+        EXPECT_EQ(cb.getHeartbeats(), hb);
+        EXPECT_DOUBLE_EQ(cb.getPercentComplete(), (double)(i + 1));
+    }
+
+    // to 51%...
+    try
+    {
+        ok = true;
+        ok = worker.doWork();
+    }
+    catch (UserCallback::interrupted)
+    {
+        ok = false;
+    }
+    EXPECT_TRUE(!ok);
+    EXPECT_DOUBLE_EQ(100.0*(151.0/300.0), cb.getPercentComplete());
+}
diff --git a/test/unit/UtilsTest.cpp b/test/unit/UtilsTest.cpp
new file mode 100644
index 0000000..270322c
--- /dev/null
+++ b/test/unit/UtilsTest.cpp
@@ -0,0 +1,331 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <sstream>
+
+#include <pdal/util/Utils.hpp>
+
+#include <vector>
+
+using namespace pdal;
+
+TEST(UtilsTest, test_random)
+{
+    const double rangeMin = 0.0;
+    const double rangeMax = 100.0;
+    const double avg = (rangeMax - rangeMin) / 2.0;
+    const int iters = 1000;
+
+    Utils::random_seed(17);
+
+    // make sure we treat the bounds as inclusive
+    double sum=0;
+    for (int i=0; i<iters; i++)
+    {
+        const double x = Utils::random(rangeMin, rangeMax);
+        EXPECT_TRUE(x >= rangeMin);
+        EXPECT_TRUE(x <= rangeMax);
+
+        sum += x;
+    }
+
+    sum = sum / iters;
+
+    EXPECT_TRUE(sum <= avg + 0.1*avg);
+    EXPECT_TRUE(sum >= avg - 0.1*avg);
+}
+
+
+TEST(UtilsTest, test_comparators)
+{
+    bool ok;
+
+    {
+        ok = Utils::compare_distance<float>(1.000001f, 1.0f);
+        EXPECT_TRUE(!ok);
+
+        ok = Utils::compare_distance<float>(1.0000001f, 1.0f);
+        EXPECT_TRUE(ok);
+
+        ok = Utils::compare_distance<float>(1.00000001f, 1.0f);
+        EXPECT_TRUE(ok);
+    }
+
+    {
+        ok = Utils::compare_approx<float>(1.001f, 1.0f, 0.0001f);
+        EXPECT_TRUE(!ok);
+
+        ok = Utils::compare_approx<float>(1.001f, 1.0f, 0.001f);
+        EXPECT_TRUE(!ok);
+
+        ok = Utils::compare_approx<float>(1.001f, 1.0f, 0.01f);
+        EXPECT_TRUE(ok);
+
+        ok = Utils::compare_approx<float>(1.001f, 1.0f, 0.1f);
+        EXPECT_TRUE(ok);
+    }
+
+    {
+        ok = Utils::compare_approx<unsigned int>(10, 12, 2);
+        EXPECT_TRUE(ok);
+
+        ok = Utils::compare_approx<unsigned int>(10, 12, 3);
+        EXPECT_TRUE(ok);
+
+        ok = Utils::compare_approx<unsigned int>(10, 12, 1);
+        EXPECT_TRUE(!ok);
+    }
+}
+
+
+TEST(UtilsTest, test_base64)
+{
+    std::vector<uint8_t> data;
+    for (int i=0; i<2; i++) data.push_back((uint8_t)i);
+
+    uint32_t begin_size(0);
+    for (std::vector<uint8_t>::size_type i = 0; i < data.size(); ++i)
+    {
+        begin_size = begin_size + data[i];
+    }
+
+    std::string encoded = Utils::base64_encode(data);
+    std::vector<uint8_t> decoded = Utils::base64_decode(encoded);
+
+    uint32_t size(0);
+    for (std::vector<uint8_t>::size_type i = 0; i < decoded.size(); ++i)
+    {
+        size = size + decoded[i];
+    }
+
+    EXPECT_EQ(decoded.size(), data.size());
+    EXPECT_EQ(size, begin_size);
+}
+
+TEST(UtilsTest, blanks)
+{
+    std::string base("This is a test");
+    std::string trail("This is a test   ");
+    std::string lead("  This is a test");
+    std::string both("  This is a test    ");
+    std::string empty;
+
+    std::string s = "This is a test  \t  ";
+    Utils::trimTrailing(s);
+    EXPECT_EQ(s, base);
+    s = "";
+    Utils::trimTrailing(s);
+    EXPECT_EQ(s, empty);
+    s = "  \t\t  ";
+    Utils::trimTrailing(s);
+    EXPECT_EQ(s, empty);
+    s = base;
+    Utils::trimTrailing(s);
+    EXPECT_EQ(s, base);
+    s = "  \t This is a test";
+    Utils::trimLeading(s);
+    EXPECT_EQ(s, base);
+    s = "  \t  \t  ";
+    Utils::trimLeading(s);
+    EXPECT_EQ(s, empty);
+    s = "";
+    Utils::trimLeading(s);
+    EXPECT_EQ(s, empty);
+    s = base;
+    Utils::trimLeading(s);
+    EXPECT_EQ(s, base);
+}
+
+TEST(UtilsTest, split)
+{
+    std::vector<std::string> result;
+
+    std::string input("This is a test");
+    auto pred = [](char c)
+        { return c == ' '; };
+
+    result = Utils::split(input, pred);
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+
+    input = "  This  is a test  ";
+
+    result = Utils::split(input, pred);
+    EXPECT_EQ(result.size(), 9U);
+    EXPECT_EQ(result[0], "");
+    EXPECT_EQ(result[1], "");
+    EXPECT_EQ(result[2], "This");
+    EXPECT_EQ(result[3], "");
+    EXPECT_EQ(result[4], "is");
+    EXPECT_EQ(result[5], "a");
+    EXPECT_EQ(result[6], "test");
+    EXPECT_EQ(result[7], "");
+    EXPECT_EQ(result[8], "");
+}
+
+TEST(UtilsTest, splitChar)
+{
+    std::vector<std::string> result;
+
+    std::string input("This is a test");
+
+    result = Utils::split(input, ' ');
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+
+    input = "  This  is a test  ";
+
+    result = Utils::split(input, ' ');
+    EXPECT_EQ(result.size(), 9U);
+    EXPECT_EQ(result[0], "");
+    EXPECT_EQ(result[1], "");
+    EXPECT_EQ(result[2], "This");
+    EXPECT_EQ(result[3], "");
+    EXPECT_EQ(result[4], "is");
+    EXPECT_EQ(result[5], "a");
+    EXPECT_EQ(result[6], "test");
+    EXPECT_EQ(result[7], "");
+    EXPECT_EQ(result[8], "");
+}
+
+TEST(UtilsTest, split2)
+{
+    std::vector<std::string> result;
+
+    std::string input("This is a test");
+    auto pred = [](char c)
+        { return c == ' '; };
+
+    result = Utils::split2(input, pred);
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+
+    input = "  This  is a test  ";
+
+    result = Utils::split2(input, pred);
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+
+    auto pred2 = [](char c)
+        { return c == ' ' || c == ','; };
+
+    input = " , This,is ,a test , ";
+
+    result = Utils::split2(input, pred2);
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+}
+
+TEST(UtilsTest, split2Char)
+{
+    std::vector<std::string> result;
+
+    std::string input(",,This,is,,a,test,,,");
+
+    result = Utils::split2(input, ',');
+    EXPECT_EQ(result.size(), 4U);
+    EXPECT_EQ(result[0], "This");
+    EXPECT_EQ(result[1], "is");
+    EXPECT_EQ(result[2], "a");
+    EXPECT_EQ(result[3], "test");
+}
+
+TEST(UtilsTest, case)
+{
+    std::string s("This is a test");
+    
+    EXPECT_EQ("THIS IS A TEST", Utils::toupper(s));
+    EXPECT_EQ("this is a test", Utils::tolower(s));
+
+    s = "FOOBARBAZ";
+
+    EXPECT_EQ("FOOBARBAZ", Utils::toupper(s));
+    EXPECT_EQ("foobarbaz", Utils::tolower(s));
+
+    s = "foo!bar.baz";
+    EXPECT_EQ("FOO!BAR.BAZ", Utils::toupper(s));
+    EXPECT_EQ(s, Utils::tolower(s));
+}
+
+TEST(UtilsTest, starts)
+{
+    std::string s("reference 1");
+
+    EXPECT_TRUE(Utils::startsWith(s, "ref"));
+    EXPECT_TRUE(Utils::startsWith(s, s));
+    EXPECT_FALSE(Utils::startsWith(s, "reference 123"));
+    EXPECT_FALSE(Utils::startsWith(s, "rawference 123"));
+    EXPECT_TRUE(Utils::startsWith(s, ""));
+}
+
+TEST(UtilsTest, iequals)
+{
+    EXPECT_TRUE(Utils::iequals("", ""));
+    EXPECT_TRUE(Utils::iequals("Foobar", "foobar"));
+    EXPECT_TRUE(Utils::iequals("FOO.BAR~", "foo.Bar~"));
+    EXPECT_FALSE(Utils::iequals("Foobar", "foobarbaz"));
+    EXPECT_FALSE(Utils::iequals("Foobar", "foobat"));
+}
+
+TEST(UtilsTest, replaceAll)
+{
+    std::string s(" This  is a   test ");
+    EXPECT_EQ(Utils::replaceAll(s, " ", "  "), "  This    is  a      test  ");
+    EXPECT_EQ(Utils::replaceAll(s, "  ", " "), " This is a  test ");
+    EXPECT_EQ(Utils::replaceAll(s, " ", "\""), "\"This\"\"is\"a\"\"\"test\"");
+}
+
+TEST(UtilsTest, escapeNonprinting)
+{
+    std::string s("CTRL-N,A,B,R,V: \n\a\b\r\v\x12\xe\x01");
+    std::string out = Utils::escapeNonprinting(s);
+    EXPECT_EQ(out, "CTRL-N,A,B,R,V: \\n\\a\\b\\r\\v\\x12\\x0e\\x01");
+}
diff --git a/test/unit/XMLSchemaTest.cpp b/test/unit/XMLSchemaTest.cpp
new file mode 100644
index 0000000..1c32787
--- /dev/null
+++ b/test/unit/XMLSchemaTest.cpp
@@ -0,0 +1,272 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+#include <boost/property_tree/ptree.hpp>
+
+#include <boost/uuid/uuid_generators.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/Metadata.hpp>
+#include <pdal/PointTable.hpp>
+#include <pdal/XMLSchema.hpp>
+
+#include "Support.hpp"
+#include "TestConfig.hpp"
+
+#include <fstream>
+
+using namespace pdal;
+
+std::string ReadXML(std::string filename)
+{
+    std::istream* infile = FileUtils::openFile(filename);
+    std::ifstream::pos_type size;
+    std::vector<char> data;
+    if (infile->good())
+    {
+        infile->seekg(0, std::ios::end);
+        size = infile->tellg();
+        data.resize(static_cast<std::vector<char>::size_type>(size));
+        infile->seekg(0, std::ios::beg);
+        infile->read(&data.front(), size);
+
+        delete infile;
+        return std::string(&data[0], data.size());
+    }
+    else
+        throw pdal_error("unable to open file!");
+}
+
+TEST(XMLSchemaTest, read)
+{
+    auto getDim = [](XMLDimList& dims, const std::string& name)
+    {
+        for (auto di = dims.begin(); di != dims.end(); ++di)
+        {
+            if (di->m_name == name)
+                return *di;
+        }
+        return XMLDim();
+    };
+
+    std::string xml =
+        ReadXML(TestConfig::g_data_path+"../../schemas/6-dim-schema.xml");
+    std::string xsd = ReadXML(TestConfig::g_data_path+"../../schemas/LAS.xsd");
+
+    XMLSchema s(xml, xsd);
+    XMLDimList dims = s.xmlDims();
+
+    EXPECT_EQ(dims.size(), 6U);
+
+    XMLDim dim = getDim(dims, "X");
+    DimType dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name,  "X");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, .01);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Signed32);
+
+    dim = getDim(dims, "Y");
+    dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name, "Y");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, .01);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Signed32);
+
+    dim = getDim(dims, "Z");
+    dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name, "Z");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, .01);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Signed32);
+
+    dim = getDim(dims, "Intensity");
+    dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name, "Intensity");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, 1.0);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Unsigned16);
+
+    dim = getDim(dims, "ReturnNumber");
+    dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name, "ReturnNumber");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, 1.0);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Unsigned8);
+
+    dim = getDim(dims, "NumberOfReturns");
+    dt = dim.m_dimType;
+    EXPECT_EQ(dim.m_name, "NumberOfReturns");
+    EXPECT_FLOAT_EQ(dt.m_xform.m_scale, 1.0);
+    EXPECT_FLOAT_EQ(dt.m_xform.m_offset, 0.0);
+    EXPECT_EQ(dt.m_type, Dimension::Type::Unsigned8);
+}
+
+
+TEST(XMLSchemaTest, copy)
+{
+    using namespace pdal;
+
+    std::string xml = ReadXML(TestConfig::g_data_path +
+        "../../schemas/16-dim-schema.xml");
+    std::string xsd = ReadXML(TestConfig::g_data_path+"../../schemas/LAS.xsd");
+
+    XMLSchema s1(xml, xsd);
+
+    PointTable table;
+    XMLDimList dims = s1.xmlDims();
+    for (auto di = dims.begin(); di != dims.end(); ++di)
+    {
+        Dimension::Id::Enum id =
+            table.layout()->registerOrAssignDim(
+                    di->m_name,
+                    di->m_dimType.m_type);
+        s1.setId(di->m_name, id);
+    }
+
+    MetadataNode m;
+
+    MetadataNode m1 = m.add("m1", 1u);
+    MetadataNode m2 = m.add("m2", 1);
+    MetadataNode m1prime = m.add("m1prime", "Some other metadata");
+    m1.add("uuid", boost::uuids::nil_uuid());
+
+    XMLSchema s2(s1.xmlDims(), m);
+    std::string xml_output = s2.xml();
+
+    XMLSchema s3(xml_output, xsd);
+    XMLDimList dims3 = s3.xmlDims();
+
+    EXPECT_EQ(dims.size(), dims3.size());
+
+    auto di1 = dims.begin();
+    auto di3 = dims3.begin();
+    while (di1 != dims.end() && di3 != dims3.end())
+    {
+        XMLDim& dim1 = *di1;
+        XMLDim& dim3 = *di3;
+
+        EXPECT_EQ(dim1.m_name, dim3.m_name);
+        EXPECT_EQ(dim1.m_dimType.m_type, dim3.m_dimType.m_type);
+        di1++;
+        di3++;
+    }
+}
+
+TEST(XMLSchemaTest, utf8)
+{
+    using namespace pdal;
+
+    std::string inFilename(TestConfig::g_data_path +
+        "../../schemas/utf8-schema.xml");
+    std::string inXsdFilename(TestConfig::g_data_path +
+        "../../schemas/LAS.xsd");
+    std::string xml = ReadXML(inFilename);
+    std::string xsd = ReadXML(inXsdFilename);
+
+    XMLSchema s1(xml, xsd);
+
+    std::string descripValue("Ég get etið gler án þess að meiða mig.");
+    std::string metaName("אני יכול לאכול זכוכית וזה לא מזיק לי.");
+    std::string metaValue("أنا قادر على أكل الزجاج و هذا لا يؤلمني");
+
+    XMLDimList dims = s1.xmlDims();
+    EXPECT_EQ(dims.size(), 1U);
+    if (dims.size())
+    {
+        XMLDim& dim = *dims.begin();
+        EXPECT_EQ(descripValue, dim.m_description);
+        MetadataNodeList mlist = s1.getMetadata().children();
+        EXPECT_EQ(mlist.size(), 1U);
+        MetadataNode& m = *mlist.begin();
+        EXPECT_EQ(m.name(), metaName);
+        EXPECT_EQ(m.value(), metaValue);
+    }
+}
+
+TEST(XMLSchemaTest, precision)
+{
+    using namespace Dimension;
+
+    XMLDimList dims;
+
+    XForm xform1(1e-10, .0000000001);
+    XMLDim d1(DimType(Id::X, Type::Signed32, xform1), "X");
+    dims.push_back(d1);
+
+    XForm xform2(100000000, 12345678901);
+    XMLDim d2(DimType(Id::Y, Type::Unsigned32, xform2), "Y");
+    dims.push_back(d2);
+
+    XMLSchema x1(dims, MetadataNode());
+    std::string s = x1.xml();
+
+    XMLSchema x2(s);
+    dims = x2.xmlDims();
+
+    EXPECT_EQ(dims.size(), 2U);
+    // Order of dimensions should be maintained.
+    DimType d = dims[0].m_dimType;
+    EXPECT_EQ(d.m_type, d1.m_dimType.m_type);
+    EXPECT_DOUBLE_EQ(d.m_xform.m_offset, d1.m_dimType.m_xform.m_offset);
+    EXPECT_DOUBLE_EQ(d.m_xform.m_scale, d1.m_dimType.m_xform.m_scale);
+
+    d = dims[1].m_dimType;
+    EXPECT_EQ(d.m_type, d2.m_dimType.m_type);
+    EXPECT_DOUBLE_EQ(d.m_xform.m_offset, d2.m_dimType.m_xform.m_offset);
+    EXPECT_DOUBLE_EQ(d.m_xform.m_scale, d2.m_dimType.m_xform.m_scale);
+}
+
+TEST(XMLSchemaTest, nonstandard)
+{
+    using namespace Dimension;
+
+    XMLDimList dims;
+
+    XMLDim d1(DimType((Dimension::Id::Enum)543, Type::Signed32), "FOOBAR");
+    XMLDim d2(DimType((Dimension::Id::Enum)545, Type::Signed32), "BARFOO");
+
+    dims.push_back(d1);
+    dims.push_back(d2);
+
+    XMLSchema x1(dims, MetadataNode());
+
+    std::string xml = x1.xml();
+
+    XMLSchema x2(xml);
+    dims = x2.xmlDims();
+    EXPECT_EQ(dims[0].m_name, "FOOBAR");
+    EXPECT_EQ(dims[1].m_name, "BARFOO");
+}
diff --git a/test/unit/apps/MergeTest.cpp b/test/unit/apps/MergeTest.cpp
new file mode 100644
index 0000000..b3fb2b4
--- /dev/null
+++ b/test/unit/apps/MergeTest.cpp
@@ -0,0 +1,110 @@
+/******************************************************************************
+* Copyright (c) 2015, Hobu Inc., (info at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. nor the names of contributors
+*       may be used to endorse or promote products derived from this
+*       software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <iostream>
+#include <string>
+
+#include <pdal/pdal_test_main.hpp>
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+std::string appName()
+{
+    return Support::binpath("pdal merge");
+}
+}
+
+TEST(Merge, pdalinfoTest_no_input)
+{
+    const std::string cmd = appName() + " 2>&1";
+
+    std::string output;
+    EXPECT_EQ(Utils::run_shell_command(cmd, output), 1);
+
+    const std::string expected = "PDAL: Must specify an input and output file.";
+    EXPECT_EQ(output.substr(0, expected.length()), expected);
+}
+
+
+TEST(Merge, Simple)
+{
+    std::string file1(Support::datapath("las/utm15.las"));
+    std::string file2(Support::datapath("las/utm17.las"));
+    std::string outfile(Support::temppath("out.las"));
+    std::string cmd = appName() + " " + file1 + " " + file2 + " " + outfile +
+        " 2>/dev/null";
+
+    std::string output;
+    EXPECT_EQ(Utils::run_shell_command(cmd, output), 0);
+
+    std::string dump(Support::binpath("lasdump"));
+
+    cmd = dump + " " + outfile;
+
+    Utils::run_shell_command(cmd, output);
+    EXPECT_TRUE(output.find("Point count: 11") != std::string::npos);
+
+    FileUtils::deleteFile(outfile);
+}
+
+
+TEST(Merge, Args)
+{
+    std::string file1(Support::datapath("las/utm15.las"));
+    std::string file2(Support::datapath("las/utm17.las"));
+    std::string outfile(Support::temppath("out.las"));
+    std::string cmd = appName() +
+        " --writers.las.scale_x=.001 --writers.las.offset_x=289814 " + file1 +
+        " " + file2 + " " + outfile;
+
+    std::string output;
+    EXPECT_EQ(Utils::run_shell_command(cmd, output), 0);
+
+    std::string dump(Support::binpath("lasdump"));
+    cmd = dump + " " + outfile;
+    Utils::run_shell_command(cmd, output);
+
+    EXPECT_TRUE(
+        output.find("Scales X/Y/Z: 0.001/0.01/0.01") != std::string::npos);
+    EXPECT_TRUE(
+        output.find("Offsets X/Y/Z: 289814/0/0") != std::string::npos);
+
+    FileUtils::deleteFile(outfile);
+}
+
diff --git a/test/unit/apps/pc2pcTest.cpp b/test/unit/apps/pc2pcTest.cpp
new file mode 100644
index 0000000..87aa433
--- /dev/null
+++ b/test/unit/apps/pc2pcTest.cpp
@@ -0,0 +1,181 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <LasReader.hpp>
+
+#include "Support.hpp"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+using namespace pdal;
+
+static std::string appName()
+{
+    return Support::binpath(Support::exename("pdal") + " translate");
+}
+
+
+#ifdef PDAL_COMPILER_MSVC
+TEST(pc2pcTest, pc2pcTest_test_no_input)
+{
+    std::string cmd = appName();
+
+    std::string output;
+    int stat = Utils::run_shell_command(cmd, output);
+    EXPECT_EQ(stat, 1);
+
+    const std::string expected = "Usage error: --input";
+    EXPECT_EQ(output.substr(0, expected.length()), expected);
+}
+#endif
+
+
+TEST(pc2pcTest, pc2pcTest_test_common_opts)
+{
+    std::string cmd = appName();
+
+    std::string output;
+    int stat = Utils::run_shell_command(cmd + " -h", output);
+    EXPECT_EQ(stat, 0);
+
+    stat = Utils::run_shell_command(cmd + " --version", output);
+    EXPECT_EQ(stat, 0);
+}
+
+
+static bool fileIsOkay(const std::string& name)
+{
+    if (!FileUtils::fileExists(name))
+        return false;
+    if (FileUtils::fileSize(name) < 1000)
+        return false;
+    return true;
+}
+
+
+static bool fileIsCompressed(const std::string& name)
+{
+    PointTable table;
+
+    Options ops;
+    ops.add("filename", name);
+    std::shared_ptr<LasReader> reader(new LasReader);
+    reader->setOptions(ops);
+    reader->prepare(table);
+    return reader->header().compressed();
+}
+
+
+static bool fileHasSrs(const std::string& name)
+{
+    PointTable table;
+
+    Options ops;
+    ops.add("filename", name);
+    std::shared_ptr<LasReader> reader(new LasReader);
+    reader->setOptions(ops);
+    reader->prepare(table);
+    reader->execute(table);
+    return !reader->getSpatialReference().empty();
+}
+
+
+TEST(pc2pcTest, pc2pc_test_switches)
+{
+    std::string cmd = appName();
+
+    std::string inputLas = Support::datapath("apps/simple.las");
+    std::string inputLaz = Support::datapath("apps/simple.laz");
+    std::string outputLas = Support::temppath("temp.las");
+    std::string outputLaz = Support::temppath("temp.laz");
+
+    std::string output;
+
+    int stat = 0;
+
+    // We don't generally test the output files against a reference file
+    // because we don't want to have to update the reference files every time
+    // we change the driver implementation -- those issues are covered by the
+    // unit tests for the drivers.  Instead, here we just check certain rough
+    // characteristics of the output file.
+
+    // do --input and --output work?
+    std::string fullCmd = cmd + " --input=" + inputLas + " --output=" +
+        outputLas;
+    stat = Utils::run_shell_command(fullCmd, output);
+    EXPECT_EQ(stat, 0);
+    EXPECT_TRUE(fileIsOkay(outputLas));
+    EXPECT_TRUE(!fileIsCompressed(outputLas));
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    EXPECT_TRUE(!fileHasSrs(outputLas));
+#else
+    (void)fileHasSrs(outputLas);
+#endif
+
+#ifdef PDAL_HAVE_LASZIP
+    // does --compress make a compressed file?
+    stat = Utils::run_shell_command(cmd + " --input=" + inputLas +
+        " --output=" + outputLas + " --writers.las.compression=true", output);
+    EXPECT_EQ(stat, 0);
+    EXPECT_TRUE(fileIsOkay(outputLas));
+    EXPECT_TRUE(fileIsCompressed(outputLas));
+#endif
+
+#ifdef PDAL_HAVE_LASZIP
+    // does "--output foo.laz" make a compressed output?
+    stat = Utils::run_shell_command(cmd + " --input=" + inputLas +
+        " --output=" + outputLaz, output);
+    EXPECT_EQ(stat, 0);
+    EXPECT_TRUE(fileIsOkay(outputLaz));
+    EXPECT_TRUE(fileIsCompressed(outputLaz));
+#endif
+
+    // does --a_srs add an SRS?
+    fullCmd = cmd + " --input=" + inputLas + " --output=" + outputLas +
+        " --readers.las.spatialreference=epsg:4326";
+    stat = Utils::run_shell_command(fullCmd, output);
+    EXPECT_EQ(stat, 0);
+    EXPECT_TRUE(fileIsOkay(outputLas));
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    EXPECT_TRUE(fileHasSrs(outputLas));
+#endif
+
+    FileUtils::deleteFile(outputLas);
+    FileUtils::deleteFile(outputLaz);
+}
diff --git a/test/unit/apps/pcinfoTest.cpp b/test/unit/apps/pcinfoTest.cpp
new file mode 100644
index 0000000..1a5a050
--- /dev/null
+++ b/test/unit/apps/pcinfoTest.cpp
@@ -0,0 +1,220 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include "UnitTest.hpp"
+
+#include <pdal/util/FileUtils.hpp>
+#include "Support.hpp"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+BOOST_AUTO_TEST_SUITE(pdalinfoTest)
+
+using namespace pdal;
+
+static std::string appName()
+{
+    const std::string app = Support::binpath(Support::exename("pdal info"));
+    return app;
+}
+
+BOOST_AUTO_TEST_CASE(pdalinfoTest_no_input)
+{
+    const std::string cmd = appName();
+
+    std::string output;
+    int stat = pdal::Utils::run_shell_command(cmd, output);
+    BOOST_CHECK_EQUAL(stat, 1);
+
+    const std::string expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+}
+
+BOOST_AUTO_TEST_CASE(test_pipe_file_input)
+{
+    std::string output;
+    std::string outfile = Support::temppath("schemaout.txt");
+    std::string cmd = appName() + " " +
+        Support::datapath("pipeline/pipeline_read.xml") + " --schema > " +
+        outfile;
+
+    int stat = Utils::run_shell_command(cmd, output);
+    BOOST_CHECK_EQUAL(stat, 0);
+    cmd = "grep -c readers.las.X " + outfile;
+    stat = Utils::run_shell_command(cmd, output);
+    BOOST_CHECK_EQUAL(stat, 0);
+    // Strip off newline
+    output = output.substr(0, output.size() - 1);
+    BOOST_CHECK_EQUAL(output, "2");
+    FileUtils::deleteFile(outfile);
+}
+
+BOOST_AUTO_TEST_CASE(pdalinfo_test_common_opts)
+{
+    const std::string cmd = appName();
+
+    std::string output;
+    int stat = pdal::Utils::run_shell_command(cmd + " -h", output);
+    BOOST_CHECK_EQUAL(stat, 0);
+
+    stat = pdal::Utils::run_shell_command(cmd + " --version", output);
+    BOOST_CHECK_EQUAL(stat, 0);
+}
+
+
+BOOST_AUTO_TEST_CASE(pdalinfo_test_switches)
+{
+    const std::string cmd = appName();
+
+    std::string inputLas = Support::datapath("apps/simple.las");
+    std::string inputLaz = Support::datapath("apps/simple.laz");
+
+    std::string output;
+    std::string expected;
+
+    int stat = 0;
+
+    // does the default work?
+    stat = pdal::Utils::run_shell_command(cmd + " " + inputLas, output);
+    BOOST_CHECK_EQUAL(stat, 1);
+    expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+
+    // does --input work?
+    stat = pdal::Utils::run_shell_command(cmd + " --input=" + inputLas, output);
+    BOOST_CHECK_EQUAL(stat, 1);
+    expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+
+    // does -i work?
+    stat = pdal::Utils::run_shell_command(cmd + " -i " + inputLas, output);
+    BOOST_CHECK_EQUAL(stat, 1);
+    expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+
+#ifdef PDAL_HAVE_LASZIP
+    // does it work for .laz?
+    stat = pdal::Utils::run_shell_command(cmd + " " + inputLaz, output);
+    BOOST_CHECK_EQUAL(stat, 1);
+    expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+#endif
+
+    // does -s work?
+    stat = pdal::Utils::run_shell_command(cmd + " -s", output);
+    BOOST_CHECK_EQUAL(stat, 1);
+    expected = "Usage error: no action option specified";
+    BOOST_CHECK_EQUAL(output.substr(0, expected.length()), expected);
+}
+
+
+BOOST_AUTO_TEST_CASE(pdalinfo_test_dumps)
+{
+    const std::string cmd = appName();
+
+    const std::string inputLas = Support::datapath("apps/simple.las");
+    const std::string inputLaz = Support::datapath("apps/simple.laz");
+    bool were_equal(false);
+    std::string output;
+
+    int stat = 0;
+
+    std::ostringstream command;
+
+    // dump a single point to json
+
+    std::string pt_test = Support::temppath("pdalinfo_point.txt");
+    command << cmd + " --point=1 " + inputLas + " > " + pt_test;
+    stat = pdal::Utils::run_shell_command(command.str(), output);
+    BOOST_CHECK_EQUAL(stat, 0);
+    were_equal = Support::compare_text_files(pt_test, Support::datapath("apps/pdalinfo_point.txt"));
+    BOOST_CHECK(were_equal);
+    if (were_equal)
+        pdal::FileUtils::deleteFile(pt_test);
+    else
+        std::cout << command.str() << std::endl;
+
+    // dump summary of all points to json
+    command.str("");
+
+    std::string stats_test = Support::temppath("pdalinfo_stats.txt");
+    command << cmd + " --stats " + inputLas + " --seed 1234 --sample" +" > " + stats_test; 
+    stat = pdal::Utils::run_shell_command(command.str(), output);
+    BOOST_CHECK_EQUAL(stat, 0);
+#if defined(_WIN32)
+    were_equal = Support::compare_text_files(stats_test, Support::datapath("apps/pdalinfo_stats-win32.txt"));
+#else
+    were_equal = Support::compare_text_files(stats_test, Support::datapath("apps/pdalinfo_stats.txt"));
+#endif
+    BOOST_CHECK(were_equal);
+    if (were_equal)
+        pdal::FileUtils::deleteFile(stats_test);
+    else
+        std::cout << command.str() << std::endl;
+
+    // dump schema to json
+    command.str("");
+
+    std::string schema_test = Support::temppath("pdalinfo_schema.txt");
+    command << cmd + " --schema " + inputLas +" > " + schema_test;
+    stat = pdal::Utils::run_shell_command(command.str(), output);
+    BOOST_CHECK_EQUAL(stat, 0);
+    were_equal = Support::compare_text_files(schema_test, Support::datapath("apps/pdalinfo_schema.txt"));
+    BOOST_CHECK(were_equal);
+    if (were_equal)
+        pdal::FileUtils::deleteFile(schema_test);
+    else
+        std::cout << command.str() << std::endl;
+
+    // dump stage info to json
+    command.str("");
+
+//     std::string stage_test = Support::temppath("pdalinfo_stage.txt");
+//     command << cmd + " --stage " + inputLas +" > " + stage_test;
+//     stat = pdal::Utils::run_shell_command(command.str(), output);
+//     BOOST_CHECK_EQUAL(stat, 0);
+// 
+//     unsigned int check = Support::diff_text_files(stage_test, Support::datapath("apps/pdalinfo_stage.txt"), 15);
+//     BOOST_CHECK_EQUAL(check, 0u);
+//
+//     if (check == 0u)
+//         pdal::FileUtils::deleteFile(stage_test);
+//     else
+//         std::cout << command.str() << std::endl;
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/test/unit/apps/pcpipelineTest.cpp b/test/unit/apps/pcpipelineTest.cpp
new file mode 100644
index 0000000..88e94fd
--- /dev/null
+++ b/test/unit/apps/pcpipelineTest.cpp
@@ -0,0 +1,289 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/util/Utils.hpp>
+#include "Support.hpp"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+static std::string appName()
+{
+    const std::string app = Support::binpath(Support::exename("pdal") + " pipeline");
+    return app;
+}
+
+// most pipelines (those with a writer) will be invoked via `pdal pipeline`
+static void run_pipeline(std::string const& pipeline)
+{
+    const std::string cmd = Support::binpath(Support::exename("pdal") + " pipeline");
+
+    std::string output;
+    std::string file(Support::configuredpath(pipeline));
+    int stat = pdal::Utils::run_shell_command(cmd + " " + file, output);
+    EXPECT_EQ(0, stat);
+    if (stat)
+        std::cerr << output << std::endl;
+}
+
+// pipeines with no writer will be invoked via `pdal info`
+static void run_info(std::string const& pipeline)
+{
+    const std::string cmd = Support::binpath(Support::exename("pdal") + " info");
+
+    std::string output;
+    std::string file(Support::configuredpath(pipeline));
+    int stat = pdal::Utils::run_shell_command(cmd + " -s < " + file, output);
+    EXPECT_EQ(0, stat);
+    if (stat)
+        std::cerr << output << std::endl;
+}
+
+#ifdef PDAL_COMPILER_MSVC
+TEST(pipelineBaseTest, no_input)
+{
+    const std::string cmd = appName();
+
+    std::string output;
+    int stat = pdal::Utils::run_shell_command(cmd, output);
+    EXPECT_EQ(stat, 1);
+
+    const std::string expected = "Usage error: input file name required";
+    EXPECT_EQ(output.substr(0, expected.length()), expected);
+}
+#endif
+
+
+TEST(pipelineBaseTest, common_opts)
+{
+    const std::string cmd = appName();
+
+    std::string output;
+    int stat = pdal::Utils::run_shell_command(cmd + " -h", output);
+    EXPECT_EQ(stat, 0);
+
+    stat = pdal::Utils::run_shell_command(cmd + " --version", output);
+    EXPECT_EQ(stat, 0);
+}
+
+TEST(pipelineBaseTest, drop_color)
+{ run_pipeline("pipeline/drop_color.xml"); }
+
+TEST(pipelineBaseTest, interpolate)
+{ run_pipeline("pipeline/pipeline_interpolate.xml"); }
+
+TEST(pipelineBaseTest, DISABLED_metadata_reader)
+{ run_info("pipeline/pipeline_metadata_reader.xml"); }
+
+TEST(pipelineBaseTest, metadata_writer)
+{ run_pipeline("pipeline/pipeline_metadata_writer.xml"); }
+
+TEST(pipelineBaseTest, mississippi)
+{ run_pipeline("pipeline/pipeline_mississippi.xml"); }
+
+TEST(pipelineBaseTest, mississippi_reverse)
+{ run_pipeline("pipeline/pipeline_mississippi_reverse.xml"); }
+
+TEST(pipelineBaseTest, multioptions)
+{ run_info("pipeline/pipeline_multioptions.xml"); }
+
+TEST(pipelineBaseTest, read)
+{ run_info("pipeline/pipeline_read.xml"); }
+
+TEST(pipelineBaseTest, read_notype)
+{ run_info("pipeline/pipeline_read_notype.xml"); }
+
+TEST(pipelineBaseTest, readcomments)
+{ run_info("pipeline/pipeline_readcomments.xml"); }
+
+TEST(pipelineBaseTest, write)
+{ run_pipeline("pipeline/pipeline_write.xml"); }
+
+TEST(pipelineBaseTest, write2)
+{ run_pipeline("pipeline/pipeline_write2.xml"); }
+
+TEST(pipelineBaseTest, pipeline_writecomments)
+{ run_pipeline("pipeline/pipeline_writecomments.xml"); }
+
+TEST(pipelineBpfTest, bpf)
+{ run_pipeline("bpf/bpf.xml"); }
+
+TEST(pipelineBpfTest, bpf2nitf)
+{ run_pipeline("bpf/bpf2nitf.xml"); }
+
+TEST(pipelineFiltersTest, DISABLED_attribute)
+{ run_pipeline("filters/attribute.xml"); }
+
+TEST(pipelineFiltersTest, chip)
+{ run_pipeline("filters/chip.xml"); }
+
+TEST(pipelineFiltersTest, chipper)
+{ run_pipeline("filters/chipper.xml"); }
+
+TEST(pipelineFiltersTest, DISABLED_colorize_multi)
+{ run_pipeline("filters/colorize-multi.xml"); }
+
+TEST(pipelineFiltersTest, colorize)
+{ run_pipeline("filters/colorize.xml"); }
+
+TEST(pipelineFiltersTest, DISABLED_crop_reproject)
+{ run_pipeline("filters/crop_reproject.xml"); }
+
+TEST(pipelineFiltersTest, crop_wkt)
+{ run_pipeline("filters/crop_wkt.xml"); }
+
+TEST(pipelineFiltersTest, crop_wkt_2d)
+{ run_pipeline("filters/crop_wkt_2d.xml"); }
+
+TEST(pipelineFiltersTest, crop_wkt_2d_classification)
+{ run_pipeline("filters/crop_wkt_2d_classification.xml"); }
+
+TEST(pipelineFiltersTest, DISABLED_decimate)
+{ run_pipeline("filters/decimate.xml"); }
+
+TEST(pipelineFiltersTest, ferry)
+{ run_pipeline("filters/ferry.xml"); }
+
+TEST(pipelineFiltersTest, hexbin_info)
+{ run_info("filters/hexbin-info.xml"); }
+
+TEST(pipelineFiltersTest, hexbin)
+{ run_pipeline("filters/hexbin.xml"); }
+
+TEST(pipelineFiltersTest, merge)
+{ run_info("filters/merge.xml"); }
+
+TEST(pipelineFiltersTest, range_z)
+{ run_info("filters/range_z.xml"); }
+
+TEST(pipelineFiltersTest, range_z_classification)
+{ run_info("filters/range_z_classification.xml"); }
+
+TEST(pipelineFiltersTest, range_classification)
+{ run_info("filters/range_classification.xml"); }
+
+TEST(pipelineFiltersTest, reproject)
+{ run_pipeline("filters/reproject.xml"); }
+
+TEST(pipelineFiltersTest, DISABLED_sort)
+{ run_info("filters/sort.xml"); }
+
+TEST(pipelineFiltersTest, splitter)
+{ run_pipeline("filters/splitter.xml"); }
+
+TEST(pipelineFiltersTest, stats)
+{ run_pipeline("filters/stats.xml"); }
+
+TEST(pipelineHoleTest, crop)
+{ run_pipeline("hole/crop.xml"); }
+
+TEST(pipelineIcebridgeTest, icebridge)
+{ run_pipeline("icebridge/pipeline.xml"); }
+
+TEST(pipelineNitfTest, chipper)
+{ run_info("nitf/chipper.xml"); }
+
+TEST(pipelineNitfTest, conversion)
+{ run_pipeline("nitf/conversion.xml"); }
+
+TEST(pipelineNitfTest, las2nitf)
+{ run_pipeline("nitf/las2nitf.xml"); }
+
+TEST(pipelineNitfTest, DISABLED_reader)
+{ run_info("nitf/reader.xml"); }
+
+TEST(pipelineNitfTest, write_laz)
+{ run_pipeline("nitf/write_laz.xml"); }
+
+TEST(pipelineNitfTest, write_options)
+{ run_pipeline("nitf/write_options.xml"); }
+
+// skip oracle tests for now
+
+TEST(pipelineP2gTest, writer)
+{ run_pipeline("io/p2g-writer.xml"); }
+
+TEST(pipelinePLangTest, DISABLED_from_module)
+{ run_info("plang/from-module.xml"); }
+
+TEST(pipelinePLangTest, DISABLED_predicate_embed)
+{ run_info("plang/predicate-embed.xml"); }
+
+TEST(pipelinePLangTest, predicate_keep_ground_and_unclass)
+{ run_pipeline("plang/predicate-keep-ground-and-unclass.xml"); }
+
+TEST(pipelinePLangTest, predicate_keep_last_return)
+{ run_pipeline("plang/predicate-keep-last-return.xml"); }
+
+TEST(pipelinePLangTest, predicate_keep_specified_returns)
+{ run_pipeline("plang/predicate-keep-specified-returns.xml"); }
+
+TEST(pipelinePLangTest, DISABLED_programmabled_update_y_dims)
+{ run_info("plang/programmable-update-y-dims.xml"); }
+
+TEST(pipelineQfitTest, DISABLED_conversion)
+{ run_pipeline("qfit/conversion.xml"); }
+
+TEST(pipelineQfitTest, DISABLED_little_endian_conversion)
+{ run_pipeline("qfit/little-endian-conversion.xml"); }
+
+TEST(pipelineQfitTest, DISABLED_pipeline)
+{ run_pipeline("qfit/pipeline.xml"); }
+
+TEST(pipelineQfitTest, DISABLED_reader)
+{ run_info("qfit/reader.xml"); }
+
+TEST(pipelineSbetTest, pipeline)
+{ run_pipeline("sbet/pipeline.xml"); }
+
+// skip soci tests for now
+
+TEST(pipelineSQLiteTest, DISABLED_reader)
+{ run_pipeline("io/sqlite-reader.xml"); }
+
+TEST(pipelineSQLiteTest, DISABLED_writer)
+{ run_pipeline("io/sqlite-writer.xml"); }
+
+TEST(pipelineTextTest, csv_writer)
+{ run_pipeline("io/text-writer-csv.xml"); }
+
+TEST(pipelineTextTest, geojson_writer)
+{ run_pipeline("io/text-writer-geojson.xml"); }
+
+TEST(pipelineTextTest, space_delimited_writer)
+{ run_pipeline("io/text-writer-space-delimited.xml"); }
diff --git a/test/unit/filters/ChipperTest.cpp b/test/unit/filters/ChipperTest.cpp
new file mode 100644
index 0000000..3ccdae2
--- /dev/null
+++ b/test/unit/filters/ChipperTest.cpp
@@ -0,0 +1,232 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <ChipperFilter.hpp>
+#include <LasWriter.hpp>
+#include <LasReader.hpp>
+#include <pdal/Options.hpp>
+#include <pdal/StageWrapper.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(ChipperTest, test_construction)
+{
+    PointTable table;
+
+    Options ops1;
+    std::string filename(Support::datapath("las/1.2-with-color.las"));
+    ops1.add("filename", filename);
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    {
+        // need to scope the writer, so that's it dtor can use the stream
+
+        Options options;
+        Option capacity("capacity", 15, "capacity");
+        options.add(capacity);
+
+        ChipperFilter chipper;
+        chipper.setInput(reader);
+        chipper.setOptions(options);
+        chipper.prepare(table);
+        PointViewSet viewSet = chipper.execute(table);
+        EXPECT_EQ(viewSet.size(), 71u);
+
+        std::vector<PointViewPtr> views;
+        for (auto it = viewSet.begin(); it != viewSet.end(); ++it)
+            views.push_back(*it);
+
+        auto sorter = [](PointViewPtr p1, PointViewPtr p2)
+        {
+            //This is super inefficient, but we're doing tests.
+            BOX2D b1;
+            BOX2D b2;
+
+            p1->calculateBounds(b1);
+            p2->calculateBounds(b2);
+
+            return b1.minx < b2.minx ?  true :
+                b1.minx > b2.minx ? false :
+                b1.miny < b2.miny;
+        };
+
+        std::sort(views.begin(), views.end(), sorter);
+
+        PointViewPtr view = views[2];
+        BOX2D bounds;
+        view->calculateBounds(bounds);
+
+        EXPECT_NEAR(bounds.minx, 635674.05, 0.05);
+        EXPECT_NEAR(bounds.maxx, 635993.93, 0.05);
+        EXPECT_NEAR(bounds.miny, 848992.45, 0.05);
+        EXPECT_NEAR(bounds.maxy, 849427.07, 0.05);
+
+        for (size_t i = 0; i < views.size(); ++i)
+            EXPECT_EQ(views[i]->size(), 15u);
+    }
+}
+
+
+// Make sure things don't crash if the point buffer is empty.
+TEST(ChipperTest, empty_buffer)
+{
+    PointTable table;
+    PointViewPtr view(new PointView(table));
+
+    Options ops;
+
+    ChipperFilter chipper;
+    chipper.prepare(table);
+    StageWrapper::ready(chipper, table);
+    PointViewSet viewSet = StageWrapper::run(chipper, view);
+    StageWrapper::done(chipper, table);
+
+    EXPECT_EQ(viewSet.size(), 0u);
+}
+
+//ABELL
+/**
+TEST(ChipperTest, test_ordering)
+{
+    std::string candidate_filename(Support::datapath("autzen-utm.las"));
+    std::string source_filename(Support::datapath("autzen-utm-chipped-25.las"));
+
+    Options options;
+    Option filename("filename", source_filename, "");
+    options.add(filename);
+
+    Option capacity("capacity", 25,"capacity");
+    options.add(capacity);
+
+    LasReader candidate_reader(options);
+    std::shared_ptr<ChipperFilter> chipper(new ChipperFilter)(options);
+    chipper->setInput(&candidate_reader);
+    chipper->prepare();
+
+    Option& query = options.getOptionByRef("filename");
+    query.setValue<std::string>(source_filename);
+
+    LasReader source_reader(options);
+    source_reader.prepare();
+
+    EXPECT_EQ(chipper->getNumPoints(), source_reader.getNumPoints());
+
+    PointView candidate(chipper->getSchema(), chipper->getNumPoints());
+    PointView patch(chipper->getSchema(), chipper->getNumPoints());
+
+    StageSequentialIterator* iter_c = chipper->createSequentialIterator(patch);
+    uint64_t numRead(0);
+
+    while (true)
+    {
+        numRead = iter_c->read(patch);
+        if (! numRead)
+            break;
+        candidate.copyPointsFast(candidate.getNumPoints(), 0, patch, patch.getNumPoints());
+        candidate.setNumPoints(candidate.getNumPoints() + patch.getNumPoints());
+    }
+    EXPECT_EQ(candidate.getNumPoints(), chipper->getNumPoints());
+
+    PointView source(source_reader.getSchema(), source_reader.getNumPoints());
+
+    StageSequentialIterator* iter_s = source_reader.createSequentialIterator(source);
+    numRead = iter_s->read(source);
+    EXPECT_EQ(numRead, source_reader.getNumPoints());
+
+
+
+    Schema const& cs = candidate.getSchema();
+    Schema const& ss = source.getSchema();
+
+    Dimension const& sdimX = ss.getDimension("X");
+    Dimension const& sdimY = ss.getDimension("Y");
+    Dimension const& sdimZ = ss.getDimension("Z");
+    Dimension const& sdimIntensity = ss.getDimension("Intensity");
+    Dimension const& sdimRed = ss.getDimension("Red");
+    Dimension const& sdimGreen = ss.getDimension("Green");
+    Dimension const& sdimBlue = ss.getDimension("Blue");
+
+    Dimension const& cdimX = cs.getDimension("X");
+    Dimension const& cdimY = cs.getDimension("Y");
+    Dimension const& cdimZ = cs.getDimension("Z");
+    Dimension const& cdimIntensity = cs.getDimension("Intensity");
+    Dimension const& cdimRed = cs.getDimension("Red");
+    Dimension const& cdimGreen = cs.getDimension("Green");
+    Dimension const& cdimBlue = cs.getDimension("Blue");
+    //
+    // int X[] = { 49405730, 49413382, 49402110, 494192890, 49418622, 49403411 };
+    // int Y[] = { 487743335, 487743982, 487743983, 487744219, 487744254, 487745019 };
+    // int Z[] = { 13063, 13044, 13046, 13050, 13049, 13066 };
+    // int I[] = { 134, 75, 153, 93, 67, 167 };
+    // int R[] = { 142, 152, 146, 104, 113, 163 };
+    // int G[] = { 102, 108, 104, 96, 97, 118 };
+    // int B[] = { 137, 134, 140, 120, 123, 150 };
+    //
+    for (unsigned i = 0; i < candidate.getNumPoints(); ++i)
+    {
+        int32_t sx = source.getField<int32_t>(sdimX, i);
+        int32_t sy = source.getField<int32_t>(sdimY, i);
+        int32_t sz = source.getField<int32_t>(sdimZ, i);
+        uint16_t sintensity = source.getField<uint16_t>(sdimIntensity, i);
+        uint16_t sred = source.getField<uint16_t>(sdimRed, i);
+        uint16_t sgreen = source.getField<uint16_t>(sdimGreen, i);
+        uint16_t sblue = source.getField<uint16_t>(sdimBlue, i);
+
+        int32_t cx = candidate.getField<int32_t>(cdimX, i);
+        int32_t cy = candidate.getField<int32_t>(cdimY, i);
+        int32_t cz = candidate.getField<int32_t>(cdimZ, i);
+        uint16_t cintensity = candidate.getField<uint16_t>(cdimIntensity, i);
+        uint16_t cred = candidate.getField<uint16_t>(cdimRed, i);
+        uint16_t cgreen = candidate.getField<uint16_t>(cdimGreen, i);
+        uint16_t cblue = candidate.getField<uint16_t>(cdimBlue, i);
+
+
+        EXPECT_EQ(sx, cx);
+        EXPECT_EQ(sy, cy);
+        EXPECT_EQ(sz, cz);
+        EXPECT_EQ(sintensity, cintensity);
+        EXPECT_EQ(sred, cred);
+        EXPECT_EQ(sgreen, cgreen);
+        EXPECT_EQ(sblue, cblue);
+    }
+    delete iter_c;
+    delete iter_s;
+
+}
+**/
diff --git a/test/unit/filters/ColorizationFilterTest.cpp b/test/unit/filters/ColorizationFilterTest.cpp
new file mode 100644
index 0000000..bd1d888
--- /dev/null
+++ b/test/unit/filters/ColorizationFilterTest.cpp
@@ -0,0 +1,171 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <LasReader.hpp>
+#include <ColorizationFilter.hpp>
+#include <pdal/PointView.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+
+void testFile(const Options& filterOps, StringList dimNames,
+    uint16_t expectedRed, uint16_t expectedGreen, uint16_t expectedBlue)
+{
+    Options readerOps;
+    readerOps.add("filename",
+        Support::datapath("autzen/autzen-point-format-3.las"));
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    ColorizationFilter filter;
+    filter.setOptions(filterOps);
+    filter.setInput(reader);
+
+    PointTable table;
+
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    uint16_t r = view->getFieldAs<uint16_t>(
+        table.layout()->findDim(dimNames[0]), 0);
+    uint16_t g = view->getFieldAs<uint16_t>(
+        table.layout()->findDim(dimNames[1]), 0);
+    uint16_t b = view->getFieldAs<uint16_t>(
+        table.layout()->findDim(dimNames[2]), 0);
+
+    EXPECT_EQ(r, expectedRed);
+    EXPECT_EQ(g, expectedGreen);
+    // We scaled this up to 16bit by multiplying by 255
+    EXPECT_EQ(b, expectedBlue);
+}
+
+} // unnamed namespace
+
+// Test using the standard dimensions.
+TEST(ColorizationFilterTest, test1)
+{
+    Options options;
+
+    Option red("dimension", "Red");
+    Options subRed;
+    subRed.add("band", 1);
+    subRed.add("scale", 1.0f, "scale factor for this dimension");
+    red.setOptions(subRed);
+    options.add(red);
+
+    Option green("dimension", "Green");
+    Options subGreen;
+    subGreen.add("band", 2);
+    subGreen.add("scale", 1.0f, "scale factor for this dimension");
+    green.setOptions(subGreen);
+    options.add(green);
+
+    Option blue("dimension", "Blue", "");
+    Options subBlue;
+    subBlue.add("band", 3);
+    subBlue.add("scale", 255.0f, "scale factor for this dimension");
+    blue.setOptions(subBlue);
+    options.add(blue);
+
+    options.add("raster", Support::datapath("autzen/autzen.jpg"),
+        "raster to read");
+
+    StringList dims;
+    dims.push_back("Red");
+    dims.push_back("Green");
+    dims.push_back("Blue");
+    testFile(options, dims, 210, 205, 47175);
+}
+
+// Allow use of default dimensions.
+TEST(ColorizationFilterTest, test2)
+{
+    Options options;
+
+    options.add("raster", Support::datapath("autzen/autzen.jpg"),
+        "raster to read");
+
+    StringList dims;
+    dims.push_back("Red");
+    dims.push_back("Green");
+    dims.push_back("Blue");
+
+    testFile(options, dims, 210, 205, 185);
+}
+
+// Check that dimension creation works.
+TEST(ColorizationFilterTest, test3)
+{
+    Options options;
+
+    Option red("dimension", "Foo");
+    Options subRed;
+    subRed.add("band", 1);
+    subRed.add("scale", 1.0f, "scale factor for this dimension");
+    red.setOptions(subRed);
+    options.add(red);
+
+    Option green("dimension", "Bar");
+    Options subGreen;
+    subGreen.add("band", 2);
+    subGreen.add("scale", 1.0f, "scale factor for this dimension");
+    green.setOptions(subGreen);
+    options.add(green);
+
+    Option blue("dimension", "Baz", "");
+    Options subBlue;
+    subBlue.add("band", 3);
+    subBlue.add("scale", 255.0f, "scale factor for this dimension");
+    blue.setOptions(subBlue);
+    options.add(blue);
+
+    options.add("raster", Support::datapath("autzen/autzen.jpg"),
+        "raster to read");
+
+    StringList dims;
+    dims.push_back("Foo");
+    dims.push_back("Bar");
+    dims.push_back("Baz");
+    testFile(options, dims, 210, 205, 47175);
+}
+
diff --git a/test/unit/filters/CropFilterTest.cpp b/test/unit/filters/CropFilterTest.cpp
new file mode 100644
index 0000000..29829d0
--- /dev/null
+++ b/test/unit/filters/CropFilterTest.cpp
@@ -0,0 +1,243 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <CropFilter.hpp>
+#include <FauxReader.hpp>
+#include <LasReader.hpp>
+#include <ReprojectionFilter.hpp>
+#include <StatsFilter.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(CropFilterTest, create)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> filter(f.createStage("filters.crop"));
+    EXPECT_TRUE(filter.get());
+}
+
+TEST(CropFilterTest, test_crop)
+{
+    BOX3D srcBounds(0.0, 0.0, 0.0, 10.0, 100.0, 1000.0);
+    Options opts;
+    opts.add("bounds", srcBounds);
+    opts.add("num_points", 1000);
+    opts.add("mode", "ramp");
+    FauxReader reader;
+    reader.setOptions(opts);
+
+    // crop the window to 1/3rd the size in each dimension
+    BOX2D dstBounds(3.33333, 33.33333, 6.66666, 66.66666);
+    Options cropOpts;
+    cropOpts.add("bounds", dstBounds);
+
+    CropFilter filter;
+    filter.setOptions(cropOpts);
+    filter.setInput(reader);
+
+    Options statOpts;
+
+    StatsFilter stats;
+    stats.setOptions(statOpts);
+    stats.setInput(filter);
+
+    PointTable table;
+    stats.prepare(table);
+    PointViewSet viewSet = stats.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr buf = *viewSet.begin();
+
+    const stats::Summary& statsX = stats.getStats(Dimension::Id::X);
+    const stats::Summary& statsY = stats.getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = stats.getStats(Dimension::Id::Z);
+    EXPECT_EQ(buf->size(), 333u);
+
+    const double minX = statsX.minimum();
+    const double minY = statsY.minimum();
+    const double minZ = statsZ.minimum();
+    const double maxX = statsX.maximum();
+    const double maxY = statsY.maximum();
+    const double maxZ = statsZ.maximum();
+    const double avgX = statsX.average();
+    const double avgY = statsY.average();
+    const double avgZ = statsZ.average();
+
+    const double delX = 10.0 / 999.0 * 100.0;
+    const double delY = 100.0 / 999.0 * 100.0;
+    const double delZ = 1000.0 / 999.0 * 100.0;
+
+    EXPECT_NEAR(minX, 3.33333, delX);
+    EXPECT_NEAR(minY, 33.33333, delY);
+    EXPECT_NEAR(minZ, 333.33333, delZ);
+    EXPECT_NEAR(maxX, 6.66666, delX);
+    EXPECT_NEAR(maxY, 66.66666, delY);
+    EXPECT_NEAR(maxZ, 666.66666, delZ);
+    EXPECT_NEAR(avgX, 5.00000, delX);
+    EXPECT_NEAR(avgY, 50.00000, delY);
+    EXPECT_NEAR(avgZ, 500.00000, delZ);
+}
+
+
+TEST(CropFilterTest, test_crop_polygon)
+{
+#ifdef PDAL_HAVE_GEOS
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las"));
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    Options options;
+    Option debug("debug", true, "");
+    Option verbose("verbose", 9, "");
+
+    std::istream* wkt_stream =
+        FileUtils::openFile(Support::datapath("autzen/autzen-selection.wkt"));
+
+    std::stringstream strbuf;
+    strbuf << wkt_stream->rdbuf();
+
+    std::string wkt(strbuf.str());
+
+    Option polygon("polygon", wkt, "");
+    options.add(polygon);
+
+    CropFilter crop;
+    crop.setInput(reader);
+    crop.setOptions(options);
+
+    PointTable table;
+
+    crop.prepare(table);
+    PointViewSet viewSet = crop.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 47u);
+
+    FileUtils::closeFile(wkt_stream);
+#endif
+}
+
+TEST(CropFilterTest, test_crop_polygon_reprojection)
+{
+#ifdef PDAL_HAVE_GEOS
+    Options options;
+
+    Option in_srs("spatialreference",Support::datapath("autzen/autzen-srs.wkt"), "Input SRS");
+    Option out_srs("out_srs","EPSG:4326", "Output SRS to reproject to");
+    Option x_dim("x_dim", std::string("readers.las.X"),
+        "Dimension name to use for 'X' data");
+    Option y_dim("y_dim", std::string("readers.las.Y"),
+        "Dimension name to use for 'Y' data");
+    Option z_dim("z_dim", std::string("readers.las.Z"),
+        "Dimension name to use for 'Z' data");
+    Option x_scale("scale_x", 0.0000001f, "Scale for output X data "
+        "in the case when 'X' dimension data are to be scaled.  Defaults "
+        "to '1.0'.  If not set, the Dimensions's scale will be used");
+    Option y_scale("scale_y", 0.0000001f, "Scale for output Y data "
+        "in the case when 'Y' dimension data are to be scaled.  Defaults "
+        "to '1.0'.  If not set, the Dimensions's scale will be used");
+    Option filename("filename", Support::datapath("las/1.2-with-color.las"));
+    Option debug("debug", true, "");
+    Option verbose("verbose", 9, "");
+    // options.add(debug);
+    // options.add(verbose);
+    options.add(in_srs);
+    options.add(out_srs);
+    options.add(x_dim);
+    options.add(y_dim);
+    options.add(z_dim);
+    options.add(x_scale);
+    options.add(y_scale);
+    options.add(filename);
+
+    std::istream* wkt_stream = FileUtils::openFile(
+        Support::datapath("autzen/autzen-selection-dd.wkt"));
+    std::stringstream strbuf;
+    strbuf << wkt_stream->rdbuf();
+    std::string wkt(strbuf.str());
+    Option polygon("polygon", wkt, "");
+    options.add(polygon);
+
+    LasReader reader;
+    reader.setOptions(options);
+
+    ReprojectionFilter reprojection;
+    reprojection.setOptions(options);
+    reprojection.setInput(reader);
+
+    CropFilter crop;
+    crop.setOptions(options);
+    crop.setInput(reprojection);
+
+    PointTable table;
+    PointViewPtr view(new PointView(table));
+    crop.prepare(table);
+    PointViewSet viewSet = crop.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 47u);
+
+    FileUtils::closeFile(wkt_stream);
+#endif
+}
+
+/**
+TEST(CropFilterTest, multibounds)
+{
+    using namespace Dimension;
+
+    PointTable table;
+    table.layout->registerDim(Id::X);
+    table.layout->registerDim(Id::Y);
+    table.layout->registerDim(Id::Z);
+
+    PointView view(table);
+    view.setField(Id::X, 0, 1);
+    view.setField(Id::Y, 0, 1);
+
+    view.setField(Id::X, 1, 2);
+    view.setField(Id::Y, 1, 6);
+
+    view.setField(Id::X, 2, 4);
+    view.setField(Id::Y, 2, 4);
+
+    BOX3D p
+}
+**/
diff --git a/test/unit/filters/DecimationFilterTest.cpp b/test/unit/filters/DecimationFilterTest.cpp
new file mode 100644
index 0000000..2b267cb
--- /dev/null
+++ b/test/unit/filters/DecimationFilterTest.cpp
@@ -0,0 +1,84 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <DecimationFilter.hpp>
+#include <FauxReader.hpp>
+
+using namespace pdal;
+
+TEST(DecimationFilterTest, create)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> filter(f.createStage("filters.decimation"));
+    EXPECT_TRUE(filter.get());
+}
+
+TEST(DecimationFilterTest, DecimationFilterTest_test1)
+{
+    BOX3D srcBounds(0.0, 0.0, 0.0, 100.0, 100.0, 100.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "random");
+    ops.add("num_points", 30);
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options decimationOps;
+    decimationOps.add("step", 10);
+
+    DecimationFilter filter;
+    filter.setOptions(decimationOps);
+    filter.setInput(reader);
+
+    PointTable table;
+
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+
+    uint64_t t0 = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, 0);
+    uint64_t t1 = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, 1);
+    uint64_t t2 = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, 2);
+
+    EXPECT_EQ(t0, 0u);
+    EXPECT_EQ(t1, 10u);
+    EXPECT_EQ(t2, 20u);
+}
diff --git a/test/unit/filters/FerryFilterTest.cpp b/test/unit/filters/FerryFilterTest.cpp
new file mode 100644
index 0000000..57dba86
--- /dev/null
+++ b/test/unit/filters/FerryFilterTest.cpp
@@ -0,0 +1,108 @@
+/******************************************************************************
+* Copyright (c) 2014, Howard Butler (howard at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <FerryFilter.hpp>
+#include <LasReader.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(FerryFilterTest, create)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> filter(f.createStage("filters.ferry"));
+    EXPECT_TRUE(filter.get());
+}
+
+TEST(FerryFilterTest, test_ferry_copy)
+{
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(Support::configuredpath("filters/ferry.xml"));
+
+    mgr.execute();
+    ConstPointTableRef table(mgr.pointTable());
+
+    PointViewSet viewSet = mgr.views();
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1065u);
+
+    Dimension::Id::Enum state_plane_x = table.layout()->findDim("StatePlaneX");
+    Dimension::Id::Enum state_plane_y = table.layout()->findDim("StatePlaneY");
+
+    double lon = view->getFieldAs<double>(Dimension::Id::X, 0);
+    double lat = view->getFieldAs<double>(Dimension::Id::Y, 0);
+
+    double x = view->getFieldAs<double>(state_plane_x, 0);
+    double y = view->getFieldAs<double>(state_plane_y, 0);
+
+    EXPECT_DOUBLE_EQ(-117.2501328350574, lon);
+    EXPECT_DOUBLE_EQ(49.341077824192915, lat);
+    EXPECT_DOUBLE_EQ(637012.24, x);
+    EXPECT_DOUBLE_EQ(849028.31, y);
+}
+
+TEST(FerryFilterTest, test_ferry_invalid)
+{
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las"));
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    Options options;
+
+    Option x("dimension", "X", "");
+    Option toX("to","X", "");
+    Options xO;
+    xO.add(toX);
+    x.setOptions(xO);
+    options.add(x);
+
+    FerryFilter ferry;
+    ferry.setInput(reader);
+    ferry.setOptions(options);
+
+    PointTable table;
+
+    EXPECT_THROW(ferry.prepare(table), pdal_error);
+}
+
diff --git a/test/unit/filters/MergeTest.cpp b/test/unit/filters/MergeTest.cpp
new file mode 100644
index 0000000..bee0b74
--- /dev/null
+++ b/test/unit/filters/MergeTest.cpp
@@ -0,0 +1,56 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc., hobu.inc at gmail.com
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+
+#include "Support.hpp"
+
+TEST(MergeTest, test1)
+{
+    using namespace pdal;
+
+    PipelineManager mgr;
+    PipelineReader specReader(mgr);
+    specReader.readPipeline(Support::configuredpath("filters/merge.xml"));
+    mgr.execute();
+
+    PointViewSet viewSet = mgr.views();
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 2130u);
+}
diff --git a/test/unit/filters/RangeFilterTest.cpp b/test/unit/filters/RangeFilterTest.cpp
new file mode 100644
index 0000000..a57fc45
--- /dev/null
+++ b/test/unit/filters/RangeFilterTest.cpp
@@ -0,0 +1,310 @@
+/******************************************************************************
+* Copyright (c) 2015, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <FauxReader.hpp>
+#include <RangeFilter.hpp>
+
+using namespace pdal;
+
+TEST(RangeFilterTest, createStage)
+{
+    StageFactory f;
+    std::shared_ptr<Stage> filter(f.createStage("filters.range"));
+    EXPECT_TRUE(filter.get());
+}
+
+TEST(RangeFilterTest, noDimension)
+{
+    RangeFilter filter;
+
+    PointTable table;
+    EXPECT_THROW(filter.prepare(table), pdal_error);
+}
+
+TEST(RangeFilterTest, noRange)
+{
+    Options rangeOps;
+    rangeOps.add("dimension", "Z");
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+
+    PointTable table;
+    EXPECT_THROW(filter.prepare(table), pdal_error);
+}
+
+TEST(RangeFilterTest, singleDimension)
+{
+    BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options range;
+    range.add("min", 4);
+    range.add("max", 6);
+
+    Option dim("dimension", "Z");
+    dim.setOptions(range);
+
+    Options rangeOps;
+    rangeOps.add(dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(3u, view->size());
+    EXPECT_FLOAT_EQ(4.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+}
+
+TEST(RangeFilterTest, multipleDimensions)
+{
+    BOX3D srcBounds(0.0, 1.0, 1.0, 0.0, 10.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options y_range;
+    y_range.add("min", 4);
+    y_range.add("max", 6);
+
+    Option y_dim("dimension", "Y");
+    y_dim.setOptions(y_range);
+
+    Options z_range;
+    z_range.add("min", 4);
+    z_range.add("max", 6);
+
+    Option z_dim("dimension", "Z");
+    z_dim.setOptions(z_range);
+
+    Options rangeOps;
+    rangeOps.add(y_dim);
+    rangeOps.add(z_dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(3u, view->size());
+    EXPECT_FLOAT_EQ(4.0, view->getFieldAs<double>(Dimension::Id::Y, 0));
+    EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Y, 1));
+    EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Y, 2));
+    EXPECT_FLOAT_EQ(4.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+}
+
+TEST(RangeFilterTest, onlyMin)
+{
+    BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options range;
+    range.add("min", 6);
+
+    Option dim("dimension", "Z");
+    dim.setOptions(range);
+
+    Options rangeOps;
+    rangeOps.add(dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(5u, view->size());
+    EXPECT_FLOAT_EQ(6.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(7.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(8.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+    EXPECT_FLOAT_EQ(9.0, view->getFieldAs<double>(Dimension::Id::Z, 3));
+    EXPECT_FLOAT_EQ(10.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
+}
+
+TEST(RangeFilterTest, onlyMax)
+{
+    BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    StageFactory f;
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options range;
+    range.add("max", 5);
+
+    Option dim("dimension", "Z");
+    dim.setOptions(range);
+
+    Options rangeOps;
+    rangeOps.add(dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(5u, view->size());
+    EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(2.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(3.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+    EXPECT_FLOAT_EQ(4.0, view->getFieldAs<double>(Dimension::Id::Z, 3));
+    EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 4));
+}
+
+
+TEST(RangeFilterTest, equals)
+{
+    BOX3D srcBounds(0.0, 0.0, 1.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 10);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options range;
+    range.add("equals", 5);
+
+    Option dim("dimension", "Z");
+    dim.setOptions(range);
+
+    Options rangeOps;
+    rangeOps.add(dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(1u, view->size());
+    EXPECT_FLOAT_EQ(5.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+}
+
+TEST(RangeFilterTest, negativeValues)
+{
+    BOX3D srcBounds(0.0, 0.0, -10.0, 0.0, 0.0, 10.0);
+
+    Options ops;
+    ops.add("bounds", srcBounds);
+    ops.add("mode", "ramp");
+    ops.add("num_points", 21);
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options range;
+    range.add("min", -1);
+    range.add("max", 1);
+
+    Option dim("dimension", "Z");
+    dim.setOptions(range);
+
+    Options rangeOps;
+    rangeOps.add(dim);
+
+    RangeFilter filter;
+    filter.setOptions(rangeOps);
+    filter.setInput(reader);
+
+    PointTable table;
+    filter.prepare(table);
+    PointViewSet viewSet = filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1u, viewSet.size());
+    EXPECT_EQ(3u, view->size());
+    EXPECT_FLOAT_EQ(-1.0, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_FLOAT_EQ(0.0, view->getFieldAs<double>(Dimension::Id::Z, 1));
+    EXPECT_FLOAT_EQ(1.0, view->getFieldAs<double>(Dimension::Id::Z, 2));
+}
+
diff --git a/test/unit/filters/ReprojectionFilterTest.cpp b/test/unit/filters/ReprojectionFilterTest.cpp
new file mode 100644
index 0000000..52fa05b
--- /dev/null
+++ b/test/unit/filters/ReprojectionFilterTest.cpp
@@ -0,0 +1,159 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc.
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/SpatialReference.hpp>
+#include <LasReader.hpp>
+#include <ReprojectionFilter.hpp>
+#include <pdal/PointView.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+
+#if defined(PDAL_HAVE_GEOS) && defined(PDAL_HAVE_LIBGEOTIFF)
+void getPoint(const PointView& data, double& x, double& y, double& z)
+{
+    x = data.getFieldAs<double>(Dimension::Id::X, 0);
+    y = data.getFieldAs<double>(Dimension::Id::Y, 0);
+    z = data.getFieldAs<double>(Dimension::Id::Z, 0);
+}
+#endif
+
+} // unnamed namespace
+
+
+#if defined(PDAL_HAVE_GEOS) && defined(PDAL_HAVE_LIBGEOTIFF)
+// Test reprojecting UTM 15 to DD with a filter
+TEST(ReprojectionFilterTest, ReprojectionFilterTest_test_1)
+{
+    const char* epsg4326_wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]";
+
+    PointTable table;
+
+    const double postX = -93.351563;
+    const double postY = 41.577148;
+    const double postZ = 16.000000;
+
+    {
+        const SpatialReference out_ref(epsg4326_wkt);
+
+        Options ops1;
+        ops1.add("filename", Support::datapath("las/utm15.las"));
+        LasReader reader;
+        reader.setOptions(ops1);
+
+        Options options;
+        Option debug("debug", true, "");
+        Option verbose("verbose", 9, "");
+        Option out_srs("out_srs", out_ref.getWKT(),
+            "Output SRS to reproject to");
+        options.add(out_srs);
+
+        ReprojectionFilter reprojectionFilter;
+        reprojectionFilter.setOptions(options);
+        reprojectionFilter.setInput(reader);
+
+        reprojectionFilter.prepare(table);
+        PointViewSet viewSet = reprojectionFilter.execute(table);
+        EXPECT_EQ(viewSet.size(), 1u);
+        PointViewPtr view = *viewSet.begin();
+
+        double x, y, z;
+        getPoint(*view.get(), x, y, z);
+
+        EXPECT_FLOAT_EQ(x, postX);
+        EXPECT_FLOAT_EQ(y, postY);
+        EXPECT_FLOAT_EQ(z, postZ);
+    }
+}
+#endif
+
+
+/**
+ This test would pass but for the strange scaling of the dimension, which
+ exceeds an integer.
+
+// Test reprojecting UTM 15 to DD with a filter randomly
+TEST(ReprojectionFilterTest, InPlaceReprojectionFilterTest_test_2)
+{
+    const char* epsg4326_wkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]";
+
+    const double postX = 194161.33;
+    const double postY = 258783.820;
+    const double postZ = 131.570;
+
+    {
+        PointTable table;
+
+        const SpatialReference out_ref(epsg4326_wkt);
+
+        Options options;
+
+        Option debug("debug", true, "");
+        Option verbose("verbose", 9, "");
+        Option out_srs("out_srs","EPSG:2993", "Output SRS to reproject to");
+
+        Option filename("filename",
+            Support::datapath("las/autzen-dd.las"), "filename");
+        options.add(out_srs);
+        options.add(filename);
+
+        LasReader reader(options);
+        ReprojectionFilter reprojectionFilter(options);
+        reprojectionFilter.setInput(&reader);
+        reprojectionFilter.prepare(table);
+
+        PointView view(table);
+        StageSequentialIterator* iter = reader.createSequentialIterator();
+
+        point_count_t numRead = iter->read(view, 1);
+        EXPECT_TRUE(numRead == 1);
+
+        FilterWrapper::ready(&reprojectionFilter, table);
+        FilterWrapper::filter(&reprojectionFilter, view);
+
+        double x, y, z;
+        getPoint(view, x, y, z);
+        EXPECT_FLOAT_EQ(x, postX);
+        EXPECT_FLOAT_EQ(y, postY);
+        EXPECT_FLOAT_EQ(z, postZ);
+        delete iter;
+    }
+}
+**/
diff --git a/test/unit/filters/SortFilterTest.cpp b/test/unit/filters/SortFilterTest.cpp
new file mode 100644
index 0000000..d7e289f
--- /dev/null
+++ b/test/unit/filters/SortFilterTest.cpp
@@ -0,0 +1,112 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <random>
+
+#include <SortFilter.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/StageWrapper.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+
+void doSort(point_count_t count)
+{
+    Options opts;
+
+    opts.add("dimension", "X");
+
+    SortFilter filter;
+    filter.setOptions(opts);
+
+    PointTable table;
+    PointViewPtr view(new PointView(table));
+
+    table.layout()->registerDim(Dimension::Id::X);
+
+    std::default_random_engine generator;
+    std::uniform_real_distribution<double> dist(0.0, (double)count);
+
+    for (PointId i = 0; i < count; ++i)
+        view->setField(Dimension::Id::X, i, dist(generator));
+
+    filter.prepare(table);
+    FilterWrapper::ready(filter, table);
+    FilterWrapper::filter(filter, *view.get());
+    FilterWrapper::done(filter, table);
+
+    EXPECT_EQ(count, view->size());
+    for (PointId i = 1; i < count; ++i)
+    {
+        double d1 = view->getFieldAs<double>(Dimension::Id::X, i - 1);
+        double d2 = view->getFieldAs<double>(Dimension::Id::X, i);
+        EXPECT_TRUE(d1 <= d2);
+    }
+}
+
+} // unnamed namespace
+
+TEST(SortFilterTest, simple)
+{
+    point_count_t inc = 1;
+    for (point_count_t count = 3; count < 100000; count += inc, inc *= 2)
+        doSort(count);
+}
+
+TEST(SortFilterTest, pipeline)
+{
+    PipelineManager mgr;
+    PipelineReader reader(mgr);
+
+    reader.readPipeline(Support::configuredpath("filters/sort.xml"));
+    mgr.execute();
+
+    PointViewSet viewSet = mgr.views();
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    for (PointId i = 1; i < view->size(); ++i)
+    {
+        double d1 = view->getFieldAs<double>(Dimension::Id::X, i - 1);
+        double d2 = view->getFieldAs<double>(Dimension::Id::X, i);
+        EXPECT_TRUE(d1 <= d2);
+    }
+}
diff --git a/test/unit/filters/SplitterTest.cpp b/test/unit/filters/SplitterTest.cpp
new file mode 100644
index 0000000..cb745ed
--- /dev/null
+++ b/test/unit/filters/SplitterTest.cpp
@@ -0,0 +1,103 @@
+/******************************************************************************
+* Copyright (c) 2014, Bradley J Chambers (brad.chambers at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/StageFactory.hpp>
+#include <pdal/StageWrapper.hpp>
+#include <LasReader.hpp>
+#include <SplitterFilter.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(SplitterTest, test_tile_filter)
+{
+    StageFactory f;
+
+    // create the reader
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las"));
+    LasReader r;
+    r.setOptions(ops1);
+
+    Options o;
+    Option length("length", 1000, "length");
+    o.add(length);
+
+    // create the tile filter and prepare
+    SplitterFilter s;
+    s.setOptions(o);
+    s.setInput(r);
+
+    PointTable table;
+    PointViewPtr view(new PointView(table));
+    s.prepare(table);
+
+    StageWrapper::ready(r, table);
+    PointViewSet viewSet = StageWrapper::run(r, view);
+    StageWrapper::done(r, table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    view = *viewSet.begin();
+
+    StageWrapper::ready(s, table);
+    viewSet = StageWrapper::run(s, view);
+    StageWrapper::done(s, table);
+
+    std::vector<PointViewPtr> views;
+    for (auto it = viewSet.begin(); it != viewSet.end(); ++it)
+        views.push_back(*it);
+
+    auto sorter = [](PointViewPtr p1, PointViewPtr p2)
+    {
+        BOX2D b1, b2;
+
+        p1->calculateBounds(b1);
+        p2->calculateBounds(b2);
+
+        return b1.minx < b2.minx ?  true :
+            b1.minx > b2.minx ? false :
+            b1.miny < b2.miny;
+    };
+    std::sort(views.begin(), views.end(), sorter);
+
+    EXPECT_EQ(views.size(), 15u);
+    size_t counts[] = {24, 27, 26, 27, 10, 166, 142, 76, 141, 132, 63, 70, 67,
+        34, 60 };
+    for (size_t i = 0; i < views.size(); ++i)
+    {
+        PointViewPtr view = views[i];
+        EXPECT_EQ(view->size(), counts[i]);
+    }
+}
diff --git a/test/unit/filters/StatsFilterTest.cpp b/test/unit/filters/StatsFilterTest.cpp
new file mode 100644
index 0000000..901d142
--- /dev/null
+++ b/test/unit/filters/StatsFilterTest.cpp
@@ -0,0 +1,229 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PDALUtils.hpp>
+#include <pdal/StageFactory.hpp>
+#include <FauxReader.hpp>
+#include <StatsFilter.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+TEST(Stats, simple)
+{
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 1000);
+    ops.add("mode", "constant");
+
+    StageFactory f;
+
+    std::unique_ptr<Stage> reader(f.createStage("readers.faux"));
+    EXPECT_TRUE(reader.get());
+    reader->setOptions(ops);
+
+    StatsFilter filter;
+    filter.setInput(*reader);
+    EXPECT_EQ(filter.getName(), "filters.stats");
+
+    PointTable table;
+    filter.prepare(table);
+    filter.execute(table);
+
+    const stats::Summary& statsX = filter.getStats(Dimension::Id::X);
+    const stats::Summary& statsY = filter.getStats(Dimension::Id::Y);
+    const stats::Summary& statsZ = filter.getStats(Dimension::Id::Z);
+
+    EXPECT_EQ(statsX.count(), 1000u);
+    EXPECT_EQ(statsY.count(), 1000u);
+    EXPECT_EQ(statsZ.count(), 1000u);
+
+    EXPECT_FLOAT_EQ(statsX.minimum(), 1.0);
+    EXPECT_FLOAT_EQ(statsY.minimum(), 2.0);
+    EXPECT_FLOAT_EQ(statsZ.minimum(), 3.0);
+
+    EXPECT_FLOAT_EQ(statsX.maximum(), 1.0);
+    EXPECT_FLOAT_EQ(statsY.maximum(), 2.0);
+    EXPECT_FLOAT_EQ(statsZ.maximum(), 3.0);
+
+    EXPECT_FLOAT_EQ(statsX.average(), 1.0);
+    EXPECT_FLOAT_EQ(statsY.average(), 2.0);
+    EXPECT_FLOAT_EQ(statsZ.average(), 3.0);
+}
+
+
+TEST(Stats, dimset)
+{
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 1000);
+    ops.add("mode", "constant");
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader(f.createStage("readers.faux"));
+    EXPECT_TRUE(reader.get());
+    reader->setOptions(ops);
+
+    Options filterOps;
+    filterOps.add("dimensions", " , X, Z ");
+    StatsFilter filter;
+    filter.setInput(*reader);
+    filter.setOptions(filterOps);
+    EXPECT_EQ(filter.getName(), "filters.stats");
+
+    PointTable table;
+    filter.prepare(table);
+    filter.execute(table);
+
+    const stats::Summary& statsX = filter.getStats(Dimension::Id::X);
+    EXPECT_THROW(filter.getStats(Dimension::Id::Y), pdal_error);
+    const stats::Summary& statsZ = filter.getStats(Dimension::Id::Z);
+
+    EXPECT_EQ(statsX.count(), 1000u);
+    EXPECT_EQ(statsZ.count(), 1000u);
+
+    EXPECT_FLOAT_EQ(statsX.minimum(), 1.0);
+    EXPECT_FLOAT_EQ(statsZ.minimum(), 3.0);
+
+    EXPECT_FLOAT_EQ(statsX.maximum(), 1.0);
+    EXPECT_FLOAT_EQ(statsZ.maximum(), 3.0);
+
+    EXPECT_FLOAT_EQ(statsX.average(), 1.0);
+    EXPECT_FLOAT_EQ(statsZ.average(), 3.0);
+}
+
+
+TEST(Stats, metadata)
+{
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 1000);
+    ops.add("mode", "constant");
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader(f.createStage("readers.faux"));
+    EXPECT_TRUE(reader.get());
+    reader->setOptions(ops);
+
+    Options filterOps;
+    filterOps.add("dimensions", " , X, Z ");
+    StatsFilter filter;
+    filter.setInput(*reader);
+    filter.setOptions(filterOps);
+
+    PointTable table;
+    filter.prepare(table);
+    filter.execute(table);
+    MetadataNode m = filter.getMetadata();
+    std::vector<MetadataNode> children = m.children("statistic");
+
+    auto findNode = [](MetadataNode m,
+        const std::string name, const std::string val)
+    {
+        auto findNameVal = [name, val](MetadataNode m)
+            { return (m.name() == name && m.value() == val); };
+
+        return m.find(findNameVal);
+    };
+
+    for (auto mi = children.begin(); mi != children.end(); ++mi)
+    {
+        if (findNode(*mi, "name", "X").valid())
+        {
+            EXPECT_EQ(mi->findChild("average").value(), "1");
+            EXPECT_EQ(mi->findChild("minimum").value(), "1");
+            EXPECT_EQ(mi->findChild("maximum").value(), "1");
+            EXPECT_EQ(mi->findChild("count").value(), "1000");
+        }
+        if (findNode(*mi, "name", "Z").valid())
+        {
+            EXPECT_EQ(mi->findChild("average").value(), "3");
+            EXPECT_EQ(mi->findChild("minimum").value(), "3");
+            EXPECT_EQ(mi->findChild("maximum").value(), "3");
+            EXPECT_EQ(mi->findChild("count").value(), "1000");
+        }
+    }
+}
+
+
+TEST(Stats, enum)
+{
+    BOX3D bounds(1.0, 0.0, 0.0, 10.0, 100.0, 1000.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 10);
+    ops.add("mode", "ramp");
+
+    FauxReader reader;
+    reader.setOptions(ops);
+
+    Options filterOps;
+    filterOps.add("dimensions", "X, Y, Z");
+    filterOps.add("enumerate", "X");
+    filterOps.add("count", "Y");
+
+    StatsFilter filter;
+    filter.setInput(reader);
+    filter.setOptions(filterOps);
+
+    PointTable table;
+    filter.prepare(table);
+    filter.execute(table);
+
+    const stats::Summary& statsX = filter.getStats(Dimension::Id::X);
+    const stats::Summary::EnumMap& values = statsX.values();
+    EXPECT_EQ(values.size(), 10U);
+    double d = 1.0;
+    for (auto& v : values)
+    {
+        EXPECT_DOUBLE_EQ(d, v.first);
+        d += 1.0;
+    }
+
+    const stats::Summary& statsY = filter.getStats(Dimension::Id::Y);
+    const stats::Summary::EnumMap& yValues = statsY.values();
+    d = 0.0;
+    for (auto& v : yValues)
+    {
+        EXPECT_DOUBLE_EQ(d, v.first);
+        EXPECT_EQ(1u, v.second);
+        d += (100.0 / 9);
+    }
+}
diff --git a/test/unit/filters/TransformationFilterTest.cpp b/test/unit/filters/TransformationFilterTest.cpp
new file mode 100644
index 0000000..92f2b83
--- /dev/null
+++ b/test/unit/filters/TransformationFilterTest.cpp
@@ -0,0 +1,174 @@
+/******************************************************************************
+* Copyright (c) 2014, Pete Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+#include <FauxReader.hpp>
+#include <TransformationFilter.hpp>
+
+#include <pdal/StageFactory.hpp>
+
+
+namespace pdal
+{
+
+
+class TransformationFilterTest : public ::testing::Test
+{
+public:
+    virtual void SetUp()
+    {
+        StageFactory f;
+
+        BOX3D bounds(1, 2, 3, 4, 5, 6);
+        Options readerOpts;
+        readerOpts.add("mode", "constant");
+        readerOpts.add("num_points", 3);
+        readerOpts.add("bounds", bounds);
+        m_reader.setOptions(readerOpts);
+        m_filter.setInput(m_reader);
+    }
+
+    FauxReader m_reader;
+    TransformationFilter m_filter;
+};
+
+
+TEST(TransformationMatrix, create)
+{
+    StageFactory f;
+    std::unique_ptr<Stage> filter(f.createStage("filters.transformation"));
+    EXPECT_TRUE(filter.get());
+}
+
+
+TEST(TransformationMatrix, FromString)
+{
+    std::string s = "1 0 0 0\n0 1 0 0\n0 0 1 0\n0 0 0 1";
+    TransformationMatrix m = transformationMatrixFromString(s);
+    EXPECT_DOUBLE_EQ(1, m[0]);
+    EXPECT_DOUBLE_EQ(0, m[1]);
+    EXPECT_DOUBLE_EQ(0, m[2]);
+    EXPECT_DOUBLE_EQ(0, m[3]);
+    EXPECT_DOUBLE_EQ(0, m[4]);
+    EXPECT_DOUBLE_EQ(1, m[5]);
+    EXPECT_DOUBLE_EQ(0, m[6]);
+    EXPECT_DOUBLE_EQ(0, m[7]);
+    EXPECT_DOUBLE_EQ(0, m[8]);
+    EXPECT_DOUBLE_EQ(0, m[9]);
+    EXPECT_DOUBLE_EQ(1, m[10]);
+    EXPECT_DOUBLE_EQ(0, m[11]);
+    EXPECT_DOUBLE_EQ(0, m[12]);
+    EXPECT_DOUBLE_EQ(0, m[13]);
+    EXPECT_DOUBLE_EQ(0, m[14]);
+    EXPECT_DOUBLE_EQ(1, m[15]);
+}
+
+
+TEST(TransformationMatrix, TooShort)
+{
+    std::string s = "1 0 0 0\n0 1 0 0\n0 0 1 0\n0 0 0";
+    EXPECT_THROW(transformationMatrixFromString(s), pdal_error);
+}
+
+
+TEST(TransformationMatrix, TooLong)
+{
+    std::string s = "1 0 0 0\n0 1 0 0\n0 0 1 0\n0 0 0 1 0";
+    EXPECT_THROW(transformationMatrixFromString(s), pdal_error);
+}
+
+
+TEST_F(TransformationFilterTest, NoChange)
+{
+    Options filterOpts;
+    filterOpts.add("matrix", "1 0 0 0\n0 1 0 0\n0 0 1 0\n0 0 0 1");
+    m_filter.setOptions(filterOpts);
+
+    PointTable table;
+    m_filter.prepare(table);
+    PointViewSet viewSet = m_filter.execute(table);
+    EXPECT_EQ(1u, viewSet.size());
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(3u, view->size());
+
+    for (point_count_t i = 0; i < view->size(); ++i)
+    {
+        EXPECT_DOUBLE_EQ(1, view->getFieldAs<double>(Dimension::Id::X, i));
+        EXPECT_DOUBLE_EQ(2, view->getFieldAs<double>(Dimension::Id::Y, i));
+        EXPECT_DOUBLE_EQ(3, view->getFieldAs<double>(Dimension::Id::Z, i));
+    }
+}
+
+
+TEST_F(TransformationFilterTest, Translation)
+{
+    Options filterOpts;
+    filterOpts.add("matrix", "1 0 0 1\n0 1 0 2\n0 0 1 3\n0 0 0 1");
+    m_filter.setOptions(filterOpts);
+
+    PointTable table;
+    m_filter.prepare(table);
+    PointViewSet viewSet = m_filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    for (point_count_t i = 0; i < view->size(); ++i)
+    {
+        EXPECT_DOUBLE_EQ(2, view->getFieldAs<double>(Dimension::Id::X, i));
+        EXPECT_DOUBLE_EQ(4, view->getFieldAs<double>(Dimension::Id::Y, i));
+        EXPECT_DOUBLE_EQ(6, view->getFieldAs<double>(Dimension::Id::Z, i));
+    }
+}
+
+
+TEST_F(TransformationFilterTest, Rotation)
+{
+    Options filterOpts;
+    filterOpts.add("matrix", "0 1 0 0\n-1 0 0 0\n0 0 1 0\n0 0 0 1");
+    m_filter.setOptions(filterOpts);
+
+    PointTable table;
+    m_filter.prepare(table);
+    PointViewSet viewSet = m_filter.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    for (point_count_t i = 0; i < view->size(); ++i)
+    {
+        EXPECT_DOUBLE_EQ(2, view->getFieldAs<double>(Dimension::Id::X, i));
+        EXPECT_DOUBLE_EQ(-1, view->getFieldAs<double>(Dimension::Id::Y, i));
+        EXPECT_DOUBLE_EQ(3, view->getFieldAs<double>(Dimension::Id::Z, i));
+    }
+}
+
+
+}
diff --git a/test/unit/io/bpf/BPFTest.cpp b/test/unit/io/bpf/BPFTest.cpp
new file mode 100644
index 0000000..7fcc40a
--- /dev/null
+++ b/test/unit/io/bpf/BPFTest.cpp
@@ -0,0 +1,555 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <string.h>
+
+#include <pdal/BufferReader.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PointView.hpp>
+#include <pdal/util/Utils.hpp>
+#include <pdal/util/FileUtils.hpp>
+
+#include <BpfReader.hpp>
+#include <BpfWriter.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace
+{
+
+template<typename LeftIter, typename RightIter>
+::testing::AssertionResult CheckEqualCollections(
+    LeftIter left_begin, LeftIter left_end, RightIter right_begin)
+{
+    bool equal(true);
+    std::string message;
+    size_t index(0);
+    while (left_begin != left_end)
+    {
+        if (*left_begin++ != *right_begin++)
+        {
+            equal = false;
+            message += "\n\tMismatch at index " + std::to_string(index);
+        }
+        ++index;
+    }
+    if (message.size())
+        message += "\n\t";
+    return equal ? ::testing::AssertionSuccess() :
+        ::testing::AssertionFailure() << message;
+}
+
+void test_file_type(const std::string& filename)
+{
+    PointTable table;
+
+    Options ops;
+
+    ops.add("filename", filename);
+    ops.add("count", 506);
+    std::shared_ptr<BpfReader> reader(new BpfReader);
+    reader->setOptions(ops);
+
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 506u);
+
+    struct PtData
+    {
+        float x;
+        float y;
+        float z;
+    };
+
+    PtData pts2[3] = { {494057.312f, 4877433.5f, 130.630005f},
+                       {494133.812f, 4877440.0f, 130.440002f},
+                       {494021.094f, 4877440.0f, 130.460007f} };
+
+    for (int i = 0; i < 3; ++i)
+    {
+        float x = view->getFieldAs<float>(Dimension::Id::X, i);
+        float y = view->getFieldAs<float>(Dimension::Id::Y, i);
+        float z = view->getFieldAs<float>(Dimension::Id::Z, i);
+
+        EXPECT_FLOAT_EQ(x, pts2[i].x);
+        EXPECT_FLOAT_EQ(y, pts2[i].y);
+        EXPECT_FLOAT_EQ(z, pts2[i].z);
+    }
+
+    PtData pts[3] = { {494915.25f, 4878096.5f, 128.220001f},
+                      {494917.062f, 4878124.5f, 128.539993f},
+                      {494920.781f, 4877914.5f, 127.43f} };
+
+    for (int i = 503; i < 3; ++i)
+    {
+        float x = view->getFieldAs<float>(Dimension::Id::X, i);
+        float y = view->getFieldAs<float>(Dimension::Id::Y, i);
+        float z = view->getFieldAs<float>(Dimension::Id::Z, i);
+
+        EXPECT_FLOAT_EQ(x, pts[i].x);
+        EXPECT_FLOAT_EQ(y, pts[i].y);
+        EXPECT_FLOAT_EQ(z, pts[i].z);
+    }
+}
+
+void test_roundtrip(Options& writerOps)
+{
+    std::string infile(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-interleaved.bpf"));
+    std::string outfile(Support::temppath("tmp.bpf"));
+
+    PointTable table;
+
+    Options readerOps;
+
+    readerOps.add("filename", infile);
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    writerOps.add("filename", outfile);
+    BpfWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader);
+
+    FileUtils::deleteFile(outfile);
+    writer.prepare(table);
+    writer.execute(table);
+
+    test_file_type(outfile);
+}
+
+
+} //namespace
+
+TEST(BPFTest, test_point_major)
+{
+    test_file_type(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-interleaved.bpf"));
+}
+
+TEST(BPFTest, test_dim_major)
+{
+    test_file_type(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3.bpf"));
+}
+
+TEST(BPFTest, test_byte_major)
+{
+    test_file_type(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-segregated.bpf"));
+}
+
+TEST(BPFTest, test_point_major_zlib)
+{
+    test_file_type(
+        Support::datapath("bpf/"
+            "autzen-utm-chipped-25-v3-deflate-interleaved.bpf"));
+}
+
+TEST(BPFTest, test_dim_major_zlib)
+{
+    test_file_type(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-deflate.bpf"));
+}
+
+TEST(BPFTest, test_byte_major_zlib)
+{
+    test_file_type(
+        Support::datapath("bpf/"
+            "autzen-utm-chipped-25-v3-deflate-segregated.bpf"));
+}
+
+TEST(BPFTest, roundtrip_byte)
+{
+    Options ops;
+
+    ops.add("format", "BYTE");
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_dimension)
+{
+    Options ops;
+
+    ops.add("format", "DIMENSION");
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_point)
+{
+    Options ops;
+
+    ops.add("format", "POINT");
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_byte_compression)
+{
+    Options ops;
+
+    ops.add("format", "BYTE");
+    ops.add("compression", true);
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_dimension_compression)
+{
+    Options ops;
+
+    ops.add("format", "DIMENSION");
+    ops.add("compression", true);
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_point_compression)
+{
+    Options ops;
+
+    ops.add("format", "POINT");
+    ops.add("compression", true);
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, roundtrip_scaling)
+{
+    Options ops;
+
+    ops.add("format", "POINT");
+    ops.add("offset_x", 494000.0);
+    ops.add("offset_y", 487000.0);
+    ops.add("offset_z", 130.0);
+    ops.add("scale_x", .001);
+    ops.add("scale_y", .01);
+    ops.add("scale_z", 10.0);
+    test_roundtrip(ops);
+}
+
+TEST(BPFTest, extra_bytes)
+{
+    std::string infile(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-interleaved.bpf"));
+    std::string outfile(Support::temppath("tmp.bpf"));
+
+    PointTable table;
+
+    Options readerOps;
+    readerOps.add("filename", infile);
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    const unsigned char buf[] = "This is a test.";
+
+    Options writerOps;
+    writerOps.add("filename", outfile);
+    writerOps.add("header_data", Utils::base64_encode(buf, sizeof(buf)));
+    BpfWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader);
+
+    FileUtils::deleteFile(outfile);
+    writer.prepare(table);
+    writer.execute(table);
+
+    test_file_type(outfile);
+
+    Options readerOps2;
+    readerOps2.add("filename", outfile);
+
+    PointTable table2;
+    BpfReader reader2;
+    reader2.setOptions(readerOps2);
+    reader2.prepare(table2);
+    reader2.execute(table2);
+    MetadataNode n = reader2.getMetadata();
+    std::vector<uint8_t> outbuf =
+        Utils::base64_decode(n.findChild("header_data").value());
+    EXPECT_EQ(memcmp(outbuf.data(), buf, sizeof(buf)), 0);
+}
+
+TEST(BPFTest, bundled)
+{
+    std::string infile(
+        Support::datapath("bpf/autzen-utm-chipped-25-v3-interleaved.bpf"));
+    std::string outfile(Support::temppath("tmp.bpf"));
+
+    PointTable table;
+
+    Options readerOps;
+    readerOps.add("filename", infile);
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    Options writerOps;
+    writerOps.add("filename", outfile);
+    writerOps.add("bundledfile", Support::datapath("bpf/bundle1"));
+    writerOps.add("bundledfile", Support::datapath("bpf/bundle2"));
+
+    BpfWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader);
+
+    FileUtils::deleteFile(outfile);
+    writer.prepare(table);
+    writer.execute(table);
+
+    test_file_type(outfile);
+
+    Options readerOps2;
+    readerOps2.add("filename", outfile);
+
+    PointTable table2;
+    BpfReader reader2;
+    reader2.setOptions(readerOps2);
+    reader2.prepare(table2);
+    reader2.execute(table2);
+    MetadataNode n = reader2.getMetadata();
+    std::vector<uint8_t> outbuf;
+    outbuf = Utils::base64_decode(n.findChild("bundle1").value());
+    EXPECT_EQ(memcmp(outbuf.data(), "This is a test",
+        outbuf.size() - 1), 0);
+    outbuf = Utils::base64_decode(n.findChild("bundle2").value());
+    EXPECT_EQ(memcmp(outbuf.data(), "This is another test",
+        outbuf.size() - 1), 0);
+}
+
+TEST(BPFTest, inspect)
+{
+    Options ops;
+    ops.add("filename", Support::datapath("bpf/autzen-dd.bpf"));
+
+    BpfReader reader;
+    reader.setOptions(ops);
+
+    QuickInfo qi = reader.preview();
+
+    std::string testWkt = "PROJCS[\"WGS 84 / SCAR IMW ST05-08\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Lambert_Conformal_Conic_2SP\"],PARAMETER[\"standard_parallel_1\",-76.66666666666667],PARAMETER[\"standard_parallel_2\",-79.33333 [...]
+    EXPECT_EQ(qi.m_srs.getWKT(), testWkt);
+
+    EXPECT_EQ(qi.m_pointCount, 1065u);
+
+    BOX3D bounds(
+        -13676090.610841721296, 4894836.9556098170578, 123.93000030517578125,
+        -13674705.011110275984, 4896224.6888861842453, 178.7299957275390625);
+    EXPECT_EQ(qi.m_bounds, bounds);
+
+    const char *dims[] =
+    {
+        "Blue",
+        "Classification",
+        "GPSTime",
+        "Green",
+        "Intensity",
+        "Number of Returns",
+        "Red",
+        "Return Information",
+        "Return Number",
+        "X",
+        "Y",
+        "Z"
+    };
+
+    std::sort(qi.m_dimNames.begin(), qi.m_dimNames.end());
+    EXPECT_TRUE(CheckEqualCollections(qi.m_dimNames.begin(),
+        qi.m_dimNames.end(), std::begin(dims)));
+}
+
+TEST(BPFTest, mueller)
+{
+    BpfMuellerMatrix xform;
+
+    double x = 12.345;
+    double y = 45.345;
+    double z = 999.341;
+
+    double xp = x;
+    double yp = y;
+    double zp = z;
+    xform.apply(xp, yp, zp);
+    EXPECT_DOUBLE_EQ(x, xp);
+    EXPECT_DOUBLE_EQ(y, yp);
+    EXPECT_DOUBLE_EQ(z, zp);
+
+    // Test translation.
+    xp = 1.0;
+    yp = 1.0;
+    zp = 1.0;
+
+    BpfMuellerMatrix translate;
+
+    translate.m_vals[3] = 2.0;
+    translate.m_vals[7] = 2.0;
+    translate.m_vals[11] = 1.0;
+    translate.apply(xp, yp, zp);
+    EXPECT_DOUBLE_EQ(xp, 3.0);
+    EXPECT_DOUBLE_EQ(yp, 3.0);
+    EXPECT_DOUBLE_EQ(zp, 2.0);
+
+    BpfMuellerMatrix scale;
+    xp = 1.0;
+    yp = 1.0;
+    zp = 1.0;
+    scale.m_vals[0] = 2.0;
+    scale.m_vals[5] = 7.0;
+    scale.m_vals[10] = -3.0;
+    scale.apply(xp, yp, zp);
+    EXPECT_DOUBLE_EQ(xp, 2.0);
+    EXPECT_DOUBLE_EQ(yp, 7.0);
+    EXPECT_DOUBLE_EQ(zp, -3.0);
+}
+
+
+TEST(BPFTest, flex)
+{
+    std::array<std::string, 3> outname =
+        {{ "test_1.bpf", "test_2.bpf", "test_3.bpf" }};
+
+    Options readerOps;
+    readerOps.add("filename",
+        Support::datapath("bpf/autzen-utm-chipped-25-v3.bpf"));
+
+    PointTable table;
+
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    reader.prepare(table);
+    PointViewSet views = reader.execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+        FileUtils::deleteFile(Support::temppath(outname[i]));
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", Support::temppath("test_#.bpf"));
+
+    BpfWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader2);
+
+    writer.prepare(table);
+    writer.execute(table);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+    {
+        std::string filename = Support::temppath(outname[i]);
+        EXPECT_TRUE(FileUtils::fileExists(filename));
+
+        Options ops;
+        ops.add("filename", filename);
+
+        BpfReader r;
+        r.setOptions(ops);
+        EXPECT_EQ(r.preview().m_pointCount, 355u);
+    }
+}
+
+TEST(BPFTest, flex2)
+{
+    Options readerOps;
+    readerOps.add("filename",
+        Support::datapath("bpf/autzen-utm-chipped-25-v3.bpf"));
+
+    PointTable table;
+
+    BpfReader reader;
+    reader.setOptions(readerOps);
+
+    reader.prepare(table);
+    PointViewSet views = reader.execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    std::string outfile(Support::temppath("test_flex.bpf"));
+    FileUtils::deleteFile(outfile);
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", outfile);
+
+    BpfWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader2);
+
+    writer.prepare(table);
+    writer.execute(table);
+
+    EXPECT_TRUE(FileUtils::fileExists(outfile));
+
+    Options ops;
+    ops.add("filename", outfile);
+
+    BpfReader r;
+    r.setOptions(ops);
+    EXPECT_EQ(r.preview().m_pointCount, 1065u);
+}
diff --git a/test/unit/io/buffer/BufferTest.cpp b/test/unit/io/buffer/BufferTest.cpp
new file mode 100644
index 0000000..a79d7fa
--- /dev/null
+++ b/test/unit/io/buffer/BufferTest.cpp
@@ -0,0 +1,97 @@
+/******************************************************************************
+* Copyright (c) 2014, Hobu Inc. (hobu at hobu.inc)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/BufferReader.hpp>
+#include <StatsFilter.hpp>
+
+using namespace pdal;
+
+namespace
+{
+
+TEST(ViewTest, test_basic)
+{
+    PointTable table;
+    PointViewPtr view(new PointView(table));
+
+    table.layout()->registerDim(Dimension::Id::X);
+    table.layout()->registerDim(Dimension::Id::Y);
+    table.layout()->registerDim(Dimension::Id::Z);
+
+    for (int i = 0; i < 20; ++i)
+    {
+        view->setField(Dimension::Id::X, i, i);
+        view->setField(Dimension::Id::Y, i, 2 * i);
+        view->setField(Dimension::Id::Z, i, -i);
+    }
+
+    Options ops;
+    BufferReader r;
+    r.setOptions(ops);
+    r.addView(view);
+
+    StatsFilter s;
+    s.setOptions(ops);
+    s.setInput(r);
+
+    s.prepare(table);
+    PointViewSet viewSet = s.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 20u);
+
+    stats::Summary xSummary = s.getStats(Dimension::Id::X);
+    EXPECT_FLOAT_EQ(xSummary.minimum(), 0);
+    EXPECT_FLOAT_EQ(xSummary.maximum(), 19);
+    EXPECT_EQ(xSummary.count(), 20u);
+    EXPECT_FLOAT_EQ(xSummary.average(), 9.5);
+
+    stats::Summary ySummary = s.getStats(Dimension::Id::Y);
+    EXPECT_FLOAT_EQ(ySummary.minimum(), 0);
+    EXPECT_FLOAT_EQ(ySummary.maximum(), 38);
+    EXPECT_EQ(ySummary.count(), 20u);
+    EXPECT_FLOAT_EQ(ySummary.average(), 19);
+
+    stats::Summary zSummary = s.getStats(Dimension::Id::Z);
+    EXPECT_FLOAT_EQ(zSummary.minimum(), -19);
+    EXPECT_FLOAT_EQ(zSummary.maximum(), 0);
+    EXPECT_EQ(zSummary.count(), 20u);
+    EXPECT_FLOAT_EQ(zSummary.average(), -9.5);
+}
+
+}
diff --git a/test/unit/io/faux/FauxReaderTest.cpp b/test/unit/io/faux/FauxReaderTest.cpp
new file mode 100644
index 0000000..f0195dd
--- /dev/null
+++ b/test/unit/io/faux/FauxReaderTest.cpp
@@ -0,0 +1,216 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <FauxReader.hpp>
+
+using namespace pdal;
+
+TEST(FauxReaderTest, test_constant_mode_sequential_iter)
+{
+    Options ops;
+
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    ops.add("bounds", bounds);
+    ops.add("count", 750);
+    ops.add("mode", "constant");
+    std::shared_ptr<FauxReader> reader(new FauxReader);
+    reader->setOptions(ops);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 750u);
+    for (point_count_t i = 0; i < view->size(); i++)
+    {
+        double x = view->getFieldAs<double>(Dimension::Id::X, i);
+        double y = view->getFieldAs<double>(Dimension::Id::Y, i);
+        double z = view->getFieldAs<double>(Dimension::Id::Z, i);
+        uint64_t t = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, i);
+
+        EXPECT_FLOAT_EQ(x, 1.0);
+        EXPECT_FLOAT_EQ(y, 2.0);
+        EXPECT_FLOAT_EQ(z, 3.0);
+        EXPECT_EQ(t, i);
+    }
+}
+
+
+TEST(FauxReaderTest, test_random_mode)
+{
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 750);
+    ops.add("mode", "constant");
+    std::shared_ptr<FauxReader> reader(new FauxReader);
+    reader->setOptions(ops);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 750u);
+
+    for (point_count_t i = 0; i < view->size(); ++i)
+    {
+        double x = view->getFieldAs<double>(Dimension::Id::X, i);
+        double y = view->getFieldAs<double>(Dimension::Id::Y, i);
+        double z = view->getFieldAs<double>(Dimension::Id::Z, i);
+        uint64_t t = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, i);
+
+        EXPECT_GE(x, 1.0);
+        EXPECT_LE(x, 101.0);
+
+        EXPECT_GE(y, 2.0);
+        EXPECT_LE(y, 102.0);
+
+        EXPECT_GE(z, 3.0);
+        EXPECT_LE(z, 103.0);
+
+        EXPECT_EQ(t, i);
+    }
+}
+
+
+TEST(FauxReaderTest, test_ramp_mode_1)
+{
+    BOX3D bounds(0, 0, 0, 4, 4, 4);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 2);
+    ops.add("mode", "ramp");
+
+    std::shared_ptr<FauxReader> reader(new FauxReader);
+    reader->setOptions(ops);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 2u);
+
+    double x0 = view->getFieldAs<double>(Dimension::Id::X, 0);
+    double y0 = view->getFieldAs<double>(Dimension::Id::Y, 0);
+    double z0 = view->getFieldAs<double>(Dimension::Id::Z, 0);
+    uint64_t t0 = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, 0);
+
+    double x1 = view->getFieldAs<double>(Dimension::Id::X, 1);
+    double y1 = view->getFieldAs<double>(Dimension::Id::Y, 1);
+    double z1 = view->getFieldAs<double>(Dimension::Id::Z, 1);
+    uint64_t t1 = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, 1);
+
+    EXPECT_FLOAT_EQ(x0, 0.0);
+    EXPECT_FLOAT_EQ(y0, 0.0);
+    EXPECT_FLOAT_EQ(z0, 0.0);
+    EXPECT_EQ(t0, 0u);
+
+    EXPECT_FLOAT_EQ(x1, 4.0);
+    EXPECT_FLOAT_EQ(y1, 4.0);
+    EXPECT_FLOAT_EQ(z1, 4.0);
+    EXPECT_EQ(t1, 1u);
+}
+
+
+TEST(FauxReaderTest, test_ramp_mode_2)
+{
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 152.0, 203.0);
+    Options ops;
+    ops.add("bounds", bounds);
+    ops.add("count", 750);
+    ops.add("mode", "ramp");
+    std::shared_ptr<FauxReader> reader(new FauxReader);
+    reader->setOptions(ops);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 750u);
+
+    double delX = (101.0 - 1.0) / (750.0 - 1.0);
+    double delY = (152.0 - 2.0) / (750.0 - 1.0);
+    double delZ = (203.0 - 3.0) / (750.0 - 1.0);
+
+    for (point_count_t i = 0; i < view->size(); ++i)
+    {
+        double x = view->getFieldAs<double>(Dimension::Id::X, i);
+        double y = view->getFieldAs<double>(Dimension::Id::Y, i);
+        double z = view->getFieldAs<double>(Dimension::Id::Z, i);
+        uint64_t t = view->getFieldAs<uint64_t>(Dimension::Id::OffsetTime, i);
+
+        EXPECT_FLOAT_EQ(x, 1.0 + delX * i);
+        EXPECT_FLOAT_EQ(y, 2.0 + delY * i);
+        EXPECT_FLOAT_EQ(z, 3.0 + delZ * i);
+        EXPECT_EQ(t, i);
+    }
+}
+
+
+TEST(FauxReaderTest, test_return_number)
+{
+    Options ops;
+
+    BOX3D bounds(1.0, 2.0, 3.0, 101.0, 102.0, 103.0);
+    ops.add("bounds", bounds);
+    ops.add("count", 100);
+    ops.add("mode", "constant");
+    ops.add("number_of_returns", 9);
+    std::shared_ptr<FauxReader> reader(new FauxReader);
+    reader->setOptions(ops);
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 100u);
+
+    for (point_count_t i = 0; i < view->size(); i++)
+    {
+        uint8_t returnNumber = view->getFieldAs<uint8_t>(
+            Dimension::Id::ReturnNumber, i);
+        uint8_t numberOfReturns =
+            view->getFieldAs<uint8_t>(Dimension::Id::NumberOfReturns, i);
+
+        EXPECT_EQ(returnNumber, (i % 9) + 1);
+        EXPECT_EQ(numberOfReturns, 9);
+    }
+}
diff --git a/test/unit/io/las/LasReaderTest.cpp b/test/unit/io/las/LasReaderTest.cpp
new file mode 100644
index 0000000..e967dcd
--- /dev/null
+++ b/test/unit/io/las/LasReaderTest.cpp
@@ -0,0 +1,413 @@
+/******************************************************************************
+ * Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+ *       names of its contributors may be used to endorse or promote
+ *       products derived from this software without specific prior
+ *       written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <LasReader.hpp>
+#include "Support.hpp"
+
+using namespace pdal;
+
+namespace {
+template<typename LeftIter, typename RightIter>
+::testing::AssertionResult CheckEqualCollections(LeftIter left_begin,
+    LeftIter left_end, RightIter right_begin)
+{
+    bool equal(true);
+
+    std::string message;
+    size_t index(0);
+    while (left_begin != left_end)
+    {
+        if (*left_begin++ != *right_begin++)
+        {
+            equal = false;
+            message += "\n\tMismatch at index " + std::to_string(index);
+        }
+        ++index;
+    }
+    if (message.size())
+        message += "\n\t";
+    return equal ? ::testing::AssertionSuccess() :
+        ::testing::AssertionFailure() << message;
+}
+
+} // unnamed namespace
+
+TEST(LasReaderTest, create)
+{
+    StageFactory f;
+
+    std::unique_ptr<Stage> s(f.createStage("readers.las"));
+    EXPECT_TRUE(s.get());
+}
+
+TEST(LasReaderTest, test_base_options)
+{
+    const std::string file(Support::datapath("las/1.2-with-color.las"));
+
+    const Option opt_filename("filename", file);
+    const Option opt_verbose_string("verbose", "99");
+    const Option opt_verbose_uint8("verbose", 99);
+    const Option opt_debug_string("debug", "true");
+    const Option opt_debug_bool("debug", true);
+
+    {
+        Options opts;
+        opts.add(opt_filename);
+
+        LasReader reader;
+        reader.setOptions(opts);
+        EXPECT_TRUE(reader.getVerboseLevel() == 0);
+        EXPECT_TRUE(reader.isDebug() == false);
+    }
+
+    {
+        Options opts;
+        opts.add(opt_filename);
+        opts.add(opt_verbose_string);
+        opts.add(opt_debug_string);
+        LasReader reader;
+        reader.setOptions(opts);
+        EXPECT_TRUE(reader.getVerboseLevel() == 99);
+        EXPECT_TRUE(reader.isDebug() == true);
+    }
+
+    {
+        Options opts;
+        opts.add(opt_filename);
+        opts.add(opt_verbose_uint8);
+        opts.add(opt_debug_bool);
+        LasReader reader;
+        reader.setOptions(opts);
+        EXPECT_TRUE(reader.getVerboseLevel() == 99);
+        EXPECT_TRUE(reader.isDebug() == true);
+    }
+}
+
+
+TEST(LasReaderTest, header)
+{
+    PointTable table;
+    Options ops;
+    ops.add("filename", Support::datapath("las/simple.las"));
+
+    LasReader reader;
+    reader.setOptions(ops);
+
+    reader.prepare(table);
+    // This tests the copy ctor, too.
+    LasHeader h = reader.header();
+
+    EXPECT_EQ(h.fileSignature(), "LASF");
+    EXPECT_EQ(h.fileSourceId(), 0);
+    EXPECT_TRUE(h.projectId().is_nil());
+    EXPECT_EQ(h.versionMajor(), 1);
+    EXPECT_EQ(h.versionMinor(), 2);
+    EXPECT_EQ(h.creationDOY(), 0);
+    EXPECT_EQ(h.creationYear(), 0);
+    EXPECT_EQ(h.vlrOffset(), 227);
+    EXPECT_EQ(h.pointFormat(), 3);
+    EXPECT_EQ(h.pointCount(), 1065u);
+    EXPECT_DOUBLE_EQ(h.scaleX(), .01);
+    EXPECT_DOUBLE_EQ(h.scaleY(), .01);
+    EXPECT_DOUBLE_EQ(h.scaleZ(), .01);
+    EXPECT_DOUBLE_EQ(h.offsetX(), 0);
+    EXPECT_DOUBLE_EQ(h.offsetY(), 0);
+    EXPECT_DOUBLE_EQ(h.offsetZ(), 0);
+    EXPECT_DOUBLE_EQ(h.maxX(), 638982.55);
+    EXPECT_DOUBLE_EQ(h.maxY(), 853535.43);
+    EXPECT_DOUBLE_EQ(h.maxZ(), 586.38);
+    EXPECT_DOUBLE_EQ(h.minX(), 635619.85);
+    EXPECT_DOUBLE_EQ(h.minY(), 848899.70);
+    EXPECT_DOUBLE_EQ(h.minZ(), 406.59);
+    EXPECT_EQ(h.compressed(), false);
+    EXPECT_EQ(h.compressionInfo(), "");
+    EXPECT_EQ(h.pointCountByReturn(0), 925u);
+    EXPECT_EQ(h.pointCountByReturn(1), 114u);
+    EXPECT_EQ(h.pointCountByReturn(2), 21u);
+    EXPECT_EQ(h.pointCountByReturn(3), 5u);
+    EXPECT_EQ(h.pointCountByReturn(4), 0u);
+}
+
+
+TEST(LasReaderTest, test_sequential)
+{
+    PointTable table;
+
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las"));
+    ops1.add("count", 103);
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    Support::check_p0_p1_p2(*view);
+    PointViewPtr view2 = view->makeNew();
+    view2->appendPoint(*view, 100);
+    view2->appendPoint(*view, 101);
+    view2->appendPoint(*view, 102);
+    Support::check_p100_p101_p102(*view2);
+}
+
+
+static void test_a_format(const std::string& file, uint8_t majorVersion,
+    uint8_t minorVersion, int pointFormat,
+    double xref, double yref, double zref, double tref,
+    uint16_t rref,  uint16_t gref,  uint16_t bref)
+{
+    PointTable table;
+
+    Options ops1;
+    ops1.add("filename", Support::datapath(file));
+    ops1.add("count", 1);
+    LasReader reader;
+    reader.setOptions(ops1);
+    reader.prepare(table);
+
+    EXPECT_EQ(reader.header().pointFormat(), pointFormat);
+    EXPECT_EQ(reader.header().versionMajor(), majorVersion);
+    EXPECT_EQ(reader.header().versionMinor(), minorVersion);
+
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1u);
+
+    Support::check_pN(*view, 0, xref, yref, zref, tref, rref, gref, bref);
+}
+
+TEST(LasReaderTest, test_different_formats)
+{
+    test_a_format("las/permutations/1.0_0.las", 1, 0, 0, 470692.440000, 4602888.900000, 16.000000, 0, 0, 0, 0);
+    test_a_format("las/permutations/1.0_1.las", 1, 0, 1, 470692.440000, 4602888.900000, 16.000000, 1205902800.000000, 0, 0, 0);
+
+    test_a_format("las/permutations/1.1_0.las", 1, 1, 0, 470692.440000, 4602888.900000, 16.000000, 0, 0, 0, 0);
+    test_a_format("las/permutations/1.1_1.las", 1, 1, 1, 470692.440000, 4602888.900000, 16.000000, 1205902800.000000, 0, 0, 0);
+
+    test_a_format("las/permutations/1.2_0.las", 1, 2, 0, 470692.440000, 4602888.900000, 16.000000, 0, 0, 0, 0);
+    test_a_format("las/permutations/1.2_1.las", 1, 2, 1, 470692.440000, 4602888.900000, 16.000000, 1205902800.000000, 0, 0, 0);
+    test_a_format("las/permutations/1.2_2.las", 1, 2, 2, 470692.440000, 4602888.900000, 16.000000, 0, 255, 12, 234);
+    test_a_format("las/permutations/1.2_3.las", 1, 2, 3, 470692.440000, 4602888.900000, 16.000000, 1205902800.000000, 255, 12, 234);
+}
+
+
+TEST(LasReaderTest, inspect)
+{
+    Options ops;
+    ops.add("filename", Support::datapath("las/epsg_4326.las"));
+
+    LasReader reader;
+    reader.setOptions(ops);
+
+    QuickInfo qi = reader.preview();
+
+    std::string testWkt = "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433],AUTHORITY[\"EPSG\",\"4326\"]]";
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+    EXPECT_EQ(qi.m_srs.getWKT(), testWkt);
+#endif // PDAL_HAVE_LIBGEOTIFF
+
+    EXPECT_EQ(qi.m_pointCount, 5380u);
+
+    BOX3D bounds(-94.683465399999989, 31.0367341, 39.081000199999998,
+        -94.660631099999989, 31.047329099999999, 78.119000200000002);
+    EXPECT_EQ(qi.m_bounds, bounds);
+
+    const char *dims[] =
+    {
+        "Classification",
+        "EdgeOfFlightLine",
+        "Intensity",
+        "NumberOfReturns",
+        "PointSourceId",
+        "ReturnNumber",
+        "ScanAngleRank",
+        "ScanDirectionFlag",
+        "UserData",
+        "X",
+        "Y",
+        "Z"
+    };
+
+    std::sort(qi.m_dimNames.begin(), qi.m_dimNames.end());
+    EXPECT_TRUE(CheckEqualCollections(qi.m_dimNames.begin(),
+        qi.m_dimNames.end(), std::begin(dims)));
+}
+
+//ABELL - Find another way to do this.
+/**
+TEST(LasReaderTest, test_vlr)
+{
+    PointTable table;
+
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/lots_of_vlr.las"));
+    LasReader reader;
+    reader.setOptions(ops1);
+    reader.prepare(table);
+    reader.execute(table);
+
+    EXPECT_EQ(reader.header().getVLRs().getAll().size(), 390);
+}
+**/
+
+
+TEST(LasReaderTest, testInvalidFileSignature)
+{
+    PointTable table;
+
+    Options ops1;
+    ops1.add("filename", Support::datapath("las/1.2-with-color.las.wkt"));
+    LasReader reader;
+    reader.setOptions(ops1);
+
+    EXPECT_TRUE(reader.header().valid());
+}
+
+TEST(LasReaderTest, extraBytes)
+{
+    PointTable table;
+    PointLayoutPtr layout(table.layout());
+
+    Options readOps;
+    readOps.add("filename", Support::datapath("las/extrabytes.las"));
+    LasReader reader;
+    reader.setOptions(readOps);
+
+    reader.prepare(table);
+
+    DimTypeList dimTypes = layout->dimTypes();
+    EXPECT_EQ(dimTypes.size(), (size_t)24);
+
+    Dimension::Id::Enum color0 = layout->findProprietaryDim("Colors0");
+    EXPECT_EQ(layout->dimType(color0), Dimension::Type::Unsigned16);
+    Dimension::Id::Enum color1 = layout->findProprietaryDim("Colors1");
+    EXPECT_EQ(layout->dimType(color1), Dimension::Type::Unsigned16);
+    Dimension::Id::Enum color2 = layout->findProprietaryDim("Colors2");
+    EXPECT_EQ(layout->dimType(color2), Dimension::Type::Unsigned16);
+
+    Dimension::Id::Enum flag0 = layout->findProprietaryDim("Flags0");
+    EXPECT_EQ(layout->dimType(flag0), Dimension::Type::Signed8);
+    Dimension::Id::Enum flag1 = layout->findProprietaryDim("Flags1");
+    EXPECT_EQ(layout->dimType(flag1), Dimension::Type::Signed8);
+
+    Dimension::Id::Enum intense2 = layout->findProprietaryDim("Intensity");
+    EXPECT_EQ(layout->dimType(intense2), Dimension::Type::Unsigned32);
+
+    Dimension::Id::Enum time2 = layout->findProprietaryDim("Time");
+    EXPECT_EQ(layout->dimType(time2), Dimension::Type::Unsigned64);
+
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), (size_t)1);
+    PointViewPtr view = *viewSet.begin();
+
+    Dimension::Id::Enum red = layout->findDim("Red");
+    Dimension::Id::Enum green = layout->findDim("Green");
+    Dimension::Id::Enum blue = layout->findDim("Blue");
+
+    Dimension::Id::Enum returnNum = layout->findDim("ReturnNumber");
+    Dimension::Id::Enum numReturns = layout->findDim("NumberOfReturns");
+
+    Dimension::Id::Enum intensity = layout->findDim("Intensity");
+    Dimension::Id::Enum time = layout->findDim("GpsTime");
+
+    for (PointId idx = 0; idx < view->size(); ++idx)
+    {
+        EXPECT_EQ(view->getFieldAs<uint16_t>(red, idx),
+            view->getFieldAs<uint16_t>(color0, idx));
+        EXPECT_EQ(view->getFieldAs<uint16_t>(green, idx),
+            view->getFieldAs<uint16_t>(color1, idx));
+        EXPECT_EQ(view->getFieldAs<uint16_t>(blue, idx),
+            view->getFieldAs<uint16_t>(color2, idx));
+
+        EXPECT_EQ(view->getFieldAs<uint16_t>(flag0, idx),
+            view->getFieldAs<uint16_t>(returnNum, idx));
+        EXPECT_EQ(view->getFieldAs<uint16_t>(flag1, idx),
+            view->getFieldAs<uint16_t>(numReturns, idx));
+
+        EXPECT_EQ(view->getFieldAs<uint16_t>(intensity, idx),
+            view->getFieldAs<uint16_t>(intense2, idx));
+
+        // Time was written truncated rather than rounded.
+        EXPECT_NEAR(view->getFieldAs<double>(time, idx),
+            view->getFieldAs<double>(time2, idx), 1.0);
+
+    }
+}
+
+TEST(LasReaderTest, callback)
+{
+    PointTable table;
+    point_count_t count = 0;
+
+    Options ops;
+    ops.add("filename", Support::datapath("las/simple.las"));
+
+    Reader::PointReadFunc cb = [&count](PointView& view, PointId id)
+    {
+        count++;
+    };
+    LasReader reader;
+    reader.setOptions(ops);
+    reader.setReadCb(cb);
+
+    reader.prepare(table);
+    reader.execute(table);
+    EXPECT_EQ(count, (point_count_t)1065);
+}
+
+
+// The header of 1.2-with-color-clipped says that it has 1065 points,
+// but it really only has 1064.
+TEST(LasReaderTest, LasHeaderIncorrentPointcount)
+{
+    PointTable table;
+
+    Options readOps;
+    readOps.add("filename", Support::datapath("las/1.2-with-color-clipped.las"));
+    LasReader reader;
+    reader.setOptions(readOps);
+
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(1064u, view->size());
+}
diff --git a/test/unit/io/las/LasWriterTest.cpp b/test/unit/io/las/LasWriterTest.cpp
new file mode 100644
index 0000000..7f2c96f
--- /dev/null
+++ b/test/unit/io/las/LasWriterTest.cpp
@@ -0,0 +1,649 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <stdlib.h>
+
+#include <pdal/util/FileUtils.hpp>
+#include <pdal/BufferReader.hpp>
+#include <LasHeader.hpp>
+#include <LasReader.hpp>
+#include <LasWriter.hpp>
+
+#include <pdal/PointView.hpp>
+#include <pdal/StageFactory.hpp>
+#include <pdal/StageWrapper.hpp>
+
+#include "Support.hpp"
+
+namespace pdal
+{
+
+//ABELL - Should probably be moved to its own file.
+class LasTester
+{
+public:
+    LasHeader *header(LasWriter& w)
+        { return &w.m_lasHeader; }
+    SpatialReference srs(LasWriter& w)
+        { return w.m_srs; }
+};
+
+} // namespace pdal
+
+using namespace pdal;
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+TEST(LasWriterTest, srs)
+{
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("las/utm15.las"));
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    Options writerOps;
+    writerOps.add("filename", Support::temppath("out.las"));
+    LasWriter writer;
+    writer.setInput(reader);
+    writer.setOptions(writerOps);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+
+    LasTester tester;
+    SpatialReference srs = tester.srs(writer);
+    EXPECT_EQ(srs, SpatialReference("EPSG:26915"));
+}
+#endif
+
+
+#ifdef PDAL_HAVE_LIBGEOTIFF
+TEST(LasWriterTest, srs2)
+{
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("las/utm15.las"));
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    Options writerOps;
+    writerOps.add("filename", Support::temppath("out.las"));
+    writerOps.add("a_srs", "EPSG:32615");
+    LasWriter writer;
+    writer.setInput(reader);
+    writer.setOptions(writerOps);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+
+    LasTester tester;
+    SpatialReference srs = tester.srs(writer);
+    EXPECT_EQ(srs, SpatialReference("EPSG:32615"));
+}
+#endif
+
+
+TEST(LasWriterTest, auto_offset)
+{
+    using namespace Dimension;
+
+    const std::string FILENAME(Support::temppath("offset_test.las"));
+    PointTable table;
+
+    table.layout()->registerDim(Id::X);
+
+    PointViewPtr view(new PointView(table));
+    view->setField(Id::X, 0, 125000.00);
+    view->setField(Id::X, 1, 74529.00);
+    view->setField(Id::X, 2, 523523.02);
+
+    Options writerOps;
+    writerOps.add("filename", FILENAME);
+    writerOps.add("offset_x", "auto");
+    writerOps.add("scale_x", "auto");
+
+    LasWriter writer;
+    writer.setOptions(writerOps);
+
+    writer.prepare(table);
+
+    WriterWrapper::ready(writer, table);
+    WriterWrapper::write(writer, view);
+    WriterWrapper::done(writer, table);
+
+    Options readerOps;
+    readerOps.add("filename", FILENAME);
+
+    PointTable readTable;
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    reader.prepare(readTable);
+    EXPECT_DOUBLE_EQ(74529.00, reader.header().offsetX());
+    PointViewSet viewSet = reader.execute(readTable);
+    EXPECT_EQ(viewSet.size(), 1u);
+    view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+    EXPECT_NEAR(125000.00, view->getFieldAs<double>(Id::X, 0), .0001);
+    EXPECT_NEAR(74529.00, view->getFieldAs<double>(Id::X, 1), .0001);
+    EXPECT_NEAR(523523.02, view->getFieldAs<double>(Id::X, 2), .0001);
+    FileUtils::deleteFile(FILENAME);
+}
+
+TEST(LasWriterTest, extra_dims)
+{
+    Options readerOps;
+
+    readerOps.add("filename", Support::datapath("las/1.2-with-color.las"));
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    Options writerOps;
+    writerOps.add("extra_dims", "Red=int32, Blue = int16, Green = int32_t");
+    writerOps.add("filename", Support::temppath("simple.las"));
+    LasWriter writer;
+    writer.setInput(reader);
+    writer.setOptions(writerOps);
+
+    PointTable table;
+    writer.prepare(table);
+    PointViewSet viewSet = writer.execute(table);
+
+    LasTester tester;
+    LasHeader *header = tester.header(writer);
+    EXPECT_EQ(header->pointLen(), header->basePointLen() + 10);
+    PointViewPtr pb = *viewSet.begin();
+
+    uint16_t colors[][3] = {
+        { 68, 77, 88 },
+        { 92, 100, 110 },
+        { 79, 87, 87 },
+        { 100, 102, 116 },
+        { 162, 114, 145 },
+        { 163, 137, 155 },
+        { 154, 131, 144 },
+        { 104, 111, 126 },
+        { 164, 136, 156 },
+        { 72, 87, 82 },
+        { 117, 117, 136 }
+    };
+
+    Options reader2Ops;
+    reader2Ops.add("filename", Support::temppath("simple.las"));
+    reader2Ops.add("extra_dims", "R1 =int32, B1= int16 ,G1=int32_t");
+    std::shared_ptr<LasReader> reader2(new LasReader);
+    reader2->setOptions(reader2Ops);
+
+    PointTable readTable;
+    reader2->prepare(readTable);
+    viewSet = reader2->execute(readTable);
+    pb = *viewSet.begin();
+    Dimension::Id::Enum r1 = readTable.layout()->findDim("R1");
+    EXPECT_TRUE(r1 != Dimension::Id::Unknown);
+    Dimension::Id::Enum b1 = readTable.layout()->findDim("B1");
+    EXPECT_TRUE(b1 != Dimension::Id::Unknown);
+    Dimension::Id::Enum g1 = readTable.layout()->findDim("G1");
+    EXPECT_TRUE(g1 != Dimension::Id::Unknown);
+    EXPECT_EQ(pb->size(), (size_t)1065);
+    size_t j = 0;
+    for (PointId i = 0; i < pb->size(); i += 100)
+    {
+        EXPECT_EQ(pb->getFieldAs<int16_t>(r1, i), colors[j][0]);
+        EXPECT_EQ(pb->getFieldAs<int16_t>(g1, i), colors[j][1]);
+        EXPECT_EQ(pb->getFieldAs<int16_t>(b1, i), colors[j][2]);
+        j++;
+    }
+}
+
+// Merge a couple of 1.4 LAS files with point formats 1 and 6.  Write the
+// output with version 3.  Verify that you get point format 3 (default),
+// LAS 1.3 output and other header data forwarded.
+TEST(LasWriterTest, forward)
+{
+    Options readerOps1;
+    
+    readerOps1.add("filename", Support::datapath("las/4_1.las"));
+    
+    Options readerOps2;
+
+    readerOps2.add("filename", Support::datapath("las/4_6.las"));
+
+    LasReader r1;
+    r1.addOptions(readerOps1);
+
+    LasReader r2;
+    r2.addOptions(readerOps2);
+
+    StageFactory sf;
+    Stage *m = sf.createStage("filters.merge");
+    m->setInput(r1);
+    m->setInput(r2);
+
+    std::string testfile = Support::temppath("tmp.las");
+    FileUtils::deleteFile(testfile);
+
+    Options writerOps;
+    writerOps.add("forward", "header");
+    writerOps.add("minor_version", 3);
+    writerOps.add("filename", testfile);
+
+    LasWriter w;
+    w.setInput(*m);
+    w.addOptions(writerOps);
+
+    PointTable t;
+
+    w.prepare(t);
+    w.execute(t);
+
+    Options readerOps;
+    readerOps.add("filename", testfile);
+
+    LasReader r;
+
+    r.setOptions(readerOps);
+
+    PointTable t2;
+
+    r.prepare(t2);
+    r.execute(t2);
+
+    MetadataNode n1 = r.getMetadata();
+    EXPECT_EQ(n1.findChild("major_version").value<uint8_t>(), 1);
+    EXPECT_EQ(n1.findChild("minor_version").value<uint8_t>(), 3);
+    EXPECT_EQ(n1.findChild("dataformat_id").value<uint8_t>(), 3);
+    EXPECT_EQ(n1.findChild("filesource_id").value<uint8_t>(), 0);
+    // Global encoding doesn't match because 4_1.las has a bad value, so we
+    // get the default.
+    EXPECT_EQ(n1.findChild("global_encoding").value<uint8_t>(), 0);
+    EXPECT_EQ(n1.findChild("project_id").value<boost::uuids::uuid>(),
+        boost::uuids::uuid());
+    EXPECT_EQ(n1.findChild("system_id").value(), "");
+    EXPECT_EQ(n1.findChild("software_id").value(), "TerraScan");
+    EXPECT_EQ(n1.findChild("creation_doy").value<uint16_t>(), 142);
+    EXPECT_EQ(n1.findChild("creation_year").value<uint16_t>(), 2014);
+}
+
+TEST(LasWriterTest, forwardvlr)
+{
+    Options readerOps1;
+    
+    readerOps1.add("filename", Support::datapath("las/lots_of_vlr.las"));
+    LasReader r1;
+    r1.addOptions(readerOps1);
+    
+    std::string testfile = Support::temppath("tmp.las");
+    FileUtils::deleteFile(testfile);
+
+    Options writerOps;
+    writerOps.add("forward", "vlr");
+    writerOps.add("filename", testfile);
+
+    LasWriter w;
+    w.setInput(r1);
+    w.addOptions(writerOps);
+
+    PointTable t;
+
+    w.prepare(t);
+    w.execute(t);
+
+    Options readerOps;
+    readerOps.add("filename", testfile);
+
+    LasReader r;
+
+    r.setOptions(readerOps);
+
+    PointTable t2;
+
+    r.prepare(t2);
+    r.execute(t2);
+    
+    MetadataNode forward = t2.privateMetadata("lasforward");
+
+    auto pred = [](MetadataNode temp)
+        { return Utils::startsWith(temp.name(), "vlr_"); };
+    MetadataNodeList nodes = forward.findChildren(pred);
+    EXPECT_EQ(nodes.size(), 388UL);
+}
+
+// Test that data from three input views gets written to separate output files.
+TEST(LasWriterTest, flex)
+{
+    std::array<std::string, 3> outname =
+        {{ "test_1.las", "test_2.las", "test_3.las" }};
+
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("las/simple.las"));
+
+    PointTable table;
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    reader.prepare(table);
+    PointViewSet views = reader.execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+        FileUtils::deleteFile(Support::temppath(outname[i]));
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", Support::temppath("test_#.las"));
+
+    LasWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader2);
+
+    writer.prepare(table);
+    writer.execute(table);
+
+    for (size_t i = 0; i < outname.size(); ++i)
+    {
+        std::string filename = Support::temppath(outname[i]);
+        EXPECT_TRUE(FileUtils::fileExists(filename));
+
+        Options ops;
+        ops.add("filename", filename);
+
+        LasReader r;
+        r.setOptions(ops);
+        EXPECT_EQ(r.preview().m_pointCount, 355u);
+    }
+}
+
+// Test that data from three input views gets written to a single output file.
+TEST(LasWriterTest, flex2)
+{
+    Options readerOps;
+    readerOps.add("filename", Support::datapath("las/simple.las"));
+
+    PointTable table;
+
+    LasReader reader;
+    reader.setOptions(readerOps);
+
+    reader.prepare(table);
+    PointViewSet views = reader.execute(table);
+    PointViewPtr v = *(views.begin());
+
+    PointViewPtr v1(new PointView(table));
+    PointViewPtr v2(new PointView(table));
+    PointViewPtr v3(new PointView(table));
+
+    std::vector<PointViewPtr> vs;
+    vs.push_back(v1);
+    vs.push_back(v2);
+    vs.push_back(v3);
+
+    for (PointId i = 0; i < v->size(); ++i)
+        vs[i % 3]->appendPoint(*v, i);
+
+    std::string outfile(Support::temppath("test_flex.las"));
+    FileUtils::deleteFile(outfile);
+
+    BufferReader reader2;
+    reader2.addView(v1);
+    reader2.addView(v2);
+    reader2.addView(v3);
+
+    Options writerOps;
+    writerOps.add("filename", outfile);
+
+    LasWriter writer;
+    writer.setOptions(writerOps);
+    writer.setInput(reader2);
+
+    writer.prepare(table);
+    writer.execute(table);
+
+    EXPECT_TRUE(FileUtils::fileExists(outfile));
+
+    Options ops;
+    ops.add("filename", outfile);
+
+    LasReader r;
+    r.setOptions(ops);
+    EXPECT_EQ(r.preview().m_pointCount, 1065u);
+}
+
+/**
+namespace
+{
+
+bool diffdump(const std::string& f1, const std::string& f2)
+{
+    auto dump = [](const std::string& temp, const std::string& in)
+    {
+        std::stringstream ss;
+        ss << "lasdump -o " << temp << " " << in;
+        system(ss.str().c_str());
+    };
+
+    std::string t1 = Support::temppath("lasdump1.tmp");
+    std::string t2 = Support::temppath("lasdump2.tmp");
+
+    dump(t1, f1);
+    dump(t2, f2);
+
+    std::string diffFile = Support::temppath("dumpdiff.tmp");
+    std::stringstream ss;
+    ss << "diff " << t1 << " " << t2 << " > " << diffFile;
+    system(ss.str().c_str());
+
+    return true;
+}
+
+} // Unnamed namespace
+
+TEST(LasWriterTest, simple)
+{
+    PointTable table;
+
+    std::string infile(Support::datapath("las/1.2-with-color.las"));
+    std::string outfile(Support::temppath("simple.las"));
+
+    // remove file from earlier run, if needed
+    FileUtils::deleteFile(outfile);
+
+    Options readerOpts;
+    readerOpts.add("filename", infile);
+
+    Options writerOpts;
+    writerOpts.add("creation_year", 2014);
+    writerOpts.add("filename", outfile);
+
+    LasReader reader;
+    reader.setOptions(readerOpts);
+
+    LasWriter writer;
+    writer.setOptions(writerOpts);
+    writer.setInput(reader);
+    writer.prepare(table);
+    writer.execute(table);
+
+    diffdump(infile, outfile);
+}
+**/
+
+//ABELL
+/**
+TEST(LasWriterTest, LasWriterTest_test_simple_laz)
+{
+    PointTable table;
+
+    WriterOpts writerOpts;
+    writerOpts.add("compressed", true);
+    writerOpts.add("creation_year", 0);
+    writerOpts.add("creation_doy", 0);
+    writerOpts.add("system_id", "");
+    writerOpts.add("software_id", "TerraScan");
+
+
+    // remove file from earlier run, if needed
+    FileUtils::deleteFile("laszip/LasWriterTest_test_simple_laz.laz");
+
+    LasReader reader(Support::datapath("laszip/basefile.las"));
+
+    std::ostream* ofs = FileUtils::createFile(
+        Support::temppath("LasWriterTest_test_simple_laz.laz"));
+
+    // need to scope the writer, so that's it dtor can use the stream
+    std::shared_ptr<LasWriter> writer(new LasWriter)(ofs);
+    writer->setOptions(writer);
+    writer->setInput(&reader);
+
+    writer->prepare(table);
+    writer->execute(table);
+
+    FileUtils::closeFile(ofs);
+
+    {
+        LasReader reader(
+            Support::temppath("LasWriterTest_test_simple_laz.laz"));
+    }
+
+    // these two files only differ by the description string in the VLR.
+    // This now skips the entire LASzip VLR for comparison.
+    const uint32_t numdiffs =Support::diff_files(
+        Support::temppath("LasWriterTest_test_simple_laz.laz"),
+        Support::datapath("laszip/laszip-generated.laz"),
+        227, 106);
+    EXPECT_EQ(numdiffs, 0u);
+
+    if (numdiffs == 0)
+        FileUtils::deleteFile(
+            Support::temppath("LasWriterTest_test_simple_laz.laz"));
+}
+**/
+
+//ABELL
+/**
+static void test_a_format(const std::string& refFile, uint8_t majorVersion,
+    uint8_t minorVersion, int pointFormat)
+{
+    PointTable table;
+
+    // remove file from earlier run, if needed
+    FileUtils::deleteFile("temp.las");
+
+    std::string directory = "las/permutations/";
+    Options readerOpts;
+    readerOpts.add("filename", Support::datapath(directory + "1.2_3.las"));
+
+    std::shared_ptr<LasReader> reader(new LasReader);
+    reader->setOptions(readerOpts);
+
+    Options writerOpts;
+    writerOpts.add("compression", false);
+    writerOpts.add("creation_doy", 78);
+    writerOpts.add("creation_year", 2008);
+    writerOpts.add("format", pointFormat);
+    writerOpts.add("minor_version", (unsigned)minorVersion);
+    writerOpts.add("system_id", "libLAS");
+    writerOpts.add("software_id", "libLAS 1.2");
+    writerOpts.add<boost::uuids::uuuid>("project_id",
+        "8388f1b8-aa1b-4108-bca3-6bc68e7b062e");
+//    writerOpts.add("project_id", boost::lexical_cast<boost::uuids::uuid>(
+//        "8388f1b8-aa1b-4108-bca3-6bc68e7b062e");
+
+    std::ostream* ofs = FileUtils::createFile(Support::temppath("temp.las"));
+
+    // need to scope the writer, so that's it dtor can use the stream
+    std::shared_ptr<LasWriter> writer(new LasWriter)(ofs);
+    writer->setOptions(writerOpts);
+    writer->setInput(&reader);
+
+    writer->prepare(table);
+    writer->execute(table);
+
+    bool filesSame = Support::compare_files("temp.las",
+        Support::datapath(directory + refFile));
+    EXPECT_TRUE(filesSame);
+    if (filesSame)
+        FileUtils::deleteFile(Support::temppath("temp.las"));
+    else
+        exit(0);
+}
+**/
+
+
+//ABELL
+/**
+TEST(LasWriterTest, version1_0)
+{
+    test_a_format("1.0_0.las", 1, 0, 0);
+    test_a_format("1.0_1.las", 1, 0, 1);
+}
+
+
+TEST(LasWriterTest, version1_1)
+{
+    test_a_format("1.1_0.las", 1, 1, 0);
+    test_a_format("1.1_1.las", 1, 1, 1);
+}
+
+
+TEST(LasWriterTest, version1_2)
+{
+    test_a_format("1.2_0.las", 1, 2, 0);
+    test_a_format("1.2_1.las", 1, 2, 1);
+    test_a_format("1.2_2.las", 1, 2, 2);
+    test_a_format("1.2_3.las", 1, 2, 3);
+}
+**/
+
diff --git a/test/unit/io/oci/oracle_array.cpp b/test/unit/io/oci/oracle_array.cpp
new file mode 100644
index 0000000..ca4a370
--- /dev/null
+++ b/test/unit/io/oci/oracle_array.cpp
@@ -0,0 +1,324 @@
+
+
+#include <stdio.h>
+#include <stdlib.h> 
+ #include <string.h>
+ #include <oci.h>
+#include <iostream>
+#include <sstream>
+
+bool CheckError(sword nStatus, OCIError* hError)
+{
+    text    szMsg[512];
+    sb4     nCode = 0;
+    
+    std::stringstream err;
+    switch (nStatus)
+    {
+        case OCI_SUCCESS:
+            return false;
+            break;
+        case OCI_NEED_DATA:
+            err << "OCI_NEED_DATA" << std::endl;;
+            break;
+        case OCI_NO_DATA:
+            err << "OCI_NO_DATA" << std::endl;;
+            break;
+        case OCI_INVALID_HANDLE:
+            err << "OCI_INVALID_HANDLE" << std::endl;;
+            break;
+        case OCI_STILL_EXECUTING:
+            err << "OCI_STILL_EXECUTING" << std::endl;;
+            break;
+        case OCI_CONTINUE:
+            err << "OCI_CONTINUE" << std::endl;;
+            break;
+        case OCI_ERROR:
+        case OCI_SUCCESS_WITH_INFO:
+
+            if (hError == NULL)
+            {
+                err << "OCI_ERROR with no error handler" << std::endl;;
+            }
+
+            OCIErrorGet((dvoid *) hError, (ub4) 1,
+                        (text *) NULL, &nCode, szMsg,
+                        (ub4) sizeof(szMsg), OCI_HTYPE_ERROR);
+
+            if (nCode == 1405)  // Null field
+            {
+                return false;
+            }
+
+            err << "Error: " << szMsg << std::endl;
+            break;
+
+        default:
+
+            if (hError == NULL)
+            {
+                err << "default OCI_ERROR with no error handler" << std::endl;;
+
+            }
+
+            OCIErrorGet((dvoid *) hError, (ub4) 1,
+                        (text *) NULL, &nCode, szMsg,
+                        (ub4) sizeof(szMsg), OCI_HTYPE_ERROR);
+            // err << "Error: " << std::string(szMsg, static_cast<int>(sizeof(szMsg))) << std::endl;
+            break;
+
+    }
+    
+    std::cout << "Error: " << err.str() << std::endl;
+    exit(1);
+
+    return true;
+}
+
+
+ int main()
+ {
+       // OCI handles
+OCIEnv *envhp;
+OCIError *errhp;
+OCIServer *srvhp;
+OCISvcCtx *svchp;
+OCISession *authp;
+OCIStmt *stmtp;
+OCIDefine *defnpp;
+
+// Connection information
+text* user = (text*)"grid";
+text* pwd = (text*)"grid";
+text* sid = (text*)"localhost/orcl";
+
+#define FETCH_COUNT 40
+int prefetch_rows(FETCH_COUNT);
+int fetched;
+
+// char *query = "SELECT owner, table_name FROM all_tables";
+// char *query = "SELECT obj_id, blk_id, points FROM autzen_blocks";
+char *query = "SELECT points FROM autzen_blocks where obj_id=1";
+
+// Fetched data
+// char owner[FETCH_COUNT][31];
+// char table_name[FETCH_COUNT][31];
+oraub8 block_id[FETCH_COUNT];
+oraub8 object_id[FETCH_COUNT];
+OCILobLocator * lob_array[FETCH_COUNT];
+
+// Fetched data indicators, lengths and codes
+// sb2 owner_ind[100], table_name_ind[100];
+// ub2 owner_len[100], table_name_len[100];
+// ub2 owner_code[100], table_name_code[100];
+
+sb2 block_id_ind[FETCH_COUNT], object_id_ind[FETCH_COUNT];
+ub2 block_id_len[FETCH_COUNT], object_id_len[FETCH_COUNT];
+ub2 block_id_code[FETCH_COUNT], object_id_code[FETCH_COUNT];
+
+int rc(0);
+
+
+   // lob_array[i] = OCIDescriptorAlloc(..., OCI_DTYPE_LOB, ...);
+
+// Allocate environment
+rc = OCIEnvCreate(&envhp, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL);
+
+// Allocate error handle
+rc = OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, NULL);
+
+// Allocate server and service context handles
+rc = OCIHandleAlloc(envhp, (void**)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
+rc = OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
+
+// Attach to the server
+rc = OCIServerAttach(srvhp, errhp, sid, strlen((char*)sid), 0);
+
+// Set server in the service context 
+rc = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, (dvoid*)srvhp, 0, OCI_ATTR_SERVER, errhp);
+
+// Allocate session handle
+rc = OCIHandleAlloc(envhp, (void**)&authp, OCI_HTYPE_SESSION, 0, NULL);
+
+// Set user name and password
+rc = OCIAttrSet(authp, OCI_HTYPE_SESSION, (void*)user, strlen((char*)user), 
+                                      OCI_ATTR_USERNAME, errhp);
+rc = OCIAttrSet(authp, OCI_HTYPE_SESSION, (void*)pwd, strlen((char *)pwd), 
+                                      OCI_ATTR_PASSWORD, errhp);
+
+// Connect
+rc = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
+
+// Set session in the service context
+rc = OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, authp, 0, OCI_ATTR_SESSION, errhp);
+
+// Allocate statement handle
+rc = OCIHandleAlloc(envhp, (void**)&stmtp, OCI_HTYPE_STMT, 0, NULL);
+
+// Set prefetch count
+rc = OCIAttrSet(stmtp, OCI_HTYPE_STMT, (void*)&prefetch_rows, sizeof(int), 
+                                      OCI_ATTR_PREFETCH_ROWS, errhp);
+
+// Prepare the query
+rc = OCIStmtPrepare(stmtp, errhp, (text*)query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
+
+// Define the select list items 
+// rc = OCIDefineByPos(stmtp, &defnpp, errhp, 1, (void*)owner, 31, SQLT_STR, (void*)owner_ind,
+//                     owner_len, owner_code, OCI_DEFAULT);
+// rc = OCIDefineByPos(stmtp, &defnpp, errhp, 2, (void*)table_name, 31, SQLT_STR, (void*)table_name_ind,
+//                     table_name_len, table_name_code, OCI_DEFAULT);
+
+for (int i = 0; i < prefetch_rows; i++)
+{
+
+    rc = OCIDescriptorAlloc(
+        envhp,
+          (dvoid **) &lob_array[i],
+        OCI_DTYPE_LOB, (size_t) 0, (void**) 0);
+    CheckError(rc, errhp);    
+
+    OCILobEnableBuffering(
+                           svchp,
+                           errhp,
+                           lob_array[i]);
+}
+
+// rc = OCIDefineByPos(stmtp, &defnpp, errhp, 1, (void*)block_id, (sb4) sizeof(long int), SQLT_INT, (void*)block_id_ind,
+//                     block_id_len, block_id_code, OCI_DEFAULT);
+// CheckError(rc, errhp);
+// rc = OCIDefineByPos(stmtp, &defnpp, errhp, 2, (void*)object_id, (sb4) sizeof(long int), SQLT_INT, (void*)object_id_ind,
+//                     object_id_len, object_id_code, OCI_DEFAULT);
+// CheckError(rc, errhp);
+rc = OCIDefineByPos(stmtp, &defnpp, errhp, 1, (dvoid*)lob_array, (sb4) 0, SQLT_BLOB, 0,
+					0, 0, OCI_DEFAULT);
+CheckError(rc, errhp);
+
+// Execute the statement and perform the initial fetch of 100 rows into the defined array
+rc = OCIStmtExecute(svchp, stmtp, errhp, prefetch_rows, 0, NULL, NULL, OCI_DEFAULT);
+std::cout << "executing query" << std::endl;
+CheckError(rc, errhp);
+int cnt(0);
+
+oraub8 offset[FETCH_COUNT];
+char  *bufp[FETCH_COUNT];
+oraub8 bufl[FETCH_COUNT] = {0};
+oraub8 buf_amtp[FETCH_COUNT] = {0};
+ub4 array_iter = prefetch_rows;
+
+
+while(rc >= 0)
+{
+	OCIAttrGet(stmtp, OCI_HTYPE_STMT, (void*)&fetched, NULL, OCI_ATTR_ROWS_FETCHED, errhp);
+    
+    std::cout << "Fetched : " << fetched << std::endl;
+	// OCI_NO_DATA is returned by OCIStmtExecute and OCIStmtFetch2 when the number of fetched rows 
+	// is less than the number of rows allocated in the array
+    cnt += fetched;
+	if(fetched == 0)
+		break;
+
+    // // Output fetched data 
+    // for(int i = 0; i < fetched; i++)
+    //         // printf("%s.%s\n", owner[i], table_name[i]);
+    //         printf("block_id: %ld. object_id: %ld\n", block_id[i], object_id[i]);
+
+    for (int i=0; i<prefetch_rows; i++)
+    {
+      buf_amtp[i] = 0;
+    }    
+    
+    int candidate = 2;
+    for (int i=0; i<fetched; i++)
+    {
+        oraub8 nLength      = (oraub8) 0;
+        rc = OCILobGetLength2(
+                            svchp,
+                           errhp,
+                           lob_array[i],
+                           &nLength);
+           std::cout << "i: " << i << " bufl[i]: " << bufl[i] << " nLength: " << nLength << std::endl;
+           if (bufl[i] != 0 || bufl[i] < nLength)
+           {
+               if (bufl[i])
+                   free(bufp[i]);
+               bufp[i] = (char *)malloc(nLength);
+               bufl[i] = nLength;
+               
+           }
+      offset[i] = 1;
+      buf_amtp[i] = nLength;
+
+    } 
+    
+
+    std::cout << "before bufl["<<candidate<<"]: " << bufl[candidate] << " buf_amtp["<<candidate<<"]: " << buf_amtp[candidate] << " offset["<<candidate<<"]: "<< offset[candidate] << std::endl;             
+
+    rc = OCILobArrayRead(svchp, errhp,
+                    &array_iter, /* array size */
+                    lob_array,   /* array of locators */
+                    buf_amtp,        /* array of byte amounts */
+                    NULL,   /* array of char amounts */
+                    offset,      /* array of offsets */
+           (void **)bufp,        /* array of read buffers */
+                    bufl,        /* array of buffer lengths */
+                    OCI_ONE_PIECE,  /* piece information */
+                    NULL,           /* callback context */
+                    NULL,           /* callback function */
+                    0,              /* character set ID - default */
+                    SQLCS_IMPLICIT);/* character set form */
+    // std::cout << "called array read!" << std::endl;
+    // CheckError(rc, errhp);      
+    // std::cout << "did array read!" << std::endl;       
+    // std::cout << afterblob length: " << nLength << std::endl;
+    std::cout << "after bufl["<<candidate<<"]: " << bufl[candidate] << " buf_amtp["<<candidate<<"]: " << buf_amtp[candidate] << " offset["<<candidate<<"]: "<< offset[candidate] << std::endl;             
+    
+
+    while (rc == OCI_NEED_DATA)
+    {
+        rc = OCILobArrayRead(svchp, errhp,
+                        &array_iter, /* array size */
+                        lob_array,   /* array of locators */
+                        buf_amtp,        /* array of byte amounts */
+                        NULL,   /* array of char amounts */
+                        offset,      /* array of offsets */
+               (void **)bufp,        /* array of read buffers */
+                        bufl,        /* array of buffer lengths */
+                        OCI_NEXT_PIECE,  /* piece information */
+                        NULL,           /* callback context */
+                        NULL,           /* callback function */
+                        0,              /* character set ID - default */
+                        SQLCS_IMPLICIT);/* character set form */
+        
+        // for (int i = 0; i < prefetch_rows; ++i)
+        // {
+        //     offset[i] = offset[i] + bufl[i];
+        // }    
+        // std::cout << "read array part!" << std::endl;
+        // CheckError(rc, errhp);
+        std::cout << "part bufl[34]" << bufl[34] << " buf_amtp[34]: " << buf_amtp[34] << "offset[34]: " << offset[34] << std::endl;             
+        
+        // std::cout << "no error for array part!" << std::endl;       
+    }
+	if(rc == OCI_NO_DATA)
+		break;
+
+    // for (int i=0; i<prefetch_rows; i++)
+    // {
+    //   offset[i] = 1;
+    // }
+
+	// Fetch another set of rows
+	rc = OCIStmtFetch2(stmtp, errhp, prefetch_rows, OCI_DEFAULT, 0, OCI_DEFAULT);
+}
+
+printf("selected %d blocks\n", cnt);
+
+rc = OCIHandleFree(stmtp, OCI_HTYPE_STMT);
+
+// Disconnect
+rc = OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT);
+rc = OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
+
+rc = OCIHandleFree(envhp, OCI_HTYPE_ENV);
+return 0;
+ }
diff --git a/test/unit/io/optech/OptechReaderTest.cpp b/test/unit/io/optech/OptechReaderTest.cpp
new file mode 100644
index 0000000..2aeacd9
--- /dev/null
+++ b/test/unit/io/optech/OptechReaderTest.cpp
@@ -0,0 +1,146 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include "OptechReader.hpp"
+
+#include <pdal/StageFactory.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+namespace
+{
+
+
+std::string getTestfilePath()
+{
+    return Support::datapath("optech/sample.csd");
+}
+
+
+class OptechReaderTest : public ::testing::Test
+{
+public:
+    OptechReaderTest()
+        : ::testing::Test()
+        , m_reader()
+    {
+        Options options;
+        options.add("filename", getTestfilePath());
+        m_reader.setOptions(options);
+    }
+
+    OptechReader m_reader;
+};
+}
+
+
+TEST(OptechReader, Constructor)
+{
+    OptechReader reader1;
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader2(f.createStage("readers.optech"));
+    EXPECT_TRUE(reader2.get());
+}
+
+
+TEST_F(OptechReaderTest, Header)
+{
+    PointTable table;
+    m_reader.prepare(table);
+    CsdHeader header = m_reader.getHeader();
+
+    EXPECT_STREQ("CSD", header.signature);
+    EXPECT_STREQ("Optech Incorporated", header.vendorId);
+    EXPECT_STREQ("DASHMap", header.softwareVersion);
+    EXPECT_FLOAT_EQ(5.2010002f, header.formatVersion);
+    EXPECT_EQ(2048, header.headerSize);
+    EXPECT_EQ(1660u, header.gpsWeek);
+    EXPECT_DOUBLE_EQ(575644.74484563898, header.minTime);
+    EXPECT_DOUBLE_EQ(575644.75883187703, header.maxTime);
+    EXPECT_EQ(1000u, header.numRecords);
+    EXPECT_EQ(1u, header.numStrips);
+    EXPECT_EQ(0u, header.stripPointers[0]);
+    EXPECT_DOUBLE_EQ(0.028000000000000001, header.misalignmentAngles[0]);
+    EXPECT_DOUBLE_EQ(0.014, header.misalignmentAngles[1]);
+    EXPECT_DOUBLE_EQ(0.002, header.misalignmentAngles[2]);
+    EXPECT_DOUBLE_EQ(0.002250602070446688, header.imuOffsets[0]);
+    EXPECT_DOUBLE_EQ(-0.0021128955924643355, header.imuOffsets[1]);
+    EXPECT_DOUBLE_EQ(0.0054852207731677788, header.imuOffsets[2]);
+    EXPECT_DOUBLE_EQ(13, header.temperature);
+    EXPECT_DOUBLE_EQ(1026.75, header.pressure);
+}
+
+
+TEST_F(OptechReaderTest, ReadingPoints)
+{
+    PointTable table;
+    m_reader.prepare(table);
+    PointViewSet viewSet = m_reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1000u);
+
+    EXPECT_DOUBLE_EQ(-82.554028877408555,
+                     view->getFieldAs<double>(Dimension::Id::X, 0));
+    EXPECT_DOUBLE_EQ(36.534611447321907,
+                     view->getFieldAs<double>(Dimension::Id::Y, 0));
+    EXPECT_DOUBLE_EQ(344.80889224602356,
+                     view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_DOUBLE_EQ(5.756447448456390e5,
+                     view->getFieldAs<double>(Dimension::Id::GpsTime, 0));
+    EXPECT_EQ(1, view->getFieldAs<uint8_t>(Dimension::Id::ReturnNumber, 0));
+    EXPECT_EQ(1, view->getFieldAs<uint8_t>(Dimension::Id::NumberOfReturns, 0));
+    EXPECT_FLOAT_EQ(8.27356689453125e2,
+        view->getFieldAs<float>(Dimension::Id::EchoRange, 0));
+    EXPECT_EQ(384, view->getFieldAs<uint16_t>(Dimension::Id::Intensity, 0));
+    EXPECT_FLOAT_EQ(-14.55516,
+        view->getFieldAs<float>(Dimension::Id::ScanAngleRank, 0));
+}
+
+
+TEST_F(OptechReaderTest, Spatialreference)
+{
+    SpatialReference expected;
+    expected.setFromUserInput("EPSG:4326");
+    SpatialReference actual = m_reader.getSpatialReference();
+    EXPECT_EQ(expected, actual);
+}
+}
diff --git a/test/unit/io/ply/PlyReaderTest.cpp b/test/unit/io/ply/PlyReaderTest.cpp
new file mode 100644
index 0000000..dc40de3
--- /dev/null
+++ b/test/unit/io/ply/PlyReaderTest.cpp
@@ -0,0 +1,115 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <PlyReader.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+void checkPoint(const PointViewPtr& view, point_count_t idx,
+        double x, double y, double z)
+{
+    EXPECT_DOUBLE_EQ(x, view->getFieldAs<double>(Dimension::Id::X, idx));
+    EXPECT_DOUBLE_EQ(y, view->getFieldAs<double>(Dimension::Id::Y, idx));
+    EXPECT_DOUBLE_EQ(z, view->getFieldAs<double>(Dimension::Id::Z, idx));
+}
+
+
+TEST(PlyReader, Constructor)
+{
+    PlyReader reader1;
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader2(f.createStage("readers.ply"));
+    EXPECT_TRUE(reader2.get());
+}
+
+
+TEST(PlyReader, ReadText)
+{
+    PlyReader reader;
+    Options options;
+    options.add("filename", Support::datapath("ply/simple_text.ply"));
+    reader.setOptions(options);
+
+    PointTable table;
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+
+    checkPoint(view, 0, -1, 0, 0);
+    checkPoint(view, 1, 0, 1, 0);
+    checkPoint(view, 2, 1, 0, 0);
+}
+
+
+TEST(PlyReader, ReadBinary)
+{
+    PlyReader reader;
+    Options options;
+    options.add("filename", Support::datapath("ply/simple_binary.ply"));
+    reader.setOptions(options);
+
+    PointTable table;
+    reader.prepare(table);
+    PointViewSet viewSet = reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+
+    checkPoint(view, 0, -1, 0, 0);
+    checkPoint(view, 1, 0, 1, 0);
+    checkPoint(view, 2, 1, 0, 0);
+}
+
+
+TEST(PlyReader, NoVertex)
+{
+    PlyReader reader;
+    Options options;
+    options.add("filename", Support::datapath("ply/no_vertex.ply"));
+    reader.setOptions(options);
+
+    PointTable table;
+    EXPECT_THROW(reader.prepare(table), pdal_error);
+}
+
+}
diff --git a/test/unit/io/ply/PlyWriterTest.cpp b/test/unit/io/ply/PlyWriterTest.cpp
new file mode 100644
index 0000000..2ba6bf8
--- /dev/null
+++ b/test/unit/io/ply/PlyWriterTest.cpp
@@ -0,0 +1,77 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <FauxReader.hpp>
+#include <PlyWriter.hpp>
+#include <pdal/StageFactory.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+TEST(PlyWriter, Constructor)
+{
+    PlyWriter writer1;
+
+    StageFactory f;
+    std::unique_ptr<Stage> writer2(f.createStage("writers.ply"));
+    EXPECT_TRUE(writer2.get());
+}
+
+
+TEST(PlyWriter, Write)
+{
+    Options readerOptions;
+    readerOptions.add("count", 750);
+    readerOptions.add("mode", "random");
+    FauxReader reader;
+    reader.setOptions(readerOptions);
+
+    Options writerOptions;
+    writerOptions.add("filename", Support::temppath("out.ply"));
+    PlyWriter writer;
+    writer.setOptions(writerOptions);
+    writer.setInput(reader);
+
+    PointTable table;
+    writer.prepare(table);
+    writer.execute(table);
+}
+
+
+}
diff --git a/test/unit/io/qfit/QFITReaderTest.cpp b/test/unit/io/qfit/QFITReaderTest.cpp
new file mode 100644
index 0000000..41230fb
--- /dev/null
+++ b/test/unit/io/qfit/QFITReaderTest.cpp
@@ -0,0 +1,113 @@
+/******************************************************************************
+* Copyright (c) 2011, Michael P. Gerlek (mpg at flaxen.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Options.hpp>
+#include <pdal/PointView.hpp>
+#include <QfitReader.hpp>
+#include "Support.hpp"
+
+#include <iostream>
+
+
+using namespace pdal;
+
+void Check_Point(const PointView& data,
+                 PointId index,
+                 double xref, double yref, double zref,
+                 int32_t tref)
+{
+    double x = data.getFieldAs<double>(Dimension::Id::X, index);
+    double y = data.getFieldAs<double>(Dimension::Id::Y, index);
+    double z = data.getFieldAs<double>(Dimension::Id::Z, index);
+    int32_t t = data.getFieldAs<int32_t>(Dimension::Id::OffsetTime, index);
+
+    EXPECT_FLOAT_EQ(x, xref);
+    EXPECT_FLOAT_EQ(y, yref);
+    EXPECT_FLOAT_EQ(z, zref);
+    EXPECT_EQ(t, tref);
+}
+
+TEST(QFITReaderTest, test_10_word)
+{
+    Options options;
+
+    options.add("filename", Support::datapath("qfit/10-word.qi"),
+        "Input filename for reader to use");
+    options.add("flip_coordinates", false,
+        "Flip coordinates from 0-360 to -180-180");
+    options.add("scale_z", 0.001f, "Z scale from mm to m");
+    options.add("count", 3);
+
+    std::shared_ptr<QfitReader> reader(new QfitReader);
+    reader->setOptions(options);
+    EXPECT_EQ(reader->getName(), "readers.qfit");
+
+    PointTable table;
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+
+    Check_Point(*view, 0, 221.826822, 59.205160, 32.0900, 0);
+    Check_Point(*view, 1, 221.826740, 59.205161, 32.0190, 0);
+    Check_Point(*view, 2, 221.826658, 59.205164, 32.0000, 0);
+}
+
+TEST(QFITReaderTest, test_14_word)
+{
+    Options options;
+
+    options.add("filename", Support::datapath("qfit/14-word.qi"),
+        "Input filename for reader to use");
+    options.add("flip_coordinates", false,
+        "Flip coordinates from 0-360 to -180-180");
+    options.add("scale_z", 0.001f, "Z scale from mm to m");
+    options.add("count", 3);
+
+    PointTable table;
+    std::shared_ptr<QfitReader> reader(new QfitReader);
+    reader->setOptions(options);
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 3u);
+
+    Check_Point(*view, 0, 244.306337, 35.623317, 1056.830000000, 903);
+    Check_Point(*view, 1, 244.306260, 35.623280, 1056.409000000, 903);
+    Check_Point(*view, 2, 244.306204, 35.623257, 1056.483000000, 903);
+}
diff --git a/test/unit/io/sbet/SbetReaderTest.cpp b/test/unit/io/sbet/SbetReaderTest.cpp
new file mode 100644
index 0000000..c81c992
--- /dev/null
+++ b/test/unit/io/sbet/SbetReaderTest.cpp
@@ -0,0 +1,138 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <pdal/Options.hpp>
+#include <pdal/PipelineReader.hpp>
+#include <pdal/PipelineManager.hpp>
+#include <pdal/PointView.hpp>
+
+#include <SbetReader.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+void checkPoint(const PointView& data, PointId index, double time,
+    double latitude, double longitude, double altitude, double xvelocity,
+    double yvelocity, double zvelocity, double roll, double pitch,
+    double heading, double wander, double xaccel, double yaccel,
+    double zaccel, double xangrate, double yangrate, double zangrate)
+{
+    auto checkDimension = [&data,index](Dimension::Id::Enum dim,
+        double expected)
+    {
+        double actual = data.getFieldAs<double>(dim, index);
+        EXPECT_FLOAT_EQ(expected, actual);
+    };
+
+    checkDimension(Dimension::Id::GpsTime, time);
+    checkDimension(Dimension::Id::Y, latitude);
+    checkDimension(Dimension::Id::X, longitude);
+    checkDimension(Dimension::Id::Z, altitude);
+    checkDimension(Dimension::Id::XVelocity, xvelocity);
+    checkDimension(Dimension::Id::YVelocity, yvelocity);
+    checkDimension(Dimension::Id::ZVelocity, zvelocity);
+    checkDimension(Dimension::Id::Roll, roll);
+    checkDimension(Dimension::Id::Pitch, pitch);
+    checkDimension(Dimension::Id::PlatformHeading, heading);
+    checkDimension(Dimension::Id::WanderAngle, wander);
+    checkDimension(Dimension::Id::XBodyAccel, xaccel);
+    checkDimension(Dimension::Id::YBodyAccel, yaccel);
+    checkDimension(Dimension::Id::ZBodyAccel, zaccel);
+    checkDimension(Dimension::Id::XBodyAngRate, xangrate);
+    checkDimension(Dimension::Id::YBodyAngRate, yangrate);
+    checkDimension(Dimension::Id::ZBodyAngRate, zangrate);
+}
+
+TEST(SbetReaderTest, testRead)
+{
+    Option filename("filename", Support::datapath("sbet/2-points.sbet"), "");
+    Options options(filename);
+    std::shared_ptr<SbetReader> reader(new SbetReader);
+    reader->setOptions(options);
+
+    PointTable table;
+
+    reader->prepare(table);
+    PointViewSet viewSet = reader->execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+
+    EXPECT_EQ(view->size(), 2u);
+
+    checkPoint(*view.get(), 0,
+               1.516310028360710e+05, 5.680211852972264e-01,
+               -2.041654392303940e+00, 1.077152953296560e+02,
+               -2.332420866600025e+00, -3.335067504871401e-01,
+               -3.093961631767838e-02, -2.813407149321339e-02,
+               -2.429905393889139e-02, 3.046773230278662e+00,
+               -2.198414736922658e-02, 7.859639737752390e-01,
+               7.849084719295495e-01, -2.978807916450262e-01,
+               6.226807982589819e-05, 9.312162756440178e-03,
+               7.217812320996525e-02);
+    checkPoint(*view.get(), 1,
+               1.516310078318641e+05, 5.680211834722869e-01,
+               -2.041654392034053e+00, 1.077151424357507e+02,
+               -2.336228229691271e+00, -3.324663118952635e-01,
+               -3.022948961008987e-02, -2.813856631423094e-02,
+               -2.425215669392169e-02, 3.047131105236811e+00,
+               -2.198416007932108e-02, 8.397590491636475e-01,
+               3.252165276637165e-01, -1.558883225990844e-01,
+               8.379685112283802e-04, 7.372886784718076e-03,
+               7.179027672314571e-02);
+}
+
+TEST(SbetReaderTest, testBadFile)
+{
+    Option filename("filename", Support::datapath("sbet/badfile.sbet"), "");
+    Options options(filename);
+    std::shared_ptr<SbetReader> reader(new SbetReader);
+    reader->setOptions(options);
+    PointTable table;
+    reader->prepare(table);
+    EXPECT_THROW(reader->execute(table), pdal_error);
+}
+
+TEST(SbetReaderTest, testPipeline)
+{
+    PipelineManager manager;
+    PipelineReader reader(manager);
+    reader.readPipeline(Support::configuredpath("sbet/pipeline.xml"));
+
+    point_count_t numPoints = manager.execute();
+    EXPECT_EQ(numPoints, 2u);
+    FileUtils::deleteFile(Support::datapath("sbet/outfile.txt"));
+}
diff --git a/test/unit/io/sbet/SbetWriterTest.cpp b/test/unit/io/sbet/SbetWriterTest.cpp
new file mode 100644
index 0000000..037edbc
--- /dev/null
+++ b/test/unit/io/sbet/SbetWriterTest.cpp
@@ -0,0 +1,96 @@
+/******************************************************************************
+* Copyright (c) 2014, Peter J. Gadomski (pete.gadomski at gmail.com)
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include <SbetReader.hpp>
+#include <SbetWriter.hpp>
+
+#include "Support.hpp"
+
+using namespace pdal;
+
+Options makeReaderOptions()
+{
+    Options options;
+    Option filename("filename", Support::datapath("sbet/2-points.sbet"), "");
+    options.add(filename);
+    return options;
+}
+
+
+Options makeWriterOptions()
+{
+    Options options;
+    Option filename("filename", Support::temppath("SbetWriterTest.sbet"), "");
+    options.add(filename);
+    return options;
+}
+
+TEST(SbetWriterTest, testConstructor)
+{
+    SbetReader reader;
+    reader.setOptions(makeReaderOptions());
+    SbetWriter writer;
+    writer.setOptions(makeWriterOptions());
+    writer.setInput(reader);
+
+    EXPECT_EQ(writer.getName(), "writers.sbet");
+}
+
+TEST(SbetWriterTest, testWrite)
+{
+    FileUtils::deleteFile(Support::temppath("SbetWriterTest.sbet"));
+
+    // Scope forces the writer's buffer to get written to the file.  Otherwise
+    // the output file will show a file size of zero and no contents.
+    {
+        SbetReader reader;
+        reader.setOptions(makeReaderOptions());
+        SbetWriter writer;
+        writer.setOptions(makeWriterOptions());
+        writer.setInput(reader);
+
+        PointTable table;
+        writer.prepare(table);
+        writer.execute(table);
+    }
+
+    //ABELL - Write of a read file is no longer identical.
+    /**
+    EXPECT_TRUE(Support::compare_files(
+        Support::temppath("SbetWriterTest.sbet"),
+        Support::datapath("sbet/2-points.sbet")));
+    **/
+}
diff --git a/test/unit/io/terrasolid/TerrasolidReaderTest.cpp b/test/unit/io/terrasolid/TerrasolidReaderTest.cpp
new file mode 100644
index 0000000..88d5ec3
--- /dev/null
+++ b/test/unit/io/terrasolid/TerrasolidReaderTest.cpp
@@ -0,0 +1,128 @@
+/******************************************************************************
+* Copyright (c) 2015, Peter J. Gadomski <pete.gadomski at gmail.com>
+*
+* All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following
+* conditions are met:
+*
+*     * Redistributions of source code must retain the above copyright
+*       notice, this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright
+*       notice, this list of conditions and the following disclaimer in
+*       the documentation and/or other materials provided
+*       with the distribution.
+*     * Neither the name of Hobu, Inc. or Flaxen Geo Consulting nor the
+*       names of its contributors may be used to endorse or promote
+*       products derived from this software without specific prior
+*       written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+* OF SUCH DAMAGE.
+****************************************************************************/
+
+#include <pdal/pdal_test_main.hpp>
+
+#include "TerrasolidReader.hpp"
+
+#include <pdal/StageFactory.hpp>
+#include "Support.hpp"
+
+
+namespace pdal
+{
+
+
+namespace
+{
+
+
+std::string getTestfilePath()
+{
+    return Support::datapath("terrasolid/20020715-time-color.bin");
+}
+
+
+class TerrasolidReaderTest : public ::testing::Test
+{
+public:
+    TerrasolidReaderTest()
+        : ::testing::Test()
+        , m_reader()
+    {
+        Options options;
+        options.add("filename", getTestfilePath());
+        m_reader.setOptions(options);
+    }
+
+    TerrasolidReader m_reader;
+};
+}
+
+
+TEST(TerrasolidReader, Constructor)
+{
+    TerrasolidReader reader1;
+
+    StageFactory f;
+    std::unique_ptr<Stage> reader2(f.createStage("readers.terrasolid"));
+}
+
+
+TEST_F(TerrasolidReaderTest, Header)
+{
+    PointTable table;
+    m_reader.prepare(table);
+    TerraSolidHeader header = m_reader.getHeader();
+
+    EXPECT_EQ(56, header.HdrSize);
+    EXPECT_EQ(20020715, header.HdrVersion);
+    EXPECT_EQ(970401, header.RecogVal);
+    EXPECT_STREQ("CXYZ\xe8\x3", header.RecogStr);
+    EXPECT_EQ(1000, header.PntCnt);
+    EXPECT_EQ(100, header.Units);
+    EXPECT_DOUBLE_EQ(0, header.OrgX);
+    EXPECT_DOUBLE_EQ(0, header.OrgY);
+    EXPECT_DOUBLE_EQ(0, header.OrgZ);
+    EXPECT_EQ(1, header.Time);
+    EXPECT_EQ(1, header.Color);
+}
+
+
+TEST_F(TerrasolidReaderTest, ReadingPoints)
+{
+    PointTable table;
+    m_reader.prepare(table);
+    PointViewSet viewSet = m_reader.execute(table);
+    EXPECT_EQ(viewSet.size(), 1u);
+    PointViewPtr view = *viewSet.begin();
+    EXPECT_EQ(view->size(), 1000u);
+
+    EXPECT_DOUBLE_EQ(363127.94, view->getFieldAs<double>(Dimension::Id::X, 0));
+    EXPECT_DOUBLE_EQ(3437612.33, view->getFieldAs<double>(Dimension::Id::Y, 0));
+    EXPECT_DOUBLE_EQ(55.26, view->getFieldAs<double>(Dimension::Id::Z, 0));
+    EXPECT_DOUBLE_EQ(0, view->getFieldAs<double>(Dimension::Id::OffsetTime, 0));
+    EXPECT_EQ(1840, view->getFieldAs<uint16_t>(Dimension::Id::Intensity, 0));
+    EXPECT_EQ(27207, view->getFieldAs<uint16_t>(Dimension::Id::PointSourceId, 0));
+    EXPECT_EQ(239, view->getFieldAs<uint8_t>(Dimension::Id::Red, 0));
+    EXPECT_EQ(252, view->getFieldAs<uint8_t>(Dimension::Id::Green, 0));
+    EXPECT_EQ(95, view->getFieldAs<uint8_t>(Dimension::Id::Blue, 0));
+    EXPECT_EQ(0, view->getFieldAs<uint8_t>(Dimension::Id::Alpha, 0));
+    EXPECT_EQ(1, view->getFieldAs<uint8_t>(Dimension::Id::ReturnNumber, 0));
+    EXPECT_EQ(1, view->getFieldAs<uint8_t>(Dimension::Id::NumberOfReturns, 0));
+    EXPECT_EQ(2, view->getFieldAs<uint8_t>(Dimension::Id::Classification, 0));
+    EXPECT_EQ(0, view->getFieldAs<uint8_t>(Dimension::Id::Flag, 0));
+    EXPECT_EQ(0, view->getFieldAs<uint8_t>(Dimension::Id::Mark, 0));
+}
+}
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
new file mode 100644
index 0000000..fc8b690
--- /dev/null
+++ b/tools/CMakeLists.txt
@@ -0,0 +1 @@
+add_subdirectory(lasdump)
diff --git a/tools/lasdump/CMakeLists.txt b/tools/lasdump/CMakeLists.txt
new file mode 100644
index 0000000..8485b0c
--- /dev/null
+++ b/tools/lasdump/CMakeLists.txt
@@ -0,0 +1,45 @@
+#
+# The seemingly strange arrangement of this cmake file allows you to build
+# lasdump as a standalone.
+#
+cmake_minimum_required(VERSION 2.8.6)
+
+set(MAKE_COLOR_MAKEFILE ON)
+
+if(NOT ROOT_DIR)
+    project(LASDUMP)
+    set(ROOT_DIR "${PROJECT_SOURCE_DIR}/../..")
+endif()
+include(${ROOT_DIR}/cmake/common.cmake NO_POLICY_SCOPE)
+
+include_directories(${PDAL_UTIL_DIR} ${PDAL_INCLUDE_DIR})
+
+#
+# Add necessary modules.
+#
+include(${PDAL_CMAKE_DIR}/laszip.cmake)
+find_package(LASzip QUIET)
+
+#
+# Right now we don't bother if we don't have LASzip.
+#
+if (LASZIP_FOUND)
+    set (SOURCES
+        Dumper.cpp
+        Header.cpp
+    )
+
+    set (HEADERS
+        Dumper.hpp
+        Header.hpp
+        Lasdump.hpp
+        Vlr.hpp
+    )
+
+    add_executable(lasdump ${SOURCES} ${HEADERS})
+    target_link_libraries(lasdump
+        ${PDAL_UTIL_LIB_NAME}
+        ${LASZIP_LIBRARIES}
+    )
+endif()
+
diff --git a/tools/lasdump/Dumper.cpp b/tools/lasdump/Dumper.cpp
new file mode 100644
index 0000000..b4ccb33
--- /dev/null
+++ b/tools/lasdump/Dumper.cpp
@@ -0,0 +1,215 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <laszip/laszip.hpp>
+#include <laszip/lasunzipper.hpp>
+
+#include <pdal/util/IStream.hpp>
+
+#include "Dumper.hpp"
+#include "Lasdump.hpp"
+
+using namespace std;
+
+int main(int argc, char *argv[])
+{
+    deque<string> args;
+
+    for (int i = 1; i < argc; ++i)
+        args.push_back(argv[i]);
+    pdal::lasdump::Dumper d(args);
+    if (!d.error())
+        d.dump();
+}
+
+namespace
+{
+
+void usage(const std::string& err = "")
+{
+    if (!err.empty())
+        std::cerr << "Error: " << err << "\n";
+    std::cerr << "Usage: lasdump [-o <output filename>] <las/las file>\n";
+}
+
+}
+
+
+namespace pdal
+{
+namespace lasdump
+{
+
+void Dumper::dump()
+{
+    ILeStream in(m_filename);
+    if (!in.good())
+    {
+        std::cerr << "Error: Couldn't open file \"" << m_filename << "\".\n";
+        m_error = -1;
+        return;
+    }
+
+    try {
+        in >> m_header;
+    }
+    catch (Exception& ex)
+    {
+        std::cerr << "Error: " << ex << "\n";
+        m_error = -1;
+        return;
+    }
+    *m_out << m_header;
+
+    in.seek(m_header.vlrOffset());
+    for (uint32_t i = 0; i < m_header.vlrCount(); ++i)
+    {
+        Vlr vlr;
+
+        in >> vlr;
+        if (vlr.matches("laszip encoded", 22204))
+            m_zipVlr = vlr;
+        *m_out << vlr;
+    }
+    if (m_header.versionEquals(1, 0))
+    {
+        uint16_t dataStartSig;
+        in >> dataStartSig;
+        *m_out << "Data start signature: " << dataStartSig << "\n";
+    }
+
+    // Seek to start of points and dump.
+    in.seek(m_header.pointOffset());
+    if (m_header.compressed())
+        readCompressedPoints(in);
+    else
+        readPoints(in);
+
+    // We're done if this is an extended VLR.
+    if (!m_header.versionAtLeast(1, 4))
+        return;
+
+    // Seek to start of extended VLRs and dump.
+    in.seek(m_header.eVlrOffset());
+    for (uint32_t i = 0; i < m_header.eVlrCount(); ++i)
+    {
+        EVlr vlr;
+
+        in >> vlr;
+        *m_out << vlr;
+    }
+    return;
+}
+
+
+void Dumper::readPoints(ILeStream& in)
+{
+    vector<char> buf(m_header.pointLen());
+
+    for (uint64_t i = 0; i < m_header.pointCount(); ++i)
+    {
+        in.get(buf);
+        *m_out << cksum(buf) << "\n";
+    }
+}
+
+
+void Dumper::readCompressedPoints(ILeStream& in)
+{
+    LASunzipper unzipper;
+    LASzip zip;
+
+    zip.unpack((const unsigned char *)m_zipVlr.data(), m_zipVlr.dataLen());
+
+    // compute the point size
+    unsigned pointSize = 0;
+    for (unsigned int i = 0; i < zip.num_items; i++)
+        pointSize += zip.items[i].size;
+
+    // create the point data
+    unsigned char **point = new unsigned char*[zip.num_items];
+    std::vector<uint8_t> pointData(pointSize);
+
+    unsigned offset = 0;
+    for (unsigned i = 0; i < zip.num_items; i++)
+    {
+        point[i] = &(pointData[offset]);
+        offset += zip.items[i].size;
+    }
+
+    unzipper.open(*in.stream(), &zip);
+
+    for (size_t i = 0; i < m_header.pointCount(); ++i)
+    {
+        unzipper.read(point);
+        *m_out << cksum(pointData) << "\n";
+    }
+}
+
+
+int Dumper::processArgs(deque<string> args)
+{
+
+    if (args.size() == 3)
+    {
+        if (args[0] != "-o")
+        {
+            usage();
+            return -1;
+        }
+        args.pop_front();
+
+        m_fout.open(args[0]);
+        m_out = &m_fout;
+        if (!*m_out)
+        {
+            usage("Couldn't open output file.");
+            return -1;
+        }
+        args.pop_front();
+    }
+    if (args.size() != 1)
+    {
+        usage();
+        return -1;
+    }
+
+    m_filename = args[0];
+    return 0;
+}
+
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/tools/lasdump/Dumper.hpp b/tools/lasdump/Dumper.hpp
new file mode 100644
index 0000000..c25bfc7
--- /dev/null
+++ b/tools/lasdump/Dumper.hpp
@@ -0,0 +1,75 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include <deque>
+#include <string>
+#include <iostream>
+
+#include "Header.hpp"
+#include "Vlr.hpp"
+
+namespace pdal
+{
+
+class ILeStream;
+
+namespace lasdump
+{
+
+class Dumper
+{
+
+public:
+    Dumper(const std::deque<std::string>& args) : m_out(&std::cout)
+        { m_error = processArgs(args); }
+    void dump();
+    int error()
+        { return m_error; }
+
+private:
+    std::string m_filename;
+    Header m_header;
+    Vlr m_zipVlr;
+    int m_error;
+    std::ofstream m_fout;
+    std::ostream *m_out;
+
+    int processArgs(std::deque<std::string> args);
+    void readPoints(ILeStream& in);
+    void readCompressedPoints(ILeStream& in);
+};
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/tools/lasdump/Header.cpp b/tools/lasdump/Header.cpp
new file mode 100644
index 0000000..cbef398
--- /dev/null
+++ b/tools/lasdump/Header.cpp
@@ -0,0 +1,223 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#include "Header.hpp"
+#include "Lasdump.hpp"
+
+#include <boost/uuid/uuid_generators.hpp>
+#include <boost/uuid/uuid_io.hpp>
+
+namespace pdal
+{
+namespace lasdump
+{
+
+const std::string Header::FILE_SIGNATURE("LASF");
+#ifndef WIN32
+const size_t Header::LEGACY_RETURN_COUNT;
+const size_t Header::RETURN_COUNT;
+#endif
+
+Header::Header() : m_sourceId(0), m_globalEncoding(0), m_versionMinor(0),
+    m_createDOY(0), m_createYear(0), m_vlrOffset(0), m_pointOffset(0),
+    m_vlrCount(0), m_pointFormat(0), m_pointLen(0), m_pointCount(0),
+    m_isCompressed(false), m_eVlrOffset(0), m_eVlrCount(0)
+{
+    m_pointCountByReturn.fill(0);
+    m_scales.fill(1.0);
+    m_offsets.fill(0.0);
+}
+
+
+uint16_t Header::basePointLen(uint8_t type)
+{
+    switch (type)
+    {
+    case 0:
+        return 20;
+    case 1:
+        return 28;
+    case 2:
+        return 26;
+    case 3:
+        return 34;
+    case 6:
+        return 30;
+    case 7:
+        return 36;
+    case 8:
+        return 38;
+    }
+    return 0;
+}
+
+
+bool Header::valid() const
+{
+    if (m_fileSig != FILE_SIGNATURE)
+        return false;
+    if (m_versionMinor > 10)
+        return false;
+    if (m_createDOY > 366)
+        return false;
+    if (m_createYear < 1970 || m_createYear > 2100)
+       return false;
+    return true;
+}
+
+
+void Header::get(ILeStream& in, boost::uuids::uuid& uuid)
+{
+    union
+    {
+        char buf[16];
+        struct
+        {
+            uint32_t uidPart1;
+            uint16_t uidPart2;
+            uint16_t uidPart3;
+            char uidPart4[8];
+        };
+    } u;
+
+    in >> u.uidPart1 >> u.uidPart2 >> u.uidPart3;
+    in.get(u.uidPart4, sizeof(u.uidPart4));
+    memcpy(uuid.data, u.buf, sizeof(u.buf));
+}
+
+
+ILeStream& operator>>(ILeStream& in, Header& h)
+{
+    uint8_t versionMajor;
+    uint32_t legacyPointCount;
+    uint32_t legacyReturnCount;
+
+    in.get(h.m_fileSig, 4);
+    if (!h.signatureValid())
+        throw Exception("Not a LAS/LAZ file.  Invalid file signature.");
+    in >> h.m_sourceId >> h.m_globalEncoding;
+    Header::get(in, h.m_projectGuid);
+    in >> versionMajor >> h.m_versionMinor;
+    in.get(h.m_systemId, 32);
+
+    in.get(h.m_softwareId, 32);
+    in >> h.m_createDOY >> h.m_createYear >> h.m_vlrOffset >>
+        h.m_pointOffset >> h.m_vlrCount >> h.m_pointFormat >>
+        h.m_pointLen >> legacyPointCount;
+    h.m_pointCount = legacyPointCount;
+
+    // Although it isn't part of the LAS spec, the two high bits have been used
+    // to indicate compression, though only the high bit is currently used.
+    if (h.m_pointFormat & 0x80)
+        h.setCompressed(true);
+    h.m_pointFormat &= ~0xC0;
+    
+    for (size_t i = 0; i < Header::LEGACY_RETURN_COUNT; ++i)
+    {
+        in >> legacyReturnCount;
+        h.m_pointCountByReturn[i] = legacyReturnCount;
+    }
+
+    in >> h.m_scales[0] >> h.m_scales[1] >> h.m_scales[2];
+    in >> h.m_offsets[0] >> h.m_offsets[1] >> h.m_offsets[2];
+    
+    double maxX, minX;
+    double maxY, minY;
+    double maxZ, minZ;
+    in >> maxX >> minX >> maxY >> minY >> maxZ >> minZ;
+    h.m_bounds = BOX3D(minX, minY, minZ, maxX, maxY, maxZ);
+
+    if (h.versionAtLeast(1, 3))
+    {
+        uint64_t waveformOffset;
+        in >> waveformOffset;
+    }
+    if (h.versionAtLeast(1, 4))
+    {
+        uint32_t numPoints = (uint32_t)h.m_pointCount;
+        in >> h.m_eVlrOffset >> h.m_eVlrCount >> h.m_pointCount;
+        for (size_t i = 0; i < Header::RETURN_COUNT; ++i)
+            in >> h.m_pointCountByReturn[i];
+        if (numPoints && (numPoints != h.m_pointCount))
+        {
+            std::stringstream ss;
+            ss << "1.4 point count (" << h.m_pointCount << ") "
+                "doesn't match legacy point count (" << numPoints << ").";
+            throw Exception(ss.str());
+        }
+    }
+
+    return in;
+}
+
+
+std::ostream& operator<<(std::ostream& out, const Header& h)
+{
+    out << "File version: " << "1." << (int)h.m_versionMinor << "\n";
+    out << "File signature: " << h.m_fileSig << "\n";
+    out << "File source ID: " << h.m_sourceId << "\n";
+    out << "Global encoding: " << h.m_globalEncoding << "\n";
+    out << "Project GUID: " << h.m_projectGuid << "\n";
+    out << "System ID: " << h.m_systemId << "\n";
+    out << "Software ID: " << h.m_softwareId << "\n";
+    out << "Creation DOY: " << h.m_createDOY << "\n";
+    out << "Creation Year: " << h.m_createYear << "\n";
+    out << "VLR offset (header size): " << h.m_vlrOffset << "\n";
+    out << "VLR Count: " << h.m_vlrCount << "\n";
+    out << "Point format: " << (int)h.m_pointFormat << "\n";
+    out << "Point offset: " << h.m_pointOffset << "\n";
+    out << "Point count: " << h.m_pointCount << "\n";
+    for (size_t i = 0; i < Header::RETURN_COUNT; ++i)
+        out << "Point count by return[" << i << "]: " <<
+            h.m_pointCountByReturn[i] << "\n";
+    out << "Scales X/Y/Z: " << h.m_scales[0] << "/" <<
+        h.m_scales[1] << "/" << h.m_scales[2] << "\n";
+    out << "Offsets X/Y/Z: " << h.m_offsets[0] << "/" <<
+        h.m_offsets[1] << "/" << h.m_offsets[2] << "\n";
+    out << "Max X/Y/Z: " << h.maxX() << "/" <<
+        h.maxY() << "/" << h.maxZ() << "\n";
+    out << "Min X/Y/Z: " << h.minX() << "/" <<
+        h.minY() << "/" << h.minZ() << "\n";
+    if (h.versionAtLeast(1, 4))
+    {
+        out << "Ext. VLR offset: " << h.m_eVlrOffset << "\n";
+        out << "Ext. VLR count: " << h.m_eVlrCount << "\n";
+    }
+    out << "Compressed: " << (h.m_isCompressed ? "true" : "false") << "\n";
+    return out;
+}
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/tools/lasdump/Header.hpp b/tools/lasdump/Header.hpp
new file mode 100644
index 0000000..5909728
--- /dev/null
+++ b/tools/lasdump/Header.hpp
@@ -0,0 +1,345 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <array>
+
+#include <boost/uuid/uuid_generators.hpp>
+
+#include <pdal/util/Bounds.hpp>
+#include <pdal/util/IStream.hpp>
+
+namespace pdal
+{
+namespace lasdump
+{
+
+typedef uint8_t PointFormat;
+
+class Header
+{
+public:
+    static const size_t LEGACY_RETURN_COUNT = 5;
+    static const size_t RETURN_COUNT = 15;
+    static const std::string FILE_SIGNATURE;
+
+    Header();
+
+    /// Determine if the header has a valid LAS signature.
+    bool signatureValid() const
+        { return m_fileSig == "LASF"; }
+
+
+    /// Get file source identifier.
+    /// \exception No throw
+    uint16_t fileSourceId() const
+        { return m_sourceId; }
+
+    uint16_t globalEncoding() const
+        { return m_globalEncoding; }
+
+    /// Get project identifier.
+    /// \return Global Unique Identifier as an instance of liblas::guid class.
+    boost::uuids::uuid projectId() const
+        { return m_projectGuid; }
+
+    /// Get the LAS major version.
+    /// \return  LAS major version
+    uint8_t versionMajor() const
+        { return (uint8_t)1; }
+
+    /// Get minor component of version of LAS format.
+    /// \return Valid values are 0, 1, 2, 3.
+    uint8_t versionMinor() const
+        { return m_versionMinor; }
+
+    /// Set minor component of version of LAS format.
+    /// \exception std::out_of_range - invalid value given.
+    /// \param v - value between eVersionMinorMin and eVersionMinorMax.
+    void setVersionMinor(uint8_t v)
+    {
+        assert(v <= 4);
+        m_versionMinor = v;
+    }
+
+    /// Determine if the header is for a LAS file version of at least
+    ///   a certain level.
+    /// \param major - Major version.
+    /// \param minor - Minor version.
+    /// \return  Whether the version meets the criteria.
+    bool versionAtLeast(uint8_t major, uint8_t minor) const
+        { return (1 >= major && m_versionMinor >= minor); }
+
+    /// Determine if the header is for a particular LAS file version.
+    /// \param major - Major version.
+    /// \param minor - Minor version.
+    /// \return  Whether the version meets the criteria.
+    bool versionEquals(uint8_t major, uint8_t minor) const
+        { return (major == 1 && minor == m_versionMinor); }
+
+    /// Get system identifier.
+    /// Default value is \b "libLAS" specified as the SystemIdentifier constant.
+    /// \param pad - if true the returned string is padded right with spaces and
+    /// its length is 32 bytes, if false (default) no padding occurs and
+    /// length of the returned string is <= 32 bytes.
+    /// \return value of system identifier field.
+    std::string systemId() const
+        { return m_systemId; }
+
+    /// Set system identifier.
+    /// \param v - system identifiers string.
+    void setSystemId(std::string const& v)
+        { m_systemId = v; }
+
+    /// Get software identifier.
+    /// Default value is \b "libLAS 1.0", specified as the SoftwareIdentifier
+    /// constant.
+    std::string softwareId() const
+        { return m_softwareId; }
+
+    /// Set software identifier.
+    /// \param v - software identifiers string.
+    void setSoftwareId(std::string const& v)
+        { m_softwareId = v; }
+
+    /// Get day of year of file creation date.
+    uint16_t creationDOY() const
+        { return m_createDOY; }
+
+    /// Set day of year of file creation date.
+    /// \exception std::out_of_range - given value is higher than number 366.
+    void setCreationDOY(uint16_t v)
+        { m_createDOY = v; }
+
+    /// Set year of file creation date.
+    uint16_t creationYear() const
+        { return m_createYear; }
+
+    /// Get year of file creation date.
+    /// \exception std::out_of_range - given value is higher than number 9999.
+    void setCreationYear(uint16_t v)
+        { m_createYear = v; }
+
+    /// Get number of bytes of generic verion of public header block storage.
+    /// Standard version of the public header block is 227 bytes long.
+    uint16_t vlrOffset() const
+        { return m_vlrOffset; }
+
+    void setVlrOffset(uint16_t offset)
+        { m_vlrOffset = offset; }
+
+    /// Get number of bytes from the beginning to the first point record.
+    uint32_t pointOffset() const
+        { return m_pointOffset; }
+
+    /// Set number of bytes from the beginning to the first point record.
+    /// \param  offset - Offset to start of point data.
+    void setPointOffset(uint32_t offset)
+          { m_pointOffset = offset; }
+
+    /// Set the point format.
+    /// \param format  Point format
+    void setPointFormat(uint8_t format)
+        { m_pointFormat = format; }
+
+    /// Get identifier of point data (record) format.
+    uint8_t pointFormat() const
+        { return m_pointFormat; }
+    bool pointFormatSupported() const
+    {
+        if (versionAtLeast(1, 4))
+            return m_pointFormat <= 10 && !hasWave();
+        else
+            return m_pointFormat <= 5 && !hasWave();
+    }
+
+    /// The length in bytes of each point.  All points in the file are
+    /// considered to be fixed in size, and the PointFormatName is used
+    /// to determine the fixed portion of the dimensions in the point.
+    uint16_t pointLen() const
+        { return m_pointLen; }
+	void setPointLen(uint16_t v)
+        { m_pointLen = v; }
+    uint16_t basePointLen()
+        { return basePointLen(m_pointFormat); }
+    uint16_t basePointLen(uint8_t format);
+
+    /// Set the number of points.
+    /// \param pointCount  Number of points in the file.
+    void setPointCount(uint64_t pointCount)
+        { m_pointCount = pointCount; }
+    /// Get total number of point records stored in the LAS file.
+    uint64_t pointCount() const
+        { return m_pointCount; }
+
+    /// Set values point count by return number.
+    /// \param index - Return number.
+    /// \param v - Point count for return number.
+    void setPointCountByReturn(std::size_t index, uint64_t v)
+        { m_pointCountByReturn[index] = v; }
+
+    /// Get the point count by return number.
+    /// \param index - Return number.
+    /// \return - Point count.
+    uint64_t pointCountByReturn(std::size_t index)
+        { return m_pointCountByReturn[index]; }
+
+    /// Get scale factor for X coordinate.
+    double scaleX() const
+        { return m_scales[0]; }
+
+    /// Get scale factor for Y coordinate.
+    double scaleY() const
+        { return m_scales[1]; }
+
+    /// Get scale factor for Z coordinate.
+    double scaleZ() const
+        { return m_scales[2]; }
+
+    /// Get X coordinate offset.
+    double offsetX() const
+        { return m_offsets[0]; }
+
+    /// Get Y coordinate offset.
+    double offsetY() const
+        { return m_offsets[1]; }
+
+    /// Get Z coordinate offset.
+    double offsetZ() const
+        { return m_offsets[2]; }
+
+    /// Get minimum value of extent of X coordinate.
+    double maxX() const
+        { return m_bounds.maxx; }
+
+    /// Get maximum value of extent of X coordinate.
+    double minX() const
+        { return m_bounds.minx; }
+
+    /// Get minimum value of extent of Y coordinate.
+    double maxY() const
+        { return m_bounds.maxy; }
+
+    /// Get maximum value of extent of Y coordinate.
+    double minY() const
+        { return m_bounds.miny; }
+
+    /// Get minimum value of extent of Z coordinate.
+    double maxZ() const
+        { return m_bounds.maxz; }
+
+    /// Get maximum value of extent of Z coordinate.
+    double minZ() const
+       { return m_bounds.minz; }
+
+    const pdal::BOX3D& getBounds() const
+        { return m_bounds; }
+
+    bool hasTime() const
+    {
+        PointFormat f = pointFormat();
+        return f == 1 || f >= 3;
+    }
+    bool hasColor() const
+    {
+        PointFormat f = pointFormat();
+        return f == 2 || f == 3 || f == 5 || f == 7 || f == 8 || f == 10;
+    }
+    bool hasWave() const
+    {
+        PointFormat f = pointFormat();
+        return f == 4 || f == 5 || f == 9 || f == 10;
+    }
+    bool hasInfrared() const
+    {
+        PointFormat f = pointFormat();
+        return f == 8;
+    }
+
+    /// Returns true iff the file is compressed (laszip),
+    /// as determined by the high bit in the point type
+    bool compressed() const
+        { return m_isCompressed; }
+
+    /// Sets whether or not the points are compressed.
+    void setCompressed(bool b)
+        { m_isCompressed = b; }
+
+    uint32_t vlrCount() const
+        { return m_vlrCount; }
+    uint64_t eVlrOffset() const
+        { return m_eVlrOffset; }
+    uint32_t eVlrCount() const
+        { return m_eVlrCount; }
+
+    std::string const& compressionInfo() const
+        { return m_compressionInfo; }
+
+    bool valid() const;
+
+    friend ILeStream& operator>>(ILeStream&, Header& h);
+    friend std::ostream& operator<<(std::ostream& ostr, const Header& h);
+
+private:
+    std::string m_fileSig;
+    uint16_t m_sourceId;
+    uint16_t m_globalEncoding;
+    boost::uuids::uuid m_projectGuid;
+    uint8_t m_versionMinor;
+    std::string m_systemId;
+    std::string m_softwareId;
+    uint16_t m_createDOY;
+    uint16_t m_createYear;
+    uint16_t m_vlrOffset;  // Same as header size.
+    uint32_t m_pointOffset;
+    uint32_t m_vlrCount;
+    uint8_t m_pointFormat;
+    uint16_t m_pointLen;
+    uint64_t m_pointCount;
+    std::array<uint64_t, RETURN_COUNT> m_pointCountByReturn;
+    std::array<double, 3> m_scales;
+    std::array<double, 3> m_offsets;
+    bool m_isCompressed;
+    uint64_t m_eVlrOffset;
+    uint32_t m_eVlrCount;
+    BOX3D m_bounds;
+    std::string m_compressionInfo;
+
+    static void get(ILeStream& in, boost::uuids::uuid& uuid);
+};
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/tools/lasdump/Lasdump.hpp b/tools/lasdump/Lasdump.hpp
new file mode 100644
index 0000000..ce68a49
--- /dev/null
+++ b/tools/lasdump/Lasdump.hpp
@@ -0,0 +1,92 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include <string.h>
+
+#include <string>
+#include <ostream>
+
+namespace pdal
+{
+namespace lasdump
+{
+
+struct Exception
+{
+    Exception(const std::string& text) : m_text(text)
+        {}
+
+    std::string m_text;
+};
+
+inline std::ostream& operator << (std::ostream& out, const Exception& ex)
+{
+    out << ex.m_text;
+    return out;
+}
+
+
+inline int32_t cksum(const void *c, size_t size)
+{
+    int32_t sum = 0;
+
+    const int32_t *p = static_cast<const int32_t *>(c);
+    while (size)
+    {
+        int32_t val = 0;
+        memcpy(&val, p, std::min(sizeof(int32_t), size));
+        sum += val;
+        p++;
+        if (size <= sizeof(int32_t))
+            break;
+        size -= sizeof(int32_t);
+    }
+    return -sum;
+}
+
+inline int32_t cksum(const std::vector<char>& v)
+{
+    return cksum(static_cast<const void *>(v.data()), v.size());
+}
+
+inline int32_t cksum(const std::vector<unsigned char>& v)
+{
+    return cksum(static_cast<const void *>(v.data()), v.size());
+}
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/tools/lasdump/Vlr.hpp b/tools/lasdump/Vlr.hpp
new file mode 100644
index 0000000..c130375
--- /dev/null
+++ b/tools/lasdump/Vlr.hpp
@@ -0,0 +1,113 @@
+/******************************************************************************
+ * Copyright (c) 2014, Hobu Inc. (hobu at hobu.co)
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in
+ *       the documentation and/or other materials provided
+ *       with the distribution.
+ *     * Neither the name of the Martin Isenburg or Iowa Department
+ *       of Natural Resources nor the names of its contributors may be
+ *       used to endorse or promote products derived from this software
+ *       without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
+ * OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#pragma once
+
+#include "Lasdump.hpp"
+
+#include <pdal/util/IStream.hpp>
+
+namespace pdal
+{
+namespace lasdump
+{
+
+class Vlr
+{
+public:
+    bool matches(std::string userId, uint16_t recordId)
+        { return userId == userId && recordId == m_recordId; }
+    const char *data() const
+        { return (const char *)m_data.data(); }
+    uint64_t dataLen() const
+        { return m_data.size(); }
+
+protected:
+    uint16_t m_recordSig;
+    std::string m_userId;
+    uint16_t m_recordId;
+    std::string m_description;
+    std::vector<uint8_t> m_data;
+
+    friend ILeStream& operator>>(ILeStream& in, Vlr& v);
+    friend std::ostream& operator<<(std::ostream& out, Vlr& v);
+};
+
+class EVlr : public Vlr
+{
+    friend ILeStream& operator>>(ILeStream& in, EVlr& v);
+};
+
+inline std::ostream& operator<<(std::ostream& out, Vlr& v)
+{
+    out << "Record Signature: " << v.m_recordSig << "\n";
+    out << "User ID: " << v.m_userId << "\n";
+    out << "Record ID: " << v.m_recordId << "\n";
+    out << "Description: " << v.m_description << "\n";
+    out << "Data checksum: " << cksum(v.m_data) << "\n";
+
+    return out;
+}
+
+inline ILeStream& operator>>(ILeStream& in, Vlr& v)
+{
+    uint16_t dataLen;
+
+    in >> v.m_recordSig;
+    in.get(v.m_userId, 16);
+    in >> v.m_recordId >> dataLen;
+    in.get(v.m_description, 32);
+    v.m_data.resize(dataLen);
+    in.get(v.m_data);
+
+    return in;
+}
+
+inline ILeStream& operator>>(ILeStream& in, EVlr& v)
+{
+    uint64_t dataLen;
+
+    in >> v.m_recordSig;
+    in.get(v.m_userId, 16);
+    in >> v.m_recordId >> dataLen;
+    in.get(v.m_description, 32);
+    v.m_data.resize(dataLen);
+    in.get(v.m_data);
+
+    return in;
+}
+
+} // namespace lasdump
+} // namespace pdal
+
diff --git a/vendor/eigen-3.1.91/Eigen/Array b/vendor/eigen-3.1.91/Eigen/Array
new file mode 100644
index 0000000..3d004fb
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Array
@@ -0,0 +1,11 @@
+#ifndef EIGEN_ARRAY_MODULE_H
+#define EIGEN_ARRAY_MODULE_H
+
+// include Core first to handle Eigen2 support macros
+#include "Core"
+
+#ifndef EIGEN2_SUPPORT
+  #error The Eigen/Array header does no longer exist in Eigen3. All that functionality has moved to Eigen/Core.
+#endif
+
+#endif // EIGEN_ARRAY_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/CMakeLists.txt
new file mode 100644
index 0000000..a92dd6f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/CMakeLists.txt
@@ -0,0 +1,19 @@
+include(RegexUtils)
+test_escape_string_as_regex()
+
+file(GLOB Eigen_directory_files "*")
+
+escape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+
+foreach(f ${Eigen_directory_files})
+  if(NOT f MATCHES "\\.txt" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/src")
+    list(APPEND Eigen_directory_files_to_install ${f})
+  endif()
+endforeach(f ${Eigen_directory_files})
+
+install(FILES
+  ${Eigen_directory_files_to_install}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen COMPONENT Devel
+  )
+
+add_subdirectory(src)
diff --git a/vendor/eigen-3.1.91/Eigen/Cholesky b/vendor/eigen-3.1.91/Eigen/Cholesky
new file mode 100644
index 0000000..f727f5d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Cholesky
@@ -0,0 +1,32 @@
+#ifndef EIGEN_CHOLESKY_MODULE_H
+#define EIGEN_CHOLESKY_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup Cholesky_Module Cholesky module
+  *
+  *
+  *
+  * This module provides two variants of the Cholesky decomposition for selfadjoint (hermitian) matrices.
+  * Those decompositions are accessible via the following MatrixBase methods:
+  *  - MatrixBase::llt(),
+  *  - MatrixBase::ldlt()
+  *
+  * \code
+  * #include <Eigen/Cholesky>
+  * \endcode
+  */
+
+#include "src/misc/Solve.h"
+#include "src/Cholesky/LLT.h"
+#include "src/Cholesky/LDLT.h"
+#ifdef EIGEN_USE_LAPACKE
+#include "src/Cholesky/LLT_MKL.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_CHOLESKY_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/CholmodSupport b/vendor/eigen-3.1.91/Eigen/CholmodSupport
new file mode 100644
index 0000000..745b884
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/CholmodSupport
@@ -0,0 +1,45 @@
+#ifndef EIGEN_CHOLMODSUPPORT_MODULE_H
+#define EIGEN_CHOLMODSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+extern "C" {
+  #include <cholmod.h>
+}
+
+/** \ingroup Support_modules
+  * \defgroup CholmodSupport_Module CholmodSupport module
+  *
+  * This module provides an interface to the Cholmod library which is part of the <a href="http://www.cise.ufl.edu/research/sparse/SuiteSparse/">suitesparse</a> package.
+  * It provides the two following main factorization classes:
+  * - class CholmodSupernodalLLT: a supernodal LLT Cholesky factorization.
+  * - class CholmodDecomposiiton: a general L(D)LT Cholesky factorization with automatic or explicit runtime selection of the underlying factorization method (supernodal or simplicial).
+  *
+  * For the sake of completeness, this module also propose the two following classes:
+  * - class CholmodSimplicialLLT
+  * - class CholmodSimplicialLDLT
+  * Note that these classes does not bring any particular advantage compared to the built-in
+  * SimplicialLLT and SimplicialLDLT factorization classes.
+  *
+  * \code
+  * #include <Eigen/CholmodSupport>
+  * \endcode
+  *
+  * In order to use this module, the cholmod headers must be accessible from the include paths, and your binary must be linked to the cholmod library and its dependencies.
+  * The dependencies depend on how cholmod has been compiled.
+  * For a cmake based project, you can use our FindCholmod.cmake module to help you in this task.
+  *
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/CholmodSupport/CholmodSupport.h"
+
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_CHOLMODSUPPORT_MODULE_H
+
diff --git a/vendor/eigen-3.1.91/Eigen/Core b/vendor/eigen-3.1.91/Eigen/Core
new file mode 100644
index 0000000..8197c94
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Core
@@ -0,0 +1,377 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2007-2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CORE_H
+#define EIGEN_CORE_H
+
+// first thing Eigen does: stop the compiler from committing suicide
+#include "src/Core/util/DisableStupidWarnings.h"
+
+// then include this file where all our macros are defined. It's really important to do it first because
+// it's where we do all the alignment settings (platform detection and honoring the user's will if he
+// defined e.g. EIGEN_DONT_ALIGN) so it needs to be done before we do anything with vectorization.
+#include "src/Core/util/Macros.h"
+
+#include <complex>
+
+// this include file manages BLAS and MKL related macros
+// and inclusion of their respective header files
+#include "src/Core/util/MKL_support.h"
+
+// if alignment is disabled, then disable vectorization. Note: EIGEN_ALIGN is the proper check, it takes into
+// account both the user's will (EIGEN_DONT_ALIGN) and our own platform checks
+#if !EIGEN_ALIGN
+  #ifndef EIGEN_DONT_VECTORIZE
+    #define EIGEN_DONT_VECTORIZE
+  #endif
+#endif
+
+#ifdef _MSC_VER
+  #include <malloc.h> // for _aligned_malloc -- need it regardless of whether vectorization is enabled
+  #if (_MSC_VER >= 1500) // 2008 or later
+    // Remember that usage of defined() in a #define is undefined by the standard.
+    // a user reported that in 64-bit mode, MSVC doesn't care to define _M_IX86_FP.
+    #if (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(_M_X64)
+      #define EIGEN_SSE2_ON_MSVC_2008_OR_LATER
+    #endif
+  #endif
+#else
+  // Remember that usage of defined() in a #define is undefined by the standard
+  #if (defined __SSE2__) && ( (!defined __GNUC__) || (defined __INTEL_COMPILER) || EIGEN_GNUC_AT_LEAST(4,2) )
+    #define EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC
+  #endif
+#endif
+
+#ifndef EIGEN_DONT_VECTORIZE
+
+  #if defined (EIGEN_SSE2_ON_NON_MSVC_BUT_NOT_OLD_GCC) || defined(EIGEN_SSE2_ON_MSVC_2008_OR_LATER)
+
+    // Defines symbols for compile-time detection of which instructions are
+    // used.
+    // EIGEN_VECTORIZE_YY is defined if and only if the instruction set YY is used
+    #define EIGEN_VECTORIZE
+    #define EIGEN_VECTORIZE_SSE
+    #define EIGEN_VECTORIZE_SSE2
+
+    // Detect sse3/ssse3/sse4:
+    // gcc and icc defines __SSE3__, ...
+    // there is no way to know about this on msvc. You can define EIGEN_VECTORIZE_SSE* if you
+    // want to force the use of those instructions with msvc.
+    #ifdef __SSE3__
+      #define EIGEN_VECTORIZE_SSE3
+    #endif
+    #ifdef __SSSE3__
+      #define EIGEN_VECTORIZE_SSSE3
+    #endif
+    #ifdef __SSE4_1__
+      #define EIGEN_VECTORIZE_SSE4_1
+    #endif
+    #ifdef __SSE4_2__
+      #define EIGEN_VECTORIZE_SSE4_2
+    #endif
+
+    // include files
+
+    // This extern "C" works around a MINGW-w64 compilation issue
+    // https://sourceforge.net/tracker/index.php?func=detail&aid=3018394&group_id=202880&atid=983354
+    // In essence, intrin.h is included by windows.h and also declares intrinsics (just as emmintrin.h etc. below do).
+    // However, intrin.h uses an extern "C" declaration, and g++ thus complains of duplicate declarations
+    // with conflicting linkage.  The linkage for intrinsics doesn't matter, but at that stage the compiler doesn't know;
+    // so, to avoid compile errors when windows.h is included after Eigen/Core, ensure intrinsics are extern "C" here too.
+    // notice that since these are C headers, the extern "C" is theoretically needed anyways.
+    extern "C" {
+      // In theory we should only include immintrin.h and not the other *mmintrin.h header files directly.
+      // Doing so triggers some issues with ICC. However old gcc versions seems to not have this file, thus:
+      #ifdef __INTEL_COMPILER
+        #include <immintrin.h>
+      #else
+        #include <emmintrin.h>
+        #include <xmmintrin.h>
+        #ifdef  EIGEN_VECTORIZE_SSE3
+        #include <pmmintrin.h>
+        #endif
+        #ifdef EIGEN_VECTORIZE_SSSE3
+        #include <tmmintrin.h>
+        #endif
+        #ifdef EIGEN_VECTORIZE_SSE4_1
+        #include <smmintrin.h>
+        #endif
+        #ifdef EIGEN_VECTORIZE_SSE4_2
+        #include <nmmintrin.h>
+        #endif
+      #endif
+    } // end extern "C"
+  #elif defined __ALTIVEC__
+    #define EIGEN_VECTORIZE
+    #define EIGEN_VECTORIZE_ALTIVEC
+    #include <altivec.h>
+    // We need to #undef all these ugly tokens defined in <altivec.h>
+    // => use __vector instead of vector
+    #undef bool
+    #undef vector
+    #undef pixel
+  #elif defined  __ARM_NEON__
+    #define EIGEN_VECTORIZE
+    #define EIGEN_VECTORIZE_NEON
+    #include <arm_neon.h>
+  #endif
+#endif
+
+#if (defined _OPENMP) && (!defined EIGEN_DONT_PARALLELIZE)
+  #define EIGEN_HAS_OPENMP
+#endif
+
+#ifdef EIGEN_HAS_OPENMP
+#include <omp.h>
+#endif
+
+// MSVC for windows mobile does not have the errno.h file
+#if !(defined(_MSC_VER) && defined(_WIN32_WCE)) && !defined(__ARMCC_VERSION)
+#define EIGEN_HAS_ERRNO
+#endif
+
+#ifdef EIGEN_HAS_ERRNO
+#include <cerrno>
+#endif
+#include <cstddef>
+#include <cstdlib>
+#include <cmath>
+#include <cassert>
+#include <functional>
+#include <iosfwd>
+#include <cstring>
+#include <string>
+#include <limits>
+#include <climits> // for CHAR_BIT
+// for min/max:
+#include <algorithm>
+
+// for outputting debug info
+#ifdef EIGEN_DEBUG_ASSIGN
+#include <iostream>
+#endif
+
+// required for __cpuid, needs to be included after cmath
+#if defined(_MSC_VER) && (defined(_M_IX86)||defined(_M_X64))
+  #include <intrin.h>
+#endif
+
+#if defined(_CPPUNWIND) || defined(__EXCEPTIONS)
+  #define EIGEN_EXCEPTIONS
+#endif
+
+#ifdef EIGEN_EXCEPTIONS
+  #include <new>
+#endif
+
+/** \brief Namespace containing all symbols from the %Eigen library. */
+namespace Eigen {
+
+inline static const char *SimdInstructionSetsInUse(void) {
+#if defined(EIGEN_VECTORIZE_SSE4_2)
+  return "SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2";
+#elif defined(EIGEN_VECTORIZE_SSE4_1)
+  return "SSE, SSE2, SSE3, SSSE3, SSE4.1";
+#elif defined(EIGEN_VECTORIZE_SSSE3)
+  return "SSE, SSE2, SSE3, SSSE3";
+#elif defined(EIGEN_VECTORIZE_SSE3)
+  return "SSE, SSE2, SSE3";
+#elif defined(EIGEN_VECTORIZE_SSE2)
+  return "SSE, SSE2";
+#elif defined(EIGEN_VECTORIZE_ALTIVEC)
+  return "AltiVec";
+#elif defined(EIGEN_VECTORIZE_NEON)
+  return "ARM NEON";
+#else
+  return "None";
+#endif
+}
+
+} // end namespace Eigen
+
+#define STAGE10_FULL_EIGEN2_API             10
+#define STAGE20_RESOLVE_API_CONFLICTS       20
+#define STAGE30_FULL_EIGEN3_API             30
+#define STAGE40_FULL_EIGEN3_STRICTNESS      40
+#define STAGE99_NO_EIGEN2_SUPPORT           99
+
+#if   defined EIGEN2_SUPPORT_STAGE40_FULL_EIGEN3_STRICTNESS
+  #define EIGEN2_SUPPORT
+  #define EIGEN2_SUPPORT_STAGE STAGE40_FULL_EIGEN3_STRICTNESS
+#elif defined EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API
+  #define EIGEN2_SUPPORT
+  #define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API
+#elif defined EIGEN2_SUPPORT_STAGE20_RESOLVE_API_CONFLICTS
+  #define EIGEN2_SUPPORT
+  #define EIGEN2_SUPPORT_STAGE STAGE20_RESOLVE_API_CONFLICTS
+#elif defined EIGEN2_SUPPORT_STAGE10_FULL_EIGEN2_API
+  #define EIGEN2_SUPPORT
+  #define EIGEN2_SUPPORT_STAGE STAGE10_FULL_EIGEN2_API
+#elif defined EIGEN2_SUPPORT
+  // default to stage 3, that's what it's always meant
+  #define EIGEN2_SUPPORT_STAGE30_FULL_EIGEN3_API
+  #define EIGEN2_SUPPORT_STAGE STAGE30_FULL_EIGEN3_API
+#else
+  #define EIGEN2_SUPPORT_STAGE STAGE99_NO_EIGEN2_SUPPORT
+#endif
+
+#ifdef EIGEN2_SUPPORT
+#undef minor
+#endif
+
+// we use size_t frequently and we'll never remember to prepend it with std:: everytime just to
+// ensure QNX/QCC support
+using std::size_t;
+// gcc 4.6.0 wants std:: for ptrdiff_t 
+using std::ptrdiff_t;
+
+/** \defgroup Core_Module Core module
+  * This is the main module of Eigen providing dense matrix and vector support
+  * (both fixed and dynamic size) with all the features corresponding to a BLAS library
+  * and much more...
+  *
+  * \code
+  * #include <Eigen/Core>
+  * \endcode
+  */
+
+#include "src/Core/util/Constants.h"
+#include "src/Core/util/ForwardDeclarations.h"
+#include "src/Core/util/Meta.h"
+#include "src/Core/util/XprHelper.h"
+#include "src/Core/util/StaticAssert.h"
+#include "src/Core/util/Memory.h"
+
+#include "src/Core/NumTraits.h"
+#include "src/Core/MathFunctions.h"
+#include "src/Core/GenericPacketMath.h"
+
+#if defined EIGEN_VECTORIZE_SSE
+  #include "src/Core/arch/SSE/PacketMath.h"
+  #include "src/Core/arch/SSE/MathFunctions.h"
+  #include "src/Core/arch/SSE/Complex.h"
+#elif defined EIGEN_VECTORIZE_ALTIVEC
+  #include "src/Core/arch/AltiVec/PacketMath.h"
+  #include "src/Core/arch/AltiVec/Complex.h"
+#elif defined EIGEN_VECTORIZE_NEON
+  #include "src/Core/arch/NEON/PacketMath.h"
+  #include "src/Core/arch/NEON/Complex.h"
+#endif
+
+#include "src/Core/arch/Default/Settings.h"
+
+#include "src/Core/Functors.h"
+#include "src/Core/DenseCoeffsBase.h"
+#include "src/Core/DenseBase.h"
+#include "src/Core/MatrixBase.h"
+#include "src/Core/EigenBase.h"
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN // work around Doxygen bug triggered by Assign.h r814874
+                                // at least confirmed with Doxygen 1.5.5 and 1.5.6
+  #include "src/Core/Assign.h"
+#endif
+
+#include "src/Core/util/BlasUtil.h"
+#include "src/Core/DenseStorage.h"
+#include "src/Core/NestByValue.h"
+#include "src/Core/ForceAlignedAccess.h"
+#include "src/Core/ReturnByValue.h"
+#include "src/Core/NoAlias.h"
+#include "src/Core/PlainObjectBase.h"
+#include "src/Core/Matrix.h"
+#include "src/Core/Array.h"
+#include "src/Core/CwiseBinaryOp.h"
+#include "src/Core/CwiseUnaryOp.h"
+#include "src/Core/CwiseNullaryOp.h"
+#include "src/Core/CwiseUnaryView.h"
+#include "src/Core/SelfCwiseBinaryOp.h"
+#include "src/Core/Dot.h"
+#include "src/Core/StableNorm.h"
+#include "src/Core/MapBase.h"
+#include "src/Core/Stride.h"
+#include "src/Core/Map.h"
+#include "src/Core/Block.h"
+#include "src/Core/VectorBlock.h"
+#include "src/Core/Ref.h"
+#include "src/Core/Transpose.h"
+#include "src/Core/DiagonalMatrix.h"
+#include "src/Core/Diagonal.h"
+#include "src/Core/DiagonalProduct.h"
+#include "src/Core/PermutationMatrix.h"
+#include "src/Core/Transpositions.h"
+#include "src/Core/Redux.h"
+#include "src/Core/Visitor.h"
+#include "src/Core/Fuzzy.h"
+#include "src/Core/IO.h"
+#include "src/Core/Swap.h"
+#include "src/Core/CommaInitializer.h"
+#include "src/Core/Flagged.h"
+#include "src/Core/ProductBase.h"
+#include "src/Core/GeneralProduct.h"
+#include "src/Core/TriangularMatrix.h"
+#include "src/Core/SelfAdjointView.h"
+#include "src/Core/products/GeneralBlockPanelKernel.h"
+#include "src/Core/products/Parallelizer.h"
+#include "src/Core/products/CoeffBasedProduct.h"
+#include "src/Core/products/GeneralMatrixVector.h"
+#include "src/Core/products/GeneralMatrixMatrix.h"
+#include "src/Core/SolveTriangular.h"
+#include "src/Core/products/GeneralMatrixMatrixTriangular.h"
+#include "src/Core/products/SelfadjointMatrixVector.h"
+#include "src/Core/products/SelfadjointMatrixMatrix.h"
+#include "src/Core/products/SelfadjointProduct.h"
+#include "src/Core/products/SelfadjointRank2Update.h"
+#include "src/Core/products/TriangularMatrixVector.h"
+#include "src/Core/products/TriangularMatrixMatrix.h"
+#include "src/Core/products/TriangularSolverMatrix.h"
+#include "src/Core/products/TriangularSolverVector.h"
+#include "src/Core/BandMatrix.h"
+#include "src/Core/CoreIterators.h"
+
+#include "src/Core/BooleanRedux.h"
+#include "src/Core/Select.h"
+#include "src/Core/VectorwiseOp.h"
+#include "src/Core/Random.h"
+#include "src/Core/Replicate.h"
+#include "src/Core/Reverse.h"
+#include "src/Core/ArrayBase.h"
+#include "src/Core/ArrayWrapper.h"
+
+#ifdef EIGEN_ENABLE_EVALUATORS
+#include "src/Core/Product.h"
+#include "src/Core/CoreEvaluators.h"
+#include "src/Core/AssignEvaluator.h"
+#include "src/Core/ProductEvaluators.h"
+#endif
+
+#ifdef EIGEN_USE_BLAS
+#include "src/Core/products/GeneralMatrixMatrix_MKL.h"
+#include "src/Core/products/GeneralMatrixVector_MKL.h"
+#include "src/Core/products/GeneralMatrixMatrixTriangular_MKL.h"
+#include "src/Core/products/SelfadjointMatrixMatrix_MKL.h"
+#include "src/Core/products/SelfadjointMatrixVector_MKL.h"
+#include "src/Core/products/TriangularMatrixMatrix_MKL.h"
+#include "src/Core/products/TriangularMatrixVector_MKL.h"
+#include "src/Core/products/TriangularSolverMatrix_MKL.h"
+#endif // EIGEN_USE_BLAS
+
+#ifdef EIGEN_USE_MKL_VML
+#include "src/Core/Assign_MKL.h"
+#endif
+
+#include "src/Core/GlobalFunctions.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#ifdef EIGEN2_SUPPORT
+#include "Eigen2Support"
+#endif
+
+#endif // EIGEN_CORE_H
diff --git a/vendor/eigen-3.1.91/Eigen/Dense b/vendor/eigen-3.1.91/Eigen/Dense
new file mode 100644
index 0000000..5768910
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Dense
@@ -0,0 +1,7 @@
+#include "Core"
+#include "LU"
+#include "Cholesky"
+#include "QR"
+#include "SVD"
+#include "Geometry"
+#include "Eigenvalues"
diff --git a/vendor/eigen-3.1.91/Eigen/Eigen b/vendor/eigen-3.1.91/Eigen/Eigen
new file mode 100644
index 0000000..19b40ea
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Eigen
@@ -0,0 +1,2 @@
+#include "Dense"
+//#include "Sparse"
diff --git a/vendor/eigen-3.1.91/Eigen/Eigen2Support b/vendor/eigen-3.1.91/Eigen/Eigen2Support
new file mode 100644
index 0000000..36156d2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Eigen2Support
@@ -0,0 +1,82 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2SUPPORT_H
+#define EIGEN2SUPPORT_H
+
+#if (!defined(EIGEN2_SUPPORT)) || (!defined(EIGEN_CORE_H))
+#error Eigen2 support must be enabled by defining EIGEN2_SUPPORT before including any Eigen header
+#endif
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \ingroup Support_modules
+  * \defgroup Eigen2Support_Module Eigen2 support module
+  * This module provides a couple of deprecated functions improving the compatibility with Eigen2.
+  *
+  * To use it, define EIGEN2_SUPPORT before including any Eigen header
+  * \code
+  * #define EIGEN2_SUPPORT
+  * \endcode
+  *
+  */
+
+#include "src/Eigen2Support/Macros.h"
+#include "src/Eigen2Support/Memory.h"
+#include "src/Eigen2Support/Meta.h"
+#include "src/Eigen2Support/Lazy.h"
+#include "src/Eigen2Support/Cwise.h"
+#include "src/Eigen2Support/CwiseOperators.h"
+#include "src/Eigen2Support/TriangularSolver.h"
+#include "src/Eigen2Support/Block.h"
+#include "src/Eigen2Support/VectorBlock.h"
+#include "src/Eigen2Support/Minor.h"
+#include "src/Eigen2Support/MathFunctions.h"
+
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+// Eigen2 used to include iostream
+#include<iostream>
+
+#define EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \
+using Eigen::Matrix##SizeSuffix##TypeSuffix; \
+using Eigen::Vector##SizeSuffix##TypeSuffix; \
+using Eigen::RowVector##SizeSuffix##TypeSuffix;
+
+#define EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(TypeSuffix) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \
+
+#define EIGEN_USING_MATRIX_TYPEDEFS \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(i) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(f) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(d) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(cf) \
+EIGEN_USING_MATRIX_TYPEDEFS_FOR_TYPE(cd)
+
+#define USING_PART_OF_NAMESPACE_EIGEN \
+EIGEN_USING_MATRIX_TYPEDEFS \
+using Eigen::Matrix; \
+using Eigen::MatrixBase; \
+using Eigen::ei_random; \
+using Eigen::ei_real; \
+using Eigen::ei_imag; \
+using Eigen::ei_conj; \
+using Eigen::ei_abs; \
+using Eigen::ei_abs2; \
+using Eigen::ei_sqrt; \
+using Eigen::ei_exp; \
+using Eigen::ei_log; \
+using Eigen::ei_sin; \
+using Eigen::ei_cos;
+
+#endif // EIGEN2SUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/Eigenvalues b/vendor/eigen-3.1.91/Eigen/Eigenvalues
new file mode 100644
index 0000000..53c5a73
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Eigenvalues
@@ -0,0 +1,48 @@
+#ifndef EIGEN_EIGENVALUES_MODULE_H
+#define EIGEN_EIGENVALUES_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include "Cholesky"
+#include "Jacobi"
+#include "Householder"
+#include "LU"
+#include "Geometry"
+
+/** \defgroup Eigenvalues_Module Eigenvalues module
+  *
+  *
+  *
+  * This module mainly provides various eigenvalue solvers.
+  * This module also provides some MatrixBase methods, including:
+  *  - MatrixBase::eigenvalues(),
+  *  - MatrixBase::operatorNorm()
+  *
+  * \code
+  * #include <Eigen/Eigenvalues>
+  * \endcode
+  */
+
+#include "src/Eigenvalues/Tridiagonalization.h"
+#include "src/Eigenvalues/RealSchur.h"
+#include "src/Eigenvalues/EigenSolver.h"
+#include "src/Eigenvalues/SelfAdjointEigenSolver.h"
+#include "src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h"
+#include "src/Eigenvalues/HessenbergDecomposition.h"
+#include "src/Eigenvalues/ComplexSchur.h"
+#include "src/Eigenvalues/ComplexEigenSolver.h"
+#include "src/Eigenvalues/RealQZ.h"
+#include "src/Eigenvalues/GeneralizedEigenSolver.h"
+#include "src/Eigenvalues/MatrixBaseEigenvalues.h"
+#ifdef EIGEN_USE_LAPACKE
+#include "src/Eigenvalues/RealSchur_MKL.h"
+#include "src/Eigenvalues/ComplexSchur_MKL.h"
+#include "src/Eigenvalues/SelfAdjointEigenSolver_MKL.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_EIGENVALUES_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/Geometry b/vendor/eigen-3.1.91/Eigen/Geometry
new file mode 100644
index 0000000..efd9d45
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Geometry
@@ -0,0 +1,63 @@
+#ifndef EIGEN_GEOMETRY_MODULE_H
+#define EIGEN_GEOMETRY_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include "SVD"
+#include "LU"
+#include <limits>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+/** \defgroup Geometry_Module Geometry module
+  *
+  *
+  *
+  * This module provides support for:
+  *  - fixed-size homogeneous transformations
+  *  - translation, scaling, 2D and 3D rotations
+  *  - quaternions
+  *  - \ref MatrixBase::cross() "cross product"
+  *  - \ref MatrixBase::unitOrthogonal() "orthognal vector generation"
+  *  - some linear components: parametrized-lines and hyperplanes
+  *
+  * \code
+  * #include <Eigen/Geometry>
+  * \endcode
+  */
+
+#include "src/Geometry/OrthoMethods.h"
+#include "src/Geometry/EulerAngles.h"
+
+#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+  #include "src/Geometry/Homogeneous.h"
+  #include "src/Geometry/RotationBase.h"
+  #include "src/Geometry/Rotation2D.h"
+  #include "src/Geometry/Quaternion.h"
+  #include "src/Geometry/AngleAxis.h"
+  #include "src/Geometry/Transform.h"
+  #include "src/Geometry/Translation.h"
+  #include "src/Geometry/Scaling.h"
+  #include "src/Geometry/Hyperplane.h"
+  #include "src/Geometry/ParametrizedLine.h"
+  #include "src/Geometry/AlignedBox.h"
+  #include "src/Geometry/Umeyama.h"
+
+  #if defined EIGEN_VECTORIZE_SSE
+    #include "src/Geometry/arch/Geometry_SSE.h"
+  #endif
+#endif
+
+#ifdef EIGEN2_SUPPORT
+#include "src/Eigen2Support/Geometry/All.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_GEOMETRY_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
+
diff --git a/vendor/eigen-3.1.91/Eigen/Householder b/vendor/eigen-3.1.91/Eigen/Householder
new file mode 100644
index 0000000..6e348db
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Householder
@@ -0,0 +1,23 @@
+#ifndef EIGEN_HOUSEHOLDER_MODULE_H
+#define EIGEN_HOUSEHOLDER_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup Householder_Module Householder module
+  * This module provides Householder transformations.
+  *
+  * \code
+  * #include <Eigen/Householder>
+  * \endcode
+  */
+
+#include "src/Householder/Householder.h"
+#include "src/Householder/HouseholderSequence.h"
+#include "src/Householder/BlockHouseholder.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_HOUSEHOLDER_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/IterativeLinearSolvers b/vendor/eigen-3.1.91/Eigen/IterativeLinearSolvers
new file mode 100644
index 0000000..0f4159d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/IterativeLinearSolvers
@@ -0,0 +1,40 @@
+#ifndef EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
+#define EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
+
+#include "SparseCore"
+#include "OrderingMethods"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** 
+  * \defgroup IterativeLinearSolvers_Module IterativeLinearSolvers module
+  *
+  * This module currently provides iterative methods to solve problems of the form \c A \c x = \c b, where \c A is a squared matrix, usually very large and sparse.
+  * Those solvers are accessible via the following classes:
+  *  - ConjugateGradient for selfadjoint (hermitian) matrices,
+  *  - BiCGSTAB for general square matrices.
+  *
+  * These iterative solvers are associated with some preconditioners:
+  *  - IdentityPreconditioner - not really useful
+  *  - DiagonalPreconditioner - also called JAcobi preconditioner, work very well on diagonal dominant matrices.
+  *  - IncompleteILUT - incomplete LU factorization with dual thresholding
+  *
+  * Such problems can also be solved using the direct sparse decomposition modules: SparseCholesky, CholmodSupport, UmfPackSupport, SuperLUSupport.
+  *
+  * \code
+  * #include <Eigen/IterativeLinearSolvers>
+  * \endcode
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/IterativeLinearSolvers/IterativeSolverBase.h"
+#include "src/IterativeLinearSolvers/BasicPreconditioners.h"
+#include "src/IterativeLinearSolvers/ConjugateGradient.h"
+#include "src/IterativeLinearSolvers/BiCGSTAB.h"
+#include "src/IterativeLinearSolvers/IncompleteLUT.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_ITERATIVELINEARSOLVERS_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/Jacobi b/vendor/eigen-3.1.91/Eigen/Jacobi
new file mode 100644
index 0000000..ba8a4dc
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Jacobi
@@ -0,0 +1,26 @@
+#ifndef EIGEN_JACOBI_MODULE_H
+#define EIGEN_JACOBI_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup Jacobi_Module Jacobi module
+  * This module provides Jacobi and Givens rotations.
+  *
+  * \code
+  * #include <Eigen/Jacobi>
+  * \endcode
+  *
+  * In addition to listed classes, it defines the two following MatrixBase methods to apply a Jacobi or Givens rotation:
+  *  - MatrixBase::applyOnTheLeft()
+  *  - MatrixBase::applyOnTheRight().
+  */
+
+#include "src/Jacobi/Jacobi.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_JACOBI_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
+
diff --git a/vendor/eigen-3.1.91/Eigen/LU b/vendor/eigen-3.1.91/Eigen/LU
new file mode 100644
index 0000000..db57955
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/LU
@@ -0,0 +1,41 @@
+#ifndef EIGEN_LU_MODULE_H
+#define EIGEN_LU_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup LU_Module LU module
+  * This module includes %LU decomposition and related notions such as matrix inversion and determinant.
+  * This module defines the following MatrixBase methods:
+  *  - MatrixBase::inverse()
+  *  - MatrixBase::determinant()
+  *
+  * \code
+  * #include <Eigen/LU>
+  * \endcode
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/Kernel.h"
+#include "src/misc/Image.h"
+#include "src/LU/FullPivLU.h"
+#include "src/LU/PartialPivLU.h"
+#ifdef EIGEN_USE_LAPACKE
+#include "src/LU/PartialPivLU_MKL.h"
+#endif
+#include "src/LU/Determinant.h"
+#include "src/LU/Inverse.h"
+
+#if defined EIGEN_VECTORIZE_SSE
+  #include "src/LU/arch/Inverse_SSE.h"
+#endif
+
+#ifdef EIGEN2_SUPPORT
+  #include "src/Eigen2Support/LU.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_LU_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/LeastSquares b/vendor/eigen-3.1.91/Eigen/LeastSquares
new file mode 100644
index 0000000..35137c2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/LeastSquares
@@ -0,0 +1,32 @@
+#ifndef EIGEN_REGRESSION_MODULE_H
+#define EIGEN_REGRESSION_MODULE_H
+
+#ifndef EIGEN2_SUPPORT
+#error LeastSquares is only available in Eigen2 support mode (define EIGEN2_SUPPORT)
+#endif
+
+// exclude from normal eigen3-only documentation
+#ifdef EIGEN2_SUPPORT
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include "Eigenvalues"
+#include "Geometry"
+
+/** \defgroup LeastSquares_Module LeastSquares module
+  * This module provides linear regression and related features.
+  *
+  * \code
+  * #include <Eigen/LeastSquares>
+  * \endcode
+  */
+
+#include "src/Eigen2Support/LeastSquares.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN2_SUPPORT
+
+#endif // EIGEN_REGRESSION_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/MetisSupport b/vendor/eigen-3.1.91/Eigen/MetisSupport
new file mode 100644
index 0000000..6a113f7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/MetisSupport
@@ -0,0 +1,28 @@
+#ifndef EIGEN_METISSUPPORT_MODULE_H
+#define EIGEN_METISSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+extern "C" {
+#include <metis.h>
+}
+
+
+/** \ingroup Support_modules
+  * \defgroup MetisSupport_Module MetisSupport module
+  *
+  * \code
+  * #include <Eigen/MetisSupport>
+  * \endcode
+  * This module defines an interface to the METIS reordering package (http://glaros.dtc.umn.edu/gkhome/views/metis). 
+  * It can be used just as any other built-in method as explained in \link OrderingMethods_Module here. \endlink
+  */
+
+
+#include "src/MetisSupport/MetisSupport.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_METISSUPPORT_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/OrderingMethods b/vendor/eigen-3.1.91/Eigen/OrderingMethods
new file mode 100644
index 0000000..7c0f1ff
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/OrderingMethods
@@ -0,0 +1,66 @@
+#ifndef EIGEN_ORDERINGMETHODS_MODULE_H
+#define EIGEN_ORDERINGMETHODS_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** 
+  * \defgroup OrderingMethods_Module OrderingMethods module
+  *
+  * This module is currently for internal use only
+  * 
+  * It defines various built-in and external ordering methods for sparse matrices. 
+  * They are typically used to reduce the number of elements during 
+  * the sparse matrix decomposition (LLT, LU, QR).
+  * Precisely, in a preprocessing step, a permutation matrix P is computed using 
+  * those ordering methods and applied to the columns of the matrix. 
+  * Using for instance the sparse Cholesky decomposition, it is expected that 
+  * the nonzeros elements in LLT(A*P) will be much smaller than that in LLT(A).
+  * 
+  * 
+  * Usage : 
+  * \code
+  * #include <Eigen/OrderingMethods>
+  * \endcode
+  * 
+  * A simple usage is as a template parameter in the sparse decomposition classes : 
+  * 
+  * \code 
+  * SparseLU<MatrixType, COLAMDOrdering<int> > solver;
+  * \endcode 
+  * 
+  * \code 
+  * SparseQR<MatrixType, COLAMDOrdering<int> > solver;
+  * \endcode
+  * 
+  * It is possible as well to call directly a particular ordering method for your own purpose, 
+  * \code 
+  * AMDOrdering<int> ordering;
+  * PermutationMatrix<Dynamic, Dynamic, int> perm;
+  * SparseMatrix<double> A; 
+  * //Fill the matrix ...
+  * 
+  * ordering(A, perm); // Call AMD
+  * \endcode
+  * 
+  * \note Some of these methods (like AMD or METIS), need the sparsity pattern 
+  * of the input matrix to be symmetric. When the matrix is structurally unsymmetric, 
+  * Eigen computes internally the pattern of \f$A^T*A\f$ before calling the method.
+  * If your matrix is already symmetric (at leat in structure), you can avoid that
+  * by calling the method with a SelfAdjointView type.
+  * 
+  * \code
+  *  // Call the ordering on the pattern of the lower triangular matrix A
+  * ordering(A.selfadjointView<Lower>(), perm);
+  * \endcode
+  */
+
+#ifndef EIGEN_MPL2_ONLY
+#include "src/OrderingMethods/Amd.h"
+#endif
+
+#include "src/OrderingMethods/Ordering.h"
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_ORDERINGMETHODS_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/PaStiXSupport b/vendor/eigen-3.1.91/Eigen/PaStiXSupport
new file mode 100644
index 0000000..7c616ee
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/PaStiXSupport
@@ -0,0 +1,46 @@
+#ifndef EIGEN_PASTIXSUPPORT_MODULE_H
+#define EIGEN_PASTIXSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include <complex.h>
+extern "C" {
+#include <pastix_nompi.h>
+#include <pastix.h>
+}
+
+#ifdef complex
+#undef complex
+#endif
+
+/** \ingroup Support_modules
+  * \defgroup PaStiXSupport_Module PaStiXSupport module
+  * 
+  * This module provides an interface to the <a href="http://pastix.gforge.inria.fr/">PaSTiX</a> library.
+  * PaSTiX is a general \b supernodal, \b parallel and \b opensource sparse solver.
+  * It provides the two following main factorization classes:
+  * - class PastixLLT : a supernodal, parallel LLt Cholesky factorization.
+  * - class PastixLDLT: a supernodal, parallel LDLt Cholesky factorization.
+  * - class PastixLU : a supernodal, parallel LU factorization (optimized for a symmetric pattern).
+  * 
+  * \code
+  * #include <Eigen/PaStiXSupport>
+  * \endcode
+  *
+  * In order to use this module, the PaSTiX headers must be accessible from the include paths, and your binary must be linked to the PaSTiX library and its dependencies.
+  * The dependencies depend on how PaSTiX has been compiled.
+  * For a cmake based project, you can use our FindPaSTiX.cmake module to help you in this task.
+  *
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/PaStiXSupport/PaStiXSupport.h"
+
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_PASTIXSUPPORT_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/PardisoSupport b/vendor/eigen-3.1.91/Eigen/PardisoSupport
new file mode 100644
index 0000000..99330ce
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/PardisoSupport
@@ -0,0 +1,30 @@
+#ifndef EIGEN_PARDISOSUPPORT_MODULE_H
+#define EIGEN_PARDISOSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include <mkl_pardiso.h>
+
+#include <unsupported/Eigen/SparseExtra>
+
+/** \ingroup Support_modules
+  * \defgroup PardisoSupport_Module PardisoSupport module
+  *
+  * This module brings support for the Intel(R) MKL PARDISO direct sparse solvers.
+  *
+  * \code
+  * #include <Eigen/PardisoSupport>
+  * \endcode
+  *
+  * In order to use this module, the MKL headers must be accessible from the include paths, and your binary must be linked to the MKL library and its dependencies.
+  * See this \ref TopicUsingIntelMKL "page" for more information on MKL-Eigen integration.
+  * 
+  */
+
+#include "src/PardisoSupport/PardisoSupport.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_PARDISOSUPPORT_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/QR b/vendor/eigen-3.1.91/Eigen/QR
new file mode 100644
index 0000000..ac5b026
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/QR
@@ -0,0 +1,45 @@
+#ifndef EIGEN_QR_MODULE_H
+#define EIGEN_QR_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include "Cholesky"
+#include "Jacobi"
+#include "Householder"
+
+/** \defgroup QR_Module QR module
+  *
+  *
+  *
+  * This module provides various QR decompositions
+  * This module also provides some MatrixBase methods, including:
+  *  - MatrixBase::qr(),
+  *
+  * \code
+  * #include <Eigen/QR>
+  * \endcode
+  */
+
+#include "src/misc/Solve.h"
+#include "src/QR/HouseholderQR.h"
+#include "src/QR/FullPivHouseholderQR.h"
+#include "src/QR/ColPivHouseholderQR.h"
+#ifdef EIGEN_USE_LAPACKE
+#include "src/QR/HouseholderQR_MKL.h"
+#include "src/QR/ColPivHouseholderQR_MKL.h"
+#endif
+
+#ifdef EIGEN2_SUPPORT
+#include "src/Eigen2Support/QR.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#ifdef EIGEN2_SUPPORT
+#include "Eigenvalues"
+#endif
+
+#endif // EIGEN_QR_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/QtAlignedMalloc b/vendor/eigen-3.1.91/Eigen/QtAlignedMalloc
new file mode 100644
index 0000000..46f7d83
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/QtAlignedMalloc
@@ -0,0 +1,34 @@
+
+#ifndef EIGEN_QTMALLOC_MODULE_H
+#define EIGEN_QTMALLOC_MODULE_H
+
+#include "Core"
+
+#if (!EIGEN_MALLOC_ALREADY_ALIGNED)
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+void *qMalloc(size_t size)
+{
+  return Eigen::internal::aligned_malloc(size);
+}
+
+void qFree(void *ptr)
+{
+  Eigen::internal::aligned_free(ptr);
+}
+
+void *qRealloc(void *ptr, size_t size)
+{
+  void* newPtr = Eigen::internal::aligned_malloc(size);
+  memcpy(newPtr, ptr, size);
+  Eigen::internal::aligned_free(ptr);
+  return newPtr;
+}
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif
+
+#endif // EIGEN_QTMALLOC_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/SPQRSupport b/vendor/eigen-3.1.91/Eigen/SPQRSupport
new file mode 100644
index 0000000..213e028
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SPQRSupport
@@ -0,0 +1,29 @@
+#ifndef EIGEN_SPQRSUPPORT_MODULE_H
+#define EIGEN_SPQRSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include "SuiteSparseQR.hpp"
+
+/** \ingroup Support_modules
+  * \defgroup SPQRSupport_Module SuiteSparseQR module
+  * 
+  * This module provides an interface to the SPQR library, which is part of the <a href="http://www.cise.ufl.edu/research/sparse/SuiteSparse/">suitesparse</a> package.
+  *
+  * \code
+  * #include <Eigen/SPQRSupport>
+  * \endcode
+  *
+  * In order to use this module, the SPQR headers must be accessible from the include paths, and your binary must be linked to the SPQR library and its dependencies (Cholmod, AMD, COLAMD,...).
+  * For a cmake based project, you can use our FindSPQR.cmake and FindCholmod.Cmake modules
+  *
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+#include "src/CholmodSupport/CholmodSupport.h"
+#include "src/SPQRSupport/SuiteSparseQRSupport.h"
+
+#endif
\ No newline at end of file
diff --git a/vendor/eigen-3.1.91/Eigen/SVD b/vendor/eigen-3.1.91/Eigen/SVD
new file mode 100644
index 0000000..fd31001
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SVD
@@ -0,0 +1,37 @@
+#ifndef EIGEN_SVD_MODULE_H
+#define EIGEN_SVD_MODULE_H
+
+#include "QR"
+#include "Householder"
+#include "Jacobi"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup SVD_Module SVD module
+  *
+  *
+  *
+  * This module provides SVD decomposition for matrices (both real and complex).
+  * This decomposition is accessible via the following MatrixBase method:
+  *  - MatrixBase::jacobiSvd()
+  *
+  * \code
+  * #include <Eigen/SVD>
+  * \endcode
+  */
+
+#include "src/misc/Solve.h"
+#include "src/SVD/JacobiSVD.h"
+#if defined(EIGEN_USE_LAPACKE) && !defined(EIGEN_USE_LAPACKE_STRICT)
+#include "src/SVD/JacobiSVD_MKL.h"
+#endif
+#include "src/SVD/UpperBidiagonalization.h"
+
+#ifdef EIGEN2_SUPPORT
+#include "src/Eigen2Support/SVD.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_SVD_MODULE_H
+/* vim: set filetype=cpp et sw=2 ts=2 ai: */
diff --git a/vendor/eigen-3.1.91/Eigen/Sparse b/vendor/eigen-3.1.91/Eigen/Sparse
new file mode 100644
index 0000000..9d4da4c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/Sparse
@@ -0,0 +1,27 @@
+#ifndef EIGEN_SPARSE_MODULE_H
+#define EIGEN_SPARSE_MODULE_H
+
+/** defgroup Sparse_modules Sparse modules
+  *
+  * Meta-module including all related modules:
+  * - SparseCore
+  * - OrderingMethods
+  * - SparseCholesky
+  * - SparseLU
+  * - SparseQR
+  * - IterativeLinearSolvers
+  *
+  * \code
+  * #include <Eigen/Sparse>
+  * \endcode
+  */
+
+#include "SparseCore"
+#include "OrderingMethods"
+#include "SparseCholesky"
+#include "SparseLU"
+#include "SparseQR"
+#include "IterativeLinearSolvers"
+
+#endif // EIGEN_SPARSE_MODULE_H
+
diff --git a/vendor/eigen-3.1.91/Eigen/SparseCholesky b/vendor/eigen-3.1.91/Eigen/SparseCholesky
new file mode 100644
index 0000000..800f17b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SparseCholesky
@@ -0,0 +1,38 @@
+#ifndef EIGEN_SPARSECHOLESKY_MODULE_H
+#define EIGEN_SPARSECHOLESKY_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** 
+  * \defgroup SparseCholesky_Module SparseCholesky module
+  *
+  * This module currently provides two variants of the direct sparse Cholesky decomposition for selfadjoint (hermitian) matrices.
+  * Those decompositions are accessible via the following classes:
+  *  - SimplicialLLt,
+  *  - SimplicialLDLt
+  *
+  * Such problems can also be solved using the ConjugateGradient solver from the IterativeLinearSolvers module.
+  *
+  * \code
+  * #include <Eigen/SparseCholesky>
+  * \endcode
+  */
+
+#ifdef EIGEN_MPL2_ONLY
+#error The SparseCholesky module has nothing to offer in MPL2 only mode
+#endif
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/SparseCholesky/SimplicialCholesky.h"
+
+#ifndef EIGEN_MPL2_ONLY
+#include "src/SparseCholesky/SimplicialCholesky_impl.h"
+#endif
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_SPARSECHOLESKY_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/SparseCore b/vendor/eigen-3.1.91/Eigen/SparseCore
new file mode 100644
index 0000000..9b5be5e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SparseCore
@@ -0,0 +1,64 @@
+#ifndef EIGEN_SPARSECORE_MODULE_H
+#define EIGEN_SPARSECORE_MODULE_H
+
+#include "Core"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#include <vector>
+#include <map>
+#include <cstdlib>
+#include <cstring>
+#include <algorithm>
+
+/** 
+  * \defgroup SparseCore_Module SparseCore module
+  *
+  * This module provides a sparse matrix representation, and basic associatd matrix manipulations
+  * and operations.
+  *
+  * See the \ref TutorialSparse "Sparse tutorial"
+  *
+  * \code
+  * #include <Eigen/SparseCore>
+  * \endcode
+  *
+  * This module depends on: Core.
+  */
+
+namespace Eigen {
+
+/** The type used to identify a general sparse storage. */
+struct Sparse {};
+
+}
+
+#include "src/SparseCore/SparseUtil.h"
+#include "src/SparseCore/SparseMatrixBase.h"
+#include "src/SparseCore/CompressedStorage.h"
+#include "src/SparseCore/AmbiVector.h"
+#include "src/SparseCore/SparseMatrix.h"
+#include "src/SparseCore/MappedSparseMatrix.h"
+#include "src/SparseCore/SparseVector.h"
+#include "src/SparseCore/SparseBlock.h"
+#include "src/SparseCore/SparseTranspose.h"
+#include "src/SparseCore/SparseCwiseUnaryOp.h"
+#include "src/SparseCore/SparseCwiseBinaryOp.h"
+#include "src/SparseCore/SparseDot.h"
+#include "src/SparseCore/SparsePermutation.h"
+#include "src/SparseCore/SparseRedux.h"
+#include "src/SparseCore/SparseFuzzy.h"
+#include "src/SparseCore/ConservativeSparseSparseProduct.h"
+#include "src/SparseCore/SparseSparseProductWithPruning.h"
+#include "src/SparseCore/SparseProduct.h"
+#include "src/SparseCore/SparseDenseProduct.h"
+#include "src/SparseCore/SparseDiagonalProduct.h"
+#include "src/SparseCore/SparseTriangularView.h"
+#include "src/SparseCore/SparseSelfAdjointView.h"
+#include "src/SparseCore/TriangularSolver.h"
+#include "src/SparseCore/SparseView.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_SPARSECORE_MODULE_H
+
diff --git a/vendor/eigen-3.1.91/Eigen/SparseLU b/vendor/eigen-3.1.91/Eigen/SparseLU
new file mode 100644
index 0000000..38b38b5
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SparseLU
@@ -0,0 +1,46 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSELU_MODULE_H
+#define EIGEN_SPARSELU_MODULE_H
+
+#include "SparseCore"
+
+/** 
+  * \defgroup SparseLU_Module SparseLU module
+  * This module defines a supernodal factorization of general sparse matrices.
+  * The code is fully optimized for supernode-panel updates with specialized kernels.
+  * Please, see the documentation of the SparseLU class for more details.
+  */
+
+// Ordering interface
+#include "OrderingMethods"
+
+#include "src/SparseLU/SparseLU_gemm_kernel.h"
+
+#include "src/SparseLU/SparseLU_Structs.h"
+#include "src/SparseLU/SparseLU_SupernodalMatrix.h"
+#include "src/SparseLU/SparseLUImpl.h"
+#include "src/SparseCore/SparseColEtree.h"
+#include "src/SparseLU/SparseLU_Memory.h"
+#include "src/SparseLU/SparseLU_heap_relax_snode.h"
+#include "src/SparseLU/SparseLU_relax_snode.h"
+#include "src/SparseLU/SparseLU_pivotL.h"
+#include "src/SparseLU/SparseLU_panel_dfs.h"
+#include "src/SparseLU/SparseLU_kernel_bmod.h"
+#include "src/SparseLU/SparseLU_panel_bmod.h"
+#include "src/SparseLU/SparseLU_column_dfs.h"
+#include "src/SparseLU/SparseLU_column_bmod.h"
+#include "src/SparseLU/SparseLU_copy_to_ucol.h"
+#include "src/SparseLU/SparseLU_pruneL.h"
+#include "src/SparseLU/SparseLU_Utils.h"
+#include "src/SparseLU/SparseLU.h"
+
+#endif // EIGEN_SPARSELU_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/SparseQR b/vendor/eigen-3.1.91/Eigen/SparseQR
new file mode 100644
index 0000000..f51913f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SparseQR
@@ -0,0 +1,29 @@
+#ifndef EIGEN_SPARSEQR_MODULE_H
+#define EIGEN_SPARSEQR_MODULE_H
+
+#include "SparseCore"
+#include "OrderingMethods"
+#include "src/Core/util/DisableStupidWarnings.h"
+
+/** \defgroup SparseQR_Module SparseQR module
+  * \brief Provides QR decomposition for sparse matrices
+  * 
+  * This module provides a simplicial version of the left-looking Sparse QR decomposition. 
+  * The columns of the input matrix should be reordered to limit the fill-in during the 
+  * decomposition. Built-in methods (COLAMD, AMD) or external  methods (METIS) can be used to this end.
+  * See the \link OrderingMethods_Module OrderingMethods\endlink module for the list 
+  * of built-in and external ordering methods.
+  * 
+  * \code
+  * #include <Eigen/SparseQR>
+  * \endcode
+  * 
+  * 
+  */
+#include "OrderingMethods"
+#include "src/SparseCore/SparseColEtree.h"
+#include "src/SparseQR/SparseQR.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/StdDeque b/vendor/eigen-3.1.91/Eigen/StdDeque
new file mode 100644
index 0000000..f272347
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/StdDeque
@@ -0,0 +1,27 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDDEQUE_MODULE_H
+#define EIGEN_STDDEQUE_MODULE_H
+
+#include "Core"
+#include <deque>
+
+#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */
+
+#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)
+
+#else
+
+#include "src/StlSupport/StdDeque.h"
+
+#endif
+
+#endif // EIGEN_STDDEQUE_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/StdList b/vendor/eigen-3.1.91/Eigen/StdList
new file mode 100644
index 0000000..225c1e1
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/StdList
@@ -0,0 +1,26 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDLIST_MODULE_H
+#define EIGEN_STDLIST_MODULE_H
+
+#include "Core"
+#include <list>
+
+#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */    
+
+#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)
+
+#else
+
+#include "src/StlSupport/StdList.h"
+
+#endif
+
+#endif // EIGEN_STDLIST_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/StdVector b/vendor/eigen-3.1.91/Eigen/StdVector
new file mode 100644
index 0000000..6b22627
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/StdVector
@@ -0,0 +1,27 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDVECTOR_MODULE_H
+#define EIGEN_STDVECTOR_MODULE_H
+
+#include "Core"
+#include <vector>
+
+#if (defined(_MSC_VER) && defined(_WIN64)) /* MSVC auto aligns in 64 bit builds */
+
+#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)
+
+#else
+
+#include "src/StlSupport/StdVector.h"
+
+#endif
+
+#endif // EIGEN_STDVECTOR_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/SuperLUSupport b/vendor/eigen-3.1.91/Eigen/SuperLUSupport
new file mode 100644
index 0000000..575e14f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/SuperLUSupport
@@ -0,0 +1,59 @@
+#ifndef EIGEN_SUPERLUSUPPORT_MODULE_H
+#define EIGEN_SUPERLUSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+#ifdef EMPTY
+#define EIGEN_EMPTY_WAS_ALREADY_DEFINED
+#endif
+
+typedef int int_t;
+#include <slu_Cnames.h>
+#include <supermatrix.h>
+#include <slu_util.h>
+
+// slu_util.h defines a preprocessor token named EMPTY which is really polluting,
+// so we remove it in favor of a SUPERLU_EMPTY token.
+// If EMPTY was already defined then we don't undef it.
+
+#if defined(EIGEN_EMPTY_WAS_ALREADY_DEFINED)
+# undef EIGEN_EMPTY_WAS_ALREADY_DEFINED
+#elif defined(EMPTY)
+# undef EMPTY
+#endif
+
+#define SUPERLU_EMPTY (-1)
+
+namespace Eigen { struct SluMatrix; }
+
+/** \ingroup Support_modules
+  * \defgroup SuperLUSupport_Module SuperLUSupport module
+  *
+  * This module provides an interface to the <a href="http://crd-legacy.lbl.gov/~xiaoye/SuperLU/">SuperLU</a> library.
+  * It provides the following factorization class:
+  * - class SuperLU: a supernodal sequential LU factorization.
+  * - class SuperILU: a supernodal sequential incomplete LU factorization (to be used as a preconditioner for iterative methods).
+  *
+  * \warning When including this module, you have to use SUPERLU_EMPTY instead of EMPTY which is no longer defined because it is too polluting.
+  *
+  * \code
+  * #include <Eigen/SuperLUSupport>
+  * \endcode
+  *
+  * In order to use this module, the superlu headers must be accessible from the include paths, and your binary must be linked to the superlu library and its dependencies.
+  * The dependencies depend on how superlu has been compiled.
+  * For a cmake based project, you can use our FindSuperLU.cmake module to help you in this task.
+  *
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/SuperLUSupport/SuperLUSupport.h"
+
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_SUPERLUSUPPORT_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/UmfPackSupport b/vendor/eigen-3.1.91/Eigen/UmfPackSupport
new file mode 100644
index 0000000..984f64a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/UmfPackSupport
@@ -0,0 +1,36 @@
+#ifndef EIGEN_UMFPACKSUPPORT_MODULE_H
+#define EIGEN_UMFPACKSUPPORT_MODULE_H
+
+#include "SparseCore"
+
+#include "src/Core/util/DisableStupidWarnings.h"
+
+extern "C" {
+#include <umfpack.h>
+}
+
+/** \ingroup Support_modules
+  * \defgroup UmfPackSupport_Module UmfPackSupport module
+  *
+  * This module provides an interface to the UmfPack library which is part of the <a href="http://www.cise.ufl.edu/research/sparse/SuiteSparse/">suitesparse</a> package.
+  * It provides the following factorization class:
+  * - class UmfPackLU: a multifrontal sequential LU factorization.
+  *
+  * \code
+  * #include <Eigen/UmfPackSupport>
+  * \endcode
+  *
+  * In order to use this module, the umfpack headers must be accessible from the include paths, and your binary must be linked to the umfpack library and its dependencies.
+  * The dependencies depend on how umfpack has been compiled.
+  * For a cmake based project, you can use our FindUmfPack.cmake module to help you in this task.
+  *
+  */
+
+#include "src/misc/Solve.h"
+#include "src/misc/SparseSolve.h"
+
+#include "src/UmfPackSupport/UmfPackSupport.h"
+
+#include "src/Core/util/ReenableStupidWarnings.h"
+
+#endif // EIGEN_UMFPACKSUPPORT_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/CMakeLists.txt
new file mode 100644
index 0000000..c326f37
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/CMakeLists.txt
@@ -0,0 +1,7 @@
+file(GLOB Eigen_src_subdirectories "*")
+escape_string_as_regex(ESCAPED_CMAKE_CURRENT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
+foreach(f ${Eigen_src_subdirectories})
+  if(NOT f MATCHES "\\.txt" AND NOT f MATCHES "${ESCAPED_CMAKE_CURRENT_SOURCE_DIR}/[.].+" )
+    add_subdirectory(${f})
+  endif()
+endforeach()
diff --git a/vendor/eigen-3.1.91/Eigen/src/Cholesky/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Cholesky/CMakeLists.txt
new file mode 100644
index 0000000..d01488b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Cholesky/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Cholesky_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Cholesky_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Cholesky COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Cholesky/LDLT.h b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LDLT.h
new file mode 100644
index 0000000..4c0be9d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LDLT.h
@@ -0,0 +1,599 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Keir Mierle <mierle at gmail.com>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2011 Timothy E. Holy <tim.holy at gmail.com >
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_LDLT_H
+#define EIGEN_LDLT_H
+
+namespace Eigen { 
+
+namespace internal {
+template<typename MatrixType, int UpLo> struct LDLT_Traits;
+}
+
+/** \ingroup Cholesky_Module
+  *
+  * \class LDLT
+  *
+  * \brief Robust Cholesky decomposition of a matrix with pivoting
+  *
+  * \param MatrixType the type of the matrix of which to compute the LDL^T Cholesky decomposition
+  * \param UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper.
+  *             The other triangular part won't be read.
+  *
+  * Perform a robust Cholesky decomposition of a positive semidefinite or negative semidefinite
+  * matrix \f$ A \f$ such that \f$ A =  P^TLDL^*P \f$, where P is a permutation matrix, L
+  * is lower triangular with a unit diagonal and D is a diagonal matrix.
+  *
+  * The decomposition uses pivoting to ensure stability, so that L will have
+  * zeros in the bottom right rank(A) - n submatrix. Avoiding the square root
+  * on D also stabilizes the computation.
+  *
+  * Remember that Cholesky decompositions are not rank-revealing. Also, do not use a Cholesky
+  * decomposition to determine whether a system of equations has a solution.
+  *
+  * \sa MatrixBase::ldlt(), class LLT
+  */
+template<typename _MatrixType, int _UpLo> class LDLT
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options & ~RowMajorBit, // these are the options for the TmpMatrixType, we need a ColMajor matrix here!
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+      UpLo = _UpLo
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar, RowsAtCompileTime, 1, Options, MaxRowsAtCompileTime, 1> TmpMatrixType;
+
+    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
+    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;
+
+    typedef internal::LDLT_Traits<MatrixType,UpLo> Traits;
+
+    /** \brief Default Constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via LDLT::compute(const MatrixType&).
+      */
+    LDLT() : m_matrix(), m_transpositions(), m_isInitialized(false) {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa LDLT()
+      */
+    LDLT(Index size)
+      : m_matrix(size, size),
+        m_transpositions(size),
+        m_temporary(size),
+        m_isInitialized(false)
+    {}
+
+    /** \brief Constructor with decomposition
+      *
+      * This calculates the decomposition for the input \a matrix.
+      * \sa LDLT(Index size)
+      */
+    LDLT(const MatrixType& matrix)
+      : m_matrix(matrix.rows(), matrix.cols()),
+        m_transpositions(matrix.rows()),
+        m_temporary(matrix.rows()),
+        m_isInitialized(false)
+    {
+      compute(matrix);
+    }
+
+    /** Clear any existing decomposition
+     * \sa rankUpdate(w,sigma)
+     */
+    void setZero()
+    {
+      m_isInitialized = false;
+    }
+
+    /** \returns a view of the upper triangular matrix U */
+    inline typename Traits::MatrixU matrixU() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return Traits::getU(m_matrix);
+    }
+
+    /** \returns a view of the lower triangular matrix L */
+    inline typename Traits::MatrixL matrixL() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return Traits::getL(m_matrix);
+    }
+
+    /** \returns the permutation matrix P as a transposition sequence.
+      */
+    inline const TranspositionType& transpositionsP() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return m_transpositions;
+    }
+
+    /** \returns the coefficients of the diagonal matrix D */
+    inline Diagonal<const MatrixType> vectorD() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return m_matrix.diagonal();
+    }
+
+    /** \returns true if the matrix is positive (semidefinite) */
+    inline bool isPositive() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return m_sign == 1;
+    }
+    
+    #ifdef EIGEN2_SUPPORT
+    inline bool isPositiveDefinite() const
+    {
+      return isPositive();
+    }
+    #endif
+
+    /** \returns true if the matrix is negative (semidefinite) */
+    inline bool isNegative(void) const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return m_sign == -1;
+    }
+
+    /** \returns a solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * This function also supports in-place solves using the syntax <tt>x = decompositionObject.solve(x)</tt> .
+      *
+      * \note_about_checking_solutions
+      *
+      * More precisely, this method solves \f$ A x = b \f$ using the decomposition \f$ A = P^T L D L^* P \f$
+      * by solving the systems \f$ P^T y_1 = b \f$, \f$ L y_2 = y_1 \f$, \f$ D y_3 = y_2 \f$, 
+      * \f$ L^* y_4 = y_3 \f$ and \f$ P x = y_4 \f$ in succession. If the matrix \f$ A \f$ is singular, then
+      * \f$ D \f$ will also be singular (all the other matrices are invertible). In that case, the
+      * least-square solution of \f$ D y_3 = y_2 \f$ is computed. This does not mean that this function
+      * computes the least-square solution of \f$ A x = b \f$ is \f$ A \f$ is singular.
+      *
+      * \sa MatrixBase::ldlt()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<LDLT, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      eigen_assert(m_matrix.rows()==b.rows()
+                && "LDLT::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<LDLT, Rhs>(*this, b.derived());
+    }
+
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived, typename ResultType>
+    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
+    {
+      *result = this->solve(b);
+      return true;
+    }
+    #endif
+
+    template<typename Derived>
+    bool solveInPlace(MatrixBase<Derived> &bAndX) const;
+
+    LDLT& compute(const MatrixType& matrix);
+
+    template <typename Derived>
+    LDLT& rankUpdate(const MatrixBase<Derived>& w, const RealScalar& alpha=1);
+
+    /** \returns the internal LDLT decomposition matrix
+      *
+      * TODO: document the storage layout
+      */
+    inline const MatrixType& matrixLDLT() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return m_matrix;
+    }
+
+    MatrixType reconstructedMatrix() const;
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "LDLT is not initialized.");
+      return Success;
+    }
+
+  protected:
+
+    /** \internal
+      * Used to compute and store the Cholesky decomposition A = L D L^* = U^* D U.
+      * The strict upper part is used during the decomposition, the strict lower
+      * part correspond to the coefficients of L (its diagonal is equal to 1 and
+      * is not stored), and the diagonal entries correspond to D.
+      */
+    MatrixType m_matrix;
+    TranspositionType m_transpositions;
+    TmpMatrixType m_temporary;
+    int m_sign;
+    bool m_isInitialized;
+};
+
+namespace internal {
+
+template<int UpLo> struct ldlt_inplace;
+
+template<> struct ldlt_inplace<Lower>
+{
+  template<typename MatrixType, typename TranspositionType, typename Workspace>
+  static bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, int* sign=0)
+  {
+    using std::abs;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    eigen_assert(mat.rows()==mat.cols());
+    const Index size = mat.rows();
+
+    if (size <= 1)
+    {
+      transpositions.setIdentity();
+      if(sign)
+        *sign = real(mat.coeff(0,0))>0 ? 1:-1;
+      return true;
+    }
+
+    RealScalar cutoff(0), biggest_in_corner;
+
+    for (Index k = 0; k < size; ++k)
+    {
+      // Find largest diagonal element
+      Index index_of_biggest_in_corner;
+      biggest_in_corner = mat.diagonal().tail(size-k).cwiseAbs().maxCoeff(&index_of_biggest_in_corner);
+      index_of_biggest_in_corner += k;
+
+      if(k == 0)
+      {
+        // The biggest overall is the point of reference to which further diagonals
+        // are compared; if any diagonal is negligible compared
+        // to the largest overall, the algorithm bails.
+        cutoff = abs(NumTraits<Scalar>::epsilon() * biggest_in_corner);
+
+        if(sign)
+          *sign = real(mat.diagonal().coeff(index_of_biggest_in_corner)) > 0 ? 1 : -1;
+      }
+      else if(sign)
+      {
+        // LDLT is not guaranteed to work for indefinite matrices, but let's try to get the sign right
+        int newSign = real(mat.diagonal().coeff(index_of_biggest_in_corner)) > 0;
+        if(newSign != *sign)
+          *sign = 0;
+      }
+
+      // Finish early if the matrix is not full rank.
+      if(biggest_in_corner < cutoff)
+      {
+        for(Index i = k; i < size; i++) transpositions.coeffRef(i) = i;
+        break;
+      }
+
+      transpositions.coeffRef(k) = index_of_biggest_in_corner;
+      if(k != index_of_biggest_in_corner)
+      {
+        // apply the transposition while taking care to consider only
+        // the lower triangular part
+        Index s = size-index_of_biggest_in_corner-1; // trailing size after the biggest element
+        mat.row(k).head(k).swap(mat.row(index_of_biggest_in_corner).head(k));
+        mat.col(k).tail(s).swap(mat.col(index_of_biggest_in_corner).tail(s));
+        std::swap(mat.coeffRef(k,k),mat.coeffRef(index_of_biggest_in_corner,index_of_biggest_in_corner));
+        for(int i=k+1;i<index_of_biggest_in_corner;++i)
+        {
+          Scalar tmp = mat.coeffRef(i,k);
+          mat.coeffRef(i,k) = conj(mat.coeffRef(index_of_biggest_in_corner,i));
+          mat.coeffRef(index_of_biggest_in_corner,i) = conj(tmp);
+        }
+        if(NumTraits<Scalar>::IsComplex)
+          mat.coeffRef(index_of_biggest_in_corner,k) = conj(mat.coeff(index_of_biggest_in_corner,k));
+      }
+
+      // partition the matrix:
+      //       A00 |  -  |  -
+      // lu  = A10 | A11 |  -
+      //       A20 | A21 | A22
+      Index rs = size - k - 1;
+      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
+      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
+      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);
+
+      if(k>0)
+      {
+        temp.head(k) = mat.diagonal().head(k).asDiagonal() * A10.adjoint();
+        mat.coeffRef(k,k) -= (A10 * temp.head(k)).value();
+        if(rs>0)
+          A21.noalias() -= A20 * temp.head(k);
+      }
+      if((rs>0) && (abs(mat.coeffRef(k,k)) > cutoff))
+        A21 /= mat.coeffRef(k,k);
+    }
+
+    return true;
+  }
+
+  // Reference for the algorithm: Davis and Hager, "Multiple Rank
+  // Modifications of a Sparse Cholesky Factorization" (Algorithm 1)
+  // Trivial rearrangements of their computations (Timothy E. Holy)
+  // allow their algorithm to work for rank-1 updates even if the
+  // original matrix is not of full rank.
+  // Here only rank-1 updates are implemented, to reduce the
+  // requirement for intermediate storage and improve accuracy
+  template<typename MatrixType, typename WDerived>
+  static bool updateInPlace(MatrixType& mat, MatrixBase<WDerived>& w, const typename MatrixType::RealScalar& sigma=1)
+  {
+    using internal::isfinite;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    const Index size = mat.rows();
+    eigen_assert(mat.cols() == size && w.size()==size);
+
+    RealScalar alpha = 1;
+
+    // Apply the update
+    for (Index j = 0; j < size; j++)
+    {
+      // Check for termination due to an original decomposition of low-rank
+      if (!(isfinite)(alpha))
+        break;
+
+      // Update the diagonal terms
+      RealScalar dj = real(mat.coeff(j,j));
+      Scalar wj = w.coeff(j);
+      RealScalar swj2 = sigma*abs2(wj);
+      RealScalar gamma = dj*alpha + swj2;
+
+      mat.coeffRef(j,j) += swj2/alpha;
+      alpha += swj2/dj;
+
+
+      // Update the terms of L
+      Index rs = size-j-1;
+      w.tail(rs) -= wj * mat.col(j).tail(rs);
+      if(gamma != 0)
+        mat.col(j).tail(rs) += (sigma*conj(wj)/gamma)*w.tail(rs);
+    }
+    return true;
+  }
+
+  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
+  static bool update(MatrixType& mat, const TranspositionType& transpositions, Workspace& tmp, const WType& w, const typename MatrixType::RealScalar& sigma=1)
+  {
+    // Apply the permutation to the input w
+    tmp = transpositions * w;
+
+    return ldlt_inplace<Lower>::updateInPlace(mat,tmp,sigma);
+  }
+};
+
+template<> struct ldlt_inplace<Upper>
+{
+  template<typename MatrixType, typename TranspositionType, typename Workspace>
+  static EIGEN_STRONG_INLINE bool unblocked(MatrixType& mat, TranspositionType& transpositions, Workspace& temp, int* sign=0)
+  {
+    Transpose<MatrixType> matt(mat);
+    return ldlt_inplace<Lower>::unblocked(matt, transpositions, temp, sign);
+  }
+
+  template<typename MatrixType, typename TranspositionType, typename Workspace, typename WType>
+  static EIGEN_STRONG_INLINE bool update(MatrixType& mat, TranspositionType& transpositions, Workspace& tmp, WType& w, const typename MatrixType::RealScalar& sigma=1)
+  {
+    Transpose<MatrixType> matt(mat);
+    return ldlt_inplace<Lower>::update(matt, transpositions, tmp, w.conjugate(), sigma);
+  }
+};
+
+template<typename MatrixType> struct LDLT_Traits<MatrixType,Lower>
+{
+  typedef const TriangularView<const MatrixType, UnitLower> MatrixL;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitUpper> MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m; }
+  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }
+};
+
+template<typename MatrixType> struct LDLT_Traits<MatrixType,Upper>
+{
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, UnitLower> MatrixL;
+  typedef const TriangularView<const MatrixType, UnitUpper> MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m.adjoint(); }
+  static inline MatrixU getU(const MatrixType& m) { return m; }
+};
+
+} // end namespace internal
+
+/** Compute / recompute the LDLT decomposition A = L D L^* = U^* D U of \a matrix
+  */
+template<typename MatrixType, int _UpLo>
+LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::compute(const MatrixType& a)
+{
+  eigen_assert(a.rows()==a.cols());
+  const Index size = a.rows();
+
+  m_matrix = a;
+
+  m_transpositions.resize(size);
+  m_isInitialized = false;
+  m_temporary.resize(size);
+
+  internal::ldlt_inplace<UpLo>::unblocked(m_matrix, m_transpositions, m_temporary, &m_sign);
+
+  m_isInitialized = true;
+  return *this;
+}
+
+/** Update the LDLT decomposition:  given A = L D L^T, efficiently compute the decomposition of A + sigma w w^T.
+ * \param w a vector to be incorporated into the decomposition.
+ * \param sigma a scalar, +1 for updates and -1 for "downdates," which correspond to removing previously-added column vectors. Optional; default value is +1.
+ * \sa setZero()
+  */
+template<typename MatrixType, int _UpLo>
+template<typename Derived>
+LDLT<MatrixType,_UpLo>& LDLT<MatrixType,_UpLo>::rankUpdate(const MatrixBase<Derived>& w, const typename NumTraits<typename MatrixType::Scalar>::Real& sigma)
+{
+  const Index size = w.rows();
+  if (m_isInitialized)
+  {
+    eigen_assert(m_matrix.rows()==size);
+  }
+  else
+  {    
+    m_matrix.resize(size,size);
+    m_matrix.setZero();
+    m_transpositions.resize(size);
+    for (Index i = 0; i < size; i++)
+      m_transpositions.coeffRef(i) = i;
+    m_temporary.resize(size);
+    m_sign = sigma>=0 ? 1 : -1;
+    m_isInitialized = true;
+  }
+
+  internal::ldlt_inplace<UpLo>::update(m_matrix, m_transpositions, m_temporary, w, sigma);
+
+  return *this;
+}
+
+namespace internal {
+template<typename _MatrixType, int _UpLo, typename Rhs>
+struct solve_retval<LDLT<_MatrixType,_UpLo>, Rhs>
+  : solve_retval_base<LDLT<_MatrixType,_UpLo>, Rhs>
+{
+  typedef LDLT<_MatrixType,_UpLo> LDLTType;
+  EIGEN_MAKE_SOLVE_HELPERS(LDLTType,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    eigen_assert(rhs().rows() == dec().matrixLDLT().rows());
+    // dst = P b
+    dst = dec().transpositionsP() * rhs();
+
+    // dst = L^-1 (P b)
+    dec().matrixL().solveInPlace(dst);
+
+    // dst = D^-1 (L^-1 P b)
+    // more precisely, use pseudo-inverse of D (see bug 241)
+    using std::abs;
+    using std::max;
+    typedef typename LDLTType::MatrixType MatrixType;
+    typedef typename LDLTType::Scalar Scalar;
+    typedef typename LDLTType::RealScalar RealScalar;
+    const Diagonal<const MatrixType> vectorD = dec().vectorD();
+    RealScalar tolerance = (max)(vectorD.array().abs().maxCoeff() * NumTraits<Scalar>::epsilon(),
+				 RealScalar(1) / NumTraits<RealScalar>::highest()); // motivated by LAPACK's xGELSS
+    for (Index i = 0; i < vectorD.size(); ++i) {
+      if(abs(vectorD(i)) > tolerance)
+	dst.row(i) /= vectorD(i);
+      else
+	dst.row(i).setZero();
+    }
+
+    // dst = L^-T (D^-1 L^-1 P b)
+    dec().matrixU().solveInPlace(dst);
+
+    // dst = P^-1 (L^-T D^-1 L^-1 P b) = A^-1 b
+    dst = dec().transpositionsP().transpose() * dst;
+  }
+};
+}
+
+/** \internal use x = ldlt_object.solve(x);
+  *
+  * This is the \em in-place version of solve().
+  *
+  * \param bAndX represents both the right-hand side matrix b and result x.
+  *
+  * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.
+  *
+  * This version avoids a copy when the right hand side matrix b is not
+  * needed anymore.
+  *
+  * \sa LDLT::solve(), MatrixBase::ldlt()
+  */
+template<typename MatrixType,int _UpLo>
+template<typename Derived>
+bool LDLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const
+{
+  eigen_assert(m_isInitialized && "LDLT is not initialized.");
+  eigen_assert(m_matrix.rows() == bAndX.rows());
+
+  bAndX = this->solve(bAndX);
+
+  return true;
+}
+
+/** \returns the matrix represented by the decomposition,
+ * i.e., it returns the product: P^T L D L^* P.
+ * This function is provided for debug purpose. */
+template<typename MatrixType, int _UpLo>
+MatrixType LDLT<MatrixType,_UpLo>::reconstructedMatrix() const
+{
+  eigen_assert(m_isInitialized && "LDLT is not initialized.");
+  const Index size = m_matrix.rows();
+  MatrixType res(size,size);
+
+  // P
+  res.setIdentity();
+  res = transpositionsP() * res;
+  // L^* P
+  res = matrixU() * res;
+  // D(L^*P)
+  res = vectorD().asDiagonal() * res;
+  // L(DL^*P)
+  res = matrixL() * res;
+  // P^T (LDL^*P)
+  res = transpositionsP().transpose() * res;
+
+  return res;
+}
+
+/** \cholesky_module
+  * \returns the Cholesky decomposition with full pivoting without square root of \c *this
+  */
+template<typename MatrixType, unsigned int UpLo>
+inline const LDLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
+SelfAdjointView<MatrixType, UpLo>::ldlt() const
+{
+  return LDLT<PlainObject,UpLo>(m_matrix);
+}
+
+/** \cholesky_module
+  * \returns the Cholesky decomposition with full pivoting without square root of \c *this
+  */
+template<typename Derived>
+inline const LDLT<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::ldlt() const
+{
+  return LDLT<PlainObject>(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_LDLT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT.h b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT.h
new file mode 100644
index 0000000..db22a2f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT.h
@@ -0,0 +1,490 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_LLT_H
+#define EIGEN_LLT_H
+
+namespace Eigen { 
+
+namespace internal{
+template<typename MatrixType, int UpLo> struct LLT_Traits;
+}
+
+/** \ingroup Cholesky_Module
+  *
+  * \class LLT
+  *
+  * \brief Standard Cholesky decomposition (LL^T) of a matrix and associated features
+  *
+  * \param MatrixType the type of the matrix of which we are computing the LL^T Cholesky decomposition
+  * \param UpLo the triangular part that will be used for the decompositon: Lower (default) or Upper.
+  *             The other triangular part won't be read.
+  *
+  * This class performs a LL^T Cholesky decomposition of a symmetric, positive definite
+  * matrix A such that A = LL^* = U^*U, where L is lower triangular.
+  *
+  * While the Cholesky decomposition is particularly useful to solve selfadjoint problems like  D^*D x = b,
+  * for that purpose, we recommend the Cholesky decomposition without square root which is more stable
+  * and even faster. Nevertheless, this standard Cholesky decomposition remains useful in many other
+  * situations like generalised eigen problems with hermitian matrices.
+  *
+  * Remember that Cholesky decompositions are not rank-revealing. This LLT decomposition is only stable on positive definite matrices,
+  * use LDLT instead for the semidefinite case. Also, do not use a Cholesky decomposition to determine whether a system of equations
+  * has a solution.
+  *
+  * Example: \include LLT_example.cpp
+  * Output: \verbinclude LLT_example.out
+  *    
+  * \sa MatrixBase::llt(), class LDLT
+  */
+ /* HEY THIS DOX IS DISABLED BECAUSE THERE's A BUG EITHER HERE OR IN LDLT ABOUT THAT (OR BOTH)
+  * Note that during the decomposition, only the upper triangular part of A is considered. Therefore,
+  * the strict lower part does not have to store correct values.
+  */
+template<typename _MatrixType, int _UpLo> class LLT
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    enum {
+      PacketSize = internal::packet_traits<Scalar>::size,
+      AlignmentMask = int(PacketSize)-1,
+      UpLo = _UpLo
+    };
+
+    typedef internal::LLT_Traits<MatrixType,UpLo> Traits;
+
+    /**
+      * \brief Default Constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via LLT::compute(const MatrixType&).
+      */
+    LLT() : m_matrix(), m_isInitialized(false) {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa LLT()
+      */
+    LLT(Index size) : m_matrix(size, size),
+                    m_isInitialized(false) {}
+
+    LLT(const MatrixType& matrix)
+      : m_matrix(matrix.rows(), matrix.cols()),
+        m_isInitialized(false)
+    {
+      compute(matrix);
+    }
+
+    /** \returns a view of the upper triangular matrix U */
+    inline typename Traits::MatrixU matrixU() const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      return Traits::getU(m_matrix);
+    }
+
+    /** \returns a view of the lower triangular matrix L */
+    inline typename Traits::MatrixL matrixL() const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      return Traits::getL(m_matrix);
+    }
+
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * Since this LLT class assumes anyway that the matrix A is invertible, the solution
+      * theoretically exists and is unique regardless of b.
+      *
+      * Example: \include LLT_solve.cpp
+      * Output: \verbinclude LLT_solve.out
+      *
+      * \sa solveInPlace(), MatrixBase::llt()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<LLT, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      eigen_assert(m_matrix.rows()==b.rows()
+                && "LLT::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<LLT, Rhs>(*this, b.derived());
+    }
+
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived, typename ResultType>
+    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
+    {
+      *result = this->solve(b);
+      return true;
+    }
+    
+    bool isPositiveDefinite() const { return true; }
+    #endif
+
+    template<typename Derived>
+    void solveInPlace(MatrixBase<Derived> &bAndX) const;
+
+    LLT& compute(const MatrixType& matrix);
+
+    /** \returns the LLT decomposition matrix
+      *
+      * TODO: document the storage layout
+      */
+    inline const MatrixType& matrixLLT() const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      return m_matrix;
+    }
+
+    MatrixType reconstructedMatrix() const;
+
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      return m_info;
+    }
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    template<typename VectorType>
+    LLT rankUpdate(const VectorType& vec, const RealScalar& sigma = 1);
+
+  protected:
+    /** \internal
+      * Used to compute and store L
+      * The strict upper part is not used and even not initialized.
+      */
+    MatrixType m_matrix;
+    bool m_isInitialized;
+    ComputationInfo m_info;
+};
+
+namespace internal {
+
+template<typename Scalar, int UpLo> struct llt_inplace;
+
+template<typename MatrixType, typename VectorType>
+static typename MatrixType::Index llt_rank_update_lower(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma)
+{
+  using std::sqrt;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::ColXpr ColXpr;
+  typedef typename internal::remove_all<ColXpr>::type ColXprCleaned;
+  typedef typename ColXprCleaned::SegmentReturnType ColXprSegment;
+  typedef Matrix<Scalar,Dynamic,1> TempVectorType;
+  typedef typename TempVectorType::SegmentReturnType TempVecSegment;
+
+  Index n = mat.cols();
+  eigen_assert(mat.rows()==n && vec.size()==n);
+
+  TempVectorType temp;
+
+  if(sigma>0)
+  {
+    // This version is based on Givens rotations.
+    // It is faster than the other one below, but only works for updates,
+    // i.e., for sigma > 0
+    temp = sqrt(sigma) * vec;
+
+    for(Index i=0; i<n; ++i)
+    {
+      JacobiRotation<Scalar> g;
+      g.makeGivens(mat(i,i), -temp(i), &mat(i,i));
+
+      Index rs = n-i-1;
+      if(rs>0)
+      {
+        ColXprSegment x(mat.col(i).tail(rs));
+        TempVecSegment y(temp.tail(rs));
+        apply_rotation_in_the_plane(x, y, g);
+      }
+    }
+  }
+  else
+  {
+    temp = vec;
+    RealScalar beta = 1;
+    for(Index j=0; j<n; ++j)
+    {
+      RealScalar Ljj = real(mat.coeff(j,j));
+      RealScalar dj = abs2(Ljj);
+      Scalar wj = temp.coeff(j);
+      RealScalar swj2 = sigma*abs2(wj);
+      RealScalar gamma = dj*beta + swj2;
+
+      RealScalar x = dj + swj2/beta;
+      if (x<=RealScalar(0))
+        return j;
+      RealScalar nLjj = sqrt(x);
+      mat.coeffRef(j,j) = nLjj;
+      beta += swj2/dj;
+
+      // Update the terms of L
+      Index rs = n-j-1;
+      if(rs)
+      {
+        temp.tail(rs) -= (wj/Ljj) * mat.col(j).tail(rs);
+        if(gamma != 0)
+          mat.col(j).tail(rs) = (nLjj/Ljj) * mat.col(j).tail(rs) + (nLjj * sigma*conj(wj)/gamma)*temp.tail(rs);
+      }
+    }
+  }
+  return -1;
+}
+
+template<typename Scalar> struct llt_inplace<Scalar, Lower>
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  template<typename MatrixType>
+  static typename MatrixType::Index unblocked(MatrixType& mat)
+  {
+    using std::sqrt;
+    typedef typename MatrixType::Index Index;
+    
+    eigen_assert(mat.rows()==mat.cols());
+    const Index size = mat.rows();
+    for(Index k = 0; k < size; ++k)
+    {
+      Index rs = size-k-1; // remaining size
+
+      Block<MatrixType,Dynamic,1> A21(mat,k+1,k,rs,1);
+      Block<MatrixType,1,Dynamic> A10(mat,k,0,1,k);
+      Block<MatrixType,Dynamic,Dynamic> A20(mat,k+1,0,rs,k);
+
+      RealScalar x = real(mat.coeff(k,k));
+      if (k>0) x -= A10.squaredNorm();
+      if (x<=RealScalar(0))
+        return k;
+      mat.coeffRef(k,k) = x = sqrt(x);
+      if (k>0 && rs>0) A21.noalias() -= A20 * A10.adjoint();
+      if (rs>0) A21 *= RealScalar(1)/x;
+    }
+    return -1;
+  }
+
+  template<typename MatrixType>
+  static typename MatrixType::Index blocked(MatrixType& m)
+  {
+    typedef typename MatrixType::Index Index;
+    eigen_assert(m.rows()==m.cols());
+    Index size = m.rows();
+    if(size<32)
+      return unblocked(m);
+
+    Index blockSize = size/8;
+    blockSize = (blockSize/16)*16;
+    blockSize = (std::min)((std::max)(blockSize,Index(8)), Index(128));
+
+    for (Index k=0; k<size; k+=blockSize)
+    {
+      // partition the matrix:
+      //       A00 |  -  |  -
+      // lu  = A10 | A11 |  -
+      //       A20 | A21 | A22
+      Index bs = (std::min)(blockSize, size-k);
+      Index rs = size - k - bs;
+      Block<MatrixType,Dynamic,Dynamic> A11(m,k,   k,   bs,bs);
+      Block<MatrixType,Dynamic,Dynamic> A21(m,k+bs,k,   rs,bs);
+      Block<MatrixType,Dynamic,Dynamic> A22(m,k+bs,k+bs,rs,rs);
+
+      Index ret;
+      if((ret=unblocked(A11))>=0) return k+ret;
+      if(rs>0) A11.adjoint().template triangularView<Upper>().template solveInPlace<OnTheRight>(A21);
+      if(rs>0) A22.template selfadjointView<Lower>().rankUpdate(A21,-1); // bottleneck
+    }
+    return -1;
+  }
+
+  template<typename MatrixType, typename VectorType>
+  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)
+  {
+    return Eigen::internal::llt_rank_update_lower(mat, vec, sigma);
+  }
+};
+  
+template<typename Scalar> struct llt_inplace<Scalar, Upper>
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+
+  template<typename MatrixType>
+  static EIGEN_STRONG_INLINE typename MatrixType::Index unblocked(MatrixType& mat)
+  {
+    Transpose<MatrixType> matt(mat);
+    return llt_inplace<Scalar, Lower>::unblocked(matt);
+  }
+  template<typename MatrixType>
+  static EIGEN_STRONG_INLINE typename MatrixType::Index blocked(MatrixType& mat)
+  {
+    Transpose<MatrixType> matt(mat);
+    return llt_inplace<Scalar, Lower>::blocked(matt);
+  }
+  template<typename MatrixType, typename VectorType>
+  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const RealScalar& sigma)
+  {
+    Transpose<MatrixType> matt(mat);
+    return llt_inplace<Scalar, Lower>::rankUpdate(matt, vec.conjugate(), sigma);
+  }
+};
+
+template<typename MatrixType> struct LLT_Traits<MatrixType,Lower>
+{
+  typedef const TriangularView<const MatrixType, Lower> MatrixL;
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Upper> MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m; }
+  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }
+  static bool inplace_decomposition(MatrixType& m)
+  { return llt_inplace<typename MatrixType::Scalar, Lower>::blocked(m)==-1; }
+};
+
+template<typename MatrixType> struct LLT_Traits<MatrixType,Upper>
+{
+  typedef const TriangularView<const typename MatrixType::AdjointReturnType, Lower> MatrixL;
+  typedef const TriangularView<const MatrixType, Upper> MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m.adjoint(); }
+  static inline MatrixU getU(const MatrixType& m) { return m; }
+  static bool inplace_decomposition(MatrixType& m)
+  { return llt_inplace<typename MatrixType::Scalar, Upper>::blocked(m)==-1; }
+};
+
+} // end namespace internal
+
+/** Computes / recomputes the Cholesky decomposition A = LL^* = U^*U of \a matrix
+  *
+  * \returns a reference to *this
+  *
+  * Example: \include TutorialLinAlgComputeTwice.cpp
+  * Output: \verbinclude TutorialLinAlgComputeTwice.out
+  */
+template<typename MatrixType, int _UpLo>
+LLT<MatrixType,_UpLo>& LLT<MatrixType,_UpLo>::compute(const MatrixType& a)
+{
+  eigen_assert(a.rows()==a.cols());
+  const Index size = a.rows();
+  m_matrix.resize(size, size);
+  m_matrix = a;
+
+  m_isInitialized = true;
+  bool ok = Traits::inplace_decomposition(m_matrix);
+  m_info = ok ? Success : NumericalIssue;
+
+  return *this;
+}
+
+/** Performs a rank one update (or dowdate) of the current decomposition.
+  * If A = LL^* before the rank one update,
+  * then after it we have LL^* = A + sigma * v v^* where \a v must be a vector
+  * of same dimension.
+  */
+template<typename _MatrixType, int _UpLo>
+template<typename VectorType>
+LLT<_MatrixType,_UpLo> LLT<_MatrixType,_UpLo>::rankUpdate(const VectorType& v, const RealScalar& sigma)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType);
+  eigen_assert(v.size()==m_matrix.cols());
+  eigen_assert(m_isInitialized);
+  if(internal::llt_inplace<typename MatrixType::Scalar, UpLo>::rankUpdate(m_matrix,v,sigma)>=0)
+    m_info = NumericalIssue;
+  else
+    m_info = Success;
+
+  return *this;
+}
+    
+namespace internal {
+template<typename _MatrixType, int UpLo, typename Rhs>
+struct solve_retval<LLT<_MatrixType, UpLo>, Rhs>
+  : solve_retval_base<LLT<_MatrixType, UpLo>, Rhs>
+{
+  typedef LLT<_MatrixType,UpLo> LLTType;
+  EIGEN_MAKE_SOLVE_HELPERS(LLTType,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dst = rhs();
+    dec().solveInPlace(dst);
+  }
+};
+}
+
+/** \internal use x = llt_object.solve(x);
+  * 
+  * This is the \em in-place version of solve().
+  *
+  * \param bAndX represents both the right-hand side matrix b and result x.
+  *
+  * \returns true always! If you need to check for existence of solutions, use another decomposition like LU, QR, or SVD.
+  *
+  * This version avoids a copy when the right hand side matrix b is not
+  * needed anymore.
+  *
+  * \sa LLT::solve(), MatrixBase::llt()
+  */
+template<typename MatrixType, int _UpLo>
+template<typename Derived>
+void LLT<MatrixType,_UpLo>::solveInPlace(MatrixBase<Derived> &bAndX) const
+{
+  eigen_assert(m_isInitialized && "LLT is not initialized.");
+  eigen_assert(m_matrix.rows()==bAndX.rows());
+  matrixL().solveInPlace(bAndX);
+  matrixU().solveInPlace(bAndX);
+}
+
+/** \returns the matrix represented by the decomposition,
+ * i.e., it returns the product: L L^*.
+ * This function is provided for debug purpose. */
+template<typename MatrixType, int _UpLo>
+MatrixType LLT<MatrixType,_UpLo>::reconstructedMatrix() const
+{
+  eigen_assert(m_isInitialized && "LLT is not initialized.");
+  return matrixL() * matrixL().adjoint().toDenseMatrix();
+}
+
+/** \cholesky_module
+  * \returns the LLT decomposition of \c *this
+  */
+template<typename Derived>
+inline const LLT<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::llt() const
+{
+  return LLT<PlainObject>(derived());
+}
+
+/** \cholesky_module
+  * \returns the LLT decomposition of \c *this
+  */
+template<typename MatrixType, unsigned int UpLo>
+inline const LLT<typename SelfAdjointView<MatrixType, UpLo>::PlainObject, UpLo>
+SelfAdjointView<MatrixType, UpLo>::llt() const
+{
+  return LLT<PlainObject,UpLo>(m_matrix);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_LLT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT_MKL.h
new file mode 100644
index 0000000..64daa44
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Cholesky/LLT_MKL.h
@@ -0,0 +1,102 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *     LLt decomposition based on LAPACKE_?potrf function.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_LLT_MKL_H
+#define EIGEN_LLT_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+#include <iostream>
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Scalar> struct mkl_llt;
+
+#define EIGEN_MKL_LLT(EIGTYPE, MKLTYPE, MKLPREFIX) \
+template<> struct mkl_llt<EIGTYPE> \
+{ \
+  template<typename MatrixType> \
+  static inline typename MatrixType::Index potrf(MatrixType& m, char uplo) \
+  { \
+    lapack_int matrix_order; \
+    lapack_int size, lda, info, StorageOrder; \
+    EIGTYPE* a; \
+    eigen_assert(m.rows()==m.cols()); \
+    /* Set up parameters for ?potrf */ \
+    size = m.rows(); \
+    StorageOrder = MatrixType::Flags&RowMajorBit?RowMajor:ColMajor; \
+    matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \
+    a = &(m.coeffRef(0,0)); \
+    lda = m.outerStride(); \
+\
+    info = LAPACKE_##MKLPREFIX##potrf( matrix_order, uplo, size, (MKLTYPE*)a, lda ); \
+    info = (info==0) ? Success : NumericalIssue; \
+    return info; \
+  } \
+}; \
+template<> struct llt_inplace<EIGTYPE, Lower> \
+{ \
+  template<typename MatrixType> \
+  static typename MatrixType::Index blocked(MatrixType& m) \
+  { \
+    return mkl_llt<EIGTYPE>::potrf(m, 'L'); \
+  } \
+  template<typename MatrixType, typename VectorType> \
+  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \
+  { return Eigen::internal::llt_rank_update_lower(mat, vec, sigma); } \
+}; \
+template<> struct llt_inplace<EIGTYPE, Upper> \
+{ \
+  template<typename MatrixType> \
+  static typename MatrixType::Index blocked(MatrixType& m) \
+  { \
+    return mkl_llt<EIGTYPE>::potrf(m, 'U'); \
+  } \
+  template<typename MatrixType, typename VectorType> \
+  static typename MatrixType::Index rankUpdate(MatrixType& mat, const VectorType& vec, const typename MatrixType::RealScalar& sigma) \
+  { \
+    Transpose<MatrixType> matt(mat); \
+    return llt_inplace<EIGTYPE, Lower>::rankUpdate(matt, vec.conjugate(), sigma); \
+  } \
+};
+
+EIGEN_MKL_LLT(double, double, d)
+EIGEN_MKL_LLT(float, float, s)
+EIGEN_MKL_LLT(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_LLT(scomplex, MKL_Complex8, c)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_LLT_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CMakeLists.txt
new file mode 100644
index 0000000..814dfa6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_CholmodSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_CholmodSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/CholmodSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CholmodSupport.h b/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CholmodSupport.h
new file mode 100644
index 0000000..42d289a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/CholmodSupport/CholmodSupport.h
@@ -0,0 +1,602 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CHOLMODSUPPORT_H
+#define EIGEN_CHOLMODSUPPORT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Scalar, typename CholmodType>
+void cholmod_configure_matrix(CholmodType& mat)
+{
+  if (internal::is_same<Scalar,float>::value)
+  {
+    mat.xtype = CHOLMOD_REAL;
+    mat.dtype = CHOLMOD_SINGLE;
+  }
+  else if (internal::is_same<Scalar,double>::value)
+  {
+    mat.xtype = CHOLMOD_REAL;
+    mat.dtype = CHOLMOD_DOUBLE;
+  }
+  else if (internal::is_same<Scalar,std::complex<float> >::value)
+  {
+    mat.xtype = CHOLMOD_COMPLEX;
+    mat.dtype = CHOLMOD_SINGLE;
+  }
+  else if (internal::is_same<Scalar,std::complex<double> >::value)
+  {
+    mat.xtype = CHOLMOD_COMPLEX;
+    mat.dtype = CHOLMOD_DOUBLE;
+  }
+  else
+  {
+    eigen_assert(false && "Scalar type not supported by CHOLMOD");
+  }
+}
+
+} // namespace internal
+
+/** Wraps the Eigen sparse matrix \a mat into a Cholmod sparse matrix object.
+  * Note that the data are shared.
+  */
+template<typename _Scalar, int _Options, typename _Index>
+cholmod_sparse viewAsCholmod(SparseMatrix<_Scalar,_Options,_Index>& mat)
+{
+  cholmod_sparse res;
+  res.nzmax   = mat.nonZeros();
+  res.nrow    = mat.rows();;
+  res.ncol    = mat.cols();
+  res.p       = mat.outerIndexPtr();
+  res.i       = mat.innerIndexPtr();
+  res.x       = mat.valuePtr();
+  res.sorted  = 1;
+  if(mat.isCompressed())
+  {
+    res.packed  = 1;
+  }
+  else
+  {
+    res.packed  = 0;
+    res.nz = mat.innerNonZeroPtr();
+  }
+
+  res.dtype   = 0;
+  res.stype   = -1;
+  
+  if (internal::is_same<_Index,int>::value)
+  {
+    res.itype = CHOLMOD_INT;
+  }
+  else if (internal::is_same<_Index,UF_long>::value)
+  {
+    res.itype = CHOLMOD_LONG;
+  }
+  else
+  {
+    eigen_assert(false && "Index type not supported yet");
+  }
+
+  // setup res.xtype
+  internal::cholmod_configure_matrix<_Scalar>(res);
+  
+  res.stype = 0;
+  
+  return res;
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+const cholmod_sparse viewAsCholmod(const SparseMatrix<_Scalar,_Options,_Index>& mat)
+{
+  cholmod_sparse res = viewAsCholmod(mat.const_cast_derived());
+  return res;
+}
+
+/** Returns a view of the Eigen sparse matrix \a mat as Cholmod sparse matrix.
+  * The data are not copied but shared. */
+template<typename _Scalar, int _Options, typename _Index, unsigned int UpLo>
+cholmod_sparse viewAsCholmod(const SparseSelfAdjointView<SparseMatrix<_Scalar,_Options,_Index>, UpLo>& mat)
+{
+  cholmod_sparse res = viewAsCholmod(mat.matrix().const_cast_derived());
+  
+  if(UpLo==Upper) res.stype =  1;
+  if(UpLo==Lower) res.stype = -1;
+
+  return res;
+}
+
+/** Returns a view of the Eigen \b dense matrix \a mat as Cholmod dense matrix.
+  * The data are not copied but shared. */
+template<typename Derived>
+cholmod_dense viewAsCholmod(MatrixBase<Derived>& mat)
+{
+  EIGEN_STATIC_ASSERT((internal::traits<Derived>::Flags&RowMajorBit)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+  typedef typename Derived::Scalar Scalar;
+
+  cholmod_dense res;
+  res.nrow   = mat.rows();
+  res.ncol   = mat.cols();
+  res.nzmax  = res.nrow * res.ncol;
+  res.d      = Derived::IsVectorAtCompileTime ? mat.derived().size() : mat.derived().outerStride();
+  res.x      = mat.derived().data();
+  res.z      = 0;
+
+  internal::cholmod_configure_matrix<Scalar>(res);
+
+  return res;
+}
+
+/** Returns a view of the Cholmod sparse matrix \a cm as an Eigen sparse matrix.
+  * The data are not copied but shared. */
+template<typename Scalar, int Flags, typename Index>
+MappedSparseMatrix<Scalar,Flags,Index> viewAsEigen(cholmod_sparse& cm)
+{
+  return MappedSparseMatrix<Scalar,Flags,Index>
+         (cm.nrow, cm.ncol, static_cast<Index*>(cm.p)[cm.ncol],
+          static_cast<Index*>(cm.p), static_cast<Index*>(cm.i),static_cast<Scalar*>(cm.x) );
+}
+
+enum CholmodMode {
+  CholmodAuto, CholmodSimplicialLLt, CholmodSupernodalLLt, CholmodLDLt
+};
+
+
+/** \ingroup CholmodSupport_Module
+  * \class CholmodBase
+  * \brief The base class for the direct Cholesky factorization of Cholmod
+  * \sa class CholmodSupernodalLLT, class CholmodSimplicialLDLT, class CholmodSimplicialLLT
+  */
+template<typename _MatrixType, int _UpLo, typename Derived>
+class CholmodBase : internal::noncopyable
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum { UpLo = _UpLo };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef MatrixType CholMatrixType;
+    typedef typename MatrixType::Index Index;
+
+  public:
+
+    CholmodBase()
+      : m_cholmodFactor(0), m_info(Success), m_isInitialized(false)
+    {
+      cholmod_start(&m_cholmod);
+    }
+
+    CholmodBase(const MatrixType& matrix)
+      : m_cholmodFactor(0), m_info(Success), m_isInitialized(false)
+    {
+      m_shiftOffset[0] = m_shiftOffset[1] = RealScalar(0.0);
+      cholmod_start(&m_cholmod);
+      compute(matrix);
+    }
+
+    ~CholmodBase()
+    {
+      if(m_cholmodFactor)
+        cholmod_free_factor(&m_cholmodFactor, &m_cholmod);
+      cholmod_finish(&m_cholmod);
+    }
+    
+    inline Index cols() const { return m_cholmodFactor->n; }
+    inline Index rows() const { return m_cholmodFactor->n; }
+    
+    Derived& derived() { return *static_cast<Derived*>(this); }
+    const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    Derived& compute(const MatrixType& matrix)
+    {
+      analyzePattern(matrix);
+      factorize(matrix);
+      return derived();
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<CholmodBase, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "CholmodDecomposition::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<CholmodBase, Rhs>(*this, b.derived());
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<CholmodBase, Rhs>
+    solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "LLT is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "CholmodDecomposition::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<CholmodBase, Rhs>(*this, b.derived());
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      * 
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      if(m_cholmodFactor)
+      {
+        cholmod_free_factor(&m_cholmodFactor, &m_cholmod);
+        m_cholmodFactor = 0;
+      }
+      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
+      m_cholmodFactor = cholmod_analyze(&A, &m_cholmod);
+      
+      this->m_isInitialized = true;
+      this->m_info = Success;
+      m_analysisIsOk = true;
+      m_factorizationIsOk = false;
+    }
+    
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& matrix)
+    {
+      eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+      cholmod_sparse A = viewAsCholmod(matrix.template selfadjointView<UpLo>());
+      cholmod_factorize_p(&A, m_shiftOffset, 0, 0, m_cholmodFactor, &m_cholmod);
+      
+      // If the factorization failed, minor is the column at which it did. On success minor == n.
+      this->m_info = (m_cholmodFactor->minor == m_cholmodFactor->n ? Success : NumericalIssue);
+      m_factorizationIsOk = true;
+    }
+    
+    /** Returns a reference to the Cholmod's configuration structure to get a full control over the performed operations.
+     *  See the Cholmod user guide for details. */
+    cholmod_common& cholmod() { return m_cholmod; }
+    
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal */
+    template<typename Rhs,typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
+    {
+      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
+      const Index size = m_cholmodFactor->n;
+      EIGEN_UNUSED_VARIABLE(size);
+      eigen_assert(size==b.rows());
+
+      // note: cd stands for Cholmod Dense
+      cholmod_dense b_cd = viewAsCholmod(b.const_cast_derived());
+      cholmod_dense* x_cd = cholmod_solve(CHOLMOD_A, m_cholmodFactor, &b_cd, &m_cholmod);
+      if(!x_cd)
+      {
+        this->m_info = NumericalIssue;
+      }
+      // TODO optimize this copy by swapping when possible (be carreful with alignment, etc.)
+      dest = Matrix<Scalar,Dest::RowsAtCompileTime,Dest::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x),b.rows(),b.cols());
+      cholmod_free_dense(&x_cd, &m_cholmod);
+    }
+    
+    /** \internal */
+    template<typename RhsScalar, int RhsOptions, typename RhsIndex, typename DestScalar, int DestOptions, typename DestIndex>
+    void _solve(const SparseMatrix<RhsScalar,RhsOptions,RhsIndex> &b, SparseMatrix<DestScalar,DestOptions,DestIndex> &dest) const
+    {
+      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
+      const Index size = m_cholmodFactor->n;
+      eigen_assert(size==b.rows());
+
+      // note: cs stands for Cholmod Sparse
+      cholmod_sparse b_cs = viewAsCholmod(b);
+      cholmod_sparse* x_cs = cholmod_spsolve(CHOLMOD_A, m_cholmodFactor, &b_cs, &m_cholmod);
+      if(!x_cs)
+      {
+        this->m_info = NumericalIssue;
+      }
+      // TODO optimize this copy by swapping when possible (be carreful with alignment, etc.)
+      dest = viewAsEigen<DestScalar,DestOptions,DestIndex>(*x_cs);
+      cholmod_free_sparse(&x_cs, &m_cholmod);
+    }
+    #endif // EIGEN_PARSED_BY_DOXYGEN
+    
+    
+    /** Sets the shift parameter that will be used to adjust the diagonal coefficients during the numerical factorization.
+      *
+      * During the numerical factorization, an offset term is added to the diagonal coefficients:\n
+      * \c d_ii = \a offset + \c d_ii
+      *
+      * The default is \a offset=0.
+      *
+      * \returns a reference to \c *this.
+      */
+    Derived& setShift(const RealScalar& offset)
+    {
+      m_shiftOffset[0] = offset;
+      return derived();
+    }
+    
+    template<typename Stream>
+    void dumpMemory(Stream& s)
+    {}
+    
+  protected:
+    mutable cholmod_common m_cholmod;
+    cholmod_factor* m_cholmodFactor;
+    RealScalar m_shiftOffset[2];
+    mutable ComputationInfo m_info;
+    bool m_isInitialized;
+    int m_factorizationIsOk;
+    int m_analysisIsOk;
+};
+
+/** \ingroup CholmodSupport_Module
+  * \class CholmodSimplicialLLT
+  * \brief A simplicial direct Cholesky (LLT) factorization and solver based on Cholmod
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a simplicial LL^T Cholesky factorization
+  * using the Cholmod library.
+  * This simplicial variant is equivalent to Eigen's built-in SimplicialLLT class. Thefore, it has little practical interest.
+  * The sparse matrix A must be selfajoint and positive definite. The vectors or matrices
+  * X and B can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
+  *
+  * \sa \ref TutorialSparseDirectSolvers, class CholmodSupernodalLLT, class SimplicialLLT
+  */
+template<typename _MatrixType, int _UpLo = Lower>
+class CholmodSimplicialLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT<_MatrixType, _UpLo> >
+{
+    typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLLT> Base;
+    using Base::m_cholmod;
+    
+  public:
+    
+    typedef _MatrixType MatrixType;
+    
+    CholmodSimplicialLLT() : Base() { init(); }
+
+    CholmodSimplicialLLT(const MatrixType& matrix) : Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    ~CholmodSimplicialLLT() {}
+  protected:
+    void init()
+    {
+      m_cholmod.final_asis = 0;
+      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+      m_cholmod.final_ll = 1;
+    }
+};
+
+
+/** \ingroup CholmodSupport_Module
+  * \class CholmodSimplicialLDLT
+  * \brief A simplicial direct Cholesky (LDLT) factorization and solver based on Cholmod
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a simplicial LDL^T Cholesky factorization
+  * using the Cholmod library.
+  * This simplicial variant is equivalent to Eigen's built-in SimplicialLDLT class. Thefore, it has little practical interest.
+  * The sparse matrix A must be selfajoint and positive definite. The vectors or matrices
+  * X and B can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
+  *
+  * \sa \ref TutorialSparseDirectSolvers, class CholmodSupernodalLLT, class SimplicialLDLT
+  */
+template<typename _MatrixType, int _UpLo = Lower>
+class CholmodSimplicialLDLT : public CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT<_MatrixType, _UpLo> >
+{
+    typedef CholmodBase<_MatrixType, _UpLo, CholmodSimplicialLDLT> Base;
+    using Base::m_cholmod;
+    
+  public:
+    
+    typedef _MatrixType MatrixType;
+    
+    CholmodSimplicialLDLT() : Base() { init(); }
+
+    CholmodSimplicialLDLT(const MatrixType& matrix) : Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    ~CholmodSimplicialLDLT() {}
+  protected:
+    void init()
+    {
+      m_cholmod.final_asis = 1;
+      m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+    }
+};
+
+/** \ingroup CholmodSupport_Module
+  * \class CholmodSupernodalLLT
+  * \brief A supernodal Cholesky (LLT) factorization and solver based on Cholmod
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a supernodal LL^T Cholesky factorization
+  * using the Cholmod library.
+  * This supernodal variant performs best on dense enough problems, e.g., 3D FEM, or very high order 2D FEM.
+  * The sparse matrix A must be selfajoint and positive definite. The vectors or matrices
+  * X and B can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType, int _UpLo = Lower>
+class CholmodSupernodalLLT : public CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT<_MatrixType, _UpLo> >
+{
+    typedef CholmodBase<_MatrixType, _UpLo, CholmodSupernodalLLT> Base;
+    using Base::m_cholmod;
+    
+  public:
+    
+    typedef _MatrixType MatrixType;
+    
+    CholmodSupernodalLLT() : Base() { init(); }
+
+    CholmodSupernodalLLT(const MatrixType& matrix) : Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    ~CholmodSupernodalLLT() {}
+  protected:
+    void init()
+    {
+      m_cholmod.final_asis = 1;
+      m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
+    }
+};
+
+/** \ingroup CholmodSupport_Module
+  * \class CholmodDecomposition
+  * \brief A general Cholesky factorization and solver based on Cholmod
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a LL^T or LDL^T Cholesky factorization
+  * using the Cholmod library. The sparse matrix A must be selfajoint and positive definite. The vectors or matrices
+  * X and B can be either dense or sparse.
+  *
+  * This variant permits to change the underlying Cholesky method at runtime.
+  * On the other hand, it does not provide access to the result of the factorization.
+  * The default is to let Cholmod automatically choose between a simplicial and supernodal factorization.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * This class supports all kind of SparseMatrix<>: row or column major; upper, lower, or both; compressed or non compressed.
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType, int _UpLo = Lower>
+class CholmodDecomposition : public CholmodBase<_MatrixType, _UpLo, CholmodDecomposition<_MatrixType, _UpLo> >
+{
+    typedef CholmodBase<_MatrixType, _UpLo, CholmodDecomposition> Base;
+    using Base::m_cholmod;
+    
+  public:
+    
+    typedef _MatrixType MatrixType;
+    
+    CholmodDecomposition() : Base() { init(); }
+
+    CholmodDecomposition(const MatrixType& matrix) : Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    ~CholmodDecomposition() {}
+    
+    void setMode(CholmodMode mode)
+    {
+      switch(mode)
+      {
+        case CholmodAuto:
+          m_cholmod.final_asis = 1;
+          m_cholmod.supernodal = CHOLMOD_AUTO;
+          break;
+        case CholmodSimplicialLLt:
+          m_cholmod.final_asis = 0;
+          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+          m_cholmod.final_ll = 1;
+          break;
+        case CholmodSupernodalLLt:
+          m_cholmod.final_asis = 1;
+          m_cholmod.supernodal = CHOLMOD_SUPERNODAL;
+          break;
+        case CholmodLDLt:
+          m_cholmod.final_asis = 1;
+          m_cholmod.supernodal = CHOLMOD_SIMPLICIAL;
+          break;
+        default:
+          break;
+      }
+    }
+  protected:
+    void init()
+    {
+      m_cholmod.final_asis = 1;
+      m_cholmod.supernodal = CHOLMOD_AUTO;
+    }
+};
+
+namespace internal {
+  
+template<typename _MatrixType, int _UpLo, typename Derived, typename Rhs>
+struct solve_retval<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>
+  : solve_retval_base<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>
+{
+  typedef CholmodBase<_MatrixType,_UpLo,Derived> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+template<typename _MatrixType, int _UpLo, typename Derived, typename Rhs>
+struct sparse_solve_retval<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>
+  : sparse_solve_retval_base<CholmodBase<_MatrixType,_UpLo,Derived>, Rhs>
+{
+  typedef CholmodBase<_MatrixType,_UpLo,Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_CHOLMODSUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Array.h b/vendor/eigen-3.1.91/Eigen/src/Core/Array.h
new file mode 100644
index 0000000..bd47e6c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Array.h
@@ -0,0 +1,308 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ARRAY_H
+#define EIGEN_ARRAY_H
+
+namespace Eigen {
+
+/** \class Array 
+  * \ingroup Core_Module
+  *
+  * \brief General-purpose arrays with easy API for coefficient-wise operations
+  *
+  * The %Array class is very similar to the Matrix class. It provides
+  * general-purpose one- and two-dimensional arrays. The difference between the
+  * %Array and the %Matrix class is primarily in the API: the API for the
+  * %Array class provides easy access to coefficient-wise operations, while the
+  * API for the %Matrix class provides easy access to linear-algebra
+  * operations.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_ARRAY_PLUGIN.
+  *
+  * \sa \ref TutorialArrayClass, \ref TopicClassHierarchy
+  */
+namespace internal {
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct traits<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > : traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+  typedef ArrayXpr XprKind;
+  typedef ArrayBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > XprBase;
+};
+}
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+class Array
+  : public PlainObjectBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+  public:
+
+    typedef PlainObjectBase<Array> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Array)
+
+    enum { Options = _Options };
+    typedef typename Base::PlainObject PlainObject;
+
+  protected:
+    template <typename Derived, typename OtherDerived, bool IsVector>
+    friend struct internal::conservative_resize_like_impl;
+
+    using Base::m_storage;
+
+  public:
+
+    using Base::base;
+    using Base::coeff;
+    using Base::coeffRef;
+
+    /**
+      * The usage of
+      *   using Base::operator=;
+      * fails on MSVC. Since the code below is working with GCC and MSVC, we skipped
+      * the usage of 'using'. This should be done only for operator=.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Array& operator=(const EigenBase<OtherDerived> &other)
+    {
+      return Base::operator=(other);
+    }
+
+    /** Copies the value of the expression \a other into \c *this with automatic resizing.
+      *
+      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+      * it will be initialized.
+      *
+      * Note that copying a row-vector into a vector (and conversely) is allowed.
+      * The resizing, if any, is then done in the appropriate way so that row-vectors
+      * remain row-vectors and vectors remain vectors.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Array& operator=(const ArrayBase<OtherDerived>& other)
+    {
+      return Base::_set(other);
+    }
+
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    EIGEN_STRONG_INLINE Array& operator=(const Array& other)
+    {
+      return Base::_set(other);
+    }
+
+    /** Default constructor.
+      *
+      * For fixed-size matrices, does nothing.
+      *
+      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
+      * is called a null matrix. This constructor is the unique way to create null matrices: resizing
+      * a matrix to 0 is not supported.
+      *
+      * \sa resize(Index,Index)
+      */
+    EIGEN_STRONG_INLINE explicit Array() : Base()
+    {
+      Base::_check_template_params();
+      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    // FIXME is it still needed ??
+    /** \internal */
+    Array(internal::constructor_without_unaligned_array_assert)
+      : Base(internal::constructor_without_unaligned_array_assert())
+    {
+      Base::_check_template_params();
+      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+#endif
+
+    /** Constructs a vector or row-vector with given dimension. \only_for_vectors
+      *
+      * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,
+      * it is redundant to pass the dimension here, so it makes more sense to use the default
+      * constructor Matrix() instead.
+      */
+    EIGEN_STRONG_INLINE explicit Array(Index dim)
+      : Base(dim, RowsAtCompileTime == 1 ? 1 : dim, ColsAtCompileTime == 1 ? 1 : dim)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Array)
+      eigen_assert(dim >= 0);
+      eigen_assert(SizeAtCompileTime == Dynamic || SizeAtCompileTime == dim);
+      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename T0, typename T1>
+    EIGEN_STRONG_INLINE Array(const T0& val0, const T1& val1)
+    {
+      Base::_check_template_params();
+      this->template _init2<T0,T1>(val0, val1);
+    }
+    #else
+    /** constructs an uninitialized matrix with \a rows rows and \a cols columns.
+      *
+      * This is useful for dynamic-size matrices. For fixed-size matrices,
+      * it is redundant to pass these parameters, so one should use the default constructor
+      * Matrix() instead. */
+    Array(Index rows, Index cols);
+    /** constructs an initialized 2D vector with given coefficients */
+    Array(const Scalar& val0, const Scalar& val1);
+    #endif
+
+    /** constructs an initialized 3D vector with given coefficients */
+    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 3)
+      m_storage.data()[0] = val0;
+      m_storage.data()[1] = val1;
+      m_storage.data()[2] = val2;
+    }
+    /** constructs an initialized 4D vector with given coefficients */
+    EIGEN_STRONG_INLINE Array(const Scalar& val0, const Scalar& val1, const Scalar& val2, const Scalar& val3)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Array, 4)
+      m_storage.data()[0] = val0;
+      m_storage.data()[1] = val1;
+      m_storage.data()[2] = val2;
+      m_storage.data()[3] = val3;
+    }
+
+    explicit Array(const Scalar *data);
+
+    /** Constructor copying the value of the expression \a other */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Array(const ArrayBase<OtherDerived>& other)
+             : Base(other.rows() * other.cols(), other.rows(), other.cols())
+    {
+      Base::_check_template_params();
+      Base::_set_noalias(other);
+    }
+    /** Copy constructor */
+    EIGEN_STRONG_INLINE Array(const Array& other)
+            : Base(other.rows() * other.cols(), other.rows(), other.cols())
+    {
+      Base::_check_template_params();
+      Base::_set_noalias(other);
+    }
+    /** Copy constructor with in-place evaluation */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Array(const ReturnByValue<OtherDerived>& other)
+    {
+      Base::_check_template_params();
+      Base::resize(other.rows(), other.cols());
+      other.evalTo(*this);
+    }
+
+    /** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Array(const EigenBase<OtherDerived> &other)
+      : Base(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())
+    {
+      Base::_check_template_params();
+      Base::resize(other.rows(), other.cols());
+      *this = other;
+    }
+
+    /** Override MatrixBase::swap() since for dynamic-sized matrices of same type it is enough to swap the
+      * data pointers.
+      */
+    template<typename OtherDerived>
+    void swap(ArrayBase<OtherDerived> const & other)
+    { this->_swap(other.derived()); }
+
+    inline Index innerStride() const { return 1; }
+    inline Index outerStride() const { return this->innerSize(); }
+
+    #ifdef EIGEN_ARRAY_PLUGIN
+    #include EIGEN_ARRAY_PLUGIN
+    #endif
+
+  private:
+
+    template<typename MatrixType, typename OtherDerived, bool SwapPointers>
+    friend struct internal::matrix_swap_impl;
+};
+
+/** \defgroup arraytypedefs Global array typedefs
+  * \ingroup Core_Module
+  *
+  * Eigen defines several typedef shortcuts for most common 1D and 2D array types.
+  *
+  * The general patterns are the following:
+  *
+  * \c ArrayRowsColsType where \c Rows and \c Cols can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size,
+  * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd
+  * for complex double.
+  *
+  * For example, \c Array33d is a fixed-size 3x3 array type of doubles, and \c ArrayXXf is a dynamic-size matrix of floats.
+  *
+  * There are also \c ArraySizeType which are self-explanatory. For example, \c Array4cf is
+  * a fixed-size 1D array of 4 complex floats.
+  *
+  * \sa class Array
+  */
+
+#define EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
+/** \ingroup arraytypedefs */                                    \
+typedef Array<Type, Size, Size> Array##SizeSuffix##SizeSuffix##TypeSuffix;  \
+/** \ingroup arraytypedefs */                                    \
+typedef Array<Type, Size, 1>    Array##SizeSuffix##TypeSuffix;
+
+#define EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
+/** \ingroup arraytypedefs */                                    \
+typedef Array<Type, Size, Dynamic> Array##Size##X##TypeSuffix;  \
+/** \ingroup arraytypedefs */                                    \
+typedef Array<Type, Dynamic, Size> Array##X##Size##TypeSuffix;
+
+#define EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
+EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 2, 2) \
+EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 3, 3) \
+EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, 4, 4) \
+EIGEN_MAKE_ARRAY_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
+EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
+EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
+EIGEN_MAKE_ARRAY_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
+
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(int,                  i)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(float,                f)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(double,               d)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)
+EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)
+
+#undef EIGEN_MAKE_ARRAY_TYPEDEFS_ALL_SIZES
+#undef EIGEN_MAKE_ARRAY_TYPEDEFS
+
+#undef EIGEN_MAKE_ARRAY_TYPEDEFS_LARGE
+
+#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, SizeSuffix) \
+using Eigen::Matrix##SizeSuffix##TypeSuffix; \
+using Eigen::Vector##SizeSuffix##TypeSuffix; \
+using Eigen::RowVector##SizeSuffix##TypeSuffix;
+
+#define EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(TypeSuffix) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 2) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 3) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, 4) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE_AND_SIZE(TypeSuffix, X) \
+
+#define EIGEN_USING_ARRAY_TYPEDEFS \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(i) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(f) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(d) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cf) \
+EIGEN_USING_ARRAY_TYPEDEFS_FOR_TYPE(cd)
+
+} // end namespace Eigen
+
+#endif // EIGEN_ARRAY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ArrayBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/ArrayBase.h
new file mode 100644
index 0000000..3885260
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ArrayBase.h
@@ -0,0 +1,228 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ARRAYBASE_H
+#define EIGEN_ARRAYBASE_H
+
+namespace Eigen { 
+
+template<typename ExpressionType> class MatrixWrapper;
+
+/** \class ArrayBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for all 1D and 2D array, and related expressions
+  *
+  * An array is similar to a dense vector or matrix. While matrices are mathematical
+  * objects with well defined linear algebra operators, an array is just a collection
+  * of scalar values arranged in a one or two dimensionnal fashion. As the main consequence,
+  * all operations applied to an array are performed coefficient wise. Furthermore,
+  * arrays support scalar math functions of the c++ standard library (e.g., std::sin(x)), and convenient
+  * constructors allowing to easily write generic code working for both scalar values
+  * and arrays.
+  *
+  * This class is the base that is inherited by all array expression types.
+  *
+  * \tparam Derived is the derived type, e.g., an array or an expression type.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_ARRAYBASE_PLUGIN.
+  *
+  * \sa class MatrixBase, \ref TopicClassHierarchy
+  */
+template<typename Derived> class ArrayBase
+  : public DenseBase<Derived>
+{
+  public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** The base class for a given storage type. */
+    typedef ArrayBase StorageBaseType;
+
+    typedef ArrayBase Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl;
+
+    using internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,
+                typename NumTraits<typename internal::traits<Derived>::Scalar>::Real>::operator*;
+
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    typedef DenseBase<Derived> Base;
+    using Base::RowsAtCompileTime;
+    using Base::ColsAtCompileTime;
+    using Base::SizeAtCompileTime;
+    using Base::MaxRowsAtCompileTime;
+    using Base::MaxColsAtCompileTime;
+    using Base::MaxSizeAtCompileTime;
+    using Base::IsVectorAtCompileTime;
+    using Base::Flags;
+    using Base::CoeffReadCost;
+
+    using Base::derived;
+    using Base::const_cast_derived;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::coeff;
+    using Base::coeffRef;
+    using Base::lazyAssign;
+    using Base::operator=;
+    using Base::operator+=;
+    using Base::operator-=;
+    using Base::operator*=;
+    using Base::operator/=;
+
+    typedef typename Base::CoeffReturnType CoeffReturnType;
+
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal the plain matrix type corresponding to this expression. Note that is not necessarily
+      * exactly the return type of eval(): in the case of plain matrices, the return type of eval() is a const
+      * reference to a matrix, not a matrix! It is however guaranteed that the return type of eval() is either
+      * PlainObject or const PlainObject&.
+      */
+    typedef Array<typename internal::traits<Derived>::Scalar,
+                internal::traits<Derived>::RowsAtCompileTime,
+                internal::traits<Derived>::ColsAtCompileTime,
+                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
+                internal::traits<Derived>::MaxRowsAtCompileTime,
+                internal::traits<Derived>::MaxColsAtCompileTime
+          > PlainObject;
+
+
+    /** \internal Represents a matrix with all coefficients equal to one another*/
+    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::ArrayBase
+#   include "../plugins/CommonCwiseUnaryOps.h"
+#   include "../plugins/MatrixCwiseUnaryOps.h"
+#   include "../plugins/ArrayCwiseUnaryOps.h"
+#   include "../plugins/CommonCwiseBinaryOps.h"
+#   include "../plugins/MatrixCwiseBinaryOps.h"
+#   include "../plugins/ArrayCwiseBinaryOps.h"
+#   ifdef EIGEN_ARRAYBASE_PLUGIN
+#     include EIGEN_ARRAYBASE_PLUGIN
+#   endif
+#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
+
+    /** Special case of the template operator=, in order to prevent the compiler
+      * from generating a default operator= (issue hit with g++ 4.1)
+      */
+    Derived& operator=(const ArrayBase& other)
+    {
+      return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());
+    }
+
+    Derived& operator+=(const Scalar& scalar)
+    { return *this = derived() + scalar; }
+    Derived& operator-=(const Scalar& scalar)
+    { return *this = derived() - scalar; }
+
+    template<typename OtherDerived>
+    Derived& operator+=(const ArrayBase<OtherDerived>& other);
+    template<typename OtherDerived>
+    Derived& operator-=(const ArrayBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    Derived& operator*=(const ArrayBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    Derived& operator/=(const ArrayBase<OtherDerived>& other);
+
+  public:
+    ArrayBase<Derived>& array() { return *this; }
+    const ArrayBase<Derived>& array() const { return *this; }
+
+    /** \returns an \link Eigen::MatrixBase Matrix \endlink expression of this array
+      * \sa MatrixBase::array() */
+    MatrixWrapper<Derived> matrix() { return derived(); }
+    const MatrixWrapper<const Derived> matrix() const { return derived(); }
+
+//     template<typename Dest>
+//     inline void evalTo(Dest& dst) const { dst = matrix(); }
+
+  protected:
+    ArrayBase() : Base() {}
+
+  private:
+    explicit ArrayBase(Index);
+    ArrayBase(Index,Index);
+    template<typename OtherDerived> explicit ArrayBase(const ArrayBase<OtherDerived>&);
+  protected:
+    // mixing arrays and matrices is not legal
+    template<typename OtherDerived> Derived& operator+=(const MatrixBase<OtherDerived>& )
+    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+    // mixing arrays and matrices is not legal
+    template<typename OtherDerived> Derived& operator-=(const MatrixBase<OtherDerived>& )
+    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+};
+
+/** replaces \c *this by \c *this - \a other.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+ArrayBase<Derived>::operator-=(const ArrayBase<OtherDerived> &other)
+{
+  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+/** replaces \c *this by \c *this + \a other.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+ArrayBase<Derived>::operator+=(const ArrayBase<OtherDerived>& other)
+{
+  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+/** replaces \c *this by \c *this * \a other coefficient wise.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+ArrayBase<Derived>::operator*=(const ArrayBase<OtherDerived>& other)
+{
+  SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+/** replaces \c *this by \c *this / \a other coefficient wise.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+ArrayBase<Derived>::operator/=(const ArrayBase<OtherDerived>& other)
+{
+  SelfCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ARRAYBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ArrayWrapper.h b/vendor/eigen-3.1.91/Eigen/src/Core/ArrayWrapper.h
new file mode 100644
index 0000000..1e021b0
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ArrayWrapper.h
@@ -0,0 +1,254 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ARRAYWRAPPER_H
+#define EIGEN_ARRAYWRAPPER_H
+
+namespace Eigen { 
+
+/** \class ArrayWrapper
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a mathematical vector or matrix as an array object
+  *
+  * This class is the return type of MatrixBase::array(), and most of the time
+  * this is the only way it is use.
+  *
+  * \sa MatrixBase::array(), class MatrixWrapper
+  */
+
+namespace internal {
+template<typename ExpressionType>
+struct traits<ArrayWrapper<ExpressionType> >
+  : public traits<typename remove_all<typename ExpressionType::Nested>::type >
+{
+  typedef ArrayXpr XprKind;
+};
+}
+
+template<typename ExpressionType>
+class ArrayWrapper : public ArrayBase<ArrayWrapper<ExpressionType> >
+{
+  public:
+    typedef ArrayBase<ArrayWrapper> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(ArrayWrapper)
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(ArrayWrapper)
+
+    typedef typename internal::conditional<
+                       internal::is_lvalue<ExpressionType>::value,
+                       Scalar,
+                       const Scalar
+                     >::type ScalarWithConstIfNotLvalue;
+
+    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;
+
+    inline ArrayWrapper(ExpressionType& matrix) : m_expression(matrix) {}
+
+    inline Index rows() const { return m_expression.rows(); }
+    inline Index cols() const { return m_expression.cols(); }
+    inline Index outerStride() const { return m_expression.outerStride(); }
+    inline Index innerStride() const { return m_expression.innerStride(); }
+
+    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
+    inline const Scalar* data() const { return m_expression.data(); }
+
+    inline CoeffReturnType coeff(Index rowId, Index colId) const
+    {
+      return m_expression.coeff(rowId, colId);
+    }
+
+    inline Scalar& coeffRef(Index rowId, Index colId)
+    {
+      return m_expression.const_cast_derived().coeffRef(rowId, colId);
+    }
+
+    inline const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return m_expression.const_cast_derived().coeffRef(rowId, colId);
+    }
+
+    inline CoeffReturnType coeff(Index index) const
+    {
+      return m_expression.coeff(index);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index rowId, Index colId) const
+    {
+      return m_expression.template packet<LoadMode>(rowId, colId);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return m_expression.template packet<LoadMode>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& val)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
+    }
+
+    template<typename Dest>
+    inline void evalTo(Dest& dst) const { dst = m_expression; }
+
+    const typename internal::remove_all<NestedExpressionType>::type& 
+    nestedExpression() const 
+    {
+      return m_expression;
+    }
+
+    /** Forwards the resizing request to the nested expression
+      * \sa DenseBase::resize(Index)  */
+    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
+    /** Forwards the resizing request to the nested expression
+      * \sa DenseBase::resize(Index,Index)*/
+    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }
+
+  protected:
+    NestedExpressionType m_expression;
+};
+
+/** \class MatrixWrapper
+  * \ingroup Core_Module
+  *
+  * \brief Expression of an array as a mathematical vector or matrix
+  *
+  * This class is the return type of ArrayBase::matrix(), and most of the time
+  * this is the only way it is use.
+  *
+  * \sa MatrixBase::matrix(), class ArrayWrapper
+  */
+
+namespace internal {
+template<typename ExpressionType>
+struct traits<MatrixWrapper<ExpressionType> >
+ : public traits<typename remove_all<typename ExpressionType::Nested>::type >
+{
+  typedef MatrixXpr XprKind;
+};
+}
+
+template<typename ExpressionType>
+class MatrixWrapper : public MatrixBase<MatrixWrapper<ExpressionType> >
+{
+  public:
+    typedef MatrixBase<MatrixWrapper<ExpressionType> > Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(MatrixWrapper)
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(MatrixWrapper)
+
+    typedef typename internal::conditional<
+                       internal::is_lvalue<ExpressionType>::value,
+                       Scalar,
+                       const Scalar
+                     >::type ScalarWithConstIfNotLvalue;
+
+    typedef typename internal::nested<ExpressionType>::type NestedExpressionType;
+
+    inline MatrixWrapper(ExpressionType& a_matrix) : m_expression(a_matrix) {}
+
+    inline Index rows() const { return m_expression.rows(); }
+    inline Index cols() const { return m_expression.cols(); }
+    inline Index outerStride() const { return m_expression.outerStride(); }
+    inline Index innerStride() const { return m_expression.innerStride(); }
+
+    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
+    inline const Scalar* data() const { return m_expression.data(); }
+
+    inline CoeffReturnType coeff(Index rowId, Index colId) const
+    {
+      return m_expression.coeff(rowId, colId);
+    }
+
+    inline Scalar& coeffRef(Index rowId, Index colId)
+    {
+      return m_expression.const_cast_derived().coeffRef(rowId, colId);
+    }
+
+    inline const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return m_expression.derived().coeffRef(rowId, colId);
+    }
+
+    inline CoeffReturnType coeff(Index index) const
+    {
+      return m_expression.coeff(index);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index rowId, Index colId) const
+    {
+      return m_expression.template packet<LoadMode>(rowId, colId);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(rowId, colId, val);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return m_expression.template packet<LoadMode>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& val)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(index, val);
+    }
+
+    const typename internal::remove_all<NestedExpressionType>::type& 
+    nestedExpression() const 
+    {
+      return m_expression;
+    }
+
+    /** Forwards the resizing request to the nested expression
+      * \sa DenseBase::resize(Index)  */
+    void resize(Index newSize) { m_expression.const_cast_derived().resize(newSize); }
+    /** Forwards the resizing request to the nested expression
+      * \sa DenseBase::resize(Index,Index)*/
+    void resize(Index nbRows, Index nbCols) { m_expression.const_cast_derived().resize(nbRows,nbCols); }
+
+  protected:
+    NestedExpressionType m_expression;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_ARRAYWRAPPER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Assign.h b/vendor/eigen-3.1.91/Eigen/src/Core/Assign.h
new file mode 100644
index 0000000..288f8ec
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Assign.h
@@ -0,0 +1,583 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007 Michael Olbrich <michael.olbrich at gmx.net>
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ASSIGN_H
+#define EIGEN_ASSIGN_H
+
+namespace Eigen {
+
+namespace internal {
+
+/***************************************************************************
+* Part 1 : the logic deciding a strategy for traversal and unrolling       *
+***************************************************************************/
+
+template <typename Derived, typename OtherDerived>
+struct assign_traits
+{
+public:
+  enum {
+    DstIsAligned = Derived::Flags & AlignedBit,
+    DstHasDirectAccess = Derived::Flags & DirectAccessBit,
+    SrcIsAligned = OtherDerived::Flags & AlignedBit,
+    JointAlignment = bool(DstIsAligned) && bool(SrcIsAligned) ? Aligned : Unaligned
+  };
+
+private:
+  enum {
+    InnerSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::SizeAtCompileTime)
+              : int(Derived::Flags)&RowMajorBit ? int(Derived::ColsAtCompileTime)
+              : int(Derived::RowsAtCompileTime),
+    InnerMaxSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::MaxSizeAtCompileTime)
+              : int(Derived::Flags)&RowMajorBit ? int(Derived::MaxColsAtCompileTime)
+              : int(Derived::MaxRowsAtCompileTime),
+    MaxSizeAtCompileTime = Derived::SizeAtCompileTime,
+    PacketSize = packet_traits<typename Derived::Scalar>::size
+  };
+
+  enum {
+    StorageOrdersAgree = (int(Derived::IsRowMajor) == int(OtherDerived::IsRowMajor)),
+    MightVectorize = StorageOrdersAgree
+                  && (int(Derived::Flags) & int(OtherDerived::Flags) & ActualPacketAccessBit),
+    MayInnerVectorize  = MightVectorize && int(InnerSize)!=Dynamic && int(InnerSize)%int(PacketSize)==0
+                       && int(DstIsAligned) && int(SrcIsAligned),
+    MayLinearize = StorageOrdersAgree && (int(Derived::Flags) & int(OtherDerived::Flags) & LinearAccessBit),
+    MayLinearVectorize = MightVectorize && MayLinearize && DstHasDirectAccess
+                       && (DstIsAligned || MaxSizeAtCompileTime == Dynamic),
+      /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
+         so it's only good for large enough sizes. */
+    MaySliceVectorize  = MightVectorize && DstHasDirectAccess
+                       && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=3*PacketSize)
+      /* slice vectorization can be slow, so we only want it if the slices are big, which is
+         indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block
+         in a fixed-size matrix */
+  };
+
+public:
+  enum {
+    Traversal = int(MayInnerVectorize)  ? int(InnerVectorizedTraversal)
+              : int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
+              : int(MaySliceVectorize)  ? int(SliceVectorizedTraversal)
+              : int(MayLinearize)       ? int(LinearTraversal)
+                                        : int(DefaultTraversal),
+    Vectorized = int(Traversal) == InnerVectorizedTraversal
+              || int(Traversal) == LinearVectorizedTraversal
+              || int(Traversal) == SliceVectorizedTraversal
+  };
+
+private:
+  enum {
+    UnrollingLimit      = EIGEN_UNROLLING_LIMIT * (Vectorized ? int(PacketSize) : 1),
+    MayUnrollCompletely = int(Derived::SizeAtCompileTime) != Dynamic
+                       && int(OtherDerived::CoeffReadCost) != Dynamic
+                       && int(Derived::SizeAtCompileTime) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit),
+    MayUnrollInner      = int(InnerSize) != Dynamic
+                       && int(OtherDerived::CoeffReadCost) != Dynamic
+                       && int(InnerSize) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit)
+  };
+
+public:
+  enum {
+    Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal))
+                ? (
+                    int(MayUnrollCompletely) ? int(CompleteUnrolling)
+                  : int(MayUnrollInner)      ? int(InnerUnrolling)
+                                             : int(NoUnrolling)
+                  )
+              : int(Traversal) == int(LinearVectorizedTraversal)
+                ? ( bool(MayUnrollCompletely) && bool(DstIsAligned) ? int(CompleteUnrolling) : int(NoUnrolling) )
+              : int(Traversal) == int(LinearTraversal)
+                ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling) : int(NoUnrolling) )
+              : int(NoUnrolling)
+  };
+
+#ifdef EIGEN_DEBUG_ASSIGN
+  static void debug()
+  {
+    EIGEN_DEBUG_VAR(DstIsAligned)
+    EIGEN_DEBUG_VAR(SrcIsAligned)
+    EIGEN_DEBUG_VAR(JointAlignment)
+    EIGEN_DEBUG_VAR(InnerSize)
+    EIGEN_DEBUG_VAR(InnerMaxSize)
+    EIGEN_DEBUG_VAR(PacketSize)
+    EIGEN_DEBUG_VAR(StorageOrdersAgree)
+    EIGEN_DEBUG_VAR(MightVectorize)
+    EIGEN_DEBUG_VAR(MayLinearize)
+    EIGEN_DEBUG_VAR(MayInnerVectorize)
+    EIGEN_DEBUG_VAR(MayLinearVectorize)
+    EIGEN_DEBUG_VAR(MaySliceVectorize)
+    EIGEN_DEBUG_VAR(Traversal)
+    EIGEN_DEBUG_VAR(UnrollingLimit)
+    EIGEN_DEBUG_VAR(MayUnrollCompletely)
+    EIGEN_DEBUG_VAR(MayUnrollInner)
+    EIGEN_DEBUG_VAR(Unrolling)
+  }
+#endif
+};
+
+/***************************************************************************
+* Part 2 : meta-unrollers
+***************************************************************************/
+
+/************************
+*** Default traversal ***
+************************/
+
+template<typename Derived1, typename Derived2, int Index, int Stop>
+struct assign_DefaultTraversal_CompleteUnrolling
+{
+  enum {
+    outer = Index / Derived1::InnerSizeAtCompileTime,
+    inner = Index % Derived1::InnerSizeAtCompileTime
+  };
+
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    dst.copyCoeffByOuterInner(outer, inner, src);
+    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Stop>
+struct assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}
+};
+
+template<typename Derived1, typename Derived2, int Index, int Stop>
+struct assign_DefaultTraversal_InnerUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src, typename Derived1::Index outer)
+  {
+    dst.copyCoeffByOuterInner(outer, Index, src);
+    assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src, outer);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Stop>
+struct assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &, typename Derived1::Index) {}
+};
+
+/***********************
+*** Linear traversal ***
+***********************/
+
+template<typename Derived1, typename Derived2, int Index, int Stop>
+struct assign_LinearTraversal_CompleteUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    dst.copyCoeff(Index, src);
+    assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, Index+1, Stop>::run(dst, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Stop>
+struct assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}
+};
+
+/**************************
+*** Inner vectorization ***
+**************************/
+
+template<typename Derived1, typename Derived2, int Index, int Stop>
+struct assign_innervec_CompleteUnrolling
+{
+  enum {
+    outer = Index / Derived1::InnerSizeAtCompileTime,
+    inner = Index % Derived1::InnerSizeAtCompileTime,
+    JointAlignment = assign_traits<Derived1,Derived2>::JointAlignment
+  };
+
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    dst.template copyPacketByOuterInner<Derived2, Aligned, JointAlignment>(outer, inner, src);
+    assign_innervec_CompleteUnrolling<Derived1, Derived2,
+      Index+packet_traits<typename Derived1::Scalar>::size, Stop>::run(dst, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Stop>
+struct assign_innervec_CompleteUnrolling<Derived1, Derived2, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &) {}
+};
+
+template<typename Derived1, typename Derived2, int Index, int Stop>
+struct assign_innervec_InnerUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src, typename Derived1::Index outer)
+  {
+    dst.template copyPacketByOuterInner<Derived2, Aligned, Aligned>(outer, Index, src);
+    assign_innervec_InnerUnrolling<Derived1, Derived2,
+      Index+packet_traits<typename Derived1::Scalar>::size, Stop>::run(dst, src, outer);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Stop>
+struct assign_innervec_InnerUnrolling<Derived1, Derived2, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &, const Derived2 &, typename Derived1::Index) {}
+};
+
+/***************************************************************************
+* Part 3 : implementation of all cases
+***************************************************************************/
+
+template<typename Derived1, typename Derived2,
+         int Traversal = assign_traits<Derived1, Derived2>::Traversal,
+         int Unrolling = assign_traits<Derived1, Derived2>::Unrolling,
+         int Version = Specialized>
+struct assign_impl;
+
+/************************
+*** Default traversal ***
+************************/
+
+template<typename Derived1, typename Derived2, int Unrolling, int Version>
+struct assign_impl<Derived1, Derived2, InvalidTraversal, Unrolling, Version>
+{
+  static inline void run(Derived1 &, const Derived2 &) { }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, DefaultTraversal, NoUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer)
+      for(Index inner = 0; inner < innerSize; ++inner)
+        dst.copyCoeffByOuterInner(outer, inner, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, DefaultTraversal, CompleteUnrolling, Version>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
+      ::run(dst, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, DefaultTraversal, InnerUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer)
+      assign_DefaultTraversal_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>
+        ::run(dst, src, outer);
+  }
+};
+
+/***********************
+*** Linear traversal ***
+***********************/
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, LinearTraversal, NoUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index size = dst.size();
+    for(Index i = 0; i < size; ++i)
+      dst.copyCoeff(i, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, LinearTraversal, CompleteUnrolling, Version>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    assign_LinearTraversal_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
+      ::run(dst, src);
+  }
+};
+
+/**************************
+*** Inner vectorization ***
+**************************/
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, NoUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    const Index packetSize = packet_traits<typename Derived1::Scalar>::size;
+    for(Index outer = 0; outer < outerSize; ++outer)
+      for(Index inner = 0; inner < innerSize; inner+=packetSize)
+        dst.template copyPacketByOuterInner<Derived2, Aligned, Aligned>(outer, inner, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, CompleteUnrolling, Version>
+{
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, Derived1::SizeAtCompileTime>
+      ::run(dst, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, InnerVectorizedTraversal, InnerUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer)
+      assign_innervec_InnerUnrolling<Derived1, Derived2, 0, Derived1::InnerSizeAtCompileTime>
+        ::run(dst, src, outer);
+  }
+};
+
+/***************************
+*** Linear vectorization ***
+***************************/
+
+template <bool IsAligned = false>
+struct unaligned_assign_impl
+{
+  template <typename Derived, typename OtherDerived>
+  static EIGEN_STRONG_INLINE void run(const Derived&, OtherDerived&, typename Derived::Index, typename Derived::Index) {}
+};
+
+template <>
+struct unaligned_assign_impl<false>
+{
+  // MSVC must not inline this functions. If it does, it fails to optimize the
+  // packet access path.
+#ifdef _MSC_VER
+  template <typename Derived, typename OtherDerived>
+  static EIGEN_DONT_INLINE void run(const Derived& src, OtherDerived& dst, typename Derived::Index start, typename Derived::Index end)
+#else
+  template <typename Derived, typename OtherDerived>
+  static EIGEN_STRONG_INLINE void run(const Derived& src, OtherDerived& dst, typename Derived::Index start, typename Derived::Index end)
+#endif
+  {
+    for (typename Derived::Index index = start; index < end; ++index)
+      dst.copyCoeff(index, src);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, NoUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    const Index size = dst.size();
+    typedef packet_traits<typename Derived1::Scalar> PacketTraits;
+    enum {
+      packetSize = PacketTraits::size,
+      dstAlignment = PacketTraits::AlignedOnScalar ? Aligned : int(assign_traits<Derived1,Derived2>::DstIsAligned) ,
+      srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment
+    };
+    const Index alignedStart = assign_traits<Derived1,Derived2>::DstIsAligned ? 0
+                             : internal::first_aligned(&dst.coeffRef(0), size);
+    const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
+
+    unaligned_assign_impl<assign_traits<Derived1,Derived2>::DstIsAligned!=0>::run(src,dst,0,alignedStart);
+
+    for(Index index = alignedStart; index < alignedEnd; index += packetSize)
+    {
+      dst.template copyPacket<Derived2, dstAlignment, srcAlignment>(index, src);
+    }
+
+    unaligned_assign_impl<>::run(src,dst,alignedEnd,size);
+  }
+};
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, LinearVectorizedTraversal, CompleteUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static EIGEN_STRONG_INLINE void run(Derived1 &dst, const Derived2 &src)
+  {
+    enum { size = Derived1::SizeAtCompileTime,
+           packetSize = packet_traits<typename Derived1::Scalar>::size,
+           alignedSize = (size/packetSize)*packetSize };
+
+    assign_innervec_CompleteUnrolling<Derived1, Derived2, 0, alignedSize>::run(dst, src);
+    assign_DefaultTraversal_CompleteUnrolling<Derived1, Derived2, alignedSize, size>::run(dst, src);
+  }
+};
+
+/**************************
+*** Slice vectorization ***
+***************************/
+
+template<typename Derived1, typename Derived2, int Version>
+struct assign_impl<Derived1, Derived2, SliceVectorizedTraversal, NoUnrolling, Version>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    typedef packet_traits<typename Derived1::Scalar> PacketTraits;
+    enum {
+      packetSize = PacketTraits::size,
+      alignable = PacketTraits::AlignedOnScalar,
+      dstAlignment = alignable ? Aligned : int(assign_traits<Derived1,Derived2>::DstIsAligned) ,
+      srcAlignment = assign_traits<Derived1,Derived2>::JointAlignment
+    };
+    const Index packetAlignedMask = packetSize - 1;
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    const Index alignedStep = alignable ? (packetSize - dst.outerStride() % packetSize) & packetAlignedMask : 0;
+    Index alignedStart = ((!alignable) || assign_traits<Derived1,Derived2>::DstIsAligned) ? 0
+                       : internal::first_aligned(&dst.coeffRef(0,0), innerSize);
+
+    for(Index outer = 0; outer < outerSize; ++outer)
+    {
+      const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);
+      // do the non-vectorizable part of the assignment
+      for(Index inner = 0; inner<alignedStart ; ++inner)
+        dst.copyCoeffByOuterInner(outer, inner, src);
+
+      // do the vectorizable part of the assignment
+      for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize)
+        dst.template copyPacketByOuterInner<Derived2, dstAlignment, Unaligned>(outer, inner, src);
+
+      // do the non-vectorizable part of the assignment
+      for(Index inner = alignedEnd; inner<innerSize ; ++inner)
+        dst.copyCoeffByOuterInner(outer, inner, src);
+
+      alignedStart = std::min<Index>((alignedStart+alignedStep)%packetSize, innerSize);
+    }
+  }
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* Part 4 : implementation of DenseBase methods
+***************************************************************************/
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>
+  ::lazyAssign(const DenseBase<OtherDerived>& other)
+{
+  enum{
+    SameType = internal::is_same<typename Derived::Scalar,typename OtherDerived::Scalar>::value
+  };
+
+  EIGEN_STATIC_ASSERT_LVALUE(Derived)
+  EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Derived,OtherDerived)
+  EIGEN_STATIC_ASSERT(SameType,YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+#ifdef EIGEN_DEBUG_ASSIGN
+  internal::assign_traits<Derived, OtherDerived>::debug();
+#endif
+  eigen_assert(rows() == other.rows() && cols() == other.cols());
+  internal::assign_impl<Derived, OtherDerived, int(SameType) ? int(internal::assign_traits<Derived, OtherDerived>::Traversal)
+                                                       : int(InvalidTraversal)>::run(derived(),other.derived());
+#ifndef EIGEN_NO_DEBUG
+  checkTransposeAliasing(other.derived());
+#endif
+  return derived();
+}
+
+namespace internal {
+
+template<typename Derived, typename OtherDerived,
+         bool EvalBeforeAssigning = (int(OtherDerived::Flags) & EvalBeforeAssigningBit) != 0,
+         bool NeedToTranspose = Derived::IsVectorAtCompileTime
+                && OtherDerived::IsVectorAtCompileTime
+                && ((int(Derived::RowsAtCompileTime) == 1 && int(OtherDerived::ColsAtCompileTime) == 1)
+                      |  // FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
+                         // revert to || as soon as not needed anymore.
+                    (int(Derived::ColsAtCompileTime) == 1 && int(OtherDerived::RowsAtCompileTime) == 1))
+                && int(Derived::SizeAtCompileTime) != 1>
+struct assign_selector;
+
+template<typename Derived, typename OtherDerived>
+struct assign_selector<Derived,OtherDerived,false,false> {
+  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.derived()); }
+};
+template<typename Derived, typename OtherDerived>
+struct assign_selector<Derived,OtherDerived,true,false> {
+  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.eval()); }
+};
+template<typename Derived, typename OtherDerived>
+struct assign_selector<Derived,OtherDerived,false,true> {
+  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.transpose()); }
+};
+template<typename Derived, typename OtherDerived>
+struct assign_selector<Derived,OtherDerived,true,true> {
+  static EIGEN_STRONG_INLINE Derived& run(Derived& dst, const OtherDerived& other) { return dst.lazyAssign(other.transpose().eval()); }
+};
+
+} // end namespace internal
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase<OtherDerived>& other)
+{
+  return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());
+}
+
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::operator=(const DenseBase& other)
+{
+  return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());
+}
+
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const MatrixBase& other)
+{
+  return internal::assign_selector<Derived,Derived>::run(derived(), other.derived());
+}
+
+template<typename Derived>
+template <typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const DenseBase<OtherDerived>& other)
+{
+  return internal::assign_selector<Derived,OtherDerived>::run(derived(), other.derived());
+}
+
+template<typename Derived>
+template <typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const EigenBase<OtherDerived>& other)
+{
+  other.derived().evalTo(derived());
+  return derived();
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
+{
+  other.evalTo(derived());
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ASSIGN_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/AssignEvaluator.h b/vendor/eigen-3.1.91/Eigen/src/Core/AssignEvaluator.h
new file mode 100644
index 0000000..8d835b2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/AssignEvaluator.h
@@ -0,0 +1,754 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2011-2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ASSIGN_EVALUATOR_H
+#define EIGEN_ASSIGN_EVALUATOR_H
+
+namespace Eigen {
+
+// This implementation is based on Assign.h
+
+namespace internal {
+  
+/***************************************************************************
+* Part 1 : the logic deciding a strategy for traversal and unrolling       *
+***************************************************************************/
+
+// copy_using_evaluator_traits is based on assign_traits
+
+template <typename Derived, typename OtherDerived>
+struct copy_using_evaluator_traits
+{
+public:
+  enum {
+    DstIsAligned = Derived::Flags & AlignedBit,
+    DstHasDirectAccess = Derived::Flags & DirectAccessBit,
+    SrcIsAligned = OtherDerived::Flags & AlignedBit,
+    JointAlignment = bool(DstIsAligned) && bool(SrcIsAligned) ? Aligned : Unaligned,
+    SrcEvalBeforeAssign = (evaluator_traits<OtherDerived>::HasEvalTo == 1)
+  };
+
+private:
+  enum {
+    InnerSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::SizeAtCompileTime)
+              : int(Derived::Flags)&RowMajorBit ? int(Derived::ColsAtCompileTime)
+              : int(Derived::RowsAtCompileTime),
+    InnerMaxSize = int(Derived::IsVectorAtCompileTime) ? int(Derived::MaxSizeAtCompileTime)
+              : int(Derived::Flags)&RowMajorBit ? int(Derived::MaxColsAtCompileTime)
+              : int(Derived::MaxRowsAtCompileTime),
+    MaxSizeAtCompileTime = Derived::SizeAtCompileTime,
+    PacketSize = packet_traits<typename Derived::Scalar>::size
+  };
+
+  enum {
+    StorageOrdersAgree = (int(Derived::IsRowMajor) == int(OtherDerived::IsRowMajor)),
+    MightVectorize = StorageOrdersAgree
+                  && (int(Derived::Flags) & int(OtherDerived::Flags) & ActualPacketAccessBit),
+    MayInnerVectorize  = MightVectorize && int(InnerSize)!=Dynamic && int(InnerSize)%int(PacketSize)==0
+                       && int(DstIsAligned) && int(SrcIsAligned),
+    MayLinearize = StorageOrdersAgree && (int(Derived::Flags) & int(OtherDerived::Flags) & LinearAccessBit),
+    MayLinearVectorize = MightVectorize && MayLinearize && DstHasDirectAccess
+                       && (DstIsAligned || MaxSizeAtCompileTime == Dynamic),
+      /* If the destination isn't aligned, we have to do runtime checks and we don't unroll,
+         so it's only good for large enough sizes. */
+    MaySliceVectorize  = MightVectorize && DstHasDirectAccess
+                       && (int(InnerMaxSize)==Dynamic || int(InnerMaxSize)>=3*PacketSize)
+      /* slice vectorization can be slow, so we only want it if the slices are big, which is
+         indicated by InnerMaxSize rather than InnerSize, think of the case of a dynamic block
+         in a fixed-size matrix */
+  };
+
+public:
+  enum {
+    Traversal = int(SrcEvalBeforeAssign) ? int(AllAtOnceTraversal) 
+              : int(MayInnerVectorize)   ? int(InnerVectorizedTraversal)
+              : int(MayLinearVectorize)  ? int(LinearVectorizedTraversal)
+              : int(MaySliceVectorize)   ? int(SliceVectorizedTraversal)
+              : int(MayLinearize)        ? int(LinearTraversal)
+                                         : int(DefaultTraversal),
+    Vectorized = int(Traversal) == InnerVectorizedTraversal
+              || int(Traversal) == LinearVectorizedTraversal
+              || int(Traversal) == SliceVectorizedTraversal
+  };
+
+private:
+  enum {
+    UnrollingLimit      = EIGEN_UNROLLING_LIMIT * (Vectorized ? int(PacketSize) : 1),
+    MayUnrollCompletely = int(Derived::SizeAtCompileTime) != Dynamic
+                       && int(OtherDerived::CoeffReadCost) != Dynamic
+                       && int(Derived::SizeAtCompileTime) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit),
+    MayUnrollInner      = int(InnerSize) != Dynamic
+                       && int(OtherDerived::CoeffReadCost) != Dynamic
+                       && int(InnerSize) * int(OtherDerived::CoeffReadCost) <= int(UnrollingLimit)
+  };
+
+public:
+  enum {
+    Unrolling = (int(Traversal) == int(InnerVectorizedTraversal) || int(Traversal) == int(DefaultTraversal))
+                ? (
+ 		    int(MayUnrollCompletely) ? int(CompleteUnrolling)
+                  : int(MayUnrollInner)      ? int(InnerUnrolling)
+                                             : int(NoUnrolling)
+                  )
+              : int(Traversal) == int(LinearVectorizedTraversal)
+                ? ( bool(MayUnrollCompletely) && bool(DstIsAligned) ? int(CompleteUnrolling) 
+                                                                    : int(NoUnrolling) )
+              : int(Traversal) == int(LinearTraversal)
+                ? ( bool(MayUnrollCompletely) ? int(CompleteUnrolling) 
+                                              : int(NoUnrolling) )
+              : int(NoUnrolling)
+  };
+
+#ifdef EIGEN_DEBUG_ASSIGN
+  static void debug()
+  {
+    EIGEN_DEBUG_VAR(DstIsAligned)
+    EIGEN_DEBUG_VAR(SrcIsAligned)
+    EIGEN_DEBUG_VAR(JointAlignment)
+    EIGEN_DEBUG_VAR(InnerSize)
+    EIGEN_DEBUG_VAR(InnerMaxSize)
+    EIGEN_DEBUG_VAR(PacketSize)
+    EIGEN_DEBUG_VAR(StorageOrdersAgree)
+    EIGEN_DEBUG_VAR(MightVectorize)
+    EIGEN_DEBUG_VAR(MayLinearize)
+    EIGEN_DEBUG_VAR(MayInnerVectorize)
+    EIGEN_DEBUG_VAR(MayLinearVectorize)
+    EIGEN_DEBUG_VAR(MaySliceVectorize)
+    EIGEN_DEBUG_VAR(Traversal)
+    EIGEN_DEBUG_VAR(UnrollingLimit)
+    EIGEN_DEBUG_VAR(MayUnrollCompletely)
+    EIGEN_DEBUG_VAR(MayUnrollInner)
+    EIGEN_DEBUG_VAR(Unrolling)
+  }
+#endif
+};
+
+/***************************************************************************
+* Part 2 : meta-unrollers
+***************************************************************************/
+
+/************************
+*** Default traversal ***
+************************/
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Index, int Stop>
+struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling
+{
+  typedef typename DstEvaluatorType::XprType DstXprType;
+  
+  enum {
+    outer = Index / DstXprType::InnerSizeAtCompileTime,
+    inner = Index % DstXprType::InnerSizeAtCompileTime
+  };
+
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator,
+                                      SrcEvaluatorType &srcEvaluator)
+  {
+    dstEvaluator.copyCoeffByOuterInner(outer, inner, srcEvaluator);
+    copy_using_evaluator_DefaultTraversal_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, Index+1, Stop>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Stop>
+struct copy_using_evaluator_DefaultTraversal_CompleteUnrolling<DstEvaluatorType, SrcEvaluatorType, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType&, SrcEvaluatorType&) { }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Index, int Stop>
+struct copy_using_evaluator_DefaultTraversal_InnerUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator,
+                                      SrcEvaluatorType &srcEvaluator, 
+                                      int outer)
+  {
+    dstEvaluator.copyCoeffByOuterInner(outer, Index, srcEvaluator);
+    copy_using_evaluator_DefaultTraversal_InnerUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, Index+1, Stop>
+      ::run(dstEvaluator, srcEvaluator, outer);
+  }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Stop>
+struct copy_using_evaluator_DefaultTraversal_InnerUnrolling<DstEvaluatorType, SrcEvaluatorType, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType&, SrcEvaluatorType&, int) { }
+};
+
+/***********************
+*** Linear traversal ***
+***********************/
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Index, int Stop>
+struct copy_using_evaluator_LinearTraversal_CompleteUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator,
+                                      SrcEvaluatorType &srcEvaluator)
+  {
+    dstEvaluator.copyCoeff(Index, srcEvaluator);
+    copy_using_evaluator_LinearTraversal_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, Index+1, Stop>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Stop>
+struct copy_using_evaluator_LinearTraversal_CompleteUnrolling<DstEvaluatorType, SrcEvaluatorType, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType&, SrcEvaluatorType&) { }
+};
+
+/**************************
+*** Inner vectorization ***
+**************************/
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Index, int Stop>
+struct copy_using_evaluator_innervec_CompleteUnrolling
+{
+  typedef typename DstEvaluatorType::XprType DstXprType;
+  typedef typename SrcEvaluatorType::XprType SrcXprType;
+
+  enum {
+    outer = Index / DstXprType::InnerSizeAtCompileTime,
+    inner = Index % DstXprType::InnerSizeAtCompileTime,
+    JointAlignment = copy_using_evaluator_traits<DstXprType,SrcXprType>::JointAlignment
+  };
+
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator,
+                                      SrcEvaluatorType &srcEvaluator)
+  {
+    dstEvaluator.template copyPacketByOuterInner<Aligned, JointAlignment>(outer, inner, srcEvaluator);
+    enum { NextIndex = Index + packet_traits<typename DstXprType::Scalar>::size };
+    copy_using_evaluator_innervec_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, NextIndex, Stop>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Stop>
+struct copy_using_evaluator_innervec_CompleteUnrolling<DstEvaluatorType, SrcEvaluatorType, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType&, SrcEvaluatorType&) { }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Index, int Stop>
+struct copy_using_evaluator_innervec_InnerUnrolling
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator,
+                                      SrcEvaluatorType &srcEvaluator, 
+                                      int outer)
+  {
+    dstEvaluator.template copyPacketByOuterInner<Aligned, Aligned>(outer, Index, srcEvaluator);
+    typedef typename DstEvaluatorType::XprType DstXprType;
+    enum { NextIndex = Index + packet_traits<typename DstXprType::Scalar>::size };
+    copy_using_evaluator_innervec_InnerUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, NextIndex, Stop>
+      ::run(dstEvaluator, srcEvaluator, outer);
+  }
+};
+
+template<typename DstEvaluatorType, typename SrcEvaluatorType, int Stop>
+struct copy_using_evaluator_innervec_InnerUnrolling<DstEvaluatorType, SrcEvaluatorType, Stop, Stop>
+{
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType&, SrcEvaluatorType&, int) { }
+};
+
+/***************************************************************************
+* Part 3 : implementation of all cases
+***************************************************************************/
+
+// copy_using_evaluator_impl is based on assign_impl
+
+template<typename DstXprType, typename SrcXprType,
+         int Traversal = copy_using_evaluator_traits<DstXprType, SrcXprType>::Traversal,
+         int Unrolling = copy_using_evaluator_traits<DstXprType, SrcXprType>::Unrolling>
+struct copy_using_evaluator_impl;
+
+/************************
+*** Default traversal ***
+************************/
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, DefaultTraversal, NoUnrolling>
+{
+  static void run(DstXprType& dst, const SrcXprType& src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+    typedef typename DstXprType::Index Index;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    for(Index outer = 0; outer < dst.outerSize(); ++outer) {
+      for(Index inner = 0; inner < dst.innerSize(); ++inner) {
+	dstEvaluator.copyCoeffByOuterInner(outer, inner, srcEvaluator);
+      }
+    }
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, DefaultTraversal, CompleteUnrolling>
+{
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    copy_using_evaluator_DefaultTraversal_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, 0, DstXprType::SizeAtCompileTime>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, DefaultTraversal, InnerUnrolling>
+{
+  typedef typename DstXprType::Index Index;
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer)
+      copy_using_evaluator_DefaultTraversal_InnerUnrolling
+        <DstEvaluatorType, SrcEvaluatorType, 0, DstXprType::InnerSizeAtCompileTime>
+        ::run(dstEvaluator, srcEvaluator, outer);
+  }
+};
+
+/***************************
+*** Linear vectorization ***
+***************************/
+
+template <bool IsAligned = false>
+struct unaligned_copy_using_evaluator_impl
+{
+  // if IsAligned = true, then do nothing
+  template <typename SrcEvaluatorType, typename DstEvaluatorType>
+  static EIGEN_STRONG_INLINE void run(const SrcEvaluatorType&, DstEvaluatorType&, 
+                                      typename SrcEvaluatorType::Index, typename SrcEvaluatorType::Index) {}
+};
+
+template <>
+struct unaligned_copy_using_evaluator_impl<false>
+{
+  // MSVC must not inline this functions. If it does, it fails to optimize the
+  // packet access path.
+#ifdef _MSC_VER
+  template <typename DstEvaluatorType, typename SrcEvaluatorType>
+  static EIGEN_DONT_INLINE void run(DstEvaluatorType &dstEvaluator, 
+                                    const SrcEvaluatorType &srcEvaluator,
+                                    typename DstEvaluatorType::Index start,
+                                    typename DstEvaluatorType::Index end)
+#else
+  template <typename DstEvaluatorType, typename SrcEvaluatorType>
+  static EIGEN_STRONG_INLINE void run(DstEvaluatorType &dstEvaluator, 
+                                      const SrcEvaluatorType &srcEvaluator,
+                                      typename DstEvaluatorType::Index start,
+                                      typename DstEvaluatorType::Index end)
+#endif
+  {
+    for (typename DstEvaluatorType::Index index = start; index < end; ++index)
+      dstEvaluator.copyCoeff(index, srcEvaluator);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, LinearVectorizedTraversal, NoUnrolling>
+{
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+    typedef typename DstXprType::Index Index;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    const Index size = dst.size();
+    typedef packet_traits<typename DstXprType::Scalar> PacketTraits;
+    enum {
+      packetSize = PacketTraits::size,
+      dstIsAligned = int(copy_using_evaluator_traits<DstXprType,SrcXprType>::DstIsAligned),
+      dstAlignment = PacketTraits::AlignedOnScalar ? Aligned : dstIsAligned,
+      srcAlignment = copy_using_evaluator_traits<DstXprType,SrcXprType>::JointAlignment
+    };
+    const Index alignedStart = dstIsAligned ? 0 : internal::first_aligned(&dstEvaluator.coeffRef(0), size);
+    const Index alignedEnd = alignedStart + ((size-alignedStart)/packetSize)*packetSize;
+
+    unaligned_copy_using_evaluator_impl<dstIsAligned!=0>::run(dstEvaluator, srcEvaluator, 0, alignedStart);
+
+    for(Index index = alignedStart; index < alignedEnd; index += packetSize)
+    {
+      dstEvaluator.template copyPacket<dstAlignment, srcAlignment>(index, srcEvaluator);
+    }
+
+    unaligned_copy_using_evaluator_impl<>::run(dstEvaluator, srcEvaluator, alignedEnd, size);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, LinearVectorizedTraversal, CompleteUnrolling>
+{
+  typedef typename DstXprType::Index Index;
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    enum { size = DstXprType::SizeAtCompileTime,
+           packetSize = packet_traits<typename DstXprType::Scalar>::size,
+           alignedSize = (size/packetSize)*packetSize };
+
+    copy_using_evaluator_innervec_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, 0, alignedSize>
+      ::run(dstEvaluator, srcEvaluator);
+    copy_using_evaluator_DefaultTraversal_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, alignedSize, size>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+/**************************
+*** Inner vectorization ***
+**************************/
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, InnerVectorizedTraversal, NoUnrolling>
+{
+  inline static void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+    typedef typename DstXprType::Index Index;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    const Index packetSize = packet_traits<typename DstXprType::Scalar>::size;
+    for(Index outer = 0; outer < outerSize; ++outer)
+      for(Index inner = 0; inner < innerSize; inner+=packetSize) {
+	dstEvaluator.template copyPacketByOuterInner<Aligned, Aligned>(outer, inner, srcEvaluator);
+      }
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, InnerVectorizedTraversal, CompleteUnrolling>
+{
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    copy_using_evaluator_innervec_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, 0, DstXprType::SizeAtCompileTime>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, InnerVectorizedTraversal, InnerUnrolling>
+{
+  typedef typename DstXprType::Index Index;
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer)
+      copy_using_evaluator_innervec_InnerUnrolling
+        <DstEvaluatorType, SrcEvaluatorType, 0, DstXprType::InnerSizeAtCompileTime>
+        ::run(dstEvaluator, srcEvaluator, outer);
+  }
+};
+
+/***********************
+*** Linear traversal ***
+***********************/
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, LinearTraversal, NoUnrolling>
+{
+  inline static void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+    typedef typename DstXprType::Index Index;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    const Index size = dst.size();
+    for(Index i = 0; i < size; ++i)
+      dstEvaluator.copyCoeff(i, srcEvaluator);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, LinearTraversal, CompleteUnrolling>
+{
+  static EIGEN_STRONG_INLINE void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    copy_using_evaluator_LinearTraversal_CompleteUnrolling
+      <DstEvaluatorType, SrcEvaluatorType, 0, DstXprType::SizeAtCompileTime>
+      ::run(dstEvaluator, srcEvaluator);
+  }
+};
+
+/**************************
+*** Slice vectorization ***
+***************************/
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, SliceVectorizedTraversal, NoUnrolling>
+{
+  inline static void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+    typedef typename DstXprType::Index Index;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    typedef packet_traits<typename DstXprType::Scalar> PacketTraits;
+    enum {
+      packetSize = PacketTraits::size,
+      alignable = PacketTraits::AlignedOnScalar,
+      dstAlignment = alignable ? Aligned : int(copy_using_evaluator_traits<DstXprType,SrcXprType>::DstIsAligned)
+    };
+    const Index packetAlignedMask = packetSize - 1;
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    const Index alignedStep = alignable ? (packetSize - dst.outerStride() % packetSize) & packetAlignedMask : 0;
+    Index alignedStart = ((!alignable) || copy_using_evaluator_traits<DstXprType,SrcXprType>::DstIsAligned) ? 0
+                       : internal::first_aligned(&dstEvaluator.coeffRef(0,0), innerSize);
+
+    for(Index outer = 0; outer < outerSize; ++outer)
+    {
+      const Index alignedEnd = alignedStart + ((innerSize-alignedStart) & ~packetAlignedMask);
+      // do the non-vectorizable part of the assignment
+      for(Index inner = 0; inner<alignedStart ; ++inner) {
+        dstEvaluator.copyCoeffByOuterInner(outer, inner, srcEvaluator);
+      }
+
+      // do the vectorizable part of the assignment
+      for(Index inner = alignedStart; inner<alignedEnd; inner+=packetSize) {
+        dstEvaluator.template copyPacketByOuterInner<dstAlignment, Unaligned>(outer, inner, srcEvaluator);
+      }
+
+      // do the non-vectorizable part of the assignment
+      for(Index inner = alignedEnd; inner<innerSize ; ++inner) {
+        dstEvaluator.copyCoeffByOuterInner(outer, inner, srcEvaluator);
+      }
+
+      alignedStart = std::min<Index>((alignedStart+alignedStep)%packetSize, innerSize);
+    }
+  }
+};
+
+/****************************
+*** All-at-once traversal ***
+****************************/
+
+template<typename DstXprType, typename SrcXprType>
+struct copy_using_evaluator_impl<DstXprType, SrcXprType, AllAtOnceTraversal, NoUnrolling>
+{
+  inline static void run(DstXprType &dst, const SrcXprType &src)
+  {
+    typedef typename evaluator<DstXprType>::type DstEvaluatorType;
+    typedef typename evaluator<SrcXprType>::type SrcEvaluatorType;
+
+    DstEvaluatorType dstEvaluator(dst);
+    SrcEvaluatorType srcEvaluator(src);
+
+    // Evaluate rhs in temporary to prevent aliasing problems in a = a * a;
+    // TODO: Do not pass the xpr object to evalTo()
+    srcEvaluator.evalTo(dstEvaluator, dst);
+  }
+};
+
+/***************************************************************************
+* Part 4 : Entry points
+***************************************************************************/
+
+// Based on DenseBase::LazyAssign()
+
+template<typename DstXprType, template <typename> class StorageBase, typename SrcXprType>
+EIGEN_STRONG_INLINE
+const DstXprType& copy_using_evaluator(const NoAlias<DstXprType, StorageBase>& dst, 
+                                       const EigenBase<SrcXprType>& src)
+{
+  return noalias_copy_using_evaluator(dst.expression(), src.derived());
+}
+
+template<typename XprType, int AssumeAliasing = evaluator_traits<XprType>::AssumeAliasing>
+struct AddEvalIfAssumingAliasing;
+
+template<typename XprType>
+struct AddEvalIfAssumingAliasing<XprType, 0>
+{
+  static const XprType& run(const XprType& xpr) 
+  {
+    return xpr;
+  }
+};
+
+template<typename XprType>
+struct AddEvalIfAssumingAliasing<XprType, 1>
+{
+  static const EvalToTemp<XprType> run(const XprType& xpr)
+  {
+    return EvalToTemp<XprType>(xpr);
+  }
+};
+
+template<typename DstXprType, typename SrcXprType>
+EIGEN_STRONG_INLINE
+const DstXprType& copy_using_evaluator(const EigenBase<DstXprType>& dst, const EigenBase<SrcXprType>& src)
+{
+  return noalias_copy_using_evaluator(dst.const_cast_derived(), 
+				      AddEvalIfAssumingAliasing<SrcXprType>::run(src.derived()));
+}
+
+template<typename DstXprType, typename SrcXprType>
+EIGEN_STRONG_INLINE
+const DstXprType& noalias_copy_using_evaluator(const PlainObjectBase<DstXprType>& dst, const EigenBase<SrcXprType>& src)
+{
+#ifdef EIGEN_DEBUG_ASSIGN
+  internal::copy_using_evaluator_traits<DstXprType, SrcXprType>::debug();
+#endif
+#ifdef EIGEN_NO_AUTOMATIC_RESIZING
+  eigen_assert((dst.size()==0 || (IsVectorAtCompileTime ? (dst.size() == src.size())
+				  : (dst.rows() == src.rows() && dst.cols() == src.cols())))
+	       && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined");
+#else
+  dst.const_cast_derived().resizeLike(src.derived());
+#endif
+  return copy_using_evaluator_without_resizing(dst.const_cast_derived(), src.derived());
+}
+
+template<typename DstXprType, typename SrcXprType>
+EIGEN_STRONG_INLINE
+const DstXprType& noalias_copy_using_evaluator(const EigenBase<DstXprType>& dst, const EigenBase<SrcXprType>& src)
+{
+  return copy_using_evaluator_without_resizing(dst.const_cast_derived(), src.derived());
+}
+
+template<typename DstXprType, typename SrcXprType>
+const DstXprType& copy_using_evaluator_without_resizing(const DstXprType& dst, const SrcXprType& src)
+{
+#ifdef EIGEN_DEBUG_ASSIGN
+  internal::copy_using_evaluator_traits<DstXprType, SrcXprType>::debug();
+#endif
+  eigen_assert(dst.rows() == src.rows() && dst.cols() == src.cols());
+  copy_using_evaluator_impl<DstXprType, SrcXprType>::run(const_cast<DstXprType&>(dst), src);
+  return dst;
+}
+
+// Based on DenseBase::swap()
+// TODO: Chech whether we need to do something special for swapping two
+//       Arrays or Matrices.
+
+template<typename DstXprType, typename SrcXprType>
+void swap_using_evaluator(const DstXprType& dst, const SrcXprType& src)
+{
+  copy_using_evaluator(SwapWrapper<DstXprType>(const_cast<DstXprType&>(dst)), src);
+}
+
+// Based on MatrixBase::operator+= (in CwiseBinaryOp.h)
+template<typename DstXprType, typename SrcXprType>
+void add_assign_using_evaluator(const MatrixBase<DstXprType>& dst, const MatrixBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+// Based on ArrayBase::operator+=
+template<typename DstXprType, typename SrcXprType>
+void add_assign_using_evaluator(const ArrayBase<DstXprType>& dst, const ArrayBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+// TODO: Add add_assign_using_evaluator for EigenBase ?
+
+template<typename DstXprType, typename SrcXprType>
+void subtract_assign_using_evaluator(const MatrixBase<DstXprType>& dst, const MatrixBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+template<typename DstXprType, typename SrcXprType>
+void subtract_assign_using_evaluator(const ArrayBase<DstXprType>& dst, const ArrayBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+template<typename DstXprType, typename SrcXprType>
+void multiply_assign_using_evaluator(const ArrayBase<DstXprType>& dst, const ArrayBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+template<typename DstXprType, typename SrcXprType>
+void divide_assign_using_evaluator(const ArrayBase<DstXprType>& dst, const ArrayBase<SrcXprType>& src)
+{
+  typedef typename DstXprType::Scalar Scalar;
+  SelfCwiseBinaryOp<internal::scalar_quotient_op<Scalar>, DstXprType, SrcXprType> tmp(dst.const_cast_derived());
+  copy_using_evaluator(tmp, src.derived());
+}
+
+
+} // namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_ASSIGN_EVALUATOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Assign_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/Assign_MKL.h
new file mode 100644
index 0000000..7772951
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Assign_MKL.h
@@ -0,0 +1,224 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   MKL VML support for coefficient-wise unary Eigen expressions like a=b.sin()
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_ASSIGN_VML_H
+#define EIGEN_ASSIGN_VML_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Op> struct vml_call
+{ enum { IsSupported = 0 }; };
+
+template<typename Dst, typename Src, typename UnaryOp>
+class vml_assign_traits
+{
+  private:
+    enum {
+      DstHasDirectAccess = Dst::Flags & DirectAccessBit,
+      SrcHasDirectAccess = Src::Flags & DirectAccessBit,
+
+      StorageOrdersAgree = (int(Dst::IsRowMajor) == int(Src::IsRowMajor)),
+      InnerSize = int(Dst::IsVectorAtCompileTime) ? int(Dst::SizeAtCompileTime)
+                : int(Dst::Flags)&RowMajorBit ? int(Dst::ColsAtCompileTime)
+                : int(Dst::RowsAtCompileTime),
+      InnerMaxSize  = int(Dst::IsVectorAtCompileTime) ? int(Dst::MaxSizeAtCompileTime)
+                    : int(Dst::Flags)&RowMajorBit ? int(Dst::MaxColsAtCompileTime)
+                    : int(Dst::MaxRowsAtCompileTime),
+      MaxSizeAtCompileTime = Dst::SizeAtCompileTime,
+
+      MightEnableVml =  vml_call<UnaryOp>::IsSupported && StorageOrdersAgree && DstHasDirectAccess && SrcHasDirectAccess
+                     && Src::InnerStrideAtCompileTime==1 && Dst::InnerStrideAtCompileTime==1,
+      MightLinearize = MightEnableVml && (int(Dst::Flags) & int(Src::Flags) & LinearAccessBit),
+      VmlSize = MightLinearize ? MaxSizeAtCompileTime : InnerMaxSize,
+      LargeEnough = VmlSize==Dynamic || VmlSize>=EIGEN_MKL_VML_THRESHOLD,
+      MayEnableVml = MightEnableVml && LargeEnough,
+      MayLinearize = MayEnableVml && MightLinearize
+    };
+  public:
+    enum {
+      Traversal = MayLinearize ? LinearVectorizedTraversal
+                : MayEnableVml ? InnerVectorizedTraversal
+                : DefaultTraversal
+    };
+};
+
+template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling,
+         int VmlTraversal = vml_assign_traits<Derived1, Derived2, UnaryOp>::Traversal >
+struct vml_assign_impl
+  : assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>
+{
+};
+
+template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>
+struct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, InnerVectorizedTraversal>
+{
+  typedef typename Derived1::Scalar Scalar;
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)
+  {
+    // in case we want to (or have to) skip VML at runtime we can call:
+    // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);
+    const Index innerSize = dst.innerSize();
+    const Index outerSize = dst.outerSize();
+    for(Index outer = 0; outer < outerSize; ++outer) {
+      const Scalar *src_ptr = src.IsRowMajor ?  &(src.nestedExpression().coeffRef(outer,0)) :
+                                                &(src.nestedExpression().coeffRef(0, outer));
+      Scalar *dst_ptr = dst.IsRowMajor ? &(dst.coeffRef(outer,0)) : &(dst.coeffRef(0, outer));
+      vml_call<UnaryOp>::run(src.functor(), innerSize, src_ptr, dst_ptr );
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, typename UnaryOp, int Traversal, int Unrolling>
+struct vml_assign_impl<Derived1, Derived2, UnaryOp, Traversal, Unrolling, LinearVectorizedTraversal>
+{
+  static inline void run(Derived1& dst, const CwiseUnaryOp<UnaryOp, Derived2>& src)
+  {
+    // in case we want to (or have to) skip VML at runtime we can call:
+    // assign_impl<Derived1,Eigen::CwiseUnaryOp<UnaryOp, Derived2>,Traversal,Unrolling,BuiltIn>::run(dst,src);
+    vml_call<UnaryOp>::run(src.functor(), dst.size(), src.nestedExpression().data(), dst.data() );
+  }
+};
+
+// Macroses
+
+#define EIGEN_MKL_VML_SPECIALIZE_ASSIGN(TRAVERSAL,UNROLLING) \
+  template<typename Derived1, typename Derived2, typename UnaryOp> \
+  struct assign_impl<Derived1, Eigen::CwiseUnaryOp<UnaryOp, Derived2>, TRAVERSAL, UNROLLING, Specialized>  {  \
+    static inline void run(Derived1 &dst, const Eigen::CwiseUnaryOp<UnaryOp, Derived2> &src) { \
+      vml_assign_impl<Derived1,Derived2,UnaryOp,TRAVERSAL,UNROLLING>::run(dst, src); \
+    } \
+  };
+
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,NoUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,CompleteUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(DefaultTraversal,InnerUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,NoUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearTraversal,CompleteUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,NoUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,CompleteUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(InnerVectorizedTraversal,InnerUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,CompleteUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(LinearVectorizedTraversal,NoUnrolling)
+EIGEN_MKL_VML_SPECIALIZE_ASSIGN(SliceVectorizedTraversal,NoUnrolling)
+
+
+#if !defined (EIGEN_FAST_MATH) || (EIGEN_FAST_MATH != 1)
+#define  EIGEN_MKL_VML_MODE VML_HA
+#else
+#define  EIGEN_MKL_VML_MODE VML_LA
+#endif
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)     \
+  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \
+    enum { IsSupported = 1 };                                                    \
+    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/,        \
+                            int size, const EIGENTYPE* src, EIGENTYPE* dst) {    \
+      VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst);                           \
+    }                                                                            \
+  };
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)  \
+  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \
+    enum { IsSupported = 1 };                                                    \
+    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& /*func*/,        \
+                            int size, const EIGENTYPE* src, EIGENTYPE* dst) {    \
+      MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE;                                    \
+      VMLOP(size, (const VMLTYPE*)src, (VMLTYPE*)dst, vmlMode);                  \
+    }                                                                            \
+  };
+
+#define EIGEN_MKL_VML_DECLARE_POW_CALL(EIGENOP, VMLOP, EIGENTYPE, VMLTYPE)       \
+  template<> struct vml_call< scalar_##EIGENOP##_op<EIGENTYPE> > {               \
+    enum { IsSupported = 1 };                                                    \
+    static inline void run( const scalar_##EIGENOP##_op<EIGENTYPE>& func,        \
+                          int size, const EIGENTYPE* src, EIGENTYPE* dst) {      \
+      EIGENTYPE exponent = func.m_exponent;                                      \
+      MKL_INT64 vmlMode = EIGEN_MKL_VML_MODE;                                    \
+      VMLOP(&size, (const VMLTYPE*)src, (const VMLTYPE*)&exponent,               \
+                        (VMLTYPE*)dst, &vmlMode);                                \
+    }                                                                            \
+  };
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP)                   \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vs##VMLOP, float, float)             \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vd##VMLOP, double, double)
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP)                \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vc##VMLOP, scomplex, MKL_Complex8)   \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL(EIGENOP, vz##VMLOP, dcomplex, MKL_Complex16)
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS(EIGENOP, VMLOP)                        \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(EIGENOP, VMLOP)                         \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX(EIGENOP, VMLOP)
+
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP)                \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vms##VMLOP, float, float)         \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmd##VMLOP, double, double)
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP)             \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmc##VMLOP, scomplex, MKL_Complex8)  \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALL_LA(EIGENOP, vmz##VMLOP, dcomplex, MKL_Complex16)
+
+#define EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(EIGENOP, VMLOP)                     \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL_LA(EIGENOP, VMLOP)                      \
+  EIGEN_MKL_VML_DECLARE_UNARY_CALLS_COMPLEX_LA(EIGENOP, VMLOP)
+
+
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sin,  Sin)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(asin, Asin)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(cos,  Cos)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(acos, Acos)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(tan,  Tan)
+//EIGEN_MKL_VML_DECLARE_UNARY_CALLS(abs,  Abs)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(exp,  Exp)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(log,  Ln)
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_LA(sqrt, Sqrt)
+
+EIGEN_MKL_VML_DECLARE_UNARY_CALLS_REAL(square, Sqr)
+
+// The vm*powx functions are not avaibale in the windows version of MKL.
+#ifndef _WIN32
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmspowx_, float, float)
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmdpowx_, double, double)
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmcpowx_, scomplex, MKL_Complex8)
+EIGEN_MKL_VML_DECLARE_POW_CALL(pow, vmzpowx_, dcomplex, MKL_Complex16)
+#endif
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_ASSIGN_VML_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/BandMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/BandMatrix.h
new file mode 100644
index 0000000..ffd7fe8
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/BandMatrix.h
@@ -0,0 +1,334 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BANDMATRIX_H
+#define EIGEN_BANDMATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Derived>
+class BandMatrixBase : public EigenBase<Derived>
+{
+  public:
+
+    enum {
+      Flags = internal::traits<Derived>::Flags,
+      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+      Supers = internal::traits<Derived>::Supers,
+      Subs   = internal::traits<Derived>::Subs,
+      Options = internal::traits<Derived>::Options
+    };
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> DenseMatrixType;
+    typedef typename DenseMatrixType::Index Index;
+    typedef typename internal::traits<Derived>::CoefficientsType CoefficientsType;
+    typedef EigenBase<Derived> Base;
+
+  protected:
+    enum {
+      DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic))
+                            ? 1 + Supers + Subs
+                            : Dynamic,
+      SizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime)
+    };
+
+  public:
+    
+    using Base::derived;
+    using Base::rows;
+    using Base::cols;
+
+    /** \returns the number of super diagonals */
+    inline Index supers() const { return derived().supers(); }
+
+    /** \returns the number of sub diagonals */
+    inline Index subs() const { return derived().subs(); }
+    
+    /** \returns an expression of the underlying coefficient matrix */
+    inline const CoefficientsType& coeffs() const { return derived().coeffs(); }
+    
+    /** \returns an expression of the underlying coefficient matrix */
+    inline CoefficientsType& coeffs() { return derived().coeffs(); }
+
+    /** \returns a vector expression of the \a i -th column,
+      * only the meaningful part is returned.
+      * \warning the internal storage must be column major. */
+    inline Block<CoefficientsType,Dynamic,1> col(Index i)
+    {
+      EIGEN_STATIC_ASSERT((Options&RowMajor)==0,THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+      Index start = 0;
+      Index len = coeffs().rows();
+      if (i<=supers())
+      {
+        start = supers()-i;
+        len = (std::min)(rows(),std::max<Index>(0,coeffs().rows() - (supers()-i)));
+      }
+      else if (i>=rows()-subs())
+        len = std::max<Index>(0,coeffs().rows() - (i + 1 - rows() + subs()));
+      return Block<CoefficientsType,Dynamic,1>(coeffs(), start, i, len, 1);
+    }
+
+    /** \returns a vector expression of the main diagonal */
+    inline Block<CoefficientsType,1,SizeAtCompileTime> diagonal()
+    { return Block<CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }
+
+    /** \returns a vector expression of the main diagonal (const version) */
+    inline const Block<const CoefficientsType,1,SizeAtCompileTime> diagonal() const
+    { return Block<const CoefficientsType,1,SizeAtCompileTime>(coeffs(),supers(),0,1,(std::min)(rows(),cols())); }
+
+    template<int Index> struct DiagonalIntReturnType {
+      enum {
+        ReturnOpposite = (Options&SelfAdjoint) && (((Index)>0 && Supers==0) || ((Index)<0 && Subs==0)),
+        Conjugate = ReturnOpposite && NumTraits<Scalar>::IsComplex,
+        ActualIndex = ReturnOpposite ? -Index : Index,
+        DiagonalSize = (RowsAtCompileTime==Dynamic || ColsAtCompileTime==Dynamic)
+                     ? Dynamic
+                     : (ActualIndex<0
+                     ? EIGEN_SIZE_MIN_PREFER_DYNAMIC(ColsAtCompileTime, RowsAtCompileTime + ActualIndex)
+                     : EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime, ColsAtCompileTime - ActualIndex))
+      };
+      typedef Block<CoefficientsType,1, DiagonalSize> BuildType;
+      typedef typename internal::conditional<Conjugate,
+                 CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>,BuildType >,
+                 BuildType>::type Type;
+    };
+
+    /** \returns a vector expression of the \a N -th sub or super diagonal */
+    template<int N> inline typename DiagonalIntReturnType<N>::Type diagonal()
+    {
+      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));
+    }
+
+    /** \returns a vector expression of the \a N -th sub or super diagonal */
+    template<int N> inline const typename DiagonalIntReturnType<N>::Type diagonal() const
+    {
+      return typename DiagonalIntReturnType<N>::BuildType(coeffs(), supers()-N, (std::max)(0,N), 1, diagonalLength(N));
+    }
+
+    /** \returns a vector expression of the \a i -th sub or super diagonal */
+    inline Block<CoefficientsType,1,Dynamic> diagonal(Index i)
+    {
+      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));
+      return Block<CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));
+    }
+
+    /** \returns a vector expression of the \a i -th sub or super diagonal */
+    inline const Block<const CoefficientsType,1,Dynamic> diagonal(Index i) const
+    {
+      eigen_assert((i<0 && -i<=subs()) || (i>=0 && i<=supers()));
+      return Block<const CoefficientsType,1,Dynamic>(coeffs(), supers()-i, std::max<Index>(0,i), 1, diagonalLength(i));
+    }
+    
+    template<typename Dest> inline void evalTo(Dest& dst) const
+    {
+      dst.resize(rows(),cols());
+      dst.setZero();
+      dst.diagonal() = diagonal();
+      for (Index i=1; i<=supers();++i)
+        dst.diagonal(i) = diagonal(i);
+      for (Index i=1; i<=subs();++i)
+        dst.diagonal(-i) = diagonal(-i);
+    }
+
+    DenseMatrixType toDenseMatrix() const
+    {
+      DenseMatrixType res(rows(),cols());
+      evalTo(res);
+      return res;
+    }
+
+  protected:
+
+    inline Index diagonalLength(Index i) const
+    { return i<0 ? (std::min)(cols(),rows()+i) : (std::min)(rows(),cols()-i); }
+};
+
+/**
+  * \class BandMatrix
+  * \ingroup Core_Module
+  *
+  * \brief Represents a rectangular matrix with a banded storage
+  *
+  * \param _Scalar Numeric type, i.e. float, double, int
+  * \param Rows Number of rows, or \b Dynamic
+  * \param Cols Number of columns, or \b Dynamic
+  * \param Supers Number of super diagonal
+  * \param Subs Number of sub diagonal
+  * \param _Options A combination of either \b #RowMajor or \b #ColMajor, and of \b #SelfAdjoint
+  *                 The former controls \ref TopicStorageOrders "storage order", and defaults to
+  *                 column-major. The latter controls whether the matrix represents a selfadjoint 
+  *                 matrix in which case either Supers of Subs have to be null.
+  *
+  * \sa class TridiagonalMatrix
+  */
+
+template<typename _Scalar, int _Rows, int _Cols, int _Supers, int _Subs, int _Options>
+struct traits<BandMatrix<_Scalar,_Rows,_Cols,_Supers,_Subs,_Options> >
+{
+  typedef _Scalar Scalar;
+  typedef Dense StorageKind;
+  typedef DenseIndex Index;
+  enum {
+    CoeffReadCost = NumTraits<Scalar>::ReadCost,
+    RowsAtCompileTime = _Rows,
+    ColsAtCompileTime = _Cols,
+    MaxRowsAtCompileTime = _Rows,
+    MaxColsAtCompileTime = _Cols,
+    Flags = LvalueBit,
+    Supers = _Supers,
+    Subs = _Subs,
+    Options = _Options,
+    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic
+  };
+  typedef Matrix<Scalar,DataRowsAtCompileTime,ColsAtCompileTime,Options&RowMajor?RowMajor:ColMajor> CoefficientsType;
+};
+
+template<typename _Scalar, int Rows, int Cols, int Supers, int Subs, int Options>
+class BandMatrix : public BandMatrixBase<BandMatrix<_Scalar,Rows,Cols,Supers,Subs,Options> >
+{
+  public:
+
+    typedef typename internal::traits<BandMatrix>::Scalar Scalar;
+    typedef typename internal::traits<BandMatrix>::Index Index;
+    typedef typename internal::traits<BandMatrix>::CoefficientsType CoefficientsType;
+
+    inline BandMatrix(Index rows=Rows, Index cols=Cols, Index supers=Supers, Index subs=Subs)
+      : m_coeffs(1+supers+subs,cols),
+        m_rows(rows), m_supers(supers), m_subs(subs)
+    {
+    }
+
+    /** \returns the number of columns */
+    inline Index rows() const { return m_rows.value(); }
+
+    /** \returns the number of rows */
+    inline Index cols() const { return m_coeffs.cols(); }
+
+    /** \returns the number of super diagonals */
+    inline Index supers() const { return m_supers.value(); }
+
+    /** \returns the number of sub diagonals */
+    inline Index subs() const { return m_subs.value(); }
+
+    inline const CoefficientsType& coeffs() const { return m_coeffs; }
+    inline CoefficientsType& coeffs() { return m_coeffs; }
+
+  protected:
+
+    CoefficientsType m_coeffs;
+    internal::variable_if_dynamic<Index, Rows>   m_rows;
+    internal::variable_if_dynamic<Index, Supers> m_supers;
+    internal::variable_if_dynamic<Index, Subs>   m_subs;
+};
+
+template<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>
+class BandMatrixWrapper;
+
+template<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>
+struct traits<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> >
+{
+  typedef typename _CoefficientsType::Scalar Scalar;
+  typedef typename _CoefficientsType::StorageKind StorageKind;
+  typedef typename _CoefficientsType::Index Index;
+  enum {
+    CoeffReadCost = internal::traits<_CoefficientsType>::CoeffReadCost,
+    RowsAtCompileTime = _Rows,
+    ColsAtCompileTime = _Cols,
+    MaxRowsAtCompileTime = _Rows,
+    MaxColsAtCompileTime = _Cols,
+    Flags = LvalueBit,
+    Supers = _Supers,
+    Subs = _Subs,
+    Options = _Options,
+    DataRowsAtCompileTime = ((Supers!=Dynamic) && (Subs!=Dynamic)) ? 1 + Supers + Subs : Dynamic
+  };
+  typedef _CoefficientsType CoefficientsType;
+};
+
+template<typename _CoefficientsType,int _Rows, int _Cols, int _Supers, int _Subs,int _Options>
+class BandMatrixWrapper : public BandMatrixBase<BandMatrixWrapper<_CoefficientsType,_Rows,_Cols,_Supers,_Subs,_Options> >
+{
+  public:
+
+    typedef typename internal::traits<BandMatrixWrapper>::Scalar Scalar;
+    typedef typename internal::traits<BandMatrixWrapper>::CoefficientsType CoefficientsType;
+    typedef typename internal::traits<BandMatrixWrapper>::Index Index;
+
+    inline BandMatrixWrapper(const CoefficientsType& coeffs, Index rows=_Rows, Index cols=_Cols, Index supers=_Supers, Index subs=_Subs)
+      : m_coeffs(coeffs),
+        m_rows(rows), m_supers(supers), m_subs(subs)
+    {
+      EIGEN_UNUSED_VARIABLE(cols);
+      //internal::assert(coeffs.cols()==cols() && (supers()+subs()+1)==coeffs.rows());
+    }
+
+    /** \returns the number of columns */
+    inline Index rows() const { return m_rows.value(); }
+
+    /** \returns the number of rows */
+    inline Index cols() const { return m_coeffs.cols(); }
+
+    /** \returns the number of super diagonals */
+    inline Index supers() const { return m_supers.value(); }
+
+    /** \returns the number of sub diagonals */
+    inline Index subs() const { return m_subs.value(); }
+
+    inline const CoefficientsType& coeffs() const { return m_coeffs; }
+
+  protected:
+
+    const CoefficientsType& m_coeffs;
+    internal::variable_if_dynamic<Index, _Rows>   m_rows;
+    internal::variable_if_dynamic<Index, _Supers> m_supers;
+    internal::variable_if_dynamic<Index, _Subs>   m_subs;
+};
+
+/**
+  * \class TridiagonalMatrix
+  * \ingroup Core_Module
+  *
+  * \brief Represents a tridiagonal matrix with a compact banded storage
+  *
+  * \param _Scalar Numeric type, i.e. float, double, int
+  * \param Size Number of rows and cols, or \b Dynamic
+  * \param _Options Can be 0 or \b SelfAdjoint
+  *
+  * \sa class BandMatrix
+  */
+template<typename Scalar, int Size, int Options>
+class TridiagonalMatrix : public BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor>
+{
+    typedef BandMatrix<Scalar,Size,Size,Options&SelfAdjoint?0:1,1,Options|RowMajor> Base;
+    typedef typename Base::Index Index;
+  public:
+    TridiagonalMatrix(Index size = Size) : Base(size,size,Options&SelfAdjoint?0:1,1) {}
+
+    inline typename Base::template DiagonalIntReturnType<1>::Type super()
+    { return Base::template diagonal<1>(); }
+    inline const typename Base::template DiagonalIntReturnType<1>::Type super() const
+    { return Base::template diagonal<1>(); }
+    inline typename Base::template DiagonalIntReturnType<-1>::Type sub()
+    { return Base::template diagonal<-1>(); }
+    inline const typename Base::template DiagonalIntReturnType<-1>::Type sub() const
+    { return Base::template diagonal<-1>(); }
+  protected:
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BANDMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Block.h b/vendor/eigen-3.1.91/Eigen/src/Core/Block.h
new file mode 100644
index 0000000..358b318
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Block.h
@@ -0,0 +1,405 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BLOCK_H
+#define EIGEN_BLOCK_H
+
+namespace Eigen { 
+
+/** \class Block
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a fixed-size or dynamic-size block
+  *
+  * \param XprType the type of the expression in which we are taking a block
+  * \param BlockRows the number of rows of the block we are taking at compile time (optional)
+  * \param BlockCols the number of columns of the block we are taking at compile time (optional)
+  *
+  * This class represents an expression of either a fixed-size or dynamic-size block. It is the return
+  * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and
+  * most of the time this is the only way it is used.
+  *
+  * However, if you want to directly maniputate block expressions,
+  * for instance if you want to write a function returning such an expression, you
+  * will need to use this class.
+  *
+  * Here is an example illustrating the dynamic case:
+  * \include class_Block.cpp
+  * Output: \verbinclude class_Block.out
+  *
+  * \note Even though this expression has dynamic size, in the case where \a XprType
+  * has fixed size, this expression inherits a fixed maximal size which means that evaluating
+  * it does not cause a dynamic memory allocation.
+  *
+  * Here is an example illustrating the fixed-size case:
+  * \include class_FixedBlock.cpp
+  * Output: \verbinclude class_FixedBlock.out
+  *
+  * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock
+  */
+
+namespace internal {
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+struct traits<Block<XprType, BlockRows, BlockCols, InnerPanel> > : traits<XprType>
+{
+  typedef typename traits<XprType>::Scalar Scalar;
+  typedef typename traits<XprType>::StorageKind StorageKind;
+  typedef typename traits<XprType>::XprKind XprKind;
+  typedef typename nested<XprType>::type XprTypeNested;
+  typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
+  enum{
+    MatrixRows = traits<XprType>::RowsAtCompileTime,
+    MatrixCols = traits<XprType>::ColsAtCompileTime,
+    RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows,
+    ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols,
+    MaxRowsAtCompileTime = BlockRows==0 ? 0
+                         : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime)
+                         : int(traits<XprType>::MaxRowsAtCompileTime),
+    MaxColsAtCompileTime = BlockCols==0 ? 0
+                         : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime)
+                         : int(traits<XprType>::MaxColsAtCompileTime),
+    XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0,
+    IsRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
+               : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
+               : XprTypeIsRowMajor,
+    HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),
+    InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
+    InnerStrideAtCompileTime = HasSameStorageOrderAsXprType
+                             ? int(inner_stride_at_compile_time<XprType>::ret)
+                             : int(outer_stride_at_compile_time<XprType>::ret),
+    OuterStrideAtCompileTime = HasSameStorageOrderAsXprType
+                             ? int(outer_stride_at_compile_time<XprType>::ret)
+                             : int(inner_stride_at_compile_time<XprType>::ret),
+    MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)
+                       && (InnerStrideAtCompileTime == 1)
+                        ? PacketAccessBit : 0,
+    MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,
+    FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1) ? LinearAccessBit : 0,
+    FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
+    FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
+    Flags0 = traits<XprType>::Flags & ( (HereditaryBits & ~RowMajorBit) |
+                                        DirectAccessBit |
+                                        MaskPacketAccessBit |
+                                        MaskAlignedBit),
+    Flags = Flags0 | FlagsLinearAccessBit | FlagsLvalueBit | FlagsRowMajorBit
+  };
+};
+
+template<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false,
+         bool HasDirectAccess = internal::has_direct_access<XprType>::ret> class BlockImpl_dense;
+         
+} // end namespace internal
+
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, typename StorageKind> class BlockImpl;
+
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel> class Block
+  : public BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind>
+{
+    typedef BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> Impl;
+  public:
+    //typedef typename Impl::Base Base;
+    typedef Impl Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(Block)
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)
+  
+    /** Column or Row constructor
+      */
+    inline Block(XprType& xpr, Index i) : Impl(xpr,i)
+    {
+      eigen_assert( (i>=0) && (
+          ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows())
+        ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols())));
+    }
+
+    /** Fixed-size constructor
+      */
+    inline Block(XprType& xpr, Index a_startRow, Index a_startCol)
+      : Impl(xpr, a_startRow, a_startCol)
+    {
+      EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
+      eigen_assert(a_startRow >= 0 && BlockRows >= 1 && a_startRow + BlockRows <= xpr.rows()
+             && a_startCol >= 0 && BlockCols >= 1 && a_startCol + BlockCols <= xpr.cols());
+    }
+
+    /** Dynamic-size constructor
+      */
+    inline Block(XprType& xpr,
+          Index a_startRow, Index a_startCol,
+          Index blockRows, Index blockCols)
+      : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols)
+    {
+      eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows)
+          && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols));
+      eigen_assert(a_startRow >= 0 && blockRows >= 0 && a_startRow  <= xpr.rows() - blockRows
+          && a_startCol >= 0 && blockCols >= 0 && a_startCol <= xpr.cols() - blockCols);
+    }
+};
+         
+// The generic default implementation for dense block simplu forward to the internal::BlockImpl_dense
+// that must be specialized for direct and non-direct access...
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Dense>
+  : public internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel>
+{
+    typedef internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> Impl;
+    typedef typename XprType::Index Index;
+  public:
+    typedef Impl Base;
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
+    inline BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {}
+    inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol) : Impl(xpr, a_startRow, a_startCol) {}
+    inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol, Index blockRows, Index blockCols)
+      : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols) {}
+};
+
+namespace internal {
+
+/** \internal Internal implementation of dense Blocks in the general case. */
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool HasDirectAccess> class BlockImpl_dense
+  : public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type
+{
+    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+  public:
+
+    typedef typename internal::dense_xpr_base<BlockType>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
+
+    class InnerIterator;
+
+    /** Column or Row constructor
+      */
+    inline BlockImpl_dense(XprType& xpr, Index i)
+      : m_xpr(xpr),
+        // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime,
+        // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1,
+        // all other cases are invalid.
+        // The case a 1x1 matrix seems ambiguous, but the result is the same anyway.
+        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
+        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),
+        m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
+        m_blockCols(BlockCols==1 ? 1 : xpr.cols())
+    {}
+
+    /** Fixed-size constructor
+      */
+    inline BlockImpl_dense(XprType& xpr, Index a_startRow, Index a_startCol)
+      : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),
+                    m_blockRows(BlockRows), m_blockCols(BlockCols)
+    {}
+
+    /** Dynamic-size constructor
+      */
+    inline BlockImpl_dense(XprType& xpr,
+          Index a_startRow, Index a_startCol,
+          Index blockRows, Index blockCols)
+      : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),
+                    m_blockRows(blockRows), m_blockCols(blockCols)
+    {}
+
+    inline Index rows() const { return m_blockRows.value(); }
+    inline Index cols() const { return m_blockCols.value(); }
+
+    inline Scalar& coeffRef(Index rowId, Index colId)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(XprType)
+      return m_xpr.const_cast_derived()
+               .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
+    }
+
+    inline const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return m_xpr.derived()
+               .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
+    }
+
+    EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const
+    {
+      return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value());
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(XprType)
+      return m_xpr.const_cast_derived()
+             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return m_xpr.const_cast_derived()
+             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+
+    inline const CoeffReturnType coeff(Index index) const
+    {
+      return m_xpr
+             .coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                    m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+
+    template<int LoadMode>
+    inline PacketScalar packet(Index rowId, Index colId) const
+    {
+      return m_xpr.template packet<Unaligned>
+              (rowId + m_startRow.value(), colId + m_startCol.value());
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
+    {
+      m_xpr.const_cast_derived().template writePacket<Unaligned>
+              (rowId + m_startRow.value(), colId + m_startCol.value(), val);
+    }
+
+    template<int LoadMode>
+    inline PacketScalar packet(Index index) const
+    {
+      return m_xpr.template packet<Unaligned>
+              (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+               m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& val)
+    {
+      m_xpr.const_cast_derived().template writePacket<Unaligned>
+         (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+          m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val);
+    }
+
+    #ifdef EIGEN_PARSED_BY_DOXYGEN
+    /** \sa MapBase::data() */
+    inline const Scalar* data() const;
+    inline Index innerStride() const;
+    inline Index outerStride() const;
+    #endif
+
+    const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const 
+    { 
+      return m_xpr; 
+    }
+      
+    Index startRow() const 
+    { 
+      return m_startRow.value(); 
+    }
+      
+    Index startCol() const 
+    { 
+      return m_startCol.value(); 
+    }
+
+  protected:
+
+    const typename XprType::Nested m_xpr;
+    const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
+    const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
+    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
+    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
+};
+
+/** \internal Internal implementation of dense Blocks in the direct access case.*/
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
+  : public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >
+{
+    typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+  public:
+
+    typedef MapBase<BlockType> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
+
+    /** Column or Row constructor
+      */
+    inline BlockImpl_dense(XprType& xpr, Index i)
+      : Base(internal::const_cast_ptr(&xpr.coeffRef(
+              (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0,
+              (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0)),
+             BlockRows==1 ? 1 : xpr.rows(),
+             BlockCols==1 ? 1 : xpr.cols()),
+        m_xpr(xpr)
+    {
+      init();
+    }
+
+    /** Fixed-size constructor
+      */
+    inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
+      : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol))), m_xpr(xpr)
+    {
+      init();
+    }
+
+    /** Dynamic-size constructor
+      */
+    inline BlockImpl_dense(XprType& xpr,
+          Index startRow, Index startCol,
+          Index blockRows, Index blockCols)
+      : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol)), blockRows, blockCols),
+        m_xpr(xpr)
+    {
+      init();
+    }
+
+    const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const 
+    { 
+      return m_xpr; 
+    }
+      
+    /** \sa MapBase::innerStride() */
+    inline Index innerStride() const
+    {
+      return internal::traits<BlockType>::HasSameStorageOrderAsXprType
+             ? m_xpr.innerStride()
+             : m_xpr.outerStride();
+    }
+
+    /** \sa MapBase::outerStride() */
+    inline Index outerStride() const
+    {
+      return m_outerStride;
+    }
+
+  #ifndef __SUNPRO_CC
+  // FIXME sunstudio is not friendly with the above friend...
+  // META-FIXME there is no 'friend' keyword around here. Is this obsolete?
+  protected:
+  #endif
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal used by allowAligned() */
+    inline BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols)
+      : Base(data, blockRows, blockCols), m_xpr(xpr)
+    {
+      init();
+    }
+    #endif
+
+  protected:
+    void init()
+    {
+      m_outerStride = internal::traits<BlockType>::HasSameStorageOrderAsXprType
+                    ? m_xpr.outerStride()
+                    : m_xpr.innerStride();
+    }
+
+    typename XprType::Nested m_xpr;
+    Index m_outerStride;
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BLOCK_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/BooleanRedux.h b/vendor/eigen-3.1.91/Eigen/src/Core/BooleanRedux.h
new file mode 100644
index 0000000..f6afeb0
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/BooleanRedux.h
@@ -0,0 +1,154 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ALLANDANY_H
+#define EIGEN_ALLANDANY_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Derived, int UnrollCount>
+struct all_unroller
+{
+  enum {
+    col = (UnrollCount-1) / Derived::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived::RowsAtCompileTime
+  };
+
+  static inline bool run(const Derived &mat)
+  {
+    return all_unroller<Derived, UnrollCount-1>::run(mat) && mat.coeff(row, col);
+  }
+};
+
+template<typename Derived>
+struct all_unroller<Derived, 1>
+{
+  static inline bool run(const Derived &mat) { return mat.coeff(0, 0); }
+};
+
+template<typename Derived>
+struct all_unroller<Derived, Dynamic>
+{
+  static inline bool run(const Derived &) { return false; }
+};
+
+template<typename Derived, int UnrollCount>
+struct any_unroller
+{
+  enum {
+    col = (UnrollCount-1) / Derived::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived::RowsAtCompileTime
+  };
+
+  static inline bool run(const Derived &mat)
+  {
+    return any_unroller<Derived, UnrollCount-1>::run(mat) || mat.coeff(row, col);
+  }
+};
+
+template<typename Derived>
+struct any_unroller<Derived, 1>
+{
+  static inline bool run(const Derived &mat) { return mat.coeff(0, 0); }
+};
+
+template<typename Derived>
+struct any_unroller<Derived, Dynamic>
+{
+  static inline bool run(const Derived &) { return false; }
+};
+
+} // end namespace internal
+
+/** \returns true if all coefficients are true
+  *
+  * Example: \include MatrixBase_all.cpp
+  * Output: \verbinclude MatrixBase_all.out
+  *
+  * \sa any(), Cwise::operator<()
+  */
+template<typename Derived>
+inline bool DenseBase<Derived>::all() const
+{
+  enum {
+    unroll = SizeAtCompileTime != Dynamic
+          && CoeffReadCost != Dynamic
+          && NumTraits<Scalar>::AddCost != Dynamic
+          && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT
+  };
+  if(unroll)
+    return internal::all_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());
+  else
+  {
+    for(Index j = 0; j < cols(); ++j)
+      for(Index i = 0; i < rows(); ++i)
+        if (!coeff(i, j)) return false;
+    return true;
+  }
+}
+
+/** \returns true if at least one coefficient is true
+  *
+  * \sa all()
+  */
+template<typename Derived>
+inline bool DenseBase<Derived>::any() const
+{
+  enum {
+    unroll = SizeAtCompileTime != Dynamic
+          && CoeffReadCost != Dynamic
+          && NumTraits<Scalar>::AddCost != Dynamic
+          && SizeAtCompileTime * (CoeffReadCost + NumTraits<Scalar>::AddCost) <= EIGEN_UNROLLING_LIMIT
+  };
+  if(unroll)
+    return internal::any_unroller<Derived, unroll ? int(SizeAtCompileTime) : Dynamic>::run(derived());
+  else
+  {
+    for(Index j = 0; j < cols(); ++j)
+      for(Index i = 0; i < rows(); ++i)
+        if (coeff(i, j)) return true;
+    return false;
+  }
+}
+
+/** \returns the number of coefficients which evaluate to true
+  *
+  * \sa all(), any()
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::Index DenseBase<Derived>::count() const
+{
+  return derived().template cast<bool>().template cast<Index>().sum();
+}
+
+/** \returns true is \c *this contains at least one Not A Number (NaN).
+  *
+  * \sa isFinite()
+  */
+template<typename Derived>
+inline bool DenseBase<Derived>::hasNaN() const
+{
+  return !((derived().array()==derived().array()).all());
+}
+
+/** \returns true if \c *this contains only finite numbers, i.e., no NaN and no +/-INF values.
+  *
+  * \sa hasNaN()
+  */
+template<typename Derived>
+inline bool DenseBase<Derived>::isFinite() const
+{
+  return !((derived()-derived()).hasNaN());
+}
+    
+} // end namespace Eigen
+
+#endif // EIGEN_ALLANDANY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/CMakeLists.txt
new file mode 100644
index 0000000..2346fc2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CMakeLists.txt
@@ -0,0 +1,10 @@
+FILE(GLOB Eigen_Core_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core COMPONENT Devel
+  )
+
+ADD_SUBDIRECTORY(products)
+ADD_SUBDIRECTORY(util)
+ADD_SUBDIRECTORY(arch)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CommaInitializer.h b/vendor/eigen-3.1.91/Eigen/src/Core/CommaInitializer.h
new file mode 100644
index 0000000..a96867a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CommaInitializer.h
@@ -0,0 +1,143 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMMAINITIALIZER_H
+#define EIGEN_COMMAINITIALIZER_H
+
+namespace Eigen { 
+
+/** \class CommaInitializer
+  * \ingroup Core_Module
+  *
+  * \brief Helper class used by the comma initializer operator
+  *
+  * This class is internally used to implement the comma initializer feature. It is
+  * the return type of MatrixBase::operator<<, and most of the time this is the only
+  * way it is used.
+  *
+  * \sa \ref MatrixBaseCommaInitRef "MatrixBase::operator<<", CommaInitializer::finished()
+  */
+template<typename XprType>
+struct CommaInitializer
+{
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::Index Index;
+
+  inline CommaInitializer(XprType& xpr, const Scalar& s)
+    : m_xpr(xpr), m_row(0), m_col(1), m_currentBlockRows(1)
+  {
+    m_xpr.coeffRef(0,0) = s;
+  }
+
+  template<typename OtherDerived>
+  inline CommaInitializer(XprType& xpr, const DenseBase<OtherDerived>& other)
+    : m_xpr(xpr), m_row(0), m_col(other.cols()), m_currentBlockRows(other.rows())
+  {
+    m_xpr.block(0, 0, other.rows(), other.cols()) = other;
+  }
+
+  /* inserts a scalar value in the target matrix */
+  CommaInitializer& operator,(const Scalar& s)
+  {
+    if (m_col==m_xpr.cols())
+    {
+      m_row+=m_currentBlockRows;
+      m_col = 0;
+      m_currentBlockRows = 1;
+      eigen_assert(m_row<m_xpr.rows()
+        && "Too many rows passed to comma initializer (operator<<)");
+    }
+    eigen_assert(m_col<m_xpr.cols()
+      && "Too many coefficients passed to comma initializer (operator<<)");
+    eigen_assert(m_currentBlockRows==1);
+    m_xpr.coeffRef(m_row, m_col++) = s;
+    return *this;
+  }
+
+  /* inserts a matrix expression in the target matrix */
+  template<typename OtherDerived>
+  CommaInitializer& operator,(const DenseBase<OtherDerived>& other)
+  {
+    if(other.cols()==0 || other.rows()==0)
+      return *this;
+    if (m_col==m_xpr.cols())
+    {
+      m_row+=m_currentBlockRows;
+      m_col = 0;
+      m_currentBlockRows = other.rows();
+      eigen_assert(m_row+m_currentBlockRows<=m_xpr.rows()
+        && "Too many rows passed to comma initializer (operator<<)");
+    }
+    eigen_assert(m_col<m_xpr.cols()
+      && "Too many coefficients passed to comma initializer (operator<<)");
+    eigen_assert(m_currentBlockRows==other.rows());
+    if (OtherDerived::SizeAtCompileTime != Dynamic)
+      m_xpr.template block<OtherDerived::RowsAtCompileTime != Dynamic ? OtherDerived::RowsAtCompileTime : 1,
+                              OtherDerived::ColsAtCompileTime != Dynamic ? OtherDerived::ColsAtCompileTime : 1>
+                    (m_row, m_col) = other;
+    else
+      m_xpr.block(m_row, m_col, other.rows(), other.cols()) = other;
+    m_col += other.cols();
+    return *this;
+  }
+
+  inline ~CommaInitializer()
+  {
+    eigen_assert((m_row+m_currentBlockRows) == m_xpr.rows()
+         && m_col == m_xpr.cols()
+         && "Too few coefficients passed to comma initializer (operator<<)");
+  }
+
+  /** \returns the built matrix once all its coefficients have been set.
+    * Calling finished is 100% optional. Its purpose is to write expressions
+    * like this:
+    * \code
+    * quaternion.fromRotationMatrix((Matrix3f() << axis0, axis1, axis2).finished());
+    * \endcode
+    */
+  inline XprType& finished() { return m_xpr; }
+
+  XprType& m_xpr;   // target expression
+  Index m_row;              // current row id
+  Index m_col;              // current col id
+  Index m_currentBlockRows; // current block height
+};
+
+/** \anchor MatrixBaseCommaInitRef
+  * Convenient operator to set the coefficients of a matrix.
+  *
+  * The coefficients must be provided in a row major order and exactly match
+  * the size of the matrix. Otherwise an assertion is raised.
+  *
+  * Example: \include MatrixBase_set.cpp
+  * Output: \verbinclude MatrixBase_set.out
+  * 
+  * \note According the c++ standard, the argument expressions of this comma initializer are evaluated in arbitrary order.
+  *
+  * \sa CommaInitializer::finished(), class CommaInitializer
+  */
+template<typename Derived>
+inline CommaInitializer<Derived> DenseBase<Derived>::operator<< (const Scalar& s)
+{
+  return CommaInitializer<Derived>(*static_cast<Derived*>(this), s);
+}
+
+/** \sa operator<<(const Scalar&) */
+template<typename Derived>
+template<typename OtherDerived>
+inline CommaInitializer<Derived>
+DenseBase<Derived>::operator<<(const DenseBase<OtherDerived>& other)
+{
+  return CommaInitializer<Derived>(*static_cast<Derived *>(this), other);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMMAINITIALIZER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CoreEvaluators.h b/vendor/eigen-3.1.91/Eigen/src/Core/CoreEvaluators.h
new file mode 100644
index 0000000..272027c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CoreEvaluators.h
@@ -0,0 +1,1311 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2011-2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#ifndef EIGEN_COREEVALUATORS_H
+#define EIGEN_COREEVALUATORS_H
+
+namespace Eigen {
+
+namespace internal {
+
+// evaluator_traits<T> contains traits for evaluator_impl<T> 
+
+template<typename T>
+struct evaluator_traits
+{
+  // 1 if evaluator_impl<T>::evalTo() exists
+  // 0 if evaluator_impl<T> allows coefficient-based access
+  static const int HasEvalTo = 0;
+
+  // 1 if assignment A = B assumes aliasing when B is of type T and thus B needs to be evaluated into a
+  // temporary; 0 if not.
+  static const int AssumeAliasing = 0;
+};
+
+// expression class for evaluating nested expression to a temporary
+ 
+template<typename ArgType>
+class EvalToTemp;
+
+// evaluator<T>::type is type of evaluator for T
+// evaluator<T>::nestedType is type of evaluator if T is nested inside another evaluator
+ 
+template<typename T>
+struct evaluator_impl 
+{ };
+ 
+template<typename T, int Nested = evaluator_traits<T>::HasEvalTo>
+struct evaluator_nested_type;
+
+template<typename T>
+struct evaluator_nested_type<T, 0>
+{
+  typedef evaluator_impl<T> type;
+};
+
+template<typename T>
+struct evaluator_nested_type<T, 1>
+{
+  typedef evaluator_impl<EvalToTemp<T> > type;
+};
+
+template<typename T>
+struct evaluator
+{
+  typedef evaluator_impl<T> type;
+  typedef typename evaluator_nested_type<T>::type nestedType;
+};
+
+// TODO: Think about const-correctness
+
+template<typename T>
+struct evaluator<const T>
+  : evaluator<T>
+{ };
+
+// ---------- base class for all writable evaluators ----------
+
+template<typename ExpressionType>
+struct evaluator_impl_base
+{
+  typedef typename ExpressionType::Index Index;
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    derived().coeffRef(row, col) = other.coeff(row, col);
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeffByOuterInner(Index outer, Index inner, const OtherEvaluatorType& other)
+  {
+    Index row = rowIndexByOuterInner(outer, inner); 
+    Index col = colIndexByOuterInner(outer, inner); 
+    derived().copyCoeff(row, col, other);
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index index, const OtherEvaluatorType& other)
+  {
+    derived().coeffRef(index) = other.coeff(index);
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    derived().template writePacket<StoreMode>(row, col, 
+      other.template packet<LoadMode>(row, col));
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacketByOuterInner(Index outer, Index inner, const OtherEvaluatorType& other)
+  {
+    Index row = rowIndexByOuterInner(outer, inner); 
+    Index col = colIndexByOuterInner(outer, inner); 
+    derived().template copyPacket<StoreMode, LoadMode>(row, col, other);
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index index, const OtherEvaluatorType& other)
+  {
+    derived().template writePacket<StoreMode>(index, 
+      other.template packet<LoadMode>(index));
+  }
+
+  Index rowIndexByOuterInner(Index outer, Index inner) const
+  {
+    return int(ExpressionType::RowsAtCompileTime) == 1 ? 0
+      : int(ExpressionType::ColsAtCompileTime) == 1 ? inner
+      : int(ExpressionType::Flags)&RowMajorBit ? outer
+      : inner;
+  }
+
+  Index colIndexByOuterInner(Index outer, Index inner) const
+  {
+    return int(ExpressionType::ColsAtCompileTime) == 1 ? 0
+      : int(ExpressionType::RowsAtCompileTime) == 1 ? inner
+      : int(ExpressionType::Flags)&RowMajorBit ? inner
+      : outer;
+  }
+
+  evaluator_impl<ExpressionType>& derived() 
+  {
+    return *static_cast<evaluator_impl<ExpressionType>*>(this); 
+  }
+};
+
+// -------------------- Matrix and Array --------------------
+//
+// evaluator_impl<PlainObjectBase> is a common base class for the
+// Matrix and Array evaluators.
+
+template<typename Derived>
+struct evaluator_impl<PlainObjectBase<Derived> >
+  : evaluator_impl_base<Derived>
+{
+  typedef PlainObjectBase<Derived> PlainObjectType;
+
+  enum {
+    IsRowMajor = PlainObjectType::IsRowMajor,
+    IsVectorAtCompileTime = PlainObjectType::IsVectorAtCompileTime,
+    RowsAtCompileTime = PlainObjectType::RowsAtCompileTime,
+    ColsAtCompileTime = PlainObjectType::ColsAtCompileTime
+  };
+
+  evaluator_impl(const PlainObjectType& m) 
+    : m_data(m.data()), m_outerStride(IsVectorAtCompileTime ? 0 : m.outerStride()) 
+  { }
+
+  typedef typename PlainObjectType::Index Index;
+  typedef typename PlainObjectType::Scalar Scalar;
+  typedef typename PlainObjectType::CoeffReturnType CoeffReturnType;
+  typedef typename PlainObjectType::PacketScalar PacketScalar;
+  typedef typename PlainObjectType::PacketReturnType PacketReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    if (IsRowMajor)
+      return m_data[row * m_outerStride.value() + col];
+    else
+      return m_data[row + col * m_outerStride.value()];
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_data[index];
+  }
+
+  Scalar& coeffRef(Index row, Index col)
+  {
+    if (IsRowMajor)
+      return const_cast<Scalar*>(m_data)[row * m_outerStride.value() + col];
+    else
+      return const_cast<Scalar*>(m_data)[row + col * m_outerStride.value()];
+  }
+
+  Scalar& coeffRef(Index index)
+  {
+    return const_cast<Scalar*>(m_data)[index];
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index row, Index col) const
+  {
+    if (IsRowMajor)
+      return ploadt<PacketScalar, LoadMode>(m_data + row * m_outerStride.value() + col);
+    else
+      return ploadt<PacketScalar, LoadMode>(m_data + row + col * m_outerStride.value());
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index index) const
+  {
+    return ploadt<PacketScalar, LoadMode>(m_data + index);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x)
+  {
+    if (IsRowMajor)
+      return pstoret<Scalar, PacketScalar, StoreMode>
+	            (const_cast<Scalar*>(m_data) + row * m_outerStride.value() + col, x);
+    else
+      return pstoret<Scalar, PacketScalar, StoreMode>
+                    (const_cast<Scalar*>(m_data) + row + col * m_outerStride.value(), x);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x)
+  {
+    return pstoret<Scalar, PacketScalar, StoreMode>(const_cast<Scalar*>(m_data) + index, x);
+  }
+
+protected:
+  const Scalar *m_data;
+
+  // We do not need to know the outer stride for vectors
+  variable_if_dynamic<Index, IsVectorAtCompileTime ? 0 
+		             : int(IsRowMajor) ? ColsAtCompileTime 
+		             : RowsAtCompileTime> m_outerStride;
+};
+
+template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+struct evaluator_impl<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
+  : evaluator_impl<PlainObjectBase<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
+{
+  typedef Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
+
+  evaluator_impl(const XprType& m) 
+    : evaluator_impl<PlainObjectBase<XprType> >(m) 
+  { }
+};
+
+template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+struct evaluator_impl<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
+  : evaluator_impl<PlainObjectBase<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> > >
+{
+  typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> XprType;
+
+  evaluator_impl(const XprType& m) 
+    : evaluator_impl<PlainObjectBase<XprType> >(m) 
+  { }
+};
+
+// -------------------- EvalToTemp --------------------
+
+template<typename ArgType>
+struct traits<EvalToTemp<ArgType> >
+  : public traits<ArgType>
+{ };
+
+template<typename ArgType>
+class EvalToTemp
+  : public dense_xpr_base<EvalToTemp<ArgType> >::type
+{
+ public:
+ 
+  typedef typename dense_xpr_base<EvalToTemp>::type Base;
+  EIGEN_GENERIC_PUBLIC_INTERFACE(EvalToTemp)
+ 
+  EvalToTemp(const ArgType& arg)
+    : m_arg(arg)
+  { }
+ 
+  const ArgType& arg() const
+  {
+    return m_arg;
+  }
+
+  Index rows() const 
+  {
+    return m_arg.rows();
+  }
+
+  Index cols() const 
+  {
+    return m_arg.cols();
+  }
+
+ private:
+  const ArgType& m_arg;
+};
+ 
+template<typename ArgType>
+struct evaluator_impl<EvalToTemp<ArgType> >
+{
+  typedef EvalToTemp<ArgType> XprType;
+  typedef typename ArgType::PlainObject PlainObject;
+
+  evaluator_impl(const XprType& xpr) 
+    : m_result(xpr.rows(), xpr.cols()), m_resultImpl(m_result)
+  { 
+    copy_using_evaluator_without_resizing(m_result, xpr.arg());
+  }
+
+  // This constructor is used when nesting an EvalTo evaluator in another evaluator
+  evaluator_impl(const ArgType& arg) 
+    : m_result(arg.rows(), arg.cols()), m_resultImpl(m_result)
+  { 
+    copy_using_evaluator_without_resizing(m_result, arg);
+  }
+
+  typedef typename PlainObject::Index Index;
+  typedef typename PlainObject::Scalar Scalar;
+  typedef typename PlainObject::CoeffReturnType CoeffReturnType;
+  typedef typename PlainObject::PacketScalar PacketScalar;
+  typedef typename PlainObject::PacketReturnType PacketReturnType;
+
+  // All other functions are forwarded to m_resultImpl
+
+  CoeffReturnType coeff(Index row, Index col) const 
+  { 
+    return m_resultImpl.coeff(row, col); 
+  }
+  
+  CoeffReturnType coeff(Index index) const 
+  { 
+    return m_resultImpl.coeff(index); 
+  }
+  
+  Scalar& coeffRef(Index row, Index col) 
+  { 
+    return m_resultImpl.coeffRef(row, col); 
+  }
+  
+  Scalar& coeffRef(Index index) 
+  { 
+    return m_resultImpl.coeffRef(index); 
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index row, Index col) const
+  {
+    return m_resultImpl.template packet<LoadMode>(row, col);
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index index) const
+  {
+    return m_resultImpl.packet<LoadMode>(index);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x)
+  {
+    m_resultImpl.template writePacket<StoreMode>(row, col, x);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x)
+  {
+    m_resultImpl.template writePacket<StoreMode>(index, x);
+  }
+
+protected:
+  PlainObject m_result;
+  typename evaluator<PlainObject>::nestedType m_resultImpl;
+};
+
+// -------------------- Transpose --------------------
+
+template<typename ArgType>
+struct evaluator_impl<Transpose<ArgType> >
+  : evaluator_impl_base<Transpose<ArgType> >
+{
+  typedef Transpose<ArgType> XprType;
+
+  evaluator_impl(const XprType& t) : m_argImpl(t.nestedExpression()) {}
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_argImpl.coeff(col, row);
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_argImpl.coeff(index);
+  }
+
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_argImpl.coeffRef(col, row);
+  }
+
+  typename XprType::Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(index);
+  }
+
+  template<int LoadMode>
+  PacketReturnType packet(Index row, Index col) const
+  {
+    return m_argImpl.template packet<LoadMode>(col, row);
+  }
+
+  template<int LoadMode>
+  PacketReturnType packet(Index index) const
+  {
+    return m_argImpl.template packet<LoadMode>(index);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<StoreMode>(col, row, x);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<StoreMode>(index, x);
+  }
+
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+};
+
+// -------------------- CwiseNullaryOp --------------------
+
+template<typename NullaryOp, typename PlainObjectType>
+struct evaluator_impl<CwiseNullaryOp<NullaryOp,PlainObjectType> >
+{
+  typedef CwiseNullaryOp<NullaryOp,PlainObjectType> XprType;
+
+  evaluator_impl(const XprType& n) 
+    : m_functor(n.functor()) 
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_functor(row, col);
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_functor(index);
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index row, Index col) const
+  {
+    return m_functor.packetOp(row, col);
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index index) const
+  {
+    return m_functor.packetOp(index);
+  }
+
+protected:
+  const NullaryOp m_functor;
+};
+
+// -------------------- CwiseUnaryOp --------------------
+
+template<typename UnaryOp, typename ArgType>
+struct evaluator_impl<CwiseUnaryOp<UnaryOp, ArgType> >
+{
+  typedef CwiseUnaryOp<UnaryOp, ArgType> XprType;
+
+  evaluator_impl(const XprType& op) 
+    : m_functor(op.functor()), 
+      m_argImpl(op.nestedExpression()) 
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_functor(m_argImpl.coeff(row, col));
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_functor(m_argImpl.coeff(index));
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index row, Index col) const
+  {
+    return m_functor.packetOp(m_argImpl.template packet<LoadMode>(row, col));
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index index) const
+  {
+    return m_functor.packetOp(m_argImpl.template packet<LoadMode>(index));
+  }
+
+protected:
+  const UnaryOp m_functor;
+  typename evaluator<ArgType>::nestedType m_argImpl;
+};
+
+// -------------------- CwiseBinaryOp --------------------
+
+template<typename BinaryOp, typename Lhs, typename Rhs>
+struct evaluator_impl<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
+{
+  typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> XprType;
+
+  evaluator_impl(const XprType& xpr) 
+    : m_functor(xpr.functor()),
+      m_lhsImpl(xpr.lhs()), 
+      m_rhsImpl(xpr.rhs())  
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_functor(m_lhsImpl.coeff(row, col), m_rhsImpl.coeff(row, col));
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_functor(m_lhsImpl.coeff(index), m_rhsImpl.coeff(index));
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index row, Index col) const
+  {
+    return m_functor.packetOp(m_lhsImpl.template packet<LoadMode>(row, col),
+			      m_rhsImpl.template packet<LoadMode>(row, col));
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index index) const
+  {
+    return m_functor.packetOp(m_lhsImpl.template packet<LoadMode>(index),
+			      m_rhsImpl.template packet<LoadMode>(index));
+  }
+
+protected:
+  const BinaryOp m_functor;
+  typename evaluator<Lhs>::nestedType m_lhsImpl;
+  typename evaluator<Rhs>::nestedType m_rhsImpl;
+};
+
+// -------------------- CwiseUnaryView --------------------
+
+template<typename UnaryOp, typename ArgType>
+struct evaluator_impl<CwiseUnaryView<UnaryOp, ArgType> >
+  : evaluator_impl_base<CwiseUnaryView<UnaryOp, ArgType> >
+{
+  typedef CwiseUnaryView<UnaryOp, ArgType> XprType;
+
+  evaluator_impl(const XprType& op) 
+    : m_unaryOp(op.functor()), 
+      m_argImpl(op.nestedExpression()) 
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_unaryOp(m_argImpl.coeff(row, col));
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_unaryOp(m_argImpl.coeff(index));
+  }
+
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_unaryOp(m_argImpl.coeffRef(row, col));
+  }
+
+  Scalar& coeffRef(Index index)
+  {
+    return m_unaryOp(m_argImpl.coeffRef(index));
+  }
+
+protected:
+  const UnaryOp m_unaryOp;
+  typename evaluator<ArgType>::nestedType m_argImpl;
+};
+
+// -------------------- Map --------------------
+
+template<typename Derived, int AccessorsType>
+struct evaluator_impl<MapBase<Derived, AccessorsType> >
+  : evaluator_impl_base<Derived>
+{
+  typedef MapBase<Derived, AccessorsType> MapType;
+  typedef Derived XprType;
+
+  typedef typename XprType::PointerType PointerType;
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+  
+  evaluator_impl(const XprType& map) 
+    : m_data(const_cast<PointerType>(map.data())),  
+      m_rowStride(map.rowStride()),
+      m_colStride(map.colStride())
+  { }
+ 
+  enum {
+    RowsAtCompileTime = XprType::RowsAtCompileTime
+  };
+ 
+  CoeffReturnType coeff(Index row, Index col) const 
+  { 
+    return m_data[col * m_colStride + row * m_rowStride];
+  }
+  
+  CoeffReturnType coeff(Index index) const 
+  { 
+    return coeff(RowsAtCompileTime == 1 ? 0 : index,
+		 RowsAtCompileTime == 1 ? index : 0);
+  }
+
+  Scalar& coeffRef(Index row, Index col) 
+  { 
+    return m_data[col * m_colStride + row * m_rowStride];
+  }
+  
+  Scalar& coeffRef(Index index) 
+  { 
+    return coeffRef(RowsAtCompileTime == 1 ? 0 : index,
+		    RowsAtCompileTime == 1 ? index : 0);
+  }
+ 
+  template<int LoadMode> 
+  PacketReturnType packet(Index row, Index col) const 
+  { 
+    PointerType ptr = m_data + row * m_rowStride + col * m_colStride;
+    return internal::ploadt<PacketScalar, LoadMode>(ptr);
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index index) const 
+  { 
+    return packet<LoadMode>(RowsAtCompileTime == 1 ? 0 : index,
+			    RowsAtCompileTime == 1 ? index : 0);
+  }
+  
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x) 
+  { 
+    PointerType ptr = m_data + row * m_rowStride + col * m_colStride;
+    return internal::pstoret<Scalar, PacketScalar, StoreMode>(ptr, x);
+  }
+  
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x) 
+  { 
+    return writePacket<StoreMode>(RowsAtCompileTime == 1 ? 0 : index,
+				  RowsAtCompileTime == 1 ? index : 0,
+				  x);
+  }
+ 
+protected:
+  PointerType m_data;
+  int m_rowStride;
+  int m_colStride;
+};
+
+template<typename PlainObjectType, int MapOptions, typename StrideType> 
+struct evaluator_impl<Map<PlainObjectType, MapOptions, StrideType> >
+  : public evaluator_impl<MapBase<Map<PlainObjectType, MapOptions, StrideType> > >
+{
+  typedef Map<PlainObjectType, MapOptions, StrideType> XprType;
+
+  evaluator_impl(const XprType& map) 
+    : evaluator_impl<MapBase<XprType> >(map) 
+  { }
+};
+
+// -------------------- Block --------------------
+
+template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel,
+         bool HasDirectAccess = internal::has_direct_access<ArgType>::ret> struct block_evaluator;
+         
+template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel> 
+struct evaluator_impl<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
+  : block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel>
+{
+  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
+  typedef block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel> block_evaluator_type;
+  evaluator_impl(const XprType& block) : block_evaluator_type(block) {}
+};
+
+template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel>
+struct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /*HasDirectAccess*/ false>
+  : evaluator_impl_base<Block<ArgType, BlockRows, BlockCols, InnerPanel> >
+{
+  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
+
+  block_evaluator(const XprType& block) 
+    : m_argImpl(block.nestedExpression()), 
+      m_startRow(block.startRow()), 
+      m_startCol(block.startCol()) 
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+
+  enum {
+    RowsAtCompileTime = XprType::RowsAtCompileTime
+  };
+ 
+  CoeffReturnType coeff(Index row, Index col) const 
+  { 
+    return m_argImpl.coeff(m_startRow.value() + row, m_startCol.value() + col); 
+  }
+  
+  CoeffReturnType coeff(Index index) const 
+  { 
+    return coeff(RowsAtCompileTime == 1 ? 0 : index,
+		 RowsAtCompileTime == 1 ? index : 0);
+  }
+
+  Scalar& coeffRef(Index row, Index col) 
+  { 
+    return m_argImpl.coeffRef(m_startRow.value() + row, m_startCol.value() + col); 
+  }
+  
+  Scalar& coeffRef(Index index) 
+  { 
+    return coeffRef(RowsAtCompileTime == 1 ? 0 : index,
+		    RowsAtCompileTime == 1 ? index : 0);
+  }
+ 
+  template<int LoadMode> 
+  PacketReturnType packet(Index row, Index col) const 
+  { 
+    return m_argImpl.template packet<LoadMode>(m_startRow.value() + row, m_startCol.value() + col); 
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index index) const 
+  { 
+    return packet<LoadMode>(RowsAtCompileTime == 1 ? 0 : index,
+			    RowsAtCompileTime == 1 ? index : 0);
+  }
+  
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x) 
+  { 
+    return m_argImpl.template writePacket<StoreMode>(m_startRow.value() + row, m_startCol.value() + col, x); 
+  }
+  
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x) 
+  { 
+    return writePacket<StoreMode>(RowsAtCompileTime == 1 ? 0 : index,
+				  RowsAtCompileTime == 1 ? index : 0,
+				  x);
+  }
+ 
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+  const variable_if_dynamic<Index, ArgType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
+  const variable_if_dynamic<Index, ArgType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
+};
+
+// TODO: This evaluator does not actually use the child evaluator; 
+// all action is via the data() as returned by the Block expression.
+
+template<typename ArgType, int BlockRows, int BlockCols, bool InnerPanel> 
+struct block_evaluator<ArgType, BlockRows, BlockCols, InnerPanel, /* HasDirectAccess */ true>
+  : evaluator_impl<MapBase<Block<ArgType, BlockRows, BlockCols, InnerPanel> > >
+{
+  typedef Block<ArgType, BlockRows, BlockCols, InnerPanel> XprType;
+
+  block_evaluator(const XprType& block) 
+    : evaluator_impl<MapBase<XprType> >(block) 
+  { }
+};
+
+
+// -------------------- Select --------------------
+
+template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+struct evaluator_impl<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
+{
+  typedef Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> XprType;
+
+  evaluator_impl(const XprType& select) 
+    : m_conditionImpl(select.conditionMatrix()),
+      m_thenImpl(select.thenMatrix()),
+      m_elseImpl(select.elseMatrix())
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    if (m_conditionImpl.coeff(row, col))
+      return m_thenImpl.coeff(row, col);
+    else
+      return m_elseImpl.coeff(row, col);
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    if (m_conditionImpl.coeff(index))
+      return m_thenImpl.coeff(index);
+    else
+      return m_elseImpl.coeff(index);
+  }
+ 
+protected:
+  typename evaluator<ConditionMatrixType>::nestedType m_conditionImpl;
+  typename evaluator<ThenMatrixType>::nestedType m_thenImpl;
+  typename evaluator<ElseMatrixType>::nestedType m_elseImpl;
+};
+
+
+// -------------------- Replicate --------------------
+
+template<typename ArgType, int RowFactor, int ColFactor> 
+struct evaluator_impl<Replicate<ArgType, RowFactor, ColFactor> >
+{
+  typedef Replicate<ArgType, RowFactor, ColFactor> XprType;
+
+  evaluator_impl(const XprType& replicate) 
+    : m_argImpl(replicate.nestedExpression()),
+      m_rows(replicate.nestedExpression().rows()),
+      m_cols(replicate.nestedExpression().cols())
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    // try to avoid using modulo; this is a pure optimization strategy
+    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
+                           : RowFactor==1 ? row
+                           : row % m_rows.value();
+    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
+                           : ColFactor==1 ? col
+                           : col % m_cols.value();
+    
+    return m_argImpl.coeff(actual_row, actual_col);
+  }
+
+  template<int LoadMode>
+  PacketReturnType packet(Index row, Index col) const
+  {
+    const Index actual_row = internal::traits<XprType>::RowsAtCompileTime==1 ? 0
+                           : RowFactor==1 ? row
+                           : row % m_rows.value();
+    const Index actual_col = internal::traits<XprType>::ColsAtCompileTime==1 ? 0
+                           : ColFactor==1 ? col
+                           : col % m_cols.value();
+
+    return m_argImpl.template packet<LoadMode>(actual_row, actual_col);
+  }
+ 
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+  const variable_if_dynamic<Index, XprType::RowsAtCompileTime> m_rows;
+  const variable_if_dynamic<Index, XprType::ColsAtCompileTime> m_cols;
+};
+
+
+// -------------------- PartialReduxExpr --------------------
+//
+// This is a wrapper around the expression object. 
+// TODO: Find out how to write a proper evaluator without duplicating
+//       the row() and col() member functions.
+
+template< typename ArgType, typename MemberOp, int Direction>
+struct evaluator_impl<PartialReduxExpr<ArgType, MemberOp, Direction> >
+{
+  typedef PartialReduxExpr<ArgType, MemberOp, Direction> XprType;
+
+  evaluator_impl(const XprType expr)
+    : m_expr(expr)
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+ 
+  CoeffReturnType coeff(Index row, Index col) const 
+  { 
+    return m_expr.coeff(row, col);
+  }
+  
+  CoeffReturnType coeff(Index index) const 
+  { 
+    return m_expr.coeff(index);
+  }
+
+protected:
+  const XprType m_expr;
+};
+
+
+// -------------------- MatrixWrapper and ArrayWrapper --------------------
+//
+// evaluator_impl_wrapper_base<T> is a common base class for the
+// MatrixWrapper and ArrayWrapper evaluators.
+
+template<typename XprType>
+struct evaluator_impl_wrapper_base
+  : evaluator_impl_base<XprType>
+{
+  typedef typename remove_all<typename XprType::NestedExpressionType>::type ArgType;
+
+  evaluator_impl_wrapper_base(const ArgType& arg) : m_argImpl(arg) {}
+
+  typedef typename ArgType::Index Index;
+  typedef typename ArgType::Scalar Scalar;
+  typedef typename ArgType::CoeffReturnType CoeffReturnType;
+  typedef typename ArgType::PacketScalar PacketScalar;
+  typedef typename ArgType::PacketReturnType PacketReturnType;
+
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_argImpl.coeff(row, col);
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_argImpl.coeff(index);
+  }
+
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_argImpl.coeffRef(row, col);
+  }
+
+  Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(index);
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index row, Index col) const
+  {
+    return m_argImpl.template packet<LoadMode>(row, col);
+  }
+
+  template<int LoadMode> 
+  PacketReturnType packet(Index index) const
+  {
+    return m_argImpl.template packet<LoadMode>(index);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index row, Index col, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<StoreMode>(row, col, x);
+  }
+
+  template<int StoreMode> 
+  void writePacket(Index index, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<StoreMode>(index, x);
+  }
+
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+};
+
+template<typename ArgType>
+struct evaluator_impl<MatrixWrapper<ArgType> >
+  : evaluator_impl_wrapper_base<MatrixWrapper<ArgType> >
+{
+  typedef MatrixWrapper<ArgType> XprType;
+
+  evaluator_impl(const XprType& wrapper) 
+    : evaluator_impl_wrapper_base<MatrixWrapper<ArgType> >(wrapper.nestedExpression())
+  { }
+};
+
+template<typename ArgType>
+struct evaluator_impl<ArrayWrapper<ArgType> >
+  : evaluator_impl_wrapper_base<ArrayWrapper<ArgType> >
+{
+  typedef ArrayWrapper<ArgType> XprType;
+
+  evaluator_impl(const XprType& wrapper) 
+    : evaluator_impl_wrapper_base<ArrayWrapper<ArgType> >(wrapper.nestedExpression())
+  { }
+};
+
+
+// -------------------- Reverse --------------------
+
+// defined in Reverse.h:
+template<typename PacketScalar, bool ReversePacket> struct reverse_packet_cond;
+
+template<typename ArgType, int Direction>
+struct evaluator_impl<Reverse<ArgType, Direction> >
+  : evaluator_impl_base<Reverse<ArgType, Direction> >
+{
+  typedef Reverse<ArgType, Direction> XprType;
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+
+  enum {
+    PacketSize = internal::packet_traits<Scalar>::size,
+    IsRowMajor = XprType::IsRowMajor,
+    IsColMajor = !IsRowMajor,
+    ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),
+    ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
+    OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
+    OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1,
+    ReversePacket = (Direction == BothDirections)
+                    || ((Direction == Vertical)   && IsColMajor)
+                    || ((Direction == Horizontal) && IsRowMajor)
+  };
+  typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;
+
+  evaluator_impl(const XprType& reverse) 
+    : m_argImpl(reverse.nestedExpression()),
+      m_rows(ReverseRow ? reverse.nestedExpression().rows() : 0),
+      m_cols(ReverseCol ? reverse.nestedExpression().cols() : 0)
+  { }
+ 
+  CoeffReturnType coeff(Index row, Index col) const
+  {
+    return m_argImpl.coeff(ReverseRow ? m_rows.value() - row - 1 : row,
+			   ReverseCol ? m_cols.value() - col - 1 : col);
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_argImpl.coeff(m_rows.value() * m_cols.value() - index - 1);
+  }
+
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_argImpl.coeffRef(ReverseRow ? m_rows.value() - row - 1 : row,
+			      ReverseCol ? m_cols.value() - col - 1 : col);
+  }
+
+  Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(m_rows.value() * m_cols.value() - index - 1);
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index row, Index col) const
+  {
+    return reverse_packet::run(m_argImpl.template packet<LoadMode>(
+                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
+                                  ReverseCol ? m_cols.value() - col - OffsetCol : col));
+  }
+
+  template<int LoadMode>
+  PacketScalar packet(Index index) const
+  {
+    return preverse(m_argImpl.template packet<LoadMode>(m_rows.value() * m_cols.value() - index - PacketSize));
+  }
+
+  template<int LoadMode>
+  void writePacket(Index row, Index col, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<LoadMode>(
+                                  ReverseRow ? m_rows.value() - row - OffsetRow : row,
+                                  ReverseCol ? m_cols.value() - col - OffsetCol : col,
+                                  reverse_packet::run(x));
+  }
+
+  template<int LoadMode>
+  void writePacket(Index index, const PacketScalar& x)
+  {
+    m_argImpl.template writePacket<LoadMode>
+      (m_rows.value() * m_cols.value() - index - PacketSize, preverse(x));
+  }
+ 
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+
+  // If we do not reverse rows, then we do not need to know the number of rows; same for columns
+  const variable_if_dynamic<Index, ReverseRow ? ArgType::RowsAtCompileTime : 0> m_rows;
+  const variable_if_dynamic<Index, ReverseCol ? ArgType::ColsAtCompileTime : 0> m_cols;
+};
+
+
+// -------------------- Diagonal --------------------
+
+template<typename ArgType, int DiagIndex>
+struct evaluator_impl<Diagonal<ArgType, DiagIndex> >
+  : evaluator_impl_base<Diagonal<ArgType, DiagIndex> >
+{
+  typedef Diagonal<ArgType, DiagIndex> XprType;
+
+  evaluator_impl(const XprType& diagonal) 
+    : m_argImpl(diagonal.nestedExpression()),
+      m_index(diagonal.index())
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+
+  CoeffReturnType coeff(Index row, Index) const
+  {
+    return m_argImpl.coeff(row + rowOffset(), row + colOffset());
+  }
+
+  CoeffReturnType coeff(Index index) const
+  {
+    return m_argImpl.coeff(index + rowOffset(), index + colOffset());
+  }
+
+  Scalar& coeffRef(Index row, Index)
+  {
+    return m_argImpl.coeffRef(row + rowOffset(), row + colOffset());
+  }
+
+  Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(index + rowOffset(), index + colOffset());
+  }
+
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+  const internal::variable_if_dynamicindex<Index, XprType::DiagIndex> m_index;
+
+private:
+  EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value() > 0 ? 0 : -m_index.value(); }
+  EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value() > 0 ? m_index.value() : 0; }
+};
+
+
+// ---------- SwapWrapper ----------
+
+template<typename ArgType>
+struct evaluator_impl<SwapWrapper<ArgType> >
+  : evaluator_impl_base<SwapWrapper<ArgType> >
+{
+  typedef SwapWrapper<ArgType> XprType;
+
+  evaluator_impl(const XprType& swapWrapper) 
+    : m_argImpl(swapWrapper.expression())
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::Packet Packet;
+
+  // This function and the next one are needed by assign to correctly align loads/stores
+  // TODO make Assign use .data()
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_argImpl.coeffRef(row, col);
+  }
+  
+  inline Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(index);
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    OtherEvaluatorType& nonconst_other = const_cast<OtherEvaluatorType&>(other);
+    Scalar tmp = m_argImpl.coeff(row, col);
+    m_argImpl.coeffRef(row, col) = nonconst_other.coeff(row, col);
+    nonconst_other.coeffRef(row, col) = tmp;
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index index, const OtherEvaluatorType& other)
+  {
+    OtherEvaluatorType& nonconst_other = const_cast<OtherEvaluatorType&>(other);
+    Scalar tmp = m_argImpl.coeff(index);
+    m_argImpl.coeffRef(index) = nonconst_other.coeff(index);
+    nonconst_other.coeffRef(index) = tmp;
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    OtherEvaluatorType& nonconst_other = const_cast<OtherEvaluatorType&>(other);
+    Packet tmp = m_argImpl.template packet<StoreMode>(row, col);
+    m_argImpl.template writePacket<StoreMode>
+      (row, col, nonconst_other.template packet<LoadMode>(row, col));
+    nonconst_other.template writePacket<LoadMode>(row, col, tmp);
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index index, const OtherEvaluatorType& other)
+  {
+    OtherEvaluatorType& nonconst_other = const_cast<OtherEvaluatorType&>(other);
+    Packet tmp = m_argImpl.template packet<StoreMode>(index);
+    m_argImpl.template writePacket<StoreMode>
+      (index, nonconst_other.template packet<LoadMode>(index));
+    nonconst_other.template writePacket<LoadMode>(index, tmp);
+  }
+
+protected:
+  typename evaluator<ArgType>::nestedType m_argImpl;
+};
+
+
+// ---------- SelfCwiseBinaryOp ----------
+
+template<typename BinaryOp, typename LhsXpr, typename RhsXpr>
+struct evaluator_impl<SelfCwiseBinaryOp<BinaryOp, LhsXpr, RhsXpr> >
+  : evaluator_impl_base<SelfCwiseBinaryOp<BinaryOp, LhsXpr, RhsXpr> >
+{
+  typedef SelfCwiseBinaryOp<BinaryOp, LhsXpr, RhsXpr> XprType;
+
+  evaluator_impl(const XprType& selfCwiseBinaryOp) 
+    : m_argImpl(selfCwiseBinaryOp.expression()),
+      m_functor(selfCwiseBinaryOp.functor())
+  { }
+ 
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::Packet Packet;
+
+  // This function and the next one are needed by assign to correctly align loads/stores
+  // TODO make Assign use .data()
+  Scalar& coeffRef(Index row, Index col)
+  {
+    return m_argImpl.coeffRef(row, col);
+  }
+  
+  inline Scalar& coeffRef(Index index)
+  {
+    return m_argImpl.coeffRef(index);
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    Scalar& tmp = m_argImpl.coeffRef(row, col);
+    tmp = m_functor(tmp, other.coeff(row, col));
+  }
+
+  template<typename OtherEvaluatorType>
+  void copyCoeff(Index index, const OtherEvaluatorType& other)
+  {
+    Scalar& tmp = m_argImpl.coeffRef(index);
+    tmp = m_functor(tmp, other.coeff(index));
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index row, Index col, const OtherEvaluatorType& other)
+  {
+    const Packet res = m_functor.packetOp(m_argImpl.template packet<StoreMode>(row, col),
+					  other.template packet<LoadMode>(row, col));
+    m_argImpl.template writePacket<StoreMode>(row, col, res);
+  }
+
+  template<int StoreMode, int LoadMode, typename OtherEvaluatorType>
+  void copyPacket(Index index, const OtherEvaluatorType& other)
+  {
+    const Packet res = m_functor.packetOp(m_argImpl.template packet<StoreMode>(index),
+					  other.template packet<LoadMode>(index));
+    m_argImpl.template writePacket<StoreMode>(index, res);
+  }
+
+protected:
+  typename evaluator<LhsXpr>::nestedType m_argImpl;
+  const BinaryOp m_functor;
+};
+
+
+} // namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COREEVALUATORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CoreIterators.h b/vendor/eigen-3.1.91/Eigen/src/Core/CoreIterators.h
new file mode 100644
index 0000000..6da4683
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CoreIterators.h
@@ -0,0 +1,61 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COREITERATORS_H
+#define EIGEN_COREITERATORS_H
+
+namespace Eigen { 
+
+/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core
+ */
+
+/** \ingroup SparseCore_Module
+  * \class InnerIterator
+  * \brief An InnerIterator allows to loop over the element of a sparse (or dense) matrix or expression
+  *
+  * todo
+  */
+
+// generic version for dense matrix and expressions
+template<typename Derived> class DenseBase<Derived>::InnerIterator
+{
+  protected:
+    typedef typename Derived::Scalar Scalar;
+    typedef typename Derived::Index Index;
+
+    enum { IsRowMajor = (Derived::Flags&RowMajorBit)==RowMajorBit };
+  public:
+    EIGEN_STRONG_INLINE InnerIterator(const Derived& expr, Index outer)
+      : m_expression(expr), m_inner(0), m_outer(outer), m_end(expr.innerSize())
+    {}
+
+    EIGEN_STRONG_INLINE Scalar value() const
+    {
+      return (IsRowMajor) ? m_expression.coeff(m_outer, m_inner)
+                          : m_expression.coeff(m_inner, m_outer);
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++() { m_inner++; return *this; }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_inner; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
+
+  protected:
+    const Derived& m_expression;
+    Index m_inner;
+    const Index m_outer;
+    const Index m_end;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_COREITERATORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CwiseBinaryOp.h b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseBinaryOp.h
new file mode 100644
index 0000000..586f77a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseBinaryOp.h
@@ -0,0 +1,229 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CWISE_BINARY_OP_H
+#define EIGEN_CWISE_BINARY_OP_H
+
+namespace Eigen {
+
+/** \class CwiseBinaryOp
+  * \ingroup Core_Module
+  *
+  * \brief Generic expression where a coefficient-wise binary operator is applied to two expressions
+  *
+  * \param BinaryOp template functor implementing the operator
+  * \param Lhs the type of the left-hand side
+  * \param Rhs the type of the right-hand side
+  *
+  * This class represents an expression  where a coefficient-wise binary operator is applied to two expressions.
+  * It is the return type of binary operators, by which we mean only those binary operators where
+  * both the left-hand side and the right-hand side are Eigen expressions.
+  * For example, the return type of matrix1+matrix2 is a CwiseBinaryOp.
+  *
+  * Most of the time, this is the only way that it is used, so you typically don't have to name
+  * CwiseBinaryOp types explicitly.
+  *
+  * \sa MatrixBase::binaryExpr(const MatrixBase<OtherDerived> &,const CustomBinaryOp &) const, class CwiseUnaryOp, class CwiseNullaryOp
+  */
+
+namespace internal {
+template<typename BinaryOp, typename Lhs, typename Rhs>
+struct traits<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
+{
+  // we must not inherit from traits<Lhs> since it has
+  // the potential to cause problems with MSVC
+  typedef typename remove_all<Lhs>::type Ancestor;
+  typedef typename traits<Ancestor>::XprKind XprKind;
+  enum {
+    RowsAtCompileTime = traits<Ancestor>::RowsAtCompileTime,
+    ColsAtCompileTime = traits<Ancestor>::ColsAtCompileTime,
+    MaxRowsAtCompileTime = traits<Ancestor>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = traits<Ancestor>::MaxColsAtCompileTime
+  };
+
+  // even though we require Lhs and Rhs to have the same scalar type (see CwiseBinaryOp constructor),
+  // we still want to handle the case when the result type is different.
+  typedef typename result_of<
+                     BinaryOp(
+                       typename Lhs::Scalar,
+                       typename Rhs::Scalar
+                     )
+                   >::type Scalar;
+  typedef typename promote_storage_type<typename traits<Lhs>::StorageKind,
+                                           typename traits<Rhs>::StorageKind>::ret StorageKind;
+  typedef typename promote_index_type<typename traits<Lhs>::Index,
+                                         typename traits<Rhs>::Index>::type Index;
+  typedef typename Lhs::Nested LhsNested;
+  typedef typename Rhs::Nested RhsNested;
+  typedef typename remove_reference<LhsNested>::type _LhsNested;
+  typedef typename remove_reference<RhsNested>::type _RhsNested;
+  enum {
+    LhsCoeffReadCost = _LhsNested::CoeffReadCost,
+    RhsCoeffReadCost = _RhsNested::CoeffReadCost,
+    LhsFlags = _LhsNested::Flags,
+    RhsFlags = _RhsNested::Flags,
+    SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value,
+    StorageOrdersAgree = (int(Lhs::Flags)&RowMajorBit)==(int(Rhs::Flags)&RowMajorBit),
+    Flags0 = (int(LhsFlags) | int(RhsFlags)) & (
+        HereditaryBits
+      | (int(LhsFlags) & int(RhsFlags) &
+           ( AlignedBit
+           | (StorageOrdersAgree ? LinearAccessBit : 0)
+           | (functor_traits<BinaryOp>::PacketAccess && StorageOrdersAgree && SameType ? PacketAccessBit : 0)
+           )
+        )
+     ),
+    Flags = (Flags0 & ~RowMajorBit) | (LhsFlags & RowMajorBit),
+    CoeffReadCost = LhsCoeffReadCost + RhsCoeffReadCost + functor_traits<BinaryOp>::Cost
+  };
+};
+} // end namespace internal
+
+// we require Lhs and Rhs to have the same scalar type. Currently there is no example of a binary functor
+// that would take two operands of different types. If there were such an example, then this check should be
+// moved to the BinaryOp functors, on a per-case basis. This would however require a change in the BinaryOp functors, as
+// currently they take only one typename Scalar template parameter.
+// It is tempting to always allow mixing different types but remember that this is often impossible in the vectorized paths.
+// So allowing mixing different types gives very unexpected errors when enabling vectorization, when the user tries to
+// add together a float matrix and a double matrix.
+#define EIGEN_CHECK_BINARY_COMPATIBILIY(BINOP,LHS,RHS) \
+  EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \
+                        ? int(internal::scalar_product_traits<LHS, RHS>::Defined) \
+                        : int(internal::is_same<LHS, RHS>::value)), \
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+template<typename BinaryOp, typename Lhs, typename Rhs, typename StorageKind>
+class CwiseBinaryOpImpl;
+
+template<typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOp : internal::no_assignment_operator,
+  public CwiseBinaryOpImpl<
+          BinaryOp, Lhs, Rhs,
+          typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,
+                                           typename internal::traits<Rhs>::StorageKind>::ret>
+{
+  public:
+
+    typedef typename CwiseBinaryOpImpl<
+        BinaryOp, Lhs, Rhs,
+        typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,
+                                         typename internal::traits<Rhs>::StorageKind>::ret>::Base Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseBinaryOp)
+
+    typedef typename internal::nested<Lhs>::type LhsNested;
+    typedef typename internal::nested<Rhs>::type RhsNested;
+    typedef typename internal::remove_reference<LhsNested>::type _LhsNested;
+    typedef typename internal::remove_reference<RhsNested>::type _RhsNested;
+
+    EIGEN_STRONG_INLINE CwiseBinaryOp(const Lhs& aLhs, const Rhs& aRhs, const BinaryOp& func = BinaryOp())
+      : m_lhs(aLhs), m_rhs(aRhs), m_functor(func)
+    {
+      EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename Rhs::Scalar);
+      // require the sizes to match
+      EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs, Rhs)
+      eigen_assert(aLhs.rows() == aRhs.rows() && aLhs.cols() == aRhs.cols());
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const {
+      // return the fixed size type if available to enable compile time optimizations
+      if (internal::traits<typename internal::remove_all<LhsNested>::type>::RowsAtCompileTime==Dynamic)
+        return m_rhs.rows();
+      else
+        return m_lhs.rows();
+    }
+    EIGEN_STRONG_INLINE Index cols() const {
+      // return the fixed size type if available to enable compile time optimizations
+      if (internal::traits<typename internal::remove_all<LhsNested>::type>::ColsAtCompileTime==Dynamic)
+        return m_rhs.cols();
+      else
+        return m_lhs.cols();
+    }
+
+    /** \returns the left hand side nested expression */
+    const _LhsNested& lhs() const { return m_lhs; }
+    /** \returns the right hand side nested expression */
+    const _RhsNested& rhs() const { return m_rhs; }
+    /** \returns the functor representing the binary operation */
+    const BinaryOp& functor() const { return m_functor; }
+
+  protected:
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+    const BinaryOp m_functor;
+};
+
+template<typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Dense>
+  : public internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type
+{
+    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
+  public:
+
+    typedef typename internal::dense_xpr_base<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE( Derived )
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const
+    {
+      return derived().functor()(derived().lhs().coeff(rowId, colId),
+                                 derived().rhs().coeff(rowId, colId));
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
+    {
+      return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(rowId, colId),
+                                          derived().rhs().template packet<LoadMode>(rowId, colId));
+    }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
+    {
+      return derived().functor()(derived().lhs().coeff(index),
+                                 derived().rhs().coeff(index));
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
+    {
+      return derived().functor().packetOp(derived().lhs().template packet<LoadMode>(index),
+                                          derived().rhs().template packet<LoadMode>(index));
+    }
+};
+
+/** replaces \c *this by \c *this - \a other.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+MatrixBase<Derived>::operator-=(const MatrixBase<OtherDerived> &other)
+{
+  SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+/** replaces \c *this by \c *this + \a other.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+MatrixBase<Derived>::operator+=(const MatrixBase<OtherDerived>& other)
+{
+  SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, Derived, OtherDerived> tmp(derived());
+  tmp = other.derived();
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_CWISE_BINARY_OP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CwiseNullaryOp.h b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseNullaryOp.h
new file mode 100644
index 0000000..a93bab2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseNullaryOp.h
@@ -0,0 +1,864 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CWISE_NULLARY_OP_H
+#define EIGEN_CWISE_NULLARY_OP_H
+
+namespace Eigen {
+
+/** \class CwiseNullaryOp
+  * \ingroup Core_Module
+  *
+  * \brief Generic expression of a matrix where all coefficients are defined by a functor
+  *
+  * \param NullaryOp template functor implementing the operator
+  * \param PlainObjectType the underlying plain matrix/array type
+  *
+  * This class represents an expression of a generic nullary operator.
+  * It is the return type of the Ones(), Zero(), Constant(), Identity() and Random() methods,
+  * and most of the time this is the only way it is used.
+  *
+  * However, if you want to write a function returning such an expression, you
+  * will need to use this class.
+  *
+  * \sa class CwiseUnaryOp, class CwiseBinaryOp, DenseBase::NullaryExpr()
+  */
+
+namespace internal {
+template<typename NullaryOp, typename PlainObjectType>
+struct traits<CwiseNullaryOp<NullaryOp, PlainObjectType> > : traits<PlainObjectType>
+{
+  enum {
+    Flags = (traits<PlainObjectType>::Flags
+      & (  HereditaryBits
+         | (functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0)
+         | (functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0)))
+      | (functor_traits<NullaryOp>::IsRepeatable ? 0 : EvalBeforeNestingBit),
+    CoeffReadCost = functor_traits<NullaryOp>::Cost
+  };
+};
+}
+
+template<typename NullaryOp, typename PlainObjectType>
+class CwiseNullaryOp : internal::no_assignment_operator,
+  public internal::dense_xpr_base< CwiseNullaryOp<NullaryOp, PlainObjectType> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<CwiseNullaryOp>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(CwiseNullaryOp)
+
+    CwiseNullaryOp(Index nbRows, Index nbCols, const NullaryOp& func = NullaryOp())
+      : m_rows(nbRows), m_cols(nbCols), m_functor(func)
+    {
+      eigen_assert(nbRows >= 0
+            && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == nbRows)
+            &&  nbCols >= 0
+            && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == nbCols));
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_rows.value(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_cols.value(); }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const
+    {
+      return m_functor(rowId, colId);
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
+    {
+      return m_functor.packetOp(rowId, colId);
+    }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
+    {
+      return m_functor(index);
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
+    {
+      return m_functor.packetOp(index);
+    }
+
+    /** \returns the functor representing the nullary operation */
+    const NullaryOp& functor() const { return m_functor; }
+
+  protected:
+    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
+    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
+    const NullaryOp m_functor;
+};
+
+
+/** \returns an expression of a matrix defined by a custom functor \a func
+  *
+  * The parameters \a rows and \a cols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this MatrixBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
+  * instead.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+template<typename CustomNullaryOp>
+EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
+DenseBase<Derived>::NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func)
+{
+  return CwiseNullaryOp<CustomNullaryOp, Derived>(rows, cols, func);
+}
+
+/** \returns an expression of a matrix defined by a custom functor \a func
+  *
+  * The parameter \a size is the size of the returned vector.
+  * Must be compatible with this MatrixBase type.
+  *
+  * \only_for_vectors
+  *
+  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+  * it is redundant to pass \a size as argument, so Zero() should be used
+  * instead.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+template<typename CustomNullaryOp>
+EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
+DenseBase<Derived>::NullaryExpr(Index size, const CustomNullaryOp& func)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  if(RowsAtCompileTime == 1) return CwiseNullaryOp<CustomNullaryOp, Derived>(1, size, func);
+  else return CwiseNullaryOp<CustomNullaryOp, Derived>(size, 1, func);
+}
+
+/** \returns an expression of a matrix defined by a custom functor \a func
+  *
+  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
+  * need to use the variants taking size arguments.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+template<typename CustomNullaryOp>
+EIGEN_STRONG_INLINE const CwiseNullaryOp<CustomNullaryOp, Derived>
+DenseBase<Derived>::NullaryExpr(const CustomNullaryOp& func)
+{
+  return CwiseNullaryOp<CustomNullaryOp, Derived>(RowsAtCompileTime, ColsAtCompileTime, func);
+}
+
+/** \returns an expression of a constant matrix of value \a value
+  *
+  * The parameters \a nbRows and \a nbCols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this DenseBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a nbRows and \a nbCols as arguments, so Zero() should be used
+  * instead.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Constant(Index nbRows, Index nbCols, const Scalar& value)
+{
+  return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, internal::scalar_constant_op<Scalar>(value));
+}
+
+/** \returns an expression of a constant matrix of value \a value
+  *
+  * The parameter \a size is the size of the returned vector.
+  * Must be compatible with this DenseBase type.
+  *
+  * \only_for_vectors
+  *
+  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+  * it is redundant to pass \a size as argument, so Zero() should be used
+  * instead.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Constant(Index size, const Scalar& value)
+{
+  return DenseBase<Derived>::NullaryExpr(size, internal::scalar_constant_op<Scalar>(value));
+}
+
+/** \returns an expression of a constant matrix of value \a value
+  *
+  * This variant is only for fixed-size DenseBase types. For dynamic-size types, you
+  * need to use the variants taking size arguments.
+  *
+  * The template parameter \a CustomNullaryOp is the type of the functor.
+  *
+  * \sa class CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Constant(const Scalar& value)
+{
+  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+  return DenseBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_constant_op<Scalar>(value));
+}
+
+/**
+  * \brief Sets a linearly space vector.
+  *
+  * The function generates 'size' equally spaced values in the closed interval [low,high].
+  * This particular version of LinSpaced() uses sequential access, i.e. vector access is
+  * assumed to be a(0), a(1), ..., a(size). This assumption allows for better vectorization
+  * and yields faster code than the random access version.
+  *
+  * When size is set to 1, a vector of length 1 containing 'high' is returned.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include DenseBase_LinSpaced_seq.cpp
+  * Output: \verbinclude DenseBase_LinSpaced_seq.out
+  *
+  * \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Index,Scalar,Scalar), CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,false>(low,high,size));
+}
+
+/**
+  * \copydoc DenseBase::LinSpaced(Sequential_t, Index, const Scalar&, const Scalar&)
+  * Special version for fixed size types which does not require the size parameter.
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::SequentialLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(Sequential_t, const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,false>(low,high,Derived::SizeAtCompileTime));
+}
+
+/**
+  * \brief Sets a linearly space vector.
+  *
+  * The function generates 'size' equally spaced values in the closed interval [low,high].
+  * When size is set to 1, a vector of length 1 containing 'high' is returned.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include DenseBase_LinSpaced.cpp
+  * Output: \verbinclude DenseBase_LinSpaced.out
+  *
+  * \sa setLinSpaced(Index,const Scalar&,const Scalar&), LinSpaced(Sequential_t,Index,const Scalar&,const Scalar&,Index), CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(Index size, const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return DenseBase<Derived>::NullaryExpr(size, internal::linspaced_op<Scalar,true>(low,high,size));
+}
+
+/**
+  * \copydoc DenseBase::LinSpaced(Index, const Scalar&, const Scalar&)
+  * Special version for fixed size types which does not require the size parameter.
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::RandomAccessLinSpacedReturnType
+DenseBase<Derived>::LinSpaced(const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+  return DenseBase<Derived>::NullaryExpr(Derived::SizeAtCompileTime, internal::linspaced_op<Scalar,true>(low,high,Derived::SizeAtCompileTime));
+}
+
+/** \returns true if all coefficients in this matrix are approximately equal to \a val, to within precision \a prec */
+template<typename Derived>
+bool DenseBase<Derived>::isApproxToConstant
+(const Scalar& val, const RealScalar& prec) const
+{
+  for(Index j = 0; j < cols(); ++j)
+    for(Index i = 0; i < rows(); ++i)
+      if(!internal::isApprox(this->coeff(i, j), val, prec))
+        return false;
+  return true;
+}
+
+/** This is just an alias for isApproxToConstant().
+  *
+  * \returns true if all coefficients in this matrix are approximately equal to \a value, to within precision \a prec */
+template<typename Derived>
+bool DenseBase<Derived>::isConstant
+(const Scalar& val, const RealScalar& prec) const
+{
+  return isApproxToConstant(val, prec);
+}
+
+/** Alias for setConstant(): sets all coefficients in this expression to \a val.
+  *
+  * \sa setConstant(), Constant(), class CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE void DenseBase<Derived>::fill(const Scalar& val)
+{
+  setConstant(val);
+}
+
+/** Sets all coefficients in this expression to \a value.
+  *
+  * \sa fill(), setConstant(Index,const Scalar&), setConstant(Index,Index,const Scalar&), setZero(), setOnes(), Constant(), class CwiseNullaryOp, setZero(), setOnes()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setConstant(const Scalar& val)
+{
+  return derived() = Constant(rows(), cols(), val);
+}
+
+/** Resizes to the given \a size, and sets all coefficients in this expression to the given \a value.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include Matrix_setConstant_int.cpp
+  * Output: \verbinclude Matrix_setConstant_int.out
+  *
+  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setConstant(Index size, const Scalar& val)
+{
+  resize(size);
+  return setConstant(val);
+}
+
+/** Resizes to the given size, and sets all coefficients in this expression to the given \a value.
+  *
+  * \param nbRows the new number of rows
+  * \param nbCols the new number of columns
+  * \param val the value to which all coefficients are set
+  *
+  * Example: \include Matrix_setConstant_int_int.cpp
+  * Output: \verbinclude Matrix_setConstant_int_int.out
+  *
+  * \sa MatrixBase::setConstant(const Scalar&), setConstant(Index,const Scalar&), class CwiseNullaryOp, MatrixBase::Constant(const Scalar&)
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setConstant(Index nbRows, Index nbCols, const Scalar& val)
+{
+  resize(nbRows, nbCols);
+  return setConstant(val);
+}
+
+/**
+  * \brief Sets a linearly space vector.
+  *
+  * The function generates 'size' equally spaced values in the closed interval [low,high].
+  * When size is set to 1, a vector of length 1 containing 'high' is returned.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include DenseBase_setLinSpaced.cpp
+  * Output: \verbinclude DenseBase_setLinSpaced.out
+  *
+  * \sa CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(Index newSize, const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return derived() = Derived::NullaryExpr(newSize, internal::linspaced_op<Scalar,false>(low,high,newSize));
+}
+
+/**
+  * \brief Sets a linearly space vector.
+  *
+  * The function fill *this with equally spaced values in the closed interval [low,high].
+  * When size is set to 1, a vector of length 1 containing 'high' is returned.
+  *
+  * \only_for_vectors
+  *
+  * \sa setLinSpaced(Index, const Scalar&, const Scalar&), CwiseNullaryOp
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setLinSpaced(const Scalar& low, const Scalar& high)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return setLinSpaced(size(), low, high);
+}
+
+// zero:
+
+/** \returns an expression of a zero matrix.
+  *
+  * The parameters \a rows and \a cols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this MatrixBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a rows and \a cols as arguments, so Zero() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_zero_int_int.cpp
+  * Output: \verbinclude MatrixBase_zero_int_int.out
+  *
+  * \sa Zero(), Zero(Index)
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Zero(Index nbRows, Index nbCols)
+{
+  return Constant(nbRows, nbCols, Scalar(0));
+}
+
+/** \returns an expression of a zero vector.
+  *
+  * The parameter \a size is the size of the returned vector.
+  * Must be compatible with this MatrixBase type.
+  *
+  * \only_for_vectors
+  *
+  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+  * it is redundant to pass \a size as argument, so Zero() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_zero_int.cpp
+  * Output: \verbinclude MatrixBase_zero_int.out
+  *
+  * \sa Zero(), Zero(Index,Index)
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Zero(Index size)
+{
+  return Constant(size, Scalar(0));
+}
+
+/** \returns an expression of a fixed-size zero matrix or vector.
+  *
+  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+  * need to use the variants taking size arguments.
+  *
+  * Example: \include MatrixBase_zero.cpp
+  * Output: \verbinclude MatrixBase_zero.out
+  *
+  * \sa Zero(Index), Zero(Index,Index)
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Zero()
+{
+  return Constant(Scalar(0));
+}
+
+/** \returns true if *this is approximately equal to the zero matrix,
+  *          within the precision given by \a prec.
+  *
+  * Example: \include MatrixBase_isZero.cpp
+  * Output: \verbinclude MatrixBase_isZero.out
+  *
+  * \sa class CwiseNullaryOp, Zero()
+  */
+template<typename Derived>
+bool DenseBase<Derived>::isZero(const RealScalar& prec) const
+{
+  for(Index j = 0; j < cols(); ++j)
+    for(Index i = 0; i < rows(); ++i)
+      if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<Scalar>(1), prec))
+        return false;
+  return true;
+}
+
+/** Sets all coefficients in this expression to zero.
+  *
+  * Example: \include MatrixBase_setZero.cpp
+  * Output: \verbinclude MatrixBase_setZero.out
+  *
+  * \sa class CwiseNullaryOp, Zero()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setZero()
+{
+  return setConstant(Scalar(0));
+}
+
+/** Resizes to the given \a size, and sets all coefficients in this expression to zero.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include Matrix_setZero_int.cpp
+  * Output: \verbinclude Matrix_setZero_int.out
+  *
+  * \sa DenseBase::setZero(), setZero(Index,Index), class CwiseNullaryOp, DenseBase::Zero()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setZero(Index newSize)
+{
+  resize(newSize);
+  return setConstant(Scalar(0));
+}
+
+/** Resizes to the given size, and sets all coefficients in this expression to zero.
+  *
+  * \param nbRows the new number of rows
+  * \param nbCols the new number of columns
+  *
+  * Example: \include Matrix_setZero_int_int.cpp
+  * Output: \verbinclude Matrix_setZero_int_int.out
+  *
+  * \sa DenseBase::setZero(), setZero(Index), class CwiseNullaryOp, DenseBase::Zero()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setZero(Index nbRows, Index nbCols)
+{
+  resize(nbRows, nbCols);
+  return setConstant(Scalar(0));
+}
+
+// ones:
+
+/** \returns an expression of a matrix where all coefficients equal one.
+  *
+  * The parameters \a nbRows and \a nbCols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this MatrixBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a rows and \a cols as arguments, so Ones() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_ones_int_int.cpp
+  * Output: \verbinclude MatrixBase_ones_int_int.out
+  *
+  * \sa Ones(), Ones(Index), isOnes(), class Ones
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Ones(Index nbRows, Index nbCols)
+{
+  return Constant(nbRows, nbCols, Scalar(1));
+}
+
+/** \returns an expression of a vector where all coefficients equal one.
+  *
+  * The parameter \a newSize is the size of the returned vector.
+  * Must be compatible with this MatrixBase type.
+  *
+  * \only_for_vectors
+  *
+  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+  * it is redundant to pass \a size as argument, so Ones() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_ones_int.cpp
+  * Output: \verbinclude MatrixBase_ones_int.out
+  *
+  * \sa Ones(), Ones(Index,Index), isOnes(), class Ones
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Ones(Index newSize)
+{
+  return Constant(newSize, Scalar(1));
+}
+
+/** \returns an expression of a fixed-size matrix or vector where all coefficients equal one.
+  *
+  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+  * need to use the variants taking size arguments.
+  *
+  * Example: \include MatrixBase_ones.cpp
+  * Output: \verbinclude MatrixBase_ones.out
+  *
+  * \sa Ones(Index), Ones(Index,Index), isOnes(), class Ones
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename DenseBase<Derived>::ConstantReturnType
+DenseBase<Derived>::Ones()
+{
+  return Constant(Scalar(1));
+}
+
+/** \returns true if *this is approximately equal to the matrix where all coefficients
+  *          are equal to 1, within the precision given by \a prec.
+  *
+  * Example: \include MatrixBase_isOnes.cpp
+  * Output: \verbinclude MatrixBase_isOnes.out
+  *
+  * \sa class CwiseNullaryOp, Ones()
+  */
+template<typename Derived>
+bool DenseBase<Derived>::isOnes
+(const RealScalar& prec) const
+{
+  return isApproxToConstant(Scalar(1), prec);
+}
+
+/** Sets all coefficients in this expression to one.
+  *
+  * Example: \include MatrixBase_setOnes.cpp
+  * Output: \verbinclude MatrixBase_setOnes.out
+  *
+  * \sa class CwiseNullaryOp, Ones()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& DenseBase<Derived>::setOnes()
+{
+  return setConstant(Scalar(1));
+}
+
+/** Resizes to the given \a newSize, and sets all coefficients in this expression to one.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include Matrix_setOnes_int.cpp
+  * Output: \verbinclude Matrix_setOnes_int.out
+  *
+  * \sa MatrixBase::setOnes(), setOnes(Index,Index), class CwiseNullaryOp, MatrixBase::Ones()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setOnes(Index newSize)
+{
+  resize(newSize);
+  return setConstant(Scalar(1));
+}
+
+/** Resizes to the given size, and sets all coefficients in this expression to one.
+  *
+  * \param nbRows the new number of rows
+  * \param nbCols the new number of columns
+  *
+  * Example: \include Matrix_setOnes_int_int.cpp
+  * Output: \verbinclude Matrix_setOnes_int_int.out
+  *
+  * \sa MatrixBase::setOnes(), setOnes(Index), class CwiseNullaryOp, MatrixBase::Ones()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setOnes(Index nbRows, Index nbCols)
+{
+  resize(nbRows, nbCols);
+  return setConstant(Scalar(1));
+}
+
+// Identity:
+
+/** \returns an expression of the identity matrix (not necessarily square).
+  *
+  * The parameters \a nbRows and \a nbCols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this MatrixBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a rows and \a cols as arguments, so Identity() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_identity_int_int.cpp
+  * Output: \verbinclude MatrixBase_identity_int_int.out
+  *
+  * \sa Identity(), setIdentity(), isIdentity()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
+MatrixBase<Derived>::Identity(Index nbRows, Index nbCols)
+{
+  return DenseBase<Derived>::NullaryExpr(nbRows, nbCols, internal::scalar_identity_op<Scalar>());
+}
+
+/** \returns an expression of the identity matrix (not necessarily square).
+  *
+  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+  * need to use the variant taking size arguments.
+  *
+  * Example: \include MatrixBase_identity.cpp
+  * Output: \verbinclude MatrixBase_identity.out
+  *
+  * \sa Identity(Index,Index), setIdentity(), isIdentity()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::IdentityReturnType
+MatrixBase<Derived>::Identity()
+{
+  EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+  return MatrixBase<Derived>::NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_identity_op<Scalar>());
+}
+
+/** \returns true if *this is approximately equal to the identity matrix
+  *          (not necessarily square),
+  *          within the precision given by \a prec.
+  *
+  * Example: \include MatrixBase_isIdentity.cpp
+  * Output: \verbinclude MatrixBase_isIdentity.out
+  *
+  * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), setIdentity()
+  */
+template<typename Derived>
+bool MatrixBase<Derived>::isIdentity
+(const RealScalar& prec) const
+{
+  for(Index j = 0; j < cols(); ++j)
+  {
+    for(Index i = 0; i < rows(); ++i)
+    {
+      if(i == j)
+      {
+        if(!internal::isApprox(this->coeff(i, j), static_cast<Scalar>(1), prec))
+          return false;
+      }
+      else
+      {
+        if(!internal::isMuchSmallerThan(this->coeff(i, j), static_cast<RealScalar>(1), prec))
+          return false;
+      }
+    }
+  }
+  return true;
+}
+
+namespace internal {
+
+template<typename Derived, bool Big = (Derived::SizeAtCompileTime>=16)>
+struct setIdentity_impl
+{
+  static EIGEN_STRONG_INLINE Derived& run(Derived& m)
+  {
+    return m = Derived::Identity(m.rows(), m.cols());
+  }
+};
+
+template<typename Derived>
+struct setIdentity_impl<Derived, true>
+{
+  typedef typename Derived::Index Index;
+  static EIGEN_STRONG_INLINE Derived& run(Derived& m)
+  {
+    m.setZero();
+    const Index size = (std::min)(m.rows(), m.cols());
+    for(Index i = 0; i < size; ++i) m.coeffRef(i,i) = typename Derived::Scalar(1);
+    return m;
+  }
+};
+
+} // end namespace internal
+
+/** Writes the identity expression (not necessarily square) into *this.
+  *
+  * Example: \include MatrixBase_setIdentity.cpp
+  * Output: \verbinclude MatrixBase_setIdentity.out
+  *
+  * \sa class CwiseNullaryOp, Identity(), Identity(Index,Index), isIdentity()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity()
+{
+  return internal::setIdentity_impl<Derived>::run(derived());
+}
+
+/** \brief Resizes to the given size, and writes the identity expression (not necessarily square) into *this.
+  *
+  * \param nbRows the new number of rows
+  * \param nbCols the new number of columns
+  *
+  * Example: \include Matrix_setIdentity_int_int.cpp
+  * Output: \verbinclude Matrix_setIdentity_int_int.out
+  *
+  * \sa MatrixBase::setIdentity(), class CwiseNullaryOp, MatrixBase::Identity()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived& MatrixBase<Derived>::setIdentity(Index nbRows, Index nbCols)
+{
+  derived().resize(nbRows, nbCols);
+  return setIdentity();
+}
+
+/** \returns an expression of the i-th unit (basis) vector.
+  *
+  * \only_for_vectors
+  *
+  * \sa MatrixBase::Unit(Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index newSize, Index i)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return BasisReturnType(SquareMatrixType::Identity(newSize,newSize), i);
+}
+
+/** \returns an expression of the i-th unit (basis) vector.
+  *
+  * \only_for_vectors
+  *
+  * This variant is for fixed-size vector only.
+  *
+  * \sa MatrixBase::Unit(Index,Index), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(Index i)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return BasisReturnType(SquareMatrixType::Identity(),i);
+}
+
+/** \returns an expression of the X axis unit vector (1{,0}^*)
+  *
+  * \only_for_vectors
+  *
+  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX()
+{ return Derived::Unit(0); }
+
+/** \returns an expression of the Y axis unit vector (0,1{,0}^*)
+  *
+  * \only_for_vectors
+  *
+  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY()
+{ return Derived::Unit(1); }
+
+/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*)
+  *
+  * \only_for_vectors
+  *
+  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ()
+{ return Derived::Unit(2); }
+
+/** \returns an expression of the W axis unit vector (0,0,0,1)
+  *
+  * \only_for_vectors
+  *
+  * \sa MatrixBase::Unit(Index,Index), MatrixBase::Unit(Index), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW()
+{ return Derived::Unit(3); }
+
+} // end namespace Eigen
+
+#endif // EIGEN_CWISE_NULLARY_OP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryOp.h b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryOp.h
new file mode 100644
index 0000000..f2de749
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryOp.h
@@ -0,0 +1,126 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CWISE_UNARY_OP_H
+#define EIGEN_CWISE_UNARY_OP_H
+
+namespace Eigen { 
+
+/** \class CwiseUnaryOp
+  * \ingroup Core_Module
+  *
+  * \brief Generic expression where a coefficient-wise unary operator is applied to an expression
+  *
+  * \param UnaryOp template functor implementing the operator
+  * \param XprType the type of the expression to which we are applying the unary operator
+  *
+  * This class represents an expression where a unary operator is applied to an expression.
+  * It is the return type of all operations taking exactly 1 input expression, regardless of the
+  * presence of other inputs such as scalars. For example, the operator* in the expression 3*matrix
+  * is considered unary, because only the right-hand side is an expression, and its
+  * return type is a specialization of CwiseUnaryOp.
+  *
+  * Most of the time, this is the only way that it is used, so you typically don't have to name
+  * CwiseUnaryOp types explicitly.
+  *
+  * \sa MatrixBase::unaryExpr(const CustomUnaryOp &) const, class CwiseBinaryOp, class CwiseNullaryOp
+  */
+
+namespace internal {
+template<typename UnaryOp, typename XprType>
+struct traits<CwiseUnaryOp<UnaryOp, XprType> >
+ : traits<XprType>
+{
+  typedef typename result_of<
+                     UnaryOp(typename XprType::Scalar)
+                   >::type Scalar;
+  typedef typename XprType::Nested XprTypeNested;
+  typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
+  enum {
+    Flags = _XprTypeNested::Flags & (
+      HereditaryBits | LinearAccessBit | AlignedBit
+      | (functor_traits<UnaryOp>::PacketAccess ? PacketAccessBit : 0)),
+    CoeffReadCost = _XprTypeNested::CoeffReadCost + functor_traits<UnaryOp>::Cost
+  };
+};
+}
+
+template<typename UnaryOp, typename XprType, typename StorageKind>
+class CwiseUnaryOpImpl;
+
+template<typename UnaryOp, typename XprType>
+class CwiseUnaryOp : internal::no_assignment_operator,
+  public CwiseUnaryOpImpl<UnaryOp, XprType, typename internal::traits<XprType>::StorageKind>
+{
+  public:
+
+    typedef typename CwiseUnaryOpImpl<UnaryOp, XprType,typename internal::traits<XprType>::StorageKind>::Base Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryOp)
+
+    inline CwiseUnaryOp(const XprType& xpr, const UnaryOp& func = UnaryOp())
+      : m_xpr(xpr), m_functor(func) {}
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_xpr.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_xpr.cols(); }
+
+    /** \returns the functor representing the unary operation */
+    const UnaryOp& functor() const { return m_functor; }
+
+    /** \returns the nested expression */
+    const typename internal::remove_all<typename XprType::Nested>::type&
+    nestedExpression() const { return m_xpr; }
+
+    /** \returns the nested expression */
+    typename internal::remove_all<typename XprType::Nested>::type&
+    nestedExpression() { return m_xpr.const_cast_derived(); }
+
+  protected:
+    typename XprType::Nested m_xpr;
+    const UnaryOp m_functor;
+};
+
+// This is the generic implementation for dense storage.
+// It can be used for any expression types implementing the dense concept.
+template<typename UnaryOp, typename XprType>
+class CwiseUnaryOpImpl<UnaryOp,XprType,Dense>
+  : public internal::dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type
+{
+  public:
+
+    typedef CwiseUnaryOp<UnaryOp, XprType> Derived;
+    typedef typename internal::dense_xpr_base<CwiseUnaryOp<UnaryOp, XprType> >::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index rowId, Index colId) const
+    {
+      return derived().functor()(derived().nestedExpression().coeff(rowId, colId));
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
+    {
+      return derived().functor().packetOp(derived().nestedExpression().template packet<LoadMode>(rowId, colId));
+    }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
+    {
+      return derived().functor()(derived().nestedExpression().coeff(index));
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
+    {
+      return derived().functor().packetOp(derived().nestedExpression().template packet<LoadMode>(index));
+    }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_CWISE_UNARY_OP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryView.h b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryView.h
new file mode 100644
index 0000000..9f9d497
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/CwiseUnaryView.h
@@ -0,0 +1,139 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CWISE_UNARY_VIEW_H
+#define EIGEN_CWISE_UNARY_VIEW_H
+
+namespace Eigen {
+
+/** \class CwiseUnaryView
+  * \ingroup Core_Module
+  *
+  * \brief Generic lvalue expression of a coefficient-wise unary operator of a matrix or a vector
+  *
+  * \param ViewOp template functor implementing the view
+  * \param MatrixType the type of the matrix we are applying the unary operator
+  *
+  * This class represents a lvalue expression of a generic unary view operator of a matrix or a vector.
+  * It is the return type of real() and imag(), and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::unaryViewExpr(const CustomUnaryOp &) const, class CwiseUnaryOp
+  */
+
+namespace internal {
+template<typename ViewOp, typename MatrixType>
+struct traits<CwiseUnaryView<ViewOp, MatrixType> >
+ : traits<MatrixType>
+{
+  typedef typename result_of<
+                     ViewOp(typename traits<MatrixType>::Scalar)
+                   >::type Scalar;
+  typedef typename MatrixType::Nested MatrixTypeNested;
+  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
+  enum {
+    Flags = (traits<_MatrixTypeNested>::Flags & (HereditaryBits | LvalueBit | LinearAccessBit | DirectAccessBit)),
+    CoeffReadCost = traits<_MatrixTypeNested>::CoeffReadCost + functor_traits<ViewOp>::Cost,
+    MatrixTypeInnerStride =  inner_stride_at_compile_time<MatrixType>::ret,
+    // need to cast the sizeof's from size_t to int explicitly, otherwise:
+    // "error: no integral type can represent all of the enumerator values
+    InnerStrideAtCompileTime = MatrixTypeInnerStride == Dynamic
+                             ? int(Dynamic)
+                             : int(MatrixTypeInnerStride) * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar)),
+    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret == Dynamic
+                             ? int(Dynamic)
+                             : outer_stride_at_compile_time<MatrixType>::ret * int(sizeof(typename traits<MatrixType>::Scalar) / sizeof(Scalar))
+  };
+};
+}
+
+template<typename ViewOp, typename MatrixType, typename StorageKind>
+class CwiseUnaryViewImpl;
+
+template<typename ViewOp, typename MatrixType>
+class CwiseUnaryView : internal::no_assignment_operator,
+  public CwiseUnaryViewImpl<ViewOp, MatrixType, typename internal::traits<MatrixType>::StorageKind>
+{
+  public:
+
+    typedef typename CwiseUnaryViewImpl<ViewOp, MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(CwiseUnaryView)
+
+    inline CwiseUnaryView(const MatrixType& mat, const ViewOp& func = ViewOp())
+      : m_matrix(mat), m_functor(func) {}
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(CwiseUnaryView)
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_matrix.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_matrix.cols(); }
+
+    /** \returns the functor representing unary operation */
+    const ViewOp& functor() const { return m_functor; }
+
+    /** \returns the nested expression */
+    const typename internal::remove_all<typename MatrixType::Nested>::type&
+    nestedExpression() const { return m_matrix; }
+
+    /** \returns the nested expression */
+    typename internal::remove_all<typename MatrixType::Nested>::type&
+    nestedExpression() { return m_matrix.const_cast_derived(); }
+
+  protected:
+    // FIXME changed from MatrixType::Nested because of a weird compilation error with sun CC
+    typename internal::nested<MatrixType>::type m_matrix;
+    ViewOp m_functor;
+};
+
+template<typename ViewOp, typename MatrixType>
+class CwiseUnaryViewImpl<ViewOp,MatrixType,Dense>
+  : public internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type
+{
+  public:
+
+    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;
+    typedef typename internal::dense_xpr_base< CwiseUnaryView<ViewOp, MatrixType> >::type Base;
+
+    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
+    
+    inline Scalar* data() { return &coeffRef(0); }
+    inline const Scalar* data() const { return &coeff(0); }
+
+    inline Index innerStride() const
+    {
+      return derived().nestedExpression().innerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
+    }
+
+    inline Index outerStride() const
+    {
+      return derived().nestedExpression().outerStride() * sizeof(typename internal::traits<MatrixType>::Scalar) / sizeof(Scalar);
+    }
+
+    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
+    {
+      return derived().functor()(derived().nestedExpression().coeff(row, col));
+    }
+
+    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index index) const
+    {
+      return derived().functor()(derived().nestedExpression().coeff(index));
+    }
+
+    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
+    {
+      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(row, col));
+    }
+
+    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
+    {
+      return derived().functor()(const_cast_derived().nestedExpression().coeffRef(index));
+    }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_CWISE_UNARY_VIEW_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/DenseBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/DenseBase.h
new file mode 100644
index 0000000..dfdf6c4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/DenseBase.h
@@ -0,0 +1,511 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DENSEBASE_H
+#define EIGEN_DENSEBASE_H
+
+namespace Eigen {
+
+/** \class DenseBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for all dense matrices, vectors, and arrays
+  *
+  * This class is the base that is inherited by all dense objects (matrix, vector, arrays,
+  * and related expression types). The common Eigen API for dense objects is contained in this class.
+  *
+  * \tparam Derived is the derived type, e.g., a matrix type or an expression.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_DENSEBASE_PLUGIN.
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+template<typename Derived> class DenseBase
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  : public internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,
+                                     typename NumTraits<typename internal::traits<Derived>::Scalar>::Real>
+#else
+  : public DenseCoeffsBase<Derived>
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+{
+  public:
+    using internal::special_scalar_op_base<Derived,typename internal::traits<Derived>::Scalar,
+                typename NumTraits<typename internal::traits<Derived>::Scalar>::Real>::operator*;
+
+    class InnerIterator;
+
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+
+    /** \brief The type of indices 
+      * \details To change this, \c \#define the preprocessor symbol \c EIGEN_DEFAULT_DENSE_INDEX_TYPE.
+      * \sa \ref TopicPreprocessorDirectives.
+      */
+    typedef typename internal::traits<Derived>::Index Index; 
+
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    typedef DenseCoeffsBase<Derived> Base;
+    using Base::derived;
+    using Base::const_cast_derived;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::rowIndexByOuterInner;
+    using Base::colIndexByOuterInner;
+    using Base::coeff;
+    using Base::coeffByOuterInner;
+    using Base::packet;
+    using Base::packetByOuterInner;
+    using Base::writePacket;
+    using Base::writePacketByOuterInner;
+    using Base::coeffRef;
+    using Base::coeffRefByOuterInner;
+    using Base::copyCoeff;
+    using Base::copyCoeffByOuterInner;
+    using Base::copyPacket;
+    using Base::copyPacketByOuterInner;
+    using Base::operator();
+    using Base::operator[];
+    using Base::x;
+    using Base::y;
+    using Base::z;
+    using Base::w;
+    using Base::stride;
+    using Base::innerStride;
+    using Base::outerStride;
+    using Base::rowStride;
+    using Base::colStride;
+    typedef typename Base::CoeffReturnType CoeffReturnType;
+
+    enum {
+
+      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+        /**< The number of rows at compile-time. This is just a copy of the value provided
+          * by the \a Derived type. If a value is not known at compile-time,
+          * it is set to the \a Dynamic constant.
+          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+
+      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+        /**< The number of columns at compile-time. This is just a copy of the value provided
+          * by the \a Derived type. If a value is not known at compile-time,
+          * it is set to the \a Dynamic constant.
+          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+
+
+      SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
+                                                   internal::traits<Derived>::ColsAtCompileTime>::ret),
+        /**< This is equal to the number of coefficients, i.e. the number of
+          * rows times the number of columns, or to \a Dynamic if this is not
+          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+
+      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+        /**< This value is equal to the maximum possible number of rows that this expression
+          * might have. If this expression might have an arbitrarily high number of rows,
+          * this value is set to \a Dynamic.
+          *
+          * This value is useful to know when evaluating an expression, in order to determine
+          * whether it is possible to avoid doing a dynamic memory allocation.
+          *
+          * \sa RowsAtCompileTime, MaxColsAtCompileTime, MaxSizeAtCompileTime
+          */
+
+      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime,
+        /**< This value is equal to the maximum possible number of columns that this expression
+          * might have. If this expression might have an arbitrarily high number of columns,
+          * this value is set to \a Dynamic.
+          *
+          * This value is useful to know when evaluating an expression, in order to determine
+          * whether it is possible to avoid doing a dynamic memory allocation.
+          *
+          * \sa ColsAtCompileTime, MaxRowsAtCompileTime, MaxSizeAtCompileTime
+          */
+
+      MaxSizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::MaxRowsAtCompileTime,
+                                                      internal::traits<Derived>::MaxColsAtCompileTime>::ret),
+        /**< This value is equal to the maximum possible number of coefficients that this expression
+          * might have. If this expression might have an arbitrarily high number of coefficients,
+          * this value is set to \a Dynamic.
+          *
+          * This value is useful to know when evaluating an expression, in order to determine
+          * whether it is possible to avoid doing a dynamic memory allocation.
+          *
+          * \sa SizeAtCompileTime, MaxRowsAtCompileTime, MaxColsAtCompileTime
+          */
+
+      IsVectorAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime == 1
+                           || internal::traits<Derived>::MaxColsAtCompileTime == 1,
+        /**< This is set to true if either the number of rows or the number of
+          * columns is known at compile-time to be equal to 1. Indeed, in that case,
+          * we are dealing with a column-vector (if there is only one column) or with
+          * a row-vector (if there is only one row). */
+
+      Flags = internal::traits<Derived>::Flags,
+        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
+          * constructed from this one. See the \ref flags "list of flags".
+          */
+
+      IsRowMajor = int(Flags) & RowMajorBit, /**< True if this expression has row-major storage order. */
+
+      InnerSizeAtCompileTime = int(IsVectorAtCompileTime) ? int(SizeAtCompileTime)
+                             : int(IsRowMajor) ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
+
+      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+        /**< This is a rough measure of how expensive it is to read one coefficient from
+          * this expression.
+          */
+
+      InnerStrideAtCompileTime = internal::inner_stride_at_compile_time<Derived>::ret,
+      OuterStrideAtCompileTime = internal::outer_stride_at_compile_time<Derived>::ret
+    };
+
+    enum { ThisConstantIsPrivateInPlainObjectBase };
+
+    /** \returns the number of nonzero coefficients which is in practice the number
+      * of stored coefficients. */
+    inline Index nonZeros() const { return size(); }
+    /** \returns true if either the number of rows or the number of columns is equal to 1.
+      * In other words, this function returns
+      * \code rows()==1 || cols()==1 \endcode
+      * \sa rows(), cols(), IsVectorAtCompileTime. */
+
+    /** \returns the outer size.
+      *
+      * \note For a vector, this returns just 1. For a matrix (non-vector), this is the major dimension
+      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of columns for a
+      * column-major matrix, and the number of rows for a row-major matrix. */
+    Index outerSize() const
+    {
+      return IsVectorAtCompileTime ? 1
+           : int(IsRowMajor) ? this->rows() : this->cols();
+    }
+
+    /** \returns the inner size.
+      *
+      * \note For a vector, this is just the size. For a matrix (non-vector), this is the minor dimension
+      * with respect to the \ref TopicStorageOrders "storage order", i.e., the number of rows for a 
+      * column-major matrix, and the number of columns for a row-major matrix. */
+    Index innerSize() const
+    {
+      return IsVectorAtCompileTime ? this->size()
+           : int(IsRowMajor) ? this->cols() : this->rows();
+    }
+
+    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
+      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
+      * nothing else.
+      */
+    void resize(Index newSize)
+    {
+      EIGEN_ONLY_USED_FOR_DEBUG(newSize);
+      eigen_assert(newSize == this->size()
+                && "DenseBase::resize() does not actually allow to resize.");
+    }
+    /** Only plain matrices/arrays, not expressions, may be resized; therefore the only useful resize methods are
+      * Matrix::resize() and Array::resize(). The present method only asserts that the new size equals the old size, and does
+      * nothing else.
+      */
+    void resize(Index nbRows, Index nbCols)
+    {
+      EIGEN_ONLY_USED_FOR_DEBUG(nbRows);
+      EIGEN_ONLY_USED_FOR_DEBUG(nbCols);
+      eigen_assert(nbRows == this->rows() && nbCols == this->cols()
+                && "DenseBase::resize() does not actually allow to resize.");
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+
+    /** \internal Represents a matrix with all coefficients equal to one another*/
+    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
+    /** \internal Represents a vector with linearly spaced coefficients that allows sequential access only. */
+    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,false>,Derived> SequentialLinSpacedReturnType;
+    /** \internal Represents a vector with linearly spaced coefficients that allows random access. */
+    typedef CwiseNullaryOp<internal::linspaced_op<Scalar,true>,Derived> RandomAccessLinSpacedReturnType;
+    /** \internal the return type of MatrixBase::eigenvalues() */
+    typedef Matrix<typename NumTraits<typename internal::traits<Derived>::Scalar>::Real, internal::traits<Derived>::ColsAtCompileTime, 1> EigenvaluesReturnType;
+
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+    /** Copies \a other into *this. \returns a reference to *this. */
+    template<typename OtherDerived>
+    Derived& operator=(const DenseBase<OtherDerived>& other);
+
+    /** Special case of the template operator=, in order to prevent the compiler
+      * from generating a default operator= (issue hit with g++ 4.1)
+      */
+    Derived& operator=(const DenseBase& other);
+
+    template<typename OtherDerived>
+    Derived& operator=(const EigenBase<OtherDerived> &other);
+
+    template<typename OtherDerived>
+    Derived& operator+=(const EigenBase<OtherDerived> &other);
+
+    template<typename OtherDerived>
+    Derived& operator-=(const EigenBase<OtherDerived> &other);
+
+    template<typename OtherDerived>
+    Derived& operator=(const ReturnByValue<OtherDerived>& func);
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** Copies \a other into *this without evaluating other. \returns a reference to *this. */
+    template<typename OtherDerived>
+    Derived& lazyAssign(const DenseBase<OtherDerived>& other);
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+    CommaInitializer<Derived> operator<< (const Scalar& s);
+
+    template<unsigned int Added,unsigned int Removed>
+    const Flagged<Derived, Added, Removed> flagged() const;
+
+    template<typename OtherDerived>
+    CommaInitializer<Derived> operator<< (const DenseBase<OtherDerived>& other);
+
+    Eigen::Transpose<Derived> transpose();
+    typedef const Transpose<const Derived> ConstTransposeReturnType;
+    ConstTransposeReturnType transpose() const;
+    void transposeInPlace();
+#ifndef EIGEN_NO_DEBUG
+  protected:
+    template<typename OtherDerived>
+    void checkTransposeAliasing(const OtherDerived& other) const;
+  public:
+#endif
+
+
+    static const ConstantReturnType
+    Constant(Index rows, Index cols, const Scalar& value);
+    static const ConstantReturnType
+    Constant(Index size, const Scalar& value);
+    static const ConstantReturnType
+    Constant(const Scalar& value);
+
+    static const SequentialLinSpacedReturnType
+    LinSpaced(Sequential_t, Index size, const Scalar& low, const Scalar& high);
+    static const RandomAccessLinSpacedReturnType
+    LinSpaced(Index size, const Scalar& low, const Scalar& high);
+    static const SequentialLinSpacedReturnType
+    LinSpaced(Sequential_t, const Scalar& low, const Scalar& high);
+    static const RandomAccessLinSpacedReturnType
+    LinSpaced(const Scalar& low, const Scalar& high);
+
+    template<typename CustomNullaryOp>
+    static const CwiseNullaryOp<CustomNullaryOp, Derived>
+    NullaryExpr(Index rows, Index cols, const CustomNullaryOp& func);
+    template<typename CustomNullaryOp>
+    static const CwiseNullaryOp<CustomNullaryOp, Derived>
+    NullaryExpr(Index size, const CustomNullaryOp& func);
+    template<typename CustomNullaryOp>
+    static const CwiseNullaryOp<CustomNullaryOp, Derived>
+    NullaryExpr(const CustomNullaryOp& func);
+
+    static const ConstantReturnType Zero(Index rows, Index cols);
+    static const ConstantReturnType Zero(Index size);
+    static const ConstantReturnType Zero();
+    static const ConstantReturnType Ones(Index rows, Index cols);
+    static const ConstantReturnType Ones(Index size);
+    static const ConstantReturnType Ones();
+
+    void fill(const Scalar& value);
+    Derived& setConstant(const Scalar& value);
+    Derived& setLinSpaced(Index size, const Scalar& low, const Scalar& high);
+    Derived& setLinSpaced(const Scalar& low, const Scalar& high);
+    Derived& setZero();
+    Derived& setOnes();
+    Derived& setRandom();
+
+    template<typename OtherDerived>
+    bool isApprox(const DenseBase<OtherDerived>& other,
+                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isMuchSmallerThan(const RealScalar& other,
+                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    template<typename OtherDerived>
+    bool isMuchSmallerThan(const DenseBase<OtherDerived>& other,
+                           const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+
+    bool isApproxToConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isConstant(const Scalar& value, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isZero(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isOnes(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    
+    inline bool hasNaN() const;
+    inline bool isFinite() const;
+
+    inline Derived& operator*=(const Scalar& other);
+    inline Derived& operator/=(const Scalar& other);
+
+    typedef typename internal::add_const_on_value_type<typename internal::eval<Derived>::type>::type EvalReturnType;
+    /** \returns the matrix or vector obtained by evaluating this expression.
+      *
+      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
+      * a const reference, in order to avoid a useless copy.
+      */
+    EIGEN_STRONG_INLINE EvalReturnType eval() const
+    {
+      // Even though MSVC does not honor strong inlining when the return type
+      // is a dynamic matrix, we desperately need strong inlining for fixed
+      // size types on MSVC.
+      return typename internal::eval<Derived>::type(derived());
+    }
+
+    /** swaps *this with the expression \a other.
+      *
+      */
+    template<typename OtherDerived>
+    void swap(const DenseBase<OtherDerived>& other,
+              int = OtherDerived::ThisConstantIsPrivateInPlainObjectBase)
+    {
+      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
+    }
+
+    /** swaps *this with the matrix or array \a other.
+      *
+      */
+    template<typename OtherDerived>
+    void swap(PlainObjectBase<OtherDerived>& other)
+    {
+      SwapWrapper<Derived>(derived()).lazyAssign(other.derived());
+    }
+
+
+    inline const NestByValue<Derived> nestByValue() const;
+    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
+    inline ForceAlignedAccess<Derived> forceAlignedAccess();
+    template<bool Enable> inline const typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf() const;
+    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
+
+    Scalar sum() const;
+    Scalar mean() const;
+    Scalar trace() const;
+
+    Scalar prod() const;
+
+    typename internal::traits<Derived>::Scalar minCoeff() const;
+    typename internal::traits<Derived>::Scalar maxCoeff() const;
+
+    template<typename IndexType>
+    typename internal::traits<Derived>::Scalar minCoeff(IndexType* row, IndexType* col) const;
+    template<typename IndexType>
+    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* row, IndexType* col) const;
+    template<typename IndexType>
+    typename internal::traits<Derived>::Scalar minCoeff(IndexType* index) const;
+    template<typename IndexType>
+    typename internal::traits<Derived>::Scalar maxCoeff(IndexType* index) const;
+
+    template<typename BinaryOp>
+    typename internal::result_of<BinaryOp(typename internal::traits<Derived>::Scalar)>::type
+    redux(const BinaryOp& func) const;
+
+    template<typename Visitor>
+    void visit(Visitor& func) const;
+
+    inline const WithFormat<Derived> format(const IOFormat& fmt) const;
+
+    /** \returns the unique coefficient of a 1x1 expression */
+    CoeffReturnType value() const
+    {
+      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
+      eigen_assert(this->rows() == 1 && this->cols() == 1);
+      return derived().coeff(0,0);
+    }
+
+    bool all(void) const;
+    bool any(void) const;
+    Index count() const;
+
+    typedef VectorwiseOp<Derived, Horizontal> RowwiseReturnType;
+    typedef const VectorwiseOp<const Derived, Horizontal> ConstRowwiseReturnType;
+    typedef VectorwiseOp<Derived, Vertical> ColwiseReturnType;
+    typedef const VectorwiseOp<const Derived, Vertical> ConstColwiseReturnType;
+
+    ConstRowwiseReturnType rowwise() const;
+    RowwiseReturnType rowwise();
+    ConstColwiseReturnType colwise() const;
+    ColwiseReturnType colwise();
+
+    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index rows, Index cols);
+    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random(Index size);
+    static const CwiseNullaryOp<internal::scalar_random_op<Scalar>,Derived> Random();
+
+    template<typename ThenDerived,typename ElseDerived>
+    const Select<Derived,ThenDerived,ElseDerived>
+    select(const DenseBase<ThenDerived>& thenMatrix,
+           const DenseBase<ElseDerived>& elseMatrix) const;
+
+    template<typename ThenDerived>
+    inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
+    select(const DenseBase<ThenDerived>& thenMatrix, const typename ThenDerived::Scalar& elseScalar) const;
+
+    template<typename ElseDerived>
+    inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
+    select(const typename ElseDerived::Scalar& thenScalar, const DenseBase<ElseDerived>& elseMatrix) const;
+
+    template<int p> RealScalar lpNorm() const;
+
+    template<int RowFactor, int ColFactor>
+    const Replicate<Derived,RowFactor,ColFactor> replicate() const;
+    const Replicate<Derived,Dynamic,Dynamic> replicate(Index rowFacor,Index colFactor) const;
+
+    typedef Reverse<Derived, BothDirections> ReverseReturnType;
+    typedef const Reverse<const Derived, BothDirections> ConstReverseReturnType;
+    ReverseReturnType reverse();
+    ConstReverseReturnType reverse() const;
+    void reverseInPlace();
+
+#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::DenseBase
+#   include "../plugins/BlockMethods.h"
+#   ifdef EIGEN_DENSEBASE_PLUGIN
+#     include EIGEN_DENSEBASE_PLUGIN
+#   endif
+#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
+
+#ifdef EIGEN2_SUPPORT
+
+    Block<Derived> corner(CornerType type, Index cRows, Index cCols);
+    const Block<Derived> corner(CornerType type, Index cRows, Index cCols) const;
+    template<int CRows, int CCols>
+    Block<Derived, CRows, CCols> corner(CornerType type);
+    template<int CRows, int CCols>
+    const Block<Derived, CRows, CCols> corner(CornerType type) const;
+
+#endif // EIGEN2_SUPPORT
+
+
+    // disable the use of evalTo for dense objects with a nice compilation error
+    template<typename Dest> inline void evalTo(Dest& ) const
+    {
+      EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
+    }
+
+  protected:
+    /** Default constructor. Do nothing. */
+    DenseBase()
+    {
+      /* Just checks for self-consistency of the flags.
+       * Only do it when debugging Eigen, as this borders on paranoiac and could slow compilation down
+       */
+#ifdef EIGEN_INTERNAL_DEBUGGING
+      EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, int(IsRowMajor))
+                        && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, int(!IsRowMajor))),
+                          INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION)
+#endif
+    }
+
+  private:
+    explicit DenseBase(int);
+    DenseBase(int,int);
+    template<typename OtherDerived> explicit DenseBase(const DenseBase<OtherDerived>&);
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_DENSEBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/DenseCoeffsBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/DenseCoeffsBase.h
new file mode 100644
index 0000000..3c890f2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/DenseCoeffsBase.h
@@ -0,0 +1,754 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DENSECOEFFSBASE_H
+#define EIGEN_DENSECOEFFSBASE_H
+
+namespace Eigen {
+
+namespace internal {
+template<typename T> struct add_const_on_value_type_if_arithmetic
+{
+  typedef typename conditional<is_arithmetic<T>::value, T, typename add_const_on_value_type<T>::type>::type type;
+};
+}
+
+/** \brief Base class providing read-only coefficient access to matrices and arrays.
+  * \ingroup Core_Module
+  * \tparam Derived Type of the derived class
+  * \tparam #ReadOnlyAccessors Constant indicating read-only access
+  *
+  * This class defines the \c operator() \c const function and friends, which can be used to read specific
+  * entries of a matrix or array.
+  * 
+  * \sa DenseCoeffsBase<Derived, WriteAccessors>, DenseCoeffsBase<Derived, DirectAccessors>,
+  *     \ref TopicClassHierarchy
+  */
+template<typename Derived>
+class DenseCoeffsBase<Derived,ReadOnlyAccessors> : public EigenBase<Derived>
+{
+  public:
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+
+    // Explanation for this CoeffReturnType typedef.
+    // - This is the return type of the coeff() method.
+    // - The LvalueBit means exactly that we can offer a coeffRef() method, which means exactly that we can get references
+    // to coeffs, which means exactly that we can have coeff() return a const reference (as opposed to returning a value).
+    // - The is_artihmetic check is required since "const int", "const double", etc. will cause warnings on some systems
+    // while the declaration of "const T", where T is a non arithmetic type does not. Always returning "const Scalar&" is
+    // not possible, since the underlying expressions might not offer a valid address the reference could be referring to.
+    typedef typename internal::conditional<bool(internal::traits<Derived>::Flags&LvalueBit),
+                         const Scalar&,
+                         typename internal::conditional<internal::is_arithmetic<Scalar>::value, Scalar, const Scalar>::type
+                     >::type CoeffReturnType;
+
+    typedef typename internal::add_const_on_value_type_if_arithmetic<
+                         typename internal::packet_traits<Scalar>::type
+                     >::type PacketReturnType;
+
+    typedef EigenBase<Derived> Base;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::derived;
+
+    EIGEN_STRONG_INLINE Index rowIndexByOuterInner(Index outer, Index inner) const
+    {
+      return int(Derived::RowsAtCompileTime) == 1 ? 0
+          : int(Derived::ColsAtCompileTime) == 1 ? inner
+          : int(Derived::Flags)&RowMajorBit ? outer
+          : inner;
+    }
+
+    EIGEN_STRONG_INLINE Index colIndexByOuterInner(Index outer, Index inner) const
+    {
+      return int(Derived::ColsAtCompileTime) == 1 ? 0
+          : int(Derived::RowsAtCompileTime) == 1 ? inner
+          : int(Derived::Flags)&RowMajorBit ? inner
+          : outer;
+    }
+
+    /** Short version: don't use this function, use
+      * \link operator()(Index,Index) const \endlink instead.
+      *
+      * Long version: this function is similar to
+      * \link operator()(Index,Index) const \endlink, but without the assertion.
+      * Use this for limiting the performance cost of debugging code when doing
+      * repeated coefficient access. Only use this when it is guaranteed that the
+      * parameters \a row and \a col are in range.
+      *
+      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+      * function equivalent to \link operator()(Index,Index) const \endlink.
+      *
+      * \sa operator()(Index,Index) const, coeffRef(Index,Index), coeff(Index) const
+      */
+    EIGEN_STRONG_INLINE CoeffReturnType coeff(Index row, Index col) const
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      return derived().coeff(row, col);
+    }
+
+    EIGEN_STRONG_INLINE CoeffReturnType coeffByOuterInner(Index outer, Index inner) const
+    {
+      return coeff(rowIndexByOuterInner(outer, inner),
+                   colIndexByOuterInner(outer, inner));
+    }
+
+    /** \returns the coefficient at given the given row and column.
+      *
+      * \sa operator()(Index,Index), operator[](Index)
+      */
+    EIGEN_STRONG_INLINE CoeffReturnType operator()(Index row, Index col) const
+    {
+      eigen_assert(row >= 0 && row < rows()
+          && col >= 0 && col < cols());
+      return derived().coeff(row, col);
+    }
+
+    /** Short version: don't use this function, use
+      * \link operator[](Index) const \endlink instead.
+      *
+      * Long version: this function is similar to
+      * \link operator[](Index) const \endlink, but without the assertion.
+      * Use this for limiting the performance cost of debugging code when doing
+      * repeated coefficient access. Only use this when it is guaranteed that the
+      * parameter \a index is in range.
+      *
+      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+      * function equivalent to \link operator[](Index) const \endlink.
+      *
+      * \sa operator[](Index) const, coeffRef(Index), coeff(Index,Index) const
+      */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    coeff(Index index) const
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      return derived().coeff(index);
+    }
+
+
+    /** \returns the coefficient at given index.
+      *
+      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+      *
+      * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
+      * z() const, w() const
+      */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    operator[](Index index) const
+    {
+      #ifndef EIGEN2_SUPPORT
+      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
+                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
+      #endif
+      eigen_assert(index >= 0 && index < size());
+      return derived().coeff(index);
+    }
+
+    /** \returns the coefficient at given index.
+      *
+      * This is synonymous to operator[](Index) const.
+      *
+      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+      *
+      * \sa operator[](Index), operator()(Index,Index) const, x() const, y() const,
+      * z() const, w() const
+      */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    operator()(Index index) const
+    {
+      eigen_assert(index >= 0 && index < size());
+      return derived().coeff(index);
+    }
+
+    /** equivalent to operator[](0).  */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    x() const { return (*this)[0]; }
+
+    /** equivalent to operator[](1).  */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    y() const { return (*this)[1]; }
+
+    /** equivalent to operator[](2).  */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    z() const { return (*this)[2]; }
+
+    /** equivalent to operator[](3).  */
+
+    EIGEN_STRONG_INLINE CoeffReturnType
+    w() const { return (*this)[3]; }
+
+    /** \internal
+      * \returns the packet of coefficients starting at the given row and column. It is your responsibility
+      * to ensure that a packet really starts there. This method is only available on expressions having the
+      * PacketAccessBit.
+      *
+      * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
+      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+      * starting at an address which is a multiple of the packet size.
+      */
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketReturnType packet(Index row, Index col) const
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                      && col >= 0 && col < cols());
+      return derived().template packet<LoadMode>(row,col);
+    }
+
+
+    /** \internal */
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketReturnType packetByOuterInner(Index outer, Index inner) const
+    {
+      return packet<LoadMode>(rowIndexByOuterInner(outer, inner),
+                              colIndexByOuterInner(outer, inner));
+    }
+
+    /** \internal
+      * \returns the packet of coefficients starting at the given index. It is your responsibility
+      * to ensure that a packet really starts there. This method is only available on expressions having the
+      * PacketAccessBit and the LinearAccessBit.
+      *
+      * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
+      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+      * starting at an address which is a multiple of the packet size.
+      */
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketReturnType packet(Index index) const
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      return derived().template packet<LoadMode>(index);
+    }
+
+  protected:
+    // explanation: DenseBase is doing "using ..." on the methods from DenseCoeffsBase.
+    // But some methods are only available in the DirectAccess case.
+    // So we add dummy methods here with these names, so that "using... " doesn't fail.
+    // It's not private so that the child class DenseBase can access them, and it's not public
+    // either since it's an implementation detail, so has to be protected.
+    void coeffRef();
+    void coeffRefByOuterInner();
+    void writePacket();
+    void writePacketByOuterInner();
+    void copyCoeff();
+    void copyCoeffByOuterInner();
+    void copyPacket();
+    void copyPacketByOuterInner();
+    void stride();
+    void innerStride();
+    void outerStride();
+    void rowStride();
+    void colStride();
+};
+
+/** \brief Base class providing read/write coefficient access to matrices and arrays.
+  * \ingroup Core_Module
+  * \tparam Derived Type of the derived class
+  * \tparam #WriteAccessors Constant indicating read/write access
+  *
+  * This class defines the non-const \c operator() function and friends, which can be used to write specific
+  * entries of a matrix or array. This class inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which
+  * defines the const variant for reading specific entries.
+  * 
+  * \sa DenseCoeffsBase<Derived, DirectAccessors>, \ref TopicClassHierarchy
+  */
+template<typename Derived>
+class DenseCoeffsBase<Derived, WriteAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
+{
+  public:
+
+    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
+
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    using Base::coeff;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::derived;
+    using Base::rowIndexByOuterInner;
+    using Base::colIndexByOuterInner;
+    using Base::operator[];
+    using Base::operator();
+    using Base::x;
+    using Base::y;
+    using Base::z;
+    using Base::w;
+
+    /** Short version: don't use this function, use
+      * \link operator()(Index,Index) \endlink instead.
+      *
+      * Long version: this function is similar to
+      * \link operator()(Index,Index) \endlink, but without the assertion.
+      * Use this for limiting the performance cost of debugging code when doing
+      * repeated coefficient access. Only use this when it is guaranteed that the
+      * parameters \a row and \a col are in range.
+      *
+      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+      * function equivalent to \link operator()(Index,Index) \endlink.
+      *
+      * \sa operator()(Index,Index), coeff(Index, Index) const, coeffRef(Index)
+      */
+    EIGEN_STRONG_INLINE Scalar& coeffRef(Index row, Index col)
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      return derived().coeffRef(row, col);
+    }
+
+    EIGEN_STRONG_INLINE Scalar&
+    coeffRefByOuterInner(Index outer, Index inner)
+    {
+      return coeffRef(rowIndexByOuterInner(outer, inner),
+                      colIndexByOuterInner(outer, inner));
+    }
+
+    /** \returns a reference to the coefficient at given the given row and column.
+      *
+      * \sa operator[](Index)
+      */
+
+    EIGEN_STRONG_INLINE Scalar&
+    operator()(Index row, Index col)
+    {
+      eigen_assert(row >= 0 && row < rows()
+          && col >= 0 && col < cols());
+      return derived().coeffRef(row, col);
+    }
+
+
+    /** Short version: don't use this function, use
+      * \link operator[](Index) \endlink instead.
+      *
+      * Long version: this function is similar to
+      * \link operator[](Index) \endlink, but without the assertion.
+      * Use this for limiting the performance cost of debugging code when doing
+      * repeated coefficient access. Only use this when it is guaranteed that the
+      * parameters \a row and \a col are in range.
+      *
+      * If EIGEN_INTERNAL_DEBUGGING is defined, an assertion will be made, making this
+      * function equivalent to \link operator[](Index) \endlink.
+      *
+      * \sa operator[](Index), coeff(Index) const, coeffRef(Index,Index)
+      */
+
+    EIGEN_STRONG_INLINE Scalar&
+    coeffRef(Index index)
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      return derived().coeffRef(index);
+    }
+
+    /** \returns a reference to the coefficient at given index.
+      *
+      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+      *
+      * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
+      */
+
+    EIGEN_STRONG_INLINE Scalar&
+    operator[](Index index)
+    {
+      #ifndef EIGEN2_SUPPORT
+      EIGEN_STATIC_ASSERT(Derived::IsVectorAtCompileTime,
+                          THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD)
+      #endif
+      eigen_assert(index >= 0 && index < size());
+      return derived().coeffRef(index);
+    }
+
+    /** \returns a reference to the coefficient at given index.
+      *
+      * This is synonymous to operator[](Index).
+      *
+      * This method is allowed only for vector expressions, and for matrix expressions having the LinearAccessBit.
+      *
+      * \sa operator[](Index) const, operator()(Index,Index), x(), y(), z(), w()
+      */
+
+    EIGEN_STRONG_INLINE Scalar&
+    operator()(Index index)
+    {
+      eigen_assert(index >= 0 && index < size());
+      return derived().coeffRef(index);
+    }
+
+    /** equivalent to operator[](0).  */
+
+    EIGEN_STRONG_INLINE Scalar&
+    x() { return (*this)[0]; }
+
+    /** equivalent to operator[](1).  */
+
+    EIGEN_STRONG_INLINE Scalar&
+    y() { return (*this)[1]; }
+
+    /** equivalent to operator[](2).  */
+
+    EIGEN_STRONG_INLINE Scalar&
+    z() { return (*this)[2]; }
+
+    /** equivalent to operator[](3).  */
+
+    EIGEN_STRONG_INLINE Scalar&
+    w() { return (*this)[3]; }
+
+    /** \internal
+      * Stores the given packet of coefficients, at the given row and column of this expression. It is your responsibility
+      * to ensure that a packet really starts there. This method is only available on expressions having the
+      * PacketAccessBit.
+      *
+      * The \a LoadMode parameter may have the value \a #Aligned or \a #Unaligned. Its effect is to select
+      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+      * starting at an address which is a multiple of the packet size.
+      */
+
+    template<int StoreMode>
+    EIGEN_STRONG_INLINE void writePacket
+    (Index row, Index col, const typename internal::packet_traits<Scalar>::type& val)
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      derived().template writePacket<StoreMode>(row,col,val);
+    }
+
+
+    /** \internal */
+    template<int StoreMode>
+    EIGEN_STRONG_INLINE void writePacketByOuterInner
+    (Index outer, Index inner, const typename internal::packet_traits<Scalar>::type& val)
+    {
+      writePacket<StoreMode>(rowIndexByOuterInner(outer, inner),
+                            colIndexByOuterInner(outer, inner),
+                            val);
+    }
+
+    /** \internal
+      * Stores the given packet of coefficients, at the given index in this expression. It is your responsibility
+      * to ensure that a packet really starts there. This method is only available on expressions having the
+      * PacketAccessBit and the LinearAccessBit.
+      *
+      * The \a LoadMode parameter may have the value \a Aligned or \a Unaligned. Its effect is to select
+      * the appropriate vectorization instruction. Aligned access is faster, but is only possible for packets
+      * starting at an address which is a multiple of the packet size.
+      */
+    template<int StoreMode>
+    EIGEN_STRONG_INLINE void writePacket
+    (Index index, const typename internal::packet_traits<Scalar>::type& val)
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      derived().template writePacket<StoreMode>(index,val);
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+
+    /** \internal Copies the coefficient at position (row,col) of other into *this.
+      *
+      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
+      * with usual assignments.
+      *
+      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
+      */
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other)
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      derived().coeffRef(row, col) = other.derived().coeff(row, col);
+    }
+
+    /** \internal Copies the coefficient at the given index of other into *this.
+      *
+      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
+      * with usual assignments.
+      *
+      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
+      */
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      derived().coeffRef(index) = other.derived().coeff(index);
+    }
+
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void copyCoeffByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other)
+    {
+      const Index row = rowIndexByOuterInner(outer,inner);
+      const Index col = colIndexByOuterInner(outer,inner);
+      // derived() is important here: copyCoeff() may be reimplemented in Derived!
+      derived().copyCoeff(row, col, other);
+    }
+
+    /** \internal Copies the packet at position (row,col) of other into *this.
+      *
+      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
+      * with usual assignments.
+      *
+      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
+      */
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    EIGEN_STRONG_INLINE void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other)
+    {
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      derived().template writePacket<StoreMode>(row, col,
+        other.derived().template packet<LoadMode>(row, col));
+    }
+
+    /** \internal Copies the packet at the given index of other into *this.
+      *
+      * This method is overridden in SwapWrapper, allowing swap() assignments to share 99% of their code
+      * with usual assignments.
+      *
+      * Outside of this internal usage, this method has probably no usefulness. It is hidden in the public API dox.
+      */
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    EIGEN_STRONG_INLINE void copyPacket(Index index, const DenseBase<OtherDerived>& other)
+    {
+      eigen_internal_assert(index >= 0 && index < size());
+      derived().template writePacket<StoreMode>(index,
+        other.derived().template packet<LoadMode>(index));
+    }
+
+    /** \internal */
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    EIGEN_STRONG_INLINE void copyPacketByOuterInner(Index outer, Index inner, const DenseBase<OtherDerived>& other)
+    {
+      const Index row = rowIndexByOuterInner(outer,inner);
+      const Index col = colIndexByOuterInner(outer,inner);
+      // derived() is important here: copyCoeff() may be reimplemented in Derived!
+      derived().template copyPacket< OtherDerived, StoreMode, LoadMode>(row, col, other);
+    }
+#endif
+
+};
+
+/** \brief Base class providing direct read-only coefficient access to matrices and arrays.
+  * \ingroup Core_Module
+  * \tparam Derived Type of the derived class
+  * \tparam #DirectAccessors Constant indicating direct access
+  *
+  * This class defines functions to work with strides which can be used to access entries directly. This class
+  * inherits DenseCoeffsBase<Derived, ReadOnlyAccessors> which defines functions to access entries read-only using
+  * \c operator() .
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+template<typename Derived>
+class DenseCoeffsBase<Derived, DirectAccessors> : public DenseCoeffsBase<Derived, ReadOnlyAccessors>
+{
+  public:
+
+    typedef DenseCoeffsBase<Derived, ReadOnlyAccessors> Base;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::derived;
+
+    /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
+      *
+      * \sa outerStride(), rowStride(), colStride()
+      */
+    inline Index innerStride() const
+    {
+      return derived().innerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
+      *          in a column-major matrix).
+      *
+      * \sa innerStride(), rowStride(), colStride()
+      */
+    inline Index outerStride() const
+    {
+      return derived().outerStride();
+    }
+
+    // FIXME shall we remove it ?
+    inline Index stride() const
+    {
+      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive rows.
+      *
+      * \sa innerStride(), outerStride(), colStride()
+      */
+    inline Index rowStride() const
+    {
+      return Derived::IsRowMajor ? outerStride() : innerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive columns.
+      *
+      * \sa innerStride(), outerStride(), rowStride()
+      */
+    inline Index colStride() const
+    {
+      return Derived::IsRowMajor ? innerStride() : outerStride();
+    }
+};
+
+/** \brief Base class providing direct read/write coefficient access to matrices and arrays.
+  * \ingroup Core_Module
+  * \tparam Derived Type of the derived class
+  * \tparam #DirectWriteAccessors Constant indicating direct access
+  *
+  * This class defines functions to work with strides which can be used to access entries directly. This class
+  * inherits DenseCoeffsBase<Derived, WriteAccessors> which defines functions to access entries read/write using
+  * \c operator().
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+template<typename Derived>
+class DenseCoeffsBase<Derived, DirectWriteAccessors>
+  : public DenseCoeffsBase<Derived, WriteAccessors>
+{
+  public:
+
+    typedef DenseCoeffsBase<Derived, WriteAccessors> Base;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::derived;
+
+    /** \returns the pointer increment between two consecutive elements within a slice in the inner direction.
+      *
+      * \sa outerStride(), rowStride(), colStride()
+      */
+    inline Index innerStride() const
+    {
+      return derived().innerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive inner slices (for example, between two consecutive columns
+      *          in a column-major matrix).
+      *
+      * \sa innerStride(), rowStride(), colStride()
+      */
+    inline Index outerStride() const
+    {
+      return derived().outerStride();
+    }
+
+    // FIXME shall we remove it ?
+    inline Index stride() const
+    {
+      return Derived::IsVectorAtCompileTime ? innerStride() : outerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive rows.
+      *
+      * \sa innerStride(), outerStride(), colStride()
+      */
+    inline Index rowStride() const
+    {
+      return Derived::IsRowMajor ? outerStride() : innerStride();
+    }
+
+    /** \returns the pointer increment between two consecutive columns.
+      *
+      * \sa innerStride(), outerStride(), rowStride()
+      */
+    inline Index colStride() const
+    {
+      return Derived::IsRowMajor ? innerStride() : outerStride();
+    }
+};
+
+namespace internal {
+
+template<typename Derived, bool JustReturnZero>
+struct first_aligned_impl
+{
+  static inline typename Derived::Index run(const Derived&)
+  { return 0; }
+};
+
+template<typename Derived>
+struct first_aligned_impl<Derived, false>
+{
+  static inline typename Derived::Index run(const Derived& m)
+  {
+    return internal::first_aligned(&m.const_cast_derived().coeffRef(0,0), m.size());
+  }
+};
+
+/** \internal \returns the index of the first element of the array that is well aligned for vectorization.
+  *
+  * There is also the variant first_aligned(const Scalar*, Integer) defined in Memory.h. See it for more
+  * documentation.
+  */
+template<typename Derived>
+static inline typename Derived::Index first_aligned(const Derived& m)
+{
+  return first_aligned_impl
+          <Derived, (Derived::Flags & AlignedBit) || !(Derived::Flags & DirectAccessBit)>
+          ::run(m);
+}
+
+template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
+struct inner_stride_at_compile_time
+{
+  enum { ret = traits<Derived>::InnerStrideAtCompileTime };
+};
+
+template<typename Derived>
+struct inner_stride_at_compile_time<Derived, false>
+{
+  enum { ret = 0 };
+};
+
+template<typename Derived, bool HasDirectAccess = has_direct_access<Derived>::ret>
+struct outer_stride_at_compile_time
+{
+  enum { ret = traits<Derived>::OuterStrideAtCompileTime };
+};
+
+template<typename Derived>
+struct outer_stride_at_compile_time<Derived, false>
+{
+  enum { ret = 0 };
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_DENSECOEFFSBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/DenseStorage.h b/vendor/eigen-3.1.91/Eigen/src/Core/DenseStorage.h
new file mode 100644
index 0000000..894dcf2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/DenseStorage.h
@@ -0,0 +1,331 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2010 Hauke Heibel <hauke.heibel at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MATRIXSTORAGE_H
+#define EIGEN_MATRIXSTORAGE_H
+
+#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN EIGEN_DENSE_STORAGE_CTOR_PLUGIN;
+#else
+  #define EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
+#endif
+
+namespace Eigen {
+
+namespace internal {
+
+struct constructor_without_unaligned_array_assert {};
+
+/** \internal
+  * Static array. If the MatrixOrArrayOptions require auto-alignment, the array will be automatically aligned:
+  * to 16 bytes boundary if the total size is a multiple of 16 bytes.
+  */
+template <typename T, int Size, int MatrixOrArrayOptions,
+          int Alignment = (MatrixOrArrayOptions&DontAlign) ? 0
+                        : (((Size*sizeof(T))%16)==0) ? 16
+                        : 0 >
+struct plain_array
+{
+  T array[Size];
+
+  plain_array() 
+  { 
+    EIGEN_STATIC_ASSERT(Size * sizeof(T) <= 128 * 128 * 8, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG);
+  }
+
+  plain_array(constructor_without_unaligned_array_assert) 
+  { 
+    EIGEN_STATIC_ASSERT(Size * sizeof(T) <= 128 * 128 * 8, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG);
+  }
+};
+
+#if defined(EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT)
+  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask)
+#elif EIGEN_GNUC_AT_LEAST(4,7) 
+  // GCC 4.7 is too aggressive in its optimizations and remove the alignement test based on the fact the array is declared to be aligned.
+  // See this bug report: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53900
+  // Hiding the origin of the array pointer behind a function argument seems to do the trick even if the function is inlined:
+  template<typename PtrType>
+  EIGEN_ALWAYS_INLINE PtrType eigen_unaligned_array_assert_workaround_gcc47(PtrType array) { return array; }
+  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
+    eigen_assert((reinterpret_cast<size_t>(eigen_unaligned_array_assert_workaround_gcc47(array)) & sizemask) == 0 \
+              && "this assertion is explained here: " \
+              "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
+              " **** READ THIS WEB PAGE !!! ****");
+#else
+  #define EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(sizemask) \
+    eigen_assert((reinterpret_cast<size_t>(array) & sizemask) == 0 \
+              && "this assertion is explained here: " \
+              "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" \
+              " **** READ THIS WEB PAGE !!! ****");
+#endif
+
+template <typename T, int Size, int MatrixOrArrayOptions>
+struct plain_array<T, Size, MatrixOrArrayOptions, 16>
+{
+  EIGEN_USER_ALIGN16 T array[Size];
+
+  plain_array() 
+  { 
+    EIGEN_MAKE_UNALIGNED_ARRAY_ASSERT(0xf);
+    EIGEN_STATIC_ASSERT(Size * sizeof(T) <= 128 * 128 * 8, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG);
+  }
+
+  plain_array(constructor_without_unaligned_array_assert) 
+  { 
+    EIGEN_STATIC_ASSERT(Size * sizeof(T) <= 128 * 128 * 8, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG);
+  }
+};
+
+template <typename T, int MatrixOrArrayOptions, int Alignment>
+struct plain_array<T, 0, MatrixOrArrayOptions, Alignment>
+{
+  EIGEN_USER_ALIGN16 T array[1];
+  plain_array() {}
+  plain_array(constructor_without_unaligned_array_assert) {}
+};
+
+} // end namespace internal
+
+/** \internal
+  *
+  * \class DenseStorage
+  * \ingroup Core_Module
+  *
+  * \brief Stores the data of a matrix
+  *
+  * This class stores the data of fixed-size, dynamic-size or mixed matrices
+  * in a way as compact as possible.
+  *
+  * \sa Matrix
+  */
+template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage;
+
+// purely fixed-size matrix
+template<typename T, int Size, int _Rows, int _Cols, int _Options> class DenseStorage
+{
+    internal::plain_array<T,Size,_Options> m_data;
+  public:
+    inline explicit DenseStorage() {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()) {}
+    inline DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}
+    inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); }
+    static inline DenseIndex rows(void) {return _Rows;}
+    static inline DenseIndex cols(void) {return _Cols;}
+    inline void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}
+    inline void resize(DenseIndex,DenseIndex,DenseIndex) {}
+    inline const T *data() const { return m_data.array; }
+    inline T *data() { return m_data.array; }
+};
+
+// null matrix
+template<typename T, int _Rows, int _Cols, int _Options> class DenseStorage<T, 0, _Rows, _Cols, _Options>
+{
+  public:
+    inline explicit DenseStorage() {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert) {}
+    inline DenseStorage(DenseIndex,DenseIndex,DenseIndex) {}
+    inline void swap(DenseStorage& ) {}
+    static inline DenseIndex rows(void) {return _Rows;}
+    static inline DenseIndex cols(void) {return _Cols;}
+    inline void conservativeResize(DenseIndex,DenseIndex,DenseIndex) {}
+    inline void resize(DenseIndex,DenseIndex,DenseIndex) {}
+    inline const T *data() const { return 0; }
+    inline T *data() { return 0; }
+};
+
+// more specializations for null matrices; these are necessary to resolve ambiguities
+template<typename T, int _Options> class DenseStorage<T, 0, Dynamic, Dynamic, _Options>
+: public DenseStorage<T, 0, 0, 0, _Options> { };
+
+template<typename T, int _Rows, int _Options> class DenseStorage<T, 0, _Rows, Dynamic, _Options>
+: public DenseStorage<T, 0, 0, 0, _Options> { };
+
+template<typename T, int _Cols, int _Options> class DenseStorage<T, 0, Dynamic, _Cols, _Options>
+: public DenseStorage<T, 0, 0, 0, _Options> { };
+
+// dynamic-size matrix with fixed-size storage
+template<typename T, int Size, int _Options> class DenseStorage<T, Size, Dynamic, Dynamic, _Options>
+{
+    internal::plain_array<T,Size,_Options> m_data;
+    DenseIndex m_rows;
+    DenseIndex m_cols;
+  public:
+    inline explicit DenseStorage() : m_rows(0), m_cols(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0), m_cols(0) {}
+    inline DenseStorage(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) : m_rows(nbRows), m_cols(nbCols) {}
+    inline void swap(DenseStorage& other)
+    { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
+    inline DenseIndex rows() const {return m_rows;}
+    inline DenseIndex cols() const {return m_cols;}
+    inline void conservativeResize(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) { m_rows = nbRows; m_cols = nbCols; }
+    inline void resize(DenseIndex, DenseIndex nbRows, DenseIndex nbCols) { m_rows = nbRows; m_cols = nbCols; }
+    inline const T *data() const { return m_data.array; }
+    inline T *data() { return m_data.array; }
+};
+
+// dynamic-size matrix with fixed-size storage and fixed width
+template<typename T, int Size, int _Cols, int _Options> class DenseStorage<T, Size, Dynamic, _Cols, _Options>
+{
+    internal::plain_array<T,Size,_Options> m_data;
+    DenseIndex m_rows;
+  public:
+    inline explicit DenseStorage() : m_rows(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_rows(0) {}
+    inline DenseStorage(DenseIndex, DenseIndex nbRows, DenseIndex) : m_rows(nbRows) {}
+    inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
+    inline DenseIndex rows(void) const {return m_rows;}
+    inline DenseIndex cols(void) const {return _Cols;}
+    inline void conservativeResize(DenseIndex, DenseIndex nbRows, DenseIndex) { m_rows = nbRows; }
+    inline void resize(DenseIndex, DenseIndex nbRows, DenseIndex) { m_rows = nbRows; }
+    inline const T *data() const { return m_data.array; }
+    inline T *data() { return m_data.array; }
+};
+
+// dynamic-size matrix with fixed-size storage and fixed height
+template<typename T, int Size, int _Rows, int _Options> class DenseStorage<T, Size, _Rows, Dynamic, _Options>
+{
+    internal::plain_array<T,Size,_Options> m_data;
+    DenseIndex m_cols;
+  public:
+    inline explicit DenseStorage() : m_cols(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert)
+      : m_data(internal::constructor_without_unaligned_array_assert()), m_cols(0) {}
+    inline DenseStorage(DenseIndex, DenseIndex, DenseIndex nbCols) : m_cols(nbCols) {}
+    inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
+    inline DenseIndex rows(void) const {return _Rows;}
+    inline DenseIndex cols(void) const {return m_cols;}
+    inline void conservativeResize(DenseIndex, DenseIndex, DenseIndex nbCols) { m_cols = nbCols; }
+    inline void resize(DenseIndex, DenseIndex, DenseIndex nbCols) { m_cols = nbCols; }
+    inline const T *data() const { return m_data.array; }
+    inline T *data() { return m_data.array; }
+};
+
+// purely dynamic matrix.
+template<typename T, int _Options> class DenseStorage<T, Dynamic, Dynamic, Dynamic, _Options>
+{
+    T *m_data;
+    DenseIndex m_rows;
+    DenseIndex m_cols;
+  public:
+    inline explicit DenseStorage() : m_data(0), m_rows(0), m_cols(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert)
+       : m_data(0), m_rows(0), m_cols(0) {}
+    inline DenseStorage(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)
+      : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(nbRows), m_cols(nbCols)
+    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
+    inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols); }
+    inline void swap(DenseStorage& other)
+    { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); std::swap(m_cols,other.m_cols); }
+    inline DenseIndex rows(void) const {return m_rows;}
+    inline DenseIndex cols(void) const {return m_cols;}
+    inline void conservativeResize(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)
+    {
+      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*m_cols);
+      m_rows = nbRows;
+      m_cols = nbCols;
+    }
+    void resize(DenseIndex size, DenseIndex nbRows, DenseIndex nbCols)
+    {
+      if(size != m_rows*m_cols)
+      {
+        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, m_rows*m_cols);
+        if (size)
+          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
+        else
+          m_data = 0;
+        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
+      }
+      m_rows = nbRows;
+      m_cols = nbCols;
+    }
+    inline const T *data() const { return m_data; }
+    inline T *data() { return m_data; }
+};
+
+// matrix with dynamic width and fixed height (so that matrix has dynamic size).
+template<typename T, int _Rows, int _Options> class DenseStorage<T, Dynamic, _Rows, Dynamic, _Options>
+{
+    T *m_data;
+    DenseIndex m_cols;
+  public:
+    inline explicit DenseStorage() : m_data(0), m_cols(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_cols(0) {}
+    inline DenseStorage(DenseIndex size, DenseIndex, DenseIndex nbCols) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_cols(nbCols)
+    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
+    inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols); }
+    inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_cols,other.m_cols); }
+    static inline DenseIndex rows(void) {return _Rows;}
+    inline DenseIndex cols(void) const {return m_cols;}
+    inline void conservativeResize(DenseIndex size, DenseIndex, DenseIndex nbCols)
+    {
+      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, _Rows*m_cols);
+      m_cols = nbCols;
+    }
+    EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex, DenseIndex nbCols)
+    {
+      if(size != _Rows*m_cols)
+      {
+        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Rows*m_cols);
+        if (size)
+          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
+        else
+          m_data = 0;
+        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
+      }
+      m_cols = nbCols;
+    }
+    inline const T *data() const { return m_data; }
+    inline T *data() { return m_data; }
+};
+
+// matrix with dynamic height and fixed width (so that matrix has dynamic size).
+template<typename T, int _Cols, int _Options> class DenseStorage<T, Dynamic, Dynamic, _Cols, _Options>
+{
+    T *m_data;
+    DenseIndex m_rows;
+  public:
+    inline explicit DenseStorage() : m_data(0), m_rows(0) {}
+    inline DenseStorage(internal::constructor_without_unaligned_array_assert) : m_data(0), m_rows(0) {}
+    inline DenseStorage(DenseIndex size, DenseIndex nbRows, DenseIndex) : m_data(internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size)), m_rows(nbRows)
+    { EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN }
+    inline ~DenseStorage() { internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows); }
+    inline void swap(DenseStorage& other) { std::swap(m_data,other.m_data); std::swap(m_rows,other.m_rows); }
+    inline DenseIndex rows(void) const {return m_rows;}
+    static inline DenseIndex cols(void) {return _Cols;}
+    inline void conservativeResize(DenseIndex size, DenseIndex nbRows, DenseIndex)
+    {
+      m_data = internal::conditional_aligned_realloc_new_auto<T,(_Options&DontAlign)==0>(m_data, size, m_rows*_Cols);
+      m_rows = nbRows;
+    }
+    EIGEN_STRONG_INLINE void resize(DenseIndex size, DenseIndex nbRows, DenseIndex)
+    {
+      if(size != m_rows*_Cols)
+      {
+        internal::conditional_aligned_delete_auto<T,(_Options&DontAlign)==0>(m_data, _Cols*m_rows);
+        if (size)
+          m_data = internal::conditional_aligned_new_auto<T,(_Options&DontAlign)==0>(size);
+        else
+          m_data = 0;
+        EIGEN_INTERNAL_DENSE_STORAGE_CTOR_PLUGIN
+      }
+      m_rows = nbRows;
+    }
+    inline const T *data() const { return m_data; }
+    inline T *data() { return m_data; }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Diagonal.h b/vendor/eigen-3.1.91/Eigen/src/Core/Diagonal.h
new file mode 100644
index 0000000..0927e99
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Diagonal.h
@@ -0,0 +1,237 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DIAGONAL_H
+#define EIGEN_DIAGONAL_H
+
+namespace Eigen { 
+
+/** \class Diagonal
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a diagonal/subdiagonal/superdiagonal in a matrix
+  *
+  * \param MatrixType the type of the object in which we are taking a sub/main/super diagonal
+  * \param DiagIndex the index of the sub/super diagonal. The default is 0 and it means the main diagonal.
+  *              A positive value means a superdiagonal, a negative value means a subdiagonal.
+  *              You can also use Dynamic so the index can be set at runtime.
+  *
+  * The matrix is not required to be square.
+  *
+  * This class represents an expression of the main diagonal, or any sub/super diagonal
+  * of a square matrix. It is the return type of MatrixBase::diagonal() and MatrixBase::diagonal(Index) and most of the
+  * time this is the only way it is used.
+  *
+  * \sa MatrixBase::diagonal(), MatrixBase::diagonal(Index)
+  */
+
+namespace internal {
+template<typename MatrixType, int DiagIndex>
+struct traits<Diagonal<MatrixType,DiagIndex> >
+ : traits<MatrixType>
+{
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+  typedef typename MatrixType::StorageKind StorageKind;
+  enum {
+    RowsAtCompileTime = (int(DiagIndex) == DynamicIndex || int(MatrixType::SizeAtCompileTime) == Dynamic) ? Dynamic
+                      : (EIGEN_PLAIN_ENUM_MIN(MatrixType::RowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
+                                              MatrixType::ColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),
+    ColsAtCompileTime = 1,
+    MaxRowsAtCompileTime = int(MatrixType::MaxSizeAtCompileTime) == Dynamic ? Dynamic
+                         : DiagIndex == DynamicIndex ? EIGEN_SIZE_MIN_PREFER_FIXED(MatrixType::MaxRowsAtCompileTime,
+                                                                              MatrixType::MaxColsAtCompileTime)
+                         : (EIGEN_PLAIN_ENUM_MIN(MatrixType::MaxRowsAtCompileTime - EIGEN_PLAIN_ENUM_MAX(-DiagIndex, 0),
+                                                 MatrixType::MaxColsAtCompileTime - EIGEN_PLAIN_ENUM_MAX( DiagIndex, 0))),
+    MaxColsAtCompileTime = 1,
+    MaskLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
+    Flags = (unsigned int)_MatrixTypeNested::Flags & (HereditaryBits | LinearAccessBit | MaskLvalueBit | DirectAccessBit) & ~RowMajorBit,
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost,
+    MatrixTypeOuterStride = outer_stride_at_compile_time<MatrixType>::ret,
+    InnerStrideAtCompileTime = MatrixTypeOuterStride == Dynamic ? Dynamic : MatrixTypeOuterStride+1,
+    OuterStrideAtCompileTime = 0
+  };
+};
+}
+
+template<typename MatrixType, int _DiagIndex> class Diagonal
+   : public internal::dense_xpr_base< Diagonal<MatrixType,_DiagIndex> >::type
+{
+  public:
+
+    enum { DiagIndex = _DiagIndex };
+    typedef typename internal::dense_xpr_base<Diagonal>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Diagonal)
+
+    inline Diagonal(MatrixType& matrix, Index a_index = DiagIndex) : m_matrix(matrix), m_index(a_index) {}
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Diagonal)
+
+    inline Index rows() const
+    { return m_index.value()<0 ? (std::min)(m_matrix.cols(),m_matrix.rows()+m_index.value()) : (std::min)(m_matrix.rows(),m_matrix.cols()-m_index.value()); }
+
+    inline Index cols() const { return 1; }
+
+    inline Index innerStride() const
+    {
+      return m_matrix.outerStride() + 1;
+    }
+
+    inline Index outerStride() const
+    {
+      return 0;
+    }
+
+    typedef typename internal::conditional<
+                       internal::is_lvalue<MatrixType>::value,
+                       Scalar,
+                       const Scalar
+                     >::type ScalarWithConstIfNotLvalue;
+
+    inline ScalarWithConstIfNotLvalue* data() { return &(m_matrix.const_cast_derived().coeffRef(rowOffset(), colOffset())); }
+    inline const Scalar* data() const { return &(m_matrix.const_cast_derived().coeffRef(rowOffset(), colOffset())); }
+
+    inline Scalar& coeffRef(Index row, Index)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+      return m_matrix.const_cast_derived().coeffRef(row+rowOffset(), row+colOffset());
+    }
+
+    inline const Scalar& coeffRef(Index row, Index) const
+    {
+      return m_matrix.const_cast_derived().coeffRef(row+rowOffset(), row+colOffset());
+    }
+
+    inline CoeffReturnType coeff(Index row, Index) const
+    {
+      return m_matrix.coeff(row+rowOffset(), row+colOffset());
+    }
+
+    inline Scalar& coeffRef(Index idx)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+      return m_matrix.const_cast_derived().coeffRef(idx+rowOffset(), idx+colOffset());
+    }
+
+    inline const Scalar& coeffRef(Index idx) const
+    {
+      return m_matrix.const_cast_derived().coeffRef(idx+rowOffset(), idx+colOffset());
+    }
+
+    inline CoeffReturnType coeff(Index idx) const
+    {
+      return m_matrix.coeff(idx+rowOffset(), idx+colOffset());
+    }
+
+    const typename internal::remove_all<typename MatrixType::Nested>::type& 
+    nestedExpression() const 
+    {
+      return m_matrix;
+    }
+
+    int index() const
+    {
+      return m_index.value();
+    }
+
+  protected:
+    typename MatrixType::Nested m_matrix;
+    const internal::variable_if_dynamicindex<Index, DiagIndex> m_index;
+
+  private:
+    // some compilers may fail to optimize std::max etc in case of compile-time constants...
+    EIGEN_STRONG_INLINE Index absDiagIndex() const { return m_index.value()>0 ? m_index.value() : -m_index.value(); }
+    EIGEN_STRONG_INLINE Index rowOffset() const { return m_index.value()>0 ? 0 : -m_index.value(); }
+    EIGEN_STRONG_INLINE Index colOffset() const { return m_index.value()>0 ? m_index.value() : 0; }
+    // triger a compile time error is someone try to call packet
+    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index) const;
+    template<int LoadMode> typename MatrixType::PacketReturnType packet(Index,Index) const;
+};
+
+/** \returns an expression of the main diagonal of the matrix \c *this
+  *
+  * \c *this is not required to be square.
+  *
+  * Example: \include MatrixBase_diagonal.cpp
+  * Output: \verbinclude MatrixBase_diagonal.out
+  *
+  * \sa class Diagonal */
+template<typename Derived>
+inline typename MatrixBase<Derived>::DiagonalReturnType
+MatrixBase<Derived>::diagonal()
+{
+  return derived();
+}
+
+/** This is the const version of diagonal(). */
+template<typename Derived>
+inline const typename MatrixBase<Derived>::ConstDiagonalReturnType
+MatrixBase<Derived>::diagonal() const
+{
+  return ConstDiagonalReturnType(derived());
+}
+
+/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
+  *
+  * \c *this is not required to be square.
+  *
+  * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
+  * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
+  *
+  * Example: \include MatrixBase_diagonal_int.cpp
+  * Output: \verbinclude MatrixBase_diagonal_int.out
+  *
+  * \sa MatrixBase::diagonal(), class Diagonal */
+template<typename Derived>
+inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<DynamicIndex>::Type
+MatrixBase<Derived>::diagonal(Index index)
+{
+  return typename DiagonalIndexReturnType<DynamicIndex>::Type(derived(), index);
+}
+
+/** This is the const version of diagonal(Index). */
+template<typename Derived>
+inline typename MatrixBase<Derived>::template ConstDiagonalIndexReturnType<DynamicIndex>::Type
+MatrixBase<Derived>::diagonal(Index index) const
+{
+  return typename ConstDiagonalIndexReturnType<DynamicIndex>::Type(derived(), index);
+}
+
+/** \returns an expression of the \a DiagIndex-th sub or super diagonal of the matrix \c *this
+  *
+  * \c *this is not required to be square.
+  *
+  * The template parameter \a DiagIndex represent a super diagonal if \a DiagIndex > 0
+  * and a sub diagonal otherwise. \a DiagIndex == 0 is equivalent to the main diagonal.
+  *
+  * Example: \include MatrixBase_diagonal_template_int.cpp
+  * Output: \verbinclude MatrixBase_diagonal_template_int.out
+  *
+  * \sa MatrixBase::diagonal(), class Diagonal */
+template<typename Derived>
+template<int Index>
+inline typename MatrixBase<Derived>::template DiagonalIndexReturnType<Index>::Type
+MatrixBase<Derived>::diagonal()
+{
+  return derived();
+}
+
+/** This is the const version of diagonal<int>(). */
+template<typename Derived>
+template<int Index>
+inline typename MatrixBase<Derived>::template ConstDiagonalIndexReturnType<Index>::Type
+MatrixBase<Derived>::diagonal() const
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_DIAGONAL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalMatrix.h
new file mode 100644
index 0000000..e6c220f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalMatrix.h
@@ -0,0 +1,313 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DIAGONALMATRIX_H
+#define EIGEN_DIAGONALMATRIX_H
+
+namespace Eigen { 
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+template<typename Derived>
+class DiagonalBase : public EigenBase<Derived>
+{
+  public:
+    typedef typename internal::traits<Derived>::DiagonalVectorType DiagonalVectorType;
+    typedef typename DiagonalVectorType::Scalar Scalar;
+    typedef typename DiagonalVectorType::RealScalar RealScalar;
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+
+    enum {
+      RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+      ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+      MaxRowsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
+      MaxColsAtCompileTime = DiagonalVectorType::MaxSizeAtCompileTime,
+      IsVectorAtCompileTime = 0,
+      Flags = 0
+    };
+
+    typedef Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime, 0, MaxRowsAtCompileTime, MaxColsAtCompileTime> DenseMatrixType;
+    typedef DenseMatrixType DenseType;
+    typedef DiagonalMatrix<Scalar,DiagonalVectorType::SizeAtCompileTime,DiagonalVectorType::MaxSizeAtCompileTime> PlainObject;
+
+    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    inline Derived& derived() { return *static_cast<Derived*>(this); }
+
+    DenseMatrixType toDenseMatrix() const { return derived(); }
+    template<typename DenseDerived>
+    void evalTo(MatrixBase<DenseDerived> &other) const;
+    template<typename DenseDerived>
+    void addTo(MatrixBase<DenseDerived> &other) const
+    { other.diagonal() += diagonal(); }
+    template<typename DenseDerived>
+    void subTo(MatrixBase<DenseDerived> &other) const
+    { other.diagonal() -= diagonal(); }
+
+    inline const DiagonalVectorType& diagonal() const { return derived().diagonal(); }
+    inline DiagonalVectorType& diagonal() { return derived().diagonal(); }
+
+    inline Index rows() const { return diagonal().size(); }
+    inline Index cols() const { return diagonal().size(); }
+
+    /** \returns the diagonal matrix product of \c *this by the matrix \a matrix.
+      */
+    template<typename MatrixDerived>
+    const DiagonalProduct<MatrixDerived, Derived, OnTheLeft>
+    operator*(const MatrixBase<MatrixDerived> &matrix) const
+    {
+      return DiagonalProduct<MatrixDerived, Derived, OnTheLeft>(matrix.derived(), derived());
+    }
+
+    inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const DiagonalVectorType> >
+    inverse() const
+    {
+      return diagonal().cwiseInverse();
+    }
+    
+    inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> >
+    operator*(const Scalar& scalar) const
+    {
+      return diagonal() * scalar;
+    }
+    friend inline const DiagonalWrapper<const CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const DiagonalVectorType> >
+    operator*(const Scalar& scalar, const DiagonalBase& other)
+    {
+      return other.diagonal() * scalar;
+    }
+    
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived>
+    bool isApprox(const DiagonalBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
+    {
+      return diagonal().isApprox(other.diagonal(), precision);
+    }
+    template<typename OtherDerived>
+    bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
+    {
+      return toDenseMatrix().isApprox(other, precision);
+    }
+    #endif
+};
+
+template<typename Derived>
+template<typename DenseDerived>
+void DiagonalBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const
+{
+  other.setZero();
+  other.diagonal() = diagonal();
+}
+#endif
+
+/** \class DiagonalMatrix
+  * \ingroup Core_Module
+  *
+  * \brief Represents a diagonal matrix with its storage
+  *
+  * \param _Scalar the type of coefficients
+  * \param SizeAtCompileTime the dimension of the matrix, or Dynamic
+  * \param MaxSizeAtCompileTime the dimension of the matrix, or Dynamic. This parameter is optional and defaults
+  *        to SizeAtCompileTime. Most of the time, you do not need to specify it.
+  *
+  * \sa class DiagonalWrapper
+  */
+
+namespace internal {
+template<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime>
+struct traits<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >
+ : traits<Matrix<_Scalar,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
+{
+  typedef Matrix<_Scalar,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1> DiagonalVectorType;
+  typedef Dense StorageKind;
+  typedef DenseIndex Index;
+  enum {
+    Flags = LvalueBit
+  };
+};
+}
+template<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime>
+class DiagonalMatrix
+  : public DiagonalBase<DiagonalMatrix<_Scalar,SizeAtCompileTime,MaxSizeAtCompileTime> >
+{
+  public:
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef typename internal::traits<DiagonalMatrix>::DiagonalVectorType DiagonalVectorType;
+    typedef const DiagonalMatrix& Nested;
+    typedef _Scalar Scalar;
+    typedef typename internal::traits<DiagonalMatrix>::StorageKind StorageKind;
+    typedef typename internal::traits<DiagonalMatrix>::Index Index;
+    #endif
+
+  protected:
+
+    DiagonalVectorType m_diagonal;
+
+  public:
+
+    /** const version of diagonal(). */
+    inline const DiagonalVectorType& diagonal() const { return m_diagonal; }
+    /** \returns a reference to the stored vector of diagonal coefficients. */
+    inline DiagonalVectorType& diagonal() { return m_diagonal; }
+
+    /** Default constructor without initialization */
+    inline DiagonalMatrix() {}
+
+    /** Constructs a diagonal matrix with given dimension  */
+    inline DiagonalMatrix(Index dim) : m_diagonal(dim) {}
+
+    /** 2D constructor. */
+    inline DiagonalMatrix(const Scalar& x, const Scalar& y) : m_diagonal(x,y) {}
+
+    /** 3D constructor. */
+    inline DiagonalMatrix(const Scalar& x, const Scalar& y, const Scalar& z) : m_diagonal(x,y,z) {}
+
+    /** Copy constructor. */
+    template<typename OtherDerived>
+    inline DiagonalMatrix(const DiagonalBase<OtherDerived>& other) : m_diagonal(other.diagonal()) {}
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** copy constructor. prevent a default copy constructor from hiding the other templated constructor */
+    inline DiagonalMatrix(const DiagonalMatrix& other) : m_diagonal(other.diagonal()) {}
+    #endif
+
+    /** generic constructor from expression of the diagonal coefficients */
+    template<typename OtherDerived>
+    explicit inline DiagonalMatrix(const MatrixBase<OtherDerived>& other) : m_diagonal(other)
+    {}
+
+    /** Copy operator. */
+    template<typename OtherDerived>
+    DiagonalMatrix& operator=(const DiagonalBase<OtherDerived>& other)
+    {
+      m_diagonal = other.diagonal();
+      return *this;
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    DiagonalMatrix& operator=(const DiagonalMatrix& other)
+    {
+      m_diagonal = other.diagonal();
+      return *this;
+    }
+    #endif
+
+    /** Resizes to given size. */
+    inline void resize(Index size) { m_diagonal.resize(size); }
+    /** Sets all coefficients to zero. */
+    inline void setZero() { m_diagonal.setZero(); }
+    /** Resizes and sets all coefficients to zero. */
+    inline void setZero(Index size) { m_diagonal.setZero(size); }
+    /** Sets this matrix to be the identity matrix of the current size. */
+    inline void setIdentity() { m_diagonal.setOnes(); }
+    /** Sets this matrix to be the identity matrix of the given size. */
+    inline void setIdentity(Index size) { m_diagonal.setOnes(size); }
+};
+
+/** \class DiagonalWrapper
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a diagonal matrix
+  *
+  * \param _DiagonalVectorType the type of the vector of diagonal coefficients
+  *
+  * This class is an expression of a diagonal matrix, but not storing its own vector of diagonal coefficients,
+  * instead wrapping an existing vector expression. It is the return type of MatrixBase::asDiagonal()
+  * and most of the time this is the only way that it is used.
+  *
+  * \sa class DiagonalMatrix, class DiagonalBase, MatrixBase::asDiagonal()
+  */
+
+namespace internal {
+template<typename _DiagonalVectorType>
+struct traits<DiagonalWrapper<_DiagonalVectorType> >
+{
+  typedef _DiagonalVectorType DiagonalVectorType;
+  typedef typename DiagonalVectorType::Scalar Scalar;
+  typedef typename DiagonalVectorType::Index Index;
+  typedef typename DiagonalVectorType::StorageKind StorageKind;
+  enum {
+    RowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    ColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    MaxRowsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    MaxColsAtCompileTime = DiagonalVectorType::SizeAtCompileTime,
+    Flags =  traits<DiagonalVectorType>::Flags & LvalueBit
+  };
+};
+}
+
+template<typename _DiagonalVectorType>
+class DiagonalWrapper
+  : public DiagonalBase<DiagonalWrapper<_DiagonalVectorType> >, internal::no_assignment_operator
+{
+  public:
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef _DiagonalVectorType DiagonalVectorType;
+    typedef DiagonalWrapper Nested;
+    #endif
+
+    /** Constructor from expression of diagonal coefficients to wrap. */
+    inline DiagonalWrapper(DiagonalVectorType& a_diagonal) : m_diagonal(a_diagonal) {}
+
+    /** \returns a const reference to the wrapped expression of diagonal coefficients. */
+    const DiagonalVectorType& diagonal() const { return m_diagonal; }
+
+  protected:
+    typename DiagonalVectorType::Nested m_diagonal;
+};
+
+/** \returns a pseudo-expression of a diagonal matrix with *this as vector of diagonal coefficients
+  *
+  * \only_for_vectors
+  *
+  * Example: \include MatrixBase_asDiagonal.cpp
+  * Output: \verbinclude MatrixBase_asDiagonal.out
+  *
+  * \sa class DiagonalWrapper, class DiagonalMatrix, diagonal(), isDiagonal()
+  **/
+template<typename Derived>
+inline const DiagonalWrapper<const Derived>
+MatrixBase<Derived>::asDiagonal() const
+{
+  return derived();
+}
+
+/** \returns true if *this is approximately equal to a diagonal matrix,
+  *          within the precision given by \a prec.
+  *
+  * Example: \include MatrixBase_isDiagonal.cpp
+  * Output: \verbinclude MatrixBase_isDiagonal.out
+  *
+  * \sa asDiagonal()
+  */
+template<typename Derived>
+bool MatrixBase<Derived>::isDiagonal(const RealScalar& prec) const
+{
+  using std::abs;
+  if(cols() != rows()) return false;
+  RealScalar maxAbsOnDiagonal = static_cast<RealScalar>(-1);
+  for(Index j = 0; j < cols(); ++j)
+  {
+    RealScalar absOnDiagonal = abs(coeff(j,j));
+    if(absOnDiagonal > maxAbsOnDiagonal) maxAbsOnDiagonal = absOnDiagonal;
+  }
+  for(Index j = 0; j < cols(); ++j)
+    for(Index i = 0; i < j; ++i)
+    {
+      if(!internal::isMuchSmallerThan(coeff(i, j), maxAbsOnDiagonal, prec)) return false;
+      if(!internal::isMuchSmallerThan(coeff(j, i), maxAbsOnDiagonal, prec)) return false;
+    }
+  return true;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_DIAGONALMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalProduct.h b/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalProduct.h
new file mode 100644
index 0000000..d55b2c2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/DiagonalProduct.h
@@ -0,0 +1,113 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DIAGONALPRODUCT_H
+#define EIGEN_DIAGONALPRODUCT_H
+
+namespace Eigen { 
+
+namespace internal {
+template<typename MatrixType, typename DiagonalType, int ProductOrder>
+struct traits<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
+ : traits<MatrixType>
+{
+  typedef typename scalar_product_traits<typename MatrixType::Scalar, typename DiagonalType::Scalar>::ReturnType Scalar;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+
+    _StorageOrder = MatrixType::Flags & RowMajorBit ? RowMajor : ColMajor,
+    _PacketOnDiag = !((int(_StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)
+                    ||(int(_StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)),
+    _SameTypes = is_same<typename MatrixType::Scalar, typename DiagonalType::Scalar>::value,
+    // FIXME currently we need same types, but in the future the next rule should be the one
+    //_Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && ((!_PacketOnDiag) || (_SameTypes && bool(int(DiagonalType::Flags)&PacketAccessBit))),
+    _Vectorizable = bool(int(MatrixType::Flags)&PacketAccessBit) && _SameTypes && ((!_PacketOnDiag) || (bool(int(DiagonalType::Flags)&PacketAccessBit))),
+
+    Flags = (HereditaryBits & (unsigned int)(MatrixType::Flags)) | (_Vectorizable ? PacketAccessBit : 0),
+    CoeffReadCost = NumTraits<Scalar>::MulCost + MatrixType::CoeffReadCost + DiagonalType::DiagonalVectorType::CoeffReadCost
+  };
+};
+}
+
+template<typename MatrixType, typename DiagonalType, int ProductOrder>
+class DiagonalProduct : internal::no_assignment_operator,
+                        public MatrixBase<DiagonalProduct<MatrixType, DiagonalType, ProductOrder> >
+{
+  public:
+
+    typedef MatrixBase<DiagonalProduct> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(DiagonalProduct)
+
+    inline DiagonalProduct(const MatrixType& matrix, const DiagonalType& diagonal)
+      : m_matrix(matrix), m_diagonal(diagonal)
+    {
+      eigen_assert(diagonal.diagonal().size() == (ProductOrder == OnTheLeft ? matrix.rows() : matrix.cols()));
+    }
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    const Scalar coeff(Index row, Index col) const
+    {
+      return m_diagonal.diagonal().coeff(ProductOrder == OnTheLeft ? row : col) * m_matrix.coeff(row, col);
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index row, Index col) const
+    {
+      enum {
+        StorageOrder = Flags & RowMajorBit ? RowMajor : ColMajor
+      };
+      const Index indexInDiagonalVector = ProductOrder == OnTheLeft ? row : col;
+
+      return packet_impl<LoadMode>(row,col,indexInDiagonalVector,typename internal::conditional<
+        ((int(StorageOrder) == RowMajor && int(ProductOrder) == OnTheLeft)
+       ||(int(StorageOrder) == ColMajor && int(ProductOrder) == OnTheRight)), internal::true_type, internal::false_type>::type());
+    }
+
+  protected:
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::true_type) const
+    {
+      return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
+                     internal::pset1<PacketScalar>(m_diagonal.diagonal().coeff(id)));
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet_impl(Index row, Index col, Index id, internal::false_type) const
+    {
+      enum {
+        InnerSize = (MatrixType::Flags & RowMajorBit) ? MatrixType::ColsAtCompileTime : MatrixType::RowsAtCompileTime,
+        DiagonalVectorPacketLoadMode = (LoadMode == Aligned && ((InnerSize%16) == 0)) ? Aligned : Unaligned
+      };
+      return internal::pmul(m_matrix.template packet<LoadMode>(row, col),
+                     m_diagonal.diagonal().template packet<DiagonalVectorPacketLoadMode>(id));
+    }
+
+    typename MatrixType::Nested m_matrix;
+    typename DiagonalType::Nested m_diagonal;
+};
+
+/** \returns the diagonal matrix product of \c *this by the diagonal matrix \a diagonal.
+  */
+template<typename Derived>
+template<typename DiagonalDerived>
+inline const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>
+MatrixBase<Derived>::operator*(const DiagonalBase<DiagonalDerived> &a_diagonal) const
+{
+  return DiagonalProduct<Derived, DiagonalDerived, OnTheRight>(derived(), a_diagonal.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_DIAGONALPRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Dot.h b/vendor/eigen-3.1.91/Eigen/src/Core/Dot.h
new file mode 100644
index 0000000..9d513d6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Dot.h
@@ -0,0 +1,262 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008, 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DOT_H
+#define EIGEN_DOT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// helper function for dot(). The problem is that if we put that in the body of dot(), then upon calling dot
+// with mismatched types, the compiler emits errors about failing to instantiate cwiseProduct BEFORE
+// looking at the static assertions. Thus this is a trick to get better compile errors.
+template<typename T, typename U,
+// the NeedToTranspose condition here is taken straight from Assign.h
+         bool NeedToTranspose = T::IsVectorAtCompileTime
+                && U::IsVectorAtCompileTime
+                && ((int(T::RowsAtCompileTime) == 1 && int(U::ColsAtCompileTime) == 1)
+                      |  // FIXME | instead of || to please GCC 4.4.0 stupid warning "suggest parentheses around &&".
+                         // revert to || as soon as not needed anymore.
+                    (int(T::ColsAtCompileTime) == 1 && int(U::RowsAtCompileTime) == 1))
+>
+struct dot_nocheck
+{
+  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;
+  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
+  {
+    return a.template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();
+  }
+};
+
+template<typename T, typename U>
+struct dot_nocheck<T, U, true>
+{
+  typedef typename scalar_product_traits<typename traits<T>::Scalar,typename traits<U>::Scalar>::ReturnType ResScalar;
+  static inline ResScalar run(const MatrixBase<T>& a, const MatrixBase<U>& b)
+  {
+    return a.transpose().template binaryExpr<scalar_conj_product_op<typename traits<T>::Scalar,typename traits<U>::Scalar> >(b).sum();
+  }
+};
+
+} // end namespace internal
+
+/** \returns the dot product of *this with other.
+  *
+  * \only_for_vectors
+  *
+  * \note If the scalar type is complex numbers, then this function returns the hermitian
+  * (sesquilinear) dot product, conjugate-linear in the first variable and linear in the
+  * second variable.
+  *
+  * \sa squaredNorm(), norm()
+  */
+template<typename Derived>
+template<typename OtherDerived>
+typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
+MatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
+  typedef internal::scalar_conj_product_op<Scalar,typename OtherDerived::Scalar> func;
+  EIGEN_CHECK_BINARY_COMPATIBILIY(func,Scalar,typename OtherDerived::Scalar);
+
+  eigen_assert(size() == other.size());
+
+  return internal::dot_nocheck<Derived,OtherDerived>::run(*this, other);
+}
+
+#ifdef EIGEN2_SUPPORT
+/** \returns the dot product of *this with other, with the Eigen2 convention that the dot product is linear in the first variable
+  * (conjugating the second variable). Of course this only makes a difference in the complex case.
+  *
+  * This method is only available in EIGEN2_SUPPORT mode.
+  *
+  * \only_for_vectors
+  *
+  * \sa dot()
+  */
+template<typename Derived>
+template<typename OtherDerived>
+typename internal::traits<Derived>::Scalar
+MatrixBase<Derived>::eigen2_dot(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+  eigen_assert(size() == other.size());
+
+  return internal::dot_nocheck<OtherDerived,Derived>::run(other,*this);
+}
+#endif
+
+
+//---------- implementation of L2 norm and related functions ----------
+
+/** \returns, for vectors, the squared \em l2 norm of \c *this, and for matrices the Frobenius norm.
+  * In both cases, it consists in the sum of the square of all the matrix entries.
+  * For vectors, this is also equals to the dot product of \c *this with itself.
+  *
+  * \sa dot(), norm()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::squaredNorm() const
+{
+  return internal::real((*this).cwiseAbs2().sum());
+}
+
+/** \returns, for vectors, the \em l2 norm of \c *this, and for matrices the Frobenius norm.
+  * In both cases, it consists in the square root of the sum of the square of all the matrix entries.
+  * For vectors, this is also equals to the square root of the dot product of \c *this with itself.
+  *
+  * \sa dot(), squaredNorm()
+  */
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real MatrixBase<Derived>::norm() const
+{
+  using std::sqrt;
+  return sqrt(squaredNorm());
+}
+
+/** \returns an expression of the quotient of *this by its own norm.
+  *
+  * \only_for_vectors
+  *
+  * \sa norm(), normalize()
+  */
+template<typename Derived>
+inline const typename MatrixBase<Derived>::PlainObject
+MatrixBase<Derived>::normalized() const
+{
+  typedef typename internal::nested<Derived>::type Nested;
+  typedef typename internal::remove_reference<Nested>::type _Nested;
+  _Nested n(derived());
+  return n / n.norm();
+}
+
+/** Normalizes the vector, i.e. divides it by its own norm.
+  *
+  * \only_for_vectors
+  *
+  * \sa norm(), normalized()
+  */
+template<typename Derived>
+inline void MatrixBase<Derived>::normalize()
+{
+  *this /= norm();
+}
+
+//---------- implementation of other norms ----------
+
+namespace internal {
+
+template<typename Derived, int p>
+struct lpNorm_selector
+{
+  typedef typename NumTraits<typename traits<Derived>::Scalar>::Real RealScalar;
+  static inline RealScalar run(const MatrixBase<Derived>& m)
+  {
+    return pow(m.cwiseAbs().array().pow(p).sum(), RealScalar(1)/p);
+  }
+};
+
+template<typename Derived>
+struct lpNorm_selector<Derived, 1>
+{
+  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
+  {
+    return m.cwiseAbs().sum();
+  }
+};
+
+template<typename Derived>
+struct lpNorm_selector<Derived, 2>
+{
+  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
+  {
+    return m.norm();
+  }
+};
+
+template<typename Derived>
+struct lpNorm_selector<Derived, Infinity>
+{
+  static inline typename NumTraits<typename traits<Derived>::Scalar>::Real run(const MatrixBase<Derived>& m)
+  {
+    return m.cwiseAbs().maxCoeff();
+  }
+};
+
+} // end namespace internal
+
+/** \returns the \f$ \ell^p \f$ norm of *this, that is, returns the p-th root of the sum of the p-th powers of the absolute values
+  *          of the coefficients of *this. If \a p is the special value \a Eigen::Infinity, this function returns the \f$ \ell^\infty \f$
+  *          norm, that is the maximum of the absolute values of the coefficients of *this.
+  *
+  * \sa norm()
+  */
+template<typename Derived>
+template<int p>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::lpNorm() const
+{
+  return internal::lpNorm_selector<Derived, p>::run(*this);
+}
+
+//---------- implementation of isOrthogonal / isUnitary ----------
+
+/** \returns true if *this is approximately orthogonal to \a other,
+  *          within the precision given by \a prec.
+  *
+  * Example: \include MatrixBase_isOrthogonal.cpp
+  * Output: \verbinclude MatrixBase_isOrthogonal.out
+  */
+template<typename Derived>
+template<typename OtherDerived>
+bool MatrixBase<Derived>::isOrthogonal
+(const MatrixBase<OtherDerived>& other, const RealScalar& prec) const
+{
+  typename internal::nested<Derived,2>::type nested(derived());
+  typename internal::nested<OtherDerived,2>::type otherNested(other.derived());
+  return internal::abs2(nested.dot(otherNested)) <= prec * prec * nested.squaredNorm() * otherNested.squaredNorm();
+}
+
+/** \returns true if *this is approximately an unitary matrix,
+  *          within the precision given by \a prec. In the case where the \a Scalar
+  *          type is real numbers, a unitary matrix is an orthogonal matrix, whence the name.
+  *
+  * \note This can be used to check whether a family of vectors forms an orthonormal basis.
+  *       Indeed, \c m.isUnitary() returns true if and only if the columns (equivalently, the rows) of m form an
+  *       orthonormal basis.
+  *
+  * Example: \include MatrixBase_isUnitary.cpp
+  * Output: \verbinclude MatrixBase_isUnitary.out
+  */
+template<typename Derived>
+bool MatrixBase<Derived>::isUnitary(const RealScalar& prec) const
+{
+  typename Derived::Nested nested(derived());
+  for(Index i = 0; i < cols(); ++i)
+  {
+    if(!internal::isApprox(nested.col(i).squaredNorm(), static_cast<RealScalar>(1), prec))
+      return false;
+    for(Index j = 0; j < i; ++j)
+      if(!internal::isMuchSmallerThan(nested.col(i).dot(nested.col(j)), static_cast<Scalar>(1), prec))
+        return false;
+  }
+  return true;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_DOT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/EigenBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/EigenBase.h
new file mode 100644
index 0000000..2b8dd1b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/EigenBase.h
@@ -0,0 +1,161 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_EIGENBASE_H
+#define EIGEN_EIGENBASE_H
+
+namespace Eigen {
+
+/** Common base class for all classes T such that MatrixBase has an operator=(T) and a constructor MatrixBase(T).
+  *
+  * In other words, an EigenBase object is an object that can be copied into a MatrixBase.
+  *
+  * Besides MatrixBase-derived classes, this also includes special matrix classes such as diagonal matrices, etc.
+  *
+  * Notice that this class is trivial, it is only used to disambiguate overloaded functions.
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+template<typename Derived> struct EigenBase
+{
+//   typedef typename internal::plain_matrix_type<Derived>::type PlainObject;
+
+  typedef typename internal::traits<Derived>::StorageKind StorageKind;
+  typedef typename internal::traits<Derived>::Index Index;
+
+  /** \returns a reference to the derived object */
+  Derived& derived() { return *static_cast<Derived*>(this); }
+  /** \returns a const reference to the derived object */
+  const Derived& derived() const { return *static_cast<const Derived*>(this); }
+
+  inline Derived& const_cast_derived() const
+  { return *static_cast<Derived*>(const_cast<EigenBase*>(this)); }
+  inline const Derived& const_derived() const
+  { return *static_cast<const Derived*>(this); }
+
+  /** \returns the number of rows. \sa cols(), RowsAtCompileTime */
+  inline Index rows() const { return derived().rows(); }
+  /** \returns the number of columns. \sa rows(), ColsAtCompileTime*/
+  inline Index cols() const { return derived().cols(); }
+  /** \returns the number of coefficients, which is rows()*cols().
+    * \sa rows(), cols(), SizeAtCompileTime. */
+  inline Index size() const { return rows() * cols(); }
+
+  /** \internal Don't use it, but do the equivalent: \code dst = *this; \endcode */
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  { derived().evalTo(dst); }
+
+  /** \internal Don't use it, but do the equivalent: \code dst += *this; \endcode */
+  template<typename Dest> inline void addTo(Dest& dst) const
+  {
+    // This is the default implementation,
+    // derived class can reimplement it in a more optimized way.
+    typename Dest::PlainObject res(rows(),cols());
+    evalTo(res);
+    dst += res;
+  }
+
+  /** \internal Don't use it, but do the equivalent: \code dst -= *this; \endcode */
+  template<typename Dest> inline void subTo(Dest& dst) const
+  {
+    // This is the default implementation,
+    // derived class can reimplement it in a more optimized way.
+    typename Dest::PlainObject res(rows(),cols());
+    evalTo(res);
+    dst -= res;
+  }
+
+  /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheRight(*this); \endcode */
+  template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const
+  {
+    // This is the default implementation,
+    // derived class can reimplement it in a more optimized way.
+    dst = dst * this->derived();
+  }
+
+  /** \internal Don't use it, but do the equivalent: \code dst.applyOnTheLeft(*this); \endcode */
+  template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const
+  {
+    // This is the default implementation,
+    // derived class can reimplement it in a more optimized way.
+    dst = this->derived() * dst;
+  }
+
+};
+
+/***************************************************************************
+* Implementation of matrix base methods
+***************************************************************************/
+
+/** \brief Copies the generic expression \a other into *this.
+  *
+  * \details The expression must provide a (templated) evalTo(Derived& dst) const
+  * function which does the actual job. In practice, this allows any user to write
+  * its own special matrix without having to modify MatrixBase
+  *
+  * \returns a reference to *this.
+  */
+template<typename Derived>
+template<typename OtherDerived>
+Derived& DenseBase<Derived>::operator=(const EigenBase<OtherDerived> &other)
+{
+  other.derived().evalTo(derived());
+  return derived();
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+Derived& DenseBase<Derived>::operator+=(const EigenBase<OtherDerived> &other)
+{
+  other.derived().addTo(derived());
+  return derived();
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+Derived& DenseBase<Derived>::operator-=(const EigenBase<OtherDerived> &other)
+{
+  other.derived().subTo(derived());
+  return derived();
+}
+
+/** replaces \c *this by \c *this * \a other.
+  *
+  * \returns a reference to \c *this
+  */
+template<typename Derived>
+template<typename OtherDerived>
+inline Derived&
+MatrixBase<Derived>::operator*=(const EigenBase<OtherDerived> &other)
+{
+  other.derived().applyThisOnTheRight(derived());
+  return derived();
+}
+
+/** replaces \c *this by \c *this * \a other. It is equivalent to MatrixBase::operator*=().
+  */
+template<typename Derived>
+template<typename OtherDerived>
+inline void MatrixBase<Derived>::applyOnTheRight(const EigenBase<OtherDerived> &other)
+{
+  other.derived().applyThisOnTheRight(derived());
+}
+
+/** replaces \c *this by \c *this * \a other. */
+template<typename Derived>
+template<typename OtherDerived>
+inline void MatrixBase<Derived>::applyOnTheLeft(const EigenBase<OtherDerived> &other)
+{
+  other.derived().applyThisOnTheLeft(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_EIGENBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Flagged.h b/vendor/eigen-3.1.91/Eigen/src/Core/Flagged.h
new file mode 100644
index 0000000..1f2955f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Flagged.h
@@ -0,0 +1,140 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FLAGGED_H
+#define EIGEN_FLAGGED_H
+
+namespace Eigen { 
+
+/** \class Flagged
+  * \ingroup Core_Module
+  *
+  * \brief Expression with modified flags
+  *
+  * \param ExpressionType the type of the object of which we are modifying the flags
+  * \param Added the flags added to the expression
+  * \param Removed the flags removed from the expression (has priority over Added).
+  *
+  * This class represents an expression whose flags have been modified.
+  * It is the return type of MatrixBase::flagged()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::flagged()
+  */
+
+namespace internal {
+template<typename ExpressionType, unsigned int Added, unsigned int Removed>
+struct traits<Flagged<ExpressionType, Added, Removed> > : traits<ExpressionType>
+{
+  enum { Flags = (ExpressionType::Flags | Added) & ~Removed };
+};
+}
+
+template<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged
+  : public MatrixBase<Flagged<ExpressionType, Added, Removed> >
+{
+  public:
+
+    typedef MatrixBase<Flagged> Base;
+    
+    EIGEN_DENSE_PUBLIC_INTERFACE(Flagged)
+    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
+        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
+    typedef typename ExpressionType::InnerIterator InnerIterator;
+
+    inline Flagged(const ExpressionType& matrix) : m_matrix(matrix) {}
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    inline Index outerStride() const { return m_matrix.outerStride(); }
+    inline Index innerStride() const { return m_matrix.innerStride(); }
+
+    inline CoeffReturnType coeff(Index row, Index col) const
+    {
+      return m_matrix.coeff(row, col);
+    }
+
+    inline CoeffReturnType coeff(Index index) const
+    {
+      return m_matrix.coeff(index);
+    }
+    
+    inline const Scalar& coeffRef(Index row, Index col) const
+    {
+      return m_matrix.const_cast_derived().coeffRef(row, col);
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return m_matrix.const_cast_derived().coeffRef(index);
+    }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      return m_matrix.const_cast_derived().coeffRef(row, col);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_matrix.const_cast_derived().coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index row, Index col) const
+    {
+      return m_matrix.template packet<LoadMode>(row, col);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index row, Index col, const PacketScalar& x)
+    {
+      m_matrix.const_cast_derived().template writePacket<LoadMode>(row, col, x);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return m_matrix.template packet<LoadMode>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& x)
+    {
+      m_matrix.const_cast_derived().template writePacket<LoadMode>(index, x);
+    }
+
+    const ExpressionType& _expression() const { return m_matrix; }
+
+    template<typename OtherDerived>
+    typename ExpressionType::PlainObject solveTriangular(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived>
+    void solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const;
+
+  protected:
+    ExpressionTypeNested m_matrix;
+};
+
+/** \returns an expression of *this with added and removed flags
+  *
+  * This is mostly for internal use.
+  *
+  * \sa class Flagged
+  */
+template<typename Derived>
+template<unsigned int Added,unsigned int Removed>
+inline const Flagged<Derived, Added, Removed>
+DenseBase<Derived>::flagged() const
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_FLAGGED_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ForceAlignedAccess.h b/vendor/eigen-3.1.91/Eigen/src/Core/ForceAlignedAccess.h
new file mode 100644
index 0000000..807c7a2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ForceAlignedAccess.h
@@ -0,0 +1,146 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FORCEALIGNEDACCESS_H
+#define EIGEN_FORCEALIGNEDACCESS_H
+
+namespace Eigen {
+
+/** \class ForceAlignedAccess
+  * \ingroup Core_Module
+  *
+  * \brief Enforce aligned packet loads and stores regardless of what is requested
+  *
+  * \param ExpressionType the type of the object of which we are forcing aligned packet access
+  *
+  * This class is the return type of MatrixBase::forceAlignedAccess()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::forceAlignedAccess()
+  */
+
+namespace internal {
+template<typename ExpressionType>
+struct traits<ForceAlignedAccess<ExpressionType> > : public traits<ExpressionType>
+{};
+}
+
+template<typename ExpressionType> class ForceAlignedAccess
+  : public internal::dense_xpr_base< ForceAlignedAccess<ExpressionType> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<ForceAlignedAccess>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(ForceAlignedAccess)
+
+    inline ForceAlignedAccess(const ExpressionType& matrix) : m_expression(matrix) {}
+
+    inline Index rows() const { return m_expression.rows(); }
+    inline Index cols() const { return m_expression.cols(); }
+    inline Index outerStride() const { return m_expression.outerStride(); }
+    inline Index innerStride() const { return m_expression.innerStride(); }
+
+    inline const CoeffReturnType coeff(Index row, Index col) const
+    {
+      return m_expression.coeff(row, col);
+    }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      return m_expression.const_cast_derived().coeffRef(row, col);
+    }
+
+    inline const CoeffReturnType coeff(Index index) const
+    {
+      return m_expression.coeff(index);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index row, Index col) const
+    {
+      return m_expression.template packet<Aligned>(row, col);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index row, Index col, const PacketScalar& x)
+    {
+      m_expression.const_cast_derived().template writePacket<Aligned>(row, col, x);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return m_expression.template packet<Aligned>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& x)
+    {
+      m_expression.const_cast_derived().template writePacket<Aligned>(index, x);
+    }
+
+    operator const ExpressionType&() const { return m_expression; }
+
+  protected:
+    const ExpressionType& m_expression;
+
+  private:
+    ForceAlignedAccess& operator=(const ForceAlignedAccess&);
+};
+
+/** \returns an expression of *this with forced aligned access
+  * \sa forceAlignedAccessIf(),class ForceAlignedAccess
+  */
+template<typename Derived>
+inline const ForceAlignedAccess<Derived>
+MatrixBase<Derived>::forceAlignedAccess() const
+{
+  return ForceAlignedAccess<Derived>(derived());
+}
+
+/** \returns an expression of *this with forced aligned access
+  * \sa forceAlignedAccessIf(), class ForceAlignedAccess
+  */
+template<typename Derived>
+inline ForceAlignedAccess<Derived>
+MatrixBase<Derived>::forceAlignedAccess()
+{
+  return ForceAlignedAccess<Derived>(derived());
+}
+
+/** \returns an expression of *this with forced aligned access if \a Enable is true.
+  * \sa forceAlignedAccess(), class ForceAlignedAccess
+  */
+template<typename Derived>
+template<bool Enable>
+inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type
+MatrixBase<Derived>::forceAlignedAccessIf() const
+{
+  return derived();
+}
+
+/** \returns an expression of *this with forced aligned access if \a Enable is true.
+  * \sa forceAlignedAccess(), class ForceAlignedAccess
+  */
+template<typename Derived>
+template<bool Enable>
+inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type
+MatrixBase<Derived>::forceAlignedAccessIf()
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_FORCEALIGNEDACCESS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Functors.h b/vendor/eigen-3.1.91/Eigen/src/Core/Functors.h
new file mode 100644
index 0000000..9a84e8f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Functors.h
@@ -0,0 +1,985 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FUNCTORS_H
+#define EIGEN_FUNCTORS_H
+
+namespace Eigen {
+
+namespace internal {
+
+// associative functors:
+
+/** \internal
+  * \brief Template functor to compute the sum of two scalars
+  *
+  * \sa class CwiseBinaryOp, MatrixBase::operator+, class VectorwiseOp, MatrixBase::sum()
+  */
+template<typename Scalar> struct scalar_sum_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_sum_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a + b; }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::padd(a,b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
+  { return internal::predux(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_sum_op<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasAdd
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the product of two scalars
+  *
+  * \sa class CwiseBinaryOp, Cwise::operator*(), class VectorwiseOp, MatrixBase::redux()
+  */
+template<typename LhsScalar,typename RhsScalar> struct scalar_product_op {
+  enum {
+    // TODO vectorize mixed product
+    Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasMul && packet_traits<RhsScalar>::HasMul
+  };
+  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_product_op)
+  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a * b; }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::pmul(a,b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const result_type predux(const Packet& a) const
+  { return internal::predux_mul(a); }
+};
+template<typename LhsScalar,typename RhsScalar>
+struct functor_traits<scalar_product_op<LhsScalar,RhsScalar> > {
+  enum {
+    Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost)/2, // rough estimate!
+    PacketAccess = scalar_product_op<LhsScalar,RhsScalar>::Vectorizable
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the conjugate product of two scalars
+  *
+  * This is a short cut for conj(x) * y which is needed for optimization purpose; in Eigen2 support mode, this becomes x * conj(y)
+  */
+template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op {
+
+  enum {
+    Conj = NumTraits<LhsScalar>::IsComplex
+  };
+  
+  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
+  
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_conj_product_op)
+  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const
+  { return conj_helper<LhsScalar,RhsScalar,Conj,false>().pmul(a,b); }
+  
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return conj_helper<Packet,Packet,Conj,false>().pmul(a,b); }
+};
+template<typename LhsScalar,typename RhsScalar>
+struct functor_traits<scalar_conj_product_op<LhsScalar,RhsScalar> > {
+  enum {
+    Cost = NumTraits<LhsScalar>::MulCost,
+    PacketAccess = internal::is_same<LhsScalar, RhsScalar>::value && packet_traits<LhsScalar>::HasMul
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the min of two scalars
+  *
+  * \sa class CwiseBinaryOp, MatrixBase::cwiseMin, class VectorwiseOp, MatrixBase::minCoeff()
+  */
+template<typename Scalar> struct scalar_min_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_min_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::min; return (min)(a, b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::pmin(a,b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
+  { return internal::predux_min(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_min_op<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasMin
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the max of two scalars
+  *
+  * \sa class CwiseBinaryOp, MatrixBase::cwiseMax, class VectorwiseOp, MatrixBase::maxCoeff()
+  */
+template<typename Scalar> struct scalar_max_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_max_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { using std::max; return (max)(a, b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::pmax(a,b); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Scalar predux(const Packet& a) const
+  { return internal::predux_max(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_max_op<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasMax
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the hypot of two scalars
+  *
+  * \sa MatrixBase::stableNorm(), class Redux
+  */
+template<typename Scalar> struct scalar_hypot_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_hypot_op)
+//   typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& _x, const Scalar& _y) const
+  {
+    using std::max;
+    using std::min;
+    using std::sqrt;
+    Scalar p = (max)(_x, _y);
+    Scalar q = (min)(_x, _y);
+    Scalar qp = q/p;
+    return p * sqrt(Scalar(1) + qp*qp);
+  }
+};
+template<typename Scalar>
+struct functor_traits<scalar_hypot_op<Scalar> > {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess=0 };
+};
+
+/** \internal
+  * \brief Template functor to compute the pow of two scalars
+  */
+template<typename Scalar, typename OtherScalar> struct scalar_binary_pow_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_binary_pow_op)
+  inline Scalar operator() (const Scalar& a, const OtherScalar& b) const { return internal::pow(a, b); }
+};
+template<typename Scalar, typename OtherScalar>
+struct functor_traits<scalar_binary_pow_op<Scalar,OtherScalar> > {
+  enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false };
+};
+
+// other binary functors:
+
+/** \internal
+  * \brief Template functor to compute the difference of two scalars
+  *
+  * \sa class CwiseBinaryOp, MatrixBase::operator-
+  */
+template<typename Scalar> struct scalar_difference_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_difference_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a, const Scalar& b) const { return a - b; }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::psub(a,b); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_difference_op<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasSub
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the quotient of two scalars
+  *
+  * \sa class CwiseBinaryOp, Cwise::operator/()
+  */
+template<typename LhsScalar,typename RhsScalar> struct scalar_quotient_op {
+  enum {
+    // TODO vectorize mixed product
+    Vectorizable = is_same<LhsScalar,RhsScalar>::value && packet_traits<LhsScalar>::HasDiv && packet_traits<RhsScalar>::HasDiv
+  };
+  typedef typename scalar_product_traits<LhsScalar,RhsScalar>::ReturnType result_type;
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_quotient_op)
+  EIGEN_STRONG_INLINE const result_type operator() (const LhsScalar& a, const RhsScalar& b) const { return a / b; }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a, const Packet& b) const
+  { return internal::pdiv(a,b); }
+};
+template<typename LhsScalar,typename RhsScalar>
+struct functor_traits<scalar_quotient_op<LhsScalar,RhsScalar> > {
+  enum {
+    Cost = (NumTraits<LhsScalar>::MulCost + NumTraits<RhsScalar>::MulCost), // rough estimate!
+    PacketAccess = scalar_quotient_op<LhsScalar,RhsScalar>::Vectorizable
+  };
+};
+
+
+
+/** \internal
+  * \brief Template functor to compute the and of two booleans
+  *
+  * \sa class CwiseBinaryOp, ArrayBase::operator&&
+  */
+struct scalar_boolean_and_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_and_op)
+  EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a && b; }
+};
+template<> struct functor_traits<scalar_boolean_and_op> {
+  enum {
+    Cost = NumTraits<bool>::AddCost,
+    PacketAccess = false
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the or of two booleans
+  *
+  * \sa class CwiseBinaryOp, ArrayBase::operator||
+  */
+struct scalar_boolean_or_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_boolean_or_op)
+  EIGEN_STRONG_INLINE bool operator() (const bool& a, const bool& b) const { return a || b; }
+};
+template<> struct functor_traits<scalar_boolean_or_op> {
+  enum {
+    Cost = NumTraits<bool>::AddCost,
+    PacketAccess = false
+  };
+};
+
+// unary functors:
+
+/** \internal
+  * \brief Template functor to compute the opposite of a scalar
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::operator-
+  */
+template<typename Scalar> struct scalar_opposite_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_opposite_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { return -a; }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
+  { return internal::pnegate(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_opposite_op<Scalar> >
+{ enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasNegate };
+};
+
+/** \internal
+  * \brief Template functor to compute the absolute value of a scalar
+  *
+  * \sa class CwiseUnaryOp, Cwise::abs
+  */
+template<typename Scalar> struct scalar_abs_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { using std::abs; return abs(a); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
+  { return internal::pabs(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_abs_op<Scalar> >
+{
+  enum {
+    Cost = NumTraits<Scalar>::AddCost,
+    PacketAccess = packet_traits<Scalar>::HasAbs
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the squared absolute value of a scalar
+  *
+  * \sa class CwiseUnaryOp, Cwise::abs2
+  */
+template<typename Scalar> struct scalar_abs2_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_abs2_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE const result_type operator() (const Scalar& a) const { return internal::abs2(a); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
+  { return internal::pmul(a,a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_abs2_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasAbs2 }; };
+
+/** \internal
+  * \brief Template functor to compute the conjugate of a complex value
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::conjugate()
+  */
+template<typename Scalar> struct scalar_conjugate_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_conjugate_op)
+  EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& a) const { using internal::conj; return conj(a); }
+  template<typename Packet>
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const { return internal::pconj(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_conjugate_op<Scalar> >
+{
+  enum {
+    Cost = NumTraits<Scalar>::IsComplex ? NumTraits<Scalar>::AddCost : 0,
+    PacketAccess = packet_traits<Scalar>::HasConj
+  };
+};
+
+/** \internal
+  * \brief Template functor to cast a scalar to another type
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::cast()
+  */
+template<typename Scalar, typename NewType>
+struct scalar_cast_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_cast_op)
+  typedef NewType result_type;
+  EIGEN_STRONG_INLINE const NewType operator() (const Scalar& a) const { return cast<Scalar, NewType>(a); }
+};
+template<typename Scalar, typename NewType>
+struct functor_traits<scalar_cast_op<Scalar,NewType> >
+{ enum { Cost = is_same<Scalar, NewType>::value ? 0 : NumTraits<NewType>::AddCost, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to extract the real part of a complex
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::real()
+  */
+template<typename Scalar>
+struct scalar_real_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return internal::real(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_real_op<Scalar> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to extract the imaginary part of a complex
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::imag()
+  */
+template<typename Scalar>
+struct scalar_imag_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return internal::imag(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_imag_op<Scalar> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to extract the real part of a complex as a reference
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::real()
+  */
+template<typename Scalar>
+struct scalar_real_ref_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_real_ref_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return internal::real_ref(*const_cast<Scalar*>(&a)); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_real_ref_op<Scalar> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to extract the imaginary part of a complex as a reference
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::imag()
+  */
+template<typename Scalar>
+struct scalar_imag_ref_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_imag_ref_op)
+  typedef typename NumTraits<Scalar>::Real result_type;
+  EIGEN_STRONG_INLINE result_type& operator() (const Scalar& a) const { return internal::imag_ref(*const_cast<Scalar*>(&a)); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_imag_ref_op<Scalar> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+/** \internal
+  *
+  * \brief Template functor to compute the exponential of a scalar
+  *
+  * \sa class CwiseUnaryOp, Cwise::exp()
+  */
+template<typename Scalar> struct scalar_exp_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_exp_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::exp; return exp(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::pexp(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_exp_op<Scalar> >
+{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasExp }; };
+
+/** \internal
+  *
+  * \brief Template functor to compute the logarithm of a scalar
+  *
+  * \sa class CwiseUnaryOp, Cwise::log()
+  */
+template<typename Scalar> struct scalar_log_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_log_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::log; return log(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::plog(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_log_op<Scalar> >
+{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasLog }; };
+
+/** \internal
+  * \brief Template functor to multiply a scalar by a fixed other one
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::operator*, MatrixBase::operator/
+  */
+/* NOTE why doing the pset1() in packetOp *is* an optimization ?
+ * indeed it seems better to declare m_other as a Packet and do the pset1() once
+ * in the constructor. However, in practice:
+ *  - GCC does not like m_other as a Packet and generate a load every time it needs it
+ *  - on the other hand GCC is able to moves the pset1() outside the loop :)
+ *  - simpler code ;)
+ * (ICC and gcc 4.4 seems to perform well in both cases, the issue is visible with y = a*x + b*y)
+ */
+template<typename Scalar>
+struct scalar_multiple_op {
+  typedef typename packet_traits<Scalar>::type Packet;
+  // FIXME default copy constructors seems bugged with std::complex<>
+  EIGEN_STRONG_INLINE scalar_multiple_op(const scalar_multiple_op& other) : m_other(other.m_other) { }
+  EIGEN_STRONG_INLINE scalar_multiple_op(const Scalar& other) : m_other(other) { }
+  EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a * m_other; }
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
+  { return internal::pmul(a, pset1<Packet>(m_other)); }
+  typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
+};
+template<typename Scalar>
+struct functor_traits<scalar_multiple_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
+
+template<typename Scalar1, typename Scalar2>
+struct scalar_multiple2_op {
+  typedef typename scalar_product_traits<Scalar1,Scalar2>::ReturnType result_type;
+  EIGEN_STRONG_INLINE scalar_multiple2_op(const scalar_multiple2_op& other) : m_other(other.m_other) { }
+  EIGEN_STRONG_INLINE scalar_multiple2_op(const Scalar2& other) : m_other(other) { }
+  EIGEN_STRONG_INLINE result_type operator() (const Scalar1& a) const { return a * m_other; }
+  typename add_const_on_value_type<typename NumTraits<Scalar2>::Nested>::type m_other;
+};
+template<typename Scalar1,typename Scalar2>
+struct functor_traits<scalar_multiple2_op<Scalar1,Scalar2> >
+{ enum { Cost = NumTraits<Scalar1>::MulCost, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to divide a scalar by a fixed other one
+  *
+  * This functor is used to implement the quotient of a matrix by
+  * a scalar where the scalar type is not necessarily a floating point type.
+  *
+  * \sa class CwiseUnaryOp, MatrixBase::operator/
+  */
+template<typename Scalar>
+struct scalar_quotient1_op {
+  typedef typename packet_traits<Scalar>::type Packet;
+  // FIXME default copy constructors seems bugged with std::complex<>
+  EIGEN_STRONG_INLINE scalar_quotient1_op(const scalar_quotient1_op& other) : m_other(other.m_other) { }
+  EIGEN_STRONG_INLINE scalar_quotient1_op(const Scalar& other) : m_other(other) {}
+  EIGEN_STRONG_INLINE Scalar operator() (const Scalar& a) const { return a / m_other; }
+  EIGEN_STRONG_INLINE const Packet packetOp(const Packet& a) const
+  { return internal::pdiv(a, pset1<Packet>(m_other)); }
+  typename add_const_on_value_type<typename NumTraits<Scalar>::Nested>::type m_other;
+};
+template<typename Scalar>
+struct functor_traits<scalar_quotient1_op<Scalar> >
+{ enum { Cost = 2 * NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
+
+// nullary functors
+
+template<typename Scalar>
+struct scalar_constant_op {
+  typedef typename packet_traits<Scalar>::type Packet;
+  EIGEN_STRONG_INLINE scalar_constant_op(const scalar_constant_op& other) : m_other(other.m_other) { }
+  EIGEN_STRONG_INLINE scalar_constant_op(const Scalar& other) : m_other(other) { }
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index, Index = 0) const { return m_other; }
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Packet packetOp(Index, Index = 0) const { return internal::pset1<Packet>(m_other); }
+  const Scalar m_other;
+};
+template<typename Scalar>
+struct functor_traits<scalar_constant_op<Scalar> >
+// FIXME replace this packet test by a safe one
+{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::Vectorizable, IsRepeatable = true }; };
+
+template<typename Scalar> struct scalar_identity_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_identity_op)
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const { return row==col ? Scalar(1) : Scalar(0); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_identity_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = false, IsRepeatable = true }; };
+
+template <typename Scalar, bool RandomAccess> struct linspaced_op_impl;
+
+// linear access for packet ops:
+// 1) initialization
+//   base = [low, ..., low] + ([step, ..., step] * [-size, ..., 0])
+// 2) each step (where size is 1 for coeff access or PacketSize for packet access)
+//   base += [size*step, ..., size*step]
+//
+// TODO: Perhaps it's better to initialize lazily (so not in the constructor but in packetOp)
+//       in order to avoid the padd() in operator() ?
+template <typename Scalar>
+struct linspaced_op_impl<Scalar,false>
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+
+  linspaced_op_impl(const Scalar& low, const Scalar& step) :
+  m_low(low), m_step(step),
+  m_packetStep(pset1<Packet>(packet_traits<Scalar>::size*step)),
+  m_base(padd(pset1<Packet>(low), pmul(pset1<Packet>(step),plset<Scalar>(-packet_traits<Scalar>::size)))) {}
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const 
+  { 
+    m_base = padd(m_base, pset1<Packet>(m_step));
+    return m_low+Scalar(i)*m_step; 
+  }
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Packet packetOp(Index) const { return m_base = padd(m_base,m_packetStep); }
+
+  const Scalar m_low;
+  const Scalar m_step;
+  const Packet m_packetStep;
+  mutable Packet m_base;
+};
+
+// random access for packet ops:
+// 1) each step
+//   [low, ..., low] + ( [step, ..., step] * ( [i, ..., i] + [0, ..., size] ) )
+template <typename Scalar>
+struct linspaced_op_impl<Scalar,true>
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+
+  linspaced_op_impl(const Scalar& low, const Scalar& step) :
+  m_low(low), m_step(step),
+  m_lowPacket(pset1<Packet>(m_low)), m_stepPacket(pset1<Packet>(m_step)), m_interPacket(plset<Scalar>(0)) {}
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return m_low+i*m_step; }
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Packet packetOp(Index i) const
+  { return internal::padd(m_lowPacket, pmul(m_stepPacket, padd(pset1<Packet>(i),m_interPacket))); }
+
+  const Scalar m_low;
+  const Scalar m_step;
+  const Packet m_lowPacket;
+  const Packet m_stepPacket;
+  const Packet m_interPacket;
+};
+
+// ----- Linspace functor ----------------------------------------------------------------
+
+// Forward declaration (we default to random access which does not really give
+// us a speed gain when using packet access but it allows to use the functor in
+// nested expressions).
+template <typename Scalar, bool RandomAccess = true> struct linspaced_op;
+template <typename Scalar, bool RandomAccess> struct functor_traits< linspaced_op<Scalar,RandomAccess> >
+{ enum { Cost = 1, PacketAccess = packet_traits<Scalar>::HasSetLinear, IsRepeatable = true }; };
+template <typename Scalar, bool RandomAccess> struct linspaced_op
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+  linspaced_op(const Scalar& low, const Scalar& high, DenseIndex num_steps) : impl((num_steps==1 ? high : low), (num_steps==1 ? Scalar() : (high-low)/(num_steps-1))) {}
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index i) const { return impl(i); }
+
+  // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
+  // there row==0 and col is used for the actual iteration.
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Scalar operator() (Index row, Index col) const 
+  {
+    eigen_assert(col==0 || row==0);
+    return impl(col + row);
+  }
+
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Packet packetOp(Index i) const { return impl.packetOp(i); }
+
+  // We need this function when assigning e.g. a RowVectorXd to a MatrixXd since
+  // there row==0 and col is used for the actual iteration.
+  template<typename Index>
+  EIGEN_STRONG_INLINE const Packet packetOp(Index row, Index col) const
+  {
+    eigen_assert(col==0 || row==0);
+    return impl.packetOp(col + row);
+  }
+
+  // This proxy object handles the actual required temporaries, the different
+  // implementations (random vs. sequential access) as well as the
+  // correct piping to size 2/4 packet operations.
+  const linspaced_op_impl<Scalar,RandomAccess> impl;
+};
+
+// all functors allow linear access, except scalar_identity_op. So we fix here a quick meta
+// to indicate whether a functor allows linear access, just always answering 'yes' except for
+// scalar_identity_op.
+// FIXME move this to functor_traits adding a functor_default
+template<typename Functor> struct functor_has_linear_access { enum { ret = 1 }; };
+template<typename Scalar> struct functor_has_linear_access<scalar_identity_op<Scalar> > { enum { ret = 0 }; };
+
+// In Eigen, any binary op (Product, CwiseBinaryOp) require the Lhs and Rhs to have the same scalar type, except for multiplication
+// where the mixing of different types is handled by scalar_product_traits
+// In particular, real * complex<real> is allowed.
+// FIXME move this to functor_traits adding a functor_default
+template<typename Functor> struct functor_is_product_like { enum { ret = 0 }; };
+template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
+template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_conj_product_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
+template<typename LhsScalar,typename RhsScalar> struct functor_is_product_like<scalar_quotient_op<LhsScalar,RhsScalar> > { enum { ret = 1 }; };
+
+
+/** \internal
+  * \brief Template functor to add a scalar to a fixed other one
+  * \sa class CwiseUnaryOp, Array::operator+
+  */
+/* If you wonder why doing the pset1() in packetOp() is an optimization check scalar_multiple_op */
+template<typename Scalar>
+struct scalar_add_op {
+  typedef typename packet_traits<Scalar>::type Packet;
+  // FIXME default copy constructors seems bugged with std::complex<>
+  inline scalar_add_op(const scalar_add_op& other) : m_other(other.m_other) { }
+  inline scalar_add_op(const Scalar& other) : m_other(other) { }
+  inline Scalar operator() (const Scalar& a) const { return a + m_other; }
+  inline const Packet packetOp(const Packet& a) const
+  { return internal::padd(a, pset1<Packet>(m_other)); }
+  const Scalar m_other;
+};
+template<typename Scalar>
+struct functor_traits<scalar_add_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::AddCost, PacketAccess = packet_traits<Scalar>::HasAdd }; };
+
+/** \internal
+  * \brief Template functor to compute the square root of a scalar
+  * \sa class CwiseUnaryOp, Cwise::sqrt()
+  */
+template<typename Scalar> struct scalar_sqrt_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_sqrt_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::sqrt; return sqrt(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::psqrt(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_sqrt_op<Scalar> >
+{ enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasSqrt
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the cosine of a scalar
+  * \sa class CwiseUnaryOp, ArrayBase::cos()
+  */
+template<typename Scalar> struct scalar_cos_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_cos_op)
+  inline Scalar operator() (const Scalar& a) const { using std::cos; return cos(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::pcos(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_cos_op<Scalar> >
+{
+  enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasCos
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the sine of a scalar
+  * \sa class CwiseUnaryOp, ArrayBase::sin()
+  */
+template<typename Scalar> struct scalar_sin_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_sin_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::sin; return sin(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::psin(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_sin_op<Scalar> >
+{
+  enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasSin
+  };
+};
+
+
+/** \internal
+  * \brief Template functor to compute the tan of a scalar
+  * \sa class CwiseUnaryOp, ArrayBase::tan()
+  */
+template<typename Scalar> struct scalar_tan_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_tan_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::tan; return tan(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::ptan(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_tan_op<Scalar> >
+{
+  enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasTan
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the arc cosine of a scalar
+  * \sa class CwiseUnaryOp, ArrayBase::acos()
+  */
+template<typename Scalar> struct scalar_acos_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_acos_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::acos; return acos(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::pacos(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_acos_op<Scalar> >
+{
+  enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasACos
+  };
+};
+
+/** \internal
+  * \brief Template functor to compute the arc sine of a scalar
+  * \sa class CwiseUnaryOp, ArrayBase::asin()
+  */
+template<typename Scalar> struct scalar_asin_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_asin_op)
+  inline const Scalar operator() (const Scalar& a) const { using std::asin; return asin(a); }
+  typedef typename packet_traits<Scalar>::type Packet;
+  inline Packet packetOp(const Packet& a) const { return internal::pasin(a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_asin_op<Scalar> >
+{
+  enum {
+    Cost = 5 * NumTraits<Scalar>::MulCost,
+    PacketAccess = packet_traits<Scalar>::HasASin
+  };
+};
+
+/** \internal
+  * \brief Template functor to raise a scalar to a power
+  * \sa class CwiseUnaryOp, Cwise::pow
+  */
+template<typename Scalar>
+struct scalar_pow_op {
+  // FIXME default copy constructors seems bugged with std::complex<>
+  inline scalar_pow_op(const scalar_pow_op& other) : m_exponent(other.m_exponent) { }
+  inline scalar_pow_op(const Scalar& exponent) : m_exponent(exponent) {}
+  inline Scalar operator() (const Scalar& a) const { return internal::pow(a, m_exponent); }
+  const Scalar m_exponent;
+};
+template<typename Scalar>
+struct functor_traits<scalar_pow_op<Scalar> >
+{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false }; };
+
+/** \internal
+  * \brief Template functor to compute the quotient between a scalar and array entries.
+  * \sa class CwiseUnaryOp, Cwise::inverse()
+  */
+template<typename Scalar>
+struct scalar_inverse_mult_op {
+  scalar_inverse_mult_op(const Scalar& other) : m_other(other) {}
+  inline Scalar operator() (const Scalar& a) const { return m_other / a; }
+  template<typename Packet>
+  inline const Packet packetOp(const Packet& a) const
+  { return internal::pdiv(pset1<Packet>(m_other),a); }
+  Scalar m_other;
+};
+
+/** \internal
+  * \brief Template functor to compute the inverse of a scalar
+  * \sa class CwiseUnaryOp, Cwise::inverse()
+  */
+template<typename Scalar>
+struct scalar_inverse_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_inverse_op)
+  inline Scalar operator() (const Scalar& a) const { return Scalar(1)/a; }
+  template<typename Packet>
+  inline const Packet packetOp(const Packet& a) const
+  { return internal::pdiv(pset1<Packet>(Scalar(1)),a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_inverse_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasDiv }; };
+
+/** \internal
+  * \brief Template functor to compute the square of a scalar
+  * \sa class CwiseUnaryOp, Cwise::square()
+  */
+template<typename Scalar>
+struct scalar_square_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_square_op)
+  inline Scalar operator() (const Scalar& a) const { return a*a; }
+  template<typename Packet>
+  inline const Packet packetOp(const Packet& a) const
+  { return internal::pmul(a,a); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_square_op<Scalar> >
+{ enum { Cost = NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
+
+/** \internal
+  * \brief Template functor to compute the cube of a scalar
+  * \sa class CwiseUnaryOp, Cwise::cube()
+  */
+template<typename Scalar>
+struct scalar_cube_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_cube_op)
+  inline Scalar operator() (const Scalar& a) const { return a*a*a; }
+  template<typename Packet>
+  inline const Packet packetOp(const Packet& a) const
+  { return internal::pmul(a,pmul(a,a)); }
+};
+template<typename Scalar>
+struct functor_traits<scalar_cube_op<Scalar> >
+{ enum { Cost = 2*NumTraits<Scalar>::MulCost, PacketAccess = packet_traits<Scalar>::HasMul }; };
+
+// default functor traits for STL functors:
+
+template<typename T>
+struct functor_traits<std::multiplies<T> >
+{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::divides<T> >
+{ enum { Cost = NumTraits<T>::MulCost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::plus<T> >
+{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::minus<T> >
+{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::negate<T> >
+{ enum { Cost = NumTraits<T>::AddCost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::logical_or<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::logical_and<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::logical_not<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::greater<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::less<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::greater_equal<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::less_equal<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::equal_to<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::not_equal_to<T> >
+{ enum { Cost = 1, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::binder2nd<T> >
+{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::binder1st<T> >
+{ enum { Cost = functor_traits<T>::Cost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::unary_negate<T> >
+{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
+
+template<typename T>
+struct functor_traits<std::binary_negate<T> >
+{ enum { Cost = 1 + functor_traits<T>::Cost, PacketAccess = false }; };
+
+#ifdef EIGEN_STDEXT_SUPPORT
+
+template<typename T0,typename T1>
+struct functor_traits<std::project1st<T0,T1> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+template<typename T0,typename T1>
+struct functor_traits<std::project2nd<T0,T1> >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+template<typename T0,typename T1>
+struct functor_traits<std::select2nd<std::pair<T0,T1> > >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+template<typename T0,typename T1>
+struct functor_traits<std::select1st<std::pair<T0,T1> > >
+{ enum { Cost = 0, PacketAccess = false }; };
+
+template<typename T0,typename T1>
+struct functor_traits<std::unary_compose<T0,T1> >
+{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost, PacketAccess = false }; };
+
+template<typename T0,typename T1,typename T2>
+struct functor_traits<std::binary_compose<T0,T1,T2> >
+{ enum { Cost = functor_traits<T0>::Cost + functor_traits<T1>::Cost + functor_traits<T2>::Cost, PacketAccess = false }; };
+
+#endif // EIGEN_STDEXT_SUPPORT
+
+// allow to add new functors and specializations of functor_traits from outside Eigen.
+// this macro is really needed because functor_traits must be specialized after it is declared but before it is used...
+#ifdef EIGEN_FUNCTORS_PLUGIN
+#include EIGEN_FUNCTORS_PLUGIN
+#endif
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_FUNCTORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Fuzzy.h b/vendor/eigen-3.1.91/Eigen/src/Core/Fuzzy.h
new file mode 100644
index 0000000..8fb9a01
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Fuzzy.h
@@ -0,0 +1,150 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FUZZY_H
+#define EIGEN_FUZZY_H
+
+namespace Eigen { 
+
+namespace internal
+{
+
+template<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isApprox_selector
+{
+  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)
+  {
+    using std::min;
+    typename internal::nested<Derived,2>::type nested(x);
+    typename internal::nested<OtherDerived,2>::type otherNested(y);
+    return (nested - otherNested).cwiseAbs2().sum() <= prec * prec * (min)(nested.cwiseAbs2().sum(), otherNested.cwiseAbs2().sum());
+  }
+};
+
+template<typename Derived, typename OtherDerived>
+struct isApprox_selector<Derived, OtherDerived, true>
+{
+  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar&)
+  {
+    return x.matrix() == y.matrix();
+  }
+};
+
+template<typename Derived, typename OtherDerived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isMuchSmallerThan_object_selector
+{
+  static bool run(const Derived& x, const OtherDerived& y, const typename Derived::RealScalar& prec)
+  {
+    return x.cwiseAbs2().sum() <= abs2(prec) * y.cwiseAbs2().sum();
+  }
+};
+
+template<typename Derived, typename OtherDerived>
+struct isMuchSmallerThan_object_selector<Derived, OtherDerived, true>
+{
+  static bool run(const Derived& x, const OtherDerived&, const typename Derived::RealScalar&)
+  {
+    return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();
+  }
+};
+
+template<typename Derived, bool is_integer = NumTraits<typename Derived::Scalar>::IsInteger>
+struct isMuchSmallerThan_scalar_selector
+{
+  static bool run(const Derived& x, const typename Derived::RealScalar& y, const typename Derived::RealScalar& prec)
+  {
+    return x.cwiseAbs2().sum() <= abs2(prec * y);
+  }
+};
+
+template<typename Derived>
+struct isMuchSmallerThan_scalar_selector<Derived, true>
+{
+  static bool run(const Derived& x, const typename Derived::RealScalar&, const typename Derived::RealScalar&)
+  {
+    return x.matrix() == Derived::Zero(x.rows(), x.cols()).matrix();
+  }
+};
+
+} // end namespace internal
+
+
+/** \returns \c true if \c *this is approximately equal to \a other, within the precision
+  * determined by \a prec.
+  *
+  * \note The fuzzy compares are done multiplicatively. Two vectors \f$ v \f$ and \f$ w \f$
+  * are considered to be approximately equal within precision \f$ p \f$ if
+  * \f[ \Vert v - w \Vert \leqslant p\,\min(\Vert v\Vert, \Vert w\Vert). \f]
+  * For matrices, the comparison is done using the Hilbert-Schmidt norm (aka Frobenius norm
+  * L2 norm).
+  *
+  * \note Because of the multiplicativeness of this comparison, one can't use this function
+  * to check whether \c *this is approximately equal to the zero matrix or vector.
+  * Indeed, \c isApprox(zero) returns false unless \c *this itself is exactly the zero matrix
+  * or vector. If you want to test whether \c *this is zero, use internal::isMuchSmallerThan(const
+  * RealScalar&, RealScalar) instead.
+  *
+  * \sa internal::isMuchSmallerThan(const RealScalar&, RealScalar) const
+  */
+template<typename Derived>
+template<typename OtherDerived>
+bool DenseBase<Derived>::isApprox(
+  const DenseBase<OtherDerived>& other,
+  const RealScalar& prec
+) const
+{
+  return internal::isApprox_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);
+}
+
+/** \returns \c true if the norm of \c *this is much smaller than \a other,
+  * within the precision determined by \a prec.
+  *
+  * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
+  * considered to be much smaller than \f$ x \f$ within precision \f$ p \f$ if
+  * \f[ \Vert v \Vert \leqslant p\,\vert x\vert. \f]
+  *
+  * For matrices, the comparison is done using the Hilbert-Schmidt norm. For this reason,
+  * the value of the reference scalar \a other should come from the Hilbert-Schmidt norm
+  * of a reference matrix of same dimensions.
+  *
+  * \sa isApprox(), isMuchSmallerThan(const DenseBase<OtherDerived>&, RealScalar) const
+  */
+template<typename Derived>
+bool DenseBase<Derived>::isMuchSmallerThan(
+  const typename NumTraits<Scalar>::Real& other,
+  const RealScalar& prec
+) const
+{
+  return internal::isMuchSmallerThan_scalar_selector<Derived>::run(derived(), other, prec);
+}
+
+/** \returns \c true if the norm of \c *this is much smaller than the norm of \a other,
+  * within the precision determined by \a prec.
+  *
+  * \note The fuzzy compares are done multiplicatively. A vector \f$ v \f$ is
+  * considered to be much smaller than a vector \f$ w \f$ within precision \f$ p \f$ if
+  * \f[ \Vert v \Vert \leqslant p\,\Vert w\Vert. \f]
+  * For matrices, the comparison is done using the Hilbert-Schmidt norm.
+  *
+  * \sa isApprox(), isMuchSmallerThan(const RealScalar&, RealScalar) const
+  */
+template<typename Derived>
+template<typename OtherDerived>
+bool DenseBase<Derived>::isMuchSmallerThan(
+  const DenseBase<OtherDerived>& other,
+  const RealScalar& prec
+) const
+{
+  return internal::isMuchSmallerThan_object_selector<Derived, OtherDerived>::run(derived(), other.derived(), prec);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_FUZZY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/GeneralProduct.h b/vendor/eigen-3.1.91/Eigen/src/Core/GeneralProduct.h
new file mode 100644
index 0000000..4e64483
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/GeneralProduct.h
@@ -0,0 +1,635 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERAL_PRODUCT_H
+#define EIGEN_GENERAL_PRODUCT_H
+
+namespace Eigen { 
+
+/** \class GeneralProduct
+  * \ingroup Core_Module
+  *
+  * \brief Expression of the product of two general matrices or vectors
+  *
+  * \param LhsNested the type used to store the left-hand side
+  * \param RhsNested the type used to store the right-hand side
+  * \param ProductMode the type of the product
+  *
+  * This class represents an expression of the product of two general matrices.
+  * We call a general matrix, a dense matrix with full storage. For instance,
+  * This excludes triangular, selfadjoint, and sparse matrices.
+  * It is the return type of the operator* between general matrices. Its template
+  * arguments are determined automatically by ProductReturnType. Therefore,
+  * GeneralProduct should never be used direclty. To determine the result type of a
+  * function which involves a matrix product, use ProductReturnType::Type.
+  *
+  * \sa ProductReturnType, MatrixBase::operator*(const MatrixBase<OtherDerived>&)
+  */
+template<typename Lhs, typename Rhs, int ProductType = internal::product_type<Lhs,Rhs>::value>
+class GeneralProduct;
+
+enum {
+  Large = 2,
+  Small = 3
+};
+
+namespace internal {
+
+template<int Rows, int Cols, int Depth> struct product_type_selector;
+
+template<int Size, int MaxSize> struct product_size_category
+{
+  enum { is_large = MaxSize == Dynamic ||
+                    Size >= EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD,
+         value = is_large  ? Large
+               : Size == 1 ? 1
+                           : Small
+  };
+};
+
+template<typename Lhs, typename Rhs> struct product_type
+{
+  typedef typename remove_all<Lhs>::type _Lhs;
+  typedef typename remove_all<Rhs>::type _Rhs;
+  enum {
+    MaxRows  = _Lhs::MaxRowsAtCompileTime,
+    Rows  = _Lhs::RowsAtCompileTime,
+    MaxCols  = _Rhs::MaxColsAtCompileTime,
+    Cols  = _Rhs::ColsAtCompileTime,
+    MaxDepth = EIGEN_SIZE_MIN_PREFER_FIXED(_Lhs::MaxColsAtCompileTime,
+                                           _Rhs::MaxRowsAtCompileTime),
+    Depth = EIGEN_SIZE_MIN_PREFER_FIXED(_Lhs::ColsAtCompileTime,
+                                        _Rhs::RowsAtCompileTime),
+    LargeThreshold = EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+  };
+
+  // the splitting into different lines of code here, introducing the _select enums and the typedef below,
+  // is to work around an internal compiler error with gcc 4.1 and 4.2.
+private:
+  enum {
+    rows_select = product_size_category<Rows,MaxRows>::value,
+    cols_select = product_size_category<Cols,MaxCols>::value,
+    depth_select = product_size_category<Depth,MaxDepth>::value
+  };
+  typedef product_type_selector<rows_select, cols_select, depth_select> selector;
+
+public:
+  enum {
+    value = selector::ret
+  };
+#ifdef EIGEN_DEBUG_PRODUCT
+  static void debug()
+  {
+      EIGEN_DEBUG_VAR(Rows);
+      EIGEN_DEBUG_VAR(Cols);
+      EIGEN_DEBUG_VAR(Depth);
+      EIGEN_DEBUG_VAR(rows_select);
+      EIGEN_DEBUG_VAR(cols_select);
+      EIGEN_DEBUG_VAR(depth_select);
+      EIGEN_DEBUG_VAR(value);
+  }
+#endif
+};
+
+
+/* The following allows to select the kind of product at compile time
+ * based on the three dimensions of the product.
+ * This is a compile time mapping from {1,Small,Large}^3 -> {product types} */
+// FIXME I'm not sure the current mapping is the ideal one.
+template<int M, int N>  struct product_type_selector<M,N,1>              { enum { ret = OuterProduct }; };
+template<int Depth>     struct product_type_selector<1,    1,    Depth>  { enum { ret = InnerProduct }; };
+template<>              struct product_type_selector<1,    1,    1>      { enum { ret = InnerProduct }; };
+template<>              struct product_type_selector<Small,1,    Small>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<1,    Small,Small>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<Small,Small,Small>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<Small, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
+template<>              struct product_type_selector<Small, Large, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
+template<>              struct product_type_selector<Large, Small, 1>    { enum { ret = LazyCoeffBasedProductMode }; };
+template<>              struct product_type_selector<1,    Large,Small>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<1,    Large,Large>  { enum { ret = GemvProduct }; };
+template<>              struct product_type_selector<1,    Small,Large>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<Large,1,    Small>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<Large,1,    Large>  { enum { ret = GemvProduct }; };
+template<>              struct product_type_selector<Small,1,    Large>  { enum { ret = CoeffBasedProductMode }; };
+template<>              struct product_type_selector<Small,Small,Large>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Large,Small,Large>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Small,Large,Large>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Large,Large,Large>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Large,Small,Small>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Small,Large,Small>  { enum { ret = GemmProduct }; };
+template<>              struct product_type_selector<Large,Large,Small>  { enum { ret = GemmProduct }; };
+
+} // end namespace internal
+
+/** \class ProductReturnType
+  * \ingroup Core_Module
+  *
+  * \brief Helper class to get the correct and optimized returned type of operator*
+  *
+  * \param Lhs the type of the left-hand side
+  * \param Rhs the type of the right-hand side
+  * \param ProductMode the type of the product (determined automatically by internal::product_mode)
+  *
+  * This class defines the typename Type representing the optimized product expression
+  * between two matrix expressions. In practice, using ProductReturnType<Lhs,Rhs>::Type
+  * is the recommended way to define the result type of a function returning an expression
+  * which involve a matrix product. The class Product should never be
+  * used directly.
+  *
+  * \sa class Product, MatrixBase::operator*(const MatrixBase<OtherDerived>&)
+  */
+template<typename Lhs, typename Rhs, int ProductType>
+struct ProductReturnType
+{
+  // TODO use the nested type to reduce instanciations ????
+//   typedef typename internal::nested<Lhs,Rhs::ColsAtCompileTime>::type LhsNested;
+//   typedef typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type RhsNested;
+
+  typedef GeneralProduct<Lhs/*Nested*/, Rhs/*Nested*/, ProductType> Type;
+};
+
+template<typename Lhs, typename Rhs>
+struct ProductReturnType<Lhs,Rhs,CoeffBasedProductMode>
+{
+  typedef typename internal::nested<Lhs, Rhs::ColsAtCompileTime, typename internal::plain_matrix_type<Lhs>::type >::type LhsNested;
+  typedef typename internal::nested<Rhs, Lhs::RowsAtCompileTime, typename internal::plain_matrix_type<Rhs>::type >::type RhsNested;
+  typedef CoeffBasedProduct<LhsNested, RhsNested, EvalBeforeAssigningBit | EvalBeforeNestingBit> Type;
+};
+
+template<typename Lhs, typename Rhs>
+struct ProductReturnType<Lhs,Rhs,LazyCoeffBasedProductMode>
+{
+  typedef typename internal::nested<Lhs, Rhs::ColsAtCompileTime, typename internal::plain_matrix_type<Lhs>::type >::type LhsNested;
+  typedef typename internal::nested<Rhs, Lhs::RowsAtCompileTime, typename internal::plain_matrix_type<Rhs>::type >::type RhsNested;
+  typedef CoeffBasedProduct<LhsNested, RhsNested, NestByRefBit> Type;
+};
+
+// this is a workaround for sun CC
+template<typename Lhs, typename Rhs>
+struct LazyProductReturnType : public ProductReturnType<Lhs,Rhs,LazyCoeffBasedProductMode>
+{};
+
+/***********************************************************************
+*  Implementation of Inner Vector Vector Product
+***********************************************************************/
+
+// FIXME : maybe the "inner product" could return a Scalar
+// instead of a 1x1 matrix ??
+// Pro: more natural for the user
+// Cons: this could be a problem if in a meta unrolled algorithm a matrix-matrix
+// product ends up to a row-vector times col-vector product... To tackle this use
+// case, we could have a specialization for Block<MatrixType,1,1> with: operator=(Scalar x);
+
+namespace internal {
+
+template<typename Lhs, typename Rhs>
+struct traits<GeneralProduct<Lhs,Rhs,InnerProduct> >
+ : traits<Matrix<typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1> >
+{};
+
+}
+
+template<typename Lhs, typename Rhs>
+class GeneralProduct<Lhs, Rhs, InnerProduct>
+  : internal::no_assignment_operator,
+    public Matrix<typename internal::scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1>
+{
+    typedef Matrix<typename internal::scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType,1,1> Base;
+  public:
+    GeneralProduct(const Lhs& lhs, const Rhs& rhs)
+    {
+      EIGEN_STATIC_ASSERT((internal::is_same<typename Lhs::RealScalar, typename Rhs::RealScalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+      Base::coeffRef(0,0) = (lhs.transpose().cwiseProduct(rhs)).sum();
+    }
+
+    /** Convertion to scalar */
+    operator const typename Base::Scalar() const {
+      return Base::coeff(0,0);
+    }
+};
+
+/***********************************************************************
+*  Implementation of Outer Vector Vector Product
+***********************************************************************/
+
+namespace internal {
+
+// Column major
+template<typename ProductType, typename Dest, typename Func>
+EIGEN_DONT_INLINE void outer_product_selector_run(const ProductType& prod, Dest& dest, const Func& func, const false_type&)
+{
+  typedef typename Dest::Index Index;
+  // FIXME make sure lhs is sequentially stored
+  // FIXME not very good if rhs is real and lhs complex while alpha is real too
+  const Index cols = dest.cols();
+  for (Index j=0; j<cols; ++j)
+    func(dest.col(j), prod.rhs().coeff(j) * prod.lhs());
+}
+
+// Row major
+template<typename ProductType, typename Dest, typename Func>
+EIGEN_DONT_INLINE void outer_product_selector_run(const ProductType& prod, Dest& dest, const Func& func, const true_type&) {
+  typedef typename Dest::Index Index;
+  // FIXME make sure rhs is sequentially stored
+  // FIXME not very good if lhs is real and rhs complex while alpha is real too
+  const Index rows = dest.rows();
+  for (Index i=0; i<rows; ++i)
+    func(dest.row(i), prod.lhs().coeff(i) * prod.rhs());
+}
+
+template<typename Lhs, typename Rhs>
+struct traits<GeneralProduct<Lhs,Rhs,OuterProduct> >
+ : traits<ProductBase<GeneralProduct<Lhs,Rhs,OuterProduct>, Lhs, Rhs> >
+{};
+
+}
+
+template<typename Lhs, typename Rhs>
+class GeneralProduct<Lhs, Rhs, OuterProduct>
+  : public ProductBase<GeneralProduct<Lhs,Rhs,OuterProduct>, Lhs, Rhs>
+{
+    template<typename T> struct IsRowMajor : internal::conditional<(int(T::Flags)&RowMajorBit), internal::true_type, internal::false_type>::type {};
+    
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)
+
+    GeneralProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {
+      EIGEN_STATIC_ASSERT((internal::is_same<typename Lhs::RealScalar, typename Rhs::RealScalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+    }
+    
+    struct set  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived()  = src; } };
+    struct add  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() += src; } };
+    struct sub  { template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const { dst.const_cast_derived() -= src; } };
+    struct adds {
+      Scalar m_scale;
+      adds(const Scalar& s) : m_scale(s) {}
+      template<typename Dst, typename Src> void operator()(const Dst& dst, const Src& src) const {
+        dst.const_cast_derived() += m_scale * src;
+      }
+    };
+    
+    template<typename Dest>
+    inline void evalTo(Dest& dest) const {
+      internal::outer_product_selector_run(*this, dest, set(), IsRowMajor<Dest>());
+    }
+    
+    template<typename Dest>
+    inline void addTo(Dest& dest) const {
+      internal::outer_product_selector_run(*this, dest, add(), IsRowMajor<Dest>());
+    }
+
+    template<typename Dest>
+    inline void subTo(Dest& dest) const {
+      internal::outer_product_selector_run(*this, dest, sub(), IsRowMajor<Dest>());
+    }
+
+    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+    {
+      internal::outer_product_selector_run(*this, dest, adds(alpha), IsRowMajor<Dest>());
+    }
+};
+
+/***********************************************************************
+*  Implementation of General Matrix Vector Product
+***********************************************************************/
+
+/*  According to the shape/flags of the matrix we have to distinghish 3 different cases:
+ *   1 - the matrix is col-major, BLAS compatible and M is large => call fast BLAS-like colmajor routine
+ *   2 - the matrix is row-major, BLAS compatible and N is large => call fast BLAS-like rowmajor routine
+ *   3 - all other cases are handled using a simple loop along the outer-storage direction.
+ *  Therefore we need a lower level meta selector.
+ *  Furthermore, if the matrix is the rhs, then the product has to be transposed.
+ */
+namespace internal {
+
+template<typename Lhs, typename Rhs>
+struct traits<GeneralProduct<Lhs,Rhs,GemvProduct> >
+ : traits<ProductBase<GeneralProduct<Lhs,Rhs,GemvProduct>, Lhs, Rhs> >
+{};
+
+template<int Side, int StorageOrder, bool BlasCompatible>
+struct gemv_selector;
+
+} // end namespace internal
+
+template<typename Lhs, typename Rhs>
+class GeneralProduct<Lhs, Rhs, GemvProduct>
+  : public ProductBase<GeneralProduct<Lhs,Rhs,GemvProduct>, Lhs, Rhs>
+{
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)
+
+    typedef typename Lhs::Scalar LhsScalar;
+    typedef typename Rhs::Scalar RhsScalar;
+
+    GeneralProduct(const Lhs& a_lhs, const Rhs& a_rhs) : Base(a_lhs,a_rhs)
+    {
+//       EIGEN_STATIC_ASSERT((internal::is_same<typename Lhs::Scalar, typename Rhs::Scalar>::value),
+//         YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+    }
+
+    enum { Side = Lhs::IsVectorAtCompileTime ? OnTheLeft : OnTheRight };
+    typedef typename internal::conditional<int(Side)==OnTheRight,_LhsNested,_RhsNested>::type MatrixType;
+
+    template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+    {
+      eigen_assert(m_lhs.rows() == dst.rows() && m_rhs.cols() == dst.cols());
+      internal::gemv_selector<Side,(int(MatrixType::Flags)&RowMajorBit) ? RowMajor : ColMajor,
+                       bool(internal::blas_traits<MatrixType>::HasUsableDirectAccess)>::run(*this, dst, alpha);
+    }
+};
+
+namespace internal {
+
+// The vector is on the left => transposition
+template<int StorageOrder, bool BlasCompatible>
+struct gemv_selector<OnTheLeft,StorageOrder,BlasCompatible>
+{
+  template<typename ProductType, typename Dest>
+  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)
+  {
+    Transpose<Dest> destT(dest);
+    enum { OtherStorageOrder = StorageOrder == RowMajor ? ColMajor : RowMajor };
+    gemv_selector<OnTheRight,OtherStorageOrder,BlasCompatible>
+      ::run(GeneralProduct<Transpose<const typename ProductType::_RhsNested>,Transpose<const typename ProductType::_LhsNested>, GemvProduct>
+        (prod.rhs().transpose(), prod.lhs().transpose()), destT, alpha);
+  }
+};
+
+template<typename Scalar,int Size,int MaxSize,bool Cond> struct gemv_static_vector_if;
+
+template<typename Scalar,int Size,int MaxSize>
+struct gemv_static_vector_if<Scalar,Size,MaxSize,false>
+{
+  EIGEN_STRONG_INLINE  Scalar* data() { eigen_internal_assert(false && "should never be called"); return 0; }
+};
+
+template<typename Scalar,int Size>
+struct gemv_static_vector_if<Scalar,Size,Dynamic,true>
+{
+  EIGEN_STRONG_INLINE Scalar* data() { return 0; }
+};
+
+template<typename Scalar,int Size,int MaxSize>
+struct gemv_static_vector_if<Scalar,Size,MaxSize,true>
+{
+  #if EIGEN_ALIGN_STATICALLY
+  internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize),0> m_data;
+  EIGEN_STRONG_INLINE Scalar* data() { return m_data.array; }
+  #else
+  // Some architectures cannot align on the stack,
+  // => let's manually enforce alignment by allocating more data and return the address of the first aligned element.
+  enum {
+    ForceAlignment  = internal::packet_traits<Scalar>::Vectorizable,
+    PacketSize      = internal::packet_traits<Scalar>::size
+  };
+  internal::plain_array<Scalar,EIGEN_SIZE_MIN_PREFER_FIXED(Size,MaxSize)+(ForceAlignment?PacketSize:0),0> m_data;
+  EIGEN_STRONG_INLINE Scalar* data() {
+    return ForceAlignment
+            ? reinterpret_cast<Scalar*>((reinterpret_cast<size_t>(m_data.array) & ~(size_t(15))) + 16)
+            : m_data.array;
+  }
+  #endif
+};
+
+template<> struct gemv_selector<OnTheRight,ColMajor,true>
+{
+  template<typename ProductType, typename Dest>
+  static inline void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)
+  {
+    typedef typename ProductType::Index Index;
+    typedef typename ProductType::LhsScalar   LhsScalar;
+    typedef typename ProductType::RhsScalar   RhsScalar;
+    typedef typename ProductType::Scalar      ResScalar;
+    typedef typename ProductType::RealScalar  RealScalar;
+    typedef typename ProductType::ActualLhsType ActualLhsType;
+    typedef typename ProductType::ActualRhsType ActualRhsType;
+    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;
+    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;
+    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;
+
+    ActualLhsType actualLhs = LhsBlasTraits::extract(prod.lhs());
+    ActualRhsType actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())
+                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());
+
+    enum {
+      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
+      // on, the other hand it is good for the cache to pack the vector anyways...
+      EvalToDestAtCompileTime = Dest::InnerStrideAtCompileTime==1,
+      ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),
+      MightCannotUseDest = (Dest::InnerStrideAtCompileTime!=1) || ComplexByReal
+    };
+
+    gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;
+
+    bool alphaIsCompatible = (!ComplexByReal) || (imag(actualAlpha)==RealScalar(0));
+    bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;
+    
+    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);
+
+    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+                                                  evalToDest ? dest.data() : static_dest.data());
+    
+    if(!evalToDest)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      int size = dest.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      if(!alphaIsCompatible)
+      {
+        MappedDest(actualDestPtr, dest.size()).setZero();
+        compatibleAlpha = RhsScalar(1);
+      }
+      else
+        MappedDest(actualDestPtr, dest.size()) = dest;
+    }
+
+    general_matrix_vector_product
+      <Index,LhsScalar,ColMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsBlasTraits::NeedToConjugate>::run(
+        actualLhs.rows(), actualLhs.cols(),
+        actualLhs.data(), actualLhs.outerStride(),
+        actualRhs.data(), actualRhs.innerStride(),
+        actualDestPtr, 1,
+        compatibleAlpha);
+
+    if (!evalToDest)
+    {
+      if(!alphaIsCompatible)
+        dest += actualAlpha * MappedDest(actualDestPtr, dest.size());
+      else
+        dest = MappedDest(actualDestPtr, dest.size());
+    }
+  }
+};
+
+template<> struct gemv_selector<OnTheRight,RowMajor,true>
+{
+  template<typename ProductType, typename Dest>
+  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)
+  {
+    typedef typename ProductType::LhsScalar LhsScalar;
+    typedef typename ProductType::RhsScalar RhsScalar;
+    typedef typename ProductType::Scalar    ResScalar;
+    typedef typename ProductType::Index Index;
+    typedef typename ProductType::ActualLhsType ActualLhsType;
+    typedef typename ProductType::ActualRhsType ActualRhsType;
+    typedef typename ProductType::_ActualRhsType _ActualRhsType;
+    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;
+    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;
+
+    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());
+    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())
+                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());
+
+    enum {
+      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
+      // on, the other hand it is good for the cache to pack the vector anyways...
+      DirectlyUseRhs = _ActualRhsType::InnerStrideAtCompileTime==1
+    };
+
+    gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;
+
+    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
+        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());
+
+    if(!DirectlyUseRhs)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      int size = actualRhs.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
+    }
+
+    general_matrix_vector_product
+      <Index,LhsScalar,RowMajor,LhsBlasTraits::NeedToConjugate,RhsScalar,RhsBlasTraits::NeedToConjugate>::run(
+        actualLhs.rows(), actualLhs.cols(),
+        actualLhs.data(), actualLhs.outerStride(),
+        actualRhsPtr, 1,
+        dest.data(), dest.innerStride(),
+        actualAlpha);
+  }
+};
+
+template<> struct gemv_selector<OnTheRight,ColMajor,false>
+{
+  template<typename ProductType, typename Dest>
+  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)
+  {
+    typedef typename Dest::Index Index;
+    // TODO makes sure dest is sequentially stored in memory, otherwise use a temp
+    const Index size = prod.rhs().rows();
+    for(Index k=0; k<size; ++k)
+      dest += (alpha*prod.rhs().coeff(k)) * prod.lhs().col(k);
+  }
+};
+
+template<> struct gemv_selector<OnTheRight,RowMajor,false>
+{
+  template<typename ProductType, typename Dest>
+  static void run(const ProductType& prod, Dest& dest, const typename ProductType::Scalar& alpha)
+  {
+    typedef typename Dest::Index Index;
+    // TODO makes sure rhs is sequentially stored in memory, otherwise use a temp
+    const Index rows = prod.rows();
+    for(Index i=0; i<rows; ++i)
+      dest.coeffRef(i) += alpha * (prod.lhs().row(i).cwiseProduct(prod.rhs().transpose())).sum();
+  }
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* Implementation of matrix base methods
+***************************************************************************/
+
+/** \returns the matrix product of \c *this and \a other.
+  *
+  * \note If instead of the matrix product you want the coefficient-wise product, see Cwise::operator*().
+  *
+  * \sa lazyProduct(), operator*=(const MatrixBase&), Cwise::operator*()
+  */
+template<typename Derived>
+template<typename OtherDerived>
+inline const typename ProductReturnType<Derived, OtherDerived>::Type
+MatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
+{
+  // A note regarding the function declaration: In MSVC, this function will sometimes
+  // not be inlined since DenseStorage is an unwindable object for dynamic
+  // matrices and product types are holding a member to store the result.
+  // Thus it does not help tagging this function with EIGEN_STRONG_INLINE.
+  enum {
+    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic
+                   || OtherDerived::RowsAtCompileTime==Dynamic
+                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
+    AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
+    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
+  };
+  // note to the lost user:
+  //    * for a dot product use: v1.dot(v2)
+  //    * for a coeff-wise product use: v1.cwiseProduct(v2)
+  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
+    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
+    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
+#ifdef EIGEN_DEBUG_PRODUCT
+  internal::product_type<Derived,OtherDerived>::debug();
+#endif
+  return typename ProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
+}
+
+/** \returns an expression of the matrix product of \c *this and \a other without implicit evaluation.
+  *
+  * The returned product will behave like any other expressions: the coefficients of the product will be
+  * computed once at a time as requested. This might be useful in some extremely rare cases when only
+  * a small and no coherent fraction of the result's coefficients have to be computed.
+  *
+  * \warning This version of the matrix product can be much much slower. So use it only if you know
+  * what you are doing and that you measured a true speed improvement.
+  *
+  * \sa operator*(const MatrixBase&)
+  */
+template<typename Derived>
+template<typename OtherDerived>
+const typename LazyProductReturnType<Derived,OtherDerived>::Type
+MatrixBase<Derived>::lazyProduct(const MatrixBase<OtherDerived> &other) const
+{
+  enum {
+    ProductIsValid =  Derived::ColsAtCompileTime==Dynamic
+                   || OtherDerived::RowsAtCompileTime==Dynamic
+                   || int(Derived::ColsAtCompileTime)==int(OtherDerived::RowsAtCompileTime),
+    AreVectors = Derived::IsVectorAtCompileTime && OtherDerived::IsVectorAtCompileTime,
+    SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(Derived,OtherDerived)
+  };
+  // note to the lost user:
+  //    * for a dot product use: v1.dot(v2)
+  //    * for a coeff-wise product use: v1.cwiseProduct(v2)
+  EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
+    INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+  EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
+    INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+  EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
+
+  return typename LazyProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/GenericPacketMath.h b/vendor/eigen-3.1.91/Eigen/src/Core/GenericPacketMath.h
new file mode 100644
index 0000000..6429442
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/GenericPacketMath.h
@@ -0,0 +1,350 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERIC_PACKET_MATH_H
+#define EIGEN_GENERIC_PACKET_MATH_H
+
+namespace Eigen {
+
+namespace internal {
+
+/** \internal
+  * \file GenericPacketMath.h
+  *
+  * Default implementation for types not supported by the vectorization.
+  * In practice these functions are provided to make easier the writing
+  * of generic vectorized code.
+  */
+
+#ifndef EIGEN_DEBUG_ALIGNED_LOAD
+#define EIGEN_DEBUG_ALIGNED_LOAD
+#endif
+
+#ifndef EIGEN_DEBUG_UNALIGNED_LOAD
+#define EIGEN_DEBUG_UNALIGNED_LOAD
+#endif
+
+#ifndef EIGEN_DEBUG_ALIGNED_STORE
+#define EIGEN_DEBUG_ALIGNED_STORE
+#endif
+
+#ifndef EIGEN_DEBUG_UNALIGNED_STORE
+#define EIGEN_DEBUG_UNALIGNED_STORE
+#endif
+
+struct default_packet_traits
+{
+  enum {
+    HasAdd    = 1,
+    HasSub    = 1,
+    HasMul    = 1,
+    HasNegate = 1,
+    HasAbs    = 1,
+    HasAbs2   = 1,
+    HasMin    = 1,
+    HasMax    = 1,
+    HasConj   = 1,
+    HasSetLinear = 1,
+
+    HasDiv    = 0,
+    HasSqrt   = 0,
+    HasExp    = 0,
+    HasLog    = 0,
+    HasPow    = 0,
+
+    HasSin    = 0,
+    HasCos    = 0,
+    HasTan    = 0,
+    HasASin   = 0,
+    HasACos   = 0,
+    HasATan   = 0
+  };
+};
+
+template<typename T> struct packet_traits : default_packet_traits
+{
+  typedef T type;
+  enum {
+    Vectorizable = 0,
+    size = 1,
+    AlignedOnScalar = 0
+  };
+  enum {
+    HasAdd    = 0,
+    HasSub    = 0,
+    HasMul    = 0,
+    HasNegate = 0,
+    HasAbs    = 0,
+    HasAbs2   = 0,
+    HasMin    = 0,
+    HasMax    = 0,
+    HasConj   = 0,
+    HasSetLinear = 0
+  };
+};
+
+/** \internal \returns a + b (coeff-wise) */
+template<typename Packet> inline Packet
+padd(const Packet& a,
+        const Packet& b) { return a+b; }
+
+/** \internal \returns a - b (coeff-wise) */
+template<typename Packet> inline Packet
+psub(const Packet& a,
+        const Packet& b) { return a-b; }
+
+/** \internal \returns -a (coeff-wise) */
+template<typename Packet> inline Packet
+pnegate(const Packet& a) { return -a; }
+
+/** \internal \returns conj(a) (coeff-wise) */
+template<typename Packet> inline Packet
+pconj(const Packet& a) { return conj(a); }
+
+/** \internal \returns a * b (coeff-wise) */
+template<typename Packet> inline Packet
+pmul(const Packet& a,
+        const Packet& b) { return a*b; }
+
+/** \internal \returns a / b (coeff-wise) */
+template<typename Packet> inline Packet
+pdiv(const Packet& a,
+        const Packet& b) { return a/b; }
+
+/** \internal \returns the min of \a a and \a b  (coeff-wise) */
+template<typename Packet> inline Packet
+pmin(const Packet& a,
+        const Packet& b) { using std::min; return (min)(a, b); }
+
+/** \internal \returns the max of \a a and \a b  (coeff-wise) */
+template<typename Packet> inline Packet
+pmax(const Packet& a,
+        const Packet& b) { using std::max; return (max)(a, b); }
+
+/** \internal \returns the absolute value of \a a */
+template<typename Packet> inline Packet
+pabs(const Packet& a) { using std::abs; return abs(a); }
+
+/** \internal \returns the bitwise and of \a a and \a b */
+template<typename Packet> inline Packet
+pand(const Packet& a, const Packet& b) { return a & b; }
+
+/** \internal \returns the bitwise or of \a a and \a b */
+template<typename Packet> inline Packet
+por(const Packet& a, const Packet& b) { return a | b; }
+
+/** \internal \returns the bitwise xor of \a a and \a b */
+template<typename Packet> inline Packet
+pxor(const Packet& a, const Packet& b) { return a ^ b; }
+
+/** \internal \returns the bitwise andnot of \a a and \a b */
+template<typename Packet> inline Packet
+pandnot(const Packet& a, const Packet& b) { return a & (!b); }
+
+/** \internal \returns a packet version of \a *from, from must be 16 bytes aligned */
+template<typename Packet> inline Packet
+pload(const typename unpacket_traits<Packet>::type* from) { return *from; }
+
+/** \internal \returns a packet version of \a *from, (un-aligned load) */
+template<typename Packet> inline Packet
+ploadu(const typename unpacket_traits<Packet>::type* from) { return *from; }
+
+/** \internal \returns a packet with elements of \a *from duplicated.
+  * For instance, for a packet of 8 elements, 4 scalar will be read from \a *from and
+  * duplicated to form: {from[0],from[0],from[1],from[1],,from[2],from[2],,from[3],from[3]}
+  * Currently, this function is only used for scalar * complex products.
+ */
+template<typename Packet> inline Packet
+ploaddup(const typename unpacket_traits<Packet>::type* from) { return *from; }
+
+/** \internal \returns a packet with constant coefficients \a a, e.g.: (a,a,a,a) */
+template<typename Packet> inline Packet
+pset1(const typename unpacket_traits<Packet>::type& a) { return a; }
+
+/** \internal \brief Returns a packet with coefficients (a,a+1,...,a+packet_size-1). */
+template<typename Scalar> inline typename packet_traits<Scalar>::type
+plset(const Scalar& a) { return a; }
+
+/** \internal copy the packet \a from to \a *to, \a to must be 16 bytes aligned */
+template<typename Scalar, typename Packet> inline void pstore(Scalar* to, const Packet& from)
+{ (*to) = from; }
+
+/** \internal copy the packet \a from to \a *to, (un-aligned store) */
+template<typename Scalar, typename Packet> inline void pstoreu(Scalar* to, const Packet& from)
+{ (*to) = from; }
+
+/** \internal tries to do cache prefetching of \a addr */
+template<typename Scalar> inline void prefetch(const Scalar* addr)
+{
+#if !defined(_MSC_VER)
+__builtin_prefetch(addr);
+#endif
+}
+
+/** \internal \returns the first element of a packet */
+template<typename Packet> inline typename unpacket_traits<Packet>::type pfirst(const Packet& a)
+{ return a; }
+
+/** \internal \returns a packet where the element i contains the sum of the packet of \a vec[i] */
+template<typename Packet> inline Packet
+preduxp(const Packet* vecs) { return vecs[0]; }
+
+/** \internal \returns the sum of the elements of \a a*/
+template<typename Packet> inline typename unpacket_traits<Packet>::type predux(const Packet& a)
+{ return a; }
+
+/** \internal \returns the product of the elements of \a a*/
+template<typename Packet> inline typename unpacket_traits<Packet>::type predux_mul(const Packet& a)
+{ return a; }
+
+/** \internal \returns the min of the elements of \a a*/
+template<typename Packet> inline typename unpacket_traits<Packet>::type predux_min(const Packet& a)
+{ return a; }
+
+/** \internal \returns the max of the elements of \a a*/
+template<typename Packet> inline typename unpacket_traits<Packet>::type predux_max(const Packet& a)
+{ return a; }
+
+/** \internal \returns the reversed elements of \a a*/
+template<typename Packet> inline Packet preverse(const Packet& a)
+{ return a; }
+
+
+/** \internal \returns \a a with real and imaginary part flipped (for complex type only) */
+template<typename Packet> inline Packet pcplxflip(const Packet& a)
+{
+  // FIXME: uncomment the following in case we drop the internal imag and real functions.
+//   using std::imag;
+//   using std::real;
+  return Packet(imag(a),real(a));
+}
+
+/**************************
+* Special math functions
+***************************/
+
+/** \internal \returns the sine of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet psin(const Packet& a) { using std::sin; return sin(a); }
+
+/** \internal \returns the cosine of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet pcos(const Packet& a) { using std::cos; return cos(a); }
+
+/** \internal \returns the tan of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet ptan(const Packet& a) { using std::tan; return tan(a); }
+
+/** \internal \returns the arc sine of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet pasin(const Packet& a) { using std::asin; return asin(a); }
+
+/** \internal \returns the arc cosine of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet pacos(const Packet& a) { using std::acos; return acos(a); }
+
+/** \internal \returns the exp of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet pexp(const Packet& a) { using std::exp; return exp(a); }
+
+/** \internal \returns the log of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet plog(const Packet& a) { using std::log; return log(a); }
+
+/** \internal \returns the square-root of \a a (coeff-wise) */
+template<typename Packet> EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+Packet psqrt(const Packet& a) { using std::sqrt; return sqrt(a); }
+
+/***************************************************************************
+* The following functions might not have to be overwritten for vectorized types
+***************************************************************************/
+
+/** \internal copy a packet with constant coeficient \a a (e.g., [a,a,a,a]) to \a *to. \a to must be 16 bytes aligned */
+// NOTE: this function must really be templated on the packet type (think about different packet types for the same scalar type)
+template<typename Packet>
+inline void pstore1(typename unpacket_traits<Packet>::type* to, const typename unpacket_traits<Packet>::type& a)
+{
+  pstore(to, pset1<Packet>(a));
+}
+
+/** \internal \returns a * b + c (coeff-wise) */
+template<typename Packet> inline Packet
+pmadd(const Packet&  a,
+         const Packet&  b,
+         const Packet&  c)
+{ return padd(pmul(a, b),c); }
+
+/** \internal \returns a packet version of \a *from.
+  * If LoadMode equals #Aligned, \a from must be 16 bytes aligned */
+template<typename Packet, int LoadMode>
+inline Packet ploadt(const typename unpacket_traits<Packet>::type* from)
+{
+  if(LoadMode == Aligned)
+    return pload<Packet>(from);
+  else
+    return ploadu<Packet>(from);
+}
+
+/** \internal copy the packet \a from to \a *to.
+  * If StoreMode equals #Aligned, \a to must be 16 bytes aligned */
+template<typename Scalar, typename Packet, int LoadMode>
+inline void pstoret(Scalar* to, const Packet& from)
+{
+  if(LoadMode == Aligned)
+    pstore(to, from);
+  else
+    pstoreu(to, from);
+}
+
+/** \internal default implementation of palign() allowing partial specialization */
+template<int Offset,typename PacketType>
+struct palign_impl
+{
+  // by default data are aligned, so there is nothing to be done :)
+  static inline void run(PacketType&, const PacketType&) {}
+};
+
+/** \internal update \a first using the concatenation of the packet_size minus \a Offset last elements
+  * of \a first and \a Offset first elements of \a second.
+  * 
+  * This function is currently only used to optimize matrix-vector products on unligned matrices.
+  * It takes 2 packets that represent a contiguous memory array, and returns a packet starting
+  * at the position \a Offset. For instance, for packets of 4 elements, we have:
+  *  Input:
+  *  - first = {f0,f1,f2,f3}
+  *  - second = {s0,s1,s2,s3}
+  * Output: 
+  *   - if Offset==0 then {f0,f1,f2,f3}
+  *   - if Offset==1 then {f1,f2,f3,s0}
+  *   - if Offset==2 then {f2,f3,s0,s1}
+  *   - if Offset==3 then {f3,s0,s1,s3}
+  */
+template<int Offset,typename PacketType>
+inline void palign(PacketType& first, const PacketType& second)
+{
+  palign_impl<Offset,PacketType>::run(first,second);
+}
+
+/***************************************************************************
+* Fast complex products (GCC generates a function call which is very slow)
+***************************************************************************/
+
+template<> inline std::complex<float> pmul(const std::complex<float>& a, const std::complex<float>& b)
+{ return std::complex<float>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
+
+template<> inline std::complex<double> pmul(const std::complex<double>& a, const std::complex<double>& b)
+{ return std::complex<double>(real(a)*real(b) - imag(a)*imag(b), imag(a)*real(b) + real(a)*imag(b)); }
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERIC_PACKET_MATH_H
+
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/GlobalFunctions.h b/vendor/eigen-3.1.91/Eigen/src/Core/GlobalFunctions.h
new file mode 100644
index 0000000..02cae55
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/GlobalFunctions.h
@@ -0,0 +1,91 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010-2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GLOBAL_FUNCTIONS_H
+#define EIGEN_GLOBAL_FUNCTIONS_H
+
+#define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR) \
+  template<typename Derived> \
+  inline const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> \
+  NAME(const Eigen::ArrayBase<Derived>& x) { \
+    return x.derived(); \
+  }
+
+#define EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(NAME,FUNCTOR) \
+  \
+  template<typename Derived> \
+  struct NAME##_retval<ArrayBase<Derived> > \
+  { \
+    typedef const Eigen::CwiseUnaryOp<Eigen::internal::FUNCTOR<typename Derived::Scalar>, const Derived> type; \
+  }; \
+  template<typename Derived> \
+  struct NAME##_impl<ArrayBase<Derived> > \
+  { \
+    static inline typename NAME##_retval<ArrayBase<Derived> >::type run(const Eigen::ArrayBase<Derived>& x) \
+    { \
+      return x.derived(); \
+    } \
+  };
+
+
+namespace Eigen
+{
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(real,scalar_real_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(imag,scalar_imag_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sin,scalar_sin_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(cos,scalar_cos_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(asin,scalar_asin_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(acos,scalar_acos_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(tan,scalar_tan_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(exp,scalar_exp_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(log,scalar_log_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(abs,scalar_abs_op)
+  EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(sqrt,scalar_sqrt_op)
+  
+  template<typename Derived>
+  inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_pow_op<typename Derived::Scalar>, const Derived>
+  pow(const Eigen::ArrayBase<Derived>& x, const typename Derived::Scalar& exponent) {
+    return x.derived().pow(exponent);
+  }
+
+  template<typename Derived>
+  inline const Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>
+  pow(const Eigen::ArrayBase<Derived>& x, const Eigen::ArrayBase<Derived>& exponents) 
+  {
+    return Eigen::CwiseBinaryOp<Eigen::internal::scalar_binary_pow_op<typename Derived::Scalar, typename Derived::Scalar>, const Derived, const Derived>(
+      x.derived(),
+      exponents.derived()
+    );
+  }
+  
+  /**
+  * \brief Component-wise division of a scalar by array elements.
+  **/
+  template <typename Derived>
+  inline const Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>
+    operator/(const typename Derived::Scalar& s, const Eigen::ArrayBase<Derived>& a)
+  {
+    return Eigen::CwiseUnaryOp<Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>, const Derived>(
+      a.derived(),
+      Eigen::internal::scalar_inverse_mult_op<typename Derived::Scalar>(s)  
+    );
+  }
+
+  namespace internal
+  {
+    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(real,scalar_real_op)
+    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op)
+    EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs2,scalar_abs2_op)
+  }
+}
+
+// TODO: cleanly disable those functions that are not supported on Array (internal::real_ref, internal::random, internal::isApprox...)
+
+#endif // EIGEN_GLOBAL_FUNCTIONS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/IO.h b/vendor/eigen-3.1.91/Eigen/src/Core/IO.h
new file mode 100644
index 0000000..50bf93d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/IO.h
@@ -0,0 +1,249 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_IO_H
+#define EIGEN_IO_H
+
+namespace Eigen { 
+
+enum { DontAlignCols = 1 };
+enum { StreamPrecision = -1,
+       FullPrecision = -2 };
+
+namespace internal {
+template<typename Derived>
+std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt);
+}
+
+/** \class IOFormat
+  * \ingroup Core_Module
+  *
+  * \brief Stores a set of parameters controlling the way matrices are printed
+  *
+  * List of available parameters:
+  *  - \b precision number of digits for floating point values, or one of the special constants \c StreamPrecision and \c FullPrecision.
+  *                 The default is the special value \c StreamPrecision which means to use the
+  *                 stream's own precision setting, as set for instance using \c cout.precision(3). The other special value
+  *                 \c FullPrecision means that the number of digits will be computed to match the full precision of each floating-point
+  *                 type.
+  *  - \b flags an OR-ed combination of flags, the default value is 0, the only currently available flag is \c DontAlignCols which
+  *             allows to disable the alignment of columns, resulting in faster code.
+  *  - \b coeffSeparator string printed between two coefficients of the same row
+  *  - \b rowSeparator string printed between two rows
+  *  - \b rowPrefix string printed at the beginning of each row
+  *  - \b rowSuffix string printed at the end of each row
+  *  - \b matPrefix string printed at the beginning of the matrix
+  *  - \b matSuffix string printed at the end of the matrix
+  *
+  * Example: \include IOFormat.cpp
+  * Output: \verbinclude IOFormat.out
+  *
+  * \sa DenseBase::format(), class WithFormat
+  */
+struct IOFormat
+{
+  /** Default contructor, see class IOFormat for the meaning of the parameters */
+  IOFormat(int _precision = StreamPrecision, int _flags = 0,
+    const std::string& _coeffSeparator = " ",
+    const std::string& _rowSeparator = "\n", const std::string& _rowPrefix="", const std::string& _rowSuffix="",
+    const std::string& _matPrefix="", const std::string& _matSuffix="")
+  : matPrefix(_matPrefix), matSuffix(_matSuffix), rowPrefix(_rowPrefix), rowSuffix(_rowSuffix), rowSeparator(_rowSeparator),
+    coeffSeparator(_coeffSeparator), precision(_precision), flags(_flags)
+  {
+    int i = int(matSuffix.length())-1;
+    while (i>=0 && matSuffix[i]!='\n')
+    {
+      rowSpacer += ' ';
+      i--;
+    }
+  }
+  std::string matPrefix, matSuffix;
+  std::string rowPrefix, rowSuffix, rowSeparator, rowSpacer;
+  std::string coeffSeparator;
+  int precision;
+  int flags;
+};
+
+/** \class WithFormat
+  * \ingroup Core_Module
+  *
+  * \brief Pseudo expression providing matrix output with given format
+  *
+  * \param ExpressionType the type of the object on which IO stream operations are performed
+  *
+  * This class represents an expression with stream operators controlled by a given IOFormat.
+  * It is the return type of DenseBase::format()
+  * and most of the time this is the only way it is used.
+  *
+  * See class IOFormat for some examples.
+  *
+  * \sa DenseBase::format(), class IOFormat
+  */
+template<typename ExpressionType>
+class WithFormat
+{
+  public:
+
+    WithFormat(const ExpressionType& matrix, const IOFormat& format)
+      : m_matrix(matrix), m_format(format)
+    {}
+
+    friend std::ostream & operator << (std::ostream & s, const WithFormat& wf)
+    {
+      return internal::print_matrix(s, wf.m_matrix.eval(), wf.m_format);
+    }
+
+  protected:
+    const typename ExpressionType::Nested m_matrix;
+    IOFormat m_format;
+};
+
+/** \returns a WithFormat proxy object allowing to print a matrix the with given
+  * format \a fmt.
+  *
+  * See class IOFormat for some examples.
+  *
+  * \sa class IOFormat, class WithFormat
+  */
+template<typename Derived>
+inline const WithFormat<Derived>
+DenseBase<Derived>::format(const IOFormat& fmt) const
+{
+  return WithFormat<Derived>(derived(), fmt);
+}
+
+namespace internal {
+
+template<typename Scalar, bool IsInteger>
+struct significant_decimals_default_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline int run()
+  {
+    using std::ceil;
+    using std::log;
+    return cast<RealScalar,int>(ceil(-log(NumTraits<RealScalar>::epsilon())/log(RealScalar(10))));
+  }
+};
+
+template<typename Scalar>
+struct significant_decimals_default_impl<Scalar, true>
+{
+  static inline int run()
+  {
+    return 0;
+  }
+};
+
+template<typename Scalar>
+struct significant_decimals_impl
+  : significant_decimals_default_impl<Scalar, NumTraits<Scalar>::IsInteger>
+{};
+
+/** \internal
+  * print the matrix \a _m to the output stream \a s using the output format \a fmt */
+template<typename Derived>
+std::ostream & print_matrix(std::ostream & s, const Derived& _m, const IOFormat& fmt)
+{
+  if(_m.size() == 0)
+  {
+    s << fmt.matPrefix << fmt.matSuffix;
+    return s;
+  }
+  
+  typename Derived::Nested m = _m;
+  typedef typename Derived::Scalar Scalar;
+  typedef typename Derived::Index Index;
+
+  Index width = 0;
+
+  std::streamsize explicit_precision;
+  if(fmt.precision == StreamPrecision)
+  {
+    explicit_precision = 0;
+  }
+  else if(fmt.precision == FullPrecision)
+  {
+    if (NumTraits<Scalar>::IsInteger)
+    {
+      explicit_precision = 0;
+    }
+    else
+    {
+      explicit_precision = significant_decimals_impl<Scalar>::run();
+    }
+  }
+  else
+  {
+    explicit_precision = fmt.precision;
+  }
+
+  bool align_cols = !(fmt.flags & DontAlignCols);
+  if(align_cols)
+  {
+    // compute the largest width
+    for(Index j = 1; j < m.cols(); ++j)
+      for(Index i = 0; i < m.rows(); ++i)
+      {
+        std::stringstream sstr;
+        if(explicit_precision) sstr.precision(explicit_precision);
+        sstr << m.coeff(i,j);
+        width = std::max<Index>(width, Index(sstr.str().length()));
+      }
+  }
+  std::streamsize old_precision = 0;
+  if(explicit_precision) old_precision = s.precision(explicit_precision);
+  s << fmt.matPrefix;
+  for(Index i = 0; i < m.rows(); ++i)
+  {
+    if (i)
+      s << fmt.rowSpacer;
+    s << fmt.rowPrefix;
+    if(width) s.width(width);
+    s << m.coeff(i, 0);
+    for(Index j = 1; j < m.cols(); ++j)
+    {
+      s << fmt.coeffSeparator;
+      if (width) s.width(width);
+      s << m.coeff(i, j);
+    }
+    s << fmt.rowSuffix;
+    if( i < m.rows() - 1)
+      s << fmt.rowSeparator;
+  }
+  s << fmt.matSuffix;
+  if(explicit_precision) s.precision(old_precision);
+  return s;
+}
+
+} // end namespace internal
+
+/** \relates DenseBase
+  *
+  * Outputs the matrix, to the given stream.
+  *
+  * If you wish to print the matrix with a format different than the default, use DenseBase::format().
+  *
+  * It is also possible to change the default format by defining EIGEN_DEFAULT_IO_FORMAT before including Eigen headers.
+  * If not defined, this will automatically be defined to Eigen::IOFormat(), that is the Eigen::IOFormat with default parameters.
+  *
+  * \sa DenseBase::format()
+  */
+template<typename Derived>
+std::ostream & operator <<
+(std::ostream & s,
+ const DenseBase<Derived> & m)
+{
+  return internal::print_matrix(s, m.eval(), EIGEN_DEFAULT_IO_FORMAT);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_IO_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Map.h b/vendor/eigen-3.1.91/Eigen/src/Core/Map.h
new file mode 100644
index 0000000..f804c89
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Map.h
@@ -0,0 +1,192 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MAP_H
+#define EIGEN_MAP_H
+
+namespace Eigen { 
+
+/** \class Map
+  * \ingroup Core_Module
+  *
+  * \brief A matrix or vector expression mapping an existing array of data.
+  *
+  * \tparam PlainObjectType the equivalent matrix type of the mapped data
+  * \tparam MapOptions specifies whether the pointer is \c #Aligned, or \c #Unaligned.
+  *                The default is \c #Unaligned.
+  * \tparam StrideType optionally specifies strides. By default, Map assumes the memory layout
+  *                   of an ordinary, contiguous array. This can be overridden by specifying strides.
+  *                   The type passed here must be a specialization of the Stride template, see examples below.
+  *
+  * This class represents a matrix or vector expression mapping an existing array of data.
+  * It can be used to let Eigen interface without any overhead with non-Eigen data structures,
+  * such as plain C arrays or structures from other libraries. By default, it assumes that the
+  * data is laid out contiguously in memory. You can however override this by explicitly specifying
+  * inner and outer strides.
+  *
+  * Here's an example of simply mapping a contiguous array as a \ref TopicStorageOrders "column-major" matrix:
+  * \include Map_simple.cpp
+  * Output: \verbinclude Map_simple.out
+  *
+  * If you need to map non-contiguous arrays, you can do so by specifying strides:
+  *
+  * Here's an example of mapping an array as a vector, specifying an inner stride, that is, the pointer
+  * increment between two consecutive coefficients. Here, we're specifying the inner stride as a compile-time
+  * fixed value.
+  * \include Map_inner_stride.cpp
+  * Output: \verbinclude Map_inner_stride.out
+  *
+  * Here's an example of mapping an array while specifying an outer stride. Here, since we're mapping
+  * as a column-major matrix, 'outer stride' means the pointer increment between two consecutive columns.
+  * Here, we're specifying the outer stride as a runtime parameter. Note that here \c OuterStride<> is
+  * a short version of \c OuterStride<Dynamic> because the default template parameter of OuterStride
+  * is  \c Dynamic
+  * \include Map_outer_stride.cpp
+  * Output: \verbinclude Map_outer_stride.out
+  *
+  * For more details and for an example of specifying both an inner and an outer stride, see class Stride.
+  *
+  * \b Tip: to change the array of data mapped by a Map object, you can use the C++
+  * placement new syntax:
+  *
+  * Example: \include Map_placement_new.cpp
+  * Output: \verbinclude Map_placement_new.out
+  *
+  * This class is the return type of PlainObjectBase::Map() but can also be used directly.
+  *
+  * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
+  */
+
+namespace internal {
+template<typename PlainObjectType, int MapOptions, typename StrideType>
+struct traits<Map<PlainObjectType, MapOptions, StrideType> >
+  : public traits<PlainObjectType>
+{
+  typedef traits<PlainObjectType> TraitsBase;
+  typedef typename PlainObjectType::Index Index;
+  typedef typename PlainObjectType::Scalar Scalar;
+  enum {
+    InnerStrideAtCompileTime = StrideType::InnerStrideAtCompileTime == 0
+                             ? int(PlainObjectType::InnerStrideAtCompileTime)
+                             : int(StrideType::InnerStrideAtCompileTime),
+    OuterStrideAtCompileTime = StrideType::OuterStrideAtCompileTime == 0
+                             ? int(PlainObjectType::OuterStrideAtCompileTime)
+                             : int(StrideType::OuterStrideAtCompileTime),
+    HasNoInnerStride = InnerStrideAtCompileTime == 1,
+    HasNoOuterStride = StrideType::OuterStrideAtCompileTime == 0,
+    HasNoStride = HasNoInnerStride && HasNoOuterStride,
+    IsAligned = bool(EIGEN_ALIGN) && ((int(MapOptions)&Aligned)==Aligned),
+    IsDynamicSize = PlainObjectType::SizeAtCompileTime==Dynamic,
+    KeepsPacketAccess = bool(HasNoInnerStride)
+                        && ( bool(IsDynamicSize)
+                           || HasNoOuterStride
+                           || ( OuterStrideAtCompileTime!=Dynamic
+                           && ((static_cast<int>(sizeof(Scalar))*OuterStrideAtCompileTime)%16)==0 ) ),
+    Flags0 = TraitsBase::Flags & (~NestByRefBit),
+    Flags1 = IsAligned ? (int(Flags0) | AlignedBit) : (int(Flags0) & ~AlignedBit),
+    Flags2 = (bool(HasNoStride) || bool(PlainObjectType::IsVectorAtCompileTime))
+           ? int(Flags1) : int(Flags1 & ~LinearAccessBit),
+    Flags3 = is_lvalue<PlainObjectType>::value ? int(Flags2) : (int(Flags2) & ~LvalueBit),
+    Flags = KeepsPacketAccess ? int(Flags3) : (int(Flags3) & ~PacketAccessBit)
+  };
+private:
+  enum { Options }; // Expressions don't have Options
+};
+}
+
+template<typename PlainObjectType, int MapOptions, typename StrideType> class Map
+  : public MapBase<Map<PlainObjectType, MapOptions, StrideType> >
+{
+  public:
+
+    typedef MapBase<Map> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Map)
+
+    typedef typename Base::PointerType PointerType;
+#if EIGEN2_SUPPORT_STAGE <= STAGE30_FULL_EIGEN3_API
+    typedef const Scalar* PointerArgType;
+    inline PointerType cast_to_pointer_type(PointerArgType ptr) { return const_cast<PointerType>(ptr); }
+#else
+    typedef PointerType PointerArgType;
+    inline PointerType cast_to_pointer_type(PointerArgType ptr) { return ptr; }
+#endif
+
+    inline Index innerStride() const
+    {
+      return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
+    }
+
+    inline Index outerStride() const
+    {
+      return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
+           : IsVectorAtCompileTime ? this->size()
+           : int(Flags)&RowMajorBit ? this->cols()
+           : this->rows();
+    }
+
+    /** Constructor in the fixed-size case.
+      *
+      * \param dataPtr pointer to the array to map
+      * \param a_stride optional Stride object, passing the strides.
+      */
+    inline Map(PointerArgType dataPtr, const StrideType& a_stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr)), m_stride(a_stride)
+    {
+      PlainObjectType::Base::_check_template_params();
+    }
+
+    /** Constructor in the dynamic-size vector case.
+      *
+      * \param dataPtr pointer to the array to map
+      * \param a_size the size of the vector expression
+      * \param a_stride optional Stride object, passing the strides.
+      */
+    inline Map(PointerArgType dataPtr, Index a_size, const StrideType& a_stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr), a_size), m_stride(a_stride)
+    {
+      PlainObjectType::Base::_check_template_params();
+    }
+
+    /** Constructor in the dynamic-size matrix case.
+      *
+      * \param dataPtr pointer to the array to map
+      * \param nbRows the number of rows of the matrix expression
+      * \param nbCols the number of columns of the matrix expression
+      * \param a_stride optional Stride object, passing the strides.
+      */
+    inline Map(PointerArgType dataPtr, Index nbRows, Index nbCols, const StrideType& a_stride = StrideType())
+      : Base(cast_to_pointer_type(dataPtr), nbRows, nbCols), m_stride(a_stride)
+    {
+      PlainObjectType::Base::_check_template_params();
+    }
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Map)
+
+  protected:
+    StrideType m_stride;
+};
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+inline Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>
+  ::Array(const Scalar *data)
+{
+  this->_set_noalias(Eigen::Map<const Array>(data));
+}
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+inline Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>
+  ::Matrix(const Scalar *data)
+{
+  this->_set_noalias(Eigen::Map<const Matrix>(data));
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_MAP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/MapBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/MapBase.h
new file mode 100644
index 0000000..6876de5
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/MapBase.h
@@ -0,0 +1,242 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MAPBASE_H
+#define EIGEN_MAPBASE_H
+
+#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \
+      EIGEN_STATIC_ASSERT((int(internal::traits<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \
+                          YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT)
+
+namespace Eigen { 
+
+/** \class MapBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for Map and Block expression with direct access
+  *
+  * \sa class Map, class Block
+  */
+template<typename Derived> class MapBase<Derived, ReadOnlyAccessors>
+  : public internal::dense_xpr_base<Derived>::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<Derived>::type Base;
+    enum {
+      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+      SizeAtCompileTime = Base::SizeAtCompileTime
+    };
+
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename internal::conditional<
+                         bool(internal::is_lvalue<Derived>::value),
+                         Scalar *,
+                         const Scalar *>::type
+                     PointerType;
+
+    using Base::derived;
+//    using Base::RowsAtCompileTime;
+//    using Base::ColsAtCompileTime;
+//    using Base::SizeAtCompileTime;
+    using Base::MaxRowsAtCompileTime;
+    using Base::MaxColsAtCompileTime;
+    using Base::MaxSizeAtCompileTime;
+    using Base::IsVectorAtCompileTime;
+    using Base::Flags;
+    using Base::IsRowMajor;
+
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::coeff;
+    using Base::coeffRef;
+    using Base::lazyAssign;
+    using Base::eval;
+
+    using Base::innerStride;
+    using Base::outerStride;
+    using Base::rowStride;
+    using Base::colStride;
+
+    // bug 217 - compile error on ICC 11.1
+    using Base::operator=;
+
+    typedef typename Base::CoeffReturnType CoeffReturnType;
+
+    inline Index rows() const { return m_rows.value(); }
+    inline Index cols() const { return m_cols.value(); }
+
+    /** Returns a pointer to the first coefficient of the matrix or vector.
+      *
+      * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride().
+      *
+      * \sa innerStride(), outerStride()
+      */
+    inline const Scalar* data() const { return m_data; }
+
+    inline const Scalar& coeff(Index rowId, Index colId) const
+    {
+      return m_data[colId * colStride() + rowId * rowStride()];
+    }
+
+    inline const Scalar& coeff(Index index) const
+    {
+      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+      return m_data[index * innerStride()];
+    }
+
+    inline const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return this->m_data[colId * colStride() + rowId * rowStride()];
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+      return this->m_data[index * innerStride()];
+    }
+
+    template<int LoadMode>
+    inline PacketScalar packet(Index rowId, Index colId) const
+    {
+      return internal::ploadt<PacketScalar, LoadMode>
+               (m_data + (colId * colStride() + rowId * rowStride()));
+    }
+
+    template<int LoadMode>
+    inline PacketScalar packet(Index index) const
+    {
+      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+      return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride());
+    }
+
+    inline MapBase(PointerType dataPtr) : m_data(dataPtr), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime)
+    {
+      EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived)
+      checkSanity();
+    }
+
+    inline MapBase(PointerType dataPtr, Index vecSize)
+            : m_data(dataPtr),
+              m_rows(RowsAtCompileTime == Dynamic ? vecSize : Index(RowsAtCompileTime)),
+              m_cols(ColsAtCompileTime == Dynamic ? vecSize : Index(ColsAtCompileTime))
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+      eigen_assert(vecSize >= 0);
+      eigen_assert(dataPtr == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == vecSize);
+      checkSanity();
+    }
+
+    inline MapBase(PointerType dataPtr, Index nbRows, Index nbCols)
+            : m_data(dataPtr), m_rows(nbRows), m_cols(nbCols)
+    {
+      eigen_assert( (dataPtr == 0)
+              || (   nbRows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == nbRows)
+                  && nbCols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == nbCols)));
+      checkSanity();
+    }
+
+  protected:
+
+    void checkSanity() const
+    {
+      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits<Derived>::Flags&PacketAccessBit,
+                                        internal::inner_stride_at_compile_time<Derived>::ret==1),
+                          PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1);
+      eigen_assert(EIGEN_IMPLIES(internal::traits<Derived>::Flags&AlignedBit, (size_t(m_data) % 16) == 0)
+                   && "data is not aligned");
+    }
+
+    PointerType m_data;
+    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows;
+    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols;
+};
+
+template<typename Derived> class MapBase<Derived, WriteAccessors>
+  : public MapBase<Derived, ReadOnlyAccessors>
+{
+  public:
+
+    typedef MapBase<Derived, ReadOnlyAccessors> Base;
+
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::PacketScalar PacketScalar;
+    typedef typename Base::Index Index;
+    typedef typename Base::PointerType PointerType;
+
+    using Base::derived;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::coeff;
+    using Base::coeffRef;
+
+    using Base::innerStride;
+    using Base::outerStride;
+    using Base::rowStride;
+    using Base::colStride;
+
+    typedef typename internal::conditional<
+                    internal::is_lvalue<Derived>::value,
+                    Scalar,
+                    const Scalar
+                  >::type ScalarWithConstIfNotLvalue;
+
+    inline const Scalar* data() const { return this->m_data; }
+    inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error
+
+    inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col)
+    {
+      return this->m_data[col * colStride() + row * rowStride()];
+    }
+
+    inline ScalarWithConstIfNotLvalue& coeffRef(Index index)
+    {
+      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+      return this->m_data[index * innerStride()];
+    }
+
+    template<int StoreMode>
+    inline void writePacket(Index row, Index col, const PacketScalar& val)
+    {
+      internal::pstoret<Scalar, PacketScalar, StoreMode>
+               (this->m_data + (col * colStride() + row * rowStride()), val);
+    }
+
+    template<int StoreMode>
+    inline void writePacket(Index index, const PacketScalar& val)
+    {
+      EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived)
+      internal::pstoret<Scalar, PacketScalar, StoreMode>
+                (this->m_data + index * innerStride(), val);
+    }
+
+    explicit inline MapBase(PointerType dataPtr) : Base(dataPtr) {}
+    inline MapBase(PointerType dataPtr, Index vecSize) : Base(dataPtr, vecSize) {}
+    inline MapBase(PointerType dataPtr, Index nbRows, Index nbCols) : Base(dataPtr, nbRows, nbCols) {}
+
+    Derived& operator=(const MapBase& other)
+    {
+      Base::Base::operator=(other);
+      return derived();
+    }
+
+    using Base::Base::operator=;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_MAPBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/MathFunctions.h b/vendor/eigen-3.1.91/Eigen/src/Core/MathFunctions.h
new file mode 100644
index 0000000..a2c55f2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/MathFunctions.h
@@ -0,0 +1,753 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MATHFUNCTIONS_H
+#define EIGEN_MATHFUNCTIONS_H
+
+namespace Eigen {
+
+namespace internal {
+
+/** \internal \struct global_math_functions_filtering_base
+  *
+  * What it does:
+  * Defines a typedef 'type' as follows:
+  * - if type T has a member typedef Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl, then
+  *   global_math_functions_filtering_base<T>::type is a typedef for it.
+  * - otherwise, global_math_functions_filtering_base<T>::type is a typedef for T.
+  *
+  * How it's used:
+  * To allow to defined the global math functions (like sin...) in certain cases, like the Array expressions.
+  * When you do sin(array1+array2), the object array1+array2 has a complicated expression type, all what you want to know
+  * is that it inherits ArrayBase. So we implement a partial specialization of sin_impl for ArrayBase<Derived>.
+  * So we must make sure to use sin_impl<ArrayBase<Derived> > and not sin_impl<Derived>, otherwise our partial specialization
+  * won't be used. How does sin know that? That's exactly what global_math_functions_filtering_base tells it.
+  *
+  * How it's implemented:
+  * SFINAE in the style of enable_if. Highly susceptible of breaking compilers. With GCC, it sure does work, but if you replace
+  * the typename dummy by an integer template parameter, it doesn't work anymore!
+  */
+
+template<typename T, typename dummy = void>
+struct global_math_functions_filtering_base
+{
+  typedef T type;
+};
+
+template<typename T> struct always_void { typedef void type; };
+
+template<typename T>
+struct global_math_functions_filtering_base
+  <T,
+   typename always_void<typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl>::type
+  >
+{
+  typedef typename T::Eigen_BaseClassForSpecializationOfGlobalMathFuncImpl type;
+};
+
+#define EIGEN_MATHFUNC_IMPL(func, scalar) func##_impl<typename global_math_functions_filtering_base<scalar>::type>
+#define EIGEN_MATHFUNC_RETVAL(func, scalar) typename func##_retval<typename global_math_functions_filtering_base<scalar>::type>::type
+
+
+/****************************************************************************
+* Implementation of real                                                 *
+****************************************************************************/
+
+template<typename Scalar>
+struct real_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar run(const Scalar& x)
+  {
+    return x;
+  }
+};
+
+template<typename RealScalar>
+struct real_impl<std::complex<RealScalar> >
+{
+  static inline RealScalar run(const std::complex<RealScalar>& x)
+  {
+    using std::real;
+    return real(x);
+  }
+};
+
+template<typename Scalar>
+struct real_retval
+{
+  typedef typename NumTraits<Scalar>::Real type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(real, Scalar) real(const Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(real, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of imag                                                 *
+****************************************************************************/
+
+template<typename Scalar>
+struct imag_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar run(const Scalar&)
+  {
+    return RealScalar(0);
+  }
+};
+
+template<typename RealScalar>
+struct imag_impl<std::complex<RealScalar> >
+{
+  static inline RealScalar run(const std::complex<RealScalar>& x)
+  {
+    using std::imag;
+    return imag(x);
+  }
+};
+
+template<typename Scalar>
+struct imag_retval
+{
+  typedef typename NumTraits<Scalar>::Real type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(imag, Scalar) imag(const Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(imag, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of real_ref                                             *
+****************************************************************************/
+
+template<typename Scalar>
+struct real_ref_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar& run(Scalar& x)
+  {
+    return reinterpret_cast<RealScalar*>(&x)[0];
+  }
+  static inline const RealScalar& run(const Scalar& x)
+  {
+    return reinterpret_cast<const RealScalar*>(&x)[0];
+  }
+};
+
+template<typename Scalar>
+struct real_ref_retval
+{
+  typedef typename NumTraits<Scalar>::Real & type;
+};
+
+template<typename Scalar>
+inline typename add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) >::type real_ref(const Scalar& x)
+{
+  return real_ref_impl<Scalar>::run(x);
+}
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(real_ref, Scalar) real_ref(Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(real_ref, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of imag_ref                                             *
+****************************************************************************/
+
+template<typename Scalar, bool IsComplex>
+struct imag_ref_default_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar& run(Scalar& x)
+  {
+    return reinterpret_cast<RealScalar*>(&x)[1];
+  }
+  static inline const RealScalar& run(const Scalar& x)
+  {
+    return reinterpret_cast<RealScalar*>(&x)[1];
+  }
+};
+
+template<typename Scalar>
+struct imag_ref_default_impl<Scalar, false>
+{
+  static inline Scalar run(Scalar&)
+  {
+    return Scalar(0);
+  }
+  static inline const Scalar run(const Scalar&)
+  {
+    return Scalar(0);
+  }
+};
+
+template<typename Scalar>
+struct imag_ref_impl : imag_ref_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
+
+template<typename Scalar>
+struct imag_ref_retval
+{
+  typedef typename NumTraits<Scalar>::Real & type;
+};
+
+template<typename Scalar>
+inline typename add_const_on_value_type< EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) >::type imag_ref(const Scalar& x)
+{
+  return imag_ref_impl<Scalar>::run(x);
+}
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(imag_ref, Scalar) imag_ref(Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(imag_ref, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of conj                                                 *
+****************************************************************************/
+
+template<typename Scalar>
+struct conj_impl
+{
+  static inline Scalar run(const Scalar& x)
+  {
+    return x;
+  }
+};
+
+template<typename RealScalar>
+struct conj_impl<std::complex<RealScalar> >
+{
+  static inline std::complex<RealScalar> run(const std::complex<RealScalar>& x)
+  {
+    using std::conj;
+    return conj(x);
+  }
+};
+
+template<typename Scalar>
+struct conj_retval
+{
+  typedef Scalar type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(conj, Scalar) conj(const Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(conj, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of abs2                                                 *
+****************************************************************************/
+
+template<typename Scalar>
+struct abs2_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar run(const Scalar& x)
+  {
+    return x*x;
+  }
+};
+
+template<typename RealScalar>
+struct abs2_impl<std::complex<RealScalar> >
+{
+  static inline RealScalar run(const std::complex<RealScalar>& x)
+  {
+    return real(x)*real(x) + imag(x)*imag(x);
+  }
+};
+
+template<typename Scalar>
+struct abs2_retval
+{
+  typedef typename NumTraits<Scalar>::Real type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(abs2, Scalar) abs2(const Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(abs2, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of norm1                                                *
+****************************************************************************/
+
+template<typename Scalar, bool IsComplex>
+struct norm1_default_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar run(const Scalar& x)
+  {
+    using std::abs;
+    return abs(real(x)) + abs(imag(x));
+  }
+};
+
+template<typename Scalar>
+struct norm1_default_impl<Scalar, false>
+{
+  static inline Scalar run(const Scalar& x)
+  {
+    using std::abs;
+    return abs(x);
+  }
+};
+
+template<typename Scalar>
+struct norm1_impl : norm1_default_impl<Scalar, NumTraits<Scalar>::IsComplex> {};
+
+template<typename Scalar>
+struct norm1_retval
+{
+  typedef typename NumTraits<Scalar>::Real type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(norm1, Scalar) norm1(const Scalar& x)
+{
+  return EIGEN_MATHFUNC_IMPL(norm1, Scalar)::run(x);
+}
+
+/****************************************************************************
+* Implementation of hypot                                                *
+****************************************************************************/
+
+template<typename Scalar>
+struct hypot_impl
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline RealScalar run(const Scalar& x, const Scalar& y)
+  {
+    using std::max;
+    using std::min;
+    using std::abs;
+    using std::sqrt;
+    RealScalar _x = abs(x);
+    RealScalar _y = abs(y);
+    RealScalar p = (max)(_x, _y);
+    RealScalar q = (min)(_x, _y);
+    RealScalar qp = q/p;
+    return p * sqrt(RealScalar(1) + qp*qp);
+  }
+};
+
+template<typename Scalar>
+struct hypot_retval
+{
+  typedef typename NumTraits<Scalar>::Real type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(hypot, Scalar) hypot(const Scalar& x, const Scalar& y)
+{
+  return EIGEN_MATHFUNC_IMPL(hypot, Scalar)::run(x, y);
+}
+
+/****************************************************************************
+* Implementation of cast                                                 *
+****************************************************************************/
+
+template<typename OldType, typename NewType>
+struct cast_impl
+{
+  static inline NewType run(const OldType& x)
+  {
+    return static_cast<NewType>(x);
+  }
+};
+
+// here, for once, we're plainly returning NewType: we don't want cast to do weird things.
+
+template<typename OldType, typename NewType>
+inline NewType cast(const OldType& x)
+{
+  return cast_impl<OldType, NewType>::run(x);
+}
+
+/****************************************************************************
+* Implementation of atanh2                                                *
+****************************************************************************/
+
+template<typename Scalar, bool IsInteger>
+struct atanh2_default_impl
+{
+  typedef Scalar retval;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline Scalar run(const Scalar& x, const Scalar& y)
+  {
+    using std::abs;
+    using std::log;
+    using std::sqrt;
+    Scalar z = x / y;
+    if (y == Scalar(0) || abs(z) > sqrt(NumTraits<RealScalar>::epsilon()))
+      return RealScalar(0.5) * log((y + x) / (y - x));
+    else
+      return z + z*z*z / RealScalar(3);
+  }
+};
+
+template<typename Scalar>
+struct atanh2_default_impl<Scalar, true>
+{
+  static inline Scalar run(const Scalar&, const Scalar&)
+  {
+    EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar)
+    return Scalar(0);
+  }
+};
+
+template<typename Scalar>
+struct atanh2_impl : atanh2_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};
+
+template<typename Scalar>
+struct atanh2_retval
+{
+  typedef Scalar type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(atanh2, Scalar) atanh2(const Scalar& x, const Scalar& y)
+{
+  return EIGEN_MATHFUNC_IMPL(atanh2, Scalar)::run(x, y);
+}
+
+/****************************************************************************
+* Implementation of pow                                                  *
+****************************************************************************/
+
+template<typename Scalar, bool IsInteger>
+struct pow_default_impl
+{
+  typedef Scalar retval;
+  static inline Scalar run(const Scalar& x, const Scalar& y)
+  {
+    using std::pow;
+    return pow(x, y);
+  }
+};
+
+template<typename Scalar>
+struct pow_default_impl<Scalar, true>
+{
+  static inline Scalar run(Scalar x, Scalar y)
+  {
+    Scalar res(1);
+    eigen_assert(!NumTraits<Scalar>::IsSigned || y >= 0);
+    if(y & 1) res *= x;
+    y >>= 1;
+    while(y)
+    {
+      x *= x;
+      if(y&1) res *= x;
+      y >>= 1;
+    }
+    return res;
+  }
+};
+
+template<typename Scalar>
+struct pow_impl : pow_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {};
+
+template<typename Scalar>
+struct pow_retval
+{
+  typedef Scalar type;
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(pow, Scalar) pow(const Scalar& x, const Scalar& y)
+{
+  return EIGEN_MATHFUNC_IMPL(pow, Scalar)::run(x, y);
+}
+
+/****************************************************************************
+* Implementation of random                                               *
+****************************************************************************/
+
+template<typename Scalar,
+         bool IsComplex,
+         bool IsInteger>
+struct random_default_impl {};
+
+template<typename Scalar>
+struct random_impl : random_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
+
+template<typename Scalar>
+struct random_retval
+{
+  typedef Scalar type;
+};
+
+template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y);
+template<typename Scalar> inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random();
+
+template<typename Scalar>
+struct random_default_impl<Scalar, false, false>
+{
+  static inline Scalar run(const Scalar& x, const Scalar& y)
+  {
+    return x + (y-x) * Scalar(std::rand()) / Scalar(RAND_MAX);
+  }
+  static inline Scalar run()
+  {
+    return run(Scalar(NumTraits<Scalar>::IsSigned ? -1 : 0), Scalar(1));
+  }
+};
+
+enum {
+  floor_log2_terminate,
+  floor_log2_move_up,
+  floor_log2_move_down,
+  floor_log2_bogus
+};
+
+template<unsigned int n, int lower, int upper> struct floor_log2_selector
+{
+  enum { middle = (lower + upper) / 2,
+         value = (upper <= lower + 1) ? int(floor_log2_terminate)
+               : (n < (1 << middle)) ? int(floor_log2_move_down)
+               : (n==0) ? int(floor_log2_bogus)
+               : int(floor_log2_move_up)
+  };
+};
+
+template<unsigned int n,
+         int lower = 0,
+         int upper = sizeof(unsigned int) * CHAR_BIT - 1,
+         int selector = floor_log2_selector<n, lower, upper>::value>
+struct floor_log2 {};
+
+template<unsigned int n, int lower, int upper>
+struct floor_log2<n, lower, upper, floor_log2_move_down>
+{
+  enum { value = floor_log2<n, lower, floor_log2_selector<n, lower, upper>::middle>::value };
+};
+
+template<unsigned int n, int lower, int upper>
+struct floor_log2<n, lower, upper, floor_log2_move_up>
+{
+  enum { value = floor_log2<n, floor_log2_selector<n, lower, upper>::middle, upper>::value };
+};
+
+template<unsigned int n, int lower, int upper>
+struct floor_log2<n, lower, upper, floor_log2_terminate>
+{
+  enum { value = (n >= ((unsigned int)(1) << (lower+1))) ? lower+1 : lower };
+};
+
+template<unsigned int n, int lower, int upper>
+struct floor_log2<n, lower, upper, floor_log2_bogus>
+{
+  // no value, error at compile time
+};
+
+template<typename Scalar>
+struct random_default_impl<Scalar, false, true>
+{
+  typedef typename NumTraits<Scalar>::NonInteger NonInteger;
+
+  static inline Scalar run(const Scalar& x, const Scalar& y)
+  {
+    return x + Scalar((NonInteger(y)-x+1) * std::rand() / (RAND_MAX + NonInteger(1)));
+  }
+
+  static inline Scalar run()
+  {
+#ifdef EIGEN_MAKING_DOCS
+    return run(Scalar(NumTraits<Scalar>::IsSigned ? -10 : 0), Scalar(10));
+#else
+    enum { rand_bits = floor_log2<(unsigned int)(RAND_MAX)+1>::value,
+           scalar_bits = sizeof(Scalar) * CHAR_BIT,
+           shift = EIGEN_PLAIN_ENUM_MAX(0, int(rand_bits) - int(scalar_bits))
+    };
+    Scalar x = Scalar(std::rand() >> shift);
+    Scalar offset = NumTraits<Scalar>::IsSigned ? Scalar(1 << (rand_bits-1)) : Scalar(0);
+    return x - offset;
+#endif
+  }
+};
+
+template<typename Scalar>
+struct random_default_impl<Scalar, true, false>
+{
+  static inline Scalar run(const Scalar& x, const Scalar& y)
+  {
+    return Scalar(random(real(x), real(y)),
+                  random(imag(x), imag(y)));
+  }
+  static inline Scalar run()
+  {
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    return Scalar(random<RealScalar>(), random<RealScalar>());
+  }
+};
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random(const Scalar& x, const Scalar& y)
+{
+  return EIGEN_MATHFUNC_IMPL(random, Scalar)::run(x, y);
+}
+
+template<typename Scalar>
+inline EIGEN_MATHFUNC_RETVAL(random, Scalar) random()
+{
+  return EIGEN_MATHFUNC_IMPL(random, Scalar)::run();
+}
+
+/****************************************************************************
+* Implementation of fuzzy comparisons                                       *
+****************************************************************************/
+
+template<typename Scalar,
+         bool IsComplex,
+         bool IsInteger>
+struct scalar_fuzzy_default_impl {};
+
+template<typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, false, false>
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  template<typename OtherScalar>
+  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
+  {
+    using std::abs;
+    return abs(x) <= abs(y) * prec;
+  }
+  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
+  {
+    using std::min;
+    using std::abs;
+    return abs(x - y) <= (min)(abs(x), abs(y)) * prec;
+  }
+  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar& prec)
+  {
+    return x <= y || isApprox(x, y, prec);
+  }
+};
+
+template<typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, false, true>
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  template<typename OtherScalar>
+  static inline bool isMuchSmallerThan(const Scalar& x, const Scalar&, const RealScalar&)
+  {
+    return x == Scalar(0);
+  }
+  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar&)
+  {
+    return x == y;
+  }
+  static inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y, const RealScalar&)
+  {
+    return x <= y;
+  }
+};
+
+template<typename Scalar>
+struct scalar_fuzzy_default_impl<Scalar, true, false>
+{
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  template<typename OtherScalar>
+  static inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y, const RealScalar& prec)
+  {
+    return abs2(x) <= abs2(y) * prec * prec;
+  }
+  static inline bool isApprox(const Scalar& x, const Scalar& y, const RealScalar& prec)
+  {
+    using std::min;
+    return abs2(x - y) <= (min)(abs2(x), abs2(y)) * prec * prec;
+  }
+};
+
+template<typename Scalar>
+struct scalar_fuzzy_impl : scalar_fuzzy_default_impl<Scalar, NumTraits<Scalar>::IsComplex, NumTraits<Scalar>::IsInteger> {};
+
+template<typename Scalar, typename OtherScalar>
+inline bool isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
+                                   typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return scalar_fuzzy_impl<Scalar>::template isMuchSmallerThan<OtherScalar>(x, y, precision);
+}
+
+template<typename Scalar>
+inline bool isApprox(const Scalar& x, const Scalar& y,
+                          typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return scalar_fuzzy_impl<Scalar>::isApprox(x, y, precision);
+}
+
+template<typename Scalar>
+inline bool isApproxOrLessThan(const Scalar& x, const Scalar& y,
+                                    typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return scalar_fuzzy_impl<Scalar>::isApproxOrLessThan(x, y, precision);
+}
+
+/******************************************
+***  The special case of the  bool type ***
+******************************************/
+
+template<> struct random_impl<bool>
+{
+  static inline bool run()
+  {
+    return random<int>(0,1)==0 ? false : true;
+  }
+};
+
+template<> struct scalar_fuzzy_impl<bool>
+{
+  typedef bool RealScalar;
+  
+  template<typename OtherScalar>
+  static inline bool isMuchSmallerThan(const bool& x, const bool&, const bool&)
+  {
+    return !x;
+  }
+  
+  static inline bool isApprox(bool x, bool y, bool)
+  {
+    return x == y;
+  }
+
+  static inline bool isApproxOrLessThan(const bool& x, const bool& y, const bool&)
+  {
+    return (!x) || y;
+  }
+  
+};
+
+/****************************************************************************
+* Special functions                                                          *
+****************************************************************************/
+
+// std::isfinite is non standard, so let's define our own version,
+// even though it is not very efficient.
+template<typename T> bool (isfinite)(const T& x)
+{
+  return x<NumTraits<T>::highest() && x>NumTraits<T>::lowest();
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_MATHFUNCTIONS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Matrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/Matrix.h
new file mode 100644
index 0000000..5f6df19
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Matrix.h
@@ -0,0 +1,405 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MATRIX_H
+#define EIGEN_MATRIX_H
+
+namespace Eigen {
+
+/** \class Matrix
+  * \ingroup Core_Module
+  *
+  * \brief The matrix class, also used for vectors and row-vectors
+  *
+  * The %Matrix class is the work-horse for all \em dense (\ref dense "note") matrices and vectors within Eigen.
+  * Vectors are matrices with one column, and row-vectors are matrices with one row.
+  *
+  * The %Matrix class encompasses \em both fixed-size and dynamic-size objects (\ref fixedsize "note").
+  *
+  * The first three template parameters are required:
+  * \tparam _Scalar \anchor matrix_tparam_scalar Numeric type, e.g. float, double, int or std::complex<float>.
+  *                 User defined sclar types are supported as well (see \ref user_defined_scalars "here").
+  * \tparam _Rows Number of rows, or \b Dynamic
+  * \tparam _Cols Number of columns, or \b Dynamic
+  *
+  * The remaining template parameters are optional -- in most cases you don't have to worry about them.
+  * \tparam _Options \anchor matrix_tparam_options A combination of either \b #RowMajor or \b #ColMajor, and of either
+  *                 \b #AutoAlign or \b #DontAlign.
+  *                 The former controls \ref TopicStorageOrders "storage order", and defaults to column-major. The latter controls alignment, which is required
+  *                 for vectorization. It defaults to aligning matrices except for fixed sizes that aren't a multiple of the packet size.
+  * \tparam _MaxRows Maximum number of rows. Defaults to \a _Rows (\ref maxrows "note").
+  * \tparam _MaxCols Maximum number of columns. Defaults to \a _Cols (\ref maxrows "note").
+  *
+  * Eigen provides a number of typedefs covering the usual cases. Here are some examples:
+  *
+  * \li \c Matrix2d is a 2x2 square matrix of doubles (\c Matrix<double, 2, 2>)
+  * \li \c Vector4f is a vector of 4 floats (\c Matrix<float, 4, 1>)
+  * \li \c RowVector3i is a row-vector of 3 ints (\c Matrix<int, 1, 3>)
+  *
+  * \li \c MatrixXf is a dynamic-size matrix of floats (\c Matrix<float, Dynamic, Dynamic>)
+  * \li \c VectorXf is a dynamic-size vector of floats (\c Matrix<float, Dynamic, 1>)
+  *
+  * \li \c Matrix2Xf is a partially fixed-size (dynamic-size) matrix of floats (\c Matrix<float, 2, Dynamic>)
+  * \li \c MatrixX3d is a partially dynamic-size (fixed-size) matrix of double (\c Matrix<double, Dynamic, 3>)
+  *
+  * See \link matrixtypedefs this page \endlink for a complete list of predefined \em %Matrix and \em Vector typedefs.
+  *
+  * You can access elements of vectors and matrices using normal subscripting:
+  *
+  * \code
+  * Eigen::VectorXd v(10);
+  * v[0] = 0.1;
+  * v[1] = 0.2;
+  * v(0) = 0.3;
+  * v(1) = 0.4;
+  *
+  * Eigen::MatrixXi m(10, 10);
+  * m(0, 1) = 1;
+  * m(0, 2) = 2;
+  * m(0, 3) = 3;
+  * \endcode
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_MATRIX_PLUGIN.
+  *
+  * <i><b>Some notes:</b></i>
+  *
+  * <dl>
+  * <dt><b>\anchor dense Dense versus sparse:</b></dt>
+  * <dd>This %Matrix class handles dense, not sparse matrices and vectors. For sparse matrices and vectors, see the Sparse module.
+  *
+  * Dense matrices and vectors are plain usual arrays of coefficients. All the coefficients are stored, in an ordinary contiguous array.
+  * This is unlike Sparse matrices and vectors where the coefficients are stored as a list of nonzero coefficients.</dd>
+  *
+  * <dt><b>\anchor fixedsize Fixed-size versus dynamic-size:</b></dt>
+  * <dd>Fixed-size means that the numbers of rows and columns are known are compile-time. In this case, Eigen allocates the array
+  * of coefficients as a fixed-size array, as a class member. This makes sense for very small matrices, typically up to 4x4, sometimes up
+  * to 16x16. Larger matrices should be declared as dynamic-size even if one happens to know their size at compile-time.
+  *
+  * Dynamic-size means that the numbers of rows or columns are not necessarily known at compile-time. In this case they are runtime
+  * variables, and the array of coefficients is allocated dynamically on the heap.
+  *
+  * Note that \em dense matrices, be they Fixed-size or Dynamic-size, <em>do not</em> expand dynamically in the sense of a std::map.
+  * If you want this behavior, see the Sparse module.</dd>
+  *
+  * <dt><b>\anchor maxrows _MaxRows and _MaxCols:</b></dt>
+  * <dd>In most cases, one just leaves these parameters to the default values.
+  * These parameters mean the maximum size of rows and columns that the matrix may have. They are useful in cases
+  * when the exact numbers of rows and columns are not known are compile-time, but it is known at compile-time that they cannot
+  * exceed a certain value. This happens when taking dynamic-size blocks inside fixed-size matrices: in this case _MaxRows and _MaxCols
+  * are the dimensions of the original matrix, while _Rows and _Cols are Dynamic.</dd>
+  * </dl>
+  *
+  * \see MatrixBase for the majority of the API methods for matrices, \ref TopicClassHierarchy, 
+  * \ref TopicStorageOrders 
+  */
+
+namespace internal {
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+  typedef _Scalar Scalar;
+  typedef Dense StorageKind;
+  typedef DenseIndex Index;
+  typedef MatrixXpr XprKind;
+  enum {
+    RowsAtCompileTime = _Rows,
+    ColsAtCompileTime = _Cols,
+    MaxRowsAtCompileTime = _MaxRows,
+    MaxColsAtCompileTime = _MaxCols,
+    Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret,
+    CoeffReadCost = NumTraits<Scalar>::ReadCost,
+    Options = _Options,
+    InnerStrideAtCompileTime = 1,
+    OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime
+  };
+};
+}
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+class Matrix
+  : public PlainObjectBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+{
+  public:
+
+    /** \brief Base class typedef.
+      * \sa PlainObjectBase
+      */
+    typedef PlainObjectBase<Matrix> Base;
+
+    enum { Options = _Options };
+
+    EIGEN_DENSE_PUBLIC_INTERFACE(Matrix)
+
+    typedef typename Base::PlainObject PlainObject;
+
+    using Base::base;
+    using Base::coeffRef;
+
+    /**
+      * \brief Assigns matrices to each other.
+      *
+      * \note This is a special case of the templated operator=. Its purpose is
+      * to prevent a default operator= from hiding the templated operator=.
+      *
+      * \callgraph
+      */
+    EIGEN_STRONG_INLINE Matrix& operator=(const Matrix& other)
+    {
+      return Base::_set(other);
+    }
+
+    /** \internal
+      * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
+      *
+      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+      * it will be initialized.
+      *
+      * Note that copying a row-vector into a vector (and conversely) is allowed.
+      * The resizing, if any, is then done in the appropriate way so that row-vectors
+      * remain row-vectors and vectors remain vectors.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix& operator=(const MatrixBase<OtherDerived>& other)
+    {
+      return Base::_set(other);
+    }
+
+    /* Here, doxygen failed to copy the brief information when using \copydoc */
+
+    /**
+      * \brief Copies the generic expression \a other into *this.
+      * \copydetails DenseBase::operator=(const EigenBase<OtherDerived> &other)
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix& operator=(const EigenBase<OtherDerived> &other)
+    {
+      return Base::operator=(other);
+    }
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix& operator=(const ReturnByValue<OtherDerived>& func)
+    {
+      return Base::operator=(func);
+    }
+
+    /** \brief Default constructor.
+      *
+      * For fixed-size matrices, does nothing.
+      *
+      * For dynamic-size matrices, creates an empty matrix of size 0. Does not allocate any array. Such a matrix
+      * is called a null matrix. This constructor is the unique way to create null matrices: resizing
+      * a matrix to 0 is not supported.
+      *
+      * \sa resize(Index,Index)
+      */
+    EIGEN_STRONG_INLINE explicit Matrix() : Base()
+    {
+      Base::_check_template_params();
+      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+    // FIXME is it still needed
+    Matrix(internal::constructor_without_unaligned_array_assert)
+      : Base(internal::constructor_without_unaligned_array_assert())
+    { Base::_check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED }
+
+    /** \brief Constructs a vector or row-vector with given dimension. \only_for_vectors
+      *
+      * Note that this is only useful for dynamic-size vectors. For fixed-size vectors,
+      * it is redundant to pass the dimension here, so it makes more sense to use the default
+      * constructor Matrix() instead.
+      */
+    EIGEN_STRONG_INLINE explicit Matrix(Index dim)
+      : Base(dim, RowsAtCompileTime == 1 ? 1 : dim, ColsAtCompileTime == 1 ? 1 : dim)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(Matrix)
+      eigen_assert(dim >= 0);
+      eigen_assert(SizeAtCompileTime == Dynamic || SizeAtCompileTime == dim);
+      EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename T0, typename T1>
+    EIGEN_STRONG_INLINE Matrix(const T0& x, const T1& y)
+    {
+      Base::_check_template_params();
+      Base::template _init2<T0,T1>(x, y);
+    }
+    #else
+    /** \brief Constructs an uninitialized matrix with \a rows rows and \a cols columns.
+      *
+      * This is useful for dynamic-size matrices. For fixed-size matrices,
+      * it is redundant to pass these parameters, so one should use the default constructor
+      * Matrix() instead. */
+    Matrix(Index rows, Index cols);
+    /** \brief Constructs an initialized 2D vector with given coefficients */
+    Matrix(const Scalar& x, const Scalar& y);
+    #endif
+
+    /** \brief Constructs an initialized 3D vector with given coefficients */
+    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 3)
+      m_storage.data()[0] = x;
+      m_storage.data()[1] = y;
+      m_storage.data()[2] = z;
+    }
+    /** \brief Constructs an initialized 4D vector with given coefficients */
+    EIGEN_STRONG_INLINE Matrix(const Scalar& x, const Scalar& y, const Scalar& z, const Scalar& w)
+    {
+      Base::_check_template_params();
+      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Matrix, 4)
+      m_storage.data()[0] = x;
+      m_storage.data()[1] = y;
+      m_storage.data()[2] = z;
+      m_storage.data()[3] = w;
+    }
+
+    explicit Matrix(const Scalar *data);
+
+    /** \brief Constructor copying the value of the expression \a other */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix(const MatrixBase<OtherDerived>& other)
+             : Base(other.rows() * other.cols(), other.rows(), other.cols())
+    {
+      // This test resides here, to bring the error messages closer to the user. Normally, these checks
+      // are performed deeply within the library, thus causing long and scary error traces.
+      EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+      Base::_check_template_params();
+      Base::_set_noalias(other);
+    }
+    /** \brief Copy constructor */
+    EIGEN_STRONG_INLINE Matrix(const Matrix& other)
+            : Base(other.rows() * other.cols(), other.rows(), other.cols())
+    {
+      Base::_check_template_params();
+      Base::_set_noalias(other);
+    }
+    /** \brief Copy constructor with in-place evaluation */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix(const ReturnByValue<OtherDerived>& other)
+    {
+      Base::_check_template_params();
+      Base::resize(other.rows(), other.cols());
+      other.evalTo(*this);
+    }
+
+    /** \brief Copy constructor for generic expressions.
+      * \sa MatrixBase::operator=(const EigenBase<OtherDerived>&)
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Matrix(const EigenBase<OtherDerived> &other)
+      : Base(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())
+    {
+      Base::_check_template_params();
+      Base::resize(other.rows(), other.cols());
+      // FIXME/CHECK: isn't *this = other.derived() more efficient. it allows to
+      //              go for pure _set() implementations, right?
+      *this = other;
+    }
+
+    /** \internal
+      * \brief Override MatrixBase::swap() since for dynamic-sized matrices
+      * of same type it is enough to swap the data pointers.
+      */
+    template<typename OtherDerived>
+    void swap(MatrixBase<OtherDerived> const & other)
+    { this->_swap(other.derived()); }
+
+    inline Index innerStride() const { return 1; }
+    inline Index outerStride() const { return this->innerSize(); }
+
+    /////////// Geometry module ///////////
+
+    template<typename OtherDerived>
+    explicit Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r);
+    template<typename OtherDerived>
+    Matrix& operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r);
+
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived>
+    explicit Matrix(const eigen2_RotationBase<OtherDerived,ColsAtCompileTime>& r);
+    template<typename OtherDerived>
+    Matrix& operator=(const eigen2_RotationBase<OtherDerived,ColsAtCompileTime>& r);
+    #endif
+
+    // allow to extend Matrix outside Eigen
+    #ifdef EIGEN_MATRIX_PLUGIN
+    #include EIGEN_MATRIX_PLUGIN
+    #endif
+
+  protected:
+    template <typename Derived, typename OtherDerived, bool IsVector>
+    friend struct internal::conservative_resize_like_impl;
+
+    using Base::m_storage;
+};
+
+/** \defgroup matrixtypedefs Global matrix typedefs
+  *
+  * \ingroup Core_Module
+  *
+  * Eigen defines several typedef shortcuts for most common matrix and vector types.
+  *
+  * The general patterns are the following:
+  *
+  * \c MatrixSizeType where \c Size can be \c 2,\c 3,\c 4 for fixed size square matrices or \c X for dynamic size,
+  * and where \c Type can be \c i for integer, \c f for float, \c d for double, \c cf for complex float, \c cd
+  * for complex double.
+  *
+  * For example, \c Matrix3d is a fixed-size 3x3 matrix type of doubles, and \c MatrixXf is a dynamic-size matrix of floats.
+  *
+  * There are also \c VectorSizeType and \c RowVectorSizeType which are self-explanatory. For example, \c Vector4cf is
+  * a fixed-size vector of 4 complex floats.
+  *
+  * \sa class Matrix
+  */
+
+#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)   \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix;  \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Size, 1>    Vector##SizeSuffix##TypeSuffix;  \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, 1, Size>    RowVector##SizeSuffix##TypeSuffix;
+
+#define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size)         \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix;  \
+/** \ingroup matrixtypedefs */                                    \
+typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix;
+
+#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \
+EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \
+EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \
+EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4)
+
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<float>,  cf)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<double>, cd)
+
+#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES
+#undef EIGEN_MAKE_TYPEDEFS
+#undef EIGEN_MAKE_FIXED_TYPEDEFS
+
+} // end namespace Eigen
+
+#endif // EIGEN_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/MatrixBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/MatrixBase.h
new file mode 100644
index 0000000..198e510
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/MatrixBase.h
@@ -0,0 +1,515 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MATRIXBASE_H
+#define EIGEN_MATRIXBASE_H
+
+namespace Eigen {
+
+/** \class MatrixBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for all dense matrices, vectors, and expressions
+  *
+  * This class is the base that is inherited by all matrix, vector, and related expression
+  * types. Most of the Eigen API is contained in this class, and its base classes. Other important
+  * classes for the Eigen API are Matrix, and VectorwiseOp.
+  *
+  * Note that some methods are defined in other modules such as the \ref LU_Module LU module
+  * for all functions related to matrix inversions.
+  *
+  * \tparam Derived is the derived type, e.g. a matrix type, or an expression, etc.
+  *
+  * When writing a function taking Eigen objects as argument, if you want your function
+  * to take as argument any matrix, vector, or expression, just let it take a
+  * MatrixBase argument. As an example, here is a function printFirstRow which, given
+  * a matrix, vector, or expression \a x, prints the first row of \a x.
+  *
+  * \code
+    template<typename Derived>
+    void printFirstRow(const Eigen::MatrixBase<Derived>& x)
+    {
+      cout << x.row(0) << endl;
+    }
+  * \endcode
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_MATRIXBASE_PLUGIN.
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+template<typename Derived> class MatrixBase
+  : public DenseBase<Derived>
+{
+  public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef MatrixBase StorageBaseType;
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    typedef DenseBase<Derived> Base;
+    using Base::RowsAtCompileTime;
+    using Base::ColsAtCompileTime;
+    using Base::SizeAtCompileTime;
+    using Base::MaxRowsAtCompileTime;
+    using Base::MaxColsAtCompileTime;
+    using Base::MaxSizeAtCompileTime;
+    using Base::IsVectorAtCompileTime;
+    using Base::Flags;
+    using Base::CoeffReadCost;
+
+    using Base::derived;
+    using Base::const_cast_derived;
+    using Base::rows;
+    using Base::cols;
+    using Base::size;
+    using Base::coeff;
+    using Base::coeffRef;
+    using Base::lazyAssign;
+    using Base::eval;
+    using Base::operator+=;
+    using Base::operator-=;
+    using Base::operator*=;
+    using Base::operator/=;
+
+    typedef typename Base::CoeffReturnType CoeffReturnType;
+    typedef typename Base::ConstTransposeReturnType ConstTransposeReturnType;
+    typedef typename Base::RowXpr RowXpr;
+    typedef typename Base::ColXpr ColXpr;
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** type of the equivalent square matrix */
+    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
+                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+    /** \returns the size of the main diagonal, which is min(rows(),cols()).
+      * \sa rows(), cols(), SizeAtCompileTime. */
+    inline Index diagonalSize() const { return (std::min)(rows(),cols()); }
+
+    /** \brief The plain matrix type corresponding to this expression.
+      *
+      * This is not necessarily exactly the return type of eval(). In the case of plain matrices,
+      * the return type of eval() is a const reference to a matrix, not a matrix! It is however guaranteed
+      * that the return type of eval() is either PlainObject or const PlainObject&.
+      */
+    typedef Matrix<typename internal::traits<Derived>::Scalar,
+                internal::traits<Derived>::RowsAtCompileTime,
+                internal::traits<Derived>::ColsAtCompileTime,
+                AutoAlign | (internal::traits<Derived>::Flags&RowMajorBit ? RowMajor : ColMajor),
+                internal::traits<Derived>::MaxRowsAtCompileTime,
+                internal::traits<Derived>::MaxColsAtCompileTime
+          > PlainObject;
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal Represents a matrix with all coefficients equal to one another*/
+    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Derived> ConstantReturnType;
+    /** \internal the return type of MatrixBase::adjoint() */
+    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, ConstTransposeReturnType>,
+                        ConstTransposeReturnType
+                     >::type AdjointReturnType;
+    /** \internal Return type of eigenvalues() */
+    typedef Matrix<std::complex<RealScalar>, internal::traits<Derived>::ColsAtCompileTime, 1, ColMajor> EigenvaluesReturnType;
+    /** \internal the return type of identity */
+    typedef CwiseNullaryOp<internal::scalar_identity_op<Scalar>,Derived> IdentityReturnType;
+    /** \internal the return type of unit vectors */
+    typedef Block<const CwiseNullaryOp<internal::scalar_identity_op<Scalar>, SquareMatrixType>,
+                  internal::traits<Derived>::RowsAtCompileTime,
+                  internal::traits<Derived>::ColsAtCompileTime> BasisReturnType;
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::MatrixBase
+#   include "../plugins/CommonCwiseUnaryOps.h"
+#   include "../plugins/CommonCwiseBinaryOps.h"
+#   include "../plugins/MatrixCwiseUnaryOps.h"
+#   include "../plugins/MatrixCwiseBinaryOps.h"
+#   ifdef EIGEN_MATRIXBASE_PLUGIN
+#     include EIGEN_MATRIXBASE_PLUGIN
+#   endif
+#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
+
+    /** Special case of the template operator=, in order to prevent the compiler
+      * from generating a default operator= (issue hit with g++ 4.1)
+      */
+    Derived& operator=(const MatrixBase& other);
+
+    // We cannot inherit here via Base::operator= since it is causing
+    // trouble with MSVC.
+
+    template <typename OtherDerived>
+    Derived& operator=(const DenseBase<OtherDerived>& other);
+
+    template <typename OtherDerived>
+    Derived& operator=(const EigenBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    Derived& operator=(const ReturnByValue<OtherDerived>& other);
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    Derived& lazyAssign(const ProductBase<ProductDerived, Lhs,Rhs>& other);
+
+    template<typename MatrixPower, typename Lhs, typename Rhs>
+    Derived& lazyAssign(const MatrixPowerProduct<MatrixPower, Lhs,Rhs>& other);
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+    template<typename OtherDerived>
+    Derived& operator+=(const MatrixBase<OtherDerived>& other);
+    template<typename OtherDerived>
+    Derived& operator-=(const MatrixBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    const typename ProductReturnType<Derived,OtherDerived>::Type
+    operator*(const MatrixBase<OtherDerived> &other) const;
+
+    template<typename OtherDerived>
+    const typename LazyProductReturnType<Derived,OtherDerived>::Type
+    lazyProduct(const MatrixBase<OtherDerived> &other) const;
+
+    template<typename OtherDerived>
+    Derived& operator*=(const EigenBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    void applyOnTheLeft(const EigenBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    void applyOnTheRight(const EigenBase<OtherDerived>& other);
+
+    template<typename DiagonalDerived>
+    const DiagonalProduct<Derived, DiagonalDerived, OnTheRight>
+    operator*(const DiagonalBase<DiagonalDerived> &diagonal) const;
+
+    template<typename OtherDerived>
+    typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType
+    dot(const MatrixBase<OtherDerived>& other) const;
+
+    #ifdef EIGEN2_SUPPORT
+      template<typename OtherDerived>
+      Scalar eigen2_dot(const MatrixBase<OtherDerived>& other) const;
+    #endif
+
+    RealScalar squaredNorm() const;
+    RealScalar norm() const;
+    RealScalar stableNorm() const;
+    RealScalar blueNorm() const;
+    RealScalar hypotNorm() const;
+    const PlainObject normalized() const;
+    void normalize();
+
+    const AdjointReturnType adjoint() const;
+    void adjointInPlace();
+
+    typedef Diagonal<Derived> DiagonalReturnType;
+    DiagonalReturnType diagonal();
+    typedef const Diagonal<const Derived> ConstDiagonalReturnType;
+    const ConstDiagonalReturnType diagonal() const;
+
+    template<int Index> struct DiagonalIndexReturnType { typedef Diagonal<Derived,Index> Type; };
+    template<int Index> struct ConstDiagonalIndexReturnType { typedef const Diagonal<const Derived,Index> Type; };
+
+    template<int Index> typename DiagonalIndexReturnType<Index>::Type diagonal();
+    template<int Index> typename ConstDiagonalIndexReturnType<Index>::Type diagonal() const;
+
+    // Note: The "MatrixBase::" prefixes are added to help MSVC9 to match these declarations with the later implementations.
+    // On the other hand they confuse MSVC8...
+    #if (defined _MSC_VER) && (_MSC_VER >= 1500) // 2008 or later
+    typename MatrixBase::template DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
+    typename MatrixBase::template ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
+    #else
+    typename DiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index);
+    typename ConstDiagonalIndexReturnType<DynamicIndex>::Type diagonal(Index index) const;
+    #endif
+
+    #ifdef EIGEN2_SUPPORT
+    template<unsigned int Mode> typename internal::eigen2_part_return_type<Derived, Mode>::type part();
+    template<unsigned int Mode> const typename internal::eigen2_part_return_type<Derived, Mode>::type part() const;
+    
+    // huuuge hack. make Eigen2's matrix.part<Diagonal>() work in eigen3. Problem: Diagonal is now a class template instead
+    // of an integer constant. Solution: overload the part() method template wrt template parameters list.
+    template<template<typename T, int N> class U>
+    const DiagonalWrapper<ConstDiagonalReturnType> part() const
+    { return diagonal().asDiagonal(); }
+    #endif // EIGEN2_SUPPORT
+
+    template<unsigned int Mode> struct TriangularViewReturnType { typedef TriangularView<Derived, Mode> Type; };
+    template<unsigned int Mode> struct ConstTriangularViewReturnType { typedef const TriangularView<const Derived, Mode> Type; };
+
+    template<unsigned int Mode> typename TriangularViewReturnType<Mode>::Type triangularView();
+    template<unsigned int Mode> typename ConstTriangularViewReturnType<Mode>::Type triangularView() const;
+
+    template<unsigned int UpLo> struct SelfAdjointViewReturnType { typedef SelfAdjointView<Derived, UpLo> Type; };
+    template<unsigned int UpLo> struct ConstSelfAdjointViewReturnType { typedef const SelfAdjointView<const Derived, UpLo> Type; };
+
+    template<unsigned int UpLo> typename SelfAdjointViewReturnType<UpLo>::Type selfadjointView();
+    template<unsigned int UpLo> typename ConstSelfAdjointViewReturnType<UpLo>::Type selfadjointView() const;
+
+    const SparseView<Derived> sparseView(const Scalar& m_reference = Scalar(0),
+                                         const typename NumTraits<Scalar>::Real& m_epsilon = NumTraits<Scalar>::dummy_precision()) const;
+    static const IdentityReturnType Identity();
+    static const IdentityReturnType Identity(Index rows, Index cols);
+    static const BasisReturnType Unit(Index size, Index i);
+    static const BasisReturnType Unit(Index i);
+    static const BasisReturnType UnitX();
+    static const BasisReturnType UnitY();
+    static const BasisReturnType UnitZ();
+    static const BasisReturnType UnitW();
+
+    const DiagonalWrapper<const Derived> asDiagonal() const;
+    const PermutationWrapper<const Derived> asPermutation() const;
+
+    Derived& setIdentity();
+    Derived& setIdentity(Index rows, Index cols);
+
+    bool isIdentity(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isDiagonal(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+
+    bool isUpperTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isLowerTriangular(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+
+    template<typename OtherDerived>
+    bool isOrthogonal(const MatrixBase<OtherDerived>& other,
+                      const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+    bool isUnitary(const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const;
+
+    /** \returns true if each coefficients of \c *this and \a other are all exactly equal.
+      * \warning When using floating point scalar values you probably should rather use a
+      *          fuzzy comparison such as isApprox()
+      * \sa isApprox(), operator!= */
+    template<typename OtherDerived>
+    inline bool operator==(const MatrixBase<OtherDerived>& other) const
+    { return cwiseEqual(other).all(); }
+
+    /** \returns true if at least one pair of coefficients of \c *this and \a other are not exactly equal to each other.
+      * \warning When using floating point scalar values you probably should rather use a
+      *          fuzzy comparison such as isApprox()
+      * \sa isApprox(), operator== */
+    template<typename OtherDerived>
+    inline bool operator!=(const MatrixBase<OtherDerived>& other) const
+    { return cwiseNotEqual(other).any(); }
+
+    NoAlias<Derived,Eigen::MatrixBase > noalias();
+
+    inline const ForceAlignedAccess<Derived> forceAlignedAccess() const;
+    inline ForceAlignedAccess<Derived> forceAlignedAccess();
+    template<bool Enable> inline typename internal::add_const_on_value_type<typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type>::type forceAlignedAccessIf() const;
+    template<bool Enable> inline typename internal::conditional<Enable,ForceAlignedAccess<Derived>,Derived&>::type forceAlignedAccessIf();
+
+    Scalar trace() const;
+
+/////////// Array module ///////////
+
+    template<int p> RealScalar lpNorm() const;
+
+    MatrixBase<Derived>& matrix() { return *this; }
+    const MatrixBase<Derived>& matrix() const { return *this; }
+
+    /** \returns an \link Eigen::ArrayBase Array \endlink expression of this matrix
+      * \sa ArrayBase::matrix() */
+    ArrayWrapper<Derived> array() { return derived(); }
+    const ArrayWrapper<const Derived> array() const { return derived(); }
+
+/////////// LU module ///////////
+
+    const FullPivLU<PlainObject> fullPivLu() const;
+    const PartialPivLU<PlainObject> partialPivLu() const;
+
+    #if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
+    const LU<PlainObject> lu() const;
+    #endif
+
+    #ifdef EIGEN2_SUPPORT
+    const LU<PlainObject> eigen2_lu() const;
+    #endif
+
+    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+    const PartialPivLU<PlainObject> lu() const;
+    #endif
+    
+    #ifdef EIGEN2_SUPPORT
+    template<typename ResultType>
+    void computeInverse(MatrixBase<ResultType> *result) const {
+      *result = this->inverse();
+    }
+    #endif
+
+    const internal::inverse_impl<Derived> inverse() const;
+    template<typename ResultType>
+    void computeInverseAndDetWithCheck(
+      ResultType& inverse,
+      typename ResultType::Scalar& determinant,
+      bool& invertible,
+      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
+    ) const;
+    template<typename ResultType>
+    void computeInverseWithCheck(
+      ResultType& inverse,
+      bool& invertible,
+      const RealScalar& absDeterminantThreshold = NumTraits<Scalar>::dummy_precision()
+    ) const;
+    Scalar determinant() const;
+
+/////////// Cholesky module ///////////
+
+    const LLT<PlainObject>  llt() const;
+    const LDLT<PlainObject> ldlt() const;
+
+/////////// QR module ///////////
+
+    const HouseholderQR<PlainObject> householderQr() const;
+    const ColPivHouseholderQR<PlainObject> colPivHouseholderQr() const;
+    const FullPivHouseholderQR<PlainObject> fullPivHouseholderQr() const;
+    
+    #ifdef EIGEN2_SUPPORT
+    const QR<PlainObject> qr() const;
+    #endif
+
+    EigenvaluesReturnType eigenvalues() const;
+    RealScalar operatorNorm() const;
+
+/////////// SVD module ///////////
+
+    JacobiSVD<PlainObject> jacobiSvd(unsigned int computationOptions = 0) const;
+
+    #ifdef EIGEN2_SUPPORT
+    SVD<PlainObject> svd() const;
+    #endif
+
+/////////// Geometry module ///////////
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /// \internal helper struct to form the return type of the cross product
+    template<typename OtherDerived> struct cross_product_return_type {
+      typedef typename internal::scalar_product_traits<typename internal::traits<Derived>::Scalar,typename internal::traits<OtherDerived>::Scalar>::ReturnType Scalar;
+      typedef Matrix<Scalar,MatrixBase::RowsAtCompileTime,MatrixBase::ColsAtCompileTime> type;
+    };
+    #endif // EIGEN_PARSED_BY_DOXYGEN
+    template<typename OtherDerived>
+    typename cross_product_return_type<OtherDerived>::type
+    cross(const MatrixBase<OtherDerived>& other) const;
+    template<typename OtherDerived>
+    PlainObject cross3(const MatrixBase<OtherDerived>& other) const;
+    PlainObject unitOrthogonal(void) const;
+    Matrix<Scalar,3,1> eulerAngles(Index a0, Index a1, Index a2) const;
+    
+    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+    ScalarMultipleReturnType operator*(const UniformScaling<Scalar>& s) const;
+    // put this as separate enum value to work around possible GCC 4.3 bug (?)
+    enum { HomogeneousReturnTypeDirection = ColsAtCompileTime==1?Vertical:Horizontal };
+    typedef Homogeneous<Derived, HomogeneousReturnTypeDirection> HomogeneousReturnType;
+    HomogeneousReturnType homogeneous() const;
+    #endif
+    
+    enum {
+      SizeMinusOne = SizeAtCompileTime==Dynamic ? Dynamic : SizeAtCompileTime-1
+    };
+    typedef Block<const Derived,
+                  internal::traits<Derived>::ColsAtCompileTime==1 ? SizeMinusOne : 1,
+                  internal::traits<Derived>::ColsAtCompileTime==1 ? 1 : SizeMinusOne> ConstStartMinusOne;
+    typedef CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>,
+                const ConstStartMinusOne > HNormalizedReturnType;
+
+    const HNormalizedReturnType hnormalized() const;
+
+////////// Householder module ///////////
+
+    void makeHouseholderInPlace(Scalar& tau, RealScalar& beta);
+    template<typename EssentialPart>
+    void makeHouseholder(EssentialPart& essential,
+                         Scalar& tau, RealScalar& beta) const;
+    template<typename EssentialPart>
+    void applyHouseholderOnTheLeft(const EssentialPart& essential,
+                                   const Scalar& tau,
+                                   Scalar* workspace);
+    template<typename EssentialPart>
+    void applyHouseholderOnTheRight(const EssentialPart& essential,
+                                    const Scalar& tau,
+                                    Scalar* workspace);
+
+///////// Jacobi module /////////
+
+    template<typename OtherScalar>
+    void applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j);
+    template<typename OtherScalar>
+    void applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j);
+
+///////// MatrixFunctions module /////////
+
+    typedef typename internal::stem_function<Scalar>::type StemFunction;
+    const MatrixExponentialReturnValue<Derived> exp() const;
+    const MatrixFunctionReturnValue<Derived> matrixFunction(StemFunction f) const;
+    const MatrixFunctionReturnValue<Derived> cosh() const;
+    const MatrixFunctionReturnValue<Derived> sinh() const;
+    const MatrixFunctionReturnValue<Derived> cos() const;
+    const MatrixFunctionReturnValue<Derived> sin() const;
+    const MatrixSquareRootReturnValue<Derived> sqrt() const;
+    const MatrixLogarithmReturnValue<Derived> log() const;
+    const MatrixPowerReturnValue<Derived> pow(const RealScalar& p) const;
+
+#ifdef EIGEN2_SUPPORT
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    Derived& operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
+                                      EvalBeforeAssigningBit>& other);
+
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    Derived& operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
+                                      EvalBeforeAssigningBit>& other);
+
+    /** \deprecated because .lazy() is deprecated
+      * Overloaded for cache friendly product evaluation */
+    template<typename OtherDerived>
+    Derived& lazyAssign(const Flagged<OtherDerived, 0, EvalBeforeAssigningBit>& other)
+    { return lazyAssign(other._expression()); }
+
+    template<unsigned int Added>
+    const Flagged<Derived, Added, 0> marked() const;
+    const Flagged<Derived, 0, EvalBeforeAssigningBit> lazy() const;
+
+    inline const Cwise<Derived> cwise() const;
+    inline Cwise<Derived> cwise();
+
+    VectorBlock<Derived> start(Index size);
+    const VectorBlock<const Derived> start(Index size) const;
+    VectorBlock<Derived> end(Index size);
+    const VectorBlock<const Derived> end(Index size) const;
+    template<int Size> VectorBlock<Derived,Size> start();
+    template<int Size> const VectorBlock<const Derived,Size> start() const;
+    template<int Size> VectorBlock<Derived,Size> end();
+    template<int Size> const VectorBlock<const Derived,Size> end() const;
+
+    Minor<Derived> minor(Index row, Index col);
+    const Minor<Derived> minor(Index row, Index col) const;
+#endif
+
+  protected:
+    MatrixBase() : Base() {}
+
+  private:
+    explicit MatrixBase(int);
+    MatrixBase(int,int);
+    template<typename OtherDerived> explicit MatrixBase(const MatrixBase<OtherDerived>&);
+  protected:
+    // mixing arrays and matrices is not legal
+    template<typename OtherDerived> Derived& operator+=(const ArrayBase<OtherDerived>& )
+    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+    // mixing arrays and matrices is not legal
+    template<typename OtherDerived> Derived& operator-=(const ArrayBase<OtherDerived>& )
+    {EIGEN_STATIC_ASSERT(std::ptrdiff_t(sizeof(typename OtherDerived::Scalar))==-1,YOU_CANNOT_MIX_ARRAYS_AND_MATRICES); return *this;}
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_MATRIXBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/NestByValue.h b/vendor/eigen-3.1.91/Eigen/src/Core/NestByValue.h
new file mode 100644
index 0000000..a893b17
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/NestByValue.h
@@ -0,0 +1,111 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_NESTBYVALUE_H
+#define EIGEN_NESTBYVALUE_H
+
+namespace Eigen {
+
+/** \class NestByValue
+  * \ingroup Core_Module
+  *
+  * \brief Expression which must be nested by value
+  *
+  * \param ExpressionType the type of the object of which we are requiring nesting-by-value
+  *
+  * This class is the return type of MatrixBase::nestByValue()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::nestByValue()
+  */
+
+namespace internal {
+template<typename ExpressionType>
+struct traits<NestByValue<ExpressionType> > : public traits<ExpressionType>
+{};
+}
+
+template<typename ExpressionType> class NestByValue
+  : public internal::dense_xpr_base< NestByValue<ExpressionType> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<NestByValue>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(NestByValue)
+
+    inline NestByValue(const ExpressionType& matrix) : m_expression(matrix) {}
+
+    inline Index rows() const { return m_expression.rows(); }
+    inline Index cols() const { return m_expression.cols(); }
+    inline Index outerStride() const { return m_expression.outerStride(); }
+    inline Index innerStride() const { return m_expression.innerStride(); }
+
+    inline const CoeffReturnType coeff(Index row, Index col) const
+    {
+      return m_expression.coeff(row, col);
+    }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      return m_expression.const_cast_derived().coeffRef(row, col);
+    }
+
+    inline const CoeffReturnType coeff(Index index) const
+    {
+      return m_expression.coeff(index);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index row, Index col) const
+    {
+      return m_expression.template packet<LoadMode>(row, col);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index row, Index col, const PacketScalar& x)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(row, col, x);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return m_expression.template packet<LoadMode>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& x)
+    {
+      m_expression.const_cast_derived().template writePacket<LoadMode>(index, x);
+    }
+
+    operator const ExpressionType&() const { return m_expression; }
+
+  protected:
+    const ExpressionType m_expression;
+};
+
+/** \returns an expression of the temporary version of *this.
+  */
+template<typename Derived>
+inline const NestByValue<Derived>
+DenseBase<Derived>::nestByValue() const
+{
+  return NestByValue<Derived>(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_NESTBYVALUE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/NoAlias.h b/vendor/eigen-3.1.91/Eigen/src/Core/NoAlias.h
new file mode 100644
index 0000000..0112c86
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/NoAlias.h
@@ -0,0 +1,130 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_NOALIAS_H
+#define EIGEN_NOALIAS_H
+
+namespace Eigen {
+
+/** \class NoAlias
+  * \ingroup Core_Module
+  *
+  * \brief Pseudo expression providing an operator = assuming no aliasing
+  *
+  * \param ExpressionType the type of the object on which to do the lazy assignment
+  *
+  * This class represents an expression with special assignment operators
+  * assuming no aliasing between the target expression and the source expression.
+  * More precisely it alloas to bypass the EvalBeforeAssignBit flag of the source expression.
+  * It is the return type of MatrixBase::noalias()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::noalias()
+  */
+template<typename ExpressionType, template <typename> class StorageBase>
+class NoAlias
+{
+    typedef typename ExpressionType::Scalar Scalar;
+  public:
+    NoAlias(ExpressionType& expression) : m_expression(expression) {}
+
+    /** Behaves like MatrixBase::lazyAssign(other)
+      * \sa MatrixBase::lazyAssign() */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE ExpressionType& operator=(const StorageBase<OtherDerived>& other)
+    { return internal::assign_selector<ExpressionType,OtherDerived,false>::run(m_expression,other.derived()); }
+
+    /** \sa MatrixBase::operator+= */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE ExpressionType& operator+=(const StorageBase<OtherDerived>& other)
+    {
+      typedef SelfCwiseBinaryOp<internal::scalar_sum_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;
+      SelfAdder tmp(m_expression);
+      typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;
+      typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;
+      internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));
+      return m_expression;
+    }
+
+    /** \sa MatrixBase::operator-= */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE ExpressionType& operator-=(const StorageBase<OtherDerived>& other)
+    {
+      typedef SelfCwiseBinaryOp<internal::scalar_difference_op<Scalar>, ExpressionType, OtherDerived> SelfAdder;
+      SelfAdder tmp(m_expression);
+      typedef typename internal::nested<OtherDerived>::type OtherDerivedNested;
+      typedef typename internal::remove_all<OtherDerivedNested>::type _OtherDerivedNested;
+      internal::assign_selector<SelfAdder,_OtherDerivedNested,false>::run(tmp,OtherDerivedNested(other.derived()));
+      return m_expression;
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE ExpressionType& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+    { other.derived().addTo(m_expression); return m_expression; }
+
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE ExpressionType& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+    { other.derived().subTo(m_expression); return m_expression; }
+
+    template<typename Lhs, typename Rhs, int NestingFlags>
+    EIGEN_STRONG_INLINE ExpressionType& operator+=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)
+    { return m_expression.derived() += CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }
+
+    template<typename Lhs, typename Rhs, int NestingFlags>
+    EIGEN_STRONG_INLINE ExpressionType& operator-=(const CoeffBasedProduct<Lhs,Rhs,NestingFlags>& other)
+    { return m_expression.derived() -= CoeffBasedProduct<Lhs,Rhs,NestByRefBit>(other.lhs(), other.rhs()); }
+#endif
+
+    ExpressionType& expression() const
+    {
+      return m_expression;
+    }
+
+  protected:
+    ExpressionType& m_expression;
+};
+
+/** \returns a pseudo expression of \c *this with an operator= assuming
+  * no aliasing between \c *this and the source expression.
+  *
+  * More precisely, noalias() allows to bypass the EvalBeforeAssignBit flag.
+  * Currently, even though several expressions may alias, only product
+  * expressions have this flag. Therefore, noalias() is only usefull when
+  * the source expression contains a matrix product.
+  *
+  * Here are some examples where noalias is usefull:
+  * \code
+  * D.noalias()  = A * B;
+  * D.noalias() += A.transpose() * B;
+  * D.noalias() -= 2 * A * B.adjoint();
+  * \endcode
+  *
+  * On the other hand the following example will lead to a \b wrong result:
+  * \code
+  * A.noalias() = A * B;
+  * \endcode
+  * because the result matrix A is also an operand of the matrix product. Therefore,
+  * there is no alternative than evaluating A * B in a temporary, that is the default
+  * behavior when you write:
+  * \code
+  * A = A * B;
+  * \endcode
+  *
+  * \sa class NoAlias
+  */
+template<typename Derived>
+NoAlias<Derived,MatrixBase> MatrixBase<Derived>::noalias()
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_NOALIAS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/NumTraits.h b/vendor/eigen-3.1.91/Eigen/src/Core/NumTraits.h
new file mode 100644
index 0000000..bac9e50
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/NumTraits.h
@@ -0,0 +1,150 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_NUMTRAITS_H
+#define EIGEN_NUMTRAITS_H
+
+namespace Eigen {
+
+/** \class NumTraits
+  * \ingroup Core_Module
+  *
+  * \brief Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
+  *
+  * \param T the numeric type at hand
+  *
+  * This class stores enums, typedefs and static methods giving information about a numeric type.
+  *
+  * The provided data consists of:
+  * \li A typedef \a Real, giving the "real part" type of \a T. If \a T is already real,
+  *     then \a Real is just a typedef to \a T. If \a T is \c std::complex<U> then \a Real
+  *     is a typedef to \a U.
+  * \li A typedef \a NonInteger, giving the type that should be used for operations producing non-integral values,
+  *     such as quotients, square roots, etc. If \a T is a floating-point type, then this typedef just gives
+  *     \a T again. Note however that many Eigen functions such as internal::sqrt simply refuse to
+  *     take integers. Outside of a few cases, Eigen doesn't do automatic type promotion. Thus, this typedef is
+  *     only intended as a helper for code that needs to explicitly promote types.
+  * \li A typedef \a Nested giving the type to use to nest a value inside of the expression tree. If you don't know what
+  *     this means, just use \a T here.
+  * \li An enum value \a IsComplex. It is equal to 1 if \a T is a \c std::complex
+  *     type, and to 0 otherwise.
+  * \li An enum value \a IsInteger. It is equal to \c 1 if \a T is an integer type such as \c int,
+  *     and to \c 0 otherwise.
+  * \li Enum values ReadCost, AddCost and MulCost representing a rough estimate of the number of CPU cycles needed
+  *     to by move / add / mul instructions respectively, assuming the data is already stored in CPU registers.
+  *     Stay vague here. No need to do architecture-specific stuff.
+  * \li An enum value \a IsSigned. It is equal to \c 1 if \a T is a signed type and to 0 if \a T is unsigned.
+  * \li An enum value \a RequireInitialization. It is equal to \c 1 if the constructor of the numeric type \a T must
+  *     be called, and to 0 if it is safe not to call it. Default is 0 if \a T is an arithmetic type, and 1 otherwise.
+  * \li An epsilon() function which, unlike std::numeric_limits::epsilon(), returns a \a Real instead of a \a T.
+  * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default
+  *     value by the fuzzy comparison operators.
+  * \li highest() and lowest() functions returning the highest and lowest possible values respectively.
+  */
+
+template<typename T> struct GenericNumTraits
+{
+  enum {
+    IsInteger = std::numeric_limits<T>::is_integer,
+    IsSigned = std::numeric_limits<T>::is_signed,
+    IsComplex = 0,
+    RequireInitialization = internal::is_arithmetic<T>::value ? 0 : 1,
+    ReadCost = 1,
+    AddCost = 1,
+    MulCost = 1
+  };
+
+  typedef T Real;
+  typedef typename internal::conditional<
+                     IsInteger,
+                     typename internal::conditional<sizeof(T)<=2, float, double>::type,
+                     T
+                   >::type NonInteger;
+  typedef T Nested;
+
+  static inline Real epsilon() { return std::numeric_limits<T>::epsilon(); }
+  static inline Real dummy_precision()
+  {
+    // make sure to override this for floating-point types
+    return Real(0);
+  }
+  static inline T highest() { return (std::numeric_limits<T>::max)(); }
+  static inline T lowest()  { return IsInteger ? (std::numeric_limits<T>::min)() : (-(std::numeric_limits<T>::max)()); }
+  
+#ifdef EIGEN2_SUPPORT
+  enum {
+    HasFloatingPoint = !IsInteger
+  };
+  typedef NonInteger FloatingPoint;
+#endif
+};
+
+template<typename T> struct NumTraits : GenericNumTraits<T>
+{};
+
+template<> struct NumTraits<float>
+  : GenericNumTraits<float>
+{
+  static inline float dummy_precision() { return 1e-5f; }
+};
+
+template<> struct NumTraits<double> : GenericNumTraits<double>
+{
+  static inline double dummy_precision() { return 1e-12; }
+};
+
+template<> struct NumTraits<long double>
+  : GenericNumTraits<long double>
+{
+  static inline long double dummy_precision() { return 1e-15l; }
+};
+
+template<typename _Real> struct NumTraits<std::complex<_Real> >
+  : GenericNumTraits<std::complex<_Real> >
+{
+  typedef _Real Real;
+  enum {
+    IsComplex = 1,
+    RequireInitialization = NumTraits<_Real>::RequireInitialization,
+    ReadCost = 2 * NumTraits<_Real>::ReadCost,
+    AddCost = 2 * NumTraits<Real>::AddCost,
+    MulCost = 4 * NumTraits<Real>::MulCost + 2 * NumTraits<Real>::AddCost
+  };
+
+  static inline Real epsilon() { return NumTraits<Real>::epsilon(); }
+  static inline Real dummy_precision() { return NumTraits<Real>::dummy_precision(); }
+};
+
+template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+struct NumTraits<Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> >
+{
+  typedef Array<Scalar, Rows, Cols, Options, MaxRows, MaxCols> ArrayType;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Array<RealScalar, Rows, Cols, Options, MaxRows, MaxCols> Real;
+  typedef typename NumTraits<Scalar>::NonInteger NonIntegerScalar;
+  typedef Array<NonIntegerScalar, Rows, Cols, Options, MaxRows, MaxCols> NonInteger;
+  typedef ArrayType & Nested;
+  
+  enum {
+    IsComplex = NumTraits<Scalar>::IsComplex,
+    IsInteger = NumTraits<Scalar>::IsInteger,
+    IsSigned  = NumTraits<Scalar>::IsSigned,
+    RequireInitialization = 1,
+    ReadCost = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::ReadCost,
+    AddCost  = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::AddCost,
+    MulCost  = ArrayType::SizeAtCompileTime==Dynamic ? Dynamic : ArrayType::SizeAtCompileTime * NumTraits<Scalar>::MulCost
+  };
+  
+  static inline RealScalar epsilon() { return NumTraits<RealScalar>::epsilon(); }
+  static inline RealScalar dummy_precision() { return NumTraits<RealScalar>::dummy_precision(); }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_NUMTRAITS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/PermutationMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/PermutationMatrix.h
new file mode 100644
index 0000000..4fc5dd3
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/PermutationMatrix.h
@@ -0,0 +1,688 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PERMUTATIONMATRIX_H
+#define EIGEN_PERMUTATIONMATRIX_H
+
+namespace Eigen { 
+
+template<int RowCol,typename IndicesType,typename MatrixType, typename StorageKind> class PermutedImpl;
+
+/** \class PermutationBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for permutations
+  *
+  * \param Derived the derived class
+  *
+  * This class is the base class for all expressions representing a permutation matrix,
+  * internally stored as a vector of integers.
+  * The convention followed here is that if \f$ \sigma \f$ is a permutation, the corresponding permutation matrix
+  * \f$ P_\sigma \f$ is such that if \f$ (e_1,\ldots,e_p) \f$ is the canonical basis, we have:
+  *  \f[ P_\sigma(e_i) = e_{\sigma(i)}. \f]
+  * This convention ensures that for any two permutations \f$ \sigma, \tau \f$, we have:
+  *  \f[ P_{\sigma\circ\tau} = P_\sigma P_\tau. \f]
+  *
+  * Permutation matrices are square and invertible.
+  *
+  * Notice that in addition to the member functions and operators listed here, there also are non-member
+  * operator* to multiply any kind of permutation object with any kind of matrix expression (MatrixBase)
+  * on either side.
+  *
+  * \sa class PermutationMatrix, class PermutationWrapper
+  */
+
+namespace internal {
+
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>
+struct permut_matrix_product_retval;
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed=false>
+struct permut_sparsematrix_product_retval;
+enum PermPermProduct_t {PermPermProduct};
+
+} // end namespace internal
+
+template<typename Derived>
+class PermutationBase : public EigenBase<Derived>
+{
+    typedef internal::traits<Derived> Traits;
+    typedef EigenBase<Derived> Base;
+  public:
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef typename Traits::IndicesType IndicesType;
+    enum {
+      Flags = Traits::Flags,
+      CoeffReadCost = Traits::CoeffReadCost,
+      RowsAtCompileTime = Traits::RowsAtCompileTime,
+      ColsAtCompileTime = Traits::ColsAtCompileTime,
+      MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
+    };
+    typedef typename Traits::Scalar Scalar;
+    typedef typename Traits::Index Index;
+    typedef Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime,0,MaxRowsAtCompileTime,MaxColsAtCompileTime>
+            DenseMatrixType;
+    typedef PermutationMatrix<IndicesType::SizeAtCompileTime,IndicesType::MaxSizeAtCompileTime,Index>
+            PlainPermutationType;
+    using Base::derived;
+    #endif
+
+    /** Copies the other permutation into *this */
+    template<typename OtherDerived>
+    Derived& operator=(const PermutationBase<OtherDerived>& other)
+    {
+      indices() = other.indices();
+      return derived();
+    }
+
+    /** Assignment from the Transpositions \a tr */
+    template<typename OtherDerived>
+    Derived& operator=(const TranspositionsBase<OtherDerived>& tr)
+    {
+      setIdentity(tr.size());
+      for(Index k=size()-1; k>=0; --k)
+        applyTranspositionOnTheRight(k,tr.coeff(k));
+      return derived();
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    Derived& operator=(const PermutationBase& other)
+    {
+      indices() = other.indices();
+      return derived();
+    }
+    #endif
+
+    /** \returns the number of rows */
+    inline Index rows() const { return Index(indices().size()); }
+
+    /** \returns the number of columns */
+    inline Index cols() const { return Index(indices().size()); }
+
+    /** \returns the size of a side of the respective square matrix, i.e., the number of indices */
+    inline Index size() const { return Index(indices().size()); }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename DenseDerived>
+    void evalTo(MatrixBase<DenseDerived>& other) const
+    {
+      other.setZero();
+      for (int i=0; i<rows();++i)
+        other.coeffRef(indices().coeff(i),i) = typename DenseDerived::Scalar(1);
+    }
+    #endif
+
+    /** \returns a Matrix object initialized from this permutation matrix. Notice that it
+      * is inefficient to return this Matrix object by value. For efficiency, favor using
+      * the Matrix constructor taking EigenBase objects.
+      */
+    DenseMatrixType toDenseMatrix() const
+    {
+      return derived();
+    }
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return derived().indices(); }
+    /** \returns a reference to the stored array representing the permutation. */
+    IndicesType& indices() { return derived().indices(); }
+
+    /** Resizes to given size.
+      */
+    inline void resize(Index newSize)
+    {
+      indices().resize(newSize);
+    }
+
+    /** Sets *this to be the identity permutation matrix */
+    void setIdentity()
+    {
+      for(Index i = 0; i < size(); ++i)
+        indices().coeffRef(i) = i;
+    }
+
+    /** Sets *this to be the identity permutation matrix of given size.
+      */
+    void setIdentity(Index newSize)
+    {
+      resize(newSize);
+      setIdentity();
+    }
+
+    /** Multiplies *this by the transposition \f$(ij)\f$ on the left.
+      *
+      * \returns a reference to *this.
+      *
+      * \warning This is much slower than applyTranspositionOnTheRight(int,int):
+      * this has linear complexity and requires a lot of branching.
+      *
+      * \sa applyTranspositionOnTheRight(int,int)
+      */
+    Derived& applyTranspositionOnTheLeft(Index i, Index j)
+    {
+      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
+      for(Index k = 0; k < size(); ++k)
+      {
+        if(indices().coeff(k) == i) indices().coeffRef(k) = j;
+        else if(indices().coeff(k) == j) indices().coeffRef(k) = i;
+      }
+      return derived();
+    }
+
+    /** Multiplies *this by the transposition \f$(ij)\f$ on the right.
+      *
+      * \returns a reference to *this.
+      *
+      * This is a fast operation, it only consists in swapping two indices.
+      *
+      * \sa applyTranspositionOnTheLeft(int,int)
+      */
+    Derived& applyTranspositionOnTheRight(Index i, Index j)
+    {
+      eigen_assert(i>=0 && j>=0 && i<size() && j<size());
+      std::swap(indices().coeffRef(i), indices().coeffRef(j));
+      return derived();
+    }
+
+    /** \returns the inverse permutation matrix.
+      *
+      * \note \note_try_to_help_rvo
+      */
+    inline Transpose<PermutationBase> inverse() const
+    { return derived(); }
+    /** \returns the tranpose permutation matrix.
+      *
+      * \note \note_try_to_help_rvo
+      */
+    inline Transpose<PermutationBase> transpose() const
+    { return derived(); }
+
+    /**** multiplication helpers to hopefully get RVO ****/
+
+  
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+  protected:
+    template<typename OtherDerived>
+    void assignTranspose(const PermutationBase<OtherDerived>& other)
+    {
+      for (int i=0; i<rows();++i) indices().coeffRef(other.indices().coeff(i)) = i;
+    }
+    template<typename Lhs,typename Rhs>
+    void assignProduct(const Lhs& lhs, const Rhs& rhs)
+    {
+      eigen_assert(lhs.cols() == rhs.rows());
+      for (int i=0; i<rows();++i) indices().coeffRef(i) = lhs.indices().coeff(rhs.indices().coeff(i));
+    }
+#endif
+
+  public:
+
+    /** \returns the product permutation matrix.
+      *
+      * \note \note_try_to_help_rvo
+      */
+    template<typename Other>
+    inline PlainPermutationType operator*(const PermutationBase<Other>& other) const
+    { return PlainPermutationType(internal::PermPermProduct, derived(), other.derived()); }
+
+    /** \returns the product of a permutation with another inverse permutation.
+      *
+      * \note \note_try_to_help_rvo
+      */
+    template<typename Other>
+    inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other) const
+    { return PlainPermutationType(internal::PermPermProduct, *this, other.eval()); }
+
+    /** \returns the product of an inverse permutation with another permutation.
+      *
+      * \note \note_try_to_help_rvo
+      */
+    template<typename Other> friend
+    inline PlainPermutationType operator*(const Transpose<PermutationBase<Other> >& other, const PermutationBase& perm)
+    { return PlainPermutationType(internal::PermPermProduct, other.eval(), perm); }
+
+  protected:
+
+};
+
+/** \class PermutationMatrix
+  * \ingroup Core_Module
+  *
+  * \brief Permutation matrix
+  *
+  * \param SizeAtCompileTime the number of rows/cols, or Dynamic
+  * \param MaxSizeAtCompileTime the maximum number of rows/cols, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
+  * \param IndexType the interger type of the indices
+  *
+  * This class represents a permutation matrix, internally stored as a vector of integers.
+  *
+  * \sa class PermutationBase, class PermutationWrapper, class DiagonalMatrix
+  */
+
+namespace internal {
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
+struct traits<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >
+ : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
+{
+  typedef IndexType Index;
+  typedef Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
+};
+}
+
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
+class PermutationMatrix : public PermutationBase<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType> >
+{
+    typedef PermutationBase<PermutationMatrix> Base;
+    typedef internal::traits<PermutationMatrix> Traits;
+  public:
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef typename Traits::IndicesType IndicesType;
+    #endif
+
+    inline PermutationMatrix()
+    {}
+
+    /** Constructs an uninitialized permutation matrix of given size.
+      */
+    inline PermutationMatrix(int size) : m_indices(size)
+    {}
+
+    /** Copy constructor. */
+    template<typename OtherDerived>
+    inline PermutationMatrix(const PermutationBase<OtherDerived>& other)
+      : m_indices(other.indices()) {}
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** Standard copy constructor. Defined only to prevent a default copy constructor
+      * from hiding the other templated constructor */
+    inline PermutationMatrix(const PermutationMatrix& other) : m_indices(other.indices()) {}
+    #endif
+
+    /** Generic constructor from expression of the indices. The indices
+      * array has the meaning that the permutations sends each integer i to indices[i].
+      *
+      * \warning It is your responsibility to check that the indices array that you passes actually
+      * describes a permutation, i.e., each value between 0 and n-1 occurs exactly once, where n is the
+      * array's size.
+      */
+    template<typename Other>
+    explicit inline PermutationMatrix(const MatrixBase<Other>& a_indices) : m_indices(a_indices)
+    {}
+
+    /** Convert the Transpositions \a tr to a permutation matrix */
+    template<typename Other>
+    explicit PermutationMatrix(const TranspositionsBase<Other>& tr)
+      : m_indices(tr.size())
+    {
+      *this = tr;
+    }
+
+    /** Copies the other permutation into *this */
+    template<typename Other>
+    PermutationMatrix& operator=(const PermutationBase<Other>& other)
+    {
+      m_indices = other.indices();
+      return *this;
+    }
+
+    /** Assignment from the Transpositions \a tr */
+    template<typename Other>
+    PermutationMatrix& operator=(const TranspositionsBase<Other>& tr)
+    {
+      return Base::operator=(tr.derived());
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    PermutationMatrix& operator=(const PermutationMatrix& other)
+    {
+      m_indices = other.m_indices;
+      return *this;
+    }
+    #endif
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return m_indices; }
+    /** \returns a reference to the stored array representing the permutation. */
+    IndicesType& indices() { return m_indices; }
+
+
+    /**** multiplication helpers to hopefully get RVO ****/
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename Other>
+    PermutationMatrix(const Transpose<PermutationBase<Other> >& other)
+      : m_indices(other.nestedPermutation().size())
+    {
+      for (int i=0; i<m_indices.size();++i) m_indices.coeffRef(other.nestedPermutation().indices().coeff(i)) = i;
+    }
+    template<typename Lhs,typename Rhs>
+    PermutationMatrix(internal::PermPermProduct_t, const Lhs& lhs, const Rhs& rhs)
+      : m_indices(lhs.indices().size())
+    {
+      Base::assignProduct(lhs,rhs);
+    }
+#endif
+
+  protected:
+
+    IndicesType m_indices;
+};
+
+
+namespace internal {
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
+struct traits<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >
+ : traits<Matrix<IndexType,SizeAtCompileTime,SizeAtCompileTime,0,MaxSizeAtCompileTime,MaxSizeAtCompileTime> >
+{
+  typedef IndexType Index;
+  typedef Map<const Matrix<IndexType, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1>, _PacketAccess> IndicesType;
+};
+}
+
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
+class Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess>
+  : public PermutationBase<Map<PermutationMatrix<SizeAtCompileTime, MaxSizeAtCompileTime, IndexType>,_PacketAccess> >
+{
+    typedef PermutationBase<Map> Base;
+    typedef internal::traits<Map> Traits;
+  public:
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef typename Traits::IndicesType IndicesType;
+    typedef typename IndicesType::Scalar Index;
+    #endif
+
+    inline Map(const Index* indicesPtr)
+      : m_indices(indicesPtr)
+    {}
+
+    inline Map(const Index* indicesPtr, Index size)
+      : m_indices(indicesPtr,size)
+    {}
+
+    /** Copies the other permutation into *this */
+    template<typename Other>
+    Map& operator=(const PermutationBase<Other>& other)
+    { return Base::operator=(other.derived()); }
+
+    /** Assignment from the Transpositions \a tr */
+    template<typename Other>
+    Map& operator=(const TranspositionsBase<Other>& tr)
+    { return Base::operator=(tr.derived()); }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    Map& operator=(const Map& other)
+    {
+      m_indices = other.m_indices;
+      return *this;
+    }
+    #endif
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return m_indices; }
+    /** \returns a reference to the stored array representing the permutation. */
+    IndicesType& indices() { return m_indices; }
+
+  protected:
+
+    IndicesType m_indices;
+};
+
+/** \class PermutationWrapper
+  * \ingroup Core_Module
+  *
+  * \brief Class to view a vector of integers as a permutation matrix
+  *
+  * \param _IndicesType the type of the vector of integer (can be any compatible expression)
+  *
+  * This class allows to view any vector expression of integers as a permutation matrix.
+  *
+  * \sa class PermutationBase, class PermutationMatrix
+  */
+
+struct PermutationStorage {};
+
+template<typename _IndicesType> class TranspositionsWrapper;
+namespace internal {
+template<typename _IndicesType>
+struct traits<PermutationWrapper<_IndicesType> >
+{
+  typedef PermutationStorage StorageKind;
+  typedef typename _IndicesType::Scalar Scalar;
+  typedef typename _IndicesType::Scalar Index;
+  typedef _IndicesType IndicesType;
+  enum {
+    RowsAtCompileTime = _IndicesType::SizeAtCompileTime,
+    ColsAtCompileTime = _IndicesType::SizeAtCompileTime,
+    MaxRowsAtCompileTime = IndicesType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = IndicesType::MaxColsAtCompileTime,
+    Flags = 0,
+    CoeffReadCost = _IndicesType::CoeffReadCost
+  };
+};
+}
+
+template<typename _IndicesType>
+class PermutationWrapper : public PermutationBase<PermutationWrapper<_IndicesType> >
+{
+    typedef PermutationBase<PermutationWrapper> Base;
+    typedef internal::traits<PermutationWrapper> Traits;
+  public:
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef typename Traits::IndicesType IndicesType;
+    #endif
+
+    inline PermutationWrapper(const IndicesType& a_indices)
+      : m_indices(a_indices)
+    {}
+
+    /** const version of indices(). */
+    const typename internal::remove_all<typename IndicesType::Nested>::type&
+    indices() const { return m_indices; }
+
+  protected:
+
+    typename IndicesType::Nested m_indices;
+};
+
+/** \returns the matrix with the permutation applied to the columns.
+  */
+template<typename Derived, typename PermutationDerived>
+inline const internal::permut_matrix_product_retval<PermutationDerived, Derived, OnTheRight>
+operator*(const MatrixBase<Derived>& matrix,
+          const PermutationBase<PermutationDerived> &permutation)
+{
+  return internal::permut_matrix_product_retval
+           <PermutationDerived, Derived, OnTheRight>
+           (permutation.derived(), matrix.derived());
+}
+
+/** \returns the matrix with the permutation applied to the rows.
+  */
+template<typename Derived, typename PermutationDerived>
+inline const internal::permut_matrix_product_retval
+               <PermutationDerived, Derived, OnTheLeft>
+operator*(const PermutationBase<PermutationDerived> &permutation,
+          const MatrixBase<Derived>& matrix)
+{
+  return internal::permut_matrix_product_retval
+           <PermutationDerived, Derived, OnTheLeft>
+           (permutation.derived(), matrix.derived());
+}
+
+namespace internal {
+
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
+struct traits<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
+{
+  typedef typename MatrixType::PlainObject ReturnType;
+};
+
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
+struct permut_matrix_product_retval
+ : public ReturnByValue<permut_matrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
+{
+    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
+    typedef typename MatrixType::Index Index;
+
+    permut_matrix_product_retval(const PermutationType& perm, const MatrixType& matrix)
+      : m_permutation(perm), m_matrix(matrix)
+    {}
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    template<typename Dest> inline void evalTo(Dest& dst) const
+    {
+      const Index n = Side==OnTheLeft ? rows() : cols();
+
+      if(is_same<MatrixTypeNestedCleaned,Dest>::value && extract_data(dst) == extract_data(m_matrix))
+      {
+        // apply the permutation inplace
+        Matrix<bool,PermutationType::RowsAtCompileTime,1,0,PermutationType::MaxRowsAtCompileTime> mask(m_permutation.size());
+        mask.fill(false);
+        Index r = 0;
+        while(r < m_permutation.size())
+        {
+          // search for the next seed
+          while(r<m_permutation.size() && mask[r]) r++;
+          if(r>=m_permutation.size())
+            break;
+          // we got one, let's follow it until we are back to the seed
+          Index k0 = r++;
+          Index kPrev = k0;
+          mask.coeffRef(k0) = true;
+          for(Index k=m_permutation.indices().coeff(k0); k!=k0; k=m_permutation.indices().coeff(k))
+          {
+                  Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>(dst, k)
+            .swap(Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
+                       (dst,((Side==OnTheLeft) ^ Transposed) ? k0 : kPrev));
+
+            mask.coeffRef(k) = true;
+            kPrev = k;
+          }
+        }
+      }
+      else
+      {
+        for(int i = 0; i < n; ++i)
+        {
+          Block<Dest, Side==OnTheLeft ? 1 : Dest::RowsAtCompileTime, Side==OnTheRight ? 1 : Dest::ColsAtCompileTime>
+               (dst, ((Side==OnTheLeft) ^ Transposed) ? m_permutation.indices().coeff(i) : i)
+
+          =
+
+          Block<const MatrixTypeNestedCleaned,Side==OnTheLeft ? 1 : MatrixType::RowsAtCompileTime,Side==OnTheRight ? 1 : MatrixType::ColsAtCompileTime>
+               (m_matrix, ((Side==OnTheRight) ^ Transposed) ? m_permutation.indices().coeff(i) : i);
+        }
+      }
+    }
+
+  protected:
+    const PermutationType& m_permutation;
+    typename MatrixType::Nested m_matrix;
+};
+
+/* Template partial specialization for transposed/inverse permutations */
+
+template<typename Derived>
+struct traits<Transpose<PermutationBase<Derived> > >
+ : traits<Derived>
+{};
+
+} // end namespace internal
+
+template<typename Derived>
+class Transpose<PermutationBase<Derived> >
+  : public EigenBase<Transpose<PermutationBase<Derived> > >
+{
+    typedef Derived PermutationType;
+    typedef typename PermutationType::IndicesType IndicesType;
+    typedef typename PermutationType::PlainPermutationType PlainPermutationType;
+  public:
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    typedef internal::traits<PermutationType> Traits;
+    typedef typename Derived::DenseMatrixType DenseMatrixType;
+    enum {
+      Flags = Traits::Flags,
+      CoeffReadCost = Traits::CoeffReadCost,
+      RowsAtCompileTime = Traits::RowsAtCompileTime,
+      ColsAtCompileTime = Traits::ColsAtCompileTime,
+      MaxRowsAtCompileTime = Traits::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = Traits::MaxColsAtCompileTime
+    };
+    typedef typename Traits::Scalar Scalar;
+    #endif
+
+    Transpose(const PermutationType& p) : m_permutation(p) {}
+
+    inline int rows() const { return m_permutation.rows(); }
+    inline int cols() const { return m_permutation.cols(); }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename DenseDerived>
+    void evalTo(MatrixBase<DenseDerived>& other) const
+    {
+      other.setZero();
+      for (int i=0; i<rows();++i)
+        other.coeffRef(i, m_permutation.indices().coeff(i)) = typename DenseDerived::Scalar(1);
+    }
+    #endif
+
+    /** \return the equivalent permutation matrix */
+    PlainPermutationType eval() const { return *this; }
+
+    DenseMatrixType toDenseMatrix() const { return *this; }
+
+    /** \returns the matrix with the inverse permutation applied to the columns.
+      */
+    template<typename OtherDerived> friend
+    inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>
+    operator*(const MatrixBase<OtherDerived>& matrix, const Transpose& trPerm)
+    {
+      return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheRight, true>(trPerm.m_permutation, matrix.derived());
+    }
+
+    /** \returns the matrix with the inverse permutation applied to the rows.
+      */
+    template<typename OtherDerived>
+    inline const internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>
+    operator*(const MatrixBase<OtherDerived>& matrix) const
+    {
+      return internal::permut_matrix_product_retval<PermutationType, OtherDerived, OnTheLeft, true>(m_permutation, matrix.derived());
+    }
+
+    const PermutationType& nestedPermutation() const { return m_permutation; }
+
+  protected:
+    const PermutationType& m_permutation;
+};
+
+template<typename Derived>
+const PermutationWrapper<const Derived> MatrixBase<Derived>::asPermutation() const
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PERMUTATIONMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/PlainObjectBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/PlainObjectBase.h
new file mode 100644
index 0000000..b01bd6d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/PlainObjectBase.h
@@ -0,0 +1,782 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DENSESTORAGEBASE_H
+#define EIGEN_DENSESTORAGEBASE_H
+
+#if defined(EIGEN_INITIALIZE_MATRICES_BY_ZERO)
+# define EIGEN_INITIALIZE_COEFFS
+# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=Scalar(0);
+#elif defined(EIGEN_INITIALIZE_MATRICES_BY_NAN)
+# define EIGEN_INITIALIZE_COEFFS
+# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED for(int i=0;i<base().size();++i) coeffRef(i)=std::numeric_limits<Scalar>::quiet_NaN();
+#else
+# undef EIGEN_INITIALIZE_COEFFS
+# define EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+#endif
+
+namespace Eigen {
+
+namespace internal {
+
+template<int MaxSizeAtCompileTime> struct check_rows_cols_for_overflow {
+  template<typename Index>
+  static EIGEN_ALWAYS_INLINE void run(Index, Index)
+  {
+  }
+};
+
+template<> struct check_rows_cols_for_overflow<Dynamic> {
+  template<typename Index>
+  static EIGEN_ALWAYS_INLINE void run(Index rows, Index cols)
+  {
+    // http://hg.mozilla.org/mozilla-central/file/6c8a909977d3/xpcom/ds/CheckedInt.h#l242
+    // we assume Index is signed
+    Index max_index = (size_t(1) << (8 * sizeof(Index) - 1)) - 1; // assume Index is signed
+    bool error = (rows == 0 || cols == 0) ? false
+               : (rows > max_index / cols);
+    if (error)
+      throw_std_bad_alloc();
+  }
+};
+
+template <typename Derived, typename OtherDerived = Derived, bool IsVector = bool(Derived::IsVectorAtCompileTime)> struct conservative_resize_like_impl;
+
+template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers> struct matrix_swap_impl;
+
+} // end namespace internal
+
+/** \class PlainObjectBase
+  * \brief %Dense storage base class for matrices and arrays.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_PLAINOBJECTBASE_PLUGIN.
+  *
+  * \sa \ref TopicClassHierarchy
+  */
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+namespace internal {
+
+// this is a warkaround to doxygen not being able to understand the inheritence logic
+// when it is hidden by the dense_xpr_base helper struct.
+template<typename Derived> struct dense_xpr_base_dispatcher_for_doxygen;// : public MatrixBase<Derived> {};
+/** This class is just a workaround for Doxygen and it does not not actually exist. */
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct dense_xpr_base_dispatcher_for_doxygen<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+    : public MatrixBase<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {};
+/** This class is just a workaround for Doxygen and it does not not actually exist. */
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct dense_xpr_base_dispatcher_for_doxygen<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
+    : public ArrayBase<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {};
+
+} // namespace internal
+
+template<typename Derived>
+class PlainObjectBase : public internal::dense_xpr_base_dispatcher_for_doxygen<Derived>
+#else
+template<typename Derived>
+class PlainObjectBase : public internal::dense_xpr_base<Derived>::type
+#endif
+{
+  public:
+    enum { Options = internal::traits<Derived>::Options };
+    typedef typename internal::dense_xpr_base<Derived>::type Base;
+
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef Derived DenseType;
+
+    using Base::RowsAtCompileTime;
+    using Base::ColsAtCompileTime;
+    using Base::SizeAtCompileTime;
+    using Base::MaxRowsAtCompileTime;
+    using Base::MaxColsAtCompileTime;
+    using Base::MaxSizeAtCompileTime;
+    using Base::IsVectorAtCompileTime;
+    using Base::Flags;
+
+    template<typename PlainObjectType, int MapOptions, typename StrideType> friend class Eigen::Map;
+    friend  class Eigen::Map<Derived, Unaligned>;
+    typedef Eigen::Map<Derived, Unaligned>  MapType;
+    friend  class Eigen::Map<const Derived, Unaligned>;
+    typedef const Eigen::Map<const Derived, Unaligned> ConstMapType;
+    friend  class Eigen::Map<Derived, Aligned>;
+    typedef Eigen::Map<Derived, Aligned> AlignedMapType;
+    friend  class Eigen::Map<const Derived, Aligned>;
+    typedef const Eigen::Map<const Derived, Aligned> ConstAlignedMapType;
+    template<typename StrideType> struct StridedMapType { typedef Eigen::Map<Derived, Unaligned, StrideType> type; };
+    template<typename StrideType> struct StridedConstMapType { typedef Eigen::Map<const Derived, Unaligned, StrideType> type; };
+    template<typename StrideType> struct StridedAlignedMapType { typedef Eigen::Map<Derived, Aligned, StrideType> type; };
+    template<typename StrideType> struct StridedConstAlignedMapType { typedef Eigen::Map<const Derived, Aligned, StrideType> type; };
+
+  protected:
+    DenseStorage<Scalar, Base::MaxSizeAtCompileTime, Base::RowsAtCompileTime, Base::ColsAtCompileTime, Options> m_storage;
+
+  public:
+    enum { NeedsToAlign = SizeAtCompileTime != Dynamic && (internal::traits<Derived>::Flags & AlignedBit) != 0 };
+    EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
+
+    Base& base() { return *static_cast<Base*>(this); }
+    const Base& base() const { return *static_cast<const Base*>(this); }
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_storage.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_storage.cols(); }
+
+    EIGEN_STRONG_INLINE const Scalar& coeff(Index rowId, Index colId) const
+    {
+      if(Flags & RowMajorBit)
+        return m_storage.data()[colId + rowId * m_storage.cols()];
+      else // column-major
+        return m_storage.data()[rowId + colId * m_storage.rows()];
+    }
+
+    EIGEN_STRONG_INLINE const Scalar& coeff(Index index) const
+    {
+      return m_storage.data()[index];
+    }
+
+    EIGEN_STRONG_INLINE Scalar& coeffRef(Index rowId, Index colId)
+    {
+      if(Flags & RowMajorBit)
+        return m_storage.data()[colId + rowId * m_storage.cols()];
+      else // column-major
+        return m_storage.data()[rowId + colId * m_storage.rows()];
+    }
+
+    EIGEN_STRONG_INLINE Scalar& coeffRef(Index index)
+    {
+      return m_storage.data()[index];
+    }
+
+    EIGEN_STRONG_INLINE const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      if(Flags & RowMajorBit)
+        return m_storage.data()[colId + rowId * m_storage.cols()];
+      else // column-major
+        return m_storage.data()[rowId + colId * m_storage.rows()];
+    }
+
+    EIGEN_STRONG_INLINE const Scalar& coeffRef(Index index) const
+    {
+      return m_storage.data()[index];
+    }
+
+    /** \internal */
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index rowId, Index colId) const
+    {
+      return internal::ploadt<PacketScalar, LoadMode>
+               (m_storage.data() + (Flags & RowMajorBit
+                                   ? colId + rowId * m_storage.cols()
+                                   : rowId + colId * m_storage.rows()));
+    }
+
+    /** \internal */
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE PacketScalar packet(Index index) const
+    {
+      return internal::ploadt<PacketScalar, LoadMode>(m_storage.data() + index);
+    }
+
+    /** \internal */
+    template<int StoreMode>
+    EIGEN_STRONG_INLINE void writePacket(Index rowId, Index colId, const PacketScalar& val)
+    {
+      internal::pstoret<Scalar, PacketScalar, StoreMode>
+              (m_storage.data() + (Flags & RowMajorBit
+                                   ? colId + rowId * m_storage.cols()
+                                   : rowId + colId * m_storage.rows()), val);
+    }
+
+    /** \internal */
+    template<int StoreMode>
+    EIGEN_STRONG_INLINE void writePacket(Index index, const PacketScalar& val)
+    {
+      internal::pstoret<Scalar, PacketScalar, StoreMode>(m_storage.data() + index, val);
+    }
+
+    /** \returns a const pointer to the data array of this matrix */
+    EIGEN_STRONG_INLINE const Scalar *data() const
+    { return m_storage.data(); }
+
+    /** \returns a pointer to the data array of this matrix */
+    EIGEN_STRONG_INLINE Scalar *data()
+    { return m_storage.data(); }
+
+    /** Resizes \c *this to a \a rows x \a cols matrix.
+      *
+      * This method is intended for dynamic-size matrices, although it is legal to call it on any
+      * matrix as long as fixed dimensions are left unchanged. If you only want to change the number
+      * of rows and/or of columns, you can use resize(NoChange_t, Index), resize(Index, NoChange_t).
+      *
+      * If the current number of coefficients of \c *this exactly matches the
+      * product \a rows * \a cols, then no memory allocation is performed and
+      * the current values are left unchanged. In all other cases, including
+      * shrinking, the data is reallocated and all previous values are lost.
+      *
+      * Example: \include Matrix_resize_int_int.cpp
+      * Output: \verbinclude Matrix_resize_int_int.out
+      *
+      * \sa resize(Index) for vectors, resize(NoChange_t, Index), resize(Index, NoChange_t)
+      */
+    EIGEN_STRONG_INLINE void resize(Index nbRows, Index nbCols)
+    {
+      eigen_assert(   EIGEN_IMPLIES(RowsAtCompileTime!=Dynamic,nbRows==RowsAtCompileTime)
+                   && EIGEN_IMPLIES(ColsAtCompileTime!=Dynamic,nbCols==ColsAtCompileTime)
+                   && EIGEN_IMPLIES(RowsAtCompileTime==Dynamic && MaxRowsAtCompileTime!=Dynamic,nbRows<=MaxRowsAtCompileTime)
+                   && EIGEN_IMPLIES(ColsAtCompileTime==Dynamic && MaxColsAtCompileTime!=Dynamic,nbCols<=MaxColsAtCompileTime)
+                   && nbRows>=0 && nbCols>=0 && "Invalid sizes when resizing a matrix or array.");
+      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(nbRows, nbCols);
+      #ifdef EIGEN_INITIALIZE_COEFFS
+        Index size = nbRows*nbCols;
+        bool size_changed = size != this->size();
+        m_storage.resize(size, nbRows, nbCols);
+        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+      #else
+        internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(nbRows, nbCols);
+        m_storage.resize(nbRows*nbCols, nbRows, nbCols);
+      #endif
+    }
+
+    /** Resizes \c *this to a vector of length \a size
+      *
+      * \only_for_vectors. This method does not work for
+      * partially dynamic matrices when the static dimension is anything other
+      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
+      *
+      * Example: \include Matrix_resize_int.cpp
+      * Output: \verbinclude Matrix_resize_int.out
+      *
+      * \sa resize(Index,Index), resize(NoChange_t, Index), resize(Index, NoChange_t)
+      */
+    inline void resize(Index size)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(PlainObjectBase)
+      eigen_assert(((SizeAtCompileTime == Dynamic && (MaxSizeAtCompileTime==Dynamic || size<=MaxSizeAtCompileTime)) || SizeAtCompileTime == size) && size>=0);
+      #ifdef EIGEN_INITIALIZE_COEFFS
+        bool size_changed = size != this->size();
+      #endif
+      if(RowsAtCompileTime == 1)
+        m_storage.resize(size, 1, size);
+      else
+        m_storage.resize(size, size, 1);
+      #ifdef EIGEN_INITIALIZE_COEFFS
+        if(size_changed) EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+      #endif
+    }
+
+    /** Resizes the matrix, changing only the number of columns. For the parameter of type NoChange_t, just pass the special value \c NoChange
+      * as in the example below.
+      *
+      * Example: \include Matrix_resize_NoChange_int.cpp
+      * Output: \verbinclude Matrix_resize_NoChange_int.out
+      *
+      * \sa resize(Index,Index)
+      */
+    inline void resize(NoChange_t, Index nbCols)
+    {
+      resize(rows(), nbCols);
+    }
+
+    /** Resizes the matrix, changing only the number of rows. For the parameter of type NoChange_t, just pass the special value \c NoChange
+      * as in the example below.
+      *
+      * Example: \include Matrix_resize_int_NoChange.cpp
+      * Output: \verbinclude Matrix_resize_int_NoChange.out
+      *
+      * \sa resize(Index,Index)
+      */
+    inline void resize(Index nbRows, NoChange_t)
+    {
+      resize(nbRows, cols());
+    }
+
+    /** Resizes \c *this to have the same dimensions as \a other.
+      * Takes care of doing all the checking that's needed.
+      *
+      * Note that copying a row-vector into a vector (and conversely) is allowed.
+      * The resizing, if any, is then done in the appropriate way so that row-vectors
+      * remain row-vectors and vectors remain vectors.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void resizeLike(const EigenBase<OtherDerived>& _other)
+    {
+      const OtherDerived& other = _other.derived();
+      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(other.rows(), other.cols());
+      const Index othersize = other.rows()*other.cols();
+      if(RowsAtCompileTime == 1)
+      {
+        eigen_assert(other.rows() == 1 || other.cols() == 1);
+        resize(1, othersize);
+      }
+      else if(ColsAtCompileTime == 1)
+      {
+        eigen_assert(other.rows() == 1 || other.cols() == 1);
+        resize(othersize, 1);
+      }
+      else resize(other.rows(), other.cols());
+    }
+
+    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+      *
+      * The method is intended for matrices of dynamic size. If you only want to change the number
+      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
+      * conservativeResize(Index, NoChange_t).
+      *
+      * Matrices are resized relative to the top-left element. In case values need to be 
+      * appended to the matrix they will be uninitialized.
+      */
+    EIGEN_STRONG_INLINE void conservativeResize(Index nbRows, Index nbCols)
+    {
+      internal::conservative_resize_like_impl<Derived>::run(*this, nbRows, nbCols);
+    }
+
+    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+      *
+      * As opposed to conservativeResize(Index rows, Index cols), this version leaves
+      * the number of columns unchanged.
+      *
+      * In case the matrix is growing, new rows will be uninitialized.
+      */
+    EIGEN_STRONG_INLINE void conservativeResize(Index nbRows, NoChange_t)
+    {
+      // Note: see the comment in conservativeResize(Index,Index)
+      conservativeResize(nbRows, cols());
+    }
+
+    /** Resizes the matrix to \a rows x \a cols while leaving old values untouched.
+      *
+      * As opposed to conservativeResize(Index rows, Index cols), this version leaves
+      * the number of rows unchanged.
+      *
+      * In case the matrix is growing, new columns will be uninitialized.
+      */
+    EIGEN_STRONG_INLINE void conservativeResize(NoChange_t, Index nbCols)
+    {
+      // Note: see the comment in conservativeResize(Index,Index)
+      conservativeResize(rows(), nbCols);
+    }
+
+    /** Resizes the vector to \a size while retaining old values.
+      *
+      * \only_for_vectors. This method does not work for
+      * partially dynamic matrices when the static dimension is anything other
+      * than 1. For example it will not work with Matrix<double, 2, Dynamic>.
+      *
+      * When values are appended, they will be uninitialized.
+      */
+    EIGEN_STRONG_INLINE void conservativeResize(Index size)
+    {
+      internal::conservative_resize_like_impl<Derived>::run(*this, size);
+    }
+
+    /** Resizes the matrix to \a rows x \a cols of \c other, while leaving old values untouched.
+      *
+      * The method is intended for matrices of dynamic size. If you only want to change the number
+      * of rows and/or of columns, you can use conservativeResize(NoChange_t, Index) or
+      * conservativeResize(Index, NoChange_t).
+      *
+      * Matrices are resized relative to the top-left element. In case values need to be 
+      * appended to the matrix they will copied from \c other.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void conservativeResizeLike(const DenseBase<OtherDerived>& other)
+    {
+      internal::conservative_resize_like_impl<Derived,OtherDerived>::run(*this, other);
+    }
+
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    EIGEN_STRONG_INLINE Derived& operator=(const PlainObjectBase& other)
+    {
+      return _set(other);
+    }
+
+    /** \sa MatrixBase::lazyAssign() */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Derived& lazyAssign(const DenseBase<OtherDerived>& other)
+    {
+      _resize_to_match(other);
+      return Base::lazyAssign(other.derived());
+    }
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Derived& operator=(const ReturnByValue<OtherDerived>& func)
+    {
+      resize(func.rows(), func.cols());
+      return Base::operator=(func);
+    }
+
+    EIGEN_STRONG_INLINE explicit PlainObjectBase() : m_storage()
+    {
+//       _check_template_params();
+//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    // FIXME is it still needed ?
+    /** \internal */
+    PlainObjectBase(internal::constructor_without_unaligned_array_assert)
+      : m_storage(internal::constructor_without_unaligned_array_assert())
+    {
+//       _check_template_params(); EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+#endif
+
+    EIGEN_STRONG_INLINE PlainObjectBase(Index a_size, Index nbRows, Index nbCols)
+      : m_storage(a_size, nbRows, nbCols)
+    {
+//       _check_template_params();
+//       EIGEN_INITIALIZE_COEFFS_IF_THAT_OPTION_IS_ENABLED
+    }
+
+    /** \copydoc MatrixBase::operator=(const EigenBase<OtherDerived>&)
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Derived& operator=(const EigenBase<OtherDerived> &other)
+    {
+      _resize_to_match(other);
+      Base::operator=(other.derived());
+      return this->derived();
+    }
+
+    /** \sa MatrixBase::operator=(const EigenBase<OtherDerived>&) */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE PlainObjectBase(const EigenBase<OtherDerived> &other)
+      : m_storage(other.derived().rows() * other.derived().cols(), other.derived().rows(), other.derived().cols())
+    {
+      _check_template_params();
+      internal::check_rows_cols_for_overflow<MaxSizeAtCompileTime>::run(other.derived().rows(), other.derived().cols());
+      Base::operator=(other.derived());
+    }
+
+    /** \name Map
+      * These are convenience functions returning Map objects. The Map() static functions return unaligned Map objects,
+      * while the AlignedMap() functions return aligned Map objects and thus should be called only with 16-byte-aligned
+      * \a data pointers.
+      *
+      * \see class Map
+      */
+    //@{
+    static inline ConstMapType Map(const Scalar* data)
+    { return ConstMapType(data); }
+    static inline MapType Map(Scalar* data)
+    { return MapType(data); }
+    static inline ConstMapType Map(const Scalar* data, Index size)
+    { return ConstMapType(data, size); }
+    static inline MapType Map(Scalar* data, Index size)
+    { return MapType(data, size); }
+    static inline ConstMapType Map(const Scalar* data, Index rows, Index cols)
+    { return ConstMapType(data, rows, cols); }
+    static inline MapType Map(Scalar* data, Index rows, Index cols)
+    { return MapType(data, rows, cols); }
+
+    static inline ConstAlignedMapType MapAligned(const Scalar* data)
+    { return ConstAlignedMapType(data); }
+    static inline AlignedMapType MapAligned(Scalar* data)
+    { return AlignedMapType(data); }
+    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index size)
+    { return ConstAlignedMapType(data, size); }
+    static inline AlignedMapType MapAligned(Scalar* data, Index size)
+    { return AlignedMapType(data, size); }
+    static inline ConstAlignedMapType MapAligned(const Scalar* data, Index rows, Index cols)
+    { return ConstAlignedMapType(data, rows, cols); }
+    static inline AlignedMapType MapAligned(Scalar* data, Index rows, Index cols)
+    { return AlignedMapType(data, rows, cols); }
+
+    template<int Outer, int Inner>
+    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, const Stride<Outer, Inner>& stride)
+    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, size, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
+    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedConstMapType<Stride<Outer, Inner> >::type Map(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedMapType<Stride<Outer, Inner> >::type Map(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
+    { return typename StridedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
+
+    template<int Outer, int Inner>
+    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, const Stride<Outer, Inner>& stride)
+    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index size, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index size, const Stride<Outer, Inner>& stride)
+    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, size, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type MapAligned(const Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
+    { return typename StridedConstAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
+    template<int Outer, int Inner>
+    static inline typename StridedAlignedMapType<Stride<Outer, Inner> >::type MapAligned(Scalar* data, Index rows, Index cols, const Stride<Outer, Inner>& stride)
+    { return typename StridedAlignedMapType<Stride<Outer, Inner> >::type(data, rows, cols, stride); }
+    //@}
+
+    using Base::setConstant;
+    Derived& setConstant(Index size, const Scalar& value);
+    Derived& setConstant(Index rows, Index cols, const Scalar& value);
+
+    using Base::setZero;
+    Derived& setZero(Index size);
+    Derived& setZero(Index rows, Index cols);
+
+    using Base::setOnes;
+    Derived& setOnes(Index size);
+    Derived& setOnes(Index rows, Index cols);
+
+    using Base::setRandom;
+    Derived& setRandom(Index size);
+    Derived& setRandom(Index rows, Index cols);
+
+    #ifdef EIGEN_PLAINOBJECTBASE_PLUGIN
+    #include EIGEN_PLAINOBJECTBASE_PLUGIN
+    #endif
+
+  protected:
+    /** \internal Resizes *this in preparation for assigning \a other to it.
+      * Takes care of doing all the checking that's needed.
+      *
+      * Note that copying a row-vector into a vector (and conversely) is allowed.
+      * The resizing, if any, is then done in the appropriate way so that row-vectors
+      * remain row-vectors and vectors remain vectors.
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void _resize_to_match(const EigenBase<OtherDerived>& other)
+    {
+      #ifdef EIGEN_NO_AUTOMATIC_RESIZING
+      eigen_assert((this->size()==0 || (IsVectorAtCompileTime ? (this->size() == other.size())
+                 : (rows() == other.rows() && cols() == other.cols())))
+        && "Size mismatch. Automatic resizing is disabled because EIGEN_NO_AUTOMATIC_RESIZING is defined");
+      EIGEN_ONLY_USED_FOR_DEBUG(other);
+      #else
+      resizeLike(other);
+      #endif
+    }
+
+    /**
+      * \brief Copies the value of the expression \a other into \c *this with automatic resizing.
+      *
+      * *this might be resized to match the dimensions of \a other. If *this was a null matrix (not already initialized),
+      * it will be initialized.
+      *
+      * Note that copying a row-vector into a vector (and conversely) is allowed.
+      * The resizing, if any, is then done in the appropriate way so that row-vectors
+      * remain row-vectors and vectors remain vectors.
+      *
+      * \sa operator=(const MatrixBase<OtherDerived>&), _set_noalias()
+      *
+      * \internal
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Derived& _set(const DenseBase<OtherDerived>& other)
+    {
+      _set_selector(other.derived(), typename internal::conditional<static_cast<bool>(int(OtherDerived::Flags) & EvalBeforeAssigningBit), internal::true_type, internal::false_type>::type());
+      return this->derived();
+    }
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void _set_selector(const OtherDerived& other, const internal::true_type&) { _set_noalias(other.eval()); }
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE void _set_selector(const OtherDerived& other, const internal::false_type&) { _set_noalias(other); }
+
+    /** \internal Like _set() but additionally makes the assumption that no aliasing effect can happen (which
+      * is the case when creating a new matrix) so one can enforce lazy evaluation.
+      *
+      * \sa operator=(const MatrixBase<OtherDerived>&), _set()
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE Derived& _set_noalias(const DenseBase<OtherDerived>& other)
+    {
+      // I don't think we need this resize call since the lazyAssign will anyways resize
+      // and lazyAssign will be called by the assign selector.
+      //_resize_to_match(other);
+      // the 'false' below means to enforce lazy evaluation. We don't use lazyAssign() because
+      // it wouldn't allow to copy a row-vector into a column-vector.
+      return internal::assign_selector<Derived,OtherDerived,false>::run(this->derived(), other.derived());
+    }
+
+    template<typename T0, typename T1>
+    EIGEN_STRONG_INLINE void _init2(Index nbRows, Index nbCols, typename internal::enable_if<Base::SizeAtCompileTime!=2,T0>::type* = 0)
+    {
+      EIGEN_STATIC_ASSERT(bool(NumTraits<T0>::IsInteger) &&
+                          bool(NumTraits<T1>::IsInteger),
+                          FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED)
+      resize(nbRows,nbCols);
+    }
+    template<typename T0, typename T1>
+    EIGEN_STRONG_INLINE void _init2(const Scalar& val0, const Scalar& val1, typename internal::enable_if<Base::SizeAtCompileTime==2,T0>::type* = 0)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(PlainObjectBase, 2)
+      m_storage.data()[0] = val0;
+      m_storage.data()[1] = val1;
+    }
+
+    template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
+    friend struct internal::matrix_swap_impl;
+
+    /** \internal generic implementation of swap for dense storage since for dynamic-sized matrices of same type it is enough to swap the
+      * data pointers.
+      */
+    template<typename OtherDerived>
+    void _swap(DenseBase<OtherDerived> const & other)
+    {
+      enum { SwapPointers = internal::is_same<Derived, OtherDerived>::value && Base::SizeAtCompileTime==Dynamic };
+      internal::matrix_swap_impl<Derived, OtherDerived, bool(SwapPointers)>::run(this->derived(), other.const_cast_derived());
+    }
+
+  public:
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    static EIGEN_STRONG_INLINE void _check_template_params()
+    {
+      EIGEN_STATIC_ASSERT((EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1, (Options&RowMajor)==RowMajor)
+                        && EIGEN_IMPLIES(MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1, (Options&RowMajor)==0)
+                        && ((RowsAtCompileTime == Dynamic) || (RowsAtCompileTime >= 0))
+                        && ((ColsAtCompileTime == Dynamic) || (ColsAtCompileTime >= 0))
+                        && ((MaxRowsAtCompileTime == Dynamic) || (MaxRowsAtCompileTime >= 0))
+                        && ((MaxColsAtCompileTime == Dynamic) || (MaxColsAtCompileTime >= 0))
+                        && (MaxRowsAtCompileTime == RowsAtCompileTime || RowsAtCompileTime==Dynamic)
+                        && (MaxColsAtCompileTime == ColsAtCompileTime || ColsAtCompileTime==Dynamic)
+                        && (Options & (DontAlign|RowMajor)) == Options),
+        INVALID_MATRIX_TEMPLATE_PARAMETERS)
+    }
+#endif
+
+private:
+    enum { ThisConstantIsPrivateInPlainObjectBase };
+};
+
+template <typename Derived, typename OtherDerived, bool IsVector>
+struct internal::conservative_resize_like_impl
+{
+  typedef typename Derived::Index Index;
+  static void run(DenseBase<Derived>& _this, Index rows, Index cols)
+  {
+    if (_this.rows() == rows && _this.cols() == cols) return;
+    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
+
+    if ( ( Derived::IsRowMajor && _this.cols() == cols) || // row-major and we change only the number of rows
+         (!Derived::IsRowMajor && _this.rows() == rows) )  // column-major and we change only the number of columns
+    {
+      internal::check_rows_cols_for_overflow<Derived::MaxSizeAtCompileTime>::run(rows, cols);
+      _this.derived().m_storage.conservativeResize(rows*cols,rows,cols);
+    }
+    else
+    {
+      // The storage order does not allow us to use reallocation.
+      typename Derived::PlainObject tmp(rows,cols);
+      const Index common_rows = (std::min)(rows, _this.rows());
+      const Index common_cols = (std::min)(cols, _this.cols());
+      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
+      _this.derived().swap(tmp);
+    }
+  }
+
+  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
+  {
+    if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
+
+    // Note: Here is space for improvement. Basically, for conservativeResize(Index,Index),
+    // neither RowsAtCompileTime or ColsAtCompileTime must be Dynamic. If only one of the
+    // dimensions is dynamic, one could use either conservativeResize(Index rows, NoChange_t) or
+    // conservativeResize(NoChange_t, Index cols). For these methods new static asserts like
+    // EIGEN_STATIC_ASSERT_DYNAMIC_ROWS and EIGEN_STATIC_ASSERT_DYNAMIC_COLS would be good.
+    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(Derived)
+    EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(OtherDerived)
+
+    if ( ( Derived::IsRowMajor && _this.cols() == other.cols()) || // row-major and we change only the number of rows
+         (!Derived::IsRowMajor && _this.rows() == other.rows()) )  // column-major and we change only the number of columns
+    {
+      const Index new_rows = other.rows() - _this.rows();
+      const Index new_cols = other.cols() - _this.cols();
+      _this.derived().m_storage.conservativeResize(other.size(),other.rows(),other.cols());
+      if (new_rows>0)
+        _this.bottomRightCorner(new_rows, other.cols()) = other.bottomRows(new_rows);
+      else if (new_cols>0)
+        _this.bottomRightCorner(other.rows(), new_cols) = other.rightCols(new_cols);
+    }
+    else
+    {
+      // The storage order does not allow us to use reallocation.
+      typename Derived::PlainObject tmp(other);
+      const Index common_rows = (std::min)(tmp.rows(), _this.rows());
+      const Index common_cols = (std::min)(tmp.cols(), _this.cols());
+      tmp.block(0,0,common_rows,common_cols) = _this.block(0,0,common_rows,common_cols);
+      _this.derived().swap(tmp);
+    }
+  }
+};
+
+namespace internal {
+
+template <typename Derived, typename OtherDerived>
+struct conservative_resize_like_impl<Derived,OtherDerived,true>
+{
+  typedef typename Derived::Index Index;
+  static void run(DenseBase<Derived>& _this, Index size)
+  {
+    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : size;
+    const Index new_cols = Derived::RowsAtCompileTime==1 ? size : 1;
+    _this.derived().m_storage.conservativeResize(size,new_rows,new_cols);
+  }
+
+  static void run(DenseBase<Derived>& _this, const DenseBase<OtherDerived>& other)
+  {
+    if (_this.rows() == other.rows() && _this.cols() == other.cols()) return;
+
+    const Index num_new_elements = other.size() - _this.size();
+
+    const Index new_rows = Derived::RowsAtCompileTime==1 ? 1 : other.rows();
+    const Index new_cols = Derived::RowsAtCompileTime==1 ? other.cols() : 1;
+    _this.derived().m_storage.conservativeResize(other.size(),new_rows,new_cols);
+
+    if (num_new_elements > 0)
+      _this.tail(num_new_elements) = other.tail(num_new_elements);
+  }
+};
+
+template<typename MatrixTypeA, typename MatrixTypeB, bool SwapPointers>
+struct matrix_swap_impl
+{
+  static inline void run(MatrixTypeA& a, MatrixTypeB& b)
+  {
+    a.base().swap(b);
+  }
+};
+
+template<typename MatrixTypeA, typename MatrixTypeB>
+struct matrix_swap_impl<MatrixTypeA, MatrixTypeB, true>
+{
+  static inline void run(MatrixTypeA& a, MatrixTypeB& b)
+  {
+    static_cast<typename MatrixTypeA::Base&>(a).m_storage.swap(static_cast<typename MatrixTypeB::Base&>(b).m_storage);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_DENSESTORAGEBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Product.h b/vendor/eigen-3.1.91/Eigen/src/Core/Product.h
new file mode 100644
index 0000000..3a08c02
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Product.h
@@ -0,0 +1,107 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PRODUCT_H
+#define EIGEN_PRODUCT_H
+
+namespace Eigen {
+
+template<typename Lhs, typename Rhs> class Product;
+template<typename Lhs, typename Rhs, typename StorageKind> class ProductImpl;
+
+/** \class Product
+  * \ingroup Core_Module
+  *
+  * \brief Expression of the product of two arbitrary matrices or vectors
+  *
+  * \param Lhs the type of the left-hand side expression
+  * \param Rhs the type of the right-hand side expression
+  *
+  * This class represents an expression of the product of two arbitrary matrices.
+  *
+  */
+
+// Use ProductReturnType to get correct traits, in particular vectorization flags
+namespace internal {
+template<typename Lhs, typename Rhs>
+struct traits<Product<Lhs, Rhs> >
+  : traits<typename ProductReturnType<Lhs, Rhs>::Type>
+{ 
+  // We want A+B*C to be of type Product<Matrix, Sum> and not Product<Matrix, Matrix>
+  // TODO: This flag should eventually go in a separate evaluator traits class
+  enum {
+    Flags = traits<typename ProductReturnType<Lhs, Rhs>::Type>::Flags & ~EvalBeforeNestingBit
+  };
+};
+} // end namespace internal
+
+
+template<typename Lhs, typename Rhs>
+class Product : public ProductImpl<Lhs,Rhs,typename internal::promote_storage_type<typename internal::traits<Lhs>::StorageKind,
+                                                                            typename internal::traits<Rhs>::StorageKind>::ret>
+{
+  public:
+    
+    typedef typename ProductImpl<
+        Lhs, Rhs,
+        typename internal::promote_storage_type<typename Lhs::StorageKind,
+                                                typename Rhs::StorageKind>::ret>::Base Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
+
+    typedef typename Lhs::Nested LhsNested;
+    typedef typename Rhs::Nested RhsNested;
+    typedef typename internal::remove_all<LhsNested>::type LhsNestedCleaned;
+    typedef typename internal::remove_all<RhsNested>::type RhsNestedCleaned;
+
+    Product(const Lhs& lhs, const Rhs& rhs) : m_lhs(lhs), m_rhs(rhs)
+    {
+      eigen_assert(lhs.cols() == rhs.rows()
+        && "invalid matrix product"
+        && "if you wanted a coeff-wise or a dot product use the respective explicit functions");
+    }
+
+    inline Index rows() const { return m_lhs.rows(); }
+    inline Index cols() const { return m_rhs.cols(); }
+
+    const LhsNestedCleaned& lhs() const { return m_lhs; }
+    const RhsNestedCleaned& rhs() const { return m_rhs; }
+
+  protected:
+
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+};
+
+template<typename Lhs, typename Rhs>
+class ProductImpl<Lhs,Rhs,Dense> : public internal::dense_xpr_base<Product<Lhs,Rhs> >::type
+{
+    typedef Product<Lhs, Rhs> Derived;
+  public:
+
+    typedef typename internal::dense_xpr_base<Product<Lhs, Rhs> >::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
+};
+
+/***************************************************************************
+* Implementation of matrix base methods
+***************************************************************************/
+
+
+/** \internal used to test the evaluator only
+  */
+template<typename Lhs,typename Rhs>
+const Product<Lhs,Rhs>
+prod(const Lhs& lhs, const Rhs& rhs)
+{
+  return Product<Lhs,Rhs>(lhs,rhs);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ProductBase.h b/vendor/eigen-3.1.91/Eigen/src/Core/ProductBase.h
new file mode 100644
index 0000000..a494b5f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ProductBase.h
@@ -0,0 +1,278 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PRODUCTBASE_H
+#define EIGEN_PRODUCTBASE_H
+
+namespace Eigen { 
+
+/** \class ProductBase
+  * \ingroup Core_Module
+  *
+  */
+
+namespace internal {
+template<typename Derived, typename _Lhs, typename _Rhs>
+struct traits<ProductBase<Derived,_Lhs,_Rhs> >
+{
+  typedef MatrixXpr XprKind;
+  typedef typename remove_all<_Lhs>::type Lhs;
+  typedef typename remove_all<_Rhs>::type Rhs;
+  typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;
+  typedef typename promote_storage_type<typename traits<Lhs>::StorageKind,
+                                           typename traits<Rhs>::StorageKind>::ret StorageKind;
+  typedef typename promote_index_type<typename traits<Lhs>::Index,
+                                         typename traits<Rhs>::Index>::type Index;
+  enum {
+    RowsAtCompileTime = traits<Lhs>::RowsAtCompileTime,
+    ColsAtCompileTime = traits<Rhs>::ColsAtCompileTime,
+    MaxRowsAtCompileTime = traits<Lhs>::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = traits<Rhs>::MaxColsAtCompileTime,
+    Flags = (MaxRowsAtCompileTime==1 ? RowMajorBit : 0)
+          | EvalBeforeNestingBit | EvalBeforeAssigningBit | NestByRefBit,
+                  // Note that EvalBeforeNestingBit and NestByRefBit
+                  // are not used in practice because nested is overloaded for products
+    CoeffReadCost = 0 // FIXME why is it needed ?
+  };
+};
+}
+
+#define EIGEN_PRODUCT_PUBLIC_INTERFACE(Derived) \
+  typedef ProductBase<Derived, Lhs, Rhs > Base; \
+  EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \
+  typedef typename Base::LhsNested LhsNested; \
+  typedef typename Base::_LhsNested _LhsNested; \
+  typedef typename Base::LhsBlasTraits LhsBlasTraits; \
+  typedef typename Base::ActualLhsType ActualLhsType; \
+  typedef typename Base::_ActualLhsType _ActualLhsType; \
+  typedef typename Base::RhsNested RhsNested; \
+  typedef typename Base::_RhsNested _RhsNested; \
+  typedef typename Base::RhsBlasTraits RhsBlasTraits; \
+  typedef typename Base::ActualRhsType ActualRhsType; \
+  typedef typename Base::_ActualRhsType _ActualRhsType; \
+  using Base::m_lhs; \
+  using Base::m_rhs;
+
+template<typename Derived, typename Lhs, typename Rhs>
+class ProductBase : public MatrixBase<Derived>
+{
+  public:
+    typedef MatrixBase<Derived> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(ProductBase)
+    
+    typedef typename Lhs::Nested LhsNested;
+    typedef typename internal::remove_all<LhsNested>::type _LhsNested;
+    typedef internal::blas_traits<_LhsNested> LhsBlasTraits;
+    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhsType;
+    typedef typename internal::remove_all<ActualLhsType>::type _ActualLhsType;
+    typedef typename internal::traits<Lhs>::Scalar LhsScalar;
+
+    typedef typename Rhs::Nested RhsNested;
+    typedef typename internal::remove_all<RhsNested>::type _RhsNested;
+    typedef internal::blas_traits<_RhsNested> RhsBlasTraits;
+    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhsType;
+    typedef typename internal::remove_all<ActualRhsType>::type _ActualRhsType;
+    typedef typename internal::traits<Rhs>::Scalar RhsScalar;
+
+    // Diagonal of a product: no need to evaluate the arguments because they are going to be evaluated only once
+    typedef CoeffBasedProduct<LhsNested, RhsNested, 0> FullyLazyCoeffBaseProductType;
+
+  public:
+
+    typedef typename Base::PlainObject PlainObject;
+
+    ProductBase(const Lhs& a_lhs, const Rhs& a_rhs)
+      : m_lhs(a_lhs), m_rhs(a_rhs)
+    {
+      eigen_assert(a_lhs.cols() == a_rhs.rows()
+        && "invalid matrix product"
+        && "if you wanted a coeff-wise or a dot product use the respective explicit functions");
+    }
+
+    inline Index rows() const { return m_lhs.rows(); }
+    inline Index cols() const { return m_rhs.cols(); }
+
+    template<typename Dest>
+    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst,Scalar(1)); }
+
+    template<typename Dest>
+    inline void addTo(Dest& dst) const { scaleAndAddTo(dst,Scalar(1)); }
+
+    template<typename Dest>
+    inline void subTo(Dest& dst) const { scaleAndAddTo(dst,Scalar(-1)); }
+
+    template<typename Dest>
+    inline void scaleAndAddTo(Dest& dst, const Scalar& alpha) const { derived().scaleAndAddTo(dst,alpha); }
+
+    const _LhsNested& lhs() const { return m_lhs; }
+    const _RhsNested& rhs() const { return m_rhs; }
+
+    // Implicit conversion to the nested type (trigger the evaluation of the product)
+    operator const PlainObject& () const
+    {
+      m_result.resize(m_lhs.rows(), m_rhs.cols());
+      derived().evalTo(m_result);
+      return m_result;
+    }
+
+    const Diagonal<const FullyLazyCoeffBaseProductType,0> diagonal() const
+    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs); }
+
+    template<int Index>
+    const Diagonal<FullyLazyCoeffBaseProductType,Index> diagonal() const
+    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs); }
+
+    const Diagonal<FullyLazyCoeffBaseProductType,Dynamic> diagonal(Index index) const
+    { return FullyLazyCoeffBaseProductType(m_lhs, m_rhs).diagonal(index); }
+
+    // restrict coeff accessors to 1x1 expressions. No need to care about mutators here since this isnt a Lvalue expression
+    typename Base::CoeffReturnType coeff(Index row, Index col) const
+    {
+#ifdef EIGEN2_SUPPORT
+      return lhs().row(row).cwiseProduct(rhs().col(col).transpose()).sum();
+#else
+      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
+      eigen_assert(this->rows() == 1 && this->cols() == 1);
+      Matrix<Scalar,1,1> result = *this;
+      return result.coeff(row,col);
+#endif
+    }
+
+    typename Base::CoeffReturnType coeff(Index i) const
+    {
+      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
+      eigen_assert(this->rows() == 1 && this->cols() == 1);
+      Matrix<Scalar,1,1> result = *this;
+      return result.coeff(i);
+    }
+
+    const Scalar& coeffRef(Index row, Index col) const
+    {
+      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
+      eigen_assert(this->rows() == 1 && this->cols() == 1);
+      return derived().coeffRef(row,col);
+    }
+
+    const Scalar& coeffRef(Index i) const
+    {
+      EIGEN_STATIC_ASSERT_SIZE_1x1(Derived)
+      eigen_assert(this->rows() == 1 && this->cols() == 1);
+      return derived().coeffRef(i);
+    }
+
+  protected:
+
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+
+    mutable PlainObject m_result;
+};
+
+// here we need to overload the nested rule for products
+// such that the nested type is a const reference to a plain matrix
+namespace internal {
+template<typename Lhs, typename Rhs, int Mode, int N, typename PlainObject>
+struct nested<GeneralProduct<Lhs,Rhs,Mode>, N, PlainObject>
+{
+  typedef PlainObject const& type;
+};
+}
+
+template<typename NestedProduct>
+class ScaledProduct;
+
+// Note that these two operator* functions are not defined as member
+// functions of ProductBase, because, otherwise we would have to
+// define all overloads defined in MatrixBase. Furthermore, Using
+// "using Base::operator*" would not work with MSVC.
+//
+// Also note that here we accept any compatible scalar types
+template<typename Derived,typename Lhs,typename Rhs>
+const ScaledProduct<Derived>
+operator*(const ProductBase<Derived,Lhs,Rhs>& prod, const typename Derived::Scalar& x)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+template<typename Derived,typename Lhs,typename Rhs>
+typename internal::enable_if<!internal::is_same<typename Derived::Scalar,typename Derived::RealScalar>::value,
+                      const ScaledProduct<Derived> >::type
+operator*(const ProductBase<Derived,Lhs,Rhs>& prod, const typename Derived::RealScalar& x)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+
+template<typename Derived,typename Lhs,typename Rhs>
+const ScaledProduct<Derived>
+operator*(const typename Derived::Scalar& x,const ProductBase<Derived,Lhs,Rhs>& prod)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+template<typename Derived,typename Lhs,typename Rhs>
+typename internal::enable_if<!internal::is_same<typename Derived::Scalar,typename Derived::RealScalar>::value,
+                      const ScaledProduct<Derived> >::type
+operator*(const typename Derived::RealScalar& x,const ProductBase<Derived,Lhs,Rhs>& prod)
+{ return ScaledProduct<Derived>(prod.derived(), x); }
+
+namespace internal {
+template<typename NestedProduct>
+struct traits<ScaledProduct<NestedProduct> >
+ : traits<ProductBase<ScaledProduct<NestedProduct>,
+                         typename NestedProduct::_LhsNested,
+                         typename NestedProduct::_RhsNested> >
+{
+  typedef typename traits<NestedProduct>::StorageKind StorageKind;
+};
+}
+
+template<typename NestedProduct>
+class ScaledProduct
+  : public ProductBase<ScaledProduct<NestedProduct>,
+                       typename NestedProduct::_LhsNested,
+                       typename NestedProduct::_RhsNested>
+{
+  public:
+    typedef ProductBase<ScaledProduct<NestedProduct>,
+                       typename NestedProduct::_LhsNested,
+                       typename NestedProduct::_RhsNested> Base;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::PlainObject PlainObject;
+//     EIGEN_PRODUCT_PUBLIC_INTERFACE(ScaledProduct)
+
+    ScaledProduct(const NestedProduct& prod, const Scalar& x)
+    : Base(prod.lhs(),prod.rhs()), m_prod(prod), m_alpha(x) {}
+
+    template<typename Dest>
+    inline void evalTo(Dest& dst) const { dst.setZero(); scaleAndAddTo(dst, Scalar(1)); }
+
+    template<typename Dest>
+    inline void addTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(1)); }
+
+    template<typename Dest>
+    inline void subTo(Dest& dst) const { scaleAndAddTo(dst, Scalar(-1)); }
+
+    template<typename Dest>
+    inline void scaleAndAddTo(Dest& dst, const Scalar& a_alpha) const { m_prod.derived().scaleAndAddTo(dst,a_alpha * m_alpha); }
+
+    const Scalar& alpha() const { return m_alpha; }
+    
+  protected:
+    const NestedProduct& m_prod;
+    Scalar m_alpha;
+};
+
+/** \internal
+  * Overloaded to perform an efficient C = (A*B).lazy() */
+template<typename Derived>
+template<typename ProductDerived, typename Lhs, typename Rhs>
+Derived& MatrixBase<Derived>::lazyAssign(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+{
+  other.derived().evalTo(derived());
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PRODUCTBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ProductEvaluators.h b/vendor/eigen-3.1.91/Eigen/src/Core/ProductEvaluators.h
new file mode 100644
index 0000000..8aed510
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ProductEvaluators.h
@@ -0,0 +1,411 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2011 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#ifndef EIGEN_PRODUCTEVALUATORS_H
+#define EIGEN_PRODUCTEVALUATORS_H
+
+namespace Eigen {
+  
+namespace internal {
+  
+// We can evaluate the product either all at once, like GeneralProduct and its evalTo() function, or
+// traverse the matrix coefficient by coefficient, like CoeffBasedProduct.  Use the existing logic
+// in ProductReturnType to decide.
+
+template<typename XprType, typename ProductType>
+struct product_evaluator_dispatcher;
+
+template<typename Lhs, typename Rhs>
+struct evaluator_impl<Product<Lhs, Rhs> >
+  : product_evaluator_dispatcher<Product<Lhs, Rhs>, typename ProductReturnType<Lhs, Rhs>::Type> 
+{
+  typedef Product<Lhs, Rhs> XprType;
+  typedef product_evaluator_dispatcher<XprType, typename ProductReturnType<Lhs, Rhs>::Type> Base;
+
+  evaluator_impl(const XprType& xpr) : Base(xpr) 
+  { }
+};
+
+template<typename XprType, typename ProductType>
+struct product_evaluator_traits_dispatcher;
+
+template<typename Lhs, typename Rhs>
+struct evaluator_traits<Product<Lhs, Rhs> >
+  : product_evaluator_traits_dispatcher<Product<Lhs, Rhs>, typename ProductReturnType<Lhs, Rhs>::Type> 
+{ 
+  static const int AssumeAliasing = 1;
+};
+
+// Case 1: Evaluate all at once
+//
+// We can view the GeneralProduct class as a part of the product evaluator. 
+// Four sub-cases: InnerProduct, OuterProduct, GemmProduct and GemvProduct.
+// InnerProduct is special because GeneralProduct does not have an evalTo() method in this case.
+
+template<typename Lhs, typename Rhs>
+struct product_evaluator_traits_dispatcher<Product<Lhs, Rhs>, GeneralProduct<Lhs, Rhs, InnerProduct> > 
+{
+  static const int HasEvalTo = 0;
+};
+
+template<typename Lhs, typename Rhs>
+struct product_evaluator_dispatcher<Product<Lhs, Rhs>, GeneralProduct<Lhs, Rhs, InnerProduct> > 
+  : public evaluator<typename Product<Lhs, Rhs>::PlainObject>::type
+{
+  typedef Product<Lhs, Rhs> XprType;
+  typedef typename XprType::PlainObject PlainObject;
+  typedef typename evaluator<PlainObject>::type evaluator_base;
+
+  // TODO: Computation is too early (?)
+  product_evaluator_dispatcher(const XprType& xpr) : evaluator_base(m_result)
+  {
+    m_result.coeffRef(0,0) = (xpr.lhs().transpose().cwiseProduct(xpr.rhs())).sum();
+  }
+  
+protected:  
+  PlainObject m_result;
+};
+
+// For the other three subcases, simply call the evalTo() method of GeneralProduct
+// TODO: GeneralProduct should take evaluators, not expression objects.
+
+template<typename Lhs, typename Rhs, int ProductType>
+struct product_evaluator_traits_dispatcher<Product<Lhs, Rhs>, GeneralProduct<Lhs, Rhs, ProductType> > 
+{
+  static const int HasEvalTo = 1;
+};
+
+template<typename Lhs, typename Rhs, int ProductType>
+struct product_evaluator_dispatcher<Product<Lhs, Rhs>, GeneralProduct<Lhs, Rhs, ProductType> > 
+{
+  typedef Product<Lhs, Rhs> XprType;
+  typedef typename XprType::PlainObject PlainObject;
+  typedef typename evaluator<PlainObject>::type evaluator_base;
+  
+  product_evaluator_dispatcher(const XprType& xpr) : m_xpr(xpr)
+  { }
+  
+  template<typename DstEvaluatorType, typename DstXprType>
+  void evalTo(DstEvaluatorType /* not used */, DstXprType& dst)
+  {
+    dst.resize(m_xpr.rows(), m_xpr.cols());
+    GeneralProduct<Lhs, Rhs, ProductType>(m_xpr.lhs(), m_xpr.rhs()).evalTo(dst);
+  }
+  
+protected: 
+  const XprType& m_xpr;
+};
+
+// Case 2: Evaluate coeff by coeff
+//
+// This is mostly taken from CoeffBasedProduct.h
+// The main difference is that we add an extra argument to the etor_product_*_impl::run() function
+// for the inner dimension of the product, because evaluator object do not know their size.
+
+template<int Traversal, int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl;
+
+template<int StorageOrder, int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl;
+
+template<typename Lhs, typename Rhs, typename LhsNested, typename RhsNested, int Flags>
+struct product_evaluator_traits_dispatcher<Product<Lhs, Rhs>, CoeffBasedProduct<LhsNested, RhsNested, Flags> >
+{
+  static const int HasEvalTo = 0;
+};
+
+template<typename Lhs, typename Rhs, typename LhsNested, typename RhsNested, int Flags>
+struct product_evaluator_dispatcher<Product<Lhs, Rhs>, CoeffBasedProduct<LhsNested, RhsNested, Flags> >
+  : evaluator_impl_base<Product<Lhs, Rhs> >
+{
+  typedef Product<Lhs, Rhs> XprType;
+  typedef CoeffBasedProduct<LhsNested, RhsNested, Flags> CoeffBasedProductType;
+
+  product_evaluator_dispatcher(const XprType& xpr) 
+    : m_lhsImpl(xpr.lhs()), 
+      m_rhsImpl(xpr.rhs()),  
+      m_innerDim(xpr.lhs().cols())
+  { }
+
+  typedef typename XprType::Index Index;
+  typedef typename XprType::Scalar Scalar;
+  typedef typename XprType::CoeffReturnType CoeffReturnType;
+  typedef typename XprType::PacketScalar PacketScalar;
+  typedef typename XprType::PacketReturnType PacketReturnType;
+
+  // Everything below here is taken from CoeffBasedProduct.h
+
+  enum {
+    RowsAtCompileTime = traits<CoeffBasedProductType>::RowsAtCompileTime,
+    PacketSize = packet_traits<Scalar>::size,
+    InnerSize  = traits<CoeffBasedProductType>::InnerSize,
+    CoeffReadCost = traits<CoeffBasedProductType>::CoeffReadCost,
+    Unroll = CoeffReadCost != Dynamic && CoeffReadCost <= EIGEN_UNROLLING_LIMIT,
+    CanVectorizeInner = traits<CoeffBasedProductType>::CanVectorizeInner
+  };
+
+  typedef typename evaluator<Lhs>::type LhsEtorType;
+  typedef typename evaluator<Rhs>::type RhsEtorType;
+  typedef etor_product_coeff_impl<CanVectorizeInner ? InnerVectorizedTraversal : DefaultTraversal,
+                                  Unroll ? InnerSize-1 : Dynamic,
+                                  LhsEtorType, RhsEtorType, Scalar> CoeffImpl;
+
+  const CoeffReturnType coeff(Index row, Index col) const
+  {
+    Scalar res;
+    CoeffImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res);
+    return res;
+  }
+
+  /* Allow index-based non-packet access. It is impossible though to allow index-based packed access,
+   * which is why we don't set the LinearAccessBit.
+   */
+  const CoeffReturnType coeff(Index index) const
+  {
+    Scalar res;
+    const Index row = RowsAtCompileTime == 1 ? 0 : index;
+    const Index col = RowsAtCompileTime == 1 ? index : 0;
+    CoeffImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res);
+    return res;
+  }
+
+  template<int LoadMode>
+  const PacketReturnType packet(Index row, Index col) const
+  {
+    PacketScalar res;
+    typedef etor_product_packet_impl<Flags&RowMajorBit ? RowMajor : ColMajor,
+				     Unroll ? InnerSize-1 : Dynamic,
+				     LhsEtorType, RhsEtorType, PacketScalar, LoadMode> PacketImpl;
+    PacketImpl::run(row, col, m_lhsImpl, m_rhsImpl, m_innerDim, res);
+    return res;
+  }
+
+protected:
+  typename evaluator<Lhs>::type m_lhsImpl;
+  typename evaluator<Rhs>::type m_rhsImpl;
+
+  // TODO: Get rid of m_innerDim if known at compile time
+  Index m_innerDim;
+};
+
+/***************************************************************************
+* Normal product .coeff() implementation (with meta-unrolling)
+***************************************************************************/
+
+/**************************************
+*** Scalar path  - no vectorization ***
+**************************************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl<DefaultTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, RetScalar &res)
+  {
+    etor_product_coeff_impl<DefaultTraversal, UnrollingIndex-1, Lhs, Rhs, RetScalar>::run(row, col, lhs, rhs, innerDim, res);
+    res += lhs.coeff(row, UnrollingIndex) * rhs.coeff(UnrollingIndex, col);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl<DefaultTraversal, 0, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, RetScalar &res)
+  {
+    res = lhs.coeff(row, 0) * rhs.coeff(0, col);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl<DefaultTraversal, Dynamic, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, RetScalar& res)
+  {
+    eigen_assert(innerDim>0 && "you are using a non initialized matrix");
+    res = lhs.coeff(row, 0) * rhs.coeff(0, col);
+    for(Index i = 1; i < innerDim; ++i)
+      res += lhs.coeff(row, i) * rhs.coeff(i, col);
+  }
+};
+
+/*******************************************
+*** Scalar path with inner vectorization ***
+*******************************************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet>
+struct etor_product_coeff_vectorized_unroller
+{
+  typedef typename Lhs::Index Index;
+  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, typename Lhs::PacketScalar &pres)
+  {
+    etor_product_coeff_vectorized_unroller<UnrollingIndex-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, innerDim, pres);
+    pres = padd(pres, pmul( lhs.template packet<Aligned>(row, UnrollingIndex) , rhs.template packet<Aligned>(UnrollingIndex, col) ));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet>
+struct etor_product_coeff_vectorized_unroller<0, Lhs, Rhs, Packet>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, typename Lhs::PacketScalar &pres)
+  {
+    pres = pmul(lhs.template packet<Aligned>(row, 0) , rhs.template packet<Aligned>(0, col));
+  }
+};
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl<InnerVectorizedTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::PacketScalar Packet;
+  typedef typename Lhs::Index Index;
+  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, RetScalar &res)
+  {
+    Packet pres;
+    etor_product_coeff_vectorized_unroller<UnrollingIndex+1-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, innerDim, pres);
+    etor_product_coeff_impl<DefaultTraversal,UnrollingIndex,Lhs,Rhs,RetScalar>::run(row, col, lhs, rhs, innerDim, res);
+    res = predux(pres);
+  }
+};
+
+template<typename Lhs, typename Rhs, int LhsRows = Lhs::RowsAtCompileTime, int RhsCols = Rhs::ColsAtCompileTime>
+struct etor_product_coeff_vectorized_dyn_selector
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, typename Lhs::Scalar &res)
+  {
+    res = lhs.row(row).transpose().cwiseProduct(rhs.col(col)).sum();
+  }
+};
+
+// NOTE the 3 following specializations are because taking .col(0) on a vector is a bit slower
+// NOTE maybe they are now useless since we have a specialization for Block<Matrix>
+template<typename Lhs, typename Rhs, int RhsCols>
+struct etor_product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,RhsCols>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, typename Lhs::Scalar &res)
+  {
+    res = lhs.transpose().cwiseProduct(rhs.col(col)).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs, int LhsRows>
+struct etor_product_coeff_vectorized_dyn_selector<Lhs,Rhs,LhsRows,1>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index /*col*/, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, typename Lhs::Scalar &res)
+  {
+    res = lhs.row(row).transpose().cwiseProduct(rhs).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs>
+struct etor_product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,1>
+{
+  typedef typename Lhs::Index Index;
+  EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, typename Lhs::Scalar &res)
+  {
+    res = lhs.transpose().cwiseProduct(rhs).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct etor_product_coeff_impl<InnerVectorizedTraversal, Dynamic, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, typename Lhs::Scalar &res)
+  {
+    etor_product_coeff_vectorized_dyn_selector<Lhs,Rhs>::run(row, col, lhs, rhs, innerDim, res);
+  }
+};
+
+/*******************
+*** Packet path  ***
+*******************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res)
+  {
+    etor_product_packet_impl<RowMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, innerDim, res);
+    res =  pmadd(pset1<Packet>(lhs.coeff(row, UnrollingIndex)), rhs.template packet<LoadMode>(UnrollingIndex, col), res);
+  }
+};
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet &res)
+  {
+    etor_product_packet_impl<ColMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, innerDim, res);
+    res =  pmadd(lhs.template packet<LoadMode>(row, UnrollingIndex), pset1<Packet>(rhs.coeff(UnrollingIndex, col)), res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, 0, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res)
+  {
+    res = pmul(pset1<Packet>(lhs.coeff(row, 0)),rhs.template packet<LoadMode>(0, col));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, 0, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index /*innerDim*/, Packet &res)
+  {
+    res = pmul(lhs.template packet<LoadMode>(row, 0), pset1<Packet>(rhs.coeff(0, col)));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<RowMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res)
+  {
+    eigen_assert(innerDim>0 && "you are using a non initialized matrix");
+    res = pmul(pset1<Packet>(lhs.coeff(row, 0)),rhs.template packet<LoadMode>(0, col));
+    for(Index i = 1; i < innerDim; ++i)
+      res =  pmadd(pset1<Packet>(lhs.coeff(row, i)), rhs.template packet<LoadMode>(i, col), res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct etor_product_packet_impl<ColMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Index innerDim, Packet& res)
+  {
+    eigen_assert(innerDim>0 && "you are using a non initialized matrix");
+    res = pmul(lhs.template packet<LoadMode>(row, 0), pset1<Packet>(rhs.coeff(0, col)));
+    for(Index i = 1; i < innerDim; ++i)
+      res =  pmadd(lhs.template packet<LoadMode>(row, i), pset1<Packet>(rhs.coeff(i, col)), res);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PRODUCT_EVALUATORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Random.h b/vendor/eigen-3.1.91/Eigen/src/Core/Random.h
new file mode 100644
index 0000000..480fea4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Random.h
@@ -0,0 +1,152 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_RANDOM_H
+#define EIGEN_RANDOM_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Scalar> struct scalar_random_op {
+  EIGEN_EMPTY_STRUCT_CTOR(scalar_random_op)
+  template<typename Index>
+  inline const Scalar operator() (Index, Index = 0) const { return random<Scalar>(); }
+};
+
+template<typename Scalar>
+struct functor_traits<scalar_random_op<Scalar> >
+{ enum { Cost = 5 * NumTraits<Scalar>::MulCost, PacketAccess = false, IsRepeatable = false }; };
+
+} // end namespace internal
+
+/** \returns a random matrix expression
+  *
+  * The parameters \a rows and \a cols are the number of rows and of columns of
+  * the returned matrix. Must be compatible with this MatrixBase type.
+  *
+  * This variant is meant to be used for dynamic-size matrix types. For fixed-size types,
+  * it is redundant to pass \a rows and \a cols as arguments, so Random() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_random_int_int.cpp
+  * Output: \verbinclude MatrixBase_random_int_int.out
+  *
+  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
+  * behavior with expressions involving random matrices.
+  *
+  * \sa MatrixBase::setRandom(), MatrixBase::Random(Index), MatrixBase::Random()
+  */
+template<typename Derived>
+inline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>
+DenseBase<Derived>::Random(Index rows, Index cols)
+{
+  return NullaryExpr(rows, cols, internal::scalar_random_op<Scalar>());
+}
+
+/** \returns a random vector expression
+  *
+  * The parameter \a size is the size of the returned vector.
+  * Must be compatible with this MatrixBase type.
+  *
+  * \only_for_vectors
+  *
+  * This variant is meant to be used for dynamic-size vector types. For fixed-size types,
+  * it is redundant to pass \a size as argument, so Random() should be used
+  * instead.
+  *
+  * Example: \include MatrixBase_random_int.cpp
+  * Output: \verbinclude MatrixBase_random_int.out
+  *
+  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+  * a temporary vector whenever it is nested in a larger expression. This prevents unexpected
+  * behavior with expressions involving random matrices.
+  *
+  * \sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random()
+  */
+template<typename Derived>
+inline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>
+DenseBase<Derived>::Random(Index size)
+{
+  return NullaryExpr(size, internal::scalar_random_op<Scalar>());
+}
+
+/** \returns a fixed-size random matrix or vector expression
+  *
+  * This variant is only for fixed-size MatrixBase types. For dynamic-size types, you
+  * need to use the variants taking size arguments.
+  *
+  * Example: \include MatrixBase_random.cpp
+  * Output: \verbinclude MatrixBase_random.out
+  *
+  * This expression has the "evaluate before nesting" flag so that it will be evaluated into
+  * a temporary matrix whenever it is nested in a larger expression. This prevents unexpected
+  * behavior with expressions involving random matrices.
+  *
+  * \sa MatrixBase::setRandom(), MatrixBase::Random(Index,Index), MatrixBase::Random(Index)
+  */
+template<typename Derived>
+inline const CwiseNullaryOp<internal::scalar_random_op<typename internal::traits<Derived>::Scalar>, Derived>
+DenseBase<Derived>::Random()
+{
+  return NullaryExpr(RowsAtCompileTime, ColsAtCompileTime, internal::scalar_random_op<Scalar>());
+}
+
+/** Sets all coefficients in this expression to random values.
+  *
+  * Example: \include MatrixBase_setRandom.cpp
+  * Output: \verbinclude MatrixBase_setRandom.out
+  *
+  * \sa class CwiseNullaryOp, setRandom(Index), setRandom(Index,Index)
+  */
+template<typename Derived>
+inline Derived& DenseBase<Derived>::setRandom()
+{
+  return *this = Random(rows(), cols());
+}
+
+/** Resizes to the given \a newSize, and sets all coefficients in this expression to random values.
+  *
+  * \only_for_vectors
+  *
+  * Example: \include Matrix_setRandom_int.cpp
+  * Output: \verbinclude Matrix_setRandom_int.out
+  *
+  * \sa MatrixBase::setRandom(), setRandom(Index,Index), class CwiseNullaryOp, MatrixBase::Random()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setRandom(Index newSize)
+{
+  resize(newSize);
+  return setRandom();
+}
+
+/** Resizes to the given size, and sets all coefficients in this expression to random values.
+  *
+  * \param nbRows the new number of rows
+  * \param nbCols the new number of columns
+  *
+  * Example: \include Matrix_setRandom_int_int.cpp
+  * Output: \verbinclude Matrix_setRandom_int_int.out
+  *
+  * \sa MatrixBase::setRandom(), setRandom(Index), class CwiseNullaryOp, MatrixBase::Random()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+PlainObjectBase<Derived>::setRandom(Index nbRows, Index nbCols)
+{
+  resize(nbRows, nbCols);
+  return setRandom();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_RANDOM_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Redux.h b/vendor/eigen-3.1.91/Eigen/src/Core/Redux.h
new file mode 100644
index 0000000..50548fa
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Redux.h
@@ -0,0 +1,408 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REDUX_H
+#define EIGEN_REDUX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// TODO
+//  * implement other kind of vectorization
+//  * factorize code
+
+/***************************************************************************
+* Part 1 : the logic deciding a strategy for vectorization and unrolling
+***************************************************************************/
+
+template<typename Func, typename Derived>
+struct redux_traits
+{
+public:
+  enum {
+    PacketSize = packet_traits<typename Derived::Scalar>::size,
+    InnerMaxSize = int(Derived::IsRowMajor)
+                 ? Derived::MaxColsAtCompileTime
+                 : Derived::MaxRowsAtCompileTime
+  };
+
+  enum {
+    MightVectorize = (int(Derived::Flags)&ActualPacketAccessBit)
+                  && (functor_traits<Func>::PacketAccess),
+    MayLinearVectorize = MightVectorize && (int(Derived::Flags)&LinearAccessBit),
+    MaySliceVectorize  = MightVectorize && int(InnerMaxSize)>=3*PacketSize
+  };
+
+public:
+  enum {
+    Traversal = int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
+              : int(MaySliceVectorize)  ? int(SliceVectorizedTraversal)
+                                        : int(DefaultTraversal)
+  };
+
+public:
+  enum {
+    Cost = (  Derived::SizeAtCompileTime == Dynamic
+           || Derived::CoeffReadCost == Dynamic
+           || (Derived::SizeAtCompileTime!=1 && functor_traits<Func>::Cost == Dynamic)
+           ) ? Dynamic
+           : Derived::SizeAtCompileTime * Derived::CoeffReadCost
+               + (Derived::SizeAtCompileTime-1) * functor_traits<Func>::Cost,
+    UnrollingLimit = EIGEN_UNROLLING_LIMIT * (int(Traversal) == int(DefaultTraversal) ? 1 : int(PacketSize))
+  };
+
+public:
+  enum {
+    Unrolling = Cost != Dynamic && Cost <= UnrollingLimit
+              ? CompleteUnrolling
+              : NoUnrolling
+  };
+};
+
+/***************************************************************************
+* Part 2 : unrollers
+***************************************************************************/
+
+/*** no vectorization ***/
+
+template<typename Func, typename Derived, int Start, int Length>
+struct redux_novec_unroller
+{
+  enum {
+    HalfLength = Length/2
+  };
+
+  typedef typename Derived::Scalar Scalar;
+
+  static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func& func)
+  {
+    return func(redux_novec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
+                redux_novec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func));
+  }
+};
+
+template<typename Func, typename Derived, int Start>
+struct redux_novec_unroller<Func, Derived, Start, 1>
+{
+  enum {
+    outer = Start / Derived::InnerSizeAtCompileTime,
+    inner = Start % Derived::InnerSizeAtCompileTime
+  };
+
+  typedef typename Derived::Scalar Scalar;
+
+  static EIGEN_STRONG_INLINE Scalar run(const Derived &mat, const Func&)
+  {
+    return mat.coeffByOuterInner(outer, inner);
+  }
+};
+
+// This is actually dead code and will never be called. It is required
+// to prevent false warnings regarding failed inlining though
+// for 0 length run() will never be called at all.
+template<typename Func, typename Derived, int Start>
+struct redux_novec_unroller<Func, Derived, Start, 0>
+{
+  typedef typename Derived::Scalar Scalar;
+  static EIGEN_STRONG_INLINE Scalar run(const Derived&, const Func&) { return Scalar(); }
+};
+
+/*** vectorization ***/
+
+template<typename Func, typename Derived, int Start, int Length>
+struct redux_vec_unroller
+{
+  enum {
+    PacketSize = packet_traits<typename Derived::Scalar>::size,
+    HalfLength = Length/2
+  };
+
+  typedef typename Derived::Scalar Scalar;
+  typedef typename packet_traits<Scalar>::type PacketScalar;
+
+  static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func& func)
+  {
+    return func.packetOp(
+            redux_vec_unroller<Func, Derived, Start, HalfLength>::run(mat,func),
+            redux_vec_unroller<Func, Derived, Start+HalfLength, Length-HalfLength>::run(mat,func) );
+  }
+};
+
+template<typename Func, typename Derived, int Start>
+struct redux_vec_unroller<Func, Derived, Start, 1>
+{
+  enum {
+    index = Start * packet_traits<typename Derived::Scalar>::size,
+    outer = index / int(Derived::InnerSizeAtCompileTime),
+    inner = index % int(Derived::InnerSizeAtCompileTime),
+    alignment = (Derived::Flags & AlignedBit) ? Aligned : Unaligned
+  };
+
+  typedef typename Derived::Scalar Scalar;
+  typedef typename packet_traits<Scalar>::type PacketScalar;
+
+  static EIGEN_STRONG_INLINE PacketScalar run(const Derived &mat, const Func&)
+  {
+    return mat.template packetByOuterInner<alignment>(outer, inner);
+  }
+};
+
+/***************************************************************************
+* Part 3 : implementation of all cases
+***************************************************************************/
+
+template<typename Func, typename Derived,
+         int Traversal = redux_traits<Func, Derived>::Traversal,
+         int Unrolling = redux_traits<Func, Derived>::Unrolling
+>
+struct redux_impl;
+
+template<typename Func, typename Derived>
+struct redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>
+{
+  typedef typename Derived::Scalar Scalar;
+  typedef typename Derived::Index Index;
+  static EIGEN_STRONG_INLINE Scalar run(const Derived& mat, const Func& func)
+  {
+    eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
+    Scalar res;
+    res = mat.coeffByOuterInner(0, 0);
+    for(Index i = 1; i < mat.innerSize(); ++i)
+      res = func(res, mat.coeffByOuterInner(0, i));
+    for(Index i = 1; i < mat.outerSize(); ++i)
+      for(Index j = 0; j < mat.innerSize(); ++j)
+        res = func(res, mat.coeffByOuterInner(i, j));
+    return res;
+  }
+};
+
+template<typename Func, typename Derived>
+struct redux_impl<Func,Derived, DefaultTraversal, CompleteUnrolling>
+  : public redux_novec_unroller<Func,Derived, 0, Derived::SizeAtCompileTime>
+{};
+
+template<typename Func, typename Derived>
+struct redux_impl<Func, Derived, LinearVectorizedTraversal, NoUnrolling>
+{
+  typedef typename Derived::Scalar Scalar;
+  typedef typename packet_traits<Scalar>::type PacketScalar;
+  typedef typename Derived::Index Index;
+
+  static Scalar run(const Derived& mat, const Func& func)
+  {
+    const Index size = mat.size();
+    eigen_assert(size && "you are using an empty matrix");
+    const Index packetSize = packet_traits<Scalar>::size;
+    const Index alignedStart = internal::first_aligned(mat);
+    enum {
+      alignment = bool(Derived::Flags & DirectAccessBit) || bool(Derived::Flags & AlignedBit)
+                ? Aligned : Unaligned
+    };
+    const Index alignedSize2 = ((size-alignedStart)/(2*packetSize))*(2*packetSize);
+    const Index alignedSize = ((size-alignedStart)/(packetSize))*(packetSize);
+    const Index alignedEnd2 = alignedStart + alignedSize2;
+    const Index alignedEnd  = alignedStart + alignedSize;
+    Scalar res;
+    if(alignedSize)
+    {
+      PacketScalar packet_res0 = mat.template packet<alignment>(alignedStart);
+      if(alignedSize>packetSize) // we have at least two packets to partly unroll the loop
+      {
+        PacketScalar packet_res1 = mat.template packet<alignment>(alignedStart+packetSize);
+        for(Index index = alignedStart + 2*packetSize; index < alignedEnd2; index += 2*packetSize)
+        {
+          packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment>(index));
+          packet_res1 = func.packetOp(packet_res1, mat.template packet<alignment>(index+packetSize));
+        }
+
+        packet_res0 = func.packetOp(packet_res0,packet_res1);
+        if(alignedEnd>alignedEnd2)
+          packet_res0 = func.packetOp(packet_res0, mat.template packet<alignment>(alignedEnd2));
+      }
+      res = func.predux(packet_res0);
+
+      for(Index index = 0; index < alignedStart; ++index)
+        res = func(res,mat.coeff(index));
+
+      for(Index index = alignedEnd; index < size; ++index)
+        res = func(res,mat.coeff(index));
+    }
+    else // too small to vectorize anything.
+         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
+    {
+      res = mat.coeff(0);
+      for(Index index = 1; index < size; ++index)
+        res = func(res,mat.coeff(index));
+    }
+
+    return res;
+  }
+};
+
+template<typename Func, typename Derived>
+struct redux_impl<Func, Derived, SliceVectorizedTraversal, NoUnrolling>
+{
+  typedef typename Derived::Scalar Scalar;
+  typedef typename packet_traits<Scalar>::type PacketScalar;
+  typedef typename Derived::Index Index;
+
+  static Scalar run(const Derived& mat, const Func& func)
+  {
+    eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
+    const Index innerSize = mat.innerSize();
+    const Index outerSize = mat.outerSize();
+    enum {
+      packetSize = packet_traits<Scalar>::size
+    };
+    const Index packetedInnerSize = ((innerSize)/packetSize)*packetSize;
+    Scalar res;
+    if(packetedInnerSize)
+    {
+      PacketScalar packet_res = mat.template packet<Unaligned>(0,0);
+      for(Index j=0; j<outerSize; ++j)
+        for(Index i=(j==0?packetSize:0); i<packetedInnerSize; i+=Index(packetSize))
+          packet_res = func.packetOp(packet_res, mat.template packetByOuterInner<Unaligned>(j,i));
+
+      res = func.predux(packet_res);
+      for(Index j=0; j<outerSize; ++j)
+        for(Index i=packetedInnerSize; i<innerSize; ++i)
+          res = func(res, mat.coeffByOuterInner(j,i));
+    }
+    else // too small to vectorize anything.
+         // since this is dynamic-size hence inefficient anyway for such small sizes, don't try to optimize.
+    {
+      res = redux_impl<Func, Derived, DefaultTraversal, NoUnrolling>::run(mat, func);
+    }
+
+    return res;
+  }
+};
+
+template<typename Func, typename Derived>
+struct redux_impl<Func, Derived, LinearVectorizedTraversal, CompleteUnrolling>
+{
+  typedef typename Derived::Scalar Scalar;
+  typedef typename packet_traits<Scalar>::type PacketScalar;
+  enum {
+    PacketSize = packet_traits<Scalar>::size,
+    Size = Derived::SizeAtCompileTime,
+    VectorizedSize = (Size / PacketSize) * PacketSize
+  };
+  static EIGEN_STRONG_INLINE Scalar run(const Derived& mat, const Func& func)
+  {
+    eigen_assert(mat.rows()>0 && mat.cols()>0 && "you are using an empty matrix");
+    Scalar res = func.predux(redux_vec_unroller<Func, Derived, 0, Size / PacketSize>::run(mat,func));
+    if (VectorizedSize != Size)
+      res = func(res,redux_novec_unroller<Func, Derived, VectorizedSize, Size-VectorizedSize>::run(mat,func));
+    return res;
+  }
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* Part 4 : public API
+***************************************************************************/
+
+
+/** \returns the result of a full redux operation on the whole matrix or vector using \a func
+  *
+  * The template parameter \a BinaryOp is the type of the functor \a func which must be
+  * an associative operator. Both current STL and TR1 functor styles are handled.
+  *
+  * \sa DenseBase::sum(), DenseBase::minCoeff(), DenseBase::maxCoeff(), MatrixBase::colwise(), MatrixBase::rowwise()
+  */
+template<typename Derived>
+template<typename Func>
+EIGEN_STRONG_INLINE typename internal::result_of<Func(typename internal::traits<Derived>::Scalar)>::type
+DenseBase<Derived>::redux(const Func& func) const
+{
+  typedef typename internal::remove_all<typename Derived::Nested>::type ThisNested;
+  return internal::redux_impl<Func, ThisNested>
+            ::run(derived(), func);
+}
+
+/** \returns the minimum of all coefficients of \c *this.
+  * \warning the result is undefined if \c *this contains NaN.
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::minCoeff() const
+{
+  return this->redux(Eigen::internal::scalar_min_op<Scalar>());
+}
+
+/** \returns the maximum of all coefficients of \c *this.
+  * \warning the result is undefined if \c *this contains NaN.
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::maxCoeff() const
+{
+  return this->redux(Eigen::internal::scalar_max_op<Scalar>());
+}
+
+/** \returns the sum of all coefficients of *this
+  *
+  * \sa trace(), prod(), mean()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::sum() const
+{
+  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
+    return Scalar(0);
+  return this->redux(Eigen::internal::scalar_sum_op<Scalar>());
+}
+
+/** \returns the mean of all coefficients of *this
+*
+* \sa trace(), prod(), sum()
+*/
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::mean() const
+{
+  return Scalar(this->redux(Eigen::internal::scalar_sum_op<Scalar>())) / Scalar(this->size());
+}
+
+/** \returns the product of all coefficients of *this
+  *
+  * Example: \include MatrixBase_prod.cpp
+  * Output: \verbinclude MatrixBase_prod.out
+  *
+  * \sa sum(), mean(), trace()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::prod() const
+{
+  if(SizeAtCompileTime==0 || (SizeAtCompileTime==Dynamic && size()==0))
+    return Scalar(1);
+  return this->redux(Eigen::internal::scalar_product_op<Scalar>());
+}
+
+/** \returns the trace of \c *this, i.e. the sum of the coefficients on the main diagonal.
+  *
+  * \c *this can be any matrix, not necessarily square.
+  *
+  * \sa diagonal(), sum()
+  */
+template<typename Derived>
+EIGEN_STRONG_INLINE typename internal::traits<Derived>::Scalar
+MatrixBase<Derived>::trace() const
+{
+  return derived().diagonal().sum();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_REDUX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Ref.h b/vendor/eigen-3.1.91/Eigen/src/Core/Ref.h
new file mode 100644
index 0000000..aba795b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Ref.h
@@ -0,0 +1,255 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REF_H
+#define EIGEN_REF_H
+
+namespace Eigen { 
+
+template<typename Derived> class RefBase;
+template<typename PlainObjectType, int Options = 0,
+         typename StrideType = typename internal::conditional<PlainObjectType::IsVectorAtCompileTime,InnerStride<1>,OuterStride<> >::type > class Ref;
+
+/** \class Ref
+  * \ingroup Core_Module
+  *
+  * \brief A matrix or vector expression mapping an existing expressions
+  *
+  * \tparam PlainObjectType the equivalent matrix type of the mapped data
+  * \tparam Options specifies whether the pointer is \c #Aligned, or \c #Unaligned.
+  *                The default is \c #Unaligned.
+  * \tparam StrideType optionally specifies strides. By default, Ref implies a contiguous storage along the inner dimension (inner stride==1),
+  *                   but accept a variable outer stride (leading dimension).
+  *                   This can be overridden by specifying strides.
+  *                   The type passed here must be a specialization of the Stride template, see examples below.
+  *
+  * This class permits to write non template functions taking Eigen's object as parameters while limiting the number of copies.
+  * A Ref<> object can represent either a const expression or a l-value:
+  * \code
+  * // in-out argument:
+  * void foo1(Ref<VectorXf> x);
+  *
+  * // read-only const argument:
+  * void foo2(const Ref<const VectorXf>& x);
+  * \endcode
+  *
+  * In the in-out case, the input argument must satisfies the constraints of the actual Ref<> type, otherwise a compilation issue will be triggered.
+  * By default, a Ref<VectorXf> can reference any dense vector expression of float having a contiguous memory layout.
+  * Likewise, a Ref<MatrixXf> can reference any column major dense matrix expression of float whose column's elements are contiguously stored with
+  * the possibility to have a constant space inbetween each column, i.e.: the inner stride mmust be equal to 1, but the outer-stride (or leading dimension),
+  * can be greater than the number of rows.
+  *
+  * In the const case, if the input expression does not match the above requirement, then it is evaluated into a temporary before being passed to the function.
+  * Here are some examples:
+  * \code
+  * MatrixXf A;
+  * VectorXf a;
+  * foo1(a.head());             // OK
+  * foo1(A.col());              // OK
+  * foo1(A.row());              // compilation error because here innerstride!=1
+  * foo2(A.row());              // The row is copied into a contiguous temporary
+  * foo2(2*a);                  // The expression is evaluated into a temporary
+  * foo2(A.col().segment(2,4)); // No temporary
+  * \endcode
+  *
+  * The range of inputs that can be referenced without temporary can be enlarged using the last two template parameter.
+  * Here is an example accepting an innerstride!=1:
+  * \code
+  * // in-out argument:
+  * void foo3(Ref<VectorXf,0,InnerStride<> > x);
+  * foo3(A.row());              // OK
+  * \endcode
+  * The downside here is that the function foo3 might be significantly slower than foo1 because it won't be able to exploit vectorization, and will involved more
+  * expensive address computations even if the input is contiguously stored in memory. To overcome this issue, one might propose to overloads internally calling a
+  * template function, e.g.:
+  * \code
+  * // in the .h:
+  * void foo(const Ref<MatrixXf>& A);
+  * void foo(const Ref<MatrixXf,0,Stride<> >& A);
+  *
+  * // in the .cpp:
+  * template<typename TypeOfA> void foo_impl(const TypeOfA& A) {
+  *     ... // crazy code goes here
+  * }
+  * void foo(const Ref<MatrixXf>& A) { foo_impl(A); }
+  * void foo(const Ref<MatrixXf,0,Stride<> >& A) { foo_impl(A); }
+  * \endcode
+  *
+  *
+  * \sa PlainObjectBase::Map(), \ref TopicStorageOrders
+  */
+
+namespace internal {
+
+template<typename _PlainObjectType, int _Options, typename _StrideType>
+struct traits<Ref<_PlainObjectType, _Options, _StrideType> >
+  : public traits<Map<_PlainObjectType, _Options, _StrideType> >
+{
+  typedef _PlainObjectType PlainObjectType;
+  typedef _StrideType StrideType;
+  enum {
+    Options = _Options
+  };
+
+  template<typename Derived> struct match {
+    enum {
+      HasDirectAccess = internal::has_direct_access<Derived>::ret,
+      StorageOrderMatch = PlainObjectType::IsVectorAtCompileTime || ((PlainObjectType::Flags&RowMajorBit)==(Derived::Flags&RowMajorBit)),
+      InnerStrideMatch = int(StrideType::InnerStrideAtCompileTime)==int(Dynamic)
+                      || int(StrideType::InnerStrideAtCompileTime)==int(Derived::InnerStrideAtCompileTime)
+                      || (int(StrideType::InnerStrideAtCompileTime)==0 && int(Derived::InnerStrideAtCompileTime)==1),
+      OuterStrideMatch = Derived::IsVectorAtCompileTime
+                      || int(StrideType::OuterStrideAtCompileTime)==int(Dynamic) || int(StrideType::OuterStrideAtCompileTime)==int(Derived::OuterStrideAtCompileTime),
+      AlignmentMatch = (_Options!=Aligned) || ((PlainObjectType::Flags&AlignedBit)==0) || ((traits<Derived>::Flags&AlignedBit)==AlignedBit),
+      MatchAtCompileTime = HasDirectAccess && StorageOrderMatch && InnerStrideMatch && OuterStrideMatch && AlignmentMatch
+    };
+    typedef typename internal::conditional<MatchAtCompileTime,internal::true_type,internal::false_type>::type type;
+  };
+
+};
+
+template<typename Derived>
+struct traits<RefBase<Derived> > : public traits<Derived> {};
+
+}
+
+template<typename Derived> class RefBase
+ : public MapBase<Derived>
+{
+  typedef typename internal::traits<Derived>::PlainObjectType PlainObjectType;
+  typedef typename internal::traits<Derived>::StrideType StrideType;
+
+public:
+
+  typedef MapBase<Derived> Base;
+  EIGEN_DENSE_PUBLIC_INTERFACE(RefBase)
+
+  inline Index innerStride() const
+  {
+    return StrideType::InnerStrideAtCompileTime != 0 ? m_stride.inner() : 1;
+  }
+
+  inline Index outerStride() const
+  {
+    return StrideType::OuterStrideAtCompileTime != 0 ? m_stride.outer()
+         : IsVectorAtCompileTime ? this->size()
+         : int(Flags)&RowMajorBit ? this->cols()
+         : this->rows();
+  }
+
+  RefBase()
+    : Base(0,RowsAtCompileTime==Dynamic?0:RowsAtCompileTime,ColsAtCompileTime==Dynamic?0:ColsAtCompileTime),
+      // Stride<> does not allow default ctor for Dynamic strides, so let' initialize it with dummy values:
+      m_stride(StrideType::OuterStrideAtCompileTime==Dynamic?0:StrideType::OuterStrideAtCompileTime,
+               StrideType::InnerStrideAtCompileTime==Dynamic?0:StrideType::InnerStrideAtCompileTime)
+  {}
+  
+  EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)
+
+protected:
+
+  typedef Stride<StrideType::OuterStrideAtCompileTime,StrideType::InnerStrideAtCompileTime> StrideBase;
+
+  template<typename Expression>
+  void construct(Expression& expr)
+  {
+    if(PlainObjectType::RowsAtCompileTime==1)
+    {
+      eigen_assert(expr.rows()==1 || expr.cols()==1);
+      ::new (static_cast<Base*>(this)) Base(expr.data(), 1, expr.size());
+    }
+    else if(PlainObjectType::ColsAtCompileTime==1)
+    {
+      eigen_assert(expr.rows()==1 || expr.cols()==1);
+      ::new (static_cast<Base*>(this)) Base(expr.data(), expr.size(), 1);
+    }
+    else
+      ::new (static_cast<Base*>(this)) Base(expr.data(), expr.rows(), expr.cols());
+    ::new (&m_stride) StrideBase(StrideType::OuterStrideAtCompileTime==0?0:expr.outerStride(),
+                                 StrideType::InnerStrideAtCompileTime==0?0:expr.innerStride());    
+  }
+
+  StrideBase m_stride;
+};
+
+
+template<typename PlainObjectType, int Options, typename StrideType> class Ref
+  : public RefBase<Ref<PlainObjectType, Options, StrideType> >
+{
+    typedef internal::traits<Ref> Traits;
+  public:
+
+    typedef RefBase<Ref> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
+
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename Derived>
+    inline Ref(PlainObjectBase<Derived>& expr,
+               typename internal::enable_if<bool(Traits::template match<Derived>::MatchAtCompileTime),Derived>::type* = 0)
+    {
+      Base::construct(expr);
+    }
+    template<typename Derived>
+    inline Ref(const DenseBase<Derived>& expr,
+               typename internal::enable_if<bool(internal::is_lvalue<Derived>::value&&bool(Traits::template match<Derived>::MatchAtCompileTime)),Derived>::type* = 0,
+               int = Derived::ThisConstantIsPrivateInPlainObjectBase)
+    #else
+    template<typename Derived>
+    inline Ref(DenseBase<Derived>& expr)
+    #endif
+    {
+      Base::construct(expr.const_cast_derived());
+    }
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Ref)
+
+};
+
+// this is the const ref version
+template<typename TPlainObjectType, int Options, typename StrideType> class Ref<const TPlainObjectType, Options, StrideType>
+  : public RefBase<Ref<const TPlainObjectType, Options, StrideType> >
+{
+    typedef internal::traits<Ref> Traits;
+  public:
+
+    typedef RefBase<Ref> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Ref)
+
+    template<typename Derived>
+    inline Ref(const DenseBase<Derived>& expr)
+    {
+//      std::cout << match_helper<Derived>::HasDirectAccess << "," << match_helper<Derived>::OuterStrideMatch << "," << match_helper<Derived>::InnerStrideMatch << "\n";
+//      std::cout << int(StrideType::OuterStrideAtCompileTime) << " - " << int(Derived::OuterStrideAtCompileTime) << "\n";
+//      std::cout << int(StrideType::InnerStrideAtCompileTime) << " - " << int(Derived::InnerStrideAtCompileTime) << "\n";
+      construct(expr.derived(), typename Traits::template match<Derived>::type());
+    }
+
+  protected:
+
+    template<typename Expression>
+    void construct(const Expression& expr,internal::true_type)
+    {
+      Base::construct(expr);
+    }
+
+    template<typename Expression>
+    void construct(const Expression& expr, internal::false_type)
+    {
+      m_object.lazyAssign(expr);
+      Base::construct(m_object);
+    }
+
+  protected:
+    TPlainObjectType m_object;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_REF_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Replicate.h b/vendor/eigen-3.1.91/Eigen/src/Core/Replicate.h
new file mode 100644
index 0000000..dde86a8
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Replicate.h
@@ -0,0 +1,177 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REPLICATE_H
+#define EIGEN_REPLICATE_H
+
+namespace Eigen { 
+
+/**
+  * \class Replicate
+  * \ingroup Core_Module
+  *
+  * \brief Expression of the multiple replication of a matrix or vector
+  *
+  * \param MatrixType the type of the object we are replicating
+  *
+  * This class represents an expression of the multiple replication of a matrix or vector.
+  * It is the return type of DenseBase::replicate() and most of the time
+  * this is the only way it is used.
+  *
+  * \sa DenseBase::replicate()
+  */
+
+namespace internal {
+template<typename MatrixType,int RowFactor,int ColFactor>
+struct traits<Replicate<MatrixType,RowFactor,ColFactor> >
+ : traits<MatrixType>
+{
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename traits<MatrixType>::StorageKind StorageKind;
+  typedef typename traits<MatrixType>::XprKind XprKind;
+  enum {
+    Factor = (RowFactor==Dynamic || ColFactor==Dynamic) ? Dynamic : RowFactor*ColFactor
+  };
+  typedef typename nested<MatrixType,Factor>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+  enum {
+    RowsAtCompileTime = RowFactor==Dynamic || int(MatrixType::RowsAtCompileTime)==Dynamic
+                      ? Dynamic
+                      : RowFactor * MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = ColFactor==Dynamic || int(MatrixType::ColsAtCompileTime)==Dynamic
+                      ? Dynamic
+                      : ColFactor * MatrixType::ColsAtCompileTime,
+   //FIXME we don't propagate the max sizes !!!
+    MaxRowsAtCompileTime = RowsAtCompileTime,
+    MaxColsAtCompileTime = ColsAtCompileTime,
+    IsRowMajor = MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1 ? 1
+               : MaxColsAtCompileTime==1 && MaxRowsAtCompileTime!=1 ? 0
+               : (MatrixType::Flags & RowMajorBit) ? 1 : 0,
+    Flags = (_MatrixTypeNested::Flags & HereditaryBits & ~RowMajorBit) | (IsRowMajor ? RowMajorBit : 0),
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost
+  };
+};
+}
+
+template<typename MatrixType,int RowFactor,int ColFactor> class Replicate
+  : public internal::dense_xpr_base< Replicate<MatrixType,RowFactor,ColFactor> >::type
+{
+    typedef typename internal::traits<Replicate>::MatrixTypeNested MatrixTypeNested;
+    typedef typename internal::traits<Replicate>::_MatrixTypeNested _MatrixTypeNested;
+  public:
+
+    typedef typename internal::dense_xpr_base<Replicate>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Replicate)
+
+    template<typename OriginalMatrixType>
+    inline explicit Replicate(const OriginalMatrixType& a_matrix)
+      : m_matrix(a_matrix), m_rowFactor(RowFactor), m_colFactor(ColFactor)
+    {
+      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
+                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
+      eigen_assert(RowFactor!=Dynamic && ColFactor!=Dynamic);
+    }
+
+    template<typename OriginalMatrixType>
+    inline Replicate(const OriginalMatrixType& a_matrix, Index rowFactor, Index colFactor)
+      : m_matrix(a_matrix), m_rowFactor(rowFactor), m_colFactor(colFactor)
+    {
+      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::remove_const<MatrixType>::type,OriginalMatrixType>::value),
+                          THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE)
+    }
+
+    inline Index rows() const { return m_matrix.rows() * m_rowFactor.value(); }
+    inline Index cols() const { return m_matrix.cols() * m_colFactor.value(); }
+
+    inline Scalar coeff(Index rowId, Index colId) const
+    {
+      // try to avoid using modulo; this is a pure optimization strategy
+      const Index actual_row  = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
+                            : RowFactor==1 ? rowId
+                            : rowId%m_matrix.rows();
+      const Index actual_col  = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
+                            : ColFactor==1 ? colId
+                            : colId%m_matrix.cols();
+
+      return m_matrix.coeff(actual_row, actual_col);
+    }
+    template<int LoadMode>
+    inline PacketScalar packet(Index rowId, Index colId) const
+    {
+      const Index actual_row  = internal::traits<MatrixType>::RowsAtCompileTime==1 ? 0
+                            : RowFactor==1 ? rowId
+                            : rowId%m_matrix.rows();
+      const Index actual_col  = internal::traits<MatrixType>::ColsAtCompileTime==1 ? 0
+                            : ColFactor==1 ? colId
+                            : colId%m_matrix.cols();
+
+      return m_matrix.template packet<LoadMode>(actual_row, actual_col);
+    }
+
+    const _MatrixTypeNested& nestedExpression() const
+    { 
+      return m_matrix; 
+    }
+
+  protected:
+    MatrixTypeNested m_matrix;
+    const internal::variable_if_dynamic<Index, RowFactor> m_rowFactor;
+    const internal::variable_if_dynamic<Index, ColFactor> m_colFactor;
+};
+
+/**
+  * \return an expression of the replication of \c *this
+  *
+  * Example: \include MatrixBase_replicate.cpp
+  * Output: \verbinclude MatrixBase_replicate.out
+  *
+  * \sa VectorwiseOp::replicate(), DenseBase::replicate(Index,Index), class Replicate
+  */
+template<typename Derived>
+template<int RowFactor, int ColFactor>
+inline const Replicate<Derived,RowFactor,ColFactor>
+DenseBase<Derived>::replicate() const
+{
+  return Replicate<Derived,RowFactor,ColFactor>(derived());
+}
+
+/**
+  * \return an expression of the replication of \c *this
+  *
+  * Example: \include MatrixBase_replicate_int_int.cpp
+  * Output: \verbinclude MatrixBase_replicate_int_int.out
+  *
+  * \sa VectorwiseOp::replicate(), DenseBase::replicate<int,int>(), class Replicate
+  */
+template<typename Derived>
+inline const Replicate<Derived,Dynamic,Dynamic>
+DenseBase<Derived>::replicate(Index rowFactor,Index colFactor) const
+{
+  return Replicate<Derived,Dynamic,Dynamic>(derived(),rowFactor,colFactor);
+}
+
+/**
+  * \return an expression of the replication of each column (or row) of \c *this
+  *
+  * Example: \include DirectionWise_replicate_int.cpp
+  * Output: \verbinclude DirectionWise_replicate_int.out
+  *
+  * \sa VectorwiseOp::replicate(), DenseBase::replicate(), class Replicate
+  */
+template<typename ExpressionType, int Direction>
+const typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
+VectorwiseOp<ExpressionType,Direction>::replicate(Index factor) const
+{
+  return typename VectorwiseOp<ExpressionType,Direction>::ReplicateReturnType
+          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_REPLICATE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/ReturnByValue.h b/vendor/eigen-3.1.91/Eigen/src/Core/ReturnByValue.h
new file mode 100644
index 0000000..613912f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/ReturnByValue.h
@@ -0,0 +1,88 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_RETURNBYVALUE_H
+#define EIGEN_RETURNBYVALUE_H
+
+namespace Eigen {
+
+/** \class ReturnByValue
+  * \ingroup Core_Module
+  *
+  */
+
+namespace internal {
+
+template<typename Derived>
+struct traits<ReturnByValue<Derived> >
+  : public traits<typename traits<Derived>::ReturnType>
+{
+  enum {
+    // We're disabling the DirectAccess because e.g. the constructor of
+    // the Block-with-DirectAccess expression requires to have a coeffRef method.
+    // Also, we don't want to have to implement the stride stuff.
+    Flags = (traits<typename traits<Derived>::ReturnType>::Flags
+             | EvalBeforeNestingBit) & ~DirectAccessBit
+  };
+};
+
+/* The ReturnByValue object doesn't even have a coeff() method.
+ * So the only way that nesting it in an expression can work, is by evaluating it into a plain matrix.
+ * So internal::nested always gives the plain return matrix type.
+ *
+ * FIXME: I don't understand why we need this specialization: isn't this taken care of by the EvalBeforeNestingBit ??
+ */
+template<typename Derived,int n,typename PlainObject>
+struct nested<ReturnByValue<Derived>, n, PlainObject>
+{
+  typedef typename traits<Derived>::ReturnType type;
+};
+
+} // end namespace internal
+
+template<typename Derived> class ReturnByValue
+  : public internal::dense_xpr_base< ReturnByValue<Derived> >::type
+{
+  public:
+    typedef typename internal::traits<Derived>::ReturnType ReturnType;
+
+    typedef typename internal::dense_xpr_base<ReturnByValue>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(ReturnByValue)
+
+    template<typename Dest>
+    inline void evalTo(Dest& dst) const
+    { static_cast<const Derived*>(this)->evalTo(dst); }
+    inline Index rows() const { return static_cast<const Derived*>(this)->rows(); }
+    inline Index cols() const { return static_cast<const Derived*>(this)->cols(); }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+#define Unusable YOU_ARE_TRYING_TO_ACCESS_A_SINGLE_COEFFICIENT_IN_A_SPECIAL_EXPRESSION_WHERE_THAT_IS_NOT_ALLOWED_BECAUSE_THAT_WOULD_BE_INEFFICIENT
+    class Unusable{
+      Unusable(const Unusable&) {}
+      Unusable& operator=(const Unusable&) {return *this;}
+    };
+    const Unusable& coeff(Index) const { return *reinterpret_cast<const Unusable*>(this); }
+    const Unusable& coeff(Index,Index) const { return *reinterpret_cast<const Unusable*>(this); }
+    Unusable& coeffRef(Index) { return *reinterpret_cast<Unusable*>(this); }
+    Unusable& coeffRef(Index,Index) { return *reinterpret_cast<Unusable*>(this); }
+#endif
+};
+
+template<typename Derived>
+template<typename OtherDerived>
+Derived& DenseBase<Derived>::operator=(const ReturnByValue<OtherDerived>& other)
+{
+  other.evalTo(derived());
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_RETURNBYVALUE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Reverse.h b/vendor/eigen-3.1.91/Eigen/src/Core/Reverse.h
new file mode 100644
index 0000000..e30ae3d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Reverse.h
@@ -0,0 +1,224 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Ricard Marxer <email at ricardmarxer.com>
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REVERSE_H
+#define EIGEN_REVERSE_H
+
+namespace Eigen { 
+
+/** \class Reverse
+  * \ingroup Core_Module
+  *
+  * \brief Expression of the reverse of a vector or matrix
+  *
+  * \param MatrixType the type of the object of which we are taking the reverse
+  *
+  * This class represents an expression of the reverse of a vector.
+  * It is the return type of MatrixBase::reverse() and VectorwiseOp::reverse()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::reverse(), VectorwiseOp::reverse()
+  */
+
+namespace internal {
+
+template<typename MatrixType, int Direction>
+struct traits<Reverse<MatrixType, Direction> >
+ : traits<MatrixType>
+{
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename traits<MatrixType>::StorageKind StorageKind;
+  typedef typename traits<MatrixType>::XprKind XprKind;
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+  enum {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+
+    // let's enable LinearAccess only with vectorization because of the product overhead
+    LinearAccess = ( (Direction==BothDirections) && (int(_MatrixTypeNested::Flags)&PacketAccessBit) )
+                 ? LinearAccessBit : 0,
+
+    Flags = int(_MatrixTypeNested::Flags) & (HereditaryBits | LvalueBit | PacketAccessBit | LinearAccess),
+
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost
+  };
+};
+
+template<typename PacketScalar, bool ReversePacket> struct reverse_packet_cond
+{
+  static inline PacketScalar run(const PacketScalar& x) { return preverse(x); }
+};
+
+template<typename PacketScalar> struct reverse_packet_cond<PacketScalar,false>
+{
+  static inline PacketScalar run(const PacketScalar& x) { return x; }
+};
+
+} // end namespace internal 
+
+template<typename MatrixType, int Direction> class Reverse
+  : public internal::dense_xpr_base< Reverse<MatrixType, Direction> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<Reverse>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)
+    using Base::IsRowMajor;
+
+    // next line is necessary because otherwise const version of operator()
+    // is hidden by non-const version defined in this file
+    using Base::operator(); 
+
+  protected:
+    enum {
+      PacketSize = internal::packet_traits<Scalar>::size,
+      IsColMajor = !IsRowMajor,
+      ReverseRow = (Direction == Vertical)   || (Direction == BothDirections),
+      ReverseCol = (Direction == Horizontal) || (Direction == BothDirections),
+      OffsetRow  = ReverseRow && IsColMajor ? PacketSize : 1,
+      OffsetCol  = ReverseCol && IsRowMajor ? PacketSize : 1,
+      ReversePacket = (Direction == BothDirections)
+                    || ((Direction == Vertical)   && IsColMajor)
+                    || ((Direction == Horizontal) && IsRowMajor)
+    };
+    typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;
+  public:
+
+    inline Reverse(const MatrixType& matrix) : m_matrix(matrix) { }
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse)
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    inline Index innerStride() const
+    {
+      return -m_matrix.innerStride();
+    }
+
+    inline Scalar& operator()(Index row, Index col)
+    {
+      eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
+      return coeffRef(row, col);
+    }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 : row,
+                                                    ReverseCol ? m_matrix.cols() - col - 1 : col);
+    }
+
+    inline CoeffReturnType coeff(Index row, Index col) const
+    {
+      return m_matrix.coeff(ReverseRow ? m_matrix.rows() - row - 1 : row,
+                            ReverseCol ? m_matrix.cols() - col - 1 : col);
+    }
+
+    inline CoeffReturnType coeff(Index index) const
+    {
+      return m_matrix.coeff(m_matrix.size() - index - 1);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);
+    }
+
+    inline Scalar& operator()(Index index)
+    {
+      eigen_assert(index >= 0 && index < m_matrix.size());
+      return coeffRef(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index row, Index col) const
+    {
+      return reverse_packet::run(m_matrix.template packet<LoadMode>(
+                                    ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
+                                    ReverseCol ? m_matrix.cols() - col - OffsetCol : col));
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index row, Index col, const PacketScalar& x)
+    {
+      m_matrix.const_cast_derived().template writePacket<LoadMode>(
+                                      ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
+                                      ReverseCol ? m_matrix.cols() - col - OffsetCol : col,
+                                      reverse_packet::run(x));
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return internal::preverse(m_matrix.template packet<LoadMode>( m_matrix.size() - index - PacketSize ));
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& x)
+    {
+      m_matrix.const_cast_derived().template writePacket<LoadMode>(m_matrix.size() - index - PacketSize, internal::preverse(x));
+    }
+
+    const typename internal::remove_all<typename MatrixType::Nested>::type& 
+    nestedExpression() const 
+    {
+      return m_matrix;
+    }
+
+  protected:
+    typename MatrixType::Nested m_matrix;
+};
+
+/** \returns an expression of the reverse of *this.
+  *
+  * Example: \include MatrixBase_reverse.cpp
+  * Output: \verbinclude MatrixBase_reverse.out
+  *
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::ReverseReturnType
+DenseBase<Derived>::reverse()
+{
+  return derived();
+}
+
+/** This is the const version of reverse(). */
+template<typename Derived>
+inline const typename DenseBase<Derived>::ConstReverseReturnType
+DenseBase<Derived>::reverse() const
+{
+  return derived();
+}
+
+/** This is the "in place" version of reverse: it reverses \c *this.
+  *
+  * In most cases it is probably better to simply use the reversed expression
+  * of a matrix. However, when reversing the matrix data itself is really needed,
+  * then this "in-place" version is probably the right choice because it provides
+  * the following additional features:
+  *  - less error prone: doing the same operation with .reverse() requires special care:
+  *    \code m = m.reverse().eval(); \endcode
+  *  - this API allows to avoid creating a temporary (the current implementation creates a temporary, but that could be avoided using swap)
+  *  - it allows future optimizations (cache friendliness, etc.)
+  *
+  * \sa reverse() */
+template<typename Derived>
+inline void DenseBase<Derived>::reverseInPlace()
+{
+  derived() = derived().reverse().eval();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_REVERSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Select.h b/vendor/eigen-3.1.91/Eigen/src/Core/Select.h
new file mode 100644
index 0000000..87993bb
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Select.h
@@ -0,0 +1,162 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELECT_H
+#define EIGEN_SELECT_H
+
+namespace Eigen { 
+
+/** \class Select
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a coefficient wise version of the C++ ternary operator ?:
+  *
+  * \param ConditionMatrixType the type of the \em condition expression which must be a boolean matrix
+  * \param ThenMatrixType the type of the \em then expression
+  * \param ElseMatrixType the type of the \em else expression
+  *
+  * This class represents an expression of a coefficient wise version of the C++ ternary operator ?:.
+  * It is the return type of DenseBase::select() and most of the time this is the only way it is used.
+  *
+  * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const
+  */
+
+namespace internal {
+template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+struct traits<Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >
+ : traits<ThenMatrixType>
+{
+  typedef typename traits<ThenMatrixType>::Scalar Scalar;
+  typedef Dense StorageKind;
+  typedef typename traits<ThenMatrixType>::XprKind XprKind;
+  typedef typename ConditionMatrixType::Nested ConditionMatrixNested;
+  typedef typename ThenMatrixType::Nested ThenMatrixNested;
+  typedef typename ElseMatrixType::Nested ElseMatrixNested;
+  enum {
+    RowsAtCompileTime = ConditionMatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = ConditionMatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = ConditionMatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = ConditionMatrixType::MaxColsAtCompileTime,
+    Flags = (unsigned int)ThenMatrixType::Flags & ElseMatrixType::Flags & HereditaryBits,
+    CoeffReadCost = traits<typename remove_all<ConditionMatrixNested>::type>::CoeffReadCost
+                  + EIGEN_SIZE_MAX(traits<typename remove_all<ThenMatrixNested>::type>::CoeffReadCost,
+                                   traits<typename remove_all<ElseMatrixNested>::type>::CoeffReadCost)
+  };
+};
+}
+
+template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType>
+class Select : internal::no_assignment_operator,
+  public internal::dense_xpr_base< Select<ConditionMatrixType, ThenMatrixType, ElseMatrixType> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<Select>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Select)
+
+    Select(const ConditionMatrixType& a_conditionMatrix,
+           const ThenMatrixType& a_thenMatrix,
+           const ElseMatrixType& a_elseMatrix)
+      : m_condition(a_conditionMatrix), m_then(a_thenMatrix), m_else(a_elseMatrix)
+    {
+      eigen_assert(m_condition.rows() == m_then.rows() && m_condition.rows() == m_else.rows());
+      eigen_assert(m_condition.cols() == m_then.cols() && m_condition.cols() == m_else.cols());
+    }
+
+    Index rows() const { return m_condition.rows(); }
+    Index cols() const { return m_condition.cols(); }
+
+    const Scalar coeff(Index i, Index j) const
+    {
+      if (m_condition.coeff(i,j))
+        return m_then.coeff(i,j);
+      else
+        return m_else.coeff(i,j);
+    }
+
+    const Scalar coeff(Index i) const
+    {
+      if (m_condition.coeff(i))
+        return m_then.coeff(i);
+      else
+        return m_else.coeff(i);
+    }
+
+    const ConditionMatrixType& conditionMatrix() const
+    {
+      return m_condition;
+    }
+
+    const ThenMatrixType& thenMatrix() const
+    {
+      return m_then;
+    }
+
+    const ElseMatrixType& elseMatrix() const
+    {
+      return m_else;
+    }
+
+  protected:
+    typename ConditionMatrixType::Nested m_condition;
+    typename ThenMatrixType::Nested m_then;
+    typename ElseMatrixType::Nested m_else;
+};
+
+
+/** \returns a matrix where each coefficient (i,j) is equal to \a thenMatrix(i,j)
+  * if \c *this(i,j), and \a elseMatrix(i,j) otherwise.
+  *
+  * Example: \include MatrixBase_select.cpp
+  * Output: \verbinclude MatrixBase_select.out
+  *
+  * \sa class Select
+  */
+template<typename Derived>
+template<typename ThenDerived,typename ElseDerived>
+inline const Select<Derived,ThenDerived,ElseDerived>
+DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
+                            const DenseBase<ElseDerived>& elseMatrix) const
+{
+  return Select<Derived,ThenDerived,ElseDerived>(derived(), thenMatrix.derived(), elseMatrix.derived());
+}
+
+/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
+  * the \em else expression being a scalar value.
+  *
+  * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select
+  */
+template<typename Derived>
+template<typename ThenDerived>
+inline const Select<Derived,ThenDerived, typename ThenDerived::ConstantReturnType>
+DenseBase<Derived>::select(const DenseBase<ThenDerived>& thenMatrix,
+                           const typename ThenDerived::Scalar& elseScalar) const
+{
+  return Select<Derived,ThenDerived,typename ThenDerived::ConstantReturnType>(
+    derived(), thenMatrix.derived(), ThenDerived::Constant(rows(),cols(),elseScalar));
+}
+
+/** Version of DenseBase::select(const DenseBase&, const DenseBase&) with
+  * the \em then expression being a scalar value.
+  *
+  * \sa DenseBase::select(const DenseBase<ThenDerived>&, const DenseBase<ElseDerived>&) const, class Select
+  */
+template<typename Derived>
+template<typename ElseDerived>
+inline const Select<Derived, typename ElseDerived::ConstantReturnType, ElseDerived >
+DenseBase<Derived>::select(const typename ElseDerived::Scalar& thenScalar,
+                           const DenseBase<ElseDerived>& elseMatrix) const
+{
+  return Select<Derived,typename ElseDerived::ConstantReturnType,ElseDerived>(
+    derived(), ElseDerived::Constant(rows(),cols(),thenScalar), elseMatrix.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELECT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/SelfAdjointView.h b/vendor/eigen-3.1.91/Eigen/src/Core/SelfAdjointView.h
new file mode 100644
index 0000000..d437891
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/SelfAdjointView.h
@@ -0,0 +1,314 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINTMATRIX_H
+#define EIGEN_SELFADJOINTMATRIX_H
+
+namespace Eigen { 
+
+/** \class SelfAdjointView
+  * \ingroup Core_Module
+  *
+  *
+  * \brief Expression of a selfadjoint matrix from a triangular part of a dense matrix
+  *
+  * \param MatrixType the type of the dense matrix storing the coefficients
+  * \param TriangularPart can be either \c #Lower or \c #Upper
+  *
+  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
+  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
+  * and most of the time this is the only way that it is used.
+  *
+  * \sa class TriangularBase, MatrixBase::selfadjointView()
+  */
+
+namespace internal {
+template<typename MatrixType, unsigned int UpLo>
+struct traits<SelfAdjointView<MatrixType, UpLo> > : traits<MatrixType>
+{
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
+  typedef MatrixType ExpressionType;
+  typedef typename MatrixType::PlainObject DenseMatrixType;
+  enum {
+    Mode = UpLo | SelfAdjoint,
+    Flags =  MatrixTypeNestedCleaned::Flags & (HereditaryBits)
+           & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit)), // FIXME these flags should be preserved
+    CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost
+  };
+};
+}
+
+template <typename Lhs, int LhsMode, bool LhsIsVector,
+          typename Rhs, int RhsMode, bool RhsIsVector>
+struct SelfadjointProductMatrix;
+
+// FIXME could also be called SelfAdjointWrapper to be consistent with DiagonalWrapper ??
+template<typename MatrixType, unsigned int UpLo> class SelfAdjointView
+  : public TriangularBase<SelfAdjointView<MatrixType, UpLo> >
+{
+  public:
+
+    typedef TriangularBase<SelfAdjointView> Base;
+    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNested MatrixTypeNested;
+    typedef typename internal::traits<SelfAdjointView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
+
+    /** \brief The type of coefficients in this matrix */
+    typedef typename internal::traits<SelfAdjointView>::Scalar Scalar; 
+
+    typedef typename MatrixType::Index Index;
+
+    enum {
+      Mode = internal::traits<SelfAdjointView>::Mode
+    };
+    typedef typename MatrixType::PlainObject PlainObject;
+
+    inline SelfAdjointView(MatrixType& matrix) : m_matrix(matrix)
+    {}
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    inline Index outerStride() const { return m_matrix.outerStride(); }
+    inline Index innerStride() const { return m_matrix.innerStride(); }
+
+    /** \sa MatrixBase::coeff()
+      * \warning the coordinates must fit into the referenced triangular part
+      */
+    inline Scalar coeff(Index row, Index col) const
+    {
+      Base::check_coordinates_internal(row, col);
+      return m_matrix.coeff(row, col);
+    }
+
+    /** \sa MatrixBase::coeffRef()
+      * \warning the coordinates must fit into the referenced triangular part
+      */
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      Base::check_coordinates_internal(row, col);
+      return m_matrix.const_cast_derived().coeffRef(row, col);
+    }
+
+    /** \internal */
+    const MatrixTypeNestedCleaned& _expression() const { return m_matrix; }
+
+    const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
+    MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }
+
+    /** Efficient self-adjoint matrix times vector/matrix product */
+    template<typename OtherDerived>
+    SelfadjointProductMatrix<MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>
+    operator*(const MatrixBase<OtherDerived>& rhs) const
+    {
+      return SelfadjointProductMatrix
+              <MatrixType,Mode,false,OtherDerived,0,OtherDerived::IsVectorAtCompileTime>
+              (m_matrix, rhs.derived());
+    }
+
+    /** Efficient vector/matrix times self-adjoint matrix product */
+    template<typename OtherDerived> friend
+    SelfadjointProductMatrix<OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>
+    operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView& rhs)
+    {
+      return SelfadjointProductMatrix
+              <OtherDerived,0,OtherDerived::IsVectorAtCompileTime,MatrixType,Mode,false>
+              (lhs.derived(),rhs.m_matrix);
+    }
+
+    /** Perform a symmetric rank 2 update of the selfadjoint matrix \c *this:
+      * \f$ this = this + \alpha u v^* + conj(\alpha) v u^* \f$
+      * \returns a reference to \c *this
+      *
+      * The vectors \a u and \c v \b must be column vectors, however they can be
+      * a adjoint expression without any overhead. Only the meaningful triangular
+      * part of the matrix is updated, the rest is left unchanged.
+      *
+      * \sa rankUpdate(const MatrixBase<DerivedU>&, Scalar)
+      */
+    template<typename DerivedU, typename DerivedV>
+    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha = Scalar(1));
+
+    /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
+      * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
+      *
+      * \returns a reference to \c *this
+      *
+      * Note that to perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
+      * call this function with u.adjoint().
+      *
+      * \sa rankUpdate(const MatrixBase<DerivedU>&, const MatrixBase<DerivedV>&, Scalar)
+      */
+    template<typename DerivedU>
+    SelfAdjointView& rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
+
+/////////// Cholesky module ///////////
+
+    const LLT<PlainObject, UpLo> llt() const;
+    const LDLT<PlainObject, UpLo> ldlt() const;
+
+/////////// Eigenvalue module ///////////
+
+    /** Real part of #Scalar */
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    /** Return type of eigenvalues() */
+    typedef Matrix<RealScalar, internal::traits<MatrixType>::ColsAtCompileTime, 1> EigenvaluesReturnType;
+
+    EigenvaluesReturnType eigenvalues() const;
+    RealScalar operatorNorm() const;
+    
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived>
+    SelfAdjointView& operator=(const MatrixBase<OtherDerived>& other)
+    {
+      enum {
+        OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper
+      };
+      m_matrix.const_cast_derived().template triangularView<UpLo>() = other;
+      m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.adjoint();
+      return *this;
+    }
+    template<typename OtherMatrixType, unsigned int OtherMode>
+    SelfAdjointView& operator=(const TriangularView<OtherMatrixType, OtherMode>& other)
+    {
+      enum {
+        OtherPart = UpLo == Upper ? StrictlyLower : StrictlyUpper
+      };
+      m_matrix.const_cast_derived().template triangularView<UpLo>() = other.toDenseMatrix();
+      m_matrix.const_cast_derived().template triangularView<OtherPart>() = other.toDenseMatrix().adjoint();
+      return *this;
+    }
+    #endif
+
+  protected:
+    MatrixTypeNested m_matrix;
+};
+
+
+// template<typename OtherDerived, typename MatrixType, unsigned int UpLo>
+// internal::selfadjoint_matrix_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >
+// operator*(const MatrixBase<OtherDerived>& lhs, const SelfAdjointView<MatrixType,UpLo>& rhs)
+// {
+//   return internal::matrix_selfadjoint_product_returntype<OtherDerived,SelfAdjointView<MatrixType,UpLo> >(lhs.derived(),rhs);
+// }
+
+// selfadjoint to dense matrix
+
+namespace internal {
+
+template<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount, ClearOpposite>
+{
+  enum {
+    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived1::RowsAtCompileTime
+  };
+
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Upper), UnrollCount-1, ClearOpposite>::run(dst, src);
+
+    if(row == col)
+      dst.coeffRef(row, col) = real(src.coeff(row, col));
+    else if(row < col)
+      dst.coeffRef(col, row) = conj(dst.coeffRef(row, col) = src.coeff(row, col));
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, 0, ClearOpposite>
+{
+  static inline void run(Derived1 &, const Derived2 &) {}
+};
+
+template<typename Derived1, typename Derived2, int UnrollCount, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount, ClearOpposite>
+{
+  enum {
+    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived1::RowsAtCompileTime
+  };
+
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    triangular_assignment_selector<Derived1, Derived2, (SelfAdjoint|Lower), UnrollCount-1, ClearOpposite>::run(dst, src);
+
+    if(row == col)
+      dst.coeffRef(row, col) = real(src.coeff(row, col));
+    else if(row > col)
+      dst.coeffRef(col, row) = conj(dst.coeffRef(row, col) = src.coeff(row, col));
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, 0, ClearOpposite>
+{
+  static inline void run(Derived1 &, const Derived2 &) {}
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Upper, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      for(Index i = 0; i < j; ++i)
+      {
+        dst.copyCoeff(i, j, src);
+        dst.coeffRef(j,i) = conj(dst.coeff(i,j));
+      }
+      dst.copyCoeff(j, j, src);
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, SelfAdjoint|Lower, Dynamic, ClearOpposite>
+{
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+  typedef typename Derived1::Index Index;
+    for(Index i = 0; i < dst.rows(); ++i)
+    {
+      for(Index j = 0; j < i; ++j)
+      {
+        dst.copyCoeff(i, j, src);
+        dst.coeffRef(j,i) = conj(dst.coeff(i,j));
+      }
+      dst.copyCoeff(i, i, src);
+    }
+  }
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* Implementation of MatrixBase methods
+***************************************************************************/
+
+template<typename Derived>
+template<unsigned int UpLo>
+typename MatrixBase<Derived>::template ConstSelfAdjointViewReturnType<UpLo>::Type
+MatrixBase<Derived>::selfadjointView() const
+{
+  return derived();
+}
+
+template<typename Derived>
+template<unsigned int UpLo>
+typename MatrixBase<Derived>::template SelfAdjointViewReturnType<UpLo>::Type
+MatrixBase<Derived>::selfadjointView()
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINTMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/SelfCwiseBinaryOp.h b/vendor/eigen-3.1.91/Eigen/src/Core/SelfCwiseBinaryOp.h
new file mode 100644
index 0000000..22f3047
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/SelfCwiseBinaryOp.h
@@ -0,0 +1,197 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFCWISEBINARYOP_H
+#define EIGEN_SELFCWISEBINARYOP_H
+
+namespace Eigen { 
+
+/** \class SelfCwiseBinaryOp
+  * \ingroup Core_Module
+  *
+  * \internal
+  *
+  * \brief Internal helper class for optimizing operators like +=, -=
+  *
+  * This is a pseudo expression class re-implementing the copyCoeff/copyPacket
+  * method to directly performs a +=/-= operations in an optimal way. In particular,
+  * this allows to make sure that the input/output data are loaded only once using
+  * aligned packet loads.
+  *
+  * \sa class SwapWrapper for a similar trick.
+  */
+
+namespace internal {
+template<typename BinaryOp, typename Lhs, typename Rhs>
+struct traits<SelfCwiseBinaryOp<BinaryOp,Lhs,Rhs> >
+  : traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >
+{
+  enum {
+    // Note that it is still a good idea to preserve the DirectAccessBit
+    // so that assign can correctly align the data.
+    Flags = traits<CwiseBinaryOp<BinaryOp,Lhs,Rhs> >::Flags | (Lhs::Flags&DirectAccessBit) | (Lhs::Flags&LvalueBit),
+    OuterStrideAtCompileTime = Lhs::OuterStrideAtCompileTime,
+    InnerStrideAtCompileTime = Lhs::InnerStrideAtCompileTime
+  };
+};
+}
+
+template<typename BinaryOp, typename Lhs, typename Rhs> class SelfCwiseBinaryOp
+  : public internal::dense_xpr_base< SelfCwiseBinaryOp<BinaryOp, Lhs, Rhs> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<SelfCwiseBinaryOp>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(SelfCwiseBinaryOp)
+
+    typedef typename internal::packet_traits<Scalar>::type Packet;
+
+    inline SelfCwiseBinaryOp(Lhs& xpr, const BinaryOp& func = BinaryOp()) : m_matrix(xpr), m_functor(func) {}
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    inline Index outerStride() const { return m_matrix.outerStride(); }
+    inline Index innerStride() const { return m_matrix.innerStride(); }
+    inline const Scalar* data() const { return m_matrix.data(); }
+
+    // note that this function is needed by assign to correctly align loads/stores
+    // TODO make Assign use .data()
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(Lhs)
+      return m_matrix.const_cast_derived().coeffRef(row, col);
+    }
+    inline const Scalar& coeffRef(Index row, Index col) const
+    {
+      return m_matrix.coeffRef(row, col);
+    }
+
+    // note that this function is needed by assign to correctly align loads/stores
+    // TODO make Assign use .data()
+    inline Scalar& coeffRef(Index index)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(Lhs)
+      return m_matrix.const_cast_derived().coeffRef(index);
+    }
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return m_matrix.const_cast_derived().coeffRef(index);
+    }
+
+    template<typename OtherDerived>
+    void copyCoeff(Index row, Index col, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(row >= 0 && row < rows()
+                         && col >= 0 && col < cols());
+      Scalar& tmp = m_matrix.coeffRef(row,col);
+      tmp = m_functor(tmp, _other.coeff(row,col));
+    }
+
+    template<typename OtherDerived>
+    void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(index >= 0 && index < m_matrix.size());
+      Scalar& tmp = m_matrix.coeffRef(index);
+      tmp = m_functor(tmp, _other.coeff(index));
+    }
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    void copyPacket(Index row, Index col, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(row >= 0 && row < rows()
+                        && col >= 0 && col < cols());
+      m_matrix.template writePacket<StoreMode>(row, col,
+        m_functor.packetOp(m_matrix.template packet<StoreMode>(row, col),_other.template packet<LoadMode>(row, col)) );
+    }
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    void copyPacket(Index index, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(index >= 0 && index < m_matrix.size());
+      m_matrix.template writePacket<StoreMode>(index,
+        m_functor.packetOp(m_matrix.template packet<StoreMode>(index),_other.template packet<LoadMode>(index)) );
+    }
+
+    // reimplement lazyAssign to handle complex *= real
+    // see CwiseBinaryOp ctor for details
+    template<typename RhsDerived>
+    EIGEN_STRONG_INLINE SelfCwiseBinaryOp& lazyAssign(const DenseBase<RhsDerived>& rhs)
+    {
+      EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(Lhs,RhsDerived)
+      EIGEN_CHECK_BINARY_COMPATIBILIY(BinaryOp,typename Lhs::Scalar,typename RhsDerived::Scalar);
+      
+    #ifdef EIGEN_DEBUG_ASSIGN
+      internal::assign_traits<SelfCwiseBinaryOp, RhsDerived>::debug();
+    #endif
+      eigen_assert(rows() == rhs.rows() && cols() == rhs.cols());
+      internal::assign_impl<SelfCwiseBinaryOp, RhsDerived>::run(*this,rhs.derived());
+    #ifndef EIGEN_NO_DEBUG
+      this->checkTransposeAliasing(rhs.derived());
+    #endif
+      return *this;
+    }
+    
+    // overloaded to honor evaluation of special matrices
+    // maybe another solution would be to not use SelfCwiseBinaryOp
+    // at first...
+    SelfCwiseBinaryOp& operator=(const Rhs& _rhs)
+    {
+      typename internal::nested<Rhs>::type rhs(_rhs);
+      return Base::operator=(rhs);
+    }
+
+    Lhs& expression() const 
+    { 
+      return m_matrix;
+    }
+
+    const BinaryOp& functor() const 
+    { 
+      return m_functor;
+    }
+
+  protected:
+    Lhs& m_matrix;
+    const BinaryOp& m_functor;
+
+  private:
+    SelfCwiseBinaryOp& operator=(const SelfCwiseBinaryOp&);
+};
+
+template<typename Derived>
+inline Derived& DenseBase<Derived>::operator*=(const Scalar& other)
+{
+  typedef typename Derived::PlainObject PlainObject;
+  SelfCwiseBinaryOp<internal::scalar_product_op<Scalar>, Derived, typename PlainObject::ConstantReturnType> tmp(derived());
+  tmp = PlainObject::Constant(rows(),cols(),other);
+  return derived();
+}
+
+template<typename Derived>
+inline Derived& DenseBase<Derived>::operator/=(const Scalar& other)
+{
+  typedef typename internal::conditional<NumTraits<Scalar>::IsInteger,
+                                        internal::scalar_quotient_op<Scalar>,
+                                        internal::scalar_product_op<Scalar> >::type BinOp;
+  typedef typename Derived::PlainObject PlainObject;
+  SelfCwiseBinaryOp<BinOp, Derived, typename PlainObject::ConstantReturnType> tmp(derived());
+  Scalar actual_other;
+  if(NumTraits<Scalar>::IsInteger)  actual_other = other;
+  else                              actual_other = Scalar(1)/other;
+  tmp = PlainObject::Constant(rows(),cols(), actual_other);
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFCWISEBINARYOP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/SolveTriangular.h b/vendor/eigen-3.1.91/Eigen/src/Core/SolveTriangular.h
new file mode 100644
index 0000000..ef17f28
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/SolveTriangular.h
@@ -0,0 +1,260 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SOLVETRIANGULAR_H
+#define EIGEN_SOLVETRIANGULAR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// Forward declarations:
+// The following two routines are implemented in the products/TriangularSolver*.h files
+template<typename LhsScalar, typename RhsScalar, typename Index, int Side, int Mode, bool Conjugate, int StorageOrder>
+struct triangular_solve_vector;
+
+template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder, int OtherStorageOrder>
+struct triangular_solve_matrix;
+
+// small helper struct extracting some traits on the underlying solver operation
+template<typename Lhs, typename Rhs, int Side>
+class trsolve_traits
+{
+  private:
+    enum {
+      RhsIsVectorAtCompileTime = (Side==OnTheLeft ? Rhs::ColsAtCompileTime : Rhs::RowsAtCompileTime)==1
+    };
+  public:
+    enum {
+      Unrolling   = (RhsIsVectorAtCompileTime && Rhs::SizeAtCompileTime != Dynamic && Rhs::SizeAtCompileTime <= 8)
+                  ? CompleteUnrolling : NoUnrolling,
+      RhsVectors  = RhsIsVectorAtCompileTime ? 1 : Dynamic
+    };
+};
+
+template<typename Lhs, typename Rhs,
+  int Side, // can be OnTheLeft/OnTheRight
+  int Mode, // can be Upper/Lower | UnitDiag
+  int Unrolling = trsolve_traits<Lhs,Rhs,Side>::Unrolling,
+  int RhsVectors = trsolve_traits<Lhs,Rhs,Side>::RhsVectors
+  >
+struct triangular_solver_selector;
+
+template<typename Lhs, typename Rhs, int Side, int Mode>
+struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,1>
+{
+  typedef typename Lhs::Scalar LhsScalar;
+  typedef typename Rhs::Scalar RhsScalar;
+  typedef blas_traits<Lhs> LhsProductTraits;
+  typedef typename LhsProductTraits::ExtractType ActualLhsType;
+  typedef Map<Matrix<RhsScalar,Dynamic,1>, Aligned> MappedRhs;
+  static void run(const Lhs& lhs, Rhs& rhs)
+  {
+    ActualLhsType actualLhs = LhsProductTraits::extract(lhs);
+
+    // FIXME find a way to allow an inner stride if packet_traits<Scalar>::size==1
+
+    bool useRhsDirectly = Rhs::InnerStrideAtCompileTime==1 || rhs.innerStride()==1;
+
+    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhs,rhs.size(),
+                                                  (useRhsDirectly ? rhs.data() : 0));
+                                                  
+    if(!useRhsDirectly)
+      MappedRhs(actualRhs,rhs.size()) = rhs;
+
+    triangular_solve_vector<LhsScalar, RhsScalar, typename Lhs::Index, Side, Mode, LhsProductTraits::NeedToConjugate,
+                            (int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor>
+      ::run(actualLhs.cols(), actualLhs.data(), actualLhs.outerStride(), actualRhs);
+
+    if(!useRhsDirectly)
+      rhs = MappedRhs(actualRhs, rhs.size());
+  }
+};
+
+// the rhs is a matrix
+template<typename Lhs, typename Rhs, int Side, int Mode>
+struct triangular_solver_selector<Lhs,Rhs,Side,Mode,NoUnrolling,Dynamic>
+{
+  typedef typename Rhs::Scalar Scalar;
+  typedef typename Rhs::Index Index;
+  typedef blas_traits<Lhs> LhsProductTraits;
+  typedef typename LhsProductTraits::DirectLinearAccessType ActualLhsType;
+
+  static void run(const Lhs& lhs, Rhs& rhs)
+  {
+    typename internal::add_const_on_value_type<ActualLhsType>::type actualLhs = LhsProductTraits::extract(lhs);
+
+    const Index size = lhs.rows();
+    const Index othersize = Side==OnTheLeft? rhs.cols() : rhs.rows();
+
+    typedef internal::gemm_blocking_space<(Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
+              Rhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxRowsAtCompileTime,4> BlockingType;
+
+    BlockingType blocking(rhs.rows(), rhs.cols(), size);
+
+    triangular_solve_matrix<Scalar,Index,Side,Mode,LhsProductTraits::NeedToConjugate,(int(Lhs::Flags) & RowMajorBit) ? RowMajor : ColMajor,
+                               (Rhs::Flags&RowMajorBit) ? RowMajor : ColMajor>
+      ::run(size, othersize, &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &rhs.coeffRef(0,0), rhs.outerStride(), blocking);
+  }
+};
+
+/***************************************************************************
+* meta-unrolling implementation
+***************************************************************************/
+
+template<typename Lhs, typename Rhs, int Mode, int Index, int Size,
+         bool Stop = Index==Size>
+struct triangular_solver_unroller;
+
+template<typename Lhs, typename Rhs, int Mode, int Index, int Size>
+struct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,false> {
+  enum {
+    IsLower = ((Mode&Lower)==Lower),
+    I = IsLower ? Index : Size - Index - 1,
+    S = IsLower ? 0     : I+1
+  };
+  static void run(const Lhs& lhs, Rhs& rhs)
+  {
+    if (Index>0)
+      rhs.coeffRef(I) -= lhs.row(I).template segment<Index>(S).transpose()
+                         .cwiseProduct(rhs.template segment<Index>(S)).sum();
+
+    if(!(Mode & UnitDiag))
+      rhs.coeffRef(I) /= lhs.coeff(I,I);
+
+    triangular_solver_unroller<Lhs,Rhs,Mode,Index+1,Size>::run(lhs,rhs);
+  }
+};
+
+template<typename Lhs, typename Rhs, int Mode, int Index, int Size>
+struct triangular_solver_unroller<Lhs,Rhs,Mode,Index,Size,true> {
+  static void run(const Lhs&, Rhs&) {}
+};
+
+template<typename Lhs, typename Rhs, int Mode>
+struct triangular_solver_selector<Lhs,Rhs,OnTheLeft,Mode,CompleteUnrolling,1> {
+  static void run(const Lhs& lhs, Rhs& rhs)
+  { triangular_solver_unroller<Lhs,Rhs,Mode,0,Rhs::SizeAtCompileTime>::run(lhs,rhs); }
+};
+
+template<typename Lhs, typename Rhs, int Mode>
+struct triangular_solver_selector<Lhs,Rhs,OnTheRight,Mode,CompleteUnrolling,1> {
+  static void run(const Lhs& lhs, Rhs& rhs)
+  {
+    Transpose<const Lhs> trLhs(lhs);
+    Transpose<Rhs> trRhs(rhs);
+    
+    triangular_solver_unroller<Transpose<const Lhs>,Transpose<Rhs>,
+                              ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),
+                              0,Rhs::SizeAtCompileTime>::run(trLhs,trRhs);
+  }
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* TriangularView methods
+***************************************************************************/
+
+/** "in-place" version of TriangularView::solve() where the result is written in \a other
+  *
+  * \warning The parameter is only marked 'const' to make the C++ compiler accept a temporary expression here.
+  * This function will const_cast it, so constness isn't honored here.
+  *
+  * See TriangularView:solve() for the details.
+  */
+template<typename MatrixType, unsigned int Mode>
+template<int Side, typename OtherDerived>
+void TriangularView<MatrixType,Mode>::solveInPlace(const MatrixBase<OtherDerived>& _other) const
+{
+  OtherDerived& other = _other.const_cast_derived();
+  eigen_assert( cols() == rows() && ((Side==OnTheLeft && cols() == other.rows()) || (Side==OnTheRight && cols() == other.cols())) );
+  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
+
+  enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit  && OtherDerived::IsVectorAtCompileTime };
+  typedef typename internal::conditional<copy,
+    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
+  OtherCopy otherCopy(other);
+
+  internal::triangular_solver_selector<MatrixType, typename internal::remove_reference<OtherCopy>::type,
+    Side, Mode>::run(nestedExpression(), otherCopy);
+
+  if (copy)
+    other = otherCopy;
+}
+
+/** \returns the product of the inverse of \c *this with \a other, \a *this being triangular.
+  *
+  * This function computes the inverse-matrix matrix product inverse(\c *this) * \a other if
+  * \a Side==OnTheLeft (the default), or the right-inverse-multiply  \a other * inverse(\c *this) if
+  * \a Side==OnTheRight.
+  *
+  * The matrix \c *this must be triangular and invertible (i.e., all the coefficients of the
+  * diagonal must be non zero). It works as a forward (resp. backward) substitution if \c *this
+  * is an upper (resp. lower) triangular matrix.
+  *
+  * Example: \include MatrixBase_marked.cpp
+  * Output: \verbinclude MatrixBase_marked.out
+  *
+  * This function returns an expression of the inverse-multiply and can works in-place if it is assigned
+  * to the same matrix or vector \a other.
+  *
+  * For users coming from BLAS, this function (and more specifically solveInPlace()) offer
+  * all the operations supported by the \c *TRSV and \c *TRSM BLAS routines.
+  *
+  * \sa TriangularView::solveInPlace()
+  */
+template<typename Derived, unsigned int Mode>
+template<int Side, typename Other>
+const internal::triangular_solve_retval<Side,TriangularView<Derived,Mode>,Other>
+TriangularView<Derived,Mode>::solve(const MatrixBase<Other>& other) const
+{
+  return internal::triangular_solve_retval<Side,TriangularView,Other>(*this, other.derived());
+}
+
+namespace internal {
+
+
+template<int Side, typename TriangularType, typename Rhs>
+struct traits<triangular_solve_retval<Side, TriangularType, Rhs> >
+{
+  typedef typename internal::plain_matrix_type_column_major<Rhs>::type ReturnType;
+};
+
+template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval
+ : public ReturnByValue<triangular_solve_retval<Side, TriangularType, Rhs> >
+{
+  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;
+  typedef ReturnByValue<triangular_solve_retval> Base;
+  typedef typename Base::Index Index;
+
+  triangular_solve_retval(const TriangularType& tri, const Rhs& rhs)
+    : m_triangularMatrix(tri), m_rhs(rhs)
+  {}
+
+  inline Index rows() const { return m_rhs.rows(); }
+  inline Index cols() const { return m_rhs.cols(); }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    if(!(is_same<RhsNestedCleaned,Dest>::value && extract_data(dst) == extract_data(m_rhs)))
+      dst = m_rhs;
+    m_triangularMatrix.template solveInPlace<Side>(dst);
+  }
+
+  protected:
+    const TriangularType& m_triangularMatrix;
+    typename Rhs::Nested m_rhs;
+};
+
+} // namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SOLVETRIANGULAR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/StableNorm.h b/vendor/eigen-3.1.91/Eigen/src/Core/StableNorm.h
new file mode 100644
index 0000000..f57bbb7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/StableNorm.h
@@ -0,0 +1,190 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STABLENORM_H
+#define EIGEN_STABLENORM_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename ExpressionType, typename Scalar>
+inline void stable_norm_kernel(const ExpressionType& bl, Scalar& ssq, Scalar& scale, Scalar& invScale)
+{
+  Scalar max = bl.cwiseAbs().maxCoeff();
+  if (max>scale)
+  {
+    ssq = ssq * abs2(scale/max);
+    scale = max;
+    invScale = Scalar(1)/scale;
+  }
+  // TODO if the max is much much smaller than the current scale,
+  // then we can neglect this sub vector
+  ssq += (bl*invScale).squaredNorm();
+}
+
+template<typename Derived>
+inline typename NumTraits<typename traits<Derived>::Scalar>::Real
+blueNorm_impl(const EigenBase<Derived>& _vec)
+{
+  typedef typename Derived::RealScalar RealScalar;  
+  typedef typename Derived::Index Index;
+  using std::pow;
+  using std::min;
+  using std::max;
+  using std::sqrt;
+  using std::abs;
+  const Derived& vec(_vec.derived());
+  static bool initialized = false;
+  static RealScalar b1, b2, s1m, s2m, overfl, rbig, relerr;
+  if(!initialized)
+  {
+    int ibeta, it, iemin, iemax, iexp;
+    RealScalar eps;
+    // This program calculates the machine-dependent constants
+    // bl, b2, slm, s2m, relerr overfl
+    // from the "basic" machine-dependent numbers
+    // nbig, ibeta, it, iemin, iemax, rbig.
+    // The following define the basic machine-dependent constants.
+    // For portability, the PORT subprograms "ilmaeh" and "rlmach"
+    // are used. For any specific computer, each of the assignment
+    // statements can be replaced
+    ibeta = std::numeric_limits<RealScalar>::radix;                 // base for floating-point numbers
+    it    = std::numeric_limits<RealScalar>::digits;                // number of base-beta digits in mantissa
+    iemin = std::numeric_limits<RealScalar>::min_exponent;          // minimum exponent
+    iemax = std::numeric_limits<RealScalar>::max_exponent;          // maximum exponent
+    rbig  = (std::numeric_limits<RealScalar>::max)();               // largest floating-point number
+
+    iexp  = -((1-iemin)/2);
+    b1    = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // lower boundary of midrange
+    iexp  = (iemax + 1 - it)/2;
+    b2    = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // upper boundary of midrange
+
+    iexp  = (2-iemin)/2;
+    s1m   = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // scaling factor for lower range
+    iexp  = - ((iemax+it)/2);
+    s2m   = RealScalar(pow(RealScalar(ibeta),RealScalar(iexp)));    // scaling factor for upper range
+
+    overfl  = rbig*s2m;                                             // overflow boundary for abig
+    eps     = RealScalar(pow(double(ibeta), 1-it));
+    relerr  = sqrt(eps);                                            // tolerance for neglecting asml
+    initialized = true;
+  }
+  Index n = vec.size();
+  RealScalar ab2 = b2 / RealScalar(n);
+  RealScalar asml = RealScalar(0);
+  RealScalar amed = RealScalar(0);
+  RealScalar abig = RealScalar(0);
+  for(typename Derived::InnerIterator it(vec, 0); it; ++it)
+  {
+    RealScalar ax = abs(it.value());
+    if(ax > ab2)     abig += internal::abs2(ax*s2m);
+    else if(ax < b1) asml += internal::abs2(ax*s1m);
+    else             amed += internal::abs2(ax);
+  }
+  if(abig > RealScalar(0))
+  {
+    abig = sqrt(abig);
+    if(abig > overfl)
+    {
+      return rbig;
+    }
+    if(amed > RealScalar(0))
+    {
+      abig = abig/s2m;
+      amed = sqrt(amed);
+    }
+    else
+      return abig/s2m;
+  }
+  else if(asml > RealScalar(0))
+  {
+    if (amed > RealScalar(0))
+    {
+      abig = sqrt(amed);
+      amed = sqrt(asml) / s1m;
+    }
+    else
+      return sqrt(asml)/s1m;
+  }
+  else
+    return sqrt(amed);
+  asml = (min)(abig, amed);
+  abig = (max)(abig, amed);
+  if(asml <= abig*relerr)
+    return abig;
+  else
+    return abig * sqrt(RealScalar(1) + internal::abs2(asml/abig));
+}
+
+} // end namespace internal
+
+/** \returns the \em l2 norm of \c *this avoiding underflow and overflow.
+  * This version use a blockwise two passes algorithm:
+  *  1 - find the absolute largest coefficient \c s
+  *  2 - compute \f$ s \Vert \frac{*this}{s} \Vert \f$ in a standard way
+  *
+  * For architecture/scalar types supporting vectorization, this version
+  * is faster than blueNorm(). Otherwise the blueNorm() is much faster.
+  *
+  * \sa norm(), blueNorm(), hypotNorm()
+  */
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::stableNorm() const
+{
+  using std::min;
+  using std::sqrt;
+  const Index blockSize = 4096;
+  RealScalar scale(0);
+  RealScalar invScale(1);
+  RealScalar ssq(0); // sum of square
+  enum {
+    Alignment = (int(Flags)&DirectAccessBit) || (int(Flags)&AlignedBit) ? 1 : 0
+  };
+  Index n = size();
+  Index bi = internal::first_aligned(derived());
+  if (bi>0)
+    internal::stable_norm_kernel(this->head(bi), ssq, scale, invScale);
+  for (; bi<n; bi+=blockSize)
+    internal::stable_norm_kernel(this->segment(bi,(min)(blockSize, n - bi)).template forceAlignedAccessIf<Alignment>(), ssq, scale, invScale);
+  return scale * sqrt(ssq);
+}
+
+/** \returns the \em l2 norm of \c *this using the Blue's algorithm.
+  * A Portable Fortran Program to Find the Euclidean Norm of a Vector,
+  * ACM TOMS, Vol 4, Issue 1, 1978.
+  *
+  * For architecture/scalar types without vectorization, this version
+  * is much faster than stableNorm(). Otherwise the stableNorm() is faster.
+  *
+  * \sa norm(), stableNorm(), hypotNorm()
+  */
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::blueNorm() const
+{
+  return internal::blueNorm_impl(*this);
+}
+
+/** \returns the \em l2 norm of \c *this avoiding undeflow and overflow.
+  * This version use a concatenation of hypot() calls, and it is very slow.
+  *
+  * \sa norm(), stableNorm()
+  */
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+MatrixBase<Derived>::hypotNorm() const
+{
+  return this->cwiseAbs().redux(internal::scalar_hypot_op<RealScalar>());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_STABLENORM_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Stride.h b/vendor/eigen-3.1.91/Eigen/src/Core/Stride.h
new file mode 100644
index 0000000..1e3f5fe
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Stride.h
@@ -0,0 +1,108 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STRIDE_H
+#define EIGEN_STRIDE_H
+
+namespace Eigen { 
+
+/** \class Stride
+  * \ingroup Core_Module
+  *
+  * \brief Holds strides information for Map
+  *
+  * This class holds the strides information for mapping arrays with strides with class Map.
+  *
+  * It holds two values: the inner stride and the outer stride.
+  *
+  * The inner stride is the pointer increment between two consecutive entries within a given row of a
+  * row-major matrix or within a given column of a column-major matrix.
+  *
+  * The outer stride is the pointer increment between two consecutive rows of a row-major matrix or
+  * between two consecutive columns of a column-major matrix.
+  *
+  * These two values can be passed either at compile-time as template parameters, or at runtime as
+  * arguments to the constructor.
+  *
+  * Indeed, this class takes two template parameters:
+  *  \param _OuterStrideAtCompileTime the outer stride, or Dynamic if you want to specify it at runtime.
+  *  \param _InnerStrideAtCompileTime the inner stride, or Dynamic if you want to specify it at runtime.
+  *
+  * Here is an example:
+  * \include Map_general_stride.cpp
+  * Output: \verbinclude Map_general_stride.out
+  *
+  * \sa class InnerStride, class OuterStride, \ref TopicStorageOrders
+  */
+template<int _OuterStrideAtCompileTime, int _InnerStrideAtCompileTime>
+class Stride
+{
+  public:
+    typedef DenseIndex Index;
+    enum {
+      InnerStrideAtCompileTime = _InnerStrideAtCompileTime,
+      OuterStrideAtCompileTime = _OuterStrideAtCompileTime
+    };
+
+    /** Default constructor, for use when strides are fixed at compile time */
+    Stride()
+      : m_outer(OuterStrideAtCompileTime), m_inner(InnerStrideAtCompileTime)
+    {
+      eigen_assert(InnerStrideAtCompileTime != Dynamic && OuterStrideAtCompileTime != Dynamic);
+    }
+
+    /** Constructor allowing to pass the strides at runtime */
+    Stride(Index outerStride, Index innerStride)
+      : m_outer(outerStride), m_inner(innerStride)
+    {
+      eigen_assert(innerStride>=0 && outerStride>=0);
+    }
+
+    /** Copy constructor */
+    Stride(const Stride& other)
+      : m_outer(other.outer()), m_inner(other.inner())
+    {}
+
+    /** \returns the outer stride */
+    inline Index outer() const { return m_outer.value(); }
+    /** \returns the inner stride */
+    inline Index inner() const { return m_inner.value(); }
+
+  protected:
+    internal::variable_if_dynamic<Index, OuterStrideAtCompileTime> m_outer;
+    internal::variable_if_dynamic<Index, InnerStrideAtCompileTime> m_inner;
+};
+
+/** \brief Convenience specialization of Stride to specify only an inner stride
+  * See class Map for some examples */
+template<int Value = Dynamic>
+class InnerStride : public Stride<0, Value>
+{
+    typedef Stride<0, Value> Base;
+  public:
+    typedef DenseIndex Index;
+    InnerStride() : Base() {}
+    InnerStride(Index v) : Base(0, v) {}
+};
+
+/** \brief Convenience specialization of Stride to specify only an outer stride
+  * See class Map for some examples */
+template<int Value = Dynamic>
+class OuterStride : public Stride<Value, 0>
+{
+    typedef Stride<Value, 0> Base;
+  public:
+    typedef DenseIndex Index;
+    OuterStride() : Base() {}
+    OuterStride(Index v) : Base(v,0) {}
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_STRIDE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Swap.h b/vendor/eigen-3.1.91/Eigen/src/Core/Swap.h
new file mode 100644
index 0000000..bf58bd5
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Swap.h
@@ -0,0 +1,126 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SWAP_H
+#define EIGEN_SWAP_H
+
+namespace Eigen { 
+
+/** \class SwapWrapper
+  * \ingroup Core_Module
+  *
+  * \internal
+  *
+  * \brief Internal helper class for swapping two expressions
+  */
+namespace internal {
+template<typename ExpressionType>
+struct traits<SwapWrapper<ExpressionType> > : traits<ExpressionType> {};
+}
+
+template<typename ExpressionType> class SwapWrapper
+  : public internal::dense_xpr_base<SwapWrapper<ExpressionType> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<SwapWrapper>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(SwapWrapper)
+    typedef typename internal::packet_traits<Scalar>::type Packet;
+
+    inline SwapWrapper(ExpressionType& xpr) : m_expression(xpr) {}
+
+    inline Index rows() const { return m_expression.rows(); }
+    inline Index cols() const { return m_expression.cols(); }
+    inline Index outerStride() const { return m_expression.outerStride(); }
+    inline Index innerStride() const { return m_expression.innerStride(); }
+    
+    typedef typename internal::conditional<
+                       internal::is_lvalue<ExpressionType>::value,
+                       Scalar,
+                       const Scalar
+                     >::type ScalarWithConstIfNotLvalue;
+                     
+    inline ScalarWithConstIfNotLvalue* data() { return m_expression.data(); }
+    inline const Scalar* data() const { return m_expression.data(); }
+
+    inline Scalar& coeffRef(Index rowId, Index colId)
+    {
+      return m_expression.const_cast_derived().coeffRef(rowId, colId);
+    }
+
+    inline Scalar& coeffRef(Index index)
+    {
+      return m_expression.const_cast_derived().coeffRef(index);
+    }
+
+    inline Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return m_expression.coeffRef(rowId, colId);
+    }
+
+    inline Scalar& coeffRef(Index index) const
+    {
+      return m_expression.coeffRef(index);
+    }
+
+    template<typename OtherDerived>
+    void copyCoeff(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(rowId >= 0 && rowId < rows()
+                         && colId >= 0 && colId < cols());
+      Scalar tmp = m_expression.coeff(rowId, colId);
+      m_expression.coeffRef(rowId, colId) = _other.coeff(rowId, colId);
+      _other.coeffRef(rowId, colId) = tmp;
+    }
+
+    template<typename OtherDerived>
+    void copyCoeff(Index index, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(index >= 0 && index < m_expression.size());
+      Scalar tmp = m_expression.coeff(index);
+      m_expression.coeffRef(index) = _other.coeff(index);
+      _other.coeffRef(index) = tmp;
+    }
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    void copyPacket(Index rowId, Index colId, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(rowId >= 0 && rowId < rows()
+                        && colId >= 0 && colId < cols());
+      Packet tmp = m_expression.template packet<StoreMode>(rowId, colId);
+      m_expression.template writePacket<StoreMode>(rowId, colId,
+        _other.template packet<LoadMode>(rowId, colId)
+      );
+      _other.template writePacket<LoadMode>(rowId, colId, tmp);
+    }
+
+    template<typename OtherDerived, int StoreMode, int LoadMode>
+    void copyPacket(Index index, const DenseBase<OtherDerived>& other)
+    {
+      OtherDerived& _other = other.const_cast_derived();
+      eigen_internal_assert(index >= 0 && index < m_expression.size());
+      Packet tmp = m_expression.template packet<StoreMode>(index);
+      m_expression.template writePacket<StoreMode>(index,
+        _other.template packet<LoadMode>(index)
+      );
+      _other.template writePacket<LoadMode>(index, tmp);
+    }
+
+    ExpressionType& expression() const { return m_expression; }
+
+  protected:
+    ExpressionType& m_expression;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SWAP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Transpose.h b/vendor/eigen-3.1.91/Eigen/src/Core/Transpose.h
new file mode 100644
index 0000000..2bc828e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Transpose.h
@@ -0,0 +1,416 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRANSPOSE_H
+#define EIGEN_TRANSPOSE_H
+
+namespace Eigen { 
+
+/** \class Transpose
+  * \ingroup Core_Module
+  *
+  * \brief Expression of the transpose of a matrix
+  *
+  * \param MatrixType the type of the object of which we are taking the transpose
+  *
+  * This class represents an expression of the transpose of a matrix.
+  * It is the return type of MatrixBase::transpose() and MatrixBase::adjoint()
+  * and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::transpose(), MatrixBase::adjoint()
+  */
+
+namespace internal {
+template<typename MatrixType>
+struct traits<Transpose<MatrixType> > : traits<MatrixType>
+{
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedPlain;
+  typedef typename traits<MatrixType>::StorageKind StorageKind;
+  typedef typename traits<MatrixType>::XprKind XprKind;
+  enum {
+    RowsAtCompileTime = MatrixType::ColsAtCompileTime,
+    ColsAtCompileTime = MatrixType::RowsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    FlagsLvalueBit = is_lvalue<MatrixType>::value ? LvalueBit : 0,
+    Flags0 = MatrixTypeNestedPlain::Flags & ~(LvalueBit | NestByRefBit),
+    Flags1 = Flags0 | FlagsLvalueBit,
+    Flags = Flags1 ^ RowMajorBit,
+    CoeffReadCost = MatrixTypeNestedPlain::CoeffReadCost,
+    InnerStrideAtCompileTime = inner_stride_at_compile_time<MatrixType>::ret,
+    OuterStrideAtCompileTime = outer_stride_at_compile_time<MatrixType>::ret
+  };
+};
+}
+
+template<typename MatrixType, typename StorageKind> class TransposeImpl;
+
+template<typename MatrixType> class Transpose
+  : public TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>
+{
+  public:
+
+    typedef typename TransposeImpl<MatrixType,typename internal::traits<MatrixType>::StorageKind>::Base Base;
+    EIGEN_GENERIC_PUBLIC_INTERFACE(Transpose)
+
+    inline Transpose(MatrixType& a_matrix) : m_matrix(a_matrix) {}
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Transpose)
+
+    inline Index rows() const { return m_matrix.cols(); }
+    inline Index cols() const { return m_matrix.rows(); }
+
+    /** \returns the nested expression */
+    const typename internal::remove_all<typename MatrixType::Nested>::type&
+    nestedExpression() const { return m_matrix; }
+
+    /** \returns the nested expression */
+    typename internal::remove_all<typename MatrixType::Nested>::type&
+    nestedExpression() { return m_matrix.const_cast_derived(); }
+
+  protected:
+    typename MatrixType::Nested m_matrix;
+};
+
+namespace internal {
+
+template<typename MatrixType, bool HasDirectAccess = has_direct_access<MatrixType>::ret>
+struct TransposeImpl_base
+{
+  typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
+};
+
+template<typename MatrixType>
+struct TransposeImpl_base<MatrixType, false>
+{
+  typedef typename dense_xpr_base<Transpose<MatrixType> >::type type;
+};
+
+} // end namespace internal
+
+template<typename MatrixType> class TransposeImpl<MatrixType,Dense>
+  : public internal::TransposeImpl_base<MatrixType>::type
+{
+  public:
+
+    typedef typename internal::TransposeImpl_base<MatrixType>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Transpose<MatrixType>)
+
+    inline Index innerStride() const { return derived().nestedExpression().innerStride(); }
+    inline Index outerStride() const { return derived().nestedExpression().outerStride(); }
+
+    typedef typename internal::conditional<
+                       internal::is_lvalue<MatrixType>::value,
+                       Scalar,
+                       const Scalar
+                     >::type ScalarWithConstIfNotLvalue;
+
+    inline ScalarWithConstIfNotLvalue* data() { return derived().nestedExpression().data(); }
+    inline const Scalar* data() const { return derived().nestedExpression().data(); }
+
+    inline ScalarWithConstIfNotLvalue& coeffRef(Index rowId, Index colId)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+      return derived().nestedExpression().const_cast_derived().coeffRef(colId, rowId);
+    }
+
+    inline ScalarWithConstIfNotLvalue& coeffRef(Index index)
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+      return derived().nestedExpression().const_cast_derived().coeffRef(index);
+    }
+
+    inline const Scalar& coeffRef(Index rowId, Index colId) const
+    {
+      return derived().nestedExpression().coeffRef(colId, rowId);
+    }
+
+    inline const Scalar& coeffRef(Index index) const
+    {
+      return derived().nestedExpression().coeffRef(index);
+    }
+
+    inline CoeffReturnType coeff(Index rowId, Index colId) const
+    {
+      return derived().nestedExpression().coeff(colId, rowId);
+    }
+
+    inline CoeffReturnType coeff(Index index) const
+    {
+      return derived().nestedExpression().coeff(index);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index rowId, Index colId) const
+    {
+      return derived().nestedExpression().template packet<LoadMode>(colId, rowId);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index rowId, Index colId, const PacketScalar& x)
+    {
+      derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(colId, rowId, x);
+    }
+
+    template<int LoadMode>
+    inline const PacketScalar packet(Index index) const
+    {
+      return derived().nestedExpression().template packet<LoadMode>(index);
+    }
+
+    template<int LoadMode>
+    inline void writePacket(Index index, const PacketScalar& x)
+    {
+      derived().nestedExpression().const_cast_derived().template writePacket<LoadMode>(index, x);
+    }
+};
+
+/** \returns an expression of the transpose of *this.
+  *
+  * Example: \include MatrixBase_transpose.cpp
+  * Output: \verbinclude MatrixBase_transpose.out
+  *
+  * \warning If you want to replace a matrix by its own transpose, do \b NOT do this:
+  * \code
+  * m = m.transpose(); // bug!!! caused by aliasing effect
+  * \endcode
+  * Instead, use the transposeInPlace() method:
+  * \code
+  * m.transposeInPlace();
+  * \endcode
+  * which gives Eigen good opportunities for optimization, or alternatively you can also do:
+  * \code
+  * m = m.transpose().eval();
+  * \endcode
+  *
+  * \sa transposeInPlace(), adjoint() */
+template<typename Derived>
+inline Transpose<Derived>
+DenseBase<Derived>::transpose()
+{
+  return derived();
+}
+
+/** This is the const version of transpose().
+  *
+  * Make sure you read the warning for transpose() !
+  *
+  * \sa transposeInPlace(), adjoint() */
+template<typename Derived>
+inline const typename DenseBase<Derived>::ConstTransposeReturnType
+DenseBase<Derived>::transpose() const
+{
+  return ConstTransposeReturnType(derived());
+}
+
+/** \returns an expression of the adjoint (i.e. conjugate transpose) of *this.
+  *
+  * Example: \include MatrixBase_adjoint.cpp
+  * Output: \verbinclude MatrixBase_adjoint.out
+  *
+  * \warning If you want to replace a matrix by its own adjoint, do \b NOT do this:
+  * \code
+  * m = m.adjoint(); // bug!!! caused by aliasing effect
+  * \endcode
+  * Instead, use the adjointInPlace() method:
+  * \code
+  * m.adjointInPlace();
+  * \endcode
+  * which gives Eigen good opportunities for optimization, or alternatively you can also do:
+  * \code
+  * m = m.adjoint().eval();
+  * \endcode
+  *
+  * \sa adjointInPlace(), transpose(), conjugate(), class Transpose, class internal::scalar_conjugate_op */
+template<typename Derived>
+inline const typename MatrixBase<Derived>::AdjointReturnType
+MatrixBase<Derived>::adjoint() const
+{
+  return this->transpose(); // in the complex case, the .conjugate() is be implicit here
+                            // due to implicit conversion to return type
+}
+
+/***************************************************************************
+* "in place" transpose implementation
+***************************************************************************/
+
+namespace internal {
+
+template<typename MatrixType,
+  bool IsSquare = (MatrixType::RowsAtCompileTime == MatrixType::ColsAtCompileTime) && MatrixType::RowsAtCompileTime!=Dynamic>
+struct inplace_transpose_selector;
+
+template<typename MatrixType>
+struct inplace_transpose_selector<MatrixType,true> { // square matrix
+  static void run(MatrixType& m) {
+    m.template triangularView<StrictlyUpper>().swap(m.transpose());
+  }
+};
+
+template<typename MatrixType>
+struct inplace_transpose_selector<MatrixType,false> { // non square matrix
+  static void run(MatrixType& m) {
+    if (m.rows()==m.cols())
+      m.template triangularView<StrictlyUpper>().swap(m.transpose());
+    else
+      m = m.transpose().eval();
+  }
+};
+
+} // end namespace internal
+
+/** This is the "in place" version of transpose(): it replaces \c *this by its own transpose.
+  * Thus, doing
+  * \code
+  * m.transposeInPlace();
+  * \endcode
+  * has the same effect on m as doing
+  * \code
+  * m = m.transpose().eval();
+  * \endcode
+  * and is faster and also safer because in the latter line of code, forgetting the eval() results
+  * in a bug caused by \ref TopicAliasing "aliasing".
+  *
+  * Notice however that this method is only useful if you want to replace a matrix by its own transpose.
+  * If you just need the transpose of a matrix, use transpose().
+  *
+  * \note if the matrix is not square, then \c *this must be a resizable matrix.
+  *
+  * \sa transpose(), adjoint(), adjointInPlace() */
+template<typename Derived>
+inline void DenseBase<Derived>::transposeInPlace()
+{
+  eigen_assert((rows() == cols() || (RowsAtCompileTime == Dynamic && ColsAtCompileTime == Dynamic))
+               && "transposeInPlace() called on a non-square non-resizable matrix");
+  internal::inplace_transpose_selector<Derived>::run(derived());
+}
+
+/***************************************************************************
+* "in place" adjoint implementation
+***************************************************************************/
+
+/** This is the "in place" version of adjoint(): it replaces \c *this by its own transpose.
+  * Thus, doing
+  * \code
+  * m.adjointInPlace();
+  * \endcode
+  * has the same effect on m as doing
+  * \code
+  * m = m.adjoint().eval();
+  * \endcode
+  * and is faster and also safer because in the latter line of code, forgetting the eval() results
+  * in a bug caused by aliasing.
+  *
+  * Notice however that this method is only useful if you want to replace a matrix by its own adjoint.
+  * If you just need the adjoint of a matrix, use adjoint().
+  *
+  * \note if the matrix is not square, then \c *this must be a resizable matrix.
+  *
+  * \sa transpose(), adjoint(), transposeInPlace() */
+template<typename Derived>
+inline void MatrixBase<Derived>::adjointInPlace()
+{
+  derived() = adjoint().eval();
+}
+
+#ifndef EIGEN_NO_DEBUG
+
+// The following is to detect aliasing problems in most common cases.
+
+namespace internal {
+
+template<typename BinOp,typename NestedXpr,typename Rhs>
+struct blas_traits<SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> >
+ : blas_traits<NestedXpr>
+{
+  typedef SelfCwiseBinaryOp<BinOp,NestedXpr,Rhs> XprType;
+  static inline const XprType extract(const XprType& x) { return x; }
+};
+
+template<bool DestIsTransposed, typename OtherDerived>
+struct check_transpose_aliasing_compile_time_selector
+{
+  enum { ret = bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed };
+};
+
+template<bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
+struct check_transpose_aliasing_compile_time_selector<DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
+{
+  enum { ret =    bool(blas_traits<DerivedA>::IsTransposed) != DestIsTransposed
+               || bool(blas_traits<DerivedB>::IsTransposed) != DestIsTransposed
+  };
+};
+
+template<typename Scalar, bool DestIsTransposed, typename OtherDerived>
+struct check_transpose_aliasing_run_time_selector
+{
+  static bool run(const Scalar* dest, const OtherDerived& src)
+  {
+    return (bool(blas_traits<OtherDerived>::IsTransposed) != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src));
+  }
+};
+
+template<typename Scalar, bool DestIsTransposed, typename BinOp, typename DerivedA, typename DerivedB>
+struct check_transpose_aliasing_run_time_selector<Scalar,DestIsTransposed,CwiseBinaryOp<BinOp,DerivedA,DerivedB> >
+{
+  static bool run(const Scalar* dest, const CwiseBinaryOp<BinOp,DerivedA,DerivedB>& src)
+  {
+    return ((blas_traits<DerivedA>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.lhs())))
+        || ((blas_traits<DerivedB>::IsTransposed != DestIsTransposed) && (dest!=0 && dest==(const Scalar*)extract_data(src.rhs())));
+  }
+};
+
+// the following selector, checkTransposeAliasing_impl, based on MightHaveTransposeAliasing,
+// is because when the condition controlling the assert is known at compile time, ICC emits a warning.
+// This is actually a good warning: in expressions that don't have any transposing, the condition is
+// known at compile time to be false, and using that, we can avoid generating the code of the assert again
+// and again for all these expressions that don't need it.
+
+template<typename Derived, typename OtherDerived,
+         bool MightHaveTransposeAliasing
+                 = check_transpose_aliasing_compile_time_selector
+                     <blas_traits<Derived>::IsTransposed,OtherDerived>::ret
+        >
+struct checkTransposeAliasing_impl
+{
+    static void run(const Derived& dst, const OtherDerived& other)
+    {
+        eigen_assert((!check_transpose_aliasing_run_time_selector
+                      <typename Derived::Scalar,blas_traits<Derived>::IsTransposed,OtherDerived>
+                      ::run(extract_data(dst), other))
+          && "aliasing detected during tranposition, use transposeInPlace() "
+             "or evaluate the rhs into a temporary using .eval()");
+
+    }
+};
+
+template<typename Derived, typename OtherDerived>
+struct checkTransposeAliasing_impl<Derived, OtherDerived, false>
+{
+    static void run(const Derived&, const OtherDerived&)
+    {
+    }
+};
+
+} // end namespace internal
+
+template<typename Derived>
+template<typename OtherDerived>
+void DenseBase<Derived>::checkTransposeAliasing(const OtherDerived& other) const
+{
+    internal::checkTransposeAliasing_impl<Derived, OtherDerived>::run(derived(), other);
+}
+#endif
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRANSPOSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Transpositions.h b/vendor/eigen-3.1.91/Eigen/src/Core/Transpositions.h
new file mode 100644
index 0000000..e4ba075
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Transpositions.h
@@ -0,0 +1,436 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRANSPOSITIONS_H
+#define EIGEN_TRANSPOSITIONS_H
+
+namespace Eigen { 
+
+/** \class Transpositions
+  * \ingroup Core_Module
+  *
+  * \brief Represents a sequence of transpositions (row/column interchange)
+  *
+  * \param SizeAtCompileTime the number of transpositions, or Dynamic
+  * \param MaxSizeAtCompileTime the maximum number of transpositions, or Dynamic. This optional parameter defaults to SizeAtCompileTime. Most of the time, you should not have to specify it.
+  *
+  * This class represents a permutation transformation as a sequence of \em n transpositions
+  * \f$[T_{n-1} \ldots T_{i} \ldots T_{0}]\f$. It is internally stored as a vector of integers \c indices.
+  * Each transposition \f$ T_{i} \f$ applied on the left of a matrix (\f$ T_{i} M\f$) interchanges
+  * the rows \c i and \c indices[i] of the matrix \c M.
+  * A transposition applied on the right (e.g., \f$ M T_{i}\f$) yields a column interchange.
+  *
+  * Compared to the class PermutationMatrix, such a sequence of transpositions is what is
+  * computed during a decomposition with pivoting, and it is faster when applying the permutation in-place.
+  * 
+  * To apply a sequence of transpositions to a matrix, simply use the operator * as in the following example:
+  * \code
+  * Transpositions tr;
+  * MatrixXf mat;
+  * mat = tr * mat;
+  * \endcode
+  * In this example, we detect that the matrix appears on both side, and so the transpositions
+  * are applied in-place without any temporary or extra copy.
+  *
+  * \sa class PermutationMatrix
+  */
+
+namespace internal {
+template<typename TranspositionType, typename MatrixType, int Side, bool Transposed=false> struct transposition_matrix_product_retval;
+}
+
+template<typename Derived>
+class TranspositionsBase
+{
+    typedef internal::traits<Derived> Traits;
+    
+  public:
+
+    typedef typename Traits::IndicesType IndicesType;
+    typedef typename IndicesType::Scalar Index;
+
+    Derived& derived() { return *static_cast<Derived*>(this); }
+    const Derived& derived() const { return *static_cast<const Derived*>(this); }
+
+    /** Copies the \a other transpositions into \c *this */
+    template<typename OtherDerived>
+    Derived& operator=(const TranspositionsBase<OtherDerived>& other)
+    {
+      indices() = other.indices();
+      return derived();
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    Derived& operator=(const TranspositionsBase& other)
+    {
+      indices() = other.indices();
+      return derived();
+    }
+    #endif
+
+    /** \returns the number of transpositions */
+    inline Index size() const { return indices().size(); }
+
+    /** Direct access to the underlying index vector */
+    inline const Index& coeff(Index i) const { return indices().coeff(i); }
+    /** Direct access to the underlying index vector */
+    inline Index& coeffRef(Index i) { return indices().coeffRef(i); }
+    /** Direct access to the underlying index vector */
+    inline const Index& operator()(Index i) const { return indices()(i); }
+    /** Direct access to the underlying index vector */
+    inline Index& operator()(Index i) { return indices()(i); }
+    /** Direct access to the underlying index vector */
+    inline const Index& operator[](Index i) const { return indices()(i); }
+    /** Direct access to the underlying index vector */
+    inline Index& operator[](Index i) { return indices()(i); }
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return derived().indices(); }
+    /** \returns a reference to the stored array representing the transpositions. */
+    IndicesType& indices() { return derived().indices(); }
+
+    /** Resizes to given size. */
+    inline void resize(int newSize)
+    {
+      indices().resize(newSize);
+    }
+
+    /** Sets \c *this to represents an identity transformation */
+    void setIdentity()
+    {
+      for(int i = 0; i < indices().size(); ++i)
+        coeffRef(i) = i;
+    }
+
+    // FIXME: do we want such methods ?
+    // might be usefull when the target matrix expression is complex, e.g.:
+    // object.matrix().block(..,..,..,..) = trans * object.matrix().block(..,..,..,..);
+    /*
+    template<typename MatrixType>
+    void applyForwardToRows(MatrixType& mat) const
+    {
+      for(Index k=0 ; k<size() ; ++k)
+        if(m_indices(k)!=k)
+          mat.row(k).swap(mat.row(m_indices(k)));
+    }
+
+    template<typename MatrixType>
+    void applyBackwardToRows(MatrixType& mat) const
+    {
+      for(Index k=size()-1 ; k>=0 ; --k)
+        if(m_indices(k)!=k)
+          mat.row(k).swap(mat.row(m_indices(k)));
+    }
+    */
+
+    /** \returns the inverse transformation */
+    inline Transpose<TranspositionsBase> inverse() const
+    { return Transpose<TranspositionsBase>(derived()); }
+
+    /** \returns the tranpose transformation */
+    inline Transpose<TranspositionsBase> transpose() const
+    { return Transpose<TranspositionsBase>(derived()); }
+
+  protected:
+};
+
+namespace internal {
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
+struct traits<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >
+{
+  typedef IndexType Index;
+  typedef Matrix<Index, SizeAtCompileTime, 1, 0, MaxSizeAtCompileTime, 1> IndicesType;
+};
+}
+
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType>
+class Transpositions : public TranspositionsBase<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType> >
+{
+    typedef internal::traits<Transpositions> Traits;
+  public:
+
+    typedef TranspositionsBase<Transpositions> Base;
+    typedef typename Traits::IndicesType IndicesType;
+    typedef typename IndicesType::Scalar Index;
+
+    inline Transpositions() {}
+
+    /** Copy constructor. */
+    template<typename OtherDerived>
+    inline Transpositions(const TranspositionsBase<OtherDerived>& other)
+      : m_indices(other.indices()) {}
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** Standard copy constructor. Defined only to prevent a default copy constructor
+      * from hiding the other templated constructor */
+    inline Transpositions(const Transpositions& other) : m_indices(other.indices()) {}
+    #endif
+
+    /** Generic constructor from expression of the transposition indices. */
+    template<typename Other>
+    explicit inline Transpositions(const MatrixBase<Other>& a_indices) : m_indices(a_indices)
+    {}
+
+    /** Copies the \a other transpositions into \c *this */
+    template<typename OtherDerived>
+    Transpositions& operator=(const TranspositionsBase<OtherDerived>& other)
+    {
+      return Base::operator=(other);
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    Transpositions& operator=(const Transpositions& other)
+    {
+      m_indices = other.m_indices;
+      return *this;
+    }
+    #endif
+
+    /** Constructs an uninitialized permutation matrix of given size.
+      */
+    inline Transpositions(Index size) : m_indices(size)
+    {}
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return m_indices; }
+    /** \returns a reference to the stored array representing the transpositions. */
+    IndicesType& indices() { return m_indices; }
+
+  protected:
+
+    IndicesType m_indices;
+};
+
+
+namespace internal {
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int _PacketAccess>
+struct traits<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,_PacketAccess> >
+{
+  typedef IndexType Index;
+  typedef Map<const Matrix<Index,SizeAtCompileTime,1,0,MaxSizeAtCompileTime,1>, _PacketAccess> IndicesType;
+};
+}
+
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime, typename IndexType, int PacketAccess>
+class Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess>
+ : public TranspositionsBase<Map<Transpositions<SizeAtCompileTime,MaxSizeAtCompileTime,IndexType>,PacketAccess> >
+{
+    typedef internal::traits<Map> Traits;
+  public:
+
+    typedef TranspositionsBase<Map> Base;
+    typedef typename Traits::IndicesType IndicesType;
+    typedef typename IndicesType::Scalar Index;
+
+    inline Map(const Index* indicesPtr)
+      : m_indices(indicesPtr)
+    {}
+
+    inline Map(const Index* indicesPtr, Index size)
+      : m_indices(indicesPtr,size)
+    {}
+
+    /** Copies the \a other transpositions into \c *this */
+    template<typename OtherDerived>
+    Map& operator=(const TranspositionsBase<OtherDerived>& other)
+    {
+      return Base::operator=(other);
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    Map& operator=(const Map& other)
+    {
+      m_indices = other.m_indices;
+      return *this;
+    }
+    #endif
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return m_indices; }
+    
+    /** \returns a reference to the stored array representing the transpositions. */
+    IndicesType& indices() { return m_indices; }
+
+  protected:
+
+    IndicesType m_indices;
+};
+
+namespace internal {
+template<typename _IndicesType>
+struct traits<TranspositionsWrapper<_IndicesType> >
+{
+  typedef typename _IndicesType::Scalar Index;
+  typedef _IndicesType IndicesType;
+};
+}
+
+template<typename _IndicesType>
+class TranspositionsWrapper
+ : public TranspositionsBase<TranspositionsWrapper<_IndicesType> >
+{
+    typedef internal::traits<TranspositionsWrapper> Traits;
+  public:
+
+    typedef TranspositionsBase<TranspositionsWrapper> Base;
+    typedef typename Traits::IndicesType IndicesType;
+    typedef typename IndicesType::Scalar Index;
+
+    inline TranspositionsWrapper(IndicesType& a_indices)
+      : m_indices(a_indices)
+    {}
+
+    /** Copies the \a other transpositions into \c *this */
+    template<typename OtherDerived>
+    TranspositionsWrapper& operator=(const TranspositionsBase<OtherDerived>& other)
+    {
+      return Base::operator=(other);
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is a special case of the templated operator=. Its purpose is to
+      * prevent a default operator= from hiding the templated operator=.
+      */
+    TranspositionsWrapper& operator=(const TranspositionsWrapper& other)
+    {
+      m_indices = other.m_indices;
+      return *this;
+    }
+    #endif
+
+    /** const version of indices(). */
+    const IndicesType& indices() const { return m_indices; }
+
+    /** \returns a reference to the stored array representing the transpositions. */
+    IndicesType& indices() { return m_indices; }
+
+  protected:
+
+    const typename IndicesType::Nested m_indices;
+};
+
+/** \returns the \a matrix with the \a transpositions applied to the columns.
+  */
+template<typename Derived, typename TranspositionsDerived>
+inline const internal::transposition_matrix_product_retval<TranspositionsDerived, Derived, OnTheRight>
+operator*(const MatrixBase<Derived>& matrix,
+          const TranspositionsBase<TranspositionsDerived> &transpositions)
+{
+  return internal::transposition_matrix_product_retval
+           <TranspositionsDerived, Derived, OnTheRight>
+           (transpositions.derived(), matrix.derived());
+}
+
+/** \returns the \a matrix with the \a transpositions applied to the rows.
+  */
+template<typename Derived, typename TranspositionDerived>
+inline const internal::transposition_matrix_product_retval
+               <TranspositionDerived, Derived, OnTheLeft>
+operator*(const TranspositionsBase<TranspositionDerived> &transpositions,
+          const MatrixBase<Derived>& matrix)
+{
+  return internal::transposition_matrix_product_retval
+           <TranspositionDerived, Derived, OnTheLeft>
+           (transpositions.derived(), matrix.derived());
+}
+
+namespace internal {
+
+template<typename TranspositionType, typename MatrixType, int Side, bool Transposed>
+struct traits<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >
+{
+  typedef typename MatrixType::PlainObject ReturnType;
+};
+
+template<typename TranspositionType, typename MatrixType, int Side, bool Transposed>
+struct transposition_matrix_product_retval
+ : public ReturnByValue<transposition_matrix_product_retval<TranspositionType, MatrixType, Side, Transposed> >
+{
+    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
+    typedef typename TranspositionType::Index Index;
+
+    transposition_matrix_product_retval(const TranspositionType& tr, const MatrixType& matrix)
+      : m_transpositions(tr), m_matrix(matrix)
+    {}
+
+    inline int rows() const { return m_matrix.rows(); }
+    inline int cols() const { return m_matrix.cols(); }
+
+    template<typename Dest> inline void evalTo(Dest& dst) const
+    {
+      const int size = m_transpositions.size();
+      Index j = 0;
+
+      if(!(is_same<MatrixTypeNestedCleaned,Dest>::value && extract_data(dst) == extract_data(m_matrix)))
+        dst = m_matrix;
+
+      for(int k=(Transposed?size-1:0) ; Transposed?k>=0:k<size ; Transposed?--k:++k)
+        if((j=m_transpositions.coeff(k))!=k)
+        {
+          if(Side==OnTheLeft)
+            dst.row(k).swap(dst.row(j));
+          else if(Side==OnTheRight)
+            dst.col(k).swap(dst.col(j));
+        }
+    }
+
+  protected:
+    const TranspositionType& m_transpositions;
+    typename MatrixType::Nested m_matrix;
+};
+
+} // end namespace internal
+
+/* Template partial specialization for transposed/inverse transpositions */
+
+template<typename TranspositionsDerived>
+class Transpose<TranspositionsBase<TranspositionsDerived> >
+{
+    typedef TranspositionsDerived TranspositionType;
+    typedef typename TranspositionType::IndicesType IndicesType;
+  public:
+
+    Transpose(const TranspositionType& t) : m_transpositions(t) {}
+
+    inline int size() const { return m_transpositions.size(); }
+
+    /** \returns the \a matrix with the inverse transpositions applied to the columns.
+      */
+    template<typename Derived> friend
+    inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>
+    operator*(const MatrixBase<Derived>& matrix, const Transpose& trt)
+    {
+      return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheRight, true>(trt.m_transpositions, matrix.derived());
+    }
+
+    /** \returns the \a matrix with the inverse transpositions applied to the rows.
+      */
+    template<typename Derived>
+    inline const internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>
+    operator*(const MatrixBase<Derived>& matrix) const
+    {
+      return internal::transposition_matrix_product_retval<TranspositionType, Derived, OnTheLeft, true>(m_transpositions, matrix.derived());
+    }
+
+  protected:
+    const TranspositionType& m_transpositions;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRANSPOSITIONS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/TriangularMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/TriangularMatrix.h
new file mode 100644
index 0000000..fba0736
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/TriangularMatrix.h
@@ -0,0 +1,830 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULARMATRIX_H
+#define EIGEN_TRIANGULARMATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+  
+template<int Side, typename TriangularType, typename Rhs> struct triangular_solve_retval;
+  
+}
+
+/** \internal
+  *
+  * \class TriangularBase
+  * \ingroup Core_Module
+  *
+  * \brief Base class for triangular part in a matrix
+  */
+template<typename Derived> class TriangularBase : public EigenBase<Derived>
+{
+  public:
+
+    enum {
+      Mode = internal::traits<Derived>::Mode,
+      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+      MaxRowsAtCompileTime = internal::traits<Derived>::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = internal::traits<Derived>::MaxColsAtCompileTime
+    };
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::traits<Derived>::DenseMatrixType DenseMatrixType;
+    typedef DenseMatrixType DenseType;
+
+    inline TriangularBase() { eigen_assert(!((Mode&UnitDiag) && (Mode&ZeroDiag))); }
+
+    inline Index rows() const { return derived().rows(); }
+    inline Index cols() const { return derived().cols(); }
+    inline Index outerStride() const { return derived().outerStride(); }
+    inline Index innerStride() const { return derived().innerStride(); }
+
+    inline Scalar coeff(Index row, Index col) const  { return derived().coeff(row,col); }
+    inline Scalar& coeffRef(Index row, Index col) { return derived().coeffRef(row,col); }
+
+    /** \see MatrixBase::copyCoeff(row,col)
+      */
+    template<typename Other>
+    EIGEN_STRONG_INLINE void copyCoeff(Index row, Index col, Other& other)
+    {
+      derived().coeffRef(row, col) = other.coeff(row, col);
+    }
+
+    inline Scalar operator()(Index row, Index col) const
+    {
+      check_coordinates(row, col);
+      return coeff(row,col);
+    }
+    inline Scalar& operator()(Index row, Index col)
+    {
+      check_coordinates(row, col);
+      return coeffRef(row,col);
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    inline Derived& derived() { return *static_cast<Derived*>(this); }
+    #endif // not EIGEN_PARSED_BY_DOXYGEN
+
+    template<typename DenseDerived>
+    void evalTo(MatrixBase<DenseDerived> &other) const;
+    template<typename DenseDerived>
+    void evalToLazy(MatrixBase<DenseDerived> &other) const;
+
+    DenseMatrixType toDenseMatrix() const
+    {
+      DenseMatrixType res(rows(), cols());
+      evalToLazy(res);
+      return res;
+    }
+
+  protected:
+
+    void check_coordinates(Index row, Index col) const
+    {
+      EIGEN_ONLY_USED_FOR_DEBUG(row);
+      EIGEN_ONLY_USED_FOR_DEBUG(col);
+      eigen_assert(col>=0 && col<cols() && row>=0 && row<rows());
+      const int mode = int(Mode) & ~SelfAdjoint;
+      EIGEN_ONLY_USED_FOR_DEBUG(mode);
+      eigen_assert((mode==Upper && col>=row)
+                || (mode==Lower && col<=row)
+                || ((mode==StrictlyUpper || mode==UnitUpper) && col>row)
+                || ((mode==StrictlyLower || mode==UnitLower) && col<row));
+    }
+
+    #ifdef EIGEN_INTERNAL_DEBUGGING
+    void check_coordinates_internal(Index row, Index col) const
+    {
+      check_coordinates(row, col);
+    }
+    #else
+    void check_coordinates_internal(Index , Index ) const {}
+    #endif
+
+};
+
+/** \class TriangularView
+  * \ingroup Core_Module
+  *
+  * \brief Base class for triangular part in a matrix
+  *
+  * \param MatrixType the type of the object in which we are taking the triangular part
+  * \param Mode the kind of triangular matrix expression to construct. Can be #Upper,
+  *             #Lower, #UnitUpper, #UnitLower, #StrictlyUpper, or #StrictlyLower.
+  *             This is in fact a bit field; it must have either #Upper or #Lower, 
+  *             and additionnaly it may have #UnitDiag or #ZeroDiag or neither.
+  *
+  * This class represents a triangular part of a matrix, not necessarily square. Strictly speaking, for rectangular
+  * matrices one should speak of "trapezoid" parts. This class is the return type
+  * of MatrixBase::triangularView() and most of the time this is the only way it is used.
+  *
+  * \sa MatrixBase::triangularView()
+  */
+namespace internal {
+template<typename MatrixType, unsigned int _Mode>
+struct traits<TriangularView<MatrixType, _Mode> > : traits<MatrixType>
+{
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;
+  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
+  typedef MatrixType ExpressionType;
+  typedef typename MatrixType::PlainObject DenseMatrixType;
+  enum {
+    Mode = _Mode,
+    Flags = (MatrixTypeNestedCleaned::Flags & (HereditaryBits) & (~(PacketAccessBit | DirectAccessBit | LinearAccessBit))) | Mode,
+    CoeffReadCost = MatrixTypeNestedCleaned::CoeffReadCost
+  };
+};
+}
+
+template<int Mode, bool LhsIsTriangular,
+         typename Lhs, bool LhsIsVector,
+         typename Rhs, bool RhsIsVector>
+struct TriangularProduct;
+
+template<typename _MatrixType, unsigned int _Mode> class TriangularView
+  : public TriangularBase<TriangularView<_MatrixType, _Mode> >
+{
+  public:
+
+    typedef TriangularBase<TriangularView> Base;
+    typedef typename internal::traits<TriangularView>::Scalar Scalar;
+
+    typedef _MatrixType MatrixType;
+    typedef typename internal::traits<TriangularView>::DenseMatrixType DenseMatrixType;
+    typedef DenseMatrixType PlainObject;
+
+  protected:
+    typedef typename internal::traits<TriangularView>::MatrixTypeNested MatrixTypeNested;
+    typedef typename internal::traits<TriangularView>::MatrixTypeNestedNonRef MatrixTypeNestedNonRef;
+    typedef typename internal::traits<TriangularView>::MatrixTypeNestedCleaned MatrixTypeNestedCleaned;
+
+    typedef typename internal::remove_all<typename MatrixType::ConjugateReturnType>::type MatrixConjugateReturnType;
+    
+  public:
+    using Base::evalToLazy;
+  
+
+    typedef typename internal::traits<TriangularView>::StorageKind StorageKind;
+    typedef typename internal::traits<TriangularView>::Index Index;
+
+    enum {
+      Mode = _Mode,
+      TransposeMode = (Mode & Upper ? Lower : 0)
+                    | (Mode & Lower ? Upper : 0)
+                    | (Mode & (UnitDiag))
+                    | (Mode & (ZeroDiag))
+    };
+
+    inline TriangularView(const MatrixType& matrix) : m_matrix(matrix)
+    {}
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    inline Index outerStride() const { return m_matrix.outerStride(); }
+    inline Index innerStride() const { return m_matrix.innerStride(); }
+
+    /** \sa MatrixBase::operator+=() */
+    template<typename Other> TriangularView&  operator+=(const DenseBase<Other>& other) { return *this = m_matrix + other.derived(); }
+    /** \sa MatrixBase::operator-=() */
+    template<typename Other> TriangularView&  operator-=(const DenseBase<Other>& other) { return *this = m_matrix - other.derived(); }
+    /** \sa MatrixBase::operator*=() */
+    TriangularView&  operator*=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix * other; }
+    /** \sa MatrixBase::operator/=() */
+    TriangularView&  operator/=(const typename internal::traits<MatrixType>::Scalar& other) { return *this = m_matrix / other; }
+
+    /** \sa MatrixBase::fill() */
+    void fill(const Scalar& value) { setConstant(value); }
+    /** \sa MatrixBase::setConstant() */
+    TriangularView& setConstant(const Scalar& value)
+    { return *this = MatrixType::Constant(rows(), cols(), value); }
+    /** \sa MatrixBase::setZero() */
+    TriangularView& setZero() { return setConstant(Scalar(0)); }
+    /** \sa MatrixBase::setOnes() */
+    TriangularView& setOnes() { return setConstant(Scalar(1)); }
+
+    /** \sa MatrixBase::coeff()
+      * \warning the coordinates must fit into the referenced triangular part
+      */
+    inline Scalar coeff(Index row, Index col) const
+    {
+      Base::check_coordinates_internal(row, col);
+      return m_matrix.coeff(row, col);
+    }
+
+    /** \sa MatrixBase::coeffRef()
+      * \warning the coordinates must fit into the referenced triangular part
+      */
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      Base::check_coordinates_internal(row, col);
+      return m_matrix.const_cast_derived().coeffRef(row, col);
+    }
+
+    const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
+    MatrixTypeNestedCleaned& nestedExpression() { return *const_cast<MatrixTypeNestedCleaned*>(&m_matrix); }
+
+    /** Assigns a triangular matrix to a triangular part of a dense matrix */
+    template<typename OtherDerived>
+    TriangularView& operator=(const TriangularBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    TriangularView& operator=(const MatrixBase<OtherDerived>& other);
+
+    TriangularView& operator=(const TriangularView& other)
+    { return *this = other.nestedExpression(); }
+
+    template<typename OtherDerived>
+    void lazyAssign(const TriangularBase<OtherDerived>& other);
+
+    template<typename OtherDerived>
+    void lazyAssign(const MatrixBase<OtherDerived>& other);
+
+    /** \sa MatrixBase::conjugate() */
+    inline TriangularView<MatrixConjugateReturnType,Mode> conjugate()
+    { return m_matrix.conjugate(); }
+    /** \sa MatrixBase::conjugate() const */
+    inline const TriangularView<MatrixConjugateReturnType,Mode> conjugate() const
+    { return m_matrix.conjugate(); }
+
+    /** \sa MatrixBase::adjoint() const */
+    inline const TriangularView<const typename MatrixType::AdjointReturnType,TransposeMode> adjoint() const
+    { return m_matrix.adjoint(); }
+
+    /** \sa MatrixBase::transpose() */
+    inline TriangularView<Transpose<MatrixType>,TransposeMode> transpose()
+    {
+      EIGEN_STATIC_ASSERT_LVALUE(MatrixType)
+      return m_matrix.const_cast_derived().transpose();
+    }
+    /** \sa MatrixBase::transpose() const */
+    inline const TriangularView<Transpose<MatrixType>,TransposeMode> transpose() const
+    {
+      return m_matrix.transpose();
+    }
+
+    /** Efficient triangular matrix times vector/matrix product */
+    template<typename OtherDerived>
+    TriangularProduct<Mode,true,MatrixType,false,OtherDerived, OtherDerived::IsVectorAtCompileTime>
+    operator*(const MatrixBase<OtherDerived>& rhs) const
+    {
+      return TriangularProduct
+              <Mode,true,MatrixType,false,OtherDerived,OtherDerived::IsVectorAtCompileTime>
+              (m_matrix, rhs.derived());
+    }
+
+    /** Efficient vector/matrix times triangular matrix product */
+    template<typename OtherDerived> friend
+    TriangularProduct<Mode,false,OtherDerived,OtherDerived::IsVectorAtCompileTime,MatrixType,false>
+    operator*(const MatrixBase<OtherDerived>& lhs, const TriangularView& rhs)
+    {
+      return TriangularProduct
+              <Mode,false,OtherDerived,OtherDerived::IsVectorAtCompileTime,MatrixType,false>
+              (lhs.derived(),rhs.m_matrix);
+    }
+
+    #ifdef EIGEN2_SUPPORT
+    template<typename OtherDerived>
+    struct eigen2_product_return_type
+    {
+      typedef typename TriangularView<MatrixType,Mode>::DenseMatrixType DenseMatrixType;
+      typedef typename OtherDerived::PlainObject::DenseType OtherPlainObject;
+      typedef typename ProductReturnType<DenseMatrixType, OtherPlainObject>::Type ProdRetType;
+      typedef typename ProdRetType::PlainObject type;
+    };
+    template<typename OtherDerived>
+    const typename eigen2_product_return_type<OtherDerived>::type
+    operator*(const EigenBase<OtherDerived>& rhs) const
+    {
+      typename OtherDerived::PlainObject::DenseType rhsPlainObject;
+      rhs.evalTo(rhsPlainObject);
+      return this->toDenseMatrix() * rhsPlainObject;
+    }
+    template<typename OtherMatrixType>
+    bool isApprox(const TriangularView<OtherMatrixType, Mode>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
+    {
+      return this->toDenseMatrix().isApprox(other.toDenseMatrix(), precision);
+    }
+    template<typename OtherDerived>
+    bool isApprox(const MatrixBase<OtherDerived>& other, typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision()) const
+    {
+      return this->toDenseMatrix().isApprox(other, precision);
+    }
+    #endif // EIGEN2_SUPPORT
+
+    template<int Side, typename Other>
+    inline const internal::triangular_solve_retval<Side,TriangularView, Other>
+    solve(const MatrixBase<Other>& other) const;
+
+    template<int Side, typename OtherDerived>
+    void solveInPlace(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename Other>
+    inline const internal::triangular_solve_retval<OnTheLeft,TriangularView, Other> 
+    solve(const MatrixBase<Other>& other) const
+    { return solve<OnTheLeft>(other); }
+
+    template<typename OtherDerived>
+    void solveInPlace(const MatrixBase<OtherDerived>& other) const
+    { return solveInPlace<OnTheLeft>(other); }
+
+    const SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView() const
+    {
+      EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);
+      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
+    }
+    SelfAdjointView<MatrixTypeNestedNonRef,Mode> selfadjointView()
+    {
+      EIGEN_STATIC_ASSERT((Mode&UnitDiag)==0,PROGRAMMING_ERROR);
+      return SelfAdjointView<MatrixTypeNestedNonRef,Mode>(m_matrix);
+    }
+
+    template<typename OtherDerived>
+    void swap(TriangularBase<OtherDerived> const & other)
+    {
+      TriangularView<SwapWrapper<MatrixType>,Mode>(const_cast<MatrixType&>(m_matrix)).lazyAssign(other.derived());
+    }
+
+    template<typename OtherDerived>
+    void swap(MatrixBase<OtherDerived> const & other)
+    {
+      SwapWrapper<MatrixType> swaper(const_cast<MatrixType&>(m_matrix));
+      TriangularView<SwapWrapper<MatrixType>,Mode>(swaper).lazyAssign(other.derived());
+    }
+
+    Scalar determinant() const
+    {
+      if (Mode & UnitDiag)
+        return 1;
+      else if (Mode & ZeroDiag)
+        return 0;
+      else
+        return m_matrix.diagonal().prod();
+    }
+    
+    // TODO simplify the following:
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE TriangularView& operator=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+    {
+      setZero();
+      return assignProduct(other,1);
+    }
+    
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE TriangularView& operator+=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+    {
+      return assignProduct(other,1);
+    }
+    
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE TriangularView& operator-=(const ProductBase<ProductDerived, Lhs,Rhs>& other)
+    {
+      return assignProduct(other,-1);
+    }
+    
+    
+    template<typename ProductDerived>
+    EIGEN_STRONG_INLINE TriangularView& operator=(const ScaledProduct<ProductDerived>& other)
+    {
+      setZero();
+      return assignProduct(other,other.alpha());
+    }
+    
+    template<typename ProductDerived>
+    EIGEN_STRONG_INLINE TriangularView& operator+=(const ScaledProduct<ProductDerived>& other)
+    {
+      return assignProduct(other,other.alpha());
+    }
+    
+    template<typename ProductDerived>
+    EIGEN_STRONG_INLINE TriangularView& operator-=(const ScaledProduct<ProductDerived>& other)
+    {
+      return assignProduct(other,-other.alpha());
+    }
+    
+  protected:
+    
+    template<typename ProductDerived, typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE TriangularView& assignProduct(const ProductBase<ProductDerived, Lhs,Rhs>& prod, const Scalar& alpha);
+
+    MatrixTypeNested m_matrix;
+};
+
+/***************************************************************************
+* Implementation of triangular evaluation/assignment
+***************************************************************************/
+
+namespace internal {
+
+template<typename Derived1, typename Derived2, unsigned int Mode, int UnrollCount, bool ClearOpposite>
+struct triangular_assignment_selector
+{
+  enum {
+    col = (UnrollCount-1) / Derived1::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived1::RowsAtCompileTime
+  };
+  
+  typedef typename Derived1::Scalar Scalar;
+
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    triangular_assignment_selector<Derived1, Derived2, Mode, UnrollCount-1, ClearOpposite>::run(dst, src);
+
+    eigen_assert( Mode == Upper || Mode == Lower
+            || Mode == StrictlyUpper || Mode == StrictlyLower
+            || Mode == UnitUpper || Mode == UnitLower);
+    if((Mode == Upper && row <= col)
+    || (Mode == Lower && row >= col)
+    || (Mode == StrictlyUpper && row < col)
+    || (Mode == StrictlyLower && row > col)
+    || (Mode == UnitUpper && row < col)
+    || (Mode == UnitLower && row > col))
+      dst.copyCoeff(row, col, src);
+    else if(ClearOpposite)
+    {
+      if (Mode&UnitDiag && row==col)
+        dst.coeffRef(row, col) = Scalar(1);
+      else
+        dst.coeffRef(row, col) = Scalar(0);
+    }
+  }
+};
+
+// prevent buggy user code from causing an infinite recursion
+template<typename Derived1, typename Derived2, unsigned int Mode, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, Mode, 0, ClearOpposite>
+{
+  static inline void run(Derived1 &, const Derived2 &) {}
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, Upper, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  typedef typename Derived1::Scalar Scalar;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      Index maxi = (std::min)(j, dst.rows()-1);
+      for(Index i = 0; i <= maxi; ++i)
+        dst.copyCoeff(i, j, src);
+      if (ClearOpposite)
+        for(Index i = maxi+1; i < dst.rows(); ++i)
+          dst.coeffRef(i, j) = Scalar(0);
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, Lower, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      for(Index i = j; i < dst.rows(); ++i)
+        dst.copyCoeff(i, j, src);
+      Index maxi = (std::min)(j, dst.rows());
+      if (ClearOpposite)
+        for(Index i = 0; i < maxi; ++i)
+          dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, StrictlyUpper, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  typedef typename Derived1::Scalar Scalar;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      Index maxi = (std::min)(j, dst.rows());
+      for(Index i = 0; i < maxi; ++i)
+        dst.copyCoeff(i, j, src);
+      if (ClearOpposite)
+        for(Index i = maxi; i < dst.rows(); ++i)
+          dst.coeffRef(i, j) = Scalar(0);
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, StrictlyLower, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      for(Index i = j+1; i < dst.rows(); ++i)
+        dst.copyCoeff(i, j, src);
+      Index maxi = (std::min)(j, dst.rows()-1);
+      if (ClearOpposite)
+        for(Index i = 0; i <= maxi; ++i)
+          dst.coeffRef(i, j) = static_cast<typename Derived1::Scalar>(0);
+    }
+  }
+};
+
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, UnitUpper, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      Index maxi = (std::min)(j, dst.rows());
+      for(Index i = 0; i < maxi; ++i)
+        dst.copyCoeff(i, j, src);
+      if (ClearOpposite)
+      {
+        for(Index i = maxi+1; i < dst.rows(); ++i)
+          dst.coeffRef(i, j) = 0;
+      }
+    }
+    dst.diagonal().setOnes();
+  }
+};
+template<typename Derived1, typename Derived2, bool ClearOpposite>
+struct triangular_assignment_selector<Derived1, Derived2, UnitLower, Dynamic, ClearOpposite>
+{
+  typedef typename Derived1::Index Index;
+  static inline void run(Derived1 &dst, const Derived2 &src)
+  {
+    for(Index j = 0; j < dst.cols(); ++j)
+    {
+      Index maxi = (std::min)(j, dst.rows());
+      for(Index i = maxi+1; i < dst.rows(); ++i)
+        dst.copyCoeff(i, j, src);
+      if (ClearOpposite)
+      {
+        for(Index i = 0; i < maxi; ++i)
+          dst.coeffRef(i, j) = 0;
+      }
+    }
+    dst.diagonal().setOnes();
+  }
+};
+
+} // end namespace internal
+
+// FIXME should we keep that possibility
+template<typename MatrixType, unsigned int Mode>
+template<typename OtherDerived>
+inline TriangularView<MatrixType, Mode>&
+TriangularView<MatrixType, Mode>::operator=(const MatrixBase<OtherDerived>& other)
+{
+  if(OtherDerived::Flags & EvalBeforeAssigningBit)
+  {
+    typename internal::plain_matrix_type<OtherDerived>::type other_evaluated(other.rows(), other.cols());
+    other_evaluated.template triangularView<Mode>().lazyAssign(other.derived());
+    lazyAssign(other_evaluated);
+  }
+  else
+    lazyAssign(other.derived());
+  return *this;
+}
+
+// FIXME should we keep that possibility
+template<typename MatrixType, unsigned int Mode>
+template<typename OtherDerived>
+void TriangularView<MatrixType, Mode>::lazyAssign(const MatrixBase<OtherDerived>& other)
+{
+  enum {
+    unroll = MatrixType::SizeAtCompileTime != Dynamic
+          && internal::traits<OtherDerived>::CoeffReadCost != Dynamic
+          && MatrixType::SizeAtCompileTime*internal::traits<OtherDerived>::CoeffReadCost/2 <= EIGEN_UNROLLING_LIMIT
+  };
+  eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
+
+  internal::triangular_assignment_selector
+    <MatrixType, OtherDerived, int(Mode),
+    unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,
+    false // do not change the opposite triangular part
+    >::run(m_matrix.const_cast_derived(), other.derived());
+}
+
+
+
+template<typename MatrixType, unsigned int Mode>
+template<typename OtherDerived>
+inline TriangularView<MatrixType, Mode>&
+TriangularView<MatrixType, Mode>::operator=(const TriangularBase<OtherDerived>& other)
+{
+  eigen_assert(Mode == int(OtherDerived::Mode));
+  if(internal::traits<OtherDerived>::Flags & EvalBeforeAssigningBit)
+  {
+    typename OtherDerived::DenseMatrixType other_evaluated(other.rows(), other.cols());
+    other_evaluated.template triangularView<Mode>().lazyAssign(other.derived().nestedExpression());
+    lazyAssign(other_evaluated);
+  }
+  else
+    lazyAssign(other.derived().nestedExpression());
+  return *this;
+}
+
+template<typename MatrixType, unsigned int Mode>
+template<typename OtherDerived>
+void TriangularView<MatrixType, Mode>::lazyAssign(const TriangularBase<OtherDerived>& other)
+{
+  enum {
+    unroll = MatrixType::SizeAtCompileTime != Dynamic
+                   && internal::traits<OtherDerived>::CoeffReadCost != Dynamic
+                   && MatrixType::SizeAtCompileTime * internal::traits<OtherDerived>::CoeffReadCost / 2
+                        <= EIGEN_UNROLLING_LIMIT
+  };
+  eigen_assert(m_matrix.rows() == other.rows() && m_matrix.cols() == other.cols());
+
+  internal::triangular_assignment_selector
+    <MatrixType, OtherDerived, int(Mode),
+    unroll ? int(MatrixType::SizeAtCompileTime) : Dynamic,
+    false // preserve the opposite triangular part
+    >::run(m_matrix.const_cast_derived(), other.derived().nestedExpression());
+}
+
+/***************************************************************************
+* Implementation of TriangularBase methods
+***************************************************************************/
+
+/** Assigns a triangular or selfadjoint matrix to a dense matrix.
+  * If the matrix is triangular, the opposite part is set to zero. */
+template<typename Derived>
+template<typename DenseDerived>
+void TriangularBase<Derived>::evalTo(MatrixBase<DenseDerived> &other) const
+{
+  if(internal::traits<Derived>::Flags & EvalBeforeAssigningBit)
+  {
+    typename internal::plain_matrix_type<Derived>::type other_evaluated(rows(), cols());
+    evalToLazy(other_evaluated);
+    other.derived().swap(other_evaluated);
+  }
+  else
+    evalToLazy(other.derived());
+}
+
+/** Assigns a triangular or selfadjoint matrix to a dense matrix.
+  * If the matrix is triangular, the opposite part is set to zero. */
+template<typename Derived>
+template<typename DenseDerived>
+void TriangularBase<Derived>::evalToLazy(MatrixBase<DenseDerived> &other) const
+{
+  enum {
+    unroll = DenseDerived::SizeAtCompileTime != Dynamic
+                   && internal::traits<Derived>::CoeffReadCost != Dynamic
+                   && DenseDerived::SizeAtCompileTime * internal::traits<Derived>::CoeffReadCost / 2
+                        <= EIGEN_UNROLLING_LIMIT
+  };
+  other.derived().resize(this->rows(), this->cols());
+
+  internal::triangular_assignment_selector
+    <DenseDerived, typename internal::traits<Derived>::MatrixTypeNestedCleaned, Derived::Mode,
+    unroll ? int(DenseDerived::SizeAtCompileTime) : Dynamic,
+    true // clear the opposite triangular part
+    >::run(other.derived(), derived().nestedExpression());
+}
+
+/***************************************************************************
+* Implementation of TriangularView methods
+***************************************************************************/
+
+/***************************************************************************
+* Implementation of MatrixBase methods
+***************************************************************************/
+
+#ifdef EIGEN2_SUPPORT
+
+// implementation of part<>(), including the SelfAdjoint case.
+
+namespace internal {
+template<typename MatrixType, unsigned int Mode>
+struct eigen2_part_return_type
+{
+  typedef TriangularView<MatrixType, Mode> type;
+};
+
+template<typename MatrixType>
+struct eigen2_part_return_type<MatrixType, SelfAdjoint>
+{
+  typedef SelfAdjointView<MatrixType, Upper> type;
+};
+}
+
+/** \deprecated use MatrixBase::triangularView() */
+template<typename Derived>
+template<unsigned int Mode>
+const typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part() const
+{
+  return derived();
+}
+
+/** \deprecated use MatrixBase::triangularView() */
+template<typename Derived>
+template<unsigned int Mode>
+typename internal::eigen2_part_return_type<Derived, Mode>::type MatrixBase<Derived>::part()
+{
+  return derived();
+}
+#endif
+
+/**
+  * \returns an expression of a triangular view extracted from the current matrix
+  *
+  * The parameter \a Mode can have the following values: \c #Upper, \c #StrictlyUpper, \c #UnitUpper,
+  * \c #Lower, \c #StrictlyLower, \c #UnitLower.
+  *
+  * Example: \include MatrixBase_extract.cpp
+  * Output: \verbinclude MatrixBase_extract.out
+  *
+  * \sa class TriangularView
+  */
+template<typename Derived>
+template<unsigned int Mode>
+typename MatrixBase<Derived>::template TriangularViewReturnType<Mode>::Type
+MatrixBase<Derived>::triangularView()
+{
+  return derived();
+}
+
+/** This is the const version of MatrixBase::triangularView() */
+template<typename Derived>
+template<unsigned int Mode>
+typename MatrixBase<Derived>::template ConstTriangularViewReturnType<Mode>::Type
+MatrixBase<Derived>::triangularView() const
+{
+  return derived();
+}
+
+/** \returns true if *this is approximately equal to an upper triangular matrix,
+  *          within the precision given by \a prec.
+  *
+  * \sa isLowerTriangular()
+  */
+template<typename Derived>
+bool MatrixBase<Derived>::isUpperTriangular(const RealScalar& prec) const
+{
+  using std::abs;
+  RealScalar maxAbsOnUpperPart = static_cast<RealScalar>(-1);
+  for(Index j = 0; j < cols(); ++j)
+  {
+    Index maxi = (std::min)(j, rows()-1);
+    for(Index i = 0; i <= maxi; ++i)
+    {
+      RealScalar absValue = abs(coeff(i,j));
+      if(absValue > maxAbsOnUpperPart) maxAbsOnUpperPart = absValue;
+    }
+  }
+  RealScalar threshold = maxAbsOnUpperPart * prec;
+  for(Index j = 0; j < cols(); ++j)
+    for(Index i = j+1; i < rows(); ++i)
+      if(abs(coeff(i, j)) > threshold) return false;
+  return true;
+}
+
+/** \returns true if *this is approximately equal to a lower triangular matrix,
+  *          within the precision given by \a prec.
+  *
+  * \sa isUpperTriangular()
+  */
+template<typename Derived>
+bool MatrixBase<Derived>::isLowerTriangular(const RealScalar& prec) const
+{
+  using std::abs;
+  RealScalar maxAbsOnLowerPart = static_cast<RealScalar>(-1);
+  for(Index j = 0; j < cols(); ++j)
+    for(Index i = j; i < rows(); ++i)
+    {
+      RealScalar absValue = abs(coeff(i,j));
+      if(absValue > maxAbsOnLowerPart) maxAbsOnLowerPart = absValue;
+    }
+  RealScalar threshold = maxAbsOnLowerPart * prec;
+  for(Index j = 1; j < cols(); ++j)
+  {
+    Index maxi = (std::min)(j, rows()-1);
+    for(Index i = 0; i < maxi; ++i)
+      if(abs(coeff(i, j)) > threshold) return false;
+  }
+  return true;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULARMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/VectorBlock.h b/vendor/eigen-3.1.91/Eigen/src/Core/VectorBlock.h
new file mode 100644
index 0000000..1a7330f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/VectorBlock.h
@@ -0,0 +1,95 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_VECTORBLOCK_H
+#define EIGEN_VECTORBLOCK_H
+
+namespace Eigen { 
+
+/** \class VectorBlock
+  * \ingroup Core_Module
+  *
+  * \brief Expression of a fixed-size or dynamic-size sub-vector
+  *
+  * \param VectorType the type of the object in which we are taking a sub-vector
+  * \param Size size of the sub-vector we are taking at compile time (optional)
+  *
+  * This class represents an expression of either a fixed-size or dynamic-size sub-vector.
+  * It is the return type of DenseBase::segment(Index,Index) and DenseBase::segment<int>(Index) and
+  * most of the time this is the only way it is used.
+  *
+  * However, if you want to directly maniputate sub-vector expressions,
+  * for instance if you want to write a function returning such an expression, you
+  * will need to use this class.
+  *
+  * Here is an example illustrating the dynamic case:
+  * \include class_VectorBlock.cpp
+  * Output: \verbinclude class_VectorBlock.out
+  *
+  * \note Even though this expression has dynamic size, in the case where \a VectorType
+  * has fixed size, this expression inherits a fixed maximal size which means that evaluating
+  * it does not cause a dynamic memory allocation.
+  *
+  * Here is an example illustrating the fixed-size case:
+  * \include class_FixedVectorBlock.cpp
+  * Output: \verbinclude class_FixedVectorBlock.out
+  *
+  * \sa class Block, DenseBase::segment(Index,Index,Index,Index), DenseBase::segment(Index,Index)
+  */
+
+namespace internal {
+template<typename VectorType, int Size>
+struct traits<VectorBlock<VectorType, Size> >
+  : public traits<Block<VectorType,
+                     traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                     traits<VectorType>::Flags & RowMajorBit ? Size : 1> >
+{
+};
+}
+
+template<typename VectorType, int Size> class VectorBlock
+  : public Block<VectorType,
+                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1>
+{
+    typedef Block<VectorType,
+                     internal::traits<VectorType>::Flags & RowMajorBit ? 1 : Size,
+                     internal::traits<VectorType>::Flags & RowMajorBit ? Size : 1> Base;
+    enum {
+      IsColVector = !(internal::traits<VectorType>::Flags & RowMajorBit)
+    };
+  public:
+    EIGEN_DENSE_PUBLIC_INTERFACE(VectorBlock)
+
+    using Base::operator=;
+
+    /** Dynamic-size constructor
+      */
+    inline VectorBlock(VectorType& vector, Index start, Index size)
+      : Base(vector,
+             IsColVector ? start : 0, IsColVector ? 0 : start,
+             IsColVector ? size  : 1, IsColVector ? 1 : size)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
+    }
+
+    /** Fixed-size constructor
+      */
+    inline VectorBlock(VectorType& vector, Index start)
+      : Base(vector, IsColVector ? start : 0, IsColVector ? 0 : start)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorBlock);
+    }
+};
+
+
+} // end namespace Eigen
+
+#endif // EIGEN_VECTORBLOCK_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/VectorwiseOp.h b/vendor/eigen-3.1.91/Eigen/src/Core/VectorwiseOp.h
new file mode 100644
index 0000000..5115648
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/VectorwiseOp.h
@@ -0,0 +1,641 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PARTIAL_REDUX_H
+#define EIGEN_PARTIAL_REDUX_H
+
+namespace Eigen { 
+
+/** \class PartialReduxExpr
+  * \ingroup Core_Module
+  *
+  * \brief Generic expression of a partially reduxed matrix
+  *
+  * \tparam MatrixType the type of the matrix we are applying the redux operation
+  * \tparam MemberOp type of the member functor
+  * \tparam Direction indicates the direction of the redux (#Vertical or #Horizontal)
+  *
+  * This class represents an expression of a partial redux operator of a matrix.
+  * It is the return type of some VectorwiseOp functions,
+  * and most of the time this is the only way it is used.
+  *
+  * \sa class VectorwiseOp
+  */
+
+template< typename MatrixType, typename MemberOp, int Direction>
+class PartialReduxExpr;
+
+namespace internal {
+template<typename MatrixType, typename MemberOp, int Direction>
+struct traits<PartialReduxExpr<MatrixType, MemberOp, Direction> >
+ : traits<MatrixType>
+{
+  typedef typename MemberOp::result_type Scalar;
+  typedef typename traits<MatrixType>::StorageKind StorageKind;
+  typedef typename traits<MatrixType>::XprKind XprKind;
+  typedef typename MatrixType::Scalar InputScalar;
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_all<MatrixTypeNested>::type _MatrixTypeNested;
+  enum {
+    RowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = Direction==Vertical   ? 1 : MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = Direction==Horizontal ? 1 : MatrixType::MaxColsAtCompileTime,
+    Flags0 = (unsigned int)_MatrixTypeNested::Flags & HereditaryBits,
+    Flags = (Flags0 & ~RowMajorBit) | (RowsAtCompileTime == 1 ? RowMajorBit : 0),
+    TraversalSize = Direction==Vertical ? RowsAtCompileTime : ColsAtCompileTime
+  };
+  #if EIGEN_GNUC_AT_LEAST(3,4)
+  typedef typename MemberOp::template Cost<InputScalar,int(TraversalSize)> CostOpType;
+  #else
+  typedef typename MemberOp::template Cost<InputScalar,TraversalSize> CostOpType;
+  #endif
+  enum {
+    CoeffReadCost = TraversalSize * traits<_MatrixTypeNested>::CoeffReadCost + int(CostOpType::value)
+  };
+};
+}
+
+template< typename MatrixType, typename MemberOp, int Direction>
+class PartialReduxExpr : internal::no_assignment_operator,
+  public internal::dense_xpr_base< PartialReduxExpr<MatrixType, MemberOp, Direction> >::type
+{
+  public:
+
+    typedef typename internal::dense_xpr_base<PartialReduxExpr>::type Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(PartialReduxExpr)
+    typedef typename internal::traits<PartialReduxExpr>::MatrixTypeNested MatrixTypeNested;
+    typedef typename internal::traits<PartialReduxExpr>::_MatrixTypeNested _MatrixTypeNested;
+
+    PartialReduxExpr(const MatrixType& mat, const MemberOp& func = MemberOp())
+      : m_matrix(mat), m_functor(func) {}
+
+    Index rows() const { return (Direction==Vertical   ? 1 : m_matrix.rows()); }
+    Index cols() const { return (Direction==Horizontal ? 1 : m_matrix.cols()); }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index i, Index j) const
+    {
+      if (Direction==Vertical)
+        return m_functor(m_matrix.col(j));
+      else
+        return m_functor(m_matrix.row(i));
+    }
+
+    const Scalar coeff(Index index) const
+    {
+      if (Direction==Vertical)
+        return m_functor(m_matrix.col(index));
+      else
+        return m_functor(m_matrix.row(index));
+    }
+
+  protected:
+    MatrixTypeNested m_matrix;
+    const MemberOp m_functor;
+};
+
+#define EIGEN_MEMBER_FUNCTOR(MEMBER,COST)                               \
+  template <typename ResultType>                                        \
+  struct member_##MEMBER {                                              \
+    EIGEN_EMPTY_STRUCT_CTOR(member_##MEMBER)                            \
+    typedef ResultType result_type;                                     \
+    template<typename Scalar, int Size> struct Cost                     \
+    { enum { value = COST }; };                                         \
+    template<typename XprType>                                          \
+    EIGEN_STRONG_INLINE ResultType operator()(const XprType& mat) const \
+    { return mat.MEMBER(); } \
+  }
+
+namespace internal {
+
+EIGEN_MEMBER_FUNCTOR(squaredNorm, Size * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(norm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(stableNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(blueNorm, (Size+5) * NumTraits<Scalar>::MulCost + (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(hypotNorm, (Size-1) * functor_traits<scalar_hypot_op<Scalar> >::Cost );
+EIGEN_MEMBER_FUNCTOR(sum, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(mean, (Size-1)*NumTraits<Scalar>::AddCost + NumTraits<Scalar>::MulCost);
+EIGEN_MEMBER_FUNCTOR(minCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(maxCoeff, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(all, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(any, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(count, (Size-1)*NumTraits<Scalar>::AddCost);
+EIGEN_MEMBER_FUNCTOR(prod, (Size-1)*NumTraits<Scalar>::MulCost);
+
+
+template <typename BinaryOp, typename Scalar>
+struct member_redux {
+  typedef typename result_of<
+                     BinaryOp(Scalar)
+                   >::type  result_type;
+  template<typename _Scalar, int Size> struct Cost
+  { enum { value = (Size-1) * functor_traits<BinaryOp>::Cost }; };
+  member_redux(const BinaryOp func) : m_functor(func) {}
+  template<typename Derived>
+  inline result_type operator()(const DenseBase<Derived>& mat) const
+  { return mat.redux(m_functor); }
+  const BinaryOp m_functor;
+};
+}
+
+/** \class VectorwiseOp
+  * \ingroup Core_Module
+  *
+  * \brief Pseudo expression providing partial reduction operations
+  *
+  * \param ExpressionType the type of the object on which to do partial reductions
+  * \param Direction indicates the direction of the redux (#Vertical or #Horizontal)
+  *
+  * This class represents a pseudo expression with partial reduction features.
+  * It is the return type of DenseBase::colwise() and DenseBase::rowwise()
+  * and most of the time this is the only way it is used.
+  *
+  * Example: \include MatrixBase_colwise.cpp
+  * Output: \verbinclude MatrixBase_colwise.out
+  *
+  * \sa DenseBase::colwise(), DenseBase::rowwise(), class PartialReduxExpr
+  */
+template<typename ExpressionType, int Direction> class VectorwiseOp
+{
+  public:
+
+    typedef typename ExpressionType::Scalar Scalar;
+    typedef typename ExpressionType::RealScalar RealScalar;
+    typedef typename ExpressionType::Index Index;
+    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
+        ExpressionType, ExpressionType&>::type ExpressionTypeNested;
+    typedef typename internal::remove_all<ExpressionTypeNested>::type ExpressionTypeNestedCleaned;
+
+    template<template<typename _Scalar> class Functor,
+                      typename Scalar=typename internal::traits<ExpressionType>::Scalar> struct ReturnType
+    {
+      typedef PartialReduxExpr<ExpressionType,
+                               Functor<Scalar>,
+                               Direction
+                              > Type;
+    };
+
+    template<typename BinaryOp> struct ReduxReturnType
+    {
+      typedef PartialReduxExpr<ExpressionType,
+                               internal::member_redux<BinaryOp,typename internal::traits<ExpressionType>::Scalar>,
+                               Direction
+                              > Type;
+    };
+
+    enum {
+      IsVertical   = (Direction==Vertical) ? 1 : 0,
+      IsHorizontal = (Direction==Horizontal) ? 1 : 0
+    };
+
+  protected:
+
+    /** \internal
+      * \returns the i-th subvector according to the \c Direction */
+    typedef typename internal::conditional<Direction==Vertical,
+                               typename ExpressionType::ColXpr,
+                               typename ExpressionType::RowXpr>::type SubVector;
+    SubVector subVector(Index i)
+    {
+      return SubVector(m_matrix.derived(),i);
+    }
+
+    /** \internal
+      * \returns the number of subvectors in the direction \c Direction */
+    Index subVectors() const
+    { return Direction==Vertical?m_matrix.cols():m_matrix.rows(); }
+
+    template<typename OtherDerived> struct ExtendedType {
+      typedef Replicate<OtherDerived,
+                        Direction==Vertical   ? 1 : ExpressionType::RowsAtCompileTime,
+                        Direction==Horizontal ? 1 : ExpressionType::ColsAtCompileTime> Type;
+    };
+
+    /** \internal
+      * Replicates a vector to match the size of \c *this */
+    template<typename OtherDerived>
+    typename ExtendedType<OtherDerived>::Type
+    extendedTo(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxColsAtCompileTime==1),
+                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
+      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxRowsAtCompileTime==1),
+                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
+      return typename ExtendedType<OtherDerived>::Type
+                      (other.derived(),
+                       Direction==Vertical   ? 1 : m_matrix.rows(),
+                       Direction==Horizontal ? 1 : m_matrix.cols());
+    }
+    
+    template<typename OtherDerived> struct OppositeExtendedType {
+      typedef Replicate<OtherDerived,
+                        Direction==Horizontal ? 1 : ExpressionType::RowsAtCompileTime,
+                        Direction==Vertical   ? 1 : ExpressionType::ColsAtCompileTime> Type;
+    };
+
+    /** \internal
+      * Replicates a vector in the opposite direction to match the size of \c *this */
+    template<typename OtherDerived>
+    typename OppositeExtendedType<OtherDerived>::Type
+    extendedToOpposite(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Horizontal, OtherDerived::MaxColsAtCompileTime==1),
+                          YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED)
+      EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(Direction==Vertical, OtherDerived::MaxRowsAtCompileTime==1),
+                          YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED)
+      return typename OppositeExtendedType<OtherDerived>::Type
+                      (other.derived(),
+                       Direction==Horizontal  ? 1 : m_matrix.rows(),
+                       Direction==Vertical    ? 1 : m_matrix.cols());
+    }
+
+  public:
+
+    inline VectorwiseOp(ExpressionType& matrix) : m_matrix(matrix) {}
+
+    /** \internal */
+    inline const ExpressionType& _expression() const { return m_matrix; }
+
+    /** \returns a row or column vector expression of \c *this reduxed by \a func
+      *
+      * The template parameter \a BinaryOp is the type of the functor
+      * of the custom redux operator. Note that func must be an associative operator.
+      *
+      * \sa class VectorwiseOp, DenseBase::colwise(), DenseBase::rowwise()
+      */
+    template<typename BinaryOp>
+    const typename ReduxReturnType<BinaryOp>::Type
+    redux(const BinaryOp& func = BinaryOp()) const
+    { return typename ReduxReturnType<BinaryOp>::Type(_expression(), func); }
+
+    /** \returns a row (or column) vector expression of the smallest coefficient
+      * of each column (or row) of the referenced expression.
+      * 
+      * \warning the result is undefined if \c *this contains NaN.
+      *
+      * Example: \include PartialRedux_minCoeff.cpp
+      * Output: \verbinclude PartialRedux_minCoeff.out
+      *
+      * \sa DenseBase::minCoeff() */
+    const typename ReturnType<internal::member_minCoeff>::Type minCoeff() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the largest coefficient
+      * of each column (or row) of the referenced expression.
+      * 
+      * \warning the result is undefined if \c *this contains NaN.
+      *
+      * Example: \include PartialRedux_maxCoeff.cpp
+      * Output: \verbinclude PartialRedux_maxCoeff.out
+      *
+      * \sa DenseBase::maxCoeff() */
+    const typename ReturnType<internal::member_maxCoeff>::Type maxCoeff() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the squared norm
+      * of each column (or row) of the referenced expression.
+      *
+      * Example: \include PartialRedux_squaredNorm.cpp
+      * Output: \verbinclude PartialRedux_squaredNorm.out
+      *
+      * \sa DenseBase::squaredNorm() */
+    const typename ReturnType<internal::member_squaredNorm,RealScalar>::Type squaredNorm() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the norm
+      * of each column (or row) of the referenced expression.
+      *
+      * Example: \include PartialRedux_norm.cpp
+      * Output: \verbinclude PartialRedux_norm.out
+      *
+      * \sa DenseBase::norm() */
+    const typename ReturnType<internal::member_norm,RealScalar>::Type norm() const
+    { return _expression(); }
+
+
+    /** \returns a row (or column) vector expression of the norm
+      * of each column (or row) of the referenced expression, using
+      * blue's algorithm.
+      *
+      * \sa DenseBase::blueNorm() */
+    const typename ReturnType<internal::member_blueNorm,RealScalar>::Type blueNorm() const
+    { return _expression(); }
+
+
+    /** \returns a row (or column) vector expression of the norm
+      * of each column (or row) of the referenced expression, avoiding
+      * underflow and overflow.
+      *
+      * \sa DenseBase::stableNorm() */
+    const typename ReturnType<internal::member_stableNorm,RealScalar>::Type stableNorm() const
+    { return _expression(); }
+
+
+    /** \returns a row (or column) vector expression of the norm
+      * of each column (or row) of the referenced expression, avoiding
+      * underflow and overflow using a concatenation of hypot() calls.
+      *
+      * \sa DenseBase::hypotNorm() */
+    const typename ReturnType<internal::member_hypotNorm,RealScalar>::Type hypotNorm() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the sum
+      * of each column (or row) of the referenced expression.
+      *
+      * Example: \include PartialRedux_sum.cpp
+      * Output: \verbinclude PartialRedux_sum.out
+      *
+      * \sa DenseBase::sum() */
+    const typename ReturnType<internal::member_sum>::Type sum() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the mean
+    * of each column (or row) of the referenced expression.
+    *
+    * \sa DenseBase::mean() */
+    const typename ReturnType<internal::member_mean>::Type mean() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression representing
+      * whether \b all coefficients of each respective column (or row) are \c true.
+      *
+      * \sa DenseBase::all() */
+    const typename ReturnType<internal::member_all>::Type all() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression representing
+      * whether \b at \b least one coefficient of each respective column (or row) is \c true.
+      *
+      * \sa DenseBase::any() */
+    const typename ReturnType<internal::member_any>::Type any() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression representing
+      * the number of \c true coefficients of each respective column (or row).
+      *
+      * Example: \include PartialRedux_count.cpp
+      * Output: \verbinclude PartialRedux_count.out
+      *
+      * \sa DenseBase::count() */
+    const PartialReduxExpr<ExpressionType, internal::member_count<Index>, Direction> count() const
+    { return _expression(); }
+
+    /** \returns a row (or column) vector expression of the product
+      * of each column (or row) of the referenced expression.
+      *
+      * Example: \include PartialRedux_prod.cpp
+      * Output: \verbinclude PartialRedux_prod.out
+      *
+      * \sa DenseBase::prod() */
+    const typename ReturnType<internal::member_prod>::Type prod() const
+    { return _expression(); }
+
+
+    /** \returns a matrix expression
+      * where each column (or row) are reversed.
+      *
+      * Example: \include Vectorwise_reverse.cpp
+      * Output: \verbinclude Vectorwise_reverse.out
+      *
+      * \sa DenseBase::reverse() */
+    const Reverse<ExpressionType, Direction> reverse() const
+    { return Reverse<ExpressionType, Direction>( _expression() ); }
+
+    typedef Replicate<ExpressionType,Direction==Vertical?Dynamic:1,Direction==Horizontal?Dynamic:1> ReplicateReturnType;
+    const ReplicateReturnType replicate(Index factor) const;
+
+    /**
+      * \return an expression of the replication of each column (or row) of \c *this
+      *
+      * Example: \include DirectionWise_replicate.cpp
+      * Output: \verbinclude DirectionWise_replicate.out
+      *
+      * \sa VectorwiseOp::replicate(Index), DenseBase::replicate(), class Replicate
+      */
+    // NOTE implemented here because of sunstudio's compilation errors
+    template<int Factor> const Replicate<ExpressionType,(IsVertical?Factor:1),(IsHorizontal?Factor:1)>
+    replicate(Index factor = Factor) const
+    {
+      return Replicate<ExpressionType,Direction==Vertical?Factor:1,Direction==Horizontal?Factor:1>
+          (_expression(),Direction==Vertical?factor:1,Direction==Horizontal?factor:1);
+    }
+
+/////////// Artithmetic operators ///////////
+
+    /** Copies the vector \a other to each subvector of \c *this */
+    template<typename OtherDerived>
+    ExpressionType& operator=(const DenseBase<OtherDerived>& other)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      //eigen_assert((m_matrix.isNull()) == (other.isNull())); FIXME
+      return const_cast<ExpressionType&>(m_matrix = extendedTo(other.derived()));
+    }
+
+    /** Adds the vector \a other to each subvector of \c *this */
+    template<typename OtherDerived>
+    ExpressionType& operator+=(const DenseBase<OtherDerived>& other)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return const_cast<ExpressionType&>(m_matrix += extendedTo(other.derived()));
+    }
+
+    /** Substracts the vector \a other to each subvector of \c *this */
+    template<typename OtherDerived>
+    ExpressionType& operator-=(const DenseBase<OtherDerived>& other)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return const_cast<ExpressionType&>(m_matrix -= extendedTo(other.derived()));
+    }
+
+    /** Multiples each subvector of \c *this by the vector \a other */
+    template<typename OtherDerived>
+    ExpressionType& operator*=(const DenseBase<OtherDerived>& other)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      m_matrix *= extendedTo(other.derived());
+      return const_cast<ExpressionType&>(m_matrix);
+    }
+
+    /** Divides each subvector of \c *this by the vector \a other */
+    template<typename OtherDerived>
+    ExpressionType& operator/=(const DenseBase<OtherDerived>& other)
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      m_matrix /= extendedTo(other.derived());
+      return const_cast<ExpressionType&>(m_matrix);
+    }
+
+    /** Returns the expression of the sum of the vector \a other to each subvector of \c *this */
+    template<typename OtherDerived> EIGEN_STRONG_INLINE
+    CwiseBinaryOp<internal::scalar_sum_op<Scalar>,
+                  const ExpressionTypeNestedCleaned,
+                  const typename ExtendedType<OtherDerived>::Type>
+    operator+(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return m_matrix + extendedTo(other.derived());
+    }
+
+    /** Returns the expression of the difference between each subvector of \c *this and the vector \a other */
+    template<typename OtherDerived>
+    CwiseBinaryOp<internal::scalar_difference_op<Scalar>,
+                  const ExpressionTypeNestedCleaned,
+                  const typename ExtendedType<OtherDerived>::Type>
+    operator-(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return m_matrix - extendedTo(other.derived());
+    }
+
+    /** Returns the expression where each subvector is the product of the vector \a other
+      * by the corresponding subvector of \c *this */
+    template<typename OtherDerived> EIGEN_STRONG_INLINE
+    CwiseBinaryOp<internal::scalar_product_op<Scalar>,
+                  const ExpressionTypeNestedCleaned,
+                  const typename ExtendedType<OtherDerived>::Type>
+    operator*(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return m_matrix * extendedTo(other.derived());
+    }
+
+    /** Returns the expression where each subvector is the quotient of the corresponding
+      * subvector of \c *this by the vector \a other */
+    template<typename OtherDerived>
+    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
+                  const ExpressionTypeNestedCleaned,
+                  const typename ExtendedType<OtherDerived>::Type>
+    operator/(const DenseBase<OtherDerived>& other) const
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+      EIGEN_STATIC_ASSERT_ARRAYXPR(ExpressionType)
+      EIGEN_STATIC_ASSERT_SAME_XPR_KIND(ExpressionType, OtherDerived)
+      return m_matrix / extendedTo(other.derived());
+    }
+    
+    /** \returns an expression where each column of row of the referenced matrix are normalized.
+      * The referenced matrix is \b not modified.
+      * \sa MatrixBase::normalized(), normalize()
+      */
+    CwiseBinaryOp<internal::scalar_quotient_op<Scalar>,
+                  const ExpressionTypeNestedCleaned,
+                  const typename OppositeExtendedType<typename ReturnType<internal::member_norm,RealScalar>::Type>::Type>
+    normalized() const { return m_matrix.cwiseQuotient(extendedToOpposite(this->norm())); }
+    
+    
+    /** Normalize in-place each row or columns of the referenced matrix.
+      * \sa MatrixBase::normalize(), normalized()
+      */
+    void normalize() {
+      m_matrix = this->normalized();
+    }
+
+/////////// Geometry module ///////////
+
+    #if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+    Homogeneous<ExpressionType,Direction> homogeneous() const;
+    #endif
+
+    typedef typename ExpressionType::PlainObject CrossReturnType;
+    template<typename OtherDerived>
+    const CrossReturnType cross(const MatrixBase<OtherDerived>& other) const;
+
+    enum {
+      HNormalized_Size = Direction==Vertical ? internal::traits<ExpressionType>::RowsAtCompileTime
+                                             : internal::traits<ExpressionType>::ColsAtCompileTime,
+      HNormalized_SizeMinusOne = HNormalized_Size==Dynamic ? Dynamic : HNormalized_Size-1
+    };
+    typedef Block<const ExpressionType,
+                  Direction==Vertical   ? int(HNormalized_SizeMinusOne)
+                                        : int(internal::traits<ExpressionType>::RowsAtCompileTime),
+                  Direction==Horizontal ? int(HNormalized_SizeMinusOne)
+                                        : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
+            HNormalized_Block;
+    typedef Block<const ExpressionType,
+                  Direction==Vertical   ? 1 : int(internal::traits<ExpressionType>::RowsAtCompileTime),
+                  Direction==Horizontal ? 1 : int(internal::traits<ExpressionType>::ColsAtCompileTime)>
+            HNormalized_Factors;
+    typedef CwiseBinaryOp<internal::scalar_quotient_op<typename internal::traits<ExpressionType>::Scalar>,
+                const HNormalized_Block,
+                const Replicate<HNormalized_Factors,
+                  Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
+                  Direction==Horizontal ? HNormalized_SizeMinusOne : 1> >
+            HNormalizedReturnType;
+
+    const HNormalizedReturnType hnormalized() const;
+
+  protected:
+    ExpressionTypeNested m_matrix;
+};
+
+/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
+  *
+  * Example: \include MatrixBase_colwise.cpp
+  * Output: \verbinclude MatrixBase_colwise.out
+  *
+  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+  */
+template<typename Derived>
+inline const typename DenseBase<Derived>::ConstColwiseReturnType
+DenseBase<Derived>::colwise() const
+{
+  return derived();
+}
+
+/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
+  *
+  * \sa rowwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::ColwiseReturnType
+DenseBase<Derived>::colwise()
+{
+  return derived();
+}
+
+/** \returns a VectorwiseOp wrapper of *this providing additional partial reduction operations
+  *
+  * Example: \include MatrixBase_rowwise.cpp
+  * Output: \verbinclude MatrixBase_rowwise.out
+  *
+  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+  */
+template<typename Derived>
+inline const typename DenseBase<Derived>::ConstRowwiseReturnType
+DenseBase<Derived>::rowwise() const
+{
+  return derived();
+}
+
+/** \returns a writable VectorwiseOp wrapper of *this providing additional partial reduction operations
+  *
+  * \sa colwise(), class VectorwiseOp, \ref TutorialReductionsVisitorsBroadcasting
+  */
+template<typename Derived>
+inline typename DenseBase<Derived>::RowwiseReturnType
+DenseBase<Derived>::rowwise()
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARTIAL_REDUX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/Visitor.h b/vendor/eigen-3.1.91/Eigen/src/Core/Visitor.h
new file mode 100644
index 0000000..64867b7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/Visitor.h
@@ -0,0 +1,237 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_VISITOR_H
+#define EIGEN_VISITOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Visitor, typename Derived, int UnrollCount>
+struct visitor_impl
+{
+  enum {
+    col = (UnrollCount-1) / Derived::RowsAtCompileTime,
+    row = (UnrollCount-1) % Derived::RowsAtCompileTime
+  };
+
+  static inline void run(const Derived &mat, Visitor& visitor)
+  {
+    visitor_impl<Visitor, Derived, UnrollCount-1>::run(mat, visitor);
+    visitor(mat.coeff(row, col), row, col);
+  }
+};
+
+template<typename Visitor, typename Derived>
+struct visitor_impl<Visitor, Derived, 1>
+{
+  static inline void run(const Derived &mat, Visitor& visitor)
+  {
+    return visitor.init(mat.coeff(0, 0), 0, 0);
+  }
+};
+
+template<typename Visitor, typename Derived>
+struct visitor_impl<Visitor, Derived, Dynamic>
+{
+  typedef typename Derived::Index Index;
+  static inline void run(const Derived& mat, Visitor& visitor)
+  {
+    visitor.init(mat.coeff(0,0), 0, 0);
+    for(Index i = 1; i < mat.rows(); ++i)
+      visitor(mat.coeff(i, 0), i, 0);
+    for(Index j = 1; j < mat.cols(); ++j)
+      for(Index i = 0; i < mat.rows(); ++i)
+        visitor(mat.coeff(i, j), i, j);
+  }
+};
+
+} // end namespace internal
+
+/** Applies the visitor \a visitor to the whole coefficients of the matrix or vector.
+  *
+  * The template parameter \a Visitor is the type of the visitor and provides the following interface:
+  * \code
+  * struct MyVisitor {
+  *   // called for the first coefficient
+  *   void init(const Scalar& value, Index i, Index j);
+  *   // called for all other coefficients
+  *   void operator() (const Scalar& value, Index i, Index j);
+  * };
+  * \endcode
+  *
+  * \note compared to one or two \em for \em loops, visitors offer automatic
+  * unrolling for small fixed size matrix.
+  *
+  * \sa minCoeff(Index*,Index*), maxCoeff(Index*,Index*), DenseBase::redux()
+  */
+template<typename Derived>
+template<typename Visitor>
+void DenseBase<Derived>::visit(Visitor& visitor) const
+{
+  enum { unroll = SizeAtCompileTime != Dynamic
+                   && CoeffReadCost != Dynamic
+                   && (SizeAtCompileTime == 1 || internal::functor_traits<Visitor>::Cost != Dynamic)
+                   && SizeAtCompileTime * CoeffReadCost + (SizeAtCompileTime-1) * internal::functor_traits<Visitor>::Cost
+                      <= EIGEN_UNROLLING_LIMIT };
+  return internal::visitor_impl<Visitor, Derived,
+      unroll ? int(SizeAtCompileTime) : Dynamic
+    >::run(derived(), visitor);
+}
+
+namespace internal {
+
+/** \internal
+  * \brief Base class to implement min and max visitors
+  */
+template <typename Derived>
+struct coeff_visitor
+{
+  typedef typename Derived::Index Index;
+  typedef typename Derived::Scalar Scalar;
+  Index row, col;
+  Scalar res;
+  inline void init(const Scalar& value, Index i, Index j)
+  {
+    res = value;
+    row = i;
+    col = j;
+  }
+};
+
+/** \internal
+  * \brief Visitor computing the min coefficient with its value and coordinates
+  *
+  * \sa DenseBase::minCoeff(Index*, Index*)
+  */
+template <typename Derived>
+struct min_coeff_visitor : coeff_visitor<Derived>
+{
+  typedef typename Derived::Index Index;
+  typedef typename Derived::Scalar Scalar;
+  void operator() (const Scalar& value, Index i, Index j)
+  {
+    if(value < this->res)
+    {
+      this->res = value;
+      this->row = i;
+      this->col = j;
+    }
+  }
+};
+
+template<typename Scalar>
+struct functor_traits<min_coeff_visitor<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost
+  };
+};
+
+/** \internal
+  * \brief Visitor computing the max coefficient with its value and coordinates
+  *
+  * \sa DenseBase::maxCoeff(Index*, Index*)
+  */
+template <typename Derived>
+struct max_coeff_visitor : coeff_visitor<Derived>
+{
+  typedef typename Derived::Index Index;
+  typedef typename Derived::Scalar Scalar;
+  void operator() (const Scalar& value, Index i, Index j)
+  {
+    if(value > this->res)
+    {
+      this->res = value;
+      this->row = i;
+      this->col = j;
+    }
+  }
+};
+
+template<typename Scalar>
+struct functor_traits<max_coeff_visitor<Scalar> > {
+  enum {
+    Cost = NumTraits<Scalar>::AddCost
+  };
+};
+
+} // end namespace internal
+
+/** \returns the minimum of all coefficients of *this and puts in *row and *col its location.
+  * \warning the result is undefined if \c *this contains NaN.
+  *
+  * \sa DenseBase::minCoeff(Index*), DenseBase::maxCoeff(Index*,Index*), DenseBase::visitor(), DenseBase::minCoeff()
+  */
+template<typename Derived>
+template<typename IndexType>
+typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::minCoeff(IndexType* rowId, IndexType* colId) const
+{
+  internal::min_coeff_visitor<Derived> minVisitor;
+  this->visit(minVisitor);
+  *rowId = minVisitor.row;
+  if (colId) *colId = minVisitor.col;
+  return minVisitor.res;
+}
+
+/** \returns the minimum of all coefficients of *this and puts in *index its location.
+  * \warning the result is undefined if \c *this contains NaN. 
+  *
+  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::minCoeff()
+  */
+template<typename Derived>
+template<typename IndexType>
+typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::minCoeff(IndexType* index) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  internal::min_coeff_visitor<Derived> minVisitor;
+  this->visit(minVisitor);
+  *index = (RowsAtCompileTime==1) ? minVisitor.col : minVisitor.row;
+  return minVisitor.res;
+}
+
+/** \returns the maximum of all coefficients of *this and puts in *row and *col its location.
+  * \warning the result is undefined if \c *this contains NaN. 
+  *
+  * \sa DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
+  */
+template<typename Derived>
+template<typename IndexType>
+typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::maxCoeff(IndexType* rowPtr, IndexType* colPtr) const
+{
+  internal::max_coeff_visitor<Derived> maxVisitor;
+  this->visit(maxVisitor);
+  *rowPtr = maxVisitor.row;
+  if (colPtr) *colPtr = maxVisitor.col;
+  return maxVisitor.res;
+}
+
+/** \returns the maximum of all coefficients of *this and puts in *index its location.
+  * \warning the result is undefined if \c *this contains NaN.
+  *
+  * \sa DenseBase::maxCoeff(IndexType*,IndexType*), DenseBase::minCoeff(IndexType*,IndexType*), DenseBase::visitor(), DenseBase::maxCoeff()
+  */
+template<typename Derived>
+template<typename IndexType>
+typename internal::traits<Derived>::Scalar
+DenseBase<Derived>::maxCoeff(IndexType* index) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  internal::max_coeff_visitor<Derived> maxVisitor;
+  this->visit(maxVisitor);
+  *index = (RowsAtCompileTime==1) ? maxVisitor.col : maxVisitor.row;
+  return maxVisitor.res;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_VISITOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/CMakeLists.txt
new file mode 100644
index 0000000..9f8d2e9
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_arch_AltiVec_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_arch_AltiVec_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/AltiVec COMPONENT Devel
+)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/Complex.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/Complex.h
new file mode 100644
index 0000000..68d9a2b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/Complex.h
@@ -0,0 +1,217 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPLEX_ALTIVEC_H
+#define EIGEN_COMPLEX_ALTIVEC_H
+
+namespace Eigen {
+
+namespace internal {
+
+static Packet4ui  p4ui_CONJ_XOR = vec_mergeh((Packet4ui)p4i_ZERO, (Packet4ui)p4f_ZERO_);//{ 0x00000000, 0x80000000, 0x00000000, 0x80000000 };
+static Packet16uc p16uc_COMPLEX_RE   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 2), 8);//{ 0,1,2,3, 0,1,2,3, 8,9,10,11, 8,9,10,11 };
+static Packet16uc p16uc_COMPLEX_IM   = vec_sld((Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 1), (Packet16uc) vec_splat((Packet4ui)p16uc_FORWARD, 3), 8);//{ 4,5,6,7, 4,5,6,7, 12,13,14,15, 12,13,14,15 };
+static Packet16uc p16uc_COMPLEX_REV  = vec_sld(p16uc_REVERSE, p16uc_REVERSE, 8);//{ 4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11 };
+static Packet16uc p16uc_COMPLEX_REV2 = vec_sld(p16uc_FORWARD, p16uc_FORWARD, 8);//{ 8,9,10,11, 12,13,14,15, 0,1,2,3, 4,5,6,7 };
+static Packet16uc p16uc_PSET_HI = (Packet16uc) vec_mergeh((Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 0), (Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 1));//{ 0,1,2,3, 4,5,6,7, 0,1,2,3, 4,5,6,7 };
+static Packet16uc p16uc_PSET_LO = (Packet16uc) vec_mergeh((Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 2), (Packet4ui) vec_splat((Packet4ui)p16uc_FORWARD, 3));//{ 8,9,10,11, 12,13,14,15, 8,9,10,11, 12,13,14,15 };
+
+//---------- float ----------
+struct Packet2cf
+{
+  EIGEN_STRONG_INLINE Packet2cf() {}
+  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
+  Packet4f  v;
+};
+
+template<> struct packet_traits<std::complex<float> >  : default_packet_traits
+{
+  typedef Packet2cf type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size = 2,
+
+    HasAdd    = 1,
+    HasSub    = 1,
+    HasMul    = 1,
+    HasDiv    = 1,
+    HasNegate = 1,
+    HasAbs    = 0,
+    HasAbs2   = 0,
+    HasMin    = 0,
+    HasMax    = 0,
+    HasSetLinear = 0
+  };
+};
+
+template<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };
+
+template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
+{
+  Packet2cf res;
+  /* On AltiVec we cannot load 64-bit registers, so wa have to take care of alignment */
+  if((ptrdiff_t(&from) % 16) == 0)
+    res.v = pload<Packet4f>((const float *)&from);
+  else
+    res.v = ploadu<Packet4f>((const float *)&from);
+  res.v = vec_perm(res.v, res.v, p16uc_PSET_HI);
+  return res;
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_add(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_sub(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate(a.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a) { return Packet2cf((Packet4f)vec_xor((Packet4ui)a.v, p4ui_CONJ_XOR)); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  Packet4f v1, v2;
+
+  // Permute and multiply the real parts of a and b
+  v1 = vec_perm(a.v, a.v, p16uc_COMPLEX_RE);
+  // Get the imaginary parts of a
+  v2 = vec_perm(a.v, a.v, p16uc_COMPLEX_IM);
+  // multiply a_re * b 
+  v1 = vec_madd(v1, b.v, p4f_ZERO);
+  // multiply a_im * b and get the conjugate result
+  v2 = vec_madd(v2, b.v, p4f_ZERO);
+  v2 = (Packet4f) vec_xor((Packet4ui)v2, p4ui_CONJ_XOR);
+  // permute back to a proper order
+  v2 = vec_perm(v2, v2, p16uc_COMPLEX_REV);
+  
+  return Packet2cf(vec_add(v1, v2));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_and(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_or(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_xor(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(vec_and(a.v, vec_nor(b.v,b.v))); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from)); }
+template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from)); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>*     from)
+{
+  return pset1<Packet2cf>(*from);
+}
+
+template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }
+template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }
+
+template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { vec_dstt((float *)addr, DST_CTRL(2,2,32), DST_CHAN); }
+
+template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
+{
+  std::complex<float> EIGEN_ALIGN16 res[2];
+  pstore((float *)&res, a.v);
+
+  return res[0];
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
+{
+  Packet4f rev_a;
+  rev_a = vec_perm(a.v, a.v, p16uc_COMPLEX_REV2);
+  return Packet2cf(rev_a);
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
+{
+  Packet4f b;
+  b = (Packet4f) vec_sld(a.v, a.v, 8);
+  b = padd(a.v, b);
+  return pfirst(Packet2cf(b));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)
+{
+  Packet4f b1, b2;
+  
+  b1 = (Packet4f) vec_sld(vecs[0].v, vecs[1].v, 8);
+  b2 = (Packet4f) vec_sld(vecs[1].v, vecs[0].v, 8);
+  b2 = (Packet4f) vec_sld(b2, b2, 8);
+  b2 = padd(b1, b2);
+
+  return Packet2cf(b2);
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
+{
+  Packet4f b;
+  Packet2cf prod;
+  b = (Packet4f) vec_sld(a.v, a.v, 8);
+  prod = pmul(a, Packet2cf(b));
+
+  return pfirst(prod);
+}
+
+template<int Offset>
+struct palign_impl<Offset,Packet2cf>
+{
+  static EIGEN_STRONG_INLINE void run(Packet2cf& first, const Packet2cf& second)
+  {
+    if (Offset==1)
+    {
+      first.v = vec_sld(first.v, second.v, 8);
+    }
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, false,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return internal::pmul(a, pconj(b));
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,false>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return internal::pmul(pconj(a), b);
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return pconj(internal::pmul(a, b));
+  }
+};
+
+template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  // TODO optimize it for AltiVec
+  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);
+  Packet4f s = vec_madd(b.v, b.v, p4f_ZERO);
+  return Packet2cf(pdiv(res.v, vec_add(s,vec_perm(s, s, p16uc_COMPLEX_REV))));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& x)
+{
+  return Packet2cf(vec_perm(x.v, x.v, p16uc_COMPLEX_REV));
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_ALTIVEC_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/PacketMath.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/PacketMath.h
new file mode 100644
index 0000000..75de193
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/AltiVec/PacketMath.h
@@ -0,0 +1,498 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Konstantinos Margaritis <markos at codex.gr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PACKET_MATH_ALTIVEC_H
+#define EIGEN_PACKET_MATH_ALTIVEC_H
+
+namespace Eigen {
+
+namespace internal {
+
+#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 4
+#endif
+
+#ifndef EIGEN_HAS_FUSE_CJMADD
+#define EIGEN_HAS_FUSE_CJMADD 1
+#endif
+
+// NOTE Altivec has 32 registers, but Eigen only accepts a value of 8 or 16
+#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 16
+#endif
+
+typedef __vector float          Packet4f;
+typedef __vector int            Packet4i;
+typedef __vector unsigned int   Packet4ui;
+typedef __vector __bool int     Packet4bi;
+typedef __vector short int      Packet8i;
+typedef __vector unsigned char  Packet16uc;
+
+// We don't want to write the same code all the time, but we need to reuse the constants
+// and it doesn't really work to declare them global, so we define macros instead
+
+#define _EIGEN_DECLARE_CONST_FAST_Packet4f(NAME,X) \
+  Packet4f p4f_##NAME = (Packet4f) vec_splat_s32(X)
+
+#define _EIGEN_DECLARE_CONST_FAST_Packet4i(NAME,X) \
+  Packet4i p4i_##NAME = vec_splat_s32(X)
+
+#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
+  Packet4f p4f_##NAME = pset1<Packet4f>(X)
+
+#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+  Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int>(X))
+
+#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
+  Packet4i p4i_##NAME = pset1<Packet4i>(X)
+
+#define DST_CHAN 1
+#define DST_CTRL(size, count, stride) (((size) << 24) | ((count) << 16) | (stride))
+
+// Define global static constants:
+static Packet4f p4f_COUNTDOWN = { 3.0, 2.0, 1.0, 0.0 };
+static Packet4i p4i_COUNTDOWN = { 3, 2, 1, 0 };
+static Packet16uc p16uc_REVERSE = {12,13,14,15, 8,9,10,11, 4,5,6,7, 0,1,2,3};
+static Packet16uc p16uc_FORWARD = vec_lvsl(0, (float*)0);
+static Packet16uc p16uc_DUPLICATE = {0,1,2,3, 0,1,2,3, 4,5,6,7, 4,5,6,7};
+
+static _EIGEN_DECLARE_CONST_FAST_Packet4f(ZERO, 0);
+static _EIGEN_DECLARE_CONST_FAST_Packet4i(ZERO, 0);
+static _EIGEN_DECLARE_CONST_FAST_Packet4i(ONE,1);
+static _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS16,-16);
+static _EIGEN_DECLARE_CONST_FAST_Packet4i(MINUS1,-1);
+static Packet4f p4f_ONE = vec_ctf(p4i_ONE, 0);
+static Packet4f p4f_ZERO_ = (Packet4f) vec_sl((Packet4ui)p4i_MINUS1, (Packet4ui)p4i_MINUS1);
+
+template<> struct packet_traits<float>  : default_packet_traits
+{
+  typedef Packet4f type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=4,
+
+    // FIXME check the Has*
+    HasSin  = 0,
+    HasCos  = 0,
+    HasLog  = 0,
+    HasExp  = 0,
+    HasSqrt = 0
+  };
+};
+template<> struct packet_traits<int>    : default_packet_traits
+{
+  typedef Packet4i type;
+  enum {
+    // FIXME check the Has*
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=4
+  };
+};
+
+template<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };
+template<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };
+/*
+inline std::ostream & operator <<(std::ostream & s, const Packet4f & v)
+{
+  union {
+    Packet4f   v;
+    float n[4];
+  } vt;
+  vt.v = v;
+  s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
+  return s;
+}
+
+inline std::ostream & operator <<(std::ostream & s, const Packet4i & v)
+{
+  union {
+    Packet4i   v;
+    int n[4];
+  } vt;
+  vt.v = v;
+  s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
+  return s;
+}
+
+inline std::ostream & operator <<(std::ostream & s, const Packet4ui & v)
+{
+  union {
+    Packet4ui   v;
+    unsigned int n[4];
+  } vt;
+  vt.v = v;
+  s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
+  return s;
+}
+
+inline std::ostream & operator <<(std::ostream & s, const Packetbi & v)
+{
+  union {
+    Packet4bi v;
+    unsigned int n[4];
+  } vt;
+  vt.v = v;
+  s << vt.n[0] << ", " << vt.n[1] << ", " << vt.n[2] << ", " << vt.n[3];
+  return s;
+}
+*/
+template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) {
+  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
+  float EIGEN_ALIGN16 af[4];
+  af[0] = from;
+  Packet4f vc = vec_ld(0, af);
+  vc = vec_splat(vc, 0);
+  return vc;
+}
+
+template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   {
+  int EIGEN_ALIGN16 ai[4];
+  ai[0] = from;
+  Packet4i vc = vec_ld(0, ai);
+  vc = vec_splat(vc, 0);
+  return vc;
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return vec_add(pset1<Packet4f>(a), p4f_COUNTDOWN); }
+template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a)     { return vec_add(pset1<Packet4i>(a), p4i_COUNTDOWN); }
+
+template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_add(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_add(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_sub(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_sub(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return psub<Packet4f>(p4f_ZERO, a); }
+template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return psub<Packet4i>(p4i_ZERO, a); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_madd(a,b,p4f_ZERO); }
+/* Commented out: it's actually slower than processing it scalar
+ *
+template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)
+{
+  // Detailed in: http://freevec.org/content/32bit_signed_integer_multiplication_altivec
+  //Set up constants, variables
+  Packet4i a1, b1, bswap, low_prod, high_prod, prod, prod_, v1sel;
+
+  // Get the absolute values
+  a1  = vec_abs(a);
+  b1  = vec_abs(b);
+
+  // Get the signs using xor
+  Packet4bi sgn = (Packet4bi) vec_cmplt(vec_xor(a, b), p4i_ZERO);
+
+  // Do the multiplication for the asbolute values.
+  bswap = (Packet4i) vec_rl((Packet4ui) b1, (Packet4ui) p4i_MINUS16 );
+  low_prod = vec_mulo((Packet8i) a1, (Packet8i)b1);
+  high_prod = vec_msum((Packet8i) a1, (Packet8i) bswap, p4i_ZERO);
+  high_prod = (Packet4i) vec_sl((Packet4ui) high_prod, (Packet4ui) p4i_MINUS16);
+  prod = vec_add( low_prod, high_prod );
+
+  // NOR the product and select only the negative elements according to the sign mask
+  prod_ = vec_nor(prod, prod);
+  prod_ = vec_sel(p4i_ZERO, prod_, sgn);
+
+  // Add 1 to the result to get the negative numbers
+  v1sel = vec_sel(p4i_ZERO, p4i_ONE, sgn);
+  prod_ = vec_add(prod_, v1sel);
+
+  // Merge the results back to the final vector.
+  prod = vec_sel(prod, prod_, sgn);
+
+  return prod;
+}
+*/
+template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  Packet4f t, y_0, y_1, res;
+
+  // Altivec does not offer a divide instruction, we have to do a reciprocal approximation
+  y_0 = vec_re(b);
+
+  // Do one Newton-Raphson iteration to get the needed accuracy
+  t   = vec_nmsub(y_0, b, p4f_ONE);
+  y_1 = vec_madd(y_0, t, y_0);
+
+  res = vec_madd(a, y_1, p4f_ZERO);
+  return res;
+}
+
+template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
+{ eigen_assert(false && "packet integer division are not supported by AltiVec");
+  return pset1<Packet4i>(0);
+}
+
+// for some weird raisons, it has to be overloaded for packet of integers
+template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vec_madd(a, b, c); }
+template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_min(a, b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_min(a, b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_max(a, b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_max(a, b); }
+
+// Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics
+template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, b); }
+template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_or(a, b); }
+template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_or(a, b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_xor(a, b); }
+template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_xor(a, b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return vec_and(a, vec_nor(b, b)); }
+template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vec_and(a, vec_nor(b, b)); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }
+template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return vec_ld(0, from); }
+
+template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
+{
+  EIGEN_DEBUG_ALIGNED_LOAD
+  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
+  Packet16uc MSQ, LSQ;
+  Packet16uc mask;
+  MSQ = vec_ld(0, (unsigned char *)from);          // most significant quadword
+  LSQ = vec_ld(15, (unsigned char *)from);         // least significant quadword
+  mask = vec_lvsl(0, from);                        // create the permute mask
+  return (Packet4f) vec_perm(MSQ, LSQ, mask);           // align the data
+
+}
+template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
+{
+  EIGEN_DEBUG_ALIGNED_LOAD
+  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
+  Packet16uc MSQ, LSQ;
+  Packet16uc mask;
+  MSQ = vec_ld(0, (unsigned char *)from);          // most significant quadword
+  LSQ = vec_ld(15, (unsigned char *)from);         // least significant quadword
+  mask = vec_lvsl(0, from);                        // create the permute mask
+  return (Packet4i) vec_perm(MSQ, LSQ, mask);    // align the data
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)
+{
+  Packet4f p;
+  if((ptrdiff_t(&from) % 16) == 0)  p = pload<Packet4f>(from);
+  else                              p = ploadu<Packet4f>(from);
+  return vec_perm(p, p, p16uc_DUPLICATE);
+}
+template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
+{
+  Packet4i p;
+  if((ptrdiff_t(&from) % 16) == 0)  p = pload<Packet4i>(from);
+  else                              p = ploadu<Packet4i>(from);
+  return vec_perm(p, p, p16uc_DUPLICATE);
+}
+
+template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }
+template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE vec_st(from, 0, to); }
+
+template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from)
+{
+  EIGEN_DEBUG_UNALIGNED_STORE
+  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
+  // Warning: not thread safe!
+  Packet16uc MSQ, LSQ, edges;
+  Packet16uc edgeAlign, align;
+
+  MSQ = vec_ld(0, (unsigned char *)to);                     // most significant quadword
+  LSQ = vec_ld(15, (unsigned char *)to);                    // least significant quadword
+  edgeAlign = vec_lvsl(0, to);                              // permute map to extract edges
+  edges=vec_perm(LSQ,MSQ,edgeAlign);                        // extract the edges
+  align = vec_lvsr( 0, to );                                // permute map to misalign data
+  MSQ = vec_perm(edges,(Packet16uc)from,align);             // misalign the data (MSQ)
+  LSQ = vec_perm((Packet16uc)from,edges,align);             // misalign the data (LSQ)
+  vec_st( LSQ, 15, (unsigned char *)to );                   // Store the LSQ part first
+  vec_st( MSQ, 0, (unsigned char *)to );                    // Store the MSQ part
+}
+template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from)
+{
+  EIGEN_DEBUG_UNALIGNED_STORE
+  // Taken from http://developer.apple.com/hardwaredrivers/ve/alignment.html
+  // Warning: not thread safe!
+  Packet16uc MSQ, LSQ, edges;
+  Packet16uc edgeAlign, align;
+
+  MSQ = vec_ld(0, (unsigned char *)to);                     // most significant quadword
+  LSQ = vec_ld(15, (unsigned char *)to);                    // least significant quadword
+  edgeAlign = vec_lvsl(0, to);                              // permute map to extract edges
+  edges=vec_perm(LSQ, MSQ, edgeAlign);                      // extract the edges
+  align = vec_lvsr( 0, to );                                // permute map to misalign data
+  MSQ = vec_perm(edges, (Packet16uc) from, align);          // misalign the data (MSQ)
+  LSQ = vec_perm((Packet16uc) from, edges, align);          // misalign the data (LSQ)
+  vec_st( LSQ, 15, (unsigned char *)to );                   // Store the LSQ part first
+  vec_st( MSQ, 0, (unsigned char *)to );                    // Store the MSQ part
+}
+
+template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }
+template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*     addr) { vec_dstt(addr, DST_CTRL(2,2,32), DST_CHAN); }
+
+template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }
+template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int   EIGEN_ALIGN16 x[4]; vec_st(a, 0, x); return x[0]; }
+
+template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) { return (Packet4f)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }
+template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) { return (Packet4i)vec_perm((Packet16uc)a,(Packet16uc)a, p16uc_REVERSE); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vec_abs(a); }
+template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vec_abs(a); }
+
+template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
+{
+  Packet4f b, sum;
+  b   = (Packet4f) vec_sld(a, a, 8);
+  sum = vec_add(a, b);
+  b   = (Packet4f) vec_sld(sum, sum, 4);
+  sum = vec_add(sum, b);
+  return pfirst(sum);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
+{
+  Packet4f v[4], sum[4];
+
+  // It's easier and faster to transpose then add as columns
+  // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation
+  // Do the transpose, first set of moves
+  v[0] = vec_mergeh(vecs[0], vecs[2]);
+  v[1] = vec_mergel(vecs[0], vecs[2]);
+  v[2] = vec_mergeh(vecs[1], vecs[3]);
+  v[3] = vec_mergel(vecs[1], vecs[3]);
+  // Get the resulting vectors
+  sum[0] = vec_mergeh(v[0], v[2]);
+  sum[1] = vec_mergel(v[0], v[2]);
+  sum[2] = vec_mergeh(v[1], v[3]);
+  sum[3] = vec_mergel(v[1], v[3]);
+
+  // Now do the summation:
+  // Lines 0+1
+  sum[0] = vec_add(sum[0], sum[1]);
+  // Lines 2+3
+  sum[1] = vec_add(sum[2], sum[3]);
+  // Add the results
+  sum[0] = vec_add(sum[0], sum[1]);
+
+  return sum[0];
+}
+
+template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
+{
+  Packet4i sum;
+  sum = vec_sums(a, p4i_ZERO);
+  sum = vec_sld(sum, p4i_ZERO, 12);
+  return pfirst(sum);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)
+{
+  Packet4i v[4], sum[4];
+
+  // It's easier and faster to transpose then add as columns
+  // Check: http://www.freevec.org/function/matrix_4x4_transpose_floats for explanation
+  // Do the transpose, first set of moves
+  v[0] = vec_mergeh(vecs[0], vecs[2]);
+  v[1] = vec_mergel(vecs[0], vecs[2]);
+  v[2] = vec_mergeh(vecs[1], vecs[3]);
+  v[3] = vec_mergel(vecs[1], vecs[3]);
+  // Get the resulting vectors
+  sum[0] = vec_mergeh(v[0], v[2]);
+  sum[1] = vec_mergel(v[0], v[2]);
+  sum[2] = vec_mergeh(v[1], v[3]);
+  sum[3] = vec_mergel(v[1], v[3]);
+
+  // Now do the summation:
+  // Lines 0+1
+  sum[0] = vec_add(sum[0], sum[1]);
+  // Lines 2+3
+  sum[1] = vec_add(sum[2], sum[3]);
+  // Add the results
+  sum[0] = vec_add(sum[0], sum[1]);
+
+  return sum[0];
+}
+
+// Other reduction functions:
+// mul
+template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
+{
+  Packet4f prod;
+  prod = pmul(a, (Packet4f)vec_sld(a, a, 8));
+  return pfirst(pmul(prod, (Packet4f)vec_sld(prod, prod, 4)));
+}
+
+template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
+{
+  EIGEN_ALIGN16 int aux[4];
+  pstore(aux, a);
+  return aux[0] * aux[1] * aux[2] * aux[3];
+}
+
+// min
+template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
+{
+  Packet4f b, res;
+  b = vec_min(a, vec_sld(a, a, 8));
+  res = vec_min(b, vec_sld(b, b, 4));
+  return pfirst(res);
+}
+
+template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
+{
+  Packet4i b, res;
+  b = vec_min(a, vec_sld(a, a, 8));
+  res = vec_min(b, vec_sld(b, b, 4));
+  return pfirst(res);
+}
+
+// max
+template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
+{
+  Packet4f b, res;
+  b = vec_max(a, vec_sld(a, a, 8));
+  res = vec_max(b, vec_sld(b, b, 4));
+  return pfirst(res);
+}
+
+template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
+{
+  Packet4i b, res;
+  b = vec_max(a, vec_sld(a, a, 8));
+  res = vec_max(b, vec_sld(b, b, 4));
+  return pfirst(res);
+}
+
+template<int Offset>
+struct palign_impl<Offset,Packet4f>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
+  {
+    if (Offset!=0)
+      first = vec_sld(first, second, Offset*4);
+  }
+};
+
+template<int Offset>
+struct palign_impl<Offset,Packet4i>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
+  {
+    if (Offset!=0)
+      first = vec_sld(first, second, Offset*4);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PACKET_MATH_ALTIVEC_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/arch/CMakeLists.txt
new file mode 100644
index 0000000..8456dec
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/CMakeLists.txt
@@ -0,0 +1,4 @@
+ADD_SUBDIRECTORY(SSE)
+ADD_SUBDIRECTORY(AltiVec)
+ADD_SUBDIRECTORY(NEON)
+ADD_SUBDIRECTORY(Default)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/CMakeLists.txt
new file mode 100644
index 0000000..339c091
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_arch_Default_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_arch_Default_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/Default COMPONENT Devel
+)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/Settings.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/Settings.h
new file mode 100644
index 0000000..097373c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/Default/Settings.h
@@ -0,0 +1,49 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+/* All the parameters defined in this file can be specialized in the
+ * architecture specific files, and/or by the user.
+ * More to come... */
+
+#ifndef EIGEN_DEFAULT_SETTINGS_H
+#define EIGEN_DEFAULT_SETTINGS_H
+
+/** Defines the maximal loop size to enable meta unrolling of loops.
+  * Note that the value here is expressed in Eigen's own notion of "number of FLOPS",
+  * it does not correspond to the number of iterations or the number of instructions
+  */
+#ifndef EIGEN_UNROLLING_LIMIT
+#define EIGEN_UNROLLING_LIMIT 100
+#endif
+
+/** Defines the threshold between a "small" and a "large" matrix.
+  * This threshold is mainly used to select the proper product implementation.
+  */
+#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
+#endif
+
+/** Defines the maximal width of the blocks used in the triangular product and solver
+  * for vectors (level 2 blas xTRMV and xTRSV). The default is 8.
+  */
+#ifndef EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH
+#define EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH 8
+#endif
+
+
+/** Defines the default number of registers available for that architecture.
+  * Currently it must be 8 or 16. Other values will fail.
+  */
+#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 8
+#endif
+
+#endif // EIGEN_DEFAULT_SETTINGS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/CMakeLists.txt
new file mode 100644
index 0000000..fd4d4af
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_arch_NEON_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_arch_NEON_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/NEON COMPONENT Devel
+)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/Complex.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/Complex.h
new file mode 100644
index 0000000..795b4be
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/Complex.h
@@ -0,0 +1,259 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPLEX_NEON_H
+#define EIGEN_COMPLEX_NEON_H
+
+namespace Eigen {
+
+namespace internal {
+
+static uint32x4_t p4ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET4(0x00000000, 0x80000000, 0x00000000, 0x80000000);
+static uint32x2_t p2ui_CONJ_XOR = EIGEN_INIT_NEON_PACKET2(0x00000000, 0x80000000);
+
+//---------- float ----------
+struct Packet2cf
+{
+  EIGEN_STRONG_INLINE Packet2cf() {}
+  EIGEN_STRONG_INLINE explicit Packet2cf(const Packet4f& a) : v(a) {}
+  Packet4f  v;
+};
+
+template<> struct packet_traits<std::complex<float> >  : default_packet_traits
+{
+  typedef Packet2cf type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size = 2,
+
+    HasAdd    = 1,
+    HasSub    = 1,
+    HasMul    = 1,
+    HasDiv    = 1,
+    HasNegate = 1,
+    HasAbs    = 0,
+    HasAbs2   = 0,
+    HasMin    = 0,
+    HasMax    = 0,
+    HasSetLinear = 0
+  };
+};
+
+template<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };
+
+template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
+{
+  float32x2_t r64;
+  r64 = vld1_f32((float *)&from);
+
+  return Packet2cf(vcombine_f32(r64, r64));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(padd<Packet4f>(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(psub<Packet4f>(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a) { return Packet2cf(pnegate<Packet4f>(a.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
+{
+  Packet4ui b = vreinterpretq_u32_f32(a.v);
+  return Packet2cf(vreinterpretq_f32_u32(veorq_u32(b, p4ui_CONJ_XOR)));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  Packet4f v1, v2;
+  float32x2_t a_lo, a_hi;
+
+  // Get the real values of a | a1_re | a1_re | a2_re | a2_re |
+  v1 = vcombine_f32(vdup_lane_f32(vget_low_f32(a.v), 0), vdup_lane_f32(vget_high_f32(a.v), 0));
+  // Get the real values of a | a1_im | a1_im | a2_im | a2_im |
+  v2 = vcombine_f32(vdup_lane_f32(vget_low_f32(a.v), 1), vdup_lane_f32(vget_high_f32(a.v), 1));
+  // Multiply the real a with b
+  v1 = vmulq_f32(v1, b.v);
+  // Multiply the imag a with b
+  v2 = vmulq_f32(v2, b.v);
+  // Conjugate v2 
+  v2 = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(v2), p4ui_CONJ_XOR));
+  // Swap real/imag elements in v2.
+  a_lo = vrev64_f32(vget_low_f32(v2));
+  a_hi = vrev64_f32(vget_high_f32(v2));
+  v2 = vcombine_f32(a_lo, a_hi);
+  // Add and return the result
+  return Packet2cf(vaddq_f32(v1, v2));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));
+}
+template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  return Packet2cf(vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));
+}
+template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  return Packet2cf(vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));
+}
+template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  return Packet2cf(vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a.v),vreinterpretq_u32_f32(b.v))));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pload<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>((const float*)from)); }
+template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>((const float*)from)); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }
+
+template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((float*)to, from.v); }
+template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((float*)to, from.v); }
+
+template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { __pld((float *)addr); }
+
+template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
+{
+  std::complex<float> EIGEN_ALIGN16 x[2];
+  vst1q_f32((float *)x, a.v);
+  return x[0];
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a)
+{
+  float32x2_t a_lo, a_hi;
+  Packet4f a_r128;
+
+  a_lo = vget_low_f32(a.v);
+  a_hi = vget_high_f32(a.v);
+  a_r128 = vcombine_f32(a_hi, a_lo);
+
+  return Packet2cf(a_r128);
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pcplxflip<Packet2cf>(const Packet2cf& a)
+{
+  return Packet2cf(vrev64q_f32(a.v));
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
+{
+  float32x2_t a1, a2;
+  std::complex<float> s;
+
+  a1 = vget_low_f32(a.v);
+  a2 = vget_high_f32(a.v);
+  a2 = vadd_f32(a1, a2);
+  vst1_f32((float *)&s, a2);
+
+  return s;
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)
+{
+  Packet4f sum1, sum2, sum;
+
+  // Add the first two 64-bit float32x2_t of vecs[0]
+  sum1 = vcombine_f32(vget_low_f32(vecs[0].v), vget_low_f32(vecs[1].v));
+  sum2 = vcombine_f32(vget_high_f32(vecs[0].v), vget_high_f32(vecs[1].v));
+  sum = vaddq_f32(sum1, sum2);
+
+  return Packet2cf(sum);
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
+{
+  float32x2_t a1, a2, v1, v2, prod;
+  std::complex<float> s;
+
+  a1 = vget_low_f32(a.v);
+  a2 = vget_high_f32(a.v);
+   // Get the real values of a | a1_re | a1_re | a2_re | a2_re |
+  v1 = vdup_lane_f32(a1, 0);
+  // Get the real values of a | a1_im | a1_im | a2_im | a2_im |
+  v2 = vdup_lane_f32(a1, 1);
+  // Multiply the real a with b
+  v1 = vmul_f32(v1, a2);
+  // Multiply the imag a with b
+  v2 = vmul_f32(v2, a2);
+  // Conjugate v2 
+  v2 = vreinterpret_f32_u32(veor_u32(vreinterpret_u32_f32(v2), p2ui_CONJ_XOR));
+  // Swap real/imag elements in v2.
+  v2 = vrev64_f32(v2);
+  // Add v1, v2
+  prod = vadd_f32(v1, v2);
+
+  vst1_f32((float *)&s, prod);
+
+  return s;
+}
+
+template<int Offset>
+struct palign_impl<Offset,Packet2cf>
+{
+  EIGEN_STRONG_INLINE static void run(Packet2cf& first, const Packet2cf& second)
+  {
+    if (Offset==1)
+    {
+      first.v = vextq_f32(first.v, second.v, 2);
+    }
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, false,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return internal::pmul(a, pconj(b));
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,false>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return internal::pmul(pconj(a), b);
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    return pconj(internal::pmul(a, b));
+  }
+};
+
+template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  // TODO optimize it for AltiVec
+  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);
+  Packet4f s, rev_s;
+  float32x2_t a_lo, a_hi;
+
+  // this computes the norm
+  s = vmulq_f32(b.v, b.v);
+  a_lo = vrev64_f32(vget_low_f32(s));
+  a_hi = vrev64_f32(vget_high_f32(s));
+  rev_s = vcombine_f32(a_lo, a_hi);
+
+  return Packet2cf(pdiv(res.v, vaddq_f32(s,rev_s)));
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_NEON_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/PacketMath.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/PacketMath.h
new file mode 100644
index 0000000..2662e2e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/NEON/PacketMath.h
@@ -0,0 +1,407 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Konstantinos Margaritis <markos at codex.gr>
+// Heavily based on Gael's SSE version.
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PACKET_MATH_NEON_H
+#define EIGEN_PACKET_MATH_NEON_H
+
+namespace Eigen {
+
+namespace internal {
+
+#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
+#endif
+
+// FIXME NEON has 16 quad registers, but since the current register allocator
+// is so bad, it is much better to reduce it to 8
+#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS 8
+#endif
+
+typedef float32x4_t Packet4f;
+typedef int32x4_t   Packet4i;
+typedef uint32x4_t  Packet4ui;
+
+#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
+  const Packet4f p4f_##NAME = pset1<Packet4f>(X)
+
+#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+  const Packet4f p4f_##NAME = vreinterpretq_f32_u32(pset1<int>(X))
+
+#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
+  const Packet4i p4i_##NAME = pset1<Packet4i>(X)
+
+#if defined(__llvm__) && !defined(__clang__)
+  //Special treatment for Apple's llvm-gcc, its NEON packet types are unions
+  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {{X, Y}}
+  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {{X, Y, Z, W}}
+#else
+  //Default initializer for packets
+  #define EIGEN_INIT_NEON_PACKET2(X, Y)       {X, Y}
+  #define EIGEN_INIT_NEON_PACKET4(X, Y, Z, W) {X, Y, Z, W}
+#endif
+    
+#ifndef __pld
+#define __pld(x) asm volatile ( "   pld [%[addr]]\n" :: [addr] "r" (x) : "cc" );
+#endif
+
+template<> struct packet_traits<float>  : default_packet_traits
+{
+  typedef Packet4f type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size = 4,
+   
+    HasDiv  = 1,
+    // FIXME check the Has*
+    HasSin  = 0,
+    HasCos  = 0,
+    HasLog  = 0,
+    HasExp  = 0,
+    HasSqrt = 0
+  };
+};
+template<> struct packet_traits<int>    : default_packet_traits
+{
+  typedef Packet4i type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=4
+    // FIXME check the Has*
+  };
+};
+
+#if EIGEN_GNUC_AT_MOST(4,4) && !defined(__llvm__)
+// workaround gcc 4.2, 4.3 and 4.4 compilatin issue
+EIGEN_STRONG_INLINE float32x4_t vld1q_f32(const float* x) { return ::vld1q_f32((const float32_t*)x); }
+EIGEN_STRONG_INLINE float32x2_t vld1_f32 (const float* x) { return ::vld1_f32 ((const float32_t*)x); }
+EIGEN_STRONG_INLINE void        vst1q_f32(float* to, float32x4_t from) { ::vst1q_f32((float32_t*)to,from); }
+EIGEN_STRONG_INLINE void        vst1_f32 (float* to, float32x2_t from) { ::vst1_f32 ((float32_t*)to,from); }
+#endif
+
+template<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };
+template<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };
+
+template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return vdupq_n_f32(from); }
+template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from)   { return vdupq_n_s32(from); }
+
+template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a)
+{
+  Packet4f countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
+  return vaddq_f32(pset1<Packet4f>(a), countdown);
+}
+template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a)
+{
+  Packet4i countdown = EIGEN_INIT_NEON_PACKET4(0, 1, 2, 3);
+  return vaddq_s32(pset1<Packet4i>(a), countdown);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return vaddq_f32(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return vaddq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return vsubq_f32(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return vsubq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a) { return vnegq_f32(a); }
+template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a) { return vnegq_s32(a); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmulq_f32(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmulq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  Packet4f inv, restep, div;
+
+  // NEON does not offer a divide instruction, we have to do a reciprocal approximation
+  // However NEON in contrast to other SIMD engines (AltiVec/SSE), offers
+  // a reciprocal estimate AND a reciprocal step -which saves a few instructions
+  // vrecpeq_f32() returns an estimate to 1/b, which we will finetune with
+  // Newton-Raphson and vrecpsq_f32()
+  inv = vrecpeq_f32(b);
+
+  // This returns a differential, by which we will have to multiply inv to get a better
+  // approximation of 1/b.
+  restep = vrecpsq_f32(b, inv);
+  inv = vmulq_f32(restep, inv);
+
+  // Finally, multiply a by 1/b and get the wanted result of the division.
+  div = vmulq_f32(a, inv);
+
+  return div;
+}
+template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
+{ eigen_assert(false && "packet integer division are not supported by NEON");
+  return pset1<Packet4i>(0);
+}
+
+// for some weird raisons, it has to be overloaded for packet of integers
+template<> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c) { return vmlaq_f32(c,a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return vmlaq_s32(c,a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return vminq_f32(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b) { return vminq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return vmaxq_f32(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b) { return vmaxq_s32(a,b); }
+
+// Logical Operations are not supported for float, so we have to reinterpret casts using NEON intrinsics
+template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));
+}
+template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return vandq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));
+}
+template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return vorrq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));
+}
+template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return veorq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b)
+{
+  return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(a),vreinterpretq_u32_f32(b)));
+}
+template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return vbicq_s32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return vld1q_f32(from); }
+template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*   from) { EIGEN_DEBUG_ALIGNED_LOAD return vld1q_s32(from); }
+
+template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) { EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_f32(from); }
+template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)   { EIGEN_DEBUG_UNALIGNED_LOAD return vld1q_s32(from); }
+
+template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)
+{
+  float32x2_t lo, hi;
+  lo = vdup_n_f32(*from);
+  hi = vdup_n_f32(*(from+1));
+  return vcombine_f32(lo, hi);
+}
+template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
+{
+  int32x2_t lo, hi;
+  lo = vdup_n_s32(*from);
+  hi = vdup_n_s32(*(from+1));
+  return vcombine_s32(lo, hi);
+}
+
+template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE vst1q_f32(to, from); }
+template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE vst1q_s32(to, from); }
+
+template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE vst1q_f32(to, from); }
+template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE vst1q_s32(to, from); }
+
+template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { __pld(addr); }
+template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*     addr) { __pld(addr); }
+
+// FIXME only store the 2 first elements ?
+template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float EIGEN_ALIGN16 x[4]; vst1q_f32(x, a); return x[0]; }
+template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int   EIGEN_ALIGN16 x[4]; vst1q_s32(x, a); return x[0]; }
+
+template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a) {
+  float32x2_t a_lo, a_hi;
+  Packet4f a_r64;
+
+  a_r64 = vrev64q_f32(a);
+  a_lo = vget_low_f32(a_r64);
+  a_hi = vget_high_f32(a_r64);
+  return vcombine_f32(a_hi, a_lo);
+}
+template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a) {
+  int32x2_t a_lo, a_hi;
+  Packet4i a_r64;
+
+  a_r64 = vrev64q_s32(a);
+  a_lo = vget_low_s32(a_r64);
+  a_hi = vget_high_s32(a_r64);
+  return vcombine_s32(a_hi, a_lo);
+}
+template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a) { return vabsq_f32(a); }
+template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a) { return vabsq_s32(a); }
+
+template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
+{
+  float32x2_t a_lo, a_hi, sum;
+
+  a_lo = vget_low_f32(a);
+  a_hi = vget_high_f32(a);
+  sum = vpadd_f32(a_lo, a_hi);
+  sum = vpadd_f32(sum, sum);
+  return vget_lane_f32(sum, 0);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
+{
+  float32x4x2_t vtrn1, vtrn2, res1, res2;
+  Packet4f sum1, sum2, sum;
+
+  // NEON zip performs interleaving of the supplied vectors.
+  // We perform two interleaves in a row to acquire the transposed vector
+  vtrn1 = vzipq_f32(vecs[0], vecs[2]);
+  vtrn2 = vzipq_f32(vecs[1], vecs[3]);
+  res1 = vzipq_f32(vtrn1.val[0], vtrn2.val[0]);
+  res2 = vzipq_f32(vtrn1.val[1], vtrn2.val[1]);
+
+  // Do the addition of the resulting vectors
+  sum1 = vaddq_f32(res1.val[0], res1.val[1]);
+  sum2 = vaddq_f32(res2.val[0], res2.val[1]);
+  sum = vaddq_f32(sum1, sum2);
+
+  return sum;
+}
+
+template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
+{
+  int32x2_t a_lo, a_hi, sum;
+
+  a_lo = vget_low_s32(a);
+  a_hi = vget_high_s32(a);
+  sum = vpadd_s32(a_lo, a_hi);
+  sum = vpadd_s32(sum, sum);
+  return vget_lane_s32(sum, 0);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)
+{
+  int32x4x2_t vtrn1, vtrn2, res1, res2;
+  Packet4i sum1, sum2, sum;
+
+  // NEON zip performs interleaving of the supplied vectors.
+  // We perform two interleaves in a row to acquire the transposed vector
+  vtrn1 = vzipq_s32(vecs[0], vecs[2]);
+  vtrn2 = vzipq_s32(vecs[1], vecs[3]);
+  res1 = vzipq_s32(vtrn1.val[0], vtrn2.val[0]);
+  res2 = vzipq_s32(vtrn1.val[1], vtrn2.val[1]);
+
+  // Do the addition of the resulting vectors
+  sum1 = vaddq_s32(res1.val[0], res1.val[1]);
+  sum2 = vaddq_s32(res2.val[0], res2.val[1]);
+  sum = vaddq_s32(sum1, sum2);
+
+  return sum;
+}
+
+// Other reduction functions:
+// mul
+template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
+{
+  float32x2_t a_lo, a_hi, prod;
+
+  // Get a_lo = |a1|a2| and a_hi = |a3|a4|
+  a_lo = vget_low_f32(a);
+  a_hi = vget_high_f32(a);
+  // Get the product of a_lo * a_hi -> |a1*a3|a2*a4|
+  prod = vmul_f32(a_lo, a_hi);
+  // Multiply prod with its swapped value |a2*a4|a1*a3|
+  prod = vmul_f32(prod, vrev64_f32(prod));
+
+  return vget_lane_f32(prod, 0);
+}
+template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
+{
+  int32x2_t a_lo, a_hi, prod;
+
+  // Get a_lo = |a1|a2| and a_hi = |a3|a4|
+  a_lo = vget_low_s32(a);
+  a_hi = vget_high_s32(a);
+  // Get the product of a_lo * a_hi -> |a1*a3|a2*a4|
+  prod = vmul_s32(a_lo, a_hi);
+  // Multiply prod with its swapped value |a2*a4|a1*a3|
+  prod = vmul_s32(prod, vrev64_s32(prod));
+
+  return vget_lane_s32(prod, 0);
+}
+
+// min
+template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
+{
+  float32x2_t a_lo, a_hi, min;
+
+  a_lo = vget_low_f32(a);
+  a_hi = vget_high_f32(a);
+  min = vpmin_f32(a_lo, a_hi);
+  min = vpmin_f32(min, min);
+
+  return vget_lane_f32(min, 0);
+}
+
+template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
+{
+  int32x2_t a_lo, a_hi, min;
+
+  a_lo = vget_low_s32(a);
+  a_hi = vget_high_s32(a);
+  min = vpmin_s32(a_lo, a_hi);
+  min = vpmin_s32(min, min);
+  
+  return vget_lane_s32(min, 0);
+}
+
+// max
+template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
+{
+  float32x2_t a_lo, a_hi, max;
+
+  a_lo = vget_low_f32(a);
+  a_hi = vget_high_f32(a);
+  max = vpmax_f32(a_lo, a_hi);
+  max = vpmax_f32(max, max);
+
+  return vget_lane_f32(max, 0);
+}
+
+template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
+{
+  int32x2_t a_lo, a_hi, max;
+
+  a_lo = vget_low_s32(a);
+  a_hi = vget_high_s32(a);
+  max = vpmax_s32(a_lo, a_hi);
+
+  return vget_lane_s32(max, 0);
+}
+
+// this PALIGN_NEON business is to work around a bug in LLVM Clang 3.0 causing incorrect compilation errors,
+// see bug 347 and this LLVM bug: http://llvm.org/bugs/show_bug.cgi?id=11074
+#define PALIGN_NEON(Offset,Type,Command) \
+template<>\
+struct palign_impl<Offset,Type>\
+{\
+    EIGEN_STRONG_INLINE static void run(Type& first, const Type& second)\
+    {\
+        if (Offset!=0)\
+            first = Command(first, second, Offset);\
+    }\
+};\
+
+PALIGN_NEON(0,Packet4f,vextq_f32)
+PALIGN_NEON(1,Packet4f,vextq_f32)
+PALIGN_NEON(2,Packet4f,vextq_f32)
+PALIGN_NEON(3,Packet4f,vextq_f32)
+PALIGN_NEON(0,Packet4i,vextq_s32)
+PALIGN_NEON(1,Packet4i,vextq_s32)
+PALIGN_NEON(2,Packet4i,vextq_s32)
+PALIGN_NEON(3,Packet4i,vextq_s32)
+    
+#undef PALIGN_NEON
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PACKET_MATH_NEON_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/CMakeLists.txt
new file mode 100644
index 0000000..46ea7cc
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_arch_SSE_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_arch_SSE_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/arch/SSE COMPONENT Devel
+)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/Complex.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/Complex.h
new file mode 100644
index 0000000..bd76d75
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/Complex.h
@@ -0,0 +1,442 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPLEX_SSE_H
+#define EIGEN_COMPLEX_SSE_H
+
+namespace Eigen {
+
+namespace internal {
+
+//---------- float ----------
+struct Packet2cf
+{
+  EIGEN_STRONG_INLINE Packet2cf() {}
+  EIGEN_STRONG_INLINE explicit Packet2cf(const __m128& a) : v(a) {}
+  __m128  v;
+};
+
+template<> struct packet_traits<std::complex<float> >  : default_packet_traits
+{
+  typedef Packet2cf type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size = 2,
+
+    HasAdd    = 1,
+    HasSub    = 1,
+    HasMul    = 1,
+    HasDiv    = 1,
+    HasNegate = 1,
+    HasAbs    = 0,
+    HasAbs2   = 0,
+    HasMin    = 0,
+    HasMax    = 0,
+    HasSetLinear = 0
+  };
+};
+
+template<> struct unpacket_traits<Packet2cf> { typedef std::complex<float> type; enum {size=2}; };
+
+template<> EIGEN_STRONG_INLINE Packet2cf padd<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_add_ps(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf psub<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_sub_ps(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pnegate(const Packet2cf& a)
+{
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
+  return Packet2cf(_mm_xor_ps(a.v,mask));
+}
+template<> EIGEN_STRONG_INLINE Packet2cf pconj(const Packet2cf& a)
+{
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
+  return Packet2cf(_mm_xor_ps(a.v,mask));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pmul<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  // TODO optimize it for SSE3 and 4
+  #ifdef EIGEN_VECTORIZE_SSE3
+  return Packet2cf(_mm_addsub_ps(_mm_mul_ps(_mm_moveldup_ps(a.v), b.v),
+                                 _mm_mul_ps(_mm_movehdup_ps(a.v),
+                                            vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+//   return Packet2cf(_mm_addsub_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
+//                                  _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+//                                             vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+  #else
+  const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x00000000,0x80000000,0x00000000));
+  return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
+                              _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+                                                    vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));
+  #endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf pand   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_and_ps(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf por    <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_or_ps(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pxor   <Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_xor_ps(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet2cf pandnot<Packet2cf>(const Packet2cf& a, const Packet2cf& b) { return Packet2cf(_mm_andnot_ps(a.v,b.v)); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf pload <Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_ALIGNED_LOAD return Packet2cf(pload<Packet4f>(&real_ref(*from))); }
+template<> EIGEN_STRONG_INLINE Packet2cf ploadu<Packet2cf>(const std::complex<float>* from) { EIGEN_DEBUG_UNALIGNED_LOAD return Packet2cf(ploadu<Packet4f>(&real_ref(*from))); }
+
+template<> EIGEN_STRONG_INLINE Packet2cf pset1<Packet2cf>(const std::complex<float>&  from)
+{
+  Packet2cf res;
+#if EIGEN_GNUC_AT_MOST(4,2)
+  // Workaround annoying "may be used uninitialized in this function" warning with gcc 4.2
+  res.v = _mm_loadl_pi(_mm_set1_ps(0.0f), reinterpret_cast<const __m64*>(&from));
+#elif EIGEN_GNUC_AT_LEAST(4,6)
+  // Suppress annoying "may be used uninitialized in this function" warning with gcc >= 4.6
+  #pragma GCC diagnostic push
+  #pragma GCC diagnostic ignored "-Wuninitialized"
+  res.v = _mm_loadl_pi(res.v, (const __m64*)&from);
+  #pragma GCC diagnostic pop
+#else
+  res.v = _mm_loadl_pi(res.v, (const __m64*)&from);
+#endif
+  return Packet2cf(_mm_movelh_ps(res.v,res.v));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf ploaddup<Packet2cf>(const std::complex<float>* from) { return pset1<Packet2cf>(*from); }
+
+template<> EIGEN_STRONG_INLINE void pstore <std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_ALIGNED_STORE pstore(&real_ref(*to), from.v); }
+template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<float> >(std::complex<float> *   to, const Packet2cf& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(&real_ref(*to), from.v); }
+
+template<> EIGEN_STRONG_INLINE void prefetch<std::complex<float> >(const std::complex<float> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
+
+template<> EIGEN_STRONG_INLINE std::complex<float>  pfirst<Packet2cf>(const Packet2cf& a)
+{
+  #if EIGEN_GNUC_AT_MOST(4,3)
+  // Workaround gcc 4.2 ICE - this is not performance wise ideal, but who cares...
+  // This workaround also fix invalid code generation with gcc 4.3
+  EIGEN_ALIGN16 std::complex<float> res[2];
+  _mm_store_ps((float*)res, a.v);
+  return res[0];
+  #else
+  std::complex<float> res;
+  _mm_storel_pi((__m64*)&res, a.v);
+  return res;
+  #endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preverse(const Packet2cf& a) { return Packet2cf(_mm_castpd_ps(preverse(_mm_castps_pd(a.v)))); }
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux<Packet2cf>(const Packet2cf& a)
+{
+  return pfirst(Packet2cf(_mm_add_ps(a.v, _mm_movehl_ps(a.v,a.v))));
+}
+
+template<> EIGEN_STRONG_INLINE Packet2cf preduxp<Packet2cf>(const Packet2cf* vecs)
+{
+  return Packet2cf(_mm_add_ps(_mm_movelh_ps(vecs[0].v,vecs[1].v), _mm_movehl_ps(vecs[1].v,vecs[0].v)));
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<float> predux_mul<Packet2cf>(const Packet2cf& a)
+{
+  return pfirst(pmul(a, Packet2cf(_mm_movehl_ps(a.v,a.v))));
+}
+
+template<int Offset>
+struct palign_impl<Offset,Packet2cf>
+{
+  static EIGEN_STRONG_INLINE void run(Packet2cf& first, const Packet2cf& second)
+  {
+    if (Offset==1)
+    {
+      first.v = _mm_movehl_ps(first.v, first.v);
+      first.v = _mm_movelh_ps(first.v, second.v);
+    }
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, false,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return internal::pmul(a, pconj(b));
+    #else
+    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
+    return Packet2cf(_mm_add_ps(_mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v), mask),
+                                _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+                                           vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,false>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return internal::pmul(pconj(a), b);
+    #else
+    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
+    return Packet2cf(_mm_add_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v),
+                                _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+                                                      vec4f_swizzle1(b.v, 1, 0, 3, 2)), mask)));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet2cf, Packet2cf, true,true>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& a, const Packet2cf& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return pconj(internal::pmul(a, b));
+    #else
+    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0x00000000,0x80000000,0x00000000,0x80000000));
+    return Packet2cf(_mm_sub_ps(_mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a.v, 0, 0, 2, 2), b.v), mask),
+                                _mm_mul_ps(vec4f_swizzle1(a.v, 1, 1, 3, 3),
+                                           vec4f_swizzle1(b.v, 1, 0, 3, 2))));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet4f, Packet2cf, false,false>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet4f& x, const Packet2cf& y, const Packet2cf& c) const
+  { return padd(c, pmul(x,y)); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet4f& x, const Packet2cf& y) const
+  { return Packet2cf(Eigen::internal::pmul(x, y.v)); }
+};
+
+template<> struct conj_helper<Packet2cf, Packet4f, false,false>
+{
+  EIGEN_STRONG_INLINE Packet2cf pmadd(const Packet2cf& x, const Packet4f& y, const Packet2cf& c) const
+  { return padd(c, pmul(x,y)); }
+
+  EIGEN_STRONG_INLINE Packet2cf pmul(const Packet2cf& x, const Packet4f& y) const
+  { return Packet2cf(Eigen::internal::pmul(x.v, y)); }
+};
+
+template<> EIGEN_STRONG_INLINE Packet2cf pdiv<Packet2cf>(const Packet2cf& a, const Packet2cf& b)
+{
+  // TODO optimize it for SSE3 and 4
+  Packet2cf res = conj_helper<Packet2cf,Packet2cf,false,true>().pmul(a,b);
+  __m128 s = _mm_mul_ps(b.v,b.v);
+  return Packet2cf(_mm_div_ps(res.v,_mm_add_ps(s,_mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(s), 0xb1)))));
+}
+
+EIGEN_STRONG_INLINE Packet2cf pcplxflip/*<Packet2cf>*/(const Packet2cf& x)
+{
+  return Packet2cf(vec4f_swizzle1(x.v, 1, 0, 3, 2));
+}
+
+
+//---------- double ----------
+struct Packet1cd
+{
+  EIGEN_STRONG_INLINE Packet1cd() {}
+  EIGEN_STRONG_INLINE explicit Packet1cd(const __m128d& a) : v(a) {}
+  __m128d  v;
+};
+
+template<> struct packet_traits<std::complex<double> >  : default_packet_traits
+{
+  typedef Packet1cd type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 0,
+    size = 1,
+
+    HasAdd    = 1,
+    HasSub    = 1,
+    HasMul    = 1,
+    HasDiv    = 1,
+    HasNegate = 1,
+    HasAbs    = 0,
+    HasAbs2   = 0,
+    HasMin    = 0,
+    HasMax    = 0,
+    HasSetLinear = 0
+  };
+};
+
+template<> struct unpacket_traits<Packet1cd> { typedef std::complex<double> type; enum {size=1}; };
+
+template<> EIGEN_STRONG_INLINE Packet1cd padd<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_add_pd(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd psub<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_sub_pd(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd pnegate(const Packet1cd& a) { return Packet1cd(pnegate(a.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd pconj(const Packet1cd& a)
+{
+  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
+  return Packet1cd(_mm_xor_pd(a.v,mask));
+}
+
+template<> EIGEN_STRONG_INLINE Packet1cd pmul<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
+{
+  // TODO optimize it for SSE3 and 4
+  #ifdef EIGEN_VECTORIZE_SSE3
+  return Packet1cd(_mm_addsub_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),
+                                 _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
+                                            vec2d_swizzle1(b.v, 1, 0))));
+  #else
+  const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));
+  return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),
+                              _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
+                                                    vec2d_swizzle1(b.v, 1, 0)), mask)));
+  #endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet1cd pand   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_and_pd(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd por    <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_or_pd(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd pxor   <Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_xor_pd(a.v,b.v)); }
+template<> EIGEN_STRONG_INLINE Packet1cd pandnot<Packet1cd>(const Packet1cd& a, const Packet1cd& b) { return Packet1cd(_mm_andnot_pd(a.v,b.v)); }
+
+// FIXME force unaligned load, this is a temporary fix
+template<> EIGEN_STRONG_INLINE Packet1cd pload <Packet1cd>(const std::complex<double>* from)
+{ EIGEN_DEBUG_ALIGNED_LOAD return Packet1cd(pload<Packet2d>((const double*)from)); }
+template<> EIGEN_STRONG_INLINE Packet1cd ploadu<Packet1cd>(const std::complex<double>* from)
+{ EIGEN_DEBUG_UNALIGNED_LOAD return Packet1cd(ploadu<Packet2d>((const double*)from)); }
+template<> EIGEN_STRONG_INLINE Packet1cd pset1<Packet1cd>(const std::complex<double>&  from)
+{ /* here we really have to use unaligned loads :( */ return ploadu<Packet1cd>(&from); }
+
+template<> EIGEN_STRONG_INLINE Packet1cd ploaddup<Packet1cd>(const std::complex<double>* from) { return pset1<Packet1cd>(*from); }
+
+// FIXME force unaligned store, this is a temporary fix
+template<> EIGEN_STRONG_INLINE void pstore <std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_ALIGNED_STORE pstore((double*)to, from.v); }
+template<> EIGEN_STRONG_INLINE void pstoreu<std::complex<double> >(std::complex<double> *   to, const Packet1cd& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu((double*)to, from.v); }
+
+template<> EIGEN_STRONG_INLINE void prefetch<std::complex<double> >(const std::complex<double> *   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
+
+template<> EIGEN_STRONG_INLINE std::complex<double>  pfirst<Packet1cd>(const Packet1cd& a)
+{
+  EIGEN_ALIGN16 double res[2];
+  _mm_store_pd(res, a.v);
+  return std::complex<double>(res[0],res[1]);
+}
+
+template<> EIGEN_STRONG_INLINE Packet1cd preverse(const Packet1cd& a) { return a; }
+
+template<> EIGEN_STRONG_INLINE std::complex<double> predux<Packet1cd>(const Packet1cd& a)
+{
+  return pfirst(a);
+}
+
+template<> EIGEN_STRONG_INLINE Packet1cd preduxp<Packet1cd>(const Packet1cd* vecs)
+{
+  return vecs[0];
+}
+
+template<> EIGEN_STRONG_INLINE std::complex<double> predux_mul<Packet1cd>(const Packet1cd& a)
+{
+  return pfirst(a);
+}
+
+template<int Offset>
+struct palign_impl<Offset,Packet1cd>
+{
+  static EIGEN_STRONG_INLINE void run(Packet1cd& /*first*/, const Packet1cd& /*second*/)
+  {
+    // FIXME is it sure we never have to align a Packet1cd?
+    // Even though a std::complex<double> has 16 bytes, it is not necessarily aligned on a 16 bytes boundary...
+  }
+};
+
+template<> struct conj_helper<Packet1cd, Packet1cd, false,true>
+{
+  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return internal::pmul(a, pconj(b));
+    #else
+    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
+    return Packet1cd(_mm_add_pd(_mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v), mask),
+                                _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
+                                           vec2d_swizzle1(b.v, 1, 0))));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet1cd, Packet1cd, true,false>
+{
+  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return internal::pmul(pconj(a), b);
+    #else
+    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
+    return Packet1cd(_mm_add_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v),
+                                _mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
+                                                      vec2d_swizzle1(b.v, 1, 0)), mask)));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet1cd, Packet1cd, true,true>
+{
+  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet1cd& y, const Packet1cd& c) const
+  { return padd(pmul(x,y),c); }
+
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& a, const Packet1cd& b) const
+  {
+    #ifdef EIGEN_VECTORIZE_SSE3
+    return pconj(internal::pmul(a, b));
+    #else
+    const __m128d mask = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
+    return Packet1cd(_mm_sub_pd(_mm_xor_pd(_mm_mul_pd(vec2d_swizzle1(a.v, 0, 0), b.v), mask),
+                                _mm_mul_pd(vec2d_swizzle1(a.v, 1, 1),
+                                           vec2d_swizzle1(b.v, 1, 0))));
+    #endif
+  }
+};
+
+template<> struct conj_helper<Packet2d, Packet1cd, false,false>
+{
+  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet2d& x, const Packet1cd& y, const Packet1cd& c) const
+  { return padd(c, pmul(x,y)); }
+
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet2d& x, const Packet1cd& y) const
+  { return Packet1cd(Eigen::internal::pmul(x, y.v)); }
+};
+
+template<> struct conj_helper<Packet1cd, Packet2d, false,false>
+{
+  EIGEN_STRONG_INLINE Packet1cd pmadd(const Packet1cd& x, const Packet2d& y, const Packet1cd& c) const
+  { return padd(c, pmul(x,y)); }
+
+  EIGEN_STRONG_INLINE Packet1cd pmul(const Packet1cd& x, const Packet2d& y) const
+  { return Packet1cd(Eigen::internal::pmul(x.v, y)); }
+};
+
+template<> EIGEN_STRONG_INLINE Packet1cd pdiv<Packet1cd>(const Packet1cd& a, const Packet1cd& b)
+{
+  // TODO optimize it for SSE3 and 4
+  Packet1cd res = conj_helper<Packet1cd,Packet1cd,false,true>().pmul(a,b);
+  __m128d s = _mm_mul_pd(b.v,b.v);
+  return Packet1cd(_mm_div_pd(res.v, _mm_add_pd(s,_mm_shuffle_pd(s, s, 0x1))));
+}
+
+EIGEN_STRONG_INLINE Packet1cd pcplxflip/*<Packet1cd>*/(const Packet1cd& x)
+{
+  return Packet1cd(preverse(x.v));
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_SSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/MathFunctions.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/MathFunctions.h
new file mode 100644
index 0000000..5ede55f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/MathFunctions.h
@@ -0,0 +1,464 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007 Julien Pommier
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* The sin, cos, exp, and log functions of this file come from
+ * Julien Pommier's sse math library: http://gruntthepeon.free.fr/ssemath/
+ */
+
+#ifndef EIGEN_MATH_FUNCTIONS_SSE_H
+#define EIGEN_MATH_FUNCTIONS_SSE_H
+
+namespace Eigen {
+
+namespace internal {
+
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet4f plog<Packet4f>(const Packet4f& _x)
+{
+  Packet4f x = _x;
+  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);
+  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);
+  _EIGEN_DECLARE_CONST_Packet4i(0x7f, 0x7f);
+
+  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(inv_mant_mask, ~0x7f800000);
+
+  /* the smallest non denormalized float number */
+  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(min_norm_pos,  0x00800000);
+  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(minus_inf,     0xff800000);//-1.f/0.f);
+  
+  /* natural logarithm computed for 4 simultaneous float
+    return NaN for x <= 0
+  */
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_SQRTHF, 0.707106781186547524f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p0, 7.0376836292E-2f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p1, - 1.1514610310E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p2, 1.1676998740E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p3, - 1.2420140846E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p4, + 1.4249322787E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p5, - 1.6668057665E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p6, + 2.0000714765E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p7, - 2.4999993993E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_p8, + 3.3333331174E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_q1, -2.12194440e-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_log_q2, 0.693359375f);
+
+
+  Packet4i emm0;
+
+  Packet4f invalid_mask = _mm_cmplt_ps(x, _mm_setzero_ps());
+  Packet4f iszero_mask = _mm_cmpeq_ps(x, _mm_setzero_ps());
+
+  x = pmax(x, p4f_min_norm_pos);  /* cut off denormalized stuff */
+  emm0 = _mm_srli_epi32(_mm_castps_si128(x), 23);
+
+  /* keep only the fractional part */
+  x = _mm_and_ps(x, p4f_inv_mant_mask);
+  x = _mm_or_ps(x, p4f_half);
+
+  emm0 = _mm_sub_epi32(emm0, p4i_0x7f);
+  Packet4f e = padd(_mm_cvtepi32_ps(emm0), p4f_1);
+
+  /* part2:
+     if( x < SQRTHF ) {
+       e -= 1;
+       x = x + x - 1.0;
+     } else { x = x - 1.0; }
+  */
+  Packet4f mask = _mm_cmplt_ps(x, p4f_cephes_SQRTHF);
+  Packet4f tmp = _mm_and_ps(x, mask);
+  x = psub(x, p4f_1);
+  e = psub(e, _mm_and_ps(p4f_1, mask));
+  x = padd(x, tmp);
+
+  Packet4f x2 = pmul(x,x);
+  Packet4f x3 = pmul(x2,x);
+
+  Packet4f y, y1, y2;
+  y  = pmadd(p4f_cephes_log_p0, x, p4f_cephes_log_p1);
+  y1 = pmadd(p4f_cephes_log_p3, x, p4f_cephes_log_p4);
+  y2 = pmadd(p4f_cephes_log_p6, x, p4f_cephes_log_p7);
+  y  = pmadd(y , x, p4f_cephes_log_p2);
+  y1 = pmadd(y1, x, p4f_cephes_log_p5);
+  y2 = pmadd(y2, x, p4f_cephes_log_p8);
+  y = pmadd(y, x3, y1);
+  y = pmadd(y, x3, y2);
+  y = pmul(y, x3);
+
+  y1 = pmul(e, p4f_cephes_log_q1);
+  tmp = pmul(x2, p4f_half);
+  y = padd(y, y1);
+  x = psub(x, tmp);
+  y2 = pmul(e, p4f_cephes_log_q2);
+  x = padd(x, y);
+  x = padd(x, y2);
+  // negative arg will be NAN, 0 will be -INF
+  return _mm_or_ps(_mm_andnot_ps(iszero_mask, _mm_or_ps(x, invalid_mask)),
+                   _mm_and_ps(iszero_mask, p4f_minus_inf));
+}
+
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet4f pexp<Packet4f>(const Packet4f& _x)
+{
+  Packet4f x = _x;
+  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);
+  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);
+  _EIGEN_DECLARE_CONST_Packet4i(0x7f, 0x7f);
+
+
+  _EIGEN_DECLARE_CONST_Packet4f(exp_hi,  88.3762626647950f);
+  _EIGEN_DECLARE_CONST_Packet4f(exp_lo, -88.3762626647949f);
+
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_LOG2EF, 1.44269504088896341f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_C1, 0.693359375f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_C2, -2.12194440e-4f);
+
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p0, 1.9875691500E-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p1, 1.3981999507E-3f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p2, 8.3334519073E-3f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p3, 4.1665795894E-2f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p4, 1.6666665459E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_exp_p5, 5.0000001201E-1f);
+
+  Packet4f tmp = _mm_setzero_ps(), fx;
+  Packet4i emm0;
+
+  // clamp x
+  x = pmax(pmin(x, p4f_exp_hi), p4f_exp_lo);
+
+  /* express exp(x) as exp(g + n*log(2)) */
+  fx = pmadd(x, p4f_cephes_LOG2EF, p4f_half);
+
+#ifdef EIGEN_VECTORIZE_SSE4_1
+  fx = _mm_floor_ps(fx);
+#else
+  emm0 = _mm_cvttps_epi32(fx);
+  tmp  = _mm_cvtepi32_ps(emm0);
+  /* if greater, substract 1 */
+  Packet4f mask = _mm_cmpgt_ps(tmp, fx);
+  mask = _mm_and_ps(mask, p4f_1);
+  fx = psub(tmp, mask);
+#endif
+
+  tmp = pmul(fx, p4f_cephes_exp_C1);
+  Packet4f z = pmul(fx, p4f_cephes_exp_C2);
+  x = psub(x, tmp);
+  x = psub(x, z);
+
+  z = pmul(x,x);
+
+  Packet4f y = p4f_cephes_exp_p0;
+  y = pmadd(y, x, p4f_cephes_exp_p1);
+  y = pmadd(y, x, p4f_cephes_exp_p2);
+  y = pmadd(y, x, p4f_cephes_exp_p3);
+  y = pmadd(y, x, p4f_cephes_exp_p4);
+  y = pmadd(y, x, p4f_cephes_exp_p5);
+  y = pmadd(y, z, x);
+  y = padd(y, p4f_1);
+
+  // build 2^n
+  emm0 = _mm_cvttps_epi32(fx);
+  emm0 = _mm_add_epi32(emm0, p4i_0x7f);
+  emm0 = _mm_slli_epi32(emm0, 23);
+  return pmul(y, _mm_castsi128_ps(emm0));
+}
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet2d pexp<Packet2d>(const Packet2d& _x)
+{
+  Packet2d x = _x;
+
+  _EIGEN_DECLARE_CONST_Packet2d(1 , 1.0);
+  _EIGEN_DECLARE_CONST_Packet2d(2 , 2.0);
+  _EIGEN_DECLARE_CONST_Packet2d(half, 0.5);
+
+  _EIGEN_DECLARE_CONST_Packet2d(exp_hi,  709.437);
+  _EIGEN_DECLARE_CONST_Packet2d(exp_lo, -709.436139303);
+
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_LOG2EF, 1.4426950408889634073599);
+
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p0, 1.26177193074810590878e-4);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p1, 3.02994407707441961300e-2);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_p2, 9.99999999999999999910e-1);
+
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q0, 3.00198505138664455042e-6);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q1, 2.52448340349684104192e-3);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q2, 2.27265548208155028766e-1);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_q3, 2.00000000000000000009e0);
+
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C1, 0.693145751953125);
+  _EIGEN_DECLARE_CONST_Packet2d(cephes_exp_C2, 1.42860682030941723212e-6);
+  static const __m128i p4i_1023_0 = _mm_setr_epi32(1023, 1023, 0, 0);
+
+  Packet2d tmp = _mm_setzero_pd(), fx;
+  Packet4i emm0;
+
+  // clamp x
+  x = pmax(pmin(x, p2d_exp_hi), p2d_exp_lo);
+  /* express exp(x) as exp(g + n*log(2)) */
+  fx = pmadd(p2d_cephes_LOG2EF, x, p2d_half);
+
+#ifdef EIGEN_VECTORIZE_SSE4_1
+  fx = _mm_floor_pd(fx);
+#else
+  emm0 = _mm_cvttpd_epi32(fx);
+  tmp  = _mm_cvtepi32_pd(emm0);
+  /* if greater, substract 1 */
+  Packet2d mask = _mm_cmpgt_pd(tmp, fx);
+  mask = _mm_and_pd(mask, p2d_1);
+  fx = psub(tmp, mask);
+#endif
+
+  tmp = pmul(fx, p2d_cephes_exp_C1);
+  Packet2d z = pmul(fx, p2d_cephes_exp_C2);
+  x = psub(x, tmp);
+  x = psub(x, z);
+
+  Packet2d x2 = pmul(x,x);
+
+  Packet2d px = p2d_cephes_exp_p0;
+  px = pmadd(px, x2, p2d_cephes_exp_p1);
+  px = pmadd(px, x2, p2d_cephes_exp_p2);
+  px = pmul (px, x);
+
+  Packet2d qx = p2d_cephes_exp_q0;
+  qx = pmadd(qx, x2, p2d_cephes_exp_q1);
+  qx = pmadd(qx, x2, p2d_cephes_exp_q2);
+  qx = pmadd(qx, x2, p2d_cephes_exp_q3);
+
+  x = pdiv(px,psub(qx,px));
+  x = pmadd(p2d_2,x,p2d_1);
+
+  // build 2^n
+  emm0 = _mm_cvttpd_epi32(fx);
+  emm0 = _mm_add_epi32(emm0, p4i_1023_0);
+  emm0 = _mm_slli_epi32(emm0, 20);
+  emm0 = _mm_shuffle_epi32(emm0, _MM_SHUFFLE(1,2,0,3));
+  return pmul(x, _mm_castsi128_pd(emm0));
+}
+
+/* evaluation of 4 sines at onces, using SSE2 intrinsics.
+
+   The code is the exact rewriting of the cephes sinf function.
+   Precision is excellent as long as x < 8192 (I did not bother to
+   take into account the special handling they have for greater values
+   -- it does not return garbage for arguments over 8192, though, but
+   the extra precision is missing).
+
+   Note that it is such that sinf((float)M_PI) = 8.74e-8, which is the
+   surprising but correct result.
+*/
+
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet4f psin<Packet4f>(const Packet4f& _x)
+{
+  Packet4f x = _x;
+  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);
+  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);
+
+  _EIGEN_DECLARE_CONST_Packet4i(1, 1);
+  _EIGEN_DECLARE_CONST_Packet4i(not1, ~1);
+  _EIGEN_DECLARE_CONST_Packet4i(2, 2);
+  _EIGEN_DECLARE_CONST_Packet4i(4, 4);
+
+  _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(sign_mask, 0x80000000);
+
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP1,-0.78515625f);
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP2, -2.4187564849853515625e-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP3, -3.77489497744594108e-8f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p0, -1.9515295891E-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p1,  8.3321608736E-3f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p2, -1.6666654611E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p0,  2.443315711809948E-005f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p1, -1.388731625493765E-003f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p2,  4.166664568298827E-002f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_FOPI, 1.27323954473516f); // 4 / M_PI
+
+  Packet4f xmm1, xmm2 = _mm_setzero_ps(), xmm3, sign_bit, y;
+
+  Packet4i emm0, emm2;
+  sign_bit = x;
+  /* take the absolute value */
+  x = pabs(x);
+
+  /* take the modulo */
+
+  /* extract the sign bit (upper one) */
+  sign_bit = _mm_and_ps(sign_bit, p4f_sign_mask);
+
+  /* scale by 4/Pi */
+  y = pmul(x, p4f_cephes_FOPI);
+
+  /* store the integer part of y in mm0 */
+  emm2 = _mm_cvttps_epi32(y);
+  /* j=(j+1) & (~1) (see the cephes sources) */
+  emm2 = _mm_add_epi32(emm2, p4i_1);
+  emm2 = _mm_and_si128(emm2, p4i_not1);
+  y = _mm_cvtepi32_ps(emm2);
+  /* get the swap sign flag */
+  emm0 = _mm_and_si128(emm2, p4i_4);
+  emm0 = _mm_slli_epi32(emm0, 29);
+  /* get the polynom selection mask
+     there is one polynom for 0 <= x <= Pi/4
+     and another one for Pi/4<x<=Pi/2
+
+     Both branches will be computed.
+  */
+  emm2 = _mm_and_si128(emm2, p4i_2);
+  emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128());
+
+  Packet4f swap_sign_bit = _mm_castsi128_ps(emm0);
+  Packet4f poly_mask = _mm_castsi128_ps(emm2);
+  sign_bit = _mm_xor_ps(sign_bit, swap_sign_bit);
+
+  /* The magic pass: "Extended precision modular arithmetic"
+     x = ((x - y * DP1) - y * DP2) - y * DP3; */
+  xmm1 = pmul(y, p4f_minus_cephes_DP1);
+  xmm2 = pmul(y, p4f_minus_cephes_DP2);
+  xmm3 = pmul(y, p4f_minus_cephes_DP3);
+  x = padd(x, xmm1);
+  x = padd(x, xmm2);
+  x = padd(x, xmm3);
+
+  /* Evaluate the first polynom  (0 <= x <= Pi/4) */
+  y = p4f_coscof_p0;
+  Packet4f z = _mm_mul_ps(x,x);
+
+  y = pmadd(y, z, p4f_coscof_p1);
+  y = pmadd(y, z, p4f_coscof_p2);
+  y = pmul(y, z);
+  y = pmul(y, z);
+  Packet4f tmp = pmul(z, p4f_half);
+  y = psub(y, tmp);
+  y = padd(y, p4f_1);
+
+  /* Evaluate the second polynom  (Pi/4 <= x <= 0) */
+
+  Packet4f y2 = p4f_sincof_p0;
+  y2 = pmadd(y2, z, p4f_sincof_p1);
+  y2 = pmadd(y2, z, p4f_sincof_p2);
+  y2 = pmul(y2, z);
+  y2 = pmul(y2, x);
+  y2 = padd(y2, x);
+
+  /* select the correct result from the two polynoms */
+  y2 = _mm_and_ps(poly_mask, y2);
+  y = _mm_andnot_ps(poly_mask, y);
+  y = _mm_or_ps(y,y2);
+  /* update the sign */
+  return _mm_xor_ps(y, sign_bit);
+}
+
+/* almost the same as psin */
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet4f pcos<Packet4f>(const Packet4f& _x)
+{
+  Packet4f x = _x;
+  _EIGEN_DECLARE_CONST_Packet4f(1 , 1.0f);
+  _EIGEN_DECLARE_CONST_Packet4f(half, 0.5f);
+
+  _EIGEN_DECLARE_CONST_Packet4i(1, 1);
+  _EIGEN_DECLARE_CONST_Packet4i(not1, ~1);
+  _EIGEN_DECLARE_CONST_Packet4i(2, 2);
+  _EIGEN_DECLARE_CONST_Packet4i(4, 4);
+
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP1,-0.78515625f);
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP2, -2.4187564849853515625e-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(minus_cephes_DP3, -3.77489497744594108e-8f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p0, -1.9515295891E-4f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p1,  8.3321608736E-3f);
+  _EIGEN_DECLARE_CONST_Packet4f(sincof_p2, -1.6666654611E-1f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p0,  2.443315711809948E-005f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p1, -1.388731625493765E-003f);
+  _EIGEN_DECLARE_CONST_Packet4f(coscof_p2,  4.166664568298827E-002f);
+  _EIGEN_DECLARE_CONST_Packet4f(cephes_FOPI, 1.27323954473516f); // 4 / M_PI
+
+  Packet4f xmm1, xmm2 = _mm_setzero_ps(), xmm3, y;
+  Packet4i emm0, emm2;
+
+  x = pabs(x);
+
+  /* scale by 4/Pi */
+  y = pmul(x, p4f_cephes_FOPI);
+
+  /* get the integer part of y */
+  emm2 = _mm_cvttps_epi32(y);
+  /* j=(j+1) & (~1) (see the cephes sources) */
+  emm2 = _mm_add_epi32(emm2, p4i_1);
+  emm2 = _mm_and_si128(emm2, p4i_not1);
+  y = _mm_cvtepi32_ps(emm2);
+
+  emm2 = _mm_sub_epi32(emm2, p4i_2);
+
+  /* get the swap sign flag */
+  emm0 = _mm_andnot_si128(emm2, p4i_4);
+  emm0 = _mm_slli_epi32(emm0, 29);
+  /* get the polynom selection mask */
+  emm2 = _mm_and_si128(emm2, p4i_2);
+  emm2 = _mm_cmpeq_epi32(emm2, _mm_setzero_si128());
+
+  Packet4f sign_bit = _mm_castsi128_ps(emm0);
+  Packet4f poly_mask = _mm_castsi128_ps(emm2);
+
+  /* The magic pass: "Extended precision modular arithmetic"
+     x = ((x - y * DP1) - y * DP2) - y * DP3; */
+  xmm1 = pmul(y, p4f_minus_cephes_DP1);
+  xmm2 = pmul(y, p4f_minus_cephes_DP2);
+  xmm3 = pmul(y, p4f_minus_cephes_DP3);
+  x = padd(x, xmm1);
+  x = padd(x, xmm2);
+  x = padd(x, xmm3);
+
+  /* Evaluate the first polynom  (0 <= x <= Pi/4) */
+  y = p4f_coscof_p0;
+  Packet4f z = pmul(x,x);
+
+  y = pmadd(y,z,p4f_coscof_p1);
+  y = pmadd(y,z,p4f_coscof_p2);
+  y = pmul(y, z);
+  y = pmul(y, z);
+  Packet4f tmp = _mm_mul_ps(z, p4f_half);
+  y = psub(y, tmp);
+  y = padd(y, p4f_1);
+
+  /* Evaluate the second polynom  (Pi/4 <= x <= 0) */
+  Packet4f y2 = p4f_sincof_p0;
+  y2 = pmadd(y2, z, p4f_sincof_p1);
+  y2 = pmadd(y2, z, p4f_sincof_p2);
+  y2 = pmul(y2, z);
+  y2 = pmadd(y2, x, x);
+
+  /* select the correct result from the two polynoms */
+  y2 = _mm_and_ps(poly_mask, y2);
+  y  = _mm_andnot_ps(poly_mask, y);
+  y  = _mm_or_ps(y,y2);
+
+  /* update the sign */
+  return _mm_xor_ps(y, sign_bit);
+}
+
+// This is based on Quake3's fast inverse square root.
+// For detail see here: http://www.beyond3d.com/content/articles/8/
+template<> EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS EIGEN_UNUSED
+Packet4f psqrt<Packet4f>(const Packet4f& _x)
+{
+  Packet4f half = pmul(_x, pset1<Packet4f>(.5f));
+
+  /* select only the inverse sqrt of non-zero inputs */
+  Packet4f non_zero_mask = _mm_cmpgt_ps(_x, pset1<Packet4f>(std::numeric_limits<float>::epsilon()));
+  Packet4f x = _mm_and_ps(non_zero_mask, _mm_rsqrt_ps(_x));
+
+  x = pmul(x, psub(pset1<Packet4f>(1.5f), pmul(half, pmul(x,x))));
+  return pmul(_x,x);
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_MATH_FUNCTIONS_SSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/PacketMath.h b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/PacketMath.h
new file mode 100644
index 0000000..50114b8
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/arch/SSE/PacketMath.h
@@ -0,0 +1,644 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PACKET_MATH_SSE_H
+#define EIGEN_PACKET_MATH_SSE_H
+
+namespace Eigen {
+
+namespace internal {
+
+#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
+#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
+#endif
+
+#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
+#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS (2*sizeof(void*))
+#endif
+
+typedef __m128  Packet4f;
+typedef __m128i Packet4i;
+typedef __m128d Packet2d;
+
+template<> struct is_arithmetic<__m128>  { enum { value = true }; };
+template<> struct is_arithmetic<__m128i> { enum { value = true }; };
+template<> struct is_arithmetic<__m128d> { enum { value = true }; };
+
+#define vec4f_swizzle1(v,p,q,r,s) \
+  (_mm_castsi128_ps(_mm_shuffle_epi32( _mm_castps_si128(v), ((s)<<6|(r)<<4|(q)<<2|(p)))))
+
+#define vec4i_swizzle1(v,p,q,r,s) \
+  (_mm_shuffle_epi32( v, ((s)<<6|(r)<<4|(q)<<2|(p))))
+
+#define vec2d_swizzle1(v,p,q) \
+  (_mm_castsi128_pd(_mm_shuffle_epi32( _mm_castpd_si128(v), ((q*2+1)<<6|(q*2)<<4|(p*2+1)<<2|(p*2)))))
+  
+#define vec4f_swizzle2(a,b,p,q,r,s) \
+  (_mm_shuffle_ps( (a), (b), ((s)<<6|(r)<<4|(q)<<2|(p))))
+
+#define vec4i_swizzle2(a,b,p,q,r,s) \
+  (_mm_castps_si128( (_mm_shuffle_ps( _mm_castsi128_ps(a), _mm_castsi128_ps(b), ((s)<<6|(r)<<4|(q)<<2|(p))))))
+
+#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
+  const Packet4f p4f_##NAME = pset1<Packet4f>(X)
+
+#define _EIGEN_DECLARE_CONST_Packet2d(NAME,X) \
+  const Packet2d p2d_##NAME = pset1<Packet2d>(X)
+
+#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
+  const Packet4f p4f_##NAME = _mm_castsi128_ps(pset1<Packet4i>(X))
+
+#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
+  const Packet4i p4i_##NAME = pset1<Packet4i>(X)
+
+
+template<> struct packet_traits<float>  : default_packet_traits
+{
+  typedef Packet4f type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=4,
+
+    HasDiv  = 1,
+    HasSin  = EIGEN_FAST_MATH,
+    HasCos  = EIGEN_FAST_MATH,
+    HasLog  = 1,
+    HasExp  = 1,
+    HasSqrt = 1
+  };
+};
+template<> struct packet_traits<double> : default_packet_traits
+{
+  typedef Packet2d type;
+  enum {
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=2,
+
+    HasDiv  = 1,
+    HasExp  = 1
+  };
+};
+template<> struct packet_traits<int>    : default_packet_traits
+{
+  typedef Packet4i type;
+  enum {
+    // FIXME check the Has*
+    Vectorizable = 1,
+    AlignedOnScalar = 1,
+    size=4
+  };
+};
+
+template<> struct unpacket_traits<Packet4f> { typedef float  type; enum {size=4}; };
+template<> struct unpacket_traits<Packet2d> { typedef double type; enum {size=2}; };
+template<> struct unpacket_traits<Packet4i> { typedef int    type; enum {size=4}; };
+
+#if defined(_MSC_VER) && (_MSC_VER==1500)
+// Workaround MSVC 9 internal compiler error.
+// TODO: It has been detected with win64 builds (amd64), so let's check whether it also happens in 32bits+SSE mode
+// TODO: let's check whether there does not exist a better fix, like adding a pset0() function. (it crashed on pset1(0)).
+template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return _mm_set_ps(from,from,from,from); }
+template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set_pd(from,from); }
+template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from) { return _mm_set_epi32(from,from,from,from); }
+#else
+template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float&  from) { return _mm_set1_ps(from); }
+template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set1_pd(from); }
+template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int&    from) { return _mm_set1_epi32(from); }
+#endif
+
+template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return _mm_add_ps(pset1<Packet4f>(a), _mm_set_ps(3,2,1,0)); }
+template<> EIGEN_STRONG_INLINE Packet2d plset<double>(const double& a) { return _mm_add_pd(pset1<Packet2d>(a),_mm_set_pd(1,0)); }
+template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a) { return _mm_add_epi32(pset1<Packet4i>(a),_mm_set_epi32(3,2,1,0)); }
+
+template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_add_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_add_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_add_epi32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_sub_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_sub_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_sub_epi32(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)
+{
+  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
+  return _mm_xor_ps(a,mask);
+}
+template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a)
+{
+  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0,0x80000000,0x0,0x80000000));
+  return _mm_xor_pd(a,mask);
+}
+template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a)
+{
+  return psub(_mm_setr_epi32(0,0,0,0), a);
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_mul_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_mul_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)
+{
+#ifdef EIGEN_VECTORIZE_SSE4_1
+  return _mm_mullo_epi32(a,b);
+#else
+  // this version is slightly faster than 4 scalar products
+  return vec4i_swizzle1(
+            vec4i_swizzle2(
+              _mm_mul_epu32(a,b),
+              _mm_mul_epu32(vec4i_swizzle1(a,1,0,3,2),
+                            vec4i_swizzle1(b,1,0,3,2)),
+              0,2,0,2),
+            0,2,1,3);
+#endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_div_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_div_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
+{ eigen_assert(false && "packet integer division are not supported by SSE");
+  return pset1<Packet4i>(0);
+}
+
+// for some weird raisons, it has to be overloaded for packet of integers
+template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_min_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_min_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b)
+{
+#ifdef EIGEN_VECTORIZE_SSE4_1
+  return _mm_min_epi32(a,b);
+#else
+  // after some bench, this version *is* faster than a scalar implementation
+  Packet4i mask = _mm_cmplt_epi32(a,b);
+  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
+#endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_max_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_max_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b)
+{
+#ifdef EIGEN_VECTORIZE_SSE4_1
+  return _mm_max_epi32(a,b);
+#else
+  // after some bench, this version *is* faster than a scalar implementation
+  Packet4i mask = _mm_cmpgt_epi32(a,b);
+  return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
+#endif
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_and_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_and_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_and_si128(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_or_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_or_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_or_si128(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_xor_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_xor_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_xor_si128(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_andnot_ps(a,b); }
+template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_andnot_pd(a,b); }
+template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_andnot_si128(a,b); }
+
+template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float*   from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_ps(from); }
+template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double*  from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_pd(from); }
+template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int*     from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const Packet4i*>(from)); }
+
+#if defined(_MSC_VER)
+  template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float*  from) {
+    EIGEN_DEBUG_UNALIGNED_LOAD
+    #if (_MSC_VER==1600)
+    // NOTE Some version of MSVC10 generates bad code when using _mm_loadu_ps
+    // (i.e., it does not generate an unaligned load!!
+    // TODO On most architectures this version should also be faster than a single _mm_loadu_ps
+    // so we could also enable it for MSVC08 but first we have to make this later does not generate crap when doing so...
+    __m128 res = _mm_loadl_pi(_mm_set1_ps(0.0f), (const __m64*)(from));
+    res = _mm_loadh_pi(res, (const __m64*)(from+2));
+    return res;
+    #else
+    return _mm_loadu_ps(from);
+    #endif
+  }
+  template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_pd(from); }
+  template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int*    from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from)); }
+#else
+// Fast unaligned loads. Note that here we cannot directly use intrinsics: this would
+// require pointer casting to incompatible pointer types and leads to invalid code
+// because of the strict aliasing rule. The "dummy" stuff are required to enforce
+// a correct instruction dependency.
+// TODO: do the same for MSVC (ICC is compatible)
+// NOTE: with the code below, MSVC's compiler crashes!
+
+#if defined(__GNUC__) && defined(__i386__)
+  // bug 195: gcc/i386 emits weird x87 fldl/fstpl instructions for _mm_load_sd
+  #define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
+#elif defined(__clang__)
+  // bug 201: Segfaults in __mm_loadh_pd with clang 2.8
+  #define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
+#else
+  #define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 0
+#endif
+
+template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
+{
+  EIGEN_DEBUG_UNALIGNED_LOAD
+#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
+  return _mm_loadu_ps(from);
+#else
+  __m128d res;
+  res =  _mm_load_sd((const double*)(from)) ;
+  res =  _mm_loadh_pd(res, (const double*)(from+2)) ;
+  return _mm_castpd_ps(res);
+#endif
+}
+template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
+{
+  EIGEN_DEBUG_UNALIGNED_LOAD
+#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
+  return _mm_loadu_pd(from);
+#else
+  __m128d res;
+  res = _mm_load_sd(from) ;
+  res = _mm_loadh_pd(res,from+1);
+  return res;
+#endif
+}
+template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
+{
+  EIGEN_DEBUG_UNALIGNED_LOAD
+#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
+  return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from));
+#else
+  __m128d res;
+  res =  _mm_load_sd((const double*)(from)) ;
+  res =  _mm_loadh_pd(res, (const double*)(from+2)) ;
+  return _mm_castpd_si128(res);
+#endif
+}
+#endif
+
+template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float*   from)
+{
+  return vec4f_swizzle1(_mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from))), 0, 0, 1, 1);
+}
+template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double*  from)
+{ return pset1<Packet2d>(from[0]); }
+template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int*     from)
+{
+  Packet4i tmp;
+  tmp = _mm_loadl_epi64(reinterpret_cast<const Packet4i*>(from));
+  return vec4i_swizzle1(tmp, 0, 0, 1, 1);
+}
+
+template<> EIGEN_STRONG_INLINE void pstore<float>(float*   to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_ps(to, from); }
+template<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_pd(to, from); }
+template<> EIGEN_STRONG_INLINE void pstore<int>(int*       to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<Packet4i*>(to), from); }
+
+template<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
+  EIGEN_DEBUG_UNALIGNED_STORE
+  _mm_storel_pd((to), from);
+  _mm_storeh_pd((to+1), from);
+}
+template<> EIGEN_STRONG_INLINE void pstoreu<float>(float*  to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castps_pd(from)); }
+template<> EIGEN_STRONG_INLINE void pstoreu<int>(int*      to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castsi128_pd(from)); }
+
+// some compilers might be tempted to perform multiple moves instead of using a vector path.
+template<> EIGEN_STRONG_INLINE void pstore1<Packet4f>(float* to, const float& a)
+{
+  Packet4f pa = _mm_set_ss(a);
+  pstore(to, vec4f_swizzle1(pa,0,0,0,0));
+}
+// some compilers might be tempted to perform multiple moves instead of using a vector path.
+template<> EIGEN_STRONG_INLINE void pstore1<Packet2d>(double* to, const double& a)
+{
+  Packet2d pa = _mm_set_sd(a);
+  pstore(to, vec2d_swizzle1(pa,0,0));
+}
+
+template<> EIGEN_STRONG_INLINE void prefetch<float>(const float*   addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
+template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
+template<> EIGEN_STRONG_INLINE void prefetch<int>(const int*       addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
+
+#if defined(_MSC_VER) && defined(_WIN64) && !defined(__INTEL_COMPILER)
+// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
+// Direct of the struct members fixed bug #62.
+template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return a.m128_f32[0]; }
+template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return a.m128d_f64[0]; }
+template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
+#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
+// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
+template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { float x = _mm_cvtss_f32(a); return x; }
+template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { double x = _mm_cvtsd_f64(a); return x; }
+template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
+#else
+template<> EIGEN_STRONG_INLINE float  pfirst<Packet4f>(const Packet4f& a) { return _mm_cvtss_f32(a); }
+template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return _mm_cvtsd_f64(a); }
+template<> EIGEN_STRONG_INLINE int    pfirst<Packet4i>(const Packet4i& a) { return _mm_cvtsi128_si32(a); }
+#endif
+
+template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
+{ return _mm_shuffle_ps(a,a,0x1B); }
+template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)
+{ return _mm_shuffle_pd(a,a,0x1); }
+template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)
+{ return _mm_shuffle_epi32(a,0x1B); }
+
+
+template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a)
+{
+  const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF));
+  return _mm_and_ps(a,mask);
+}
+template<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a)
+{
+  const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF));
+  return _mm_and_pd(a,mask);
+}
+template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a)
+{
+  #ifdef EIGEN_VECTORIZE_SSSE3
+  return _mm_abs_epi32(a);
+  #else
+  Packet4i aux = _mm_srai_epi32(a,31);
+  return _mm_sub_epi32(_mm_xor_si128(a,aux),aux);
+  #endif
+}
+
+EIGEN_STRONG_INLINE void punpackp(Packet4f* vecs)
+{
+  vecs[1] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x55));
+  vecs[2] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xAA));
+  vecs[3] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xFF));
+  vecs[0] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x00));
+}
+
+#ifdef EIGEN_VECTORIZE_SSE3
+// TODO implement SSE2 versions as well as integer versions
+template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
+{
+  return _mm_hadd_ps(_mm_hadd_ps(vecs[0], vecs[1]),_mm_hadd_ps(vecs[2], vecs[3]));
+}
+template<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)
+{
+  return _mm_hadd_pd(vecs[0], vecs[1]);
+}
+// SSSE3 version:
+// EIGEN_STRONG_INLINE Packet4i preduxp(const Packet4i* vecs)
+// {
+//   return _mm_hadd_epi32(_mm_hadd_epi32(vecs[0], vecs[1]),_mm_hadd_epi32(vecs[2], vecs[3]));
+// }
+
+template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
+{
+  Packet4f tmp0 = _mm_hadd_ps(a,a);
+  return pfirst(_mm_hadd_ps(tmp0, tmp0));
+}
+
+template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) { return pfirst(_mm_hadd_pd(a, a)); }
+
+// SSSE3 version:
+// EIGEN_STRONG_INLINE float predux(const Packet4i& a)
+// {
+//   Packet4i tmp0 = _mm_hadd_epi32(a,a);
+//   return pfirst(_mm_hadd_epi32(tmp0, tmp0));
+// }
+#else
+// SSE2 versions
+template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
+{
+  Packet4f tmp = _mm_add_ps(a, _mm_movehl_ps(a,a));
+  return pfirst(_mm_add_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+}
+template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
+{
+  return pfirst(_mm_add_sd(a, _mm_unpackhi_pd(a,a)));
+}
+
+template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
+{
+  Packet4f tmp0, tmp1, tmp2;
+  tmp0 = _mm_unpacklo_ps(vecs[0], vecs[1]);
+  tmp1 = _mm_unpackhi_ps(vecs[0], vecs[1]);
+  tmp2 = _mm_unpackhi_ps(vecs[2], vecs[3]);
+  tmp0 = _mm_add_ps(tmp0, tmp1);
+  tmp1 = _mm_unpacklo_ps(vecs[2], vecs[3]);
+  tmp1 = _mm_add_ps(tmp1, tmp2);
+  tmp2 = _mm_movehl_ps(tmp1, tmp0);
+  tmp0 = _mm_movelh_ps(tmp0, tmp1);
+  return _mm_add_ps(tmp0, tmp2);
+}
+
+template<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)
+{
+  return _mm_add_pd(_mm_unpacklo_pd(vecs[0], vecs[1]), _mm_unpackhi_pd(vecs[0], vecs[1]));
+}
+#endif  // SSE3
+
+template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
+{
+  Packet4i tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a,a));
+  return pfirst(tmp) + pfirst(_mm_shuffle_epi32(tmp, 1));
+}
+
+template<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)
+{
+  Packet4i tmp0, tmp1, tmp2;
+  tmp0 = _mm_unpacklo_epi32(vecs[0], vecs[1]);
+  tmp1 = _mm_unpackhi_epi32(vecs[0], vecs[1]);
+  tmp2 = _mm_unpackhi_epi32(vecs[2], vecs[3]);
+  tmp0 = _mm_add_epi32(tmp0, tmp1);
+  tmp1 = _mm_unpacklo_epi32(vecs[2], vecs[3]);
+  tmp1 = _mm_add_epi32(tmp1, tmp2);
+  tmp2 = _mm_unpacklo_epi64(tmp0, tmp1);
+  tmp0 = _mm_unpackhi_epi64(tmp0, tmp1);
+  return _mm_add_epi32(tmp0, tmp2);
+}
+
+// Other reduction functions:
+
+// mul
+template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
+{
+  Packet4f tmp = _mm_mul_ps(a, _mm_movehl_ps(a,a));
+  return pfirst(_mm_mul_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+}
+template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
+{
+  return pfirst(_mm_mul_sd(a, _mm_unpackhi_pd(a,a)));
+}
+template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
+{
+  // after some experiments, it is seems this is the fastest way to implement it
+  // for GCC (eg., reusing pmul is very slow !)
+  // TODO try to call _mm_mul_epu32 directly
+  EIGEN_ALIGN16 int aux[4];
+  pstore(aux, a);
+  return  (aux[0] * aux[1]) * (aux[2] * aux[3]);;
+}
+
+// min
+template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
+{
+  Packet4f tmp = _mm_min_ps(a, _mm_movehl_ps(a,a));
+  return pfirst(_mm_min_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+}
+template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
+{
+  return pfirst(_mm_min_sd(a, _mm_unpackhi_pd(a,a)));
+}
+template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
+{
+  // after some experiments, it is seems this is the fastest way to implement it
+  // for GCC (eg., it does not like using std::min after the pstore !!)
+  EIGEN_ALIGN16 int aux[4];
+  pstore(aux, a);
+  int aux0 = aux[0]<aux[1] ? aux[0] : aux[1];
+  int aux2 = aux[2]<aux[3] ? aux[2] : aux[3];
+  return aux0<aux2 ? aux0 : aux2;
+}
+
+// max
+template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
+{
+  Packet4f tmp = _mm_max_ps(a, _mm_movehl_ps(a,a));
+  return pfirst(_mm_max_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
+}
+template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
+{
+  return pfirst(_mm_max_sd(a, _mm_unpackhi_pd(a,a)));
+}
+template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
+{
+  // after some experiments, it is seems this is the fastest way to implement it
+  // for GCC (eg., it does not like using std::min after the pstore !!)
+  EIGEN_ALIGN16 int aux[4];
+  pstore(aux, a);
+  int aux0 = aux[0]>aux[1] ? aux[0] : aux[1];
+  int aux2 = aux[2]>aux[3] ? aux[2] : aux[3];
+  return aux0>aux2 ? aux0 : aux2;
+}
+
+#if (defined __GNUC__)
+// template <> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f&  a, const Packet4f&  b, const Packet4f&  c)
+// {
+//   Packet4f res = b;
+//   asm("mulps %[a], %[b] \n\taddps %[c], %[b]" : [b] "+x" (res) : [a] "x" (a), [c] "x" (c));
+//   return res;
+// }
+// EIGEN_STRONG_INLINE Packet4i _mm_alignr_epi8(const Packet4i&  a, const Packet4i&  b, const int i)
+// {
+//   Packet4i res = a;
+//   asm("palignr %[i], %[a], %[b] " : [b] "+x" (res) : [a] "x" (a), [i] "i" (i));
+//   return res;
+// }
+#endif
+
+#ifdef EIGEN_VECTORIZE_SSSE3
+// SSSE3 versions
+template<int Offset>
+struct palign_impl<Offset,Packet4f>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
+  {
+    if (Offset!=0)
+      first = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(second), _mm_castps_si128(first), Offset*4));
+  }
+};
+
+template<int Offset>
+struct palign_impl<Offset,Packet4i>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
+  {
+    if (Offset!=0)
+      first = _mm_alignr_epi8(second,first, Offset*4);
+  }
+};
+
+template<int Offset>
+struct palign_impl<Offset,Packet2d>
+{
+  static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)
+  {
+    if (Offset==1)
+      first = _mm_castsi128_pd(_mm_alignr_epi8(_mm_castpd_si128(second), _mm_castpd_si128(first), 8));
+  }
+};
+#else
+// SSE2 versions
+template<int Offset>
+struct palign_impl<Offset,Packet4f>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
+  {
+    if (Offset==1)
+    {
+      first = _mm_move_ss(first,second);
+      first = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(first),0x39));
+    }
+    else if (Offset==2)
+    {
+      first = _mm_movehl_ps(first,first);
+      first = _mm_movelh_ps(first,second);
+    }
+    else if (Offset==3)
+    {
+      first = _mm_move_ss(first,second);
+      first = _mm_shuffle_ps(first,second,0x93);
+    }
+  }
+};
+
+template<int Offset>
+struct palign_impl<Offset,Packet4i>
+{
+  static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
+  {
+    if (Offset==1)
+    {
+      first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
+      first = _mm_shuffle_epi32(first,0x39);
+    }
+    else if (Offset==2)
+    {
+      first = _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(first)));
+      first = _mm_castps_si128(_mm_movelh_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
+    }
+    else if (Offset==3)
+    {
+      first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
+      first = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second),0x93));
+    }
+  }
+};
+
+template<int Offset>
+struct palign_impl<Offset,Packet2d>
+{
+  static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)
+  {
+    if (Offset==1)
+    {
+      first = _mm_castps_pd(_mm_movehl_ps(_mm_castpd_ps(first),_mm_castpd_ps(first)));
+      first = _mm_castps_pd(_mm_movelh_ps(_mm_castpd_ps(first),_mm_castpd_ps(second)));
+    }
+  }
+};
+#endif
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PACKET_MATH_SSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/products/CMakeLists.txt
new file mode 100644
index 0000000..21fc94a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_Product_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Core_Product_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/products COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/CoeffBasedProduct.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/CoeffBasedProduct.h
new file mode 100644
index 0000000..c06a0df
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/CoeffBasedProduct.h
@@ -0,0 +1,441 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COEFFBASED_PRODUCT_H
+#define EIGEN_COEFFBASED_PRODUCT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/*********************************************************************************
+*  Coefficient based product implementation.
+*  It is designed for the following use cases:
+*  - small fixed sizes
+*  - lazy products
+*********************************************************************************/
+
+/* Since the all the dimensions of the product are small, here we can rely
+ * on the generic Assign mechanism to evaluate the product per coeff (or packet).
+ *
+ * Note that here the inner-loops should always be unrolled.
+ */
+
+template<int Traversal, int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl;
+
+template<int StorageOrder, int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl;
+
+template<typename LhsNested, typename RhsNested, int NestingFlags>
+struct traits<CoeffBasedProduct<LhsNested,RhsNested,NestingFlags> >
+{
+  typedef MatrixXpr XprKind;
+  typedef typename remove_all<LhsNested>::type _LhsNested;
+  typedef typename remove_all<RhsNested>::type _RhsNested;
+  typedef typename scalar_product_traits<typename _LhsNested::Scalar, typename _RhsNested::Scalar>::ReturnType Scalar;
+  typedef typename promote_storage_type<typename traits<_LhsNested>::StorageKind,
+                                           typename traits<_RhsNested>::StorageKind>::ret StorageKind;
+  typedef typename promote_index_type<typename traits<_LhsNested>::Index,
+                                         typename traits<_RhsNested>::Index>::type Index;
+
+  enum {
+      LhsCoeffReadCost = _LhsNested::CoeffReadCost,
+      RhsCoeffReadCost = _RhsNested::CoeffReadCost,
+      LhsFlags = _LhsNested::Flags,
+      RhsFlags = _RhsNested::Flags,
+
+      RowsAtCompileTime = _LhsNested::RowsAtCompileTime,
+      ColsAtCompileTime = _RhsNested::ColsAtCompileTime,
+      InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),
+
+      MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,
+
+      LhsRowMajor = LhsFlags & RowMajorBit,
+      RhsRowMajor = RhsFlags & RowMajorBit,
+
+      SameType = is_same<typename _LhsNested::Scalar,typename _RhsNested::Scalar>::value,
+
+      CanVectorizeRhs = RhsRowMajor && (RhsFlags & PacketAccessBit)
+                      && (ColsAtCompileTime == Dynamic
+                          || ( (ColsAtCompileTime % packet_traits<Scalar>::size) == 0
+                              && (RhsFlags&AlignedBit)
+                             )
+                         ),
+
+      CanVectorizeLhs = (!LhsRowMajor) && (LhsFlags & PacketAccessBit)
+                      && (RowsAtCompileTime == Dynamic
+                          || ( (RowsAtCompileTime % packet_traits<Scalar>::size) == 0
+                              && (LhsFlags&AlignedBit)
+                             )
+                         ),
+
+      EvalToRowMajor = (MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
+                     : (MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
+                     : (RhsRowMajor && !CanVectorizeLhs),
+
+      Flags = ((unsigned int)(LhsFlags | RhsFlags) & HereditaryBits & ~RowMajorBit)
+            | (EvalToRowMajor ? RowMajorBit : 0)
+            | NestingFlags
+            | (LhsFlags & RhsFlags & AlignedBit)
+            // TODO enable vectorization for mixed types
+            | (SameType && (CanVectorizeLhs || CanVectorizeRhs) ? PacketAccessBit : 0),
+
+      CoeffReadCost = InnerSize == Dynamic ? Dynamic
+                    : InnerSize * (NumTraits<Scalar>::MulCost + LhsCoeffReadCost + RhsCoeffReadCost)
+                      + (InnerSize - 1) * NumTraits<Scalar>::AddCost,
+
+      /* CanVectorizeInner deserves special explanation. It does not affect the product flags. It is not used outside
+      * of Product. If the Product itself is not a packet-access expression, there is still a chance that the inner
+      * loop of the product might be vectorized. This is the meaning of CanVectorizeInner. Since it doesn't affect
+      * the Flags, it is safe to make this value depend on ActualPacketAccessBit, that doesn't affect the ABI.
+      */
+      CanVectorizeInner =    SameType
+                          && LhsRowMajor
+                          && (!RhsRowMajor)
+                          && (LhsFlags & RhsFlags & ActualPacketAccessBit)
+                          && (LhsFlags & RhsFlags & AlignedBit)
+                          && (InnerSize % packet_traits<Scalar>::size == 0)
+    };
+};
+
+} // end namespace internal
+
+template<typename LhsNested, typename RhsNested, int NestingFlags>
+class CoeffBasedProduct
+  : internal::no_assignment_operator,
+    public MatrixBase<CoeffBasedProduct<LhsNested, RhsNested, NestingFlags> >
+{
+  public:
+
+    typedef MatrixBase<CoeffBasedProduct> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(CoeffBasedProduct)
+    typedef typename Base::PlainObject PlainObject;
+
+  private:
+
+    typedef typename internal::traits<CoeffBasedProduct>::_LhsNested _LhsNested;
+    typedef typename internal::traits<CoeffBasedProduct>::_RhsNested _RhsNested;
+
+    enum {
+      PacketSize = internal::packet_traits<Scalar>::size,
+      InnerSize  = internal::traits<CoeffBasedProduct>::InnerSize,
+      Unroll = CoeffReadCost != Dynamic && CoeffReadCost <= EIGEN_UNROLLING_LIMIT,
+      CanVectorizeInner = internal::traits<CoeffBasedProduct>::CanVectorizeInner
+    };
+
+    typedef internal::product_coeff_impl<CanVectorizeInner ? InnerVectorizedTraversal : DefaultTraversal,
+                                   Unroll ? InnerSize-1 : Dynamic,
+                                   _LhsNested, _RhsNested, Scalar> ScalarCoeffImpl;
+
+    typedef CoeffBasedProduct<LhsNested,RhsNested,NestByRefBit> LazyCoeffBasedProductType;
+
+  public:
+
+    inline CoeffBasedProduct(const CoeffBasedProduct& other)
+      : Base(), m_lhs(other.m_lhs), m_rhs(other.m_rhs)
+    {}
+
+    template<typename Lhs, typename Rhs>
+    inline CoeffBasedProduct(const Lhs& lhs, const Rhs& rhs)
+      : m_lhs(lhs), m_rhs(rhs)
+    {
+      // we don't allow taking products of matrices of different real types, as that wouldn't be vectorizable.
+      // We still allow to mix T and complex<T>.
+      EIGEN_STATIC_ASSERT((internal::scalar_product_traits<typename Lhs::RealScalar, typename Rhs::RealScalar>::Defined),
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+      eigen_assert(lhs.cols() == rhs.rows()
+        && "invalid matrix product"
+        && "if you wanted a coeff-wise or a dot product use the respective explicit functions");
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
+
+    EIGEN_STRONG_INLINE const Scalar coeff(Index row, Index col) const
+    {
+      Scalar res;
+      ScalarCoeffImpl::run(row, col, m_lhs, m_rhs, res);
+      return res;
+    }
+
+    /* Allow index-based non-packet access. It is impossible though to allow index-based packed access,
+     * which is why we don't set the LinearAccessBit.
+     */
+    EIGEN_STRONG_INLINE const Scalar coeff(Index index) const
+    {
+      Scalar res;
+      const Index row = RowsAtCompileTime == 1 ? 0 : index;
+      const Index col = RowsAtCompileTime == 1 ? index : 0;
+      ScalarCoeffImpl::run(row, col, m_lhs, m_rhs, res);
+      return res;
+    }
+
+    template<int LoadMode>
+    EIGEN_STRONG_INLINE const PacketScalar packet(Index row, Index col) const
+    {
+      PacketScalar res;
+      internal::product_packet_impl<Flags&RowMajorBit ? RowMajor : ColMajor,
+                              Unroll ? InnerSize-1 : Dynamic,
+                              _LhsNested, _RhsNested, PacketScalar, LoadMode>
+        ::run(row, col, m_lhs, m_rhs, res);
+      return res;
+    }
+
+    // Implicit conversion to the nested type (trigger the evaluation of the product)
+    EIGEN_STRONG_INLINE operator const PlainObject& () const
+    {
+      m_result.lazyAssign(*this);
+      return m_result;
+    }
+
+    const _LhsNested& lhs() const { return m_lhs; }
+    const _RhsNested& rhs() const { return m_rhs; }
+
+    const Diagonal<const LazyCoeffBasedProductType,0> diagonal() const
+    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this); }
+
+    template<int DiagonalIndex>
+    const Diagonal<const LazyCoeffBasedProductType,DiagonalIndex> diagonal() const
+    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this); }
+
+    const Diagonal<const LazyCoeffBasedProductType,Dynamic> diagonal(Index index) const
+    { return reinterpret_cast<const LazyCoeffBasedProductType&>(*this).diagonal(index); }
+
+  protected:
+    typename internal::add_const_on_value_type<LhsNested>::type m_lhs;
+    typename internal::add_const_on_value_type<RhsNested>::type m_rhs;
+
+    mutable PlainObject m_result;
+};
+
+namespace internal {
+
+// here we need to overload the nested rule for products
+// such that the nested type is a const reference to a plain matrix
+template<typename Lhs, typename Rhs, int N, typename PlainObject>
+struct nested<CoeffBasedProduct<Lhs,Rhs,EvalBeforeNestingBit|EvalBeforeAssigningBit>, N, PlainObject>
+{
+  typedef PlainObject const& type;
+};
+
+/***************************************************************************
+* Normal product .coeff() implementation (with meta-unrolling)
+***************************************************************************/
+
+/**************************************
+*** Scalar path  - no vectorization ***
+**************************************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl<DefaultTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)
+  {
+    product_coeff_impl<DefaultTraversal, UnrollingIndex-1, Lhs, Rhs, RetScalar>::run(row, col, lhs, rhs, res);
+    res += lhs.coeff(row, UnrollingIndex) * rhs.coeff(UnrollingIndex, col);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl<DefaultTraversal, 0, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)
+  {
+    res = lhs.coeff(row, 0) * rhs.coeff(0, col);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl<DefaultTraversal, Dynamic, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar& res)
+  {
+    eigen_assert(lhs.cols()>0 && "you are using a non initialized matrix");
+    res = lhs.coeff(row, 0) * rhs.coeff(0, col);
+      for(Index i = 1; i < lhs.cols(); ++i)
+        res += lhs.coeff(row, i) * rhs.coeff(i, col);
+  }
+};
+
+/*******************************************
+*** Scalar path with inner vectorization ***
+*******************************************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet>
+struct product_coeff_vectorized_unroller
+{
+  typedef typename Lhs::Index Index;
+  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::PacketScalar &pres)
+  {
+    product_coeff_vectorized_unroller<UnrollingIndex-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, pres);
+    pres = padd(pres, pmul( lhs.template packet<Aligned>(row, UnrollingIndex) , rhs.template packet<Aligned>(UnrollingIndex, col) ));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet>
+struct product_coeff_vectorized_unroller<0, Lhs, Rhs, Packet>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::PacketScalar &pres)
+  {
+    pres = pmul(lhs.template packet<Aligned>(row, 0) , rhs.template packet<Aligned>(0, col));
+  }
+};
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl<InnerVectorizedTraversal, UnrollingIndex, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::PacketScalar Packet;
+  typedef typename Lhs::Index Index;
+  enum { PacketSize = packet_traits<typename Lhs::Scalar>::size };
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, RetScalar &res)
+  {
+    Packet pres;
+    product_coeff_vectorized_unroller<UnrollingIndex+1-PacketSize, Lhs, Rhs, Packet>::run(row, col, lhs, rhs, pres);
+    product_coeff_impl<DefaultTraversal,UnrollingIndex,Lhs,Rhs,RetScalar>::run(row, col, lhs, rhs, res);
+    res = predux(pres);
+  }
+};
+
+template<typename Lhs, typename Rhs, int LhsRows = Lhs::RowsAtCompileTime, int RhsCols = Rhs::ColsAtCompileTime>
+struct product_coeff_vectorized_dyn_selector
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)
+  {
+    res = lhs.row(row).transpose().cwiseProduct(rhs.col(col)).sum();
+  }
+};
+
+// NOTE the 3 following specializations are because taking .col(0) on a vector is a bit slower
+// NOTE maybe they are now useless since we have a specialization for Block<Matrix>
+template<typename Lhs, typename Rhs, int RhsCols>
+struct product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,RhsCols>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)
+  {
+    res = lhs.transpose().cwiseProduct(rhs.col(col)).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs, int LhsRows>
+struct product_coeff_vectorized_dyn_selector<Lhs,Rhs,LhsRows,1>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index /*col*/, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)
+  {
+    res = lhs.row(row).transpose().cwiseProduct(rhs).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs>
+struct product_coeff_vectorized_dyn_selector<Lhs,Rhs,1,1>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index /*row*/, Index /*col*/, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)
+  {
+    res = lhs.transpose().cwiseProduct(rhs).sum();
+  }
+};
+
+template<typename Lhs, typename Rhs, typename RetScalar>
+struct product_coeff_impl<InnerVectorizedTraversal, Dynamic, Lhs, Rhs, RetScalar>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, typename Lhs::Scalar &res)
+  {
+    product_coeff_vectorized_dyn_selector<Lhs,Rhs>::run(row, col, lhs, rhs, res);
+  }
+};
+
+/*******************
+*** Packet path  ***
+*******************/
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<RowMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)
+  {
+    product_packet_impl<RowMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, res);
+    res =  pmadd(pset1<Packet>(lhs.coeff(row, UnrollingIndex)), rhs.template packet<LoadMode>(UnrollingIndex, col), res);
+  }
+};
+
+template<int UnrollingIndex, typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<ColMajor, UnrollingIndex, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)
+  {
+    product_packet_impl<ColMajor, UnrollingIndex-1, Lhs, Rhs, Packet, LoadMode>::run(row, col, lhs, rhs, res);
+    res =  pmadd(lhs.template packet<LoadMode>(row, UnrollingIndex), pset1<Packet>(rhs.coeff(UnrollingIndex, col)), res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<RowMajor, 0, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)
+  {
+    res = pmul(pset1<Packet>(lhs.coeff(row, 0)),rhs.template packet<LoadMode>(0, col));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<ColMajor, 0, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet &res)
+  {
+    res = pmul(lhs.template packet<LoadMode>(row, 0), pset1<Packet>(rhs.coeff(0, col)));
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<RowMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet& res)
+  {
+    eigen_assert(lhs.cols()>0 && "you are using a non initialized matrix");
+    res = pmul(pset1<Packet>(lhs.coeff(row, 0)),rhs.template packet<LoadMode>(0, col));
+      for(Index i = 1; i < lhs.cols(); ++i)
+        res =  pmadd(pset1<Packet>(lhs.coeff(row, i)), rhs.template packet<LoadMode>(i, col), res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename Packet, int LoadMode>
+struct product_packet_impl<ColMajor, Dynamic, Lhs, Rhs, Packet, LoadMode>
+{
+  typedef typename Lhs::Index Index;
+  static EIGEN_STRONG_INLINE void run(Index row, Index col, const Lhs& lhs, const Rhs& rhs, Packet& res)
+  {
+    eigen_assert(lhs.cols()>0 && "you are using a non initialized matrix");
+    res = pmul(lhs.template packet<LoadMode>(row, 0), pset1<Packet>(rhs.coeff(0, col)));
+      for(Index i = 1; i < lhs.cols(); ++i)
+        res =  pmadd(lhs.template packet<LoadMode>(row, i), pset1<Packet>(rhs.coeff(i, col)), res);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COEFFBASED_PRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralBlockPanelKernel.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralBlockPanelKernel.h
new file mode 100644
index 0000000..780fa74
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralBlockPanelKernel.h
@@ -0,0 +1,1335 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERAL_BLOCK_PANEL_H
+#define EIGEN_GENERAL_BLOCK_PANEL_H
+
+namespace Eigen { 
+  
+namespace internal {
+
+template<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs=false, bool _ConjRhs=false>
+class gebp_traits;
+
+
+/** \internal \returns b if a<=0, and returns a otherwise. */
+inline std::ptrdiff_t manage_caching_sizes_helper(std::ptrdiff_t a, std::ptrdiff_t b)
+{
+  return a<=0 ? b : a;
+}
+
+/** \internal */
+inline void manage_caching_sizes(Action action, std::ptrdiff_t* l1=0, std::ptrdiff_t* l2=0)
+{
+  static std::ptrdiff_t m_l1CacheSize = 0;
+  static std::ptrdiff_t m_l2CacheSize = 0;
+  if(m_l2CacheSize==0)
+  {
+    m_l1CacheSize = manage_caching_sizes_helper(queryL1CacheSize(),8 * 1024);
+    m_l2CacheSize = manage_caching_sizes_helper(queryTopLevelCacheSize(),1*1024*1024);
+  }
+  
+  if(action==SetAction)
+  {
+    // set the cpu cache size and cache all block sizes from a global cache size in byte
+    eigen_internal_assert(l1!=0 && l2!=0);
+    m_l1CacheSize = *l1;
+    m_l2CacheSize = *l2;
+  }
+  else if(action==GetAction)
+  {
+    eigen_internal_assert(l1!=0 && l2!=0);
+    *l1 = m_l1CacheSize;
+    *l2 = m_l2CacheSize;
+  }
+  else
+  {
+    eigen_internal_assert(false);
+  }
+}
+
+/** \brief Computes the blocking parameters for a m x k times k x n matrix product
+  *
+  * \param[in,out] k Input: the third dimension of the product. Output: the blocking size along the same dimension.
+  * \param[in,out] m Input: the number of rows of the left hand side. Output: the blocking size along the same dimension.
+  * \param[in,out] n Input: the number of columns of the right hand side. Output: the blocking size along the same dimension.
+  *
+  * Given a m x k times k x n matrix product of scalar types \c LhsScalar and \c RhsScalar,
+  * this function computes the blocking size parameters along the respective dimensions
+  * for matrix products and related algorithms. The blocking sizes depends on various
+  * parameters:
+  * - the L1 and L2 cache sizes,
+  * - the register level blocking sizes defined by gebp_traits,
+  * - the number of scalars that fit into a packet (when vectorization is enabled).
+  *
+  * \sa setCpuCacheSizes */
+template<typename LhsScalar, typename RhsScalar, int KcFactor, typename SizeType>
+void computeProductBlockingSizes(SizeType& k, SizeType& m, SizeType& n)
+{
+  EIGEN_UNUSED_VARIABLE(n);
+  // Explanations:
+  // Let's recall the product algorithms form kc x nc horizontal panels B' on the rhs and
+  // mc x kc blocks A' on the lhs. A' has to fit into L2 cache. Moreover, B' is processed
+  // per kc x nr vertical small panels where nr is the blocking size along the n dimension
+  // at the register level. For vectorization purpose, these small vertical panels are unpacked,
+  // e.g., each coefficient is replicated to fit a packet. This small vertical panel has to
+  // stay in L1 cache.
+  std::ptrdiff_t l1, l2;
+
+  typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+  enum {
+    kdiv = KcFactor * 2 * Traits::nr
+         * Traits::RhsProgress * sizeof(RhsScalar),
+    mr = gebp_traits<LhsScalar,RhsScalar>::mr,
+    mr_mask = (0xffffffff/mr)*mr
+  };
+
+  manage_caching_sizes(GetAction, &l1, &l2);
+  k = std::min<SizeType>(k, l1/kdiv);
+  SizeType _m = k>0 ? l2/(4 * sizeof(LhsScalar) * k) : 0;
+  if(_m<m) m = _m & mr_mask;
+}
+
+template<typename LhsScalar, typename RhsScalar, typename SizeType>
+inline void computeProductBlockingSizes(SizeType& k, SizeType& m, SizeType& n)
+{
+  computeProductBlockingSizes<LhsScalar,RhsScalar,1>(k, m, n);
+}
+
+#ifdef EIGEN_HAS_FUSE_CJMADD
+  #define MADD(CJ,A,B,C,T)  C = CJ.pmadd(A,B,C);
+#else
+
+  // FIXME (a bit overkill maybe ?)
+
+  template<typename CJ, typename A, typename B, typename C, typename T> struct gebp_madd_selector {
+    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, A& a, B& b, C& c, T& /*t*/)
+    {
+      c = cj.pmadd(a,b,c);
+    }
+  };
+
+  template<typename CJ, typename T> struct gebp_madd_selector<CJ,T,T,T,T> {
+    EIGEN_ALWAYS_INLINE static void run(const CJ& cj, T& a, T& b, T& c, T& t)
+    {
+      t = b; t = cj.pmul(a,t); c = padd(c,t);
+    }
+  };
+
+  template<typename CJ, typename A, typename B, typename C, typename T>
+  EIGEN_STRONG_INLINE void gebp_madd(const CJ& cj, A& a, B& b, C& c, T& t)
+  {
+    gebp_madd_selector<CJ,A,B,C,T>::run(cj,a,b,c,t);
+  }
+
+  #define MADD(CJ,A,B,C,T)  gebp_madd(CJ,A,B,C,T);
+//   #define MADD(CJ,A,B,C,T)  T = B; T = CJ.pmul(A,T); C = padd(C,T);
+#endif
+
+/* Vectorization logic
+ *  real*real: unpack rhs to constant packets, ...
+ * 
+ *  cd*cd : unpack rhs to (b_r,b_r), (b_i,b_i), mul to get (a_r b_r,a_i b_r) (a_r b_i,a_i b_i),
+ *          storing each res packet into two packets (2x2),
+ *          at the end combine them: swap the second and addsub them 
+ *  cf*cf : same but with 2x4 blocks
+ *  cplx*real : unpack rhs to constant packets, ...
+ *  real*cplx : load lhs as (a0,a0,a1,a1), and mul as usual
+ */
+template<typename _LhsScalar, typename _RhsScalar, bool _ConjLhs, bool _ConjRhs>
+class gebp_traits
+{
+public:
+  typedef _LhsScalar LhsScalar;
+  typedef _RhsScalar RhsScalar;
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+
+  enum {
+    ConjLhs = _ConjLhs,
+    ConjRhs = _ConjRhs,
+    Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable,
+    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,
+    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,
+    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,
+    
+    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
+
+    // register block size along the N direction (must be either 2 or 4)
+    nr = NumberOfRegisters/4,
+
+    // register block size along the M direction (currently, this one cannot be modified)
+    mr = 2 * LhsPacketSize,
+    
+    WorkSpaceFactor = nr * RhsPacketSize,
+
+    LhsProgress = LhsPacketSize,
+    RhsProgress = RhsPacketSize
+  };
+
+  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;
+  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;
+  typedef typename packet_traits<ResScalar>::type  _ResPacket;
+
+  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;
+  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;
+  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;
+
+  typedef ResPacket AccPacket;
+  
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
+  {
+    p = pset1<ResPacket>(ResScalar(0));
+  }
+
+  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)
+  {
+    for(DenseIndex k=0; k<n; k++)
+      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);
+  }
+
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const
+  {
+    dest = pload<RhsPacket>(b);
+  }
+
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
+  {
+    dest = pload<LhsPacket>(a);
+  }
+
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, AccPacket& tmp) const
+  {
+    tmp = b; tmp = pmul(a,tmp); c = padd(c,tmp);
+  }
+
+  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const
+  {
+    r = pmadd(c,alpha,r);
+  }
+
+protected:
+//   conj_helper<LhsScalar,RhsScalar,ConjLhs,ConjRhs> cj;
+//   conj_helper<LhsPacket,RhsPacket,ConjLhs,ConjRhs> pcj;
+};
+
+template<typename RealScalar, bool _ConjLhs>
+class gebp_traits<std::complex<RealScalar>, RealScalar, _ConjLhs, false>
+{
+public:
+  typedef std::complex<RealScalar> LhsScalar;
+  typedef RealScalar RhsScalar;
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+
+  enum {
+    ConjLhs = _ConjLhs,
+    ConjRhs = false,
+    Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable,
+    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,
+    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,
+    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,
+    
+    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
+    nr = NumberOfRegisters/4,
+    mr = 2 * LhsPacketSize,
+    WorkSpaceFactor = nr*RhsPacketSize,
+
+    LhsProgress = LhsPacketSize,
+    RhsProgress = RhsPacketSize
+  };
+
+  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;
+  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;
+  typedef typename packet_traits<ResScalar>::type  _ResPacket;
+
+  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;
+  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;
+  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;
+
+  typedef ResPacket AccPacket;
+
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
+  {
+    p = pset1<ResPacket>(ResScalar(0));
+  }
+
+  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)
+  {
+    for(DenseIndex k=0; k<n; k++)
+      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);
+  }
+
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const
+  {
+    dest = pload<RhsPacket>(b);
+  }
+
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
+  {
+    dest = pload<LhsPacket>(a);
+  }
+
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp) const
+  {
+    madd_impl(a, b, c, tmp, typename conditional<Vectorizable,true_type,false_type>::type());
+  }
+
+  EIGEN_STRONG_INLINE void madd_impl(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp, const true_type&) const
+  {
+    tmp = b; tmp = pmul(a.v,tmp); c.v = padd(c.v,tmp);
+  }
+
+  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const
+  {
+    c += a * b;
+  }
+
+  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const
+  {
+    r = cj.pmadd(c,alpha,r);
+  }
+
+protected:
+  conj_helper<ResPacket,ResPacket,ConjLhs,false> cj;
+};
+
+template<typename RealScalar, bool _ConjLhs, bool _ConjRhs>
+class gebp_traits<std::complex<RealScalar>, std::complex<RealScalar>, _ConjLhs, _ConjRhs >
+{
+public:
+  typedef std::complex<RealScalar>  Scalar;
+  typedef std::complex<RealScalar>  LhsScalar;
+  typedef std::complex<RealScalar>  RhsScalar;
+  typedef std::complex<RealScalar>  ResScalar;
+  
+  enum {
+    ConjLhs = _ConjLhs,
+    ConjRhs = _ConjRhs,
+    Vectorizable = packet_traits<RealScalar>::Vectorizable
+                && packet_traits<Scalar>::Vectorizable,
+    RealPacketSize  = Vectorizable ? packet_traits<RealScalar>::size : 1,
+    ResPacketSize   = Vectorizable ? packet_traits<ResScalar>::size : 1,
+    
+    nr = 2,
+    mr = 2 * ResPacketSize,
+    WorkSpaceFactor = Vectorizable ? 2*nr*RealPacketSize : nr,
+
+    LhsProgress = ResPacketSize,
+    RhsProgress = Vectorizable ? 2*ResPacketSize : 1
+  };
+  
+  typedef typename packet_traits<RealScalar>::type RealPacket;
+  typedef typename packet_traits<Scalar>::type     ScalarPacket;
+  struct DoublePacket
+  {
+    RealPacket first;
+    RealPacket second;
+  };
+
+  typedef typename conditional<Vectorizable,RealPacket,  Scalar>::type LhsPacket;
+  typedef typename conditional<Vectorizable,DoublePacket,Scalar>::type RhsPacket;
+  typedef typename conditional<Vectorizable,ScalarPacket,Scalar>::type ResPacket;
+  typedef typename conditional<Vectorizable,DoublePacket,Scalar>::type AccPacket;
+  
+  EIGEN_STRONG_INLINE void initAcc(Scalar& p) { p = Scalar(0); }
+
+  EIGEN_STRONG_INLINE void initAcc(DoublePacket& p)
+  {
+    p.first   = pset1<RealPacket>(RealScalar(0));
+    p.second  = pset1<RealPacket>(RealScalar(0));
+  }
+
+  /* Unpack the rhs coeff such that each complex coefficient is spread into
+   * two packects containing respectively the real and imaginary coefficient
+   * duplicated as many time as needed: (x+iy) => [x, ..., x] [y, ..., y]
+   */
+  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const Scalar* rhs, Scalar* b)
+  {
+    for(DenseIndex k=0; k<n; k++)
+    {
+      if(Vectorizable)
+      {
+        pstore1<RealPacket>((RealScalar*)&b[k*ResPacketSize*2+0],             real(rhs[k]));
+        pstore1<RealPacket>((RealScalar*)&b[k*ResPacketSize*2+ResPacketSize], imag(rhs[k]));
+      }
+      else
+        b[k] = rhs[k];
+    }
+  }
+
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, ResPacket& dest) const { dest = *b; }
+
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, DoublePacket& dest) const
+  {
+    dest.first  = pload<RealPacket>((const RealScalar*)b);
+    dest.second = pload<RealPacket>((const RealScalar*)(b+ResPacketSize));
+  }
+
+  // nothing special here
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
+  {
+    dest = pload<LhsPacket>((const typename unpacket_traits<LhsPacket>::type*)(a));
+  }
+
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, DoublePacket& c, RhsPacket& /*tmp*/) const
+  {
+    c.first   = padd(pmul(a,b.first), c.first);
+    c.second  = padd(pmul(a,b.second),c.second);
+  }
+
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, ResPacket& c, RhsPacket& /*tmp*/) const
+  {
+    c = cj.pmadd(a,b,c);
+  }
+  
+  EIGEN_STRONG_INLINE void acc(const Scalar& c, const Scalar& alpha, Scalar& r) const { r += alpha * c; }
+  
+  EIGEN_STRONG_INLINE void acc(const DoublePacket& c, const ResPacket& alpha, ResPacket& r) const
+  {
+    // assemble c
+    ResPacket tmp;
+    if((!ConjLhs)&&(!ConjRhs))
+    {
+      tmp = pcplxflip(pconj(ResPacket(c.second)));
+      tmp = padd(ResPacket(c.first),tmp);
+    }
+    else if((!ConjLhs)&&(ConjRhs))
+    {
+      tmp = pconj(pcplxflip(ResPacket(c.second)));
+      tmp = padd(ResPacket(c.first),tmp);
+    }
+    else if((ConjLhs)&&(!ConjRhs))
+    {
+      tmp = pcplxflip(ResPacket(c.second));
+      tmp = padd(pconj(ResPacket(c.first)),tmp);
+    }
+    else if((ConjLhs)&&(ConjRhs))
+    {
+      tmp = pcplxflip(ResPacket(c.second));
+      tmp = psub(pconj(ResPacket(c.first)),tmp);
+    }
+    
+    r = pmadd(tmp,alpha,r);
+  }
+
+protected:
+  conj_helper<LhsScalar,RhsScalar,ConjLhs,ConjRhs> cj;
+};
+
+template<typename RealScalar, bool _ConjRhs>
+class gebp_traits<RealScalar, std::complex<RealScalar>, false, _ConjRhs >
+{
+public:
+  typedef std::complex<RealScalar>  Scalar;
+  typedef RealScalar  LhsScalar;
+  typedef Scalar      RhsScalar;
+  typedef Scalar      ResScalar;
+
+  enum {
+    ConjLhs = false,
+    ConjRhs = _ConjRhs,
+    Vectorizable = packet_traits<RealScalar>::Vectorizable
+                && packet_traits<Scalar>::Vectorizable,
+    LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,
+    RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,
+    ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1,
+    
+    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
+    nr = 4,
+    mr = 2*ResPacketSize,
+    WorkSpaceFactor = nr*RhsPacketSize,
+
+    LhsProgress = ResPacketSize,
+    RhsProgress = ResPacketSize
+  };
+
+  typedef typename packet_traits<LhsScalar>::type  _LhsPacket;
+  typedef typename packet_traits<RhsScalar>::type  _RhsPacket;
+  typedef typename packet_traits<ResScalar>::type  _ResPacket;
+
+  typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;
+  typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;
+  typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;
+
+  typedef ResPacket AccPacket;
+
+  EIGEN_STRONG_INLINE void initAcc(AccPacket& p)
+  {
+    p = pset1<ResPacket>(ResScalar(0));
+  }
+
+  EIGEN_STRONG_INLINE void unpackRhs(DenseIndex n, const RhsScalar* rhs, RhsScalar* b)
+  {
+    for(DenseIndex k=0; k<n; k++)
+      pstore1<RhsPacket>(&b[k*RhsPacketSize], rhs[k]);
+  }
+
+  EIGEN_STRONG_INLINE void loadRhs(const RhsScalar* b, RhsPacket& dest) const
+  {
+    dest = pload<RhsPacket>(b);
+  }
+
+  EIGEN_STRONG_INLINE void loadLhs(const LhsScalar* a, LhsPacket& dest) const
+  {
+    dest = ploaddup<LhsPacket>(a);
+  }
+
+  EIGEN_STRONG_INLINE void madd(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp) const
+  {
+    madd_impl(a, b, c, tmp, typename conditional<Vectorizable,true_type,false_type>::type());
+  }
+
+  EIGEN_STRONG_INLINE void madd_impl(const LhsPacket& a, const RhsPacket& b, AccPacket& c, RhsPacket& tmp, const true_type&) const
+  {
+    tmp = b; tmp.v = pmul(a,tmp.v); c = padd(c,tmp);
+  }
+
+  EIGEN_STRONG_INLINE void madd_impl(const LhsScalar& a, const RhsScalar& b, ResScalar& c, RhsScalar& /*tmp*/, const false_type&) const
+  {
+    c += a * b;
+  }
+
+  EIGEN_STRONG_INLINE void acc(const AccPacket& c, const ResPacket& alpha, ResPacket& r) const
+  {
+    r = cj.pmadd(alpha,c,r);
+  }
+
+protected:
+  conj_helper<ResPacket,ResPacket,false,ConjRhs> cj;
+};
+
+/* optimized GEneral packed Block * packed Panel product kernel
+ *
+ * Mixing type logic: C += A * B
+ *  |  A  |  B  | comments
+ *  |real |cplx | no vectorization yet, would require to pack A with duplication
+ *  |cplx |real | easy vectorization
+ */
+template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+struct gebp_kernel
+{
+  typedef gebp_traits<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> Traits;
+  typedef typename Traits::ResScalar ResScalar;
+  typedef typename Traits::LhsPacket LhsPacket;
+  typedef typename Traits::RhsPacket RhsPacket;
+  typedef typename Traits::ResPacket ResPacket;
+  typedef typename Traits::AccPacket AccPacket;
+
+  enum {
+    Vectorizable  = Traits::Vectorizable,
+    LhsProgress   = Traits::LhsProgress,
+    RhsProgress   = Traits::RhsProgress,
+    ResPacketSize = Traits::ResPacketSize
+  };
+
+  EIGEN_DONT_INLINE
+  void operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index rows, Index depth, Index cols, ResScalar alpha,
+                  Index strideA=-1, Index strideB=-1, Index offsetA=0, Index offsetB=0, RhsScalar* unpackedB=0);
+};
+
+template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs, bool ConjugateRhs>
+EIGEN_DONT_INLINE
+void gebp_kernel<LhsScalar,RhsScalar,Index,mr,nr,ConjugateLhs,ConjugateRhs>
+  ::operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index rows, Index depth, Index cols, ResScalar alpha,
+               Index strideA, Index strideB, Index offsetA, Index offsetB, RhsScalar* unpackedB)
+  {
+    Traits traits;
+    
+    if(strideA==-1) strideA = depth;
+    if(strideB==-1) strideB = depth;
+    conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
+//     conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;
+    Index packet_cols = (cols/nr) * nr;
+    const Index peeled_mc = (rows/mr)*mr;
+    // FIXME:
+    const Index peeled_mc2 = peeled_mc + (rows-peeled_mc >= LhsProgress ? LhsProgress : 0);
+    const Index peeled_kc = (depth/4)*4;
+
+    if(unpackedB==0)
+      unpackedB = const_cast<RhsScalar*>(blockB - strideB * nr * RhsProgress);
+
+    // loops on each micro vertical panel of rhs (depth x nr)
+    for(Index j2=0; j2<packet_cols; j2+=nr)
+    {
+      traits.unpackRhs(depth*nr,&blockB[j2*strideB+offsetB*nr],unpackedB); 
+
+      // loops on each largest micro horizontal panel of lhs (mr x depth)
+      // => we select a mr x nr micro block of res which is entirely
+      //    stored into mr/packet_size x nr registers.
+      for(Index i=0; i<peeled_mc; i+=mr)
+      {
+        const LhsScalar* blA = &blockA[i*strideA+offsetA*mr];
+        prefetch(&blA[0]);
+
+        // gets res block as register
+        AccPacket C0, C1, C2, C3, C4, C5, C6, C7;
+                  traits.initAcc(C0);
+                  traits.initAcc(C1);
+        if(nr==4) traits.initAcc(C2);
+        if(nr==4) traits.initAcc(C3);
+                  traits.initAcc(C4);
+                  traits.initAcc(C5);
+        if(nr==4) traits.initAcc(C6);
+        if(nr==4) traits.initAcc(C7);
+
+        ResScalar* r0 = &res[(j2+0)*resStride + i];
+        ResScalar* r1 = r0 + resStride;
+        ResScalar* r2 = r1 + resStride;
+        ResScalar* r3 = r2 + resStride;
+
+        prefetch(r0+16);
+        prefetch(r1+16);
+        prefetch(r2+16);
+        prefetch(r3+16);
+
+        // performs "inner" product
+        // TODO let's check wether the folowing peeled loop could not be
+        //      optimized via optimal prefetching from one loop to the other
+        const RhsScalar* blB = unpackedB;
+        for(Index k=0; k<peeled_kc; k+=4)
+        {
+          if(nr==2)
+          {
+            LhsPacket A0, A1;
+            RhsPacket B_0;
+            RhsPacket T0;
+            
+EIGEN_ASM_COMMENT("mybegin2");
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadLhs(&blA[1*LhsProgress], A1);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B_0);
+            traits.madd(A0,B_0,C1,T0);
+            traits.madd(A1,B_0,C5,B_0);
+
+            traits.loadLhs(&blA[2*LhsProgress], A0);
+            traits.loadLhs(&blA[3*LhsProgress], A1);
+            traits.loadRhs(&blB[2*RhsProgress], B_0);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[3*RhsProgress], B_0);
+            traits.madd(A0,B_0,C1,T0);
+            traits.madd(A1,B_0,C5,B_0);
+
+            traits.loadLhs(&blA[4*LhsProgress], A0);
+            traits.loadLhs(&blA[5*LhsProgress], A1);
+            traits.loadRhs(&blB[4*RhsProgress], B_0);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[5*RhsProgress], B_0);
+            traits.madd(A0,B_0,C1,T0);
+            traits.madd(A1,B_0,C5,B_0);
+
+            traits.loadLhs(&blA[6*LhsProgress], A0);
+            traits.loadLhs(&blA[7*LhsProgress], A1);
+            traits.loadRhs(&blB[6*RhsProgress], B_0);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[7*RhsProgress], B_0);
+            traits.madd(A0,B_0,C1,T0);
+            traits.madd(A1,B_0,C5,B_0);
+EIGEN_ASM_COMMENT("myend");
+          }
+          else
+          {
+EIGEN_ASM_COMMENT("mybegin4");
+            LhsPacket A0, A1;
+            RhsPacket B_0, B1, B2, B3;
+            RhsPacket T0;
+            
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadLhs(&blA[1*LhsProgress], A1);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+
+            traits.madd(A0,B_0,C0,T0);
+            traits.loadRhs(&blB[2*RhsProgress], B2);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[3*RhsProgress], B3);
+            traits.loadRhs(&blB[4*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,T0);
+            traits.madd(A1,B1,C5,B1);
+            traits.loadRhs(&blB[5*RhsProgress], B1);
+            traits.madd(A0,B2,C2,T0);
+            traits.madd(A1,B2,C6,B2);
+            traits.loadRhs(&blB[6*RhsProgress], B2);
+            traits.madd(A0,B3,C3,T0);
+            traits.loadLhs(&blA[2*LhsProgress], A0);
+            traits.madd(A1,B3,C7,B3);
+            traits.loadLhs(&blA[3*LhsProgress], A1);
+            traits.loadRhs(&blB[7*RhsProgress], B3);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[8*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,T0);
+            traits.madd(A1,B1,C5,B1);
+            traits.loadRhs(&blB[9*RhsProgress], B1);
+            traits.madd(A0,B2,C2,T0);
+            traits.madd(A1,B2,C6,B2);
+            traits.loadRhs(&blB[10*RhsProgress], B2);
+            traits.madd(A0,B3,C3,T0);
+            traits.loadLhs(&blA[4*LhsProgress], A0);
+            traits.madd(A1,B3,C7,B3);
+            traits.loadLhs(&blA[5*LhsProgress], A1);
+            traits.loadRhs(&blB[11*RhsProgress], B3);
+
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[12*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,T0);
+            traits.madd(A1,B1,C5,B1);
+            traits.loadRhs(&blB[13*RhsProgress], B1);
+            traits.madd(A0,B2,C2,T0);
+            traits.madd(A1,B2,C6,B2);
+            traits.loadRhs(&blB[14*RhsProgress], B2);
+            traits.madd(A0,B3,C3,T0);
+            traits.loadLhs(&blA[6*LhsProgress], A0);
+            traits.madd(A1,B3,C7,B3);
+            traits.loadLhs(&blA[7*LhsProgress], A1);
+            traits.loadRhs(&blB[15*RhsProgress], B3);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.madd(A0,B1,C1,T0);
+            traits.madd(A1,B1,C5,B1);
+            traits.madd(A0,B2,C2,T0);
+            traits.madd(A1,B2,C6,B2);
+            traits.madd(A0,B3,C3,T0);
+            traits.madd(A1,B3,C7,B3);
+          }
+
+          blB += 4*nr*RhsProgress;
+          blA += 4*mr;
+        }
+        // process remaining peeled loop
+        for(Index k=peeled_kc; k<depth; k++)
+        {
+          if(nr==2)
+          {
+            LhsPacket A0, A1;
+            RhsPacket B_0;
+            RhsPacket T0;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadLhs(&blA[1*LhsProgress], A1);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.madd(A0,B_0,C0,T0);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B_0);
+            traits.madd(A0,B_0,C1,T0);
+            traits.madd(A1,B_0,C5,B_0);
+          }
+          else
+          {
+            LhsPacket A0, A1;
+            RhsPacket B_0, B1, B2, B3;
+            RhsPacket T0;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadLhs(&blA[1*LhsProgress], A1);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+
+            traits.madd(A0,B_0,C0,T0);
+            traits.loadRhs(&blB[2*RhsProgress], B2);
+            traits.madd(A1,B_0,C4,B_0);
+            traits.loadRhs(&blB[3*RhsProgress], B3);
+            traits.madd(A0,B1,C1,T0);
+            traits.madd(A1,B1,C5,B1);
+            traits.madd(A0,B2,C2,T0);
+            traits.madd(A1,B2,C6,B2);
+            traits.madd(A0,B3,C3,T0);
+            traits.madd(A1,B3,C7,B3);
+          }
+
+          blB += nr*RhsProgress;
+          blA += mr;
+        }
+
+        if(nr==4)
+        {
+          ResPacket R0, R1, R2, R3, R4, R5, R6;
+          ResPacket alphav = pset1<ResPacket>(alpha);
+
+          R0 = ploadu<ResPacket>(r0);
+          R1 = ploadu<ResPacket>(r1);
+          R2 = ploadu<ResPacket>(r2);
+          R3 = ploadu<ResPacket>(r3);
+          R4 = ploadu<ResPacket>(r0 + ResPacketSize);
+          R5 = ploadu<ResPacket>(r1 + ResPacketSize);
+          R6 = ploadu<ResPacket>(r2 + ResPacketSize);
+          traits.acc(C0, alphav, R0);
+          pstoreu(r0, R0);
+          R0 = ploadu<ResPacket>(r3 + ResPacketSize);
+
+          traits.acc(C1, alphav, R1);
+          traits.acc(C2, alphav, R2);
+          traits.acc(C3, alphav, R3);
+          traits.acc(C4, alphav, R4);
+          traits.acc(C5, alphav, R5);
+          traits.acc(C6, alphav, R6);
+          traits.acc(C7, alphav, R0);
+          
+          pstoreu(r1, R1);
+          pstoreu(r2, R2);
+          pstoreu(r3, R3);
+          pstoreu(r0 + ResPacketSize, R4);
+          pstoreu(r1 + ResPacketSize, R5);
+          pstoreu(r2 + ResPacketSize, R6);
+          pstoreu(r3 + ResPacketSize, R0);
+        }
+        else
+        {
+          ResPacket R0, R1, R4;
+          ResPacket alphav = pset1<ResPacket>(alpha);
+
+          R0 = ploadu<ResPacket>(r0);
+          R1 = ploadu<ResPacket>(r1);
+          R4 = ploadu<ResPacket>(r0 + ResPacketSize);
+          traits.acc(C0, alphav, R0);
+          pstoreu(r0, R0);
+          R0 = ploadu<ResPacket>(r1 + ResPacketSize);
+          traits.acc(C1, alphav, R1);
+          traits.acc(C4, alphav, R4);
+          traits.acc(C5, alphav, R0);
+          pstoreu(r1, R1);
+          pstoreu(r0 + ResPacketSize, R4);
+          pstoreu(r1 + ResPacketSize, R0);
+        }
+        
+      }
+      
+      if(rows-peeled_mc>=LhsProgress)
+      {
+        Index i = peeled_mc;
+        const LhsScalar* blA = &blockA[i*strideA+offsetA*LhsProgress];
+        prefetch(&blA[0]);
+
+        // gets res block as register
+        AccPacket C0, C1, C2, C3;
+                  traits.initAcc(C0);
+                  traits.initAcc(C1);
+        if(nr==4) traits.initAcc(C2);
+        if(nr==4) traits.initAcc(C3);
+
+        // performs "inner" product
+        const RhsScalar* blB = unpackedB;
+        for(Index k=0; k<peeled_kc; k+=4)
+        {
+          if(nr==2)
+          {
+            LhsPacket A0;
+            RhsPacket B_0, B1;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[2*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadLhs(&blA[1*LhsProgress], A0);
+            traits.loadRhs(&blB[3*RhsProgress], B1);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[4*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadLhs(&blA[2*LhsProgress], A0);
+            traits.loadRhs(&blB[5*RhsProgress], B1);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[6*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadLhs(&blA[3*LhsProgress], A0);
+            traits.loadRhs(&blB[7*RhsProgress], B1);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.madd(A0,B1,C1,B1);
+          }
+          else
+          {
+            LhsPacket A0;
+            RhsPacket B_0, B1, B2, B3;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[2*RhsProgress], B2);
+            traits.loadRhs(&blB[3*RhsProgress], B3);
+            traits.loadRhs(&blB[4*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadRhs(&blB[5*RhsProgress], B1);
+            traits.madd(A0,B2,C2,B2);
+            traits.loadRhs(&blB[6*RhsProgress], B2);
+            traits.madd(A0,B3,C3,B3);
+            traits.loadLhs(&blA[1*LhsProgress], A0);
+            traits.loadRhs(&blB[7*RhsProgress], B3);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[8*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadRhs(&blB[9*RhsProgress], B1);
+            traits.madd(A0,B2,C2,B2);
+            traits.loadRhs(&blB[10*RhsProgress], B2);
+            traits.madd(A0,B3,C3,B3);
+            traits.loadLhs(&blA[2*LhsProgress], A0);
+            traits.loadRhs(&blB[11*RhsProgress], B3);
+
+            traits.madd(A0,B_0,C0,B_0);
+            traits.loadRhs(&blB[12*RhsProgress], B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.loadRhs(&blB[13*RhsProgress], B1);
+            traits.madd(A0,B2,C2,B2);
+            traits.loadRhs(&blB[14*RhsProgress], B2);
+            traits.madd(A0,B3,C3,B3);
+
+            traits.loadLhs(&blA[3*LhsProgress], A0);
+            traits.loadRhs(&blB[15*RhsProgress], B3);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.madd(A0,B2,C2,B2);
+            traits.madd(A0,B3,C3,B3);
+          }
+
+          blB += nr*4*RhsProgress;
+          blA += 4*LhsProgress;
+        }
+        // process remaining peeled loop
+        for(Index k=peeled_kc; k<depth; k++)
+        {
+          if(nr==2)
+          {
+            LhsPacket A0;
+            RhsPacket B_0, B1;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+            traits.madd(A0,B_0,C0,B_0);
+            traits.madd(A0,B1,C1,B1);
+          }
+          else
+          {
+            LhsPacket A0;
+            RhsPacket B_0, B1, B2, B3;
+
+            traits.loadLhs(&blA[0*LhsProgress], A0);
+            traits.loadRhs(&blB[0*RhsProgress], B_0);
+            traits.loadRhs(&blB[1*RhsProgress], B1);
+            traits.loadRhs(&blB[2*RhsProgress], B2);
+            traits.loadRhs(&blB[3*RhsProgress], B3);
+
+            traits.madd(A0,B_0,C0,B_0);
+            traits.madd(A0,B1,C1,B1);
+            traits.madd(A0,B2,C2,B2);
+            traits.madd(A0,B3,C3,B3);
+          }
+
+          blB += nr*RhsProgress;
+          blA += LhsProgress;
+        }
+
+        ResPacket R0, R1, R2, R3;
+        ResPacket alphav = pset1<ResPacket>(alpha);
+
+        ResScalar* r0 = &res[(j2+0)*resStride + i];
+        ResScalar* r1 = r0 + resStride;
+        ResScalar* r2 = r1 + resStride;
+        ResScalar* r3 = r2 + resStride;
+
+                  R0 = ploadu<ResPacket>(r0);
+                  R1 = ploadu<ResPacket>(r1);
+        if(nr==4) R2 = ploadu<ResPacket>(r2);
+        if(nr==4) R3 = ploadu<ResPacket>(r3);
+
+                  traits.acc(C0, alphav, R0);
+                  traits.acc(C1, alphav, R1);
+        if(nr==4) traits.acc(C2, alphav, R2);
+        if(nr==4) traits.acc(C3, alphav, R3);
+
+                  pstoreu(r0, R0);
+                  pstoreu(r1, R1);
+        if(nr==4) pstoreu(r2, R2);
+        if(nr==4) pstoreu(r3, R3);
+      }
+      for(Index i=peeled_mc2; i<rows; i++)
+      {
+        const LhsScalar* blA = &blockA[i*strideA+offsetA];
+        prefetch(&blA[0]);
+
+        // gets a 1 x nr res block as registers
+        ResScalar C0(0), C1(0), C2(0), C3(0);
+        // TODO directly use blockB ???
+        const RhsScalar* blB = &blockB[j2*strideB+offsetB*nr];
+        for(Index k=0; k<depth; k++)
+        {
+          if(nr==2)
+          {
+            LhsScalar A0;
+            RhsScalar B_0, B1;
+
+            A0 = blA[k];
+            B_0 = blB[0];
+            B1 = blB[1];
+            MADD(cj,A0,B_0,C0,B_0);
+            MADD(cj,A0,B1,C1,B1);
+          }
+          else
+          {
+            LhsScalar A0;
+            RhsScalar B_0, B1, B2, B3;
+
+            A0 = blA[k];
+            B_0 = blB[0];
+            B1 = blB[1];
+            B2 = blB[2];
+            B3 = blB[3];
+
+            MADD(cj,A0,B_0,C0,B_0);
+            MADD(cj,A0,B1,C1,B1);
+            MADD(cj,A0,B2,C2,B2);
+            MADD(cj,A0,B3,C3,B3);
+          }
+
+          blB += nr;
+        }
+                  res[(j2+0)*resStride + i] += alpha*C0;
+                  res[(j2+1)*resStride + i] += alpha*C1;
+        if(nr==4) res[(j2+2)*resStride + i] += alpha*C2;
+        if(nr==4) res[(j2+3)*resStride + i] += alpha*C3;
+      }
+    }
+    // process remaining rhs/res columns one at a time
+    // => do the same but with nr==1
+    for(Index j2=packet_cols; j2<cols; j2++)
+    {
+      // unpack B
+      traits.unpackRhs(depth, &blockB[j2*strideB+offsetB], unpackedB);
+
+      for(Index i=0; i<peeled_mc; i+=mr)
+      {
+        const LhsScalar* blA = &blockA[i*strideA+offsetA*mr];
+        prefetch(&blA[0]);
+
+        // TODO move the res loads to the stores
+
+        // get res block as registers
+        AccPacket C0, C4;
+        traits.initAcc(C0);
+        traits.initAcc(C4);
+
+        const RhsScalar* blB = unpackedB;
+        for(Index k=0; k<depth; k++)
+        {
+          LhsPacket A0, A1;
+          RhsPacket B_0;
+          RhsPacket T0;
+
+          traits.loadLhs(&blA[0*LhsProgress], A0);
+          traits.loadLhs(&blA[1*LhsProgress], A1);
+          traits.loadRhs(&blB[0*RhsProgress], B_0);
+          traits.madd(A0,B_0,C0,T0);
+          traits.madd(A1,B_0,C4,B_0);
+
+          blB += RhsProgress;
+          blA += 2*LhsProgress;
+        }
+        ResPacket R0, R4;
+        ResPacket alphav = pset1<ResPacket>(alpha);
+
+        ResScalar* r0 = &res[(j2+0)*resStride + i];
+
+        R0 = ploadu<ResPacket>(r0);
+        R4 = ploadu<ResPacket>(r0+ResPacketSize);
+
+        traits.acc(C0, alphav, R0);
+        traits.acc(C4, alphav, R4);
+
+        pstoreu(r0,               R0);
+        pstoreu(r0+ResPacketSize, R4);
+      }
+      if(rows-peeled_mc>=LhsProgress)
+      {
+        Index i = peeled_mc;
+        const LhsScalar* blA = &blockA[i*strideA+offsetA*LhsProgress];
+        prefetch(&blA[0]);
+
+        AccPacket C0;
+        traits.initAcc(C0);
+
+        const RhsScalar* blB = unpackedB;
+        for(Index k=0; k<depth; k++)
+        {
+          LhsPacket A0;
+          RhsPacket B_0;
+          traits.loadLhs(blA, A0);
+          traits.loadRhs(blB, B_0);
+          traits.madd(A0, B_0, C0, B_0);
+          blB += RhsProgress;
+          blA += LhsProgress;
+        }
+
+        ResPacket alphav = pset1<ResPacket>(alpha);
+        ResPacket R0 = ploadu<ResPacket>(&res[(j2+0)*resStride + i]);
+        traits.acc(C0, alphav, R0);
+        pstoreu(&res[(j2+0)*resStride + i], R0);
+      }
+      for(Index i=peeled_mc2; i<rows; i++)
+      {
+        const LhsScalar* blA = &blockA[i*strideA+offsetA];
+        prefetch(&blA[0]);
+
+        // gets a 1 x 1 res block as registers
+        ResScalar C0(0);
+        // FIXME directly use blockB ??
+        const RhsScalar* blB = &blockB[j2*strideB+offsetB];
+        for(Index k=0; k<depth; k++)
+        {
+          LhsScalar A0 = blA[k];
+          RhsScalar B_0 = blB[k];
+          MADD(cj, A0, B_0, C0, B_0);
+        }
+        res[(j2+0)*resStride + i] += alpha*C0;
+      }
+    }
+  }
+
+
+#undef CJMADD
+
+// pack a block of the lhs
+// The traversal is as follow (mr==4):
+//   0  4  8 12 ...
+//   1  5  9 13 ...
+//   2  6 10 14 ...
+//   3  7 11 15 ...
+//
+//  16 20 24 28 ...
+//  17 21 25 29 ...
+//  18 22 26 30 ...
+//  19 23 27 31 ...
+//
+//  32 33 34 35 ...
+//  36 36 38 39 ...
+template<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate, bool PanelMode>
+struct gemm_pack_lhs
+{
+  EIGEN_DONT_INLINE void operator()(Scalar* blockA, const Scalar* EIGEN_RESTRICT _lhs, Index lhsStride, Index depth, Index rows, Index stride=0, Index offset=0);
+};
+
+template<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate, bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, Pack1, Pack2, StorageOrder, Conjugate, PanelMode>
+  ::operator()(Scalar* blockA, const Scalar* EIGEN_RESTRICT _lhs, Index lhsStride, Index depth, Index rows, Index stride, Index offset)
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+  enum { PacketSize = packet_traits<Scalar>::size };
+
+  EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK LHS");
+  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+  eigen_assert( (StorageOrder==RowMajor) || ((Pack1%PacketSize)==0 && Pack1<=4*PacketSize) );
+  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
+  const_blas_data_mapper<Scalar, Index, StorageOrder> lhs(_lhs,lhsStride);
+  Index count = 0;
+  Index peeled_mc = (rows/Pack1)*Pack1;
+  for(Index i=0; i<peeled_mc; i+=Pack1)
+  {
+    if(PanelMode) count += Pack1 * offset;
+
+    if(StorageOrder==ColMajor)
+    {
+      for(Index k=0; k<depth; k++)
+      {
+        Packet A, B, C, D;
+        if(Pack1>=1*PacketSize) A = ploadu<Packet>(&lhs(i+0*PacketSize, k));
+        if(Pack1>=2*PacketSize) B = ploadu<Packet>(&lhs(i+1*PacketSize, k));
+        if(Pack1>=3*PacketSize) C = ploadu<Packet>(&lhs(i+2*PacketSize, k));
+        if(Pack1>=4*PacketSize) D = ploadu<Packet>(&lhs(i+3*PacketSize, k));
+        if(Pack1>=1*PacketSize) { pstore(blockA+count, cj.pconj(A)); count+=PacketSize; }
+        if(Pack1>=2*PacketSize) { pstore(blockA+count, cj.pconj(B)); count+=PacketSize; }
+        if(Pack1>=3*PacketSize) { pstore(blockA+count, cj.pconj(C)); count+=PacketSize; }
+        if(Pack1>=4*PacketSize) { pstore(blockA+count, cj.pconj(D)); count+=PacketSize; }
+      }
+    }
+    else
+    {
+      for(Index k=0; k<depth; k++)
+      {
+        // TODO add a vectorized transpose here
+        Index w=0;
+        for(; w<Pack1-3; w+=4)
+        {
+          Scalar a(cj(lhs(i+w+0, k))),
+                  b(cj(lhs(i+w+1, k))),
+                  c(cj(lhs(i+w+2, k))),
+                  d(cj(lhs(i+w+3, k)));
+          blockA[count++] = a;
+          blockA[count++] = b;
+          blockA[count++] = c;
+          blockA[count++] = d;
+        }
+        if(Pack1%4)
+          for(;w<Pack1;++w)
+            blockA[count++] = cj(lhs(i+w, k));
+      }
+    }
+    if(PanelMode) count += Pack1 * (stride-offset-depth);
+  }
+  if(rows-peeled_mc>=Pack2)
+  {
+    if(PanelMode) count += Pack2*offset;
+    for(Index k=0; k<depth; k++)
+      for(Index w=0; w<Pack2; w++)
+        blockA[count++] = cj(lhs(peeled_mc+w, k));
+    if(PanelMode) count += Pack2 * (stride-offset-depth);
+    peeled_mc += Pack2;
+  }
+  for(Index i=peeled_mc; i<rows; i++)
+  {
+    if(PanelMode) count += offset;
+    for(Index k=0; k<depth; k++)
+      blockA[count++] = cj(lhs(i, k));
+    if(PanelMode) count += (stride-offset-depth);
+  }
+}
+
+// copy a complete panel of the rhs
+// this version is optimized for column major matrices
+// The traversal order is as follow: (nr==4):
+//  0  1  2  3   12 13 14 15   24 27
+//  4  5  6  7   16 17 18 19   25 28
+//  8  9 10 11   20 21 22 23   26 29
+//  .  .  .  .    .  .  .  .    .  .
+template<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<Scalar, Index, nr, ColMajor, Conjugate, PanelMode>
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+  enum { PacketSize = packet_traits<Scalar>::size };
+  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride=0, Index offset=0);
+};
+
+template<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, ColMajor, Conjugate, PanelMode>
+  ::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
+{
+  EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS COLMAJOR");
+  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
+  Index packet_cols = (cols/nr) * nr;
+  Index count = 0;
+  for(Index j2=0; j2<packet_cols; j2+=nr)
+  {
+    // skip what we have before
+    if(PanelMode) count += nr * offset;
+    const Scalar* b0 = &rhs[(j2+0)*rhsStride];
+    const Scalar* b1 = &rhs[(j2+1)*rhsStride];
+    const Scalar* b2 = &rhs[(j2+2)*rhsStride];
+    const Scalar* b3 = &rhs[(j2+3)*rhsStride];
+    for(Index k=0; k<depth; k++)
+    {
+                blockB[count+0] = cj(b0[k]);
+                blockB[count+1] = cj(b1[k]);
+      if(nr==4) blockB[count+2] = cj(b2[k]);
+      if(nr==4) blockB[count+3] = cj(b3[k]);
+      count += nr;
+    }
+    // skip what we have after
+    if(PanelMode) count += nr * (stride-offset-depth);
+  }
+
+  // copy the remaining columns one at a time (nr==1)
+  for(Index j2=packet_cols; j2<cols; ++j2)
+  {
+    if(PanelMode) count += offset;
+    const Scalar* b0 = &rhs[(j2+0)*rhsStride];
+    for(Index k=0; k<depth; k++)
+    {
+      blockB[count] = cj(b0[k]);
+      count += 1;
+    }
+    if(PanelMode) count += (stride-offset-depth);
+  }
+}
+
+// this version is optimized for row major matrices
+template<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>
+struct gemm_pack_rhs<Scalar, Index, nr, RowMajor, Conjugate, PanelMode>
+{
+  enum { PacketSize = packet_traits<Scalar>::size };
+  EIGEN_DONT_INLINE void operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride=0, Index offset=0);
+};
+
+template<typename Scalar, typename Index, int nr, bool Conjugate, bool PanelMode>
+EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, RowMajor, Conjugate, PanelMode>
+  ::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
+{
+  EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS ROWMAJOR");
+  eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
+  conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
+  Index packet_cols = (cols/nr) * nr;
+  Index count = 0;
+  for(Index j2=0; j2<packet_cols; j2+=nr)
+  {
+    // skip what we have before
+    if(PanelMode) count += nr * offset;
+    for(Index k=0; k<depth; k++)
+    {
+      const Scalar* b0 = &rhs[k*rhsStride + j2];
+                blockB[count+0] = cj(b0[0]);
+                blockB[count+1] = cj(b0[1]);
+      if(nr==4) blockB[count+2] = cj(b0[2]);
+      if(nr==4) blockB[count+3] = cj(b0[3]);
+      count += nr;
+    }
+    // skip what we have after
+    if(PanelMode) count += nr * (stride-offset-depth);
+  }
+  // copy the remaining columns one at a time (nr==1)
+  for(Index j2=packet_cols; j2<cols; ++j2)
+  {
+    if(PanelMode) count += offset;
+    const Scalar* b0 = &rhs[j2];
+    for(Index k=0; k<depth; k++)
+    {
+      blockB[count] = cj(b0[k*rhsStride]);
+      count += 1;
+    }
+    if(PanelMode) count += stride-offset-depth;
+  }
+}
+
+} // end namespace internal
+
+/** \returns the currently set level 1 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.
+  * \sa setCpuCacheSize */
+inline std::ptrdiff_t l1CacheSize()
+{
+  std::ptrdiff_t l1, l2;
+  internal::manage_caching_sizes(GetAction, &l1, &l2);
+  return l1;
+}
+
+/** \returns the currently set level 2 cpu cache size (in bytes) used to estimate the ideal blocking size parameters.
+  * \sa setCpuCacheSize */
+inline std::ptrdiff_t l2CacheSize()
+{
+  std::ptrdiff_t l1, l2;
+  internal::manage_caching_sizes(GetAction, &l1, &l2);
+  return l2;
+}
+
+/** Set the cpu L1 and L2 cache sizes (in bytes).
+  * These values are use to adjust the size of the blocks
+  * for the algorithms working per blocks.
+  *
+  * \sa computeProductBlockingSizes */
+inline void setCpuCacheSizes(std::ptrdiff_t l1, std::ptrdiff_t l2)
+{
+  internal::manage_caching_sizes(SetAction, &l1, &l2);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_BLOCK_PANEL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix.h
new file mode 100644
index 0000000..3f5ffcf
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix.h
@@ -0,0 +1,427 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERAL_MATRIX_MATRIX_H
+#define EIGEN_GENERAL_MATRIX_MATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename _LhsScalar, typename _RhsScalar> class level3_blocking;
+
+/* Specialization for a row-major destination matrix => simple transposition of the product */
+template<
+  typename Index,
+  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs>
+struct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor>
+{
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  static EIGEN_STRONG_INLINE void run(
+    Index rows, Index cols, Index depth,
+    const LhsScalar* lhs, Index lhsStride,
+    const RhsScalar* rhs, Index rhsStride,
+    ResScalar* res, Index resStride,
+    ResScalar alpha,
+    level3_blocking<RhsScalar,LhsScalar>& blocking,
+    GemmParallelInfo<Index>* info = 0)
+  {
+    // transpose the product such that the result is column major
+    general_matrix_matrix_product<Index,
+      RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,
+      LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,
+      ColMajor>
+    ::run(cols,rows,depth,rhs,rhsStride,lhs,lhsStride,res,resStride,alpha,blocking,info);
+  }
+};
+
+/*  Specialization for a col-major destination matrix
+ *    => Blocking algorithm following Goto's paper */
+template<
+  typename Index,
+  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs>
+struct general_matrix_matrix_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor>
+{
+
+typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+static void run(Index rows, Index cols, Index depth,
+  const LhsScalar* _lhs, Index lhsStride,
+  const RhsScalar* _rhs, Index rhsStride,
+  ResScalar* res, Index resStride,
+  ResScalar alpha,
+  level3_blocking<LhsScalar,RhsScalar>& blocking,
+  GemmParallelInfo<Index>* info = 0)
+{
+  const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+  const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);
+
+  typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+
+  Index kc = blocking.kc();                   // cache block size along the K direction
+  Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
+  //Index nc = blocking.nc(); // cache block size along the N direction
+
+  gemm_pack_lhs<LhsScalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+  gemm_pack_rhs<RhsScalar, Index, Traits::nr, RhsStorageOrder> pack_rhs;
+  gebp_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;
+
+#ifdef EIGEN_HAS_OPENMP
+  if(info)
+  {
+    // this is the parallel version!
+    Index tid = omp_get_thread_num();
+    Index threads = omp_get_num_threads();
+    
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, 0);
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, w, sizeW, 0);
+    
+    RhsScalar* blockB = blocking.blockB();
+    eigen_internal_assert(blockB!=0);
+
+    // For each horizontal panel of the rhs, and corresponding vertical panel of the lhs...
+    for(Index k=0; k<depth; k+=kc)
+    {
+      const Index actual_kc = (std::min)(k+kc,depth)-k; // => rows of B', and cols of the A'
+
+      // In order to reduce the chance that a thread has to wait for the other,
+      // let's start by packing A'.
+      pack_lhs(blockA, &lhs(0,k), lhsStride, actual_kc, mc);
+
+      // Pack B_k to B' in a parallel fashion:
+      // each thread packs the sub block B_k,j to B'_j where j is the thread id.
+
+      // However, before copying to B'_j, we have to make sure that no other thread is still using it,
+      // i.e., we test that info[tid].users equals 0.
+      // Then, we set info[tid].users to the number of threads to mark that all other threads are going to use it.
+      while(info[tid].users!=0) {}
+      info[tid].users += threads;
+
+      pack_rhs(blockB+info[tid].rhs_start*actual_kc, &rhs(k,info[tid].rhs_start), rhsStride, actual_kc, info[tid].rhs_length);
+
+      // Notify the other threads that the part B'_j is ready to go.
+      info[tid].sync = k;
+
+      // Computes C_i += A' * B' per B'_j
+      for(Index shift=0; shift<threads; ++shift)
+      {
+        Index j = (tid+shift)%threads;
+
+        // At this point we have to make sure that B'_j has been updated by the thread j,
+        // we use testAndSetOrdered to mimic a volatile access.
+        // However, no need to wait for the B' part which has been updated by the current thread!
+        if(shift>0)
+          while(info[j].sync!=k) {}
+
+        gebp(res+info[j].rhs_start*resStride, resStride, blockA, blockB+info[j].rhs_start*actual_kc, mc, actual_kc, info[j].rhs_length, alpha, -1,-1,0,0, w);
+      }
+
+      // Then keep going as usual with the remaining A'
+      for(Index i=mc; i<rows; i+=mc)
+      {
+        const Index actual_mc = (std::min)(i+mc,rows)-i;
+
+        // pack A_i,k to A'
+        pack_lhs(blockA, &lhs(i,k), lhsStride, actual_kc, actual_mc);
+
+        // C_i += A' * B'
+        gebp(res+i, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1,-1,0,0, w);
+      }
+
+      // Release all the sub blocks B'_j of B' for the current thread,
+      // i.e., we simply decrement the number of users by 1
+      for(Index j=0; j<threads; ++j)
+        #pragma omp atomic
+        --(info[j].users);
+    }
+  }
+  else
+#endif // EIGEN_HAS_OPENMP
+  {
+    EIGEN_UNUSED_VARIABLE(info);
+
+    // this is the sequential version!
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeB = kc*cols;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+
+    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, sizeA, blocking.blockA());
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockB, sizeB, blocking.blockB());
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, blockW, sizeW, blocking.blockW());
+
+    // For each horizontal panel of the rhs, and corresponding panel of the lhs...
+    // (==GEMM_VAR1)
+    for(Index k2=0; k2<depth; k2+=kc)
+    {
+      const Index actual_kc = (std::min)(k2+kc,depth)-k2;
+
+      // OK, here we have selected one horizontal panel of rhs and one vertical panel of lhs.
+      // => Pack rhs's panel into a sequential chunk of memory (L2 caching)
+      // Note that this panel will be read as many times as the number of blocks in the lhs's
+      // vertical panel which is, in practice, a very low number.
+      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, cols);
+
+      // For each mc x kc block of the lhs's vertical panel...
+      // (==GEPP_VAR1)
+      for(Index i2=0; i2<rows; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(i2+mc,rows)-i2;
+
+        // We pack the lhs's block into a sequential chunk of memory (L1 caching)
+        // Note that this block will be read a very high number of times, which is equal to the number of
+        // micro vertical panel of the large rhs's panel (e.g., cols/4 times).
+        pack_lhs(blockA, &lhs(i2,k2), lhsStride, actual_kc, actual_mc);
+
+        // Everything is packed, we can now call the block * panel kernel:
+        gebp(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1, -1, 0, 0, blockW);
+      }
+    }
+  }
+}
+
+};
+
+/*********************************************************************************
+*  Specialization of GeneralProduct<> for "large" GEMM, i.e.,
+*  implementation of the high level wrapper to general_matrix_matrix_product
+**********************************************************************************/
+
+template<typename Lhs, typename Rhs>
+struct traits<GeneralProduct<Lhs,Rhs,GemmProduct> >
+ : traits<ProductBase<GeneralProduct<Lhs,Rhs,GemmProduct>, Lhs, Rhs> >
+{};
+
+template<typename Scalar, typename Index, typename Gemm, typename Lhs, typename Rhs, typename Dest, typename BlockingType>
+struct gemm_functor
+{
+  gemm_functor(const Lhs& lhs, const Rhs& rhs, Dest& dest, const Scalar& actualAlpha,
+                  BlockingType& blocking)
+    : m_lhs(lhs), m_rhs(rhs), m_dest(dest), m_actualAlpha(actualAlpha), m_blocking(blocking)
+  {}
+
+  void initParallelSession() const
+  {
+    m_blocking.allocateB();
+  }
+
+  void operator() (Index row, Index rows, Index col=0, Index cols=-1, GemmParallelInfo<Index>* info=0) const
+  {
+    if(cols==-1)
+      cols = m_rhs.cols();
+
+    Gemm::run(rows, cols, m_lhs.cols(),
+              /*(const Scalar*)*/&m_lhs.coeffRef(row,0), m_lhs.outerStride(),
+              /*(const Scalar*)*/&m_rhs.coeffRef(0,col), m_rhs.outerStride(),
+              (Scalar*)&(m_dest.coeffRef(row,col)), m_dest.outerStride(),
+              m_actualAlpha, m_blocking, info);
+  }
+
+  protected:
+    const Lhs& m_lhs;
+    const Rhs& m_rhs;
+    Dest& m_dest;
+    Scalar m_actualAlpha;
+    BlockingType& m_blocking;
+};
+
+template<int StorageOrder, typename LhsScalar, typename RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor=1,
+bool FiniteAtCompileTime = MaxRows!=Dynamic && MaxCols!=Dynamic && MaxDepth != Dynamic> class gemm_blocking_space;
+
+template<typename _LhsScalar, typename _RhsScalar>
+class level3_blocking
+{
+    typedef _LhsScalar LhsScalar;
+    typedef _RhsScalar RhsScalar;
+
+  protected:
+    LhsScalar* m_blockA;
+    RhsScalar* m_blockB;
+    RhsScalar* m_blockW;
+
+    DenseIndex m_mc;
+    DenseIndex m_nc;
+    DenseIndex m_kc;
+
+  public:
+
+    level3_blocking()
+      : m_blockA(0), m_blockB(0), m_blockW(0), m_mc(0), m_nc(0), m_kc(0)
+    {}
+
+    inline DenseIndex mc() const { return m_mc; }
+    inline DenseIndex nc() const { return m_nc; }
+    inline DenseIndex kc() const { return m_kc; }
+
+    inline LhsScalar* blockA() { return m_blockA; }
+    inline RhsScalar* blockB() { return m_blockB; }
+    inline RhsScalar* blockW() { return m_blockW; }
+};
+
+template<int StorageOrder, typename _LhsScalar, typename _RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>
+class gemm_blocking_space<StorageOrder,_LhsScalar,_RhsScalar,MaxRows, MaxCols, MaxDepth, KcFactor, true>
+  : public level3_blocking<
+      typename conditional<StorageOrder==RowMajor,_RhsScalar,_LhsScalar>::type,
+      typename conditional<StorageOrder==RowMajor,_LhsScalar,_RhsScalar>::type>
+{
+    enum {
+      Transpose = StorageOrder==RowMajor,
+      ActualRows = Transpose ? MaxCols : MaxRows,
+      ActualCols = Transpose ? MaxRows : MaxCols
+    };
+    typedef typename conditional<Transpose,_RhsScalar,_LhsScalar>::type LhsScalar;
+    typedef typename conditional<Transpose,_LhsScalar,_RhsScalar>::type RhsScalar;
+    typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+    enum {
+      SizeA = ActualRows * MaxDepth,
+      SizeB = ActualCols * MaxDepth,
+      SizeW = MaxDepth * Traits::WorkSpaceFactor
+    };
+
+    EIGEN_ALIGN16 LhsScalar m_staticA[SizeA];
+    EIGEN_ALIGN16 RhsScalar m_staticB[SizeB];
+    EIGEN_ALIGN16 RhsScalar m_staticW[SizeW];
+
+  public:
+
+    gemm_blocking_space(DenseIndex /*rows*/, DenseIndex /*cols*/, DenseIndex /*depth*/)
+    {
+      this->m_mc = ActualRows;
+      this->m_nc = ActualCols;
+      this->m_kc = MaxDepth;
+      this->m_blockA = m_staticA;
+      this->m_blockB = m_staticB;
+      this->m_blockW = m_staticW;
+    }
+
+    inline void allocateA() {}
+    inline void allocateB() {}
+    inline void allocateW() {}
+    inline void allocateAll() {}
+};
+
+template<int StorageOrder, typename _LhsScalar, typename _RhsScalar, int MaxRows, int MaxCols, int MaxDepth, int KcFactor>
+class gemm_blocking_space<StorageOrder,_LhsScalar,_RhsScalar,MaxRows, MaxCols, MaxDepth, KcFactor, false>
+  : public level3_blocking<
+      typename conditional<StorageOrder==RowMajor,_RhsScalar,_LhsScalar>::type,
+      typename conditional<StorageOrder==RowMajor,_LhsScalar,_RhsScalar>::type>
+{
+    enum {
+      Transpose = StorageOrder==RowMajor
+    };
+    typedef typename conditional<Transpose,_RhsScalar,_LhsScalar>::type LhsScalar;
+    typedef typename conditional<Transpose,_LhsScalar,_RhsScalar>::type RhsScalar;
+    typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+
+    DenseIndex m_sizeA;
+    DenseIndex m_sizeB;
+    DenseIndex m_sizeW;
+
+  public:
+
+    gemm_blocking_space(DenseIndex rows, DenseIndex cols, DenseIndex depth)
+    {
+      this->m_mc = Transpose ? cols : rows;
+      this->m_nc = Transpose ? rows : cols;
+      this->m_kc = depth;
+
+      computeProductBlockingSizes<LhsScalar,RhsScalar,KcFactor>(this->m_kc, this->m_mc, this->m_nc);
+      m_sizeA = this->m_mc * this->m_kc;
+      m_sizeB = this->m_kc * this->m_nc;
+      m_sizeW = this->m_kc*Traits::WorkSpaceFactor;
+    }
+
+    void allocateA()
+    {
+      if(this->m_blockA==0)
+        this->m_blockA = aligned_new<LhsScalar>(m_sizeA);
+    }
+
+    void allocateB()
+    {
+      if(this->m_blockB==0)
+        this->m_blockB = aligned_new<RhsScalar>(m_sizeB);
+    }
+
+    void allocateW()
+    {
+      if(this->m_blockW==0)
+        this->m_blockW = aligned_new<RhsScalar>(m_sizeW);
+    }
+
+    void allocateAll()
+    {
+      allocateA();
+      allocateB();
+      allocateW();
+    }
+
+    ~gemm_blocking_space()
+    {
+      aligned_delete(this->m_blockA, m_sizeA);
+      aligned_delete(this->m_blockB, m_sizeB);
+      aligned_delete(this->m_blockW, m_sizeW);
+    }
+};
+
+} // end namespace internal
+
+template<typename Lhs, typename Rhs>
+class GeneralProduct<Lhs, Rhs, GemmProduct>
+  : public ProductBase<GeneralProduct<Lhs,Rhs,GemmProduct>, Lhs, Rhs>
+{
+    enum {
+      MaxDepthAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(Lhs::MaxColsAtCompileTime,Rhs::MaxRowsAtCompileTime)
+    };
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(GeneralProduct)
+    
+    typedef typename  Lhs::Scalar LhsScalar;
+    typedef typename  Rhs::Scalar RhsScalar;
+    typedef           Scalar      ResScalar;
+
+    GeneralProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {
+      typedef internal::scalar_product_op<LhsScalar,RhsScalar> BinOp;
+      EIGEN_CHECK_BINARY_COMPATIBILIY(BinOp,LhsScalar,RhsScalar);
+    }
+
+    template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+    {
+      eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());
+
+      typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);
+      typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);
+
+      Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)
+                                 * RhsBlasTraits::extractScalarFactor(m_rhs);
+
+      typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,LhsScalar,RhsScalar,
+              Dest::MaxRowsAtCompileTime,Dest::MaxColsAtCompileTime,MaxDepthAtCompileTime> BlockingType;
+
+      typedef internal::gemm_functor<
+        Scalar, Index,
+        internal::general_matrix_matrix_product<
+          Index,
+          LhsScalar, (_ActualLhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(LhsBlasTraits::NeedToConjugate),
+          RhsScalar, (_ActualRhsType::Flags&RowMajorBit) ? RowMajor : ColMajor, bool(RhsBlasTraits::NeedToConjugate),
+          (Dest::Flags&RowMajorBit) ? RowMajor : ColMajor>,
+        _ActualLhsType, _ActualRhsType, Dest, BlockingType> GemmFunctor;
+
+      BlockingType blocking(dst.rows(), dst.cols(), lhs.cols());
+
+      internal::parallelize_gemm<(Dest::MaxRowsAtCompileTime>32 || Dest::MaxRowsAtCompileTime==Dynamic)>(GemmFunctor(lhs, rhs, dst, actualAlpha, blocking), this->rows(), this->cols(), Dest::Flags&RowMajorBit);
+    }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h
new file mode 100644
index 0000000..5c37639
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular.h
@@ -0,0 +1,278 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
+#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
+
+namespace Eigen { 
+
+template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjLhs, bool ConjRhs>
+struct selfadjoint_rank1_update;
+
+namespace internal {
+
+/**********************************************************************
+* This file implements a general A * B product while
+* evaluating only one triangular part of the product.
+* This is more general version of self adjoint product (C += A A^T)
+* as the level 3 SYRK Blas routine.
+**********************************************************************/
+
+// forward declarations (defined at the end of this file)
+template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int UpLo>
+struct tribb_kernel;
+  
+/* Optimized matrix-matrix product evaluating only one triangular half */
+template <typename Index,
+          typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
+                              int ResStorageOrder, int  UpLo, int Version = Specialized>
+struct general_matrix_matrix_triangular_product;
+
+// as usual if the result is row major => we transpose the product
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs, int  UpLo, int Version>
+struct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,RowMajor,UpLo,Version>
+{
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* lhs, Index lhsStride,
+                                      const RhsScalar* rhs, Index rhsStride, ResScalar* res, Index resStride, const ResScalar& alpha)
+  {
+    general_matrix_matrix_triangular_product<Index,
+        RhsScalar, RhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateRhs,
+        LhsScalar, LhsStorageOrder==RowMajor ? ColMajor : RowMajor, ConjugateLhs,
+        ColMajor, UpLo==Lower?Upper:Lower>
+      ::run(size,depth,rhs,rhsStride,lhs,lhsStride,res,resStride,alpha);
+  }
+};
+
+template <typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+                          typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs, int  UpLo, int Version>
+struct general_matrix_matrix_triangular_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,RhsStorageOrder,ConjugateRhs,ColMajor,UpLo,Version>
+{
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const LhsScalar* _lhs, Index lhsStride,
+                                      const RhsScalar* _rhs, Index rhsStride, ResScalar* res, Index resStride, const ResScalar& alpha)
+  {
+    const_blas_data_mapper<LhsScalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+    const_blas_data_mapper<RhsScalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);
+
+    typedef gebp_traits<LhsScalar,RhsScalar> Traits;
+
+    Index kc = depth; // cache block size along the K direction
+    Index mc = size;  // cache block size along the M direction
+    Index nc = size;  // cache block size along the N direction
+    computeProductBlockingSizes<LhsScalar,RhsScalar>(kc, mc, nc);
+    // !!! mc must be a multiple of nr:
+    if(mc > Traits::nr)
+      mc = (mc/Traits::nr)*Traits::nr;
+
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+    std::size_t sizeB = sizeW + kc*size;
+    ei_declare_aligned_stack_constructed_variable(LhsScalar, blockA, kc*mc, 0);
+    ei_declare_aligned_stack_constructed_variable(RhsScalar, allocatedBlockB, sizeB, 0);
+    RhsScalar* blockB = allocatedBlockB + sizeW;
+    
+    gemm_pack_lhs<LhsScalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+    gemm_pack_rhs<RhsScalar, Index, Traits::nr, RhsStorageOrder> pack_rhs;
+    gebp_kernel <LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp;
+    tribb_kernel<LhsScalar, RhsScalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs, UpLo> sybb;
+
+    for(Index k2=0; k2<depth; k2+=kc)
+    {
+      const Index actual_kc = (std::min)(k2+kc,depth)-k2;
+
+      // note that the actual rhs is the transpose/adjoint of mat
+      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, size);
+
+      for(Index i2=0; i2<size; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(i2+mc,size)-i2;
+
+        pack_lhs(blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);
+
+        // the selected actual_mc * size panel of res is split into three different part:
+        //  1 - before the diagonal => processed with gebp or skipped
+        //  2 - the actual_mc x actual_mc symmetric block => processed with a special kernel
+        //  3 - after the diagonal => processed with gebp or skipped
+        if (UpLo==Lower)
+          gebp(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, (std::min)(size,i2), alpha,
+               -1, -1, 0, 0, allocatedBlockB);
+
+        sybb(res+resStride*i2 + i2, resStride, blockA, blockB + actual_kc*i2, actual_mc, actual_kc, alpha, allocatedBlockB);
+
+        if (UpLo==Upper)
+        {
+          Index j2 = i2+actual_mc;
+          gebp(res+resStride*j2+i2, resStride, blockA, blockB+actual_kc*j2, actual_mc, actual_kc, (std::max)(Index(0), size-j2), alpha,
+               -1, -1, 0, 0, allocatedBlockB);
+        }
+      }
+    }
+  }
+};
+
+// Optimized packed Block * packed Block product kernel evaluating only one given triangular part
+// This kernel is built on top of the gebp kernel:
+// - the current destination block is processed per panel of actual_mc x BlockSize
+//   where BlockSize is set to the minimal value allowing gebp to be as fast as possible
+// - then, as usual, each panel is split into three parts along the diagonal,
+//   the sub blocks above and below the diagonal are processed as usual,
+//   while the triangular block overlapping the diagonal is evaluated into a
+//   small temporary buffer which is then accumulated into the result using a
+//   triangular traversal.
+template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjLhs, bool ConjRhs, int UpLo>
+struct tribb_kernel
+{
+  typedef gebp_traits<LhsScalar,RhsScalar,ConjLhs,ConjRhs> Traits;
+  typedef typename Traits::ResScalar ResScalar;
+  
+  enum {
+    BlockSize  = EIGEN_PLAIN_ENUM_MAX(mr,nr)
+  };
+  void operator()(ResScalar* res, Index resStride, const LhsScalar* blockA, const RhsScalar* blockB, Index size, Index depth, const ResScalar& alpha, RhsScalar* workspace)
+  {
+    gebp_kernel<LhsScalar, RhsScalar, Index, mr, nr, ConjLhs, ConjRhs> gebp_kernel;
+    Matrix<ResScalar,BlockSize,BlockSize,ColMajor> buffer;
+
+    // let's process the block per panel of actual_mc x BlockSize,
+    // again, each is split into three parts, etc.
+    for (Index j=0; j<size; j+=BlockSize)
+    {
+      Index actualBlockSize = std::min<Index>(BlockSize,size - j);
+      const RhsScalar* actual_b = blockB+j*depth;
+
+      if(UpLo==Upper)
+        gebp_kernel(res+j*resStride, resStride, blockA, actual_b, j, depth, actualBlockSize, alpha,
+                    -1, -1, 0, 0, workspace);
+
+      // selfadjoint micro block
+      {
+        Index i = j;
+        buffer.setZero();
+        // 1 - apply the kernel on the temporary buffer
+        gebp_kernel(buffer.data(), BlockSize, blockA+depth*i, actual_b, actualBlockSize, depth, actualBlockSize, alpha,
+                    -1, -1, 0, 0, workspace);
+        // 2 - triangular accumulation
+        for(Index j1=0; j1<actualBlockSize; ++j1)
+        {
+          ResScalar* r = res + (j+j1)*resStride + i;
+          for(Index i1=UpLo==Lower ? j1 : 0;
+              UpLo==Lower ? i1<actualBlockSize : i1<=j1; ++i1)
+            r[i1] += buffer(i1,j1);
+        }
+      }
+
+      if(UpLo==Lower)
+      {
+        Index i = j+actualBlockSize;
+        gebp_kernel(res+j*resStride+i, resStride, blockA+depth*i, actual_b, size-i, depth, actualBlockSize, alpha,
+                    -1, -1, 0, 0, workspace);
+      }
+    }
+  }
+};
+
+} // end namespace internal
+
+// high level API
+
+template<typename MatrixType, typename ProductType, int UpLo, bool IsOuterProduct>
+struct general_product_to_triangular_selector;
+
+
+template<typename MatrixType, typename ProductType, int UpLo>
+struct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,true>
+{
+  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha)
+  {
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+    
+    typedef typename internal::remove_all<typename ProductType::LhsNested>::type Lhs;
+    typedef internal::blas_traits<Lhs> LhsBlasTraits;
+    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;
+    typedef typename internal::remove_all<ActualLhs>::type _ActualLhs;
+    typename internal::add_const_on_value_type<ActualLhs>::type actualLhs = LhsBlasTraits::extract(prod.lhs());
+    
+    typedef typename internal::remove_all<typename ProductType::RhsNested>::type Rhs;
+    typedef internal::blas_traits<Rhs> RhsBlasTraits;
+    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;
+    typedef typename internal::remove_all<ActualRhs>::type _ActualRhs;
+    typename internal::add_const_on_value_type<ActualRhs>::type actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
+
+    enum {
+      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,
+      UseLhsDirectly = _ActualLhs::InnerStrideAtCompileTime==1,
+      UseRhsDirectly = _ActualRhs::InnerStrideAtCompileTime==1
+    };
+    
+    internal::gemv_static_vector_if<Scalar,Lhs::SizeAtCompileTime,Lhs::MaxSizeAtCompileTime,!UseLhsDirectly> static_lhs;
+    ei_declare_aligned_stack_constructed_variable(Scalar, actualLhsPtr, actualLhs.size(),
+      (UseLhsDirectly ? const_cast<Scalar*>(actualLhs.data()) : static_lhs.data()));
+    if(!UseLhsDirectly) Map<typename _ActualLhs::PlainObject>(actualLhsPtr, actualLhs.size()) = actualLhs;
+    
+    internal::gemv_static_vector_if<Scalar,Rhs::SizeAtCompileTime,Rhs::MaxSizeAtCompileTime,!UseRhsDirectly> static_rhs;
+    ei_declare_aligned_stack_constructed_variable(Scalar, actualRhsPtr, actualRhs.size(),
+      (UseRhsDirectly ? const_cast<Scalar*>(actualRhs.data()) : static_rhs.data()));
+    if(!UseRhsDirectly) Map<typename _ActualRhs::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
+    
+    
+    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,
+                              LhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex,
+                              RhsBlasTraits::NeedToConjugate && NumTraits<Scalar>::IsComplex>
+          ::run(actualLhs.size(), mat.data(), mat.outerStride(), actualLhsPtr, actualRhsPtr, actualAlpha);
+  }
+};
+
+template<typename MatrixType, typename ProductType, int UpLo>
+struct general_product_to_triangular_selector<MatrixType,ProductType,UpLo,false>
+{
+  static void run(MatrixType& mat, const ProductType& prod, const typename MatrixType::Scalar& alpha)
+  {
+    typedef typename MatrixType::Index Index;
+    
+    typedef typename internal::remove_all<typename ProductType::LhsNested>::type Lhs;
+    typedef internal::blas_traits<Lhs> LhsBlasTraits;
+    typedef typename LhsBlasTraits::DirectLinearAccessType ActualLhs;
+    typedef typename internal::remove_all<ActualLhs>::type _ActualLhs;
+    typename internal::add_const_on_value_type<ActualLhs>::type actualLhs = LhsBlasTraits::extract(prod.lhs());
+    
+    typedef typename internal::remove_all<typename ProductType::RhsNested>::type Rhs;
+    typedef internal::blas_traits<Rhs> RhsBlasTraits;
+    typedef typename RhsBlasTraits::DirectLinearAccessType ActualRhs;
+    typedef typename internal::remove_all<ActualRhs>::type _ActualRhs;
+    typename internal::add_const_on_value_type<ActualRhs>::type actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    typename ProductType::Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs().derived()) * RhsBlasTraits::extractScalarFactor(prod.rhs().derived());
+
+    internal::general_matrix_matrix_triangular_product<Index,
+      typename Lhs::Scalar, _ActualLhs::Flags&RowMajorBit ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,
+      typename Rhs::Scalar, _ActualRhs::Flags&RowMajorBit ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,
+      MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor, UpLo>
+      ::run(mat.cols(), actualLhs.cols(),
+            &actualLhs.coeffRef(0,0), actualLhs.outerStride(), &actualRhs.coeffRef(0,0), actualRhs.outerStride(),
+            mat.data(), mat.outerStride(), actualAlpha);
+  }
+};
+
+template<typename MatrixType, unsigned int UpLo>
+template<typename ProductDerived, typename _Lhs, typename _Rhs>
+TriangularView<MatrixType,UpLo>& TriangularView<MatrixType,UpLo>::assignProduct(const ProductBase<ProductDerived, _Lhs,_Rhs>& prod, const Scalar& alpha)
+{
+  general_product_to_triangular_selector<MatrixType, ProductDerived, UpLo, (_Lhs::ColsAtCompileTime==1) || (_Rhs::RowsAtCompileTime==1)>::run(m_matrix.const_cast_derived(), prod.derived(), alpha);
+  
+  return *this;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h
new file mode 100644
index 0000000..3deed06
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrixTriangular_MKL.h
@@ -0,0 +1,146 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Level 3 BLAS SYRK/HERK implementation.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
+#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template <typename Index, typename Scalar, int AStorageOrder, bool ConjugateA, int ResStorageOrder, int  UpLo>
+struct general_matrix_matrix_rankupdate :
+       general_matrix_matrix_triangular_product<
+         Index,Scalar,AStorageOrder,ConjugateA,Scalar,AStorageOrder,ConjugateA,ResStorageOrder,UpLo,BuiltIn> {};
+
+
+// try to go to BLAS specialization
+#define EIGEN_MKL_RANKUPDATE_SPECIALIZE(Scalar) \
+template <typename Index, int LhsStorageOrder, bool ConjugateLhs, \
+                          int RhsStorageOrder, bool ConjugateRhs, int  UpLo> \
+struct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,ConjugateLhs, \
+               Scalar,RhsStorageOrder,ConjugateRhs,ColMajor,UpLo,Specialized> { \
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const Scalar* lhs, Index lhsStride, \
+                          const Scalar* rhs, Index rhsStride, Scalar* res, Index resStride, Scalar alpha) \
+  { \
+    if (lhs==rhs) { \
+      general_matrix_matrix_rankupdate<Index,Scalar,LhsStorageOrder,ConjugateLhs,ColMajor,UpLo> \
+      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resStride,alpha); \
+    } else { \
+      general_matrix_matrix_triangular_product<Index, \
+        Scalar, LhsStorageOrder, ConjugateLhs, \
+        Scalar, RhsStorageOrder, ConjugateRhs, \
+        ColMajor, UpLo, BuiltIn> \
+      ::run(size,depth,lhs,lhsStride,rhs,rhsStride,res,resStride,alpha); \
+    } \
+  } \
+};
+
+EIGEN_MKL_RANKUPDATE_SPECIALIZE(double)
+//EIGEN_MKL_RANKUPDATE_SPECIALIZE(dcomplex)
+EIGEN_MKL_RANKUPDATE_SPECIALIZE(float)
+//EIGEN_MKL_RANKUPDATE_SPECIALIZE(scomplex)
+
+// SYRK for float/double
+#define EIGEN_MKL_RANKUPDATE_R(EIGTYPE, MKLTYPE, MKLFUNC) \
+template <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \
+struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
+  enum { \
+    IsLower = (UpLo&Lower) == Lower, \
+    LowUp = IsLower ? Lower : Upper, \
+    conjA = ((AStorageOrder==ColMajor) && ConjugateA) ? 1 : 0 \
+  }; \
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \
+                          const EIGTYPE* rhs, Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha) \
+  { \
+  /* typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs;*/ \
+\
+   MKL_INT lda=lhsStride, ldc=resStride, n=size, k=depth; \
+   char uplo=(IsLower) ? 'L' : 'U', trans=(AStorageOrder==RowMajor) ? 'T':'N'; \
+   MKLTYPE alpha_, beta_; \
+\
+/* Set alpha_ & beta_ */ \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
+   MKLFUNC(&uplo, &trans, &n, &k, &alpha_, lhs, &lda, &beta_, res, &ldc); \
+  } \
+};
+
+// HERK for complex data
+#define EIGEN_MKL_RANKUPDATE_C(EIGTYPE, MKLTYPE, RTYPE, MKLFUNC) \
+template <typename Index, int AStorageOrder, bool ConjugateA, int  UpLo> \
+struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
+  enum { \
+    IsLower = (UpLo&Lower) == Lower, \
+    LowUp = IsLower ? Lower : Upper, \
+    conjA = (((AStorageOrder==ColMajor) && ConjugateA) || ((AStorageOrder==RowMajor) && !ConjugateA)) ? 1 : 0 \
+  }; \
+  static EIGEN_STRONG_INLINE void run(Index size, Index depth,const EIGTYPE* lhs, Index lhsStride, \
+                          const EIGTYPE* rhs, Index rhsStride, EIGTYPE* res, Index resStride, EIGTYPE alpha) \
+  { \
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, AStorageOrder> MatrixType; \
+\
+   MKL_INT lda=lhsStride, ldc=resStride, n=size, k=depth; \
+   char uplo=(IsLower) ? 'L' : 'U', trans=(AStorageOrder==RowMajor) ? 'C':'N'; \
+   RTYPE alpha_, beta_; \
+   const EIGTYPE* a_ptr; \
+\
+/* Set alpha_ & beta_ */ \
+/*   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); */\
+/*   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1));*/ \
+   alpha_ = alpha.real(); \
+   beta_ = 1.0; \
+/* Copy with conjugation in some cases*/ \
+   MatrixType a; \
+   if (conjA) { \
+     Map<const MatrixType, 0, OuterStride<> > mapA(lhs,n,k,OuterStride<>(lhsStride)); \
+     a = mapA.conjugate(); \
+     lda = a.outerStride(); \
+     a_ptr = a.data(); \
+   } else a_ptr=lhs; \
+   MKLFUNC(&uplo, &trans, &n, &k, &alpha_, (MKLTYPE*)a_ptr, &lda, &beta_, (MKLTYPE*)res, &ldc); \
+  } \
+};
+
+
+EIGEN_MKL_RANKUPDATE_R(double, double, dsyrk)
+EIGEN_MKL_RANKUPDATE_R(float,  float,  ssyrk)
+
+//EIGEN_MKL_RANKUPDATE_C(dcomplex, MKL_Complex16, double, zherk)
+//EIGEN_MKL_RANKUPDATE_C(scomplex, MKL_Complex8,  double, cherk)
+
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h
new file mode 100644
index 0000000..060af32
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixMatrix_MKL.h
@@ -0,0 +1,118 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   General matrix-matrix product functionality based on ?GEMM.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
+#define EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/**********************************************************************
+* This file implements general matrix-matrix multiplication using BLAS
+* gemm function via partial specialization of
+* general_matrix_matrix_product::run(..) method for float, double,
+* std::complex<float> and std::complex<double> types
+**********************************************************************/
+
+// gemm specialization
+
+#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, MKLTYPE, MKLPREFIX) \
+template< \
+  typename Index, \
+  int LhsStorageOrder, bool ConjugateLhs, \
+  int RhsStorageOrder, bool ConjugateRhs> \
+struct general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor> \
+{ \
+static void run(Index rows, Index cols, Index depth, \
+  const EIGTYPE* _lhs, Index lhsStride, \
+  const EIGTYPE* _rhs, Index rhsStride, \
+  EIGTYPE* res, Index resStride, \
+  EIGTYPE alpha, \
+  level3_blocking<EIGTYPE, EIGTYPE>& /*blocking*/, \
+  GemmParallelInfo<Index>* /*info = 0*/) \
+{ \
+  using std::conj; \
+\
+  char transa, transb; \
+  MKL_INT m, n, k, lda, ldb, ldc; \
+  const EIGTYPE *a, *b; \
+  MKLTYPE alpha_, beta_; \
+  MatrixX##EIGPREFIX a_tmp, b_tmp; \
+  EIGTYPE myone(1);\
+\
+/* Set transpose options */ \
+  transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
+  transb = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
+\
+/* Set m, n, k */ \
+  m = (MKL_INT)rows;  \
+  n = (MKL_INT)cols;  \
+  k = (MKL_INT)depth; \
+\
+/* Set alpha_ & beta_ */ \
+  assign_scalar_eig2mkl(alpha_, alpha); \
+  assign_scalar_eig2mkl(beta_, myone); \
+\
+/* Set lda, ldb, ldc */ \
+  lda = (MKL_INT)lhsStride; \
+  ldb = (MKL_INT)rhsStride; \
+  ldc = (MKL_INT)resStride; \
+\
+/* Set a, b, c */ \
+  if ((LhsStorageOrder==ColMajor) && (ConjugateLhs)) { \
+    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,k,OuterStride<>(lhsStride)); \
+    a_tmp = lhs.conjugate(); \
+    a = a_tmp.data(); \
+    lda = a_tmp.outerStride(); \
+  } else a = _lhs; \
+\
+  if ((RhsStorageOrder==ColMajor) && (ConjugateRhs)) { \
+    Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,k,n,OuterStride<>(rhsStride)); \
+    b_tmp = rhs.conjugate(); \
+    b = b_tmp.data(); \
+    ldb = b_tmp.outerStride(); \
+  } else b = _rhs; \
+\
+  MKLPREFIX##gemm(&transa, &transb, &m, &n, &k, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
+}};
+
+GEMM_SPECIALIZATION(double,   d,  double,        d)
+GEMM_SPECIALIZATION(float,    f,  float,         s)
+GEMM_SPECIALIZATION(dcomplex, cd, MKL_Complex16, z)
+GEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8,  c)
+
+} // end namespase internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector.h
new file mode 100644
index 0000000..9bdd588
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector.h
@@ -0,0 +1,573 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERAL_MATRIX_VECTOR_H
+#define EIGEN_GENERAL_MATRIX_VECTOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/* Optimized col-major matrix * vector product:
+ * This algorithm processes 4 columns at onces that allows to both reduce
+ * the number of load/stores of the result by a factor 4 and to reduce
+ * the instruction dependency. Moreover, we know that all bands have the
+ * same alignment pattern.
+ *
+ * Mixing type logic: C += alpha * A * B
+ *  |  A  |  B  |alpha| comments
+ *  |real |cplx |cplx | no vectorization
+ *  |real |cplx |real | alpha is converted to a cplx when calling the run function, no vectorization
+ *  |cplx |real |cplx | invalid, the caller has to do tmp: = A * B; C += alpha*tmp
+ *  |cplx |real |real | optimal case, vectorization possible via real-cplx mul
+ */
+template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
+struct general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>
+{
+typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+
+enum {
+  Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable
+              && int(packet_traits<LhsScalar>::size)==int(packet_traits<RhsScalar>::size),
+  LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,
+  RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,
+  ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1
+};
+
+typedef typename packet_traits<LhsScalar>::type  _LhsPacket;
+typedef typename packet_traits<RhsScalar>::type  _RhsPacket;
+typedef typename packet_traits<ResScalar>::type  _ResPacket;
+
+typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;
+typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;
+typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;
+
+EIGEN_DONT_INLINE static void run(
+  Index rows, Index cols,
+  const LhsScalar* lhs, Index lhsStride,
+  const RhsScalar* rhs, Index rhsIncr,
+  ResScalar* res, Index
+  #ifdef EIGEN_INTERNAL_DEBUGGING
+    resIncr
+  #endif
+  , RhsScalar alpha);
+};
+
+template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
+EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>::run(
+  Index rows, Index cols,
+  const LhsScalar* lhs, Index lhsStride,
+  const RhsScalar* rhs, Index rhsIncr,
+  ResScalar* res, Index
+  #ifdef EIGEN_INTERNAL_DEBUGGING
+    resIncr
+  #endif
+  , RhsScalar alpha)
+{
+  eigen_internal_assert(resIncr==1);
+  #ifdef _EIGEN_ACCUMULATE_PACKETS
+  #error _EIGEN_ACCUMULATE_PACKETS has already been defined
+  #endif
+  #define _EIGEN_ACCUMULATE_PACKETS(A0,A13,A2) \
+    pstore(&res[j], \
+      padd(pload<ResPacket>(&res[j]), \
+        padd( \
+          padd(pcj.pmul(EIGEN_CAT(ploa , A0)<LhsPacket>(&lhs0[j]),    ptmp0), \
+                  pcj.pmul(EIGEN_CAT(ploa , A13)<LhsPacket>(&lhs1[j]),   ptmp1)), \
+          padd(pcj.pmul(EIGEN_CAT(ploa , A2)<LhsPacket>(&lhs2[j]),    ptmp2), \
+                  pcj.pmul(EIGEN_CAT(ploa , A13)<LhsPacket>(&lhs3[j]),   ptmp3)) )))
+
+  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
+  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;
+  if(ConjugateRhs)
+    alpha = conj(alpha);
+
+  enum { AllAligned = 0, EvenAligned, FirstAligned, NoneAligned };
+  const Index columnsAtOnce = 4;
+  const Index peels = 2;
+  const Index LhsPacketAlignedMask = LhsPacketSize-1;
+  const Index ResPacketAlignedMask = ResPacketSize-1;
+//  const Index PeelAlignedMask = ResPacketSize*peels-1;
+  const Index size = rows;
+  
+  // How many coeffs of the result do we have to skip to be aligned.
+  // Here we assume data are at least aligned on the base scalar type.
+  Index alignedStart = internal::first_aligned(res,size);
+  Index alignedSize = ResPacketSize>1 ? alignedStart + ((size-alignedStart) & ~ResPacketAlignedMask) : 0;
+  const Index peeledSize = alignedSize - RhsPacketSize*peels - RhsPacketSize + 1;
+
+  const Index alignmentStep = LhsPacketSize>1 ? (LhsPacketSize - lhsStride % LhsPacketSize) & LhsPacketAlignedMask : 0;
+  Index alignmentPattern = alignmentStep==0 ? AllAligned
+                       : alignmentStep==(LhsPacketSize/2) ? EvenAligned
+                       : FirstAligned;
+
+  // we cannot assume the first element is aligned because of sub-matrices
+  const Index lhsAlignmentOffset = internal::first_aligned(lhs,size);
+
+  // find how many columns do we have to skip to be aligned with the result (if possible)
+  Index skipColumns = 0;
+  // if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)
+  if( (size_t(lhs)%sizeof(LhsScalar)) || (size_t(res)%sizeof(ResScalar)) )
+  {
+    alignedSize = 0;
+    alignedStart = 0;
+  }
+  else if (LhsPacketSize>1)
+  {
+    eigen_internal_assert(size_t(lhs+lhsAlignmentOffset)%sizeof(LhsPacket)==0 || size<LhsPacketSize);
+
+    while (skipColumns<LhsPacketSize &&
+          alignedStart != ((lhsAlignmentOffset + alignmentStep*skipColumns)%LhsPacketSize))
+      ++skipColumns;
+    if (skipColumns==LhsPacketSize)
+    {
+      // nothing can be aligned, no need to skip any column
+      alignmentPattern = NoneAligned;
+      skipColumns = 0;
+    }
+    else
+    {
+      skipColumns = (std::min)(skipColumns,cols);
+      // note that the skiped columns are processed later.
+    }
+
+    eigen_internal_assert(  (alignmentPattern==NoneAligned)
+                      || (skipColumns + columnsAtOnce >= cols)
+                      || LhsPacketSize > size
+                      || (size_t(lhs+alignedStart+lhsStride*skipColumns)%sizeof(LhsPacket))==0);
+  }
+  else if(Vectorizable)
+  {
+    alignedStart = 0;
+    alignedSize = size;
+    alignmentPattern = AllAligned;
+  }
+
+  Index offset1 = (FirstAligned && alignmentStep==1?3:1);
+  Index offset3 = (FirstAligned && alignmentStep==1?1:3);
+
+  Index columnBound = ((cols-skipColumns)/columnsAtOnce)*columnsAtOnce + skipColumns;
+  for (Index i=skipColumns; i<columnBound; i+=columnsAtOnce)
+  {
+    RhsPacket ptmp0 = pset1<RhsPacket>(alpha*rhs[i*rhsIncr]),
+              ptmp1 = pset1<RhsPacket>(alpha*rhs[(i+offset1)*rhsIncr]),
+              ptmp2 = pset1<RhsPacket>(alpha*rhs[(i+2)*rhsIncr]),
+              ptmp3 = pset1<RhsPacket>(alpha*rhs[(i+offset3)*rhsIncr]);
+
+    // this helps a lot generating better binary code
+    const LhsScalar *lhs0 = lhs + i*lhsStride,     *lhs1 = lhs + (i+offset1)*lhsStride,
+                    *lhs2 = lhs + (i+2)*lhsStride, *lhs3 = lhs + (i+offset3)*lhsStride;
+
+    if (Vectorizable)
+    {
+      /* explicit vectorization */
+      // process initial unaligned coeffs
+      for (Index j=0; j<alignedStart; ++j)
+      {
+        res[j] = cj.pmadd(lhs0[j], pfirst(ptmp0), res[j]);
+        res[j] = cj.pmadd(lhs1[j], pfirst(ptmp1), res[j]);
+        res[j] = cj.pmadd(lhs2[j], pfirst(ptmp2), res[j]);
+        res[j] = cj.pmadd(lhs3[j], pfirst(ptmp3), res[j]);
+      }
+
+      if (alignedSize>alignedStart)
+      {
+        switch(alignmentPattern)
+        {
+          case AllAligned:
+            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,d,d);
+            break;
+          case EvenAligned:
+            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,du,d);
+            break;
+          case FirstAligned:
+          {
+            Index j = alignedStart;
+            if(peels>1)
+            {
+              LhsPacket A00, A01, A02, A03, A10, A11, A12, A13;
+              ResPacket T0, T1;
+
+              A01 = pload<LhsPacket>(&lhs1[alignedStart-1]);
+              A02 = pload<LhsPacket>(&lhs2[alignedStart-2]);
+              A03 = pload<LhsPacket>(&lhs3[alignedStart-3]);
+
+              for (; j<peeledSize; j+=peels*ResPacketSize)
+              {
+                A11 = pload<LhsPacket>(&lhs1[j-1+LhsPacketSize]);  palign<1>(A01,A11);
+                A12 = pload<LhsPacket>(&lhs2[j-2+LhsPacketSize]);  palign<2>(A02,A12);
+                A13 = pload<LhsPacket>(&lhs3[j-3+LhsPacketSize]);  palign<3>(A03,A13);
+
+                A00 = pload<LhsPacket>(&lhs0[j]);
+                A10 = pload<LhsPacket>(&lhs0[j+LhsPacketSize]);
+                T0  = pcj.pmadd(A00, ptmp0, pload<ResPacket>(&res[j]));
+                T1  = pcj.pmadd(A10, ptmp0, pload<ResPacket>(&res[j+ResPacketSize]));
+
+                T0  = pcj.pmadd(A01, ptmp1, T0);
+                A01 = pload<LhsPacket>(&lhs1[j-1+2*LhsPacketSize]);  palign<1>(A11,A01);
+                T0  = pcj.pmadd(A02, ptmp2, T0);
+                A02 = pload<LhsPacket>(&lhs2[j-2+2*LhsPacketSize]);  palign<2>(A12,A02);
+                T0  = pcj.pmadd(A03, ptmp3, T0);
+                pstore(&res[j],T0);
+                A03 = pload<LhsPacket>(&lhs3[j-3+2*LhsPacketSize]);  palign<3>(A13,A03);
+                T1  = pcj.pmadd(A11, ptmp1, T1);
+                T1  = pcj.pmadd(A12, ptmp2, T1);
+                T1  = pcj.pmadd(A13, ptmp3, T1);
+                pstore(&res[j+ResPacketSize],T1);
+              }
+            }
+            for (; j<alignedSize; j+=ResPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,du,du);
+            break;
+          }
+          default:
+            for (Index j = alignedStart; j<alignedSize; j+=ResPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(du,du,du);
+            break;
+        }
+      }
+    } // end explicit vectorization
+
+    /* process remaining coeffs (or all if there is no explicit vectorization) */
+    for (Index j=alignedSize; j<size; ++j)
+    {
+      res[j] = cj.pmadd(lhs0[j], pfirst(ptmp0), res[j]);
+      res[j] = cj.pmadd(lhs1[j], pfirst(ptmp1), res[j]);
+      res[j] = cj.pmadd(lhs2[j], pfirst(ptmp2), res[j]);
+      res[j] = cj.pmadd(lhs3[j], pfirst(ptmp3), res[j]);
+    }
+  }
+
+  // process remaining first and last columns (at most columnsAtOnce-1)
+  Index end = cols;
+  Index start = columnBound;
+  do
+  {
+    for (Index k=start; k<end; ++k)
+    {
+      RhsPacket ptmp0 = pset1<RhsPacket>(alpha*rhs[k*rhsIncr]);
+      const LhsScalar* lhs0 = lhs + k*lhsStride;
+
+      if (Vectorizable)
+      {
+        /* explicit vectorization */
+        // process first unaligned result's coeffs
+        for (Index j=0; j<alignedStart; ++j)
+          res[j] += cj.pmul(lhs0[j], pfirst(ptmp0));
+        // process aligned result's coeffs
+        if ((size_t(lhs0+alignedStart)%sizeof(LhsPacket))==0)
+          for (Index i = alignedStart;i<alignedSize;i+=ResPacketSize)
+            pstore(&res[i], pcj.pmadd(ploadu<LhsPacket>(&lhs0[i]), ptmp0, pload<ResPacket>(&res[i])));
+        else
+          for (Index i = alignedStart;i<alignedSize;i+=ResPacketSize)
+            pstore(&res[i], pcj.pmadd(ploadu<LhsPacket>(&lhs0[i]), ptmp0, pload<ResPacket>(&res[i])));
+      }
+
+      // process remaining scalars (or all if no explicit vectorization)
+      for (Index i=alignedSize; i<size; ++i)
+        res[i] += cj.pmul(lhs0[i], pfirst(ptmp0));
+    }
+    if (skipColumns)
+    {
+      start = 0;
+      end = skipColumns;
+      skipColumns = 0;
+    }
+    else
+      break;
+  } while(Vectorizable);
+  #undef _EIGEN_ACCUMULATE_PACKETS
+}
+
+/* Optimized row-major matrix * vector product:
+ * This algorithm processes 4 rows at onces that allows to both reduce
+ * the number of load/stores of the result by a factor 4 and to reduce
+ * the instruction dependency. Moreover, we know that all bands have the
+ * same alignment pattern.
+ *
+ * Mixing type logic:
+ *  - alpha is always a complex (or converted to a complex)
+ *  - no vectorization
+ */
+template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
+struct general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>
+{
+typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+
+enum {
+  Vectorizable = packet_traits<LhsScalar>::Vectorizable && packet_traits<RhsScalar>::Vectorizable
+              && int(packet_traits<LhsScalar>::size)==int(packet_traits<RhsScalar>::size),
+  LhsPacketSize = Vectorizable ? packet_traits<LhsScalar>::size : 1,
+  RhsPacketSize = Vectorizable ? packet_traits<RhsScalar>::size : 1,
+  ResPacketSize = Vectorizable ? packet_traits<ResScalar>::size : 1
+};
+
+typedef typename packet_traits<LhsScalar>::type  _LhsPacket;
+typedef typename packet_traits<RhsScalar>::type  _RhsPacket;
+typedef typename packet_traits<ResScalar>::type  _ResPacket;
+
+typedef typename conditional<Vectorizable,_LhsPacket,LhsScalar>::type LhsPacket;
+typedef typename conditional<Vectorizable,_RhsPacket,RhsScalar>::type RhsPacket;
+typedef typename conditional<Vectorizable,_ResPacket,ResScalar>::type ResPacket;
+  
+EIGEN_DONT_INLINE static void run(
+  Index rows, Index cols,
+  const LhsScalar* lhs, Index lhsStride,
+  const RhsScalar* rhs, Index rhsIncr,
+  ResScalar* res, Index resIncr,
+  ResScalar alpha);
+};
+
+template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
+EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjugateLhs,RhsScalar,ConjugateRhs,Version>::run(
+  Index rows, Index cols,
+  const LhsScalar* lhs, Index lhsStride,
+  const RhsScalar* rhs, Index rhsIncr,
+  ResScalar* res, Index resIncr,
+  ResScalar alpha)
+{
+  EIGEN_UNUSED_VARIABLE(rhsIncr);
+  eigen_internal_assert(rhsIncr==1);
+  #ifdef _EIGEN_ACCUMULATE_PACKETS
+  #error _EIGEN_ACCUMULATE_PACKETS has already been defined
+  #endif
+
+  #define _EIGEN_ACCUMULATE_PACKETS(A0,A13,A2) {\
+    RhsPacket b = pload<RhsPacket>(&rhs[j]); \
+    ptmp0 = pcj.pmadd(EIGEN_CAT(ploa,A0) <LhsPacket>(&lhs0[j]), b, ptmp0); \
+    ptmp1 = pcj.pmadd(EIGEN_CAT(ploa,A13)<LhsPacket>(&lhs1[j]), b, ptmp1); \
+    ptmp2 = pcj.pmadd(EIGEN_CAT(ploa,A2) <LhsPacket>(&lhs2[j]), b, ptmp2); \
+    ptmp3 = pcj.pmadd(EIGEN_CAT(ploa,A13)<LhsPacket>(&lhs3[j]), b, ptmp3); }
+
+  conj_helper<LhsScalar,RhsScalar,ConjugateLhs,ConjugateRhs> cj;
+  conj_helper<LhsPacket,RhsPacket,ConjugateLhs,ConjugateRhs> pcj;
+
+  enum { AllAligned=0, EvenAligned=1, FirstAligned=2, NoneAligned=3 };
+  const Index rowsAtOnce = 4;
+  const Index peels = 2;
+  const Index RhsPacketAlignedMask = RhsPacketSize-1;
+  const Index LhsPacketAlignedMask = LhsPacketSize-1;
+//   const Index PeelAlignedMask = RhsPacketSize*peels-1;
+  const Index depth = cols;
+
+  // How many coeffs of the result do we have to skip to be aligned.
+  // Here we assume data are at least aligned on the base scalar type
+  // if that's not the case then vectorization is discarded, see below.
+  Index alignedStart = internal::first_aligned(rhs, depth);
+  Index alignedSize = RhsPacketSize>1 ? alignedStart + ((depth-alignedStart) & ~RhsPacketAlignedMask) : 0;
+  const Index peeledSize = alignedSize - RhsPacketSize*peels - RhsPacketSize + 1;
+
+  const Index alignmentStep = LhsPacketSize>1 ? (LhsPacketSize - lhsStride % LhsPacketSize) & LhsPacketAlignedMask : 0;
+  Index alignmentPattern = alignmentStep==0 ? AllAligned
+                         : alignmentStep==(LhsPacketSize/2) ? EvenAligned
+                         : FirstAligned;
+
+  // we cannot assume the first element is aligned because of sub-matrices
+  const Index lhsAlignmentOffset = internal::first_aligned(lhs,depth);
+
+  // find how many rows do we have to skip to be aligned with rhs (if possible)
+  Index skipRows = 0;
+  // if the data cannot be aligned (TODO add some compile time tests when possible, e.g. for floats)
+  if( (sizeof(LhsScalar)!=sizeof(RhsScalar)) || (size_t(lhs)%sizeof(LhsScalar)) || (size_t(rhs)%sizeof(RhsScalar)) )
+  {
+    alignedSize = 0;
+    alignedStart = 0;
+  }
+  else if (LhsPacketSize>1)
+  {
+    eigen_internal_assert(size_t(lhs+lhsAlignmentOffset)%sizeof(LhsPacket)==0  || depth<LhsPacketSize);
+
+    while (skipRows<LhsPacketSize &&
+           alignedStart != ((lhsAlignmentOffset + alignmentStep*skipRows)%LhsPacketSize))
+      ++skipRows;
+    if (skipRows==LhsPacketSize)
+    {
+      // nothing can be aligned, no need to skip any column
+      alignmentPattern = NoneAligned;
+      skipRows = 0;
+    }
+    else
+    {
+      skipRows = (std::min)(skipRows,Index(rows));
+      // note that the skiped columns are processed later.
+    }
+    eigen_internal_assert(  alignmentPattern==NoneAligned
+                      || LhsPacketSize==1
+                      || (skipRows + rowsAtOnce >= rows)
+                      || LhsPacketSize > depth
+                      || (size_t(lhs+alignedStart+lhsStride*skipRows)%sizeof(LhsPacket))==0);
+  }
+  else if(Vectorizable)
+  {
+    alignedStart = 0;
+    alignedSize = depth;
+    alignmentPattern = AllAligned;
+  }
+
+  Index offset1 = (FirstAligned && alignmentStep==1?3:1);
+  Index offset3 = (FirstAligned && alignmentStep==1?1:3);
+
+  Index rowBound = ((rows-skipRows)/rowsAtOnce)*rowsAtOnce + skipRows;
+  for (Index i=skipRows; i<rowBound; i+=rowsAtOnce)
+  {
+    EIGEN_ALIGN16 ResScalar tmp0 = ResScalar(0);
+    ResScalar tmp1 = ResScalar(0), tmp2 = ResScalar(0), tmp3 = ResScalar(0);
+
+    // this helps the compiler generating good binary code
+    const LhsScalar *lhs0 = lhs + i*lhsStride,     *lhs1 = lhs + (i+offset1)*lhsStride,
+                    *lhs2 = lhs + (i+2)*lhsStride, *lhs3 = lhs + (i+offset3)*lhsStride;
+
+    if (Vectorizable)
+    {
+      /* explicit vectorization */
+      ResPacket ptmp0 = pset1<ResPacket>(ResScalar(0)), ptmp1 = pset1<ResPacket>(ResScalar(0)),
+                ptmp2 = pset1<ResPacket>(ResScalar(0)), ptmp3 = pset1<ResPacket>(ResScalar(0));
+
+      // process initial unaligned coeffs
+      // FIXME this loop get vectorized by the compiler !
+      for (Index j=0; j<alignedStart; ++j)
+      {
+        RhsScalar b = rhs[j];
+        tmp0 += cj.pmul(lhs0[j],b); tmp1 += cj.pmul(lhs1[j],b);
+        tmp2 += cj.pmul(lhs2[j],b); tmp3 += cj.pmul(lhs3[j],b);
+      }
+
+      if (alignedSize>alignedStart)
+      {
+        switch(alignmentPattern)
+        {
+          case AllAligned:
+            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,d,d);
+            break;
+          case EvenAligned:
+            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,du,d);
+            break;
+          case FirstAligned:
+          {
+            Index j = alignedStart;
+            if (peels>1)
+            {
+              /* Here we proccess 4 rows with with two peeled iterations to hide
+               * the overhead of unaligned loads. Moreover unaligned loads are handled
+               * using special shift/move operations between the two aligned packets
+               * overlaping the desired unaligned packet. This is *much* more efficient
+               * than basic unaligned loads.
+               */
+              LhsPacket A01, A02, A03, A11, A12, A13;
+              A01 = pload<LhsPacket>(&lhs1[alignedStart-1]);
+              A02 = pload<LhsPacket>(&lhs2[alignedStart-2]);
+              A03 = pload<LhsPacket>(&lhs3[alignedStart-3]);
+
+              for (; j<peeledSize; j+=peels*RhsPacketSize)
+              {
+                RhsPacket b = pload<RhsPacket>(&rhs[j]);
+                A11 = pload<LhsPacket>(&lhs1[j-1+LhsPacketSize]);  palign<1>(A01,A11);
+                A12 = pload<LhsPacket>(&lhs2[j-2+LhsPacketSize]);  palign<2>(A02,A12);
+                A13 = pload<LhsPacket>(&lhs3[j-3+LhsPacketSize]);  palign<3>(A03,A13);
+
+                ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j]), b, ptmp0);
+                ptmp1 = pcj.pmadd(A01, b, ptmp1);
+                A01 = pload<LhsPacket>(&lhs1[j-1+2*LhsPacketSize]);  palign<1>(A11,A01);
+                ptmp2 = pcj.pmadd(A02, b, ptmp2);
+                A02 = pload<LhsPacket>(&lhs2[j-2+2*LhsPacketSize]);  palign<2>(A12,A02);
+                ptmp3 = pcj.pmadd(A03, b, ptmp3);
+                A03 = pload<LhsPacket>(&lhs3[j-3+2*LhsPacketSize]);  palign<3>(A13,A03);
+
+                b = pload<RhsPacket>(&rhs[j+RhsPacketSize]);
+                ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j+LhsPacketSize]), b, ptmp0);
+                ptmp1 = pcj.pmadd(A11, b, ptmp1);
+                ptmp2 = pcj.pmadd(A12, b, ptmp2);
+                ptmp3 = pcj.pmadd(A13, b, ptmp3);
+              }
+            }
+            for (; j<alignedSize; j+=RhsPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(d,du,du);
+            break;
+          }
+          default:
+            for (Index j = alignedStart; j<alignedSize; j+=RhsPacketSize)
+              _EIGEN_ACCUMULATE_PACKETS(du,du,du);
+            break;
+        }
+        tmp0 += predux(ptmp0);
+        tmp1 += predux(ptmp1);
+        tmp2 += predux(ptmp2);
+        tmp3 += predux(ptmp3);
+      }
+    } // end explicit vectorization
+
+    // process remaining coeffs (or all if no explicit vectorization)
+    // FIXME this loop get vectorized by the compiler !
+    for (Index j=alignedSize; j<depth; ++j)
+    {
+      RhsScalar b = rhs[j];
+      tmp0 += cj.pmul(lhs0[j],b); tmp1 += cj.pmul(lhs1[j],b);
+      tmp2 += cj.pmul(lhs2[j],b); tmp3 += cj.pmul(lhs3[j],b);
+    }
+    res[i*resIncr]            += alpha*tmp0;
+    res[(i+offset1)*resIncr]  += alpha*tmp1;
+    res[(i+2)*resIncr]        += alpha*tmp2;
+    res[(i+offset3)*resIncr]  += alpha*tmp3;
+  }
+
+  // process remaining first and last rows (at most columnsAtOnce-1)
+  Index end = rows;
+  Index start = rowBound;
+  do
+  {
+    for (Index i=start; i<end; ++i)
+    {
+      EIGEN_ALIGN16 ResScalar tmp0 = ResScalar(0);
+      ResPacket ptmp0 = pset1<ResPacket>(tmp0);
+      const LhsScalar* lhs0 = lhs + i*lhsStride;
+      // process first unaligned result's coeffs
+      // FIXME this loop get vectorized by the compiler !
+      for (Index j=0; j<alignedStart; ++j)
+        tmp0 += cj.pmul(lhs0[j], rhs[j]);
+
+      if (alignedSize>alignedStart)
+      {
+        // process aligned rhs coeffs
+        if ((size_t(lhs0+alignedStart)%sizeof(LhsPacket))==0)
+          for (Index j = alignedStart;j<alignedSize;j+=RhsPacketSize)
+            ptmp0 = pcj.pmadd(pload<LhsPacket>(&lhs0[j]), pload<RhsPacket>(&rhs[j]), ptmp0);
+        else
+          for (Index j = alignedStart;j<alignedSize;j+=RhsPacketSize)
+            ptmp0 = pcj.pmadd(ploadu<LhsPacket>(&lhs0[j]), pload<RhsPacket>(&rhs[j]), ptmp0);
+        tmp0 += predux(ptmp0);
+      }
+
+      // process remaining scalars
+      // FIXME this loop get vectorized by the compiler !
+      for (Index j=alignedSize; j<depth; ++j)
+        tmp0 += cj.pmul(lhs0[j], rhs[j]);
+      res[i*resIncr] += alpha*tmp0;
+    }
+    if (skipRows)
+    {
+      start = 0;
+      end = skipRows;
+      skipRows = 0;
+    }
+    else
+      break;
+  } while(Vectorizable);
+
+  #undef _EIGEN_ACCUMULATE_PACKETS
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_VECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector_MKL.h
new file mode 100644
index 0000000..1cb9fe6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/GeneralMatrixVector_MKL.h
@@ -0,0 +1,131 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   General matrix-vector product functionality based on ?GEMV.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
+#define EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/**********************************************************************
+* This file implements general matrix-vector multiplication using BLAS
+* gemv function via partial specialization of
+* general_matrix_vector_product::run(..) method for float, double,
+* std::complex<float> and std::complex<double> types
+**********************************************************************/
+
+// gemv specialization
+
+template<typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>
+struct general_matrix_vector_product_gemv :
+  general_matrix_vector_product<Index,LhsScalar,LhsStorageOrder,ConjugateLhs,RhsScalar,ConjugateRhs,BuiltIn> {};
+
+#define EIGEN_MKL_GEMV_SPECIALIZE(Scalar) \
+template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
+struct general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \
+static void run( \
+  Index rows, Index cols, \
+  const Scalar* lhs, Index lhsStride, \
+  const Scalar* rhs, Index rhsIncr, \
+  Scalar* res, Index resIncr, Scalar alpha) \
+{ \
+  if (ConjugateLhs) { \
+    general_matrix_vector_product<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs,BuiltIn>::run( \
+      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
+  } else { \
+    general_matrix_vector_product_gemv<Index,Scalar,ColMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
+      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
+  } \
+} \
+}; \
+template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
+struct general_matrix_vector_product<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs,Specialized> { \
+static void run( \
+  Index rows, Index cols, \
+  const Scalar* lhs, Index lhsStride, \
+  const Scalar* rhs, Index rhsIncr, \
+  Scalar* res, Index resIncr, Scalar alpha) \
+{ \
+    general_matrix_vector_product_gemv<Index,Scalar,RowMajor,ConjugateLhs,Scalar,ConjugateRhs>::run( \
+      rows, cols, lhs, lhsStride, rhs, rhsIncr, res, resIncr, alpha); \
+} \
+}; \
+
+EIGEN_MKL_GEMV_SPECIALIZE(double)
+EIGEN_MKL_GEMV_SPECIALIZE(float)
+EIGEN_MKL_GEMV_SPECIALIZE(dcomplex)
+EIGEN_MKL_GEMV_SPECIALIZE(scomplex)
+
+#define EIGEN_MKL_GEMV_SPECIALIZATION(EIGTYPE,MKLTYPE,MKLPREFIX) \
+template<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \
+struct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \
+{ \
+typedef Matrix<EIGTYPE,Dynamic,1,ColMajor> GEMVVector;\
+\
+static void run( \
+  Index rows, Index cols, \
+  const EIGTYPE* lhs, Index lhsStride, \
+  const EIGTYPE* rhs, Index rhsIncr, \
+  EIGTYPE* res, Index resIncr, EIGTYPE alpha) \
+{ \
+  MKL_INT m=rows, n=cols, lda=lhsStride, incx=rhsIncr, incy=resIncr; \
+  MKLTYPE alpha_, beta_; \
+  const EIGTYPE *x_ptr, myone(1); \
+  char trans=(LhsStorageOrder==ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T'; \
+  if (LhsStorageOrder==RowMajor) { \
+    m=cols; \
+    n=rows; \
+  }\
+  assign_scalar_eig2mkl(alpha_, alpha); \
+  assign_scalar_eig2mkl(beta_, myone); \
+  GEMVVector x_tmp; \
+  if (ConjugateRhs) { \
+    Map<const GEMVVector, 0, InnerStride<> > map_x(rhs,cols,1,InnerStride<>(incx)); \
+    x_tmp=map_x.conjugate(); \
+    x_ptr=x_tmp.data(); \
+    incx=1; \
+  } else x_ptr=rhs; \
+  MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)lhs, &lda, (const MKLTYPE*)x_ptr, &incx, &beta_, (MKLTYPE*)res, &incy); \
+}\
+};
+
+EIGEN_MKL_GEMV_SPECIALIZATION(double,   double,        d)
+EIGEN_MKL_GEMV_SPECIALIZATION(float,    float,         s)
+EIGEN_MKL_GEMV_SPECIALIZATION(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_GEMV_SPECIALIZATION(scomplex, MKL_Complex8,  c)
+
+} // end namespase internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/Parallelizer.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/Parallelizer.h
new file mode 100644
index 0000000..5c3e9b7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/Parallelizer.h
@@ -0,0 +1,159 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PARALLELIZER_H
+#define EIGEN_PARALLELIZER_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal */
+inline void manage_multi_threading(Action action, int* v)
+{
+  static EIGEN_UNUSED int m_maxThreads = -1;
+
+  if(action==SetAction)
+  {
+    eigen_internal_assert(v!=0);
+    m_maxThreads = *v;
+  }
+  else if(action==GetAction)
+  {
+    eigen_internal_assert(v!=0);
+    #ifdef EIGEN_HAS_OPENMP
+    if(m_maxThreads>0)
+      *v = m_maxThreads;
+    else
+      *v = omp_get_max_threads();
+    #else
+    *v = 1;
+    #endif
+  }
+  else
+  {
+    eigen_internal_assert(false);
+  }
+}
+
+}
+
+/** Must be call first when calling Eigen from multiple threads */
+inline void initParallel()
+{
+  int nbt;
+  internal::manage_multi_threading(GetAction, &nbt);
+  std::ptrdiff_t l1, l2;
+  internal::manage_caching_sizes(GetAction, &l1, &l2);
+}
+
+/** \returns the max number of threads reserved for Eigen
+  * \sa setNbThreads */
+inline int nbThreads()
+{
+  int ret;
+  internal::manage_multi_threading(GetAction, &ret);
+  return ret;
+}
+
+/** Sets the max number of threads reserved for Eigen
+  * \sa nbThreads */
+inline void setNbThreads(int v)
+{
+  internal::manage_multi_threading(SetAction, &v);
+}
+
+namespace internal {
+
+template<typename Index> struct GemmParallelInfo
+{
+  GemmParallelInfo() : sync(-1), users(0), rhs_start(0), rhs_length(0) {}
+
+  int volatile sync;
+  int volatile users;
+
+  Index rhs_start;
+  Index rhs_length;
+};
+
+template<bool Condition, typename Functor, typename Index>
+void parallelize_gemm(const Functor& func, Index rows, Index cols, bool transpose)
+{
+  // TODO when EIGEN_USE_BLAS is defined,
+  // we should still enable OMP for other scalar types
+#if !(defined (EIGEN_HAS_OPENMP)) || defined (EIGEN_USE_BLAS)
+  // FIXME the transpose variable is only needed to properly split
+  // the matrix product when multithreading is enabled. This is a temporary
+  // fix to support row-major destination matrices. This whole
+  // parallelizer mechanism has to be redisigned anyway.
+  EIGEN_UNUSED_VARIABLE(transpose);
+  func(0,rows, 0,cols);
+#else
+
+  // Dynamically check whether we should enable or disable OpenMP.
+  // The conditions are:
+  // - the max number of threads we can create is greater than 1
+  // - we are not already in a parallel code
+  // - the sizes are large enough
+
+  // 1- are we already in a parallel session?
+  // FIXME omp_get_num_threads()>1 only works for openmp, what if the user does not use openmp?
+  if((!Condition) || (omp_get_num_threads()>1))
+    return func(0,rows, 0,cols);
+
+  Index size = transpose ? cols : rows;
+
+  // 2- compute the maximal number of threads from the size of the product:
+  // FIXME this has to be fine tuned
+  Index max_threads = std::max<Index>(1,size / 32);
+
+  // 3 - compute the number of threads we are going to use
+  Index threads = std::min<Index>(nbThreads(), max_threads);
+
+  if(threads==1)
+    return func(0,rows, 0,cols);
+
+  Eigen::initParallel();
+  func.initParallelSession();
+
+  if(transpose)
+    std::swap(rows,cols);
+
+  Index blockCols = (cols / threads) & ~Index(0x3);
+  Index blockRows = (rows / threads) & ~Index(0x7);
+  
+  GemmParallelInfo<Index>* info = new GemmParallelInfo<Index>[threads];
+
+  #pragma omp parallel for schedule(static,1) num_threads(threads)
+  for(Index i=0; i<threads; ++i)
+  {
+    Index r0 = i*blockRows;
+    Index actualBlockRows = (i+1==threads) ? rows-r0 : blockRows;
+
+    Index c0 = i*blockCols;
+    Index actualBlockCols = (i+1==threads) ? cols-c0 : blockCols;
+
+    info[i].rhs_start = c0;
+    info[i].rhs_length = actualBlockCols;
+
+    if(transpose)
+      func(0, cols, r0, actualBlockRows, info);
+    else
+      func(r0, actualBlockRows, 0,cols, info);
+  }
+
+  delete[] info;
+#endif
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARALLELIZER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix.h
new file mode 100644
index 0000000..ee619df
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix.h
@@ -0,0 +1,436 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_H
+#define EIGEN_SELFADJOINT_MATRIX_MATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// pack a selfadjoint block diagonal for use with the gebp_kernel
+template<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder>
+struct symm_pack_lhs
+{
+  template<int BlockRows> inline
+  void pack(Scalar* blockA, const const_blas_data_mapper<Scalar,Index,StorageOrder>& lhs, Index cols, Index i, Index& count)
+  {
+    // normal copy
+    for(Index k=0; k<i; k++)
+      for(Index w=0; w<BlockRows; w++)
+        blockA[count++] = lhs(i+w,k);           // normal
+    // symmetric copy
+    Index h = 0;
+    for(Index k=i; k<i+BlockRows; k++)
+    {
+      for(Index w=0; w<h; w++)
+        blockA[count++] = conj(lhs(k, i+w)); // transposed
+
+      blockA[count++] = real(lhs(k,k));   // real (diagonal)
+
+      for(Index w=h+1; w<BlockRows; w++)
+        blockA[count++] = lhs(i+w, k);          // normal
+      ++h;
+    }
+    // transposed copy
+    for(Index k=i+BlockRows; k<cols; k++)
+      for(Index w=0; w<BlockRows; w++)
+        blockA[count++] = conj(lhs(k, i+w)); // transposed
+  }
+  void operator()(Scalar* blockA, const Scalar* _lhs, Index lhsStride, Index cols, Index rows)
+  {
+    const_blas_data_mapper<Scalar,Index,StorageOrder> lhs(_lhs,lhsStride);
+    Index count = 0;
+    Index peeled_mc = (rows/Pack1)*Pack1;
+    for(Index i=0; i<peeled_mc; i+=Pack1)
+    {
+      pack<Pack1>(blockA, lhs, cols, i, count);
+    }
+
+    if(rows-peeled_mc>=Pack2)
+    {
+      pack<Pack2>(blockA, lhs, cols, peeled_mc, count);
+      peeled_mc += Pack2;
+    }
+
+    // do the same with mr==1
+    for(Index i=peeled_mc; i<rows; i++)
+    {
+      for(Index k=0; k<i; k++)
+        blockA[count++] = lhs(i, k);              // normal
+
+      blockA[count++] = real(lhs(i, i));       // real (diagonal)
+
+      for(Index k=i+1; k<cols; k++)
+        blockA[count++] = conj(lhs(k, i));     // transposed
+    }
+  }
+};
+
+template<typename Scalar, typename Index, int nr, int StorageOrder>
+struct symm_pack_rhs
+{
+  enum { PacketSize = packet_traits<Scalar>::size };
+  void operator()(Scalar* blockB, const Scalar* _rhs, Index rhsStride, Index rows, Index cols, Index k2)
+  {
+    Index end_k = k2 + rows;
+    Index count = 0;
+    const_blas_data_mapper<Scalar,Index,StorageOrder> rhs(_rhs,rhsStride);
+    Index packet_cols = (cols/nr)*nr;
+
+    // first part: normal case
+    for(Index j2=0; j2<k2; j2+=nr)
+    {
+      for(Index k=k2; k<end_k; k++)
+      {
+        blockB[count+0] = rhs(k,j2+0);
+        blockB[count+1] = rhs(k,j2+1);
+        if (nr==4)
+        {
+          blockB[count+2] = rhs(k,j2+2);
+          blockB[count+3] = rhs(k,j2+3);
+        }
+        count += nr;
+      }
+    }
+
+    // second part: diagonal block
+    for(Index j2=k2; j2<(std::min)(k2+rows,packet_cols); j2+=nr)
+    {
+      // again we can split vertically in three different parts (transpose, symmetric, normal)
+      // transpose
+      for(Index k=k2; k<j2; k++)
+      {
+        blockB[count+0] = conj(rhs(j2+0,k));
+        blockB[count+1] = conj(rhs(j2+1,k));
+        if (nr==4)
+        {
+          blockB[count+2] = conj(rhs(j2+2,k));
+          blockB[count+3] = conj(rhs(j2+3,k));
+        }
+        count += nr;
+      }
+      // symmetric
+      Index h = 0;
+      for(Index k=j2; k<j2+nr; k++)
+      {
+        // normal
+        for (Index w=0 ; w<h; ++w)
+          blockB[count+w] = rhs(k,j2+w);
+
+        blockB[count+h] = real(rhs(k,k));
+
+        // transpose
+        for (Index w=h+1 ; w<nr; ++w)
+          blockB[count+w] = conj(rhs(j2+w,k));
+        count += nr;
+        ++h;
+      }
+      // normal
+      for(Index k=j2+nr; k<end_k; k++)
+      {
+        blockB[count+0] = rhs(k,j2+0);
+        blockB[count+1] = rhs(k,j2+1);
+        if (nr==4)
+        {
+          blockB[count+2] = rhs(k,j2+2);
+          blockB[count+3] = rhs(k,j2+3);
+        }
+        count += nr;
+      }
+    }
+
+    // third part: transposed
+    for(Index j2=k2+rows; j2<packet_cols; j2+=nr)
+    {
+      for(Index k=k2; k<end_k; k++)
+      {
+        blockB[count+0] = conj(rhs(j2+0,k));
+        blockB[count+1] = conj(rhs(j2+1,k));
+        if (nr==4)
+        {
+          blockB[count+2] = conj(rhs(j2+2,k));
+          blockB[count+3] = conj(rhs(j2+3,k));
+        }
+        count += nr;
+      }
+    }
+
+    // copy the remaining columns one at a time (=> the same with nr==1)
+    for(Index j2=packet_cols; j2<cols; ++j2)
+    {
+      // transpose
+      Index half = (std::min)(end_k,j2);
+      for(Index k=k2; k<half; k++)
+      {
+        blockB[count] = conj(rhs(j2,k));
+        count += 1;
+      }
+
+      if(half==j2 && half<k2+rows)
+      {
+        blockB[count] = real(rhs(j2,j2));
+        count += 1;
+      }
+      else
+        half--;
+
+      // normal
+      for(Index k=half+1; k<k2+rows; k++)
+      {
+        blockB[count] = rhs(k,j2);
+        count += 1;
+      }
+    }
+  }
+};
+
+/* Optimized selfadjoint matrix * matrix (_SYMM) product built on top of
+ * the general matrix matrix product.
+ */
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
+          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs,
+          int ResStorageOrder>
+struct product_selfadjoint_matrix;
+
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool LhsSelfAdjoint, bool ConjugateLhs,
+          int RhsStorageOrder, bool RhsSelfAdjoint, bool ConjugateRhs>
+struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,LhsSelfAdjoint,ConjugateLhs, RhsStorageOrder,RhsSelfAdjoint,ConjugateRhs,RowMajor>
+{
+
+  static EIGEN_STRONG_INLINE void run(
+    Index rows, Index cols,
+    const Scalar* lhs, Index lhsStride,
+    const Scalar* rhs, Index rhsStride,
+    Scalar* res,       Index resStride,
+    const Scalar& alpha)
+  {
+    product_selfadjoint_matrix<Scalar, Index,
+      EIGEN_LOGICAL_XOR(RhsSelfAdjoint,RhsStorageOrder==RowMajor) ? ColMajor : RowMajor,
+      RhsSelfAdjoint, NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(RhsSelfAdjoint,ConjugateRhs),
+      EIGEN_LOGICAL_XOR(LhsSelfAdjoint,LhsStorageOrder==RowMajor) ? ColMajor : RowMajor,
+      LhsSelfAdjoint, NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(LhsSelfAdjoint,ConjugateLhs),
+      ColMajor>
+      ::run(cols, rows,  rhs, rhsStride,  lhs, lhsStride,  res, resStride,  alpha);
+  }
+};
+
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs>
+struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor>
+{
+
+  static EIGEN_DONT_INLINE void run(
+    Index rows, Index cols,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha);
+};
+
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs>
+EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,true,ConjugateLhs, RhsStorageOrder,false,ConjugateRhs,ColMajor>::run(
+    Index rows, Index cols,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha)
+  {
+    Index size = rows;
+
+    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);
+
+    typedef gebp_traits<Scalar,Scalar> Traits;
+
+    Index kc = size;  // cache block size along the K direction
+    Index mc = rows;  // cache block size along the M direction
+    Index nc = cols;  // cache block size along the N direction
+    computeProductBlockingSizes<Scalar,Scalar>(kc, mc, nc);
+    // kc must smaller than mc
+    kc = (std::min)(kc,mc);
+
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+    std::size_t sizeB = sizeW + kc*cols;
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, kc*mc, 0);
+    ei_declare_aligned_stack_constructed_variable(Scalar, allocatedBlockB, sizeB, 0);
+    Scalar* blockB = allocatedBlockB + sizeW;
+
+    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+    symm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder==RowMajor?ColMajor:RowMajor, true> pack_lhs_transposed;
+
+    for(Index k2=0; k2<size; k2+=kc)
+    {
+      const Index actual_kc = (std::min)(k2+kc,size)-k2;
+
+      // we have selected one row panel of rhs and one column panel of lhs
+      // pack rhs's panel into a sequential chunk of memory
+      // and expand each coeff to a constant packet for further reuse
+      pack_rhs(blockB, &rhs(k2,0), rhsStride, actual_kc, cols);
+
+      // the select lhs's panel has to be split in three different parts:
+      //  1 - the transposed panel above the diagonal block => transposed packed copy
+      //  2 - the diagonal block => special packed copy
+      //  3 - the panel below the diagonal block => generic packed copy
+      for(Index i2=0; i2<k2; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(i2+mc,k2)-i2;
+        // transposed packed copy
+        pack_lhs_transposed(blockA, &lhs(k2, i2), lhsStride, actual_kc, actual_mc);
+
+        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);
+      }
+      // the block diagonal
+      {
+        const Index actual_mc = (std::min)(k2+kc,size)-k2;
+        // symmetric packed copy
+        pack_lhs(blockA, &lhs(k2,k2), lhsStride, actual_kc, actual_mc);
+
+        gebp_kernel(res+k2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);
+      }
+
+      for(Index i2=k2+kc; i2<size; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(i2+mc,size)-i2;
+        gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder,false>()
+          (blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);
+
+        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);
+      }
+    }
+  }
+
+// matrix * selfadjoint product
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs>
+struct product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor>
+{
+
+  static EIGEN_DONT_INLINE void run(
+    Index rows, Index cols,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha);
+};
+
+template <typename Scalar, typename Index,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs>
+EIGEN_DONT_INLINE void product_selfadjoint_matrix<Scalar,Index,LhsStorageOrder,false,ConjugateLhs, RhsStorageOrder,true,ConjugateRhs,ColMajor>::run(
+    Index rows, Index cols,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha)
+  {
+    Index size = cols;
+
+    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+
+    typedef gebp_traits<Scalar,Scalar> Traits;
+
+    Index kc = size; // cache block size along the K direction
+    Index mc = rows;  // cache block size along the M direction
+    Index nc = cols;  // cache block size along the N direction
+    computeProductBlockingSizes<Scalar,Scalar>(kc, mc, nc);
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+    std::size_t sizeB = sizeW + kc*cols;
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, kc*mc, 0);
+    ei_declare_aligned_stack_constructed_variable(Scalar, allocatedBlockB, sizeB, 0);
+    Scalar* blockB = allocatedBlockB + sizeW;
+
+    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+    symm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+
+    for(Index k2=0; k2<size; k2+=kc)
+    {
+      const Index actual_kc = (std::min)(k2+kc,size)-k2;
+
+      pack_rhs(blockB, _rhs, rhsStride, actual_kc, cols, k2);
+
+      // => GEPP
+      for(Index i2=0; i2<rows; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(i2+mc,rows)-i2;
+        pack_lhs(blockA, &lhs(i2, k2), lhsStride, actual_kc, actual_mc);
+
+        gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha);
+      }
+    }
+  }
+
+} // end namespace internal
+
+/***************************************************************************
+* Wrapper to product_selfadjoint_matrix
+***************************************************************************/
+
+namespace internal {
+template<typename Lhs, int LhsMode, typename Rhs, int RhsMode>
+struct traits<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false> >
+  : traits<ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>, Lhs, Rhs> >
+{};
+}
+
+template<typename Lhs, int LhsMode, typename Rhs, int RhsMode>
+struct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>
+  : public ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,RhsMode,false>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)
+
+  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  enum {
+    LhsIsUpper = (LhsMode&(Upper|Lower))==Upper,
+    LhsIsSelfAdjoint = (LhsMode&SelfAdjoint)==SelfAdjoint,
+    RhsIsUpper = (RhsMode&(Upper|Lower))==Upper,
+    RhsIsSelfAdjoint = (RhsMode&SelfAdjoint)==SelfAdjoint
+  };
+
+  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+  {
+    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());
+
+    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);
+    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);
+
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)
+                               * RhsBlasTraits::extractScalarFactor(m_rhs);
+
+    internal::product_selfadjoint_matrix<Scalar, Index,
+      EIGEN_LOGICAL_XOR(LhsIsUpper,
+                        internal::traits<Lhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, LhsIsSelfAdjoint,
+      NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(LhsIsUpper,bool(LhsBlasTraits::NeedToConjugate)),
+      EIGEN_LOGICAL_XOR(RhsIsUpper,
+                        internal::traits<Rhs>::Flags &RowMajorBit) ? RowMajor : ColMajor, RhsIsSelfAdjoint,
+      NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(RhsIsUpper,bool(RhsBlasTraits::NeedToConjugate)),
+      internal::traits<Dest>::Flags&RowMajorBit  ? RowMajor : ColMajor>
+      ::run(
+        lhs.rows(), rhs.cols(),                 // sizes
+        &lhs.coeffRef(0,0),    lhs.outerStride(),  // lhs info
+        &rhs.coeffRef(0,0),    rhs.outerStride(),  // rhs info
+        &dst.coeffRef(0,0), dst.outerStride(),  // result info
+        actualAlpha                             // alpha
+      );
+  }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h
new file mode 100644
index 0000000..dfa687f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixMatrix_MKL.h
@@ -0,0 +1,295 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Self adjoint matrix * matrix product functionality based on ?SYMM/?HEMM.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
+#define EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+
+/* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */
+
+#define EIGEN_MKL_SYMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \
+{\
+\
+  static void run( \
+    Index rows, Index cols, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha) \
+  { \
+    char side='L', uplo='L'; \
+    MKL_INT m, n, lda, ldb, ldc; \
+    const EIGTYPE *a, *b; \
+    MKLTYPE alpha_, beta_; \
+    MatrixX##EIGPREFIX b_tmp; \
+    EIGTYPE myone(1);\
+\
+/* Set transpose options */ \
+/* Set m, n, k */ \
+    m = (MKL_INT)rows;  \
+    n = (MKL_INT)cols;  \
+\
+/* Set alpha_ & beta_ */ \
+    assign_scalar_eig2mkl(alpha_, alpha); \
+    assign_scalar_eig2mkl(beta_, myone); \
+\
+/* Set lda, ldb, ldc */ \
+    lda = (MKL_INT)lhsStride; \
+    ldb = (MKL_INT)rhsStride; \
+    ldc = (MKL_INT)resStride; \
+\
+/* Set a, b, c */ \
+    if (LhsStorageOrder==RowMajor) uplo='U'; \
+    a = _lhs; \
+\
+    if (RhsStorageOrder==RowMajor) { \
+      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
+      b_tmp = rhs.adjoint(); \
+      b = b_tmp.data(); \
+      ldb = b_tmp.outerStride(); \
+    } else b = _rhs; \
+\
+    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
+\
+  } \
+};
+
+
+#define EIGEN_MKL_HEMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \
+{\
+  static void run( \
+    Index rows, Index cols, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha) \
+  { \
+    char side='L', uplo='L'; \
+    MKL_INT m, n, lda, ldb, ldc; \
+    const EIGTYPE *a, *b; \
+    MKLTYPE alpha_, beta_; \
+    MatrixX##EIGPREFIX b_tmp; \
+    Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> a_tmp; \
+    EIGTYPE myone(1); \
+\
+/* Set transpose options */ \
+/* Set m, n, k */ \
+    m = (MKL_INT)rows; \
+    n = (MKL_INT)cols; \
+\
+/* Set alpha_ & beta_ */ \
+    assign_scalar_eig2mkl(alpha_, alpha); \
+    assign_scalar_eig2mkl(beta_, myone); \
+\
+/* Set lda, ldb, ldc */ \
+    lda = (MKL_INT)lhsStride; \
+    ldb = (MKL_INT)rhsStride; \
+    ldc = (MKL_INT)resStride; \
+\
+/* Set a, b, c */ \
+    if (((LhsStorageOrder==ColMajor) && ConjugateLhs) || ((LhsStorageOrder==RowMajor) && (!ConjugateLhs))) { \
+      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder>, 0, OuterStride<> > lhs(_lhs,m,m,OuterStride<>(lhsStride)); \
+      a_tmp = lhs.conjugate(); \
+      a = a_tmp.data(); \
+      lda = a_tmp.outerStride(); \
+    } else a = _lhs; \
+    if (LhsStorageOrder==RowMajor) uplo='U'; \
+\
+    if (RhsStorageOrder==ColMajor && (!ConjugateRhs)) { \
+       b = _rhs; } \
+    else { \
+      if (RhsStorageOrder==ColMajor && ConjugateRhs) { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,m,n,OuterStride<>(rhsStride)); \
+        b_tmp = rhs.conjugate(); \
+      } else \
+      if (ConjugateRhs) { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
+        b_tmp = rhs.adjoint(); \
+      } else { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
+        b_tmp = rhs.transpose(); \
+      } \
+      b = b_tmp.data(); \
+      ldb = b_tmp.outerStride(); \
+    } \
+\
+    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
+\
+  } \
+};
+
+EIGEN_MKL_SYMM_L(double, double, d, d)
+EIGEN_MKL_SYMM_L(float, float, f, s)
+EIGEN_MKL_HEMM_L(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_HEMM_L(scomplex, MKL_Complex8, cf, c)
+
+
+/* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */
+
+#define EIGEN_MKL_SYMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \
+{\
+\
+  static void run( \
+    Index rows, Index cols, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha) \
+  { \
+    char side='R', uplo='L'; \
+    MKL_INT m, n, lda, ldb, ldc; \
+    const EIGTYPE *a, *b; \
+    MKLTYPE alpha_, beta_; \
+    MatrixX##EIGPREFIX b_tmp; \
+    EIGTYPE myone(1);\
+\
+/* Set m, n, k */ \
+    m = (MKL_INT)rows;  \
+    n = (MKL_INT)cols;  \
+\
+/* Set alpha_ & beta_ */ \
+    assign_scalar_eig2mkl(alpha_, alpha); \
+    assign_scalar_eig2mkl(beta_, myone); \
+\
+/* Set lda, ldb, ldc */ \
+    lda = (MKL_INT)rhsStride; \
+    ldb = (MKL_INT)lhsStride; \
+    ldc = (MKL_INT)resStride; \
+\
+/* Set a, b, c */ \
+    if (RhsStorageOrder==RowMajor) uplo='U'; \
+    a = _rhs; \
+\
+    if (LhsStorageOrder==RowMajor) { \
+      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(rhsStride)); \
+      b_tmp = lhs.adjoint(); \
+      b = b_tmp.data(); \
+      ldb = b_tmp.outerStride(); \
+    } else b = _lhs; \
+\
+    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
+\
+  } \
+};
+
+
+#define EIGEN_MKL_HEMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \
+{\
+  static void run( \
+    Index rows, Index cols, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha) \
+  { \
+    char side='R', uplo='L'; \
+    MKL_INT m, n, lda, ldb, ldc; \
+    const EIGTYPE *a, *b; \
+    MKLTYPE alpha_, beta_; \
+    MatrixX##EIGPREFIX b_tmp; \
+    Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> a_tmp; \
+    EIGTYPE myone(1); \
+\
+/* Set m, n, k */ \
+    m = (MKL_INT)rows; \
+    n = (MKL_INT)cols; \
+\
+/* Set alpha_ & beta_ */ \
+    assign_scalar_eig2mkl(alpha_, alpha); \
+    assign_scalar_eig2mkl(beta_, myone); \
+\
+/* Set lda, ldb, ldc */ \
+    lda = (MKL_INT)rhsStride; \
+    ldb = (MKL_INT)lhsStride; \
+    ldc = (MKL_INT)resStride; \
+\
+/* Set a, b, c */ \
+    if (((RhsStorageOrder==ColMajor) && ConjugateRhs) || ((RhsStorageOrder==RowMajor) && (!ConjugateRhs))) { \
+      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder>, 0, OuterStride<> > rhs(_rhs,n,n,OuterStride<>(rhsStride)); \
+      a_tmp = rhs.conjugate(); \
+      a = a_tmp.data(); \
+      lda = a_tmp.outerStride(); \
+    } else a = _rhs; \
+    if (RhsStorageOrder==RowMajor) uplo='U'; \
+\
+    if (LhsStorageOrder==ColMajor && (!ConjugateLhs)) { \
+       b = _lhs; } \
+    else { \
+      if (LhsStorageOrder==ColMajor && ConjugateLhs) { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,n,OuterStride<>(lhsStride)); \
+        b_tmp = lhs.conjugate(); \
+      } else \
+      if (ConjugateLhs) { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
+        b_tmp = lhs.adjoint(); \
+      } else { \
+        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
+        b_tmp = lhs.transpose(); \
+      } \
+      b = b_tmp.data(); \
+      ldb = b_tmp.outerStride(); \
+    } \
+\
+    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
+  } \
+};
+
+EIGEN_MKL_SYMM_R(double, double, d, d)
+EIGEN_MKL_SYMM_R(float, float, f, s)
+EIGEN_MKL_HEMM_R(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_HEMM_R(scomplex, MKL_Complex8, cf, c)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector.h
new file mode 100644
index 0000000..969ae65
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector.h
@@ -0,0 +1,281 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_H
+#define EIGEN_SELFADJOINT_MATRIX_VECTOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/* Optimized selfadjoint matrix * vector product:
+ * This algorithm processes 2 columns at onces that allows to both reduce
+ * the number of load/stores of the result by a factor 2 and to reduce
+ * the instruction dependency.
+ */
+
+template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version=Specialized>
+struct selfadjoint_matrix_vector_product;
+
+template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
+struct selfadjoint_matrix_vector_product
+
+{
+static EIGEN_DONT_INLINE void run(
+  Index size,
+  const Scalar*  lhs, Index lhsStride,
+  const Scalar* _rhs, Index rhsIncr,
+  Scalar* res,
+  Scalar alpha);
+};
+
+template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
+EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
+  Index size,
+  const Scalar*  lhs, Index lhsStride,
+  const Scalar* _rhs, Index rhsIncr,
+  Scalar* res,
+  Scalar alpha)
+{
+  typedef typename packet_traits<Scalar>::type Packet;
+  const Index PacketSize = sizeof(Packet)/sizeof(Scalar);
+
+  enum {
+    IsRowMajor = StorageOrder==RowMajor ? 1 : 0,
+    IsLower = UpLo == Lower ? 1 : 0,
+    FirstTriangular = IsRowMajor == IsLower
+  };
+
+  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs,  IsRowMajor), ConjugateRhs> cj0;
+  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> cj1;
+  conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex, ConjugateRhs> cjd;
+
+  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs,  IsRowMajor), ConjugateRhs> pcj0;
+  conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> pcj1;
+
+  Scalar cjAlpha = ConjugateRhs ? conj(alpha) : alpha;
+
+  // FIXME this copy is now handled outside product_selfadjoint_vector, so it could probably be removed.
+  // if the rhs is not sequentially stored in memory we copy it to a temporary buffer,
+  // this is because we need to extract packets
+  ei_declare_aligned_stack_constructed_variable(Scalar,rhs,size,rhsIncr==1 ? const_cast<Scalar*>(_rhs) : 0);  
+  if (rhsIncr!=1)
+  {
+    const Scalar* it = _rhs;
+    for (Index i=0; i<size; ++i, it+=rhsIncr)
+      rhs[i] = *it;
+  }
+
+  Index bound = (std::max)(Index(0),size-8) & 0xfffffffe;
+  if (FirstTriangular)
+    bound = size - bound;
+
+  for (Index j=FirstTriangular ? bound : 0;
+       j<(FirstTriangular ? size : bound);j+=2)
+  {
+    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
+    const Scalar* EIGEN_RESTRICT A1 = lhs + (j+1)*lhsStride;
+
+    Scalar t0 = cjAlpha * rhs[j];
+    Packet ptmp0 = pset1<Packet>(t0);
+    Scalar t1 = cjAlpha * rhs[j+1];
+    Packet ptmp1 = pset1<Packet>(t1);
+
+    Scalar t2(0);
+    Packet ptmp2 = pset1<Packet>(t2);
+    Scalar t3(0);
+    Packet ptmp3 = pset1<Packet>(t3);
+
+    size_t starti = FirstTriangular ? 0 : j+2;
+    size_t endi   = FirstTriangular ? j : size;
+    size_t alignedStart = (starti) + internal::first_aligned(&res[starti], endi-starti);
+    size_t alignedEnd = alignedStart + ((endi-alignedStart)/(PacketSize))*(PacketSize);
+
+    // TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed
+    res[j]   += cjd.pmul(internal::real(A0[j]), t0);
+    res[j+1] += cjd.pmul(internal::real(A1[j+1]), t1);
+    if(FirstTriangular)
+    {
+      res[j]   += cj0.pmul(A1[j],   t1);
+      t3       += cj1.pmul(A1[j],   rhs[j]);
+    }
+    else
+    {
+      res[j+1] += cj0.pmul(A0[j+1],t0);
+      t2 += cj1.pmul(A0[j+1], rhs[j+1]);
+    }
+
+    for (size_t i=starti; i<alignedStart; ++i)
+    {
+      res[i] += t0 * A0[i] + t1 * A1[i];
+      t2 += conj(A0[i]) * rhs[i];
+      t3 += conj(A1[i]) * rhs[i];
+    }
+    // Yes this an optimization for gcc 4.3 and 4.4 (=> huge speed up)
+    // gcc 4.2 does this optimization automatically.
+    const Scalar* EIGEN_RESTRICT a0It  = A0  + alignedStart;
+    const Scalar* EIGEN_RESTRICT a1It  = A1  + alignedStart;
+    const Scalar* EIGEN_RESTRICT rhsIt = rhs + alignedStart;
+          Scalar* EIGEN_RESTRICT resIt = res + alignedStart;
+    for (size_t i=alignedStart; i<alignedEnd; i+=PacketSize)
+    {
+      Packet A0i = ploadu<Packet>(a0It);  a0It  += PacketSize;
+      Packet A1i = ploadu<Packet>(a1It);  a1It  += PacketSize;
+      Packet Bi  = ploadu<Packet>(rhsIt); rhsIt += PacketSize; // FIXME should be aligned in most cases
+      Packet Xi  = pload <Packet>(resIt);
+
+      Xi    = pcj0.pmadd(A0i,ptmp0, pcj0.pmadd(A1i,ptmp1,Xi));
+      ptmp2 = pcj1.pmadd(A0i,  Bi, ptmp2);
+      ptmp3 = pcj1.pmadd(A1i,  Bi, ptmp3);
+      pstore(resIt,Xi); resIt += PacketSize;
+    }
+    for (size_t i=alignedEnd; i<endi; i++)
+    {
+      res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i],t1);
+      t2 += cj1.pmul(A0[i], rhs[i]);
+      t3 += cj1.pmul(A1[i], rhs[i]);
+    }
+
+    res[j]   += alpha * (t2 + predux(ptmp2));
+    res[j+1] += alpha * (t3 + predux(ptmp3));
+  }
+  for (Index j=FirstTriangular ? 0 : bound;j<(FirstTriangular ? bound : size);j++)
+  {
+    const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
+
+    Scalar t1 = cjAlpha * rhs[j];
+    Scalar t2(0);
+    // TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed
+    res[j] += cjd.pmul(internal::real(A0[j]), t1);
+    for (Index i=FirstTriangular ? 0 : j+1; i<(FirstTriangular ? j : size); i++)
+    {
+      res[i] += cj0.pmul(A0[i], t1);
+      t2 += cj1.pmul(A0[i], rhs[i]);
+    }
+    res[j] += alpha * t2;
+  }
+}
+
+} // end namespace internal 
+
+/***************************************************************************
+* Wrapper to product_selfadjoint_vector
+***************************************************************************/
+
+namespace internal {
+template<typename Lhs, int LhsMode, typename Rhs>
+struct traits<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true> >
+  : traits<ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs> >
+{};
+}
+
+template<typename Lhs, int LhsMode, typename Rhs>
+struct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>
+  : public ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)
+
+  enum {
+    LhsUpLo = LhsMode&(Upper|Lower)
+  };
+
+  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+  {
+    typedef typename Dest::Scalar ResScalar;
+    typedef typename Base::RhsScalar RhsScalar;
+    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;
+    
+    eigen_assert(dest.rows()==m_lhs.rows() && dest.cols()==m_rhs.cols());
+
+    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);
+    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);
+
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)
+                               * RhsBlasTraits::extractScalarFactor(m_rhs);
+
+    enum {
+      EvalToDest = (Dest::InnerStrideAtCompileTime==1),
+      UseRhs = (_ActualRhsType::InnerStrideAtCompileTime==1)
+    };
+    
+    internal::gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,!EvalToDest> static_dest;
+    internal::gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!UseRhs> static_rhs;
+
+    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+                                                  EvalToDest ? dest.data() : static_dest.data());
+                                                  
+    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,rhs.size(),
+        UseRhs ? const_cast<RhsScalar*>(rhs.data()) : static_rhs.data());
+    
+    if(!EvalToDest)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      int size = dest.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      MappedDest(actualDestPtr, dest.size()) = dest;
+    }
+      
+    if(!UseRhs)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      int size = rhs.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, rhs.size()) = rhs;
+    }
+      
+      
+    internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
+      (
+        lhs.rows(),                             // size
+        &lhs.coeffRef(0,0),  lhs.outerStride(), // lhs info
+        actualRhsPtr, 1,                        // rhs info
+        actualDestPtr,                          // result info
+        actualAlpha                             // scale factor
+      );
+    
+    if(!EvalToDest)
+      dest = MappedDest(actualDestPtr, dest.size());
+  }
+};
+
+namespace internal {
+template<typename Lhs, typename Rhs, int RhsMode>
+struct traits<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false> >
+  : traits<ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs> >
+{};
+}
+
+template<typename Lhs, typename Rhs, int RhsMode>
+struct SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>
+  : public ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)
+
+  enum {
+    RhsUpLo = RhsMode&(Upper|Lower)
+  };
+
+  SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+  {
+    // let's simply transpose the product
+    Transpose<Dest> destT(dest);
+    SelfadjointProductMatrix<Transpose<const Rhs>, int(RhsUpLo)==Upper ? Lower : Upper, false,
+                             Transpose<const Lhs>, 0, true>(m_rhs.transpose(), m_lhs.transpose()).scaleAndAddTo(destT, alpha);
+  }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h
new file mode 100644
index 0000000..86684b6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointMatrixVector_MKL.h
@@ -0,0 +1,114 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Selfadjoint matrix-vector product functionality based on ?SYMV/HEMV.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
+#define EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/**********************************************************************
+* This file implements selfadjoint matrix-vector multiplication using BLAS
+**********************************************************************/
+
+// symv/hemv specialization
+
+template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs>
+struct selfadjoint_matrix_vector_product_symv :
+  selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {};
+
+#define EIGEN_MKL_SYMV_SPECIALIZE(Scalar) \
+template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
+struct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \
+static void run( \
+  Index size, const Scalar*  lhs, Index lhsStride, \
+  const Scalar* _rhs, Index rhsIncr, Scalar* res, Scalar alpha) { \
+    enum {\
+      IsColMajor = StorageOrder==ColMajor \
+    }; \
+    if (IsColMajor == ConjugateLhs) {\
+      selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn>::run( \
+        size, lhs, lhsStride, _rhs, rhsIncr, res, alpha);  \
+    } else {\
+      selfadjoint_matrix_vector_product_symv<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs>::run( \
+        size, lhs, lhsStride, _rhs, rhsIncr, res, alpha);  \
+    }\
+  } \
+}; \
+
+EIGEN_MKL_SYMV_SPECIALIZE(double)
+EIGEN_MKL_SYMV_SPECIALIZE(float)
+EIGEN_MKL_SYMV_SPECIALIZE(dcomplex)
+EIGEN_MKL_SYMV_SPECIALIZE(scomplex)
+
+#define EIGEN_MKL_SYMV_SPECIALIZATION(EIGTYPE,MKLTYPE,MKLFUNC) \
+template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
+struct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \
+{ \
+typedef Matrix<EIGTYPE,Dynamic,1,ColMajor> SYMVVector;\
+\
+static void run( \
+Index size, const EIGTYPE*  lhs, Index lhsStride, \
+const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* res, EIGTYPE alpha) \
+{ \
+  enum {\
+    IsRowMajor = StorageOrder==RowMajor ? 1 : 0, \
+    IsLower = UpLo == Lower ? 1 : 0 \
+  }; \
+  MKL_INT n=size, lda=lhsStride, incx=rhsIncr, incy=1; \
+  MKLTYPE alpha_, beta_; \
+  const EIGTYPE *x_ptr, myone(1); \
+  char uplo=(IsRowMajor) ? (IsLower ? 'U' : 'L') : (IsLower ? 'L' : 'U'); \
+  assign_scalar_eig2mkl(alpha_, alpha); \
+  assign_scalar_eig2mkl(beta_, myone); \
+  SYMVVector x_tmp; \
+  if (ConjugateRhs) { \
+    Map<const SYMVVector, 0, InnerStride<> > map_x(_rhs,size,1,InnerStride<>(incx)); \
+    x_tmp=map_x.conjugate(); \
+    x_ptr=x_tmp.data(); \
+    incx=1; \
+  } else x_ptr=_rhs; \
+  MKLFUNC(&uplo, &n, &alpha_, (const MKLTYPE*)lhs, &lda, (const MKLTYPE*)x_ptr, &incx, &beta_, (MKLTYPE*)res, &incy); \
+}\
+};
+
+EIGEN_MKL_SYMV_SPECIALIZATION(double,   double,        dsymv)
+EIGEN_MKL_SYMV_SPECIALIZATION(float,    float,         ssymv)
+EIGEN_MKL_SYMV_SPECIALIZATION(dcomplex, MKL_Complex16, zhemv)
+EIGEN_MKL_SYMV_SPECIALIZATION(scomplex, MKL_Complex8,  chemv)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointProduct.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointProduct.h
new file mode 100644
index 0000000..6ca4ae6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointProduct.h
@@ -0,0 +1,123 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINT_PRODUCT_H
+#define EIGEN_SELFADJOINT_PRODUCT_H
+
+/**********************************************************************
+* This file implements a self adjoint product: C += A A^T updating only
+* half of the selfadjoint matrix C.
+* It corresponds to the level 3 SYRK and level 2 SYR Blas routines.
+**********************************************************************/
+
+namespace Eigen { 
+
+
+template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
+struct selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo,ConjLhs,ConjRhs>
+{
+  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)
+  {
+    internal::conj_if<ConjRhs> cj;
+    typedef Map<const Matrix<Scalar,Dynamic,1> > OtherMap;
+    typedef typename internal::conditional<ConjLhs,typename OtherMap::ConjugateReturnType,const OtherMap&>::type ConjLhsType;
+    for (Index i=0; i<size; ++i)
+    {
+      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+(UpLo==Lower ? i : 0), (UpLo==Lower ? size-i : (i+1)))
+          += (alpha * cj(vecY[i])) * ConjLhsType(OtherMap(vecX+(UpLo==Lower ? i : 0),UpLo==Lower ? size-i : (i+1)));
+    }
+  }
+};
+
+template<typename Scalar, typename Index, int UpLo, bool ConjLhs, bool ConjRhs>
+struct selfadjoint_rank1_update<Scalar,Index,RowMajor,UpLo,ConjLhs,ConjRhs>
+{
+  static void run(Index size, Scalar* mat, Index stride, const Scalar* vecX, const Scalar* vecY, const Scalar& alpha)
+  {
+    selfadjoint_rank1_update<Scalar,Index,ColMajor,UpLo==Lower?Upper:Lower,ConjRhs,ConjLhs>::run(size,mat,stride,vecY,vecX,alpha);
+  }
+};
+
+template<typename MatrixType, typename OtherType, int UpLo, bool OtherIsVector = OtherType::IsVectorAtCompileTime>
+struct selfadjoint_product_selector;
+
+template<typename MatrixType, typename OtherType, int UpLo>
+struct selfadjoint_product_selector<MatrixType,OtherType,UpLo,true>
+{
+  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
+  {
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+    typedef internal::blas_traits<OtherType> OtherBlasTraits;
+    typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
+    typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;
+    typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());
+
+    Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());
+
+    enum {
+      StorageOrder = (internal::traits<MatrixType>::Flags&RowMajorBit) ? RowMajor : ColMajor,
+      UseOtherDirectly = _ActualOtherType::InnerStrideAtCompileTime==1
+    };
+    internal::gemv_static_vector_if<Scalar,OtherType::SizeAtCompileTime,OtherType::MaxSizeAtCompileTime,!UseOtherDirectly> static_other;
+
+    ei_declare_aligned_stack_constructed_variable(Scalar, actualOtherPtr, other.size(),
+      (UseOtherDirectly ? const_cast<Scalar*>(actualOther.data()) : static_other.data()));
+      
+    if(!UseOtherDirectly)
+      Map<typename _ActualOtherType::PlainObject>(actualOtherPtr, actualOther.size()) = actualOther;
+    
+    selfadjoint_rank1_update<Scalar,Index,StorageOrder,UpLo,
+                              OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,
+                            (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex>
+          ::run(other.size(), mat.data(), mat.outerStride(), actualOtherPtr, actualOtherPtr, actualAlpha);
+  }
+};
+
+template<typename MatrixType, typename OtherType, int UpLo>
+struct selfadjoint_product_selector<MatrixType,OtherType,UpLo,false>
+{
+  static void run(MatrixType& mat, const OtherType& other, const typename MatrixType::Scalar& alpha)
+  {
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+    typedef internal::blas_traits<OtherType> OtherBlasTraits;
+    typedef typename OtherBlasTraits::DirectLinearAccessType ActualOtherType;
+    typedef typename internal::remove_all<ActualOtherType>::type _ActualOtherType;
+    typename internal::add_const_on_value_type<ActualOtherType>::type actualOther = OtherBlasTraits::extract(other.derived());
+
+    Scalar actualAlpha = alpha * OtherBlasTraits::extractScalarFactor(other.derived());
+
+    enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
+
+    internal::general_matrix_matrix_triangular_product<Index,
+      Scalar, _ActualOtherType::Flags&RowMajorBit ? RowMajor : ColMajor,   OtherBlasTraits::NeedToConjugate  && NumTraits<Scalar>::IsComplex,
+      Scalar, _ActualOtherType::Flags&RowMajorBit ? ColMajor : RowMajor, (!OtherBlasTraits::NeedToConjugate) && NumTraits<Scalar>::IsComplex,
+      MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor, UpLo>
+      ::run(mat.cols(), actualOther.cols(),
+            &actualOther.coeffRef(0,0), actualOther.outerStride(), &actualOther.coeffRef(0,0), actualOther.outerStride(),
+            mat.data(), mat.outerStride(), actualAlpha);
+  }
+};
+
+// high level API
+
+template<typename MatrixType, unsigned int UpLo>
+template<typename DerivedU>
+SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
+::rankUpdate(const MatrixBase<DerivedU>& u, const Scalar& alpha)
+{
+  selfadjoint_product_selector<MatrixType,DerivedU,UpLo>::run(_expression().const_cast_derived(), u.derived(), alpha);
+
+  return *this;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINT_PRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointRank2Update.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointRank2Update.h
new file mode 100644
index 0000000..4b57f18
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/SelfadjointRank2Update.h
@@ -0,0 +1,93 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINTRANK2UPTADE_H
+#define EIGEN_SELFADJOINTRANK2UPTADE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/* Optimized selfadjoint matrix += alpha * uv' + conj(alpha)*vu'
+ * It corresponds to the Level2 syr2 BLAS routine
+ */
+
+template<typename Scalar, typename Index, typename UType, typename VType, int UpLo>
+struct selfadjoint_rank2_update_selector;
+
+template<typename Scalar, typename Index, typename UType, typename VType>
+struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Lower>
+{
+  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)
+  {
+    const Index size = u.size();
+    for (Index i=0; i<size; ++i)
+    {
+      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i+i, size-i) +=
+                        (conj(alpha)  * conj(u.coeff(i))) * v.tail(size-i)
+                      + (alpha * conj(v.coeff(i))) * u.tail(size-i);
+    }
+  }
+};
+
+template<typename Scalar, typename Index, typename UType, typename VType>
+struct selfadjoint_rank2_update_selector<Scalar,Index,UType,VType,Upper>
+{
+  static void run(Scalar* mat, Index stride, const UType& u, const VType& v, const Scalar& alpha)
+  {
+    const Index size = u.size();
+    for (Index i=0; i<size; ++i)
+      Map<Matrix<Scalar,Dynamic,1> >(mat+stride*i, i+1) +=
+                        (conj(alpha)  * conj(u.coeff(i))) * v.head(i+1)
+                      + (alpha * conj(v.coeff(i))) * u.head(i+1);
+  }
+};
+
+template<bool Cond, typename T> struct conj_expr_if
+  : conditional<!Cond, const T&,
+      CwiseUnaryOp<scalar_conjugate_op<typename traits<T>::Scalar>,T> > {};
+
+} // end namespace internal
+
+template<typename MatrixType, unsigned int UpLo>
+template<typename DerivedU, typename DerivedV>
+SelfAdjointView<MatrixType,UpLo>& SelfAdjointView<MatrixType,UpLo>
+::rankUpdate(const MatrixBase<DerivedU>& u, const MatrixBase<DerivedV>& v, const Scalar& alpha)
+{
+  typedef internal::blas_traits<DerivedU> UBlasTraits;
+  typedef typename UBlasTraits::DirectLinearAccessType ActualUType;
+  typedef typename internal::remove_all<ActualUType>::type _ActualUType;
+  typename internal::add_const_on_value_type<ActualUType>::type actualU = UBlasTraits::extract(u.derived());
+
+  typedef internal::blas_traits<DerivedV> VBlasTraits;
+  typedef typename VBlasTraits::DirectLinearAccessType ActualVType;
+  typedef typename internal::remove_all<ActualVType>::type _ActualVType;
+  typename internal::add_const_on_value_type<ActualVType>::type actualV = VBlasTraits::extract(v.derived());
+
+  // If MatrixType is row major, then we use the routine for lower triangular in the upper triangular case and
+  // vice versa, and take the complex conjugate of all coefficients and vector entries.
+
+  enum { IsRowMajor = (internal::traits<MatrixType>::Flags&RowMajorBit) ? 1 : 0 };
+  Scalar actualAlpha = alpha * UBlasTraits::extractScalarFactor(u.derived())
+                             * internal::conj(VBlasTraits::extractScalarFactor(v.derived()));
+  if (IsRowMajor)
+    actualAlpha = internal::conj(actualAlpha);
+
+  internal::selfadjoint_rank2_update_selector<Scalar, Index,
+    typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ UBlasTraits::NeedToConjugate,_ActualUType>::type>::type,
+    typename internal::remove_all<typename internal::conj_expr_if<IsRowMajor ^ VBlasTraits::NeedToConjugate,_ActualVType>::type>::type,
+    (IsRowMajor ? int(UpLo==Upper ? Lower : Upper) : UpLo)>
+    ::run(_expression().const_cast_derived().data(),_expression().outerStride(),actualU,actualV,actualAlpha);
+
+  return *this;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINTRANK2UPTADE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix.h
new file mode 100644
index 0000000..8110507
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix.h
@@ -0,0 +1,427 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_H
+#define EIGEN_TRIANGULAR_MATRIX_MATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// template<typename Scalar, int mr, int StorageOrder, bool Conjugate, int Mode>
+// struct gemm_pack_lhs_triangular
+// {
+//   Matrix<Scalar,mr,mr,
+//   void operator()(Scalar* blockA, const EIGEN_RESTRICT Scalar* _lhs, int lhsStride, int depth, int rows)
+//   {
+//     conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
+//     const_blas_data_mapper<Scalar, StorageOrder> lhs(_lhs,lhsStride);
+//     int count = 0;
+//     const int peeled_mc = (rows/mr)*mr;
+//     for(int i=0; i<peeled_mc; i+=mr)
+//     {
+//       for(int k=0; k<depth; k++)
+//         for(int w=0; w<mr; w++)
+//           blockA[count++] = cj(lhs(i+w, k));
+//     }
+//     for(int i=peeled_mc; i<rows; i++)
+//     {
+//       for(int k=0; k<depth; k++)
+//         blockA[count++] = cj(lhs(i, k));
+//     }
+//   }
+// };
+
+/* Optimized triangular matrix * matrix (_TRMM++) product built on top of
+ * the general matrix matrix product.
+ */
+template <typename Scalar, typename Index,
+          int Mode, bool LhsIsTriangular,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs,
+          int ResStorageOrder, int Version = Specialized>
+struct product_triangular_matrix_matrix;
+
+template <typename Scalar, typename Index,
+          int Mode, bool LhsIsTriangular,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int Version>
+struct product_triangular_matrix_matrix<Scalar,Index,Mode,LhsIsTriangular,
+                                           LhsStorageOrder,ConjugateLhs,
+                                           RhsStorageOrder,ConjugateRhs,RowMajor,Version>
+{
+  static EIGEN_STRONG_INLINE void run(
+    Index rows, Index cols, Index depth,
+    const Scalar* lhs, Index lhsStride,
+    const Scalar* rhs, Index rhsStride,
+    Scalar* res,       Index resStride,
+    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
+  {
+    product_triangular_matrix_matrix<Scalar, Index,
+      (Mode&(UnitDiag|ZeroDiag)) | ((Mode&Upper) ? Lower : Upper),
+      (!LhsIsTriangular),
+      RhsStorageOrder==RowMajor ? ColMajor : RowMajor,
+      ConjugateRhs,
+      LhsStorageOrder==RowMajor ? ColMajor : RowMajor,
+      ConjugateLhs,
+      ColMajor>
+      ::run(cols, rows, depth, rhs, rhsStride, lhs, lhsStride, res, resStride, alpha, blocking);
+  }
+};
+
+// implements col-major += alpha * op(triangular) * op(general)
+template <typename Scalar, typename Index, int Mode,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int Version>
+struct product_triangular_matrix_matrix<Scalar,Index,Mode,true,
+                                           LhsStorageOrder,ConjugateLhs,
+                                           RhsStorageOrder,ConjugateRhs,ColMajor,Version>
+{
+  
+  typedef gebp_traits<Scalar,Scalar> Traits;
+  enum {
+    SmallPanelWidth   = 2 * EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
+    IsLower = (Mode&Lower) == Lower,
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1
+  };
+
+  static EIGEN_DONT_INLINE void run(
+    Index _rows, Index _cols, Index _depth,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+};
+
+template <typename Scalar, typename Index, int Mode,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int Version>
+EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,true,
+                                                        LhsStorageOrder,ConjugateLhs,
+                                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>::run(
+    Index _rows, Index _cols, Index _depth,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
+  {
+    // strip zeros
+    Index diagSize  = (std::min)(_rows,_depth);
+    Index rows      = IsLower ? _rows : diagSize;
+    Index depth     = IsLower ? diagSize : _depth;
+    Index cols      = _cols;
+    
+    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);
+
+    Index kc = blocking.kc();                   // cache block size along the K direction
+    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
+
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeB = kc*cols;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
+
+    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,LhsStorageOrder> triangularBuffer;
+    triangularBuffer.setZero();
+    if((Mode&ZeroDiag)==ZeroDiag)
+      triangularBuffer.diagonal().setZero();
+    else
+      triangularBuffer.diagonal().setOnes();
+
+    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+
+    for(Index k2=IsLower ? depth : 0;
+        IsLower ? k2>0 : k2<depth;
+        IsLower ? k2-=kc : k2+=kc)
+    {
+      Index actual_kc = (std::min)(IsLower ? k2 : depth-k2, kc);
+      Index actual_k2 = IsLower ? k2-actual_kc : k2;
+
+      // align blocks with the end of the triangular part for trapezoidal lhs
+      if((!IsLower)&&(k2<rows)&&(k2+actual_kc>rows))
+      {
+        actual_kc = rows-k2;
+        k2 = k2+actual_kc-kc;
+      }
+
+      pack_rhs(blockB, &rhs(actual_k2,0), rhsStride, actual_kc, cols);
+
+      // the selected lhs's panel has to be split in three different parts:
+      //  1 - the part which is zero => skip it
+      //  2 - the diagonal block => special kernel
+      //  3 - the dense panel below (lower case) or above (upper case) the diagonal block => GEPP
+
+      // the block diagonal, if any:
+      if(IsLower || actual_k2<rows)
+      {
+        // for each small vertical panels of lhs
+        for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)
+        {
+          Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);
+          Index lengthTarget = IsLower ? actual_kc-k1-actualPanelWidth : k1;
+          Index startBlock   = actual_k2+k1;
+          Index blockBOffset = k1;
+
+          // => GEBP with the micro triangular block
+          // The trick is to pack this micro block while filling the opposite triangular part with zeros.
+          // To this end we do an extra triangular copy to a small temporary buffer
+          for (Index k=0;k<actualPanelWidth;++k)
+          {
+            if (SetDiag)
+              triangularBuffer.coeffRef(k,k) = lhs(startBlock+k,startBlock+k);
+            for (Index i=IsLower ? k+1 : 0; IsLower ? i<actualPanelWidth : i<k; ++i)
+              triangularBuffer.coeffRef(i,k) = lhs(startBlock+i,startBlock+k);
+          }
+          pack_lhs(blockA, triangularBuffer.data(), triangularBuffer.outerStride(), actualPanelWidth, actualPanelWidth);
+
+          gebp_kernel(res+startBlock, resStride, blockA, blockB, actualPanelWidth, actualPanelWidth, cols, alpha,
+                      actualPanelWidth, actual_kc, 0, blockBOffset, blockW);
+
+          // GEBP with remaining micro panel
+          if (lengthTarget>0)
+          {
+            Index startTarget  = IsLower ? actual_k2+k1+actualPanelWidth : actual_k2;
+
+            pack_lhs(blockA, &lhs(startTarget,startBlock), lhsStride, actualPanelWidth, lengthTarget);
+
+            gebp_kernel(res+startTarget, resStride, blockA, blockB, lengthTarget, actualPanelWidth, cols, alpha,
+                        actualPanelWidth, actual_kc, 0, blockBOffset, blockW);
+          }
+        }
+      }
+      // the part below (lower case) or above (upper case) the diagonal => GEPP
+      {
+        Index start = IsLower ? k2 : 0;
+        Index end   = IsLower ? rows : (std::min)(actual_k2,rows);
+        for(Index i2=start; i2<end; i2+=mc)
+        {
+          const Index actual_mc = (std::min)(i2+mc,end)-i2;
+          gemm_pack_lhs<Scalar, Index, Traits::mr,Traits::LhsProgress, LhsStorageOrder,false>()
+            (blockA, &lhs(i2, actual_k2), lhsStride, actual_kc, actual_mc);
+
+          gebp_kernel(res+i2, resStride, blockA, blockB, actual_mc, actual_kc, cols, alpha, -1, -1, 0, 0, blockW);
+        }
+      }
+    }
+  }
+
+// implements col-major += alpha * op(general) * op(triangular)
+template <typename Scalar, typename Index, int Mode,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int Version>
+struct product_triangular_matrix_matrix<Scalar,Index,Mode,false,
+                                        LhsStorageOrder,ConjugateLhs,
+                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>
+{
+  typedef gebp_traits<Scalar,Scalar> Traits;
+  enum {
+    SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
+    IsLower = (Mode&Lower) == Lower,
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1
+  };
+
+  static EIGEN_DONT_INLINE void run(
+    Index _rows, Index _cols, Index _depth,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking);
+};
+
+template <typename Scalar, typename Index, int Mode,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs, int Version>
+EIGEN_DONT_INLINE void product_triangular_matrix_matrix<Scalar,Index,Mode,false,
+                                                        LhsStorageOrder,ConjugateLhs,
+                                                        RhsStorageOrder,ConjugateRhs,ColMajor,Version>::run(
+    Index _rows, Index _cols, Index _depth,
+    const Scalar* _lhs, Index lhsStride,
+    const Scalar* _rhs, Index rhsStride,
+    Scalar* res,        Index resStride,
+    const Scalar& alpha, level3_blocking<Scalar,Scalar>& blocking)
+  {
+    // strip zeros
+    Index diagSize  = (std::min)(_cols,_depth);
+    Index rows      = _rows;
+    Index depth     = IsLower ? _depth : diagSize;
+    Index cols      = IsLower ? diagSize : _cols;
+    
+    const_blas_data_mapper<Scalar, Index, LhsStorageOrder> lhs(_lhs,lhsStride);
+    const_blas_data_mapper<Scalar, Index, RhsStorageOrder> rhs(_rhs,rhsStride);
+
+    Index kc = blocking.kc();                   // cache block size along the K direction
+    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
+
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeB = kc*cols;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
+
+    Matrix<Scalar,SmallPanelWidth,SmallPanelWidth,RhsStorageOrder> triangularBuffer;
+    triangularBuffer.setZero();
+    if((Mode&ZeroDiag)==ZeroDiag)
+      triangularBuffer.diagonal().setZero();
+    else
+      triangularBuffer.diagonal().setOnes();
+
+    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, ConjugateLhs, ConjugateRhs> gebp_kernel;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, LhsStorageOrder> pack_lhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;
+
+    for(Index k2=IsLower ? 0 : depth;
+        IsLower ? k2<depth  : k2>0;
+        IsLower ? k2+=kc   : k2-=kc)
+    {
+      Index actual_kc = (std::min)(IsLower ? depth-k2 : k2, kc);
+      Index actual_k2 = IsLower ? k2 : k2-actual_kc;
+
+      // align blocks with the end of the triangular part for trapezoidal rhs
+      if(IsLower && (k2<cols) && (actual_k2+actual_kc>cols))
+      {
+        actual_kc = cols-k2;
+        k2 = actual_k2 + actual_kc - kc;
+      }
+
+      // remaining size
+      Index rs = IsLower ? (std::min)(cols,actual_k2) : cols - k2;
+      // size of the triangular part
+      Index ts = (IsLower && actual_k2>=cols) ? 0 : actual_kc;
+
+      Scalar* geb = blockB+ts*ts;
+
+      pack_rhs(geb, &rhs(actual_k2,IsLower ? 0 : k2), rhsStride, actual_kc, rs);
+
+      // pack the triangular part of the rhs padding the unrolled blocks with zeros
+      if(ts>0)
+      {
+        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
+        {
+          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
+          Index actual_j2 = actual_k2 + j2;
+          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
+          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;
+          // general part
+          pack_rhs_panel(blockB+j2*actual_kc,
+                         &rhs(actual_k2+panelOffset, actual_j2), rhsStride,
+                         panelLength, actualPanelWidth,
+                         actual_kc, panelOffset);
+
+          // append the triangular part via a temporary buffer
+          for (Index j=0;j<actualPanelWidth;++j)
+          {
+            if (SetDiag)
+              triangularBuffer.coeffRef(j,j) = rhs(actual_j2+j,actual_j2+j);
+            for (Index k=IsLower ? j+1 : 0; IsLower ? k<actualPanelWidth : k<j; ++k)
+              triangularBuffer.coeffRef(k,j) = rhs(actual_j2+k,actual_j2+j);
+          }
+
+          pack_rhs_panel(blockB+j2*actual_kc,
+                         triangularBuffer.data(), triangularBuffer.outerStride(),
+                         actualPanelWidth, actualPanelWidth,
+                         actual_kc, j2);
+        }
+      }
+
+      for (Index i2=0; i2<rows; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(mc,rows-i2);
+        pack_lhs(blockA, &lhs(i2, actual_k2), lhsStride, actual_kc, actual_mc);
+
+        // triangular kernel
+        if(ts>0)
+        {
+          for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
+          {
+            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
+            Index panelLength = IsLower ? actual_kc-j2 : j2+actualPanelWidth;
+            Index blockOffset = IsLower ? j2 : 0;
+
+            gebp_kernel(res+i2+(actual_k2+j2)*resStride, resStride,
+                        blockA, blockB+j2*actual_kc,
+                        actual_mc, panelLength, actualPanelWidth,
+                        alpha,
+                        actual_kc, actual_kc,  // strides
+                        blockOffset, blockOffset,// offsets
+                        blockW); // workspace
+          }
+        }
+        gebp_kernel(res+i2+(IsLower ? 0 : k2)*resStride, resStride,
+                    blockA, geb, actual_mc, actual_kc, rs,
+                    alpha,
+                    -1, -1, 0, 0, blockW);
+      }
+    }
+  }
+
+/***************************************************************************
+* Wrapper to product_triangular_matrix_matrix
+***************************************************************************/
+
+template<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
+struct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false> >
+  : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>, Lhs, Rhs> >
+{};
+
+} // end namespace internal
+
+template<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
+struct TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>
+  : public ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,false>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)
+
+  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+  {
+    typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);
+    typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);
+
+    Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)
+                               * RhsBlasTraits::extractScalarFactor(m_rhs);
+
+    typedef internal::gemm_blocking_space<(Dest::Flags&RowMajorBit) ? RowMajor : ColMajor,Scalar,Scalar,
+              Lhs::MaxRowsAtCompileTime, Rhs::MaxColsAtCompileTime, Lhs::MaxColsAtCompileTime,4> BlockingType;
+
+    enum { IsLower = (Mode&Lower) == Lower };
+    Index stripedRows  = ((!LhsIsTriangular) || (IsLower))  ? lhs.rows() : (std::min)(lhs.rows(),lhs.cols());
+    Index stripedCols  = ((LhsIsTriangular)  || (!IsLower)) ? rhs.cols() : (std::min)(rhs.cols(),rhs.rows());
+    Index stripedDepth = LhsIsTriangular ? ((!IsLower) ? lhs.cols() : (std::min)(lhs.cols(),lhs.rows()))
+                                         : ((IsLower)  ? rhs.rows() : (std::min)(rhs.rows(),rhs.cols()));
+
+    BlockingType blocking(stripedRows, stripedCols, stripedDepth);
+
+    internal::product_triangular_matrix_matrix<Scalar, Index,
+      Mode, LhsIsTriangular,
+      (internal::traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, LhsBlasTraits::NeedToConjugate,
+      (internal::traits<_ActualRhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, RhsBlasTraits::NeedToConjugate,
+      (internal::traits<Dest          >::Flags&RowMajorBit) ? RowMajor : ColMajor>
+      ::run(
+        stripedRows, stripedCols, stripedDepth,   // sizes
+        &lhs.coeffRef(0,0),    lhs.outerStride(), // lhs info
+        &rhs.coeffRef(0,0),    rhs.outerStride(), // rhs info
+        &dst.coeffRef(0,0), dst.outerStride(),    // result info
+        actualAlpha, blocking
+      );
+  }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h
new file mode 100644
index 0000000..ba41a1c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixMatrix_MKL.h
@@ -0,0 +1,309 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Triangular matrix * matrix product functionality based on ?TRMM.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
+#define EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+
+template <typename Scalar, typename Index,
+          int Mode, bool LhsIsTriangular,
+          int LhsStorageOrder, bool ConjugateLhs,
+          int RhsStorageOrder, bool ConjugateRhs,
+          int ResStorageOrder>
+struct product_triangular_matrix_matrix_trmm :
+       product_triangular_matrix_matrix<Scalar,Index,Mode,
+          LhsIsTriangular,LhsStorageOrder,ConjugateLhs,
+          RhsStorageOrder, ConjugateRhs, ResStorageOrder, BuiltIn> {};
+
+
+// try to go to BLAS specialization
+#define EIGEN_MKL_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \
+template <typename Index, int Mode, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_triangular_matrix_matrix<Scalar,Index, Mode, LhsIsTriangular, \
+           LhsStorageOrder,ConjugateLhs, RhsStorageOrder,ConjugateRhs,ColMajor,Specialized> { \
+  static inline void run(Index _rows, Index _cols, Index _depth, const Scalar* _lhs, Index lhsStride,\
+    const Scalar* _rhs, Index rhsStride, Scalar* res, Index resStride, Scalar alpha, level3_blocking<Scalar,Scalar>& blocking) { \
+      product_triangular_matrix_matrix_trmm<Scalar,Index,Mode, \
+        LhsIsTriangular,LhsStorageOrder,ConjugateLhs, \
+        RhsStorageOrder, ConjugateRhs, ColMajor>::run( \
+        _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
+  } \
+};
+
+EIGEN_MKL_TRMM_SPECIALIZE(double, true)
+EIGEN_MKL_TRMM_SPECIALIZE(double, false)
+EIGEN_MKL_TRMM_SPECIALIZE(dcomplex, true)
+EIGEN_MKL_TRMM_SPECIALIZE(dcomplex, false)
+EIGEN_MKL_TRMM_SPECIALIZE(float, true)
+EIGEN_MKL_TRMM_SPECIALIZE(float, false)
+EIGEN_MKL_TRMM_SPECIALIZE(scomplex, true)
+EIGEN_MKL_TRMM_SPECIALIZE(scomplex, false)
+
+// implements col-major += alpha * op(triangular) * op(general)
+#define EIGEN_MKL_TRMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, int Mode, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
+         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \
+{ \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    LowUp = IsLower ? Lower : Upper, \
+    conjA = ((LhsStorageOrder==ColMajor) && ConjugateLhs) ? 1 : 0 \
+  }; \
+\
+  static void run( \
+    Index _rows, Index _cols, Index _depth, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \
+  { \
+   Index diagSize  = (std::min)(_rows,_depth); \
+   Index rows      = IsLower ? _rows : diagSize; \
+   Index depth     = IsLower ? diagSize : _depth; \
+   Index cols      = _cols; \
+\
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
+\
+/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \
+   if (rows != depth) { \
+\
+     int nthr = mkl_domain_get_max_threads(MKL_BLAS); \
+\
+     if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \
+     /* Most likely no benefit to call TRMM or GEMM from MKL*/ \
+       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \
+       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
+           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
+     /*std::cout << "TRMM_L: A is not square! Go to Eigen TRMM implementation!\n";*/ \
+     } else { \
+     /* Make sense to call GEMM */ \
+       Map<const MatrixLhs, 0, OuterStride<> > lhsMap(_lhs,rows,depth,OuterStride<>(lhsStride)); \
+       MatrixLhs aa_tmp=lhsMap.template triangularView<Mode>(); \
+       MKL_INT aStride = aa_tmp.outerStride(); \
+       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth); \
+       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
+       rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, resStride, alpha, gemm_blocking, 0); \
+\
+     /*std::cout << "TRMM_L: A is not square! Go to MKL GEMM implementation! " << nthr<<" \n";*/ \
+     } \
+     return; \
+   } \
+   char side = 'L', transa, uplo, diag = 'N'; \
+   EIGTYPE *b; \
+   const EIGTYPE *a; \
+   MKL_INT m, n, lda, ldb; \
+   MKLTYPE alpha_; \
+\
+/* Set alpha_*/ \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
+\
+/* Set m, n */ \
+   m = (MKL_INT)diagSize; \
+   n = (MKL_INT)cols; \
+\
+/* Set trans */ \
+   transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
+\
+/* Set b, ldb */ \
+   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols,OuterStride<>(rhsStride)); \
+   MatrixX##EIGPREFIX b_tmp; \
+\
+   if (ConjugateRhs) b_tmp = rhs.conjugate(); else b_tmp = rhs; \
+   b = b_tmp.data(); \
+   ldb = b_tmp.outerStride(); \
+\
+/* Set uplo */ \
+   uplo = IsLower ? 'L' : 'U'; \
+   if (LhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
+/* Set a, lda */ \
+   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \
+   MatrixLhs a_tmp; \
+\
+   if ((conjA!=0) || (SetDiag==0)) { \
+     if (conjA) a_tmp = lhs.conjugate(); else a_tmp = lhs; \
+     if (IsZeroDiag) \
+       a_tmp.diagonal().setZero(); \
+     else if (IsUnitDiag) \
+       a_tmp.diagonal().setOnes();\
+     a = a_tmp.data(); \
+     lda = a_tmp.outerStride(); \
+   } else { \
+     a = _lhs; \
+     lda = lhsStride; \
+   } \
+   /*std::cout << "TRMM_L: A is square! Go to MKL TRMM implementation! \n";*/ \
+/* call ?trmm*/ \
+   MKLPREFIX##trmm(&side, &uplo, &transa, &diag, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (MKLTYPE*)b, &ldb); \
+\
+/* Add op(a_triangular)*b into res*/ \
+   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
+   res_tmp=res_tmp+b_tmp; \
+  } \
+};
+
+EIGEN_MKL_TRMM_L(double, double, d, d)
+EIGEN_MKL_TRMM_L(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_TRMM_L(float, float, f, s)
+EIGEN_MKL_TRMM_L(scomplex, MKL_Complex8, cf, c)
+
+// implements col-major += alpha * op(general) * op(triangular)
+#define EIGEN_MKL_TRMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template <typename Index, int Mode, \
+          int LhsStorageOrder, bool ConjugateLhs, \
+          int RhsStorageOrder, bool ConjugateRhs> \
+struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
+         LhsStorageOrder,ConjugateLhs,RhsStorageOrder,ConjugateRhs,ColMajor> \
+{ \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    LowUp = IsLower ? Lower : Upper, \
+    conjA = ((RhsStorageOrder==ColMajor) && ConjugateRhs) ? 1 : 0 \
+  }; \
+\
+  static void run( \
+    Index _rows, Index _cols, Index _depth, \
+    const EIGTYPE* _lhs, Index lhsStride, \
+    const EIGTYPE* _rhs, Index rhsStride, \
+    EIGTYPE* res,        Index resStride, \
+    EIGTYPE alpha, level3_blocking<EIGTYPE,EIGTYPE>& blocking) \
+  { \
+   Index diagSize  = (std::min)(_cols,_depth); \
+   Index rows      = _rows; \
+   Index depth     = IsLower ? _depth : diagSize; \
+   Index cols      = IsLower ? diagSize : _cols; \
+\
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
+\
+/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \
+   if (cols != depth) { \
+\
+     int nthr = mkl_domain_get_max_threads(MKL_BLAS); \
+\
+     if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \
+     /* Most likely no benefit to call TRMM or GEMM from MKL*/ \
+       product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \
+       LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
+           _rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
+       /*std::cout << "TRMM_R: A is not square! Go to Eigen TRMM implementation!\n";*/ \
+     } else { \
+     /* Make sense to call GEMM */ \
+       Map<const MatrixRhs, 0, OuterStride<> > rhsMap(_rhs,depth,cols, OuterStride<>(rhsStride)); \
+       MatrixRhs aa_tmp=rhsMap.template triangularView<Mode>(); \
+       MKL_INT aStride = aa_tmp.outerStride(); \
+       gemm_blocking_space<ColMajor,EIGTYPE,EIGTYPE,Dynamic,Dynamic,Dynamic> gemm_blocking(_rows,_cols,_depth); \
+       general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
+       rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, resStride, alpha, gemm_blocking, 0); \
+\
+     /*std::cout << "TRMM_R: A is not square! Go to MKL GEMM implementation! " << nthr<<" \n";*/ \
+     } \
+     return; \
+   } \
+   char side = 'R', transa, uplo, diag = 'N'; \
+   EIGTYPE *b; \
+   const EIGTYPE *a; \
+   MKL_INT m, n, lda, ldb; \
+   MKLTYPE alpha_; \
+\
+/* Set alpha_*/ \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
+\
+/* Set m, n */ \
+   m = (MKL_INT)rows; \
+   n = (MKL_INT)diagSize; \
+\
+/* Set trans */ \
+   transa = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
+\
+/* Set b, ldb */ \
+   Map<const MatrixLhs, 0, OuterStride<> > lhs(_lhs,rows,depth,OuterStride<>(lhsStride)); \
+   MatrixX##EIGPREFIX b_tmp; \
+\
+   if (ConjugateLhs) b_tmp = lhs.conjugate(); else b_tmp = lhs; \
+   b = b_tmp.data(); \
+   ldb = b_tmp.outerStride(); \
+\
+/* Set uplo */ \
+   uplo = IsLower ? 'L' : 'U'; \
+   if (RhsStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
+/* Set a, lda */ \
+   Map<const MatrixRhs, 0, OuterStride<> > rhs(_rhs,depth,cols, OuterStride<>(rhsStride)); \
+   MatrixRhs a_tmp; \
+\
+   if ((conjA!=0) || (SetDiag==0)) { \
+     if (conjA) a_tmp = rhs.conjugate(); else a_tmp = rhs; \
+     if (IsZeroDiag) \
+       a_tmp.diagonal().setZero(); \
+     else if (IsUnitDiag) \
+       a_tmp.diagonal().setOnes();\
+     a = a_tmp.data(); \
+     lda = a_tmp.outerStride(); \
+   } else { \
+     a = _rhs; \
+     lda = rhsStride; \
+   } \
+   /*std::cout << "TRMM_R: A is square! Go to MKL TRMM implementation! \n";*/ \
+/* call ?trmm*/ \
+   MKLPREFIX##trmm(&side, &uplo, &transa, &diag, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (MKLTYPE*)b, &ldb); \
+\
+/* Add op(a_triangular)*b into res*/ \
+   Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
+   res_tmp=res_tmp+b_tmp; \
+  } \
+};
+
+EIGEN_MKL_TRMM_R(double, double, d, d)
+EIGEN_MKL_TRMM_R(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_TRMM_R(float, float, f, s)
+EIGEN_MKL_TRMM_R(scomplex, MKL_Complex8, cf, c)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector.h
new file mode 100644
index 0000000..c8b7d28
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector.h
@@ -0,0 +1,348 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULARMATRIXVECTOR_H
+#define EIGEN_TRIANGULARMATRIXVECTOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder, int Version=Specialized>
+struct triangular_matrix_vector_product;
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+struct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>
+{
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  enum {
+    IsLower = ((Mode&Lower)==Lower),
+    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,
+    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag
+  };
+  static EIGEN_DONT_INLINE  void run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,
+                                     const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha);
+};
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int Version>
+EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,ColMajor,Version>
+  ::run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,
+        const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha)
+  {
+    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+    Index size = (std::min)(_rows,_cols);
+    Index rows = IsLower ? _rows : (std::min)(_rows,_cols);
+    Index cols = IsLower ? (std::min)(_rows,_cols) : _cols;
+
+    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs,rows,cols,OuterStride<>(lhsStride));
+    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);
+    
+    typedef Map<const Matrix<RhsScalar,Dynamic,1>, 0, InnerStride<> > RhsMap;
+    const RhsMap rhs(_rhs,cols,InnerStride<>(rhsIncr));
+    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);
+
+    typedef Map<Matrix<ResScalar,Dynamic,1> > ResMap;
+    ResMap res(_res,rows);
+
+    for (Index pi=0; pi<size; pi+=PanelWidth)
+    {
+      Index actualPanelWidth = (std::min)(PanelWidth, size-pi);
+      for (Index k=0; k<actualPanelWidth; ++k)
+      {
+        Index i = pi + k;
+        Index s = IsLower ? ((HasUnitDiag||HasZeroDiag) ? i+1 : i ) : pi;
+        Index r = IsLower ? actualPanelWidth-k : k+1;
+        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
+          res.segment(s,r) += (alpha * cjRhs.coeff(i)) * cjLhs.col(i).segment(s,r);
+        if (HasUnitDiag)
+          res.coeffRef(i) += alpha * cjRhs.coeff(i);
+      }
+      Index r = IsLower ? rows - pi - actualPanelWidth : pi;
+      if (r>0)
+      {
+        Index s = IsLower ? pi+actualPanelWidth : 0;
+        general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjLhs,RhsScalar,ConjRhs,BuiltIn>::run(
+            r, actualPanelWidth,
+            &lhs.coeffRef(s,pi), lhsStride,
+            &rhs.coeffRef(pi), rhsIncr,
+            &res.coeffRef(s), resIncr, alpha);
+      }
+    }
+    if((!IsLower) && cols>size)
+    {
+      general_matrix_vector_product<Index,LhsScalar,ColMajor,ConjLhs,RhsScalar,ConjRhs>::run(
+          rows, cols-size,
+          &lhs.coeffRef(0,size), lhsStride,
+          &rhs.coeffRef(size), rhsIncr,
+          _res, resIncr, alpha);
+    }
+  }
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>
+struct triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>
+{
+  typedef typename scalar_product_traits<LhsScalar, RhsScalar>::ReturnType ResScalar;
+  enum {
+    IsLower = ((Mode&Lower)==Lower),
+    HasUnitDiag = (Mode & UnitDiag)==UnitDiag,
+    HasZeroDiag = (Mode & ZeroDiag)==ZeroDiag
+  };
+  static EIGEN_DONT_INLINE void run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,
+                                    const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha);
+};
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs,int Version>
+EIGEN_DONT_INLINE void triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,RowMajor,Version>
+  ::run(Index _rows, Index _cols, const LhsScalar* _lhs, Index lhsStride,
+        const RhsScalar* _rhs, Index rhsIncr, ResScalar* _res, Index resIncr, const ResScalar& alpha)
+  {
+    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+    Index diagSize = (std::min)(_rows,_cols);
+    Index rows = IsLower ? _rows : diagSize;
+    Index cols = IsLower ? diagSize : _cols;
+
+    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs,rows,cols,OuterStride<>(lhsStride));
+    typename conj_expr_if<ConjLhs,LhsMap>::type cjLhs(lhs);
+
+    typedef Map<const Matrix<RhsScalar,Dynamic,1> > RhsMap;
+    const RhsMap rhs(_rhs,cols);
+    typename conj_expr_if<ConjRhs,RhsMap>::type cjRhs(rhs);
+
+    typedef Map<Matrix<ResScalar,Dynamic,1>, 0, InnerStride<> > ResMap;
+    ResMap res(_res,rows,InnerStride<>(resIncr));
+    
+    for (Index pi=0; pi<diagSize; pi+=PanelWidth)
+    {
+      Index actualPanelWidth = (std::min)(PanelWidth, diagSize-pi);
+      for (Index k=0; k<actualPanelWidth; ++k)
+      {
+        Index i = pi + k;
+        Index s = IsLower ? pi  : ((HasUnitDiag||HasZeroDiag) ? i+1 : i);
+        Index r = IsLower ? k+1 : actualPanelWidth-k;
+        if ((!(HasUnitDiag||HasZeroDiag)) || (--r)>0)
+          res.coeffRef(i) += alpha * (cjLhs.row(i).segment(s,r).cwiseProduct(cjRhs.segment(s,r).transpose())).sum();
+        if (HasUnitDiag)
+          res.coeffRef(i) += alpha * cjRhs.coeff(i);
+      }
+      Index r = IsLower ? pi : cols - pi - actualPanelWidth;
+      if (r>0)
+      {
+        Index s = IsLower ? 0 : pi + actualPanelWidth;
+        general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjLhs,RhsScalar,ConjRhs,BuiltIn>::run(
+            actualPanelWidth, r,
+            &lhs.coeffRef(pi,s), lhsStride,
+            &rhs.coeffRef(s), rhsIncr,
+            &res.coeffRef(pi), resIncr, alpha);
+      }
+    }
+    if(IsLower && rows>diagSize)
+    {
+      general_matrix_vector_product<Index,LhsScalar,RowMajor,ConjLhs,RhsScalar,ConjRhs>::run(
+            rows-diagSize, cols,
+            &lhs.coeffRef(diagSize,0), lhsStride,
+            &rhs.coeffRef(0), rhsIncr,
+            &res.coeffRef(diagSize), resIncr, alpha);
+    }
+  }
+
+/***************************************************************************
+* Wrapper to product_triangular_vector
+***************************************************************************/
+
+template<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
+struct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,true> >
+ : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,false,Rhs,true>, Lhs, Rhs> >
+{};
+
+template<int Mode, bool LhsIsTriangular, typename Lhs, typename Rhs>
+struct traits<TriangularProduct<Mode,LhsIsTriangular,Lhs,true,Rhs,false> >
+ : traits<ProductBase<TriangularProduct<Mode,LhsIsTriangular,Lhs,true,Rhs,false>, Lhs, Rhs> >
+{};
+
+
+template<int StorageOrder>
+struct trmv_selector;
+
+} // end namespace internal
+
+template<int Mode, typename Lhs, typename Rhs>
+struct TriangularProduct<Mode,true,Lhs,false,Rhs,true>
+  : public ProductBase<TriangularProduct<Mode,true,Lhs,false,Rhs,true>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)
+
+  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+  {
+    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());
+  
+    internal::trmv_selector<(int(internal::traits<Lhs>::Flags)&RowMajorBit) ? RowMajor : ColMajor>::run(*this, dst, alpha);
+  }
+};
+
+template<int Mode, typename Lhs, typename Rhs>
+struct TriangularProduct<Mode,false,Lhs,true,Rhs,false>
+  : public ProductBase<TriangularProduct<Mode,false,Lhs,true,Rhs,false>, Lhs, Rhs >
+{
+  EIGEN_PRODUCT_PUBLIC_INTERFACE(TriangularProduct)
+
+  TriangularProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
+
+  template<typename Dest> void scaleAndAddTo(Dest& dst, const Scalar& alpha) const
+  {
+    eigen_assert(dst.rows()==m_lhs.rows() && dst.cols()==m_rhs.cols());
+
+    typedef TriangularProduct<(Mode & (UnitDiag|ZeroDiag)) | ((Mode & Lower) ? Upper : Lower),true,Transpose<const Rhs>,false,Transpose<const Lhs>,true> TriangularProductTranspose;
+    Transpose<Dest> dstT(dst);
+    internal::trmv_selector<(int(internal::traits<Rhs>::Flags)&RowMajorBit) ? ColMajor : RowMajor>::run(
+      TriangularProductTranspose(m_rhs.transpose(),m_lhs.transpose()), dstT, alpha);
+  }
+};
+
+namespace internal {
+
+// TODO: find a way to factorize this piece of code with gemv_selector since the logic is exactly the same.
+  
+template<> struct trmv_selector<ColMajor>
+{
+  template<int Mode, typename Lhs, typename Rhs, typename Dest>
+  static void run(const TriangularProduct<Mode,true,Lhs,false,Rhs,true>& prod, Dest& dest, const typename TriangularProduct<Mode,true,Lhs,false,Rhs,true>::Scalar& alpha)
+  {
+    typedef TriangularProduct<Mode,true,Lhs,false,Rhs,true> ProductType;
+    typedef typename ProductType::Index Index;
+    typedef typename ProductType::LhsScalar   LhsScalar;
+    typedef typename ProductType::RhsScalar   RhsScalar;
+    typedef typename ProductType::Scalar      ResScalar;
+    typedef typename ProductType::RealScalar  RealScalar;
+    typedef typename ProductType::ActualLhsType ActualLhsType;
+    typedef typename ProductType::ActualRhsType ActualRhsType;
+    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;
+    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;
+    typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;
+
+    typename internal::add_const_on_value_type<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());
+    typename internal::add_const_on_value_type<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())
+                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());
+
+    enum {
+      // FIXME find a way to allow an inner stride on the result if packet_traits<Scalar>::size==1
+      // on, the other hand it is good for the cache to pack the vector anyways...
+      EvalToDestAtCompileTime = Dest::InnerStrideAtCompileTime==1,
+      ComplexByReal = (NumTraits<LhsScalar>::IsComplex) && (!NumTraits<RhsScalar>::IsComplex),
+      MightCannotUseDest = (Dest::InnerStrideAtCompileTime!=1) || ComplexByReal
+    };
+
+    gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,MightCannotUseDest> static_dest;
+
+    bool alphaIsCompatible = (!ComplexByReal) || (imag(actualAlpha)==RealScalar(0));
+    bool evalToDest = EvalToDestAtCompileTime && alphaIsCompatible;
+    
+    RhsScalar compatibleAlpha = get_factor<ResScalar,RhsScalar>::run(actualAlpha);
+
+    ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
+                                                  evalToDest ? dest.data() : static_dest.data());
+
+    if(!evalToDest)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      Index size = dest.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      if(!alphaIsCompatible)
+      {
+        MappedDest(actualDestPtr, dest.size()).setZero();
+        compatibleAlpha = RhsScalar(1);
+      }
+      else
+        MappedDest(actualDestPtr, dest.size()) = dest;
+    }
+    
+    internal::triangular_matrix_vector_product
+      <Index,Mode,
+       LhsScalar, LhsBlasTraits::NeedToConjugate,
+       RhsScalar, RhsBlasTraits::NeedToConjugate,
+       ColMajor>
+      ::run(actualLhs.rows(),actualLhs.cols(),
+            actualLhs.data(),actualLhs.outerStride(),
+            actualRhs.data(),actualRhs.innerStride(),
+            actualDestPtr,1,compatibleAlpha);
+
+    if (!evalToDest)
+    {
+      if(!alphaIsCompatible)
+        dest += actualAlpha * MappedDest(actualDestPtr, dest.size());
+      else
+        dest = MappedDest(actualDestPtr, dest.size());
+    }
+  }
+};
+
+template<> struct trmv_selector<RowMajor>
+{
+  template<int Mode, typename Lhs, typename Rhs, typename Dest>
+  static void run(const TriangularProduct<Mode,true,Lhs,false,Rhs,true>& prod, Dest& dest, const typename TriangularProduct<Mode,true,Lhs,false,Rhs,true>::Scalar& alpha)
+  {
+    typedef TriangularProduct<Mode,true,Lhs,false,Rhs,true> ProductType;
+    typedef typename ProductType::LhsScalar LhsScalar;
+    typedef typename ProductType::RhsScalar RhsScalar;
+    typedef typename ProductType::Scalar    ResScalar;
+    typedef typename ProductType::Index Index;
+    typedef typename ProductType::ActualLhsType ActualLhsType;
+    typedef typename ProductType::ActualRhsType ActualRhsType;
+    typedef typename ProductType::_ActualRhsType _ActualRhsType;
+    typedef typename ProductType::LhsBlasTraits LhsBlasTraits;
+    typedef typename ProductType::RhsBlasTraits RhsBlasTraits;
+
+    typename add_const<ActualLhsType>::type actualLhs = LhsBlasTraits::extract(prod.lhs());
+    typename add_const<ActualRhsType>::type actualRhs = RhsBlasTraits::extract(prod.rhs());
+
+    ResScalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(prod.lhs())
+                                  * RhsBlasTraits::extractScalarFactor(prod.rhs());
+
+    enum {
+      DirectlyUseRhs = _ActualRhsType::InnerStrideAtCompileTime==1
+    };
+
+    gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!DirectlyUseRhs> static_rhs;
+
+    ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,actualRhs.size(),
+        DirectlyUseRhs ? const_cast<RhsScalar*>(actualRhs.data()) : static_rhs.data());
+
+    if(!DirectlyUseRhs)
+    {
+      #ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      int size = actualRhs.size();
+      EIGEN_DENSE_STORAGE_CTOR_PLUGIN
+      #endif
+      Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, actualRhs.size()) = actualRhs;
+    }
+    
+    internal::triangular_matrix_vector_product
+      <Index,Mode,
+       LhsScalar, LhsBlasTraits::NeedToConjugate,
+       RhsScalar, RhsBlasTraits::NeedToConjugate,
+       RowMajor>
+      ::run(actualLhs.rows(),actualLhs.cols(),
+            actualLhs.data(),actualLhs.outerStride(),
+            actualRhsPtr,1,
+            dest.data(),dest.innerStride(),
+            actualAlpha);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULARMATRIXVECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector_MKL.h
new file mode 100644
index 0000000..09f110d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularMatrixVector_MKL.h
@@ -0,0 +1,247 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Triangular matrix-vector product functionality based on ?TRMV.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
+#define EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/**********************************************************************
+* This file implements triangular matrix-vector multiplication using BLAS
+**********************************************************************/
+
+// trmv/hemv specialization
+
+template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename RhsScalar, bool ConjRhs, int StorageOrder>
+struct triangular_matrix_vector_product_trmv :
+  triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};
+
+#define EIGEN_MKL_TRMV_SPECIALIZE(Scalar) \
+template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
+struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
+ static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
+                                     const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
+      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor>::run( \
+        _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
+  } \
+}; \
+template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
+struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor,Specialized> { \
+ static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
+                                     const Scalar* _rhs, Index rhsIncr, Scalar* _res, Index resIncr, Scalar alpha) { \
+      triangular_matrix_vector_product_trmv<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,RowMajor>::run( \
+        _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
+  } \
+};
+
+EIGEN_MKL_TRMV_SPECIALIZE(double)
+EIGEN_MKL_TRMV_SPECIALIZE(float)
+EIGEN_MKL_TRMV_SPECIALIZE(dcomplex)
+EIGEN_MKL_TRMV_SPECIALIZE(scomplex)
+
+// implements col-major: res += alpha * op(triangular) * vector
+#define EIGEN_MKL_TRMV_CM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
+struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    LowUp = IsLower ? Lower : Upper \
+  }; \
+ static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
+                 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
+ { \
+   if (ConjLhs || IsZeroDiag) { \
+     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor,BuiltIn>::run( \
+       _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
+     return; \
+   }\
+   Index size = (std::min)(_rows,_cols); \
+   Index rows = IsLower ? _rows : size; \
+   Index cols = IsLower ? size : _cols; \
+\
+   typedef VectorX##EIGPREFIX VectorRhs; \
+   EIGTYPE *x, *y;\
+\
+/* Set x*/ \
+   Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
+   VectorRhs x_tmp; \
+   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
+   x = x_tmp.data(); \
+\
+/* Square part handling */\
+\
+   char trans, uplo, diag; \
+   MKL_INT m, n, lda, incx, incy; \
+   EIGTYPE const *a; \
+   MKLTYPE alpha_, beta_; \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
+\
+/* Set m, n */ \
+   n = (MKL_INT)size; \
+   lda = lhsStride; \
+   incx = 1; \
+   incy = resIncr; \
+\
+/* Set uplo, trans and diag*/ \
+   trans = 'N'; \
+   uplo = IsLower ? 'L' : 'U'; \
+   diag = IsUnitDiag ? 'U' : 'N'; \
+\
+/* call ?TRMV*/ \
+   MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \
+\
+/* Add op(a_tr)rhs into res*/ \
+   MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \
+/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
+   if (size<(std::max)(rows,cols)) { \
+     typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \
+     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
+     x = x_tmp.data(); \
+     if (size<rows) { \
+       y = _res + size*resIncr; \
+       a = _lhs + size; \
+       m = rows-size; \
+       n = size; \
+     } \
+     else { \
+       x += size; \
+       y = _res; \
+       a = _lhs + size*lda; \
+       m = size; \
+       n = cols-size; \
+     } \
+     MKLPREFIX##gemv(&trans, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \
+   } \
+  } \
+};
+
+EIGEN_MKL_TRMV_CM(double, double, d, d)
+EIGEN_MKL_TRMV_CM(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_TRMV_CM(float, float, f, s)
+EIGEN_MKL_TRMV_CM(scomplex, MKL_Complex8, cf, c)
+
+// implements row-major: res += alpha * op(triangular) * vector
+#define EIGEN_MKL_TRMV_RM(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
+template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
+struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    SetDiag = (Mode&(ZeroDiag|UnitDiag)) ? 0 : 1, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    LowUp = IsLower ? Lower : Upper \
+  }; \
+ static void run(Index _rows, Index _cols, const EIGTYPE* _lhs, Index lhsStride, \
+                 const EIGTYPE* _rhs, Index rhsIncr, EIGTYPE* _res, Index resIncr, EIGTYPE alpha) \
+ { \
+   if (IsZeroDiag) { \
+     triangular_matrix_vector_product<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor,BuiltIn>::run( \
+       _rows, _cols, _lhs, lhsStride, _rhs, rhsIncr, _res, resIncr, alpha); \
+     return; \
+   }\
+   Index size = (std::min)(_rows,_cols); \
+   Index rows = IsLower ? _rows : size; \
+   Index cols = IsLower ? size : _cols; \
+\
+   typedef VectorX##EIGPREFIX VectorRhs; \
+   EIGTYPE *x, *y;\
+\
+/* Set x*/ \
+   Map<const VectorRhs, 0, InnerStride<> > rhs(_rhs,cols,InnerStride<>(rhsIncr)); \
+   VectorRhs x_tmp; \
+   if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
+   x = x_tmp.data(); \
+\
+/* Square part handling */\
+\
+   char trans, uplo, diag; \
+   MKL_INT m, n, lda, incx, incy; \
+   EIGTYPE const *a; \
+   MKLTYPE alpha_, beta_; \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(alpha_, alpha); \
+   assign_scalar_eig2mkl<MKLTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
+\
+/* Set m, n */ \
+   n = (MKL_INT)size; \
+   lda = lhsStride; \
+   incx = 1; \
+   incy = resIncr; \
+\
+/* Set uplo, trans and diag*/ \
+   trans = ConjLhs ? 'C' : 'T'; \
+   uplo = IsLower ? 'U' : 'L'; \
+   diag = IsUnitDiag ? 'U' : 'N'; \
+\
+/* call ?TRMV*/ \
+   MKLPREFIX##trmv(&uplo, &trans, &diag, &n, (const MKLTYPE*)_lhs, &lda, (MKLTYPE*)x, &incx); \
+\
+/* Add op(a_tr)rhs into res*/ \
+   MKLPREFIX##axpy(&n, &alpha_,(const MKLTYPE*)x, &incx, (MKLTYPE*)_res, &incy); \
+/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
+   if (size<(std::max)(rows,cols)) { \
+     typedef Matrix<EIGTYPE, Dynamic, Dynamic> MatrixLhs; \
+     if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
+     x = x_tmp.data(); \
+     if (size<rows) { \
+       y = _res + size*resIncr; \
+       a = _lhs + size*lda; \
+       m = rows-size; \
+       n = size; \
+     } \
+     else { \
+       x += size; \
+       y = _res; \
+       a = _lhs + size; \
+       m = size; \
+       n = cols-size; \
+     } \
+     MKLPREFIX##gemv(&trans, &n, &m, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)x, &incx, &beta_, (MKLTYPE*)y, &incy); \
+   } \
+  } \
+};
+
+EIGEN_MKL_TRMV_RM(double, double, d, d)
+EIGEN_MKL_TRMV_RM(dcomplex, MKL_Complex16, cd, z)
+EIGEN_MKL_TRMV_RM(float, float, f, s)
+EIGEN_MKL_TRMV_RM(scomplex, MKL_Complex8, cf, c)
+
+} // end namespase internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix.h
new file mode 100644
index 0000000..f103eae
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix.h
@@ -0,0 +1,329 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_H
+#define EIGEN_TRIANGULAR_SOLVER_MATRIX_H
+
+namespace Eigen { 
+
+namespace internal {
+
+// if the rhs is row major, let's transpose the product
+template <typename Scalar, typename Index, int Side, int Mode, bool Conjugate, int TriStorageOrder>
+struct triangular_solve_matrix<Scalar,Index,Side,Mode,Conjugate,TriStorageOrder,RowMajor>
+{
+  static void run(
+    Index size, Index cols,
+    const Scalar*  tri, Index triStride,
+    Scalar* _other, Index otherStride,
+    level3_blocking<Scalar,Scalar>& blocking)
+  {
+    triangular_solve_matrix<
+      Scalar, Index, Side==OnTheLeft?OnTheRight:OnTheLeft,
+      (Mode&UnitDiag) | ((Mode&Upper) ? Lower : Upper),
+      NumTraits<Scalar>::IsComplex && Conjugate,
+      TriStorageOrder==RowMajor ? ColMajor : RowMajor, ColMajor>
+      ::run(size, cols, tri, triStride, _other, otherStride, blocking);
+  }
+};
+
+/* Optimized triangular solver with multiple right hand side and the triangular matrix on the left
+ */
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
+struct triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>
+{
+  static EIGEN_DONT_INLINE void run(
+    Index size, Index otherSize,
+    const Scalar* _tri, Index triStride,
+    Scalar* _other, Index otherStride,
+    level3_blocking<Scalar,Scalar>& blocking);
+};
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
+EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor>::run(
+    Index size, Index otherSize,
+    const Scalar* _tri, Index triStride,
+    Scalar* _other, Index otherStride,
+    level3_blocking<Scalar,Scalar>& blocking)
+  {
+    Index cols = otherSize;
+    const_blas_data_mapper<Scalar, Index, TriStorageOrder> tri(_tri,triStride);
+    blas_data_mapper<Scalar, Index, ColMajor> other(_other,otherStride);
+
+    typedef gebp_traits<Scalar,Scalar> Traits;
+    enum {
+      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
+      IsLower = (Mode&Lower) == Lower
+    };
+
+    Index kc = blocking.kc();                   // cache block size along the K direction
+    Index mc = (std::min)(size,blocking.mc());  // cache block size along the M direction
+
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeB = kc*cols;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
+
+    conj_if<Conjugate> conj;
+    gebp_kernel<Scalar, Scalar, Index, Traits::mr, Traits::nr, Conjugate, false> gebp_kernel;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, TriStorageOrder> pack_lhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr, ColMajor, false, true> pack_rhs;
+
+    // the goal here is to subdivise the Rhs panels such that we keep some cache
+    // coherence when accessing the rhs elements
+    std::ptrdiff_t l1, l2;
+    manage_caching_sizes(GetAction, &l1, &l2);
+    Index subcols = cols>0 ? l2/(4 * sizeof(Scalar) * otherStride) : 0;
+    subcols = std::max<Index>((subcols/Traits::nr)*Traits::nr, Traits::nr);
+
+    for(Index k2=IsLower ? 0 : size;
+        IsLower ? k2<size : k2>0;
+        IsLower ? k2+=kc : k2-=kc)
+    {
+      const Index actual_kc = (std::min)(IsLower ? size-k2 : k2, kc);
+
+      // We have selected and packed a big horizontal panel R1 of rhs. Let B be the packed copy of this panel,
+      // and R2 the remaining part of rhs. The corresponding vertical panel of lhs is split into
+      // A11 (the triangular part) and A21 the remaining rectangular part.
+      // Then the high level algorithm is:
+      //  - B = R1                    => general block copy (done during the next step)
+      //  - R1 = A11^-1 B             => tricky part
+      //  - update B from the new R1  => actually this has to be performed continuously during the above step
+      //  - R2 -= A21 * B             => GEPP
+
+      // The tricky part: compute R1 = A11^-1 B while updating B from R1
+      // The idea is to split A11 into multiple small vertical panels.
+      // Each panel can be split into a small triangular part T1k which is processed without optimization,
+      // and the remaining small part T2k which is processed using gebp with appropriate block strides
+      for(Index j2=0; j2<cols; j2+=subcols)
+      {
+        Index actual_cols = (std::min)(cols-j2,subcols);
+        // for each small vertical panels [T1k^T, T2k^T]^T of lhs
+        for (Index k1=0; k1<actual_kc; k1+=SmallPanelWidth)
+        {
+          Index actualPanelWidth = std::min<Index>(actual_kc-k1, SmallPanelWidth);
+          // tr solve
+          for (Index k=0; k<actualPanelWidth; ++k)
+          {
+            // TODO write a small kernel handling this (can be shared with trsv)
+            Index i  = IsLower ? k2+k1+k : k2-k1-k-1;
+            Index s  = IsLower ? k2+k1 : i+1;
+            Index rs = actualPanelWidth - k - 1; // remaining size
+
+            Scalar a = (Mode & UnitDiag) ? Scalar(1) : Scalar(1)/conj(tri(i,i));
+            for (Index j=j2; j<j2+actual_cols; ++j)
+            {
+              if (TriStorageOrder==RowMajor)
+              {
+                Scalar b(0);
+                const Scalar* l = &tri(i,s);
+                Scalar* r = &other(s,j);
+                for (Index i3=0; i3<k; ++i3)
+                  b += conj(l[i3]) * r[i3];
+
+                other(i,j) = (other(i,j) - b)*a;
+              }
+              else
+              {
+                Index s = IsLower ? i+1 : i-rs;
+                Scalar b = (other(i,j) *= a);
+                Scalar* r = &other(s,j);
+                const Scalar* l = &tri(s,i);
+                for (Index i3=0;i3<rs;++i3)
+                  r[i3] -= b * conj(l[i3]);
+              }
+            }
+          }
+
+          Index lengthTarget = actual_kc-k1-actualPanelWidth;
+          Index startBlock   = IsLower ? k2+k1 : k2-k1-actualPanelWidth;
+          Index blockBOffset = IsLower ? k1 : lengthTarget;
+
+          // update the respective rows of B from other
+          pack_rhs(blockB+actual_kc*j2, &other(startBlock,j2), otherStride, actualPanelWidth, actual_cols, actual_kc, blockBOffset);
+
+          // GEBP
+          if (lengthTarget>0)
+          {
+            Index startTarget  = IsLower ? k2+k1+actualPanelWidth : k2-actual_kc;
+
+            pack_lhs(blockA, &tri(startTarget,startBlock), triStride, actualPanelWidth, lengthTarget);
+
+            gebp_kernel(&other(startTarget,j2), otherStride, blockA, blockB+actual_kc*j2, lengthTarget, actualPanelWidth, actual_cols, Scalar(-1),
+                        actualPanelWidth, actual_kc, 0, blockBOffset, blockW);
+          }
+        }
+      }
+      
+      // R2 -= A21 * B => GEPP
+      {
+        Index start = IsLower ? k2+kc : 0;
+        Index end   = IsLower ? size : k2-kc;
+        for(Index i2=start; i2<end; i2+=mc)
+        {
+          const Index actual_mc = (std::min)(mc,end-i2);
+          if (actual_mc>0)
+          {
+            pack_lhs(blockA, &tri(i2, IsLower ? k2 : k2-kc), triStride, actual_kc, actual_mc);
+
+            gebp_kernel(_other+i2, otherStride, blockA, blockB, actual_mc, actual_kc, cols, Scalar(-1), -1, -1, 0, 0, blockW);
+          }
+        }
+      }
+    }
+  }
+
+/* Optimized triangular solver with multiple left hand sides and the trinagular matrix on the right
+ */
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
+struct triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>
+{
+  static EIGEN_DONT_INLINE void run(
+    Index size, Index otherSize,
+    const Scalar* _tri, Index triStride,
+    Scalar* _other, Index otherStride,
+    level3_blocking<Scalar,Scalar>& blocking);
+};
+template <typename Scalar, typename Index, int Mode, bool Conjugate, int TriStorageOrder>
+EIGEN_DONT_INLINE void triangular_solve_matrix<Scalar,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor>::run(
+    Index size, Index otherSize,
+    const Scalar* _tri, Index triStride,
+    Scalar* _other, Index otherStride,
+    level3_blocking<Scalar,Scalar>& blocking)
+  {
+    Index rows = otherSize;
+    const_blas_data_mapper<Scalar, Index, TriStorageOrder> rhs(_tri,triStride);
+    blas_data_mapper<Scalar, Index, ColMajor> lhs(_other,otherStride);
+
+    typedef gebp_traits<Scalar,Scalar> Traits;
+    enum {
+      RhsStorageOrder   = TriStorageOrder,
+      SmallPanelWidth   = EIGEN_PLAIN_ENUM_MAX(Traits::mr,Traits::nr),
+      IsLower = (Mode&Lower) == Lower
+    };
+
+    Index kc = blocking.kc();                   // cache block size along the K direction
+    Index mc = (std::min)(rows,blocking.mc());  // cache block size along the M direction
+
+    std::size_t sizeA = kc*mc;
+    std::size_t sizeB = kc*size;
+    std::size_t sizeW = kc*Traits::WorkSpaceFactor;
+
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockA, sizeA, blocking.blockA());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockB, sizeB, blocking.blockB());
+    ei_declare_aligned_stack_constructed_variable(Scalar, blockW, sizeW, blocking.blockW());
+
+    conj_if<Conjugate> conj;
+    gebp_kernel<Scalar,Scalar, Index, Traits::mr, Traits::nr, false, Conjugate> gebp_kernel;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder> pack_rhs;
+    gemm_pack_rhs<Scalar, Index, Traits::nr,RhsStorageOrder,false,true> pack_rhs_panel;
+    gemm_pack_lhs<Scalar, Index, Traits::mr, Traits::LhsProgress, ColMajor, false, true> pack_lhs_panel;
+
+    for(Index k2=IsLower ? size : 0;
+        IsLower ? k2>0 : k2<size;
+        IsLower ? k2-=kc : k2+=kc)
+    {
+      const Index actual_kc = (std::min)(IsLower ? k2 : size-k2, kc);
+      Index actual_k2 = IsLower ? k2-actual_kc : k2 ;
+
+      Index startPanel = IsLower ? 0 : k2+actual_kc;
+      Index rs = IsLower ? actual_k2 : size - actual_k2 - actual_kc;
+      Scalar* geb = blockB+actual_kc*actual_kc;
+
+      if (rs>0) pack_rhs(geb, &rhs(actual_k2,startPanel), triStride, actual_kc, rs);
+
+      // triangular packing (we only pack the panels off the diagonal,
+      // neglecting the blocks overlapping the diagonal
+      {
+        for (Index j2=0; j2<actual_kc; j2+=SmallPanelWidth)
+        {
+          Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
+          Index actual_j2 = actual_k2 + j2;
+          Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
+          Index panelLength = IsLower ? actual_kc-j2-actualPanelWidth : j2;
+
+          if (panelLength>0)
+          pack_rhs_panel(blockB+j2*actual_kc,
+                         &rhs(actual_k2+panelOffset, actual_j2), triStride,
+                         panelLength, actualPanelWidth,
+                         actual_kc, panelOffset);
+        }
+      }
+
+      for(Index i2=0; i2<rows; i2+=mc)
+      {
+        const Index actual_mc = (std::min)(mc,rows-i2);
+
+        // triangular solver kernel
+        {
+          // for each small block of the diagonal (=> vertical panels of rhs)
+          for (Index j2 = IsLower
+                      ? (actual_kc - ((actual_kc%SmallPanelWidth) ? Index(actual_kc%SmallPanelWidth)
+                                                                  : Index(SmallPanelWidth)))
+                      : 0;
+               IsLower ? j2>=0 : j2<actual_kc;
+               IsLower ? j2-=SmallPanelWidth : j2+=SmallPanelWidth)
+          {
+            Index actualPanelWidth = std::min<Index>(actual_kc-j2, SmallPanelWidth);
+            Index absolute_j2 = actual_k2 + j2;
+            Index panelOffset = IsLower ? j2+actualPanelWidth : 0;
+            Index panelLength = IsLower ? actual_kc - j2 - actualPanelWidth : j2;
+
+            // GEBP
+            if(panelLength>0)
+            {
+              gebp_kernel(&lhs(i2,absolute_j2), otherStride,
+                          blockA, blockB+j2*actual_kc,
+                          actual_mc, panelLength, actualPanelWidth,
+                          Scalar(-1),
+                          actual_kc, actual_kc, // strides
+                          panelOffset, panelOffset, // offsets
+                          blockW);  // workspace
+            }
+
+            // unblocked triangular solve
+            for (Index k=0; k<actualPanelWidth; ++k)
+            {
+              Index j = IsLower ? absolute_j2+actualPanelWidth-k-1 : absolute_j2+k;
+
+              Scalar* r = &lhs(i2,j);
+              for (Index k3=0; k3<k; ++k3)
+              {
+                Scalar b = conj(rhs(IsLower ? j+1+k3 : absolute_j2+k3,j));
+                Scalar* a = &lhs(i2,IsLower ? j+1+k3 : absolute_j2+k3);
+                for (Index i=0; i<actual_mc; ++i)
+                  r[i] -= a[i] * b;
+              }
+              Scalar b = (Mode & UnitDiag) ? Scalar(1) : Scalar(1)/conj(rhs(j,j));
+              for (Index i=0; i<actual_mc; ++i)
+                r[i] *= b;
+            }
+
+            // pack the just computed part of lhs to A
+            pack_lhs_panel(blockA, _other+absolute_j2*otherStride+i2, otherStride,
+                           actualPanelWidth, actual_mc,
+                           actual_kc, j2);
+          }
+        }
+
+        if (rs>0)
+          gebp_kernel(_other+i2+startPanel*otherStride, otherStride, blockA, geb,
+                      actual_mc, actual_kc, rs, Scalar(-1),
+                      -1, -1, 0, 0, blockW);
+      }
+    }
+  }
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h
new file mode 100644
index 0000000..6a0bb83
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverMatrix_MKL.h
@@ -0,0 +1,155 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Triangular matrix * matrix product functionality based on ?TRMM.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
+#define EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
+
+namespace Eigen {
+
+namespace internal {
+
+// implements LeftSide op(triangular)^-1 * general
+#define EIGEN_MKL_TRSM_L(EIGTYPE, MKLTYPE, MKLPREFIX) \
+template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
+struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor> \
+{ \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
+  }; \
+  static void run( \
+      Index size, Index otherSize, \
+      const EIGTYPE* _tri, Index triStride, \
+      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
+  { \
+   MKL_INT m = size, n = otherSize, lda, ldb; \
+   char side = 'L', uplo, diag='N', transa; \
+   /* Set alpha_ */ \
+   MKLTYPE alpha; \
+   EIGTYPE myone(1); \
+   assign_scalar_eig2mkl(alpha, myone); \
+   ldb = otherStride;\
+\
+   const EIGTYPE *a; \
+/* Set trans */ \
+   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
+/* Set uplo */ \
+   uplo = IsLower ? 'L' : 'U'; \
+   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
+/* Set a, lda */ \
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
+   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
+   MatrixTri a_tmp; \
+\
+   if (conjA) { \
+     a_tmp = tri.conjugate(); \
+     a = a_tmp.data(); \
+     lda = a_tmp.outerStride(); \
+   } else { \
+     a = _tri; \
+     lda = triStride; \
+   } \
+   if (IsUnitDiag) diag='U'; \
+/* call ?trsm*/ \
+   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \
+ } \
+};
+
+EIGEN_MKL_TRSM_L(double, double, d)
+EIGEN_MKL_TRSM_L(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_TRSM_L(float, float, s)
+EIGEN_MKL_TRSM_L(scomplex, MKL_Complex8, c)
+
+
+// implements RightSide general * op(triangular)^-1
+#define EIGEN_MKL_TRSM_R(EIGTYPE, MKLTYPE, MKLPREFIX) \
+template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
+struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor> \
+{ \
+  enum { \
+    IsLower = (Mode&Lower) == Lower, \
+    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
+    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
+    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
+  }; \
+  static void run( \
+      Index size, Index otherSize, \
+      const EIGTYPE* _tri, Index triStride, \
+      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
+  { \
+   MKL_INT m = otherSize, n = size, lda, ldb; \
+   char side = 'R', uplo, diag='N', transa; \
+   /* Set alpha_ */ \
+   MKLTYPE alpha; \
+   EIGTYPE myone(1); \
+   assign_scalar_eig2mkl(alpha, myone); \
+   ldb = otherStride;\
+\
+   const EIGTYPE *a; \
+/* Set trans */ \
+   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
+/* Set uplo */ \
+   uplo = IsLower ? 'L' : 'U'; \
+   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
+/* Set a, lda */ \
+   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
+   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
+   MatrixTri a_tmp; \
+\
+   if (conjA) { \
+     a_tmp = tri.conjugate(); \
+     a = a_tmp.data(); \
+     lda = a_tmp.outerStride(); \
+   } else { \
+     a = _tri; \
+     lda = triStride; \
+   } \
+   if (IsUnitDiag) diag='U'; \
+/* call ?trsm*/ \
+   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \
+   /*std::cout << "TRMS_L specialization!\n";*/ \
+ } \
+};
+
+EIGEN_MKL_TRSM_R(double, double, d)
+EIGEN_MKL_TRSM_R(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_TRSM_R(float, float, s)
+EIGEN_MKL_TRSM_R(scomplex, MKL_Complex8, c)
+
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverVector.h b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverVector.h
new file mode 100644
index 0000000..ce4d100
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/products/TriangularSolverVector.h
@@ -0,0 +1,139 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULAR_SOLVER_VECTOR_H
+#define EIGEN_TRIANGULAR_SOLVER_VECTOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate, int StorageOrder>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheRight, Mode, Conjugate, StorageOrder>
+{
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
+  {
+    triangular_solve_vector<LhsScalar,RhsScalar,Index,OnTheLeft,
+        ((Mode&Upper)==Upper ? Lower : Upper) | (Mode&UnitDiag),
+        Conjugate,StorageOrder==RowMajor?ColMajor:RowMajor
+      >::run(size, _lhs, lhsStride, rhs);
+  }
+};
+    
+// forward and backward substitution, row-major, rhs is a vector
+template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, RowMajor>
+{
+  enum {
+    IsLower = ((Mode&Lower)==Lower)
+  };
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
+  {
+    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,RowMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
+    typename internal::conditional<
+                          Conjugate,
+                          const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
+                          const LhsMap&>
+                        ::type cjLhs(lhs);
+    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+    for(Index pi=IsLower ? 0 : size;
+        IsLower ? pi<size : pi>0;
+        IsLower ? pi+=PanelWidth : pi-=PanelWidth)
+    {
+      Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
+
+      Index r = IsLower ? pi : size - pi; // remaining size
+      if (r > 0)
+      {
+        // let's directly call the low level product function because:
+        // 1 - it is faster to compile
+        // 2 - it is slighlty faster at runtime
+        Index startRow = IsLower ? pi : pi-actualPanelWidth;
+        Index startCol = IsLower ? 0 : pi;
+
+        general_matrix_vector_product<Index,LhsScalar,RowMajor,Conjugate,RhsScalar,false>::run(
+          actualPanelWidth, r,
+          &lhs.coeffRef(startRow,startCol), lhsStride,
+          rhs + startCol, 1,
+          rhs + startRow, 1,
+          RhsScalar(-1));
+      }
+
+      for(Index k=0; k<actualPanelWidth; ++k)
+      {
+        Index i = IsLower ? pi+k : pi-k-1;
+        Index s = IsLower ? pi   : i+1;
+        if (k>0)
+          rhs[i] -= (cjLhs.row(i).segment(s,k).transpose().cwiseProduct(Map<const Matrix<RhsScalar,Dynamic,1> >(rhs+s,k))).sum();
+        
+        if(!(Mode & UnitDiag))
+          rhs[i] /= cjLhs(i,i);
+      }
+    }
+  }
+};
+
+// forward and backward substitution, column-major, rhs is a vector
+template<typename LhsScalar, typename RhsScalar, typename Index, int Mode, bool Conjugate>
+struct triangular_solve_vector<LhsScalar, RhsScalar, Index, OnTheLeft, Mode, Conjugate, ColMajor>
+{
+  enum {
+    IsLower = ((Mode&Lower)==Lower)
+  };
+  static void run(Index size, const LhsScalar* _lhs, Index lhsStride, RhsScalar* rhs)
+  {
+    typedef Map<const Matrix<LhsScalar,Dynamic,Dynamic,ColMajor>, 0, OuterStride<> > LhsMap;
+    const LhsMap lhs(_lhs,size,size,OuterStride<>(lhsStride));
+    typename internal::conditional<Conjugate,
+                                   const CwiseUnaryOp<typename internal::scalar_conjugate_op<LhsScalar>,LhsMap>,
+                                   const LhsMap&
+                                  >::type cjLhs(lhs);
+    static const Index PanelWidth = EIGEN_TUNE_TRIANGULAR_PANEL_WIDTH;
+
+    for(Index pi=IsLower ? 0 : size;
+        IsLower ? pi<size : pi>0;
+        IsLower ? pi+=PanelWidth : pi-=PanelWidth)
+    {
+      Index actualPanelWidth = (std::min)(IsLower ? size - pi : pi, PanelWidth);
+      Index startBlock = IsLower ? pi : pi-actualPanelWidth;
+      Index endBlock = IsLower ? pi + actualPanelWidth : 0;
+
+      for(Index k=0; k<actualPanelWidth; ++k)
+      {
+        Index i = IsLower ? pi+k : pi-k-1;
+        if(!(Mode & UnitDiag))
+          rhs[i] /= cjLhs.coeff(i,i);
+
+        Index r = actualPanelWidth - k - 1; // remaining size
+        Index s = IsLower ? i+1 : i-r;
+        if (r>0)
+          Map<Matrix<RhsScalar,Dynamic,1> >(rhs+s,r) -= rhs[i] * cjLhs.col(i).segment(s,r);
+      }
+      Index r = IsLower ? size - endBlock : startBlock; // remaining size
+      if (r > 0)
+      {
+        // let's directly call the low level product function because:
+        // 1 - it is faster to compile
+        // 2 - it is slighlty faster at runtime
+        general_matrix_vector_product<Index,LhsScalar,ColMajor,Conjugate,RhsScalar,false>::run(
+            r, actualPanelWidth,
+            &lhs.coeffRef(endBlock,startBlock), lhsStride,
+            rhs+startBlock, 1,
+            rhs+endBlock, 1, RhsScalar(-1));
+      }
+    }
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIANGULAR_SOLVER_VECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/BlasUtil.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/BlasUtil.h
new file mode 100644
index 0000000..9149665
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/BlasUtil.h
@@ -0,0 +1,264 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BLASUTIL_H
+#define EIGEN_BLASUTIL_H
+
+// This file contains many lightweight helper classes used to
+// implement and control fast level 2 and level 3 BLAS-like routines.
+
+namespace Eigen {
+
+namespace internal {
+
+// forward declarations
+template<typename LhsScalar, typename RhsScalar, typename Index, int mr, int nr, bool ConjugateLhs=false, bool ConjugateRhs=false>
+struct gebp_kernel;
+
+template<typename Scalar, typename Index, int nr, int StorageOrder, bool Conjugate = false, bool PanelMode=false>
+struct gemm_pack_rhs;
+
+template<typename Scalar, typename Index, int Pack1, int Pack2, int StorageOrder, bool Conjugate = false, bool PanelMode = false>
+struct gemm_pack_lhs;
+
+template<
+  typename Index,
+  typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs,
+  typename RhsScalar, int RhsStorageOrder, bool ConjugateRhs,
+  int ResStorageOrder>
+struct general_matrix_matrix_product;
+
+template<typename Index, typename LhsScalar, int LhsStorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version=Specialized>
+struct general_matrix_vector_product;
+
+
+template<bool Conjugate> struct conj_if;
+
+template<> struct conj_if<true> {
+  template<typename T>
+  inline T operator()(const T& x) { return conj(x); }
+  template<typename T>
+  inline T pconj(const T& x) { return internal::pconj(x); }
+};
+
+template<> struct conj_if<false> {
+  template<typename T>
+  inline const T& operator()(const T& x) { return x; }
+  template<typename T>
+  inline const T& pconj(const T& x) { return x; }
+};
+
+template<typename Scalar> struct conj_helper<Scalar,Scalar,false,false>
+{
+  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const { return internal::pmadd(x,y,c); }
+  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const { return internal::pmul(x,y); }
+};
+
+template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, false,true>
+{
+  typedef std::complex<RealScalar> Scalar;
+  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
+  { return c + pmul(x,y); }
+
+  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
+  { return Scalar(real(x)*real(y) + imag(x)*imag(y), imag(x)*real(y) - real(x)*imag(y)); }
+};
+
+template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,false>
+{
+  typedef std::complex<RealScalar> Scalar;
+  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
+  { return c + pmul(x,y); }
+
+  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
+  { return Scalar(real(x)*real(y) + imag(x)*imag(y), real(x)*imag(y) - imag(x)*real(y)); }
+};
+
+template<typename RealScalar> struct conj_helper<std::complex<RealScalar>, std::complex<RealScalar>, true,true>
+{
+  typedef std::complex<RealScalar> Scalar;
+  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const Scalar& y, const Scalar& c) const
+  { return c + pmul(x,y); }
+
+  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const Scalar& y) const
+  { return Scalar(real(x)*real(y) - imag(x)*imag(y), - real(x)*imag(y) - imag(x)*real(y)); }
+};
+
+template<typename RealScalar,bool Conj> struct conj_helper<std::complex<RealScalar>, RealScalar, Conj,false>
+{
+  typedef std::complex<RealScalar> Scalar;
+  EIGEN_STRONG_INLINE Scalar pmadd(const Scalar& x, const RealScalar& y, const Scalar& c) const
+  { return padd(c, pmul(x,y)); }
+  EIGEN_STRONG_INLINE Scalar pmul(const Scalar& x, const RealScalar& y) const
+  { return conj_if<Conj>()(x)*y; }
+};
+
+template<typename RealScalar,bool Conj> struct conj_helper<RealScalar, std::complex<RealScalar>, false,Conj>
+{
+  typedef std::complex<RealScalar> Scalar;
+  EIGEN_STRONG_INLINE Scalar pmadd(const RealScalar& x, const Scalar& y, const Scalar& c) const
+  { return padd(c, pmul(x,y)); }
+  EIGEN_STRONG_INLINE Scalar pmul(const RealScalar& x, const Scalar& y) const
+  { return x*conj_if<Conj>()(y); }
+};
+
+template<typename From,typename To> struct get_factor {
+  static EIGEN_STRONG_INLINE To run(const From& x) { return x; }
+};
+
+template<typename Scalar> struct get_factor<Scalar,typename NumTraits<Scalar>::Real> {
+  static EIGEN_STRONG_INLINE typename NumTraits<Scalar>::Real run(const Scalar& x) { return real(x); }
+};
+
+// Lightweight helper class to access matrix coefficients.
+// Yes, this is somehow redundant with Map<>, but this version is much much lighter,
+// and so I hope better compilation performance (time and code quality).
+template<typename Scalar, typename Index, int StorageOrder>
+class blas_data_mapper
+{
+  public:
+    blas_data_mapper(Scalar* data, Index stride) : m_data(data), m_stride(stride) {}
+    EIGEN_STRONG_INLINE Scalar& operator()(Index i, Index j)
+    { return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride]; }
+  protected:
+    Scalar* EIGEN_RESTRICT m_data;
+    Index m_stride;
+};
+
+// lightweight helper class to access matrix coefficients (const version)
+template<typename Scalar, typename Index, int StorageOrder>
+class const_blas_data_mapper
+{
+  public:
+    const_blas_data_mapper(const Scalar* data, Index stride) : m_data(data), m_stride(stride) {}
+    EIGEN_STRONG_INLINE const Scalar& operator()(Index i, Index j) const
+    { return m_data[StorageOrder==RowMajor ? j + i*m_stride : i + j*m_stride]; }
+  protected:
+    const Scalar* EIGEN_RESTRICT m_data;
+    Index m_stride;
+};
+
+
+/* Helper class to analyze the factors of a Product expression.
+ * In particular it allows to pop out operator-, scalar multiples,
+ * and conjugate */
+template<typename XprType> struct blas_traits
+{
+  typedef typename traits<XprType>::Scalar Scalar;
+  typedef const XprType& ExtractType;
+  typedef XprType _ExtractType;
+  enum {
+    IsComplex = NumTraits<Scalar>::IsComplex,
+    IsTransposed = false,
+    NeedToConjugate = false,
+    HasUsableDirectAccess = (    (int(XprType::Flags)&DirectAccessBit)
+                              && (   bool(XprType::IsVectorAtCompileTime)
+                                  || int(inner_stride_at_compile_time<XprType>::ret) == 1)
+                             ) ?  1 : 0
+  };
+  typedef typename conditional<bool(HasUsableDirectAccess),
+    ExtractType,
+    typename _ExtractType::PlainObject
+    >::type DirectLinearAccessType;
+  static inline ExtractType extract(const XprType& x) { return x; }
+  static inline const Scalar extractScalarFactor(const XprType&) { return Scalar(1); }
+};
+
+// pop conjugate
+template<typename Scalar, typename NestedXpr>
+struct blas_traits<CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> >
+ : blas_traits<NestedXpr>
+{
+  typedef blas_traits<NestedXpr> Base;
+  typedef CwiseUnaryOp<scalar_conjugate_op<Scalar>, NestedXpr> XprType;
+  typedef typename Base::ExtractType ExtractType;
+
+  enum {
+    IsComplex = NumTraits<Scalar>::IsComplex,
+    NeedToConjugate = Base::NeedToConjugate ? 0 : IsComplex
+  };
+  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
+  static inline Scalar extractScalarFactor(const XprType& x) { return conj(Base::extractScalarFactor(x.nestedExpression())); }
+};
+
+// pop scalar multiple
+template<typename Scalar, typename NestedXpr>
+struct blas_traits<CwiseUnaryOp<scalar_multiple_op<Scalar>, NestedXpr> >
+ : blas_traits<NestedXpr>
+{
+  typedef blas_traits<NestedXpr> Base;
+  typedef CwiseUnaryOp<scalar_multiple_op<Scalar>, NestedXpr> XprType;
+  typedef typename Base::ExtractType ExtractType;
+  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
+  static inline Scalar extractScalarFactor(const XprType& x)
+  { return x.functor().m_other * Base::extractScalarFactor(x.nestedExpression()); }
+};
+
+// pop opposite
+template<typename Scalar, typename NestedXpr>
+struct blas_traits<CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> >
+ : blas_traits<NestedXpr>
+{
+  typedef blas_traits<NestedXpr> Base;
+  typedef CwiseUnaryOp<scalar_opposite_op<Scalar>, NestedXpr> XprType;
+  typedef typename Base::ExtractType ExtractType;
+  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
+  static inline Scalar extractScalarFactor(const XprType& x)
+  { return - Base::extractScalarFactor(x.nestedExpression()); }
+};
+
+// pop/push transpose
+template<typename NestedXpr>
+struct blas_traits<Transpose<NestedXpr> >
+ : blas_traits<NestedXpr>
+{
+  typedef typename NestedXpr::Scalar Scalar;
+  typedef blas_traits<NestedXpr> Base;
+  typedef Transpose<NestedXpr> XprType;
+  typedef Transpose<const typename Base::_ExtractType>  ExtractType; // const to get rid of a compile error; anyway blas traits are only used on the RHS
+  typedef Transpose<const typename Base::_ExtractType> _ExtractType;
+  typedef typename conditional<bool(Base::HasUsableDirectAccess),
+    ExtractType,
+    typename ExtractType::PlainObject
+    >::type DirectLinearAccessType;
+  enum {
+    IsTransposed = Base::IsTransposed ? 0 : 1
+  };
+  static inline ExtractType extract(const XprType& x) { return Base::extract(x.nestedExpression()); }
+  static inline Scalar extractScalarFactor(const XprType& x) { return Base::extractScalarFactor(x.nestedExpression()); }
+};
+
+template<typename T>
+struct blas_traits<const T>
+     : blas_traits<T>
+{};
+
+template<typename T, bool HasUsableDirectAccess=blas_traits<T>::HasUsableDirectAccess>
+struct extract_data_selector {
+  static const typename T::Scalar* run(const T& m)
+  {
+    return blas_traits<T>::extract(m).data();
+  }
+};
+
+template<typename T>
+struct extract_data_selector<T,false> {
+  static typename T::Scalar* run(const T&) { return 0; }
+};
+
+template<typename T> const typename T::Scalar* extract_data(const T& m)
+{
+  return extract_data_selector<T>::run(m);
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BLASUTIL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Core/util/CMakeLists.txt
new file mode 100644
index 0000000..a1e2e52
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Core_util_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_Core_util_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Core/util COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/Constants.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/Constants.h
new file mode 100644
index 0000000..14b9624
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/Constants.h
@@ -0,0 +1,438 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2007-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CONSTANTS_H
+#define EIGEN_CONSTANTS_H
+
+namespace Eigen {
+
+/** This value means that a positive quantity (e.g., a size) is not known at compile-time, and that instead the value is
+  * stored in some runtime variable.
+  *
+  * Changing the value of Dynamic breaks the ABI, as Dynamic is often used as a template parameter for Matrix.
+  */
+const int Dynamic = -1;
+
+/** This value means that a signed quantity (e.g., a signed index) is not known at compile-time, and that instead its value
+  * has to be specified at runtime.
+  */
+const int DynamicIndex = 0xffffff;
+
+/** This value means +Infinity; it is currently used only as the p parameter to MatrixBase::lpNorm<int>().
+  * The value Infinity there means the L-infinity norm.
+  */
+const int Infinity = -1;
+
+/** \defgroup flags Flags
+  * \ingroup Core_Module
+  *
+  * These are the possible bits which can be OR'ed to constitute the flags of a matrix or
+  * expression.
+  *
+  * It is important to note that these flags are a purely compile-time notion. They are a compile-time property of
+  * an expression type, implemented as enum's. They are not stored in memory at runtime, and they do not incur any
+  * runtime overhead.
+  *
+  * \sa MatrixBase::Flags
+  */
+
+/** \ingroup flags
+  *
+  * for a matrix, this means that the storage order is row-major.
+  * If this bit is not set, the storage order is column-major.
+  * For an expression, this determines the storage order of
+  * the matrix created by evaluation of that expression. 
+  * \sa \ref TopicStorageOrders */
+const unsigned int RowMajorBit = 0x1;
+
+/** \ingroup flags
+  *
+  * means the expression should be evaluated by the calling expression */
+const unsigned int EvalBeforeNestingBit = 0x2;
+
+/** \ingroup flags
+  *
+  * means the expression should be evaluated before any assignment */
+const unsigned int EvalBeforeAssigningBit = 0x4;
+
+/** \ingroup flags
+  *
+  * Short version: means the expression might be vectorized
+  *
+  * Long version: means that the coefficients can be handled by packets
+  * and start at a memory location whose alignment meets the requirements
+  * of the present CPU architecture for optimized packet access. In the fixed-size
+  * case, there is the additional condition that it be possible to access all the
+  * coefficients by packets (this implies the requirement that the size be a multiple of 16 bytes,
+  * and that any nontrivial strides don't break the alignment). In the dynamic-size case,
+  * there is no such condition on the total size and strides, so it might not be possible to access
+  * all coeffs by packets.
+  *
+  * \note This bit can be set regardless of whether vectorization is actually enabled.
+  *       To check for actual vectorizability, see \a ActualPacketAccessBit.
+  */
+const unsigned int PacketAccessBit = 0x8;
+
+#ifdef EIGEN_VECTORIZE
+/** \ingroup flags
+  *
+  * If vectorization is enabled (EIGEN_VECTORIZE is defined) this constant
+  * is set to the value \a PacketAccessBit.
+  *
+  * If vectorization is not enabled (EIGEN_VECTORIZE is not defined) this constant
+  * is set to the value 0.
+  */
+const unsigned int ActualPacketAccessBit = PacketAccessBit;
+#else
+const unsigned int ActualPacketAccessBit = 0x0;
+#endif
+
+/** \ingroup flags
+  *
+  * Short version: means the expression can be seen as 1D vector.
+  *
+  * Long version: means that one can access the coefficients
+  * of this expression by coeff(int), and coeffRef(int) in the case of a lvalue expression. These
+  * index-based access methods are guaranteed
+  * to not have to do any runtime computation of a (row, col)-pair from the index, so that it
+  * is guaranteed that whenever it is available, index-based access is at least as fast as
+  * (row,col)-based access. Expressions for which that isn't possible don't have the LinearAccessBit.
+  *
+  * If both PacketAccessBit and LinearAccessBit are set, then the
+  * packets of this expression can be accessed by packet(int), and writePacket(int) in the case of a
+  * lvalue expression.
+  *
+  * Typically, all vector expressions have the LinearAccessBit, but there is one exception:
+  * Product expressions don't have it, because it would be troublesome for vectorization, even when the
+  * Product is a vector expression. Thus, vector Product expressions allow index-based coefficient access but
+  * not index-based packet access, so they don't have the LinearAccessBit.
+  */
+const unsigned int LinearAccessBit = 0x10;
+
+/** \ingroup flags
+  *
+  * Means the expression has a coeffRef() method, i.e. is writable as its individual coefficients are directly addressable.
+  * This rules out read-only expressions.
+  *
+  * Note that DirectAccessBit and LvalueBit are mutually orthogonal, as there are examples of expression having one but note
+  * the other:
+  *   \li writable expressions that don't have a very simple memory layout as a strided array, have LvalueBit but not DirectAccessBit
+  *   \li Map-to-const expressions, for example Map<const Matrix>, have DirectAccessBit but not LvalueBit
+  *
+  * Expressions having LvalueBit also have their coeff() method returning a const reference instead of returning a new value.
+  */
+const unsigned int LvalueBit = 0x20;
+
+/** \ingroup flags
+  *
+  * Means that the underlying array of coefficients can be directly accessed as a plain strided array. The memory layout
+  * of the array of coefficients must be exactly the natural one suggested by rows(), cols(),
+  * outerStride(), innerStride(), and the RowMajorBit. This rules out expressions such as Diagonal, whose coefficients,
+  * though referencable, do not have such a regular memory layout.
+  *
+  * See the comment on LvalueBit for an explanation of how LvalueBit and DirectAccessBit are mutually orthogonal.
+  */
+const unsigned int DirectAccessBit = 0x40;
+
+/** \ingroup flags
+  *
+  * means the first coefficient packet is guaranteed to be aligned */
+const unsigned int AlignedBit = 0x80;
+
+const unsigned int NestByRefBit = 0x100;
+
+// list of flags that are inherited by default
+const unsigned int HereditaryBits = RowMajorBit
+                                  | EvalBeforeNestingBit
+                                  | EvalBeforeAssigningBit;
+
+/** \defgroup enums Enumerations
+  * \ingroup Core_Module
+  *
+  * Various enumerations used in %Eigen. Many of these are used as template parameters.
+  */
+
+/** \ingroup enums
+  * Enum containing possible values for the \p Mode parameter of 
+  * MatrixBase::selfadjointView() and MatrixBase::triangularView(). */
+enum {
+  /** View matrix as a lower triangular matrix. */
+  Lower=0x1,                      
+  /** View matrix as an upper triangular matrix. */
+  Upper=0x2,                      
+  /** %Matrix has ones on the diagonal; to be used in combination with #Lower or #Upper. */
+  UnitDiag=0x4, 
+  /** %Matrix has zeros on the diagonal; to be used in combination with #Lower or #Upper. */
+  ZeroDiag=0x8,
+  /** View matrix as a lower triangular matrix with ones on the diagonal. */
+  UnitLower=UnitDiag|Lower, 
+  /** View matrix as an upper triangular matrix with ones on the diagonal. */
+  UnitUpper=UnitDiag|Upper,
+  /** View matrix as a lower triangular matrix with zeros on the diagonal. */
+  StrictlyLower=ZeroDiag|Lower, 
+  /** View matrix as an upper triangular matrix with zeros on the diagonal. */
+  StrictlyUpper=ZeroDiag|Upper,
+  /** Used in BandMatrix and SelfAdjointView to indicate that the matrix is self-adjoint. */
+  SelfAdjoint=0x10,
+  /** Used to support symmetric, non-selfadjoint, complex matrices. */
+  Symmetric=0x20
+};
+
+/** \ingroup enums
+  * Enum for indicating whether an object is aligned or not. */
+enum { 
+  /** Object is not correctly aligned for vectorization. */
+  Unaligned=0, 
+  /** Object is aligned for vectorization. */
+  Aligned=1 
+};
+
+/** \ingroup enums
+ * Enum used by DenseBase::corner() in Eigen2 compatibility mode. */
+// FIXME after the corner() API change, this was not needed anymore, except by AlignedBox
+// TODO: find out what to do with that. Adapt the AlignedBox API ?
+enum CornerType { TopLeft, TopRight, BottomLeft, BottomRight };
+
+/** \ingroup enums
+  * Enum containing possible values for the \p Direction parameter of
+  * Reverse, PartialReduxExpr and VectorwiseOp. */
+enum DirectionType { 
+  /** For Reverse, all columns are reversed; 
+    * for PartialReduxExpr and VectorwiseOp, act on columns. */
+  Vertical, 
+  /** For Reverse, all rows are reversed; 
+    * for PartialReduxExpr and VectorwiseOp, act on rows. */
+  Horizontal, 
+  /** For Reverse, both rows and columns are reversed; 
+    * not used for PartialReduxExpr and VectorwiseOp. */
+  BothDirections 
+};
+
+/** \internal \ingroup enums
+  * Enum to specify how to traverse the entries of a matrix. */
+enum {
+  /** \internal Default traversal, no vectorization, no index-based access */
+  DefaultTraversal,
+  /** \internal No vectorization, use index-based access to have only one for loop instead of 2 nested loops */
+  LinearTraversal,
+  /** \internal Equivalent to a slice vectorization for fixed-size matrices having good alignment
+    * and good size */
+  InnerVectorizedTraversal,
+  /** \internal Vectorization path using a single loop plus scalar loops for the
+    * unaligned boundaries */
+  LinearVectorizedTraversal,
+  /** \internal Generic vectorization path using one vectorized loop per row/column with some
+    * scalar loops to handle the unaligned boundaries */
+  SliceVectorizedTraversal,
+  /** \internal Special case to properly handle incompatible scalar types or other defecting cases*/
+  InvalidTraversal,
+  /** \internal Evaluate all entries at once */
+  AllAtOnceTraversal
+};
+
+/** \internal \ingroup enums
+  * Enum to specify whether to unroll loops when traversing over the entries of a matrix. */
+enum {
+  /** \internal Do not unroll loops. */
+  NoUnrolling,
+  /** \internal Unroll only the inner loop, but not the outer loop. */
+  InnerUnrolling,
+  /** \internal Unroll both the inner and the outer loop. If there is only one loop, 
+    * because linear traversal is used, then unroll that loop. */
+  CompleteUnrolling
+};
+
+/** \internal \ingroup enums
+  * Enum to specify whether to use the default (built-in) implementation or the specialization. */
+enum {
+  Specialized,
+  BuiltIn
+};
+
+/** \ingroup enums
+  * Enum containing possible values for the \p _Options template parameter of
+  * Matrix, Array and BandMatrix. */
+enum {
+  /** Storage order is column major (see \ref TopicStorageOrders). */
+  ColMajor = 0,
+  /** Storage order is row major (see \ref TopicStorageOrders). */
+  RowMajor = 0x1,  // it is only a coincidence that this is equal to RowMajorBit -- don't rely on that
+  /** Align the matrix itself if it is vectorizable fixed-size */
+  AutoAlign = 0,
+  /** Don't require alignment for the matrix itself (the array of coefficients, if dynamically allocated, may still be requested to be aligned) */ // FIXME --- clarify the situation
+  DontAlign = 0x2
+};
+
+/** \ingroup enums
+  * Enum for specifying whether to apply or solve on the left or right. */
+enum {
+  /** Apply transformation on the left. */
+  OnTheLeft = 1,  
+  /** Apply transformation on the right. */
+  OnTheRight = 2  
+};
+
+/* the following used to be written as:
+ *
+ *   struct NoChange_t {};
+ *   namespace {
+ *     EIGEN_UNUSED NoChange_t NoChange;
+ *   }
+ *
+ * on the ground that it feels dangerous to disambiguate overloaded functions on enum/integer types.  
+ * However, this leads to "variable declared but never referenced" warnings on Intel Composer XE,
+ * and we do not know how to get rid of them (bug 450).
+ */
+
+enum NoChange_t   { NoChange };
+enum Sequential_t { Sequential };
+enum Default_t    { Default };
+
+/** \internal \ingroup enums
+  * Used in AmbiVector. */
+enum {
+  IsDense         = 0,
+  IsSparse
+};
+
+/** \ingroup enums
+  * Used as template parameter in DenseCoeffBase and MapBase to indicate 
+  * which accessors should be provided. */
+enum AccessorLevels {
+  /** Read-only access via a member function. */
+  ReadOnlyAccessors, 
+  /** Read/write access via member functions. */
+  WriteAccessors, 
+  /** Direct read-only access to the coefficients. */
+  DirectAccessors, 
+  /** Direct read/write access to the coefficients. */
+  DirectWriteAccessors
+};
+
+/** \ingroup enums
+  * Enum with options to give to various decompositions. */
+enum DecompositionOptions {
+  /** \internal Not used (meant for LDLT?). */
+  Pivoting            = 0x01, 
+  /** \internal Not used (meant for LDLT?). */
+  NoPivoting          = 0x02, 
+  /** Used in JacobiSVD to indicate that the square matrix U is to be computed. */
+  ComputeFullU        = 0x04,
+  /** Used in JacobiSVD to indicate that the thin matrix U is to be computed. */
+  ComputeThinU        = 0x08,
+  /** Used in JacobiSVD to indicate that the square matrix V is to be computed. */
+  ComputeFullV        = 0x10,
+  /** Used in JacobiSVD to indicate that the thin matrix V is to be computed. */
+  ComputeThinV        = 0x20,
+  /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
+    * that only the eigenvalues are to be computed and not the eigenvectors. */
+  EigenvaluesOnly     = 0x40,
+  /** Used in SelfAdjointEigenSolver and GeneralizedSelfAdjointEigenSolver to specify
+    * that both the eigenvalues and the eigenvectors are to be computed. */
+  ComputeEigenvectors = 0x80,
+  /** \internal */
+  EigVecMask = EigenvaluesOnly | ComputeEigenvectors,
+  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
+    * solve the generalized eigenproblem \f$ Ax = \lambda B x \f$. */
+  Ax_lBx              = 0x100,
+  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
+    * solve the generalized eigenproblem \f$ ABx = \lambda x \f$. */
+  ABx_lx              = 0x200,
+  /** Used in GeneralizedSelfAdjointEigenSolver to indicate that it should
+    * solve the generalized eigenproblem \f$ BAx = \lambda x \f$. */
+  BAx_lx              = 0x400,
+  /** \internal */
+  GenEigMask = Ax_lBx | ABx_lx | BAx_lx
+};
+
+/** \ingroup enums
+  * Possible values for the \p QRPreconditioner template parameter of JacobiSVD. */
+enum QRPreconditioners {
+  /** Do not specify what is to be done if the SVD of a non-square matrix is asked for. */
+  NoQRPreconditioner,
+  /** Use a QR decomposition without pivoting as the first step. */
+  HouseholderQRPreconditioner,
+  /** Use a QR decomposition with column pivoting as the first step. */
+  ColPivHouseholderQRPreconditioner,
+  /** Use a QR decomposition with full pivoting as the first step. */
+  FullPivHouseholderQRPreconditioner
+};
+
+#ifdef Success
+#error The preprocessor symbol 'Success' is defined, possibly by the X11 header file X.h
+#endif
+
+/** \ingroup enums
+  * Enum for reporting the status of a computation. */
+enum ComputationInfo {
+  /** Computation was successful. */
+  Success = 0,        
+  /** The provided data did not satisfy the prerequisites. */
+  NumericalIssue = 1, 
+  /** Iterative procedure did not converge. */
+  NoConvergence = 2,
+  /** The inputs are invalid, or the algorithm has been improperly called.
+    * When assertions are enabled, such errors trigger an assert. */
+  InvalidInput = 3
+};
+
+/** \ingroup enums
+  * Enum used to specify how a particular transformation is stored in a matrix.
+  * \sa Transform, Hyperplane::transform(). */
+enum TransformTraits {
+  /** Transformation is an isometry. */
+  Isometry      = 0x1,
+  /** Transformation is an affine transformation stored as a (Dim+1)^2 matrix whose last row is 
+    * assumed to be [0 ... 0 1]. */
+  Affine        = 0x2,
+  /** Transformation is an affine transformation stored as a (Dim) x (Dim+1) matrix. */
+  AffineCompact = 0x10 | Affine,
+  /** Transformation is a general projective transformation stored as a (Dim+1)^2 matrix. */
+  Projective    = 0x20
+};
+
+/** \internal \ingroup enums
+  * Enum used to choose between implementation depending on the computer architecture. */
+namespace Architecture
+{
+  enum Type {
+    Generic = 0x0,
+    SSE = 0x1,
+    AltiVec = 0x2,
+#if defined EIGEN_VECTORIZE_SSE
+    Target = SSE
+#elif defined EIGEN_VECTORIZE_ALTIVEC
+    Target = AltiVec
+#else
+    Target = Generic
+#endif
+  };
+}
+
+/** \internal \ingroup enums
+  * Enum used as template parameter in GeneralProduct. */
+enum { CoeffBasedProductMode, LazyCoeffBasedProductMode, OuterProduct, InnerProduct, GemvProduct, GemmProduct };
+
+/** \internal \ingroup enums
+  * Enum used in experimental parallel implementation. */
+enum Action {GetAction, SetAction};
+
+/** The type used to identify a dense storage. */
+struct Dense {};
+
+/** The type used to identify a matrix expression */
+struct MatrixXpr {};
+
+/** The type used to identify an array expression */
+struct ArrayXpr {};
+
+} // end namespace Eigen
+
+#endif // EIGEN_CONSTANTS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/DisableStupidWarnings.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/DisableStupidWarnings.h
new file mode 100644
index 0000000..6a0bf06
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/DisableStupidWarnings.h
@@ -0,0 +1,40 @@
+#ifndef EIGEN_WARNINGS_DISABLED
+#define EIGEN_WARNINGS_DISABLED
+
+#ifdef _MSC_VER
+  // 4100 - unreferenced formal parameter (occurred e.g. in aligned_allocator::destroy(pointer p))
+  // 4101 - unreferenced local variable
+  // 4127 - conditional expression is constant
+  // 4181 - qualifier applied to reference type ignored
+  // 4211 - nonstandard extension used : redefined extern to static
+  // 4244 - 'argument' : conversion from 'type1' to 'type2', possible loss of data
+  // 4273 - QtAlignedMalloc, inconsistent DLL linkage
+  // 4324 - structure was padded due to declspec(align())
+  // 4512 - assignment operator could not be generated
+  // 4522 - 'class' : multiple assignment operators specified
+  // 4700 - uninitialized local variable 'xyz' used
+  // 4717 - 'function' : recursive on all control paths, function will cause runtime stack overflow
+  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+    #pragma warning( push )
+  #endif
+  #pragma warning( disable : 4100 4101 4127 4181 4211 4244 4273 4324 4512 4522 4700 4717 )
+#elif defined __INTEL_COMPILER
+  // 2196 - routine is both "inline" and "noinline" ("noinline" assumed)
+  //        ICC 12 generates this warning even without any inline keyword, when defining class methods 'inline' i.e. inside of class body
+  //        typedef that may be a reference type.
+  // 279  - controlling expression is constant
+  //        ICC 12 generates this warning on assert(constant_expression_depending_on_template_params) and frankly this is a legitimate use case.
+  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+    #pragma warning push
+  #endif
+  #pragma warning disable 2196 279
+#elif defined __clang__
+  // -Wconstant-logical-operand - warning: use of logical && with constant operand; switch to bitwise & or remove constant
+  //     this is really a stupid warning as it warns on compile-time expressions involving enums
+  #ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+    #pragma clang diagnostic push
+  #endif
+  #pragma clang diagnostic ignored "-Wconstant-logical-operand"
+#endif
+
+#endif // not EIGEN_WARNINGS_DISABLED
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/ForwardDeclarations.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/ForwardDeclarations.h
new file mode 100644
index 0000000..d6a8145
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/ForwardDeclarations.h
@@ -0,0 +1,299 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FORWARDDECLARATIONS_H
+#define EIGEN_FORWARDDECLARATIONS_H
+
+namespace Eigen {
+namespace internal {
+
+template<typename T> struct traits;
+
+// here we say once and for all that traits<const T> == traits<T>
+// When constness must affect traits, it has to be constness on template parameters on which T itself depends.
+// For example, traits<Map<const T> > != traits<Map<T> >, but
+//              traits<const Map<T> > == traits<Map<T> >
+template<typename T> struct traits<const T> : traits<T> {};
+
+template<typename Derived> struct has_direct_access
+{
+  enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };
+};
+
+template<typename Derived> struct accessors_level
+{
+  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
+         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
+         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
+                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)
+  };
+};
+
+} // end namespace internal
+
+template<typename T> struct NumTraits;
+
+template<typename Derived> struct EigenBase;
+template<typename Derived> class DenseBase;
+template<typename Derived> class PlainObjectBase;
+
+
+template<typename Derived,
+         int Level = internal::accessors_level<Derived>::value >
+class DenseCoeffsBase;
+
+template<typename _Scalar, int _Rows, int _Cols,
+         int _Options = AutoAlign |
+#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
+    // workaround a bug in at least gcc 3.4.6
+    // the innermost ?: ternary operator is misparsed. We write it slightly
+    // differently and this makes gcc 3.4.6 happy, but it's ugly.
+    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
+    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
+                          ( (_Rows==1 && _Cols!=1) ? RowMajor
+                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
+                          : ColMajor ),
+#else
+                          ( (_Rows==1 && _Cols!=1) ? RowMajor
+                          : (_Cols==1 && _Rows!=1) ? ColMajor
+                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
+#endif
+         int _MaxRows = _Rows,
+         int _MaxCols = _Cols
+> class Matrix;
+
+template<typename Derived> class MatrixBase;
+template<typename Derived> class ArrayBase;
+
+template<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;
+template<typename ExpressionType, template <typename> class StorageBase > class NoAlias;
+template<typename ExpressionType> class NestByValue;
+template<typename ExpressionType> class ForceAlignedAccess;
+template<typename ExpressionType> class SwapWrapper;
+
+template<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false> class Block;
+
+template<typename MatrixType, int Size=Dynamic> class VectorBlock;
+template<typename MatrixType> class Transpose;
+template<typename MatrixType> class Conjugate;
+template<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;
+template<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;
+template<typename ViewOp,    typename MatrixType>         class CwiseUnaryView;
+template<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;
+template<typename BinOp,     typename Lhs, typename Rhs>  class SelfCwiseBinaryOp;
+template<typename Derived,   typename Lhs, typename Rhs>  class ProductBase;
+template<typename Lhs, typename Rhs, int Mode>            class GeneralProduct;
+template<typename Lhs, typename Rhs, int NestingFlags>    class CoeffBasedProduct;
+
+template<typename Derived> class DiagonalBase;
+template<typename _DiagonalVectorType> class DiagonalWrapper;
+template<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;
+template<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;
+template<typename MatrixType, int Index = 0> class Diagonal;
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;
+template<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;
+template<typename Derived> class PermutationBase;
+template<typename Derived> class TranspositionsBase;
+template<typename _IndicesType> class PermutationWrapper;
+template<typename _IndicesType> class TranspositionsWrapper;
+
+template<typename Derived,
+         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
+> class MapBase;
+template<int InnerStrideAtCompileTime, int OuterStrideAtCompileTime> class Stride;
+template<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;
+
+template<typename Derived> class TriangularBase;
+template<typename MatrixType, unsigned int Mode> class TriangularView;
+template<typename MatrixType, unsigned int Mode> class SelfAdjointView;
+template<typename MatrixType> class SparseView;
+template<typename ExpressionType> class WithFormat;
+template<typename MatrixType> struct CommaInitializer;
+template<typename Derived> class ReturnByValue;
+template<typename ExpressionType> class ArrayWrapper;
+template<typename ExpressionType> class MatrixWrapper;
+
+namespace internal {
+template<typename DecompositionType, typename Rhs> struct solve_retval_base;
+template<typename DecompositionType, typename Rhs> struct solve_retval;
+template<typename DecompositionType> struct kernel_retval_base;
+template<typename DecompositionType> struct kernel_retval;
+template<typename DecompositionType> struct image_retval_base;
+template<typename DecompositionType> struct image_retval;
+} // end namespace internal
+
+namespace internal {
+template<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;
+}
+
+namespace internal {
+template<typename Lhs, typename Rhs> struct product_type;
+}
+
+template<typename Lhs, typename Rhs,
+         int ProductType = internal::product_type<Lhs,Rhs>::value>
+struct ProductReturnType;
+
+// this is a workaround for sun CC
+template<typename Lhs, typename Rhs> struct LazyProductReturnType;
+
+namespace internal {
+
+// Provides scalar/packet-wise product and product with accumulation
+// with optional conjugation of the arguments.
+template<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;
+
+template<typename Scalar> struct scalar_sum_op;
+template<typename Scalar> struct scalar_difference_op;
+template<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
+template<typename Scalar> struct scalar_opposite_op;
+template<typename Scalar> struct scalar_conjugate_op;
+template<typename Scalar> struct scalar_real_op;
+template<typename Scalar> struct scalar_imag_op;
+template<typename Scalar> struct scalar_abs_op;
+template<typename Scalar> struct scalar_abs2_op;
+template<typename Scalar> struct scalar_sqrt_op;
+template<typename Scalar> struct scalar_exp_op;
+template<typename Scalar> struct scalar_log_op;
+template<typename Scalar> struct scalar_cos_op;
+template<typename Scalar> struct scalar_sin_op;
+template<typename Scalar> struct scalar_acos_op;
+template<typename Scalar> struct scalar_asin_op;
+template<typename Scalar> struct scalar_tan_op;
+template<typename Scalar> struct scalar_pow_op;
+template<typename Scalar> struct scalar_inverse_op;
+template<typename Scalar> struct scalar_square_op;
+template<typename Scalar> struct scalar_cube_op;
+template<typename Scalar, typename NewType> struct scalar_cast_op;
+template<typename Scalar> struct scalar_multiple_op;
+template<typename Scalar> struct scalar_quotient1_op;
+template<typename Scalar> struct scalar_min_op;
+template<typename Scalar> struct scalar_max_op;
+template<typename Scalar> struct scalar_random_op;
+template<typename Scalar> struct scalar_add_op;
+template<typename Scalar> struct scalar_constant_op;
+template<typename Scalar> struct scalar_identity_op;
+
+template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
+template<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
+template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
+
+} // end namespace internal
+
+struct IOFormat;
+
+// Array module
+template<typename _Scalar, int _Rows, int _Cols,
+         int _Options = AutoAlign |
+#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
+    // workaround a bug in at least gcc 3.4.6
+    // the innermost ?: ternary operator is misparsed. We write it slightly
+    // differently and this makes gcc 3.4.6 happy, but it's ugly.
+    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
+    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
+                          ( (_Rows==1 && _Cols!=1) ? RowMajor
+                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
+                          : ColMajor ),
+#else
+                          ( (_Rows==1 && _Cols!=1) ? RowMajor
+                          : (_Cols==1 && _Rows!=1) ? ColMajor
+                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
+#endif
+         int _MaxRows = _Rows, int _MaxCols = _Cols> class Array;
+template<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;
+template<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;
+template<typename ExpressionType, int Direction> class VectorwiseOp;
+template<typename MatrixType,int RowFactor,int ColFactor> class Replicate;
+template<typename MatrixType, int Direction = BothDirections> class Reverse;
+
+template<typename MatrixType> class FullPivLU;
+template<typename MatrixType> class PartialPivLU;
+namespace internal {
+template<typename MatrixType> struct inverse_impl;
+}
+template<typename MatrixType> class HouseholderQR;
+template<typename MatrixType> class ColPivHouseholderQR;
+template<typename MatrixType> class FullPivHouseholderQR;
+template<typename MatrixType, int QRPreconditioner = ColPivHouseholderQRPreconditioner> class JacobiSVD;
+template<typename MatrixType, int UpLo = Lower> class LLT;
+template<typename MatrixType, int UpLo = Lower> class LDLT;
+template<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;
+template<typename Scalar>     class JacobiRotation;
+
+// Geometry module:
+template<typename Derived, int _Dim> class RotationBase;
+template<typename Lhs, typename Rhs> class Cross;
+template<typename Derived> class QuaternionBase;
+template<typename Scalar> class Rotation2D;
+template<typename Scalar> class AngleAxis;
+template<typename Scalar,int Dim> class Translation;
+
+#ifdef EIGEN2_SUPPORT
+template<typename Derived, int _Dim> class eigen2_RotationBase;
+template<typename Lhs, typename Rhs> class eigen2_Cross;
+template<typename Scalar> class eigen2_Quaternion;
+template<typename Scalar> class eigen2_Rotation2D;
+template<typename Scalar> class eigen2_AngleAxis;
+template<typename Scalar,int Dim> class eigen2_Transform;
+template <typename _Scalar, int _AmbientDim> class eigen2_ParametrizedLine;
+template <typename _Scalar, int _AmbientDim> class eigen2_Hyperplane;
+template<typename Scalar,int Dim> class eigen2_Translation;
+template<typename Scalar,int Dim> class eigen2_Scaling;
+#endif
+
+#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
+template<typename Scalar> class Quaternion;
+template<typename Scalar,int Dim> class Transform;
+template <typename _Scalar, int _AmbientDim> class ParametrizedLine;
+template <typename _Scalar, int _AmbientDim> class Hyperplane;
+template<typename Scalar,int Dim> class Scaling;
+#endif
+
+#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+template<typename Scalar, int Options = AutoAlign> class Quaternion;
+template<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;
+template <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;
+template <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;
+template<typename Scalar> class UniformScaling;
+template<typename MatrixType,int Direction> class Homogeneous;
+#endif
+
+// MatrixFunctions module
+template<typename Derived> struct MatrixExponentialReturnValue;
+template<typename Derived> class MatrixFunctionReturnValue;
+template<typename Derived> class MatrixSquareRootReturnValue;
+template<typename Derived> class MatrixLogarithmReturnValue;
+template<typename Derived> class MatrixPowerReturnValue;
+template<typename Derived, typename Lhs, typename Rhs> class MatrixPowerProduct;
+
+namespace internal {
+template <typename Scalar>
+struct stem_function
+{
+  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+  typedef ComplexScalar type(ComplexScalar, int);
+};
+}
+
+
+#ifdef EIGEN2_SUPPORT
+template<typename ExpressionType> class Cwise;
+template<typename MatrixType> class Minor;
+template<typename MatrixType> class LU;
+template<typename MatrixType> class QR;
+template<typename MatrixType> class SVD;
+namespace internal {
+template<typename MatrixType, unsigned int Mode> struct eigen2_part_return_type;
+}
+#endif
+
+} // end namespace Eigen
+
+#endif // EIGEN_FORWARDDECLARATIONS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/MKL_support.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/MKL_support.h
new file mode 100644
index 0000000..1e6e355
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/MKL_support.h
@@ -0,0 +1,109 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *   Include file with common MKL declarations
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_MKL_SUPPORT_H
+#define EIGEN_MKL_SUPPORT_H
+
+#ifdef EIGEN_USE_MKL_ALL
+  #ifndef EIGEN_USE_BLAS
+    #define EIGEN_USE_BLAS
+  #endif
+  #ifndef EIGEN_USE_LAPACKE
+    #define EIGEN_USE_LAPACKE
+  #endif
+  #ifndef EIGEN_USE_MKL_VML
+    #define EIGEN_USE_MKL_VML
+  #endif
+#endif
+
+#ifdef EIGEN_USE_LAPACKE_STRICT
+  #define EIGEN_USE_LAPACKE
+#endif
+
+#if defined(EIGEN_USE_BLAS) || defined(EIGEN_USE_LAPACKE) || defined(EIGEN_USE_MKL_VML)
+  #define EIGEN_USE_MKL
+#endif
+
+#if defined EIGEN_USE_MKL
+
+#include <mkl.h>
+#include <mkl_lapacke.h>
+#define EIGEN_MKL_VML_THRESHOLD 128
+
+namespace Eigen {
+
+typedef std::complex<double> dcomplex;
+typedef std::complex<float>  scomplex;
+
+namespace internal {
+
+template<typename MKLType, typename EigenType>
+static inline void assign_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {
+  mklScalar=eigenScalar;
+}
+
+template<typename MKLType, typename EigenType>
+static inline void assign_conj_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {
+  mklScalar=eigenScalar;
+}
+
+template <>
+inline void assign_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {
+  mklScalar.real=eigenScalar.real();
+  mklScalar.imag=eigenScalar.imag();
+}
+
+template <>
+inline void assign_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {
+  mklScalar.real=eigenScalar.real();
+  mklScalar.imag=eigenScalar.imag();
+}
+
+template <>
+inline void assign_conj_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {
+  mklScalar.real=eigenScalar.real();
+  mklScalar.imag=-eigenScalar.imag();
+}
+
+template <>
+inline void assign_conj_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {
+  mklScalar.real=eigenScalar.real();
+  mklScalar.imag=-eigenScalar.imag();
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif
+
+#endif // EIGEN_MKL_SUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/Macros.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/Macros.h
new file mode 100644
index 0000000..2368c89
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/Macros.h
@@ -0,0 +1,416 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MACROS_H
+#define EIGEN_MACROS_H
+
+#define EIGEN_WORLD_VERSION 3
+#define EIGEN_MAJOR_VERSION 1
+#define EIGEN_MINOR_VERSION 91
+
+#define EIGEN_VERSION_AT_LEAST(x,y,z) (EIGEN_WORLD_VERSION>x || (EIGEN_WORLD_VERSION>=x && \
+                                      (EIGEN_MAJOR_VERSION>y || (EIGEN_MAJOR_VERSION>=y && \
+                                                                 EIGEN_MINOR_VERSION>=z))))
+#ifdef __GNUC__
+  #define EIGEN_GNUC_AT_LEAST(x,y) ((__GNUC__==x && __GNUC_MINOR__>=y) || __GNUC__>x)
+#else
+  #define EIGEN_GNUC_AT_LEAST(x,y) 0
+#endif
+ 
+#ifdef __GNUC__
+  #define EIGEN_GNUC_AT_MOST(x,y) ((__GNUC__==x && __GNUC_MINOR__<=y) || __GNUC__<x)
+#else
+  #define EIGEN_GNUC_AT_MOST(x,y) 0
+#endif
+
+#if EIGEN_GNUC_AT_MOST(4,3) && !defined(__clang__)
+  // see bug 89
+  #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 0
+#else
+  #define EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO 1
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ <= 3)
+#define EIGEN_GCC3_OR_OLDER 1
+#else
+#define EIGEN_GCC3_OR_OLDER 0
+#endif
+
+// 16 byte alignment is only useful for vectorization. Since it affects the ABI, we need to enable
+// 16 byte alignment on all platforms where vectorization might be enabled. In theory we could always
+// enable alignment, but it can be a cause of problems on some platforms, so we just disable it in
+// certain common platform (compiler+architecture combinations) to avoid these problems.
+// Only static alignment is really problematic (relies on nonstandard compiler extensions that don't
+// work everywhere, for example don't work on GCC/ARM), try to keep heap alignment even
+// when we have to disable static alignment.
+#if defined(__GNUC__) && !(defined(__i386__) || defined(__x86_64__) || defined(__powerpc__) || defined(__ppc__) || defined(__ia64__))
+#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 1
+#else
+#define EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT 0
+#endif
+
+// static alignment is completely disabled with GCC 3, Sun Studio, and QCC/QNX
+#if !EIGEN_GCC_AND_ARCH_DOESNT_WANT_STACK_ALIGNMENT \
+ && !EIGEN_GCC3_OR_OLDER \
+ && !defined(__SUNPRO_CC) \
+ && !defined(__QNXNTO__)
+  #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 1
+#else
+  #define EIGEN_ARCH_WANTS_STACK_ALIGNMENT 0
+#endif
+
+#ifdef EIGEN_DONT_ALIGN
+  #ifndef EIGEN_DONT_ALIGN_STATICALLY
+    #define EIGEN_DONT_ALIGN_STATICALLY
+  #endif
+  #define EIGEN_ALIGN 0
+#else
+  #define EIGEN_ALIGN 1
+#endif
+
+// EIGEN_ALIGN_STATICALLY is the true test whether we want to align arrays on the stack or not. It takes into account both the user choice to explicitly disable
+// alignment (EIGEN_DONT_ALIGN_STATICALLY) and the architecture config (EIGEN_ARCH_WANTS_STACK_ALIGNMENT). Henceforth, only EIGEN_ALIGN_STATICALLY should be used.
+#if EIGEN_ARCH_WANTS_STACK_ALIGNMENT && !defined(EIGEN_DONT_ALIGN_STATICALLY)
+  #define EIGEN_ALIGN_STATICALLY 1
+#else
+  #define EIGEN_ALIGN_STATICALLY 0
+  #ifndef EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
+    #define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT
+  #endif
+#endif
+
+#ifdef EIGEN_DEFAULT_TO_ROW_MAJOR
+#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION RowMajor
+#else
+#define EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ColMajor
+#endif
+
+#ifndef EIGEN_DEFAULT_DENSE_INDEX_TYPE
+#define EIGEN_DEFAULT_DENSE_INDEX_TYPE std::ptrdiff_t
+#endif
+
+/** Allows to disable some optimizations which might affect the accuracy of the result.
+  * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them.
+  * They currently include:
+  *   - single precision Cwise::sin() and Cwise::cos() when SSE vectorization is enabled.
+  */
+#ifndef EIGEN_FAST_MATH
+#define EIGEN_FAST_MATH 1
+#endif
+
+#define EIGEN_DEBUG_VAR(x) std::cerr << #x << " = " << x << std::endl;
+
+// concatenate two tokens
+#define EIGEN_CAT2(a,b) a ## b
+#define EIGEN_CAT(a,b) EIGEN_CAT2(a,b)
+
+// convert a token to a string
+#define EIGEN_MAKESTRING2(a) #a
+#define EIGEN_MAKESTRING(a) EIGEN_MAKESTRING2(a)
+
+// EIGEN_STRONG_INLINE is a stronger version of the inline, using __forceinline on MSVC,
+// but it still doesn't use GCC's always_inline. This is useful in (common) situations where MSVC needs forceinline
+// but GCC is still doing fine with just inline.
+#if (defined _MSC_VER) || (defined __INTEL_COMPILER)
+#define EIGEN_STRONG_INLINE __forceinline
+#else
+#define EIGEN_STRONG_INLINE inline
+#endif
+
+// EIGEN_ALWAYS_INLINE is the stronget, it has the effect of making the function inline and adding every possible
+// attribute to maximize inlining. This should only be used when really necessary: in particular,
+// it uses __attribute__((always_inline)) on GCC, which most of the time is useless and can severely harm compile times.
+// FIXME with the always_inline attribute,
+// gcc 3.4.x reports the following compilation error:
+//   Eval.h:91: sorry, unimplemented: inlining failed in call to 'const Eigen::Eval<Derived> Eigen::MatrixBase<Scalar, Derived>::eval() const'
+//    : function body not available
+#if EIGEN_GNUC_AT_LEAST(4,0)
+#define EIGEN_ALWAYS_INLINE __attribute__((always_inline)) inline
+#else
+#define EIGEN_ALWAYS_INLINE EIGEN_STRONG_INLINE
+#endif
+
+#if (defined __GNUC__)
+#define EIGEN_DONT_INLINE __attribute__((noinline))
+#elif (defined _MSC_VER)
+#define EIGEN_DONT_INLINE __declspec(noinline)
+#else
+#define EIGEN_DONT_INLINE
+#endif
+
+#if (defined __GNUC__)
+#define EIGEN_PERMISSIVE_EXPR __extension__
+#else
+#define EIGEN_PERMISSIVE_EXPR
+#endif
+
+// this macro allows to get rid of linking errors about multiply defined functions.
+//  - static is not very good because it prevents definitions from different object files to be merged.
+//           So static causes the resulting linked executable to be bloated with multiple copies of the same function.
+//  - inline is not perfect either as it unwantedly hints the compiler toward inlining the function.
+#define EIGEN_DECLARE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
+#define EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS inline
+
+#ifdef NDEBUG
+# ifndef EIGEN_NO_DEBUG
+#  define EIGEN_NO_DEBUG
+# endif
+#endif
+
+// eigen_plain_assert is where we implement the workaround for the assert() bug in GCC <= 4.3, see bug 89
+#ifdef EIGEN_NO_DEBUG
+  #define eigen_plain_assert(x)
+#else
+  #if EIGEN_SAFE_TO_USE_STANDARD_ASSERT_MACRO
+    namespace Eigen {
+    namespace internal {
+    inline bool copy_bool(bool b) { return b; }
+    }
+    }
+    #define eigen_plain_assert(x) assert(x)
+  #else
+    // work around bug 89
+    #include <cstdlib>   // for abort
+    #include <iostream>  // for std::cerr
+
+    namespace Eigen {
+    namespace internal {
+    // trivial function copying a bool. Must be EIGEN_DONT_INLINE, so we implement it after including Eigen headers.
+    // see bug 89.
+    namespace {
+    EIGEN_DONT_INLINE bool copy_bool(bool b) { return b; }
+    }
+    inline void assert_fail(const char *condition, const char *function, const char *file, int line)
+    {
+      std::cerr << "assertion failed: " << condition << " in function " << function << " at " << file << ":" << line << std::endl;
+      abort();
+    }
+    }
+    }
+    #define eigen_plain_assert(x) \
+      do { \
+        if(!Eigen::internal::copy_bool(x)) \
+          Eigen::internal::assert_fail(EIGEN_MAKESTRING(x), __PRETTY_FUNCTION__, __FILE__, __LINE__); \
+      } while(false)
+  #endif
+#endif
+
+// eigen_assert can be overridden
+#ifndef eigen_assert
+#define eigen_assert(x) eigen_plain_assert(x)
+#endif
+
+#ifdef EIGEN_INTERNAL_DEBUGGING
+#define eigen_internal_assert(x) eigen_assert(x)
+#else
+#define eigen_internal_assert(x)
+#endif
+
+#ifdef EIGEN_NO_DEBUG
+#define EIGEN_ONLY_USED_FOR_DEBUG(x) (void)x
+#else
+#define EIGEN_ONLY_USED_FOR_DEBUG(x)
+#endif
+
+#ifndef EIGEN_NO_DEPRECATED_WARNING
+  #if (defined __GNUC__)
+    #define EIGEN_DEPRECATED __attribute__((deprecated))
+  #elif (defined _MSC_VER)
+    #define EIGEN_DEPRECATED __declspec(deprecated)
+  #else
+    #define EIGEN_DEPRECATED
+  #endif
+#else
+  #define EIGEN_DEPRECATED
+#endif
+
+#if (defined __GNUC__)
+#define EIGEN_UNUSED __attribute__((unused))
+#else
+#define EIGEN_UNUSED
+#endif
+
+// Suppresses 'unused variable' warnings.
+#define EIGEN_UNUSED_VARIABLE(var) (void)var;
+
+#if !defined(EIGEN_ASM_COMMENT) && (defined __GNUC__)
+#define EIGEN_ASM_COMMENT(X)  asm("#" X)
+#else
+#define EIGEN_ASM_COMMENT(X)
+#endif
+
+/* EIGEN_ALIGN_TO_BOUNDARY(n) forces data to be n-byte aligned. This is used to satisfy SIMD requirements.
+ * However, we do that EVEN if vectorization (EIGEN_VECTORIZE) is disabled,
+ * so that vectorization doesn't affect binary compatibility.
+ *
+ * If we made alignment depend on whether or not EIGEN_VECTORIZE is defined, it would be impossible to link
+ * vectorized and non-vectorized code.
+ */
+#if (defined __GNUC__) || (defined __PGI) || (defined __IBMCPP__) || (defined __ARMCC_VERSION)
+  #define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))
+#elif (defined _MSC_VER)
+  #define EIGEN_ALIGN_TO_BOUNDARY(n) __declspec(align(n))
+#elif (defined __SUNPRO_CC)
+  // FIXME not sure about this one:
+  #define EIGEN_ALIGN_TO_BOUNDARY(n) __attribute__((aligned(n)))
+#else
+  #error Please tell me what is the equivalent of __attribute__((aligned(n))) for your compiler
+#endif
+
+#define EIGEN_ALIGN16 EIGEN_ALIGN_TO_BOUNDARY(16)
+
+#if EIGEN_ALIGN_STATICALLY
+#define EIGEN_USER_ALIGN_TO_BOUNDARY(n) EIGEN_ALIGN_TO_BOUNDARY(n)
+#define EIGEN_USER_ALIGN16 EIGEN_ALIGN16
+#else
+#define EIGEN_USER_ALIGN_TO_BOUNDARY(n)
+#define EIGEN_USER_ALIGN16
+#endif
+
+#ifdef EIGEN_DONT_USE_RESTRICT_KEYWORD
+  #define EIGEN_RESTRICT
+#endif
+#ifndef EIGEN_RESTRICT
+  #define EIGEN_RESTRICT __restrict
+#endif
+
+#ifndef EIGEN_STACK_ALLOCATION_LIMIT
+#define EIGEN_STACK_ALLOCATION_LIMIT 20000
+#endif
+
+#ifndef EIGEN_DEFAULT_IO_FORMAT
+#ifdef EIGEN_MAKING_DOCS
+// format used in Eigen's documentation
+// needed to define it here as escaping characters in CMake add_definition's argument seems very problematic.
+#define EIGEN_DEFAULT_IO_FORMAT Eigen::IOFormat(3, 0, " ", "\n", "", "")
+#else
+#define EIGEN_DEFAULT_IO_FORMAT Eigen::IOFormat()
+#endif
+#endif
+
+// just an empty macro !
+#define EIGEN_EMPTY
+
+#if defined(_MSC_VER) && (!defined(__INTEL_COMPILER))
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
+  using Base::operator =;
+#elif defined(__clang__) // workaround clang bug (see http://forum.kde.org/viewtopic.php?f=74&t=102653)
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
+  using Base::operator =; \
+  EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) { Base::operator=(other); return *this; } \
+  template <typename OtherDerived> \
+  EIGEN_STRONG_INLINE Derived& operator=(const DenseBase<OtherDerived>& other) { Base::operator=(other.derived()); return *this; }
+#else
+#define EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived) \
+  using Base::operator =; \
+  EIGEN_STRONG_INLINE Derived& operator=(const Derived& other) \
+  { \
+    Base::operator=(other); \
+    return *this; \
+  }
+#endif
+
+#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
+  EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Derived)
+
+/**
+* Just a side note. Commenting within defines works only by documenting
+* behind the object (via '!<'). Comments cannot be multi-line and thus
+* we have these extra long lines. What is confusing doxygen over here is
+* that we use '\' and basically have a bunch of typedefs with their
+* documentation in a single line.
+**/
+
+#define EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
+  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; /*!< \brief Numeric type, e.g. float, double, int or std::complex<float>. */ \
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \brief The underlying numeric type for composed scalar types. \details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \
+  typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \
+  typedef typename Eigen::internal::nested<Derived>::type Nested; \
+  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \
+  typedef typename Eigen::internal::traits<Derived>::Index Index; \
+  enum { RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime, \
+        ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime, \
+        Flags = Eigen::internal::traits<Derived>::Flags, \
+        CoeffReadCost = Eigen::internal::traits<Derived>::CoeffReadCost, \
+        SizeAtCompileTime = Base::SizeAtCompileTime, \
+        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \
+        IsVectorAtCompileTime = Base::IsVectorAtCompileTime };
+
+
+#define EIGEN_DENSE_PUBLIC_INTERFACE(Derived) \
+  typedef typename Eigen::internal::traits<Derived>::Scalar Scalar; /*!< \brief Numeric type, e.g. float, double, int or std::complex<float>. */ \
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; /*!< \brief The underlying numeric type for composed scalar types. \details In cases where Scalar is e.g. std::complex<T>, T were corresponding to RealScalar. */ \
+  typedef typename Base::PacketScalar PacketScalar; \
+  typedef typename Base::CoeffReturnType CoeffReturnType; /*!< \brief The return type for coefficient access. \details Depending on whether the object allows direct coefficient access (e.g. for a MatrixXd), this type is either 'const Scalar&' or simply 'Scalar' for objects that do not allow direct coefficient access. */ \
+  typedef typename Eigen::internal::nested<Derived>::type Nested; \
+  typedef typename Eigen::internal::traits<Derived>::StorageKind StorageKind; \
+  typedef typename Eigen::internal::traits<Derived>::Index Index; \
+  enum { RowsAtCompileTime = Eigen::internal::traits<Derived>::RowsAtCompileTime, \
+        ColsAtCompileTime = Eigen::internal::traits<Derived>::ColsAtCompileTime, \
+        MaxRowsAtCompileTime = Eigen::internal::traits<Derived>::MaxRowsAtCompileTime, \
+        MaxColsAtCompileTime = Eigen::internal::traits<Derived>::MaxColsAtCompileTime, \
+        Flags = Eigen::internal::traits<Derived>::Flags, \
+        CoeffReadCost = Eigen::internal::traits<Derived>::CoeffReadCost, \
+        SizeAtCompileTime = Base::SizeAtCompileTime, \
+        MaxSizeAtCompileTime = Base::MaxSizeAtCompileTime, \
+        IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \
+  using Base::derived; \
+  using Base::const_cast_derived;
+
+
+#define EIGEN_PLAIN_ENUM_MIN(a,b) (((int)a <= (int)b) ? (int)a : (int)b)
+#define EIGEN_PLAIN_ENUM_MAX(a,b) (((int)a >= (int)b) ? (int)a : (int)b)
+
+// EIGEN_SIZE_MIN_PREFER_DYNAMIC gives the min between compile-time sizes. 0 has absolute priority, followed by 1,
+// followed by Dynamic, followed by other finite values. The reason for giving Dynamic the priority over
+// finite values is that min(3, Dynamic) should be Dynamic, since that could be anything between 0 and 3.
+#define EIGEN_SIZE_MIN_PREFER_DYNAMIC(a,b) (((int)a == 0 || (int)b == 0) ? 0 \
+                           : ((int)a == 1 || (int)b == 1) ? 1 \
+                           : ((int)a == Dynamic || (int)b == Dynamic) ? Dynamic \
+                           : ((int)a <= (int)b) ? (int)a : (int)b)
+
+// EIGEN_SIZE_MIN_PREFER_FIXED is a variant of EIGEN_SIZE_MIN_PREFER_DYNAMIC comparing MaxSizes. The difference is that finite values
+// now have priority over Dynamic, so that min(3, Dynamic) gives 3. Indeed, whatever the actual value is
+// (between 0 and 3), it is not more than 3.
+#define EIGEN_SIZE_MIN_PREFER_FIXED(a,b)  (((int)a == 0 || (int)b == 0) ? 0 \
+                           : ((int)a == 1 || (int)b == 1) ? 1 \
+                           : ((int)a == Dynamic && (int)b == Dynamic) ? Dynamic \
+                           : ((int)a == Dynamic) ? (int)b \
+                           : ((int)b == Dynamic) ? (int)a \
+                           : ((int)a <= (int)b) ? (int)a : (int)b)
+
+// see EIGEN_SIZE_MIN_PREFER_DYNAMIC. No need for a separate variant for MaxSizes here.
+#define EIGEN_SIZE_MAX(a,b) (((int)a == Dynamic || (int)b == Dynamic) ? Dynamic \
+                           : ((int)a >= (int)b) ? (int)a : (int)b)
+
+#define EIGEN_LOGICAL_XOR(a,b) (((a) || (b)) && !((a) && (b)))
+
+#define EIGEN_IMPLIES(a,b) (!(a) || (b))
+
+#define EIGEN_MAKE_CWISE_BINARY_OP(METHOD,FUNCTOR) \
+  template<typename OtherDerived> \
+  EIGEN_STRONG_INLINE const CwiseBinaryOp<FUNCTOR<Scalar>, const Derived, const OtherDerived> \
+  (METHOD)(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const \
+  { \
+    return CwiseBinaryOp<FUNCTOR<Scalar>, const Derived, const OtherDerived>(derived(), other.derived()); \
+  }
+
+// the expression type of a cwise product
+#define EIGEN_CWISE_PRODUCT_RETURN_TYPE(LHS,RHS) \
+    CwiseBinaryOp< \
+      internal::scalar_product_op< \
+          typename internal::traits<LHS>::Scalar, \
+          typename internal::traits<RHS>::Scalar \
+      >, \
+      const LHS, \
+      const RHS \
+    >
+
+#endif // EIGEN_MACROS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/Memory.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/Memory.h
new file mode 100644
index 0000000..3ca666f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/Memory.h
@@ -0,0 +1,974 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2008-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Kenneth Riddile <kfriddile at yahoo.com>
+// Copyright (C) 2010 Hauke Heibel <hauke.heibel at gmail.com>
+// Copyright (C) 2010 Thomas Capricelli <orzel at freehackers.org>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+/*****************************************************************************
+*** Platform checks for aligned malloc functions                           ***
+*****************************************************************************/
+
+#ifndef EIGEN_MEMORY_H
+#define EIGEN_MEMORY_H
+
+#ifndef EIGEN_MALLOC_ALREADY_ALIGNED
+
+// Try to determine automatically if malloc is already aligned.
+
+// On 64-bit systems, glibc's malloc returns 16-byte-aligned pointers, see:
+//   http://www.gnu.org/s/libc/manual/html_node/Aligned-Memory-Blocks.html
+// This is true at least since glibc 2.8.
+// This leaves the question how to detect 64-bit. According to this document,
+//   http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf
+// page 114, "[The] LP64 model [...] is used by all 64-bit UNIX ports" so it's indeed
+// quite safe, at least within the context of glibc, to equate 64-bit with LP64.
+#if defined(__GLIBC__) && ((__GLIBC__>=2 && __GLIBC_MINOR__ >= 8) || __GLIBC__>2) \
+ && defined(__LP64__) && ! defined( __SANITIZE_ADDRESS__ )
+  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 1
+#else
+  #define EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED 0
+#endif
+
+// FreeBSD 6 seems to have 16-byte aligned malloc
+//   See http://svn.freebsd.org/viewvc/base/stable/6/lib/libc/stdlib/malloc.c?view=markup
+// FreeBSD 7 seems to have 16-byte aligned malloc except on ARM and MIPS architectures
+//   See http://svn.freebsd.org/viewvc/base/stable/7/lib/libc/stdlib/malloc.c?view=markup
+#if defined(__FreeBSD__) && !defined(__arm__) && !defined(__mips__)
+  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 1
+#else
+  #define EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED 0
+#endif
+
+#if defined(__APPLE__) \
+ || defined(_WIN64) \
+ || EIGEN_GLIBC_MALLOC_ALREADY_ALIGNED \
+ || EIGEN_FREEBSD_MALLOC_ALREADY_ALIGNED
+  #define EIGEN_MALLOC_ALREADY_ALIGNED 1
+#else
+  #define EIGEN_MALLOC_ALREADY_ALIGNED 0
+#endif
+
+#endif
+
+#if ((defined __QNXNTO__) || (defined _GNU_SOURCE) || ((defined _XOPEN_SOURCE) && (_XOPEN_SOURCE >= 600))) \
+ && (defined _POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO > 0)
+  #define EIGEN_HAS_POSIX_MEMALIGN 1
+#else
+  #define EIGEN_HAS_POSIX_MEMALIGN 0
+#endif
+
+#ifdef EIGEN_VECTORIZE_SSE
+  #define EIGEN_HAS_MM_MALLOC 1
+#else
+  #define EIGEN_HAS_MM_MALLOC 0
+#endif
+
+namespace Eigen {
+
+namespace internal {
+
+inline void throw_std_bad_alloc()
+{
+  #ifdef EIGEN_EXCEPTIONS
+    throw std::bad_alloc();
+  #else
+    std::size_t huge = -1;
+    new int[huge];
+  #endif
+}
+
+/*****************************************************************************
+*** Implementation of handmade aligned functions                           ***
+*****************************************************************************/
+
+/* ----- Hand made implementations of aligned malloc/free and realloc ----- */
+
+/** \internal Like malloc, but the returned pointer is guaranteed to be 16-byte aligned.
+  * Fast, but wastes 16 additional bytes of memory. Does not throw any exception.
+  */
+inline void* handmade_aligned_malloc(std::size_t size)
+{
+  void *original = std::malloc(size+16);
+  if (original == 0) return 0;
+  void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(15))) + 16);
+  *(reinterpret_cast<void**>(aligned) - 1) = original;
+  return aligned;
+}
+
+/** \internal Frees memory allocated with handmade_aligned_malloc */
+inline void handmade_aligned_free(void *ptr)
+{
+  if (ptr) std::free(*(reinterpret_cast<void**>(ptr) - 1));
+}
+
+/** \internal
+  * \brief Reallocates aligned memory.
+  * Since we know that our handmade version is based on std::realloc
+  * we can use std::realloc to implement efficient reallocation.
+  */
+inline void* handmade_aligned_realloc(void* ptr, std::size_t size, std::size_t = 0)
+{
+  if (ptr == 0) return handmade_aligned_malloc(size);
+  void *original = *(reinterpret_cast<void**>(ptr) - 1);
+  std::ptrdiff_t previous_offset = static_cast<char *>(ptr)-static_cast<char *>(original);
+  original = std::realloc(original,size+16);
+  if (original == 0) return 0;
+  void *aligned = reinterpret_cast<void*>((reinterpret_cast<std::size_t>(original) & ~(std::size_t(15))) + 16);
+  void *previous_aligned = static_cast<char *>(original)+previous_offset;
+  if(aligned!=previous_aligned)
+    std::memmove(aligned, previous_aligned, size);
+  
+  *(reinterpret_cast<void**>(aligned) - 1) = original;
+  return aligned;
+}
+
+/*****************************************************************************
+*** Implementation of generic aligned realloc (when no realloc can be used)***
+*****************************************************************************/
+
+void* aligned_malloc(std::size_t size);
+void  aligned_free(void *ptr);
+
+/** \internal
+  * \brief Reallocates aligned memory.
+  * Allows reallocation with aligned ptr types. This implementation will
+  * always create a new memory chunk and copy the old data.
+  */
+inline void* generic_aligned_realloc(void* ptr, size_t size, size_t old_size)
+{
+  if (ptr==0)
+    return aligned_malloc(size);
+
+  if (size==0)
+  {
+    aligned_free(ptr);
+    return 0;
+  }
+
+  void* newptr = aligned_malloc(size);
+  if (newptr == 0)
+  {
+    #ifdef EIGEN_HAS_ERRNO
+    errno = ENOMEM; // according to the standard
+    #endif
+    return 0;
+  }
+
+  if (ptr != 0)
+  {
+    std::memcpy(newptr, ptr, (std::min)(size,old_size));
+    aligned_free(ptr);
+  }
+
+  return newptr;
+}
+
+/*****************************************************************************
+*** Implementation of portable aligned versions of malloc/free/realloc     ***
+*****************************************************************************/
+
+#ifdef EIGEN_NO_MALLOC
+inline void check_that_malloc_is_allowed()
+{
+  eigen_assert(false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)");
+}
+#elif defined EIGEN_RUNTIME_NO_MALLOC
+inline bool is_malloc_allowed_impl(bool update, bool new_value = false)
+{
+  static bool value = true;
+  if (update == 1)
+    value = new_value;
+  return value;
+}
+inline bool is_malloc_allowed() { return is_malloc_allowed_impl(false); }
+inline bool set_is_malloc_allowed(bool new_value) { return is_malloc_allowed_impl(true, new_value); }
+inline void check_that_malloc_is_allowed()
+{
+  eigen_assert(is_malloc_allowed() && "heap allocation is forbidden (EIGEN_RUNTIME_NO_MALLOC is defined and g_is_malloc_allowed is false)");
+}
+#else 
+inline void check_that_malloc_is_allowed()
+{}
+#endif
+
+/** \internal Allocates \a size bytes. The returned pointer is guaranteed to have 16 bytes alignment.
+  * On allocation error, the returned pointer is null, and std::bad_alloc is thrown.
+  */
+inline void* aligned_malloc(size_t size)
+{
+  check_that_malloc_is_allowed();
+
+  void *result;
+  #if !EIGEN_ALIGN
+    result = std::malloc(size);
+  #elif EIGEN_MALLOC_ALREADY_ALIGNED
+    result = std::malloc(size);
+  #elif EIGEN_HAS_POSIX_MEMALIGN
+    if(posix_memalign(&result, 16, size)) result = 0;
+  #elif EIGEN_HAS_MM_MALLOC
+    result = _mm_malloc(size, 16);
+#elif defined(_MSC_VER) && (!defined(_WIN32_WCE))
+    result = _aligned_malloc(size, 16);
+  #else
+    result = handmade_aligned_malloc(size);
+  #endif
+
+  if(!result && size)
+    throw_std_bad_alloc();
+
+  return result;
+}
+
+/** \internal Frees memory allocated with aligned_malloc. */
+inline void aligned_free(void *ptr)
+{
+  #if !EIGEN_ALIGN
+    std::free(ptr);
+  #elif EIGEN_MALLOC_ALREADY_ALIGNED
+    std::free(ptr);
+  #elif EIGEN_HAS_POSIX_MEMALIGN
+    std::free(ptr);
+  #elif EIGEN_HAS_MM_MALLOC
+    _mm_free(ptr);
+  #elif defined(_MSC_VER) && (!defined(_WIN32_WCE))
+    _aligned_free(ptr);
+  #else
+    handmade_aligned_free(ptr);
+  #endif
+}
+
+/**
+* \internal
+* \brief Reallocates an aligned block of memory.
+* \throws std::bad_alloc on allocation failure
+**/
+inline void* aligned_realloc(void *ptr, size_t new_size, size_t old_size)
+{
+  EIGEN_UNUSED_VARIABLE(old_size);
+
+  void *result;
+#if !EIGEN_ALIGN
+  result = std::realloc(ptr,new_size);
+#elif EIGEN_MALLOC_ALREADY_ALIGNED
+  result = std::realloc(ptr,new_size);
+#elif EIGEN_HAS_POSIX_MEMALIGN
+  result = generic_aligned_realloc(ptr,new_size,old_size);
+#elif EIGEN_HAS_MM_MALLOC
+  // The defined(_mm_free) is just here to verify that this MSVC version
+  // implements _mm_malloc/_mm_free based on the corresponding _aligned_
+  // functions. This may not always be the case and we just try to be safe.
+  #if defined(_MSC_VER) && defined(_mm_free)
+    result = _aligned_realloc(ptr,new_size,16);
+  #else
+    result = generic_aligned_realloc(ptr,new_size,old_size);
+  #endif
+#elif defined(_MSC_VER)
+  result = _aligned_realloc(ptr,new_size,16);
+#else
+  result = handmade_aligned_realloc(ptr,new_size,old_size);
+#endif
+
+  if (!result && new_size)
+    throw_std_bad_alloc();
+
+  return result;
+}
+
+/*****************************************************************************
+*** Implementation of conditionally aligned functions                      ***
+*****************************************************************************/
+
+/** \internal Allocates \a size bytes. If Align is true, then the returned ptr is 16-byte-aligned.
+  * On allocation error, the returned pointer is null, and a std::bad_alloc is thrown.
+  */
+template<bool Align> inline void* conditional_aligned_malloc(size_t size)
+{
+  return aligned_malloc(size);
+}
+
+template<> inline void* conditional_aligned_malloc<false>(size_t size)
+{
+  check_that_malloc_is_allowed();
+
+  void *result = std::malloc(size);
+  if(!result && size)
+    throw_std_bad_alloc();
+  return result;
+}
+
+/** \internal Frees memory allocated with conditional_aligned_malloc */
+template<bool Align> inline void conditional_aligned_free(void *ptr)
+{
+  aligned_free(ptr);
+}
+
+template<> inline void conditional_aligned_free<false>(void *ptr)
+{
+  std::free(ptr);
+}
+
+template<bool Align> inline void* conditional_aligned_realloc(void* ptr, size_t new_size, size_t old_size)
+{
+  return aligned_realloc(ptr, new_size, old_size);
+}
+
+template<> inline void* conditional_aligned_realloc<false>(void* ptr, size_t new_size, size_t)
+{
+  return std::realloc(ptr, new_size);
+}
+
+/*****************************************************************************
+*** Construction/destruction of array elements                             ***
+*****************************************************************************/
+
+/** \internal Constructs the elements of an array.
+  * The \a size parameter tells on how many objects to call the constructor of T.
+  */
+template<typename T> inline T* construct_elements_of_array(T *ptr, size_t size)
+{
+  for (size_t i=0; i < size; ++i) ::new (ptr + i) T;
+  return ptr;
+}
+
+/** \internal Destructs the elements of an array.
+  * The \a size parameters tells on how many objects to call the destructor of T.
+  */
+template<typename T> inline void destruct_elements_of_array(T *ptr, size_t size)
+{
+  // always destruct an array starting from the end.
+  if(ptr)
+    while(size) ptr[--size].~T();
+}
+
+/*****************************************************************************
+*** Implementation of aligned new/delete-like functions                    ***
+*****************************************************************************/
+
+template<typename T>
+EIGEN_ALWAYS_INLINE void check_size_for_overflow(size_t size)
+{
+  if(size > size_t(-1) / sizeof(T))
+    throw_std_bad_alloc();
+}
+
+/** \internal Allocates \a size objects of type T. The returned pointer is guaranteed to have 16 bytes alignment.
+  * On allocation error, the returned pointer is undefined, but a std::bad_alloc is thrown.
+  * The default constructor of T is called.
+  */
+template<typename T> inline T* aligned_new(size_t size)
+{
+  check_size_for_overflow<T>(size);
+  T *result = reinterpret_cast<T*>(aligned_malloc(sizeof(T)*size));
+  return construct_elements_of_array(result, size);
+}
+
+template<typename T, bool Align> inline T* conditional_aligned_new(size_t size)
+{
+  check_size_for_overflow<T>(size);
+  T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
+  return construct_elements_of_array(result, size);
+}
+
+/** \internal Deletes objects constructed with aligned_new
+  * The \a size parameters tells on how many objects to call the destructor of T.
+  */
+template<typename T> inline void aligned_delete(T *ptr, size_t size)
+{
+  destruct_elements_of_array<T>(ptr, size);
+  aligned_free(ptr);
+}
+
+/** \internal Deletes objects constructed with conditional_aligned_new
+  * The \a size parameters tells on how many objects to call the destructor of T.
+  */
+template<typename T, bool Align> inline void conditional_aligned_delete(T *ptr, size_t size)
+{
+  destruct_elements_of_array<T>(ptr, size);
+  conditional_aligned_free<Align>(ptr);
+}
+
+template<typename T, bool Align> inline T* conditional_aligned_realloc_new(T* pts, size_t new_size, size_t old_size)
+{
+  check_size_for_overflow<T>(new_size);
+  check_size_for_overflow<T>(old_size);
+  if(new_size < old_size)
+    destruct_elements_of_array(pts+new_size, old_size-new_size);
+  T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));
+  if(new_size > old_size)
+    construct_elements_of_array(result+old_size, new_size-old_size);
+  return result;
+}
+
+
+template<typename T, bool Align> inline T* conditional_aligned_new_auto(size_t size)
+{
+  check_size_for_overflow<T>(size);
+  T *result = reinterpret_cast<T*>(conditional_aligned_malloc<Align>(sizeof(T)*size));
+  if(NumTraits<T>::RequireInitialization)
+    construct_elements_of_array(result, size);
+  return result;
+}
+
+template<typename T, bool Align> inline T* conditional_aligned_realloc_new_auto(T* pts, size_t new_size, size_t old_size)
+{
+  check_size_for_overflow<T>(new_size);
+  check_size_for_overflow<T>(old_size);
+  if(NumTraits<T>::RequireInitialization && (new_size < old_size))
+    destruct_elements_of_array(pts+new_size, old_size-new_size);
+  T *result = reinterpret_cast<T*>(conditional_aligned_realloc<Align>(reinterpret_cast<void*>(pts), sizeof(T)*new_size, sizeof(T)*old_size));
+  if(NumTraits<T>::RequireInitialization && (new_size > old_size))
+    construct_elements_of_array(result+old_size, new_size-old_size);
+  return result;
+}
+
+template<typename T, bool Align> inline void conditional_aligned_delete_auto(T *ptr, size_t size)
+{
+  if(NumTraits<T>::RequireInitialization)
+    destruct_elements_of_array<T>(ptr, size);
+  conditional_aligned_free<Align>(ptr);
+}
+
+/****************************************************************************/
+
+/** \internal Returns the index of the first element of the array that is well aligned for vectorization.
+  *
+  * \param array the address of the start of the array
+  * \param size the size of the array
+  *
+  * \note If no element of the array is well aligned, the size of the array is returned. Typically,
+  * for example with SSE, "well aligned" means 16-byte-aligned. If vectorization is disabled or if the
+  * packet size for the given scalar type is 1, then everything is considered well-aligned.
+  *
+  * \note If the scalar type is vectorizable, we rely on the following assumptions: sizeof(Scalar) is a
+  * power of 2, the packet size in bytes is also a power of 2, and is a multiple of sizeof(Scalar). On the
+  * other hand, we do not assume that the array address is a multiple of sizeof(Scalar), as that fails for
+  * example with Scalar=double on certain 32-bit platforms, see bug #79.
+  *
+  * There is also the variant first_aligned(const MatrixBase&) defined in DenseCoeffsBase.h.
+  */
+template<typename Scalar, typename Index>
+static inline Index first_aligned(const Scalar* array, Index size)
+{
+  enum { PacketSize = packet_traits<Scalar>::size,
+         PacketAlignedMask = PacketSize-1
+  };
+
+  if(PacketSize==1)
+  {
+    // Either there is no vectorization, or a packet consists of exactly 1 scalar so that all elements
+    // of the array have the same alignment.
+    return 0;
+  }
+  else if(size_t(array) & (sizeof(Scalar)-1))
+  {
+    // There is vectorization for this scalar type, but the array is not aligned to the size of a single scalar.
+    // Consequently, no element of the array is well aligned.
+    return size;
+  }
+  else
+  {
+    return std::min<Index>( (PacketSize - (Index((size_t(array)/sizeof(Scalar))) & PacketAlignedMask))
+                           & PacketAlignedMask, size);
+  }
+}
+
+/** \internal Returns the smallest integer multiple of \a base and greater or equal to \a size
+  */ 
+template<typename Index> 
+inline static Index first_multiple(Index size, Index base)
+{
+  return ((size+base-1)/base)*base;
+}
+
+// std::copy is much slower than memcpy, so let's introduce a smart_copy which
+// use memcpy on trivial types, i.e., on types that does not require an initialization ctor.
+template<typename T, bool UseMemcpy> struct smart_copy_helper;
+
+template<typename T> void smart_copy(const T* start, const T* end, T* target)
+{
+  smart_copy_helper<T,!NumTraits<T>::RequireInitialization>::run(start, end, target);
+}
+
+template<typename T> struct smart_copy_helper<T,true> {
+  static inline void run(const T* start, const T* end, T* target)
+  { memcpy(target, start, std::ptrdiff_t(end)-std::ptrdiff_t(start)); }
+};
+
+template<typename T> struct smart_copy_helper<T,false> {
+  static inline void run(const T* start, const T* end, T* target)
+  { std::copy(start, end, target); }
+};
+
+
+/*****************************************************************************
+*** Implementation of runtime stack allocation (falling back to malloc)    ***
+*****************************************************************************/
+
+// you can overwrite Eigen's default behavior regarding alloca by defining EIGEN_ALLOCA
+// to the appropriate stack allocation function
+#ifndef EIGEN_ALLOCA
+  #if (defined __linux__)
+    #define EIGEN_ALLOCA alloca
+  #elif defined(_MSC_VER)
+    #define EIGEN_ALLOCA _alloca
+  #endif
+#endif
+
+// This helper class construct the allocated memory, and takes care of destructing and freeing the handled data
+// at destruction time. In practice this helper class is mainly useful to avoid memory leak in case of exceptions.
+template<typename T> class aligned_stack_memory_handler
+{
+  public:
+    /* Creates a stack_memory_handler responsible for the buffer \a ptr of size \a size.
+     * Note that \a ptr can be 0 regardless of the other parameters.
+     * This constructor takes care of constructing/initializing the elements of the buffer if required by the scalar type T (see NumTraits<T>::RequireInitialization).
+     * In this case, the buffer elements will also be destructed when this handler will be destructed.
+     * Finally, if \a dealloc is true, then the pointer \a ptr is freed.
+     **/
+    aligned_stack_memory_handler(T* ptr, size_t size, bool dealloc)
+      : m_ptr(ptr), m_size(size), m_deallocate(dealloc)
+    {
+      if(NumTraits<T>::RequireInitialization && m_ptr)
+        Eigen::internal::construct_elements_of_array(m_ptr, size);
+    }
+    ~aligned_stack_memory_handler()
+    {
+      if(NumTraits<T>::RequireInitialization && m_ptr)
+        Eigen::internal::destruct_elements_of_array<T>(m_ptr, m_size);
+      if(m_deallocate)
+        Eigen::internal::aligned_free(m_ptr);
+    }
+  protected:
+    T* m_ptr;
+    size_t m_size;
+    bool m_deallocate;
+};
+
+} // end namespace internal
+
+/** \internal
+  * Declares, allocates and construct an aligned buffer named NAME of SIZE elements of type TYPE on the stack
+  * if SIZE is smaller than EIGEN_STACK_ALLOCATION_LIMIT, and if stack allocation is supported by the platform
+  * (currently, this is Linux and Visual Studio only). Otherwise the memory is allocated on the heap.
+  * The allocated buffer is automatically deleted when exiting the scope of this declaration.
+  * If BUFFER is non null, then the declared variable is simply an alias for BUFFER, and no allocation/deletion occurs.
+  * Here is an example:
+  * \code
+  * {
+  *   ei_declare_aligned_stack_constructed_variable(float,data,size,0);
+  *   // use data[0] to data[size-1]
+  * }
+  * \endcode
+  * The underlying stack allocation function can controlled with the EIGEN_ALLOCA preprocessor token.
+  */
+#ifdef EIGEN_ALLOCA
+
+  #ifdef __arm__
+    #define EIGEN_ALIGNED_ALLOCA(SIZE) reinterpret_cast<void*>((reinterpret_cast<size_t>(EIGEN_ALLOCA(SIZE+16)) & ~(size_t(15))) + 16)
+  #else
+    #define EIGEN_ALIGNED_ALLOCA EIGEN_ALLOCA
+  #endif
+
+  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
+    TYPE* NAME = (BUFFER)!=0 ? (BUFFER) \
+               : reinterpret_cast<TYPE*>( \
+                      (sizeof(TYPE)*SIZE<=EIGEN_STACK_ALLOCATION_LIMIT) ? EIGEN_ALIGNED_ALLOCA(sizeof(TYPE)*SIZE) \
+                    : Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE) );  \
+    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,sizeof(TYPE)*SIZE>EIGEN_STACK_ALLOCATION_LIMIT)
+
+#else
+
+  #define ei_declare_aligned_stack_constructed_variable(TYPE,NAME,SIZE,BUFFER) \
+    Eigen::internal::check_size_for_overflow<TYPE>(SIZE); \
+    TYPE* NAME = (BUFFER)!=0 ? BUFFER : reinterpret_cast<TYPE*>(Eigen::internal::aligned_malloc(sizeof(TYPE)*SIZE));    \
+    Eigen::internal::aligned_stack_memory_handler<TYPE> EIGEN_CAT(NAME,_stack_memory_destructor)((BUFFER)==0 ? NAME : 0,SIZE,true)
+    
+#endif
+
+
+/*****************************************************************************
+*** Implementation of EIGEN_MAKE_ALIGNED_OPERATOR_NEW [_IF]                ***
+*****************************************************************************/
+
+#if EIGEN_ALIGN
+  #ifdef EIGEN_EXCEPTIONS
+    #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
+      void* operator new(size_t size, const std::nothrow_t&) throw() { \
+        try { return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); } \
+        catch (...) { return 0; } \
+        return 0; \
+      }
+  #else
+    #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
+      void* operator new(size_t size, const std::nothrow_t&) throw() { \
+        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \
+      }
+  #endif
+
+  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign) \
+      void *operator new(size_t size) { \
+        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \
+      } \
+      void *operator new[](size_t size) { \
+        return Eigen::internal::conditional_aligned_malloc<NeedsToAlign>(size); \
+      } \
+      void operator delete(void * ptr) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
+      void operator delete[](void * ptr) throw() { Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); } \
+      /* in-place new and delete. since (at least afaik) there is no actual   */ \
+      /* memory allocated we can safely let the default implementation handle */ \
+      /* this particular case. */ \
+      static void *operator new(size_t size, void *ptr) { return ::operator new(size,ptr); } \
+      void operator delete(void * memory, void *ptr) throw() { return ::operator delete(memory,ptr); } \
+      /* nothrow-new (returns zero instead of std::bad_alloc) */ \
+      EIGEN_MAKE_ALIGNED_OPERATOR_NEW_NOTHROW(NeedsToAlign) \
+      void operator delete(void *ptr, const std::nothrow_t&) throw() { \
+        Eigen::internal::conditional_aligned_free<NeedsToAlign>(ptr); \
+      } \
+      typedef void eigen_aligned_operator_new_marker_type;
+#else
+  #define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
+#endif
+
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(true)
+#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(Scalar,Size) \
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(((Size)!=Eigen::Dynamic) && ((sizeof(Scalar)*(Size))%16==0)))
+
+/****************************************************************************/
+
+/** \class aligned_allocator
+* \ingroup Core_Module
+*
+* \brief STL compatible allocator to use with with 16 byte aligned types
+*
+* Example:
+* \code
+* // Matrix4f requires 16 bytes alignment:
+* std::map< int, Matrix4f, std::less<int>, 
+*           aligned_allocator<std::pair<const int, Matrix4f> > > my_map_mat4;
+* // Vector3f does not require 16 bytes alignment, no need to use Eigen's allocator:
+* std::map< int, Vector3f > my_map_vec3;
+* \endcode
+*
+* \sa \ref TopicStlContainers.
+*/
+template<class T>
+class aligned_allocator
+{
+public:
+    typedef size_t    size_type;
+    typedef std::ptrdiff_t difference_type;
+    typedef T*        pointer;
+    typedef const T*  const_pointer;
+    typedef T&        reference;
+    typedef const T&  const_reference;
+    typedef T         value_type;
+
+    template<class U>
+    struct rebind
+    {
+        typedef aligned_allocator<U> other;
+    };
+
+    pointer address( reference value ) const
+    {
+        return &value;
+    }
+
+    const_pointer address( const_reference value ) const
+    {
+        return &value;
+    }
+
+    aligned_allocator()
+    {
+    }
+
+    aligned_allocator( const aligned_allocator& )
+    {
+    }
+
+    template<class U>
+    aligned_allocator( const aligned_allocator<U>& )
+    {
+    }
+
+    ~aligned_allocator()
+    {
+    }
+
+    size_type max_size() const
+    {
+        return (std::numeric_limits<size_type>::max)();
+    }
+
+    pointer allocate( size_type num, const void* hint = 0 )
+    {
+        EIGEN_UNUSED_VARIABLE(hint);
+        internal::check_size_for_overflow<T>(num);
+        return static_cast<pointer>( internal::aligned_malloc( num * sizeof(T) ) );
+    }
+
+    void construct( pointer p, const T& value )
+    {
+        ::new( p ) T( value );
+    }
+
+    // Support for c++11
+#if (__cplusplus >= 201103L)
+    template<typename... Args>
+    void  construct(pointer p, Args&&... args)
+    {
+      ::new(p) T(std::forward<Args>(args)...);
+    }
+#endif
+
+    void destroy( pointer p )
+    {
+        p->~T();
+    }
+
+    void deallocate( pointer p, size_type /*num*/ )
+    {
+        internal::aligned_free( p );
+    }
+
+    bool operator!=(const aligned_allocator<T>& ) const
+    { return false; }
+
+    bool operator==(const aligned_allocator<T>& ) const
+    { return true; }
+};
+
+//---------- Cache sizes ----------
+
+#if !defined(EIGEN_NO_CPUID)
+#  if defined(__GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
+#    if defined(__PIC__) && defined(__i386__)
+       // Case for x86 with PIC
+#      define EIGEN_CPUID(abcd,func,id) \
+         __asm__ __volatile__ ("xchgl %%ebx, %k1;cpuid; xchgl %%ebx,%k1": "=a" (abcd[0]), "=&r" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "a" (func), "c" (id));
+#    elif defined(__PIC__) && defined(__x86_64__)
+       // Case for x64 with PIC. In theory this is only a problem with recent gcc and with medium or large code model, not with the default small code model.
+       // However, we cannot detect which code model is used, and the xchg overhead is negligible anyway.
+#      define EIGEN_CPUID(abcd,func,id) \
+        __asm__ __volatile__ ("xchg{q}\t{%%}rbx, %q1; cpuid; xchg{q}\t{%%}rbx, %q1": "=a" (abcd[0]), "=&r" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "0" (func), "2" (id));
+#    else
+       // Case for x86_64 or x86 w/o PIC
+#      define EIGEN_CPUID(abcd,func,id) \
+         __asm__ __volatile__ ("cpuid": "=a" (abcd[0]), "=b" (abcd[1]), "=c" (abcd[2]), "=d" (abcd[3]) : "0" (func), "2" (id) );
+#    endif
+#  elif defined(_MSC_VER)
+#    if (_MSC_VER > 1500) && ( defined(_M_IX86) || defined(_M_X64) )
+#      define EIGEN_CPUID(abcd,func,id) __cpuidex((int*)abcd,func,id)
+#    endif
+#  endif
+#endif
+
+namespace internal {
+
+#ifdef EIGEN_CPUID
+
+inline bool cpuid_is_vendor(int abcd[4], const char* vendor)
+{
+  return abcd[1]==(reinterpret_cast<const int*>(vendor))[0] && abcd[3]==(reinterpret_cast<const int*>(vendor))[1] && abcd[2]==(reinterpret_cast<const int*>(vendor))[2];
+}
+
+inline void queryCacheSizes_intel_direct(int& l1, int& l2, int& l3)
+{
+  int abcd[4];
+  l1 = l2 = l3 = 0;
+  int cache_id = 0;
+  int cache_type = 0;
+  do {
+    abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
+    EIGEN_CPUID(abcd,0x4,cache_id);
+    cache_type  = (abcd[0] & 0x0F) >> 0;
+    if(cache_type==1||cache_type==3) // data or unified cache
+    {
+      int cache_level = (abcd[0] & 0xE0) >> 5;  // A[7:5]
+      int ways        = (abcd[1] & 0xFFC00000) >> 22; // B[31:22]
+      int partitions  = (abcd[1] & 0x003FF000) >> 12; // B[21:12]
+      int line_size   = (abcd[1] & 0x00000FFF) >>  0; // B[11:0]
+      int sets        = (abcd[2]);                    // C[31:0]
+
+      int cache_size = (ways+1) * (partitions+1) * (line_size+1) * (sets+1);
+
+      switch(cache_level)
+      {
+        case 1: l1 = cache_size; break;
+        case 2: l2 = cache_size; break;
+        case 3: l3 = cache_size; break;
+        default: break;
+      }
+    }
+    cache_id++;
+  } while(cache_type>0 && cache_id<16);
+}
+
+inline void queryCacheSizes_intel_codes(int& l1, int& l2, int& l3)
+{
+  int abcd[4];
+  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
+  l1 = l2 = l3 = 0;
+  EIGEN_CPUID(abcd,0x00000002,0);
+  unsigned char * bytes = reinterpret_cast<unsigned char *>(abcd)+2;
+  bool check_for_p2_core2 = false;
+  for(int i=0; i<14; ++i)
+  {
+    switch(bytes[i])
+    {
+      case 0x0A: l1 = 8; break;   // 0Ah   data L1 cache, 8 KB, 2 ways, 32 byte lines
+      case 0x0C: l1 = 16; break;  // 0Ch   data L1 cache, 16 KB, 4 ways, 32 byte lines
+      case 0x0E: l1 = 24; break;  // 0Eh   data L1 cache, 24 KB, 6 ways, 64 byte lines
+      case 0x10: l1 = 16; break;  // 10h   data L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
+      case 0x15: l1 = 16; break;  // 15h   code L1 cache, 16 KB, 4 ways, 32 byte lines (IA-64)
+      case 0x2C: l1 = 32; break;  // 2Ch   data L1 cache, 32 KB, 8 ways, 64 byte lines
+      case 0x30: l1 = 32; break;  // 30h   code L1 cache, 32 KB, 8 ways, 64 byte lines
+      case 0x60: l1 = 16; break;  // 60h   data L1 cache, 16 KB, 8 ways, 64 byte lines, sectored
+      case 0x66: l1 = 8; break;   // 66h   data L1 cache, 8 KB, 4 ways, 64 byte lines, sectored
+      case 0x67: l1 = 16; break;  // 67h   data L1 cache, 16 KB, 4 ways, 64 byte lines, sectored
+      case 0x68: l1 = 32; break;  // 68h   data L1 cache, 32 KB, 4 ways, 64 byte lines, sectored
+      case 0x1A: l2 = 96; break;   // code and data L2 cache, 96 KB, 6 ways, 64 byte lines (IA-64)
+      case 0x22: l3 = 512; break;   // code and data L3 cache, 512 KB, 4 ways (!), 64 byte lines, dual-sectored
+      case 0x23: l3 = 1024; break;   // code and data L3 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x25: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x29: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x39: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 64 byte lines, sectored
+      case 0x3A: l2 = 192; break;   // code and data L2 cache, 192 KB, 6 ways, 64 byte lines, sectored
+      case 0x3B: l2 = 128; break;   // code and data L2 cache, 128 KB, 2 ways, 64 byte lines, sectored
+      case 0x3C: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 64 byte lines, sectored
+      case 0x3D: l2 = 384; break;   // code and data L2 cache, 384 KB, 6 ways, 64 byte lines, sectored
+      case 0x3E: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines, sectored
+      case 0x40: l2 = 0; break;   // no integrated L2 cache (P6 core) or L3 cache (P4 core)
+      case 0x41: l2 = 128; break;   // code and data L2 cache, 128 KB, 4 ways, 32 byte lines
+      case 0x42: l2 = 256; break;   // code and data L2 cache, 256 KB, 4 ways, 32 byte lines
+      case 0x43: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 32 byte lines
+      case 0x44: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 32 byte lines
+      case 0x45: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 4 ways, 32 byte lines
+      case 0x46: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines
+      case 0x47: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 8 ways, 64 byte lines
+      case 0x48: l2 = 3072; break;   // code and data L2 cache, 3072 KB, 12 ways, 64 byte lines
+      case 0x49: if(l2!=0) l3 = 4096; else {check_for_p2_core2=true; l3 = l2 = 4096;} break;// code and data L3 cache, 4096 KB, 16 ways, 64 byte lines (P4) or L2 for core2
+      case 0x4A: l3 = 6144; break;   // code and data L3 cache, 6144 KB, 12 ways, 64 byte lines
+      case 0x4B: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 16 ways, 64 byte lines
+      case 0x4C: l3 = 12288; break;   // code and data L3 cache, 12288 KB, 12 ways, 64 byte lines
+      case 0x4D: l3 = 16384; break;   // code and data L3 cache, 16384 KB, 16 ways, 64 byte lines
+      case 0x4E: l2 = 6144; break;   // code and data L2 cache, 6144 KB, 24 ways, 64 byte lines
+      case 0x78: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 4 ways, 64 byte lines
+      case 0x79: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7A: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7B: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7C: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines, dual-sectored
+      case 0x7D: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 64 byte lines
+      case 0x7E: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 128 byte lines, sect. (IA-64)
+      case 0x7F: l2 = 512; break;   // code and data L2 cache, 512 KB, 2 ways, 64 byte lines
+      case 0x80: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 64 byte lines
+      case 0x81: l2 = 128; break;   // code and data L2 cache, 128 KB, 8 ways, 32 byte lines
+      case 0x82: l2 = 256; break;   // code and data L2 cache, 256 KB, 8 ways, 32 byte lines
+      case 0x83: l2 = 512; break;   // code and data L2 cache, 512 KB, 8 ways, 32 byte lines
+      case 0x84: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 32 byte lines
+      case 0x85: l2 = 2048; break;   // code and data L2 cache, 2048 KB, 8 ways, 32 byte lines
+      case 0x86: l2 = 512; break;   // code and data L2 cache, 512 KB, 4 ways, 64 byte lines
+      case 0x87: l2 = 1024; break;   // code and data L2 cache, 1024 KB, 8 ways, 64 byte lines
+      case 0x88: l3 = 2048; break;   // code and data L3 cache, 2048 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x89: l3 = 4096; break;   // code and data L3 cache, 4096 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x8A: l3 = 8192; break;   // code and data L3 cache, 8192 KB, 4 ways, 64 byte lines (IA-64)
+      case 0x8D: l3 = 3072; break;   // code and data L3 cache, 3072 KB, 12 ways, 128 byte lines (IA-64)
+
+      default: break;
+    }
+  }
+  if(check_for_p2_core2 && l2 == l3)
+    l3 = 0;
+  l1 *= 1024;
+  l2 *= 1024;
+  l3 *= 1024;
+}
+
+inline void queryCacheSizes_intel(int& l1, int& l2, int& l3, int max_std_funcs)
+{
+  if(max_std_funcs>=4)
+    queryCacheSizes_intel_direct(l1,l2,l3);
+  else
+    queryCacheSizes_intel_codes(l1,l2,l3);
+}
+
+inline void queryCacheSizes_amd(int& l1, int& l2, int& l3)
+{
+  int abcd[4];
+  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
+  EIGEN_CPUID(abcd,0x80000005,0);
+  l1 = (abcd[2] >> 24) * 1024; // C[31:24] = L1 size in KB
+  abcd[0] = abcd[1] = abcd[2] = abcd[3] = 0;
+  EIGEN_CPUID(abcd,0x80000006,0);
+  l2 = (abcd[2] >> 16) * 1024; // C[31;16] = l2 cache size in KB
+  l3 = ((abcd[3] & 0xFFFC000) >> 18) * 512 * 1024; // D[31;18] = l3 cache size in 512KB
+}
+#endif
+
+/** \internal
+ * Queries and returns the cache sizes in Bytes of the L1, L2, and L3 data caches respectively */
+inline void queryCacheSizes(int& l1, int& l2, int& l3)
+{
+  #ifdef EIGEN_CPUID
+  int abcd[4];
+
+  // identify the CPU vendor
+  EIGEN_CPUID(abcd,0x0,0);
+  int max_std_funcs = abcd[1];
+  if(cpuid_is_vendor(abcd,"GenuineIntel"))
+    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);
+  else if(cpuid_is_vendor(abcd,"AuthenticAMD") || cpuid_is_vendor(abcd,"AMDisbetter!"))
+    queryCacheSizes_amd(l1,l2,l3);
+  else
+    // by default let's use Intel's API
+    queryCacheSizes_intel(l1,l2,l3,max_std_funcs);
+
+  // here is the list of other vendors:
+//   ||cpuid_is_vendor(abcd,"VIA VIA VIA ")
+//   ||cpuid_is_vendor(abcd,"CyrixInstead")
+//   ||cpuid_is_vendor(abcd,"CentaurHauls")
+//   ||cpuid_is_vendor(abcd,"GenuineTMx86")
+//   ||cpuid_is_vendor(abcd,"TransmetaCPU")
+//   ||cpuid_is_vendor(abcd,"RiseRiseRise")
+//   ||cpuid_is_vendor(abcd,"Geode by NSC")
+//   ||cpuid_is_vendor(abcd,"SiS SiS SiS ")
+//   ||cpuid_is_vendor(abcd,"UMC UMC UMC ")
+//   ||cpuid_is_vendor(abcd,"NexGenDriven")
+  #else
+  l1 = l2 = l3 = -1;
+  #endif
+}
+
+/** \internal
+ * \returns the size in Bytes of the L1 data cache */
+inline int queryL1CacheSize()
+{
+  int l1(-1), l2, l3;
+  queryCacheSizes(l1,l2,l3);
+  return l1;
+}
+
+/** \internal
+ * \returns the size in Bytes of the L2 or L3 cache if this later is present */
+inline int queryTopLevelCacheSize()
+{
+  int l1, l2(-1), l3(-1);
+  queryCacheSizes(l1,l2,l3);
+  return (std::max)(l2,l3);
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_MEMORY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/Meta.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/Meta.h
new file mode 100644
index 0000000..71d5871
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/Meta.h
@@ -0,0 +1,243 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_META_H
+#define EIGEN_META_H
+
+namespace Eigen {
+
+namespace internal {
+
+/** \internal
+  * \file Meta.h
+  * This file contains generic metaprogramming classes which are not specifically related to Eigen.
+  * \note In case you wonder, yes we're aware that Boost already provides all these features,
+  * we however don't want to add a dependency to Boost.
+  */
+
+struct true_type {  enum { value = 1 }; };
+struct false_type { enum { value = 0 }; };
+
+template<bool Condition, typename Then, typename Else>
+struct conditional { typedef Then type; };
+
+template<typename Then, typename Else>
+struct conditional <false, Then, Else> { typedef Else type; };
+
+template<typename T, typename U> struct is_same { enum { value = 0 }; };
+template<typename T> struct is_same<T,T> { enum { value = 1 }; };
+
+template<typename T> struct remove_reference { typedef T type; };
+template<typename T> struct remove_reference<T&> { typedef T type; };
+
+template<typename T> struct remove_pointer { typedef T type; };
+template<typename T> struct remove_pointer<T*> { typedef T type; };
+template<typename T> struct remove_pointer<T*const> { typedef T type; };
+
+template <class T> struct remove_const { typedef T type; };
+template <class T> struct remove_const<const T> { typedef T type; };
+template <class T> struct remove_const<const T[]> { typedef T type[]; };
+template <class T, unsigned int Size> struct remove_const<const T[Size]> { typedef T type[Size]; };
+
+template<typename T> struct remove_all { typedef T type; };
+template<typename T> struct remove_all<const T>   { typedef typename remove_all<T>::type type; };
+template<typename T> struct remove_all<T const&>  { typedef typename remove_all<T>::type type; };
+template<typename T> struct remove_all<T&>        { typedef typename remove_all<T>::type type; };
+template<typename T> struct remove_all<T const*>  { typedef typename remove_all<T>::type type; };
+template<typename T> struct remove_all<T*>        { typedef typename remove_all<T>::type type; };
+
+template<typename T> struct is_arithmetic      { enum { value = false }; };
+template<> struct is_arithmetic<float>         { enum { value = true }; };
+template<> struct is_arithmetic<double>        { enum { value = true }; };
+template<> struct is_arithmetic<long double>   { enum { value = true }; };
+template<> struct is_arithmetic<bool>          { enum { value = true }; };
+template<> struct is_arithmetic<char>          { enum { value = true }; };
+template<> struct is_arithmetic<signed char>   { enum { value = true }; };
+template<> struct is_arithmetic<unsigned char> { enum { value = true }; };
+template<> struct is_arithmetic<signed short>  { enum { value = true }; };
+template<> struct is_arithmetic<unsigned short>{ enum { value = true }; };
+template<> struct is_arithmetic<signed int>    { enum { value = true }; };
+template<> struct is_arithmetic<unsigned int>  { enum { value = true }; };
+template<> struct is_arithmetic<signed long>   { enum { value = true }; };
+template<> struct is_arithmetic<unsigned long> { enum { value = true }; };
+
+template <typename T> struct add_const { typedef const T type; };
+template <typename T> struct add_const<T&> { typedef T& type; };
+
+template <typename T> struct is_const { enum { value = 0 }; };
+template <typename T> struct is_const<T const> { enum { value = 1 }; };
+
+template<typename T> struct add_const_on_value_type            { typedef const T type;  };
+template<typename T> struct add_const_on_value_type<T&>        { typedef T const& type; };
+template<typename T> struct add_const_on_value_type<T*>        { typedef T const* type; };
+template<typename T> struct add_const_on_value_type<T* const>  { typedef T const* const type; };
+template<typename T> struct add_const_on_value_type<T const* const>  { typedef T const* const type; };
+
+/** \internal Allows to enable/disable an overload
+  * according to a compile time condition.
+  */
+template<bool Condition, typename T> struct enable_if;
+
+template<typename T> struct enable_if<true,T>
+{ typedef T type; };
+
+
+
+/** \internal
+  * A base class do disable default copy ctor and copy assignement operator.
+  */
+class noncopyable
+{
+  noncopyable(const noncopyable&);
+  const noncopyable& operator=(const noncopyable&);
+protected:
+  noncopyable() {}
+  ~noncopyable() {}
+};
+
+
+/** \internal
+  * Convenient struct to get the result type of a unary or binary functor.
+  *
+  * It supports both the current STL mechanism (using the result_type member) as well as
+  * upcoming next STL generation (using a templated result member).
+  * If none of these members is provided, then the type of the first argument is returned. FIXME, that behavior is a pretty bad hack.
+  */
+template<typename T> struct result_of {};
+
+struct has_none {int a[1];};
+struct has_std_result_type {int a[2];};
+struct has_tr1_result {int a[3];};
+
+template<typename Func, typename ArgType, int SizeOf=sizeof(has_none)>
+struct unary_result_of_select {typedef ArgType type;};
+
+template<typename Func, typename ArgType>
+struct unary_result_of_select<Func, ArgType, sizeof(has_std_result_type)> {typedef typename Func::result_type type;};
+
+template<typename Func, typename ArgType>
+struct unary_result_of_select<Func, ArgType, sizeof(has_tr1_result)> {typedef typename Func::template result<Func(ArgType)>::type type;};
+
+template<typename Func, typename ArgType>
+struct result_of<Func(ArgType)> {
+    template<typename T>
+    static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
+    template<typename T>
+    static has_tr1_result      testFunctor(T const *, typename T::template result<T(ArgType)>::type const * = 0);
+    static has_none            testFunctor(...);
+
+    // note that the following indirection is needed for gcc-3.3
+    enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
+    typedef typename unary_result_of_select<Func, ArgType, FunctorType>::type type;
+};
+
+template<typename Func, typename ArgType0, typename ArgType1, int SizeOf=sizeof(has_none)>
+struct binary_result_of_select {typedef ArgType0 type;};
+
+template<typename Func, typename ArgType0, typename ArgType1>
+struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_std_result_type)>
+{typedef typename Func::result_type type;};
+
+template<typename Func, typename ArgType0, typename ArgType1>
+struct binary_result_of_select<Func, ArgType0, ArgType1, sizeof(has_tr1_result)>
+{typedef typename Func::template result<Func(ArgType0,ArgType1)>::type type;};
+
+template<typename Func, typename ArgType0, typename ArgType1>
+struct result_of<Func(ArgType0,ArgType1)> {
+    template<typename T>
+    static has_std_result_type testFunctor(T const *, typename T::result_type const * = 0);
+    template<typename T>
+    static has_tr1_result      testFunctor(T const *, typename T::template result<T(ArgType0,ArgType1)>::type const * = 0);
+    static has_none            testFunctor(...);
+
+    // note that the following indirection is needed for gcc-3.3
+    enum {FunctorType = sizeof(testFunctor(static_cast<Func*>(0)))};
+    typedef typename binary_result_of_select<Func, ArgType0, ArgType1, FunctorType>::type type;
+};
+
+/** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
+  * Usage example: \code meta_sqrt<1023>::ret \endcode
+  */
+template<int Y,
+         int InfX = 0,
+         int SupX = ((Y==1) ? 1 : Y/2),
+         bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
+                                // use ?: instead of || just to shut up a stupid gcc 4.3 warning
+class meta_sqrt
+{
+    enum {
+      MidX = (InfX+SupX)/2,
+      TakeInf = MidX*MidX > Y ? 1 : 0,
+      NewInf = int(TakeInf) ? InfX : int(MidX),
+      NewSup = int(TakeInf) ? int(MidX) : SupX
+    };
+  public:
+    enum { ret = meta_sqrt<Y,NewInf,NewSup>::ret };
+};
+
+template<int Y, int InfX, int SupX>
+class meta_sqrt<Y, InfX, SupX, true> { public:  enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
+
+/** \internal determines whether the product of two numeric types is allowed and what the return type is */
+template<typename T, typename U> struct scalar_product_traits
+{
+  enum { Defined = 0 };
+};
+
+template<typename T> struct scalar_product_traits<T,T>
+{
+  enum {
+    // Cost = NumTraits<T>::MulCost,
+    Defined = 1
+  };
+  typedef T ReturnType;
+};
+
+template<typename T> struct scalar_product_traits<T,std::complex<T> >
+{
+  enum {
+    // Cost = 2*NumTraits<T>::MulCost,
+    Defined = 1
+  };
+  typedef std::complex<T> ReturnType;
+};
+
+template<typename T> struct scalar_product_traits<std::complex<T>, T>
+{
+  enum {
+    // Cost = 2*NumTraits<T>::MulCost,
+    Defined = 1
+  };
+  typedef std::complex<T> ReturnType;
+};
+
+// FIXME quick workaround around current limitation of result_of
+// template<typename Scalar, typename ArgType0, typename ArgType1>
+// struct result_of<scalar_product_op<Scalar>(ArgType0,ArgType1)> {
+// typedef typename scalar_product_traits<typename remove_all<ArgType0>::type, typename remove_all<ArgType1>::type>::ReturnType type;
+// };
+
+template<typename T> struct is_diagonal
+{ enum { ret = false }; };
+
+template<typename T> struct is_diagonal<DiagonalBase<T> >
+{ enum { ret = true }; };
+
+template<typename T> struct is_diagonal<DiagonalWrapper<T> >
+{ enum { ret = true }; };
+
+template<typename T, int S> struct is_diagonal<DiagonalMatrix<T,S> >
+{ enum { ret = true }; };
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_META_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/NonMPL2.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/NonMPL2.h
new file mode 100644
index 0000000..1af67cf
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/NonMPL2.h
@@ -0,0 +1,3 @@
+#ifdef EIGEN_MPL2_ONLY
+#error Including non-MPL2 code in EIGEN_MPL2_ONLY mode
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/ReenableStupidWarnings.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/ReenableStupidWarnings.h
new file mode 100644
index 0000000..5ddfbd4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/ReenableStupidWarnings.h
@@ -0,0 +1,14 @@
+#ifdef EIGEN_WARNINGS_DISABLED
+#undef EIGEN_WARNINGS_DISABLED
+
+#ifndef EIGEN_PERMANENTLY_DISABLE_STUPID_WARNINGS
+  #ifdef _MSC_VER
+    #pragma warning( pop )
+  #elif defined __INTEL_COMPILER
+    #pragma warning pop
+  #elif defined __clang__
+    #pragma clang diagnostic pop
+  #endif
+#endif
+
+#endif // EIGEN_WARNINGS_DISABLED
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/StaticAssert.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/StaticAssert.h
new file mode 100644
index 0000000..8872c5b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/StaticAssert.h
@@ -0,0 +1,206 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STATIC_ASSERT_H
+#define EIGEN_STATIC_ASSERT_H
+
+/* Some notes on Eigen's static assertion mechanism:
+ *
+ *  - in EIGEN_STATIC_ASSERT(CONDITION,MSG) the parameter CONDITION must be a compile time boolean
+ *    expression, and MSG an enum listed in struct internal::static_assertion<true>
+ *
+ *  - define EIGEN_NO_STATIC_ASSERT to disable them (and save compilation time)
+ *    in that case, the static assertion is converted to the following runtime assert:
+ *      eigen_assert(CONDITION && "MSG")
+ *
+ *  - currently EIGEN_STATIC_ASSERT can only be used in function scope
+ *
+ */
+
+#ifndef EIGEN_NO_STATIC_ASSERT
+
+  #if defined(__GXX_EXPERIMENTAL_CXX0X__) || (defined(_MSC_VER) && (_MSC_VER >= 1600))
+
+    // if native static_assert is enabled, let's use it
+    #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
+
+  #else // not CXX0X
+
+    namespace Eigen {
+
+    namespace internal {
+
+    template<bool condition>
+    struct static_assertion {};
+
+    template<>
+    struct static_assertion<true>
+    {
+      enum {
+        YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX,
+        YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES,
+        YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES,
+        THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE,
+        THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE,
+        THIS_METHOD_IS_ONLY_FOR_OBJECTS_OF_A_SPECIFIC_SIZE,
+        YOU_MADE_A_PROGRAMMING_MISTAKE,
+        EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT,
+        EIGEN_INTERNAL_COMPILATION_ERROR_OR_YOU_MADE_A_PROGRAMMING_MISTAKE,
+        YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR,
+        YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR,
+        UNALIGNED_LOAD_AND_STORE_OPERATIONS_UNIMPLEMENTED_ON_ALTIVEC,
+        THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES,
+        FLOATING_POINT_ARGUMENT_PASSED__INTEGER_WAS_EXPECTED,
+        NUMERIC_TYPE_MUST_BE_REAL,
+        COEFFICIENT_WRITE_ACCESS_TO_SELFADJOINT_NOT_SUPPORTED,
+        WRITING_TO_TRIANGULAR_PART_WITH_UNIT_DIAGONAL_IS_NOT_SUPPORTED,
+        THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE,
+        INVALID_MATRIX_PRODUCT,
+        INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS,
+        INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION,
+        YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY,
+        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES,
+        THIS_METHOD_IS_ONLY_FOR_ROW_MAJOR_MATRICES,
+        INVALID_MATRIX_TEMPLATE_PARAMETERS,
+        INVALID_MATRIXBASE_TEMPLATE_PARAMETERS,
+        BOTH_MATRICES_MUST_HAVE_THE_SAME_STORAGE_ORDER,
+        THIS_METHOD_IS_ONLY_FOR_DIAGONAL_MATRIX,
+        THE_MATRIX_OR_EXPRESSION_THAT_YOU_PASSED_DOES_NOT_HAVE_THE_EXPECTED_TYPE,
+        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_WITH_DIRECT_MEMORY_ACCESS_SUCH_AS_MAP_OR_PLAIN_MATRICES,
+        YOU_ALREADY_SPECIFIED_THIS_STRIDE,
+        INVALID_STORAGE_ORDER_FOR_THIS_VECTOR_EXPRESSION,
+        THE_BRACKET_OPERATOR_IS_ONLY_FOR_VECTORS__USE_THE_PARENTHESIS_OPERATOR_INSTEAD,
+        PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1,
+        THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS,
+        YOU_CANNOT_MIX_ARRAYS_AND_MATRICES,
+        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION,
+        THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY,
+        YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT,
+        THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS,
+        THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL,
+        THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES,
+        YOU_PASSED_A_ROW_VECTOR_BUT_A_COLUMN_VECTOR_WAS_EXPECTED,
+        YOU_PASSED_A_COLUMN_VECTOR_BUT_A_ROW_VECTOR_WAS_EXPECTED,
+        THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE,
+        THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH,
+        OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG
+      };
+    };
+
+    } // end namespace internal
+
+    } // end namespace Eigen
+
+    // Specialized implementation for MSVC to avoid "conditional
+    // expression is constant" warnings.  This implementation doesn't
+    // appear to work under GCC, hence the multiple implementations.
+    #ifdef _MSC_VER
+
+      #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
+        {Eigen::internal::static_assertion<bool(CONDITION)>::MSG;}
+
+    #else
+
+      #define EIGEN_STATIC_ASSERT(CONDITION,MSG) \
+        if (Eigen::internal::static_assertion<bool(CONDITION)>::MSG) {}
+
+    #endif
+
+  #endif // not CXX0X
+
+#else // EIGEN_NO_STATIC_ASSERT
+
+  #define EIGEN_STATIC_ASSERT(CONDITION,MSG) eigen_assert((CONDITION) && #MSG);
+
+#endif // EIGEN_NO_STATIC_ASSERT
+
+
+// static assertion failing if the type \a TYPE is not a vector type
+#define EIGEN_STATIC_ASSERT_VECTOR_ONLY(TYPE) \
+  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime, \
+                      YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX)
+
+// static assertion failing if the type \a TYPE is not fixed-size
+#define EIGEN_STATIC_ASSERT_FIXED_SIZE(TYPE) \
+  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime!=Eigen::Dynamic, \
+                      YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR)
+
+// static assertion failing if the type \a TYPE is not dynamic-size
+#define EIGEN_STATIC_ASSERT_DYNAMIC_SIZE(TYPE) \
+  EIGEN_STATIC_ASSERT(TYPE::SizeAtCompileTime==Eigen::Dynamic, \
+                      YOU_CALLED_A_DYNAMIC_SIZE_METHOD_ON_A_FIXED_SIZE_MATRIX_OR_VECTOR)
+
+// static assertion failing if the type \a TYPE is not a vector type of the given size
+#define EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(TYPE, SIZE) \
+  EIGEN_STATIC_ASSERT(TYPE::IsVectorAtCompileTime && TYPE::SizeAtCompileTime==SIZE, \
+                      THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE)
+
+// static assertion failing if the type \a TYPE is not a vector type of the given size
+#define EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(TYPE, ROWS, COLS) \
+  EIGEN_STATIC_ASSERT(TYPE::RowsAtCompileTime==ROWS && TYPE::ColsAtCompileTime==COLS, \
+                      THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
+
+// static assertion failing if the two vector expression types are not compatible (same fixed-size or dynamic size)
+#define EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(TYPE0,TYPE1) \
+  EIGEN_STATIC_ASSERT( \
+      (int(TYPE0::SizeAtCompileTime)==Eigen::Dynamic \
+    || int(TYPE1::SizeAtCompileTime)==Eigen::Dynamic \
+    || int(TYPE0::SizeAtCompileTime)==int(TYPE1::SizeAtCompileTime)),\
+    YOU_MIXED_VECTORS_OF_DIFFERENT_SIZES)
+
+#define EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
+     ( \
+        (int(TYPE0::SizeAtCompileTime)==0 && int(TYPE1::SizeAtCompileTime)==0) \
+    || (\
+          (int(TYPE0::RowsAtCompileTime)==Eigen::Dynamic \
+        || int(TYPE1::RowsAtCompileTime)==Eigen::Dynamic \
+        || int(TYPE0::RowsAtCompileTime)==int(TYPE1::RowsAtCompileTime)) \
+      &&  (int(TYPE0::ColsAtCompileTime)==Eigen::Dynamic \
+        || int(TYPE1::ColsAtCompileTime)==Eigen::Dynamic \
+        || int(TYPE0::ColsAtCompileTime)==int(TYPE1::ColsAtCompileTime))\
+       ) \
+     )
+
+#ifdef EIGEN2_SUPPORT
+  #define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \
+    eigen_assert(!NumTraits<Scalar>::IsInteger);
+#else
+  #define EIGEN_STATIC_ASSERT_NON_INTEGER(TYPE) \
+    EIGEN_STATIC_ASSERT(!NumTraits<TYPE>::IsInteger, THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
+#endif
+
+
+// static assertion failing if it is guaranteed at compile-time that the two matrix expression types have different sizes
+#define EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(TYPE0,TYPE1) \
+  EIGEN_STATIC_ASSERT( \
+     EIGEN_PREDICATE_SAME_MATRIX_SIZE(TYPE0,TYPE1),\
+    YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES)
+
+#define EIGEN_STATIC_ASSERT_SIZE_1x1(TYPE) \
+      EIGEN_STATIC_ASSERT((TYPE::RowsAtCompileTime == 1 || TYPE::RowsAtCompileTime == Dynamic) && \
+                          (TYPE::ColsAtCompileTime == 1 || TYPE::ColsAtCompileTime == Dynamic), \
+                          THIS_METHOD_IS_ONLY_FOR_1x1_EXPRESSIONS)
+
+#define EIGEN_STATIC_ASSERT_LVALUE(Derived) \
+      EIGEN_STATIC_ASSERT(internal::is_lvalue<Derived>::value, \
+                          THIS_EXPRESSION_IS_NOT_A_LVALUE__IT_IS_READ_ONLY)
+
+#define EIGEN_STATIC_ASSERT_ARRAYXPR(Derived) \
+      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived>::XprKind, ArrayXpr>::value), \
+                          THIS_METHOD_IS_ONLY_FOR_ARRAYS_NOT_MATRICES)
+
+#define EIGEN_STATIC_ASSERT_SAME_XPR_KIND(Derived1, Derived2) \
+      EIGEN_STATIC_ASSERT((internal::is_same<typename internal::traits<Derived1>::XprKind, \
+                                             typename internal::traits<Derived2>::XprKind \
+                                            >::value), \
+                          YOU_CANNOT_MIX_ARRAYS_AND_MATRICES)
+
+
+#endif // EIGEN_STATIC_ASSERT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Core/util/XprHelper.h b/vendor/eigen-3.1.91/Eigen/src/Core/util/XprHelper.h
new file mode 100644
index 0000000..3d1290c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Core/util/XprHelper.h
@@ -0,0 +1,468 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_XPRHELPER_H
+#define EIGEN_XPRHELPER_H
+
+// just a workaround because GCC seems to not really like empty structs
+// FIXME: gcc 4.3 generates bad code when strict-aliasing is enabled
+// so currently we simply disable this optimization for gcc 4.3
+#if (defined __GNUG__) && !((__GNUC__==4) && (__GNUC_MINOR__==3))
+  #define EIGEN_EMPTY_STRUCT_CTOR(X) \
+    EIGEN_STRONG_INLINE X() {} \
+    EIGEN_STRONG_INLINE X(const X& ) {}
+#else
+  #define EIGEN_EMPTY_STRUCT_CTOR(X)
+#endif
+
+namespace Eigen {
+
+typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE DenseIndex;
+
+namespace internal {
+
+//classes inheriting no_assignment_operator don't generate a default operator=.
+class no_assignment_operator
+{
+  private:
+    no_assignment_operator& operator=(const no_assignment_operator&);
+};
+
+/** \internal return the index type with the largest number of bits */
+template<typename I1, typename I2>
+struct promote_index_type
+{
+  typedef typename conditional<(sizeof(I1)<sizeof(I2)), I2, I1>::type type;
+};
+
+/** \internal If the template parameter Value is Dynamic, this class is just a wrapper around a T variable that
+  * can be accessed using value() and setValue().
+  * Otherwise, this class is an empty structure and value() just returns the template parameter Value.
+  */
+template<typename T, int Value> class variable_if_dynamic
+{
+  public:
+    EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamic)
+    explicit variable_if_dynamic(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); assert(v == T(Value)); }
+    static T value() { return T(Value); }
+    void setValue(T) {}
+};
+
+template<typename T> class variable_if_dynamic<T, Dynamic>
+{
+    T m_value;
+    variable_if_dynamic() { assert(false); }
+  public:
+    explicit variable_if_dynamic(T value) : m_value(value) {}
+    T value() const { return m_value; }
+    void setValue(T value) { m_value = value; }
+};
+
+/** \internal like variable_if_dynamic but for DynamicIndex
+  */
+template<typename T, int Value> class variable_if_dynamicindex
+{
+  public:
+    EIGEN_EMPTY_STRUCT_CTOR(variable_if_dynamicindex)
+    explicit variable_if_dynamicindex(T v) { EIGEN_ONLY_USED_FOR_DEBUG(v); assert(v == T(Value)); }
+    static T value() { return T(Value); }
+    void setValue(T) {}
+};
+
+template<typename T> class variable_if_dynamicindex<T, DynamicIndex>
+{
+    T m_value;
+    variable_if_dynamicindex() { assert(false); }
+  public:
+    explicit variable_if_dynamicindex(T value) : m_value(value) {}
+    T value() const { return m_value; }
+    void setValue(T value) { m_value = value; }
+};
+
+template<typename T> struct functor_traits
+{
+  enum
+  {
+    Cost = 10,
+    PacketAccess = false
+  };
+};
+
+template<typename T> struct packet_traits;
+
+template<typename T> struct unpacket_traits
+{
+  typedef T type;
+  enum {size=1};
+};
+
+template<typename _Scalar, int _Rows, int _Cols,
+         int _Options = AutoAlign |
+                          ( (_Rows==1 && _Cols!=1) ? RowMajor
+                          : (_Cols==1 && _Rows!=1) ? ColMajor
+                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
+         int _MaxRows = _Rows,
+         int _MaxCols = _Cols
+> class make_proper_matrix_type
+{
+    enum {
+      IsColVector = _Cols==1 && _Rows!=1,
+      IsRowVector = _Rows==1 && _Cols!=1,
+      Options = IsColVector ? (_Options | ColMajor) & ~RowMajor
+              : IsRowVector ? (_Options | RowMajor) & ~ColMajor
+              : _Options
+    };
+  public:
+    typedef Matrix<_Scalar, _Rows, _Cols, Options, _MaxRows, _MaxCols> type;
+};
+
+template<typename Scalar, int Rows, int Cols, int Options, int MaxRows, int MaxCols>
+class compute_matrix_flags
+{
+    enum {
+      row_major_bit = Options&RowMajor ? RowMajorBit : 0,
+      is_dynamic_size_storage = MaxRows==Dynamic || MaxCols==Dynamic,
+
+      aligned_bit =
+      (
+            ((Options&DontAlign)==0)
+        && (
+#if EIGEN_ALIGN_STATICALLY
+             ((!is_dynamic_size_storage) && (((MaxCols*MaxRows*int(sizeof(Scalar))) % 16) == 0))
+#else
+             0
+#endif
+
+          ||
+
+#if EIGEN_ALIGN
+             is_dynamic_size_storage
+#else
+             0
+#endif
+
+          )
+      ) ? AlignedBit : 0,
+      packet_access_bit = packet_traits<Scalar>::Vectorizable && aligned_bit ? PacketAccessBit : 0
+    };
+
+  public:
+    enum { ret = LinearAccessBit | LvalueBit | DirectAccessBit | NestByRefBit | packet_access_bit | row_major_bit | aligned_bit };
+};
+
+template<int _Rows, int _Cols> struct size_at_compile_time
+{
+  enum { ret = (_Rows==Dynamic || _Cols==Dynamic) ? Dynamic : _Rows * _Cols };
+};
+
+/* plain_matrix_type : the difference from eval is that plain_matrix_type is always a plain matrix type,
+ * whereas eval is a const reference in the case of a matrix
+ */
+
+template<typename T, typename StorageKind = typename traits<T>::StorageKind> struct plain_matrix_type;
+template<typename T, typename BaseClassType> struct plain_matrix_type_dense;
+template<typename T> struct plain_matrix_type<T,Dense>
+{
+  typedef typename plain_matrix_type_dense<T,typename traits<T>::XprKind>::type type;
+};
+
+template<typename T> struct plain_matrix_type_dense<T,MatrixXpr>
+{
+  typedef Matrix<typename traits<T>::Scalar,
+                traits<T>::RowsAtCompileTime,
+                traits<T>::ColsAtCompileTime,
+                AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),
+                traits<T>::MaxRowsAtCompileTime,
+                traits<T>::MaxColsAtCompileTime
+          > type;
+};
+
+template<typename T> struct plain_matrix_type_dense<T,ArrayXpr>
+{
+  typedef Array<typename traits<T>::Scalar,
+                traits<T>::RowsAtCompileTime,
+                traits<T>::ColsAtCompileTime,
+                AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),
+                traits<T>::MaxRowsAtCompileTime,
+                traits<T>::MaxColsAtCompileTime
+          > type;
+};
+
+/* eval : the return type of eval(). For matrices, this is just a const reference
+ * in order to avoid a useless copy
+ */
+
+template<typename T, typename StorageKind = typename traits<T>::StorageKind> struct eval;
+
+template<typename T> struct eval<T,Dense>
+{
+  typedef typename plain_matrix_type<T>::type type;
+//   typedef typename T::PlainObject type;
+//   typedef T::Matrix<typename traits<T>::Scalar,
+//                 traits<T>::RowsAtCompileTime,
+//                 traits<T>::ColsAtCompileTime,
+//                 AutoAlign | (traits<T>::Flags&RowMajorBit ? RowMajor : ColMajor),
+//                 traits<T>::MaxRowsAtCompileTime,
+//                 traits<T>::MaxColsAtCompileTime
+//           > type;
+};
+
+// for matrices, no need to evaluate, just use a const reference to avoid a useless copy
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct eval<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
+{
+  typedef const Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;
+};
+
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct eval<Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>, Dense>
+{
+  typedef const Array<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& type;
+};
+
+
+
+/* plain_matrix_type_column_major : same as plain_matrix_type but guaranteed to be column-major
+ */
+template<typename T> struct plain_matrix_type_column_major
+{
+  enum { Rows = traits<T>::RowsAtCompileTime,
+         Cols = traits<T>::ColsAtCompileTime,
+         MaxRows = traits<T>::MaxRowsAtCompileTime,
+         MaxCols = traits<T>::MaxColsAtCompileTime
+  };
+  typedef Matrix<typename traits<T>::Scalar,
+                Rows,
+                Cols,
+                (MaxRows==1&&MaxCols!=1) ? RowMajor : ColMajor,
+                MaxRows,
+                MaxCols
+          > type;
+};
+
+/* plain_matrix_type_row_major : same as plain_matrix_type but guaranteed to be row-major
+ */
+template<typename T> struct plain_matrix_type_row_major
+{
+  enum { Rows = traits<T>::RowsAtCompileTime,
+         Cols = traits<T>::ColsAtCompileTime,
+         MaxRows = traits<T>::MaxRowsAtCompileTime,
+         MaxCols = traits<T>::MaxColsAtCompileTime
+  };
+  typedef Matrix<typename traits<T>::Scalar,
+                Rows,
+                Cols,
+                (MaxCols==1&&MaxRows!=1) ? RowMajor : ColMajor,
+                MaxRows,
+                MaxCols
+          > type;
+};
+
+// we should be able to get rid of this one too
+template<typename T> struct must_nest_by_value { enum { ret = false }; };
+
+/** \internal The reference selector for template expressions. The idea is that we don't
+  * need to use references for expressions since they are light weight proxy
+  * objects which should generate no copying overhead. */
+template <typename T>
+struct ref_selector
+{
+  typedef typename conditional<
+    bool(traits<T>::Flags & NestByRefBit),
+    T const&,
+    const T
+  >::type type;
+};
+
+/** \internal Adds the const qualifier on the value-type of T2 if and only if T1 is a const type */
+template<typename T1, typename T2>
+struct transfer_constness
+{
+  typedef typename conditional<
+    bool(internal::is_const<T1>::value),
+    typename internal::add_const_on_value_type<T2>::type,
+    T2
+  >::type type;
+};
+
+/** \internal Determines how a given expression should be nested into another one.
+  * For example, when you do a * (b+c), Eigen will determine how the expression b+c should be
+  * nested into the bigger product expression. The choice is between nesting the expression b+c as-is, or
+  * evaluating that expression b+c into a temporary variable d, and nest d so that the resulting expression is
+  * a*d. Evaluating can be beneficial for example if every coefficient access in the resulting expression causes
+  * many coefficient accesses in the nested expressions -- as is the case with matrix product for example.
+  *
+  * \param T the type of the expression being nested
+  * \param n the number of coefficient accesses in the nested expression for each coefficient access in the bigger expression.
+  *
+  * Note that if no evaluation occur, then the constness of T is preserved.
+  *
+  * Example. Suppose that a, b, and c are of type Matrix3d. The user forms the expression a*(b+c).
+  * b+c is an expression "sum of matrices", which we will denote by S. In order to determine how to nest it,
+  * the Product expression uses: nested<S, 3>::ret, which turns out to be Matrix3d because the internal logic of
+  * nested determined that in this case it was better to evaluate the expression b+c into a temporary. On the other hand,
+  * since a is of type Matrix3d, the Product expression nests it as nested<Matrix3d, 3>::ret, which turns out to be
+  * const Matrix3d&, because the internal logic of nested determined that since a was already a matrix, there was no point
+  * in copying it into another matrix.
+  */
+template<typename T, int n=1, typename PlainObject = typename eval<T>::type> struct nested
+{
+  enum {
+    // for the purpose of this test, to keep it reasonably simple, we arbitrarily choose a value of Dynamic values.
+    // the choice of 10000 makes it larger than any practical fixed value and even most dynamic values.
+    // in extreme cases where these assumptions would be wrong, we would still at worst suffer performance issues
+    // (poor choice of temporaries).
+    // it's important that this value can still be squared without integer overflowing.
+    DynamicAsInteger = 10000,
+    ScalarReadCost = NumTraits<typename traits<T>::Scalar>::ReadCost,
+    ScalarReadCostAsInteger = ScalarReadCost == Dynamic ? int(DynamicAsInteger) : int(ScalarReadCost),
+    CoeffReadCost = traits<T>::CoeffReadCost,
+    CoeffReadCostAsInteger = CoeffReadCost == Dynamic ? int(DynamicAsInteger) : int(CoeffReadCost),
+    NAsInteger = n == Dynamic ? int(DynamicAsInteger) : n,
+    CostEvalAsInteger   = (NAsInteger+1) * ScalarReadCostAsInteger + CoeffReadCostAsInteger,
+    CostNoEvalAsInteger = NAsInteger * CoeffReadCostAsInteger
+  };
+
+  typedef typename conditional<
+      ( (int(traits<T>::Flags) & EvalBeforeNestingBit) ||
+        int(CostEvalAsInteger) < int(CostNoEvalAsInteger)
+      ),
+      PlainObject,
+      typename ref_selector<T>::type
+  >::type type;
+};
+
+template<typename T>
+T* const_cast_ptr(const T* ptr)
+{
+  return const_cast<T*>(ptr);
+}
+
+template<typename Derived, typename XprKind = typename traits<Derived>::XprKind>
+struct dense_xpr_base
+{
+  /* dense_xpr_base should only ever be used on dense expressions, thus falling either into the MatrixXpr or into the ArrayXpr cases */
+};
+
+template<typename Derived>
+struct dense_xpr_base<Derived, MatrixXpr>
+{
+  typedef MatrixBase<Derived> type;
+};
+
+template<typename Derived>
+struct dense_xpr_base<Derived, ArrayXpr>
+{
+  typedef ArrayBase<Derived> type;
+};
+
+/** \internal Helper base class to add a scalar multiple operator
+  * overloads for complex types */
+template<typename Derived,typename Scalar,typename OtherScalar,
+         bool EnableIt = !is_same<Scalar,OtherScalar>::value >
+struct special_scalar_op_base : public DenseCoeffsBase<Derived>
+{
+  // dummy operator* so that the
+  // "using special_scalar_op_base::operator*" compiles
+  void operator*() const;
+};
+
+template<typename Derived,typename Scalar,typename OtherScalar>
+struct special_scalar_op_base<Derived,Scalar,OtherScalar,true>  : public DenseCoeffsBase<Derived>
+{
+  const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
+  operator*(const OtherScalar& scalar) const
+  {
+    return CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
+      (*static_cast<const Derived*>(this), scalar_multiple2_op<Scalar,OtherScalar>(scalar));
+  }
+
+  inline friend const CwiseUnaryOp<scalar_multiple2_op<Scalar,OtherScalar>, Derived>
+  operator*(const OtherScalar& scalar, const Derived& matrix)
+  { return static_cast<const special_scalar_op_base&>(matrix).operator*(scalar); }
+};
+
+template<typename XprType, typename CastType> struct cast_return_type
+{
+  typedef typename XprType::Scalar CurrentScalarType;
+  typedef typename remove_all<CastType>::type _CastType;
+  typedef typename _CastType::Scalar NewScalarType;
+  typedef typename conditional<is_same<CurrentScalarType,NewScalarType>::value,
+                              const XprType&,CastType>::type type;
+};
+
+template <typename A, typename B> struct promote_storage_type;
+
+template <typename A> struct promote_storage_type<A,A>
+{
+  typedef A ret;
+};
+
+/** \internal gives the plain matrix or array type to store a row/column/diagonal of a matrix type.
+  * \param Scalar optional parameter allowing to pass a different scalar type than the one of the MatrixType.
+  */
+template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_row_type
+{
+  typedef Matrix<Scalar, 1, ExpressionType::ColsAtCompileTime,
+                 ExpressionType::PlainObject::Options | RowMajor, 1, ExpressionType::MaxColsAtCompileTime> MatrixRowType;
+  typedef Array<Scalar, 1, ExpressionType::ColsAtCompileTime,
+                 ExpressionType::PlainObject::Options | RowMajor, 1, ExpressionType::MaxColsAtCompileTime> ArrayRowType;
+
+  typedef typename conditional<
+    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
+    MatrixRowType,
+    ArrayRowType 
+  >::type type;
+};
+
+template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_col_type
+{
+  typedef Matrix<Scalar, ExpressionType::RowsAtCompileTime, 1,
+                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> MatrixColType;
+  typedef Array<Scalar, ExpressionType::RowsAtCompileTime, 1,
+                 ExpressionType::PlainObject::Options & ~RowMajor, ExpressionType::MaxRowsAtCompileTime, 1> ArrayColType;
+
+  typedef typename conditional<
+    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
+    MatrixColType,
+    ArrayColType 
+  >::type type;
+};
+
+template<typename ExpressionType, typename Scalar = typename ExpressionType::Scalar>
+struct plain_diag_type
+{
+  enum { diag_size = EIGEN_SIZE_MIN_PREFER_DYNAMIC(ExpressionType::RowsAtCompileTime, ExpressionType::ColsAtCompileTime),
+         max_diag_size = EIGEN_SIZE_MIN_PREFER_FIXED(ExpressionType::MaxRowsAtCompileTime, ExpressionType::MaxColsAtCompileTime)
+  };
+  typedef Matrix<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> MatrixDiagType;
+  typedef Array<Scalar, diag_size, 1, ExpressionType::PlainObject::Options & ~RowMajor, max_diag_size, 1> ArrayDiagType;
+
+  typedef typename conditional<
+    is_same< typename traits<ExpressionType>::XprKind, MatrixXpr >::value,
+    MatrixDiagType,
+    ArrayDiagType 
+  >::type type;
+};
+
+template<typename ExpressionType>
+struct is_lvalue
+{
+  enum { value = !bool(is_const<ExpressionType>::value) &&
+                 bool(traits<ExpressionType>::Flags & LvalueBit) };
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_XPRHELPER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Block.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Block.h
new file mode 100644
index 0000000..604456f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Block.h
@@ -0,0 +1,126 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BLOCK2_H
+#define EIGEN_BLOCK2_H
+
+namespace Eigen { 
+
+/** \returns a dynamic-size expression of a corner of *this.
+  *
+  * \param type the type of corner. Can be \a Eigen::TopLeft, \a Eigen::TopRight,
+  * \a Eigen::BottomLeft, \a Eigen::BottomRight.
+  * \param cRows the number of rows in the corner
+  * \param cCols the number of columns in the corner
+  *
+  * Example: \include MatrixBase_corner_enum_int_int.cpp
+  * Output: \verbinclude MatrixBase_corner_enum_int_int.out
+  *
+  * \note Even though the returned expression has dynamic size, in the case
+  * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
+  * which means that evaluating it does not cause a dynamic memory allocation.
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+inline Block<Derived> DenseBase<Derived>
+  ::corner(CornerType type, Index cRows, Index cCols)
+{
+  switch(type)
+  {
+    default:
+      eigen_assert(false && "Bad corner type.");
+    case TopLeft:
+      return Block<Derived>(derived(), 0, 0, cRows, cCols);
+    case TopRight:
+      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
+    case BottomLeft:
+      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
+    case BottomRight:
+      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+  }
+}
+
+/** This is the const version of corner(CornerType, Index, Index).*/
+template<typename Derived>
+inline const Block<Derived>
+DenseBase<Derived>::corner(CornerType type, Index cRows, Index cCols) const
+{
+  switch(type)
+  {
+    default:
+      eigen_assert(false && "Bad corner type.");
+    case TopLeft:
+      return Block<Derived>(derived(), 0, 0, cRows, cCols);
+    case TopRight:
+      return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
+    case BottomLeft:
+      return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
+    case BottomRight:
+      return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+  }
+}
+
+/** \returns a fixed-size expression of a corner of *this.
+  *
+  * \param type the type of corner. Can be \a Eigen::TopLeft, \a Eigen::TopRight,
+  * \a Eigen::BottomLeft, \a Eigen::BottomRight.
+  *
+  * The template parameters CRows and CCols arethe number of rows and columns in the corner.
+  *
+  * Example: \include MatrixBase_template_int_int_corner_enum.cpp
+  * Output: \verbinclude MatrixBase_template_int_int_corner_enum.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<typename Derived>
+template<int CRows, int CCols>
+inline Block<Derived, CRows, CCols>
+DenseBase<Derived>::corner(CornerType type)
+{
+  switch(type)
+  {
+    default:
+      eigen_assert(false && "Bad corner type.");
+    case TopLeft:
+      return Block<Derived, CRows, CCols>(derived(), 0, 0);
+    case TopRight:
+      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
+    case BottomLeft:
+      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
+    case BottomRight:
+      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
+  }
+}
+
+/** This is the const version of corner<int, int>(CornerType).*/
+template<typename Derived>
+template<int CRows, int CCols>
+inline const Block<Derived, CRows, CCols>
+DenseBase<Derived>::corner(CornerType type) const
+{
+  switch(type)
+  {
+    default:
+      eigen_assert(false && "Bad corner type.");
+    case TopLeft:
+      return Block<Derived, CRows, CCols>(derived(), 0, 0);
+    case TopRight:
+      return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
+    case BottomLeft:
+      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
+    case BottomRight:
+      return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
+  }
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_BLOCK2_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CMakeLists.txt
new file mode 100644
index 0000000..7ae41b3
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CMakeLists.txt
@@ -0,0 +1,8 @@
+FILE(GLOB Eigen_Eigen2Support_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Eigen2Support_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigen2Support COMPONENT Devel
+  )
+
+ADD_SUBDIRECTORY(Geometry)
\ No newline at end of file
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Cwise.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Cwise.h
new file mode 100644
index 0000000..d95009b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Cwise.h
@@ -0,0 +1,192 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CWISE_H
+#define EIGEN_CWISE_H
+
+namespace Eigen { 
+
+/** \internal
+  * convenient macro to defined the return type of a cwise binary operation */
+#define EIGEN_CWISE_BINOP_RETURN_TYPE(OP) \
+    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, OtherDerived>
+
+/** \internal
+  * convenient macro to defined the return type of a cwise unary operation */
+#define EIGEN_CWISE_UNOP_RETURN_TYPE(OP) \
+    CwiseUnaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType>
+
+/** \internal
+  * convenient macro to defined the return type of a cwise comparison to a scalar */
+#define EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(OP) \
+    CwiseBinaryOp<OP<typename internal::traits<ExpressionType>::Scalar>, ExpressionType, \
+        typename ExpressionType::ConstantReturnType >
+
+/** \class Cwise
+  *
+  * \brief Pseudo expression providing additional coefficient-wise operations
+  *
+  * \param ExpressionType the type of the object on which to do coefficient-wise operations
+  *
+  * This class represents an expression with additional coefficient-wise features.
+  * It is the return type of MatrixBase::cwise()
+  * and most of the time this is the only way it is used.
+  *
+  * Example: \include MatrixBase_cwise_const.cpp
+  * Output: \verbinclude MatrixBase_cwise_const.out
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_CWISE_PLUGIN.
+  *
+  * \sa MatrixBase::cwise() const, MatrixBase::cwise()
+  */
+template<typename ExpressionType> class Cwise
+{
+  public:
+
+    typedef typename internal::traits<ExpressionType>::Scalar Scalar;
+    typedef typename internal::conditional<internal::must_nest_by_value<ExpressionType>::ret,
+        ExpressionType, const ExpressionType&>::type ExpressionTypeNested;
+    typedef CwiseUnaryOp<internal::scalar_add_op<Scalar>, ExpressionType> ScalarAddReturnType;
+
+    inline Cwise(const ExpressionType& matrix) : m_matrix(matrix) {}
+
+    /** \internal */
+    inline const ExpressionType& _expression() const { return m_matrix; }
+
+    template<typename OtherDerived>
+    const EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)
+    operator*(const MatrixBase<OtherDerived> &other) const;
+
+    template<typename OtherDerived>
+    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)
+    operator/(const MatrixBase<OtherDerived> &other) const;
+
+    /** \deprecated ArrayBase::min() */
+    template<typename OtherDerived>
+    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)
+    (min)(const MatrixBase<OtherDerived> &other) const
+    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_min_op)(_expression(), other.derived()); }
+
+    /** \deprecated ArrayBase::max() */
+    template<typename OtherDerived>
+    const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)
+    (max)(const MatrixBase<OtherDerived> &other) const
+    { return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_max_op)(_expression(), other.derived()); }
+
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs_op)      abs() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs2_op)     abs2() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_square_op)   square() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cube_op)     cube() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_inverse_op)  inverse() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sqrt_op)     sqrt() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_exp_op)      exp() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_log_op)      log() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cos_op)      cos() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sin_op)      sin() const;
+    const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)      pow(const Scalar& exponent) const;
+
+    const ScalarAddReturnType
+    operator+(const Scalar& scalar) const;
+
+    /** \relates Cwise */
+    friend const ScalarAddReturnType
+    operator+(const Scalar& scalar, const Cwise& mat)
+    { return mat + scalar; }
+
+    ExpressionType& operator+=(const Scalar& scalar);
+
+    const ScalarAddReturnType
+    operator-(const Scalar& scalar) const;
+
+    ExpressionType& operator-=(const Scalar& scalar);
+
+    template<typename OtherDerived>
+    inline ExpressionType& operator*=(const MatrixBase<OtherDerived> &other);
+
+    template<typename OtherDerived>
+    inline ExpressionType& operator/=(const MatrixBase<OtherDerived> &other);
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)
+    operator<(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)
+    operator<=(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)
+    operator>(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)
+    operator>=(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)
+    operator==(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> const EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)
+    operator!=(const MatrixBase<OtherDerived>& other) const;
+
+    // comparisons to a scalar value
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)
+    operator<(Scalar s) const;
+
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)
+    operator<=(Scalar s) const;
+
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)
+    operator>(Scalar s) const;
+
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)
+    operator>=(Scalar s) const;
+
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)
+    operator==(Scalar s) const;
+
+    const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)
+    operator!=(Scalar s) const;
+
+    // allow to extend Cwise outside Eigen
+    #ifdef EIGEN_CWISE_PLUGIN
+    #include EIGEN_CWISE_PLUGIN
+    #endif
+
+  protected:
+    ExpressionTypeNested m_matrix;
+};
+
+
+/** \returns a Cwise wrapper of *this providing additional coefficient-wise operations
+  *
+  * Example: \include MatrixBase_cwise_const.cpp
+  * Output: \verbinclude MatrixBase_cwise_const.out
+  *
+  * \sa class Cwise, cwise()
+  */
+template<typename Derived>
+inline const Cwise<Derived> MatrixBase<Derived>::cwise() const
+{
+  return derived();
+}
+
+/** \returns a Cwise wrapper of *this providing additional coefficient-wise operations
+  *
+  * Example: \include MatrixBase_cwise.cpp
+  * Output: \verbinclude MatrixBase_cwise.out
+  *
+  * \sa class Cwise, cwise() const
+  */
+template<typename Derived>
+inline Cwise<Derived> MatrixBase<Derived>::cwise()
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_CWISE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CwiseOperators.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CwiseOperators.h
new file mode 100644
index 0000000..482f306
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/CwiseOperators.h
@@ -0,0 +1,298 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ARRAY_CWISE_OPERATORS_H
+#define EIGEN_ARRAY_CWISE_OPERATORS_H
+
+namespace Eigen { 
+
+/***************************************************************************
+* The following functions were defined in Core
+***************************************************************************/
+
+
+/** \deprecated ArrayBase::abs() */
+template<typename ExpressionType>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs_op)
+Cwise<ExpressionType>::abs() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::abs2() */
+template<typename ExpressionType>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_abs2_op)
+Cwise<ExpressionType>::abs2() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::exp() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_exp_op)
+Cwise<ExpressionType>::exp() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::log() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_log_op)
+Cwise<ExpressionType>::log() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::operator*() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)
+Cwise<ExpressionType>::operator*(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(ExpressionType,OtherDerived)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator/() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)
+Cwise<ExpressionType>::operator/(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(internal::scalar_quotient_op)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator*=() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other)
+{
+  return m_matrix.const_cast_derived() = *this * other;
+}
+
+/** \deprecated ArrayBase::operator/=() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other)
+{
+  return m_matrix.const_cast_derived() = *this / other;
+}
+
+/***************************************************************************
+* The following functions were defined in Array
+***************************************************************************/
+
+// -- unary operators --
+
+/** \deprecated ArrayBase::sqrt() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sqrt_op)
+Cwise<ExpressionType>::sqrt() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::cos() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cos_op)
+Cwise<ExpressionType>::cos() const
+{
+  return _expression();
+}
+
+
+/** \deprecated ArrayBase::sin() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_sin_op)
+Cwise<ExpressionType>::sin() const
+{
+  return _expression();
+}
+
+
+/** \deprecated ArrayBase::log() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)
+Cwise<ExpressionType>::pow(const Scalar& exponent) const
+{
+  return EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_pow_op)(_expression(), internal::scalar_pow_op<Scalar>(exponent));
+}
+
+
+/** \deprecated ArrayBase::inverse() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_inverse_op)
+Cwise<ExpressionType>::inverse() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::square() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_square_op)
+Cwise<ExpressionType>::square() const
+{
+  return _expression();
+}
+
+/** \deprecated ArrayBase::cube() */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_UNOP_RETURN_TYPE(internal::scalar_cube_op)
+Cwise<ExpressionType>::cube() const
+{
+  return _expression();
+}
+
+
+// -- binary operators --
+
+/** \deprecated ArrayBase::operator<() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)
+Cwise<ExpressionType>::operator<(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::less)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::<=() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)
+Cwise<ExpressionType>::operator<=(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::less_equal)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator>() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)
+Cwise<ExpressionType>::operator>(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator>=() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)
+Cwise<ExpressionType>::operator>=(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::greater_equal)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator==() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)
+Cwise<ExpressionType>::operator==(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::equal_to)(_expression(), other.derived());
+}
+
+/** \deprecated ArrayBase::operator!=() */
+template<typename ExpressionType>
+template<typename OtherDerived>
+inline const EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)
+Cwise<ExpressionType>::operator!=(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_BINOP_RETURN_TYPE(std::not_equal_to)(_expression(), other.derived());
+}
+
+// comparisons to scalar value
+
+/** \deprecated ArrayBase::operator<(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)
+Cwise<ExpressionType>::operator<(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+/** \deprecated ArrayBase::operator<=(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)
+Cwise<ExpressionType>::operator<=(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::less_equal)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+/** \deprecated ArrayBase::operator>(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)
+Cwise<ExpressionType>::operator>(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+/** \deprecated ArrayBase::operator>=(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)
+Cwise<ExpressionType>::operator>=(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::greater_equal)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+/** \deprecated ArrayBase::operator==(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)
+Cwise<ExpressionType>::operator==(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::equal_to)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+/** \deprecated ArrayBase::operator!=(Scalar) */
+template<typename ExpressionType>
+inline const EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)
+Cwise<ExpressionType>::operator!=(Scalar s) const
+{
+  return EIGEN_CWISE_COMP_TO_SCALAR_RETURN_TYPE(std::not_equal_to)(_expression(),
+            typename ExpressionType::ConstantReturnType(_expression().rows(), _expression().cols(), s));
+}
+
+// scalar addition
+
+/** \deprecated ArrayBase::operator+(Scalar) */
+template<typename ExpressionType>
+inline const typename Cwise<ExpressionType>::ScalarAddReturnType
+Cwise<ExpressionType>::operator+(const Scalar& scalar) const
+{
+  return typename Cwise<ExpressionType>::ScalarAddReturnType(m_matrix, internal::scalar_add_op<Scalar>(scalar));
+}
+
+/** \deprecated ArrayBase::operator+=(Scalar) */
+template<typename ExpressionType>
+inline ExpressionType& Cwise<ExpressionType>::operator+=(const Scalar& scalar)
+{
+  return m_matrix.const_cast_derived() = *this + scalar;
+}
+
+/** \deprecated ArrayBase::operator-(Scalar) */
+template<typename ExpressionType>
+inline const typename Cwise<ExpressionType>::ScalarAddReturnType
+Cwise<ExpressionType>::operator-(const Scalar& scalar) const
+{
+  return *this + (-scalar);
+}
+
+/** \deprecated ArrayBase::operator-=(Scalar) */
+template<typename ExpressionType>
+inline ExpressionType& Cwise<ExpressionType>::operator-=(const Scalar& scalar)
+{
+  return m_matrix.const_cast_derived() = *this - scalar;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ARRAY_CWISE_OPERATORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AlignedBox.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AlignedBox.h
new file mode 100644
index 0000000..7b2b865
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AlignedBox.h
@@ -0,0 +1,159 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  * \nonstableyet
+  *
+  * \class AlignedBox
+  *
+  * \brief An axis aligned box
+  *
+  * \param _Scalar the type of the scalar coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  *
+  * This class represents an axis aligned box as a pair of the minimal and maximal corners.
+  */
+template <typename _Scalar, int _AmbientDim>
+class AlignedBox
+{
+public:
+EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)
+  enum { AmbientDimAtCompileTime = _AmbientDim };
+  typedef _Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
+
+  /** Default constructor initializing a null box. */
+  inline explicit AlignedBox()
+  { if (AmbientDimAtCompileTime!=Dynamic) setNull(); }
+
+  /** Constructs a null box with \a _dim the dimension of the ambient space. */
+  inline explicit AlignedBox(int _dim) : m_min(_dim), m_max(_dim)
+  { setNull(); }
+
+  /** Constructs a box with extremities \a _min and \a _max. */
+  inline AlignedBox(const VectorType& _min, const VectorType& _max) : m_min(_min), m_max(_max) {}
+
+  /** Constructs a box containing a single point \a p. */
+  inline explicit AlignedBox(const VectorType& p) : m_min(p), m_max(p) {}
+
+  ~AlignedBox() {}
+
+  /** \returns the dimension in which the box holds */
+  inline int dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size()-1 : AmbientDimAtCompileTime; }
+
+  /** \returns true if the box is null, i.e, empty. */
+  inline bool isNull() const { return (m_min.cwise() > m_max).any(); }
+
+  /** Makes \c *this a null/empty box. */
+  inline void setNull()
+  {
+    m_min.setConstant( (std::numeric_limits<Scalar>::max)());
+    m_max.setConstant(-(std::numeric_limits<Scalar>::max)());
+  }
+
+  /** \returns the minimal corner */
+  inline const VectorType& (min)() const { return m_min; }
+  /** \returns a non const reference to the minimal corner */
+  inline VectorType& (min)() { return m_min; }
+  /** \returns the maximal corner */
+  inline const VectorType& (max)() const { return m_max; }
+  /** \returns a non const reference to the maximal corner */
+  inline VectorType& (max)() { return m_max; }
+
+  /** \returns true if the point \a p is inside the box \c *this. */
+  inline bool contains(const VectorType& p) const
+  { return (m_min.cwise()<=p).all() && (p.cwise()<=m_max).all(); }
+
+  /** \returns true if the box \a b is entirely inside the box \c *this. */
+  inline bool contains(const AlignedBox& b) const
+  { return (m_min.cwise()<=(b.min)()).all() && ((b.max)().cwise()<=m_max).all(); }
+
+  /** Extends \c *this such that it contains the point \a p and returns a reference to \c *this. */
+  inline AlignedBox& extend(const VectorType& p)
+  { m_min = (m_min.cwise().min)(p); m_max = (m_max.cwise().max)(p); return *this; }
+
+  /** Extends \c *this such that it contains the box \a b and returns a reference to \c *this. */
+  inline AlignedBox& extend(const AlignedBox& b)
+  { m_min = (m_min.cwise().min)(b.m_min); m_max = (m_max.cwise().max)(b.m_max); return *this; }
+
+  /** Clamps \c *this by the box \a b and returns a reference to \c *this. */
+  inline AlignedBox& clamp(const AlignedBox& b)
+  { m_min = (m_min.cwise().max)(b.m_min); m_max = (m_max.cwise().min)(b.m_max); return *this; }
+
+  /** Translate \c *this by the vector \a t and returns a reference to \c *this. */
+  inline AlignedBox& translate(const VectorType& t)
+  { m_min += t; m_max += t; return *this; }
+
+  /** \returns the squared distance between the point \a p and the box \c *this,
+    * and zero if \a p is inside the box.
+    * \sa exteriorDistance()
+    */
+  inline Scalar squaredExteriorDistance(const VectorType& p) const;
+
+  /** \returns the distance between the point \a p and the box \c *this,
+    * and zero if \a p is inside the box.
+    * \sa squaredExteriorDistance()
+    */
+  inline Scalar exteriorDistance(const VectorType& p) const
+  { return ei_sqrt(squaredExteriorDistance(p)); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<AlignedBox,
+           AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+  {
+    return typename internal::cast_return_type<AlignedBox,
+                    AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit AlignedBox(const AlignedBox<OtherScalarType,AmbientDimAtCompileTime>& other)
+  {
+    m_min = (other.min)().template cast<Scalar>();
+    m_max = (other.max)().template cast<Scalar>();
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const AlignedBox& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec); }
+
+protected:
+
+  VectorType m_min, m_max;
+};
+
+template<typename Scalar,int AmbiantDim>
+inline Scalar AlignedBox<Scalar,AmbiantDim>::squaredExteriorDistance(const VectorType& p) const
+{
+  Scalar dist2(0);
+  Scalar aux;
+  for (int k=0; k<dim(); ++k)
+  {
+    if ((aux = (p[k]-m_min[k]))<Scalar(0))
+      dist2 += aux*aux;
+    else if ( (aux = (m_max[k]-p[k]))<Scalar(0))
+      dist2 += aux*aux;
+  }
+  return dist2;
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/All.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/All.h
new file mode 100644
index 0000000..e0b00fc
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/All.h
@@ -0,0 +1,115 @@
+#ifndef EIGEN2_GEOMETRY_MODULE_H
+#define EIGEN2_GEOMETRY_MODULE_H
+
+#include <limits>
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
+#include "RotationBase.h"
+#include "Rotation2D.h"
+#include "Quaternion.h"
+#include "AngleAxis.h"
+#include "Transform.h"
+#include "Translation.h"
+#include "Scaling.h"
+#include "AlignedBox.h"
+#include "Hyperplane.h"
+#include "ParametrizedLine.h"
+#endif
+
+
+#define RotationBase eigen2_RotationBase
+#define Rotation2D eigen2_Rotation2D
+#define Rotation2Df eigen2_Rotation2Df
+#define Rotation2Dd eigen2_Rotation2Dd
+
+#define Quaternion  eigen2_Quaternion
+#define Quaternionf eigen2_Quaternionf
+#define Quaterniond eigen2_Quaterniond
+
+#define AngleAxis eigen2_AngleAxis
+#define AngleAxisf eigen2_AngleAxisf
+#define AngleAxisd eigen2_AngleAxisd
+
+#define Transform   eigen2_Transform
+#define Transform2f eigen2_Transform2f
+#define Transform2d eigen2_Transform2d
+#define Transform3f eigen2_Transform3f
+#define Transform3d eigen2_Transform3d
+
+#define Translation eigen2_Translation
+#define Translation2f eigen2_Translation2f
+#define Translation2d eigen2_Translation2d
+#define Translation3f eigen2_Translation3f
+#define Translation3d eigen2_Translation3d
+
+#define Scaling eigen2_Scaling
+#define Scaling2f eigen2_Scaling2f
+#define Scaling2d eigen2_Scaling2d
+#define Scaling3f eigen2_Scaling3f
+#define Scaling3d eigen2_Scaling3d
+
+#define AlignedBox eigen2_AlignedBox
+
+#define Hyperplane eigen2_Hyperplane
+#define ParametrizedLine eigen2_ParametrizedLine
+
+#define ei_toRotationMatrix eigen2_ei_toRotationMatrix
+#define ei_quaternion_assign_impl eigen2_ei_quaternion_assign_impl
+#define ei_transform_product_impl eigen2_ei_transform_product_impl
+
+#include "RotationBase.h"
+#include "Rotation2D.h"
+#include "Quaternion.h"
+#include "AngleAxis.h"
+#include "Transform.h"
+#include "Translation.h"
+#include "Scaling.h"
+#include "AlignedBox.h"
+#include "Hyperplane.h"
+#include "ParametrizedLine.h"
+
+#undef ei_toRotationMatrix
+#undef ei_quaternion_assign_impl
+#undef ei_transform_product_impl
+
+#undef RotationBase
+#undef Rotation2D
+#undef Rotation2Df
+#undef Rotation2Dd
+
+#undef Quaternion
+#undef Quaternionf
+#undef Quaterniond
+
+#undef AngleAxis
+#undef AngleAxisf
+#undef AngleAxisd
+
+#undef Transform
+#undef Transform2f
+#undef Transform2d
+#undef Transform3f
+#undef Transform3d
+
+#undef Translation
+#undef Translation2f
+#undef Translation2d
+#undef Translation3f
+#undef Translation3d
+
+#undef Scaling
+#undef Scaling2f
+#undef Scaling2d
+#undef Scaling3f
+#undef Scaling3d
+
+#undef AlignedBox
+
+#undef Hyperplane
+#undef ParametrizedLine
+
+#endif // EIGEN2_GEOMETRY_MODULE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AngleAxis.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AngleAxis.h
new file mode 100644
index 0000000..af598a4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/AngleAxis.h
@@ -0,0 +1,214 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class AngleAxis
+  *
+  * \brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  *
+  * The following two typedefs are provided for convenience:
+  * \li \c AngleAxisf for \c float
+  * \li \c AngleAxisd for \c double
+  *
+  * \addexample AngleAxisForEuler \label How to define a rotation from Euler-angles
+  *
+  * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily
+  * mimic Euler-angles. Here is an example:
+  * \include AngleAxis_mimic_euler.cpp
+  * Output: \verbinclude AngleAxis_mimic_euler.out
+  *
+  * \note This class is not aimed to be used to store a rotation transformation,
+  * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)
+  * and transformation objects.
+  *
+  * \sa class Quaternion, class Transform, MatrixBase::UnitX()
+  */
+
+template<typename _Scalar> struct ei_traits<AngleAxis<_Scalar> >
+{
+  typedef _Scalar Scalar;
+};
+
+template<typename _Scalar>
+class AngleAxis : public RotationBase<AngleAxis<_Scalar>,3>
+{
+  typedef RotationBase<AngleAxis<_Scalar>,3> Base;
+
+public:
+
+  using Base::operator*;
+
+  enum { Dim = 3 };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  typedef Matrix<Scalar,3,3> Matrix3;
+  typedef Matrix<Scalar,3,1> Vector3;
+  typedef Quaternion<Scalar> QuaternionType;
+
+protected:
+
+  Vector3 m_axis;
+  Scalar m_angle;
+
+public:
+
+  /** Default constructor without initialization. */
+  AngleAxis() {}
+  /** Constructs and initialize the angle-axis rotation from an \a angle in radian
+    * and an \a axis which must be normalized. */
+  template<typename Derived>
+  inline AngleAxis(Scalar angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}
+  /** Constructs and initialize the angle-axis rotation from a quaternion \a q. */
+  inline AngleAxis(const QuaternionType& q) { *this = q; }
+  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */
+  template<typename Derived>
+  inline explicit AngleAxis(const MatrixBase<Derived>& m) { *this = m; }
+
+  Scalar angle() const { return m_angle; }
+  Scalar& angle() { return m_angle; }
+
+  const Vector3& axis() const { return m_axis; }
+  Vector3& axis() { return m_axis; }
+
+  /** Concatenates two rotations */
+  inline QuaternionType operator* (const AngleAxis& other) const
+  { return QuaternionType(*this) * QuaternionType(other); }
+
+  /** Concatenates two rotations */
+  inline QuaternionType operator* (const QuaternionType& other) const
+  { return QuaternionType(*this) * other; }
+
+  /** Concatenates two rotations */
+  friend inline QuaternionType operator* (const QuaternionType& a, const AngleAxis& b)
+  { return a * QuaternionType(b); }
+
+  /** Concatenates two rotations */
+  inline Matrix3 operator* (const Matrix3& other) const
+  { return toRotationMatrix() * other; }
+
+  /** Concatenates two rotations */
+  inline friend Matrix3 operator* (const Matrix3& a, const AngleAxis& b)
+  { return a * b.toRotationMatrix(); }
+
+  /** Applies rotation to vector */
+  inline Vector3 operator* (const Vector3& other) const
+  { return toRotationMatrix() * other; }
+
+  /** \returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */
+  AngleAxis inverse() const
+  { return AngleAxis(-m_angle, m_axis); }
+
+  AngleAxis& operator=(const QuaternionType& q);
+  template<typename Derived>
+  AngleAxis& operator=(const MatrixBase<Derived>& m);
+
+  template<typename Derived>
+  AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);
+  Matrix3 toRotationMatrix(void) const;
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type cast() const
+  { return typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other)
+  {
+    m_axis = other.axis().template cast<Scalar>();
+    m_angle = Scalar(other.angle());
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const AngleAxis& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_axis.isApprox(other.m_axis, prec) && ei_isApprox(m_angle,other.m_angle, prec); }
+};
+
+/** \ingroup Geometry_Module
+  * single precision angle-axis type */
+typedef AngleAxis<float> AngleAxisf;
+/** \ingroup Geometry_Module
+  * double precision angle-axis type */
+typedef AngleAxis<double> AngleAxisd;
+
+/** Set \c *this from a quaternion.
+  * The axis is normalized.
+  */
+template<typename Scalar>
+AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionType& q)
+{
+  Scalar n2 = q.vec().squaredNorm();
+  if (n2 < precision<Scalar>()*precision<Scalar>())
+  {
+    m_angle = 0;
+    m_axis << 1, 0, 0;
+  }
+  else
+  {
+    m_angle = 2*std::acos(q.w());
+    m_axis = q.vec() / ei_sqrt(n2);
+  }
+  return *this;
+}
+
+/** Set \c *this from a 3x3 rotation matrix \a mat.
+  */
+template<typename Scalar>
+template<typename Derived>
+AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat)
+{
+  // Since a direct conversion would not be really faster,
+  // let's use the robust Quaternion implementation:
+  return *this = QuaternionType(mat);
+}
+
+/** Constructs and \returns an equivalent 3x3 rotation matrix.
+  */
+template<typename Scalar>
+typename AngleAxis<Scalar>::Matrix3
+AngleAxis<Scalar>::toRotationMatrix(void) const
+{
+  Matrix3 res;
+  Vector3 sin_axis  = ei_sin(m_angle) * m_axis;
+  Scalar c = ei_cos(m_angle);
+  Vector3 cos1_axis = (Scalar(1)-c) * m_axis;
+
+  Scalar tmp;
+  tmp = cos1_axis.x() * m_axis.y();
+  res.coeffRef(0,1) = tmp - sin_axis.z();
+  res.coeffRef(1,0) = tmp + sin_axis.z();
+
+  tmp = cos1_axis.x() * m_axis.z();
+  res.coeffRef(0,2) = tmp + sin_axis.y();
+  res.coeffRef(2,0) = tmp - sin_axis.y();
+
+  tmp = cos1_axis.y() * m_axis.z();
+  res.coeffRef(1,2) = tmp - sin_axis.x();
+  res.coeffRef(2,1) = tmp + sin_axis.x();
+
+  res.diagonal() = (cos1_axis.cwise() * m_axis).cwise() + c;
+
+  return res;
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt
new file mode 100644
index 0000000..c347a8f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Eigen2Support_Geometry_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Eigen2Support_Geometry_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigen2Support/Geometry
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Hyperplane.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Hyperplane.h
new file mode 100644
index 0000000..49e3739
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Hyperplane.h
@@ -0,0 +1,254 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Hyperplane
+  *
+  * \brief A hyperplane
+  *
+  * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.
+  * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  *             Notice that the dimension of the hyperplane is _AmbientDim-1.
+  *
+  * This class represents an hyperplane as the zero set of the implicit equation
+  * \f$ n \cdot x + d = 0 \f$ where \f$ n \f$ is a unit normal vector of the plane (linear part)
+  * and \f$ d \f$ is the distance (offset) to the origin.
+  */
+template <typename _Scalar, int _AmbientDim>
+class Hyperplane
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)
+  enum { AmbientDimAtCompileTime = _AmbientDim };
+  typedef _Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
+  typedef Matrix<Scalar,int(AmbientDimAtCompileTime)==Dynamic
+                        ? Dynamic
+                        : int(AmbientDimAtCompileTime)+1,1> Coefficients;
+  typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;
+
+  /** Default constructor without initialization */
+  inline explicit Hyperplane() {}
+
+  /** Constructs a dynamic-size hyperplane with \a _dim the dimension
+    * of the ambient space */
+  inline explicit Hyperplane(int _dim) : m_coeffs(_dim+1) {}
+
+  /** Construct a plane from its normal \a n and a point \a e onto the plane.
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline Hyperplane(const VectorType& n, const VectorType& e)
+    : m_coeffs(n.size()+1)
+  {
+    normal() = n;
+    offset() = -e.eigen2_dot(n);
+  }
+
+  /** Constructs a plane from its normal \a n and distance to the origin \a d
+    * such that the algebraic equation of the plane is \f$ n \cdot x + d = 0 \f$.
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline Hyperplane(const VectorType& n, Scalar d)
+    : m_coeffs(n.size()+1)
+  {
+    normal() = n;
+    offset() = d;
+  }
+
+  /** Constructs a hyperplane passing through the two points. If the dimension of the ambient space
+    * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.
+    */
+  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1)
+  {
+    Hyperplane result(p0.size());
+    result.normal() = (p1 - p0).unitOrthogonal();
+    result.offset() = -result.normal().eigen2_dot(p0);
+    return result;
+  }
+
+  /** Constructs a hyperplane passing through the three points. The dimension of the ambient space
+    * is required to be exactly 3.
+    */
+  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2)
+  {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)
+    Hyperplane result(p0.size());
+    result.normal() = (p2 - p0).cross(p1 - p0).normalized();
+    result.offset() = -result.normal().eigen2_dot(p0);
+    return result;
+  }
+
+  /** Constructs a hyperplane passing through the parametrized line \a parametrized.
+    * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,
+    * so an arbitrary choice is made.
+    */
+  // FIXME to be consitent with the rest this could be implemented as a static Through function ??
+  explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized)
+  {
+    normal() = parametrized.direction().unitOrthogonal();
+    offset() = -normal().eigen2_dot(parametrized.origin());
+  }
+
+  ~Hyperplane() {}
+
+  /** \returns the dimension in which the plane holds */
+  inline int dim() const { return int(AmbientDimAtCompileTime)==Dynamic ? m_coeffs.size()-1 : int(AmbientDimAtCompileTime); }
+
+  /** normalizes \c *this */
+  void normalize(void)
+  {
+    m_coeffs /= normal().norm();
+  }
+
+  /** \returns the signed distance between the plane \c *this and a point \a p.
+    * \sa absDistance()
+    */
+  inline Scalar signedDistance(const VectorType& p) const { return p.eigen2_dot(normal()) + offset(); }
+
+  /** \returns the absolute distance between the plane \c *this and a point \a p.
+    * \sa signedDistance()
+    */
+  inline Scalar absDistance(const VectorType& p) const { return ei_abs(signedDistance(p)); }
+
+  /** \returns the projection of a point \a p onto the plane \c *this.
+    */
+  inline VectorType projection(const VectorType& p) const { return p - signedDistance(p) * normal(); }
+
+  /** \returns a constant reference to the unit normal vector of the plane, which corresponds
+    * to the linear part of the implicit equation.
+    */
+  inline const NormalReturnType normal() const { return NormalReturnType(*const_cast<Coefficients*>(&m_coeffs),0,0,dim(),1); }
+
+  /** \returns a non-constant reference to the unit normal vector of the plane, which corresponds
+    * to the linear part of the implicit equation.
+    */
+  inline NormalReturnType normal() { return NormalReturnType(m_coeffs,0,0,dim(),1); }
+
+  /** \returns the distance to the origin, which is also the "constant term" of the implicit equation
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline const Scalar& offset() const { return m_coeffs.coeff(dim()); }
+
+  /** \returns a non-constant reference to the distance to the origin, which is also the constant part
+    * of the implicit equation */
+  inline Scalar& offset() { return m_coeffs(dim()); }
+
+  /** \returns a constant reference to the coefficients c_i of the plane equation:
+    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+    */
+  inline const Coefficients& coeffs() const { return m_coeffs; }
+
+  /** \returns a non-constant reference to the coefficients c_i of the plane equation:
+    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+    */
+  inline Coefficients& coeffs() { return m_coeffs; }
+
+  /** \returns the intersection of *this with \a other.
+    *
+    * \warning The ambient space must be a plane, i.e. have dimension 2, so that \c *this and \a other are lines.
+    *
+    * \note If \a other is approximately parallel to *this, this method will return any point on *this.
+    */
+  VectorType intersection(const Hyperplane& other)
+  {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
+    Scalar det = coeffs().coeff(0) * other.coeffs().coeff(1) - coeffs().coeff(1) * other.coeffs().coeff(0);
+    // since the line equations ax+by=c are normalized with a^2+b^2=1, the following tests
+    // whether the two lines are approximately parallel.
+    if(ei_isMuchSmallerThan(det, Scalar(1)))
+    {   // special case where the two lines are approximately parallel. Pick any point on the first line.
+        if(ei_abs(coeffs().coeff(1))>ei_abs(coeffs().coeff(0)))
+            return VectorType(coeffs().coeff(1), -coeffs().coeff(2)/coeffs().coeff(1)-coeffs().coeff(0));
+        else
+            return VectorType(-coeffs().coeff(2)/coeffs().coeff(0)-coeffs().coeff(1), coeffs().coeff(0));
+    }
+    else
+    {   // general case
+        Scalar invdet = Scalar(1) / det;
+        return VectorType(invdet*(coeffs().coeff(1)*other.coeffs().coeff(2)-other.coeffs().coeff(1)*coeffs().coeff(2)),
+                          invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2)));
+    }
+  }
+
+  /** Applies the transformation matrix \a mat to \c *this and returns a reference to \c *this.
+    *
+    * \param mat the Dim x Dim transformation matrix
+    * \param traits specifies whether the matrix \a mat represents an Isometry
+    *               or a more generic Affine transformation. The default is Affine.
+    */
+  template<typename XprType>
+  inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)
+  {
+    if (traits==Affine)
+      normal() = mat.inverse().transpose() * normal();
+    else if (traits==Isometry)
+      normal() = mat * normal();
+    else
+    {
+      ei_assert("invalid traits value in Hyperplane::transform()");
+    }
+    return *this;
+  }
+
+  /** Applies the transformation \a t to \c *this and returns a reference to \c *this.
+    *
+    * \param t the transformation of dimension Dim
+    * \param traits specifies whether the transformation \a t represents an Isometry
+    *               or a more generic Affine transformation. The default is Affine.
+    *               Other kind of transformations are not supported.
+    */
+  inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime>& t,
+                                TransformTraits traits = Affine)
+  {
+    transform(t.linear(), traits);
+    offset() -= t.translation().eigen2_dot(normal());
+    return *this;
+  }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Hyperplane,
+           Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+  {
+    return typename internal::cast_return_type<Hyperplane,
+                    Hyperplane<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Hyperplane& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+protected:
+
+  Coefficients m_coeffs;
+};
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h
new file mode 100644
index 0000000..3523611
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/ParametrizedLine.h
@@ -0,0 +1,141 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class ParametrizedLine
+  *
+  * \brief A parametrized line
+  *
+  * A parametrized line is defined by an origin point \f$ \mathbf{o} \f$ and a unit
+  * direction vector \f$ \mathbf{d} \f$ such that the line corresponds to
+  * the set \f$ l(t) = \mathbf{o} + t \mathbf{d} \f$, \f$ l \in \mathbf{R} \f$.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  */
+template <typename _Scalar, int _AmbientDim>
+class ParametrizedLine
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
+  enum { AmbientDimAtCompileTime = _AmbientDim };
+  typedef _Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
+
+  /** Default constructor without initialization */
+  inline explicit ParametrizedLine() {}
+
+  /** Constructs a dynamic-size line with \a _dim the dimension
+    * of the ambient space */
+  inline explicit ParametrizedLine(int _dim) : m_origin(_dim), m_direction(_dim) {}
+
+  /** Initializes a parametrized line of direction \a direction and origin \a origin.
+    * \warning the vector direction is assumed to be normalized.
+    */
+  ParametrizedLine(const VectorType& origin, const VectorType& direction)
+    : m_origin(origin), m_direction(direction) {}
+
+  explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);
+
+  /** Constructs a parametrized line going from \a p0 to \a p1. */
+  static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)
+  { return ParametrizedLine(p0, (p1-p0).normalized()); }
+
+  ~ParametrizedLine() {}
+
+  /** \returns the dimension in which the line holds */
+  inline int dim() const { return m_direction.size(); }
+
+  const VectorType& origin() const { return m_origin; }
+  VectorType& origin() { return m_origin; }
+
+  const VectorType& direction() const { return m_direction; }
+  VectorType& direction() { return m_direction; }
+
+  /** \returns the squared distance of a point \a p to its projection onto the line \c *this.
+    * \sa distance()
+    */
+  RealScalar squaredDistance(const VectorType& p) const
+  {
+    VectorType diff = p-origin();
+    return (diff - diff.eigen2_dot(direction())* direction()).squaredNorm();
+  }
+  /** \returns the distance of a point \a p to its projection onto the line \c *this.
+    * \sa squaredDistance()
+    */
+  RealScalar distance(const VectorType& p) const { return ei_sqrt(squaredDistance(p)); }
+
+  /** \returns the projection of a point \a p onto the line \c *this. */
+  VectorType projection(const VectorType& p) const
+  { return origin() + (p-origin()).eigen2_dot(direction()) * direction(); }
+
+  Scalar intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane);
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<ParametrizedLine,
+           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+  {
+    return typename internal::cast_return_type<ParametrizedLine,
+                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime>& other)
+  {
+    m_origin = other.origin().template cast<Scalar>();
+    m_direction = other.direction().template cast<Scalar>();
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const ParametrizedLine& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }
+
+protected:
+
+  VectorType m_origin, m_direction;
+};
+
+/** Constructs a parametrized line from a 2D hyperplane
+  *
+  * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
+  */
+template <typename _Scalar, int _AmbientDim>
+inline ParametrizedLine<_Scalar, _AmbientDim>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
+  direction() = hyperplane.normal().unitOrthogonal();
+  origin() = -hyperplane.normal()*hyperplane.offset();
+}
+
+/** \returns the parameter value of the intersection between \c *this and the given hyperplane
+  */
+template <typename _Scalar, int _AmbientDim>
+inline _Scalar ParametrizedLine<_Scalar, _AmbientDim>::intersection(const Hyperplane<_Scalar, _AmbientDim>& hyperplane)
+{
+  return -(hyperplane.offset()+origin().eigen2_dot(hyperplane.normal()))
+          /(direction().eigen2_dot(hyperplane.normal()));
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Quaternion.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Quaternion.h
new file mode 100644
index 0000000..4b6390c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Quaternion.h
@@ -0,0 +1,495 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+template<typename Other,
+         int OtherRows=Other::RowsAtCompileTime,
+         int OtherCols=Other::ColsAtCompileTime>
+struct ei_quaternion_assign_impl;
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Quaternion
+  *
+  * \brief The quaternion class used to represent 3D orientations and rotations
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  *
+  * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
+  * orientations and rotations of objects in three dimensions. Compared to other representations
+  * like Euler angles or 3x3 matrices, quatertions offer the following advantages:
+  * \li \b compact storage (4 scalars)
+  * \li \b efficient to compose (28 flops),
+  * \li \b stable spherical interpolation
+  *
+  * The following two typedefs are provided for convenience:
+  * \li \c Quaternionf for \c float
+  * \li \c Quaterniond for \c double
+  *
+  * \sa  class AngleAxis, class Transform
+  */
+
+template<typename _Scalar> struct ei_traits<Quaternion<_Scalar> >
+{
+  typedef _Scalar Scalar;
+};
+
+template<typename _Scalar>
+class Quaternion : public RotationBase<Quaternion<_Scalar>,3>
+{
+  typedef RotationBase<Quaternion<_Scalar>,3> Base;
+
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,4)
+
+  using Base::operator*;
+
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+
+  /** the type of the Coefficients 4-vector */
+  typedef Matrix<Scalar, 4, 1> Coefficients;
+  /** the type of a 3D vector */
+  typedef Matrix<Scalar,3,1> Vector3;
+  /** the equivalent rotation matrix type */
+  typedef Matrix<Scalar,3,3> Matrix3;
+  /** the equivalent angle-axis type */
+  typedef AngleAxis<Scalar> AngleAxisType;
+
+  /** \returns the \c x coefficient */
+  inline Scalar x() const { return m_coeffs.coeff(0); }
+  /** \returns the \c y coefficient */
+  inline Scalar y() const { return m_coeffs.coeff(1); }
+  /** \returns the \c z coefficient */
+  inline Scalar z() const { return m_coeffs.coeff(2); }
+  /** \returns the \c w coefficient */
+  inline Scalar w() const { return m_coeffs.coeff(3); }
+
+  /** \returns a reference to the \c x coefficient */
+  inline Scalar& x() { return m_coeffs.coeffRef(0); }
+  /** \returns a reference to the \c y coefficient */
+  inline Scalar& y() { return m_coeffs.coeffRef(1); }
+  /** \returns a reference to the \c z coefficient */
+  inline Scalar& z() { return m_coeffs.coeffRef(2); }
+  /** \returns a reference to the \c w coefficient */
+  inline Scalar& w() { return m_coeffs.coeffRef(3); }
+
+  /** \returns a read-only vector expression of the imaginary part (x,y,z) */
+  inline const Block<const Coefficients,3,1> vec() const { return m_coeffs.template start<3>(); }
+
+  /** \returns a vector expression of the imaginary part (x,y,z) */
+  inline Block<Coefficients,3,1> vec() { return m_coeffs.template start<3>(); }
+
+  /** \returns a read-only vector expression of the coefficients (x,y,z,w) */
+  inline const Coefficients& coeffs() const { return m_coeffs; }
+
+  /** \returns a vector expression of the coefficients (x,y,z,w) */
+  inline Coefficients& coeffs() { return m_coeffs; }
+
+  /** Default constructor leaving the quaternion uninitialized. */
+  inline Quaternion() {}
+
+  /** Constructs and initializes the quaternion \f$ w+xi+yj+zk \f$ from
+    * its four coefficients \a w, \a x, \a y and \a z.
+    *
+    * \warning Note the order of the arguments: the real \a w coefficient first,
+    * while internally the coefficients are stored in the following order:
+    * [\c x, \c y, \c z, \c w]
+    */
+  inline Quaternion(Scalar w, Scalar x, Scalar y, Scalar z)
+  { m_coeffs << x, y, z, w; }
+
+  /** Copy constructor */
+  inline Quaternion(const Quaternion& other) { m_coeffs = other.m_coeffs; }
+
+  /** Constructs and initializes a quaternion from the angle-axis \a aa */
+  explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
+
+  /** Constructs and initializes a quaternion from either:
+    *  - a rotation matrix expression,
+    *  - a 4D vector expression representing quaternion coefficients.
+    * \sa operator=(MatrixBase<Derived>)
+    */
+  template<typename Derived>
+  explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
+
+  Quaternion& operator=(const Quaternion& other);
+  Quaternion& operator=(const AngleAxisType& aa);
+  template<typename Derived>
+  Quaternion& operator=(const MatrixBase<Derived>& m);
+
+  /** \returns a quaternion representing an identity rotation
+    * \sa MatrixBase::Identity()
+    */
+  static inline Quaternion Identity() { return Quaternion(1, 0, 0, 0); }
+
+  /** \sa Quaternion::Identity(), MatrixBase::setIdentity()
+    */
+  inline Quaternion& setIdentity() { m_coeffs << 0, 0, 0, 1; return *this; }
+
+  /** \returns the squared norm of the quaternion's coefficients
+    * \sa Quaternion::norm(), MatrixBase::squaredNorm()
+    */
+  inline Scalar squaredNorm() const { return m_coeffs.squaredNorm(); }
+
+  /** \returns the norm of the quaternion's coefficients
+    * \sa Quaternion::squaredNorm(), MatrixBase::norm()
+    */
+  inline Scalar norm() const { return m_coeffs.norm(); }
+
+  /** Normalizes the quaternion \c *this
+    * \sa normalized(), MatrixBase::normalize() */
+  inline void normalize() { m_coeffs.normalize(); }
+  /** \returns a normalized version of \c *this
+    * \sa normalize(), MatrixBase::normalized() */
+  inline Quaternion normalized() const { return Quaternion(m_coeffs.normalized()); }
+
+  /** \returns the dot product of \c *this and \a other
+    * Geometrically speaking, the dot product of two unit quaternions
+    * corresponds to the cosine of half the angle between the two rotations.
+    * \sa angularDistance()
+    */
+  inline Scalar eigen2_dot(const Quaternion& other) const { return m_coeffs.eigen2_dot(other.m_coeffs); }
+
+  inline Scalar angularDistance(const Quaternion& other) const;
+
+  Matrix3 toRotationMatrix(void) const;
+
+  template<typename Derived1, typename Derived2>
+  Quaternion& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
+
+  inline Quaternion operator* (const Quaternion& q) const;
+  inline Quaternion& operator*= (const Quaternion& q);
+
+  Quaternion inverse(void) const;
+  Quaternion conjugate(void) const;
+
+  Quaternion slerp(Scalar t, const Quaternion& other) const;
+
+  template<typename Derived>
+  Vector3 operator* (const MatrixBase<Derived>& vec) const;
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Quaternion,Quaternion<NewScalarType> >::type cast() const
+  { return typename internal::cast_return_type<Quaternion,Quaternion<NewScalarType> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Quaternion(const Quaternion<OtherScalarType>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Quaternion& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+protected:
+  Coefficients m_coeffs;
+};
+
+/** \ingroup Geometry_Module
+  * single precision quaternion type */
+typedef Quaternion<float> Quaternionf;
+/** \ingroup Geometry_Module
+  * double precision quaternion type */
+typedef Quaternion<double> Quaterniond;
+
+// Generic Quaternion * Quaternion product
+template<typename Scalar> inline Quaternion<Scalar>
+ei_quaternion_product(const Quaternion<Scalar>& a, const Quaternion<Scalar>& b)
+{
+  return Quaternion<Scalar>
+  (
+    a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
+    a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
+    a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
+    a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()
+  );
+}
+
+/** \returns the concatenation of two rotations as a quaternion-quaternion product */
+template <typename Scalar>
+inline Quaternion<Scalar> Quaternion<Scalar>::operator* (const Quaternion& other) const
+{
+  return ei_quaternion_product(*this,other);
+}
+
+/** \sa operator*(Quaternion) */
+template <typename Scalar>
+inline Quaternion<Scalar>& Quaternion<Scalar>::operator*= (const Quaternion& other)
+{
+  return (*this = *this * other);
+}
+
+/** Rotation of a vector by a quaternion.
+  * \remarks If the quaternion is used to rotate several points (>1)
+  * then it is much more efficient to first convert it to a 3x3 Matrix.
+  * Comparison of the operation cost for n transformations:
+  *   - Quaternion:    30n
+  *   - Via a Matrix3: 24 + 15n
+  */
+template <typename Scalar>
+template<typename Derived>
+inline typename Quaternion<Scalar>::Vector3
+Quaternion<Scalar>::operator* (const MatrixBase<Derived>& v) const
+{
+    // Note that this algorithm comes from the optimization by hand
+    // of the conversion to a Matrix followed by a Matrix/Vector product.
+    // It appears to be much faster than the common algorithm found
+    // in the litterature (30 versus 39 flops). It also requires two
+    // Vector3 as temporaries.
+    Vector3 uv;
+    uv = 2 * this->vec().cross(v);
+    return v + this->w() * uv + this->vec().cross(uv);
+}
+
+template<typename Scalar>
+inline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const Quaternion& other)
+{
+  m_coeffs = other.m_coeffs;
+  return *this;
+}
+
+/** Set \c *this from an angle-axis \a aa and returns a reference to \c *this
+  */
+template<typename Scalar>
+inline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const AngleAxisType& aa)
+{
+  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings
+  this->w() = ei_cos(ha);
+  this->vec() = ei_sin(ha) * aa.axis();
+  return *this;
+}
+
+/** Set \c *this from the expression \a xpr:
+  *   - if \a xpr is a 4x1 vector, then \a xpr is assumed to be a quaternion
+  *   - if \a xpr is a 3x3 matrix, then \a xpr is assumed to be rotation matrix
+  *     and \a xpr is converted to a quaternion
+  */
+template<typename Scalar>
+template<typename Derived>
+inline Quaternion<Scalar>& Quaternion<Scalar>::operator=(const MatrixBase<Derived>& xpr)
+{
+  ei_quaternion_assign_impl<Derived>::run(*this, xpr.derived());
+  return *this;
+}
+
+/** Convert the quaternion to a 3x3 rotation matrix */
+template<typename Scalar>
+inline typename Quaternion<Scalar>::Matrix3
+Quaternion<Scalar>::toRotationMatrix(void) const
+{
+  // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)
+  // if not inlined then the cost of the return by value is huge ~ +35%,
+  // however, not inlining this function is an order of magnitude slower, so
+  // it has to be inlined, and so the return by value is not an issue
+  Matrix3 res;
+
+  const Scalar tx  = Scalar(2)*this->x();
+  const Scalar ty  = Scalar(2)*this->y();
+  const Scalar tz  = Scalar(2)*this->z();
+  const Scalar twx = tx*this->w();
+  const Scalar twy = ty*this->w();
+  const Scalar twz = tz*this->w();
+  const Scalar txx = tx*this->x();
+  const Scalar txy = ty*this->x();
+  const Scalar txz = tz*this->x();
+  const Scalar tyy = ty*this->y();
+  const Scalar tyz = tz*this->y();
+  const Scalar tzz = tz*this->z();
+
+  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);
+  res.coeffRef(0,1) = txy-twz;
+  res.coeffRef(0,2) = txz+twy;
+  res.coeffRef(1,0) = txy+twz;
+  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);
+  res.coeffRef(1,2) = tyz-twx;
+  res.coeffRef(2,0) = txz-twy;
+  res.coeffRef(2,1) = tyz+twx;
+  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);
+
+  return res;
+}
+
+/** Sets *this to be a quaternion representing a rotation sending the vector \a a to the vector \a b.
+  *
+  * \returns a reference to *this.
+  *
+  * Note that the two input vectors do \b not have to be normalized.
+  */
+template<typename Scalar>
+template<typename Derived1, typename Derived2>
+inline Quaternion<Scalar>& Quaternion<Scalar>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
+{
+  Vector3 v0 = a.normalized();
+  Vector3 v1 = b.normalized();
+  Scalar c = v0.eigen2_dot(v1);
+
+  // if dot == 1, vectors are the same
+  if (ei_isApprox(c,Scalar(1)))
+  {
+    // set to identity
+    this->w() = 1; this->vec().setZero();
+    return *this;
+  }
+  // if dot == -1, vectors are opposites
+  if (ei_isApprox(c,Scalar(-1)))
+  {
+    this->vec() = v0.unitOrthogonal();
+    this->w() = 0;
+    return *this;
+  }
+
+  Vector3 axis = v0.cross(v1);
+  Scalar s = ei_sqrt((Scalar(1)+c)*Scalar(2));
+  Scalar invs = Scalar(1)/s;
+  this->vec() = axis * invs;
+  this->w() = s * Scalar(0.5);
+
+  return *this;
+}
+
+/** \returns the multiplicative inverse of \c *this
+  * Note that in most cases, i.e., if you simply want the opposite rotation,
+  * and/or the quaternion is normalized, then it is enough to use the conjugate.
+  *
+  * \sa Quaternion::conjugate()
+  */
+template <typename Scalar>
+inline Quaternion<Scalar> Quaternion<Scalar>::inverse() const
+{
+  // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite()  ??
+  Scalar n2 = this->squaredNorm();
+  if (n2 > 0)
+    return Quaternion(conjugate().coeffs() / n2);
+  else
+  {
+    // return an invalid result to flag the error
+    return Quaternion(Coefficients::Zero());
+  }
+}
+
+/** \returns the conjugate of the \c *this which is equal to the multiplicative inverse
+  * if the quaternion is normalized.
+  * The conjugate of a quaternion represents the opposite rotation.
+  *
+  * \sa Quaternion::inverse()
+  */
+template <typename Scalar>
+inline Quaternion<Scalar> Quaternion<Scalar>::conjugate() const
+{
+  return Quaternion(this->w(),-this->x(),-this->y(),-this->z());
+}
+
+/** \returns the angle (in radian) between two rotations
+  * \sa eigen2_dot()
+  */
+template <typename Scalar>
+inline Scalar Quaternion<Scalar>::angularDistance(const Quaternion& other) const
+{
+  double d = ei_abs(this->eigen2_dot(other));
+  if (d>=1.0)
+    return 0;
+  return Scalar(2) * std::acos(d);
+}
+
+/** \returns the spherical linear interpolation between the two quaternions
+  * \c *this and \a other at the parameter \a t
+  */
+template <typename Scalar>
+Quaternion<Scalar> Quaternion<Scalar>::slerp(Scalar t, const Quaternion& other) const
+{
+  static const Scalar one = Scalar(1) - machine_epsilon<Scalar>();
+  Scalar d = this->eigen2_dot(other);
+  Scalar absD = ei_abs(d);
+
+  Scalar scale0;
+  Scalar scale1;
+
+  if (absD>=one)
+  {
+    scale0 = Scalar(1) - t;
+    scale1 = t;
+  }
+  else
+  {
+    // theta is the angle between the 2 quaternions
+    Scalar theta = std::acos(absD);
+    Scalar sinTheta = ei_sin(theta);
+
+    scale0 = ei_sin( ( Scalar(1) - t ) * theta) / sinTheta;
+    scale1 = ei_sin( ( t * theta) ) / sinTheta;
+    if (d<0)
+      scale1 = -scale1;
+  }
+
+  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
+}
+
+// set from a rotation matrix
+template<typename Other>
+struct ei_quaternion_assign_impl<Other,3,3>
+{
+  typedef typename Other::Scalar Scalar;
+  static inline void run(Quaternion<Scalar>& q, const Other& mat)
+  {
+    // This algorithm comes from  "Quaternion Calculus and Fast Animation",
+    // Ken Shoemake, 1987 SIGGRAPH course notes
+    Scalar t = mat.trace();
+    if (t > 0)
+    {
+      t = ei_sqrt(t + Scalar(1.0));
+      q.w() = Scalar(0.5)*t;
+      t = Scalar(0.5)/t;
+      q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
+      q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
+      q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
+    }
+    else
+    {
+      int i = 0;
+      if (mat.coeff(1,1) > mat.coeff(0,0))
+        i = 1;
+      if (mat.coeff(2,2) > mat.coeff(i,i))
+        i = 2;
+      int j = (i+1)%3;
+      int k = (j+1)%3;
+
+      t = ei_sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
+      q.coeffs().coeffRef(i) = Scalar(0.5) * t;
+      t = Scalar(0.5)/t;
+      q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
+      q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
+      q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
+    }
+  }
+};
+
+// set from a vector of coefficients assumed to be a quaternion
+template<typename Other>
+struct ei_quaternion_assign_impl<Other,4,1>
+{
+  typedef typename Other::Scalar Scalar;
+  static inline void run(Quaternion<Scalar>& q, const Other& vec)
+  {
+    q.coeffs() = vec;
+  }
+};
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Rotation2D.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Rotation2D.h
new file mode 100644
index 0000000..19b8582
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Rotation2D.h
@@ -0,0 +1,145 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Rotation2D
+  *
+  * \brief Represents a rotation/orientation in a 2 dimensional space.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  *
+  * This class is equivalent to a single scalar representing a counter clock wise rotation
+  * as a single angle in radian. It provides some additional features such as the automatic
+  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
+  * interface to Quaternion in order to facilitate the writing of generic algorithms
+  * dealing with rotations.
+  *
+  * \sa class Quaternion, class Transform
+  */
+template<typename _Scalar> struct ei_traits<Rotation2D<_Scalar> >
+{
+  typedef _Scalar Scalar;
+};
+
+template<typename _Scalar>
+class Rotation2D : public RotationBase<Rotation2D<_Scalar>,2>
+{
+  typedef RotationBase<Rotation2D<_Scalar>,2> Base;
+
+public:
+
+  using Base::operator*;
+
+  enum { Dim = 2 };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  typedef Matrix<Scalar,2,1> Vector2;
+  typedef Matrix<Scalar,2,2> Matrix2;
+
+protected:
+
+  Scalar m_angle;
+
+public:
+
+  /** Construct a 2D counter clock wise rotation from the angle \a a in radian. */
+  inline Rotation2D(Scalar a) : m_angle(a) {}
+
+  /** \returns the rotation angle */
+  inline Scalar angle() const { return m_angle; }
+
+  /** \returns a read-write reference to the rotation angle */
+  inline Scalar& angle() { return m_angle; }
+
+  /** \returns the inverse rotation */
+  inline Rotation2D inverse() const { return -m_angle; }
+
+  /** Concatenates two rotations */
+  inline Rotation2D operator*(const Rotation2D& other) const
+  { return m_angle + other.m_angle; }
+
+  /** Concatenates two rotations */
+  inline Rotation2D& operator*=(const Rotation2D& other)
+  { return m_angle += other.m_angle; return *this; }
+
+  /** Applies the rotation to a 2D vector */
+  Vector2 operator* (const Vector2& vec) const
+  { return toRotationMatrix() * vec; }
+
+  template<typename Derived>
+  Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);
+  Matrix2 toRotationMatrix(void) const;
+
+  /** \returns the spherical interpolation between \c *this and \a other using
+    * parameter \a t. It is in fact equivalent to a linear interpolation.
+    */
+  inline Rotation2D slerp(Scalar t, const Rotation2D& other) const
+  { return m_angle * (1-t) + other.angle() * t; }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const
+  { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)
+  {
+    m_angle = Scalar(other.angle());
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Rotation2D& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return ei_isApprox(m_angle,other.m_angle, prec); }
+};
+
+/** \ingroup Geometry_Module
+  * single precision 2D rotation type */
+typedef Rotation2D<float> Rotation2Df;
+/** \ingroup Geometry_Module
+  * double precision 2D rotation type */
+typedef Rotation2D<double> Rotation2Dd;
+
+/** Set \c *this from a 2x2 rotation matrix \a mat.
+  * In other words, this function extract the rotation angle
+  * from the rotation matrix.
+  */
+template<typename Scalar>
+template<typename Derived>
+Rotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
+{
+  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_angle = ei_atan2(mat.coeff(1,0), mat.coeff(0,0));
+  return *this;
+}
+
+/** Constructs and \returns an equivalent 2x2 rotation matrix.
+  */
+template<typename Scalar>
+typename Rotation2D<Scalar>::Matrix2
+Rotation2D<Scalar>::toRotationMatrix(void) const
+{
+  Scalar sinA = ei_sin(m_angle);
+  Scalar cosA = ei_cos(m_angle);
+  return (Matrix2() << cosA, -sinA, sinA, cosA).finished();
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/RotationBase.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/RotationBase.h
new file mode 100644
index 0000000..b1c8f38
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/RotationBase.h
@@ -0,0 +1,123 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+// this file aims to contains the various representations of rotation/orientation
+// in 2D and 3D space excepted Matrix and Quaternion.
+
+/** \class RotationBase
+  *
+  * \brief Common base class for compact rotation representations
+  *
+  * \param Derived is the derived type, i.e., a rotation type
+  * \param _Dim the dimension of the space
+  */
+template<typename Derived, int _Dim>
+class RotationBase
+{
+  public:
+    enum { Dim = _Dim };
+    /** the scalar type of the coefficients */
+    typedef typename ei_traits<Derived>::Scalar Scalar;
+    
+    /** corresponding linear transformation matrix type */
+    typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
+
+    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    inline Derived& derived() { return *static_cast<Derived*>(this); }
+
+    /** \returns an equivalent rotation matrix */
+    inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
+
+    /** \returns the inverse rotation */
+    inline Derived inverse() const { return derived().inverse(); }
+
+    /** \returns the concatenation of the rotation \c *this with a translation \a t */
+    inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const
+    { return toRotationMatrix() * t; }
+
+    /** \returns the concatenation of the rotation \c *this with a scaling \a s */
+    inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const
+    { return toRotationMatrix() * s; }
+
+    /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */
+    inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const
+    { return toRotationMatrix() * t; }
+};
+
+/** \geometry_module
+  *
+  * Constructs a Dim x Dim rotation matrix from the rotation \a r
+  */
+template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
+template<typename OtherDerived>
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
+::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
+{
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+  *this = r.toRotationMatrix();
+}
+
+/** \geometry_module
+  *
+  * Set a Dim x Dim rotation matrix from the rotation \a r
+  */
+template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
+template<typename OtherDerived>
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
+::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
+{
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+  return *this = r.toRotationMatrix();
+}
+
+/** \internal
+  *
+  * Helper function to return an arbitrary rotation object to a rotation matrix.
+  *
+  * \param Scalar the numeric type of the matrix coefficients
+  * \param Dim the dimension of the current space
+  *
+  * It returns a Dim x Dim fixed size matrix.
+  *
+  * Default specializations are provided for:
+  *   - any scalar type (2D),
+  *   - any matrix expression,
+  *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
+  *
+  * Currently ei_toRotationMatrix is only used by Transform.
+  *
+  * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
+  */
+template<typename Scalar, int Dim>
+static inline Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s)
+{
+  EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return Rotation2D<Scalar>(s).toRotationMatrix();
+}
+
+template<typename Scalar, int Dim, typename OtherDerived>
+static inline Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)
+{
+  return r.toRotationMatrix();
+}
+
+template<typename Scalar, int Dim, typename OtherDerived>
+static inline const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat)
+{
+  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,
+    YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return mat;
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Scaling.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Scaling.h
new file mode 100644
index 0000000..b8fa6cd
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Scaling.h
@@ -0,0 +1,167 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Scaling
+  *
+  * \brief Represents a possibly non uniform scaling transformation
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  * \param _Dim the  dimension of the space, can be a compile time value or Dynamic
+  *
+  * \note This class is not aimed to be used to store a scaling transformation,
+  * but rather to make easier the constructions and updates of Transform objects.
+  *
+  * \sa class Translation, class Transform
+  */
+template<typename _Scalar, int _Dim>
+class Scaling
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)
+  /** dimension of the space */
+  enum { Dim = _Dim };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  /** corresponding vector type */
+  typedef Matrix<Scalar,Dim,1> VectorType;
+  /** corresponding linear transformation matrix type */
+  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
+  /** corresponding translation type */
+  typedef Translation<Scalar,Dim> TranslationType;
+  /** corresponding affine transformation type */
+  typedef Transform<Scalar,Dim> TransformType;
+
+protected:
+
+  VectorType m_coeffs;
+
+public:
+
+  /** Default constructor without initialization. */
+  Scaling() {}
+  /** Constructs and initialize a uniform scaling transformation */
+  explicit inline Scaling(const Scalar& s) { m_coeffs.setConstant(s); }
+  /** 2D only */
+  inline Scaling(const Scalar& sx, const Scalar& sy)
+  {
+    ei_assert(Dim==2);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+  }
+  /** 3D only */
+  inline Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)
+  {
+    ei_assert(Dim==3);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+    m_coeffs.z() = sz;
+  }
+  /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */
+  explicit inline Scaling(const VectorType& coeffs) : m_coeffs(coeffs) {}
+
+  const VectorType& coeffs() const { return m_coeffs; }
+  VectorType& coeffs() { return m_coeffs; }
+
+  /** Concatenates two scaling */
+  inline Scaling operator* (const Scaling& other) const
+  { return Scaling(coeffs().cwise() * other.coeffs()); }
+
+  /** Concatenates a scaling and a translation */
+  inline TransformType operator* (const TranslationType& t) const;
+
+  /** Concatenates a scaling and an affine transformation */
+  inline TransformType operator* (const TransformType& t) const;
+
+  /** Concatenates a scaling and a linear transformation matrix */
+  // TODO returns an expression
+  inline LinearMatrixType operator* (const LinearMatrixType& other) const
+  { return coeffs().asDiagonal() * other; }
+
+  /** Concatenates a linear transformation matrix and a scaling */
+  // TODO returns an expression
+  friend inline LinearMatrixType operator* (const LinearMatrixType& other, const Scaling& s)
+  { return other * s.coeffs().asDiagonal(); }
+
+  template<typename Derived>
+  inline LinearMatrixType operator*(const RotationBase<Derived,Dim>& r) const
+  { return *this * r.toRotationMatrix(); }
+
+  /** Applies scaling to vector */
+  inline VectorType operator* (const VectorType& other) const
+  { return coeffs().asDiagonal() * other; }
+
+  /** \returns the inverse scaling */
+  inline Scaling inverse() const
+  { return Scaling(coeffs().cwise().inverse()); }
+
+  inline Scaling& operator=(const Scaling& other)
+  {
+    m_coeffs = other.m_coeffs;
+    return *this;
+  }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type cast() const
+  { return typename internal::cast_return_type<Scaling,Scaling<NewScalarType,Dim> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Scaling(const Scaling<OtherScalarType,Dim>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Scaling& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+};
+
+/** \addtogroup Geometry_Module */
+//@{
+typedef Scaling<float, 2> Scaling2f;
+typedef Scaling<double,2> Scaling2d;
+typedef Scaling<float, 3> Scaling3f;
+typedef Scaling<double,3> Scaling3d;
+//@}
+
+template<typename Scalar, int Dim>
+inline typename Scaling<Scalar,Dim>::TransformType
+Scaling<Scalar,Dim>::operator* (const TranslationType& t) const
+{
+  TransformType res;
+  res.matrix().setZero();
+  res.linear().diagonal() = coeffs();
+  res.translation() = m_coeffs.cwise() * t.vector();
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+template<typename Scalar, int Dim>
+inline typename Scaling<Scalar,Dim>::TransformType
+Scaling<Scalar,Dim>::operator* (const TransformType& t) const
+{
+  TransformType res = t;
+  res.prescale(m_coeffs);
+  return res;
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Transform.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Transform.h
new file mode 100644
index 0000000..fab60b2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Transform.h
@@ -0,0 +1,786 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+// Note that we have to pass Dim and HDim because it is not allowed to use a template
+// parameter to define a template specialization. To be more precise, in the following
+// specializations, it is not allowed to use Dim+1 instead of HDim.
+template< typename Other,
+          int Dim,
+          int HDim,
+          int OtherRows=Other::RowsAtCompileTime,
+          int OtherCols=Other::ColsAtCompileTime>
+struct ei_transform_product_impl;
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Transform
+  *
+  * \brief Represents an homogeneous transformation in a N dimensional space
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  * \param _Dim the dimension of the space
+  *
+  * The homography is internally represented and stored as a (Dim+1)^2 matrix which
+  * is available through the matrix() method.
+  *
+  * Conversion methods from/to Qt's QMatrix and QTransform are available if the
+  * preprocessor token EIGEN_QT_SUPPORT is defined.
+  *
+  * \sa class Matrix, class Quaternion
+  */
+template<typename _Scalar, int _Dim>
+class Transform
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1))
+  enum {
+    Dim = _Dim,     ///< space dimension in which the transformation holds
+    HDim = _Dim+1   ///< size of a respective homogeneous vector
+  };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  /** type of the matrix used to represent the transformation */
+  typedef Matrix<Scalar,HDim,HDim> MatrixType;
+  /** type of the matrix used to represent the linear part of the transformation */
+  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
+  /** type of read/write reference to the linear part of the transformation */
+  typedef Block<MatrixType,Dim,Dim> LinearPart;
+  /** type of read/write reference to the linear part of the transformation */
+  typedef const Block<const MatrixType,Dim,Dim> ConstLinearPart;
+  /** type of a vector */
+  typedef Matrix<Scalar,Dim,1> VectorType;
+  /** type of a read/write reference to the translation part of the rotation */
+  typedef Block<MatrixType,Dim,1> TranslationPart;
+  /** type of a read/write reference to the translation part of the rotation */
+  typedef const Block<const MatrixType,Dim,1> ConstTranslationPart;
+  /** corresponding translation type */
+  typedef Translation<Scalar,Dim> TranslationType;
+  /** corresponding scaling transformation type */
+  typedef Scaling<Scalar,Dim> ScalingType;
+
+protected:
+
+  MatrixType m_matrix;
+
+public:
+
+  /** Default constructor without initialization of the coefficients. */
+  inline Transform() { }
+
+  inline Transform(const Transform& other)
+  {
+    m_matrix = other.m_matrix;
+  }
+
+  inline explicit Transform(const TranslationType& t) { *this = t; }
+  inline explicit Transform(const ScalingType& s) { *this = s; }
+  template<typename Derived>
+  inline explicit Transform(const RotationBase<Derived, Dim>& r) { *this = r; }
+
+  inline Transform& operator=(const Transform& other)
+  { m_matrix = other.m_matrix; return *this; }
+
+  template<typename OtherDerived, bool BigMatrix> // MSVC 2005 will commit suicide if BigMatrix has a default value
+  struct construct_from_matrix
+  {
+    static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)
+    {
+      transform->matrix() = other;
+    }
+  };
+
+  template<typename OtherDerived> struct construct_from_matrix<OtherDerived, true>
+  {
+    static inline void run(Transform *transform, const MatrixBase<OtherDerived>& other)
+    {
+      transform->linear() = other;
+      transform->translation().setZero();
+      transform->matrix()(Dim,Dim) = Scalar(1);
+      transform->matrix().template block<1,Dim>(Dim,0).setZero();
+    }
+  };
+
+  /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */
+  template<typename OtherDerived>
+  inline explicit Transform(const MatrixBase<OtherDerived>& other)
+  {
+    construct_from_matrix<OtherDerived, int(OtherDerived::RowsAtCompileTime) == Dim>::run(this, other);
+  }
+
+  /** Set \c *this from a (Dim+1)^2 matrix. */
+  template<typename OtherDerived>
+  inline Transform& operator=(const MatrixBase<OtherDerived>& other)
+  { m_matrix = other; return *this; }
+
+  #ifdef EIGEN_QT_SUPPORT
+  inline Transform(const QMatrix& other);
+  inline Transform& operator=(const QMatrix& other);
+  inline QMatrix toQMatrix(void) const;
+  inline Transform(const QTransform& other);
+  inline Transform& operator=(const QTransform& other);
+  inline QTransform toQTransform(void) const;
+  #endif
+
+  /** shortcut for m_matrix(row,col);
+    * \sa MatrixBase::operaror(int,int) const */
+  inline Scalar operator() (int row, int col) const { return m_matrix(row,col); }
+  /** shortcut for m_matrix(row,col);
+    * \sa MatrixBase::operaror(int,int) */
+  inline Scalar& operator() (int row, int col) { return m_matrix(row,col); }
+
+  /** \returns a read-only expression of the transformation matrix */
+  inline const MatrixType& matrix() const { return m_matrix; }
+  /** \returns a writable expression of the transformation matrix */
+  inline MatrixType& matrix() { return m_matrix; }
+
+  /** \returns a read-only expression of the linear (linear) part of the transformation */
+  inline ConstLinearPart linear() const { return m_matrix.template block<Dim,Dim>(0,0); }
+  /** \returns a writable expression of the linear (linear) part of the transformation */
+  inline LinearPart linear() { return m_matrix.template block<Dim,Dim>(0,0); }
+
+  /** \returns a read-only expression of the translation vector of the transformation */
+  inline ConstTranslationPart translation() const { return m_matrix.template block<Dim,1>(0,Dim); }
+  /** \returns a writable expression of the translation vector of the transformation */
+  inline TranslationPart translation() { return m_matrix.template block<Dim,1>(0,Dim); }
+
+  /** \returns an expression of the product between the transform \c *this and a matrix expression \a other
+  *
+  * The right hand side \a other might be either:
+  * \li a vector of size Dim,
+  * \li an homogeneous vector of size Dim+1,
+  * \li a transformation matrix of size Dim+1 x Dim+1.
+  */
+  // note: this function is defined here because some compilers cannot find the respective declaration
+  template<typename OtherDerived>
+  inline const typename ei_transform_product_impl<OtherDerived,_Dim,_Dim+1>::ResultType
+  operator * (const MatrixBase<OtherDerived> &other) const
+  { return ei_transform_product_impl<OtherDerived,Dim,HDim>::run(*this,other.derived()); }
+
+  /** \returns the product expression of a transformation matrix \a a times a transform \a b
+    * The transformation matrix \a a must have a Dim+1 x Dim+1 sizes. */
+  template<typename OtherDerived>
+  friend inline const typename ProductReturnType<OtherDerived,MatrixType>::Type
+  operator * (const MatrixBase<OtherDerived> &a, const Transform &b)
+  { return a.derived() * b.matrix(); }
+
+  /** Contatenates two transformations */
+  inline const Transform
+  operator * (const Transform& other) const
+  { return Transform(m_matrix * other.matrix()); }
+
+  /** \sa MatrixBase::setIdentity() */
+  void setIdentity() { m_matrix.setIdentity(); }
+  static const typename MatrixType::IdentityReturnType Identity()
+  {
+    return MatrixType::Identity();
+  }
+
+  template<typename OtherDerived>
+  inline Transform& scale(const MatrixBase<OtherDerived> &other);
+
+  template<typename OtherDerived>
+  inline Transform& prescale(const MatrixBase<OtherDerived> &other);
+
+  inline Transform& scale(Scalar s);
+  inline Transform& prescale(Scalar s);
+
+  template<typename OtherDerived>
+  inline Transform& translate(const MatrixBase<OtherDerived> &other);
+
+  template<typename OtherDerived>
+  inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);
+
+  template<typename RotationType>
+  inline Transform& rotate(const RotationType& rotation);
+
+  template<typename RotationType>
+  inline Transform& prerotate(const RotationType& rotation);
+
+  Transform& shear(Scalar sx, Scalar sy);
+  Transform& preshear(Scalar sx, Scalar sy);
+
+  inline Transform& operator=(const TranslationType& t);
+  inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
+  inline Transform operator*(const TranslationType& t) const;
+
+  inline Transform& operator=(const ScalingType& t);
+  inline Transform& operator*=(const ScalingType& s) { return scale(s.coeffs()); }
+  inline Transform operator*(const ScalingType& s) const;
+  friend inline Transform operator*(const LinearMatrixType& mat, const Transform& t)
+  {
+    Transform res = t;
+    res.matrix().row(Dim) = t.matrix().row(Dim);
+    res.matrix().template block<Dim,HDim>(0,0) = (mat * t.matrix().template block<Dim,HDim>(0,0)).lazy();
+    return res;
+  }
+
+  template<typename Derived>
+  inline Transform& operator=(const RotationBase<Derived,Dim>& r);
+  template<typename Derived>
+  inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }
+  template<typename Derived>
+  inline Transform operator*(const RotationBase<Derived,Dim>& r) const;
+
+  LinearMatrixType rotation() const;
+  template<typename RotationMatrixType, typename ScalingMatrixType>
+  void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;
+  template<typename ScalingMatrixType, typename RotationMatrixType>
+  void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;
+
+  template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
+  Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
+    const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
+
+  inline const MatrixType inverse(TransformTraits traits = Affine) const;
+
+  /** \returns a const pointer to the column major internal matrix */
+  const Scalar* data() const { return m_matrix.data(); }
+  /** \returns a non-const pointer to the column major internal matrix */
+  Scalar* data() { return m_matrix.data(); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type cast() const
+  { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Transform(const Transform<OtherScalarType,Dim>& other)
+  { m_matrix = other.matrix().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Transform& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_matrix.isApprox(other.m_matrix, prec); }
+
+  #ifdef EIGEN_TRANSFORM_PLUGIN
+  #include EIGEN_TRANSFORM_PLUGIN
+  #endif
+
+protected:
+
+};
+
+/** \ingroup Geometry_Module */
+typedef Transform<float,2> Transform2f;
+/** \ingroup Geometry_Module */
+typedef Transform<float,3> Transform3f;
+/** \ingroup Geometry_Module */
+typedef Transform<double,2> Transform2d;
+/** \ingroup Geometry_Module */
+typedef Transform<double,3> Transform3d;
+
+/**************************
+*** Optional QT support ***
+**************************/
+
+#ifdef EIGEN_QT_SUPPORT
+/** Initialises \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>::Transform(const QMatrix& other)
+{
+  *this = other;
+}
+
+/** Set \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QMatrix& other)
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_matrix << other.m11(), other.m21(), other.dx(),
+              other.m12(), other.m22(), other.dy(),
+              0, 0, 1;
+   return *this;
+}
+
+/** \returns a QMatrix from \c *this assuming the dimension is 2.
+  *
+  * \warning this convertion might loss data if \c *this is not affine
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+QMatrix Transform<Scalar,Dim>::toQMatrix(void) const
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
+                 m_matrix.coeff(0,1), m_matrix.coeff(1,1),
+                 m_matrix.coeff(0,2), m_matrix.coeff(1,2));
+}
+
+/** Initialises \c *this from a QTransform assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>::Transform(const QTransform& other)
+{
+  *this = other;
+}
+
+/** Set \c *this from a QTransform assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const QTransform& other)
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_matrix << other.m11(), other.m21(), other.dx(),
+              other.m12(), other.m22(), other.dy(),
+              other.m13(), other.m23(), other.m33();
+   return *this;
+}
+
+/** \returns a QTransform from \c *this assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim>
+QTransform Transform<Scalar,Dim>::toQTransform(void) const
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),
+                    m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),
+                    m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));
+}
+#endif
+
+/*********************
+*** Procedural API ***
+*********************/
+
+/** Applies on the right the non uniform scale transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \sa prescale()
+  */
+template<typename Scalar, int Dim>
+template<typename OtherDerived>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::scale(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  linear() = (linear() * other.asDiagonal()).lazy();
+  return *this;
+}
+
+/** Applies on the right a uniform scale of a factor \a c to \c *this
+  * and returns a reference to \c *this.
+  * \sa prescale(Scalar)
+  */
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::scale(Scalar s)
+{
+  linear() *= s;
+  return *this;
+}
+
+/** Applies on the left the non uniform scale transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \sa scale()
+  */
+template<typename Scalar, int Dim>
+template<typename OtherDerived>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::prescale(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  m_matrix.template block<Dim,HDim>(0,0) = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0)).lazy();
+  return *this;
+}
+
+/** Applies on the left a uniform scale of a factor \a c to \c *this
+  * and returns a reference to \c *this.
+  * \sa scale(Scalar)
+  */
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::prescale(Scalar s)
+{
+  m_matrix.template corner<Dim,HDim>(TopLeft) *= s;
+  return *this;
+}
+
+/** Applies on the right the translation matrix represented by the vector \a other
+  * to \c *this and returns a reference to \c *this.
+  * \sa pretranslate()
+  */
+template<typename Scalar, int Dim>
+template<typename OtherDerived>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::translate(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  translation() += linear() * other;
+  return *this;
+}
+
+/** Applies on the left the translation matrix represented by the vector \a other
+  * to \c *this and returns a reference to \c *this.
+  * \sa translate()
+  */
+template<typename Scalar, int Dim>
+template<typename OtherDerived>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::pretranslate(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  translation() += other;
+  return *this;
+}
+
+/** Applies on the right the rotation represented by the rotation \a rotation
+  * to \c *this and returns a reference to \c *this.
+  *
+  * The template parameter \a RotationType is the type of the rotation which
+  * must be known by ei_toRotationMatrix<>.
+  *
+  * Natively supported types includes:
+  *   - any scalar (2D),
+  *   - a Dim x Dim matrix expression,
+  *   - a Quaternion (3D),
+  *   - a AngleAxis (3D)
+  *
+  * This mechanism is easily extendable to support user types such as Euler angles,
+  * or a pair of Quaternion for 4D rotations.
+  *
+  * \sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)
+  */
+template<typename Scalar, int Dim>
+template<typename RotationType>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::rotate(const RotationType& rotation)
+{
+  linear() *= ei_toRotationMatrix<Scalar,Dim>(rotation);
+  return *this;
+}
+
+/** Applies on the left the rotation represented by the rotation \a rotation
+  * to \c *this and returns a reference to \c *this.
+  *
+  * See rotate() for further details.
+  *
+  * \sa rotate()
+  */
+template<typename Scalar, int Dim>
+template<typename RotationType>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::prerotate(const RotationType& rotation)
+{
+  m_matrix.template block<Dim,HDim>(0,0) = ei_toRotationMatrix<Scalar,Dim>(rotation)
+                                         * m_matrix.template block<Dim,HDim>(0,0);
+  return *this;
+}
+
+/** Applies on the right the shear transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \warning 2D only.
+  * \sa preshear()
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::shear(Scalar sx, Scalar sy)
+{
+  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  VectorType tmp = linear().col(0)*sy + linear().col(1);
+  linear() << linear().col(0) + linear().col(1)*sx, tmp;
+  return *this;
+}
+
+/** Applies on the left the shear transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \warning 2D only.
+  * \sa shear()
+  */
+template<typename Scalar, int Dim>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::preshear(Scalar sx, Scalar sy)
+{
+  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);
+  return *this;
+}
+
+/******************************************************
+*** Scaling, Translation and Rotation compatibility ***
+******************************************************/
+
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const TranslationType& t)
+{
+  linear().setIdentity();
+  translation() = t.vector();
+  m_matrix.template block<1,Dim>(Dim,0).setZero();
+  m_matrix(Dim,Dim) = Scalar(1);
+  return *this;
+}
+
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const TranslationType& t) const
+{
+  Transform res = *this;
+  res.translate(t.vector());
+  return res;
+}
+
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const ScalingType& s)
+{
+  m_matrix.setZero();
+  linear().diagonal() = s.coeffs();
+  m_matrix.coeffRef(Dim,Dim) = Scalar(1);
+  return *this;
+}
+
+template<typename Scalar, int Dim>
+inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const ScalingType& s) const
+{
+  Transform res = *this;
+  res.scale(s.coeffs());
+  return res;
+}
+
+template<typename Scalar, int Dim>
+template<typename Derived>
+inline Transform<Scalar,Dim>& Transform<Scalar,Dim>::operator=(const RotationBase<Derived,Dim>& r)
+{
+  linear() = ei_toRotationMatrix<Scalar,Dim>(r);
+  translation().setZero();
+  m_matrix.template block<1,Dim>(Dim,0).setZero();
+  m_matrix.coeffRef(Dim,Dim) = Scalar(1);
+  return *this;
+}
+
+template<typename Scalar, int Dim>
+template<typename Derived>
+inline Transform<Scalar,Dim> Transform<Scalar,Dim>::operator*(const RotationBase<Derived,Dim>& r) const
+{
+  Transform res = *this;
+  res.rotate(r.derived());
+  return res;
+}
+
+/************************
+*** Special functions ***
+************************/
+
+/** \returns the rotation part of the transformation
+  * \nonstableyet
+  *
+  * \svd_module
+  *
+  * \sa computeRotationScaling(), computeScalingRotation(), class SVD
+  */
+template<typename Scalar, int Dim>
+typename Transform<Scalar,Dim>::LinearMatrixType
+Transform<Scalar,Dim>::rotation() const
+{
+  LinearMatrixType result;
+  computeRotationScaling(&result, (LinearMatrixType*)0);
+  return result;
+}
+
+
+/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * \nonstableyet
+  *
+  * \svd_module
+  *
+  * \sa computeScalingRotation(), rotation(), class SVD
+  */
+template<typename Scalar, int Dim>
+template<typename RotationMatrixType, typename ScalingMatrixType>
+void Transform<Scalar,Dim>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const
+{
+  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
+  Matrix<Scalar, Dim, 1> sv(svd.singularValues());
+  sv.coeffRef(0) *= x;
+  if(scaling)
+  {
+    scaling->noalias() = svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint();
+  }
+  if(rotation)
+  {
+    LinearMatrixType m(svd.matrixU());
+    m.col(0) /= x;
+    rotation->noalias() = m * svd.matrixV().adjoint();
+  }
+}
+
+/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * \nonstableyet
+  *
+  * \svd_module
+  *
+  * \sa computeRotationScaling(), rotation(), class SVD
+  */
+template<typename Scalar, int Dim>
+template<typename ScalingMatrixType, typename RotationMatrixType>
+void Transform<Scalar,Dim>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const
+{
+  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU|ComputeFullV);
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
+  Matrix<Scalar, Dim, 1> sv(svd.singularValues());
+  sv.coeffRef(0) *= x;
+  if(scaling)
+  {
+    scaling->noalias() = svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint();
+  }
+  if(rotation)
+  {
+    LinearMatrixType m(svd.matrixU());
+    m.col(0) /= x;
+    rotation->noalias() = m * svd.matrixV().adjoint();
+  }
+}
+
+/** Convenient method to set \c *this from a position, orientation and scale
+  * of a 3D object.
+  */
+template<typename Scalar, int Dim>
+template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
+Transform<Scalar,Dim>&
+Transform<Scalar,Dim>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
+  const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)
+{
+  linear() = ei_toRotationMatrix<Scalar,Dim>(orientation);
+  linear() *= scale.asDiagonal();
+  translation() = position;
+  m_matrix.template block<1,Dim>(Dim,0).setZero();
+  m_matrix(Dim,Dim) = Scalar(1);
+  return *this;
+}
+
+/** \nonstableyet
+  *
+  * \returns the inverse transformation matrix according to some given knowledge
+  * on \c *this.
+  *
+  * \param traits allows to optimize the inversion process when the transformion
+  * is known to be not a general transformation. The possible values are:
+  *  - Projective if the transformation is not necessarily affine, i.e., if the
+  *    last row is not guaranteed to be [0 ... 0 1]
+  *  - Affine is the default, the last row is assumed to be [0 ... 0 1]
+  *  - Isometry if the transformation is only a concatenations of translations
+  *    and rotations.
+  *
+  * \warning unless \a traits is always set to NoShear or NoScaling, this function
+  * requires the generic inverse method of MatrixBase defined in the LU module. If
+  * you forget to include this module, then you will get hard to debug linking errors.
+  *
+  * \sa MatrixBase::inverse()
+  */
+template<typename Scalar, int Dim>
+inline const typename Transform<Scalar,Dim>::MatrixType
+Transform<Scalar,Dim>::inverse(TransformTraits traits) const
+{
+  if (traits == Projective)
+  {
+    return m_matrix.inverse();
+  }
+  else
+  {
+    MatrixType res;
+    if (traits == Affine)
+    {
+      res.template corner<Dim,Dim>(TopLeft) = linear().inverse();
+    }
+    else if (traits == Isometry)
+    {
+      res.template corner<Dim,Dim>(TopLeft) = linear().transpose();
+    }
+    else
+    {
+      ei_assert("invalid traits value in Transform::inverse()");
+    }
+    // translation and remaining parts
+    res.template corner<Dim,1>(TopRight) = - res.template corner<Dim,Dim>(TopLeft) * translation();
+    res.template corner<1,Dim>(BottomLeft).setZero();
+    res.coeffRef(Dim,Dim) = Scalar(1);
+    return res;
+  }
+}
+
+/*****************************************************
+*** Specializations of operator* with a MatrixBase ***
+*****************************************************/
+
+template<typename Other, int Dim, int HDim>
+struct ei_transform_product_impl<Other,Dim,HDim, HDim,HDim>
+{
+  typedef Transform<typename Other::Scalar,Dim> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;
+  static ResultType run(const TransformType& tr, const Other& other)
+  { return tr.matrix() * other; }
+};
+
+template<typename Other, int Dim, int HDim>
+struct ei_transform_product_impl<Other,Dim,HDim, Dim,Dim>
+{
+  typedef Transform<typename Other::Scalar,Dim> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef TransformType ResultType;
+  static ResultType run(const TransformType& tr, const Other& other)
+  {
+    TransformType res;
+    res.translation() = tr.translation();
+    res.matrix().row(Dim) = tr.matrix().row(Dim);
+    res.linear() = (tr.linear() * other).lazy();
+    return res;
+  }
+};
+
+template<typename Other, int Dim, int HDim>
+struct ei_transform_product_impl<Other,Dim,HDim, HDim,1>
+{
+  typedef Transform<typename Other::Scalar,Dim> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef typename ProductReturnType<MatrixType,Other>::Type ResultType;
+  static ResultType run(const TransformType& tr, const Other& other)
+  { return tr.matrix() * other; }
+};
+
+template<typename Other, int Dim, int HDim>
+struct ei_transform_product_impl<Other,Dim,HDim, Dim,1>
+{
+  typedef typename Other::Scalar Scalar;
+  typedef Transform<Scalar,Dim> TransformType;
+  typedef Matrix<Scalar,Dim,1> ResultType;
+  static ResultType run(const TransformType& tr, const Other& other)
+  { return ((tr.linear() * other) + tr.translation())
+          * (Scalar(1) / ( (tr.matrix().template block<1,Dim>(Dim,0) * other).coeff(0) + tr.matrix().coeff(Dim,Dim))); }
+};
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Translation.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Translation.h
new file mode 100644
index 0000000..2b9859f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Geometry/Translation.h
@@ -0,0 +1,184 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Translation
+  *
+  * \brief Represents a translation transformation
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  * \param _Dim the  dimension of the space, can be a compile time value or Dynamic
+  *
+  * \note This class is not aimed to be used to store a translation transformation,
+  * but rather to make easier the constructions and updates of Transform objects.
+  *
+  * \sa class Scaling, class Transform
+  */
+template<typename _Scalar, int _Dim>
+class Translation
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)
+  /** dimension of the space */
+  enum { Dim = _Dim };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  /** corresponding vector type */
+  typedef Matrix<Scalar,Dim,1> VectorType;
+  /** corresponding linear transformation matrix type */
+  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
+  /** corresponding scaling transformation type */
+  typedef Scaling<Scalar,Dim> ScalingType;
+  /** corresponding affine transformation type */
+  typedef Transform<Scalar,Dim> TransformType;
+
+protected:
+
+  VectorType m_coeffs;
+
+public:
+
+  /** Default constructor without initialization. */
+  Translation() {}
+  /**  */
+  inline Translation(const Scalar& sx, const Scalar& sy)
+  {
+    ei_assert(Dim==2);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+  }
+  /**  */
+  inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz)
+  {
+    ei_assert(Dim==3);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+    m_coeffs.z() = sz;
+  }
+  /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */
+  explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {}
+
+  const VectorType& vector() const { return m_coeffs; }
+  VectorType& vector() { return m_coeffs; }
+
+  /** Concatenates two translation */
+  inline Translation operator* (const Translation& other) const
+  { return Translation(m_coeffs + other.m_coeffs); }
+
+  /** Concatenates a translation and a scaling */
+  inline TransformType operator* (const ScalingType& other) const;
+
+  /** Concatenates a translation and a linear transformation */
+  inline TransformType operator* (const LinearMatrixType& linear) const;
+
+  template<typename Derived>
+  inline TransformType operator*(const RotationBase<Derived,Dim>& r) const
+  { return *this * r.toRotationMatrix(); }
+
+  /** Concatenates a linear transformation and a translation */
+  // its a nightmare to define a templated friend function outside its declaration
+  friend inline TransformType operator* (const LinearMatrixType& linear, const Translation& t)
+  {
+    TransformType res;
+    res.matrix().setZero();
+    res.linear() = linear;
+    res.translation() = linear * t.m_coeffs;
+    res.matrix().row(Dim).setZero();
+    res(Dim,Dim) = Scalar(1);
+    return res;
+  }
+
+  /** Concatenates a translation and an affine transformation */
+  inline TransformType operator* (const TransformType& t) const;
+
+  /** Applies translation to vector */
+  inline VectorType operator* (const VectorType& other) const
+  { return m_coeffs + other; }
+
+  /** \returns the inverse translation (opposite) */
+  Translation inverse() const { return Translation(-m_coeffs); }
+
+  Translation& operator=(const Translation& other)
+  {
+    m_coeffs = other.m_coeffs;
+    return *this;
+  }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const
+  { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Translation(const Translation<OtherScalarType,Dim>& other)
+  { m_coeffs = other.vector().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Translation& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+};
+
+/** \addtogroup Geometry_Module */
+//@{
+typedef Translation<float, 2> Translation2f;
+typedef Translation<double,2> Translation2d;
+typedef Translation<float, 3> Translation3f;
+typedef Translation<double,3> Translation3d;
+//@}
+
+
+template<typename Scalar, int Dim>
+inline typename Translation<Scalar,Dim>::TransformType
+Translation<Scalar,Dim>::operator* (const ScalingType& other) const
+{
+  TransformType res;
+  res.matrix().setZero();
+  res.linear().diagonal() = other.coeffs();
+  res.translation() = m_coeffs;
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+template<typename Scalar, int Dim>
+inline typename Translation<Scalar,Dim>::TransformType
+Translation<Scalar,Dim>::operator* (const LinearMatrixType& linear) const
+{
+  TransformType res;
+  res.matrix().setZero();
+  res.linear() = linear;
+  res.translation() = m_coeffs;
+  res.matrix().row(Dim).setZero();
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+template<typename Scalar, int Dim>
+inline typename Translation<Scalar,Dim>::TransformType
+Translation<Scalar,Dim>::operator* (const TransformType& t) const
+{
+  TransformType res = t;
+  res.pretranslate(m_coeffs);
+  return res;
+}
+
+} // end namespace Eigen
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LU.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LU.h
new file mode 100644
index 0000000..49f19ad
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LU.h
@@ -0,0 +1,120 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_LU_H
+#define EIGEN2_LU_H
+
+namespace Eigen { 
+
+template<typename MatrixType>
+class LU : public FullPivLU<MatrixType>
+{
+  public:
+
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> IntRowVectorType;
+    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> IntColVectorType;
+    typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime, MatrixType::Options, 1, MatrixType::MaxColsAtCompileTime> RowVectorType;
+    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1, MatrixType::Options, MatrixType::MaxRowsAtCompileTime, 1> ColVectorType;
+
+    typedef Matrix<typename MatrixType::Scalar,
+                  MatrixType::ColsAtCompileTime, // the number of rows in the "kernel matrix" is the number of cols of the original matrix
+                                                 // so that the product "matrix * kernel = zero" makes sense
+                  Dynamic,                       // we don't know at compile-time the dimension of the kernel
+                  MatrixType::Options,
+                  MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter
+                  MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space, whose dimension is the number
+                                                   // of columns of the original matrix
+    > KernelResultType;
+
+    typedef Matrix<typename MatrixType::Scalar,
+                   MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose dimension is the number
+                                                  // of rows of the original matrix
+                   Dynamic,                       // we don't know at compile time the dimension of the image (the rank)
+                   MatrixType::Options,
+                   MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix,
+                   MatrixType::MaxColsAtCompileTime  // so it has the same number of rows and at most as many columns.
+    > ImageResultType;
+
+    typedef FullPivLU<MatrixType> Base;
+
+    template<typename T>
+    explicit LU(const T& t) : Base(t), m_originalMatrix(t) {}
+
+    template<typename OtherDerived, typename ResultType>
+    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
+    {
+      *result = static_cast<const Base*>(this)->solve(b);
+      return true;
+    }
+
+    template<typename ResultType>
+    inline void computeInverse(ResultType *result) const
+    {
+      solve(MatrixType::Identity(this->rows(), this->cols()), result);
+    }
+    
+    template<typename KernelMatrixType>
+    void computeKernel(KernelMatrixType *result) const
+    {
+      *result = static_cast<const Base*>(this)->kernel();
+    }
+    
+    template<typename ImageMatrixType>
+    void computeImage(ImageMatrixType *result) const
+    {
+      *result = static_cast<const Base*>(this)->image(m_originalMatrix);
+    }
+    
+    const ImageResultType image() const
+    {
+      return static_cast<const Base*>(this)->image(m_originalMatrix);
+    }
+    
+    const MatrixType& m_originalMatrix;
+};
+
+#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
+/** \lu_module
+  *
+  * Synonym of partialPivLu().
+  *
+  * \return the partial-pivoting LU decomposition of \c *this.
+  *
+  * \sa class PartialPivLU
+  */
+template<typename Derived>
+inline const LU<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::lu() const
+{
+  return LU<PlainObject>(eval());
+}
+#endif
+
+#ifdef EIGEN2_SUPPORT
+/** \lu_module
+  *
+  * Synonym of partialPivLu().
+  *
+  * \return the partial-pivoting LU decomposition of \c *this.
+  *
+  * \sa class PartialPivLU
+  */
+template<typename Derived>
+inline const LU<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::eigen2_lu() const
+{
+  return LU<PlainObject>(eval());
+}
+#endif
+
+} // end namespace Eigen
+
+#endif // EIGEN2_LU_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Lazy.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Lazy.h
new file mode 100644
index 0000000..593fc78
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Lazy.h
@@ -0,0 +1,71 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_LAZY_H
+#define EIGEN_LAZY_H
+
+namespace Eigen { 
+
+/** \deprecated it is only used by lazy() which is deprecated
+  *
+  * \returns an expression of *this with added flags
+  *
+  * Example: \include MatrixBase_marked.cpp
+  * Output: \verbinclude MatrixBase_marked.out
+  *
+  * \sa class Flagged, extract(), part()
+  */
+template<typename Derived>
+template<unsigned int Added>
+inline const Flagged<Derived, Added, 0>
+MatrixBase<Derived>::marked() const
+{
+  return derived();
+}
+
+/** \deprecated use MatrixBase::noalias()
+  *
+  * \returns an expression of *this with the EvalBeforeAssigningBit flag removed.
+  *
+  * Example: \include MatrixBase_lazy.cpp
+  * Output: \verbinclude MatrixBase_lazy.out
+  *
+  * \sa class Flagged, marked()
+  */
+template<typename Derived>
+inline const Flagged<Derived, 0, EvalBeforeAssigningBit>
+MatrixBase<Derived>::lazy() const
+{
+  return derived();
+}
+
+
+/** \internal
+  * Overloaded to perform an efficient C += (A*B).lazy() */
+template<typename Derived>
+template<typename ProductDerived, typename Lhs, typename Rhs>
+Derived& MatrixBase<Derived>::operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
+                                                       EvalBeforeAssigningBit>& other)
+{
+  other._expression().derived().addTo(derived()); return derived();
+}
+
+/** \internal
+  * Overloaded to perform an efficient C -= (A*B).lazy() */
+template<typename Derived>
+template<typename ProductDerived, typename Lhs, typename Rhs>
+Derived& MatrixBase<Derived>::operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
+                                                       EvalBeforeAssigningBit>& other)
+{
+  other._expression().derived().subTo(derived()); return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_LAZY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LeastSquares.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LeastSquares.h
new file mode 100644
index 0000000..0e6fdb4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/LeastSquares.h
@@ -0,0 +1,170 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_LEASTSQUARES_H
+#define EIGEN2_LEASTSQUARES_H
+
+namespace Eigen { 
+
+/** \ingroup LeastSquares_Module
+  *
+  * \leastsquares_module
+  *
+  * For a set of points, this function tries to express
+  * one of the coords as a linear (affine) function of the other coords.
+  *
+  * This is best explained by an example. This function works in full
+  * generality, for points in a space of arbitrary dimension, and also over
+  * the complex numbers, but for this example we will work in dimension 3
+  * over the real numbers (doubles).
+  *
+  * So let us work with the following set of 5 points given by their
+  * \f$(x,y,z)\f$ coordinates:
+  * @code
+    Vector3d points[5];
+    points[0] = Vector3d( 3.02, 6.89, -4.32 );
+    points[1] = Vector3d( 2.01, 5.39, -3.79 );
+    points[2] = Vector3d( 2.41, 6.01, -4.01 );
+    points[3] = Vector3d( 2.09, 5.55, -3.86 );
+    points[4] = Vector3d( 2.58, 6.32, -4.10 );
+  * @endcode
+  * Suppose that we want to express the second coordinate (\f$y\f$) as a linear
+  * expression in \f$x\f$ and \f$z\f$, that is,
+  * \f[ y=ax+bz+c \f]
+  * for some constants \f$a,b,c\f$. Thus, we want to find the best possible
+  * constants \f$a,b,c\f$ so that the plane of equation \f$y=ax+bz+c\f$ fits
+  * best the five above points. To do that, call this function as follows:
+  * @code
+    Vector3d coeffs; // will store the coefficients a, b, c
+    linearRegression(
+      5,
+      &points,
+      &coeffs,
+      1 // the coord to express as a function of
+        // the other ones. 0 means x, 1 means y, 2 means z.
+    );
+  * @endcode
+  * Now the vector \a coeffs is approximately
+  * \f$( 0.495 ,  -1.927 ,  -2.906 )\f$.
+  * Thus, we get \f$a=0.495, b = -1.927, c = -2.906\f$. Let us check for
+  * instance how near points[0] is from the plane of equation \f$y=ax+bz+c\f$.
+  * Looking at the coords of points[0], we see that:
+  * \f[ax+bz+c = 0.495 * 3.02 + (-1.927) * (-4.32) + (-2.906) = 6.91.\f]
+  * On the other hand, we have \f$y=6.89\f$. We see that the values
+  * \f$6.91\f$ and \f$6.89\f$
+  * are near, so points[0] is very near the plane of equation \f$y=ax+bz+c\f$.
+  *
+  * Let's now describe precisely the parameters:
+  * @param numPoints the number of points
+  * @param points the array of pointers to the points on which to perform the linear regression
+  * @param result pointer to the vector in which to store the result.
+                  This vector must be of the same type and size as the
+                  data points. The meaning of its coords is as follows.
+                  For brevity, let \f$n=Size\f$,
+                  \f$r_i=result[i]\f$,
+                  and \f$f=funcOfOthers\f$. Denote by
+                  \f$x_0,\ldots,x_{n-1}\f$
+                  the n coordinates in the n-dimensional space.
+                  Then the resulting equation is:
+                  \f[ x_f = r_0 x_0 + \cdots + r_{f-1}x_{f-1}
+                   + r_{f+1}x_{f+1} + \cdots + r_{n-1}x_{n-1} + r_n. \f]
+  * @param funcOfOthers Determines which coord to express as a function of the
+                        others. Coords are numbered starting from 0, so that a
+                        value of 0 means \f$x\f$, 1 means \f$y\f$,
+                        2 means \f$z\f$, ...
+  *
+  * \sa fitHyperplane()
+  */
+template<typename VectorType>
+void linearRegression(int numPoints,
+                      VectorType **points,
+                      VectorType *result,
+                      int funcOfOthers )
+{
+  typedef typename VectorType::Scalar Scalar;
+  typedef Hyperplane<Scalar, VectorType::SizeAtCompileTime> HyperplaneType;
+  const int size = points[0]->size();
+  result->resize(size);
+  HyperplaneType h(size);
+  fitHyperplane(numPoints, points, &h);
+  for(int i = 0; i < funcOfOthers; i++)
+    result->coeffRef(i) = - h.coeffs()[i] / h.coeffs()[funcOfOthers];
+  for(int i = funcOfOthers; i < size; i++)
+    result->coeffRef(i) = - h.coeffs()[i+1] / h.coeffs()[funcOfOthers];
+}
+
+/** \ingroup LeastSquares_Module
+  *
+  * \leastsquares_module
+  *
+  * This function is quite similar to linearRegression(), so we refer to the
+  * documentation of this function and only list here the differences.
+  *
+  * The main difference from linearRegression() is that this function doesn't
+  * take a \a funcOfOthers argument. Instead, it finds a general equation
+  * of the form
+  * \f[ r_0 x_0 + \cdots + r_{n-1}x_{n-1} + r_n = 0, \f]
+  * where \f$n=Size\f$, \f$r_i=retCoefficients[i]\f$, and we denote by
+  * \f$x_0,\ldots,x_{n-1}\f$ the n coordinates in the n-dimensional space.
+  *
+  * Thus, the vector \a retCoefficients has size \f$n+1\f$, which is another
+  * difference from linearRegression().
+  *
+  * In practice, this function performs an hyper-plane fit in a total least square sense
+  * via the following steps:
+  *  1 - center the data to the mean
+  *  2 - compute the covariance matrix
+  *  3 - pick the eigenvector corresponding to the smallest eigenvalue of the covariance matrix
+  * The ratio of the smallest eigenvalue and the second one gives us a hint about the relevance
+  * of the solution. This value is optionally returned in \a soundness.
+  *
+  * \sa linearRegression()
+  */
+template<typename VectorType, typename HyperplaneType>
+void fitHyperplane(int numPoints,
+                   VectorType **points,
+                   HyperplaneType *result,
+                   typename NumTraits<typename VectorType::Scalar>::Real* soundness = 0)
+{
+  typedef typename VectorType::Scalar Scalar;
+  typedef Matrix<Scalar,VectorType::SizeAtCompileTime,VectorType::SizeAtCompileTime> CovMatrixType;
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorType)
+  ei_assert(numPoints >= 1);
+  int size = points[0]->size();
+  ei_assert(size+1 == result->coeffs().size());
+
+  // compute the mean of the data
+  VectorType mean = VectorType::Zero(size);
+  for(int i = 0; i < numPoints; ++i)
+    mean += *(points[i]);
+  mean /= numPoints;
+
+  // compute the covariance matrix
+  CovMatrixType covMat = CovMatrixType::Zero(size, size);
+  VectorType remean = VectorType::Zero(size);
+  for(int i = 0; i < numPoints; ++i)
+  {
+    VectorType diff = (*(points[i]) - mean).conjugate();
+    covMat += diff * diff.adjoint();
+  }
+
+  // now we just have to pick the eigen vector with smallest eigen value
+  SelfAdjointEigenSolver<CovMatrixType> eig(covMat);
+  result->normal() = eig.eigenvectors().col(0);
+  if (soundness)
+    *soundness = eig.eigenvalues().coeff(0)/eig.eigenvalues().coeff(1);
+
+  // let's compute the constant coefficient such that the
+  // plane pass trough the mean point:
+  result->offset() = - (result->normal().cwise()* mean).sum();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_LEASTSQUARES_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Macros.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Macros.h
new file mode 100644
index 0000000..351c32a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Macros.h
@@ -0,0 +1,20 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_MACROS_H
+#define EIGEN2_MACROS_H
+
+#define ei_assert eigen_assert
+#define ei_internal_assert eigen_internal_assert
+
+#define EIGEN_ALIGN_128 EIGEN_ALIGN16
+
+#define EIGEN_ARCH_WANTS_ALIGNMENT EIGEN_ALIGN_STATICALLY
+
+#endif // EIGEN2_MACROS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/MathFunctions.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/MathFunctions.h
new file mode 100644
index 0000000..bde5dd4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/MathFunctions.h
@@ -0,0 +1,57 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_MATH_FUNCTIONS_H
+#define EIGEN2_MATH_FUNCTIONS_H
+
+namespace Eigen { 
+
+template<typename T> inline typename NumTraits<T>::Real ei_real(const T& x) { return internal::real(x); }
+template<typename T> inline typename NumTraits<T>::Real ei_imag(const T& x) { return internal::imag(x); }
+template<typename T> inline T ei_conj(const T& x) { return internal::conj(x); }
+template<typename T> inline typename NumTraits<T>::Real ei_abs (const T& x) { using std::abs; return abs(x); }
+template<typename T> inline typename NumTraits<T>::Real ei_abs2(const T& x) { return internal::abs2(x); }
+template<typename T> inline T ei_sqrt(const T& x) { using std::sqrt; return sqrt(x); }
+template<typename T> inline T ei_exp (const T& x) { using std::exp;  return exp(x); }
+template<typename T> inline T ei_log (const T& x) { using std::log;  return log(x); }
+template<typename T> inline T ei_sin (const T& x) { using std::sin;  return sin(x); }
+template<typename T> inline T ei_cos (const T& x) { using std::cos;  return cos(x); }
+template<typename T> inline T ei_atan2(const T& x,const T& y) { using std::atan2; return atan2(x,y); }
+template<typename T> inline T ei_pow (const T& x,const T& y) { return internal::pow(x,y); }
+template<typename T> inline T ei_random () { return internal::random<T>(); }
+template<typename T> inline T ei_random (const T& x, const T& y) { return internal::random(x, y); }
+
+template<typename T> inline T precision () { return NumTraits<T>::dummy_precision(); }
+template<typename T> inline T machine_epsilon () { return NumTraits<T>::epsilon(); }
+
+
+template<typename Scalar, typename OtherScalar>
+inline bool ei_isMuchSmallerThan(const Scalar& x, const OtherScalar& y,
+                                   typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return internal::isMuchSmallerThan(x, y, precision);
+}
+
+template<typename Scalar>
+inline bool ei_isApprox(const Scalar& x, const Scalar& y,
+                          typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return internal::isApprox(x, y, precision);
+}
+
+template<typename Scalar>
+inline bool ei_isApproxOrLessThan(const Scalar& x, const Scalar& y,
+                                    typename NumTraits<Scalar>::Real precision = NumTraits<Scalar>::dummy_precision())
+{
+  return internal::isApproxOrLessThan(x, y, precision);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_MATH_FUNCTIONS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Memory.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Memory.h
new file mode 100644
index 0000000..f86372b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Memory.h
@@ -0,0 +1,45 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_MEMORY_H
+#define EIGEN2_MEMORY_H
+
+namespace Eigen { 
+
+inline void* ei_aligned_malloc(size_t size) { return internal::aligned_malloc(size); }
+inline void  ei_aligned_free(void *ptr) { internal::aligned_free(ptr); }
+inline void* ei_aligned_realloc(void *ptr, size_t new_size, size_t old_size) { return internal::aligned_realloc(ptr, new_size, old_size); }
+inline void* ei_handmade_aligned_malloc(size_t size) { return internal::handmade_aligned_malloc(size); }
+inline void  ei_handmade_aligned_free(void *ptr) { internal::handmade_aligned_free(ptr); }
+
+template<bool Align> inline void* ei_conditional_aligned_malloc(size_t size)
+{
+  return internal::conditional_aligned_malloc<Align>(size);
+}
+template<bool Align> inline void ei_conditional_aligned_free(void *ptr)
+{
+  internal::conditional_aligned_free<Align>(ptr);
+}
+template<bool Align> inline void* ei_conditional_aligned_realloc(void* ptr, size_t new_size, size_t old_size)
+{
+  return internal::conditional_aligned_realloc<Align>(ptr, new_size, old_size);
+}
+
+template<typename T> inline T* ei_aligned_new(size_t size)
+{
+  return internal::aligned_new<T>(size);
+}
+template<typename T> inline void ei_aligned_delete(T *ptr, size_t size)
+{
+  return internal::aligned_delete(ptr, size);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_MACROS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Meta.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Meta.h
new file mode 100644
index 0000000..fa37cfc
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Meta.h
@@ -0,0 +1,75 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_META_H
+#define EIGEN2_META_H
+
+namespace Eigen { 
+
+template<typename T>
+struct ei_traits : internal::traits<T>
+{};
+
+struct ei_meta_true {  enum { ret = 1 }; };
+struct ei_meta_false { enum { ret = 0 }; };
+
+template<bool Condition, typename Then, typename Else>
+struct ei_meta_if { typedef Then ret; };
+
+template<typename Then, typename Else>
+struct ei_meta_if <false, Then, Else> { typedef Else ret; };
+
+template<typename T, typename U> struct ei_is_same_type { enum { ret = 0 }; };
+template<typename T> struct ei_is_same_type<T,T> { enum { ret = 1 }; };
+
+template<typename T> struct ei_unref { typedef T type; };
+template<typename T> struct ei_unref<T&> { typedef T type; };
+
+template<typename T> struct ei_unpointer { typedef T type; };
+template<typename T> struct ei_unpointer<T*> { typedef T type; };
+template<typename T> struct ei_unpointer<T*const> { typedef T type; };
+
+template<typename T> struct ei_unconst { typedef T type; };
+template<typename T> struct ei_unconst<const T> { typedef T type; };
+template<typename T> struct ei_unconst<T const &> { typedef T & type; };
+template<typename T> struct ei_unconst<T const *> { typedef T * type; };
+
+template<typename T> struct ei_cleantype { typedef T type; };
+template<typename T> struct ei_cleantype<const T>   { typedef typename ei_cleantype<T>::type type; };
+template<typename T> struct ei_cleantype<const T&>  { typedef typename ei_cleantype<T>::type type; };
+template<typename T> struct ei_cleantype<T&>        { typedef typename ei_cleantype<T>::type type; };
+template<typename T> struct ei_cleantype<const T*>  { typedef typename ei_cleantype<T>::type type; };
+template<typename T> struct ei_cleantype<T*>        { typedef typename ei_cleantype<T>::type type; };
+
+/** \internal In short, it computes int(sqrt(\a Y)) with \a Y an integer.
+  * Usage example: \code ei_meta_sqrt<1023>::ret \endcode
+  */
+template<int Y,
+         int InfX = 0,
+         int SupX = ((Y==1) ? 1 : Y/2),
+         bool Done = ((SupX-InfX)<=1 ? true : ((SupX*SupX <= Y) && ((SupX+1)*(SupX+1) > Y))) >
+                                // use ?: instead of || just to shut up a stupid gcc 4.3 warning
+class ei_meta_sqrt
+{
+    enum {
+      MidX = (InfX+SupX)/2,
+      TakeInf = MidX*MidX > Y ? 1 : 0,
+      NewInf = int(TakeInf) ? InfX : int(MidX),
+      NewSup = int(TakeInf) ? int(MidX) : SupX
+    };
+  public:
+    enum { ret = ei_meta_sqrt<Y,NewInf,NewSup>::ret };
+};
+
+template<int Y, int InfX, int SupX>
+class ei_meta_sqrt<Y, InfX, SupX, true> { public:  enum { ret = (SupX*SupX <= Y) ? SupX : InfX }; };
+
+} // end namespace Eigen
+
+#endif // EIGEN2_META_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Minor.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Minor.h
new file mode 100644
index 0000000..4cded57
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/Minor.h
@@ -0,0 +1,117 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MINOR_H
+#define EIGEN_MINOR_H
+
+namespace Eigen { 
+
+/**
+  * \class Minor
+  *
+  * \brief Expression of a minor
+  *
+  * \param MatrixType the type of the object in which we are taking a minor
+  *
+  * This class represents an expression of a minor. It is the return
+  * type of MatrixBase::minor() and most of the time this is the only way it
+  * is used.
+  *
+  * \sa MatrixBase::minor()
+  */
+
+namespace internal {
+template<typename MatrixType>
+struct traits<Minor<MatrixType> >
+ : traits<MatrixType>
+{
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+  typedef typename MatrixType::StorageKind StorageKind;
+  enum {
+    RowsAtCompileTime = (MatrixType::RowsAtCompileTime != Dynamic) ?
+                          int(MatrixType::RowsAtCompileTime) - 1 : Dynamic,
+    ColsAtCompileTime = (MatrixType::ColsAtCompileTime != Dynamic) ?
+                          int(MatrixType::ColsAtCompileTime) - 1 : Dynamic,
+    MaxRowsAtCompileTime = (MatrixType::MaxRowsAtCompileTime != Dynamic) ?
+                             int(MatrixType::MaxRowsAtCompileTime) - 1 : Dynamic,
+    MaxColsAtCompileTime = (MatrixType::MaxColsAtCompileTime != Dynamic) ?
+                             int(MatrixType::MaxColsAtCompileTime) - 1 : Dynamic,
+    Flags = _MatrixTypeNested::Flags & (HereditaryBits | LvalueBit),
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost // minor is used typically on tiny matrices,
+      // where loops are unrolled and the 'if' evaluates at compile time
+  };
+};
+}
+
+template<typename MatrixType> class Minor
+  : public MatrixBase<Minor<MatrixType> >
+{
+  public:
+
+    typedef MatrixBase<Minor> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Minor)
+
+    inline Minor(const MatrixType& matrix,
+                       Index row, Index col)
+      : m_matrix(matrix), m_row(row), m_col(col)
+    {
+      eigen_assert(row >= 0 && row < matrix.rows()
+          && col >= 0 && col < matrix.cols());
+    }
+
+    EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Minor)
+
+    inline Index rows() const { return m_matrix.rows() - 1; }
+    inline Index cols() const { return m_matrix.cols() - 1; }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      return m_matrix.const_cast_derived().coeffRef(row + (row >= m_row), col + (col >= m_col));
+    }
+
+    inline const Scalar coeff(Index row, Index col) const
+    {
+      return m_matrix.coeff(row + (row >= m_row), col + (col >= m_col));
+    }
+
+  protected:
+    const typename MatrixType::Nested m_matrix;
+    const Index m_row, m_col;
+};
+
+/**
+  * \return an expression of the (\a row, \a col)-minor of *this,
+  * i.e. an expression constructed from *this by removing the specified
+  * row and column.
+  *
+  * Example: \include MatrixBase_minor.cpp
+  * Output: \verbinclude MatrixBase_minor.out
+  *
+  * \sa class Minor
+  */
+template<typename Derived>
+inline Minor<Derived>
+MatrixBase<Derived>::minor(Index row, Index col)
+{
+  return Minor<Derived>(derived(), row, col);
+}
+
+/**
+  * This is the const version of minor(). */
+template<typename Derived>
+inline const Minor<Derived>
+MatrixBase<Derived>::minor(Index row, Index col) const
+{
+  return Minor<Derived>(derived(), row, col);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_MINOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/QR.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/QR.h
new file mode 100644
index 0000000..2042c98
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/QR.h
@@ -0,0 +1,67 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_QR_H
+#define EIGEN2_QR_H
+
+namespace Eigen { 
+
+template<typename MatrixType>
+class QR : public HouseholderQR<MatrixType>
+{
+  public:
+
+    typedef HouseholderQR<MatrixType> Base;
+    typedef Block<const MatrixType, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixRBlockType;
+
+    QR() : Base() {}
+
+    template<typename T>
+    explicit QR(const T& t) : Base(t) {}
+
+    template<typename OtherDerived, typename ResultType>
+    bool solve(const MatrixBase<OtherDerived>& b, ResultType *result) const
+    {
+      *result = static_cast<const Base*>(this)->solve(b);
+      return true;
+    }
+
+    MatrixType matrixQ(void) const {
+      MatrixType ret = MatrixType::Identity(this->rows(), this->cols());
+      ret = this->householderQ() * ret;
+      return ret;
+    }
+
+    bool isFullRank() const {
+      return true;
+    }
+    
+    const TriangularView<MatrixRBlockType, UpperTriangular>
+    matrixR(void) const
+    {
+      int cols = this->cols();
+      return MatrixRBlockType(this->matrixQR(), 0, 0, cols, cols).template triangularView<UpperTriangular>();
+    }
+};
+
+/** \return the QR decomposition of \c *this.
+  *
+  * \sa class QR
+  */
+template<typename Derived>
+const QR<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::qr() const
+{
+  return QR<PlainObject>(eval());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_QR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/SVD.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/SVD.h
new file mode 100644
index 0000000..a08b695
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/SVD.h
@@ -0,0 +1,638 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <g.gael at free.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_SVD_H
+#define EIGEN2_SVD_H
+
+namespace Eigen {
+
+/** \ingroup SVD_Module
+  * \nonstableyet
+  *
+  * \class SVD
+  *
+  * \brief Standard SVD decomposition of a matrix and associated features
+  *
+  * \param MatrixType the type of the matrix of which we are computing the SVD decomposition
+  *
+  * This class performs a standard SVD decomposition of a real matrix A of size \c M x \c N
+  * with \c M \>= \c N.
+  *
+  *
+  * \sa MatrixBase::SVD()
+  */
+template<typename MatrixType> class SVD
+{
+  private:
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+
+    enum {
+      PacketSize = internal::packet_traits<Scalar>::size,
+      AlignmentMask = int(PacketSize)-1,
+      MinSize = EIGEN_SIZE_MIN_PREFER_DYNAMIC(MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime)
+    };
+
+    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVector;
+    typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, 1> RowVector;
+
+    typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, MinSize> MatrixUType;
+    typedef Matrix<Scalar, MatrixType::ColsAtCompileTime, MatrixType::ColsAtCompileTime> MatrixVType;
+    typedef Matrix<Scalar, MinSize, 1> SingularValuesType;
+
+  public:
+
+    SVD() {} // a user who relied on compiler-generated default compiler reported problems with MSVC in 2.0.7
+    
+    SVD(const MatrixType& matrix)
+      : m_matU(matrix.rows(), (std::min)(matrix.rows(), matrix.cols())),
+        m_matV(matrix.cols(),matrix.cols()),
+        m_sigma((std::min)(matrix.rows(),matrix.cols()))
+    {
+      compute(matrix);
+    }
+
+    template<typename OtherDerived, typename ResultType>
+    bool solve(const MatrixBase<OtherDerived> &b, ResultType* result) const;
+
+    const MatrixUType& matrixU() const { return m_matU; }
+    const SingularValuesType& singularValues() const { return m_sigma; }
+    const MatrixVType& matrixV() const { return m_matV; }
+
+    void compute(const MatrixType& matrix);
+    SVD& sort();
+
+    template<typename UnitaryType, typename PositiveType>
+    void computeUnitaryPositive(UnitaryType *unitary, PositiveType *positive) const;
+    template<typename PositiveType, typename UnitaryType>
+    void computePositiveUnitary(PositiveType *positive, UnitaryType *unitary) const;
+    template<typename RotationType, typename ScalingType>
+    void computeRotationScaling(RotationType *unitary, ScalingType *positive) const;
+    template<typename ScalingType, typename RotationType>
+    void computeScalingRotation(ScalingType *positive, RotationType *unitary) const;
+
+  protected:
+    /** \internal */
+    MatrixUType m_matU;
+    /** \internal */
+    MatrixVType m_matV;
+    /** \internal */
+    SingularValuesType m_sigma;
+};
+
+/** Computes / recomputes the SVD decomposition A = U S V^* of \a matrix
+  *
+  * \note this code has been adapted from JAMA (public domain)
+  */
+template<typename MatrixType>
+void SVD<MatrixType>::compute(const MatrixType& matrix)
+{
+  const int m = matrix.rows();
+  const int n = matrix.cols();
+  const int nu = (std::min)(m,n);
+  ei_assert(m>=n && "In Eigen 2.0, SVD only works for MxN matrices with M>=N. Sorry!");
+  ei_assert(m>1 && "In Eigen 2.0, SVD doesn't work on 1x1 matrices");
+
+  m_matU.resize(m, nu);
+  m_matU.setZero();
+  m_sigma.resize((std::min)(m,n));
+  m_matV.resize(n,n);
+
+  RowVector e(n);
+  ColVector work(m);
+  MatrixType matA(matrix);
+  const bool wantu = true;
+  const bool wantv = true;
+  int i=0, j=0, k=0;
+
+  // Reduce A to bidiagonal form, storing the diagonal elements
+  // in s and the super-diagonal elements in e.
+  int nct = (std::min)(m-1,n);
+  int nrt = (std::max)(0,(std::min)(n-2,m));
+  for (k = 0; k < (std::max)(nct,nrt); ++k)
+  {
+    if (k < nct)
+    {
+      // Compute the transformation for the k-th column and
+      // place the k-th diagonal in m_sigma[k].
+      m_sigma[k] = matA.col(k).end(m-k).norm();
+      if (m_sigma[k] != 0.0) // FIXME
+      {
+        if (matA(k,k) < 0.0)
+          m_sigma[k] = -m_sigma[k];
+        matA.col(k).end(m-k) /= m_sigma[k];
+        matA(k,k) += 1.0;
+      }
+      m_sigma[k] = -m_sigma[k];
+    }
+
+    for (j = k+1; j < n; ++j)
+    {
+      if ((k < nct) && (m_sigma[k] != 0.0))
+      {
+        // Apply the transformation.
+        Scalar t = matA.col(k).end(m-k).eigen2_dot(matA.col(j).end(m-k)); // FIXME dot product or cwise prod + .sum() ??
+        t = -t/matA(k,k);
+        matA.col(j).end(m-k) += t * matA.col(k).end(m-k);
+      }
+
+      // Place the k-th row of A into e for the
+      // subsequent calculation of the row transformation.
+      e[j] = matA(k,j);
+    }
+
+    // Place the transformation in U for subsequent back multiplication.
+    if (wantu & (k < nct))
+      m_matU.col(k).end(m-k) = matA.col(k).end(m-k);
+
+    if (k < nrt)
+    {
+      // Compute the k-th row transformation and place the
+      // k-th super-diagonal in e[k].
+      e[k] = e.end(n-k-1).norm();
+      if (e[k] != 0.0)
+      {
+          if (e[k+1] < 0.0)
+            e[k] = -e[k];
+          e.end(n-k-1) /= e[k];
+          e[k+1] += 1.0;
+      }
+      e[k] = -e[k];
+      if ((k+1 < m) & (e[k] != 0.0))
+      {
+        // Apply the transformation.
+        work.end(m-k-1) = matA.corner(BottomRight,m-k-1,n-k-1) * e.end(n-k-1);
+        for (j = k+1; j < n; ++j)
+          matA.col(j).end(m-k-1) += (-e[j]/e[k+1]) * work.end(m-k-1);
+      }
+
+      // Place the transformation in V for subsequent back multiplication.
+      if (wantv)
+        m_matV.col(k).end(n-k-1) = e.end(n-k-1);
+    }
+  }
+
+
+  // Set up the final bidiagonal matrix or order p.
+  int p = (std::min)(n,m+1);
+  if (nct < n)
+    m_sigma[nct] = matA(nct,nct);
+  if (m < p)
+    m_sigma[p-1] = 0.0;
+  if (nrt+1 < p)
+    e[nrt] = matA(nrt,p-1);
+  e[p-1] = 0.0;
+
+  // If required, generate U.
+  if (wantu)
+  {
+    for (j = nct; j < nu; ++j)
+    {
+      m_matU.col(j).setZero();
+      m_matU(j,j) = 1.0;
+    }
+    for (k = nct-1; k >= 0; k--)
+    {
+      if (m_sigma[k] != 0.0)
+      {
+        for (j = k+1; j < nu; ++j)
+        {
+          Scalar t = m_matU.col(k).end(m-k).eigen2_dot(m_matU.col(j).end(m-k)); // FIXME is it really a dot product we want ?
+          t = -t/m_matU(k,k);
+          m_matU.col(j).end(m-k) += t * m_matU.col(k).end(m-k);
+        }
+        m_matU.col(k).end(m-k) = - m_matU.col(k).end(m-k);
+        m_matU(k,k) = Scalar(1) + m_matU(k,k);
+        if (k-1>0)
+          m_matU.col(k).start(k-1).setZero();
+      }
+      else
+      {
+        m_matU.col(k).setZero();
+        m_matU(k,k) = 1.0;
+      }
+    }
+  }
+
+  // If required, generate V.
+  if (wantv)
+  {
+    for (k = n-1; k >= 0; k--)
+    {
+      if ((k < nrt) & (e[k] != 0.0))
+      {
+        for (j = k+1; j < nu; ++j)
+        {
+          Scalar t = m_matV.col(k).end(n-k-1).eigen2_dot(m_matV.col(j).end(n-k-1)); // FIXME is it really a dot product we want ?
+          t = -t/m_matV(k+1,k);
+          m_matV.col(j).end(n-k-1) += t * m_matV.col(k).end(n-k-1);
+        }
+      }
+      m_matV.col(k).setZero();
+      m_matV(k,k) = 1.0;
+    }
+  }
+
+  // Main iteration loop for the singular values.
+  int pp = p-1;
+  int iter = 0;
+  Scalar eps = ei_pow(Scalar(2),ei_is_same_type<Scalar,float>::ret ? Scalar(-23) : Scalar(-52));
+  while (p > 0)
+  {
+    int k=0;
+    int kase=0;
+
+    // Here is where a test for too many iterations would go.
+
+    // This section of the program inspects for
+    // negligible elements in the s and e arrays.  On
+    // completion the variables kase and k are set as follows.
+
+    // kase = 1     if s(p) and e[k-1] are negligible and k<p
+    // kase = 2     if s(k) is negligible and k<p
+    // kase = 3     if e[k-1] is negligible, k<p, and
+    //              s(k), ..., s(p) are not negligible (qr step).
+    // kase = 4     if e(p-1) is negligible (convergence).
+
+    for (k = p-2; k >= -1; --k)
+    {
+      if (k == -1)
+          break;
+      if (ei_abs(e[k]) <= eps*(ei_abs(m_sigma[k]) + ei_abs(m_sigma[k+1])))
+      {
+          e[k] = 0.0;
+          break;
+      }
+    }
+    if (k == p-2)
+    {
+      kase = 4;
+    }
+    else
+    {
+      int ks;
+      for (ks = p-1; ks >= k; --ks)
+      {
+        if (ks == k)
+          break;
+        Scalar t = (ks != p ? ei_abs(e[ks]) : Scalar(0)) + (ks != k+1 ? ei_abs(e[ks-1]) : Scalar(0));
+        if (ei_abs(m_sigma[ks]) <= eps*t)
+        {
+          m_sigma[ks] = 0.0;
+          break;
+        }
+      }
+      if (ks == k)
+      {
+        kase = 3;
+      }
+      else if (ks == p-1)
+      {
+        kase = 1;
+      }
+      else
+      {
+        kase = 2;
+        k = ks;
+      }
+    }
+    ++k;
+
+    // Perform the task indicated by kase.
+    switch (kase)
+    {
+
+      // Deflate negligible s(p).
+      case 1:
+      {
+        Scalar f(e[p-2]);
+        e[p-2] = 0.0;
+        for (j = p-2; j >= k; --j)
+        {
+          Scalar t(internal::hypot(m_sigma[j],f));
+          Scalar cs(m_sigma[j]/t);
+          Scalar sn(f/t);
+          m_sigma[j] = t;
+          if (j != k)
+          {
+            f = -sn*e[j-1];
+            e[j-1] = cs*e[j-1];
+          }
+          if (wantv)
+          {
+            for (i = 0; i < n; ++i)
+            {
+              t = cs*m_matV(i,j) + sn*m_matV(i,p-1);
+              m_matV(i,p-1) = -sn*m_matV(i,j) + cs*m_matV(i,p-1);
+              m_matV(i,j) = t;
+            }
+          }
+        }
+      }
+      break;
+
+      // Split at negligible s(k).
+      case 2:
+      {
+        Scalar f(e[k-1]);
+        e[k-1] = 0.0;
+        for (j = k; j < p; ++j)
+        {
+          Scalar t(internal::hypot(m_sigma[j],f));
+          Scalar cs( m_sigma[j]/t);
+          Scalar sn(f/t);
+          m_sigma[j] = t;
+          f = -sn*e[j];
+          e[j] = cs*e[j];
+          if (wantu)
+          {
+            for (i = 0; i < m; ++i)
+            {
+              t = cs*m_matU(i,j) + sn*m_matU(i,k-1);
+              m_matU(i,k-1) = -sn*m_matU(i,j) + cs*m_matU(i,k-1);
+              m_matU(i,j) = t;
+            }
+          }
+        }
+      }
+      break;
+
+      // Perform one qr step.
+      case 3:
+      {
+        // Calculate the shift.
+        Scalar scale = (std::max)((std::max)((std::max)((std::max)(
+                        ei_abs(m_sigma[p-1]),ei_abs(m_sigma[p-2])),ei_abs(e[p-2])),
+                        ei_abs(m_sigma[k])),ei_abs(e[k]));
+        Scalar sp = m_sigma[p-1]/scale;
+        Scalar spm1 = m_sigma[p-2]/scale;
+        Scalar epm1 = e[p-2]/scale;
+        Scalar sk = m_sigma[k]/scale;
+        Scalar ek = e[k]/scale;
+        Scalar b = ((spm1 + sp)*(spm1 - sp) + epm1*epm1)/Scalar(2);
+        Scalar c = (sp*epm1)*(sp*epm1);
+        Scalar shift(0);
+        if ((b != 0.0) || (c != 0.0))
+        {
+          shift = ei_sqrt(b*b + c);
+          if (b < 0.0)
+            shift = -shift;
+          shift = c/(b + shift);
+        }
+        Scalar f = (sk + sp)*(sk - sp) + shift;
+        Scalar g = sk*ek;
+
+        // Chase zeros.
+
+        for (j = k; j < p-1; ++j)
+        {
+          Scalar t = internal::hypot(f,g);
+          Scalar cs = f/t;
+          Scalar sn = g/t;
+          if (j != k)
+            e[j-1] = t;
+          f = cs*m_sigma[j] + sn*e[j];
+          e[j] = cs*e[j] - sn*m_sigma[j];
+          g = sn*m_sigma[j+1];
+          m_sigma[j+1] = cs*m_sigma[j+1];
+          if (wantv)
+          {
+            for (i = 0; i < n; ++i)
+            {
+              t = cs*m_matV(i,j) + sn*m_matV(i,j+1);
+              m_matV(i,j+1) = -sn*m_matV(i,j) + cs*m_matV(i,j+1);
+              m_matV(i,j) = t;
+            }
+          }
+          t = internal::hypot(f,g);
+          cs = f/t;
+          sn = g/t;
+          m_sigma[j] = t;
+          f = cs*e[j] + sn*m_sigma[j+1];
+          m_sigma[j+1] = -sn*e[j] + cs*m_sigma[j+1];
+          g = sn*e[j+1];
+          e[j+1] = cs*e[j+1];
+          if (wantu && (j < m-1))
+          {
+            for (i = 0; i < m; ++i)
+            {
+              t = cs*m_matU(i,j) + sn*m_matU(i,j+1);
+              m_matU(i,j+1) = -sn*m_matU(i,j) + cs*m_matU(i,j+1);
+              m_matU(i,j) = t;
+            }
+          }
+        }
+        e[p-2] = f;
+        iter = iter + 1;
+      }
+      break;
+
+      // Convergence.
+      case 4:
+      {
+        // Make the singular values positive.
+        if (m_sigma[k] <= 0.0)
+        {
+          m_sigma[k] = m_sigma[k] < Scalar(0) ? -m_sigma[k] : Scalar(0);
+          if (wantv)
+            m_matV.col(k).start(pp+1) = -m_matV.col(k).start(pp+1);
+        }
+
+        // Order the singular values.
+        while (k < pp)
+        {
+          if (m_sigma[k] >= m_sigma[k+1])
+            break;
+          Scalar t = m_sigma[k];
+          m_sigma[k] = m_sigma[k+1];
+          m_sigma[k+1] = t;
+          if (wantv && (k < n-1))
+            m_matV.col(k).swap(m_matV.col(k+1));
+          if (wantu && (k < m-1))
+            m_matU.col(k).swap(m_matU.col(k+1));
+          ++k;
+        }
+        iter = 0;
+        p--;
+      }
+      break;
+    } // end big switch
+  } // end iterations
+}
+
+template<typename MatrixType>
+SVD<MatrixType>& SVD<MatrixType>::sort()
+{
+  int mu = m_matU.rows();
+  int mv = m_matV.rows();
+  int n  = m_matU.cols();
+
+  for (int i=0; i<n; ++i)
+  {
+    int  k = i;
+    Scalar p = m_sigma.coeff(i);
+
+    for (int j=i+1; j<n; ++j)
+    {
+      if (m_sigma.coeff(j) > p)
+      {
+        k = j;
+        p = m_sigma.coeff(j);
+      }
+    }
+    if (k != i)
+    {
+      m_sigma.coeffRef(k) = m_sigma.coeff(i);  // i.e.
+      m_sigma.coeffRef(i) = p;                 // swaps the i-th and the k-th elements
+
+      int j = mu;
+      for(int s=0; j!=0; ++s, --j)
+        std::swap(m_matU.coeffRef(s,i), m_matU.coeffRef(s,k));
+
+      j = mv;
+      for (int s=0; j!=0; ++s, --j)
+        std::swap(m_matV.coeffRef(s,i), m_matV.coeffRef(s,k));
+    }
+  }
+  return *this;
+}
+
+/** \returns the solution of \f$ A x = b \f$ using the current SVD decomposition of A.
+  * The parts of the solution corresponding to zero singular values are ignored.
+  *
+  * \sa MatrixBase::svd(), LU::solve(), LLT::solve()
+  */
+template<typename MatrixType>
+template<typename OtherDerived, typename ResultType>
+bool SVD<MatrixType>::solve(const MatrixBase<OtherDerived> &b, ResultType* result) const
+{
+  const int rows = m_matU.rows();
+  ei_assert(b.rows() == rows);
+
+  Scalar maxVal = m_sigma.cwise().abs().maxCoeff();
+  for (int j=0; j<b.cols(); ++j)
+  {
+    Matrix<Scalar,MatrixUType::RowsAtCompileTime,1> aux = m_matU.transpose() * b.col(j);
+
+    for (int i = 0; i <m_matU.cols(); ++i)
+    {
+      Scalar si = m_sigma.coeff(i);
+      if (ei_isMuchSmallerThan(ei_abs(si),maxVal))
+        aux.coeffRef(i) = 0;
+      else
+        aux.coeffRef(i) /= si;
+    }
+
+    result->col(j) = m_matV * aux;
+  }
+  return true;
+}
+
+/** Computes the polar decomposition of the matrix, as a product unitary x positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * Only for square matrices.
+  *
+  * \sa computePositiveUnitary(), computeRotationScaling()
+  */
+template<typename MatrixType>
+template<typename UnitaryType, typename PositiveType>
+void SVD<MatrixType>::computeUnitaryPositive(UnitaryType *unitary,
+                                             PositiveType *positive) const
+{
+  ei_assert(m_matU.cols() == m_matV.cols() && "Polar decomposition is only for square matrices");
+  if(unitary) *unitary = m_matU * m_matV.adjoint();
+  if(positive) *positive = m_matV * m_sigma.asDiagonal() * m_matV.adjoint();
+}
+
+/** Computes the polar decomposition of the matrix, as a product positive x unitary.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * Only for square matrices.
+  *
+  * \sa computeUnitaryPositive(), computeRotationScaling()
+  */
+template<typename MatrixType>
+template<typename UnitaryType, typename PositiveType>
+void SVD<MatrixType>::computePositiveUnitary(UnitaryType *positive,
+                                             PositiveType *unitary) const
+{
+  ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
+  if(unitary) *unitary = m_matU * m_matV.adjoint();
+  if(positive) *positive = m_matU * m_sigma.asDiagonal() * m_matU.adjoint();
+}
+
+/** decomposes the matrix as a product rotation x scaling, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * This method requires the Geometry module.
+  *
+  * \sa computeScalingRotation(), computeUnitaryPositive()
+  */
+template<typename MatrixType>
+template<typename RotationType, typename ScalingType>
+void SVD<MatrixType>::computeRotationScaling(RotationType *rotation, ScalingType *scaling) const
+{
+  ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
+  Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1
+  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);
+  sv.coeffRef(0) *= x;
+  if(scaling) scaling->lazyAssign(m_matV * sv.asDiagonal() * m_matV.adjoint());
+  if(rotation)
+  {
+    MatrixType m(m_matU);
+    m.col(0) /= x;
+    rotation->lazyAssign(m * m_matV.adjoint());
+  }
+}
+
+/** decomposes the matrix as a product scaling x rotation, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  * This method requires the Geometry module.
+  *
+  * \sa computeRotationScaling(), computeUnitaryPositive()
+  */
+template<typename MatrixType>
+template<typename ScalingType, typename RotationType>
+void SVD<MatrixType>::computeScalingRotation(ScalingType *scaling, RotationType *rotation) const
+{
+  ei_assert(m_matU.rows() == m_matV.rows() && "Polar decomposition is only for square matrices");
+  Scalar x = (m_matU * m_matV.adjoint()).determinant(); // so x has absolute value 1
+  Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> sv(m_sigma);
+  sv.coeffRef(0) *= x;
+  if(scaling) scaling->lazyAssign(m_matU * sv.asDiagonal() * m_matU.adjoint());
+  if(rotation)
+  {
+    MatrixType m(m_matU);
+    m.col(0) /= x;
+    rotation->lazyAssign(m * m_matV.adjoint());
+  }
+}
+
+
+/** \svd_module
+  * \returns the SVD decomposition of \c *this
+  */
+template<typename Derived>
+inline SVD<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::svd() const
+{
+  return SVD<PlainObject>(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_SVD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/TriangularSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/TriangularSolver.h
new file mode 100644
index 0000000..ebbeb3b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/TriangularSolver.h
@@ -0,0 +1,42 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIANGULAR_SOLVER2_H
+#define EIGEN_TRIANGULAR_SOLVER2_H
+
+namespace Eigen { 
+
+const unsigned int UnitDiagBit = UnitDiag;
+const unsigned int SelfAdjointBit = SelfAdjoint;
+const unsigned int UpperTriangularBit = Upper;
+const unsigned int LowerTriangularBit = Lower;
+
+const unsigned int UpperTriangular = Upper;
+const unsigned int LowerTriangular = Lower;
+const unsigned int UnitUpperTriangular = UnitUpper;
+const unsigned int UnitLowerTriangular = UnitLower;
+
+template<typename ExpressionType, unsigned int Added, unsigned int Removed>
+template<typename OtherDerived>
+typename ExpressionType::PlainObject
+Flagged<ExpressionType,Added,Removed>::solveTriangular(const MatrixBase<OtherDerived>& other) const
+{
+  return m_matrix.template triangularView<Added>().solve(other.derived());
+}
+
+template<typename ExpressionType, unsigned int Added, unsigned int Removed>
+template<typename OtherDerived>
+void Flagged<ExpressionType,Added,Removed>::solveTriangularInPlace(const MatrixBase<OtherDerived>& other) const
+{
+  m_matrix.template triangularView<Added>().solveInPlace(other.derived());
+}
+
+} // end namespace Eigen
+    
+#endif // EIGEN_TRIANGULAR_SOLVER2_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/VectorBlock.h b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/VectorBlock.h
new file mode 100644
index 0000000..71a8080
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigen2Support/VectorBlock.h
@@ -0,0 +1,94 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN2_VECTORBLOCK_H
+#define EIGEN2_VECTORBLOCK_H
+
+namespace Eigen { 
+
+/** \deprecated use DenseMase::head(Index) */
+template<typename Derived>
+inline VectorBlock<Derived>
+MatrixBase<Derived>::start(Index size)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<Derived>(derived(), 0, size);
+}
+
+/** \deprecated use DenseMase::head(Index) */
+template<typename Derived>
+inline const VectorBlock<const Derived>
+MatrixBase<Derived>::start(Index size) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<const Derived>(derived(), 0, size);
+}
+
+/** \deprecated use DenseMase::tail(Index) */
+template<typename Derived>
+inline VectorBlock<Derived>
+MatrixBase<Derived>::end(Index size)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<Derived>(derived(), this->size() - size, size);
+}
+
+/** \deprecated use DenseMase::tail(Index) */
+template<typename Derived>
+inline const VectorBlock<const Derived>
+MatrixBase<Derived>::end(Index size) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<const Derived>(derived(), this->size() - size, size);
+}
+
+/** \deprecated use DenseMase::head() */
+template<typename Derived>
+template<int Size>
+inline VectorBlock<Derived,Size>
+MatrixBase<Derived>::start()
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<Derived,Size>(derived(), 0);
+}
+
+/** \deprecated use DenseMase::head() */
+template<typename Derived>
+template<int Size>
+inline const VectorBlock<const Derived,Size>
+MatrixBase<Derived>::start() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<const Derived,Size>(derived(), 0);
+}
+
+/** \deprecated use DenseMase::tail() */
+template<typename Derived>
+template<int Size>
+inline VectorBlock<Derived,Size>
+MatrixBase<Derived>::end()
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<Derived, Size>(derived(), size() - Size);
+}
+
+/** \deprecated use DenseMase::tail() */
+template<typename Derived>
+template<int Size>
+inline const VectorBlock<const Derived,Size>
+MatrixBase<Derived>::end() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return VectorBlock<const Derived, Size>(derived(), size() - Size);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN2_VECTORBLOCK_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/CMakeLists.txt
new file mode 100644
index 0000000..193e026
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_EIGENVALUES_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_EIGENVALUES_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Eigenvalues COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexEigenSolver.h
new file mode 100644
index 0000000..bd41bf7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexEigenSolver.h
@@ -0,0 +1,333 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Claire Maurice
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010,2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPLEX_EIGEN_SOLVER_H
+#define EIGEN_COMPLEX_EIGEN_SOLVER_H
+
+#include "./ComplexSchur.h"
+
+namespace Eigen { 
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class ComplexEigenSolver
+  *
+  * \brief Computes eigenvalues and eigenvectors of general complex matrices
+  *
+  * \tparam _MatrixType the type of the matrix of which we are
+  * computing the eigendecomposition; this is expected to be an
+  * instantiation of the Matrix class template.
+  *
+  * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
+  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v
+  * \f$.  If \f$ D \f$ is a diagonal matrix with the eigenvalues on
+  * the diagonal, and \f$ V \f$ is a matrix with the eigenvectors as
+  * its columns, then \f$ A V = V D \f$. The matrix \f$ V \f$ is
+  * almost always invertible, in which case we have \f$ A = V D V^{-1}
+  * \f$. This is called the eigendecomposition.
+  *
+  * The main function in this class is compute(), which computes the
+  * eigenvalues and eigenvectors of a given function. The
+  * documentation for that function contains an example showing the
+  * main features of the class.
+  *
+  * \sa class EigenSolver, class SelfAdjointEigenSolver
+  */
+template<typename _MatrixType> class ComplexEigenSolver
+{
+  public:
+
+    /** \brief Synonym for the template parameter \p _MatrixType. */
+    typedef _MatrixType MatrixType;
+
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+
+    /** \brief Scalar type for matrices of type #MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Complex scalar type for #MatrixType.
+      *
+      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+      * \c float or \c double) and just \c Scalar if #Scalar is
+      * complex.
+      */
+    typedef std::complex<RealScalar> ComplexScalar;
+
+    /** \brief Type for vector of eigenvalues as returned by eigenvalues().
+      *
+      * This is a column vector with entries of type #ComplexScalar.
+      * The length of the vector is the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options&(~RowMajor), MaxColsAtCompileTime, 1> EigenvalueType;
+
+    /** \brief Type for matrix of eigenvectors as returned by eigenvectors().
+      *
+      * This is a square matrix with entries of type #ComplexScalar.
+      * The size is the same as the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorType;
+
+    /** \brief Default constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute().
+      */
+    ComplexEigenSolver()
+            : m_eivec(),
+              m_eivalues(),
+              m_schur(),
+              m_isInitialized(false),
+              m_eigenvectorsOk(false),
+              m_matX()
+    {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa ComplexEigenSolver()
+      */
+    ComplexEigenSolver(Index size)
+            : m_eivec(size, size),
+              m_eivalues(size),
+              m_schur(size),
+              m_isInitialized(false),
+              m_eigenvectorsOk(false),
+              m_matX(size, size)
+    {}
+
+    /** \brief Constructor; computes eigendecomposition of given matrix.
+      *
+      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are
+      *    computed.
+      *
+      * This constructor calls compute() to compute the eigendecomposition.
+      */
+      ComplexEigenSolver(const MatrixType& matrix, bool computeEigenvectors = true)
+            : m_eivec(matrix.rows(),matrix.cols()),
+              m_eivalues(matrix.cols()),
+              m_schur(matrix.rows()),
+              m_isInitialized(false),
+              m_eigenvectorsOk(false),
+              m_matX(matrix.rows(),matrix.cols())
+    {
+      compute(matrix, computeEigenvectors);
+    }
+
+    /** \brief Returns the eigenvectors of given matrix.
+      *
+      * \returns  A const reference to the matrix whose columns are the eigenvectors.
+      *
+      * \pre Either the constructor
+      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
+      * function compute(const MatrixType& matrix, bool) has been called before
+      * to compute the eigendecomposition of a matrix, and
+      * \p computeEigenvectors was set to true (the default).
+      *
+      * This function returns a matrix whose columns are the eigenvectors. Column
+      * \f$ k \f$ is an eigenvector corresponding to eigenvalue number \f$ k
+      * \f$ as returned by eigenvalues().  The eigenvectors are normalized to
+      * have (Euclidean) norm equal to one. The matrix returned by this
+      * function is the matrix \f$ V \f$ in the eigendecomposition \f$ A = V D
+      * V^{-1} \f$, if it exists.
+      *
+      * Example: \include ComplexEigenSolver_eigenvectors.cpp
+      * Output: \verbinclude ComplexEigenSolver_eigenvectors.out
+      */
+    const EigenvectorType& eigenvectors() const
+    {
+      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+      return m_eivec;
+    }
+
+    /** \brief Returns the eigenvalues of given matrix.
+      *
+      * \returns A const reference to the column vector containing the eigenvalues.
+      *
+      * \pre Either the constructor
+      * ComplexEigenSolver(const MatrixType& matrix, bool) or the member
+      * function compute(const MatrixType& matrix, bool) has been called before
+      * to compute the eigendecomposition of a matrix.
+      *
+      * This function returns a column vector containing the
+      * eigenvalues. Eigenvalues are repeated according to their
+      * algebraic multiplicity, so there are as many eigenvalues as
+      * rows in the matrix. The eigenvalues are not sorted in any particular
+      * order.
+      *
+      * Example: \include ComplexEigenSolver_eigenvalues.cpp
+      * Output: \verbinclude ComplexEigenSolver_eigenvalues.out
+      */
+    const EigenvalueType& eigenvalues() const
+    {
+      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+      return m_eivalues;
+    }
+
+    /** \brief Computes eigendecomposition of given matrix.
+      *
+      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are
+      *    computed.
+      * \returns    Reference to \c *this
+      *
+      * This function computes the eigenvalues of the complex matrix \p matrix.
+      * The eigenvalues() function can be used to retrieve them.  If
+      * \p computeEigenvectors is true, then the eigenvectors are also computed
+      * and can be retrieved by calling eigenvectors().
+      *
+      * The matrix is first reduced to Schur form using the
+      * ComplexSchur class. The Schur decomposition is then used to
+      * compute the eigenvalues and eigenvectors.
+      *
+      * The cost of the computation is dominated by the cost of the
+      * Schur decomposition, which is \f$ O(n^3) \f$ where \f$ n \f$
+      * is the size of the matrix.
+      *
+      * Example: \include ComplexEigenSolver_compute.cpp
+      * Output: \verbinclude ComplexEigenSolver_compute.out
+      */
+    ComplexEigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true);
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "ComplexEigenSolver is not initialized.");
+      return m_schur.info();
+    }
+
+    /** \brief Sets the maximum number of iterations allowed. */
+    ComplexEigenSolver& setMaxIterations(Index maxIters)
+    {
+      m_schur.setMaxIterations(maxIters);
+      return *this;
+    }
+
+    /** \brief Returns the maximum number of iterations. */
+    Index getMaxIterations()
+    {
+      return m_schur.getMaxIterations();
+    }
+
+  protected:
+    EigenvectorType m_eivec;
+    EigenvalueType m_eivalues;
+    ComplexSchur<MatrixType> m_schur;
+    bool m_isInitialized;
+    bool m_eigenvectorsOk;
+    EigenvectorType m_matX;
+
+  private:
+    void doComputeEigenvectors(const RealScalar& matrixnorm);
+    void sortEigenvalues(bool computeEigenvectors);
+};
+
+
+template<typename MatrixType>
+ComplexEigenSolver<MatrixType>& 
+ComplexEigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors)
+{
+  // this code is inspired from Jampack
+  eigen_assert(matrix.cols() == matrix.rows());
+
+  // Do a complex Schur decomposition, A = U T U^*
+  // The eigenvalues are on the diagonal of T.
+  m_schur.compute(matrix, computeEigenvectors);
+
+  if(m_schur.info() == Success)
+  {
+    m_eivalues = m_schur.matrixT().diagonal();
+    if(computeEigenvectors)
+      doComputeEigenvectors(matrix.norm());
+    sortEigenvalues(computeEigenvectors);
+  }
+
+  m_isInitialized = true;
+  m_eigenvectorsOk = computeEigenvectors;
+  return *this;
+}
+
+
+template<typename MatrixType>
+void ComplexEigenSolver<MatrixType>::doComputeEigenvectors(const RealScalar& matrixnorm)
+{
+  const Index n = m_eivalues.size();
+
+  // Compute X such that T = X D X^(-1), where D is the diagonal of T.
+  // The matrix X is unit triangular.
+  m_matX = EigenvectorType::Zero(n, n);
+  for(Index k=n-1 ; k>=0 ; k--)
+  {
+    m_matX.coeffRef(k,k) = ComplexScalar(1.0,0.0);
+    // Compute X(i,k) using the (i,k) entry of the equation X T = D X
+    for(Index i=k-1 ; i>=0 ; i--)
+    {
+      m_matX.coeffRef(i,k) = -m_schur.matrixT().coeff(i,k);
+      if(k-i-1>0)
+        m_matX.coeffRef(i,k) -= (m_schur.matrixT().row(i).segment(i+1,k-i-1) * m_matX.col(k).segment(i+1,k-i-1)).value();
+      ComplexScalar z = m_schur.matrixT().coeff(i,i) - m_schur.matrixT().coeff(k,k);
+      if(z==ComplexScalar(0))
+      {
+        // If the i-th and k-th eigenvalue are equal, then z equals 0.
+        // Use a small value instead, to prevent division by zero.
+        internal::real_ref(z) = NumTraits<RealScalar>::epsilon() * matrixnorm;
+      }
+      m_matX.coeffRef(i,k) = m_matX.coeff(i,k) / z;
+    }
+  }
+
+  // Compute V as V = U X; now A = U T U^* = U X D X^(-1) U^* = V D V^(-1)
+  m_eivec.noalias() = m_schur.matrixU() * m_matX;
+  // .. and normalize the eigenvectors
+  for(Index k=0 ; k<n ; k++)
+  {
+    m_eivec.col(k).normalize();
+  }
+}
+
+
+template<typename MatrixType>
+void ComplexEigenSolver<MatrixType>::sortEigenvalues(bool computeEigenvectors)
+{
+  const Index n =  m_eivalues.size();
+  for (Index i=0; i<n; i++)
+  {
+    Index k;
+    m_eivalues.cwiseAbs().tail(n-i).minCoeff(&k);
+    if (k != 0)
+    {
+      k += i;
+      std::swap(m_eivalues[k],m_eivalues[i]);
+      if(computeEigenvectors)
+	m_eivec.col(i).swap(m_eivec.col(k));
+    }
+  }
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_EIGEN_SOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur.h
new file mode 100644
index 0000000..62b57ff
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur.h
@@ -0,0 +1,456 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Claire Maurice
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010,2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPLEX_SCHUR_H
+#define EIGEN_COMPLEX_SCHUR_H
+
+#include "./HessenbergDecomposition.h"
+
+namespace Eigen { 
+
+namespace internal {
+template<typename MatrixType, bool IsComplex> struct complex_schur_reduce_to_hessenberg;
+}
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class ComplexSchur
+  *
+  * \brief Performs a complex Schur decomposition of a real or complex square matrix
+  *
+  * \tparam _MatrixType the type of the matrix of which we are
+  * computing the Schur decomposition; this is expected to be an
+  * instantiation of the Matrix class template.
+  *
+  * Given a real or complex square matrix A, this class computes the
+  * Schur decomposition: \f$ A = U T U^*\f$ where U is a unitary
+  * complex matrix, and T is a complex upper triangular matrix.  The
+  * diagonal of the matrix T corresponds to the eigenvalues of the
+  * matrix A.
+  *
+  * Call the function compute() to compute the Schur decomposition of
+  * a given matrix. Alternatively, you can use the 
+  * ComplexSchur(const MatrixType&, bool) constructor which computes
+  * the Schur decomposition at construction time. Once the
+  * decomposition is computed, you can use the matrixU() and matrixT()
+  * functions to retrieve the matrices U and V in the decomposition.
+  *
+  * \note This code is inspired from Jampack
+  *
+  * \sa class RealSchur, class EigenSolver, class ComplexEigenSolver
+  */
+template<typename _MatrixType> class ComplexSchur
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+
+    /** \brief Scalar type for matrices of type \p _MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Complex scalar type for \p _MatrixType. 
+      *
+      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+      * \c float or \c double) and just \c Scalar if #Scalar is
+      * complex.
+      */
+    typedef std::complex<RealScalar> ComplexScalar;
+
+    /** \brief Type for the matrices in the Schur decomposition.
+      *
+      * This is a square matrix with entries of type #ComplexScalar. 
+      * The size is the same as the size of \p _MatrixType.
+      */
+    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> ComplexMatrixType;
+
+    /** \brief Default constructor.
+      *
+      * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
+      *
+      * The default constructor is useful in cases in which the user
+      * intends to perform decompositions via compute().  The \p size
+      * parameter is only used as a hint. It is not an error to give a
+      * wrong \p size, but it may impair performance.
+      *
+      * \sa compute() for an example.
+      */
+    ComplexSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)
+      : m_matT(size,size),
+        m_matU(size,size),
+        m_hess(size),
+        m_isInitialized(false),
+        m_matUisUptodate(false),
+        m_maxIters(-1)
+    {}
+
+    /** \brief Constructor; computes Schur decomposition of given matrix. 
+      * 
+      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+      *
+      * This constructor calls compute() to compute the Schur decomposition.
+      *
+      * \sa matrixT() and matrixU() for examples.
+      */
+    ComplexSchur(const MatrixType& matrix, bool computeU = true)
+      : m_matT(matrix.rows(),matrix.cols()),
+        m_matU(matrix.rows(),matrix.cols()),
+        m_hess(matrix.rows()),
+        m_isInitialized(false),
+        m_matUisUptodate(false),
+        m_maxIters(-1)
+    {
+      compute(matrix, computeU);
+    }
+
+    /** \brief Returns the unitary matrix in the Schur decomposition. 
+      *
+      * \returns A const reference to the matrix U.
+      *
+      * It is assumed that either the constructor
+      * ComplexSchur(const MatrixType& matrix, bool computeU) or the
+      * member function compute(const MatrixType& matrix, bool computeU)
+      * has been called before to compute the Schur decomposition of a
+      * matrix, and that \p computeU was set to true (the default
+      * value).
+      *
+      * Example: \include ComplexSchur_matrixU.cpp
+      * Output: \verbinclude ComplexSchur_matrixU.out
+      */
+    const ComplexMatrixType& matrixU() const
+    {
+      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+      eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the ComplexSchur decomposition.");
+      return m_matU;
+    }
+
+    /** \brief Returns the triangular matrix in the Schur decomposition. 
+      *
+      * \returns A const reference to the matrix T.
+      *
+      * It is assumed that either the constructor
+      * ComplexSchur(const MatrixType& matrix, bool computeU) or the
+      * member function compute(const MatrixType& matrix, bool computeU)
+      * has been called before to compute the Schur decomposition of a
+      * matrix.
+      *
+      * Note that this function returns a plain square matrix. If you want to reference
+      * only the upper triangular part, use:
+      * \code schur.matrixT().triangularView<Upper>() \endcode 
+      *
+      * Example: \include ComplexSchur_matrixT.cpp
+      * Output: \verbinclude ComplexSchur_matrixT.out
+      */
+    const ComplexMatrixType& matrixT() const
+    {
+      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+      return m_matT;
+    }
+
+    /** \brief Computes Schur decomposition of given matrix. 
+      * 
+      * \param[in]  matrix  Square matrix whose Schur decomposition is to be computed.
+      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+
+      * \returns    Reference to \c *this
+      *
+      * The Schur decomposition is computed by first reducing the
+      * matrix to Hessenberg form using the class
+      * HessenbergDecomposition. The Hessenberg matrix is then reduced
+      * to triangular form by performing QR iterations with a single
+      * shift. The cost of computing the Schur decomposition depends
+      * on the number of iterations; as a rough guide, it may be taken
+      * on the number of iterations; as a rough guide, it may be taken
+      * to be \f$25n^3\f$ complex flops, or \f$10n^3\f$ complex flops
+      * if \a computeU is false.
+      *
+      * Example: \include ComplexSchur_compute.cpp
+      * Output: \verbinclude ComplexSchur_compute.out
+      *
+      * \sa compute(const MatrixType&, bool, Index)
+      */
+    ComplexSchur& compute(const MatrixType& matrix, bool computeU = true);
+    
+    /** \brief Compute Schur decomposition from a given Hessenberg matrix
+     *  \param[in] matrixH Matrix in Hessenberg form H
+     *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
+     *  \param computeU Computes the matriX U of the Schur vectors
+     * \return Reference to \c *this
+     * 
+     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
+     *  using either the class HessenbergDecomposition or another mean. 
+     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
+     *  When computeU is true, this routine computes the matrix U such that 
+     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
+     * 
+     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
+     * is not available, the user should give an identity matrix (Q.setIdentity())
+     * 
+     * \sa compute(const MatrixType&, bool)
+     */
+    template<typename HessMatrixType, typename OrthMatrixType>
+    ComplexSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU=true);
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "ComplexSchur is not initialized.");
+      return m_info;
+    }
+
+    /** \brief Sets the maximum number of iterations allowed. 
+      *
+      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
+      * of the matrix.
+      */
+    ComplexSchur& setMaxIterations(Index maxIters)
+    {
+      m_maxIters = maxIters;
+      return *this;
+    }
+
+    /** \brief Returns the maximum number of iterations. */
+    Index getMaxIterations()
+    {
+      return m_maxIters;
+    }
+
+    /** \brief Maximum number of iterations per row.
+      *
+      * If not otherwise specified, the maximum number of iterations is this number times the size of the
+      * matrix. It is currently set to 30.
+      */
+    static const int m_maxIterationsPerRow = 30;
+
+  protected:
+    ComplexMatrixType m_matT, m_matU;
+    HessenbergDecomposition<MatrixType> m_hess;
+    ComputationInfo m_info;
+    bool m_isInitialized;
+    bool m_matUisUptodate;
+    Index m_maxIters;
+
+  private:  
+    bool subdiagonalEntryIsNeglegible(Index i);
+    ComplexScalar computeShift(Index iu, Index iter);
+    void reduceToTriangularForm(bool computeU);
+    friend struct internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>;
+};
+
+/** If m_matT(i+1,i) is neglegible in floating point arithmetic
+  * compared to m_matT(i,i) and m_matT(j,j), then set it to zero and
+  * return true, else return false. */
+template<typename MatrixType>
+inline bool ComplexSchur<MatrixType>::subdiagonalEntryIsNeglegible(Index i)
+{
+  RealScalar d = internal::norm1(m_matT.coeff(i,i)) + internal::norm1(m_matT.coeff(i+1,i+1));
+  RealScalar sd = internal::norm1(m_matT.coeff(i+1,i));
+  if (internal::isMuchSmallerThan(sd, d, NumTraits<RealScalar>::epsilon()))
+  {
+    m_matT.coeffRef(i+1,i) = ComplexScalar(0);
+    return true;
+  }
+  return false;
+}
+
+
+/** Compute the shift in the current QR iteration. */
+template<typename MatrixType>
+typename ComplexSchur<MatrixType>::ComplexScalar ComplexSchur<MatrixType>::computeShift(Index iu, Index iter)
+{
+  using std::abs;
+  if (iter == 10 || iter == 20) 
+  {
+    // exceptional shift, taken from http://www.netlib.org/eispack/comqr.f
+    return abs(internal::real(m_matT.coeff(iu,iu-1))) + abs(internal::real(m_matT.coeff(iu-1,iu-2)));
+  }
+
+  // compute the shift as one of the eigenvalues of t, the 2x2
+  // diagonal block on the bottom of the active submatrix
+  Matrix<ComplexScalar,2,2> t = m_matT.template block<2,2>(iu-1,iu-1);
+  RealScalar normt = t.cwiseAbs().sum();
+  t /= normt;     // the normalization by sf is to avoid under/overflow
+
+  ComplexScalar b = t.coeff(0,1) * t.coeff(1,0);
+  ComplexScalar c = t.coeff(0,0) - t.coeff(1,1);
+  ComplexScalar disc = sqrt(c*c + RealScalar(4)*b);
+  ComplexScalar det = t.coeff(0,0) * t.coeff(1,1) - b;
+  ComplexScalar trace = t.coeff(0,0) + t.coeff(1,1);
+  ComplexScalar eival1 = (trace + disc) / RealScalar(2);
+  ComplexScalar eival2 = (trace - disc) / RealScalar(2);
+
+  if(internal::norm1(eival1) > internal::norm1(eival2))
+    eival2 = det / eival1;
+  else
+    eival1 = det / eival2;
+
+  // choose the eigenvalue closest to the bottom entry of the diagonal
+  if(internal::norm1(eival1-t.coeff(1,1)) < internal::norm1(eival2-t.coeff(1,1)))
+    return normt * eival1;
+  else
+    return normt * eival2;
+}
+
+
+template<typename MatrixType>
+ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::compute(const MatrixType& matrix, bool computeU)
+{
+  m_matUisUptodate = false;
+  eigen_assert(matrix.cols() == matrix.rows());
+
+  if(matrix.cols() == 1)
+  {
+    m_matT = matrix.template cast<ComplexScalar>();
+    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1);
+    m_info = Success;
+    m_isInitialized = true;
+    m_matUisUptodate = computeU;
+    return *this;
+  }
+
+  internal::complex_schur_reduce_to_hessenberg<MatrixType, NumTraits<Scalar>::IsComplex>::run(*this, matrix, computeU);
+  computeFromHessenberg(m_matT, m_matU, computeU);
+  return *this;
+}
+
+template<typename MatrixType>
+template<typename HessMatrixType, typename OrthMatrixType>
+ComplexSchur<MatrixType>& ComplexSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ, bool computeU)
+{
+  m_matT = matrixH;
+  if(computeU)
+    m_matU = matrixQ;
+  reduceToTriangularForm(computeU);
+  return *this;
+}
+namespace internal {
+
+/* Reduce given matrix to Hessenberg form */
+template<typename MatrixType, bool IsComplex>
+struct complex_schur_reduce_to_hessenberg
+{
+  // this is the implementation for the case IsComplex = true
+  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)
+  {
+    _this.m_hess.compute(matrix);
+    _this.m_matT = _this.m_hess.matrixH();
+    if(computeU)  _this.m_matU = _this.m_hess.matrixQ();
+  }
+};
+
+template<typename MatrixType>
+struct complex_schur_reduce_to_hessenberg<MatrixType, false>
+{
+  static void run(ComplexSchur<MatrixType>& _this, const MatrixType& matrix, bool computeU)
+  {
+    typedef typename ComplexSchur<MatrixType>::ComplexScalar ComplexScalar;
+
+    // Note: m_hess is over RealScalar; m_matT and m_matU is over ComplexScalar
+    _this.m_hess.compute(matrix);
+    _this.m_matT = _this.m_hess.matrixH().template cast<ComplexScalar>();
+    if(computeU)  
+    {
+      // This may cause an allocation which seems to be avoidable
+      MatrixType Q = _this.m_hess.matrixQ(); 
+      _this.m_matU = Q.template cast<ComplexScalar>();
+    }
+  }
+};
+
+} // end namespace internal
+
+// Reduce the Hessenberg matrix m_matT to triangular form by QR iteration.
+template<typename MatrixType>
+void ComplexSchur<MatrixType>::reduceToTriangularForm(bool computeU)
+{  
+  Index maxIters = m_maxIters;
+  if (maxIters == -1)
+    maxIters = m_maxIterationsPerRow * m_matT.rows();
+
+  // The matrix m_matT is divided in three parts. 
+  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. 
+  // Rows il,...,iu is the part we are working on (the active submatrix).
+  // Rows iu+1,...,end are already brought in triangular form.
+  Index iu = m_matT.cols() - 1;
+  Index il;
+  Index iter = 0; // number of iterations we are working on the (iu,iu) element
+  Index totalIter = 0; // number of iterations for whole matrix
+
+  while(true)
+  {
+    // find iu, the bottom row of the active submatrix
+    while(iu > 0)
+    {
+      if(!subdiagonalEntryIsNeglegible(iu-1)) break;
+      iter = 0;
+      --iu;
+    }
+
+    // if iu is zero then we are done; the whole matrix is triangularized
+    if(iu==0) break;
+
+    // if we spent too many iterations, we give up
+    iter++;
+    totalIter++;
+    if(totalIter > maxIters) break;
+
+    // find il, the top row of the active submatrix
+    il = iu-1;
+    while(il > 0 && !subdiagonalEntryIsNeglegible(il-1))
+    {
+      --il;
+    }
+
+    /* perform the QR step using Givens rotations. The first rotation
+       creates a bulge; the (il+2,il) element becomes nonzero. This
+       bulge is chased down to the bottom of the active submatrix. */
+
+    ComplexScalar shift = computeShift(iu, iter);
+    JacobiRotation<ComplexScalar> rot;
+    rot.makeGivens(m_matT.coeff(il,il) - shift, m_matT.coeff(il+1,il));
+    m_matT.rightCols(m_matT.cols()-il).applyOnTheLeft(il, il+1, rot.adjoint());
+    m_matT.topRows((std::min)(il+2,iu)+1).applyOnTheRight(il, il+1, rot);
+    if(computeU) m_matU.applyOnTheRight(il, il+1, rot);
+
+    for(Index i=il+1 ; i<iu ; i++)
+    {
+      rot.makeGivens(m_matT.coeffRef(i,i-1), m_matT.coeffRef(i+1,i-1), &m_matT.coeffRef(i,i-1));
+      m_matT.coeffRef(i+1,i-1) = ComplexScalar(0);
+      m_matT.rightCols(m_matT.cols()-i).applyOnTheLeft(i, i+1, rot.adjoint());
+      m_matT.topRows((std::min)(i+2,iu)+1).applyOnTheRight(i, i+1, rot);
+      if(computeU) m_matU.applyOnTheRight(i, i+1, rot);
+    }
+  }
+
+  if(totalIter <= maxIters)
+    m_info = Success;
+  else
+    m_info = NoConvergence;
+
+  m_isInitialized = true;
+  m_matUisUptodate = computeU;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_SCHUR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur_MKL.h
new file mode 100644
index 0000000..91496ae
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/ComplexSchur_MKL.h
@@ -0,0 +1,94 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Complex Schur needed to complex unsymmetrical eigenvalues/eigenvectors.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_COMPLEX_SCHUR_MKL_H
+#define EIGEN_COMPLEX_SCHUR_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_SCHUR_COMPLEX(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \
+template<> inline \
+ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
+ComplexSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \
+{ \
+  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
+  typedef MatrixType::Scalar Scalar; \
+  typedef MatrixType::RealScalar RealScalar; \
+  typedef std::complex<RealScalar> ComplexScalar; \
+\
+  eigen_assert(matrix.cols() == matrix.rows()); \
+\
+  m_matUisUptodate = false; \
+  if(matrix.cols() == 1) \
+  { \
+    m_matT = matrix.cast<ComplexScalar>(); \
+    if(computeU)  m_matU = ComplexMatrixType::Identity(1,1); \
+      m_info = Success; \
+      m_isInitialized = true; \
+      m_matUisUptodate = computeU; \
+      return *this; \
+  } \
+  lapack_int n = matrix.cols(), sdim, info; \
+  lapack_int lda = matrix.outerStride(); \
+  lapack_int matrix_order = MKLCOLROW; \
+  char jobvs, sort='N'; \
+  LAPACK_##MKLPREFIX_U##_SELECT1 select = 0; \
+  jobvs = (computeU) ? 'V' : 'N'; \
+  m_matU.resize(n, n); \
+  lapack_int ldvs  = m_matU.outerStride(); \
+  m_matT = matrix; \
+  Matrix<EIGTYPE, Dynamic, Dynamic> w; \
+  w.resize(n, 1);\
+  info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)w.data(), (MKLTYPE*)m_matU.data(), ldvs ); \
+  if(info == 0) \
+    m_info = Success; \
+  else \
+    m_info = NoConvergence; \
+\
+  m_isInitialized = true; \
+  m_matUisUptodate = computeU; \
+  return *this; \
+\
+}
+
+EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8,  c, C, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SCHUR_COMPLEX(dcomplex, MKL_Complex16, z, Z, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_SCHUR_COMPLEX(scomplex, MKL_Complex8,  c, C, RowMajor, LAPACK_ROW_MAJOR)
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPLEX_SCHUR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/EigenSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/EigenSolver.h
new file mode 100644
index 0000000..f0d4e5a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/EigenSolver.h
@@ -0,0 +1,598 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010,2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_EIGENSOLVER_H
+#define EIGEN_EIGENSOLVER_H
+
+#include "./RealSchur.h"
+
+namespace Eigen { 
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class EigenSolver
+  *
+  * \brief Computes eigenvalues and eigenvectors of general matrices
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the
+  * eigendecomposition; this is expected to be an instantiation of the Matrix
+  * class template. Currently, only real matrices are supported.
+  *
+  * The eigenvalues and eigenvectors of a matrix \f$ A \f$ are scalars
+  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda v \f$.  If
+  * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
+  * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
+  * V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
+  * have \f$ A = V D V^{-1} \f$. This is called the eigendecomposition.
+  *
+  * The eigenvalues and eigenvectors of a matrix may be complex, even when the
+  * matrix is real. However, we can choose real matrices \f$ V \f$ and \f$ D
+  * \f$ satisfying \f$ A V = V D \f$, just like the eigendecomposition, if the
+  * matrix \f$ D \f$ is not required to be diagonal, but if it is allowed to
+  * have blocks of the form
+  * \f[ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f]
+  * (where \f$ u \f$ and \f$ v \f$ are real numbers) on the diagonal.  These
+  * blocks correspond to complex eigenvalue pairs \f$ u \pm iv \f$. We call
+  * this variant of the eigendecomposition the pseudo-eigendecomposition.
+  *
+  * Call the function compute() to compute the eigenvalues and eigenvectors of
+  * a given matrix. Alternatively, you can use the 
+  * EigenSolver(const MatrixType&, bool) constructor which computes the
+  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
+  * eigenvectors are computed, they can be retrieved with the eigenvalues() and
+  * eigenvectors() functions. The pseudoEigenvalueMatrix() and
+  * pseudoEigenvectors() methods allow the construction of the
+  * pseudo-eigendecomposition.
+  *
+  * The documentation for EigenSolver(const MatrixType&, bool) contains an
+  * example of the typical use of this class.
+  *
+  * \note The implementation is adapted from
+  * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
+  * Their code is based on EISPACK.
+  *
+  * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
+  */
+template<typename _MatrixType> class EigenSolver
+{
+  public:
+
+    /** \brief Synonym for the template parameter \p _MatrixType. */
+    typedef _MatrixType MatrixType;
+
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+
+    /** \brief Scalar type for matrices of type #MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Complex scalar type for #MatrixType. 
+      *
+      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+      * \c float or \c double) and just \c Scalar if #Scalar is
+      * complex.
+      */
+    typedef std::complex<RealScalar> ComplexScalar;
+
+    /** \brief Type for vector of eigenvalues as returned by eigenvalues(). 
+      *
+      * This is a column vector with entries of type #ComplexScalar.
+      * The length of the vector is the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+
+    /** \brief Type for matrix of eigenvectors as returned by eigenvectors(). 
+      *
+      * This is a square matrix with entries of type #ComplexScalar. 
+      * The size is the same as the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
+
+    /** \brief Default constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
+      *
+      * \sa compute() for an example.
+      */
+ EigenSolver() : m_eivec(), m_eivalues(), m_isInitialized(false), m_realSchur(), m_matT(), m_tmp() {}
+
+    /** \brief Default constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa EigenSolver()
+      */
+    EigenSolver(Index size)
+      : m_eivec(size, size),
+        m_eivalues(size),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_realSchur(size),
+        m_matT(size, size), 
+        m_tmp(size)
+    {}
+
+    /** \brief Constructor; computes eigendecomposition of given matrix. 
+      * 
+      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are
+      *    computed. 
+      *
+      * This constructor calls compute() to compute the eigenvalues
+      * and eigenvectors.
+      *
+      * Example: \include EigenSolver_EigenSolver_MatrixType.cpp
+      * Output: \verbinclude EigenSolver_EigenSolver_MatrixType.out
+      *
+      * \sa compute()
+      */
+    EigenSolver(const MatrixType& matrix, bool computeEigenvectors = true)
+      : m_eivec(matrix.rows(), matrix.cols()),
+        m_eivalues(matrix.cols()),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_realSchur(matrix.cols()),
+        m_matT(matrix.rows(), matrix.cols()), 
+        m_tmp(matrix.cols())
+    {
+      compute(matrix, computeEigenvectors);
+    }
+
+    /** \brief Returns the eigenvectors of given matrix. 
+      *
+      * \returns  %Matrix whose columns are the (possibly complex) eigenvectors.
+      *
+      * \pre Either the constructor 
+      * EigenSolver(const MatrixType&,bool) or the member function
+      * compute(const MatrixType&, bool) has been called before, and
+      * \p computeEigenvectors was set to true (the default).
+      *
+      * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
+      * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
+      * eigenvectors are normalized to have (Euclidean) norm equal to one. The
+      * matrix returned by this function is the matrix \f$ V \f$ in the
+      * eigendecomposition \f$ A = V D V^{-1} \f$, if it exists.
+      *
+      * Example: \include EigenSolver_eigenvectors.cpp
+      * Output: \verbinclude EigenSolver_eigenvectors.out
+      *
+      * \sa eigenvalues(), pseudoEigenvectors()
+      */
+    EigenvectorsType eigenvectors() const;
+
+    /** \brief Returns the pseudo-eigenvectors of given matrix. 
+      *
+      * \returns  Const reference to matrix whose columns are the pseudo-eigenvectors.
+      *
+      * \pre Either the constructor 
+      * EigenSolver(const MatrixType&,bool) or the member function
+      * compute(const MatrixType&, bool) has been called before, and
+      * \p computeEigenvectors was set to true (the default).
+      *
+      * The real matrix \f$ V \f$ returned by this function and the
+      * block-diagonal matrix \f$ D \f$ returned by pseudoEigenvalueMatrix()
+      * satisfy \f$ AV = VD \f$.
+      *
+      * Example: \include EigenSolver_pseudoEigenvectors.cpp
+      * Output: \verbinclude EigenSolver_pseudoEigenvectors.out
+      *
+      * \sa pseudoEigenvalueMatrix(), eigenvectors()
+      */
+    const MatrixType& pseudoEigenvectors() const
+    {
+      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+      return m_eivec;
+    }
+
+    /** \brief Returns the block-diagonal matrix in the pseudo-eigendecomposition.
+      *
+      * \returns  A block-diagonal matrix.
+      *
+      * \pre Either the constructor 
+      * EigenSolver(const MatrixType&,bool) or the member function
+      * compute(const MatrixType&, bool) has been called before.
+      *
+      * The matrix \f$ D \f$ returned by this function is real and
+      * block-diagonal. The blocks on the diagonal are either 1-by-1 or 2-by-2
+      * blocks of the form
+      * \f$ \begin{bmatrix} u & v \\ -v & u \end{bmatrix} \f$.
+      * These blocks are not sorted in any particular order.
+      * The matrix \f$ D \f$ and the matrix \f$ V \f$ returned by
+      * pseudoEigenvectors() satisfy \f$ AV = VD \f$.
+      *
+      * \sa pseudoEigenvectors() for an example, eigenvalues()
+      */
+    MatrixType pseudoEigenvalueMatrix() const;
+
+    /** \brief Returns the eigenvalues of given matrix. 
+      *
+      * \returns A const reference to the column vector containing the eigenvalues.
+      *
+      * \pre Either the constructor 
+      * EigenSolver(const MatrixType&,bool) or the member function
+      * compute(const MatrixType&, bool) has been called before.
+      *
+      * The eigenvalues are repeated according to their algebraic multiplicity,
+      * so there are as many eigenvalues as rows in the matrix. The eigenvalues 
+      * are not sorted in any particular order.
+      *
+      * Example: \include EigenSolver_eigenvalues.cpp
+      * Output: \verbinclude EigenSolver_eigenvalues.out
+      *
+      * \sa eigenvectors(), pseudoEigenvalueMatrix(),
+      *     MatrixBase::eigenvalues()
+      */
+    const EigenvalueType& eigenvalues() const
+    {
+      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+      return m_eivalues;
+    }
+
+    /** \brief Computes eigendecomposition of given matrix. 
+      * 
+      * \param[in]  matrix  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are
+      *    computed. 
+      * \returns    Reference to \c *this
+      *
+      * This function computes the eigenvalues of the real matrix \p matrix.
+      * The eigenvalues() function can be used to retrieve them.  If 
+      * \p computeEigenvectors is true, then the eigenvectors are also computed
+      * and can be retrieved by calling eigenvectors().
+      *
+      * The matrix is first reduced to real Schur form using the RealSchur
+      * class. The Schur decomposition is then used to compute the eigenvalues
+      * and eigenvectors.
+      *
+      * The cost of the computation is dominated by the cost of the
+      * Schur decomposition, which is very approximately \f$ 25n^3 \f$
+      * (where \f$ n \f$ is the size of the matrix) if \p computeEigenvectors 
+      * is true, and \f$ 10n^3 \f$ if \p computeEigenvectors is false.
+      *
+      * This method reuses of the allocated data in the EigenSolver object.
+      *
+      * Example: \include EigenSolver_compute.cpp
+      * Output: \verbinclude EigenSolver_compute.out
+      */
+    EigenSolver& compute(const MatrixType& matrix, bool computeEigenvectors = true);
+
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+      return m_realSchur.info();
+    }
+
+    /** \brief Sets the maximum number of iterations allowed. */
+    EigenSolver& setMaxIterations(Index maxIters)
+    {
+      m_realSchur.setMaxIterations(maxIters);
+      return *this;
+    }
+
+    /** \brief Returns the maximum number of iterations. */
+    Index getMaxIterations()
+    {
+      return m_realSchur.getMaxIterations();
+    }
+
+  private:
+    void doComputeEigenvectors();
+
+  protected:
+    MatrixType m_eivec;
+    EigenvalueType m_eivalues;
+    bool m_isInitialized;
+    bool m_eigenvectorsOk;
+    RealSchur<MatrixType> m_realSchur;
+    MatrixType m_matT;
+
+    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+    ColumnVectorType m_tmp;
+};
+
+template<typename MatrixType>
+MatrixType EigenSolver<MatrixType>::pseudoEigenvalueMatrix() const
+{
+  eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+  Index n = m_eivalues.rows();
+  MatrixType matD = MatrixType::Zero(n,n);
+  for (Index i=0; i<n; ++i)
+  {
+    if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(i)), internal::real(m_eivalues.coeff(i))))
+      matD.coeffRef(i,i) = internal::real(m_eivalues.coeff(i));
+    else
+    {
+      matD.template block<2,2>(i,i) <<  internal::real(m_eivalues.coeff(i)), internal::imag(m_eivalues.coeff(i)),
+                                       -internal::imag(m_eivalues.coeff(i)), internal::real(m_eivalues.coeff(i));
+      ++i;
+    }
+  }
+  return matD;
+}
+
+template<typename MatrixType>
+typename EigenSolver<MatrixType>::EigenvectorsType EigenSolver<MatrixType>::eigenvectors() const
+{
+  eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+  eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+  Index n = m_eivec.cols();
+  EigenvectorsType matV(n,n);
+  for (Index j=0; j<n; ++j)
+  {
+    if (internal::isMuchSmallerThan(internal::imag(m_eivalues.coeff(j)), internal::real(m_eivalues.coeff(j))) || j+1==n)
+    {
+      // we have a real eigen value
+      matV.col(j) = m_eivec.col(j).template cast<ComplexScalar>();
+      matV.col(j).normalize();
+    }
+    else
+    {
+      // we have a pair of complex eigen values
+      for (Index i=0; i<n; ++i)
+      {
+        matV.coeffRef(i,j)   = ComplexScalar(m_eivec.coeff(i,j),  m_eivec.coeff(i,j+1));
+        matV.coeffRef(i,j+1) = ComplexScalar(m_eivec.coeff(i,j), -m_eivec.coeff(i,j+1));
+      }
+      matV.col(j).normalize();
+      matV.col(j+1).normalize();
+      ++j;
+    }
+  }
+  return matV;
+}
+
+template<typename MatrixType>
+EigenSolver<MatrixType>& 
+EigenSolver<MatrixType>::compute(const MatrixType& matrix, bool computeEigenvectors)
+{
+  using std::sqrt;
+  using std::abs;
+  eigen_assert(matrix.cols() == matrix.rows());
+
+  // Reduce to real Schur form.
+  m_realSchur.compute(matrix, computeEigenvectors);
+
+  if (m_realSchur.info() == Success)
+  {
+    m_matT = m_realSchur.matrixT();
+    if (computeEigenvectors)
+      m_eivec = m_realSchur.matrixU();
+  
+    // Compute eigenvalues from matT
+    m_eivalues.resize(matrix.cols());
+    Index i = 0;
+    while (i < matrix.cols()) 
+    {
+      if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) 
+      {
+        m_eivalues.coeffRef(i) = m_matT.coeff(i, i);
+        ++i;
+      }
+      else
+      {
+        Scalar p = Scalar(0.5) * (m_matT.coeff(i, i) - m_matT.coeff(i+1, i+1));
+        Scalar z = sqrt(abs(p * p + m_matT.coeff(i+1, i) * m_matT.coeff(i, i+1)));
+        m_eivalues.coeffRef(i)   = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z);
+        m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z);
+        i += 2;
+      }
+    }
+    
+    // Compute eigenvectors.
+    if (computeEigenvectors)
+      doComputeEigenvectors();
+  }
+
+  m_isInitialized = true;
+  m_eigenvectorsOk = computeEigenvectors;
+
+  return *this;
+}
+
+// Complex scalar division.
+template<typename Scalar>
+std::complex<Scalar> cdiv(const Scalar& xr, const Scalar& xi, const Scalar& yr, const Scalar& yi)
+{
+  using std::abs;
+  Scalar r,d;
+  if (abs(yr) > abs(yi))
+  {
+      r = yi/yr;
+      d = yr + r*yi;
+      return std::complex<Scalar>((xr + r*xi)/d, (xi - r*xr)/d);
+  }
+  else
+  {
+      r = yr/yi;
+      d = yi + r*yr;
+      return std::complex<Scalar>((r*xr + xi)/d, (r*xi - xr)/d);
+  }
+}
+
+
+template<typename MatrixType>
+void EigenSolver<MatrixType>::doComputeEigenvectors()
+{
+  using std::abs;
+  const Index size = m_eivec.cols();
+  const Scalar eps = NumTraits<Scalar>::epsilon();
+
+  // inefficient! this is already computed in RealSchur
+  Scalar norm(0);
+  for (Index j = 0; j < size; ++j)
+  {
+    norm += m_matT.row(j).segment((std::max)(j-1,Index(0)), size-(std::max)(j-1,Index(0))).cwiseAbs().sum();
+  }
+  
+  // Backsubstitute to find vectors of upper triangular form
+  if (norm == 0.0)
+  {
+    return;
+  }
+
+  for (Index n = size-1; n >= 0; n--)
+  {
+    Scalar p = m_eivalues.coeff(n).real();
+    Scalar q = m_eivalues.coeff(n).imag();
+
+    // Scalar vector
+    if (q == Scalar(0))
+    {
+      Scalar lastr(0), lastw(0);
+      Index l = n;
+
+      m_matT.coeffRef(n,n) = 1.0;
+      for (Index i = n-1; i >= 0; i--)
+      {
+        Scalar w = m_matT.coeff(i,i) - p;
+        Scalar r = m_matT.row(i).segment(l,n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
+
+        if (m_eivalues.coeff(i).imag() < 0.0)
+        {
+          lastw = w;
+          lastr = r;
+        }
+        else
+        {
+          l = i;
+          if (m_eivalues.coeff(i).imag() == 0.0)
+          {
+            if (w != 0.0)
+              m_matT.coeffRef(i,n) = -r / w;
+            else
+              m_matT.coeffRef(i,n) = -r / (eps * norm);
+          }
+          else // Solve real equations
+          {
+            Scalar x = m_matT.coeff(i,i+1);
+            Scalar y = m_matT.coeff(i+1,i);
+            Scalar denom = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag();
+            Scalar t = (x * lastr - lastw * r) / denom;
+            m_matT.coeffRef(i,n) = t;
+            if (abs(x) > abs(lastw))
+              m_matT.coeffRef(i+1,n) = (-r - w * t) / x;
+            else
+              m_matT.coeffRef(i+1,n) = (-lastr - y * t) / lastw;
+          }
+
+          // Overflow control
+          Scalar t = abs(m_matT.coeff(i,n));
+          if ((eps * t) * t > Scalar(1))
+            m_matT.col(n).tail(size-i) /= t;
+        }
+      }
+    }
+    else if (q < Scalar(0) && n > 0) // Complex vector
+    {
+      Scalar lastra(0), lastsa(0), lastw(0);
+      Index l = n-1;
+
+      // Last vector component imaginary so matrix is triangular
+      if (abs(m_matT.coeff(n,n-1)) > abs(m_matT.coeff(n-1,n)))
+      {
+        m_matT.coeffRef(n-1,n-1) = q / m_matT.coeff(n,n-1);
+        m_matT.coeffRef(n-1,n) = -(m_matT.coeff(n,n) - p) / m_matT.coeff(n,n-1);
+      }
+      else
+      {
+        std::complex<Scalar> cc = cdiv<Scalar>(0.0,-m_matT.coeff(n-1,n),m_matT.coeff(n-1,n-1)-p,q);
+        m_matT.coeffRef(n-1,n-1) = internal::real(cc);
+        m_matT.coeffRef(n-1,n) = internal::imag(cc);
+      }
+      m_matT.coeffRef(n,n-1) = 0.0;
+      m_matT.coeffRef(n,n) = 1.0;
+      for (Index i = n-2; i >= 0; i--)
+      {
+        Scalar ra = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n-1).segment(l, n-l+1));
+        Scalar sa = m_matT.row(i).segment(l, n-l+1).dot(m_matT.col(n).segment(l, n-l+1));
+        Scalar w = m_matT.coeff(i,i) - p;
+
+        if (m_eivalues.coeff(i).imag() < 0.0)
+        {
+          lastw = w;
+          lastra = ra;
+          lastsa = sa;
+        }
+        else
+        {
+          l = i;
+          if (m_eivalues.coeff(i).imag() == RealScalar(0))
+          {
+            std::complex<Scalar> cc = cdiv(-ra,-sa,w,q);
+            m_matT.coeffRef(i,n-1) = internal::real(cc);
+            m_matT.coeffRef(i,n) = internal::imag(cc);
+          }
+          else
+          {
+            // Solve complex equations
+            Scalar x = m_matT.coeff(i,i+1);
+            Scalar y = m_matT.coeff(i+1,i);
+            Scalar vr = (m_eivalues.coeff(i).real() - p) * (m_eivalues.coeff(i).real() - p) + m_eivalues.coeff(i).imag() * m_eivalues.coeff(i).imag() - q * q;
+            Scalar vi = (m_eivalues.coeff(i).real() - p) * Scalar(2) * q;
+            if ((vr == 0.0) && (vi == 0.0))
+              vr = eps * norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(lastw));
+
+            std::complex<Scalar> cc = cdiv(x*lastra-lastw*ra+q*sa,x*lastsa-lastw*sa-q*ra,vr,vi);
+            m_matT.coeffRef(i,n-1) = internal::real(cc);
+            m_matT.coeffRef(i,n) = internal::imag(cc);
+            if (abs(x) > (abs(lastw) + abs(q)))
+            {
+              m_matT.coeffRef(i+1,n-1) = (-ra - w * m_matT.coeff(i,n-1) + q * m_matT.coeff(i,n)) / x;
+              m_matT.coeffRef(i+1,n) = (-sa - w * m_matT.coeff(i,n) - q * m_matT.coeff(i,n-1)) / x;
+            }
+            else
+            {
+              cc = cdiv(-lastra-y*m_matT.coeff(i,n-1),-lastsa-y*m_matT.coeff(i,n),lastw,q);
+              m_matT.coeffRef(i+1,n-1) = internal::real(cc);
+              m_matT.coeffRef(i+1,n) = internal::imag(cc);
+            }
+          }
+
+          // Overflow control
+          using std::max;
+          Scalar t = (max)(abs(m_matT.coeff(i,n-1)),abs(m_matT.coeff(i,n)));
+          if ((eps * t) * t > Scalar(1))
+            m_matT.block(i, n-1, size-i, 2) /= t;
+
+        }
+      }
+      
+      // We handled a pair of complex conjugate eigenvalues, so need to skip them both
+      n--;
+    }
+    else
+    {
+      eigen_assert(0 && "Internal bug in EigenSolver"); // this should not happen
+    }
+  }
+
+  // Back transformation to get eigenvectors of original matrix
+  for (Index j = size-1; j >= 0; j--)
+  {
+    m_tmp.noalias() = m_eivec.leftCols(j+1) * m_matT.col(j).segment(0, j+1);
+    m_eivec.col(j) = m_tmp;
+  }
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_EIGENSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
new file mode 100644
index 0000000..dc240e1
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedEigenSolver.h
@@ -0,0 +1,341 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010,2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERALIZEDEIGENSOLVER_H
+#define EIGEN_GENERALIZEDEIGENSOLVER_H
+
+#include "./RealQZ.h"
+
+namespace Eigen { 
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class GeneralizedEigenSolver
+  *
+  * \brief Computes the generalized eigenvalues and eigenvectors of a pair of general matrices
+  *
+  * \tparam _MatrixType the type of the matrices of which we are computing the
+  * eigen-decomposition; this is expected to be an instantiation of the Matrix
+  * class template. Currently, only real matrices are supported.
+  *
+  * The generalized eigenvalues and eigenvectors of a matrix pair \f$ A \f$ and \f$ B \f$ are scalars
+  * \f$ \lambda \f$ and vectors \f$ v \f$ such that \f$ Av = \lambda Bv \f$.  If
+  * \f$ D \f$ is a diagonal matrix with the eigenvalues on the diagonal, and
+  * \f$ V \f$ is a matrix with the eigenvectors as its columns, then \f$ A V =
+  * B V D \f$. The matrix \f$ V \f$ is almost always invertible, in which case we
+  * have \f$ A = B V D V^{-1} \f$. This is called the generalized eigen-decomposition.
+  *
+  * The generalized eigenvalues and eigenvectors of a matrix pair may be complex, even when the
+  * matrices are real. Moreover, the generalized eigenvalue might be infinite if the matrix B is
+  * singular. To workaround this difficulty, the eigenvalues are provided as a pair of complex \f$ \alpha \f$
+  * and real \f$ \beta \f$ such that: \f$ \lambda_i = \alpha_i / \beta_i \f$. If \f$ \beta_i \f$ is (nearly) zero,
+  * then one can consider the well defined left eigenvalue \f$ \mu = \beta_i / \alpha_i\f$ such that:
+  * \f$ \mu_i A v_i = B v_i \f$, or even \f$ \mu_i u_i^T A  = u_i^T B \f$ where \f$ u_i \f$ is
+  * called the left eigenvector.
+  *
+  * Call the function compute() to compute the generalized eigenvalues and eigenvectors of
+  * a given matrix pair. Alternatively, you can use the
+  * GeneralizedEigenSolver(const MatrixType&, const MatrixType&, bool) constructor which computes the
+  * eigenvalues and eigenvectors at construction time. Once the eigenvalue and
+  * eigenvectors are computed, they can be retrieved with the eigenvalues() and
+  * eigenvectors() functions.
+  *
+  * Here is an usage example of this class:
+  * Example: \include GeneralizedEigenSolver.cpp
+  * Output: \verbinclude GeneralizedEigenSolver.out
+  *
+  * \sa MatrixBase::eigenvalues(), class ComplexEigenSolver, class SelfAdjointEigenSolver
+  */
+template<typename _MatrixType> class GeneralizedEigenSolver
+{
+  public:
+
+    /** \brief Synonym for the template parameter \p _MatrixType. */
+    typedef _MatrixType MatrixType;
+
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+
+    /** \brief Scalar type for matrices of type #MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Complex scalar type for #MatrixType. 
+      *
+      * This is \c std::complex<Scalar> if #Scalar is real (e.g.,
+      * \c float or \c double) and just \c Scalar if #Scalar is
+      * complex.
+      */
+    typedef std::complex<RealScalar> ComplexScalar;
+
+    /** \brief Type for vector of real scalar values eigenvalues as returned by betas().
+      *
+      * This is a column vector with entries of type #Scalar.
+      * The length of the vector is the size of #MatrixType.
+      */
+    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> VectorType;
+
+    /** \brief Type for vector of complex scalar values eigenvalues as returned by betas().
+      *
+      * This is a column vector with entries of type #ComplexScalar.
+      * The length of the vector is the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ComplexVectorType;
+
+    /** \brief Expression type for the eigenvalues as returned by eigenvalues().
+      */
+    typedef CwiseBinaryOp<internal::scalar_quotient_op<ComplexScalar,Scalar>,ComplexVectorType,VectorType> EigenvalueType;
+
+    /** \brief Type for matrix of eigenvectors as returned by eigenvectors(). 
+      *
+      * This is a square matrix with entries of type #ComplexScalar. 
+      * The size is the same as the size of #MatrixType.
+      */
+    typedef Matrix<ComplexScalar, RowsAtCompileTime, ColsAtCompileTime, Options, MaxRowsAtCompileTime, MaxColsAtCompileTime> EigenvectorsType;
+
+    /** \brief Default constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via EigenSolver::compute(const MatrixType&, bool).
+      *
+      * \sa compute() for an example.
+      */
+    GeneralizedEigenSolver() : m_eivec(), m_alphas(), m_betas(), m_isInitialized(false), m_realQZ(), m_matS(), m_tmp() {}
+
+    /** \brief Default constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa GeneralizedEigenSolver()
+      */
+    GeneralizedEigenSolver(Index size)
+      : m_eivec(size, size),
+        m_alphas(size),
+        m_betas(size),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_realQZ(size),
+        m_matS(size, size),
+        m_tmp(size)
+    {}
+
+    /** \brief Constructor; computes the generalized eigendecomposition of given matrix pair.
+      * 
+      * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are computed.
+      *
+      * This constructor calls compute() to compute the generalized eigenvalues
+      * and eigenvectors.
+      *
+      * \sa compute()
+      */
+    GeneralizedEigenSolver(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true)
+      : m_eivec(A.rows(), A.cols()),
+        m_alphas(A.cols()),
+        m_betas(A.cols()),
+        m_isInitialized(false),
+        m_eigenvectorsOk(false),
+        m_realQZ(A.cols()),
+        m_matS(A.rows(), A.cols()),
+        m_tmp(A.cols())
+    {
+      compute(A, B, computeEigenvectors);
+    }
+
+    /* \brief Returns the computed generalized eigenvectors.
+      *
+      * \returns  %Matrix whose columns are the (possibly complex) eigenvectors.
+      *
+      * \pre Either the constructor 
+      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&, bool) or the member function
+      * compute(const MatrixType&, const MatrixType& bool) has been called before, and
+      * \p computeEigenvectors was set to true (the default).
+      *
+      * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
+      * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
+      * eigenvectors are normalized to have (Euclidean) norm equal to one. The
+      * matrix returned by this function is the matrix \f$ V \f$ in the
+      * generalized eigendecomposition \f$ A = B V D V^{-1} \f$, if it exists.
+      *
+      * \sa eigenvalues()
+      */
+//    EigenvectorsType eigenvectors() const;
+
+    /** \brief Returns an expression of the computed generalized eigenvalues.
+      *
+      * \returns An expression of the column vector containing the eigenvalues.
+      *
+      * It is a shortcut for \code this->alphas().cwiseQuotient(this->betas()); \endcode
+      * Not that betas might contain zeros. It is therefore not recommended to use this function,
+      * but rather directly deal with the alphas and betas vectors.
+      *
+      * \pre Either the constructor 
+      * GeneralizedEigenSolver(const MatrixType&,const MatrixType&,bool) or the member function
+      * compute(const MatrixType&,const MatrixType&,bool) has been called before.
+      *
+      * The eigenvalues are repeated according to their algebraic multiplicity,
+      * so there are as many eigenvalues as rows in the matrix. The eigenvalues 
+      * are not sorted in any particular order.
+      *
+      * \sa alphas(), betas(), eigenvectors()
+      */
+    EigenvalueType eigenvalues() const
+    {
+      eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
+      return EigenvalueType(m_alphas,m_betas);
+    }
+
+    /** \returns A const reference to the vectors containing the alpha values
+      *
+      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
+      *
+      * \sa betas(), eigenvalues() */
+    ComplexVectorType alphas() const
+    {
+      eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
+      return m_alphas;
+    }
+
+    /** \returns A const reference to the vectors containing the beta values
+      *
+      * This vector permits to reconstruct the j-th eigenvalues as alphas(i)/betas(j).
+      *
+      * \sa alphas(), eigenvalues() */
+    VectorType betas() const
+    {
+      eigen_assert(m_isInitialized && "GeneralizedEigenSolver is not initialized.");
+      return m_betas;
+    }
+
+    /** \brief Computes generalized eigendecomposition of given matrix.
+      * 
+      * \param[in]  A  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  B  Square matrix whose eigendecomposition is to be computed.
+      * \param[in]  computeEigenvectors  If true, both the eigenvectors and the
+      *    eigenvalues are computed; if false, only the eigenvalues are
+      *    computed. 
+      * \returns    Reference to \c *this
+      *
+      * This function computes the eigenvalues of the real matrix \p matrix.
+      * The eigenvalues() function can be used to retrieve them.  If 
+      * \p computeEigenvectors is true, then the eigenvectors are also computed
+      * and can be retrieved by calling eigenvectors().
+      *
+      * The matrix is first reduced to real generalized Schur form using the RealQZ
+      * class. The generalized Schur decomposition is then used to compute the eigenvalues
+      * and eigenvectors.
+      *
+      * The cost of the computation is dominated by the cost of the
+      * generalized Schur decomposition.
+      *
+      * This method reuses of the allocated data in the GeneralizedEigenSolver object.
+      */
+    GeneralizedEigenSolver& compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors = true);
+
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+      return m_realQZ.info();
+    }
+
+    /** Sets the maximal number of iterations allowed.
+    */
+    GeneralizedEigenSolver& setMaxIterations(Index maxIters)
+    {
+      m_realQZ.setMaxIterations(maxIters);
+      return *this;
+    }
+
+  protected:
+    MatrixType m_eivec;
+    ComplexVectorType m_alphas;
+    VectorType m_betas;
+    bool m_isInitialized;
+    bool m_eigenvectorsOk;
+    RealQZ<MatrixType> m_realQZ;
+    MatrixType m_matS;
+
+    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+    ColumnVectorType m_tmp;
+};
+
+//template<typename MatrixType>
+//typename GeneralizedEigenSolver<MatrixType>::EigenvectorsType GeneralizedEigenSolver<MatrixType>::eigenvectors() const
+//{
+//  eigen_assert(m_isInitialized && "EigenSolver is not initialized.");
+//  eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+//  Index n = m_eivec.cols();
+//  EigenvectorsType matV(n,n);
+//  // TODO
+//  return matV;
+//}
+
+template<typename MatrixType>
+GeneralizedEigenSolver<MatrixType>&
+GeneralizedEigenSolver<MatrixType>::compute(const MatrixType& A, const MatrixType& B, bool computeEigenvectors)
+{
+  using std::sqrt;
+  using std::abs;
+  eigen_assert(A.cols() == A.rows() && B.cols() == A.rows() && B.cols() == B.rows());
+
+  // Reduce to generalized real Schur form:
+  // A = Q S Z and B = Q T Z
+  m_realQZ.compute(A, B, computeEigenvectors);
+
+  if (m_realQZ.info() == Success)
+  {
+    m_matS = m_realQZ.matrixS();
+    if (computeEigenvectors)
+      m_eivec = m_realQZ.matrixZ().transpose();
+  
+    // Compute eigenvalues from matS
+    m_alphas.resize(A.cols());
+    m_betas.resize(A.cols());
+    Index i = 0;
+    while (i < A.cols())
+    {
+      if (i == A.cols() - 1 || m_matS.coeff(i+1, i) == Scalar(0))
+      {
+        m_alphas.coeffRef(i) = m_matS.coeff(i, i);
+        m_betas.coeffRef(i)  = m_realQZ.matrixT().coeff(i,i);
+        ++i;
+      }
+      else
+      {
+        Scalar p = Scalar(0.5) * (m_matS.coeff(i, i) - m_matS.coeff(i+1, i+1));
+        Scalar z = sqrt(abs(p * p + m_matS.coeff(i+1, i) * m_matS.coeff(i, i+1)));
+        m_alphas.coeffRef(i)   = ComplexScalar(m_matS.coeff(i+1, i+1) + p, z);
+        m_alphas.coeffRef(i+1) = ComplexScalar(m_matS.coeff(i+1, i+1) + p, -z);
+
+        m_betas.coeffRef(i)   = m_realQZ.matrixT().coeff(i,i);
+        m_betas.coeffRef(i+1) = m_realQZ.matrixT().coeff(i,i);
+        i += 2;
+      }
+    }
+  }
+
+  m_isInitialized = true;
+  m_eigenvectorsOk = false;//computeEigenvectors;
+
+  return *this;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERALIZEDEIGENSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h
new file mode 100644
index 0000000..07bf1ea
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/GeneralizedSelfAdjointEigenSolver.h
@@ -0,0 +1,227 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H
+#define EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H
+
+#include "./Tridiagonalization.h"
+
+namespace Eigen { 
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class GeneralizedSelfAdjointEigenSolver
+  *
+  * \brief Computes eigenvalues and eigenvectors of the generalized selfadjoint eigen problem
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the
+  * eigendecomposition; this is expected to be an instantiation of the Matrix
+  * class template.
+  *
+  * This class solves the generalized eigenvalue problem
+  * \f$ Av = \lambda Bv \f$. In this case, the matrix \f$ A \f$ should be
+  * selfadjoint and the matrix \f$ B \f$ should be positive definite.
+  *
+  * Only the \b lower \b triangular \b part of the input matrix is referenced.
+  *
+  * Call the function compute() to compute the eigenvalues and eigenvectors of
+  * a given matrix. Alternatively, you can use the
+  * GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+  * constructor which computes the eigenvalues and eigenvectors at construction time.
+  * Once the eigenvalue and eigenvectors are computed, they can be retrieved with the eigenvalues()
+  * and eigenvectors() functions.
+  *
+  * The documentation for GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+  * contains an example of the typical use of this class.
+  *
+  * \sa class SelfAdjointEigenSolver, class EigenSolver, class ComplexEigenSolver
+  */
+template<typename _MatrixType>
+class GeneralizedSelfAdjointEigenSolver : public SelfAdjointEigenSolver<_MatrixType>
+{
+    typedef SelfAdjointEigenSolver<_MatrixType> Base;
+  public:
+
+    typedef typename Base::Index Index;
+    typedef _MatrixType MatrixType;
+
+    /** \brief Default constructor for fixed-size matrices.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute(). This constructor
+      * can only be used if \p _MatrixType is a fixed-size matrix; use
+      * GeneralizedSelfAdjointEigenSolver(Index) for dynamic-size matrices.
+      */
+    GeneralizedSelfAdjointEigenSolver() : Base() {}
+
+    /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
+      *
+      * \param [in]  size  Positive integer, size of the matrix whose
+      * eigenvalues and eigenvectors will be computed.
+      *
+      * This constructor is useful for dynamic-size matrices, when the user
+      * intends to perform decompositions via compute(). The \p size
+      * parameter is only used as a hint. It is not an error to give a wrong
+      * \p size, but it may impair performance.
+      *
+      * \sa compute() for an example
+      */
+    GeneralizedSelfAdjointEigenSolver(Index size)
+        : Base(size)
+    {}
+
+    /** \brief Constructor; computes generalized eigendecomposition of given matrix pencil.
+      *
+      * \param[in]  matA  Selfadjoint matrix in matrix pencil.
+      *                   Only the lower triangular part of the matrix is referenced.
+      * \param[in]  matB  Positive-definite matrix in matrix pencil.
+      *                   Only the lower triangular part of the matrix is referenced.
+      * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
+      *                     Default is #ComputeEigenvectors|#Ax_lBx.
+      *
+      * This constructor calls compute(const MatrixType&, const MatrixType&, int)
+      * to compute the eigenvalues and (if requested) the eigenvectors of the
+      * generalized eigenproblem \f$ Ax = \lambda B x \f$ with \a matA the
+      * selfadjoint matrix \f$ A \f$ and \a matB the positive definite matrix
+      * \f$ B \f$. Each eigenvector \f$ x \f$ satisfies the property
+      * \f$ x^* B x = 1 \f$. The eigenvectors are computed if
+      * \a options contains ComputeEigenvectors.
+      *
+      * In addition, the two following variants can be solved via \p options:
+      * - \c ABx_lx: \f$ ABx = \lambda x \f$
+      * - \c BAx_lx: \f$ BAx = \lambda x \f$
+      *
+      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType2.out
+      *
+      * \sa compute(const MatrixType&, const MatrixType&, int)
+      */
+    GeneralizedSelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB,
+                                      int options = ComputeEigenvectors|Ax_lBx)
+      : Base(matA.cols())
+    {
+      compute(matA, matB, options);
+    }
+
+    /** \brief Computes generalized eigendecomposition of given matrix pencil.
+      *
+      * \param[in]  matA  Selfadjoint matrix in matrix pencil.
+      *                   Only the lower triangular part of the matrix is referenced.
+      * \param[in]  matB  Positive-definite matrix in matrix pencil.
+      *                   Only the lower triangular part of the matrix is referenced.
+      * \param[in]  options A or-ed set of flags {#ComputeEigenvectors,#EigenvaluesOnly} | {#Ax_lBx,#ABx_lx,#BAx_lx}.
+      *                     Default is #ComputeEigenvectors|#Ax_lBx.
+      *
+      * \returns    Reference to \c *this
+      *
+      * Accoring to \p options, this function computes eigenvalues and (if requested)
+      * the eigenvectors of one of the following three generalized eigenproblems:
+      * - \c Ax_lBx: \f$ Ax = \lambda B x \f$
+      * - \c ABx_lx: \f$ ABx = \lambda x \f$
+      * - \c BAx_lx: \f$ BAx = \lambda x \f$
+      * with \a matA the selfadjoint matrix \f$ A \f$ and \a matB the positive definite
+      * matrix \f$ B \f$.
+      * In addition, each eigenvector \f$ x \f$ satisfies the property \f$ x^* B x = 1 \f$.
+      *
+      * The eigenvalues() function can be used to retrieve
+      * the eigenvalues. If \p options contains ComputeEigenvectors, then the
+      * eigenvectors are also computed and can be retrieved by calling
+      * eigenvectors().
+      *
+      * The implementation uses LLT to compute the Cholesky decomposition
+      * \f$ B = LL^* \f$ and computes the classical eigendecomposition
+      * of the selfadjoint matrix \f$ L^{-1} A (L^*)^{-1} \f$ if \p options contains Ax_lBx
+      * and of \f$ L^{*} A L \f$ otherwise. This solves the
+      * generalized eigenproblem, because any solution of the generalized
+      * eigenproblem \f$ Ax = \lambda B x \f$ corresponds to a solution
+      * \f$ L^{-1} A (L^*)^{-1} (L^* x) = \lambda (L^* x) \f$ of the
+      * eigenproblem for \f$ L^{-1} A (L^*)^{-1} \f$. Similar statements
+      * can be made for the two other variants.
+      *
+      * Example: \include SelfAdjointEigenSolver_compute_MatrixType2.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType2.out
+      *
+      * \sa GeneralizedSelfAdjointEigenSolver(const MatrixType&, const MatrixType&, int)
+      */
+    GeneralizedSelfAdjointEigenSolver& compute(const MatrixType& matA, const MatrixType& matB,
+                                               int options = ComputeEigenvectors|Ax_lBx);
+
+  protected:
+
+};
+
+
+template<typename MatrixType>
+GeneralizedSelfAdjointEigenSolver<MatrixType>& GeneralizedSelfAdjointEigenSolver<MatrixType>::
+compute(const MatrixType& matA, const MatrixType& matB, int options)
+{
+  eigen_assert(matA.cols()==matA.rows() && matB.rows()==matA.rows() && matB.cols()==matB.rows());
+  eigen_assert((options&~(EigVecMask|GenEigMask))==0
+          && (options&EigVecMask)!=EigVecMask
+          && ((options&GenEigMask)==0 || (options&GenEigMask)==Ax_lBx
+           || (options&GenEigMask)==ABx_lx || (options&GenEigMask)==BAx_lx)
+          && "invalid option parameter");
+
+  bool computeEigVecs = ((options&EigVecMask)==0) || ((options&EigVecMask)==ComputeEigenvectors);
+
+  // Compute the cholesky decomposition of matB = L L' = U'U
+  LLT<MatrixType> cholB(matB);
+
+  int type = (options&GenEigMask);
+  if(type==0)
+    type = Ax_lBx;
+
+  if(type==Ax_lBx)
+  {
+    // compute C = inv(L) A inv(L')
+    MatrixType matC = matA.template selfadjointView<Lower>();
+    cholB.matrixL().template solveInPlace<OnTheLeft>(matC);
+    cholB.matrixU().template solveInPlace<OnTheRight>(matC);
+
+    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly );
+
+    // transform back the eigen vectors: evecs = inv(U) * evecs
+    if(computeEigVecs)
+      cholB.matrixU().solveInPlace(Base::m_eivec);
+  }
+  else if(type==ABx_lx)
+  {
+    // compute C = L' A L
+    MatrixType matC = matA.template selfadjointView<Lower>();
+    matC = matC * cholB.matrixL();
+    matC = cholB.matrixU() * matC;
+
+    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);
+
+    // transform back the eigen vectors: evecs = inv(U) * evecs
+    if(computeEigVecs)
+      cholB.matrixU().solveInPlace(Base::m_eivec);
+  }
+  else if(type==BAx_lx)
+  {
+    // compute C = L' A L
+    MatrixType matC = matA.template selfadjointView<Lower>();
+    matC = matC * cholB.matrixL();
+    matC = cholB.matrixU() * matC;
+
+    Base::compute(matC, computeEigVecs ? ComputeEigenvectors : EigenvaluesOnly);
+
+    // transform back the eigen vectors: evecs = L * evecs
+    if(computeEigVecs)
+      Base::m_eivec = cholB.matrixL() * Base::m_eivec;
+  }
+
+  return *this;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_GENERALIZEDSELFADJOINTEIGENSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/HessenbergDecomposition.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/HessenbergDecomposition.h
new file mode 100644
index 0000000..ebd8ae9
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/HessenbergDecomposition.h
@@ -0,0 +1,373 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_HESSENBERGDECOMPOSITION_H
+#define EIGEN_HESSENBERGDECOMPOSITION_H
+
+namespace Eigen { 
+
+namespace internal {
+  
+template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType;
+template<typename MatrixType>
+struct traits<HessenbergDecompositionMatrixHReturnType<MatrixType> >
+{
+  typedef MatrixType ReturnType;
+};
+
+}
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class HessenbergDecomposition
+  *
+  * \brief Reduces a square matrix to Hessenberg form by an orthogonal similarity transformation
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the Hessenberg decomposition
+  *
+  * This class performs an Hessenberg decomposition of a matrix \f$ A \f$. In
+  * the real case, the Hessenberg decomposition consists of an orthogonal
+  * matrix \f$ Q \f$ and a Hessenberg matrix \f$ H \f$ such that \f$ A = Q H
+  * Q^T \f$. An orthogonal matrix is a matrix whose inverse equals its
+  * transpose (\f$ Q^{-1} = Q^T \f$). A Hessenberg matrix has zeros below the
+  * subdiagonal, so it is almost upper triangular. The Hessenberg decomposition
+  * of a complex matrix is \f$ A = Q H Q^* \f$ with \f$ Q \f$ unitary (that is,
+  * \f$ Q^{-1} = Q^* \f$).
+  *
+  * Call the function compute() to compute the Hessenberg decomposition of a
+  * given matrix. Alternatively, you can use the
+  * HessenbergDecomposition(const MatrixType&) constructor which computes the
+  * Hessenberg decomposition at construction time. Once the decomposition is
+  * computed, you can use the matrixH() and matrixQ() functions to construct
+  * the matrices H and Q in the decomposition.
+  *
+  * The documentation for matrixH() contains an example of the typical use of
+  * this class.
+  *
+  * \sa class ComplexSchur, class Tridiagonalization, \ref QR_Module "QR Module"
+  */
+template<typename _MatrixType> class HessenbergDecomposition
+{
+  public:
+
+    /** \brief Synonym for the template parameter \p _MatrixType. */
+    typedef _MatrixType MatrixType;
+
+    enum {
+      Size = MatrixType::RowsAtCompileTime,
+      SizeMinusOne = Size == Dynamic ? Dynamic : Size - 1,
+      Options = MatrixType::Options,
+      MaxSize = MatrixType::MaxRowsAtCompileTime,
+      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : MaxSize - 1
+    };
+
+    /** \brief Scalar type for matrices of type #MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Type for vector of Householder coefficients.
+      *
+      * This is column vector with entries of type #Scalar. The length of the
+      * vector is one less than the size of #MatrixType, if it is a fixed-side
+      * type.
+      */
+    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
+
+    /** \brief Return type of matrixQ() */
+    typedef typename HouseholderSequence<MatrixType,CoeffVectorType>::ConjugateReturnType HouseholderSequenceType;
+    
+    typedef internal::HessenbergDecompositionMatrixHReturnType<MatrixType> MatrixHReturnType;
+
+    /** \brief Default constructor; the decomposition will be computed later.
+      *
+      * \param [in] size  The size of the matrix whose Hessenberg decomposition will be computed.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute().  The \p size parameter is only
+      * used as a hint. It is not an error to give a wrong \p size, but it may
+      * impair performance.
+      *
+      * \sa compute() for an example.
+      */
+    HessenbergDecomposition(Index size = Size==Dynamic ? 2 : Size)
+      : m_matrix(size,size),
+        m_temp(size),
+        m_isInitialized(false)
+    {
+      if(size>1)
+        m_hCoeffs.resize(size-1);
+    }
+
+    /** \brief Constructor; computes Hessenberg decomposition of given matrix.
+      *
+      * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
+      *
+      * This constructor calls compute() to compute the Hessenberg
+      * decomposition.
+      *
+      * \sa matrixH() for an example.
+      */
+    HessenbergDecomposition(const MatrixType& matrix)
+      : m_matrix(matrix),
+        m_temp(matrix.rows()),
+        m_isInitialized(false)
+    {
+      if(matrix.rows()<2)
+      {
+        m_isInitialized = true;
+        return;
+      }
+      m_hCoeffs.resize(matrix.rows()-1,1);
+      _compute(m_matrix, m_hCoeffs, m_temp);
+      m_isInitialized = true;
+    }
+
+    /** \brief Computes Hessenberg decomposition of given matrix.
+      *
+      * \param[in]  matrix  Square matrix whose Hessenberg decomposition is to be computed.
+      * \returns    Reference to \c *this
+      *
+      * The Hessenberg decomposition is computed by bringing the columns of the
+      * matrix successively in the required form using Householder reflections
+      * (see, e.g., Algorithm 7.4.2 in Golub \& Van Loan, <i>%Matrix
+      * Computations</i>). The cost is \f$ 10n^3/3 \f$ flops, where \f$ n \f$
+      * denotes the size of the given matrix.
+      *
+      * This method reuses of the allocated data in the HessenbergDecomposition
+      * object.
+      *
+      * Example: \include HessenbergDecomposition_compute.cpp
+      * Output: \verbinclude HessenbergDecomposition_compute.out
+      */
+    HessenbergDecomposition& compute(const MatrixType& matrix)
+    {
+      m_matrix = matrix;
+      if(matrix.rows()<2)
+      {
+        m_isInitialized = true;
+        return *this;
+      }
+      m_hCoeffs.resize(matrix.rows()-1,1);
+      _compute(m_matrix, m_hCoeffs, m_temp);
+      m_isInitialized = true;
+      return *this;
+    }
+
+    /** \brief Returns the Householder coefficients.
+      *
+      * \returns a const reference to the vector of Householder coefficients
+      *
+      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+      * or the member function compute(const MatrixType&) has been called
+      * before to compute the Hessenberg decomposition of a matrix.
+      *
+      * The Householder coefficients allow the reconstruction of the matrix
+      * \f$ Q \f$ in the Hessenberg decomposition from the packed data.
+      *
+      * \sa packedMatrix(), \ref Householder_Module "Householder module"
+      */
+    const CoeffVectorType& householderCoefficients() const
+    {
+      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+      return m_hCoeffs;
+    }
+
+    /** \brief Returns the internal representation of the decomposition
+      *
+      *	\returns a const reference to a matrix with the internal representation
+      *	         of the decomposition.
+      *
+      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+      * or the member function compute(const MatrixType&) has been called
+      * before to compute the Hessenberg decomposition of a matrix.
+      *
+      * The returned matrix contains the following information:
+      *  - the upper part and lower sub-diagonal represent the Hessenberg matrix H
+      *  - the rest of the lower part contains the Householder vectors that, combined with
+      *    Householder coefficients returned by householderCoefficients(),
+      *    allows to reconstruct the matrix Q as
+      *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+      *    Here, the matrices \f$ H_i \f$ are the Householder transformations
+      *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+      *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
+      *    \f$ v_i \f$ is the Householder vector defined by
+      *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
+      *    with M the matrix returned by this function.
+      *
+      * See LAPACK for further details on this packed storage.
+      *
+      * Example: \include HessenbergDecomposition_packedMatrix.cpp
+      * Output: \verbinclude HessenbergDecomposition_packedMatrix.out
+      *
+      * \sa householderCoefficients()
+      */
+    const MatrixType& packedMatrix() const
+    {
+      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+      return m_matrix;
+    }
+
+    /** \brief Reconstructs the orthogonal matrix Q in the decomposition
+      *
+      * \returns object representing the matrix Q
+      *
+      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+      * or the member function compute(const MatrixType&) has been called
+      * before to compute the Hessenberg decomposition of a matrix.
+      *
+      * This function returns a light-weight object of template class
+      * HouseholderSequence. You can either apply it directly to a matrix or
+      * you can convert it to a matrix of type #MatrixType.
+      *
+      * \sa matrixH() for an example, class HouseholderSequence
+      */
+    HouseholderSequenceType matrixQ() const
+    {
+      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
+             .setLength(m_matrix.rows() - 1)
+             .setShift(1);
+    }
+
+    /** \brief Constructs the Hessenberg matrix H in the decomposition
+      *
+      * \returns expression object representing the matrix H
+      *
+      * \pre Either the constructor HessenbergDecomposition(const MatrixType&)
+      * or the member function compute(const MatrixType&) has been called
+      * before to compute the Hessenberg decomposition of a matrix.
+      *
+      * The object returned by this function constructs the Hessenberg matrix H
+      * when it is assigned to a matrix or otherwise evaluated. The matrix H is
+      * constructed from the packed matrix as returned by packedMatrix(): The
+      * upper part (including the subdiagonal) of the packed matrix contains
+      * the matrix H. It may sometimes be better to directly use the packed
+      * matrix instead of constructing the matrix H.
+      *
+      * Example: \include HessenbergDecomposition_matrixH.cpp
+      * Output: \verbinclude HessenbergDecomposition_matrixH.out
+      *
+      * \sa matrixQ(), packedMatrix()
+      */
+    MatrixHReturnType matrixH() const
+    {
+      eigen_assert(m_isInitialized && "HessenbergDecomposition is not initialized.");
+      return MatrixHReturnType(*this);
+    }
+
+  private:
+
+    typedef Matrix<Scalar, 1, Size, Options | RowMajor, 1, MaxSize> VectorType;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    static void _compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp);
+
+  protected:
+    MatrixType m_matrix;
+    CoeffVectorType m_hCoeffs;
+    VectorType m_temp;
+    bool m_isInitialized;
+};
+
+/** \internal
+  * Performs a tridiagonal decomposition of \a matA in place.
+  *
+  * \param matA the input selfadjoint matrix
+  * \param hCoeffs returned Householder coefficients
+  *
+  * The result is written in the lower triangular part of \a matA.
+  *
+  * Implemented from Golub's "%Matrix Computations", algorithm 8.3.1.
+  *
+  * \sa packedMatrix()
+  */
+template<typename MatrixType>
+void HessenbergDecomposition<MatrixType>::_compute(MatrixType& matA, CoeffVectorType& hCoeffs, VectorType& temp)
+{
+  eigen_assert(matA.rows()==matA.cols());
+  Index n = matA.rows();
+  temp.resize(n);
+  for (Index i = 0; i<n-1; ++i)
+  {
+    // let's consider the vector v = i-th column starting at position i+1
+    Index remainingSize = n-i-1;
+    RealScalar beta;
+    Scalar h;
+    matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
+    matA.col(i).coeffRef(i+1) = beta;
+    hCoeffs.coeffRef(i) = h;
+
+    // Apply similarity transformation to remaining columns,
+    // i.e., compute A = H A H'
+
+    // A = H A
+    matA.bottomRightCorner(remainingSize, remainingSize)
+        .applyHouseholderOnTheLeft(matA.col(i).tail(remainingSize-1), h, &temp.coeffRef(0));
+
+    // A = A H'
+    matA.rightCols(remainingSize)
+        .applyHouseholderOnTheRight(matA.col(i).tail(remainingSize-1).conjugate(), internal::conj(h), &temp.coeffRef(0));
+  }
+}
+
+namespace internal {
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \brief Expression type for return value of HessenbergDecomposition::matrixH()
+  *
+  * \tparam MatrixType type of matrix in the Hessenberg decomposition
+  *
+  * Objects of this type represent the Hessenberg matrix in the Hessenberg
+  * decomposition of some matrix. The object holds a reference to the
+  * HessenbergDecomposition class until the it is assigned or evaluated for
+  * some other reason (the reference should remain valid during the life time
+  * of this object). This class is the return type of
+  * HessenbergDecomposition::matrixH(); there is probably no other use for this
+  * class.
+  */
+template<typename MatrixType> struct HessenbergDecompositionMatrixHReturnType
+: public ReturnByValue<HessenbergDecompositionMatrixHReturnType<MatrixType> >
+{
+    typedef typename MatrixType::Index Index;
+  public:
+    /** \brief Constructor.
+      *
+      * \param[in] hess  Hessenberg decomposition
+      */
+    HessenbergDecompositionMatrixHReturnType(const HessenbergDecomposition<MatrixType>& hess) : m_hess(hess) { }
+
+    /** \brief Hessenberg matrix in decomposition.
+      *
+      * \param[out] result  Hessenberg matrix in decomposition \p hess which
+      *                     was passed to the constructor
+      */
+    template <typename ResultType>
+    inline void evalTo(ResultType& result) const
+    {
+      result = m_hess.packedMatrix();
+      Index n = result.rows();
+      if (n>2)
+        result.bottomLeftCorner(n-2, n-2).template triangularView<Lower>().setZero();
+    }
+
+    Index rows() const { return m_hess.packedMatrix().rows(); }
+    Index cols() const { return m_hess.packedMatrix().cols(); }
+
+  protected:
+    const HessenbergDecomposition<MatrixType>& m_hess;
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_HESSENBERGDECOMPOSITION_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h
new file mode 100644
index 0000000..4fec8af
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/MatrixBaseEigenvalues.h
@@ -0,0 +1,160 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MATRIXBASEEIGENVALUES_H
+#define EIGEN_MATRIXBASEEIGENVALUES_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Derived, bool IsComplex>
+struct eigenvalues_selector
+{
+  // this is the implementation for the case IsComplex = true
+  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const
+  run(const MatrixBase<Derived>& m)
+  {
+    typedef typename Derived::PlainObject PlainObject;
+    PlainObject m_eval(m);
+    return ComplexEigenSolver<PlainObject>(m_eval, false).eigenvalues();
+  }
+};
+
+template<typename Derived>
+struct eigenvalues_selector<Derived, false>
+{
+  static inline typename MatrixBase<Derived>::EigenvaluesReturnType const
+  run(const MatrixBase<Derived>& m)
+  {
+    typedef typename Derived::PlainObject PlainObject;
+    PlainObject m_eval(m);
+    return EigenSolver<PlainObject>(m_eval, false).eigenvalues();
+  }
+};
+
+} // end namespace internal
+
+/** \brief Computes the eigenvalues of a matrix 
+  * \returns Column vector containing the eigenvalues.
+  *
+  * \eigenvalues_module
+  * This function computes the eigenvalues with the help of the EigenSolver
+  * class (for real matrices) or the ComplexEigenSolver class (for complex
+  * matrices). 
+  *
+  * The eigenvalues are repeated according to their algebraic multiplicity,
+  * so there are as many eigenvalues as rows in the matrix.
+  *
+  * The SelfAdjointView class provides a better algorithm for selfadjoint
+  * matrices.
+  *
+  * Example: \include MatrixBase_eigenvalues.cpp
+  * Output: \verbinclude MatrixBase_eigenvalues.out
+  *
+  * \sa EigenSolver::eigenvalues(), ComplexEigenSolver::eigenvalues(),
+  *     SelfAdjointView::eigenvalues()
+  */
+template<typename Derived>
+inline typename MatrixBase<Derived>::EigenvaluesReturnType
+MatrixBase<Derived>::eigenvalues() const
+{
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  return internal::eigenvalues_selector<Derived, NumTraits<Scalar>::IsComplex>::run(derived());
+}
+
+/** \brief Computes the eigenvalues of a matrix
+  * \returns Column vector containing the eigenvalues.
+  *
+  * \eigenvalues_module
+  * This function computes the eigenvalues with the help of the
+  * SelfAdjointEigenSolver class.  The eigenvalues are repeated according to
+  * their algebraic multiplicity, so there are as many eigenvalues as rows in
+  * the matrix.
+  *
+  * Example: \include SelfAdjointView_eigenvalues.cpp
+  * Output: \verbinclude SelfAdjointView_eigenvalues.out
+  *
+  * \sa SelfAdjointEigenSolver::eigenvalues(), MatrixBase::eigenvalues()
+  */
+template<typename MatrixType, unsigned int UpLo> 
+inline typename SelfAdjointView<MatrixType, UpLo>::EigenvaluesReturnType
+SelfAdjointView<MatrixType, UpLo>::eigenvalues() const
+{
+  typedef typename SelfAdjointView<MatrixType, UpLo>::PlainObject PlainObject;
+  PlainObject thisAsMatrix(*this);
+  return SelfAdjointEigenSolver<PlainObject>(thisAsMatrix, false).eigenvalues();
+}
+
+
+
+/** \brief Computes the L2 operator norm
+  * \returns Operator norm of the matrix.
+  *
+  * \eigenvalues_module
+  * This function computes the L2 operator norm of a matrix, which is also
+  * known as the spectral norm. The norm of a matrix \f$ A \f$ is defined to be
+  * \f[ \|A\|_2 = \max_x \frac{\|Ax\|_2}{\|x\|_2} \f]
+  * where the maximum is over all vectors and the norm on the right is the
+  * Euclidean vector norm. The norm equals the largest singular value, which is
+  * the square root of the largest eigenvalue of the positive semi-definite
+  * matrix \f$ A^*A \f$.
+  *
+  * The current implementation uses the eigenvalues of \f$ A^*A \f$, as computed
+  * by SelfAdjointView::eigenvalues(), to compute the operator norm of a
+  * matrix.  The SelfAdjointView class provides a better algorithm for
+  * selfadjoint matrices.
+  *
+  * Example: \include MatrixBase_operatorNorm.cpp
+  * Output: \verbinclude MatrixBase_operatorNorm.out
+  *
+  * \sa SelfAdjointView::eigenvalues(), SelfAdjointView::operatorNorm()
+  */
+template<typename Derived>
+inline typename MatrixBase<Derived>::RealScalar
+MatrixBase<Derived>::operatorNorm() const
+{
+  using std::sqrt;
+  typename Derived::PlainObject m_eval(derived());
+  // FIXME if it is really guaranteed that the eigenvalues are already sorted,
+  // then we don't need to compute a maxCoeff() here, comparing the 1st and last ones is enough.
+  return sqrt((m_eval*m_eval.adjoint())
+                 .eval()
+		 .template selfadjointView<Lower>()
+		 .eigenvalues()
+		 .maxCoeff()
+		 );
+}
+
+/** \brief Computes the L2 operator norm
+  * \returns Operator norm of the matrix.
+  *
+  * \eigenvalues_module
+  * This function computes the L2 operator norm of a self-adjoint matrix. For a
+  * self-adjoint matrix, the operator norm is the largest eigenvalue.
+  *
+  * The current implementation uses the eigenvalues of the matrix, as computed
+  * by eigenvalues(), to compute the operator norm of the matrix.
+  *
+  * Example: \include SelfAdjointView_operatorNorm.cpp
+  * Output: \verbinclude SelfAdjointView_operatorNorm.out
+  *
+  * \sa eigenvalues(), MatrixBase::operatorNorm()
+  */
+template<typename MatrixType, unsigned int UpLo>
+inline typename SelfAdjointView<MatrixType, UpLo>::RealScalar
+SelfAdjointView<MatrixType, UpLo>::operatorNorm() const
+{
+  return eigenvalues().cwiseAbs().maxCoeff();
+}
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealQZ.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealQZ.h
new file mode 100644
index 0000000..5706eee
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealQZ.h
@@ -0,0 +1,624 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Alexey Korepanov <kaikaikai at yandex.ru>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REAL_QZ_H
+#define EIGEN_REAL_QZ_H
+
+namespace Eigen {
+
+  /** \eigenvalues_module \ingroup Eigenvalues_Module
+   *
+   *
+   * \class RealQZ
+   *
+   * \brief Performs a real QZ decomposition of a pair of square matrices
+   *
+   * \tparam _MatrixType the type of the matrix of which we are computing the
+   * real QZ decomposition; this is expected to be an instantiation of the
+   * Matrix class template.
+   *
+   * Given a real square matrices A and B, this class computes the real QZ
+   * decomposition: \f$ A = Q S Z \f$, \f$ B = Q T Z \f$ where Q and Z are
+   * real orthogonal matrixes, T is upper-triangular matrix, and S is upper
+   * quasi-triangular matrix. An orthogonal matrix is a matrix whose
+   * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
+   * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
+   * blocks and 2-by-2 blocks where further reduction is impossible due to
+   * complex eigenvalues. 
+   *
+   * The eigenvalues of the pencil \f$ A - z B \f$ can be obtained from
+   * 1x1 and 2x2 blocks on the diagonals of S and T.
+   *
+   * Call the function compute() to compute the real QZ decomposition of a
+   * given pair of matrices. Alternatively, you can use the 
+   * RealQZ(const MatrixType& B, const MatrixType& B, bool computeQZ)
+   * constructor which computes the real QZ decomposition at construction
+   * time. Once the decomposition is computed, you can use the matrixS(),
+   * matrixT(), matrixQ() and matrixZ() functions to retrieve the matrices
+   * S, T, Q and Z in the decomposition. If computeQZ==false, some time
+   * is saved by not computing matrices Q and Z.
+   *
+   * Example: \include RealQZ_compute.cpp
+   * Output: \include RealQZ_compute.out
+   *
+   * \note The implementation is based on the algorithm in "Matrix Computations"
+   * by Gene H. Golub and Charles F. Van Loan, and a paper "An algorithm for
+   * generalized eigenvalue problems" by C.B.Moler and G.W.Stewart.
+   *
+   * \sa class RealSchur, class ComplexSchur, class EigenSolver, class ComplexEigenSolver
+   */
+
+  template<typename _MatrixType> class RealQZ
+  {
+    public:
+      typedef _MatrixType MatrixType;
+      enum {
+        RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+        ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+        Options = MatrixType::Options,
+        MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+        MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+      };
+      typedef typename MatrixType::Scalar Scalar;
+      typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+      typedef typename MatrixType::Index Index;
+
+      typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+      typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+
+      /** \brief Default constructor.
+       *
+       * \param [in] size  Positive integer, size of the matrix whose QZ decomposition will be computed.
+       *
+       * The default constructor is useful in cases in which the user intends to
+       * perform decompositions via compute().  The \p size parameter is only
+       * used as a hint. It is not an error to give a wrong \p size, but it may
+       * impair performance.
+       *
+       * \sa compute() for an example.
+       */
+      RealQZ(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime) : 
+        m_S(size, size),
+        m_T(size, size),
+        m_Q(size, size),
+        m_Z(size, size),
+        m_workspace(size*2),
+        m_maxIters(400),
+        m_isInitialized(false)
+        { }
+
+      /** \brief Constructor; computes real QZ decomposition of given matrices
+       * 
+       * \param[in]  A          Matrix A.
+       * \param[in]  B          Matrix B.
+       * \param[in]  computeQZ  If false, A and Z are not computed.
+       *
+       * This constructor calls compute() to compute the QZ decomposition.
+       */
+      RealQZ(const MatrixType& A, const MatrixType& B, bool computeQZ = true) :
+        m_S(A.rows(),A.cols()),
+        m_T(A.rows(),A.cols()),
+        m_Q(A.rows(),A.cols()),
+        m_Z(A.rows(),A.cols()),
+        m_workspace(A.rows()*2),
+        m_maxIters(400),
+        m_isInitialized(false) {
+          compute(A, B, computeQZ);
+        }
+
+      /** \brief Returns matrix Q in the QZ decomposition. 
+       *
+       * \returns A const reference to the matrix Q.
+       */
+      const MatrixType& matrixQ() const {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
+        return m_Q;
+      }
+
+      /** \brief Returns matrix Z in the QZ decomposition. 
+       *
+       * \returns A const reference to the matrix Z.
+       */
+      const MatrixType& matrixZ() const {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        eigen_assert(m_computeQZ && "The matrices Q and Z have not been computed during the QZ decomposition.");
+        return m_Z;
+      }
+
+      /** \brief Returns matrix S in the QZ decomposition. 
+       *
+       * \returns A const reference to the matrix S.
+       */
+      const MatrixType& matrixS() const {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        return m_S;
+      }
+
+      /** \brief Returns matrix S in the QZ decomposition. 
+       *
+       * \returns A const reference to the matrix S.
+       */
+      const MatrixType& matrixT() const {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        return m_T;
+      }
+
+      /** \brief Computes QZ decomposition of given matrix. 
+       * 
+       * \param[in]  A          Matrix A.
+       * \param[in]  B          Matrix B.
+       * \param[in]  computeQZ  If false, A and Z are not computed.
+       * \returns    Reference to \c *this
+       */
+      RealQZ& compute(const MatrixType& A, const MatrixType& B, bool computeQZ = true);
+
+      /** \brief Reports whether previous computation was successful.
+       *
+       * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
+       */
+      ComputationInfo info() const
+      {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        return m_info;
+      }
+
+      /** \brief Returns number of performed QR-like iterations.
+      */
+      Index iterations() const
+      {
+        eigen_assert(m_isInitialized && "RealQZ is not initialized.");
+        return m_global_iter;
+      }
+
+      /** Sets the maximal number of iterations allowed to converge to one eigenvalue
+       * or decouple the problem.
+      */
+      RealQZ& setMaxIterations(Index maxIters)
+      {
+        m_maxIters = maxIters;
+        return *this;
+      }
+
+    private:
+
+      MatrixType m_S, m_T, m_Q, m_Z;
+      Matrix<Scalar,Dynamic,1> m_workspace;
+      ComputationInfo m_info;
+      Index m_maxIters;
+      bool m_isInitialized;
+      bool m_computeQZ;
+      Scalar m_normOfT, m_normOfS;
+      Index m_global_iter;
+
+      typedef Matrix<Scalar,3,1> Vector3s;
+      typedef Matrix<Scalar,2,1> Vector2s;
+      typedef Matrix<Scalar,2,2> Matrix2s;
+      typedef JacobiRotation<Scalar> JRs;
+
+      void hessenbergTriangular();
+      void computeNorms();
+      Index findSmallSubdiagEntry(Index iu);
+      Index findSmallDiagEntry(Index f, Index l);
+      void splitOffTwoRows(Index i);
+      void pushDownZero(Index z, Index f, Index l);
+      void step(Index f, Index l, Index iter);
+
+  }; // RealQZ
+
+  /** \internal Reduces S and T to upper Hessenberg - triangular form */
+  template<typename MatrixType>
+    void RealQZ<MatrixType>::hessenbergTriangular()
+    {
+
+      const Index dim = m_S.cols();
+
+      // perform QR decomposition of T, overwrite T with R, save Q
+      HouseholderQR<MatrixType> qrT(m_T);
+      m_T = qrT.matrixQR();
+      m_T.template triangularView<StrictlyLower>().setZero();
+      m_Q = qrT.householderQ();
+      // overwrite S with Q* S
+      m_S.applyOnTheLeft(m_Q.adjoint());
+      // init Z as Identity
+      if (m_computeQZ)
+        m_Z = MatrixType::Identity(dim,dim);
+      // reduce S to upper Hessenberg with Givens rotations
+      for (Index j=0; j<=dim-3; j++) {
+        for (Index i=dim-1; i>=j+2; i--) {
+          JRs G;
+          // kill S(i,j)
+          if(m_S.coeff(i,j) != 0)
+          {
+            G.makeGivens(m_S.coeff(i-1,j), m_S.coeff(i,j), &m_S.coeffRef(i-1, j));
+            m_S.coeffRef(i,j) = Scalar(0.0);
+            m_S.rightCols(dim-j-1).applyOnTheLeft(i-1,i,G.adjoint());
+            m_T.rightCols(dim-i+1).applyOnTheLeft(i-1,i,G.adjoint());
+          }
+          // update Q
+          if (m_computeQZ)
+            m_Q.applyOnTheRight(i-1,i,G);
+          // kill T(i,i-1)
+          if(m_T.coeff(i,i-1)!=Scalar(0))
+          {
+            G.makeGivens(m_T.coeff(i,i), m_T.coeff(i,i-1), &m_T.coeffRef(i,i));
+            m_T.coeffRef(i,i-1) = Scalar(0.0);
+            m_S.applyOnTheRight(i,i-1,G);
+            m_T.topRows(i).applyOnTheRight(i,i-1,G);
+          }
+          // update Z
+          if (m_computeQZ)
+            m_Z.applyOnTheLeft(i,i-1,G.adjoint());
+        }
+      }
+    }
+
+  /** \internal Computes vector L1 norms of S and T when in Hessenberg-Triangular form already */
+  template<typename MatrixType>
+    inline void RealQZ<MatrixType>::computeNorms()
+    {
+      const Index size = m_S.cols();
+      m_normOfS = Scalar(0.0);
+      m_normOfT = Scalar(0.0);
+      for (Index j = 0; j < size; ++j)
+      {
+        m_normOfS += m_S.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
+        m_normOfT += m_T.row(j).segment(j, size - j).cwiseAbs().sum();
+      }
+    }
+
+
+  /** \internal Look for single small sub-diagonal element S(res, res-1) and return res (or 0) */
+  template<typename MatrixType>
+    inline typename MatrixType::Index RealQZ<MatrixType>::findSmallSubdiagEntry(Index iu)
+    {
+      using std::abs;
+      Index res = iu;
+      while (res > 0)
+      {
+        Scalar s = abs(m_S.coeff(res-1,res-1)) + abs(m_S.coeff(res,res));
+        if (s == Scalar(0.0))
+          s = m_normOfS;
+        if (abs(m_S.coeff(res,res-1)) < NumTraits<Scalar>::epsilon() * s)
+          break;
+        res--;
+      }
+      return res;
+    }
+
+  /** \internal Look for single small diagonal element T(res, res) for res between f and l, and return res (or f-1)  */
+  template<typename MatrixType>
+    inline typename MatrixType::Index RealQZ<MatrixType>::findSmallDiagEntry(Index f, Index l)
+    {
+      using std::abs;
+      Index res = l;
+      while (res >= f) {
+        if (abs(m_T.coeff(res,res)) <= NumTraits<Scalar>::epsilon() * m_normOfT)
+          break;
+        res--;
+      }
+      return res;
+    }
+
+  /** \internal decouple 2x2 diagonal block in rows i, i+1 if eigenvalues are real */
+  template<typename MatrixType>
+    inline void RealQZ<MatrixType>::splitOffTwoRows(Index i)
+    {
+      using std::abs;
+      using std::sqrt;
+      const Index dim=m_S.cols();
+      if (abs(m_S.coeff(i+1,i)==Scalar(0)))
+        return;
+      Index z = findSmallDiagEntry(i,i+1);
+      if (z==i-1)
+      {
+        // block of (S T^{-1})
+        Matrix2s STi = m_T.template block<2,2>(i,i).template triangularView<Upper>().
+          template solve<OnTheRight>(m_S.template block<2,2>(i,i));
+        Scalar p = Scalar(0.5)*(STi(0,0)-STi(1,1));
+        Scalar q = p*p + STi(1,0)*STi(0,1);
+        if (q>=0) {
+          Scalar z = sqrt(q);
+          // one QR-like iteration for ABi - lambda I
+          // is enough - when we know exact eigenvalue in advance,
+          // convergence is immediate
+          JRs G;
+          if (p>=0)
+            G.makeGivens(p + z, STi(1,0));
+          else
+            G.makeGivens(p - z, STi(1,0));
+          m_S.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
+          m_T.rightCols(dim-i).applyOnTheLeft(i,i+1,G.adjoint());
+          // update Q
+          if (m_computeQZ)
+            m_Q.applyOnTheRight(i,i+1,G);
+
+          G.makeGivens(m_T.coeff(i+1,i+1), m_T.coeff(i+1,i));
+          m_S.topRows(i+2).applyOnTheRight(i+1,i,G);
+          m_T.topRows(i+2).applyOnTheRight(i+1,i,G);
+          // update Z
+          if (m_computeQZ)
+            m_Z.applyOnTheLeft(i+1,i,G.adjoint());
+
+          m_S.coeffRef(i+1,i) = Scalar(0.0);
+          m_T.coeffRef(i+1,i) = Scalar(0.0);
+        }
+      }
+      else
+      {
+        pushDownZero(z,i,i+1);
+      }
+    }
+
+  /** \internal use zero in T(z,z) to zero S(l,l-1), working in block f..l */
+  template<typename MatrixType>
+    inline void RealQZ<MatrixType>::pushDownZero(Index z, Index f, Index l)
+    {
+      JRs G;
+      const Index dim = m_S.cols();
+      for (Index zz=z; zz<l; zz++)
+      {
+        // push 0 down
+        Index firstColS = zz>f ? (zz-1) : zz;
+        G.makeGivens(m_T.coeff(zz, zz+1), m_T.coeff(zz+1, zz+1));
+        m_S.rightCols(dim-firstColS).applyOnTheLeft(zz,zz+1,G.adjoint());
+        m_T.rightCols(dim-zz).applyOnTheLeft(zz,zz+1,G.adjoint());
+        m_T.coeffRef(zz+1,zz+1) = Scalar(0.0);
+        // update Q
+        if (m_computeQZ)
+          m_Q.applyOnTheRight(zz,zz+1,G);
+        // kill S(zz+1, zz-1)
+        if (zz>f)
+        {
+          G.makeGivens(m_S.coeff(zz+1, zz), m_S.coeff(zz+1,zz-1));
+          m_S.topRows(zz+2).applyOnTheRight(zz, zz-1,G);
+          m_T.topRows(zz+1).applyOnTheRight(zz, zz-1,G);
+          m_S.coeffRef(zz+1,zz-1) = Scalar(0.0);
+          // update Z
+          if (m_computeQZ)
+            m_Z.applyOnTheLeft(zz,zz-1,G.adjoint());
+        }
+      }
+      // finally kill S(l,l-1)
+      G.makeGivens(m_S.coeff(l,l), m_S.coeff(l,l-1));
+      m_S.applyOnTheRight(l,l-1,G);
+      m_T.applyOnTheRight(l,l-1,G);
+      m_S.coeffRef(l,l-1)=Scalar(0.0);
+      // update Z
+      if (m_computeQZ)
+        m_Z.applyOnTheLeft(l,l-1,G.adjoint());
+    }
+
+  /** \internal QR-like iterative step for block f..l */
+  template<typename MatrixType>
+    inline void RealQZ<MatrixType>::step(Index f, Index l, Index iter)
+    {
+      using std::abs;
+      const Index dim = m_S.cols();
+
+      // x, y, z
+      Scalar x, y, z;
+      if (iter==10)
+      {
+        // Wilkinson ad hoc shift
+        const Scalar
+          a11=m_S.coeff(f+0,f+0), a12=m_S.coeff(f+0,f+1),
+          a21=m_S.coeff(f+1,f+0), a22=m_S.coeff(f+1,f+1), a32=m_S.coeff(f+2,f+1),
+          b12=m_T.coeff(f+0,f+1),
+          b11i=Scalar(1.0)/m_T.coeff(f+0,f+0),
+          b22i=Scalar(1.0)/m_T.coeff(f+1,f+1),
+          a87=m_S.coeff(l-1,l-2),
+          a98=m_S.coeff(l-0,l-1),
+          b77i=Scalar(1.0)/m_T.coeff(l-2,l-2),
+          b88i=Scalar(1.0)/m_T.coeff(l-1,l-1);
+        Scalar ss = abs(a87*b77i) + abs(a98*b88i),
+               lpl = Scalar(1.5)*ss,
+               ll = ss*ss;
+        x = ll + a11*a11*b11i*b11i - lpl*a11*b11i + a12*a21*b11i*b22i
+          - a11*a21*b12*b11i*b11i*b22i;
+        y = a11*a21*b11i*b11i - lpl*a21*b11i + a21*a22*b11i*b22i 
+          - a21*a21*b12*b11i*b11i*b22i;
+        z = a21*a32*b11i*b22i;
+      }
+      else if (iter==16)
+      {
+        // another exceptional shift
+        x = m_S.coeff(f,f)/m_T.coeff(f,f)-m_S.coeff(l,l)/m_T.coeff(l,l) + m_S.coeff(l,l-1)*m_T.coeff(l-1,l) /
+          (m_T.coeff(l-1,l-1)*m_T.coeff(l,l));
+        y = m_S.coeff(f+1,f)/m_T.coeff(f,f);
+        z = 0;
+      }
+      else if (iter>23 && !(iter%8))
+      {
+        // extremely exceptional shift
+        x = internal::random<Scalar>(-1.0,1.0);
+        y = internal::random<Scalar>(-1.0,1.0);
+        z = internal::random<Scalar>(-1.0,1.0);
+      }
+      else
+      {
+        // Compute the shifts: (x,y,z,0...) = (AB^-1 - l1 I) (AB^-1 - l2 I) e1
+        // where l1 and l2 are the eigenvalues of the 2x2 matrix C = U V^-1 where
+        // U and V are 2x2 bottom right sub matrices of A and B. Thus:
+        //  = AB^-1AB^-1 + l1 l2 I - (l1+l2)(AB^-1)
+        //  = AB^-1AB^-1 + det(M) - tr(M)(AB^-1)
+        // Since we are only interested in having x, y, z with a correct ratio, we have:
+        const Scalar
+          a11 = m_S.coeff(f,f),     a12 = m_S.coeff(f,f+1),
+          a21 = m_S.coeff(f+1,f),   a22 = m_S.coeff(f+1,f+1),
+                                    a32 = m_S.coeff(f+2,f+1),
+
+          a88 = m_S.coeff(l-1,l-1), a89 = m_S.coeff(l-1,l),
+          a98 = m_S.coeff(l,l-1),   a99 = m_S.coeff(l,l),
+
+          b11 = m_T.coeff(f,f),     b12 = m_T.coeff(f,f+1),
+                                    b22 = m_T.coeff(f+1,f+1),
+
+          b88 = m_T.coeff(l-1,l-1), b89 = m_T.coeff(l-1,l),
+                                    b99 = m_T.coeff(l,l);
+
+        x = ( (a88/b88 - a11/b11)*(a99/b99 - a11/b11) - (a89/b99)*(a98/b88) + (a98/b88)*(b89/b99)*(a11/b11) ) * (b11/a21)
+          + a12/b22 - (a11/b11)*(b12/b22);
+        y = (a22/b22-a11/b11) - (a21/b11)*(b12/b22) - (a88/b88-a11/b11) - (a99/b99-a11/b11) + (a98/b88)*(b89/b99);
+        z = a32/b22;
+      }
+
+      JRs G;
+
+      for (Index k=f; k<=l-2; k++)
+      {
+        // variables for Householder reflections
+        Vector2s essential2;
+        Scalar tau, beta;
+
+        Vector3s hr(x,y,z);
+
+        // Q_k to annihilate S(k+1,k-1) and S(k+2,k-1)
+        hr.makeHouseholderInPlace(tau, beta);
+        essential2 = hr.template bottomRows<2>();
+        Index fc=(std::max)(k-1,Index(0));  // first col to update
+        m_S.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
+        m_T.template middleRows<3>(k).rightCols(dim-fc).applyHouseholderOnTheLeft(essential2, tau, m_workspace.data());
+        if (m_computeQZ)
+          m_Q.template middleCols<3>(k).applyHouseholderOnTheRight(essential2, tau, m_workspace.data());
+        if (k>f)
+          m_S.coeffRef(k+2,k-1) = m_S.coeffRef(k+1,k-1) = Scalar(0.0);
+
+        // Z_{k1} to annihilate T(k+2,k+1) and T(k+2,k)
+        hr << m_T.coeff(k+2,k+2),m_T.coeff(k+2,k),m_T.coeff(k+2,k+1);
+        hr.makeHouseholderInPlace(tau, beta);
+        essential2 = hr.template bottomRows<2>();
+        {
+          Index lr = (std::min)(k+4,dim); // last row to update
+          Map<Matrix<Scalar,Dynamic,1> > tmp(m_workspace.data(),lr);
+          // S
+          tmp = m_S.template middleCols<2>(k).topRows(lr) * essential2;
+          tmp += m_S.col(k+2).head(lr);
+          m_S.col(k+2).head(lr) -= tau*tmp;
+          m_S.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
+          // T
+          tmp = m_T.template middleCols<2>(k).topRows(lr) * essential2;
+          tmp += m_T.col(k+2).head(lr);
+          m_T.col(k+2).head(lr) -= tau*tmp;
+          m_T.template middleCols<2>(k).topRows(lr) -= (tau*tmp) * essential2.adjoint();
+        }
+        if (m_computeQZ)
+        {
+          // Z
+          Map<Matrix<Scalar,1,Dynamic> > tmp(m_workspace.data(),dim);
+          tmp = essential2.adjoint()*(m_Z.template middleRows<2>(k));
+          tmp += m_Z.row(k+2);
+          m_Z.row(k+2) -= tau*tmp;
+          m_Z.template middleRows<2>(k) -= essential2 * (tau*tmp);
+        }
+        m_T.coeffRef(k+2,k) = m_T.coeffRef(k+2,k+1) = Scalar(0.0);
+
+        // Z_{k2} to annihilate T(k+1,k)
+        G.makeGivens(m_T.coeff(k+1,k+1), m_T.coeff(k+1,k));
+        m_S.applyOnTheRight(k+1,k,G);
+        m_T.applyOnTheRight(k+1,k,G);
+        // update Z
+        if (m_computeQZ)
+          m_Z.applyOnTheLeft(k+1,k,G.adjoint());
+        m_T.coeffRef(k+1,k) = Scalar(0.0);
+
+        // update x,y,z
+        x = m_S.coeff(k+1,k);
+        y = m_S.coeff(k+2,k);
+        if (k < l-2)
+          z = m_S.coeff(k+3,k);
+      } // loop over k
+
+      // Q_{n-1} to annihilate y = S(l,l-2)
+      G.makeGivens(x,y);
+      m_S.applyOnTheLeft(l-1,l,G.adjoint());
+      m_T.applyOnTheLeft(l-1,l,G.adjoint());
+      if (m_computeQZ)
+        m_Q.applyOnTheRight(l-1,l,G);
+      m_S.coeffRef(l,l-2) = Scalar(0.0);
+
+      // Z_{n-1} to annihilate T(l,l-1)
+      G.makeGivens(m_T.coeff(l,l),m_T.coeff(l,l-1));
+      m_S.applyOnTheRight(l,l-1,G);
+      m_T.applyOnTheRight(l,l-1,G);
+      if (m_computeQZ)
+        m_Z.applyOnTheLeft(l,l-1,G.adjoint());
+      m_T.coeffRef(l,l-1) = Scalar(0.0);
+    }
+
+
+  template<typename MatrixType>
+    RealQZ<MatrixType>& RealQZ<MatrixType>::compute(const MatrixType& A_in, const MatrixType& B_in, bool computeQZ)
+    {
+
+      const Index dim = A_in.cols();
+
+      eigen_assert (A_in.rows()==dim && A_in.cols()==dim 
+          && B_in.rows()==dim && B_in.cols()==dim 
+          && "Need square matrices of the same dimension");
+
+      m_isInitialized = true;
+      m_computeQZ = computeQZ;
+      m_S = A_in; m_T = B_in;
+      m_workspace.resize(dim*2);
+      m_global_iter = 0;
+
+      // entrance point: hessenberg triangular decomposition
+      hessenbergTriangular();
+      // compute L1 vector norms of T, S into m_normOfS, m_normOfT
+      computeNorms();
+
+      Index l = dim-1, 
+            f, 
+            local_iter = 0;
+
+      while (l>0 && local_iter<m_maxIters)
+      {
+        f = findSmallSubdiagEntry(l);
+        // now rows and columns f..l (including) decouple from the rest of the problem
+        if (f>0) m_S.coeffRef(f,f-1) = Scalar(0.0);
+        if (f == l) // One root found
+        {
+          l--;
+          local_iter = 0;
+        }
+        else if (f == l-1) // Two roots found
+        {
+          splitOffTwoRows(f);
+          l -= 2;
+          local_iter = 0;
+        }
+        else // No convergence yet
+        {
+          // if there's zero on diagonal of T, we can isolate an eigenvalue with Givens rotations
+          Index z = findSmallDiagEntry(f,l);
+          if (z>=f)
+          {
+            // zero found
+            pushDownZero(z,f,l);
+          }
+          else
+          {
+            // We are sure now that S.block(f,f, l-f+1,l-f+1) is underuced upper-Hessenberg 
+            // and T.block(f,f, l-f+1,l-f+1) is invertible uper-triangular, which allows to
+            // apply a QR-like iteration to rows and columns f..l.
+            step(f,l, local_iter);
+            local_iter++;
+            m_global_iter++;
+          }
+        }
+      }
+      // check if we converged before reaching iterations limit
+      m_info = (local_iter<m_maxIters) ? Success : NoConvergence;
+      return *this;
+    } // end compute
+
+} // end namespace Eigen
+
+#endif //EIGEN_REAL_QZ
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur.h
new file mode 100644
index 0000000..64d1363
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur.h
@@ -0,0 +1,529 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010,2012 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_REAL_SCHUR_H
+#define EIGEN_REAL_SCHUR_H
+
+#include "./HessenbergDecomposition.h"
+
+namespace Eigen { 
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class RealSchur
+  *
+  * \brief Performs a real Schur decomposition of a square matrix
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the
+  * real Schur decomposition; this is expected to be an instantiation of the
+  * Matrix class template.
+  *
+  * Given a real square matrix A, this class computes the real Schur
+  * decomposition: \f$ A = U T U^T \f$ where U is a real orthogonal matrix and
+  * T is a real quasi-triangular matrix. An orthogonal matrix is a matrix whose
+  * inverse is equal to its transpose, \f$ U^{-1} = U^T \f$. A quasi-triangular
+  * matrix is a block-triangular matrix whose diagonal consists of 1-by-1
+  * blocks and 2-by-2 blocks with complex eigenvalues. The eigenvalues of the
+  * blocks on the diagonal of T are the same as the eigenvalues of the matrix
+  * A, and thus the real Schur decomposition is used in EigenSolver to compute
+  * the eigendecomposition of a matrix.
+  *
+  * Call the function compute() to compute the real Schur decomposition of a
+  * given matrix. Alternatively, you can use the RealSchur(const MatrixType&, bool)
+  * constructor which computes the real Schur decomposition at construction
+  * time. Once the decomposition is computed, you can use the matrixU() and
+  * matrixT() functions to retrieve the matrices U and T in the decomposition.
+  *
+  * The documentation of RealSchur(const MatrixType&, bool) contains an example
+  * of the typical use of this class.
+  *
+  * \note The implementation is adapted from
+  * <a href="http://math.nist.gov/javanumerics/jama/">JAMA</a> (public domain).
+  * Their code is based on EISPACK.
+  *
+  * \sa class ComplexSchur, class EigenSolver, class ComplexEigenSolver
+  */
+template<typename _MatrixType> class RealSchur
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
+    typedef typename MatrixType::Index Index;
+
+    typedef Matrix<ComplexScalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> EigenvalueType;
+    typedef Matrix<Scalar, ColsAtCompileTime, 1, Options & ~RowMajor, MaxColsAtCompileTime, 1> ColumnVectorType;
+
+    /** \brief Default constructor.
+      *
+      * \param [in] size  Positive integer, size of the matrix whose Schur decomposition will be computed.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute().  The \p size parameter is only
+      * used as a hint. It is not an error to give a wrong \p size, but it may
+      * impair performance.
+      *
+      * \sa compute() for an example.
+      */
+    RealSchur(Index size = RowsAtCompileTime==Dynamic ? 1 : RowsAtCompileTime)
+            : m_matT(size, size),
+              m_matU(size, size),
+              m_workspaceVector(size),
+              m_hess(size),
+              m_isInitialized(false),
+              m_matUisUptodate(false),
+              m_maxIters(-1)
+    { }
+
+    /** \brief Constructor; computes real Schur decomposition of given matrix. 
+      * 
+      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+      *
+      * This constructor calls compute() to compute the Schur decomposition.
+      *
+      * Example: \include RealSchur_RealSchur_MatrixType.cpp
+      * Output: \verbinclude RealSchur_RealSchur_MatrixType.out
+      */
+    RealSchur(const MatrixType& matrix, bool computeU = true)
+            : m_matT(matrix.rows(),matrix.cols()),
+              m_matU(matrix.rows(),matrix.cols()),
+              m_workspaceVector(matrix.rows()),
+              m_hess(matrix.rows()),
+              m_isInitialized(false),
+              m_matUisUptodate(false),
+              m_maxIters(-1)
+    {
+      compute(matrix, computeU);
+    }
+
+    /** \brief Returns the orthogonal matrix in the Schur decomposition. 
+      *
+      * \returns A const reference to the matrix U.
+      *
+      * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
+      * member function compute(const MatrixType&, bool) has been called before
+      * to compute the Schur decomposition of a matrix, and \p computeU was set
+      * to true (the default value).
+      *
+      * \sa RealSchur(const MatrixType&, bool) for an example
+      */
+    const MatrixType& matrixU() const
+    {
+      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+      eigen_assert(m_matUisUptodate && "The matrix U has not been computed during the RealSchur decomposition.");
+      return m_matU;
+    }
+
+    /** \brief Returns the quasi-triangular matrix in the Schur decomposition. 
+      *
+      * \returns A const reference to the matrix T.
+      *
+      * \pre Either the constructor RealSchur(const MatrixType&, bool) or the
+      * member function compute(const MatrixType&, bool) has been called before
+      * to compute the Schur decomposition of a matrix.
+      *
+      * \sa RealSchur(const MatrixType&, bool) for an example
+      */
+    const MatrixType& matrixT() const
+    {
+      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+      return m_matT;
+    }
+  
+    /** \brief Computes Schur decomposition of given matrix. 
+      * 
+      * \param[in]  matrix    Square matrix whose Schur decomposition is to be computed.
+      * \param[in]  computeU  If true, both T and U are computed; if false, only T is computed.
+      * \returns    Reference to \c *this
+      *
+      * The Schur decomposition is computed by first reducing the matrix to
+      * Hessenberg form using the class HessenbergDecomposition. The Hessenberg
+      * matrix is then reduced to triangular form by performing Francis QR
+      * iterations with implicit double shift. The cost of computing the Schur
+      * decomposition depends on the number of iterations; as a rough guide, it
+      * may be taken to be \f$25n^3\f$ flops if \a computeU is true and
+      * \f$10n^3\f$ flops if \a computeU is false.
+      *
+      * Example: \include RealSchur_compute.cpp
+      * Output: \verbinclude RealSchur_compute.out
+      *
+      * \sa compute(const MatrixType&, bool, Index)
+      */
+    RealSchur& compute(const MatrixType& matrix, bool computeU = true);
+
+    /** \brief Computes Schur decomposition of a Hessenberg matrix H = Z T Z^T
+     *  \param[in] matrixH Matrix in Hessenberg form H
+     *  \param[in] matrixQ orthogonal matrix Q that transform a matrix A to H : A = Q H Q^T
+     *  \param computeU Computes the matriX U of the Schur vectors
+     * \return Reference to \c *this
+     * 
+     *  This routine assumes that the matrix is already reduced in Hessenberg form matrixH
+     *  using either the class HessenbergDecomposition or another mean. 
+     *  It computes the upper quasi-triangular matrix T of the Schur decomposition of H
+     *  When computeU is true, this routine computes the matrix U such that 
+     *  A = U T U^T =  (QZ) T (QZ)^T = Q H Q^T where A is the initial matrix
+     * 
+     * NOTE Q is referenced if computeU is true; so, if the initial orthogonal matrix
+     * is not available, the user should give an identity matrix (Q.setIdentity())
+     * 
+     * \sa compute(const MatrixType&, bool)
+     */
+    template<typename HessMatrixType, typename OrthMatrixType>
+    RealSchur& computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU);
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "RealSchur is not initialized.");
+      return m_info;
+    }
+
+    /** \brief Sets the maximum number of iterations allowed. 
+      *
+      * If not specified by the user, the maximum number of iterations is m_maxIterationsPerRow times the size
+      * of the matrix.
+      */
+    RealSchur& setMaxIterations(Index maxIters)
+    {
+      m_maxIters = maxIters;
+      return *this;
+    }
+
+    /** \brief Returns the maximum number of iterations. */
+    Index getMaxIterations()
+    {
+      return m_maxIters;
+    }
+
+    /** \brief Maximum number of iterations per row.
+      *
+      * If not otherwise specified, the maximum number of iterations is this number times the size of the
+      * matrix. It is currently set to 40.
+      */
+    static const int m_maxIterationsPerRow = 40;
+
+  private:
+    
+    MatrixType m_matT;
+    MatrixType m_matU;
+    ColumnVectorType m_workspaceVector;
+    HessenbergDecomposition<MatrixType> m_hess;
+    ComputationInfo m_info;
+    bool m_isInitialized;
+    bool m_matUisUptodate;
+    Index m_maxIters;
+
+    typedef Matrix<Scalar,3,1> Vector3s;
+
+    Scalar computeNormOfT();
+    Index findSmallSubdiagEntry(Index iu, const Scalar& norm);
+    void splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift);
+    void computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo);
+    void initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector);
+    void performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace);
+};
+
+
+template<typename MatrixType>
+RealSchur<MatrixType>& RealSchur<MatrixType>::compute(const MatrixType& matrix, bool computeU)
+{
+  eigen_assert(matrix.cols() == matrix.rows());
+  Index maxIters = m_maxIters;
+  if (maxIters == -1)
+    maxIters = m_maxIterationsPerRow * matrix.rows();
+
+  // Step 1. Reduce to Hessenberg form
+  m_hess.compute(matrix);
+
+  // Step 2. Reduce to real Schur form  
+  computeFromHessenberg(m_hess.matrixH(), m_hess.matrixQ(), computeU);
+  
+  return *this;
+}
+template<typename MatrixType>
+template<typename HessMatrixType, typename OrthMatrixType>
+RealSchur<MatrixType>& RealSchur<MatrixType>::computeFromHessenberg(const HessMatrixType& matrixH, const OrthMatrixType& matrixQ,  bool computeU)
+{  
+  m_matT = matrixH; 
+  if(computeU)
+    m_matU = matrixQ;
+  
+  Index maxIters = m_maxIters;
+  if (maxIters == -1)
+    maxIters = m_maxIterationsPerRow * matrixH.rows();
+  m_workspaceVector.resize(m_matT.cols());
+  Scalar* workspace = &m_workspaceVector.coeffRef(0);
+
+  // The matrix m_matT is divided in three parts. 
+  // Rows 0,...,il-1 are decoupled from the rest because m_matT(il,il-1) is zero. 
+  // Rows il,...,iu is the part we are working on (the active window).
+  // Rows iu+1,...,end are already brought in triangular form.
+  Index iu = m_matT.cols() - 1;
+  Index iter = 0;      // iteration count for current eigenvalue
+  Index totalIter = 0; // iteration count for whole matrix
+  Scalar exshift(0);   // sum of exceptional shifts
+  Scalar norm = computeNormOfT();
+
+  if(norm!=0)
+  {
+    while (iu >= 0)
+    {
+      Index il = findSmallSubdiagEntry(iu, norm);
+
+      // Check for convergence
+      if (il == iu) // One root found
+      {
+        m_matT.coeffRef(iu,iu) = m_matT.coeff(iu,iu) + exshift;
+        if (iu > 0)
+          m_matT.coeffRef(iu, iu-1) = Scalar(0);
+        iu--;
+        iter = 0;
+      }
+      else if (il == iu-1) // Two roots found
+      {
+        splitOffTwoRows(iu, computeU, exshift);
+        iu -= 2;
+        iter = 0;
+      }
+      else // No convergence yet
+      {
+        // The firstHouseholderVector vector has to be initialized to something to get rid of a silly GCC warning (-O1 -Wall -DNDEBUG )
+        Vector3s firstHouseholderVector(0,0,0), shiftInfo;
+        computeShift(iu, iter, exshift, shiftInfo);
+        iter = iter + 1;
+        totalIter = totalIter + 1;
+        if (totalIter > maxIters) break;
+        Index im;
+        initFrancisQRStep(il, iu, shiftInfo, im, firstHouseholderVector);
+        performFrancisQRStep(il, im, iu, computeU, firstHouseholderVector, workspace);
+      }
+    }
+  }
+  if(totalIter <= maxIters)
+    m_info = Success;
+  else
+    m_info = NoConvergence;
+
+  m_isInitialized = true;
+  m_matUisUptodate = computeU;
+  return *this;
+}
+
+/** \internal Computes and returns vector L1 norm of T */
+template<typename MatrixType>
+inline typename MatrixType::Scalar RealSchur<MatrixType>::computeNormOfT()
+{
+  const Index size = m_matT.cols();
+  // FIXME to be efficient the following would requires a triangular reduxion code
+  // Scalar norm = m_matT.upper().cwiseAbs().sum() 
+  //               + m_matT.bottomLeftCorner(size-1,size-1).diagonal().cwiseAbs().sum();
+  Scalar norm(0);
+  for (Index j = 0; j < size; ++j)
+    norm += m_matT.col(j).segment(0, (std::min)(size,j+2)).cwiseAbs().sum();
+  return norm;
+}
+
+/** \internal Look for single small sub-diagonal element and returns its index */
+template<typename MatrixType>
+inline typename MatrixType::Index RealSchur<MatrixType>::findSmallSubdiagEntry(Index iu, const Scalar& norm)
+{
+  using std::abs;
+  Index res = iu;
+  while (res > 0)
+  {
+    Scalar s = abs(m_matT.coeff(res-1,res-1)) + abs(m_matT.coeff(res,res));
+    if (s == 0.0)
+      s = norm;
+    if (abs(m_matT.coeff(res,res-1)) < NumTraits<Scalar>::epsilon() * s)
+      break;
+    res--;
+  }
+  return res;
+}
+
+/** \internal Update T given that rows iu-1 and iu decouple from the rest. */
+template<typename MatrixType>
+inline void RealSchur<MatrixType>::splitOffTwoRows(Index iu, bool computeU, const Scalar& exshift)
+{
+  using std::sqrt;
+  using std::abs;
+  const Index size = m_matT.cols();
+
+  // The eigenvalues of the 2x2 matrix [a b; c d] are 
+  // trace +/- sqrt(discr/4) where discr = tr^2 - 4*det, tr = a + d, det = ad - bc
+  Scalar p = Scalar(0.5) * (m_matT.coeff(iu-1,iu-1) - m_matT.coeff(iu,iu));
+  Scalar q = p * p + m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);   // q = tr^2 / 4 - det = discr/4
+  m_matT.coeffRef(iu,iu) += exshift;
+  m_matT.coeffRef(iu-1,iu-1) += exshift;
+
+  if (q >= Scalar(0)) // Two real eigenvalues
+  {
+    Scalar z = sqrt(abs(q));
+    JacobiRotation<Scalar> rot;
+    if (p >= Scalar(0))
+      rot.makeGivens(p + z, m_matT.coeff(iu, iu-1));
+    else
+      rot.makeGivens(p - z, m_matT.coeff(iu, iu-1));
+
+    m_matT.rightCols(size-iu+1).applyOnTheLeft(iu-1, iu, rot.adjoint());
+    m_matT.topRows(iu+1).applyOnTheRight(iu-1, iu, rot);
+    m_matT.coeffRef(iu, iu-1) = Scalar(0); 
+    if (computeU)
+      m_matU.applyOnTheRight(iu-1, iu, rot);
+  }
+
+  if (iu > 1) 
+    m_matT.coeffRef(iu-1, iu-2) = Scalar(0);
+}
+
+/** \internal Form shift in shiftInfo, and update exshift if an exceptional shift is performed. */
+template<typename MatrixType>
+inline void RealSchur<MatrixType>::computeShift(Index iu, Index iter, Scalar& exshift, Vector3s& shiftInfo)
+{
+  using std::sqrt;
+  using std::abs;
+  shiftInfo.coeffRef(0) = m_matT.coeff(iu,iu);
+  shiftInfo.coeffRef(1) = m_matT.coeff(iu-1,iu-1);
+  shiftInfo.coeffRef(2) = m_matT.coeff(iu,iu-1) * m_matT.coeff(iu-1,iu);
+
+  // Wilkinson's original ad hoc shift
+  if (iter == 10)
+  {
+    exshift += shiftInfo.coeff(0);
+    for (Index i = 0; i <= iu; ++i)
+      m_matT.coeffRef(i,i) -= shiftInfo.coeff(0);
+    Scalar s = abs(m_matT.coeff(iu,iu-1)) + abs(m_matT.coeff(iu-1,iu-2));
+    shiftInfo.coeffRef(0) = Scalar(0.75) * s;
+    shiftInfo.coeffRef(1) = Scalar(0.75) * s;
+    shiftInfo.coeffRef(2) = Scalar(-0.4375) * s * s;
+  }
+
+  // MATLAB's new ad hoc shift
+  if (iter == 30)
+  {
+    Scalar s = (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
+    s = s * s + shiftInfo.coeff(2);
+    if (s > Scalar(0))
+    {
+      s = sqrt(s);
+      if (shiftInfo.coeff(1) < shiftInfo.coeff(0))
+        s = -s;
+      s = s + (shiftInfo.coeff(1) - shiftInfo.coeff(0)) / Scalar(2.0);
+      s = shiftInfo.coeff(0) - shiftInfo.coeff(2) / s;
+      exshift += s;
+      for (Index i = 0; i <= iu; ++i)
+        m_matT.coeffRef(i,i) -= s;
+      shiftInfo.setConstant(Scalar(0.964));
+    }
+  }
+}
+
+/** \internal Compute index im at which Francis QR step starts and the first Householder vector. */
+template<typename MatrixType>
+inline void RealSchur<MatrixType>::initFrancisQRStep(Index il, Index iu, const Vector3s& shiftInfo, Index& im, Vector3s& firstHouseholderVector)
+{
+  using std::abs;
+  Vector3s& v = firstHouseholderVector; // alias to save typing
+
+  for (im = iu-2; im >= il; --im)
+  {
+    const Scalar Tmm = m_matT.coeff(im,im);
+    const Scalar r = shiftInfo.coeff(0) - Tmm;
+    const Scalar s = shiftInfo.coeff(1) - Tmm;
+    v.coeffRef(0) = (r * s - shiftInfo.coeff(2)) / m_matT.coeff(im+1,im) + m_matT.coeff(im,im+1);
+    v.coeffRef(1) = m_matT.coeff(im+1,im+1) - Tmm - r - s;
+    v.coeffRef(2) = m_matT.coeff(im+2,im+1);
+    if (im == il) {
+      break;
+    }
+    const Scalar lhs = m_matT.coeff(im,im-1) * (abs(v.coeff(1)) + abs(v.coeff(2)));
+    const Scalar rhs = v.coeff(0) * (abs(m_matT.coeff(im-1,im-1)) + abs(Tmm) + abs(m_matT.coeff(im+1,im+1)));
+    if (abs(lhs) < NumTraits<Scalar>::epsilon() * rhs)
+    {
+      break;
+    }
+  }
+}
+
+/** \internal Perform a Francis QR step involving rows il:iu and columns im:iu. */
+template<typename MatrixType>
+inline void RealSchur<MatrixType>::performFrancisQRStep(Index il, Index im, Index iu, bool computeU, const Vector3s& firstHouseholderVector, Scalar* workspace)
+{
+  eigen_assert(im >= il);
+  eigen_assert(im <= iu-2);
+
+  const Index size = m_matT.cols();
+
+  for (Index k = im; k <= iu-2; ++k)
+  {
+    bool firstIteration = (k == im);
+
+    Vector3s v;
+    if (firstIteration)
+      v = firstHouseholderVector;
+    else
+      v = m_matT.template block<3,1>(k,k-1);
+
+    Scalar tau, beta;
+    Matrix<Scalar, 2, 1> ess;
+    v.makeHouseholder(ess, tau, beta);
+    
+    if (beta != Scalar(0)) // if v is not zero
+    {
+      if (firstIteration && k > il)
+        m_matT.coeffRef(k,k-1) = -m_matT.coeff(k,k-1);
+      else if (!firstIteration)
+        m_matT.coeffRef(k,k-1) = beta;
+
+      // These Householder transformations form the O(n^3) part of the algorithm
+      m_matT.block(k, k, 3, size-k).applyHouseholderOnTheLeft(ess, tau, workspace);
+      m_matT.block(0, k, (std::min)(iu,k+3) + 1, 3).applyHouseholderOnTheRight(ess, tau, workspace);
+      if (computeU)
+        m_matU.block(0, k, size, 3).applyHouseholderOnTheRight(ess, tau, workspace);
+    }
+  }
+
+  Matrix<Scalar, 2, 1> v = m_matT.template block<2,1>(iu-1, iu-2);
+  Scalar tau, beta;
+  Matrix<Scalar, 1, 1> ess;
+  v.makeHouseholder(ess, tau, beta);
+
+  if (beta != Scalar(0)) // if v is not zero
+  {
+    m_matT.coeffRef(iu-1, iu-2) = beta;
+    m_matT.block(iu-1, iu-1, 2, size-iu+1).applyHouseholderOnTheLeft(ess, tau, workspace);
+    m_matT.block(0, iu-1, iu+1, 2).applyHouseholderOnTheRight(ess, tau, workspace);
+    if (computeU)
+      m_matU.block(0, iu-1, size, 2).applyHouseholderOnTheRight(ess, tau, workspace);
+  }
+
+  // clean up pollution due to round-off errors
+  for (Index i = im+2; i <= iu; ++i)
+  {
+    m_matT.coeffRef(i,i-2) = Scalar(0);
+    if (i > im+2)
+      m_matT.coeffRef(i,i-3) = Scalar(0);
+  }
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_REAL_SCHUR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur_MKL.h
new file mode 100644
index 0000000..ad97364
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/RealSchur_MKL.h
@@ -0,0 +1,83 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Real Schur needed to real unsymmetrical eigenvalues/eigenvectors.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_REAL_SCHUR_MKL_H
+#define EIGEN_REAL_SCHUR_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_SCHUR_REAL(EIGTYPE, MKLTYPE, MKLPREFIX, MKLPREFIX_U, EIGCOLROW, MKLCOLROW) \
+template<> inline \
+RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
+RealSchur<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, bool computeU) \
+{ \
+  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> MatrixType; \
+  typedef MatrixType::Scalar Scalar; \
+  typedef MatrixType::RealScalar RealScalar; \
+\
+  eigen_assert(matrix.cols() == matrix.rows()); \
+\
+  lapack_int n = matrix.cols(), sdim, info; \
+  lapack_int lda = matrix.outerStride(); \
+  lapack_int matrix_order = MKLCOLROW; \
+  char jobvs, sort='N'; \
+  LAPACK_##MKLPREFIX_U##_SELECT2 select = 0; \
+  jobvs = (computeU) ? 'V' : 'N'; \
+  m_matU.resize(n, n); \
+  lapack_int ldvs  = m_matU.outerStride(); \
+  m_matT = matrix; \
+  Matrix<EIGTYPE, Dynamic, Dynamic> wr, wi; \
+  wr.resize(n, 1); wi.resize(n, 1); \
+  info = LAPACKE_##MKLPREFIX##gees( matrix_order, jobvs, sort, select, n, (MKLTYPE*)m_matT.data(), lda, &sdim, (MKLTYPE*)wr.data(), (MKLTYPE*)wi.data(), (MKLTYPE*)m_matU.data(), ldvs ); \
+  if(info == 0) \
+    m_info = Success; \
+  else \
+    m_info = NoConvergence; \
+\
+  m_isInitialized = true; \
+  m_matUisUptodate = computeU; \
+  return *this; \
+\
+}
+
+EIGEN_MKL_SCHUR_REAL(double,   double, d, D, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SCHUR_REAL(float,    float,  s, S, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SCHUR_REAL(double,   double, d, D, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_SCHUR_REAL(float,    float,  s, S, RowMajor, LAPACK_ROW_MAJOR)
+
+} // end namespace Eigen
+
+#endif // EIGEN_REAL_SCHUR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
new file mode 100644
index 0000000..03c0249
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver.h
@@ -0,0 +1,802 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SELFADJOINTEIGENSOLVER_H
+#define EIGEN_SELFADJOINTEIGENSOLVER_H
+
+#include "./Tridiagonalization.h"
+
+namespace Eigen { 
+
+template<typename _MatrixType>
+class GeneralizedSelfAdjointEigenSolver;
+
+namespace internal {
+template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues;
+}
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class SelfAdjointEigenSolver
+  *
+  * \brief Computes eigenvalues and eigenvectors of selfadjoint matrices
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the
+  * eigendecomposition; this is expected to be an instantiation of the Matrix
+  * class template.
+  *
+  * A matrix \f$ A \f$ is selfadjoint if it equals its adjoint. For real
+  * matrices, this means that the matrix is symmetric: it equals its
+  * transpose. This class computes the eigenvalues and eigenvectors of a
+  * selfadjoint matrix. These are the scalars \f$ \lambda \f$ and vectors
+  * \f$ v \f$ such that \f$ Av = \lambda v \f$.  The eigenvalues of a
+  * selfadjoint matrix are always real. If \f$ D \f$ is a diagonal matrix with
+  * the eigenvalues on the diagonal, and \f$ V \f$ is a matrix with the
+  * eigenvectors as its columns, then \f$ A = V D V^{-1} \f$ (for selfadjoint
+  * matrices, the matrix \f$ V \f$ is always invertible). This is called the
+  * eigendecomposition.
+  *
+  * The algorithm exploits the fact that the matrix is selfadjoint, making it
+  * faster and more accurate than the general purpose eigenvalue algorithms
+  * implemented in EigenSolver and ComplexEigenSolver.
+  *
+  * Only the \b lower \b triangular \b part of the input matrix is referenced.
+  *
+  * Call the function compute() to compute the eigenvalues and eigenvectors of
+  * a given matrix. Alternatively, you can use the
+  * SelfAdjointEigenSolver(const MatrixType&, int) constructor which computes
+  * the eigenvalues and eigenvectors at construction time. Once the eigenvalue
+  * and eigenvectors are computed, they can be retrieved with the eigenvalues()
+  * and eigenvectors() functions.
+  *
+  * The documentation for SelfAdjointEigenSolver(const MatrixType&, int)
+  * contains an example of the typical use of this class.
+  *
+  * To solve the \em generalized eigenvalue problem \f$ Av = \lambda Bv \f$ and
+  * the likes, see the class GeneralizedSelfAdjointEigenSolver.
+  *
+  * \sa MatrixBase::eigenvalues(), class EigenSolver, class ComplexEigenSolver
+  */
+template<typename _MatrixType> class SelfAdjointEigenSolver
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      Size = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    
+    /** \brief Scalar type for matrices of type \p _MatrixType. */
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+
+    /** \brief Real scalar type for \p _MatrixType.
+      *
+      * This is just \c Scalar if #Scalar is real (e.g., \c float or
+      * \c double), and the type of the real part of \c Scalar if #Scalar is
+      * complex.
+      */
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    
+    friend struct internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>;
+
+    /** \brief Type for vector of eigenvalues as returned by eigenvalues().
+      *
+      * This is a column vector with entries of type #RealScalar.
+      * The length of the vector is the size of \p _MatrixType.
+      */
+    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type RealVectorType;
+    typedef Tridiagonalization<MatrixType> TridiagonalizationType;
+
+    /** \brief Default constructor for fixed-size matrices.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute(). This constructor
+      * can only be used if \p _MatrixType is a fixed-size matrix; use
+      * SelfAdjointEigenSolver(Index) for dynamic-size matrices.
+      *
+      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver.out
+      */
+    SelfAdjointEigenSolver()
+        : m_eivec(),
+          m_eivalues(),
+          m_subdiag(),
+          m_isInitialized(false)
+    { }
+
+    /** \brief Constructor, pre-allocates memory for dynamic-size matrices.
+      *
+      * \param [in]  size  Positive integer, size of the matrix whose
+      * eigenvalues and eigenvectors will be computed.
+      *
+      * This constructor is useful for dynamic-size matrices, when the user
+      * intends to perform decompositions via compute(). The \p size
+      * parameter is only used as a hint. It is not an error to give a wrong
+      * \p size, but it may impair performance.
+      *
+      * \sa compute() for an example
+      */
+    SelfAdjointEigenSolver(Index size)
+        : m_eivec(size, size),
+          m_eivalues(size),
+          m_subdiag(size > 1 ? size - 1 : 1),
+          m_isInitialized(false)
+    {}
+
+    /** \brief Constructor; computes eigendecomposition of given matrix.
+      *
+      * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
+      *    be computed. Only the lower triangular part of the matrix is referenced.
+      * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
+      *
+      * This constructor calls compute(const MatrixType&, int) to compute the
+      * eigenvalues of the matrix \p matrix. The eigenvectors are computed if
+      * \p options equals #ComputeEigenvectors.
+      *
+      * Example: \include SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_SelfAdjointEigenSolver_MatrixType.out
+      *
+      * \sa compute(const MatrixType&, int)
+      */
+    SelfAdjointEigenSolver(const MatrixType& matrix, int options = ComputeEigenvectors)
+      : m_eivec(matrix.rows(), matrix.cols()),
+        m_eivalues(matrix.cols()),
+        m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
+        m_isInitialized(false)
+    {
+      compute(matrix, options);
+    }
+
+    /** \brief Computes eigendecomposition of given matrix.
+      *
+      * \param[in]  matrix  Selfadjoint matrix whose eigendecomposition is to
+      *    be computed. Only the lower triangular part of the matrix is referenced.
+      * \param[in]  options Can be #ComputeEigenvectors (default) or #EigenvaluesOnly.
+      * \returns    Reference to \c *this
+      *
+      * This function computes the eigenvalues of \p matrix.  The eigenvalues()
+      * function can be used to retrieve them.  If \p options equals #ComputeEigenvectors,
+      * then the eigenvectors are also computed and can be retrieved by
+      * calling eigenvectors().
+      *
+      * This implementation uses a symmetric QR algorithm. The matrix is first
+      * reduced to tridiagonal form using the Tridiagonalization class. The
+      * tridiagonal matrix is then brought to diagonal form with implicit
+      * symmetric QR steps with Wilkinson shift. Details can be found in
+      * Section 8.3 of Golub \& Van Loan, <i>%Matrix Computations</i>.
+      *
+      * The cost of the computation is about \f$ 9n^3 \f$ if the eigenvectors
+      * are required and \f$ 4n^3/3 \f$ if they are not required.
+      *
+      * This method reuses the memory in the SelfAdjointEigenSolver object that
+      * was allocated when the object was constructed, if the size of the
+      * matrix does not change.
+      *
+      * Example: \include SelfAdjointEigenSolver_compute_MatrixType.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_compute_MatrixType.out
+      *
+      * \sa SelfAdjointEigenSolver(const MatrixType&, int)
+      */
+    SelfAdjointEigenSolver& compute(const MatrixType& matrix, int options = ComputeEigenvectors);
+    
+    /** \brief Computes eigendecomposition of given matrix using a direct algorithm
+      *
+      * This is a variant of compute(const MatrixType&, int options) which
+      * directly solves the underlying polynomial equation.
+      * 
+      * Currently only 3x3 matrices for which the sizes are known at compile time are supported (e.g., Matrix3d).
+      * 
+      * This method is usually significantly faster than the QR algorithm
+      * but it might also be less accurate. It is also worth noting that
+      * for 3x3 matrices it involves trigonometric operations which are
+      * not necessarily available for all scalar types.
+      *
+      * \sa compute(const MatrixType&, int options)
+      */
+    SelfAdjointEigenSolver& computeDirect(const MatrixType& matrix, int options = ComputeEigenvectors);
+
+    /** \brief Returns the eigenvectors of given matrix.
+      *
+      * \returns  A const reference to the matrix whose columns are the eigenvectors.
+      *
+      * \pre The eigenvectors have been computed before.
+      *
+      * Column \f$ k \f$ of the returned matrix is an eigenvector corresponding
+      * to eigenvalue number \f$ k \f$ as returned by eigenvalues().  The
+      * eigenvectors are normalized to have (Euclidean) norm equal to one. If
+      * this object was used to solve the eigenproblem for the selfadjoint
+      * matrix \f$ A \f$, then the matrix returned by this function is the
+      * matrix \f$ V \f$ in the eigendecomposition \f$ A = V D V^{-1} \f$.
+      *
+      * Example: \include SelfAdjointEigenSolver_eigenvectors.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_eigenvectors.out
+      *
+      * \sa eigenvalues()
+      */
+    const MatrixType& eigenvectors() const
+    {
+      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+      return m_eivec;
+    }
+
+    /** \brief Returns the eigenvalues of given matrix.
+      *
+      * \returns A const reference to the column vector containing the eigenvalues.
+      *
+      * \pre The eigenvalues have been computed before.
+      *
+      * The eigenvalues are repeated according to their algebraic multiplicity,
+      * so there are as many eigenvalues as rows in the matrix. The eigenvalues
+      * are sorted in increasing order.
+      *
+      * Example: \include SelfAdjointEigenSolver_eigenvalues.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_eigenvalues.out
+      *
+      * \sa eigenvectors(), MatrixBase::eigenvalues()
+      */
+    const RealVectorType& eigenvalues() const
+    {
+      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+      return m_eivalues;
+    }
+
+    /** \brief Computes the positive-definite square root of the matrix.
+      *
+      * \returns the positive-definite square root of the matrix
+      *
+      * \pre The eigenvalues and eigenvectors of a positive-definite matrix
+      * have been computed before.
+      *
+      * The square root of a positive-definite matrix \f$ A \f$ is the
+      * positive-definite matrix whose square equals \f$ A \f$. This function
+      * uses the eigendecomposition \f$ A = V D V^{-1} \f$ to compute the
+      * square root as \f$ A^{1/2} = V D^{1/2} V^{-1} \f$.
+      *
+      * Example: \include SelfAdjointEigenSolver_operatorSqrt.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_operatorSqrt.out
+      *
+      * \sa operatorInverseSqrt(),
+      *     \ref MatrixFunctions_Module "MatrixFunctions Module"
+      */
+    MatrixType operatorSqrt() const
+    {
+      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+      return m_eivec * m_eivalues.cwiseSqrt().asDiagonal() * m_eivec.adjoint();
+    }
+
+    /** \brief Computes the inverse square root of the matrix.
+      *
+      * \returns the inverse positive-definite square root of the matrix
+      *
+      * \pre The eigenvalues and eigenvectors of a positive-definite matrix
+      * have been computed before.
+      *
+      * This function uses the eigendecomposition \f$ A = V D V^{-1} \f$ to
+      * compute the inverse square root as \f$ V D^{-1/2} V^{-1} \f$. This is
+      * cheaper than first computing the square root with operatorSqrt() and
+      * then its inverse with MatrixBase::inverse().
+      *
+      * Example: \include SelfAdjointEigenSolver_operatorInverseSqrt.cpp
+      * Output: \verbinclude SelfAdjointEigenSolver_operatorInverseSqrt.out
+      *
+      * \sa operatorSqrt(), MatrixBase::inverse(),
+      *     \ref MatrixFunctions_Module "MatrixFunctions Module"
+      */
+    MatrixType operatorInverseSqrt() const
+    {
+      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+      eigen_assert(m_eigenvectorsOk && "The eigenvectors have not been computed together with the eigenvalues.");
+      return m_eivec * m_eivalues.cwiseInverse().cwiseSqrt().asDiagonal() * m_eivec.adjoint();
+    }
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful, \c NoConvergence otherwise.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "SelfAdjointEigenSolver is not initialized.");
+      return m_info;
+    }
+
+    /** \brief Maximum number of iterations.
+      *
+      * The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n
+      * denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).
+      */
+    static const int m_maxIterations = 30;
+
+    #ifdef EIGEN2_SUPPORT
+    SelfAdjointEigenSolver(const MatrixType& matrix, bool computeEigenvectors)
+      : m_eivec(matrix.rows(), matrix.cols()),
+        m_eivalues(matrix.cols()),
+        m_subdiag(matrix.rows() > 1 ? matrix.rows() - 1 : 1),
+        m_isInitialized(false)
+    {
+      compute(matrix, computeEigenvectors);
+    }
+    
+    SelfAdjointEigenSolver(const MatrixType& matA, const MatrixType& matB, bool computeEigenvectors = true)
+        : m_eivec(matA.cols(), matA.cols()),
+          m_eivalues(matA.cols()),
+          m_subdiag(matA.cols() > 1 ? matA.cols() - 1 : 1),
+          m_isInitialized(false)
+    {
+      static_cast<GeneralizedSelfAdjointEigenSolver<MatrixType>*>(this)->compute(matA, matB, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);
+    }
+    
+    void compute(const MatrixType& matrix, bool computeEigenvectors)
+    {
+      compute(matrix, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);
+    }
+
+    void compute(const MatrixType& matA, const MatrixType& matB, bool computeEigenvectors = true)
+    {
+      compute(matA, matB, computeEigenvectors ? ComputeEigenvectors : EigenvaluesOnly);
+    }
+    #endif // EIGEN2_SUPPORT
+
+  protected:
+    MatrixType m_eivec;
+    RealVectorType m_eivalues;
+    typename TridiagonalizationType::SubDiagonalType m_subdiag;
+    ComputationInfo m_info;
+    bool m_isInitialized;
+    bool m_eigenvectorsOk;
+};
+
+/** \internal
+  *
+  * \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  * Performs a QR step on a tridiagonal symmetric matrix represented as a
+  * pair of two vectors \a diag and \a subdiag.
+  *
+  * \param matA the input selfadjoint matrix
+  * \param hCoeffs returned Householder coefficients
+  *
+  * For compilation efficiency reasons, this procedure does not use eigen expression
+  * for its arguments.
+  *
+  * Implemented from Golub's "Matrix Computations", algorithm 8.3.2:
+  * "implicit symmetric QR step with Wilkinson shift"
+  */
+namespace internal {
+template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
+static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n);
+}
+
+template<typename MatrixType>
+SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
+::compute(const MatrixType& matrix, int options)
+{
+  using std::abs;
+  eigen_assert(matrix.cols() == matrix.rows());
+  eigen_assert((options&~(EigVecMask|GenEigMask))==0
+          && (options&EigVecMask)!=EigVecMask
+          && "invalid option parameter");
+  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
+  Index n = matrix.cols();
+  m_eivalues.resize(n,1);
+
+  if(n==1)
+  {
+    m_eivalues.coeffRef(0,0) = internal::real(matrix.coeff(0,0));
+    if(computeEigenvectors)
+      m_eivec.setOnes(n,n);
+    m_info = Success;
+    m_isInitialized = true;
+    m_eigenvectorsOk = computeEigenvectors;
+    return *this;
+  }
+
+  // declare some aliases
+  RealVectorType& diag = m_eivalues;
+  MatrixType& mat = m_eivec;
+
+  // map the matrix coefficients to [-1:1] to avoid over- and underflow.
+  mat = matrix.template triangularView<Lower>();
+  RealScalar scale = mat.cwiseAbs().maxCoeff();
+  if(scale==RealScalar(0)) scale = RealScalar(1);
+  mat.template triangularView<Lower>() /= scale;
+  m_subdiag.resize(n-1);
+  internal::tridiagonalization_inplace(mat, diag, m_subdiag, computeEigenvectors);
+  
+  Index end = n-1;
+  Index start = 0;
+  Index iter = 0; // total number of iterations
+
+  while (end>0)
+  {
+    for (Index i = start; i<end; ++i)
+      if (internal::isMuchSmallerThan(abs(m_subdiag[i]),(abs(diag[i])+abs(diag[i+1]))))
+        m_subdiag[i] = 0;
+
+    // find the largest unreduced block
+    while (end>0 && m_subdiag[end-1]==0)
+    {
+      end--;
+    }
+    if (end<=0)
+      break;
+
+    // if we spent too many iterations, we give up
+    iter++;
+    if(iter > m_maxIterations * n) break;
+
+    start = end - 1;
+    while (start>0 && m_subdiag[start-1]!=0)
+      start--;
+
+    internal::tridiagonal_qr_step<MatrixType::Flags&RowMajorBit ? RowMajor : ColMajor>(diag.data(), m_subdiag.data(), start, end, computeEigenvectors ? m_eivec.data() : (Scalar*)0, n);
+  }
+
+  if (iter <= m_maxIterations * n)
+    m_info = Success;
+  else
+    m_info = NoConvergence;
+
+  // Sort eigenvalues and corresponding vectors.
+  // TODO make the sort optional ?
+  // TODO use a better sort algorithm !!
+  if (m_info == Success)
+  {
+    for (Index i = 0; i < n-1; ++i)
+    {
+      Index k;
+      m_eivalues.segment(i,n-i).minCoeff(&k);
+      if (k > 0)
+      {
+        std::swap(m_eivalues[i], m_eivalues[k+i]);
+        if(computeEigenvectors)
+          m_eivec.col(i).swap(m_eivec.col(k+i));
+      }
+    }
+  }
+  
+  // scale back the eigen values
+  m_eivalues *= scale;
+
+  m_isInitialized = true;
+  m_eigenvectorsOk = computeEigenvectors;
+  return *this;
+}
+
+
+namespace internal {
+  
+template<typename SolverType,int Size,bool IsComplex> struct direct_selfadjoint_eigenvalues
+{
+  static inline void run(SolverType& eig, const typename SolverType::MatrixType& A, int options)
+  { eig.compute(A,options); }
+};
+
+template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,3,false>
+{
+  typedef typename SolverType::MatrixType MatrixType;
+  typedef typename SolverType::RealVectorType VectorType;
+  typedef typename SolverType::Scalar Scalar;
+  
+  static inline void computeRoots(const MatrixType& m, VectorType& roots)
+  {
+    using std::sqrt;
+    using std::atan2;
+    using std::cos;
+    using std::sin;
+    const Scalar s_inv3 = Scalar(1.0)/Scalar(3.0);
+    const Scalar s_sqrt3 = sqrt(Scalar(3.0));
+
+    // The characteristic equation is x^3 - c2*x^2 + c1*x - c0 = 0.  The
+    // eigenvalues are the roots to this equation, all guaranteed to be
+    // real-valued, because the matrix is symmetric.
+    Scalar c0 = m(0,0)*m(1,1)*m(2,2) + Scalar(2)*m(1,0)*m(2,0)*m(2,1) - m(0,0)*m(2,1)*m(2,1) - m(1,1)*m(2,0)*m(2,0) - m(2,2)*m(1,0)*m(1,0);
+    Scalar c1 = m(0,0)*m(1,1) - m(1,0)*m(1,0) + m(0,0)*m(2,2) - m(2,0)*m(2,0) + m(1,1)*m(2,2) - m(2,1)*m(2,1);
+    Scalar c2 = m(0,0) + m(1,1) + m(2,2);
+
+    // Construct the parameters used in classifying the roots of the equation
+    // and in solving the equation for the roots in closed form.
+    Scalar c2_over_3 = c2*s_inv3;
+    Scalar a_over_3 = (c1 - c2*c2_over_3)*s_inv3;
+    if (a_over_3 > Scalar(0))
+      a_over_3 = Scalar(0);
+
+    Scalar half_b = Scalar(0.5)*(c0 + c2_over_3*(Scalar(2)*c2_over_3*c2_over_3 - c1));
+
+    Scalar q = half_b*half_b + a_over_3*a_over_3*a_over_3;
+    if (q > Scalar(0))
+      q = Scalar(0);
+
+    // Compute the eigenvalues by solving for the roots of the polynomial.
+    Scalar rho = sqrt(-a_over_3);
+    Scalar theta = atan2(sqrt(-q),half_b)*s_inv3;
+    Scalar cos_theta = cos(theta);
+    Scalar sin_theta = sin(theta);
+    roots(0) = c2_over_3 + Scalar(2)*rho*cos_theta;
+    roots(1) = c2_over_3 - rho*(cos_theta + s_sqrt3*sin_theta);
+    roots(2) = c2_over_3 - rho*(cos_theta - s_sqrt3*sin_theta);
+
+    // Sort in increasing order.
+    if (roots(0) >= roots(1))
+      std::swap(roots(0),roots(1));
+    if (roots(1) >= roots(2))
+    {
+      std::swap(roots(1),roots(2));
+      if (roots(0) >= roots(1))
+        std::swap(roots(0),roots(1));
+    }
+  }
+  
+  static inline void run(SolverType& solver, const MatrixType& mat, int options)
+  {
+    using std::sqrt;
+    eigen_assert(mat.cols() == 3 && mat.cols() == mat.rows());
+    eigen_assert((options&~(EigVecMask|GenEigMask))==0
+            && (options&EigVecMask)!=EigVecMask
+            && "invalid option parameter");
+    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
+    
+    MatrixType& eivecs = solver.m_eivec;
+    VectorType& eivals = solver.m_eivalues;
+  
+    // map the matrix coefficients to [-1:1] to avoid over- and underflow.
+    Scalar scale = mat.cwiseAbs().maxCoeff();
+    MatrixType scaledMat = mat / scale;
+
+    // compute the eigenvalues
+    computeRoots(scaledMat,eivals);
+
+    // compute the eigen vectors
+    if(computeEigenvectors)
+    {
+      Scalar safeNorm2 = Eigen::NumTraits<Scalar>::epsilon();
+      safeNorm2 *= safeNorm2;
+      if((eivals(2)-eivals(0))<=Eigen::NumTraits<Scalar>::epsilon())
+      {
+        eivecs.setIdentity();
+      }
+      else
+      {
+        scaledMat = scaledMat.template selfadjointView<Lower>();
+        MatrixType tmp;
+        tmp = scaledMat;
+
+        Scalar d0 = eivals(2) - eivals(1);
+        Scalar d1 = eivals(1) - eivals(0);
+        int k =  d0 > d1 ? 2 : 0;
+        d0 = d0 > d1 ? d1 : d0;
+
+        tmp.diagonal().array () -= eivals(k);
+        VectorType cross;
+        Scalar n;
+        n = (cross = tmp.row(0).cross(tmp.row(1))).squaredNorm();
+
+        if(n>safeNorm2)
+          eivecs.col(k) = cross / sqrt(n);
+        else
+        {
+          n = (cross = tmp.row(0).cross(tmp.row(2))).squaredNorm();
+
+          if(n>safeNorm2)
+            eivecs.col(k) = cross / sqrt(n);
+          else
+          {
+            n = (cross = tmp.row(1).cross(tmp.row(2))).squaredNorm();
+
+            if(n>safeNorm2)
+              eivecs.col(k) = cross / sqrt(n);
+            else
+            {
+              // the input matrix and/or the eigenvaues probably contains some inf/NaN,
+              // => exit
+              // scale back to the original size.
+              eivals *= scale;
+
+              solver.m_info = NumericalIssue;
+              solver.m_isInitialized = true;
+              solver.m_eigenvectorsOk = computeEigenvectors;
+              return;
+            }
+          }
+        }
+
+        tmp = scaledMat;
+        tmp.diagonal().array() -= eivals(1);
+
+        if(d0<=Eigen::NumTraits<Scalar>::epsilon())
+          eivecs.col(1) = eivecs.col(k).unitOrthogonal();
+        else
+        {
+          n = (cross = eivecs.col(k).cross(tmp.row(0).normalized())).squaredNorm();
+          if(n>safeNorm2)
+            eivecs.col(1) = cross / sqrt(n);
+          else
+          {
+            n = (cross = eivecs.col(k).cross(tmp.row(1))).squaredNorm();
+            if(n>safeNorm2)
+              eivecs.col(1) = cross / sqrt(n);
+            else
+            {
+              n = (cross = eivecs.col(k).cross(tmp.row(2))).squaredNorm();
+              if(n>safeNorm2)
+                eivecs.col(1) = cross / sqrt(n);
+              else
+              {
+                // we should never reach this point,
+                // if so the last two eigenvalues are likely to ve very closed to each other
+                eivecs.col(1) = eivecs.col(k).unitOrthogonal();
+              }
+            }
+          }
+
+          // make sure that eivecs[1] is orthogonal to eivecs[2]
+          Scalar d = eivecs.col(1).dot(eivecs.col(k));
+          eivecs.col(1) = (eivecs.col(1) - d * eivecs.col(k)).normalized();
+        }
+
+        eivecs.col(k==2 ? 0 : 2) = eivecs.col(k).cross(eivecs.col(1)).normalized();
+      }
+    }
+    // Rescale back to the original size.
+    eivals *= scale;
+    
+    solver.m_info = Success;
+    solver.m_isInitialized = true;
+    solver.m_eigenvectorsOk = computeEigenvectors;
+  }
+};
+
+// 2x2 direct eigenvalues decomposition, code from Hauke Heibel
+template<typename SolverType> struct direct_selfadjoint_eigenvalues<SolverType,2,false>
+{
+  typedef typename SolverType::MatrixType MatrixType;
+  typedef typename SolverType::RealVectorType VectorType;
+  typedef typename SolverType::Scalar Scalar;
+  
+  static inline void computeRoots(const MatrixType& m, VectorType& roots)
+  {
+    using std::sqrt;
+    const Scalar t0 = Scalar(0.5) * sqrt( abs2(m(0,0)-m(1,1)) + Scalar(4)*m(1,0)*m(1,0));
+    const Scalar t1 = Scalar(0.5) * (m(0,0) + m(1,1));
+    roots(0) = t1 - t0;
+    roots(1) = t1 + t0;
+  }
+  
+  static inline void run(SolverType& solver, const MatrixType& mat, int options)
+  {
+    using std::sqrt;
+    eigen_assert(mat.cols() == 2 && mat.cols() == mat.rows());
+    eigen_assert((options&~(EigVecMask|GenEigMask))==0
+            && (options&EigVecMask)!=EigVecMask
+            && "invalid option parameter");
+    bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors;
+    
+    MatrixType& eivecs = solver.m_eivec;
+    VectorType& eivals = solver.m_eivalues;
+  
+    // map the matrix coefficients to [-1:1] to avoid over- and underflow.
+    Scalar scale = mat.cwiseAbs().maxCoeff();
+    scale = (std::max)(scale,Scalar(1));
+    MatrixType scaledMat = mat / scale;
+    
+    // Compute the eigenvalues
+    computeRoots(scaledMat,eivals);
+    
+    // compute the eigen vectors
+    if(computeEigenvectors)
+    {
+      scaledMat.diagonal().array () -= eivals(1);
+      Scalar a2 = abs2(scaledMat(0,0));
+      Scalar c2 = abs2(scaledMat(1,1));
+      Scalar b2 = abs2(scaledMat(1,0));
+      if(a2>c2)
+      {
+        eivecs.col(1) << -scaledMat(1,0), scaledMat(0,0);
+        eivecs.col(1) /= sqrt(a2+b2);
+      }
+      else
+      {
+        eivecs.col(1) << -scaledMat(1,1), scaledMat(1,0);
+        eivecs.col(1) /= sqrt(c2+b2);
+      }
+
+      eivecs.col(0) << eivecs.col(1).unitOrthogonal();
+    }
+    
+    // Rescale back to the original size.
+    eivals *= scale;
+    
+    solver.m_info = Success;
+    solver.m_isInitialized = true;
+    solver.m_eigenvectorsOk = computeEigenvectors;
+  }
+};
+
+}
+
+template<typename MatrixType>
+SelfAdjointEigenSolver<MatrixType>& SelfAdjointEigenSolver<MatrixType>
+::computeDirect(const MatrixType& matrix, int options)
+{
+  internal::direct_selfadjoint_eigenvalues<SelfAdjointEigenSolver,Size,NumTraits<Scalar>::IsComplex>::run(*this,matrix,options);
+  return *this;
+}
+
+namespace internal {
+template<int StorageOrder,typename RealScalar, typename Scalar, typename Index>
+static void tridiagonal_qr_step(RealScalar* diag, RealScalar* subdiag, Index start, Index end, Scalar* matrixQ, Index n)
+{
+  using std::abs;
+  RealScalar td = (diag[end-1] - diag[end])*RealScalar(0.5);
+  RealScalar e = subdiag[end-1];
+  // Note that thanks to scaling, e^2 or td^2 cannot overflow, however they can still
+  // underflow thus leading to inf/NaN values when using the following commented code:
+//   RealScalar e2 = abs2(subdiag[end-1]);
+//   RealScalar mu = diag[end] - e2 / (td + (td>0 ? 1 : -1) * sqrt(td*td + e2));
+  // This explain the following, somewhat more complicated, version:
+  RealScalar mu = diag[end];
+  if(td==0)
+    mu -= abs(e);
+  else
+  {
+    RealScalar e2 = abs2(subdiag[end-1]);
+    RealScalar h = hypot(td,e);
+    if(e2==0)  mu -= (e / (td + (td>0 ? 1 : -1))) * (e / h);
+    else       mu -= e2 / (td + (td>0 ? h : -h));
+  }
+  
+  RealScalar x = diag[start] - mu;
+  RealScalar z = subdiag[start];
+  for (Index k = start; k < end; ++k)
+  {
+    JacobiRotation<RealScalar> rot;
+    rot.makeGivens(x, z);
+
+    // do T = G' T G
+    RealScalar sdk = rot.s() * diag[k] + rot.c() * subdiag[k];
+    RealScalar dkp1 = rot.s() * subdiag[k] + rot.c() * diag[k+1];
+
+    diag[k] = rot.c() * (rot.c() * diag[k] - rot.s() * subdiag[k]) - rot.s() * (rot.c() * subdiag[k] - rot.s() * diag[k+1]);
+    diag[k+1] = rot.s() * sdk + rot.c() * dkp1;
+    subdiag[k] = rot.c() * sdk - rot.s() * dkp1;
+    
+
+    if (k > start)
+      subdiag[k - 1] = rot.c() * subdiag[k-1] - rot.s() * z;
+
+    x = subdiag[k];
+
+    if (k < end - 1)
+    {
+      z = -rot.s() * subdiag[k+1];
+      subdiag[k + 1] = rot.c() * subdiag[k+1];
+    }
+    
+    // apply the givens rotation to the unit matrix Q = Q * G
+    if (matrixQ)
+    {
+      // FIXME if StorageOrder == RowMajor this operation is not very efficient
+      Map<Matrix<Scalar,Dynamic,Dynamic,StorageOrder> > q(matrixQ,n,n);
+      q.applyOnTheRight(k,k+1,rot);
+    }
+  }
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SELFADJOINTEIGENSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h
new file mode 100644
index 0000000..5de5f15
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/SelfAdjointEigenSolver_MKL.h
@@ -0,0 +1,92 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Self-adjoint eigenvalues/eigenvectors.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_SAEIGENSOLVER_MKL_H
+#define EIGEN_SAEIGENSOLVER_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_EIG_SELFADJ(EIGTYPE, MKLTYPE, MKLRTYPE, MKLNAME, EIGCOLROW, MKLCOLROW ) \
+template<> inline \
+SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >& \
+SelfAdjointEigenSolver<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW> >::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW>& matrix, int options) \
+{ \
+  eigen_assert(matrix.cols() == matrix.rows()); \
+  eigen_assert((options&~(EigVecMask|GenEigMask))==0 \
+          && (options&EigVecMask)!=EigVecMask \
+          && "invalid option parameter"); \
+  bool computeEigenvectors = (options&ComputeEigenvectors)==ComputeEigenvectors; \
+  lapack_int n = matrix.cols(), lda, matrix_order, info; \
+  m_eivalues.resize(n,1); \
+  m_subdiag.resize(n-1); \
+  m_eivec = matrix; \
+\
+  if(n==1) \
+  { \
+    m_eivalues.coeffRef(0,0) = internal::real(matrix.coeff(0,0)); \
+    if(computeEigenvectors) m_eivec.setOnes(n,n); \
+    m_info = Success; \
+    m_isInitialized = true; \
+    m_eigenvectorsOk = computeEigenvectors; \
+    return *this; \
+  } \
+\
+  lda = matrix.outerStride(); \
+  matrix_order=MKLCOLROW; \
+  char jobz, uplo='L'/*, range='A'*/; \
+  jobz = computeEigenvectors ? 'V' : 'N'; \
+\
+  info = LAPACKE_##MKLNAME( matrix_order, jobz, uplo, n, (MKLTYPE*)m_eivec.data(), lda, (MKLRTYPE*)m_eivalues.data() ); \
+  m_info = (info==0) ? Success : NoConvergence; \
+  m_isInitialized = true; \
+  m_eigenvectorsOk = computeEigenvectors; \
+  return *this; \
+}
+
+
+EIGEN_MKL_EIG_SELFADJ(double,   double,        double, dsyev, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(float,    float,         float,  ssyev, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(dcomplex, MKL_Complex16, double, zheev, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(scomplex, MKL_Complex8,  float,  cheev, ColMajor, LAPACK_COL_MAJOR)
+
+EIGEN_MKL_EIG_SELFADJ(double,   double,        double, dsyev, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(float,    float,         float,  ssyev, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(dcomplex, MKL_Complex16, double, zheev, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_EIG_SELFADJ(scomplex, MKL_Complex8,  float,  cheev, RowMajor, LAPACK_ROW_MAJOR)
+
+} // end namespace Eigen
+
+#endif // EIGEN_SAEIGENSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/Tridiagonalization.h b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/Tridiagonalization.h
new file mode 100644
index 0000000..e840876
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Eigenvalues/Tridiagonalization.h
@@ -0,0 +1,557 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Jitse Niesen <jitse at maths.leeds.ac.uk>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRIDIAGONALIZATION_H
+#define EIGEN_TRIDIAGONALIZATION_H
+
+namespace Eigen { 
+
+namespace internal {
+  
+template<typename MatrixType> struct TridiagonalizationMatrixTReturnType;
+template<typename MatrixType>
+struct traits<TridiagonalizationMatrixTReturnType<MatrixType> >
+{
+  typedef typename MatrixType::PlainObject ReturnType;
+};
+
+template<typename MatrixType, typename CoeffVectorType>
+void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs);
+}
+
+/** \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  *
+  * \class Tridiagonalization
+  *
+  * \brief Tridiagonal decomposition of a selfadjoint matrix
+  *
+  * \tparam _MatrixType the type of the matrix of which we are computing the
+  * tridiagonal decomposition; this is expected to be an instantiation of the
+  * Matrix class template.
+  *
+  * This class performs a tridiagonal decomposition of a selfadjoint matrix \f$ A \f$ such that:
+  * \f$ A = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real symmetric tridiagonal matrix.
+  *
+  * A tridiagonal matrix is a matrix which has nonzero elements only on the
+  * main diagonal and the first diagonal below and above it. The Hessenberg
+  * decomposition of a selfadjoint matrix is in fact a tridiagonal
+  * decomposition. This class is used in SelfAdjointEigenSolver to compute the
+  * eigenvalues and eigenvectors of a selfadjoint matrix.
+  *
+  * Call the function compute() to compute the tridiagonal decomposition of a
+  * given matrix. Alternatively, you can use the Tridiagonalization(const MatrixType&)
+  * constructor which computes the tridiagonal Schur decomposition at
+  * construction time. Once the decomposition is computed, you can use the
+  * matrixQ() and matrixT() functions to retrieve the matrices Q and T in the
+  * decomposition.
+  *
+  * The documentation of Tridiagonalization(const MatrixType&) contains an
+  * example of the typical use of this class.
+  *
+  * \sa class HessenbergDecomposition, class SelfAdjointEigenSolver
+  */
+template<typename _MatrixType> class Tridiagonalization
+{
+  public:
+
+    /** \brief Synonym for the template parameter \p _MatrixType. */
+    typedef _MatrixType MatrixType;
+
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+
+    enum {
+      Size = MatrixType::RowsAtCompileTime,
+      SizeMinusOne = Size == Dynamic ? Dynamic : (Size > 1 ? Size - 1 : 1),
+      Options = MatrixType::Options,
+      MaxSize = MatrixType::MaxRowsAtCompileTime,
+      MaxSizeMinusOne = MaxSize == Dynamic ? Dynamic : (MaxSize > 1 ? MaxSize - 1 : 1)
+    };
+
+    typedef Matrix<Scalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> CoeffVectorType;
+    typedef typename internal::plain_col_type<MatrixType, RealScalar>::type DiagonalType;
+    typedef Matrix<RealScalar, SizeMinusOne, 1, Options & ~RowMajor, MaxSizeMinusOne, 1> SubDiagonalType;
+    typedef typename internal::remove_all<typename MatrixType::RealReturnType>::type MatrixTypeRealView;
+    typedef internal::TridiagonalizationMatrixTReturnType<MatrixTypeRealView> MatrixTReturnType;
+
+    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+              typename internal::add_const_on_value_type<typename Diagonal<const MatrixType>::RealReturnType>::type,
+              const Diagonal<const MatrixType>
+            >::type DiagonalReturnType;
+
+    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+              typename internal::add_const_on_value_type<typename Diagonal<
+                Block<const MatrixType,SizeMinusOne,SizeMinusOne> >::RealReturnType>::type,
+              const Diagonal<
+                Block<const MatrixType,SizeMinusOne,SizeMinusOne> >
+            >::type SubDiagonalReturnType;
+
+    /** \brief Return type of matrixQ() */
+    typedef typename HouseholderSequence<MatrixType,CoeffVectorType>::ConjugateReturnType HouseholderSequenceType;
+
+    /** \brief Default constructor.
+      *
+      * \param [in]  size  Positive integer, size of the matrix whose tridiagonal
+      * decomposition will be computed.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via compute().  The \p size parameter is only
+      * used as a hint. It is not an error to give a wrong \p size, but it may
+      * impair performance.
+      *
+      * \sa compute() for an example.
+      */
+    Tridiagonalization(Index size = Size==Dynamic ? 2 : Size)
+      : m_matrix(size,size),
+        m_hCoeffs(size > 1 ? size-1 : 1),
+        m_isInitialized(false)
+    {}
+
+    /** \brief Constructor; computes tridiagonal decomposition of given matrix.
+      *
+      * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
+      * is to be computed.
+      *
+      * This constructor calls compute() to compute the tridiagonal decomposition.
+      *
+      * Example: \include Tridiagonalization_Tridiagonalization_MatrixType.cpp
+      * Output: \verbinclude Tridiagonalization_Tridiagonalization_MatrixType.out
+      */
+    Tridiagonalization(const MatrixType& matrix)
+      : m_matrix(matrix),
+        m_hCoeffs(matrix.cols() > 1 ? matrix.cols()-1 : 1),
+        m_isInitialized(false)
+    {
+      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
+      m_isInitialized = true;
+    }
+
+    /** \brief Computes tridiagonal decomposition of given matrix.
+      *
+      * \param[in]  matrix  Selfadjoint matrix whose tridiagonal decomposition
+      * is to be computed.
+      * \returns    Reference to \c *this
+      *
+      * The tridiagonal decomposition is computed by bringing the columns of
+      * the matrix successively in the required form using Householder
+      * reflections. The cost is \f$ 4n^3/3 \f$ flops, where \f$ n \f$ denotes
+      * the size of the given matrix.
+      *
+      * This method reuses of the allocated data in the Tridiagonalization
+      * object, if the size of the matrix does not change.
+      *
+      * Example: \include Tridiagonalization_compute.cpp
+      * Output: \verbinclude Tridiagonalization_compute.out
+      */
+    Tridiagonalization& compute(const MatrixType& matrix)
+    {
+      m_matrix = matrix;
+      m_hCoeffs.resize(matrix.rows()-1, 1);
+      internal::tridiagonalization_inplace(m_matrix, m_hCoeffs);
+      m_isInitialized = true;
+      return *this;
+    }
+
+    /** \brief Returns the Householder coefficients.
+      *
+      * \returns a const reference to the vector of Householder coefficients
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * The Householder coefficients allow the reconstruction of the matrix
+      * \f$ Q \f$ in the tridiagonal decomposition from the packed data.
+      *
+      * Example: \include Tridiagonalization_householderCoefficients.cpp
+      * Output: \verbinclude Tridiagonalization_householderCoefficients.out
+      *
+      * \sa packedMatrix(), \ref Householder_Module "Householder module"
+      */
+    inline CoeffVectorType householderCoefficients() const
+    {
+      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+      return m_hCoeffs;
+    }
+
+    /** \brief Returns the internal representation of the decomposition
+      *
+      *	\returns a const reference to a matrix with the internal representation
+      *	         of the decomposition.
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * The returned matrix contains the following information:
+      *  - the strict upper triangular part is equal to the input matrix A.
+      *  - the diagonal and lower sub-diagonal represent the real tridiagonal
+      *    symmetric matrix T.
+      *  - the rest of the lower part contains the Householder vectors that,
+      *    combined with Householder coefficients returned by
+      *    householderCoefficients(), allows to reconstruct the matrix Q as
+      *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+      *    Here, the matrices \f$ H_i \f$ are the Householder transformations
+      *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+      *    where \f$ h_i \f$ is the \f$ i \f$th Householder coefficient and
+      *    \f$ v_i \f$ is the Householder vector defined by
+      *       \f$ v_i = [ 0, \ldots, 0, 1, M(i+2,i), \ldots, M(N-1,i) ]^T \f$
+      *    with M the matrix returned by this function.
+      *
+      * See LAPACK for further details on this packed storage.
+      *
+      * Example: \include Tridiagonalization_packedMatrix.cpp
+      * Output: \verbinclude Tridiagonalization_packedMatrix.out
+      *
+      * \sa householderCoefficients()
+      */
+    inline const MatrixType& packedMatrix() const
+    {
+      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+      return m_matrix;
+    }
+
+    /** \brief Returns the unitary matrix Q in the decomposition
+      *
+      * \returns object representing the matrix Q
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * This function returns a light-weight object of template class
+      * HouseholderSequence. You can either apply it directly to a matrix or
+      * you can convert it to a matrix of type #MatrixType.
+      *
+      * \sa Tridiagonalization(const MatrixType&) for an example,
+      *     matrixT(), class HouseholderSequence
+      */
+    HouseholderSequenceType matrixQ() const
+    {
+      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+      return HouseholderSequenceType(m_matrix, m_hCoeffs.conjugate())
+             .setLength(m_matrix.rows() - 1)
+             .setShift(1);
+    }
+
+    /** \brief Returns an expression of the tridiagonal matrix T in the decomposition
+      *
+      * \returns expression object representing the matrix T
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * Currently, this function can be used to extract the matrix T from internal
+      * data and copy it to a dense matrix object. In most cases, it may be
+      * sufficient to directly use the packed matrix or the vector expressions
+      * returned by diagonal() and subDiagonal() instead of creating a new
+      * dense copy matrix with this function.
+      *
+      * \sa Tridiagonalization(const MatrixType&) for an example,
+      * matrixQ(), packedMatrix(), diagonal(), subDiagonal()
+      */
+    MatrixTReturnType matrixT() const
+    {
+      eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+      return MatrixTReturnType(m_matrix.real());
+    }
+
+    /** \brief Returns the diagonal of the tridiagonal matrix T in the decomposition.
+      *
+      * \returns expression representing the diagonal of T
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * Example: \include Tridiagonalization_diagonal.cpp
+      * Output: \verbinclude Tridiagonalization_diagonal.out
+      *
+      * \sa matrixT(), subDiagonal()
+      */
+    DiagonalReturnType diagonal() const;
+
+    /** \brief Returns the subdiagonal of the tridiagonal matrix T in the decomposition.
+      *
+      * \returns expression representing the subdiagonal of T
+      *
+      * \pre Either the constructor Tridiagonalization(const MatrixType&) or
+      * the member function compute(const MatrixType&) has been called before
+      * to compute the tridiagonal decomposition of a matrix.
+      *
+      * \sa diagonal() for an example, matrixT()
+      */
+    SubDiagonalReturnType subDiagonal() const;
+
+  protected:
+
+    MatrixType m_matrix;
+    CoeffVectorType m_hCoeffs;
+    bool m_isInitialized;
+};
+
+template<typename MatrixType>
+typename Tridiagonalization<MatrixType>::DiagonalReturnType
+Tridiagonalization<MatrixType>::diagonal() const
+{
+  eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+  return m_matrix.diagonal();
+}
+
+template<typename MatrixType>
+typename Tridiagonalization<MatrixType>::SubDiagonalReturnType
+Tridiagonalization<MatrixType>::subDiagonal() const
+{
+  eigen_assert(m_isInitialized && "Tridiagonalization is not initialized.");
+  Index n = m_matrix.rows();
+  return Block<const MatrixType,SizeMinusOne,SizeMinusOne>(m_matrix, 1, 0, n-1,n-1).diagonal();
+}
+
+namespace internal {
+
+/** \internal
+  * Performs a tridiagonal decomposition of the selfadjoint matrix \a matA in-place.
+  *
+  * \param[in,out] matA On input the selfadjoint matrix. Only the \b lower triangular part is referenced.
+  *                     On output, the strict upper part is left unchanged, and the lower triangular part
+  *                     represents the T and Q matrices in packed format has detailed below.
+  * \param[out]    hCoeffs returned Householder coefficients (see below)
+  *
+  * On output, the tridiagonal selfadjoint matrix T is stored in the diagonal
+  * and lower sub-diagonal of the matrix \a matA.
+  * The unitary matrix Q is represented in a compact way as a product of
+  * Householder reflectors \f$ H_i \f$ such that:
+  *       \f$ Q = H_{N-1} \ldots H_1 H_0 \f$.
+  * The Householder reflectors are defined as
+  *       \f$ H_i = (I - h_i v_i v_i^T) \f$
+  * where \f$ h_i = hCoeffs[i]\f$ is the \f$ i \f$th Householder coefficient and
+  * \f$ v_i \f$ is the Householder vector defined by
+  *       \f$ v_i = [ 0, \ldots, 0, 1, matA(i+2,i), \ldots, matA(N-1,i) ]^T \f$.
+  *
+  * Implemented from Golub's "Matrix Computations", algorithm 8.3.1.
+  *
+  * \sa Tridiagonalization::packedMatrix()
+  */
+template<typename MatrixType, typename CoeffVectorType>
+void tridiagonalization_inplace(MatrixType& matA, CoeffVectorType& hCoeffs)
+{
+  using internal::conj;
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  Index n = matA.rows();
+  eigen_assert(n==matA.cols());
+  eigen_assert(n==hCoeffs.size()+1 || n==1);
+  
+  for (Index i = 0; i<n-1; ++i)
+  {
+    Index remainingSize = n-i-1;
+    RealScalar beta;
+    Scalar h;
+    matA.col(i).tail(remainingSize).makeHouseholderInPlace(h, beta);
+
+    // Apply similarity transformation to remaining columns,
+    // i.e., A = H A H' where H = I - h v v' and v = matA.col(i).tail(n-i-1)
+    matA.col(i).coeffRef(i+1) = 1;
+
+    hCoeffs.tail(n-i-1).noalias() = (matA.bottomRightCorner(remainingSize,remainingSize).template selfadjointView<Lower>()
+                                  * (conj(h) * matA.col(i).tail(remainingSize)));
+
+    hCoeffs.tail(n-i-1) += (conj(h)*Scalar(-0.5)*(hCoeffs.tail(remainingSize).dot(matA.col(i).tail(remainingSize)))) * matA.col(i).tail(n-i-1);
+
+    matA.bottomRightCorner(remainingSize, remainingSize).template selfadjointView<Lower>()
+      .rankUpdate(matA.col(i).tail(remainingSize), hCoeffs.tail(remainingSize), -1);
+
+    matA.col(i).coeffRef(i+1) = beta;
+    hCoeffs.coeffRef(i) = h;
+  }
+}
+
+// forward declaration, implementation at the end of this file
+template<typename MatrixType,
+         int Size=MatrixType::ColsAtCompileTime,
+         bool IsComplex=NumTraits<typename MatrixType::Scalar>::IsComplex>
+struct tridiagonalization_inplace_selector;
+
+/** \brief Performs a full tridiagonalization in place
+  *
+  * \param[in,out]  mat  On input, the selfadjoint matrix whose tridiagonal
+  *    decomposition is to be computed. Only the lower triangular part referenced.
+  *    The rest is left unchanged. On output, the orthogonal matrix Q
+  *    in the decomposition if \p extractQ is true.
+  * \param[out]  diag  The diagonal of the tridiagonal matrix T in the
+  *    decomposition.
+  * \param[out]  subdiag  The subdiagonal of the tridiagonal matrix T in
+  *    the decomposition.
+  * \param[in]  extractQ  If true, the orthogonal matrix Q in the
+  *    decomposition is computed and stored in \p mat.
+  *
+  * Computes the tridiagonal decomposition of the selfadjoint matrix \p mat in place
+  * such that \f$ mat = Q T Q^* \f$ where \f$ Q \f$ is unitary and \f$ T \f$ a real
+  * symmetric tridiagonal matrix.
+  *
+  * The tridiagonal matrix T is passed to the output parameters \p diag and \p subdiag. If
+  * \p extractQ is true, then the orthogonal matrix Q is passed to \p mat. Otherwise the lower
+  * part of the matrix \p mat is destroyed.
+  *
+  * The vectors \p diag and \p subdiag are not resized. The function
+  * assumes that they are already of the correct size. The length of the
+  * vector \p diag should equal the number of rows in \p mat, and the
+  * length of the vector \p subdiag should be one left.
+  *
+  * This implementation contains an optimized path for 3-by-3 matrices
+  * which is especially useful for plane fitting.
+  *
+  * \note Currently, it requires two temporary vectors to hold the intermediate
+  * Householder coefficients, and to reconstruct the matrix Q from the Householder
+  * reflectors.
+  *
+  * Example (this uses the same matrix as the example in
+  *    Tridiagonalization::Tridiagonalization(const MatrixType&)):
+  *    \include Tridiagonalization_decomposeInPlace.cpp
+  * Output: \verbinclude Tridiagonalization_decomposeInPlace.out
+  *
+  * \sa class Tridiagonalization
+  */
+template<typename MatrixType, typename DiagonalType, typename SubDiagonalType>
+void tridiagonalization_inplace(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
+{
+  eigen_assert(mat.cols()==mat.rows() && diag.size()==mat.rows() && subdiag.size()==mat.rows()-1);
+  tridiagonalization_inplace_selector<MatrixType>::run(mat, diag, subdiag, extractQ);
+}
+
+/** \internal
+  * General full tridiagonalization
+  */
+template<typename MatrixType, int Size, bool IsComplex>
+struct tridiagonalization_inplace_selector
+{
+  typedef typename Tridiagonalization<MatrixType>::CoeffVectorType CoeffVectorType;
+  typedef typename Tridiagonalization<MatrixType>::HouseholderSequenceType HouseholderSequenceType;
+  typedef typename MatrixType::Index Index;
+  template<typename DiagonalType, typename SubDiagonalType>
+  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
+  {
+    CoeffVectorType hCoeffs(mat.cols()-1);
+    tridiagonalization_inplace(mat,hCoeffs);
+    diag = mat.diagonal().real();
+    subdiag = mat.template diagonal<-1>().real();
+    if(extractQ)
+      mat = HouseholderSequenceType(mat, hCoeffs.conjugate())
+            .setLength(mat.rows() - 1)
+            .setShift(1);
+  }
+};
+
+/** \internal
+  * Specialization for 3x3 real matrices.
+  * Especially useful for plane fitting.
+  */
+template<typename MatrixType>
+struct tridiagonalization_inplace_selector<MatrixType,3,false>
+{
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+
+  template<typename DiagonalType, typename SubDiagonalType>
+  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType& subdiag, bool extractQ)
+  {
+    using std::sqrt;
+    diag[0] = mat(0,0);
+    RealScalar v1norm2 = abs2(mat(2,0));
+    if(v1norm2 == RealScalar(0))
+    {
+      diag[1] = mat(1,1);
+      diag[2] = mat(2,2);
+      subdiag[0] = mat(1,0);
+      subdiag[1] = mat(2,1);
+      if (extractQ)
+        mat.setIdentity();
+    }
+    else
+    {
+      RealScalar beta = sqrt(abs2(mat(1,0)) + v1norm2);
+      RealScalar invBeta = RealScalar(1)/beta;
+      Scalar m01 = mat(1,0) * invBeta;
+      Scalar m02 = mat(2,0) * invBeta;
+      Scalar q = RealScalar(2)*m01*mat(2,1) + m02*(mat(2,2) - mat(1,1));
+      diag[1] = mat(1,1) + m02*q;
+      diag[2] = mat(2,2) - m02*q;
+      subdiag[0] = beta;
+      subdiag[1] = mat(2,1) - m01 * q;
+      if (extractQ)
+      {
+        mat << 1,   0,    0,
+               0, m01,  m02,
+               0, m02, -m01;
+      }
+    }
+  }
+};
+
+/** \internal
+  * Trivial specialization for 1x1 matrices
+  */
+template<typename MatrixType, bool IsComplex>
+struct tridiagonalization_inplace_selector<MatrixType,1,IsComplex>
+{
+  typedef typename MatrixType::Scalar Scalar;
+
+  template<typename DiagonalType, typename SubDiagonalType>
+  static void run(MatrixType& mat, DiagonalType& diag, SubDiagonalType&, bool extractQ)
+  {
+    diag(0,0) = real(mat(0,0));
+    if(extractQ)
+      mat(0,0) = Scalar(1);
+  }
+};
+
+/** \internal
+  * \eigenvalues_module \ingroup Eigenvalues_Module
+  *
+  * \brief Expression type for return value of Tridiagonalization::matrixT()
+  *
+  * \tparam MatrixType type of underlying dense matrix
+  */
+template<typename MatrixType> struct TridiagonalizationMatrixTReturnType
+: public ReturnByValue<TridiagonalizationMatrixTReturnType<MatrixType> >
+{
+    typedef typename MatrixType::Index Index;
+  public:
+    /** \brief Constructor.
+      *
+      * \param[in] mat The underlying dense matrix
+      */
+    TridiagonalizationMatrixTReturnType(const MatrixType& mat) : m_matrix(mat) { }
+
+    template <typename ResultType>
+    inline void evalTo(ResultType& result) const
+    {
+      result.setZero();
+      result.template diagonal<1>() = m_matrix.template diagonal<-1>().conjugate();
+      result.diagonal() = m_matrix.diagonal();
+      result.template diagonal<-1>() = m_matrix.template diagonal<-1>();
+    }
+
+    Index rows() const { return m_matrix.rows(); }
+    Index cols() const { return m_matrix.cols(); }
+
+  protected:
+    typename MatrixType::Nested m_matrix;
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRIDIAGONALIZATION_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/AlignedBox.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/AlignedBox.h
new file mode 100644
index 0000000..538a5af
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/AlignedBox.h
@@ -0,0 +1,375 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ALIGNEDBOX_H
+#define EIGEN_ALIGNEDBOX_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  *
+  * \class AlignedBox
+  *
+  * \brief An axis aligned box
+  *
+  * \param _Scalar the type of the scalar coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  *
+  * This class represents an axis aligned box as a pair of the minimal and maximal corners.
+  */
+template <typename _Scalar, int _AmbientDim>
+class AlignedBox
+{
+public:
+EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
+  enum { AmbientDimAtCompileTime = _AmbientDim };
+  typedef _Scalar                                   Scalar;
+  typedef NumTraits<Scalar>                         ScalarTraits;
+  typedef DenseIndex                                Index;
+  typedef typename ScalarTraits::Real               RealScalar;
+  typedef typename ScalarTraits::NonInteger      NonInteger;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1>  VectorType;
+
+  /** Define constants to name the corners of a 1D, 2D or 3D axis aligned bounding box */
+  enum CornerType
+  {
+    /** 1D names */
+    Min=0, Max=1,
+
+    /** Added names for 2D */
+    BottomLeft=0, BottomRight=1,
+    TopLeft=2, TopRight=3,
+
+    /** Added names for 3D */
+    BottomLeftFloor=0, BottomRightFloor=1,
+    TopLeftFloor=2, TopRightFloor=3,
+    BottomLeftCeil=4, BottomRightCeil=5,
+    TopLeftCeil=6, TopRightCeil=7
+  };
+
+
+  /** Default constructor initializing a null box. */
+  inline explicit AlignedBox()
+  { if (AmbientDimAtCompileTime!=Dynamic) setEmpty(); }
+
+  /** Constructs a null box with \a _dim the dimension of the ambient space. */
+  inline explicit AlignedBox(Index _dim) : m_min(_dim), m_max(_dim)
+  { setEmpty(); }
+
+  /** Constructs a box with extremities \a _min and \a _max. */
+  template<typename OtherVectorType1, typename OtherVectorType2>
+  inline AlignedBox(const OtherVectorType1& _min, const OtherVectorType2& _max) : m_min(_min), m_max(_max) {}
+
+  /** Constructs a box containing a single point \a p. */
+  template<typename Derived>
+  inline explicit AlignedBox(const MatrixBase<Derived>& a_p)
+  {
+    typename internal::nested<Derived,2>::type p(a_p.derived());
+    m_min = p;
+    m_max = p;
+  }
+
+  ~AlignedBox() {}
+
+  /** \returns the dimension in which the box holds */
+  inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_min.size() : Index(AmbientDimAtCompileTime); }
+
+  /** \deprecated use isEmpty */
+  inline bool isNull() const { return isEmpty(); }
+
+  /** \deprecated use setEmpty */
+  inline void setNull() { setEmpty(); }
+
+  /** \returns true if the box is empty. */
+  inline bool isEmpty() const { return (m_min.array() > m_max.array()).any(); }
+
+  /** Makes \c *this an empty box. */
+  inline void setEmpty()
+  {
+    m_min.setConstant( ScalarTraits::highest() );
+    m_max.setConstant( ScalarTraits::lowest() );
+  }
+
+  /** \returns the minimal corner */
+  inline const VectorType& (min)() const { return m_min; }
+  /** \returns a non const reference to the minimal corner */
+  inline VectorType& (min)() { return m_min; }
+  /** \returns the maximal corner */
+  inline const VectorType& (max)() const { return m_max; }
+  /** \returns a non const reference to the maximal corner */
+  inline VectorType& (max)() { return m_max; }
+
+  /** \returns the center of the box */
+  inline const CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>,
+                            const CwiseBinaryOp<internal::scalar_sum_op<Scalar>, const VectorType, const VectorType> >
+  center() const
+  { return (m_min+m_max)/2; }
+
+  /** \returns the lengths of the sides of the bounding box.
+    * Note that this function does not get the same
+    * result for integral or floating scalar types: see
+    */
+  inline const CwiseBinaryOp< internal::scalar_difference_op<Scalar>, const VectorType, const VectorType> sizes() const
+  { return m_max - m_min; }
+
+  /** \returns the volume of the bounding box */
+  inline Scalar volume() const
+  { return sizes().prod(); }
+
+  /** \returns an expression for the bounding box diagonal vector
+    * if the length of the diagonal is needed: diagonal().norm()
+    * will provide it.
+    */
+  inline CwiseBinaryOp< internal::scalar_difference_op<Scalar>, const VectorType, const VectorType> diagonal() const
+  { return sizes(); }
+
+  /** \returns the vertex of the bounding box at the corner defined by
+    * the corner-id corner. It works only for a 1D, 2D or 3D bounding box.
+    * For 1D bounding boxes corners are named by 2 enum constants:
+    * BottomLeft and BottomRight.
+    * For 2D bounding boxes, corners are named by 4 enum constants:
+    * BottomLeft, BottomRight, TopLeft, TopRight.
+    * For 3D bounding boxes, the following names are added:
+    * BottomLeftCeil, BottomRightCeil, TopLeftCeil, TopRightCeil.
+    */
+  inline VectorType corner(CornerType corner) const
+  {
+    EIGEN_STATIC_ASSERT(_AmbientDim <= 3, THIS_METHOD_IS_ONLY_FOR_VECTORS_OF_A_SPECIFIC_SIZE);
+
+    VectorType res;
+
+    Index mult = 1;
+    for(Index d=0; d<dim(); ++d)
+    {
+      if( mult & corner ) res[d] = m_max[d];
+      else                res[d] = m_min[d];
+      mult *= 2;
+    }
+    return res;
+  }
+
+  /** \returns a random point inside the bounding box sampled with
+   * a uniform distribution */
+  inline VectorType sample() const
+  {
+    VectorType r;
+    for(Index d=0; d<dim(); ++d)
+    {
+      if(!ScalarTraits::IsInteger)
+      {
+        r[d] = m_min[d] + (m_max[d]-m_min[d])
+             * internal::random<Scalar>(Scalar(0), Scalar(1));
+      }
+      else
+        r[d] = internal::random(m_min[d], m_max[d]);
+    }
+    return r;
+  }
+
+  /** \returns true if the point \a p is inside the box \c *this. */
+  template<typename Derived>
+  inline bool contains(const MatrixBase<Derived>& a_p) const
+  {
+    typename internal::nested<Derived,2>::type p(a_p.derived());
+    return (m_min.array()<=p.array()).all() && (p.array()<=m_max.array()).all();
+  }
+
+  /** \returns true if the box \a b is entirely inside the box \c *this. */
+  inline bool contains(const AlignedBox& b) const
+  { return (m_min.array()<=(b.min)().array()).all() && ((b.max)().array()<=m_max.array()).all(); }
+
+  /** Extends \c *this such that it contains the point \a p and returns a reference to \c *this. */
+  template<typename Derived>
+  inline AlignedBox& extend(const MatrixBase<Derived>& a_p)
+  {
+    typename internal::nested<Derived,2>::type p(a_p.derived());
+    m_min = m_min.cwiseMin(p);
+    m_max = m_max.cwiseMax(p);
+    return *this;
+  }
+
+  /** Extends \c *this such that it contains the box \a b and returns a reference to \c *this. */
+  inline AlignedBox& extend(const AlignedBox& b)
+  {
+    m_min = m_min.cwiseMin(b.m_min);
+    m_max = m_max.cwiseMax(b.m_max);
+    return *this;
+  }
+
+  /** Clamps \c *this by the box \a b and returns a reference to \c *this. */
+  inline AlignedBox& clamp(const AlignedBox& b)
+  {
+    m_min = m_min.cwiseMax(b.m_min);
+    m_max = m_max.cwiseMin(b.m_max);
+    return *this;
+  }
+
+  /** Returns an AlignedBox that is the intersection of \a b and \c *this */
+  inline AlignedBox intersection(const AlignedBox& b) const
+  {return AlignedBox(m_min.cwiseMax(b.m_min), m_max.cwiseMin(b.m_max)); }
+
+  /** Returns an AlignedBox that is the union of \a b and \c *this */
+  inline AlignedBox merged(const AlignedBox& b) const
+  { return AlignedBox(m_min.cwiseMin(b.m_min), m_max.cwiseMax(b.m_max)); }
+
+  /** Translate \c *this by the vector \a t and returns a reference to \c *this. */
+  template<typename Derived>
+  inline AlignedBox& translate(const MatrixBase<Derived>& a_t)
+  {
+    const typename internal::nested<Derived,2>::type t(a_t.derived());
+    m_min += t;
+    m_max += t;
+    return *this;
+  }
+
+  /** \returns the squared distance between the point \a p and the box \c *this,
+    * and zero if \a p is inside the box.
+    * \sa exteriorDistance()
+    */
+  template<typename Derived>
+  inline Scalar squaredExteriorDistance(const MatrixBase<Derived>& a_p) const;
+
+  /** \returns the squared distance between the boxes \a b and \c *this,
+    * and zero if the boxes intersect.
+    * \sa exteriorDistance()
+    */
+  inline Scalar squaredExteriorDistance(const AlignedBox& b) const;
+
+  /** \returns the distance between the point \a p and the box \c *this,
+    * and zero if \a p is inside the box.
+    * \sa squaredExteriorDistance()
+    */
+  template<typename Derived>
+  inline NonInteger exteriorDistance(const MatrixBase<Derived>& p) const
+  { using std::sqrt; return sqrt(NonInteger(squaredExteriorDistance(p))); }
+
+  /** \returns the distance between the boxes \a b and \c *this,
+    * and zero if the boxes intersect.
+    * \sa squaredExteriorDistance()
+    */
+  inline NonInteger exteriorDistance(const AlignedBox& b) const
+  { using std::sqrt; return sqrt(NonInteger(squaredExteriorDistance(b))); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<AlignedBox,
+           AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type cast() const
+  {
+    return typename internal::cast_return_type<AlignedBox,
+                    AlignedBox<NewScalarType,AmbientDimAtCompileTime> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit AlignedBox(const AlignedBox<OtherScalarType,AmbientDimAtCompileTime>& other)
+  {
+    m_min = (other.min)().template cast<Scalar>();
+    m_max = (other.max)().template cast<Scalar>();
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const AlignedBox& other, const RealScalar& prec = ScalarTraits::dummy_precision()) const
+  { return m_min.isApprox(other.m_min, prec) && m_max.isApprox(other.m_max, prec); }
+
+protected:
+
+  VectorType m_min, m_max;
+};
+
+
+
+template<typename Scalar,int AmbientDim>
+template<typename Derived>
+inline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const MatrixBase<Derived>& a_p) const
+{
+  typename internal::nested<Derived,2*AmbientDim>::type p(a_p.derived());
+  Scalar dist2(0);
+  Scalar aux;
+  for (Index k=0; k<dim(); ++k)
+  {
+    if( m_min[k] > p[k] )
+    {
+      aux = m_min[k] - p[k];
+      dist2 += aux*aux;
+    }
+    else if( p[k] > m_max[k] )
+    {
+      aux = p[k] - m_max[k];
+      dist2 += aux*aux;
+    }
+  }
+  return dist2;
+}
+
+template<typename Scalar,int AmbientDim>
+inline Scalar AlignedBox<Scalar,AmbientDim>::squaredExteriorDistance(const AlignedBox& b) const
+{
+  Scalar dist2(0);
+  Scalar aux;
+  for (Index k=0; k<dim(); ++k)
+  {
+    if( m_min[k] > b.m_max[k] )
+    {
+      aux = m_min[k] - b.m_max[k];
+      dist2 += aux*aux;
+    }
+    else if( b.m_min[k] > m_max[k] )
+    {
+      aux = b.m_min[k] - m_max[k];
+      dist2 += aux*aux;
+    }
+  }
+  return dist2;
+}
+
+/** \defgroup alignedboxtypedefs Global aligned box typedefs
+  *
+  * \ingroup Geometry_Module
+  *
+  * Eigen defines several typedef shortcuts for most common aligned box types.
+  *
+  * The general patterns are the following:
+  *
+  * \c AlignedBoxSizeType where \c Size can be \c 1, \c 2,\c 3,\c 4 for fixed size boxes or \c X for dynamic size,
+  * and where \c Type can be \c i for integer, \c f for float, \c d for double.
+  *
+  * For example, \c AlignedBox3d is a fixed-size 3x3 aligned box type of doubles, and \c AlignedBoxXf is a dynamic-size aligned box of floats.
+  *
+  * \sa class AlignedBox
+  */
+
+#define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix)    \
+/** \ingroup alignedboxtypedefs */                                 \
+typedef AlignedBox<Type, Size>   AlignedBox##SizeSuffix##TypeSuffix;
+
+#define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 1, 1) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \
+EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X)
+
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(int,                  i)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(float,                f)
+EIGEN_MAKE_TYPEDEFS_ALL_SIZES(double,               d)
+
+#undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES
+#undef EIGEN_MAKE_TYPEDEFS
+
+} // end namespace Eigen
+
+#endif // EIGEN_ALIGNEDBOX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/AngleAxis.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/AngleAxis.h
new file mode 100644
index 0000000..553d38c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/AngleAxis.h
@@ -0,0 +1,233 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ANGLEAXIS_H
+#define EIGEN_ANGLEAXIS_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class AngleAxis
+  *
+  * \brief Represents a 3D rotation as a rotation angle around an arbitrary 3D axis
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  *
+  * \warning When setting up an AngleAxis object, the axis vector \b must \b be \b normalized.
+  *
+  * The following two typedefs are provided for convenience:
+  * \li \c AngleAxisf for \c float
+  * \li \c AngleAxisd for \c double
+  *
+  * Combined with MatrixBase::Unit{X,Y,Z}, AngleAxis can be used to easily
+  * mimic Euler-angles. Here is an example:
+  * \include AngleAxis_mimic_euler.cpp
+  * Output: \verbinclude AngleAxis_mimic_euler.out
+  *
+  * \note This class is not aimed to be used to store a rotation transformation,
+  * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix)
+  * and transformation objects.
+  *
+  * \sa class Quaternion, class Transform, MatrixBase::UnitX()
+  */
+
+namespace internal {
+template<typename _Scalar> struct traits<AngleAxis<_Scalar> >
+{
+  typedef _Scalar Scalar;
+};
+}
+
+template<typename _Scalar>
+class AngleAxis : public RotationBase<AngleAxis<_Scalar>,3>
+{
+  typedef RotationBase<AngleAxis<_Scalar>,3> Base;
+
+public:
+
+  using Base::operator*;
+
+  enum { Dim = 3 };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  typedef Matrix<Scalar,3,3> Matrix3;
+  typedef Matrix<Scalar,3,1> Vector3;
+  typedef Quaternion<Scalar> QuaternionType;
+
+protected:
+
+  Vector3 m_axis;
+  Scalar m_angle;
+
+public:
+
+  /** Default constructor without initialization. */
+  AngleAxis() {}
+  /** Constructs and initialize the angle-axis rotation from an \a angle in radian
+    * and an \a axis which \b must \b be \b normalized.
+    *
+    * \warning If the \a axis vector is not normalized, then the angle-axis object
+    *          represents an invalid rotation. */
+  template<typename Derived>
+  inline AngleAxis(const Scalar& angle, const MatrixBase<Derived>& axis) : m_axis(axis), m_angle(angle) {}
+  /** Constructs and initialize the angle-axis rotation from a quaternion \a q. */
+  template<typename QuatDerived> inline explicit AngleAxis(const QuaternionBase<QuatDerived>& q) { *this = q; }
+  /** Constructs and initialize the angle-axis rotation from a 3x3 rotation matrix. */
+  template<typename Derived>
+  inline explicit AngleAxis(const MatrixBase<Derived>& m) { *this = m; }
+
+  Scalar angle() const { return m_angle; }
+  Scalar& angle() { return m_angle; }
+
+  const Vector3& axis() const { return m_axis; }
+  Vector3& axis() { return m_axis; }
+
+  /** Concatenates two rotations */
+  inline QuaternionType operator* (const AngleAxis& other) const
+  { return QuaternionType(*this) * QuaternionType(other); }
+
+  /** Concatenates two rotations */
+  inline QuaternionType operator* (const QuaternionType& other) const
+  { return QuaternionType(*this) * other; }
+
+  /** Concatenates two rotations */
+  friend inline QuaternionType operator* (const QuaternionType& a, const AngleAxis& b)
+  { return a * QuaternionType(b); }
+
+  /** \returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */
+  AngleAxis inverse() const
+  { return AngleAxis(-m_angle, m_axis); }
+
+  template<class QuatDerived>
+  AngleAxis& operator=(const QuaternionBase<QuatDerived>& q);
+  template<typename Derived>
+  AngleAxis& operator=(const MatrixBase<Derived>& m);
+
+  template<typename Derived>
+  AngleAxis& fromRotationMatrix(const MatrixBase<Derived>& m);
+  Matrix3 toRotationMatrix(void) const;
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type cast() const
+  { return typename internal::cast_return_type<AngleAxis,AngleAxis<NewScalarType> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit AngleAxis(const AngleAxis<OtherScalarType>& other)
+  {
+    m_axis = other.axis().template cast<Scalar>();
+    m_angle = Scalar(other.angle());
+  }
+
+  static inline const AngleAxis Identity() { return AngleAxis(0, Vector3::UnitX()); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const AngleAxis& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return m_axis.isApprox(other.m_axis, prec) && internal::isApprox(m_angle,other.m_angle, prec); }
+};
+
+/** \ingroup Geometry_Module
+  * single precision angle-axis type */
+typedef AngleAxis<float> AngleAxisf;
+/** \ingroup Geometry_Module
+  * double precision angle-axis type */
+typedef AngleAxis<double> AngleAxisd;
+
+/** Set \c *this from a \b unit quaternion.
+  * The axis is normalized.
+  * 
+  * \warning As any other method dealing with quaternion, if the input quaternion
+  *          is not normalized then the result is undefined.
+  */
+template<typename Scalar>
+template<typename QuatDerived>
+AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const QuaternionBase<QuatDerived>& q)
+{
+  using std::acos;
+  using std::min;
+  using std::max;
+  using std::sqrt;
+  Scalar n2 = q.vec().squaredNorm();
+  if (n2 < NumTraits<Scalar>::dummy_precision()*NumTraits<Scalar>::dummy_precision())
+  {
+    m_angle = 0;
+    m_axis << 1, 0, 0;
+  }
+  else
+  {
+    m_angle = Scalar(2)*acos((min)((max)(Scalar(-1),q.w()),Scalar(1)));
+    m_axis = q.vec() / sqrt(n2);
+  }
+  return *this;
+}
+
+/** Set \c *this from a 3x3 rotation matrix \a mat.
+  */
+template<typename Scalar>
+template<typename Derived>
+AngleAxis<Scalar>& AngleAxis<Scalar>::operator=(const MatrixBase<Derived>& mat)
+{
+  // Since a direct conversion would not be really faster,
+  // let's use the robust Quaternion implementation:
+  return *this = QuaternionType(mat);
+}
+
+/**
+* \brief Sets \c *this from a 3x3 rotation matrix.
+**/
+template<typename Scalar>
+template<typename Derived>
+AngleAxis<Scalar>& AngleAxis<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
+{
+  return *this = QuaternionType(mat);
+}
+
+/** Constructs and \returns an equivalent 3x3 rotation matrix.
+  */
+template<typename Scalar>
+typename AngleAxis<Scalar>::Matrix3
+AngleAxis<Scalar>::toRotationMatrix(void) const
+{
+  using std::sin;
+  using std::cos;
+  Matrix3 res;
+  Vector3 sin_axis  = sin(m_angle) * m_axis;
+  Scalar c = cos(m_angle);
+  Vector3 cos1_axis = (Scalar(1)-c) * m_axis;
+
+  Scalar tmp;
+  tmp = cos1_axis.x() * m_axis.y();
+  res.coeffRef(0,1) = tmp - sin_axis.z();
+  res.coeffRef(1,0) = tmp + sin_axis.z();
+
+  tmp = cos1_axis.x() * m_axis.z();
+  res.coeffRef(0,2) = tmp + sin_axis.y();
+  res.coeffRef(2,0) = tmp - sin_axis.y();
+
+  tmp = cos1_axis.y() * m_axis.z();
+  res.coeffRef(1,2) = tmp - sin_axis.x();
+  res.coeffRef(2,1) = tmp + sin_axis.x();
+
+  res.diagonal() = (cos1_axis.cwiseProduct(m_axis)).array() + c;
+
+  return res;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ANGLEAXIS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Geometry/CMakeLists.txt
new file mode 100644
index 0000000..f8f728b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/CMakeLists.txt
@@ -0,0 +1,8 @@
+FILE(GLOB Eigen_Geometry_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Geometry_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Geometry COMPONENT Devel
+  )
+
+ADD_SUBDIRECTORY(arch)
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/EulerAngles.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/EulerAngles.h
new file mode 100644
index 0000000..2163077
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/EulerAngles.h
@@ -0,0 +1,85 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_EULERANGLES_H
+#define EIGEN_EULERANGLES_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  *
+  * \returns the Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a a0,\a a1,\a a2)
+  *
+  * Each of the three parameters \a a0,\a a1,\a a2 represents the respective rotation axis as an integer in {0,1,2}.
+  * For instance, in:
+  * \code Vector3f ea = mat.eulerAngles(2, 0, 2); \endcode
+  * "2" represents the z axis and "0" the x axis, etc. The returned angles are such that
+  * we have the following equality:
+  * \code
+  * mat == AngleAxisf(ea[0], Vector3f::UnitZ())
+  *      * AngleAxisf(ea[1], Vector3f::UnitX())
+  *      * AngleAxisf(ea[2], Vector3f::UnitZ()); \endcode
+  * This corresponds to the right-multiply conventions (with right hand side frames).
+  */
+template<typename Derived>
+inline Matrix<typename MatrixBase<Derived>::Scalar,3,1>
+MatrixBase<Derived>::eulerAngles(Index a0, Index a1, Index a2) const
+{
+  using std::atan2;
+  /* Implemented from Graphics Gems IV */
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Derived,3,3)
+
+  Matrix<Scalar,3,1> res;
+  typedef Matrix<typename Derived::Scalar,2,1> Vector2;
+  const Scalar epsilon = NumTraits<Scalar>::dummy_precision();
+
+  const Index odd = ((a0+1)%3 == a1) ? 0 : 1;
+  const Index i = a0;
+  const Index j = (a0 + 1 + odd)%3;
+  const Index k = (a0 + 2 - odd)%3;
+
+  if (a0==a2)
+  {
+    Scalar s = Vector2(coeff(j,i) , coeff(k,i)).norm();
+    res[1] = atan2(s, coeff(i,i));
+    if (s > epsilon)
+    {
+      res[0] = atan2(coeff(j,i), coeff(k,i));
+      res[2] = atan2(coeff(i,j),-coeff(i,k));
+    }
+    else
+    {
+      res[0] = Scalar(0);
+      res[2] = (coeff(i,i)>0?1:-1)*atan2(-coeff(k,j), coeff(j,j));
+    }
+  }
+  else
+  {
+    Scalar c = Vector2(coeff(i,i) , coeff(i,j)).norm();
+    res[1] = atan2(-coeff(i,k), c);
+    if (c > epsilon)
+    {
+      res[0] = atan2(coeff(j,k), coeff(k,k));
+      res[2] = atan2(coeff(i,j), coeff(i,i));
+    }
+    else
+    {
+      res[0] = Scalar(0);
+      res[2] = (coeff(i,k)>0?1:-1)*atan2(-coeff(k,j), coeff(j,j));
+    }
+  }
+  if (!odd)
+    res = -res;
+  return res;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_EULERANGLES_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Homogeneous.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Homogeneous.h
new file mode 100644
index 0000000..df03feb
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Homogeneous.h
@@ -0,0 +1,307 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_HOMOGENEOUS_H
+#define EIGEN_HOMOGENEOUS_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Homogeneous
+  *
+  * \brief Expression of one (or a set of) homogeneous vector(s)
+  *
+  * \param MatrixType the type of the object in which we are making homogeneous
+  *
+  * This class represents an expression of one (or a set of) homogeneous vector(s).
+  * It is the return type of MatrixBase::homogeneous() and most of the time
+  * this is the only way it is used.
+  *
+  * \sa MatrixBase::homogeneous()
+  */
+
+namespace internal {
+
+template<typename MatrixType,int Direction>
+struct traits<Homogeneous<MatrixType,Direction> >
+ : traits<MatrixType>
+{
+  typedef typename traits<MatrixType>::StorageKind StorageKind;
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+  enum {
+    RowsPlusOne = (MatrixType::RowsAtCompileTime != Dynamic) ?
+                  int(MatrixType::RowsAtCompileTime) + 1 : Dynamic,
+    ColsPlusOne = (MatrixType::ColsAtCompileTime != Dynamic) ?
+                  int(MatrixType::ColsAtCompileTime) + 1 : Dynamic,
+    RowsAtCompileTime = Direction==Vertical  ?  RowsPlusOne : MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = Direction==Horizontal ? ColsPlusOne : MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = RowsAtCompileTime,
+    MaxColsAtCompileTime = ColsAtCompileTime,
+    TmpFlags = _MatrixTypeNested::Flags & HereditaryBits,
+    Flags = ColsAtCompileTime==1 ? (TmpFlags & ~RowMajorBit)
+          : RowsAtCompileTime==1 ? (TmpFlags | RowMajorBit)
+          : TmpFlags,
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost
+  };
+};
+
+template<typename MatrixType,typename Lhs> struct homogeneous_left_product_impl;
+template<typename MatrixType,typename Rhs> struct homogeneous_right_product_impl;
+
+} // end namespace internal
+
+template<typename MatrixType,int _Direction> class Homogeneous
+  : public MatrixBase<Homogeneous<MatrixType,_Direction> >
+{
+  public:
+
+    enum { Direction = _Direction };
+
+    typedef MatrixBase<Homogeneous> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(Homogeneous)
+
+    inline Homogeneous(const MatrixType& matrix)
+      : m_matrix(matrix)
+    {}
+
+    inline Index rows() const { return m_matrix.rows() + (int(Direction)==Vertical   ? 1 : 0); }
+    inline Index cols() const { return m_matrix.cols() + (int(Direction)==Horizontal ? 1 : 0); }
+
+    inline Scalar coeff(Index row, Index col) const
+    {
+      if(  (int(Direction)==Vertical   && row==m_matrix.rows())
+        || (int(Direction)==Horizontal && col==m_matrix.cols()))
+        return 1;
+      return m_matrix.coeff(row, col);
+    }
+
+    template<typename Rhs>
+    inline const internal::homogeneous_right_product_impl<Homogeneous,Rhs>
+    operator* (const MatrixBase<Rhs>& rhs) const
+    {
+      eigen_assert(int(Direction)==Horizontal);
+      return internal::homogeneous_right_product_impl<Homogeneous,Rhs>(m_matrix,rhs.derived());
+    }
+
+    template<typename Lhs> friend
+    inline const internal::homogeneous_left_product_impl<Homogeneous,Lhs>
+    operator* (const MatrixBase<Lhs>& lhs, const Homogeneous& rhs)
+    {
+      eigen_assert(int(Direction)==Vertical);
+      return internal::homogeneous_left_product_impl<Homogeneous,Lhs>(lhs.derived(),rhs.m_matrix);
+    }
+
+    template<typename Scalar, int Dim, int Mode, int Options> friend
+    inline const internal::homogeneous_left_product_impl<Homogeneous,Transform<Scalar,Dim,Mode,Options> >
+    operator* (const Transform<Scalar,Dim,Mode,Options>& lhs, const Homogeneous& rhs)
+    {
+      eigen_assert(int(Direction)==Vertical);
+      return internal::homogeneous_left_product_impl<Homogeneous,Transform<Scalar,Dim,Mode,Options> >(lhs,rhs.m_matrix);
+    }
+
+  protected:
+    typename MatrixType::Nested m_matrix;
+};
+
+/** \geometry_module
+  *
+  * \return an expression of the equivalent homogeneous vector
+  *
+  * \only_for_vectors
+  *
+  * Example: \include MatrixBase_homogeneous.cpp
+  * Output: \verbinclude MatrixBase_homogeneous.out
+  *
+  * \sa class Homogeneous
+  */
+template<typename Derived>
+inline typename MatrixBase<Derived>::HomogeneousReturnType
+MatrixBase<Derived>::homogeneous() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  return derived();
+}
+
+/** \geometry_module
+  *
+  * \returns a matrix expression of homogeneous column (or row) vectors
+  *
+  * Example: \include VectorwiseOp_homogeneous.cpp
+  * Output: \verbinclude VectorwiseOp_homogeneous.out
+  *
+  * \sa MatrixBase::homogeneous() */
+template<typename ExpressionType, int Direction>
+inline Homogeneous<ExpressionType,Direction>
+VectorwiseOp<ExpressionType,Direction>::homogeneous() const
+{
+  return _expression();
+}
+
+/** \geometry_module
+  *
+  * \returns an expression of the homogeneous normalized vector of \c *this
+  *
+  * Example: \include MatrixBase_hnormalized.cpp
+  * Output: \verbinclude MatrixBase_hnormalized.out
+  *
+  * \sa VectorwiseOp::hnormalized() */
+template<typename Derived>
+inline const typename MatrixBase<Derived>::HNormalizedReturnType
+MatrixBase<Derived>::hnormalized() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived);
+  return ConstStartMinusOne(derived(),0,0,
+    ColsAtCompileTime==1?size()-1:1,
+    ColsAtCompileTime==1?1:size()-1) / coeff(size()-1);
+}
+
+/** \geometry_module
+  *
+  * \returns an expression of the homogeneous normalized vector of \c *this
+  *
+  * Example: \include DirectionWise_hnormalized.cpp
+  * Output: \verbinclude DirectionWise_hnormalized.out
+  *
+  * \sa MatrixBase::hnormalized() */
+template<typename ExpressionType, int Direction>
+inline const typename VectorwiseOp<ExpressionType,Direction>::HNormalizedReturnType
+VectorwiseOp<ExpressionType,Direction>::hnormalized() const
+{
+  return HNormalized_Block(_expression(),0,0,
+      Direction==Vertical   ? _expression().rows()-1 : _expression().rows(),
+      Direction==Horizontal ? _expression().cols()-1 : _expression().cols()).cwiseQuotient(
+      Replicate<HNormalized_Factors,
+                Direction==Vertical   ? HNormalized_SizeMinusOne : 1,
+                Direction==Horizontal ? HNormalized_SizeMinusOne : 1>
+        (HNormalized_Factors(_expression(),
+          Direction==Vertical    ? _expression().rows()-1:0,
+          Direction==Horizontal  ? _expression().cols()-1:0,
+          Direction==Vertical    ? 1 : _expression().rows(),
+          Direction==Horizontal  ? 1 : _expression().cols()),
+         Direction==Vertical   ? _expression().rows()-1 : 1,
+         Direction==Horizontal ? _expression().cols()-1 : 1));
+}
+
+namespace internal {
+
+template<typename MatrixOrTransformType>
+struct take_matrix_for_product
+{
+  typedef MatrixOrTransformType type;
+  static const type& run(const type &x) { return x; }
+};
+
+template<typename Scalar, int Dim, int Mode,int Options>
+struct take_matrix_for_product<Transform<Scalar, Dim, Mode, Options> >
+{
+  typedef Transform<Scalar, Dim, Mode, Options> TransformType;
+  typedef typename internal::add_const<typename TransformType::ConstAffinePart>::type type;
+  static type run (const TransformType& x) { return x.affine(); }
+};
+
+template<typename Scalar, int Dim, int Options>
+struct take_matrix_for_product<Transform<Scalar, Dim, Projective, Options> >
+{
+  typedef Transform<Scalar, Dim, Projective, Options> TransformType;
+  typedef typename TransformType::MatrixType type;
+  static const type& run (const TransformType& x) { return x.matrix(); }
+};
+
+template<typename MatrixType,typename Lhs>
+struct traits<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
+{
+  typedef typename take_matrix_for_product<Lhs>::type LhsMatrixType;
+  typedef typename remove_all<MatrixType>::type MatrixTypeCleaned;
+  typedef typename remove_all<LhsMatrixType>::type LhsMatrixTypeCleaned;
+  typedef typename make_proper_matrix_type<
+                 typename traits<MatrixTypeCleaned>::Scalar,
+                 LhsMatrixTypeCleaned::RowsAtCompileTime,
+                 MatrixTypeCleaned::ColsAtCompileTime,
+                 MatrixTypeCleaned::PlainObject::Options,
+                 LhsMatrixTypeCleaned::MaxRowsAtCompileTime,
+                 MatrixTypeCleaned::MaxColsAtCompileTime>::type ReturnType;
+};
+
+template<typename MatrixType,typename Lhs>
+struct homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs>
+  : public ReturnByValue<homogeneous_left_product_impl<Homogeneous<MatrixType,Vertical>,Lhs> >
+{
+  typedef typename traits<homogeneous_left_product_impl>::LhsMatrixType LhsMatrixType;
+  typedef typename remove_all<LhsMatrixType>::type LhsMatrixTypeCleaned;
+  typedef typename remove_all<typename LhsMatrixTypeCleaned::Nested>::type LhsMatrixTypeNested;
+  typedef typename MatrixType::Index Index;
+  homogeneous_left_product_impl(const Lhs& lhs, const MatrixType& rhs)
+    : m_lhs(take_matrix_for_product<Lhs>::run(lhs)),
+      m_rhs(rhs)
+  {}
+
+  inline Index rows() const { return m_lhs.rows(); }
+  inline Index cols() const { return m_rhs.cols(); }
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    // FIXME investigate how to allow lazy evaluation of this product when possible
+    dst = Block<const LhsMatrixTypeNested,
+              LhsMatrixTypeNested::RowsAtCompileTime,
+              LhsMatrixTypeNested::ColsAtCompileTime==Dynamic?Dynamic:LhsMatrixTypeNested::ColsAtCompileTime-1>
+            (m_lhs,0,0,m_lhs.rows(),m_lhs.cols()-1) * m_rhs;
+    dst += m_lhs.col(m_lhs.cols()-1).rowwise()
+            .template replicate<MatrixType::ColsAtCompileTime>(m_rhs.cols());
+  }
+
+  typename LhsMatrixTypeCleaned::Nested m_lhs;
+  typename MatrixType::Nested m_rhs;
+};
+
+template<typename MatrixType,typename Rhs>
+struct traits<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
+{
+  typedef typename make_proper_matrix_type<typename traits<MatrixType>::Scalar,
+                 MatrixType::RowsAtCompileTime,
+                 Rhs::ColsAtCompileTime,
+                 MatrixType::PlainObject::Options,
+                 MatrixType::MaxRowsAtCompileTime,
+                 Rhs::MaxColsAtCompileTime>::type ReturnType;
+};
+
+template<typename MatrixType,typename Rhs>
+struct homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs>
+  : public ReturnByValue<homogeneous_right_product_impl<Homogeneous<MatrixType,Horizontal>,Rhs> >
+{
+  typedef typename remove_all<typename Rhs::Nested>::type RhsNested;
+  typedef typename MatrixType::Index Index;
+  homogeneous_right_product_impl(const MatrixType& lhs, const Rhs& rhs)
+    : m_lhs(lhs), m_rhs(rhs)
+  {}
+
+  inline Index rows() const { return m_lhs.rows(); }
+  inline Index cols() const { return m_rhs.cols(); }
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    // FIXME investigate how to allow lazy evaluation of this product when possible
+    dst = m_lhs * Block<const RhsNested,
+                        RhsNested::RowsAtCompileTime==Dynamic?Dynamic:RhsNested::RowsAtCompileTime-1,
+                        RhsNested::ColsAtCompileTime>
+            (m_rhs,0,0,m_rhs.rows()-1,m_rhs.cols());
+    dst += m_rhs.row(m_rhs.rows()-1).colwise()
+            .template replicate<MatrixType::RowsAtCompileTime>(m_lhs.rows());
+  }
+
+  typename MatrixType::Nested m_lhs;
+  typename Rhs::Nested m_rhs;
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_HOMOGENEOUS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Hyperplane.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Hyperplane.h
new file mode 100644
index 0000000..6b31efd
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Hyperplane.h
@@ -0,0 +1,270 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_HYPERPLANE_H
+#define EIGEN_HYPERPLANE_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Hyperplane
+  *
+  * \brief A hyperplane
+  *
+  * A hyperplane is an affine subspace of dimension n-1 in a space of dimension n.
+  * For example, a hyperplane in a plane is a line; a hyperplane in 3-space is a plane.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  *             Notice that the dimension of the hyperplane is _AmbientDim-1.
+  *
+  * This class represents an hyperplane as the zero set of the implicit equation
+  * \f$ n \cdot x + d = 0 \f$ where \f$ n \f$ is a unit normal vector of the plane (linear part)
+  * and \f$ d \f$ is the distance (offset) to the origin.
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+class Hyperplane
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim==Dynamic ? Dynamic : _AmbientDim+1)
+  enum {
+    AmbientDimAtCompileTime = _AmbientDim,
+    Options = _Options
+  };
+  typedef _Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef DenseIndex Index;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1> VectorType;
+  typedef Matrix<Scalar,Index(AmbientDimAtCompileTime)==Dynamic
+                        ? Dynamic
+                        : Index(AmbientDimAtCompileTime)+1,1,Options> Coefficients;
+  typedef Block<Coefficients,AmbientDimAtCompileTime,1> NormalReturnType;
+  typedef const Block<const Coefficients,AmbientDimAtCompileTime,1> ConstNormalReturnType;
+
+  /** Default constructor without initialization */
+  inline explicit Hyperplane() {}
+  
+  template<int OtherOptions>
+  Hyperplane(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
+   : m_coeffs(other.coeffs())
+  {}
+
+  /** Constructs a dynamic-size hyperplane with \a _dim the dimension
+    * of the ambient space */
+  inline explicit Hyperplane(Index _dim) : m_coeffs(_dim+1) {}
+
+  /** Construct a plane from its normal \a n and a point \a e onto the plane.
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline Hyperplane(const VectorType& n, const VectorType& e)
+    : m_coeffs(n.size()+1)
+  {
+    normal() = n;
+    offset() = -n.dot(e);
+  }
+
+  /** Constructs a plane from its normal \a n and distance to the origin \a d
+    * such that the algebraic equation of the plane is \f$ n \cdot x + d = 0 \f$.
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline Hyperplane(const VectorType& n, const Scalar& d)
+    : m_coeffs(n.size()+1)
+  {
+    normal() = n;
+    offset() = d;
+  }
+
+  /** Constructs a hyperplane passing through the two points. If the dimension of the ambient space
+    * is greater than 2, then there isn't uniqueness, so an arbitrary choice is made.
+    */
+  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1)
+  {
+    Hyperplane result(p0.size());
+    result.normal() = (p1 - p0).unitOrthogonal();
+    result.offset() = -p0.dot(result.normal());
+    return result;
+  }
+
+  /** Constructs a hyperplane passing through the three points. The dimension of the ambient space
+    * is required to be exactly 3.
+    */
+  static inline Hyperplane Through(const VectorType& p0, const VectorType& p1, const VectorType& p2)
+  {
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 3)
+    Hyperplane result(p0.size());
+    result.normal() = (p2 - p0).cross(p1 - p0).normalized();
+    result.offset() = -p0.dot(result.normal());
+    return result;
+  }
+
+  /** Constructs a hyperplane passing through the parametrized line \a parametrized.
+    * If the dimension of the ambient space is greater than 2, then there isn't uniqueness,
+    * so an arbitrary choice is made.
+    */
+  // FIXME to be consitent with the rest this could be implemented as a static Through function ??
+  explicit Hyperplane(const ParametrizedLine<Scalar, AmbientDimAtCompileTime>& parametrized)
+  {
+    normal() = parametrized.direction().unitOrthogonal();
+    offset() = -parametrized.origin().dot(normal());
+  }
+
+  ~Hyperplane() {}
+
+  /** \returns the dimension in which the plane holds */
+  inline Index dim() const { return AmbientDimAtCompileTime==Dynamic ? m_coeffs.size()-1 : Index(AmbientDimAtCompileTime); }
+
+  /** normalizes \c *this */
+  void normalize(void)
+  {
+    m_coeffs /= normal().norm();
+  }
+
+  /** \returns the signed distance between the plane \c *this and a point \a p.
+    * \sa absDistance()
+    */
+  inline Scalar signedDistance(const VectorType& p) const { return normal().dot(p) + offset(); }
+
+  /** \returns the absolute distance between the plane \c *this and a point \a p.
+    * \sa signedDistance()
+    */
+  inline Scalar absDistance(const VectorType& p) const { using std::abs; return abs(signedDistance(p)); }
+
+  /** \returns the projection of a point \a p onto the plane \c *this.
+    */
+  inline VectorType projection(const VectorType& p) const { return p - signedDistance(p) * normal(); }
+
+  /** \returns a constant reference to the unit normal vector of the plane, which corresponds
+    * to the linear part of the implicit equation.
+    */
+  inline ConstNormalReturnType normal() const { return ConstNormalReturnType(m_coeffs,0,0,dim(),1); }
+
+  /** \returns a non-constant reference to the unit normal vector of the plane, which corresponds
+    * to the linear part of the implicit equation.
+    */
+  inline NormalReturnType normal() { return NormalReturnType(m_coeffs,0,0,dim(),1); }
+
+  /** \returns the distance to the origin, which is also the "constant term" of the implicit equation
+    * \warning the vector normal is assumed to be normalized.
+    */
+  inline const Scalar& offset() const { return m_coeffs.coeff(dim()); }
+
+  /** \returns a non-constant reference to the distance to the origin, which is also the constant part
+    * of the implicit equation */
+  inline Scalar& offset() { return m_coeffs(dim()); }
+
+  /** \returns a constant reference to the coefficients c_i of the plane equation:
+    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+    */
+  inline const Coefficients& coeffs() const { return m_coeffs; }
+
+  /** \returns a non-constant reference to the coefficients c_i of the plane equation:
+    * \f$ c_0*x_0 + ... + c_{d-1}*x_{d-1} + c_d = 0 \f$
+    */
+  inline Coefficients& coeffs() { return m_coeffs; }
+
+  /** \returns the intersection of *this with \a other.
+    *
+    * \warning The ambient space must be a plane, i.e. have dimension 2, so that \c *this and \a other are lines.
+    *
+    * \note If \a other is approximately parallel to *this, this method will return any point on *this.
+    */
+  VectorType intersection(const Hyperplane& other) const
+  {
+    using std::abs;
+    EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
+    Scalar det = coeffs().coeff(0) * other.coeffs().coeff(1) - coeffs().coeff(1) * other.coeffs().coeff(0);
+    // since the line equations ax+by=c are normalized with a^2+b^2=1, the following tests
+    // whether the two lines are approximately parallel.
+    if(internal::isMuchSmallerThan(det, Scalar(1)))
+    {   // special case where the two lines are approximately parallel. Pick any point on the first line.
+        if(abs(coeffs().coeff(1))>abs(coeffs().coeff(0)))
+            return VectorType(coeffs().coeff(1), -coeffs().coeff(2)/coeffs().coeff(1)-coeffs().coeff(0));
+        else
+            return VectorType(-coeffs().coeff(2)/coeffs().coeff(0)-coeffs().coeff(1), coeffs().coeff(0));
+    }
+    else
+    {   // general case
+        Scalar invdet = Scalar(1) / det;
+        return VectorType(invdet*(coeffs().coeff(1)*other.coeffs().coeff(2)-other.coeffs().coeff(1)*coeffs().coeff(2)),
+                          invdet*(other.coeffs().coeff(0)*coeffs().coeff(2)-coeffs().coeff(0)*other.coeffs().coeff(2)));
+    }
+  }
+
+  /** Applies the transformation matrix \a mat to \c *this and returns a reference to \c *this.
+    *
+    * \param mat the Dim x Dim transformation matrix
+    * \param traits specifies whether the matrix \a mat represents an #Isometry
+    *               or a more generic #Affine transformation. The default is #Affine.
+    */
+  template<typename XprType>
+  inline Hyperplane& transform(const MatrixBase<XprType>& mat, TransformTraits traits = Affine)
+  {
+    if (traits==Affine)
+      normal() = mat.inverse().transpose() * normal();
+    else if (traits==Isometry)
+      normal() = mat * normal();
+    else
+    {
+      eigen_assert(0 && "invalid traits value in Hyperplane::transform()");
+    }
+    return *this;
+  }
+
+  /** Applies the transformation \a t to \c *this and returns a reference to \c *this.
+    *
+    * \param t the transformation of dimension Dim
+    * \param traits specifies whether the transformation \a t represents an #Isometry
+    *               or a more generic #Affine transformation. The default is #Affine.
+    *               Other kind of transformations are not supported.
+    */
+  template<int TrOptions>
+  inline Hyperplane& transform(const Transform<Scalar,AmbientDimAtCompileTime,Affine,TrOptions>& t,
+                                TransformTraits traits = Affine)
+  {
+    transform(t.linear(), traits);
+    offset() -= normal().dot(t.translation());
+    return *this;
+  }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Hyperplane,
+           Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
+  {
+    return typename internal::cast_return_type<Hyperplane,
+                    Hyperplane<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType,int OtherOptions>
+  inline explicit Hyperplane(const Hyperplane<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  template<int OtherOptions>
+  bool isApprox(const Hyperplane<Scalar,AmbientDimAtCompileTime,OtherOptions>& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+protected:
+
+  Coefficients m_coeffs;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_HYPERPLANE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/OrthoMethods.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/OrthoMethods.h
new file mode 100644
index 0000000..4c1bf5f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/OrthoMethods.h
@@ -0,0 +1,218 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ORTHOMETHODS_H
+#define EIGEN_ORTHOMETHODS_H
+
+namespace Eigen { 
+
+/** \geometry_module
+  *
+  * \returns the cross product of \c *this and \a other
+  *
+  * Here is a very good explanation of cross-product: http://xkcd.com/199/
+  * \sa MatrixBase::cross3()
+  */
+template<typename Derived>
+template<typename OtherDerived>
+inline typename MatrixBase<Derived>::template cross_product_return_type<OtherDerived>::type
+MatrixBase<Derived>::cross(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,3)
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)
+
+  // Note that there is no need for an expression here since the compiler
+  // optimize such a small temporary very well (even within a complex expression)
+  typename internal::nested<Derived,2>::type lhs(derived());
+  typename internal::nested<OtherDerived,2>::type rhs(other.derived());
+  return typename cross_product_return_type<OtherDerived>::type(
+    internal::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
+    internal::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
+    internal::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0))
+  );
+}
+
+namespace internal {
+
+template< int Arch,typename VectorLhs,typename VectorRhs,
+          typename Scalar = typename VectorLhs::Scalar,
+          bool Vectorizable = bool((VectorLhs::Flags&VectorRhs::Flags)&PacketAccessBit)>
+struct cross3_impl {
+  static inline typename internal::plain_matrix_type<VectorLhs>::type
+  run(const VectorLhs& lhs, const VectorRhs& rhs)
+  {
+    return typename internal::plain_matrix_type<VectorLhs>::type(
+      internal::conj(lhs.coeff(1) * rhs.coeff(2) - lhs.coeff(2) * rhs.coeff(1)),
+      internal::conj(lhs.coeff(2) * rhs.coeff(0) - lhs.coeff(0) * rhs.coeff(2)),
+      internal::conj(lhs.coeff(0) * rhs.coeff(1) - lhs.coeff(1) * rhs.coeff(0)),
+      0
+    );
+  }
+};
+
+}
+
+/** \geometry_module
+  *
+  * \returns the cross product of \c *this and \a other using only the x, y, and z coefficients
+  *
+  * The size of \c *this and \a other must be four. This function is especially useful
+  * when using 4D vectors instead of 3D ones to get advantage of SSE/AltiVec vectorization.
+  *
+  * \sa MatrixBase::cross()
+  */
+template<typename Derived>
+template<typename OtherDerived>
+inline typename MatrixBase<Derived>::PlainObject
+MatrixBase<Derived>::cross3(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Derived,4)
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,4)
+
+  typedef typename internal::nested<Derived,2>::type DerivedNested;
+  typedef typename internal::nested<OtherDerived,2>::type OtherDerivedNested;
+  DerivedNested lhs(derived());
+  OtherDerivedNested rhs(other.derived());
+
+  return internal::cross3_impl<Architecture::Target,
+                        typename internal::remove_all<DerivedNested>::type,
+                        typename internal::remove_all<OtherDerivedNested>::type>::run(lhs,rhs);
+}
+
+/** \returns a matrix expression of the cross product of each column or row
+  * of the referenced expression with the \a other vector.
+  *
+  * The referenced matrix must have one dimension equal to 3.
+  * The result matrix has the same dimensions than the referenced one.
+  *
+  * \geometry_module
+  *
+  * \sa MatrixBase::cross() */
+template<typename ExpressionType, int Direction>
+template<typename OtherDerived>
+const typename VectorwiseOp<ExpressionType,Direction>::CrossReturnType
+VectorwiseOp<ExpressionType,Direction>::cross(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,3)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+  CrossReturnType res(_expression().rows(),_expression().cols());
+  if(Direction==Vertical)
+  {
+    eigen_assert(CrossReturnType::RowsAtCompileTime==3 && "the matrix must have exactly 3 rows");
+    res.row(0) = (_expression().row(1) * other.coeff(2) - _expression().row(2) * other.coeff(1)).conjugate();
+    res.row(1) = (_expression().row(2) * other.coeff(0) - _expression().row(0) * other.coeff(2)).conjugate();
+    res.row(2) = (_expression().row(0) * other.coeff(1) - _expression().row(1) * other.coeff(0)).conjugate();
+  }
+  else
+  {
+    eigen_assert(CrossReturnType::ColsAtCompileTime==3 && "the matrix must have exactly 3 columns");
+    res.col(0) = (_expression().col(1) * other.coeff(2) - _expression().col(2) * other.coeff(1)).conjugate();
+    res.col(1) = (_expression().col(2) * other.coeff(0) - _expression().col(0) * other.coeff(2)).conjugate();
+    res.col(2) = (_expression().col(0) * other.coeff(1) - _expression().col(1) * other.coeff(0)).conjugate();
+  }
+  return res;
+}
+
+namespace internal {
+
+template<typename Derived, int Size = Derived::SizeAtCompileTime>
+struct unitOrthogonal_selector
+{
+  typedef typename plain_matrix_type<Derived>::type VectorType;
+  typedef typename traits<Derived>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename Derived::Index Index;
+  typedef Matrix<Scalar,2,1> Vector2;
+  static inline VectorType run(const Derived& src)
+  {
+    VectorType perp = VectorType::Zero(src.size());
+    Index maxi = 0;
+    Index sndi = 0;
+    src.cwiseAbs().maxCoeff(&maxi);
+    if (maxi==0)
+      sndi = 1;
+    RealScalar invnm = RealScalar(1)/(Vector2() << src.coeff(sndi),src.coeff(maxi)).finished().norm();
+    perp.coeffRef(maxi) = -conj(src.coeff(sndi)) * invnm;
+    perp.coeffRef(sndi) =  conj(src.coeff(maxi)) * invnm;
+
+    return perp;
+   }
+};
+
+template<typename Derived>
+struct unitOrthogonal_selector<Derived,3>
+{
+  typedef typename plain_matrix_type<Derived>::type VectorType;
+  typedef typename traits<Derived>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  static inline VectorType run(const Derived& src)
+  {
+    VectorType perp;
+    /* Let us compute the crossed product of *this with a vector
+     * that is not too close to being colinear to *this.
+     */
+
+    /* unless the x and y coords are both close to zero, we can
+     * simply take ( -y, x, 0 ) and normalize it.
+     */
+    if((!isMuchSmallerThan(src.x(), src.z()))
+    || (!isMuchSmallerThan(src.y(), src.z())))
+    {
+      RealScalar invnm = RealScalar(1)/src.template head<2>().norm();
+      perp.coeffRef(0) = -conj(src.y())*invnm;
+      perp.coeffRef(1) = conj(src.x())*invnm;
+      perp.coeffRef(2) = 0;
+    }
+    /* if both x and y are close to zero, then the vector is close
+     * to the z-axis, so it's far from colinear to the x-axis for instance.
+     * So we take the crossed product with (1,0,0) and normalize it.
+     */
+    else
+    {
+      RealScalar invnm = RealScalar(1)/src.template tail<2>().norm();
+      perp.coeffRef(0) = 0;
+      perp.coeffRef(1) = -conj(src.z())*invnm;
+      perp.coeffRef(2) = conj(src.y())*invnm;
+    }
+
+    return perp;
+   }
+};
+
+template<typename Derived>
+struct unitOrthogonal_selector<Derived,2>
+{
+  typedef typename plain_matrix_type<Derived>::type VectorType;
+  static inline VectorType run(const Derived& src)
+  { return VectorType(-conj(src.y()), conj(src.x())).normalized(); }
+};
+
+} // end namespace internal
+
+/** \returns a unit vector which is orthogonal to \c *this
+  *
+  * The size of \c *this must be at least 2. If the size is exactly 2,
+  * then the returned vector is a counter clock wise rotation of \c *this, i.e., (-y,x).normalized().
+  *
+  * \sa cross()
+  */
+template<typename Derived>
+typename MatrixBase<Derived>::PlainObject
+MatrixBase<Derived>::unitOrthogonal() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return internal::unitOrthogonal_selector<Derived>::run(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ORTHOMETHODS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/ParametrizedLine.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/ParametrizedLine.h
new file mode 100644
index 0000000..98dd0f0
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/ParametrizedLine.h
@@ -0,0 +1,195 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PARAMETRIZEDLINE_H
+#define EIGEN_PARAMETRIZEDLINE_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class ParametrizedLine
+  *
+  * \brief A parametrized line
+  *
+  * A parametrized line is defined by an origin point \f$ \mathbf{o} \f$ and a unit
+  * direction vector \f$ \mathbf{d} \f$ such that the line corresponds to
+  * the set \f$ l(t) = \mathbf{o} + t \mathbf{d} \f$, \f$ t \in \mathbf{R} \f$.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  * \param _AmbientDim the dimension of the ambient space, can be a compile time value or Dynamic.
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+class ParametrizedLine
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_AmbientDim)
+  enum {
+    AmbientDimAtCompileTime = _AmbientDim,
+    Options = _Options
+  };
+  typedef _Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef DenseIndex Index;
+  typedef Matrix<Scalar,AmbientDimAtCompileTime,1,Options> VectorType;
+
+  /** Default constructor without initialization */
+  inline explicit ParametrizedLine() {}
+  
+  template<int OtherOptions>
+  ParametrizedLine(const ParametrizedLine<Scalar,AmbientDimAtCompileTime,OtherOptions>& other)
+   : m_origin(other.origin()), m_direction(other.direction())
+  {}
+
+  /** Constructs a dynamic-size line with \a _dim the dimension
+    * of the ambient space */
+  inline explicit ParametrizedLine(Index _dim) : m_origin(_dim), m_direction(_dim) {}
+
+  /** Initializes a parametrized line of direction \a direction and origin \a origin.
+    * \warning the vector direction is assumed to be normalized.
+    */
+  ParametrizedLine(const VectorType& origin, const VectorType& direction)
+    : m_origin(origin), m_direction(direction) {}
+
+  template <int OtherOptions>
+  explicit ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane);
+
+  /** Constructs a parametrized line going from \a p0 to \a p1. */
+  static inline ParametrizedLine Through(const VectorType& p0, const VectorType& p1)
+  { return ParametrizedLine(p0, (p1-p0).normalized()); }
+
+  ~ParametrizedLine() {}
+
+  /** \returns the dimension in which the line holds */
+  inline Index dim() const { return m_direction.size(); }
+
+  const VectorType& origin() const { return m_origin; }
+  VectorType& origin() { return m_origin; }
+
+  const VectorType& direction() const { return m_direction; }
+  VectorType& direction() { return m_direction; }
+
+  /** \returns the squared distance of a point \a p to its projection onto the line \c *this.
+    * \sa distance()
+    */
+  RealScalar squaredDistance(const VectorType& p) const
+  {
+    VectorType diff = p - origin();
+    return (diff - direction().dot(diff) * direction()).squaredNorm();
+  }
+  /** \returns the distance of a point \a p to its projection onto the line \c *this.
+    * \sa squaredDistance()
+    */
+  RealScalar distance(const VectorType& p) const { using std::sqrt; return sqrt(squaredDistance(p)); }
+
+  /** \returns the projection of a point \a p onto the line \c *this. */
+  VectorType projection(const VectorType& p) const
+  { return origin() + direction().dot(p-origin()) * direction(); }
+
+  VectorType pointAt(const Scalar& t) const;
+  
+  template <int OtherOptions>
+  Scalar intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
+ 
+  template <int OtherOptions>
+  Scalar intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
+  
+  template <int OtherOptions>
+  VectorType intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const;
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<ParametrizedLine,
+           ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type cast() const
+  {
+    return typename internal::cast_return_type<ParametrizedLine,
+                    ParametrizedLine<NewScalarType,AmbientDimAtCompileTime,Options> >::type(*this);
+  }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType,int OtherOptions>
+  inline explicit ParametrizedLine(const ParametrizedLine<OtherScalarType,AmbientDimAtCompileTime,OtherOptions>& other)
+  {
+    m_origin = other.origin().template cast<Scalar>();
+    m_direction = other.direction().template cast<Scalar>();
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const ParametrizedLine& other, typename NumTraits<Scalar>::Real prec = NumTraits<Scalar>::dummy_precision()) const
+  { return m_origin.isApprox(other.m_origin, prec) && m_direction.isApprox(other.m_direction, prec); }
+
+protected:
+
+  VectorType m_origin, m_direction;
+};
+
+/** Constructs a parametrized line from a 2D hyperplane
+  *
+  * \warning the ambient space must have dimension 2 such that the hyperplane actually describes a line
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline ParametrizedLine<_Scalar, _AmbientDim,_Options>::ParametrizedLine(const Hyperplane<_Scalar, _AmbientDim,OtherOptions>& hyperplane)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(VectorType, 2)
+  direction() = hyperplane.normal().unitOrthogonal();
+  origin() = -hyperplane.normal()*hyperplane.offset();
+}
+
+/** \returns the point at \a t along this line
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+inline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType
+ParametrizedLine<_Scalar, _AmbientDim,_Options>::pointAt(const _Scalar& t) const
+{
+  return origin() + (direction()*t); 
+}
+
+/** \returns the parameter value of the intersection between \c *this and the given \a hyperplane
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionParameter(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
+{
+  return -(hyperplane.offset()+hyperplane.normal().dot(origin()))
+          / hyperplane.normal().dot(direction());
+}
+
+
+/** \deprecated use intersectionParameter()
+  * \returns the parameter value of the intersection between \c *this and the given \a hyperplane
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline _Scalar ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersection(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
+{
+  return intersectionParameter(hyperplane);
+}
+
+/** \returns the point of the intersection between \c *this and the given hyperplane
+  */
+template <typename _Scalar, int _AmbientDim, int _Options>
+template <int OtherOptions>
+inline typename ParametrizedLine<_Scalar, _AmbientDim,_Options>::VectorType
+ParametrizedLine<_Scalar, _AmbientDim,_Options>::intersectionPoint(const Hyperplane<_Scalar, _AmbientDim, OtherOptions>& hyperplane) const
+{
+  return pointAt(intersectionParameter(hyperplane));
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARAMETRIZEDLINE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Quaternion.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Quaternion.h
new file mode 100644
index 0000000..e135f2b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Quaternion.h
@@ -0,0 +1,775 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Mathieu Gautier <mathieu.gautier at cea.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_QUATERNION_H
+#define EIGEN_QUATERNION_H
+namespace Eigen { 
+
+
+/***************************************************************************
+* Definition of QuaternionBase<Derived>
+* The implementation is at the end of the file
+***************************************************************************/
+
+namespace internal {
+template<typename Other,
+         int OtherRows=Other::RowsAtCompileTime,
+         int OtherCols=Other::ColsAtCompileTime>
+struct quaternionbase_assign_impl;
+}
+
+/** \geometry_module \ingroup Geometry_Module
+  * \class QuaternionBase
+  * \brief Base class for quaternion expressions
+  * \tparam Derived derived type (CRTP)
+  * \sa class Quaternion
+  */
+template<class Derived>
+class QuaternionBase : public RotationBase<Derived, 3>
+{
+  typedef RotationBase<Derived, 3> Base;
+public:
+  using Base::operator*;
+  using Base::derived;
+
+  typedef typename internal::traits<Derived>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename internal::traits<Derived>::Coefficients Coefficients;
+  enum {
+    Flags = Eigen::internal::traits<Derived>::Flags
+  };
+
+ // typedef typename Matrix<Scalar,4,1> Coefficients;
+  /** the type of a 3D vector */
+  typedef Matrix<Scalar,3,1> Vector3;
+  /** the equivalent rotation matrix type */
+  typedef Matrix<Scalar,3,3> Matrix3;
+  /** the equivalent angle-axis type */
+  typedef AngleAxis<Scalar> AngleAxisType;
+
+
+
+  /** \returns the \c x coefficient */
+  inline Scalar x() const { return this->derived().coeffs().coeff(0); }
+  /** \returns the \c y coefficient */
+  inline Scalar y() const { return this->derived().coeffs().coeff(1); }
+  /** \returns the \c z coefficient */
+  inline Scalar z() const { return this->derived().coeffs().coeff(2); }
+  /** \returns the \c w coefficient */
+  inline Scalar w() const { return this->derived().coeffs().coeff(3); }
+
+  /** \returns a reference to the \c x coefficient */
+  inline Scalar& x() { return this->derived().coeffs().coeffRef(0); }
+  /** \returns a reference to the \c y coefficient */
+  inline Scalar& y() { return this->derived().coeffs().coeffRef(1); }
+  /** \returns a reference to the \c z coefficient */
+  inline Scalar& z() { return this->derived().coeffs().coeffRef(2); }
+  /** \returns a reference to the \c w coefficient */
+  inline Scalar& w() { return this->derived().coeffs().coeffRef(3); }
+
+  /** \returns a read-only vector expression of the imaginary part (x,y,z) */
+  inline const VectorBlock<const Coefficients,3> vec() const { return coeffs().template head<3>(); }
+
+  /** \returns a vector expression of the imaginary part (x,y,z) */
+  inline VectorBlock<Coefficients,3> vec() { return coeffs().template head<3>(); }
+
+  /** \returns a read-only vector expression of the coefficients (x,y,z,w) */
+  inline const typename internal::traits<Derived>::Coefficients& coeffs() const { return derived().coeffs(); }
+
+  /** \returns a vector expression of the coefficients (x,y,z,w) */
+  inline typename internal::traits<Derived>::Coefficients& coeffs() { return derived().coeffs(); }
+
+  EIGEN_STRONG_INLINE QuaternionBase<Derived>& operator=(const QuaternionBase<Derived>& other);
+  template<class OtherDerived> EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);
+
+// disabled this copy operator as it is giving very strange compilation errors when compiling
+// test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's
+// useful; however notice that we already have the templated operator= above and e.g. in MatrixBase
+// we didn't have to add, in addition to templated operator=, such a non-templated copy operator.
+//  Derived& operator=(const QuaternionBase& other)
+//  { return operator=<Derived>(other); }
+
+  Derived& operator=(const AngleAxisType& aa);
+  template<class OtherDerived> Derived& operator=(const MatrixBase<OtherDerived>& m);
+
+  /** \returns a quaternion representing an identity rotation
+    * \sa MatrixBase::Identity()
+    */
+  static inline Quaternion<Scalar> Identity() { return Quaternion<Scalar>(1, 0, 0, 0); }
+
+  /** \sa QuaternionBase::Identity(), MatrixBase::setIdentity()
+    */
+  inline QuaternionBase& setIdentity() { coeffs() << 0, 0, 0, 1; return *this; }
+
+  /** \returns the squared norm of the quaternion's coefficients
+    * \sa QuaternionBase::norm(), MatrixBase::squaredNorm()
+    */
+  inline Scalar squaredNorm() const { return coeffs().squaredNorm(); }
+
+  /** \returns the norm of the quaternion's coefficients
+    * \sa QuaternionBase::squaredNorm(), MatrixBase::norm()
+    */
+  inline Scalar norm() const { return coeffs().norm(); }
+
+  /** Normalizes the quaternion \c *this
+    * \sa normalized(), MatrixBase::normalize() */
+  inline void normalize() { coeffs().normalize(); }
+  /** \returns a normalized copy of \c *this
+    * \sa normalize(), MatrixBase::normalized() */
+  inline Quaternion<Scalar> normalized() const { return Quaternion<Scalar>(coeffs().normalized()); }
+
+    /** \returns the dot product of \c *this and \a other
+    * Geometrically speaking, the dot product of two unit quaternions
+    * corresponds to the cosine of half the angle between the two rotations.
+    * \sa angularDistance()
+    */
+  template<class OtherDerived> inline Scalar dot(const QuaternionBase<OtherDerived>& other) const { return coeffs().dot(other.coeffs()); }
+
+  template<class OtherDerived> Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;
+
+  /** \returns an equivalent 3x3 rotation matrix */
+  Matrix3 toRotationMatrix() const;
+
+  /** \returns the quaternion which transform \a a into \a b through a rotation */
+  template<typename Derived1, typename Derived2>
+  Derived& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
+
+  template<class OtherDerived> EIGEN_STRONG_INLINE Quaternion<Scalar> operator* (const QuaternionBase<OtherDerived>& q) const;
+  template<class OtherDerived> EIGEN_STRONG_INLINE Derived& operator*= (const QuaternionBase<OtherDerived>& q);
+
+  /** \returns the quaternion describing the inverse rotation */
+  Quaternion<Scalar> inverse() const;
+
+  /** \returns the conjugated quaternion */
+  Quaternion<Scalar> conjugate() const;
+
+  /** \returns an interpolation for a constant motion between \a other and \c *this
+    * \a t in [0;1]
+    * see http://en.wikipedia.org/wiki/Slerp
+    */
+  template<class OtherDerived> Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  template<class OtherDerived>
+  bool isApprox(const QuaternionBase<OtherDerived>& other, const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return coeffs().isApprox(other.coeffs(), prec); }
+
+	/** return the result vector of \a v through the rotation*/
+  EIGEN_STRONG_INLINE Vector3 _transformVector(Vector3 v) const;
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type cast() const
+  {
+    return typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type(derived());
+  }
+
+#ifdef EIGEN_QUATERNIONBASE_PLUGIN
+# include EIGEN_QUATERNIONBASE_PLUGIN
+#endif
+};
+
+/***************************************************************************
+* Definition/implementation of Quaternion<Scalar>
+***************************************************************************/
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Quaternion
+  *
+  * \brief The quaternion class used to represent 3D orientations and rotations
+  *
+  * \tparam _Scalar the scalar type, i.e., the type of the coefficients
+  * \tparam _Options controls the memory alignement of the coeffecients. Can be \# AutoAlign or \# DontAlign. Default is AutoAlign.
+  *
+  * This class represents a quaternion \f$ w+xi+yj+zk \f$ that is a convenient representation of
+  * orientations and rotations of objects in three dimensions. Compared to other representations
+  * like Euler angles or 3x3 matrices, quatertions offer the following advantages:
+  * \li \b compact storage (4 scalars)
+  * \li \b efficient to compose (28 flops),
+  * \li \b stable spherical interpolation
+  *
+  * The following two typedefs are provided for convenience:
+  * \li \c Quaternionf for \c float
+  * \li \c Quaterniond for \c double
+  *
+  * \sa  class AngleAxis, class Transform
+  */
+
+namespace internal {
+template<typename _Scalar,int _Options>
+struct traits<Quaternion<_Scalar,_Options> >
+{
+  typedef Quaternion<_Scalar,_Options> PlainObject;
+  typedef _Scalar Scalar;
+  typedef Matrix<_Scalar,4,1,_Options> Coefficients;
+  enum{
+    IsAligned = internal::traits<Coefficients>::Flags & AlignedBit,
+    Flags = IsAligned ? (AlignedBit | LvalueBit) : LvalueBit
+  };
+};
+}
+
+template<typename _Scalar, int _Options>
+class Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >
+{
+  typedef QuaternionBase<Quaternion<_Scalar,_Options> > Base;
+  enum { IsAligned = internal::traits<Quaternion>::IsAligned };
+
+public:
+  typedef _Scalar Scalar;
+
+  EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Quaternion)
+  using Base::operator*=;
+
+  typedef typename internal::traits<Quaternion>::Coefficients Coefficients;
+  typedef typename Base::AngleAxisType AngleAxisType;
+
+  /** Default constructor leaving the quaternion uninitialized. */
+  inline Quaternion() {}
+
+  /** Constructs and initializes the quaternion \f$ w+xi+yj+zk \f$ from
+    * its four coefficients \a w, \a x, \a y and \a z.
+    *
+    * \warning Note the order of the arguments: the real \a w coefficient first,
+    * while internally the coefficients are stored in the following order:
+    * [\c x, \c y, \c z, \c w]
+    */
+  inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}
+
+  /** Constructs and initialize a quaternion from the array data */
+  inline Quaternion(const Scalar* data) : m_coeffs(data) {}
+
+  /** Copy constructor */
+  template<class Derived> EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) { this->Base::operator=(other); }
+
+  /** Constructs and initializes a quaternion from the angle-axis \a aa */
+  explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
+
+  /** Constructs and initializes a quaternion from either:
+    *  - a rotation matrix expression,
+    *  - a 4D vector expression representing quaternion coefficients.
+    */
+  template<typename Derived>
+  explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
+
+  /** Explicit copy constructor with scalar conversion */
+  template<typename OtherScalar, int OtherOptions>
+  explicit inline Quaternion(const Quaternion<OtherScalar, OtherOptions>& other)
+  { m_coeffs = other.coeffs().template cast<Scalar>(); }
+
+  template<typename Derived1, typename Derived2>
+  static Quaternion FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
+
+  inline Coefficients& coeffs() { return m_coeffs;}
+  inline const Coefficients& coeffs() const { return m_coeffs;}
+
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(IsAligned)
+
+protected:
+  Coefficients m_coeffs;
+  
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    static EIGEN_STRONG_INLINE void _check_template_params()
+    {
+      EIGEN_STATIC_ASSERT( (_Options & DontAlign) == _Options,
+        INVALID_MATRIX_TEMPLATE_PARAMETERS)
+    }
+#endif
+};
+
+/** \ingroup Geometry_Module
+  * single precision quaternion type */
+typedef Quaternion<float> Quaternionf;
+/** \ingroup Geometry_Module
+  * double precision quaternion type */
+typedef Quaternion<double> Quaterniond;
+
+/***************************************************************************
+* Specialization of Map<Quaternion<Scalar>>
+***************************************************************************/
+
+namespace internal {
+  template<typename _Scalar, int _Options>
+  struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
+  {
+    typedef Map<Matrix<_Scalar,4,1>, _Options> Coefficients;
+  };
+}
+
+namespace internal {
+  template<typename _Scalar, int _Options>
+  struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
+  {
+    typedef Map<const Matrix<_Scalar,4,1>, _Options> Coefficients;
+    typedef traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> > TraitsBase;
+    enum {
+      Flags = TraitsBase::Flags & ~LvalueBit
+    };
+  };
+}
+
+/** \ingroup Geometry_Module
+  * \brief Quaternion expression mapping a constant memory buffer
+  *
+  * \tparam _Scalar the type of the Quaternion coefficients
+  * \tparam _Options see class Map
+  *
+  * This is a specialization of class Map for Quaternion. This class allows to view
+  * a 4 scalar memory buffer as an Eigen's Quaternion object.
+  *
+  * \sa class Map, class Quaternion, class QuaternionBase
+  */
+template<typename _Scalar, int _Options>
+class Map<const Quaternion<_Scalar>, _Options >
+  : public QuaternionBase<Map<const Quaternion<_Scalar>, _Options> >
+{
+    typedef QuaternionBase<Map<const Quaternion<_Scalar>, _Options> > Base;
+
+  public:
+    typedef _Scalar Scalar;
+    typedef typename internal::traits<Map>::Coefficients Coefficients;
+    EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Map)
+    using Base::operator*=;
+
+    /** Constructs a Mapped Quaternion object from the pointer \a coeffs
+      *
+      * The pointer \a coeffs must reference the four coeffecients of Quaternion in the following order:
+      * \code *coeffs == {x, y, z, w} \endcode
+      *
+      * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */
+    EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}
+
+    inline const Coefficients& coeffs() const { return m_coeffs;}
+
+  protected:
+    const Coefficients m_coeffs;
+};
+
+/** \ingroup Geometry_Module
+  * \brief Expression of a quaternion from a memory buffer
+  *
+  * \tparam _Scalar the type of the Quaternion coefficients
+  * \tparam _Options see class Map
+  *
+  * This is a specialization of class Map for Quaternion. This class allows to view
+  * a 4 scalar memory buffer as an Eigen's  Quaternion object.
+  *
+  * \sa class Map, class Quaternion, class QuaternionBase
+  */
+template<typename _Scalar, int _Options>
+class Map<Quaternion<_Scalar>, _Options >
+  : public QuaternionBase<Map<Quaternion<_Scalar>, _Options> >
+{
+    typedef QuaternionBase<Map<Quaternion<_Scalar>, _Options> > Base;
+
+  public:
+    typedef _Scalar Scalar;
+    typedef typename internal::traits<Map>::Coefficients Coefficients;
+    EIGEN_INHERIT_ASSIGNMENT_EQUAL_OPERATOR(Map)
+    using Base::operator*=;
+
+    /** Constructs a Mapped Quaternion object from the pointer \a coeffs
+      *
+      * The pointer \a coeffs must reference the four coeffecients of Quaternion in the following order:
+      * \code *coeffs == {x, y, z, w} \endcode
+      *
+      * If the template parameter _Options is set to #Aligned, then the pointer coeffs must be aligned. */
+    EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}
+
+    inline Coefficients& coeffs() { return m_coeffs; }
+    inline const Coefficients& coeffs() const { return m_coeffs; }
+
+  protected:
+    Coefficients m_coeffs;
+};
+
+/** \ingroup Geometry_Module
+  * Map an unaligned array of single precision scalar as a quaternion */
+typedef Map<Quaternion<float>, 0>         QuaternionMapf;
+/** \ingroup Geometry_Module
+  * Map an unaligned array of double precision scalar as a quaternion */
+typedef Map<Quaternion<double>, 0>        QuaternionMapd;
+/** \ingroup Geometry_Module
+  * Map a 16-bits aligned array of double precision scalars as a quaternion */
+typedef Map<Quaternion<float>, Aligned>   QuaternionMapAlignedf;
+/** \ingroup Geometry_Module
+  * Map a 16-bits aligned array of double precision scalars as a quaternion */
+typedef Map<Quaternion<double>, Aligned>  QuaternionMapAlignedd;
+
+/***************************************************************************
+* Implementation of QuaternionBase methods
+***************************************************************************/
+
+// Generic Quaternion * Quaternion product
+// This product can be specialized for a given architecture via the Arch template argument.
+namespace internal {
+template<int Arch, class Derived1, class Derived2, typename Scalar, int _Options> struct quat_product
+{
+  static EIGEN_STRONG_INLINE Quaternion<Scalar> run(const QuaternionBase<Derived1>& a, const QuaternionBase<Derived2>& b){
+    return Quaternion<Scalar>
+    (
+      a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
+      a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
+      a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
+      a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()
+    );
+  }
+};
+}
+
+/** \returns the concatenation of two rotations as a quaternion-quaternion product */
+template <class Derived>
+template <class OtherDerived>
+EIGEN_STRONG_INLINE Quaternion<typename internal::traits<Derived>::Scalar>
+QuaternionBase<Derived>::operator* (const QuaternionBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),
+   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  return internal::quat_product<Architecture::Target, Derived, OtherDerived,
+                         typename internal::traits<Derived>::Scalar,
+                         internal::traits<Derived>::IsAligned && internal::traits<OtherDerived>::IsAligned>::run(*this, other);
+}
+
+/** \sa operator*(Quaternion) */
+template <class Derived>
+template <class OtherDerived>
+EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator*= (const QuaternionBase<OtherDerived>& other)
+{
+  derived() = derived() * other.derived();
+  return derived();
+}
+
+/** Rotation of a vector by a quaternion.
+  * \remarks If the quaternion is used to rotate several points (>1)
+  * then it is much more efficient to first convert it to a 3x3 Matrix.
+  * Comparison of the operation cost for n transformations:
+  *   - Quaternion2:    30n
+  *   - Via a Matrix3: 24 + 15n
+  */
+template <class Derived>
+EIGEN_STRONG_INLINE typename QuaternionBase<Derived>::Vector3
+QuaternionBase<Derived>::_transformVector(Vector3 v) const
+{
+    // Note that this algorithm comes from the optimization by hand
+    // of the conversion to a Matrix followed by a Matrix/Vector product.
+    // It appears to be much faster than the common algorithm found
+    // in the litterature (30 versus 39 flops). It also requires two
+    // Vector3 as temporaries.
+    Vector3 uv = this->vec().cross(v);
+    uv += uv;
+    return v + this->w() * uv + this->vec().cross(uv);
+}
+
+template<class Derived>
+EIGEN_STRONG_INLINE QuaternionBase<Derived>& QuaternionBase<Derived>::operator=(const QuaternionBase<Derived>& other)
+{
+  coeffs() = other.coeffs();
+  return derived();
+}
+
+template<class Derived>
+template<class OtherDerived>
+EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const QuaternionBase<OtherDerived>& other)
+{
+  coeffs() = other.coeffs();
+  return derived();
+}
+
+/** Set \c *this from an angle-axis \a aa and returns a reference to \c *this
+  */
+template<class Derived>
+EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(const AngleAxisType& aa)
+{
+  using std::cos;
+  using std::sin;
+  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings
+  this->w() = cos(ha);
+  this->vec() = sin(ha) * aa.axis();
+  return derived();
+}
+
+/** Set \c *this from the expression \a xpr:
+  *   - if \a xpr is a 4x1 vector, then \a xpr is assumed to be a quaternion
+  *   - if \a xpr is a 3x3 matrix, then \a xpr is assumed to be rotation matrix
+  *     and \a xpr is converted to a quaternion
+  */
+
+template<class Derived>
+template<class MatrixDerived>
+inline Derived& QuaternionBase<Derived>::operator=(const MatrixBase<MatrixDerived>& xpr)
+{
+  EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),
+   YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+  internal::quaternionbase_assign_impl<MatrixDerived>::run(*this, xpr.derived());
+  return derived();
+}
+
+/** Convert the quaternion to a 3x3 rotation matrix. The quaternion is required to
+  * be normalized, otherwise the result is undefined.
+  */
+template<class Derived>
+inline typename QuaternionBase<Derived>::Matrix3
+QuaternionBase<Derived>::toRotationMatrix(void) const
+{
+  // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)
+  // if not inlined then the cost of the return by value is huge ~ +35%,
+  // however, not inlining this function is an order of magnitude slower, so
+  // it has to be inlined, and so the return by value is not an issue
+  Matrix3 res;
+
+  const Scalar tx  = Scalar(2)*this->x();
+  const Scalar ty  = Scalar(2)*this->y();
+  const Scalar tz  = Scalar(2)*this->z();
+  const Scalar twx = tx*this->w();
+  const Scalar twy = ty*this->w();
+  const Scalar twz = tz*this->w();
+  const Scalar txx = tx*this->x();
+  const Scalar txy = ty*this->x();
+  const Scalar txz = tz*this->x();
+  const Scalar tyy = ty*this->y();
+  const Scalar tyz = tz*this->y();
+  const Scalar tzz = tz*this->z();
+
+  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);
+  res.coeffRef(0,1) = txy-twz;
+  res.coeffRef(0,2) = txz+twy;
+  res.coeffRef(1,0) = txy+twz;
+  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);
+  res.coeffRef(1,2) = tyz-twx;
+  res.coeffRef(2,0) = txz-twy;
+  res.coeffRef(2,1) = tyz+twx;
+  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);
+
+  return res;
+}
+
+/** Sets \c *this to be a quaternion representing a rotation between
+  * the two arbitrary vectors \a a and \a b. In other words, the built
+  * rotation represent a rotation sending the line of direction \a a
+  * to the line of direction \a b, both lines passing through the origin.
+  *
+  * \returns a reference to \c *this.
+  *
+  * Note that the two input vectors do \b not have to be normalized, and
+  * do not need to have the same norm.
+  */
+template<class Derived>
+template<typename Derived1, typename Derived2>
+inline Derived& QuaternionBase<Derived>::setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
+{
+  using std::max;
+  using std::sqrt;
+  Vector3 v0 = a.normalized();
+  Vector3 v1 = b.normalized();
+  Scalar c = v1.dot(v0);
+
+  // if dot == -1, vectors are nearly opposites
+  // => accuraletly compute the rotation axis by computing the
+  //    intersection of the two planes. This is done by solving:
+  //       x^T v0 = 0
+  //       x^T v1 = 0
+  //    under the constraint:
+  //       ||x|| = 1
+  //    which yields a singular value problem
+  if (c < Scalar(-1)+NumTraits<Scalar>::dummy_precision())
+  {
+    c = max<Scalar>(c,-1);
+    Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();
+    JacobiSVD<Matrix<Scalar,2,3> > svd(m, ComputeFullV);
+    Vector3 axis = svd.matrixV().col(2);
+
+    Scalar w2 = (Scalar(1)+c)*Scalar(0.5);
+    this->w() = sqrt(w2);
+    this->vec() = axis * sqrt(Scalar(1) - w2);
+    return derived();
+  }
+  Vector3 axis = v0.cross(v1);
+  Scalar s = sqrt((Scalar(1)+c)*Scalar(2));
+  Scalar invs = Scalar(1)/s;
+  this->vec() = axis * invs;
+  this->w() = s * Scalar(0.5);
+
+  return derived();
+}
+
+
+/** Returns a quaternion representing a rotation between
+  * the two arbitrary vectors \a a and \a b. In other words, the built
+  * rotation represent a rotation sending the line of direction \a a
+  * to the line of direction \a b, both lines passing through the origin.
+  *
+  * \returns resulting quaternion
+  *
+  * Note that the two input vectors do \b not have to be normalized, and
+  * do not need to have the same norm.
+  */
+template<typename Scalar, int Options>
+template<typename Derived1, typename Derived2>
+Quaternion<Scalar,Options> Quaternion<Scalar,Options>::FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b)
+{
+    Quaternion quat;
+    quat.setFromTwoVectors(a, b);
+    return quat;
+}
+
+
+/** \returns the multiplicative inverse of \c *this
+  * Note that in most cases, i.e., if you simply want the opposite rotation,
+  * and/or the quaternion is normalized, then it is enough to use the conjugate.
+  *
+  * \sa QuaternionBase::conjugate()
+  */
+template <class Derived>
+inline Quaternion<typename internal::traits<Derived>::Scalar> QuaternionBase<Derived>::inverse() const
+{
+  // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite()  ??
+  Scalar n2 = this->squaredNorm();
+  if (n2 > 0)
+    return Quaternion<Scalar>(conjugate().coeffs() / n2);
+  else
+  {
+    // return an invalid result to flag the error
+    return Quaternion<Scalar>(Coefficients::Zero());
+  }
+}
+
+/** \returns the conjugate of the \c *this which is equal to the multiplicative inverse
+  * if the quaternion is normalized.
+  * The conjugate of a quaternion represents the opposite rotation.
+  *
+  * \sa Quaternion2::inverse()
+  */
+template <class Derived>
+inline Quaternion<typename internal::traits<Derived>::Scalar>
+QuaternionBase<Derived>::conjugate() const
+{
+  return Quaternion<Scalar>(this->w(),-this->x(),-this->y(),-this->z());
+}
+
+/** \returns the angle (in radian) between two rotations
+  * \sa dot()
+  */
+template <class Derived>
+template <class OtherDerived>
+inline typename internal::traits<Derived>::Scalar
+QuaternionBase<Derived>::angularDistance(const QuaternionBase<OtherDerived>& other) const
+{
+  using std::acos;
+  using std::abs;
+  double d = abs(this->dot(other));
+  if (d>=1.0)
+    return Scalar(0);
+  return static_cast<Scalar>(2 * acos(d));
+}
+
+/** \returns the spherical linear interpolation between the two quaternions
+  * \c *this and \a other at the parameter \a t
+  */
+template <class Derived>
+template <class OtherDerived>
+Quaternion<typename internal::traits<Derived>::Scalar>
+QuaternionBase<Derived>::slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const
+{
+  using std::acos;
+  using std::sin;
+  using std::abs;
+  static const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();
+  Scalar d = this->dot(other);
+  Scalar absD = abs(d);
+
+  Scalar scale0;
+  Scalar scale1;
+
+  if(absD>=one)
+  {
+    scale0 = Scalar(1) - t;
+    scale1 = t;
+  }
+  else
+  {
+    // theta is the angle between the 2 quaternions
+    Scalar theta = acos(absD);
+    Scalar sinTheta = sin(theta);
+
+    scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;
+    scale1 = sin( ( t * theta) ) / sinTheta;
+  }
+  if(d<0) scale1 = -scale1;
+
+  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
+}
+
+namespace internal {
+
+// set from a rotation matrix
+template<typename Other>
+struct quaternionbase_assign_impl<Other,3,3>
+{
+  typedef typename Other::Scalar Scalar;
+  typedef DenseIndex Index;
+  template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& mat)
+  {
+    using std::sqrt;
+    // This algorithm comes from  "Quaternion Calculus and Fast Animation",
+    // Ken Shoemake, 1987 SIGGRAPH course notes
+    Scalar t = mat.trace();
+    if (t > Scalar(0))
+    {
+      t = sqrt(t + Scalar(1.0));
+      q.w() = Scalar(0.5)*t;
+      t = Scalar(0.5)/t;
+      q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
+      q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
+      q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
+    }
+    else
+    {
+      DenseIndex i = 0;
+      if (mat.coeff(1,1) > mat.coeff(0,0))
+        i = 1;
+      if (mat.coeff(2,2) > mat.coeff(i,i))
+        i = 2;
+      DenseIndex j = (i+1)%3;
+      DenseIndex k = (j+1)%3;
+
+      t = sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
+      q.coeffs().coeffRef(i) = Scalar(0.5) * t;
+      t = Scalar(0.5)/t;
+      q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
+      q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
+      q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
+    }
+  }
+};
+
+// set from a vector of coefficients assumed to be a quaternion
+template<typename Other>
+struct quaternionbase_assign_impl<Other,4,1>
+{
+  typedef typename Other::Scalar Scalar;
+  template<class Derived> static inline void run(QuaternionBase<Derived>& q, const Other& vec)
+  {
+    q.coeffs() = vec;
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_QUATERNION_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Rotation2D.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Rotation2D.h
new file mode 100644
index 0000000..1cac343
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Rotation2D.h
@@ -0,0 +1,157 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ROTATION2D_H
+#define EIGEN_ROTATION2D_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Rotation2D
+  *
+  * \brief Represents a rotation/orientation in a 2 dimensional space.
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients
+  *
+  * This class is equivalent to a single scalar representing a counter clock wise rotation
+  * as a single angle in radian. It provides some additional features such as the automatic
+  * conversion from/to a 2x2 rotation matrix. Moreover this class aims to provide a similar
+  * interface to Quaternion in order to facilitate the writing of generic algorithms
+  * dealing with rotations.
+  *
+  * \sa class Quaternion, class Transform
+  */
+
+namespace internal {
+
+template<typename _Scalar> struct traits<Rotation2D<_Scalar> >
+{
+  typedef _Scalar Scalar;
+};
+} // end namespace internal
+
+template<typename _Scalar>
+class Rotation2D : public RotationBase<Rotation2D<_Scalar>,2>
+{
+  typedef RotationBase<Rotation2D<_Scalar>,2> Base;
+
+public:
+
+  using Base::operator*;
+
+  enum { Dim = 2 };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  typedef Matrix<Scalar,2,1> Vector2;
+  typedef Matrix<Scalar,2,2> Matrix2;
+
+protected:
+
+  Scalar m_angle;
+
+public:
+
+  /** Construct a 2D counter clock wise rotation from the angle \a a in radian. */
+  inline Rotation2D(const Scalar& a) : m_angle(a) {}
+
+  /** \returns the rotation angle */
+  inline Scalar angle() const { return m_angle; }
+
+  /** \returns a read-write reference to the rotation angle */
+  inline Scalar& angle() { return m_angle; }
+
+  /** \returns the inverse rotation */
+  inline Rotation2D inverse() const { return -m_angle; }
+
+  /** Concatenates two rotations */
+  inline Rotation2D operator*(const Rotation2D& other) const
+  { return m_angle + other.m_angle; }
+
+  /** Concatenates two rotations */
+  inline Rotation2D& operator*=(const Rotation2D& other)
+  { m_angle += other.m_angle; return *this; }
+
+  /** Applies the rotation to a 2D vector */
+  Vector2 operator* (const Vector2& vec) const
+  { return toRotationMatrix() * vec; }
+
+  template<typename Derived>
+  Rotation2D& fromRotationMatrix(const MatrixBase<Derived>& m);
+  Matrix2 toRotationMatrix(void) const;
+
+  /** \returns the spherical interpolation between \c *this and \a other using
+    * parameter \a t. It is in fact equivalent to a linear interpolation.
+    */
+  inline Rotation2D slerp(const Scalar& t, const Rotation2D& other) const
+  { return m_angle * (1-t) + other.angle() * t; }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type cast() const
+  { return typename internal::cast_return_type<Rotation2D,Rotation2D<NewScalarType> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Rotation2D(const Rotation2D<OtherScalarType>& other)
+  {
+    m_angle = Scalar(other.angle());
+  }
+
+  static inline Rotation2D Identity() { return Rotation2D(0); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Rotation2D& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return internal::isApprox(m_angle,other.m_angle, prec); }
+};
+
+/** \ingroup Geometry_Module
+  * single precision 2D rotation type */
+typedef Rotation2D<float> Rotation2Df;
+/** \ingroup Geometry_Module
+  * double precision 2D rotation type */
+typedef Rotation2D<double> Rotation2Dd;
+
+/** Set \c *this from a 2x2 rotation matrix \a mat.
+  * In other words, this function extract the rotation angle
+  * from the rotation matrix.
+  */
+template<typename Scalar>
+template<typename Derived>
+Rotation2D<Scalar>& Rotation2D<Scalar>::fromRotationMatrix(const MatrixBase<Derived>& mat)
+{
+  using std::atan2;
+  EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime==2 && Derived::ColsAtCompileTime==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_angle = atan2(mat.coeff(1,0), mat.coeff(0,0));
+  return *this;
+}
+
+/** Constructs and \returns an equivalent 2x2 rotation matrix.
+  */
+template<typename Scalar>
+typename Rotation2D<Scalar>::Matrix2
+Rotation2D<Scalar>::toRotationMatrix(void) const
+{
+  using std::sin;
+  using std::cos;
+  Scalar sinA = sin(m_angle);
+  Scalar cosA = cos(m_angle);
+  return (Matrix2() << cosA, -sinA, sinA, cosA).finished();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_ROTATION2D_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/RotationBase.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/RotationBase.h
new file mode 100644
index 0000000..b88661d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/RotationBase.h
@@ -0,0 +1,206 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ROTATIONBASE_H
+#define EIGEN_ROTATIONBASE_H
+
+namespace Eigen { 
+
+// forward declaration
+namespace internal {
+template<typename RotationDerived, typename MatrixType, bool IsVector=MatrixType::IsVectorAtCompileTime>
+struct rotation_base_generic_product_selector;
+}
+
+/** \class RotationBase
+  *
+  * \brief Common base class for compact rotation representations
+  *
+  * \param Derived is the derived type, i.e., a rotation type
+  * \param _Dim the dimension of the space
+  */
+template<typename Derived, int _Dim>
+class RotationBase
+{
+  public:
+    enum { Dim = _Dim };
+    /** the scalar type of the coefficients */
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+
+    /** corresponding linear transformation matrix type */
+    typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
+    typedef Matrix<Scalar,Dim,1> VectorType;
+
+  public:
+    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    inline Derived& derived() { return *static_cast<Derived*>(this); }
+
+    /** \returns an equivalent rotation matrix */
+    inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); }
+
+    /** \returns an equivalent rotation matrix 
+      * This function is added to be conform with the Transform class' naming scheme.
+      */
+    inline RotationMatrixType matrix() const { return derived().toRotationMatrix(); }
+
+    /** \returns the inverse rotation */
+    inline Derived inverse() const { return derived().inverse(); }
+
+    /** \returns the concatenation of the rotation \c *this with a translation \a t */
+    inline Transform<Scalar,Dim,Isometry> operator*(const Translation<Scalar,Dim>& t) const
+    { return Transform<Scalar,Dim,Isometry>(*this) * t; }
+
+    /** \returns the concatenation of the rotation \c *this with a uniform scaling \a s */
+    inline RotationMatrixType operator*(const UniformScaling<Scalar>& s) const
+    { return toRotationMatrix() * s.factor(); }
+
+    /** \returns the concatenation of the rotation \c *this with a generic expression \a e
+      * \a e can be:
+      *  - a DimxDim linear transformation matrix
+      *  - a DimxDim diagonal matrix (axis aligned scaling)
+      *  - a vector of size Dim
+      */
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE typename internal::rotation_base_generic_product_selector<Derived,OtherDerived,OtherDerived::IsVectorAtCompileTime>::ReturnType
+    operator*(const EigenBase<OtherDerived>& e) const
+    { return internal::rotation_base_generic_product_selector<Derived,OtherDerived>::run(derived(), e.derived()); }
+
+    /** \returns the concatenation of a linear transformation \a l with the rotation \a r */
+    template<typename OtherDerived> friend
+    inline RotationMatrixType operator*(const EigenBase<OtherDerived>& l, const Derived& r)
+    { return l.derived() * r.toRotationMatrix(); }
+
+    /** \returns the concatenation of a scaling \a l with the rotation \a r */
+    friend inline Transform<Scalar,Dim,Affine> operator*(const DiagonalMatrix<Scalar,Dim>& l, const Derived& r)
+    { 
+      Transform<Scalar,Dim,Affine> res(r);
+      res.linear().applyOnTheLeft(l);
+      return res;
+    }
+
+    /** \returns the concatenation of the rotation \c *this with a transformation \a t */
+    template<int Mode, int Options>
+    inline Transform<Scalar,Dim,Mode> operator*(const Transform<Scalar,Dim,Mode,Options>& t) const
+    { return toRotationMatrix() * t; }
+
+    template<typename OtherVectorType>
+    inline VectorType _transformVector(const OtherVectorType& v) const
+    { return toRotationMatrix() * v; }
+};
+
+namespace internal {
+
+// implementation of the generic product rotation * matrix
+template<typename RotationDerived, typename MatrixType>
+struct rotation_base_generic_product_selector<RotationDerived,MatrixType,false>
+{
+  enum { Dim = RotationDerived::Dim };
+  typedef Matrix<typename RotationDerived::Scalar,Dim,Dim> ReturnType;
+  static inline ReturnType run(const RotationDerived& r, const MatrixType& m)
+  { return r.toRotationMatrix() * m; }
+};
+
+template<typename RotationDerived, typename Scalar, int Dim, int MaxDim>
+struct rotation_base_generic_product_selector< RotationDerived, DiagonalMatrix<Scalar,Dim,MaxDim>, false >
+{
+  typedef Transform<Scalar,Dim,Affine> ReturnType;
+  static inline ReturnType run(const RotationDerived& r, const DiagonalMatrix<Scalar,Dim,MaxDim>& m)
+  {
+    ReturnType res(r);
+    res.linear() *= m;
+    return res;
+  }
+};
+
+template<typename RotationDerived,typename OtherVectorType>
+struct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true>
+{
+  enum { Dim = RotationDerived::Dim };
+  typedef Matrix<typename RotationDerived::Scalar,Dim,1> ReturnType;
+  static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v)
+  {
+    return r._transformVector(v);
+  }
+};
+
+} // end namespace internal
+
+/** \geometry_module
+  *
+  * \brief Constructs a Dim x Dim rotation matrix from the rotation \a r
+  */
+template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
+template<typename OtherDerived>
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
+::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
+{
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+  *this = r.toRotationMatrix();
+}
+
+/** \geometry_module
+  *
+  * \brief Set a Dim x Dim rotation matrix from the rotation \a r
+  */
+template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols>
+template<typename OtherDerived>
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>&
+Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>
+::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r)
+{
+  EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim))
+  return *this = r.toRotationMatrix();
+}
+
+namespace internal {
+
+/** \internal
+  *
+  * Helper function to return an arbitrary rotation object to a rotation matrix.
+  *
+  * \param Scalar the numeric type of the matrix coefficients
+  * \param Dim the dimension of the current space
+  *
+  * It returns a Dim x Dim fixed size matrix.
+  *
+  * Default specializations are provided for:
+  *   - any scalar type (2D),
+  *   - any matrix expression,
+  *   - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D)
+  *
+  * Currently toRotationMatrix is only used by Transform.
+  *
+  * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis
+  */
+template<typename Scalar, int Dim>
+static inline Matrix<Scalar,2,2> toRotationMatrix(const Scalar& s)
+{
+  EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return Rotation2D<Scalar>(s).toRotationMatrix();
+}
+
+template<typename Scalar, int Dim, typename OtherDerived>
+static inline Matrix<Scalar,Dim,Dim> toRotationMatrix(const RotationBase<OtherDerived,Dim>& r)
+{
+  return r.toRotationMatrix();
+}
+
+template<typename Scalar, int Dim, typename OtherDerived>
+static inline const MatrixBase<OtherDerived>& toRotationMatrix(const MatrixBase<OtherDerived>& mat)
+{
+  EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim,
+    YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return mat;
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_ROTATIONBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Scaling.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Scaling.h
new file mode 100644
index 0000000..1c25f36
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Scaling.h
@@ -0,0 +1,166 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SCALING_H
+#define EIGEN_SCALING_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Scaling
+  *
+  * \brief Represents a generic uniform scaling transformation
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  *
+  * This class represent a uniform scaling transformation. It is the return
+  * type of Scaling(Scalar), and most of the time this is the only way it
+  * is used. In particular, this class is not aimed to be used to store a scaling transformation,
+  * but rather to make easier the constructions and updates of Transform objects.
+  *
+  * To represent an axis aligned scaling, use the DiagonalMatrix class.
+  *
+  * \sa Scaling(), class DiagonalMatrix, MatrixBase::asDiagonal(), class Translation, class Transform
+  */
+template<typename _Scalar>
+class UniformScaling
+{
+public:
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+
+protected:
+
+  Scalar m_factor;
+
+public:
+
+  /** Default constructor without initialization. */
+  UniformScaling() {}
+  /** Constructs and initialize a uniform scaling transformation */
+  explicit inline UniformScaling(const Scalar& s) : m_factor(s) {}
+
+  inline const Scalar& factor() const { return m_factor; }
+  inline Scalar& factor() { return m_factor; }
+
+  /** Concatenates two uniform scaling */
+  inline UniformScaling operator* (const UniformScaling& other) const
+  { return UniformScaling(m_factor * other.factor()); }
+
+  /** Concatenates a uniform scaling and a translation */
+  template<int Dim>
+  inline Transform<Scalar,Dim,Affine> operator* (const Translation<Scalar,Dim>& t) const;
+
+  /** Concatenates a uniform scaling and an affine transformation */
+  template<int Dim, int Mode, int Options>
+  inline Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Mode)> operator* (const Transform<Scalar,Dim, Mode, Options>& t) const
+  {
+   Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Mode)> res = t;
+   res.prescale(factor());
+   return res;
+}
+
+  /** Concatenates a uniform scaling and a linear transformation matrix */
+  // TODO returns an expression
+  template<typename Derived>
+  inline typename internal::plain_matrix_type<Derived>::type operator* (const MatrixBase<Derived>& other) const
+  { return other * m_factor; }
+
+  template<typename Derived,int Dim>
+  inline Matrix<Scalar,Dim,Dim> operator*(const RotationBase<Derived,Dim>& r) const
+  { return r.toRotationMatrix() * m_factor; }
+
+  /** \returns the inverse scaling */
+  inline UniformScaling inverse() const
+  { return UniformScaling(Scalar(1)/m_factor); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline UniformScaling<NewScalarType> cast() const
+  { return UniformScaling<NewScalarType>(NewScalarType(m_factor)); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit UniformScaling(const UniformScaling<OtherScalarType>& other)
+  { m_factor = Scalar(other.factor()); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const UniformScaling& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return internal::isApprox(m_factor, other.factor(), prec); }
+
+};
+
+/** Concatenates a linear transformation matrix and a uniform scaling */
+// NOTE this operator is defiend in MatrixBase and not as a friend function
+// of UniformScaling to fix an internal crash of Intel's ICC
+template<typename Derived> typename MatrixBase<Derived>::ScalarMultipleReturnType
+MatrixBase<Derived>::operator*(const UniformScaling<Scalar>& s) const
+{ return derived() * s.factor(); }
+
+/** Constructs a uniform scaling from scale factor \a s */
+static inline UniformScaling<float> Scaling(float s) { return UniformScaling<float>(s); }
+/** Constructs a uniform scaling from scale factor \a s */
+static inline UniformScaling<double> Scaling(double s) { return UniformScaling<double>(s); }
+/** Constructs a uniform scaling from scale factor \a s */
+template<typename RealScalar>
+static inline UniformScaling<std::complex<RealScalar> > Scaling(const std::complex<RealScalar>& s)
+{ return UniformScaling<std::complex<RealScalar> >(s); }
+
+/** Constructs a 2D axis aligned scaling */
+template<typename Scalar>
+static inline DiagonalMatrix<Scalar,2> Scaling(const Scalar& sx, const Scalar& sy)
+{ return DiagonalMatrix<Scalar,2>(sx, sy); }
+/** Constructs a 3D axis aligned scaling */
+template<typename Scalar>
+static inline DiagonalMatrix<Scalar,3> Scaling(const Scalar& sx, const Scalar& sy, const Scalar& sz)
+{ return DiagonalMatrix<Scalar,3>(sx, sy, sz); }
+
+/** Constructs an axis aligned scaling expression from vector expression \a coeffs
+  * This is an alias for coeffs.asDiagonal()
+  */
+template<typename Derived>
+static inline const DiagonalWrapper<const Derived> Scaling(const MatrixBase<Derived>& coeffs)
+{ return coeffs.asDiagonal(); }
+
+/** \addtogroup Geometry_Module */
+//@{
+/** \deprecated */
+typedef DiagonalMatrix<float, 2> AlignedScaling2f;
+/** \deprecated */
+typedef DiagonalMatrix<double,2> AlignedScaling2d;
+/** \deprecated */
+typedef DiagonalMatrix<float, 3> AlignedScaling3f;
+/** \deprecated */
+typedef DiagonalMatrix<double,3> AlignedScaling3d;
+//@}
+
+template<typename Scalar>
+template<int Dim>
+inline Transform<Scalar,Dim,Affine>
+UniformScaling<Scalar>::operator* (const Translation<Scalar,Dim>& t) const
+{
+  Transform<Scalar,Dim,Affine> res;
+  res.matrix().setZero();
+  res.linear().diagonal().fill(factor());
+  res.translation() = factor() * t.vector();
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SCALING_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Transform.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Transform.h
new file mode 100644
index 0000000..887e718
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Transform.h
@@ -0,0 +1,1440 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2010 Hauke Heibel <hauke.heibel at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRANSFORM_H
+#define EIGEN_TRANSFORM_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Transform>
+struct transform_traits
+{
+  enum
+  {
+    Dim = Transform::Dim,
+    HDim = Transform::HDim,
+    Mode = Transform::Mode,
+    IsProjective = (int(Mode)==int(Projective))
+  };
+};
+
+template< typename TransformType,
+          typename MatrixType,
+          int Case = transform_traits<TransformType>::IsProjective ? 0
+                   : int(MatrixType::RowsAtCompileTime) == int(transform_traits<TransformType>::HDim) ? 1
+                   : 2>
+struct transform_right_product_impl;
+
+template< typename Other,
+          int Mode,
+          int Options,
+          int Dim,
+          int HDim,
+          int OtherRows=Other::RowsAtCompileTime,
+          int OtherCols=Other::ColsAtCompileTime>
+struct transform_left_product_impl;
+
+template< typename Lhs,
+          typename Rhs,
+          bool AnyProjective = 
+            transform_traits<Lhs>::IsProjective ||
+            transform_traits<Rhs>::IsProjective>
+struct transform_transform_product_impl;
+
+template< typename Other,
+          int Mode,
+          int Options,
+          int Dim,
+          int HDim,
+          int OtherRows=Other::RowsAtCompileTime,
+          int OtherCols=Other::ColsAtCompileTime>
+struct transform_construct_from_matrix;
+
+template<typename TransformType> struct transform_take_affine_part;
+
+} // end namespace internal
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Transform
+  *
+  * \brief Represents an homogeneous transformation in a N dimensional space
+  *
+  * \tparam _Scalar the scalar type, i.e., the type of the coefficients
+  * \tparam _Dim the dimension of the space
+  * \tparam _Mode the type of the transformation. Can be:
+  *              - #Affine: the transformation is stored as a (Dim+1)^2 matrix,
+  *                         where the last row is assumed to be [0 ... 0 1].
+  *              - #AffineCompact: the transformation is stored as a (Dim)x(Dim+1) matrix.
+  *              - #Projective: the transformation is stored as a (Dim+1)^2 matrix
+  *                             without any assumption.
+  * \tparam _Options has the same meaning as in class Matrix. It allows to specify DontAlign and/or RowMajor.
+  *                  These Options are passed directly to the underlying matrix type.
+  *
+  * The homography is internally represented and stored by a matrix which
+  * is available through the matrix() method. To understand the behavior of
+  * this class you have to think a Transform object as its internal
+  * matrix representation. The chosen convention is right multiply:
+  *
+  * \code v' = T * v \endcode
+  *
+  * Therefore, an affine transformation matrix M is shaped like this:
+  *
+  * \f$ \left( \begin{array}{cc}
+  * linear & translation\\
+  * 0 ... 0 & 1
+  * \end{array} \right) \f$
+  *
+  * Note that for a projective transformation the last row can be anything,
+  * and then the interpretation of different parts might be sightly different.
+  *
+  * However, unlike a plain matrix, the Transform class provides many features
+  * simplifying both its assembly and usage. In particular, it can be composed
+  * with any other transformations (Transform,Translation,RotationBase,Matrix)
+  * and can be directly used to transform implicit homogeneous vectors. All these
+  * operations are handled via the operator*. For the composition of transformations,
+  * its principle consists to first convert the right/left hand sides of the product
+  * to a compatible (Dim+1)^2 matrix and then perform a pure matrix product.
+  * Of course, internally, operator* tries to perform the minimal number of operations
+  * according to the nature of each terms. Likewise, when applying the transform
+  * to non homogeneous vectors, the latters are automatically promoted to homogeneous
+  * one before doing the matrix product. The convertions to homogeneous representations
+  * are performed as follow:
+  *
+  * \b Translation t (Dim)x(1):
+  * \f$ \left( \begin{array}{cc}
+  * I & t \\
+  * 0\,...\,0 & 1
+  * \end{array} \right) \f$
+  *
+  * \b Rotation R (Dim)x(Dim):
+  * \f$ \left( \begin{array}{cc}
+  * R & 0\\
+  * 0\,...\,0 & 1
+  * \end{array} \right) \f$
+  *
+  * \b Linear \b Matrix L (Dim)x(Dim):
+  * \f$ \left( \begin{array}{cc}
+  * L & 0\\
+  * 0\,...\,0 & 1
+  * \end{array} \right) \f$
+  *
+  * \b Affine \b Matrix A (Dim)x(Dim+1):
+  * \f$ \left( \begin{array}{c}
+  * A\\
+  * 0\,...\,0\,1
+  * \end{array} \right) \f$
+  *
+  * \b Column \b vector v (Dim)x(1):
+  * \f$ \left( \begin{array}{c}
+  * v\\
+  * 1
+  * \end{array} \right) \f$
+  *
+  * \b Set \b of \b column \b vectors V1...Vn (Dim)x(n):
+  * \f$ \left( \begin{array}{ccc}
+  * v_1 & ... & v_n\\
+  * 1 & ... & 1
+  * \end{array} \right) \f$
+  *
+  * The concatenation of a Transform object with any kind of other transformation
+  * always returns a Transform object.
+  *
+  * A little exception to the "as pure matrix product" rule is the case of the
+  * transformation of non homogeneous vectors by an affine transformation. In
+  * that case the last matrix row can be ignored, and the product returns non
+  * homogeneous vectors.
+  *
+  * Since, for instance, a Dim x Dim matrix is interpreted as a linear transformation,
+  * it is not possible to directly transform Dim vectors stored in a Dim x Dim matrix.
+  * The solution is either to use a Dim x Dynamic matrix or explicitly request a
+  * vector transformation by making the vector homogeneous:
+  * \code
+  * m' = T * m.colwise().homogeneous();
+  * \endcode
+  * Note that there is zero overhead.
+  *
+  * Conversion methods from/to Qt's QMatrix and QTransform are available if the
+  * preprocessor token EIGEN_QT_SUPPORT is defined.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_TRANSFORM_PLUGIN.
+  *
+  * \sa class Matrix, class Quaternion
+  */
+template<typename _Scalar, int _Dim, int _Mode, int _Options>
+class Transform
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim==Dynamic ? Dynamic : (_Dim+1)*(_Dim+1))
+  enum {
+    Mode = _Mode,
+    Options = _Options,
+    Dim = _Dim,     ///< space dimension in which the transformation holds
+    HDim = _Dim+1,  ///< size of a respective homogeneous vector
+    Rows = int(Mode)==(AffineCompact) ? Dim : HDim
+  };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  typedef DenseIndex Index;
+  /** type of the matrix used to represent the transformation */
+  typedef typename internal::make_proper_matrix_type<Scalar,Rows,HDim,Options>::type MatrixType;
+  /** constified MatrixType */
+  typedef const MatrixType ConstMatrixType;
+  /** type of the matrix used to represent the linear part of the transformation */
+  typedef Matrix<Scalar,Dim,Dim,Options> LinearMatrixType;
+  /** type of read/write reference to the linear part of the transformation */
+  typedef Block<MatrixType,Dim,Dim,int(Mode)==(AffineCompact)> LinearPart;
+  /** type of read reference to the linear part of the transformation */
+  typedef const Block<ConstMatrixType,Dim,Dim,int(Mode)==(AffineCompact)> ConstLinearPart;
+  /** type of read/write reference to the affine part of the transformation */
+  typedef typename internal::conditional<int(Mode)==int(AffineCompact),
+                              MatrixType&,
+                              Block<MatrixType,Dim,HDim> >::type AffinePart;
+  /** type of read reference to the affine part of the transformation */
+  typedef typename internal::conditional<int(Mode)==int(AffineCompact),
+                              const MatrixType&,
+                              const Block<const MatrixType,Dim,HDim> >::type ConstAffinePart;
+  /** type of a vector */
+  typedef Matrix<Scalar,Dim,1> VectorType;
+  /** type of a read/write reference to the translation part of the rotation */
+  typedef Block<MatrixType,Dim,1,int(Mode)==(AffineCompact)> TranslationPart;
+  /** type of a read reference to the translation part of the rotation */
+  typedef const Block<ConstMatrixType,Dim,1,int(Mode)==(AffineCompact)> ConstTranslationPart;
+  /** corresponding translation type */
+  typedef Translation<Scalar,Dim> TranslationType;
+  
+  // this intermediate enum is needed to avoid an ICE with gcc 3.4 and 4.0
+  enum { TransformTimeDiagonalMode = ((Mode==int(Isometry))?Affine:int(Mode)) };
+  /** The return type of the product between a diagonal matrix and a transform */
+  typedef Transform<Scalar,Dim,TransformTimeDiagonalMode> TransformTimeDiagonalReturnType;
+
+protected:
+
+  MatrixType m_matrix;
+
+public:
+
+  /** Default constructor without initialization of the meaningful coefficients.
+    * If Mode==Affine, then the last row is set to [0 ... 0 1] */
+  inline Transform()
+  {
+    check_template_params();
+    if (int(Mode)==Affine)
+      makeAffine();
+  }
+
+  inline Transform(const Transform& other)
+  {
+    check_template_params();
+    m_matrix = other.m_matrix;
+  }
+
+  inline explicit Transform(const TranslationType& t)
+  {
+    check_template_params();
+    *this = t;
+  }
+  inline explicit Transform(const UniformScaling<Scalar>& s)
+  {
+    check_template_params();
+    *this = s;
+  }
+  template<typename Derived>
+  inline explicit Transform(const RotationBase<Derived, Dim>& r)
+  {
+    check_template_params();
+    *this = r;
+  }
+
+  inline Transform& operator=(const Transform& other)
+  { m_matrix = other.m_matrix; return *this; }
+
+  typedef internal::transform_take_affine_part<Transform> take_affine_part;
+
+  /** Constructs and initializes a transformation from a Dim^2 or a (Dim+1)^2 matrix. */
+  template<typename OtherDerived>
+  inline explicit Transform(const EigenBase<OtherDerived>& other)
+  {
+    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
+
+    check_template_params();
+    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
+  }
+
+  /** Set \c *this from a Dim^2 or (Dim+1)^2 matrix. */
+  template<typename OtherDerived>
+  inline Transform& operator=(const EigenBase<OtherDerived>& other)
+  {
+    EIGEN_STATIC_ASSERT((internal::is_same<Scalar,typename OtherDerived::Scalar>::value),
+      YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY);
+
+    internal::transform_construct_from_matrix<OtherDerived,Mode,Options,Dim,HDim>::run(this, other.derived());
+    return *this;
+  }
+  
+  template<int OtherOptions>
+  inline Transform(const Transform<Scalar,Dim,Mode,OtherOptions>& other)
+  {
+    check_template_params();
+    // only the options change, we can directly copy the matrices
+    m_matrix = other.matrix();
+  }
+
+  template<int OtherMode,int OtherOptions>
+  inline Transform(const Transform<Scalar,Dim,OtherMode,OtherOptions>& other)
+  {
+    check_template_params();
+    // prevent conversions as:
+    // Affine | AffineCompact | Isometry = Projective
+    EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(OtherMode==int(Projective), Mode==int(Projective)),
+                        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)
+
+    // prevent conversions as:
+    // Isometry = Affine | AffineCompact
+    EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(OtherMode==int(Affine)||OtherMode==int(AffineCompact), Mode!=int(Isometry)),
+                        YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION)
+
+    enum { ModeIsAffineCompact = Mode == int(AffineCompact),
+           OtherModeIsAffineCompact = OtherMode == int(AffineCompact)
+    };
+
+    if(ModeIsAffineCompact == OtherModeIsAffineCompact)
+    {
+      // We need the block expression because the code is compiled for all
+      // combinations of transformations and will trigger a compile time error
+      // if one tries to assign the matrices directly
+      m_matrix.template block<Dim,Dim+1>(0,0) = other.matrix().template block<Dim,Dim+1>(0,0);
+      makeAffine();
+    }
+    else if(OtherModeIsAffineCompact)
+    {
+      typedef typename Transform<Scalar,Dim,OtherMode,OtherOptions>::MatrixType OtherMatrixType;
+      internal::transform_construct_from_matrix<OtherMatrixType,Mode,Options,Dim,HDim>::run(this, other.matrix());
+    }
+    else
+    {
+      // here we know that Mode == AffineCompact and OtherMode != AffineCompact.
+      // if OtherMode were Projective, the static assert above would already have caught it.
+      // So the only possibility is that OtherMode == Affine
+      linear() = other.linear();
+      translation() = other.translation();
+    }
+  }
+
+  template<typename OtherDerived>
+  Transform(const ReturnByValue<OtherDerived>& other)
+  {
+    check_template_params();
+    other.evalTo(*this);
+  }
+
+  template<typename OtherDerived>
+  Transform& operator=(const ReturnByValue<OtherDerived>& other)
+  {
+    other.evalTo(*this);
+    return *this;
+  }
+
+  #ifdef EIGEN_QT_SUPPORT
+  inline Transform(const QMatrix& other);
+  inline Transform& operator=(const QMatrix& other);
+  inline QMatrix toQMatrix(void) const;
+  inline Transform(const QTransform& other);
+  inline Transform& operator=(const QTransform& other);
+  inline QTransform toQTransform(void) const;
+  #endif
+
+  /** shortcut for m_matrix(row,col);
+    * \sa MatrixBase::operator(Index,Index) const */
+  inline Scalar operator() (Index row, Index col) const { return m_matrix(row,col); }
+  /** shortcut for m_matrix(row,col);
+    * \sa MatrixBase::operator(Index,Index) */
+  inline Scalar& operator() (Index row, Index col) { return m_matrix(row,col); }
+
+  /** \returns a read-only expression of the transformation matrix */
+  inline const MatrixType& matrix() const { return m_matrix; }
+  /** \returns a writable expression of the transformation matrix */
+  inline MatrixType& matrix() { return m_matrix; }
+
+  /** \returns a read-only expression of the linear part of the transformation */
+  inline ConstLinearPart linear() const { return ConstLinearPart(m_matrix,0,0); }
+  /** \returns a writable expression of the linear part of the transformation */
+  inline LinearPart linear() { return LinearPart(m_matrix,0,0); }
+
+  /** \returns a read-only expression of the Dim x HDim affine part of the transformation */
+  inline ConstAffinePart affine() const { return take_affine_part::run(m_matrix); }
+  /** \returns a writable expression of the Dim x HDim affine part of the transformation */
+  inline AffinePart affine() { return take_affine_part::run(m_matrix); }
+
+  /** \returns a read-only expression of the translation vector of the transformation */
+  inline ConstTranslationPart translation() const { return ConstTranslationPart(m_matrix,0,Dim); }
+  /** \returns a writable expression of the translation vector of the transformation */
+  inline TranslationPart translation() { return TranslationPart(m_matrix,0,Dim); }
+
+  /** \returns an expression of the product between the transform \c *this and a matrix expression \a other
+    *
+    * The right hand side \a other might be either:
+    * \li a vector of size Dim,
+    * \li an homogeneous vector of size Dim+1,
+    * \li a set of vectors of size Dim x Dynamic,
+    * \li a set of homogeneous vectors of size Dim+1 x Dynamic,
+    * \li a linear transformation matrix of size Dim x Dim,
+    * \li an affine transformation matrix of size Dim x Dim+1,
+    * \li a transformation matrix of size Dim+1 x Dim+1.
+    */
+  // note: this function is defined here because some compilers cannot find the respective declaration
+  template<typename OtherDerived>
+  EIGEN_STRONG_INLINE const typename internal::transform_right_product_impl<Transform, OtherDerived>::ResultType
+  operator * (const EigenBase<OtherDerived> &other) const
+  { return internal::transform_right_product_impl<Transform, OtherDerived>::run(*this,other.derived()); }
+
+  /** \returns the product expression of a transformation matrix \a a times a transform \a b
+    *
+    * The left hand side \a other might be either:
+    * \li a linear transformation matrix of size Dim x Dim,
+    * \li an affine transformation matrix of size Dim x Dim+1,
+    * \li a general transformation matrix of size Dim+1 x Dim+1.
+    */
+  template<typename OtherDerived> friend
+  inline const typename internal::transform_left_product_impl<OtherDerived,Mode,Options,_Dim,_Dim+1>::ResultType
+    operator * (const EigenBase<OtherDerived> &a, const Transform &b)
+  { return internal::transform_left_product_impl<OtherDerived,Mode,Options,Dim,HDim>::run(a.derived(),b); }
+
+  /** \returns The product expression of a transform \a a times a diagonal matrix \a b
+    *
+    * The rhs diagonal matrix is interpreted as an affine scaling transformation. The
+    * product results in a Transform of the same type (mode) as the lhs only if the lhs 
+    * mode is no isometry. In that case, the returned transform is an affinity.
+    */
+  template<typename DiagonalDerived>
+  inline const TransformTimeDiagonalReturnType
+    operator * (const DiagonalBase<DiagonalDerived> &b) const
+  {
+    TransformTimeDiagonalReturnType res(*this);
+    res.linear() *= b;
+    return res;
+  }
+
+  /** \returns The product expression of a diagonal matrix \a a times a transform \a b
+    *
+    * The lhs diagonal matrix is interpreted as an affine scaling transformation. The
+    * product results in a Transform of the same type (mode) as the lhs only if the lhs 
+    * mode is no isometry. In that case, the returned transform is an affinity.
+    */
+  template<typename DiagonalDerived>
+  friend inline TransformTimeDiagonalReturnType
+    operator * (const DiagonalBase<DiagonalDerived> &a, const Transform &b)
+  {
+    TransformTimeDiagonalReturnType res;
+    res.linear().noalias() = a*b.linear();
+    res.translation().noalias() = a*b.translation();
+    if (Mode!=int(AffineCompact))
+      res.matrix().row(Dim) = b.matrix().row(Dim);
+    return res;
+  }
+
+  template<typename OtherDerived>
+  inline Transform& operator*=(const EigenBase<OtherDerived>& other) { return *this = *this * other; }
+
+  /** Concatenates two transformations */
+  inline const Transform operator * (const Transform& other) const
+  {
+    return internal::transform_transform_product_impl<Transform,Transform>::run(*this,other);
+  }
+  
+  #ifdef __INTEL_COMPILER
+private:
+  // this intermediate structure permits to workaround a bug in ICC 11:
+  //   error: template instantiation resulted in unexpected function type of "Eigen::Transform<double, 3, 32, 0>
+  //             (const Eigen::Transform<double, 3, 2, 0> &) const"
+  //  (the meaning of a name may have changed since the template declaration -- the type of the template is:
+  // "Eigen::internal::transform_transform_product_impl<Eigen::Transform<double, 3, 32, 0>,
+  //     Eigen::Transform<double, 3, Mode, Options>, <expression>>::ResultType (const Eigen::Transform<double, 3, Mode, Options> &) const")
+  // 
+  template<int OtherMode,int OtherOptions> struct icc_11_workaround
+  {
+    typedef internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> > ProductType;
+    typedef typename ProductType::ResultType ResultType;
+  };
+  
+public:
+  /** Concatenates two different transformations */
+  template<int OtherMode,int OtherOptions>
+  inline typename icc_11_workaround<OtherMode,OtherOptions>::ResultType
+    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const
+  {
+    typedef typename icc_11_workaround<OtherMode,OtherOptions>::ProductType ProductType;
+    return ProductType::run(*this,other);
+  }
+  #else
+  /** Concatenates two different transformations */
+  template<int OtherMode,int OtherOptions>
+  inline typename internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::ResultType
+    operator * (const Transform<Scalar,Dim,OtherMode,OtherOptions>& other) const
+  {
+    return internal::transform_transform_product_impl<Transform,Transform<Scalar,Dim,OtherMode,OtherOptions> >::run(*this,other);
+  }
+  #endif
+
+  /** \sa MatrixBase::setIdentity() */
+  void setIdentity() { m_matrix.setIdentity(); }
+
+  /**
+   * \brief Returns an identity transformation.
+   * \todo In the future this function should be returning a Transform expression.
+   */
+  static const Transform Identity()
+  {
+    return Transform(MatrixType::Identity());
+  }
+
+  template<typename OtherDerived>
+  inline Transform& scale(const MatrixBase<OtherDerived> &other);
+
+  template<typename OtherDerived>
+  inline Transform& prescale(const MatrixBase<OtherDerived> &other);
+
+  inline Transform& scale(const Scalar& s);
+  inline Transform& prescale(const Scalar& s);
+
+  template<typename OtherDerived>
+  inline Transform& translate(const MatrixBase<OtherDerived> &other);
+
+  template<typename OtherDerived>
+  inline Transform& pretranslate(const MatrixBase<OtherDerived> &other);
+
+  template<typename RotationType>
+  inline Transform& rotate(const RotationType& rotation);
+
+  template<typename RotationType>
+  inline Transform& prerotate(const RotationType& rotation);
+
+  Transform& shear(const Scalar& sx, const Scalar& sy);
+  Transform& preshear(const Scalar& sx, const Scalar& sy);
+
+  inline Transform& operator=(const TranslationType& t);
+  inline Transform& operator*=(const TranslationType& t) { return translate(t.vector()); }
+  inline Transform operator*(const TranslationType& t) const;
+
+  inline Transform& operator=(const UniformScaling<Scalar>& t);
+  inline Transform& operator*=(const UniformScaling<Scalar>& s) { return scale(s.factor()); }
+  inline Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Isometry)> operator*(const UniformScaling<Scalar>& s) const
+  {
+    Transform<Scalar,Dim,(int(Mode)==int(Isometry)?Affine:Isometry),Options> res = *this;
+    res.scale(s.factor());
+    return res;
+  }
+
+  inline Transform& operator*=(const DiagonalMatrix<Scalar,Dim>& s) { linear() *= s; return *this; }
+
+  template<typename Derived>
+  inline Transform& operator=(const RotationBase<Derived,Dim>& r);
+  template<typename Derived>
+  inline Transform& operator*=(const RotationBase<Derived,Dim>& r) { return rotate(r.toRotationMatrix()); }
+  template<typename Derived>
+  inline Transform operator*(const RotationBase<Derived,Dim>& r) const;
+
+  const LinearMatrixType rotation() const;
+  template<typename RotationMatrixType, typename ScalingMatrixType>
+  void computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const;
+  template<typename ScalingMatrixType, typename RotationMatrixType>
+  void computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const;
+
+  template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
+  Transform& fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
+    const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale);
+
+  inline Transform inverse(TransformTraits traits = (TransformTraits)Mode) const;
+
+  /** \returns a const pointer to the column major internal matrix */
+  const Scalar* data() const { return m_matrix.data(); }
+  /** \returns a non-const pointer to the column major internal matrix */
+  Scalar* data() { return m_matrix.data(); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type cast() const
+  { return typename internal::cast_return_type<Transform,Transform<NewScalarType,Dim,Mode,Options> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Transform(const Transform<OtherScalarType,Dim,Mode,Options>& other)
+  {
+    check_template_params();
+    m_matrix = other.matrix().template cast<Scalar>();
+  }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Transform& other, const typename NumTraits<Scalar>::Real& prec = NumTraits<Scalar>::dummy_precision()) const
+  { return m_matrix.isApprox(other.m_matrix, prec); }
+
+  /** Sets the last row to [0 ... 0 1]
+    */
+  void makeAffine()
+  {
+    if(int(Mode)!=int(AffineCompact))
+    {
+      matrix().template block<1,Dim>(Dim,0).setZero();
+      matrix().coeffRef(Dim,Dim) = Scalar(1);
+    }
+  }
+
+  /** \internal
+    * \returns the Dim x Dim linear part if the transformation is affine,
+    *          and the HDim x Dim part for projective transformations.
+    */
+  inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt()
+  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }
+  /** \internal
+    * \returns the Dim x Dim linear part if the transformation is affine,
+    *          and the HDim x Dim part for projective transformations.
+    */
+  inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,Dim> linearExt() const
+  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,Dim>(0,0); }
+
+  /** \internal
+    * \returns the translation part if the transformation is affine,
+    *          and the last column for projective transformations.
+    */
+  inline Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt()
+  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }
+  /** \internal
+    * \returns the translation part if the transformation is affine,
+    *          and the last column for projective transformations.
+    */
+  inline const Block<MatrixType,int(Mode)==int(Projective)?HDim:Dim,1> translationExt() const
+  { return m_matrix.template block<int(Mode)==int(Projective)?HDim:Dim,1>(0,Dim); }
+
+
+  #ifdef EIGEN_TRANSFORM_PLUGIN
+  #include EIGEN_TRANSFORM_PLUGIN
+  #endif
+  
+protected:
+  #ifndef EIGEN_PARSED_BY_DOXYGEN
+    static EIGEN_STRONG_INLINE void check_template_params()
+    {
+      EIGEN_STATIC_ASSERT((Options & (DontAlign|RowMajor)) == Options, INVALID_MATRIX_TEMPLATE_PARAMETERS)
+    }
+  #endif
+
+};
+
+/** \ingroup Geometry_Module */
+typedef Transform<float,2,Isometry> Isometry2f;
+/** \ingroup Geometry_Module */
+typedef Transform<float,3,Isometry> Isometry3f;
+/** \ingroup Geometry_Module */
+typedef Transform<double,2,Isometry> Isometry2d;
+/** \ingroup Geometry_Module */
+typedef Transform<double,3,Isometry> Isometry3d;
+
+/** \ingroup Geometry_Module */
+typedef Transform<float,2,Affine> Affine2f;
+/** \ingroup Geometry_Module */
+typedef Transform<float,3,Affine> Affine3f;
+/** \ingroup Geometry_Module */
+typedef Transform<double,2,Affine> Affine2d;
+/** \ingroup Geometry_Module */
+typedef Transform<double,3,Affine> Affine3d;
+
+/** \ingroup Geometry_Module */
+typedef Transform<float,2,AffineCompact> AffineCompact2f;
+/** \ingroup Geometry_Module */
+typedef Transform<float,3,AffineCompact> AffineCompact3f;
+/** \ingroup Geometry_Module */
+typedef Transform<double,2,AffineCompact> AffineCompact2d;
+/** \ingroup Geometry_Module */
+typedef Transform<double,3,AffineCompact> AffineCompact3d;
+
+/** \ingroup Geometry_Module */
+typedef Transform<float,2,Projective> Projective2f;
+/** \ingroup Geometry_Module */
+typedef Transform<float,3,Projective> Projective3f;
+/** \ingroup Geometry_Module */
+typedef Transform<double,2,Projective> Projective2d;
+/** \ingroup Geometry_Module */
+typedef Transform<double,3,Projective> Projective3d;
+
+/**************************
+*** Optional QT support ***
+**************************/
+
+#ifdef EIGEN_QT_SUPPORT
+/** Initializes \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode,int Options>
+Transform<Scalar,Dim,Mode,Options>::Transform(const QMatrix& other)
+{
+  check_template_params();
+  *this = other;
+}
+
+/** Set \c *this from a QMatrix assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode,int Options>
+Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QMatrix& other)
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  m_matrix << other.m11(), other.m21(), other.dx(),
+              other.m12(), other.m22(), other.dy(),
+              0, 0, 1;
+  return *this;
+}
+
+/** \returns a QMatrix from \c *this assuming the dimension is 2.
+  *
+  * \warning this conversion might loss data if \c *this is not affine
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+QMatrix Transform<Scalar,Dim,Mode,Options>::toQMatrix(void) const
+{
+  check_template_params();
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  return QMatrix(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
+                 m_matrix.coeff(0,1), m_matrix.coeff(1,1),
+                 m_matrix.coeff(0,2), m_matrix.coeff(1,2));
+}
+
+/** Initializes \c *this from a QTransform assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode,int Options>
+Transform<Scalar,Dim,Mode,Options>::Transform(const QTransform& other)
+{
+  check_template_params();
+  *this = other;
+}
+
+/** Set \c *this from a QTransform assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const QTransform& other)
+{
+  check_template_params();
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  if (Mode == int(AffineCompact))
+    m_matrix << other.m11(), other.m21(), other.dx(),
+                other.m12(), other.m22(), other.dy();
+  else
+    m_matrix << other.m11(), other.m21(), other.dx(),
+                other.m12(), other.m22(), other.dy(),
+                other.m13(), other.m23(), other.m33();
+  return *this;
+}
+
+/** \returns a QTransform from \c *this assuming the dimension is 2.
+  *
+  * This function is available only if the token EIGEN_QT_SUPPORT is defined.
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+QTransform Transform<Scalar,Dim,Mode,Options>::toQTransform(void) const
+{
+  EIGEN_STATIC_ASSERT(Dim==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  if (Mode == int(AffineCompact))
+    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0),
+                      m_matrix.coeff(0,1), m_matrix.coeff(1,1),
+                      m_matrix.coeff(0,2), m_matrix.coeff(1,2));
+  else
+    return QTransform(m_matrix.coeff(0,0), m_matrix.coeff(1,0), m_matrix.coeff(2,0),
+                      m_matrix.coeff(0,1), m_matrix.coeff(1,1), m_matrix.coeff(2,1),
+                      m_matrix.coeff(0,2), m_matrix.coeff(1,2), m_matrix.coeff(2,2));
+}
+#endif
+
+/*********************
+*** Procedural API ***
+*********************/
+
+/** Applies on the right the non uniform scale transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \sa prescale()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename OtherDerived>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::scale(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  linearExt().noalias() = (linearExt() * other.asDiagonal());
+  return *this;
+}
+
+/** Applies on the right a uniform scale of a factor \a c to \c *this
+  * and returns a reference to \c *this.
+  * \sa prescale(Scalar)
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::scale(const Scalar& s)
+{
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  linearExt() *= s;
+  return *this;
+}
+
+/** Applies on the left the non uniform scale transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \sa scale()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename OtherDerived>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::prescale(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  m_matrix.template block<Dim,HDim>(0,0).noalias() = (other.asDiagonal() * m_matrix.template block<Dim,HDim>(0,0));
+  return *this;
+}
+
+/** Applies on the left a uniform scale of a factor \a c to \c *this
+  * and returns a reference to \c *this.
+  * \sa scale(Scalar)
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::prescale(const Scalar& s)
+{
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  m_matrix.template topRows<Dim>() *= s;
+  return *this;
+}
+
+/** Applies on the right the translation matrix represented by the vector \a other
+  * to \c *this and returns a reference to \c *this.
+  * \sa pretranslate()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename OtherDerived>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::translate(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  translationExt() += linearExt() * other;
+  return *this;
+}
+
+/** Applies on the left the translation matrix represented by the vector \a other
+  * to \c *this and returns a reference to \c *this.
+  * \sa translate()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename OtherDerived>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::pretranslate(const MatrixBase<OtherDerived> &other)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(OtherDerived,int(Dim))
+  if(int(Mode)==int(Projective))
+    affine() += other * m_matrix.row(Dim);
+  else
+    translation() += other;
+  return *this;
+}
+
+/** Applies on the right the rotation represented by the rotation \a rotation
+  * to \c *this and returns a reference to \c *this.
+  *
+  * The template parameter \a RotationType is the type of the rotation which
+  * must be known by internal::toRotationMatrix<>.
+  *
+  * Natively supported types includes:
+  *   - any scalar (2D),
+  *   - a Dim x Dim matrix expression,
+  *   - a Quaternion (3D),
+  *   - a AngleAxis (3D)
+  *
+  * This mechanism is easily extendable to support user types such as Euler angles,
+  * or a pair of Quaternion for 4D rotations.
+  *
+  * \sa rotate(Scalar), class Quaternion, class AngleAxis, prerotate(RotationType)
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename RotationType>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::rotate(const RotationType& rotation)
+{
+  linearExt() *= internal::toRotationMatrix<Scalar,Dim>(rotation);
+  return *this;
+}
+
+/** Applies on the left the rotation represented by the rotation \a rotation
+  * to \c *this and returns a reference to \c *this.
+  *
+  * See rotate() for further details.
+  *
+  * \sa rotate()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename RotationType>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::prerotate(const RotationType& rotation)
+{
+  m_matrix.template block<Dim,HDim>(0,0) = internal::toRotationMatrix<Scalar,Dim>(rotation)
+                                         * m_matrix.template block<Dim,HDim>(0,0);
+  return *this;
+}
+
+/** Applies on the right the shear transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \warning 2D only.
+  * \sa preshear()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::shear(const Scalar& sx, const Scalar& sy)
+{
+  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  VectorType tmp = linear().col(0)*sy + linear().col(1);
+  linear() << linear().col(0) + linear().col(1)*sx, tmp;
+  return *this;
+}
+
+/** Applies on the left the shear transformation represented
+  * by the vector \a other to \c *this and returns a reference to \c *this.
+  * \warning 2D only.
+  * \sa shear()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::preshear(const Scalar& sx, const Scalar& sy)
+{
+  EIGEN_STATIC_ASSERT(int(Dim)==2, YOU_MADE_A_PROGRAMMING_MISTAKE)
+  EIGEN_STATIC_ASSERT(Mode!=int(Isometry), THIS_METHOD_IS_ONLY_FOR_SPECIFIC_TRANSFORMATIONS)
+  m_matrix.template block<Dim,HDim>(0,0) = LinearMatrixType(1, sx, sy, 1) * m_matrix.template block<Dim,HDim>(0,0);
+  return *this;
+}
+
+/******************************************************
+*** Scaling, Translation and Rotation compatibility ***
+******************************************************/
+
+template<typename Scalar, int Dim, int Mode, int Options>
+inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const TranslationType& t)
+{
+  linear().setIdentity();
+  translation() = t.vector();
+  makeAffine();
+  return *this;
+}
+
+template<typename Scalar, int Dim, int Mode, int Options>
+inline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const TranslationType& t) const
+{
+  Transform res = *this;
+  res.translate(t.vector());
+  return res;
+}
+
+template<typename Scalar, int Dim, int Mode, int Options>
+inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const UniformScaling<Scalar>& s)
+{
+  m_matrix.setZero();
+  linear().diagonal().fill(s.factor());
+  makeAffine();
+  return *this;
+}
+
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename Derived>
+inline Transform<Scalar,Dim,Mode,Options>& Transform<Scalar,Dim,Mode,Options>::operator=(const RotationBase<Derived,Dim>& r)
+{
+  linear() = internal::toRotationMatrix<Scalar,Dim>(r);
+  translation().setZero();
+  makeAffine();
+  return *this;
+}
+
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename Derived>
+inline Transform<Scalar,Dim,Mode,Options> Transform<Scalar,Dim,Mode,Options>::operator*(const RotationBase<Derived,Dim>& r) const
+{
+  Transform res = *this;
+  res.rotate(r.derived());
+  return res;
+}
+
+/************************
+*** Special functions ***
+************************/
+
+/** \returns the rotation part of the transformation
+  *
+  *
+  * \svd_module
+  *
+  * \sa computeRotationScaling(), computeScalingRotation(), class SVD
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+const typename Transform<Scalar,Dim,Mode,Options>::LinearMatrixType
+Transform<Scalar,Dim,Mode,Options>::rotation() const
+{
+  LinearMatrixType result;
+  computeRotationScaling(&result, (LinearMatrixType*)0);
+  return result;
+}
+
+
+/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  *
+  *
+  * \svd_module
+  *
+  * \sa computeScalingRotation(), rotation(), class SVD
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename RotationMatrixType, typename ScalingMatrixType>
+void Transform<Scalar,Dim,Mode,Options>::computeRotationScaling(RotationMatrixType *rotation, ScalingMatrixType *scaling) const
+{
+  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);
+
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
+  VectorType sv(svd.singularValues());
+  sv.coeffRef(0) *= x;
+  if(scaling) scaling->lazyAssign(svd.matrixV() * sv.asDiagonal() * svd.matrixV().adjoint());
+  if(rotation)
+  {
+    LinearMatrixType m(svd.matrixU());
+    m.col(0) /= x;
+    rotation->lazyAssign(m * svd.matrixV().adjoint());
+  }
+}
+
+/** decomposes the linear part of the transformation as a product rotation x scaling, the scaling being
+  * not necessarily positive.
+  *
+  * If either pointer is zero, the corresponding computation is skipped.
+  *
+  *
+  *
+  * \svd_module
+  *
+  * \sa computeRotationScaling(), rotation(), class SVD
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename ScalingMatrixType, typename RotationMatrixType>
+void Transform<Scalar,Dim,Mode,Options>::computeScalingRotation(ScalingMatrixType *scaling, RotationMatrixType *rotation) const
+{
+  JacobiSVD<LinearMatrixType> svd(linear(), ComputeFullU | ComputeFullV);
+
+  Scalar x = (svd.matrixU() * svd.matrixV().adjoint()).determinant(); // so x has absolute value 1
+  VectorType sv(svd.singularValues());
+  sv.coeffRef(0) *= x;
+  if(scaling) scaling->lazyAssign(svd.matrixU() * sv.asDiagonal() * svd.matrixU().adjoint());
+  if(rotation)
+  {
+    LinearMatrixType m(svd.matrixU());
+    m.col(0) /= x;
+    rotation->lazyAssign(m * svd.matrixV().adjoint());
+  }
+}
+
+/** Convenient method to set \c *this from a position, orientation and scale
+  * of a 3D object.
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+template<typename PositionDerived, typename OrientationType, typename ScaleDerived>
+Transform<Scalar,Dim,Mode,Options>&
+Transform<Scalar,Dim,Mode,Options>::fromPositionOrientationScale(const MatrixBase<PositionDerived> &position,
+  const OrientationType& orientation, const MatrixBase<ScaleDerived> &scale)
+{
+  linear() = internal::toRotationMatrix<Scalar,Dim>(orientation);
+  linear() *= scale.asDiagonal();
+  translation() = position;
+  makeAffine();
+  return *this;
+}
+
+namespace internal {
+
+// selector needed to avoid taking the inverse of a 3x4 matrix
+template<typename TransformType, int Mode=TransformType::Mode>
+struct projective_transform_inverse
+{
+  static inline void run(const TransformType&, TransformType&)
+  {}
+};
+
+template<typename TransformType>
+struct projective_transform_inverse<TransformType, Projective>
+{
+  static inline void run(const TransformType& m, TransformType& res)
+  {
+    res.matrix() = m.matrix().inverse();
+  }
+};
+
+} // end namespace internal
+
+
+/**
+  *
+  * \returns the inverse transformation according to some given knowledge
+  * on \c *this.
+  *
+  * \param hint allows to optimize the inversion process when the transformation
+  * is known to be not a general transformation (optional). The possible values are:
+  *  - #Projective if the transformation is not necessarily affine, i.e., if the
+  *    last row is not guaranteed to be [0 ... 0 1]
+  *  - #Affine if the last row can be assumed to be [0 ... 0 1]
+  *  - #Isometry if the transformation is only a concatenations of translations
+  *    and rotations.
+  *  The default is the template class parameter \c Mode.
+  *
+  * \warning unless \a traits is always set to NoShear or NoScaling, this function
+  * requires the generic inverse method of MatrixBase defined in the LU module. If
+  * you forget to include this module, then you will get hard to debug linking errors.
+  *
+  * \sa MatrixBase::inverse()
+  */
+template<typename Scalar, int Dim, int Mode, int Options>
+Transform<Scalar,Dim,Mode,Options>
+Transform<Scalar,Dim,Mode,Options>::inverse(TransformTraits hint) const
+{
+  Transform res;
+  if (hint == Projective)
+  {
+    internal::projective_transform_inverse<Transform>::run(*this, res);
+  }
+  else
+  {
+    if (hint == Isometry)
+    {
+      res.matrix().template topLeftCorner<Dim,Dim>() = linear().transpose();
+    }
+    else if(hint&Affine)
+    {
+      res.matrix().template topLeftCorner<Dim,Dim>() = linear().inverse();
+    }
+    else
+    {
+      eigen_assert(false && "Invalid transform traits in Transform::Inverse");
+    }
+    // translation and remaining parts
+    res.matrix().template topRightCorner<Dim,1>()
+      = - res.matrix().template topLeftCorner<Dim,Dim>() * translation();
+    res.makeAffine(); // we do need this, because in the beginning res is uninitialized
+  }
+  return res;
+}
+
+namespace internal {
+
+/*****************************************************
+*** Specializations of take affine part            ***
+*****************************************************/
+
+template<typename TransformType> struct transform_take_affine_part {
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef typename TransformType::AffinePart AffinePart;
+  typedef typename TransformType::ConstAffinePart ConstAffinePart;
+  static inline AffinePart run(MatrixType& m)
+  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }
+  static inline ConstAffinePart run(const MatrixType& m)
+  { return m.template block<TransformType::Dim,TransformType::HDim>(0,0); }
+};
+
+template<typename Scalar, int Dim, int Options>
+struct transform_take_affine_part<Transform<Scalar,Dim,AffineCompact, Options> > {
+  typedef typename Transform<Scalar,Dim,AffineCompact,Options>::MatrixType MatrixType;
+  static inline MatrixType& run(MatrixType& m) { return m; }
+  static inline const MatrixType& run(const MatrixType& m) { return m; }
+};
+
+/*****************************************************
+*** Specializations of construct from matrix       ***
+*****************************************************/
+
+template<typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,Dim>
+{
+  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
+  {
+    transform->linear() = other;
+    transform->translation().setZero();
+    transform->makeAffine();
+  }
+};
+
+template<typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, Dim,HDim>
+{
+  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
+  {
+    transform->affine() = other;
+    transform->makeAffine();
+  }
+};
+
+template<typename Other, int Mode, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, Mode,Options,Dim,HDim, HDim,HDim>
+{
+  static inline void run(Transform<typename Other::Scalar,Dim,Mode,Options> *transform, const Other& other)
+  { transform->matrix() = other; }
+};
+
+template<typename Other, int Options, int Dim, int HDim>
+struct transform_construct_from_matrix<Other, AffineCompact,Options,Dim,HDim, HDim,HDim>
+{
+  static inline void run(Transform<typename Other::Scalar,Dim,AffineCompact,Options> *transform, const Other& other)
+  { transform->matrix() = other.template block<Dim,HDim>(0,0); }
+};
+
+/**********************************************************
+***   Specializations of operator* with rhs EigenBase   ***
+**********************************************************/
+
+template<int LhsMode,int RhsMode>
+struct transform_product_result
+{
+  enum 
+  { 
+    Mode =
+      (LhsMode == (int)Projective    || RhsMode == (int)Projective    ) ? Projective :
+      (LhsMode == (int)Affine        || RhsMode == (int)Affine        ) ? Affine :
+      (LhsMode == (int)AffineCompact || RhsMode == (int)AffineCompact ) ? AffineCompact :
+      (LhsMode == (int)Isometry      || RhsMode == (int)Isometry      ) ? Isometry : Projective
+  };
+};
+
+template< typename TransformType, typename MatrixType >
+struct transform_right_product_impl< TransformType, MatrixType, 0 >
+{
+  typedef typename MatrixType::PlainObject ResultType;
+
+  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
+  {
+    return T.matrix() * other;
+  }
+};
+
+template< typename TransformType, typename MatrixType >
+struct transform_right_product_impl< TransformType, MatrixType, 1 >
+{
+  enum { 
+    Dim = TransformType::Dim, 
+    HDim = TransformType::HDim,
+    OtherRows = MatrixType::RowsAtCompileTime,
+    OtherCols = MatrixType::ColsAtCompileTime
+  };
+
+  typedef typename MatrixType::PlainObject ResultType;
+
+  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
+  {
+    EIGEN_STATIC_ASSERT(OtherRows==HDim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
+
+    typedef Block<ResultType, Dim, OtherCols, int(MatrixType::RowsAtCompileTime)==Dim> TopLeftLhs;
+
+    ResultType res(other.rows(),other.cols());
+    TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() = T.affine() * other;
+    res.row(OtherRows-1) = other.row(OtherRows-1);
+    
+    return res;
+  }
+};
+
+template< typename TransformType, typename MatrixType >
+struct transform_right_product_impl< TransformType, MatrixType, 2 >
+{
+  enum { 
+    Dim = TransformType::Dim, 
+    HDim = TransformType::HDim,
+    OtherRows = MatrixType::RowsAtCompileTime,
+    OtherCols = MatrixType::ColsAtCompileTime
+  };
+
+  typedef typename MatrixType::PlainObject ResultType;
+
+  static EIGEN_STRONG_INLINE ResultType run(const TransformType& T, const MatrixType& other)
+  {
+    EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES);
+
+    typedef Block<ResultType, Dim, OtherCols, true> TopLeftLhs;
+    ResultType res(Replicate<typename TransformType::ConstTranslationPart, 1, OtherCols>(T.translation(),1,other.cols()));
+    TopLeftLhs(res, 0, 0, Dim, other.cols()).noalias() += T.linear() * other;
+
+    return res;
+  }
+};
+
+/**********************************************************
+***   Specializations of operator* with lhs EigenBase   ***
+**********************************************************/
+
+// generic HDim x HDim matrix * T => Projective
+template<typename Other,int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, HDim,HDim>
+{
+  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;
+  static ResultType run(const Other& other,const TransformType& tr)
+  { return ResultType(other * tr.matrix()); }
+};
+
+// generic HDim x HDim matrix * AffineCompact => Projective
+template<typename Other, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, HDim,HDim>
+{
+  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef Transform<typename Other::Scalar,Dim,Projective,Options> ResultType;
+  static ResultType run(const Other& other,const TransformType& tr)
+  {
+    ResultType res;
+    res.matrix().noalias() = other.template block<HDim,Dim>(0,0) * tr.matrix();
+    res.matrix().col(Dim) += other.col(Dim);
+    return res;
+  }
+};
+
+// affine matrix * T
+template<typename Other,int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,HDim>
+{
+  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef TransformType ResultType;
+  static ResultType run(const Other& other,const TransformType& tr)
+  {
+    ResultType res;
+    res.affine().noalias() = other * tr.matrix();
+    res.matrix().row(Dim) = tr.matrix().row(Dim);
+    return res;
+  }
+};
+
+// affine matrix * AffineCompact
+template<typename Other, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other,AffineCompact,Options,Dim,HDim, Dim,HDim>
+{
+  typedef Transform<typename Other::Scalar,Dim,AffineCompact,Options> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef TransformType ResultType;
+  static ResultType run(const Other& other,const TransformType& tr)
+  {
+    ResultType res;
+    res.matrix().noalias() = other.template block<Dim,Dim>(0,0) * tr.matrix();
+    res.translation() += other.col(Dim);
+    return res;
+  }
+};
+
+// linear matrix * T
+template<typename Other,int Mode, int Options, int Dim, int HDim>
+struct transform_left_product_impl<Other,Mode,Options,Dim,HDim, Dim,Dim>
+{
+  typedef Transform<typename Other::Scalar,Dim,Mode,Options> TransformType;
+  typedef typename TransformType::MatrixType MatrixType;
+  typedef TransformType ResultType;
+  static ResultType run(const Other& other, const TransformType& tr)
+  {
+    TransformType res;
+    if(Mode!=int(AffineCompact))
+      res.matrix().row(Dim) = tr.matrix().row(Dim);
+    res.matrix().template topRows<Dim>().noalias()
+      = other * tr.matrix().template topRows<Dim>();
+    return res;
+  }
+};
+
+/**********************************************************
+*** Specializations of operator* with another Transform ***
+**********************************************************/
+
+template<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,false >
+{
+  enum { ResultMode = transform_product_result<LhsMode,RhsMode>::Mode };
+  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,ResultMode,LhsOptions> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    ResultType res;
+    res.linear() = lhs.linear() * rhs.linear();
+    res.translation() = lhs.linear() * rhs.translation() + lhs.translation();
+    res.makeAffine();
+    return res;
+  }
+};
+
+template<typename Scalar, int Dim, int LhsMode, int LhsOptions, int RhsMode, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,LhsMode,LhsOptions>,Transform<Scalar,Dim,RhsMode,RhsOptions>,true >
+{
+  typedef Transform<Scalar,Dim,LhsMode,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,RhsMode,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,Projective> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    return ResultType( lhs.matrix() * rhs.matrix() );
+  }
+};
+
+template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,AffineCompact,LhsOptions>,Transform<Scalar,Dim,Projective,RhsOptions>,true >
+{
+  typedef Transform<Scalar,Dim,AffineCompact,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,Projective,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,Projective> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    ResultType res;
+    res.matrix().template topRows<Dim>() = lhs.matrix() * rhs.matrix();
+    res.matrix().row(Dim) = rhs.matrix().row(Dim);
+    return res;
+  }
+};
+
+template<typename Scalar, int Dim, int LhsOptions, int RhsOptions>
+struct transform_transform_product_impl<Transform<Scalar,Dim,Projective,LhsOptions>,Transform<Scalar,Dim,AffineCompact,RhsOptions>,true >
+{
+  typedef Transform<Scalar,Dim,Projective,LhsOptions> Lhs;
+  typedef Transform<Scalar,Dim,AffineCompact,RhsOptions> Rhs;
+  typedef Transform<Scalar,Dim,Projective> ResultType;
+  static ResultType run(const Lhs& lhs, const Rhs& rhs)
+  {
+    ResultType res(lhs.matrix().template leftCols<Dim>() * rhs.matrix());
+    res.matrix().col(Dim) += lhs.matrix().col(Dim);
+    return res;
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRANSFORM_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Translation.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Translation.h
new file mode 100644
index 0000000..7fda179
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Translation.h
@@ -0,0 +1,206 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_TRANSLATION_H
+#define EIGEN_TRANSLATION_H
+
+namespace Eigen { 
+
+/** \geometry_module \ingroup Geometry_Module
+  *
+  * \class Translation
+  *
+  * \brief Represents a translation transformation
+  *
+  * \param _Scalar the scalar type, i.e., the type of the coefficients.
+  * \param _Dim the  dimension of the space, can be a compile time value or Dynamic
+  *
+  * \note This class is not aimed to be used to store a translation transformation,
+  * but rather to make easier the constructions and updates of Transform objects.
+  *
+  * \sa class Scaling, class Transform
+  */
+template<typename _Scalar, int _Dim>
+class Translation
+{
+public:
+  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim)
+  /** dimension of the space */
+  enum { Dim = _Dim };
+  /** the scalar type of the coefficients */
+  typedef _Scalar Scalar;
+  /** corresponding vector type */
+  typedef Matrix<Scalar,Dim,1> VectorType;
+  /** corresponding linear transformation matrix type */
+  typedef Matrix<Scalar,Dim,Dim> LinearMatrixType;
+  /** corresponding affine transformation type */
+  typedef Transform<Scalar,Dim,Affine> AffineTransformType;
+  /** corresponding isometric transformation type */
+  typedef Transform<Scalar,Dim,Isometry> IsometryTransformType;
+
+protected:
+
+  VectorType m_coeffs;
+
+public:
+
+  /** Default constructor without initialization. */
+  Translation() {}
+  /**  */
+  inline Translation(const Scalar& sx, const Scalar& sy)
+  {
+    eigen_assert(Dim==2);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+  }
+  /**  */
+  inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz)
+  {
+    eigen_assert(Dim==3);
+    m_coeffs.x() = sx;
+    m_coeffs.y() = sy;
+    m_coeffs.z() = sz;
+  }
+  /** Constructs and initialize the translation transformation from a vector of translation coefficients */
+  explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {}
+
+  /** \brief Retruns the x-translation by value. **/
+  inline Scalar x() const { return m_coeffs.x(); }
+  /** \brief Retruns the y-translation by value. **/
+  inline Scalar y() const { return m_coeffs.y(); }
+  /** \brief Retruns the z-translation by value. **/
+  inline Scalar z() const { return m_coeffs.z(); }
+
+  /** \brief Retruns the x-translation as a reference. **/
+  inline Scalar& x() { return m_coeffs.x(); }
+  /** \brief Retruns the y-translation as a reference. **/
+  inline Scalar& y() { return m_coeffs.y(); }
+  /** \brief Retruns the z-translation as a reference. **/
+  inline Scalar& z() { return m_coeffs.z(); }
+
+  const VectorType& vector() const { return m_coeffs; }
+  VectorType& vector() { return m_coeffs; }
+
+  const VectorType& translation() const { return m_coeffs; }
+  VectorType& translation() { return m_coeffs; }
+
+  /** Concatenates two translation */
+  inline Translation operator* (const Translation& other) const
+  { return Translation(m_coeffs + other.m_coeffs); }
+
+  /** Concatenates a translation and a uniform scaling */
+  inline AffineTransformType operator* (const UniformScaling<Scalar>& other) const;
+
+  /** Concatenates a translation and a linear transformation */
+  template<typename OtherDerived>
+  inline AffineTransformType operator* (const EigenBase<OtherDerived>& linear) const;
+
+  /** Concatenates a translation and a rotation */
+  template<typename Derived>
+  inline IsometryTransformType operator*(const RotationBase<Derived,Dim>& r) const
+  { return *this * IsometryTransformType(r); }
+
+  /** \returns the concatenation of a linear transformation \a l with the translation \a t */
+  // its a nightmare to define a templated friend function outside its declaration
+  template<typename OtherDerived> friend
+  inline AffineTransformType operator*(const EigenBase<OtherDerived>& linear, const Translation& t)
+  {
+    AffineTransformType res;
+    res.matrix().setZero();
+    res.linear() = linear.derived();
+    res.translation() = linear.derived() * t.m_coeffs;
+    res.matrix().row(Dim).setZero();
+    res(Dim,Dim) = Scalar(1);
+    return res;
+  }
+
+  /** Concatenates a translation and a transformation */
+  template<int Mode, int Options>
+  inline Transform<Scalar,Dim,Mode> operator* (const Transform<Scalar,Dim,Mode,Options>& t) const
+  {
+    Transform<Scalar,Dim,Mode> res = t;
+    res.pretranslate(m_coeffs);
+    return res;
+  }
+
+  /** Applies translation to vector */
+  inline VectorType operator* (const VectorType& other) const
+  { return m_coeffs + other; }
+
+  /** \returns the inverse translation (opposite) */
+  Translation inverse() const { return Translation(-m_coeffs); }
+
+  Translation& operator=(const Translation& other)
+  {
+    m_coeffs = other.m_coeffs;
+    return *this;
+  }
+
+  static const Translation Identity() { return Translation(VectorType::Zero()); }
+
+  /** \returns \c *this with scalar type casted to \a NewScalarType
+    *
+    * Note that if \a NewScalarType is equal to the current scalar type of \c *this
+    * then this function smartly returns a const reference to \c *this.
+    */
+  template<typename NewScalarType>
+  inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const
+  { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); }
+
+  /** Copy constructor with scalar type conversion */
+  template<typename OtherScalarType>
+  inline explicit Translation(const Translation<OtherScalarType,Dim>& other)
+  { m_coeffs = other.vector().template cast<Scalar>(); }
+
+  /** \returns \c true if \c *this is approximately equal to \a other, within the precision
+    * determined by \a prec.
+    *
+    * \sa MatrixBase::isApprox() */
+  bool isApprox(const Translation& other, typename NumTraits<Scalar>::Real prec = NumTraits<Scalar>::dummy_precision()) const
+  { return m_coeffs.isApprox(other.m_coeffs, prec); }
+
+};
+
+/** \addtogroup Geometry_Module */
+//@{
+typedef Translation<float, 2> Translation2f;
+typedef Translation<double,2> Translation2d;
+typedef Translation<float, 3> Translation3f;
+typedef Translation<double,3> Translation3d;
+//@}
+
+template<typename Scalar, int Dim>
+inline typename Translation<Scalar,Dim>::AffineTransformType
+Translation<Scalar,Dim>::operator* (const UniformScaling<Scalar>& other) const
+{
+  AffineTransformType res;
+  res.matrix().setZero();
+  res.linear().diagonal().fill(other.factor());
+  res.translation() = m_coeffs;
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+template<typename Scalar, int Dim>
+template<typename OtherDerived>
+inline typename Translation<Scalar,Dim>::AffineTransformType
+Translation<Scalar,Dim>::operator* (const EigenBase<OtherDerived>& linear) const
+{
+  AffineTransformType res;
+  res.matrix().setZero();
+  res.linear() = linear.derived();
+  res.translation() = m_coeffs;
+  res.matrix().row(Dim).setZero();
+  res(Dim,Dim) = Scalar(1);
+  return res;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_TRANSLATION_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/Umeyama.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/Umeyama.h
new file mode 100644
index 0000000..345b47e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/Umeyama.h
@@ -0,0 +1,177 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_UMEYAMA_H
+#define EIGEN_UMEYAMA_H
+
+// This file requires the user to include 
+// * Eigen/Core
+// * Eigen/LU 
+// * Eigen/SVD
+// * Eigen/Array
+
+namespace Eigen { 
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+
+// These helpers are required since it allows to use mixed types as parameters
+// for the Umeyama. The problem with mixed parameters is that the return type
+// cannot trivially be deduced when float and double types are mixed.
+namespace internal {
+
+// Compile time return type deduction for different MatrixBase types.
+// Different means here different alignment and parameters but the same underlying
+// real scalar type.
+template<typename MatrixType, typename OtherMatrixType>
+struct umeyama_transform_matrix_type
+{
+  enum {
+    MinRowsAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(MatrixType::RowsAtCompileTime, OtherMatrixType::RowsAtCompileTime),
+
+    // When possible we want to choose some small fixed size value since the result
+    // is likely to fit on the stack. So here, EIGEN_SIZE_MIN_PREFER_DYNAMIC is not what we want.
+    HomogeneousDimension = int(MinRowsAtCompileTime) == Dynamic ? Dynamic : int(MinRowsAtCompileTime)+1
+  };
+
+  typedef Matrix<typename traits<MatrixType>::Scalar,
+    HomogeneousDimension,
+    HomogeneousDimension,
+    AutoAlign | (traits<MatrixType>::Flags & RowMajorBit ? RowMajor : ColMajor),
+    HomogeneousDimension,
+    HomogeneousDimension
+  > type;
+};
+
+}
+
+#endif
+
+/**
+* \geometry_module \ingroup Geometry_Module
+*
+* \brief Returns the transformation between two point sets.
+*
+* The algorithm is based on:
+* "Least-squares estimation of transformation parameters between two point patterns",
+* Shinji Umeyama, PAMI 1991, DOI: 10.1109/34.88573
+*
+* It estimates parameters \f$ c, \mathbf{R}, \f$ and \f$ \mathbf{t} \f$ such that
+* \f{align*}
+*   \frac{1}{n} \sum_{i=1}^n \vert\vert y_i - (c\mathbf{R}x_i + \mathbf{t}) \vert\vert_2^2
+* \f}
+* is minimized.
+*
+* The algorithm is based on the analysis of the covariance matrix
+* \f$ \Sigma_{\mathbf{x}\mathbf{y}} \in \mathbb{R}^{d \times d} \f$
+* of the input point sets \f$ \mathbf{x} \f$ and \f$ \mathbf{y} \f$ where 
+* \f$d\f$ is corresponding to the dimension (which is typically small).
+* The analysis is involving the SVD having a complexity of \f$O(d^3)\f$
+* though the actual computational effort lies in the covariance
+* matrix computation which has an asymptotic lower bound of \f$O(dm)\f$ when 
+* the input point sets have dimension \f$d \times m\f$.
+*
+* Currently the method is working only for floating point matrices.
+*
+* \todo Should the return type of umeyama() become a Transform?
+*
+* \param src Source points \f$ \mathbf{x} = \left( x_1, \hdots, x_n \right) \f$.
+* \param dst Destination points \f$ \mathbf{y} = \left( y_1, \hdots, y_n \right) \f$.
+* \param with_scaling Sets \f$ c=1 \f$ when <code>false</code> is passed.
+* \return The homogeneous transformation 
+* \f{align*}
+*   T = \begin{bmatrix} c\mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{bmatrix}
+* \f}
+* minimizing the resudiual above. This transformation is always returned as an 
+* Eigen::Matrix.
+*/
+template <typename Derived, typename OtherDerived>
+typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type
+umeyama(const MatrixBase<Derived>& src, const MatrixBase<OtherDerived>& dst, bool with_scaling = true)
+{
+  typedef typename internal::umeyama_transform_matrix_type<Derived, OtherDerived>::type TransformationMatrixType;
+  typedef typename internal::traits<TransformationMatrixType>::Scalar Scalar;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  typedef typename Derived::Index Index;
+
+  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsComplex, NUMERIC_TYPE_MUST_BE_REAL)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename internal::traits<OtherDerived>::Scalar>::value),
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+  enum { Dimension = EIGEN_SIZE_MIN_PREFER_DYNAMIC(Derived::RowsAtCompileTime, OtherDerived::RowsAtCompileTime) };
+
+  typedef Matrix<Scalar, Dimension, 1> VectorType;
+  typedef Matrix<Scalar, Dimension, Dimension> MatrixType;
+  typedef typename internal::plain_matrix_type_row_major<Derived>::type RowMajorMatrixType;
+
+  const Index m = src.rows(); // dimension
+  const Index n = src.cols(); // number of measurements
+
+  // required for demeaning ...
+  const RealScalar one_over_n = 1 / static_cast<RealScalar>(n);
+
+  // computation of mean
+  const VectorType src_mean = src.rowwise().sum() * one_over_n;
+  const VectorType dst_mean = dst.rowwise().sum() * one_over_n;
+
+  // demeaning of src and dst points
+  const RowMajorMatrixType src_demean = src.colwise() - src_mean;
+  const RowMajorMatrixType dst_demean = dst.colwise() - dst_mean;
+
+  // Eq. (36)-(37)
+  const Scalar src_var = src_demean.rowwise().squaredNorm().sum() * one_over_n;
+
+  // Eq. (38)
+  const MatrixType sigma = one_over_n * dst_demean * src_demean.transpose();
+
+  JacobiSVD<MatrixType> svd(sigma, ComputeFullU | ComputeFullV);
+
+  // Initialize the resulting transformation with an identity matrix...
+  TransformationMatrixType Rt = TransformationMatrixType::Identity(m+1,m+1);
+
+  // Eq. (39)
+  VectorType S = VectorType::Ones(m);
+  if (sigma.determinant()<0) S(m-1) = -1;
+
+  // Eq. (40) and (43)
+  const VectorType& d = svd.singularValues();
+  Index rank = 0; for (Index i=0; i<m; ++i) if (!internal::isMuchSmallerThan(d.coeff(i),d.coeff(0))) ++rank;
+  if (rank == m-1) {
+    if ( svd.matrixU().determinant() * svd.matrixV().determinant() > 0 ) {
+      Rt.block(0,0,m,m).noalias() = svd.matrixU()*svd.matrixV().transpose();
+    } else {
+      const Scalar s = S(m-1); S(m-1) = -1;
+      Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
+      S(m-1) = s;
+    }
+  } else {
+    Rt.block(0,0,m,m).noalias() = svd.matrixU() * S.asDiagonal() * svd.matrixV().transpose();
+  }
+
+  if (with_scaling)
+  {
+    // Eq. (42)
+    const Scalar c = 1/src_var * svd.singularValues().dot(S);
+
+    // Eq. (41)
+    Rt.col(m).head(m) = dst_mean;
+    Rt.col(m).head(m).noalias() -= c*Rt.topLeftCorner(m,m)*src_mean;
+    Rt.block(0,0,m,m) *= c;
+  }
+  else
+  {
+    Rt.col(m).head(m) = dst_mean;
+    Rt.col(m).head(m).noalias() -= Rt.topLeftCorner(m,m)*src_mean;
+  }
+
+  return Rt;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_UMEYAMA_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/CMakeLists.txt
new file mode 100644
index 0000000..1267a79
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Geometry_arch_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Geometry_arch_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Geometry/arch COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/Geometry_SSE.h b/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/Geometry_SSE.h
new file mode 100644
index 0000000..3d8284f
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Geometry/arch/Geometry_SSE.h
@@ -0,0 +1,115 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Rohit Garg <rpg.314 at gmail.com>
+// Copyright (C) 2009-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_GEOMETRY_SSE_H
+#define EIGEN_GEOMETRY_SSE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<class Derived, class OtherDerived>
+struct quat_product<Architecture::SSE, Derived, OtherDerived, float, Aligned>
+{
+  static inline Quaternion<float> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
+  {
+    const __m128 mask = _mm_castsi128_ps(_mm_setr_epi32(0,0,0,0x80000000));
+    Quaternion<float> res;
+    __m128 a = _a.coeffs().template packet<Aligned>(0);
+    __m128 b = _b.coeffs().template packet<Aligned>(0);
+    __m128 flip1 = _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a,1,2,0,2),
+                                         vec4f_swizzle1(b,2,0,1,2)),mask);
+    __m128 flip2 = _mm_xor_ps(_mm_mul_ps(vec4f_swizzle1(a,3,3,3,1),
+                                         vec4f_swizzle1(b,0,1,2,1)),mask);
+    pstore(&res.x(),
+              _mm_add_ps(_mm_sub_ps(_mm_mul_ps(a,vec4f_swizzle1(b,3,3,3,3)),
+                                    _mm_mul_ps(vec4f_swizzle1(a,2,0,1,0),
+                                               vec4f_swizzle1(b,1,2,0,0))),
+                         _mm_add_ps(flip1,flip2)));
+    return res;
+  }
+};
+
+template<typename VectorLhs,typename VectorRhs>
+struct cross3_impl<Architecture::SSE,VectorLhs,VectorRhs,float,true>
+{
+  static inline typename plain_matrix_type<VectorLhs>::type
+  run(const VectorLhs& lhs, const VectorRhs& rhs)
+  {
+    __m128 a = lhs.template packet<VectorLhs::Flags&AlignedBit ? Aligned : Unaligned>(0);
+    __m128 b = rhs.template packet<VectorRhs::Flags&AlignedBit ? Aligned : Unaligned>(0);
+    __m128 mul1=_mm_mul_ps(vec4f_swizzle1(a,1,2,0,3),vec4f_swizzle1(b,2,0,1,3));
+    __m128 mul2=_mm_mul_ps(vec4f_swizzle1(a,2,0,1,3),vec4f_swizzle1(b,1,2,0,3));
+    typename plain_matrix_type<VectorLhs>::type res;
+    pstore(&res.x(),_mm_sub_ps(mul1,mul2));
+    return res;
+  }
+};
+
+
+
+
+template<class Derived, class OtherDerived>
+struct quat_product<Architecture::SSE, Derived, OtherDerived, double, Aligned>
+{
+  static inline Quaternion<double> run(const QuaternionBase<Derived>& _a, const QuaternionBase<OtherDerived>& _b)
+  {
+  const Packet2d mask = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));
+
+  Quaternion<double> res;
+
+  const double* a = _a.coeffs().data();
+  Packet2d b_xy = _b.coeffs().template packet<Aligned>(0);
+  Packet2d b_zw = _b.coeffs().template packet<Aligned>(2);
+  Packet2d a_xx = pset1<Packet2d>(a[0]);
+  Packet2d a_yy = pset1<Packet2d>(a[1]);
+  Packet2d a_zz = pset1<Packet2d>(a[2]);
+  Packet2d a_ww = pset1<Packet2d>(a[3]);
+
+  // two temporaries:
+  Packet2d t1, t2;
+
+  /*
+   * t1 = ww*xy + yy*zw
+   * t2 = zz*xy - xx*zw
+   * res.xy = t1 +/- swap(t2)
+   */
+  t1 = padd(pmul(a_ww, b_xy), pmul(a_yy, b_zw));
+  t2 = psub(pmul(a_zz, b_xy), pmul(a_xx, b_zw));
+#ifdef EIGEN_VECTORIZE_SSE3
+  EIGEN_UNUSED_VARIABLE(mask)
+  pstore(&res.x(), _mm_addsub_pd(t1, preverse(t2)));
+#else
+  pstore(&res.x(), padd(t1, pxor(mask,preverse(t2))));
+#endif
+  
+  /*
+   * t1 = ww*zw - yy*xy
+   * t2 = zz*zw + xx*xy
+   * res.zw = t1 -/+ swap(t2) = swap( swap(t1) +/- t2)
+   */
+  t1 = psub(pmul(a_ww, b_zw), pmul(a_yy, b_xy));
+  t2 = padd(pmul(a_zz, b_zw), pmul(a_xx, b_xy));
+#ifdef EIGEN_VECTORIZE_SSE3
+  EIGEN_UNUSED_VARIABLE(mask)
+  pstore(&res.z(), preverse(_mm_addsub_pd(preverse(t1), t2)));
+#else
+  pstore(&res.z(), psub(t1, pxor(mask,preverse(t2))));
+#endif
+
+  return res;
+}
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_GEOMETRY_SSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Householder/BlockHouseholder.h b/vendor/eigen-3.1.91/Eigen/src/Householder/BlockHouseholder.h
new file mode 100644
index 0000000..1991c65
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Householder/BlockHouseholder.h
@@ -0,0 +1,68 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Vincent Lejeune
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BLOCK_HOUSEHOLDER_H
+#define EIGEN_BLOCK_HOUSEHOLDER_H
+
+// This file contains some helper function to deal with block householder reflectors
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal */
+template<typename TriangularFactorType,typename VectorsType,typename CoeffsType>
+void make_block_householder_triangular_factor(TriangularFactorType& triFactor, const VectorsType& vectors, const CoeffsType& hCoeffs)
+{
+  typedef typename TriangularFactorType::Index Index;
+  typedef typename VectorsType::Scalar Scalar;
+  const Index nbVecs = vectors.cols();
+  eigen_assert(triFactor.rows() == nbVecs && triFactor.cols() == nbVecs && vectors.rows()>=nbVecs);
+
+  for(Index i = 0; i < nbVecs; i++)
+  {
+    Index rs = vectors.rows() - i;
+    Scalar Vii = vectors(i,i);
+    vectors.const_cast_derived().coeffRef(i,i) = Scalar(1);
+    triFactor.col(i).head(i).noalias() = -hCoeffs(i) * vectors.block(i, 0, rs, i).adjoint()
+                                       * vectors.col(i).tail(rs);
+    vectors.const_cast_derived().coeffRef(i, i) = Vii;
+    // FIXME add .noalias() once the triangular product can work inplace
+    triFactor.col(i).head(i) = triFactor.block(0,0,i,i).template triangularView<Upper>()
+                             * triFactor.col(i).head(i);
+    triFactor(i,i) = hCoeffs(i);
+  }
+}
+
+/** \internal */
+template<typename MatrixType,typename VectorsType,typename CoeffsType>
+void apply_block_householder_on_the_left(MatrixType& mat, const VectorsType& vectors, const CoeffsType& hCoeffs)
+{
+  typedef typename MatrixType::Index Index;
+  enum { TFactorSize = MatrixType::ColsAtCompileTime };
+  Index nbVecs = vectors.cols();
+  Matrix<typename MatrixType::Scalar, TFactorSize, TFactorSize> T(nbVecs,nbVecs);
+  make_block_householder_triangular_factor(T, vectors, hCoeffs);
+
+  const TriangularView<const VectorsType, UnitLower>& V(vectors);
+
+  // A -= V T V^* A
+  Matrix<typename MatrixType::Scalar,VectorsType::ColsAtCompileTime,MatrixType::ColsAtCompileTime,0,
+         VectorsType::MaxColsAtCompileTime,MatrixType::MaxColsAtCompileTime> tmp = V.adjoint() * mat;
+  // FIXME add .noalias() once the triangular product can work inplace
+  tmp = T.template triangularView<Upper>().adjoint() * tmp;
+  mat.noalias() -= V * tmp;
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BLOCK_HOUSEHOLDER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Householder/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Householder/CMakeLists.txt
new file mode 100644
index 0000000..ce4937d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Householder/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Householder_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Householder_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Householder COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Householder/Householder.h b/vendor/eigen-3.1.91/Eigen/src/Householder/Householder.h
new file mode 100644
index 0000000..b7cfa9b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Householder/Householder.h
@@ -0,0 +1,171 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_HOUSEHOLDER_H
+#define EIGEN_HOUSEHOLDER_H
+
+namespace Eigen { 
+
+namespace internal {
+template<int n> struct decrement_size
+{
+  enum {
+    ret = n==Dynamic ? n : n-1
+  };
+};
+}
+
+/** Computes the elementary reflector H such that:
+  * \f$ H *this = [ beta 0 ... 0]^T \f$
+  * where the transformation H is:
+  * \f$ H = I - tau v v^*\f$
+  * and the vector v is:
+  * \f$ v^T = [1 essential^T] \f$
+  *
+  * The essential part of the vector \c v is stored in *this.
+  * 
+  * On output:
+  * \param tau the scaling factor of the Householder transformation
+  * \param beta the result of H * \c *this
+  *
+  * \sa MatrixBase::makeHouseholder(), MatrixBase::applyHouseholderOnTheLeft(),
+  *     MatrixBase::applyHouseholderOnTheRight()
+  */
+template<typename Derived>
+void MatrixBase<Derived>::makeHouseholderInPlace(Scalar& tau, RealScalar& beta)
+{
+  VectorBlock<Derived, internal::decrement_size<Base::SizeAtCompileTime>::ret> essentialPart(derived(), 1, size()-1);
+  makeHouseholder(essentialPart, tau, beta);
+}
+
+/** Computes the elementary reflector H such that:
+  * \f$ H *this = [ beta 0 ... 0]^T \f$
+  * where the transformation H is:
+  * \f$ H = I - tau v v^*\f$
+  * and the vector v is:
+  * \f$ v^T = [1 essential^T] \f$
+  *
+  * On output:
+  * \param essential the essential part of the vector \c v
+  * \param tau the scaling factor of the Householder transformation
+  * \param beta the result of H * \c *this
+  *
+  * \sa MatrixBase::makeHouseholderInPlace(), MatrixBase::applyHouseholderOnTheLeft(),
+  *     MatrixBase::applyHouseholderOnTheRight()
+  */
+template<typename Derived>
+template<typename EssentialPart>
+void MatrixBase<Derived>::makeHouseholder(
+  EssentialPart& essential,
+  Scalar& tau,
+  RealScalar& beta) const
+{
+  using std::sqrt;
+  using internal::conj;
+  
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(EssentialPart)
+  VectorBlock<const Derived, EssentialPart::SizeAtCompileTime> tail(derived(), 1, size()-1);
+  
+  RealScalar tailSqNorm = size()==1 ? RealScalar(0) : tail.squaredNorm();
+  Scalar c0 = coeff(0);
+
+  if(tailSqNorm == RealScalar(0) && internal::imag(c0)==RealScalar(0))
+  {
+    tau = RealScalar(0);
+    beta = internal::real(c0);
+    essential.setZero();
+  }
+  else
+  {
+    beta = sqrt(internal::abs2(c0) + tailSqNorm);
+    if (internal::real(c0)>=RealScalar(0))
+      beta = -beta;
+    essential = tail / (c0 - beta);
+    tau = conj((beta - c0) / beta);
+  }
+}
+
+/** Apply the elementary reflector H given by
+  * \f$ H = I - tau v v^*\f$
+  * with
+  * \f$ v^T = [1 essential^T] \f$
+  * from the left to a vector or matrix.
+  *
+  * On input:
+  * \param essential the essential part of the vector \c v
+  * \param tau the scaling factor of the Householder transformation
+  * \param workspace a pointer to working space with at least
+  *                  this->cols() * essential.size() entries
+  *
+  * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), 
+  *     MatrixBase::applyHouseholderOnTheRight()
+  */
+template<typename Derived>
+template<typename EssentialPart>
+void MatrixBase<Derived>::applyHouseholderOnTheLeft(
+  const EssentialPart& essential,
+  const Scalar& tau,
+  Scalar* workspace)
+{
+  if(rows() == 1)
+  {
+    *this *= Scalar(1)-tau;
+  }
+  else
+  {
+    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());
+    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());
+    tmp.noalias() = essential.adjoint() * bottom;
+    tmp += this->row(0);
+    this->row(0) -= tau * tmp;
+    bottom.noalias() -= tau * essential * tmp;
+  }
+}
+
+/** Apply the elementary reflector H given by
+  * \f$ H = I - tau v v^*\f$
+  * with
+  * \f$ v^T = [1 essential^T] \f$
+  * from the right to a vector or matrix.
+  *
+  * On input:
+  * \param essential the essential part of the vector \c v
+  * \param tau the scaling factor of the Householder transformation
+  * \param workspace a pointer to working space with at least
+  *                  this->cols() * essential.size() entries
+  *
+  * \sa MatrixBase::makeHouseholder(), MatrixBase::makeHouseholderInPlace(), 
+  *     MatrixBase::applyHouseholderOnTheLeft()
+  */
+template<typename Derived>
+template<typename EssentialPart>
+void MatrixBase<Derived>::applyHouseholderOnTheRight(
+  const EssentialPart& essential,
+  const Scalar& tau,
+  Scalar* workspace)
+{
+  if(cols() == 1)
+  {
+    *this *= Scalar(1)-tau;
+  }
+  else
+  {
+    Map<typename internal::plain_col_type<PlainObject>::type> tmp(workspace,rows());
+    Block<Derived, Derived::RowsAtCompileTime, EssentialPart::SizeAtCompileTime> right(derived(), 0, 1, rows(), cols()-1);
+    tmp.noalias() = right * essential.conjugate();
+    tmp += this->col(0);
+    this->col(0) -= tau * tmp;
+    right.noalias() -= tau * tmp * essential.transpose();
+  }
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_HOUSEHOLDER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Householder/HouseholderSequence.h b/vendor/eigen-3.1.91/Eigen/src/Householder/HouseholderSequence.h
new file mode 100644
index 0000000..1e71e16
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Householder/HouseholderSequence.h
@@ -0,0 +1,441 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_HOUSEHOLDER_SEQUENCE_H
+#define EIGEN_HOUSEHOLDER_SEQUENCE_H
+
+namespace Eigen { 
+
+/** \ingroup Householder_Module
+  * \householder_module
+  * \class HouseholderSequence
+  * \brief Sequence of Householder reflections acting on subspaces with decreasing size
+  * \tparam VectorsType type of matrix containing the Householder vectors
+  * \tparam CoeffsType  type of vector containing the Householder coefficients
+  * \tparam Side        either OnTheLeft (the default) or OnTheRight
+  *
+  * This class represents a product sequence of Householder reflections where the first Householder reflection
+  * acts on the whole space, the second Householder reflection leaves the one-dimensional subspace spanned by
+  * the first unit vector invariant, the third Householder reflection leaves the two-dimensional subspace
+  * spanned by the first two unit vectors invariant, and so on up to the last reflection which leaves all but
+  * one dimensions invariant and acts only on the last dimension. Such sequences of Householder reflections
+  * are used in several algorithms to zero out certain parts of a matrix. Indeed, the methods
+  * HessenbergDecomposition::matrixQ(), Tridiagonalization::matrixQ(), HouseholderQR::householderQ(),
+  * and ColPivHouseholderQR::householderQ() all return a %HouseholderSequence.
+  *
+  * More precisely, the class %HouseholderSequence represents an \f$ n \times n \f$ matrix \f$ H \f$ of the
+  * form \f$ H = \prod_{i=0}^{n-1} H_i \f$ where the i-th Householder reflection is \f$ H_i = I - h_i v_i
+  * v_i^* \f$. The i-th Householder coefficient \f$ h_i \f$ is a scalar and the i-th Householder vector \f$
+  * v_i \f$ is a vector of the form
+  * \f[ 
+  * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ]. 
+  * \f]
+  * The last \f$ n-i \f$ entries of \f$ v_i \f$ are called the essential part of the Householder vector.
+  *
+  * Typical usages are listed below, where H is a HouseholderSequence:
+  * \code
+  * A.applyOnTheRight(H);             // A = A * H
+  * A.applyOnTheLeft(H);              // A = H * A
+  * A.applyOnTheRight(H.adjoint());   // A = A * H^*
+  * A.applyOnTheLeft(H.adjoint());    // A = H^* * A
+  * MatrixXd Q = H;                   // conversion to a dense matrix
+  * \endcode
+  * In addition to the adjoint, you can also apply the inverse (=adjoint), the transpose, and the conjugate operators.
+  *
+  * See the documentation for HouseholderSequence(const VectorsType&, const CoeffsType&) for an example.
+  *
+  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+
+namespace internal {
+
+template<typename VectorsType, typename CoeffsType, int Side>
+struct traits<HouseholderSequence<VectorsType,CoeffsType,Side> >
+{
+  typedef typename VectorsType::Scalar Scalar;
+  typedef typename VectorsType::Index Index;
+  typedef typename VectorsType::StorageKind StorageKind;
+  enum {
+    RowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::RowsAtCompileTime
+                                        : traits<VectorsType>::ColsAtCompileTime,
+    ColsAtCompileTime = RowsAtCompileTime,
+    MaxRowsAtCompileTime = Side==OnTheLeft ? traits<VectorsType>::MaxRowsAtCompileTime
+                                           : traits<VectorsType>::MaxColsAtCompileTime,
+    MaxColsAtCompileTime = MaxRowsAtCompileTime,
+    Flags = 0
+  };
+};
+
+template<typename VectorsType, typename CoeffsType, int Side>
+struct hseq_side_dependent_impl
+{
+  typedef Block<const VectorsType, Dynamic, 1> EssentialVectorType;
+  typedef HouseholderSequence<VectorsType, CoeffsType, OnTheLeft> HouseholderSequenceType;
+  typedef typename VectorsType::Index Index;
+  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)
+  {
+    Index start = k+1+h.m_shift;
+    return Block<const VectorsType,Dynamic,1>(h.m_vectors, start, k, h.rows()-start, 1);
+  }
+};
+
+template<typename VectorsType, typename CoeffsType>
+struct hseq_side_dependent_impl<VectorsType, CoeffsType, OnTheRight>
+{
+  typedef Transpose<Block<const VectorsType, 1, Dynamic> > EssentialVectorType;
+  typedef HouseholderSequence<VectorsType, CoeffsType, OnTheRight> HouseholderSequenceType;
+  typedef typename VectorsType::Index Index;
+  static inline const EssentialVectorType essentialVector(const HouseholderSequenceType& h, Index k)
+  {
+    Index start = k+1+h.m_shift;
+    return Block<const VectorsType,1,Dynamic>(h.m_vectors, k, start, 1, h.rows()-start).transpose();
+  }
+};
+
+template<typename OtherScalarType, typename MatrixType> struct matrix_type_times_scalar_type
+{
+  typedef typename scalar_product_traits<OtherScalarType, typename MatrixType::Scalar>::ReturnType
+    ResultScalar;
+  typedef Matrix<ResultScalar, MatrixType::RowsAtCompileTime, MatrixType::ColsAtCompileTime,
+                 0, MatrixType::MaxRowsAtCompileTime, MatrixType::MaxColsAtCompileTime> Type;
+};
+
+} // end namespace internal
+
+template<typename VectorsType, typename CoeffsType, int Side> class HouseholderSequence
+  : public EigenBase<HouseholderSequence<VectorsType,CoeffsType,Side> >
+{
+    enum {
+      RowsAtCompileTime = internal::traits<HouseholderSequence>::RowsAtCompileTime,
+      ColsAtCompileTime = internal::traits<HouseholderSequence>::ColsAtCompileTime,
+      MaxRowsAtCompileTime = internal::traits<HouseholderSequence>::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = internal::traits<HouseholderSequence>::MaxColsAtCompileTime
+    };
+    typedef typename internal::traits<HouseholderSequence>::Scalar Scalar;
+    typedef typename VectorsType::Index Index;
+
+    typedef typename internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::EssentialVectorType
+            EssentialVectorType;
+
+  public:
+
+    typedef HouseholderSequence<
+      VectorsType,
+      typename internal::conditional<NumTraits<Scalar>::IsComplex,
+        typename internal::remove_all<typename CoeffsType::ConjugateReturnType>::type,
+        CoeffsType>::type,
+      Side
+    > ConjugateReturnType;
+
+    /** \brief Constructor.
+      * \param[in]  v      %Matrix containing the essential parts of the Householder vectors
+      * \param[in]  h      Vector containing the Householder coefficients
+      *
+      * Constructs the Householder sequence with coefficients given by \p h and vectors given by \p v. The
+      * i-th Householder coefficient \f$ h_i \f$ is given by \p h(i) and the essential part of the i-th
+      * Householder vector \f$ v_i \f$ is given by \p v(k,i) with \p k > \p i (the subdiagonal part of the
+      * i-th column). If \p v has fewer columns than rows, then the Householder sequence contains as many
+      * Householder reflections as there are columns.
+      *
+      * \note The %HouseholderSequence object stores \p v and \p h by reference.
+      *
+      * Example: \include HouseholderSequence_HouseholderSequence.cpp
+      * Output: \verbinclude HouseholderSequence_HouseholderSequence.out
+      *
+      * \sa setLength(), setShift()
+      */
+    HouseholderSequence(const VectorsType& v, const CoeffsType& h)
+      : m_vectors(v), m_coeffs(h), m_trans(false), m_length(v.diagonalSize()),
+        m_shift(0)
+    {
+    }
+
+    /** \brief Copy constructor. */
+    HouseholderSequence(const HouseholderSequence& other)
+      : m_vectors(other.m_vectors),
+        m_coeffs(other.m_coeffs),
+        m_trans(other.m_trans),
+        m_length(other.m_length),
+        m_shift(other.m_shift)
+    {
+    }
+
+    /** \brief Number of rows of transformation viewed as a matrix.
+      * \returns Number of rows 
+      * \details This equals the dimension of the space that the transformation acts on.
+      */
+    Index rows() const { return Side==OnTheLeft ? m_vectors.rows() : m_vectors.cols(); }
+
+    /** \brief Number of columns of transformation viewed as a matrix.
+      * \returns Number of columns
+      * \details This equals the dimension of the space that the transformation acts on.
+      */
+    Index cols() const { return rows(); }
+
+    /** \brief Essential part of a Householder vector.
+      * \param[in]  k  Index of Householder reflection
+      * \returns    Vector containing non-trivial entries of k-th Householder vector
+      *
+      * This function returns the essential part of the Householder vector \f$ v_i \f$. This is a vector of
+      * length \f$ n-i \f$ containing the last \f$ n-i \f$ entries of the vector
+      * \f[ 
+      * v_i = [\underbrace{0, \ldots, 0}_{i-1\mbox{ zeros}}, 1, \underbrace{*, \ldots,*}_{n-i\mbox{ arbitrary entries}} ]. 
+      * \f]
+      * The index \f$ i \f$ equals \p k + shift(), corresponding to the k-th column of the matrix \p v
+      * passed to the constructor.
+      *
+      * \sa setShift(), shift()
+      */
+    const EssentialVectorType essentialVector(Index k) const
+    {
+      eigen_assert(k >= 0 && k < m_length);
+      return internal::hseq_side_dependent_impl<VectorsType,CoeffsType,Side>::essentialVector(*this, k);
+    }
+
+    /** \brief %Transpose of the Householder sequence. */
+    HouseholderSequence transpose() const
+    {
+      return HouseholderSequence(*this).setTrans(!m_trans);
+    }
+
+    /** \brief Complex conjugate of the Householder sequence. */
+    ConjugateReturnType conjugate() const
+    {
+      return ConjugateReturnType(m_vectors, m_coeffs.conjugate())
+             .setTrans(m_trans)
+             .setLength(m_length)
+             .setShift(m_shift);
+    }
+
+    /** \brief Adjoint (conjugate transpose) of the Householder sequence. */
+    ConjugateReturnType adjoint() const
+    {
+      return conjugate().setTrans(!m_trans);
+    }
+
+    /** \brief Inverse of the Householder sequence (equals the adjoint). */
+    ConjugateReturnType inverse() const { return adjoint(); }
+
+    /** \internal */
+    template<typename DestType> inline void evalTo(DestType& dst) const
+    {
+      Matrix<Scalar, DestType::RowsAtCompileTime, 1,
+             AutoAlign|ColMajor, DestType::MaxRowsAtCompileTime, 1> workspace(rows());
+      evalTo(dst, workspace);
+    }
+
+    /** \internal */
+    template<typename Dest, typename Workspace>
+    void evalTo(Dest& dst, Workspace& workspace) const
+    {
+      workspace.resize(rows());
+      Index vecs = m_length;
+      if(    internal::is_same<typename internal::remove_all<VectorsType>::type,Dest>::value
+          && internal::extract_data(dst) == internal::extract_data(m_vectors))
+      {
+        // in-place
+        dst.diagonal().setOnes();
+        dst.template triangularView<StrictlyUpper>().setZero();
+        for(Index k = vecs-1; k >= 0; --k)
+        {
+          Index cornerSize = rows() - k - m_shift;
+          if(m_trans)
+            dst.bottomRightCorner(cornerSize, cornerSize)
+               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+          else
+            dst.bottomRightCorner(cornerSize, cornerSize)
+               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), workspace.data());
+
+          // clear the off diagonal vector
+          dst.col(k).tail(rows()-k-1).setZero();
+        }
+        // clear the remaining columns if needed
+        for(Index k = 0; k<cols()-vecs ; ++k)
+          dst.col(k).tail(rows()-k-1).setZero();
+      }
+      else
+      {
+        dst.setIdentity(rows(), rows());
+        for(Index k = vecs-1; k >= 0; --k)
+        {
+          Index cornerSize = rows() - k - m_shift;
+          if(m_trans)
+            dst.bottomRightCorner(cornerSize, cornerSize)
+               .applyHouseholderOnTheRight(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));
+          else
+            dst.bottomRightCorner(cornerSize, cornerSize)
+               .applyHouseholderOnTheLeft(essentialVector(k), m_coeffs.coeff(k), &workspace.coeffRef(0));
+        }
+      }
+    }
+
+    /** \internal */
+    template<typename Dest> inline void applyThisOnTheRight(Dest& dst) const
+    {
+      Matrix<Scalar,1,Dest::RowsAtCompileTime,RowMajor,1,Dest::MaxRowsAtCompileTime> workspace(dst.rows());
+      applyThisOnTheRight(dst, workspace);
+    }
+
+    /** \internal */
+    template<typename Dest, typename Workspace>
+    inline void applyThisOnTheRight(Dest& dst, Workspace& workspace) const
+    {
+      workspace.resize(dst.rows());
+      for(Index k = 0; k < m_length; ++k)
+      {
+        Index actual_k = m_trans ? m_length-k-1 : k;
+        dst.rightCols(rows()-m_shift-actual_k)
+           .applyHouseholderOnTheRight(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
+      }
+    }
+
+    /** \internal */
+    template<typename Dest> inline void applyThisOnTheLeft(Dest& dst) const
+    {
+      Matrix<Scalar,1,Dest::ColsAtCompileTime,RowMajor,1,Dest::MaxColsAtCompileTime> workspace(dst.cols());
+      applyThisOnTheLeft(dst, workspace);
+    }
+
+    /** \internal */
+    template<typename Dest, typename Workspace>
+    inline void applyThisOnTheLeft(Dest& dst, Workspace& workspace) const
+    {
+      workspace.resize(dst.cols());
+      for(Index k = 0; k < m_length; ++k)
+      {
+        Index actual_k = m_trans ? k : m_length-k-1;
+        dst.bottomRows(rows()-m_shift-actual_k)
+           .applyHouseholderOnTheLeft(essentialVector(actual_k), m_coeffs.coeff(actual_k), workspace.data());
+      }
+    }
+
+    /** \brief Computes the product of a Householder sequence with a matrix.
+      * \param[in]  other  %Matrix being multiplied.
+      * \returns    Expression object representing the product.
+      *
+      * This function computes \f$ HM \f$ where \f$ H \f$ is the Householder sequence represented by \p *this
+      * and \f$ M \f$ is the matrix \p other.
+      */
+    template<typename OtherDerived>
+    typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other) const
+    {
+      typename internal::matrix_type_times_scalar_type<Scalar, OtherDerived>::Type
+        res(other.template cast<typename internal::matrix_type_times_scalar_type<Scalar,OtherDerived>::ResultScalar>());
+      applyThisOnTheLeft(res);
+      return res;
+    }
+
+    template<typename _VectorsType, typename _CoeffsType, int _Side> friend struct internal::hseq_side_dependent_impl;
+
+    /** \brief Sets the length of the Householder sequence.
+      * \param [in]  length  New value for the length.
+      *
+      * By default, the length \f$ n \f$ of the Householder sequence \f$ H = H_0 H_1 \ldots H_{n-1} \f$ is set
+      * to the number of columns of the matrix \p v passed to the constructor, or the number of rows if that
+      * is smaller. After this function is called, the length equals \p length.
+      *
+      * \sa length()
+      */
+    HouseholderSequence& setLength(Index length)
+    {
+      m_length = length;
+      return *this;
+    }
+
+    /** \brief Sets the shift of the Householder sequence.
+      * \param [in]  shift  New value for the shift.
+      *
+      * By default, a %HouseholderSequence object represents \f$ H = H_0 H_1 \ldots H_{n-1} \f$ and the i-th
+      * column of the matrix \p v passed to the constructor corresponds to the i-th Householder
+      * reflection. After this function is called, the object represents \f$ H = H_{\mathrm{shift}}
+      * H_{\mathrm{shift}+1} \ldots H_{n-1} \f$ and the i-th column of \p v corresponds to the (shift+i)-th
+      * Householder reflection.
+      *
+      * \sa shift()
+      */
+    HouseholderSequence& setShift(Index shift)
+    {
+      m_shift = shift;
+      return *this;
+    }
+
+    Index length() const { return m_length; }  /**< \brief Returns the length of the Householder sequence. */
+    Index shift() const { return m_shift; }    /**< \brief Returns the shift of the Householder sequence. */
+
+    /* Necessary for .adjoint() and .conjugate() */
+    template <typename VectorsType2, typename CoeffsType2, int Side2> friend class HouseholderSequence;
+
+  protected:
+
+    /** \brief Sets the transpose flag.
+      * \param [in]  trans  New value of the transpose flag.
+      *
+      * By default, the transpose flag is not set. If the transpose flag is set, then this object represents 
+      * \f$ H^T = H_{n-1}^T \ldots H_1^T H_0^T \f$ instead of \f$ H = H_0 H_1 \ldots H_{n-1} \f$.
+      *
+      * \sa trans()
+      */
+    HouseholderSequence& setTrans(bool trans)
+    {
+      m_trans = trans;
+      return *this;
+    }
+
+    bool trans() const { return m_trans; }     /**< \brief Returns the transpose flag. */
+
+    typename VectorsType::Nested m_vectors;
+    typename CoeffsType::Nested m_coeffs;
+    bool m_trans;
+    Index m_length;
+    Index m_shift;
+};
+
+/** \brief Computes the product of a matrix with a Householder sequence.
+  * \param[in]  other  %Matrix being multiplied.
+  * \param[in]  h      %HouseholderSequence being multiplied.
+  * \returns    Expression object representing the product.
+  *
+  * This function computes \f$ MH \f$ where \f$ M \f$ is the matrix \p other and \f$ H \f$ is the
+  * Householder sequence represented by \p h.
+  */
+template<typename OtherDerived, typename VectorsType, typename CoeffsType, int Side>
+typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type operator*(const MatrixBase<OtherDerived>& other, const HouseholderSequence<VectorsType,CoeffsType,Side>& h)
+{
+  typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::Type
+    res(other.template cast<typename internal::matrix_type_times_scalar_type<typename VectorsType::Scalar,OtherDerived>::ResultScalar>());
+  h.applyThisOnTheRight(res);
+  return res;
+}
+
+/** \ingroup Householder_Module \householder_module
+  * \brief Convenience function for constructing a Householder sequence. 
+  * \returns A HouseholderSequence constructed from the specified arguments.
+  */
+template<typename VectorsType, typename CoeffsType>
+HouseholderSequence<VectorsType,CoeffsType> householderSequence(const VectorsType& v, const CoeffsType& h)
+{
+  return HouseholderSequence<VectorsType,CoeffsType,OnTheLeft>(v, h);
+}
+
+/** \ingroup Householder_Module \householder_module
+  * \brief Convenience function for constructing a Householder sequence. 
+  * \returns A HouseholderSequence constructed from the specified arguments.
+  * \details This function differs from householderSequence() in that the template argument \p OnTheSide of
+  * the constructed HouseholderSequence is set to OnTheRight, instead of the default OnTheLeft.
+  */
+template<typename VectorsType, typename CoeffsType>
+HouseholderSequence<VectorsType,CoeffsType,OnTheRight> rightHouseholderSequence(const VectorsType& v, const CoeffsType& h)
+{
+  return HouseholderSequence<VectorsType,CoeffsType,OnTheRight>(v, h);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_HOUSEHOLDER_SEQUENCE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h
new file mode 100644
index 0000000..73ca9bf
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BasicPreconditioners.h
@@ -0,0 +1,149 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BASIC_PRECONDITIONERS_H
+#define EIGEN_BASIC_PRECONDITIONERS_H
+
+namespace Eigen { 
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \brief A preconditioner based on the digonal entries
+  *
+  * This class allows to approximately solve for A.x = b problems assuming A is a diagonal matrix.
+  * In other words, this preconditioner neglects all off diagonal entries and, in Eigen's language, solves for:
+  * \code
+  * A.diagonal().asDiagonal() . x = b
+  * \endcode
+  *
+  * \tparam _Scalar the type of the scalar.
+  *
+  * This preconditioner is suitable for both selfadjoint and general problems.
+  * The diagonal entries are pre-inverted and stored into a dense vector.
+  *
+  * \note A variant that has yet to be implemented would attempt to preserve the norm of each column.
+  *
+  */
+template <typename _Scalar>
+class DiagonalPreconditioner
+{
+    typedef _Scalar Scalar;
+    typedef Matrix<Scalar,Dynamic,1> Vector;
+    typedef typename Vector::Index Index;
+
+  public:
+    // this typedef is only to export the scalar type and compile-time dimensions to solve_retval
+    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;
+
+    DiagonalPreconditioner() : m_isInitialized(false) {}
+
+    template<typename MatType>
+    DiagonalPreconditioner(const MatType& mat) : m_invdiag(mat.cols())
+    {
+      compute(mat);
+    }
+
+    Index rows() const { return m_invdiag.size(); }
+    Index cols() const { return m_invdiag.size(); }
+    
+    template<typename MatType>
+    DiagonalPreconditioner& analyzePattern(const MatType& )
+    {
+      return *this;
+    }
+    
+    template<typename MatType>
+    DiagonalPreconditioner& factorize(const MatType& mat)
+    {
+      m_invdiag.resize(mat.cols());
+      for(int j=0; j<mat.outerSize(); ++j)
+      {
+        typename MatType::InnerIterator it(mat,j);
+        while(it && it.index()!=j) ++it;
+        if(it && it.index()==j)
+          m_invdiag(j) = Scalar(1)/it.value();
+        else
+          m_invdiag(j) = 0;
+      }
+      m_isInitialized = true;
+      return *this;
+    }
+    
+    template<typename MatType>
+    DiagonalPreconditioner& compute(const MatType& mat)
+    {
+      return factorize(mat);
+    }
+
+    template<typename Rhs, typename Dest>
+    void _solve(const Rhs& b, Dest& x) const
+    {
+      x = m_invdiag.array() * b.array() ;
+    }
+
+    template<typename Rhs> inline const internal::solve_retval<DiagonalPreconditioner, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "DiagonalPreconditioner is not initialized.");
+      eigen_assert(m_invdiag.size()==b.rows()
+                && "DiagonalPreconditioner::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<DiagonalPreconditioner, Rhs>(*this, b.derived());
+    }
+
+  protected:
+    Vector m_invdiag;
+    bool m_isInitialized;
+};
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<DiagonalPreconditioner<_MatrixType>, Rhs>
+  : solve_retval_base<DiagonalPreconditioner<_MatrixType>, Rhs>
+{
+  typedef DiagonalPreconditioner<_MatrixType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+}
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \brief A naive preconditioner which approximates any matrix as the identity matrix
+  *
+  * \sa class DiagonalPreconditioner
+  */
+class IdentityPreconditioner
+{
+  public:
+
+    IdentityPreconditioner() {}
+
+    template<typename MatrixType>
+    IdentityPreconditioner(const MatrixType& ) {}
+    
+    template<typename MatrixType>
+    IdentityPreconditioner& analyzePattern(const MatrixType& ) { return *this; }
+    
+    template<typename MatrixType>
+    IdentityPreconditioner& factorize(const MatrixType& ) { return *this; }
+
+    template<typename MatrixType>
+    IdentityPreconditioner& compute(const MatrixType& ) { return *this; }
+    
+    template<typename Rhs>
+    inline const Rhs& solve(const Rhs& b) const { return b; }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_BASIC_PRECONDITIONERS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h
new file mode 100644
index 0000000..fbefb69
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/BiCGSTAB.h
@@ -0,0 +1,261 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BICGSTAB_H
+#define EIGEN_BICGSTAB_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal Low-level bi conjugate gradient stabilized algorithm
+  * \param mat The matrix A
+  * \param rhs The right hand side vector b
+  * \param x On input and initial solution, on output the computed solution.
+  * \param precond A preconditioner being able to efficiently solve for an
+  *                approximation of Ax=b (regardless of b)
+  * \param iters On input the max number of iteration, on output the number of performed iterations.
+  * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+  * \return false in the case of numerical issue, for example a break down of BiCGSTAB. 
+  */
+template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+bool bicgstab(const MatrixType& mat, const Rhs& rhs, Dest& x,
+              const Preconditioner& precond, int& iters,
+              typename Dest::RealScalar& tol_error)
+{
+  using std::sqrt;
+  using std::abs;
+  typedef typename Dest::RealScalar RealScalar;
+  typedef typename Dest::Scalar Scalar;
+  typedef Matrix<Scalar,Dynamic,1> VectorType;
+  RealScalar tol = tol_error;
+  int maxIters = iters;
+
+  int n = mat.cols();
+  x = precond.solve(x);
+  VectorType r  = rhs - mat * x;
+  VectorType r0 = r;
+  
+  RealScalar r0_sqnorm = rhs.squaredNorm();
+  if(r0_sqnorm == 0)
+  {
+    x.setZero();
+    return true;
+  }
+  Scalar rho    = 1;
+  Scalar alpha  = 1;
+  Scalar w      = 1;
+  
+  VectorType v = VectorType::Zero(n), p = VectorType::Zero(n);
+  VectorType y(n),  z(n);
+  VectorType kt(n), ks(n);
+
+  VectorType s(n), t(n);
+
+  RealScalar tol2 = tol*tol;
+  int i = 0;
+
+  while ( r.squaredNorm()/r0_sqnorm > tol2 && i<maxIters )
+  {
+    Scalar rho_old = rho;
+
+    rho = r0.dot(r);
+    if (rho == Scalar(0)) return false; /* New search directions cannot be found */
+    Scalar beta = (rho/rho_old) * (alpha / w);
+    p = r + beta * (p - w * v);
+    
+    y = precond.solve(p);
+    
+    v.noalias() = mat * y;
+
+    alpha = rho / r0.dot(v);
+    s = r - alpha * v;
+
+    z = precond.solve(s);
+    t.noalias() = mat * z;
+
+    w = t.dot(s) / t.squaredNorm();
+    x += alpha * y + w * z;
+    r = s - w * t;
+    ++i;
+  }
+  tol_error = sqrt(r.squaredNorm()/r0_sqnorm);
+  iters = i;
+  return true; 
+}
+
+}
+
+template< typename _MatrixType,
+          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >
+class BiCGSTAB;
+
+namespace internal {
+
+template< typename _MatrixType, typename _Preconditioner>
+struct traits<BiCGSTAB<_MatrixType,_Preconditioner> >
+{
+  typedef _MatrixType MatrixType;
+  typedef _Preconditioner Preconditioner;
+};
+
+}
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \brief A bi conjugate gradient stabilized solver for sparse square problems
+  *
+  * This class allows to solve for A.x = b sparse linear problems using a bi conjugate gradient
+  * stabilized algorithm. The vectors x and b can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.
+  * \tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner
+  *
+  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
+  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
+  * and NumTraits<Scalar>::epsilon() for the tolerance.
+  * 
+  * This class can be used as the direct solver classes. Here is a typical usage example:
+  * \code
+  * int n = 10000;
+  * VectorXd x(n), b(n);
+  * SparseMatrix<double> A(n,n);
+  * // fill A and b
+  * BiCGSTAB<SparseMatrix<double> > solver;
+  * solver(A);
+  * x = solver.solve(b);
+  * std::cout << "#iterations:     " << solver.iterations() << std::endl;
+  * std::cout << "estimated error: " << solver.error()      << std::endl;
+  * // update b, and solve again
+  * x = solver.solve(b);
+  * \endcode
+  * 
+  * By default the iterations start with x=0 as an initial guess of the solution.
+  * One can control the start using the solveWithGuess() method. Here is a step by
+  * step execution example starting with a random guess and printing the evolution
+  * of the estimated error:
+  * * \code
+  * x = VectorXd::Random(n);
+  * solver.setMaxIterations(1);
+  * int i = 0;
+  * do {
+  *   x = solver.solveWithGuess(b,x);
+  *   std::cout << i << " : " << solver.error() << std::endl;
+  *   ++i;
+  * } while (solver.info()!=Success && i<100);
+  * \endcode
+  * Note that such a step by step excution is slightly slower.
+  * 
+  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+  */
+template< typename _MatrixType, typename _Preconditioner>
+class BiCGSTAB : public IterativeSolverBase<BiCGSTAB<_MatrixType,_Preconditioner> >
+{
+  typedef IterativeSolverBase<BiCGSTAB> Base;
+  using Base::mp_matrix;
+  using Base::m_error;
+  using Base::m_iterations;
+  using Base::m_info;
+  using Base::m_isInitialized;
+public:
+  typedef _MatrixType MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef _Preconditioner Preconditioner;
+
+public:
+
+  /** Default constructor. */
+  BiCGSTAB() : Base() {}
+
+  /** Initialize the solver with matrix \a A for further \c Ax=b solving.
+    * 
+    * This constructor is a shortcut for the default constructor followed
+    * by a call to compute().
+    * 
+    * \warning this class stores a reference to the matrix A as well as some
+    * precomputed values that depend on it. Therefore, if \a A is changed
+    * this class becomes invalid. Call compute() to update it with the new
+    * matrix A, or modify a copy of A.
+    */
+  BiCGSTAB(const MatrixType& A) : Base(A) {}
+
+  ~BiCGSTAB() {}
+  
+  /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A
+    * \a x0 as an initial solution.
+    *
+    * \sa compute()
+    */
+  template<typename Rhs,typename Guess>
+  inline const internal::solve_retval_with_guess<BiCGSTAB, Rhs, Guess>
+  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const
+  {
+    eigen_assert(m_isInitialized && "BiCGSTAB is not initialized.");
+    eigen_assert(Base::rows()==b.rows()
+              && "BiCGSTAB::solve(): invalid number of rows of the right hand side matrix b");
+    return internal::solve_retval_with_guess
+            <BiCGSTAB, Rhs, Guess>(*this, b.derived(), x0);
+  }
+  
+  /** \internal */
+  template<typename Rhs,typename Dest>
+  void _solveWithGuess(const Rhs& b, Dest& x) const
+  {    
+    bool failed = false;
+    for(int j=0; j<b.cols(); ++j)
+    {
+      m_iterations = Base::maxIterations();
+      m_error = Base::m_tolerance;
+      
+      typename Dest::ColXpr xj(x,j);
+      if(!internal::bicgstab(*mp_matrix, b.col(j), xj, Base::m_preconditioner, m_iterations, m_error))
+        failed = true;
+    }
+    m_info = failed ? NumericalIssue
+           : m_error <= Base::m_tolerance ? Success
+           : NoConvergence;
+    m_isInitialized = true;
+  }
+
+  /** \internal */
+  template<typename Rhs,typename Dest>
+  void _solve(const Rhs& b, Dest& x) const
+  {
+//     x.setZero();
+  x = b;
+    _solveWithGuess(b,x);
+  }
+
+protected:
+
+};
+
+
+namespace internal {
+
+  template<typename _MatrixType, typename _Preconditioner, typename Rhs>
+struct solve_retval<BiCGSTAB<_MatrixType, _Preconditioner>, Rhs>
+  : solve_retval_base<BiCGSTAB<_MatrixType, _Preconditioner>, Rhs>
+{
+  typedef BiCGSTAB<_MatrixType, _Preconditioner> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BICGSTAB_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/CMakeLists.txt
new file mode 100644
index 0000000..59ccc00
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_IterativeLinearSolvers_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_IterativeLinearSolvers_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/IterativeLinearSolvers COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
new file mode 100644
index 0000000..00b5647
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/ConjugateGradient.h
@@ -0,0 +1,265 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CONJUGATE_GRADIENT_H
+#define EIGEN_CONJUGATE_GRADIENT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal Low-level conjugate gradient algorithm
+  * \param mat The matrix A
+  * \param rhs The right hand side vector b
+  * \param x On input and initial solution, on output the computed solution.
+  * \param precond A preconditioner being able to efficiently solve for an
+  *                approximation of Ax=b (regardless of b)
+  * \param iters On input the max number of iteration, on output the number of performed iterations.
+  * \param tol_error On input the tolerance error, on output an estimation of the relative error.
+  */
+template<typename MatrixType, typename Rhs, typename Dest, typename Preconditioner>
+EIGEN_DONT_INLINE
+void conjugate_gradient(const MatrixType& mat, const Rhs& rhs, Dest& x,
+                        const Preconditioner& precond, int& iters,
+                        typename Dest::RealScalar& tol_error)
+{
+  using std::sqrt;
+  using std::abs;
+  typedef typename Dest::RealScalar RealScalar;
+  typedef typename Dest::Scalar Scalar;
+  typedef Matrix<Scalar,Dynamic,1> VectorType;
+  
+  RealScalar tol = tol_error;
+  int maxIters = iters;
+  
+  int n = mat.cols();
+
+  VectorType residual = rhs - mat * x; //initial residual
+
+  RealScalar rhsNorm2 = rhs.squaredNorm();
+  if(rhsNorm2 == 0) 
+  {
+    x.setZero();
+    iters = 0;
+    tol_error = 0;
+    return;
+  }
+  RealScalar threshold = tol*tol*rhsNorm2;
+  RealScalar residualNorm2 = residual.squaredNorm();
+  if (residualNorm2 < threshold)
+  {
+    iters = 0;
+    tol_error = sqrt(residualNorm2 / rhsNorm2);
+    return;
+  }
+  
+  VectorType p(n);
+  p = precond.solve(residual);      //initial search direction
+
+  VectorType z(n), tmp(n);
+  RealScalar absNew = internal::real(residual.dot(p));  // the square of the absolute value of r scaled by invM
+  int i = 0;
+  while(i < maxIters)
+  {
+    tmp.noalias() = mat * p;              // the bottleneck of the algorithm
+
+    Scalar alpha = absNew / p.dot(tmp);   // the amount we travel on dir
+    x += alpha * p;                       // update solution
+    residual -= alpha * tmp;              // update residue
+    
+    residualNorm2 = residual.squaredNorm();
+    if(residualNorm2 < threshold)
+      break;
+    
+    z = precond.solve(residual);          // approximately solve for "A z = residual"
+
+    RealScalar absOld = absNew;
+    absNew = internal::real(residual.dot(z));     // update the absolute value of r
+    RealScalar beta = absNew / absOld;            // calculate the Gram-Schmidt value used to create the new search direction
+    p = z + beta * p;                             // update search direction
+    i++;
+  }
+  tol_error = sqrt(residualNorm2 / rhsNorm2);
+  iters = i;
+}
+
+}
+
+template< typename _MatrixType, int _UpLo=Lower,
+          typename _Preconditioner = DiagonalPreconditioner<typename _MatrixType::Scalar> >
+class ConjugateGradient;
+
+namespace internal {
+
+template< typename _MatrixType, int _UpLo, typename _Preconditioner>
+struct traits<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> >
+{
+  typedef _MatrixType MatrixType;
+  typedef _Preconditioner Preconditioner;
+};
+
+}
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \brief A conjugate gradient solver for sparse self-adjoint problems
+  *
+  * This class allows to solve for A.x = b sparse linear problems using a conjugate gradient algorithm.
+  * The sparse matrix A must be selfadjoint. The vectors x and b can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, can be a dense or a sparse matrix.
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  * \tparam _Preconditioner the type of the preconditioner. Default is DiagonalPreconditioner
+  *
+  * The maximal number of iterations and tolerance value can be controlled via the setMaxIterations()
+  * and setTolerance() methods. The defaults are the size of the problem for the maximal number of iterations
+  * and NumTraits<Scalar>::epsilon() for the tolerance.
+  * 
+  * This class can be used as the direct solver classes. Here is a typical usage example:
+  * \code
+  * int n = 10000;
+  * VectorXd x(n), b(n);
+  * SparseMatrix<double> A(n,n);
+  * // fill A and b
+  * ConjugateGradient<SparseMatrix<double> > cg;
+  * cg.compute(A);
+  * x = cg.solve(b);
+  * std::cout << "#iterations:     " << cg.iterations() << std::endl;
+  * std::cout << "estimated error: " << cg.error()      << std::endl;
+  * // update b, and solve again
+  * x = cg.solve(b);
+  * \endcode
+  * 
+  * By default the iterations start with x=0 as an initial guess of the solution.
+  * One can control the start using the solveWithGuess() method. Here is a step by
+  * step execution example starting with a random guess and printing the evolution
+  * of the estimated error:
+  * * \code
+  * x = VectorXd::Random(n);
+  * cg.setMaxIterations(1);
+  * int i = 0;
+  * do {
+  *   x = cg.solveWithGuess(b,x);
+  *   std::cout << i << " : " << cg.error() << std::endl;
+  *   ++i;
+  * } while (cg.info()!=Success && i<100);
+  * \endcode
+  * Note that such a step by step excution is slightly slower.
+  * 
+  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+  */
+template< typename _MatrixType, int _UpLo, typename _Preconditioner>
+class ConjugateGradient : public IterativeSolverBase<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> >
+{
+  typedef IterativeSolverBase<ConjugateGradient> Base;
+  using Base::mp_matrix;
+  using Base::m_error;
+  using Base::m_iterations;
+  using Base::m_info;
+  using Base::m_isInitialized;
+public:
+  typedef _MatrixType MatrixType;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef _Preconditioner Preconditioner;
+
+  enum {
+    UpLo = _UpLo
+  };
+
+public:
+
+  /** Default constructor. */
+  ConjugateGradient() : Base() {}
+
+  /** Initialize the solver with matrix \a A for further \c Ax=b solving.
+    * 
+    * This constructor is a shortcut for the default constructor followed
+    * by a call to compute().
+    * 
+    * \warning this class stores a reference to the matrix A as well as some
+    * precomputed values that depend on it. Therefore, if \a A is changed
+    * this class becomes invalid. Call compute() to update it with the new
+    * matrix A, or modify a copy of A.
+    */
+  ConjugateGradient(const MatrixType& A) : Base(A) {}
+
+  ~ConjugateGradient() {}
+  
+  /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A
+    * \a x0 as an initial solution.
+    *
+    * \sa compute()
+    */
+  template<typename Rhs,typename Guess>
+  inline const internal::solve_retval_with_guess<ConjugateGradient, Rhs, Guess>
+  solveWithGuess(const MatrixBase<Rhs>& b, const Guess& x0) const
+  {
+    eigen_assert(m_isInitialized && "ConjugateGradient is not initialized.");
+    eigen_assert(Base::rows()==b.rows()
+              && "ConjugateGradient::solve(): invalid number of rows of the right hand side matrix b");
+    return internal::solve_retval_with_guess
+            <ConjugateGradient, Rhs, Guess>(*this, b.derived(), x0);
+  }
+
+  /** \internal */
+  template<typename Rhs,typename Dest>
+  void _solveWithGuess(const Rhs& b, Dest& x) const
+  {
+    m_iterations = Base::maxIterations();
+    m_error = Base::m_tolerance;
+
+    for(int j=0; j<b.cols(); ++j)
+    {
+      m_iterations = Base::maxIterations();
+      m_error = Base::m_tolerance;
+
+      typename Dest::ColXpr xj(x,j);
+      internal::conjugate_gradient(mp_matrix->template selfadjointView<UpLo>(), b.col(j), xj,
+                                   Base::m_preconditioner, m_iterations, m_error);
+    }
+
+    m_isInitialized = true;
+    m_info = m_error <= Base::m_tolerance ? Success : NoConvergence;
+  }
+  
+  /** \internal */
+  template<typename Rhs,typename Dest>
+  void _solve(const Rhs& b, Dest& x) const
+  {
+    x.setOnes();
+    _solveWithGuess(b,x);
+  }
+
+protected:
+
+};
+
+
+namespace internal {
+
+template<typename _MatrixType, int _UpLo, typename _Preconditioner, typename Rhs>
+struct solve_retval<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner>, Rhs>
+  : solve_retval_base<ConjugateGradient<_MatrixType,_UpLo,_Preconditioner>, Rhs>
+{
+  typedef ConjugateGradient<_MatrixType,_UpLo,_Preconditioner> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_CONJUGATE_GRADIENT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h
new file mode 100644
index 0000000..17d18ef
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IncompleteLUT.h
@@ -0,0 +1,468 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_INCOMPLETE_LUT_H
+#define EIGEN_INCOMPLETE_LUT_H
+
+
+namespace Eigen { 
+
+namespace internal {
+    
+/** \internal
+  * Compute a quick-sort split of a vector 
+  * On output, the vector row is permuted such that its elements satisfy
+  * abs(row(i)) >= abs(row(ncut)) if i<ncut
+  * abs(row(i)) <= abs(row(ncut)) if i>ncut 
+  * \param row The vector of values
+  * \param ind The array of index for the elements in @p row
+  * \param ncut  The number of largest elements to keep
+  **/ 
+template <typename VectorV, typename VectorI, typename Index>
+Index QuickSplit(VectorV &row, VectorI &ind, Index ncut)
+{
+  typedef typename VectorV::RealScalar RealScalar;
+  using std::swap;
+  using std::abs;
+  Index mid;
+  Index n = row.size(); /* length of the vector */
+  Index first, last ;
+  
+  ncut--; /* to fit the zero-based indices */
+  first = 0; 
+  last = n-1; 
+  if (ncut < first || ncut > last ) return 0;
+  
+  do {
+    mid = first; 
+    RealScalar abskey = abs(row(mid)); 
+    for (Index j = first + 1; j <= last; j++) {
+      if ( abs(row(j)) > abskey) {
+        ++mid;
+        swap(row(mid), row(j));
+        swap(ind(mid), ind(j));
+      }
+    }
+    /* Interchange for the pivot element */
+    swap(row(mid), row(first));
+    swap(ind(mid), ind(first));
+    
+    if (mid > ncut) last = mid - 1;
+    else if (mid < ncut ) first = mid + 1; 
+  } while (mid != ncut );
+  
+  return 0; /* mid is equal to ncut */ 
+}
+
+}// end namespace internal
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \class IncompleteLUT
+  * \brief Incomplete LU factorization with dual-threshold strategy
+  *
+  * During the numerical factorization, two dropping rules are used :
+  *  1) any element whose magnitude is less than some tolerance is dropped.
+  *    This tolerance is obtained by multiplying the input tolerance @p droptol 
+  *    by the average magnitude of all the original elements in the current row.
+  *  2) After the elimination of the row, only the @p fill largest elements in 
+  *    the L part and the @p fill largest elements in the U part are kept 
+  *    (in addition to the diagonal element ). Note that @p fill is computed from 
+  *    the input parameter @p fillfactor which is used the ratio to control the fill_in 
+  *    relatively to the initial number of nonzero elements.
+  * 
+  * The two extreme cases are when @p droptol=0 (to keep all the @p fill*2 largest elements)
+  * and when @p fill=n/2 with @p droptol being different to zero. 
+  * 
+  * References : Yousef Saad, ILUT: A dual threshold incomplete LU factorization, 
+  *              Numerical Linear Algebra with Applications, 1(4), pp 387-402, 1994.
+  * 
+  * NOTE : The following implementation is derived from the ILUT implementation
+  * in the SPARSKIT package, Copyright (C) 2005, the Regents of the University of Minnesota 
+  *  released under the terms of the GNU LGPL: 
+  *    http://www-users.cs.umn.edu/~saad/software/SPARSKIT/README
+  * However, Yousef Saad gave us permission to relicense his ILUT code to MPL2.
+  * See the Eigen mailing list archive, thread: ILUT, date: July 8, 2012:
+  *   http://listengine.tuxfamily.org/lists.tuxfamily.org/eigen/2012/07/msg00064.html
+  * alternatively, on GMANE:
+  *   http://comments.gmane.org/gmane.comp.lib.eigen/3302
+  */
+template <typename _Scalar>
+class IncompleteLUT : internal::noncopyable
+{
+    typedef _Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+    typedef Matrix<Scalar,Dynamic,1> Vector;
+    typedef SparseMatrix<Scalar,RowMajor> FactorType;
+    typedef SparseMatrix<Scalar,ColMajor> PermutType;
+    typedef typename FactorType::Index Index;
+
+  public:
+    typedef Matrix<Scalar,Dynamic,Dynamic> MatrixType;
+    
+    IncompleteLUT()
+      : m_droptol(NumTraits<Scalar>::dummy_precision()), m_fillfactor(10),
+        m_analysisIsOk(false), m_factorizationIsOk(false), m_isInitialized(false)
+    {}
+    
+    template<typename MatrixType>
+    IncompleteLUT(const MatrixType& mat, const RealScalar& droptol=NumTraits<Scalar>::dummy_precision(), int fillfactor = 10)
+      : m_droptol(droptol),m_fillfactor(fillfactor),
+        m_analysisIsOk(false),m_factorizationIsOk(false),m_isInitialized(false)
+    {
+      eigen_assert(fillfactor != 0);
+      compute(mat); 
+    }
+    
+    Index rows() const { return m_lu.rows(); }
+    
+    Index cols() const { return m_lu.cols(); }
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "IncompleteLUT is not initialized.");
+      return m_info;
+    }
+    
+    template<typename MatrixType>
+    void analyzePattern(const MatrixType& amat);
+    
+    template<typename MatrixType>
+    void factorize(const MatrixType& amat);
+    
+    /**
+      * Compute an incomplete LU factorization with dual threshold on the matrix mat
+      * No pivoting is done in this version
+      * 
+      **/
+    template<typename MatrixType>
+    IncompleteLUT<Scalar>& compute(const MatrixType& amat)
+    {
+      analyzePattern(amat); 
+      factorize(amat);
+      eigen_assert(m_factorizationIsOk == true); 
+      m_isInitialized = true;
+      return *this;
+    }
+
+    void setDroptol(const RealScalar& droptol); 
+    void setFillfactor(int fillfactor); 
+    
+    template<typename Rhs, typename Dest>
+    void _solve(const Rhs& b, Dest& x) const
+    {
+      x = m_Pinv * b;  
+      x = m_lu.template triangularView<UnitLower>().solve(x);
+      x = m_lu.template triangularView<Upper>().solve(x);
+      x = m_P * x; 
+    }
+
+    template<typename Rhs> inline const internal::solve_retval<IncompleteLUT, Rhs>
+     solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "IncompleteLUT is not initialized.");
+      eigen_assert(cols()==b.rows()
+                && "IncompleteLUT::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<IncompleteLUT, Rhs>(*this, b.derived());
+    }
+
+protected:
+
+    /** keeps off-diagonal entries; drops diagonal entries */
+    struct keep_diag {
+      inline bool operator() (const Index& row, const Index& col, const Scalar&) const
+      {
+        return row!=col;
+      }
+    };
+
+protected:
+
+    FactorType m_lu;
+    RealScalar m_droptol;
+    int m_fillfactor;
+    bool m_analysisIsOk;
+    bool m_factorizationIsOk;
+    bool m_isInitialized;
+    ComputationInfo m_info;
+    PermutationMatrix<Dynamic,Dynamic,Index> m_P;     // Fill-reducing permutation
+    PermutationMatrix<Dynamic,Dynamic,Index> m_Pinv;  // Inverse permutation
+};
+
+/**
+ * Set control parameter droptol
+ *  \param droptol   Drop any element whose magnitude is less than this tolerance 
+ **/ 
+template<typename Scalar>
+void IncompleteLUT<Scalar>::setDroptol(const RealScalar& droptol)
+{
+  this->m_droptol = droptol;   
+}
+
+/**
+ * Set control parameter fillfactor
+ * \param fillfactor  This is used to compute the  number @p fill_in of largest elements to keep on each row. 
+ **/ 
+template<typename Scalar>
+void IncompleteLUT<Scalar>::setFillfactor(int fillfactor)
+{
+  this->m_fillfactor = fillfactor;   
+}
+
+template <typename Scalar>
+template<typename _MatrixType>
+void IncompleteLUT<Scalar>::analyzePattern(const _MatrixType& amat)
+{
+  // Compute the Fill-reducing permutation
+  SparseMatrix<Scalar,ColMajor, Index> mat1 = amat;
+  SparseMatrix<Scalar,ColMajor, Index> mat2 = amat.transpose();
+  // Symmetrize the pattern
+  // FIXME for a matrix with nearly symmetric pattern, mat2+mat1 is the appropriate choice.
+  //       on the other hand for a really non-symmetric pattern, mat2*mat1 should be prefered...
+  SparseMatrix<Scalar,ColMajor, Index> AtA = mat2 + mat1;
+  AtA.prune(keep_diag());
+  internal::minimum_degree_ordering<Scalar, Index>(AtA, m_P);  // Then compute the AMD ordering...
+
+  m_Pinv  = m_P.inverse(); // ... and the inverse permutation
+
+  m_analysisIsOk = true;
+}
+
+template <typename Scalar>
+template<typename _MatrixType>
+void IncompleteLUT<Scalar>::factorize(const _MatrixType& amat)
+{
+  using std::sqrt;
+  using std::swap;
+  using std::abs;
+
+  eigen_assert((amat.rows() == amat.cols()) && "The factorization should be done on a square matrix");
+  Index n = amat.cols();  // Size of the matrix
+  m_lu.resize(n,n);
+  // Declare Working vectors and variables
+  Vector u(n) ;     // real values of the row -- maximum size is n --
+  VectorXi ju(n);   // column position of the values in u -- maximum size  is n
+  VectorXi jr(n);   // Indicate the position of the nonzero elements in the vector u -- A zero location is indicated by -1
+
+  // Apply the fill-reducing permutation
+  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+  SparseMatrix<Scalar,RowMajor, Index> mat;
+  mat = amat.twistedBy(m_Pinv);
+
+  // Initialization
+  jr.fill(-1);
+  ju.fill(0);
+  u.fill(0);
+
+  // number of largest elements to keep in each row:
+  Index fill_in =   static_cast<Index> (amat.nonZeros()*m_fillfactor)/n+1;
+  if (fill_in > n) fill_in = n;
+
+  // number of largest nonzero elements to keep in the L and the U part of the current row:
+  Index nnzL = fill_in/2;
+  Index nnzU = nnzL;
+  m_lu.reserve(n * (nnzL + nnzU + 1));
+
+  // global loop over the rows of the sparse matrix
+  for (Index ii = 0; ii < n; ii++)
+  {
+    // 1 - copy the lower and the upper part of the row i of mat in the working vector u
+
+    Index sizeu = 1; // number of nonzero elements in the upper part of the current row
+    Index sizel = 0; // number of nonzero elements in the lower part of the current row
+    ju(ii)    = ii;
+    u(ii)     = 0;
+    jr(ii)    = ii;
+    RealScalar rownorm = 0;
+
+    typename FactorType::InnerIterator j_it(mat, ii); // Iterate through the current row ii
+    for (; j_it; ++j_it)
+    {
+      Index k = j_it.index();
+      if (k < ii)
+      {
+        // copy the lower part
+        ju(sizel) = k;
+        u(sizel) = j_it.value();
+        jr(k) = sizel;
+        ++sizel;
+      }
+      else if (k == ii)
+      {
+        u(ii) = j_it.value();
+      }
+      else
+      {
+        // copy the upper part
+        Index jpos = ii + sizeu;
+        ju(jpos) = k;
+        u(jpos) = j_it.value();
+        jr(k) = jpos;
+        ++sizeu;
+      }
+      rownorm += internal::abs2(j_it.value());
+    }
+
+    // 2 - detect possible zero row
+    if(rownorm==0)
+    {
+      m_info = NumericalIssue;
+      return;
+    }
+    // Take the 2-norm of the current row as a relative tolerance
+    rownorm = sqrt(rownorm);
+
+    // 3 - eliminate the previous nonzero rows
+    Index jj = 0;
+    Index len = 0;
+    while (jj < sizel)
+    {
+      // In order to eliminate in the correct order,
+      // we must select first the smallest column index among  ju(jj:sizel)
+      Index k;
+      Index minrow = ju.segment(jj,sizel-jj).minCoeff(&k); // k is relative to the segment
+      k += jj;
+      if (minrow != ju(jj))
+      {
+        // swap the two locations
+        Index j = ju(jj);
+        swap(ju(jj), ju(k));
+        jr(minrow) = jj;   jr(j) = k;
+        swap(u(jj), u(k));
+      }
+      // Reset this location
+      jr(minrow) = -1;
+
+      // Start elimination
+      typename FactorType::InnerIterator ki_it(m_lu, minrow);
+      while (ki_it && ki_it.index() < minrow) ++ki_it;
+      eigen_internal_assert(ki_it && ki_it.col()==minrow);
+      Scalar fact = u(jj) / ki_it.value();
+
+      // drop too small elements
+      if(abs(fact) <= m_droptol)
+      {
+        jj++;
+        continue;
+      }
+
+      // linear combination of the current row ii and the row minrow
+      ++ki_it;
+      for (; ki_it; ++ki_it)
+      {
+        Scalar prod = fact * ki_it.value();
+        Index j       = ki_it.index();
+        Index jpos    = jr(j);
+        if (jpos == -1) // fill-in element
+        {
+          Index newpos;
+          if (j >= ii) // dealing with the upper part
+          {
+            newpos = ii + sizeu;
+            sizeu++;
+            eigen_internal_assert(sizeu<=n);
+          }
+          else // dealing with the lower part
+          {
+            newpos = sizel;
+            sizel++;
+            eigen_internal_assert(sizel<=ii);
+          }
+          ju(newpos) = j;
+          u(newpos) = -prod;
+          jr(j) = newpos;
+        }
+        else
+          u(jpos) -= prod;
+      }
+      // store the pivot element
+      u(len) = fact;
+      ju(len) = minrow;
+      ++len;
+
+      jj++;
+    } // end of the elimination on the row ii
+
+    // reset the upper part of the pointer jr to zero
+    for(Index k = 0; k <sizeu; k++) jr(ju(ii+k)) = -1;
+
+    // 4 - partially sort and insert the elements in the m_lu matrix
+
+    // sort the L-part of the row
+    sizel = len;
+    len = (std::min)(sizel, nnzL);
+    typename Vector::SegmentReturnType ul(u.segment(0, sizel));
+    typename VectorXi::SegmentReturnType jul(ju.segment(0, sizel));
+    internal::QuickSplit(ul, jul, len);
+
+    // store the largest m_fill elements of the L part
+    m_lu.startVec(ii);
+    for(Index k = 0; k < len; k++)
+      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);
+
+    // store the diagonal element
+    // apply a shifting rule to avoid zero pivots (we are doing an incomplete factorization)
+    if (u(ii) == Scalar(0))
+      u(ii) = sqrt(m_droptol) * rownorm;
+    m_lu.insertBackByOuterInnerUnordered(ii, ii) = u(ii);
+
+    // sort the U-part of the row
+    // apply the dropping rule first
+    len = 0;
+    for(Index k = 1; k < sizeu; k++)
+    {
+      if(abs(u(ii+k)) > m_droptol * rownorm )
+      {
+        ++len;
+        u(ii + len)  = u(ii + k);
+        ju(ii + len) = ju(ii + k);
+      }
+    }
+    sizeu = len + 1; // +1 to take into account the diagonal element
+    len = (std::min)(sizeu, nnzU);
+    typename Vector::SegmentReturnType uu(u.segment(ii+1, sizeu-1));
+    typename VectorXi::SegmentReturnType juu(ju.segment(ii+1, sizeu-1));
+    internal::QuickSplit(uu, juu, len);
+
+    // store the largest elements of the U part
+    for(Index k = ii + 1; k < ii + len; k++)
+      m_lu.insertBackByOuterInnerUnordered(ii,ju(k)) = u(k);
+  }
+
+  m_lu.finalize();
+  m_lu.makeCompressed();
+
+  m_factorizationIsOk = true;
+  m_info = Success;
+}
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<IncompleteLUT<_MatrixType>, Rhs>
+  : solve_retval_base<IncompleteLUT<_MatrixType>, Rhs>
+{
+  typedef IncompleteLUT<_MatrixType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_INCOMPLETE_LUT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h
new file mode 100644
index 0000000..2036922
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/IterativeLinearSolvers/IterativeSolverBase.h
@@ -0,0 +1,254 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ITERATIVE_SOLVER_BASE_H
+#define EIGEN_ITERATIVE_SOLVER_BASE_H
+
+namespace Eigen { 
+
+/** \ingroup IterativeLinearSolvers_Module
+  * \brief Base class for linear iterative solvers
+  *
+  * \sa class SimplicialCholesky, DiagonalPreconditioner, IdentityPreconditioner
+  */
+template< typename Derived>
+class IterativeSolverBase : internal::noncopyable
+{
+public:
+  typedef typename internal::traits<Derived>::MatrixType MatrixType;
+  typedef typename internal::traits<Derived>::Preconditioner Preconditioner;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::RealScalar RealScalar;
+
+public:
+
+  Derived& derived() { return *static_cast<Derived*>(this); }
+  const Derived& derived() const { return *static_cast<const Derived*>(this); }
+
+  /** Default constructor. */
+  IterativeSolverBase()
+    : mp_matrix(0)
+  {
+    init();
+  }
+
+  /** Initialize the solver with matrix \a A for further \c Ax=b solving.
+    * 
+    * This constructor is a shortcut for the default constructor followed
+    * by a call to compute().
+    * 
+    * \warning this class stores a reference to the matrix A as well as some
+    * precomputed values that depend on it. Therefore, if \a A is changed
+    * this class becomes invalid. Call compute() to update it with the new
+    * matrix A, or modify a copy of A.
+    */
+  IterativeSolverBase(const MatrixType& A)
+  {
+    init();
+    compute(A);
+  }
+
+  ~IterativeSolverBase() {}
+  
+  /** Initializes the iterative solver for the sparcity pattern of the matrix \a A for further solving \c Ax=b problems.
+    *
+    * Currently, this function mostly call analyzePattern on the preconditioner. In the future
+    * we might, for instance, implement column reodering for faster matrix vector products.
+    */
+  Derived& analyzePattern(const MatrixType& A)
+  {
+    m_preconditioner.analyzePattern(A);
+    m_isInitialized = true;
+    m_analysisIsOk = true;
+    m_info = Success;
+    return derived();
+  }
+  
+  /** Initializes the iterative solver with the numerical values of the matrix \a A for further solving \c Ax=b problems.
+    *
+    * Currently, this function mostly call factorize on the preconditioner.
+    *
+    * \warning this class stores a reference to the matrix A as well as some
+    * precomputed values that depend on it. Therefore, if \a A is changed
+    * this class becomes invalid. Call compute() to update it with the new
+    * matrix A, or modify a copy of A.
+    */
+  Derived& factorize(const MatrixType& A)
+  {
+    eigen_assert(m_analysisIsOk && "You must first call analyzePattern()"); 
+    mp_matrix = &A;
+    m_preconditioner.factorize(A);
+    m_factorizationIsOk = true;
+    m_info = Success;
+    return derived();
+  }
+
+  /** Initializes the iterative solver with the matrix \a A for further solving \c Ax=b problems.
+    *
+    * Currently, this function mostly initialized/compute the preconditioner. In the future
+    * we might, for instance, implement column reodering for faster matrix vector products.
+    *
+    * \warning this class stores a reference to the matrix A as well as some
+    * precomputed values that depend on it. Therefore, if \a A is changed
+    * this class becomes invalid. Call compute() to update it with the new
+    * matrix A, or modify a copy of A.
+    */
+  Derived& compute(const MatrixType& A)
+  {
+    mp_matrix = &A;
+    m_preconditioner.compute(A);
+    m_isInitialized = true;
+    m_analysisIsOk = true;
+    m_factorizationIsOk = true;
+    m_info = Success;
+    return derived();
+  }
+
+  /** \internal */
+  Index rows() const { return mp_matrix ? mp_matrix->rows() : 0; }
+  /** \internal */
+  Index cols() const { return mp_matrix ? mp_matrix->cols() : 0; }
+
+  /** \returns the tolerance threshold used by the stopping criteria */
+  RealScalar tolerance() const { return m_tolerance; }
+  
+  /** Sets the tolerance threshold used by the stopping criteria */
+  Derived& setTolerance(const RealScalar& tolerance)
+  {
+    m_tolerance = tolerance;
+    return derived();
+  }
+
+  /** \returns a read-write reference to the preconditioner for custom configuration. */
+  Preconditioner& preconditioner() { return m_preconditioner; }
+  
+  /** \returns a read-only reference to the preconditioner. */
+  const Preconditioner& preconditioner() const { return m_preconditioner; }
+
+  /** \returns the max number of iterations */
+  int maxIterations() const
+  {
+    return (mp_matrix && m_maxIterations<0) ? mp_matrix->cols() : m_maxIterations;
+  }
+  
+  /** Sets the max number of iterations */
+  Derived& setMaxIterations(int maxIters)
+  {
+    m_maxIterations = maxIters;
+    return derived();
+  }
+
+  /** \returns the number of iterations performed during the last solve */
+  int iterations() const
+  {
+    eigen_assert(m_isInitialized && "ConjugateGradient is not initialized.");
+    return m_iterations;
+  }
+
+  /** \returns the tolerance error reached during the last solve */
+  RealScalar error() const
+  {
+    eigen_assert(m_isInitialized && "ConjugateGradient is not initialized.");
+    return m_error;
+  }
+
+  /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+    *
+    * \sa compute()
+    */
+  template<typename Rhs> inline const internal::solve_retval<Derived, Rhs>
+  solve(const MatrixBase<Rhs>& b) const
+  {
+    eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
+    eigen_assert(rows()==b.rows()
+              && "IterativeSolverBase::solve(): invalid number of rows of the right hand side matrix b");
+    return internal::solve_retval<Derived, Rhs>(derived(), b.derived());
+  }
+  
+  /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+    *
+    * \sa compute()
+    */
+  template<typename Rhs>
+  inline const internal::sparse_solve_retval<IterativeSolverBase, Rhs>
+  solve(const SparseMatrixBase<Rhs>& b) const
+  {
+    eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
+    eigen_assert(rows()==b.rows()
+              && "IterativeSolverBase::solve(): invalid number of rows of the right hand side matrix b");
+    return internal::sparse_solve_retval<IterativeSolverBase, Rhs>(*this, b.derived());
+  }
+
+  /** \returns Success if the iterations converged, and NoConvergence otherwise. */
+  ComputationInfo info() const
+  {
+    eigen_assert(m_isInitialized && "IterativeSolverBase is not initialized.");
+    return m_info;
+  }
+  
+  /** \internal */
+  template<typename Rhs, typename DestScalar, int DestOptions, typename DestIndex>
+  void _solve_sparse(const Rhs& b, SparseMatrix<DestScalar,DestOptions,DestIndex> &dest) const
+  {
+    eigen_assert(rows()==b.rows());
+    
+    int rhsCols = b.cols();
+    int size = b.rows();
+    Eigen::Matrix<DestScalar,Dynamic,1> tb(size);
+    Eigen::Matrix<DestScalar,Dynamic,1> tx(size);
+    for(int k=0; k<rhsCols; ++k)
+    {
+      tb = b.col(k);
+      tx = derived().solve(tb);
+      dest.col(k) = tx.sparseView(0);
+    }
+  }
+
+protected:
+  void init()
+  {
+    m_isInitialized = false;
+    m_analysisIsOk = false;
+    m_factorizationIsOk = false;
+    m_maxIterations = -1;
+    m_tolerance = NumTraits<Scalar>::epsilon();
+  }
+  const MatrixType* mp_matrix;
+  Preconditioner m_preconditioner;
+
+  int m_maxIterations;
+  RealScalar m_tolerance;
+  
+  mutable RealScalar m_error;
+  mutable int m_iterations;
+  mutable ComputationInfo m_info;
+  mutable bool m_isInitialized, m_analysisIsOk, m_factorizationIsOk;
+};
+
+namespace internal {
+ 
+template<typename Derived, typename Rhs>
+struct sparse_solve_retval<IterativeSolverBase<Derived>, Rhs>
+  : sparse_solve_retval_base<IterativeSolverBase<Derived>, Rhs>
+{
+  typedef IterativeSolverBase<Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec().derived()._solve_sparse(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_ITERATIVE_SOLVER_BASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/Jacobi/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/Jacobi/CMakeLists.txt
new file mode 100644
index 0000000..490dac6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Jacobi/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_Jacobi_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_Jacobi_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/Jacobi COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/Jacobi/Jacobi.h b/vendor/eigen-3.1.91/Eigen/src/Jacobi/Jacobi.h
new file mode 100644
index 0000000..d9d7519
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/Jacobi/Jacobi.h
@@ -0,0 +1,433 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_JACOBI_H
+#define EIGEN_JACOBI_H
+
+namespace Eigen { 
+
+/** \ingroup Jacobi_Module
+  * \jacobi_module
+  * \class JacobiRotation
+  * \brief Rotation given by a cosine-sine pair.
+  *
+  * This class represents a Jacobi or Givens rotation.
+  * This is a 2D rotation in the plane \c J of angle \f$ \theta \f$ defined by
+  * its cosine \c c and sine \c s as follow:
+  * \f$ J = \left ( \begin{array}{cc} c & \overline s \\ -s  & \overline c \end{array} \right ) \f$
+  *
+  * You can apply the respective counter-clockwise rotation to a column vector \c v by
+  * applying its adjoint on the left: \f$ v = J^* v \f$ that translates to the following Eigen code:
+  * \code
+  * v.applyOnTheLeft(J.adjoint());
+  * \endcode
+  *
+  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+template<typename Scalar> class JacobiRotation
+{
+  public:
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    /** Default constructor without any initialization. */
+    JacobiRotation() {}
+
+    /** Construct a planar rotation from a cosine-sine pair (\a c, \c s). */
+    JacobiRotation(const Scalar& c, const Scalar& s) : m_c(c), m_s(s) {}
+
+    Scalar& c() { return m_c; }
+    Scalar c() const { return m_c; }
+    Scalar& s() { return m_s; }
+    Scalar s() const { return m_s; }
+
+    /** Concatenates two planar rotation */
+    JacobiRotation operator*(const JacobiRotation& other)
+    {
+      using internal::conj;
+      return JacobiRotation(m_c * other.m_c - conj(m_s) * other.m_s,
+                            conj(m_c * conj(other.m_s) + conj(m_s) * conj(other.m_c)));
+    }
+
+    /** Returns the transposed transformation */
+    JacobiRotation transpose() const { using internal::conj; return JacobiRotation(m_c, -conj(m_s)); }
+
+    /** Returns the adjoint transformation */
+    JacobiRotation adjoint() const { using internal::conj; return JacobiRotation(conj(m_c), -m_s); }
+
+    template<typename Derived>
+    bool makeJacobi(const MatrixBase<Derived>&, typename Derived::Index p, typename Derived::Index q);
+    bool makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z);
+
+    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z=0);
+
+  protected:
+    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z, internal::true_type);
+    void makeGivens(const Scalar& p, const Scalar& q, Scalar* z, internal::false_type);
+
+    Scalar m_c, m_s;
+};
+
+/** Makes \c *this as a Jacobi rotation \a J such that applying \a J on both the right and left sides of the selfadjoint 2x2 matrix
+  * \f$ B = \left ( \begin{array}{cc} x & y \\ \overline y & z \end{array} \right )\f$ yields a diagonal matrix \f$ A = J^* B J \f$
+  *
+  * \sa MatrixBase::makeJacobi(const MatrixBase<Derived>&, Index, Index), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+template<typename Scalar>
+bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, const RealScalar& z)
+{
+  using std::sqrt;
+  using std::abs;
+  typedef typename NumTraits<Scalar>::Real RealScalar;
+  if(y == Scalar(0))
+  {
+    m_c = Scalar(1);
+    m_s = Scalar(0);
+    return false;
+  }
+  else
+  {
+    RealScalar tau = (x-z)/(RealScalar(2)*abs(y));
+    RealScalar w = sqrt(internal::abs2(tau) + RealScalar(1));
+    RealScalar t;
+    if(tau>RealScalar(0))
+    {
+      t = RealScalar(1) / (tau + w);
+    }
+    else
+    {
+      t = RealScalar(1) / (tau - w);
+    }
+    RealScalar sign_t = t > RealScalar(0) ? RealScalar(1) : RealScalar(-1);
+    RealScalar n = RealScalar(1) / sqrt(internal::abs2(t)+RealScalar(1));
+    m_s = - sign_t * (internal::conj(y) / abs(y)) * abs(t) * n;
+    m_c = n;
+    return true;
+  }
+}
+
+/** Makes \c *this as a Jacobi rotation \c J such that applying \a J on both the right and left sides of the 2x2 selfadjoint matrix
+  * \f$ B = \left ( \begin{array}{cc} \text{this}_{pp} & \text{this}_{pq} \\ (\text{this}_{pq})^* & \text{this}_{qq} \end{array} \right )\f$ yields
+  * a diagonal matrix \f$ A = J^* B J \f$
+  *
+  * Example: \include Jacobi_makeJacobi.cpp
+  * Output: \verbinclude Jacobi_makeJacobi.out
+  *
+  * \sa JacobiRotation::makeJacobi(RealScalar, Scalar, RealScalar), MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+template<typename Scalar>
+template<typename Derived>
+inline bool JacobiRotation<Scalar>::makeJacobi(const MatrixBase<Derived>& m, typename Derived::Index p, typename Derived::Index q)
+{
+  return makeJacobi(internal::real(m.coeff(p,p)), m.coeff(p,q), internal::real(m.coeff(q,q)));
+}
+
+/** Makes \c *this as a Givens rotation \c G such that applying \f$ G^* \f$ to the left of the vector
+  * \f$ V = \left ( \begin{array}{c} p \\ q \end{array} \right )\f$ yields:
+  * \f$ G^* V = \left ( \begin{array}{c} r \\ 0 \end{array} \right )\f$.
+  *
+  * The value of \a z is returned if \a z is not null (the default is null).
+  * Also note that G is built such that the cosine is always real.
+  *
+  * Example: \include Jacobi_makeGivens.cpp
+  * Output: \verbinclude Jacobi_makeGivens.out
+  *
+  * This function implements the continuous Givens rotation generation algorithm
+  * found in Anderson (2000), Discontinuous Plane Rotations and the Symmetric Eigenvalue Problem.
+  * LAPACK Working Note 150, University of Tennessee, UT-CS-00-454, December 4, 2000.
+  *
+  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+template<typename Scalar>
+void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* z)
+{
+  makeGivens(p, q, z, typename internal::conditional<NumTraits<Scalar>::IsComplex, internal::true_type, internal::false_type>::type());
+}
+
+
+// specialization for complexes
+template<typename Scalar>
+void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::true_type)
+{
+  using std::sqrt;
+  using std::abs;
+  using internal::conj;
+  
+  if(q==Scalar(0))
+  {
+    m_c = internal::real(p)<0 ? Scalar(-1) : Scalar(1);
+    m_s = 0;
+    if(r) *r = m_c * p;
+  }
+  else if(p==Scalar(0))
+  {
+    m_c = 0;
+    m_s = -q/abs(q);
+    if(r) *r = abs(q);
+  }
+  else
+  {
+    RealScalar p1 = internal::norm1(p);
+    RealScalar q1 = internal::norm1(q);
+    if(p1>=q1)
+    {
+      Scalar ps = p / p1;
+      RealScalar p2 = internal::abs2(ps);
+      Scalar qs = q / p1;
+      RealScalar q2 = internal::abs2(qs);
+
+      RealScalar u = sqrt(RealScalar(1) + q2/p2);
+      if(internal::real(p)<RealScalar(0))
+        u = -u;
+
+      m_c = Scalar(1)/u;
+      m_s = -qs*conj(ps)*(m_c/p2);
+      if(r) *r = p * u;
+    }
+    else
+    {
+      Scalar ps = p / q1;
+      RealScalar p2 = internal::abs2(ps);
+      Scalar qs = q / q1;
+      RealScalar q2 = internal::abs2(qs);
+
+      RealScalar u = q1 * sqrt(p2 + q2);
+      if(internal::real(p)<RealScalar(0))
+        u = -u;
+
+      p1 = abs(p);
+      ps = p/p1;
+      m_c = p1/u;
+      m_s = -conj(ps) * (q/u);
+      if(r) *r = ps * u;
+    }
+  }
+}
+
+// specialization for reals
+template<typename Scalar>
+void JacobiRotation<Scalar>::makeGivens(const Scalar& p, const Scalar& q, Scalar* r, internal::false_type)
+{
+  using std::sqrt;
+  using std::abs;
+  if(q==Scalar(0))
+  {
+    m_c = p<Scalar(0) ? Scalar(-1) : Scalar(1);
+    m_s = Scalar(0);
+    if(r) *r = abs(p);
+  }
+  else if(p==Scalar(0))
+  {
+    m_c = Scalar(0);
+    m_s = q<Scalar(0) ? Scalar(1) : Scalar(-1);
+    if(r) *r = abs(q);
+  }
+  else if(abs(p) > abs(q))
+  {
+    Scalar t = q/p;
+    Scalar u = sqrt(Scalar(1) + internal::abs2(t));
+    if(p<Scalar(0))
+      u = -u;
+    m_c = Scalar(1)/u;
+    m_s = -t * m_c;
+    if(r) *r = p * u;
+  }
+  else
+  {
+    Scalar t = p/q;
+    Scalar u = sqrt(Scalar(1) + internal::abs2(t));
+    if(q<Scalar(0))
+      u = -u;
+    m_s = -Scalar(1)/u;
+    m_c = -t * m_s;
+    if(r) *r = q * u;
+  }
+
+}
+
+/****************************************************************************************
+*   Implementation of MatrixBase methods
+****************************************************************************************/
+
+/** \jacobi_module
+  * Applies the clock wise 2D rotation \a j to the set of 2D vectors of cordinates \a x and \a y:
+  * \f$ \left ( \begin{array}{cc} x \\ y \end{array} \right )  =  J \left ( \begin{array}{cc} x \\ y \end{array} \right ) \f$
+  *
+  * \sa MatrixBase::applyOnTheLeft(), MatrixBase::applyOnTheRight()
+  */
+namespace internal {
+template<typename VectorX, typename VectorY, typename OtherScalar>
+void apply_rotation_in_the_plane(VectorX& _x, VectorY& _y, const JacobiRotation<OtherScalar>& j);
+}
+
+/** \jacobi_module
+  * Applies the rotation in the plane \a j to the rows \a p and \a q of \c *this, i.e., it computes B = J * B,
+  * with \f$ B = \left ( \begin{array}{cc} \text{*this.row}(p) \\ \text{*this.row}(q) \end{array} \right ) \f$.
+  *
+  * \sa class JacobiRotation, MatrixBase::applyOnTheRight(), internal::apply_rotation_in_the_plane()
+  */
+template<typename Derived>
+template<typename OtherScalar>
+inline void MatrixBase<Derived>::applyOnTheLeft(Index p, Index q, const JacobiRotation<OtherScalar>& j)
+{
+  RowXpr x(this->row(p));
+  RowXpr y(this->row(q));
+  internal::apply_rotation_in_the_plane(x, y, j);
+}
+
+/** \ingroup Jacobi_Module
+  * Applies the rotation in the plane \a j to the columns \a p and \a q of \c *this, i.e., it computes B = B * J
+  * with \f$ B = \left ( \begin{array}{cc} \text{*this.col}(p) & \text{*this.col}(q) \end{array} \right ) \f$.
+  *
+  * \sa class JacobiRotation, MatrixBase::applyOnTheLeft(), internal::apply_rotation_in_the_plane()
+  */
+template<typename Derived>
+template<typename OtherScalar>
+inline void MatrixBase<Derived>::applyOnTheRight(Index p, Index q, const JacobiRotation<OtherScalar>& j)
+{
+  ColXpr x(this->col(p));
+  ColXpr y(this->col(q));
+  internal::apply_rotation_in_the_plane(x, y, j.transpose());
+}
+
+namespace internal {
+template<typename VectorX, typename VectorY, typename OtherScalar>
+void /*EIGEN_DONT_INLINE*/ apply_rotation_in_the_plane(VectorX& _x, VectorY& _y, const JacobiRotation<OtherScalar>& j)
+{
+  typedef typename VectorX::Index Index;
+  typedef typename VectorX::Scalar Scalar;
+  enum { PacketSize = packet_traits<Scalar>::size };
+  typedef typename packet_traits<Scalar>::type Packet;
+  eigen_assert(_x.size() == _y.size());
+  Index size = _x.size();
+  Index incrx = _x.innerStride();
+  Index incry = _y.innerStride();
+
+  Scalar* EIGEN_RESTRICT x = &_x.coeffRef(0);
+  Scalar* EIGEN_RESTRICT y = &_y.coeffRef(0);
+  
+  OtherScalar c = j.c();
+  OtherScalar s = j.s();
+  if (c==OtherScalar(1) && s==OtherScalar(0))
+    return;
+
+  /*** dynamic-size vectorized paths ***/
+
+  if(VectorX::SizeAtCompileTime == Dynamic &&
+    (VectorX::Flags & VectorY::Flags & PacketAccessBit) &&
+    ((incrx==1 && incry==1) || PacketSize == 1))
+  {
+    // both vectors are sequentially stored in memory => vectorization
+    enum { Peeling = 2 };
+
+    Index alignedStart = internal::first_aligned(y, size);
+    Index alignedEnd = alignedStart + ((size-alignedStart)/PacketSize)*PacketSize;
+
+    const Packet pc = pset1<Packet>(c);
+    const Packet ps = pset1<Packet>(s);
+    conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex,false> pcj;
+
+    for(Index i=0; i<alignedStart; ++i)
+    {
+      Scalar xi = x[i];
+      Scalar yi = y[i];
+      x[i] =  c * xi + conj(s) * yi;
+      y[i] = -s * xi + conj(c) * yi;
+    }
+
+    Scalar* EIGEN_RESTRICT px = x + alignedStart;
+    Scalar* EIGEN_RESTRICT py = y + alignedStart;
+
+    if(internal::first_aligned(x, size)==alignedStart)
+    {
+      for(Index i=alignedStart; i<alignedEnd; i+=PacketSize)
+      {
+        Packet xi = pload<Packet>(px);
+        Packet yi = pload<Packet>(py);
+        pstore(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));
+        pstore(py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));
+        px += PacketSize;
+        py += PacketSize;
+      }
+    }
+    else
+    {
+      Index peelingEnd = alignedStart + ((size-alignedStart)/(Peeling*PacketSize))*(Peeling*PacketSize);
+      for(Index i=alignedStart; i<peelingEnd; i+=Peeling*PacketSize)
+      {
+        Packet xi   = ploadu<Packet>(px);
+        Packet xi1  = ploadu<Packet>(px+PacketSize);
+        Packet yi   = pload <Packet>(py);
+        Packet yi1  = pload <Packet>(py+PacketSize);
+        pstoreu(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));
+        pstoreu(px+PacketSize, padd(pmul(pc,xi1),pcj.pmul(ps,yi1)));
+        pstore (py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));
+        pstore (py+PacketSize, psub(pcj.pmul(pc,yi1),pmul(ps,xi1)));
+        px += Peeling*PacketSize;
+        py += Peeling*PacketSize;
+      }
+      if(alignedEnd!=peelingEnd)
+      {
+        Packet xi = ploadu<Packet>(x+peelingEnd);
+        Packet yi = pload <Packet>(y+peelingEnd);
+        pstoreu(x+peelingEnd, padd(pmul(pc,xi),pcj.pmul(ps,yi)));
+        pstore (y+peelingEnd, psub(pcj.pmul(pc,yi),pmul(ps,xi)));
+      }
+    }
+
+    for(Index i=alignedEnd; i<size; ++i)
+    {
+      Scalar xi = x[i];
+      Scalar yi = y[i];
+      x[i] =  c * xi + conj(s) * yi;
+      y[i] = -s * xi + conj(c) * yi;
+    }
+  }
+
+  /*** fixed-size vectorized path ***/
+  else if(VectorX::SizeAtCompileTime != Dynamic &&
+          (VectorX::Flags & VectorY::Flags & PacketAccessBit) &&
+          (VectorX::Flags & VectorY::Flags & AlignedBit))
+  {
+    const Packet pc = pset1<Packet>(c);
+    const Packet ps = pset1<Packet>(s);
+    conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex,false> pcj;
+    Scalar* EIGEN_RESTRICT px = x;
+    Scalar* EIGEN_RESTRICT py = y;
+    for(Index i=0; i<size; i+=PacketSize)
+    {
+      Packet xi = pload<Packet>(px);
+      Packet yi = pload<Packet>(py);
+      pstore(px, padd(pmul(pc,xi),pcj.pmul(ps,yi)));
+      pstore(py, psub(pcj.pmul(pc,yi),pmul(ps,xi)));
+      px += PacketSize;
+      py += PacketSize;
+    }
+  }
+
+  /*** non-vectorized path ***/
+  else
+  {
+    for(Index i=0; i<size; ++i)
+    {
+      Scalar xi = *x;
+      Scalar yi = *y;
+      *x =  c * xi + conj(s) * yi;
+      *y = -s * xi + conj(c) * yi;
+      x += incrx;
+      y += incry;
+    }
+  }
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_JACOBI_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/LU/CMakeLists.txt
new file mode 100644
index 0000000..e0d8d78
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/CMakeLists.txt
@@ -0,0 +1,8 @@
+FILE(GLOB Eigen_LU_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_LU_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/LU COMPONENT Devel
+  )
+
+ADD_SUBDIRECTORY(arch)
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/Determinant.h b/vendor/eigen-3.1.91/Eigen/src/LU/Determinant.h
new file mode 100644
index 0000000..bb8e78a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/Determinant.h
@@ -0,0 +1,101 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_DETERMINANT_H
+#define EIGEN_DETERMINANT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Derived>
+inline const typename Derived::Scalar bruteforce_det3_helper
+(const MatrixBase<Derived>& matrix, int a, int b, int c)
+{
+  return matrix.coeff(0,a)
+         * (matrix.coeff(1,b) * matrix.coeff(2,c) - matrix.coeff(1,c) * matrix.coeff(2,b));
+}
+
+template<typename Derived>
+const typename Derived::Scalar bruteforce_det4_helper
+(const MatrixBase<Derived>& matrix, int j, int k, int m, int n)
+{
+  return (matrix.coeff(j,0) * matrix.coeff(k,1) - matrix.coeff(k,0) * matrix.coeff(j,1))
+       * (matrix.coeff(m,2) * matrix.coeff(n,3) - matrix.coeff(n,2) * matrix.coeff(m,3));
+}
+
+template<typename Derived,
+         int DeterminantType = Derived::RowsAtCompileTime
+> struct determinant_impl
+{
+  static inline typename traits<Derived>::Scalar run(const Derived& m)
+  {
+    if(Derived::ColsAtCompileTime==Dynamic && m.rows()==0)
+      return typename traits<Derived>::Scalar(1);
+    return m.partialPivLu().determinant();
+  }
+};
+
+template<typename Derived> struct determinant_impl<Derived, 1>
+{
+  static inline typename traits<Derived>::Scalar run(const Derived& m)
+  {
+    return m.coeff(0,0);
+  }
+};
+
+template<typename Derived> struct determinant_impl<Derived, 2>
+{
+  static inline typename traits<Derived>::Scalar run(const Derived& m)
+  {
+    return m.coeff(0,0) * m.coeff(1,1) - m.coeff(1,0) * m.coeff(0,1);
+  }
+};
+
+template<typename Derived> struct determinant_impl<Derived, 3>
+{
+  static inline typename traits<Derived>::Scalar run(const Derived& m)
+  {
+    return bruteforce_det3_helper(m,0,1,2)
+          - bruteforce_det3_helper(m,1,0,2)
+          + bruteforce_det3_helper(m,2,0,1);
+  }
+};
+
+template<typename Derived> struct determinant_impl<Derived, 4>
+{
+  static typename traits<Derived>::Scalar run(const Derived& m)
+  {
+    // trick by Martin Costabel to compute 4x4 det with only 30 muls
+    return bruteforce_det4_helper(m,0,1,2,3)
+          - bruteforce_det4_helper(m,0,2,1,3)
+          + bruteforce_det4_helper(m,0,3,1,2)
+          + bruteforce_det4_helper(m,1,2,0,3)
+          - bruteforce_det4_helper(m,1,3,0,2)
+          + bruteforce_det4_helper(m,2,3,0,1);
+  }
+};
+
+} // end namespace internal
+
+/** \lu_module
+  *
+  * \returns the determinant of this matrix
+  */
+template<typename Derived>
+inline typename internal::traits<Derived>::Scalar MatrixBase<Derived>::determinant() const
+{
+  eigen_assert(rows() == cols());
+  typedef typename internal::nested<Derived,Base::RowsAtCompileTime>::type Nested;
+  return internal::determinant_impl<typename internal::remove_all<Nested>::type>::run(derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_DETERMINANT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/FullPivLU.h b/vendor/eigen-3.1.91/Eigen/src/LU/FullPivLU.h
new file mode 100644
index 0000000..dfe25f4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/FullPivLU.h
@@ -0,0 +1,742 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_LU_H
+#define EIGEN_LU_H
+
+namespace Eigen { 
+
+/** \ingroup LU_Module
+  *
+  * \class FullPivLU
+  *
+  * \brief LU decomposition of a matrix with complete pivoting, and related features
+  *
+  * \param MatrixType the type of the matrix of which we are computing the LU decomposition
+  *
+  * This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A
+  * is decomposed as A = PLUQ where L is unit-lower-triangular, U is upper-triangular, and P and Q
+  * are permutation matrices. This is a rank-revealing LU decomposition. The eigenvalues (diagonal
+  * coefficients) of U are sorted in such a way that any zeros are at the end.
+  *
+  * This decomposition provides the generic approach to solving systems of linear equations, computing
+  * the rank, invertibility, inverse, kernel, and determinant.
+  *
+  * This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD
+  * decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix,
+  * working with the SVD allows to select the smallest singular values of the matrix, something that
+  * the LU decomposition doesn't see.
+  *
+  * The data of the LU decomposition can be directly accessed through the methods matrixLU(),
+  * permutationP(), permutationQ().
+  *
+  * As an exemple, here is how the original matrix can be retrieved:
+  * \include class_FullPivLU.cpp
+  * Output: \verbinclude class_FullPivLU.out
+  *
+  * \sa MatrixBase::fullPivLu(), MatrixBase::determinant(), MatrixBase::inverse()
+  */
+template<typename _MatrixType> class FullPivLU
+{
+  public:
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef typename internal::traits<MatrixType>::StorageKind StorageKind;
+    typedef typename MatrixType::Index Index;
+    typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
+    typedef typename internal::plain_col_type<MatrixType, Index>::type IntColVectorType;
+    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationQType;
+    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationPType;
+
+    /**
+      * \brief Default Constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via LU::compute(const MatrixType&).
+      */
+    FullPivLU();
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa FullPivLU()
+      */
+    FullPivLU(Index rows, Index cols);
+
+    /** Constructor.
+      *
+      * \param matrix the matrix of which to compute the LU decomposition.
+      *               It is required to be nonzero.
+      */
+    FullPivLU(const MatrixType& matrix);
+
+    /** Computes the LU decomposition of the given matrix.
+      *
+      * \param matrix the matrix of which to compute the LU decomposition.
+      *               It is required to be nonzero.
+      *
+      * \returns a reference to *this
+      */
+    FullPivLU& compute(const MatrixType& matrix);
+
+    /** \returns the LU decomposition matrix: the upper-triangular part is U, the
+      * unit-lower-triangular part is L (at least for square matrices; in the non-square
+      * case, special care is needed, see the documentation of class FullPivLU).
+      *
+      * \sa matrixL(), matrixU()
+      */
+    inline const MatrixType& matrixLU() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return m_lu;
+    }
+
+    /** \returns the number of nonzero pivots in the LU decomposition.
+      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+      * So that notion isn't really intrinsically interesting, but it is
+      * still useful when implementing algorithms.
+      *
+      * \sa rank()
+      */
+    inline Index nonzeroPivots() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return m_nonzero_pivots;
+    }
+
+    /** \returns the absolute value of the biggest pivot, i.e. the biggest
+      *          diagonal coefficient of U.
+      */
+    RealScalar maxPivot() const { return m_maxpivot; }
+
+    /** \returns the permutation matrix P
+      *
+      * \sa permutationQ()
+      */
+    inline const PermutationPType& permutationP() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return m_p;
+    }
+
+    /** \returns the permutation matrix Q
+      *
+      * \sa permutationP()
+      */
+    inline const PermutationQType& permutationQ() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return m_q;
+    }
+
+    /** \returns the kernel of the matrix, also called its null-space. The columns of the returned matrix
+      * will form a basis of the kernel.
+      *
+      * \note If the kernel has dimension zero, then the returned matrix is a column-vector filled with zeros.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      *
+      * Example: \include FullPivLU_kernel.cpp
+      * Output: \verbinclude FullPivLU_kernel.out
+      *
+      * \sa image()
+      */
+    inline const internal::kernel_retval<FullPivLU> kernel() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return internal::kernel_retval<FullPivLU>(*this);
+    }
+
+    /** \returns the image of the matrix, also called its column-space. The columns of the returned matrix
+      * will form a basis of the kernel.
+      *
+      * \param originalMatrix the original matrix, of which *this is the LU decomposition.
+      *                       The reason why it is needed to pass it here, is that this allows
+      *                       a large optimization, as otherwise this method would need to reconstruct it
+      *                       from the LU decomposition.
+      *
+      * \note If the image has dimension zero, then the returned matrix is a column-vector filled with zeros.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      *
+      * Example: \include FullPivLU_image.cpp
+      * Output: \verbinclude FullPivLU_image.out
+      *
+      * \sa kernel()
+      */
+    inline const internal::image_retval<FullPivLU>
+      image(const MatrixType& originalMatrix) const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return internal::image_retval<FullPivLU>(*this, originalMatrix);
+    }
+
+    /** \return a solution x to the equation Ax=b, where A is the matrix of which
+      * *this is the LU decomposition.
+      *
+      * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
+      *          the only requirement in order for the equation to make sense is that
+      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
+      *
+      * \returns a solution.
+      *
+      * \note_about_checking_solutions
+      *
+      * \note_about_arbitrary_choice_of_solution
+      * \note_about_using_kernel_to_study_multiple_solutions
+      *
+      * Example: \include FullPivLU_solve.cpp
+      * Output: \verbinclude FullPivLU_solve.out
+      *
+      * \sa TriangularView::solve(), kernel(), inverse()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<FullPivLU, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return internal::solve_retval<FullPivLU, Rhs>(*this, b.derived());
+    }
+
+    /** \returns the determinant of the matrix of which
+      * *this is the LU decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the LU decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
+      *       optimized paths.
+      *
+      * \warning a determinant can be very big or small, so for matrices
+      * of large enough dimension, there is a risk of overflow/underflow.
+      *
+      * \sa MatrixBase::determinant()
+      */
+    typename internal::traits<MatrixType>::Scalar determinant() const;
+
+    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+      * who need to determine when pivots are to be considered nonzero. This is not used for the
+      * LU decomposition itself.
+      *
+      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+      * uses a formula to automatically determine a reasonable threshold.
+      * Once you have called the present method setThreshold(const RealScalar&),
+      * your value is used instead.
+      *
+      * \param threshold The new value to use as the threshold.
+      *
+      * A pivot will be considered nonzero if its absolute value is strictly greater than
+      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+      * where maxpivot is the biggest pivot.
+      *
+      * If you want to come back to the default behavior, call setThreshold(Default_t)
+      */
+    FullPivLU& setThreshold(const RealScalar& threshold)
+    {
+      m_usePrescribedThreshold = true;
+      m_prescribedThreshold = threshold;
+      return *this;
+    }
+
+    /** Allows to come back to the default behavior, letting Eigen use its default formula for
+      * determining the threshold.
+      *
+      * You should pass the special object Eigen::Default as parameter here.
+      * \code lu.setThreshold(Eigen::Default); \endcode
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    FullPivLU& setThreshold(Default_t)
+    {
+      m_usePrescribedThreshold = false;
+      return *this;
+    }
+
+    /** Returns the threshold that will be used by certain methods such as rank().
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    RealScalar threshold() const
+    {
+      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+      return m_usePrescribedThreshold ? m_prescribedThreshold
+      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
+      // and turns out to be identical to Higham's formula used already in LDLt.
+                                      : NumTraits<Scalar>::epsilon() * m_lu.diagonalSize();
+    }
+
+    /** \returns the rank of the matrix of which *this is the LU decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index rank() const
+    {
+      using std::abs;
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+      Index result = 0;
+      for(Index i = 0; i < m_nonzero_pivots; ++i)
+        result += (abs(m_lu.coeff(i,i)) > premultiplied_threshold);
+      return result;
+    }
+
+    /** \returns the dimension of the kernel of the matrix of which *this is the LU decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index dimensionOfKernel() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return cols() - rank();
+    }
+
+    /** \returns true if the matrix of which *this is the LU decomposition represents an injective
+      *          linear map, i.e. has trivial kernel; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInjective() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return rank() == cols();
+    }
+
+    /** \returns true if the matrix of which *this is the LU decomposition represents a surjective
+      *          linear map; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isSurjective() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return rank() == rows();
+    }
+
+    /** \returns true if the matrix of which *this is the LU decomposition is invertible.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInvertible() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return isInjective() && (m_lu.rows() == m_lu.cols());
+    }
+
+    /** \returns the inverse of the matrix of which *this is the LU decomposition.
+      *
+      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+      *       Use isInvertible() to first determine whether this matrix is invertible.
+      *
+      * \sa MatrixBase::inverse()
+      */
+    inline const internal::solve_retval<FullPivLU,typename MatrixType::IdentityReturnType> inverse() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the inverse of a non-square matrix!");
+      return internal::solve_retval<FullPivLU,typename MatrixType::IdentityReturnType>
+               (*this, MatrixType::Identity(m_lu.rows(), m_lu.cols()));
+    }
+
+    MatrixType reconstructedMatrix() const;
+
+    inline Index rows() const { return m_lu.rows(); }
+    inline Index cols() const { return m_lu.cols(); }
+
+  protected:
+    MatrixType m_lu;
+    PermutationPType m_p;
+    PermutationQType m_q;
+    IntColVectorType m_rowsTranspositions;
+    IntRowVectorType m_colsTranspositions;
+    Index m_det_pq, m_nonzero_pivots;
+    RealScalar m_maxpivot, m_prescribedThreshold;
+    bool m_isInitialized, m_usePrescribedThreshold;
+};
+
+template<typename MatrixType>
+FullPivLU<MatrixType>::FullPivLU()
+  : m_isInitialized(false), m_usePrescribedThreshold(false)
+{
+}
+
+template<typename MatrixType>
+FullPivLU<MatrixType>::FullPivLU(Index rows, Index cols)
+  : m_lu(rows, cols),
+    m_p(rows),
+    m_q(cols),
+    m_rowsTranspositions(rows),
+    m_colsTranspositions(cols),
+    m_isInitialized(false),
+    m_usePrescribedThreshold(false)
+{
+}
+
+template<typename MatrixType>
+FullPivLU<MatrixType>::FullPivLU(const MatrixType& matrix)
+  : m_lu(matrix.rows(), matrix.cols()),
+    m_p(matrix.rows()),
+    m_q(matrix.cols()),
+    m_rowsTranspositions(matrix.rows()),
+    m_colsTranspositions(matrix.cols()),
+    m_isInitialized(false),
+    m_usePrescribedThreshold(false)
+{
+  compute(matrix);
+}
+
+template<typename MatrixType>
+FullPivLU<MatrixType>& FullPivLU<MatrixType>::compute(const MatrixType& matrix)
+{
+  // the permutations are stored as int indices, so just to be sure:
+  eigen_assert(matrix.rows()<=NumTraits<int>::highest() && matrix.cols()<=NumTraits<int>::highest());
+  
+  m_isInitialized = true;
+  m_lu = matrix;
+
+  const Index size = matrix.diagonalSize();
+  const Index rows = matrix.rows();
+  const Index cols = matrix.cols();
+
+  // will store the transpositions, before we accumulate them at the end.
+  // can't accumulate on-the-fly because that will be done in reverse order for the rows.
+  m_rowsTranspositions.resize(matrix.rows());
+  m_colsTranspositions.resize(matrix.cols());
+  Index number_of_transpositions = 0; // number of NONTRIVIAL transpositions, i.e. m_rowsTranspositions[i]!=i
+
+  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_maxpivot = RealScalar(0);
+
+  for(Index k = 0; k < size; ++k)
+  {
+    // First, we need to find the pivot.
+
+    // biggest coefficient in the remaining bottom-right corner (starting at row k, col k)
+    Index row_of_biggest_in_corner, col_of_biggest_in_corner;
+    RealScalar biggest_in_corner;
+    biggest_in_corner = m_lu.bottomRightCorner(rows-k, cols-k)
+                        .cwiseAbs()
+                        .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
+    row_of_biggest_in_corner += k; // correct the values! since they were computed in the corner,
+    col_of_biggest_in_corner += k; // need to add k to them.
+
+    if(biggest_in_corner==RealScalar(0))
+    {
+      // before exiting, make sure to initialize the still uninitialized transpositions
+      // in a sane state without destroying what we already have.
+      m_nonzero_pivots = k;
+      for(Index i = k; i < size; ++i)
+      {
+        m_rowsTranspositions.coeffRef(i) = i;
+        m_colsTranspositions.coeffRef(i) = i;
+      }
+      break;
+    }
+
+    if(biggest_in_corner > m_maxpivot) m_maxpivot = biggest_in_corner;
+
+    // Now that we've found the pivot, we need to apply the row/col swaps to
+    // bring it to the location (k,k).
+
+    m_rowsTranspositions.coeffRef(k) = row_of_biggest_in_corner;
+    m_colsTranspositions.coeffRef(k) = col_of_biggest_in_corner;
+    if(k != row_of_biggest_in_corner) {
+      m_lu.row(k).swap(m_lu.row(row_of_biggest_in_corner));
+      ++number_of_transpositions;
+    }
+    if(k != col_of_biggest_in_corner) {
+      m_lu.col(k).swap(m_lu.col(col_of_biggest_in_corner));
+      ++number_of_transpositions;
+    }
+
+    // Now that the pivot is at the right location, we update the remaining
+    // bottom-right corner by Gaussian elimination.
+
+    if(k<rows-1)
+      m_lu.col(k).tail(rows-k-1) /= m_lu.coeff(k,k);
+    if(k<size-1)
+      m_lu.block(k+1,k+1,rows-k-1,cols-k-1).noalias() -= m_lu.col(k).tail(rows-k-1) * m_lu.row(k).tail(cols-k-1);
+  }
+
+  // the main loop is over, we still have to accumulate the transpositions to find the
+  // permutations P and Q
+
+  m_p.setIdentity(rows);
+  for(Index k = size-1; k >= 0; --k)
+    m_p.applyTranspositionOnTheRight(k, m_rowsTranspositions.coeff(k));
+
+  m_q.setIdentity(cols);
+  for(Index k = 0; k < size; ++k)
+    m_q.applyTranspositionOnTheRight(k, m_colsTranspositions.coeff(k));
+
+  m_det_pq = (number_of_transpositions%2) ? -1 : 1;
+  return *this;
+}
+
+template<typename MatrixType>
+typename internal::traits<MatrixType>::Scalar FullPivLU<MatrixType>::determinant() const
+{
+  eigen_assert(m_isInitialized && "LU is not initialized.");
+  eigen_assert(m_lu.rows() == m_lu.cols() && "You can't take the determinant of a non-square matrix!");
+  return Scalar(m_det_pq) * Scalar(m_lu.diagonal().prod());
+}
+
+/** \returns the matrix represented by the decomposition,
+ * i.e., it returns the product: P^{-1} L U Q^{-1}.
+ * This function is provided for debug purpose. */
+template<typename MatrixType>
+MatrixType FullPivLU<MatrixType>::reconstructedMatrix() const
+{
+  eigen_assert(m_isInitialized && "LU is not initialized.");
+  const Index smalldim = (std::min)(m_lu.rows(), m_lu.cols());
+  // LU
+  MatrixType res(m_lu.rows(),m_lu.cols());
+  // FIXME the .toDenseMatrix() should not be needed...
+  res = m_lu.leftCols(smalldim)
+            .template triangularView<UnitLower>().toDenseMatrix()
+      * m_lu.topRows(smalldim)
+            .template triangularView<Upper>().toDenseMatrix();
+
+  // P^{-1}(LU)
+  res = m_p.inverse() * res;
+
+  // (P^{-1}LU)Q^{-1}
+  res = res * m_q.inverse();
+
+  return res;
+}
+
+/********* Implementation of kernel() **************************************************/
+
+namespace internal {
+template<typename _MatrixType>
+struct kernel_retval<FullPivLU<_MatrixType> >
+  : kernel_retval_base<FullPivLU<_MatrixType> >
+{
+  EIGEN_MAKE_KERNEL_HELPERS(FullPivLU<_MatrixType>)
+
+  enum { MaxSmallDimAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(
+            MatrixType::MaxColsAtCompileTime,
+            MatrixType::MaxRowsAtCompileTime)
+  };
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    using std::abs;
+    const Index cols = dec().matrixLU().cols(), dimker = cols - rank();
+    if(dimker == 0)
+    {
+      // The Kernel is just {0}, so it doesn't have a basis properly speaking, but let's
+      // avoid crashing/asserting as that depends on floating point calculations. Let's
+      // just return a single column vector filled with zeros.
+      dst.setZero();
+      return;
+    }
+
+    /* Let us use the following lemma:
+      *
+      * Lemma: If the matrix A has the LU decomposition PAQ = LU,
+      * then Ker A = Q(Ker U).
+      *
+      * Proof: trivial: just keep in mind that P, Q, L are invertible.
+      */
+
+    /* Thus, all we need to do is to compute Ker U, and then apply Q.
+      *
+      * U is upper triangular, with eigenvalues sorted so that any zeros appear at the end.
+      * Thus, the diagonal of U ends with exactly
+      * dimKer zero's. Let us use that to construct dimKer linearly
+      * independent vectors in Ker U.
+      */
+
+    Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());
+    RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
+    Index p = 0;
+    for(Index i = 0; i < dec().nonzeroPivots(); ++i)
+      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)
+        pivots.coeffRef(p++) = i;
+    eigen_internal_assert(p == rank());
+
+    // we construct a temporaty trapezoid matrix m, by taking the U matrix and
+    // permuting the rows and cols to bring the nonnegligible pivots to the top of
+    // the main diagonal. We need that to be able to apply our triangular solvers.
+    // FIXME when we get triangularView-for-rectangular-matrices, this can be simplified
+    Matrix<typename MatrixType::Scalar, Dynamic, Dynamic, MatrixType::Options,
+           MaxSmallDimAtCompileTime, MatrixType::MaxColsAtCompileTime>
+      m(dec().matrixLU().block(0, 0, rank(), cols));
+    for(Index i = 0; i < rank(); ++i)
+    {
+      if(i) m.row(i).head(i).setZero();
+      m.row(i).tail(cols-i) = dec().matrixLU().row(pivots.coeff(i)).tail(cols-i);
+    }
+    m.block(0, 0, rank(), rank());
+    m.block(0, 0, rank(), rank()).template triangularView<StrictlyLower>().setZero();
+    for(Index i = 0; i < rank(); ++i)
+      m.col(i).swap(m.col(pivots.coeff(i)));
+
+    // ok, we have our trapezoid matrix, we can apply the triangular solver.
+    // notice that the math behind this suggests that we should apply this to the
+    // negative of the RHS, but for performance we just put the negative sign elsewhere, see below.
+    m.topLeftCorner(rank(), rank())
+     .template triangularView<Upper>().solveInPlace(
+        m.topRightCorner(rank(), dimker)
+      );
+
+    // now we must undo the column permutation that we had applied!
+    for(Index i = rank()-1; i >= 0; --i)
+      m.col(i).swap(m.col(pivots.coeff(i)));
+
+    // see the negative sign in the next line, that's what we were talking about above.
+    for(Index i = 0; i < rank(); ++i) dst.row(dec().permutationQ().indices().coeff(i)) = -m.row(i).tail(dimker);
+    for(Index i = rank(); i < cols; ++i) dst.row(dec().permutationQ().indices().coeff(i)).setZero();
+    for(Index k = 0; k < dimker; ++k) dst.coeffRef(dec().permutationQ().indices().coeff(rank()+k), k) = Scalar(1);
+  }
+};
+
+/***** Implementation of image() *****************************************************/
+
+template<typename _MatrixType>
+struct image_retval<FullPivLU<_MatrixType> >
+  : image_retval_base<FullPivLU<_MatrixType> >
+{
+  EIGEN_MAKE_IMAGE_HELPERS(FullPivLU<_MatrixType>)
+
+  enum { MaxSmallDimAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(
+            MatrixType::MaxColsAtCompileTime,
+            MatrixType::MaxRowsAtCompileTime)
+  };
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    using std::abs;
+    if(rank() == 0)
+    {
+      // The Image is just {0}, so it doesn't have a basis properly speaking, but let's
+      // avoid crashing/asserting as that depends on floating point calculations. Let's
+      // just return a single column vector filled with zeros.
+      dst.setZero();
+      return;
+    }
+
+    Matrix<Index, Dynamic, 1, 0, MaxSmallDimAtCompileTime, 1> pivots(rank());
+    RealScalar premultiplied_threshold = dec().maxPivot() * dec().threshold();
+    Index p = 0;
+    for(Index i = 0; i < dec().nonzeroPivots(); ++i)
+      if(abs(dec().matrixLU().coeff(i,i)) > premultiplied_threshold)
+        pivots.coeffRef(p++) = i;
+    eigen_internal_assert(p == rank());
+
+    for(Index i = 0; i < rank(); ++i)
+      dst.col(i) = originalMatrix().col(dec().permutationQ().indices().coeff(pivots.coeff(i)));
+  }
+};
+
+/***** Implementation of solve() *****************************************************/
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<FullPivLU<_MatrixType>, Rhs>
+  : solve_retval_base<FullPivLU<_MatrixType>, Rhs>
+{
+  EIGEN_MAKE_SOLVE_HELPERS(FullPivLU<_MatrixType>,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    /* The decomposition PAQ = LU can be rewritten as A = P^{-1} L U Q^{-1}.
+     * So we proceed as follows:
+     * Step 1: compute c = P * rhs.
+     * Step 2: replace c by the solution x to Lx = c. Exists because L is invertible.
+     * Step 3: replace c by the solution x to Ux = c. May or may not exist.
+     * Step 4: result = Q * c;
+     */
+
+    const Index rows = dec().rows(), cols = dec().cols(),
+              nonzero_pivots = dec().nonzeroPivots();
+    eigen_assert(rhs().rows() == rows);
+    const Index smalldim = (std::min)(rows, cols);
+
+    if(nonzero_pivots == 0)
+    {
+      dst.setZero();
+      return;
+    }
+
+    typename Rhs::PlainObject c(rhs().rows(), rhs().cols());
+
+    // Step 1
+    c = dec().permutationP() * rhs();
+
+    // Step 2
+    dec().matrixLU()
+        .topLeftCorner(smalldim,smalldim)
+        .template triangularView<UnitLower>()
+        .solveInPlace(c.topRows(smalldim));
+    if(rows>cols)
+    {
+      c.bottomRows(rows-cols)
+        -= dec().matrixLU().bottomRows(rows-cols)
+         * c.topRows(cols);
+    }
+
+    // Step 3
+    dec().matrixLU()
+        .topLeftCorner(nonzero_pivots, nonzero_pivots)
+        .template triangularView<Upper>()
+        .solveInPlace(c.topRows(nonzero_pivots));
+
+    // Step 4
+    for(Index i = 0; i < nonzero_pivots; ++i)
+      dst.row(dec().permutationQ().indices().coeff(i)) = c.row(i);
+    for(Index i = nonzero_pivots; i < dec().matrixLU().cols(); ++i)
+      dst.row(dec().permutationQ().indices().coeff(i)).setZero();
+  }
+};
+
+} // end namespace internal
+
+/******* MatrixBase methods *****************************************************************/
+
+/** \lu_module
+  *
+  * \return the full-pivoting LU decomposition of \c *this.
+  *
+  * \sa class FullPivLU
+  */
+template<typename Derived>
+inline const FullPivLU<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::fullPivLu() const
+{
+  return FullPivLU<PlainObject>(eval());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_LU_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/Inverse.h b/vendor/eigen-3.1.91/Eigen/src/LU/Inverse.h
new file mode 100644
index 0000000..a5ae83b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/Inverse.h
@@ -0,0 +1,400 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_INVERSE_H
+#define EIGEN_INVERSE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/**********************************
+*** General case implementation ***
+**********************************/
+
+template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
+struct compute_inverse
+{
+  static inline void run(const MatrixType& matrix, ResultType& result)
+  {
+    result = matrix.partialPivLu().inverse();
+  }
+};
+
+template<typename MatrixType, typename ResultType, int Size = MatrixType::RowsAtCompileTime>
+struct compute_inverse_and_det_with_check { /* nothing! general case not supported. */ };
+
+/****************************
+*** Size 1 implementation ***
+****************************/
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 1>
+{
+  static inline void run(const MatrixType& matrix, ResultType& result)
+  {
+    typedef typename MatrixType::Scalar Scalar;
+    result.coeffRef(0,0) = Scalar(1) / matrix.coeff(0,0);
+  }
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 1>
+{
+  static inline void run(
+    const MatrixType& matrix,
+    const typename MatrixType::RealScalar& absDeterminantThreshold,
+    ResultType& result,
+    typename ResultType::Scalar& determinant,
+    bool& invertible
+  )
+  {
+    using std::abs;
+    determinant = matrix.coeff(0,0);
+    invertible = abs(determinant) > absDeterminantThreshold;
+    if(invertible) result.coeffRef(0,0) = typename ResultType::Scalar(1) / determinant;
+  }
+};
+
+/****************************
+*** Size 2 implementation ***
+****************************/
+
+template<typename MatrixType, typename ResultType>
+inline void compute_inverse_size2_helper(
+    const MatrixType& matrix, const typename ResultType::Scalar& invdet,
+    ResultType& result)
+{
+  result.coeffRef(0,0) = matrix.coeff(1,1) * invdet;
+  result.coeffRef(1,0) = -matrix.coeff(1,0) * invdet;
+  result.coeffRef(0,1) = -matrix.coeff(0,1) * invdet;
+  result.coeffRef(1,1) = matrix.coeff(0,0) * invdet;
+}
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 2>
+{
+  static inline void run(const MatrixType& matrix, ResultType& result)
+  {
+    typedef typename ResultType::Scalar Scalar;
+    const Scalar invdet = typename MatrixType::Scalar(1) / matrix.determinant();
+    compute_inverse_size2_helper(matrix, invdet, result);
+  }
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 2>
+{
+  static inline void run(
+    const MatrixType& matrix,
+    const typename MatrixType::RealScalar& absDeterminantThreshold,
+    ResultType& inverse,
+    typename ResultType::Scalar& determinant,
+    bool& invertible
+  )
+  {
+    using std::abs;
+    typedef typename ResultType::Scalar Scalar;
+    determinant = matrix.determinant();
+    invertible = abs(determinant) > absDeterminantThreshold;
+    if(!invertible) return;
+    const Scalar invdet = Scalar(1) / determinant;
+    compute_inverse_size2_helper(matrix, invdet, inverse);
+  }
+};
+
+/****************************
+*** Size 3 implementation ***
+****************************/
+
+template<typename MatrixType, int i, int j>
+inline typename MatrixType::Scalar cofactor_3x3(const MatrixType& m)
+{
+  enum {
+    i1 = (i+1) % 3,
+    i2 = (i+2) % 3,
+    j1 = (j+1) % 3,
+    j2 = (j+2) % 3
+  };
+  return m.coeff(i1, j1) * m.coeff(i2, j2)
+       - m.coeff(i1, j2) * m.coeff(i2, j1);
+}
+
+template<typename MatrixType, typename ResultType>
+inline void compute_inverse_size3_helper(
+    const MatrixType& matrix,
+    const typename ResultType::Scalar& invdet,
+    const Matrix<typename ResultType::Scalar,3,1>& cofactors_col0,
+    ResultType& result)
+{
+  result.row(0) = cofactors_col0 * invdet;
+  result.coeffRef(1,0) =  cofactor_3x3<MatrixType,0,1>(matrix) * invdet;
+  result.coeffRef(1,1) =  cofactor_3x3<MatrixType,1,1>(matrix) * invdet;
+  result.coeffRef(1,2) =  cofactor_3x3<MatrixType,2,1>(matrix) * invdet;
+  result.coeffRef(2,0) =  cofactor_3x3<MatrixType,0,2>(matrix) * invdet;
+  result.coeffRef(2,1) =  cofactor_3x3<MatrixType,1,2>(matrix) * invdet;
+  result.coeffRef(2,2) =  cofactor_3x3<MatrixType,2,2>(matrix) * invdet;
+}
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 3>
+{
+  static inline void run(const MatrixType& matrix, ResultType& result)
+  {
+    typedef typename ResultType::Scalar Scalar;
+    Matrix<typename MatrixType::Scalar,3,1> cofactors_col0;
+    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);
+    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);
+    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);
+    const Scalar det = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();
+    const Scalar invdet = Scalar(1) / det;
+    compute_inverse_size3_helper(matrix, invdet, cofactors_col0, result);
+  }
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 3>
+{
+  static inline void run(
+    const MatrixType& matrix,
+    const typename MatrixType::RealScalar& absDeterminantThreshold,
+    ResultType& inverse,
+    typename ResultType::Scalar& determinant,
+    bool& invertible
+  )
+  {
+    using std::abs;
+    typedef typename ResultType::Scalar Scalar;
+    Matrix<Scalar,3,1> cofactors_col0;
+    cofactors_col0.coeffRef(0) =  cofactor_3x3<MatrixType,0,0>(matrix);
+    cofactors_col0.coeffRef(1) =  cofactor_3x3<MatrixType,1,0>(matrix);
+    cofactors_col0.coeffRef(2) =  cofactor_3x3<MatrixType,2,0>(matrix);
+    determinant = (cofactors_col0.cwiseProduct(matrix.col(0))).sum();
+    invertible = abs(determinant) > absDeterminantThreshold;
+    if(!invertible) return;
+    const Scalar invdet = Scalar(1) / determinant;
+    compute_inverse_size3_helper(matrix, invdet, cofactors_col0, inverse);
+  }
+};
+
+/****************************
+*** Size 4 implementation ***
+****************************/
+
+template<typename Derived>
+inline const typename Derived::Scalar general_det3_helper
+(const MatrixBase<Derived>& matrix, int i1, int i2, int i3, int j1, int j2, int j3)
+{
+  return matrix.coeff(i1,j1)
+         * (matrix.coeff(i2,j2) * matrix.coeff(i3,j3) - matrix.coeff(i2,j3) * matrix.coeff(i3,j2));
+}
+
+template<typename MatrixType, int i, int j>
+inline typename MatrixType::Scalar cofactor_4x4(const MatrixType& matrix)
+{
+  enum {
+    i1 = (i+1) % 4,
+    i2 = (i+2) % 4,
+    i3 = (i+3) % 4,
+    j1 = (j+1) % 4,
+    j2 = (j+2) % 4,
+    j3 = (j+3) % 4
+  };
+  return general_det3_helper(matrix, i1, i2, i3, j1, j2, j3)
+       + general_det3_helper(matrix, i2, i3, i1, j1, j2, j3)
+       + general_det3_helper(matrix, i3, i1, i2, j1, j2, j3);
+}
+
+template<int Arch, typename Scalar, typename MatrixType, typename ResultType>
+struct compute_inverse_size4
+{
+  static void run(const MatrixType& matrix, ResultType& result)
+  {
+    result.coeffRef(0,0) =  cofactor_4x4<MatrixType,0,0>(matrix);
+    result.coeffRef(1,0) = -cofactor_4x4<MatrixType,0,1>(matrix);
+    result.coeffRef(2,0) =  cofactor_4x4<MatrixType,0,2>(matrix);
+    result.coeffRef(3,0) = -cofactor_4x4<MatrixType,0,3>(matrix);
+    result.coeffRef(0,2) =  cofactor_4x4<MatrixType,2,0>(matrix);
+    result.coeffRef(1,2) = -cofactor_4x4<MatrixType,2,1>(matrix);
+    result.coeffRef(2,2) =  cofactor_4x4<MatrixType,2,2>(matrix);
+    result.coeffRef(3,2) = -cofactor_4x4<MatrixType,2,3>(matrix);
+    result.coeffRef(0,1) = -cofactor_4x4<MatrixType,1,0>(matrix);
+    result.coeffRef(1,1) =  cofactor_4x4<MatrixType,1,1>(matrix);
+    result.coeffRef(2,1) = -cofactor_4x4<MatrixType,1,2>(matrix);
+    result.coeffRef(3,1) =  cofactor_4x4<MatrixType,1,3>(matrix);
+    result.coeffRef(0,3) = -cofactor_4x4<MatrixType,3,0>(matrix);
+    result.coeffRef(1,3) =  cofactor_4x4<MatrixType,3,1>(matrix);
+    result.coeffRef(2,3) = -cofactor_4x4<MatrixType,3,2>(matrix);
+    result.coeffRef(3,3) =  cofactor_4x4<MatrixType,3,3>(matrix);
+    result /= (matrix.col(0).cwiseProduct(result.row(0).transpose())).sum();
+  }
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse<MatrixType, ResultType, 4>
+ : compute_inverse_size4<Architecture::Target, typename MatrixType::Scalar,
+                            MatrixType, ResultType>
+{
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_and_det_with_check<MatrixType, ResultType, 4>
+{
+  static inline void run(
+    const MatrixType& matrix,
+    const typename MatrixType::RealScalar& absDeterminantThreshold,
+    ResultType& inverse,
+    typename ResultType::Scalar& determinant,
+    bool& invertible
+  )
+  {
+    using std::abs;
+    determinant = matrix.determinant();
+    invertible = abs(determinant) > absDeterminantThreshold;
+    if(invertible) compute_inverse<MatrixType, ResultType>::run(matrix, inverse);
+  }
+};
+
+/*************************
+*** MatrixBase methods ***
+*************************/
+
+template<typename MatrixType>
+struct traits<inverse_impl<MatrixType> >
+{
+  typedef typename MatrixType::PlainObject ReturnType;
+};
+
+template<typename MatrixType>
+struct inverse_impl : public ReturnByValue<inverse_impl<MatrixType> >
+{
+  typedef typename MatrixType::Index Index;
+  typedef typename internal::eval<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
+  MatrixTypeNested m_matrix;
+
+  inverse_impl(const MatrixType& matrix)
+    : m_matrix(matrix)
+  {}
+
+  inline Index rows() const { return m_matrix.rows(); }
+  inline Index cols() const { return m_matrix.cols(); }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    const int Size = EIGEN_PLAIN_ENUM_MIN(MatrixType::ColsAtCompileTime,Dest::ColsAtCompileTime);
+    EIGEN_ONLY_USED_FOR_DEBUG(Size);
+    eigen_assert(( (Size<=1) || (Size>4) || (extract_data(m_matrix)!=extract_data(dst)))
+              && "Aliasing problem detected in inverse(), you need to do inverse().eval() here.");
+
+    compute_inverse<MatrixTypeNestedCleaned, Dest>::run(m_matrix, dst);
+  }
+};
+
+} // end namespace internal
+
+/** \lu_module
+  *
+  * \returns the matrix inverse of this matrix.
+  *
+  * For small fixed sizes up to 4x4, this method uses cofactors.
+  * In the general case, this method uses class PartialPivLU.
+  *
+  * \note This matrix must be invertible, otherwise the result is undefined. If you need an
+  * invertibility check, do the following:
+  * \li for fixed sizes up to 4x4, use computeInverseAndDetWithCheck().
+  * \li for the general case, use class FullPivLU.
+  *
+  * Example: \include MatrixBase_inverse.cpp
+  * Output: \verbinclude MatrixBase_inverse.out
+  *
+  * \sa computeInverseAndDetWithCheck()
+  */
+template<typename Derived>
+inline const internal::inverse_impl<Derived> MatrixBase<Derived>::inverse() const
+{
+  EIGEN_STATIC_ASSERT(!NumTraits<Scalar>::IsInteger,THIS_FUNCTION_IS_NOT_FOR_INTEGER_NUMERIC_TYPES)
+  eigen_assert(rows() == cols());
+  return internal::inverse_impl<Derived>(derived());
+}
+
+/** \lu_module
+  *
+  * Computation of matrix inverse and determinant, with invertibility check.
+  *
+  * This is only for fixed-size square matrices of size up to 4x4.
+  *
+  * \param inverse Reference to the matrix in which to store the inverse.
+  * \param determinant Reference to the variable in which to store the inverse.
+  * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
+  * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
+  *                                The matrix will be declared invertible if the absolute value of its
+  *                                determinant is greater than this threshold.
+  *
+  * Example: \include MatrixBase_computeInverseAndDetWithCheck.cpp
+  * Output: \verbinclude MatrixBase_computeInverseAndDetWithCheck.out
+  *
+  * \sa inverse(), computeInverseWithCheck()
+  */
+template<typename Derived>
+template<typename ResultType>
+inline void MatrixBase<Derived>::computeInverseAndDetWithCheck(
+    ResultType& inverse,
+    typename ResultType::Scalar& determinant,
+    bool& invertible,
+    const RealScalar& absDeterminantThreshold
+  ) const
+{
+  // i'd love to put some static assertions there, but SFINAE means that they have no effect...
+  eigen_assert(rows() == cols());
+  // for 2x2, it's worth giving a chance to avoid evaluating.
+  // for larger sizes, evaluating has negligible cost and limits code size.
+  typedef typename internal::conditional<
+    RowsAtCompileTime == 2,
+    typename internal::remove_all<typename internal::nested<Derived, 2>::type>::type,
+    PlainObject
+  >::type MatrixType;
+  internal::compute_inverse_and_det_with_check<MatrixType, ResultType>::run
+    (derived(), absDeterminantThreshold, inverse, determinant, invertible);
+}
+
+/** \lu_module
+  *
+  * Computation of matrix inverse, with invertibility check.
+  *
+  * This is only for fixed-size square matrices of size up to 4x4.
+  *
+  * \param inverse Reference to the matrix in which to store the inverse.
+  * \param invertible Reference to the bool variable in which to store whether the matrix is invertible.
+  * \param absDeterminantThreshold Optional parameter controlling the invertibility check.
+  *                                The matrix will be declared invertible if the absolute value of its
+  *                                determinant is greater than this threshold.
+  *
+  * Example: \include MatrixBase_computeInverseWithCheck.cpp
+  * Output: \verbinclude MatrixBase_computeInverseWithCheck.out
+  *
+  * \sa inverse(), computeInverseAndDetWithCheck()
+  */
+template<typename Derived>
+template<typename ResultType>
+inline void MatrixBase<Derived>::computeInverseWithCheck(
+    ResultType& inverse,
+    bool& invertible,
+    const RealScalar& absDeterminantThreshold
+  ) const
+{
+  RealScalar determinant;
+  // i'd love to put some static assertions there, but SFINAE means that they have no effect...
+  eigen_assert(rows() == cols());
+  computeInverseAndDetWithCheck(inverse,determinant,invertible,absDeterminantThreshold);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_INVERSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU.h b/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU.h
new file mode 100644
index 0000000..740ee69
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU.h
@@ -0,0 +1,501 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2006-2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PARTIALLU_H
+#define EIGEN_PARTIALLU_H
+
+namespace Eigen { 
+
+/** \ingroup LU_Module
+  *
+  * \class PartialPivLU
+  *
+  * \brief LU decomposition of a matrix with partial pivoting, and related features
+  *
+  * \param MatrixType the type of the matrix of which we are computing the LU decomposition
+  *
+  * This class represents a LU decomposition of a \b square \b invertible matrix, with partial pivoting: the matrix A
+  * is decomposed as A = PLU where L is unit-lower-triangular, U is upper-triangular, and P
+  * is a permutation matrix.
+  *
+  * Typically, partial pivoting LU decomposition is only considered numerically stable for square invertible
+  * matrices. Thus LAPACK's dgesv and dgesvx require the matrix to be square and invertible. The present class
+  * does the same. It will assert that the matrix is square, but it won't (actually it can't) check that the
+  * matrix is invertible: it is your task to check that you only use this decomposition on invertible matrices.
+  *
+  * The guaranteed safe alternative, working for all matrices, is the full pivoting LU decomposition, provided
+  * by class FullPivLU.
+  *
+  * This is \b not a rank-revealing LU decomposition. Many features are intentionally absent from this class,
+  * such as rank computation. If you need these features, use class FullPivLU.
+  *
+  * This LU decomposition is suitable to invert invertible matrices. It is what MatrixBase::inverse() uses
+  * in the general case.
+  * On the other hand, it is \b not suitable to determine whether a given matrix is invertible.
+  *
+  * The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP().
+  *
+  * \sa MatrixBase::partialPivLu(), MatrixBase::determinant(), MatrixBase::inverse(), MatrixBase::computeInverse(), class FullPivLU
+  */
+template<typename _MatrixType> class PartialPivLU
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef typename internal::traits<MatrixType>::StorageKind StorageKind;
+    typedef typename MatrixType::Index Index;
+    typedef PermutationMatrix<RowsAtCompileTime, MaxRowsAtCompileTime> PermutationType;
+    typedef Transpositions<RowsAtCompileTime, MaxRowsAtCompileTime> TranspositionType;
+
+
+    /**
+    * \brief Default Constructor.
+    *
+    * The default constructor is useful in cases in which the user intends to
+    * perform decompositions via PartialPivLU::compute(const MatrixType&).
+    */
+    PartialPivLU();
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa PartialPivLU()
+      */
+    PartialPivLU(Index size);
+
+    /** Constructor.
+      *
+      * \param matrix the matrix of which to compute the LU decomposition.
+      *
+      * \warning The matrix should have full rank (e.g. if it's square, it should be invertible).
+      * If you need to deal with non-full rank, use class FullPivLU instead.
+      */
+    PartialPivLU(const MatrixType& matrix);
+
+    PartialPivLU& compute(const MatrixType& matrix);
+
+    /** \returns the LU decomposition matrix: the upper-triangular part is U, the
+      * unit-lower-triangular part is L (at least for square matrices; in the non-square
+      * case, special care is needed, see the documentation of class FullPivLU).
+      *
+      * \sa matrixL(), matrixU()
+      */
+    inline const MatrixType& matrixLU() const
+    {
+      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+      return m_lu;
+    }
+
+    /** \returns the permutation matrix P.
+      */
+    inline const PermutationType& permutationP() const
+    {
+      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+      return m_p;
+    }
+
+    /** This method returns the solution x to the equation Ax=b, where A is the matrix of which
+      * *this is the LU decomposition.
+      *
+      * \param b the right-hand-side of the equation to solve. Can be a vector or a matrix,
+      *          the only requirement in order for the equation to make sense is that
+      *          b.rows()==A.rows(), where A is the matrix of which *this is the LU decomposition.
+      *
+      * \returns the solution.
+      *
+      * Example: \include PartialPivLU_solve.cpp
+      * Output: \verbinclude PartialPivLU_solve.out
+      *
+      * Since this PartialPivLU class assumes anyway that the matrix A is invertible, the solution
+      * theoretically exists and is unique regardless of b.
+      *
+      * \sa TriangularView::solve(), inverse(), computeInverse()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<PartialPivLU, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+      return internal::solve_retval<PartialPivLU, Rhs>(*this, b.derived());
+    }
+
+    /** \returns the inverse of the matrix of which *this is the LU decomposition.
+      *
+      * \warning The matrix being decomposed here is assumed to be invertible. If you need to check for
+      *          invertibility, use class FullPivLU instead.
+      *
+      * \sa MatrixBase::inverse(), LU::inverse()
+      */
+    inline const internal::solve_retval<PartialPivLU,typename MatrixType::IdentityReturnType> inverse() const
+    {
+      eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+      return internal::solve_retval<PartialPivLU,typename MatrixType::IdentityReturnType>
+               (*this, MatrixType::Identity(m_lu.rows(), m_lu.cols()));
+    }
+
+    /** \returns the determinant of the matrix of which
+      * *this is the LU decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the LU decomposition has already been computed.
+      *
+      * \note For fixed-size matrices of size up to 4, MatrixBase::determinant() offers
+      *       optimized paths.
+      *
+      * \warning a determinant can be very big or small, so for matrices
+      * of large enough dimension, there is a risk of overflow/underflow.
+      *
+      * \sa MatrixBase::determinant()
+      */
+    typename internal::traits<MatrixType>::Scalar determinant() const;
+
+    MatrixType reconstructedMatrix() const;
+
+    inline Index rows() const { return m_lu.rows(); }
+    inline Index cols() const { return m_lu.cols(); }
+
+  protected:
+    MatrixType m_lu;
+    PermutationType m_p;
+    TranspositionType m_rowsTranspositions;
+    Index m_det_p;
+    bool m_isInitialized;
+};
+
+template<typename MatrixType>
+PartialPivLU<MatrixType>::PartialPivLU()
+  : m_lu(),
+    m_p(),
+    m_rowsTranspositions(),
+    m_det_p(0),
+    m_isInitialized(false)
+{
+}
+
+template<typename MatrixType>
+PartialPivLU<MatrixType>::PartialPivLU(Index size)
+  : m_lu(size, size),
+    m_p(size),
+    m_rowsTranspositions(size),
+    m_det_p(0),
+    m_isInitialized(false)
+{
+}
+
+template<typename MatrixType>
+PartialPivLU<MatrixType>::PartialPivLU(const MatrixType& matrix)
+  : m_lu(matrix.rows(), matrix.rows()),
+    m_p(matrix.rows()),
+    m_rowsTranspositions(matrix.rows()),
+    m_det_p(0),
+    m_isInitialized(false)
+{
+  compute(matrix);
+}
+
+namespace internal {
+
+/** \internal This is the blocked version of fullpivlu_unblocked() */
+template<typename Scalar, int StorageOrder, typename PivIndex>
+struct partial_lu_impl
+{
+  // FIXME add a stride to Map, so that the following mapping becomes easier,
+  // another option would be to create an expression being able to automatically
+  // warp any Map, Matrix, and Block expressions as a unique type, but since that's exactly
+  // a Map + stride, why not adding a stride to Map, and convenient ctors from a Matrix,
+  // and Block.
+  typedef Map<Matrix<Scalar, Dynamic, Dynamic, StorageOrder> > MapLU;
+  typedef Block<MapLU, Dynamic, Dynamic> MatrixType;
+  typedef Block<MatrixType,Dynamic,Dynamic> BlockType;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename MatrixType::Index Index;
+
+  /** \internal performs the LU decomposition in-place of the matrix \a lu
+    * using an unblocked algorithm.
+    *
+    * In addition, this function returns the row transpositions in the
+    * vector \a row_transpositions which must have a size equal to the number
+    * of columns of the matrix \a lu, and an integer \a nb_transpositions
+    * which returns the actual number of transpositions.
+    *
+    * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
+    */
+  static Index unblocked_lu(MatrixType& lu, PivIndex* row_transpositions, PivIndex& nb_transpositions)
+  {
+    const Index rows = lu.rows();
+    const Index cols = lu.cols();
+    const Index size = (std::min)(rows,cols);
+    nb_transpositions = 0;
+    Index first_zero_pivot = -1;
+    for(Index k = 0; k < size; ++k)
+    {
+      Index rrows = rows-k-1;
+      Index rcols = cols-k-1;
+        
+      Index row_of_biggest_in_col;
+      RealScalar biggest_in_corner
+        = lu.col(k).tail(rows-k).cwiseAbs().maxCoeff(&row_of_biggest_in_col);
+      row_of_biggest_in_col += k;
+
+      row_transpositions[k] = PivIndex(row_of_biggest_in_col);
+
+      if(biggest_in_corner != RealScalar(0))
+      {
+        if(k != row_of_biggest_in_col)
+        {
+          lu.row(k).swap(lu.row(row_of_biggest_in_col));
+          ++nb_transpositions;
+        }
+
+        // FIXME shall we introduce a safe quotient expression in cas 1/lu.coeff(k,k)
+        // overflow but not the actual quotient?
+        lu.col(k).tail(rrows) /= lu.coeff(k,k);
+      }
+      else if(first_zero_pivot==-1)
+      {
+        // the pivot is exactly zero, we record the index of the first pivot which is exactly 0,
+        // and continue the factorization such we still have A = PLU
+        first_zero_pivot = k;
+      }
+
+      if(k<rows-1)
+        lu.bottomRightCorner(rrows,rcols).noalias() -= lu.col(k).tail(rrows) * lu.row(k).tail(rcols);
+    }
+    return first_zero_pivot;
+  }
+
+  /** \internal performs the LU decomposition in-place of the matrix represented
+    * by the variables \a rows, \a cols, \a lu_data, and \a lu_stride using a
+    * recursive, blocked algorithm.
+    *
+    * In addition, this function returns the row transpositions in the
+    * vector \a row_transpositions which must have a size equal to the number
+    * of columns of the matrix \a lu, and an integer \a nb_transpositions
+    * which returns the actual number of transpositions.
+    *
+    * \returns The index of the first pivot which is exactly zero if any, or a negative number otherwise.
+    *
+    * \note This very low level interface using pointers, etc. is to:
+    *   1 - reduce the number of instanciations to the strict minimum
+    *   2 - avoid infinite recursion of the instanciations with Block<Block<Block<...> > >
+    */
+  static Index blocked_lu(Index rows, Index cols, Scalar* lu_data, Index luStride, PivIndex* row_transpositions, PivIndex& nb_transpositions, Index maxBlockSize=256)
+  {
+    MapLU lu1(lu_data,StorageOrder==RowMajor?rows:luStride,StorageOrder==RowMajor?luStride:cols);
+    MatrixType lu(lu1,0,0,rows,cols);
+
+    const Index size = (std::min)(rows,cols);
+
+    // if the matrix is too small, no blocking:
+    if(size<=16)
+    {
+      return unblocked_lu(lu, row_transpositions, nb_transpositions);
+    }
+
+    // automatically adjust the number of subdivisions to the size
+    // of the matrix so that there is enough sub blocks:
+    Index blockSize;
+    {
+      blockSize = size/8;
+      blockSize = (blockSize/16)*16;
+      blockSize = (std::min)((std::max)(blockSize,Index(8)), maxBlockSize);
+    }
+
+    nb_transpositions = 0;
+    Index first_zero_pivot = -1;
+    for(Index k = 0; k < size; k+=blockSize)
+    {
+      Index bs = (std::min)(size-k,blockSize); // actual size of the block
+      Index trows = rows - k - bs; // trailing rows
+      Index tsize = size - k - bs; // trailing size
+
+      // partition the matrix:
+      //                          A00 | A01 | A02
+      // lu  = A_0 | A_1 | A_2 =  A10 | A11 | A12
+      //                          A20 | A21 | A22
+      BlockType A_0(lu,0,0,rows,k);
+      BlockType A_2(lu,0,k+bs,rows,tsize);
+      BlockType A11(lu,k,k,bs,bs);
+      BlockType A12(lu,k,k+bs,bs,tsize);
+      BlockType A21(lu,k+bs,k,trows,bs);
+      BlockType A22(lu,k+bs,k+bs,trows,tsize);
+
+      PivIndex nb_transpositions_in_panel;
+      // recursively call the blocked LU algorithm on [A11^T A21^T]^T
+      // with a very small blocking size:
+      Index ret = blocked_lu(trows+bs, bs, &lu.coeffRef(k,k), luStride,
+                   row_transpositions+k, nb_transpositions_in_panel, 16);
+      if(ret>=0 && first_zero_pivot==-1)
+        first_zero_pivot = k+ret;
+
+      nb_transpositions += nb_transpositions_in_panel;
+      // update permutations and apply them to A_0
+      for(Index i=k; i<k+bs; ++i)
+      {
+        Index piv = (row_transpositions[i] += k);
+        A_0.row(i).swap(A_0.row(piv));
+      }
+
+      if(trows)
+      {
+        // apply permutations to A_2
+        for(Index i=k;i<k+bs; ++i)
+          A_2.row(i).swap(A_2.row(row_transpositions[i]));
+
+        // A12 = A11^-1 A12
+        A11.template triangularView<UnitLower>().solveInPlace(A12);
+
+        A22.noalias() -= A21 * A12;
+      }
+    }
+    return first_zero_pivot;
+  }
+};
+
+/** \internal performs the LU decomposition with partial pivoting in-place.
+  */
+template<typename MatrixType, typename TranspositionType>
+void partial_lu_inplace(MatrixType& lu, TranspositionType& row_transpositions, typename TranspositionType::Index& nb_transpositions)
+{
+  eigen_assert(lu.cols() == row_transpositions.size());
+  eigen_assert((&row_transpositions.coeffRef(1)-&row_transpositions.coeffRef(0)) == 1);
+
+  partial_lu_impl
+    <typename MatrixType::Scalar, MatrixType::Flags&RowMajorBit?RowMajor:ColMajor, typename TranspositionType::Index>
+    ::blocked_lu(lu.rows(), lu.cols(), &lu.coeffRef(0,0), lu.outerStride(), &row_transpositions.coeffRef(0), nb_transpositions);
+}
+
+} // end namespace internal
+
+template<typename MatrixType>
+PartialPivLU<MatrixType>& PartialPivLU<MatrixType>::compute(const MatrixType& matrix)
+{
+  // the row permutation is stored as int indices, so just to be sure:
+  eigen_assert(matrix.rows()<NumTraits<int>::highest());
+  
+  m_lu = matrix;
+
+  eigen_assert(matrix.rows() == matrix.cols() && "PartialPivLU is only for square (and moreover invertible) matrices");
+  const Index size = matrix.rows();
+
+  m_rowsTranspositions.resize(size);
+
+  typename TranspositionType::Index nb_transpositions;
+  internal::partial_lu_inplace(m_lu, m_rowsTranspositions, nb_transpositions);
+  m_det_p = (nb_transpositions%2) ? -1 : 1;
+
+  m_p = m_rowsTranspositions;
+
+  m_isInitialized = true;
+  return *this;
+}
+
+template<typename MatrixType>
+typename internal::traits<MatrixType>::Scalar PartialPivLU<MatrixType>::determinant() const
+{
+  eigen_assert(m_isInitialized && "PartialPivLU is not initialized.");
+  return Scalar(m_det_p) * m_lu.diagonal().prod();
+}
+
+/** \returns the matrix represented by the decomposition,
+ * i.e., it returns the product: P^{-1} L U.
+ * This function is provided for debug purpose. */
+template<typename MatrixType>
+MatrixType PartialPivLU<MatrixType>::reconstructedMatrix() const
+{
+  eigen_assert(m_isInitialized && "LU is not initialized.");
+  // LU
+  MatrixType res = m_lu.template triangularView<UnitLower>().toDenseMatrix()
+                 * m_lu.template triangularView<Upper>();
+
+  // P^{-1}(LU)
+  res = m_p.inverse() * res;
+
+  return res;
+}
+
+/***** Implementation of solve() *****************************************************/
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<PartialPivLU<_MatrixType>, Rhs>
+  : solve_retval_base<PartialPivLU<_MatrixType>, Rhs>
+{
+  EIGEN_MAKE_SOLVE_HELPERS(PartialPivLU<_MatrixType>,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    /* The decomposition PA = LU can be rewritten as A = P^{-1} L U.
+    * So we proceed as follows:
+    * Step 1: compute c = Pb.
+    * Step 2: replace c by the solution x to Lx = c.
+    * Step 3: replace c by the solution x to Ux = c.
+    */
+
+    eigen_assert(rhs().rows() == dec().matrixLU().rows());
+
+    // Step 1
+    dst = dec().permutationP() * rhs();
+
+    // Step 2
+    dec().matrixLU().template triangularView<UnitLower>().solveInPlace(dst);
+
+    // Step 3
+    dec().matrixLU().template triangularView<Upper>().solveInPlace(dst);
+  }
+};
+
+} // end namespace internal
+
+/******** MatrixBase methods *******/
+
+/** \lu_module
+  *
+  * \return the partial-pivoting LU decomposition of \c *this.
+  *
+  * \sa class PartialPivLU
+  */
+template<typename Derived>
+inline const PartialPivLU<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::partialPivLu() const
+{
+  return PartialPivLU<PlainObject>(eval());
+}
+
+#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
+/** \lu_module
+  *
+  * Synonym of partialPivLu().
+  *
+  * \return the partial-pivoting LU decomposition of \c *this.
+  *
+  * \sa class PartialPivLU
+  */
+template<typename Derived>
+inline const PartialPivLU<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::lu() const
+{
+  return PartialPivLU<PlainObject>(eval());
+}
+#endif
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARTIALLU_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU_MKL.h b/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU_MKL.h
new file mode 100644
index 0000000..9035953
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/PartialPivLU_MKL.h
@@ -0,0 +1,85 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *     LU decomposition with partial pivoting based on LAPACKE_?getrf function.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_PARTIALLU_LAPACK_H
+#define EIGEN_PARTIALLU_LAPACK_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_LU_PARTPIV(EIGTYPE, MKLTYPE, MKLPREFIX) \
+template<int StorageOrder> \
+struct partial_lu_impl<EIGTYPE, StorageOrder, lapack_int> \
+{ \
+  /* \internal performs the LU decomposition in-place of the matrix represented */ \
+  static lapack_int blocked_lu(lapack_int rows, lapack_int cols, EIGTYPE* lu_data, lapack_int luStride, lapack_int* row_transpositions, lapack_int& nb_transpositions, lapack_int maxBlockSize=256) \
+  { \
+    EIGEN_UNUSED_VARIABLE(maxBlockSize);\
+    lapack_int matrix_order, first_zero_pivot; \
+    lapack_int m, n, lda, *ipiv, info; \
+    EIGTYPE* a; \
+/* Set up parameters for ?getrf */ \
+    matrix_order = StorageOrder==RowMajor ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \
+    lda = luStride; \
+    a = lu_data; \
+    ipiv = row_transpositions; \
+    m = rows; \
+    n = cols; \
+    nb_transpositions = 0; \
+\
+    info = LAPACKE_##MKLPREFIX##getrf( matrix_order, m, n, (MKLTYPE*)a, lda, ipiv ); \
+\
+    for(int i=0;i<m;i++) { ipiv[i]--; if (ipiv[i]!=i) nb_transpositions++; } \
+\
+    eigen_assert(info >= 0); \
+/* something should be done with nb_transpositions */ \
+\
+    first_zero_pivot = info; \
+    return first_zero_pivot; \
+  } \
+};
+
+EIGEN_MKL_LU_PARTPIV(double, double, d)
+EIGEN_MKL_LU_PARTPIV(float, float, s)
+EIGEN_MKL_LU_PARTPIV(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_LU_PARTPIV(scomplex, MKL_Complex8, c)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARTIALLU_LAPACK_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/arch/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/LU/arch/CMakeLists.txt
new file mode 100644
index 0000000..f6b7ed9
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/arch/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_LU_arch_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_LU_arch_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/LU/arch COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/LU/arch/Inverse_SSE.h b/vendor/eigen-3.1.91/Eigen/src/LU/arch/Inverse_SSE.h
new file mode 100644
index 0000000..60b7a23
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/LU/arch/Inverse_SSE.h
@@ -0,0 +1,329 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2001 Intel Corporation
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// The SSE code for the 4x4 float and double matrix inverse in this file
+// comes from the following Intel's library:
+// http://software.intel.com/en-us/articles/optimized-matrix-library-for-use-with-the-intel-pentiumr-4-processors-sse2-instructions/
+//
+// Here is the respective copyright and license statement:
+//
+//   Copyright (c) 2001 Intel Corporation.
+//
+// Permition is granted to use, copy, distribute and prepare derivative works
+// of this library for any purpose and without fee, provided, that the above
+// copyright notice and this statement appear in all copies.
+// Intel makes no representations about the suitability of this software for
+// any purpose, and specifically disclaims all warranties.
+// See LEGAL.TXT for all the legal information.
+
+#ifndef EIGEN_INVERSE_SSE_H
+#define EIGEN_INVERSE_SSE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_size4<Architecture::SSE, float, MatrixType, ResultType>
+{
+  enum {
+    MatrixAlignment     = bool(MatrixType::Flags&AlignedBit),
+    ResultAlignment     = bool(ResultType::Flags&AlignedBit),
+    StorageOrdersMatch  = (MatrixType::Flags&RowMajorBit) == (ResultType::Flags&RowMajorBit)
+  };
+  
+  static void run(const MatrixType& matrix, ResultType& result)
+  {
+    EIGEN_ALIGN16 const unsigned int _Sign_PNNP[4] = { 0x00000000, 0x80000000, 0x80000000, 0x00000000 };
+
+    // Load the full matrix into registers
+    __m128 _L1 = matrix.template packet<MatrixAlignment>( 0);
+    __m128 _L2 = matrix.template packet<MatrixAlignment>( 4);
+    __m128 _L3 = matrix.template packet<MatrixAlignment>( 8);
+    __m128 _L4 = matrix.template packet<MatrixAlignment>(12);
+
+    // The inverse is calculated using "Divide and Conquer" technique. The
+    // original matrix is divide into four 2x2 sub-matrices. Since each
+    // register holds four matrix element, the smaller matrices are
+    // represented as a registers. Hence we get a better locality of the
+    // calculations.
+
+    __m128 A, B, C, D; // the four sub-matrices
+    if(!StorageOrdersMatch)
+    {
+      A = _mm_unpacklo_ps(_L1, _L2);
+      B = _mm_unpacklo_ps(_L3, _L4);
+      C = _mm_unpackhi_ps(_L1, _L2);
+      D = _mm_unpackhi_ps(_L3, _L4);
+    }
+    else
+    {
+      A = _mm_movelh_ps(_L1, _L2);
+      B = _mm_movehl_ps(_L2, _L1);
+      C = _mm_movelh_ps(_L3, _L4);
+      D = _mm_movehl_ps(_L4, _L3);
+    }
+
+    __m128 iA, iB, iC, iD,                 // partial inverse of the sub-matrices
+            DC, AB;
+    __m128 dA, dB, dC, dD;                 // determinant of the sub-matrices
+    __m128 det, d, d1, d2;
+    __m128 rd;                             // reciprocal of the determinant
+
+    //  AB = A# * B
+    AB = _mm_mul_ps(_mm_shuffle_ps(A,A,0x0F), B);
+    AB = _mm_sub_ps(AB,_mm_mul_ps(_mm_shuffle_ps(A,A,0xA5), _mm_shuffle_ps(B,B,0x4E)));
+    //  DC = D# * C
+    DC = _mm_mul_ps(_mm_shuffle_ps(D,D,0x0F), C);
+    DC = _mm_sub_ps(DC,_mm_mul_ps(_mm_shuffle_ps(D,D,0xA5), _mm_shuffle_ps(C,C,0x4E)));
+
+    //  dA = |A|
+    dA = _mm_mul_ps(_mm_shuffle_ps(A, A, 0x5F),A);
+    dA = _mm_sub_ss(dA, _mm_movehl_ps(dA,dA));
+    //  dB = |B|
+    dB = _mm_mul_ps(_mm_shuffle_ps(B, B, 0x5F),B);
+    dB = _mm_sub_ss(dB, _mm_movehl_ps(dB,dB));
+
+    //  dC = |C|
+    dC = _mm_mul_ps(_mm_shuffle_ps(C, C, 0x5F),C);
+    dC = _mm_sub_ss(dC, _mm_movehl_ps(dC,dC));
+    //  dD = |D|
+    dD = _mm_mul_ps(_mm_shuffle_ps(D, D, 0x5F),D);
+    dD = _mm_sub_ss(dD, _mm_movehl_ps(dD,dD));
+
+    //  d = trace(AB*DC) = trace(A#*B*D#*C)
+    d = _mm_mul_ps(_mm_shuffle_ps(DC,DC,0xD8),AB);
+
+    //  iD = C*A#*B
+    iD = _mm_mul_ps(_mm_shuffle_ps(C,C,0xA0), _mm_movelh_ps(AB,AB));
+    iD = _mm_add_ps(iD,_mm_mul_ps(_mm_shuffle_ps(C,C,0xF5), _mm_movehl_ps(AB,AB)));
+    //  iA = B*D#*C
+    iA = _mm_mul_ps(_mm_shuffle_ps(B,B,0xA0), _mm_movelh_ps(DC,DC));
+    iA = _mm_add_ps(iA,_mm_mul_ps(_mm_shuffle_ps(B,B,0xF5), _mm_movehl_ps(DC,DC)));
+
+    //  d = trace(AB*DC) = trace(A#*B*D#*C) [continue]
+    d  = _mm_add_ps(d, _mm_movehl_ps(d, d));
+    d  = _mm_add_ss(d, _mm_shuffle_ps(d, d, 1));
+    d1 = _mm_mul_ss(dA,dD);
+    d2 = _mm_mul_ss(dB,dC);
+
+    //  iD = D*|A| - C*A#*B
+    iD = _mm_sub_ps(_mm_mul_ps(D,_mm_shuffle_ps(dA,dA,0)), iD);
+
+    //  iA = A*|D| - B*D#*C;
+    iA = _mm_sub_ps(_mm_mul_ps(A,_mm_shuffle_ps(dD,dD,0)), iA);
+
+    //  det = |A|*|D| + |B|*|C| - trace(A#*B*D#*C)
+    det = _mm_sub_ss(_mm_add_ss(d1,d2),d);
+    rd  = _mm_div_ss(_mm_set_ss(1.0f), det);
+
+//     #ifdef ZERO_SINGULAR
+//         rd = _mm_and_ps(_mm_cmpneq_ss(det,_mm_setzero_ps()), rd);
+//     #endif
+
+    //  iB = D * (A#B)# = D*B#*A
+    iB = _mm_mul_ps(D, _mm_shuffle_ps(AB,AB,0x33));
+    iB = _mm_sub_ps(iB, _mm_mul_ps(_mm_shuffle_ps(D,D,0xB1), _mm_shuffle_ps(AB,AB,0x66)));
+    //  iC = A * (D#C)# = A*C#*D
+    iC = _mm_mul_ps(A, _mm_shuffle_ps(DC,DC,0x33));
+    iC = _mm_sub_ps(iC, _mm_mul_ps(_mm_shuffle_ps(A,A,0xB1), _mm_shuffle_ps(DC,DC,0x66)));
+
+    rd = _mm_shuffle_ps(rd,rd,0);
+    rd = _mm_xor_ps(rd, _mm_load_ps((float*)_Sign_PNNP));
+
+    //  iB = C*|B| - D*B#*A
+    iB = _mm_sub_ps(_mm_mul_ps(C,_mm_shuffle_ps(dB,dB,0)), iB);
+
+    //  iC = B*|C| - A*C#*D;
+    iC = _mm_sub_ps(_mm_mul_ps(B,_mm_shuffle_ps(dC,dC,0)), iC);
+
+    //  iX = iX / det
+    iA = _mm_mul_ps(rd,iA);
+    iB = _mm_mul_ps(rd,iB);
+    iC = _mm_mul_ps(rd,iC);
+    iD = _mm_mul_ps(rd,iD);
+
+    result.template writePacket<ResultAlignment>( 0, _mm_shuffle_ps(iA,iB,0x77));
+    result.template writePacket<ResultAlignment>( 4, _mm_shuffle_ps(iA,iB,0x22));
+    result.template writePacket<ResultAlignment>( 8, _mm_shuffle_ps(iC,iD,0x77));
+    result.template writePacket<ResultAlignment>(12, _mm_shuffle_ps(iC,iD,0x22));
+  }
+
+};
+
+template<typename MatrixType, typename ResultType>
+struct compute_inverse_size4<Architecture::SSE, double, MatrixType, ResultType>
+{
+  enum {
+    MatrixAlignment = bool(MatrixType::Flags&AlignedBit),
+    ResultAlignment = bool(ResultType::Flags&AlignedBit),
+    StorageOrdersMatch  = (MatrixType::Flags&RowMajorBit) == (ResultType::Flags&RowMajorBit)
+  };
+  static void run(const MatrixType& matrix, ResultType& result)
+  {
+    const __m128d _Sign_NP = _mm_castsi128_pd(_mm_set_epi32(0x0,0x0,0x80000000,0x0));
+    const __m128d _Sign_PN = _mm_castsi128_pd(_mm_set_epi32(0x80000000,0x0,0x0,0x0));
+
+    // The inverse is calculated using "Divide and Conquer" technique. The
+    // original matrix is divide into four 2x2 sub-matrices. Since each
+    // register of the matrix holds two element, the smaller matrices are
+    // consisted of two registers. Hence we get a better locality of the
+    // calculations.
+
+    // the four sub-matrices
+    __m128d A1, A2, B1, B2, C1, C2, D1, D2;
+    
+    if(StorageOrdersMatch)
+    {
+      A1 = matrix.template packet<MatrixAlignment>( 0); B1 = matrix.template packet<MatrixAlignment>( 2);
+      A2 = matrix.template packet<MatrixAlignment>( 4); B2 = matrix.template packet<MatrixAlignment>( 6);
+      C1 = matrix.template packet<MatrixAlignment>( 8); D1 = matrix.template packet<MatrixAlignment>(10);
+      C2 = matrix.template packet<MatrixAlignment>(12); D2 = matrix.template packet<MatrixAlignment>(14);
+    }
+    else
+    {
+      __m128d tmp;
+      A1 = matrix.template packet<MatrixAlignment>( 0); C1 = matrix.template packet<MatrixAlignment>( 2);
+      A2 = matrix.template packet<MatrixAlignment>( 4); C2 = matrix.template packet<MatrixAlignment>( 6);
+      tmp = A1;
+      A1 = _mm_unpacklo_pd(A1,A2);
+      A2 = _mm_unpackhi_pd(tmp,A2);
+      tmp = C1;
+      C1 = _mm_unpacklo_pd(C1,C2);
+      C2 = _mm_unpackhi_pd(tmp,C2);
+      
+      B1 = matrix.template packet<MatrixAlignment>( 8); D1 = matrix.template packet<MatrixAlignment>(10);
+      B2 = matrix.template packet<MatrixAlignment>(12); D2 = matrix.template packet<MatrixAlignment>(14);
+      tmp = B1;
+      B1 = _mm_unpacklo_pd(B1,B2);
+      B2 = _mm_unpackhi_pd(tmp,B2);
+      tmp = D1;
+      D1 = _mm_unpacklo_pd(D1,D2);
+      D2 = _mm_unpackhi_pd(tmp,D2);
+    }
+    
+    __m128d iA1, iA2, iB1, iB2, iC1, iC2, iD1, iD2,     // partial invese of the sub-matrices
+            DC1, DC2, AB1, AB2;
+    __m128d dA, dB, dC, dD;     // determinant of the sub-matrices
+    __m128d det, d1, d2, rd;
+
+    //  dA = |A|
+    dA = _mm_shuffle_pd(A2, A2, 1);
+    dA = _mm_mul_pd(A1, dA);
+    dA = _mm_sub_sd(dA, _mm_shuffle_pd(dA,dA,3));
+    //  dB = |B|
+    dB = _mm_shuffle_pd(B2, B2, 1);
+    dB = _mm_mul_pd(B1, dB);
+    dB = _mm_sub_sd(dB, _mm_shuffle_pd(dB,dB,3));
+
+    //  AB = A# * B
+    AB1 = _mm_mul_pd(B1, _mm_shuffle_pd(A2,A2,3));
+    AB2 = _mm_mul_pd(B2, _mm_shuffle_pd(A1,A1,0));
+    AB1 = _mm_sub_pd(AB1, _mm_mul_pd(B2, _mm_shuffle_pd(A1,A1,3)));
+    AB2 = _mm_sub_pd(AB2, _mm_mul_pd(B1, _mm_shuffle_pd(A2,A2,0)));
+
+    //  dC = |C|
+    dC = _mm_shuffle_pd(C2, C2, 1);
+    dC = _mm_mul_pd(C1, dC);
+    dC = _mm_sub_sd(dC, _mm_shuffle_pd(dC,dC,3));
+    //  dD = |D|
+    dD = _mm_shuffle_pd(D2, D2, 1);
+    dD = _mm_mul_pd(D1, dD);
+    dD = _mm_sub_sd(dD, _mm_shuffle_pd(dD,dD,3));
+
+    //  DC = D# * C
+    DC1 = _mm_mul_pd(C1, _mm_shuffle_pd(D2,D2,3));
+    DC2 = _mm_mul_pd(C2, _mm_shuffle_pd(D1,D1,0));
+    DC1 = _mm_sub_pd(DC1, _mm_mul_pd(C2, _mm_shuffle_pd(D1,D1,3)));
+    DC2 = _mm_sub_pd(DC2, _mm_mul_pd(C1, _mm_shuffle_pd(D2,D2,0)));
+
+    //  rd = trace(AB*DC) = trace(A#*B*D#*C)
+    d1 = _mm_mul_pd(AB1, _mm_shuffle_pd(DC1, DC2, 0));
+    d2 = _mm_mul_pd(AB2, _mm_shuffle_pd(DC1, DC2, 3));
+    rd = _mm_add_pd(d1, d2);
+    rd = _mm_add_sd(rd, _mm_shuffle_pd(rd, rd,3));
+
+    //  iD = C*A#*B
+    iD1 = _mm_mul_pd(AB1, _mm_shuffle_pd(C1,C1,0));
+    iD2 = _mm_mul_pd(AB1, _mm_shuffle_pd(C2,C2,0));
+    iD1 = _mm_add_pd(iD1, _mm_mul_pd(AB2, _mm_shuffle_pd(C1,C1,3)));
+    iD2 = _mm_add_pd(iD2, _mm_mul_pd(AB2, _mm_shuffle_pd(C2,C2,3)));
+
+    //  iA = B*D#*C
+    iA1 = _mm_mul_pd(DC1, _mm_shuffle_pd(B1,B1,0));
+    iA2 = _mm_mul_pd(DC1, _mm_shuffle_pd(B2,B2,0));
+    iA1 = _mm_add_pd(iA1, _mm_mul_pd(DC2, _mm_shuffle_pd(B1,B1,3)));
+    iA2 = _mm_add_pd(iA2, _mm_mul_pd(DC2, _mm_shuffle_pd(B2,B2,3)));
+
+    //  iD = D*|A| - C*A#*B
+    dA = _mm_shuffle_pd(dA,dA,0);
+    iD1 = _mm_sub_pd(_mm_mul_pd(D1, dA), iD1);
+    iD2 = _mm_sub_pd(_mm_mul_pd(D2, dA), iD2);
+
+    //  iA = A*|D| - B*D#*C;
+    dD = _mm_shuffle_pd(dD,dD,0);
+    iA1 = _mm_sub_pd(_mm_mul_pd(A1, dD), iA1);
+    iA2 = _mm_sub_pd(_mm_mul_pd(A2, dD), iA2);
+
+    d1 = _mm_mul_sd(dA, dD);
+    d2 = _mm_mul_sd(dB, dC);
+
+    //  iB = D * (A#B)# = D*B#*A
+    iB1 = _mm_mul_pd(D1, _mm_shuffle_pd(AB2,AB1,1));
+    iB2 = _mm_mul_pd(D2, _mm_shuffle_pd(AB2,AB1,1));
+    iB1 = _mm_sub_pd(iB1, _mm_mul_pd(_mm_shuffle_pd(D1,D1,1), _mm_shuffle_pd(AB2,AB1,2)));
+    iB2 = _mm_sub_pd(iB2, _mm_mul_pd(_mm_shuffle_pd(D2,D2,1), _mm_shuffle_pd(AB2,AB1,2)));
+
+    //  det = |A|*|D| + |B|*|C| - trace(A#*B*D#*C)
+    det = _mm_add_sd(d1, d2);
+    det = _mm_sub_sd(det, rd);
+
+    //  iC = A * (D#C)# = A*C#*D
+    iC1 = _mm_mul_pd(A1, _mm_shuffle_pd(DC2,DC1,1));
+    iC2 = _mm_mul_pd(A2, _mm_shuffle_pd(DC2,DC1,1));
+    iC1 = _mm_sub_pd(iC1, _mm_mul_pd(_mm_shuffle_pd(A1,A1,1), _mm_shuffle_pd(DC2,DC1,2)));
+    iC2 = _mm_sub_pd(iC2, _mm_mul_pd(_mm_shuffle_pd(A2,A2,1), _mm_shuffle_pd(DC2,DC1,2)));
+
+    rd = _mm_div_sd(_mm_set_sd(1.0), det);
+//     #ifdef ZERO_SINGULAR
+//         rd = _mm_and_pd(_mm_cmpneq_sd(det,_mm_setzero_pd()), rd);
+//     #endif
+    rd = _mm_shuffle_pd(rd,rd,0);
+
+    //  iB = C*|B| - D*B#*A
+    dB = _mm_shuffle_pd(dB,dB,0);
+    iB1 = _mm_sub_pd(_mm_mul_pd(C1, dB), iB1);
+    iB2 = _mm_sub_pd(_mm_mul_pd(C2, dB), iB2);
+
+    d1 = _mm_xor_pd(rd, _Sign_PN);
+    d2 = _mm_xor_pd(rd, _Sign_NP);
+
+    //  iC = B*|C| - A*C#*D;
+    dC = _mm_shuffle_pd(dC,dC,0);
+    iC1 = _mm_sub_pd(_mm_mul_pd(B1, dC), iC1);
+    iC2 = _mm_sub_pd(_mm_mul_pd(B2, dC), iC2);
+
+    result.template writePacket<ResultAlignment>( 0, _mm_mul_pd(_mm_shuffle_pd(iA2, iA1, 3), d1));     // iA# / det
+    result.template writePacket<ResultAlignment>( 4, _mm_mul_pd(_mm_shuffle_pd(iA2, iA1, 0), d2));
+    result.template writePacket<ResultAlignment>( 2, _mm_mul_pd(_mm_shuffle_pd(iB2, iB1, 3), d1));     // iB# / det
+    result.template writePacket<ResultAlignment>( 6, _mm_mul_pd(_mm_shuffle_pd(iB2, iB1, 0), d2));
+    result.template writePacket<ResultAlignment>( 8, _mm_mul_pd(_mm_shuffle_pd(iC2, iC1, 3), d1));     // iC# / det
+    result.template writePacket<ResultAlignment>(12, _mm_mul_pd(_mm_shuffle_pd(iC2, iC1, 0), d2));
+    result.template writePacket<ResultAlignment>(10, _mm_mul_pd(_mm_shuffle_pd(iD2, iD1, 3), d1));     // iD# / det
+    result.template writePacket<ResultAlignment>(14, _mm_mul_pd(_mm_shuffle_pd(iD2, iD1, 0), d2));
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_INVERSE_SSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/MetisSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/MetisSupport/CMakeLists.txt
new file mode 100644
index 0000000..2bad314
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/MetisSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_MetisSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_MetisSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/MetisSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/MetisSupport/MetisSupport.h b/vendor/eigen-3.1.91/Eigen/src/MetisSupport/MetisSupport.h
new file mode 100644
index 0000000..818355e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/MetisSupport/MetisSupport.h
@@ -0,0 +1,137 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#ifndef METIS_SUPPORT_H
+#define METIS_SUPPORT_H
+
+namespace Eigen {
+/**
+ * Get the fill-reducing ordering from the METIS package
+ * 
+ * If A is the original matrix and Ap is the permuted matrix, 
+ * the fill-reducing permutation is defined as follows :
+ * Row (column) i of A is the matperm(i) row (column) of Ap. 
+ * WARNING: As computed by METIS, this corresponds to the vector iperm (instead of perm)
+ */
+template <typename Index>
+class MetisOrdering
+{
+public:
+  typedef PermutationMatrix<Dynamic,Dynamic,Index> PermutationType;
+  typedef Matrix<Index,Dynamic,1> IndexVector; 
+  
+  template <typename MatrixType>
+  void get_symmetrized_graph(const MatrixType& A)
+  {
+    Index m = A.cols(); 
+    eigen_assert((A.rows() == A.cols()) && "ONLY FOR SQUARED MATRICES");
+    // Get the transpose of the input matrix 
+    MatrixType At = A.transpose(); 
+    // Get the number of nonzeros elements in each row/col of At+A
+    Index TotNz = 0; 
+    IndexVector visited(m); 
+    visited.setConstant(-1); 
+    for (int j = 0; j < m; j++)
+    {
+      // Compute the union structure of of A(j,:) and At(j,:)
+      visited(j) = j; // Do not include the diagonal element
+      // Get the nonzeros in row/column j of A
+      for (typename MatrixType::InnerIterator it(A, j); it; ++it)
+      {
+        Index idx = it.index(); // Get the row index (for column major) or column index (for row major)
+        if (visited(idx) != j ) 
+        {
+          visited(idx) = j; 
+          ++TotNz; 
+        }
+      }
+      //Get the nonzeros in row/column j of At
+      for (typename MatrixType::InnerIterator it(At, j); it; ++it)
+      {
+        Index idx = it.index(); 
+        if(visited(idx) != j)
+        {
+          visited(idx) = j; 
+          ++TotNz; 
+        }
+      }
+    }
+    // Reserve place for A + At
+    m_indexPtr.resize(m+1);
+    m_innerIndices.resize(TotNz); 
+
+    // Now compute the real adjacency list of each column/row 
+    visited.setConstant(-1); 
+    Index CurNz = 0; 
+    for (int j = 0; j < m; j++)
+    {
+      m_indexPtr(j) = CurNz; 
+      
+      visited(j) = j; // Do not include the diagonal element
+      // Add the pattern of row/column j of A to A+At
+      for (typename MatrixType::InnerIterator it(A,j); it; ++it)
+      {
+        Index idx = it.index(); // Get the row index (for column major) or column index (for row major)
+        if (visited(idx) != j ) 
+        {
+          visited(idx) = j; 
+          m_innerIndices(CurNz) = idx; 
+          CurNz++; 
+        }
+      }
+      //Add the pattern of row/column j of At to A+At
+      for (typename MatrixType::InnerIterator it(At, j); it; ++it)
+      {
+        Index idx = it.index(); 
+        if(visited(idx) != j)
+        {
+          visited(idx) = j; 
+          m_innerIndices(CurNz) = idx; 
+          ++CurNz; 
+        }
+      }
+    }
+    m_indexPtr(m) = CurNz;    
+  }
+  
+  template <typename MatrixType>
+  void operator() (const MatrixType& A, PermutationType& matperm)
+  {
+     Index m = A.cols();
+     IndexVector perm(m),iperm(m); 
+    // First, symmetrize the matrix graph. 
+     get_symmetrized_graph(A); 
+     int output_error;
+     
+     // Call the fill-reducing routine from METIS 
+     output_error = METIS_NodeND(&m, m_indexPtr.data(), m_innerIndices.data(), NULL, NULL, perm.data(), iperm.data());
+     
+    if(output_error != METIS_OK) 
+    {
+      //FIXME The ordering interface should define a class of possible errors 
+     std::cerr << "ERROR WHILE CALLING THE METIS PACKAGE \n"; 
+     return; 
+    }
+    
+    // Get the fill-reducing permutation 
+    //NOTE:  If Ap is the permuted matrix then perm and iperm vectors are defined as follows 
+    // Row (column) i of Ap is the perm(i) row(column) of A, and row (column) i of A is the iperm(i) row(column) of Ap
+    
+     matperm.resize(m);
+     for (int j = 0; j < m; j++)
+       matperm.indices()(iperm(j)) = j;
+   
+  }
+  
+  protected:
+    IndexVector m_indexPtr; // Pointer to the adjacenccy list of each row/column
+    IndexVector m_innerIndices; // Adjacency list 
+};
+
+}// end namespace eigen 
+#endif
\ No newline at end of file
diff --git a/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Amd.h b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Amd.h
new file mode 100644
index 0000000..41b4fd7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Amd.h
@@ -0,0 +1,435 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+
+/*
+
+NOTE: this routine has been adapted from the CSparse library:
+
+Copyright (c) 2006, Timothy A. Davis.
+http://www.cise.ufl.edu/research/sparse/CSparse
+
+CSparse is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+CSparse is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this Module; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+*/
+
+#include "../Core/util/NonMPL2.h"
+
+#ifndef EIGEN_SPARSE_AMD_H
+#define EIGEN_SPARSE_AMD_H
+
+namespace Eigen { 
+
+namespace internal {
+  
+template<typename T> inline T amd_flip(const T& i) { return -i-2; }
+template<typename T> inline T amd_unflip(const T& i) { return i<0 ? amd_flip(i) : i; }
+template<typename T0, typename T1> inline bool amd_marked(const T0* w, const T1& j) { return w[j]<0; }
+template<typename T0, typename T1> inline void amd_mark(const T0* w, const T1& j) { return w[j] = amd_flip(w[j]); }
+
+/* clear w */
+template<typename Index>
+static int cs_wclear (Index mark, Index lemax, Index *w, Index n)
+{
+  Index k;
+  if(mark < 2 || (mark + lemax < 0))
+  {
+    for(k = 0; k < n; k++)
+      if(w[k] != 0)
+        w[k] = 1;
+    mark = 2;
+  }
+  return (mark);     /* at this point, w[0..n-1] < mark holds */
+}
+
+/* depth-first search and postorder of a tree rooted at node j */
+template<typename Index>
+Index cs_tdfs(Index j, Index k, Index *head, const Index *next, Index *post, Index *stack)
+{
+  int i, p, top = 0;
+  if(!head || !next || !post || !stack) return (-1);    /* check inputs */
+  stack[0] = j;                 /* place j on the stack */
+  while (top >= 0)                /* while (stack is not empty) */
+  {
+    p = stack[top];           /* p = top of stack */
+    i = head[p];              /* i = youngest child of p */
+    if(i == -1)
+    {
+      top--;                 /* p has no unordered children left */
+      post[k++] = p;        /* node p is the kth postordered node */
+    }
+    else
+    {
+      head[p] = next[i];   /* remove i from children of p */
+      stack[++top] = i;     /* start dfs on child node i */
+    }
+  }
+  return k;
+}
+
+
+/** \internal
+  * \ingroup OrderingMethods_Module 
+  * Approximate minimum degree ordering algorithm.
+  * \returns the permutation P reducing the fill-in of the input matrix \a C
+  * The input matrix \a C must be a selfadjoint compressed column major SparseMatrix object. Both the upper and lower parts have to be stored, but the diagonal entries are optional.
+  * On exit the values of C are destroyed */
+template<typename Scalar, typename Index>
+void minimum_degree_ordering(SparseMatrix<Scalar,ColMajor,Index>& C, PermutationMatrix<Dynamic,Dynamic,Index>& perm)
+{
+  using std::sqrt;
+  
+  int d, dk, dext, lemax = 0, e, elenk, eln, i, j, k, k1,
+      k2, k3, jlast, ln, dense, nzmax, mindeg = 0, nvi, nvj, nvk, mark, wnvi,
+      ok, nel = 0, p, p1, p2, p3, p4, pj, pk, pk1, pk2, pn, q, t;
+  unsigned int h;
+  
+  Index n = C.cols();
+  dense = std::max<Index> (16, Index(10 * sqrt(double(n))));   /* find dense threshold */
+  dense = std::min<Index> (n-2, dense);
+  
+  Index cnz = C.nonZeros();
+  perm.resize(n+1);
+  t = cnz + cnz/5 + 2*n;                 /* add elbow room to C */
+  C.resizeNonZeros(t);
+  
+  Index* W       = new Index[8*(n+1)]; /* get workspace */
+  Index* len     = W;
+  Index* nv      = W +   (n+1);
+  Index* next    = W + 2*(n+1);
+  Index* head    = W + 3*(n+1);
+  Index* elen    = W + 4*(n+1);
+  Index* degree  = W + 5*(n+1);
+  Index* w       = W + 6*(n+1);
+  Index* hhead   = W + 7*(n+1);
+  Index* last    = perm.indices().data();                              /* use P as workspace for last */
+  
+  /* --- Initialize quotient graph ---------------------------------------- */
+  Index* Cp = C.outerIndexPtr();
+  Index* Ci = C.innerIndexPtr();
+  for(k = 0; k < n; k++)
+    len[k] = Cp[k+1] - Cp[k];
+  len[n] = 0;
+  nzmax = t;
+  
+  for(i = 0; i <= n; i++)
+  {
+    head[i]   = -1;                     // degree list i is empty
+    last[i]   = -1;
+    next[i]   = -1;
+    hhead[i]  = -1;                     // hash list i is empty 
+    nv[i]     = 1;                      // node i is just one node
+    w[i]      = 1;                      // node i is alive
+    elen[i]   = 0;                      // Ek of node i is empty
+    degree[i] = len[i];                 // degree of node i
+  }
+  mark = internal::cs_wclear<Index>(0, 0, w, n);         /* clear w */
+  elen[n] = -2;                         /* n is a dead element */
+  Cp[n] = -1;                           /* n is a root of assembly tree */
+  w[n] = 0;                             /* n is a dead element */
+  
+  /* --- Initialize degree lists ------------------------------------------ */
+  for(i = 0; i < n; i++)
+  {
+    d = degree[i];
+    if(d == 0)                         /* node i is empty */
+    {
+      elen[i] = -2;                 /* element i is dead */
+      nel++;
+      Cp[i] = -1;                   /* i is a root of assembly tree */
+      w[i] = 0;
+    }
+    else if(d > dense)                 /* node i is dense */
+    {
+      nv[i] = 0;                    /* absorb i into element n */
+      elen[i] = -1;                 /* node i is dead */
+      nel++;
+      Cp[i] = amd_flip (n);
+      nv[n]++;
+    }
+    else
+    {
+      if(head[d] != -1) last[head[d]] = i;
+      next[i] = head[d];           /* put node i in degree list d */
+      head[d] = i;
+    }
+  }
+  
+  while (nel < n)                         /* while (selecting pivots) do */
+  {
+    /* --- Select node of minimum approximate degree -------------------- */
+    for(k = -1; mindeg < n && (k = head[mindeg]) == -1; mindeg++) {}
+    if(next[k] != -1) last[next[k]] = -1;
+    head[mindeg] = next[k];          /* remove k from degree list */
+    elenk = elen[k];                  /* elenk = |Ek| */
+    nvk = nv[k];                      /* # of nodes k represents */
+    nel += nvk;                        /* nv[k] nodes of A eliminated */
+    
+    /* --- Garbage collection ------------------------------------------- */
+    if(elenk > 0 && cnz + mindeg >= nzmax)
+    {
+      for(j = 0; j < n; j++)
+      {
+        if((p = Cp[j]) >= 0)      /* j is a live node or element */
+        {
+          Cp[j] = Ci[p];          /* save first entry of object */
+          Ci[p] = amd_flip (j);    /* first entry is now amd_flip(j) */
+        }
+      }
+      for(q = 0, p = 0; p < cnz; ) /* scan all of memory */
+      {
+        if((j = amd_flip (Ci[p++])) >= 0)  /* found object j */
+        {
+          Ci[q] = Cp[j];       /* restore first entry of object */
+          Cp[j] = q++;          /* new pointer to object j */
+          for(k3 = 0; k3 < len[j]-1; k3++) Ci[q++] = Ci[p++];
+        }
+      }
+      cnz = q;                       /* Ci[cnz...nzmax-1] now free */
+    }
+    
+    /* --- Construct new element ---------------------------------------- */
+    dk = 0;
+    nv[k] = -nvk;                     /* flag k as in Lk */
+    p = Cp[k];
+    pk1 = (elenk == 0) ? p : cnz;      /* do in place if elen[k] == 0 */
+    pk2 = pk1;
+    for(k1 = 1; k1 <= elenk + 1; k1++)
+    {
+      if(k1 > elenk)
+      {
+        e = k;                     /* search the nodes in k */
+        pj = p;                    /* list of nodes starts at Ci[pj]*/
+        ln = len[k] - elenk;      /* length of list of nodes in k */
+      }
+      else
+      {
+        e = Ci[p++];              /* search the nodes in e */
+        pj = Cp[e];
+        ln = len[e];              /* length of list of nodes in e */
+      }
+      for(k2 = 1; k2 <= ln; k2++)
+      {
+        i = Ci[pj++];
+        if((nvi = nv[i]) <= 0) continue; /* node i dead, or seen */
+        dk += nvi;                 /* degree[Lk] += size of node i */
+        nv[i] = -nvi;             /* negate nv[i] to denote i in Lk*/
+        Ci[pk2++] = i;            /* place i in Lk */
+        if(next[i] != -1) last[next[i]] = last[i];
+        if(last[i] != -1)         /* remove i from degree list */
+        {
+          next[last[i]] = next[i];
+        }
+        else
+        {
+          head[degree[i]] = next[i];
+        }
+      }
+      if(e != k)
+      {
+        Cp[e] = amd_flip (k);      /* absorb e into k */
+        w[e] = 0;                 /* e is now a dead element */
+      }
+    }
+    if(elenk != 0) cnz = pk2;         /* Ci[cnz...nzmax] is free */
+    degree[k] = dk;                   /* external degree of k - |Lk\i| */
+    Cp[k] = pk1;                      /* element k is in Ci[pk1..pk2-1] */
+    len[k] = pk2 - pk1;
+    elen[k] = -2;                     /* k is now an element */
+    
+    /* --- Find set differences ----------------------------------------- */
+    mark = internal::cs_wclear<Index>(mark, lemax, w, n);  /* clear w if necessary */
+    for(pk = pk1; pk < pk2; pk++)    /* scan 1: find |Le\Lk| */
+    {
+      i = Ci[pk];
+      if((eln = elen[i]) <= 0) continue;/* skip if elen[i] empty */
+      nvi = -nv[i];                      /* nv[i] was negated */
+      wnvi = mark - nvi;
+      for(p = Cp[i]; p <= Cp[i] + eln - 1; p++)  /* scan Ei */
+      {
+        e = Ci[p];
+        if(w[e] >= mark)
+        {
+          w[e] -= nvi;          /* decrement |Le\Lk| */
+        }
+        else if(w[e] != 0)        /* ensure e is a live element */
+        {
+          w[e] = degree[e] + wnvi; /* 1st time e seen in scan 1 */
+        }
+      }
+    }
+    
+    /* --- Degree update ------------------------------------------------ */
+    for(pk = pk1; pk < pk2; pk++)    /* scan2: degree update */
+    {
+      i = Ci[pk];                   /* consider node i in Lk */
+      p1 = Cp[i];
+      p2 = p1 + elen[i] - 1;
+      pn = p1;
+      for(h = 0, d = 0, p = p1; p <= p2; p++)    /* scan Ei */
+      {
+        e = Ci[p];
+        if(w[e] != 0)             /* e is an unabsorbed element */
+        {
+          dext = w[e] - mark;   /* dext = |Le\Lk| */
+          if(dext > 0)
+          {
+            d += dext;         /* sum up the set differences */
+            Ci[pn++] = e;     /* keep e in Ei */
+            h += e;            /* compute the hash of node i */
+          }
+          else
+          {
+            Cp[e] = amd_flip (k);  /* aggressive absorb. e->k */
+            w[e] = 0;             /* e is a dead element */
+          }
+        }
+      }
+      elen[i] = pn - p1 + 1;        /* elen[i] = |Ei| */
+      p3 = pn;
+      p4 = p1 + len[i];
+      for(p = p2 + 1; p < p4; p++) /* prune edges in Ai */
+      {
+        j = Ci[p];
+        if((nvj = nv[j]) <= 0) continue; /* node j dead or in Lk */
+        d += nvj;                  /* degree(i) += |j| */
+        Ci[pn++] = j;             /* place j in node list of i */
+        h += j;                    /* compute hash for node i */
+      }
+      if(d == 0)                     /* check for mass elimination */
+      {
+        Cp[i] = amd_flip (k);      /* absorb i into k */
+        nvi = -nv[i];
+        dk -= nvi;                 /* |Lk| -= |i| */
+        nvk += nvi;                /* |k| += nv[i] */
+        nel += nvi;
+        nv[i] = 0;
+        elen[i] = -1;             /* node i is dead */
+      }
+      else
+      {
+        degree[i] = std::min<Index> (degree[i], d);   /* update degree(i) */
+        Ci[pn] = Ci[p3];         /* move first node to end */
+        Ci[p3] = Ci[p1];         /* move 1st el. to end of Ei */
+        Ci[p1] = k;               /* add k as 1st element in of Ei */
+        len[i] = pn - p1 + 1;     /* new len of adj. list of node i */
+        h %= n;                    /* finalize hash of i */
+        next[i] = hhead[h];      /* place i in hash bucket */
+        hhead[h] = i;
+        last[i] = h;              /* save hash of i in last[i] */
+      }
+    }                                   /* scan2 is done */
+    degree[k] = dk;                   /* finalize |Lk| */
+    lemax = std::max<Index>(lemax, dk);
+    mark = internal::cs_wclear<Index>(mark+lemax, lemax, w, n);    /* clear w */
+    
+    /* --- Supernode detection ------------------------------------------ */
+    for(pk = pk1; pk < pk2; pk++)
+    {
+      i = Ci[pk];
+      if(nv[i] >= 0) continue;         /* skip if i is dead */
+      h = last[i];                      /* scan hash bucket of node i */
+      i = hhead[h];
+      hhead[h] = -1;                    /* hash bucket will be empty */
+      for(; i != -1 && next[i] != -1; i = next[i], mark++)
+      {
+        ln = len[i];
+        eln = elen[i];
+        for(p = Cp[i]+1; p <= Cp[i] + ln-1; p++) w[Ci[p]] = mark;
+        jlast = i;
+        for(j = next[i]; j != -1; ) /* compare i with all j */
+        {
+          ok = (len[j] == ln) && (elen[j] == eln);
+          for(p = Cp[j] + 1; ok && p <= Cp[j] + ln - 1; p++)
+          {
+            if(w[Ci[p]] != mark) ok = 0;    /* compare i and j*/
+          }
+          if(ok)                     /* i and j are identical */
+          {
+            Cp[j] = amd_flip (i);  /* absorb j into i */
+            nv[i] += nv[j];
+            nv[j] = 0;
+            elen[j] = -1;         /* node j is dead */
+            j = next[j];          /* delete j from hash bucket */
+            next[jlast] = j;
+          }
+          else
+          {
+            jlast = j;             /* j and i are different */
+            j = next[j];
+          }
+        }
+      }
+    }
+    
+    /* --- Finalize new element------------------------------------------ */
+    for(p = pk1, pk = pk1; pk < pk2; pk++)   /* finalize Lk */
+    {
+      i = Ci[pk];
+      if((nvi = -nv[i]) <= 0) continue;/* skip if i is dead */
+      nv[i] = nvi;                      /* restore nv[i] */
+      d = degree[i] + dk - nvi;         /* compute external degree(i) */
+      d = std::min<Index> (d, n - nel - nvi);
+      if(head[d] != -1) last[head[d]] = i;
+      next[i] = head[d];               /* put i back in degree list */
+      last[i] = -1;
+      head[d] = i;
+      mindeg = std::min<Index> (mindeg, d);       /* find new minimum degree */
+      degree[i] = d;
+      Ci[p++] = i;                      /* place i in Lk */
+    }
+    nv[k] = nvk;                      /* # nodes absorbed into k */
+    if((len[k] = p-pk1) == 0)         /* length of adj list of element k*/
+    {
+      Cp[k] = -1;                   /* k is a root of the tree */
+      w[k] = 0;                     /* k is now a dead element */
+    }
+    if(elenk != 0) cnz = p;           /* free unused space in Lk */
+  }
+  
+  /* --- Postordering ----------------------------------------------------- */
+  for(i = 0; i < n; i++) Cp[i] = amd_flip (Cp[i]);/* fix assembly tree */
+  for(j = 0; j <= n; j++) head[j] = -1;
+  for(j = n; j >= 0; j--)              /* place unordered nodes in lists */
+  {
+    if(nv[j] > 0) continue;          /* skip if j is an element */
+    next[j] = head[Cp[j]];          /* place j in list of its parent */
+    head[Cp[j]] = j;
+  }
+  for(e = n; e >= 0; e--)              /* place elements in lists */
+  {
+    if(nv[e] <= 0) continue;         /* skip unless e is an element */
+    if(Cp[e] != -1)
+    {
+      next[e] = head[Cp[e]];      /* place e in list of its parent */
+      head[Cp[e]] = e;
+    }
+  }
+  for(k = 0, i = 0; i <= n; i++)       /* postorder the assembly tree */
+  {
+    if(Cp[i] == -1) k = internal::cs_tdfs<Index>(i, k, head, next, perm.indices().data(), w);
+  }
+  
+  perm.indices().conservativeResize(n);
+
+  delete[] W;
+}
+
+} // namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_AMD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/CMakeLists.txt
new file mode 100644
index 0000000..9f4bb27
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_OrderingMethods_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_OrderingMethods_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/OrderingMethods COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Eigen_Colamd.h b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Eigen_Colamd.h
new file mode 100644
index 0000000..44548f6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Eigen_Colamd.h
@@ -0,0 +1,1850 @@
+// // This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Desire Nuentsa Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This file is modified from the colamd/symamd library. The copyright is below
+
+//   The authors of the code itself are Stefan I. Larimore and Timothy A.
+//   Davis (davis at cise.ufl.edu), University of Florida.  The algorithm was
+//   developed in collaboration with John Gilbert, Xerox PARC, and Esmond
+//   Ng, Oak Ridge National Laboratory.
+// 
+//     Date:
+// 
+//   September 8, 2003.  Version 2.3.
+// 
+//     Acknowledgements:
+// 
+//   This work was supported by the National Science Foundation, under
+//   grants DMS-9504974 and DMS-9803599.
+// 
+//     Notice:
+// 
+//   Copyright (c) 1998-2003 by the University of Florida.
+//   All Rights Reserved.
+// 
+//   THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+//   EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+// 
+//   Permission is hereby granted to use, copy, modify, and/or distribute
+//   this program, provided that the Copyright, this License, and the
+//   Availability of the original version is retained on all copies and made
+//   accessible to the end-user of any code or package that includes COLAMD
+//   or any modified version of COLAMD. 
+// 
+//     Availability:
+// 
+//   The colamd/symamd library is available at
+// 
+//       http://www.cise.ufl.edu/research/sparse/colamd/
+
+//   This is the http://www.cise.ufl.edu/research/sparse/colamd/colamd.h
+//   file.  It is required by the colamd.c, colamdmex.c, and symamdmex.c
+//   files, and by any C code that calls the routines whose prototypes are
+//   listed below, or that uses the colamd/symamd definitions listed below.
+  
+#ifndef EIGEN_COLAMD_H
+#define EIGEN_COLAMD_H
+
+namespace internal {
+/* Ensure that debugging is turned off: */
+#ifndef COLAMD_NDEBUG
+#define COLAMD_NDEBUG
+#endif /* NDEBUG */
+/* ========================================================================== */
+/* === Knob and statistics definitions ====================================== */
+/* ========================================================================== */
+
+/* size of the knobs [ ] array.  Only knobs [0..1] are currently used. */
+#define COLAMD_KNOBS 20
+
+/* number of output statistics.  Only stats [0..6] are currently used. */
+#define COLAMD_STATS 20 
+
+/* knobs [0] and stats [0]: dense row knob and output statistic. */
+#define COLAMD_DENSE_ROW 0
+
+/* knobs [1] and stats [1]: dense column knob and output statistic. */
+#define COLAMD_DENSE_COL 1
+
+/* stats [2]: memory defragmentation count output statistic */
+#define COLAMD_DEFRAG_COUNT 2
+
+/* stats [3]: colamd status:  zero OK, > 0 warning or notice, < 0 error */
+#define COLAMD_STATUS 3
+
+/* stats [4..6]: error info, or info on jumbled columns */ 
+#define COLAMD_INFO1 4
+#define COLAMD_INFO2 5
+#define COLAMD_INFO3 6
+
+/* error codes returned in stats [3]: */
+#define COLAMD_OK       (0)
+#define COLAMD_OK_BUT_JUMBLED     (1)
+#define COLAMD_ERROR_A_not_present    (-1)
+#define COLAMD_ERROR_p_not_present    (-2)
+#define COLAMD_ERROR_nrow_negative    (-3)
+#define COLAMD_ERROR_ncol_negative    (-4)
+#define COLAMD_ERROR_nnz_negative   (-5)
+#define COLAMD_ERROR_p0_nonzero     (-6)
+#define COLAMD_ERROR_A_too_small    (-7)
+#define COLAMD_ERROR_col_length_negative  (-8)
+#define COLAMD_ERROR_row_index_out_of_bounds  (-9)
+#define COLAMD_ERROR_out_of_memory    (-10)
+#define COLAMD_ERROR_internal_error   (-999)
+
+/* ========================================================================== */
+/* === Definitions ========================================================== */
+/* ========================================================================== */
+
+#define COLAMD_MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define COLAMD_MIN(a,b) (((a) < (b)) ? (a) : (b))
+
+#define ONES_COMPLEMENT(r) (-(r)-1)
+
+/* -------------------------------------------------------------------------- */
+
+#define COLAMD_EMPTY (-1)
+
+/* Row and column status */
+#define ALIVE (0)
+#define DEAD  (-1)
+
+/* Column status */
+#define DEAD_PRINCIPAL    (-1)
+#define DEAD_NON_PRINCIPAL  (-2)
+
+/* Macros for row and column status update and checking. */
+#define ROW_IS_DEAD(r)      ROW_IS_MARKED_DEAD (Row[r].shared2.mark)
+#define ROW_IS_MARKED_DEAD(row_mark)  (row_mark < ALIVE)
+#define ROW_IS_ALIVE(r)     (Row [r].shared2.mark >= ALIVE)
+#define COL_IS_DEAD(c)      (Col [c].start < ALIVE)
+#define COL_IS_ALIVE(c)     (Col [c].start >= ALIVE)
+#define COL_IS_DEAD_PRINCIPAL(c)  (Col [c].start == DEAD_PRINCIPAL)
+#define KILL_ROW(r)     { Row [r].shared2.mark = DEAD ; }
+#define KILL_PRINCIPAL_COL(c)   { Col [c].start = DEAD_PRINCIPAL ; }
+#define KILL_NON_PRINCIPAL_COL(c) { Col [c].start = DEAD_NON_PRINCIPAL ; }
+
+/* ========================================================================== */
+/* === Colamd reporting mechanism =========================================== */
+/* ========================================================================== */
+
+// == Row and Column structures ==
+template <typename Index>
+struct colamd_col
+{
+  Index start ;   /* index for A of first row in this column, or DEAD */
+  /* if column is dead */
+  Index length ;  /* number of rows in this column */
+  union
+  {
+    Index thickness ; /* number of original columns represented by this */
+    /* col, if the column is alive */
+    Index parent ;  /* parent in parent tree super-column structure, if */
+    /* the column is dead */
+  } shared1 ;
+  union
+  {
+    Index score ; /* the score used to maintain heap, if col is alive */
+    Index order ; /* pivot ordering of this column, if col is dead */
+  } shared2 ;
+  union
+  {
+    Index headhash ;  /* head of a hash bucket, if col is at the head of */
+    /* a degree list */
+    Index hash ;  /* hash value, if col is not in a degree list */
+    Index prev ;  /* previous column in degree list, if col is in a */
+    /* degree list (but not at the head of a degree list) */
+  } shared3 ;
+  union
+  {
+    Index degree_next ; /* next column, if col is in a degree list */
+    Index hash_next ;   /* next column, if col is in a hash list */
+  } shared4 ;
+  
+};
+ 
+template <typename Index>
+struct Colamd_Row
+{
+  Index start ;   /* index for A of first col in this row */
+  Index length ;  /* number of principal columns in this row */
+  union
+  {
+    Index degree ;  /* number of principal & non-principal columns in row */
+    Index p ;   /* used as a row pointer in init_rows_cols () */
+  } shared1 ;
+  union
+  {
+    Index mark ;  /* for computing set differences and marking dead rows*/
+    Index first_column ;/* first column in row (used in garbage collection) */
+  } shared2 ;
+  
+};
+ 
+/* ========================================================================== */
+/* === Colamd recommended memory size ======================================= */
+/* ========================================================================== */
+ 
+/*
+  The recommended length Alen of the array A passed to colamd is given by
+  the COLAMD_RECOMMENDED (nnz, n_row, n_col) macro.  It returns -1 if any
+  argument is negative.  2*nnz space is required for the row and column
+  indices of the matrix. colamd_c (n_col) + colamd_r (n_row) space is
+  required for the Col and Row arrays, respectively, which are internal to
+  colamd.  An additional n_col space is the minimal amount of "elbow room",
+  and nnz/5 more space is recommended for run time efficiency.
+  
+  This macro is not needed when using symamd.
+  
+  Explicit typecast to Index added Sept. 23, 2002, COLAMD version 2.2, to avoid
+  gcc -pedantic warning messages.
+*/
+template <typename Index>
+inline Index colamd_c(Index n_col) 
+{ return Index( ((n_col) + 1) * sizeof (colamd_col<Index>) / sizeof (Index) ) ; }
+
+template <typename Index>
+inline Index  colamd_r(Index n_row)
+{ return Index(((n_row) + 1) * sizeof (Colamd_Row<Index>) / sizeof (Index)); }
+
+// Prototypes of non-user callable routines
+template <typename Index>
+static Index init_rows_cols (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> col [], Index A [], Index p [], Index stats[COLAMD_STATS] ); 
+
+template <typename Index>
+static void init_scoring (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index head [], double knobs[COLAMD_KNOBS], Index *p_n_row2, Index *p_n_col2, Index *p_max_deg);
+
+template <typename Index>
+static Index find_ordering (Index n_row, Index n_col, Index Alen, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index head [], Index n_col2, Index max_deg, Index pfree);
+
+template <typename Index>
+static void order_children (Index n_col, colamd_col<Index> Col [], Index p []);
+
+template <typename Index>
+static void detect_super_cols (colamd_col<Index> Col [], Index A [], Index head [], Index row_start, Index row_length ) ;
+
+template <typename Index>
+static Index garbage_collection (Index n_row, Index n_col, Colamd_Row<Index> Row [], colamd_col<Index> Col [], Index A [], Index *pfree) ;
+
+template <typename Index>
+static inline  Index clear_mark (Index n_row, Colamd_Row<Index> Row [] ) ;
+
+/* === No debugging ========================================================= */
+
+#define COLAMD_DEBUG0(params) ;
+#define COLAMD_DEBUG1(params) ;
+#define COLAMD_DEBUG2(params) ;
+#define COLAMD_DEBUG3(params) ;
+#define COLAMD_DEBUG4(params) ;
+
+#define COLAMD_ASSERT(expression) ((void) 0)
+
+
+/**
+ * \brief Returns the recommended value of Alen 
+ * 
+ * Returns recommended value of Alen for use by colamd.  
+ * Returns -1 if any input argument is negative.  
+ * The use of this routine or macro is optional.  
+ * Note that the macro uses its arguments   more than once, 
+ * so be careful for side effects, if you pass expressions as arguments to COLAMD_RECOMMENDED.  
+ * 
+ * \param nnz nonzeros in A
+ * \param n_row number of rows in A
+ * \param n_col number of columns in A
+ * \return recommended value of Alen for use by colamd
+ */
+template <typename Index>
+inline Index colamd_recommended ( Index nnz, Index n_row, Index n_col)
+{
+  if ((nnz) < 0 || (n_row) < 0 || (n_col) < 0)
+    return (-1);
+  else
+    return (2 * (nnz) + colamd_c (n_col) + colamd_r (n_row) + (n_col) + ((nnz) / 5)); 
+}
+
+/**
+ * \brief set default parameters  The use of this routine is optional.
+ * 
+ * Colamd: rows with more than (knobs [COLAMD_DENSE_ROW] * n_col)
+ * entries are removed prior to ordering.  Columns with more than
+ * (knobs [COLAMD_DENSE_COL] * n_row) entries are removed prior to
+ * ordering, and placed last in the output column ordering. 
+ *
+ * COLAMD_DENSE_ROW and COLAMD_DENSE_COL are defined as 0 and 1,
+ * respectively, in colamd.h.  Default values of these two knobs
+ * are both 0.5.  Currently, only knobs [0] and knobs [1] are
+ * used, but future versions may use more knobs.  If so, they will
+ * be properly set to their defaults by the future version of
+ * colamd_set_defaults, so that the code that calls colamd will
+ * not need to change, assuming that you either use
+ * colamd_set_defaults, or pass a (double *) NULL pointer as the
+ * knobs array to colamd or symamd.
+ * 
+ * \param knobs parameter settings for colamd
+ */
+
+static inline void colamd_set_defaults(double knobs[COLAMD_KNOBS])
+{
+  /* === Local variables ================================================== */
+  
+  int i ;
+
+  if (!knobs)
+  {
+    return ;      /* no knobs to initialize */
+  }
+  for (i = 0 ; i < COLAMD_KNOBS ; i++)
+  {
+    knobs [i] = 0 ;
+  }
+  knobs [COLAMD_DENSE_ROW] = 0.5 ;  /* ignore rows over 50% dense */
+  knobs [COLAMD_DENSE_COL] = 0.5 ;  /* ignore columns over 50% dense */
+}
+
+/** 
+ * \brief  Computes a column ordering using the column approximate minimum degree ordering
+ * 
+ * Computes a column ordering (Q) of A such that P(AQ)=LU or
+ * (AQ)'AQ=LL' have less fill-in and require fewer floating point
+ * operations than factorizing the unpermuted matrix A or A'A,
+ * respectively.
+ * 
+ * 
+ * \param n_row number of rows in A
+ * \param n_col number of columns in A
+ * \param Alen, size of the array A
+ * \param A row indices of the matrix, of size ALen
+ * \param p column pointers of A, of size n_col+1
+ * \param knobs parameter settings for colamd
+ * \param stats colamd output statistics and error codes
+ */
+template <typename Index>
+static bool colamd(Index n_row, Index n_col, Index Alen, Index *A, Index *p, double knobs[COLAMD_KNOBS], Index stats[COLAMD_STATS])
+{
+  /* === Local variables ================================================== */
+  
+  Index i ;     /* loop index */
+  Index nnz ;     /* nonzeros in A */
+  Index Row_size ;    /* size of Row [], in integers */
+  Index Col_size ;    /* size of Col [], in integers */
+  Index need ;      /* minimum required length of A */
+  Colamd_Row<Index> *Row ;   /* pointer into A of Row [0..n_row] array */
+  colamd_col<Index> *Col ;   /* pointer into A of Col [0..n_col] array */
+  Index n_col2 ;    /* number of non-dense, non-empty columns */
+  Index n_row2 ;    /* number of non-dense, non-empty rows */
+  Index ngarbage ;    /* number of garbage collections performed */
+  Index max_deg ;   /* maximum row degree */
+  double default_knobs [COLAMD_KNOBS] ; /* default knobs array */
+  
+  
+  /* === Check the input arguments ======================================== */
+  
+  if (!stats)
+  {
+    COLAMD_DEBUG0 (("colamd: stats not present\n")) ;
+    return (false) ;
+  }
+  for (i = 0 ; i < COLAMD_STATS ; i++)
+  {
+    stats [i] = 0 ;
+  }
+  stats [COLAMD_STATUS] = COLAMD_OK ;
+  stats [COLAMD_INFO1] = -1 ;
+  stats [COLAMD_INFO2] = -1 ;
+  
+  if (!A)   /* A is not present */
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_A_not_present ;
+    COLAMD_DEBUG0 (("colamd: A not present\n")) ;
+    return (false) ;
+  }
+  
+  if (!p)   /* p is not present */
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_p_not_present ;
+    COLAMD_DEBUG0 (("colamd: p not present\n")) ;
+    return (false) ;
+  }
+  
+  if (n_row < 0)  /* n_row must be >= 0 */
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_nrow_negative ;
+    stats [COLAMD_INFO1] = n_row ;
+    COLAMD_DEBUG0 (("colamd: nrow negative %d\n", n_row)) ;
+    return (false) ;
+  }
+  
+  if (n_col < 0)  /* n_col must be >= 0 */
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_ncol_negative ;
+    stats [COLAMD_INFO1] = n_col ;
+    COLAMD_DEBUG0 (("colamd: ncol negative %d\n", n_col)) ;
+    return (false) ;
+  }
+  
+  nnz = p [n_col] ;
+  if (nnz < 0)  /* nnz must be >= 0 */
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_nnz_negative ;
+    stats [COLAMD_INFO1] = nnz ;
+    COLAMD_DEBUG0 (("colamd: number of entries negative %d\n", nnz)) ;
+    return (false) ;
+  }
+  
+  if (p [0] != 0)
+  {
+    stats [COLAMD_STATUS] = COLAMD_ERROR_p0_nonzero ;
+    stats [COLAMD_INFO1] = p [0] ;
+    COLAMD_DEBUG0 (("colamd: p[0] not zero %d\n", p [0])) ;
+    return (false) ;
+  }
+  
+  /* === If no knobs, set default knobs =================================== */
+  
+  if (!knobs)
+  {
+    colamd_set_defaults (default_knobs) ;
+    knobs = default_knobs ;
+  }
+  
+  /* === Allocate the Row and Col arrays from array A ===================== */
+  
+  Col_size = colamd_c (n_col) ;
+  Row_size = colamd_r (n_row) ;
+  need = 2*nnz + n_col + Col_size + Row_size ;
+  
+  if (need > Alen)
+  {
+    /* not enough space in array A to perform the ordering */
+    stats [COLAMD_STATUS] = COLAMD_ERROR_A_too_small ;
+    stats [COLAMD_INFO1] = need ;
+    stats [COLAMD_INFO2] = Alen ;
+    COLAMD_DEBUG0 (("colamd: Need Alen >= %d, given only Alen = %d\n", need,Alen));
+    return (false) ;
+  }
+  
+  Alen -= Col_size + Row_size ;
+  Col = (colamd_col<Index> *) &A [Alen] ;
+  Row = (Colamd_Row<Index> *) &A [Alen + Col_size] ;
+
+  /* === Construct the row and column data structures ===================== */
+  
+  if (!Eigen::internal::init_rows_cols (n_row, n_col, Row, Col, A, p, stats))
+  {
+    /* input matrix is invalid */
+    COLAMD_DEBUG0 (("colamd: Matrix invalid\n")) ;
+    return (false) ;
+  }
+  
+  /* === Initialize scores, kill dense rows/columns ======================= */
+
+  Eigen::internal::init_scoring (n_row, n_col, Row, Col, A, p, knobs,
+		&n_row2, &n_col2, &max_deg) ;
+  
+  /* === Order the supercolumns =========================================== */
+  
+  ngarbage = Eigen::internal::find_ordering (n_row, n_col, Alen, Row, Col, A, p,
+			    n_col2, max_deg, 2*nnz) ;
+  
+  /* === Order the non-principal columns ================================== */
+  
+  Eigen::internal::order_children (n_col, Col, p) ;
+  
+  /* === Return statistics in stats ======================================= */
+  
+  stats [COLAMD_DENSE_ROW] = n_row - n_row2 ;
+  stats [COLAMD_DENSE_COL] = n_col - n_col2 ;
+  stats [COLAMD_DEFRAG_COUNT] = ngarbage ;
+  COLAMD_DEBUG0 (("colamd: done.\n")) ; 
+  return (true) ;
+}
+
+/* ========================================================================== */
+/* === NON-USER-CALLABLE ROUTINES: ========================================== */
+/* ========================================================================== */
+
+/* There are no user-callable routines beyond this point in the file */
+
+
+/* ========================================================================== */
+/* === init_rows_cols ======================================================= */
+/* ========================================================================== */
+
+/*
+  Takes the column form of the matrix in A and creates the row form of the
+  matrix.  Also, row and column attributes are stored in the Col and Row
+  structs.  If the columns are un-sorted or contain duplicate row indices,
+  this routine will also sort and remove duplicate row indices from the
+  column form of the matrix.  Returns false if the matrix is invalid,
+  true otherwise.  Not user-callable.
+*/
+template <typename Index>
+static Index init_rows_cols  /* returns true if OK, or false otherwise */
+  (
+    /* === Parameters ======================================================= */
+
+    Index n_row,      /* number of rows of A */
+    Index n_col,      /* number of columns of A */
+    Colamd_Row<Index> Row [],    /* of size n_row+1 */
+    colamd_col<Index> Col [],    /* of size n_col+1 */
+    Index A [],     /* row indices of A, of size Alen */
+    Index p [],     /* pointers to columns in A, of size n_col+1 */
+    Index stats [COLAMD_STATS]  /* colamd statistics */ 
+    )
+{
+  /* === Local variables ================================================== */
+
+  Index col ;     /* a column index */
+  Index row ;     /* a row index */
+  Index *cp ;     /* a column pointer */
+  Index *cp_end ;   /* a pointer to the end of a column */
+  Index *rp ;     /* a row pointer */
+  Index *rp_end ;   /* a pointer to the end of a row */
+  Index last_row ;    /* previous row */
+
+  /* === Initialize columns, and check column pointers ==================== */
+
+  for (col = 0 ; col < n_col ; col++)
+  {
+    Col [col].start = p [col] ;
+    Col [col].length = p [col+1] - p [col] ;
+
+    if (Col [col].length < 0)
+    {
+      /* column pointers must be non-decreasing */
+      stats [COLAMD_STATUS] = COLAMD_ERROR_col_length_negative ;
+      stats [COLAMD_INFO1] = col ;
+      stats [COLAMD_INFO2] = Col [col].length ;
+      COLAMD_DEBUG0 (("colamd: col %d length %d < 0\n", col, Col [col].length)) ;
+      return (false) ;
+    }
+
+    Col [col].shared1.thickness = 1 ;
+    Col [col].shared2.score = 0 ;
+    Col [col].shared3.prev = COLAMD_EMPTY ;
+    Col [col].shared4.degree_next = COLAMD_EMPTY ;
+  }
+
+  /* p [0..n_col] no longer needed, used as "head" in subsequent routines */
+
+  /* === Scan columns, compute row degrees, and check row indices ========= */
+
+  stats [COLAMD_INFO3] = 0 ;  /* number of duplicate or unsorted row indices*/
+
+  for (row = 0 ; row < n_row ; row++)
+  {
+    Row [row].length = 0 ;
+    Row [row].shared2.mark = -1 ;
+  }
+
+  for (col = 0 ; col < n_col ; col++)
+  {
+    last_row = -1 ;
+
+    cp = &A [p [col]] ;
+    cp_end = &A [p [col+1]] ;
+
+    while (cp < cp_end)
+    {
+      row = *cp++ ;
+
+      /* make sure row indices within range */
+      if (row < 0 || row >= n_row)
+      {
+	stats [COLAMD_STATUS] = COLAMD_ERROR_row_index_out_of_bounds ;
+	stats [COLAMD_INFO1] = col ;
+	stats [COLAMD_INFO2] = row ;
+	stats [COLAMD_INFO3] = n_row ;
+	COLAMD_DEBUG0 (("colamd: row %d col %d out of bounds\n", row, col)) ;
+	return (false) ;
+      }
+
+      if (row <= last_row || Row [row].shared2.mark == col)
+      {
+	/* row index are unsorted or repeated (or both), thus col */
+	/* is jumbled.  This is a notice, not an error condition. */
+	stats [COLAMD_STATUS] = COLAMD_OK_BUT_JUMBLED ;
+	stats [COLAMD_INFO1] = col ;
+	stats [COLAMD_INFO2] = row ;
+	(stats [COLAMD_INFO3]) ++ ;
+	COLAMD_DEBUG1 (("colamd: row %d col %d unsorted/duplicate\n",row,col));
+      }
+
+      if (Row [row].shared2.mark != col)
+      {
+	Row [row].length++ ;
+      }
+      else
+      {
+	/* this is a repeated entry in the column, */
+	/* it will be removed */
+	Col [col].length-- ;
+      }
+
+      /* mark the row as having been seen in this column */
+      Row [row].shared2.mark = col ;
+
+      last_row = row ;
+    }
+  }
+
+  /* === Compute row pointers ============================================= */
+
+  /* row form of the matrix starts directly after the column */
+  /* form of matrix in A */
+  Row [0].start = p [n_col] ;
+  Row [0].shared1.p = Row [0].start ;
+  Row [0].shared2.mark = -1 ;
+  for (row = 1 ; row < n_row ; row++)
+  {
+    Row [row].start = Row [row-1].start + Row [row-1].length ;
+    Row [row].shared1.p = Row [row].start ;
+    Row [row].shared2.mark = -1 ;
+  }
+
+  /* === Create row form ================================================== */
+
+  if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)
+  {
+    /* if cols jumbled, watch for repeated row indices */
+    for (col = 0 ; col < n_col ; col++)
+    {
+      cp = &A [p [col]] ;
+      cp_end = &A [p [col+1]] ;
+      while (cp < cp_end)
+      {
+	row = *cp++ ;
+	if (Row [row].shared2.mark != col)
+	{
+	  A [(Row [row].shared1.p)++] = col ;
+	  Row [row].shared2.mark = col ;
+	}
+      }
+    }
+  }
+  else
+  {
+    /* if cols not jumbled, we don't need the mark (this is faster) */
+    for (col = 0 ; col < n_col ; col++)
+    {
+      cp = &A [p [col]] ;
+      cp_end = &A [p [col+1]] ;
+      while (cp < cp_end)
+      {
+	A [(Row [*cp++].shared1.p)++] = col ;
+      }
+    }
+  }
+
+  /* === Clear the row marks and set row degrees ========================== */
+
+  for (row = 0 ; row < n_row ; row++)
+  {
+    Row [row].shared2.mark = 0 ;
+    Row [row].shared1.degree = Row [row].length ;
+  }
+
+  /* === See if we need to re-create columns ============================== */
+
+  if (stats [COLAMD_STATUS] == COLAMD_OK_BUT_JUMBLED)
+  {
+    COLAMD_DEBUG0 (("colamd: reconstructing column form, matrix jumbled\n")) ;
+
+
+    /* === Compute col pointers ========================================= */
+
+    /* col form of the matrix starts at A [0]. */
+    /* Note, we may have a gap between the col form and the row */
+    /* form if there were duplicate entries, if so, it will be */
+    /* removed upon the first garbage collection */
+    Col [0].start = 0 ;
+    p [0] = Col [0].start ;
+    for (col = 1 ; col < n_col ; col++)
+    {
+      /* note that the lengths here are for pruned columns, i.e. */
+      /* no duplicate row indices will exist for these columns */
+      Col [col].start = Col [col-1].start + Col [col-1].length ;
+      p [col] = Col [col].start ;
+    }
+
+    /* === Re-create col form =========================================== */
+
+    for (row = 0 ; row < n_row ; row++)
+    {
+      rp = &A [Row [row].start] ;
+      rp_end = rp + Row [row].length ;
+      while (rp < rp_end)
+      {
+	A [(p [*rp++])++] = row ;
+      }
+    }
+  }
+
+  /* === Done.  Matrix is not (or no longer) jumbled ====================== */
+
+  return (true) ;
+}
+
+
+/* ========================================================================== */
+/* === init_scoring ========================================================= */
+/* ========================================================================== */
+
+/*
+  Kills dense or empty columns and rows, calculates an initial score for
+  each column, and places all columns in the degree lists.  Not user-callable.
+*/
+template <typename Index>
+static void init_scoring
+  (
+    /* === Parameters ======================================================= */
+
+    Index n_row,      /* number of rows of A */
+    Index n_col,      /* number of columns of A */
+    Colamd_Row<Index> Row [],    /* of size n_row+1 */
+    colamd_col<Index> Col [],    /* of size n_col+1 */
+    Index A [],     /* column form and row form of A */
+    Index head [],    /* of size n_col+1 */
+    double knobs [COLAMD_KNOBS],/* parameters */
+    Index *p_n_row2,    /* number of non-dense, non-empty rows */
+    Index *p_n_col2,    /* number of non-dense, non-empty columns */
+    Index *p_max_deg    /* maximum row degree */
+    )
+{
+  /* === Local variables ================================================== */
+
+  Index c ;     /* a column index */
+  Index r, row ;    /* a row index */
+  Index *cp ;     /* a column pointer */
+  Index deg ;     /* degree of a row or column */
+  Index *cp_end ;   /* a pointer to the end of a column */
+  Index *new_cp ;   /* new column pointer */
+  Index col_length ;    /* length of pruned column */
+  Index score ;     /* current column score */
+  Index n_col2 ;    /* number of non-dense, non-empty columns */
+  Index n_row2 ;    /* number of non-dense, non-empty rows */
+  Index dense_row_count ; /* remove rows with more entries than this */
+  Index dense_col_count ; /* remove cols with more entries than this */
+  Index min_score ;   /* smallest column score */
+  Index max_deg ;   /* maximum row degree */
+  Index next_col ;    /* Used to add to degree list.*/
+
+
+  /* === Extract knobs ==================================================== */
+
+  dense_row_count = COLAMD_MAX (0, COLAMD_MIN (knobs [COLAMD_DENSE_ROW] * n_col, n_col)) ;
+  dense_col_count = COLAMD_MAX (0, COLAMD_MIN (knobs [COLAMD_DENSE_COL] * n_row, n_row)) ;
+  COLAMD_DEBUG1 (("colamd: densecount: %d %d\n", dense_row_count, dense_col_count)) ;
+  max_deg = 0 ;
+  n_col2 = n_col ;
+  n_row2 = n_row ;
+
+  /* === Kill empty columns =============================================== */
+
+  /* Put the empty columns at the end in their natural order, so that LU */
+  /* factorization can proceed as far as possible. */
+  for (c = n_col-1 ; c >= 0 ; c--)
+  {
+    deg = Col [c].length ;
+    if (deg == 0)
+    {
+      /* this is a empty column, kill and order it last */
+      Col [c].shared2.order = --n_col2 ;
+      KILL_PRINCIPAL_COL (c) ;
+    }
+  }
+  COLAMD_DEBUG1 (("colamd: null columns killed: %d\n", n_col - n_col2)) ;
+
+  /* === Kill dense columns =============================================== */
+
+  /* Put the dense columns at the end, in their natural order */
+  for (c = n_col-1 ; c >= 0 ; c--)
+  {
+    /* skip any dead columns */
+    if (COL_IS_DEAD (c))
+    {
+      continue ;
+    }
+    deg = Col [c].length ;
+    if (deg > dense_col_count)
+    {
+      /* this is a dense column, kill and order it last */
+      Col [c].shared2.order = --n_col2 ;
+      /* decrement the row degrees */
+      cp = &A [Col [c].start] ;
+      cp_end = cp + Col [c].length ;
+      while (cp < cp_end)
+      {
+	Row [*cp++].shared1.degree-- ;
+      }
+      KILL_PRINCIPAL_COL (c) ;
+    }
+  }
+  COLAMD_DEBUG1 (("colamd: Dense and null columns killed: %d\n", n_col - n_col2)) ;
+
+  /* === Kill dense and empty rows ======================================== */
+
+  for (r = 0 ; r < n_row ; r++)
+  {
+    deg = Row [r].shared1.degree ;
+    COLAMD_ASSERT (deg >= 0 && deg <= n_col) ;
+    if (deg > dense_row_count || deg == 0)
+    {
+      /* kill a dense or empty row */
+      KILL_ROW (r) ;
+      --n_row2 ;
+    }
+    else
+    {
+      /* keep track of max degree of remaining rows */
+      max_deg = COLAMD_MAX (max_deg, deg) ;
+    }
+  }
+  COLAMD_DEBUG1 (("colamd: Dense and null rows killed: %d\n", n_row - n_row2)) ;
+
+  /* === Compute initial column scores ==================================== */
+
+  /* At this point the row degrees are accurate.  They reflect the number */
+  /* of "live" (non-dense) columns in each row.  No empty rows exist. */
+  /* Some "live" columns may contain only dead rows, however.  These are */
+  /* pruned in the code below. */
+
+  /* now find the initial matlab score for each column */
+  for (c = n_col-1 ; c >= 0 ; c--)
+  {
+    /* skip dead column */
+    if (COL_IS_DEAD (c))
+    {
+      continue ;
+    }
+    score = 0 ;
+    cp = &A [Col [c].start] ;
+    new_cp = cp ;
+    cp_end = cp + Col [c].length ;
+    while (cp < cp_end)
+    {
+      /* get a row */
+      row = *cp++ ;
+      /* skip if dead */
+      if (ROW_IS_DEAD (row))
+      {
+	continue ;
+      }
+      /* compact the column */
+      *new_cp++ = row ;
+      /* add row's external degree */
+      score += Row [row].shared1.degree - 1 ;
+      /* guard against integer overflow */
+      score = COLAMD_MIN (score, n_col) ;
+    }
+    /* determine pruned column length */
+    col_length = (Index) (new_cp - &A [Col [c].start]) ;
+    if (col_length == 0)
+    {
+      /* a newly-made null column (all rows in this col are "dense" */
+      /* and have already been killed) */
+      COLAMD_DEBUG2 (("Newly null killed: %d\n", c)) ;
+      Col [c].shared2.order = --n_col2 ;
+      KILL_PRINCIPAL_COL (c) ;
+    }
+    else
+    {
+      /* set column length and set score */
+      COLAMD_ASSERT (score >= 0) ;
+      COLAMD_ASSERT (score <= n_col) ;
+      Col [c].length = col_length ;
+      Col [c].shared2.score = score ;
+    }
+  }
+  COLAMD_DEBUG1 (("colamd: Dense, null, and newly-null columns killed: %d\n",
+		  n_col-n_col2)) ;
+
+  /* At this point, all empty rows and columns are dead.  All live columns */
+  /* are "clean" (containing no dead rows) and simplicial (no supercolumns */
+  /* yet).  Rows may contain dead columns, but all live rows contain at */
+  /* least one live column. */
+
+  /* === Initialize degree lists ========================================== */
+
+
+  /* clear the hash buckets */
+  for (c = 0 ; c <= n_col ; c++)
+  {
+    head [c] = COLAMD_EMPTY ;
+  }
+  min_score = n_col ;
+  /* place in reverse order, so low column indices are at the front */
+  /* of the lists.  This is to encourage natural tie-breaking */
+  for (c = n_col-1 ; c >= 0 ; c--)
+  {
+    /* only add principal columns to degree lists */
+    if (COL_IS_ALIVE (c))
+    {
+      COLAMD_DEBUG4 (("place %d score %d minscore %d ncol %d\n",
+		      c, Col [c].shared2.score, min_score, n_col)) ;
+
+      /* === Add columns score to DList =============================== */
+
+      score = Col [c].shared2.score ;
+
+      COLAMD_ASSERT (min_score >= 0) ;
+      COLAMD_ASSERT (min_score <= n_col) ;
+      COLAMD_ASSERT (score >= 0) ;
+      COLAMD_ASSERT (score <= n_col) ;
+      COLAMD_ASSERT (head [score] >= COLAMD_EMPTY) ;
+
+      /* now add this column to dList at proper score location */
+      next_col = head [score] ;
+      Col [c].shared3.prev = COLAMD_EMPTY ;
+      Col [c].shared4.degree_next = next_col ;
+
+      /* if there already was a column with the same score, set its */
+      /* previous pointer to this new column */
+      if (next_col != COLAMD_EMPTY)
+      {
+	Col [next_col].shared3.prev = c ;
+      }
+      head [score] = c ;
+
+      /* see if this score is less than current min */
+      min_score = COLAMD_MIN (min_score, score) ;
+
+
+    }
+  }
+
+
+  /* === Return number of remaining columns, and max row degree =========== */
+
+  *p_n_col2 = n_col2 ;
+  *p_n_row2 = n_row2 ;
+  *p_max_deg = max_deg ;
+}
+
+
+/* ========================================================================== */
+/* === find_ordering ======================================================== */
+/* ========================================================================== */
+
+/*
+  Order the principal columns of the supercolumn form of the matrix
+  (no supercolumns on input).  Uses a minimum approximate column minimum
+  degree ordering method.  Not user-callable.
+*/
+template <typename Index>
+static Index find_ordering /* return the number of garbage collections */
+  (
+    /* === Parameters ======================================================= */
+
+    Index n_row,      /* number of rows of A */
+    Index n_col,      /* number of columns of A */
+    Index Alen,     /* size of A, 2*nnz + n_col or larger */
+    Colamd_Row<Index> Row [],    /* of size n_row+1 */
+    colamd_col<Index> Col [],    /* of size n_col+1 */
+    Index A [],     /* column form and row form of A */
+    Index head [],    /* of size n_col+1 */
+    Index n_col2,     /* Remaining columns to order */
+    Index max_deg,    /* Maximum row degree */
+    Index pfree     /* index of first free slot (2*nnz on entry) */
+    )
+{
+  /* === Local variables ================================================== */
+
+  Index k ;     /* current pivot ordering step */
+  Index pivot_col ;   /* current pivot column */
+  Index *cp ;     /* a column pointer */
+  Index *rp ;     /* a row pointer */
+  Index pivot_row ;   /* current pivot row */
+  Index *new_cp ;   /* modified column pointer */
+  Index *new_rp ;   /* modified row pointer */
+  Index pivot_row_start ; /* pointer to start of pivot row */
+  Index pivot_row_degree ;  /* number of columns in pivot row */
+  Index pivot_row_length ;  /* number of supercolumns in pivot row */
+  Index pivot_col_score ; /* score of pivot column */
+  Index needed_memory ;   /* free space needed for pivot row */
+  Index *cp_end ;   /* pointer to the end of a column */
+  Index *rp_end ;   /* pointer to the end of a row */
+  Index row ;     /* a row index */
+  Index col ;     /* a column index */
+  Index max_score ;   /* maximum possible score */
+  Index cur_score ;   /* score of current column */
+  unsigned int hash ;   /* hash value for supernode detection */
+  Index head_column ;   /* head of hash bucket */
+  Index first_col ;   /* first column in hash bucket */
+  Index tag_mark ;    /* marker value for mark array */
+  Index row_mark ;    /* Row [row].shared2.mark */
+  Index set_difference ;  /* set difference size of row with pivot row */
+  Index min_score ;   /* smallest column score */
+  Index col_thickness ;   /* "thickness" (no. of columns in a supercol) */
+  Index max_mark ;    /* maximum value of tag_mark */
+  Index pivot_col_thickness ; /* number of columns represented by pivot col */
+  Index prev_col ;    /* Used by Dlist operations. */
+  Index next_col ;    /* Used by Dlist operations. */
+  Index ngarbage ;    /* number of garbage collections performed */
+
+
+  /* === Initialization and clear mark ==================================== */
+
+  max_mark = INT_MAX - n_col ;  /* INT_MAX defined in <limits.h> */
+  tag_mark = Eigen::internal::clear_mark (n_row, Row) ;
+  min_score = 0 ;
+  ngarbage = 0 ;
+  COLAMD_DEBUG1 (("colamd: Ordering, n_col2=%d\n", n_col2)) ;
+
+  /* === Order the columns ================================================ */
+
+  for (k = 0 ; k < n_col2 ; /* 'k' is incremented below */)
+  {
+
+    /* === Select pivot column, and order it ============================ */
+
+    /* make sure degree list isn't empty */
+    COLAMD_ASSERT (min_score >= 0) ;
+    COLAMD_ASSERT (min_score <= n_col) ;
+    COLAMD_ASSERT (head [min_score] >= COLAMD_EMPTY) ;
+
+    /* get pivot column from head of minimum degree list */
+    while (head [min_score] == COLAMD_EMPTY && min_score < n_col)
+    {
+      min_score++ ;
+    }
+    pivot_col = head [min_score] ;
+    COLAMD_ASSERT (pivot_col >= 0 && pivot_col <= n_col) ;
+    next_col = Col [pivot_col].shared4.degree_next ;
+    head [min_score] = next_col ;
+    if (next_col != COLAMD_EMPTY)
+    {
+      Col [next_col].shared3.prev = COLAMD_EMPTY ;
+    }
+
+    COLAMD_ASSERT (COL_IS_ALIVE (pivot_col)) ;
+    COLAMD_DEBUG3 (("Pivot col: %d\n", pivot_col)) ;
+
+    /* remember score for defrag check */
+    pivot_col_score = Col [pivot_col].shared2.score ;
+
+    /* the pivot column is the kth column in the pivot order */
+    Col [pivot_col].shared2.order = k ;
+
+    /* increment order count by column thickness */
+    pivot_col_thickness = Col [pivot_col].shared1.thickness ;
+    k += pivot_col_thickness ;
+    COLAMD_ASSERT (pivot_col_thickness > 0) ;
+
+    /* === Garbage_collection, if necessary ============================= */
+
+    needed_memory = COLAMD_MIN (pivot_col_score, n_col - k) ;
+    if (pfree + needed_memory >= Alen)
+    {
+      pfree = Eigen::internal::garbage_collection (n_row, n_col, Row, Col, A, &A [pfree]) ;
+      ngarbage++ ;
+      /* after garbage collection we will have enough */
+      COLAMD_ASSERT (pfree + needed_memory < Alen) ;
+      /* garbage collection has wiped out the Row[].shared2.mark array */
+      tag_mark = Eigen::internal::clear_mark (n_row, Row) ;
+
+    }
+
+    /* === Compute pivot row pattern ==================================== */
+
+    /* get starting location for this new merged row */
+    pivot_row_start = pfree ;
+
+    /* initialize new row counts to zero */
+    pivot_row_degree = 0 ;
+
+    /* tag pivot column as having been visited so it isn't included */
+    /* in merged pivot row */
+    Col [pivot_col].shared1.thickness = -pivot_col_thickness ;
+
+    /* pivot row is the union of all rows in the pivot column pattern */
+    cp = &A [Col [pivot_col].start] ;
+    cp_end = cp + Col [pivot_col].length ;
+    while (cp < cp_end)
+    {
+      /* get a row */
+      row = *cp++ ;
+      COLAMD_DEBUG4 (("Pivot col pattern %d %d\n", ROW_IS_ALIVE (row), row)) ;
+      /* skip if row is dead */
+      if (ROW_IS_DEAD (row))
+      {
+	continue ;
+      }
+      rp = &A [Row [row].start] ;
+      rp_end = rp + Row [row].length ;
+      while (rp < rp_end)
+      {
+	/* get a column */
+	col = *rp++ ;
+	/* add the column, if alive and untagged */
+	col_thickness = Col [col].shared1.thickness ;
+	if (col_thickness > 0 && COL_IS_ALIVE (col))
+	{
+	  /* tag column in pivot row */
+	  Col [col].shared1.thickness = -col_thickness ;
+	  COLAMD_ASSERT (pfree < Alen) ;
+	  /* place column in pivot row */
+	  A [pfree++] = col ;
+	  pivot_row_degree += col_thickness ;
+	}
+      }
+    }
+
+    /* clear tag on pivot column */
+    Col [pivot_col].shared1.thickness = pivot_col_thickness ;
+    max_deg = COLAMD_MAX (max_deg, pivot_row_degree) ;
+
+
+    /* === Kill all rows used to construct pivot row ==================== */
+
+    /* also kill pivot row, temporarily */
+    cp = &A [Col [pivot_col].start] ;
+    cp_end = cp + Col [pivot_col].length ;
+    while (cp < cp_end)
+    {
+      /* may be killing an already dead row */
+      row = *cp++ ;
+      COLAMD_DEBUG3 (("Kill row in pivot col: %d\n", row)) ;
+      KILL_ROW (row) ;
+    }
+
+    /* === Select a row index to use as the new pivot row =============== */
+
+    pivot_row_length = pfree - pivot_row_start ;
+    if (pivot_row_length > 0)
+    {
+      /* pick the "pivot" row arbitrarily (first row in col) */
+      pivot_row = A [Col [pivot_col].start] ;
+      COLAMD_DEBUG3 (("Pivotal row is %d\n", pivot_row)) ;
+    }
+    else
+    {
+      /* there is no pivot row, since it is of zero length */
+      pivot_row = COLAMD_EMPTY ;
+      COLAMD_ASSERT (pivot_row_length == 0) ;
+    }
+    COLAMD_ASSERT (Col [pivot_col].length > 0 || pivot_row_length == 0) ;
+
+    /* === Approximate degree computation =============================== */
+
+    /* Here begins the computation of the approximate degree.  The column */
+    /* score is the sum of the pivot row "length", plus the size of the */
+    /* set differences of each row in the column minus the pattern of the */
+    /* pivot row itself.  The column ("thickness") itself is also */
+    /* excluded from the column score (we thus use an approximate */
+    /* external degree). */
+
+    /* The time taken by the following code (compute set differences, and */
+    /* add them up) is proportional to the size of the data structure */
+    /* being scanned - that is, the sum of the sizes of each column in */
+    /* the pivot row.  Thus, the amortized time to compute a column score */
+    /* is proportional to the size of that column (where size, in this */
+    /* context, is the column "length", or the number of row indices */
+    /* in that column).  The number of row indices in a column is */
+    /* monotonically non-decreasing, from the length of the original */
+    /* column on input to colamd. */
+
+    /* === Compute set differences ====================================== */
+
+    COLAMD_DEBUG3 (("** Computing set differences phase. **\n")) ;
+
+    /* pivot row is currently dead - it will be revived later. */
+
+    COLAMD_DEBUG3 (("Pivot row: ")) ;
+    /* for each column in pivot row */
+    rp = &A [pivot_row_start] ;
+    rp_end = rp + pivot_row_length ;
+    while (rp < rp_end)
+    {
+      col = *rp++ ;
+      COLAMD_ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+      COLAMD_DEBUG3 (("Col: %d\n", col)) ;
+
+      /* clear tags used to construct pivot row pattern */
+      col_thickness = -Col [col].shared1.thickness ;
+      COLAMD_ASSERT (col_thickness > 0) ;
+      Col [col].shared1.thickness = col_thickness ;
+
+      /* === Remove column from degree list =========================== */
+
+      cur_score = Col [col].shared2.score ;
+      prev_col = Col [col].shared3.prev ;
+      next_col = Col [col].shared4.degree_next ;
+      COLAMD_ASSERT (cur_score >= 0) ;
+      COLAMD_ASSERT (cur_score <= n_col) ;
+      COLAMD_ASSERT (cur_score >= COLAMD_EMPTY) ;
+      if (prev_col == COLAMD_EMPTY)
+      {
+	head [cur_score] = next_col ;
+      }
+      else
+      {
+	Col [prev_col].shared4.degree_next = next_col ;
+      }
+      if (next_col != COLAMD_EMPTY)
+      {
+	Col [next_col].shared3.prev = prev_col ;
+      }
+
+      /* === Scan the column ========================================== */
+
+      cp = &A [Col [col].start] ;
+      cp_end = cp + Col [col].length ;
+      while (cp < cp_end)
+      {
+	/* get a row */
+	row = *cp++ ;
+	row_mark = Row [row].shared2.mark ;
+	/* skip if dead */
+	if (ROW_IS_MARKED_DEAD (row_mark))
+	{
+	  continue ;
+	}
+	COLAMD_ASSERT (row != pivot_row) ;
+	set_difference = row_mark - tag_mark ;
+	/* check if the row has been seen yet */
+	if (set_difference < 0)
+	{
+	  COLAMD_ASSERT (Row [row].shared1.degree <= max_deg) ;
+	  set_difference = Row [row].shared1.degree ;
+	}
+	/* subtract column thickness from this row's set difference */
+	set_difference -= col_thickness ;
+	COLAMD_ASSERT (set_difference >= 0) ;
+	/* absorb this row if the set difference becomes zero */
+	if (set_difference == 0)
+	{
+	  COLAMD_DEBUG3 (("aggressive absorption. Row: %d\n", row)) ;
+	  KILL_ROW (row) ;
+	}
+	else
+	{
+	  /* save the new mark */
+	  Row [row].shared2.mark = set_difference + tag_mark ;
+	}
+      }
+    }
+
+
+    /* === Add up set differences for each column ======================= */
+
+    COLAMD_DEBUG3 (("** Adding set differences phase. **\n")) ;
+
+    /* for each column in pivot row */
+    rp = &A [pivot_row_start] ;
+    rp_end = rp + pivot_row_length ;
+    while (rp < rp_end)
+    {
+      /* get a column */
+      col = *rp++ ;
+      COLAMD_ASSERT (COL_IS_ALIVE (col) && col != pivot_col) ;
+      hash = 0 ;
+      cur_score = 0 ;
+      cp = &A [Col [col].start] ;
+      /* compact the column */
+      new_cp = cp ;
+      cp_end = cp + Col [col].length ;
+
+      COLAMD_DEBUG4 (("Adding set diffs for Col: %d.\n", col)) ;
+
+      while (cp < cp_end)
+      {
+	/* get a row */
+	row = *cp++ ;
+	COLAMD_ASSERT(row >= 0 && row < n_row) ;
+	row_mark = Row [row].shared2.mark ;
+	/* skip if dead */
+	if (ROW_IS_MARKED_DEAD (row_mark))
+	{
+	  continue ;
+	}
+	COLAMD_ASSERT (row_mark > tag_mark) ;
+	/* compact the column */
+	*new_cp++ = row ;
+	/* compute hash function */
+	hash += row ;
+	/* add set difference */
+	cur_score += row_mark - tag_mark ;
+	/* integer overflow... */
+	cur_score = COLAMD_MIN (cur_score, n_col) ;
+      }
+
+      /* recompute the column's length */
+      Col [col].length = (Index) (new_cp - &A [Col [col].start]) ;
+
+      /* === Further mass elimination ================================= */
+
+      if (Col [col].length == 0)
+      {
+	COLAMD_DEBUG4 (("further mass elimination. Col: %d\n", col)) ;
+	/* nothing left but the pivot row in this column */
+	KILL_PRINCIPAL_COL (col) ;
+	pivot_row_degree -= Col [col].shared1.thickness ;
+	COLAMD_ASSERT (pivot_row_degree >= 0) ;
+	/* order it */
+	Col [col].shared2.order = k ;
+	/* increment order count by column thickness */
+	k += Col [col].shared1.thickness ;
+      }
+      else
+      {
+	/* === Prepare for supercolumn detection ==================== */
+
+	COLAMD_DEBUG4 (("Preparing supercol detection for Col: %d.\n", col)) ;
+
+	/* save score so far */
+	Col [col].shared2.score = cur_score ;
+
+	/* add column to hash table, for supercolumn detection */
+	hash %= n_col + 1 ;
+
+	COLAMD_DEBUG4 ((" Hash = %d, n_col = %d.\n", hash, n_col)) ;
+	COLAMD_ASSERT (hash <= n_col) ;
+
+	head_column = head [hash] ;
+	if (head_column > COLAMD_EMPTY)
+	{
+	  /* degree list "hash" is non-empty, use prev (shared3) of */
+	  /* first column in degree list as head of hash bucket */
+	  first_col = Col [head_column].shared3.headhash ;
+	  Col [head_column].shared3.headhash = col ;
+	}
+	else
+	{
+	  /* degree list "hash" is empty, use head as hash bucket */
+	  first_col = - (head_column + 2) ;
+	  head [hash] = - (col + 2) ;
+	}
+	Col [col].shared4.hash_next = first_col ;
+
+	/* save hash function in Col [col].shared3.hash */
+	Col [col].shared3.hash = (Index) hash ;
+	COLAMD_ASSERT (COL_IS_ALIVE (col)) ;
+      }
+    }
+
+    /* The approximate external column degree is now computed.  */
+
+    /* === Supercolumn detection ======================================== */
+
+    COLAMD_DEBUG3 (("** Supercolumn detection phase. **\n")) ;
+
+    Eigen::internal::detect_super_cols (Col, A, head, pivot_row_start, pivot_row_length) ;
+
+    /* === Kill the pivotal column ====================================== */
+
+    KILL_PRINCIPAL_COL (pivot_col) ;
+
+    /* === Clear mark =================================================== */
+
+    tag_mark += (max_deg + 1) ;
+    if (tag_mark >= max_mark)
+    {
+      COLAMD_DEBUG2 (("clearing tag_mark\n")) ;
+      tag_mark = Eigen::internal::clear_mark (n_row, Row) ;
+    }
+
+    /* === Finalize the new pivot row, and column scores ================ */
+
+    COLAMD_DEBUG3 (("** Finalize scores phase. **\n")) ;
+
+    /* for each column in pivot row */
+    rp = &A [pivot_row_start] ;
+    /* compact the pivot row */
+    new_rp = rp ;
+    rp_end = rp + pivot_row_length ;
+    while (rp < rp_end)
+    {
+      col = *rp++ ;
+      /* skip dead columns */
+      if (COL_IS_DEAD (col))
+      {
+	continue ;
+      }
+      *new_rp++ = col ;
+      /* add new pivot row to column */
+      A [Col [col].start + (Col [col].length++)] = pivot_row ;
+
+      /* retrieve score so far and add on pivot row's degree. */
+      /* (we wait until here for this in case the pivot */
+      /* row's degree was reduced due to mass elimination). */
+      cur_score = Col [col].shared2.score + pivot_row_degree ;
+
+      /* calculate the max possible score as the number of */
+      /* external columns minus the 'k' value minus the */
+      /* columns thickness */
+      max_score = n_col - k - Col [col].shared1.thickness ;
+
+      /* make the score the external degree of the union-of-rows */
+      cur_score -= Col [col].shared1.thickness ;
+
+      /* make sure score is less or equal than the max score */
+      cur_score = COLAMD_MIN (cur_score, max_score) ;
+      COLAMD_ASSERT (cur_score >= 0) ;
+
+      /* store updated score */
+      Col [col].shared2.score = cur_score ;
+
+      /* === Place column back in degree list ========================= */
+
+      COLAMD_ASSERT (min_score >= 0) ;
+      COLAMD_ASSERT (min_score <= n_col) ;
+      COLAMD_ASSERT (cur_score >= 0) ;
+      COLAMD_ASSERT (cur_score <= n_col) ;
+      COLAMD_ASSERT (head [cur_score] >= COLAMD_EMPTY) ;
+      next_col = head [cur_score] ;
+      Col [col].shared4.degree_next = next_col ;
+      Col [col].shared3.prev = COLAMD_EMPTY ;
+      if (next_col != COLAMD_EMPTY)
+      {
+	Col [next_col].shared3.prev = col ;
+      }
+      head [cur_score] = col ;
+
+      /* see if this score is less than current min */
+      min_score = COLAMD_MIN (min_score, cur_score) ;
+
+    }
+
+    /* === Resurrect the new pivot row ================================== */
+
+    if (pivot_row_degree > 0)
+    {
+      /* update pivot row length to reflect any cols that were killed */
+      /* during super-col detection and mass elimination */
+      Row [pivot_row].start  = pivot_row_start ;
+      Row [pivot_row].length = (Index) (new_rp - &A[pivot_row_start]) ;
+      Row [pivot_row].shared1.degree = pivot_row_degree ;
+      Row [pivot_row].shared2.mark = 0 ;
+      /* pivot row is no longer dead */
+    }
+  }
+
+  /* === All principal columns have now been ordered ====================== */
+
+  return (ngarbage) ;
+}
+
+
+/* ========================================================================== */
+/* === order_children ======================================================= */
+/* ========================================================================== */
+
+/*
+  The find_ordering routine has ordered all of the principal columns (the
+  representatives of the supercolumns).  The non-principal columns have not
+  yet been ordered.  This routine orders those columns by walking up the
+  parent tree (a column is a child of the column which absorbed it).  The
+  final permutation vector is then placed in p [0 ... n_col-1], with p [0]
+  being the first column, and p [n_col-1] being the last.  It doesn't look
+  like it at first glance, but be assured that this routine takes time linear
+  in the number of columns.  Although not immediately obvious, the time
+  taken by this routine is O (n_col), that is, linear in the number of
+  columns.  Not user-callable.
+*/
+template <typename Index>
+static inline  void order_children
+(
+  /* === Parameters ======================================================= */
+
+  Index n_col,      /* number of columns of A */
+  colamd_col<Index> Col [],    /* of size n_col+1 */
+  Index p []      /* p [0 ... n_col-1] is the column permutation*/
+  )
+{
+  /* === Local variables ================================================== */
+
+  Index i ;     /* loop counter for all columns */
+  Index c ;     /* column index */
+  Index parent ;    /* index of column's parent */
+  Index order ;     /* column's order */
+
+  /* === Order each non-principal column ================================== */
+
+  for (i = 0 ; i < n_col ; i++)
+  {
+    /* find an un-ordered non-principal column */
+    COLAMD_ASSERT (COL_IS_DEAD (i)) ;
+    if (!COL_IS_DEAD_PRINCIPAL (i) && Col [i].shared2.order == COLAMD_EMPTY)
+    {
+      parent = i ;
+      /* once found, find its principal parent */
+      do
+      {
+	parent = Col [parent].shared1.parent ;
+      } while (!COL_IS_DEAD_PRINCIPAL (parent)) ;
+
+      /* now, order all un-ordered non-principal columns along path */
+      /* to this parent.  collapse tree at the same time */
+      c = i ;
+      /* get order of parent */
+      order = Col [parent].shared2.order ;
+
+      do
+      {
+	COLAMD_ASSERT (Col [c].shared2.order == COLAMD_EMPTY) ;
+
+	/* order this column */
+	Col [c].shared2.order = order++ ;
+	/* collaps tree */
+	Col [c].shared1.parent = parent ;
+
+	/* get immediate parent of this column */
+	c = Col [c].shared1.parent ;
+
+	/* continue until we hit an ordered column.  There are */
+	/* guarranteed not to be anymore unordered columns */
+	/* above an ordered column */
+      } while (Col [c].shared2.order == COLAMD_EMPTY) ;
+
+      /* re-order the super_col parent to largest order for this group */
+      Col [parent].shared2.order = order ;
+    }
+  }
+
+  /* === Generate the permutation ========================================= */
+
+  for (c = 0 ; c < n_col ; c++)
+  {
+    p [Col [c].shared2.order] = c ;
+  }
+}
+
+
+/* ========================================================================== */
+/* === detect_super_cols ==================================================== */
+/* ========================================================================== */
+
+/*
+  Detects supercolumns by finding matches between columns in the hash buckets.
+  Check amongst columns in the set A [row_start ... row_start + row_length-1].
+  The columns under consideration are currently *not* in the degree lists,
+  and have already been placed in the hash buckets.
+
+  The hash bucket for columns whose hash function is equal to h is stored
+  as follows:
+
+  if head [h] is >= 0, then head [h] contains a degree list, so:
+
+  head [h] is the first column in degree bucket h.
+  Col [head [h]].headhash gives the first column in hash bucket h.
+
+  otherwise, the degree list is empty, and:
+
+  -(head [h] + 2) is the first column in hash bucket h.
+
+  For a column c in a hash bucket, Col [c].shared3.prev is NOT a "previous
+  column" pointer.  Col [c].shared3.hash is used instead as the hash number
+  for that column.  The value of Col [c].shared4.hash_next is the next column
+  in the same hash bucket.
+
+  Assuming no, or "few" hash collisions, the time taken by this routine is
+  linear in the sum of the sizes (lengths) of each column whose score has
+  just been computed in the approximate degree computation.
+  Not user-callable.
+*/
+template <typename Index>
+static void detect_super_cols
+(
+  /* === Parameters ======================================================= */
+  
+  colamd_col<Index> Col [],    /* of size n_col+1 */
+  Index A [],     /* row indices of A */
+  Index head [],    /* head of degree lists and hash buckets */
+  Index row_start,    /* pointer to set of columns to check */
+  Index row_length    /* number of columns to check */
+)
+{
+  /* === Local variables ================================================== */
+
+  Index hash ;      /* hash value for a column */
+  Index *rp ;     /* pointer to a row */
+  Index c ;     /* a column index */
+  Index super_c ;   /* column index of the column to absorb into */
+  Index *cp1 ;      /* column pointer for column super_c */
+  Index *cp2 ;      /* column pointer for column c */
+  Index length ;    /* length of column super_c */
+  Index prev_c ;    /* column preceding c in hash bucket */
+  Index i ;     /* loop counter */
+  Index *rp_end ;   /* pointer to the end of the row */
+  Index col ;     /* a column index in the row to check */
+  Index head_column ;   /* first column in hash bucket or degree list */
+  Index first_col ;   /* first column in hash bucket */
+
+  /* === Consider each column in the row ================================== */
+
+  rp = &A [row_start] ;
+  rp_end = rp + row_length ;
+  while (rp < rp_end)
+  {
+    col = *rp++ ;
+    if (COL_IS_DEAD (col))
+    {
+      continue ;
+    }
+
+    /* get hash number for this column */
+    hash = Col [col].shared3.hash ;
+    COLAMD_ASSERT (hash <= n_col) ;
+
+    /* === Get the first column in this hash bucket ===================== */
+
+    head_column = head [hash] ;
+    if (head_column > COLAMD_EMPTY)
+    {
+      first_col = Col [head_column].shared3.headhash ;
+    }
+    else
+    {
+      first_col = - (head_column + 2) ;
+    }
+
+    /* === Consider each column in the hash bucket ====================== */
+
+    for (super_c = first_col ; super_c != COLAMD_EMPTY ;
+	 super_c = Col [super_c].shared4.hash_next)
+    {
+      COLAMD_ASSERT (COL_IS_ALIVE (super_c)) ;
+      COLAMD_ASSERT (Col [super_c].shared3.hash == hash) ;
+      length = Col [super_c].length ;
+
+      /* prev_c is the column preceding column c in the hash bucket */
+      prev_c = super_c ;
+
+      /* === Compare super_c with all columns after it ================ */
+
+      for (c = Col [super_c].shared4.hash_next ;
+	   c != COLAMD_EMPTY ; c = Col [c].shared4.hash_next)
+      {
+	COLAMD_ASSERT (c != super_c) ;
+	COLAMD_ASSERT (COL_IS_ALIVE (c)) ;
+	COLAMD_ASSERT (Col [c].shared3.hash == hash) ;
+
+	/* not identical if lengths or scores are different */
+	if (Col [c].length != length ||
+	    Col [c].shared2.score != Col [super_c].shared2.score)
+	{
+	  prev_c = c ;
+	  continue ;
+	}
+
+	/* compare the two columns */
+	cp1 = &A [Col [super_c].start] ;
+	cp2 = &A [Col [c].start] ;
+
+	for (i = 0 ; i < length ; i++)
+	{
+	  /* the columns are "clean" (no dead rows) */
+	  COLAMD_ASSERT (ROW_IS_ALIVE (*cp1))  ;
+	  COLAMD_ASSERT (ROW_IS_ALIVE (*cp2))  ;
+	  /* row indices will same order for both supercols, */
+	  /* no gather scatter nessasary */
+	  if (*cp1++ != *cp2++)
+	  {
+	    break ;
+	  }
+	}
+
+	/* the two columns are different if the for-loop "broke" */
+	if (i != length)
+	{
+	  prev_c = c ;
+	  continue ;
+	}
+
+	/* === Got it!  two columns are identical =================== */
+
+	COLAMD_ASSERT (Col [c].shared2.score == Col [super_c].shared2.score) ;
+
+	Col [super_c].shared1.thickness += Col [c].shared1.thickness ;
+	Col [c].shared1.parent = super_c ;
+	KILL_NON_PRINCIPAL_COL (c) ;
+	/* order c later, in order_children() */
+	Col [c].shared2.order = COLAMD_EMPTY ;
+	/* remove c from hash bucket */
+	Col [prev_c].shared4.hash_next = Col [c].shared4.hash_next ;
+      }
+    }
+
+    /* === Empty this hash bucket ======================================= */
+
+    if (head_column > COLAMD_EMPTY)
+    {
+      /* corresponding degree list "hash" is not empty */
+      Col [head_column].shared3.headhash = COLAMD_EMPTY ;
+    }
+    else
+    {
+      /* corresponding degree list "hash" is empty */
+      head [hash] = COLAMD_EMPTY ;
+    }
+  }
+}
+
+
+/* ========================================================================== */
+/* === garbage_collection =================================================== */
+/* ========================================================================== */
+
+/*
+  Defragments and compacts columns and rows in the workspace A.  Used when
+  all avaliable memory has been used while performing row merging.  Returns
+  the index of the first free position in A, after garbage collection.  The
+  time taken by this routine is linear is the size of the array A, which is
+  itself linear in the number of nonzeros in the input matrix.
+  Not user-callable.
+*/
+template <typename Index>
+static Index garbage_collection  /* returns the new value of pfree */
+  (
+    /* === Parameters ======================================================= */
+    
+    Index n_row,      /* number of rows */
+    Index n_col,      /* number of columns */
+    Colamd_Row<Index> Row [],    /* row info */
+    colamd_col<Index> Col [],    /* column info */
+    Index A [],     /* A [0 ... Alen-1] holds the matrix */
+    Index *pfree      /* &A [0] ... pfree is in use */
+    )
+{
+  /* === Local variables ================================================== */
+
+  Index *psrc ;     /* source pointer */
+  Index *pdest ;    /* destination pointer */
+  Index j ;     /* counter */
+  Index r ;     /* a row index */
+  Index c ;     /* a column index */
+  Index length ;    /* length of a row or column */
+
+  /* === Defragment the columns =========================================== */
+
+  pdest = &A[0] ;
+  for (c = 0 ; c < n_col ; c++)
+  {
+    if (COL_IS_ALIVE (c))
+    {
+      psrc = &A [Col [c].start] ;
+
+      /* move and compact the column */
+      COLAMD_ASSERT (pdest <= psrc) ;
+      Col [c].start = (Index) (pdest - &A [0]) ;
+      length = Col [c].length ;
+      for (j = 0 ; j < length ; j++)
+      {
+	r = *psrc++ ;
+	if (ROW_IS_ALIVE (r))
+	{
+	  *pdest++ = r ;
+	}
+      }
+      Col [c].length = (Index) (pdest - &A [Col [c].start]) ;
+    }
+  }
+
+  /* === Prepare to defragment the rows =================================== */
+
+  for (r = 0 ; r < n_row ; r++)
+  {
+    if (ROW_IS_ALIVE (r))
+    {
+      if (Row [r].length == 0)
+      {
+	/* this row is of zero length.  cannot compact it, so kill it */
+	COLAMD_DEBUG3 (("Defrag row kill\n")) ;
+	KILL_ROW (r) ;
+      }
+      else
+      {
+	/* save first column index in Row [r].shared2.first_column */
+	psrc = &A [Row [r].start] ;
+	Row [r].shared2.first_column = *psrc ;
+	COLAMD_ASSERT (ROW_IS_ALIVE (r)) ;
+	/* flag the start of the row with the one's complement of row */
+	*psrc = ONES_COMPLEMENT (r) ;
+
+      }
+    }
+  }
+
+  /* === Defragment the rows ============================================== */
+
+  psrc = pdest ;
+  while (psrc < pfree)
+  {
+    /* find a negative number ... the start of a row */
+    if (*psrc++ < 0)
+    {
+      psrc-- ;
+      /* get the row index */
+      r = ONES_COMPLEMENT (*psrc) ;
+      COLAMD_ASSERT (r >= 0 && r < n_row) ;
+      /* restore first column index */
+      *psrc = Row [r].shared2.first_column ;
+      COLAMD_ASSERT (ROW_IS_ALIVE (r)) ;
+
+      /* move and compact the row */
+      COLAMD_ASSERT (pdest <= psrc) ;
+      Row [r].start = (Index) (pdest - &A [0]) ;
+      length = Row [r].length ;
+      for (j = 0 ; j < length ; j++)
+      {
+	c = *psrc++ ;
+	if (COL_IS_ALIVE (c))
+	{
+	  *pdest++ = c ;
+	}
+      }
+      Row [r].length = (Index) (pdest - &A [Row [r].start]) ;
+
+    }
+  }
+  /* ensure we found all the rows */
+  COLAMD_ASSERT (debug_rows == 0) ;
+
+  /* === Return the new value of pfree ==================================== */
+
+  return ((Index) (pdest - &A [0])) ;
+}
+
+
+/* ========================================================================== */
+/* === clear_mark =========================================================== */
+/* ========================================================================== */
+
+/*
+  Clears the Row [].shared2.mark array, and returns the new tag_mark.
+  Return value is the new tag_mark.  Not user-callable.
+*/
+template <typename Index>
+static inline  Index clear_mark  /* return the new value for tag_mark */
+  (
+      /* === Parameters ======================================================= */
+
+    Index n_row,    /* number of rows in A */
+    Colamd_Row<Index> Row [] /* Row [0 ... n_row-1].shared2.mark is set to zero */
+    )
+{
+  /* === Local variables ================================================== */
+
+  Index r ;
+
+  for (r = 0 ; r < n_row ; r++)
+  {
+    if (ROW_IS_ALIVE (r))
+    {
+      Row [r].shared2.mark = 0 ;
+    }
+  }
+  return (1) ;
+}
+
+
+} // namespace internal 
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Ordering.h b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Ordering.h
new file mode 100644
index 0000000..b4da653
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/OrderingMethods/Ordering.h
@@ -0,0 +1,150 @@
+ 
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012  Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_ORDERING_H
+#define EIGEN_ORDERING_H
+
+namespace Eigen {
+  
+#include "Eigen_Colamd.h"
+
+namespace internal {
+    
+/** \internal
+  * \ingroup OrderingMethods_Module
+  * \returns the symmetric pattern A^T+A from the input matrix A. 
+  * FIXME: The values should not be considered here
+  */
+template<typename MatrixType> 
+void ordering_helper_at_plus_a(const MatrixType& mat, MatrixType& symmat)
+{
+  MatrixType C;
+  C = mat.transpose(); // NOTE: Could be  costly
+  for (int i = 0; i < C.rows(); i++) 
+  {
+      for (typename MatrixType::InnerIterator it(C, i); it; ++it)
+        it.valueRef() = 0.0;
+  }
+  symmat = C + mat; 
+}
+    
+}
+
+#ifndef EIGEN_MPL2_ONLY
+
+/** \ingroup OrderingMethods_Module
+  * \class AMDOrdering
+  *
+  * Functor computing the \em approximate \em minimum \em degree ordering
+  * If the matrix is not structurally symmetric, an ordering of A^T+A is computed
+  * \tparam  Index The type of indices of the matrix 
+  * \sa COLAMDOrdering
+  */
+template <typename Index>
+class AMDOrdering
+{
+  public:
+    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;
+    
+    /** Compute the permutation vector from a sparse matrix
+     * This routine is much faster if the input matrix is column-major     
+     */
+    template <typename MatrixType>
+    void operator()(const MatrixType& mat, PermutationType& perm)
+    {
+      // Compute the symmetric pattern
+      SparseMatrix<typename MatrixType::Scalar, ColMajor, Index> symm;
+      internal::ordering_helper_at_plus_a(mat,symm); 
+    
+      // Call the AMD routine 
+      //m_mat.prune(keep_diag());
+      internal::minimum_degree_ordering(symm, perm);
+    }
+    
+    /** Compute the permutation with a selfadjoint matrix */
+    template <typename SrcType, unsigned int SrcUpLo> 
+    void operator()(const SparseSelfAdjointView<SrcType, SrcUpLo>& mat, PermutationType& perm)
+    { 
+      SparseMatrix<typename SrcType::Scalar, ColMajor, Index> C; C = mat;
+      
+      // Call the AMD routine 
+      // m_mat.prune(keep_diag()); //Remove the diagonal elements 
+      internal::minimum_degree_ordering(C, perm);
+    }
+};
+
+#endif // EIGEN_MPL2_ONLY
+
+/** \ingroup OrderingMethods_Module
+  * \class NaturalOrdering
+  *
+  * Functor computing the natural ordering (identity)
+  * 
+  * \note Returns an empty permutation matrix
+  * \tparam  Index The type of indices of the matrix 
+  */
+template <typename Index>
+class NaturalOrdering
+{
+  public:
+    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;
+    
+    /** Compute the permutation vector from a column-major sparse matrix */
+    template <typename MatrixType>
+    void operator()(const MatrixType& /*mat*/, PermutationType& perm)
+    {
+      perm.resize(0); 
+    }
+    
+};
+
+/** \ingroup OrderingMethods_Module
+  * \class COLAMDOrdering
+  *
+  * Functor computing the \em column \em approximate \em minimum \em degree ordering 
+  * The matrix should be in column-major format
+  */
+template<typename Index>
+class COLAMDOrdering
+{
+  public:
+    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType; 
+    typedef Matrix<Index, Dynamic, 1> IndexVector;
+    
+    /** Compute the permutation vector form a sparse matrix */
+    template <typename MatrixType>
+    void operator() (const MatrixType& mat, PermutationType& perm)
+    {
+      Index m = mat.rows();
+      Index n = mat.cols();
+      Index nnz = mat.nonZeros();
+      // Get the recommended value of Alen to be used by colamd
+      Index Alen = internal::colamd_recommended(nnz, m, n); 
+      // Set the default parameters
+      double knobs [COLAMD_KNOBS]; 
+      Index stats [COLAMD_STATS];
+      internal::colamd_set_defaults(knobs);
+      
+      Index info;
+      IndexVector p(n+1), A(Alen); 
+      for(Index i=0; i <= n; i++)   p(i) = mat.outerIndexPtr()[i];
+      for(Index i=0; i < nnz; i++)  A(i) = mat.innerIndexPtr()[i];
+      // Call Colamd routine to compute the ordering 
+      info = internal::colamd(m, n, Alen, A.data(), p.data(), knobs, stats); 
+      eigen_assert( info && "COLAMD failed " );
+      
+      perm.resize(n);
+      for (Index i = 0; i < n; i++) perm.indices()(p(i)) = i;
+    }
+};
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/CMakeLists.txt
new file mode 100644
index 0000000..28c657e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_PastixSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_PastixSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/PaStiXSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/PaStiXSupport.h b/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/PaStiXSupport.h
new file mode 100644
index 0000000..a955287
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/PaStiXSupport/PaStiXSupport.h
@@ -0,0 +1,721 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_PASTIXSUPPORT_H
+#define EIGEN_PASTIXSUPPORT_H
+
+namespace Eigen { 
+
+/** \ingroup PaStiXSupport_Module
+  * \brief Interface to the PaStix solver
+  * 
+  * This class is used to solve the linear systems A.X = B via the PaStix library. 
+  * The matrix can be either real or complex, symmetric or not.
+  *
+  * \sa TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType, bool IsStrSym = false> class PastixLU;
+template<typename _MatrixType, int Options> class PastixLLT;
+template<typename _MatrixType, int Options> class PastixLDLT;
+
+namespace internal
+{
+    
+  template<class Pastix> struct pastix_traits;
+
+  template<typename _MatrixType>
+  struct pastix_traits< PastixLU<_MatrixType> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;
+  };
+
+  template<typename _MatrixType, int Options>
+  struct pastix_traits< PastixLLT<_MatrixType,Options> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;
+  };
+
+  template<typename _MatrixType, int Options>
+  struct pastix_traits< PastixLDLT<_MatrixType,Options> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;
+  };
+  
+  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, float *vals, int *perm, int * invp, float *x, int nbrhs, int *iparm, double *dparm)
+  {
+    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
+    if (nbrhs == 0) {x = NULL; nbrhs=1;}
+    s_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
+  }
+  
+  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, double *vals, int *perm, int * invp, double *x, int nbrhs, int *iparm, double *dparm)
+  {
+    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
+    if (nbrhs == 0) {x = NULL; nbrhs=1;}
+    d_pastix(pastix_data, pastix_comm, n, ptr, idx, vals, perm, invp, x, nbrhs, iparm, dparm); 
+  }
+  
+  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<float> *vals, int *perm, int * invp, std::complex<float> *x, int nbrhs, int *iparm, double *dparm)
+  {
+    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
+    if (nbrhs == 0) {x = NULL; nbrhs=1;}
+    c_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<COMPLEX*>(vals), perm, invp, reinterpret_cast<COMPLEX*>(x), nbrhs, iparm, dparm); 
+  }
+  
+  void eigen_pastix(pastix_data_t **pastix_data, int pastix_comm, int n, int *ptr, int *idx, std::complex<double> *vals, int *perm, int * invp, std::complex<double> *x, int nbrhs, int *iparm, double *dparm)
+  {
+    if (n == 0) { ptr = NULL; idx = NULL; vals = NULL; }
+    if (nbrhs == 0) {x = NULL; nbrhs=1;}
+    z_pastix(pastix_data, pastix_comm, n, ptr, idx, reinterpret_cast<DCOMPLEX*>(vals), perm, invp, reinterpret_cast<DCOMPLEX*>(x), nbrhs, iparm, dparm); 
+  }
+
+  // Convert the matrix  to Fortran-style Numbering
+  template <typename MatrixType>
+  void c_to_fortran_numbering (MatrixType& mat)
+  {
+    if ( !(mat.outerIndexPtr()[0]) ) 
+    { 
+      int i;
+      for(i = 0; i <= mat.rows(); ++i)
+        ++mat.outerIndexPtr()[i];
+      for(i = 0; i < mat.nonZeros(); ++i)
+        ++mat.innerIndexPtr()[i];
+    }
+  }
+  
+  // Convert to C-style Numbering
+  template <typename MatrixType>
+  void fortran_to_c_numbering (MatrixType& mat)
+  {
+    // Check the Numbering
+    if ( mat.outerIndexPtr()[0] == 1 ) 
+    { // Convert to C-style numbering
+      int i;
+      for(i = 0; i <= mat.rows(); ++i)
+        --mat.outerIndexPtr()[i];
+      for(i = 0; i < mat.nonZeros(); ++i)
+        --mat.innerIndexPtr()[i];
+    }
+  }
+}
+
+// This is the base class to interface with PaStiX functions. 
+// Users should not used this class directly. 
+template <class Derived>
+class PastixBase : internal::noncopyable
+{
+  public:
+    typedef typename internal::pastix_traits<Derived>::MatrixType _MatrixType;
+    typedef _MatrixType MatrixType;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar,Dynamic,1> Vector;
+    typedef SparseMatrix<Scalar, ColMajor> ColSpMatrix;
+    
+  public:
+    
+    PastixBase() : m_initisOk(false), m_analysisIsOk(false), m_factorizationIsOk(false), m_isInitialized(false), m_pastixdata(0), m_size(0)
+    {
+      init();
+    }
+    
+    ~PastixBase() 
+    {
+      clean();
+    }
+
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<PastixBase, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "Pastix solver is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "PastixBase::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<PastixBase, Rhs>(*this, b.derived());
+    }
+    
+    template<typename Rhs,typename Dest>
+    bool _solve (const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const;
+    
+    Derived& derived()
+    {
+      return *static_cast<Derived*>(this);
+    }
+    const Derived& derived() const
+    {
+      return *static_cast<const Derived*>(this);
+    }
+
+    /** Returns a reference to the integer vector IPARM of PaStiX parameters
+      * to modify the default parameters. 
+      * The statistics related to the different phases of factorization and solve are saved here as well
+      * \sa analyzePattern() factorize()
+      */
+    Array<Index,IPARM_SIZE,1>& iparm()
+    {
+      return m_iparm; 
+    }
+    
+    /** Return a reference to a particular index parameter of the IPARM vector 
+     * \sa iparm()
+     */
+    
+    int& iparm(int idxparam)
+    {
+      return m_iparm(idxparam);
+    }
+    
+     /** Returns a reference to the double vector DPARM of PaStiX parameters 
+      * The statistics related to the different phases of factorization and solve are saved here as well
+      * \sa analyzePattern() factorize()
+      */
+    Array<RealScalar,IPARM_SIZE,1>& dparm()
+    {
+      return m_dparm; 
+    }
+    
+    
+    /** Return a reference to a particular index parameter of the DPARM vector 
+     * \sa dparm()
+     */
+    double& dparm(int idxparam)
+    {
+      return m_dparm(idxparam);
+    }
+    
+    inline Index cols() const { return m_size; }
+    inline Index rows() const { return m_size; }
+    
+     /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the PaStiX reports a problem
+      *          \c InvalidInput if the input matrix is invalid
+      *
+      * \sa iparm()          
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<PastixBase, Rhs>
+    solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "Pastix LU, LLT or LDLT is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "PastixBase::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<PastixBase, Rhs>(*this, b.derived());
+    }
+    
+  protected:
+
+    // Initialize the Pastix data structure, check the matrix
+    void init(); 
+    
+    // Compute the ordering and the symbolic factorization
+    void analyzePattern(ColSpMatrix& mat);
+    
+    // Compute the numerical factorization
+    void factorize(ColSpMatrix& mat);
+    
+    // Free all the data allocated by Pastix
+    void clean()
+    {
+      eigen_assert(m_initisOk && "The Pastix structure should be allocated first"); 
+      m_iparm(IPARM_START_TASK) = API_TASK_CLEAN;
+      m_iparm(IPARM_END_TASK) = API_TASK_CLEAN;
+      internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,
+                             m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
+    }
+    
+    void compute(ColSpMatrix& mat);
+    
+    int m_initisOk; 
+    int m_analysisIsOk;
+    int m_factorizationIsOk;
+    bool m_isInitialized;
+    mutable ComputationInfo m_info; 
+    mutable pastix_data_t *m_pastixdata; // Data structure for pastix
+    mutable int m_comm; // The MPI communicator identifier
+    mutable Matrix<int,IPARM_SIZE,1> m_iparm; // integer vector for the input parameters
+    mutable Matrix<double,DPARM_SIZE,1> m_dparm; // Scalar vector for the input parameters
+    mutable Matrix<Index,Dynamic,1> m_perm;  // Permutation vector
+    mutable Matrix<Index,Dynamic,1> m_invp;  // Inverse permutation vector
+    mutable int m_size; // Size of the matrix 
+}; 
+
+ /** Initialize the PaStiX data structure. 
+   *A first call to this function fills iparm and dparm with the default PaStiX parameters
+   * \sa iparm() dparm()
+   */
+template <class Derived>
+void PastixBase<Derived>::init()
+{
+  m_size = 0; 
+  m_iparm.setZero(IPARM_SIZE);
+  m_dparm.setZero(DPARM_SIZE);
+  
+  m_iparm(IPARM_MODIFY_PARAMETER) = API_NO;
+  pastix(&m_pastixdata, MPI_COMM_WORLD,
+         0, 0, 0, 0,
+         0, 0, 0, 1, m_iparm.data(), m_dparm.data());
+  
+  m_iparm[IPARM_MATRIX_VERIFICATION] = API_NO;
+  m_iparm[IPARM_VERBOSE]             = 2;
+  m_iparm[IPARM_ORDERING]            = API_ORDER_SCOTCH;
+  m_iparm[IPARM_INCOMPLETE]          = API_NO;
+  m_iparm[IPARM_OOC_LIMIT]           = 2000;
+  m_iparm[IPARM_RHS_MAKING]          = API_RHS_B;
+  m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
+  
+  m_iparm(IPARM_START_TASK) = API_TASK_INIT;
+  m_iparm(IPARM_END_TASK) = API_TASK_INIT;
+  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, 0, 0, 0, (Scalar*)0,
+                         0, 0, 0, 0, m_iparm.data(), m_dparm.data());
+  
+  // Check the returned error
+  if(m_iparm(IPARM_ERROR_NUMBER)) {
+    m_info = InvalidInput;
+    m_initisOk = false;
+  }
+  else { 
+    m_info = Success;
+    m_initisOk = true;
+  }
+}
+
+template <class Derived>
+void PastixBase<Derived>::compute(ColSpMatrix& mat)
+{
+  eigen_assert(mat.rows() == mat.cols() && "The input matrix should be squared");
+  
+  analyzePattern(mat);  
+  factorize(mat);
+  
+  m_iparm(IPARM_MATRIX_VERIFICATION) = API_NO;
+  m_isInitialized = m_factorizationIsOk;
+}
+
+
+template <class Derived>
+void PastixBase<Derived>::analyzePattern(ColSpMatrix& mat)
+{                         
+  eigen_assert(m_initisOk && "The initialization of PaSTiX failed");
+  
+  // clean previous calls
+  if(m_size>0)
+    clean();
+  
+  m_size = mat.rows();
+  m_perm.resize(m_size);
+  m_invp.resize(m_size);
+  
+  m_iparm(IPARM_START_TASK) = API_TASK_ORDERING;
+  m_iparm(IPARM_END_TASK) = API_TASK_ANALYSE;
+  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),
+               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
+  
+  // Check the returned error
+  if(m_iparm(IPARM_ERROR_NUMBER))
+  {
+    m_info = NumericalIssue;
+    m_analysisIsOk = false;
+  }
+  else
+  { 
+    m_info = Success;
+    m_analysisIsOk = true;
+  }
+}
+
+template <class Derived>
+void PastixBase<Derived>::factorize(ColSpMatrix& mat)
+{
+//   if(&m_cpyMat != &mat) m_cpyMat = mat;
+  eigen_assert(m_analysisIsOk && "The analysis phase should be called before the factorization phase");
+  m_iparm(IPARM_START_TASK) = API_TASK_NUMFACT;
+  m_iparm(IPARM_END_TASK) = API_TASK_NUMFACT;
+  m_size = mat.rows();
+  
+  internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, m_size, mat.outerIndexPtr(), mat.innerIndexPtr(),
+               mat.valuePtr(), m_perm.data(), m_invp.data(), 0, 0, m_iparm.data(), m_dparm.data());
+  
+  // Check the returned error
+  if(m_iparm(IPARM_ERROR_NUMBER))
+  {
+    m_info = NumericalIssue;
+    m_factorizationIsOk = false;
+    m_isInitialized = false;
+  }
+  else
+  {
+    m_info = Success;
+    m_factorizationIsOk = true;
+    m_isInitialized = true;
+  }
+}
+
+/* Solve the system */
+template<typename Base>
+template<typename Rhs,typename Dest>
+bool PastixBase<Base>::_solve (const MatrixBase<Rhs> &b, MatrixBase<Dest> &x) const
+{
+  eigen_assert(m_isInitialized && "The matrix should be factorized first");
+  EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
+                     THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+  int rhs = 1;
+  
+  x = b; /* on return, x is overwritten by the computed solution */
+  
+  for (int i = 0; i < b.cols(); i++){
+    m_iparm[IPARM_START_TASK]          = API_TASK_SOLVE;
+    m_iparm[IPARM_END_TASK]            = API_TASK_REFINE;
+  
+    internal::eigen_pastix(&m_pastixdata, MPI_COMM_WORLD, x.rows(), 0, 0, 0,
+                           m_perm.data(), m_invp.data(), &x(0, i), rhs, m_iparm.data(), m_dparm.data());
+  }
+  
+  // Check the returned error
+  m_info = m_iparm(IPARM_ERROR_NUMBER)==0 ? Success : NumericalIssue;
+  
+  return m_iparm(IPARM_ERROR_NUMBER)==0;
+}
+
+/** \ingroup PaStiXSupport_Module
+  * \class PastixLU
+  * \brief Sparse direct LU solver based on PaStiX library
+  * 
+  * This class is used to solve the linear systems A.X = B with a supernodal LU 
+  * factorization in the PaStiX library. The matrix A should be squared and nonsingular
+  * PaStiX requires that the matrix A has a symmetric structural pattern. 
+  * This interface can symmetrize the input matrix otherwise. 
+  * The vectors or matrices X and B can be either dense or sparse.
+  * 
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam IsStrSym Indicates if the input matrix has a symmetric pattern, default is false
+  * NOTE : Note that if the analysis and factorization phase are called separately, 
+  * the input matrix will be symmetrized at each call, hence it is advised to 
+  * symmetrize the matrix in a end-user program and set \p IsStrSym to true
+  * 
+  * \sa \ref TutorialSparseDirectSolvers
+  * 
+  */
+template<typename _MatrixType, bool IsStrSym>
+class PastixLU : public PastixBase< PastixLU<_MatrixType> >
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef PastixBase<PastixLU<MatrixType> > Base;
+    typedef typename Base::ColSpMatrix ColSpMatrix;
+    typedef typename MatrixType::Index Index;
+    
+  public:
+    PastixLU() : Base()
+    {
+      init();
+    }
+    
+    PastixLU(const MatrixType& matrix):Base()
+    {
+      init();
+      compute(matrix);
+    }
+    /** Compute the LU supernodal factorization of \p matrix. 
+      * iparm and dparm can be used to tune the PaStiX parameters. 
+      * see the PaStiX user's manual
+      * \sa analyzePattern() factorize()
+      */
+    void compute (const MatrixType& matrix)
+    {
+      m_structureIsUptodate = false;
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::compute(temp);
+    }
+    /** Compute the LU symbolic factorization of \p matrix using its sparsity pattern. 
+      * Several ordering methods can be used at this step. See the PaStiX user's manual. 
+      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      m_structureIsUptodate = false;
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::analyzePattern(temp);
+    }
+
+    /** Compute the LU supernodal factorization of \p matrix
+      * WARNING The matrix \p matrix should have the same structural pattern 
+      * as the same used in the analysis phase.
+      * \sa analyzePattern()
+      */ 
+    void factorize(const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::factorize(temp);
+    }
+  protected:
+    
+    void init()
+    {
+      m_structureIsUptodate = false;
+      m_iparm(IPARM_SYM) = API_SYM_NO;
+      m_iparm(IPARM_FACTORIZATION) = API_FACT_LU;
+    }
+    
+    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
+    {
+      if(IsStrSym)
+        out = matrix;
+      else
+      {
+        if(!m_structureIsUptodate)
+        {
+          // update the transposed structure
+          m_transposedStructure = matrix.transpose();
+          
+          // Set the elements of the matrix to zero 
+          for (Index j=0; j<m_transposedStructure.outerSize(); ++j) 
+            for(typename ColSpMatrix::InnerIterator it(m_transposedStructure, j); it; ++it)
+              it.valueRef() = 0.0;
+
+          m_structureIsUptodate = true;
+        }
+        
+        out = m_transposedStructure + matrix;
+      }
+      internal::c_to_fortran_numbering(out);
+    }
+    
+    using Base::m_iparm;
+    using Base::m_dparm;
+    
+    ColSpMatrix m_transposedStructure;
+    bool m_structureIsUptodate;
+};
+
+/** \ingroup PaStiXSupport_Module
+  * \class PastixLLT
+  * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
+  * 
+  * This class is used to solve the linear systems A.X = B via a LL^T supernodal Cholesky factorization
+  * available in the PaStiX library. The matrix A should be symmetric and positive definite
+  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
+  * The vectors or matrices X and B can be either dense or sparse
+  * 
+  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
+  * 
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType, int _UpLo>
+class PastixLLT : public PastixBase< PastixLLT<_MatrixType, _UpLo> >
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef PastixBase<PastixLLT<MatrixType, _UpLo> > Base;
+    typedef typename Base::ColSpMatrix ColSpMatrix;
+    
+  public:
+    enum { UpLo = _UpLo };
+    PastixLLT() : Base()
+    {
+      init();
+    }
+    
+    PastixLLT(const MatrixType& matrix):Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    /** Compute the L factor of the LL^T supernodal factorization of \p matrix 
+      * \sa analyzePattern() factorize()
+      */
+    void compute (const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::compute(temp);
+    }
+
+     /** Compute the LL^T symbolic factorization of \p matrix using its sparsity pattern
+      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::analyzePattern(temp);
+    }
+      /** Compute the LL^T supernodal numerical factorization of \p matrix 
+        * \sa analyzePattern()
+        */
+    void factorize(const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::factorize(temp);
+    }
+  protected:
+    using Base::m_iparm;
+    
+    void init()
+    {
+      m_iparm(IPARM_SYM) = API_SYM_YES;
+      m_iparm(IPARM_FACTORIZATION) = API_FACT_LLT;
+    }
+    
+    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
+    {
+      // Pastix supports only lower, column-major matrices 
+      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
+      internal::c_to_fortran_numbering(out);
+    }
+};
+
+/** \ingroup PaStiXSupport_Module
+  * \class PastixLDLT
+  * \brief A sparse direct supernodal Cholesky (LLT) factorization and solver based on the PaStiX library
+  * 
+  * This class is used to solve the linear systems A.X = B via a LDL^T supernodal Cholesky factorization
+  * available in the PaStiX library. The matrix A should be symmetric and positive definite
+  * WARNING Selfadjoint complex matrices are not supported in the current version of PaStiX
+  * The vectors or matrices X and B can be either dense or sparse
+  * 
+  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam UpLo The part of the matrix to use : Lower or Upper. The default is Lower as required by PaStiX
+  * 
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType, int _UpLo>
+class PastixLDLT : public PastixBase< PastixLDLT<_MatrixType, _UpLo> >
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef PastixBase<PastixLDLT<MatrixType, _UpLo> > Base; 
+    typedef typename Base::ColSpMatrix ColSpMatrix;
+    
+  public:
+    enum { UpLo = _UpLo };
+    PastixLDLT():Base()
+    {
+      init();
+    }
+    
+    PastixLDLT(const MatrixType& matrix):Base()
+    {
+      init();
+      compute(matrix);
+    }
+
+    /** Compute the L and D factors of the LDL^T factorization of \p matrix 
+      * \sa analyzePattern() factorize()
+      */
+    void compute (const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::compute(temp);
+    }
+
+    /** Compute the LDL^T symbolic factorization of \p matrix using its sparsity pattern
+      * The result of this operation can be used with successive matrices having the same pattern as \p matrix
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    { 
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::analyzePattern(temp);
+    }
+    /** Compute the LDL^T supernodal numerical factorization of \p matrix 
+      * 
+      */
+    void factorize(const MatrixType& matrix)
+    {
+      ColSpMatrix temp;
+      grabMatrix(matrix, temp);
+      Base::factorize(temp);
+    }
+
+  protected:
+    using Base::m_iparm;
+    
+    void init()
+    {
+      m_iparm(IPARM_SYM) = API_SYM_YES;
+      m_iparm(IPARM_FACTORIZATION) = API_FACT_LDLT;
+    }
+    
+    void grabMatrix(const MatrixType& matrix, ColSpMatrix& out)
+    {
+      // Pastix supports only lower, column-major matrices 
+      out.template selfadjointView<Lower>() = matrix.template selfadjointView<UpLo>();
+      internal::c_to_fortran_numbering(out);
+    }
+};
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<PastixBase<_MatrixType>, Rhs>
+  : solve_retval_base<PastixBase<_MatrixType>, Rhs>
+{
+  typedef PastixBase<_MatrixType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+template<typename _MatrixType, typename Rhs>
+struct sparse_solve_retval<PastixBase<_MatrixType>, Rhs>
+  : sparse_solve_retval_base<PastixBase<_MatrixType>, Rhs>
+{
+  typedef PastixBase<_MatrixType> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/CMakeLists.txt
new file mode 100644
index 0000000..a097ab4
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_PardisoSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_PardisoSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/PardisoSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/PardisoSupport.h b/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/PardisoSupport.h
new file mode 100644
index 0000000..1c48f0d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/PardisoSupport/PardisoSupport.h
@@ -0,0 +1,592 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL PARDISO
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_PARDISOSUPPORT_H
+#define EIGEN_PARDISOSUPPORT_H
+
+namespace Eigen { 
+
+template<typename _MatrixType> class PardisoLU;
+template<typename _MatrixType, int Options=Upper> class PardisoLLT;
+template<typename _MatrixType, int Options=Upper> class PardisoLDLT;
+
+namespace internal
+{
+  template<typename Index>
+  struct pardiso_run_selector
+  {
+    static Index run( _MKL_DSS_HANDLE_t pt, Index maxfct, Index mnum, Index type, Index phase, Index n, void *a,
+                      Index *ia, Index *ja, Index *perm, Index nrhs, Index *iparm, Index msglvl, void *b, void *x)
+    {
+      Index error = 0;
+      ::pardiso(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
+      return error;
+    }
+  };
+  template<>
+  struct pardiso_run_selector<long long int>
+  {
+    typedef long long int Index;
+    static Index run( _MKL_DSS_HANDLE_t pt, Index maxfct, Index mnum, Index type, Index phase, Index n, void *a,
+                      Index *ia, Index *ja, Index *perm, Index nrhs, Index *iparm, Index msglvl, void *b, void *x)
+    {
+      Index error = 0;
+      ::pardiso_64(pt, &maxfct, &mnum, &type, &phase, &n, a, ia, ja, perm, &nrhs, iparm, &msglvl, b, x, &error);
+      return error;
+    }
+  };
+
+  template<class Pardiso> struct pardiso_traits;
+
+  template<typename _MatrixType>
+  struct pardiso_traits< PardisoLU<_MatrixType> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;
+  };
+
+  template<typename _MatrixType, int Options>
+  struct pardiso_traits< PardisoLLT<_MatrixType, Options> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;
+  };
+
+  template<typename _MatrixType, int Options>
+  struct pardiso_traits< PardisoLDLT<_MatrixType, Options> >
+  {
+    typedef _MatrixType MatrixType;
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef typename _MatrixType::Index Index;    
+  };
+
+}
+
+template<class Derived>
+class PardisoImpl
+{
+    typedef internal::pardiso_traits<Derived> Traits;
+  public:
+    typedef typename Traits::MatrixType MatrixType;
+    typedef typename Traits::Scalar Scalar;
+    typedef typename Traits::RealScalar RealScalar;
+    typedef typename Traits::Index Index;
+    typedef SparseMatrix<Scalar,RowMajor,Index> SparseMatrixType;
+    typedef Matrix<Scalar,Dynamic,1> VectorType;
+    typedef Matrix<Index, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+    typedef Matrix<Index, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+    typedef Array<Index,64,1,DontAlign> ParameterType;
+    enum {
+      ScalarIsComplex = NumTraits<Scalar>::IsComplex
+    };
+
+    PardisoImpl()
+    {
+      eigen_assert((sizeof(Index) >= sizeof(_INTEGER_t) && sizeof(Index) <= 8) && "Non-supported index type");
+      m_iparm.setZero();
+      m_msglvl = 0; // No output
+      m_initialized = false;
+    }
+
+    ~PardisoImpl()
+    {
+      pardisoRelease();
+    }
+
+    inline Index cols() const { return m_size; }
+    inline Index rows() const { return m_size; }
+  
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_initialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+
+    /** \warning for advanced usage only.
+      * \returns a reference to the parameter array controlling PARDISO.
+      * See the PARDISO manual to know how to use it. */
+    ParameterType& pardisoParameterArray()
+    {
+      return m_iparm;
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      * 
+      * \sa factorize()
+      */
+    Derived& analyzePattern(const MatrixType& matrix);
+    
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    Derived& factorize(const MatrixType& matrix);
+
+    Derived& compute(const MatrixType& matrix);
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<PardisoImpl, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_initialized && "Pardiso solver is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "PardisoImpl::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<PardisoImpl, Rhs>(*this, b.derived());
+    }
+
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<PardisoImpl, Rhs>
+    solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_initialized && "Pardiso solver is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "PardisoImpl::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<PardisoImpl, Rhs>(*this, b.derived());
+    }
+
+    Derived& derived()
+    {
+      return *static_cast<Derived*>(this);
+    }
+    const Derived& derived() const
+    {
+      return *static_cast<const Derived*>(this);
+    }
+
+    template<typename BDerived, typename XDerived>
+    bool _solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>& x) const;
+
+  protected:
+    void pardisoRelease()
+    {
+      if(m_initialized) // Factorization ran at least once
+      {
+        internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, -1, m_size, 0, 0, 0, m_perm.data(), 0,
+                                                   m_iparm.data(), m_msglvl, 0, 0);
+      }
+    }
+
+    void pardisoInit(int type)
+    {
+      m_type = type;
+      bool symmetric = abs(m_type) < 10;
+      m_iparm[0] = 1;   // No solver default
+      m_iparm[1] = 3;   // use Metis for the ordering
+      m_iparm[2] = 1;   // Numbers of processors, value of OMP_NUM_THREADS
+      m_iparm[3] = 0;   // No iterative-direct algorithm
+      m_iparm[4] = 0;   // No user fill-in reducing permutation
+      m_iparm[5] = 0;   // Write solution into x
+      m_iparm[6] = 0;   // Not in use
+      m_iparm[7] = 2;   // Max numbers of iterative refinement steps
+      m_iparm[8] = 0;   // Not in use
+      m_iparm[9] = 13;  // Perturb the pivot elements with 1E-13
+      m_iparm[10] = symmetric ? 0 : 1; // Use nonsymmetric permutation and scaling MPS
+      m_iparm[11] = 0;  // Not in use
+      m_iparm[12] = symmetric ? 0 : 1;  // Maximum weighted matching algorithm is switched-off (default for symmetric).
+                                        // Try m_iparm[12] = 1 in case of inappropriate accuracy
+      m_iparm[13] = 0;  // Output: Number of perturbed pivots
+      m_iparm[14] = 0;  // Not in use
+      m_iparm[15] = 0;  // Not in use
+      m_iparm[16] = 0;  // Not in use
+      m_iparm[17] = -1; // Output: Number of nonzeros in the factor LU
+      m_iparm[18] = -1; // Output: Mflops for LU factorization
+      m_iparm[19] = 0;  // Output: Numbers of CG Iterations
+      
+      m_iparm[20] = 0;  // 1x1 pivoting
+      m_iparm[26] = 0;  // No matrix checker
+      m_iparm[27] = (sizeof(RealScalar) == 4) ? 1 : 0;
+      m_iparm[34] = 1;  // C indexing
+      m_iparm[59] = 1;  // Automatic switch between In-Core and Out-of-Core modes
+    }
+
+  protected:
+    // cached data to reduce reallocation, etc.
+    
+    void manageErrorCode(Index error)
+    {
+      switch(error)
+      {
+        case 0:
+          m_info = Success;
+          break;
+        case -4:
+        case -7:
+          m_info = NumericalIssue;
+          break;
+        default:
+          m_info = InvalidInput;
+      }
+    }
+
+    mutable SparseMatrixType m_matrix;
+    ComputationInfo m_info;
+    bool m_initialized, m_analysisIsOk, m_factorizationIsOk;
+    Index m_type, m_msglvl;
+    mutable void *m_pt[64];
+    mutable ParameterType m_iparm;
+    mutable IntColVectorType m_perm;
+    Index m_size;
+    
+  private:
+    PardisoImpl(PardisoImpl &) {}
+};
+
+template<class Derived>
+Derived& PardisoImpl<Derived>::compute(const MatrixType& a)
+{
+  m_size = a.rows();
+  eigen_assert(a.rows() == a.cols());
+
+  pardisoRelease();
+  memset(m_pt, 0, sizeof(m_pt));
+  m_perm.setZero(m_size);
+  derived().getMatrix(a);
+  
+  Index error;
+  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 12, m_size,
+                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
+                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+
+  manageErrorCode(error);
+  m_analysisIsOk = true;
+  m_factorizationIsOk = true;
+  m_initialized = true;
+  return derived();
+}
+
+template<class Derived>
+Derived& PardisoImpl<Derived>::analyzePattern(const MatrixType& a)
+{
+  m_size = a.rows();
+  eigen_assert(m_size == a.cols());
+
+  pardisoRelease();
+  memset(m_pt, 0, sizeof(m_pt));
+  m_perm.setZero(m_size);
+  derived().getMatrix(a);
+  
+  Index error;
+  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 11, m_size,
+                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
+                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+  
+  manageErrorCode(error);
+  m_analysisIsOk = true;
+  m_factorizationIsOk = false;
+  m_initialized = true;
+  return derived();
+}
+
+template<class Derived>
+Derived& PardisoImpl<Derived>::factorize(const MatrixType& a)
+{
+  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+  eigen_assert(m_size == a.rows() && m_size == a.cols());
+  
+  derived().getMatrix(a);
+
+  Index error;  
+  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 22, m_size,
+                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
+                                                     m_perm.data(), 0, m_iparm.data(), m_msglvl, NULL, NULL);
+  
+  manageErrorCode(error);
+  m_factorizationIsOk = true;
+  return derived();
+}
+
+template<class Base>
+template<typename BDerived,typename XDerived>
+bool PardisoImpl<Base>::_solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived>& x) const
+{
+  if(m_iparm[0] == 0) // Factorization was not computed
+    return false;
+
+  //Index n = m_matrix.rows();
+  Index nrhs = Index(b.cols());
+  eigen_assert(m_size==b.rows());
+  eigen_assert(((MatrixBase<BDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && "Row-major right hand sides are not supported");
+  eigen_assert(((MatrixBase<XDerived>::Flags & RowMajorBit) == 0 || nrhs == 1) && "Row-major matrices of unknowns are not supported");
+  eigen_assert(((nrhs == 1) || b.outerStride() == b.rows()));
+
+
+//  switch (transposed) {
+//    case SvNoTrans    : m_iparm[11] = 0 ; break;
+//    case SvTranspose  : m_iparm[11] = 2 ; break;
+//    case SvAdjoint    : m_iparm[11] = 1 ; break;
+//    default:
+//      //std::cerr << "Eigen: transposition  option \"" << transposed << "\" not supported by the PARDISO backend\n";
+//      m_iparm[11] = 0;
+//  }
+
+  Scalar* rhs_ptr = const_cast<Scalar*>(b.derived().data());
+  Matrix<Scalar,Dynamic,Dynamic,ColMajor> tmp;
+  
+  // Pardiso cannot solve in-place
+  if(rhs_ptr == x.derived().data())
+  {
+    tmp = b;
+    rhs_ptr = tmp.data();
+  }
+  
+  Index error;
+  error = internal::pardiso_run_selector<Index>::run(m_pt, 1, 1, m_type, 33, m_size,
+                                                     m_matrix.valuePtr(), m_matrix.outerIndexPtr(), m_matrix.innerIndexPtr(),
+                                                     m_perm.data(), nrhs, m_iparm.data(), m_msglvl,
+                                                     rhs_ptr, x.derived().data());
+
+  return error==0;
+}
+
+
+/** \ingroup PardisoSupport_Module
+  * \class PardisoLU
+  * \brief A sparse direct LU factorization and solver based on the PARDISO library
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
+  * using the Intel MKL PARDISO library. The sparse matrix A must be squared and invertible.
+  * The vectors or matrices X and B can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename MatrixType>
+class PardisoLU : public PardisoImpl< PardisoLU<MatrixType> >
+{
+  protected:
+    typedef PardisoImpl< PardisoLU<MatrixType> > Base;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::RealScalar RealScalar;
+    using Base::pardisoInit;
+    using Base::m_matrix;
+    friend class PardisoImpl< PardisoLU<MatrixType> >;
+
+  public:
+
+    using Base::compute;
+    using Base::solve;
+
+    PardisoLU()
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? 13 : 11);
+    }
+
+    PardisoLU(const MatrixType& matrix)
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? 13 : 11);
+      compute(matrix);
+    }
+  protected:
+    void getMatrix(const MatrixType& matrix)
+    {
+      m_matrix = matrix;
+    }
+    
+  private:
+    PardisoLU(PardisoLU& ) {}
+};
+
+/** \ingroup PardisoSupport_Module
+  * \class PardisoLLT
+  * \brief A sparse direct Cholesky (LLT) factorization and solver based on the PARDISO library
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a LL^T Cholesky factorization
+  * using the Intel MKL PARDISO library. The sparse matrix A must be selfajoint and positive definite.
+  * The vectors or matrices X and B can be either dense or sparse.
+  *
+  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam UpLo can be any bitwise combination of Upper, Lower. The default is Upper, meaning only the upper triangular part has to be used.
+  *         Upper|Lower can be used to tell both triangular parts can be used as input.
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename MatrixType, int _UpLo>
+class PardisoLLT : public PardisoImpl< PardisoLLT<MatrixType,_UpLo> >
+{
+  protected:
+    typedef PardisoImpl< PardisoLLT<MatrixType,_UpLo> > Base;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::Index Index;
+    typedef typename Base::RealScalar RealScalar;
+    using Base::pardisoInit;
+    using Base::m_matrix;
+    friend class PardisoImpl< PardisoLLT<MatrixType,_UpLo> >;
+
+  public:
+
+    enum { UpLo = _UpLo };
+    using Base::compute;
+    using Base::solve;
+
+    PardisoLLT()
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? 4 : 2);
+    }
+
+    PardisoLLT(const MatrixType& matrix)
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? 4 : 2);
+      compute(matrix);
+    }
+    
+  protected:
+    
+    void getMatrix(const MatrixType& matrix)
+    {
+      // PARDISO supports only upper, row-major matrices
+      PermutationMatrix<Dynamic,Dynamic,Index> p_null;
+      m_matrix.resize(matrix.rows(), matrix.cols());
+      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
+    }
+    
+  private:
+    PardisoLLT(PardisoLLT& ) {}
+};
+
+/** \ingroup PardisoSupport_Module
+  * \class PardisoLDLT
+  * \brief A sparse direct Cholesky (LDLT) factorization and solver based on the PARDISO library
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a LDL^T Cholesky factorization
+  * using the Intel MKL PARDISO library. The sparse matrix A is assumed to be selfajoint and positive definite.
+  * For complex matrices, A can also be symmetric only, see the \a Options template parameter.
+  * The vectors or matrices X and B can be either dense or sparse.
+  *
+  * \tparam MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam Options can be any bitwise combination of Upper, Lower, and Symmetric. The default is Upper, meaning only the upper triangular part has to be used.
+  *         Symmetric can be used for symmetric, non-selfadjoint complex matrices, the default being to assume a selfadjoint matrix.
+  *         Upper|Lower can be used to tell both triangular parts can be used as input.
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename MatrixType, int Options>
+class PardisoLDLT : public PardisoImpl< PardisoLDLT<MatrixType,Options> >
+{
+  protected:
+    typedef PardisoImpl< PardisoLDLT<MatrixType,Options> > Base;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::Index Index;
+    typedef typename Base::RealScalar RealScalar;
+    using Base::pardisoInit;
+    using Base::m_matrix;
+    friend class PardisoImpl< PardisoLDLT<MatrixType,Options> >;
+
+  public:
+
+    using Base::compute;
+    using Base::solve;
+    enum { UpLo = Options&(Upper|Lower) };
+
+    PardisoLDLT()
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);
+    }
+
+    PardisoLDLT(const MatrixType& matrix)
+      : Base()
+    {
+      pardisoInit(Base::ScalarIsComplex ? ( bool(Options&Symmetric) ? 6 : -4 ) : -2);
+      compute(matrix);
+    }
+    
+    void getMatrix(const MatrixType& matrix)
+    {
+      // PARDISO supports only upper, row-major matrices
+      PermutationMatrix<Dynamic,Dynamic,Index> p_null;
+      m_matrix.resize(matrix.rows(), matrix.cols());
+      m_matrix.template selfadjointView<Upper>() = matrix.template selfadjointView<UpLo>().twistedBy(p_null);
+    }
+    
+  private:
+    PardisoLDLT(PardisoLDLT& ) {}
+};
+
+namespace internal {
+  
+template<typename _Derived, typename Rhs>
+struct solve_retval<PardisoImpl<_Derived>, Rhs>
+  : solve_retval_base<PardisoImpl<_Derived>, Rhs>
+{
+  typedef PardisoImpl<_Derived> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+template<typename Derived, typename Rhs>
+struct sparse_solve_retval<PardisoImpl<Derived>, Rhs>
+  : sparse_solve_retval_base<PardisoImpl<Derived>, Rhs>
+{
+  typedef PardisoImpl<Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_PARDISOSUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/QR/CMakeLists.txt
new file mode 100644
index 0000000..96f43d7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_QR_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_QR_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/QR COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR.h b/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR.h
new file mode 100644
index 0000000..9ec8a65
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR.h
@@ -0,0 +1,555 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
+#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
+
+namespace Eigen { 
+
+/** \ingroup QR_Module
+  *
+  * \class ColPivHouseholderQR
+  *
+  * \brief Householder rank-revealing QR decomposition of a matrix with column-pivoting
+  *
+  * \param MatrixType the type of the matrix of which we are computing the QR decomposition
+  *
+  * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b Q and \b R
+  * such that 
+  * \f[
+  *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \, \mathbf{R}
+  * \f]
+  * by using Householder transformations. Here, \b P is a permutation matrix, \b Q a unitary matrix and \b R an 
+  * upper triangular matrix.
+  *
+  * This decomposition performs column pivoting in order to be rank-revealing and improve
+  * numerical stability. It is slower than HouseholderQR, and faster than FullPivHouseholderQR.
+  *
+  * \sa MatrixBase::colPivHouseholderQr()
+  */
+template<typename _MatrixType> class ColPivHouseholderQR
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, Options, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
+    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
+    typedef typename internal::plain_row_type<MatrixType, Index>::type IntRowVectorType;
+    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+    typedef typename internal::plain_row_type<MatrixType, RealScalar>::type RealRowVectorType;
+    typedef typename HouseholderSequence<MatrixType,HCoeffsType>::ConjugateReturnType HouseholderSequenceType;
+    
+  private:
+    
+    typedef typename PermutationType::Index PermIndexType;
+    
+  public:
+
+    /**
+    * \brief Default Constructor.
+    *
+    * The default constructor is useful in cases in which the user intends to
+    * perform decompositions via ColPivHouseholderQR::compute(const MatrixType&).
+    */
+    ColPivHouseholderQR()
+      : m_qr(),
+        m_hCoeffs(),
+        m_colsPermutation(),
+        m_colsTranspositions(),
+        m_temp(),
+        m_colSqNorms(),
+        m_isInitialized(false) {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa ColPivHouseholderQR()
+      */
+    ColPivHouseholderQR(Index rows, Index cols)
+      : m_qr(rows, cols),
+        m_hCoeffs((std::min)(rows,cols)),
+        m_colsPermutation(PermIndexType(cols)),
+        m_colsTranspositions(cols),
+        m_temp(cols),
+        m_colSqNorms(cols),
+        m_isInitialized(false),
+        m_usePrescribedThreshold(false) {}
+
+    ColPivHouseholderQR(const MatrixType& matrix)
+      : m_qr(matrix.rows(), matrix.cols()),
+        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
+        m_colsPermutation(PermIndexType(matrix.cols())),
+        m_colsTranspositions(matrix.cols()),
+        m_temp(matrix.cols()),
+        m_colSqNorms(matrix.cols()),
+        m_isInitialized(false),
+        m_usePrescribedThreshold(false)
+    {
+      compute(matrix);
+    }
+
+    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+      * *this is the QR decomposition, if any exists.
+      *
+      * \param b the right-hand-side of the equation to solve.
+      *
+      * \returns a solution.
+      *
+      * \note The case where b is a matrix is not yet implemented. Also, this
+      *       code is space inefficient.
+      *
+      * \note_about_checking_solutions
+      *
+      * \note_about_arbitrary_choice_of_solution
+      *
+      * Example: \include ColPivHouseholderQR_solve.cpp
+      * Output: \verbinclude ColPivHouseholderQR_solve.out
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<ColPivHouseholderQR, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return internal::solve_retval<ColPivHouseholderQR, Rhs>(*this, b.derived());
+    }
+
+    HouseholderSequenceType householderQ(void) const;
+    HouseholderSequenceType matrixQ(void) const
+    {
+      return householderQ(); 
+    }
+
+    /** \returns a reference to the matrix where the Householder QR decomposition is stored
+      */
+    const MatrixType& matrixQR() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return m_qr;
+    }
+    
+    /** \returns a reference to the matrix where the result Householder QR is stored 
+     * \warning The strict lower part of this matrix contains internal values. 
+     * Only the upper triangular part should be referenced. To get it, use
+     * \code matrixR().template triangularView<Upper>() \endcode
+     * For rank-deficient matrices, use 
+     * \code 
+     * matrixR().topLeftCorner(rank(), rank()).template triangularView<Upper>() 
+     * \endcode
+     */
+    const MatrixType& matrixR() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return m_qr;
+    }
+    
+    ColPivHouseholderQR& compute(const MatrixType& matrix);
+
+    const PermutationType& colsPermutation() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return m_colsPermutation;
+    }
+
+    /** \returns the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \warning a determinant can be very big or small, so for matrices
+      * of large enough dimension, there is a risk of overflow/underflow.
+      * One way to work around that is to use logAbsDeterminant() instead.
+      *
+      * \sa logAbsDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar absDeterminant() const;
+
+    /** \returns the natural log of the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \note This method is useful to work around the risk of overflow/underflow that's inherent
+      * to determinant computation.
+      *
+      * \sa absDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar logAbsDeterminant() const;
+
+    /** \returns the rank of the matrix of which *this is the QR decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index rank() const
+    {
+      using std::abs;
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+      Index result = 0;
+      for(Index i = 0; i < m_nonzero_pivots; ++i)
+        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
+      return result;
+    }
+
+    /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index dimensionOfKernel() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return cols() - rank();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition represents an injective
+      *          linear map, i.e. has trivial kernel; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInjective() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return rank() == cols();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
+      *          linear map; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isSurjective() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return rank() == rows();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition is invertible.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInvertible() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return isInjective() && isSurjective();
+    }
+
+    /** \returns the inverse of the matrix of which *this is the QR decomposition.
+      *
+      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+      *       Use isInvertible() to first determine whether this matrix is invertible.
+      */
+    inline const
+    internal::solve_retval<ColPivHouseholderQR, typename MatrixType::IdentityReturnType>
+    inverse() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return internal::solve_retval<ColPivHouseholderQR,typename MatrixType::IdentityReturnType>
+               (*this, MatrixType::Identity(m_qr.rows(), m_qr.cols()));
+    }
+
+    inline Index rows() const { return m_qr.rows(); }
+    inline Index cols() const { return m_qr.cols(); }
+    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+
+    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+      * who need to determine when pivots are to be considered nonzero. This is not used for the
+      * QR decomposition itself.
+      *
+      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+      * uses a formula to automatically determine a reasonable threshold.
+      * Once you have called the present method setThreshold(const RealScalar&),
+      * your value is used instead.
+      *
+      * \param threshold The new value to use as the threshold.
+      *
+      * A pivot will be considered nonzero if its absolute value is strictly greater than
+      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+      * where maxpivot is the biggest pivot.
+      *
+      * If you want to come back to the default behavior, call setThreshold(Default_t)
+      */
+    ColPivHouseholderQR& setThreshold(const RealScalar& threshold)
+    {
+      m_usePrescribedThreshold = true;
+      m_prescribedThreshold = threshold;
+      return *this;
+    }
+
+    /** Allows to come back to the default behavior, letting Eigen use its default formula for
+      * determining the threshold.
+      *
+      * You should pass the special object Eigen::Default as parameter here.
+      * \code qr.setThreshold(Eigen::Default); \endcode
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    ColPivHouseholderQR& setThreshold(Default_t)
+    {
+      m_usePrescribedThreshold = false;
+      return *this;
+    }
+
+    /** Returns the threshold that will be used by certain methods such as rank().
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    RealScalar threshold() const
+    {
+      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+      return m_usePrescribedThreshold ? m_prescribedThreshold
+      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
+      // and turns out to be identical to Higham's formula used already in LDLt.
+                                      : NumTraits<Scalar>::epsilon() * m_qr.diagonalSize();
+    }
+
+    /** \returns the number of nonzero pivots in the QR decomposition.
+      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+      * So that notion isn't really intrinsically interesting, but it is
+      * still useful when implementing algorithms.
+      *
+      * \sa rank()
+      */
+    inline Index nonzeroPivots() const
+    {
+      eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+      return m_nonzero_pivots;
+    }
+
+    /** \returns the absolute value of the biggest pivot, i.e. the biggest
+      *          diagonal coefficient of R.
+      */
+    RealScalar maxPivot() const { return m_maxpivot; }
+    
+    /** \brief Reports whether the QR factorization was succesful.
+      *
+      * \note This function always returns \c Success. It is provided for compatibility 
+      * with other factorization routines.
+      * \returns \c Success 
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return Success;
+    }
+
+  protected:
+    MatrixType m_qr;
+    HCoeffsType m_hCoeffs;
+    PermutationType m_colsPermutation;
+    IntRowVectorType m_colsTranspositions;
+    RowVectorType m_temp;
+    RealRowVectorType m_colSqNorms;
+    bool m_isInitialized, m_usePrescribedThreshold;
+    RealScalar m_prescribedThreshold, m_maxpivot;
+    Index m_nonzero_pivots;
+    Index m_det_pq;
+};
+
+template<typename MatrixType>
+typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::absDeterminant() const
+{
+  using std::abs;
+  eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return abs(m_qr.diagonal().prod());
+}
+
+template<typename MatrixType>
+typename MatrixType::RealScalar ColPivHouseholderQR<MatrixType>::logAbsDeterminant() const
+{
+  eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return m_qr.diagonal().cwiseAbs().array().log().sum();
+}
+
+template<typename MatrixType>
+ColPivHouseholderQR<MatrixType>& ColPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix)
+{
+  using std::abs;
+  Index rows = matrix.rows();
+  Index cols = matrix.cols();
+  Index size = matrix.diagonalSize();
+  
+  // the column permutation is stored as int indices, so just to be sure:
+  eigen_assert(cols<=NumTraits<int>::highest());
+
+  m_qr = matrix;
+  m_hCoeffs.resize(size);
+
+  m_temp.resize(cols);
+
+  m_colsTranspositions.resize(matrix.cols());
+  Index number_of_transpositions = 0;
+
+  m_colSqNorms.resize(cols);
+  for(Index k = 0; k < cols; ++k)
+    m_colSqNorms.coeffRef(k) = m_qr.col(k).squaredNorm();
+
+  RealScalar threshold_helper = m_colSqNorms.maxCoeff() * internal::abs2(NumTraits<Scalar>::epsilon()) / RealScalar(rows);
+
+  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_maxpivot = RealScalar(0);
+
+  for(Index k = 0; k < size; ++k)
+  {
+    // first, we look up in our table m_colSqNorms which column has the biggest squared norm
+    Index biggest_col_index;
+    RealScalar biggest_col_sq_norm = m_colSqNorms.tail(cols-k).maxCoeff(&biggest_col_index);
+    biggest_col_index += k;
+
+    // since our table m_colSqNorms accumulates imprecision at every step, we must now recompute
+    // the actual squared norm of the selected column.
+    // Note that not doing so does result in solve() sometimes returning inf/nan values
+    // when running the unit test with 1000 repetitions.
+    biggest_col_sq_norm = m_qr.col(biggest_col_index).tail(rows-k).squaredNorm();
+
+    // we store that back into our table: it can't hurt to correct our table.
+    m_colSqNorms.coeffRef(biggest_col_index) = biggest_col_sq_norm;
+
+    // if the current biggest column is smaller than epsilon times the initial biggest column,
+    // terminate to avoid generating nan/inf values.
+    // Note that here, if we test instead for "biggest == 0", we get a failure every 1000 (or so)
+    // repetitions of the unit test, with the result of solve() filled with large values of the order
+    // of 1/(size*epsilon).
+    if(biggest_col_sq_norm < threshold_helper * RealScalar(rows-k))
+    {
+      m_nonzero_pivots = k;
+      m_hCoeffs.tail(size-k).setZero();
+      m_qr.bottomRightCorner(rows-k,cols-k)
+          .template triangularView<StrictlyLower>()
+          .setZero();
+      break;
+    }
+
+    // apply the transposition to the columns
+    m_colsTranspositions.coeffRef(k) = biggest_col_index;
+    if(k != biggest_col_index) {
+      m_qr.col(k).swap(m_qr.col(biggest_col_index));
+      std::swap(m_colSqNorms.coeffRef(k), m_colSqNorms.coeffRef(biggest_col_index));
+      ++number_of_transpositions;
+    }
+
+    // generate the householder vector, store it below the diagonal
+    RealScalar beta;
+    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
+
+    // apply the householder transformation to the diagonal coefficient
+    m_qr.coeffRef(k,k) = beta;
+
+    // remember the maximum absolute value of diagonal coefficients
+    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
+
+    // apply the householder transformation
+    m_qr.bottomRightCorner(rows-k, cols-k-1)
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
+
+    // update our table of squared norms of the columns
+    m_colSqNorms.tail(cols-k-1) -= m_qr.row(k).tail(cols-k-1).cwiseAbs2();
+  }
+
+  m_colsPermutation.setIdentity(PermIndexType(cols));
+  for(PermIndexType k = 0; k < m_nonzero_pivots; ++k)
+    m_colsPermutation.applyTranspositionOnTheRight(k, PermIndexType(m_colsTranspositions.coeff(k)));
+
+  m_det_pq = (number_of_transpositions%2) ? -1 : 1;
+  m_isInitialized = true;
+
+  return *this;
+}
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<ColPivHouseholderQR<_MatrixType>, Rhs>
+  : solve_retval_base<ColPivHouseholderQR<_MatrixType>, Rhs>
+{
+  EIGEN_MAKE_SOLVE_HELPERS(ColPivHouseholderQR<_MatrixType>,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    eigen_assert(rhs().rows() == dec().rows());
+
+    const int cols = dec().cols(),
+    nonzero_pivots = dec().nonzeroPivots();
+
+    if(nonzero_pivots == 0)
+    {
+      dst.setZero();
+      return;
+    }
+
+    typename Rhs::PlainObject c(rhs());
+
+    // Note that the matrix Q = H_0^* H_1^*... so its inverse is Q^* = (H_0 H_1 ...)^T
+    c.applyOnTheLeft(householderSequence(dec().matrixQR(), dec().hCoeffs())
+                     .setLength(dec().nonzeroPivots())
+		     .transpose()
+      );
+
+    dec().matrixR()
+       .topLeftCorner(nonzero_pivots, nonzero_pivots)
+       .template triangularView<Upper>()
+       .solveInPlace(c.topRows(nonzero_pivots));
+
+    for(Index i = 0; i < nonzero_pivots; ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);
+    for(Index i = nonzero_pivots; i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();
+  }
+};
+
+} // end namespace internal
+
+/** \returns the matrix Q as a sequence of householder transformations */
+template<typename MatrixType>
+typename ColPivHouseholderQR<MatrixType>::HouseholderSequenceType ColPivHouseholderQR<MatrixType>
+  ::householderQ() const
+{
+  eigen_assert(m_isInitialized && "ColPivHouseholderQR is not initialized.");
+  return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate()).setLength(m_nonzero_pivots);
+}
+
+/** \return the column-pivoting Householder QR decomposition of \c *this.
+  *
+  * \sa class ColPivHouseholderQR
+  */
+template<typename Derived>
+const ColPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::colPivHouseholderQr() const
+{
+  return ColPivHouseholderQR<PlainObject>(eval());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR_MKL.h b/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR_MKL.h
new file mode 100644
index 0000000..b5b1983
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/ColPivHouseholderQR_MKL.h
@@ -0,0 +1,99 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Householder QR decomposition of a matrix with column pivoting based on
+ *    LAPACKE_?geqp3 function.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
+#define EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_QR_COLPIV(EIGTYPE, MKLTYPE, MKLPREFIX, EIGCOLROW, MKLCOLROW) \
+template<> inline \
+ColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >& \
+ColPivHouseholderQR<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> >::compute( \
+              const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix) \
+\
+{ \
+  using std::abs; \
+  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \
+  typedef MatrixType::Scalar Scalar; \
+  typedef MatrixType::RealScalar RealScalar; \
+  Index rows = matrix.rows();\
+  Index cols = matrix.cols();\
+  Index size = matrix.diagonalSize();\
+\
+  m_qr = matrix;\
+  m_hCoeffs.resize(size);\
+\
+  m_colsTranspositions.resize(cols);\
+  /*Index number_of_transpositions = 0;*/ \
+\
+  m_nonzero_pivots = 0; \
+  m_maxpivot = RealScalar(0);\
+  m_colsPermutation.resize(cols); \
+  m_colsPermutation.indices().setZero(); \
+\
+  lapack_int lda = m_qr.outerStride(), i; \
+  lapack_int matrix_order = MKLCOLROW; \
+  LAPACKE_##MKLPREFIX##geqp3( matrix_order, rows, cols, (MKLTYPE*)m_qr.data(), lda, (lapack_int*)m_colsPermutation.indices().data(), (MKLTYPE*)m_hCoeffs.data()); \
+  m_isInitialized = true; \
+  m_maxpivot=m_qr.diagonal().cwiseAbs().maxCoeff(); \
+  m_hCoeffs.adjointInPlace(); \
+  RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold(); \
+  lapack_int *perm = m_colsPermutation.indices().data(); \
+  for(i=0;i<size;i++) { \
+    m_nonzero_pivots += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);\
+  } \
+  for(i=0;i<cols;i++) perm[i]--;\
+\
+  /*m_det_pq = (number_of_transpositions%2) ? -1 : 1;  // TODO: It's not needed now; fix upon availability in Eigen */ \
+\
+  return *this; \
+}
+
+EIGEN_MKL_QR_COLPIV(double,   double,        d, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_QR_COLPIV(float,    float,         s, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, ColMajor, LAPACK_COL_MAJOR)
+
+EIGEN_MKL_QR_COLPIV(double,   double,        d, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_QR_COLPIV(float,    float,         s, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_QR_COLPIV(dcomplex, MKL_Complex16, z, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_QR_COLPIV(scomplex, MKL_Complex8,  c, RowMajor, LAPACK_ROW_MAJOR)
+
+} // end namespace Eigen
+
+#endif // EIGEN_COLPIVOTINGHOUSEHOLDERQR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/FullPivHouseholderQR.h b/vendor/eigen-3.1.91/Eigen/src/QR/FullPivHouseholderQR.h
new file mode 100644
index 0000000..613c29e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/FullPivHouseholderQR.h
@@ -0,0 +1,598 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
+#define EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType;
+
+template<typename MatrixType>
+struct traits<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
+{
+  typedef typename MatrixType::PlainObject ReturnType;
+};
+
+}
+
+/** \ingroup QR_Module
+  *
+  * \class FullPivHouseholderQR
+  *
+  * \brief Householder rank-revealing QR decomposition of a matrix with full pivoting
+  *
+  * \param MatrixType the type of the matrix of which we are computing the QR decomposition
+  *
+  * This class performs a rank-revealing QR decomposition of a matrix \b A into matrices \b P, \b Q and \b R
+  * such that 
+  * \f[
+  *  \mathbf{A} \, \mathbf{P} = \mathbf{Q} \, \mathbf{R}
+  * \f]
+  * by using Householder transformations. Here, \b P is a permutation matrix, \b Q a unitary matrix and \b R an 
+  * upper triangular matrix.
+  *
+  * This decomposition performs a very prudent full pivoting in order to be rank-revealing and achieve optimal
+  * numerical stability. The trade-off is that it is slower than HouseholderQR and ColPivHouseholderQR.
+  *
+  * \sa MatrixBase::fullPivHouseholderQr()
+  */
+template<typename _MatrixType> class FullPivHouseholderQR
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef internal::FullPivHouseholderQRMatrixQReturnType<MatrixType> MatrixQReturnType;
+    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+    typedef Matrix<Index, 1, ColsAtCompileTime, RowMajor, 1, MaxColsAtCompileTime> IntRowVectorType;
+    typedef PermutationMatrix<ColsAtCompileTime, MaxColsAtCompileTime> PermutationType;
+    typedef typename internal::plain_col_type<MatrixType, Index>::type IntColVectorType;
+    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+    typedef typename internal::plain_col_type<MatrixType>::type ColVectorType;
+
+    /** \brief Default Constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via FullPivHouseholderQR::compute(const MatrixType&).
+      */
+    FullPivHouseholderQR()
+      : m_qr(),
+        m_hCoeffs(),
+        m_rows_transpositions(),
+        m_cols_transpositions(),
+        m_cols_permutation(),
+        m_temp(),
+        m_isInitialized(false),
+        m_usePrescribedThreshold(false) {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa FullPivHouseholderQR()
+      */
+    FullPivHouseholderQR(Index rows, Index cols)
+      : m_qr(rows, cols),
+        m_hCoeffs((std::min)(rows,cols)),
+        m_rows_transpositions(rows),
+        m_cols_transpositions(cols),
+        m_cols_permutation(cols),
+        m_temp((std::min)(rows,cols)),
+        m_isInitialized(false),
+        m_usePrescribedThreshold(false) {}
+
+    FullPivHouseholderQR(const MatrixType& matrix)
+      : m_qr(matrix.rows(), matrix.cols()),
+        m_hCoeffs((std::min)(matrix.rows(), matrix.cols())),
+        m_rows_transpositions(matrix.rows()),
+        m_cols_transpositions(matrix.cols()),
+        m_cols_permutation(matrix.cols()),
+        m_temp((std::min)(matrix.rows(), matrix.cols())),
+        m_isInitialized(false),
+        m_usePrescribedThreshold(false)
+    {
+      compute(matrix);
+    }
+
+    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+      * *this is the QR decomposition, if any exists.
+      *
+      * \param b the right-hand-side of the equation to solve.
+      *
+      * \returns a solution.
+      *
+      * \note The case where b is a matrix is not yet implemented. Also, this
+      *       code is space inefficient.
+      *
+      * \note_about_checking_solutions
+      *
+      * \note_about_arbitrary_choice_of_solution
+      *
+      * Example: \include FullPivHouseholderQR_solve.cpp
+      * Output: \verbinclude FullPivHouseholderQR_solve.out
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<FullPivHouseholderQR, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return internal::solve_retval<FullPivHouseholderQR, Rhs>(*this, b.derived());
+    }
+
+    /** \returns Expression object representing the matrix Q
+      */
+    MatrixQReturnType matrixQ(void) const;
+
+    /** \returns a reference to the matrix where the Householder QR decomposition is stored
+      */
+    const MatrixType& matrixQR() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return m_qr;
+    }
+
+    FullPivHouseholderQR& compute(const MatrixType& matrix);
+
+    const PermutationType& colsPermutation() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return m_cols_permutation;
+    }
+
+    const IntColVectorType& rowsTranspositions() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return m_rows_transpositions;
+    }
+
+    /** \returns the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \warning a determinant can be very big or small, so for matrices
+      * of large enough dimension, there is a risk of overflow/underflow.
+      * One way to work around that is to use logAbsDeterminant() instead.
+      *
+      * \sa logAbsDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar absDeterminant() const;
+
+    /** \returns the natural log of the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \note This method is useful to work around the risk of overflow/underflow that's inherent
+      * to determinant computation.
+      *
+      * \sa absDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar logAbsDeterminant() const;
+
+    /** \returns the rank of the matrix of which *this is the QR decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index rank() const
+    {
+      using std::abs;
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      RealScalar premultiplied_threshold = abs(m_maxpivot) * threshold();
+      Index result = 0;
+      for(Index i = 0; i < m_nonzero_pivots; ++i)
+        result += (abs(m_qr.coeff(i,i)) > premultiplied_threshold);
+      return result;
+    }
+
+    /** \returns the dimension of the kernel of the matrix of which *this is the QR decomposition.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline Index dimensionOfKernel() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return cols() - rank();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition represents an injective
+      *          linear map, i.e. has trivial kernel; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInjective() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return rank() == cols();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition represents a surjective
+      *          linear map; false otherwise.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isSurjective() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return rank() == rows();
+    }
+
+    /** \returns true if the matrix of which *this is the QR decomposition is invertible.
+      *
+      * \note This method has to determine which pivots should be considered nonzero.
+      *       For that, it uses the threshold value that you can control by calling
+      *       setThreshold(const RealScalar&).
+      */
+    inline bool isInvertible() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return isInjective() && isSurjective();
+    }
+
+    /** \returns the inverse of the matrix of which *this is the QR decomposition.
+      *
+      * \note If this matrix is not invertible, the returned matrix has undefined coefficients.
+      *       Use isInvertible() to first determine whether this matrix is invertible.
+      */    inline const
+    internal::solve_retval<FullPivHouseholderQR, typename MatrixType::IdentityReturnType>
+    inverse() const
+    {
+      eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+      return internal::solve_retval<FullPivHouseholderQR,typename MatrixType::IdentityReturnType>
+               (*this, MatrixType::Identity(m_qr.rows(), m_qr.cols()));
+    }
+
+    inline Index rows() const { return m_qr.rows(); }
+    inline Index cols() const { return m_qr.cols(); }
+    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+
+    /** Allows to prescribe a threshold to be used by certain methods, such as rank(),
+      * who need to determine when pivots are to be considered nonzero. This is not used for the
+      * QR decomposition itself.
+      *
+      * When it needs to get the threshold value, Eigen calls threshold(). By default, this
+      * uses a formula to automatically determine a reasonable threshold.
+      * Once you have called the present method setThreshold(const RealScalar&),
+      * your value is used instead.
+      *
+      * \param threshold The new value to use as the threshold.
+      *
+      * A pivot will be considered nonzero if its absolute value is strictly greater than
+      *  \f$ \vert pivot \vert \leqslant threshold \times \vert maxpivot \vert \f$
+      * where maxpivot is the biggest pivot.
+      *
+      * If you want to come back to the default behavior, call setThreshold(Default_t)
+      */
+    FullPivHouseholderQR& setThreshold(const RealScalar& threshold)
+    {
+      m_usePrescribedThreshold = true;
+      m_prescribedThreshold = threshold;
+      return *this;
+    }
+
+    /** Allows to come back to the default behavior, letting Eigen use its default formula for
+      * determining the threshold.
+      *
+      * You should pass the special object Eigen::Default as parameter here.
+      * \code qr.setThreshold(Eigen::Default); \endcode
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    FullPivHouseholderQR& setThreshold(Default_t)
+    {
+      m_usePrescribedThreshold = false;
+      return *this;
+    }
+
+    /** Returns the threshold that will be used by certain methods such as rank().
+      *
+      * See the documentation of setThreshold(const RealScalar&).
+      */
+    RealScalar threshold() const
+    {
+      eigen_assert(m_isInitialized || m_usePrescribedThreshold);
+      return m_usePrescribedThreshold ? m_prescribedThreshold
+      // this formula comes from experimenting (see "LU precision tuning" thread on the list)
+      // and turns out to be identical to Higham's formula used already in LDLt.
+                                      : NumTraits<Scalar>::epsilon() * m_qr.diagonalSize();
+    }
+
+    /** \returns the number of nonzero pivots in the QR decomposition.
+      * Here nonzero is meant in the exact sense, not in a fuzzy sense.
+      * So that notion isn't really intrinsically interesting, but it is
+      * still useful when implementing algorithms.
+      *
+      * \sa rank()
+      */
+    inline Index nonzeroPivots() const
+    {
+      eigen_assert(m_isInitialized && "LU is not initialized.");
+      return m_nonzero_pivots;
+    }
+
+    /** \returns the absolute value of the biggest pivot, i.e. the biggest
+      *          diagonal coefficient of U.
+      */
+    RealScalar maxPivot() const { return m_maxpivot; }
+
+  protected:
+    MatrixType m_qr;
+    HCoeffsType m_hCoeffs;
+    IntColVectorType m_rows_transpositions;
+    IntRowVectorType m_cols_transpositions;
+    PermutationType m_cols_permutation;
+    RowVectorType m_temp;
+    bool m_isInitialized, m_usePrescribedThreshold;
+    RealScalar m_prescribedThreshold, m_maxpivot;
+    Index m_nonzero_pivots;
+    RealScalar m_precision;
+    Index m_det_pq;
+};
+
+template<typename MatrixType>
+typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::absDeterminant() const
+{
+  using std::abs;
+  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return abs(m_qr.diagonal().prod());
+}
+
+template<typename MatrixType>
+typename MatrixType::RealScalar FullPivHouseholderQR<MatrixType>::logAbsDeterminant() const
+{
+  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return m_qr.diagonal().cwiseAbs().array().log().sum();
+}
+
+template<typename MatrixType>
+FullPivHouseholderQR<MatrixType>& FullPivHouseholderQR<MatrixType>::compute(const MatrixType& matrix)
+{
+  using std::abs;
+  Index rows = matrix.rows();
+  Index cols = matrix.cols();
+  Index size = (std::min)(rows,cols);
+
+  m_qr = matrix;
+  m_hCoeffs.resize(size);
+
+  m_temp.resize(cols);
+
+  m_precision = NumTraits<Scalar>::epsilon() * size;
+
+  m_rows_transpositions.resize(matrix.rows());
+  m_cols_transpositions.resize(matrix.cols());
+  Index number_of_transpositions = 0;
+
+  RealScalar biggest(0);
+
+  m_nonzero_pivots = size; // the generic case is that in which all pivots are nonzero (invertible case)
+  m_maxpivot = RealScalar(0);
+
+  for (Index k = 0; k < size; ++k)
+  {
+    Index row_of_biggest_in_corner, col_of_biggest_in_corner;
+    RealScalar biggest_in_corner;
+
+    biggest_in_corner = m_qr.bottomRightCorner(rows-k, cols-k)
+                            .cwiseAbs()
+                            .maxCoeff(&row_of_biggest_in_corner, &col_of_biggest_in_corner);
+    row_of_biggest_in_corner += k;
+    col_of_biggest_in_corner += k;
+    if(k==0) biggest = biggest_in_corner;
+
+    // if the corner is negligible, then we have less than full rank, and we can finish early
+    if(internal::isMuchSmallerThan(biggest_in_corner, biggest, m_precision))
+    {
+      m_nonzero_pivots = k;
+      for(Index i = k; i < size; i++)
+      {
+        m_rows_transpositions.coeffRef(i) = i;
+        m_cols_transpositions.coeffRef(i) = i;
+        m_hCoeffs.coeffRef(i) = Scalar(0);
+      }
+      break;
+    }
+
+    m_rows_transpositions.coeffRef(k) = row_of_biggest_in_corner;
+    m_cols_transpositions.coeffRef(k) = col_of_biggest_in_corner;
+    if(k != row_of_biggest_in_corner) {
+      m_qr.row(k).tail(cols-k).swap(m_qr.row(row_of_biggest_in_corner).tail(cols-k));
+      ++number_of_transpositions;
+    }
+    if(k != col_of_biggest_in_corner) {
+      m_qr.col(k).swap(m_qr.col(col_of_biggest_in_corner));
+      ++number_of_transpositions;
+    }
+
+    RealScalar beta;
+    m_qr.col(k).tail(rows-k).makeHouseholderInPlace(m_hCoeffs.coeffRef(k), beta);
+    m_qr.coeffRef(k,k) = beta;
+
+    // remember the maximum absolute value of diagonal coefficients
+    if(abs(beta) > m_maxpivot) m_maxpivot = abs(beta);
+
+    m_qr.bottomRightCorner(rows-k, cols-k-1)
+        .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), m_hCoeffs.coeffRef(k), &m_temp.coeffRef(k+1));
+  }
+
+  m_cols_permutation.setIdentity(cols);
+  for(Index k = 0; k < size; ++k)
+    m_cols_permutation.applyTranspositionOnTheRight(k, m_cols_transpositions.coeff(k));
+
+  m_det_pq = (number_of_transpositions%2) ? -1 : 1;
+  m_isInitialized = true;
+
+  return *this;
+}
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<FullPivHouseholderQR<_MatrixType>, Rhs>
+  : solve_retval_base<FullPivHouseholderQR<_MatrixType>, Rhs>
+{
+  EIGEN_MAKE_SOLVE_HELPERS(FullPivHouseholderQR<_MatrixType>,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    const Index rows = dec().rows(), cols = dec().cols();
+    eigen_assert(rhs().rows() == rows);
+
+    // FIXME introduce nonzeroPivots() and use it here. and more generally,
+    // make the same improvements in this dec as in FullPivLU.
+    if(dec().rank()==0)
+    {
+      dst.setZero();
+      return;
+    }
+
+    typename Rhs::PlainObject c(rhs());
+
+    Matrix<Scalar,1,Rhs::ColsAtCompileTime> temp(rhs().cols());
+    for (Index k = 0; k < dec().rank(); ++k)
+    {
+      Index remainingSize = rows-k;
+      c.row(k).swap(c.row(dec().rowsTranspositions().coeff(k)));
+      c.bottomRightCorner(remainingSize, rhs().cols())
+       .applyHouseholderOnTheLeft(dec().matrixQR().col(k).tail(remainingSize-1),
+                                  dec().hCoeffs().coeff(k), &temp.coeffRef(0));
+    }
+
+    if(!dec().isSurjective())
+    {
+      // is c is in the image of R ?
+      RealScalar biggest_in_upper_part_of_c = c.topRows(   dec().rank()     ).cwiseAbs().maxCoeff();
+      RealScalar biggest_in_lower_part_of_c = c.bottomRows(rows-dec().rank()).cwiseAbs().maxCoeff();
+      // FIXME brain dead
+      const RealScalar m_precision = NumTraits<Scalar>::epsilon() * (std::min)(rows,cols);
+      // this internal:: prefix is needed by at least gcc 3.4 and ICC
+      if(!internal::isMuchSmallerThan(biggest_in_lower_part_of_c, biggest_in_upper_part_of_c, m_precision))
+        return;
+    }
+    dec().matrixQR()
+       .topLeftCorner(dec().rank(), dec().rank())
+       .template triangularView<Upper>()
+       .solveInPlace(c.topRows(dec().rank()));
+
+    for(Index i = 0; i < dec().rank(); ++i) dst.row(dec().colsPermutation().indices().coeff(i)) = c.row(i);
+    for(Index i = dec().rank(); i < cols; ++i) dst.row(dec().colsPermutation().indices().coeff(i)).setZero();
+  }
+};
+
+/** \ingroup QR_Module
+  *
+  * \brief Expression type for return value of FullPivHouseholderQR::matrixQ()
+  *
+  * \tparam MatrixType type of underlying dense matrix
+  */
+template<typename MatrixType> struct FullPivHouseholderQRMatrixQReturnType
+  : public ReturnByValue<FullPivHouseholderQRMatrixQReturnType<MatrixType> >
+{
+public:
+  typedef typename MatrixType::Index Index;
+  typedef typename internal::plain_col_type<MatrixType, Index>::type IntColVectorType;
+  typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+  typedef Matrix<typename MatrixType::Scalar, 1, MatrixType::RowsAtCompileTime, RowMajor, 1,
+                 MatrixType::MaxRowsAtCompileTime> WorkVectorType;
+
+  FullPivHouseholderQRMatrixQReturnType(const MatrixType&       qr,
+                                        const HCoeffsType&      hCoeffs,
+                                        const IntColVectorType& rowsTranspositions)
+    : m_qr(qr),
+      m_hCoeffs(hCoeffs),
+      m_rowsTranspositions(rowsTranspositions)
+      {}
+
+  template <typename ResultType>
+  void evalTo(ResultType& result) const
+  {
+    const Index rows = m_qr.rows();
+    WorkVectorType workspace(rows);
+    evalTo(result, workspace);
+  }
+
+  template <typename ResultType>
+  void evalTo(ResultType& result, WorkVectorType& workspace) const
+  {
+    using internal::conj;
+    // compute the product H'_0 H'_1 ... H'_n-1,
+    // where H_k is the k-th Householder transformation I - h_k v_k v_k'
+    // and v_k is the k-th Householder vector [1,m_qr(k+1,k), m_qr(k+2,k), ...]
+    const Index rows = m_qr.rows();
+    const Index cols = m_qr.cols();
+    const Index size = (std::min)(rows, cols);
+    workspace.resize(rows);
+    result.setIdentity(rows, rows);
+    for (Index k = size-1; k >= 0; k--)
+    {
+      result.block(k, k, rows-k, rows-k)
+            .applyHouseholderOnTheLeft(m_qr.col(k).tail(rows-k-1), conj(m_hCoeffs.coeff(k)), &workspace.coeffRef(k));
+      result.row(k).swap(result.row(m_rowsTranspositions.coeff(k)));
+    }
+  }
+
+    Index rows() const { return m_qr.rows(); }
+    Index cols() const { return m_qr.rows(); }
+
+protected:
+  typename MatrixType::Nested m_qr;
+  typename HCoeffsType::Nested m_hCoeffs;
+  typename IntColVectorType::Nested m_rowsTranspositions;
+};
+
+} // end namespace internal
+
+template<typename MatrixType>
+inline typename FullPivHouseholderQR<MatrixType>::MatrixQReturnType FullPivHouseholderQR<MatrixType>::matrixQ() const
+{
+  eigen_assert(m_isInitialized && "FullPivHouseholderQR is not initialized.");
+  return MatrixQReturnType(m_qr, m_hCoeffs, m_rows_transpositions);
+}
+
+/** \return the full-pivoting Householder QR decomposition of \c *this.
+  *
+  * \sa class FullPivHouseholderQR
+  */
+template<typename Derived>
+const FullPivHouseholderQR<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::fullPivHouseholderQr() const
+{
+  return FullPivHouseholderQR<PlainObject>(eval());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_FULLPIVOTINGHOUSEHOLDERQR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR.h b/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR.h
new file mode 100644
index 0000000..0314d52
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR.h
@@ -0,0 +1,351 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+// Copyright (C) 2010 Vincent Lejeune
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_QR_H
+#define EIGEN_QR_H
+
+namespace Eigen { 
+
+/** \ingroup QR_Module
+  *
+  *
+  * \class HouseholderQR
+  *
+  * \brief Householder QR decomposition of a matrix
+  *
+  * \param MatrixType the type of the matrix of which we are computing the QR decomposition
+  *
+  * This class performs a QR decomposition of a matrix \b A into matrices \b Q and \b R
+  * such that 
+  * \f[
+  *  \mathbf{A} = \mathbf{Q} \, \mathbf{R}
+  * \f]
+  * by using Householder transformations. Here, \b Q a unitary matrix and \b R an upper triangular matrix.
+  * The result is stored in a compact way compatible with LAPACK.
+  *
+  * Note that no pivoting is performed. This is \b not a rank-revealing decomposition.
+  * If you want that feature, use FullPivHouseholderQR or ColPivHouseholderQR instead.
+  *
+  * This Householder QR decomposition is faster, but less numerically stable and less feature-full than
+  * FullPivHouseholderQR or ColPivHouseholderQR.
+  *
+  * \sa MatrixBase::householderQr()
+  */
+template<typename _MatrixType> class HouseholderQR
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      Options = MatrixType::Options,
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime, (MatrixType::Flags&RowMajorBit) ? RowMajor : ColMajor, MaxRowsAtCompileTime, MaxRowsAtCompileTime> MatrixQType;
+    typedef typename internal::plain_diag_type<MatrixType>::type HCoeffsType;
+    typedef typename internal::plain_row_type<MatrixType>::type RowVectorType;
+    typedef typename HouseholderSequence<MatrixType,HCoeffsType>::ConjugateReturnType HouseholderSequenceType;
+
+    /**
+    * \brief Default Constructor.
+    *
+    * The default constructor is useful in cases in which the user intends to
+    * perform decompositions via HouseholderQR::compute(const MatrixType&).
+    */
+    HouseholderQR() : m_qr(), m_hCoeffs(), m_temp(), m_isInitialized(false) {}
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem \a size.
+      * \sa HouseholderQR()
+      */
+    HouseholderQR(Index rows, Index cols)
+      : m_qr(rows, cols),
+        m_hCoeffs((std::min)(rows,cols)),
+        m_temp(cols),
+        m_isInitialized(false) {}
+
+    HouseholderQR(const MatrixType& matrix)
+      : m_qr(matrix.rows(), matrix.cols()),
+        m_hCoeffs((std::min)(matrix.rows(),matrix.cols())),
+        m_temp(matrix.cols()),
+        m_isInitialized(false)
+    {
+      compute(matrix);
+    }
+
+    /** This method finds a solution x to the equation Ax=b, where A is the matrix of which
+      * *this is the QR decomposition, if any exists.
+      *
+      * \param b the right-hand-side of the equation to solve.
+      *
+      * \returns a solution.
+      *
+      * \note The case where b is a matrix is not yet implemented. Also, this
+      *       code is space inefficient.
+      *
+      * \note_about_checking_solutions
+      *
+      * \note_about_arbitrary_choice_of_solution
+      *
+      * Example: \include HouseholderQR_solve.cpp
+      * Output: \verbinclude HouseholderQR_solve.out
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<HouseholderQR, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+      return internal::solve_retval<HouseholderQR, Rhs>(*this, b.derived());
+    }
+
+    /** This method returns an expression of the unitary matrix Q as a sequence of Householder transformations.
+      *
+      * The returned expression can directly be used to perform matrix products. It can also be assigned to a dense Matrix object.
+      * Here is an example showing how to recover the full or thin matrix Q, as well as how to perform matrix products using operator*:
+      *
+      * Example: \include HouseholderQR_householderQ.cpp
+      * Output: \verbinclude HouseholderQR_householderQ.out
+      */
+    HouseholderSequenceType householderQ() const
+    {
+      eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+      return HouseholderSequenceType(m_qr, m_hCoeffs.conjugate());
+    }
+
+    /** \returns a reference to the matrix where the Householder QR decomposition is stored
+      * in a LAPACK-compatible way.
+      */
+    const MatrixType& matrixQR() const
+    {
+        eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+        return m_qr;
+    }
+
+    HouseholderQR& compute(const MatrixType& matrix);
+
+    /** \returns the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \warning a determinant can be very big or small, so for matrices
+      * of large enough dimension, there is a risk of overflow/underflow.
+      * One way to work around that is to use logAbsDeterminant() instead.
+      *
+      * \sa logAbsDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar absDeterminant() const;
+
+    /** \returns the natural log of the absolute value of the determinant of the matrix of which
+      * *this is the QR decomposition. It has only linear complexity
+      * (that is, O(n) where n is the dimension of the square matrix)
+      * as the QR decomposition has already been computed.
+      *
+      * \note This is only for square matrices.
+      *
+      * \note This method is useful to work around the risk of overflow/underflow that's inherent
+      * to determinant computation.
+      *
+      * \sa absDeterminant(), MatrixBase::determinant()
+      */
+    typename MatrixType::RealScalar logAbsDeterminant() const;
+
+    inline Index rows() const { return m_qr.rows(); }
+    inline Index cols() const { return m_qr.cols(); }
+    const HCoeffsType& hCoeffs() const { return m_hCoeffs; }
+
+  protected:
+    MatrixType m_qr;
+    HCoeffsType m_hCoeffs;
+    RowVectorType m_temp;
+    bool m_isInitialized;
+};
+
+template<typename MatrixType>
+typename MatrixType::RealScalar HouseholderQR<MatrixType>::absDeterminant() const
+{
+  using std::abs;
+  eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return abs(m_qr.diagonal().prod());
+}
+
+template<typename MatrixType>
+typename MatrixType::RealScalar HouseholderQR<MatrixType>::logAbsDeterminant() const
+{
+  eigen_assert(m_isInitialized && "HouseholderQR is not initialized.");
+  eigen_assert(m_qr.rows() == m_qr.cols() && "You can't take the determinant of a non-square matrix!");
+  return m_qr.diagonal().cwiseAbs().array().log().sum();
+}
+
+namespace internal {
+
+/** \internal */
+template<typename MatrixQR, typename HCoeffs>
+void householder_qr_inplace_unblocked(MatrixQR& mat, HCoeffs& hCoeffs, typename MatrixQR::Scalar* tempData = 0)
+{
+  typedef typename MatrixQR::Index Index;
+  typedef typename MatrixQR::Scalar Scalar;
+  typedef typename MatrixQR::RealScalar RealScalar;
+  Index rows = mat.rows();
+  Index cols = mat.cols();
+  Index size = (std::min)(rows,cols);
+
+  eigen_assert(hCoeffs.size() == size);
+
+  typedef Matrix<Scalar,MatrixQR::ColsAtCompileTime,1> TempType;
+  TempType tempVector;
+  if(tempData==0)
+  {
+    tempVector.resize(cols);
+    tempData = tempVector.data();
+  }
+
+  for(Index k = 0; k < size; ++k)
+  {
+    Index remainingRows = rows - k;
+    Index remainingCols = cols - k - 1;
+
+    RealScalar beta;
+    mat.col(k).tail(remainingRows).makeHouseholderInPlace(hCoeffs.coeffRef(k), beta);
+    mat.coeffRef(k,k) = beta;
+
+    // apply H to remaining part of m_qr from the left
+    mat.bottomRightCorner(remainingRows, remainingCols)
+        .applyHouseholderOnTheLeft(mat.col(k).tail(remainingRows-1), hCoeffs.coeffRef(k), tempData+k+1);
+  }
+}
+
+/** \internal */
+template<typename MatrixQR, typename HCoeffs>
+void householder_qr_inplace_blocked(MatrixQR& mat, HCoeffs& hCoeffs,
+                                       typename MatrixQR::Index maxBlockSize=32,
+                                       typename MatrixQR::Scalar* tempData = 0)
+{
+  typedef typename MatrixQR::Index Index;
+  typedef typename MatrixQR::Scalar Scalar;
+  typedef Block<MatrixQR,Dynamic,Dynamic> BlockType;
+
+  Index rows = mat.rows();
+  Index cols = mat.cols();
+  Index size = (std::min)(rows, cols);
+
+  typedef Matrix<Scalar,Dynamic,1,ColMajor,MatrixQR::MaxColsAtCompileTime,1> TempType;
+  TempType tempVector;
+  if(tempData==0)
+  {
+    tempVector.resize(cols);
+    tempData = tempVector.data();
+  }
+
+  Index blockSize = (std::min)(maxBlockSize,size);
+
+  Index k = 0;
+  for (k = 0; k < size; k += blockSize)
+  {
+    Index bs = (std::min)(size-k,blockSize);  // actual size of the block
+    Index tcols = cols - k - bs;            // trailing columns
+    Index brows = rows-k;                   // rows of the block
+
+    // partition the matrix:
+    //        A00 | A01 | A02
+    // mat  = A10 | A11 | A12
+    //        A20 | A21 | A22
+    // and performs the qr dec of [A11^T A12^T]^T
+    // and update [A21^T A22^T]^T using level 3 operations.
+    // Finally, the algorithm continue on A22
+
+    BlockType A11_21 = mat.block(k,k,brows,bs);
+    Block<HCoeffs,Dynamic,1> hCoeffsSegment = hCoeffs.segment(k,bs);
+
+    householder_qr_inplace_unblocked(A11_21, hCoeffsSegment, tempData);
+
+    if(tcols)
+    {
+      BlockType A21_22 = mat.block(k,k+bs,brows,tcols);
+      apply_block_householder_on_the_left(A21_22,A11_21,hCoeffsSegment.adjoint());
+    }
+  }
+}
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<HouseholderQR<_MatrixType>, Rhs>
+  : solve_retval_base<HouseholderQR<_MatrixType>, Rhs>
+{
+  EIGEN_MAKE_SOLVE_HELPERS(HouseholderQR<_MatrixType>,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    const Index rows = dec().rows(), cols = dec().cols();
+    const Index rank = (std::min)(rows, cols);
+    eigen_assert(rhs().rows() == rows);
+
+    typename Rhs::PlainObject c(rhs());
+
+    // Note that the matrix Q = H_0^* H_1^*... so its inverse is Q^* = (H_0 H_1 ...)^T
+    c.applyOnTheLeft(householderSequence(
+      dec().matrixQR().leftCols(rank),
+      dec().hCoeffs().head(rank)).transpose()
+    );
+
+    dec().matrixQR()
+       .topLeftCorner(rank, rank)
+       .template triangularView<Upper>()
+       .solveInPlace(c.topRows(rank));
+
+    dst.topRows(rank) = c.topRows(rank);
+    dst.bottomRows(cols-rank).setZero();
+  }
+};
+
+} // end namespace internal
+
+template<typename MatrixType>
+HouseholderQR<MatrixType>& HouseholderQR<MatrixType>::compute(const MatrixType& matrix)
+{
+  Index rows = matrix.rows();
+  Index cols = matrix.cols();
+  Index size = (std::min)(rows,cols);
+
+  m_qr = matrix;
+  m_hCoeffs.resize(size);
+
+  m_temp.resize(cols);
+
+  internal::householder_qr_inplace_blocked(m_qr, m_hCoeffs, 48, m_temp.data());
+
+  m_isInitialized = true;
+  return *this;
+}
+
+/** \return the Householder QR decomposition of \c *this.
+  *
+  * \sa class HouseholderQR
+  */
+template<typename Derived>
+const HouseholderQR<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::householderQr() const
+{
+  return HouseholderQR<PlainObject>(eval());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_QR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR_MKL.h b/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR_MKL.h
new file mode 100644
index 0000000..5313de6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/QR/HouseholderQR_MKL.h
@@ -0,0 +1,69 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Householder QR decomposition of a matrix w/o pivoting based on
+ *    LAPACKE_?geqrf function.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_QR_MKL_H
+#define EIGEN_QR_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_QR_NOPIV(EIGTYPE, MKLTYPE, MKLPREFIX) \
+template<typename MatrixQR, typename HCoeffs> \
+void householder_qr_inplace_blocked(MatrixQR& mat, HCoeffs& hCoeffs, \
+                                       typename MatrixQR::Index maxBlockSize=32, \
+                                       EIGTYPE* tempData = 0) \
+{ \
+  lapack_int m = mat.rows(); \
+  lapack_int n = mat.cols(); \
+  lapack_int lda = mat.outerStride(); \
+  lapack_int matrix_order = (MatrixQR::IsRowMajor) ? LAPACK_ROW_MAJOR : LAPACK_COL_MAJOR; \
+  LAPACKE_##MKLPREFIX##geqrf( matrix_order, m, n, (MKLTYPE*)mat.data(), lda, (MKLTYPE*)hCoeffs.data()); \
+  hCoeffs.adjointInPlace(); \
+\
+}
+
+EIGEN_MKL_QR_NOPIV(double, double, d)
+EIGEN_MKL_QR_NOPIV(float, float, s)
+EIGEN_MKL_QR_NOPIV(dcomplex, MKL_Complex16, z)
+EIGEN_MKL_QR_NOPIV(scomplex, MKL_Complex8, c)
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_QR_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/CMakeLists.txt
new file mode 100644
index 0000000..4968bea
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SPQRSupport_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_SPQRSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SPQRSupport/ COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h b/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
new file mode 100644
index 0000000..0ffb894
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
@@ -0,0 +1,304 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Desire Nuentsa <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SUITESPARSEQRSUPPORT_H
+#define EIGEN_SUITESPARSEQRSUPPORT_H
+
+namespace Eigen {
+  
+  template<typename MatrixType> class SPQR; 
+  template<typename SPQRType> struct SPQRMatrixQReturnType; 
+  template<typename SPQRType> struct SPQRMatrixQTransposeReturnType; 
+  template <typename SPQRType, typename Derived> struct SPQR_QProduct;
+  namespace internal {
+    template <typename SPQRType> struct traits<SPQRMatrixQReturnType<SPQRType> >
+    {
+      typedef typename SPQRType::MatrixType ReturnType;
+    };
+    template <typename SPQRType> struct traits<SPQRMatrixQTransposeReturnType<SPQRType> >
+    {
+      typedef typename SPQRType::MatrixType ReturnType;
+    };
+    template <typename SPQRType, typename Derived> struct traits<SPQR_QProduct<SPQRType, Derived> >
+    {
+      typedef typename Derived::PlainObject ReturnType;
+    };
+  } // End namespace internal
+  
+/**
+ * \ingroup SPQRSupport_Module
+ * \class SPQR
+ * \brief Sparse QR factorization based on SuiteSparseQR library
+ * 
+ * This class is used to perform a multithreaded and multifrontal rank-revealing QR decomposition 
+ * of sparse matrices. The result is then used to solve linear leasts_square systems.
+ * Clearly, a QR factorization is returned such that A*P = Q*R where :
+ * 
+ * P is the column permutation. Use colsPermutation() to get it.
+ * 
+ * Q is the orthogonal matrix represented as Householder reflectors. 
+ * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.
+ * You can then apply it to a vector.
+ * 
+ * R is the sparse triangular factor. Use matrixQR() to get it as SparseMatrix.
+ * NOTE : The Index type of R is always UF_long. You can get it with SPQR::Index
+ * 
+ * \tparam _MatrixType The type of the sparse matrix A, must be a column-major SparseMatrix<>
+ * NOTE 
+ * 
+ */
+template<typename _MatrixType>
+class SPQR
+{
+  public:
+    typedef typename _MatrixType::Scalar Scalar;
+    typedef typename _MatrixType::RealScalar RealScalar;
+    typedef UF_long Index ; 
+    typedef SparseMatrix<Scalar, ColMajor, Index> MatrixType;
+    typedef PermutationMatrix<Dynamic, Dynamic> PermutationType;
+  public:
+    SPQR() 
+    : m_ordering(SPQR_ORDERING_DEFAULT),
+      m_allow_tol(SPQR_DEFAULT_TOL),
+      m_tolerance (NumTraits<Scalar>::epsilon())
+    { 
+      cholmod_l_start(&m_cc);
+    }
+    
+    SPQR(const _MatrixType& matrix) 
+    : m_ordering(SPQR_ORDERING_DEFAULT),
+      m_allow_tol(SPQR_DEFAULT_TOL),
+      m_tolerance (NumTraits<Scalar>::epsilon())
+    {
+      cholmod_l_start(&m_cc);
+      compute(matrix);
+    }
+    
+    ~SPQR()
+    {
+      // Calls SuiteSparseQR_free()
+      cholmod_free_sparse(&m_H, &m_cc); 
+      cholmod_free_dense(&m_HTau, &m_cc);
+      delete[] m_E;
+      delete[] m_HPinv; 
+    }
+    void compute(const _MatrixType& matrix)
+    {
+      MatrixType mat(matrix);
+      cholmod_sparse A; 
+      A = viewAsCholmod(mat);
+      Index col = matrix.cols();
+      m_rank = SuiteSparseQR<Scalar>(m_ordering, m_tolerance, col, &A, 
+                             &m_cR, &m_E, &m_H, &m_HPinv, &m_HTau, &m_cc);
+
+      if (!m_cR)
+      {
+        m_info = NumericalIssue; 
+        m_isInitialized = false;
+        return;
+      }
+      m_info = Success;
+      m_isInitialized = true;
+      m_isRUpToDate = false;
+    }
+    /** 
+     * Get the number of rows of the input matrix and the Q matrix
+     */
+    inline Index rows() const {return m_H->nrow; }
+    
+    /** 
+     * Get the number of columns of the input matrix. 
+     */
+    inline Index cols() const { return m_cR->ncol; }
+   
+      /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<SPQR, Rhs> solve(const MatrixBase<Rhs>& B) const 
+    {
+      eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
+      eigen_assert(this->rows()==B.rows()
+                    && "SPQR::solve(): invalid number of rows of the right hand side matrix B");
+          return internal::solve_retval<SPQR, Rhs>(*this, B.derived());
+    }
+    
+    template<typename Rhs, typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
+    {
+      eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
+      eigen_assert(b.cols()==1 && "This method is for vectors only");
+      
+      //Compute Q^T * b
+      Dest y; 
+      y = matrixQ().transpose() * b;
+        // Solves with the triangular matrix R
+      Index rk = this->rank();
+      y.topRows(rk) = this->matrixR().topLeftCorner(rk, rk).template triangularView<Upper>().solve(y.topRows(rk));
+      y.bottomRows(cols()-rk).setZero();
+      // Apply the column permutation 
+      dest.topRows(cols()) = colsPermutation() * y.topRows(cols());
+      
+      m_info = Success;
+    }
+    
+    /** \returns the sparse triangular factor R. It is a sparse matrix
+     */
+    const MatrixType matrixR() const
+    {
+      eigen_assert(m_isInitialized && " The QR factorization should be computed first, call compute()");
+      if(!m_isRUpToDate) {
+        m_R = viewAsEigen<Scalar,ColMajor, typename MatrixType::Index>(*m_cR);
+        m_isRUpToDate = true;
+      }
+      return m_R;
+    }
+    /// Get an expression of the matrix Q
+    SPQRMatrixQReturnType<SPQR> matrixQ() const
+    {
+      return SPQRMatrixQReturnType<SPQR>(*this);
+    }
+    /// Get the permutation that was applied to columns of A
+    PermutationType colsPermutation() const
+    { 
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      Index n = m_cR->ncol;
+      PermutationType colsPerm(n);
+      for(Index j = 0; j <n; j++) colsPerm.indices()(j) = m_E[j];
+      return colsPerm; 
+      
+    }
+    /**
+     * Gets the rank of the matrix. 
+     * It should be equal to matrixQR().cols if the matrix is full-rank
+     */
+    Index rank() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_cc.SPQR_istat[4];
+    }
+    /// Set the fill-reducing ordering method to be used
+    void setSPQROrdering(int ord) { m_ordering = ord;}
+    /// Set the tolerance tol to treat columns with 2-norm < =tol as zero
+    void setPivotThreshold(const RealScalar& tol) { m_tolerance = tol; }
+    
+    /** \returns a pointer to the SPQR workspace */
+    cholmod_common *cholmodCommon() const { return &m_cc; }
+    
+    
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the sparse QR can not be computed
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+  protected:
+    bool m_isInitialized;
+    bool m_analysisIsOk;
+    bool m_factorizationIsOk;
+    mutable bool m_isRUpToDate;
+    mutable ComputationInfo m_info;
+    int m_ordering; // Ordering method to use, see SPQR's manual
+    int m_allow_tol; // Allow to use some tolerance during numerical factorization.
+    RealScalar m_tolerance; // treat columns with 2-norm below this tolerance as zero
+    mutable cholmod_sparse *m_cR; // The sparse R factor in cholmod format
+    mutable MatrixType m_R; // The sparse matrix R in Eigen format
+    mutable Index *m_E; // The permutation applied to columns
+    mutable cholmod_sparse *m_H;  //The householder vectors
+    mutable Index *m_HPinv; // The row permutation of H
+    mutable cholmod_dense *m_HTau; // The Householder coefficients
+    mutable Index m_rank; // The rank of the matrix
+    mutable cholmod_common m_cc; // Workspace and parameters
+    template<typename ,typename > friend struct SPQR_QProduct;
+};
+
+template <typename SPQRType, typename Derived>
+struct SPQR_QProduct : ReturnByValue<SPQR_QProduct<SPQRType,Derived> >
+{
+  typedef typename SPQRType::Scalar Scalar;
+  typedef typename SPQRType::Index Index;
+  //Define the constructor to get reference to argument types
+  SPQR_QProduct(const SPQRType& spqr, const Derived& other, bool transpose) : m_spqr(spqr),m_other(other),m_transpose(transpose) {}
+  
+  inline Index rows() const { return m_transpose ? m_spqr.rows() : m_spqr.cols(); }
+  inline Index cols() const { return m_other.cols(); }
+  // Assign to a vector
+  template<typename ResType>
+  void evalTo(ResType& res) const
+  {
+    cholmod_dense y_cd;
+    cholmod_dense *x_cd; 
+    int method = m_transpose ? SPQR_QTX : SPQR_QX; 
+    cholmod_common *cc = m_spqr.cholmodCommon();
+    y_cd = viewAsCholmod(m_other.const_cast_derived());
+    x_cd = SuiteSparseQR_qmult<Scalar>(method, m_spqr.m_H, m_spqr.m_HTau, m_spqr.m_HPinv, &y_cd, cc);
+    res = Matrix<Scalar,ResType::RowsAtCompileTime,ResType::ColsAtCompileTime>::Map(reinterpret_cast<Scalar*>(x_cd->x), x_cd->nrow, x_cd->ncol);
+    cholmod_free_dense(&x_cd, cc); 
+  }
+  const SPQRType& m_spqr; 
+  const Derived& m_other; 
+  bool m_transpose; 
+  
+};
+template<typename SPQRType>
+struct SPQRMatrixQReturnType{
+  
+  SPQRMatrixQReturnType(const SPQRType& spqr) : m_spqr(spqr) {}
+  template<typename Derived>
+  SPQR_QProduct<SPQRType, Derived> operator*(const MatrixBase<Derived>& other)
+  {
+    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(),false);
+  }
+  SPQRMatrixQTransposeReturnType<SPQRType> adjoint() const
+  {
+    return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);
+  }
+  // To use for operations with the transpose of Q
+  SPQRMatrixQTransposeReturnType<SPQRType> transpose() const
+  {
+    return SPQRMatrixQTransposeReturnType<SPQRType>(m_spqr);
+  }
+  const SPQRType& m_spqr;
+};
+
+template<typename SPQRType>
+struct SPQRMatrixQTransposeReturnType{
+  SPQRMatrixQTransposeReturnType(const SPQRType& spqr) : m_spqr(spqr) {}
+  template<typename Derived>
+  SPQR_QProduct<SPQRType,Derived> operator*(const MatrixBase<Derived>& other)
+  {
+    return SPQR_QProduct<SPQRType,Derived>(m_spqr,other.derived(), true);
+  }
+  const SPQRType& m_spqr;
+};
+
+namespace internal {
+  
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<SPQR<_MatrixType>, Rhs>
+  : solve_retval_base<SPQR<_MatrixType>, Rhs>
+{
+  typedef SPQR<_MatrixType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+}// End namespace Eigen
+#endif
\ No newline at end of file
diff --git a/vendor/eigen-3.1.91/Eigen/src/SVD/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SVD/CMakeLists.txt
new file mode 100644
index 0000000..55efc44
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SVD/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SVD_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_SVD_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SVD COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD.h b/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD.h
new file mode 100644
index 0000000..495d3fa
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD.h
@@ -0,0 +1,884 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_JACOBISVD_H
+#define EIGEN_JACOBISVD_H
+
+namespace Eigen { 
+
+namespace internal {
+// forward declaration (needed by ICC)
+// the empty body is required by MSVC
+template<typename MatrixType, int QRPreconditioner,
+         bool IsComplex = NumTraits<typename MatrixType::Scalar>::IsComplex>
+struct svd_precondition_2x2_block_to_be_real {};
+
+/*** QR preconditioners (R-SVD)
+ ***
+ *** Their role is to reduce the problem of computing the SVD to the case of a square matrix.
+ *** This approach, known as R-SVD, is an optimization for rectangular-enough matrices, and is a requirement for
+ *** JacobiSVD which by itself is only able to work on square matrices.
+ ***/
+
+enum { PreconditionIfMoreColsThanRows, PreconditionIfMoreRowsThanCols };
+
+template<typename MatrixType, int QRPreconditioner, int Case>
+struct qr_preconditioner_should_do_anything
+{
+  enum { a = MatrixType::RowsAtCompileTime != Dynamic &&
+             MatrixType::ColsAtCompileTime != Dynamic &&
+             MatrixType::ColsAtCompileTime <= MatrixType::RowsAtCompileTime,
+         b = MatrixType::RowsAtCompileTime != Dynamic &&
+             MatrixType::ColsAtCompileTime != Dynamic &&
+             MatrixType::RowsAtCompileTime <= MatrixType::ColsAtCompileTime,
+         ret = !( (QRPreconditioner == NoQRPreconditioner) ||
+                  (Case == PreconditionIfMoreColsThanRows && bool(a)) ||
+                  (Case == PreconditionIfMoreRowsThanCols && bool(b)) )
+  };
+};
+
+template<typename MatrixType, int QRPreconditioner, int Case,
+         bool DoAnything = qr_preconditioner_should_do_anything<MatrixType, QRPreconditioner, Case>::ret
+> struct qr_preconditioner_impl {};
+
+template<typename MatrixType, int QRPreconditioner, int Case>
+class qr_preconditioner_impl<MatrixType, QRPreconditioner, Case, false>
+{
+public:
+  typedef typename MatrixType::Index Index;
+  void allocate(const JacobiSVD<MatrixType, QRPreconditioner>&) {}
+  bool run(JacobiSVD<MatrixType, QRPreconditioner>&, const MatrixType&)
+  {
+    return false;
+  }
+};
+
+/*** preconditioner using FullPivHouseholderQR ***/
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  enum
+  {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime
+  };
+  typedef Matrix<Scalar, 1, RowsAtCompileTime, RowMajor, 1, MaxRowsAtCompileTime> WorkspaceType;
+
+  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)
+  {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.rows(), svd.cols());
+    }
+    if (svd.m_computeFullU) m_workspace.resize(svd.rows());
+  }
+
+  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.rows() > matrix.cols())
+    {
+      m_qr.compute(matrix);
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
+      if(svd.m_computeFullU) m_qr.matrixQ().evalTo(svd.m_matrixU, m_workspace);
+      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
+      return true;
+    }
+    return false;
+  }
+private:
+  typedef FullPivHouseholderQR<MatrixType> QRType;
+  QRType m_qr;
+  WorkspaceType m_workspace;
+};
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, FullPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  enum
+  {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+    Options = MatrixType::Options
+  };
+  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>
+          TransposeTypeWithSameStorageOrder;
+
+  void allocate(const JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd)
+  {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.cols(), svd.rows());
+    }
+    m_adjoint.resize(svd.cols(), svd.rows());
+    if (svd.m_computeFullV) m_workspace.resize(svd.cols());
+  }
+
+  bool run(JacobiSVD<MatrixType, FullPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.cols() > matrix.rows())
+    {
+      m_adjoint = matrix.adjoint();
+      m_qr.compute(m_adjoint);
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
+      if(svd.m_computeFullV) m_qr.matrixQ().evalTo(svd.m_matrixV, m_workspace);
+      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
+      return true;
+    }
+    else return false;
+  }
+private:
+  typedef FullPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
+  QRType m_qr;
+  TransposeTypeWithSameStorageOrder m_adjoint;
+  typename internal::plain_row_type<MatrixType>::type m_workspace;
+};
+
+/*** preconditioner using ColPivHouseholderQR ***/
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+
+  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)
+  {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.rows(), svd.cols());
+    }
+    if (svd.m_computeFullU) m_workspace.resize(svd.rows());
+    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());
+  }
+
+  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.rows() > matrix.cols())
+    {
+      m_qr.compute(matrix);
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
+      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
+      else if(svd.m_computeThinU)
+      {
+        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());
+        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);
+      }
+      if(svd.computeV()) svd.m_matrixV = m_qr.colsPermutation();
+      return true;
+    }
+    return false;
+  }
+
+private:
+  typedef ColPivHouseholderQR<MatrixType> QRType;
+  QRType m_qr;
+  typename internal::plain_col_type<MatrixType>::type m_workspace;
+};
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, ColPivHouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  enum
+  {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+    Options = MatrixType::Options
+  };
+
+  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>
+          TransposeTypeWithSameStorageOrder;
+
+  void allocate(const JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd)
+  {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.cols(), svd.rows());
+    }
+    if (svd.m_computeFullV) m_workspace.resize(svd.cols());
+    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());
+    m_adjoint.resize(svd.cols(), svd.rows());
+  }
+
+  bool run(JacobiSVD<MatrixType, ColPivHouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.cols() > matrix.rows())
+    {
+      m_adjoint = matrix.adjoint();
+      m_qr.compute(m_adjoint);
+
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
+      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
+      else if(svd.m_computeThinV)
+      {
+        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());
+        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);
+      }
+      if(svd.computeU()) svd.m_matrixU = m_qr.colsPermutation();
+      return true;
+    }
+    else return false;
+  }
+
+private:
+  typedef ColPivHouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
+  QRType m_qr;
+  TransposeTypeWithSameStorageOrder m_adjoint;
+  typename internal::plain_row_type<MatrixType>::type m_workspace;
+};
+
+/*** preconditioner using HouseholderQR ***/
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreRowsThanCols, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+
+  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)
+  {
+    if (svd.rows() != m_qr.rows() || svd.cols() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.rows(), svd.cols());
+    }
+    if (svd.m_computeFullU) m_workspace.resize(svd.rows());
+    else if (svd.m_computeThinU) m_workspace.resize(svd.cols());
+  }
+
+  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.rows() > matrix.cols())
+    {
+      m_qr.compute(matrix);
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.cols(),matrix.cols()).template triangularView<Upper>();
+      if(svd.m_computeFullU) m_qr.householderQ().evalTo(svd.m_matrixU, m_workspace);
+      else if(svd.m_computeThinU)
+      {
+        svd.m_matrixU.setIdentity(matrix.rows(), matrix.cols());
+        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixU, m_workspace);
+      }
+      if(svd.computeV()) svd.m_matrixV.setIdentity(matrix.cols(), matrix.cols());
+      return true;
+    }
+    return false;
+  }
+private:
+  typedef HouseholderQR<MatrixType> QRType;
+  QRType m_qr;
+  typename internal::plain_col_type<MatrixType>::type m_workspace;
+};
+
+template<typename MatrixType>
+class qr_preconditioner_impl<MatrixType, HouseholderQRPreconditioner, PreconditionIfMoreColsThanRows, true>
+{
+public:
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  enum
+  {
+    RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+    ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+    MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+    Options = MatrixType::Options
+  };
+
+  typedef Matrix<Scalar, ColsAtCompileTime, RowsAtCompileTime, Options, MaxColsAtCompileTime, MaxRowsAtCompileTime>
+          TransposeTypeWithSameStorageOrder;
+
+  void allocate(const JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd)
+  {
+    if (svd.cols() != m_qr.rows() || svd.rows() != m_qr.cols())
+    {
+      m_qr.~QRType();
+      ::new (&m_qr) QRType(svd.cols(), svd.rows());
+    }
+    if (svd.m_computeFullV) m_workspace.resize(svd.cols());
+    else if (svd.m_computeThinV) m_workspace.resize(svd.rows());
+    m_adjoint.resize(svd.cols(), svd.rows());
+  }
+
+  bool run(JacobiSVD<MatrixType, HouseholderQRPreconditioner>& svd, const MatrixType& matrix)
+  {
+    if(matrix.cols() > matrix.rows())
+    {
+      m_adjoint = matrix.adjoint();
+      m_qr.compute(m_adjoint);
+
+      svd.m_workMatrix = m_qr.matrixQR().block(0,0,matrix.rows(),matrix.rows()).template triangularView<Upper>().adjoint();
+      if(svd.m_computeFullV) m_qr.householderQ().evalTo(svd.m_matrixV, m_workspace);
+      else if(svd.m_computeThinV)
+      {
+        svd.m_matrixV.setIdentity(matrix.cols(), matrix.rows());
+        m_qr.householderQ().applyThisOnTheLeft(svd.m_matrixV, m_workspace);
+      }
+      if(svd.computeU()) svd.m_matrixU.setIdentity(matrix.rows(), matrix.rows());
+      return true;
+    }
+    else return false;
+  }
+
+private:
+  typedef HouseholderQR<TransposeTypeWithSameStorageOrder> QRType;
+  QRType m_qr;
+  TransposeTypeWithSameStorageOrder m_adjoint;
+  typename internal::plain_row_type<MatrixType>::type m_workspace;
+};
+
+/*** 2x2 SVD implementation
+ ***
+ *** JacobiSVD consists in performing a series of 2x2 SVD subproblems
+ ***/
+
+template<typename MatrixType, int QRPreconditioner>
+struct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, false>
+{
+  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;
+  typedef typename SVD::Index Index;
+  static void run(typename SVD::WorkMatrixType&, SVD&, Index, Index) {}
+};
+
+template<typename MatrixType, int QRPreconditioner>
+struct svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner, true>
+{
+  typedef JacobiSVD<MatrixType, QRPreconditioner> SVD;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef typename MatrixType::RealScalar RealScalar;
+  typedef typename SVD::Index Index;
+  static void run(typename SVD::WorkMatrixType& work_matrix, SVD& svd, Index p, Index q)
+  {
+    using std::sqrt;
+    Scalar z;
+    JacobiRotation<Scalar> rot;
+    RealScalar n = sqrt(abs2(work_matrix.coeff(p,p)) + abs2(work_matrix.coeff(q,p)));
+    if(n==0)
+    {
+      z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);
+      work_matrix.row(p) *= z;
+      if(svd.computeU()) svd.m_matrixU.col(p) *= conj(z);
+      z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);
+      work_matrix.row(q) *= z;
+      if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
+    }
+    else
+    {
+      rot.c() = conj(work_matrix.coeff(p,p)) / n;
+      rot.s() = work_matrix.coeff(q,p) / n;
+      work_matrix.applyOnTheLeft(p,q,rot);
+      if(svd.computeU()) svd.m_matrixU.applyOnTheRight(p,q,rot.adjoint());
+      if(work_matrix.coeff(p,q) != Scalar(0))
+      {
+        Scalar z = abs(work_matrix.coeff(p,q)) / work_matrix.coeff(p,q);
+        work_matrix.col(q) *= z;
+        if(svd.computeV()) svd.m_matrixV.col(q) *= z;
+      }
+      if(work_matrix.coeff(q,q) != Scalar(0))
+      {
+        z = abs(work_matrix.coeff(q,q)) / work_matrix.coeff(q,q);
+        work_matrix.row(q) *= z;
+        if(svd.computeU()) svd.m_matrixU.col(q) *= conj(z);
+      }
+    }
+  }
+};
+
+template<typename MatrixType, typename RealScalar, typename Index>
+void real_2x2_jacobi_svd(const MatrixType& matrix, Index p, Index q,
+                            JacobiRotation<RealScalar> *j_left,
+                            JacobiRotation<RealScalar> *j_right)
+{
+  using std::sqrt;
+  Matrix<RealScalar,2,2> m;
+  m << real(matrix.coeff(p,p)), real(matrix.coeff(p,q)),
+       real(matrix.coeff(q,p)), real(matrix.coeff(q,q));
+  JacobiRotation<RealScalar> rot1;
+  RealScalar t = m.coeff(0,0) + m.coeff(1,1);
+  RealScalar d = m.coeff(1,0) - m.coeff(0,1);
+  if(t == RealScalar(0))
+  {
+    rot1.c() = RealScalar(0);
+    rot1.s() = d > RealScalar(0) ? RealScalar(1) : RealScalar(-1);
+  }
+  else
+  {
+    RealScalar u = d / t;
+    rot1.c() = RealScalar(1) / sqrt(RealScalar(1) + abs2(u));
+    rot1.s() = rot1.c() * u;
+  }
+  m.applyOnTheLeft(0,1,rot1);
+  j_right->makeJacobi(m,0,1);
+  *j_left  = rot1 * j_right->transpose();
+}
+
+} // end namespace internal
+
+/** \ingroup SVD_Module
+  *
+  *
+  * \class JacobiSVD
+  *
+  * \brief Two-sided Jacobi SVD decomposition of a rectangular matrix
+  *
+  * \param MatrixType the type of the matrix of which we are computing the SVD decomposition
+  * \param QRPreconditioner this optional parameter allows to specify the type of QR decomposition that will be used internally
+  *                        for the R-SVD step for non-square matrices. See discussion of possible values below.
+  *
+  * SVD decomposition consists in decomposing any n-by-p matrix \a A as a product
+  *   \f[ A = U S V^* \f]
+  * where \a U is a n-by-n unitary, \a V is a p-by-p unitary, and \a S is a n-by-p real positive matrix which is zero outside of its main diagonal;
+  * the diagonal entries of S are known as the \em singular \em values of \a A and the columns of \a U and \a V are known as the left
+  * and right \em singular \em vectors of \a A respectively.
+  *
+  * Singular values are always sorted in decreasing order.
+  *
+  * This JacobiSVD decomposition computes only the singular values by default. If you want \a U or \a V, you need to ask for them explicitly.
+  *
+  * You can ask for only \em thin \a U or \a V to be computed, meaning the following. In case of a rectangular n-by-p matrix, letting \a m be the
+  * smaller value among \a n and \a p, there are only \a m singular vectors; the remaining columns of \a U and \a V do not correspond to actual
+  * singular vectors. Asking for \em thin \a U or \a V means asking for only their \a m first columns to be formed. So \a U is then a n-by-m matrix,
+  * and \a V is then a p-by-m matrix. Notice that thin \a U and \a V are all you need for (least squares) solving.
+  *
+  * Here's an example demonstrating basic usage:
+  * \include JacobiSVD_basic.cpp
+  * Output: \verbinclude JacobiSVD_basic.out
+  *
+  * This JacobiSVD class is a two-sided Jacobi R-SVD decomposition, ensuring optimal reliability and accuracy. The downside is that it's slower than
+  * bidiagonalizing SVD algorithms for large square matrices; however its complexity is still \f$ O(n^2p) \f$ where \a n is the smaller dimension and
+  * \a p is the greater dimension, meaning that it is still of the same order of complexity as the faster bidiagonalizing R-SVD algorithms.
+  * In particular, like any R-SVD, it takes advantage of non-squareness in that its complexity is only linear in the greater dimension.
+  *
+  * If the input matrix has inf or nan coefficients, the result of the computation is undefined, but the computation is guaranteed to
+  * terminate in finite (and reasonable) time.
+  *
+  * The possible values for QRPreconditioner are:
+  * \li ColPivHouseholderQRPreconditioner is the default. In practice it's very safe. It uses column-pivoting QR.
+  * \li FullPivHouseholderQRPreconditioner, is the safest and slowest. It uses full-pivoting QR.
+  *     Contrary to other QRs, it doesn't allow computing thin unitaries.
+  * \li HouseholderQRPreconditioner is the fastest, and less safe and accurate than the pivoting variants. It uses non-pivoting QR.
+  *     This is very similar in safety and accuracy to the bidiagonalization process used by bidiagonalizing SVD algorithms (since bidiagonalization
+  *     is inherently non-pivoting). However the resulting SVD is still more reliable than bidiagonalizing SVDs because the Jacobi-based iterarive
+  *     process is more reliable than the optimized bidiagonal SVD iterations.
+  * \li NoQRPreconditioner allows not to use a QR preconditioner at all. This is useful if you know that you will only be computing
+  *     JacobiSVD decompositions of square matrices. Non-square matrices require a QR preconditioner. Using this option will result in
+  *     faster compilation and smaller executable code. It won't significantly speed up computation, since JacobiSVD is always checking
+  *     if QR preconditioning is needed before applying it anyway.
+  *
+  * \sa MatrixBase::jacobiSvd()
+  */
+template<typename _MatrixType, int QRPreconditioner> class JacobiSVD
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename NumTraits<typename MatrixType::Scalar>::Real RealScalar;
+    typedef typename MatrixType::Index Index;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      DiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_DYNAMIC(RowsAtCompileTime,ColsAtCompileTime),
+      MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
+      MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
+      MaxDiagSizeAtCompileTime = EIGEN_SIZE_MIN_PREFER_FIXED(MaxRowsAtCompileTime,MaxColsAtCompileTime),
+      MatrixOptions = MatrixType::Options
+    };
+
+    typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime,
+                   MatrixOptions, MaxRowsAtCompileTime, MaxRowsAtCompileTime>
+            MatrixUType;
+    typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime,
+                   MatrixOptions, MaxColsAtCompileTime, MaxColsAtCompileTime>
+            MatrixVType;
+    typedef typename internal::plain_diag_type<MatrixType, RealScalar>::type SingularValuesType;
+    typedef typename internal::plain_row_type<MatrixType>::type RowType;
+    typedef typename internal::plain_col_type<MatrixType>::type ColType;
+    typedef Matrix<Scalar, DiagSizeAtCompileTime, DiagSizeAtCompileTime,
+                   MatrixOptions, MaxDiagSizeAtCompileTime, MaxDiagSizeAtCompileTime>
+            WorkMatrixType;
+
+    /** \brief Default Constructor.
+      *
+      * The default constructor is useful in cases in which the user intends to
+      * perform decompositions via JacobiSVD::compute(const MatrixType&).
+      */
+    JacobiSVD()
+      : m_isInitialized(false),
+        m_isAllocated(false),
+        m_computationOptions(0),
+        m_rows(-1), m_cols(-1)
+    {}
+
+
+    /** \brief Default Constructor with memory preallocation
+      *
+      * Like the default constructor but with preallocation of the internal data
+      * according to the specified problem size.
+      * \sa JacobiSVD()
+      */
+    JacobiSVD(Index rows, Index cols, unsigned int computationOptions = 0)
+      : m_isInitialized(false),
+        m_isAllocated(false),
+        m_computationOptions(0),
+        m_rows(-1), m_cols(-1)
+    {
+      allocate(rows, cols, computationOptions);
+    }
+
+    /** \brief Constructor performing the decomposition of given matrix.
+     *
+     * \param matrix the matrix to decompose
+     * \param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.
+     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,
+     *                           #ComputeFullV, #ComputeThinV.
+     *
+     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not
+     * available with the (non-default) FullPivHouseholderQR preconditioner.
+     */
+    JacobiSVD(const MatrixType& matrix, unsigned int computationOptions = 0)
+      : m_isInitialized(false),
+        m_isAllocated(false),
+        m_computationOptions(0),
+        m_rows(-1), m_cols(-1)
+    {
+      compute(matrix, computationOptions);
+    }
+
+    /** \brief Method performing the decomposition of given matrix using custom options.
+     *
+     * \param matrix the matrix to decompose
+     * \param computationOptions optional parameter allowing to specify if you want full or thin U or V unitaries to be computed.
+     *                           By default, none is computed. This is a bit-field, the possible bits are #ComputeFullU, #ComputeThinU,
+     *                           #ComputeFullV, #ComputeThinV.
+     *
+     * Thin unitaries are only available if your matrix type has a Dynamic number of columns (for example MatrixXf). They also are not
+     * available with the (non-default) FullPivHouseholderQR preconditioner.
+     */
+    JacobiSVD& compute(const MatrixType& matrix, unsigned int computationOptions);
+
+    /** \brief Method performing the decomposition of given matrix using current options.
+     *
+     * \param matrix the matrix to decompose
+     *
+     * This method uses the current \a computationOptions, as already passed to the constructor or to compute(const MatrixType&, unsigned int).
+     */
+    JacobiSVD& compute(const MatrixType& matrix)
+    {
+      return compute(matrix, m_computationOptions);
+    }
+
+    /** \returns the \a U matrix.
+     *
+     * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p,
+     * the U matrix is n-by-n if you asked for #ComputeFullU, and is n-by-m if you asked for #ComputeThinU.
+     *
+     * The \a m first columns of \a U are the left singular vectors of the matrix being decomposed.
+     *
+     * This method asserts that you asked for \a U to be computed.
+     */
+    const MatrixUType& matrixU() const
+    {
+      eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
+      eigen_assert(computeU() && "This JacobiSVD decomposition didn't compute U. Did you ask for it?");
+      return m_matrixU;
+    }
+
+    /** \returns the \a V matrix.
+     *
+     * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p,
+     * the V matrix is p-by-p if you asked for #ComputeFullV, and is p-by-m if you asked for ComputeThinV.
+     *
+     * The \a m first columns of \a V are the right singular vectors of the matrix being decomposed.
+     *
+     * This method asserts that you asked for \a V to be computed.
+     */
+    const MatrixVType& matrixV() const
+    {
+      eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
+      eigen_assert(computeV() && "This JacobiSVD decomposition didn't compute V. Did you ask for it?");
+      return m_matrixV;
+    }
+
+    /** \returns the vector of singular values.
+     *
+     * For the SVD decomposition of a n-by-p matrix, letting \a m be the minimum of \a n and \a p, the
+     * returned vector has size \a m.  Singular values are always sorted in decreasing order.
+     */
+    const SingularValuesType& singularValues() const
+    {
+      eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
+      return m_singularValues;
+    }
+
+    /** \returns true if \a U (full or thin) is asked for in this SVD decomposition */
+    inline bool computeU() const { return m_computeFullU || m_computeThinU; }
+    /** \returns true if \a V (full or thin) is asked for in this SVD decomposition */
+    inline bool computeV() const { return m_computeFullV || m_computeThinV; }
+
+    /** \returns a (least squares) solution of \f$ A x = b \f$ using the current SVD decomposition of A.
+      *
+      * \param b the right-hand-side of the equation to solve.
+      *
+      * \note Solving requires both U and V to be computed. Thin U and V are enough, there is no need for full U or V.
+      *
+      * \note SVD solving is implicitly least-squares. Thus, this method serves both purposes of exact solving and least-squares solving.
+      * In other words, the returned solution is guaranteed to minimize the Euclidean norm \f$ \Vert A x - b \Vert \f$.
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<JacobiSVD, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
+      eigen_assert(computeU() && computeV() && "JacobiSVD::solve() requires both unitaries U and V to be computed (thin unitaries suffice).");
+      return internal::solve_retval<JacobiSVD, Rhs>(*this, b.derived());
+    }
+
+    /** \returns the number of singular values that are not exactly 0 */
+    Index nonzeroSingularValues() const
+    {
+      eigen_assert(m_isInitialized && "JacobiSVD is not initialized.");
+      return m_nonzeroSingularValues;
+    }
+
+    inline Index rows() const { return m_rows; }
+    inline Index cols() const { return m_cols; }
+
+  private:
+    void allocate(Index rows, Index cols, unsigned int computationOptions);
+
+  protected:
+    MatrixUType m_matrixU;
+    MatrixVType m_matrixV;
+    SingularValuesType m_singularValues;
+    WorkMatrixType m_workMatrix;
+    bool m_isInitialized, m_isAllocated;
+    bool m_computeFullU, m_computeThinU;
+    bool m_computeFullV, m_computeThinV;
+    unsigned int m_computationOptions;
+    Index m_nonzeroSingularValues, m_rows, m_cols, m_diagSize;
+
+    template<typename __MatrixType, int _QRPreconditioner, bool _IsComplex>
+    friend struct internal::svd_precondition_2x2_block_to_be_real;
+    template<typename __MatrixType, int _QRPreconditioner, int _Case, bool _DoAnything>
+    friend struct internal::qr_preconditioner_impl;
+
+    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreColsThanRows> m_qr_precond_morecols;
+    internal::qr_preconditioner_impl<MatrixType, QRPreconditioner, internal::PreconditionIfMoreRowsThanCols> m_qr_precond_morerows;
+};
+
+template<typename MatrixType, int QRPreconditioner>
+void JacobiSVD<MatrixType, QRPreconditioner>::allocate(Index rows, Index cols, unsigned int computationOptions)
+{
+  eigen_assert(rows >= 0 && cols >= 0);
+
+  if (m_isAllocated &&
+      rows == m_rows &&
+      cols == m_cols &&
+      computationOptions == m_computationOptions)
+  {
+    return;
+  }
+
+  m_rows = rows;
+  m_cols = cols;
+  m_isInitialized = false;
+  m_isAllocated = true;
+  m_computationOptions = computationOptions;
+  m_computeFullU = (computationOptions & ComputeFullU) != 0;
+  m_computeThinU = (computationOptions & ComputeThinU) != 0;
+  m_computeFullV = (computationOptions & ComputeFullV) != 0;
+  m_computeThinV = (computationOptions & ComputeThinV) != 0;
+  eigen_assert(!(m_computeFullU && m_computeThinU) && "JacobiSVD: you can't ask for both full and thin U");
+  eigen_assert(!(m_computeFullV && m_computeThinV) && "JacobiSVD: you can't ask for both full and thin V");
+  eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV, MatrixType::ColsAtCompileTime==Dynamic) &&
+              "JacobiSVD: thin U and V are only available when your matrix has a dynamic number of columns.");
+  if (QRPreconditioner == FullPivHouseholderQRPreconditioner)
+  {
+      eigen_assert(!(m_computeThinU || m_computeThinV) &&
+              "JacobiSVD: can't compute thin U or thin V with the FullPivHouseholderQR preconditioner. "
+              "Use the ColPivHouseholderQR preconditioner instead.");
+  }
+  m_diagSize = (std::min)(m_rows, m_cols);
+  m_singularValues.resize(m_diagSize);
+  if(RowsAtCompileTime==Dynamic)
+    m_matrixU.resize(m_rows, m_computeFullU ? m_rows
+                            : m_computeThinU ? m_diagSize
+                            : 0);
+  if(ColsAtCompileTime==Dynamic)
+    m_matrixV.resize(m_cols, m_computeFullV ? m_cols
+                            : m_computeThinV ? m_diagSize
+                            : 0);
+  m_workMatrix.resize(m_diagSize, m_diagSize);
+  
+  if(m_cols>m_rows) m_qr_precond_morecols.allocate(*this);
+  if(m_rows>m_cols) m_qr_precond_morerows.allocate(*this);
+}
+
+template<typename MatrixType, int QRPreconditioner>
+JacobiSVD<MatrixType, QRPreconditioner>&
+JacobiSVD<MatrixType, QRPreconditioner>::compute(const MatrixType& matrix, unsigned int computationOptions)
+{
+  using std::abs;
+  allocate(matrix.rows(), matrix.cols(), computationOptions);
+
+  // currently we stop when we reach precision 2*epsilon as the last bit of precision can require an unreasonable number of iterations,
+  // only worsening the precision of U and V as we accumulate more rotations
+  const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();
+
+  // limit for very small denormal numbers to be considered zero in order to avoid infinite loops (see bug 286)
+  const RealScalar considerAsZero = RealScalar(2) * std::numeric_limits<RealScalar>::denorm_min();
+
+  /*** step 1. The R-SVD step: we use a QR decomposition to reduce to the case of a square matrix */
+
+  if(!m_qr_precond_morecols.run(*this, matrix) && !m_qr_precond_morerows.run(*this, matrix))
+  {
+    m_workMatrix = matrix.block(0,0,m_diagSize,m_diagSize);
+    if(m_computeFullU) m_matrixU.setIdentity(m_rows,m_rows);
+    if(m_computeThinU) m_matrixU.setIdentity(m_rows,m_diagSize);
+    if(m_computeFullV) m_matrixV.setIdentity(m_cols,m_cols);
+    if(m_computeThinV) m_matrixV.setIdentity(m_cols, m_diagSize);
+  }
+
+  /*** step 2. The main Jacobi SVD iteration. ***/
+
+  bool finished = false;
+  while(!finished)
+  {
+    finished = true;
+
+    // do a sweep: for all index pairs (p,q), perform SVD of the corresponding 2x2 sub-matrix
+
+    for(Index p = 1; p < m_diagSize; ++p)
+    {
+      for(Index q = 0; q < p; ++q)
+      {
+        // if this 2x2 sub-matrix is not diagonal already...
+        // notice that this comparison will evaluate to false if any NaN is involved, ensuring that NaN's don't
+        // keep us iterating forever. Similarly, small denormal numbers are considered zero.
+        using std::max;
+        RealScalar threshold = (max)(considerAsZero, precision * (max)(abs(m_workMatrix.coeff(p,p)),
+                                                                       abs(m_workMatrix.coeff(q,q))));
+        if((max)(abs(m_workMatrix.coeff(p,q)),abs(m_workMatrix.coeff(q,p))) > threshold)
+        {
+          finished = false;
+
+          // perform SVD decomposition of 2x2 sub-matrix corresponding to indices p,q to make it diagonal
+          internal::svd_precondition_2x2_block_to_be_real<MatrixType, QRPreconditioner>::run(m_workMatrix, *this, p, q);
+          JacobiRotation<RealScalar> j_left, j_right;
+          internal::real_2x2_jacobi_svd(m_workMatrix, p, q, &j_left, &j_right);
+
+          // accumulate resulting Jacobi rotations
+          m_workMatrix.applyOnTheLeft(p,q,j_left);
+          if(computeU()) m_matrixU.applyOnTheRight(p,q,j_left.transpose());
+
+          m_workMatrix.applyOnTheRight(p,q,j_right);
+          if(computeV()) m_matrixV.applyOnTheRight(p,q,j_right);
+        }
+      }
+    }
+  }
+
+  /*** step 3. The work matrix is now diagonal, so ensure it's positive so its diagonal entries are the singular values ***/
+
+  for(Index i = 0; i < m_diagSize; ++i)
+  {
+    RealScalar a = abs(m_workMatrix.coeff(i,i));
+    m_singularValues.coeffRef(i) = a;
+    if(computeU() && (a!=RealScalar(0))) m_matrixU.col(i) *= m_workMatrix.coeff(i,i)/a;
+  }
+
+  /*** step 4. Sort singular values in descending order and compute the number of nonzero singular values ***/
+
+  m_nonzeroSingularValues = m_diagSize;
+  for(Index i = 0; i < m_diagSize; i++)
+  {
+    Index pos;
+    RealScalar maxRemainingSingularValue = m_singularValues.tail(m_diagSize-i).maxCoeff(&pos);
+    if(maxRemainingSingularValue == RealScalar(0))
+    {
+      m_nonzeroSingularValues = i;
+      break;
+    }
+    if(pos)
+    {
+      pos += i;
+      std::swap(m_singularValues.coeffRef(i), m_singularValues.coeffRef(pos));
+      if(computeU()) m_matrixU.col(pos).swap(m_matrixU.col(i));
+      if(computeV()) m_matrixV.col(pos).swap(m_matrixV.col(i));
+    }
+  }
+
+  m_isInitialized = true;
+  return *this;
+}
+
+namespace internal {
+template<typename _MatrixType, int QRPreconditioner, typename Rhs>
+struct solve_retval<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>
+  : solve_retval_base<JacobiSVD<_MatrixType, QRPreconditioner>, Rhs>
+{
+  typedef JacobiSVD<_MatrixType, QRPreconditioner> JacobiSVDType;
+  EIGEN_MAKE_SOLVE_HELPERS(JacobiSVDType,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    eigen_assert(rhs().rows() == dec().rows());
+
+    // A = U S V^*
+    // So A^{-1} = V S^{-1} U^*
+
+    Index diagSize = (std::min)(dec().rows(), dec().cols());
+    typename JacobiSVDType::SingularValuesType invertedSingVals(diagSize);
+
+    Index nonzeroSingVals = dec().nonzeroSingularValues();
+    invertedSingVals.head(nonzeroSingVals) = dec().singularValues().head(nonzeroSingVals).array().inverse();
+    invertedSingVals.tail(diagSize - nonzeroSingVals).setZero();
+
+    dst = dec().matrixV().leftCols(diagSize)
+        * invertedSingVals.asDiagonal()
+        * dec().matrixU().leftCols(diagSize).adjoint()
+        * rhs();
+  }
+};
+} // end namespace internal
+
+/** \svd_module
+  *
+  * \return the singular value decomposition of \c *this computed by two-sided
+  * Jacobi transformations.
+  *
+  * \sa class JacobiSVD
+  */
+template<typename Derived>
+JacobiSVD<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::jacobiSvd(unsigned int computationOptions) const
+{
+  return JacobiSVD<PlainObject>(*this, computationOptions);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_JACOBISVD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD_MKL.h b/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD_MKL.h
new file mode 100644
index 0000000..decda75
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SVD/JacobiSVD_MKL.h
@@ -0,0 +1,92 @@
+/*
+ Copyright (c) 2011, Intel Corporation. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification,
+ are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+   list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+   this list of conditions and the following disclaimer in the documentation
+   and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors may
+   be used to endorse or promote products derived from this software without
+   specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ ********************************************************************************
+ *   Content : Eigen bindings to Intel(R) MKL
+ *    Singular Value Decomposition - SVD.
+ ********************************************************************************
+*/
+
+#ifndef EIGEN_JACOBISVD_MKL_H
+#define EIGEN_JACOBISVD_MKL_H
+
+#include "Eigen/src/Core/util/MKL_support.h"
+
+namespace Eigen { 
+
+/** \internal Specialization for the data types supported by MKL */
+
+#define EIGEN_MKL_SVD(EIGTYPE, MKLTYPE, MKLRTYPE, MKLPREFIX, EIGCOLROW, MKLCOLROW) \
+template<> inline \
+JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, ColPivHouseholderQRPreconditioner>& \
+JacobiSVD<Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>, ColPivHouseholderQRPreconditioner>::compute(const Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic>& matrix, unsigned int computationOptions) \
+{ \
+  typedef Matrix<EIGTYPE, Dynamic, Dynamic, EIGCOLROW, Dynamic, Dynamic> MatrixType; \
+  typedef MatrixType::Scalar Scalar; \
+  typedef MatrixType::RealScalar RealScalar; \
+  allocate(matrix.rows(), matrix.cols(), computationOptions); \
+\
+  /*const RealScalar precision = RealScalar(2) * NumTraits<Scalar>::epsilon();*/ \
+  m_nonzeroSingularValues = m_diagSize; \
+\
+  lapack_int lda = matrix.outerStride(), ldu, ldvt; \
+  lapack_int matrix_order = MKLCOLROW; \
+  char jobu, jobvt; \
+  MKLTYPE *u, *vt, dummy; \
+  jobu  = (m_computeFullU) ? 'A' : (m_computeThinU) ? 'S' : 'N'; \
+  jobvt = (m_computeFullV) ? 'A' : (m_computeThinV) ? 'S' : 'N'; \
+  if (computeU()) { \
+    ldu  = m_matrixU.outerStride(); \
+    u    = (MKLTYPE*)m_matrixU.data(); \
+  } else { ldu=1; u=&dummy; }\
+  MatrixType localV; \
+  ldvt = (m_computeFullV) ? m_cols : (m_computeThinV) ? m_diagSize : 1; \
+  if (computeV()) { \
+    localV.resize(ldvt, m_cols); \
+    vt   = (MKLTYPE*)localV.data(); \
+  } else { ldvt=1; vt=&dummy; }\
+  Matrix<MKLRTYPE, Dynamic, Dynamic> superb; superb.resize(m_diagSize, 1); \
+  MatrixType m_temp; m_temp = matrix; \
+  LAPACKE_##MKLPREFIX##gesvd( matrix_order, jobu, jobvt, m_rows, m_cols, (MKLTYPE*)m_temp.data(), lda, (MKLRTYPE*)m_singularValues.data(), u, ldu, vt, ldvt, superb.data()); \
+  if (computeV()) m_matrixV = localV.adjoint(); \
+ /* for(int i=0;i<m_diagSize;i++) if (m_singularValues.coeffRef(i) < precision) { m_nonzeroSingularValues--; m_singularValues.coeffRef(i)=RealScalar(0);}*/ \
+  m_isInitialized = true; \
+  return *this; \
+}
+
+EIGEN_MKL_SVD(double,   double,        double, d, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SVD(float,    float,         float , s, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SVD(dcomplex, MKL_Complex16, double, z, ColMajor, LAPACK_COL_MAJOR)
+EIGEN_MKL_SVD(scomplex, MKL_Complex8,  float , c, ColMajor, LAPACK_COL_MAJOR)
+
+EIGEN_MKL_SVD(double,   double,        double, d, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_SVD(float,    float,         float , s, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_SVD(dcomplex, MKL_Complex16, double, z, RowMajor, LAPACK_ROW_MAJOR)
+EIGEN_MKL_SVD(scomplex, MKL_Complex8,  float , c, RowMajor, LAPACK_ROW_MAJOR)
+
+} // end namespace Eigen
+
+#endif // EIGEN_JACOBISVD_MKL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SVD/UpperBidiagonalization.h b/vendor/eigen-3.1.91/Eigen/src/SVD/UpperBidiagonalization.h
new file mode 100644
index 0000000..213b310
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SVD/UpperBidiagonalization.h
@@ -0,0 +1,148 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_BIDIAGONALIZATION_H
+#define EIGEN_BIDIAGONALIZATION_H
+
+namespace Eigen { 
+
+namespace internal {
+// UpperBidiagonalization will probably be replaced by a Bidiagonalization class, don't want to make it stable API.
+// At the same time, it's useful to keep for now as it's about the only thing that is testing the BandMatrix class.
+
+template<typename _MatrixType> class UpperBidiagonalization
+{
+  public:
+
+    typedef _MatrixType MatrixType;
+    enum {
+      RowsAtCompileTime = MatrixType::RowsAtCompileTime,
+      ColsAtCompileTime = MatrixType::ColsAtCompileTime,
+      ColsAtCompileTimeMinusOne = internal::decrement_size<ColsAtCompileTime>::ret
+    };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar, 1, ColsAtCompileTime> RowVectorType;
+    typedef Matrix<Scalar, RowsAtCompileTime, 1> ColVectorType;
+    typedef BandMatrix<RealScalar, ColsAtCompileTime, ColsAtCompileTime, 1, 0> BidiagonalType;
+    typedef Matrix<Scalar, ColsAtCompileTime, 1> DiagVectorType;
+    typedef Matrix<Scalar, ColsAtCompileTimeMinusOne, 1> SuperDiagVectorType;
+    typedef HouseholderSequence<
+              const MatrixType,
+              CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Diagonal<const MatrixType,0> >
+            > HouseholderUSequenceType;
+    typedef HouseholderSequence<
+              const MatrixType,
+              Diagonal<const MatrixType,1>,
+              OnTheRight
+            > HouseholderVSequenceType;
+    
+    /**
+    * \brief Default Constructor.
+    *
+    * The default constructor is useful in cases in which the user intends to
+    * perform decompositions via Bidiagonalization::compute(const MatrixType&).
+    */
+    UpperBidiagonalization() : m_householder(), m_bidiagonal(), m_isInitialized(false) {}
+
+    UpperBidiagonalization(const MatrixType& matrix)
+      : m_householder(matrix.rows(), matrix.cols()),
+        m_bidiagonal(matrix.cols(), matrix.cols()),
+        m_isInitialized(false)
+    {
+      compute(matrix);
+    }
+    
+    UpperBidiagonalization& compute(const MatrixType& matrix);
+    
+    const MatrixType& householder() const { return m_householder; }
+    const BidiagonalType& bidiagonal() const { return m_bidiagonal; }
+    
+    const HouseholderUSequenceType householderU() const
+    {
+      eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
+      return HouseholderUSequenceType(m_householder, m_householder.diagonal().conjugate());
+    }
+
+    const HouseholderVSequenceType householderV() // const here gives nasty errors and i'm lazy
+    {
+      eigen_assert(m_isInitialized && "UpperBidiagonalization is not initialized.");
+      return HouseholderVSequenceType(m_householder, m_householder.const_derived().template diagonal<1>())
+             .setLength(m_householder.cols()-1)
+             .setShift(1);
+    }
+    
+  protected:
+    MatrixType m_householder;
+    BidiagonalType m_bidiagonal;
+    bool m_isInitialized;
+};
+
+template<typename _MatrixType>
+UpperBidiagonalization<_MatrixType>& UpperBidiagonalization<_MatrixType>::compute(const _MatrixType& matrix)
+{
+  Index rows = matrix.rows();
+  Index cols = matrix.cols();
+  
+  eigen_assert(rows >= cols && "UpperBidiagonalization is only for matrices satisfying rows>=cols.");
+  
+  m_householder = matrix;
+
+  ColVectorType temp(rows);
+
+  for (Index k = 0; /* breaks at k==cols-1 below */ ; ++k)
+  {
+    Index remainingRows = rows - k;
+    Index remainingCols = cols - k - 1;
+
+    // construct left householder transform in-place in m_householder
+    m_householder.col(k).tail(remainingRows)
+                 .makeHouseholderInPlace(m_householder.coeffRef(k,k),
+                                         m_bidiagonal.template diagonal<0>().coeffRef(k));
+    // apply householder transform to remaining part of m_householder on the left
+    m_householder.bottomRightCorner(remainingRows, remainingCols)
+                 .applyHouseholderOnTheLeft(m_householder.col(k).tail(remainingRows-1),
+                                            m_householder.coeff(k,k),
+                                            temp.data());
+
+    if(k == cols-1) break;
+    
+    // construct right householder transform in-place in m_householder
+    m_householder.row(k).tail(remainingCols)
+                 .makeHouseholderInPlace(m_householder.coeffRef(k,k+1),
+                                         m_bidiagonal.template diagonal<1>().coeffRef(k));
+    // apply householder transform to remaining part of m_householder on the left
+    m_householder.bottomRightCorner(remainingRows-1, remainingCols)
+                 .applyHouseholderOnTheRight(m_householder.row(k).tail(remainingCols-1).transpose(),
+                                             m_householder.coeff(k,k+1),
+                                             temp.data());
+  }
+  m_isInitialized = true;
+  return *this;
+}
+
+#if 0
+/** \return the Householder QR decomposition of \c *this.
+  *
+  * \sa class Bidiagonalization
+  */
+template<typename Derived>
+const UpperBidiagonalization<typename MatrixBase<Derived>::PlainObject>
+MatrixBase<Derived>::bidiagonalization() const
+{
+  return UpperBidiagonalization<PlainObject>(eval());
+}
+#endif
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_BIDIAGONALIZATION_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/CMakeLists.txt
new file mode 100644
index 0000000..375a59d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SparseCholesky_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_SparseCholesky_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseCholesky COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky.h b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky.h
new file mode 100644
index 0000000..6274727
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky.h
@@ -0,0 +1,667 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SIMPLICIAL_CHOLESKY_H
+#define EIGEN_SIMPLICIAL_CHOLESKY_H
+
+namespace Eigen { 
+
+enum SimplicialCholeskyMode {
+  SimplicialCholeskyLLT,
+  SimplicialCholeskyLDLT
+};
+
+/** \ingroup SparseCholesky_Module
+  * \brief A direct sparse Cholesky factorizations
+  *
+  * These classes provide LL^T and LDL^T Cholesky factorizations of sparse matrices that are
+  * selfadjoint and positive definite. The factorization allows for solving A.X = B where
+  * X and B can be either dense or sparse.
+  * 
+  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+  * such that the factorized matrix is P A P^-1.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  */
+template<typename Derived>
+class SimplicialCholeskyBase : internal::noncopyable
+{
+  public:
+    typedef typename internal::traits<Derived>::MatrixType MatrixType;
+    enum { UpLo = internal::traits<Derived>::UpLo };
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
+    typedef Matrix<Scalar,Dynamic,1> VectorType;
+
+  public:
+
+    /** Default constructor */
+    SimplicialCholeskyBase()
+      : m_info(Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)
+    {}
+
+    SimplicialCholeskyBase(const MatrixType& matrix)
+      : m_info(Success), m_isInitialized(false), m_shiftOffset(0), m_shiftScale(1)
+    {
+      derived().compute(matrix);
+    }
+
+    ~SimplicialCholeskyBase()
+    {
+    }
+
+    Derived& derived() { return *static_cast<Derived*>(this); }
+    const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    
+    inline Index cols() const { return m_matrix.cols(); }
+    inline Index rows() const { return m_matrix.rows(); }
+    
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<SimplicialCholeskyBase, Rhs>
+    solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "Simplicial LLT or LDLT is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "SimplicialCholeskyBase::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<SimplicialCholeskyBase, Rhs>(*this, b.derived());
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>
+    solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "Simplicial LLT or LDLT is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "SimplicialCholesky::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<SimplicialCholeskyBase, Rhs>(*this, b.derived());
+    }
+    
+    /** \returns the permutation P
+      * \sa permutationPinv() */
+    const PermutationMatrix<Dynamic,Dynamic,Index>& permutationP() const
+    { return m_P; }
+    
+    /** \returns the inverse P^-1 of the permutation P
+      * \sa permutationP() */
+    const PermutationMatrix<Dynamic,Dynamic,Index>& permutationPinv() const
+    { return m_Pinv; }
+
+    /** Sets the shift parameters that will be used to adjust the diagonal coefficients during the numerical factorization.
+      *
+      * During the numerical factorization, the diagonal coefficients are transformed by the following linear model:\n
+      * \c d_ii = \a offset + \a scale * \c d_ii
+      *
+      * The default is the identity transformation with \a offset=0, and \a scale=1.
+      *
+      * \returns a reference to \c *this.
+      */
+    Derived& setShift(const RealScalar& offset, const RealScalar& scale = 1)
+    {
+      m_shiftOffset = offset;
+      m_shiftScale = scale;
+      return derived();
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal */
+    template<typename Stream>
+    void dumpMemory(Stream& s)
+    {
+      int total = 0;
+      s << "  L:        " << ((total+=(m_matrix.cols()+1) * sizeof(int) + m_matrix.nonZeros()*(sizeof(int)+sizeof(Scalar))) >> 20) << "Mb" << "\n";
+      s << "  diag:     " << ((total+=m_diag.size() * sizeof(Scalar)) >> 20) << "Mb" << "\n";
+      s << "  tree:     " << ((total+=m_parent.size() * sizeof(int)) >> 20) << "Mb" << "\n";
+      s << "  nonzeros: " << ((total+=m_nonZerosPerCol.size() * sizeof(int)) >> 20) << "Mb" << "\n";
+      s << "  perm:     " << ((total+=m_P.size() * sizeof(int)) >> 20) << "Mb" << "\n";
+      s << "  perm^-1:  " << ((total+=m_Pinv.size() * sizeof(int)) >> 20) << "Mb" << "\n";
+      s << "  TOTAL:    " << (total>> 20) << "Mb" << "\n";
+    }
+
+    /** \internal */
+    template<typename Rhs,typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
+    {
+      eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
+      eigen_assert(m_matrix.rows()==b.rows());
+
+      if(m_info!=Success)
+        return;
+
+      if(m_P.size()>0)
+        dest = m_P * b;
+      else
+        dest = b;
+
+      if(m_matrix.nonZeros()>0) // otherwise L==I
+        derived().matrixL().solveInPlace(dest);
+
+      if(m_diag.size()>0)
+        dest = m_diag.asDiagonal().inverse() * dest;
+
+      if (m_matrix.nonZeros()>0) // otherwise U==I
+        derived().matrixU().solveInPlace(dest);
+
+      if(m_P.size()>0)
+        dest = m_Pinv * dest;
+    }
+
+#endif // EIGEN_PARSED_BY_DOXYGEN
+
+  protected:
+    
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    template<bool DoLDLT>
+    void compute(const MatrixType& matrix)
+    {
+      eigen_assert(matrix.rows()==matrix.cols());
+      Index size = matrix.cols();
+      CholMatrixType ap(size,size);
+      ordering(matrix, ap);
+      analyzePattern_preordered(ap, DoLDLT);
+      factorize_preordered<DoLDLT>(ap);
+    }
+    
+    template<bool DoLDLT>
+    void factorize(const MatrixType& a)
+    {
+      eigen_assert(a.rows()==a.cols());
+      int size = a.cols();
+      CholMatrixType ap(size,size);
+      ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
+      factorize_preordered<DoLDLT>(ap);
+    }
+
+    template<bool DoLDLT>
+    void factorize_preordered(const CholMatrixType& a);
+
+    void analyzePattern(const MatrixType& a, bool doLDLT)
+    {
+      eigen_assert(a.rows()==a.cols());
+      int size = a.cols();
+      CholMatrixType ap(size,size);
+      ordering(a, ap);
+      analyzePattern_preordered(ap,doLDLT);
+    }
+    void analyzePattern_preordered(const CholMatrixType& a, bool doLDLT);
+    
+    void ordering(const MatrixType& a, CholMatrixType& ap);
+
+    /** keeps off-diagonal entries; drops diagonal entries */
+    struct keep_diag {
+      inline bool operator() (const Index& row, const Index& col, const Scalar&) const
+      {
+        return row!=col;
+      }
+    };
+
+    mutable ComputationInfo m_info;
+    bool m_isInitialized;
+    bool m_factorizationIsOk;
+    bool m_analysisIsOk;
+    
+    CholMatrixType m_matrix;
+    VectorType m_diag;                                // the diagonal coefficients (LDLT mode)
+    VectorXi m_parent;                                // elimination tree
+    VectorXi m_nonZerosPerCol;
+    PermutationMatrix<Dynamic,Dynamic,Index> m_P;     // the permutation
+    PermutationMatrix<Dynamic,Dynamic,Index> m_Pinv;  // the inverse permutation
+
+    RealScalar m_shiftOffset;
+    RealScalar m_shiftScale;
+};
+
+template<typename _MatrixType, int _UpLo = Lower> class SimplicialLLT;
+template<typename _MatrixType, int _UpLo = Lower> class SimplicialLDLT;
+template<typename _MatrixType, int _UpLo = Lower> class SimplicialCholesky;
+
+namespace internal {
+
+template<typename _MatrixType, int _UpLo> struct traits<SimplicialLLT<_MatrixType,_UpLo> >
+{
+  typedef _MatrixType MatrixType;
+  enum { UpLo = _UpLo };
+  typedef typename MatrixType::Scalar                         Scalar;
+  typedef typename MatrixType::Index                          Index;
+  typedef SparseMatrix<Scalar, ColMajor, Index>               CholMatrixType;
+  typedef SparseTriangularView<CholMatrixType, Eigen::Lower>  MatrixL;
+  typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::Upper>   MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m; }
+  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }
+};
+
+template<typename _MatrixType,int _UpLo> struct traits<SimplicialLDLT<_MatrixType,_UpLo> >
+{
+  typedef _MatrixType MatrixType;
+  enum { UpLo = _UpLo };
+  typedef typename MatrixType::Scalar                             Scalar;
+  typedef typename MatrixType::Index                              Index;
+  typedef SparseMatrix<Scalar, ColMajor, Index>                   CholMatrixType;
+  typedef SparseTriangularView<CholMatrixType, Eigen::UnitLower>  MatrixL;
+  typedef SparseTriangularView<typename CholMatrixType::AdjointReturnType, Eigen::UnitUpper> MatrixU;
+  static inline MatrixL getL(const MatrixType& m) { return m; }
+  static inline MatrixU getU(const MatrixType& m) { return m.adjoint(); }
+};
+
+template<typename _MatrixType, int _UpLo> struct traits<SimplicialCholesky<_MatrixType,_UpLo> >
+{
+  typedef _MatrixType MatrixType;
+  enum { UpLo = _UpLo };
+};
+
+}
+
+/** \ingroup SparseCholesky_Module
+  * \class SimplicialLLT
+  * \brief A direct sparse LLT Cholesky factorizations
+  *
+  * This class provides a LL^T Cholesky factorizations of sparse matrices that are
+  * selfadjoint and positive definite. The factorization allows for solving A.X = B where
+  * X and B can be either dense or sparse.
+  * 
+  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+  * such that the factorized matrix is P A P^-1.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * \sa class SimplicialLDLT
+  */
+template<typename _MatrixType, int _UpLo>
+    class SimplicialLLT : public SimplicialCholeskyBase<SimplicialLLT<_MatrixType,_UpLo> >
+{
+public:
+    typedef _MatrixType MatrixType;
+    enum { UpLo = _UpLo };
+    typedef SimplicialCholeskyBase<SimplicialLLT> Base;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
+    typedef Matrix<Scalar,Dynamic,1> VectorType;
+    typedef internal::traits<SimplicialLLT> Traits;
+    typedef typename Traits::MatrixL  MatrixL;
+    typedef typename Traits::MatrixU  MatrixU;
+public:
+    /** Default constructor */
+    SimplicialLLT() : Base() {}
+    /** Constructs and performs the LLT factorization of \a matrix */
+    SimplicialLLT(const MatrixType& matrix)
+        : Base(matrix) {}
+
+    /** \returns an expression of the factor L */
+    inline const MatrixL matrixL() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
+        return Traits::getL(Base::m_matrix);
+    }
+
+    /** \returns an expression of the factor U (= L^*) */
+    inline const MatrixU matrixU() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial LLT not factorized");
+        return Traits::getU(Base::m_matrix);
+    }
+    
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    SimplicialLLT& compute(const MatrixType& matrix)
+    {
+      Base::template compute<false>(matrix);
+      return *this;
+    }
+
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      *
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& a)
+    {
+      Base::analyzePattern(a, false);
+    }
+
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& a)
+    {
+      Base::template factorize<false>(a);
+    }
+
+    /** \returns the determinant of the underlying matrix from the current factorization */
+    Scalar determinant() const
+    {
+      Scalar detL = Base::m_matrix.diagonal().prod();
+      return internal::abs2(detL);
+    }
+};
+
+/** \ingroup SparseCholesky_Module
+  * \class SimplicialLDLT
+  * \brief A direct sparse LDLT Cholesky factorizations without square root.
+  *
+  * This class provides a LDL^T Cholesky factorizations without square root of sparse matrices that are
+  * selfadjoint and positive definite. The factorization allows for solving A.X = B where
+  * X and B can be either dense or sparse.
+  * 
+  * In order to reduce the fill-in, a symmetric permutation P is applied prior to the factorization
+  * such that the factorized matrix is P A P^-1.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  * \tparam _UpLo the triangular part that will be used for the computations. It can be Lower
+  *               or Upper. Default is Lower.
+  *
+  * \sa class SimplicialLLT
+  */
+template<typename _MatrixType, int _UpLo>
+    class SimplicialLDLT : public SimplicialCholeskyBase<SimplicialLDLT<_MatrixType,_UpLo> >
+{
+public:
+    typedef _MatrixType MatrixType;
+    enum { UpLo = _UpLo };
+    typedef SimplicialCholeskyBase<SimplicialLDLT> Base;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
+    typedef Matrix<Scalar,Dynamic,1> VectorType;
+    typedef internal::traits<SimplicialLDLT> Traits;
+    typedef typename Traits::MatrixL  MatrixL;
+    typedef typename Traits::MatrixU  MatrixU;
+public:
+    /** Default constructor */
+    SimplicialLDLT() : Base() {}
+
+    /** Constructs and performs the LLT factorization of \a matrix */
+    SimplicialLDLT(const MatrixType& matrix)
+        : Base(matrix) {}
+
+    /** \returns a vector expression of the diagonal D */
+    inline const VectorType vectorD() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+        return Base::m_diag;
+    }
+    /** \returns an expression of the factor L */
+    inline const MatrixL matrixL() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+        return Traits::getL(Base::m_matrix);
+    }
+
+    /** \returns an expression of the factor U (= L^*) */
+    inline const MatrixU matrixU() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial LDLT not factorized");
+        return Traits::getU(Base::m_matrix);
+    }
+
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    SimplicialLDLT& compute(const MatrixType& matrix)
+    {
+      Base::template compute<true>(matrix);
+      return *this;
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      *
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& a)
+    {
+      Base::analyzePattern(a, true);
+    }
+
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& a)
+    {
+      Base::template factorize<true>(a);
+    }
+
+    /** \returns the determinant of the underlying matrix from the current factorization */
+    Scalar determinant() const
+    {
+      return Base::m_diag.prod();
+    }
+};
+
+/** \deprecated use SimplicialLDLT or class SimplicialLLT
+  * \ingroup SparseCholesky_Module
+  * \class SimplicialCholesky
+  *
+  * \sa class SimplicialLDLT, class SimplicialLLT
+  */
+template<typename _MatrixType, int _UpLo>
+    class SimplicialCholesky : public SimplicialCholeskyBase<SimplicialCholesky<_MatrixType,_UpLo> >
+{
+public:
+    typedef _MatrixType MatrixType;
+    enum { UpLo = _UpLo };
+    typedef SimplicialCholeskyBase<SimplicialCholesky> Base;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef SparseMatrix<Scalar,ColMajor,Index> CholMatrixType;
+    typedef Matrix<Scalar,Dynamic,1> VectorType;
+    typedef internal::traits<SimplicialCholesky> Traits;
+    typedef internal::traits<SimplicialLDLT<MatrixType,UpLo> > LDLTTraits;
+    typedef internal::traits<SimplicialLLT<MatrixType,UpLo>  > LLTTraits;
+  public:
+    SimplicialCholesky() : Base(), m_LDLT(true) {}
+
+    SimplicialCholesky(const MatrixType& matrix)
+      : Base(), m_LDLT(true)
+    {
+      compute(matrix);
+    }
+
+    SimplicialCholesky& setMode(SimplicialCholeskyMode mode)
+    {
+      switch(mode)
+      {
+      case SimplicialCholeskyLLT:
+        m_LDLT = false;
+        break;
+      case SimplicialCholeskyLDLT:
+        m_LDLT = true;
+        break;
+      default:
+        break;
+      }
+
+      return *this;
+    }
+
+    inline const VectorType vectorD() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
+        return Base::m_diag;
+    }
+    inline const CholMatrixType rawMatrix() const {
+        eigen_assert(Base::m_factorizationIsOk && "Simplicial Cholesky not factorized");
+        return Base::m_matrix;
+    }
+    
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    SimplicialCholesky& compute(const MatrixType& matrix)
+    {
+      if(m_LDLT)
+        Base::template compute<true>(matrix);
+      else
+        Base::template compute<false>(matrix);
+      return *this;
+    }
+
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      *
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& a)
+    {
+      Base::analyzePattern(a, m_LDLT);
+    }
+
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& a)
+    {
+      if(m_LDLT)
+        Base::template factorize<true>(a);
+      else
+        Base::template factorize<false>(a);
+    }
+
+    /** \internal */
+    template<typename Rhs,typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const
+    {
+      eigen_assert(Base::m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or symbolic()/numeric()");
+      eigen_assert(Base::m_matrix.rows()==b.rows());
+
+      if(Base::m_info!=Success)
+        return;
+
+      if(Base::m_P.size()>0)
+        dest = Base::m_P * b;
+      else
+        dest = b;
+
+      if(Base::m_matrix.nonZeros()>0) // otherwise L==I
+      {
+        if(m_LDLT)
+          LDLTTraits::getL(Base::m_matrix).solveInPlace(dest);
+        else
+          LLTTraits::getL(Base::m_matrix).solveInPlace(dest);
+      }
+
+      if(Base::m_diag.size()>0)
+        dest = Base::m_diag.asDiagonal().inverse() * dest;
+
+      if (Base::m_matrix.nonZeros()>0) // otherwise I==I
+      {
+        if(m_LDLT)
+          LDLTTraits::getU(Base::m_matrix).solveInPlace(dest);
+        else
+          LLTTraits::getU(Base::m_matrix).solveInPlace(dest);
+      }
+
+      if(Base::m_P.size()>0)
+        dest = Base::m_Pinv * dest;
+    }
+    
+    Scalar determinant() const
+    {
+      if(m_LDLT)
+      {
+        return Base::m_diag.prod();
+      }
+      else
+      {
+        Scalar detL = Diagonal<const CholMatrixType>(Base::m_matrix).prod();
+        return internal::abs2(detL);
+      }
+    }
+    
+  protected:
+    bool m_LDLT;
+};
+
+template<typename Derived>
+void SimplicialCholeskyBase<Derived>::ordering(const MatrixType& a, CholMatrixType& ap)
+{
+  eigen_assert(a.rows()==a.cols());
+  const Index size = a.rows();
+  // TODO allows to configure the permutation
+  // Note that amd compute the inverse permutation
+  {
+    CholMatrixType C;
+    C = a.template selfadjointView<UpLo>();
+    // remove diagonal entries:
+    // seems not to be needed
+    // C.prune(keep_diag());
+    internal::minimum_degree_ordering(C, m_Pinv);
+  }
+
+  if(m_Pinv.size()>0)
+    m_P = m_Pinv.inverse();
+  else
+    m_P.resize(0);
+
+  ap.resize(size,size);
+  ap.template selfadjointView<Upper>() = a.template selfadjointView<UpLo>().twistedBy(m_P);
+}
+
+namespace internal {
+  
+template<typename Derived, typename Rhs>
+struct solve_retval<SimplicialCholeskyBase<Derived>, Rhs>
+  : solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>
+{
+  typedef SimplicialCholeskyBase<Derived> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec().derived()._solve(rhs(),dst);
+  }
+};
+
+template<typename Derived, typename Rhs>
+struct sparse_solve_retval<SimplicialCholeskyBase<Derived>, Rhs>
+  : sparse_solve_retval_base<SimplicialCholeskyBase<Derived>, Rhs>
+{
+  typedef SimplicialCholeskyBase<Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SIMPLICIAL_CHOLESKY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h
new file mode 100644
index 0000000..4b24986
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCholesky/SimplicialCholesky_impl.h
@@ -0,0 +1,199 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+
+/*
+
+NOTE: thes functions vave been adapted from the LDL library:
+
+LDL Copyright (c) 2005 by Timothy A. Davis.  All Rights Reserved.
+
+LDL License:
+
+    Your use or distribution of LDL or any modified version of
+    LDL implies that you agree to this License.
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
+    USA
+
+    Permission is hereby granted to use or copy this program under the
+    terms of the GNU LGPL, provided that the Copyright, this License,
+    and the Availability of the original version is retained on all copies.
+    User documentation of any code that uses this code or any modified
+    version of this code must cite the Copyright, this License, the
+    Availability note, and "Used by permission." Permission to modify
+    the code and to distribute modified code is granted, provided the
+    Copyright, this License, and the Availability note are retained,
+    and a notice that the code was modified is included.
+ */
+
+#include "../Core/util/NonMPL2.h"
+
+#ifndef EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H
+#define EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H
+
+namespace Eigen {
+
+template<typename Derived>
+void SimplicialCholeskyBase<Derived>::analyzePattern_preordered(const CholMatrixType& ap, bool doLDLT)
+{
+  const Index size = ap.rows();
+  m_matrix.resize(size, size);
+  m_parent.resize(size);
+  m_nonZerosPerCol.resize(size);
+
+  ei_declare_aligned_stack_constructed_variable(Index, tags, size, 0);
+
+  for(Index k = 0; k < size; ++k)
+  {
+    /* L(k,:) pattern: all nodes reachable in etree from nz in A(0:k-1,k) */
+    m_parent[k] = -1;             /* parent of k is not yet known */
+    tags[k] = k;                  /* mark node k as visited */
+    m_nonZerosPerCol[k] = 0;      /* count of nonzeros in column k of L */
+    for(typename CholMatrixType::InnerIterator it(ap,k); it; ++it)
+    {
+      Index i = it.index();
+      if(i < k)
+      {
+        /* follow path from i to root of etree, stop at flagged node */
+        for(; tags[i] != k; i = m_parent[i])
+        {
+          /* find parent of i if not yet determined */
+          if (m_parent[i] == -1)
+            m_parent[i] = k;
+          m_nonZerosPerCol[i]++;        /* L (k,i) is nonzero */
+          tags[i] = k;                  /* mark i as visited */
+        }
+      }
+    }
+  }
+
+  /* construct Lp index array from m_nonZerosPerCol column counts */
+  Index* Lp = m_matrix.outerIndexPtr();
+  Lp[0] = 0;
+  for(Index k = 0; k < size; ++k)
+    Lp[k+1] = Lp[k] + m_nonZerosPerCol[k] + (doLDLT ? 0 : 1);
+
+  m_matrix.resizeNonZeros(Lp[size]);
+
+  m_isInitialized     = true;
+  m_info              = Success;
+  m_analysisIsOk      = true;
+  m_factorizationIsOk = false;
+}
+
+
+template<typename Derived>
+template<bool DoLDLT>
+void SimplicialCholeskyBase<Derived>::factorize_preordered(const CholMatrixType& ap)
+{
+  using std::sqrt;
+
+  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+  eigen_assert(ap.rows()==ap.cols());
+  const Index size = ap.rows();
+  eigen_assert(m_parent.size()==size);
+  eigen_assert(m_nonZerosPerCol.size()==size);
+
+  const Index* Lp = m_matrix.outerIndexPtr();
+  Index* Li = m_matrix.innerIndexPtr();
+  Scalar* Lx = m_matrix.valuePtr();
+
+  ei_declare_aligned_stack_constructed_variable(Scalar, y, size, 0);
+  ei_declare_aligned_stack_constructed_variable(Index,  pattern, size, 0);
+  ei_declare_aligned_stack_constructed_variable(Index,  tags, size, 0);
+
+  bool ok = true;
+  m_diag.resize(DoLDLT ? size : 0);
+
+  for(Index k = 0; k < size; ++k)
+  {
+    // compute nonzero pattern of kth row of L, in topological order
+    y[k] = 0.0;                     // Y(0:k) is now all zero
+    Index top = size;               // stack for pattern is empty
+    tags[k] = k;                    // mark node k as visited
+    m_nonZerosPerCol[k] = 0;        // count of nonzeros in column k of L
+    for(typename MatrixType::InnerIterator it(ap,k); it; ++it)
+    {
+      Index i = it.index();
+      if(i <= k)
+      {
+        y[i] += internal::conj(it.value());            /* scatter A(i,k) into Y (sum duplicates) */
+        Index len;
+        for(len = 0; tags[i] != k; i = m_parent[i])
+        {
+          pattern[len++] = i;     /* L(k,i) is nonzero */
+          tags[i] = k;            /* mark i as visited */
+        }
+        while(len > 0)
+          pattern[--top] = pattern[--len];
+      }
+    }
+
+    /* compute numerical values kth row of L (a sparse triangular solve) */
+
+    RealScalar d = internal::real(y[k]) * m_shiftScale + m_shiftOffset;    // get D(k,k), apply the shift function, and clear Y(k)
+    y[k] = 0.0;
+    for(; top < size; ++top)
+    {
+      Index i = pattern[top];       /* pattern[top:n-1] is pattern of L(:,k) */
+      Scalar yi = y[i];             /* get and clear Y(i) */
+      y[i] = 0.0;
+
+      /* the nonzero entry L(k,i) */
+      Scalar l_ki;
+      if(DoLDLT)
+        l_ki = yi / m_diag[i];
+      else
+        yi = l_ki = yi / Lx[Lp[i]];
+
+      Index p2 = Lp[i] + m_nonZerosPerCol[i];
+      Index p;
+      for(p = Lp[i] + (DoLDLT ? 0 : 1); p < p2; ++p)
+        y[Li[p]] -= internal::conj(Lx[p]) * yi;
+      d -= internal::real(l_ki * internal::conj(yi));
+      Li[p] = k;                          /* store L(k,i) in column form of L */
+      Lx[p] = l_ki;
+      ++m_nonZerosPerCol[i];              /* increment count of nonzeros in col i */
+    }
+    if(DoLDLT)
+    {
+      m_diag[k] = d;
+      if(d == RealScalar(0))
+      {
+        ok = false;                         /* failure, D(k,k) is zero */
+        break;
+      }
+    }
+    else
+    {
+      Index p = Lp[k] + m_nonZerosPerCol[k]++;
+      Li[p] = k ;                /* store L(k,k) = sqrt (d) in column k */
+      if(d <= RealScalar(0)) {
+        ok = false;              /* failure, matrix is not positive definite */
+        break;
+      }
+      Lx[p] = sqrt(d) ;
+    }
+  }
+
+  m_info = ok ? Success : NumericalIssue;
+  m_factorizationIsOk = true;
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SIMPLICIAL_CHOLESKY_IMPL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/AmbiVector.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/AmbiVector.h
new file mode 100644
index 0000000..17fff96
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/AmbiVector.h
@@ -0,0 +1,373 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_AMBIVECTOR_H
+#define EIGEN_AMBIVECTOR_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal
+  * Hybrid sparse/dense vector class designed for intensive read-write operations.
+  *
+  * See BasicSparseLLT and SparseProduct for usage examples.
+  */
+template<typename _Scalar, typename _Index>
+class AmbiVector
+{
+  public:
+    typedef _Scalar Scalar;
+    typedef _Index Index;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    AmbiVector(Index size)
+      : m_buffer(0), m_zero(0), m_size(0), m_allocatedSize(0), m_allocatedElements(0), m_mode(-1)
+    {
+      resize(size);
+    }
+
+    void init(double estimatedDensity);
+    void init(int mode);
+
+    Index nonZeros() const;
+
+    /** Specifies a sub-vector to work on */
+    void setBounds(Index start, Index end) { m_start = start; m_end = end; }
+
+    void setZero();
+
+    void restart();
+    Scalar& coeffRef(Index i);
+    Scalar& coeff(Index i);
+
+    class Iterator;
+
+    ~AmbiVector() { delete[] m_buffer; }
+
+    void resize(Index size)
+    {
+      if (m_allocatedSize < size)
+        reallocate(size);
+      m_size = size;
+    }
+
+    Index size() const { return m_size; }
+
+  protected:
+
+    void reallocate(Index size)
+    {
+      // if the size of the matrix is not too large, let's allocate a bit more than needed such
+      // that we can handle dense vector even in sparse mode.
+      delete[] m_buffer;
+      if (size<1000)
+      {
+        Index allocSize = (size * sizeof(ListEl))/sizeof(Scalar);
+        m_allocatedElements = (allocSize*sizeof(Scalar))/sizeof(ListEl);
+        m_buffer = new Scalar[allocSize];
+      }
+      else
+      {
+        m_allocatedElements = (size*sizeof(Scalar))/sizeof(ListEl);
+        m_buffer = new Scalar[size];
+      }
+      m_size = size;
+      m_start = 0;
+      m_end = m_size;
+    }
+
+    void reallocateSparse()
+    {
+      Index copyElements = m_allocatedElements;
+      m_allocatedElements = (std::min)(Index(m_allocatedElements*1.5),m_size);
+      Index allocSize = m_allocatedElements * sizeof(ListEl);
+      allocSize = allocSize/sizeof(Scalar) + (allocSize%sizeof(Scalar)>0?1:0);
+      Scalar* newBuffer = new Scalar[allocSize];
+      memcpy(newBuffer,  m_buffer,  copyElements * sizeof(ListEl));
+      delete[] m_buffer;
+      m_buffer = newBuffer;
+    }
+
+  protected:
+    // element type of the linked list
+    struct ListEl
+    {
+      Index next;
+      Index index;
+      Scalar value;
+    };
+
+    // used to store data in both mode
+    Scalar* m_buffer;
+    Scalar m_zero;
+    Index m_size;
+    Index m_start;
+    Index m_end;
+    Index m_allocatedSize;
+    Index m_allocatedElements;
+    Index m_mode;
+
+    // linked list mode
+    Index m_llStart;
+    Index m_llCurrent;
+    Index m_llSize;
+};
+
+/** \returns the number of non zeros in the current sub vector */
+template<typename _Scalar,typename _Index>
+_Index AmbiVector<_Scalar,_Index>::nonZeros() const
+{
+  if (m_mode==IsSparse)
+    return m_llSize;
+  else
+    return m_end - m_start;
+}
+
+template<typename _Scalar,typename _Index>
+void AmbiVector<_Scalar,_Index>::init(double estimatedDensity)
+{
+  if (estimatedDensity>0.1)
+    init(IsDense);
+  else
+    init(IsSparse);
+}
+
+template<typename _Scalar,typename _Index>
+void AmbiVector<_Scalar,_Index>::init(int mode)
+{
+  m_mode = mode;
+  if (m_mode==IsSparse)
+  {
+    m_llSize = 0;
+    m_llStart = -1;
+  }
+}
+
+/** Must be called whenever we might perform a write access
+  * with an index smaller than the previous one.
+  *
+  * Don't worry, this function is extremely cheap.
+  */
+template<typename _Scalar,typename _Index>
+void AmbiVector<_Scalar,_Index>::restart()
+{
+  m_llCurrent = m_llStart;
+}
+
+/** Set all coefficients of current subvector to zero */
+template<typename _Scalar,typename _Index>
+void AmbiVector<_Scalar,_Index>::setZero()
+{
+  if (m_mode==IsDense)
+  {
+    for (Index i=m_start; i<m_end; ++i)
+      m_buffer[i] = Scalar(0);
+  }
+  else
+  {
+    eigen_assert(m_mode==IsSparse);
+    m_llSize = 0;
+    m_llStart = -1;
+  }
+}
+
+template<typename _Scalar,typename _Index>
+_Scalar& AmbiVector<_Scalar,_Index>::coeffRef(_Index i)
+{
+  if (m_mode==IsDense)
+    return m_buffer[i];
+  else
+  {
+    ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
+    // TODO factorize the following code to reduce code generation
+    eigen_assert(m_mode==IsSparse);
+    if (m_llSize==0)
+    {
+      // this is the first element
+      m_llStart = 0;
+      m_llCurrent = 0;
+      ++m_llSize;
+      llElements[0].value = Scalar(0);
+      llElements[0].index = i;
+      llElements[0].next = -1;
+      return llElements[0].value;
+    }
+    else if (i<llElements[m_llStart].index)
+    {
+      // this is going to be the new first element of the list
+      ListEl& el = llElements[m_llSize];
+      el.value = Scalar(0);
+      el.index = i;
+      el.next = m_llStart;
+      m_llStart = m_llSize;
+      ++m_llSize;
+      m_llCurrent = m_llStart;
+      return el.value;
+    }
+    else
+    {
+      Index nextel = llElements[m_llCurrent].next;
+      eigen_assert(i>=llElements[m_llCurrent].index && "you must call restart() before inserting an element with lower or equal index");
+      while (nextel >= 0 && llElements[nextel].index<=i)
+      {
+        m_llCurrent = nextel;
+        nextel = llElements[nextel].next;
+      }
+
+      if (llElements[m_llCurrent].index==i)
+      {
+        // the coefficient already exists and we found it !
+        return llElements[m_llCurrent].value;
+      }
+      else
+      {
+        if (m_llSize>=m_allocatedElements)
+        {
+          reallocateSparse();
+          llElements = reinterpret_cast<ListEl*>(m_buffer);
+        }
+        eigen_internal_assert(m_llSize<m_allocatedElements && "internal error: overflow in sparse mode");
+        // let's insert a new coefficient
+        ListEl& el = llElements[m_llSize];
+        el.value = Scalar(0);
+        el.index = i;
+        el.next = llElements[m_llCurrent].next;
+        llElements[m_llCurrent].next = m_llSize;
+        ++m_llSize;
+        return el.value;
+      }
+    }
+  }
+}
+
+template<typename _Scalar,typename _Index>
+_Scalar& AmbiVector<_Scalar,_Index>::coeff(_Index i)
+{
+  if (m_mode==IsDense)
+    return m_buffer[i];
+  else
+  {
+    ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_buffer);
+    eigen_assert(m_mode==IsSparse);
+    if ((m_llSize==0) || (i<llElements[m_llStart].index))
+    {
+      return m_zero;
+    }
+    else
+    {
+      Index elid = m_llStart;
+      while (elid >= 0 && llElements[elid].index<i)
+        elid = llElements[elid].next;
+
+      if (llElements[elid].index==i)
+        return llElements[m_llCurrent].value;
+      else
+        return m_zero;
+    }
+  }
+}
+
+/** Iterator over the nonzero coefficients */
+template<typename _Scalar,typename _Index>
+class AmbiVector<_Scalar,_Index>::Iterator
+{
+  public:
+    typedef _Scalar Scalar;
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    /** Default constructor
+      * \param vec the vector on which we iterate
+      * \param epsilon the minimal value used to prune zero coefficients.
+      * In practice, all coefficients having a magnitude smaller than \a epsilon
+      * are skipped.
+      */
+    Iterator(const AmbiVector& vec, const RealScalar& epsilon = 0)
+      : m_vector(vec)
+    {
+      using std::abs;
+      m_epsilon = epsilon;
+      m_isDense = m_vector.m_mode==IsDense;
+      if (m_isDense)
+      {
+        m_currentEl = 0;   // this is to avoid a compilation warning
+        m_cachedValue = 0; // this is to avoid a compilation warning
+        m_cachedIndex = m_vector.m_start-1;
+        ++(*this);
+      }
+      else
+      {
+        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
+        m_currentEl = m_vector.m_llStart;
+        while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<=m_epsilon)
+          m_currentEl = llElements[m_currentEl].next;
+        if (m_currentEl<0)
+        {
+          m_cachedValue = 0; // this is to avoid a compilation warning
+          m_cachedIndex = -1;
+        }
+        else
+        {
+          m_cachedIndex = llElements[m_currentEl].index;
+          m_cachedValue = llElements[m_currentEl].value;
+        }
+      }
+    }
+
+    Index index() const { return m_cachedIndex; }
+    Scalar value() const { return m_cachedValue; }
+
+    operator bool() const { return m_cachedIndex>=0; }
+
+    Iterator& operator++()
+    {
+      using std::abs;
+      if (m_isDense)
+      {
+        do {
+          ++m_cachedIndex;
+        } while (m_cachedIndex<m_vector.m_end && abs(m_vector.m_buffer[m_cachedIndex])<m_epsilon);
+        if (m_cachedIndex<m_vector.m_end)
+          m_cachedValue = m_vector.m_buffer[m_cachedIndex];
+        else
+          m_cachedIndex=-1;
+      }
+      else
+      {
+        ListEl* EIGEN_RESTRICT llElements = reinterpret_cast<ListEl*>(m_vector.m_buffer);
+        do {
+          m_currentEl = llElements[m_currentEl].next;
+        } while (m_currentEl>=0 && abs(llElements[m_currentEl].value)<m_epsilon);
+        if (m_currentEl<0)
+        {
+          m_cachedIndex = -1;
+        }
+        else
+        {
+          m_cachedIndex = llElements[m_currentEl].index;
+          m_cachedValue = llElements[m_currentEl].value;
+        }
+      }
+      return *this;
+    }
+
+  protected:
+    const AmbiVector& m_vector; // the target vector
+    Index m_currentEl;            // the current element in sparse/linked-list mode
+    RealScalar m_epsilon;       // epsilon used to prune zero coefficients
+    Index m_cachedIndex;          // current coordinate
+    Scalar m_cachedValue;       // current value
+    bool m_isDense;             // mode of the vector
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_AMBIVECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CMakeLists.txt
new file mode 100644
index 0000000..d860452
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SparseCore_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_SparseCore_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseCore COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/CompressedStorage.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CompressedStorage.h
new file mode 100644
index 0000000..3321fab
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CompressedStorage.h
@@ -0,0 +1,233 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COMPRESSED_STORAGE_H
+#define EIGEN_COMPRESSED_STORAGE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \internal
+  * Stores a sparse set of values as a list of values and a list of indices.
+  *
+  */
+template<typename _Scalar,typename _Index>
+class CompressedStorage
+{
+  public:
+
+    typedef _Scalar Scalar;
+    typedef _Index Index;
+
+  protected:
+
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+  public:
+
+    CompressedStorage()
+      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
+    {}
+
+    CompressedStorage(size_t size)
+      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
+    {
+      resize(size);
+    }
+
+    CompressedStorage(const CompressedStorage& other)
+      : m_values(0), m_indices(0), m_size(0), m_allocatedSize(0)
+    {
+      *this = other;
+    }
+
+    CompressedStorage& operator=(const CompressedStorage& other)
+    {
+      resize(other.size());
+      memcpy(m_values, other.m_values, m_size * sizeof(Scalar));
+      memcpy(m_indices, other.m_indices, m_size * sizeof(Index));
+      return *this;
+    }
+
+    void swap(CompressedStorage& other)
+    {
+      std::swap(m_values, other.m_values);
+      std::swap(m_indices, other.m_indices);
+      std::swap(m_size, other.m_size);
+      std::swap(m_allocatedSize, other.m_allocatedSize);
+    }
+
+    ~CompressedStorage()
+    {
+      delete[] m_values;
+      delete[] m_indices;
+    }
+
+    void reserve(size_t size)
+    {
+      size_t newAllocatedSize = m_size + size;
+      if (newAllocatedSize > m_allocatedSize)
+        reallocate(newAllocatedSize);
+    }
+
+    void squeeze()
+    {
+      if (m_allocatedSize>m_size)
+        reallocate(m_size);
+    }
+
+    void resize(size_t size, float reserveSizeFactor = 0)
+    {
+      if (m_allocatedSize<size)
+        reallocate(size + size_t(reserveSizeFactor*size));
+      m_size = size;
+    }
+
+    void append(const Scalar& v, Index i)
+    {
+      Index id = static_cast<Index>(m_size);
+      resize(m_size+1, 1);
+      m_values[id] = v;
+      m_indices[id] = i;
+    }
+
+    inline size_t size() const { return m_size; }
+    inline size_t allocatedSize() const { return m_allocatedSize; }
+    inline void clear() { m_size = 0; }
+
+    inline Scalar& value(size_t i) { return m_values[i]; }
+    inline const Scalar& value(size_t i) const { return m_values[i]; }
+
+    inline Index& index(size_t i) { return m_indices[i]; }
+    inline const Index& index(size_t i) const { return m_indices[i]; }
+
+    static CompressedStorage Map(Index* indices, Scalar* values, size_t size)
+    {
+      CompressedStorage res;
+      res.m_indices = indices;
+      res.m_values = values;
+      res.m_allocatedSize = res.m_size = size;
+      return res;
+    }
+
+    /** \returns the largest \c k such that for all \c j in [0,k) index[\c j]\<\a key */
+    inline Index searchLowerIndex(Index key) const
+    {
+      return searchLowerIndex(0, m_size, key);
+    }
+
+    /** \returns the largest \c k in [start,end) such that for all \c j in [start,k) index[\c j]\<\a key */
+    inline Index searchLowerIndex(size_t start, size_t end, Index key) const
+    {
+      while(end>start)
+      {
+        size_t mid = (end+start)>>1;
+        if (m_indices[mid]<key)
+          start = mid+1;
+        else
+          end = mid;
+      }
+      return static_cast<Index>(start);
+    }
+
+    /** \returns the stored value at index \a key
+      * If the value does not exist, then the value \a defaultValue is returned without any insertion. */
+    inline Scalar at(Index key, const Scalar& defaultValue = Scalar(0)) const
+    {
+      if (m_size==0)
+        return defaultValue;
+      else if (key==m_indices[m_size-1])
+        return m_values[m_size-1];
+      // ^^  optimization: let's first check if it is the last coefficient
+      // (very common in high level algorithms)
+      const size_t id = searchLowerIndex(0,m_size-1,key);
+      return ((id<m_size) && (m_indices[id]==key)) ? m_values[id] : defaultValue;
+    }
+
+    /** Like at(), but the search is performed in the range [start,end) */
+    inline Scalar atInRange(size_t start, size_t end, Index key, const Scalar& defaultValue = Scalar(0)) const
+    {
+      if (start>=end)
+        return Scalar(0);
+      else if (end>start && key==m_indices[end-1])
+        return m_values[end-1];
+      // ^^  optimization: let's first check if it is the last coefficient
+      // (very common in high level algorithms)
+      const size_t id = searchLowerIndex(start,end-1,key);
+      return ((id<end) && (m_indices[id]==key)) ? m_values[id] : defaultValue;
+    }
+
+    /** \returns a reference to the value at index \a key
+      * If the value does not exist, then the value \a defaultValue is inserted
+      * such that the keys are sorted. */
+    inline Scalar& atWithInsertion(Index key, const Scalar& defaultValue = Scalar(0))
+    {
+      size_t id = searchLowerIndex(0,m_size,key);
+      if (id>=m_size || m_indices[id]!=key)
+      {
+        resize(m_size+1,1);
+        for (size_t j=m_size-1; j>id; --j)
+        {
+          m_indices[j] = m_indices[j-1];
+          m_values[j] = m_values[j-1];
+        }
+        m_indices[id] = key;
+        m_values[id] = defaultValue;
+      }
+      return m_values[id];
+    }
+
+    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
+    {
+      size_t k = 0;
+      size_t n = size();
+      for (size_t i=0; i<n; ++i)
+      {
+        if (!internal::isMuchSmallerThan(value(i), reference, epsilon))
+        {
+          value(k) = value(i);
+          index(k) = index(i);
+          ++k;
+        }
+      }
+      resize(k,0);
+    }
+
+  protected:
+
+    inline void reallocate(size_t size)
+    {
+      Scalar* newValues  = new Scalar[size];
+      Index* newIndices = new Index[size];
+      size_t copySize = (std::min)(size, m_size);
+      // copy
+      internal::smart_copy(m_values, m_values+copySize, newValues);
+      internal::smart_copy(m_indices, m_indices+copySize, newIndices);
+      // delete old stuff
+      delete[] m_values;
+      delete[] m_indices;
+      m_values = newValues;
+      m_indices = newIndices;
+      m_allocatedSize = size;
+    }
+
+  protected:
+    Scalar* m_values;
+    Index* m_indices;
+    size_t m_size;
+    size_t m_allocatedSize;
+
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_COMPRESSED_STORAGE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h
new file mode 100644
index 0000000..4b13f08
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/ConservativeSparseSparseProduct.h
@@ -0,0 +1,245 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
+#define EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, typename ResultType>
+static void conservative_sparse_sparse_product_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+{
+  typedef typename remove_all<Lhs>::type::Scalar Scalar;
+  typedef typename remove_all<Lhs>::type::Index Index;
+
+  // make sure to call innerSize/outerSize since we fake the storage order.
+  Index rows = lhs.innerSize();
+  Index cols = rhs.outerSize();
+  eigen_assert(lhs.outerSize() == rhs.innerSize());
+
+  std::vector<bool> mask(rows,false);
+  Matrix<Scalar,Dynamic,1> values(rows);
+  Matrix<Index,Dynamic,1>  indices(rows);
+
+  // estimate the number of non zero entries
+  // given a rhs column containing Y non zeros, we assume that the respective Y columns
+  // of the lhs differs in average of one non zeros, thus the number of non zeros for
+  // the product of a rhs column with the lhs is X+Y where X is the average number of non zero
+  // per column of the lhs.
+  // Therefore, we have nnz(lhs*rhs) = nnz(lhs) + nnz(rhs)
+  Index estimated_nnz_prod = lhs.nonZeros() + rhs.nonZeros();
+
+  res.setZero();
+  res.reserve(Index(estimated_nnz_prod));
+  // we compute each column of the result, one after the other
+  for (Index j=0; j<cols; ++j)
+  {
+
+    res.startVec(j);
+    Index nnz = 0;
+    for (typename Rhs::InnerIterator rhsIt(rhs, j); rhsIt; ++rhsIt)
+    {
+      Scalar y = rhsIt.value();
+      Index k = rhsIt.index();
+      for (typename Lhs::InnerIterator lhsIt(lhs, k); lhsIt; ++lhsIt)
+      {
+        Index i = lhsIt.index();
+        Scalar x = lhsIt.value();
+        if(!mask[i])
+        {
+          mask[i] = true;
+          values[i] = x * y;
+          indices[nnz] = i;
+          ++nnz;
+        }
+        else
+          values[i] += x * y;
+      }
+    }
+
+    // unordered insertion
+    for(int k=0; k<nnz; ++k)
+    {
+      int i = indices[k];
+      res.insertBackByOuterInnerUnordered(j,i) = values[i];
+      mask[i] = false;
+    }
+
+#if 0
+    // alternative ordered insertion code:
+
+    int t200 = rows/(log2(200)*1.39);
+    int t = (rows*100)/139;
+
+    // FIXME reserve nnz non zeros
+    // FIXME implement fast sort algorithms for very small nnz
+    // if the result is sparse enough => use a quick sort
+    // otherwise => loop through the entire vector
+    // In order to avoid to perform an expensive log2 when the
+    // result is clearly very sparse we use a linear bound up to 200.
+    //if((nnz<200 && nnz<t200) || nnz * log2(nnz) < t)
+    //res.startVec(j);
+    if(true)
+    {
+      if(nnz>1) std::sort(indices.data(),indices.data()+nnz);
+      for(int k=0; k<nnz; ++k)
+      {
+        int i = indices[k];
+        res.insertBackByOuterInner(j,i) = values[i];
+        mask[i] = false;
+      }
+    }
+    else
+    {
+      // dense path
+      for(int i=0; i<rows; ++i)
+      {
+        if(mask[i])
+        {
+          mask[i] = false;
+          res.insertBackByOuterInner(j,i) = values[i];
+        }
+      }
+    }
+#endif
+
+  }
+  res.finalize();
+}
+
+
+} // end namespace internal
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, typename ResultType,
+  int LhsStorageOrder = (traits<Lhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,
+  int RhsStorageOrder = (traits<Rhs>::Flags&RowMajorBit) ? RowMajor : ColMajor,
+  int ResStorageOrder = (traits<ResultType>::Flags&RowMajorBit) ? RowMajor : ColMajor>
+struct conservative_sparse_sparse_product_selector;
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>
+{
+  typedef typename remove_all<Lhs>::type LhsCleaned;
+  typedef typename LhsCleaned::Scalar Scalar;
+
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,RowMajor> RowMajorMatrix;
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    ColMajorMatrix resCol(lhs.rows(),rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);
+    // sort the non zeros:
+    RowMajorMatrix resRow(resCol);
+    res = resRow;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,ColMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+     typedef SparseMatrix<typename ResultType::Scalar,RowMajor> RowMajorMatrix;
+     RowMajorMatrix rhsRow = rhs;
+     RowMajorMatrix resRow(lhs.rows(), rhs.cols());
+     internal::conservative_sparse_sparse_product_impl<RowMajorMatrix,Lhs,RowMajorMatrix>(rhsRow, lhs, resRow);
+     res = resRow;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,ColMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,RowMajor> RowMajorMatrix;
+    RowMajorMatrix lhsRow = lhs;
+    RowMajorMatrix resRow(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Rhs,RowMajorMatrix,RowMajorMatrix>(rhs, lhsRow, resRow);
+    res = resRow;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,RowMajor> RowMajorMatrix;
+    RowMajorMatrix resRow(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
+    res = resRow;
+  }
+};
+
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>
+{
+  typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;
+
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    ColMajorMatrix resCol(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Lhs,Rhs,ColMajorMatrix>(lhs, rhs, resCol);
+    res = resCol;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,ColMajor,RowMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    ColMajorMatrix lhsCol = lhs;
+    ColMajorMatrix resCol(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<ColMajorMatrix,Rhs,ColMajorMatrix>(lhsCol, rhs, resCol);
+    res = resCol;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,ColMajor,RowMajor,RowMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    ColMajorMatrix rhsCol = rhs;
+    ColMajorMatrix resCol(lhs.rows(), rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Lhs,ColMajorMatrix,ColMajorMatrix>(lhs, rhsCol, resCol);
+    res = resCol;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct conservative_sparse_sparse_product_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>
+{
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,RowMajor> RowMajorMatrix;
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    RowMajorMatrix resRow(lhs.rows(),rhs.cols());
+    internal::conservative_sparse_sparse_product_impl<Rhs,Lhs,RowMajorMatrix>(rhs, lhs, resRow);
+    // sort the non zeros:
+    ColMajorMatrix resCol(resRow);
+    res = resCol;
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_CONSERVATIVESPARSESPARSEPRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/CoreIterators.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CoreIterators.h
new file mode 100644
index 0000000..6da4683
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/CoreIterators.h
@@ -0,0 +1,61 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_COREITERATORS_H
+#define EIGEN_COREITERATORS_H
+
+namespace Eigen { 
+
+/* This file contains the respective InnerIterator definition of the expressions defined in Eigen/Core
+ */
+
+/** \ingroup SparseCore_Module
+  * \class InnerIterator
+  * \brief An InnerIterator allows to loop over the element of a sparse (or dense) matrix or expression
+  *
+  * todo
+  */
+
+// generic version for dense matrix and expressions
+template<typename Derived> class DenseBase<Derived>::InnerIterator
+{
+  protected:
+    typedef typename Derived::Scalar Scalar;
+    typedef typename Derived::Index Index;
+
+    enum { IsRowMajor = (Derived::Flags&RowMajorBit)==RowMajorBit };
+  public:
+    EIGEN_STRONG_INLINE InnerIterator(const Derived& expr, Index outer)
+      : m_expression(expr), m_inner(0), m_outer(outer), m_end(expr.innerSize())
+    {}
+
+    EIGEN_STRONG_INLINE Scalar value() const
+    {
+      return (IsRowMajor) ? m_expression.coeff(m_outer, m_inner)
+                          : m_expression.coeff(m_inner, m_outer);
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++() { m_inner++; return *this; }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_inner; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_inner < m_end && m_inner>=0; }
+
+  protected:
+    const Derived& m_expression;
+    Index m_inner;
+    const Index m_outer;
+    const Index m_end;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_COREITERATORS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/MappedSparseMatrix.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/MappedSparseMatrix.h
new file mode 100644
index 0000000..93cd483
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/MappedSparseMatrix.h
@@ -0,0 +1,179 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MAPPED_SPARSEMATRIX_H
+#define EIGEN_MAPPED_SPARSEMATRIX_H
+
+namespace Eigen { 
+
+/** \class MappedSparseMatrix
+  *
+  * \brief Sparse matrix
+  *
+  * \param _Scalar the scalar type, i.e. the type of the coefficients
+  *
+  * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
+  *
+  */
+namespace internal {
+template<typename _Scalar, int _Flags, typename _Index>
+struct traits<MappedSparseMatrix<_Scalar, _Flags, _Index> > : traits<SparseMatrix<_Scalar, _Flags, _Index> >
+{};
+}
+
+template<typename _Scalar, int _Flags, typename _Index>
+class MappedSparseMatrix
+  : public SparseMatrixBase<MappedSparseMatrix<_Scalar, _Flags, _Index> >
+{
+  public:
+    EIGEN_SPARSE_PUBLIC_INTERFACE(MappedSparseMatrix)
+    enum { IsRowMajor = Base::IsRowMajor };
+
+  protected:
+
+    Index   m_outerSize;
+    Index   m_innerSize;
+    Index   m_nnz;
+    Index*  m_outerIndex;
+    Index*  m_innerIndices;
+    Scalar* m_values;
+
+  public:
+
+    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
+    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
+    inline Index innerSize() const { return m_innerSize; }
+    inline Index outerSize() const { return m_outerSize; }
+
+    //----------------------------------------
+    // direct access interface
+    inline const Scalar* valuePtr() const { return m_values; }
+    inline Scalar* valuePtr() { return m_values; }
+
+    inline const Index* innerIndexPtr() const { return m_innerIndices; }
+    inline Index* innerIndexPtr() { return m_innerIndices; }
+
+    inline const Index* outerIndexPtr() const { return m_outerIndex; }
+    inline Index* outerIndexPtr() { return m_outerIndex; }
+    //----------------------------------------
+
+    inline Scalar coeff(Index row, Index col) const
+    {
+      const Index outer = IsRowMajor ? row : col;
+      const Index inner = IsRowMajor ? col : row;
+
+      Index start = m_outerIndex[outer];
+      Index end = m_outerIndex[outer+1];
+      if (start==end)
+        return Scalar(0);
+      else if (end>0 && inner==m_innerIndices[end-1])
+        return m_values[end-1];
+      // ^^  optimization: let's first check if it is the last coefficient
+      // (very common in high level algorithms)
+
+      const Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end-1],inner);
+      const Index id = r-&m_innerIndices[0];
+      return ((*r==inner) && (id<end)) ? m_values[id] : Scalar(0);
+    }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      const Index outer = IsRowMajor ? row : col;
+      const Index inner = IsRowMajor ? col : row;
+
+      Index start = m_outerIndex[outer];
+      Index end = m_outerIndex[outer+1];
+      eigen_assert(end>=start && "you probably called coeffRef on a non finalized matrix");
+      eigen_assert(end>start && "coeffRef cannot be called on a zero coefficient");
+      Index* r = std::lower_bound(&m_innerIndices[start],&m_innerIndices[end],inner);
+      const Index id = r-&m_innerIndices[0];
+      eigen_assert((*r==inner) && (id<end) && "coeffRef cannot be called on a zero coefficient");
+      return m_values[id];
+    }
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    /** \returns the number of non zero coefficients */
+    inline Index nonZeros() const  { return m_nnz; }
+
+    inline MappedSparseMatrix(Index rows, Index cols, Index nnz, Index* outerIndexPtr, Index* innerIndexPtr, Scalar* valuePtr)
+      : m_outerSize(IsRowMajor?rows:cols), m_innerSize(IsRowMajor?cols:rows), m_nnz(nnz), m_outerIndex(outerIndexPtr),
+        m_innerIndices(innerIndexPtr), m_values(valuePtr)
+    {}
+
+    /** Empty destructor */
+    inline ~MappedSparseMatrix() {}
+};
+
+template<typename Scalar, int _Flags, typename _Index>
+class MappedSparseMatrix<Scalar,_Flags,_Index>::InnerIterator
+{
+  public:
+    InnerIterator(const MappedSparseMatrix& mat, Index outer)
+      : m_matrix(mat),
+        m_outer(outer),
+        m_id(mat.outerIndexPtr()[outer]),
+        m_start(m_id),
+        m_end(mat.outerIndexPtr()[outer+1])
+    {}
+
+    inline InnerIterator& operator++() { m_id++; return *this; }
+
+    inline Scalar value() const { return m_matrix.valuePtr()[m_id]; }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id]); }
+
+    inline Index index() const { return m_matrix.innerIndexPtr()[m_id]; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    inline operator bool() const { return (m_id < m_end) && (m_id>=m_start); }
+
+  protected:
+    const MappedSparseMatrix& m_matrix;
+    const Index m_outer;
+    Index m_id;
+    const Index m_start;
+    const Index m_end;
+};
+
+template<typename Scalar, int _Flags, typename _Index>
+class MappedSparseMatrix<Scalar,_Flags,_Index>::ReverseInnerIterator
+{
+  public:
+    ReverseInnerIterator(const MappedSparseMatrix& mat, Index outer)
+      : m_matrix(mat),
+        m_outer(outer),
+        m_id(mat.outerIndexPtr()[outer+1]),
+        m_start(mat.outerIndexPtr()[outer]),
+        m_end(m_id)
+    {}
+
+    inline ReverseInnerIterator& operator--() { m_id--; return *this; }
+
+    inline Scalar value() const { return m_matrix.valuePtr()[m_id-1]; }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_id-1]); }
+
+    inline Index index() const { return m_matrix.innerIndexPtr()[m_id-1]; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    inline operator bool() const { return (m_id <= m_end) && (m_id>m_start); }
+
+  protected:
+    const MappedSparseMatrix& m_matrix;
+    const Index m_outer;
+    Index m_id;
+    const Index m_start;
+    const Index m_end;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_MAPPED_SPARSEMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseAssign.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseAssign.h
new file mode 100644
index 0000000..e69de29
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseBlock.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseBlock.h
new file mode 100644
index 0000000..e025e4d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseBlock.h
@@ -0,0 +1,403 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_BLOCK_H
+#define EIGEN_SPARSE_BLOCK_H
+
+namespace Eigen { 
+
+template<typename XprType, int BlockRows, int BlockCols>
+class BlockImpl<XprType,BlockRows,BlockCols,true,Sparse>
+  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,true> >
+{
+    typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
+    typedef Block<XprType, BlockRows, BlockCols, true> BlockType;
+public:
+    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
+protected:
+    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
+public:
+    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+    
+    class InnerIterator: public XprType::InnerIterator
+    {
+      public:
+        inline InnerIterator(const BlockType& xpr, Index outer)
+          : XprType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
+        {}
+        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
+        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
+      protected:
+        Index m_outer;
+    };
+    class ReverseInnerIterator: public XprType::ReverseInnerIterator
+    {
+      public:
+        inline ReverseInnerIterator(const BlockType& xpr, Index outer)
+          : XprType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
+        {}
+        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
+        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
+      protected:
+        Index m_outer;
+    };
+
+    inline BlockImpl(const XprType& xpr, int i)
+      : m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)
+    {}
+
+    inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)
+      : m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)
+    {}
+
+    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+
+  protected:
+
+    typename XprType::Nested m_matrix;
+    Index m_outerStart;
+    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
+};
+
+
+/***************************************************************************
+* specialisation for SparseMatrix
+***************************************************************************/
+
+template<typename _Scalar, int _Options, typename _Index, int BlockRows, int BlockCols>
+class BlockImpl<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true,Sparse>
+  : public SparseMatrixBase<Block<SparseMatrix<_Scalar, _Options, _Index>,BlockRows,BlockCols,true> >
+{
+    typedef SparseMatrix<_Scalar, _Options, _Index> SparseMatrixType;
+    typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _MatrixTypeNested;
+    typedef Block<SparseMatrixType, BlockRows, BlockCols, true> BlockType;
+public:
+    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
+    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+protected:
+    enum { OuterSize = IsRowMajor ? BlockRows : BlockCols };
+public:
+    
+    class InnerIterator: public SparseMatrixType::InnerIterator
+    {
+      public:
+        inline InnerIterator(const BlockType& xpr, Index outer)
+          : SparseMatrixType::InnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
+        {}
+        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
+        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
+      protected:
+        Index m_outer;
+    };
+    class ReverseInnerIterator: public SparseMatrixType::ReverseInnerIterator
+    {
+      public:
+        inline ReverseInnerIterator(const BlockType& xpr, Index outer)
+          : SparseMatrixType::ReverseInnerIterator(xpr.m_matrix, xpr.m_outerStart + outer), m_outer(outer)
+        {}
+        inline Index row() const { return IsRowMajor ? m_outer : this->index(); }
+        inline Index col() const { return IsRowMajor ? this->index() : m_outer; }
+      protected:
+        Index m_outer;
+    };
+
+    inline BlockImpl(const SparseMatrixType& xpr, int i)
+      : m_matrix(xpr), m_outerStart(i), m_outerSize(OuterSize)
+    {}
+
+    inline BlockImpl(const SparseMatrixType& xpr, int startRow, int startCol, int blockRows, int blockCols)
+      : m_matrix(xpr), m_outerStart(IsRowMajor ? startRow : startCol), m_outerSize(IsRowMajor ? blockRows : blockCols)
+    {}
+
+    template<typename OtherDerived>
+    inline BlockType& operator=(const SparseMatrixBase<OtherDerived>& other)
+    {
+      typedef typename internal::remove_all<typename SparseMatrixType::Nested>::type _NestedMatrixType;
+      _NestedMatrixType& matrix = const_cast<_NestedMatrixType&>(m_matrix);;
+      // This assignement is slow if this vector set is not empty
+      // and/or it is not at the end of the nonzeros of the underlying matrix.
+
+      // 1 - eval to a temporary to avoid transposition and/or aliasing issues
+      SparseMatrix<Scalar, IsRowMajor ? RowMajor : ColMajor, Index> tmp(other);
+
+      // 2 - let's check whether there is enough allocated memory
+      Index nnz           = tmp.nonZeros();
+      Index start         = m_outerStart==0 ? 0 : matrix.outerIndexPtr()[m_outerStart]; // starting position of the current block
+      Index end           = m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()]; // ending posiiton of the current block
+      Index block_size    = end - start;                                                // available room in the current block
+      Index tail_size     = m_matrix.outerIndexPtr()[m_matrix.outerSize()] - end;
+      
+      Index free_size     = m_matrix.isCompressed()
+                          ? Index(matrix.data().allocatedSize()) + block_size
+                          : block_size;
+
+      if(nnz>free_size) 
+      {
+        // realloc manually to reduce copies
+        typename SparseMatrixType::Storage newdata(m_matrix.data().allocatedSize() - block_size + nnz);
+
+        std::memcpy(&newdata.value(0), &m_matrix.data().value(0), start*sizeof(Scalar));
+        std::memcpy(&newdata.index(0), &m_matrix.data().index(0), start*sizeof(Index));
+
+        std::memcpy(&newdata.value(start), &tmp.data().value(0), nnz*sizeof(Scalar));
+        std::memcpy(&newdata.index(start), &tmp.data().index(0), nnz*sizeof(Index));
+
+        std::memcpy(&newdata.value(start+nnz), &matrix.data().value(end), tail_size*sizeof(Scalar));
+        std::memcpy(&newdata.index(start+nnz), &matrix.data().index(end), tail_size*sizeof(Index));
+        
+        newdata.resize(m_matrix.outerIndexPtr()[m_matrix.outerSize()] - block_size + nnz);
+
+        matrix.data().swap(newdata);
+      }
+      else
+      {
+        // no need to realloc, simply copy the tail at its respective position and insert tmp
+        matrix.data().resize(start + nnz + tail_size);
+
+        std::memmove(&matrix.data().value(start+nnz), &matrix.data().value(end), tail_size*sizeof(Scalar));
+        std::memmove(&matrix.data().index(start+nnz), &matrix.data().index(end), tail_size*sizeof(Index));
+
+        std::memcpy(&matrix.data().value(start), &tmp.data().value(0), nnz*sizeof(Scalar));
+        std::memcpy(&matrix.data().index(start), &tmp.data().index(0), nnz*sizeof(Index));
+      }
+      
+      // update innerNonZeros
+      if(!m_matrix.isCompressed())
+        for(Index j=0; j<m_outerSize.value(); ++j)
+          matrix.innerNonZeroPtr()[m_outerStart+j] = tmp.innerVector(j).nonZeros();
+
+      // update outer index pointers
+      Index p = start;
+      for(Index k=0; k<m_outerSize.value(); ++k)
+      {
+        matrix.outerIndexPtr()[m_outerStart+k] = p;
+        p += tmp.innerVector(k).nonZeros();
+      }
+      std::ptrdiff_t offset = nnz - block_size;
+      for(Index k = m_outerStart + m_outerSize.value(); k<=matrix.outerSize(); ++k)
+      {
+        matrix.outerIndexPtr()[k] += offset;
+      }
+
+      return derived();
+    }
+
+    inline BlockType& operator=(const BlockType& other)
+    {
+      return operator=<BlockType>(other);
+    }
+
+    inline const Scalar* valuePtr() const
+    { return m_matrix.valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
+    inline Scalar* valuePtr()
+    { return m_matrix.const_cast_derived().valuePtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
+
+    inline const Index* innerIndexPtr() const
+    { return m_matrix.innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
+    inline Index* innerIndexPtr()
+    { return m_matrix.const_cast_derived().innerIndexPtr() + m_matrix.outerIndexPtr()[m_outerStart]; }
+
+    inline const Index* outerIndexPtr() const
+    { return m_matrix.outerIndexPtr() + m_outerStart; }
+    inline Index* outerIndexPtr()
+    { return m_matrix.const_cast_derived().outerIndexPtr() + m_outerStart; }
+
+    Index nonZeros() const
+    {
+      if(m_matrix.isCompressed())
+        return  std::size_t(m_matrix.outerIndexPtr()[m_outerStart+m_outerSize.value()])
+              - std::size_t(m_matrix.outerIndexPtr()[m_outerStart]);
+      else if(m_outerSize.value()==0)
+        return 0;
+      else
+        return Map<const Matrix<Index,OuterSize,1> >(m_matrix.innerNonZeroPtr()+m_outerStart, m_outerSize.value()).sum();
+    }
+
+    const Scalar& lastCoeff() const
+    {
+      EIGEN_STATIC_ASSERT_VECTOR_ONLY(BlockImpl);
+      eigen_assert(nonZeros()>0);
+      if(m_matrix.isCompressed())
+        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart+1]-1];
+      else
+        return m_matrix.valuePtr()[m_matrix.outerIndexPtr()[m_outerStart]+m_matrix.innerNonZeroPtr()[m_outerStart]-1];
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return IsRowMajor ? m_outerSize.value() : m_matrix.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return IsRowMajor ? m_matrix.cols() : m_outerSize.value(); }
+
+  protected:
+
+    typename SparseMatrixType::Nested m_matrix;
+    Index m_outerStart;
+    const internal::variable_if_dynamic<Index, OuterSize> m_outerSize;
+
+};
+
+//----------
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+  * is col-major (resp. row-major).
+  */
+template<typename Derived>
+typename SparseMatrixBase<Derived>::InnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer)
+{ return InnerVectorReturnType(derived(), outer); }
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+  * is col-major (resp. row-major). Read-only.
+  */
+template<typename Derived>
+const typename SparseMatrixBase<Derived>::ConstInnerVectorReturnType SparseMatrixBase<Derived>::innerVector(Index outer) const
+{ return ConstInnerVectorReturnType(derived(), outer); }
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+  * is col-major (resp. row-major).
+  */
+template<typename Derived>
+Block<Derived,Dynamic,Dynamic,true> SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize)
+{
+  return Block<Derived,Dynamic,Dynamic,true>(derived(),
+                                             IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
+                                             IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
+  
+}
+
+/** \returns the \a outer -th column (resp. row) of the matrix \c *this if \c *this
+  * is col-major (resp. row-major). Read-only.
+  */
+template<typename Derived>
+const Block<const Derived,Dynamic,Dynamic,true> SparseMatrixBase<Derived>::innerVectors(Index outerStart, Index outerSize) const
+{
+  return Block<const Derived,Dynamic,Dynamic,true>(derived(),
+                                                  IsRowMajor ? outerStart : 0, IsRowMajor ? 0 : outerStart,
+                                                  IsRowMajor ? outerSize : rows(), IsRowMajor ? cols() : outerSize);
+  
+}
+
+/** Generic implementation of sparse Block expression.
+  * Real-only. 
+  */
+template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
+class BlockImpl<XprType,BlockRows,BlockCols,InnerPanel,Sparse>
+  : public SparseMatrixBase<Block<XprType,BlockRows,BlockCols,InnerPanel> >, internal::no_assignment_operator
+{
+  typedef typename internal::remove_all<typename XprType::Nested>::type _MatrixTypeNested;
+  typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
+public:
+    enum { IsRowMajor = internal::traits<BlockType>::IsRowMajor };
+    EIGEN_SPARSE_PUBLIC_INTERFACE(BlockType)
+
+    /** Column or Row constructor
+      */
+    inline BlockImpl(const XprType& xpr, int i)
+      : m_matrix(xpr),
+        m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
+        m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),
+        m_blockRows(xpr.rows()),
+        m_blockCols(xpr.cols())
+    {}
+
+    /** Dynamic-size constructor
+      */
+    inline BlockImpl(const XprType& xpr, int startRow, int startCol, int blockRows, int blockCols)
+      : m_matrix(xpr), m_startRow(startRow), m_startCol(startCol), m_blockRows(blockRows), m_blockCols(blockCols)
+    {}
+
+    inline int rows() const { return m_blockRows.value(); }
+    inline int cols() const { return m_blockCols.value(); }
+
+    inline Scalar& coeffRef(int row, int col)
+    {
+      return m_matrix.const_cast_derived()
+               .coeffRef(row + m_startRow.value(), col + m_startCol.value());
+    }
+
+    inline const Scalar coeff(int row, int col) const
+    {
+      return m_matrix.coeff(row + m_startRow.value(), col + m_startCol.value());
+    }
+
+    inline Scalar& coeffRef(int index)
+    {
+      return m_matrix.const_cast_derived()
+             .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                       m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+
+    inline const Scalar coeff(int index) const
+    {
+      return m_matrix
+             .coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
+                    m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
+    }
+    
+    inline const _MatrixTypeNested& nestedExpression() const { return m_matrix; }
+    
+    class InnerIterator : public _MatrixTypeNested::InnerIterator
+    {
+      typedef typename _MatrixTypeNested::InnerIterator Base;
+      const BlockType& m_block;
+      Index m_end;
+    public:
+
+      EIGEN_STRONG_INLINE InnerIterator(const BlockType& block, Index outer)
+        : Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),
+          m_block(block),
+          m_end(IsRowMajor ? block.m_startCol.value()+block.m_blockCols.value() : block.m_startRow.value()+block.m_blockRows.value())
+      {
+        while( (Base::operator bool()) && (Base::index() < (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value())) )
+          Base::operator++();
+      }
+
+      inline Index index()  const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }
+      inline Index outer()  const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }
+      inline Index row()    const { return Base::row()   - m_block.m_startRow.value(); }
+      inline Index col()    const { return Base::col()   - m_block.m_startCol.value(); }
+      
+      inline operator bool() const { return Base::operator bool() && Base::index() < m_end; }
+    };
+    class ReverseInnerIterator : public _MatrixTypeNested::ReverseInnerIterator
+    {
+      typedef typename _MatrixTypeNested::ReverseInnerIterator Base;
+      const BlockType& m_block;
+      Index m_begin;
+    public:
+
+      EIGEN_STRONG_INLINE ReverseInnerIterator(const BlockType& block, Index outer)
+        : Base(block.derived().nestedExpression(), outer + (IsRowMajor ? block.m_startRow.value() : block.m_startCol.value())),
+          m_block(block),
+          m_begin(IsRowMajor ? block.m_startCol.value() : block.m_startRow.value())
+      {
+        while( (Base::operator bool()) && (Base::index() >= (IsRowMajor ? m_block.m_startCol.value()+block.m_blockCols.value() : m_block.m_startRow.value()+block.m_blockRows.value())) )
+          Base::operator--();
+      }
+
+      inline Index index()  const { return Base::index() - (IsRowMajor ? m_block.m_startCol.value() : m_block.m_startRow.value()); }
+      inline Index outer()  const { return Base::outer() - (IsRowMajor ? m_block.m_startRow.value() : m_block.m_startCol.value()); }
+      inline Index row()    const { return Base::row()   - m_block.m_startRow.value(); }
+      inline Index col()    const { return Base::col()   - m_block.m_startCol.value(); }
+      
+      inline operator bool() const { return Base::operator bool() && Base::index() >= m_begin; }
+    };
+  protected:
+    friend class InnerIterator;
+    friend class ReverseInnerIterator;
+
+    typename XprType::Nested m_matrix;
+    const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
+    const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
+    const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
+    const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
+
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_BLOCK_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseColEtree.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseColEtree.h
new file mode 100644
index 0000000..f89ca38
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseColEtree.h
@@ -0,0 +1,204 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+/* 
+ 
+ * NOTE: This file is the modified version of sp_coletree.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 3.1) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * August 1, 2008
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSE_COLETREE_H
+#define SPARSE_COLETREE_H
+
+namespace Eigen {
+
+namespace internal {
+
+/** Find the root of the tree/set containing the vertex i : Use Path halving */ 
+template<typename Index, typename IndexVector>
+Index etree_find (Index i, IndexVector& pp)
+{
+  Index p = pp(i); // Parent 
+  Index gp = pp(p); // Grand parent 
+  while (gp != p) 
+  {
+    pp(i) = gp; // Parent pointer on find path is changed to former grand parent
+    i = gp; 
+    p = pp(i);
+    gp = pp(p);
+  }
+  return p; 
+}
+
+/** Compute the column elimination tree of a sparse matrix
+  * \param mat The matrix in column-major format. 
+  * \param parent The elimination tree
+  * \param firstRowElt The column index of the first element in each row
+  * \param perm The permutation to apply to the column of \b mat
+  */
+template <typename MatrixType, typename IndexVector>
+int coletree(const MatrixType& mat, IndexVector& parent, IndexVector& firstRowElt, typename MatrixType::Index *perm=0)
+{
+  typedef typename MatrixType::Index Index;
+  Index nc = mat.cols(); // Number of columns 
+  Index m = mat.rows();
+  IndexVector root(nc); // root of subtree of etree 
+  root.setZero();
+  IndexVector pp(nc); // disjoint sets 
+  pp.setZero(); // Initialize disjoint sets 
+  parent.resize(mat.cols());
+  //Compute first nonzero column in each row 
+  Index row,col; 
+  firstRowElt.resize(m);
+  firstRowElt.setConstant(nc);
+  firstRowElt.segment(0, nc).setLinSpaced(nc, 0, nc-1);
+  bool found_diag;
+  for (col = 0; col < nc; col++)
+  {
+    Index pcol = col;
+    if(perm) pcol  = perm[col];
+    for (typename MatrixType::InnerIterator it(mat, pcol); it; ++it)
+    { 
+      row = it.row();
+      firstRowElt(row) = (std::min)(firstRowElt(row), col);
+    }
+  }
+  /* Compute etree by Liu's algorithm for symmetric matrices,
+          except use (firstRowElt[r],c) in place of an edge (r,c) of A.
+    Thus each row clique in A'*A is replaced by a star
+    centered at its first vertex, which has the same fill. */
+  Index rset, cset, rroot; 
+  for (col = 0; col < nc; col++) 
+  {
+    found_diag = false;
+    pp(col) = col; 
+    cset = col; 
+    root(cset) = col; 
+    parent(col) = nc; 
+    /* The diagonal element is treated here even if it does not exist in the matrix
+     * hence the loop is executed once more */ 
+    Index pcol = col;
+    if(perm) pcol  = perm[col];
+    for (typename MatrixType::InnerIterator it(mat, pcol); it||!found_diag; ++it)
+    { //  A sequence of interleaved find and union is performed 
+      Index i = col;
+      if(it) i = it.index();
+      if (i == col) found_diag = true;
+      row = firstRowElt(i);
+      if (row >= col) continue; 
+      rset = internal::etree_find(row, pp); // Find the name of the set containing row
+      rroot = root(rset);
+      if (rroot != col) 
+      {
+        parent(rroot) = col; 
+        pp(cset) = rset; 
+        cset = rset; 
+        root(cset) = col; 
+      }
+    }
+  }
+  return 0;  
+}
+
+/** 
+  * Depth-first search from vertex n.  No recursion.
+  * This routine was contributed by Cédric Doucet, CEDRAT Group, Meylan, France.
+*/
+template <typename Index, typename IndexVector>
+void nr_etdfs (Index n, IndexVector& parent, IndexVector& first_kid, IndexVector& next_kid, IndexVector& post, Index postnum)
+{
+  Index current = n, first, next;
+  while (postnum != n) 
+  {
+    // No kid for the current node
+    first = first_kid(current);
+    
+    // no kid for the current node
+    if (first == -1) 
+    {
+      // Numbering this node because it has no kid 
+      post(current) = postnum++;
+      
+      // looking for the next kid 
+      next = next_kid(current); 
+      while (next == -1) 
+      {
+        // No more kids : back to the parent node
+        current = parent(current); 
+        // numbering the parent node 
+        post(current) = postnum++;
+        
+        // Get the next kid 
+        next = next_kid(current); 
+      }
+      // stopping criterion 
+      if (postnum == n+1) return; 
+      
+      // Updating current node 
+      current = next; 
+    }
+    else 
+    {
+      current = first; 
+    }
+  }
+}
+
+
+/**
+  * \brief Post order a tree 
+  * \param n the number of nodes
+  * \param parent Input tree
+  * \param post postordered tree
+  */
+template <typename Index, typename IndexVector>
+void treePostorder(Index n, IndexVector& parent, IndexVector& post)
+{
+  IndexVector first_kid, next_kid; // Linked list of children 
+  Index postnum; 
+  // Allocate storage for working arrays and results 
+  first_kid.resize(n+1); 
+  next_kid.setZero(n+1);
+  post.setZero(n+1);
+  
+  // Set up structure describing children
+  Index v, dad; 
+  first_kid.setConstant(-1); 
+  for (v = n-1; v >= 0; v--) 
+  {
+    dad = parent(v);
+    next_kid(v) = first_kid(dad); 
+    first_kid(dad) = v; 
+  }
+  
+  // Depth-first search from dummy root vertex #n
+  postnum = 0; 
+  internal::nr_etdfs(n, parent, first_kid, next_kid, post, postnum);
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // SPARSE_COLETREE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseBinaryOp.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseBinaryOp.h
new file mode 100644
index 0000000..d5f97f7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseBinaryOp.h
@@ -0,0 +1,324 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_CWISE_BINARY_OP_H
+#define EIGEN_SPARSE_CWISE_BINARY_OP_H
+
+namespace Eigen { 
+
+// Here we have to handle 3 cases:
+//  1 - sparse op dense
+//  2 - dense op sparse
+//  3 - sparse op sparse
+// We also need to implement a 4th iterator for:
+//  4 - dense op dense
+// Finally, we also need to distinguish between the product and other operations :
+//                configuration      returned mode
+//  1 - sparse op dense    product      sparse
+//                         generic      dense
+//  2 - dense op sparse    product      sparse
+//                         generic      dense
+//  3 - sparse op sparse   product      sparse
+//                         generic      sparse
+//  4 - dense op dense     product      dense
+//                         generic      dense
+
+namespace internal {
+
+template<> struct promote_storage_type<Dense,Sparse>
+{ typedef Sparse ret; };
+
+template<> struct promote_storage_type<Sparse,Dense>
+{ typedef Sparse ret; };
+
+template<typename BinaryOp, typename Lhs, typename Rhs, typename Derived,
+  typename _LhsStorageMode = typename traits<Lhs>::StorageKind,
+  typename _RhsStorageMode = typename traits<Rhs>::StorageKind>
+class sparse_cwise_binary_op_inner_iterator_selector;
+
+} // end namespace internal
+
+template<typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOpImpl<BinaryOp, Lhs, Rhs, Sparse>
+  : public SparseMatrixBase<CwiseBinaryOp<BinaryOp, Lhs, Rhs> >
+{
+  public:
+    class InnerIterator;
+    class ReverseInnerIterator;
+    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> Derived;
+    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
+    CwiseBinaryOpImpl()
+    {
+      typedef typename internal::traits<Lhs>::StorageKind LhsStorageKind;
+      typedef typename internal::traits<Rhs>::StorageKind RhsStorageKind;
+      EIGEN_STATIC_ASSERT((
+                (!internal::is_same<LhsStorageKind,RhsStorageKind>::value)
+            ||  ((Lhs::Flags&RowMajorBit) == (Rhs::Flags&RowMajorBit))),
+            THE_STORAGE_ORDER_OF_BOTH_SIDES_MUST_MATCH);
+    }
+};
+
+template<typename BinaryOp, typename Lhs, typename Rhs>
+class CwiseBinaryOpImpl<BinaryOp,Lhs,Rhs,Sparse>::InnerIterator
+  : public internal::sparse_cwise_binary_op_inner_iterator_selector<BinaryOp,Lhs,Rhs,typename CwiseBinaryOpImpl<BinaryOp,Lhs,Rhs,Sparse>::InnerIterator>
+{
+  public:
+    typedef typename Lhs::Index Index;
+    typedef internal::sparse_cwise_binary_op_inner_iterator_selector<
+      BinaryOp,Lhs,Rhs, InnerIterator> Base;
+
+    EIGEN_STRONG_INLINE InnerIterator(const CwiseBinaryOpImpl& binOp, typename CwiseBinaryOpImpl::Index outer)
+      : Base(binOp.derived(),outer)
+    {}
+};
+
+/***************************************************************************
+* Implementation of inner-iterators
+***************************************************************************/
+
+// template<typename T> struct internal::func_is_conjunction { enum { ret = false }; };
+// template<typename T> struct internal::func_is_conjunction<internal::scalar_product_op<T> > { enum { ret = true }; };
+
+// TODO generalize the internal::scalar_product_op specialization to all conjunctions if any !
+
+namespace internal {
+
+// sparse - sparse  (generic)
+template<typename BinaryOp, typename Lhs, typename Rhs, typename Derived>
+class sparse_cwise_binary_op_inner_iterator_selector<BinaryOp, Lhs, Rhs, Derived, Sparse, Sparse>
+{
+    typedef CwiseBinaryOp<BinaryOp, Lhs, Rhs> CwiseBinaryXpr;
+    typedef typename traits<CwiseBinaryXpr>::Scalar Scalar;
+    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;
+    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;
+    typedef typename _LhsNested::InnerIterator LhsIterator;
+    typedef typename _RhsNested::InnerIterator RhsIterator;
+    typedef typename Lhs::Index Index;
+
+  public:
+
+    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)
+      : m_lhsIter(xpr.lhs(),outer), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor())
+    {
+      this->operator++();
+    }
+
+    EIGEN_STRONG_INLINE Derived& operator++()
+    {
+      if (m_lhsIter && m_rhsIter && (m_lhsIter.index() == m_rhsIter.index()))
+      {
+        m_id = m_lhsIter.index();
+        m_value = m_functor(m_lhsIter.value(), m_rhsIter.value());
+        ++m_lhsIter;
+        ++m_rhsIter;
+      }
+      else if (m_lhsIter && (!m_rhsIter || (m_lhsIter.index() < m_rhsIter.index())))
+      {
+        m_id = m_lhsIter.index();
+        m_value = m_functor(m_lhsIter.value(), Scalar(0));
+        ++m_lhsIter;
+      }
+      else if (m_rhsIter && (!m_lhsIter || (m_lhsIter.index() > m_rhsIter.index())))
+      {
+        m_id = m_rhsIter.index();
+        m_value = m_functor(Scalar(0), m_rhsIter.value());
+        ++m_rhsIter;
+      }
+      else
+      {
+        m_value = 0; // this is to avoid a compilation warning
+        m_id = -1;
+      }
+      return *static_cast<Derived*>(this);
+    }
+
+    EIGEN_STRONG_INLINE Scalar value() const { return m_value; }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_id; }
+    EIGEN_STRONG_INLINE Index row() const { return Lhs::IsRowMajor ? m_lhsIter.row() : index(); }
+    EIGEN_STRONG_INLINE Index col() const { return Lhs::IsRowMajor ? index() : m_lhsIter.col(); }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_id>=0; }
+
+  protected:
+    LhsIterator m_lhsIter;
+    RhsIterator m_rhsIter;
+    const BinaryOp& m_functor;
+    Scalar m_value;
+    Index m_id;
+};
+
+// sparse - sparse  (product)
+template<typename T, typename Lhs, typename Rhs, typename Derived>
+class sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Sparse, Sparse>
+{
+    typedef scalar_product_op<T> BinaryFunc;
+    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;
+    typedef typename CwiseBinaryXpr::Scalar Scalar;
+    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;
+    typedef typename _LhsNested::InnerIterator LhsIterator;
+    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;
+    typedef typename _RhsNested::InnerIterator RhsIterator;
+    typedef typename Lhs::Index Index;
+  public:
+
+    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)
+      : m_lhsIter(xpr.lhs(),outer), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor())
+    {
+      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
+      {
+        if (m_lhsIter.index() < m_rhsIter.index())
+          ++m_lhsIter;
+        else
+          ++m_rhsIter;
+      }
+    }
+
+    EIGEN_STRONG_INLINE Derived& operator++()
+    {
+      ++m_lhsIter;
+      ++m_rhsIter;
+      while (m_lhsIter && m_rhsIter && (m_lhsIter.index() != m_rhsIter.index()))
+      {
+        if (m_lhsIter.index() < m_rhsIter.index())
+          ++m_lhsIter;
+        else
+          ++m_rhsIter;
+      }
+      return *static_cast<Derived*>(this);
+    }
+
+    EIGEN_STRONG_INLINE Scalar value() const { return m_functor(m_lhsIter.value(), m_rhsIter.value()); }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); }
+    EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }
+    EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }
+
+    EIGEN_STRONG_INLINE operator bool() const { return (m_lhsIter && m_rhsIter); }
+
+  protected:
+    LhsIterator m_lhsIter;
+    RhsIterator m_rhsIter;
+    const BinaryFunc& m_functor;
+};
+
+// sparse - dense  (product)
+template<typename T, typename Lhs, typename Rhs, typename Derived>
+class sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Sparse, Dense>
+{
+    typedef scalar_product_op<T> BinaryFunc;
+    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;
+    typedef typename CwiseBinaryXpr::Scalar Scalar;
+    typedef typename traits<CwiseBinaryXpr>::_LhsNested _LhsNested;
+    typedef typename traits<CwiseBinaryXpr>::RhsNested RhsNested;
+    typedef typename _LhsNested::InnerIterator LhsIterator;
+    typedef typename Lhs::Index Index;
+    enum { IsRowMajor = (int(Lhs::Flags)&RowMajorBit)==RowMajorBit };
+  public:
+
+    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)
+      : m_rhs(xpr.rhs()), m_lhsIter(xpr.lhs(),outer), m_functor(xpr.functor()), m_outer(outer)
+    {}
+
+    EIGEN_STRONG_INLINE Derived& operator++()
+    {
+      ++m_lhsIter;
+      return *static_cast<Derived*>(this);
+    }
+
+    EIGEN_STRONG_INLINE Scalar value() const
+    { return m_functor(m_lhsIter.value(),
+                       m_rhs.coeff(IsRowMajor?m_outer:m_lhsIter.index(),IsRowMajor?m_lhsIter.index():m_outer)); }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_lhsIter.index(); }
+    EIGEN_STRONG_INLINE Index row() const { return m_lhsIter.row(); }
+    EIGEN_STRONG_INLINE Index col() const { return m_lhsIter.col(); }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_lhsIter; }
+
+  protected:
+    RhsNested m_rhs;
+    LhsIterator m_lhsIter;
+    const BinaryFunc m_functor;
+    const Index m_outer;
+};
+
+// sparse - dense  (product)
+template<typename T, typename Lhs, typename Rhs, typename Derived>
+class sparse_cwise_binary_op_inner_iterator_selector<scalar_product_op<T>, Lhs, Rhs, Derived, Dense, Sparse>
+{
+    typedef scalar_product_op<T> BinaryFunc;
+    typedef CwiseBinaryOp<BinaryFunc, Lhs, Rhs> CwiseBinaryXpr;
+    typedef typename CwiseBinaryXpr::Scalar Scalar;
+    typedef typename traits<CwiseBinaryXpr>::_RhsNested _RhsNested;
+    typedef typename _RhsNested::InnerIterator RhsIterator;
+    typedef typename Lhs::Index Index;
+
+    enum { IsRowMajor = (int(Rhs::Flags)&RowMajorBit)==RowMajorBit };
+  public:
+
+    EIGEN_STRONG_INLINE sparse_cwise_binary_op_inner_iterator_selector(const CwiseBinaryXpr& xpr, Index outer)
+      : m_xpr(xpr), m_rhsIter(xpr.rhs(),outer), m_functor(xpr.functor()), m_outer(outer)
+    {}
+
+    EIGEN_STRONG_INLINE Derived& operator++()
+    {
+      ++m_rhsIter;
+      return *static_cast<Derived*>(this);
+    }
+
+    EIGEN_STRONG_INLINE Scalar value() const
+    { return m_functor(m_xpr.lhs().coeff(IsRowMajor?m_outer:m_rhsIter.index(),IsRowMajor?m_rhsIter.index():m_outer), m_rhsIter.value()); }
+
+    EIGEN_STRONG_INLINE Index index() const { return m_rhsIter.index(); }
+    EIGEN_STRONG_INLINE Index row() const { return m_rhsIter.row(); }
+    EIGEN_STRONG_INLINE Index col() const { return m_rhsIter.col(); }
+
+    EIGEN_STRONG_INLINE operator bool() const { return m_rhsIter; }
+
+  protected:
+    const CwiseBinaryXpr& m_xpr;
+    RhsIterator m_rhsIter;
+    const BinaryFunc& m_functor;
+    const Index m_outer;
+};
+
+} // end namespace internal
+
+/***************************************************************************
+* Implementation of SparseMatrixBase and SparseCwise functions/operators
+***************************************************************************/
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+SparseMatrixBase<Derived>::operator-=(const SparseMatrixBase<OtherDerived> &other)
+{
+  return *this = derived() - other.derived();
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE Derived &
+SparseMatrixBase<Derived>::operator+=(const SparseMatrixBase<OtherDerived>& other)
+{
+  return *this = derived() + other.derived();
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE
+SparseMatrixBase<Derived>::cwiseProduct(const MatrixBase<OtherDerived> &other) const
+{
+  return EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE(derived(), other.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_CWISE_BINARY_OP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseUnaryOp.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseUnaryOp.h
new file mode 100644
index 0000000..5a50c78
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseCwiseUnaryOp.h
@@ -0,0 +1,163 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_CWISE_UNARY_OP_H
+#define EIGEN_SPARSE_CWISE_UNARY_OP_H
+
+namespace Eigen { 
+
+template<typename UnaryOp, typename MatrixType>
+class CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>
+  : public SparseMatrixBase<CwiseUnaryOp<UnaryOp, MatrixType> >
+{
+  public:
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    typedef CwiseUnaryOp<UnaryOp, MatrixType> Derived;
+    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
+
+  protected:
+    typedef typename internal::traits<Derived>::_XprTypeNested _MatrixTypeNested;
+    typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator;
+    typedef typename _MatrixTypeNested::ReverseInnerIterator MatrixTypeReverseIterator;
+};
+
+template<typename UnaryOp, typename MatrixType>
+class CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::InnerIterator
+    : public CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeIterator
+{
+    typedef typename CwiseUnaryOpImpl::Scalar Scalar;
+    typedef typename CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryOpImpl& unaryOp, typename CwiseUnaryOpImpl::Index outer)
+      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
+    {}
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++()
+    { Base::operator++(); return *this; }
+
+    EIGEN_STRONG_INLINE typename CwiseUnaryOpImpl::Scalar value() const { return m_functor(Base::value()); }
+
+  protected:
+    const UnaryOp m_functor;
+  private:
+    typename CwiseUnaryOpImpl::Scalar& valueRef();
+};
+
+template<typename UnaryOp, typename MatrixType>
+class CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::ReverseInnerIterator
+    : public CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeReverseIterator
+{
+    typedef typename CwiseUnaryOpImpl::Scalar Scalar;
+    typedef typename CwiseUnaryOpImpl<UnaryOp,MatrixType,Sparse>::MatrixTypeReverseIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator(const CwiseUnaryOpImpl& unaryOp, typename CwiseUnaryOpImpl::Index outer)
+      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
+    {}
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()
+    { Base::operator--(); return *this; }
+
+    EIGEN_STRONG_INLINE typename CwiseUnaryOpImpl::Scalar value() const { return m_functor(Base::value()); }
+
+  protected:
+    const UnaryOp m_functor;
+  private:
+    typename CwiseUnaryOpImpl::Scalar& valueRef();
+};
+
+template<typename ViewOp, typename MatrixType>
+class CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>
+  : public SparseMatrixBase<CwiseUnaryView<ViewOp, MatrixType> >
+{
+  public:
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    typedef CwiseUnaryView<ViewOp, MatrixType> Derived;
+    EIGEN_SPARSE_PUBLIC_INTERFACE(Derived)
+
+  protected:
+    typedef typename internal::traits<Derived>::_MatrixTypeNested _MatrixTypeNested;
+    typedef typename _MatrixTypeNested::InnerIterator MatrixTypeIterator;
+    typedef typename _MatrixTypeNested::ReverseInnerIterator MatrixTypeReverseIterator;
+};
+
+template<typename ViewOp, typename MatrixType>
+class CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::InnerIterator
+    : public CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeIterator
+{
+    typedef typename CwiseUnaryViewImpl::Scalar Scalar;
+    typedef typename CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE InnerIterator(const CwiseUnaryViewImpl& unaryOp, typename CwiseUnaryViewImpl::Index outer)
+      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
+    {}
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++()
+    { Base::operator++(); return *this; }
+
+    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar value() const { return m_functor(Base::value()); }
+    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar& valueRef() { return m_functor(Base::valueRef()); }
+
+  protected:
+    const ViewOp m_functor;
+};
+
+template<typename ViewOp, typename MatrixType>
+class CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::ReverseInnerIterator
+    : public CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeReverseIterator
+{
+    typedef typename CwiseUnaryViewImpl::Scalar Scalar;
+    typedef typename CwiseUnaryViewImpl<ViewOp,MatrixType,Sparse>::MatrixTypeReverseIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator(const CwiseUnaryViewImpl& unaryOp, typename CwiseUnaryViewImpl::Index outer)
+      : Base(unaryOp.derived().nestedExpression(),outer), m_functor(unaryOp.derived().functor())
+    {}
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator& operator--()
+    { Base::operator--(); return *this; }
+
+    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar value() const { return m_functor(Base::value()); }
+    EIGEN_STRONG_INLINE typename CwiseUnaryViewImpl::Scalar& valueRef() { return m_functor(Base::valueRef()); }
+
+  protected:
+    const ViewOp m_functor;
+};
+
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+SparseMatrixBase<Derived>::operator*=(const Scalar& other)
+{
+  for (Index j=0; j<outerSize(); ++j)
+    for (typename Derived::InnerIterator i(derived(),j); i; ++i)
+      i.valueRef() *= other;
+  return derived();
+}
+
+template<typename Derived>
+EIGEN_STRONG_INLINE Derived&
+SparseMatrixBase<Derived>::operator/=(const Scalar& other)
+{
+  for (Index j=0; j<outerSize(); ++j)
+    for (typename Derived::InnerIterator i(derived(),j); i; ++i)
+      i.valueRef() /= other;
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_CWISE_UNARY_OP_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDenseProduct.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDenseProduct.h
new file mode 100644
index 0000000..8c608a6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDenseProduct.h
@@ -0,0 +1,300 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEDENSEPRODUCT_H
+#define EIGEN_SPARSEDENSEPRODUCT_H
+
+namespace Eigen { 
+
+template<typename Lhs, typename Rhs, int InnerSize> struct SparseDenseProductReturnType
+{
+  typedef SparseTimeDenseProduct<Lhs,Rhs> Type;
+};
+
+template<typename Lhs, typename Rhs> struct SparseDenseProductReturnType<Lhs,Rhs,1>
+{
+  typedef SparseDenseOuterProduct<Lhs,Rhs,false> Type;
+};
+
+template<typename Lhs, typename Rhs, int InnerSize> struct DenseSparseProductReturnType
+{
+  typedef DenseTimeSparseProduct<Lhs,Rhs> Type;
+};
+
+template<typename Lhs, typename Rhs> struct DenseSparseProductReturnType<Lhs,Rhs,1>
+{
+  typedef SparseDenseOuterProduct<Rhs,Lhs,true> Type;
+};
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, bool Tr>
+struct traits<SparseDenseOuterProduct<Lhs,Rhs,Tr> >
+{
+  typedef Sparse StorageKind;
+  typedef typename scalar_product_traits<typename traits<Lhs>::Scalar,
+                                         typename traits<Rhs>::Scalar>::ReturnType Scalar;
+  typedef typename Lhs::Index Index;
+  typedef typename Lhs::Nested LhsNested;
+  typedef typename Rhs::Nested RhsNested;
+  typedef typename remove_all<LhsNested>::type _LhsNested;
+  typedef typename remove_all<RhsNested>::type _RhsNested;
+
+  enum {
+    LhsCoeffReadCost = traits<_LhsNested>::CoeffReadCost,
+    RhsCoeffReadCost = traits<_RhsNested>::CoeffReadCost,
+
+    RowsAtCompileTime    = Tr ? int(traits<Rhs>::RowsAtCompileTime)     : int(traits<Lhs>::RowsAtCompileTime),
+    ColsAtCompileTime    = Tr ? int(traits<Lhs>::ColsAtCompileTime)     : int(traits<Rhs>::ColsAtCompileTime),
+    MaxRowsAtCompileTime = Tr ? int(traits<Rhs>::MaxRowsAtCompileTime)  : int(traits<Lhs>::MaxRowsAtCompileTime),
+    MaxColsAtCompileTime = Tr ? int(traits<Lhs>::MaxColsAtCompileTime)  : int(traits<Rhs>::MaxColsAtCompileTime),
+
+    Flags = Tr ? RowMajorBit : 0,
+
+    CoeffReadCost = LhsCoeffReadCost + RhsCoeffReadCost + NumTraits<Scalar>::MulCost
+  };
+};
+
+} // end namespace internal
+
+template<typename Lhs, typename Rhs, bool Tr>
+class SparseDenseOuterProduct
+ : public SparseMatrixBase<SparseDenseOuterProduct<Lhs,Rhs,Tr> >
+{
+  public:
+
+    typedef SparseMatrixBase<SparseDenseOuterProduct> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(SparseDenseOuterProduct)
+    typedef internal::traits<SparseDenseOuterProduct> Traits;
+
+  private:
+
+    typedef typename Traits::LhsNested LhsNested;
+    typedef typename Traits::RhsNested RhsNested;
+    typedef typename Traits::_LhsNested _LhsNested;
+    typedef typename Traits::_RhsNested _RhsNested;
+
+  public:
+
+    class InnerIterator;
+
+    EIGEN_STRONG_INLINE SparseDenseOuterProduct(const Lhs& lhs, const Rhs& rhs)
+      : m_lhs(lhs), m_rhs(rhs)
+    {
+      EIGEN_STATIC_ASSERT(!Tr,YOU_MADE_A_PROGRAMMING_MISTAKE);
+    }
+
+    EIGEN_STRONG_INLINE SparseDenseOuterProduct(const Rhs& rhs, const Lhs& lhs)
+      : m_lhs(lhs), m_rhs(rhs)
+    {
+      EIGEN_STATIC_ASSERT(Tr,YOU_MADE_A_PROGRAMMING_MISTAKE);
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return Tr ? m_rhs.rows() : m_lhs.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return Tr ? m_lhs.cols() : m_rhs.cols(); }
+
+    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }
+    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }
+
+  protected:
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+};
+
+template<typename Lhs, typename Rhs, bool Transpose>
+class SparseDenseOuterProduct<Lhs,Rhs,Transpose>::InnerIterator : public _LhsNested::InnerIterator
+{
+    typedef typename _LhsNested::InnerIterator Base;
+  public:
+    EIGEN_STRONG_INLINE InnerIterator(const SparseDenseOuterProduct& prod, Index outer)
+      : Base(prod.lhs(), 0), m_outer(outer), m_factor(prod.rhs().coeff(outer))
+    {
+    }
+
+    inline Index outer() const { return m_outer; }
+    inline Index row() const { return Transpose ? Base::row() : m_outer; }
+    inline Index col() const { return Transpose ? m_outer : Base::row(); }
+
+    inline Scalar value() const { return Base::value() * m_factor; }
+
+  protected:
+    int m_outer;
+    Scalar m_factor;
+};
+
+namespace internal {
+template<typename Lhs, typename Rhs>
+struct traits<SparseTimeDenseProduct<Lhs,Rhs> >
+ : traits<ProductBase<SparseTimeDenseProduct<Lhs,Rhs>, Lhs, Rhs> >
+{
+  typedef Dense StorageKind;
+  typedef MatrixXpr XprKind;
+};
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType,
+         int LhsStorageOrder = ((SparseLhsType::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor,
+         bool ColPerCol = ((DenseRhsType::Flags&RowMajorBit)==0) || DenseRhsType::ColsAtCompileTime==1>
+struct sparse_time_dense_product_impl;
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, RowMajor, true>
+{
+  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
+  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
+  typedef typename internal::remove_all<DenseResType>::type Res;
+  typedef typename Lhs::Index Index;
+  typedef typename Lhs::InnerIterator LhsInnerIterator;
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
+  {
+    for(Index c=0; c<rhs.cols(); ++c)
+    {
+      int n = lhs.outerSize();
+      for(Index j=0; j<n; ++j)
+      {
+        typename Res::Scalar tmp(0);
+        for(LhsInnerIterator it(lhs,j); it ;++it)
+          tmp += it.value() * rhs.coeff(it.index(),c);
+        res.coeffRef(j,c) = alpha * tmp;
+      }
+    }
+  }
+};
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, ColMajor, true>
+{
+  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
+  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
+  typedef typename internal::remove_all<DenseResType>::type Res;
+  typedef typename Lhs::InnerIterator LhsInnerIterator;
+  typedef typename Lhs::Index Index;
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
+  {
+    for(Index c=0; c<rhs.cols(); ++c)
+    {
+      for(Index j=0; j<lhs.outerSize(); ++j)
+      {
+        typename Res::Scalar rhs_j = alpha * rhs.coeff(j,c);
+        for(LhsInnerIterator it(lhs,j); it ;++it)
+          res.coeffRef(it.index(),c) += it.value() * rhs_j;
+      }
+    }
+  }
+};
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, RowMajor, false>
+{
+  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
+  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
+  typedef typename internal::remove_all<DenseResType>::type Res;
+  typedef typename Lhs::InnerIterator LhsInnerIterator;
+  typedef typename Lhs::Index Index;
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
+  {
+    for(Index j=0; j<lhs.outerSize(); ++j)
+    {
+      typename Res::RowXpr res_j(res.row(j));
+      for(LhsInnerIterator it(lhs,j); it ;++it)
+        res_j += (alpha*it.value()) * rhs.row(it.index());
+    }
+  }
+};
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType>
+struct sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType, ColMajor, false>
+{
+  typedef typename internal::remove_all<SparseLhsType>::type Lhs;
+  typedef typename internal::remove_all<DenseRhsType>::type Rhs;
+  typedef typename internal::remove_all<DenseResType>::type Res;
+  typedef typename Lhs::InnerIterator LhsInnerIterator;
+  typedef typename Lhs::Index Index;
+  static void run(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const typename Res::Scalar& alpha)
+  {
+    for(Index j=0; j<lhs.outerSize(); ++j)
+    {
+      typename Rhs::ConstRowXpr rhs_j(rhs.row(j));
+      for(LhsInnerIterator it(lhs,j); it ;++it)
+        res.row(it.index()) += (alpha*it.value()) * rhs_j;
+    }
+  }
+};
+
+template<typename SparseLhsType, typename DenseRhsType, typename DenseResType,typename AlphaType>
+inline void sparse_time_dense_product(const SparseLhsType& lhs, const DenseRhsType& rhs, DenseResType& res, const AlphaType& alpha)
+{
+  sparse_time_dense_product_impl<SparseLhsType,DenseRhsType,DenseResType>::run(lhs, rhs, res, alpha);
+}
+
+} // end namespace internal
+
+template<typename Lhs, typename Rhs>
+class SparseTimeDenseProduct
+  : public ProductBase<SparseTimeDenseProduct<Lhs,Rhs>, Lhs, Rhs>
+{
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(SparseTimeDenseProduct)
+
+    SparseTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {}
+
+    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+    {
+      internal::sparse_time_dense_product(m_lhs, m_rhs, dest, alpha);
+    }
+
+  private:
+    SparseTimeDenseProduct& operator=(const SparseTimeDenseProduct&);
+};
+
+
+// dense = dense * sparse
+namespace internal {
+template<typename Lhs, typename Rhs>
+struct traits<DenseTimeSparseProduct<Lhs,Rhs> >
+ : traits<ProductBase<DenseTimeSparseProduct<Lhs,Rhs>, Lhs, Rhs> >
+{
+  typedef Dense StorageKind;
+};
+} // end namespace internal
+
+template<typename Lhs, typename Rhs>
+class DenseTimeSparseProduct
+  : public ProductBase<DenseTimeSparseProduct<Lhs,Rhs>, Lhs, Rhs>
+{
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(DenseTimeSparseProduct)
+
+    DenseTimeSparseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {}
+
+    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+    {
+      Transpose<const _LhsNested> lhs_t(m_lhs);
+      Transpose<const _RhsNested> rhs_t(m_rhs);
+      Transpose<Dest> dest_t(dest);
+      internal::sparse_time_dense_product(rhs_t, lhs_t, dest_t, alpha);
+    }
+
+  private:
+    DenseTimeSparseProduct& operator=(const DenseTimeSparseProduct&);
+};
+
+// sparse * dense
+template<typename Derived>
+template<typename OtherDerived>
+inline const typename SparseDenseProductReturnType<Derived,OtherDerived>::Type
+SparseMatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const
+{
+  return typename SparseDenseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEDENSEPRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDiagonalProduct.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDiagonalProduct.h
new file mode 100644
index 0000000..5ec4018
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDiagonalProduct.h
@@ -0,0 +1,192 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_DIAGONAL_PRODUCT_H
+#define EIGEN_SPARSE_DIAGONAL_PRODUCT_H
+
+namespace Eigen { 
+
+// The product of a diagonal matrix with a sparse matrix can be easily
+// implemented using expression template.
+// We have two consider very different cases:
+// 1 - diag * row-major sparse
+//     => each inner vector <=> scalar * sparse vector product
+//     => so we can reuse CwiseUnaryOp::InnerIterator
+// 2 - diag * col-major sparse
+//     => each inner vector <=> densevector * sparse vector cwise product
+//     => again, we can reuse specialization of CwiseBinaryOp::InnerIterator
+//        for that particular case
+// The two other cases are symmetric.
+
+namespace internal {
+
+template<typename Lhs, typename Rhs>
+struct traits<SparseDiagonalProduct<Lhs, Rhs> >
+{
+  typedef typename remove_all<Lhs>::type _Lhs;
+  typedef typename remove_all<Rhs>::type _Rhs;
+  typedef typename _Lhs::Scalar Scalar;
+  typedef typename promote_index_type<typename traits<Lhs>::Index,
+                                         typename traits<Rhs>::Index>::type Index;
+  typedef Sparse StorageKind;
+  typedef MatrixXpr XprKind;
+  enum {
+    RowsAtCompileTime = _Lhs::RowsAtCompileTime,
+    ColsAtCompileTime = _Rhs::ColsAtCompileTime,
+
+    MaxRowsAtCompileTime = _Lhs::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = _Rhs::MaxColsAtCompileTime,
+
+    SparseFlags = is_diagonal<_Lhs>::ret ? int(_Rhs::Flags) : int(_Lhs::Flags),
+    Flags = (SparseFlags&RowMajorBit),
+    CoeffReadCost = Dynamic
+  };
+};
+
+enum {SDP_IsDiagonal, SDP_IsSparseRowMajor, SDP_IsSparseColMajor};
+template<typename Lhs, typename Rhs, typename SparseDiagonalProductType, int RhsMode, int LhsMode>
+class sparse_diagonal_product_inner_iterator_selector;
+
+} // end namespace internal
+
+template<typename Lhs, typename Rhs>
+class SparseDiagonalProduct
+  : public SparseMatrixBase<SparseDiagonalProduct<Lhs,Rhs> >,
+    internal::no_assignment_operator
+{
+    typedef typename Lhs::Nested LhsNested;
+    typedef typename Rhs::Nested RhsNested;
+
+    typedef typename internal::remove_all<LhsNested>::type _LhsNested;
+    typedef typename internal::remove_all<RhsNested>::type _RhsNested;
+
+    enum {
+      LhsMode = internal::is_diagonal<_LhsNested>::ret ? internal::SDP_IsDiagonal
+              : (_LhsNested::Flags&RowMajorBit) ? internal::SDP_IsSparseRowMajor : internal::SDP_IsSparseColMajor,
+      RhsMode = internal::is_diagonal<_RhsNested>::ret ? internal::SDP_IsDiagonal
+              : (_RhsNested::Flags&RowMajorBit) ? internal::SDP_IsSparseRowMajor : internal::SDP_IsSparseColMajor
+    };
+
+  public:
+
+    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseDiagonalProduct)
+
+    typedef internal::sparse_diagonal_product_inner_iterator_selector
+                <_LhsNested,_RhsNested,SparseDiagonalProduct,LhsMode,RhsMode> InnerIterator;
+
+    EIGEN_STRONG_INLINE SparseDiagonalProduct(const Lhs& lhs, const Rhs& rhs)
+      : m_lhs(lhs), m_rhs(rhs)
+    {
+      eigen_assert(lhs.cols() == rhs.rows() && "invalid sparse matrix * diagonal matrix product");
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
+
+    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }
+    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }
+
+  protected:
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+};
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, typename SparseDiagonalProductType>
+class sparse_diagonal_product_inner_iterator_selector
+<Lhs,Rhs,SparseDiagonalProductType,SDP_IsDiagonal,SDP_IsSparseRowMajor>
+  : public CwiseUnaryOp<scalar_multiple_op<typename Lhs::Scalar>,const Rhs>::InnerIterator
+{
+    typedef typename CwiseUnaryOp<scalar_multiple_op<typename Lhs::Scalar>,const Rhs>::InnerIterator Base;
+    typedef typename Lhs::Index Index;
+  public:
+    inline sparse_diagonal_product_inner_iterator_selector(
+              const SparseDiagonalProductType& expr, Index outer)
+      : Base(expr.rhs()*(expr.lhs().diagonal().coeff(outer)), outer)
+    {}
+};
+
+template<typename Lhs, typename Rhs, typename SparseDiagonalProductType>
+class sparse_diagonal_product_inner_iterator_selector
+<Lhs,Rhs,SparseDiagonalProductType,SDP_IsDiagonal,SDP_IsSparseColMajor>
+  : public CwiseBinaryOp<
+      scalar_product_op<typename Lhs::Scalar>,
+      typename Rhs::ConstInnerVectorReturnType,
+      typename Lhs::DiagonalVectorType>::InnerIterator
+{
+    typedef typename CwiseBinaryOp<
+      scalar_product_op<typename Lhs::Scalar>,
+      typename Rhs::ConstInnerVectorReturnType,
+      typename Lhs::DiagonalVectorType>::InnerIterator Base;
+    typedef typename Lhs::Index Index;
+    Index m_outer;
+  public:
+    inline sparse_diagonal_product_inner_iterator_selector(
+              const SparseDiagonalProductType& expr, Index outer)
+      : Base(expr.rhs().innerVector(outer) .cwiseProduct(expr.lhs().diagonal()), 0), m_outer(outer)
+    {}
+    
+    inline Index outer() const { return m_outer; }
+    inline Index col() const { return m_outer; }
+};
+
+template<typename Lhs, typename Rhs, typename SparseDiagonalProductType>
+class sparse_diagonal_product_inner_iterator_selector
+<Lhs,Rhs,SparseDiagonalProductType,SDP_IsSparseColMajor,SDP_IsDiagonal>
+  : public CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,const Lhs>::InnerIterator
+{
+    typedef typename CwiseUnaryOp<scalar_multiple_op<typename Rhs::Scalar>,const Lhs>::InnerIterator Base;
+    typedef typename Lhs::Index Index;
+  public:
+    inline sparse_diagonal_product_inner_iterator_selector(
+              const SparseDiagonalProductType& expr, Index outer)
+      : Base(expr.lhs()*expr.rhs().diagonal().coeff(outer), outer)
+    {}
+};
+
+template<typename Lhs, typename Rhs, typename SparseDiagonalProductType>
+class sparse_diagonal_product_inner_iterator_selector
+<Lhs,Rhs,SparseDiagonalProductType,SDP_IsSparseRowMajor,SDP_IsDiagonal>
+  : public CwiseBinaryOp<
+      scalar_product_op<typename Rhs::Scalar>,
+      typename Lhs::ConstInnerVectorReturnType,
+      Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator
+{
+    typedef typename CwiseBinaryOp<
+      scalar_product_op<typename Rhs::Scalar>,
+      typename Lhs::ConstInnerVectorReturnType,
+      Transpose<const typename Rhs::DiagonalVectorType> >::InnerIterator Base;
+    typedef typename Lhs::Index Index;
+    Index m_outer;
+  public:
+    inline sparse_diagonal_product_inner_iterator_selector(
+              const SparseDiagonalProductType& expr, Index outer)
+      : Base(expr.lhs().innerVector(outer) .cwiseProduct(expr.rhs().diagonal().transpose()), 0), m_outer(outer)
+    {}
+    
+    inline Index outer() const { return m_outer; }
+    inline Index row() const { return m_outer; }
+};
+
+} // end namespace internal
+
+// SparseMatrixBase functions
+
+template<typename Derived>
+template<typename OtherDerived>
+const SparseDiagonalProduct<Derived,OtherDerived>
+SparseMatrixBase<Derived>::operator*(const DiagonalBase<OtherDerived> &other) const
+{
+  return SparseDiagonalProduct<Derived,OtherDerived>(this->derived(), other.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_DIAGONAL_PRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDot.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDot.h
new file mode 100644
index 0000000..dfeb3a8
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseDot.h
@@ -0,0 +1,101 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_DOT_H
+#define EIGEN_SPARSE_DOT_H
+
+namespace Eigen { 
+
+template<typename Derived>
+template<typename OtherDerived>
+typename internal::traits<Derived>::Scalar
+SparseMatrixBase<Derived>::dot(const MatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+  eigen_assert(size() == other.size());
+  eigen_assert(other.size()>0 && "you are using a non initialized vector");
+
+  typename Derived::InnerIterator i(derived(),0);
+  Scalar res(0);
+  while (i)
+  {
+    res += internal::conj(i.value()) * other.coeff(i.index());
+    ++i;
+  }
+  return res;
+}
+
+template<typename Derived>
+template<typename OtherDerived>
+typename internal::traits<Derived>::Scalar
+SparseMatrixBase<Derived>::dot(const SparseMatrixBase<OtherDerived>& other) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(OtherDerived)
+  EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(Derived,OtherDerived)
+  EIGEN_STATIC_ASSERT((internal::is_same<Scalar, typename OtherDerived::Scalar>::value),
+    YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
+
+  eigen_assert(size() == other.size());
+
+  typedef typename Derived::Nested  Nested;
+  typedef typename OtherDerived::Nested  OtherNested;
+  typedef typename internal::remove_all<Nested>::type  NestedCleaned;
+  typedef typename internal::remove_all<OtherNested>::type  OtherNestedCleaned;
+
+  Nested nthis(derived());
+  OtherNested nother(other.derived());
+
+  typename NestedCleaned::InnerIterator i(nthis,0);
+  typename OtherNestedCleaned::InnerIterator j(nother,0);
+  Scalar res(0);
+  while (i && j)
+  {
+    if (i.index()==j.index())
+    {
+      res += internal::conj(i.value()) * j.value();
+      ++i; ++j;
+    }
+    else if (i.index()<j.index())
+      ++i;
+    else
+      ++j;
+  }
+  return res;
+}
+
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+SparseMatrixBase<Derived>::squaredNorm() const
+{
+  return internal::real((*this).cwiseAbs2().sum());
+}
+
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+SparseMatrixBase<Derived>::norm() const
+{
+  using std::sqrt;
+  return sqrt(squaredNorm());
+}
+
+template<typename Derived>
+inline typename NumTraits<typename internal::traits<Derived>::Scalar>::Real
+SparseMatrixBase<Derived>::blueNorm() const
+{
+  return internal::blueNorm_impl(*this);
+}
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_DOT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseFuzzy.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseFuzzy.h
new file mode 100644
index 0000000..45f36e9
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseFuzzy.h
@@ -0,0 +1,26 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_FUZZY_H
+#define EIGEN_SPARSE_FUZZY_H
+
+// template<typename Derived>
+// template<typename OtherDerived>
+// bool SparseMatrixBase<Derived>::isApprox(
+//   const OtherDerived& other,
+//   typename NumTraits<Scalar>::Real prec
+// ) const
+// {
+//   const typename internal::nested<Derived,2>::type nested(derived());
+//   const typename internal::nested<OtherDerived,2>::type otherNested(other.derived());
+//   return    (nested - otherNested).cwise().abs2().sum()
+//          <= prec * prec * (std::min)(nested.cwise().abs2().sum(), otherNested.cwise().abs2().sum());
+// }
+
+#endif // EIGEN_SPARSE_FUZZY_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrix.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrix.h
new file mode 100644
index 0000000..dc57f77
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrix.h
@@ -0,0 +1,1219 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEMATRIX_H
+#define EIGEN_SPARSEMATRIX_H
+
+namespace Eigen { 
+
+/** \ingroup SparseCore_Module
+  *
+  * \class SparseMatrix
+  *
+  * \brief A versatible sparse matrix representation
+  *
+  * This class implements a more versatile variants of the common \em compressed row/column storage format.
+  * Each colmun's (resp. row) non zeros are stored as a pair of value with associated row (resp. colmiun) index.
+  * All the non zeros are stored in a single large buffer. Unlike the \em compressed format, there might be extra
+  * space inbetween the nonzeros of two successive colmuns (resp. rows) such that insertion of new non-zero
+  * can be done with limited memory reallocation and copies.
+  *
+  * A call to the function makeCompressed() turns the matrix into the standard \em compressed format
+  * compatible with many library.
+  *
+  * More details on this storage sceheme are given in the \ref TutorialSparse "manual pages".
+  *
+  * \tparam _Scalar the scalar type, i.e. the type of the coefficients
+  * \tparam _Options Union of bit flags controlling the storage scheme. Currently the only possibility
+  *                 is RowMajor. The default is 0 which means column-major.
+  * \tparam _Index the type of the indices. It has to be a \b signed type (e.g., short, int, std::ptrdiff_t). Default is \c int.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_SPARSEMATRIX_PLUGIN.
+  */
+
+namespace internal {
+template<typename _Scalar, int _Options, typename _Index>
+struct traits<SparseMatrix<_Scalar, _Options, _Index> >
+{
+  typedef _Scalar Scalar;
+  typedef _Index Index;
+  typedef Sparse StorageKind;
+  typedef MatrixXpr XprKind;
+  enum {
+    RowsAtCompileTime = Dynamic,
+    ColsAtCompileTime = Dynamic,
+    MaxRowsAtCompileTime = Dynamic,
+    MaxColsAtCompileTime = Dynamic,
+    Flags = _Options | NestByRefBit | LvalueBit,
+    CoeffReadCost = NumTraits<Scalar>::ReadCost,
+    SupportedAccessPatterns = InnerRandomAccessPattern
+  };
+};
+
+template<typename _Scalar, int _Options, typename _Index, int DiagIndex>
+struct traits<Diagonal<const SparseMatrix<_Scalar, _Options, _Index>, DiagIndex> >
+{
+  typedef SparseMatrix<_Scalar, _Options, _Index> MatrixType;
+  typedef typename nested<MatrixType>::type MatrixTypeNested;
+  typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
+
+  typedef _Scalar Scalar;
+  typedef Dense StorageKind;
+  typedef _Index Index;
+  typedef MatrixXpr XprKind;
+
+  enum {
+    RowsAtCompileTime = Dynamic,
+    ColsAtCompileTime = 1,
+    MaxRowsAtCompileTime = Dynamic,
+    MaxColsAtCompileTime = 1,
+    Flags = 0,
+    CoeffReadCost = _MatrixTypeNested::CoeffReadCost*10
+  };
+};
+
+} // end namespace internal
+
+template<typename _Scalar, int _Options, typename _Index>
+class SparseMatrix
+  : public SparseMatrixBase<SparseMatrix<_Scalar, _Options, _Index> >
+{
+  public:
+    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseMatrix)
+    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, +=)
+    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseMatrix, -=)
+
+    typedef MappedSparseMatrix<Scalar,Flags> Map;
+    using Base::IsRowMajor;
+    typedef internal::CompressedStorage<Scalar,Index> Storage;
+    enum {
+      Options = _Options
+    };
+
+  protected:
+
+    typedef SparseMatrix<Scalar,(Flags&~RowMajorBit)|(IsRowMajor?RowMajorBit:0)> TransposedSparseMatrix;
+
+    Index m_outerSize;
+    Index m_innerSize;
+    Index* m_outerIndex;
+    Index* m_innerNonZeros;     // optional, if null then the data is compressed
+    Storage m_data;
+    
+    Eigen::Map<Matrix<Index,Dynamic,1> > innerNonZeros() { return Eigen::Map<Matrix<Index,Dynamic,1> >(m_innerNonZeros, m_innerNonZeros?m_outerSize:0); }
+    const  Eigen::Map<const Matrix<Index,Dynamic,1> > innerNonZeros() const { return Eigen::Map<const Matrix<Index,Dynamic,1> >(m_innerNonZeros, m_innerNonZeros?m_outerSize:0); }
+
+  public:
+    
+    /** \returns whether \c *this is in compressed form. */
+    inline bool isCompressed() const { return m_innerNonZeros==0; }
+
+    /** \returns the number of rows of the matrix */
+    inline Index rows() const { return IsRowMajor ? m_outerSize : m_innerSize; }
+    /** \returns the number of columns of the matrix */
+    inline Index cols() const { return IsRowMajor ? m_innerSize : m_outerSize; }
+
+    /** \returns the number of rows (resp. columns) of the matrix if the storage order column major (resp. row major) */
+    inline Index innerSize() const { return m_innerSize; }
+    /** \returns the number of columns (resp. rows) of the matrix if the storage order column major (resp. row major) */
+    inline Index outerSize() const { return m_outerSize; }
+    
+    /** \returns a const pointer to the array of values.
+      * This function is aimed at interoperability with other libraries.
+      * \sa innerIndexPtr(), outerIndexPtr() */
+    inline const Scalar* valuePtr() const { return &m_data.value(0); }
+    /** \returns a non-const pointer to the array of values.
+      * This function is aimed at interoperability with other libraries.
+      * \sa innerIndexPtr(), outerIndexPtr() */
+    inline Scalar* valuePtr() { return &m_data.value(0); }
+
+    /** \returns a const pointer to the array of inner indices.
+      * This function is aimed at interoperability with other libraries.
+      * \sa valuePtr(), outerIndexPtr() */
+    inline const Index* innerIndexPtr() const { return &m_data.index(0); }
+    /** \returns a non-const pointer to the array of inner indices.
+      * This function is aimed at interoperability with other libraries.
+      * \sa valuePtr(), outerIndexPtr() */
+    inline Index* innerIndexPtr() { return &m_data.index(0); }
+
+    /** \returns a const pointer to the array of the starting positions of the inner vectors.
+      * This function is aimed at interoperability with other libraries.
+      * \sa valuePtr(), innerIndexPtr() */
+    inline const Index* outerIndexPtr() const { return m_outerIndex; }
+    /** \returns a non-const pointer to the array of the starting positions of the inner vectors.
+      * This function is aimed at interoperability with other libraries.
+      * \sa valuePtr(), innerIndexPtr() */
+    inline Index* outerIndexPtr() { return m_outerIndex; }
+
+    /** \returns a const pointer to the array of the number of non zeros of the inner vectors.
+      * This function is aimed at interoperability with other libraries.
+      * \warning it returns the null pointer 0 in compressed mode */
+    inline const Index* innerNonZeroPtr() const { return m_innerNonZeros; }
+    /** \returns a non-const pointer to the array of the number of non zeros of the inner vectors.
+      * This function is aimed at interoperability with other libraries.
+      * \warning it returns the null pointer 0 in compressed mode */
+    inline Index* innerNonZeroPtr() { return m_innerNonZeros; }
+
+    /** \internal */
+    inline Storage& data() { return m_data; }
+    /** \internal */
+    inline const Storage& data() const { return m_data; }
+
+    /** \returns the value of the matrix at position \a i, \a j
+      * This function returns Scalar(0) if the element is an explicit \em zero */
+    inline Scalar coeff(Index row, Index col) const
+    {
+      const Index outer = IsRowMajor ? row : col;
+      const Index inner = IsRowMajor ? col : row;
+      Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer+1];
+      return m_data.atInRange(m_outerIndex[outer], end, inner);
+    }
+
+    /** \returns a non-const reference to the value of the matrix at position \a i, \a j
+      *
+      * If the element does not exist then it is inserted via the insert(Index,Index) function
+      * which itself turns the matrix into a non compressed form if that was not the case.
+      *
+      * This is a O(log(nnz_j)) operation (binary search) plus the cost of insert(Index,Index)
+      * function if the element does not already exist.
+      */
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      const Index outer = IsRowMajor ? row : col;
+      const Index inner = IsRowMajor ? col : row;
+
+      Index start = m_outerIndex[outer];
+      Index end = m_innerNonZeros ? m_outerIndex[outer] + m_innerNonZeros[outer] : m_outerIndex[outer+1];
+      eigen_assert(end>=start && "you probably called coeffRef on a non finalized matrix");
+      if(end<=start)
+        return insert(row,col);
+      const Index p = m_data.searchLowerIndex(start,end-1,inner);
+      if((p<end) && (m_data.index(p)==inner))
+        return m_data.value(p);
+      else
+        return insert(row,col);
+    }
+
+    /** \returns a reference to a novel non zero coefficient with coordinates \a row x \a col.
+      * The non zero coefficient must \b not already exist.
+      *
+      * If the matrix \c *this is in compressed mode, then \c *this is turned into uncompressed
+      * mode while reserving room for 2 non zeros per inner vector. It is strongly recommended to first
+      * call reserve(const SizesType &) to reserve a more appropriate number of elements per
+      * inner vector that better match your scenario.
+      *
+      * This function performs a sorted insertion in O(1) if the elements of each inner vector are
+      * inserted in increasing inner index order, and in O(nnz_j) for a random insertion.
+      *
+      */
+    Scalar& insert(Index row, Index col)
+    {
+      if(isCompressed())
+      {
+        reserve(VectorXi::Constant(outerSize(), 2));
+      }
+      return insertUncompressed(row,col);
+    }
+
+  public:
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    /** Removes all non zeros but keep allocated memory */
+    inline void setZero()
+    {
+      m_data.clear();
+      memset(m_outerIndex, 0, (m_outerSize+1)*sizeof(Index));
+      if(m_innerNonZeros)
+        memset(m_innerNonZeros, 0, (m_outerSize)*sizeof(Index));
+    }
+
+    /** \returns the number of non zero coefficients */
+    inline Index nonZeros() const
+    {
+      if(m_innerNonZeros)
+        return innerNonZeros().sum();
+      return static_cast<Index>(m_data.size());
+    }
+
+    /** Preallocates \a reserveSize non zeros.
+      *
+      * Precondition: the matrix must be in compressed mode. */
+    inline void reserve(Index reserveSize)
+    {
+      eigen_assert(isCompressed() && "This function does not make sense in non compressed mode.");
+      m_data.reserve(reserveSize);
+    }
+    
+    #ifdef EIGEN_PARSED_BY_DOXYGEN
+    /** Preallocates \a reserveSize[\c j] non zeros for each column (resp. row) \c j.
+      *
+      * This function turns the matrix in non-compressed mode */
+    template<class SizesType>
+    inline void reserve(const SizesType& reserveSizes);
+    #else
+    template<class SizesType>
+    inline void reserve(const SizesType& reserveSizes, const typename SizesType::value_type& enableif = typename SizesType::value_type())
+    {
+      EIGEN_UNUSED_VARIABLE(enableif);
+      reserveInnerVectors(reserveSizes);
+    }
+    template<class SizesType>
+    inline void reserve(const SizesType& reserveSizes, const typename SizesType::Scalar& enableif =
+    #if (!defined(_MSC_VER)) || (_MSC_VER>=1500) // MSVC 2005 fails to compile with this typename
+        typename
+    #endif
+        SizesType::Scalar())
+    {
+      EIGEN_UNUSED_VARIABLE(enableif);
+      reserveInnerVectors(reserveSizes);
+    }
+    #endif // EIGEN_PARSED_BY_DOXYGEN
+  protected:
+    template<class SizesType>
+    inline void reserveInnerVectors(const SizesType& reserveSizes)
+    {
+      
+      if(isCompressed())
+      {
+        std::size_t totalReserveSize = 0;
+        // turn the matrix into non-compressed mode
+        m_innerNonZeros = static_cast<Index*>(std::malloc(m_outerSize * sizeof(Index)));
+        if (!m_innerNonZeros) internal::throw_std_bad_alloc();
+        
+        // temporarily use m_innerSizes to hold the new starting points.
+        Index* newOuterIndex = m_innerNonZeros;
+        
+        Index count = 0;
+        for(Index j=0; j<m_outerSize; ++j)
+        {
+          newOuterIndex[j] = count;
+          count += reserveSizes[j] + (m_outerIndex[j+1]-m_outerIndex[j]);
+          totalReserveSize += reserveSizes[j];
+        }
+        m_data.reserve(totalReserveSize);
+        Index previousOuterIndex = m_outerIndex[m_outerSize];
+        for(Index j=m_outerSize-1; j>=0; --j)
+        {
+          Index innerNNZ = previousOuterIndex - m_outerIndex[j];
+          for(Index i=innerNNZ-1; i>=0; --i)
+          {
+            m_data.index(newOuterIndex[j]+i) = m_data.index(m_outerIndex[j]+i);
+            m_data.value(newOuterIndex[j]+i) = m_data.value(m_outerIndex[j]+i);
+          }
+          previousOuterIndex = m_outerIndex[j];
+          m_outerIndex[j] = newOuterIndex[j];
+          m_innerNonZeros[j] = innerNNZ;
+        }
+        m_outerIndex[m_outerSize] = m_outerIndex[m_outerSize-1] + m_innerNonZeros[m_outerSize-1] + reserveSizes[m_outerSize-1];
+        
+        m_data.resize(m_outerIndex[m_outerSize]);
+      }
+      else
+      {
+        Index* newOuterIndex = static_cast<Index*>(std::malloc((m_outerSize+1)*sizeof(Index)));
+        if (!newOuterIndex) internal::throw_std_bad_alloc();
+        
+        Index count = 0;
+        for(Index j=0; j<m_outerSize; ++j)
+        {
+          newOuterIndex[j] = count;
+          Index alreadyReserved = (m_outerIndex[j+1]-m_outerIndex[j]) - m_innerNonZeros[j];
+          Index toReserve = std::max<Index>(reserveSizes[j], alreadyReserved);
+          count += toReserve + m_innerNonZeros[j];
+        }
+        newOuterIndex[m_outerSize] = count;
+        
+        m_data.resize(count);
+        for(Index j=m_outerSize-1; j>=0; --j)
+        {
+          Index offset = newOuterIndex[j] - m_outerIndex[j];
+          if(offset>0)
+          {
+            Index innerNNZ = m_innerNonZeros[j];
+            for(Index i=innerNNZ-1; i>=0; --i)
+            {
+              m_data.index(newOuterIndex[j]+i) = m_data.index(m_outerIndex[j]+i);
+              m_data.value(newOuterIndex[j]+i) = m_data.value(m_outerIndex[j]+i);
+            }
+          }
+        }
+        
+        std::swap(m_outerIndex, newOuterIndex);
+        std::free(newOuterIndex);
+      }
+      
+    }
+  public:
+
+    //--- low level purely coherent filling ---
+
+    /** \internal
+      * \returns a reference to the non zero coefficient at position \a row, \a col assuming that:
+      * - the nonzero does not already exist
+      * - the new coefficient is the last one according to the storage order
+      *
+      * Before filling a given inner vector you must call the statVec(Index) function.
+      *
+      * After an insertion session, you should call the finalize() function.
+      *
+      * \sa insert, insertBackByOuterInner, startVec */
+    inline Scalar& insertBack(Index row, Index col)
+    {
+      return insertBackByOuterInner(IsRowMajor?row:col, IsRowMajor?col:row);
+    }
+
+    /** \internal
+      * \sa insertBack, startVec */
+    inline Scalar& insertBackByOuterInner(Index outer, Index inner)
+    {
+      eigen_assert(size_t(m_outerIndex[outer+1]) == m_data.size() && "Invalid ordered insertion (invalid outer index)");
+      eigen_assert( (m_outerIndex[outer+1]-m_outerIndex[outer]==0 || m_data.index(m_data.size()-1)<inner) && "Invalid ordered insertion (invalid inner index)");
+      Index p = m_outerIndex[outer+1];
+      ++m_outerIndex[outer+1];
+      m_data.append(0, inner);
+      return m_data.value(p);
+    }
+
+    /** \internal
+      * \warning use it only if you know what you are doing */
+    inline Scalar& insertBackByOuterInnerUnordered(Index outer, Index inner)
+    {
+      Index p = m_outerIndex[outer+1];
+      ++m_outerIndex[outer+1];
+      m_data.append(0, inner);
+      return m_data.value(p);
+    }
+
+    /** \internal
+      * \sa insertBack, insertBackByOuterInner */
+    inline void startVec(Index outer)
+    {
+      eigen_assert(m_outerIndex[outer]==int(m_data.size()) && "You must call startVec for each inner vector sequentially");
+      eigen_assert(m_outerIndex[outer+1]==0 && "You must call startVec for each inner vector sequentially");
+      m_outerIndex[outer+1] = m_outerIndex[outer];
+    }
+
+    /** \internal
+      * Must be called after inserting a set of non zero entries using the low level compressed API.
+      */
+    inline void finalize()
+    {
+      if(isCompressed())
+      {
+        Index size = static_cast<Index>(m_data.size());
+        Index i = m_outerSize;
+        // find the last filled column
+        while (i>=0 && m_outerIndex[i]==0)
+          --i;
+        ++i;
+        while (i<=m_outerSize)
+        {
+          m_outerIndex[i] = size;
+          ++i;
+        }
+      }
+    }
+
+    //---
+
+    template<typename InputIterators>
+    void setFromTriplets(const InputIterators& begin, const InputIterators& end);
+
+    void sumupDuplicates();
+
+    //---
+    
+    /** \internal
+      * same as insert(Index,Index) except that the indices are given relative to the storage order */
+    Scalar& insertByOuterInner(Index j, Index i)
+    {
+      return insert(IsRowMajor ? j : i, IsRowMajor ? i : j);
+    }
+
+    /** Turns the matrix into the \em compressed format.
+      */
+    void makeCompressed()
+    {
+      if(isCompressed())
+        return;
+      
+      Index oldStart = m_outerIndex[1];
+      m_outerIndex[1] = m_innerNonZeros[0];
+      for(Index j=1; j<m_outerSize; ++j)
+      {
+        Index nextOldStart = m_outerIndex[j+1];
+        Index offset = oldStart - m_outerIndex[j];
+        if(offset>0)
+        {
+          for(Index k=0; k<m_innerNonZeros[j]; ++k)
+          {
+            m_data.index(m_outerIndex[j]+k) = m_data.index(oldStart+k);
+            m_data.value(m_outerIndex[j]+k) = m_data.value(oldStart+k);
+          }
+        }
+        m_outerIndex[j+1] = m_outerIndex[j] + m_innerNonZeros[j];
+        oldStart = nextOldStart;
+      }
+      std::free(m_innerNonZeros);
+      m_innerNonZeros = 0;
+      m_data.resize(m_outerIndex[m_outerSize]);
+      m_data.squeeze();
+    }
+
+    /** Turns the matrix into the uncompressed mode */
+    void uncompress()
+    {
+      if(m_innerNonZeros != 0)
+        return; 
+      m_innerNonZeros = static_cast<Index*>(std::malloc(m_outerSize * sizeof(Index)));
+      for (int i = 0; i < m_outerSize; i++)
+      {
+        m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i]; 
+      }
+    }
+    
+    /** Suppresses all nonzeros which are \b much \b smaller \b than \a reference under the tolerence \a epsilon */
+    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
+    {
+      prune(default_prunning_func(reference,epsilon));
+    }
+    
+    /** Turns the matrix into compressed format, and suppresses all nonzeros which do not satisfy the predicate \a keep.
+      * The functor type \a KeepFunc must implement the following function:
+      * \code
+      * bool operator() (const Index& row, const Index& col, const Scalar& value) const;
+      * \endcode
+      * \sa prune(Scalar,RealScalar)
+      */
+    template<typename KeepFunc>
+    void prune(const KeepFunc& keep = KeepFunc())
+    {
+      // TODO optimize the uncompressed mode to avoid moving and allocating the data twice
+      // TODO also implement a unit test
+      makeCompressed();
+
+      Index k = 0;
+      for(Index j=0; j<m_outerSize; ++j)
+      {
+        Index previousStart = m_outerIndex[j];
+        m_outerIndex[j] = k;
+        Index end = m_outerIndex[j+1];
+        for(Index i=previousStart; i<end; ++i)
+        {
+          if(keep(IsRowMajor?j:m_data.index(i), IsRowMajor?m_data.index(i):j, m_data.value(i)))
+          {
+            m_data.value(k) = m_data.value(i);
+            m_data.index(k) = m_data.index(i);
+            ++k;
+          }
+        }
+      }
+      m_outerIndex[m_outerSize] = k;
+      m_data.resize(k,0);
+    }
+
+    /** Resizes the matrix to a \a rows x \a cols matrix leaving old values untouched.
+      * \sa resizeNonZeros(Index), reserve(), setZero()
+      */
+    void conservativeResize(Index rows, Index cols) 
+    {
+        // No change
+        if (this->rows() == rows && this->cols() == cols) return;
+
+        Index innerChange = IsRowMajor ? cols - this->cols() : rows - this->rows();
+        Index outerChange = IsRowMajor ? rows - this->rows() : cols - this->cols();
+        Index newInnerSize = IsRowMajor ? cols : rows;
+
+        // Deals with inner non zeros
+        if (m_innerNonZeros)
+        {
+          // Resize m_innerNonZeros
+          Index *newInnerNonZeros = static_cast<Index*>(std::realloc(m_innerNonZeros, (m_outerSize + outerChange) * sizeof(Index)));
+          if (!newInnerNonZeros) internal::throw_std_bad_alloc();
+          m_innerNonZeros = newInnerNonZeros;
+          
+          for(Index i=m_outerSize; i<m_outerSize+outerChange; i++)          
+            m_innerNonZeros[i] = 0;
+        } 
+        else if (innerChange < 0) 
+        {
+          // Inner size decreased: allocate a new m_innerNonZeros
+          m_innerNonZeros = static_cast<Index*>(std::malloc((m_outerSize+outerChange+1) * sizeof(Index)));
+          if (!m_innerNonZeros) internal::throw_std_bad_alloc();
+          for(Index i = 0; i < m_outerSize; i++)
+            m_innerNonZeros[i] = m_outerIndex[i+1] - m_outerIndex[i];
+        }
+        
+        // Change the m_innerNonZeros in case of a decrease of inner size
+        if (m_innerNonZeros && innerChange < 0) {
+              for(Index i = 0; i < m_outerSize + (std::min)(outerChange, Index(0)); i++)
+              {
+                Index &n = m_innerNonZeros[i];
+                Index start = m_outerIndex[i];
+                while (n > 0 && m_data.index(start+n-1) >= newInnerSize) --n; 
+              }
+        }
+        
+        m_innerSize = newInnerSize;
+
+        // Re-allocate outer index structure if necessary
+        if (outerChange == 0)
+          return;
+            
+        Index *newOuterIndex = static_cast<Index*>(std::realloc(m_outerIndex, (m_outerSize + outerChange + 1) * sizeof(Index)));
+        if (!newOuterIndex) internal::throw_std_bad_alloc();
+        m_outerIndex = newOuterIndex;
+        if (outerChange > 0) {
+          Index last = m_outerSize == 0 ? 0 : m_outerIndex[m_outerSize];
+          for(Index i=m_outerSize; i<m_outerSize+outerChange+1; i++)          
+            m_outerIndex[i] = last; 
+        }
+        m_outerSize += outerChange;
+        
+    }
+    
+    /** Resizes the matrix to a \a rows x \a cols matrix and initializes it to zero.
+      * \sa resizeNonZeros(Index), reserve(), setZero()
+      */
+    void resize(Index rows, Index cols)
+    {
+      const Index outerSize = IsRowMajor ? rows : cols;
+      m_innerSize = IsRowMajor ? cols : rows;
+      m_data.clear();
+      if (m_outerSize != outerSize || m_outerSize==0)
+      {
+        std::free(m_outerIndex);
+        m_outerIndex = static_cast<Index*>(std::malloc((outerSize + 1) * sizeof(Index)));
+        if (!m_outerIndex) internal::throw_std_bad_alloc();
+        
+        m_outerSize = outerSize;
+      }
+      if(m_innerNonZeros)
+      {
+        std::free(m_innerNonZeros);
+        m_innerNonZeros = 0;
+      }
+      memset(m_outerIndex, 0, (m_outerSize+1)*sizeof(Index));
+    }
+
+    /** \internal
+      * Resize the nonzero vector to \a size */
+    void resizeNonZeros(Index size)
+    {
+      // TODO remove this function
+      m_data.resize(size);
+    }
+
+    /** \returns a const expression of the diagonal coefficients */
+    const Diagonal<const SparseMatrix> diagonal() const { return *this; }
+
+    /** Default constructor yielding an empty \c 0 \c x \c 0 matrix */
+    inline SparseMatrix()
+      : m_outerSize(-1), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
+    {
+      check_template_parameters();
+      resize(0, 0);
+    }
+
+    /** Constructs a \a rows \c x \a cols empty matrix */
+    inline SparseMatrix(Index rows, Index cols)
+      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
+    {
+      check_template_parameters();
+      resize(rows, cols);
+    }
+
+    /** Constructs a sparse matrix from the sparse expression \a other */
+    template<typename OtherDerived>
+    inline SparseMatrix(const SparseMatrixBase<OtherDerived>& other)
+      : m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
+    {
+      check_template_parameters();
+      *this = other.derived();
+    }
+
+    /** Copy constructor (it performs a deep copy) */
+    inline SparseMatrix(const SparseMatrix& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
+    {
+      check_template_parameters();
+      *this = other.derived();
+    }
+
+    /** \brief Copy constructor with in-place evaluation */
+    template<typename OtherDerived>
+    SparseMatrix(const ReturnByValue<OtherDerived>& other)
+      : Base(), m_outerSize(0), m_innerSize(0), m_outerIndex(0), m_innerNonZeros(0)
+    {
+      check_template_parameters();
+      initAssignment(other);
+      other.evalTo(*this);
+    }
+
+    /** Swaps the content of two sparse matrices of the same type.
+      * This is a fast operation that simply swaps the underlying pointers and parameters. */
+    inline void swap(SparseMatrix& other)
+    {
+      //EIGEN_DBG_SPARSE(std::cout << "SparseMatrix:: swap\n");
+      std::swap(m_outerIndex, other.m_outerIndex);
+      std::swap(m_innerSize, other.m_innerSize);
+      std::swap(m_outerSize, other.m_outerSize);
+      std::swap(m_innerNonZeros, other.m_innerNonZeros);
+      m_data.swap(other.m_data);
+    }
+
+    inline SparseMatrix& operator=(const SparseMatrix& other)
+    {
+      if (other.isRValue())
+      {
+        swap(other.const_cast_derived());
+      }
+      else
+      {
+        initAssignment(other);
+        if(other.isCompressed())
+        {
+          memcpy(m_outerIndex, other.m_outerIndex, (m_outerSize+1)*sizeof(Index));
+          m_data = other.m_data;
+        }
+        else
+        {
+          Base::operator=(other);
+        }
+      }
+      return *this;
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename Lhs, typename Rhs>
+    inline SparseMatrix& operator=(const SparseSparseProduct<Lhs,Rhs>& product)
+    { return Base::operator=(product); }
+    
+    template<typename OtherDerived>
+    inline SparseMatrix& operator=(const ReturnByValue<OtherDerived>& other)
+    {
+      initAssignment(other);
+      return Base::operator=(other.derived());
+    }
+    
+    template<typename OtherDerived>
+    inline SparseMatrix& operator=(const EigenBase<OtherDerived>& other)
+    { return Base::operator=(other.derived()); }
+    #endif
+
+    template<typename OtherDerived>
+    EIGEN_DONT_INLINE SparseMatrix& operator=(const SparseMatrixBase<OtherDerived>& other);
+
+    friend std::ostream & operator << (std::ostream & s, const SparseMatrix& m)
+    {
+      EIGEN_DBG_SPARSE(
+        s << "Nonzero entries:\n";
+        if(m.isCompressed())
+          for (Index i=0; i<m.nonZeros(); ++i)
+            s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
+        else
+          for (Index i=0; i<m.outerSize(); ++i)
+          {
+            int p = m.m_outerIndex[i];
+            int pe = m.m_outerIndex[i]+m.m_innerNonZeros[i];
+            Index k=p;
+            for (; k<pe; ++k)
+              s << "(" << m.m_data.value(k) << "," << m.m_data.index(k) << ") ";
+            for (; k<m.m_outerIndex[i+1]; ++k)
+              s << "(_,_) ";
+          }
+        s << std::endl;
+        s << std::endl;
+        s << "Outer pointers:\n";
+        for (Index i=0; i<m.outerSize(); ++i)
+          s << m.m_outerIndex[i] << " ";
+        s << " $" << std::endl;
+        if(!m.isCompressed())
+        {
+          s << "Inner non zeros:\n";
+          for (Index i=0; i<m.outerSize(); ++i)
+            s << m.m_innerNonZeros[i] << " ";
+          s << " $" << std::endl;
+        }
+        s << std::endl;
+      );
+      s << static_cast<const SparseMatrixBase<SparseMatrix>&>(m);
+      return s;
+    }
+
+    /** Destructor */
+    inline ~SparseMatrix()
+    {
+      std::free(m_outerIndex);
+      std::free(m_innerNonZeros);
+    }
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** Overloaded for performance */
+    Scalar sum() const;
+#endif
+    
+#   ifdef EIGEN_SPARSEMATRIX_PLUGIN
+#     include EIGEN_SPARSEMATRIX_PLUGIN
+#   endif
+
+protected:
+
+    template<typename Other>
+    void initAssignment(const Other& other)
+    {
+      resize(other.rows(), other.cols());
+      if(m_innerNonZeros)
+      {
+        std::free(m_innerNonZeros);
+        m_innerNonZeros = 0;
+      }
+    }
+
+    /** \internal
+      * \sa insert(Index,Index) */
+    EIGEN_DONT_INLINE Scalar& insertCompressed(Index row, Index col);
+
+    /** \internal
+      * A vector object that is equal to 0 everywhere but v at the position i */
+    class SingletonVector
+    {
+        Index m_index;
+        Index m_value;
+      public:
+        typedef Index value_type;
+        SingletonVector(Index i, Index v)
+          : m_index(i), m_value(v)
+        {}
+
+        Index operator[](Index i) const { return i==m_index ? m_value : 0; }
+    };
+
+    /** \internal
+      * \sa insert(Index,Index) */
+    EIGEN_DONT_INLINE Scalar& insertUncompressed(Index row, Index col);
+
+public:
+    /** \internal
+      * \sa insert(Index,Index) */
+    EIGEN_STRONG_INLINE Scalar& insertBackUncompressed(Index row, Index col)
+    {
+      const Index outer = IsRowMajor ? row : col;
+      const Index inner = IsRowMajor ? col : row;
+
+      eigen_assert(!isCompressed());
+      eigen_assert(m_innerNonZeros[outer]<=(m_outerIndex[outer+1] - m_outerIndex[outer]));
+
+      Index p = m_outerIndex[outer] + m_innerNonZeros[outer]++;
+      m_data.index(p) = inner;
+      return (m_data.value(p) = 0);
+    }
+
+private:
+  static void check_template_parameters()
+  {
+    EIGEN_STATIC_ASSERT(NumTraits<Index>::IsSigned,THE_INDEX_TYPE_MUST_BE_A_SIGNED_TYPE);
+  }
+
+  struct default_prunning_func {
+    default_prunning_func(const Scalar& ref, const RealScalar& eps) : reference(ref), epsilon(eps) {}
+    inline bool operator() (const Index&, const Index&, const Scalar& value) const
+    {
+      return !internal::isMuchSmallerThan(value, reference, epsilon);
+    }
+    Scalar reference;
+    RealScalar epsilon;
+  };
+};
+
+template<typename Scalar, int _Options, typename _Index>
+class SparseMatrix<Scalar,_Options,_Index>::InnerIterator
+{
+  public:
+    InnerIterator(const SparseMatrix& mat, Index outer)
+      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_id(mat.m_outerIndex[outer])
+    {
+      if(mat.isCompressed())
+        m_end = mat.m_outerIndex[outer+1];
+      else
+        m_end = m_id + mat.m_innerNonZeros[outer];
+    }
+
+    inline InnerIterator& operator++() { m_id++; return *this; }
+
+    inline const Scalar& value() const { return m_values[m_id]; }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id]); }
+
+    inline Index index() const { return m_indices[m_id]; }
+    inline Index outer() const { return m_outer; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    inline operator bool() const { return (m_id < m_end); }
+
+  protected:
+    const Scalar* m_values;
+    const Index* m_indices;
+    const Index m_outer;
+    Index m_id;
+    Index m_end;
+};
+
+template<typename Scalar, int _Options, typename _Index>
+class SparseMatrix<Scalar,_Options,_Index>::ReverseInnerIterator
+{
+  public:
+    ReverseInnerIterator(const SparseMatrix& mat, Index outer)
+      : m_values(mat.valuePtr()), m_indices(mat.innerIndexPtr()), m_outer(outer), m_start(mat.m_outerIndex[outer])
+    {
+      if(mat.isCompressed())
+        m_id = mat.m_outerIndex[outer+1];
+      else
+        m_id = m_start + mat.m_innerNonZeros[outer];
+    }
+
+    inline ReverseInnerIterator& operator--() { --m_id; return *this; }
+
+    inline const Scalar& value() const { return m_values[m_id-1]; }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_values[m_id-1]); }
+
+    inline Index index() const { return m_indices[m_id-1]; }
+    inline Index outer() const { return m_outer; }
+    inline Index row() const { return IsRowMajor ? m_outer : index(); }
+    inline Index col() const { return IsRowMajor ? index() : m_outer; }
+
+    inline operator bool() const { return (m_id > m_start); }
+
+  protected:
+    const Scalar* m_values;
+    const Index* m_indices;
+    const Index m_outer;
+    Index m_id;
+    const Index m_start;
+};
+
+namespace internal {
+
+template<typename InputIterator, typename SparseMatrixType>
+void set_from_triplets(const InputIterator& begin, const InputIterator& end, SparseMatrixType& mat, int Options = 0)
+{
+  EIGEN_UNUSED_VARIABLE(Options);
+  enum { IsRowMajor = SparseMatrixType::IsRowMajor };
+  typedef typename SparseMatrixType::Scalar Scalar;
+  SparseMatrix<Scalar,IsRowMajor?ColMajor:RowMajor> trMat(mat.rows(),mat.cols());
+
+  // pass 1: count the nnz per inner-vector
+  VectorXi wi(trMat.outerSize());
+  wi.setZero();
+  for(InputIterator it(begin); it!=end; ++it)
+    wi(IsRowMajor ? it->col() : it->row())++;
+
+  // pass 2: insert all the elements into trMat
+  trMat.reserve(wi);
+  for(InputIterator it(begin); it!=end; ++it)
+    trMat.insertBackUncompressed(it->row(),it->col()) = it->value();
+
+  // pass 3:
+  trMat.sumupDuplicates();
+
+  // pass 4: transposed copy -> implicit sorting
+  mat = trMat;
+}
+
+}
+
+
+/** Fill the matrix \c *this with the list of \em triplets defined by the iterator range \a begin - \a end.
+  *
+  * A \em triplet is a tuple (i,j,value) defining a non-zero element.
+  * The input list of triplets does not have to be sorted, and can contains duplicated elements.
+  * In any case, the result is a \b sorted and \b compressed sparse matrix where the duplicates have been summed up.
+  * This is a \em O(n) operation, with \em n the number of triplet elements.
+  * The initial contents of \c *this is destroyed.
+  * The matrix \c *this must be properly resized beforehand using the SparseMatrix(Index,Index) constructor,
+  * or the resize(Index,Index) method. The sizes are not extracted from the triplet list.
+  *
+  * The \a InputIterators value_type must provide the following interface:
+  * \code
+  * Scalar value() const; // the value
+  * Scalar row() const;   // the row index i
+  * Scalar col() const;   // the column index j
+  * \endcode
+  * See for instance the Eigen::Triplet template class.
+  *
+  * Here is a typical usage example:
+  * \code
+    typedef Triplet<double> T;
+    std::vector<T> tripletList;
+    triplets.reserve(estimation_of_entries);
+    for(...)
+    {
+      // ...
+      tripletList.push_back(T(i,j,v_ij));
+    }
+    SparseMatrixType m(rows,cols);
+    m.setFromTriplets(tripletList.begin(), tripletList.end());
+    // m is ready to go!
+  * \endcode
+  *
+  * \warning The list of triplets is read multiple times (at least twice). Therefore, it is not recommended to define
+  * an abstract iterator over a complex data-structure that would be expensive to evaluate. The triplets should rather
+  * be explicitely stored into a std::vector for instance.
+  */
+template<typename Scalar, int _Options, typename _Index>
+template<typename InputIterators>
+void SparseMatrix<Scalar,_Options,_Index>::setFromTriplets(const InputIterators& begin, const InputIterators& end)
+{
+  internal::set_from_triplets(begin, end, *this);
+}
+
+/** \internal */
+template<typename Scalar, int _Options, typename _Index>
+void SparseMatrix<Scalar,_Options,_Index>::sumupDuplicates()
+{
+  eigen_assert(!isCompressed());
+  // TODO, in practice we should be able to use m_innerNonZeros for that task
+  VectorXi wi(innerSize());
+  wi.fill(-1);
+  Index count = 0;
+  // for each inner-vector, wi[inner_index] will hold the position of first element into the index/value buffers
+  for(int j=0; j<outerSize(); ++j)
+  {
+    Index start   = count;
+    Index oldEnd  = m_outerIndex[j]+m_innerNonZeros[j];
+    for(Index k=m_outerIndex[j]; k<oldEnd; ++k)
+    {
+      Index i = m_data.index(k);
+      if(wi(i)>=start)
+      {
+        // we already meet this entry => accumulate it
+        m_data.value(wi(i)) += m_data.value(k);
+      }
+      else
+      {
+        m_data.value(count) = m_data.value(k);
+        m_data.index(count) = m_data.index(k);
+        wi(i) = count;
+        ++count;
+      }
+    }
+    m_outerIndex[j] = start;
+  }
+  m_outerIndex[m_outerSize] = count;
+
+  // turn the matrix into compressed form
+  std::free(m_innerNonZeros);
+  m_innerNonZeros = 0;
+  m_data.resize(m_outerIndex[m_outerSize]);
+}
+
+template<typename Scalar, int _Options, typename _Index>
+template<typename OtherDerived>
+EIGEN_DONT_INLINE SparseMatrix<Scalar,_Options,_Index>& SparseMatrix<Scalar,_Options,_Index>::operator=(const SparseMatrixBase<OtherDerived>& other)
+{
+  const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
+  if (needToTranspose)
+  {
+    // two passes algorithm:
+    //  1 - compute the number of coeffs per dest inner vector
+    //  2 - do the actual copy/eval
+    // Since each coeff of the rhs has to be evaluated twice, let's evaluate it if needed
+    typedef typename internal::nested<OtherDerived,2>::type OtherCopy;
+    typedef typename internal::remove_all<OtherCopy>::type _OtherCopy;
+    OtherCopy otherCopy(other.derived());
+
+    SparseMatrix dest(other.rows(),other.cols());
+    Eigen::Map<Matrix<Index, Dynamic, 1> > (dest.m_outerIndex,dest.outerSize()).setZero();
+
+    // pass 1
+    // FIXME the above copy could be merged with that pass
+    for (Index j=0; j<otherCopy.outerSize(); ++j)
+      for (typename _OtherCopy::InnerIterator it(otherCopy, j); it; ++it)
+        ++dest.m_outerIndex[it.index()];
+
+    // prefix sum
+    Index count = 0;
+    VectorXi positions(dest.outerSize());
+    for (Index j=0; j<dest.outerSize(); ++j)
+    {
+      Index tmp = dest.m_outerIndex[j];
+      dest.m_outerIndex[j] = count;
+      positions[j] = count;
+      count += tmp;
+    }
+    dest.m_outerIndex[dest.outerSize()] = count;
+    // alloc
+    dest.m_data.resize(count);
+    // pass 2
+    for (Index j=0; j<otherCopy.outerSize(); ++j)
+    {
+      for (typename _OtherCopy::InnerIterator it(otherCopy, j); it; ++it)
+      {
+        Index pos = positions[it.index()]++;
+        dest.m_data.index(pos) = j;
+        dest.m_data.value(pos) = it.value();
+      }
+    }
+    this->swap(dest);
+    return *this;
+  }
+  else
+  {
+    if(other.isRValue())
+      initAssignment(other.derived());
+    // there is no special optimization
+    return Base::operator=(other.derived());
+  }
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+EIGEN_DONT_INLINE typename SparseMatrix<_Scalar,_Options,_Index>::Scalar& SparseMatrix<_Scalar,_Options,_Index>::insertUncompressed(Index row, Index col)
+{
+  eigen_assert(!isCompressed());
+
+  const Index outer = IsRowMajor ? row : col;
+  const Index inner = IsRowMajor ? col : row;
+
+  Index room = m_outerIndex[outer+1] - m_outerIndex[outer];
+  Index innerNNZ = m_innerNonZeros[outer];
+  if(innerNNZ>=room)
+  {
+    // this inner vector is full, we need to reallocate the whole buffer :(
+    reserve(SingletonVector(outer,std::max<Index>(2,innerNNZ)));
+  }
+
+  Index startId = m_outerIndex[outer];
+  Index p = startId + m_innerNonZeros[outer];
+  while ( (p > startId) && (m_data.index(p-1) > inner) )
+  {
+    m_data.index(p) = m_data.index(p-1);
+    m_data.value(p) = m_data.value(p-1);
+    --p;
+  }
+  eigen_assert((p<=startId || m_data.index(p-1)!=inner) && "you cannot insert an element that already exist, you must call coeffRef to this end");
+
+  m_innerNonZeros[outer]++;
+
+  m_data.index(p) = inner;
+  return (m_data.value(p) = 0);
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+EIGEN_DONT_INLINE typename SparseMatrix<_Scalar,_Options,_Index>::Scalar& SparseMatrix<_Scalar,_Options,_Index>::insertCompressed(Index row, Index col)
+{
+  eigen_assert(isCompressed());
+
+  const Index outer = IsRowMajor ? row : col;
+  const Index inner = IsRowMajor ? col : row;
+
+  Index previousOuter = outer;
+  if (m_outerIndex[outer+1]==0)
+  {
+    // we start a new inner vector
+    while (previousOuter>=0 && m_outerIndex[previousOuter]==0)
+    {
+      m_outerIndex[previousOuter] = static_cast<Index>(m_data.size());
+      --previousOuter;
+    }
+    m_outerIndex[outer+1] = m_outerIndex[outer];
+  }
+
+  // here we have to handle the tricky case where the outerIndex array
+  // starts with: [ 0 0 0 0 0 1 ...] and we are inserted in, e.g.,
+  // the 2nd inner vector...
+  bool isLastVec = (!(previousOuter==-1 && m_data.size()!=0))
+                && (size_t(m_outerIndex[outer+1]) == m_data.size());
+
+  size_t startId = m_outerIndex[outer];
+  // FIXME let's make sure sizeof(long int) == sizeof(size_t)
+  size_t p = m_outerIndex[outer+1];
+  ++m_outerIndex[outer+1];
+
+  float reallocRatio = 1;
+  if (m_data.allocatedSize()<=m_data.size())
+  {
+    // if there is no preallocated memory, let's reserve a minimum of 32 elements
+    if (m_data.size()==0)
+    {
+      m_data.reserve(32);
+    }
+    else
+    {
+      // we need to reallocate the data, to reduce multiple reallocations
+      // we use a smart resize algorithm based on the current filling ratio
+      // in addition, we use float to avoid integers overflows
+      float nnzEstimate = float(m_outerIndex[outer])*float(m_outerSize)/float(outer+1);
+      reallocRatio = (nnzEstimate-float(m_data.size()))/float(m_data.size());
+      // furthermore we bound the realloc ratio to:
+      //   1) reduce multiple minor realloc when the matrix is almost filled
+      //   2) avoid to allocate too much memory when the matrix is almost empty
+      reallocRatio = (std::min)((std::max)(reallocRatio,1.5f),8.f);
+    }
+  }
+  m_data.resize(m_data.size()+1,reallocRatio);
+
+  if (!isLastVec)
+  {
+    if (previousOuter==-1)
+    {
+      // oops wrong guess.
+      // let's correct the outer offsets
+      for (Index k=0; k<=(outer+1); ++k)
+        m_outerIndex[k] = 0;
+      Index k=outer+1;
+      while(m_outerIndex[k]==0)
+        m_outerIndex[k++] = 1;
+      while (k<=m_outerSize && m_outerIndex[k]!=0)
+        m_outerIndex[k++]++;
+      p = 0;
+      --k;
+      k = m_outerIndex[k]-1;
+      while (k>0)
+      {
+        m_data.index(k) = m_data.index(k-1);
+        m_data.value(k) = m_data.value(k-1);
+        k--;
+      }
+    }
+    else
+    {
+      // we are not inserting into the last inner vec
+      // update outer indices:
+      Index j = outer+2;
+      while (j<=m_outerSize && m_outerIndex[j]!=0)
+        m_outerIndex[j++]++;
+      --j;
+      // shift data of last vecs:
+      Index k = m_outerIndex[j]-1;
+      while (k>=Index(p))
+      {
+        m_data.index(k) = m_data.index(k-1);
+        m_data.value(k) = m_data.value(k-1);
+        k--;
+      }
+    }
+  }
+
+  while ( (p > startId) && (m_data.index(p-1) > inner) )
+  {
+    m_data.index(p) = m_data.index(p-1);
+    m_data.value(p) = m_data.value(p-1);
+    --p;
+  }
+
+  m_data.index(p) = inner;
+  return (m_data.value(p) = 0);
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEMATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrixBase.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrixBase.h
new file mode 100644
index 0000000..5903396
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseMatrixBase.h
@@ -0,0 +1,448 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEMATRIXBASE_H
+#define EIGEN_SPARSEMATRIXBASE_H
+
+namespace Eigen { 
+
+/** \ingroup SparseCore_Module
+  *
+  * \class SparseMatrixBase
+  *
+  * \brief Base class of any sparse matrices or sparse expressions
+  *
+  * \tparam Derived
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_SPARSEMATRIXBASE_PLUGIN.
+  */
+template<typename Derived> class SparseMatrixBase : public EigenBase<Derived>
+{
+  public:
+
+    typedef typename internal::traits<Derived>::Scalar Scalar;
+    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
+    typedef typename internal::traits<Derived>::StorageKind StorageKind;
+    typedef typename internal::traits<Derived>::Index Index;
+    typedef typename internal::add_const_on_value_type_if_arithmetic<
+                         typename internal::packet_traits<Scalar>::type
+                     >::type PacketReturnType;
+
+    typedef SparseMatrixBase StorageBaseType;
+    typedef EigenBase<Derived> Base;
+    
+    template<typename OtherDerived>
+    Derived& operator=(const EigenBase<OtherDerived> &other)
+    {
+      other.derived().evalTo(derived());
+      return derived();
+    }
+
+    enum {
+
+      RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime,
+        /**< The number of rows at compile-time. This is just a copy of the value provided
+          * by the \a Derived type. If a value is not known at compile-time,
+          * it is set to the \a Dynamic constant.
+          * \sa MatrixBase::rows(), MatrixBase::cols(), ColsAtCompileTime, SizeAtCompileTime */
+
+      ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime,
+        /**< The number of columns at compile-time. This is just a copy of the value provided
+          * by the \a Derived type. If a value is not known at compile-time,
+          * it is set to the \a Dynamic constant.
+          * \sa MatrixBase::rows(), MatrixBase::cols(), RowsAtCompileTime, SizeAtCompileTime */
+
+
+      SizeAtCompileTime = (internal::size_at_compile_time<internal::traits<Derived>::RowsAtCompileTime,
+                                                   internal::traits<Derived>::ColsAtCompileTime>::ret),
+        /**< This is equal to the number of coefficients, i.e. the number of
+          * rows times the number of columns, or to \a Dynamic if this is not
+          * known at compile-time. \sa RowsAtCompileTime, ColsAtCompileTime */
+
+      MaxRowsAtCompileTime = RowsAtCompileTime,
+      MaxColsAtCompileTime = ColsAtCompileTime,
+
+      MaxSizeAtCompileTime = (internal::size_at_compile_time<MaxRowsAtCompileTime,
+                                                      MaxColsAtCompileTime>::ret),
+
+      IsVectorAtCompileTime = RowsAtCompileTime == 1 || ColsAtCompileTime == 1,
+        /**< This is set to true if either the number of rows or the number of
+          * columns is known at compile-time to be equal to 1. Indeed, in that case,
+          * we are dealing with a column-vector (if there is only one column) or with
+          * a row-vector (if there is only one row). */
+
+      Flags = internal::traits<Derived>::Flags,
+        /**< This stores expression \ref flags flags which may or may not be inherited by new expressions
+          * constructed from this one. See the \ref flags "list of flags".
+          */
+
+      CoeffReadCost = internal::traits<Derived>::CoeffReadCost,
+        /**< This is a rough measure of how expensive it is to read one coefficient from
+          * this expression.
+          */
+
+      IsRowMajor = Flags&RowMajorBit ? 1 : 0,
+
+      #ifndef EIGEN_PARSED_BY_DOXYGEN
+      _HasDirectAccess = (int(Flags)&DirectAccessBit) ? 1 : 0 // workaround sunCC
+      #endif
+    };
+
+    /** \internal the return type of MatrixBase::adjoint() */
+    typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+                        CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, Eigen::Transpose<const Derived> >,
+                        Transpose<const Derived>
+                     >::type AdjointReturnType;
+
+
+    typedef SparseMatrix<Scalar, Flags&RowMajorBit ? RowMajor : ColMajor> PlainObject;
+
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** This is the "real scalar" type; if the \a Scalar type is already real numbers
+      * (e.g. int, float or double) then \a RealScalar is just the same as \a Scalar. If
+      * \a Scalar is \a std::complex<T> then RealScalar is \a T.
+      *
+      * \sa class NumTraits
+      */
+    typedef typename NumTraits<Scalar>::Real RealScalar;
+
+    /** \internal the return type of coeff()
+      */
+    typedef typename internal::conditional<_HasDirectAccess, const Scalar&, Scalar>::type CoeffReturnType;
+
+    /** \internal Represents a matrix with all coefficients equal to one another*/
+    typedef CwiseNullaryOp<internal::scalar_constant_op<Scalar>,Matrix<Scalar,Dynamic,Dynamic> > ConstantReturnType;
+
+    /** type of the equivalent square matrix */
+    typedef Matrix<Scalar,EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime),
+                          EIGEN_SIZE_MAX(RowsAtCompileTime,ColsAtCompileTime)> SquareMatrixType;
+
+    inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    inline Derived& derived() { return *static_cast<Derived*>(this); }
+    inline Derived& const_cast_derived() const
+    { return *static_cast<Derived*>(const_cast<SparseMatrixBase*>(this)); }
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+#define EIGEN_CURRENT_STORAGE_BASE_CLASS Eigen::SparseMatrixBase
+#   include "../plugins/CommonCwiseUnaryOps.h"
+#   include "../plugins/CommonCwiseBinaryOps.h"
+#   include "../plugins/MatrixCwiseUnaryOps.h"
+#   include "../plugins/MatrixCwiseBinaryOps.h"
+#   include "../plugins/BlockMethods.h"
+#   ifdef EIGEN_SPARSEMATRIXBASE_PLUGIN
+#     include EIGEN_SPARSEMATRIXBASE_PLUGIN
+#   endif
+#   undef EIGEN_CURRENT_STORAGE_BASE_CLASS
+#undef EIGEN_CURRENT_STORAGE_BASE_CLASS
+
+    /** \returns the number of rows. \sa cols() */
+    inline Index rows() const { return derived().rows(); }
+    /** \returns the number of columns. \sa rows() */
+    inline Index cols() const { return derived().cols(); }
+    /** \returns the number of coefficients, which is \a rows()*cols().
+      * \sa rows(), cols(). */
+    inline Index size() const { return rows() * cols(); }
+    /** \returns the number of nonzero coefficients which is in practice the number
+      * of stored coefficients. */
+    inline Index nonZeros() const { return derived().nonZeros(); }
+    /** \returns true if either the number of rows or the number of columns is equal to 1.
+      * In other words, this function returns
+      * \code rows()==1 || cols()==1 \endcode
+      * \sa rows(), cols(), IsVectorAtCompileTime. */
+    inline bool isVector() const { return rows()==1 || cols()==1; }
+    /** \returns the size of the storage major dimension,
+      * i.e., the number of columns for a columns major matrix, and the number of rows otherwise */
+    Index outerSize() const { return (int(Flags)&RowMajorBit) ? this->rows() : this->cols(); }
+    /** \returns the size of the inner dimension according to the storage order,
+      * i.e., the number of rows for a columns major matrix, and the number of cols otherwise */
+    Index innerSize() const { return (int(Flags)&RowMajorBit) ? this->cols() : this->rows(); }
+
+    bool isRValue() const { return m_isRValue; }
+    Derived& markAsRValue() { m_isRValue = true; return derived(); }
+
+    SparseMatrixBase() : m_isRValue(false) { /* TODO check flags */ }
+
+    
+    template<typename OtherDerived>
+    Derived& operator=(const ReturnByValue<OtherDerived>& other)
+    {
+      other.evalTo(derived());
+      return derived();
+    }
+
+
+    template<typename OtherDerived>
+    inline Derived& operator=(const SparseMatrixBase<OtherDerived>& other)
+    {
+      return assign(other.derived());
+    }
+
+    inline Derived& operator=(const Derived& other)
+    {
+//       if (other.isRValue())
+//         derived().swap(other.const_cast_derived());
+//       else
+      return assign(other.derived());
+    }
+
+  protected:
+
+    template<typename OtherDerived>
+    inline Derived& assign(const OtherDerived& other)
+    {
+      const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
+      const Index outerSize = (int(OtherDerived::Flags) & RowMajorBit) ? other.rows() : other.cols();
+      if ((!transpose) && other.isRValue())
+      {
+        // eval without temporary
+        derived().resize(other.rows(), other.cols());
+        derived().setZero();
+        derived().reserve((std::max)(this->rows(),this->cols())*2);
+        for (Index j=0; j<outerSize; ++j)
+        {
+          derived().startVec(j);
+          for (typename OtherDerived::InnerIterator it(other, j); it; ++it)
+          {
+            Scalar v = it.value();
+            derived().insertBackByOuterInner(j,it.index()) = v;
+          }
+        }
+        derived().finalize();
+      }
+      else
+      {
+        assignGeneric(other);
+      }
+      return derived();
+    }
+
+    template<typename OtherDerived>
+    inline void assignGeneric(const OtherDerived& other)
+    {
+      //const bool transpose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
+      eigen_assert(( ((internal::traits<Derived>::SupportedAccessPatterns&OuterRandomAccessPattern)==OuterRandomAccessPattern) ||
+                  (!((Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit)))) &&
+                  "the transpose operation is supposed to be handled in SparseMatrix::operator=");
+
+      enum { Flip = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit) };
+
+      const Index outerSize = other.outerSize();
+      //typedef typename internal::conditional<transpose, LinkedVectorMatrix<Scalar,Flags&RowMajorBit>, Derived>::type TempType;
+      // thanks to shallow copies, we always eval to a tempary
+      Derived temp(other.rows(), other.cols());
+
+      temp.reserve((std::max)(this->rows(),this->cols())*2);
+      for (Index j=0; j<outerSize; ++j)
+      {
+        temp.startVec(j);
+        for (typename OtherDerived::InnerIterator it(other.derived(), j); it; ++it)
+        {
+          Scalar v = it.value();
+          temp.insertBackByOuterInner(Flip?it.index():j,Flip?j:it.index()) = v;
+        }
+      }
+      temp.finalize();
+
+      derived() = temp.markAsRValue();
+    }
+
+  public:
+
+    template<typename Lhs, typename Rhs>
+    inline Derived& operator=(const SparseSparseProduct<Lhs,Rhs>& product);
+
+    friend std::ostream & operator << (std::ostream & s, const SparseMatrixBase& m)
+    {
+      typedef typename Derived::Nested Nested;
+      typedef typename internal::remove_all<Nested>::type NestedCleaned;
+
+      if (Flags&RowMajorBit)
+      {
+        const Nested nm(m.derived());
+        for (Index row=0; row<nm.outerSize(); ++row)
+        {
+          Index col = 0;
+          for (typename NestedCleaned::InnerIterator it(nm.derived(), row); it; ++it)
+          {
+            for ( ; col<it.index(); ++col)
+              s << "0 ";
+            s << it.value() << " ";
+            ++col;
+          }
+          for ( ; col<m.cols(); ++col)
+            s << "0 ";
+          s << std::endl;
+        }
+      }
+      else
+      {
+        const Nested nm(m.derived());
+        if (m.cols() == 1) {
+          Index row = 0;
+          for (typename NestedCleaned::InnerIterator it(nm.derived(), 0); it; ++it)
+          {
+            for ( ; row<it.index(); ++row)
+              s << "0" << std::endl;
+            s << it.value() << std::endl;
+            ++row;
+          }
+          for ( ; row<m.rows(); ++row)
+            s << "0" << std::endl;
+        }
+        else
+        {
+          SparseMatrix<Scalar, RowMajorBit> trans = m;
+          s << static_cast<const SparseMatrixBase<SparseMatrix<Scalar, RowMajorBit> >&>(trans);
+        }
+      }
+      return s;
+    }
+
+    template<typename OtherDerived>
+    Derived& operator+=(const SparseMatrixBase<OtherDerived>& other);
+    template<typename OtherDerived>
+    Derived& operator-=(const SparseMatrixBase<OtherDerived>& other);
+
+    Derived& operator*=(const Scalar& other);
+    Derived& operator/=(const Scalar& other);
+
+    #define EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE \
+      CwiseBinaryOp< \
+        internal::scalar_product_op< \
+          typename internal::scalar_product_traits< \
+            typename internal::traits<Derived>::Scalar, \
+            typename internal::traits<OtherDerived>::Scalar \
+          >::ReturnType \
+        >, \
+        Derived, \
+        OtherDerived \
+      >
+
+    template<typename OtherDerived>
+    EIGEN_STRONG_INLINE const EIGEN_SPARSE_CWISE_PRODUCT_RETURN_TYPE
+    cwiseProduct(const MatrixBase<OtherDerived> &other) const;
+
+    // sparse * sparse
+    template<typename OtherDerived>
+    const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type
+    operator*(const SparseMatrixBase<OtherDerived> &other) const;
+
+    // sparse * diagonal
+    template<typename OtherDerived>
+    const SparseDiagonalProduct<Derived,OtherDerived>
+    operator*(const DiagonalBase<OtherDerived> &other) const;
+
+    // diagonal * sparse
+    template<typename OtherDerived> friend
+    const SparseDiagonalProduct<OtherDerived,Derived>
+    operator*(const DiagonalBase<OtherDerived> &lhs, const SparseMatrixBase& rhs)
+    { return SparseDiagonalProduct<OtherDerived,Derived>(lhs.derived(), rhs.derived()); }
+
+    /** dense * sparse (return a dense object unless it is an outer product) */
+    template<typename OtherDerived> friend
+    const typename DenseSparseProductReturnType<OtherDerived,Derived>::Type
+    operator*(const MatrixBase<OtherDerived>& lhs, const Derived& rhs)
+    { return typename DenseSparseProductReturnType<OtherDerived,Derived>::Type(lhs.derived(),rhs); }
+
+    /** sparse * dense (returns a dense object unless it is an outer product) */
+    template<typename OtherDerived>
+    const typename SparseDenseProductReturnType<Derived,OtherDerived>::Type
+    operator*(const MatrixBase<OtherDerived> &other) const;
+    
+     /** \returns an expression of P H P^-1 where H is the matrix represented by \c *this */
+    SparseSymmetricPermutationProduct<Derived,Upper|Lower> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const
+    {
+      return SparseSymmetricPermutationProduct<Derived,Upper|Lower>(derived(), perm);
+    }
+
+    template<typename OtherDerived>
+    Derived& operator*=(const SparseMatrixBase<OtherDerived>& other);
+
+    #ifdef EIGEN2_SUPPORT
+    // deprecated
+    template<typename OtherDerived>
+    typename internal::plain_matrix_type_column_major<OtherDerived>::type
+    solveTriangular(const MatrixBase<OtherDerived>& other) const;
+
+    // deprecated
+    template<typename OtherDerived>
+    void solveTriangularInPlace(MatrixBase<OtherDerived>& other) const;
+    #endif // EIGEN2_SUPPORT
+
+    template<int Mode>
+    inline const SparseTriangularView<Derived, Mode> triangularView() const;
+
+    template<unsigned int UpLo> inline const SparseSelfAdjointView<Derived, UpLo> selfadjointView() const;
+    template<unsigned int UpLo> inline SparseSelfAdjointView<Derived, UpLo> selfadjointView();
+
+    template<typename OtherDerived> Scalar dot(const MatrixBase<OtherDerived>& other) const;
+    template<typename OtherDerived> Scalar dot(const SparseMatrixBase<OtherDerived>& other) const;
+    RealScalar squaredNorm() const;
+    RealScalar norm()  const;
+    RealScalar blueNorm() const;
+
+    Transpose<Derived> transpose() { return derived(); }
+    const Transpose<const Derived> transpose() const { return derived(); }
+    const AdjointReturnType adjoint() const { return transpose(); }
+
+    // inner-vector
+    typedef Block<Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true>       InnerVectorReturnType;
+    typedef Block<const Derived,IsRowMajor?1:Dynamic,IsRowMajor?Dynamic:1,true> ConstInnerVectorReturnType;
+    InnerVectorReturnType innerVector(Index outer);
+    const ConstInnerVectorReturnType innerVector(Index outer) const;
+
+    // set of inner-vectors
+    Block<Derived,Dynamic,Dynamic,true> innerVectors(Index outerStart, Index outerSize);
+    const Block<const Derived,Dynamic,Dynamic,true> innerVectors(Index outerStart, Index outerSize) const;
+
+      /** \internal use operator= */
+      template<typename DenseDerived>
+      void evalTo(MatrixBase<DenseDerived>& dst) const
+      {
+        dst.setZero();
+        for (Index j=0; j<outerSize(); ++j)
+          for (typename Derived::InnerIterator i(derived(),j); i; ++i)
+            dst.coeffRef(i.row(),i.col()) = i.value();
+      }
+
+      Matrix<Scalar,RowsAtCompileTime,ColsAtCompileTime> toDense() const
+      {
+        return derived();
+      }
+
+    template<typename OtherDerived>
+    bool isApprox(const SparseMatrixBase<OtherDerived>& other,
+                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
+    { return toDense().isApprox(other.toDense(),prec); }
+
+    template<typename OtherDerived>
+    bool isApprox(const MatrixBase<OtherDerived>& other,
+                  const RealScalar& prec = NumTraits<Scalar>::dummy_precision()) const
+    { return toDense().isApprox(other,prec); }
+
+    /** \returns the matrix or vector obtained by evaluating this expression.
+      *
+      * Notice that in the case of a plain matrix or vector (not an expression) this function just returns
+      * a const reference, in order to avoid a useless copy.
+      */
+    inline const typename internal::eval<Derived>::type eval() const
+    { return typename internal::eval<Derived>::type(derived()); }
+
+    Scalar sum() const;
+
+  protected:
+
+    bool m_isRValue;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEMATRIXBASE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparsePermutation.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparsePermutation.h
new file mode 100644
index 0000000..b897b75
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparsePermutation.h
@@ -0,0 +1,148 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_PERMUTATION_H
+#define EIGEN_SPARSE_PERMUTATION_H
+
+// This file implements sparse * permutation products
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
+struct traits<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
+{
+  typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
+  typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
+  typedef typename MatrixTypeNestedCleaned::Index Index;
+  enum {
+    SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,
+    MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight
+  };
+
+  typedef typename internal::conditional<MoveOuter,
+        SparseMatrix<Scalar,SrcStorageOrder,Index>,
+        SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> >::type ReturnType;
+};
+
+template<typename PermutationType, typename MatrixType, int Side, bool Transposed>
+struct permut_sparsematrix_product_retval
+ : public ReturnByValue<permut_sparsematrix_product_retval<PermutationType, MatrixType, Side, Transposed> >
+{
+    typedef typename remove_all<typename MatrixType::Nested>::type MatrixTypeNestedCleaned;
+    typedef typename MatrixTypeNestedCleaned::Scalar Scalar;
+    typedef typename MatrixTypeNestedCleaned::Index Index;
+
+    enum {
+      SrcStorageOrder = MatrixTypeNestedCleaned::Flags&RowMajorBit ? RowMajor : ColMajor,
+      MoveOuter = SrcStorageOrder==RowMajor ? Side==OnTheLeft : Side==OnTheRight
+    };
+
+    permut_sparsematrix_product_retval(const PermutationType& perm, const MatrixType& matrix)
+      : m_permutation(perm), m_matrix(matrix)
+    {}
+
+    inline int rows() const { return m_matrix.rows(); }
+    inline int cols() const { return m_matrix.cols(); }
+
+    template<typename Dest> inline void evalTo(Dest& dst) const
+    {
+      if(MoveOuter)
+      {
+        SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
+        VectorXi sizes(m_matrix.outerSize());
+        for(Index j=0; j<m_matrix.outerSize(); ++j)
+        {
+          Index jp = m_permutation.indices().coeff(j);
+          sizes[((Side==OnTheLeft) ^ Transposed) ? jp : j] = m_matrix.innerVector(((Side==OnTheRight) ^ Transposed) ? jp : j).size();
+        }
+        tmp.reserve(sizes);
+        for(Index j=0; j<m_matrix.outerSize(); ++j)
+        {
+          Index jp = m_permutation.indices().coeff(j);
+          Index jsrc = ((Side==OnTheRight) ^ Transposed) ? jp : j;
+          Index jdst = ((Side==OnTheLeft) ^ Transposed) ? jp : j;
+          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,jsrc); it; ++it)
+            tmp.insertByOuterInner(jdst,it.index()) = it.value();
+        }
+        dst = tmp;
+      }
+      else
+      {
+        SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());
+        VectorXi sizes(tmp.outerSize());
+        sizes.setZero();
+        PermutationMatrix<Dynamic,Dynamic,Index> perm;
+        if((Side==OnTheLeft) ^ Transposed)
+          perm = m_permutation;
+        else
+          perm = m_permutation.transpose();
+
+        for(Index j=0; j<m_matrix.outerSize(); ++j)
+          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
+            sizes[perm.indices().coeff(it.index())]++;
+        tmp.reserve(sizes);
+        for(Index j=0; j<m_matrix.outerSize(); ++j)
+          for(typename MatrixTypeNestedCleaned::InnerIterator it(m_matrix,j); it; ++it)
+            tmp.insertByOuterInner(perm.indices().coeff(it.index()),j) = it.value();
+        dst = tmp;
+      }
+    }
+
+  protected:
+    const PermutationType& m_permutation;
+    typename MatrixType::Nested m_matrix;
+};
+
+}
+
+
+
+/** \returns the matrix with the permutation applied to the columns
+  */
+template<typename SparseDerived, typename PermDerived>
+inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>
+operator*(const SparseMatrixBase<SparseDerived>& matrix, const PermutationBase<PermDerived>& perm)
+{
+  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, false>(perm, matrix.derived());
+}
+
+/** \returns the matrix with the permutation applied to the rows
+  */
+template<typename SparseDerived, typename PermDerived>
+inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>
+operator*( const PermutationBase<PermDerived>& perm, const SparseMatrixBase<SparseDerived>& matrix)
+{
+  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, false>(perm, matrix.derived());
+}
+
+
+
+/** \returns the matrix with the inverse permutation applied to the columns.
+  */
+template<typename SparseDerived, typename PermDerived>
+inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>
+operator*(const SparseMatrixBase<SparseDerived>& matrix, const Transpose<PermutationBase<PermDerived> >& tperm)
+{
+  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheRight, true>(tperm.nestedPermutation(), matrix.derived());
+}
+
+/** \returns the matrix with the inverse permutation applied to the rows.
+  */
+template<typename SparseDerived, typename PermDerived>
+inline const internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>
+operator*(const Transpose<PermutationBase<PermDerived> >& tperm, const SparseMatrixBase<SparseDerived>& matrix)
+{
+  return internal::permut_sparsematrix_product_retval<PermutationBase<PermDerived>, SparseDerived, OnTheLeft, true>(tperm.nestedPermutation(), matrix.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseProduct.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseProduct.h
new file mode 100644
index 0000000..70b6480
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseProduct.h
@@ -0,0 +1,187 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEPRODUCT_H
+#define EIGEN_SPARSEPRODUCT_H
+
+namespace Eigen { 
+
+template<typename Lhs, typename Rhs>
+struct SparseSparseProductReturnType
+{
+  typedef typename internal::traits<Lhs>::Scalar Scalar;
+  enum {
+    LhsRowMajor = internal::traits<Lhs>::Flags & RowMajorBit,
+    RhsRowMajor = internal::traits<Rhs>::Flags & RowMajorBit,
+    TransposeRhs = (!LhsRowMajor) && RhsRowMajor,
+    TransposeLhs = LhsRowMajor && (!RhsRowMajor)
+  };
+
+  typedef typename internal::conditional<TransposeLhs,
+    SparseMatrix<Scalar,0>,
+    typename internal::nested<Lhs,Rhs::RowsAtCompileTime>::type>::type LhsNested;
+
+  typedef typename internal::conditional<TransposeRhs,
+    SparseMatrix<Scalar,0>,
+    typename internal::nested<Rhs,Lhs::RowsAtCompileTime>::type>::type RhsNested;
+
+  typedef SparseSparseProduct<LhsNested, RhsNested> Type;
+};
+
+namespace internal {
+template<typename LhsNested, typename RhsNested>
+struct traits<SparseSparseProduct<LhsNested, RhsNested> >
+{
+  typedef MatrixXpr XprKind;
+  // clean the nested types:
+  typedef typename remove_all<LhsNested>::type _LhsNested;
+  typedef typename remove_all<RhsNested>::type _RhsNested;
+  typedef typename _LhsNested::Scalar Scalar;
+  typedef typename promote_index_type<typename traits<_LhsNested>::Index,
+                                         typename traits<_RhsNested>::Index>::type Index;
+
+  enum {
+    LhsCoeffReadCost = _LhsNested::CoeffReadCost,
+    RhsCoeffReadCost = _RhsNested::CoeffReadCost,
+    LhsFlags = _LhsNested::Flags,
+    RhsFlags = _RhsNested::Flags,
+
+    RowsAtCompileTime    = _LhsNested::RowsAtCompileTime,
+    ColsAtCompileTime    = _RhsNested::ColsAtCompileTime,
+    MaxRowsAtCompileTime = _LhsNested::MaxRowsAtCompileTime,
+    MaxColsAtCompileTime = _RhsNested::MaxColsAtCompileTime,
+
+    InnerSize = EIGEN_SIZE_MIN_PREFER_FIXED(_LhsNested::ColsAtCompileTime, _RhsNested::RowsAtCompileTime),
+
+    EvalToRowMajor = (RhsFlags & LhsFlags & RowMajorBit),
+
+    RemovedBits = ~(EvalToRowMajor ? 0 : RowMajorBit),
+
+    Flags = (int(LhsFlags | RhsFlags) & HereditaryBits & RemovedBits)
+          | EvalBeforeAssigningBit
+          | EvalBeforeNestingBit,
+
+    CoeffReadCost = Dynamic
+  };
+
+  typedef Sparse StorageKind;
+};
+
+} // end namespace internal
+
+template<typename LhsNested, typename RhsNested>
+class SparseSparseProduct : internal::no_assignment_operator,
+  public SparseMatrixBase<SparseSparseProduct<LhsNested, RhsNested> >
+{
+  public:
+
+    typedef SparseMatrixBase<SparseSparseProduct> Base;
+    EIGEN_DENSE_PUBLIC_INTERFACE(SparseSparseProduct)
+
+  private:
+
+    typedef typename internal::traits<SparseSparseProduct>::_LhsNested _LhsNested;
+    typedef typename internal::traits<SparseSparseProduct>::_RhsNested _RhsNested;
+
+  public:
+
+    template<typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs)
+      : m_lhs(lhs), m_rhs(rhs), m_tolerance(0), m_conservative(true)
+    {
+      init();
+    }
+
+    template<typename Lhs, typename Rhs>
+    EIGEN_STRONG_INLINE SparseSparseProduct(const Lhs& lhs, const Rhs& rhs, const RealScalar& tolerance)
+      : m_lhs(lhs), m_rhs(rhs), m_tolerance(tolerance), m_conservative(false)
+    {
+      init();
+    }
+
+    SparseSparseProduct pruned(const Scalar& reference = 0, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision()) const
+    {
+      using std::abs;
+      return SparseSparseProduct(m_lhs,m_rhs,abs(reference)*epsilon);
+    }
+
+    template<typename Dest>
+    void evalTo(Dest& result) const
+    {
+      if(m_conservative)
+        internal::conservative_sparse_sparse_product_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result);
+      else
+        internal::sparse_sparse_product_with_pruning_selector<_LhsNested, _RhsNested, Dest>::run(lhs(),rhs(),result,m_tolerance);
+    }
+
+    EIGEN_STRONG_INLINE Index rows() const { return m_lhs.rows(); }
+    EIGEN_STRONG_INLINE Index cols() const { return m_rhs.cols(); }
+
+    EIGEN_STRONG_INLINE const _LhsNested& lhs() const { return m_lhs; }
+    EIGEN_STRONG_INLINE const _RhsNested& rhs() const { return m_rhs; }
+
+  protected:
+    void init()
+    {
+      eigen_assert(m_lhs.cols() == m_rhs.rows());
+
+      enum {
+        ProductIsValid = _LhsNested::ColsAtCompileTime==Dynamic
+                      || _RhsNested::RowsAtCompileTime==Dynamic
+                      || int(_LhsNested::ColsAtCompileTime)==int(_RhsNested::RowsAtCompileTime),
+        AreVectors = _LhsNested::IsVectorAtCompileTime && _RhsNested::IsVectorAtCompileTime,
+        SameSizes = EIGEN_PREDICATE_SAME_MATRIX_SIZE(_LhsNested,_RhsNested)
+      };
+      // note to the lost user:
+      //    * for a dot product use: v1.dot(v2)
+      //    * for a coeff-wise product use: v1.cwise()*v2
+      EIGEN_STATIC_ASSERT(ProductIsValid || !(AreVectors && SameSizes),
+        INVALID_VECTOR_VECTOR_PRODUCT__IF_YOU_WANTED_A_DOT_OR_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTIONS)
+      EIGEN_STATIC_ASSERT(ProductIsValid || !(SameSizes && !AreVectors),
+        INVALID_MATRIX_PRODUCT__IF_YOU_WANTED_A_COEFF_WISE_PRODUCT_YOU_MUST_USE_THE_EXPLICIT_FUNCTION)
+      EIGEN_STATIC_ASSERT(ProductIsValid || SameSizes, INVALID_MATRIX_PRODUCT)
+    }
+
+    LhsNested m_lhs;
+    RhsNested m_rhs;
+    RealScalar m_tolerance;
+    bool m_conservative;
+};
+
+// sparse = sparse * sparse
+template<typename Derived>
+template<typename Lhs, typename Rhs>
+inline Derived& SparseMatrixBase<Derived>::operator=(const SparseSparseProduct<Lhs,Rhs>& product)
+{
+  product.evalTo(derived());
+  return derived();
+}
+
+/** \returns an expression of the product of two sparse matrices.
+  * By default a conservative product preserving the symbolic non zeros is performed.
+  * The automatic pruning of the small values can be achieved by calling the pruned() function
+  * in which case a totally different product algorithm is employed:
+  * \code
+  * C = (A*B).pruned();             // supress numerical zeros (exact)
+  * C = (A*B).pruned(ref);
+  * C = (A*B).pruned(ref,epsilon);
+  * \endcode
+  * where \c ref is a meaningful non zero reference value.
+  * */
+template<typename Derived>
+template<typename OtherDerived>
+inline const typename SparseSparseProductReturnType<Derived,OtherDerived>::Type
+SparseMatrixBase<Derived>::operator*(const SparseMatrixBase<OtherDerived> &other) const
+{
+  return typename SparseSparseProductReturnType<Derived,OtherDerived>::Type(derived(), other.derived());
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEPRODUCT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseRedux.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseRedux.h
new file mode 100644
index 0000000..f3da93a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseRedux.h
@@ -0,0 +1,45 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEREDUX_H
+#define EIGEN_SPARSEREDUX_H
+
+namespace Eigen { 
+
+template<typename Derived>
+typename internal::traits<Derived>::Scalar
+SparseMatrixBase<Derived>::sum() const
+{
+  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
+  Scalar res(0);
+  for (Index j=0; j<outerSize(); ++j)
+    for (typename Derived::InnerIterator iter(derived(),j); iter; ++iter)
+      res += iter.value();
+  return res;
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+typename internal::traits<SparseMatrix<_Scalar,_Options,_Index> >::Scalar
+SparseMatrix<_Scalar,_Options,_Index>::sum() const
+{
+  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
+  return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum();
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+typename internal::traits<SparseVector<_Scalar,_Options, _Index> >::Scalar
+SparseVector<_Scalar,_Options,_Index>::sum() const
+{
+  eigen_assert(rows()>0 && cols()>0 && "you are using a non initialized matrix");
+  return Matrix<Scalar,1,Dynamic>::Map(&m_data.value(0), m_data.size()).sum();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEREDUX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSelfAdjointView.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSelfAdjointView.h
new file mode 100644
index 0000000..9630b60
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSelfAdjointView.h
@@ -0,0 +1,480 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_SELFADJOINTVIEW_H
+#define EIGEN_SPARSE_SELFADJOINTVIEW_H
+
+namespace Eigen { 
+
+/** \ingroup SparseCore_Module
+  * \class SparseSelfAdjointView
+  *
+  * \brief Pseudo expression to manipulate a triangular sparse matrix as a selfadjoint matrix.
+  *
+  * \param MatrixType the type of the dense matrix storing the coefficients
+  * \param UpLo can be either \c #Lower or \c #Upper
+  *
+  * This class is an expression of a sefladjoint matrix from a triangular part of a matrix
+  * with given dense storage of the coefficients. It is the return type of MatrixBase::selfadjointView()
+  * and most of the time this is the only way that it is used.
+  *
+  * \sa SparseMatrixBase::selfadjointView()
+  */
+template<typename Lhs, typename Rhs, int UpLo>
+class SparseSelfAdjointTimeDenseProduct;
+
+template<typename Lhs, typename Rhs, int UpLo>
+class DenseTimeSparseSelfAdjointProduct;
+
+namespace internal {
+  
+template<typename MatrixType, unsigned int UpLo>
+struct traits<SparseSelfAdjointView<MatrixType,UpLo> > : traits<MatrixType> {
+};
+
+template<int SrcUpLo,int DstUpLo,typename MatrixType,int DestOrder>
+void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);
+
+template<int UpLo,typename MatrixType,int DestOrder>
+void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm = 0);
+
+}
+
+template<typename MatrixType, unsigned int UpLo> class SparseSelfAdjointView
+  : public EigenBase<SparseSelfAdjointView<MatrixType,UpLo> >
+{
+  public:
+
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Index,Dynamic,1> VectorI;
+    typedef typename MatrixType::Nested MatrixTypeNested;
+    typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
+
+    inline SparseSelfAdjointView(const MatrixType& matrix) : m_matrix(matrix)
+    {
+      eigen_assert(rows()==cols() && "SelfAdjointView is only for squared matrices");
+    }
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    /** \internal \returns a reference to the nested matrix */
+    const _MatrixTypeNested& matrix() const { return m_matrix; }
+    _MatrixTypeNested& matrix() { return m_matrix.const_cast_derived(); }
+
+    /** Efficient sparse self-adjoint matrix times dense vector/matrix product */
+    template<typename OtherDerived>
+    SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>
+    operator*(const MatrixBase<OtherDerived>& rhs) const
+    {
+      return SparseSelfAdjointTimeDenseProduct<MatrixType,OtherDerived,UpLo>(m_matrix, rhs.derived());
+    }
+
+    /** Efficient dense vector/matrix times sparse self-adjoint matrix product */
+    template<typename OtherDerived> friend
+    DenseTimeSparseSelfAdjointProduct<OtherDerived,MatrixType,UpLo>
+    operator*(const MatrixBase<OtherDerived>& lhs, const SparseSelfAdjointView& rhs)
+    {
+      return DenseTimeSparseSelfAdjointProduct<OtherDerived,_MatrixTypeNested,UpLo>(lhs.derived(), rhs.m_matrix);
+    }
+
+    /** Perform a symmetric rank K update of the selfadjoint matrix \c *this:
+      * \f$ this = this + \alpha ( u u^* ) \f$ where \a u is a vector or matrix.
+      *
+      * \returns a reference to \c *this
+      *
+      * To perform \f$ this = this + \alpha ( u^* u ) \f$ you can simply
+      * call this function with u.adjoint().
+      */
+    template<typename DerivedU>
+    SparseSelfAdjointView& rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha = Scalar(1));
+    
+    /** \internal triggered by sparse_matrix = SparseSelfadjointView; */
+    template<typename DestScalar,int StorageOrder> void evalTo(SparseMatrix<DestScalar,StorageOrder,Index>& _dest) const
+    {
+      internal::permute_symm_to_fullsymm<UpLo>(m_matrix, _dest);
+    }
+    
+    template<typename DestScalar> void evalTo(DynamicSparseMatrix<DestScalar,ColMajor,Index>& _dest) const
+    {
+      // TODO directly evaluate into _dest;
+      SparseMatrix<DestScalar,ColMajor,Index> tmp(_dest.rows(),_dest.cols());
+      internal::permute_symm_to_fullsymm<UpLo>(m_matrix, tmp);
+      _dest = tmp;
+    }
+    
+    /** \returns an expression of P H P^-1 */
+    SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo> twistedBy(const PermutationMatrix<Dynamic,Dynamic,Index>& perm) const
+    {
+      return SparseSymmetricPermutationProduct<_MatrixTypeNested,UpLo>(m_matrix, perm);
+    }
+    
+    template<typename SrcMatrixType,int SrcUpLo>
+    SparseSelfAdjointView& operator=(const SparseSymmetricPermutationProduct<SrcMatrixType,SrcUpLo>& permutedMatrix)
+    {
+      permutedMatrix.evalTo(*this);
+      return *this;
+    }
+
+
+    SparseSelfAdjointView& operator=(const SparseSelfAdjointView& src)
+    {
+      PermutationMatrix<Dynamic> pnull;
+      return *this = src.twistedBy(pnull);
+    }
+
+    template<typename SrcMatrixType,unsigned int SrcUpLo>
+    SparseSelfAdjointView& operator=(const SparseSelfAdjointView<SrcMatrixType,SrcUpLo>& src)
+    {
+      PermutationMatrix<Dynamic> pnull;
+      return *this = src.twistedBy(pnull);
+    }
+    
+
+    // const SparseLLT<PlainObject, UpLo> llt() const;
+    // const SparseLDLT<PlainObject, UpLo> ldlt() const;
+
+  protected:
+
+    typename MatrixType::Nested m_matrix;
+    mutable VectorI m_countPerRow;
+    mutable VectorI m_countPerCol;
+};
+
+/***************************************************************************
+* Implementation of SparseMatrixBase methods
+***************************************************************************/
+
+template<typename Derived>
+template<unsigned int UpLo>
+const SparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView() const
+{
+  return derived();
+}
+
+template<typename Derived>
+template<unsigned int UpLo>
+SparseSelfAdjointView<Derived, UpLo> SparseMatrixBase<Derived>::selfadjointView()
+{
+  return derived();
+}
+
+/***************************************************************************
+* Implementation of SparseSelfAdjointView methods
+***************************************************************************/
+
+template<typename MatrixType, unsigned int UpLo>
+template<typename DerivedU>
+SparseSelfAdjointView<MatrixType,UpLo>&
+SparseSelfAdjointView<MatrixType,UpLo>::rankUpdate(const SparseMatrixBase<DerivedU>& u, const Scalar& alpha)
+{
+  SparseMatrix<Scalar,MatrixType::Flags&RowMajorBit?RowMajor:ColMajor> tmp = u * u.adjoint();
+  if(alpha==Scalar(0))
+    m_matrix.const_cast_derived() = tmp.template triangularView<UpLo>();
+  else
+    m_matrix.const_cast_derived() += alpha * tmp.template triangularView<UpLo>();
+
+  return *this;
+}
+
+/***************************************************************************
+* Implementation of sparse self-adjoint time dense matrix
+***************************************************************************/
+
+namespace internal {
+template<typename Lhs, typename Rhs, int UpLo>
+struct traits<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo> >
+ : traits<ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
+{
+  typedef Dense StorageKind;
+};
+}
+
+template<typename Lhs, typename Rhs, int UpLo>
+class SparseSelfAdjointTimeDenseProduct
+  : public ProductBase<SparseSelfAdjointTimeDenseProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
+{
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(SparseSelfAdjointTimeDenseProduct)
+
+    SparseSelfAdjointTimeDenseProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {}
+
+    template<typename Dest> void scaleAndAddTo(Dest& dest, const Scalar& alpha) const
+    {
+      EIGEN_ONLY_USED_FOR_DEBUG(alpha);
+      // TODO use alpha
+      eigen_assert(alpha==Scalar(1) && "alpha != 1 is not implemented yet, sorry");
+      typedef typename internal::remove_all<Lhs>::type _Lhs;
+      typedef typename _Lhs::InnerIterator LhsInnerIterator;
+      enum {
+        LhsIsRowMajor = (_Lhs::Flags&RowMajorBit)==RowMajorBit,
+        ProcessFirstHalf =
+                 ((UpLo&(Upper|Lower))==(Upper|Lower))
+              || ( (UpLo&Upper) && !LhsIsRowMajor)
+              || ( (UpLo&Lower) && LhsIsRowMajor),
+        ProcessSecondHalf = !ProcessFirstHalf
+      };
+      for (Index j=0; j<m_lhs.outerSize(); ++j)
+      {
+        LhsInnerIterator i(m_lhs,j);
+        if (ProcessSecondHalf)
+        {
+          while (i && i.index()<j) ++i;
+          if(i && i.index()==j)
+          {
+            dest.row(j) += i.value() * m_rhs.row(j);
+            ++i;
+          }
+        }
+        for(; (ProcessFirstHalf ? i && i.index() < j : i) ; ++i)
+        {
+          Index a = LhsIsRowMajor ? j : i.index();
+          Index b = LhsIsRowMajor ? i.index() : j;
+          typename Lhs::Scalar v = i.value();
+          dest.row(a) += (v) * m_rhs.row(b);
+          dest.row(b) += internal::conj(v) * m_rhs.row(a);
+        }
+        if (ProcessFirstHalf && i && (i.index()==j))
+          dest.row(j) += i.value() * m_rhs.row(j);
+      }
+    }
+
+  private:
+    SparseSelfAdjointTimeDenseProduct& operator=(const SparseSelfAdjointTimeDenseProduct&);
+};
+
+namespace internal {
+template<typename Lhs, typename Rhs, int UpLo>
+struct traits<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo> >
+ : traits<ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs> >
+{};
+}
+
+template<typename Lhs, typename Rhs, int UpLo>
+class DenseTimeSparseSelfAdjointProduct
+  : public ProductBase<DenseTimeSparseSelfAdjointProduct<Lhs,Rhs,UpLo>, Lhs, Rhs>
+{
+  public:
+    EIGEN_PRODUCT_PUBLIC_INTERFACE(DenseTimeSparseSelfAdjointProduct)
+
+    DenseTimeSparseSelfAdjointProduct(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs)
+    {}
+
+    template<typename Dest> void scaleAndAddTo(Dest& /*dest*/, const Scalar& /*alpha*/) const
+    {
+      // TODO
+    }
+
+  private:
+    DenseTimeSparseSelfAdjointProduct& operator=(const DenseTimeSparseSelfAdjointProduct&);
+};
+
+/***************************************************************************
+* Implementation of symmetric copies and permutations
+***************************************************************************/
+namespace internal {
+  
+template<typename MatrixType, int UpLo>
+struct traits<SparseSymmetricPermutationProduct<MatrixType,UpLo> > : traits<MatrixType> {
+};
+
+template<int UpLo,typename MatrixType,int DestOrder>
+void permute_symm_to_fullsymm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DestOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)
+{
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  typedef SparseMatrix<Scalar,DestOrder,Index> Dest;
+  typedef Matrix<Index,Dynamic,1> VectorI;
+  
+  Dest& dest(_dest.derived());
+  enum {
+    StorageOrderMatch = int(Dest::IsRowMajor) == int(MatrixType::IsRowMajor)
+  };
+  
+  Index size = mat.rows();
+  VectorI count;
+  count.resize(size);
+  count.setZero();
+  dest.resize(size,size);
+  for(Index j = 0; j<size; ++j)
+  {
+    Index jp = perm ? perm[j] : j;
+    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
+    {
+      Index i = it.index();
+      Index r = it.row();
+      Index c = it.col();
+      Index ip = perm ? perm[i] : i;
+      if(UpLo==(Upper|Lower))
+        count[StorageOrderMatch ? jp : ip]++;
+      else if(r==c)
+        count[ip]++;
+      else if(( UpLo==Lower && r>c) || ( UpLo==Upper && r<c))
+      {
+        count[ip]++;
+        count[jp]++;
+      }
+    }
+  }
+  Index nnz = count.sum();
+  
+  // reserve space
+  dest.resizeNonZeros(nnz);
+  dest.outerIndexPtr()[0] = 0;
+  for(Index j=0; j<size; ++j)
+    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
+  for(Index j=0; j<size; ++j)
+    count[j] = dest.outerIndexPtr()[j];
+  
+  // copy data
+  for(Index j = 0; j<size; ++j)
+  {
+    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
+    {
+      Index i = it.index();
+      Index r = it.row();
+      Index c = it.col();
+      
+      Index jp = perm ? perm[j] : j;
+      Index ip = perm ? perm[i] : i;
+      
+      if(UpLo==(Upper|Lower))
+      {
+        Index k = count[StorageOrderMatch ? jp : ip]++;
+        dest.innerIndexPtr()[k] = StorageOrderMatch ? ip : jp;
+        dest.valuePtr()[k] = it.value();
+      }
+      else if(r==c)
+      {
+        Index k = count[ip]++;
+        dest.innerIndexPtr()[k] = ip;
+        dest.valuePtr()[k] = it.value();
+      }
+      else if(( (UpLo&Lower)==Lower && r>c) || ( (UpLo&Upper)==Upper && r<c))
+      {
+        if(!StorageOrderMatch)
+          std::swap(ip,jp);
+        Index k = count[jp]++;
+        dest.innerIndexPtr()[k] = ip;
+        dest.valuePtr()[k] = it.value();
+        k = count[ip]++;
+        dest.innerIndexPtr()[k] = jp;
+        dest.valuePtr()[k] = internal::conj(it.value());
+      }
+    }
+  }
+}
+
+template<int _SrcUpLo,int _DstUpLo,typename MatrixType,int DstOrder>
+void permute_symm_to_symm(const MatrixType& mat, SparseMatrix<typename MatrixType::Scalar,DstOrder,typename MatrixType::Index>& _dest, const typename MatrixType::Index* perm)
+{
+  typedef typename MatrixType::Index Index;
+  typedef typename MatrixType::Scalar Scalar;
+  SparseMatrix<Scalar,DstOrder,Index>& dest(_dest.derived());
+  typedef Matrix<Index,Dynamic,1> VectorI;
+  enum {
+    SrcOrder = MatrixType::IsRowMajor ? RowMajor : ColMajor,
+    StorageOrderMatch = int(SrcOrder) == int(DstOrder),
+    DstUpLo = DstOrder==RowMajor ? (_DstUpLo==Upper ? Lower : Upper) : _DstUpLo,
+    SrcUpLo = SrcOrder==RowMajor ? (_SrcUpLo==Upper ? Lower : Upper) : _SrcUpLo
+  };
+  
+  Index size = mat.rows();
+  VectorI count(size);
+  count.setZero();
+  dest.resize(size,size);
+  for(Index j = 0; j<size; ++j)
+  {
+    Index jp = perm ? perm[j] : j;
+    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
+    {
+      Index i = it.index();
+      if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))
+        continue;
+                  
+      Index ip = perm ? perm[i] : i;
+      count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
+    }
+  }
+  dest.outerIndexPtr()[0] = 0;
+  for(Index j=0; j<size; ++j)
+    dest.outerIndexPtr()[j+1] = dest.outerIndexPtr()[j] + count[j];
+  dest.resizeNonZeros(dest.outerIndexPtr()[size]);
+  for(Index j=0; j<size; ++j)
+    count[j] = dest.outerIndexPtr()[j];
+  
+  for(Index j = 0; j<size; ++j)
+  {
+    
+    for(typename MatrixType::InnerIterator it(mat,j); it; ++it)
+    {
+      Index i = it.index();
+      if((int(SrcUpLo)==int(Lower) && i<j) || (int(SrcUpLo)==int(Upper) && i>j))
+        continue;
+                  
+      Index jp = perm ? perm[j] : j;
+      Index ip = perm? perm[i] : i;
+      
+      Index k = count[int(DstUpLo)==int(Lower) ? (std::min)(ip,jp) : (std::max)(ip,jp)]++;
+      dest.innerIndexPtr()[k] = int(DstUpLo)==int(Lower) ? (std::max)(ip,jp) : (std::min)(ip,jp);
+      
+      if(!StorageOrderMatch) std::swap(ip,jp);
+      if( ((int(DstUpLo)==int(Lower) && ip<jp) || (int(DstUpLo)==int(Upper) && ip>jp)))
+        dest.valuePtr()[k] = conj(it.value());
+      else
+        dest.valuePtr()[k] = it.value();
+    }
+  }
+}
+
+}
+
+template<typename MatrixType,int UpLo>
+class SparseSymmetricPermutationProduct
+  : public EigenBase<SparseSymmetricPermutationProduct<MatrixType,UpLo> >
+{
+  public:
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::Index Index;
+  protected:
+    typedef PermutationMatrix<Dynamic,Dynamic,Index> Perm;
+  public:
+    typedef Matrix<Index,Dynamic,1> VectorI;
+    typedef typename MatrixType::Nested MatrixTypeNested;
+    typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
+    
+    SparseSymmetricPermutationProduct(const MatrixType& mat, const Perm& perm)
+      : m_matrix(mat), m_perm(perm)
+    {}
+    
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    
+    template<typename DestScalar, int Options, typename DstIndex>
+    void evalTo(SparseMatrix<DestScalar,Options,DstIndex>& _dest) const
+    {
+      internal::permute_symm_to_fullsymm<UpLo>(m_matrix,_dest,m_perm.indices().data());
+    }
+    
+    template<typename DestType,unsigned int DestUpLo> void evalTo(SparseSelfAdjointView<DestType,DestUpLo>& dest) const
+    {
+      internal::permute_symm_to_symm<UpLo,DestUpLo>(m_matrix,dest.matrix(),m_perm.indices().data());
+    }
+    
+  protected:
+    MatrixTypeNested m_matrix;
+    const Perm& m_perm;
+
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_SELFADJOINTVIEW_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSparseProductWithPruning.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSparseProductWithPruning.h
new file mode 100644
index 0000000..70857c7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseSparseProductWithPruning.h
@@ -0,0 +1,149 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H
+#define EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H
+
+namespace Eigen { 
+
+namespace internal {
+
+
+// perform a pseudo in-place sparse * sparse product assuming all matrices are col major
+template<typename Lhs, typename Rhs, typename ResultType>
+static void sparse_sparse_product_with_pruning_impl(const Lhs& lhs, const Rhs& rhs, ResultType& res, const typename ResultType::RealScalar& tolerance)
+{
+  // return sparse_sparse_product_with_pruning_impl2(lhs,rhs,res);
+
+  typedef typename remove_all<Lhs>::type::Scalar Scalar;
+  typedef typename remove_all<Lhs>::type::Index Index;
+
+  // make sure to call innerSize/outerSize since we fake the storage order.
+  Index rows = lhs.innerSize();
+  Index cols = rhs.outerSize();
+  //int size = lhs.outerSize();
+  eigen_assert(lhs.outerSize() == rhs.innerSize());
+
+  // allocate a temporary buffer
+  AmbiVector<Scalar,Index> tempVector(rows);
+
+  // estimate the number of non zero entries
+  // given a rhs column containing Y non zeros, we assume that the respective Y columns
+  // of the lhs differs in average of one non zeros, thus the number of non zeros for
+  // the product of a rhs column with the lhs is X+Y where X is the average number of non zero
+  // per column of the lhs.
+  // Therefore, we have nnz(lhs*rhs) = nnz(lhs) + nnz(rhs)
+  Index estimated_nnz_prod = lhs.nonZeros() + rhs.nonZeros();
+
+  // mimics a resizeByInnerOuter:
+  if(ResultType::IsRowMajor)
+    res.resize(cols, rows);
+  else
+    res.resize(rows, cols);
+
+  res.reserve(estimated_nnz_prod);
+  double ratioColRes = double(estimated_nnz_prod)/double(lhs.rows()*rhs.cols());
+  for (Index j=0; j<cols; ++j)
+  {
+    // FIXME:
+    //double ratioColRes = (double(rhs.innerVector(j).nonZeros()) + double(lhs.nonZeros())/double(lhs.cols()))/double(lhs.rows());
+    // let's do a more accurate determination of the nnz ratio for the current column j of res
+    tempVector.init(ratioColRes);
+    tempVector.setZero();
+    for (typename Rhs::InnerIterator rhsIt(rhs, j); rhsIt; ++rhsIt)
+    {
+      // FIXME should be written like this: tmp += rhsIt.value() * lhs.col(rhsIt.index())
+      tempVector.restart();
+      Scalar x = rhsIt.value();
+      for (typename Lhs::InnerIterator lhsIt(lhs, rhsIt.index()); lhsIt; ++lhsIt)
+      {
+        tempVector.coeffRef(lhsIt.index()) += lhsIt.value() * x;
+      }
+    }
+    res.startVec(j);
+    for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector,tolerance); it; ++it)
+      res.insertBackByOuterInner(j,it.index()) = it.value();
+  }
+  res.finalize();
+}
+
+template<typename Lhs, typename Rhs, typename ResultType,
+  int LhsStorageOrder = traits<Lhs>::Flags&RowMajorBit,
+  int RhsStorageOrder = traits<Rhs>::Flags&RowMajorBit,
+  int ResStorageOrder = traits<ResultType>::Flags&RowMajorBit>
+struct sparse_sparse_product_with_pruning_selector;
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,ColMajor>
+{
+  typedef typename traits<typename remove_all<Lhs>::type>::Scalar Scalar;
+  typedef typename ResultType::RealScalar RealScalar;
+
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
+  {
+    typename remove_all<ResultType>::type _res(res.rows(), res.cols());
+    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,ResultType>(lhs, rhs, _res, tolerance);
+    res.swap(_res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,ColMajor,ColMajor,RowMajor>
+{
+  typedef typename ResultType::RealScalar RealScalar;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
+  {
+    // we need a col-major matrix to hold the result
+    typedef SparseMatrix<typename ResultType::Scalar> SparseTemporaryType;
+    SparseTemporaryType _res(res.rows(), res.cols());
+    internal::sparse_sparse_product_with_pruning_impl<Lhs,Rhs,SparseTemporaryType>(lhs, rhs, _res, tolerance);
+    res = _res;
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,RowMajor>
+{
+  typedef typename ResultType::RealScalar RealScalar;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
+  {
+    // let's transpose the product to get a column x column product
+    typename remove_all<ResultType>::type _res(res.rows(), res.cols());
+    internal::sparse_sparse_product_with_pruning_impl<Rhs,Lhs,ResultType>(rhs, lhs, _res, tolerance);
+    res.swap(_res);
+  }
+};
+
+template<typename Lhs, typename Rhs, typename ResultType>
+struct sparse_sparse_product_with_pruning_selector<Lhs,Rhs,ResultType,RowMajor,RowMajor,ColMajor>
+{
+  typedef typename ResultType::RealScalar RealScalar;
+  static void run(const Lhs& lhs, const Rhs& rhs, ResultType& res, const RealScalar& tolerance)
+  {
+    typedef SparseMatrix<typename ResultType::Scalar,ColMajor> ColMajorMatrix;
+    ColMajorMatrix colLhs(lhs);
+    ColMajorMatrix colRhs(rhs);
+    internal::sparse_sparse_product_with_pruning_impl<ColMajorMatrix,ColMajorMatrix,ResultType>(colLhs, colRhs, res, tolerance);
+
+    // let's transpose the product to get a column x column product
+//     typedef SparseMatrix<typename ResultType::Scalar> SparseTemporaryType;
+//     SparseTemporaryType _res(res.cols(), res.rows());
+//     sparse_sparse_product_with_pruning_impl<Rhs,Lhs,SparseTemporaryType>(rhs, lhs, _res);
+//     res = _res.transpose();
+  }
+};
+
+// NOTE the 2 others cases (col row *) must never occur since they are caught
+// by ProductReturnType which transforms it to (col col *) by evaluating rhs.
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSESPARSEPRODUCTWITHPRUNING_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTranspose.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTranspose.h
new file mode 100644
index 0000000..c78c20a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTranspose.h
@@ -0,0 +1,61 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSETRANSPOSE_H
+#define EIGEN_SPARSETRANSPOSE_H
+
+namespace Eigen { 
+
+template<typename MatrixType> class TransposeImpl<MatrixType,Sparse>
+  : public SparseMatrixBase<Transpose<MatrixType> >
+{
+    typedef typename internal::remove_all<typename MatrixType::Nested>::type _MatrixTypeNested;
+  public:
+
+    EIGEN_SPARSE_PUBLIC_INTERFACE(Transpose<MatrixType> )
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    inline Index nonZeros() const { return derived().nestedExpression().nonZeros(); }
+};
+
+// NOTE: VC10 trigger an ICE if don't put typename TransposeImpl<MatrixType,Sparse>:: in front of Index,
+// a typedef typename TransposeImpl<MatrixType,Sparse>::Index Index;
+// does not fix the issue.
+// An alternative is to define the nested class in the parent class itself.
+template<typename MatrixType> class TransposeImpl<MatrixType,Sparse>::InnerIterator
+  : public _MatrixTypeNested::InnerIterator
+{
+    typedef typename _MatrixTypeNested::InnerIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE InnerIterator(const TransposeImpl& trans, typename TransposeImpl<MatrixType,Sparse>::Index outer)
+      : Base(trans.derived().nestedExpression(), outer)
+    {}
+    inline typename TransposeImpl<MatrixType,Sparse>::Index row() const { return Base::col(); }
+    inline typename TransposeImpl<MatrixType,Sparse>::Index col() const { return Base::row(); }
+};
+
+template<typename MatrixType> class TransposeImpl<MatrixType,Sparse>::ReverseInnerIterator
+  : public _MatrixTypeNested::ReverseInnerIterator
+{
+    typedef typename _MatrixTypeNested::ReverseInnerIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator(const TransposeImpl& xpr, typename TransposeImpl<MatrixType,Sparse>::Index outer)
+      : Base(xpr.derived().nestedExpression(), outer)
+    {}
+    inline typename TransposeImpl<MatrixType,Sparse>::Index row() const { return Base::col(); }
+    inline typename TransposeImpl<MatrixType,Sparse>::Index col() const { return Base::row(); }
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSETRANSPOSE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTriangularView.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTriangularView.h
new file mode 100644
index 0000000..477e4bd
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseTriangularView.h
@@ -0,0 +1,164 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_TRIANGULARVIEW_H
+#define EIGEN_SPARSE_TRIANGULARVIEW_H
+
+namespace Eigen { 
+
+namespace internal {
+  
+template<typename MatrixType, int Mode>
+struct traits<SparseTriangularView<MatrixType,Mode> >
+: public traits<MatrixType>
+{};
+
+} // namespace internal
+
+template<typename MatrixType, int Mode> class SparseTriangularView
+  : public SparseMatrixBase<SparseTriangularView<MatrixType,Mode> >
+{
+    enum { SkipFirst = ((Mode&Lower) && !(MatrixType::Flags&RowMajorBit))
+                    || ((Mode&Upper) &&  (MatrixType::Flags&RowMajorBit)),
+           SkipLast = !SkipFirst,
+           HasUnitDiag = (Mode&UnitDiag) ? 1 : 0
+    };
+
+  public:
+    
+    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseTriangularView)
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+
+    typedef typename MatrixType::Nested MatrixTypeNested;
+    typedef typename internal::remove_reference<MatrixTypeNested>::type MatrixTypeNestedNonRef;
+    typedef typename internal::remove_all<MatrixTypeNested>::type MatrixTypeNestedCleaned;
+
+    inline SparseTriangularView(const MatrixType& matrix) : m_matrix(matrix) {}
+
+    /** \internal */
+    inline const MatrixTypeNestedCleaned& nestedExpression() const { return m_matrix; }
+
+    template<typename OtherDerived>
+    typename internal::plain_matrix_type_column_major<OtherDerived>::type
+    solve(const MatrixBase<OtherDerived>& other) const;
+
+    template<typename OtherDerived> void solveInPlace(MatrixBase<OtherDerived>& other) const;
+    template<typename OtherDerived> void solveInPlace(SparseMatrixBase<OtherDerived>& other) const;
+
+  protected:
+    MatrixTypeNested m_matrix;
+};
+
+template<typename MatrixType, int Mode>
+class SparseTriangularView<MatrixType,Mode>::InnerIterator : public MatrixTypeNestedCleaned::InnerIterator
+{
+    typedef typename MatrixTypeNestedCleaned::InnerIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE InnerIterator(const SparseTriangularView& view, Index outer)
+      : Base(view.nestedExpression(), outer), m_returnOne(false)
+    {
+      if(SkipFirst)
+      {
+        while((*this) && (HasUnitDiag ? this->index()<=outer : this->index()<outer))
+          Base::operator++();
+        if(HasUnitDiag)
+          m_returnOne = true;
+      }
+      else if(HasUnitDiag && ((!Base::operator bool()) || Base::index()>=Base::outer()))
+      {
+        if((!SkipFirst) && Base::operator bool())
+          Base::operator++();
+        m_returnOne = true;
+      }
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator++()
+    {
+      if(HasUnitDiag && m_returnOne)
+        m_returnOne = false;
+      else
+      {
+        Base::operator++();
+        if(HasUnitDiag && (!SkipFirst) && ((!Base::operator bool()) || Base::index()>=Base::outer()))
+        {
+          if((!SkipFirst) && Base::operator bool())
+            Base::operator++();
+          m_returnOne = true;
+        }
+      }
+      return *this;
+    }
+
+    inline Index row() const { return Base::row(); }
+    inline Index col() const { return Base::col(); }
+    inline Index index() const
+    {
+      if(HasUnitDiag && m_returnOne)  return Base::outer();
+      else                            return Base::index();
+    }
+    inline Scalar value() const
+    {
+      if(HasUnitDiag && m_returnOne)  return Scalar(1);
+      else                            return Base::value();
+    }
+
+    EIGEN_STRONG_INLINE operator bool() const
+    {
+      if(HasUnitDiag && m_returnOne)
+        return true;
+      return (SkipFirst ? Base::operator bool() : (Base::operator bool() && this->index() <= this->outer()));
+    }
+  protected:
+    bool m_returnOne;
+};
+
+template<typename MatrixType, int Mode>
+class SparseTriangularView<MatrixType,Mode>::ReverseInnerIterator : public MatrixTypeNestedCleaned::ReverseInnerIterator
+{
+    typedef typename MatrixTypeNestedCleaned::ReverseInnerIterator Base;
+  public:
+
+    EIGEN_STRONG_INLINE ReverseInnerIterator(const SparseTriangularView& view, Index outer)
+      : Base(view.nestedExpression(), outer)
+    {
+      eigen_assert((!HasUnitDiag) && "ReverseInnerIterator does not support yet triangular views with a unit diagonal");
+      if(SkipLast)
+        while((*this) && this->index()>outer)
+          --(*this);
+    }
+
+    EIGEN_STRONG_INLINE InnerIterator& operator--()
+    { Base::operator--(); return *this; }
+
+    inline Index row() const { return Base::row(); }
+    inline Index col() const { return Base::col(); }
+
+    EIGEN_STRONG_INLINE operator bool() const
+    {
+      return SkipLast ? Base::operator bool() : (Base::operator bool() && this->index() >= this->outer());
+    }
+};
+
+template<typename Derived>
+template<int Mode>
+inline const SparseTriangularView<Derived, Mode>
+SparseMatrixBase<Derived>::triangularView() const
+{
+  return derived();
+}
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_TRIANGULARVIEW_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseUtil.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseUtil.h
new file mode 100644
index 0000000..d58b513
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseUtil.h
@@ -0,0 +1,173 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEUTIL_H
+#define EIGEN_SPARSEUTIL_H
+
+namespace Eigen { 
+
+#ifdef NDEBUG
+#define EIGEN_DBG_SPARSE(X)
+#else
+#define EIGEN_DBG_SPARSE(X) X
+#endif
+
+#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, Op) \
+template<typename OtherDerived> \
+EIGEN_STRONG_INLINE Derived& operator Op(const Eigen::SparseMatrixBase<OtherDerived>& other) \
+{ \
+  return Base::operator Op(other.derived()); \
+} \
+EIGEN_STRONG_INLINE Derived& operator Op(const Derived& other) \
+{ \
+  return Base::operator Op(other); \
+}
+
+#define EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, Op) \
+template<typename Other> \
+EIGEN_STRONG_INLINE Derived& operator Op(const Other& scalar) \
+{ \
+  return Base::operator Op(scalar); \
+}
+
+#define EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATORS(Derived) \
+EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, =) \
+EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, +=) \
+EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(Derived, -=) \
+EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \
+EIGEN_SPARSE_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)
+
+#define _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, BaseClass) \
+  typedef BaseClass Base; \
+  typedef typename Eigen::internal::traits<Derived >::Scalar Scalar; \
+  typedef typename Eigen::NumTraits<Scalar>::Real RealScalar; \
+  typedef typename Eigen::internal::nested<Derived >::type Nested; \
+  typedef typename Eigen::internal::traits<Derived >::StorageKind StorageKind; \
+  typedef typename Eigen::internal::traits<Derived >::Index Index; \
+  enum { RowsAtCompileTime = Eigen::internal::traits<Derived >::RowsAtCompileTime, \
+        ColsAtCompileTime = Eigen::internal::traits<Derived >::ColsAtCompileTime, \
+        Flags = Eigen::internal::traits<Derived >::Flags, \
+        CoeffReadCost = Eigen::internal::traits<Derived >::CoeffReadCost, \
+        SizeAtCompileTime = Base::SizeAtCompileTime, \
+        IsVectorAtCompileTime = Base::IsVectorAtCompileTime }; \
+  using Base::derived; \
+  using Base::const_cast_derived;
+
+#define EIGEN_SPARSE_PUBLIC_INTERFACE(Derived) \
+  _EIGEN_SPARSE_PUBLIC_INTERFACE(Derived, Eigen::SparseMatrixBase<Derived >)
+
+const int CoherentAccessPattern     = 0x1;
+const int InnerRandomAccessPattern  = 0x2 | CoherentAccessPattern;
+const int OuterRandomAccessPattern  = 0x4 | CoherentAccessPattern;
+const int RandomAccessPattern       = 0x8 | OuterRandomAccessPattern | InnerRandomAccessPattern;
+
+template<typename Derived> class SparseMatrixBase;
+template<typename _Scalar, int _Flags = 0, typename _Index = int>  class SparseMatrix;
+template<typename _Scalar, int _Flags = 0, typename _Index = int>  class DynamicSparseMatrix;
+template<typename _Scalar, int _Flags = 0, typename _Index = int>  class SparseVector;
+template<typename _Scalar, int _Flags = 0, typename _Index = int>  class MappedSparseMatrix;
+
+template<typename MatrixType, int Mode>           class SparseTriangularView;
+template<typename MatrixType, unsigned int UpLo>  class SparseSelfAdjointView;
+template<typename Lhs, typename Rhs>              class SparseDiagonalProduct;
+template<typename MatrixType> class SparseView;
+
+template<typename Lhs, typename Rhs>        class SparseSparseProduct;
+template<typename Lhs, typename Rhs>        class SparseTimeDenseProduct;
+template<typename Lhs, typename Rhs>        class DenseTimeSparseProduct;
+template<typename Lhs, typename Rhs, bool Transpose> class SparseDenseOuterProduct;
+
+template<typename Lhs, typename Rhs> struct SparseSparseProductReturnType;
+template<typename Lhs, typename Rhs, int InnerSize = internal::traits<Lhs>::ColsAtCompileTime> struct DenseSparseProductReturnType;
+template<typename Lhs, typename Rhs, int InnerSize = internal::traits<Lhs>::ColsAtCompileTime> struct SparseDenseProductReturnType;
+template<typename MatrixType,int UpLo> class SparseSymmetricPermutationProduct;
+
+namespace internal {
+
+template<typename T,int Rows,int Cols> struct sparse_eval;
+
+template<typename T> struct eval<T,Sparse>
+  : public sparse_eval<T, traits<T>::RowsAtCompileTime,traits<T>::ColsAtCompileTime>
+{};
+
+template<typename T,int Cols> struct sparse_eval<T,1,Cols> {
+    typedef typename traits<T>::Scalar _Scalar;
+    enum { _Flags = traits<T>::Flags| RowMajorBit };
+  public:
+    typedef SparseVector<_Scalar, _Flags> type;
+};
+
+template<typename T,int Rows> struct sparse_eval<T,Rows,1> {
+    typedef typename traits<T>::Scalar _Scalar;
+    enum { _Flags = traits<T>::Flags & (~RowMajorBit) };
+  public:
+    typedef SparseVector<_Scalar, _Flags> type;
+};
+
+template<typename T,int Rows,int Cols> struct sparse_eval {
+    typedef typename traits<T>::Scalar _Scalar;
+    typedef typename traits<T>::Index _Index;
+    enum { _Options = ((traits<T>::Flags&RowMajorBit)==RowMajorBit) ? RowMajor : ColMajor };
+  public:
+    typedef SparseMatrix<_Scalar, _Options, _Index> type;
+};
+
+template<typename T> struct sparse_eval<T,1,1> {
+    typedef typename traits<T>::Scalar _Scalar;
+  public:
+    typedef Matrix<_Scalar, 1, 1> type;
+};
+
+template<typename T> struct plain_matrix_type<T,Sparse>
+{
+  typedef typename traits<T>::Scalar _Scalar;
+    enum {
+          _Flags = traits<T>::Flags
+    };
+
+  public:
+    typedef SparseMatrix<_Scalar, _Flags> type;
+};
+
+} // end namespace internal
+
+/** \ingroup SparseCore_Module
+  *
+  * \class Triplet
+  *
+  * \brief A small structure to hold a non zero as a triplet (i,j,value).
+  *
+  * \sa SparseMatrix::setFromTriplets()
+  */
+template<typename Scalar, typename Index=unsigned int>
+class Triplet
+{
+public:
+  Triplet() : m_row(0), m_col(0), m_value(0) {}
+
+  Triplet(const Index& i, const Index& j, const Scalar& v = Scalar(0))
+    : m_row(i), m_col(j), m_value(v)
+  {}
+
+  /** \returns the row index of the element */
+  const Index& row() const { return m_row; }
+
+  /** \returns the column index of the element */
+  const Index& col() const { return m_col; }
+
+  /** \returns the value of the element */
+  const Scalar& value() const { return m_value; }
+protected:
+  Index m_row, m_col;
+  Scalar m_value;
+};
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEUTIL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseVector.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseVector.h
new file mode 100644
index 0000000..cd1e760
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseVector.h
@@ -0,0 +1,412 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEVECTOR_H
+#define EIGEN_SPARSEVECTOR_H
+
+namespace Eigen { 
+
+/** \ingroup SparseCore_Module
+  * \class SparseVector
+  *
+  * \brief a sparse vector class
+  *
+  * \tparam _Scalar the scalar type, i.e. the type of the coefficients
+  *
+  * See http://www.netlib.org/linalg/html_templates/node91.html for details on the storage scheme.
+  *
+  * This class can be extended with the help of the plugin mechanism described on the page
+  * \ref TopicCustomizingEigen by defining the preprocessor symbol \c EIGEN_SPARSEVECTOR_PLUGIN.
+  */
+
+namespace internal {
+template<typename _Scalar, int _Options, typename _Index>
+struct traits<SparseVector<_Scalar, _Options, _Index> >
+{
+  typedef _Scalar Scalar;
+  typedef _Index Index;
+  typedef Sparse StorageKind;
+  typedef MatrixXpr XprKind;
+  enum {
+    IsColVector = (_Options & RowMajorBit) ? 0 : 1,
+
+    RowsAtCompileTime = IsColVector ? Dynamic : 1,
+    ColsAtCompileTime = IsColVector ? 1 : Dynamic,
+    MaxRowsAtCompileTime = RowsAtCompileTime,
+    MaxColsAtCompileTime = ColsAtCompileTime,
+    Flags = _Options | NestByRefBit | LvalueBit | (IsColVector ? 0 : RowMajorBit),
+    CoeffReadCost = NumTraits<Scalar>::ReadCost,
+    SupportedAccessPatterns = InnerRandomAccessPattern
+  };
+};
+}
+
+template<typename _Scalar, int _Options, typename _Index>
+class SparseVector
+  : public SparseMatrixBase<SparseVector<_Scalar, _Options, _Index> >
+{
+    typedef SparseMatrixBase<SparseVector> SparseBase;
+    
+  public:
+    EIGEN_SPARSE_PUBLIC_INTERFACE(SparseVector)
+    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, +=)
+    EIGEN_SPARSE_INHERIT_ASSIGNMENT_OPERATOR(SparseVector, -=)
+    
+    typedef internal::CompressedStorage<Scalar,Index> Storage;
+    enum { IsColVector = internal::traits<SparseVector>::IsColVector };
+    
+    enum {
+      Options = _Options
+    };
+    
+    EIGEN_STRONG_INLINE Index rows() const { return IsColVector ? m_size : 1; }
+    EIGEN_STRONG_INLINE Index cols() const { return IsColVector ? 1 : m_size; }
+    EIGEN_STRONG_INLINE Index innerSize() const { return m_size; }
+    EIGEN_STRONG_INLINE Index outerSize() const { return 1; }
+
+    EIGEN_STRONG_INLINE const Scalar* valuePtr() const { return &m_data.value(0); }
+    EIGEN_STRONG_INLINE Scalar* valuePtr() { return &m_data.value(0); }
+
+    EIGEN_STRONG_INLINE const Index* innerIndexPtr() const { return &m_data.index(0); }
+    EIGEN_STRONG_INLINE Index* innerIndexPtr() { return &m_data.index(0); }
+    
+    /** \internal */
+    inline Storage& data() { return m_data; }
+    /** \internal */
+    inline const Storage& data() const { return m_data; }
+
+    inline Scalar coeff(Index row, Index col) const
+    {
+      eigen_assert((IsColVector ? col : row)==0);
+      return coeff(IsColVector ? row : col);
+    }
+    inline Scalar coeff(Index i) const { return m_data.at(i); }
+
+    inline Scalar& coeffRef(Index row, Index col)
+    {
+      eigen_assert((IsColVector ? col : row)==0);
+      return coeff(IsColVector ? row : col);
+    }
+
+    /** \returns a reference to the coefficient value at given index \a i
+      * This operation involes a log(rho*size) binary search. If the coefficient does not
+      * exist yet, then a sorted insertion into a sequential buffer is performed.
+      *
+      * This insertion might be very costly if the number of nonzeros above \a i is large.
+      */
+    inline Scalar& coeffRef(Index i)
+    {
+      return m_data.atWithInsertion(i);
+    }
+
+  public:
+
+    class InnerIterator;
+    class ReverseInnerIterator;
+
+    inline void setZero() { m_data.clear(); }
+
+    /** \returns the number of non zero coefficients */
+    inline Index nonZeros() const  { return static_cast<Index>(m_data.size()); }
+
+    inline void startVec(Index outer)
+    {
+      EIGEN_UNUSED_VARIABLE(outer);
+      eigen_assert(outer==0);
+    }
+
+    inline Scalar& insertBackByOuterInner(Index outer, Index inner)
+    {
+      EIGEN_UNUSED_VARIABLE(outer);
+      eigen_assert(outer==0);
+      return insertBack(inner);
+    }
+    inline Scalar& insertBack(Index i)
+    {
+      m_data.append(0, i);
+      return m_data.value(m_data.size()-1);
+    }
+
+    inline Scalar& insert(Index row, Index col)
+    {
+      Index inner = IsColVector ? row : col;
+      Index outer = IsColVector ? col : row;
+      eigen_assert(outer==0);
+      return insert(inner);
+    }
+    Scalar& insert(Index i)
+    {
+      Index startId = 0;
+      Index p = Index(m_data.size()) - 1;
+      // TODO smart realloc
+      m_data.resize(p+2,1);
+
+      while ( (p >= startId) && (m_data.index(p) > i) )
+      {
+        m_data.index(p+1) = m_data.index(p);
+        m_data.value(p+1) = m_data.value(p);
+        --p;
+      }
+      m_data.index(p+1) = i;
+      m_data.value(p+1) = 0;
+      return m_data.value(p+1);
+    }
+
+    /**
+      */
+    inline void reserve(Index reserveSize) { m_data.reserve(reserveSize); }
+
+
+    inline void finalize() {}
+
+    void prune(const Scalar& reference, const RealScalar& epsilon = NumTraits<RealScalar>::dummy_precision())
+    {
+      m_data.prune(reference,epsilon);
+    }
+
+    void resize(Index rows, Index cols)
+    {
+      eigen_assert(rows==1 || cols==1);
+      resize(IsColVector ? rows : cols);
+    }
+
+    void resize(Index newSize)
+    {
+      m_size = newSize;
+      m_data.clear();
+    }
+
+    void resizeNonZeros(Index size) { m_data.resize(size); }
+
+    inline SparseVector() : m_size(0) { resize(0); }
+
+    inline SparseVector(Index size) : m_size(0) { resize(size); }
+
+    inline SparseVector(Index rows, Index cols) : m_size(0) { resize(rows,cols); }
+
+    template<typename OtherDerived>
+    inline SparseVector(const SparseMatrixBase<OtherDerived>& other)
+      : m_size(0)
+    {
+      *this = other.derived();
+    }
+
+    inline SparseVector(const SparseVector& other)
+      : SparseBase(other), m_size(0)
+    {
+      *this = other.derived();
+    }
+
+    /** Swaps the values of \c *this and \a other.
+      * Overloaded for performance: this version performs a \em shallow swap by swaping pointers and attributes only.
+      * \sa SparseMatrixBase::swap()
+      */
+    inline void swap(SparseVector& other)
+    {
+      std::swap(m_size, other.m_size);
+      m_data.swap(other.m_data);
+    }
+
+    inline SparseVector& operator=(const SparseVector& other)
+    {
+      if (other.isRValue())
+      {
+        swap(other.const_cast_derived());
+      }
+      else
+      {
+        resize(other.size());
+        m_data = other.m_data;
+      }
+      return *this;
+    }
+
+    template<typename OtherDerived>
+    inline SparseVector& operator=(const SparseMatrixBase<OtherDerived>& other)
+    {
+      if ( (bool(OtherDerived::IsVectorAtCompileTime) && int(RowsAtCompileTime)!=int(OtherDerived::RowsAtCompileTime))
+          || ((!bool(OtherDerived::IsVectorAtCompileTime)) && ( bool(IsColVector) ? other.cols()>1 : other.rows()>1 )))
+        return assign(other.transpose());
+      else
+        return assign(other);
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    template<typename Lhs, typename Rhs>
+    inline SparseVector& operator=(const SparseSparseProduct<Lhs,Rhs>& product)
+    {
+      return Base::operator=(product);
+    }
+    #endif
+
+    friend std::ostream & operator << (std::ostream & s, const SparseVector& m)
+    {
+      for (Index i=0; i<m.nonZeros(); ++i)
+        s << "(" << m.m_data.value(i) << "," << m.m_data.index(i) << ") ";
+      s << std::endl;
+      return s;
+    }
+
+    /** Destructor */
+    inline ~SparseVector() {}
+
+    /** Overloaded for performance */
+    Scalar sum() const;
+
+  public:
+
+    /** \internal \deprecated use setZero() and reserve() */
+    EIGEN_DEPRECATED void startFill(Index reserve)
+    {
+      setZero();
+      m_data.reserve(reserve);
+    }
+
+    /** \internal \deprecated use insertBack(Index,Index) */
+    EIGEN_DEPRECATED Scalar& fill(Index r, Index c)
+    {
+      eigen_assert(r==0 || c==0);
+      return fill(IsColVector ? r : c);
+    }
+
+    /** \internal \deprecated use insertBack(Index) */
+    EIGEN_DEPRECATED Scalar& fill(Index i)
+    {
+      m_data.append(0, i);
+      return m_data.value(m_data.size()-1);
+    }
+
+    /** \internal \deprecated use insert(Index,Index) */
+    EIGEN_DEPRECATED Scalar& fillrand(Index r, Index c)
+    {
+      eigen_assert(r==0 || c==0);
+      return fillrand(IsColVector ? r : c);
+    }
+
+    /** \internal \deprecated use insert(Index) */
+    EIGEN_DEPRECATED Scalar& fillrand(Index i)
+    {
+      return insert(i);
+    }
+
+    /** \internal \deprecated use finalize() */
+    EIGEN_DEPRECATED void endFill() {}
+    
+    // These two functions were here in the 3.1 release, so let's keep them in case some code rely on them.
+    /** \internal \deprecated use data() */
+    EIGEN_DEPRECATED Storage& _data() { return m_data; }
+    /** \internal \deprecated use data() */
+    EIGEN_DEPRECATED const Storage& _data() const { return m_data; }
+    
+#   ifdef EIGEN_SPARSEVECTOR_PLUGIN
+#     include EIGEN_SPARSEVECTOR_PLUGIN
+#   endif
+
+protected:
+    template<typename OtherDerived>
+    EIGEN_DONT_INLINE SparseVector& assign(const SparseMatrixBase<OtherDerived>& _other);
+    
+    Storage m_data;
+    Index m_size;
+};
+
+template<typename Scalar, int _Options, typename _Index>
+class SparseVector<Scalar,_Options,_Index>::InnerIterator
+{
+  public:
+    InnerIterator(const SparseVector& vec, Index outer=0)
+      : m_data(vec.m_data), m_id(0), m_end(static_cast<Index>(m_data.size()))
+    {
+      EIGEN_UNUSED_VARIABLE(outer);
+      eigen_assert(outer==0);
+    }
+
+    InnerIterator(const internal::CompressedStorage<Scalar,Index>& data)
+      : m_data(data), m_id(0), m_end(static_cast<Index>(m_data.size()))
+    {}
+
+    inline InnerIterator& operator++() { m_id++; return *this; }
+
+    inline Scalar value() const { return m_data.value(m_id); }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id)); }
+
+    inline Index index() const { return m_data.index(m_id); }
+    inline Index row() const { return IsColVector ? index() : 0; }
+    inline Index col() const { return IsColVector ? 0 : index(); }
+
+    inline operator bool() const { return (m_id < m_end); }
+
+  protected:
+    const internal::CompressedStorage<Scalar,Index>& m_data;
+    Index m_id;
+    const Index m_end;
+};
+
+template<typename Scalar, int _Options, typename _Index>
+class SparseVector<Scalar,_Options,_Index>::ReverseInnerIterator
+{
+  public:
+    ReverseInnerIterator(const SparseVector& vec, Index outer=0)
+      : m_data(vec.m_data), m_id(static_cast<Index>(m_data.size())), m_start(0)
+    {
+      EIGEN_UNUSED_VARIABLE(outer);
+      eigen_assert(outer==0);
+    }
+
+    ReverseInnerIterator(const internal::CompressedStorage<Scalar,Index>& data)
+      : m_data(data), m_id(static_cast<Index>(m_data.size())), m_start(0)
+    {}
+
+    inline ReverseInnerIterator& operator--() { m_id--; return *this; }
+
+    inline Scalar value() const { return m_data.value(m_id-1); }
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_data.value(m_id-1)); }
+
+    inline Index index() const { return m_data.index(m_id-1); }
+    inline Index row() const { return IsColVector ? index() : 0; }
+    inline Index col() const { return IsColVector ? 0 : index(); }
+
+    inline operator bool() const { return (m_id > m_start); }
+
+  protected:
+    const internal::CompressedStorage<Scalar,Index>& m_data;
+    Index m_id;
+    const Index m_start;
+};
+
+template<typename Scalar, int _Options, typename _Index>
+template<typename OtherDerived>
+EIGEN_DONT_INLINE SparseVector<Scalar,_Options,_Index>& SparseVector<Scalar,_Options,_Index>::assign(const SparseMatrixBase<OtherDerived>& _other)
+{
+  const OtherDerived& other(_other.derived());
+  const bool needToTranspose = (Flags & RowMajorBit) != (OtherDerived::Flags & RowMajorBit);
+  if(needToTranspose)
+  {
+    Index size = other.size();
+    Index nnz = other.nonZeros();
+    resize(size);
+    reserve(nnz);
+    for(Index i=0; i<size; ++i)
+    {
+      typename OtherDerived::InnerIterator it(other, i);
+      if(it)
+          insert(i) = it.value();
+    }
+    return *this;
+  }
+  else
+  {
+    // there is no special optimization
+    return Base::operator=(other);
+  }
+}
+    
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSEVECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseView.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseView.h
new file mode 100644
index 0000000..4fd0cb3
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/SparseView.h
@@ -0,0 +1,98 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2010 Daniel Lowengrub <lowdanie at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSEVIEW_H
+#define EIGEN_SPARSEVIEW_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename MatrixType>
+struct traits<SparseView<MatrixType> > : traits<MatrixType>
+{
+  typedef int Index;
+  typedef Sparse StorageKind;
+  enum {
+    Flags = int(traits<MatrixType>::Flags) & (RowMajorBit)
+  };
+};
+
+} // end namespace internal
+
+template<typename MatrixType>
+class SparseView : public SparseMatrixBase<SparseView<MatrixType> >
+{
+  typedef typename MatrixType::Nested MatrixTypeNested;
+  typedef typename internal::remove_all<MatrixTypeNested>::type _MatrixTypeNested;
+public:
+  EIGEN_SPARSE_PUBLIC_INTERFACE(SparseView)
+
+  SparseView(const MatrixType& mat, const Scalar& m_reference = Scalar(0),
+             typename NumTraits<Scalar>::Real m_epsilon = NumTraits<Scalar>::dummy_precision()) : 
+    m_matrix(mat), m_reference(m_reference), m_epsilon(m_epsilon) {}
+
+  class InnerIterator;
+
+  inline Index rows() const { return m_matrix.rows(); }
+  inline Index cols() const { return m_matrix.cols(); }
+
+  inline Index innerSize() const { return m_matrix.innerSize(); }
+  inline Index outerSize() const { return m_matrix.outerSize(); }
+
+protected:
+  MatrixTypeNested m_matrix;
+  Scalar m_reference;
+  typename NumTraits<Scalar>::Real m_epsilon;
+};
+
+template<typename MatrixType>
+class SparseView<MatrixType>::InnerIterator : public _MatrixTypeNested::InnerIterator
+{
+public:
+  typedef typename _MatrixTypeNested::InnerIterator IterBase;
+  InnerIterator(const SparseView& view, Index outer) :
+  IterBase(view.m_matrix, outer), m_view(view)
+  {
+    incrementToNonZero();
+  }
+
+  EIGEN_STRONG_INLINE InnerIterator& operator++()
+  {
+    IterBase::operator++();
+    incrementToNonZero();
+    return *this;
+  }
+
+  using IterBase::value;
+
+protected:
+  const SparseView& m_view;
+
+private:
+  void incrementToNonZero()
+  {
+    while((bool(*this)) && internal::isMuchSmallerThan(value(), m_view.m_reference, m_view.m_epsilon))
+    {
+      IterBase::operator++();
+    }
+  }
+};
+
+template<typename Derived>
+const SparseView<Derived> MatrixBase<Derived>::sparseView(const Scalar& m_reference,
+                                                          const typename NumTraits<Scalar>::Real& m_epsilon) const
+{
+  return SparseView<Derived>(derived(), m_reference, m_epsilon);
+}
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseCore/TriangularSolver.h b/vendor/eigen-3.1.91/Eigen/src/SparseCore/TriangularSolver.h
new file mode 100644
index 0000000..cb8ad82
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseCore/TriangularSolver.h
@@ -0,0 +1,334 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSETRIANGULARSOLVER_H
+#define EIGEN_SPARSETRIANGULARSOLVER_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, int Mode,
+  int UpLo = (Mode & Lower)
+           ? Lower
+           : (Mode & Upper)
+           ? Upper
+           : -1,
+  int StorageOrder = int(traits<Lhs>::Flags) & RowMajorBit>
+struct sparse_solve_triangular_selector;
+
+// forward substitution, row-major
+template<typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,RowMajor>
+{
+  typedef typename Rhs::Scalar Scalar;
+  static void run(const Lhs& lhs, Rhs& other)
+  {
+    for(int col=0 ; col<other.cols() ; ++col)
+    {
+      for(int i=0; i<lhs.rows(); ++i)
+      {
+        Scalar tmp = other.coeff(i,col);
+        Scalar lastVal(0);
+        int lastIndex = 0;
+        for(typename Lhs::InnerIterator it(lhs, i); it; ++it)
+        {
+          lastVal = it.value();
+          lastIndex = it.index();
+          if(lastIndex==i)
+            break;
+          tmp -= lastVal * other.coeff(lastIndex,col);
+        }
+        if (Mode & UnitDiag)
+          other.coeffRef(i,col) = tmp;
+        else
+        {
+          eigen_assert(lastIndex==i);
+          other.coeffRef(i,col) = tmp/lastVal;
+        }
+      }
+    }
+  }
+};
+
+// backward substitution, row-major
+template<typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,RowMajor>
+{
+  typedef typename Rhs::Scalar Scalar;
+  static void run(const Lhs& lhs, Rhs& other)
+  {
+    for(int col=0 ; col<other.cols() ; ++col)
+    {
+      for(int i=lhs.rows()-1 ; i>=0 ; --i)
+      {
+        Scalar tmp = other.coeff(i,col);
+        Scalar l_ii = 0;
+        typename Lhs::InnerIterator it(lhs, i);
+        while(it && it.index()<i)
+          ++it;
+        if(!(Mode & UnitDiag))
+        {
+          eigen_assert(it && it.index()==i);
+          l_ii = it.value();
+          ++it;
+        }
+        else if (it && it.index() == i)
+          ++it;
+        for(; it; ++it)
+        {
+          tmp -= it.value() * other.coeff(it.index(),col);
+        }
+
+        if (Mode & UnitDiag)
+          other.coeffRef(i,col) = tmp;
+        else
+          other.coeffRef(i,col) = tmp/l_ii;
+      }
+    }
+  }
+};
+
+// forward substitution, col-major
+template<typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Lower,ColMajor>
+{
+  typedef typename Rhs::Scalar Scalar;
+  static void run(const Lhs& lhs, Rhs& other)
+  {
+    for(int col=0 ; col<other.cols() ; ++col)
+    {
+      for(int i=0; i<lhs.cols(); ++i)
+      {
+        Scalar& tmp = other.coeffRef(i,col);
+        if (tmp!=Scalar(0)) // optimization when other is actually sparse
+        {
+          typename Lhs::InnerIterator it(lhs, i);
+          while(it && it.index()<i)
+            ++it;
+          if(!(Mode & UnitDiag))
+          {
+            eigen_assert(it && it.index()==i);
+            tmp /= it.value();
+          }
+          if (it && it.index()==i)
+            ++it;
+          for(; it; ++it)
+            other.coeffRef(it.index(), col) -= tmp * it.value();
+        }
+      }
+    }
+  }
+};
+
+// backward substitution, col-major
+template<typename Lhs, typename Rhs, int Mode>
+struct sparse_solve_triangular_selector<Lhs,Rhs,Mode,Upper,ColMajor>
+{
+  typedef typename Rhs::Scalar Scalar;
+  static void run(const Lhs& lhs, Rhs& other)
+  {
+    for(int col=0 ; col<other.cols() ; ++col)
+    {
+      for(int i=lhs.cols()-1; i>=0; --i)
+      {
+        Scalar& tmp = other.coeffRef(i,col);
+        if (tmp!=Scalar(0)) // optimization when other is actually sparse
+        {
+          if(!(Mode & UnitDiag))
+          {
+            // TODO replace this by a binary search. make sure the binary search is safe for partially sorted elements
+            typename Lhs::ReverseInnerIterator it(lhs, i);
+            while(it && it.index()!=i)
+              --it;
+            eigen_assert(it && it.index()==i);
+            other.coeffRef(i,col) /= it.value();
+          }
+          typename Lhs::InnerIterator it(lhs, i);
+          for(; it && it.index()<i; ++it)
+            other.coeffRef(it.index(), col) -= tmp * it.value();
+        }
+      }
+    }
+  }
+};
+
+} // end namespace internal
+
+template<typename ExpressionType,int Mode>
+template<typename OtherDerived>
+void SparseTriangularView<ExpressionType,Mode>::solveInPlace(MatrixBase<OtherDerived>& other) const
+{
+  eigen_assert(m_matrix.cols() == m_matrix.rows() && m_matrix.cols() == other.rows());
+  eigen_assert((!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
+
+  enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
+
+  typedef typename internal::conditional<copy,
+    typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
+  OtherCopy otherCopy(other.derived());
+
+  internal::sparse_solve_triangular_selector<ExpressionType, typename internal::remove_reference<OtherCopy>::type, Mode>::run(m_matrix, otherCopy);
+
+  if (copy)
+    other = otherCopy;
+}
+
+template<typename ExpressionType,int Mode>
+template<typename OtherDerived>
+typename internal::plain_matrix_type_column_major<OtherDerived>::type
+SparseTriangularView<ExpressionType,Mode>::solve(const MatrixBase<OtherDerived>& other) const
+{
+  typename internal::plain_matrix_type_column_major<OtherDerived>::type res(other);
+  solveInPlace(res);
+  return res;
+}
+
+// pure sparse path
+
+namespace internal {
+
+template<typename Lhs, typename Rhs, int Mode,
+  int UpLo = (Mode & Lower)
+           ? Lower
+           : (Mode & Upper)
+           ? Upper
+           : -1,
+  int StorageOrder = int(Lhs::Flags) & (RowMajorBit)>
+struct sparse_solve_triangular_sparse_selector;
+
+// forward substitution, col-major
+template<typename Lhs, typename Rhs, int Mode, int UpLo>
+struct sparse_solve_triangular_sparse_selector<Lhs,Rhs,Mode,UpLo,ColMajor>
+{
+  typedef typename Rhs::Scalar Scalar;
+  typedef typename promote_index_type<typename traits<Lhs>::Index,
+                                         typename traits<Rhs>::Index>::type Index;
+  static void run(const Lhs& lhs, Rhs& other)
+  {
+    const bool IsLower = (UpLo==Lower);
+    AmbiVector<Scalar,Index> tempVector(other.rows()*2);
+    tempVector.setBounds(0,other.rows());
+
+    Rhs res(other.rows(), other.cols());
+    res.reserve(other.nonZeros());
+
+    for(int col=0 ; col<other.cols() ; ++col)
+    {
+      // FIXME estimate number of non zeros
+      tempVector.init(.99/*float(other.col(col).nonZeros())/float(other.rows())*/);
+      tempVector.setZero();
+      tempVector.restart();
+      for (typename Rhs::InnerIterator rhsIt(other, col); rhsIt; ++rhsIt)
+      {
+        tempVector.coeffRef(rhsIt.index()) = rhsIt.value();
+      }
+
+      for(int i=IsLower?0:lhs.cols()-1;
+          IsLower?i<lhs.cols():i>=0;
+          i+=IsLower?1:-1)
+      {
+        tempVector.restart();
+        Scalar& ci = tempVector.coeffRef(i);
+        if (ci!=Scalar(0))
+        {
+          // find
+          typename Lhs::InnerIterator it(lhs, i);
+          if(!(Mode & UnitDiag))
+          {
+            if (IsLower)
+            {
+              eigen_assert(it.index()==i);
+              ci /= it.value();
+            }
+            else
+              ci /= lhs.coeff(i,i);
+          }
+          tempVector.restart();
+          if (IsLower)
+          {
+            if (it.index()==i)
+              ++it;
+            for(; it; ++it)
+              tempVector.coeffRef(it.index()) -= ci * it.value();
+          }
+          else
+          {
+            for(; it && it.index()<i; ++it)
+              tempVector.coeffRef(it.index()) -= ci * it.value();
+          }
+        }
+      }
+
+
+      int count = 0;
+      // FIXME compute a reference value to filter zeros
+      for (typename AmbiVector<Scalar,Index>::Iterator it(tempVector/*,1e-12*/); it; ++it)
+      {
+        ++ count;
+//         std::cerr << "fill " << it.index() << ", " << col << "\n";
+//         std::cout << it.value() << "  ";
+        // FIXME use insertBack
+        res.insert(it.index(), col) = it.value();
+      }
+//       std::cout << "tempVector.nonZeros() == " << int(count) << " / " << (other.rows()) << "\n";
+    }
+    res.finalize();
+    other = res.markAsRValue();
+  }
+};
+
+} // end namespace internal
+
+template<typename ExpressionType,int Mode>
+template<typename OtherDerived>
+void SparseTriangularView<ExpressionType,Mode>::solveInPlace(SparseMatrixBase<OtherDerived>& other) const
+{
+  eigen_assert(m_matrix.cols() == m_matrix.rows() && m_matrix.cols() == other.rows());
+  eigen_assert( (!(Mode & ZeroDiag)) && bool(Mode & (Upper|Lower)));
+
+//   enum { copy = internal::traits<OtherDerived>::Flags & RowMajorBit };
+
+//   typedef typename internal::conditional<copy,
+//     typename internal::plain_matrix_type_column_major<OtherDerived>::type, OtherDerived&>::type OtherCopy;
+//   OtherCopy otherCopy(other.derived());
+
+  internal::sparse_solve_triangular_sparse_selector<ExpressionType, OtherDerived, Mode>::run(m_matrix, other.derived());
+
+//   if (copy)
+//     other = otherCopy;
+}
+
+#ifdef EIGEN2_SUPPORT
+
+// deprecated stuff:
+
+/** \deprecated */
+template<typename Derived>
+template<typename OtherDerived>
+void SparseMatrixBase<Derived>::solveTriangularInPlace(MatrixBase<OtherDerived>& other) const
+{
+  this->template triangular<Flags&(Upper|Lower)>().solveInPlace(other);
+}
+
+/** \deprecated */
+template<typename Derived>
+template<typename OtherDerived>
+typename internal::plain_matrix_type_column_major<OtherDerived>::type
+SparseMatrixBase<Derived>::solveTriangular(const MatrixBase<OtherDerived>& other) const
+{
+  typename internal::plain_matrix_type_column_major<OtherDerived>::type res(other);
+  derived().solveTriangularInPlace(res);
+  return res;
+}
+#endif // EIGEN2_SUPPORT
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSETRIANGULARSOLVER_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SparseLU/CMakeLists.txt
new file mode 100644
index 0000000..69729ee
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SparseLU_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_SparseLU_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseLU COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU.h
new file mode 100644
index 0000000..e782500
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU.h
@@ -0,0 +1,618 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#ifndef EIGEN_SPARSE_LU_H
+#define EIGEN_SPARSE_LU_H
+
+namespace Eigen {
+
+template <typename _MatrixType, typename _OrderingType> class SparseLU;
+template <typename MappedSparseMatrixType> struct SparseLUMatrixLReturnType; 
+/** \ingroup SparseLU_Module
+  * \class SparseLU
+  * 
+  * \brief Sparse supernodal LU factorization for general matrices
+  * 
+  * This class implements the supernodal LU factorization for general matrices.
+  * It uses the main techniques from the sequential SuperLU package 
+  * (http://crd-legacy.lbl.gov/~xiaoye/SuperLU/). It handles transparently real 
+  * and complex arithmetics with single and double precision, depending on the 
+  * scalar type of your input matrix. 
+  * The code has been optimized to provide BLAS-3 operations during supernode-panel updates. 
+  * It benefits directly from the built-in high-performant Eigen BLAS routines. 
+  * Moreover, when the size of a supernode is very small, the BLAS calls are avoided to 
+  * enable a better optimization from the compiler. For best performance, 
+  * you should compile it with NDEBUG flag to avoid the numerous bounds checking on vectors. 
+  * 
+  * An important parameter of this class is the ordering method. It is used to reorder the columns 
+  * (and eventually the rows) of the matrix to reduce the number of new elements that are created during 
+  * numerical factorization. The cheapest method available is COLAMD. 
+  * See  \link OrderingMethods_Module the OrderingMethods module \endlink for the list of 
+  * built-in and external ordering methods. 
+  *
+  * Simple example with key steps 
+  * \code
+  * VectorXd x(n), b(n);
+  * SparseMatrix<double, ColMajor> A;
+  * SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<Index> >   solver;
+  * // fill A and b;
+  * // Compute the ordering permutation vector from the structural pattern of A
+  * solver.analyzePattern(A); 
+  * // Compute the numerical factorization 
+  * solver.factorize(A); 
+  * //Use the factors to solve the linear system 
+  * x = solver.solve(b); 
+  * \endcode
+  * 
+  * \warning The input matrix A should be in a \b compressed and \b column-major form.
+  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
+  * 
+  * \note Unlike the initial SuperLU implementation, there is no step to equilibrate the matrix. 
+  * For badly scaled matrices, this step can be useful to reduce the pivoting during factorization. 
+  * If this is the case for your matrices, you can try the basic scaling method at
+  *  "unsupported/Eigen/src/IterativeSolvers/Scaling.h"
+  * 
+  * \tparam _MatrixType The type of the sparse matrix. It must be a column-major SparseMatrix<>
+  * \tparam _OrderingType The ordering method to use, either AMD, COLAMD or METIS
+  * 
+  * 
+  * \sa \ref TutorialSparseDirectSolvers
+  * \sa \ref OrderingMethods_Module
+  */
+template <typename _MatrixType, typename _OrderingType>
+class SparseLU : public internal::SparseLUImpl<typename _MatrixType::Scalar, typename _MatrixType::Index>
+{
+  public:
+    typedef _MatrixType MatrixType; 
+    typedef _OrderingType OrderingType;
+    typedef typename MatrixType::Scalar Scalar; 
+    typedef typename MatrixType::RealScalar RealScalar; 
+    typedef typename MatrixType::Index Index; 
+    typedef SparseMatrix<Scalar,ColMajor,Index> NCMatrix;
+    typedef internal::MappedSuperNodalMatrix<Scalar, Index> SCMatrix; 
+    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
+    typedef Matrix<Index,Dynamic,1> IndexVector;
+    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;
+    typedef internal::SparseLUImpl<Scalar, Index> Base;
+    
+  public:
+    SparseLU():m_isInitialized(true),m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0)
+    {
+      initperfvalues(); 
+    }
+    SparseLU(const MatrixType& matrix):m_isInitialized(true),m_lastError(""),m_Ustore(0,0,0,0,0,0),m_symmetricmode(false),m_diagpivotthresh(1.0)
+    {
+      initperfvalues(); 
+      compute(matrix);
+    }
+    
+    ~SparseLU()
+    {
+      // Free all explicit dynamic pointers 
+    }
+    
+    void analyzePattern (const MatrixType& matrix);
+    void factorize (const MatrixType& matrix);
+    void simplicialfactorize(const MatrixType& matrix);
+    
+    /**
+     * Compute the symbolic and numeric factorization of the input sparse matrix.
+     * The input matrix should be in column-major storage. 
+     */
+    void compute (const MatrixType& matrix)
+    {
+      // Analyze 
+      analyzePattern(matrix); 
+      //Factorize
+      factorize(matrix);
+    } 
+    
+    inline Index rows() const { return m_mat.rows(); }
+    inline Index cols() const { return m_mat.cols(); }
+    /** Indicate that the pattern of the input matrix is symmetric */
+    void isSymmetric(bool sym)
+    {
+      m_symmetricmode = sym;
+    }
+    
+    /** Returns an expression of the matrix L, internally stored as supernodes 
+     * For a triangular solve with this matrix, use
+     * \code
+     * y = b; matrixL().solveInPlace(y);
+     * \endcode
+     */
+    SparseLUMatrixLReturnType<SCMatrix> matrixL() const
+    {
+      return SparseLUMatrixLReturnType<SCMatrix>(m_Lstore);
+    }
+    /** Set the threshold used for a diagonal entry to be an acceptable pivot. */
+    void setPivotThreshold(const RealScalar& thresh)
+    {
+      m_diagpivotthresh = thresh; 
+    }
+
+    /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+      *
+      * \warning the destination matrix X in X = this->solve(B) must be colmun-major.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<SparseLU, Rhs> solve(const MatrixBase<Rhs>& B) const 
+    {
+      eigen_assert(m_factorizationIsOk && "SparseLU is not initialized."); 
+      eigen_assert(rows()==B.rows()
+                    && "SparseLU::solve(): invalid number of rows of the right hand side matrix B");
+          return internal::solve_retval<SparseLU, Rhs>(*this, B.derived());
+    }
+
+        /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<SparseLU, Rhs> solve(const SparseMatrixBase<Rhs>& B) const 
+    {
+      eigen_assert(m_factorizationIsOk && "SparseLU is not initialized."); 
+      eigen_assert(rows()==B.rows()
+                    && "SparseLU::solve(): invalid number of rows of the right hand side matrix B");
+          return internal::sparse_solve_retval<SparseLU, Rhs>(*this, B.derived());
+    }
+    
+     /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the LU factorization reports a problem, zero diagonal for instance
+      *          \c InvalidInput if the input matrix is invalid
+      *
+      * \sa iparm()          
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+    /**
+     * \returns A string describing the type of error
+     */
+    std::string lastErrorMessage() const
+    {
+      return m_lastError; 
+    }
+    template<typename Rhs, typename Dest>
+    bool _solve(const MatrixBase<Rhs> &B, MatrixBase<Dest> &_X) const
+    {
+      Dest& X(_X.derived());
+      eigen_assert(m_factorizationIsOk && "The matrix should be factorized first");
+      EIGEN_STATIC_ASSERT((Dest::Flags&RowMajorBit)==0,
+                        THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES);
+      
+      
+      Index nrhs = B.cols(); 
+      Index n = B.rows(); 
+      
+      // Permute the right hand side to form X = Pr*B
+      // on return, X is overwritten by the computed solution
+      X.resize(n,nrhs);
+      for(Index j = 0; j < nrhs; ++j)
+        X.col(j) = m_perm_r * B.col(j); 
+      
+      //Forward substitution with L 
+//       m_Lstore.solveInPlace(X);
+        this->matrixL().solveInPlace(X);
+      
+      // Backward solve with U
+      for (Index k = m_Lstore.nsuper(); k >= 0; k--)
+      {
+        Index fsupc = m_Lstore.supToCol()[k];
+        Index lda = m_Lstore.colIndexPtr()[fsupc+1] - m_Lstore.colIndexPtr()[fsupc]; // leading dimension
+        Index nsupc = m_Lstore.supToCol()[k+1] - fsupc; 
+        Index luptr = m_Lstore.colIndexPtr()[fsupc]; 
+        
+        if (nsupc == 1)
+        {
+          for (Index j = 0; j < nrhs; j++)
+          {
+            X(fsupc, j) /= m_Lstore.valuePtr()[luptr]; 
+          }
+        }
+        else 
+        {
+          Map<const Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > A( &(m_Lstore.valuePtr()[luptr]), nsupc, nsupc, OuterStride<>(lda) ); 
+          Map< Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) ); 
+          U = A.template triangularView<Upper>().solve(U); 
+        }
+        
+        for (Index j = 0; j < nrhs; ++j)
+        {
+          for (Index jcol = fsupc; jcol < fsupc + nsupc; jcol++)
+          {
+            typename MappedSparseMatrix<Scalar,ColMajor, Index>::InnerIterator it(m_Ustore, jcol);
+            for ( ; it; ++it)
+            {
+              Index irow = it.index(); 
+              X(irow, j) -= X(jcol, j) * it.value();
+            }
+          }
+        }
+      } // End For U-solve
+      
+      // Permute back the solution 
+      for (Index j = 0; j < nrhs; ++j)
+        X.col(j) = m_perm_c.inverse() * X.col(j); 
+      
+      return true; 
+    }
+
+  protected:
+    // Functions 
+    void initperfvalues()
+    {
+      m_perfv.panel_size = 12; 
+      m_perfv.relax = 1; 
+      m_perfv.maxsuper = 128; 
+      m_perfv.rowblk = 16; 
+      m_perfv.colblk = 8; 
+      m_perfv.fillfactor = 20;  
+    }
+      
+    // Variables 
+    mutable ComputationInfo m_info;
+    bool m_isInitialized;
+    bool m_factorizationIsOk;
+    bool m_analysisIsOk;
+    std::string m_lastError;
+    NCMatrix m_mat; // The input (permuted ) matrix 
+    SCMatrix m_Lstore; // The lower triangular matrix (supernodal)
+    MappedSparseMatrix<Scalar,ColMajor,Index> m_Ustore; // The upper triangular matrix
+    PermutationType m_perm_c; // Column permutation 
+    PermutationType m_perm_r ; // Row permutation
+    IndexVector m_etree; // Column elimination tree 
+    
+    typename Base::GlobalLU_t m_glu; 
+                               
+    // SparseLU options 
+    bool m_symmetricmode;
+    // values for performance 
+    internal::perfvalues<Index> m_perfv; 
+    RealScalar m_diagpivotthresh; // Specifies the threshold used for a diagonal entry to be an acceptable pivot
+    Index m_nnzL, m_nnzU; // Nonzeros in L and U factors 
+    
+  private:
+    // Copy constructor 
+    SparseLU (SparseLU& ) {}
+  
+}; // End class SparseLU
+
+
+// Functions needed by the anaysis phase
+/** 
+ * Compute the column permutation to minimize the fill-in
+ * 
+ *  - Apply this permutation to the input matrix - 
+ * 
+ *  - Compute the column elimination tree on the permuted matrix 
+ * 
+ *  - Postorder the elimination tree and the column permutation
+ * 
+ */
+template <typename MatrixType, typename OrderingType>
+void SparseLU<MatrixType, OrderingType>::analyzePattern(const MatrixType& mat)
+{
+  
+  //TODO  It is possible as in SuperLU to compute row and columns scaling vectors to equilibrate the matrix mat.
+  
+  OrderingType ord; 
+  ord(mat,m_perm_c);
+  
+  // Apply the permutation to the column of the input  matrix
+  //First copy the whole input matrix. 
+  m_mat = mat;
+  if (m_perm_c.size()) {
+    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers. FIXME : This vector is filled but not subsequently used.  
+    //Then, permute only the column pointers
+    for (Index i = 0; i < mat.cols(); i++)
+    {
+      m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = mat.outerIndexPtr()[i]; 
+      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = mat.outerIndexPtr()[i+1] - mat.outerIndexPtr()[i]; 
+    }
+  }
+  // Compute the column elimination tree of the permuted matrix 
+  IndexVector firstRowElt;
+  internal::coletree(m_mat, m_etree,firstRowElt); 
+     
+  // In symmetric mode, do not do postorder here
+  if (!m_symmetricmode) {
+    IndexVector post, iwork; 
+    // Post order etree
+    internal::treePostorder(m_mat.cols(), m_etree, post); 
+      
+   
+    // Renumber etree in postorder 
+    Index m = m_mat.cols(); 
+    iwork.resize(m+1);
+    for (Index i = 0; i < m; ++i) iwork(post(i)) = post(m_etree(i));
+    m_etree = iwork;
+    
+    // Postmultiply A*Pc by post, i.e reorder the matrix according to the postorder of the etree
+    PermutationType post_perm(m); 
+    for (Index i = 0; i < m; i++) 
+      post_perm.indices()(i) = post(i); 
+        
+    // Combine the two permutations : postorder the permutation for future use
+    if(m_perm_c.size()) {
+      m_perm_c = post_perm * m_perm_c;
+    }
+    
+  } // end postordering 
+  
+  m_analysisIsOk = true; 
+}
+
+// Functions needed by the numerical factorization phase
+
+
+/** 
+ *  - Numerical factorization 
+ *  - Interleaved with the symbolic factorization 
+ * On exit,  info is 
+ * 
+ *    = 0: successful factorization
+ * 
+ *    > 0: if info = i, and i is
+ * 
+ *       <= A->ncol: U(i,i) is exactly zero. The factorization has
+ *          been completed, but the factor U is exactly singular,
+ *          and division by zero will occur if it is used to solve a
+ *          system of equations.
+ * 
+ *       > A->ncol: number of bytes allocated when memory allocation
+ *         failure occurred, plus A->ncol. If lwork = -1, it is
+ *         the estimated amount of space needed, plus A->ncol.  
+ */
+template <typename MatrixType, typename OrderingType>
+void SparseLU<MatrixType, OrderingType>::factorize(const MatrixType& matrix)
+{
+  using internal::emptyIdxLU;
+  eigen_assert(m_analysisIsOk && "analyzePattern() should be called first"); 
+  eigen_assert((matrix.rows() == matrix.cols()) && "Only for squared matrices");
+  
+  typedef typename IndexVector::Scalar Index; 
+  
+  
+  // Apply the column permutation computed in analyzepattern()
+  //   m_mat = matrix * m_perm_c.inverse(); 
+  m_mat = matrix;
+  if (m_perm_c.size()) 
+  {
+    m_mat.uncompress(); //NOTE: The effect of this command is only to create the InnerNonzeros pointers.
+    //Then, permute only the column pointers
+    for (Index i = 0; i < matrix.cols(); i++)
+    {
+      m_mat.outerIndexPtr()[m_perm_c.indices()(i)] = matrix.outerIndexPtr()[i]; 
+      m_mat.innerNonZeroPtr()[m_perm_c.indices()(i)] = matrix.outerIndexPtr()[i+1] - matrix.outerIndexPtr()[i]; 
+    }
+  } 
+  else 
+  { //FIXME This should not be needed if the empty permutation is handled transparently
+    m_perm_c.resize(matrix.cols());
+    for(Index i = 0; i < matrix.cols(); ++i) m_perm_c.indices()(i) = i;
+  }
+  
+  Index m = m_mat.rows();
+  Index n = m_mat.cols();
+  Index nnz = m_mat.nonZeros();
+  Index maxpanel = m_perfv.panel_size * m;
+  // Allocate working storage common to the factor routines
+  Index lwork = 0;
+  Index info = Base::memInit(m, n, nnz, lwork, m_perfv.fillfactor, m_perfv.panel_size, m_glu); 
+  if (info) 
+  {
+    m_lastError = "UNABLE TO ALLOCATE WORKING MEMORY\n\n" ;
+    m_factorizationIsOk = false;
+    return ; 
+  }
+  
+  // Set up pointers for integer working arrays 
+  IndexVector segrep(m); segrep.setZero();
+  IndexVector parent(m); parent.setZero();
+  IndexVector xplore(m); xplore.setZero();
+  IndexVector repfnz(maxpanel);
+  IndexVector panel_lsub(maxpanel);
+  IndexVector xprune(n); xprune.setZero();
+  IndexVector marker(m*internal::LUNoMarker); marker.setZero();
+  
+  repfnz.setConstant(-1); 
+  panel_lsub.setConstant(-1);
+  
+  // Set up pointers for scalar working arrays 
+  ScalarVector dense; 
+  dense.setZero(maxpanel);
+  ScalarVector tempv; 
+  tempv.setZero(internal::LUnumTempV(m, m_perfv.panel_size, m_perfv.maxsuper, /*m_perfv.rowblk*/m) );
+  
+  // Compute the inverse of perm_c
+  PermutationType iperm_c(m_perm_c.inverse()); 
+  
+  // Identify initial relaxed snodes
+  IndexVector relax_end(n);
+  if ( m_symmetricmode == true ) 
+    Base::heap_relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
+  else
+    Base::relax_snode(n, m_etree, m_perfv.relax, marker, relax_end);
+  
+  
+  m_perm_r.resize(m); 
+  m_perm_r.indices().setConstant(-1);
+  marker.setConstant(-1);
+  
+  m_glu.supno(0) = emptyIdxLU; m_glu.xsup.setConstant(0);
+  m_glu.xsup(0) = m_glu.xlsub(0) = m_glu.xusub(0) = m_glu.xlusup(0) = Index(0);
+  
+  // Work on one 'panel' at a time. A panel is one of the following :
+  //  (a) a relaxed supernode at the bottom of the etree, or
+  //  (b) panel_size contiguous columns, <panel_size> defined by the user
+  Index jcol; 
+  IndexVector panel_histo(n);
+  Index pivrow; // Pivotal row number in the original row matrix
+  Index nseg1; // Number of segments in U-column above panel row jcol
+  Index nseg; // Number of segments in each U-column 
+  Index irep; 
+  Index i, k, jj; 
+  for (jcol = 0; jcol < n; )
+  {
+    // Adjust panel size so that a panel won't overlap with the next relaxed snode. 
+    Index panel_size = m_perfv.panel_size; // upper bound on panel width
+    for (k = jcol + 1; k < (std::min)(jcol+panel_size, n); k++)
+    {
+      if (relax_end(k) != emptyIdxLU) 
+      {
+        panel_size = k - jcol; 
+        break; 
+      }
+    }
+    if (k == n) 
+      panel_size = n - jcol; 
+      
+    // Symbolic outer factorization on a panel of columns 
+    Base::panel_dfs(m, panel_size, jcol, m_mat, m_perm_r.indices(), nseg1, dense, panel_lsub, segrep, repfnz, xprune, marker, parent, xplore, m_glu); 
+    
+    // Numeric sup-panel updates in topological order 
+    Base::panel_bmod(m, panel_size, jcol, nseg1, dense, tempv, segrep, repfnz, m_glu); 
+    
+    // Sparse LU within the panel, and below the panel diagonal 
+    for ( jj = jcol; jj< jcol + panel_size; jj++) 
+    {
+      k = (jj - jcol) * m; // Column index for w-wide arrays 
+      
+      nseg = nseg1; // begin after all the panel segments
+      //Depth-first-search for the current column
+      VectorBlock<IndexVector> panel_lsubk(panel_lsub, k, m);
+      VectorBlock<IndexVector> repfnz_k(repfnz, k, m); 
+      info = Base::column_dfs(m, jj, m_perm_r.indices(), m_perfv.maxsuper, nseg, panel_lsubk, segrep, repfnz_k, xprune, marker, parent, xplore, m_glu); 
+      if ( info ) 
+      {
+        m_lastError =  "UNABLE TO EXPAND MEMORY IN COLUMN_DFS() ";
+        m_info = NumericalIssue; 
+        m_factorizationIsOk = false; 
+        return; 
+      }
+      // Numeric updates to this column 
+      VectorBlock<ScalarVector> dense_k(dense, k, m); 
+      VectorBlock<IndexVector> segrep_k(segrep, nseg1, m-nseg1); 
+      info = Base::column_bmod(jj, (nseg - nseg1), dense_k, tempv, segrep_k, repfnz_k, jcol, m_glu); 
+      if ( info ) 
+      {
+        m_lastError = "UNABLE TO EXPAND MEMORY IN COLUMN_BMOD() ";
+        m_info = NumericalIssue; 
+        m_factorizationIsOk = false; 
+        return; 
+      }
+      
+      // Copy the U-segments to ucol(*)
+      info = Base::copy_to_ucol(jj, nseg, segrep, repfnz_k ,m_perm_r.indices(), dense_k, m_glu); 
+      if ( info ) 
+      {
+        m_lastError = "UNABLE TO EXPAND MEMORY IN COPY_TO_UCOL() ";
+        m_info = NumericalIssue; 
+        m_factorizationIsOk = false; 
+        return; 
+      }
+      
+      // Form the L-segment 
+      info = Base::pivotL(jj, m_diagpivotthresh, m_perm_r.indices(), iperm_c.indices(), pivrow, m_glu);
+      if ( info ) 
+      {
+        m_lastError = "THE MATRIX IS STRUCTURALLY SINGULAR ... ZERO COLUMN AT ";
+        std::ostringstream returnInfo;
+        returnInfo << info; 
+        m_lastError += returnInfo.str();
+        m_info = NumericalIssue; 
+        m_factorizationIsOk = false; 
+        return; 
+      }
+      
+      // Prune columns (0:jj-1) using column jj
+      Base::pruneL(jj, m_perm_r.indices(), pivrow, nseg, segrep, repfnz_k, xprune, m_glu); 
+      
+      // Reset repfnz for this column 
+      for (i = 0; i < nseg; i++)
+      {
+        irep = segrep(i); 
+        repfnz_k(irep) = emptyIdxLU; 
+      }
+    } // end SparseLU within the panel  
+    jcol += panel_size;  // Move to the next panel
+  } // end for -- end elimination 
+  
+  // Count the number of nonzeros in factors 
+  Base::countnz(n, m_nnzL, m_nnzU, m_glu); 
+  // Apply permutation  to the L subscripts 
+  Base::fixupL(n, m_perm_r.indices(), m_glu); 
+  
+  // Create supernode matrix L 
+  m_Lstore.setInfos(m, n, m_glu.lusup, m_glu.xlusup, m_glu.lsub, m_glu.xlsub, m_glu.supno, m_glu.xsup); 
+  // Create the column major upper sparse matrix  U; 
+  new (&m_Ustore) MappedSparseMatrix<Scalar, ColMajor, Index> ( m, n, m_nnzU, m_glu.xusub.data(), m_glu.usub.data(), m_glu.ucol.data() ); 
+  
+  m_info = Success;
+  m_factorizationIsOk = true;
+}
+
+template<typename MappedSupernodalType>
+struct SparseLUMatrixLReturnType
+{
+  typedef typename MappedSupernodalType::Index Index;
+  typedef typename MappedSupernodalType::Scalar Scalar;
+  SparseLUMatrixLReturnType(const MappedSupernodalType& mapL) : m_mapL(mapL)
+  { }
+  Index rows() { return m_mapL.rows(); }
+  Index cols() { return m_mapL.cols(); }
+  template<typename Dest>
+  void solveInPlace( MatrixBase<Dest> &X) const
+  {
+    m_mapL.solveInPlace(X);
+  }
+  const MappedSupernodalType& m_mapL;
+};
+
+namespace internal {
+  
+template<typename _MatrixType, typename Derived, typename Rhs>
+struct solve_retval<SparseLU<_MatrixType,Derived>, Rhs>
+  : solve_retval_base<SparseLU<_MatrixType,Derived>, Rhs>
+{
+  typedef SparseLU<_MatrixType,Derived> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+template<typename _MatrixType, typename Derived, typename Rhs>
+struct sparse_solve_retval<SparseLU<_MatrixType,Derived>, Rhs>
+  : sparse_solve_retval_base<SparseLU<_MatrixType,Derived>, Rhs>
+{
+  typedef SparseLU<_MatrixType,Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+} // end namespace internal
+
+} // End namespace Eigen 
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLUImpl.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLUImpl.h
new file mode 100644
index 0000000..14d7089
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLUImpl.h
@@ -0,0 +1,64 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#ifndef SPARSELU_IMPL_H
+#define SPARSELU_IMPL_H
+
+namespace Eigen {
+namespace internal {
+  
+/** \ingroup SparseLU_Module
+  * \class SparseLUImpl
+  * Base class for sparseLU
+  */
+template <typename Scalar, typename Index>
+class SparseLUImpl
+{
+  public:
+    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
+    typedef Matrix<Index,Dynamic,1> IndexVector; 
+    typedef typename ScalarVector::RealScalar RealScalar; 
+    typedef Ref<Matrix<Scalar,Dynamic,1> > BlockScalarVector;
+    typedef Ref<Matrix<Index,Dynamic,1> > BlockIndexVector;
+    typedef LU_GlobalLU_t<IndexVector, ScalarVector> GlobalLU_t; 
+    typedef SparseMatrix<Scalar,ColMajor,Index> MatrixType; 
+    
+  protected:
+     template <typename VectorType>
+     Index expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions);
+     Index memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu); 
+     template <typename VectorType>
+     Index memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions);
+     void heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); 
+     void relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end); 
+     Index snode_dfs(const Index jcol, const Index kcol,const MatrixType& mat,  IndexVector& xprune, IndexVector& marker, GlobalLU_t& glu); 
+     Index snode_bmod (const Index jcol, const Index fsupc, ScalarVector& dense, GlobalLU_t& glu);
+     Index pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu);
+     template <typename Traits>
+     void dfs_kernel(const Index jj, IndexVector& perm_r,
+                    Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,
+                    Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,
+                    IndexVector& xplore, GlobalLU_t& glu, Index& nextl_col, Index krow, Traits& traits);
+     void panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
+    
+     void panel_bmod(const Index m, const Index w, const Index jcol, const Index nseg, ScalarVector& dense, ScalarVector& tempv, IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu);
+     Index column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,  BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu);
+     Index column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv, BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu); 
+     Index copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu); 
+     void pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu);
+     void countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu); 
+     void fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu); 
+     
+     template<typename , typename >
+     friend struct column_dfs_traits;
+}; 
+
+} // end namespace internal
+} // namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Memory.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Memory.h
new file mode 100644
index 0000000..6d9570d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Memory.h
@@ -0,0 +1,222 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]memory.c files in SuperLU 
+ 
+ * -- SuperLU routine (version 3.1) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * August 1, 2008
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+
+#ifndef EIGEN_SPARSELU_MEMORY
+#define EIGEN_SPARSELU_MEMORY
+
+namespace Eigen {
+namespace internal {
+  
+enum { LUNoMarker = 3 };
+enum {emptyIdxLU = -1};
+template<typename Index>
+inline Index LUnumTempV(Index& m, Index& w, Index& t, Index& b)
+{
+  return (std::max)(m, (t+b)*w);
+}
+
+template< typename Scalar, typename Index>
+inline Index LUTempSpace(Index&m, Index& w)
+{
+  return (2*w + 4 + LUNoMarker) * m * sizeof(Index) + (w + 1) * m * sizeof(Scalar);
+}
+
+
+
+
+/** 
+  * Expand the existing storage to accomodate more fill-ins
+  * \param vec Valid pointer to the vector to allocate or expand
+  * \param[in,out] length  At input, contain the current length of the vector that is to be increased. At output, length of the newly allocated vector
+  * \param[in] nbElts Current number of elements in the factors
+  * \param keep_prev  1: use length  and do not expand the vector; 0: compute new_len and expand
+  * \param[in,out] num_expansions Number of times the memory has been expanded
+  */
+template <typename Scalar, typename Index>
+template <typename VectorType>
+Index  SparseLUImpl<Scalar,Index>::expand(VectorType& vec, Index& length, Index nbElts, Index keep_prev, Index& num_expansions) 
+{
+  
+  float alpha = 1.5; // Ratio of the memory increase 
+  Index new_len; // New size of the allocated memory
+  
+  if(num_expansions == 0 || keep_prev) 
+    new_len = length ; // First time allocate requested
+  else 
+    new_len = alpha * length ;
+  
+  VectorType old_vec; // Temporary vector to hold the previous values   
+  if (nbElts > 0 )
+    old_vec = vec.segment(0,nbElts); 
+  
+  //Allocate or expand the current vector
+  try 
+  {
+    vec.resize(new_len); 
+  }
+  catch(std::bad_alloc& )
+  {
+    if ( !num_expansions )
+    {
+      // First time to allocate from LUMemInit()
+      throw; // Pass the exception to LUMemInit() which has a try... catch block
+    }
+    if (keep_prev)
+    {
+      // In this case, the memory length should not not be reduced
+      return new_len;
+    }
+    else 
+    {
+      // Reduce the size and increase again 
+      Index tries = 0; // Number of attempts
+      do 
+      {
+        alpha = (alpha + 1)/2;
+        new_len = alpha * length ; 
+        try
+        {
+          vec.resize(new_len); 
+        }
+        catch(std::bad_alloc& )
+        {
+          tries += 1; 
+          if ( tries > 10) return new_len; 
+        }
+      } while (!vec.size());
+    }
+  }
+  //Copy the previous values to the newly allocated space 
+  if (nbElts > 0)
+    vec.segment(0, nbElts) = old_vec;   
+   
+  
+  length  = new_len;
+  if(num_expansions) ++num_expansions;
+  return 0; 
+}
+
+/**
+ * \brief  Allocate various working space for the numerical factorization phase.
+ * \param m number of rows of the input matrix 
+ * \param n number of columns 
+ * \param annz number of initial nonzeros in the matrix 
+ * \param lwork  if lwork=-1, this routine returns an estimated size of the required memory
+ * \param glu persistent data to facilitate multiple factors : will be deleted later ??
+ * \param fillratio estimated ratio of fill in the factors
+ * \param panel_size Size of a panel
+ * \return an estimated size of the required memory if lwork = -1; otherwise, return the size of actually allocated memory when allocation failed, and 0 on success
+ * \note Unlike SuperLU, this routine does not support successive factorization with the same pattern and the same row permutation
+ */
+template <typename Scalar, typename Index>
+Index SparseLUImpl<Scalar,Index>::memInit(Index m, Index n, Index annz, Index lwork, Index fillratio, Index panel_size,  GlobalLU_t& glu)
+{
+  Index& num_expansions = glu.num_expansions; //No memory expansions so far
+  num_expansions = 0; 
+  glu.nzumax = glu.nzlumax = (std::max)(fillratio * annz, m*n); // estimated number of nonzeros in U 
+  glu.nzlmax  = (std::max)(1., fillratio/4.) * annz; // estimated  nnz in L factor
+
+  // Return the estimated size to the user if necessary
+  Index tempSpace;
+  tempSpace = (2*panel_size + 4 + LUNoMarker) * m * sizeof(Index) + (panel_size + 1) * m * sizeof(Scalar);
+  if (lwork == emptyIdxLU) 
+  {
+    Index estimated_size;
+    estimated_size = (5 * n + 5) * sizeof(Index)  + tempSpace
+                    + (glu.nzlmax + glu.nzumax) * sizeof(Index) + (glu.nzlumax+glu.nzumax) *  sizeof(Scalar) + n; 
+    return estimated_size;
+  }
+  
+  // Setup the required space 
+  
+  // First allocate Integer pointers for L\U factors
+  glu.xsup.resize(n+1);
+  glu.supno.resize(n+1);
+  glu.xlsub.resize(n+1);
+  glu.xlusup.resize(n+1);
+  glu.xusub.resize(n+1);
+
+  // Reserve memory for L/U factors
+  do 
+  {
+    try
+    {
+      expand<ScalarVector>(glu.lusup, glu.nzlumax, 0, 0, num_expansions); 
+      expand<ScalarVector>(glu.ucol,glu.nzumax, 0, 0, num_expansions); 
+      expand<IndexVector>(glu.lsub,glu.nzlmax, 0, 0, num_expansions); 
+      expand<IndexVector>(glu.usub,glu.nzumax, 0, 1, num_expansions); 
+    }
+    catch(std::bad_alloc& )
+    {
+      //Reduce the estimated size and retry
+      glu.nzlumax /= 2;
+      glu.nzumax /= 2;
+      glu.nzlmax /= 2;
+      if (glu.nzlumax < annz ) return glu.nzlumax; 
+    }
+    
+  } while (!glu.lusup.size() || !glu.ucol.size() || !glu.lsub.size() || !glu.usub.size());
+
+  
+  
+  ++num_expansions;
+  return 0;
+  
+} // end LuMemInit
+
+/** 
+ * \brief Expand the existing storage 
+ * \param vec vector to expand 
+ * \param[in,out] maxlen On input, previous size of vec (Number of elements to copy ). on output, new size
+ * \param nbElts current number of elements in the vector.
+ * \param memtype Type of the element to expand
+ * \param num_expansions Number of expansions 
+ * \return 0 on success, > 0 size of the memory allocated so far
+ */
+template <typename Scalar, typename Index>
+template <typename VectorType>
+Index SparseLUImpl<Scalar,Index>::memXpand(VectorType& vec, Index& maxlen, Index nbElts, MemType memtype, Index& num_expansions)
+{
+  Index failed_size; 
+  if (memtype == USUB)
+     failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 1, num_expansions);
+  else
+    failed_size = this->expand<VectorType>(vec, maxlen, nbElts, 0, num_expansions);
+
+  if (failed_size)
+    return failed_size; 
+  
+  return 0 ;  
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // EIGEN_SPARSELU_MEMORY
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Structs.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Structs.h
new file mode 100644
index 0000000..24d6bf1
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Structs.h
@@ -0,0 +1,111 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ * NOTE: This file comes from a partly modified version of files slu_[s,d,c,z]defs.h
+ * -- SuperLU routine (version 4.1) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November, 2010
+ * 
+ * Global data structures used in LU factorization -
+ * 
+ *   nsuper: #supernodes = nsuper + 1, numbered [0, nsuper].
+ *   (xsup,supno): supno[i] is the supernode no to which i belongs;
+ *  xsup(s) points to the beginning of the s-th supernode.
+ *  e.g.   supno 0 1 2 2 3 3 3 4 4 4 4 4   (n=12)
+ *          xsup 0 1 2 4 7 12
+ *  Note: dfs will be performed on supernode rep. relative to the new 
+ *        row pivoting ordering
+ *
+ *   (xlsub,lsub): lsub[*] contains the compressed subscript of
+ *  rectangular supernodes; xlsub[j] points to the starting
+ *  location of the j-th column in lsub[*]. Note that xlsub 
+ *  is indexed by column.
+ *  Storage: original row subscripts
+ *
+ *      During the course of sparse LU factorization, we also use
+ *  (xlsub,lsub) for the purpose of symmetric pruning. For each
+ *  supernode {s,s+1,...,t=s+r} with first column s and last
+ *  column t, the subscript set
+ *    lsub[j], j=xlsub[s], .., xlsub[s+1]-1
+ *  is the structure of column s (i.e. structure of this supernode).
+ *  It is used for the storage of numerical values.
+ *  Furthermore,
+ *    lsub[j], j=xlsub[t], .., xlsub[t+1]-1
+ *  is the structure of the last column t of this supernode.
+ *  It is for the purpose of symmetric pruning. Therefore, the
+ *  structural subscripts can be rearranged without making physical
+ *  interchanges among the numerical values.
+ *
+ *  However, if the supernode has only one column, then we
+ *  only keep one set of subscripts. For any subscript interchange
+ *  performed, similar interchange must be done on the numerical
+ *  values.
+ *
+ *  The last column structures (for pruning) will be removed
+ *  after the numercial LU factorization phase.
+ *
+ *   (xlusup,lusup): lusup[*] contains the numerical values of the
+ *  rectangular supernodes; xlusup[j] points to the starting
+ *  location of the j-th column in storage vector lusup[*]
+ *  Note: xlusup is indexed by column.
+ *  Each rectangular supernode is stored by column-major
+ *  scheme, consistent with Fortran 2-dim array storage.
+ *
+ *   (xusub,ucol,usub): ucol[*] stores the numerical values of
+ *  U-columns outside the rectangular supernodes. The row
+ *  subscript of nonzero ucol[k] is stored in usub[k].
+ *  xusub[i] points to the starting location of column i in ucol.
+ *  Storage: new row subscripts; that is subscripts of PA.
+ */
+
+#ifndef EIGEN_LU_STRUCTS
+#define EIGEN_LU_STRUCTS
+namespace Eigen {
+namespace internal {
+  
+typedef enum {LUSUP, UCOL, LSUB, USUB, LLVL, ULVL} MemType; 
+
+template <typename IndexVector, typename ScalarVector>
+struct LU_GlobalLU_t {
+  typedef typename IndexVector::Scalar Index; 
+  IndexVector xsup; //First supernode column ... xsup(s) points to the beginning of the s-th supernode
+  IndexVector supno; // Supernode number corresponding to this column (column to supernode mapping)
+  ScalarVector  lusup; // nonzero values of L ordered by columns 
+  IndexVector lsub; // Compressed row indices of L rectangular supernodes. 
+  IndexVector xlusup; // pointers to the beginning of each column in lusup
+  IndexVector xlsub; // pointers to the beginning of each column in lsub
+  Index   nzlmax; // Current max size of lsub
+  Index   nzlumax; // Current max size of lusup
+  ScalarVector  ucol; // nonzero values of U ordered by columns 
+  IndexVector usub; // row indices of U columns in ucol
+  IndexVector xusub; // Pointers to the beginning of each column of U in ucol 
+  Index   nzumax; // Current max size of ucol
+  Index   n; // Number of columns in the matrix  
+  Index   num_expansions; 
+};
+
+// Values to set for performance
+template <typename Index>
+struct perfvalues {
+  Index panel_size; // a panel consists of at most <panel_size> consecutive columns
+  Index relax; // To control degree of relaxing supernodes. If the number of nodes (columns) 
+                // in a subtree of the elimination tree is less than relax, this subtree is considered 
+                // as one supernode regardless of the row structures of those columns
+  Index maxsuper; // The maximum size for a supernode in complete LU
+  Index rowblk; // The minimum row dimension for 2-D blocking to be used;
+  Index colblk; // The minimum column dimension for 2-D blocking to be used;
+  Index fillfactor; // The estimated fills factors for L and U, compared with A
+}; 
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // EIGEN_LU_STRUCTS
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h
new file mode 100644
index 0000000..3eae954
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_SupernodalMatrix.h
@@ -0,0 +1,294 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSELU_SUPERNODAL_MATRIX_H
+#define EIGEN_SPARSELU_SUPERNODAL_MATRIX_H
+
+namespace Eigen {
+namespace internal {
+
+/** \ingroup SparseLU_Module
+ * \brief a class to manipulate the L supernodal factor from the SparseLU factorization
+ * 
+ * This class  contain the data to easily store 
+ * and manipulate the supernodes during the factorization and solution phase of Sparse LU. 
+ * Only the lower triangular matrix has supernodes.
+ * 
+ * NOTE : This class corresponds to the SCformat structure in SuperLU
+ * 
+ */
+/* TODO
+ * InnerIterator as for sparsematrix 
+ * SuperInnerIterator to iterate through all supernodes 
+ * Function for triangular solve
+ */
+template <typename _Scalar, typename _Index>
+class MappedSuperNodalMatrix
+{
+  public:
+    typedef _Scalar Scalar; 
+    typedef _Index Index;
+    typedef Matrix<Index,Dynamic,1> IndexVector; 
+    typedef Matrix<Scalar,Dynamic,1> ScalarVector;
+  public:
+    MappedSuperNodalMatrix()
+    {
+      
+    }
+    MappedSuperNodalMatrix(Index m, Index n,  ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind, 
+             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )
+    {
+      setInfos(m, n, nzval, nzval_colptr, rowind, rowind_colptr, col_to_sup, sup_to_col);
+    }
+    
+    ~MappedSuperNodalMatrix()
+    {
+      
+    }
+    /**
+     * Set appropriate pointers for the lower triangular supernodal matrix
+     * These infos are available at the end of the numerical factorization
+     * FIXME This class will be modified such that it can be use in the course 
+     * of the factorization.
+     */
+    void setInfos(Index m, Index n, ScalarVector& nzval, IndexVector& nzval_colptr, IndexVector& rowind, 
+             IndexVector& rowind_colptr, IndexVector& col_to_sup, IndexVector& sup_to_col )
+    {
+      m_row = m;
+      m_col = n; 
+      m_nzval = nzval.data(); 
+      m_nzval_colptr = nzval_colptr.data(); 
+      m_rowind = rowind.data(); 
+      m_rowind_colptr = rowind_colptr.data(); 
+      m_nsuper = col_to_sup(n); 
+      m_col_to_sup = col_to_sup.data(); 
+      m_sup_to_col = sup_to_col.data(); 
+    }
+    
+    /**
+     * Number of rows
+     */
+    Index rows() { return m_row; }
+    
+    /**
+     * Number of columns
+     */
+    Index cols() { return m_col; }
+    
+    /**
+     * Return the array of nonzero values packed by column
+     * 
+     * The size is nnz
+     */
+    Scalar* valuePtr() {  return m_nzval; }
+    
+    const Scalar* valuePtr() const 
+    {
+      return m_nzval; 
+    }
+    /**
+     * Return the pointers to the beginning of each column in \ref valuePtr()
+     */
+    Index* colIndexPtr()
+    {
+      return m_nzval_colptr; 
+    }
+    
+    const Index* colIndexPtr() const
+    {
+      return m_nzval_colptr; 
+    }
+    
+    /**
+     * Return the array of compressed row indices of all supernodes
+     */
+    Index* rowIndex()  { return m_rowind; }
+    
+    const Index* rowIndex() const
+    {
+      return m_rowind; 
+    }
+    
+    /**
+     * Return the location in \em rowvaluePtr() which starts each column
+     */
+    Index* rowIndexPtr() { return m_rowind_colptr; }
+    
+    const Index* rowIndexPtr() const 
+    {
+      return m_rowind_colptr; 
+    }
+    
+    /** 
+     * Return the array of column-to-supernode mapping 
+     */
+    Index* colToSup()  { return m_col_to_sup; }
+    
+    const Index* colToSup() const
+    {
+      return m_col_to_sup;       
+    }
+    /**
+     * Return the array of supernode-to-column mapping
+     */
+    Index* supToCol() { return m_sup_to_col; }
+    
+    const Index* supToCol() const 
+    {
+      return m_sup_to_col;
+    }
+    
+    /**
+     * Return the number of supernodes
+     */
+    Index nsuper() const 
+    {
+      return m_nsuper; 
+    }
+    
+    class InnerIterator; 
+    template<typename Dest>
+    void solveInPlace( MatrixBase<Dest>&X) const;
+    
+      
+      
+    
+  protected:
+    Index m_row; // Number of rows
+    Index m_col; // Number of columns 
+    Index m_nsuper; // Number of supernodes 
+    Scalar* m_nzval; //array of nonzero values packed by column
+    Index* m_nzval_colptr; //nzval_colptr[j] Stores the location in nzval[] which starts column j 
+    Index* m_rowind; // Array of compressed row indices of rectangular supernodes
+    Index* m_rowind_colptr; //rowind_colptr[j] stores the location in rowind[] which starts column j
+    Index* m_col_to_sup; // col_to_sup[j] is the supernode number to which column j belongs
+    Index* m_sup_to_col; //sup_to_col[s] points to the starting column of the s-th supernode
+    
+  private :
+};
+
+/**
+  * \brief InnerIterator class to iterate over nonzero values of the current column in the supernodal matrix L
+  * 
+  */
+template<typename Scalar, typename Index>
+class MappedSuperNodalMatrix<Scalar,Index>::InnerIterator
+{
+  public:
+     InnerIterator(const MappedSuperNodalMatrix& mat, Index outer)
+      : m_matrix(mat),
+        m_outer(outer), 
+        m_supno(mat.colToSup()[outer]),
+        m_idval(mat.colIndexPtr()[outer]),
+        m_startidval(m_idval),
+        m_endidval(mat.colIndexPtr()[outer+1]),
+        m_idrow(mat.rowIndexPtr()[outer])
+    {}
+    inline InnerIterator& operator++()
+    { 
+      m_idval++; 
+      m_idrow++;
+      return *this; 
+    }
+    inline Scalar value() const { return m_matrix.valuePtr()[m_idval]; }
+    
+    inline Scalar& valueRef() { return const_cast<Scalar&>(m_matrix.valuePtr()[m_idval]); }
+    
+    inline Index index() const { return m_matrix.rowIndex()[m_idrow]; }
+    inline Index row() const { return index(); }
+    inline Index col() const { return m_outer; }
+    
+    inline Index supIndex() const { return m_supno; }
+    
+    inline operator bool() const 
+    { 
+      return ( (m_idval < m_endidval) && (m_idval >= m_startidval) );
+    }
+    
+  protected:
+    const MappedSuperNodalMatrix& m_matrix; // Supernodal lower triangular matrix 
+    const Index m_outer; // Current column 
+    const Index m_supno; // Current SuperNode number
+    Index m_idval; //Index to browse the values in the current column
+    const Index m_startidval; // Start of the column value
+    const Index m_endidval; // End of the column value
+    Index m_idrow;  //Index to browse the row indices 
+};
+
+/**
+ * \brief Solve with the supernode triangular matrix
+ * 
+ */
+template<typename Scalar, typename Index>
+template<typename Dest>
+void MappedSuperNodalMatrix<Scalar,Index>::solveInPlace( MatrixBase<Dest>&X) const
+{
+    Index n = X.rows(); 
+    Index nrhs = X.cols(); 
+    const Scalar * Lval = valuePtr(); // Nonzero values 
+    Matrix<Scalar,Dynamic,Dynamic> work(n, nrhs); // working vector
+    work.setZero();
+    for (Index k = 0; k <= nsuper(); k ++)
+    {
+      Index fsupc = supToCol()[k]; // First column of the current supernode 
+      Index istart = rowIndexPtr()[fsupc];  // Pointer index to the subscript of the current column
+      Index nsupr = rowIndexPtr()[fsupc+1] - istart;  // Number of rows in the current supernode
+      Index nsupc = supToCol()[k+1] - fsupc;  // Number of columns in the current supernode
+      Index nrow = nsupr - nsupc; // Number of rows in the non-diagonal part of the supernode
+      Index irow; //Current index row
+      
+      if (nsupc == 1 )
+      {
+        for (Index j = 0; j < nrhs; j++)
+        {
+          InnerIterator it(*this, fsupc); 
+          ++it; // Skip the diagonal element
+          for (; it; ++it)
+          {
+            irow = it.row();
+            X(irow, j) -= X(fsupc, j) * it.value(); 
+          }
+        }
+      }
+      else 
+      {
+        // The supernode has more than one column 
+        Index luptr = colIndexPtr()[fsupc]; 
+        Index lda = colIndexPtr()[fsupc+1] - luptr;
+        
+        // Triangular solve 
+        Map<const Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > A( &(Lval[luptr]), nsupc, nsupc, OuterStride<>(lda) ); 
+        Map< Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > U (&(X(fsupc,0)), nsupc, nrhs, OuterStride<>(n) ); 
+        U = A.template triangularView<UnitLower>().solve(U); 
+        
+        // Matrix-vector product 
+        new (&A) Map<const Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > ( &(Lval[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) ); 
+        work.block(0, 0, nrow, nrhs) = A * U; 
+        
+        //Begin Scatter 
+        for (Index j = 0; j < nrhs; j++)
+        {
+          Index iptr = istart + nsupc; 
+          for (Index i = 0; i < nrow; i++)
+          {
+            irow = rowIndex()[iptr]; 
+            X(irow, j) -= work(i, j); // Scatter operation
+            work(i, j) = Scalar(0); 
+            iptr++;
+          }
+        }
+      }
+    } 
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // EIGEN_SPARSELU_MATRIX_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Utils.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Utils.h
new file mode 100644
index 0000000..15352ac
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_Utils.h
@@ -0,0 +1,80 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#ifndef EIGEN_SPARSELU_UTILS_H
+#define EIGEN_SPARSELU_UTILS_H
+
+namespace Eigen {
+namespace internal {
+
+/**
+ * \brief Count Nonzero elements in the factors
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu)
+{
+ nnzL = 0; 
+ nnzU = (glu.xusub)(n); 
+ Index nsuper = (glu.supno)(n); 
+ Index jlen; 
+ Index i, j, fsupc;
+ if (n <= 0 ) return; 
+ // For each supernode
+ for (i = 0; i <= nsuper; i++)
+ {
+   fsupc = glu.xsup(i); 
+   jlen = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
+   
+   for (j = fsupc; j < glu.xsup(i+1); j++)
+   {
+     nnzL += jlen; 
+     nnzU += j - fsupc + 1; 
+     jlen--; 
+   }
+ }
+}
+
+/**
+ * \brief Fix up the data storage lsub for L-subscripts. 
+ * 
+ * It removes the subscripts sets for structural pruning, 
+ * and applies permutation to the remaining subscripts
+ * 
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu)
+{
+  Index fsupc, i, j, k, jstart; 
+  
+  Index nextl = 0; 
+  Index nsuper = (glu.supno)(n); 
+  
+  // For each supernode 
+  for (i = 0; i <= nsuper; i++)
+  {
+    fsupc = glu.xsup(i); 
+    jstart = glu.xlsub(fsupc); 
+    glu.xlsub(fsupc) = nextl; 
+    for (j = jstart; j < glu.xlsub(fsupc + 1); j++)
+    {
+      glu.lsub(nextl) = perm_r(glu.lsub(j)); // Now indexed into P*A
+      nextl++;
+    }
+    for (k = fsupc+1; k < glu.xsup(i+1); k++)
+      glu.xlsub(k) = nextl; // other columns in supernode i
+  }
+  
+  glu.xlsub(n) = nextl; 
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // EIGEN_SPARSELU_UTILS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_bmod.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_bmod.h
new file mode 100644
index 0000000..f24bd87
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_bmod.h
@@ -0,0 +1,180 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of xcolumn_bmod.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 3.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * October 15, 2003
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_COLUMN_BMOD_H
+#define SPARSELU_COLUMN_BMOD_H
+
+namespace Eigen {
+
+namespace internal {
+/**
+ * \brief Performs numeric block updates (sup-col) in topological order
+ * 
+ * \param jcol current column to update
+ * \param nseg Number of segments in the U part
+ * \param dense Store the full representation of the column
+ * \param tempv working array 
+ * \param segrep segment representative ...
+ * \param repfnz ??? First nonzero column in each row ???  ...
+ * \param fpanelc First column in the current panel
+ * \param glu Global LU data. 
+ * \return 0 - successful return 
+ *         > 0 - number of bytes allocated when run out of space
+ * 
+ */
+template <typename Scalar, typename Index>
+Index SparseLUImpl<Scalar,Index>::column_bmod(const Index jcol, const Index nseg, BlockScalarVector dense, ScalarVector& tempv, BlockIndexVector segrep, BlockIndexVector repfnz, Index fpanelc, GlobalLU_t& glu)
+{
+  Index  jsupno, k, ksub, krep, ksupno; 
+  Index lptr, nrow, isub, irow, nextlu, new_next, ufirst; 
+  Index fsupc, nsupc, nsupr, luptr, kfnz, no_zeros; 
+  /* krep = representative of current k-th supernode
+    * fsupc =  first supernodal column
+    * nsupc = number of columns in a supernode
+    * nsupr = number of rows in a supernode
+    * luptr = location of supernodal LU-block in storage
+    * kfnz = first nonz in the k-th supernodal segment
+    * no_zeros = no lf leading zeros in a supernodal U-segment
+    */
+  
+  jsupno = glu.supno(jcol);
+  // For each nonzero supernode segment of U[*,j] in topological order 
+  k = nseg - 1; 
+  Index d_fsupc; // distance between the first column of the current panel and the 
+               // first column of the current snode
+  Index fst_col; // First column within small LU update
+  Index segsize; 
+  for (ksub = 0; ksub < nseg; ksub++)
+  {
+    krep = segrep(k); k--; 
+    ksupno = glu.supno(krep); 
+    if (jsupno != ksupno )
+    {
+      // outside the rectangular supernode 
+      fsupc = glu.xsup(ksupno); 
+      fst_col = (std::max)(fsupc, fpanelc); 
+      
+      // Distance from the current supernode to the current panel; 
+      // d_fsupc = 0 if fsupc > fpanelc
+      d_fsupc = fst_col - fsupc; 
+      
+      luptr = glu.xlusup(fst_col) + d_fsupc; 
+      lptr = glu.xlsub(fsupc) + d_fsupc; 
+      
+      kfnz = repfnz(krep); 
+      kfnz = (std::max)(kfnz, fpanelc); 
+      
+      segsize = krep - kfnz + 1; 
+      nsupc = krep - fst_col + 1; 
+      nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
+      nrow = nsupr - d_fsupc - nsupc;
+      Index lda = glu.xlusup(fst_col+1) - glu.xlusup(fst_col);
+      
+      
+      // Perform a triangular solver and block update, 
+      // then scatter the result of sup-col update to dense
+      no_zeros = kfnz - fst_col; 
+      if(segsize==1)
+        LU_kernel_bmod<1>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+      else
+        LU_kernel_bmod<Dynamic>::run(segsize, dense, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+    } // end if jsupno 
+  } // end for each segment
+  
+  // Process the supernodal portion of  L\U[*,j]
+  nextlu = glu.xlusup(jcol); 
+  fsupc = glu.xsup(jsupno);
+  
+  // copy the SPA dense into L\U[*,j]
+  Index mem; 
+  new_next = nextlu + glu.xlsub(fsupc + 1) - glu.xlsub(fsupc); 
+  Index offset = internal::first_multiple<Index>(new_next, internal::packet_traits<Scalar>::size) - new_next;
+  if(offset)
+    new_next += offset;
+  while (new_next > glu.nzlumax )
+  {
+    mem = memXpand<ScalarVector>(glu.lusup, glu.nzlumax, nextlu, LUSUP, glu.num_expansions);  
+    if (mem) return mem; 
+  }
+  
+  for (isub = glu.xlsub(fsupc); isub < glu.xlsub(fsupc+1); isub++)
+  {
+    irow = glu.lsub(isub);
+    glu.lusup(nextlu) = dense(irow);
+    dense(irow) = Scalar(0.0); 
+    ++nextlu; 
+  }
+  
+  if(offset)
+  {
+    glu.lusup.segment(nextlu,offset).setZero();
+    nextlu += offset;
+  }
+  glu.xlusup(jcol + 1) = nextlu;  // close L\U(*,jcol); 
+  
+  /* For more updates within the panel (also within the current supernode),
+   * should start from the first column of the panel, or the first column
+   * of the supernode, whichever is bigger. There are two cases:
+   *  1) fsupc < fpanelc, then fst_col <-- fpanelc
+   *  2) fsupc >= fpanelc, then fst_col <-- fsupc
+   */
+  fst_col = (std::max)(fsupc, fpanelc); 
+  
+  if (fst_col  < jcol)
+  {
+    // Distance between the current supernode and the current panel
+    // d_fsupc = 0 if fsupc >= fpanelc
+    d_fsupc = fst_col - fsupc; 
+    
+    lptr = glu.xlsub(fsupc) + d_fsupc; 
+    luptr = glu.xlusup(fst_col) + d_fsupc; 
+    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); // leading dimension
+    nsupc = jcol - fst_col; // excluding jcol 
+    nrow = nsupr - d_fsupc - nsupc; 
+    
+    // points to the beginning of jcol in snode L\U(jsupno) 
+    ufirst = glu.xlusup(jcol) + d_fsupc; 
+    Index lda = glu.xlusup(jcol+1) - glu.xlusup(jcol);
+    Map<Matrix<Scalar,Dynamic,Dynamic>, 0,  OuterStride<> > A( &(glu.lusup.data()[luptr]), nsupc, nsupc, OuterStride<>(lda) ); 
+    VectorBlock<ScalarVector> u(glu.lusup, ufirst, nsupc); 
+    u = A.template triangularView<UnitLower>().solve(u); 
+    
+    new (&A) Map<Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > ( &(glu.lusup.data()[luptr+nsupc]), nrow, nsupc, OuterStride<>(lda) ); 
+    VectorBlock<ScalarVector> l(glu.lusup, ufirst+nsupc, nrow); 
+    l.noalias() -= A * u;
+    
+  } // End if fst_col
+  return 0; 
+}
+
+} // end namespace internal
+} // end namespace Eigen
+
+#endif // SPARSELU_COLUMN_BMOD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_dfs.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_dfs.h
new file mode 100644
index 0000000..bd450dd
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_column_dfs.h
@@ -0,0 +1,177 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]column_dfs.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 2.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November 15, 1997
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_COLUMN_DFS_H
+#define SPARSELU_COLUMN_DFS_H
+
+template <typename Scalar, typename Index> class SparseLUImpl;
+namespace Eigen {
+
+namespace internal {
+
+template<typename IndexVector, typename ScalarVector>
+struct column_dfs_traits
+{
+  typedef typename ScalarVector::Scalar Scalar;
+  typedef typename IndexVector::Scalar Index;
+  column_dfs_traits(Index jcol, Index& jsuper, typename SparseLUImpl<Scalar, Index>::GlobalLU_t& glu, SparseLUImpl<Scalar, Index>& luImpl)
+   : m_jcol(jcol), m_jsuper_ref(jsuper), m_glu(glu), m_luImpl(luImpl)
+ {}
+  bool update_segrep(Index /*krep*/, Index /*jj*/)
+  {
+    return true;
+  }
+  void mem_expand(IndexVector& lsub, Index& nextl, Index chmark)
+  {
+    if (nextl >= m_glu.nzlmax)
+      m_luImpl.memXpand(lsub, m_glu.nzlmax, nextl, LSUB, m_glu.num_expansions); 
+    if (chmark != (m_jcol-1)) m_jsuper_ref = emptyIdxLU;
+  }
+  enum { ExpandMem = true };
+  
+  Index m_jcol;
+  Index& m_jsuper_ref;
+  typename SparseLUImpl<Scalar, Index>::GlobalLU_t& m_glu;
+  SparseLUImpl<Scalar, Index>& m_luImpl;
+};
+
+
+/**
+ * \brief Performs a symbolic factorization on column jcol and decide the supernode boundary
+ * 
+ * A supernode representative is the last column of a supernode.
+ * The nonzeros in U[*,j] are segments that end at supernodes representatives. 
+ * The routine returns a list of the supernodal representatives 
+ * in topological order of the dfs that generates them. 
+ * The location of the first nonzero in each supernodal segment 
+ * (supernodal entry location) is also returned. 
+ * 
+ * \param m number of rows in the matrix
+ * \param jcol Current column 
+ * \param perm_r Row permutation
+ * \param maxsuper  Maximum number of column allowed in a supernode
+ * \param [in,out] nseg Number of segments in current U[*,j] - new segments appended
+ * \param lsub_col defines the rhs vector to start the dfs
+ * \param [in,out] segrep Segment representatives - new segments appended 
+ * \param repfnz  First nonzero location in each row
+ * \param xprune 
+ * \param marker  marker[i] == jj, if i was visited during dfs of current column jj;
+ * \param parent
+ * \param xplore working array
+ * \param glu global LU data 
+ * \return 0 success
+ *         > 0 number of bytes allocated when run out of space
+ * 
+ */
+template <typename Scalar, typename Index>
+Index SparseLUImpl<Scalar,Index>::column_dfs(const Index m, const Index jcol, IndexVector& perm_r, Index maxsuper, Index& nseg,  BlockIndexVector lsub_col, IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)
+{
+  
+  Index jsuper = glu.supno(jcol); 
+  Index nextl = glu.xlsub(jcol); 
+  VectorBlock<IndexVector> marker2(marker, 2*m, m); 
+  
+  
+  column_dfs_traits<IndexVector, ScalarVector> traits(jcol, jsuper, glu, *this);
+  
+  // For each nonzero in A(*,jcol) do dfs 
+  for (Index k = 0; lsub_col[k] != emptyIdxLU; k++) 
+  {
+    Index krow = lsub_col(k); 
+    lsub_col(k) = emptyIdxLU; 
+    Index kmark = marker2(krow); 
+    
+    // krow was visited before, go to the next nonz; 
+    if (kmark == jcol) continue;
+    
+    dfs_kernel(jcol, perm_r, nseg, glu.lsub, segrep, repfnz, xprune, marker2, parent,
+                   xplore, glu, nextl, krow, traits);
+  } // for each nonzero ... 
+  
+  Index fsupc, jptr, jm1ptr, ito, ifrom, istop;
+  Index nsuper = glu.supno(jcol);
+  Index jcolp1 = jcol + 1;
+  Index jcolm1 = jcol - 1;
+  
+  // check to see if j belongs in the same supernode as j-1
+  if ( jcol == 0 )
+  { // Do nothing for column 0 
+    nsuper = glu.supno(0) = 0 ;
+  }
+  else 
+  {
+    fsupc = glu.xsup(nsuper); 
+    jptr = glu.xlsub(jcol); // Not yet compressed
+    jm1ptr = glu.xlsub(jcolm1); 
+    
+    // Use supernodes of type T2 : see SuperLU paper
+    if ( (nextl-jptr != jptr-jm1ptr-1) ) jsuper = emptyIdxLU;
+    
+    // Make sure the number of columns in a supernode doesn't
+    // exceed threshold
+    if ( (jcol - fsupc) >= maxsuper) jsuper = emptyIdxLU; 
+    
+    /* If jcol starts a new supernode, reclaim storage space in
+     * glu.lsub from previous supernode. Note we only store 
+     * the subscript set of the first and last columns of 
+     * a supernode. (first for num values, last for pruning)
+     */
+    if (jsuper == emptyIdxLU)
+    { // starts a new supernode 
+      if ( (fsupc < jcolm1-1) ) 
+      { // >= 3 columns in nsuper
+        ito = glu.xlsub(fsupc+1);
+        glu.xlsub(jcolm1) = ito; 
+        istop = ito + jptr - jm1ptr; 
+        xprune(jcolm1) = istop; // intialize xprune(jcol-1)
+        glu.xlsub(jcol) = istop; 
+        
+        for (ifrom = jm1ptr; ifrom < nextl; ++ifrom, ++ito)
+          glu.lsub(ito) = glu.lsub(ifrom); 
+        nextl = ito;  // = istop + length(jcol)
+      }
+      nsuper++; 
+      glu.supno(jcol) = nsuper; 
+    } // if a new supernode 
+  } // end else:  jcol > 0
+  
+  // Tidy up the pointers before exit
+  glu.xsup(nsuper+1) = jcolp1; 
+  glu.supno(jcolp1) = nsuper; 
+  xprune(jcol) = nextl;  // Intialize upper bound for pruning
+  glu.xlsub(jcolp1) = nextl; 
+  
+  return 0; 
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h
new file mode 100644
index 0000000..170610d
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_copy_to_ucol.h
@@ -0,0 +1,106 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]copy_to_ucol.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 2.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November 15, 1997
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_COPY_TO_UCOL_H
+#define SPARSELU_COPY_TO_UCOL_H
+
+namespace Eigen {
+namespace internal {
+
+/**
+ * \brief Performs numeric block updates (sup-col) in topological order
+ * 
+ * \param jcol current column to update
+ * \param nseg Number of segments in the U part
+ * \param segrep segment representative ...
+ * \param repfnz First nonzero column in each row  ...
+ * \param perm_r Row permutation 
+ * \param dense Store the full representation of the column
+ * \param glu Global LU data. 
+ * \return 0 - successful return 
+ *         > 0 - number of bytes allocated when run out of space
+ * 
+ */
+template <typename Scalar, typename Index>
+Index SparseLUImpl<Scalar,Index>::copy_to_ucol(const Index jcol, const Index nseg, IndexVector& segrep, BlockIndexVector repfnz ,IndexVector& perm_r, BlockScalarVector dense, GlobalLU_t& glu)
+{  
+  Index ksub, krep, ksupno; 
+    
+  Index jsupno = glu.supno(jcol);
+  
+  // For each nonzero supernode segment of U[*,j] in topological order 
+  Index k = nseg - 1, i; 
+  Index nextu = glu.xusub(jcol); 
+  Index kfnz, isub, segsize; 
+  Index new_next,irow; 
+  Index fsupc, mem; 
+  for (ksub = 0; ksub < nseg; ksub++)
+  {
+    krep = segrep(k); k--; 
+    ksupno = glu.supno(krep); 
+    if (jsupno != ksupno ) // should go into ucol(); 
+    {
+      kfnz = repfnz(krep); 
+      if (kfnz != emptyIdxLU)
+      { // Nonzero U-segment 
+        fsupc = glu.xsup(ksupno); 
+        isub = glu.xlsub(fsupc) + kfnz - fsupc; 
+        segsize = krep - kfnz + 1; 
+        new_next = nextu + segsize; 
+        while (new_next > glu.nzumax) 
+        {
+          mem = memXpand<ScalarVector>(glu.ucol, glu.nzumax, nextu, UCOL, glu.num_expansions); 
+          if (mem) return mem; 
+          mem = memXpand<IndexVector>(glu.usub, glu.nzumax, nextu, USUB, glu.num_expansions); 
+          if (mem) return mem; 
+          
+        }
+        
+        for (i = 0; i < segsize; i++)
+        {
+          irow = glu.lsub(isub); 
+          glu.usub(nextu) = perm_r(irow); // Unlike the L part, the U part is stored in its final order
+          glu.ucol(nextu) = dense(irow); 
+          dense(irow) = Scalar(0.0); 
+          nextu++;
+          isub++;
+        }
+        
+      } // end nonzero U-segment 
+      
+    } // end if jsupno 
+    
+  } // end for each segment
+  glu.xusub(jcol + 1) = nextu; // close U(*,jcol)
+  return 0; 
+}
+
+} // namespace internal
+} // end namespace Eigen
+
+#endif // SPARSELU_COPY_TO_UCOL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_gemm_kernel.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_gemm_kernel.h
new file mode 100644
index 0000000..9e4e3e7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_gemm_kernel.h
@@ -0,0 +1,279 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSELU_GEMM_KERNEL_H
+#define EIGEN_SPARSELU_GEMM_KERNEL_H
+
+namespace Eigen {
+
+namespace internal {
+
+
+/** \internal
+  * A general matrix-matrix product kernel optimized for the SparseLU factorization.
+  *  - A, B, and C must be column major
+  *  - lda and ldc must be multiples of the respective packet size
+  *  - C must have the same alignment as A
+  */
+template<typename Scalar,typename Index>
+EIGEN_DONT_INLINE
+void sparselu_gemm(Index m, Index n, Index d, const Scalar* A, Index lda, const Scalar* B, Index ldb, Scalar* C, Index ldc)
+{
+  using namespace Eigen::internal;
+  
+  typedef typename packet_traits<Scalar>::type Packet;
+  enum {
+    NumberOfRegisters = EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS,
+    PacketSize = packet_traits<Scalar>::size,
+    PM = 8,                             // peeling in M
+    RN = 2,                             // register blocking
+    RK = NumberOfRegisters>=16 ? 4 : 2, // register blocking
+    BM = 4096/sizeof(Scalar),           // number of rows of A-C per chunk
+    SM = PM*PacketSize                  // step along M
+  };
+  Index d_end = (d/RK)*RK;    // number of columns of A (rows of B) suitable for full register blocking
+  Index n_end = (n/RN)*RN;    // number of columns of B-C suitable for processing RN columns at once
+  Index i0 = internal::first_aligned(A,m);
+  
+  eigen_internal_assert(((lda%PacketSize)==0) && ((ldc%PacketSize)==0) && (i0==internal::first_aligned(C,m)));
+  
+  // handle the non aligned rows of A and C without any optimization:
+  for(Index i=0; i<i0; ++i)
+  {
+    for(Index j=0; j<n; ++j)
+    {
+      Scalar c = C[i+j*ldc];
+      for(Index k=0; k<d; ++k)
+        c += B[k+j*ldb] * A[i+k*lda];
+      C[i+j*ldc] = c;
+    }
+  }
+  // process the remaining rows per chunk of BM rows
+  for(Index ib=i0; ib<m; ib+=BM)
+  {
+    Index actual_b = std::min<Index>(BM, m-ib);                 // actual number of rows
+    Index actual_b_end1 = (actual_b/SM)*SM;                   // actual number of rows suitable for peeling
+    Index actual_b_end2 = (actual_b/PacketSize)*PacketSize;   // actual number of rows suitable for vectorization
+    
+    // Let's process two columns of B-C at once
+    for(Index j=0; j<n_end; j+=RN)
+    {
+      const Scalar* Bc0 = B+(j+0)*ldb;
+      const Scalar* Bc1 = B+(j+1)*ldb;
+      
+      for(Index k=0; k<d_end; k+=RK)
+      {
+        
+        // load and expand a RN x RK block of B
+        Packet b00, b10, b20, b30, b01, b11, b21, b31;
+                  b00 = pset1<Packet>(Bc0[0]);
+                  b10 = pset1<Packet>(Bc0[1]);
+        if(RK==4) b20 = pset1<Packet>(Bc0[2]);
+        if(RK==4) b30 = pset1<Packet>(Bc0[3]);
+                  b01 = pset1<Packet>(Bc1[0]);
+                  b11 = pset1<Packet>(Bc1[1]);
+        if(RK==4) b21 = pset1<Packet>(Bc1[2]);
+        if(RK==4) b31 = pset1<Packet>(Bc1[3]);
+        
+        Packet a0, a1, a2, a3, c0, c1, t0, t1;
+        
+        const Scalar* A0 = A+ib+(k+0)*lda;
+        const Scalar* A1 = A+ib+(k+1)*lda;
+        const Scalar* A2 = A+ib+(k+2)*lda;
+        const Scalar* A3 = A+ib+(k+3)*lda;
+        
+        Scalar* C0 = C+ib+(j+0)*ldc;
+        Scalar* C1 = C+ib+(j+1)*ldc;
+        
+                  a0 = pload<Packet>(A0);
+                  a1 = pload<Packet>(A1);
+        if(RK==4)
+        {
+          a2 = pload<Packet>(A2);
+          a3 = pload<Packet>(A3);
+        }
+        else
+        {
+          // workaround "may be used uninitialized in this function" warning
+          a2 = a3 = a0;
+        }
+        
+#define KMADD(c, a, b, tmp) {tmp = b; tmp = pmul(a,tmp); c = padd(c,tmp);}
+#define WORK(I)  \
+                    c0 = pload<Packet>(C0+i+(I)*PacketSize);   \
+                    c1 = pload<Packet>(C1+i+(I)*PacketSize);   \
+                    KMADD(c0, a0, b00, t0)      \
+                    KMADD(c1, a0, b01, t1)      \
+                    a0 = pload<Packet>(A0+i+(I+1)*PacketSize); \
+                    KMADD(c0, a1, b10, t0)      \
+                    KMADD(c1, a1, b11, t1)       \
+                    a1 = pload<Packet>(A1+i+(I+1)*PacketSize); \
+          if(RK==4) KMADD(c0, a2, b20, t0)       \
+          if(RK==4) KMADD(c1, a2, b21, t1)       \
+          if(RK==4) a2 = pload<Packet>(A2+i+(I+1)*PacketSize); \
+          if(RK==4) KMADD(c0, a3, b30, t0)       \
+          if(RK==4) KMADD(c1, a3, b31, t1)       \
+          if(RK==4) a3 = pload<Packet>(A3+i+(I+1)*PacketSize); \
+                    pstore(C0+i+(I)*PacketSize, c0);           \
+                    pstore(C1+i+(I)*PacketSize, c1)
+        
+        // process rows of A' - C' with aggressive vectorization and peeling 
+        for(Index i=0; i<actual_b_end1; i+=PacketSize*8)
+        {
+          EIGEN_ASM_COMMENT("SPARSELU_GEMML_KERNEL1");
+                    prefetch((A0+i+(5)*PacketSize));
+                    prefetch((A1+i+(5)*PacketSize));
+          if(RK==4) prefetch((A2+i+(5)*PacketSize));
+          if(RK==4) prefetch((A3+i+(5)*PacketSize));
+                    WORK(0);
+                    WORK(1);
+                    WORK(2);
+                    WORK(3);
+                    WORK(4);
+                    WORK(5);
+                    WORK(6);
+                    WORK(7);
+        }
+        // process the remaining rows with vectorization only
+        for(Index i=actual_b_end1; i<actual_b_end2; i+=PacketSize)
+        {
+          WORK(0);
+        }
+#undef WORK
+        // process the remaining rows without vectorization
+        for(Index i=actual_b_end2; i<actual_b; ++i)
+        {
+          if(RK==4)
+          {
+            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1]+A2[i]*Bc0[2]+A3[i]*Bc0[3];
+            C1[i] += A0[i]*Bc1[0]+A1[i]*Bc1[1]+A2[i]*Bc1[2]+A3[i]*Bc1[3];
+          }
+          else
+          {
+            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1];
+            C1[i] += A0[i]*Bc1[0]+A1[i]*Bc1[1];
+          }
+        }
+        
+        Bc0 += RK;
+        Bc1 += RK;
+      } // peeled loop on k
+    } // peeled loop on the columns j
+    // process the last column (we now perform a matrux-vector product)
+    if((n-n_end)>0)
+    {
+      const Scalar* Bc0 = B+(n-1)*ldb;
+      
+      for(Index k=0; k<d_end; k+=RK)
+      {
+        
+        // load and expand a 1 x RK block of B
+        Packet b00, b10, b20, b30;
+                  b00 = pset1<Packet>(Bc0[0]);
+                  b10 = pset1<Packet>(Bc0[1]);
+        if(RK==4) b20 = pset1<Packet>(Bc0[2]);
+        if(RK==4) b30 = pset1<Packet>(Bc0[3]);
+        
+        Packet a0, a1, a2, a3, c0, t0/*, t1*/;
+        
+        const Scalar* A0 = A+ib+(k+0)*lda;
+        const Scalar* A1 = A+ib+(k+1)*lda;
+        const Scalar* A2 = A+ib+(k+2)*lda;
+        const Scalar* A3 = A+ib+(k+3)*lda;
+        
+        Scalar* C0 = C+ib+(n_end)*ldc;
+        
+                  a0 = pload<Packet>(A0);
+                  a1 = pload<Packet>(A1);
+        if(RK==4)
+        {
+          a2 = pload<Packet>(A2);
+          a3 = pload<Packet>(A3);
+        }
+        else
+        {
+          // workaround "may be used uninitialized in this function" warning
+          a2 = a3 = a0;
+        }
+        
+#define WORK(I) \
+                  c0 = pload<Packet>(C0+i+(I)*PacketSize);   \
+                  KMADD(c0, a0, b00, t0)       \
+                  a0 = pload<Packet>(A0+i+(I+1)*PacketSize); \
+                  KMADD(c0, a1, b10, t0)       \
+                  a1 = pload<Packet>(A1+i+(I+1)*PacketSize); \
+        if(RK==4) KMADD(c0, a2, b20, t0)       \
+        if(RK==4) a2 = pload<Packet>(A2+i+(I+1)*PacketSize); \
+        if(RK==4) KMADD(c0, a3, b30, t0)       \
+        if(RK==4) a3 = pload<Packet>(A3+i+(I+1)*PacketSize); \
+                  pstore(C0+i+(I)*PacketSize, c0);
+        
+        // agressive vectorization and peeling
+        for(Index i=0; i<actual_b_end1; i+=PacketSize*8)
+        {
+          EIGEN_ASM_COMMENT("SPARSELU_GEMML_KERNEL2");
+          WORK(0);
+          WORK(1);
+          WORK(2);
+          WORK(3);
+          WORK(4);
+          WORK(5);
+          WORK(6);
+          WORK(7);
+        }
+        // vectorization only
+        for(Index i=actual_b_end1; i<actual_b_end2; i+=PacketSize)
+        {
+          WORK(0);
+        }
+        // remaining scalars
+        for(Index i=actual_b_end2; i<actual_b; ++i)
+        {
+          if(RK==4) 
+            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1]+A2[i]*Bc0[2]+A3[i]*Bc0[3];
+          else
+            C0[i] += A0[i]*Bc0[0]+A1[i]*Bc0[1];
+        }
+        
+        Bc0 += RK;
+#undef WORK
+      }
+    }
+    
+    // process the last columns of A, corresponding to the last rows of B
+    Index rd = d-d_end;
+    if(rd>0)
+    {
+      for(Index j=0; j<n; ++j)
+      {
+        enum {
+          Alignment = PacketSize>1 ? Aligned : 0
+        };
+        typedef Map<Matrix<Scalar,Dynamic,1>, Alignment > MapVector;
+        typedef Map<const Matrix<Scalar,Dynamic,1>, Alignment > ConstMapVector;
+        if(rd==1)       MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b);
+        
+        else if(rd==2)  MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b)
+                                                        + B[1+d_end+j*ldb] * ConstMapVector(A+(d_end+1)*lda+ib, actual_b);
+        
+        else            MapVector(C+j*ldc+ib,actual_b) += B[0+d_end+j*ldb] * ConstMapVector(A+(d_end+0)*lda+ib, actual_b)
+                                                        + B[1+d_end+j*ldb] * ConstMapVector(A+(d_end+1)*lda+ib, actual_b)
+                                                        + B[2+d_end+j*ldb] * ConstMapVector(A+(d_end+2)*lda+ib, actual_b);
+      }
+    }
+  
+  } // blocking on the rows of A and C
+}
+#undef KMADD
+
+} // namespace internal
+
+} // namespace Eigen
+
+#endif // EIGEN_SPARSELU_GEMM_KERNEL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h
new file mode 100644
index 0000000..7a4e430
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_heap_relax_snode.h
@@ -0,0 +1,127 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* This file is a modified version of heap_relax_snode.c file in SuperLU
+ * -- SuperLU routine (version 3.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * October 15, 2003
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+
+#ifndef SPARSELU_HEAP_RELAX_SNODE_H
+#define SPARSELU_HEAP_RELAX_SNODE_H
+
+namespace Eigen {
+namespace internal {
+
+/** 
+ * \brief Identify the initial relaxed supernodes
+ * 
+ * This routine applied to a symmetric elimination tree. 
+ * It assumes that the matrix has been reordered according to the postorder of the etree
+ * \param n The number of columns
+ * \param et elimination tree 
+ * \param relax_columns Maximum number of columns allowed in a relaxed snode 
+ * \param descendants Number of descendants of each node in the etree
+ * \param relax_end last column in a supernode
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::heap_relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)
+{
+  
+  // The etree may not be postordered, but its heap ordered  
+  IndexVector post;
+  internal::treePostorder(n, et, post); // Post order etree
+  IndexVector inv_post(n+1); 
+  Index i;
+  for (i = 0; i < n+1; ++i) inv_post(post(i)) = i; // inv_post = post.inverse()???
+  
+  // Renumber etree in postorder 
+  IndexVector iwork(n);
+  IndexVector et_save(n+1);
+  for (i = 0; i < n; ++i)
+  {
+    iwork(post(i)) = post(et(i));
+  }
+  et_save = et; // Save the original etree
+  et = iwork; 
+  
+  // compute the number of descendants of each node in the etree
+  relax_end.setConstant(emptyIdxLU);
+  Index j, parent; 
+  descendants.setZero();
+  for (j = 0; j < n; j++) 
+  {
+    parent = et(j);
+    if (parent != n) // not the dummy root
+      descendants(parent) += descendants(j) + 1;
+  }
+  // Identify the relaxed supernodes by postorder traversal of the etree
+  Index snode_start; // beginning of a snode 
+  Index k;
+  Index nsuper_et_post = 0; // Number of relaxed snodes in postordered etree 
+  Index nsuper_et = 0; // Number of relaxed snodes in the original etree 
+  Index l; 
+  for (j = 0; j < n; )
+  {
+    parent = et(j);
+    snode_start = j; 
+    while ( parent != n && descendants(parent) < relax_columns ) 
+    {
+      j = parent; 
+      parent = et(j);
+    }
+    // Found a supernode in postordered etree, j is the last column 
+    ++nsuper_et_post;
+    k = n;
+    for (i = snode_start; i <= j; ++i)
+      k = (std::min)(k, inv_post(i));
+    l = inv_post(j);
+    if ( (l - k) == (j - snode_start) )  // Same number of columns in the snode
+    {
+      // This is also a supernode in the original etree
+      relax_end(k) = l; // Record last column 
+      ++nsuper_et; 
+    }
+    else 
+    {
+      for (i = snode_start; i <= j; ++i) 
+      {
+        l = inv_post(i);
+        if (descendants(i) == 0) 
+        {
+          relax_end(l) = l;
+          ++nsuper_et;
+        }
+      }
+    }
+    j++;
+    // Search for a new leaf
+    while (descendants(j) != 0 && j < n) j++;
+  } // End postorder traversal of the etree
+  
+  // Recover the original etree
+  et = et_save; 
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // SPARSELU_HEAP_RELAX_SNODE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_kernel_bmod.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_kernel_bmod.h
new file mode 100644
index 0000000..0d0283b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_kernel_bmod.h
@@ -0,0 +1,130 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef SPARSELU_KERNEL_BMOD_H
+#define SPARSELU_KERNEL_BMOD_H
+
+namespace Eigen {
+namespace internal {
+  
+/**
+ * \brief Performs numeric block updates from a given supernode to a single column
+ * 
+ * \param segsize Size of the segment (and blocks ) to use for updates
+ * \param[in,out] dense Packed values of the original matrix
+ * \param tempv temporary vector to use for updates
+ * \param lusup array containing the supernodes
+ * \param lda Leading dimension in the supernode
+ * \param nrow Number of rows in the rectangular part of the supernode
+ * \param lsub compressed row subscripts of supernodes
+ * \param lptr pointer to the first column of the current supernode in lsub
+ * \param no_zeros Number of nonzeros elements before the diagonal part of the supernode
+ * \return 0 on success
+ */
+template <int SegSizeAtCompileTime> struct LU_kernel_bmod
+{
+  template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>
+  static EIGEN_DONT_INLINE void run(const int segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,
+                                    const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);
+};
+
+template <int SegSizeAtCompileTime>
+template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>
+EIGEN_DONT_INLINE void LU_kernel_bmod<SegSizeAtCompileTime>::run(const int segsize, BlockScalarVector& dense, ScalarVector& tempv, ScalarVector& lusup, Index& luptr, const Index lda,
+                                                                  const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)
+{
+  typedef typename ScalarVector::Scalar Scalar;
+  // First, copy U[*,j] segment from dense(*) to tempv(*)
+  // The result of triangular solve is in tempv[*]; 
+    // The result of matric-vector update is in dense[*]
+  Index isub = lptr + no_zeros; 
+  int i;
+  Index irow;
+  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)
+  {
+    irow = lsub(isub); 
+    tempv(i) = dense(irow); 
+    ++isub; 
+  }
+  // Dense triangular solve -- start effective triangle
+  luptr += lda * no_zeros + no_zeros; 
+  // Form Eigen matrix and vector 
+  Map<Matrix<Scalar,SegSizeAtCompileTime,SegSizeAtCompileTime>, 0, OuterStride<> > A( &(lusup.data()[luptr]), segsize, segsize, OuterStride<>(lda) );
+  Map<Matrix<Scalar,SegSizeAtCompileTime,1> > u(tempv.data(), segsize);
+  
+  u = A.template triangularView<UnitLower>().solve(u); 
+  
+  // Dense matrix-vector product y <-- B*x 
+  luptr += segsize;
+  const Index PacketSize = internal::packet_traits<Scalar>::size;
+  Index ldl = internal::first_multiple(nrow, PacketSize);
+  Map<Matrix<Scalar,Dynamic,SegSizeAtCompileTime>, 0, OuterStride<> > B( &(lusup.data()[luptr]), nrow, segsize, OuterStride<>(lda) );
+  Index aligned_offset = internal::first_aligned(tempv.data()+segsize, PacketSize);
+  Index aligned_with_B_offset = (PacketSize-internal::first_aligned(B.data(), PacketSize))%PacketSize;
+  Map<Matrix<Scalar,Dynamic,1>, 0, OuterStride<> > l(tempv.data()+segsize+aligned_offset+aligned_with_B_offset, nrow, OuterStride<>(ldl) );
+  
+  l.setZero();
+  internal::sparselu_gemm<Scalar>(l.rows(), l.cols(), B.cols(), B.data(), B.outerStride(), u.data(), u.outerStride(), l.data(), l.outerStride());
+  
+  // Scatter tempv[] into SPA dense[] as a temporary storage 
+  isub = lptr + no_zeros;
+  for (i = 0; i < ((SegSizeAtCompileTime==Dynamic)?segsize:SegSizeAtCompileTime); i++)
+  {
+    irow = lsub(isub++); 
+    dense(irow) = tempv(i);
+  }
+  
+  // Scatter l into SPA dense[]
+  for (i = 0; i < nrow; i++)
+  {
+    irow = lsub(isub++); 
+    dense(irow) -= l(i);
+  } 
+}
+
+template <> struct LU_kernel_bmod<1>
+{
+  template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>
+  static EIGEN_DONT_INLINE void run(const int /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,
+                                    const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros);
+};
+
+
+template <typename BlockScalarVector, typename ScalarVector, typename IndexVector, typename Index>
+EIGEN_DONT_INLINE void LU_kernel_bmod<1>::run(const int /*segsize*/, BlockScalarVector& dense, ScalarVector& /*tempv*/, ScalarVector& lusup, Index& luptr,
+                                              const Index lda, const Index nrow, IndexVector& lsub, const Index lptr, const Index no_zeros)
+{
+  typedef typename ScalarVector::Scalar Scalar;
+  Scalar f = dense(lsub(lptr + no_zeros));
+  luptr += lda * no_zeros + no_zeros + 1;
+  const Scalar* a(lusup.data() + luptr);
+  const /*typename IndexVector::Scalar*/Index*  irow(lsub.data()+lptr + no_zeros + 1);
+  Index i = 0;
+  for (; i+1 < nrow; i+=2)
+  {
+    Index i0 = *(irow++);
+    Index i1 = *(irow++);
+    Scalar a0 = *(a++);
+    Scalar a1 = *(a++);
+    Scalar d0 = dense.coeff(i0);
+    Scalar d1 = dense.coeff(i1);
+    d0 -= f*a0;
+    d1 -= f*a1;
+    dense.coeffRef(i0) = d0;
+    dense.coeffRef(i1) = d1;
+  }
+  if(i<nrow)
+    dense.coeffRef(*(irow++)) -= f * *(a++);
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif // SPARSELU_KERNEL_BMOD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_bmod.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_bmod.h
new file mode 100644
index 0000000..da0e0fc
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_bmod.h
@@ -0,0 +1,223 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]panel_bmod.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 3.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * October 15, 2003
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_PANEL_BMOD_H
+#define SPARSELU_PANEL_BMOD_H
+
+namespace Eigen {
+namespace internal {
+
+/**
+ * \brief Performs numeric block updates (sup-panel) in topological order.
+ * 
+ * Before entering this routine, the original nonzeros in the panel
+ * were already copied i nto the spa[m,w]
+ * 
+ * \param m number of rows in the matrix
+ * \param w Panel size
+ * \param jcol Starting  column of the panel
+ * \param nseg Number of segments in the U part
+ * \param dense Store the full representation of the panel 
+ * \param tempv working array 
+ * \param segrep segment representative... first row in the segment
+ * \param repfnz First nonzero rows
+ * \param glu Global LU data. 
+ * 
+ * 
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::panel_bmod(const Index m, const Index w, const Index jcol, 
+                                            const Index nseg, ScalarVector& dense, ScalarVector& tempv,
+                                            IndexVector& segrep, IndexVector& repfnz, GlobalLU_t& glu)
+{
+  
+  Index ksub,jj,nextl_col; 
+  Index fsupc, nsupc, nsupr, nrow; 
+  Index krep, kfnz; 
+  Index lptr; // points to the row subscripts of a supernode 
+  Index luptr; // ...
+  Index segsize,no_zeros ; 
+  // For each nonz supernode segment of U[*,j] in topological order
+  Index k = nseg - 1; 
+  const Index PacketSize = internal::packet_traits<Scalar>::size;
+  
+  for (ksub = 0; ksub < nseg; ksub++)
+  { // For each updating supernode
+    /* krep = representative of current k-th supernode
+     * fsupc =  first supernodal column
+     * nsupc = number of columns in a supernode
+     * nsupr = number of rows in a supernode
+     */
+    krep = segrep(k); k--; 
+    fsupc = glu.xsup(glu.supno(krep)); 
+    nsupc = krep - fsupc + 1; 
+    nsupr = glu.xlsub(fsupc+1) - glu.xlsub(fsupc); 
+    nrow = nsupr - nsupc; 
+    lptr = glu.xlsub(fsupc); 
+    
+    // loop over the panel columns to detect the actual number of columns and rows
+    Index u_rows = 0;
+    Index u_cols = 0;
+    for (jj = jcol; jj < jcol + w; jj++)
+    {
+      nextl_col = (jj-jcol) * m; 
+      VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
+      
+      kfnz = repfnz_col(krep); 
+      if ( kfnz == emptyIdxLU ) 
+        continue; // skip any zero segment
+      
+      segsize = krep - kfnz + 1;
+      u_cols++;
+      u_rows = (std::max)(segsize,u_rows);
+    }
+    
+    if(nsupc >= 2)
+    { 
+      Index ldu = internal::first_multiple<Index>(u_rows, PacketSize);
+      Map<Matrix<Scalar,Dynamic,Dynamic>, Aligned,  OuterStride<> > U(tempv.data(), u_rows, u_cols, OuterStride<>(ldu));
+      
+      // gather U
+      Index u_col = 0;
+      for (jj = jcol; jj < jcol + w; jj++)
+      {
+        nextl_col = (jj-jcol) * m; 
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
+        
+        kfnz = repfnz_col(krep); 
+        if ( kfnz == emptyIdxLU ) 
+          continue; // skip any zero segment
+        
+        segsize = krep - kfnz + 1;
+        luptr = glu.xlusup(fsupc);    
+        no_zeros = kfnz - fsupc; 
+        
+        Index isub = lptr + no_zeros;
+        Index off = u_rows-segsize;
+        for (Index i = 0; i < off; i++) U(i,u_col) = 0;
+        for (Index i = 0; i < segsize; i++)
+        {
+          Index irow = glu.lsub(isub); 
+          U(i+off,u_col) = dense_col(irow); 
+          ++isub; 
+        }
+        u_col++;
+      }
+      // solve U = A^-1 U
+      luptr = glu.xlusup(fsupc);
+      Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc);
+      no_zeros = (krep - u_rows + 1) - fsupc;
+      luptr += lda * no_zeros + no_zeros;
+      Map<Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > A(glu.lusup.data()+luptr, u_rows, u_rows, OuterStride<>(lda) );
+      U = A.template triangularView<UnitLower>().solve(U);
+      
+      // update
+      luptr += u_rows;
+      Map<Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > B(glu.lusup.data()+luptr, nrow, u_rows, OuterStride<>(lda) );
+      eigen_assert(tempv.size()>w*ldu + nrow*w + 1);
+      
+      Index ldl = internal::first_multiple<Index>(nrow, PacketSize);
+      Index offset = (PacketSize-internal::first_aligned(B.data(), PacketSize)) % PacketSize;
+      Map<Matrix<Scalar,Dynamic,Dynamic>, 0, OuterStride<> > L(tempv.data()+w*ldu+offset, nrow, u_cols, OuterStride<>(ldl));
+      
+      L.setZero();
+      internal::sparselu_gemm<Scalar>(L.rows(), L.cols(), B.cols(), B.data(), B.outerStride(), U.data(), U.outerStride(), L.data(), L.outerStride());
+      
+      // scatter U and L
+      u_col = 0;
+      for (jj = jcol; jj < jcol + w; jj++)
+      {
+        nextl_col = (jj-jcol) * m; 
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
+        
+        kfnz = repfnz_col(krep); 
+        if ( kfnz == emptyIdxLU ) 
+          continue; // skip any zero segment
+        
+        segsize = krep - kfnz + 1;
+        no_zeros = kfnz - fsupc; 
+        Index isub = lptr + no_zeros;
+        
+        Index off = u_rows-segsize;
+        for (Index i = 0; i < segsize; i++)
+        {
+          Index irow = glu.lsub(isub++); 
+          dense_col(irow) = U.coeff(i+off,u_col);
+          U.coeffRef(i+off,u_col) = 0;
+        }
+        
+        // Scatter l into SPA dense[]
+        for (Index i = 0; i < nrow; i++)
+        {
+          Index irow = glu.lsub(isub++); 
+          dense_col(irow) -= L.coeff(i,u_col);
+          L.coeffRef(i,u_col) = 0;
+        }
+        u_col++;
+      }
+    }
+    else // level 2 only
+    {
+      // Sequence through each column in the panel
+      for (jj = jcol; jj < jcol + w; jj++)
+      {
+        nextl_col = (jj-jcol) * m; 
+        VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero column index for each row
+        VectorBlock<ScalarVector> dense_col(dense, nextl_col, m); // Scatter/gather entire matrix column from/to here
+        
+        kfnz = repfnz_col(krep); 
+        if ( kfnz == emptyIdxLU ) 
+          continue; // skip any zero segment
+        
+        segsize = krep - kfnz + 1;
+        luptr = glu.xlusup(fsupc);
+        
+        Index lda = glu.xlusup(fsupc+1)-glu.xlusup(fsupc);// nsupr
+        
+        // Perform a trianglar solve and block update, 
+        // then scatter the result of sup-col update to dense[]
+        no_zeros = kfnz - fsupc; 
+              if(segsize==1)  LU_kernel_bmod<1>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else  if(segsize==2)  LU_kernel_bmod<2>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else  if(segsize==3)  LU_kernel_bmod<3>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros);
+        else                  LU_kernel_bmod<Dynamic>::run(segsize, dense_col, tempv, glu.lusup, luptr, lda, nrow, glu.lsub, lptr, no_zeros); 
+      } // End for each column in the panel 
+    }
+    
+  } // End for each updating supernode
+} // end panel bmod
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // SPARSELU_PANEL_BMOD_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_dfs.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_dfs.h
new file mode 100644
index 0000000..dc0054e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_panel_dfs.h
@@ -0,0 +1,258 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]panel_dfs.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 2.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November 15, 1997
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_PANEL_DFS_H
+#define SPARSELU_PANEL_DFS_H
+
+namespace Eigen {
+
+namespace internal {
+  
+template<typename IndexVector>
+struct panel_dfs_traits
+{
+  typedef typename IndexVector::Scalar Index;
+  panel_dfs_traits(Index jcol, Index* marker)
+    : m_jcol(jcol), m_marker(marker)
+  {}
+  bool update_segrep(Index krep, Index jj)
+  {
+    if(m_marker[krep]<m_jcol)
+    {
+      m_marker[krep] = jj; 
+      return true;
+    }
+    return false;
+  }
+  void mem_expand(IndexVector& /*glu.lsub*/, Index /*nextl*/, Index /*chmark*/) {}
+  enum { ExpandMem = false };
+  Index m_jcol;
+  Index* m_marker;
+};
+
+
+template <typename Scalar, typename Index>
+template <typename Traits>
+void SparseLUImpl<Scalar,Index>::dfs_kernel(const Index jj, IndexVector& perm_r,
+                   Index& nseg, IndexVector& panel_lsub, IndexVector& segrep,
+                   Ref<IndexVector> repfnz_col, IndexVector& xprune, Ref<IndexVector> marker, IndexVector& parent,
+                   IndexVector& xplore, GlobalLU_t& glu,
+                   Index& nextl_col, Index krow, Traits& traits
+                  )
+{
+  
+  Index kmark = marker(krow);
+      
+  // For each unmarked krow of jj
+  marker(krow) = jj; 
+  Index kperm = perm_r(krow); 
+  if (kperm == emptyIdxLU ) {
+    // krow is in L : place it in structure of L(*, jj)
+    panel_lsub(nextl_col++) = krow;  // krow is indexed into A
+    
+    traits.mem_expand(panel_lsub, nextl_col, kmark);
+  }
+  else 
+  {
+    // krow is in U : if its supernode-representative krep
+    // has been explored, update repfnz(*)
+    // krep = supernode representative of the current row
+    Index krep = glu.xsup(glu.supno(kperm)+1) - 1; 
+    // First nonzero element in the current column:
+    Index myfnz = repfnz_col(krep); 
+    
+    if (myfnz != emptyIdxLU )
+    {
+      // Representative visited before
+      if (myfnz > kperm ) repfnz_col(krep) = kperm; 
+      
+    }
+    else 
+    {
+      // Otherwise, perform dfs starting at krep
+      Index oldrep = emptyIdxLU; 
+      parent(krep) = oldrep; 
+      repfnz_col(krep) = kperm; 
+      Index xdfs =  glu.xlsub(krep); 
+      Index maxdfs = xprune(krep); 
+      
+      Index kpar;
+      do 
+      {
+        // For each unmarked kchild of krep
+        while (xdfs < maxdfs) 
+        {
+          Index kchild = glu.lsub(xdfs); 
+          xdfs++; 
+          Index chmark = marker(kchild); 
+          
+          if (chmark != jj ) 
+          {
+            marker(kchild) = jj; 
+            Index chperm = perm_r(kchild); 
+            
+            if (chperm == emptyIdxLU) 
+            {
+              // case kchild is in L: place it in L(*, j)
+              panel_lsub(nextl_col++) = kchild;
+              traits.mem_expand(panel_lsub, nextl_col, chmark);
+            }
+            else
+            {
+              // case kchild is in U :
+              // chrep = its supernode-rep. If its rep has been explored, 
+              // update its repfnz(*)
+              Index chrep = glu.xsup(glu.supno(chperm)+1) - 1; 
+              myfnz = repfnz_col(chrep); 
+              
+              if (myfnz != emptyIdxLU) 
+              { // Visited before 
+                if (myfnz > chperm) 
+                  repfnz_col(chrep) = chperm; 
+              }
+              else 
+              { // Cont. dfs at snode-rep of kchild
+                xplore(krep) = xdfs; 
+                oldrep = krep; 
+                krep = chrep; // Go deeper down G(L)
+                parent(krep) = oldrep; 
+                repfnz_col(krep) = chperm; 
+                xdfs = glu.xlsub(krep); 
+                maxdfs = xprune(krep); 
+                
+              } // end if myfnz != -1
+            } // end if chperm == -1 
+                
+          } // end if chmark !=jj
+        } // end while xdfs < maxdfs
+        
+        // krow has no more unexplored nbrs :
+        //    Place snode-rep krep in postorder DFS, if this 
+        //    segment is seen for the first time. (Note that 
+        //    "repfnz(krep)" may change later.)
+        //    Baktrack dfs to its parent
+        if(traits.update_segrep(krep,jj))
+        //if (marker1(krep) < jcol )
+        {
+          segrep(nseg) = krep; 
+          ++nseg; 
+          //marker1(krep) = jj; 
+        }
+        
+        kpar = parent(krep); // Pop recursion, mimic recursion 
+        if (kpar == emptyIdxLU) 
+          break; // dfs done 
+        krep = kpar; 
+        xdfs = xplore(krep); 
+        maxdfs = xprune(krep); 
+
+      } while (kpar != emptyIdxLU); // Do until empty stack 
+      
+    } // end if (myfnz = -1)
+
+  } // end if (kperm == -1)   
+}
+
+/**
+ * \brief Performs a symbolic factorization on a panel of columns [jcol, jcol+w)
+ * 
+ * A supernode representative is the last column of a supernode.
+ * The nonzeros in U[*,j] are segments that end at supernodes representatives
+ * 
+ * The routine returns a list of the supernodal representatives 
+ * in topological order of the dfs that generates them. This list is 
+ * a superset of the topological order of each individual column within 
+ * the panel.
+ * The location of the first nonzero in each supernodal segment 
+ * (supernodal entry location) is also returned. Each column has 
+ * a separate list for this purpose. 
+ * 
+ * Two markers arrays are used for dfs :
+ *    marker[i] == jj, if i was visited during dfs of current column jj;
+ *    marker1[i] >= jcol, if i was visited by earlier columns in this panel; 
+ * 
+ * \param[in] m number of rows in the matrix
+ * \param[in] w Panel size
+ * \param[in] jcol Starting  column of the panel
+ * \param[in] A Input matrix in column-major storage
+ * \param[in] perm_r Row permutation
+ * \param[out] nseg Number of U segments
+ * \param[out] dense Accumulate the column vectors of the panel
+ * \param[out] panel_lsub Subscripts of the row in the panel 
+ * \param[out] segrep Segment representative i.e first nonzero row of each segment
+ * \param[out] repfnz First nonzero location in each row
+ * \param[out] xprune The pruned elimination tree
+ * \param[out] marker work vector
+ * \param  parent The elimination tree
+ * \param xplore work vector
+ * \param glu The global data structure
+ * 
+ */
+
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::panel_dfs(const Index m, const Index w, const Index jcol, MatrixType& A, IndexVector& perm_r, Index& nseg, ScalarVector& dense, IndexVector& panel_lsub, IndexVector& segrep, IndexVector& repfnz, IndexVector& xprune, IndexVector& marker, IndexVector& parent, IndexVector& xplore, GlobalLU_t& glu)
+{
+  Index nextl_col; // Next available position in panel_lsub[*,jj] 
+  
+  // Initialize pointers 
+  VectorBlock<IndexVector> marker1(marker, m, m); 
+  nseg = 0; 
+  
+  panel_dfs_traits<IndexVector> traits(jcol, marker1.data());
+  
+  // For each column in the panel 
+  for (Index jj = jcol; jj < jcol + w; jj++) 
+  {
+    nextl_col = (jj - jcol) * m; 
+    
+    VectorBlock<IndexVector> repfnz_col(repfnz, nextl_col, m); // First nonzero location in each row
+    VectorBlock<ScalarVector> dense_col(dense,nextl_col, m); // Accumulate a column vector here
+    
+    
+    // For each nnz in A[*, jj] do depth first search
+    for (typename MatrixType::InnerIterator it(A, jj); it; ++it)
+    {
+      Index krow = it.row(); 
+      dense_col(krow) = it.value();
+      
+      Index kmark = marker(krow); 
+      if (kmark == jj) 
+        continue; // krow visited before, go to the next nonzero
+      
+      dfs_kernel(jj, perm_r, nseg, panel_lsub, segrep, repfnz_col, xprune, marker, parent,
+                   xplore, glu, nextl_col, krow, traits);
+    }// end for nonzeros in column jj
+    
+  } // end for column jj
+}
+
+} // end namespace internal
+} // end namespace Eigen
+
+#endif // SPARSELU_PANEL_DFS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pivotL.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pivotL.h
new file mode 100644
index 0000000..ddcd4ec
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pivotL.h
@@ -0,0 +1,134 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of xpivotL.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 3.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * October 15, 2003
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_PIVOTL_H
+#define SPARSELU_PIVOTL_H
+
+namespace Eigen {
+namespace internal {
+  
+/**
+ * \brief Performs the numerical pivotin on the current column of L, and the CDIV operation.
+ * 
+ * Pivot policy :
+ * (1) Compute thresh = u * max_(i>=j) abs(A_ij);
+ * (2) IF user specifies pivot row k and abs(A_kj) >= thresh THEN
+ *           pivot row = k;
+ *       ELSE IF abs(A_jj) >= thresh THEN
+ *           pivot row = j;
+ *       ELSE
+ *           pivot row = m;
+ * 
+ *   Note: If you absolutely want to use a given pivot order, then set u=0.0.
+ * 
+ * \param jcol The current column of L
+ * \param diagpivotthresh diagonal pivoting threshold
+ * \param[in,out] perm_r Row permutation (threshold pivoting)
+ * \param[in] iperm_c column permutation - used to finf diagonal of Pc*A*Pc'
+ * \param[out] pivrow  The pivot row
+ * \param glu Global LU data
+ * \return 0 if success, i > 0 if U(i,i) is exactly zero 
+ * 
+ */
+template <typename Scalar, typename Index>
+Index SparseLUImpl<Scalar,Index>::pivotL(const Index jcol, const RealScalar& diagpivotthresh, IndexVector& perm_r, IndexVector& iperm_c, Index& pivrow, GlobalLU_t& glu)
+{
+  
+  Index fsupc = (glu.xsup)((glu.supno)(jcol)); // First column in the supernode containing the column jcol
+  Index nsupc = jcol - fsupc; // Number of columns in the supernode portion, excluding jcol; nsupc >=0
+  Index lptr = glu.xlsub(fsupc); // pointer to the starting location of the row subscripts for this supernode portion
+  Index nsupr = glu.xlsub(fsupc+1) - lptr; // Number of rows in the supernode
+  Index lda = glu.xlusup(fsupc+1) - glu.xlusup(fsupc); // leading dimension
+  Scalar* lu_sup_ptr = &(glu.lusup.data()[glu.xlusup(fsupc)]); // Start of the current supernode
+  Scalar* lu_col_ptr = &(glu.lusup.data()[glu.xlusup(jcol)]); // Start of jcol in the supernode
+  Index* lsub_ptr = &(glu.lsub.data()[lptr]); // Start of row indices of the supernode
+  
+  // Determine the largest abs numerical value for partial pivoting 
+  Index diagind = iperm_c(jcol); // diagonal index 
+  RealScalar pivmax = 0.0; 
+  Index pivptr = nsupc; 
+  Index diag = emptyIdxLU; 
+  RealScalar rtemp;
+  Index isub, icol, itemp, k; 
+  for (isub = nsupc; isub < nsupr; ++isub) {
+    rtemp = std::abs(lu_col_ptr[isub]);
+    if (rtemp > pivmax) {
+      pivmax = rtemp; 
+      pivptr = isub;
+    } 
+    if (lsub_ptr[isub] == diagind) diag = isub;
+  }
+  
+  // Test for singularity
+  if ( pivmax == 0.0 ) {
+    pivrow = lsub_ptr[pivptr];
+    perm_r(pivrow) = jcol;
+    return (jcol+1);
+  }
+  
+  RealScalar thresh = diagpivotthresh * pivmax; 
+  
+  // Choose appropriate pivotal element 
+  
+  {
+    // Test if the diagonal element can be used as a pivot (given the threshold value)
+    if (diag >= 0 ) 
+    {
+      // Diagonal element exists
+      rtemp = std::abs(lu_col_ptr[diag]);
+      if (rtemp != 0.0 && rtemp >= thresh) pivptr = diag;
+    }
+    pivrow = lsub_ptr[pivptr];
+  }
+  
+  // Record pivot row
+  perm_r(pivrow) = jcol; 
+  // Interchange row subscripts
+  if (pivptr != nsupc )
+  {
+    std::swap( lsub_ptr[pivptr], lsub_ptr[nsupc] );
+    // Interchange numerical values as well, for the two rows in the whole snode
+    // such that L is indexed the same way as A
+    for (icol = 0; icol <= nsupc; icol++)
+    {
+      itemp = pivptr + icol * lda; 
+      std::swap(lu_sup_ptr[itemp], lu_sup_ptr[nsupc + icol * lda]);
+    }
+  }
+  // cdiv operations
+  Scalar temp = Scalar(1.0) / lu_col_ptr[nsupc];
+  for (k = nsupc+1; k < nsupr; k++)
+    lu_col_ptr[k] *= temp; 
+  return 0;
+}
+
+} // end namespace internal
+} // end namespace Eigen
+
+#endif // SPARSELU_PIVOTL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pruneL.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pruneL.h
new file mode 100644
index 0000000..5a855f8
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_pruneL.h
@@ -0,0 +1,135 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* 
+ 
+ * NOTE: This file is the modified version of [s,d,c,z]pruneL.c file in SuperLU 
+ 
+ * -- SuperLU routine (version 2.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * November 15, 1997
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+#ifndef SPARSELU_PRUNEL_H
+#define SPARSELU_PRUNEL_H
+
+namespace Eigen {
+namespace internal {
+
+/**
+ * \brief Prunes the L-structure.
+ *
+ * It prunes the L-structure  of supernodes whose L-structure contains the current pivot row "pivrow"
+ * 
+ * 
+ * \param jcol The current column of L
+ * \param[in] perm_r Row permutation
+ * \param[out] pivrow  The pivot row
+ * \param nseg Number of segments
+ * \param segrep 
+ * \param repfnz
+ * \param[out] xprune 
+ * \param glu Global LU data
+ * 
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::pruneL(const Index jcol, const IndexVector& perm_r, const Index pivrow, const Index nseg, const IndexVector& segrep, BlockIndexVector repfnz, IndexVector& xprune, GlobalLU_t& glu)
+{
+  // For each supernode-rep irep in U(*,j]
+  Index jsupno = glu.supno(jcol); 
+  Index i,irep,irep1; 
+  bool movnum, do_prune = false; 
+  Index kmin, kmax, minloc, maxloc,krow; 
+  for (i = 0; i < nseg; i++)
+  {
+    irep = segrep(i); 
+    irep1 = irep + 1; 
+    do_prune = false; 
+    
+    // Don't prune with a zero U-segment 
+    if (repfnz(irep) == emptyIdxLU) continue; 
+    
+    // If a snode overlaps with the next panel, then the U-segment
+    // is fragmented into two parts -- irep and irep1. We should let 
+    // pruning occur at the rep-column in irep1s snode. 
+    if (glu.supno(irep) == glu.supno(irep1) ) continue; // don't prune 
+    
+    // If it has not been pruned & it has a nonz in row L(pivrow,i)
+    if (glu.supno(irep) != jsupno )
+    {
+      if ( xprune (irep) >= glu.xlsub(irep1) )
+      {
+        kmin = glu.xlsub(irep);
+        kmax = glu.xlsub(irep1) - 1; 
+        for (krow = kmin; krow <= kmax; krow++)
+        {
+          if (glu.lsub(krow) == pivrow) 
+          {
+            do_prune = true; 
+            break; 
+          }
+        }
+      }
+      
+      if (do_prune) 
+      {
+        // do a quicksort-type partition
+        // movnum=true means that the num values have to be exchanged
+        movnum = false; 
+        if (irep == glu.xsup(glu.supno(irep)) ) // Snode of size 1 
+          movnum = true; 
+        
+        while (kmin <= kmax)
+        {
+          if (perm_r(glu.lsub(kmax)) == emptyIdxLU)
+            kmax--; 
+          else if ( perm_r(glu.lsub(kmin)) != emptyIdxLU)
+            kmin++;
+          else 
+          {
+            // kmin below pivrow (not yet pivoted), and kmax
+            // above pivrow: interchange the two suscripts
+            std::swap(glu.lsub(kmin), glu.lsub(kmax)); 
+            
+            // If the supernode has only one column, then we 
+            // only keep one set of subscripts. For any subscript
+            // intercnahge performed, similar interchange must be 
+            // done on the numerical values. 
+            if (movnum) 
+            {
+              minloc = glu.xlusup(irep) + ( kmin - glu.xlsub(irep) ); 
+              maxloc = glu.xlusup(irep) + ( kmax - glu.xlsub(irep) ); 
+              std::swap(glu.lusup(minloc), glu.lusup(maxloc)); 
+            }
+            kmin++;
+            kmax--;
+          }
+        } // end while 
+        
+        xprune(irep) = kmin;  //Pruning 
+      } // end if do_prune 
+    } // end pruning 
+  } // End for each U-segment
+}
+
+} // end namespace internal
+} // end namespace Eigen
+
+#endif // SPARSELU_PRUNEL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_relax_snode.h b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_relax_snode.h
new file mode 100644
index 0000000..58ec32e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseLU/SparseLU_relax_snode.h
@@ -0,0 +1,83 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+/* This file is a modified version of heap_relax_snode.c file in SuperLU
+ * -- SuperLU routine (version 3.0) --
+ * Univ. of California Berkeley, Xerox Palo Alto Research Center,
+ * and Lawrence Berkeley National Lab.
+ * October 15, 2003
+ *
+ * Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+ *
+ * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+ * EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+ *
+ * Permission is hereby granted to use or copy this program for any
+ * purpose, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is
+ * granted, provided the above notices are retained, and a notice that
+ * the code was modified is included with the above copyright notice.
+ */
+
+#ifndef SPARSELU_RELAX_SNODE_H
+#define SPARSELU_RELAX_SNODE_H
+
+namespace Eigen {
+
+namespace internal {
+ 
+/** 
+ * \brief Identify the initial relaxed supernodes
+ * 
+ * This routine is applied to a column elimination tree. 
+ * It assumes that the matrix has been reordered according to the postorder of the etree
+ * \param n  the number of columns
+ * \param et elimination tree 
+ * \param relax_columns Maximum number of columns allowed in a relaxed snode 
+ * \param descendants Number of descendants of each node in the etree
+ * \param relax_end last column in a supernode
+ */
+template <typename Scalar, typename Index>
+void SparseLUImpl<Scalar,Index>::relax_snode (const Index n, IndexVector& et, const Index relax_columns, IndexVector& descendants, IndexVector& relax_end)
+{
+  
+  // compute the number of descendants of each node in the etree
+  Index j, parent; 
+  relax_end.setConstant(emptyIdxLU);
+  descendants.setZero();
+  for (j = 0; j < n; j++) 
+  {
+    parent = et(j);
+    if (parent != n) // not the dummy root
+      descendants(parent) += descendants(j) + 1;
+  }
+  // Identify the relaxed supernodes by postorder traversal of the etree
+  Index snode_start; // beginning of a snode 
+  for (j = 0; j < n; )
+  {
+    parent = et(j);
+    snode_start = j; 
+    while ( parent != n && descendants(parent) < relax_columns ) 
+    {
+      j = parent; 
+      parent = et(j);
+    }
+    // Found a supernode in postordered etree, j is the last column 
+    relax_end(snode_start) = j; // Record last column
+    j++;
+    // Search for a new leaf
+    while (descendants(j) != 0 && j < n) j++;
+  } // End postorder traversal of the etree
+  
+}
+
+} // end namespace internal
+
+} // end namespace Eigen
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseQR/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SparseQR/CMakeLists.txt
new file mode 100644
index 0000000..f9ddf2b
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseQR/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SparseQR_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_SparseQR_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SparseQR/ COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SparseQR/SparseQR.h b/vendor/eigen-3.1.91/Eigen/src/SparseQR/SparseQR.h
new file mode 100644
index 0000000..b3d5cd2
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SparseQR/SparseQR.h
@@ -0,0 +1,588 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2012-2013 Desire Nuentsa <desire.nuentsa_wakam at inria.fr>
+// Copyright (C) 2012-2013 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_QR_H
+#define EIGEN_SPARSE_QR_H
+
+namespace Eigen {
+
+template<typename MatrixType, typename OrderingType> class SparseQR;
+template<typename SparseQRType> struct SparseQRMatrixQReturnType;
+template<typename SparseQRType> struct SparseQRMatrixQTransposeReturnType;
+template<typename SparseQRType, typename Derived> struct SparseQR_QProduct;
+namespace internal {
+  template <typename SparseQRType> struct traits<SparseQRMatrixQReturnType<SparseQRType> >
+  {
+    typedef typename SparseQRType::MatrixType ReturnType;
+  };
+  template <typename SparseQRType> struct traits<SparseQRMatrixQTransposeReturnType<SparseQRType> >
+  {
+    typedef typename SparseQRType::MatrixType ReturnType;
+  };
+  template <typename SparseQRType, typename Derived> struct traits<SparseQR_QProduct<SparseQRType, Derived> >
+  {
+    typedef typename Derived::PlainObject ReturnType;
+  };
+} // End namespace internal
+
+/**
+  * \ingroup SparseQR_Module
+  * \class SparseQR
+  * \brief Sparse left-looking rank-revealing QR factorization
+  * 
+  * This class implements a left-looking rank-revealing QR decomposition 
+  * of sparse matrices. When a column has a norm less than a given tolerance
+  * it is implicitly permuted to the end. The QR factorization thus obtained is 
+  * given by A*P = Q*R where R is upper triangular or trapezoidal. 
+  * 
+  * P is the column permutation which is the product of the fill-reducing and the
+  * rank-revealing permutations. Use colsPermutation() to get it.
+  * 
+  * Q is the orthogonal matrix represented as products of Householder reflectors. 
+  * Use matrixQ() to get an expression and matrixQ().transpose() to get the transpose.
+  * You can then apply it to a vector.
+  * 
+  * R is the sparse triangular or trapezoidal matrix. The later occurs when A is rank-deficient.
+  * matrixR().topLeftCorner(rank(), rank()) always returns a triangular factor of full rank.
+  * 
+  * \tparam _MatrixType The type of the sparse matrix A, must be a column-major SparseMatrix<>
+  * \tparam _OrderingType The fill-reducing ordering method. See the \link OrderingMethods_Module 
+  *  OrderingMethods \endlink module for the list of built-in and external ordering methods.
+  * 
+  * 
+  */
+template<typename _MatrixType, typename _OrderingType>
+class SparseQR
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef _OrderingType OrderingType;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef SparseMatrix<Scalar,ColMajor,Index> QRMatrixType;
+    typedef Matrix<Index, Dynamic, 1> IndexVector;
+    typedef Matrix<Scalar, Dynamic, 1> ScalarVector;
+    typedef PermutationMatrix<Dynamic, Dynamic, Index> PermutationType;
+  public:
+    SparseQR () : m_isInitialized(false), m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true)
+    { }
+    
+    SparseQR(const MatrixType& mat) : m_isInitialized(false), m_analysisIsok(false), m_lastError(""), m_useDefaultThreshold(true)
+    {
+      compute(mat);
+    }
+    void compute(const MatrixType& mat)
+    {
+      analyzePattern(mat);
+      factorize(mat);
+    }
+    void analyzePattern(const MatrixType& mat);
+    void factorize(const MatrixType& mat);
+    
+    /** \returns the number of rows of the represented matrix. 
+      */
+    inline Index rows() const { return m_pmat.rows(); }
+    
+    /** \returns the number of columns of the represented matrix. 
+      */
+    inline Index cols() const { return m_pmat.cols();}
+    
+    /** \returns a const reference to the \b sparse upper triangular matrix R of the QR factorization.
+      */
+    const QRMatrixType& matrixR() const { return m_R; }
+    
+    /** \returns the number of non linearly dependent columns as determined by the pivoting threshold.
+      *
+      * \sa setPivotThreshold()
+      */
+    Index rank() const 
+    {
+      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+      return m_nonzeropivots; 
+    }
+    
+    /** \returns an expression of the matrix Q as products of sparse Householder reflectors.
+      * You can do the following to get an actual SparseMatrix representation of Q:
+      * \code
+      * SparseMatrix<double> Q = SparseQR<SparseMatrix<double> >(A).matrixQ();
+      * \endcode
+      */
+    SparseQRMatrixQReturnType<SparseQR> matrixQ() const 
+    { return SparseQRMatrixQReturnType<SparseQR>(*this); }
+    
+    /** \returns a const reference to the column permutation P that was applied to A such that A*P = Q*R
+      * It is the combination of the fill-in reducing permutation and numerical column pivoting.
+      */
+    const PermutationType& colsPermutation() const
+    { 
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_outputPerm_c;
+    }
+    
+    /** \returns A string describing the type of error.
+      * This method is provided to ease debugging, not to handle errors.
+      */
+    std::string lastErrorMessage() const { return m_lastError; }
+    
+    /** \internal */
+    template<typename Rhs, typename Dest>
+    bool _solve(const MatrixBase<Rhs> &B, MatrixBase<Dest> &dest) const
+    {
+      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+      eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+
+      Index rank = this->rank();
+      
+      // Compute Q^T * b;
+      typename Dest::PlainObject y, b;
+      y = this->matrixQ().transpose() * B; 
+      b = y;
+      
+      // Solve with the triangular matrix R
+      y.topRows(rank) = this->matrixR().topLeftCorner(rank, rank).template triangularView<Upper>().solve(b.topRows(rank));
+      y.bottomRows(y.size()-rank).setZero();
+
+      // Apply the column permutation
+      if (m_perm_c.size())  dest.topRows(cols()) = colsPermutation() * y.topRows(cols());
+      else                  dest = y.topRows(cols());
+      
+      m_info = Success;
+      return true;
+    }
+    
+    /** Sets the threshold that is used to determine linearly dependent columns during the factorization.
+      *
+      * In practice, if during the factorization the norm of the column that has to be eliminated is below
+      * this threshold, then the entire column is treated as zero, and it is moved at the end.
+      */
+    void setPivotThreshold(const RealScalar& threshold)
+    {
+      m_useDefaultThreshold = false;
+      m_threshold = threshold;
+    }
+    
+    /** \returns the solution X of \f$ A X = B \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<SparseQR, Rhs> solve(const MatrixBase<Rhs>& B) const 
+    {
+      eigen_assert(m_isInitialized && "The factorization should be called first, use compute()");
+      eigen_assert(this->rows() == B.rows() && "SparseQR::solve() : invalid number of rows in the right hand side matrix");
+      return internal::solve_retval<SparseQR, Rhs>(*this, B.derived());
+    }
+    
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the QR factorization reports a numerical problem
+      *          \c InvalidInput if the input matrix is invalid
+      *
+      * \sa iparm()          
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+    
+  protected:
+    bool m_isInitialized;
+    bool m_analysisIsok;
+    bool m_factorizationIsok;
+    mutable ComputationInfo m_info;
+    std::string m_lastError;
+    QRMatrixType m_pmat;            // Temporary matrix
+    QRMatrixType m_R;               // The triangular factor matrix
+    QRMatrixType m_Q;               // The orthogonal reflectors
+    ScalarVector m_hcoeffs;         // The Householder coefficients
+    PermutationType m_perm_c;       // Fill-reducing  Column  permutation
+    PermutationType m_pivotperm;    // The permutation for rank revealing
+    PermutationType m_outputPerm_c; // The final column permutation
+    RealScalar m_threshold;         // Threshold to determine null Householder reflections
+    bool m_useDefaultThreshold;     // Use default threshold
+    Index m_nonzeropivots;          // Number of non zero pivots found 
+    IndexVector m_etree;            // Column elimination tree
+    IndexVector m_firstRowElt;      // First element in each row
+    
+    template <typename, typename > friend struct SparseQR_QProduct;
+    
+};
+
+/** \brief Preprocessing step of a QR factorization 
+  * 
+  * In this step, the fill-reducing permutation is computed and applied to the columns of A
+  * and the column elimination tree is computed as well. Only the sparcity pattern of \a mat is exploited.
+  * 
+  * \note In this step it is assumed that there is no empty row in the matrix \a mat.
+  */
+template <typename MatrixType, typename OrderingType>
+void SparseQR<MatrixType,OrderingType>::analyzePattern(const MatrixType& mat)
+{
+  // Compute the column fill reducing ordering
+  OrderingType ord; 
+  ord(mat, m_perm_c); 
+  Index n = mat.cols();
+  Index m = mat.rows();
+  
+  if (!m_perm_c.size())
+  {
+    m_perm_c.resize(n);
+    m_perm_c.indices().setLinSpaced(n, 0,n-1);
+  }
+  
+  // Compute the column elimination tree of the permuted matrix
+  m_outputPerm_c = m_perm_c.inverse();
+  internal::coletree(mat, m_etree, m_firstRowElt, m_outputPerm_c.indices().data());
+  
+  m_R.resize(n, n);
+  m_Q.resize(m, n);
+  
+  // Allocate space for nonzero elements : rough estimation
+  m_R.reserve(2*mat.nonZeros()); //FIXME Get a more accurate estimation through symbolic factorization with the etree
+  m_Q.reserve(2*mat.nonZeros());
+  m_hcoeffs.resize(n);
+  m_analysisIsok = true;
+}
+
+/** \brief Performs the numerical QR factorization of the input matrix
+  * 
+  * The function SparseQR::analyzePattern(const MatrixType&) must have been called beforehand with
+  * a matrix having the same sparcity pattern than \a mat.
+  * 
+  * \param mat The sparse column-major matrix
+  */
+template <typename MatrixType, typename OrderingType>
+void SparseQR<MatrixType,OrderingType>::factorize(const MatrixType& mat)
+{
+  using std::abs;
+  using std::max;
+  
+  eigen_assert(m_analysisIsok && "analyzePattern() should be called before this step");
+  Index m = mat.rows();
+  Index n = mat.cols();
+  IndexVector mark(m); mark.setConstant(-1);  // Record the visited nodes
+  IndexVector Ridx(n), Qidx(m);               // Store temporarily the row indexes for the current column of R and Q
+  Index nzcolR, nzcolQ;                       // Number of nonzero for the current column of R and Q
+  ScalarVector tval(m);                       // The dense vector used to compute the current column
+  bool found_diag;
+    
+  m_pmat = mat;
+  m_pmat.uncompress(); // To have the innerNonZeroPtr allocated
+  // Apply the fill-in reducing permutation lazily:
+  for (int i = 0; i < n; i++)
+  {
+    Index p = m_perm_c.size() ? m_perm_c.indices()(i) : i;
+    m_pmat.outerIndexPtr()[p] = mat.outerIndexPtr()[i]; 
+    m_pmat.innerNonZeroPtr()[p] = mat.outerIndexPtr()[i+1] - mat.outerIndexPtr()[i]; 
+  }
+  
+  /* Compute the default threshold, see : 
+   * Tim Davis, "Algorithm 915, SuiteSparseQR: Multifrontal Multithreaded Rank-Revealing
+   * Sparse QR Factorization, ACM Trans. on Math. Soft. 38(1), 2011, Page 8:3 
+   */
+  if(m_useDefaultThreshold) 
+  {
+    RealScalar max2Norm = 0.0;
+    for (int j = 0; j < n; j++) max2Norm = (max)(max2Norm, m_pmat.col(j).norm());
+    m_threshold = 20 * (m + n) * max2Norm * NumTraits<RealScalar>::epsilon();
+  }
+  
+  // Initialize the numerical permutation
+  m_pivotperm.setIdentity(n);
+  
+  Index nonzeroCol = 0; // Record the number of valid pivots
+  
+  // Left looking rank-revealing QR factorization: compute a column of R and Q at a time
+  for (Index col = 0; col < n; ++col)
+  {
+    mark.setConstant(-1);
+    m_R.startVec(col);
+    m_Q.startVec(col);
+    mark(nonzeroCol) = col;
+    Qidx(0) = nonzeroCol;
+    nzcolR = 0; nzcolQ = 1;
+    found_diag = false;
+    tval.setZero(); 
+    
+    // Symbolic factorization: find the nonzero locations of the column k of the factors R and Q, i.e.,
+    // all the nodes (with indexes lower than rank) reachable through the column elimination tree (etree) rooted at node k.
+    // Note: if the diagonal entry does not exist, then its contribution must be explicitly added,
+    // thus the trick with found_diag that permits to do one more iteration on the diagonal element if this one has not been found.
+    for (typename MatrixType::InnerIterator itp(m_pmat, col); itp || !found_diag; ++itp)
+    {
+      Index curIdx = nonzeroCol ;
+      if(itp) curIdx = itp.row();
+      if(curIdx == nonzeroCol) found_diag = true;
+      
+      // Get the nonzeros indexes of the current column of R
+      Index st = m_firstRowElt(curIdx); // The traversal of the etree starts here 
+      if (st < 0 )
+      {
+        m_lastError = "Empty row found during numerical factorization";
+        m_info = InvalidInput;
+        return;
+      }
+
+      // Traverse the etree 
+      Index bi = nzcolR;
+      for (; mark(st) != col; st = m_etree(st))
+      {
+        Ridx(nzcolR) = st;  // Add this row to the list,
+        mark(st) = col;     // and mark this row as visited
+        nzcolR++;
+      }
+
+      // Reverse the list to get the topological ordering
+      Index nt = nzcolR-bi;
+      for(Index i = 0; i < nt/2; i++) std::swap(Ridx(bi+i), Ridx(nzcolR-i-1));
+       
+      // Copy the current (curIdx,pcol) value of the input matrix
+      if(itp) tval(curIdx) = itp.value();
+      else    tval(curIdx) = Scalar(0);
+      
+      // Compute the pattern of Q(:,k)
+      if(curIdx > nonzeroCol && mark(curIdx) != col ) 
+      {
+        Qidx(nzcolQ) = curIdx;  // Add this row to the pattern of Q,
+        mark(curIdx) = col;     // and mark it as visited
+        nzcolQ++;
+      }
+    }
+
+    // Browse all the indexes of R(:,col) in reverse order
+    for (Index i = nzcolR-1; i >= 0; i--)
+    {
+      Index curIdx = m_pivotperm.indices()(Ridx(i));
+      
+      // Apply the curIdx-th householder vector to the current column (temporarily stored into tval)
+      Scalar tdot(0);
+      
+      // First compute q' * tval
+      tdot = m_Q.col(curIdx).dot(tval);
+
+      tdot *= m_hcoeffs(curIdx);
+      
+      // Then update tval = tval - q * tau
+      // FIXME: tval -= tdot * m_Q.col(curIdx) should amount to the same (need to check/add support for efficient "dense ?= sparse")
+      for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
+        tval(itq.row()) -= itq.value() * tdot;
+
+      // Detect fill-in for the current column of Q
+      if(m_etree(Ridx(i)) == nonzeroCol)
+      {
+        for (typename QRMatrixType::InnerIterator itq(m_Q, curIdx); itq; ++itq)
+        {
+          Index iQ = itq.row();
+          if (mark(iQ) != col)
+          {
+            Qidx(nzcolQ++) = iQ;  // Add this row to the pattern of Q,
+            mark(iQ) = col;       // and mark it as visited
+          }
+        }
+      }
+    } // End update current column
+        
+    // Compute the Householder reflection that eliminate the current column
+    // FIXME this step should call the Householder module.
+    Scalar tau;
+    RealScalar beta;
+    Scalar c0 = nzcolQ ? tval(Qidx(0)) : Scalar(0);
+    
+    // First, the squared norm of Q((col+1):m, col)
+    RealScalar sqrNorm = 0.;
+    for (Index itq = 1; itq < nzcolQ; ++itq) sqrNorm += internal::abs2(tval(Qidx(itq)));
+    
+    if(sqrNorm == RealScalar(0) && internal::imag(c0) == RealScalar(0))
+    {
+      tau = RealScalar(0);
+      beta = internal::real(c0);
+      tval(Qidx(0)) = 1;
+     }
+    else
+    {
+      beta = std::sqrt(internal::abs2(c0) + sqrNorm);
+      if(internal::real(c0) >= RealScalar(0))
+        beta = -beta;
+      tval(Qidx(0)) = 1;
+      for (Index itq = 1; itq < nzcolQ; ++itq)
+        tval(Qidx(itq)) /= (c0 - beta);
+      tau = internal::conj((beta-c0) / beta);
+        
+    }
+
+    // Insert values in R
+    for (Index  i = nzcolR-1; i >= 0; i--)
+    {
+      Index curIdx = Ridx(i);
+      if(curIdx < nonzeroCol) 
+      {
+        m_R.insertBackByOuterInnerUnordered(col, curIdx) = tval(curIdx);
+        tval(curIdx) = Scalar(0.);
+      }
+    }
+
+    if(abs(beta) >= m_threshold)
+    {
+      m_R.insertBackByOuterInner(col, nonzeroCol) = beta;
+      nonzeroCol++;
+      // The householder coefficient
+      m_hcoeffs(col) = tau;
+      // Record the householder reflections
+      for (Index itq = 0; itq < nzcolQ; ++itq)
+      {
+        Index iQ = Qidx(itq);
+        m_Q.insertBackByOuterInnerUnordered(col,iQ) = tval(iQ);
+        tval(iQ) = Scalar(0.);
+      }    
+    }
+    else
+    {
+      // Zero pivot found: move implicitly this column to the end
+      m_hcoeffs(col) = Scalar(0);
+      for (Index j = nonzeroCol; j < n-1; j++) 
+        std::swap(m_pivotperm.indices()(j), m_pivotperm.indices()[j+1]);
+      
+      // Recompute the column elimination tree
+      internal::coletree(m_pmat, m_etree, m_firstRowElt, m_pivotperm.indices().data());
+    }
+  }
+  
+  // Finalize the column pointers of the sparse matrices R and Q
+  m_Q.finalize();
+  m_Q.makeCompressed();
+  m_R.finalize();
+  m_R.makeCompressed();
+  
+  m_nonzeropivots = nonzeroCol;
+  
+  if(nonzeroCol<n)
+  {
+    // Permute the triangular factor to put the 'dead' columns to the end
+    MatrixType tempR(m_R);
+    m_R = tempR * m_pivotperm;
+    
+    // Update the column permutation
+    m_outputPerm_c = m_outputPerm_c * m_pivotperm;
+  }
+  
+  m_isInitialized = true; 
+  m_factorizationIsok = true;
+  m_info = Success;
+}
+
+namespace internal {
+  
+template<typename _MatrixType, typename OrderingType, typename Rhs>
+struct solve_retval<SparseQR<_MatrixType,OrderingType>, Rhs>
+  : solve_retval_base<SparseQR<_MatrixType,OrderingType>, Rhs>
+{
+  typedef SparseQR<_MatrixType,OrderingType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+} // end namespace internal
+
+template <typename SparseQRType, typename Derived>
+struct SparseQR_QProduct : ReturnByValue<SparseQR_QProduct<SparseQRType, Derived> >
+{
+  typedef typename SparseQRType::QRMatrixType MatrixType;
+  typedef typename SparseQRType::Scalar Scalar;
+  typedef typename SparseQRType::Index Index;
+  // Get the references 
+  SparseQR_QProduct(const SparseQRType& qr, const Derived& other, bool transpose) : 
+  m_qr(qr),m_other(other),m_transpose(transpose) {}
+  inline Index rows() const { return m_transpose ? m_qr.rows() : m_qr.cols(); }
+  inline Index cols() const { return m_other.cols(); }
+  
+  // Assign to a vector
+  template<typename DesType>
+  void evalTo(DesType& res) const
+  {
+    Index n = m_qr.cols(); 
+    if (m_transpose)
+    {
+      eigen_assert(m_qr.m_Q.rows() == m_other.rows() && "Non conforming object sizes");
+      // Compute res = Q' * other :
+      res =  m_other;
+      for (Index k = 0; k < n; k++)
+      {
+        Scalar tau = Scalar(0); 
+        tau = m_qr.m_Q.col(k).dot(res); 
+        tau = tau * m_qr.m_hcoeffs(k);
+        for (typename MatrixType::InnerIterator itq(m_qr.m_Q, k); itq; ++itq)
+        {
+          res(itq.row()) -= itq.value() * tau;
+        }
+      }
+    }
+    else
+    {
+      eigen_assert(m_qr.m_Q.cols() == m_other.rows() && "Non conforming object sizes");
+      // Compute res = Q * other :
+      res = m_other;
+      for (Index k = n-1; k >=0; k--)
+      {
+        Scalar tau = Scalar(0);
+        tau = m_qr.m_Q.col(k).dot(res); 
+        tau = tau * m_qr.m_hcoeffs(k);
+        res -= tau * m_qr.m_Q.col(k);
+      }
+    }
+  }
+  
+  const SparseQRType& m_qr;
+  const Derived& m_other;
+  bool m_transpose;
+};
+
+template<typename SparseQRType>
+struct SparseQRMatrixQReturnType
+{  
+  SparseQRMatrixQReturnType(const SparseQRType& qr) : m_qr(qr) {}
+  template<typename Derived>
+  SparseQR_QProduct<SparseQRType, Derived> operator*(const MatrixBase<Derived>& other)
+  {
+    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(),false);
+  }
+  SparseQRMatrixQTransposeReturnType<SparseQRType> adjoint() const
+  {
+    return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
+  }
+  // To use for operations with the transpose of Q
+  SparseQRMatrixQTransposeReturnType<SparseQRType> transpose() const
+  {
+    return SparseQRMatrixQTransposeReturnType<SparseQRType>(m_qr);
+  }
+  const SparseQRType& m_qr;
+};
+
+template<typename SparseQRType>
+struct SparseQRMatrixQTransposeReturnType
+{
+  SparseQRMatrixQTransposeReturnType(const SparseQRType& qr) : m_qr(qr) {}
+  template<typename Derived>
+  SparseQR_QProduct<SparseQRType,Derived> operator*(const MatrixBase<Derived>& other)
+  {
+    return SparseQR_QProduct<SparseQRType,Derived>(m_qr,other.derived(), true);
+  }
+  const SparseQRType& m_qr;
+};
+
+} // end namespace Eigen
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/StlSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/StlSupport/CMakeLists.txt
new file mode 100644
index 0000000..0f094f6
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/StlSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_StlSupport_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_StlSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/StlSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdDeque.h b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdDeque.h
new file mode 100644
index 0000000..4ee8e5c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdDeque.h
@@ -0,0 +1,134 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDDEQUE_H
+#define EIGEN_STDDEQUE_H
+
+#include "Eigen/src/StlSupport/details.h"
+
+// Define the explicit instantiation (e.g. necessary for the Intel compiler)
+#if defined(__INTEL_COMPILER) || defined(__GNUC__)
+  #define EIGEN_EXPLICIT_STL_DEQUE_INSTANTIATION(...) template class std::deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> >;
+#else
+  #define EIGEN_EXPLICIT_STL_DEQUE_INSTANTIATION(...)
+#endif
+
+/**
+ * This section contains a convenience MACRO which allows an easy specialization of
+ * std::deque such that for data types with alignment issues the correct allocator
+ * is used automatically.
+ */
+#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...) \
+EIGEN_EXPLICIT_STL_DEQUE_INSTANTIATION(__VA_ARGS__) \
+namespace std \
+{ \
+  template<typename _Ay> \
+  class deque<__VA_ARGS__, _Ay>  \
+    : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
+  { \
+    typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base; \
+  public: \
+    typedef __VA_ARGS__ value_type; \
+    typedef typename deque_base::allocator_type allocator_type; \
+    typedef typename deque_base::size_type size_type;  \
+    typedef typename deque_base::iterator iterator;  \
+    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}  \
+    template<typename InputIterator> \
+    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : deque_base(first, last, a) {} \
+    deque(const deque& c) : deque_base(c) {}  \
+    explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \
+    deque(iterator start, iterator end) : deque_base(start, end) {}  \
+    deque& operator=(const deque& x) {  \
+      deque_base::operator=(x);  \
+      return *this;  \
+    } \
+  }; \
+}
+
+// check whether we really need the std::deque specialization
+#if !(defined(_GLIBCXX_DEQUE) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::deque::resize(size_type,const T&). */
+
+namespace std {
+
+#define EIGEN_STD_DEQUE_SPECIALIZATION_BODY \
+  public:  \
+    typedef T value_type; \
+    typedef typename deque_base::allocator_type allocator_type; \
+    typedef typename deque_base::size_type size_type;  \
+    typedef typename deque_base::iterator iterator;  \
+    typedef typename deque_base::const_iterator const_iterator;  \
+    explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}  \
+    template<typename InputIterator> \
+    deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \
+    : deque_base(first, last, a) {} \
+    deque(const deque& c) : deque_base(c) {}  \
+    explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \
+    deque(iterator start, iterator end) : deque_base(start, end) {}  \
+    deque& operator=(const deque& x) {  \
+      deque_base::operator=(x);  \
+      return *this;  \
+    }
+
+  template<typename T>
+  class deque<T,EIGEN_ALIGNED_ALLOCATOR<T> >
+    : public deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                   Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >
+{
+  typedef deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > deque_base;
+  EIGEN_STD_DEQUE_SPECIALIZATION_BODY
+
+  void resize(size_type new_size)
+  { resize(new_size, T()); }
+
+#if defined(_DEQUE_)
+  // workaround MSVC std::deque implementation
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (deque_base::size() < new_size)
+      deque_base::_Insert_n(deque_base::end(), new_size - deque_base::size(), x);
+    else if (new_size < deque_base::size())
+      deque_base::erase(deque_base::begin() + new_size, deque_base::end());
+  }
+  void push_back(const value_type& x)
+  { deque_base::push_back(x); } 
+  void push_front(const value_type& x)
+  { deque_base::push_front(x); }
+  using deque_base::insert;  
+  iterator insert(const_iterator position, const value_type& x)
+  { return deque_base::insert(position,x); }
+  void insert(const_iterator position, size_type new_size, const value_type& x)
+  { deque_base::insert(position, new_size, x); }
+#elif defined(_GLIBCXX_DEQUE) && EIGEN_GNUC_AT_LEAST(4,2)
+  // workaround GCC std::deque implementation
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (new_size < deque_base::size())
+      deque_base::_M_erase_at_end(this->_M_impl._M_start + new_size);
+    else
+      deque_base::insert(deque_base::end(), new_size - deque_base::size(), x);
+  }
+#else
+  // either GCC 4.1 or non-GCC
+  // default implementation which should always work.
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (new_size < deque_base::size())
+      deque_base::erase(deque_base::begin() + new_size, deque_base::end());
+    else if (new_size > deque_base::size())
+      deque_base::insert(deque_base::end(), new_size - deque_base::size(), x);
+  }
+#endif
+  };
+}
+
+#endif // check whether specialization is actually required
+
+#endif // EIGEN_STDDEQUE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdList.h b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdList.h
new file mode 100644
index 0000000..627381e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdList.h
@@ -0,0 +1,114 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDLIST_H
+#define EIGEN_STDLIST_H
+
+#include "Eigen/src/StlSupport/details.h"
+
+// Define the explicit instantiation (e.g. necessary for the Intel compiler)
+#if defined(__INTEL_COMPILER) || defined(__GNUC__)
+  #define EIGEN_EXPLICIT_STL_LIST_INSTANTIATION(...) template class std::list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> >;
+#else
+  #define EIGEN_EXPLICIT_STL_LIST_INSTANTIATION(...)
+#endif
+
+/**
+ * This section contains a convenience MACRO which allows an easy specialization of
+ * std::list such that for data types with alignment issues the correct allocator
+ * is used automatically.
+ */
+#define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...) \
+EIGEN_EXPLICIT_STL_LIST_INSTANTIATION(__VA_ARGS__) \
+namespace std \
+{ \
+  template<typename _Ay> \
+  class list<__VA_ARGS__, _Ay>  \
+    : public list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
+  { \
+    typedef list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > list_base; \
+  public: \
+    typedef __VA_ARGS__ value_type; \
+    typedef typename list_base::allocator_type allocator_type; \
+    typedef typename list_base::size_type size_type;  \
+    typedef typename list_base::iterator iterator;  \
+    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}  \
+    template<typename InputIterator> \
+    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : list_base(first, last, a) {} \
+    list(const list& c) : list_base(c) {}  \
+    explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \
+    list(iterator start, iterator end) : list_base(start, end) {}  \
+    list& operator=(const list& x) {  \
+      list_base::operator=(x);  \
+      return *this;  \
+    } \
+  }; \
+}
+
+// check whether we really need the std::vector specialization
+#if !(defined(_GLIBCXX_VECTOR) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::list::resize(size_type,const T&). */
+
+namespace std
+{
+
+#define EIGEN_STD_LIST_SPECIALIZATION_BODY \
+  public:  \
+    typedef T value_type; \
+    typedef typename list_base::allocator_type allocator_type; \
+    typedef typename list_base::size_type size_type;  \
+    typedef typename list_base::iterator iterator;  \
+    typedef typename list_base::const_iterator const_iterator;  \
+    explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}  \
+    template<typename InputIterator> \
+    list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \
+    : list_base(first, last, a) {} \
+    list(const list& c) : list_base(c) {}  \
+    explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \
+    list(iterator start, iterator end) : list_base(start, end) {}  \
+    list& operator=(const list& x) {  \
+    list_base::operator=(x);  \
+    return *this; \
+  }
+
+  template<typename T>
+  class list<T,EIGEN_ALIGNED_ALLOCATOR<T> >
+    : public list<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                  Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >
+  {
+    typedef list<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                 Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > list_base;
+    EIGEN_STD_LIST_SPECIALIZATION_BODY
+
+    void resize(size_type new_size)
+    { resize(new_size, T()); }
+
+    void resize(size_type new_size, const value_type& x)
+    {
+      if (list_base::size() < new_size)
+        list_base::insert(list_base::end(), new_size - list_base::size(), x);
+      else
+        while (new_size < list_base::size()) list_base::pop_back();
+    }
+
+#if defined(_LIST_)
+    // workaround MSVC std::list implementation
+    void push_back(const value_type& x)
+    { list_base::push_back(x); } 
+    using list_base::insert;  
+    iterator insert(const_iterator position, const value_type& x)
+    { return list_base::insert(position,x); }
+    void insert(const_iterator position, size_type new_size, const value_type& x)
+    { list_base::insert(position, new_size, x); }
+#endif
+  };
+}
+
+#endif // check whether specialization is actually required
+
+#endif // EIGEN_STDLIST_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdVector.h b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdVector.h
new file mode 100644
index 0000000..40a9abe
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/StlSupport/StdVector.h
@@ -0,0 +1,126 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STDVECTOR_H
+#define EIGEN_STDVECTOR_H
+
+#include "Eigen/src/StlSupport/details.h"
+
+/**
+ * This section contains a convenience MACRO which allows an easy specialization of
+ * std::vector such that for data types with alignment issues the correct allocator
+ * is used automatically.
+ */
+#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...) \
+namespace std \
+{ \
+  template<> \
+  class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> >  \
+    : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \
+  { \
+    typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base; \
+  public: \
+    typedef __VA_ARGS__ value_type; \
+    typedef vector_base::allocator_type allocator_type; \
+    typedef vector_base::size_type size_type;  \
+    typedef vector_base::iterator iterator;  \
+    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}  \
+    template<typename InputIterator> \
+    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : vector_base(first, last, a) {} \
+    vector(const vector& c) : vector_base(c) {}  \
+    explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \
+    vector(iterator start, iterator end) : vector_base(start, end) {}  \
+    vector& operator=(const vector& x) {  \
+      vector_base::operator=(x);  \
+      return *this;  \
+    } \
+  }; \
+}
+
+namespace std {
+
+#define EIGEN_STD_VECTOR_SPECIALIZATION_BODY \
+  public:  \
+    typedef T value_type; \
+    typedef typename vector_base::allocator_type allocator_type; \
+    typedef typename vector_base::size_type size_type;  \
+    typedef typename vector_base::iterator iterator;  \
+    typedef typename vector_base::const_iterator const_iterator;  \
+    explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}  \
+    template<typename InputIterator> \
+    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \
+    : vector_base(first, last, a) {} \
+    vector(const vector& c) : vector_base(c) {}  \
+    explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \
+    vector(iterator start, iterator end) : vector_base(start, end) {}  \
+    vector& operator=(const vector& x) {  \
+      vector_base::operator=(x);  \
+      return *this;  \
+    }
+
+  template<typename T>
+  class vector<T,EIGEN_ALIGNED_ALLOCATOR<T> >
+    : public vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                    Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> >
+{
+  typedef vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T),
+                 Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > vector_base;
+  EIGEN_STD_VECTOR_SPECIALIZATION_BODY
+
+  void resize(size_type new_size)
+  { resize(new_size, T()); }
+
+#if defined(_VECTOR_)
+  // workaround MSVC std::vector implementation
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (vector_base::size() < new_size)
+      vector_base::_Insert_n(vector_base::end(), new_size - vector_base::size(), x);
+    else if (new_size < vector_base::size())
+      vector_base::erase(vector_base::begin() + new_size, vector_base::end());
+  }
+  void push_back(const value_type& x)
+  { vector_base::push_back(x); } 
+  using vector_base::insert;  
+  iterator insert(const_iterator position, const value_type& x)
+  { return vector_base::insert(position,x); }
+  void insert(const_iterator position, size_type new_size, const value_type& x)
+  { vector_base::insert(position, new_size, x); }
+#elif defined(_GLIBCXX_VECTOR) && (!(EIGEN_GNUC_AT_LEAST(4,1)))
+  /* Note that before gcc-4.1 we already have: std::vector::resize(size_type,const T&).
+   * However, this specialization is still needed to make the above EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION trick to work. */
+  void resize(size_type new_size, const value_type& x)
+  {
+    vector_base::resize(new_size,x);
+  }
+#elif defined(_GLIBCXX_VECTOR) && EIGEN_GNUC_AT_LEAST(4,2)
+  // workaround GCC std::vector implementation
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (new_size < vector_base::size())
+      vector_base::_M_erase_at_end(this->_M_impl._M_start + new_size);
+    else
+      vector_base::insert(vector_base::end(), new_size - vector_base::size(), x);
+  }
+#else
+  // either GCC 4.1 or non-GCC
+  // default implementation which should always work.
+  void resize(size_type new_size, const value_type& x)
+  {
+    if (new_size < vector_base::size())
+      vector_base::erase(vector_base::begin() + new_size, vector_base::end());
+    else if (new_size > vector_base::size())
+      vector_base::insert(vector_base::end(), new_size - vector_base::size(), x);
+  }
+#endif
+  };
+}
+
+#endif // EIGEN_STDVECTOR_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/StlSupport/details.h b/vendor/eigen-3.1.91/Eigen/src/StlSupport/details.h
new file mode 100644
index 0000000..d8debc7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/StlSupport/details.h
@@ -0,0 +1,84 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2009 Hauke Heibel <hauke.heibel at googlemail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_STL_DETAILS_H
+#define EIGEN_STL_DETAILS_H
+
+#ifndef EIGEN_ALIGNED_ALLOCATOR
+  #define EIGEN_ALIGNED_ALLOCATOR Eigen::aligned_allocator
+#endif
+
+namespace Eigen {
+
+  // This one is needed to prevent reimplementing the whole std::vector.
+  template <class T>
+  class aligned_allocator_indirection : public EIGEN_ALIGNED_ALLOCATOR<T>
+  {
+  public:
+    typedef size_t    size_type;
+    typedef ptrdiff_t difference_type;
+    typedef T*        pointer;
+    typedef const T*  const_pointer;
+    typedef T&        reference;
+    typedef const T&  const_reference;
+    typedef T         value_type;
+
+    template<class U>
+    struct rebind
+    {
+      typedef aligned_allocator_indirection<U> other;
+    };
+
+    aligned_allocator_indirection() {}
+    aligned_allocator_indirection(const aligned_allocator_indirection& ) : EIGEN_ALIGNED_ALLOCATOR<T>() {}
+    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<T>& ) {}
+    template<class U>
+    aligned_allocator_indirection(const aligned_allocator_indirection<U>& ) {}
+    template<class U>
+    aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<U>& ) {}
+    ~aligned_allocator_indirection() {}
+  };
+
+#ifdef _MSC_VER
+
+  // sometimes, MSVC detects, at compile time, that the argument x
+  // in std::vector::resize(size_t s,T x) won't be aligned and generate an error
+  // even if this function is never called. Whence this little wrapper.
+#define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) \
+  typename Eigen::internal::conditional< \
+    Eigen::internal::is_arithmetic<T>::value, \
+    T, \
+    Eigen::internal::workaround_msvc_stl_support<T> \
+  >::type
+
+  namespace internal {
+  template<typename T> struct workaround_msvc_stl_support : public T
+  {
+    inline workaround_msvc_stl_support() : T() {}
+    inline workaround_msvc_stl_support(const T& other) : T(other) {}
+    inline operator T& () { return *static_cast<T*>(this); }
+    inline operator const T& () const { return *static_cast<const T*>(this); }
+    template<typename OtherT>
+    inline T& operator=(const OtherT& other)
+    { T::operator=(other); return *this; }
+    inline workaround_msvc_stl_support& operator=(const workaround_msvc_stl_support& other)
+    { T::operator=(other); return *this; }
+  };
+  }
+
+#else
+
+#define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) T
+
+#endif
+
+}
+
+#endif // EIGEN_STL_DETAILS_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/CMakeLists.txt
new file mode 100644
index 0000000..b28ebe5
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_SuperLUSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_SuperLUSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/SuperLUSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/SuperLUSupport.h b/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/SuperLUSupport.h
new file mode 100644
index 0000000..3034c7a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/SuperLUSupport/SuperLUSupport.h
@@ -0,0 +1,1026 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SUPERLUSUPPORT_H
+#define EIGEN_SUPERLUSUPPORT_H
+
+namespace Eigen { 
+
+#define DECL_GSSVX(PREFIX,FLOATTYPE,KEYTYPE)		\
+    extern "C" {                                                                                          \
+      typedef struct { FLOATTYPE for_lu; FLOATTYPE total_needed; int expansions; } PREFIX##mem_usage_t;   \
+      extern void PREFIX##gssvx(superlu_options_t *, SuperMatrix *, int *, int *, int *,                  \
+                                char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,           \
+                                void *, int, SuperMatrix *, SuperMatrix *,                                \
+                                FLOATTYPE *, FLOATTYPE *, FLOATTYPE *, FLOATTYPE *,                       \
+                                PREFIX##mem_usage_t *, SuperLUStat_t *, int *);                           \
+    }                                                                                                     \
+    inline float SuperLU_gssvx(superlu_options_t *options, SuperMatrix *A,                                \
+         int *perm_c, int *perm_r, int *etree, char *equed,                                               \
+         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                                      \
+         SuperMatrix *U, void *work, int lwork,                                                           \
+         SuperMatrix *B, SuperMatrix *X,                                                                  \
+         FLOATTYPE *recip_pivot_growth,                                                                   \
+         FLOATTYPE *rcond, FLOATTYPE *ferr, FLOATTYPE *berr,                                              \
+         SuperLUStat_t *stats, int *info, KEYTYPE) {                                                      \
+    PREFIX##mem_usage_t mem_usage;                                                                        \
+    PREFIX##gssvx(options, A, perm_c, perm_r, etree, equed, R, C, L,                                      \
+         U, work, lwork, B, X, recip_pivot_growth, rcond,                                                 \
+         ferr, berr, &mem_usage, stats, info);                                                            \
+    return mem_usage.for_lu; /* bytes used by the factor storage */                                       \
+  }
+
+DECL_GSSVX(s,float,float)
+DECL_GSSVX(c,float,std::complex<float>)
+DECL_GSSVX(d,double,double)
+DECL_GSSVX(z,double,std::complex<double>)
+
+#ifdef MILU_ALPHA
+#define EIGEN_SUPERLU_HAS_ILU
+#endif
+
+#ifdef EIGEN_SUPERLU_HAS_ILU
+
+// similarly for the incomplete factorization using gsisx
+#define DECL_GSISX(PREFIX,FLOATTYPE,KEYTYPE)                                                    \
+    extern "C" {                                                                                \
+      extern void PREFIX##gsisx(superlu_options_t *, SuperMatrix *, int *, int *, int *,        \
+                         char *, FLOATTYPE *, FLOATTYPE *, SuperMatrix *, SuperMatrix *,        \
+                         void *, int, SuperMatrix *, SuperMatrix *, FLOATTYPE *, FLOATTYPE *,   \
+                         PREFIX##mem_usage_t *, SuperLUStat_t *, int *);                        \
+    }                                                                                           \
+    inline float SuperLU_gsisx(superlu_options_t *options, SuperMatrix *A,                      \
+         int *perm_c, int *perm_r, int *etree, char *equed,                                     \
+         FLOATTYPE *R, FLOATTYPE *C, SuperMatrix *L,                                            \
+         SuperMatrix *U, void *work, int lwork,                                                 \
+         SuperMatrix *B, SuperMatrix *X,                                                        \
+         FLOATTYPE *recip_pivot_growth,                                                         \
+         FLOATTYPE *rcond,                                                                      \
+         SuperLUStat_t *stats, int *info, KEYTYPE) {                                            \
+    PREFIX##mem_usage_t mem_usage;                                                              \
+    PREFIX##gsisx(options, A, perm_c, perm_r, etree, equed, R, C, L,                            \
+         U, work, lwork, B, X, recip_pivot_growth, rcond,                                       \
+         &mem_usage, stats, info);                                                              \
+    return mem_usage.for_lu; /* bytes used by the factor storage */                             \
+  }
+
+DECL_GSISX(s,float,float)
+DECL_GSISX(c,float,std::complex<float>)
+DECL_GSISX(d,double,double)
+DECL_GSISX(z,double,std::complex<double>)
+
+#endif
+
+template<typename MatrixType>
+struct SluMatrixMapHelper;
+
+/** \internal
+  *
+  * A wrapper class for SuperLU matrices. It supports only compressed sparse matrices
+  * and dense matrices. Supernodal and other fancy format are not supported by this wrapper.
+  *
+  * This wrapper class mainly aims to avoids the need of dynamic allocation of the storage structure.
+  */
+struct SluMatrix : SuperMatrix
+{
+  SluMatrix()
+  {
+    Store = &storage;
+  }
+
+  SluMatrix(const SluMatrix& other)
+    : SuperMatrix(other)
+  {
+    Store = &storage;
+    storage = other.storage;
+  }
+
+  SluMatrix& operator=(const SluMatrix& other)
+  {
+    SuperMatrix::operator=(static_cast<const SuperMatrix&>(other));
+    Store = &storage;
+    storage = other.storage;
+    return *this;
+  }
+
+  struct
+  {
+    union {int nnz;int lda;};
+    void *values;
+    int *innerInd;
+    int *outerInd;
+  } storage;
+
+  void setStorageType(Stype_t t)
+  {
+    Stype = t;
+    if (t==SLU_NC || t==SLU_NR || t==SLU_DN)
+      Store = &storage;
+    else
+    {
+      eigen_assert(false && "storage type not supported");
+      Store = 0;
+    }
+  }
+
+  template<typename Scalar>
+  void setScalarType()
+  {
+    if (internal::is_same<Scalar,float>::value)
+      Dtype = SLU_S;
+    else if (internal::is_same<Scalar,double>::value)
+      Dtype = SLU_D;
+    else if (internal::is_same<Scalar,std::complex<float> >::value)
+      Dtype = SLU_C;
+    else if (internal::is_same<Scalar,std::complex<double> >::value)
+      Dtype = SLU_Z;
+    else
+    {
+      eigen_assert(false && "Scalar type not supported by SuperLU");
+    }
+  }
+
+  template<typename MatrixType>
+  static SluMatrix Map(MatrixBase<MatrixType>& _mat)
+  {
+    MatrixType& mat(_mat.derived());
+    eigen_assert( ((MatrixType::Flags&RowMajorBit)!=RowMajorBit) && "row-major dense matrices are not supported by SuperLU");
+    SluMatrix res;
+    res.setStorageType(SLU_DN);
+    res.setScalarType<typename MatrixType::Scalar>();
+    res.Mtype     = SLU_GE;
+
+    res.nrow      = mat.rows();
+    res.ncol      = mat.cols();
+
+    res.storage.lda       = MatrixType::IsVectorAtCompileTime ? mat.size() : mat.outerStride();
+    res.storage.values    = mat.data();
+    return res;
+  }
+
+  template<typename MatrixType>
+  static SluMatrix Map(SparseMatrixBase<MatrixType>& mat)
+  {
+    SluMatrix res;
+    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)
+    {
+      res.setStorageType(SLU_NR);
+      res.nrow      = mat.cols();
+      res.ncol      = mat.rows();
+    }
+    else
+    {
+      res.setStorageType(SLU_NC);
+      res.nrow      = mat.rows();
+      res.ncol      = mat.cols();
+    }
+
+    res.Mtype       = SLU_GE;
+
+    res.storage.nnz       = mat.nonZeros();
+    res.storage.values    = mat.derived().valuePtr();
+    res.storage.innerInd  = mat.derived().innerIndexPtr();
+    res.storage.outerInd  = mat.derived().outerIndexPtr();
+
+    res.setScalarType<typename MatrixType::Scalar>();
+
+    // FIXME the following is not very accurate
+    if (MatrixType::Flags & Upper)
+      res.Mtype = SLU_TRU;
+    if (MatrixType::Flags & Lower)
+      res.Mtype = SLU_TRL;
+
+    eigen_assert(((MatrixType::Flags & SelfAdjoint)==0) && "SelfAdjoint matrix shape not supported by SuperLU");
+
+    return res;
+  }
+};
+
+template<typename Scalar, int Rows, int Cols, int Options, int MRows, int MCols>
+struct SluMatrixMapHelper<Matrix<Scalar,Rows,Cols,Options,MRows,MCols> >
+{
+  typedef Matrix<Scalar,Rows,Cols,Options,MRows,MCols> MatrixType;
+  static void run(MatrixType& mat, SluMatrix& res)
+  {
+    eigen_assert( ((Options&RowMajor)!=RowMajor) && "row-major dense matrices is not supported by SuperLU");
+    res.setStorageType(SLU_DN);
+    res.setScalarType<Scalar>();
+    res.Mtype     = SLU_GE;
+
+    res.nrow      = mat.rows();
+    res.ncol      = mat.cols();
+
+    res.storage.lda       = mat.outerStride();
+    res.storage.values    = mat.data();
+  }
+};
+
+template<typename Derived>
+struct SluMatrixMapHelper<SparseMatrixBase<Derived> >
+{
+  typedef Derived MatrixType;
+  static void run(MatrixType& mat, SluMatrix& res)
+  {
+    if ((MatrixType::Flags&RowMajorBit)==RowMajorBit)
+    {
+      res.setStorageType(SLU_NR);
+      res.nrow      = mat.cols();
+      res.ncol      = mat.rows();
+    }
+    else
+    {
+      res.setStorageType(SLU_NC);
+      res.nrow      = mat.rows();
+      res.ncol      = mat.cols();
+    }
+
+    res.Mtype       = SLU_GE;
+
+    res.storage.nnz       = mat.nonZeros();
+    res.storage.values    = mat.valuePtr();
+    res.storage.innerInd  = mat.innerIndexPtr();
+    res.storage.outerInd  = mat.outerIndexPtr();
+
+    res.setScalarType<typename MatrixType::Scalar>();
+
+    // FIXME the following is not very accurate
+    if (MatrixType::Flags & Upper)
+      res.Mtype = SLU_TRU;
+    if (MatrixType::Flags & Lower)
+      res.Mtype = SLU_TRL;
+
+    eigen_assert(((MatrixType::Flags & SelfAdjoint)==0) && "SelfAdjoint matrix shape not supported by SuperLU");
+  }
+};
+
+namespace internal {
+
+template<typename MatrixType>
+SluMatrix asSluMatrix(MatrixType& mat)
+{
+  return SluMatrix::Map(mat);
+}
+
+/** View a Super LU matrix as an Eigen expression */
+template<typename Scalar, int Flags, typename Index>
+MappedSparseMatrix<Scalar,Flags,Index> map_superlu(SluMatrix& sluMat)
+{
+  eigen_assert((Flags&RowMajor)==RowMajor && sluMat.Stype == SLU_NR
+         || (Flags&ColMajor)==ColMajor && sluMat.Stype == SLU_NC);
+
+  Index outerSize = (Flags&RowMajor)==RowMajor ? sluMat.ncol : sluMat.nrow;
+
+  return MappedSparseMatrix<Scalar,Flags,Index>(
+    sluMat.nrow, sluMat.ncol, sluMat.storage.outerInd[outerSize],
+    sluMat.storage.outerInd, sluMat.storage.innerInd, reinterpret_cast<Scalar*>(sluMat.storage.values) );
+}
+
+} // end namespace internal
+
+/** \ingroup SuperLUSupport_Module
+  * \class SuperLUBase
+  * \brief The base class for the direct and incomplete LU factorization of SuperLU
+  */
+template<typename _MatrixType, typename Derived>
+class SuperLUBase : internal::noncopyable
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar,Dynamic,1> Vector;
+    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;    
+    typedef SparseMatrix<Scalar> LUMatrixType;
+
+  public:
+
+    SuperLUBase() {}
+
+    ~SuperLUBase()
+    {
+      clearFactors();
+    }
+    
+    Derived& derived() { return *static_cast<Derived*>(this); }
+    const Derived& derived() const { return *static_cast<const Derived*>(this); }
+    
+    inline Index rows() const { return m_matrix.rows(); }
+    inline Index cols() const { return m_matrix.cols(); }
+    
+    /** \returns a reference to the Super LU option object to configure the  Super LU algorithms. */
+    inline superlu_options_t& options() { return m_sluOptions; }
+    
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+
+    /** Computes the sparse Cholesky decomposition of \a matrix */
+    void compute(const MatrixType& matrix)
+    {
+      derived().analyzePattern(matrix);
+      derived().factorize(matrix);
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<SuperLUBase, Rhs> solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "SuperLU is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "SuperLU::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<SuperLUBase, Rhs>(*this, b.derived());
+    }
+    
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<SuperLUBase, Rhs> solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "SuperLU is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "SuperLU::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<SuperLUBase, Rhs>(*this, b.derived());
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      * 
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& /*matrix*/)
+    {
+      m_isInitialized = true;
+      m_info = Success;
+      m_analysisIsOk = true;
+      m_factorizationIsOk = false;
+    }
+    
+    template<typename Stream>
+    void dumpMemory(Stream& s)
+    {}
+    
+  protected:
+    
+    void initFactorization(const MatrixType& a)
+    {
+      set_default_options(&this->m_sluOptions);
+      
+      const int size = a.rows();
+      m_matrix = a;
+
+      m_sluA = internal::asSluMatrix(m_matrix);
+      clearFactors();
+
+      m_p.resize(size);
+      m_q.resize(size);
+      m_sluRscale.resize(size);
+      m_sluCscale.resize(size);
+      m_sluEtree.resize(size);
+
+      // set empty B and X
+      m_sluB.setStorageType(SLU_DN);
+      m_sluB.setScalarType<Scalar>();
+      m_sluB.Mtype          = SLU_GE;
+      m_sluB.storage.values = 0;
+      m_sluB.nrow           = 0;
+      m_sluB.ncol           = 0;
+      m_sluB.storage.lda    = size;
+      m_sluX                = m_sluB;
+      
+      m_extractedDataAreDirty = true;
+    }
+    
+    void init()
+    {
+      m_info = InvalidInput;
+      m_isInitialized = false;
+      m_sluL.Store = 0;
+      m_sluU.Store = 0;
+    }
+    
+    void extractData() const;
+
+    void clearFactors()
+    {
+      if(m_sluL.Store)
+        Destroy_SuperNode_Matrix(&m_sluL);
+      if(m_sluU.Store)
+        Destroy_CompCol_Matrix(&m_sluU);
+
+      m_sluL.Store = 0;
+      m_sluU.Store = 0;
+
+      memset(&m_sluL,0,sizeof m_sluL);
+      memset(&m_sluU,0,sizeof m_sluU);
+    }
+
+    // cached data to reduce reallocation, etc.
+    mutable LUMatrixType m_l;
+    mutable LUMatrixType m_u;
+    mutable IntColVectorType m_p;
+    mutable IntRowVectorType m_q;
+
+    mutable LUMatrixType m_matrix;  // copy of the factorized matrix
+    mutable SluMatrix m_sluA;
+    mutable SuperMatrix m_sluL, m_sluU;
+    mutable SluMatrix m_sluB, m_sluX;
+    mutable SuperLUStat_t m_sluStat;
+    mutable superlu_options_t m_sluOptions;
+    mutable std::vector<int> m_sluEtree;
+    mutable Matrix<RealScalar,Dynamic,1> m_sluRscale, m_sluCscale;
+    mutable Matrix<RealScalar,Dynamic,1> m_sluFerr, m_sluBerr;
+    mutable char m_sluEqued;
+
+    mutable ComputationInfo m_info;
+    bool m_isInitialized;
+    int m_factorizationIsOk;
+    int m_analysisIsOk;
+    mutable bool m_extractedDataAreDirty;
+    
+  private:
+    SuperLUBase(SuperLUBase& ) { }
+};
+
+
+/** \ingroup SuperLUSupport_Module
+  * \class SuperLU
+  * \brief A sparse direct LU factorization and solver based on the SuperLU library
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a direct LU factorization
+  * using the SuperLU library. The sparse matrix A must be squared and invertible. The vectors or matrices
+  * X and B can be either dense or sparse.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType>
+class SuperLU : public SuperLUBase<_MatrixType,SuperLU<_MatrixType> >
+{
+  public:
+    typedef SuperLUBase<_MatrixType,SuperLU> Base;
+    typedef _MatrixType MatrixType;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::RealScalar RealScalar;
+    typedef typename Base::Index Index;
+    typedef typename Base::IntRowVectorType IntRowVectorType;
+    typedef typename Base::IntColVectorType IntColVectorType;    
+    typedef typename Base::LUMatrixType LUMatrixType;
+    typedef TriangularView<LUMatrixType, Lower|UnitDiag>  LMatrixType;
+    typedef TriangularView<LUMatrixType,  Upper>           UMatrixType;
+
+  public:
+
+    SuperLU() : Base() { init(); }
+
+    SuperLU(const MatrixType& matrix) : Base()
+    {
+      init();
+      Base::compute(matrix);
+    }
+
+    ~SuperLU()
+    {
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      * 
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      m_info = InvalidInput;
+      m_isInitialized = false;
+      Base::analyzePattern(matrix);
+    }
+    
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& matrix);
+    
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal */
+    template<typename Rhs,typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
+    #endif // EIGEN_PARSED_BY_DOXYGEN
+    
+    inline const LMatrixType& matrixL() const
+    {
+      if (m_extractedDataAreDirty) this->extractData();
+      return m_l;
+    }
+
+    inline const UMatrixType& matrixU() const
+    {
+      if (m_extractedDataAreDirty) this->extractData();
+      return m_u;
+    }
+
+    inline const IntColVectorType& permutationP() const
+    {
+      if (m_extractedDataAreDirty) this->extractData();
+      return m_p;
+    }
+
+    inline const IntRowVectorType& permutationQ() const
+    {
+      if (m_extractedDataAreDirty) this->extractData();
+      return m_q;
+    }
+    
+    Scalar determinant() const;
+    
+  protected:
+    
+    using Base::m_matrix;
+    using Base::m_sluOptions;
+    using Base::m_sluA;
+    using Base::m_sluB;
+    using Base::m_sluX;
+    using Base::m_p;
+    using Base::m_q;
+    using Base::m_sluEtree;
+    using Base::m_sluEqued;
+    using Base::m_sluRscale;
+    using Base::m_sluCscale;
+    using Base::m_sluL;
+    using Base::m_sluU;
+    using Base::m_sluStat;
+    using Base::m_sluFerr;
+    using Base::m_sluBerr;
+    using Base::m_l;
+    using Base::m_u;
+    
+    using Base::m_analysisIsOk;
+    using Base::m_factorizationIsOk;
+    using Base::m_extractedDataAreDirty;
+    using Base::m_isInitialized;
+    using Base::m_info;
+    
+    void init()
+    {
+      Base::init();
+      
+      set_default_options(&this->m_sluOptions);
+      m_sluOptions.PrintStat        = NO;
+      m_sluOptions.ConditionNumber  = NO;
+      m_sluOptions.Trans            = NOTRANS;
+      m_sluOptions.ColPerm          = COLAMD;
+    }
+    
+    
+  private:
+    SuperLU(SuperLU& ) { }
+};
+
+template<typename MatrixType>
+void SuperLU<MatrixType>::factorize(const MatrixType& a)
+{
+  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+  if(!m_analysisIsOk)
+  {
+    m_info = InvalidInput;
+    return;
+  }
+  
+  this->initFactorization(a);
+  
+  m_sluOptions.ColPerm = COLAMD;
+  int info = 0;
+  RealScalar recip_pivot_growth, rcond;
+  RealScalar ferr, berr;
+
+  StatInit(&m_sluStat);
+  SuperLU_gssvx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
+                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
+                &m_sluL, &m_sluU,
+                NULL, 0,
+                &m_sluB, &m_sluX,
+                &recip_pivot_growth, &rcond,
+                &ferr, &berr,
+                &m_sluStat, &info, Scalar());
+  StatFree(&m_sluStat);
+
+  m_extractedDataAreDirty = true;
+
+  // FIXME how to better check for errors ???
+  m_info = info == 0 ? Success : NumericalIssue;
+  m_factorizationIsOk = true;
+}
+
+template<typename MatrixType>
+template<typename Rhs,typename Dest>
+void SuperLU<MatrixType>::_solve(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const
+{
+  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
+
+  const int size = m_matrix.rows();
+  const int rhsCols = b.cols();
+  eigen_assert(size==b.rows());
+
+  m_sluOptions.Trans = NOTRANS;
+  m_sluOptions.Fact = FACTORED;
+  m_sluOptions.IterRefine = NOREFINE;
+  
+
+  m_sluFerr.resize(rhsCols);
+  m_sluBerr.resize(rhsCols);
+  m_sluB = SluMatrix::Map(b.const_cast_derived());
+  m_sluX = SluMatrix::Map(x.derived());
+  
+  typename Rhs::PlainObject b_cpy;
+  if(m_sluEqued!='N')
+  {
+    b_cpy = b;
+    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  
+  }
+
+  StatInit(&m_sluStat);
+  int info = 0;
+  RealScalar recip_pivot_growth, rcond;
+  SuperLU_gssvx(&m_sluOptions, &m_sluA,
+                m_q.data(), m_p.data(),
+                &m_sluEtree[0], &m_sluEqued,
+                &m_sluRscale[0], &m_sluCscale[0],
+                &m_sluL, &m_sluU,
+                NULL, 0,
+                &m_sluB, &m_sluX,
+                &recip_pivot_growth, &rcond,
+                &m_sluFerr[0], &m_sluBerr[0],
+                &m_sluStat, &info, Scalar());
+  StatFree(&m_sluStat);
+  m_info = info==0 ? Success : NumericalIssue;
+}
+
+// the code of this extractData() function has been adapted from the SuperLU's Matlab support code,
+//
+//  Copyright (c) 1994 by Xerox Corporation.  All rights reserved.
+//
+//  THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
+//  EXPRESSED OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
+//
+template<typename MatrixType, typename Derived>
+void SuperLUBase<MatrixType,Derived>::extractData() const
+{
+  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for extracting factors, you must first call either compute() or analyzePattern()/factorize()");
+  if (m_extractedDataAreDirty)
+  {
+    int         upper;
+    int         fsupc, istart, nsupr;
+    int         lastl = 0, lastu = 0;
+    SCformat    *Lstore = static_cast<SCformat*>(m_sluL.Store);
+    NCformat    *Ustore = static_cast<NCformat*>(m_sluU.Store);
+    Scalar      *SNptr;
+
+    const int size = m_matrix.rows();
+    m_l.resize(size,size);
+    m_l.resizeNonZeros(Lstore->nnz);
+    m_u.resize(size,size);
+    m_u.resizeNonZeros(Ustore->nnz);
+
+    int* Lcol = m_l.outerIndexPtr();
+    int* Lrow = m_l.innerIndexPtr();
+    Scalar* Lval = m_l.valuePtr();
+
+    int* Ucol = m_u.outerIndexPtr();
+    int* Urow = m_u.innerIndexPtr();
+    Scalar* Uval = m_u.valuePtr();
+
+    Ucol[0] = 0;
+    Ucol[0] = 0;
+
+    /* for each supernode */
+    for (int k = 0; k <= Lstore->nsuper; ++k)
+    {
+      fsupc   = L_FST_SUPC(k);
+      istart  = L_SUB_START(fsupc);
+      nsupr   = L_SUB_START(fsupc+1) - istart;
+      upper   = 1;
+
+      /* for each column in the supernode */
+      for (int j = fsupc; j < L_FST_SUPC(k+1); ++j)
+      {
+        SNptr = &((Scalar*)Lstore->nzval)[L_NZ_START(j)];
+
+        /* Extract U */
+        for (int i = U_NZ_START(j); i < U_NZ_START(j+1); ++i)
+        {
+          Uval[lastu] = ((Scalar*)Ustore->nzval)[i];
+          /* Matlab doesn't like explicit zero. */
+          if (Uval[lastu] != 0.0)
+            Urow[lastu++] = U_SUB(i);
+        }
+        for (int i = 0; i < upper; ++i)
+        {
+          /* upper triangle in the supernode */
+          Uval[lastu] = SNptr[i];
+          /* Matlab doesn't like explicit zero. */
+          if (Uval[lastu] != 0.0)
+            Urow[lastu++] = L_SUB(istart+i);
+        }
+        Ucol[j+1] = lastu;
+
+        /* Extract L */
+        Lval[lastl] = 1.0; /* unit diagonal */
+        Lrow[lastl++] = L_SUB(istart + upper - 1);
+        for (int i = upper; i < nsupr; ++i)
+        {
+          Lval[lastl] = SNptr[i];
+          /* Matlab doesn't like explicit zero. */
+          if (Lval[lastl] != 0.0)
+            Lrow[lastl++] = L_SUB(istart+i);
+        }
+        Lcol[j+1] = lastl;
+
+        ++upper;
+      } /* for j ... */
+
+    } /* for k ... */
+
+    // squeeze the matrices :
+    m_l.resizeNonZeros(lastl);
+    m_u.resizeNonZeros(lastu);
+
+    m_extractedDataAreDirty = false;
+  }
+}
+
+template<typename MatrixType>
+typename SuperLU<MatrixType>::Scalar SuperLU<MatrixType>::determinant() const
+{
+  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for computing the determinant, you must first call either compute() or analyzePattern()/factorize()");
+  
+  if (m_extractedDataAreDirty)
+    this->extractData();
+
+  Scalar det = Scalar(1);
+  for (int j=0; j<m_u.cols(); ++j)
+  {
+    if (m_u.outerIndexPtr()[j+1]-m_u.outerIndexPtr()[j] > 0)
+    {
+      int lastId = m_u.outerIndexPtr()[j+1]-1;
+      eigen_assert(m_u.innerIndexPtr()[lastId]<=j);
+      if (m_u.innerIndexPtr()[lastId]==j)
+        det *= m_u.valuePtr()[lastId];
+    }
+  }
+  if(m_sluEqued!='N')
+    return det/m_sluRscale.prod()/m_sluCscale.prod();
+  else
+    return det;
+}
+
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+#define EIGEN_SUPERLU_HAS_ILU
+#endif
+
+#ifdef EIGEN_SUPERLU_HAS_ILU
+
+/** \ingroup SuperLUSupport_Module
+  * \class SuperILU
+  * \brief A sparse direct \b incomplete LU factorization and solver based on the SuperLU library
+  *
+  * This class allows to solve for an approximate solution of A.X = B sparse linear problems via an incomplete LU factorization
+  * using the SuperLU library. This class is aimed to be used as a preconditioner of the iterative linear solvers.
+  *
+  * \warning This class requires SuperLU 4 or later.
+  *
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  *
+  * \sa \ref TutorialSparseDirectSolvers, class ConjugateGradient, class BiCGSTAB
+  */
+
+template<typename _MatrixType>
+class SuperILU : public SuperLUBase<_MatrixType,SuperILU<_MatrixType> >
+{
+  public:
+    typedef SuperLUBase<_MatrixType,SuperILU> Base;
+    typedef _MatrixType MatrixType;
+    typedef typename Base::Scalar Scalar;
+    typedef typename Base::RealScalar RealScalar;
+    typedef typename Base::Index Index;
+
+  public:
+
+    SuperILU() : Base() { init(); }
+
+    SuperILU(const MatrixType& matrix) : Base()
+    {
+      init();
+      Base::compute(matrix);
+    }
+
+    ~SuperILU()
+    {
+    }
+    
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      * 
+      * \sa factorize()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      Base::analyzePattern(matrix);
+    }
+    
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the symbolic decomposition has been performed.
+      *
+      * \sa analyzePattern()
+      */
+    void factorize(const MatrixType& matrix);
+    
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal */
+    template<typename Rhs,typename Dest>
+    void _solve(const MatrixBase<Rhs> &b, MatrixBase<Dest> &dest) const;
+    #endif // EIGEN_PARSED_BY_DOXYGEN
+    
+  protected:
+    
+    using Base::m_matrix;
+    using Base::m_sluOptions;
+    using Base::m_sluA;
+    using Base::m_sluB;
+    using Base::m_sluX;
+    using Base::m_p;
+    using Base::m_q;
+    using Base::m_sluEtree;
+    using Base::m_sluEqued;
+    using Base::m_sluRscale;
+    using Base::m_sluCscale;
+    using Base::m_sluL;
+    using Base::m_sluU;
+    using Base::m_sluStat;
+    using Base::m_sluFerr;
+    using Base::m_sluBerr;
+    using Base::m_l;
+    using Base::m_u;
+    
+    using Base::m_analysisIsOk;
+    using Base::m_factorizationIsOk;
+    using Base::m_extractedDataAreDirty;
+    using Base::m_isInitialized;
+    using Base::m_info;
+
+    void init()
+    {
+      Base::init();
+      
+      ilu_set_default_options(&m_sluOptions);
+      m_sluOptions.PrintStat        = NO;
+      m_sluOptions.ConditionNumber  = NO;
+      m_sluOptions.Trans            = NOTRANS;
+      m_sluOptions.ColPerm          = MMD_AT_PLUS_A;
+      
+      // no attempt to preserve column sum
+      m_sluOptions.ILU_MILU = SILU;
+      // only basic ILU(k) support -- no direct control over memory consumption
+      // better to use ILU_DropRule = DROP_BASIC | DROP_AREA
+      // and set ILU_FillFactor to max memory growth
+      m_sluOptions.ILU_DropRule = DROP_BASIC;
+      m_sluOptions.ILU_DropTol = NumTraits<Scalar>::dummy_precision()*10;
+    }
+    
+  private:
+    SuperILU(SuperILU& ) { }
+};
+
+template<typename MatrixType>
+void SuperILU<MatrixType>::factorize(const MatrixType& a)
+{
+  eigen_assert(m_analysisIsOk && "You must first call analyzePattern()");
+  if(!m_analysisIsOk)
+  {
+    m_info = InvalidInput;
+    return;
+  }
+  
+  this->initFactorization(a);
+
+  int info = 0;
+  RealScalar recip_pivot_growth, rcond;
+
+  StatInit(&m_sluStat);
+  SuperLU_gsisx(&m_sluOptions, &m_sluA, m_q.data(), m_p.data(), &m_sluEtree[0],
+                &m_sluEqued, &m_sluRscale[0], &m_sluCscale[0],
+                &m_sluL, &m_sluU,
+                NULL, 0,
+                &m_sluB, &m_sluX,
+                &recip_pivot_growth, &rcond,
+                &m_sluStat, &info, Scalar());
+  StatFree(&m_sluStat);
+
+  // FIXME how to better check for errors ???
+  m_info = info == 0 ? Success : NumericalIssue;
+  m_factorizationIsOk = true;
+}
+
+template<typename MatrixType>
+template<typename Rhs,typename Dest>
+void SuperILU<MatrixType>::_solve(const MatrixBase<Rhs> &b, MatrixBase<Dest>& x) const
+{
+  eigen_assert(m_factorizationIsOk && "The decomposition is not in a valid state for solving, you must first call either compute() or analyzePattern()/factorize()");
+
+  const int size = m_matrix.rows();
+  const int rhsCols = b.cols();
+  eigen_assert(size==b.rows());
+
+  m_sluOptions.Trans = NOTRANS;
+  m_sluOptions.Fact = FACTORED;
+  m_sluOptions.IterRefine = NOREFINE;
+
+  m_sluFerr.resize(rhsCols);
+  m_sluBerr.resize(rhsCols);
+  m_sluB = SluMatrix::Map(b.const_cast_derived());
+  m_sluX = SluMatrix::Map(x.derived());
+
+  typename Rhs::PlainObject b_cpy;
+  if(m_sluEqued!='N')
+  {
+    b_cpy = b;
+    m_sluB = SluMatrix::Map(b_cpy.const_cast_derived());  
+  }
+  
+  int info = 0;
+  RealScalar recip_pivot_growth, rcond;
+
+  StatInit(&m_sluStat);
+  SuperLU_gsisx(&m_sluOptions, &m_sluA,
+                m_q.data(), m_p.data(),
+                &m_sluEtree[0], &m_sluEqued,
+                &m_sluRscale[0], &m_sluCscale[0],
+                &m_sluL, &m_sluU,
+                NULL, 0,
+                &m_sluB, &m_sluX,
+                &recip_pivot_growth, &rcond,
+                &m_sluStat, &info, Scalar());
+  StatFree(&m_sluStat);
+
+  m_info = info==0 ? Success : NumericalIssue;
+}
+#endif
+
+namespace internal {
+  
+template<typename _MatrixType, typename Derived, typename Rhs>
+struct solve_retval<SuperLUBase<_MatrixType,Derived>, Rhs>
+  : solve_retval_base<SuperLUBase<_MatrixType,Derived>, Rhs>
+{
+  typedef SuperLUBase<_MatrixType,Derived> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec().derived()._solve(rhs(),dst);
+  }
+};
+
+template<typename _MatrixType, typename Derived, typename Rhs>
+struct sparse_solve_retval<SuperLUBase<_MatrixType,Derived>, Rhs>
+  : sparse_solve_retval_base<SuperLUBase<_MatrixType,Derived>, Rhs>
+{
+  typedef SuperLUBase<_MatrixType,Derived> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SUPERLUSUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/CMakeLists.txt
new file mode 100644
index 0000000..a57de00
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_UmfPackSupport_SRCS "*.h")
+
+INSTALL(FILES 
+  ${Eigen_UmfPackSupport_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/UmfPackSupport COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/UmfPackSupport.h b/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/UmfPackSupport.h
new file mode 100644
index 0000000..d85b8be
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/UmfPackSupport/UmfPackSupport.h
@@ -0,0 +1,432 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2011 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_UMFPACKSUPPORT_H
+#define EIGEN_UMFPACKSUPPORT_H
+
+namespace Eigen { 
+
+/* TODO extract L, extract U, compute det, etc... */
+
+// generic double/complex<double> wrapper functions:
+
+inline void umfpack_free_numeric(void **Numeric, double)
+{ umfpack_di_free_numeric(Numeric); *Numeric = 0; }
+
+inline void umfpack_free_numeric(void **Numeric, std::complex<double>)
+{ umfpack_zi_free_numeric(Numeric); *Numeric = 0; }
+
+inline void umfpack_free_symbolic(void **Symbolic, double)
+{ umfpack_di_free_symbolic(Symbolic); *Symbolic = 0; }
+
+inline void umfpack_free_symbolic(void **Symbolic, std::complex<double>)
+{ umfpack_zi_free_symbolic(Symbolic); *Symbolic = 0; }
+
+inline int umfpack_symbolic(int n_row,int n_col,
+                            const int Ap[], const int Ai[], const double Ax[], void **Symbolic,
+                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+  return umfpack_di_symbolic(n_row,n_col,Ap,Ai,Ax,Symbolic,Control,Info);
+}
+
+inline int umfpack_symbolic(int n_row,int n_col,
+                            const int Ap[], const int Ai[], const std::complex<double> Ax[], void **Symbolic,
+                            const double Control [UMFPACK_CONTROL], double Info [UMFPACK_INFO])
+{
+  return umfpack_zi_symbolic(n_row,n_col,Ap,Ai,&internal::real_ref(Ax[0]),0,Symbolic,Control,Info);
+}
+
+inline int umfpack_numeric( const int Ap[], const int Ai[], const double Ax[],
+                            void *Symbolic, void **Numeric,
+                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
+{
+  return umfpack_di_numeric(Ap,Ai,Ax,Symbolic,Numeric,Control,Info);
+}
+
+inline int umfpack_numeric( const int Ap[], const int Ai[], const std::complex<double> Ax[],
+                            void *Symbolic, void **Numeric,
+                            const double Control[UMFPACK_CONTROL],double Info [UMFPACK_INFO])
+{
+  return umfpack_zi_numeric(Ap,Ai,&internal::real_ref(Ax[0]),0,Symbolic,Numeric,Control,Info);
+}
+
+inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const double Ax[],
+                          double X[], const double B[], void *Numeric,
+                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
+{
+  return umfpack_di_solve(sys,Ap,Ai,Ax,X,B,Numeric,Control,Info);
+}
+
+inline int umfpack_solve( int sys, const int Ap[], const int Ai[], const std::complex<double> Ax[],
+                          std::complex<double> X[], const std::complex<double> B[], void *Numeric,
+                          const double Control[UMFPACK_CONTROL], double Info[UMFPACK_INFO])
+{
+  return umfpack_zi_solve(sys,Ap,Ai,&internal::real_ref(Ax[0]),0,&internal::real_ref(X[0]),0,&internal::real_ref(B[0]),0,Numeric,Control,Info);
+}
+
+inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, double)
+{
+  return umfpack_di_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+}
+
+inline int umfpack_get_lunz(int *lnz, int *unz, int *n_row, int *n_col, int *nz_udiag, void *Numeric, std::complex<double>)
+{
+  return umfpack_zi_get_lunz(lnz,unz,n_row,n_col,nz_udiag,Numeric);
+}
+
+inline int umfpack_get_numeric(int Lp[], int Lj[], double Lx[], int Up[], int Ui[], double Ux[],
+                               int P[], int Q[], double Dx[], int *do_recip, double Rs[], void *Numeric)
+{
+  return umfpack_di_get_numeric(Lp,Lj,Lx,Up,Ui,Ux,P,Q,Dx,do_recip,Rs,Numeric);
+}
+
+inline int umfpack_get_numeric(int Lp[], int Lj[], std::complex<double> Lx[], int Up[], int Ui[], std::complex<double> Ux[],
+                               int P[], int Q[], std::complex<double> Dx[], int *do_recip, double Rs[], void *Numeric)
+{
+  double& lx0_real = internal::real_ref(Lx[0]);
+  double& ux0_real = internal::real_ref(Ux[0]);
+  double& dx0_real = internal::real_ref(Dx[0]);
+  return umfpack_zi_get_numeric(Lp,Lj,Lx?&lx0_real:0,0,Up,Ui,Ux?&ux0_real:0,0,P,Q,
+                                Dx?&dx0_real:0,0,do_recip,Rs,Numeric);
+}
+
+inline int umfpack_get_determinant(double *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO])
+{
+  return umfpack_di_get_determinant(Mx,Ex,NumericHandle,User_Info);
+}
+
+inline int umfpack_get_determinant(std::complex<double> *Mx, double *Ex, void *NumericHandle, double User_Info [UMFPACK_INFO])
+{
+  double& mx_real = internal::real_ref(*Mx);
+  return umfpack_zi_get_determinant(&mx_real,0,Ex,NumericHandle,User_Info);
+}
+
+/** \ingroup UmfPackSupport_Module
+  * \brief A sparse LU factorization and solver based on UmfPack
+  *
+  * This class allows to solve for A.X = B sparse linear problems via a LU factorization
+  * using the UmfPack library. The sparse matrix A must be squared and full rank.
+  * The vectors or matrices X and B can be either dense or sparse.
+  *
+  * \warning The input matrix A should be in a \b compressed and \b column-major form.
+  * Otherwise an expensive copy will be made. You can call the inexpensive makeCompressed() to get a compressed matrix.
+  * \tparam _MatrixType the type of the sparse matrix A, it must be a SparseMatrix<>
+  *
+  * \sa \ref TutorialSparseDirectSolvers
+  */
+template<typename _MatrixType>
+class UmfPackLU : internal::noncopyable
+{
+  public:
+    typedef _MatrixType MatrixType;
+    typedef typename MatrixType::Scalar Scalar;
+    typedef typename MatrixType::RealScalar RealScalar;
+    typedef typename MatrixType::Index Index;
+    typedef Matrix<Scalar,Dynamic,1> Vector;
+    typedef Matrix<int, 1, MatrixType::ColsAtCompileTime> IntRowVectorType;
+    typedef Matrix<int, MatrixType::RowsAtCompileTime, 1> IntColVectorType;
+    typedef SparseMatrix<Scalar> LUMatrixType;
+    typedef SparseMatrix<Scalar,ColMajor,int> UmfpackMatrixType;
+
+  public:
+
+    UmfPackLU() { init(); }
+
+    UmfPackLU(const MatrixType& matrix)
+    {
+      init();
+      compute(matrix);
+    }
+
+    ~UmfPackLU()
+    {
+      if(m_symbolic) umfpack_free_symbolic(&m_symbolic,Scalar());
+      if(m_numeric)  umfpack_free_numeric(&m_numeric,Scalar());
+    }
+
+    inline Index rows() const { return m_copyMatrix.rows(); }
+    inline Index cols() const { return m_copyMatrix.cols(); }
+
+    /** \brief Reports whether previous computation was successful.
+      *
+      * \returns \c Success if computation was succesful,
+      *          \c NumericalIssue if the matrix.appears to be negative.
+      */
+    ComputationInfo info() const
+    {
+      eigen_assert(m_isInitialized && "Decomposition is not initialized.");
+      return m_info;
+    }
+
+    inline const LUMatrixType& matrixL() const
+    {
+      if (m_extractedDataAreDirty) extractData();
+      return m_l;
+    }
+
+    inline const LUMatrixType& matrixU() const
+    {
+      if (m_extractedDataAreDirty) extractData();
+      return m_u;
+    }
+
+    inline const IntColVectorType& permutationP() const
+    {
+      if (m_extractedDataAreDirty) extractData();
+      return m_p;
+    }
+
+    inline const IntRowVectorType& permutationQ() const
+    {
+      if (m_extractedDataAreDirty) extractData();
+      return m_q;
+    }
+
+    /** Computes the sparse Cholesky decomposition of \a matrix 
+     *  Note that the matrix should be column-major, and in compressed format for best performance.
+     *  \sa SparseMatrix::makeCompressed().
+     */
+    void compute(const MatrixType& matrix)
+    {
+      analyzePattern(matrix);
+      factorize(matrix);
+    }
+
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::solve_retval<UmfPackLU, Rhs> solve(const MatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "UmfPackLU is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "UmfPackLU::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::solve_retval<UmfPackLU, Rhs>(*this, b.derived());
+    }
+
+    /** \returns the solution x of \f$ A x = b \f$ using the current decomposition of A.
+      *
+      * \sa compute()
+      */
+    template<typename Rhs>
+    inline const internal::sparse_solve_retval<UmfPackLU, Rhs> solve(const SparseMatrixBase<Rhs>& b) const
+    {
+      eigen_assert(m_isInitialized && "UmfPackLU is not initialized.");
+      eigen_assert(rows()==b.rows()
+                && "UmfPackLU::solve(): invalid number of rows of the right hand side matrix b");
+      return internal::sparse_solve_retval<UmfPackLU, Rhs>(*this, b.derived());
+    }
+
+    /** Performs a symbolic decomposition on the sparcity of \a matrix.
+      *
+      * This function is particularly useful when solving for several problems having the same structure.
+      *
+      * \sa factorize(), compute()
+      */
+    void analyzePattern(const MatrixType& matrix)
+    {
+      if(m_symbolic)
+        umfpack_free_symbolic(&m_symbolic,Scalar());
+      if(m_numeric)
+        umfpack_free_numeric(&m_numeric,Scalar());
+      
+      grapInput(matrix);
+
+      int errorCode = 0;
+      errorCode = umfpack_symbolic(matrix.rows(), matrix.cols(), m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,
+                                   &m_symbolic, 0, 0);
+
+      m_isInitialized = true;
+      m_info = errorCode ? InvalidInput : Success;
+      m_analysisIsOk = true;
+      m_factorizationIsOk = false;
+    }
+
+    /** Performs a numeric decomposition of \a matrix
+      *
+      * The given matrix must has the same sparcity than the matrix on which the pattern anylysis has been performed.
+      *
+      * \sa analyzePattern(), compute()
+      */
+    void factorize(const MatrixType& matrix)
+    {
+      eigen_assert(m_analysisIsOk && "UmfPackLU: you must first call analyzePattern()");
+      if(m_numeric)
+        umfpack_free_numeric(&m_numeric,Scalar());
+
+      grapInput(matrix);
+
+      int errorCode;
+      errorCode = umfpack_numeric(m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,
+                                  m_symbolic, &m_numeric, 0, 0);
+
+      m_info = errorCode ? NumericalIssue : Success;
+      m_factorizationIsOk = true;
+    }
+
+    #ifndef EIGEN_PARSED_BY_DOXYGEN
+    /** \internal */
+    template<typename BDerived,typename XDerived>
+    bool _solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const;
+    #endif
+
+    Scalar determinant() const;
+
+    void extractData() const;
+
+  protected:
+
+
+    void init()
+    {
+      m_info = InvalidInput;
+      m_isInitialized = false;
+      m_numeric = 0;
+      m_symbolic = 0;
+      m_outerIndexPtr = 0;
+      m_innerIndexPtr = 0;
+      m_valuePtr      = 0;
+    }
+    
+    void grapInput(const MatrixType& mat)
+    {
+      m_copyMatrix.resize(mat.rows(), mat.cols());
+      if( ((MatrixType::Flags&RowMajorBit)==RowMajorBit) || sizeof(typename MatrixType::Index)!=sizeof(int) || !mat.isCompressed() )
+      {
+        // non supported input -> copy
+        m_copyMatrix = mat;
+        m_outerIndexPtr = m_copyMatrix.outerIndexPtr();
+        m_innerIndexPtr = m_copyMatrix.innerIndexPtr();
+        m_valuePtr      = m_copyMatrix.valuePtr();
+      }
+      else
+      {
+        m_outerIndexPtr = mat.outerIndexPtr();
+        m_innerIndexPtr = mat.innerIndexPtr();
+        m_valuePtr      = mat.valuePtr();
+      }
+    }
+
+    // cached data to reduce reallocation, etc.
+    mutable LUMatrixType m_l;
+    mutable LUMatrixType m_u;
+    mutable IntColVectorType m_p;
+    mutable IntRowVectorType m_q;
+
+    UmfpackMatrixType m_copyMatrix;
+    const Scalar* m_valuePtr;
+    const int* m_outerIndexPtr;
+    const int* m_innerIndexPtr;
+    void* m_numeric;
+    void* m_symbolic;
+
+    mutable ComputationInfo m_info;
+    bool m_isInitialized;
+    int m_factorizationIsOk;
+    int m_analysisIsOk;
+    mutable bool m_extractedDataAreDirty;
+    
+  private:
+    UmfPackLU(UmfPackLU& ) { }
+};
+
+
+template<typename MatrixType>
+void UmfPackLU<MatrixType>::extractData() const
+{
+  if (m_extractedDataAreDirty)
+  {
+    // get size of the data
+    int lnz, unz, rows, cols, nz_udiag;
+    umfpack_get_lunz(&lnz, &unz, &rows, &cols, &nz_udiag, m_numeric, Scalar());
+
+    // allocate data
+    m_l.resize(rows,(std::min)(rows,cols));
+    m_l.resizeNonZeros(lnz);
+
+    m_u.resize((std::min)(rows,cols),cols);
+    m_u.resizeNonZeros(unz);
+
+    m_p.resize(rows);
+    m_q.resize(cols);
+
+    // extract
+    umfpack_get_numeric(m_l.outerIndexPtr(), m_l.innerIndexPtr(), m_l.valuePtr(),
+                        m_u.outerIndexPtr(), m_u.innerIndexPtr(), m_u.valuePtr(),
+                        m_p.data(), m_q.data(), 0, 0, 0, m_numeric);
+
+    m_extractedDataAreDirty = false;
+  }
+}
+
+template<typename MatrixType>
+typename UmfPackLU<MatrixType>::Scalar UmfPackLU<MatrixType>::determinant() const
+{
+  Scalar det;
+  umfpack_get_determinant(&det, 0, m_numeric, 0);
+  return det;
+}
+
+template<typename MatrixType>
+template<typename BDerived,typename XDerived>
+bool UmfPackLU<MatrixType>::_solve(const MatrixBase<BDerived> &b, MatrixBase<XDerived> &x) const
+{
+  const int rhsCols = b.cols();
+  eigen_assert((BDerived::Flags&RowMajorBit)==0 && "UmfPackLU backend does not support non col-major rhs yet");
+  eigen_assert((XDerived::Flags&RowMajorBit)==0 && "UmfPackLU backend does not support non col-major result yet");
+  eigen_assert(b.derived().data() != x.derived().data() && " Umfpack does not support inplace solve");
+  
+  int errorCode;
+  for (int j=0; j<rhsCols; ++j)
+  {
+    errorCode = umfpack_solve(UMFPACK_A,
+        m_outerIndexPtr, m_innerIndexPtr, m_valuePtr,
+        &x.col(j).coeffRef(0), &b.const_cast_derived().col(j).coeffRef(0), m_numeric, 0, 0);
+    if (errorCode!=0)
+      return false;
+  }
+
+  return true;
+}
+
+
+namespace internal {
+
+template<typename _MatrixType, typename Rhs>
+struct solve_retval<UmfPackLU<_MatrixType>, Rhs>
+  : solve_retval_base<UmfPackLU<_MatrixType>, Rhs>
+{
+  typedef UmfPackLU<_MatrixType> Dec;
+  EIGEN_MAKE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    dec()._solve(rhs(),dst);
+  }
+};
+
+template<typename _MatrixType, typename Rhs>
+struct sparse_solve_retval<UmfPackLU<_MatrixType>, Rhs>
+  : sparse_solve_retval_base<UmfPackLU<_MatrixType>, Rhs>
+{
+  typedef UmfPackLU<_MatrixType> Dec;
+  EIGEN_MAKE_SPARSE_SOLVE_HELPERS(Dec,Rhs)
+
+  template<typename Dest> void evalTo(Dest& dst) const
+  {
+    this->defaultEvalTo(dst);
+  }
+};
+
+} // end namespace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_UMFPACKSUPPORT_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/misc/CMakeLists.txt
new file mode 100644
index 0000000..a58ffb7
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_misc_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_misc_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/misc COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/Image.h b/vendor/eigen-3.1.91/Eigen/src/misc/Image.h
new file mode 100644
index 0000000..75c5f43
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/Image.h
@@ -0,0 +1,84 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MISC_IMAGE_H
+#define EIGEN_MISC_IMAGE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \class image_retval_base
+  *
+  */
+template<typename DecompositionType>
+struct traits<image_retval_base<DecompositionType> >
+{
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef Matrix<
+    typename MatrixType::Scalar,
+    MatrixType::RowsAtCompileTime, // the image is a subspace of the destination space, whose
+                                   // dimension is the number of rows of the original matrix
+    Dynamic,                       // we don't know at compile time the dimension of the image (the rank)
+    MatrixType::Options,
+    MatrixType::MaxRowsAtCompileTime, // the image matrix will consist of columns from the original matrix,
+    MatrixType::MaxColsAtCompileTime  // so it has the same number of rows and at most as many columns.
+  > ReturnType;
+};
+
+template<typename _DecompositionType> struct image_retval_base
+ : public ReturnByValue<image_retval_base<_DecompositionType> >
+{
+  typedef _DecompositionType DecompositionType;
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef ReturnByValue<image_retval_base> Base;
+  typedef typename Base::Index Index;
+
+  image_retval_base(const DecompositionType& dec, const MatrixType& originalMatrix)
+    : m_dec(dec), m_rank(dec.rank()),
+      m_cols(m_rank == 0 ? 1 : m_rank),
+      m_originalMatrix(originalMatrix)
+  {}
+
+  inline Index rows() const { return m_dec.rows(); }
+  inline Index cols() const { return m_cols; }
+  inline Index rank() const { return m_rank; }
+  inline const DecompositionType& dec() const { return m_dec; }
+  inline const MatrixType& originalMatrix() const { return m_originalMatrix; }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    static_cast<const image_retval<DecompositionType>*>(this)->evalTo(dst);
+  }
+
+  protected:
+    const DecompositionType& m_dec;
+    Index m_rank, m_cols;
+    const MatrixType& m_originalMatrix;
+};
+
+} // end namespace internal
+
+#define EIGEN_MAKE_IMAGE_HELPERS(DecompositionType) \
+  typedef typename DecompositionType::MatrixType MatrixType; \
+  typedef typename MatrixType::Scalar Scalar; \
+  typedef typename MatrixType::RealScalar RealScalar; \
+  typedef typename MatrixType::Index Index; \
+  typedef Eigen::internal::image_retval_base<DecompositionType> Base; \
+  using Base::dec; \
+  using Base::originalMatrix; \
+  using Base::rank; \
+  using Base::rows; \
+  using Base::cols; \
+  image_retval(const DecompositionType& dec, const MatrixType& originalMatrix) \
+    : Base(dec, originalMatrix) {}
+
+} // end namespace Eigen
+
+#endif // EIGEN_MISC_IMAGE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/Kernel.h b/vendor/eigen-3.1.91/Eigen/src/misc/Kernel.h
new file mode 100644
index 0000000..b9e1518
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/Kernel.h
@@ -0,0 +1,81 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MISC_KERNEL_H
+#define EIGEN_MISC_KERNEL_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \class kernel_retval_base
+  *
+  */
+template<typename DecompositionType>
+struct traits<kernel_retval_base<DecompositionType> >
+{
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef Matrix<
+    typename MatrixType::Scalar,
+    MatrixType::ColsAtCompileTime, // the number of rows in the "kernel matrix"
+                                   // is the number of cols of the original matrix
+                                   // so that the product "matrix * kernel = zero" makes sense
+    Dynamic,                       // we don't know at compile-time the dimension of the kernel
+    MatrixType::Options,
+    MatrixType::MaxColsAtCompileTime, // see explanation for 2nd template parameter
+    MatrixType::MaxColsAtCompileTime // the kernel is a subspace of the domain space,
+                                     // whose dimension is the number of columns of the original matrix
+  > ReturnType;
+};
+
+template<typename _DecompositionType> struct kernel_retval_base
+ : public ReturnByValue<kernel_retval_base<_DecompositionType> >
+{
+  typedef _DecompositionType DecompositionType;
+  typedef ReturnByValue<kernel_retval_base> Base;
+  typedef typename Base::Index Index;
+
+  kernel_retval_base(const DecompositionType& dec)
+    : m_dec(dec),
+      m_rank(dec.rank()),
+      m_cols(m_rank==dec.cols() ? 1 : dec.cols() - m_rank)
+  {}
+
+  inline Index rows() const { return m_dec.cols(); }
+  inline Index cols() const { return m_cols; }
+  inline Index rank() const { return m_rank; }
+  inline const DecompositionType& dec() const { return m_dec; }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    static_cast<const kernel_retval<DecompositionType>*>(this)->evalTo(dst);
+  }
+
+  protected:
+    const DecompositionType& m_dec;
+    Index m_rank, m_cols;
+};
+
+} // end namespace internal
+
+#define EIGEN_MAKE_KERNEL_HELPERS(DecompositionType) \
+  typedef typename DecompositionType::MatrixType MatrixType; \
+  typedef typename MatrixType::Scalar Scalar; \
+  typedef typename MatrixType::RealScalar RealScalar; \
+  typedef typename MatrixType::Index Index; \
+  typedef Eigen::internal::kernel_retval_base<DecompositionType> Base; \
+  using Base::dec; \
+  using Base::rank; \
+  using Base::rows; \
+  using Base::cols; \
+  kernel_retval(const DecompositionType& dec) : Base(dec) {}
+
+} // end namespace Eigen
+
+#endif // EIGEN_MISC_KERNEL_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/Solve.h b/vendor/eigen-3.1.91/Eigen/src/misc/Solve.h
new file mode 100644
index 0000000..7f70d60
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/Solve.h
@@ -0,0 +1,76 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_MISC_SOLVE_H
+#define EIGEN_MISC_SOLVE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+/** \class solve_retval_base
+  *
+  */
+template<typename DecompositionType, typename Rhs>
+struct traits<solve_retval_base<DecompositionType, Rhs> >
+{
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef Matrix<typename Rhs::Scalar,
+                 MatrixType::ColsAtCompileTime,
+                 Rhs::ColsAtCompileTime,
+                 Rhs::PlainObject::Options,
+                 MatrixType::MaxColsAtCompileTime,
+                 Rhs::MaxColsAtCompileTime> ReturnType;
+};
+
+template<typename _DecompositionType, typename Rhs> struct solve_retval_base
+ : public ReturnByValue<solve_retval_base<_DecompositionType, Rhs> >
+{
+  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;
+  typedef _DecompositionType DecompositionType;
+  typedef ReturnByValue<solve_retval_base> Base;
+  typedef typename Base::Index Index;
+
+  solve_retval_base(const DecompositionType& dec, const Rhs& rhs)
+    : m_dec(dec), m_rhs(rhs)
+  {}
+
+  inline Index rows() const { return m_dec.cols(); }
+  inline Index cols() const { return m_rhs.cols(); }
+  inline const DecompositionType& dec() const { return m_dec; }
+  inline const RhsNestedCleaned& rhs() const { return m_rhs; }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    static_cast<const solve_retval<DecompositionType,Rhs>*>(this)->evalTo(dst);
+  }
+
+  protected:
+    const DecompositionType& m_dec;
+    typename Rhs::Nested m_rhs;
+};
+
+} // end namespace internal
+
+#define EIGEN_MAKE_SOLVE_HELPERS(DecompositionType,Rhs) \
+  typedef typename DecompositionType::MatrixType MatrixType; \
+  typedef typename MatrixType::Scalar Scalar; \
+  typedef typename MatrixType::RealScalar RealScalar; \
+  typedef typename MatrixType::Index Index; \
+  typedef Eigen::internal::solve_retval_base<DecompositionType,Rhs> Base; \
+  using Base::dec; \
+  using Base::rhs; \
+  using Base::rows; \
+  using Base::cols; \
+  solve_retval(const DecompositionType& dec, const Rhs& rhs) \
+    : Base(dec, rhs) {}
+
+} // end namespace Eigen
+
+#endif // EIGEN_MISC_SOLVE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/SparseSolve.h b/vendor/eigen-3.1.91/Eigen/src/misc/SparseSolve.h
new file mode 100644
index 0000000..244bb8e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/SparseSolve.h
@@ -0,0 +1,128 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef EIGEN_SPARSE_SOLVE_H
+#define EIGEN_SPARSE_SOLVE_H
+
+namespace Eigen { 
+
+namespace internal {
+
+template<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base;
+template<typename _DecompositionType, typename Rhs> struct sparse_solve_retval;
+  
+template<typename DecompositionType, typename Rhs>
+struct traits<sparse_solve_retval_base<DecompositionType, Rhs> >
+{
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef SparseMatrix<typename Rhs::Scalar, Rhs::Options, typename Rhs::Index> ReturnType;
+};
+
+template<typename _DecompositionType, typename Rhs> struct sparse_solve_retval_base
+ : public ReturnByValue<sparse_solve_retval_base<_DecompositionType, Rhs> >
+{
+  typedef typename remove_all<typename Rhs::Nested>::type RhsNestedCleaned;
+  typedef _DecompositionType DecompositionType;
+  typedef ReturnByValue<sparse_solve_retval_base> Base;
+  typedef typename Base::Index Index;
+
+  sparse_solve_retval_base(const DecompositionType& dec, const Rhs& rhs)
+    : m_dec(dec), m_rhs(rhs)
+  {}
+
+  inline Index rows() const { return m_dec.cols(); }
+  inline Index cols() const { return m_rhs.cols(); }
+  inline const DecompositionType& dec() const { return m_dec; }
+  inline const RhsNestedCleaned& rhs() const { return m_rhs; }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    static_cast<const sparse_solve_retval<DecompositionType,Rhs>*>(this)->evalTo(dst);
+  }
+
+  protected:
+    template<typename DestScalar, int DestOptions, typename DestIndex>
+    inline void defaultEvalTo(SparseMatrix<DestScalar,DestOptions,DestIndex>& dst) const
+    {
+      // we process the sparse rhs per block of NbColsAtOnce columns temporarily stored into a dense matrix.
+      static const int NbColsAtOnce = 4;
+      int rhsCols = m_rhs.cols();
+      int size = m_rhs.rows();
+      Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmp(size,rhsCols);
+      Eigen::Matrix<DestScalar,Dynamic,Dynamic> tmpX(size,rhsCols);
+      for(int k=0; k<rhsCols; k+=NbColsAtOnce)
+      {
+        int actualCols = std::min<int>(rhsCols-k, NbColsAtOnce);
+        tmp.leftCols(actualCols) = m_rhs.middleCols(k,actualCols);
+        tmpX.leftCols(actualCols) = m_dec.solve(tmp.leftCols(actualCols));
+        dst.middleCols(k,actualCols) = tmpX.leftCols(actualCols).sparseView();
+      }
+    }
+    const DecompositionType& m_dec;
+    typename Rhs::Nested m_rhs;
+};
+
+#define EIGEN_MAKE_SPARSE_SOLVE_HELPERS(DecompositionType,Rhs) \
+  typedef typename DecompositionType::MatrixType MatrixType; \
+  typedef typename MatrixType::Scalar Scalar; \
+  typedef typename MatrixType::RealScalar RealScalar; \
+  typedef typename MatrixType::Index Index; \
+  typedef Eigen::internal::sparse_solve_retval_base<DecompositionType,Rhs> Base; \
+  using Base::dec; \
+  using Base::rhs; \
+  using Base::rows; \
+  using Base::cols; \
+  sparse_solve_retval(const DecompositionType& dec, const Rhs& rhs) \
+    : Base(dec, rhs) {}
+
+
+
+template<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess;
+
+template<typename DecompositionType, typename Rhs, typename Guess>
+struct traits<solve_retval_with_guess<DecompositionType, Rhs, Guess> >
+{
+  typedef typename DecompositionType::MatrixType MatrixType;
+  typedef Matrix<typename Rhs::Scalar,
+                 MatrixType::ColsAtCompileTime,
+                 Rhs::ColsAtCompileTime,
+                 Rhs::PlainObject::Options,
+                 MatrixType::MaxColsAtCompileTime,
+                 Rhs::MaxColsAtCompileTime> ReturnType;
+};
+
+template<typename DecompositionType, typename Rhs, typename Guess> struct solve_retval_with_guess
+ : public ReturnByValue<solve_retval_with_guess<DecompositionType, Rhs, Guess> >
+{
+  typedef typename DecompositionType::Index Index;
+
+  solve_retval_with_guess(const DecompositionType& dec, const Rhs& rhs, const Guess& guess)
+    : m_dec(dec), m_rhs(rhs), m_guess(guess)
+  {}
+
+  inline Index rows() const { return m_dec.cols(); }
+  inline Index cols() const { return m_rhs.cols(); }
+
+  template<typename Dest> inline void evalTo(Dest& dst) const
+  {
+    dst = m_guess;
+    m_dec._solveWithGuess(m_rhs,dst);
+  }
+
+  protected:
+    const DecompositionType& m_dec;
+    const typename Rhs::Nested m_rhs;
+    const typename Guess::Nested m_guess;
+};
+
+} // namepsace internal
+
+} // end namespace Eigen
+
+#endif // EIGEN_SPARSE_SOLVE_H
diff --git a/vendor/eigen-3.1.91/Eigen/src/misc/blas.h b/vendor/eigen-3.1.91/Eigen/src/misc/blas.h
new file mode 100644
index 0000000..6fce99e
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/misc/blas.h
@@ -0,0 +1,658 @@
+#ifndef BLAS_H
+#define BLAS_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define BLASFUNC(FUNC) FUNC##_
+
+#ifdef __WIN64__
+typedef long long BLASLONG;
+typedef unsigned long long BLASULONG;
+#else
+typedef long BLASLONG;
+typedef unsigned long BLASULONG;
+#endif
+
+int    BLASFUNC(xerbla)(const char *, int *info, int);
+
+float  BLASFUNC(sdot)  (int *, float  *, int *, float  *, int *);
+float  BLASFUNC(sdsdot)(int *, float  *,        float  *, int *, float  *, int *);
+
+double BLASFUNC(dsdot) (int *, float  *, int *, float  *, int *);
+double BLASFUNC(ddot)  (int *, double *, int *, double *, int *);
+double BLASFUNC(qdot)  (int *, double *, int *, double *, int *);
+
+int  BLASFUNC(cdotuw)  (int *, float  *, int *, float  *, int *, float*);
+int  BLASFUNC(cdotcw)  (int *, float  *, int *, float  *, int *, float*);
+int  BLASFUNC(zdotuw)  (int *, double  *, int *, double  *, int *, double*);
+int  BLASFUNC(zdotcw)  (int *, double  *, int *, double  *, int *, double*);
+
+int    BLASFUNC(saxpy) (int *, float  *, float  *, int *, float  *, int *);
+int    BLASFUNC(daxpy) (int *, double *, double *, int *, double *, int *);
+int    BLASFUNC(qaxpy) (int *, double *, double *, int *, double *, int *);
+int    BLASFUNC(caxpy) (int *, float  *, float  *, int *, float  *, int *);
+int    BLASFUNC(zaxpy) (int *, double *, double *, int *, double *, int *);
+int    BLASFUNC(xaxpy) (int *, double *, double *, int *, double *, int *);
+int    BLASFUNC(caxpyc)(int *, float  *, float  *, int *, float  *, int *);
+int    BLASFUNC(zaxpyc)(int *, double *, double *, int *, double *, int *);
+int    BLASFUNC(xaxpyc)(int *, double *, double *, int *, double *, int *);
+
+int    BLASFUNC(scopy) (int *, float  *, int *, float  *, int *);
+int    BLASFUNC(dcopy) (int *, double *, int *, double *, int *);
+int    BLASFUNC(qcopy) (int *, double *, int *, double *, int *);
+int    BLASFUNC(ccopy) (int *, float  *, int *, float  *, int *);
+int    BLASFUNC(zcopy) (int *, double *, int *, double *, int *);
+int    BLASFUNC(xcopy) (int *, double *, int *, double *, int *);
+
+int    BLASFUNC(sswap) (int *, float  *, int *, float  *, int *);
+int    BLASFUNC(dswap) (int *, double *, int *, double *, int *);
+int    BLASFUNC(qswap) (int *, double *, int *, double *, int *);
+int    BLASFUNC(cswap) (int *, float  *, int *, float  *, int *);
+int    BLASFUNC(zswap) (int *, double *, int *, double *, int *);
+int    BLASFUNC(xswap) (int *, double *, int *, double *, int *);
+
+float  BLASFUNC(sasum) (int *, float  *, int *);
+float  BLASFUNC(scasum)(int *, float  *, int *);
+double BLASFUNC(dasum) (int *, double *, int *);
+double BLASFUNC(qasum) (int *, double *, int *);
+double BLASFUNC(dzasum)(int *, double *, int *);
+double BLASFUNC(qxasum)(int *, double *, int *);
+
+int    BLASFUNC(isamax)(int *, float  *, int *);
+int    BLASFUNC(idamax)(int *, double *, int *);
+int    BLASFUNC(iqamax)(int *, double *, int *);
+int    BLASFUNC(icamax)(int *, float  *, int *);
+int    BLASFUNC(izamax)(int *, double *, int *);
+int    BLASFUNC(ixamax)(int *, double *, int *);
+
+int    BLASFUNC(ismax) (int *, float  *, int *);
+int    BLASFUNC(idmax) (int *, double *, int *);
+int    BLASFUNC(iqmax) (int *, double *, int *);
+int    BLASFUNC(icmax) (int *, float  *, int *);
+int    BLASFUNC(izmax) (int *, double *, int *);
+int    BLASFUNC(ixmax) (int *, double *, int *);
+
+int    BLASFUNC(isamin)(int *, float  *, int *);
+int    BLASFUNC(idamin)(int *, double *, int *);
+int    BLASFUNC(iqamin)(int *, double *, int *);
+int    BLASFUNC(icamin)(int *, float  *, int *);
+int    BLASFUNC(izamin)(int *, double *, int *);
+int    BLASFUNC(ixamin)(int *, double *, int *);
+
+int    BLASFUNC(ismin)(int *, float  *, int *);
+int    BLASFUNC(idmin)(int *, double *, int *);
+int    BLASFUNC(iqmin)(int *, double *, int *);
+int    BLASFUNC(icmin)(int *, float  *, int *);
+int    BLASFUNC(izmin)(int *, double *, int *);
+int    BLASFUNC(ixmin)(int *, double *, int *);
+
+float  BLASFUNC(samax) (int *, float  *, int *);
+double BLASFUNC(damax) (int *, double *, int *);
+double BLASFUNC(qamax) (int *, double *, int *);
+float  BLASFUNC(scamax)(int *, float  *, int *);
+double BLASFUNC(dzamax)(int *, double *, int *);
+double BLASFUNC(qxamax)(int *, double *, int *);
+
+float  BLASFUNC(samin) (int *, float  *, int *);
+double BLASFUNC(damin) (int *, double *, int *);
+double BLASFUNC(qamin) (int *, double *, int *);
+float  BLASFUNC(scamin)(int *, float  *, int *);
+double BLASFUNC(dzamin)(int *, double *, int *);
+double BLASFUNC(qxamin)(int *, double *, int *);
+
+float  BLASFUNC(smax)  (int *, float  *, int *);
+double BLASFUNC(dmax)  (int *, double *, int *);
+double BLASFUNC(qmax)  (int *, double *, int *);
+float  BLASFUNC(scmax) (int *, float  *, int *);
+double BLASFUNC(dzmax) (int *, double *, int *);
+double BLASFUNC(qxmax) (int *, double *, int *);
+
+float  BLASFUNC(smin)  (int *, float  *, int *);
+double BLASFUNC(dmin)  (int *, double *, int *);
+double BLASFUNC(qmin)  (int *, double *, int *);
+float  BLASFUNC(scmin) (int *, float  *, int *);
+double BLASFUNC(dzmin) (int *, double *, int *);
+double BLASFUNC(qxmin) (int *, double *, int *);
+
+int    BLASFUNC(sscal) (int *,  float  *, float  *, int *);
+int    BLASFUNC(dscal) (int *,  double *, double *, int *);
+int    BLASFUNC(qscal) (int *,  double *, double *, int *);
+int    BLASFUNC(cscal) (int *,  float  *, float  *, int *);
+int    BLASFUNC(zscal) (int *,  double *, double *, int *);
+int    BLASFUNC(xscal) (int *,  double *, double *, int *);
+int    BLASFUNC(csscal)(int *,  float  *, float  *, int *);
+int    BLASFUNC(zdscal)(int *,  double *, double *, int *);
+int    BLASFUNC(xqscal)(int *,  double *, double *, int *);
+
+float  BLASFUNC(snrm2) (int *, float  *, int *);
+float  BLASFUNC(scnrm2)(int *, float  *, int *);
+
+double BLASFUNC(dnrm2) (int *, double *, int *);
+double BLASFUNC(qnrm2) (int *, double *, int *);
+double BLASFUNC(dznrm2)(int *, double *, int *);
+double BLASFUNC(qxnrm2)(int *, double *, int *);
+
+int    BLASFUNC(srot)  (int *, float  *, int *, float  *, int *, float  *, float  *);
+int    BLASFUNC(drot)  (int *, double *, int *, double *, int *, double *, double *);
+int    BLASFUNC(qrot)  (int *, double *, int *, double *, int *, double *, double *);
+int    BLASFUNC(csrot) (int *, float  *, int *, float  *, int *, float  *, float  *);
+int    BLASFUNC(zdrot) (int *, double *, int *, double *, int *, double *, double *);
+int    BLASFUNC(xqrot) (int *, double *, int *, double *, int *, double *, double *);
+
+int    BLASFUNC(srotg) (float  *, float  *, float  *, float  *);
+int    BLASFUNC(drotg) (double *, double *, double *, double *);
+int    BLASFUNC(qrotg) (double *, double *, double *, double *);
+int    BLASFUNC(crotg) (float  *, float  *, float  *, float  *);
+int    BLASFUNC(zrotg) (double *, double *, double *, double *);
+int    BLASFUNC(xrotg) (double *, double *, double *, double *);
+
+int    BLASFUNC(srotmg)(float  *, float  *, float  *, float  *, float  *);
+int    BLASFUNC(drotmg)(double *, double *, double *, double *, double *);
+
+int    BLASFUNC(srotm) (int *, float  *, int *, float  *, int *, float  *);
+int    BLASFUNC(drotm) (int *, double *, int *, double *, int *, double *);
+int    BLASFUNC(qrotm) (int *, double *, int *, double *, int *, double *);
+
+/* Level 2 routines */
+
+int BLASFUNC(sger)(int *,    int *, float *,  float *, int *,
+		   float *,  int *, float *,  int *);
+int BLASFUNC(dger)(int *,    int *, double *, double *, int *,
+		   double *, int *, double *, int *);
+int BLASFUNC(qger)(int *,    int *, double *, double *, int *,
+		   double *, int *, double *, int *);
+int BLASFUNC(cgeru)(int *,    int *, float *,  float *, int *,
+		    float *,  int *, float *,  int *);
+int BLASFUNC(cgerc)(int *,    int *, float *,  float *, int *,
+		    float *,  int *, float *,  int *);
+int BLASFUNC(zgeru)(int *,    int *, double *, double *, int *,
+		    double *, int *, double *, int *);
+int BLASFUNC(zgerc)(int *,    int *, double *, double *, int *,
+		    double *, int *, double *, int *);
+int BLASFUNC(xgeru)(int *,    int *, double *, double *, int *,
+		    double *, int *, double *, int *);
+int BLASFUNC(xgerc)(int *,    int *, double *, double *, int *,
+		    double *, int *, double *, int *);
+
+int BLASFUNC(sgemv)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(dgemv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(qgemv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(cgemv)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zgemv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(xgemv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+
+int BLASFUNC(strsv) (char *, char *, char *, int *, float  *, int *,
+		     float  *, int *);
+int BLASFUNC(dtrsv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(qtrsv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(ctrsv) (char *, char *, char *, int *, float  *, int *,
+		     float  *, int *);
+int BLASFUNC(ztrsv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(xtrsv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+
+int BLASFUNC(stpsv) (char *, char *, char *, int *, float  *, float  *, int *);
+int BLASFUNC(dtpsv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(qtpsv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(ctpsv) (char *, char *, char *, int *, float  *, float  *, int *);
+int BLASFUNC(ztpsv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(xtpsv) (char *, char *, char *, int *, double *, double *, int *);
+
+int BLASFUNC(strmv) (char *, char *, char *, int *, float  *, int *,
+		     float  *, int *);
+int BLASFUNC(dtrmv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(qtrmv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(ctrmv) (char *, char *, char *, int *, float  *, int *,
+		     float  *, int *);
+int BLASFUNC(ztrmv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+int BLASFUNC(xtrmv) (char *, char *, char *, int *, double *, int *,
+		     double *, int *);
+
+int BLASFUNC(stpmv) (char *, char *, char *, int *, float  *, float  *, int *);
+int BLASFUNC(dtpmv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(qtpmv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(ctpmv) (char *, char *, char *, int *, float  *, float  *, int *);
+int BLASFUNC(ztpmv) (char *, char *, char *, int *, double *, double *, int *);
+int BLASFUNC(xtpmv) (char *, char *, char *, int *, double *, double *, int *);
+
+int BLASFUNC(stbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(dtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(qtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(ctbmv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(ztbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(xtbmv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+
+int BLASFUNC(stbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(dtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(qtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(ctbsv) (char *, char *, char *, int *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(ztbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+int BLASFUNC(xtbsv) (char *, char *, char *, int *, int *, double *, int *, double *, int *);
+
+int BLASFUNC(ssymv) (char *, int *, float  *, float *, int *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(dsymv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(qsymv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(csymv) (char *, int *, float  *, float *, int *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(zsymv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(xsymv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+
+int BLASFUNC(sspmv) (char *, int *, float  *, float *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(dspmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(qspmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(cspmv) (char *, int *, float  *, float *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(zspmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(xspmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+
+int BLASFUNC(ssyr) (char *, int *, float   *, float  *, int *,
+		    float  *, int *);
+int BLASFUNC(dsyr) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+int BLASFUNC(qsyr) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+int BLASFUNC(csyr) (char *, int *, float   *, float  *, int *,
+		    float  *, int *);
+int BLASFUNC(zsyr) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+int BLASFUNC(xsyr) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+
+int BLASFUNC(ssyr2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(dsyr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+int BLASFUNC(qsyr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+int BLASFUNC(csyr2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(zsyr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+int BLASFUNC(xsyr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+
+int BLASFUNC(sspr) (char *, int *, float   *, float  *, int *,
+		    float  *);
+int BLASFUNC(dspr) (char *, int *, double  *, double *, int *,
+		    double *);
+int BLASFUNC(qspr) (char *, int *, double  *, double *, int *,
+		    double *);
+int BLASFUNC(cspr) (char *, int *, float   *, float  *, int *,
+		    float  *);
+int BLASFUNC(zspr) (char *, int *, double  *, double *, int *,
+		    double *);
+int BLASFUNC(xspr) (char *, int *, double  *, double *, int *,
+		    double *);
+
+int BLASFUNC(sspr2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *);
+int BLASFUNC(dspr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+int BLASFUNC(qspr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+int BLASFUNC(cspr2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *);
+int BLASFUNC(zspr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+int BLASFUNC(xspr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+
+int BLASFUNC(cher) (char *, int *, float   *, float  *, int *,
+		    float  *, int *);
+int BLASFUNC(zher) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+int BLASFUNC(xher) (char *, int *, double  *, double *, int *,
+		    double *, int *);
+
+int BLASFUNC(chpr) (char *, int *, float   *, float  *, int *, float  *);
+int BLASFUNC(zhpr) (char *, int *, double  *, double *, int *, double *);
+int BLASFUNC(xhpr) (char *, int *, double  *, double *, int *, double *);
+
+int BLASFUNC(cher2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *, int *);
+int BLASFUNC(zher2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+int BLASFUNC(xher2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *, int *);
+
+int BLASFUNC(chpr2) (char *, int *, float   *,
+		     float  *, int *, float  *, int *, float  *);
+int BLASFUNC(zhpr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+int BLASFUNC(xhpr2) (char *, int *, double  *,
+		     double *, int *, double *, int *, double *);
+
+int BLASFUNC(chemv) (char *, int *, float  *, float *, int *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(zhemv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(xhemv) (char *, int *, double  *, double *, int *,
+		     double  *, int *, double *, double *, int *);
+
+int BLASFUNC(chpmv) (char *, int *, float  *, float *,
+		     float  *, int *, float *, float *, int *);
+int BLASFUNC(zhpmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+int BLASFUNC(xhpmv) (char *, int *, double  *, double *,
+		     double  *, int *, double *, double *, int *);
+
+int BLASFUNC(snorm)(char *, int *, int *, float  *, int *);
+int BLASFUNC(dnorm)(char *, int *, int *, double *, int *);
+int BLASFUNC(cnorm)(char *, int *, int *, float  *, int *);
+int BLASFUNC(znorm)(char *, int *, int *, double *, int *);
+
+int BLASFUNC(sgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(dgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(qgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(cgbmv)(char *, int *, int *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(xgbmv)(char *, int *, int *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+
+int BLASFUNC(ssbmv)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(dsbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(qsbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(csbmv)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zsbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(xsbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+
+int BLASFUNC(chbmv)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zhbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+int BLASFUNC(xhbmv)(char *, int *, int *, double *, double *, int *,
+		    double *, int *, double *, double *, int *);
+
+/* Level 3 routines */
+
+int BLASFUNC(sgemm)(char *, char *, int *, int *, int *, float *,
+	   float  *, int *, float  *, int *, float  *, float  *, int *);
+int BLASFUNC(dgemm)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+int BLASFUNC(qgemm)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+int BLASFUNC(cgemm)(char *, char *, int *, int *, int *, float *,
+	   float  *, int *, float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zgemm)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+int BLASFUNC(xgemm)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+
+int BLASFUNC(cgemm3m)(char *, char *, int *, int *, int *, float *,
+	   float  *, int *, float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zgemm3m)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+int BLASFUNC(xgemm3m)(char *, char *, int *, int *, int *, double *,
+	   double *, int *, double *, int *, double *, double *, int *);
+
+int BLASFUNC(sge2mm)(char *, char *, char *, int *, int *,
+		     float *, float  *, int *, float  *, int *,
+		     float *, float  *, int *);
+int BLASFUNC(dge2mm)(char *, char *, char *, int *, int *,
+		     double *, double  *, int *, double  *, int *,
+		     double *, double  *, int *);
+int BLASFUNC(cge2mm)(char *, char *, char *, int *, int *,
+		     float *, float  *, int *, float  *, int *,
+		     float *, float  *, int *);
+int BLASFUNC(zge2mm)(char *, char *, char *, int *, int *,
+		     double *, double  *, int *, double  *, int *,
+		     double *, double  *, int *);
+
+int BLASFUNC(strsm)(char *, char *, char *, char *, int *, int *,
+	   float *,  float *, int *, float *, int *);
+int BLASFUNC(dtrsm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(qtrsm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(ctrsm)(char *, char *, char *, char *, int *, int *,
+	   float *,  float *, int *, float *, int *);
+int BLASFUNC(ztrsm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(xtrsm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+
+int BLASFUNC(strmm)(char *, char *, char *, char *, int *, int *,
+	   float *,  float *, int *, float *, int *);
+int BLASFUNC(dtrmm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(qtrmm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(ctrmm)(char *, char *, char *, char *, int *, int *,
+	   float *,  float *, int *, float *, int *);
+int BLASFUNC(ztrmm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+int BLASFUNC(xtrmm)(char *, char *, char *, char *, int *, int *,
+	   double *,  double *, int *, double *, int *);
+
+int BLASFUNC(ssymm)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, int *, float  *, float  *, int *);
+int BLASFUNC(dsymm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(qsymm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(csymm)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zsymm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(xsymm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+
+int BLASFUNC(csymm3m)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zsymm3m)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(xsymm3m)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+
+int BLASFUNC(ssyrk)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, float  *, int *);
+int BLASFUNC(dsyrk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+int BLASFUNC(qsyrk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+int BLASFUNC(csyrk)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, float  *, int *);
+int BLASFUNC(zsyrk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+int BLASFUNC(xsyrk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+
+int BLASFUNC(ssyr2k)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float *, int *, float  *, float  *, int *);
+int BLASFUNC(dsyr2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(qsyr2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(csyr2k)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float *, int *, float  *, float  *, int *);
+int BLASFUNC(zsyr2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(xsyr2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+
+int BLASFUNC(chemm)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zhemm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(xhemm)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+
+int BLASFUNC(chemm3m)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, int *, float  *, float  *, int *);
+int BLASFUNC(zhemm3m)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+int BLASFUNC(xhemm3m)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, int *, double *, double *, int *);
+
+int BLASFUNC(cherk)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float  *, float  *, int *);
+int BLASFUNC(zherk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+int BLASFUNC(xherk)(char *, char *, int *, int *, double *, double *, int *,
+	   double *, double *, int *);
+
+int BLASFUNC(cher2k)(char *, char *, int *, int *, float  *, float  *, int *,
+	   float *, int *, float  *, float  *, int *);
+int BLASFUNC(zher2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(xher2k)(char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(cher2m)(char *, char *, char *, int *, int *, float  *, float  *, int *,
+	   float *, int *, float  *, float  *, int *);
+int BLASFUNC(zher2m)(char *, char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+int BLASFUNC(xher2m)(char *, char *, char *, int *, int *, double *, double *, int *,
+	   double*, int *, double *, double *, int *);
+
+int BLASFUNC(sgemt)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *);
+int BLASFUNC(dgemt)(char *, int *, int *, double *, double *, int *,
+		    double *, int *);
+int BLASFUNC(cgemt)(char *, int *, int *, float  *, float  *, int *,
+		    float  *, int *);
+int BLASFUNC(zgemt)(char *, int *, int *, double *, double *, int *,
+		    double *, int *);
+
+int BLASFUNC(sgema)(char *, char *, int *, int *, float  *,
+		    float  *, int *, float *, float  *, int *, float *, int *);
+int BLASFUNC(dgema)(char *, char *, int *, int *, double *,
+		    double *, int *, double*, double *, int *, double*, int *);
+int BLASFUNC(cgema)(char *, char *, int *, int *, float  *,
+		    float  *, int *, float *, float  *, int *, float *, int *);
+int BLASFUNC(zgema)(char *, char *, int *, int *, double *,
+		    double *, int *, double*, double *, int *, double*, int *);
+
+int BLASFUNC(sgems)(char *, char *, int *, int *, float  *,
+		    float  *, int *, float *, float  *, int *, float *, int *);
+int BLASFUNC(dgems)(char *, char *, int *, int *, double *,
+		    double *, int *, double*, double *, int *, double*, int *);
+int BLASFUNC(cgems)(char *, char *, int *, int *, float  *,
+		    float  *, int *, float *, float  *, int *, float *, int *);
+int BLASFUNC(zgems)(char *, char *, int *, int *, double *,
+		    double *, int *, double*, double *, int *, double*, int *);
+
+int BLASFUNC(sgetf2)(int *, int *, float  *, int *, int *, int *);
+int BLASFUNC(dgetf2)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(qgetf2)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(cgetf2)(int *, int *, float  *, int *, int *, int *);
+int BLASFUNC(zgetf2)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(xgetf2)(int *, int *, double *, int *, int *, int *);
+
+int BLASFUNC(sgetrf)(int *, int *, float  *, int *, int *, int *);
+int BLASFUNC(dgetrf)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(qgetrf)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(cgetrf)(int *, int *, float  *, int *, int *, int *);
+int BLASFUNC(zgetrf)(int *, int *, double *, int *, int *, int *);
+int BLASFUNC(xgetrf)(int *, int *, double *, int *, int *, int *);
+
+int BLASFUNC(slaswp)(int *, float  *, int *, int *, int *, int *, int *);
+int BLASFUNC(dlaswp)(int *, double *, int *, int *, int *, int *, int *);
+int BLASFUNC(qlaswp)(int *, double *, int *, int *, int *, int *, int *);
+int BLASFUNC(claswp)(int *, float  *, int *, int *, int *, int *, int *);
+int BLASFUNC(zlaswp)(int *, double *, int *, int *, int *, int *, int *);
+int BLASFUNC(xlaswp)(int *, double *, int *, int *, int *, int *, int *);
+
+int BLASFUNC(sgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);
+int BLASFUNC(dgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
+int BLASFUNC(qgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
+int BLASFUNC(cgetrs)(char *, int *, int *, float  *, int *, int *, float  *, int *, int *);
+int BLASFUNC(zgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
+int BLASFUNC(xgetrs)(char *, int *, int *, double *, int *, int *, double *, int *, int *);
+
+int BLASFUNC(sgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);
+int BLASFUNC(dgesv)(int *, int *, double *, int *, int *, double*, int *, int *);
+int BLASFUNC(qgesv)(int *, int *, double *, int *, int *, double*, int *, int *);
+int BLASFUNC(cgesv)(int *, int *, float  *, int *, int *, float *, int *, int *);
+int BLASFUNC(zgesv)(int *, int *, double *, int *, int *, double*, int *, int *);
+int BLASFUNC(xgesv)(int *, int *, double *, int *, int *, double*, int *, int *);
+
+int BLASFUNC(spotf2)(char *, int *, float  *, int *, int *);
+int BLASFUNC(dpotf2)(char *, int *, double *, int *, int *);
+int BLASFUNC(qpotf2)(char *, int *, double *, int *, int *);
+int BLASFUNC(cpotf2)(char *, int *, float  *, int *, int *);
+int BLASFUNC(zpotf2)(char *, int *, double *, int *, int *);
+int BLASFUNC(xpotf2)(char *, int *, double *, int *, int *);
+
+int BLASFUNC(spotrf)(char *, int *, float  *, int *, int *);
+int BLASFUNC(dpotrf)(char *, int *, double *, int *, int *);
+int BLASFUNC(qpotrf)(char *, int *, double *, int *, int *);
+int BLASFUNC(cpotrf)(char *, int *, float  *, int *, int *);
+int BLASFUNC(zpotrf)(char *, int *, double *, int *, int *);
+int BLASFUNC(xpotrf)(char *, int *, double *, int *, int *);
+
+int BLASFUNC(slauu2)(char *, int *, float  *, int *, int *);
+int BLASFUNC(dlauu2)(char *, int *, double *, int *, int *);
+int BLASFUNC(qlauu2)(char *, int *, double *, int *, int *);
+int BLASFUNC(clauu2)(char *, int *, float  *, int *, int *);
+int BLASFUNC(zlauu2)(char *, int *, double *, int *, int *);
+int BLASFUNC(xlauu2)(char *, int *, double *, int *, int *);
+
+int BLASFUNC(slauum)(char *, int *, float  *, int *, int *);
+int BLASFUNC(dlauum)(char *, int *, double *, int *, int *);
+int BLASFUNC(qlauum)(char *, int *, double *, int *, int *);
+int BLASFUNC(clauum)(char *, int *, float  *, int *, int *);
+int BLASFUNC(zlauum)(char *, int *, double *, int *, int *);
+int BLASFUNC(xlauum)(char *, int *, double *, int *, int *);
+
+int BLASFUNC(strti2)(char *, char *, int *, float  *, int *, int *);
+int BLASFUNC(dtrti2)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(qtrti2)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(ctrti2)(char *, char *, int *, float  *, int *, int *);
+int BLASFUNC(ztrti2)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(xtrti2)(char *, char *, int *, double *, int *, int *);
+
+int BLASFUNC(strtri)(char *, char *, int *, float  *, int *, int *);
+int BLASFUNC(dtrtri)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(qtrtri)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(ctrtri)(char *, char *, int *, float  *, int *, int *);
+int BLASFUNC(ztrtri)(char *, char *, int *, double *, int *, int *);
+int BLASFUNC(xtrtri)(char *, char *, int *, double *, int *, int *);
+
+int BLASFUNC(spotri)(char *, int *, float  *, int *, int *);
+int BLASFUNC(dpotri)(char *, int *, double *, int *, int *);
+int BLASFUNC(qpotri)(char *, int *, double *, int *, int *);
+int BLASFUNC(cpotri)(char *, int *, float  *, int *, int *);
+int BLASFUNC(zpotri)(char *, int *, double *, int *, int *);
+int BLASFUNC(xpotri)(char *, int *, double *, int *, int *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseBinaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseBinaryOps.h
new file mode 100644
index 0000000..5c8c476
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseBinaryOps.h
@@ -0,0 +1,211 @@
+/** \returns an expression of the coefficient wise product of \c *this and \a other
+  *
+  * \sa MatrixBase::cwiseProduct
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)
+operator*(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient wise quotient of \c *this and \a other
+  *
+  * \sa MatrixBase::cwiseQuotient
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
+operator/(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise min of \c *this and \a other
+  *
+  * Example: \include Cwise_min.cpp
+  * Output: \verbinclude Cwise_min.out
+  *
+  * \sa max()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(min,internal::scalar_min_op)
+
+/** \returns an expression of the coefficient-wise min of \c *this and scalar \a other
+  *
+  * \sa max()
+  */
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived,
+                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+min
+#else
+(min)
+#endif
+(const Scalar &other) const
+{
+  return (min)(Derived::PlainObject::Constant(rows(), cols(), other));
+}
+
+/** \returns an expression of the coefficient-wise max of \c *this and \a other
+  *
+  * Example: \include Cwise_max.cpp
+  * Output: \verbinclude Cwise_max.out
+  *
+  * \sa min()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(max,internal::scalar_max_op)
+
+/** \returns an expression of the coefficient-wise max of \c *this and scalar \a other
+  *
+  * \sa min()
+  */
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived,
+                                        const CwiseNullaryOp<internal::scalar_constant_op<Scalar>, PlainObject> >
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+max
+#else
+(max)
+#endif
+(const Scalar &other) const
+{
+  return (max)(Derived::PlainObject::Constant(rows(), cols(), other));
+}
+
+/** \returns an expression of the coefficient-wise \< operator of *this and \a other
+  *
+  * Example: \include Cwise_less.cpp
+  * Output: \verbinclude Cwise_less.out
+  *
+  * \sa all(), any(), operator>(), operator<=()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator<,std::less)
+
+/** \returns an expression of the coefficient-wise \<= operator of *this and \a other
+  *
+  * Example: \include Cwise_less_equal.cpp
+  * Output: \verbinclude Cwise_less_equal.out
+  *
+  * \sa all(), any(), operator>=(), operator<()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator<=,std::less_equal)
+
+/** \returns an expression of the coefficient-wise \> operator of *this and \a other
+  *
+  * Example: \include Cwise_greater.cpp
+  * Output: \verbinclude Cwise_greater.out
+  *
+  * \sa all(), any(), operator>=(), operator<()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator>,std::greater)
+
+/** \returns an expression of the coefficient-wise \>= operator of *this and \a other
+  *
+  * Example: \include Cwise_greater_equal.cpp
+  * Output: \verbinclude Cwise_greater_equal.out
+  *
+  * \sa all(), any(), operator>(), operator<=()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator>=,std::greater_equal)
+
+/** \returns an expression of the coefficient-wise == operator of *this and \a other
+  *
+  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+  * isMuchSmallerThan().
+  *
+  * Example: \include Cwise_equal_equal.cpp
+  * Output: \verbinclude Cwise_equal_equal.out
+  *
+  * \sa all(), any(), isApprox(), isMuchSmallerThan()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator==,std::equal_to)
+
+/** \returns an expression of the coefficient-wise != operator of *this and \a other
+  *
+  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+  * isMuchSmallerThan().
+  *
+  * Example: \include Cwise_not_equal.cpp
+  * Output: \verbinclude Cwise_not_equal.out
+  *
+  * \sa all(), any(), isApprox(), isMuchSmallerThan()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator!=,std::not_equal_to)
+
+// scalar addition
+
+/** \returns an expression of \c *this with each coeff incremented by the constant \a scalar
+  *
+  * Example: \include Cwise_plus.cpp
+  * Output: \verbinclude Cwise_plus.out
+  *
+  * \sa operator+=(), operator-()
+  */
+inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>
+operator+(const Scalar& scalar) const
+{
+  return CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>(derived(), internal::scalar_add_op<Scalar>(scalar));
+}
+
+friend inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>
+operator+(const Scalar& scalar,const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& other)
+{
+  return other + scalar;
+}
+
+/** \returns an expression of \c *this with each coeff decremented by the constant \a scalar
+  *
+  * Example: \include Cwise_minus.cpp
+  * Output: \verbinclude Cwise_minus.out
+  *
+  * \sa operator+(), operator-=()
+  */
+inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const Derived>
+operator-(const Scalar& scalar) const
+{
+  return *this + (-scalar);
+}
+
+friend inline const CwiseUnaryOp<internal::scalar_add_op<Scalar>, const CwiseUnaryOp<internal::scalar_opposite_op<Scalar>, const Derived> >
+operator-(const Scalar& scalar,const EIGEN_CURRENT_STORAGE_BASE_CLASS<Derived>& other)
+{
+  return (-other) + scalar;
+}
+
+/** \returns an expression of the coefficient-wise && operator of *this and \a other
+  *
+  * \warning this operator is for expression of bool only.
+  *
+  * Example: \include Cwise_boolean_and.cpp
+  * Output: \verbinclude Cwise_boolean_and.out
+  *
+  * \sa operator||(), select()
+  */
+template<typename OtherDerived>
+inline const CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>
+operator&&(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
+                      THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
+  return CwiseBinaryOp<internal::scalar_boolean_and_op, const Derived, const OtherDerived>(derived(),other.derived());
+}
+
+/** \returns an expression of the coefficient-wise || operator of *this and \a other
+  *
+  * \warning this operator is for expression of bool only.
+  *
+  * Example: \include Cwise_boolean_or.cpp
+  * Output: \verbinclude Cwise_boolean_or.out
+  *
+  * \sa operator&&(), select()
+  */
+template<typename OtherDerived>
+inline const CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>
+operator||(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  EIGEN_STATIC_ASSERT((internal::is_same<bool,Scalar>::value && internal::is_same<bool,typename OtherDerived::Scalar>::value),
+                      THIS_METHOD_IS_ONLY_FOR_EXPRESSIONS_OF_BOOL);
+  return CwiseBinaryOp<internal::scalar_boolean_or_op, const Derived, const OtherDerived>(derived(),other.derived());
+}
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseUnaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseUnaryOps.h
new file mode 100644
index 0000000..a596367
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/ArrayCwiseUnaryOps.h
@@ -0,0 +1,203 @@
+
+
+/** \returns an expression of the coefficient-wise absolute value of \c *this
+  *
+  * Example: \include Cwise_abs.cpp
+  * Output: \verbinclude Cwise_abs.out
+  *
+  * \sa abs2()
+  */
+EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
+abs() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise squared absolute value of \c *this
+  *
+  * Example: \include Cwise_abs2.cpp
+  * Output: \verbinclude Cwise_abs2.out
+  *
+  * \sa abs(), square()
+  */
+EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>
+abs2() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise exponential of *this.
+  *
+  * Example: \include Cwise_exp.cpp
+  * Output: \verbinclude Cwise_exp.out
+  *
+  * \sa pow(), log(), sin(), cos()
+  */
+inline const CwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived>
+exp() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise logarithm of *this.
+  *
+  * Example: \include Cwise_log.cpp
+  * Output: \verbinclude Cwise_log.out
+  *
+  * \sa exp()
+  */
+inline const CwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived>
+log() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise square root of *this.
+  *
+  * Example: \include Cwise_sqrt.cpp
+  * Output: \verbinclude Cwise_sqrt.out
+  *
+  * \sa pow(), square()
+  */
+inline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
+sqrt() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise cosine of *this.
+  *
+  * Example: \include Cwise_cos.cpp
+  * Output: \verbinclude Cwise_cos.out
+  *
+  * \sa sin(), acos()
+  */
+inline const CwiseUnaryOp<internal::scalar_cos_op<Scalar>, const Derived>
+cos() const
+{
+  return derived();
+}
+
+
+/** \returns an expression of the coefficient-wise sine of *this.
+  *
+  * Example: \include Cwise_sin.cpp
+  * Output: \verbinclude Cwise_sin.out
+  *
+  * \sa cos(), asin()
+  */
+inline const CwiseUnaryOp<internal::scalar_sin_op<Scalar>, const Derived>
+sin() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise arc cosine of *this.
+  *
+  * Example: \include Cwise_acos.cpp
+  * Output: \verbinclude Cwise_acos.out
+  *
+  * \sa cos(), asin()
+  */
+inline const CwiseUnaryOp<internal::scalar_acos_op<Scalar>, const Derived>
+acos() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise arc sine of *this.
+  *
+  * Example: \include Cwise_asin.cpp
+  * Output: \verbinclude Cwise_asin.out
+  *
+  * \sa sin(), acos()
+  */
+inline const CwiseUnaryOp<internal::scalar_asin_op<Scalar>, const Derived>
+asin() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise tan of *this.
+  *
+  * Example: \include Cwise_tan.cpp
+  * Output: \verbinclude Cwise_tan.out
+  *
+  * \sa cos(), sin()
+  */
+inline const CwiseUnaryOp<internal::scalar_tan_op<Scalar>, Derived>
+tan() const
+{
+  return derived();
+}
+
+
+/** \returns an expression of the coefficient-wise power of *this to the given exponent.
+  *
+  * Example: \include Cwise_pow.cpp
+  * Output: \verbinclude Cwise_pow.out
+  *
+  * \sa exp(), log()
+  */
+inline const CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>
+pow(const Scalar& exponent) const
+{
+  return CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>
+          (derived(), internal::scalar_pow_op<Scalar>(exponent));
+}
+
+
+/** \returns an expression of the coefficient-wise inverse of *this.
+  *
+  * Example: \include Cwise_inverse.cpp
+  * Output: \verbinclude Cwise_inverse.out
+  *
+  * \sa operator/(), operator*()
+  */
+inline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
+inverse() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise square of *this.
+  *
+  * Example: \include Cwise_square.cpp
+  * Output: \verbinclude Cwise_square.out
+  *
+  * \sa operator/(), operator*(), abs2()
+  */
+inline const CwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived>
+square() const
+{
+  return derived();
+}
+
+/** \returns an expression of the coefficient-wise cube of *this.
+  *
+  * Example: \include Cwise_cube.cpp
+  * Output: \verbinclude Cwise_cube.out
+  *
+  * \sa square(), pow()
+  */
+inline const CwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived>
+cube() const
+{
+  return derived();
+}
+
+#define EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(METHOD_NAME,FUNCTOR) \
+  inline const CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \
+  METHOD_NAME(const Scalar& s) const { \
+    return CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \
+            (derived(), std::bind2nd(FUNCTOR<Scalar>(), s)); \
+  }
+
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator==,  std::equal_to)
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator!=,  std::not_equal_to)
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator<,   std::less)
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator<=,  std::less_equal)
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator>,   std::greater)
+EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator>=,  std::greater_equal)
+
+
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/BlockMethods.h b/vendor/eigen-3.1.91/Eigen/src/plugins/BlockMethods.h
new file mode 100644
index 0000000..19a491c
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/BlockMethods.h
@@ -0,0 +1,747 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+
+/** \internal expression type of a column */
+typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ColXpr;
+typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, 1, !IsRowMajor> ConstColXpr;
+/** \internal expression type of a row */
+typedef Block<Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowXpr;
+typedef const Block<const Derived, 1, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowXpr;
+/** \internal expression type of a block of whole columns */
+typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ColsBlockXpr;
+typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, Dynamic, !IsRowMajor> ConstColsBlockXpr;
+/** \internal expression type of a block of whole rows */
+typedef Block<Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> RowsBlockXpr;
+typedef const Block<const Derived, Dynamic, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> ConstRowsBlockXpr;
+/** \internal expression type of a block of whole columns */
+template<int N> struct NColsBlockXpr { typedef Block<Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
+template<int N> struct ConstNColsBlockXpr { typedef const Block<const Derived, internal::traits<Derived>::RowsAtCompileTime, N, !IsRowMajor> Type; };
+/** \internal expression type of a block of whole rows */
+template<int N> struct NRowsBlockXpr { typedef Block<Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
+template<int N> struct ConstNRowsBlockXpr { typedef const Block<const Derived, N, internal::traits<Derived>::ColsAtCompileTime, IsRowMajor> Type; };
+
+typedef VectorBlock<Derived> SegmentReturnType;
+typedef const VectorBlock<const Derived> ConstSegmentReturnType;
+template<int Size> struct FixedSegmentReturnType { typedef VectorBlock<Derived, Size> Type; };
+template<int Size> struct ConstFixedSegmentReturnType { typedef const VectorBlock<const Derived, Size> Type; };
+
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+/** \returns a dynamic-size expression of a block in *this.
+  *
+  * \param startRow the first row in the block
+  * \param startCol the first column in the block
+  * \param blockRows the number of rows in the block
+  * \param blockCols the number of columns in the block
+  *
+  * Example: \include MatrixBase_block_int_int_int_int.cpp
+  * Output: \verbinclude MatrixBase_block_int_int_int_int.out
+  *
+  * \note Even though the returned expression has dynamic size, in the case
+  * when it is applied to a fixed-size matrix, it inherits a fixed maximal size,
+  * which means that evaluating it does not cause a dynamic memory allocation.
+  *
+  * \sa class Block, block(Index,Index)
+  */
+inline Block<Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols)
+{
+  return Block<Derived>(derived(), startRow, startCol, blockRows, blockCols);
+}
+
+/** This is the const version of block(Index,Index,Index,Index). */
+inline const Block<const Derived> block(Index startRow, Index startCol, Index blockRows, Index blockCols) const
+{
+  return Block<const Derived>(derived(), startRow, startCol, blockRows, blockCols);
+}
+
+
+
+
+/** \returns a dynamic-size expression of a top-right corner of *this.
+  *
+  * \param cRows the number of rows in the corner
+  * \param cCols the number of columns in the corner
+  *
+  * Example: \include MatrixBase_topRightCorner_int_int.cpp
+  * Output: \verbinclude MatrixBase_topRightCorner_int_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline Block<Derived> topRightCorner(Index cRows, Index cCols)
+{
+  return Block<Derived>(derived(), 0, cols() - cCols, cRows, cCols);
+}
+
+/** This is the const version of topRightCorner(Index, Index).*/
+inline const Block<const Derived> topRightCorner(Index cRows, Index cCols) const
+{
+  return Block<const Derived>(derived(), 0, cols() - cCols, cRows, cCols);
+}
+
+/** \returns an expression of a fixed-size top-right corner of *this.
+  *
+  * The template parameters CRows and CCols are the number of rows and columns in the corner.
+  *
+  * Example: \include MatrixBase_template_int_int_topRightCorner.cpp
+  * Output: \verbinclude MatrixBase_template_int_int_topRightCorner.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int CRows, int CCols>
+inline Block<Derived, CRows, CCols> topRightCorner()
+{
+  return Block<Derived, CRows, CCols>(derived(), 0, cols() - CCols);
+}
+
+/** This is the const version of topRightCorner<int, int>().*/
+template<int CRows, int CCols>
+inline const Block<const Derived, CRows, CCols> topRightCorner() const
+{
+  return Block<const Derived, CRows, CCols>(derived(), 0, cols() - CCols);
+}
+
+
+
+
+/** \returns a dynamic-size expression of a top-left corner of *this.
+  *
+  * \param cRows the number of rows in the corner
+  * \param cCols the number of columns in the corner
+  *
+  * Example: \include MatrixBase_topLeftCorner_int_int.cpp
+  * Output: \verbinclude MatrixBase_topLeftCorner_int_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline Block<Derived> topLeftCorner(Index cRows, Index cCols)
+{
+  return Block<Derived>(derived(), 0, 0, cRows, cCols);
+}
+
+/** This is the const version of topLeftCorner(Index, Index).*/
+inline const Block<const Derived> topLeftCorner(Index cRows, Index cCols) const
+{
+  return Block<const Derived>(derived(), 0, 0, cRows, cCols);
+}
+
+/** \returns an expression of a fixed-size top-left corner of *this.
+  *
+  * The template parameters CRows and CCols are the number of rows and columns in the corner.
+  *
+  * Example: \include MatrixBase_template_int_int_topLeftCorner.cpp
+  * Output: \verbinclude MatrixBase_template_int_int_topLeftCorner.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int CRows, int CCols>
+inline Block<Derived, CRows, CCols> topLeftCorner()
+{
+  return Block<Derived, CRows, CCols>(derived(), 0, 0);
+}
+
+/** This is the const version of topLeftCorner<int, int>().*/
+template<int CRows, int CCols>
+inline const Block<const Derived, CRows, CCols> topLeftCorner() const
+{
+  return Block<const Derived, CRows, CCols>(derived(), 0, 0);
+}
+
+
+
+/** \returns a dynamic-size expression of a bottom-right corner of *this.
+  *
+  * \param cRows the number of rows in the corner
+  * \param cCols the number of columns in the corner
+  *
+  * Example: \include MatrixBase_bottomRightCorner_int_int.cpp
+  * Output: \verbinclude MatrixBase_bottomRightCorner_int_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline Block<Derived> bottomRightCorner(Index cRows, Index cCols)
+{
+  return Block<Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+}
+
+/** This is the const version of bottomRightCorner(Index, Index).*/
+inline const Block<const Derived> bottomRightCorner(Index cRows, Index cCols) const
+{
+  return Block<const Derived>(derived(), rows() - cRows, cols() - cCols, cRows, cCols);
+}
+
+/** \returns an expression of a fixed-size bottom-right corner of *this.
+  *
+  * The template parameters CRows and CCols are the number of rows and columns in the corner.
+  *
+  * Example: \include MatrixBase_template_int_int_bottomRightCorner.cpp
+  * Output: \verbinclude MatrixBase_template_int_int_bottomRightCorner.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int CRows, int CCols>
+inline Block<Derived, CRows, CCols> bottomRightCorner()
+{
+  return Block<Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
+}
+
+/** This is the const version of bottomRightCorner<int, int>().*/
+template<int CRows, int CCols>
+inline const Block<const Derived, CRows, CCols> bottomRightCorner() const
+{
+  return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, cols() - CCols);
+}
+
+
+
+/** \returns a dynamic-size expression of a bottom-left corner of *this.
+  *
+  * \param cRows the number of rows in the corner
+  * \param cCols the number of columns in the corner
+  *
+  * Example: \include MatrixBase_bottomLeftCorner_int_int.cpp
+  * Output: \verbinclude MatrixBase_bottomLeftCorner_int_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline Block<Derived> bottomLeftCorner(Index cRows, Index cCols)
+{
+  return Block<Derived>(derived(), rows() - cRows, 0, cRows, cCols);
+}
+
+/** This is the const version of bottomLeftCorner(Index, Index).*/
+inline const Block<const Derived> bottomLeftCorner(Index cRows, Index cCols) const
+{
+  return Block<const Derived>(derived(), rows() - cRows, 0, cRows, cCols);
+}
+
+/** \returns an expression of a fixed-size bottom-left corner of *this.
+  *
+  * The template parameters CRows and CCols are the number of rows and columns in the corner.
+  *
+  * Example: \include MatrixBase_template_int_int_bottomLeftCorner.cpp
+  * Output: \verbinclude MatrixBase_template_int_int_bottomLeftCorner.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int CRows, int CCols>
+inline Block<Derived, CRows, CCols> bottomLeftCorner()
+{
+  return Block<Derived, CRows, CCols>(derived(), rows() - CRows, 0);
+}
+
+/** This is the const version of bottomLeftCorner<int, int>().*/
+template<int CRows, int CCols>
+inline const Block<const Derived, CRows, CCols> bottomLeftCorner() const
+{
+  return Block<const Derived, CRows, CCols>(derived(), rows() - CRows, 0);
+}
+
+
+
+/** \returns a block consisting of the top rows of *this.
+  *
+  * \param n the number of rows in the block
+  *
+  * Example: \include MatrixBase_topRows_int.cpp
+  * Output: \verbinclude MatrixBase_topRows_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline RowsBlockXpr topRows(Index n)
+{
+  return RowsBlockXpr(derived(), 0, 0, n, cols());
+}
+
+/** This is the const version of topRows(Index).*/
+inline ConstRowsBlockXpr topRows(Index n) const
+{
+  return ConstRowsBlockXpr(derived(), 0, 0, n, cols());
+}
+
+/** \returns a block consisting of the top rows of *this.
+  *
+  * \tparam N the number of rows in the block
+  *
+  * Example: \include MatrixBase_template_int_topRows.cpp
+  * Output: \verbinclude MatrixBase_template_int_topRows.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NRowsBlockXpr<N>::Type topRows()
+{
+  return typename NRowsBlockXpr<N>::Type(derived(), 0, 0, N, cols());
+}
+
+/** This is the const version of topRows<int>().*/
+template<int N>
+inline typename ConstNRowsBlockXpr<N>::Type topRows() const
+{
+  return typename ConstNRowsBlockXpr<N>::Type(derived(), 0, 0, N, cols());
+}
+
+
+
+/** \returns a block consisting of the bottom rows of *this.
+  *
+  * \param n the number of rows in the block
+  *
+  * Example: \include MatrixBase_bottomRows_int.cpp
+  * Output: \verbinclude MatrixBase_bottomRows_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline RowsBlockXpr bottomRows(Index n)
+{
+  return RowsBlockXpr(derived(), rows() - n, 0, n, cols());
+}
+
+/** This is the const version of bottomRows(Index).*/
+inline ConstRowsBlockXpr bottomRows(Index n) const
+{
+  return ConstRowsBlockXpr(derived(), rows() - n, 0, n, cols());
+}
+
+/** \returns a block consisting of the bottom rows of *this.
+  *
+  * \tparam N the number of rows in the block
+  *
+  * Example: \include MatrixBase_template_int_bottomRows.cpp
+  * Output: \verbinclude MatrixBase_template_int_bottomRows.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NRowsBlockXpr<N>::Type bottomRows()
+{
+  return typename NRowsBlockXpr<N>::Type(derived(), rows() - N, 0, N, cols());
+}
+
+/** This is the const version of bottomRows<int>().*/
+template<int N>
+inline typename ConstNRowsBlockXpr<N>::Type bottomRows() const
+{
+  return typename ConstNRowsBlockXpr<N>::Type(derived(), rows() - N, 0, N, cols());
+}
+
+
+
+/** \returns a block consisting of a range of rows of *this.
+  *
+  * \param startRow the index of the first row in the block
+  * \param numRows the number of rows in the block
+  *
+  * Example: \include DenseBase_middleRows_int.cpp
+  * Output: \verbinclude DenseBase_middleRows_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline RowsBlockXpr middleRows(Index startRow, Index numRows)
+{
+  return RowsBlockXpr(derived(), startRow, 0, numRows, cols());
+}
+
+/** This is the const version of middleRows(Index,Index).*/
+inline ConstRowsBlockXpr middleRows(Index startRow, Index numRows) const
+{
+  return ConstRowsBlockXpr(derived(), startRow, 0, numRows, cols());
+}
+
+/** \returns a block consisting of a range of rows of *this.
+  *
+  * \tparam N the number of rows in the block
+  * \param startRow the index of the first row in the block
+  *
+  * Example: \include DenseBase_template_int_middleRows.cpp
+  * Output: \verbinclude DenseBase_template_int_middleRows.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NRowsBlockXpr<N>::Type middleRows(Index startRow)
+{
+  return typename NRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
+}
+
+/** This is the const version of middleRows<int>().*/
+template<int N>
+inline typename ConstNRowsBlockXpr<N>::Type middleRows(Index startRow) const
+{
+  return typename ConstNRowsBlockXpr<N>::Type(derived(), startRow, 0, N, cols());
+}
+
+
+
+/** \returns a block consisting of the left columns of *this.
+  *
+  * \param n the number of columns in the block
+  *
+  * Example: \include MatrixBase_leftCols_int.cpp
+  * Output: \verbinclude MatrixBase_leftCols_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline ColsBlockXpr leftCols(Index n)
+{
+  return ColsBlockXpr(derived(), 0, 0, rows(), n);
+}
+
+/** This is the const version of leftCols(Index).*/
+inline ConstColsBlockXpr leftCols(Index n) const
+{
+  return ConstColsBlockXpr(derived(), 0, 0, rows(), n);
+}
+
+/** \returns a block consisting of the left columns of *this.
+  *
+  * \tparam N the number of columns in the block
+  *
+  * Example: \include MatrixBase_template_int_leftCols.cpp
+  * Output: \verbinclude MatrixBase_template_int_leftCols.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NColsBlockXpr<N>::Type leftCols()
+{
+  return typename NColsBlockXpr<N>::Type(derived(), 0, 0, rows(), N);
+}
+
+/** This is the const version of leftCols<int>().*/
+template<int N>
+inline typename ConstNColsBlockXpr<N>::Type leftCols() const
+{
+  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, 0, rows(), N);
+}
+
+
+
+/** \returns a block consisting of the right columns of *this.
+  *
+  * \param n the number of columns in the block
+  *
+  * Example: \include MatrixBase_rightCols_int.cpp
+  * Output: \verbinclude MatrixBase_rightCols_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline ColsBlockXpr rightCols(Index n)
+{
+  return ColsBlockXpr(derived(), 0, cols() - n, rows(), n);
+}
+
+/** This is the const version of rightCols(Index).*/
+inline ConstColsBlockXpr rightCols(Index n) const
+{
+  return ConstColsBlockXpr(derived(), 0, cols() - n, rows(), n);
+}
+
+/** \returns a block consisting of the right columns of *this.
+  *
+  * \tparam N the number of columns in the block
+  *
+  * Example: \include MatrixBase_template_int_rightCols.cpp
+  * Output: \verbinclude MatrixBase_template_int_rightCols.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NColsBlockXpr<N>::Type rightCols()
+{
+  return typename NColsBlockXpr<N>::Type(derived(), 0, cols() - N, rows(), N);
+}
+
+/** This is the const version of rightCols<int>().*/
+template<int N>
+inline typename ConstNColsBlockXpr<N>::Type rightCols() const
+{
+  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, cols() - N, rows(), N);
+}
+
+
+
+/** \returns a block consisting of a range of columns of *this.
+  *
+  * \param startCol the index of the first column in the block
+  * \param numCols the number of columns in the block
+  *
+  * Example: \include DenseBase_middleCols_int.cpp
+  * Output: \verbinclude DenseBase_middleCols_int.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+inline ColsBlockXpr middleCols(Index startCol, Index numCols)
+{
+  return ColsBlockXpr(derived(), 0, startCol, rows(), numCols);
+}
+
+/** This is the const version of middleCols(Index,Index).*/
+inline ConstColsBlockXpr middleCols(Index startCol, Index numCols) const
+{
+  return ConstColsBlockXpr(derived(), 0, startCol, rows(), numCols);
+}
+
+/** \returns a block consisting of a range of columns of *this.
+  *
+  * \tparam N the number of columns in the block
+  * \param startCol the index of the first column in the block
+  *
+  * Example: \include DenseBase_template_int_middleCols.cpp
+  * Output: \verbinclude DenseBase_template_int_middleCols.out
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int N>
+inline typename NColsBlockXpr<N>::Type middleCols(Index startCol)
+{
+  return typename NColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
+}
+
+/** This is the const version of middleCols<int>().*/
+template<int N>
+inline typename ConstNColsBlockXpr<N>::Type middleCols(Index startCol) const
+{
+  return typename ConstNColsBlockXpr<N>::Type(derived(), 0, startCol, rows(), N);
+}
+
+
+
+/** \returns a fixed-size expression of a block in *this.
+  *
+  * The template parameters \a BlockRows and \a BlockCols are the number of
+  * rows and columns in the block.
+  *
+  * \param startRow the first row in the block
+  * \param startCol the first column in the block
+  *
+  * Example: \include MatrixBase_block_int_int.cpp
+  * Output: \verbinclude MatrixBase_block_int_int.out
+  *
+  * \note since block is a templated member, the keyword template has to be used
+  * if the matrix type is also a template parameter: \code m.template block<3,3>(1,1); \endcode
+  *
+  * \sa class Block, block(Index,Index,Index,Index)
+  */
+template<int BlockRows, int BlockCols>
+inline Block<Derived, BlockRows, BlockCols> block(Index startRow, Index startCol)
+{
+  return Block<Derived, BlockRows, BlockCols>(derived(), startRow, startCol);
+}
+
+/** This is the const version of block<>(Index, Index). */
+template<int BlockRows, int BlockCols>
+inline const Block<const Derived, BlockRows, BlockCols> block(Index startRow, Index startCol) const
+{
+  return Block<const Derived, BlockRows, BlockCols>(derived(), startRow, startCol);
+}
+
+/** \returns an expression of the \a i-th column of *this. Note that the numbering starts at 0.
+  *
+  * Example: \include MatrixBase_col.cpp
+  * Output: \verbinclude MatrixBase_col.out
+  *
+  * \sa row(), class Block */
+inline ColXpr col(Index i)
+{
+  return ColXpr(derived(), i);
+}
+
+/** This is the const version of col(). */
+inline ConstColXpr col(Index i) const
+{
+  return ConstColXpr(derived(), i);
+}
+
+/** \returns an expression of the \a i-th row of *this. Note that the numbering starts at 0.
+  *
+  * Example: \include MatrixBase_row.cpp
+  * Output: \verbinclude MatrixBase_row.out
+  *
+  * \sa col(), class Block */
+inline RowXpr row(Index i)
+{
+  return RowXpr(derived(), i);
+}
+
+/** This is the const version of row(). */
+inline ConstRowXpr row(Index i) const
+{
+  return ConstRowXpr(derived(), i);
+}
+
+/** \returns a dynamic-size expression of a segment (i.e. a vector block) in *this.
+  *
+  * \only_for_vectors
+  *
+  * \param start the first coefficient in the segment
+  * \param vecSize the number of coefficients in the segment
+  *
+  * Example: \include MatrixBase_segment_int_int.cpp
+  * Output: \verbinclude MatrixBase_segment_int_int.out
+  *
+  * \note Even though the returned expression has dynamic size, in the case
+  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
+  * which means that evaluating it does not cause a dynamic memory allocation.
+  *
+  * \sa class Block, segment(Index)
+  */
+inline SegmentReturnType segment(Index start, Index vecSize)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return SegmentReturnType(derived(), start, vecSize);
+}
+
+
+/** This is the const version of segment(Index,Index).*/
+inline ConstSegmentReturnType segment(Index start, Index vecSize) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return ConstSegmentReturnType(derived(), start, vecSize);
+}
+
+/** \returns a dynamic-size expression of the first coefficients of *this.
+  *
+  * \only_for_vectors
+  *
+  * \param vecSize the number of coefficients in the block
+  *
+  * Example: \include MatrixBase_start_int.cpp
+  * Output: \verbinclude MatrixBase_start_int.out
+  *
+  * \note Even though the returned expression has dynamic size, in the case
+  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
+  * which means that evaluating it does not cause a dynamic memory allocation.
+  *
+  * \sa class Block, block(Index,Index)
+  */
+inline SegmentReturnType head(Index vecSize)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return SegmentReturnType(derived(), 0, vecSize);
+}
+
+/** This is the const version of head(Index).*/
+inline ConstSegmentReturnType
+  head(Index vecSize) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return ConstSegmentReturnType(derived(), 0, vecSize);
+}
+
+/** \returns a dynamic-size expression of the last coefficients of *this.
+  *
+  * \only_for_vectors
+  *
+  * \param vecSize the number of coefficients in the block
+  *
+  * Example: \include MatrixBase_end_int.cpp
+  * Output: \verbinclude MatrixBase_end_int.out
+  *
+  * \note Even though the returned expression has dynamic size, in the case
+  * when it is applied to a fixed-size vector, it inherits a fixed maximal size,
+  * which means that evaluating it does not cause a dynamic memory allocation.
+  *
+  * \sa class Block, block(Index,Index)
+  */
+inline SegmentReturnType tail(Index vecSize)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return SegmentReturnType(derived(), this->size() - vecSize, vecSize);
+}
+
+/** This is the const version of tail(Index).*/
+inline ConstSegmentReturnType tail(Index vecSize) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return ConstSegmentReturnType(derived(), this->size() - vecSize, vecSize);
+}
+
+/** \returns a fixed-size expression of a segment (i.e. a vector block) in \c *this
+  *
+  * \only_for_vectors
+  *
+  * The template parameter \a Size is the number of coefficients in the block
+  *
+  * \param start the index of the first element of the sub-vector
+  *
+  * Example: \include MatrixBase_template_int_segment.cpp
+  * Output: \verbinclude MatrixBase_template_int_segment.out
+  *
+  * \sa class Block
+  */
+template<int Size>
+inline typename FixedSegmentReturnType<Size>::Type segment(Index start)
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename FixedSegmentReturnType<Size>::Type(derived(), start);
+}
+
+/** This is the const version of segment<int>(Index).*/
+template<int Size>
+inline typename ConstFixedSegmentReturnType<Size>::Type segment(Index start) const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), start);
+}
+
+/** \returns a fixed-size expression of the first coefficients of *this.
+  *
+  * \only_for_vectors
+  *
+  * The template parameter \a Size is the number of coefficients in the block
+  *
+  * Example: \include MatrixBase_template_int_start.cpp
+  * Output: \verbinclude MatrixBase_template_int_start.out
+  *
+  * \sa class Block
+  */
+template<int Size>
+inline typename FixedSegmentReturnType<Size>::Type head()
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename FixedSegmentReturnType<Size>::Type(derived(), 0);
+}
+
+/** This is the const version of head<int>().*/
+template<int Size>
+inline typename ConstFixedSegmentReturnType<Size>::Type head() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), 0);
+}
+
+/** \returns a fixed-size expression of the last coefficients of *this.
+  *
+  * \only_for_vectors
+  *
+  * The template parameter \a Size is the number of coefficients in the block
+  *
+  * Example: \include MatrixBase_template_int_end.cpp
+  * Output: \verbinclude MatrixBase_template_int_end.out
+  *
+  * \sa class Block
+  */
+template<int Size>
+inline typename FixedSegmentReturnType<Size>::Type tail()
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename FixedSegmentReturnType<Size>::Type(derived(), size() - Size);
+}
+
+/** This is the const version of tail<int>.*/
+template<int Size>
+inline typename ConstFixedSegmentReturnType<Size>::Type tail() const
+{
+  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived)
+  return typename ConstFixedSegmentReturnType<Size>::Type(derived(), size() - Size);
+}
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/CMakeLists.txt b/vendor/eigen-3.1.91/Eigen/src/plugins/CMakeLists.txt
new file mode 100644
index 0000000..1a1d3ff
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/CMakeLists.txt
@@ -0,0 +1,6 @@
+FILE(GLOB Eigen_plugins_SRCS "*.h")
+
+INSTALL(FILES
+  ${Eigen_plugins_SRCS}
+  DESTINATION ${INCLUDE_INSTALL_DIR}/Eigen/src/plugins COMPONENT Devel
+  )
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseBinaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseBinaryOps.h
new file mode 100644
index 0000000..688d224
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseBinaryOps.h
@@ -0,0 +1,46 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This file is a base class plugin containing common coefficient wise functions.
+
+/** \returns an expression of the difference of \c *this and \a other
+  *
+  * \note If you want to substract a given scalar from all coefficients, see Cwise::operator-().
+  *
+  * \sa class CwiseBinaryOp, operator-=()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator-,internal::scalar_difference_op)
+
+/** \returns an expression of the sum of \c *this and \a other
+  *
+  * \note If you want to add a given scalar to all coefficients, see Cwise::operator+().
+  *
+  * \sa class CwiseBinaryOp, operator+=()
+  */
+EIGEN_MAKE_CWISE_BINARY_OP(operator+,internal::scalar_sum_op)
+
+/** \returns an expression of a custom coefficient-wise operator \a func of *this and \a other
+  *
+  * The template parameter \a CustomBinaryOp is the type of the functor
+  * of the custom operator (see class CwiseBinaryOp for an example)
+  *
+  * Here is an example illustrating the use of custom functors:
+  * \include class_CwiseBinaryOp.cpp
+  * Output: \verbinclude class_CwiseBinaryOp.out
+  *
+  * \sa class CwiseBinaryOp, operator+(), operator-(), cwiseProduct()
+  */
+template<typename CustomBinaryOp, typename OtherDerived>
+EIGEN_STRONG_INLINE const CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>
+binaryExpr(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other, const CustomBinaryOp& func = CustomBinaryOp()) const
+{
+  return CwiseBinaryOp<CustomBinaryOp, const Derived, const OtherDerived>(derived(), other.derived(), func);
+}
+
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseUnaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseUnaryOps.h
new file mode 100644
index 0000000..08e931a
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/CommonCwiseUnaryOps.h
@@ -0,0 +1,172 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This file is a base class plugin containing common coefficient wise functions.
+
+#ifndef EIGEN_PARSED_BY_DOXYGEN
+
+/** \internal Represents a scalar multiple of an expression */
+typedef CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived> ScalarMultipleReturnType;
+/** \internal Represents a quotient of an expression by a scalar*/
+typedef CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived> ScalarQuotient1ReturnType;
+/** \internal the return type of conjugate() */
+typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+                    const CwiseUnaryOp<internal::scalar_conjugate_op<Scalar>, const Derived>,
+                    const Derived&
+                  >::type ConjugateReturnType;
+/** \internal the return type of real() const */
+typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+                    const CwiseUnaryOp<internal::scalar_real_op<Scalar>, const Derived>,
+                    const Derived&
+                  >::type RealReturnType;
+/** \internal the return type of real() */
+typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
+                    CwiseUnaryView<internal::scalar_real_ref_op<Scalar>, Derived>,
+                    Derived&
+                  >::type NonConstRealReturnType;
+/** \internal the return type of imag() const */
+typedef CwiseUnaryOp<internal::scalar_imag_op<Scalar>, const Derived> ImagReturnType;
+/** \internal the return type of imag() */
+typedef CwiseUnaryView<internal::scalar_imag_ref_op<Scalar>, Derived> NonConstImagReturnType;
+
+#endif // not EIGEN_PARSED_BY_DOXYGEN
+
+/** \returns an expression of the opposite of \c *this
+  */
+inline const CwiseUnaryOp<internal::scalar_opposite_op<typename internal::traits<Derived>::Scalar>, const Derived>
+operator-() const { return derived(); }
+
+
+/** \returns an expression of \c *this scaled by the scalar factor \a scalar */
+inline const ScalarMultipleReturnType
+operator*(const Scalar& scalar) const
+{
+  return CwiseUnaryOp<internal::scalar_multiple_op<Scalar>, const Derived>
+    (derived(), internal::scalar_multiple_op<Scalar>(scalar));
+}
+
+#ifdef EIGEN_PARSED_BY_DOXYGEN
+const ScalarMultipleReturnType operator*(const RealScalar& scalar) const;
+#endif
+
+/** \returns an expression of \c *this divided by the scalar value \a scalar */
+inline const CwiseUnaryOp<internal::scalar_quotient1_op<typename internal::traits<Derived>::Scalar>, const Derived>
+operator/(const Scalar& scalar) const
+{
+  return CwiseUnaryOp<internal::scalar_quotient1_op<Scalar>, const Derived>
+    (derived(), internal::scalar_quotient1_op<Scalar>(scalar));
+}
+
+/** Overloaded for efficient real matrix times complex scalar value */
+inline const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
+operator*(const std::complex<Scalar>& scalar) const
+{
+  return CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
+    (*static_cast<const Derived*>(this), internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >(scalar));
+}
+
+inline friend const ScalarMultipleReturnType
+operator*(const Scalar& scalar, const StorageBaseType& matrix)
+{ return matrix*scalar; }
+
+inline friend const CwiseUnaryOp<internal::scalar_multiple2_op<Scalar,std::complex<Scalar> >, const Derived>
+operator*(const std::complex<Scalar>& scalar, const StorageBaseType& matrix)
+{ return matrix*scalar; }
+
+/** \returns an expression of *this with the \a Scalar type casted to
+  * \a NewScalar.
+  *
+  * The template parameter \a NewScalar is the type we are casting the scalars to.
+  *
+  * \sa class CwiseUnaryOp
+  */
+template<typename NewType>
+typename internal::cast_return_type<Derived,const CwiseUnaryOp<internal::scalar_cast_op<typename internal::traits<Derived>::Scalar, NewType>, const Derived> >::type
+cast() const
+{
+  return derived();
+}
+
+/** \returns an expression of the complex conjugate of \c *this.
+  *
+  * \sa adjoint() */
+inline ConjugateReturnType
+conjugate() const
+{
+  return ConjugateReturnType(derived());
+}
+
+/** \returns a read-only expression of the real part of \c *this.
+  *
+  * \sa imag() */
+inline RealReturnType
+real() const { return derived(); }
+
+/** \returns an read-only expression of the imaginary part of \c *this.
+  *
+  * \sa real() */
+inline const ImagReturnType
+imag() const { return derived(); }
+
+/** \brief Apply a unary operator coefficient-wise
+  * \param[in]  func  Functor implementing the unary operator
+  * \tparam  CustomUnaryOp Type of \a func  
+  * \returns An expression of a custom coefficient-wise unary operator \a func of *this
+  *
+  * The function \c ptr_fun() from the C++ standard library can be used to make functors out of normal functions.
+  *
+  * Example:
+  * \include class_CwiseUnaryOp_ptrfun.cpp
+  * Output: \verbinclude class_CwiseUnaryOp_ptrfun.out
+  *
+  * Genuine functors allow for more possibilities, for instance it may contain a state.
+  *
+  * Example:
+  * \include class_CwiseUnaryOp.cpp
+  * Output: \verbinclude class_CwiseUnaryOp.out
+  *
+  * \sa class CwiseUnaryOp, class CwiseBinaryOp
+  */
+template<typename CustomUnaryOp>
+inline const CwiseUnaryOp<CustomUnaryOp, const Derived>
+unaryExpr(const CustomUnaryOp& func = CustomUnaryOp()) const
+{
+  return CwiseUnaryOp<CustomUnaryOp, const Derived>(derived(), func);
+}
+
+/** \returns an expression of a custom coefficient-wise unary operator \a func of *this
+  *
+  * The template parameter \a CustomUnaryOp is the type of the functor
+  * of the custom unary operator.
+  *
+  * Example:
+  * \include class_CwiseUnaryOp.cpp
+  * Output: \verbinclude class_CwiseUnaryOp.out
+  *
+  * \sa class CwiseUnaryOp, class CwiseBinaryOp
+  */
+template<typename CustomViewOp>
+inline const CwiseUnaryView<CustomViewOp, const Derived>
+unaryViewExpr(const CustomViewOp& func = CustomViewOp()) const
+{
+  return CwiseUnaryView<CustomViewOp, const Derived>(derived(), func);
+}
+
+/** \returns a non const expression of the real part of \c *this.
+  *
+  * \sa imag() */
+inline NonConstRealReturnType
+real() { return derived(); }
+
+/** \returns a non const expression of the imaginary part of \c *this.
+  *
+  * \sa real() */
+inline NonConstImagReturnType
+imag() { return derived(); }
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseBinaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseBinaryOps.h
new file mode 100644
index 0000000..3a737df
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseBinaryOps.h
@@ -0,0 +1,126 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This file is a base class plugin containing matrix specifics coefficient wise functions.
+
+/** \returns an expression of the Schur product (coefficient wise product) of *this and \a other
+  *
+  * Example: \include MatrixBase_cwiseProduct.cpp
+  * Output: \verbinclude MatrixBase_cwiseProduct.out
+  *
+  * \sa class CwiseBinaryOp, cwiseAbs2
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)
+cwiseProduct(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return EIGEN_CWISE_PRODUCT_RETURN_TYPE(Derived,OtherDerived)(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise == operator of *this and \a other
+  *
+  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+  * isMuchSmallerThan().
+  *
+  * Example: \include MatrixBase_cwiseEqual.cpp
+  * Output: \verbinclude MatrixBase_cwiseEqual.out
+  *
+  * \sa cwiseNotEqual(), isApprox(), isMuchSmallerThan()
+  */
+template<typename OtherDerived>
+inline const CwiseBinaryOp<std::equal_to<Scalar>, const Derived, const OtherDerived>
+cwiseEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<std::equal_to<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise != operator of *this and \a other
+  *
+  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+  * isMuchSmallerThan().
+  *
+  * Example: \include MatrixBase_cwiseNotEqual.cpp
+  * Output: \verbinclude MatrixBase_cwiseNotEqual.out
+  *
+  * \sa cwiseEqual(), isApprox(), isMuchSmallerThan()
+  */
+template<typename OtherDerived>
+inline const CwiseBinaryOp<std::not_equal_to<Scalar>, const Derived, const OtherDerived>
+cwiseNotEqual(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<std::not_equal_to<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise min of *this and \a other
+  *
+  * Example: \include MatrixBase_cwiseMin.cpp
+  * Output: \verbinclude MatrixBase_cwiseMin.out
+  *
+  * \sa class CwiseBinaryOp, max()
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>
+cwiseMin(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise min of *this and scalar \a other
+  *
+  * \sa class CwiseBinaryOp, min()
+  */
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_min_op<Scalar>, const Derived, const ConstantReturnType>
+cwiseMin(const Scalar &other) const
+{
+  return cwiseMin(Derived::PlainObject::Constant(rows(), cols(), other));
+}
+
+/** \returns an expression of the coefficient-wise max of *this and \a other
+  *
+  * Example: \include MatrixBase_cwiseMax.cpp
+  * Output: \verbinclude MatrixBase_cwiseMax.out
+  *
+  * \sa class CwiseBinaryOp, min()
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>
+cwiseMax(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
+
+/** \returns an expression of the coefficient-wise max of *this and scalar \a other
+  *
+  * \sa class CwiseBinaryOp, min()
+  */
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_max_op<Scalar>, const Derived, const ConstantReturnType>
+cwiseMax(const Scalar &other) const
+{
+  return cwiseMax(Derived::PlainObject::Constant(rows(), cols(), other));
+}
+
+
+/** \returns an expression of the coefficient-wise quotient of *this and \a other
+  *
+  * Example: \include MatrixBase_cwiseQuotient.cpp
+  * Output: \verbinclude MatrixBase_cwiseQuotient.out
+  *
+  * \sa class CwiseBinaryOp, cwiseProduct(), cwiseInverse()
+  */
+template<typename OtherDerived>
+EIGEN_STRONG_INLINE const CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>
+cwiseQuotient(const EIGEN_CURRENT_STORAGE_BASE_CLASS<OtherDerived> &other) const
+{
+  return CwiseBinaryOp<internal::scalar_quotient_op<Scalar>, const Derived, const OtherDerived>(derived(), other.derived());
+}
diff --git a/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseUnaryOps.h b/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseUnaryOps.h
new file mode 100644
index 0000000..0cf0640
--- /dev/null
+++ b/vendor/eigen-3.1.91/Eigen/src/plugins/MatrixCwiseUnaryOps.h
@@ -0,0 +1,67 @@
+// This file is part of Eigen, a lightweight C++ template library
+// for linear algebra.
+//
+// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud at inria.fr>
+// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1 at gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla
+// Public License v. 2.0. If a copy of the MPL was not distributed
+// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+// This file is a base class plugin containing matrix specifics coefficient wise functions.
+
+/** \returns an expression of the coefficient-wise absolute value of \c *this
+  *
+  * Example: \include MatrixBase_cwiseAbs.cpp
+  * Output: \verbinclude MatrixBase_cwiseAbs.out
+  *
+  * \sa cwiseAbs2()
+  */
+EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
+cwiseAbs() const { return derived(); }
+
+/** \returns an expression of the coefficient-wise squared absolute value of \c *this
+  *
+  * Example: \include MatrixBase_cwiseAbs2.cpp
+  * Output: \verbinclude MatrixBase_cwiseAbs2.out
+  *
+  * \sa cwiseAbs()
+  */
+EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>
+cwiseAbs2() const { return derived(); }
+
+/** \returns an expression of the coefficient-wise square root of *this.
+  *
+  * Example: \include MatrixBase_cwiseSqrt.cpp
+  * Output: \verbinclude MatrixBase_cwiseSqrt.out
+  *
+  * \sa cwisePow(), cwiseSquare()
+  */
+inline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
+cwiseSqrt() const { return derived(); }
+
+/** \returns an expression of the coefficient-wise inverse of *this.
+  *
+  * Example: \include MatrixBase_cwiseInverse.cpp
+  * Output: \verbinclude MatrixBase_cwiseInverse.out
+  *
+  * \sa cwiseProduct()
+  */
+inline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
+cwiseInverse() const { return derived(); }
+
+/** \returns an expression of the coefficient-wise == operator of \c *this and a scalar \a s
+  *
+  * \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
+  * In order to check for equality between two vectors or matrices with floating-point coefficients, it is
+  * generally a far better idea to use a fuzzy comparison as provided by isApprox() and
+  * isMuchSmallerThan().
+  *
+  * \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
+  */
+inline const CwiseUnaryOp<std::binder1st<std::equal_to<Scalar> >, const Derived>
+cwiseEqual(const Scalar& s) const
+{
+  return CwiseUnaryOp<std::binder1st<std::equal_to<Scalar> >,const Derived>
+          (derived(), std::bind1st(std::equal_to<Scalar>(), s));
+}
diff --git a/vendor/gtest-1.7.0/CHANGES b/vendor/gtest-1.7.0/CHANGES
new file mode 100644
index 0000000..0552132
--- /dev/null
+++ b/vendor/gtest-1.7.0/CHANGES
@@ -0,0 +1,157 @@
+Changes for 1.7.0:
+
+* New feature: death tests are supported on OpenBSD and in iOS
+  simulator now.
+* New feature: Google Test now implements a protocol to allow
+  a test runner to detect that a test program has exited
+  prematurely and report it as a failure (before it would be
+  falsely reported as a success if the exit code is 0).
+* New feature: Test::RecordProperty() can now be used outside of the
+  lifespan of a test method, in which case it will be attributed to
+  the current test case or the test program in the XML report.
+* New feature (potentially breaking): --gtest_list_tests now prints
+  the type parameters and value parameters for each test.
+* Improvement: char pointers and char arrays are now escaped properly
+  in failure messages.
+* Improvement: failure summary in XML reports now includes file and
+  line information.
+* Improvement: the <testsuites> XML element now has a timestamp attribute.
+* Improvement: When --gtest_filter is specified, XML report now doesn't
+  contain information about tests that are filtered out.
+* Fixed the bug where long --gtest_filter flag values are truncated in
+  death tests.
+* Potentially breaking change: RUN_ALL_TESTS() is now implemented as a
+  function instead of a macro in order to work better with Clang.
+* Compatibility fixes with C++ 11 and various platforms.
+* Bug/warning fixes.
+
+Changes for 1.6.0:
+
+* New feature: ADD_FAILURE_AT() for reporting a test failure at the
+  given source location -- useful for writing testing utilities.
+* New feature: the universal value printer is moved from Google Mock
+  to Google Test.
+* New feature: type parameters and value parameters are reported in
+  the XML report now.
+* A gtest_disable_pthreads CMake option.
+* Colored output works in GNU Screen sessions now.
+* Parameters of value-parameterized tests are now printed in the
+  textual output.
+* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are
+  now correctly reported.
+* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to
+  ostream.
+* More complete handling of exceptions.
+* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter
+  name is already used by another library.
+* --gtest_catch_exceptions is now true by default, allowing a test
+  program to continue after an exception is thrown.
+* Value-parameterized test fixtures can now derive from Test and
+  WithParamInterface<T> separately, easing conversion of legacy tests.
+* Death test messages are clearly marked to make them more
+  distinguishable from other messages.
+* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,
+  PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),
+  IBM XL C++ (Visual Age C++), and C++0x.
+* Bug fixes and implementation clean-ups.
+* Potentially incompatible changes: disables the harmful 'make install'
+  command in autotools.
+
+Changes for 1.5.0:
+
+ * New feature: assertions can be safely called in multiple threads
+   where the pthreads library is available.
+ * New feature: predicates used inside EXPECT_TRUE() and friends
+   can now generate custom failure messages.
+ * New feature: Google Test can now be compiled as a DLL.
+ * New feature: fused source files are included.
+ * New feature: prints help when encountering unrecognized Google Test flags.
+ * Experimental feature: CMake build script (requires CMake 2.6.4+).
+ * Experimental feature: the Pump script for meta programming.
+ * double values streamed to an assertion are printed with enough precision
+   to differentiate any two different values.
+ * Google Test now works on Solaris and AIX.
+ * Build and test script improvements.
+ * Bug fixes and implementation clean-ups.
+
+ Potentially breaking changes:
+
+ * Stopped supporting VC++ 7.1 with exceptions disabled.
+ * Dropped support for 'make install'.
+
+Changes for 1.4.0:
+
+ * New feature: the event listener API
+ * New feature: test shuffling
+ * New feature: the XML report format is closer to junitreport and can
+   be parsed by Hudson now.
+ * New feature: when a test runs under Visual Studio, its failures are
+   integrated in the IDE.
+ * New feature: /MD(d) versions of VC++ projects.
+ * New feature: elapsed time for the tests is printed by default.
+ * New feature: comes with a TR1 tuple implementation such that Boost
+   is no longer needed for Combine().
+ * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
+ * New feature: the Xcode project can now produce static gtest
+   libraries in addition to a framework.
+ * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
+   Symbian, gcc, and C++Builder.
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.3.0:
+
+ * New feature: death tests on Windows, Cygwin, and Mac.
+ * New feature: ability to use Google Test assertions in other testing
+   frameworks.
+ * New feature: ability to run disabled test via
+   --gtest_also_run_disabled_tests.
+ * New feature: the --help flag for printing the usage.
+ * New feature: access to Google Test flag values in user code.
+ * New feature: a script that packs Google Test into one .h and one
+   .cc file for easy deployment.
+ * New feature: support for distributing test functions to multiple
+   machines (requires support from the test runner).
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.2.1:
+
+ * Compatibility fixes for Linux IA-64 and IBM z/OS.
+ * Added support for using Boost and other TR1 implementations.
+ * Changes to the build scripts to support upcoming release of Google C++
+   Mocking Framework.
+ * Added Makefile to the distribution package.
+ * Improved build instructions in README.
+
+Changes for 1.2.0:
+
+ * New feature: value-parameterized tests.
+ * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
+   macros.
+ * Changed the XML report format to match JUnit/Ant's.
+ * Added tests to the Xcode project.
+ * Added scons/SConscript for building with SCons.
+ * Added src/gtest-all.cc for building Google Test from a single file.
+ * Fixed compatibility with Solaris and z/OS.
+ * Enabled running Python tests on systems with python 2.3 installed,
+   e.g. Mac OS X 10.4.
+ * Bug fixes.
+
+Changes for 1.1.0:
+
+ * New feature: type-parameterized tests.
+ * New feature: exception assertions.
+ * New feature: printing elapsed time of tests.
+ * Improved the robustness of death tests.
+ * Added an Xcode project and samples.
+ * Adjusted the output format on Windows to be understandable by Visual Studio.
+ * Minor bug fixes.
+
+Changes for 1.0.1:
+
+ * Added project files for Visual Studio 7.1.
+ * Fixed issues with compiling on Mac OS X.
+ * Fixed issues with compiling on Cygwin.
+
+Changes for 1.0.0:
+
+ * Initial Open Source release of Google Test
diff --git a/vendor/gtest-1.7.0/CMakeLists.txt b/vendor/gtest-1.7.0/CMakeLists.txt
new file mode 100644
index 0000000..57470c8
--- /dev/null
+++ b/vendor/gtest-1.7.0/CMakeLists.txt
@@ -0,0 +1,252 @@
+########################################################################
+# CMake build script for Google Test.
+#
+# To run the tests for Google Test itself on Linux, use 'make test' or
+# ctest.  You can select which tests to run using 'ctest -R regex'.
+# For more options, run 'ctest --help'.
+
+# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
+# make it prominent in the GUI.
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
+
+# When other libraries are using a shared version of runtime libraries,
+# Google Test also has to use one.
+option(
+  gtest_force_shared_crt
+  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
+  OFF)
+
+option(gtest_build_tests "Build all of gtest's own tests." OFF)
+
+option(gtest_build_samples "Build gtest's sample programs." OFF)
+
+option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
+
+# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
+include(cmake/hermetic_build.cmake OPTIONAL)
+
+if (COMMAND pre_project_set_up_hermetic_build)
+  pre_project_set_up_hermetic_build()
+endif()
+
+########################################################################
+#
+# Project-wide settings
+
+# Name of the project.
+#
+# CMake files in this project can refer to the root source directory
+# as ${gtest_SOURCE_DIR} and to the root binary directory as
+# ${gtest_BINARY_DIR}.
+# Language "C" is required for find_package(Threads).
+project(gtest CXX C)
+cmake_minimum_required(VERSION 2.6.2)
+
+if (COMMAND set_up_hermetic_build)
+  set_up_hermetic_build()
+endif()
+
+# Define helper functions and macros used by Google Test.
+include(cmake/internal_utils.cmake)
+
+config_compiler_and_linker()  # Defined in internal_utils.cmake.
+
+# Where Google Test's .h files can be found.
+include_directories(
+  ${gtest_SOURCE_DIR}/include
+  ${gtest_SOURCE_DIR})
+
+# Where Google Test's libraries can be found.
+link_directories(${gtest_BINARY_DIR}/src)
+
+########################################################################
+#
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+
+# Google Test libraries.  We build them using more strict warnings than what
+# are used for other targets, to ensure that gtest can be compiled by a user
+# aggressive about warnings.
+cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
+cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
+target_link_libraries(gtest_main gtest)
+
+########################################################################
+#
+# Samples on how to link user tests with gtest or gtest_main.
+#
+# They are not built by default.  To build them, set the
+# gtest_build_samples option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_samples=ON flag when running cmake.
+
+if (gtest_build_samples)
+  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
+  cxx_executable(sample3_unittest samples gtest_main)
+  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
+  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample6_unittest samples gtest_main)
+  cxx_executable(sample7_unittest samples gtest_main)
+  cxx_executable(sample8_unittest samples gtest_main)
+  cxx_executable(sample9_unittest samples gtest)
+  cxx_executable(sample10_unittest samples gtest)
+endif()
+
+########################################################################
+#
+# Google Test's own tests.
+#
+# You can skip this section if you aren't interested in testing
+# Google Test itself.
+#
+# The tests are not built by default.  To build them, set the
+# gtest_build_tests option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_tests=ON flag when running cmake.
+
+if (gtest_build_tests)
+  # This must be set in the root directory for the tests to be run by
+  # 'make test' or ctest.
+  enable_testing()
+
+  ############################################################
+  # C++ tests built with standard compiler flags.
+
+  cxx_test(gtest-death-test_test gtest_main)
+  cxx_test(gtest_environment_test gtest)
+  cxx_test(gtest-filepath_test gtest_main)
+  cxx_test(gtest-linked_ptr_test gtest_main)
+  cxx_test(gtest-listener_test gtest_main)
+  cxx_test(gtest_main_unittest gtest_main)
+  cxx_test(gtest-message_test gtest_main)
+  cxx_test(gtest_no_test_unittest gtest)
+  cxx_test(gtest-options_test gtest_main)
+  cxx_test(gtest-param-test_test gtest
+    test/gtest-param-test2_test.cc)
+  cxx_test(gtest-port_test gtest_main)
+  cxx_test(gtest_pred_impl_unittest gtest_main)
+  cxx_test(gtest_premature_exit_test gtest
+    test/gtest_premature_exit_test.cc)
+  cxx_test(gtest-printers_test gtest_main)
+  cxx_test(gtest_prod_test gtest_main
+    test/production.cc)
+  cxx_test(gtest_repeat_test gtest)
+  cxx_test(gtest_sole_header_test gtest_main)
+  cxx_test(gtest_stress_test gtest)
+  cxx_test(gtest-test-part_test gtest_main)
+  cxx_test(gtest_throw_on_failure_ex_test gtest)
+  cxx_test(gtest-typed-test_test gtest_main
+    test/gtest-typed-test2_test.cc)
+  cxx_test(gtest_unittest gtest_main)
+  cxx_test(gtest-unittest-api_test gtest)
+
+  ############################################################
+  # C++ tests built with non-standard compiler flags.
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_library(gtest_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc)
+    cxx_library(gtest_main_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc src/gtest_main.cc)
+  endif()
+  cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_test_with_flags(gtest-death-test_ex_nocatch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
+    gtest test/gtest-death-test_ex_test.cc)
+  cxx_test_with_flags(gtest-death-test_ex_catch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
+    gtest test/gtest-death-test_ex_test.cc)
+
+  cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
+    gtest_main_no_rtti test/gtest_unittest.cc)
+
+  cxx_shared_library(gtest_dll "${cxx_default}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
+    gtest_dll test/gtest_all_test.cc)
+  set_target_properties(gtest_dll_test_
+                        PROPERTIES
+                        COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+
+  if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
+    # The C++ Standard specifies tuple_element<int, class>.
+    # Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
+    # That declaration conflicts with our own standard-conforming
+    # tuple implementation.  Therefore using our own tuple with
+    # MSVC 10 doesn't compile.
+    cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
+      src/gtest-all.cc src/gtest_main.cc)
+
+    cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple test/gtest-tuple_test.cc)
+
+    cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple
+      test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
+  endif()
+
+  ############################################################
+  # Python tests.
+
+  cxx_executable(gtest_break_on_failure_unittest_ test gtest)
+  py_test(gtest_break_on_failure_unittest)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable_with_flags(
+      gtest_catch_exceptions_no_ex_test_
+      "${cxx_no_exception}"
+      gtest_main_no_exception
+      test/gtest_catch_exceptions_test_.cc)
+  endif()
+
+  cxx_executable_with_flags(
+    gtest_catch_exceptions_ex_test_
+    "${cxx_exception}"
+    gtest_main
+    test/gtest_catch_exceptions_test_.cc)
+  py_test(gtest_catch_exceptions_test)
+
+  cxx_executable(gtest_color_test_ test gtest)
+  py_test(gtest_color_test)
+
+  cxx_executable(gtest_env_var_test_ test gtest)
+  py_test(gtest_env_var_test)
+
+  cxx_executable(gtest_filter_unittest_ test gtest)
+  py_test(gtest_filter_unittest)
+
+  cxx_executable(gtest_help_test_ test gtest_main)
+  py_test(gtest_help_test)
+
+  cxx_executable(gtest_list_tests_unittest_ test gtest)
+  py_test(gtest_list_tests_unittest)
+
+  cxx_executable(gtest_output_test_ test gtest)
+  py_test(gtest_output_test)
+
+  cxx_executable(gtest_shuffle_test_ test gtest)
+  py_test(gtest_shuffle_test)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
+    set_target_properties(gtest_throw_on_failure_test_
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_no_exception}")
+    py_test(gtest_throw_on_failure_test)
+  endif()
+
+  cxx_executable(gtest_uninitialized_test_ test gtest)
+  py_test(gtest_uninitialized_test)
+
+  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
+  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
+  py_test(gtest_xml_outfiles_test)
+
+  cxx_executable(gtest_xml_output_unittest_ test gtest)
+  py_test(gtest_xml_output_unittest)
+endif()
diff --git a/vendor/gtest-1.7.0/CONTRIBUTORS b/vendor/gtest-1.7.0/CONTRIBUTORS
new file mode 100644
index 0000000..feae2fc
--- /dev/null
+++ b/vendor/gtest-1.7.0/CONTRIBUTORS
@@ -0,0 +1,37 @@
+# This file contains a list of people who've made non-trivial
+# contribution to the Google C++ Testing Framework project.  People
+# who commit code to the project are encouraged to add their names
+# here.  Please keep the list sorted by first names.
+
+Ajay Joshi <jaj at google.com>
+Balázs Dán <balazs.dan at gmail.com>
+Bharat Mediratta <bharat at menalto.com>
+Chandler Carruth <chandlerc at google.com>
+Chris Prince <cprince at google.com>
+Chris Taylor <taylorc at google.com>
+Dan Egnor <egnor at google.com>
+Eric Roman <eroman at chromium.org>
+Hady Zalek <hady.zalek at gmail.com>
+Jeffrey Yasskin <jyasskin at google.com>
+Jói Sigurðsson <joi at google.com>
+Keir Mierle <mierle at gmail.com>
+Keith Ray <keith.ray at gmail.com>
+Kenton Varda <kenton at google.com>
+Manuel Klimek <klimek at google.com>
+Markus Heule <markus.heule at gmail.com>
+Mika Raento <mikie at iki.fi>
+Miklós Fazekas <mfazekas at szemafor.com>
+Pasi Valminen <pasi.valminen at gmail.com>
+Patrick Hanna <phanna at google.com>
+Patrick Riley <pfr at google.com>
+Peter Kaminski <piotrk at google.com>
+Preston Jackson <preston.a.jackson at gmail.com>
+Rainer Klaffenboeck <rainer.klaffenboeck at dynatrace.com>
+Russ Cox <rsc at google.com>
+Russ Rufer <russ at pentad.com>
+Sean Mcafee <eefacm at gmail.com>
+Sigurður Ásgeirsson <siggi at google.com>
+Tracy Bialik <tracy at pentad.com>
+Vadim Berman <vadimb at google.com>
+Vlad Losev <vladl at google.com>
+Zhanyong Wan <wan at google.com>
diff --git a/vendor/gtest-1.7.0/LICENSE b/vendor/gtest-1.7.0/LICENSE
new file mode 100644
index 0000000..1941a11
--- /dev/null
+++ b/vendor/gtest-1.7.0/LICENSE
@@ -0,0 +1,28 @@
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/gtest-1.7.0/README b/vendor/gtest-1.7.0/README
new file mode 100644
index 0000000..26f35a8
--- /dev/null
+++ b/vendor/gtest-1.7.0/README
@@ -0,0 +1,435 @@
+Google C++ Testing Framework
+============================
+
+http://code.google.com/p/googletest/
+
+Overview
+--------
+
+Google's framework for writing C++ tests on a variety of platforms
+(Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the
+xUnit architecture.  Supports automatic test discovery, a rich set of
+assertions, user-defined assertions, death tests, fatal and non-fatal
+failures, various options for running the tests, and XML test report
+generation.
+
+Please see the project page above for more information as well as the
+mailing list for questions, discussions, and development.  There is
+also an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please
+join us!
+
+Requirements for End Users
+--------------------------
+
+Google Test is designed to have fairly minimal requirements to build
+and use with your projects, but there are some.  Currently, we support
+Linux, Windows, Mac OS X, and Cygwin.  We will also make our best
+effort to support other platforms (e.g. Solaris, AIX, and z/OS).
+However, since core members of the Google Test project have no access
+to these platforms, Google Test may have outstanding issues there.  If
+you notice any problems on your platform, please notify
+googletestframework at googlegroups.com.  Patches for fixing them are
+even more welcome!
+
+### Linux Requirements ###
+
+These are the base requirements to build and use Google Test from a source
+package (as described below):
+  * GNU-compatible Make or gmake
+  * POSIX-standard shell
+  * POSIX(-2) Regular Expressions (regex.h)
+  * A C++98-standard-compliant compiler
+
+### Windows Requirements ###
+
+  * Microsoft Visual C++ 7.1 or newer
+
+### Cygwin Requirements ###
+
+  * Cygwin 1.5.25-14 or newer
+
+### Mac OS X Requirements ###
+
+  * Mac OS X 10.4 Tiger or newer
+  * Developer Tools Installed
+
+Also, you'll need CMake 2.6.4 or higher if you want to build the
+samples using the provided CMake script, regardless of the platform.
+
+Requirements for Contributors
+-----------------------------
+
+We welcome patches.  If you plan to contribute a patch, you need to
+build Google Test and its own tests from an SVN checkout (described
+below), which has further requirements:
+
+  * Python version 2.3 or newer (for running some of the tests and
+    re-generating certain source files from templates)
+  * CMake 2.6.4 or newer
+
+Getting the Source
+------------------
+
+There are two primary ways of getting Google Test's source code: you
+can download a stable source release in your preferred archive format,
+or directly check out the source from our Subversion (SVN) repositary.
+The SVN checkout requires a few extra steps and some extra software
+packages on your system, but lets you track the latest development and
+make patches much more easily, so we highly encourage it.
+
+### Source Package ###
+
+Google Test is released in versioned source packages which can be
+downloaded from the download page [1].  Several different archive
+formats are provided, but the only difference is the tools used to
+manipulate them, and the size of the resulting file.  Download
+whichever you are most comfortable with.
+
+  [1] http://code.google.com/p/googletest/downloads/list
+
+Once the package is downloaded, expand it using whichever tools you
+prefer for that type.  This will result in a new directory with the
+name "gtest-X.Y.Z" which contains all of the source code.  Here are
+some examples on Linux:
+
+  tar -xvzf gtest-X.Y.Z.tar.gz
+  tar -xvjf gtest-X.Y.Z.tar.bz2
+  unzip gtest-X.Y.Z.zip
+
+### SVN Checkout ###
+
+To check out the main branch (also known as the "trunk") of Google
+Test, run the following Subversion command:
+
+  svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn
+
+Setting up the Build
+--------------------
+
+To build Google Test and your tests that use it, you need to tell your
+build system where to find its headers and source files.  The exact
+way to do it depends on which build system you use, and is usually
+straightforward.
+
+### Generic Build Instructions ###
+
+Suppose you put Google Test in directory ${GTEST_DIR}.  To build it,
+create a library build target (or a project as called by Visual Studio
+and Xcode) to compile
+
+  ${GTEST_DIR}/src/gtest-all.cc
+
+with ${GTEST_DIR}/include in the system header search path and ${GTEST_DIR}
+in the normal header search path.  Assuming a Linux-like system and gcc,
+something like the following will do:
+
+  g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
+      -pthread -c ${GTEST_DIR}/src/gtest-all.cc
+  ar -rv libgtest.a gtest-all.o
+
+(We need -pthread as Google Test uses threads.)
+
+Next, you should compile your test source file with
+${GTEST_DIR}/include in the system header search path, and link it
+with gtest and any other necessary libraries:
+
+  g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \
+      -o your_test
+
+As an example, the make/ directory contains a Makefile that you can
+use to build Google Test on systems where GNU make is available
+(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google
+Test's own tests.  Instead, it just builds the Google Test library and
+a sample test.  You can use it as a starting point for your own build
+script.
+
+If the default settings are correct for your environment, the
+following commands should succeed:
+
+  cd ${GTEST_DIR}/make
+  make
+  ./sample1_unittest
+
+If you see errors, try to tweak the contents of make/Makefile to make
+them go away.  There are instructions in make/Makefile on how to do
+it.
+
+### Using CMake ###
+
+Google Test comes with a CMake build script (CMakeLists.txt) that can
+be used on a wide range of platforms ("C" stands for cross-platofrm.).
+If you don't have CMake installed already, you can download it for
+free from http://www.cmake.org/.
+
+CMake works by generating native makefiles or build projects that can
+be used in the compiler environment of your choice.  The typical
+workflow starts with:
+
+  mkdir mybuild       # Create a directory to hold the build output.
+  cd mybuild
+  cmake ${GTEST_DIR}  # Generate native build scripts.
+
+If you want to build Google Test's samples, you should replace the
+last command with
+
+  cmake -Dgtest_build_samples=ON ${GTEST_DIR}
+
+If you are on a *nix system, you should now see a Makefile in the
+current directory.  Just type 'make' to build gtest.
+
+If you use Windows and have Vistual Studio installed, a gtest.sln file
+and several .vcproj files will be created.  You can then build them
+using Visual Studio.
+
+On Mac OS X with Xcode installed, a .xcodeproj file will be generated.
+
+### Legacy Build Scripts ###
+
+Before settling on CMake, we have been providing hand-maintained build
+projects/scripts for Visual Studio, Xcode, and Autotools.  While we
+continue to provide them for convenience, they are not actively
+maintained any more.  We highly recommend that you follow the
+instructions in the previous two sections to integrate Google Test
+with your existing build system.
+
+If you still need to use the legacy build scripts, here's how:
+
+The msvc\ folder contains two solutions with Visual C++ projects.
+Open the gtest.sln or gtest-md.sln file using Visual Studio, and you
+are ready to build Google Test the same way you build any Visual
+Studio project.  Files that have names ending with -md use DLL
+versions of Microsoft runtime libraries (the /MD or the /MDd compiler
+option).  Files without that suffix use static versions of the runtime
+libraries (the /MT or the /MTd option).  Please note that one must use
+the same option to compile both gtest and the test code.  If you use
+Visual Studio 2005 or above, we recommend the -md version as /MD is
+the default for new projects in these versions of Visual Studio.
+
+On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using
+Xcode.  Build the "gtest" target.  The universal binary framework will
+end up in your selected build directory (selected in the Xcode
+"Preferences..." -> "Building" pane and defaults to xcode/build).
+Alternatively, at the command line, enter:
+
+  xcodebuild
+
+This will build the "Release" configuration of gtest.framework in your
+default build location.  See the "xcodebuild" man page for more
+information about building different configurations and building in
+different locations.
+
+If you wish to use the Google Test Xcode project with Xcode 4.x and
+above, you need to either:
+ * update the SDK configuration options in xcode/Config/General.xconfig.
+   Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If
+   you choose this route you lose the ability to target earlier versions
+   of MacOS X.
+ * Install an SDK for an earlier version. This doesn't appear to be
+   supported by Apple, but has been reported to work
+   (http://stackoverflow.com/questions/5378518).
+
+Tweaking Google Test
+--------------------
+
+Google Test can be used in diverse environments.  The default
+configuration may not work (or may not work well) out of the box in
+some environments.  However, you can easily tweak Google Test by
+defining control macros on the compiler command line.  Generally,
+these macros are named like GTEST_XYZ and you define them to either 1
+or 0 to enable or disable a certain feature.
+
+We list the most frequently used macros below.  For a complete list,
+see file include/gtest/internal/gtest-port.h.
+
+### Choosing a TR1 Tuple Library ###
+
+Some Google Test features require the C++ Technical Report 1 (TR1)
+tuple library, which is not yet available with all compilers.  The
+good news is that Google Test implements a subset of TR1 tuple that's
+enough for its own need, and will automatically use this when the
+compiler doesn't provide TR1 tuple.
+
+Usually you don't need to care about which tuple library Google Test
+uses.  However, if your project already uses TR1 tuple, you need to
+tell Google Test to use the same TR1 tuple library the rest of your
+project uses, or the two tuple implementations will clash.  To do
+that, add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=0
+
+to the compiler flags while compiling Google Test and your tests.  If
+you want to force Google Test to use its own tuple library, just add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=1
+
+to the compiler flags instead.
+
+If you don't want Google Test to use tuple at all, add
+
+  -DGTEST_HAS_TR1_TUPLE=0
+
+and all features using tuple will be disabled.
+
+### Multi-threaded Tests ###
+
+Google Test is thread-safe where the pthread library is available.
+After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE
+macro to see whether this is the case (yes if the macro is #defined to
+1, no if it's undefined.).
+
+If Google Test doesn't correctly detect whether pthread is available
+in your environment, you can force it with
+
+  -DGTEST_HAS_PTHREAD=1
+
+or
+
+  -DGTEST_HAS_PTHREAD=0
+
+When Google Test uses pthread, you may need to add flags to your
+compiler and/or linker to select the pthread library, or you'll get
+link errors.  If you use the CMake script or the deprecated Autotools
+script, this is taken care of for you.  If you use your own build
+script, you'll need to read your compiler and linker's manual to
+figure out what flags to add.
+
+### As a Shared Library (DLL) ###
+
+Google Test is compact, so most users can build and link it as a
+static library for the simplicity.  You can choose to use Google Test
+as a shared library (known as a DLL on Windows) if you prefer.
+
+To compile *gtest* as a shared library, add
+
+  -DGTEST_CREATE_SHARED_LIBRARY=1
+
+to the compiler flags.  You'll also need to tell the linker to produce
+a shared library instead - consult your linker's manual for how to do
+it.
+
+To compile your *tests* that use the gtest shared library, add
+
+  -DGTEST_LINKED_AS_SHARED_LIBRARY=1
+
+to the compiler flags.
+
+Note: while the above steps aren't technically necessary today when
+using some compilers (e.g. GCC), they may become necessary in the
+future, if we decide to improve the speed of loading the library (see
+http://gcc.gnu.org/wiki/Visibility for details).  Therefore you are
+recommended to always add the above flags when using Google Test as a
+shared library.  Otherwise a future release of Google Test may break
+your build script.
+
+### Avoiding Macro Name Clashes ###
+
+In C++, macros don't obey namespaces.  Therefore two libraries that
+both define a macro of the same name will clash if you #include both
+definitions.  In case a Google Test macro clashes with another
+library, you can force Google Test to rename its macro to avoid the
+conflict.
+
+Specifically, if both Google Test and some other code define macro
+FOO, you can add
+
+  -DGTEST_DONT_DEFINE_FOO=1
+
+to the compiler flags to tell Google Test to change the macro's name
+from FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST.
+For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write
+
+  GTEST_TEST(SomeTest, DoesThis) { ... }
+
+instead of
+
+  TEST(SomeTest, DoesThis) { ... }
+
+in order to define a test.
+
+Upgrating from an Earlier Version
+---------------------------------
+
+We strive to keep Google Test releases backward compatible.
+Sometimes, though, we have to make some breaking changes for the
+users' long-term benefits.  This section describes what you'll need to
+do if you are upgrading from an earlier version of Google Test.
+
+### Upgrading from 1.3.0 or Earlier ###
+
+You may need to explicitly enable or disable Google Test's own TR1
+tuple library.  See the instructions in section "Choosing a TR1 Tuple
+Library".
+
+### Upgrading from 1.4.0 or Earlier ###
+
+The Autotools build script (configure + make) is no longer officially
+supportted.  You are encouraged to migrate to your own build system or
+use CMake.  If you still need to use Autotools, you can find
+instructions in the README file from Google Test 1.4.0.
+
+On platforms where the pthread library is available, Google Test uses
+it in order to be thread-safe.  See the "Multi-threaded Tests" section
+for what this means to your build script.
+
+If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google
+Test will no longer compile.  This should affect very few people, as a
+large portion of STL (including <string>) doesn't compile in this mode
+anyway.  We decided to stop supporting it in order to greatly simplify
+Google Test's implementation.
+
+Developing Google Test
+----------------------
+
+This section discusses how to make your own changes to Google Test.
+
+### Testing Google Test Itself ###
+
+To make sure your changes work as intended and don't break existing
+functionality, you'll want to compile and run Google Test's own tests.
+For that you can use CMake:
+
+  mkdir mybuild
+  cd mybuild
+  cmake -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Make sure you have Python installed, as some of Google Test's tests
+are written in Python.  If the cmake command complains about not being
+able to find Python ("Could NOT find PythonInterp (missing:
+PYTHON_EXECUTABLE)"), try telling it explicitly where your Python
+executable can be found:
+
+  cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Next, you can build Google Test and all of its own tests.  On *nix,
+this is usually done by 'make'.  To run the tests, do
+
+  make test
+
+All tests should pass.
+
+### Regenerating Source Files ###
+
+Some of Google Test's source files are generated from templates (not
+in the C++ sense) using a script.  A template file is named FOO.pump,
+where FOO is the name of the file it will generate.  For example, the
+file include/gtest/internal/gtest-type-util.h.pump is used to generate
+gtest-type-util.h in the same directory.
+
+Normally you don't need to worry about regenerating the source files,
+unless you need to modify them.  In that case, you should modify the
+corresponding .pump files instead and run the pump.py Python script to
+regenerate them.  You can find pump.py in the scripts/ directory.
+Read the Pump manual [2] for how to use it.
+
+  [2] http://code.google.com/p/googletest/wiki/PumpManual
+
+### Contributing a Patch ###
+
+We welcome patches.  Please read the Google Test developer's guide [3]
+for how you can contribute.  In particular, make sure you have signed
+the Contributor License Agreement, or we won't be able to accept the
+patch.
+
+  [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide
+
+Happy testing!
diff --git a/vendor/gtest-1.7.0/aclocal.m4 b/vendor/gtest-1.7.0/aclocal.m4
new file mode 100644
index 0000000..e7df9fe
--- /dev/null
+++ b/vendor/gtest-1.7.0/aclocal.m4
@@ -0,0 +1,1198 @@
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
+# Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.3], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory.  The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run.  This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+#    fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+#    fails if $ac_aux_dir is absolute,
+#    fails when called from a subdirectory in a VPATH build with
+#          a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir.  In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
+#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+#   MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH.  The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL                                            -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 9
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
+	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+if $2; then
+  $1_TRUE=
+  $1_FALSE='#'
+else
+  $1_TRUE='#'
+  $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+  AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009,
+# 2010, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery.  Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
+       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
+       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
+                   [depcc="$$1"   am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+               [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_$1_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+  fi
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_$1_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled.  FIXME.  This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 16
+
+# This macro actually does too much.  Some checks are only needed if
+# your package does certain things.  But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out.  PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition.  After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.62])dnl
+dnl Autoconf wants to disallow AM_ names.  We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+	      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+			     [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+		  [_AM_DEPENDENCIES(CC)],
+		  [define([AC_PROG_CC],
+			  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+		  [_AM_DEPENDENCIES(CXX)],
+		  [define([AC_PROG_CXX],
+			  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated.  The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot.  For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 6
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation,
+# Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software
+# Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# --------------------
+# Set option NAME.  Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009,
+# 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# AM_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages.  To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable.  To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement.  MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+  dnl Find a Python interpreter.  Python versions prior to 2.0 are not
+  dnl supported. (2.0 was released on October 16, 2000).
+  m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 python3.2 python3.1 python3.0 python2.7 dnl
+ python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0])
+
+  AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+  m4_if([$1],[],[
+    dnl No version check is needed.
+    # Find any Python interpreter.
+    if test -z "$PYTHON"; then
+      AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+    fi
+    am_display_PYTHON=python
+  ], [
+    dnl A version check is needed.
+    if test -n "$PYTHON"; then
+      # If the user set $PYTHON, use it and don't search something else.
+      AC_MSG_CHECKING([whether $PYTHON version >= $1])
+      AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+			      [AC_MSG_RESULT(yes)],
+			      [AC_MSG_ERROR(too old)])
+      am_display_PYTHON=$PYTHON
+    else
+      # Otherwise, try each interpreter until we find one that satisfies
+      # VERSION.
+      AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+	[am_cv_pathless_PYTHON],[
+	for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+	  test "$am_cv_pathless_PYTHON" = none && break
+	  AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+	done])
+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+      if test "$am_cv_pathless_PYTHON" = none; then
+	PYTHON=:
+      else
+        AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+      fi
+      am_display_PYTHON=$am_cv_pathless_PYTHON
+    fi
+  ])
+
+  if test "$PYTHON" = :; then
+  dnl Run any user-specified action, or abort.
+    m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+  else
+
+  dnl Query Python for its version number.  Getting [:3] seems to be
+  dnl the best way to do this; it's what "site.py" does in the standard
+  dnl library.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+    [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+  dnl Use the values of $prefix and $exec_prefix for the corresponding
+  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made
+  dnl distinct variables so they can be overridden if need be.  However,
+  dnl general consensus is that you shouldn't need this ability.
+
+  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+  dnl At times (like when building shared libraries) you may want
+  dnl to know which OS platform Python thinks this is.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+    [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+
+  dnl Set up 4 directories:
+
+  dnl pythondir -- where to install python scripts.  This is the
+  dnl   site-packages directory, not the python standard library
+  dnl   directory like in previous automake betas.  This behavior
+  dnl   is more consistent with lispdir.m4 for example.
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+    [am_cv_python_pythondir],
+    [if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	  ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
+  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is
+  dnl   more consistent with the rest of automake.
+
+  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+  dnl pyexecdir -- directory for installing python extension modules
+  dnl   (shared libraries)
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+    [am_cv_python_pyexecdir],
+    [if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	   ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+  dnl Run any user-specified action.
+  $2
+  fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+  AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 5
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$[*]" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$[*]" != "X $srcdir/configure conftest.file" \
+      && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
+alias in your environment])
+   fi
+
+   test "$[2]" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 1
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries.  This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+  AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+#     tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+#     $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'],
+     [m4_case([$1], [ustar],, [pax],,
+              [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+  case $_am_tool in
+  gnutar)
+    for _am_tar in tar gnutar gtar;
+    do
+      AM_RUN_LOG([$_am_tar --version]) && break
+    done
+    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+    am__untar="$_am_tar -xf -"
+    ;;
+  plaintar)
+    # Must skip GNU tar: if it does not support --format= it doesn't create
+    # ustar tarball either.
+    (tar --version) >/dev/null 2>&1 && continue
+    am__tar='tar chf - "$$tardir"'
+    am__tar_='tar chf - "$tardir"'
+    am__untar='tar xf -'
+    ;;
+  pax)
+    am__tar='pax -L -x $1 -w "$$tardir"'
+    am__tar_='pax -L -x $1 -w "$tardir"'
+    am__untar='pax -r'
+    ;;
+  cpio)
+    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+    am__untar='cpio -i -H $1 -d'
+    ;;
+  none)
+    am__tar=false
+    am__tar_=false
+    am__untar=false
+    ;;
+  esac
+
+  # If the value was cached, stop now.  We just wanted to have am__tar
+  # and am__untar set.
+  test -n "${am_cv_prog_tar_$1}" && break
+
+  # tar/untar a dummy directory, and stop if the command works
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  echo GrepMe > conftest.dir/file
+  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+  rm -rf conftest.dir
+  if test -s conftest.tar; then
+    AM_RUN_LOG([$am__untar <conftest.tar])
+    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+  fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/vendor/gtest-1.7.0/build-aux/config.guess b/vendor/gtest-1.7.0/build-aux/config.guess
new file mode 100755
index 0000000..d622a44
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/config.guess
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Originally written by Per Bothner.  Please send patches (context
+# diff format) to <config-patches at gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+	"4"
+#else
+	""
+#endif
+	); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/vendor/gtest-1.7.0/build-aux/config.h.in b/vendor/gtest-1.7.0/build-aux/config.h.in
new file mode 100644
index 0000000..843b5b1
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/config.h.in
@@ -0,0 +1,69 @@
+/* build-aux/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/vendor/gtest-1.7.0/build-aux/config.sub b/vendor/gtest-1.7.0/build-aux/config.sub
new file mode 100755
index 0000000..c894da4
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/config.sub
@@ -0,0 +1,1773 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| open8 \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/vendor/gtest-1.7.0/build-aux/depcomp b/vendor/gtest-1.7.0/build-aux/depcomp
new file mode 100755
index 0000000..bd0ac08
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Originally written by Alexandre Oliva <oliva at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+if test -z "$depmode" || test -z "$source" || test -z "$object"; then
+  echo "depcomp: Variables source, object and depmode must be set" 1>&2
+  exit 1
+fi
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
+
+rm -f "$tmpdepfile"
+
+# Some modes work just like other modes, but use different flags.  We
+# parameterize here, but still list the modes in the big case below,
+# to make depend.m4 easier to write.  Note that we *cannot* use a case
+# here, because this file can only contain one case statement.
+if test "$depmode" = hp; then
+  # HP compiler uses -M and no extra arg.
+  gccflag=-M
+  depmode=gcc
+fi
+
+if test "$depmode" = dashXmstdout; then
+   # This is just like dashmstdout with a different argument.
+   dashmflag=-xM
+   depmode=dashmstdout
+fi
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+fi
+
+case "$depmode" in
+gcc3)
+## gcc 3 implements dependency tracking that does exactly what
+## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
+## it if -MD -MP comes after the -MF stuff.  Hmm.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  mv "$tmpdepfile" "$depfile"
+  ;;
+
+gcc)
+## There are various ways to get dependency output from gcc.  Here's
+## why we pick this rather obscure method:
+## - Don't want to use -MD because we'd like the dependencies to end
+##   up in a subdir.  Having to rename by hand is ugly.
+##   (We might end up doing this anyway to support other compilers.)
+## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
+##   -MM, not -M (despite what the docs say).
+## - Using -M directly means running the compiler twice (even worse
+##   than renaming).
+  if test -z "$gccflag"; then
+    gccflag=-MD,
+  fi
+  "$@" -Wp,"$gccflag$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## The second -e expression handles DOS-style file names with drive letters.
+  sed -e 's/^[^:]*: / /' \
+      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
+## This next piece of magic avoids the `deleted header file' problem.
+## The problem is that when a header file which appears in a .P file
+## is deleted, the dependency causes make to die (because there is
+## typically no way to rebuild the header).  We avoid this by adding
+## dummy dependencies for each header file.  Too bad gcc doesn't do
+## this for us directly.
+  tr ' ' '
+' < "$tmpdepfile" |
+## Some versions of gcc put a space before the `:'.  On the theory
+## that the space means something, we add a space to the output as
+## well.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
+      | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+sgi)
+  if test "$libtool" = yes; then
+    "$@" "-Wp,-MDupdate,$tmpdepfile"
+  else
+    "$@" -MDupdate "$tmpdepfile"
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+
+  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
+    echo "$object : \\" > "$depfile"
+
+    # Clip off the initial element (the dependent).  Don't try to be
+    # clever and replace this with sed code, as IRIX sed won't handle
+    # lines with more than a fixed number of characters (4096 in
+    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
+    # the IRIX cc adds comments like `#:fec' to the end of the
+    # dependency line.
+    tr ' ' '
+' < "$tmpdepfile" \
+    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+    tr '
+' ' ' >> "$depfile"
+    echo >> "$depfile"
+
+    # The second pass generates a dummy entry for each header file.
+    tr ' ' '
+' < "$tmpdepfile" \
+   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+   >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+aix)
+  # The C for AIX Compiler uses -M and outputs the dependencies
+  # in a .u file.  In older versions, this file always lives in the
+  # current directory.  Also, the AIX compiler puts `$object:' at the
+  # start of each line; $object doesn't have directory information.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    # Each line is of the form `foo.o: dependent.h'.
+    # Do two passes, one to just change these to
+    # `$object: dependent.h' and one to simply `dependent.h:'.
+    sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+  else
+    # The sourcefile does not contain any dependencies, so just
+    # store a dummy comment line, to avoid errors with the Makefile
+    # "include basename.Plo" scheme.
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 compiler uses -MD to generate dependencies as a side
+   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
+   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
+   # dependencies in `foo.d' instead, so we check for that too.
+   # Subdirectories are respected.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/	\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/	/
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+#nosideeffect)
+  # This comment above is used by automake to tell side-effect
+  # dependency tracking mechanisms from slower ones.
+
+dashmstdout)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  rm -f "$depfile"
+  cat < "$tmpdepfile" > "$depfile"
+  tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+dashXmstdout)
+  # This case only exists to satisfy depend.m4.  It is never actually
+  # run, as this mode is specially recognized in the preamble.
+  exit 1
+  ;;
+
+makedepend)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly.  Breaking it into two sed invocations is a workaround.
+    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile" "$tmpdepfile".bak
+  ;;
+
+cpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  cat < "$tmpdepfile" >> "$depfile"
+  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvisualcpp)
+  # Important note: in order to support this mode, a compiler *must*
+  # always write the preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # This case exists only to let depend.m4 do its work.  It works by
+  # looking at the text of this script.  This case will never be run,
+  # since it is checked for above.
+  exit 1
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/gtest-1.7.0/build-aux/install-sh b/vendor/gtest-1.7.0/build-aux/install-sh
new file mode 100755
index 0000000..a9244eb
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for `test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # and set any options; do chmod last to preserve setuid bits.
+    #
+    # If any of these fail, we abort the whole thing.  If we want to
+    # ignore errors from any of these, just make sure not to ignore
+    # errors from the above "$doit $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/gtest-1.7.0/build-aux/ltmain.sh b/vendor/gtest-1.7.0/build-aux/ltmain.sh
new file mode 100644
index 0000000..c2852d8
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then
+  emulate sh
+  NULLCMD=:
+  # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac
+fi
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/vendor/gtest-1.7.0/build-aux/missing b/vendor/gtest-1.7.0/build-aux/missing
new file mode 100755
index 0000000..86a8fc3
--- /dev/null
+++ b/vendor/gtest-1.7.0/build-aux/missing
@@ -0,0 +1,331 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2012-01-06.13; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+if test $# -eq 0; then
+  echo 1>&2 "Try \`$0 --help' for more information"
+  exit 1
+fi
+
+run=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+  configure_ac=configure.ac
+else
+  configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -h|--h|--he|--hel|--help)
+    echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+  -h, --help      display this help and exit
+  -v, --version   output version information and exit
+  --run           try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+  aclocal      touch file \`aclocal.m4'
+  autoconf     touch file \`configure'
+  autoheader   touch file \`config.h.in'
+  autom4te     touch the output file, or create a stub one
+  automake     touch all \`Makefile.in' files
+  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
+  flex         create \`lex.yy.c', if possible, from existing .c
+  help2man     touch the output file
+  lex          create \`lex.yy.c', if possible, from existing .c
+  makeinfo     touch the output file
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
+         to install the \`Automake' and \`Perl' packages.  Grab them from
+         any GNU archive site."
+    touch aclocal.m4
+    ;;
+
+  autoconf*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`${configure_ac}'.  You might want to install the
+         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
+         archive site."
+    touch configure
+    ;;
+
+  autoheader*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
+         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
+         from any GNU archive site."
+    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case $f in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $touch_files
+    ;;
+
+  automake*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+         You might want to install the \`Automake' and \`Perl' packages.
+         Grab them from any GNU archive site."
+    find . -type f -name Makefile.am -print |
+	   sed 's/\.am$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  You should only need it if
+         you modified a \`.y' file.  You may need the \`Bison' package
+         in order for those modifications to take effect.  You can get
+         \`Bison' from any GNU archive site."
+    rm -f y.tab.c y.tab.h
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.l' file.  You may need the \`Flex' package
+         in order for those modifications to take effect.  You can get
+         \`Flex' from any GNU archive site."
+    rm -f lex.yy.c
+    if test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+	 you modified a dependency of a manual page.  You may need the
+	 \`Help2man' package in order for those modifications to take
+	 effect.  You can get \`Help2man' from any GNU archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  You should only need it if
+         you modified a \`.texi' or \`.texinfo' file, or any other file
+         indirectly affecting the aspect of the manual.  The spurious
+         call might also be the consequence of using a buggy \`make' (AIX,
+         DU, IRIX).  You might want to install the \`Texinfo' package or
+         the \`GNU make' package.  Grab either from any GNU archive site."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.  Check the \`README' file,
+         it often tells you about the needed prerequisites for installing
+         this package.  You may also peek at any GNU archive site, in case
+         some other package would contain this missing \`$1' program."
+    exit 1
+    ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/vendor/gtest-1.7.0/cmake/internal_utils.cmake b/vendor/gtest-1.7.0/cmake/internal_utils.cmake
new file mode 100644
index 0000000..8cb2189
--- /dev/null
+++ b/vendor/gtest-1.7.0/cmake/internal_utils.cmake
@@ -0,0 +1,227 @@
+# Defines functions and macros useful for building Google Test and
+# Google Mock.
+#
+# Note:
+#
+# - This file will be run twice when building Google Mock (once via
+#   Google Test's CMakeLists.txt, and once via Google Mock's).
+#   Therefore it shouldn't have any side effects other than defining
+#   the functions and macros.
+#
+# - The functions/macros defined in this file may depend on Google
+#   Test and Google Mock's option() definitions, and thus must be
+#   called *after* the options have been defined.
+
+# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
+#
+# This must be a macro(), as inside a function string() can only
+# update variables in the function scope.
+macro(fix_default_compiler_settings_)
+  if (MSVC)
+    # For MSVC, CMake sets certain flags to defaults we want to override.
+    # This replacement code is taken from sample in the CMake Wiki at
+    # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
+    foreach (flag_var
+             CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+             CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+      if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
+        # When Google Test is built as a shared library, it should also use
+        # shared runtime libraries.  Otherwise, it may end up with multiple
+        # copies of runtime library data in different modules, resulting in
+        # hard-to-find crashes. When it is built as a static library, it is
+        # preferable to use CRT as static libraries, as we don't have to rely
+        # on CRT DLLs being available. CMake always defaults to using shared
+        # CRT libraries, so we override that default here.
+        string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
+      endif()
+
+      # We prefer more strict warning checking for building Google Test.
+      # Replaces /W3 with /W4 in defaults.
+      string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
+    endforeach()
+  endif()
+endmacro()
+
+# Defines the compiler/linker flags used to build Google Test and
+# Google Mock.  You can tweak these definitions to suit your need.  A
+# variable's value is empty before it's explicitly assigned to.
+macro(config_compiler_and_linker)
+  if (NOT gtest_disable_pthreads)
+    # Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
+    find_package(Threads)
+  endif()
+
+  fix_default_compiler_settings_()
+  if (MSVC)
+    # Newlines inside flags variables break CMake's NMake generator.
+    # TODO(vladl at google.com): Add -RTCs and -RTCu to debug builds.
+    set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
+    if (MSVC_VERSION LESS 1400)
+      # Suppress spurious warnings MSVC 7.1 sometimes issues.
+      # Forcing value to bool.
+      set(cxx_base_flags "${cxx_base_flags} -wd4800")
+      # Copy constructor and assignment operator could not be generated.
+      set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
+      # Compatibility warnings not applicable to Google Test.
+      # Resolved overload was found by argument-dependent lookup.
+      set(cxx_base_flags "${cxx_base_flags} -wd4675")
+    endif()
+    set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
+    set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
+    set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-GR-")
+  elseif (CMAKE_COMPILER_IS_GNUCXX)
+    set(cxx_base_flags "-Wall -Wshadow")
+    set(cxx_exception_flags "-fexceptions")
+    set(cxx_no_exception_flags "-fno-exceptions")
+    # Until version 4.3.2, GCC doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
+    set(cxx_strict_flags
+      "-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+    set(cxx_exception_flags "-features=except")
+    # Sun Pro doesn't provide macros to indicate whether exceptions and
+    # RTTI are enabled, so we define GTEST_HAS_* explicitly.
+    set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
+      CMAKE_CXX_COMPILER_ID STREQUAL "XL")
+    # CMake 2.8 changes Visual Age's compiler ID to "XL".
+    set(cxx_exception_flags "-qeh")
+    set(cxx_no_exception_flags "-qnoeh")
+    # Until version 9.0, Visual Age doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
+    set(cxx_base_flags "-AA -mt")
+    set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
+    # RTTI can not be disabled in HP aCC compiler.
+    set(cxx_no_rtti_flags "")
+  endif()
+
+  if (CMAKE_USE_PTHREADS_INIT)  # The pthreads library is available and allowed.
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
+  else()
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
+  endif()
+
+  # For building gtest's own tests and samples.
+  set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
+  set(cxx_no_exception
+    "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
+  set(cxx_default "${cxx_exception}")
+  set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
+  set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
+
+  # For building the gtest libraries.
+  set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
+endmacro()
+
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+function(cxx_library_with_type name type cxx_flags)
+  # type can be either STATIC or SHARED to denote a static or shared library.
+  # ARGN refers to additional arguments after 'cxx_flags'.
+  add_library(${name} ${type} ${ARGN})
+  set_target_properties(${name}
+    PROPERTIES
+    COMPILE_FLAGS "${cxx_flags}")
+  if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
+  endif()
+  if (CMAKE_USE_PTHREADS_INIT)
+    target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
+  endif()
+endfunction()
+
+########################################################################
+#
+# Helper functions for creating build targets.
+
+function(cxx_shared_library name cxx_flags)
+  cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
+endfunction()
+
+function(cxx_library name cxx_flags)
+  cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
+endfunction()
+
+# cxx_executable_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ executable that depends on the given libraries and
+# is built from the given source files with the given compiler flags.
+function(cxx_executable_with_flags name cxx_flags libs)
+  add_executable(${name} ${ARGN})
+  if (cxx_flags)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_flags}")
+  endif()
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+  endif()
+  # To support mixing linking in static and dynamic libraries, link each
+  # library in with an extra call to target_link_libraries.
+  foreach (lib "${libs}")
+    target_link_libraries(${name} ${lib})
+  endforeach()
+endfunction()
+
+# cxx_executable(name dir lib srcs...)
+#
+# creates a named target that depends on the given libs and is built
+# from the given source files.  dir/name.cc is implicitly included in
+# the source file list.
+function(cxx_executable name dir libs)
+  cxx_executable_with_flags(
+    ${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
+endfunction()
+
+# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
+find_package(PythonInterp)
+
+# cxx_test_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ test that depends on the given libs and is built
+# from the given source files with the given compiler flags.
+function(cxx_test_with_flags name cxx_flags libs)
+  cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
+  add_test(${name} ${name})
+endfunction()
+
+# cxx_test(name libs srcs...)
+#
+# creates a named test target that depends on the given libs and is
+# built from the given source files.  Unlike cxx_test_with_flags,
+# test/name.cc is already implicitly included in the source file list.
+function(cxx_test name libs)
+  cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
+    "test/${name}.cc" ${ARGN})
+endfunction()
+
+# py_test(name)
+#
+# creates a Python test with the given name whose main module is in
+# test/name.py.  It does nothing if Python is not installed.
+function(py_test name)
+  # We are not supporting Python tests on Linux yet as they consider
+  # all Linux environments to be google3 and try to use google3 features.
+  if (PYTHONINTERP_FOUND)
+    # ${CMAKE_BINARY_DIR} is known at configuration time, so we can
+    # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
+    # only at ctest runtime (by calling ctest -c <Configuration>), so
+    # we have to escape $ to delay variable substitution here.
+    add_test(${name}
+      ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
+          --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
+  endif()
+endfunction()
diff --git a/vendor/gtest-1.7.0/codegear/gtest.cbproj b/vendor/gtest-1.7.0/codegear/gtest.cbproj
new file mode 100644
index 0000000..285bb2a
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest.cbproj
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <None Include="..\include\gtest\gtest-death-test.h">
+      <BuildOrder>3</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-message.h">
+      <BuildOrder>4</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-param-test.h">
+      <BuildOrder>5</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-spi.h">
+      <BuildOrder>6</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-test-part.h">
+      <BuildOrder>7</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-typed-test.h">
+      <BuildOrder>8</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest.h">
+      <BuildOrder>0</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_pred_impl.h">
+      <BuildOrder>1</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_prod.h">
+      <BuildOrder>2</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-death-test-internal.h">
+      <BuildOrder>9</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-filepath.h">
+      <BuildOrder>10</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-internal.h">
+      <BuildOrder>11</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-linked_ptr.h">
+      <BuildOrder>12</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util-generated.h">
+      <BuildOrder>14</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util.h">
+      <BuildOrder>13</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-port.h">
+      <BuildOrder>15</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-string.h">
+      <BuildOrder>16</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-type-util.h">
+      <BuildOrder>17</BuildOrder>
+    </None>
+    <CppCompile Include="gtest_all.cc">
+      <BuildOrder>18</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/vendor/gtest-1.7.0/codegear/gtest.groupproj b/vendor/gtest-1.7.0/codegear/gtest.groupproj
new file mode 100644
index 0000000..849f4c4
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest.groupproj
@@ -0,0 +1,54 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
+  </PropertyGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Projects Include="gtest.cbproj" />
+    <Projects Include="gtest_main.cbproj" />
+    <Projects Include="gtest_unittest.cbproj" />
+  </ItemGroup>
+  <ProjectExtensions>
+    <Borland.Personality>Default.Personality</Borland.Personality>
+    <Borland.ProjectType />
+    <BorlandProject>
+<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
+  </ProjectExtensions>
+  <Target Name="gtest">
+    <MSBuild Projects="gtest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest:Clean">
+    <MSBuild Projects="gtest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest:Make">
+    <MSBuild Projects="gtest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_main">
+    <MSBuild Projects="gtest_main.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_main:Clean">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_main:Make">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_unittest">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_unittest:Clean">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_unittest:Make">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="Build">
+    <CallTarget Targets="gtest;gtest_main;gtest_unittest" />
+  </Target>
+  <Target Name="Clean">
+    <CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
+  </Target>
+  <Target Name="Make">
+    <CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
+  </Target>
+  <Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
+</Project>
\ No newline at end of file
diff --git a/vendor/gtest-1.7.0/codegear/gtest_all.cc b/vendor/gtest-1.7.0/codegear/gtest_all.cc
new file mode 100644
index 0000000..ba7ad68
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest_all.cc
@@ -0,0 +1,38 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// C++Builder's IDE cannot build a static library from files with hyphens
+// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
+// This file serves as a workaround.
+
+#include "src/gtest-all.cc"
diff --git a/vendor/gtest-1.7.0/codegear/gtest_link.cc b/vendor/gtest-1.7.0/codegear/gtest_link.cc
new file mode 100644
index 0000000..b955ebf
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest_link.cc
@@ -0,0 +1,40 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
+// This means that these libraries can't be renamed, but it's the only way to
+// ensure that Debug versus Release test builds are linked against the
+// appropriate Debug or Release build of the libraries.
+
+#pragma link "gtest.lib"
+#pragma link "gtest_main.lib"
diff --git a/vendor/gtest-1.7.0/codegear/gtest_main.cbproj b/vendor/gtest-1.7.0/codegear/gtest_main.cbproj
new file mode 100644
index 0000000..fae32cb
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest_main.cbproj
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\src\gtest_main.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
diff --git a/vendor/gtest-1.7.0/codegear/gtest_unittest.cbproj b/vendor/gtest-1.7.0/codegear/gtest_unittest.cbproj
new file mode 100644
index 0000000..33f7056
--- /dev/null
+++ b/vendor/gtest-1.7.0/codegear/gtest_unittest.cbproj
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <OutputExt>exe</OutputExt>
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <Defines>NO_STRICT</Defines>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <DynamicRTL>true</DynamicRTL>
+    <ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppConsoleApplication</ProjectType>
+    <NoVCL>true</NoVCL>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSy [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
+    <Multithreaded>true</Multithreaded>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\test\gtest_unittest.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <CppCompile Include="gtest_link.cc">
+      <BuildOrder>1</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/vendor/gtest-1.7.0/configure b/vendor/gtest-1.7.0/configure
new file mode 100755
index 0000000..582a9a0
--- /dev/null
+++ b/vendor/gtest-1.7.0/configure
@@ -0,0 +1,18222 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for Google C++ Testing Framework 1.7.0.
+#
+# Report bugs to <googletestframework at googlegroups.com>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
+#
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '\${1+\"\$@\"}'='\"\$@\"'
+  setopt NO_GLOB_SUBST
+else
+  case \`(set -o) 2>/dev/null\` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+"
+  as_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: googletestframework at googlegroups.com about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
+  sed -n '
+    p
+    /[$]LINENO/=
+  ' <$as_myself |
+    sed '
+      s/[$]LINENO.*/&-/
+      t lineno
+      b
+      :lineno
+      N
+      :loop
+      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+      t loop
+      s/-\n.*//
+    ' >$as_me.lineno &&
+  chmod +x "$as_me.lineno" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+  # Don't try to exec as it changes $[0], causing all sort of problems
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensitive to this).
+  . "./$as_me.lineno"
+  # Exit status is that of the last command.
+  exit
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_clean_files=
+ac_config_libobj_dir=.
+LIBOBJS=
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+
+# Identity of this package.
+PACKAGE_NAME='Google C++ Testing Framework'
+PACKAGE_TARNAME='gtest'
+PACKAGE_VERSION='1.7.0'
+PACKAGE_STRING='Google C++ Testing Framework 1.7.0'
+PACKAGE_BUGREPORT='googletestframework at googlegroups.com'
+PACKAGE_URL=''
+
+ac_unique_file="./LICENSE"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
+#  include <memory.h>
+# endif
+# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAVE_PTHREADS_FALSE
+HAVE_PTHREADS_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+acx_pthread_config
+HAVE_PYTHON_FALSE
+HAVE_PYTHON_TRUE
+PYTHON
+CXXCPP
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_pthreads
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CPP
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+# (The list follows the same order as the GNU Coding Standards.)
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datarootdir='${prefix}/share'
+datadir='${datarootdir}'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
+infodir='${datarootdir}/info'
+htmldir='${docdir}'
+dvidir='${docdir}'
+pdfdir='${docdir}'
+psdir='${docdir}'
+libdir='${exec_prefix}/lib'
+localedir='${datarootdir}/locale'
+mandir='${datarootdir}/man'
+
+ac_prev=
+ac_dashdash=
+for ac_option
+do
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval $ac_prev=\$ac_option
+    ac_prev=
+    continue
+  fi
+
+  case $ac_option in
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case $ac_dashdash$ac_option in
+  --)
+    ac_dashdash=yes ;;
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir=$ac_optarg ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build_alias ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build_alias=$ac_optarg ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file=$ac_optarg ;;
+
+  --config-cache | -C)
+    cache_file=config.cache ;;
+
+  -datadir | --datadir | --datadi | --datad)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=*)
+    datadir=$ac_optarg ;;
+
+  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
+  | --dataroo | --dataro | --datar)
+    ac_prev=datarootdir ;;
+  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
+  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
+    datarootdir=$ac_optarg ;;
+
+  -disable-* | --disable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
+
+  -docdir | --docdir | --docdi | --doc | --do)
+    ac_prev=docdir ;;
+  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
+    docdir=$ac_optarg ;;
+
+  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
+    ac_prev=dvidir ;;
+  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
+    dvidir=$ac_optarg ;;
+
+  -enable-* | --enable-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix=$ac_optarg ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he | -h)
+    ac_init_help=long ;;
+  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+    ac_init_help=recursive ;;
+  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+    ac_init_help=short ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host_alias ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host_alias=$ac_optarg ;;
+
+  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
+    ac_prev=htmldir ;;
+  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
+  | --ht=*)
+    htmldir=$ac_optarg ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir=$ac_optarg ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir=$ac_optarg ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir=$ac_optarg ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir=$ac_optarg ;;
+
+  -localedir | --localedir | --localedi | --localed | --locale)
+    ac_prev=localedir ;;
+  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
+    localedir=$ac_optarg ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst | --locals)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
+    localstatedir=$ac_optarg ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir=$ac_optarg ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c | -n)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir=$ac_optarg ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix=$ac_optarg ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix=$ac_optarg ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix=$ac_optarg ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name=$ac_optarg ;;
+
+  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
+    ac_prev=pdfdir ;;
+  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
+    pdfdir=$ac_optarg ;;
+
+  -psdir | --psdir | --psdi | --psd | --ps)
+    ac_prev=psdir ;;
+  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
+    psdir=$ac_optarg ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir=$ac_optarg ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir=$ac_optarg ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site=$ac_optarg ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir=$ac_optarg ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir=$ac_optarg ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target_alias ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target_alias=$ac_optarg ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers | -V)
+    ac_init_version=: ;;
+
+  -with-* | --with-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes=$ac_optarg ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries=$ac_optarg ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
+		datadir sysconfdir sharedstatedir localstatedir includedir \
+		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
+		libdir localedir mandir
+do
+  eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+  if test "x$build_alias" = x; then
+    cross_compiling=maybe
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
+  elif test "x$build_alias" != "x$host_alias"; then
+    cross_compiling=yes
+  fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+ac_pwd=`pwd` && test -n "$ac_pwd" &&
+ac_ls_di=`ls -di .` &&
+ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then the parent directory.
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  srcdir=$ac_confdir
+  if test ! -r "$srcdir/$ac_unique_file"; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r "$srcdir/$ac_unique_file"; then
+  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	pwd)`
+# When building in place, set srcdir=.
+if test "$ac_abs_confdir" = "$ac_pwd"; then
+  srcdir=.
+fi
+# Remove unnecessary trailing slashes from srcdir.
+# Double slashes in file names in object file debugging info
+# mess up M-x gdb in Emacs.
+case $srcdir in
+*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
+esac
+for ac_var in $ac_precious_vars; do
+  eval ac_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_env_${ac_var}_value=\$${ac_var}
+  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
+  eval ac_cv_env_${ac_var}_value=\$${ac_var}
+done
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+  # Omit some internal or obsolete options to make the list less imposing.
+  # This message is too long to be a string in the A/UX 3.1 sh.
+  cat <<_ACEOF
+\`configure' configures Google C++ Testing Framework 1.7.0 to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE.  See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+  -h, --help              display this help and exit
+      --help=short        display options specific to this package
+      --help=recursive    display the short help of all the included packages
+  -V, --version           display version information and exit
+  -q, --quiet, --silent   do not print \`checking ...' messages
+      --cache-file=FILE   cache test results in FILE [disabled]
+  -C, --config-cache      alias for \`--cache-file=config.cache'
+  -n, --no-create         do not create output files
+      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
+
+Installation directories:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/gtest]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
+_ACEOF
+
+  cat <<\_ACEOF
+
+Program names:
+  --program-prefix=PREFIX            prepend PREFIX to installed program names
+  --program-suffix=SUFFIX            append SUFFIX to installed program names
+  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of Google C++ Testing Framework 1.7.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-pthreads         use pthreads (default is yes)
+
+Some influential environment variables:
+  CC          C compiler command
+  CFLAGS      C compiler flags
+  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
+              nonstandard directory <lib dir>
+  LIBS        libraries to pass to the linker, e.g. -l<library>
+  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CPP         C preprocessor
+  CXXCPP      C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+Report bugs to <googletestframework at googlegroups.com>.
+_ACEOF
+ac_status=$?
+fi
+
+if test "$ac_init_help" = "recursive"; then
+  # If there are subdirs, report their specific --help.
+  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
+    ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+    cd "$ac_dir" || { ac_status=$?; continue; }
+    # Check for guested configure.
+    if test -f "$ac_srcdir/configure.gnu"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
+    elif test -f "$ac_srcdir/configure"; then
+      echo &&
+      $SHELL "$ac_srcdir/configure" --help=recursive
+    else
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+    fi || ac_status=$?
+    cd "$ac_pwd" || { ac_status=$?; break; }
+  done
+fi
+
+test -n "$ac_init_help" && exit $ac_status
+if $ac_init_version; then
+  cat <<\_ACEOF
+Google C++ Testing Framework configure 1.7.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+  exit
+fi
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext
+  if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef $2
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char $2 ();
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined __stub_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  rm -f conftest.$ac_objext conftest$ac_exeext
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+cat >config.log <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  $ $0 $@
+
+_ACEOF
+exec 5>>config.log
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
+
+/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
+/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
+/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    $as_echo "PATH: $as_dir"
+  done
+IFS=$as_save_IFS
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *\'*)
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append ac_configure_args1 " '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+	ac_must_keep_next=false # Got value, back to normal.
+      else
+	case $ac_arg in
+	  *=* | --config-cache | -C | -disable-* | --disable-* \
+	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+	  | -with-* | --with-* | -without-* | --without-* | --x)
+	    case "$ac_configure_args0 " in
+	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+	    esac
+	    ;;
+	  -* ) ac_must_keep_next=true ;;
+	esac
+      fi
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset ac_configure_args1;}
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log.  We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Use '\'' to represent an apostrophe within the trap.
+# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
+trap 'exit_status=$?
+  # Save into config.log some information that might help in debugging.
+  {
+    echo
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    echo
+    # The following way of writing the cache mishandles newlines in values,
+(
+  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+  (set) 2>&1 |
+    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      sed -n \
+	"s/'\''/'\''\\\\'\'''\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
+      ;; #(
+    *)
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+)
+    echo
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
+  } >&5
+  rm -f core *.core core.conftest.* &&
+    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
+    exit $exit_status
+' 0
+for ac_signal in 1 2 13 15; do
+  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -f -r conftest* confdefs.h
+
+$as_echo "/* confdefs.h */" > confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  fi
+done
+
+if test -r "$cache_file"; then
+  # Some versions of bash will fail to source /dev/null (special files
+  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
+  >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in $ac_precious_vars; do
+  eval ac_old_set=\$ac_cv_env_${ac_var}_set
+  eval ac_new_set=\$ac_env_${ac_var}_set
+  eval ac_old_val=\$ac_cv_env_${ac_var}_value
+  eval ac_new_val=\$ac_env_${ac_var}_value
+  case $ac_old_set,$ac_new_set in
+    set,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,);;
+    *)
+      if test "x$ac_old_val" != "x$ac_new_val"; then
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *) ac_arg=$ac_var=$ac_new_val ;;
+    esac
+    case " $ac_configure_args " in
+      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+# Provide various options to initialize the Autoconf and configure processes.
+
+
+
+ac_aux_dir=
+for ac_dir in build-aux "$srcdir"/build-aux; do
+  if test -f "$ac_dir/install-sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f "$ac_dir/install.sh"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  elif test -f "$ac_dir/shtool"; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/shtool install -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
+fi
+
+# These three variables are undocumented and unsupported,
+# and are intended to be withdrawn in a future Autoconf release.
+# They can cause serious problems if a builder's source tree is in a directory
+# whose full name contains unusual characters.
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
+ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
+
+
+ac_config_headers="$ac_config_headers build-aux/config.h"
+
+ac_config_files="$ac_config_files Makefile"
+
+ac_config_files="$ac_config_files scripts/gtest-config"
+
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+am__api_version='1.11'
+
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in #((
+  ./ | .// | /[cC]/* | \
+  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
+  /usr/ucb/* ) ;;
+  *)
+    # OSF1 and SCO ODT 3.0 have their own names for install.
+    # Don't use installbsd from OSF since it installs stuff as root
+    # by default.
+    for ac_prog in ginstall scoinst install; do
+      for ac_exec_ext in '' $ac_executable_extensions; do
+	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
+	  if test $ac_prog = install &&
+	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # AIX install.  It has an incompatible calling convention.
+	    :
+	  elif test $ac_prog = install &&
+	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+	    # program-specific install script used by HP pwplus--don't use.
+	    :
+	  else
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL=$ac_cv_path_install
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    INSTALL=$ac_install_sh
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments.  Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+   set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
+   if test "$*" = "X"; then
+      # -L didn't work.
+      set X `ls -t "$srcdir/configure" conftest.file`
+   fi
+   rm -f conftest.file
+   if test "$*" != "X $srcdir/configure conftest.file" \
+      && test "$*" != "X conftest.file $srcdir/configure"; then
+
+      # If neither matched, then we have a broken ls.  This can happen
+      # if, for instance, CONFIG_SHELL is bash and it inherits a
+      # broken ls alias from the environment.  This has actually
+      # happened.  Such a system could not be considered "sane".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+test "$program_prefix" != NONE &&
+  program_transform_name="s&^&$program_prefix&;$program_transform_name"
+# Use a double $ so make ignores it.
+test "$program_suffix" != NONE &&
+  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
+# Double any \ or $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'.  However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+if test "$cross_compiling" != no; then
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the value is a relative name.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+for ac_prog in gawk mawk nawk awk
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AWK="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat >conftest.make <<\_ACEOF
+SHELL = /bin/sh
+all:
+	@echo '@@@%%%=$(MAKE)=@@@%%%'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
+case `${MAKE-make} -f conftest.make 2>/dev/null` in
+  *@@@%%%=?*=@@@%%%*)
+    eval ac_cv_prog_make_${ac_make}_set=yes;;
+  *)
+    eval ac_cv_prog_make_${ac_make}_set=no;;
+esac
+rm -f conftest.make
+fi
+if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+  am__leading_dot=.
+else
+  am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+  if (cygpath --version) >/dev/null 2>/dev/null; then
+    CYGPATH_W='cygpath -w'
+  else
+    CYGPATH_W=echo
+  fi
+fi
+
+
+# Define the identity of the package.
+ PACKAGE='gtest'
+ VERSION='1.7.0'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# Some tools Automake needs.
+
+ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
+
+
+AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
+
+
+AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
+
+
+AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
+
+
+MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# Check for programs used in building Google Test.
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+  ac_ct_CC=$CC
+  # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="gcc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+else
+  CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+          if test -n "$ac_tool_prefix"; then
+    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="${ac_tool_prefix}cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  fi
+fi
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+       ac_prog_rejected=yes
+       continue
+     fi
+    ac_cv_prog_CC="cc"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# != 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+  fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$CC"; then
+  if test -n "$ac_tool_prefix"; then
+  for ac_prog in cl.exe
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CC" && break
+  done
+fi
+if test -z "$CC"; then
+  ac_ct_CC=$CC
+  for ac_prog in cl.exe
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CC"; then
+  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CC" && break
+done
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
+  esac
+done
+rm -f $ac_rmfiles
+
+if { { ac_try="$ac_link_default"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
+# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
+# in a Makefile.  We should not override ac_cv_exeext if it was cached,
+# so that the user can short-circuit this test for compilers unknown to
+# Autoconf.
+for ac_file in $ac_files ''
+do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
+	;;
+    [ab].out )
+	# We found the default executable, but exeext='' is most
+	# certainly right.
+	break;;
+    *.* )
+	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
+	then :; else
+	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	fi
+	# We set ac_cv_exeext here because the later test for it is not
+	# safe: cross compilers may not add the suffix if given an `-o'
+	# argument, so we may need to know it at that point already.
+	# Even if this section looks crufty: it has the advantage of
+	# actually working.
+	break;;
+    * )
+	break;;
+  esac
+done
+test "$ac_cv_exeext" = no && ac_cv_exeext=
+
+else
+  ac_file=''
+fi
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { { ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then :
+  for ac_file in conftest.o conftest.obj conftest.*; do
+  test -f "$ac_file" || continue;
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_c_werror_flag=$ac_c_werror_flag
+   ac_c_werror_flag=yes
+   ac_cv_prog_cc_g=no
+   CFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_c_werror_flag=$ac_save_c_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
+   function prototypes and stuff, but not '\xHH' hex character constants.
+   These don't provoke an error unfortunately, instead are silently treated
+   as 'x'.  The following induces an error, until -std is added to get
+   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
+   array size at least.  It's necessary to write '\x00'==0 to get something
+   that's true only with -std.  */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
+   inside strings and character constants.  */
+#define FOO(x) 'x'
+int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
+	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+fi
+rm -f core conftest.err conftest.$ac_objext
+  test "x$ac_cv_prog_cc_c89" != "xno" && break
+done
+rm -f conftest.$ac_ext
+CC=$ac_save_CC
+
+fi
+# AC_CACHE_VAL
+case "x$ac_cv_prog_cc_c89" in
+  x)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking was given.
+if test "${enable_dependency_tracking+set}" = set; then :
+  enableval=$enable_dependency_tracking;
+fi
+
+if test "x$enable_dependency_tracking" != xno; then
+  am_depcomp="$ac_aux_dir/depcomp"
+  AMDEPBACKSLASH='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CC_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CC_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CC_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
+CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
+  am__fastdepCC_TRUE=
+  am__fastdepCC_FALSE='#'
+else
+  am__fastdepCC_TRUE='#'
+  am__fastdepCC_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+  # We make a subdir and do the tests there.  Otherwise we can end up
+  # making bogus files that we don't know about and never remove.  For
+  # instance it was reported that on HP-UX the gcc test will end up
+  # making a dummy file named `D' -- because `-MD' means `put the output
+  # in D'.
+  rm -rf conftest.dir
+  mkdir conftest.dir
+  # Copy depcomp to subdir because otherwise we won't find it if we're
+  # using a relative directory.
+  cp "$am_depcomp" conftest.dir
+  cd conftest.dir
+  # We will build objects and dependencies in a subdirectory because
+  # it helps to detect inapplicable dependency modes.  For instance
+  # both Tru64's cc and ICC support -MD to output dependencies as a
+  # side effect of compilation, but ICC will put the dependencies in
+  # the current directory while Tru64 will put them in the object
+  # directory.
+  mkdir sub
+
+  am_cv_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  for depmode in $am_compiler_list; do
+    # Setup a source with many dependencies, because some compilers
+    # like to wrap large dependency lists on column 80 (with \), and
+    # we should not choose a depcomp mode which is confused by this.
+    #
+    # We need to recreate these files for each test, as the compiler may
+    # overwrite some of them when testing with obscure command lines.
+    # This happens at least with the AIX C compiler.
+    : > sub/conftest.c
+    for i in 1 2 3 4 5 6; do
+      echo '#include "conftst'$i'.h"' >> sub/conftest.c
+      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+      # Solaris 8's {/usr,}/bin/sh.
+      touch sub/conftst$i.h
+    done
+    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+    # We check with `-c' and `-o' for the sake of the "dashmstdout"
+    # mode.  It turns out that the SunPro C++ compiler does not properly
+    # handle `-M -o', and we need to detect this.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    nosideeffect)
+      # after this tag, mechanisms are not by side-effect, so they'll
+      # only be used when explicitly requested
+      if test "x$enable_dependency_tracking" = xyes; then
+	continue
+      else
+	break
+      fi
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+      # icc doesn't choke on unknown options, it will just issue warnings
+      # or remarks (even with -Werror).  So we grep stderr for any message
+      # that says an option was ignored or not supported.
+      # When given -MP, icc 7.0 and 7.1 complain thusly:
+      #   icc: Command line warning: ignoring option '-M'; no argument required
+      # The diagnosis changed in icc 8.0:
+      #   icc: Command line remark: option '-MP' not supported
+      if (grep 'ignoring option' conftest.err ||
+          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+        am_cv_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  ac_path_GREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in grep ggrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
+  # Check for GNU $ac_path_GREP
+case `"$ac_path_GREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
+    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_GREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_GREP="$ac_path_GREP"
+      ac_path_GREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_GREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  ac_path_EGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in egrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
+  # Check for GNU $ac_path_EGREP
+case `"$ac_path_EGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
+    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_EGREP="$ac_path_EGREP"
+      ac_path_EGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_EGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_max=$ac_count
+    fi
+    # 10*(2^10) chars as input seems more than enough
+    test $ac_count -gt 10 && break
+  done
+  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
+esac
+
+      $ac_path_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  do
+    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
+set dummy ${ac_tool_prefix}strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$STRIP"; then
+  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_STRIP"; then
+  ac_ct_STRIP=$STRIP
+  # Extract the first word of "strip", so it can be a program name with args.
+set dummy strip; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_STRIP"; then
+  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_STRIP="strip"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$RANLIB"; then
+  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_RANLIB"; then
+  ac_ct_RANLIB=$RANLIB
+  # Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_RANLIB"; then
+  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_RANLIB="ranlib"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_ac_ct_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CPP needs to be expanded
+    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CPP=$CPP
+
+fi
+  CPP=$ac_cv_prog_CPP
+else
+  ac_cv_prog_CPP=$CPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "memchr" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  $EGREP "free" >/dev/null 2>&1; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+  if test "$cross_compiling" = yes; then :
+  :
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ctype.h>
+#include <stdlib.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) \
+		   (('a' <= (c) && (c) <= 'i') \
+		     || ('j' <= (c) && (c) <= 'r') \
+		     || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+  int i;
+  for (i = 0; i < 256; i++)
+    if (XOR (islower (i), ISLOWER (i))
+	|| toupper (i) != TOUPPER (i))
+      return 2;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+fi
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+		  inttypes.h stdint.h unistd.h
+do :
+  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+  # Use a header file that comes with gcc, so configuring glibc
+  # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp. "Syntax error" is here to catch this case.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+	      '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+	      '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+# Extract the first word of "python", so it can be a program name with args.
+set dummy python; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":"
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "$PYTHON" != ":"; then :
+  prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+  if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+   ($PYTHON -c "$prog") >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; then :
+  :
+else
+  PYTHON=":"
+fi
+fi
+ if test "$PYTHON" != ":"; then
+  HAVE_PYTHON_TRUE=
+  HAVE_PYTHON_FALSE='#'
+else
+  HAVE_PYTHON_TRUE='#'
+  HAVE_PYTHON_FALSE=
+fi
+
+
+# Configure pthreads.
+
+# Check whether --with-pthreads was given.
+if test "${with_pthreads+set}" = set; then :
+  withval=$with_pthreads; with_pthreads=$withval
+else
+  with_pthreads=check
+fi
+
+
+have_pthreads=no
+if test "x$with_pthreads" != "xno"; then :
+
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		# Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_acx_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$acx_pthread_config"; then
+  ac_cv_prog_acx_pthread_config="$acx_pthread_config" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_acx_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no"
+fi
+fi
+acx_pthread_config=$ac_cv_prog_acx_pthread_config
+if test -n "$acx_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5
+$as_echo "$acx_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr=$attr; return attr;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	done
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
+$as_echo "${flag}" >&6; }
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          for ac_prog in xlc_r cc_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
+    ac_cv_prog_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5
+$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes ; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   fi
+	fi
+
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5
+$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5
+$as_echo_n "checking whether -lpthread fixes that... " >&6; }
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5
+$as_echo_n "checking whether -lc_r fixes that... " >&6; }
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5
+$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;}
+
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+
+$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+        :
+else
+        acx_pthread_ok=no
+        if test "x$with_pthreads" != "xcheck"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "--with-pthreads was specified, but unable to be used
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+       have_pthreads="$acx_pthread_ok"
+fi
+ if test "x$have_pthreads" = "xyes"; then
+  HAVE_PTHREADS_TRUE=
+  HAVE_PTHREADS_FALSE='#'
+else
+  HAVE_PTHREADS_TRUE='#'
+  HAVE_PTHREADS_FALSE=
+fi
+
+
+
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems.  If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, we kill variables containing newlines.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(
+  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
+    eval ac_val=\$$ac_var
+    case $ac_val in #(
+    *${as_nl}*)
+      case $ac_var in #(
+      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; unset $ac_var;} ;;
+      esac ;;
+    esac
+  done
+
+  (set) 2>&1 |
+    case $as_nl`(ac_space=' '; set) 2>&1` in #(
+    *${as_nl}ac_space=\ *)
+      # `set' does not quote correctly, so add quotes: double-quote
+      # substitution turns \\\\ into \\, and sed turns \\ into \.
+      sed -n \
+	"s/'/'\\\\''/g;
+	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+      ;; #(
+    *)
+      # `set' quotes correctly as required by POSIX, so do not add quotes.
+      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
+      ;;
+    esac |
+    sort
+) |
+  sed '
+     /^ac_cv_env_/b end
+     t clear
+     :clear
+     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+     t end
+     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+     :end' >>confcache
+if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
+  if test -w "$cache_file"; then
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+  fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+U=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
+  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
+  #    will be set to the directory where LIBOBJS objects are built.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## M4sh Initialization. ##
+## -------------------- ##
+
+# Be more Bourne compatible
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+  setopt NO_GLOB_SUBST
+else
+  case `(set -o) 2>/dev/null` in #(
+  *posix*) :
+    set -o posix ;; #(
+  *) :
+     ;;
+esac
+fi
+
+
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.  Quoting is
+# there to prevent editors from complaining about space-tab.
+# (If _AS_PATH_WALK were called with IFS unset, it would disable word
+# splitting by setting IFS to empty value.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+case $0 in #((
+  *[\\/]* ) as_myself=$0 ;;
+  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+  done
+IFS=$as_save_IFS
+
+     ;;
+esac
+# We did not find ourselves, most probably we were run as `sh COMMAND'
+# in which case we are not to be found in the path.
+if test "x$as_myself" = x; then
+  as_myself=$0
+fi
+if test ! -f "$as_myself"; then
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+   test "X`expr 00001 : '.*\(...\)'`" = X001; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+rm -f conf$$ conf$$.exe conf$$.file
+if test -d conf$$.dir; then
+  rm -f conf$$.dir/conf$$.file
+else
+  rm -f conf$$.dir
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
+    as_ln_s='cp -p'
+  fi
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
+      *) as_qdir=$as_dir;;
+      esac
+      as_dirs="'$as_qdir' $as_dirs"
+      as_dir=`$as_dirname -- "$as_dir" ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_dir" : 'X\(//\)[^/]' \| \
+	 X"$as_dir" : 'X\(//\)$' \| \
+	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_dir" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      test -d "$as_dir" && break
+    done
+    test -z "$as_dirs" || eval "mkdir $as_dirs"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+else
+  test -d ./-p && rmdir ./-p
+  as_mkdir_p=false
+fi
+
+if test -x / >/dev/null 2>&1; then
+  as_test_x='test -x'
+else
+  if ls -dL / >/dev/null 2>&1; then
+    as_ls_L_option=L
+  else
+    as_ls_L_option=
+  fi
+  as_test_x='
+    eval sh -c '\''
+      if test -d "$1"; then
+	test -d "$1/.";
+      else
+	case $1 in #(
+	-*)set "./$1";;
+	esac;
+	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #((
+	???[sx]*):;;*)false;;esac;fi
+    '\'' sh
+  '
+fi
+as_executable_p=$as_test_x
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+exec 6>&1
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# Save the log message, to keep $0 and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling.
+ac_log="
+This file was extended by Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  Invocation command line was
+
+  CONFIG_FILES    = $CONFIG_FILES
+  CONFIG_HEADERS  = $CONFIG_HEADERS
+  CONFIG_LINKS    = $CONFIG_LINKS
+  CONFIG_COMMANDS = $CONFIG_COMMANDS
+  $ $0 $@
+
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+"
+
+_ACEOF
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# Files that config.status was made for.
+config_files="$ac_config_files"
+config_headers="$ac_config_headers"
+config_commands="$ac_config_commands"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   do not print progress messages
+  -d, --debug      don't remove temporary files
+      --recheck    update $as_me by reconfiguring in the same conditions
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <googletestframework at googlegroups.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+Google C++ Testing Framework config.status 1.7.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+
+ac_pwd='$ac_pwd'
+srcdir='$srcdir'
+INSTALL='$INSTALL'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+ac_need_defaults=:
+while test $# != 0
+do
+  case $1 in
+  --*=?*)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
+    ac_shift=:
+    ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
+  *)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
+  esac
+
+  case $ac_option in
+  # Handling of the options.
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
+  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_echo "$ac_cs_usage"; exit ;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
+
+  # This is an error.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append ac_config_targets " $1"
+     ac_need_defaults=false ;;
+
+  esac
+  shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  esac
+done
+
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used.  Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason against having it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Hook for its removal unless debugging.
+# Note that there is a small window in which the directory will not be cleaned:
+# after its creation but before its name has been assigned to `$tmp'.
+$debug ||
+{
+  tmp= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[FH]-) ac_tag=-:-;;
+  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
+  esac
+  ac_save_IFS=$IFS
+  IFS=:
+  set x $ac_tag
+  IFS=$ac_save_IFS
+  shift
+  ac_file=$1
+  shift
+
+  case $ac_mode in
+  :L) ac_source=$1;;
+  :[FH])
+    ac_file_inputs=
+    for ac_f
+    do
+      case $ac_f in
+      -) ac_f="$ac_tmp/stdin";;
+      *) # Look for the file first in the build tree, then in the source tree
+	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
+	 # because $ac_f cannot contain `:'.
+	 test -f "$ac_f" ||
+	   case $ac_f in
+	   [\\/$]*) false;;
+	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
+	   esac ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append ac_file_inputs " '$ac_f'"
+    done
+
+    # Let's still pretend it is `configure' which instantiates (i.e., don't
+    # use $as_me), people would be surprised to read:
+    #    /* config.h.  Generated by config.status.  */
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    esac
+    ;;
+  esac
+
+  ac_dir=`$as_dirname -- "$ac_file" ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$ac_file" : 'X\(//\)[^/]' \| \
+	 X"$ac_file" : 'X\(//\)$' \| \
+	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$ac_file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+  as_dir="$ac_dir"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
+  case $ac_top_builddir_sub in
+  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
+  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
+  esac ;;
+esac
+ac_abs_top_builddir=$ac_pwd
+ac_abs_builddir=$ac_pwd$ac_dir_suffix
+# for backward compatibility:
+ac_top_builddir=$ac_top_build_prefix
+
+case $srcdir in
+  .)  # We are building in place.
+    ac_srcdir=.
+    ac_top_srcdir=$ac_top_builddir_sub
+    ac_abs_top_srcdir=$ac_pwd ;;
+  [\\/]* | ?:[\\/]* )  # Absolute name.
+    ac_srcdir=$srcdir$ac_dir_suffix;
+    ac_top_srcdir=$srcdir
+    ac_abs_top_srcdir=$srcdir ;;
+  *) # Relative name.
+    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
+    ac_top_srcdir=$ac_top_build_prefix$srcdir
+    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
+esac
+ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
+
+
+  case $ac_mode in
+  :F)
+  #
+  # CONFIG_FILE
+  #
+
+  case $INSTALL in
+  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
+  esac
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# If the template does not know about datarootdir, expand it.
+# FIXME: This hack should be removed a few years after 2.60.
+ac_datarootdir_hack=; ac_datarootdir_seen=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  ac_datarootdir_hack='
+  s&@datadir@&$datadir&g
+  s&@docdir@&$docdir&g
+  s&@infodir@&$infodir&g
+  s&@localedir@&$localedir&g
+  s&@mandir@&$mandir&g
+  s&\\\${datarootdir}&$datarootdir&g' ;;
+esac
+_ACEOF
+
+# Neutralize VPATH when `$srcdir' = `.'.
+# Shell code in configure.ac might set extrasub.
+# FIXME: do we really want to maintain this feature?
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
+s&@srcdir@&$ac_srcdir&;t t
+s&@abs_srcdir@&$ac_abs_srcdir&;t t
+s&@top_srcdir@&$ac_top_srcdir&;t t
+s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
+s&@builddir@&$ac_builddir&;t t
+s&@abs_builddir@&$ac_abs_builddir&;t t
+s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
+s&@INSTALL@&$ac_INSTALL&;t t
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&2;}
+
+  rm -f "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`/stamp-h$_am_stamp_count
+ ;;
+
+  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "scripts/gtest-config":F) chmod +x scripts/gtest-config ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$mf" : 'X\(//\)[^/]' \| \
+	 X"$mf" : 'X\(//\)$' \| \
+	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$mf" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$file" : 'X\(//\)[^/]' \| \
+	 X"$file" : 'X\(//\)$' \| \
+	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$file" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)[^/].*/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+      as_dir=$dirpart/$fdir; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded.  So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status.  When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+  ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
+  exec 5>/dev/null
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+  exec 5>>config.log
+  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+  # would make configure fail if this is the last instruction.
+  $ac_cs_success || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/vendor/gtest-1.7.0/configure.ac b/vendor/gtest-1.7.0/configure.ac
new file mode 100644
index 0000000..cc592e1
--- /dev/null
+++ b/vendor/gtest-1.7.0/configure.ac
@@ -0,0 +1,68 @@
+m4_include(m4/acx_pthread.m4)
+
+# At this point, the Xcode project assumes the version string will be three
+# integers separated by periods and surrounded by square brackets (e.g.
+# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
+# between "AC_INIT(" and the closing ")" including comments and strings.
+AC_INIT([Google C++ Testing Framework],
+        [1.7.0],
+        [googletestframework at googlegroups.com],
+        [gtest])
+
+# Provide various options to initialize the Autoconf and configure processes.
+AC_PREREQ([2.59])
+AC_CONFIG_SRCDIR([./LICENSE])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_HEADERS([build-aux/config.h])
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
+
+# Check for programs used in building Google Test.
+AC_PROG_CC
+AC_PROG_CXX
+AC_LANG([C++])
+AC_PROG_LIBTOOL
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+AC_PATH_PROG([PYTHON],[python],[:])
+AS_IF([test "$PYTHON" != ":"],
+      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
+AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
+
+# Configure pthreads.
+AC_ARG_WITH([pthreads],
+            [AS_HELP_STRING([--with-pthreads],
+               [use pthreads (default is yes)])],
+            [with_pthreads=$withval],
+            [with_pthreads=check])
+
+have_pthreads=no
+AS_IF([test "x$with_pthreads" != "xno"],
+      [ACX_PTHREAD(
+        [],
+        [AS_IF([test "x$with_pthreads" != "xcheck"],
+               [AC_MSG_FAILURE(
+                 [--with-pthreads was specified, but unable to be used])])])
+       have_pthreads="$acx_pthread_ok"])
+AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" = "xyes"])
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_LIBS)
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+AC_OUTPUT
diff --git a/vendor/gtest-1.7.0/fused-src/gtest/gtest-all.cc b/vendor/gtest-1.7.0/fused-src/gtest/gtest-all.cc
new file mode 100644
index 0000000..a9a03b2
--- /dev/null
+++ b/vendor/gtest-1.7.0/fused-src/gtest/gtest-all.cc
@@ -0,0 +1,9592 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/fused-src/gtest/gtest.h b/vendor/gtest-1.7.0/fused-src/gtest/gtest.h
new file mode 100644
index 0000000..4f3804f
--- /dev/null
+++ b/vendor/gtest-1.7.0/fused-src/gtest/gtest.h
@@ -0,0 +1,20061 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/vendor/gtest-1.7.0/fused-src/gtest/gtest_main.cc b/vendor/gtest-1.7.0/fused-src/gtest/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/vendor/gtest-1.7.0/fused-src/gtest/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-death-test.h b/vendor/gtest-1.7.0/include/gtest/gtest-death-test.h
new file mode 100644
index 0000000..957a69c
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-death-test.h
@@ -0,0 +1,294 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+#include "gtest/internal/gtest-death-test-internal.h"
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-message.h b/vendor/gtest-1.7.0/include/gtest/gtest-message.h
new file mode 100644
index 0000000..fe879bc
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-message.h
@@ -0,0 +1,250 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+#include "gtest/internal/gtest-port.h"
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h b/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h
new file mode 100644
index 0000000..d6702c8
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h
@@ -0,0 +1,1421 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h.pump b/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
new file mode 100644
index 0000000..2dc9303
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
@@ -0,0 +1,487 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to $n parameters.
+//
+$range i 1..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
+  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
+}
+
+]]
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to $maxtuple arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename Generator$j]]>
+internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
+    $for j, [[const Generator$j& g$j]]) {
+  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
+      $for j, [[g$j]]);
+}
+
+]]
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-printers.h b/vendor/gtest-1.7.0/include/gtest/gtest-printers.h
new file mode 100644
index 0000000..0639d9f
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-printers.h
@@ -0,0 +1,855 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-internal.h"
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-spi.h b/vendor/gtest-1.7.0/include/gtest/gtest-spi.h
new file mode 100644
index 0000000..f63fa9a
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-spi.h
@@ -0,0 +1,232 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include "gtest/gtest.h"
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-test-part.h b/vendor/gtest-1.7.0/include/gtest/gtest-test-part.h
new file mode 100644
index 0000000..77eb844
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-test-part.h
@@ -0,0 +1,179 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest-typed-test.h b/vendor/gtest-1.7.0/include/gtest/gtest-typed-test.h
new file mode 100644
index 0000000..fe1e83b
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest-typed-test.h
@@ -0,0 +1,259 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest.h b/vendor/gtest-1.7.0/include/gtest/gtest.h
new file mode 100644
index 0000000..6fa0a39
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest.h
@@ -0,0 +1,2291 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest-message.h"
+#include "gtest/gtest-param-test.h"
+#include "gtest/gtest-printers.h"
+#include "gtest/gtest_prod.h"
+#include "gtest/gtest-test-part.h"
+#include "gtest/gtest-typed-test.h"
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+#include "gtest/gtest_pred_impl.h"
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest_pred_impl.h b/vendor/gtest-1.7.0/include/gtest/gtest_pred_impl.h
new file mode 100644
index 0000000..30ae712
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest_pred_impl.h
@@ -0,0 +1,358 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/gtest_prod.h b/vendor/gtest-1.7.0/include/gtest/gtest_prod.h
new file mode 100644
index 0000000..da80ddc
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/gtest_prod.h
@@ -0,0 +1,58 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
new file mode 100644
index 0000000..2b3a78f
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
@@ -0,0 +1,319 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-internal.h"
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-filepath.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
new file mode 100644
index 0000000..7a13b4b
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
@@ -0,0 +1,206 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-internal.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-internal.h
new file mode 100644
index 0000000..0dcc3a3
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-internal.h
@@ -0,0 +1,1158 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
new file mode 100644
index 0000000..b1362cd
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
@@ -0,0 +1,233 @@
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
new file mode 100644
index 0000000..e805485
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
@@ -0,0 +1,5143 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
new file mode 100644
index 0000000..009206f
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
@@ -0,0 +1,301 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most $n arguments in Values,
+// and at most $maxtuple arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at $maxtuple.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+$range i 2..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+class ValueArray$i {
+ public:
+  ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray$i& other);
+
+$for j [[
+
+  const T$j v$(j)_;
+]]
+
+};
+
+]]
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+$range k 2..i
+
+template <$for j, [[typename T$j]]>
+class CartesianProductGenerator$i
+    : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
+ public:
+  typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
+
+  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  virtual ~CartesianProductGenerator$i() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
+
+      const ParamGenerator<T$j>& g$j,
+      const typename ParamGenerator<T$j>::iterator& current$(j)]])
+        : base_(base),
+$for j, [[
+
+          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
+]]    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current$(i)_;
+
+$for k [[
+      if (current$(i+2-k)_ == end$(i+2-k)_) {
+        current$(i+2-k)_ = begin$(i+2-k)_;
+        ++current$(i+2-k-1)_;
+      }
+
+]]
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         ($for j  && [[
+
+          current$(j)_ == typed_other->current$(j)_
+]]);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_), $for j, [[
+
+        begin$(j)_(other.begin$(j)_),
+        end$(j)_(other.end$(j)_),
+        current$(j)_(other.current$(j)_)
+]] {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType($for j, [[*current$(j)_]]);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+$for j  || [[
+
+          current$(j)_ == end$(j)_
+]];
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+$for j [[
+
+    const typename ParamGenerator<T$j>::iterator begin$(j)_;
+    const typename ParamGenerator<T$j>::iterator end$(j)_;
+    typename ParamGenerator<T$j>::iterator current$(j)_;
+]]
+
+    ParamType current_value_;
+  };  // class CartesianProductGenerator$i::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator$i& other);
+
+
+$for j [[
+  const ParamGenerator<T$j> g$(j)_;
+
+]]
+};  // class CartesianProductGenerator$i
+
+
+]]
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[class Generator$j]]>
+class CartesianProductHolder$i {
+ public:
+CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  template <$for j, [[typename T$j]]>
+  operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
+    return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
+        new CartesianProductGenerator$i<$for j, [[T$j]]>(
+$for j,[[
+
+        static_cast<ParamGenerator<T$j> >(g$(j)_)
+]]));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder$i& other);
+
+
+$for j [[
+  const Generator$j g$(j)_;
+
+]]
+};  // class CartesianProductHolder$i
+
+]]
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
new file mode 100644
index 0000000..d5e1028
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
@@ -0,0 +1,619 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-linked_ptr.h"
+#include "gtest/internal/gtest-port.h"
+#include "gtest/gtest-printers.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-port.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-port.h
new file mode 100644
index 0000000..7a485c4
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-port.h
@@ -0,0 +1,1948 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+#  include "gtest/internal/gtest-tuple.h"
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = \
+    { PTHREAD_MUTEX_INITIALIZER, false, pthread_t() }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-string.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-string.h
new file mode 100644
index 0000000..97f1a7f
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-string.h
@@ -0,0 +1,167 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
new file mode 100644
index 0000000..7b3dfc3
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
@@ -0,0 +1,1012 @@
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump b/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
new file mode 100644
index 0000000..c7d9e03
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
@@ -0,0 +1,339 @@
+$$ -*- mode: c++; -*-
+$var n = 10  $$ Maximum number of tuple fields we want to support.
+$$ This meta comment fixes auto-indentation in Emacs. }}
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+
+$range i 0..n-1
+$range j 0..n
+$range k 1..n
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+
+$for k [[
+$range m 0..k-1
+$range m2 k..n-1
+#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
+
+]]
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+
+$for j [[
+$range m 0..j-1
+#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
+
+
+]]
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <$for i, [[typename T$i = void]]>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+
+$for i [[
+template <GTEST_$(n)_TYPENAMES_(T)>
+struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {
+  typedef T$i type;
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+
+$for k [[
+$range m 0..k-1
+template <GTEST_$(k)_TYPENAMES_(T)>
+class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : $for m, [[f$(m)_()]] {}
+
+  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]
+$for m, [[f$(m)_(f$m)]] {}
+
+  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+]]
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+]]
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {
+
+$for m [[
+    f$(m)_ = t.f$(m)_;
+
+]]
+    return *this;
+  }
+
+
+$for m [[
+  T$m f$(m)_;
+
+]]
+};
+
+
+]]
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+$for k [[
+$range m 0..k-1
+
+template <GTEST_$(k)_TYPENAMES_(T)>
+inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {
+  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);
+}
+
+]]
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+
+$for j [[
+template <GTEST_$(j)_TYPENAMES_(T)>
+struct tuple_size<GTEST_$(j)_TUPLE_(T) > {
+  static const int value = $j;
+};
+
+
+]]
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+
+$for i [[
+template <>
+class Get<$i> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  ConstField(const Tuple& t) { return t.f$(i)_; }
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
+get(GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))
+get(const GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,
+      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+
+$for j [[
+#undef GTEST_$(j)_TUPLE_
+
+]]
+
+
+$for j [[
+#undef GTEST_$(j)_TYPENAMES_
+
+]]
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h b/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
new file mode 100644
index 0000000..e46f7cf
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
@@ -0,0 +1,3331 @@
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump b/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
new file mode 100644
index 0000000..251fdf0
--- /dev/null
+++ b/vendor/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
@@ -0,0 +1,297 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of type lists we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most $n types in a list, and at most $n
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[typename T$j]]>
+struct Types$i {
+  typedef T1 Head;
+  typedef Types$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+
+$range i 1..n
+template <$for i, [[typename T$i = internal::None]]>
+struct Types {
+  typedef internal::Types$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Types<$for i, [[internal::None]]> {
+  typedef internal::Types0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[typename T$j]]>
+struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
+  typedef internal::Types$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates$i {
+  typedef TemplateSel<T1> Head;
+  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+
+$range i 1..n
+template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
+struct Templates {
+  typedef Templates$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Templates<$for i, [[NoneT]]> {
+  typedef Templates0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
+  typedef Templates$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+
+$range i 1..n
+template <$for i, [[typename T$i]]>
+struct TypeList<Types<$for i, [[T$i]]> > {
+  typedef typename Types<$for i, [[T$i]]>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/vendor/gtest-1.7.0/m4/acx_pthread.m4 b/vendor/gtest-1.7.0/m4/acx_pthread.m4
new file mode 100644
index 0000000..2cf20de
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/acx_pthread.m4
@@ -0,0 +1,363 @@
+# This was retrieved from
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
+# See also (perhaps for new versions?)
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
+#
+# We've rewritten the inconsistency check code (from avahi), to work
+# more broadly.  In particular, it no longer assumes ld accepts -zdefs.
+# This caused a restructing of the code, but the functionality has only
+# changed a little.
+
+dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+dnl
+dnl @summary figure out how to build C programs using POSIX threads
+dnl
+dnl This macro figures out how to build C programs using POSIX threads.
+dnl It sets the PTHREAD_LIBS output variable to the threads library and
+dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
+dnl C compiler flags that are needed. (The user can also force certain
+dnl compiler flags/libs to be tested by setting these environment
+dnl variables.)
+dnl
+dnl Also sets PTHREAD_CC to any special C compiler that is needed for
+dnl multi-threaded programs (defaults to the value of CC otherwise).
+dnl (This is necessary on AIX to use the special cc_r compiler alias.)
+dnl
+dnl NOTE: You are assumed to not only compile your program with these
+dnl flags, but also link it with them as well. e.g. you should link
+dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
+dnl $LIBS
+dnl
+dnl If you are only building threads programs, you may wish to use
+dnl these variables in your default LIBS, CFLAGS, and CC:
+dnl
+dnl        LIBS="$PTHREAD_LIBS $LIBS"
+dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+dnl        CC="$PTHREAD_CC"
+dnl
+dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
+dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+dnl
+dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
+dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
+dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
+dnl default action will define HAVE_PTHREAD.
+dnl
+dnl Please let the authors know if this macro fails on any platform, or
+dnl if you have any other suggestions or comments. This macro was based
+dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
+dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
+dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
+dnl We are also grateful for the helpful feedback of numerous users.
+dnl
+dnl @category InstalledPackages
+dnl @author Steven G. Johnson <stevenj at alum.mit.edu>
+dnl @version 2006-05-29
+dnl @license GPLWithACException
+dnl 
+dnl Checks for GCC shared/pthread inconsistency based on work by
+dnl Marcin Owsiany <marcin at owsiany.pl>
+
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	AC_MSG_CHECKING([for joinable pthread attribute])
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
+                        [attr_name=$attr; break])
+	done
+        AC_MSG_RESULT($attr_name)
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+                               [Define to necessary symbol if this constant
+                                uses a non-standard name on your system.])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+	
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+	
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+	
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+	
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
+	   AC_TRY_LINK(,, , [done=yes])
+	
+	   if test "x$done" = xyes ; then
+	      AC_MSG_RESULT([no])
+	   else
+	      AC_MSG_RESULT([yes])
+	   fi
+	fi
+	
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	   
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lpthread fixes that])
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lc_r fixes that])
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	       [pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	       [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
+	
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+	
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
diff --git a/vendor/gtest-1.7.0/m4/gtest.m4 b/vendor/gtest-1.7.0/m4/gtest.m4
new file mode 100644
index 0000000..6598ba7
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/gtest.m4
@@ -0,0 +1,74 @@
+dnl GTEST_LIB_CHECK([minimum version [,
+dnl                  action if found [,action if not found]]])
+dnl
+dnl Check for the presence of the Google Test library, optionally at a minimum
+dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
+dnl standard variables for substitution including GTEST_CPPFLAGS,
+dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
+dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
+dnl optional custom action slots in the event GTEST is found or not.
+AC_DEFUN([GTEST_LIB_CHECK],
+[
+dnl Provide a flag to enable or disable Google Test usage.
+AC_ARG_ENABLE([gtest],
+  [AS_HELP_STRING([--enable-gtest],
+                  [Enable tests using the Google C++ Testing Framework.
+                  (Default is enabled.)])],
+  [],
+  [enable_gtest=])
+AC_ARG_VAR([GTEST_CONFIG],
+           [The exact path of Google Test's 'gtest-config' script.])
+AC_ARG_VAR([GTEST_CPPFLAGS],
+           [C-like preprocessor flags for Google Test.])
+AC_ARG_VAR([GTEST_CXXFLAGS],
+           [C++ compile flags for Google Test.])
+AC_ARG_VAR([GTEST_LDFLAGS],
+           [Linker path and option flags for Google Test.])
+AC_ARG_VAR([GTEST_LIBS],
+           [Library linking flags for Google Test.])
+AC_ARG_VAR([GTEST_VERSION],
+           [The version of Google Test available.])
+HAVE_GTEST="no"
+AS_IF([test "x${enable_gtest}" != "xno"],
+  [AC_MSG_CHECKING([for 'gtest-config'])
+   AS_IF([test "x${enable_gtest}" != "xyes"],
+     [AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
+      AS_IF([test -x "${GTEST_CONFIG}"], [],
+        [AC_MSG_RESULT([no])
+         AC_MSG_ERROR([dnl
+Unable to locate either a built or installed Google Test.
+The specific location '${enable_gtest}' was provided for a built or installed
+Google Test, but no 'gtest-config' script could be found at this location.])
+         ])],
+     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
+   AS_IF([test -x "${GTEST_CONFIG}"],
+     [AC_MSG_RESULT([${GTEST_CONFIG}])
+      m4_ifval([$1],
+        [_gtest_min_version="--min-version=$1"
+         AC_MSG_CHECKING([for Google Test at least version >= $1])],
+        [_gtest_min_version="--min-version=0"
+         AC_MSG_CHECKING([for Google Test])])
+      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
+        [AC_MSG_RESULT([yes])
+         HAVE_GTEST='yes'],
+        [AC_MSG_RESULT([no])])],
+     [AC_MSG_RESULT([no])])
+   AS_IF([test "x${HAVE_GTEST}" = "xyes"],
+     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
+      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
+      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
+      GTEST_LIBS=`${GTEST_CONFIG} --libs`
+      GTEST_VERSION=`${GTEST_CONFIG} --version`
+      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
+     [AS_IF([test "x${enable_gtest}" = "xyes"],
+        [AC_MSG_ERROR([dnl
+Google Test was enabled, but no viable version could be found.])
+         ])])])
+AC_SUBST([HAVE_GTEST])
+AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
+AS_IF([test "x$HAVE_GTEST" = "xyes"],
+  [m4_ifval([$2], [$2])],
+  [m4_ifval([$3], [$3])])
+])
diff --git a/vendor/gtest-1.7.0/m4/libtool.m4 b/vendor/gtest-1.7.0/m4/libtool.m4
new file mode 100644
index 0000000..828104c
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/libtool.m4
@@ -0,0 +1,8001 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/vendor/gtest-1.7.0/m4/ltoptions.m4 b/vendor/gtest-1.7.0/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 7 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/vendor/gtest-1.7.0/m4/ltsugar.m4 b/vendor/gtest-1.7.0/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/vendor/gtest-1.7.0/m4/ltversion.m4 b/vendor/gtest-1.7.0/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/vendor/gtest-1.7.0/m4/lt~obsolete.m4 b/vendor/gtest-1.7.0/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/vendor/gtest-1.7.0/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/vendor/gtest-1.7.0/msvc/gtest-md.vcproj b/vendor/gtest-1.7.0/msvc/gtest-md.vcproj
new file mode 100755
index 0000000..1c1496c
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest-md.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest-md"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest.vcproj b/vendor/gtest-1.7.0/msvc/gtest.vcproj
new file mode 100755
index 0000000..449e7e0
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj b/vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj
new file mode 100755
index 0000000..d00956c
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_main-md.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main-md"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+			Name="gtest-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_main.vcproj b/vendor/gtest-1.7.0/msvc/gtest_main.vcproj
new file mode 100755
index 0000000..e7e9f41
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_main.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+			Name="gtest"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj b/vendor/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
new file mode 100755
index 0000000..4071d28
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test-md"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_prod_test.vcproj b/vendor/gtest-1.7.0/msvc/gtest_prod_test.vcproj
new file mode 100755
index 0000000..998c758
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_prod_test.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_unittest-md.vcproj b/vendor/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
new file mode 100755
index 0000000..1525939
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest-md"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj b/vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj
new file mode 100755
index 0000000..2b2d743
--- /dev/null
+++ b/vendor/gtest-1.7.0/msvc/gtest_unittest.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/vendor/gtest-1.7.0/samples/prime_tables.h b/vendor/gtest-1.7.0/samples/prime_tables.h
new file mode 100644
index 0000000..92ce16a
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/prime_tables.h
@@ -0,0 +1,123 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+// Author: vladl at google.com (Vlad Losev)
+
+// This provides interface PrimeTable that determines whether a number is a
+// prime and determines a next prime number. This interface is used
+// in Google Test samples demonstrating use of parameterized tests.
+
+#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
+#define GTEST_SAMPLES_PRIME_TABLES_H_
+
+#include <algorithm>
+
+// The prime table interface.
+class PrimeTable {
+ public:
+  virtual ~PrimeTable() {}
+
+  // Returns true iff n is a prime number.
+  virtual bool IsPrime(int n) const = 0;
+
+  // Returns the smallest prime number greater than p; or returns -1
+  // if the next prime is beyond the capacity of the table.
+  virtual int GetNextPrime(int p) const = 0;
+};
+
+// Implementation #1 calculates the primes on-the-fly.
+class OnTheFlyPrimeTable : public PrimeTable {
+ public:
+  virtual bool IsPrime(int n) const {
+    if (n <= 1) return false;
+
+    for (int i = 2; i*i <= n; i++) {
+      // n is divisible by an integer other than 1 and itself.
+      if ((n % i) == 0) return false;
+    }
+
+    return true;
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n > 0; n++) {
+      if (IsPrime(n)) return n;
+    }
+
+    return -1;
+  }
+};
+
+// Implementation #2 pre-calculates the primes and stores the result
+// in an array.
+class PreCalculatedPrimeTable : public PrimeTable {
+ public:
+  // 'max' specifies the maximum number the prime table holds.
+  explicit PreCalculatedPrimeTable(int max)
+      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
+    CalculatePrimesUpTo(max);
+  }
+  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
+
+  virtual bool IsPrime(int n) const {
+    return 0 <= n && n < is_prime_size_ && is_prime_[n];
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n < is_prime_size_; n++) {
+      if (is_prime_[n]) return n;
+    }
+
+    return -1;
+  }
+
+ private:
+  void CalculatePrimesUpTo(int max) {
+    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
+    is_prime_[0] = is_prime_[1] = false;
+
+    for (int i = 2; i <= max; i++) {
+      if (!is_prime_[i]) continue;
+
+      // Marks all multiples of i (except i itself) as non-prime.
+      for (int j = 2*i; j <= max; j += i) {
+        is_prime_[j] = false;
+      }
+    }
+  }
+
+  const int is_prime_size_;
+  bool* const is_prime_;
+
+  // Disables compiler warning "assignment operator could not be generated."
+  void operator=(const PreCalculatedPrimeTable& rhs);
+};
+
+#endif  // GTEST_SAMPLES_PRIME_TABLES_H_
diff --git a/vendor/gtest-1.7.0/samples/sample1.cc b/vendor/gtest-1.7.0/samples/sample1.cc
new file mode 100644
index 0000000..f171e26
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample1.cc
@@ -0,0 +1,68 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample1.h"
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n) {
+  int result = 1;
+  for (int i = 1; i <= n; i++) {
+    result *= i;
+  }
+
+  return result;
+}
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n) {
+  // Trivial case 1: small numbers
+  if (n <= 1) return false;
+
+  // Trivial case 2: even numbers
+  if (n % 2 == 0) return n == 2;
+
+  // Now, we have that n is odd and n >= 3.
+
+  // Try to divide n by every odd number i, starting from 3
+  for (int i = 3; ; i += 2) {
+    // We only have to try i up to the squre root of n
+    if (i > n/i) break;
+
+    // Now, we have i <= n/i < n.
+    // If n is divisible by i, n is not prime.
+    if (n % i == 0) return false;
+  }
+
+  // n has no integer factor in the range (1, n), and thus is prime.
+  return true;
+}
diff --git a/vendor/gtest-1.7.0/samples/sample1.h b/vendor/gtest-1.7.0/samples/sample1.h
new file mode 100644
index 0000000..3dfeb98
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample1.h
@@ -0,0 +1,43 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE1_H_
+#define GTEST_SAMPLES_SAMPLE1_H_
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n);
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n);
+
+#endif  // GTEST_SAMPLES_SAMPLE1_H_
diff --git a/vendor/gtest-1.7.0/samples/sample10_unittest.cc b/vendor/gtest-1.7.0/samples/sample10_unittest.cc
new file mode 100644
index 0000000..0051cd5
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample10_unittest.cc
@@ -0,0 +1,144 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// a primitive leak checker.
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// We will track memory used by this class.
+class Water {
+ public:
+  // Normal Water declarations go here.
+
+  // operator new and operator delete help us control water allocation.
+  void* operator new(size_t allocation_size) {
+    allocated_++;
+    return malloc(allocation_size);
+  }
+
+  void operator delete(void* block, size_t /* allocation_size */) {
+    allocated_--;
+    free(block);
+  }
+
+  static int allocated() { return allocated_; }
+
+ private:
+  static int allocated_;
+};
+
+int Water::allocated_ = 0;
+
+// This event listener monitors how many Water objects are created and
+// destroyed by each test, and reports a failure if a test leaks some Water
+// objects. It does this by comparing the number of live Water objects at
+// the beginning of a test and at the end of a test.
+class LeakChecker : public EmptyTestEventListener {
+ private:
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& /* test_info */) {
+    initially_allocated_ = Water::allocated();
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& /* test_info */) {
+    int difference = Water::allocated() - initially_allocated_;
+
+    // You can generate a failure in any event handler except
+    // OnTestPartResult. Just use an appropriate Google Test assertion to do
+    // it.
+    EXPECT_LE(difference, 0) << "Leaked " << difference << " unit(s) of Water!";
+  }
+
+  int initially_allocated_;
+};
+
+TEST(ListenersTest, DoesNotLeak) {
+  Water* water = new Water;
+  delete water;
+}
+
+// This should fail when the --check_for_leaks command line flag is
+// specified.
+TEST(ListenersTest, LeaksWater) {
+  Water* water = new Water;
+  EXPECT_TRUE(water != NULL);
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool check_for_leaks = false;
+  if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
+    check_for_leaks = true;
+  else
+    printf("%s\n", "Run this program with --check_for_leaks to enable "
+           "custom leak checking in the tests.");
+
+  // If we are given the --check_for_leaks command line flag, installs the
+  // leak checker.
+  if (check_for_leaks) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+
+    // Adds the leak checker to the end of the test event listener list,
+    // after the default text output printer and the default XML report
+    // generator.
+    //
+    // The order is important - it ensures that failures generated in the
+    // leak checker's OnTestEnd() method are processed by the text and XML
+    // printers *before* their OnTestEnd() methods are called, such that
+    // they are attributed to the right test. Remember that a listener
+    // receives an OnXyzStart event *after* listeners preceding it in the
+    // list received that event, and receives an OnXyzEnd event *before*
+    // listeners preceding it.
+    //
+    // We don't need to worry about deleting the new listener later, as
+    // Google Test will do it.
+    listeners.Append(new LeakChecker);
+  }
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/samples/sample1_unittest.cc b/vendor/gtest-1.7.0/samples/sample1_unittest.cc
new file mode 100644
index 0000000..aefc4f1
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample1_unittest.cc
@@ -0,0 +1,153 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a simple unit test for a function,
+// using Google C++ testing framework.
+//
+// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
+
+
+// Step 1. Include necessary header files such that the stuff your
+// test logic needs is declared.
+//
+// Don't forget gtest.h, which declares the testing framework.
+
+#include <limits.h>
+#include "sample1.h"
+#include "gtest/gtest.h"
+
+
+// Step 2. Use the TEST macro to define your tests.
+//
+// TEST has two parameters: the test case name and the test name.
+// After using the macro, you should define your test logic between a
+// pair of braces.  You can use a bunch of macros to indicate the
+// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are
+// examples of such macros.  For a complete list, see gtest.h.
+//
+// <TechnicalDetails>
+//
+// In Google Test, tests are grouped into test cases.  This is how we
+// keep test code organized.  You should put logically related tests
+// into the same test case.
+//
+// The test case name and the test name should both be valid C++
+// identifiers.  And you should not use underscore (_) in the names.
+//
+// Google Test guarantees that each test you define is run exactly
+// once, but it makes no guarantee on the order the tests are
+// executed.  Therefore, you should write your tests in such a way
+// that their results don't depend on their order.
+//
+// </TechnicalDetails>
+
+
+// Tests Factorial().
+
+// Tests factorial of negative numbers.
+TEST(FactorialTest, Negative) {
+  // This test is named "Negative", and belongs to the "FactorialTest"
+  // test case.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // <TechnicalDetails>
+  //
+  // EXPECT_EQ(expected, actual) is the same as
+  //
+  //   EXPECT_TRUE((expected) == (actual))
+  //
+  // except that it will print both the expected value and the actual
+  // value when the assertion fails.  This is very helpful for
+  // debugging.  Therefore in this case EXPECT_EQ is preferred.
+  //
+  // On the other hand, EXPECT_TRUE accepts any Boolean expression,
+  // and is thus more general.
+  //
+  // </TechnicalDetails>
+}
+
+// Tests factorial of 0.
+TEST(FactorialTest, Zero) {
+  EXPECT_EQ(1, Factorial(0));
+}
+
+// Tests factorial of positive numbers.
+TEST(FactorialTest, Positive) {
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+
+// Tests negative input.
+TEST(IsPrimeTest, Negative) {
+  // This test belongs to the IsPrimeTest test case.
+
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+}
+
+// Tests some trivial cases.
+TEST(IsPrimeTest, Trivial) {
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+}
+
+// Tests positive input.
+TEST(IsPrimeTest, Positive) {
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+// Step 3. Call RUN_ALL_TESTS() in main().
+//
+// We do this by linking in src/gtest_main.cc file, which consists of
+// a main() function which calls RUN_ALL_TESTS() for us.
+//
+// This runs all the tests you've defined, prints the result, and
+// returns 0 if successful, or 1 otherwise.
+//
+// Did you notice that we didn't register the tests?  The
+// RUN_ALL_TESTS() macro magically knows about all the tests we
+// defined.  Isn't this convenient?
diff --git a/vendor/gtest-1.7.0/samples/sample2.cc b/vendor/gtest-1.7.0/samples/sample2.cc
new file mode 100644
index 0000000..5f763b9
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample2.cc
@@ -0,0 +1,56 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample2.h"
+
+#include <string.h>
+
+// Clones a 0-terminated C string, allocating memory using new.
+const char* MyString::CloneCString(const char* a_c_string) {
+  if (a_c_string == NULL) return NULL;
+
+  const size_t len = strlen(a_c_string);
+  char* const clone = new char[ len + 1 ];
+  memcpy(clone, a_c_string, len + 1);
+
+  return clone;
+}
+
+// Sets the 0-terminated C string this MyString object
+// represents.
+void MyString::Set(const char* a_c_string) {
+  // Makes sure this works when c_string == c_string_
+  const char* const temp = MyString::CloneCString(a_c_string);
+  delete[] c_string_;
+  c_string_ = temp;
+}
diff --git a/vendor/gtest-1.7.0/samples/sample2.h b/vendor/gtest-1.7.0/samples/sample2.h
new file mode 100644
index 0000000..cb485c7
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample2.h
@@ -0,0 +1,85 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE2_H_
+#define GTEST_SAMPLES_SAMPLE2_H_
+
+#include <string.h>
+
+
+// A simple string class.
+class MyString {
+ private:
+  const char* c_string_;
+  const MyString& operator=(const MyString& rhs);
+
+ public:
+  // Clones a 0-terminated C string, allocating memory using new.
+  static const char* CloneCString(const char* a_c_string);
+
+  ////////////////////////////////////////////////////////////
+  //
+  // C'tors
+
+  // The default c'tor constructs a NULL string.
+  MyString() : c_string_(NULL) {}
+
+  // Constructs a MyString by cloning a 0-terminated C string.
+  explicit MyString(const char* a_c_string) : c_string_(NULL) {
+    Set(a_c_string);
+  }
+
+  // Copy c'tor
+  MyString(const MyString& string) : c_string_(NULL) {
+    Set(string.c_string_);
+  }
+
+  ////////////////////////////////////////////////////////////
+  //
+  // D'tor.  MyString is intended to be a final class, so the d'tor
+  // doesn't need to be virtual.
+  ~MyString() { delete[] c_string_; }
+
+  // Gets the 0-terminated C string this MyString object represents.
+  const char* c_string() const { return c_string_; }
+
+  size_t Length() const {
+    return c_string_ == NULL ? 0 : strlen(c_string_);
+  }
+
+  // Sets the 0-terminated C string this MyString object represents.
+  void Set(const char* c_string);
+};
+
+
+#endif  // GTEST_SAMPLES_SAMPLE2_H_
diff --git a/vendor/gtest-1.7.0/samples/sample2_unittest.cc b/vendor/gtest-1.7.0/samples/sample2_unittest.cc
new file mode 100644
index 0000000..4fa19b7
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample2_unittest.cc
@@ -0,0 +1,109 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a more complex unit test for a class
+// that has multiple member functions.
+//
+// Usually, it's a good idea to have one test for each method in your
+// class.  You don't have to do that exactly, but it helps to keep
+// your tests organized.  You may also throw in additional tests as
+// needed.
+
+#include "sample2.h"
+#include "gtest/gtest.h"
+
+// In this example, we test the MyString class (a simple string).
+
+// Tests the default c'tor.
+TEST(MyString, DefaultConstructor) {
+  const MyString s;
+
+  // Asserts that s.c_string() returns NULL.
+  //
+  // <TechnicalDetails>
+  //
+  // If we write NULL instead of
+  //
+  //   static_cast<const char *>(NULL)
+  //
+  // in this assertion, it will generate a warning on gcc 3.4.  The
+  // reason is that EXPECT_EQ needs to know the types of its
+  // arguments in order to print them when it fails.  Since NULL is
+  // #defined as 0, the compiler will use the formatter function for
+  // int to print it.  However, gcc thinks that NULL should be used as
+  // a pointer, not an int, and therefore complains.
+  //
+  // The root of the problem is C++'s lack of distinction between the
+  // integer number 0 and the null pointer constant.  Unfortunately,
+  // we have to live with this fact.
+  //
+  // </TechnicalDetails>
+  EXPECT_STREQ(NULL, s.c_string());
+
+  EXPECT_EQ(0u, s.Length());
+}
+
+const char kHelloString[] = "Hello, world!";
+
+// Tests the c'tor that accepts a C string.
+TEST(MyString, ConstructorFromCString) {
+  const MyString s(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
+            s.Length());
+}
+
+// Tests the copy c'tor.
+TEST(MyString, CopyConstructor) {
+  const MyString s1(kHelloString);
+  const MyString s2 = s1;
+  EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
+}
+
+// Tests the Set method.
+TEST(MyString, Set) {
+  MyString s;
+
+  s.Set(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Set should work when the input pointer is the same as the one
+  // already in the MyString object.
+  s.Set(s.c_string());
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Can we set the MyString to NULL?
+  s.Set(NULL);
+  EXPECT_STREQ(NULL, s.c_string());
+}
diff --git a/vendor/gtest-1.7.0/samples/sample3-inl.h b/vendor/gtest-1.7.0/samples/sample3-inl.h
new file mode 100644
index 0000000..7e3084d
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample3-inl.h
@@ -0,0 +1,172 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
+#define GTEST_SAMPLES_SAMPLE3_INL_H_
+
+#include <stddef.h>
+
+
+// Queue is a simple queue implemented as a singled-linked list.
+//
+// The element type must support copy constructor.
+template <typename E>  // E is the element type
+class Queue;
+
+// QueueNode is a node in a Queue, which consists of an element of
+// type E and a pointer to the next node.
+template <typename E>  // E is the element type
+class QueueNode {
+  friend class Queue<E>;
+
+ public:
+  // Gets the element in this node.
+  const E& element() const { return element_; }
+
+  // Gets the next node in the queue.
+  QueueNode* next() { return next_; }
+  const QueueNode* next() const { return next_; }
+
+ private:
+  // Creates a node with a given element value.  The next pointer is
+  // set to NULL.
+  explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}
+
+  // We disable the default assignment operator and copy c'tor.
+  const QueueNode& operator = (const QueueNode&);
+  QueueNode(const QueueNode&);
+
+  E element_;
+  QueueNode* next_;
+};
+
+template <typename E>  // E is the element type.
+class Queue {
+ public:
+  // Creates an empty queue.
+  Queue() : head_(NULL), last_(NULL), size_(0) {}
+
+  // D'tor.  Clears the queue.
+  ~Queue() { Clear(); }
+
+  // Clears the queue.
+  void Clear() {
+    if (size_ > 0) {
+      // 1. Deletes every node.
+      QueueNode<E>* node = head_;
+      QueueNode<E>* next = node->next();
+      for (; ;) {
+        delete node;
+        node = next;
+        if (node == NULL) break;
+        next = node->next();
+      }
+
+      // 2. Resets the member variables.
+      head_ = last_ = NULL;
+      size_ = 0;
+    }
+  }
+
+  // Gets the number of elements.
+  size_t Size() const { return size_; }
+
+  // Gets the first element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Head() { return head_; }
+  const QueueNode<E>* Head() const { return head_; }
+
+  // Gets the last element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Last() { return last_; }
+  const QueueNode<E>* Last() const { return last_; }
+
+  // Adds an element to the end of the queue.  A copy of the element is
+  // created using the copy constructor, and then stored in the queue.
+  // Changes made to the element in the queue doesn't affect the source
+  // object, and vice versa.
+  void Enqueue(const E& element) {
+    QueueNode<E>* new_node = new QueueNode<E>(element);
+
+    if (size_ == 0) {
+      head_ = last_ = new_node;
+      size_ = 1;
+    } else {
+      last_->next_ = new_node;
+      last_ = new_node;
+      size_++;
+    }
+  }
+
+  // Removes the head of the queue and returns it.  Returns NULL if
+  // the queue is empty.
+  E* Dequeue() {
+    if (size_ == 0) {
+      return NULL;
+    }
+
+    const QueueNode<E>* const old_head = head_;
+    head_ = head_->next_;
+    size_--;
+    if (size_ == 0) {
+      last_ = NULL;
+    }
+
+    E* element = new E(old_head->element());
+    delete old_head;
+
+    return element;
+  }
+
+  // Applies a function/functor on each element of the queue, and
+  // returns the result in a new queue.  The original queue is not
+  // affected.
+  template <typename F>
+  Queue* Map(F function) const {
+    Queue* new_queue = new Queue();
+    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
+      new_queue->Enqueue(function(node->element()));
+    }
+
+    return new_queue;
+  }
+
+ private:
+  QueueNode<E>* head_;  // The first node of the queue.
+  QueueNode<E>* last_;  // The last node of the queue.
+  size_t size_;  // The number of elements in the queue.
+
+  // We disallow copying a queue.
+  Queue(const Queue&);
+  const Queue& operator = (const Queue&);
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_
diff --git a/vendor/gtest-1.7.0/samples/sample3_unittest.cc b/vendor/gtest-1.7.0/samples/sample3_unittest.cc
new file mode 100644
index 0000000..bf3877d
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample3_unittest.cc
@@ -0,0 +1,151 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// In this example, we use a more advanced feature of Google Test called
+// test fixture.
+//
+// A test fixture is a place to hold objects and functions shared by
+// all tests in a test case.  Using a test fixture avoids duplicating
+// the test code necessary to initialize and cleanup those common
+// objects for each test.  It is also useful for defining sub-routines
+// that your tests need to invoke a lot.
+//
+// <TechnicalDetails>
+//
+// The tests share the test fixture in the sense of code sharing, not
+// data sharing.  Each test is given its own fresh copy of the
+// fixture.  You cannot expect the data modified by one test to be
+// passed on to another test, which is a bad idea.
+//
+// The reason for this design is that tests should be independent and
+// repeatable.  In particular, a test should not fail as the result of
+// another test's failure.  If one test depends on info produced by
+// another test, then the two tests should really be one big test.
+//
+// The macros for indicating the success/failure of a test
+// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
+// (when Google Test prints the test result, it tells you which test
+// each failure belongs to).  Technically, these macros invoke a
+// member function of the Test class.  Therefore, you cannot use them
+// in a global function.  That's why you should put test sub-routines
+// in a test fixture.
+//
+// </TechnicalDetails>
+
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+
+// To use a test fixture, derive a class from testing::Test.
+class QueueTest : public testing::Test {
+ protected:  // You should make the members protected s.t. they can be
+             // accessed from sub-classes.
+
+  // virtual void SetUp() will be called before each test is run.  You
+  // should define it if you need to initialize the varaibles.
+  // Otherwise, this can be skipped.
+  virtual void SetUp() {
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // virtual void TearDown() will be called after each test is run.
+  // You should define it if there is cleanup work to do.  Otherwise,
+  // you don't have to provide it.
+  //
+  // virtual void TearDown() {
+  // }
+
+  // A helper function that some test uses.
+  static int Double(int n) {
+    return 2*n;
+  }
+
+  // A helper function for testing Queue::Map().
+  void MapTester(const Queue<int> * q) {
+    // Creates a new queue, where each element is twice as big as the
+    // corresponding one in q.
+    const Queue<int> * const new_q = q->Map(Double);
+
+    // Verifies that the new queue has the same size as q.
+    ASSERT_EQ(q->Size(), new_q->Size());
+
+    // Verifies the relationship between the elements of the two queues.
+    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
+          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
+      EXPECT_EQ(2 * n1->element(), n2->element());
+    }
+
+    delete new_q;
+  }
+
+  // Declares the variables your tests want to use.
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+// When you have a test fixture, you define a test using TEST_F
+// instead of TEST.
+
+// Tests the default c'tor.
+TEST_F(QueueTest, DefaultConstructor) {
+  // You can access data in the test fixture here.
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int * n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// Tests the Queue::Map() function.
+TEST_F(QueueTest, Map) {
+  MapTester(&q0_);
+  MapTester(&q1_);
+  MapTester(&q2_);
+}
diff --git a/vendor/gtest-1.7.0/samples/sample4.cc b/vendor/gtest-1.7.0/samples/sample4.cc
new file mode 100644
index 0000000..ae44bda
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample4.cc
@@ -0,0 +1,46 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <stdio.h>
+
+#include "sample4.h"
+
+// Returns the current counter value, and increments it.
+int Counter::Increment() {
+  return counter_++;
+}
+
+// Prints the current counter value to STDOUT.
+void Counter::Print() const {
+  printf("%d", counter_);
+}
diff --git a/vendor/gtest-1.7.0/samples/sample4.h b/vendor/gtest-1.7.0/samples/sample4.h
new file mode 100644
index 0000000..cd60f0d
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample4.h
@@ -0,0 +1,53 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE4_H_
+#define GTEST_SAMPLES_SAMPLE4_H_
+
+// A simple monotonic counter.
+class Counter {
+ private:
+  int counter_;
+
+ public:
+  // Creates a counter that starts at 0.
+  Counter() : counter_(0) {}
+
+  // Returns the current counter value, and increments it.
+  int Increment();
+
+  // Prints the current counter value to STDOUT.
+  void Print() const;
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE4_H_
diff --git a/vendor/gtest-1.7.0/samples/sample4_unittest.cc b/vendor/gtest-1.7.0/samples/sample4_unittest.cc
new file mode 100644
index 0000000..fa5afc7
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample4_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+#include "sample4.h"
+
+// Tests the Increment() method.
+TEST(Counter, Increment) {
+  Counter c;
+
+  // EXPECT_EQ() evaluates its arguments exactly once, so they
+  // can have side effects.
+
+  EXPECT_EQ(0, c.Increment());
+  EXPECT_EQ(1, c.Increment());
+  EXPECT_EQ(2, c.Increment());
+}
diff --git a/vendor/gtest-1.7.0/samples/sample5_unittest.cc b/vendor/gtest-1.7.0/samples/sample5_unittest.cc
new file mode 100644
index 0000000..43d8e57
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample5_unittest.cc
@@ -0,0 +1,199 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample teaches how to reuse a test fixture in multiple test
+// cases by deriving sub-fixtures from it.
+//
+// When you define a test fixture, you specify the name of the test
+// case that will use this fixture.  Therefore, a test fixture can
+// be used by only one test case.
+//
+// Sometimes, more than one test cases may want to use the same or
+// slightly different test fixtures.  For example, you may want to
+// make sure that all tests for a GUI library don't leak important
+// system resources like fonts and brushes.  In Google Test, you do
+// this by putting the shared logic in a super (as in "super class")
+// test fixture, and then have each test case use a fixture derived
+// from this super fixture.
+
+#include <limits.h>
+#include <time.h>
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+#include "sample1.h"
+
+// In this sample, we want to ensure that every test finishes within
+// ~5 seconds.  If a test takes longer to run, we consider it a
+// failure.
+//
+// We put the code for timing a test in a test fixture called
+// "QuickTest".  QuickTest is intended to be the super fixture that
+// other fixtures derive from, therefore there is no test case with
+// the name "QuickTest".  This is OK.
+//
+// Later, we will derive multiple test fixtures from QuickTest.
+class QuickTest : public testing::Test {
+ protected:
+  // Remember that SetUp() is run immediately before a test starts.
+  // This is a good place to record the start time.
+  virtual void SetUp() {
+    start_time_ = time(NULL);
+  }
+
+  // TearDown() is invoked immediately after a test finishes.  Here we
+  // check if the test was too slow.
+  virtual void TearDown() {
+    // Gets the time when the test finishes
+    const time_t end_time = time(NULL);
+
+    // Asserts that the test took no more than ~5 seconds.  Did you
+    // know that you can use assertions in SetUp() and TearDown() as
+    // well?
+    EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
+  }
+
+  // The UTC time (in seconds) when the test starts
+  time_t start_time_;
+};
+
+
+// We derive a fixture named IntegerFunctionTest from the QuickTest
+// fixture.  All tests using this fixture will be automatically
+// required to be quick.
+class IntegerFunctionTest : public QuickTest {
+  // We don't need any more logic than already in the QuickTest fixture.
+  // Therefore the body is empty.
+};
+
+
+// Now we can write tests in the IntegerFunctionTest test case.
+
+// Tests Factorial()
+TEST_F(IntegerFunctionTest, Factorial) {
+  // Tests factorial of negative numbers.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // Tests factorial of 0.
+  EXPECT_EQ(1, Factorial(0));
+
+  // Tests factorial of positive numbers.
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+TEST_F(IntegerFunctionTest, IsPrime) {
+  // Tests negative input.
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+
+  // Tests some trivial cases.
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+
+  // Tests positive input.
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+
+// The next test case (named "QueueTest") also needs to be quick, so
+// we derive another fixture from QuickTest.
+//
+// The QueueTest test fixture has some logic and shared objects in
+// addition to what's in QuickTest already.  We define the additional
+// stuff inside the body of the test fixture, as usual.
+class QueueTest : public QuickTest {
+ protected:
+  virtual void SetUp() {
+    // First, we need to set up the super fixture (QuickTest).
+    QuickTest::SetUp();
+
+    // Second, some additional setup for this fixture.
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // By default, TearDown() inherits the behavior of
+  // QuickTest::TearDown().  As we have no additional cleaning work
+  // for QueueTest, we omit it here.
+  //
+  // virtual void TearDown() {
+  //   QuickTest::TearDown();
+  // }
+
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+
+// Now, let's write tests using the QueueTest fixture.
+
+// Tests the default constructor.
+TEST_F(QueueTest, DefaultConstructor) {
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int* n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// If necessary, you can derive further test fixtures from a derived
+// fixture itself.  For example, you can derive another fixture from
+// QueueTest.  Google Test imposes no limit on how deep the hierarchy
+// can be.  In practice, however, you probably don't want it to be too
+// deep as to be confusing.
diff --git a/vendor/gtest-1.7.0/samples/sample6_unittest.cc b/vendor/gtest-1.7.0/samples/sample6_unittest.cc
new file mode 100644
index 0000000..8f2036a
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample6_unittest.cc
@@ -0,0 +1,224 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample shows how to test common properties of multiple
+// implementations of the same interface (aka interface tests).
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+// First, we define some factory functions for creating instances of
+// the implementations.  You may be able to skip this step if all your
+// implementations can be constructed the same way.
+
+template <class T>
+PrimeTable* CreatePrimeTable();
+
+template <>
+PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
+  return new OnTheFlyPrimeTable;
+}
+
+template <>
+PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
+  return new PreCalculatedPrimeTable(10000);
+}
+
+// Then we define a test fixture class template.
+template <class T>
+class PrimeTableTest : public testing::Test {
+ protected:
+  // The ctor calls the factory function to create a prime table
+  // implemented by T.
+  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
+
+  virtual ~PrimeTableTest() { delete table_; }
+
+  // Note that we test an implementation via the base interface
+  // instead of the actual implementation class.  This is important
+  // for keeping the tests close to the real world scenario, where the
+  // implementation is invoked via the base interface.  It avoids
+  // got-yas where the implementation class has a method that shadows
+  // a method with the same name (but slightly different argument
+  // types) in the base interface, for example.
+  PrimeTable* const table_;
+};
+
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Google Test offers two ways for reusing tests for different types.
+// The first is called "typed tests".  You should use it if you
+// already know *all* the types you are gonna exercise when you write
+// the tests.
+
+// To write a typed test case, first use
+//
+//   TYPED_TEST_CASE(TestCaseName, TypeList);
+//
+// to declare it and specify the type parameters.  As with TEST_F,
+// TestCaseName must match the test fixture name.
+
+// The list of types we want to test.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
+
+TYPED_TEST_CASE(PrimeTableTest, Implementations);
+
+// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
+// similar to TEST_F.
+TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the type parameter by
+  // TypeParam, and refer to the fixture class by TestFixture.  We
+  // don't need them in this example.
+
+  // Since we are in the template world, C++ requires explicitly
+  // writing 'this->' when referring to members of the fixture class.
+  // This is something you have to learn to live with.
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// That's it!  Google Test will repeat each TYPED_TEST for each type
+// in the type list specified in TYPED_TEST_CASE.  Sit back and be
+// happy that you don't have to define them multiple times.
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+
+// Sometimes, however, you don't yet know all the types that you want
+// to test when you write the tests.  For example, if you are the
+// author of an interface and expect other people to implement it, you
+// might want to write a set of tests to make sure each implementation
+// conforms to some basic requirements, but you don't know what
+// implementations will be written in the future.
+//
+// How can you write the tests without committing to the type
+// parameters?  That's what "type-parameterized tests" can do for you.
+// It is a bit more involved than typed tests, but in return you get a
+// test pattern that can be reused in many contexts, which is a big
+// win.  Here's how you do it:
+
+// First, define a test fixture class template.  Here we just reuse
+// the PrimeTableTest fixture defined earlier:
+
+template <class T>
+class PrimeTableTest2 : public PrimeTableTest<T> {
+};
+
+// Then, declare the test case.  The argument is the name of the test
+// fixture, and also the name of the test case (as usual).  The _P
+// suffix is for "parameterized" or "pattern".
+TYPED_TEST_CASE_P(PrimeTableTest2);
+
+// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
+// similar to what you do with TEST_F.
+TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// Type-parameterized tests involve one extra step: you have to
+// enumerate the tests you defined:
+REGISTER_TYPED_TEST_CASE_P(
+    PrimeTableTest2,  // The first argument is the test case name.
+    // The rest of the arguments are the test names.
+    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
+
+// At this point the test pattern is done.  However, you don't have
+// any real test yet as you haven't said which types you want to run
+// the tests with.
+
+// To turn the abstract test pattern into real tests, you instantiate
+// it with a list of types.  Usually the test pattern will be defined
+// in a .h file, and anyone can #include and instantiate it.  You can
+// even instantiate it more than once in the same program.  To tell
+// different instances apart, you give each of them a name, which will
+// become part of the test case name and can be used in test filters.
+
+// The list of types we want to test.  Note that it doesn't have to be
+// defined at the time we write the TYPED_TEST_P()s.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
+    PrimeTableImplementations;
+INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name
+                              PrimeTableTest2,             // Test case name
+                              PrimeTableImplementations);  // Type list
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/vendor/gtest-1.7.0/samples/sample7_unittest.cc b/vendor/gtest-1.7.0/samples/sample7_unittest.cc
new file mode 100644
index 0000000..1b651a2
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample7_unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test common properties of multiple
+// implementations of an interface (aka interface tests) using
+// value-parameterized tests. Each test in the test case has
+// a parameter that is an interface pointer to an implementation
+// tested.
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+
+// As a general rule, to prevent a test from affecting the tests that come
+// after it, you should create and destroy the tested objects for each test
+// instead of reusing them.  In this sample we will define a simple factory
+// function for PrimeTable objects.  We will instantiate objects in test's
+// SetUp() method and delete them in TearDown() method.
+typedef PrimeTable* CreatePrimeTableFunc();
+
+PrimeTable* CreateOnTheFlyPrimeTable() {
+  return new OnTheFlyPrimeTable();
+}
+
+template <size_t max_precalculated>
+PrimeTable* CreatePreCalculatedPrimeTable() {
+  return new PreCalculatedPrimeTable(max_precalculated);
+}
+
+// Inside the test body, fixture constructor, SetUp(), and TearDown() you
+// can refer to the test parameter by GetParam().  In this case, the test
+// parameter is a factory function which we call in fixture's SetUp() to
+// create and store an instance of PrimeTable.
+class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
+ public:
+  virtual ~PrimeTableTest() { delete table_; }
+  virtual void SetUp() { table_ = (*GetParam())(); }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+
+ protected:
+  PrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of two PrimeTable object
+// factory functions:
+INSTANTIATE_TEST_CASE_P(
+    OnTheFlyAndPreCalculated,
+    PrimeTableTest,
+    Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
+
+#else
+
+// Google Test may not support value-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/vendor/gtest-1.7.0/samples/sample8_unittest.cc b/vendor/gtest-1.7.0/samples/sample8_unittest.cc
new file mode 100644
index 0000000..5ad2e2c
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample8_unittest.cc
@@ -0,0 +1,173 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test code relying on some global flag variables.
+// Combine() helps with generating all possible combinations of such flags,
+// and each test is given one combination as a parameter.
+
+// Use class definitions to test from this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_COMBINE
+
+// Suppose we want to introduce a new, improved implementation of PrimeTable
+// which combines speed of PrecalcPrimeTable and versatility of
+// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
+// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
+// appropriate under the circumstances. But in low memory conditions, it can be
+// told to instantiate without PrecalcPrimeTable instance at all and use only
+// OnTheFlyPrimeTable.
+class HybridPrimeTable : public PrimeTable {
+ public:
+  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
+      : on_the_fly_impl_(new OnTheFlyPrimeTable),
+        precalc_impl_(force_on_the_fly ? NULL :
+                          new PreCalculatedPrimeTable(max_precalculated)),
+        max_precalculated_(max_precalculated) {}
+  virtual ~HybridPrimeTable() {
+    delete on_the_fly_impl_;
+    delete precalc_impl_;
+  }
+
+  virtual bool IsPrime(int n) const {
+    if (precalc_impl_ != NULL && n < max_precalculated_)
+      return precalc_impl_->IsPrime(n);
+    else
+      return on_the_fly_impl_->IsPrime(n);
+  }
+
+  virtual int GetNextPrime(int p) const {
+    int next_prime = -1;
+    if (precalc_impl_ != NULL && p < max_precalculated_)
+      next_prime = precalc_impl_->GetNextPrime(p);
+
+    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
+  }
+
+ private:
+  OnTheFlyPrimeTable* on_the_fly_impl_;
+  PreCalculatedPrimeTable* precalc_impl_;
+  int max_precalculated_;
+};
+
+using ::testing::TestWithParam;
+using ::testing::Bool;
+using ::testing::Values;
+using ::testing::Combine;
+
+// To test all code paths for HybridPrimeTable we must test it with numbers
+// both within and outside PreCalculatedPrimeTable's capacity and also with
+// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
+// accept different combinations of parameters for instantiating a
+// HybridPrimeTable instance.
+class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
+ protected:
+  virtual void SetUp() {
+    // This can be written as
+    //
+    // bool force_on_the_fly;
+    // int max_precalculated;
+    // tie(force_on_the_fly, max_precalculated) = GetParam();
+    //
+    // once the Google C++ Style Guide allows use of ::std::tr1::tie.
+    //
+    bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
+    int max_precalculated = ::std::tr1::get<1>(GetParam());
+    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
+  }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+  HybridPrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the test parameter by GetParam().
+  // In this case, the test parameter is a PrimeTable interface pointer which
+  // we can use directly.
+  // Please note that you can also save it in the fixture's SetUp() method
+  // or constructor and use saved copy in the tests.
+
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of parameters. We must combine
+// all variations of the boolean flag suppressing PrecalcPrimeTable and some
+// meaningful values for tests. We choose a small value (1), and a value that
+// will put some of the tested numbers beyond the capability of the
+// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
+// possible combinations.
+INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
+                        PrimeTableTest,
+                        Combine(Bool(), Values(1, 10)));
+
+#else
+
+// Google Test may not support Combine() with some compilers. If we
+// use conditional compilation to compile out all code referring to
+// the gtest_main library, MSVC linker will not link that library at
+// all and consequently complain about missing entry point defined in
+// that library (fatal error LNK1561: entry point must be
+// defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_COMBINE
diff --git a/vendor/gtest-1.7.0/samples/sample9_unittest.cc b/vendor/gtest-1.7.0/samples/sample9_unittest.cc
new file mode 100644
index 0000000..b2e2079
--- /dev/null
+++ b/vendor/gtest-1.7.0/samples/sample9_unittest.cc
@@ -0,0 +1,160 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// an alternative console output and how to use the UnitTest reflection API
+// to enumerate test cases and tests and to inspect their results.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// Provides alternative output mode which produces minimal amount of
+// information about tests.
+class TersePrinter : public EmptyTestEventListener {
+ private:
+  // Called before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}
+
+  // Called after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) {
+    fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
+    fflush(stdout);
+  }
+
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s starting.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+
+  // Called after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) {
+    fprintf(stdout,
+            "%s in %s:%d\n%s\n",
+            test_part_result.failed() ? "*** Failure" : "Success",
+            test_part_result.file_name(),
+            test_part_result.line_number(),
+            test_part_result.summary());
+    fflush(stdout);
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s ending.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+};  // class TersePrinter
+
+TEST(CustomOutputTest, PrintsMessage) {
+  printf("Printing something from the test body...\n");
+}
+
+TEST(CustomOutputTest, Succeeds) {
+  SUCCEED() << "SUCCEED() has been invoked from here";
+}
+
+TEST(CustomOutputTest, Fails) {
+  EXPECT_EQ(1, 2)
+      << "This test fails in order to demonstrate alternative failure messages";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool terse_output = false;
+  if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
+    terse_output = true;
+  else
+    printf("%s\n", "Run this program with --terse_output to change the way "
+           "it prints its output.");
+
+  UnitTest& unit_test = *UnitTest::GetInstance();
+
+  // If we are given the --terse_output command line flag, suppresses the
+  // standard output and attaches own result printer.
+  if (terse_output) {
+    TestEventListeners& listeners = unit_test.listeners();
+
+    // Removes the default console output listener from the list so it will
+    // not receive events from Google Test and won't print any output. Since
+    // this operation transfers ownership of the listener to the caller we
+    // have to delete it as well.
+    delete listeners.Release(listeners.default_result_printer());
+
+    // Adds the custom output listener to the list. It will now receive
+    // events from Google Test and print the alternative output. We don't
+    // have to worry about deleting it since Google Test assumes ownership
+    // over it after adding it to the list.
+    listeners.Append(new TersePrinter);
+  }
+  int ret_val = RUN_ALL_TESTS();
+
+  // This is an example of using the UnitTest reflection API to inspect test
+  // results. Here we discount failures from the tests we expected to fail.
+  int unexpectedly_failed_tests = 0;
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      // Counts failed tests that were not meant to fail (those without
+      // 'Fails' in the name).
+      if (test_info.result()->Failed() &&
+          strcmp(test_info.name(), "Fails") != 0) {
+        unexpectedly_failed_tests++;
+      }
+    }
+  }
+
+  // Test that were meant to fail should not affect the test program outcome.
+  if (unexpectedly_failed_tests == 0)
+    ret_val = 0;
+
+  return ret_val;
+}
diff --git a/vendor/gtest-1.7.0/src/gtest-all.cc b/vendor/gtest-1.7.0/src/gtest-all.cc
new file mode 100644
index 0000000..0a9cee5
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-all.cc
@@ -0,0 +1,48 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+#include "src/gtest.cc"
+#include "src/gtest-death-test.cc"
+#include "src/gtest-filepath.cc"
+#include "src/gtest-port.cc"
+#include "src/gtest-printers.cc"
+#include "src/gtest-test-part.cc"
+#include "src/gtest-typed-test.cc"
diff --git a/vendor/gtest-1.7.0/src/gtest-death-test.cc b/vendor/gtest-1.7.0/src/gtest-death-test.cc
new file mode 100644
index 0000000..a6023fc
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-death-test.cc
@@ -0,0 +1,1344 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest-filepath.cc b/vendor/gtest-1.7.0/src/gtest-filepath.cc
new file mode 100644
index 0000000..6be58b6
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-filepath.cc
@@ -0,0 +1,382 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-port.h"
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest-internal-inl.h b/vendor/gtest-1.7.0/src/gtest-internal-inl.h
new file mode 100644
index 0000000..35df303
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-internal-inl.h
@@ -0,0 +1,1218 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/gtest.h"  // NOLINT
+#include "gtest/gtest-spi.h"
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
diff --git a/vendor/gtest-1.7.0/src/gtest-port.cc b/vendor/gtest-1.7.0/src/gtest-port.cc
new file mode 100644
index 0000000..0c4df5f
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-port.cc
@@ -0,0 +1,805 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-port.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest-printers.cc b/vendor/gtest-1.7.0/src/gtest-printers.cc
new file mode 100644
index 0000000..75fa408
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-printers.cc
@@ -0,0 +1,363 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include "gtest/gtest-printers.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest-test-part.cc b/vendor/gtest-1.7.0/src/gtest-test-part.cc
new file mode 100644
index 0000000..c60eef3
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-test-part.cc
@@ -0,0 +1,110 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest-test-part.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest-typed-test.cc b/vendor/gtest-1.7.0/src/gtest-typed-test.cc
new file mode 100644
index 0000000..f0079f4
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest-typed-test.cc
@@ -0,0 +1,110 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-typed-test.h"
+#include "gtest/gtest.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest.cc b/vendor/gtest-1.7.0/src/gtest.cc
new file mode 100644
index 0000000..6de53dd
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest.cc
@@ -0,0 +1,5015 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/src/gtest_main.cc b/vendor/gtest-1.7.0/src/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/vendor/gtest-1.7.0/src/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest-death-test_ex_test.cc b/vendor/gtest-1.7.0/test/gtest-death-test_ex_test.cc
new file mode 100644
index 0000000..b50a13d
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-death-test_ex_test.cc
@@ -0,0 +1,93 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests that verify interaction of exceptions and death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_HAS_SEH
+#  include <windows.h>          // For RaiseException().
+# endif
+
+# include "gtest/gtest-spi.h"
+
+# if GTEST_HAS_EXCEPTIONS
+
+#  include <exception>  // For std::exception.
+
+// Tests that death tests report thrown exceptions as failures and that the
+// exceptions do not escape death test macros.
+TEST(CxxExceptionDeathTest, ExceptionIsFailure) {
+  try {
+    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
+  } catch (...) {  // NOLINT
+    FAIL() << "An exception escaped a death test macro invocation "
+           << "with catch_exceptions "
+           << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+  }
+}
+
+class TestException : public std::exception {
+ public:
+  virtual const char* what() const throw() { return "exceptional message"; }
+};
+
+TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
+  // Verifies that the exception message is quoted in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "exceptional message");
+  // Verifies that the location is mentioned in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "gtest-death-test_ex_test.cc");
+}
+# endif  // GTEST_HAS_EXCEPTIONS
+
+# if GTEST_HAS_SEH
+// Tests that enabling interception of SEH exceptions with the
+// catch_exceptions flag does not interfere with SEH exceptions being
+// treated as death by death tests.
+TEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
+  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
+      << "with catch_exceptions "
+      << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+}
+# endif
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest-death-test_test.cc b/vendor/gtest-1.7.0/test/gtest-death-test_test.cc
new file mode 100644
index 0000000..c2d26df
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-death-test_test.cc
@@ -0,0 +1,1367 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+#include "gtest/internal/gtest-filepath.h"
+
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_WINDOWS
+#  include <direct.h>          // For chdir().
+# else
+#  include <unistd.h>
+#  include <sys/wait.h>        // For waitpid.
+# endif  // GTEST_OS_WINDOWS
+
+# include <limits.h>
+# include <signal.h>
+# include <stdio.h>
+
+# if GTEST_OS_LINUX
+#  include <sys/time.h>
+# endif  // GTEST_OS_LINUX
+
+# include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"
+# undef GTEST_IMPLEMENTATION_
+
+namespace posix = ::testing::internal::posix;
+
+using testing::Message;
+using testing::internal::DeathTest;
+using testing::internal::DeathTestFactory;
+using testing::internal::FilePath;
+using testing::internal::GetLastErrnoDescription;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::InDeathTestChild;
+using testing::internal::ParseNaturalNumber;
+
+namespace testing {
+namespace internal {
+
+// A helper class whose objects replace the death test factory for a
+// single UnitTest object during their lifetimes.
+class ReplaceDeathTestFactory {
+ public:
+  explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory)
+      : unit_test_impl_(GetUnitTestImpl()) {
+    old_factory_ = unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(new_factory);
+  }
+
+  ~ReplaceDeathTestFactory() {
+    unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(old_factory_);
+  }
+ private:
+  // Prevents copying ReplaceDeathTestFactory objects.
+  ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);
+  void operator=(const ReplaceDeathTestFactory&);
+
+  UnitTestImpl* unit_test_impl_;
+  DeathTestFactory* old_factory_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+void DieWithMessage(const ::std::string& message) {
+  fprintf(stderr, "%s", message.c_str());
+  fflush(stderr);  // Make sure the text is printed before the process exits.
+
+  // We call _exit() instead of exit(), as the former is a direct
+  // system call and thus safer in the presence of threads.  exit()
+  // will invoke user-defined exit-hooks, which may do dangerous
+  // things that conflict with death tests.
+  //
+  // Some compilers can recognize that _exit() never returns and issue the
+  // 'unreachable code' warning for code following this function, unless
+  // fooled by a fake condition.
+  if (AlwaysTrue())
+    _exit(1);
+}
+
+void DieInside(const ::std::string& function) {
+  DieWithMessage("death inside " + function + "().");
+}
+
+// Tests that death tests work.
+
+class TestForDeathTest : public testing::Test {
+ protected:
+  TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}
+
+  virtual ~TestForDeathTest() {
+    posix::ChDir(original_dir_.c_str());
+  }
+
+  // A static member function that's expected to die.
+  static void StaticMemberFunction() { DieInside("StaticMemberFunction"); }
+
+  // A method of the test fixture that may die.
+  void MemberFunction() {
+    if (should_die_)
+      DieInside("MemberFunction");
+  }
+
+  // True iff MemberFunction() should die.
+  bool should_die_;
+  const FilePath original_dir_;
+};
+
+// A class with a member function that may die.
+class MayDie {
+ public:
+  explicit MayDie(bool should_die) : should_die_(should_die) {}
+
+  // A member function that may die.
+  void MemberFunction() const {
+    if (should_die_)
+      DieInside("MayDie::MemberFunction");
+  }
+
+ private:
+  // True iff MemberFunction() should die.
+  bool should_die_;
+};
+
+// A global function that's expected to die.
+void GlobalFunction() { DieInside("GlobalFunction"); }
+
+// A non-void function that's expected to die.
+int NonVoidFunction() {
+  DieInside("NonVoidFunction");
+  return 1;
+}
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  if (should_die)
+    DieInside("DieIf");
+}
+
+// A binary function that may die.
+bool DieIfLessThan(int x, int y) {
+  if (x < y) {
+    DieInside("DieIfLessThan");
+  }
+  return true;
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+void DeathTestSubroutine() {
+  EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+  ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+}
+
+// Death in dbg, not opt.
+int DieInDebugElse12(int* sideeffect) {
+  if (sideeffect) *sideeffect = 12;
+
+# ifndef NDEBUG
+
+  DieInside("DieInDebugElse12");
+
+# endif  // NDEBUG
+
+  return 12;
+}
+
+# if GTEST_OS_WINDOWS
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  // On Windows, the process's exit code is the same as its exit status,
+  // so the predicate just compares the its input with its parameter.
+  EXPECT_TRUE(testing::ExitedWithCode(0)(0));
+  EXPECT_TRUE(testing::ExitedWithCode(1)(1));
+  EXPECT_TRUE(testing::ExitedWithCode(42)(42));
+  EXPECT_FALSE(testing::ExitedWithCode(0)(1));
+  EXPECT_FALSE(testing::ExitedWithCode(1)(0));
+}
+
+# else
+
+// Returns the exit status of a process that calls _exit(2) with a
+// given exit code.  This is a helper function for the
+// ExitStatusPredicateTest test suite.
+static int NormalExitStatus(int exit_code) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    _exit(exit_code);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Returns the exit status of a process that raises a given signal.
+// If the signal does not cause the process to die, then it returns
+// instead the exit status of a process that exits normally with exit
+// code 1.  This is a helper function for the ExitStatusPredicateTest
+// test suite.
+static int KilledExitStatus(int signum) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    raise(signum);
+    _exit(1);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  const int status0  = NormalExitStatus(0);
+  const int status1  = NormalExitStatus(1);
+  const int status42 = NormalExitStatus(42);
+  const testing::ExitedWithCode pred0(0);
+  const testing::ExitedWithCode pred1(1);
+  const testing::ExitedWithCode pred42(42);
+  EXPECT_PRED1(pred0,  status0);
+  EXPECT_PRED1(pred1,  status1);
+  EXPECT_PRED1(pred42, status42);
+  EXPECT_FALSE(pred0(status1));
+  EXPECT_FALSE(pred42(status0));
+  EXPECT_FALSE(pred1(status42));
+}
+
+// Tests the KilledBySignal predicate.
+TEST(ExitStatusPredicateTest, KilledBySignal) {
+  const int status_segv = KilledExitStatus(SIGSEGV);
+  const int status_kill = KilledExitStatus(SIGKILL);
+  const testing::KilledBySignal pred_segv(SIGSEGV);
+  const testing::KilledBySignal pred_kill(SIGKILL);
+  EXPECT_PRED1(pred_segv, status_segv);
+  EXPECT_PRED1(pred_kill, status_kill);
+  EXPECT_FALSE(pred_segv(status_kill));
+  EXPECT_FALSE(pred_kill(status_segv));
+}
+
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+TEST_F(TestForDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;
+
+  if (AlwaysFalse())
+    ASSERT_DEATH(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;
+  else
+    EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3;
+}
+
+void DieWithEmbeddedNul() {
+  fprintf(stderr, "Hello%cmy null world.\n", '\0');
+  fflush(stderr);
+  _exit(1);
+}
+
+# if GTEST_USES_PCRE
+// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
+// message has a NUL character in it.
+TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
+  // TODO(wan at google.com): <regex.h> doesn't support matching strings
+  // with embedded NUL characters - find a way to workaround it.
+  EXPECT_DEATH(DieWithEmbeddedNul(), "my null world");
+  ASSERT_DEATH(DieWithEmbeddedNul(), "my null world");
+}
+# endif  // GTEST_USES_PCRE
+
+// Tests that death test macros expand to code which interacts well with switch
+// statements.
+TEST_F(TestForDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+# ifdef _MSC_VER
+#  pragma warning(push)
+#  pragma warning(disable: 4065)
+# endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH(_exit(1), "") << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH(_exit(1), "") << "exit in switch case";
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+}
+
+// Tests that a static member function can be used in a "fast" style
+// death test.
+TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+// Tests that a method of the test fixture can be used in a "fast"
+// style death test.
+TEST_F(TestForDeathTest, MemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+void ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); }
+
+// Tests that death tests work even if the current directory has been
+// changed.
+TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+# if GTEST_OS_LINUX
+void SigprofAction(int, siginfo_t*, void*) { /* no op */ }
+
+// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms).
+void SetSigprofActionAndTimer() {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 1;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_sigaction = SigprofAction;
+  signal_action.sa_flags = SA_RESTART | SA_SIGINFO;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL));
+}
+
+// Disables ITIMER_PROF timer and ignores SIGPROF signal.
+void DisableSigprofActionAndTimer(struct sigaction* old_signal_action) {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 0;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_handler = SIG_IGN;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action));
+}
+
+// Tests that death tests work when SIGPROF handler and timer are set.
+TEST_F(TestForDeathTest, FastSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+
+TEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+# endif  // GTEST_OS_LINUX
+
+// Repeats a representative sample of death tests in the "threadsafe" style:
+
+TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  for (int i = 0; i < 3; ++i)
+    EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+TEST_F(TestForDeathTest, MixedStyles) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH(_exit(1), "");
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(_exit(1), "");
+}
+
+# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+namespace {
+
+bool pthread_flag;
+
+void SetPthreadFlag() {
+  pthread_flag = true;
+}
+
+}  // namespace
+
+TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
+  if (!testing::GTEST_FLAG(death_test_use_fork)) {
+    testing::GTEST_FLAG(death_test_style) = "threadsafe";
+    pthread_flag = false;
+    ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));
+    ASSERT_DEATH(_exit(1), "");
+    ASSERT_FALSE(pthread_flag);
+  }
+}
+
+# endif  // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+// Tests that a method of another class can be used in a death test.
+TEST_F(TestForDeathTest, MethodOfAnotherClass) {
+  const MayDie x(true);
+  ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction");
+}
+
+// Tests that a global function can be used in a death test.
+TEST_F(TestForDeathTest, GlobalFunction) {
+  EXPECT_DEATH(GlobalFunction(), "GlobalFunction");
+}
+
+// Tests that any value convertible to an RE works as a second
+// argument to EXPECT_DEATH.
+TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
+  static const char regex_c_str[] = "GlobalFunction";
+  EXPECT_DEATH(GlobalFunction(), regex_c_str);
+
+  const testing::internal::RE regex(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex);
+
+# if GTEST_HAS_GLOBAL_STRING
+
+  const string regex_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_str);
+
+# endif  // GTEST_HAS_GLOBAL_STRING
+
+  const ::std::string regex_std_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_std_str);
+}
+
+// Tests that a non-void function can be used in a death test.
+TEST_F(TestForDeathTest, NonVoidFunction) {
+  ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction");
+}
+
+// Tests that functions that take parameter(s) can be used in a death test.
+TEST_F(TestForDeathTest, FunctionWithParameter) {
+  EXPECT_DEATH(DieIf(true), "DieIf\\(\\)");
+  EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan");
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+TEST_F(TestForDeathTest, OutsideFixture) {
+  DeathTestSubroutine();
+}
+
+// Tests that death tests can be done inside a loop.
+TEST_F(TestForDeathTest, InsideLoop) {
+  for (int i = 0; i < 5; i++) {
+    EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i;
+  }
+}
+
+// Tests that a compound statement can be used in a death test.
+TEST_F(TestForDeathTest, CompoundStatement) {
+  EXPECT_DEATH({  // NOLINT
+    const int x = 2;
+    const int y = x + 1;
+    DieIfLessThan(x, y);
+  },
+  "DieIfLessThan");
+}
+
+// Tests that code that doesn't die causes a death test to fail.
+TEST_F(TestForDeathTest, DoesNotDie) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"),
+                          "failed to die");
+}
+
+// Tests that a death test fails when the error message isn't expected.
+TEST_F(TestForDeathTest, ErrorMessageMismatch) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message.";
+  }, "died but not with expected error");
+}
+
+// On exit, *aborted will be true iff the EXPECT_DEATH() statement
+// aborted the function.
+void ExpectDeathTestHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+  *aborted = false;
+}
+
+// Tests that EXPECT_DEATH doesn't abort the test on failure.
+TEST_F(TestForDeathTest, EXPECT_DEATH) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),
+                          "failed to die");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that ASSERT_DEATH does abort the test on failure.
+TEST_F(TestForDeathTest, ASSERT_DEATH) {
+  static bool aborted;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    aborted = true;
+    ASSERT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+    aborted = false;
+  }, "failed to die");
+  EXPECT_TRUE(aborted);
+}
+
+// Tests that EXPECT_DEATH evaluates the arguments exactly once.
+TEST_F(TestForDeathTest, SingleEvaluation) {
+  int x = 3;
+  EXPECT_DEATH(DieIf((++x) == 4), "DieIf");
+
+  const char* regex = "DieIf";
+  const char* regex_save = regex;
+  EXPECT_DEATH(DieIfLessThan(3, 4), regex++);
+  EXPECT_EQ(regex_save + 1, regex);
+}
+
+// Tests that run-away death tests are reported as failures.
+TEST_F(TestForDeathTest, RunawayIsFailure) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"),
+                          "failed to die.");
+}
+
+// Tests that death tests report executing 'return' in the statement as
+// failure.
+TEST_F(TestForDeathTest, ReturnIsFailure) {
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"),
+                       "illegal return in test statement.");
+}
+
+// Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestExpectDebugDeath) {
+  int sideeffect = 0;
+
+  EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+// Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestAssertDebugDeath) {
+  int sideeffect = 0;
+
+  ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+# ifndef NDEBUG
+
+void ExpectDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+#  if GTEST_OS_WINDOWS
+TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
+  printf("This test should be considered failing if it shows "
+         "any pop-up dialogs.\n");
+  fflush(stdout);
+
+  EXPECT_DEATH({
+    testing::GTEST_FLAG(catch_exceptions) = false;
+    abort();
+  }, "");
+}
+#  endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
+// the function.
+TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), "");
+  EXPECT_FALSE(aborted);
+}
+
+void AssertDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on
+// failure.
+TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
+  static bool aborted;
+  aborted = false;
+  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), "");
+  EXPECT_TRUE(aborted);
+}
+
+# endif  // _NDEBUG
+
+// Tests the *_EXIT family of macros, using a variety of predicates.
+static void TestExitMacros() {
+  EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  "");
+  ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
+
+# if GTEST_OS_WINDOWS
+
+  // Of all signals effects on the process exit code, only those of SIGABRT
+  // are documented on Windows.
+  // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
+  EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar";
+
+# else
+
+  EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
+  ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar";
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "")
+      << "This failure is expected, too.";
+  }, "This failure is expected, too.");
+
+# endif  // GTEST_OS_WINDOWS
+
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
+      << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, ExitMacros) {
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, ExitMacrosUsingFork) {
+  testing::GTEST_FLAG(death_test_use_fork) = true;
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, InvalidStyle) {
+  testing::GTEST_FLAG(death_test_style) = "rococo";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, DeathTestFailedOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("death\n"),
+                   "expected message"),
+      "Actual msg:\n"
+      "[  DEATH   ] death\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH({
+          fprintf(stderr, "returning\n");
+          fflush(stderr);
+          return;
+        }, ""),
+      "    Result: illegal return in test statement.\n"
+      " Error msg:\n"
+      "[  DEATH   ] returning\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_EXIT(DieWithMessage("exiting with rc 1\n"),
+                  testing::ExitedWithCode(3),
+                  "expected message"),
+      "    Result: died but not with expected exit code:\n"
+      "            Exited with exit status 1\n"
+      "Actual msg:\n"
+      "[  DEATH   ] exiting with rc 1\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+                   "line 1\nxyz\nline 3\n"),
+      "Actual msg:\n"
+      "[  DEATH   ] line 1\n"
+      "[  DEATH   ] line 2\n"
+      "[  DEATH   ] line 3\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+               "line 1\nline 2\nline 3\n");
+}
+
+// A DeathTestFactory that returns MockDeathTests.
+class MockDeathTestFactory : public DeathTestFactory {
+ public:
+  MockDeathTestFactory();
+  virtual bool Create(const char* statement,
+                      const ::testing::internal::RE* regex,
+                      const char* file, int line, DeathTest** test);
+
+  // Sets the parameters for subsequent calls to Create.
+  void SetParameters(bool create, DeathTest::TestRole role,
+                     int status, bool passed);
+
+  // Accessors.
+  int AssumeRoleCalls() const { return assume_role_calls_; }
+  int WaitCalls() const { return wait_calls_; }
+  int PassedCalls() const { return passed_args_.size(); }
+  bool PassedArgument(int n) const { return passed_args_[n]; }
+  int AbortCalls() const { return abort_args_.size(); }
+  DeathTest::AbortReason AbortArgument(int n) const {
+    return abort_args_[n];
+  }
+  bool TestDeleted() const { return test_deleted_; }
+
+ private:
+  friend class MockDeathTest;
+  // If true, Create will return a MockDeathTest; otherwise it returns
+  // NULL.
+  bool create_;
+  // The value a MockDeathTest will return from its AssumeRole method.
+  DeathTest::TestRole role_;
+  // The value a MockDeathTest will return from its Wait method.
+  int status_;
+  // The value a MockDeathTest will return from its Passed method.
+  bool passed_;
+
+  // Number of times AssumeRole was called.
+  int assume_role_calls_;
+  // Number of times Wait was called.
+  int wait_calls_;
+  // The arguments to the calls to Passed since the last call to
+  // SetParameters.
+  std::vector<bool> passed_args_;
+  // The arguments to the calls to Abort since the last call to
+  // SetParameters.
+  std::vector<DeathTest::AbortReason> abort_args_;
+  // True if the last MockDeathTest returned by Create has been
+  // deleted.
+  bool test_deleted_;
+};
+
+
+// A DeathTest implementation useful in testing.  It returns values set
+// at its creation from its various inherited DeathTest methods, and
+// reports calls to those methods to its parent MockDeathTestFactory
+// object.
+class MockDeathTest : public DeathTest {
+ public:
+  MockDeathTest(MockDeathTestFactory *parent,
+                TestRole role, int status, bool passed) :
+      parent_(parent), role_(role), status_(status), passed_(passed) {
+  }
+  virtual ~MockDeathTest() {
+    parent_->test_deleted_ = true;
+  }
+  virtual TestRole AssumeRole() {
+    ++parent_->assume_role_calls_;
+    return role_;
+  }
+  virtual int Wait() {
+    ++parent_->wait_calls_;
+    return status_;
+  }
+  virtual bool Passed(bool exit_status_ok) {
+    parent_->passed_args_.push_back(exit_status_ok);
+    return passed_;
+  }
+  virtual void Abort(AbortReason reason) {
+    parent_->abort_args_.push_back(reason);
+  }
+
+ private:
+  MockDeathTestFactory* const parent_;
+  const TestRole role_;
+  const int status_;
+  const bool passed_;
+};
+
+
+// MockDeathTestFactory constructor.
+MockDeathTestFactory::MockDeathTestFactory()
+    : create_(true),
+      role_(DeathTest::OVERSEE_TEST),
+      status_(0),
+      passed_(true),
+      assume_role_calls_(0),
+      wait_calls_(0),
+      passed_args_(),
+      abort_args_() {
+}
+
+
+// Sets the parameters for subsequent calls to Create.
+void MockDeathTestFactory::SetParameters(bool create,
+                                         DeathTest::TestRole role,
+                                         int status, bool passed) {
+  create_ = create;
+  role_ = role;
+  status_ = status;
+  passed_ = passed;
+
+  assume_role_calls_ = 0;
+  wait_calls_ = 0;
+  passed_args_.clear();
+  abort_args_.clear();
+}
+
+
+// Sets test to NULL (if create_ is false) or to the address of a new
+// MockDeathTest object with parameters taken from the last call
+// to SetParameters (if create_ is true).  Always returns true.
+bool MockDeathTestFactory::Create(const char* /*statement*/,
+                                  const ::testing::internal::RE* /*regex*/,
+                                  const char* /*file*/,
+                                  int /*line*/,
+                                  DeathTest** test) {
+  test_deleted_ = false;
+  if (create_) {
+    *test = new MockDeathTest(this, role_, status_, passed_);
+  } else {
+    *test = NULL;
+  }
+  return true;
+}
+
+// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.
+// It installs a MockDeathTestFactory that is used for the duration
+// of the test case.
+class MacroLogicDeathTest : public testing::Test {
+ protected:
+  static testing::internal::ReplaceDeathTestFactory* replacer_;
+  static MockDeathTestFactory* factory_;
+
+  static void SetUpTestCase() {
+    factory_ = new MockDeathTestFactory;
+    replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_);
+  }
+
+  static void TearDownTestCase() {
+    delete replacer_;
+    replacer_ = NULL;
+    delete factory_;
+    factory_ = NULL;
+  }
+
+  // Runs a death test that breaks the rules by returning.  Such a death
+  // test cannot be run directly from a test routine that uses a
+  // MockDeathTest, or the remainder of the routine will not be executed.
+  static void RunReturningDeathTest(bool* flag) {
+    ASSERT_DEATH({  // NOLINT
+      *flag = true;
+      return;
+    }, "");
+  }
+};
+
+testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_
+    = NULL;
+MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;
+
+
+// Test that nothing happens when the factory doesn't return a DeathTest:
+TEST_F(MacroLogicDeathTest, NothingHappens) {
+  bool flag = false;
+  factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(0, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_FALSE(factory_->TestDeleted());
+}
+
+// Test that the parent process doesn't run the death test code,
+// and that the Passed method returns false when the (simulated)
+// child process exits with status 0:
+TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_FALSE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the Passed method was given the argument "true" when
+// the (simulated) child process exits with status 1:
+TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_TRUE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process executes the death test
+// code, and is aborted with the correct AbortReason if it
+// executes a return statement.
+TEST_F(MacroLogicDeathTest, ChildPerformsReturn) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  RunReturningDeathTest(&flag);
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(1, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(0));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process is aborted with the
+// correct AbortReason if it does not die.
+TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  // This time there are two calls to Abort: one since the test didn't
+  // die, and another from the ReturnSentinel when it's destroyed.  The
+  // sentinel normally isn't destroyed if a test doesn't die, since
+  // _exit(2) is called in that case by ForkingDeathTest, but not by
+  // our MockDeathTest.
+  ASSERT_EQ(2, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,
+            factory_->AbortArgument(0));
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(1));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that a successful death test does not register a successful
+// test part.
+TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
+  EXPECT_DEATH(_exit(1), "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+TEST(StreamingAssertionsDeathTest, DeathTest) {
+  EXPECT_DEATH(_exit(1), "") << "unexpected failure";
+  ASSERT_DEATH(_exit(1), "") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+}
+
+// Tests that GetLastErrnoDescription returns an empty string when the
+// last error is 0 and non-empty string when it is non-zero.
+TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {
+  errno = ENOENT;
+  EXPECT_STRNE("", GetLastErrnoDescription().c_str());
+  errno = 0;
+  EXPECT_STREQ("", GetLastErrnoDescription().c_str());
+}
+
+# if GTEST_OS_WINDOWS
+TEST(AutoHandleTest, AutoHandleWorks) {
+  HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+
+  // Tests that the AutoHandle is correctly initialized with a handle.
+  testing::internal::AutoHandle auto_handle(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that Reset assigns INVALID_HANDLE_VALUE.
+  // Note that this cannot verify whether the original handle is closed.
+  auto_handle.Reset();
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());
+
+  // Tests that Reset assigns the new handle.
+  // Note that this cannot verify whether the original handle is closed.
+  handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+  auto_handle.Reset(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.
+  testing::internal::AutoHandle auto_handle2;
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());
+}
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_WINDOWS
+typedef unsigned __int64 BiggestParsable;
+typedef signed __int64 BiggestSignedParsable;
+# else
+typedef unsigned long long BiggestParsable;
+typedef signed long long BiggestSignedParsable;
+# endif  // GTEST_OS_WINDOWS
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the
+// max() macro defined by <windows.h>.
+const BiggestParsable kBiggestParsableMax = ULLONG_MAX;
+const BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX;
+
+TEST(ParseNaturalNumberTest, RejectsInvalidFormat) {
+  BiggestParsable result = 0;
+
+  // Rejects non-numbers.
+  EXPECT_FALSE(ParseNaturalNumber("non-number string", &result));
+
+  // Rejects numbers with whitespace prefix.
+  EXPECT_FALSE(ParseNaturalNumber(" 123", &result));
+
+  // Rejects negative numbers.
+  EXPECT_FALSE(ParseNaturalNumber("-123", &result));
+
+  // Rejects numbers starting with a plus sign.
+  EXPECT_FALSE(ParseNaturalNumber("+123", &result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {
+  BiggestParsable result = 0;
+
+  EXPECT_FALSE(ParseNaturalNumber("99999999999999999999999", &result));
+
+  signed char char_result = 0;
+  EXPECT_FALSE(ParseNaturalNumber("200", &char_result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, AcceptsValidNumbers) {
+  BiggestParsable result = 0;
+
+  result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &result));
+  EXPECT_EQ(123U, result);
+
+  // Check 0 as an edge case.
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("0", &result));
+  EXPECT_EQ(0U, result);
+
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("00000", &result));
+  EXPECT_EQ(0U, result);
+}
+
+TEST(ParseNaturalNumberTest, AcceptsTypeLimits) {
+  Message msg;
+  msg << kBiggestParsableMax;
+
+  BiggestParsable result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));
+  EXPECT_EQ(kBiggestParsableMax, result);
+
+  Message msg2;
+  msg2 << kBiggestSignedParsableMax;
+
+  BiggestSignedParsable signed_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));
+  EXPECT_EQ(kBiggestSignedParsableMax, signed_result);
+
+  Message msg3;
+  msg3 << INT_MAX;
+
+  int int_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));
+  EXPECT_EQ(INT_MAX, int_result);
+
+  Message msg4;
+  msg4 << UINT_MAX;
+
+  unsigned int uint_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));
+  EXPECT_EQ(UINT_MAX, uint_result);
+}
+
+TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
+  short short_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &short_result));
+  EXPECT_EQ(123, short_result);
+
+  signed char char_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &char_result));
+  EXPECT_EQ(123, char_result);
+}
+
+# if GTEST_OS_WINDOWS
+TEST(EnvironmentTest, HandleFitsIntoSizeT) {
+  // TODO(vladl at google.com): Remove this test after this condition is verified
+  // in a static assertion in gtest-death-test.cc in the function
+  // GetStatusFileDescriptor.
+  ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger
+// failures when death tests are available on the system.
+TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) {
+  EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"),
+                            "death inside CondDeathTestExpectMacro");
+  ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"),
+                            "death inside CondDeathTestAssertMacro");
+
+  // Empty statement will not crash, which must trigger a failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), "");
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), "");
+}
+
+#else
+
+using testing::internal::CaptureStderr;
+using testing::internal::GetCapturedStderr;
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still
+// defined but do not trigger failures when death tests are not available on
+// the system.
+TEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) {
+  // Empty statement will not crash, but that should not trigger a failure
+  // when death tests are not supported.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "");
+  std::string output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  // The streamed message should not be printed as there is no test failure.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message";
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "");  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message";  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+}
+
+void FuncWithAssert(int* n) {
+  ASSERT_DEATH_IF_SUPPORTED(return;, "");
+  (*n)++;
+}
+
+// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current
+// function (as ASSERT_DEATH does) if death tests are not supported.
+TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {
+  int n = 0;
+  FuncWithAssert(&n);
+  EXPECT_EQ(1, n);
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+//
+// The syntax should work whether death tests are available or not.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH_IF_SUPPORTED(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3;
+}
+
+// Tests that conditional death test macros expand to code which interacts
+// well with switch statements.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4065)
+#endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH_IF_SUPPORTED(_exit(1), "")
+          << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case";
+
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif  // _MSC_VER
+}
+
+// Tests that a test case whose name ends with "DeathTest" works fine
+// on Windows.
+TEST(NotADeathTest, Test) {
+  SUCCEED();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest-filepath_test.cc b/vendor/gtest-1.7.0/test/gtest-filepath_test.cc
new file mode 100644
index 0000000..ae9f55a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-filepath_test.cc
@@ -0,0 +1,680 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest_unittest.cc, to avoid changing
+// build or make-files for some existing Google Test clients. Do not
+// #include this file anywhere else!
+
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // NOLINT
+#elif GTEST_OS_WINDOWS
+# include <direct.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+namespace testing {
+namespace internal {
+namespace {
+
+#if GTEST_OS_WINDOWS_MOBILE
+// TODO(wan at google.com): Move these to the POSIX adapter section in
+// gtest-port.h.
+
+// Windows CE doesn't have the remove C function.
+int remove(const char* path) {
+  LPCWSTR wpath = String::AnsiToUtf16(path);
+  int ret = DeleteFile(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+// Windows CE doesn't have the _rmdir C function.
+int _rmdir(const char* path) {
+  FilePath filepath(path);
+  LPCWSTR wpath = String::AnsiToUtf16(
+      filepath.RemoveTrailingPathSeparator().c_str());
+  int ret = RemoveDirectory(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+
+#else
+
+TEST(GetCurrentDirTest, ReturnsCurrentDir) {
+  const FilePath original_dir = FilePath::GetCurrentDir();
+  EXPECT_FALSE(original_dir.IsEmpty());
+
+  posix::ChDir(GTEST_PATH_SEP_);
+  const FilePath cwd = FilePath::GetCurrentDir();
+  posix::ChDir(original_dir.c_str());
+
+# if GTEST_OS_WINDOWS
+
+  // Skips the ":".
+  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
+  ASSERT_TRUE(cwd_without_drive != NULL);
+  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
+
+# else
+
+  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
+
+# endif
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
+  EXPECT_TRUE(FilePath("").IsEmpty());
+}
+
+TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
+  EXPECT_FALSE(FilePath("a").IsEmpty());
+  EXPECT_FALSE(FilePath(".").IsEmpty());
+  EXPECT_FALSE(FilePath("a/b").IsEmpty());
+  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
+}
+
+// RemoveDirectoryName "" -> ""
+TEST(RemoveDirectoryNameTest, WhenEmptyName) {
+  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ButNoDirectory) {
+  EXPECT_EQ("afile",
+      FilePath("afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/" -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
+  EXPECT_EQ("",
+      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/subdir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveDirectoryName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveDirectoryName() works with the alternate separator
+// on Windows.
+
+// RemoveDirectoryName("/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/") -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
+  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/subdir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile",
+            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
+}
+
+#endif
+
+// RemoveFileName "" -> "./"
+TEST(RemoveFileNameTest, EmptyName) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // On Windows CE, we use the root as the current directory.
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#else
+  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#endif
+}
+
+// RemoveFileName "adir/" -> "adir/"
+TEST(RemoveFileNameTest, ButNoFile) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
+}
+
+// RemoveFileName "adir/afile" -> "adir/"
+TEST(RemoveFileNameTest, GivesDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveFileName().string());
+}
+
+// RemoveFileName "/afile" -> "/"
+TEST(RemoveFileNameTest, GivesRootDir) {
+  EXPECT_EQ(GTEST_PATH_SEP_,
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveFileName() works with the alternate separator on
+// Windows.
+
+// RemoveFileName("adir/") -> "adir/"
+TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/afile") -> "adir/"
+TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+            FilePath("adir/subdir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("/afile") -> "\"
+TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
+}
+
+#endif
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      14, "xml");
+  EXPECT_EQ("bar_14.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path2BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
+}
+
+TEST(ConcatPathsTest, BothPathBeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath(""));
+  EXPECT_EQ("", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
+                                          FilePath("foobar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(
+      FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar" GTEST_PATH_SEP_));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
+}
+
+// RemoveTrailingPathSeparator "" -> ""
+TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
+  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
+  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
+  EXPECT_EQ("foo",
+      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
+#endif
+}
+
+// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
+                .RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
+TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar")
+                .RemoveTrailingPathSeparator().string());
+}
+
+TEST(DirectoryTest, RootDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+  char current_drive[_MAX_PATH];  // NOLINT
+  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
+  current_drive[1] = ':';
+  current_drive[2] = '\\';
+  current_drive[3] = '\0';
+  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
+#else
+  EXPECT_TRUE(FilePath("/").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+#if GTEST_OS_WINDOWS
+TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
+  const int saved_drive_ = _getdrive();
+  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
+  for (char drive = 'Z'; drive >= 'A'; drive--)
+    if (_chdrive(drive - 'A' + 1) == -1) {
+      char non_drive[_MAX_PATH];  // NOLINT
+      non_drive[0] = drive;
+      non_drive[1] = ':';
+      non_drive[2] = '\\';
+      non_drive[3] = '\0';
+      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
+      break;
+    }
+  _chdrive(saved_drive_);
+}
+#endif  // GTEST_OS_WINDOWS
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Windows CE _does_ consider an empty directory to exist.
+TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
+  EXPECT_FALSE(FilePath("").DirectoryExists());
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(DirectoryTest, CurrentDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
+
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
+
+# endif  // _WIN32_CE
+#else
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath("./").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+// "foo/bar" == foo//bar" == "foo///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
+                     GTEST_PATH_SEP_ "bar").string());
+}
+
+// "/bar" == //bar" == "///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+}
+
+// "foo/" == foo//" == "foo///"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that separators at the end of the string are normalized
+// regardless of their combination (e.g. "foo\" =="foo/\" ==
+// "foo\\/").
+TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo" GTEST_PATH_SEP_ "/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo//" GTEST_PATH_SEP_).string());
+}
+
+#endif
+
+TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
+  FilePath default_path;
+  FilePath non_default_path("path");
+  non_default_path = default_path;
+  EXPECT_EQ("", non_default_path.string());
+  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
+  FilePath non_default_path("path");
+  FilePath default_path;
+  default_path = non_default_path;
+  EXPECT_EQ("path", default_path.string());
+  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
+  const FilePath const_default_path("const_path");
+  FilePath non_default_path("path");
+  non_default_path = const_default_path;
+  EXPECT_EQ("const_path", non_default_path.string());
+}
+
+class DirectoryCreationTest : public Test {
+ protected:
+  virtual void SetUp() {
+    testdata_path_.Set(FilePath(
+        TempDir() + GetCurrentExecutableName().string() +
+        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
+    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
+
+    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        0, "txt"));
+    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        1, "txt"));
+
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  virtual void TearDown() {
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  std::string TempDir() const {
+#if GTEST_OS_WINDOWS_MOBILE
+    return "\\temp\\";
+#elif GTEST_OS_WINDOWS
+    const char* temp_dir = posix::GetEnv("TEMP");
+    if (temp_dir == NULL || temp_dir[0] == '\0')
+      return "\\temp\\";
+    else if (temp_dir[strlen(temp_dir) - 1] == '\\')
+      return temp_dir;
+    else
+      return std::string(temp_dir) + "\\";
+#elif GTEST_OS_LINUX_ANDROID
+    return "/sdcard/";
+#else
+    return "/tmp/";
+#endif  // GTEST_OS_WINDOWS_MOBILE
+  }
+
+  void CreateTextFile(const char* filename) {
+    FILE* f = posix::FOpen(filename, "w");
+    fprintf(f, "text\n");
+    fclose(f);
+  }
+
+  // Strings representing a directory and a file, with identical paths
+  // except for the trailing separator character that distinquishes
+  // a directory named 'test' from a file named 'test'. Example names:
+  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
+  FilePath testdata_file_;  // "/tmp/directory_creation/test"
+  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
+  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
+};
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  EXPECT_TRUE(testdata_path_.DirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  // Call 'create' again... should still succeed.
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
+  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file0_.string(), file_path.string());
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
+
+  testdata_path_.CreateDirectoriesRecursively();
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
+  CreateTextFile(file_path.c_str());
+  EXPECT_TRUE(file_path.FileOrDirectoryExists());
+
+  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file1_.string(), file_path2.string());
+  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
+  CreateTextFile(file_path2.c_str());
+  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
+  // force a failure by putting a file where we will try to create a directory.
+  CreateTextFile(testdata_file_.c_str());
+  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
+  EXPECT_FALSE(testdata_file_.DirectoryExists());
+  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
+}
+
+TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
+  const FilePath test_detail_xml("test_detail.xml");
+  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
+}
+
+TEST(FilePathTest, DefaultConstructor) {
+  FilePath fp;
+  EXPECT_EQ("", fp.string());
+}
+
+TEST(FilePathTest, CharAndCopyConstructors) {
+  const FilePath fp("spicy");
+  EXPECT_EQ("spicy", fp.string());
+
+  const FilePath fp_copy(fp);
+  EXPECT_EQ("spicy", fp_copy.string());
+}
+
+TEST(FilePathTest, StringConstructor) {
+  const FilePath fp(std::string("cider"));
+  EXPECT_EQ("cider", fp.string());
+}
+
+TEST(FilePathTest, Set) {
+  const FilePath apple("apple");
+  FilePath mac("mac");
+  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
+  EXPECT_EQ("apple", mac.string());
+  EXPECT_EQ("apple", apple.string());
+}
+
+TEST(FilePathTest, ToString) {
+  const FilePath file("drink");
+  EXPECT_EQ("drink", file.string());
+}
+
+TEST(FilePathTest, RemoveExtension) {
+  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
+  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
+  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
+  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, IsDirectory) {
+  EXPECT_FALSE(FilePath("cola").IsDirectory());
+  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_TRUE(FilePath("koala/").IsDirectory());
+#endif
+}
+
+TEST(FilePathTest, IsAbsolutePath) {
+  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("").IsAbsolutePath());
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
+  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+#else
+  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
+              .IsAbsolutePath());
+#endif  // GTEST_OS_WINDOWS
+}
+
+TEST(FilePathTest, IsRootDirectory) {
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
+  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
+  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
+  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
+#else
+  EXPECT_TRUE(FilePath("/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("//").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
+  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/test/gtest-linked_ptr_test.cc b/vendor/gtest-1.7.0/test/gtest-linked_ptr_test.cc
new file mode 100644
index 0000000..6fcf512
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-linked_ptr_test.cc
@@ -0,0 +1,154 @@
+// Copyright 2003, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+// Ported to Windows: Vadim Berman (vadimb at google.com)
+
+#include "gtest/internal/gtest-linked_ptr.h"
+
+#include <stdlib.h>
+#include "gtest/gtest.h"
+
+namespace {
+
+using testing::Message;
+using testing::internal::linked_ptr;
+
+int num;
+Message* history = NULL;
+
+// Class which tracks allocation/deallocation
+class A {
+ public:
+  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
+  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "A" << mynum << " use\n"; }
+ protected:
+  int mynum;
+};
+
+// Subclass
+class B : public A {
+ public:
+  B() { *history << "B" << mynum << " ctor\n"; }
+  ~B() { *history << "B" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "B" << mynum << " use\n"; }
+};
+
+class LinkedPtrTest : public testing::Test {
+ public:
+  LinkedPtrTest() {
+    num = 0;
+    history = new Message;
+  }
+
+  virtual ~LinkedPtrTest() {
+    delete history;
+    history = NULL;
+  }
+};
+
+TEST_F(LinkedPtrTest, GeneralTest) {
+  {
+    linked_ptr<A> a0, a1, a2;
+    // Use explicit function call notation here to suppress self-assign warning.
+    a0.operator=(a0);
+    a1 = a2;
+    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
+    ASSERT_TRUE(a0 == NULL);
+    ASSERT_TRUE(a1 == NULL);
+    ASSERT_TRUE(a2 == NULL);
+
+    {
+      linked_ptr<A> a3(new A);
+      a0 = a3;
+      ASSERT_TRUE(a0 == a3);
+      ASSERT_TRUE(a0 != NULL);
+      ASSERT_TRUE(a0.get() == a3);
+      ASSERT_TRUE(a0 == a3.get());
+      linked_ptr<A> a4(a0);
+      a1 = a4;
+      linked_ptr<A> a5(new A);
+      ASSERT_TRUE(a5.get() != a3);
+      ASSERT_TRUE(a5 != a3.get());
+      a2 = a5;
+      linked_ptr<B> b0(new B);
+      linked_ptr<A> a6(b0);
+      ASSERT_TRUE(b0 == a6);
+      ASSERT_TRUE(a6 == b0);
+      ASSERT_TRUE(b0 != NULL);
+      a5 = b0;
+      a5 = b0;
+      a3->Use();
+      a4->Use();
+      a5->Use();
+      a6->Use();
+      b0->Use();
+      (*b0).Use();
+      b0.get()->Use();
+    }
+
+    a0->Use();
+    a1->Use();
+    a2->Use();
+
+    a1 = a2;
+    a2.reset(new A);
+    a0.reset();
+
+    linked_ptr<A> a7;
+  }
+
+  ASSERT_STREQ(
+    "A0 ctor\n"
+    "A1 ctor\n"
+    "A2 ctor\n"
+    "B2 ctor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 dtor\n"
+    "A2 dtor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "A1 use\n"
+    "A3 ctor\n"
+    "A0 dtor\n"
+    "A3 dtor\n"
+    "A1 dtor\n",
+    history->GetString().c_str());
+}
+
+}  // Unnamed namespace
diff --git a/vendor/gtest-1.7.0/test/gtest-listener_test.cc b/vendor/gtest-1.7.0/test/gtest-listener_test.cc
new file mode 100644
index 0000000..99662cf
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-listener_test.cc
@@ -0,0 +1,310 @@
+// Copyright 2009 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file verifies Google Test event listeners receive events at the
+// right times.
+
+#include "gtest/gtest.h"
+#include <vector>
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Environment;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListener;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+// Used by tests to register their events.
+std::vector<std::string>* g_events = NULL;
+
+namespace testing {
+namespace internal {
+
+class EventRecordingListener : public TestEventListener {
+ public:
+  explicit EventRecordingListener(const char* name) : name_(name) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationStart")
+            << "(" << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
+  }
+
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
+  }
+
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
+  }
+
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestStart"));
+  }
+
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
+    g_events->push_back(GetFullMethodName("OnTestPartResult"));
+  }
+
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestEnd"));
+  }
+
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
+  }
+
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
+  }
+
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationEnd")
+            << "("  << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
+  }
+
+ private:
+  std::string GetFullMethodName(const char* name) {
+    return name_ + "." + name;
+  }
+
+  std::string name_;
+};
+
+class EnvironmentInvocationCatcher : public Environment {
+ protected:
+  virtual void SetUp() {
+    g_events->push_back("Environment::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("Environment::TearDown");
+  }
+};
+
+class ListenerTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    g_events->push_back("ListenerTest::SetUpTestCase");
+  }
+
+  static void TearDownTestCase() {
+    g_events->push_back("ListenerTest::TearDownTestCase");
+  }
+
+  virtual void SetUp() {
+    g_events->push_back("ListenerTest::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("ListenerTest::TearDown");
+  }
+};
+
+TEST_F(ListenerTest, DoesFoo) {
+  // Test execution order within a test case is not guaranteed so we are not
+  // recording the test name.
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+TEST_F(ListenerTest, DoesBar) {
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+}  // namespace internal
+
+}  // namespace testing
+
+using ::testing::internal::EnvironmentInvocationCatcher;
+using ::testing::internal::EventRecordingListener;
+
+void VerifyResults(const std::vector<std::string>& data,
+                   const char* const* expected_data,
+                   int expected_data_size) {
+  const int actual_size = data.size();
+  // If the following assertion fails, a new entry will be appended to
+  // data.  Hence we save data.size() first.
+  EXPECT_EQ(expected_data_size, actual_size);
+
+  // Compares the common prefix.
+  const int shorter_size = expected_data_size <= actual_size ?
+      expected_data_size : actual_size;
+  int i = 0;
+  for (; i < shorter_size; ++i) {
+    ASSERT_STREQ(expected_data[i], data[i].c_str())
+        << "at position " << i;
+  }
+
+  // Prints extra elements in the actual data.
+  for (; i < actual_size; ++i) {
+    printf("  Actual event #%d: %s\n", i, data[i].c_str());
+  }
+}
+
+int main(int argc, char **argv) {
+  std::vector<std::string> events;
+  g_events = &events;
+  InitGoogleTest(&argc, argv);
+
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("1st"));
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("2nd"));
+
+  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
+
+  GTEST_CHECK_(events.size() == 0)
+      << "AddGlobalTestEnvironment should not generate any events itself.";
+
+  ::testing::GTEST_FLAG(repeat) = 2;
+  int ret_val = RUN_ALL_TESTS();
+
+  const char* const expected_events[] = {
+    "1st.OnTestProgramStart",
+    "2nd.OnTestProgramStart",
+    "1st.OnTestIterationStart(0)",
+    "2nd.OnTestIterationStart(0)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(0)",
+    "1st.OnTestIterationEnd(0)",
+    "1st.OnTestIterationStart(1)",
+    "2nd.OnTestIterationStart(1)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(1)",
+    "1st.OnTestIterationEnd(1)",
+    "2nd.OnTestProgramEnd",
+    "1st.OnTestProgramEnd"
+  };
+  VerifyResults(events,
+                expected_events,
+                sizeof(expected_events)/sizeof(expected_events[0]));
+
+  // We need to check manually for ad hoc test failures that happen after
+  // RUN_ALL_TESTS finishes.
+  if (UnitTest::GetInstance()->Failed())
+    ret_val = 1;
+
+  return ret_val;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest-message_test.cc b/vendor/gtest-1.7.0/test/gtest-message_test.cc
new file mode 100644
index 0000000..175238e
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-message_test.cc
@@ -0,0 +1,159 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for the Message class.
+
+#include "gtest/gtest-message.h"
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::Message;
+
+// Tests the testing::Message class
+
+// Tests the default constructor.
+TEST(MessageTest, DefaultConstructor) {
+  const Message msg;
+  EXPECT_EQ("", msg.GetString());
+}
+
+// Tests the copy constructor.
+TEST(MessageTest, CopyConstructor) {
+  const Message msg1("Hello");
+  const Message msg2(msg1);
+  EXPECT_EQ("Hello", msg2.GetString());
+}
+
+// Tests constructing a Message from a C-string.
+TEST(MessageTest, ConstructsFromCString) {
+  Message msg("Hello");
+  EXPECT_EQ("Hello", msg.GetString());
+}
+
+// Tests streaming a float.
+TEST(MessageTest, StreamsFloat) {
+  const std::string s = (Message() << 1.23456F << " " << 2.34567F).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s.c_str());
+}
+
+// Tests streaming a double.
+TEST(MessageTest, StreamsDouble) {
+  const std::string s = (Message() << 1260570880.4555497 << " "
+                                  << 1260572265.1954534).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s.c_str());
+}
+
+// Tests streaming a non-char pointer.
+TEST(MessageTest, StreamsPointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_NE("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a NULL non-char pointer.
+TEST(MessageTest, StreamsNullPointer) {
+  int* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a C string.
+TEST(MessageTest, StreamsCString) {
+  EXPECT_EQ("Foo", (Message() << "Foo").GetString());
+}
+
+// Tests streaming a NULL C string.
+TEST(MessageTest, StreamsNullCString) {
+  char* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming std::string.
+TEST(MessageTest, StreamsString) {
+  const ::std::string str("Hello");
+  EXPECT_EQ("Hello", (Message() << str).GetString());
+}
+
+// Tests that we can output strings containing embedded NULs.
+TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
+  const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  const ::std::string string_with_nul(char_array_with_nul,
+                                      sizeof(char_array_with_nul) - 1);
+  EXPECT_EQ("Here's a NUL\\0 and some more string",
+            (Message() << string_with_nul).GetString());
+}
+
+// Tests streaming a NUL char.
+TEST(MessageTest, StreamsNULChar) {
+  EXPECT_EQ("\\0", (Message() << '\0').GetString());
+}
+
+// Tests streaming int.
+TEST(MessageTest, StreamsInt) {
+  EXPECT_EQ("123", (Message() << 123).GetString());
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to Message.
+TEST(MessageTest, StreamsBasicIoManip) {
+  EXPECT_EQ("Line 1.\nA NUL char \\0 in line 2.",
+               (Message() << "Line 1." << std::endl
+                         << "A NUL char " << std::ends << std::flush
+                         << " in line 2.").GetString());
+}
+
+// Tests Message::GetString()
+TEST(MessageTest, GetString) {
+  Message msg;
+  msg << 1 << " lamb";
+  EXPECT_EQ("1 lamb", msg.GetString());
+}
+
+// Tests streaming a Message object to an ostream.
+TEST(MessageTest, StreamsToOStream) {
+  Message msg("Hello");
+  ::std::stringstream ss;
+  ss << msg;
+  EXPECT_EQ("Hello", testing::internal::StringStreamToString(&ss));
+}
+
+// Tests that a Message object doesn't take up too much stack space.
+TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
+  EXPECT_LE(sizeof(Message), 16U);
+}
+
+}  // namespace
diff --git a/vendor/gtest-1.7.0/test/gtest-options_test.cc b/vendor/gtest-1.7.0/test/gtest-options_test.cc
new file mode 100644
index 0000000..5586dc3
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-options_test.cc
@@ -0,0 +1,215 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test UnitTestOptions tests
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest.cc, to avoid changing build or
+// make-files on Windows and other platforms. Do not #include this file
+// anywhere else!
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+namespace {
+
+// Turns the given relative path into an absolute path.
+FilePath GetAbsolutePathOf(const FilePath& relative_path) {
+  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
+}
+
+// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
+
+TEST(XmlOutputTest, GetOutputFormatDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFormat) {
+  GTEST_FLAG(output) = "xml:filename";
+  EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFileDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileSingleFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      GetAbsolutePathOf(
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
+  const std::string exe_str = GetCurrentExecutableName().string();
+#if GTEST_OS_WINDOWS
+  const bool success =
+      _strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
+#else
+  // TODO(wan at google.com): remove the hard-coded "lt-" prefix when
+  //   Chandler Carruth's libtool replacement is ready.
+  const bool success =
+      exe_str == "gtest-options_test" ||
+      exe_str == "gtest_all_test" ||
+      exe_str == "lt-gtest_all_test" ||
+      exe_str == "gtest_dll_test";
+#endif  // GTEST_OS_WINDOWS
+  if (!success)
+    FAIL() << "GetCurrentExecutableName() returns " << exe_str;
+}
+
+class XmlOutputChangeDirTest : public Test {
+ protected:
+  virtual void SetUp() {
+    original_working_dir_ = FilePath::GetCurrentDir();
+    posix::ChDir("..");
+    // This will make the test fail if run from the root directory.
+    EXPECT_NE(original_working_dir_.string(),
+              FilePath::GetCurrentDir().string());
+  }
+
+  virtual void TearDown() {
+    posix::ChDir(original_working_dir_.string().c_str());
+  }
+
+  FilePath original_working_dir_;
+};
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
+  GTEST_FLAG(output) = "xml";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      FilePath::ConcatPaths(
+          original_working_dir_,
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
+#if GTEST_OS_WINDOWS
+  GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
+  EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#else
+  GTEST_FLAG(output) ="xml:/tmp/filename.abc";
+  EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
+#if GTEST_OS_WINDOWS
+  const std::string path = "c:\\tmp\\";
+#else
+  const std::string path = "/tmp/";
+#endif
+
+  GTEST_FLAG(output) = "xml:" + path;
+  const std::string expected_output_file =
+      path + GetCurrentExecutableName().string() + ".xml";
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/test/gtest-param-test2_test.cc b/vendor/gtest-1.7.0/test/gtest-param-test2_test.cc
new file mode 100644
index 0000000..4a782fe
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-param-test2_test.cc
@@ -0,0 +1,65 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+#include "test/gtest-param-test_test.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::Values;
+using ::testing::internal::ParamGenerator;
+
+// Tests that generators defined in a different translation unit
+// are functional. The test using extern_gen is defined
+// in gtest-param-test_test.cc.
+ParamGenerator<int> extern_gen = Values(33);
+
+// Tests that a parameterized test case can be defined in one translation unit
+// and instantiated in another. The test is defined in gtest-param-test_test.cc
+// and ExternalInstantiationTest fixture class is defined in
+// gtest-param-test_test.h.
+INSTANTIATE_TEST_CASE_P(MultiplesOf33,
+                        ExternalInstantiationTest,
+                        Values(33, 66));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. Another instantiation is defined
+// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
+// fixture is defined in gtest-param-test_test.h
+INSTANTIATE_TEST_CASE_P(Sequence2,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42*3, 42*4, 42*5));
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/vendor/gtest-1.7.0/test/gtest-param-test_test.cc b/vendor/gtest-1.7.0/test/gtest-param-test_test.cc
new file mode 100644
index 0000000..f60cb8a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-param-test_test.cc
@@ -0,0 +1,904 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. This file verifies that the parameter
+// generators objects produce correct parameter sequences and that
+// Google Test runtime instantiates correct tests from those sequences.
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+# include <algorithm>
+# include <iostream>
+# include <list>
+# include <sstream>
+# include <string>
+# include <vector>
+
+// To include gtest-internal-inl.h.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"  // for UnitTestOptions
+# undef GTEST_IMPLEMENTATION_
+
+# include "test/gtest-param-test_test.h"
+
+using ::std::vector;
+using ::std::sort;
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Bool;
+using ::testing::Message;
+using ::testing::Range;
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::ValuesIn;
+
+# if GTEST_HAS_COMBINE
+using ::testing::Combine;
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+# endif  // GTEST_HAS_COMBINE
+
+using ::testing::internal::ParamGenerator;
+using ::testing::internal::UnitTestOptions;
+
+// Prints a value to a string.
+//
+// TODO(wan at google.com): remove PrintValue() when we move matchers and
+// EXPECT_THAT() from Google Mock to Google Test.  At that time, we
+// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
+// EXPECT_THAT() and the matchers know how to print tuples.
+template <typename T>
+::std::string PrintValue(const T& value) {
+  ::std::stringstream stream;
+  stream << value;
+  return stream.str();
+}
+
+# if GTEST_HAS_COMBINE
+
+// These overloads allow printing tuples in our tests.  We cannot
+// define an operator<< for tuples, as that definition needs to be in
+// the std namespace in order to be picked up by Google Test via
+// Argument-Dependent Lookup, yet defining anything in the std
+// namespace in non-STL code is undefined behavior.
+
+template <typename T1, typename T2>
+::std::string PrintValue(const tuple<T1, T2>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3>
+::std::string PrintValue(const tuple<T1, T2, T3>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+::std::string PrintValue(
+    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ", " << get<3>(value)
+         << ", "<< get<4>(value) << ", " << get<5>(value)
+         << ", "<< get<6>(value) << ", " << get<7>(value)
+         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
+  return stream.str();
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Verifies that a sequence generated by the generator and accessed
+// via the iterator object matches the expected one using Google Test
+// assertions.
+template <typename T, size_t N>
+void VerifyGenerator(const ParamGenerator<T>& generator,
+                     const T (&expected_values)[N]) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the copy constructor.\n";
+    // We cannot use EXPECT_EQ() here as the values may be tuples,
+    // which don't support <<.
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the copy constructor.\n";
+
+  // Test the iterator assignment. The following lines verify that
+  // the sequence accessed via an iterator initialized via the
+  // assignment operator (as opposed to a copy constructor) matches
+  // just the same.
+  it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the assignment operator.\n";
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the assignment operator.\n";
+}
+
+template <typename T>
+void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+
+  it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+}
+
+// Generator tests. They test that each of the provided generator functions
+// generates an expected sequence of values. The general test pattern
+// instantiates a generator using one of the generator functions,
+// checks the sequence produced by the generator using its iterator API,
+// and then resets the iterator back to the beginning of the sequence
+// and checks the sequence again.
+
+// Tests that iterators produced by generator functions conform to the
+// ForwardIterator concept.
+TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
+  const ParamGenerator<int> gen = Range(0, 10);
+  ParamGenerator<int>::iterator it = gen.begin();
+
+  // Verifies that iterator initialization works as expected.
+  ParamGenerator<int>::iterator it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that iterator assignment works as expected.
+  it++;
+  EXPECT_FALSE(*it == *it2);
+  it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that prefix operator++() returns *this.
+  EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
+                          << "refer to the original object";
+
+  // Verifies that the result of the postfix operator++ points to the value
+  // pointed to by the original iterator.
+  int original_value = *it;  // Have to compute it outside of macro call to be
+                             // unaffected by the parameter evaluation order.
+  EXPECT_EQ(original_value, *(it++));
+
+  // Verifies that prefix and postfix operator++() advance an iterator
+  // all the same.
+  it2 = it;
+  it++;
+  ++it2;
+  EXPECT_TRUE(*it == *it2);
+}
+
+// Tests that Range() generates the expected sequence.
+TEST(RangeTest, IntRangeWithDefaultStep) {
+  const ParamGenerator<int> gen = Range(0, 3);
+  const int expected_values[] = {0, 1, 2};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() generates the single element sequence
+// as expected when provided with range limits that are equal.
+TEST(RangeTest, IntRangeSingleValue) {
+  const ParamGenerator<int> gen = Range(0, 1);
+  const int expected_values[] = {0};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() with generates empty sequence when
+// supplied with an empty range.
+TEST(RangeTest, IntRangeEmpty) {
+  const ParamGenerator<int> gen = Range(0, 0);
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence.
+TEST(RangeTest, IntRangeWithCustomStep) {
+  const ParamGenerator<int> gen = Range(0, 9, 3);
+  const int expected_values[] = {0, 3, 6};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence when the last element does not fall on the
+// upper range limit. Sequences generated by Range() must not have
+// elements beyond the range limits.
+TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
+  const ParamGenerator<int> gen = Range(0, 4, 3);
+  const int expected_values[] = {0, 3};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Verifies that Range works with user-defined types that define
+// copy constructor, operator=(), operator+(), and operator<().
+class DogAdder {
+ public:
+  explicit DogAdder(const char* a_value) : value_(a_value) {}
+  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
+
+  DogAdder operator=(const DogAdder& other) {
+    if (this != &other)
+      value_ = other.value_;
+    return *this;
+  }
+  DogAdder operator+(const DogAdder& other) const {
+    Message msg;
+    msg << value_.c_str() << other.value_.c_str();
+    return DogAdder(msg.GetString().c_str());
+  }
+  bool operator<(const DogAdder& other) const {
+    return value_ < other.value_;
+  }
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+TEST(RangeTest, WorksWithACustomType) {
+  const ParamGenerator<DogAdder> gen =
+      Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
+  ParamGenerator<DogAdder>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_STREQ("cat", it->value().c_str());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_STREQ("catdog", it->value().c_str());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+class IntWrapper {
+ public:
+  explicit IntWrapper(int a_value) : value_(a_value) {}
+  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
+
+  IntWrapper operator=(const IntWrapper& other) {
+    value_ = other.value_;
+    return *this;
+  }
+  // operator+() adds a different type.
+  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
+  bool operator<(const IntWrapper& other) const {
+    return value_ < other.value_;
+  }
+  int value() const { return value_; }
+
+ private:
+  int value_;
+};
+
+TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
+  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
+  ParamGenerator<IntWrapper>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_EQ(0, it->value());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_EQ(1, it->value());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+// Tests that ValuesIn() with an array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInArray) {
+  int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() with a const array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInConstArray) {
+  const int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Edge case. Tests that ValuesIn() with an array parameter containing a
+// single element generates the single element sequence.
+TEST(ValuesInTest, ValuesInSingleElementArray) {
+  int array[] = {42};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() generates the expected sequence for an STL
+// container (vector).
+TEST(ValuesInTest, ValuesInVector) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that ValuesIn() generates the expected sequence.
+TEST(ValuesInTest, ValuesInIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
+// single value generates a single-element sequence.
+TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(42);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an empty iterator range
+// generates an empty sequence.
+TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that the Values() generates the expected sequence.
+TEST(ValuesTest, ValuesWorks) {
+  const ParamGenerator<int> gen = Values(3, 5, 8);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Values() generates the expected sequences from elements of
+// different types convertible to ParamGenerator's parameter type.
+TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
+  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
+
+  const double expected_values[] = {3.0, 5.0, 8.0};
+  VerifyGenerator(gen, expected_values);
+}
+
+TEST(ValuesTest, ValuesWorksForMaxLengthList) {
+  const ParamGenerator<int> gen = Values(
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
+
+  const int expected_values[] = {
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case test. Tests that single-parameter Values() generates the sequence
+// with the single value.
+TEST(ValuesTest, ValuesWithSingleParameter) {
+  const ParamGenerator<int> gen = Values(42);
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Bool() generates sequence (false, true).
+TEST(BoolTest, BoolWorks) {
+  const ParamGenerator<bool> gen = Bool();
+
+  const bool expected_values[] = {false, true};
+  VerifyGenerator(gen, expected_values);
+}
+
+# if GTEST_HAS_COMBINE
+
+// Tests that Combine() with two parameters generates the expected sequence.
+TEST(CombineTest, CombineWithTwoParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int> > gen =
+      Combine(Values(foo, bar), Values(3, 4));
+
+  tuple<const char*, int> expected_values[] = {
+    make_tuple(foo, 3), make_tuple(foo, 4),
+    make_tuple(bar, 3), make_tuple(bar, 4)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Combine() with three parameters generates the expected sequence.
+TEST(CombineTest, CombineWithThreeParameters) {
+  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
+                                                            Values(3, 4),
+                                                            Values(5, 6));
+  tuple<int, int, int> expected_values[] = {
+    make_tuple(0, 3, 5), make_tuple(0, 3, 6),
+    make_tuple(0, 4, 5), make_tuple(0, 4, 6),
+    make_tuple(1, 3, 5), make_tuple(1, 3, 6),
+    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the first parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the second parameter.
+TEST(CombineTest, CombineWithFirstParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
+                                                       Values(0, 1));
+
+  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the second parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the first parameter.
+TEST(CombineTest, CombineWithSecondParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Values(42));
+
+  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that when the first parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
+                                                       Values(0, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that when the second parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Range(1, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Edge case. Tests that combine works with the maximum number
+// of parameters supported by Google Test (currently 10).
+TEST(CombineTest, CombineWithMaxNumberOfParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
+                             int, int> > gen = Combine(Values(foo, bar),
+                                                       Values(1), Values(2),
+                                                       Values(3), Values(4),
+                                                       Values(5), Values(6),
+                                                       Values(7), Values(8),
+                                                       Values(9));
+
+  tuple<const char*, int, int, int, int, int, int, int, int, int>
+      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
+                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
+  VerifyGenerator(gen, expected_values);
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Tests that an generator produces correct sequence after being
+// assigned from another generator.
+TEST(ParamGeneratorTest, AssignmentWorks) {
+  ParamGenerator<int> gen = Values(1, 2);
+  const ParamGenerator<int> gen2 = Values(3, 4);
+  gen = gen2;
+
+  const int expected_values[] = {3, 4};
+  VerifyGenerator(gen, expected_values);
+}
+
+// This test verifies that the tests are expanded and run as specified:
+// one test per element from the sequence produced by the generator
+// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
+// fixture constructor, SetUp(), and TearDown() have run and have been
+// supplied with the correct parameters.
+
+// The use of environment object allows detection of the case where no test
+// case functionality is run at all. In this case TestCaseTearDown will not
+// be able to detect missing tests, naturally.
+template <int kExpectedCalls>
+class TestGenerationEnvironment : public ::testing::Environment {
+ public:
+  static TestGenerationEnvironment* Instance() {
+    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
+    return instance;
+  }
+
+  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
+  void SetUpExecuted() { set_up_count_++; }
+  void TearDownExecuted() { tear_down_count_++; }
+  void TestBodyExecuted() { test_body_count_++; }
+
+  virtual void TearDown() {
+    // If all MultipleTestGenerationTest tests have been de-selected
+    // by the filter flag, the following checks make no sense.
+    bool perform_check = false;
+
+    for (int i = 0; i < kExpectedCalls; ++i) {
+      Message msg;
+      msg << "TestsExpandedAndRun/" << i;
+      if (UnitTestOptions::FilterMatchesTest(
+             "TestExpansionModule/MultipleTestGenerationTest",
+              msg.GetString().c_str())) {
+        perform_check = true;
+      }
+    }
+    if (perform_check) {
+      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
+          << "Fixture constructor of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, set_up_count_)
+          << "Fixture SetUp method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, tear_down_count_)
+          << "Fixture TearDown method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, test_body_count_)
+          << "Test in ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+    }
+  }
+
+ private:
+  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
+                                tear_down_count_(0), test_body_count_(0) {}
+
+  int fixture_constructor_count_;
+  int set_up_count_;
+  int tear_down_count_;
+  int test_body_count_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
+};
+
+const int test_generation_params[] = {36, 42, 72};
+
+class TestGenerationTest : public TestWithParam<int> {
+ public:
+  enum {
+    PARAMETER_COUNT =
+        sizeof(test_generation_params)/sizeof(test_generation_params[0])
+  };
+
+  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
+
+  TestGenerationTest() {
+    Environment::Instance()->FixtureConstructorExecuted();
+    current_parameter_ = GetParam();
+  }
+  virtual void SetUp() {
+    Environment::Instance()->SetUpExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+  virtual void TearDown() {
+    Environment::Instance()->TearDownExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+
+  static void SetUpTestCase() {
+    bool all_tests_in_test_case_selected = true;
+
+    for (int i = 0; i < PARAMETER_COUNT; ++i) {
+      Message test_name;
+      test_name << "TestsExpandedAndRun/" << i;
+      if ( !UnitTestOptions::FilterMatchesTest(
+                "TestExpansionModule/MultipleTestGenerationTest",
+                test_name.GetString())) {
+        all_tests_in_test_case_selected = false;
+      }
+    }
+    EXPECT_TRUE(all_tests_in_test_case_selected)
+        << "When running the TestGenerationTest test case all of its tests\n"
+        << "must be selected by the filter flag for the test case to pass.\n"
+        << "If not all of them are enabled, we can't reliably conclude\n"
+        << "that the correct number of tests have been generated.";
+
+    collected_parameters_.clear();
+  }
+
+  static void TearDownTestCase() {
+    vector<int> expected_values(test_generation_params,
+                                test_generation_params + PARAMETER_COUNT);
+    // Test execution order is not guaranteed by Google Test,
+    // so the order of values in collected_parameters_ can be
+    // different and we have to sort to compare.
+    sort(expected_values.begin(), expected_values.end());
+    sort(collected_parameters_.begin(), collected_parameters_.end());
+
+    EXPECT_TRUE(collected_parameters_ == expected_values);
+  }
+
+ protected:
+  int current_parameter_;
+  static vector<int> collected_parameters_;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
+};
+vector<int> TestGenerationTest::collected_parameters_;
+
+TEST_P(TestGenerationTest, TestsExpandedAndRun) {
+  Environment::Instance()->TestBodyExecuted();
+  EXPECT_EQ(current_parameter_, GetParam());
+  collected_parameters_.push_back(GetParam());
+}
+INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
+                        ValuesIn(test_generation_params));
+
+// This test verifies that the element sequence (third parameter of
+// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
+// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For
+// that, we declare param_value_ to be a static member of
+// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in
+// main(), just before invocation of InitGoogleTest().  After calling
+// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated
+// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
+// test with parameter other than 1, and the test body will fail the
+// assertion.
+class GeneratorEvaluationTest : public TestWithParam<int> {
+ public:
+  static int param_value() { return param_value_; }
+  static void set_param_value(int param_value) { param_value_ = param_value; }
+
+ private:
+  static int param_value_;
+};
+int GeneratorEvaluationTest::param_value_ = 0;
+
+TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
+  EXPECT_EQ(1, GetParam());
+}
+INSTANTIATE_TEST_CASE_P(GenEvalModule,
+                        GeneratorEvaluationTest,
+                        Values(GeneratorEvaluationTest::param_value()));
+
+// Tests that generators defined in a different translation unit are
+// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
+extern ParamGenerator<int> extern_gen;
+class ExternalGeneratorTest : public TestWithParam<int> {};
+TEST_P(ExternalGeneratorTest, ExternalGenerator) {
+  // Sequence produced by extern_gen contains only a single value
+  // which we verify here.
+  EXPECT_EQ(GetParam(), 33);
+}
+INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
+                        ExternalGeneratorTest,
+                        extern_gen);
+
+// Tests that a parameterized test case can be defined in one translation
+// unit and instantiated in another. This test will be instantiated in
+// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
+// defined in gtest-param-test_test.h.
+TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
+  EXPECT_EQ(0, GetParam() % 33);
+}
+
+// Tests that a parameterized test case can be instantiated with multiple
+// generators.
+class MultipleInstantiationTest : public TestWithParam<int> {};
+TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
+}
+INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
+INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. This test will be instantiated
+// here and in gtest-param-test_test2.cc.
+// InstantiationInMultipleTranslationUnitsTest fixture class
+// is defined in gtest-param-test_test.h.
+TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
+  EXPECT_EQ(0, GetParam() % 42);
+}
+INSTANTIATE_TEST_CASE_P(Sequence1,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42, 42*2));
+
+// Tests that each iteration of parameterized test runs in a separate test
+// object.
+class SeparateInstanceTest : public TestWithParam<int> {
+ public:
+  SeparateInstanceTest() : count_(0) {}
+
+  static void TearDownTestCase() {
+    EXPECT_GE(global_count_, 2)
+        << "If some (but not all) SeparateInstanceTest tests have been "
+        << "filtered out this test will fail. Make sure that all "
+        << "GeneratorEvaluationTest are selected or de-selected together "
+        << "by the test filter.";
+  }
+
+ protected:
+  int count_;
+  static int global_count_;
+};
+int SeparateInstanceTest::global_count_ = 0;
+
+TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
+  EXPECT_EQ(0, count_++);
+  global_count_++;
+}
+INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
+
+// Tests that all instantiations of a test have named appropriately. Test
+// defined with TEST_P(TestCaseName, TestName) and instantiated with
+// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
+// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
+// sequence element used to instantiate the test.
+class NamingTest : public TestWithParam<int> {};
+
+TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
+
+  Message index_stream;
+  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
+  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
+
+// Class that cannot be streamed into an ostream.  It needs to be copyable
+// (and, in case of MSVC, also assignable) in order to be a test parameter
+// type.  Its default copy constructor and assignment operator do exactly
+// what we need.
+class Unstreamable {
+ public:
+  explicit Unstreamable(int value) : value_(value) {}
+
+ private:
+  int value_;
+};
+
+class CommentTest : public TestWithParam<Unstreamable> {};
+
+TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
+                        CommentTest,
+                        Values(Unstreamable(1)));
+
+// Verify that we can create a hierarchy of test fixtures, where the base
+// class fixture is not parameterized and the derived class is. In this case
+// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We
+// perform simple tests on both.
+class NonParameterizedBaseTest : public ::testing::Test {
+ public:
+  NonParameterizedBaseTest() : n_(17) { }
+ protected:
+  int n_;
+};
+
+class ParameterizedDerivedTest : public NonParameterizedBaseTest,
+                                 public ::testing::WithParamInterface<int> {
+ protected:
+  ParameterizedDerivedTest() : count_(0) { }
+  int count_;
+  static int global_count_;
+};
+
+int ParameterizedDerivedTest::global_count_ = 0;
+
+TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
+  EXPECT_EQ(17, n_);
+}
+
+TEST_P(ParameterizedDerivedTest, SeesSequence) {
+  EXPECT_EQ(17, n_);
+  EXPECT_EQ(0, count_++);
+  EXPECT_EQ(GetParam(), global_count_++);
+}
+
+class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
+
+TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
+  EXPECT_DEATH_IF_SUPPORTED(GetParam(),
+                            ".* value-parameterized test .*");
+}
+
+INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
+#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
+  FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
+#endif
+}
+
+int main(int argc, char **argv) {
+#if GTEST_HAS_PARAM_TEST
+  // Used in TestGenerationTest test case.
+  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
+  // Used in GeneratorEvaluationTest test case. Tests that the updated value
+  // will be picked up for instantiating tests in GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(1);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  ::testing::InitGoogleTest(&argc, argv);
+
+#if GTEST_HAS_PARAM_TEST
+  // Used in GeneratorEvaluationTest test case. Tests that value updated
+  // here will NOT be used for instantiating tests in
+  // GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(2);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest-param-test_test.h b/vendor/gtest-1.7.0/test/gtest-param-test_test.h
new file mode 100644
index 0000000..26ea122
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-param-test_test.h
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file provides classes and functions used internally
+// for testing Google Test itself.
+
+#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+// Test fixture for testing definition and instantiation of a test
+// in separate translation units.
+class ExternalInstantiationTest : public ::testing::TestWithParam<int> {
+};
+
+// Test fixture for testing instantiation of a test in multiple
+// translation units.
+class InstantiationInMultipleTranslaionUnitsTest
+    : public ::testing::TestWithParam<int> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
diff --git a/vendor/gtest-1.7.0/test/gtest-port_test.cc b/vendor/gtest-1.7.0/test/gtest-port_test.cc
new file mode 100644
index 0000000..43f1f20
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-port_test.cc
@@ -0,0 +1,1253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev), wan at google.com (Zhanyong Wan)
+//
+// This file tests the internal cross-platform support utilities.
+
+#include "gtest/internal/gtest-port.h"
+
+#include <stdio.h>
+
+#if GTEST_OS_MAC
+# include <time.h>
+#endif  // GTEST_OS_MAC
+
+#include <list>
+#include <utility>  // For std::pair and std::make_pair.
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using std::make_pair;
+using std::pair;
+
+namespace testing {
+namespace internal {
+
+TEST(IsXDigitTest, WorksForNarrowAscii) {
+  EXPECT_TRUE(IsXDigit('0'));
+  EXPECT_TRUE(IsXDigit('9'));
+  EXPECT_TRUE(IsXDigit('A'));
+  EXPECT_TRUE(IsXDigit('F'));
+  EXPECT_TRUE(IsXDigit('a'));
+  EXPECT_TRUE(IsXDigit('f'));
+
+  EXPECT_FALSE(IsXDigit('-'));
+  EXPECT_FALSE(IsXDigit('g'));
+  EXPECT_FALSE(IsXDigit('G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<char>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<char>('0' | 0x80)));
+}
+
+TEST(IsXDigitTest, WorksForWideAscii) {
+  EXPECT_TRUE(IsXDigit(L'0'));
+  EXPECT_TRUE(IsXDigit(L'9'));
+  EXPECT_TRUE(IsXDigit(L'A'));
+  EXPECT_TRUE(IsXDigit(L'F'));
+  EXPECT_TRUE(IsXDigit(L'a'));
+  EXPECT_TRUE(IsXDigit(L'f'));
+
+  EXPECT_FALSE(IsXDigit(L'-'));
+  EXPECT_FALSE(IsXDigit(L'g'));
+  EXPECT_FALSE(IsXDigit(L'G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForWideNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100)));
+}
+
+class Base {
+ public:
+  // Copy constructor and assignment operator do exactly what we need, so we
+  // use them.
+  Base() : member_(0) {}
+  explicit Base(int n) : member_(n) {}
+  virtual ~Base() {}
+  int member() { return member_; }
+
+ private:
+  int member_;
+};
+
+class Derived : public Base {
+ public:
+  explicit Derived(int n) : Base(n) {}
+};
+
+TEST(ImplicitCastTest, ConvertsPointers) {
+  Derived derived(0);
+  EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));
+}
+
+TEST(ImplicitCastTest, CanUseInheritance) {
+  Derived derived(1);
+  Base base = ::testing::internal::ImplicitCast_<Base>(derived);
+  EXPECT_EQ(derived.member(), base.member());
+}
+
+class Castable {
+ public:
+  explicit Castable(bool* converted) : converted_(converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
+  bool converted = false;
+  Castable castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstCastable {
+ public:
+  explicit ConstCastable(bool* converted) : converted_(converted) {}
+  operator Base() const {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
+  bool converted = false;
+  const ConstCastable const_castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstAndNonConstCastable {
+ public:
+  ConstAndNonConstCastable(bool* converted, bool* const_converted)
+      : converted_(converted), const_converted_(const_converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+  operator Base() const {
+    *const_converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+  bool* const_converted_;
+};
+
+TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {
+  bool converted = false;
+  bool const_converted = false;
+  ConstAndNonConstCastable castable(&converted, &const_converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+  EXPECT_FALSE(const_converted);
+
+  converted = false;
+  const_converted = false;
+  const ConstAndNonConstCastable const_castable(&converted, &const_converted);
+  base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_FALSE(converted);
+  EXPECT_TRUE(const_converted);
+}
+
+class To {
+ public:
+  To(bool* converted) { *converted = true; }  // NOLINT
+};
+
+TEST(ImplicitCastTest, CanUseImplicitConstructor) {
+  bool converted = false;
+  To to = ::testing::internal::ImplicitCast_<To>(&converted);
+  (void)to;
+  EXPECT_TRUE(converted);
+}
+
+TEST(IteratorTraitsTest, WorksForSTLContainerIterators) {
+  StaticAssertTypeEq<int,
+      IteratorTraits< ::std::vector<int>::const_iterator>::value_type>();
+  StaticAssertTypeEq<bool,
+      IteratorTraits< ::std::list<bool>::iterator>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToNonConst) {
+  StaticAssertTypeEq<char, IteratorTraits<char*>::value_type>();
+  StaticAssertTypeEq<const void*, IteratorTraits<const void**>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToConst) {
+  StaticAssertTypeEq<char, IteratorTraits<const char*>::value_type>();
+  StaticAssertTypeEq<const void*,
+      IteratorTraits<const void* const*>::value_type>();
+}
+
+// Tests that the element_type typedef is available in scoped_ptr and refers
+// to the parameter type.
+TEST(ScopedPtrTest, DefinesElementType) {
+  StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>();
+}
+
+// TODO(vladl at google.com): Implement THE REST of scoped_ptr tests.
+
+TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
+  if (AlwaysFalse())
+    GTEST_CHECK_(false) << "This should never be executed; "
+                           "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    GTEST_CHECK_(true);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    GTEST_CHECK_(true) << "";
+}
+
+TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      GTEST_CHECK_(true);
+  }
+
+  switch (0)
+    case 0:
+      GTEST_CHECK_(true) << "Check failed in switch case";
+}
+
+// Verifies behavior of FormatFileLocation.
+TEST(FormatFileLocationTest, FormatsFileLocation) {
+  EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUnknownFile) {
+  EXPECT_PRED_FORMAT2(
+      IsSubstring, "unknown file", FormatFileLocation(NULL, 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(NULL, 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file:", FormatFileLocation(NULL, -1));
+}
+
+// Verifies behavior of FormatCompilerIndependentFileLocation.
+TEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) {
+  EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) {
+  EXPECT_EQ("unknown file:42",
+            FormatCompilerIndependentFileLocation(NULL, 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1));
+}
+
+#if GTEST_OS_MAC || GTEST_OS_QNX
+void* ThreadFunc(void* data) {
+  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);
+  pthread_mutex_lock(mutex);
+  pthread_mutex_unlock(mutex);
+  return NULL;
+}
+
+TEST(GetThreadCountTest, ReturnsCorrectValue) {
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_t mutex;
+  pthread_attr_t  attr;
+  pthread_t       thread_id;
+
+  // TODO(vladl at google.com): turn mutex into internal::Mutex for automatic
+  // destruction.
+  pthread_mutex_init(&mutex, NULL);
+  pthread_mutex_lock(&mutex);
+  ASSERT_EQ(0, pthread_attr_init(&attr));
+  ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
+
+  const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);
+  ASSERT_EQ(0, pthread_attr_destroy(&attr));
+  ASSERT_EQ(0, status);
+  EXPECT_EQ(2U, GetThreadCount());
+  pthread_mutex_unlock(&mutex);
+
+  void* dummy;
+  ASSERT_EQ(0, pthread_join(thread_id, &dummy));
+
+# if GTEST_OS_MAC
+
+  // MacOS X may not immediately report the updated thread count after
+  // joining a thread, causing flakiness in this test. To counter that, we
+  // wait for up to .5 seconds for the OS to report the correct value.
+  for (int i = 0; i < 5; ++i) {
+    if (GetThreadCount() == 1)
+      break;
+
+    SleepMilliseconds(100);
+  }
+
+# endif  // GTEST_OS_MAC
+
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_destroy(&mutex);
+}
+#else
+TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
+  EXPECT_EQ(0U, GetThreadCount());
+}
+#endif  // GTEST_OS_MAC || GTEST_OS_QNX
+
+TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
+  const bool a_false_condition = false;
+  const char regex[] =
+#ifdef _MSC_VER
+     "gtest-port_test\\.cc\\(\\d+\\):"
+#elif GTEST_USES_POSIX_RE
+     "gtest-port_test\\.cc:[0-9]+"
+#else
+     "gtest-port_test\\.cc:\\d+"
+#endif  // _MSC_VER
+     ".*a_false_condition.*Extra info.*";
+
+  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info",
+                            regex);
+}
+
+#if GTEST_HAS_DEATH_TEST
+
+TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
+  EXPECT_EXIT({
+      GTEST_CHECK_(true) << "Extra info";
+      ::std::cerr << "Success\n";
+      exit(0); },
+      ::testing::ExitedWithCode(0), "Success");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Verifies that Google Test choose regular expression engine appropriate to
+// the platform. The test will produce compiler errors in case of failure.
+// For simplicity, we only cover the most important platforms here.
+TEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) {
+#if GTEST_HAS_POSIX_RE
+
+  EXPECT_TRUE(GTEST_USES_POSIX_RE);
+
+#else
+
+  EXPECT_TRUE(GTEST_USES_SIMPLE_RE);
+
+#endif
+}
+
+#if GTEST_USES_POSIX_RE
+
+# if GTEST_HAS_TYPED_TEST
+
+template <typename Str>
+class RETest : public ::testing::Test {};
+
+// Defines StringTypes as the list of all string types that class RE
+// supports.
+typedef testing::Types<
+    ::std::string,
+#  if GTEST_HAS_GLOBAL_STRING
+    ::string,
+#  endif  // GTEST_HAS_GLOBAL_STRING
+    const char*> StringTypes;
+
+TYPED_TEST_CASE(RETest, StringTypes);
+
+// Tests RE's implicit constructors.
+TYPED_TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple(TypeParam("hello"));
+  EXPECT_STREQ("hello", simple.pattern());
+
+  const RE normal(TypeParam(".*(\\w+)"));
+  EXPECT_STREQ(".*(\\w+)", normal.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TYPED_TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid(TypeParam("?"));
+  }, "\"?\" is not a valid POSIX Extended regular expression.");
+}
+
+// Tests RE::FullMatch().
+TYPED_TEST(RETest, FullMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
+}
+
+// Tests RE::PartialMatch().
+TYPED_TEST(RETest, PartialMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
+  EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+#elif GTEST_USES_SIMPLE_RE
+
+TEST(IsInSetTest, NulCharIsNotInAnySet) {
+  EXPECT_FALSE(IsInSet('\0', ""));
+  EXPECT_FALSE(IsInSet('\0', "\0"));
+  EXPECT_FALSE(IsInSet('\0', "a"));
+}
+
+TEST(IsInSetTest, WorksForNonNulChars) {
+  EXPECT_FALSE(IsInSet('a', "Ab"));
+  EXPECT_FALSE(IsInSet('c', ""));
+
+  EXPECT_TRUE(IsInSet('b', "bcd"));
+  EXPECT_TRUE(IsInSet('b', "ab"));
+}
+
+TEST(IsAsciiDigitTest, IsFalseForNonDigit) {
+  EXPECT_FALSE(IsAsciiDigit('\0'));
+  EXPECT_FALSE(IsAsciiDigit(' '));
+  EXPECT_FALSE(IsAsciiDigit('+'));
+  EXPECT_FALSE(IsAsciiDigit('-'));
+  EXPECT_FALSE(IsAsciiDigit('.'));
+  EXPECT_FALSE(IsAsciiDigit('a'));
+}
+
+TEST(IsAsciiDigitTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiDigit('0'));
+  EXPECT_TRUE(IsAsciiDigit('1'));
+  EXPECT_TRUE(IsAsciiDigit('5'));
+  EXPECT_TRUE(IsAsciiDigit('9'));
+}
+
+TEST(IsAsciiPunctTest, IsFalseForNonPunct) {
+  EXPECT_FALSE(IsAsciiPunct('\0'));
+  EXPECT_FALSE(IsAsciiPunct(' '));
+  EXPECT_FALSE(IsAsciiPunct('\n'));
+  EXPECT_FALSE(IsAsciiPunct('a'));
+  EXPECT_FALSE(IsAsciiPunct('0'));
+}
+
+TEST(IsAsciiPunctTest, IsTrueForPunct) {
+  for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
+    EXPECT_PRED1(IsAsciiPunct, *p);
+  }
+}
+
+TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
+  EXPECT_FALSE(IsRepeat('\0'));
+  EXPECT_FALSE(IsRepeat(' '));
+  EXPECT_FALSE(IsRepeat('a'));
+  EXPECT_FALSE(IsRepeat('1'));
+  EXPECT_FALSE(IsRepeat('-'));
+}
+
+TEST(IsRepeatTest, IsTrueForRepeatChar) {
+  EXPECT_TRUE(IsRepeat('?'));
+  EXPECT_TRUE(IsRepeat('*'));
+  EXPECT_TRUE(IsRepeat('+'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) {
+  EXPECT_FALSE(IsAsciiWhiteSpace('\0'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('a'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('1'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('+'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('_'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) {
+  EXPECT_TRUE(IsAsciiWhiteSpace(' '));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\n'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\r'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\t'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\v'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\f'));
+}
+
+TEST(IsAsciiWordCharTest, IsFalseForNonWordChar) {
+  EXPECT_FALSE(IsAsciiWordChar('\0'));
+  EXPECT_FALSE(IsAsciiWordChar('+'));
+  EXPECT_FALSE(IsAsciiWordChar('.'));
+  EXPECT_FALSE(IsAsciiWordChar(' '));
+  EXPECT_FALSE(IsAsciiWordChar('\n'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForLetter) {
+  EXPECT_TRUE(IsAsciiWordChar('a'));
+  EXPECT_TRUE(IsAsciiWordChar('b'));
+  EXPECT_TRUE(IsAsciiWordChar('A'));
+  EXPECT_TRUE(IsAsciiWordChar('Z'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiWordChar('0'));
+  EXPECT_TRUE(IsAsciiWordChar('1'));
+  EXPECT_TRUE(IsAsciiWordChar('7'));
+  EXPECT_TRUE(IsAsciiWordChar('9'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForUnderscore) {
+  EXPECT_TRUE(IsAsciiWordChar('_'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
+  EXPECT_FALSE(IsValidEscape('\0'));
+  EXPECT_FALSE(IsValidEscape('\007'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForDigit) {
+  EXPECT_FALSE(IsValidEscape('0'));
+  EXPECT_FALSE(IsValidEscape('9'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
+  EXPECT_FALSE(IsValidEscape(' '));
+  EXPECT_FALSE(IsValidEscape('\n'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
+  EXPECT_FALSE(IsValidEscape('a'));
+  EXPECT_FALSE(IsValidEscape('Z'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForPunct) {
+  EXPECT_TRUE(IsValidEscape('.'));
+  EXPECT_TRUE(IsValidEscape('-'));
+  EXPECT_TRUE(IsValidEscape('^'));
+  EXPECT_TRUE(IsValidEscape('$'));
+  EXPECT_TRUE(IsValidEscape('('));
+  EXPECT_TRUE(IsValidEscape(']'));
+  EXPECT_TRUE(IsValidEscape('{'));
+  EXPECT_TRUE(IsValidEscape('|'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
+  EXPECT_TRUE(IsValidEscape('d'));
+  EXPECT_TRUE(IsValidEscape('D'));
+  EXPECT_TRUE(IsValidEscape('s'));
+  EXPECT_TRUE(IsValidEscape('S'));
+  EXPECT_TRUE(IsValidEscape('w'));
+  EXPECT_TRUE(IsValidEscape('W'));
+}
+
+TEST(AtomMatchesCharTest, EscapedPunct) {
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
+  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
+  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
+  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_d) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_D) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_s) {
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_S) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_w) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_W) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
+}
+
+TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
+  EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
+}
+
+TEST(AtomMatchesCharTest, UnescapedDot) {
+  EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
+}
+
+TEST(AtomMatchesCharTest, UnescapedChar) {
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
+  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
+  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
+}
+
+TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
+                          "NULL is not a valid simple regular expression");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_FALSE(ValidateRegex("a\\")),
+      "Syntax error at index 1 in simple regular expression \"a\\\": ");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
+                          "invalid escape sequence \"\\h\"");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
+                          "'(' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
+                          "')' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
+                          "'[' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
+                          "'{' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
+                          "'?' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
+                          "'*' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
+                          "'+' can only follow a repeatable token");
+}
+
+TEST(ValidateRegexTest, ReturnsTrueForValid) {
+  EXPECT_TRUE(ValidateRegex(""));
+  EXPECT_TRUE(ValidateRegex("a"));
+  EXPECT_TRUE(ValidateRegex(".*"));
+  EXPECT_TRUE(ValidateRegex("^a_+"));
+  EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
+  EXPECT_TRUE(ValidateRegex("09*$"));
+  EXPECT_TRUE(ValidateRegex("^Z$"));
+  EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
+  // Repeating more than once.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
+  // Repeating zero times.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
+
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
+}
+
+TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
+  EXPECT_TRUE(MatchRegexAtHead("", ""));
+  EXPECT_TRUE(MatchRegexAtHead("", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
+  EXPECT_FALSE(MatchRegexAtHead("$", "a"));
+
+  EXPECT_TRUE(MatchRegexAtHead("$", ""));
+  EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
+  EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
+  EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
+
+  EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest,
+     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("\\s?b", "  b"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
+}
+
+TEST(MatchRegexAtHeadTest, MatchesSequentially) {
+  EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
+
+  EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
+  EXPECT_FALSE(MatchRegexAnywhere("", NULL));
+}
+
+TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
+  EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
+  EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
+
+  EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
+  EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
+  EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
+  EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "=  ...="));
+}
+
+// Tests RE's implicit constructors.
+TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty("");
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple("hello");
+  EXPECT_STREQ("hello", simple.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(NULL);
+  }, "NULL is not a valid simple regular expression");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(".*(\\w+");
+  }, "'(' is unsupported");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid("^?");
+  }, "'?' can only follow a repeatable token");
+}
+
+// Tests RE::FullMatch().
+TEST(RETest, FullMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::FullMatch("", empty));
+  EXPECT_FALSE(RE::FullMatch("a", empty));
+
+  const RE re1("a");
+  EXPECT_TRUE(RE::FullMatch("a", re1));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::FullMatch("az", re));
+  EXPECT_TRUE(RE::FullMatch("axyz", re));
+  EXPECT_FALSE(RE::FullMatch("baz", re));
+  EXPECT_FALSE(RE::FullMatch("azy", re));
+}
+
+// Tests RE::PartialMatch().
+TEST(RETest, PartialMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::PartialMatch("", empty));
+  EXPECT_TRUE(RE::PartialMatch("a", empty));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::PartialMatch("az", re));
+  EXPECT_TRUE(RE::PartialMatch("axyz", re));
+  EXPECT_TRUE(RE::PartialMatch("baz", re));
+  EXPECT_TRUE(RE::PartialMatch("azy", re));
+  EXPECT_FALSE(RE::PartialMatch("zza", re));
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+#if !GTEST_OS_WINDOWS_MOBILE
+
+TEST(CaptureTest, CapturesStdout) {
+  CaptureStdout();
+  fprintf(stdout, "abc");
+  EXPECT_STREQ("abc", GetCapturedStdout().c_str());
+
+  CaptureStdout();
+  fprintf(stdout, "def%cghi", '\0');
+  EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout()));
+}
+
+TEST(CaptureTest, CapturesStderr) {
+  CaptureStderr();
+  fprintf(stderr, "jkl");
+  EXPECT_STREQ("jkl", GetCapturedStderr().c_str());
+
+  CaptureStderr();
+  fprintf(stderr, "jkl%cmno", '\0');
+  EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr()));
+}
+
+// Tests that stdout and stderr capture don't interfere with each other.
+TEST(CaptureTest, CapturesStdoutAndStderr) {
+  CaptureStdout();
+  CaptureStderr();
+  fprintf(stdout, "pqr");
+  fprintf(stderr, "stu");
+  EXPECT_STREQ("pqr", GetCapturedStdout().c_str());
+  EXPECT_STREQ("stu", GetCapturedStderr().c_str());
+}
+
+TEST(CaptureDeathTest, CannotReenterStdoutCapture) {
+  CaptureStdout();
+  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(),
+                            "Only one stdout capturer can exist at a time");
+  GetCapturedStdout();
+
+  // We cannot test stderr capturing using death tests as they use it
+  // themselves.
+}
+
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {
+  ThreadLocal<int> t1;
+  EXPECT_EQ(0, t1.get());
+
+  ThreadLocal<void*> t2;
+  EXPECT_TRUE(t2.get() == NULL);
+}
+
+TEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {
+  ThreadLocal<int> t1(123);
+  EXPECT_EQ(123, t1.get());
+
+  int i = 0;
+  ThreadLocal<int*> t2(&i);
+  EXPECT_EQ(&i, t2.get());
+}
+
+class NoDefaultContructor {
+ public:
+  explicit NoDefaultContructor(const char*) {}
+  NoDefaultContructor(const NoDefaultContructor&) {}
+};
+
+TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {
+  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo"));
+  bar.pointer();
+}
+
+TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+
+  // Verifies the condition still holds after calling set.
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+}
+
+TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+  const ThreadLocal<std::string>& const_thread_local_string =
+      thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+}
+
+#if GTEST_IS_THREADSAFE
+
+void AddTwo(int* param) { *param += 2; }
+
+TEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {
+  int i = 40;
+  ThreadWithParam<int*> thread(&AddTwo, &i, NULL);
+  thread.Join();
+  EXPECT_EQ(42, i);
+}
+
+TEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {
+  // AssertHeld() is flaky only in the presence of multiple threads accessing
+  // the lock. In this case, the test is robust.
+  EXPECT_DEATH_IF_SUPPORTED({
+    Mutex m;
+    { MutexLock lock(&m); }
+    m.AssertHeld();
+  },
+  "thread .*hold");
+}
+
+TEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {
+  Mutex m;
+  MutexLock lock(&m);
+  m.AssertHeld();
+}
+
+class AtomicCounterWithMutex {
+ public:
+  explicit AtomicCounterWithMutex(Mutex* mutex) :
+    value_(0), mutex_(mutex), random_(42) {}
+
+  void Increment() {
+    MutexLock lock(mutex_);
+    int temp = value_;
+    {
+      // Locking a mutex puts up a memory barrier, preventing reads and
+      // writes to value_ rearranged when observed from other threads.
+      //
+      // We cannot use Mutex and MutexLock here or rely on their memory
+      // barrier functionality as we are testing them here.
+      pthread_mutex_t memory_barrier_mutex;
+      GTEST_CHECK_POSIX_SUCCESS_(
+          pthread_mutex_init(&memory_barrier_mutex, NULL));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));
+
+      SleepMilliseconds(random_.Generate(30));
+
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
+    }
+    value_ = temp + 1;
+  }
+  int value() const { return value_; }
+
+ private:
+  volatile int value_;
+  Mutex* const mutex_;  // Protects value_.
+  Random       random_;
+};
+
+void CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {
+  for (int i = 0; i < param.second; ++i)
+      param.first->Increment();
+}
+
+// Tests that the mutex only lets one thread at a time to lock it.
+TEST(MutexTest, OnlyOneThreadCanLockAtATime) {
+  Mutex mutex;
+  AtomicCounterWithMutex locked_counter(&mutex);
+
+  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;
+  const int kCycleCount = 20;
+  const int kThreadCount = 7;
+  scoped_ptr<ThreadType> counting_threads[kThreadCount];
+  Notification threads_can_start;
+  // Creates and runs kThreadCount threads that increment locked_counter
+  // kCycleCount times each.
+  for (int i = 0; i < kThreadCount; ++i) {
+    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,
+                                             make_pair(&locked_counter,
+                                                       kCycleCount),
+                                             &threads_can_start));
+  }
+  threads_can_start.Notify();
+  for (int i = 0; i < kThreadCount; ++i)
+    counting_threads[i]->Join();
+
+  // If the mutex lets more than one thread to increment the counter at a
+  // time, they are likely to encounter a race condition and have some
+  // increments overwritten, resulting in the lower then expected counter
+  // value.
+  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());
+}
+
+template <typename T>
+void RunFromThread(void (func)(T), T param) {
+  ThreadWithParam<T> thread(func, param, NULL);
+  thread.Join();
+}
+
+void RetrieveThreadLocalValue(
+    pair<ThreadLocal<std::string>*, std::string*> param) {
+  *param.second = param.first->get();
+}
+
+TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
+  ThreadLocal<std::string> thread_local_string("foo");
+  EXPECT_STREQ("foo", thread_local_string.get().c_str());
+
+  thread_local_string.set("bar");
+  EXPECT_STREQ("bar", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_STREQ("foo", result.c_str());
+}
+
+// DestructorTracker keeps track of whether its instances have been
+// destroyed.
+static std::vector<bool> g_destroyed;
+
+class DestructorTracker {
+ public:
+  DestructorTracker() : index_(GetNewIndex()) {}
+  DestructorTracker(const DestructorTracker& /* rhs */)
+      : index_(GetNewIndex()) {}
+  ~DestructorTracker() {
+    // We never access g_destroyed concurrently, so we don't need to
+    // protect the write operation under a mutex.
+    g_destroyed[index_] = true;
+  }
+
+ private:
+  static int GetNewIndex() {
+    g_destroyed.push_back(false);
+    return g_destroyed.size() - 1;
+  }
+  const int index_;
+};
+
+typedef ThreadLocal<DestructorTracker>* ThreadParam;
+
+void CallThreadLocalGet(ThreadParam thread_local_param) {
+  thread_local_param->get();
+}
+
+// Tests that when a ThreadLocal object dies in a thread, it destroys
+// the managed object for that thread.
+TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object for the main thread.
+    thread_local_tracker.get();
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_FALSE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  It should have destroyed both the
+  // default value shared by all threads and the value for the main
+  // thread.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+// Tests that when a thread exits, the thread-local object for that
+// thread is destroyed.
+TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object in the new thread.
+    ThreadWithParam<ThreadParam> thread(
+        &CallThreadLocalGet, &thread_local_tracker, NULL);
+    thread.Join();
+
+    // Now the new thread has exited.  The per-thread object for it
+    // should have been destroyed.
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_TRUE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  The default value should have been
+  // destroyed too.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
+  ThreadLocal<std::string> thread_local_string;
+  thread_local_string.set("Foo");
+  EXPECT_STREQ("Foo", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_TRUE(result.empty());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+}  // namespace internal
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/test/gtest-printers_test.cc b/vendor/gtest-1.7.0/test/gtest-printers_test.cc
new file mode 100644
index 0000000..c2beca7
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-printers_test.cc
@@ -0,0 +1,1566 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file tests the universal value printer.
+
+#include "gtest/gtest-printers.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <algorithm>
+#include <deque>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+// hash_map and hash_set are available under Visual C++.
+#if _MSC_VER
+# define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.
+# include <hash_map>            // NOLINT
+# define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.
+# include <hash_set>            // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Some user-defined types for testing the universal value printer.
+
+// An anonymous enum type.
+enum AnonymousEnum {
+  kAE1 = -1,
+  kAE2 = 1
+};
+
+// An enum without a user-defined printer.
+enum EnumWithoutPrinter {
+  kEWP1 = -2,
+  kEWP2 = 42
+};
+
+// An enum with a << operator.
+enum EnumWithStreaming {
+  kEWS1 = 10
+};
+
+std::ostream& operator<<(std::ostream& os, EnumWithStreaming e) {
+  return os << (e == kEWS1 ? "kEWS1" : "invalid");
+}
+
+// An enum with a PrintTo() function.
+enum EnumWithPrintTo {
+  kEWPT1 = 1
+};
+
+void PrintTo(EnumWithPrintTo e, std::ostream* os) {
+  *os << (e == kEWPT1 ? "kEWPT1" : "invalid");
+}
+
+// A class implicitly convertible to BiggestInt.
+class BiggestIntConvertible {
+ public:
+  operator ::testing::internal::BiggestInt() const { return 42; }
+};
+
+// A user-defined unprintable class template in the global namespace.
+template <typename T>
+class UnprintableTemplateInGlobal {
+ public:
+  UnprintableTemplateInGlobal() : value_() {}
+ private:
+  T value_;
+};
+
+// A user-defined streamable type in the global namespace.
+class StreamableInGlobal {
+ public:
+  virtual ~StreamableInGlobal() {}
+};
+
+inline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) {
+  os << "StreamableInGlobal";
+}
+
+void operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) {
+  os << "StreamableInGlobal*";
+}
+
+namespace foo {
+
+// A user-defined unprintable type in a user namespace.
+class UnprintableInFoo {
+ public:
+  UnprintableInFoo() : z_(0) { memcpy(xy_, "\xEF\x12\x0\x0\x34\xAB\x0\x0", 8); }
+ private:
+  char xy_[8];
+  double z_;
+};
+
+// A user-defined printable type in a user-chosen namespace.
+struct PrintableViaPrintTo {
+  PrintableViaPrintTo() : value() {}
+  int value;
+};
+
+void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintTo: " << x.value;
+}
+
+// A type with a user-defined << for printing its pointer.
+struct PointerPrintable {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const PointerPrintable* /* x */) {
+  return os << "PointerPrintable*";
+}
+
+// A user-defined printable class template in a user-chosen namespace.
+template <typename T>
+class PrintableViaPrintToTemplate {
+ public:
+  explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintToTemplate: " << x.value();
+}
+
+// A user-defined streamable class template in a user namespace.
+template <typename T>
+class StreamableTemplateInFoo {
+ public:
+  StreamableTemplateInFoo() : value_() {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+inline ::std::ostream& operator<<(::std::ostream& os,
+                                  const StreamableTemplateInFoo<T>& x) {
+  return os << "StreamableTemplateInFoo: " << x.value();
+}
+
+}  // namespace foo
+
+namespace testing {
+namespace gtest_printers_test {
+
+using ::std::deque;
+using ::std::list;
+using ::std::make_pair;
+using ::std::map;
+using ::std::multimap;
+using ::std::multiset;
+using ::std::pair;
+using ::std::set;
+using ::std::vector;
+using ::testing::PrintToString;
+using ::testing::internal::FormatForComparisonFailureMessage;
+using ::testing::internal::ImplicitCast_;
+using ::testing::internal::NativeArray;
+using ::testing::internal::RE;
+using ::testing::internal::Strings;
+using ::testing::internal::UniversalPrint;
+using ::testing::internal::UniversalPrinter;
+using ::testing::internal::UniversalTersePrint;
+using ::testing::internal::UniversalTersePrintTupleFieldsToStrings;
+using ::testing::internal::kReference;
+using ::testing::internal::string;
+
+#if GTEST_HAS_TR1_TUPLE
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+#endif
+
+// The hash_* classes are not part of the C++ standard.  STLport
+// defines them in namespace std.  MSVC defines them in ::stdext.  GCC
+// defines them in ::.
+#ifdef _STLP_HASH_MAP  // We got <hash_map> from STLport.
+using ::std::hash_map;
+using ::std::hash_set;
+using ::std::hash_multimap;
+using ::std::hash_multiset;
+#elif _MSC_VER
+using ::stdext::hash_map;
+using ::stdext::hash_set;
+using ::stdext::hash_multimap;
+using ::stdext::hash_multiset;
+#endif
+
+// Prints a value to a string using the universal value printer.  This
+// is a helper for testing UniversalPrinter<T>::Print() for various types.
+template <typename T>
+string Print(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+// Prints a value passed by reference to a string, using the universal
+// value printer.  This is a helper for testing
+// UniversalPrinter<T&>::Print() for various types.
+template <typename T>
+string PrintByRef(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T&>::Print(value, &ss);
+  return ss.str();
+}
+
+// Tests printing various enum types.
+
+TEST(PrintEnumTest, AnonymousEnum) {
+  EXPECT_EQ("-1", Print(kAE1));
+  EXPECT_EQ("1", Print(kAE2));
+}
+
+TEST(PrintEnumTest, EnumWithoutPrinter) {
+  EXPECT_EQ("-2", Print(kEWP1));
+  EXPECT_EQ("42", Print(kEWP2));
+}
+
+TEST(PrintEnumTest, EnumWithStreaming) {
+  EXPECT_EQ("kEWS1", Print(kEWS1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithStreaming>(0)));
+}
+
+TEST(PrintEnumTest, EnumWithPrintTo) {
+  EXPECT_EQ("kEWPT1", Print(kEWPT1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithPrintTo>(0)));
+}
+
+// Tests printing a class implicitly convertible to BiggestInt.
+
+TEST(PrintClassTest, BiggestIntConvertible) {
+  EXPECT_EQ("42", Print(BiggestIntConvertible()));
+}
+
+// Tests printing various char types.
+
+// char.
+TEST(PrintCharTest, PlainChar) {
+  EXPECT_EQ("'\\0'", Print('\0'));
+  EXPECT_EQ("'\\'' (39, 0x27)", Print('\''));
+  EXPECT_EQ("'\"' (34, 0x22)", Print('"'));
+  EXPECT_EQ("'?' (63, 0x3F)", Print('?'));
+  EXPECT_EQ("'\\\\' (92, 0x5C)", Print('\\'));
+  EXPECT_EQ("'\\a' (7)", Print('\a'));
+  EXPECT_EQ("'\\b' (8)", Print('\b'));
+  EXPECT_EQ("'\\f' (12, 0xC)", Print('\f'));
+  EXPECT_EQ("'\\n' (10, 0xA)", Print('\n'));
+  EXPECT_EQ("'\\r' (13, 0xD)", Print('\r'));
+  EXPECT_EQ("'\\t' (9)", Print('\t'));
+  EXPECT_EQ("'\\v' (11, 0xB)", Print('\v'));
+  EXPECT_EQ("'\\x7F' (127)", Print('\x7F'));
+  EXPECT_EQ("'\\xFF' (255)", Print('\xFF'));
+  EXPECT_EQ("' ' (32, 0x20)", Print(' '));
+  EXPECT_EQ("'a' (97, 0x61)", Print('a'));
+}
+
+// signed char.
+TEST(PrintCharTest, SignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<signed char>('\0')));
+  EXPECT_EQ("'\\xCE' (-50)",
+            Print(static_cast<signed char>(-50)));
+}
+
+// unsigned char.
+TEST(PrintCharTest, UnsignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<unsigned char>('\0')));
+  EXPECT_EQ("'b' (98, 0x62)",
+            Print(static_cast<unsigned char>('b')));
+}
+
+// Tests printing other simple, built-in types.
+
+// bool.
+TEST(PrintBuiltInTypeTest, Bool) {
+  EXPECT_EQ("false", Print(false));
+  EXPECT_EQ("true", Print(true));
+}
+
+// wchar_t.
+TEST(PrintBuiltInTypeTest, Wchar_t) {
+  EXPECT_EQ("L'\\0'", Print(L'\0'));
+  EXPECT_EQ("L'\\'' (39, 0x27)", Print(L'\''));
+  EXPECT_EQ("L'\"' (34, 0x22)", Print(L'"'));
+  EXPECT_EQ("L'?' (63, 0x3F)", Print(L'?'));
+  EXPECT_EQ("L'\\\\' (92, 0x5C)", Print(L'\\'));
+  EXPECT_EQ("L'\\a' (7)", Print(L'\a'));
+  EXPECT_EQ("L'\\b' (8)", Print(L'\b'));
+  EXPECT_EQ("L'\\f' (12, 0xC)", Print(L'\f'));
+  EXPECT_EQ("L'\\n' (10, 0xA)", Print(L'\n'));
+  EXPECT_EQ("L'\\r' (13, 0xD)", Print(L'\r'));
+  EXPECT_EQ("L'\\t' (9)", Print(L'\t'));
+  EXPECT_EQ("L'\\v' (11, 0xB)", Print(L'\v'));
+  EXPECT_EQ("L'\\x7F' (127)", Print(L'\x7F'));
+  EXPECT_EQ("L'\\xFF' (255)", Print(L'\xFF'));
+  EXPECT_EQ("L' ' (32, 0x20)", Print(L' '));
+  EXPECT_EQ("L'a' (97, 0x61)", Print(L'a'));
+  EXPECT_EQ("L'\\x576' (1398)", Print(static_cast<wchar_t>(0x576)));
+  EXPECT_EQ("L'\\xC74D' (51021)", Print(static_cast<wchar_t>(0xC74D)));
+}
+
+// Test that Int64 provides more storage than wchar_t.
+TEST(PrintTypeSizeTest, Wchar_t) {
+  EXPECT_LT(sizeof(wchar_t), sizeof(testing::internal::Int64));
+}
+
+// Various integer types.
+TEST(PrintBuiltInTypeTest, Integer) {
+  EXPECT_EQ("'\\xFF' (255)", Print(static_cast<unsigned char>(255)));  // uint8
+  EXPECT_EQ("'\\x80' (-128)", Print(static_cast<signed char>(-128)));  // int8
+  EXPECT_EQ("65535", Print(USHRT_MAX));  // uint16
+  EXPECT_EQ("-32768", Print(SHRT_MIN));  // int16
+  EXPECT_EQ("4294967295", Print(UINT_MAX));  // uint32
+  EXPECT_EQ("-2147483648", Print(INT_MIN));  // int32
+  EXPECT_EQ("18446744073709551615",
+            Print(static_cast<testing::internal::UInt64>(-1)));  // uint64
+  EXPECT_EQ("-9223372036854775808",
+            Print(static_cast<testing::internal::Int64>(1) << 63));  // int64
+}
+
+// Size types.
+TEST(PrintBuiltInTypeTest, Size_t) {
+  EXPECT_EQ("1", Print(sizeof('a')));  // size_t.
+#if !GTEST_OS_WINDOWS
+  // Windows has no ssize_t type.
+  EXPECT_EQ("-2", Print(static_cast<ssize_t>(-2)));  // ssize_t.
+#endif  // !GTEST_OS_WINDOWS
+}
+
+// Floating-points.
+TEST(PrintBuiltInTypeTest, FloatingPoints) {
+  EXPECT_EQ("1.5", Print(1.5f));   // float
+  EXPECT_EQ("-2.5", Print(-2.5));  // double
+}
+
+// Since ::std::stringstream::operator<<(const void *) formats the pointer
+// output differently with different compilers, we have to create the expected
+// output first and use it as our expectation.
+static string PrintPointer(const void *p) {
+  ::std::stringstream expected_result_stream;
+  expected_result_stream << p;
+  return expected_result_stream.str();
+}
+
+// Tests printing C strings.
+
+// const char*.
+TEST(PrintCStringTest, Const) {
+  const char* p = "World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"World\"", Print(p));
+}
+
+// char*.
+TEST(PrintCStringTest, NonConst) {
+  char p[] = "Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"Hi\"",
+            Print(static_cast<char*>(p)));
+}
+
+// NULL C string.
+TEST(PrintCStringTest, Null) {
+  const char* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that C strings are escaped properly.
+TEST(PrintCStringTest, EscapesProperly) {
+  const char* p = "'\"?\\\a\b\f\n\r\t\v\x7F\xFF a";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\x7F\\xFF a\"",
+            Print(p));
+}
+
+
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+
+// const wchar_t*.
+TEST(PrintWideCStringTest, Const) {
+  const wchar_t* p = L"World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"World\"", Print(p));
+}
+
+// wchar_t*.
+TEST(PrintWideCStringTest, NonConst) {
+  wchar_t p[] = L"Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"Hi\"",
+            Print(static_cast<wchar_t*>(p)));
+}
+
+// NULL wide C string.
+TEST(PrintWideCStringTest, Null) {
+  const wchar_t* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that wide C strings are escaped properly.
+TEST(PrintWideCStringTest, EscapesProperly) {
+  const wchar_t s[] = {'\'', '"', '?', '\\', '\a', '\b', '\f', '\n', '\r',
+                       '\t', '\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\0'};
+  EXPECT_EQ(PrintPointer(s) + " pointing to L\"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\"",
+            Print(static_cast<const wchar_t*>(s)));
+}
+#endif  // native wchar_t
+
+// Tests printing pointers to other char types.
+
+// signed char*.
+TEST(PrintCharPointerTest, SignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const signed char*.
+TEST(PrintCharPointerTest, ConstSignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// unsigned char*.
+TEST(PrintCharPointerTest, UnsignedChar) {
+  unsigned char* p = reinterpret_cast<unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const unsigned char*.
+TEST(PrintCharPointerTest, ConstUnsignedChar) {
+  const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to simple, built-in types.
+
+// bool*.
+TEST(PrintPointerToBuiltInTypeTest, Bool) {
+  bool* p = reinterpret_cast<bool*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// void*.
+TEST(PrintPointerToBuiltInTypeTest, Void) {
+  void* p = reinterpret_cast<void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const void*.
+TEST(PrintPointerToBuiltInTypeTest, ConstVoid) {
+  const void* p = reinterpret_cast<const void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to pointers.
+TEST(PrintPointerToPointerTest, IntPointerPointer) {
+  int** p = reinterpret_cast<int**>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing (non-member) function pointers.
+
+void MyFunction(int /* n */) {}
+
+TEST(PrintPointerTest, NonMemberFunctionPointer) {
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  EXPECT_EQ(
+      PrintPointer(reinterpret_cast<const void*>(
+          reinterpret_cast<internal::BiggestInt>(&MyFunction))),
+      Print(&MyFunction));
+  int (*p)(bool) = NULL;  // NOLINT
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// An assertion predicate determining whether a one string is a prefix for
+// another.
+template <typename StringType>
+AssertionResult HasPrefix(const StringType& str, const StringType& prefix) {
+  if (str.find(prefix, 0) == 0)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(prefix[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << begin_string_quote << prefix << "\" is not a prefix of "
+      << begin_string_quote << str << "\"\n";
+}
+
+// Tests printing member variable pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+
+struct Foo {
+ public:
+  virtual ~Foo() {}
+  int MyMethod(char x) { return x + 1; }
+  virtual char MyVirtualMethod(int /* n */) { return 'a'; }
+
+  int value;
+};
+
+TEST(PrintPointerTest, MemberVariablePointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::value),
+                        Print(sizeof(&Foo::value)) + "-byte object "));
+  int (Foo::*p) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing member function pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+TEST(PrintPointerTest, MemberFunctionPointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::MyMethod),
+                        Print(sizeof(&Foo::MyMethod)) + "-byte object "));
+  EXPECT_TRUE(
+      HasPrefix(Print(&Foo::MyVirtualMethod),
+                Print(sizeof((&Foo::MyVirtualMethod))) + "-byte object "));
+  int (Foo::*p)(char) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing C arrays.
+
+// The difference between this and Print() is that it ensures that the
+// argument is a reference to an array.
+template <typename T, size_t N>
+string PrintArrayHelper(T (&a)[N]) {
+  return Print(a);
+}
+
+// One-dimensional array.
+TEST(PrintArrayTest, OneDimensionalArray) {
+  int a[5] = { 1, 2, 3, 4, 5 };
+  EXPECT_EQ("{ 1, 2, 3, 4, 5 }", PrintArrayHelper(a));
+}
+
+// Two-dimensional array.
+TEST(PrintArrayTest, TwoDimensionalArray) {
+  int a[2][5] = {
+    { 1, 2, 3, 4, 5 },
+    { 6, 7, 8, 9, 0 }
+  };
+  EXPECT_EQ("{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }", PrintArrayHelper(a));
+}
+
+// Array of const elements.
+TEST(PrintArrayTest, ConstArray) {
+  const bool a[1] = { false };
+  EXPECT_EQ("{ false }", PrintArrayHelper(a));
+}
+
+// char array without terminating NUL.
+TEST(PrintArrayTest, CharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  char a[] = { 'H', '\0', 'i' };
+  EXPECT_EQ("\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// const char array with terminating NUL.
+TEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) {
+  const char a[] = "\0Hi";
+  EXPECT_EQ("\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// const wchar_t array without terminating NUL.
+TEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  const wchar_t a[] = { L'H', L'\0', L'i' };
+  EXPECT_EQ("L\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// wchar_t array with terminating NUL.
+TEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) {
+  const wchar_t a[] = L"\0Hi";
+  EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// Array of objects.
+TEST(PrintArrayTest, ObjectArray) {
+  string a[3] = { "Hi", "Hello", "Ni hao" };
+  EXPECT_EQ("{ \"Hi\", \"Hello\", \"Ni hao\" }", PrintArrayHelper(a));
+}
+
+// Array with many elements.
+TEST(PrintArrayTest, BigArray) {
+  int a[100] = { 1, 2, 3 };
+  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }",
+            PrintArrayHelper(a));
+}
+
+// Tests printing ::string and ::std::string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// ::string.
+TEST(PrintStringTest, StringInGlobalNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+// ::std::string.
+TEST(PrintStringTest, StringInStdNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::std::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+
+TEST(PrintStringTest, StringAmbiguousHex) {
+  // "\x6BANANA" is ambiguous, it can be interpreted as starting with either of:
+  // '\x6', '\x6B', or '\x6BA'.
+
+  // a hex escaping sequence following by a decimal digit
+  EXPECT_EQ("\"0\\x12\" \"3\"", Print(::std::string("0\x12" "3")));
+  // a hex escaping sequence following by a hex digit (lower-case)
+  EXPECT_EQ("\"mm\\x6\" \"bananas\"", Print(::std::string("mm\x6" "bananas")));
+  // a hex escaping sequence following by a hex digit (upper-case)
+  EXPECT_EQ("\"NOM\\x6\" \"BANANA\"", Print(::std::string("NOM\x6" "BANANA")));
+  // a hex escaping sequence following by a non-xdigit
+  EXPECT_EQ("\"!\\x5-!\"", Print(::std::string("!\x5-!")));
+}
+
+// Tests printing ::wstring and ::std::wstring.
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// ::wstring.
+TEST(PrintWideStringTest, StringInGlobalNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+// ::std::wstring.
+TEST(PrintWideStringTest, StringInStdNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+
+TEST(PrintWideStringTest, StringAmbiguousHex) {
+  // same for wide strings.
+  EXPECT_EQ("L\"0\\x12\" L\"3\"", Print(::std::wstring(L"0\x12" L"3")));
+  EXPECT_EQ("L\"mm\\x6\" L\"bananas\"",
+            Print(::std::wstring(L"mm\x6" L"bananas")));
+  EXPECT_EQ("L\"NOM\\x6\" L\"BANANA\"",
+            Print(::std::wstring(L"NOM\x6" L"BANANA")));
+  EXPECT_EQ("L\"!\\x5-!\"", Print(::std::wstring(L"!\x5-!")));
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests printing types that support generic streaming (i.e. streaming
+// to std::basic_ostream<Char, CharTraits> for any valid Char and
+// CharTraits types).
+
+// Tests printing a non-template type that supports generic streaming.
+
+class AllowsGenericStreaming {};
+
+template <typename Char, typename CharTraits>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreaming& /* a */) {
+  return os << "AllowsGenericStreaming";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {
+  AllowsGenericStreaming a;
+  EXPECT_EQ("AllowsGenericStreaming", Print(a));
+}
+
+// Tests printing a template type that supports generic streaming.
+
+template <typename T>
+class AllowsGenericStreamingTemplate {};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TemplateType) {
+  AllowsGenericStreamingTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a));
+}
+
+// Tests printing a type that supports generic streaming and can be
+// implicitly converted to another printable type.
+
+template <typename T>
+class AllowsGenericStreamingAndImplicitConversionTemplate {
+ public:
+  operator bool() const { return false; }
+};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingAndImplicitConversionTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
+  AllowsGenericStreamingAndImplicitConversionTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a));
+}
+
+#if GTEST_HAS_STRING_PIECE_
+
+// Tests printing StringPiece.
+
+TEST(PrintStringPieceTest, SimpleStringPiece) {
+  const StringPiece sp = "Hello";
+  EXPECT_EQ("\"Hello\"", Print(sp));
+}
+
+TEST(PrintStringPieceTest, UnprintableCharacters) {
+  const char str[] = "NUL (\0) and \r\t";
+  const StringPiece sp(str, sizeof(str) - 1);
+  EXPECT_EQ("\"NUL (\\0) and \\r\\t\"", Print(sp));
+}
+
+#endif  // GTEST_HAS_STRING_PIECE_
+
+// Tests printing STL containers.
+
+TEST(PrintStlContainerTest, EmptyDeque) {
+  deque<char> empty;
+  EXPECT_EQ("{}", Print(empty));
+}
+
+TEST(PrintStlContainerTest, NonEmptyDeque) {
+  deque<int> non_empty;
+  non_empty.push_back(1);
+  non_empty.push_back(3);
+  EXPECT_EQ("{ 1, 3 }", Print(non_empty));
+}
+
+#if GTEST_HAS_HASH_MAP_
+
+TEST(PrintStlContainerTest, OneElementHashMap) {
+  hash_map<int, char> map1;
+  map1[1] = 'a';
+  EXPECT_EQ("{ (1, 'a' (97, 0x61)) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, HashMultiMap) {
+  hash_multimap<int, bool> map1;
+  map1.insert(make_pair(5, true));
+  map1.insert(make_pair(5, false));
+
+  // Elements of hash_multimap can be printed in any order.
+  const string result = Print(map1);
+  EXPECT_TRUE(result == "{ (5, true), (5, false) }" ||
+              result == "{ (5, false), (5, true) }")
+                  << " where Print(map1) returns \"" << result << "\".";
+}
+
+#endif  // GTEST_HAS_HASH_MAP_
+
+#if GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, HashSet) {
+  hash_set<string> set1;
+  set1.insert("hello");
+  EXPECT_EQ("{ \"hello\" }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, HashMultiSet) {
+  const int kSize = 5;
+  int a[kSize] = { 1, 1, 2, 5, 1 };
+  hash_multiset<int> set1(a, a + kSize);
+
+  // Elements of hash_multiset can be printed in any order.
+  const string result = Print(set1);
+  const string expected_pattern = "{ d, d, d, d, d }";  // d means a digit.
+
+  // Verifies the result matches the expected pattern; also extracts
+  // the numbers in the result.
+  ASSERT_EQ(expected_pattern.length(), result.length());
+  std::vector<int> numbers;
+  for (size_t i = 0; i != result.length(); i++) {
+    if (expected_pattern[i] == 'd') {
+      ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0);
+      numbers.push_back(result[i] - '0');
+    } else {
+      EXPECT_EQ(expected_pattern[i], result[i]) << " where result is "
+                                                << result;
+    }
+  }
+
+  // Makes sure the result contains the right numbers.
+  std::sort(numbers.begin(), numbers.end());
+  std::sort(a, a + kSize);
+  EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin()));
+}
+
+#endif  // GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, List) {
+  const string a[] = {
+    "hello",
+    "world"
+  };
+  const list<string> strings(a, a + 2);
+  EXPECT_EQ("{ \"hello\", \"world\" }", Print(strings));
+}
+
+TEST(PrintStlContainerTest, Map) {
+  map<int, bool> map1;
+  map1[1] = true;
+  map1[5] = false;
+  map1[3] = true;
+  EXPECT_EQ("{ (1, true), (3, true), (5, false) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, MultiMap) {
+  multimap<bool, int> map1;
+  // The make_pair template function would deduce the type as
+  // pair<bool, int> here, and since the key part in a multimap has to
+  // be constant, without a templated ctor in the pair class (as in
+  // libCstd on Solaris), make_pair call would fail to compile as no
+  // implicit conversion is found.  Thus explicit typename is used
+  // here instead.
+  map1.insert(pair<const bool, int>(true, 0));
+  map1.insert(pair<const bool, int>(true, 1));
+  map1.insert(pair<const bool, int>(false, 2));
+  EXPECT_EQ("{ (false, 2), (true, 0), (true, 1) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, Set) {
+  const unsigned int a[] = { 3, 0, 5 };
+  set<unsigned int> set1(a, a + 3);
+  EXPECT_EQ("{ 0, 3, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, MultiSet) {
+  const int a[] = { 1, 1, 2, 5, 1 };
+  multiset<int> set1(a, a + 5);
+  EXPECT_EQ("{ 1, 1, 1, 2, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, Pair) {
+  pair<const bool, int> p(true, 5);
+  EXPECT_EQ("(true, 5)", Print(p));
+}
+
+TEST(PrintStlContainerTest, Vector) {
+  vector<int> v;
+  v.push_back(1);
+  v.push_back(2);
+  EXPECT_EQ("{ 1, 2 }", Print(v));
+}
+
+TEST(PrintStlContainerTest, LongSequence) {
+  const int a[100] = { 1, 2, 3 };
+  const vector<int> v(a, a + 100);
+  EXPECT_EQ("{ 1, 2, 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, ... }", Print(v));
+}
+
+TEST(PrintStlContainerTest, NestedContainer) {
+  const int a1[] = { 1, 2 };
+  const int a2[] = { 3, 4, 5 };
+  const list<int> l1(a1, a1 + 2);
+  const list<int> l2(a2, a2 + 3);
+
+  vector<list<int> > v;
+  v.push_back(l1);
+  v.push_back(l2);
+  EXPECT_EQ("{ { 1, 2 }, { 3, 4, 5 } }", Print(v));
+}
+
+TEST(PrintStlContainerTest, OneDimensionalNativeArray) {
+  const int a[3] = { 1, 2, 3 };
+  NativeArray<int> b(a, 3, kReference);
+  EXPECT_EQ("{ 1, 2, 3 }", Print(b));
+}
+
+TEST(PrintStlContainerTest, TwoDimensionalNativeArray) {
+  const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
+  NativeArray<int[3]> b(a, 2, kReference);
+  EXPECT_EQ("{ { 1, 2, 3 }, { 4, 5, 6 } }", Print(b));
+}
+
+// Tests that a class named iterator isn't treated as a container.
+
+struct iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, Iterator) {
+  iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+// Tests that a class named const_iterator isn't treated as a container.
+
+struct const_iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, ConstIterator) {
+  const_iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+#if GTEST_HAS_TR1_TUPLE
+// Tests printing tuples.
+
+// Tuples of various arities.
+TEST(PrintTupleTest, VariousSizes) {
+  tuple<> t0;
+  EXPECT_EQ("()", Print(t0));
+
+  tuple<int> t1(5);
+  EXPECT_EQ("(5)", Print(t1));
+
+  tuple<char, bool> t2('a', true);
+  EXPECT_EQ("('a' (97, 0x61), true)", Print(t2));
+
+  tuple<bool, int, int> t3(false, 2, 3);
+  EXPECT_EQ("(false, 2, 3)", Print(t3));
+
+  tuple<bool, int, int, int> t4(false, 2, 3, 4);
+  EXPECT_EQ("(false, 2, 3, 4)", Print(t4));
+
+  tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true);
+  EXPECT_EQ("(false, 2, 3, 4, true)", Print(t5));
+
+  tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6)", Print(t6));
+
+  tuple<bool, int, int, int, bool, int, int> t7(false, 2, 3, 4, true, 6, 7);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7)", Print(t7));
+
+  tuple<bool, int, int, int, bool, int, int, bool> t8(
+      false, 2, 3, 4, true, 6, 7, true);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true)", Print(t8));
+
+  tuple<bool, int, int, int, bool, int, int, bool, int> t9(
+      false, 2, 3, 4, true, 6, 7, true, 9);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9));
+
+  const char* const str = "8";
+  // VC++ 2010's implementation of tuple of C++0x is deficient, requiring
+  // an explicit type cast of NULL to be used.
+  tuple<bool, char, short, testing::internal::Int32,  // NOLINT
+      testing::internal::Int64, float, double, const char*, void*, string>
+      t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str,
+          ImplicitCast_<void*>(NULL), "10");
+  EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
+            " pointing to \"8\", NULL, \"10\")",
+            Print(t10));
+}
+
+// Nested tuples.
+TEST(PrintTupleTest, NestedTuple) {
+  tuple<tuple<int, bool>, char> nested(make_tuple(5, true), 'a');
+  EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested));
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Tests printing user-defined unprintable types.
+
+// Unprintable types in the global namespace.
+TEST(PrintUnprintableTypeTest, InGlobalNamespace) {
+  EXPECT_EQ("1-byte object <00>",
+            Print(UnprintableTemplateInGlobal<char>()));
+}
+
+// Unprintable types in a user namespace.
+TEST(PrintUnprintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            Print(::foo::UnprintableInFoo()));
+}
+
+// Unprintable types are that too big to be printed completely.
+
+struct Big {
+  Big() { memset(array, 0, sizeof(array)); }
+  char array[257];
+};
+
+TEST(PrintUnpritableTypeTest, BigObject) {
+  EXPECT_EQ("257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>",
+            Print(Big()));
+}
+
+// Tests printing user-defined streamable types.
+
+// Streamable types in the global namespace.
+TEST(PrintStreamableTypeTest, InGlobalNamespace) {
+  StreamableInGlobal x;
+  EXPECT_EQ("StreamableInGlobal", Print(x));
+  EXPECT_EQ("StreamableInGlobal*", Print(&x));
+}
+
+// Printable template types in a user namespace.
+TEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) {
+  EXPECT_EQ("StreamableTemplateInFoo: 0",
+            Print(::foo::StreamableTemplateInFoo<int>()));
+}
+
+// Tests printing user-defined types that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintTo: 0",
+            Print(::foo::PrintableViaPrintTo()));
+}
+
+// Tests printing a pointer to a user-defined type that has a <<
+// operator for its pointer.
+TEST(PrintPrintableTypeTest, PointerInUserNamespace) {
+  ::foo::PointerPrintable x;
+  EXPECT_EQ("PointerPrintable*", Print(&x));
+}
+
+// Tests printing user-defined class template that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, TemplateInUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintToTemplate: 5",
+            Print(::foo::PrintableViaPrintToTemplate<int>(5)));
+}
+
+#if GTEST_HAS_PROTOBUF_
+
+// Tests printing a protocol message.
+TEST(PrintProtocolMessageTest, PrintsShortDebugString) {
+  testing::internal::TestMessage msg;
+  msg.set_member("yes");
+  EXPECT_EQ("<member:\"yes\">", Print(msg));
+}
+
+// Tests printing a short proto2 message.
+TEST(PrintProto2MessageTest, PrintsShortDebugStringWhenItIsShort) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<int_field:\\s*2\\s+string_field:\\s*\"hello\">");
+}
+
+// Tests printing a long proto2 message.
+TEST(PrintProto2MessageTest, PrintsDebugStringWhenItIsLong) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  msg.add_names("peter");
+  msg.add_names("paul");
+  msg.add_names("mary");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<\n"
+               "int_field:\\s*2\n"
+               "string_field:\\s*\"hello\"\n"
+               "names:\\s*\"peter\"\n"
+               "names:\\s*\"paul\"\n"
+               "names:\\s*\"mary\"\n"
+               ">");
+}
+
+#endif  // GTEST_HAS_PROTOBUF_
+
+// Tests that the universal printer prints both the address and the
+// value of a reference.
+TEST(PrintReferenceTest, PrintsAddressAndValue) {
+  int n = 5;
+  EXPECT_EQ("@" + PrintPointer(&n) + " 5", PrintByRef(n));
+
+  int a[2][3] = {
+    { 0, 1, 2 },
+    { 3, 4, 5 }
+  };
+  EXPECT_EQ("@" + PrintPointer(a) + " { { 0, 1, 2 }, { 3, 4, 5 } }",
+            PrintByRef(a));
+
+  const ::foo::UnprintableInFoo x;
+  EXPECT_EQ("@" + PrintPointer(&x) + " 16-byte object "
+            "<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            PrintByRef(x));
+}
+
+// Tests that the universal printer prints a function pointer passed by
+// reference.
+TEST(PrintReferenceTest, HandlesFunctionPointer) {
+  void (*fp)(int n) = &MyFunction;
+  const string fp_pointer_string =
+      PrintPointer(reinterpret_cast<const void*>(&fp));
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  const string fp_string = PrintPointer(reinterpret_cast<const void*>(
+      reinterpret_cast<internal::BiggestInt>(fp)));
+  EXPECT_EQ("@" + fp_pointer_string + " " + fp_string,
+            PrintByRef(fp));
+}
+
+// Tests that the universal printer prints a member function pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberFunctionPointer) {
+  int (Foo::*p)(char ch) = &Foo::MyMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p)) + " " +
+          Print(sizeof(p)) + "-byte object "));
+
+  char (Foo::*p2)(int n) = &Foo::MyVirtualMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p2),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p2)) + " " +
+          Print(sizeof(p2)) + "-byte object "));
+}
+
+// Tests that the universal printer prints a member variable pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberVariablePointer) {
+  int (Foo::*p) = &Foo::value;  // NOLINT
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(&p) + " " + Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests that FormatForComparisonFailureMessage(), which is used to print
+// an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion
+// fails, formats the operand in the desired way.
+
+// scalar
+TEST(FormatForComparisonFailureMessageTest, WorksForScalar) {
+  EXPECT_STREQ("123",
+               FormatForComparisonFailureMessage(123, 124).c_str());
+}
+
+// non-char pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) {
+  int n = 0;
+  EXPECT_EQ(PrintPointer(&n),
+            FormatForComparisonFailureMessage(&n, &n).c_str());
+}
+
+// non-char array
+TEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) {
+  // In expression 'array == x', 'array' is compared by pointer.
+  // Therefore we want to print an array operand as a pointer.
+  int n[] = { 1, 2, 3 };
+  EXPECT_EQ(PrintPointer(n),
+            FormatForComparisonFailureMessage(n, n).c_str());
+}
+
+// Tests formatting a char pointer when it's compared with another pointer.
+// In this case we want to print it as a raw pointer, as the comparision is by
+// pointer.
+
+// char pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a C string (we don't
+  // even know if it's supposed to point to a valid C string).
+
+  // const char*
+  const char* s = "hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // char*
+  char ch = 'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// wchar_t pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a wide C string (we don't
+  // even know if it's supposed to point to a valid wide C string).
+
+  // const wchar_t*
+  const wchar_t* s = L"hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // wchar_t*
+  wchar_t ch = L'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// Tests formatting a char pointer when it's compared to a string object.
+// In this case we want to print the char pointer as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char pointer vs ::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::string()).c_str());
+}
+#endif
+
+// char pointer vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t pointer vs ::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t pointer vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::wstring()).c_str());
+}
+#endif
+
+// Tests formatting a char array when it's compared with a pointer or array.
+// In this case we want to print the array as a row pointer, as the comparison
+// is by pointer.
+
+// char array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) {
+  char str[] = "hi \"world\"";
+  char* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// char array vs char array
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) {
+  const char str[] = "hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// wchar_t array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) {
+  wchar_t str[] = L"hi \"world\"";
+  wchar_t* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// wchar_t array vs wchar_t array
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// Tests formatting a char array when it's compared with a string object.
+// In this case we want to print the array as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char array vs string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsString) {
+  const char str[] = "hi \"w\0rld\"";
+  EXPECT_STREQ("\"hi \\\"w\"",  // The content should be escaped.
+                                // Embedded NUL terminates the string.
+               FormatForComparisonFailureMessage(str, ::string()).c_str());
+}
+#endif
+
+// char array vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) {
+  const char str[] = "hi \"world\"";
+  EXPECT_STREQ("\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t array vs wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWString) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_STREQ("L\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t array vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) {
+  const wchar_t str[] = L"hi \"w\0rld\"";
+  EXPECT_STREQ(
+      "L\"hi \\\"w\"",  // The content should be escaped.
+                        // Embedded NUL terminates the string.
+      FormatForComparisonFailureMessage(str, ::std::wstring()).c_str());
+}
+#endif
+
+// Useful for testing PrintToString().  We cannot use EXPECT_EQ()
+// there as its implementation uses PrintToString().  The caller must
+// ensure that 'value' has no side effect.
+#define EXPECT_PRINT_TO_STRING_(value, expected_string)         \
+  EXPECT_TRUE(PrintToString(value) == (expected_string))        \
+      << " where " #value " prints as " << (PrintToString(value))
+
+TEST(PrintToStringTest, WorksForScalar) {
+  EXPECT_PRINT_TO_STRING_(123, "123");
+}
+
+TEST(PrintToStringTest, WorksForPointerToConstChar) {
+  const char* p = "hello";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForPointerToNonConstChar) {
+  char s[] = "hello";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToConstChar) {
+  const char* p = "hello\n";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\n\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToNonConstChar) {
+  char s[] = "hello\1";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\x1\"");
+}
+
+TEST(PrintToStringTest, WorksForArray) {
+  int n[3] = { 1, 2, 3 };
+  EXPECT_PRINT_TO_STRING_(n, "{ 1, 2, 3 }");
+}
+
+TEST(PrintToStringTest, WorksForCharArray) {
+  char s[] = "hello";
+  EXPECT_PRINT_TO_STRING_(s, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {
+  const char str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(str_with_nul, "\"hello\\0 world\"");
+
+  char mutable_str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, "\"hello\\0 world\"");
+}
+
+#undef EXPECT_PRINT_TO_STRING_
+
+TEST(UniversalTersePrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalTersePrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalTersePrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalTersePrint(s1, &ss1);
+  EXPECT_EQ("\"abc\"", ss1.str());
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalTersePrint(s2, &ss2);
+  EXPECT_EQ("\"abc\"", ss2.str());
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalTersePrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalPrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalPrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalPrint(s1, &ss1);
+  EXPECT_EQ(PrintPointer(s1) + " pointing to \"abc\"", string(ss1.str()));
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalPrint(s2, &ss2);
+  EXPECT_EQ(PrintPointer(s2) + " pointing to \"abc\"", string(ss2.str()));
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalPrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForCharArray) {
+  const char str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss1;
+  UniversalPrint(str, &ss1);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss1.str());
+
+  const char mutable_str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss2;
+  UniversalPrint(mutable_str, &ss2);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str());
+}
+
+#if GTEST_HAS_TR1_TUPLE
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsEmptyTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple());
+  EXPECT_EQ(0u, result.size());
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsOneTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1));
+  ASSERT_EQ(1u, result.size());
+  EXPECT_EQ("1", result[0]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTwoTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1, 'a'));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("'a' (97, 0x61)", result[1]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTersely) {
+  const int n = 1;
+  Strings result = UniversalTersePrintTupleFieldsToStrings(
+      tuple<const int&, const char*>(n, "a"));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("\"a\"", result[1]);
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace gtest_printers_test
+}  // namespace testing
diff --git a/vendor/gtest-1.7.0/test/gtest-test-part_test.cc b/vendor/gtest-1.7.0/test/gtest-test-part_test.cc
new file mode 100644
index 0000000..ca8ba93
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-test-part_test.cc
@@ -0,0 +1,208 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#include "gtest/gtest-test-part.h"
+
+#include "gtest/gtest.h"
+
+using testing::Message;
+using testing::Test;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+
+namespace {
+
+// Tests the TestPartResult class.
+
+// The test fixture for testing TestPartResult.
+class TestPartResultTest : public Test {
+ protected:
+  TestPartResultTest()
+      : r1_(TestPartResult::kSuccess, "foo/bar.cc", 10, "Success!"),
+        r2_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure!"),
+        r3_(TestPartResult::kFatalFailure, NULL, -1, "Failure!") {}
+
+  TestPartResult r1_, r2_, r3_;
+};
+
+
+TEST_F(TestPartResultTest, ConstructorWorks) {
+  Message message;
+  message << "something is terribly wrong";
+  message << static_cast<const char*>(testing::internal::kStackTraceMarker);
+  message << "some unimportant stack trace";
+
+  const TestPartResult result(TestPartResult::kNonFatalFailure,
+                              "some_file.cc",
+                              42,
+                              message.GetString().c_str());
+
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());
+  EXPECT_STREQ("some_file.cc", result.file_name());
+  EXPECT_EQ(42, result.line_number());
+  EXPECT_STREQ(message.GetString().c_str(), result.message());
+  EXPECT_STREQ("something is terribly wrong", result.summary());
+}
+
+TEST_F(TestPartResultTest, ResultAccessorsWork) {
+  const TestPartResult success(TestPartResult::kSuccess,
+                               "file.cc",
+                               42,
+                               "message");
+  EXPECT_TRUE(success.passed());
+  EXPECT_FALSE(success.failed());
+  EXPECT_FALSE(success.nonfatally_failed());
+  EXPECT_FALSE(success.fatally_failed());
+
+  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,
+                                        "file.cc",
+                                        42,
+                                        "message");
+  EXPECT_FALSE(nonfatal_failure.passed());
+  EXPECT_TRUE(nonfatal_failure.failed());
+  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());
+  EXPECT_FALSE(nonfatal_failure.fatally_failed());
+
+  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,
+                                     "file.cc",
+                                     42,
+                                     "message");
+  EXPECT_FALSE(fatal_failure.passed());
+  EXPECT_TRUE(fatal_failure.failed());
+  EXPECT_FALSE(fatal_failure.nonfatally_failed());
+  EXPECT_TRUE(fatal_failure.fatally_failed());
+}
+
+// Tests TestPartResult::type().
+TEST_F(TestPartResultTest, type) {
+  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());
+  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());
+}
+
+// Tests TestPartResult::file_name().
+TEST_F(TestPartResultTest, file_name) {
+  EXPECT_STREQ("foo/bar.cc", r1_.file_name());
+  EXPECT_STREQ(NULL, r3_.file_name());
+}
+
+// Tests TestPartResult::line_number().
+TEST_F(TestPartResultTest, line_number) {
+  EXPECT_EQ(10, r1_.line_number());
+  EXPECT_EQ(-1, r2_.line_number());
+}
+
+// Tests TestPartResult::message().
+TEST_F(TestPartResultTest, message) {
+  EXPECT_STREQ("Success!", r1_.message());
+}
+
+// Tests TestPartResult::passed().
+TEST_F(TestPartResultTest, Passed) {
+  EXPECT_TRUE(r1_.passed());
+  EXPECT_FALSE(r2_.passed());
+  EXPECT_FALSE(r3_.passed());
+}
+
+// Tests TestPartResult::failed().
+TEST_F(TestPartResultTest, Failed) {
+  EXPECT_FALSE(r1_.failed());
+  EXPECT_TRUE(r2_.failed());
+  EXPECT_TRUE(r3_.failed());
+}
+
+// Tests TestPartResult::fatally_failed().
+TEST_F(TestPartResultTest, FatallyFailed) {
+  EXPECT_FALSE(r1_.fatally_failed());
+  EXPECT_FALSE(r2_.fatally_failed());
+  EXPECT_TRUE(r3_.fatally_failed());
+}
+
+// Tests TestPartResult::nonfatally_failed().
+TEST_F(TestPartResultTest, NonfatallyFailed) {
+  EXPECT_FALSE(r1_.nonfatally_failed());
+  EXPECT_TRUE(r2_.nonfatally_failed());
+  EXPECT_FALSE(r3_.nonfatally_failed());
+}
+
+// Tests the TestPartResultArray class.
+
+class TestPartResultArrayTest : public Test {
+ protected:
+  TestPartResultArrayTest()
+      : r1_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure 1"),
+        r2_(TestPartResult::kFatalFailure, "foo/bar.cc", -1, "Failure 2") {}
+
+  const TestPartResult r1_, r2_;
+};
+
+// Tests that TestPartResultArray initially has size 0.
+TEST_F(TestPartResultArrayTest, InitialSizeIsZero) {
+  TestPartResultArray results;
+  EXPECT_EQ(0, results.size());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResult
+// after one Append() operation.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  EXPECT_EQ(1, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResults
+// after two Append() operations.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  results.Append(r2_);
+  EXPECT_EQ(2, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+  EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message());
+}
+
+typedef TestPartResultArrayTest TestPartResultArrayDeathTest;
+
+// Tests that the program dies when GetTestPartResult() is called with
+// an invalid index.
+TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {
+  TestPartResultArray results;
+  results.Append(r1_);
+
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), "");
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), "");
+}
+
+// TODO(mheule at google.com): Add a test for the class HasNewFatalFailureHelper.
+
+}  // namespace
diff --git a/vendor/gtest-1.7.0/test/gtest-tuple_test.cc b/vendor/gtest-1.7.0/test/gtest-tuple_test.cc
new file mode 100644
index 0000000..bfaa3e0
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-tuple_test.cc
@@ -0,0 +1,320 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-tuple.h"
+#include <utility>
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+using ::std::tr1::tuple_element;
+using ::std::tr1::tuple_size;
+using ::testing::StaticAssertTypeEq;
+
+// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.
+TEST(tuple_element_Test, ReturnsElementType) {
+  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();
+  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();
+  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();
+}
+
+// Tests that tuple_size<T>::value gives the number of fields in tuple
+// type T.
+TEST(tuple_size_Test, ReturnsNumberOfFields) {
+  EXPECT_EQ(0, +tuple_size<tuple<> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);
+  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));
+  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));
+  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));
+}
+
+// Tests comparing a tuple with itself.
+TEST(ComparisonTest, ComparesWithSelf) {
+  const tuple<int, char, bool> a(5, 'a', false);
+
+  EXPECT_TRUE(a == a);
+  EXPECT_FALSE(a != a);
+}
+
+// Tests comparing two tuples with the same value.
+TEST(ComparisonTest, ComparesEqualTuples) {
+  const tuple<int, bool> a(5, true), b(5, true);
+
+  EXPECT_TRUE(a == b);
+  EXPECT_FALSE(a != b);
+}
+
+// Tests comparing two different tuples that have no reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {
+  typedef tuple<const int, char> FooTuple;
+
+  const FooTuple a(0, 'x');
+  const FooTuple b(1, 'a');
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  const FooTuple c(1, 'b');
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests comparing two different tuples that have reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {
+  typedef tuple<int&, const char&> FooTuple;
+
+  int i = 5;
+  const char ch = 'a';
+  const FooTuple a(i, ch);
+
+  int j = 6;
+  const FooTuple b(j, ch);
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  j = 5;
+  const char ch2 = 'b';
+  const FooTuple c(j, ch2);
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests that a tuple field with a reference type is an alias of the
+// variable it's supposed to reference.
+TEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {
+  int n = 0;
+  tuple<bool, int&> t(true, n);
+
+  n = 1;
+  EXPECT_EQ(n, get<1>(t))
+      << "Changing a underlying variable should update the reference field.";
+
+  // Makes sure that the implementation doesn't do anything funny with
+  // the & operator for the return type of get<>().
+  EXPECT_EQ(&n, &(get<1>(t)))
+      << "The address of a reference field should equal the address of "
+      << "the underlying variable.";
+
+  get<1>(t) = 2;
+  EXPECT_EQ(2, n)
+      << "Changing a reference field should update the underlying variable.";
+}
+
+// Tests that tuple's default constructor default initializes each field.
+// This test needs to compile without generating warnings.
+TEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {
+  // The TR1 report requires that tuple's default constructor default
+  // initializes each field, even if it's a primitive type.  If the
+  // implementation forgets to do this, this test will catch it by
+  // generating warnings about using uninitialized variables (assuming
+  // a decent compiler).
+
+  tuple<> empty;
+
+  tuple<int> a1, b1;
+  b1 = a1;
+  EXPECT_EQ(0, get<0>(b1));
+
+  tuple<int, double> a2, b2;
+  b2 = a2;
+  EXPECT_EQ(0, get<0>(b2));
+  EXPECT_EQ(0.0, get<1>(b2));
+
+  tuple<double, char, bool*> a3, b3;
+  b3 = a3;
+  EXPECT_EQ(0.0, get<0>(b3));
+  EXPECT_EQ('\0', get<1>(b3));
+  EXPECT_TRUE(get<2>(b3) == NULL);
+
+  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;
+  b10 = a10;
+  EXPECT_EQ(0, get<0>(b10));
+  EXPECT_EQ(0, get<1>(b10));
+  EXPECT_EQ(0, get<2>(b10));
+  EXPECT_EQ(0, get<3>(b10));
+  EXPECT_EQ(0, get<4>(b10));
+  EXPECT_EQ(0, get<5>(b10));
+  EXPECT_EQ(0, get<6>(b10));
+  EXPECT_EQ(0, get<7>(b10));
+  EXPECT_EQ(0, get<8>(b10));
+  EXPECT_EQ(0, get<9>(b10));
+}
+
+// Tests constructing a tuple from its fields.
+TEST(TupleConstructorTest, ConstructsFromFields) {
+  int n = 1;
+  // Reference field.
+  tuple<int&> a(n);
+  EXPECT_EQ(&n, &(get<0>(a)));
+
+  // Non-reference fields.
+  tuple<int, char> b(5, 'a');
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ('a', get<1>(b));
+
+  // Const reference field.
+  const int m = 2;
+  tuple<bool, const int&> c(true, m);
+  EXPECT_TRUE(get<0>(c));
+  EXPECT_EQ(&m, &(get<1>(c)));
+}
+
+// Tests tuple's copy constructor.
+TEST(TupleConstructorTest, CopyConstructor) {
+  tuple<double, bool> a(0.0, true);
+  tuple<double, bool> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+}
+
+// Tests constructing a tuple from another tuple that has a compatible
+// but different type.
+TEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {
+  tuple<int, int, char> a(0, 1, 'a');
+  tuple<double, long, int> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_EQ(1, get<1>(b));
+  EXPECT_EQ('a', get<2>(b));
+}
+
+// Tests constructing a 2-tuple from an std::pair.
+TEST(TupleConstructorTest, ConstructsFromPair) {
+  ::std::pair<int, char> a(1, 'a');
+  tuple<int, char> b(a);
+  tuple<int, const char&> c(a);
+}
+
+// Tests assigning a tuple to another tuple with the same type.
+TEST(TupleAssignmentTest, AssignsToSameTupleType) {
+  const tuple<int, long> a(5, 7L);
+  tuple<int, long> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ(7L, get<1>(b));
+}
+
+// Tests assigning a tuple to another tuple with a different but
+// compatible type.
+TEST(TupleAssignmentTest, AssignsToDifferentTupleType) {
+  const tuple<int, long, bool> a(1, 7L, true);
+  tuple<long, int, bool> b;
+  b = a;
+  EXPECT_EQ(1L, get<0>(b));
+  EXPECT_EQ(7, get<1>(b));
+  EXPECT_TRUE(get<2>(b));
+}
+
+// Tests assigning an std::pair to a 2-tuple.
+TEST(TupleAssignmentTest, AssignsFromPair) {
+  const ::std::pair<int, bool> a(5, true);
+  tuple<int, bool> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+
+  tuple<long, bool> c;
+  c = a;
+  EXPECT_EQ(5L, get<0>(c));
+  EXPECT_TRUE(get<1>(c));
+}
+
+// A fixture for testing big tuples.
+class BigTupleTest : public testing::Test {
+ protected:
+  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;
+
+  BigTupleTest() :
+      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
+      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}
+
+  BigTuple a_, b_;
+};
+
+// Tests constructing big tuples.
+TEST_F(BigTupleTest, Construction) {
+  BigTuple a;
+  BigTuple b(b_);
+}
+
+// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.
+TEST_F(BigTupleTest, get) {
+  EXPECT_EQ(1, get<0>(a_));
+  EXPECT_EQ(2, get<9>(a_));
+
+  // Tests that get() works on a const tuple too.
+  const BigTuple a(a_);
+  EXPECT_EQ(1, get<0>(a));
+  EXPECT_EQ(2, get<9>(a));
+}
+
+// Tests comparing big tuples.
+TEST_F(BigTupleTest, Comparisons) {
+  EXPECT_TRUE(a_ == a_);
+  EXPECT_FALSE(a_ != a_);
+
+  EXPECT_TRUE(a_ != b_);
+  EXPECT_FALSE(a_ == b_);
+}
+
+TEST(MakeTupleTest, WorksForScalarTypes) {
+  tuple<bool, int> a;
+  a = make_tuple(true, 5);
+  EXPECT_TRUE(get<0>(a));
+  EXPECT_EQ(5, get<1>(a));
+
+  tuple<char, int, long> b;
+  b = make_tuple('a', 'b', 5);
+  EXPECT_EQ('a', get<0>(b));
+  EXPECT_EQ('b', get<1>(b));
+  EXPECT_EQ(5, get<2>(b));
+}
+
+TEST(MakeTupleTest, WorksForPointers) {
+  int a[] = { 1, 2, 3, 4 };
+  const char* const str = "hi";
+  int* const p = a;
+
+  tuple<const char*, int*> t;
+  t = make_tuple(str, p);
+  EXPECT_EQ(str, get<0>(t));
+  EXPECT_EQ(p, get<1>(t));
+}
+
+}  // namespace
diff --git a/vendor/gtest-1.7.0/test/gtest-typed-test2_test.cc b/vendor/gtest-1.7.0/test/gtest-typed-test2_test.cc
new file mode 100644
index 0000000..c284700
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-typed-test2_test.cc
@@ -0,0 +1,45 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,
+                              testing::Types<std::vector<int> >);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/vendor/gtest-1.7.0/test/gtest-typed-test_test.cc b/vendor/gtest-1.7.0/test/gtest-typed-test_test.cc
new file mode 100644
index 0000000..dd4ba43
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-typed-test_test.cc
@@ -0,0 +1,360 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <set>
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+using testing::Test;
+
+// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
+// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
+// type-parameterized test.
+template <typename T>
+class CommonTest : public Test {
+  // For some technical reason, SetUpTestCase() and TearDownTestCase()
+  // must be public.
+ public:
+  static void SetUpTestCase() {
+    shared_ = new T(5);
+  }
+
+  static void TearDownTestCase() {
+    delete shared_;
+    shared_ = NULL;
+  }
+
+  // This 'protected:' is optional.  There's no harm in making all
+  // members of this fixture class template public.
+ protected:
+  // We used to use std::list here, but switched to std::vector since
+  // MSVC's <list> doesn't compile cleanly with /W4.
+  typedef std::vector<T> Vector;
+  typedef std::set<int> IntSet;
+
+  CommonTest() : value_(1) {}
+
+  virtual ~CommonTest() { EXPECT_EQ(3, value_); }
+
+  virtual void SetUp() {
+    EXPECT_EQ(1, value_);
+    value_++;
+  }
+
+  virtual void TearDown() {
+    EXPECT_EQ(2, value_);
+    value_++;
+  }
+
+  T value_;
+  static T* shared_;
+};
+
+template <typename T>
+T* CommonTest<T>::shared_ = NULL;
+
+// This #ifdef block tests typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in typed tests
+
+typedef Types<char, int> TwoTypes;
+TYPED_TEST_CASE(CommonTest, TwoTypes);
+
+TYPED_TEST(CommonTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Typedefs in the fixture class template can be visited via the
+  // "typename TestFixture::" prefix.
+  typename TestFixture::Vector empty;
+  EXPECT_EQ(0U, empty.size());
+
+  typename TestFixture::IntSet empty2;
+  EXPECT_EQ(0U, empty2.size());
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST(CommonTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+
+  // TypeParam can be used to refer to the type parameter.
+  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
+}
+
+// Tests that multiple TYPED_TEST_CASE's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTest1 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// single type.
+TYPED_TEST_CASE(TypedTest1, int);
+TYPED_TEST(TypedTest1, A) {}
+
+template <typename T>
+class TypedTest2 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// Types<...> type list.
+TYPED_TEST_CASE(TypedTest2, Types<int>);
+
+// This also verifies that tests from different typed test cases can
+// share the same name.
+TYPED_TEST(TypedTest2, A) {}
+
+// Tests that a typed test case can be defined in a namespace.
+
+namespace library1 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+typedef Types<int, long> NumericTypes;
+TYPED_TEST_CASE(NumericTest, NumericTypes);
+
+TYPED_TEST(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+}  // namespace library1
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+using testing::internal::TypedTestCasePState;
+
+// Tests TypedTestCasePState.
+
+class TypedTestCasePStateTest : public Test {
+ protected:
+  virtual void SetUp() {
+    state_.AddTestName("foo.cc", 0, "FooTest", "A");
+    state_.AddTestName("foo.cc", 0, "FooTest", "B");
+    state_.AddTestName("foo.cc", 0, "FooTest", "C");
+  }
+
+  TypedTestCasePState state_;
+};
+
+TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
+  const char* tests = "A, B, C";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+// Makes sure that the order of the tests and spaces around the names
+// don't matter.
+TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
+  const char* tests = "A,C,   B";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
+      "foo\\.cc.1.?: Test A is listed more than once\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
+      "foo\\.cc.1.?: No test named D can be found in this test case\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
+      "foo\\.cc.1.?: You forgot to list test B\\.");
+}
+
+// Tests that defining a test for a parameterized test case generates
+// a run-time error if the test case has been registered.
+TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
+  state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.AddTestName("foo.cc", 2, "FooTest", "D"),
+      "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
+      "\\(FooTest, \\.\\.\\.\\)\\.");
+}
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in type-parameterized tests.
+
+template <typename T>
+class DerivedTest : public CommonTest<T> {
+};
+
+TYPED_TEST_CASE_P(DerivedTest);
+
+TYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+  EXPECT_EQ(2, this->value_);
+}
+
+REGISTER_TYPED_TEST_CASE_P(DerivedTest,
+                           ValuesAreCorrect, ValuesAreStillCorrect);
+
+typedef Types<short, long> MyTwoTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
+
+// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTestP1 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP1);
+
+// For testing that the code between TYPED_TEST_CASE_P() and
+// TYPED_TEST_P() is not enclosed in a namespace.
+typedef int IntAfterTypedTestCaseP;
+
+TYPED_TEST_P(TypedTestP1, A) {}
+TYPED_TEST_P(TypedTestP1, B) {}
+
+// For testing that the code between TYPED_TEST_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+typedef int IntBeforeRegisterTypedTestCaseP;
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
+
+template <typename T>
+class TypedTestP2 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP2);
+
+// This also verifies that tests from different type-parameterized
+// test cases can share the same name.
+TYPED_TEST_P(TypedTestP2, A) {}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
+
+// Verifies that the code between TYPED_TEST_CASE_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+IntAfterTypedTestCaseP after = 0;
+IntBeforeRegisterTypedTestCaseP before = 0;
+
+// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
+// can be either a single type or a Types<...> type list.
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated more than once in the same translation unit.
+INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+typedef Types<std::vector<double>, std::set<char> > MyContainers;
+INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
+
+// Tests that a type-parameterized test case can be defined and
+// instantiated in a namespace.
+
+namespace library2 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+TYPED_TEST_CASE_P(NumericTest);
+
+TYPED_TEST_P(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
+  EXPECT_LT(TypeParam(0), TypeParam(1));
+}
+
+REGISTER_TYPED_TEST_CASE_P(NumericTest,
+                           DefaultIsZero, ZeroIsLessThanOne);
+typedef Types<int, double> NumericTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
+
+}  // namespace library2
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
+
+// Google Test may not support type-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
diff --git a/vendor/gtest-1.7.0/test/gtest-typed-test_test.h b/vendor/gtest-1.7.0/test/gtest-typed-test_test.h
new file mode 100644
index 0000000..41d7570
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-typed-test_test.h
@@ -0,0 +1,66 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Test;
+
+// For testing that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// ContainerTest will be instantiated in both gtest-typed-test_test.cc
+// and gtest-typed-test2_test.cc.
+
+template <typename T>
+class ContainerTest : public Test {
+};
+
+TYPED_TEST_CASE_P(ContainerTest);
+
+TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {
+  TypeParam container;
+}
+
+TYPED_TEST_P(ContainerTest, InitialSizeIsZero) {
+  TypeParam container;
+  EXPECT_EQ(0U, container.size());
+}
+
+REGISTER_TYPED_TEST_CASE_P(ContainerTest,
+                           CanBeDefaultConstructed, InitialSizeIsZero);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
diff --git a/vendor/gtest-1.7.0/test/gtest-unittest-api_test.cc b/vendor/gtest-1.7.0/test/gtest-unittest-api_test.cc
new file mode 100644
index 0000000..07083e5
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest-unittest-api_test.cc
@@ -0,0 +1,341 @@
+// Copyright 2009 Google Inc.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file contains tests verifying correctness of data provided via
+// UnitTest's public methods.
+
+#include "gtest/gtest.h"
+
+#include <string.h>  // For strcmp.
+#include <algorithm>
+
+using ::testing::InitGoogleTest;
+
+namespace testing {
+namespace internal {
+
+template <typename T>
+struct LessByName {
+  bool operator()(const T* a, const T* b) {
+    return strcmp(a->name(), b->name()) < 0;
+  }
+};
+
+class UnitTestHelper {
+ public:
+  // Returns the array of pointers to all test cases sorted by the test case
+  // name.  The caller is responsible for deleting the array.
+  static TestCase const** const GetSortedTestCases() {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    TestCase const** const test_cases =
+        new const TestCase*[unit_test.total_test_case_count()];
+
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
+      test_cases[i] = unit_test.GetTestCase(i);
+
+    std::sort(test_cases,
+              test_cases + unit_test.total_test_case_count(),
+              LessByName<TestCase>());
+    return test_cases;
+  }
+
+  // Returns the test case by its name.  The caller doesn't own the returned
+  // pointer.
+  static const TestCase* FindTestCase(const char* name) {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+      const TestCase* test_case = unit_test.GetTestCase(i);
+      if (0 == strcmp(test_case->name(), name))
+        return test_case;
+    }
+    return NULL;
+  }
+
+  // Returns the array of pointers to all tests in a particular test case
+  // sorted by the test name.  The caller is responsible for deleting the
+  // array.
+  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
+    TestInfo const** const tests =
+        new const TestInfo*[test_case->total_test_count()];
+
+    for (int i = 0; i < test_case->total_test_count(); ++i)
+      tests[i] = test_case->GetTestInfo(i);
+
+    std::sort(tests, tests + test_case->total_test_count(),
+              LessByName<TestInfo>());
+    return tests;
+  }
+};
+
+#if GTEST_HAS_TYPED_TEST
+template <typename T> class TestCaseWithCommentTest : public Test {};
+TYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
+TYPED_TEST(TestCaseWithCommentTest, Dummy) {}
+
+const int kTypedTestCases = 1;
+const int kTypedTests = 1;
+#else
+const int kTypedTestCases = 0;
+const int kTypedTests = 0;
+#endif  // GTEST_HAS_TYPED_TEST
+
+// We can only test the accessors that do not change value while tests run.
+// Since tests can be run in any order, the values the accessors that track
+// test execution (such as failed_test_count) can not be predicted.
+TEST(ApiTest, UnitTestImmutableAccessorsWork) {
+  UnitTest* unit_test = UnitTest::GetInstance();
+
+  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
+  EXPECT_EQ(2, unit_test->disabled_test_count());
+  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
+  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
+
+  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+  EXPECT_STREQ("ApiTest", test_cases[0]->name());
+  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+#if GTEST_HAS_TYPED_TEST
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+#endif  // GTEST_HAS_TYPED_TEST
+
+  delete[] test_cases;
+
+  // The following lines initiate actions to verify certain methods in
+  // FinalSuccessChecker::TearDown.
+
+  // Records a test property to verify TestResult::GetTestProperty().
+  RecordProperty("key", "value");
+}
+
+AssertionResult IsNull(const char* str) {
+  if (str != NULL) {
+    return testing::AssertionFailure() << "argument is " << str;
+  }
+  return AssertionSuccess();
+}
+
+TEST(ApiTest, TestCaseImmutableAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("ApiTest", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(3, test_case->test_to_run_count());
+  ASSERT_EQ(4, test_case->total_test_count());
+
+  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_TRUE(IsNull(tests[0]->type_param()));
+  EXPECT_FALSE(tests[0]->should_run());
+
+  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[1]->value_param()));
+  EXPECT_TRUE(IsNull(tests[1]->type_param()));
+  EXPECT_TRUE(tests[1]->should_run());
+
+  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[2]->value_param()));
+  EXPECT_TRUE(IsNull(tests[2]->type_param()));
+  EXPECT_TRUE(tests[2]->should_run());
+
+  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[3]->value_param()));
+  EXPECT_TRUE(IsNull(tests[3]->type_param()));
+  EXPECT_TRUE(tests[3]->should_run());
+
+  delete[] tests;
+  tests = NULL;
+
+#if GTEST_HAS_TYPED_TEST
+  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
+  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(0, test_case->disabled_test_count());
+  EXPECT_EQ(1, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("Dummy", tests[0]->name());
+  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+  EXPECT_TRUE(tests[0]->should_run());
+
+  delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+}
+
+TEST(ApiTest, TestCaseDisabledAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("DISABLED_Test", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_FALSE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(0, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  const TestInfo* const test_info = test_case->GetTestInfo(0);
+  EXPECT_STREQ("Dummy2", test_info->name());
+  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
+  EXPECT_TRUE(IsNull(test_info->value_param()));
+  EXPECT_TRUE(IsNull(test_info->type_param()));
+  EXPECT_FALSE(test_info->should_run());
+}
+
+// These two tests are here to provide support for testing
+// test_case_to_run_count, disabled_test_count, and test_to_run_count.
+TEST(ApiTest, DISABLED_Dummy1) {}
+TEST(DISABLED_Test, Dummy2) {}
+
+class FinalSuccessChecker : public Environment {
+ protected:
+  virtual void TearDown() {
+    UnitTest* unit_test = UnitTest::GetInstance();
+
+    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
+    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
+    EXPECT_EQ(0, unit_test->failed_test_case_count());
+    EXPECT_EQ(0, unit_test->failed_test_count());
+    EXPECT_TRUE(unit_test->Passed());
+    EXPECT_FALSE(unit_test->Failed());
+    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+
+    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+    EXPECT_STREQ("ApiTest", test_cases[0]->name());
+    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
+    EXPECT_TRUE(test_cases[0]->should_run());
+    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
+    ASSERT_EQ(4, test_cases[0]->total_test_count());
+    EXPECT_EQ(3, test_cases[0]->successful_test_count());
+    EXPECT_EQ(0, test_cases[0]->failed_test_count());
+    EXPECT_TRUE(test_cases[0]->Passed());
+    EXPECT_FALSE(test_cases[0]->Failed());
+
+    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
+    EXPECT_FALSE(test_cases[1]->should_run());
+    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[1]->total_test_count());
+    EXPECT_EQ(0, test_cases[1]->successful_test_count());
+    EXPECT_EQ(0, test_cases[1]->failed_test_count());
+
+#if GTEST_HAS_TYPED_TEST
+    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
+    EXPECT_TRUE(test_cases[2]->should_run());
+    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[2]->total_test_count());
+    EXPECT_EQ(1, test_cases[2]->successful_test_count());
+    EXPECT_EQ(0, test_cases[2]->failed_test_count());
+    EXPECT_TRUE(test_cases[2]->Passed());
+    EXPECT_FALSE(test_cases[2]->Failed());
+#endif  // GTEST_HAS_TYPED_TEST
+
+    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+    EXPECT_FALSE(tests[0]->should_run());
+
+    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[1]->value_param()));
+    EXPECT_TRUE(IsNull(tests[1]->type_param()));
+    EXPECT_TRUE(tests[1]->should_run());
+    EXPECT_TRUE(tests[1]->result()->Passed());
+    EXPECT_EQ(0, tests[1]->result()->test_property_count());
+
+    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[2]->value_param()));
+    EXPECT_TRUE(IsNull(tests[2]->type_param()));
+    EXPECT_TRUE(tests[2]->should_run());
+    EXPECT_TRUE(tests[2]->result()->Passed());
+    EXPECT_EQ(0, tests[2]->result()->test_property_count());
+
+    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[3]->value_param()));
+    EXPECT_TRUE(IsNull(tests[3]->type_param()));
+    EXPECT_TRUE(tests[3]->should_run());
+    EXPECT_TRUE(tests[3]->result()->Passed());
+    EXPECT_EQ(1, tests[3]->result()->test_property_count());
+    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
+    EXPECT_STREQ("key", property.key());
+    EXPECT_STREQ("value", property.value());
+
+    delete[] tests;
+
+#if GTEST_HAS_TYPED_TEST
+    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+    tests = UnitTestHelper::GetSortedTests(test_case);
+
+    EXPECT_STREQ("Dummy", tests[0]->name());
+    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[0]->value_param()));
+    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+    EXPECT_TRUE(tests[0]->should_run());
+    EXPECT_TRUE(tests[0]->result()->Passed());
+    EXPECT_EQ(0, tests[0]->result()->test_property_count());
+
+    delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+    delete[] test_cases;
+  }
+};
+
+}  // namespace internal
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_all_test.cc b/vendor/gtest-1.7.0/test/gtest_all_test.cc
new file mode 100644
index 0000000..955aa62
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_all_test.cc
@@ -0,0 +1,47 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build most of Google Test's own tests
+// by compiling a single file.  This file serves this purpose.
+#include "test/gtest-filepath_test.cc"
+#include "test/gtest-linked_ptr_test.cc"
+#include "test/gtest-message_test.cc"
+#include "test/gtest-options_test.cc"
+#include "test/gtest-port_test.cc"
+#include "test/gtest_pred_impl_unittest.cc"
+#include "test/gtest_prod_test.cc"
+#include "test/gtest-test-part_test.cc"
+#include "test/gtest-typed-test_test.cc"
+#include "test/gtest-typed-test2_test.cc"
+#include "test/gtest_unittest.cc"
+#include "test/production.cc"
diff --git a/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest.py b/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
new file mode 100755
index 0000000..78f3e0f
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's break-on-failure mode.
+
+A user can ask Google Test to seg-fault when an assertion fails, using
+either the GTEST_BREAK_ON_FAILURE environment variable or the
+--gtest_break_on_failure flag.  This script tests such functionality
+by invoking gtest_break_on_failure_unittest_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+import os
+import sys
+
+
+# Constants.
+
+IS_WINDOWS = os.name == 'nt'
+
+# The environment variable for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
+
+# The command line flag for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
+
+# The environment variable for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
+
+# The environment variable for enabling/disabling the catch-exceptions mode.
+CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
+
+# Path to the gtest_break_on_failure_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_break_on_failure_unittest_')
+
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+
+def Run(command):
+  """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
+
+  p = gtest_test_utils.Subprocess(command, env=environ)
+  if p.terminated_by_signal:
+    return 1
+  else:
+    return 0
+
+
+# The tests.
+
+
+class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
+  """Tests using the GTEST_BREAK_ON_FAILURE environment variable or
+  the --gtest_break_on_failure flag to turn assertion failures into
+  segmentation faults.
+  """
+
+  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
+    """Runs gtest_break_on_failure_unittest_ and verifies that it does
+    (or does not) have a seg-fault.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      expect_seg_fault: 1 if the program is expected to generate a seg-fault;
+                        0 otherwise.
+    """
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
+    else:
+      flag = '--%s' % BREAK_ON_FAILURE_FLAG
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if expect_seg_fault:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    has_seg_fault = Run(command)
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
+           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(has_seg_fault == expect_seg_fault, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value=None,
+                      expect_seg_fault=0)
+
+  def testEnvVar(self):
+    """Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      expect_seg_fault=1)
+
+  def testFlag(self):
+    """Tests using the --gtest_break_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the flag overrides the environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      expect_seg_fault=1)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testBreakOnFailureOverridesThrowOnFailure(self):
+    """Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
+
+    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
+    try:
+      self.RunAndVerify(env_var_value=None,
+                        flag_value='1',
+                        expect_seg_fault=1)
+    finally:
+      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
+
+  if IS_WINDOWS:
+    def testCatchExceptionsDoesNotInterfere(self):
+      """Tests that gtest_catch_exceptions doesn't interfere."""
+
+      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
+      try:
+        self.RunAndVerify(env_var_value='1',
+                          flag_value='1',
+                          expect_seg_fault=1)
+      finally:
+        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc b/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
new file mode 100644
index 0000000..dd07478
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
@@ -0,0 +1,88 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test's break-on-failure mode.
+//
+// A user can ask Google Test to seg-fault when an assertion fails, using
+// either the GTEST_BREAK_ON_FAILURE environment variable or the
+// --gtest_break_on_failure flag.  This file is used for testing such
+// functionality.
+//
+// This program will be invoked from a Python unit test.  It is
+// expected to fail.  Don't run it directly.
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>
+# include <stdlib.h>
+#endif
+
+namespace {
+
+// A test that's expected to fail.
+TEST(Foo, Bar) {
+  EXPECT_EQ(2, 3);
+}
+
+#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+// On Windows Mobile global exception handlers are not supported.
+LONG WINAPI ExitWithExceptionCode(
+    struct _EXCEPTION_POINTERS* exception_pointers) {
+  exit(exception_pointers->ExceptionRecord->ExceptionCode);
+}
+#endif
+
+}  // namespace
+
+int main(int argc, char **argv) {
+#if GTEST_OS_WINDOWS
+  // Suppresses display of the Windows error dialog upon encountering
+  // a general protection fault (segment violation).
+  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
+
+# if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+
+  // The default unhandled exception filter does not always exit
+  // with the exception code as exit code - for example it exits with
+  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT
+  // if the application is compiled in debug mode. Thus we use our own
+  // filter which always exits with the exception code for unhandled
+  // exceptions.
+  SetUnhandledExceptionFilter(ExitWithExceptionCode);
+
+# endif
+#endif
+
+  testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test.py b/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test.py
new file mode 100755
index 0000000..e6fc22f
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Google Inc.  All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's exception catching behavior.
+
+This script invokes gtest_catch_exceptions_test_ and
+gtest_catch_exceptions_ex_test_ (programs written with
+Google Test) and verifies their output.
+"""
+
+__author__ = 'vladl at google.com (Vlad Losev)'
+
+import os
+
+import gtest_test_utils
+
+# Constants.
+FLAG_PREFIX = '--gtest_'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
+FILTER_FLAG = FLAG_PREFIX + 'filter'
+
+# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
+# exceptions enabled.
+EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_ex_test_')
+
+# Path to the gtest_catch_exceptions_test_ binary, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_no_ex_test_')
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+TEST_LIST = gtest_test_utils.Subprocess(
+    [EXE_PATH, LIST_TESTS_FLAG], env=environ).output
+
+SUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
+
+if SUPPORTS_SEH_EXCEPTIONS:
+  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output
+
+EX_BINARY_OUTPUT = gtest_test_utils.Subprocess(
+    [EX_EXE_PATH], env=environ).output
+
+
+# The tests.
+if SUPPORTS_SEH_EXCEPTIONS:
+  # pylint:disable-msg=C6302
+  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
+    """Tests exception-catching behavior."""
+
+
+    def TestSehExceptions(self, test_output):
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s constructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s destructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in the test body'
+                   in test_output)
+
+    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
+      self.TestSehExceptions(EX_BINARY_OUTPUT)
+
+    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
+      self.TestSehExceptions(BINARY_OUTPUT)
+
+
+class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
+  """Tests C++ exception-catching behavior.
+
+     Tests in this test case verify that:
+     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
+     * Exception thrown affect the remainder of the test work flow in the
+       expected manner.
+  """
+
+  def testCatchesCxxExceptionsInFixtureConstructor(self):
+    self.assert_('C++ exception with description '
+                 '"Standard C++ exception" thrown '
+                 'in the test fixture\'s constructor'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInConstructorTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
+      EX_BINARY_OUTPUT):
+
+    def testCatchesCxxExceptionsInFixtureDestructor(self):
+      self.assert_('C++ exception with description '
+                   '"Standard C++ exception" thrown '
+                   'in the test fixture\'s destructor'
+                   in EX_BINARY_OUTPUT)
+      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
+                   'called as expected.'
+                   in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUpTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUpTestCase()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTearDownTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDownTestCase()'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUp(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUp()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInSetUpTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  def testCatchesCxxExceptionsInTearDown(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDown()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTestBody(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesNonStdCxxExceptions(self):
+    self.assert_('Unknown C++ exception thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+
+  def testUnhandledCxxExceptionsAbortTheProgram(self):
+    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
+    # cause tests to show pop-up windows there.
+    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
+    # By default, Google Test doesn't catch the exceptions.
+    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
+        [EX_EXE_PATH,
+         NO_CATCH_EXCEPTIONS_FLAG,
+         FITLER_OUT_SEH_TESTS_FLAG],
+        env=environ).output
+
+    self.assert_('Unhandled C++ exception terminating the program'
+                 in uncaught_exceptions_ex_binary_output)
+    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc b/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
new file mode 100644
index 0000000..d0fc82c
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
@@ -0,0 +1,311 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. Tests in this file throw C++ or SEH
+// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>  // NOLINT
+#include <stdlib.h>  // For exit().
+
+#if GTEST_HAS_SEH
+# include <windows.h>
+#endif
+
+#if GTEST_HAS_EXCEPTIONS
+# include <exception>  // For set_terminate().
+# include <stdexcept>
+#endif
+
+using testing::Test;
+
+#if GTEST_HAS_SEH
+
+class SehExceptionInConstructorTest : public Test {
+ public:
+  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
+
+class SehExceptionInDestructorTest : public Test {
+ public:
+  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+
+class SehExceptionInSetUpTestCaseTest : public Test {
+ public:
+  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
+
+class SehExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class SehExceptionInSetUpTest : public Test {
+ protected:
+  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
+
+class SehExceptionInTearDownTest : public Test {
+ protected:
+  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+TEST(SehExceptionTest, ThrowsSehException) {
+  RaiseException(42, 0, 0, NULL);
+}
+
+#endif  // GTEST_HAS_SEH
+
+#if GTEST_HAS_EXCEPTIONS
+
+class CxxExceptionInConstructorTest : public Test {
+ public:
+  CxxExceptionInConstructorTest() {
+    // Without this macro VC++ complains about unreachable code at the end of
+    // the constructor.
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInConstructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInConstructorTest() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
+                  << "called unexpectedly.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
+                  << "called unexpectedly.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
+                  << "called unexpectedly.";
+  }
+};
+
+TEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
+  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
+                << "called unexpectedly.";
+}
+
+// Exceptions in destructors are not supported in C++11.
+#if !defined(__GXX_EXPERIMENTAL_CXX0X__) &&  __cplusplus < 201103L
+class CxxExceptionInDestructorTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInDestructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInDestructorTest() {
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+};
+
+TEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+#endif  // C++11 mode
+
+class CxxExceptionInSetUpTestCaseTest : public Test {
+ public:
+  CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest constructor "
+           "called as expected.\n");
+  }
+
+  static void SetUpTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::SetUp() "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
+  printf("%s",
+         "CxxExceptionInSetUpTestCaseTest test body "
+         "called as expected.\n");
+}
+
+class CxxExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class CxxExceptionInSetUpTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
+  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
+                << "called unexpectedly.";
+}
+
+class CxxExceptionInTearDownTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTearDownTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTearDownTest() {
+    printf("%s",
+           "CxxExceptionInTearDownTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+class CxxExceptionInTestBodyTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTestBodyTest() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
+  throw std::runtime_error("Standard C++ exception");
+}
+
+TEST(CxxExceptionTest, ThrowsNonStdCxxException) {
+  throw "C-string";
+}
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(3);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_color_test.py b/vendor/gtest-1.7.0/test/gtest_color_test.py
new file mode 100755
index 0000000..d02a53e
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_color_test.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly determines whether to use colors."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name = 'nt'
+
+COLOR_ENV_VAR = 'GTEST_COLOR'
+COLOR_FLAG = 'gtest_color'
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_')
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def UsesColor(term, color_env_var, color_flag):
+  """Runs gtest_color_test_ and returns its exit code."""
+
+  SetEnvVar('TERM', term)
+  SetEnvVar(COLOR_ENV_VAR, color_env_var)
+
+  if color_flag is None:
+    args = []
+  else:
+    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]
+  p = gtest_test_utils.Subprocess([COMMAND] + args)
+  return not p.exited or p.exit_code
+
+
+class GTestColorTest(gtest_test_utils.TestCase):
+  def testNoEnvVarNoFlag(self):
+    """Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
+
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', None, None))
+      self.assert_(not UsesColor('emacs', None, None))
+      self.assert_(not UsesColor('xterm-mono', None, None))
+      self.assert_(not UsesColor('unknown', None, None))
+      self.assert_(not UsesColor(None, None, None))
+    self.assert_(UsesColor('linux', None, None))
+    self.assert_(UsesColor('cygwin', None, None))
+    self.assert_(UsesColor('xterm', None, None))
+    self.assert_(UsesColor('xterm-color', None, None))
+    self.assert_(UsesColor('xterm-256color', None, None))
+
+  def testFlagOnly(self):
+    """Tests the case when there's --gtest_color but not GTEST_COLOR."""
+
+    self.assert_(not UsesColor('dumb', None, 'no'))
+    self.assert_(not UsesColor('xterm-color', None, 'no'))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('emacs', None, 'auto'))
+    self.assert_(UsesColor('xterm', None, 'auto'))
+    self.assert_(UsesColor('dumb', None, 'yes'))
+    self.assert_(UsesColor('xterm', None, 'yes'))
+
+  def testEnvVarOnly(self):
+    """Tests the case when there's GTEST_COLOR but not --gtest_color."""
+
+    self.assert_(not UsesColor('dumb', 'no', None))
+    self.assert_(not UsesColor('xterm-color', 'no', None))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', 'auto', None))
+    self.assert_(UsesColor('xterm-color', 'auto', None))
+    self.assert_(UsesColor('dumb', 'yes', None))
+    self.assert_(UsesColor('xterm-color', 'yes', None))
+
+  def testEnvVarAndFlag(self):
+    """Tests the case when there are both GTEST_COLOR and --gtest_color."""
+
+    self.assert_(not UsesColor('xterm-color', 'no', 'no'))
+    self.assert_(UsesColor('dumb', 'no', 'yes'))
+    self.assert_(UsesColor('xterm-color', 'no', 'auto'))
+
+  def testAliasesOfYesAndNo(self):
+    """Tests using aliases in specifying --gtest_color."""
+
+    self.assert_(UsesColor('dumb', None, 'true'))
+    self.assert_(UsesColor('dumb', None, 'YES'))
+    self.assert_(UsesColor('dumb', None, 'T'))
+    self.assert_(UsesColor('dumb', None, '1'))
+
+    self.assert_(not UsesColor('xterm', None, 'f'))
+    self.assert_(not UsesColor('xterm', None, 'false'))
+    self.assert_(not UsesColor('xterm', None, '0'))
+    self.assert_(not UsesColor('xterm', None, 'unknown'))
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_color_test_.cc b/vendor/gtest-1.7.0/test/gtest_color_test_.cc
new file mode 100644
index 0000000..f61ebb8
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_color_test_.cc
@@ -0,0 +1,71 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing how Google Test determines whether to use
+// colors in the output.  It prints "YES" and returns 1 if Google Test
+// decides to use colors, and prints "NO" and returns 0 otherwise.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using testing::internal::ShouldUseColor;
+
+// The purpose of this is to ensure that the UnitTest singleton is
+// created before main() is entered, and thus that ShouldUseColor()
+// works the same way as in a real Google-Test-based test.  We don't actual
+// run the TEST itself.
+TEST(GTestColorTest, Dummy) {
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (ShouldUseColor(true)) {
+    // Google Test decides to use colors in the output (assuming it
+    // goes to a TTY).
+    printf("YES\n");
+    return 1;
+  } else {
+    // Google Test decides not to use colors in the output.
+    printf("NO\n");
+    return 0;
+  }
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_env_var_test.py b/vendor/gtest-1.7.0/test/gtest_env_var_test.py
new file mode 100755
index 0000000..ac24337
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_env_var_test.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly parses environment variables."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name == 'nt'
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_')
+
+environ = os.environ.copy()
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def GetFlag(flag):
+  """Runs gtest_env_var_test_ and returns its output."""
+
+  args = [COMMAND]
+  if flag is not None:
+    args += [flag]
+  return gtest_test_utils.Subprocess(args, env=environ).output
+
+
+def TestFlag(flag, test_val, default_val):
+  """Verifies that the given flag is affected by the corresponding env var."""
+
+  env_var = 'GTEST_' + flag.upper()
+  SetEnvVar(env_var, test_val)
+  AssertEq(test_val, GetFlag(flag))
+  SetEnvVar(env_var, None)
+  AssertEq(default_val, GetFlag(flag))
+
+
+class GTestEnvVarTest(gtest_test_utils.TestCase):
+  def testEnvVarAffectsFlag(self):
+    """Tests that environment variable should affect the corresponding flag."""
+
+    TestFlag('break_on_failure', '1', '0')
+    TestFlag('color', 'yes', 'auto')
+    TestFlag('filter', 'FooTest.Bar', '*')
+    TestFlag('output', 'xml:tmp/foo.xml', '')
+    TestFlag('print_time', '0', '1')
+    TestFlag('repeat', '999', '1')
+    TestFlag('throw_on_failure', '1', '0')
+    TestFlag('death_test_style', 'threadsafe', 'fast')
+    TestFlag('catch_exceptions', '0', '1')
+
+    if IS_LINUX:
+      TestFlag('death_test_use_fork', '1', '0')
+      TestFlag('stack_trace_depth', '0', '100')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_env_var_test_.cc b/vendor/gtest-1.7.0/test/gtest_env_var_test_.cc
new file mode 100644
index 0000000..539afc9
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_env_var_test_.cc
@@ -0,0 +1,126 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing that Google Test parses the environment
+// variables correctly.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using ::std::cout;
+
+namespace testing {
+
+// The purpose of this is to make the test more realistic by ensuring
+// that the UnitTest singleton is created before main() is entered.
+// We don't actual run the TEST itself.
+TEST(GTestEnvVarTest, Dummy) {
+}
+
+void PrintFlag(const char* flag) {
+  if (strcmp(flag, "break_on_failure") == 0) {
+    cout << GTEST_FLAG(break_on_failure);
+    return;
+  }
+
+  if (strcmp(flag, "catch_exceptions") == 0) {
+    cout << GTEST_FLAG(catch_exceptions);
+    return;
+  }
+
+  if (strcmp(flag, "color") == 0) {
+    cout << GTEST_FLAG(color);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_style") == 0) {
+    cout << GTEST_FLAG(death_test_style);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_use_fork") == 0) {
+    cout << GTEST_FLAG(death_test_use_fork);
+    return;
+  }
+
+  if (strcmp(flag, "filter") == 0) {
+    cout << GTEST_FLAG(filter);
+    return;
+  }
+
+  if (strcmp(flag, "output") == 0) {
+    cout << GTEST_FLAG(output);
+    return;
+  }
+
+  if (strcmp(flag, "print_time") == 0) {
+    cout << GTEST_FLAG(print_time);
+    return;
+  }
+
+  if (strcmp(flag, "repeat") == 0) {
+    cout << GTEST_FLAG(repeat);
+    return;
+  }
+
+  if (strcmp(flag, "stack_trace_depth") == 0) {
+    cout << GTEST_FLAG(stack_trace_depth);
+    return;
+  }
+
+  if (strcmp(flag, "throw_on_failure") == 0) {
+    cout << GTEST_FLAG(throw_on_failure);
+    return;
+  }
+
+  cout << "Invalid flag name " << flag
+       << ".  Valid names are break_on_failure, color, filter, etc.\n";
+  exit(1);
+}
+
+}  // namespace testing
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (argc != 2) {
+    cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n";
+    return 1;
+  }
+
+  testing::PrintFlag(argv[1]);
+  return 0;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_environment_test.cc b/vendor/gtest-1.7.0/test/gtest_environment_test.cc
new file mode 100644
index 0000000..3cff19e
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_environment_test.cc
@@ -0,0 +1,192 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests using global test environments.
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "gtest/gtest.h"
+
+#define GTEST_IMPLEMENTATION_ 1  // Required for the next #include.
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+GTEST_DECLARE_string_(filter);
+}
+
+namespace {
+
+enum FailureType {
+  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE
+};
+
+// For testing using global test environments.
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() { Reset(); }
+
+  // Depending on the value of failure_in_set_up_, SetUp() will
+  // generate a non-fatal failure, generate a fatal failure, or
+  // succeed.
+  virtual void SetUp() {
+    set_up_was_run_ = true;
+
+    switch (failure_in_set_up_) {
+      case NON_FATAL_FAILURE:
+        ADD_FAILURE() << "Expected non-fatal failure in global set-up.";
+        break;
+      case FATAL_FAILURE:
+        FAIL() << "Expected fatal failure in global set-up.";
+        break;
+      default:
+        break;
+    }
+  }
+
+  // Generates a non-fatal failure.
+  virtual void TearDown() {
+    tear_down_was_run_ = true;
+    ADD_FAILURE() << "Expected non-fatal failure in global tear-down.";
+  }
+
+  // Resets the state of the environment s.t. it can be reused.
+  void Reset() {
+    failure_in_set_up_ = NO_FAILURE;
+    set_up_was_run_ = false;
+    tear_down_was_run_ = false;
+  }
+
+  // We call this function to set the type of failure SetUp() should
+  // generate.
+  void set_failure_in_set_up(FailureType type) {
+    failure_in_set_up_ = type;
+  }
+
+  // Was SetUp() run?
+  bool set_up_was_run() const { return set_up_was_run_; }
+
+  // Was TearDown() run?
+  bool tear_down_was_run() const { return tear_down_was_run_; }
+
+ private:
+  FailureType failure_in_set_up_;
+  bool set_up_was_run_;
+  bool tear_down_was_run_;
+};
+
+// Was the TEST run?
+bool test_was_run;
+
+// The sole purpose of this TEST is to enable us to check whether it
+// was run.
+TEST(FooTest, Bar) {
+  test_was_run = true;
+}
+
+// Prints the message and aborts the program if condition is false.
+void Check(bool condition, const char* msg) {
+  if (!condition) {
+    printf("FAILED: %s\n", msg);
+    testing::internal::posix::Abort();
+  }
+}
+
+// Runs the tests.  Return true iff successful.
+//
+// The 'failure' parameter specifies the type of failure that should
+// be generated by the global set-up.
+int RunAllTests(MyEnvironment* env, FailureType failure) {
+  env->Reset();
+  env->set_failure_in_set_up(failure);
+  test_was_run = false;
+  testing::internal::GetUnitTestImpl()->ClearAdHocTestResult();
+  return RUN_ALL_TESTS();
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // Registers a global test environment, and verifies that the
+  // registration function returns its argument.
+  MyEnvironment* const env = new MyEnvironment;
+  Check(testing::AddGlobalTestEnvironment(env) == env,
+        "AddGlobalTestEnvironment() should return its argument.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up is successful.
+  Check(RunAllTests(env, NO_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global tear-down "
+        "should generate a failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "failure");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up generates no fatal failure.
+  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as both the global set-up "
+        "and the global tear-down should generate a non-fatal failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up
+  // generates a fatal failure.
+  Check(RunAllTests(env, FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global set-up "
+        "should generate a fatal failure.");
+  Check(!test_was_run,
+        "The tests should not run, as the global set-up should generate "
+        "a fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or
+  // tear-down when there is no test to run.
+  testing::GTEST_FLAG(filter) = "-*";
+  Check(RunAllTests(env, NO_FAILURE) == 0,
+        "RUN_ALL_TESTS() should return zero, as there is no test to run.");
+  Check(!env->set_up_was_run(),
+        "The global set-up should not run, as there is no test to run.");
+  Check(!env->tear_down_was_run(),
+        "The global tear-down should not run, "
+        "as the global set-up was not run.");
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_filter_unittest.py b/vendor/gtest-1.7.0/test/gtest_filter_unittest.py
new file mode 100755
index 0000000..0d1a770
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_filter_unittest.py
@@ -0,0 +1,633 @@
+#!/usr/bin/env python
+#
+# Copyright 2005 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test test filters.
+
+A user can specify which test(s) in a Google Test program to run via either
+the GTEST_FILTER environment variable or the --gtest_filter flag.
+This script tests such functionality by invoking
+gtest_filter_unittest_ (a program written with Google Test) with different
+environments and command line flags.
+
+Note that test sharding may also influence which tests are filtered. Therefore,
+we test that here also.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sets
+import sys
+
+import gtest_test_utils
+
+# Constants.
+
+# Checks if this platform can pass empty environment variables to child
+# processes.  We set an env variable to an empty string and invoke a python
+# script in a subprocess to print whether the variable is STILL in
+# os.environ.  We then use 'eval' to parse the child's output so that an
+# exception is thrown if the input is anything other than 'True' nor 'False'.
+os.environ['EMPTY_VAR'] = ''
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
+CAN_PASS_EMPTY_ENV = eval(child.output)
+
+
+# Check if this platform can unset environment variables in child processes.
+# We set an env variable to a non-empty string, unset it, and invoke
+# a python script in a subprocess to print whether the variable
+# is NO LONGER in os.environ.
+# We use 'eval' to parse the child's output so that an exception
+# is thrown if the input is neither 'True' nor 'False'.
+os.environ['UNSET_VAR'] = 'X'
+del os.environ['UNSET_VAR']
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
+CAN_UNSET_ENV = eval(child.output)
+
+
+# Checks if we should test with an empty filter. This doesn't
+# make sense on platforms that cannot pass empty env variables (Win32)
+# and on platforms that cannot unset variables (since we cannot tell
+# the difference between "" and NULL -- Borland and Solaris < 5.10)
+CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
+
+
+# The environment variable for specifying the test filters.
+FILTER_ENV_VAR = 'GTEST_FILTER'
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
+
+# The command line flag for specifying the test filters.
+FILTER_FLAG = 'gtest_filter'
+
+# The command line flag for including disabled tests.
+ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
+
+# Command to run the gtest_filter_unittest_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
+
+# Regex for determining whether parameterized tests are enabled in the binary.
+PARAM_TEST_REGEX = re.compile(r'/ParamTest')
+
+# Regex for parsing test case names from Google Test's output.
+TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
+
+# Regex for parsing test names from Google Test's output.
+TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
+
+# The command line flag to tell Google Test to output the list of tests it
+# will run.
+LIST_TESTS_FLAG = '--gtest_list_tests'
+
+# Indicates whether Google Test supports death tests.
+SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
+    [COMMAND, LIST_TESTS_FLAG]).output
+
+# Full names of all tests in gtest_filter_unittests_.
+PARAM_TESTS = [
+    'SeqP/ParamTest.TestX/0',
+    'SeqP/ParamTest.TestX/1',
+    'SeqP/ParamTest.TestY/0',
+    'SeqP/ParamTest.TestY/1',
+    'SeqQ/ParamTest.TestX/0',
+    'SeqQ/ParamTest.TestX/1',
+    'SeqQ/ParamTest.TestY/0',
+    'SeqQ/ParamTest.TestY/1',
+    ]
+
+DISABLED_TESTS = [
+    'BarTest.DISABLED_TestFour',
+    'BarTest.DISABLED_TestFive',
+    'BazTest.DISABLED_TestC',
+    'DISABLED_FoobarTest.Test1',
+    'DISABLED_FoobarTest.DISABLED_Test2',
+    'DISABLED_FoobarbazTest.TestA',
+    ]
+
+if SUPPORTS_DEATH_TESTS:
+  DEATH_TESTS = [
+    'HasDeathTest.Test1',
+    'HasDeathTest.Test2',
+    ]
+else:
+  DEATH_TESTS = []
+
+# All the non-disabled tests.
+ACTIVE_TESTS = [
+    'FooTest.Abc',
+    'FooTest.Xyz',
+
+    'BarTest.TestOne',
+    'BarTest.TestTwo',
+    'BarTest.TestThree',
+
+    'BazTest.TestOne',
+    'BazTest.TestA',
+    'BazTest.TestB',
+    ] + DEATH_TESTS + PARAM_TESTS
+
+param_tests_present = None
+
+# Utilities.
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def RunAndReturnOutput(args = None):
+  """Runs the test program and returns its output."""
+
+  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
+                                     env=environ).output
+
+
+def RunAndExtractTestList(args = None):
+  """Runs the test program and returns its exit code and a list of tests run."""
+
+  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
+  tests_run = []
+  test_case = ''
+  test = ''
+  for line in p.output.split('\n'):
+    match = TEST_CASE_REGEX.match(line)
+    if match is not None:
+      test_case = match.group(1)
+    else:
+      match = TEST_REGEX.match(line)
+      if match is not None:
+        test = match.group(1)
+        tests_run.append(test_case + '.' + test)
+  return (tests_run, p.exit_code)
+
+
+def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
+  """Runs the given function and arguments in a modified environment."""
+  try:
+    original_env = environ.copy()
+    environ.update(extra_env)
+    return function(*args, **kwargs)
+  finally:
+    environ.clear()
+    environ.update(original_env)
+
+
+def RunWithSharding(total_shards, shard_index, command):
+  """Runs a test program shard and returns exit code and a list of tests run."""
+
+  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
+               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
+  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
+
+# The unit test.
+
+
+class GTestFilterUnitTest(gtest_test_utils.TestCase):
+  """Tests the env variable or the command line flag to filter tests."""
+
+  # Utilities.
+
+  def AssertSetEqual(self, lhs, rhs):
+    """Asserts that two sets are equal."""
+
+    for elem in lhs:
+      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
+
+    for elem in rhs:
+      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
+
+  def AssertPartitionIsValid(self, set_var, list_of_sets):
+    """Asserts that list_of_sets is a valid partition of set_var."""
+
+    full_partition = []
+    for slice_var in list_of_sets:
+      full_partition.extend(slice_var)
+    self.assertEqual(len(set_var), len(full_partition))
+    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
+
+  def AdjustForParameterizedTests(self, tests_to_run):
+    """Adjust tests_to_run in case value parameterized tests are disabled."""
+
+    global param_tests_present
+    if not param_tests_present:
+      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
+    else:
+      return tests_to_run
+
+  def RunAndVerify(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for a given filter."""
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # First, tests using the environment variable.
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      tests_run = RunAndExtractTestList()[0]
+      SetEnvVar(FILTER_ENV_VAR, None)
+      self.AssertSetEqual(tests_run, tests_to_run)
+    # pylint: enable-msg=C6403
+
+    # Next, tests using the command line flag.
+
+    if gtest_filter is None:
+      args = []
+    else:
+      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
+                               args=None, check_exit_0=False):
+    """Checks that binary runs correct tests for the given filter and shard.
+
+    Runs all shards of gtest_filter_unittest_ with the given filter, and
+    verifies that the right set of tests were run. The union of tests run
+    on each shard should be identical to tests_to_run, without duplicates.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      total_shards: A total number of shards to split test run into.
+      tests_to_run: A set of tests expected to run.
+      args   :      Arguments to pass to the to the test binary.
+      check_exit_0: When set to a true value, make sure that all shards
+                    return 0.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      partition = []
+      for i in range(0, total_shards):
+        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
+        if check_exit_0:
+          self.assertEqual(0, exit_code)
+        partition.append(tests_run)
+
+      self.AssertPartitionIsValid(tests_to_run, partition)
+      SetEnvVar(FILTER_ENV_VAR, None)
+    # pylint: enable-msg=C6403
+
+  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for the given filter.
+
+    Runs gtest_filter_unittest_ with the given filter, and enables
+    disabled tests. Verifies that the right set of tests were run.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      tests_to_run: A set of tests expected to run.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Construct the command line.
+    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
+    if gtest_filter is not None:
+      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def setUp(self):
+    """Sets up test case.
+
+    Determines whether value-parameterized tests are enabled in the binary and
+    sets the flags accordingly.
+    """
+
+    global param_tests_present
+    if param_tests_present is None:
+      param_tests_present = PARAM_TEST_REGEX.search(
+          RunAndReturnOutput()) is not None
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of not specifying the filter."""
+
+    self.RunAndVerify(None, ACTIVE_TESTS)
+
+  def testDefaultBehaviorWithShards(self):
+    """Tests the behavior without the filter, with sharding enabled."""
+
+    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
+
+  def testEmptyFilter(self):
+    """Tests an empty filter."""
+
+    self.RunAndVerify('', [])
+    self.RunAndVerifyWithSharding('', 1, [])
+    self.RunAndVerifyWithSharding('', 2, [])
+
+  def testBadFilter(self):
+    """Tests a filter that matches nothing."""
+
+    self.RunAndVerify('BadFilter', [])
+    self.RunAndVerifyAllowingDisabled('BadFilter', [])
+
+  def testFullName(self):
+    """Tests filtering by full name."""
+
+    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
+
+  def testUniversalFilters(self):
+    """Tests filters that match everything."""
+
+    self.RunAndVerify('*', ACTIVE_TESTS)
+    self.RunAndVerify('*.*', ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
+    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
+    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
+
+  def testFilterByTestCase(self):
+    """Tests filtering by test case name."""
+
+    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
+
+    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
+    self.RunAndVerify('BazTest.*', BAZ_TESTS)
+    self.RunAndVerifyAllowingDisabled('BazTest.*',
+                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
+
+  def testFilterByTest(self):
+    """Tests filtering by test name."""
+
+    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testFilterDisabledTests(self):
+    """Select only the disabled tests to run."""
+
+    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
+                                      ['DISABLED_FoobarTest.Test1'])
+
+    self.RunAndVerify('*DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
+
+    self.RunAndVerify('*.DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
+        'BarTest.DISABLED_TestFour',
+        'BarTest.DISABLED_TestFive',
+        'BazTest.DISABLED_TestC',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        ])
+
+    self.RunAndVerify('DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
+        'DISABLED_FoobarTest.Test1',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        'DISABLED_FoobarbazTest.TestA',
+        ])
+
+  def testWildcardInTestCaseName(self):
+    """Tests using wildcard in the test case name."""
+
+    self.RunAndVerify('*a*.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
+
+  def testWildcardInTestName(self):
+    """Tests using wildcard in the test name."""
+
+    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testFilterWithoutDot(self):
+    """Tests a filter that has no '.' in it."""
+
+    self.RunAndVerify('*z*', [
+        'FooTest.Xyz',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ])
+
+  def testTwoPatterns(self):
+    """Tests filters that consist of two patterns."""
+
+    self.RunAndVerify('Foo*.*:*A*', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BazTest.TestA',
+        ])
+
+    # An empty pattern + a non-empty one
+    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testThreePatterns(self):
+    """Tests filters that consist of three patterns."""
+
+    self.RunAndVerify('*oo*:*A*:*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        ])
+
+    # The 2nd pattern is empty.
+    self.RunAndVerify('*oo*::*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        ])
+
+    # The last 2 patterns are empty.
+    self.RunAndVerify('*oo*::', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+        ])
+
+  def testNegativeFilters(self):
+    self.RunAndVerify('*-BazTest.TestOne', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ])
+
+    # Tests without leading '*'.
+    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    # Value parameterized tests.
+    self.RunAndVerify('*/*', PARAM_TESTS)
+
+    # Value parameterized tests filtering by the sequence name.
+    self.RunAndVerify('SeqP/*', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestX/1',
+        'SeqP/ParamTest.TestY/0',
+        'SeqP/ParamTest.TestY/1',
+        ])
+
+    # Value parameterized tests filtering by the test name.
+    self.RunAndVerify('*/0', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestY/0',
+        'SeqQ/ParamTest.TestX/0',
+        'SeqQ/ParamTest.TestY/0',
+        ])
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the filter flag overrides the filtering env. variable."""
+
+    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
+    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
+    tests_run = RunAndExtractTestList(args)[0]
+    SetEnvVar(FILTER_ENV_VAR, None)
+
+    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testShardStatusFileIsCreated(self):
+    """Tests that the shard file is created if specified in the environment."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
+    finally:
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  def testShardStatusFileIsCreatedWithListTests(self):
+    """Tests that the shard file is created with the "list_tests" flag."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file2')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      output = InvokeWithModifiedEnv(extra_env,
+                                     RunAndReturnOutput,
+                                     [LIST_TESTS_FLAG])
+    finally:
+      # This assertion ensures that Google Test enumerated the tests as
+      # opposed to running them.
+      self.assert_('[==========]' not in output,
+                   'Unexpected output during test enumeration.\n'
+                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
+                   'correct flag value for listing Google Test tests.')
+
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  if SUPPORTS_DEATH_TESTS:
+    def testShardingWorksWithDeathTests(self):
+      """Tests integration with death tests and sharding."""
+
+      gtest_filter = 'HasDeathTest.*:SeqP/*'
+      expected_tests = [
+          'HasDeathTest.Test1',
+          'HasDeathTest.Test2',
+
+          'SeqP/ParamTest.TestX/0',
+          'SeqP/ParamTest.TestX/1',
+          'SeqP/ParamTest.TestY/0',
+          'SeqP/ParamTest.TestY/1',
+          ]
+
+      for flag in ['--gtest_death_test_style=threadsafe',
+                   '--gtest_death_test_style=fast']:
+        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
+                                      check_exit_0=True, args=[flag])
+        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
+                                      check_exit_0=True, args=[flag])
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_filter_unittest_.cc b/vendor/gtest-1.7.0/test/gtest_filter_unittest_.cc
new file mode 100644
index 0000000..77deffc
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_filter_unittest_.cc
@@ -0,0 +1,140 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test test filters.
+//
+// A user can specify which test(s) in a Google Test program to run via
+// either the GTEST_FILTER environment variable or the --gtest_filter
+// flag.  This is used for testing such functionality.
+//
+// The program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+// Test case FooTest.
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Abc) {
+}
+
+TEST_F(FooTest, Xyz) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BarTest.
+
+TEST(BarTest, TestOne) {
+}
+
+TEST(BarTest, TestTwo) {
+}
+
+TEST(BarTest, TestThree) {
+}
+
+TEST(BarTest, DISABLED_TestFour) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BarTest, DISABLED_TestFive) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BazTest.
+
+TEST(BazTest, TestOne) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BazTest, TestA) {
+}
+
+TEST(BazTest, TestB) {
+}
+
+TEST(BazTest, DISABLED_TestC) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case HasDeathTest
+
+TEST(HasDeathTest, Test1) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// We need at least two death tests to make sure that the all death tests
+// aren't on the first shard.
+TEST(HasDeathTest, Test2) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// Test case FoobarTest
+
+TEST(DISABLED_FoobarTest, Test1) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(DISABLED_FoobarTest, DISABLED_Test2) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case FoobarbazTest
+
+TEST(DISABLED_FoobarbazTest, TestA) {
+  FAIL() << "Expected failure.";
+}
+
+#if GTEST_HAS_PARAM_TEST
+class ParamTest : public testing::TestWithParam<int> {
+};
+
+TEST_P(ParamTest, TestX) {
+}
+
+TEST_P(ParamTest, TestY) {
+}
+
+INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));
+INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_help_test.py b/vendor/gtest-1.7.0/test/gtest_help_test.py
new file mode 100755
index 0000000..093c838
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_help_test.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the --help flag of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_help_test.py --build_dir=BUILD/DIR
+         # where BUILD/DIR contains the built gtest_help_test_ file.
+       gtest_help_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import gtest_test_utils
+
+
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+IS_WINDOWS = os.name == 'nt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
+FLAG_PREFIX = '--gtest_'
+DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
+STREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
+UNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+INCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
+                           re.sub('^--', '/', LIST_TESTS_FLAG),
+                           re.sub('_', '-', LIST_TESTS_FLAG)]
+INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
+
+SUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
+    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
+
+# The help message must match this regex.
+HELP_REGEX = re.compile(
+    FLAG_PREFIX + r'list_tests.*' +
+    FLAG_PREFIX + r'filter=.*' +
+    FLAG_PREFIX + r'also_run_disabled_tests.*' +
+    FLAG_PREFIX + r'repeat=.*' +
+    FLAG_PREFIX + r'shuffle.*' +
+    FLAG_PREFIX + r'random_seed=.*' +
+    FLAG_PREFIX + r'color=.*' +
+    FLAG_PREFIX + r'print_time.*' +
+    FLAG_PREFIX + r'output=.*' +
+    FLAG_PREFIX + r'break_on_failure.*' +
+    FLAG_PREFIX + r'throw_on_failure.*' +
+    FLAG_PREFIX + r'catch_exceptions=0.*',
+    re.DOTALL)
+
+
+def RunWithFlag(flag):
+  """Runs gtest_help_test_ with the given flag.
+
+  Returns:
+    the exit code and the text output as a tuple.
+  Args:
+    flag: the command-line flag to pass to gtest_help_test_, or None.
+  """
+
+  if flag is None:
+    command = [PROGRAM_PATH]
+  else:
+    command = [PROGRAM_PATH, flag]
+  child = gtest_test_utils.Subprocess(command)
+  return child.exit_code, child.output
+
+
+class GTestHelpTest(gtest_test_utils.TestCase):
+  """Tests the --help flag and its equivalent forms."""
+
+  def TestHelpFlag(self, flag):
+    """Verifies correct behavior when help flag is specified.
+
+    The right message must be printed and the tests must
+    skipped when the given flag is specified.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assertEquals(0, exit_code)
+    self.assert_(HELP_REGEX.search(output), output)
+
+    if IS_LINUX:
+      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
+    else:
+      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
+
+    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
+      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
+    else:
+      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
+
+  def TestNonHelpFlag(self, flag):
+    """Verifies correct behavior when no help flag is specified.
+
+    Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assert_(exit_code != 0)
+    self.assert_(not HELP_REGEX.search(output), output)
+
+  def testPrintsHelpWithFullFlag(self):
+    self.TestHelpFlag('--help')
+
+  def testPrintsHelpWithShortFlag(self):
+    self.TestHelpFlag('-h')
+
+  def testPrintsHelpWithQuestionFlag(self):
+    self.TestHelpFlag('-?')
+
+  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
+    self.TestHelpFlag('/?')
+
+  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
+    self.TestHelpFlag(UNKNOWN_FLAG)
+
+  def testPrintsHelpWithIncorrectFlagStyle(self):
+    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
+      self.TestHelpFlag(incorrect_flag)
+
+  def testRunsTestsWithoutHelpFlag(self):
+    """Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed."""
+
+    self.TestNonHelpFlag(None)
+
+  def testRunsTestsWithGtestInternalFlag(self):
+    """Verifies that the tests are run and no help message is printed when
+    a flag starting with Google Test prefix and 'internal_' is supplied."""
+
+    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_help_test_.cc b/vendor/gtest-1.7.0/test/gtest_help_test_.cc
new file mode 100644
index 0000000..31f78c2
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_help_test_.cc
@@ -0,0 +1,46 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This program is meant to be run by gtest_help_test.py.  Do not run
+// it directly.
+
+#include "gtest/gtest.h"
+
+// When a help flag is specified, this program should skip the tests
+// and exit with 0; otherwise the following test will be executed,
+// causing this program to exit with a non-zero code.
+TEST(HelpFlagTest, ShouldNotBeRun) {
+  ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified.";
+}
+
+#if GTEST_HAS_DEATH_TEST
+TEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}
+#endif
diff --git a/vendor/gtest-1.7.0/test/gtest_list_tests_unittest.py b/vendor/gtest-1.7.0/test/gtest_list_tests_unittest.py
new file mode 100755
index 0000000..925b09d
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_list_tests_unittest.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's --gtest_list_tests flag.
+
+A user can ask Google Test to list all tests by specifying the
+--gtest_list_tests flag.  This script tests such functionality
+by invoking gtest_list_tests_unittest_ (a program written with
+Google Test) the command line flags.
+"""
+
+__author__ = 'phanna at google.com (Patrick Hanna)'
+
+import gtest_test_utils
+import re
+
+
+# Constants.
+
+# The command line flag for enabling/disabling listing all tests.
+LIST_TESTS_FLAG = 'gtest_list_tests'
+
+# Path to the gtest_list_tests_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests
+EXPECTED_OUTPUT_NO_FILTER_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+Abc\.
+  Xyz
+  Def
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+TypedTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+TypedTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+TypedTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+My/TypeParamTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+My/TypeParamTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+My/TypeParamTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+MyInstantiation/ValueParamTest\.
+  TestA/0  # GetParam\(\) = one line
+  TestA/1  # GetParam\(\) = two\\nlines
+  TestA/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+  TestB/0  # GetParam\(\) = one line
+  TestB/1  # GetParam\(\) = two\\nlines
+  TestB/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+""")
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests and --gtest_filter=Foo*.
+EXPECTED_OUTPUT_FILTER_FOO_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+""")
+
+# Utilities.
+
+
+def Run(args):
+  """Runs gtest_list_tests_unittest_ and returns the list of tests printed."""
+
+  return gtest_test_utils.Subprocess([EXE_PATH] + args,
+                                     capture_stderr=False).output
+
+
+# The unit test.
+
+class GTestListTestsUnitTest(gtest_test_utils.TestCase):
+  """Tests using the --gtest_list_tests flag to list all tests."""
+
+  def RunAndVerify(self, flag_value, expected_output_re, other_flag):
+    """Runs gtest_list_tests_unittest_ and verifies that it prints
+    the correct tests.
+
+    Args:
+      flag_value:         value of the --gtest_list_tests flag;
+                          None if the flag should not be present.
+      expected_output_re: regular expression that matches the expected
+                          output after running command;
+      other_flag:         a different flag to be passed to command
+                          along with gtest_list_tests;
+                          None if the flag should not be present.
+    """
+
+    if flag_value is None:
+      flag = ''
+      flag_expression = 'not set'
+    elif flag_value == '0':
+      flag = '--%s=0' % LIST_TESTS_FLAG
+      flag_expression = '0'
+    else:
+      flag = '--%s' % LIST_TESTS_FLAG
+      flag_expression = '1'
+
+    args = [flag]
+
+    if other_flag is not None:
+      args += [other_flag]
+
+    output = Run(args)
+
+    if expected_output_re:
+      self.assert_(
+          expected_output_re.match(output),
+          ('when %s is %s, the output of "%s" is "%s",\n'
+           'which does not match regex "%s"' %
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output,
+            expected_output_re.pattern)))
+    else:
+      self.assert_(
+          not EXPECTED_OUTPUT_NO_FILTER_RE.match(output),
+          ('when %s is %s, the output of "%s" is "%s"'%
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)))
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(flag_value=None,
+                      expected_output_re=None,
+                      other_flag=None)
+
+  def testFlag(self):
+    """Tests using the --gtest_list_tests flag."""
+
+    self.RunAndVerify(flag_value='0',
+                      expected_output_re=None,
+                      other_flag=None)
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag=None)
+
+  def testOverrideNonFilterFlags(self):
+    """Tests that --gtest_list_tests overrides the non-filter flags."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag='--gtest_break_on_failure')
+
+  def testWithFilterFlags(self):
+    """Tests that --gtest_list_tests takes into account the
+    --gtest_filter flag."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_FILTER_FOO_RE,
+                      other_flag='--gtest_filter=Foo*')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_list_tests_unittest_.cc b/vendor/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
new file mode 100644
index 0000000..907c176
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
@@ -0,0 +1,157 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: phanna at google.com (Patrick Hanna)
+
+// Unit test for Google Test's --gtest_list_tests flag.
+//
+// A user can ask Google Test to list all tests that will run
+// so that when using a filter, a user will know what
+// tests to look for. The tests will not be run after listing.
+//
+// This program will be invoked from a Python unit test.
+// Don't run it directly.
+
+#include "gtest/gtest.h"
+
+// Several different test cases and tests that will be listed.
+TEST(Foo, Bar1) {
+}
+
+TEST(Foo, Bar2) {
+}
+
+TEST(Foo, DISABLED_Bar3) {
+}
+
+TEST(Abc, Xyz) {
+}
+
+TEST(Abc, Def) {
+}
+
+TEST(FooBar, Baz) {
+}
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Test1) {
+}
+
+TEST_F(FooTest, DISABLED_Test2) {
+}
+
+TEST_F(FooTest, Test3) {
+}
+
+TEST(FooDeathTest, Test1) {
+}
+
+// A group of value-parameterized tests.
+
+class MyType {
+ public:
+  explicit MyType(const std::string& a_value) : value_(a_value) {}
+
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+// Teaches Google Test how to print a MyType.
+void PrintTo(const MyType& x, std::ostream* os) {
+  *os << x.value();
+}
+
+class ValueParamTest : public testing::TestWithParam<MyType> {
+};
+
+TEST_P(ValueParamTest, TestA) {
+}
+
+TEST_P(ValueParamTest, TestB) {
+}
+
+INSTANTIATE_TEST_CASE_P(
+    MyInstantiation, ValueParamTest,
+    testing::Values(MyType("one line"),
+                    MyType("two\nlines"),
+                    MyType("a very\nloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line")));  // NOLINT
+
+// A group of typed tests.
+
+// A deliberately long type name for testing the line-truncating
+// behavior when printing a type parameter.
+class VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName {  // NOLINT
+};
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+template <typename T, int kSize>
+class MyArray {
+};
+
+typedef testing::Types<VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName,  // NOLINT
+                       int*, MyArray<bool, 42> > MyTypes;
+
+TYPED_TEST_CASE(TypedTest, MyTypes);
+
+TYPED_TEST(TypedTest, TestA) {
+}
+
+TYPED_TEST(TypedTest, TestB) {
+}
+
+// A group of type-parameterized tests.
+
+template <typename T>
+class TypeParamTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypeParamTest);
+
+TYPED_TEST_P(TypeParamTest, TestA) {
+}
+
+TYPED_TEST_P(TypeParamTest, TestB) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypeParamTest, TestA, TestB);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypeParamTest, MyTypes);
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_main_unittest.cc b/vendor/gtest-1.7.0/test/gtest_main_unittest.cc
new file mode 100644
index 0000000..ecd9bb8
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_main_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+// Tests that we don't have to define main() when we link to
+// gtest_main instead of gtest.
+
+namespace {
+
+TEST(GTestMainTest, ShouldSucceed) {
+}
+
+}  // namespace
+
+// We are using the main() function defined in src/gtest_main.cc, so
+// we don't define it here.
diff --git a/vendor/gtest-1.7.0/test/gtest_no_test_unittest.cc b/vendor/gtest-1.7.0/test/gtest_no_test_unittest.cc
new file mode 100644
index 0000000..292599a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_no_test_unittest.cc
@@ -0,0 +1,56 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Tests that a Google Test program that has no test defined can run
+// successfully.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // An ad-hoc assertion outside of all tests.
+  //
+  // This serves three purposes:
+  //
+  // 1. It verifies that an ad-hoc assertion can be executed even if
+  //    no test is defined.
+  // 2. It verifies that a failed ad-hoc assertion causes the test
+  //    program to fail.
+  // 3. We had a bug where the XML output won't be generated if an
+  //    assertion is executed before RUN_ALL_TESTS() is called, even
+  //    though --gtest_output=xml is specified.  This makes sure the
+  //    bug is fixed and doesn't regress.
+  EXPECT_EQ(1, 2);
+
+  // The above EXPECT_EQ() should cause RUN_ALL_TESTS() to return non-zero.
+  return RUN_ALL_TESTS() ? 0 : 1;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_output_test.py b/vendor/gtest-1.7.0/test/gtest_output_test.py
new file mode 100755
index 0000000..f409e2a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_output_test.py
@@ -0,0 +1,335 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the text output of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_output_test.py --build_dir=BUILD/DIR --gengolden
+         # where BUILD/DIR contains the built gtest_output_test_ file.
+       gtest_output_test.py --gengolden
+       gtest_output_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+import gtest_test_utils
+
+
+# The flag for generating the golden file
+GENGOLDEN_FLAG = '--gengolden'
+CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'
+
+IS_WINDOWS = os.name == 'nt'
+
+# TODO(vladl at google.com): remove the _lin suffix.
+GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_')
+
+# At least one command we exercise must not have the
+# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
+COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])
+COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])
+COMMAND_WITH_TIME = ({}, [PROGRAM_PATH,
+                          '--gtest_print_time',
+                          '--gtest_internal_skip_environment_and_ad_hoc_tests',
+                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])
+COMMAND_WITH_DISABLED = (
+    {}, [PROGRAM_PATH,
+         '--gtest_also_run_disabled_tests',
+         '--gtest_internal_skip_environment_and_ad_hoc_tests',
+         '--gtest_filter=*DISABLED_*'])
+COMMAND_WITH_SHARDING = (
+    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},
+    [PROGRAM_PATH,
+     '--gtest_internal_skip_environment_and_ad_hoc_tests',
+     '--gtest_filter=PassingTest.*'])
+
+GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)
+
+
+def ToUnixLineEnding(s):
+  """Changes all Windows/Mac line endings in s to UNIX line endings."""
+
+  return s.replace('\r\n', '\n').replace('\r', '\n')
+
+
+def RemoveLocations(test_output):
+  """Removes all file location info from a Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with all file location info (in the form of
+       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
+       'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
+       'FILE_NAME:#: '.
+  """
+
+  return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output)
+
+
+def RemoveStackTraceDetails(output):
+  """Removes all stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n',
+                'Stack trace: (omitted)\n\n', output)
+
+
+def RemoveStackTraces(output):
+  """Removes all traces of stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output)
+
+
+def RemoveTime(output):
+  """Removes all time information from a Google Test program's output."""
+
+  return re.sub(r'\(\d+ ms', '(? ms', output)
+
+
+def RemoveTypeInfoDetails(test_output):
+  """Removes compiler-specific type info from Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with type information normalized to canonical form.
+  """
+
+  # some compilers output the name of type 'unsigned int' as 'unsigned'
+  return re.sub(r'unsigned int', 'unsigned', test_output)
+
+
+def NormalizeToCurrentPlatform(test_output):
+  """Normalizes platform specific output details for easier comparison."""
+
+  if IS_WINDOWS:
+    # Removes the color information that is not present on Windows.
+    test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output)
+    # Changes failure message headers into the Windows format.
+    test_output = re.sub(r': Failure\n', r': error: ', test_output)
+    # Changes file(line_number) to file:line_number.
+    test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output)
+
+  return test_output
+
+
+def RemoveTestCounts(output):
+  """Removes test counts from a Google Test program's output."""
+
+  output = re.sub(r'\d+ tests?, listed below',
+                  '? tests, listed below', output)
+  output = re.sub(r'\d+ FAILED TESTS',
+                  '? FAILED TESTS', output)
+  output = re.sub(r'\d+ tests? from \d+ test cases?',
+                  '? tests from ? test cases', output)
+  output = re.sub(r'\d+ tests? from ([a-zA-Z_])',
+                  r'? tests from \1', output)
+  return re.sub(r'\d+ tests?\.', '? tests.', output)
+
+
+def RemoveMatchingTests(test_output, pattern):
+  """Removes output of specified tests from a Google Test program's output.
+
+  This function strips not only the beginning and the end of a test but also
+  all output in between.
+
+  Args:
+    test_output:       A string containing the test output.
+    pattern:           A regex string that matches names of test cases or
+                       tests to remove.
+
+  Returns:
+    Contents of test_output with tests whose names match pattern removed.
+  """
+
+  test_output = re.sub(
+      r'.*\[ RUN      \] .*%s(.|\n)*?\[(  FAILED  |       OK )\] .*%s.*\n' % (
+          pattern, pattern),
+      '',
+      test_output)
+  return re.sub(r'.*%s.*\n' % pattern, '', test_output)
+
+
+def NormalizeOutput(output):
+  """Normalizes output (the output of gtest_output_test_.exe)."""
+
+  output = ToUnixLineEnding(output)
+  output = RemoveLocations(output)
+  output = RemoveStackTraceDetails(output)
+  output = RemoveTime(output)
+  return output
+
+
+def GetShellCommandOutput(env_cmd):
+  """Runs a command in a sub-process, and returns its output in a string.
+
+  Args:
+    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
+             environment variables to set, and element 1 is a string with
+             the command and any flags.
+
+  Returns:
+    A string with the command's combined standard and diagnostic output.
+  """
+
+  # Spawns cmd in a sub-process, and gets its standard I/O file objects.
+  # Set and save the environment properly.
+  environ = os.environ.copy()
+  environ.update(env_cmd[0])
+  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)
+
+  return p.output
+
+
+def GetCommandOutput(env_cmd):
+  """Runs a command and returns its output with all file location
+  info stripped off.
+
+  Args:
+    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra
+              environment variables to set, and element 1 is a string with
+              the command and any flags.
+  """
+
+  # Disables exception pop-ups on Windows.
+  environ, cmdline = env_cmd
+  environ = dict(environ)  # Ensures we are modifying a copy.
+  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'
+  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))
+
+
+def GetOutputOfAllCommands():
+  """Returns concatenated output from several representative commands."""
+
+  return (GetCommandOutput(COMMAND_WITH_COLOR) +
+          GetCommandOutput(COMMAND_WITH_TIME) +
+          GetCommandOutput(COMMAND_WITH_DISABLED) +
+          GetCommandOutput(COMMAND_WITH_SHARDING))
+
+
+test_list = GetShellCommandOutput(COMMAND_LIST_TESTS)
+SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list
+SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list
+SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list
+SUPPORTS_STACK_TRACES = False
+
+CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and
+                            SUPPORTS_TYPED_TESTS and
+                            SUPPORTS_THREADS)
+
+
+class GTestOutputTest(gtest_test_utils.TestCase):
+  def RemoveUnsupportedTests(self, test_output):
+    if not SUPPORTS_DEATH_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'DeathTest')
+    if not SUPPORTS_TYPED_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'TypedTest')
+      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')
+      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')
+    if not SUPPORTS_THREADS:
+      test_output = RemoveMatchingTests(test_output,
+                                        'ExpectFailureWithThreadsTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'ScopedFakeTestPartResultReporterTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'WorksConcurrently')
+    if not SUPPORTS_STACK_TRACES:
+      test_output = RemoveStackTraces(test_output)
+
+    return test_output
+
+  def testOutput(self):
+    output = GetOutputOfAllCommands()
+
+    golden_file = open(GOLDEN_PATH, 'rb')
+    # A mis-configured source control system can cause \r appear in EOL
+    # sequences when we read the golden file irrespective of an operating
+    # system used. Therefore, we need to strip those \r's from newlines
+    # unconditionally.
+    golden = ToUnixLineEnding(golden_file.read())
+    golden_file.close()
+
+    # We want the test to pass regardless of certain features being
+    # supported or not.
+
+    # We still have to remove type name specifics in all cases.
+    normalized_actual = RemoveTypeInfoDetails(output)
+    normalized_golden = RemoveTypeInfoDetails(golden)
+
+    if CAN_GENERATE_GOLDEN_FILE:
+      self.assertEqual(normalized_golden, normalized_actual)
+    else:
+      normalized_actual = NormalizeToCurrentPlatform(
+          RemoveTestCounts(normalized_actual))
+      normalized_golden = NormalizeToCurrentPlatform(
+          RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden)))
+
+      # This code is very handy when debugging golden file differences:
+      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_actual.txt'), 'wb').write(
+                normalized_actual)
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_golden.txt'), 'wb').write(
+                normalized_golden)
+
+      self.assertEqual(normalized_golden, normalized_actual)
+
+
+if __name__ == '__main__':
+  if sys.argv[1:] == [GENGOLDEN_FLAG]:
+    if CAN_GENERATE_GOLDEN_FILE:
+      output = GetOutputOfAllCommands()
+      golden_file = open(GOLDEN_PATH, 'wb')
+      golden_file.write(output)
+      golden_file.close()
+    else:
+      message = (
+          """Unable to write a golden file when compiled in an environment
+that does not support all the required features (death tests, typed tests,
+and multiple threads).  Please generate the golden file using a binary built
+with those features enabled.""")
+
+      sys.stderr.write(message)
+      sys.exit(1)
+  else:
+    gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_output_test_.cc b/vendor/gtest-1.7.0/test/gtest_output_test_.cc
new file mode 100644
index 0000000..07ab633
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_output_test_.cc
@@ -0,0 +1,1034 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The purpose of this file is to generate Google Test output under
+// various conditions.  The output will then be verified by
+// gtest_output_test.py to ensure that Google Test generates the
+// desired messages.  Therefore, most tests in this file are MEANT TO
+// FAIL.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#include <stdlib.h>
+
+#if GTEST_IS_THREADSAFE
+using testing::ScopedFakeTestPartResultReporter;
+using testing::TestPartResultArray;
+
+using testing::internal::Notification;
+using testing::internal::ThreadWithParam;
+#endif
+
+namespace posix = ::testing::internal::posix;
+using testing::internal::scoped_ptr;
+
+// Tests catching fatal failures.
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// This function calls a test subroutine, catches the fatal failure it
+// generates, and then returns early.
+void TryTestSubroutine() {
+  // Calls a subrountine that yields a fatal failure.
+  TestEq1(2);
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // The testing::Test:: prefix is necessary when calling
+  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
+  if (testing::Test::HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+TEST(PassingTest, PassingTest1) {
+}
+
+TEST(PassingTest, PassingTest2) {
+}
+
+// Tests that parameters of failing parameterized tests are printed in the
+// failing test summary.
+class FailingParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(FailingParamTest, Fails) {
+  EXPECT_EQ(1, GetParam());
+}
+
+// This generates a test which will fail. Google Test is expected to print
+// its parameter when it outputs the list of all failed tests.
+INSTANTIATE_TEST_CASE_P(PrintingFailingParams,
+                        FailingParamTest,
+                        testing::Values(2));
+
+static const char kGoldenString[] = "\"Line\0 1\"\nLine 2";
+
+TEST(NonfatalFailureTest, EscapesStringOperands) {
+  std::string actual = "actual \"string\"";
+  EXPECT_EQ(kGoldenString, actual);
+
+  const char* golden = kGoldenString;
+  EXPECT_EQ(golden, actual);
+}
+
+// Tests catching a fatal failure in a subroutine.
+TEST(FatalFailureTest, FatalFailureInSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  TryTestSubroutine();
+}
+
+// Tests catching a fatal failure in a nested subroutine.
+TEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  // Calls a subrountine that yields a fatal failure.
+  TryTestSubroutine();
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // When calling HasFatalFailure() inside a TEST, TEST_F, or test
+  // fixture, the testing::Test:: prefix is not needed.
+  if (HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+// Tests HasFatalFailure() after a failed EXPECT check.
+TEST(FatalFailureTest, NonfatalFailureInSubroutine) {
+  printf("(expecting a failure on false)\n");
+  EXPECT_TRUE(false);  // Generates a nonfatal failure
+  ASSERT_FALSE(HasFatalFailure());  // This should succeed.
+}
+
+// Tests interleaving user logging and Google Test assertions.
+TEST(LoggingTest, InterleavingLoggingAndAssertions) {
+  static const int a[4] = {
+    3, 9, 2, 6
+  };
+
+  printf("(expecting 2 failures on (3) >= (a[i]))\n");
+  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
+    printf("i == %d\n", i);
+    EXPECT_GE(3, a[i]);
+  }
+}
+
+// Tests the SCOPED_TRACE macro.
+
+// A helper function for testing SCOPED_TRACE.
+void SubWithoutTrace(int n) {
+  EXPECT_EQ(1, n);
+  ASSERT_EQ(2, n);
+}
+
+// Another helper function for testing SCOPED_TRACE.
+void SubWithTrace(int n) {
+  SCOPED_TRACE(testing::Message() << "n = " << n);
+
+  SubWithoutTrace(n);
+}
+
+// Tests that SCOPED_TRACE() obeys lexical scopes.
+TEST(SCOPED_TRACETest, ObeysScopes) {
+  printf("(expected to fail)\n");
+
+  // There should be no trace before SCOPED_TRACE() is invoked.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+
+  {
+    SCOPED_TRACE("Expected trace");
+    // After SCOPED_TRACE(), a failure in the current scope should contain
+    // the trace.
+    ADD_FAILURE() << "This failure is expected, and should have a trace.";
+  }
+
+  // Once the control leaves the scope of the SCOPED_TRACE(), there
+  // should be no trace again.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+}
+
+// Tests that SCOPED_TRACE works inside a loop.
+TEST(SCOPED_TRACETest, WorksInLoop) {
+  printf("(expected to fail)\n");
+
+  for (int i = 1; i <= 2; i++) {
+    SCOPED_TRACE(testing::Message() << "i = " << i);
+
+    SubWithoutTrace(i);
+  }
+}
+
+// Tests that SCOPED_TRACE works in a subroutine.
+TEST(SCOPED_TRACETest, WorksInSubroutine) {
+  printf("(expected to fail)\n");
+
+  SubWithTrace(1);
+  SubWithTrace(2);
+}
+
+// Tests that SCOPED_TRACE can be nested.
+TEST(SCOPED_TRACETest, CanBeNested) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("");  // A trace without a message.
+
+  SubWithTrace(2);
+}
+
+// Tests that multiple SCOPED_TRACEs can be used in the same scope.
+TEST(SCOPED_TRACETest, CanBeRepeated) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("A");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A.";
+
+  SCOPED_TRACE("B");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A and B.";
+
+  {
+    SCOPED_TRACE("C");
+    ADD_FAILURE() << "This failure is expected, and should "
+                  << "contain trace point A, B, and C.";
+  }
+
+  SCOPED_TRACE("D");
+  ADD_FAILURE() << "This failure is expected, and should "
+                << "contain trace point A, B, and D.";
+}
+
+#if GTEST_IS_THREADSAFE
+// Tests that SCOPED_TRACE()s can be used concurrently from multiple
+// threads.  Namely, an assertion should be affected by
+// SCOPED_TRACE()s in its own thread only.
+
+// Here's the sequence of actions that happen in the test:
+//
+//   Thread A (main)                | Thread B (spawned)
+//   ===============================|================================
+//   spawns thread B                |
+//   -------------------------------+--------------------------------
+//   waits for n1                   | SCOPED_TRACE("Trace B");
+//                                  | generates failure #1
+//                                  | notifies n1
+//   -------------------------------+--------------------------------
+//   SCOPED_TRACE("Trace A");       | waits for n2
+//   generates failure #2           |
+//   notifies n2                    |
+//   -------------------------------|--------------------------------
+//   waits for n3                   | generates failure #3
+//                                  | trace B dies
+//                                  | generates failure #4
+//                                  | notifies n3
+//   -------------------------------|--------------------------------
+//   generates failure #5           | finishes
+//   trace A dies                   |
+//   generates failure #6           |
+//   -------------------------------|--------------------------------
+//   waits for thread B to finish   |
+
+struct CheckPoints {
+  Notification n1;
+  Notification n2;
+  Notification n3;
+};
+
+static void ThreadWithScopedTrace(CheckPoints* check_points) {
+  {
+    SCOPED_TRACE("Trace B");
+    ADD_FAILURE()
+        << "Expected failure #1 (in thread B, only trace B alive).";
+    check_points->n1.Notify();
+    check_points->n2.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #3 (in thread B, trace A & B both alive).";
+  }  // Trace B dies here.
+  ADD_FAILURE()
+      << "Expected failure #4 (in thread B, only trace A alive).";
+  check_points->n3.Notify();
+}
+
+TEST(SCOPED_TRACETest, WorksConcurrently) {
+  printf("(expecting 6 failures)\n");
+
+  CheckPoints check_points;
+  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,
+                                       &check_points,
+                                       NULL);
+  check_points.n1.WaitForNotification();
+
+  {
+    SCOPED_TRACE("Trace A");
+    ADD_FAILURE()
+        << "Expected failure #2 (in thread A, trace A & B both alive).";
+    check_points.n2.Notify();
+    check_points.n3.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #5 (in thread A, only trace A alive).";
+  }  // Trace A dies here.
+  ADD_FAILURE()
+      << "Expected failure #6 (in thread A, no trace alive).";
+  thread.Join();
+}
+#endif  // GTEST_IS_THREADSAFE
+
+TEST(DisabledTestsWarningTest,
+     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
+  // This test body is intentionally empty.  Its sole purpose is for
+  // verifying that the --gtest_also_run_disabled_tests flag
+  // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
+  // the test output.
+}
+
+// Tests using assertions outside of TEST and TEST_F.
+//
+// This function creates two failures intentionally.
+void AdHocTest() {
+  printf("The non-test part of the code is expected to have 2 failures.\n\n");
+  EXPECT_TRUE(false);
+  EXPECT_EQ(2, 3);
+}
+
+// Runs all TESTs, all TEST_Fs, and the ad hoc test.
+int RunAllTests() {
+  AdHocTest();
+  return RUN_ALL_TESTS();
+}
+
+// Tests non-fatal failures in the fixture constructor.
+class NonFatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  NonFatalFailureInFixtureConstructorTest() {
+    printf("(expecting 5 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
+  }
+
+  ~NonFatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "Expected failure #2, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "Expected failure #4, in TearDown.";
+  }
+};
+
+TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "Expected failure #3, in the test body.";
+}
+
+// Tests fatal failures in the fixture constructor.
+class FatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  FatalFailureInFixtureConstructorTest() {
+    printf("(expecting 2 failures)\n");
+    Init();
+  }
+
+  ~FatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "UNEXPECTED failure in SetUp().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "UNEXPECTED failure in TearDown().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+ private:
+  void Init() {
+    FAIL() << "Expected failure #1, in the test fixture c'tor.";
+  }
+};
+
+TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "UNEXPECTED failure in the test body.  "
+                << "We should never get here, as the test fixture c'tor "
+                << "had a fatal failure.";
+}
+
+// Tests non-fatal failures in SetUp().
+class NonFatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~NonFatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 4 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #3, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #4, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "Expected failure #2, in the test function.";
+}
+
+// Tests fatal failures in SetUp().
+class FatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~FatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 3 failures)\n");
+    FAIL() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #2, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #3, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "UNEXPECTED failure in the test function.  "
+         << "We should never get here, as SetUp() failed.";
+}
+
+TEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {
+  ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc";
+}
+
+#if GTEST_IS_THREADSAFE
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  GTEST_CHECK_(!should_die) << " - death inside DieIf().";
+}
+
+// Tests running death tests in a multi-threaded context.
+
+// Used for coordination between the main and the spawn thread.
+struct SpawnThreadNotifications {
+  SpawnThreadNotifications() {}
+
+  Notification spawn_thread_started;
+  Notification spawn_thread_ok_to_terminate;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);
+};
+
+// The function to be executed in the thread spawn by the
+// MultipleThreads test (below).
+static void ThreadRoutine(SpawnThreadNotifications* notifications) {
+  // Signals the main thread that this thread has started.
+  notifications->spawn_thread_started.Notify();
+
+  // Waits for permission to finish from the main thread.
+  notifications->spawn_thread_ok_to_terminate.WaitForNotification();
+}
+
+// This is a death-test test, but it's not named with a DeathTest
+// suffix.  It starts threads which might interfere with later
+// death tests, so it must run after all other death tests.
+class DeathTestAndMultiThreadsTest : public testing::Test {
+ protected:
+  // Starts a thread and waits for it to begin.
+  virtual void SetUp() {
+    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(
+        &ThreadRoutine, &notifications_, NULL));
+    notifications_.spawn_thread_started.WaitForNotification();
+  }
+  // Tells the thread to finish, and reaps it.
+  // Depending on the version of the thread library in use,
+  // a manager thread might still be left running that will interfere
+  // with later death tests.  This is unfortunate, but this class
+  // cleans up after itself as best it can.
+  virtual void TearDown() {
+    notifications_.spawn_thread_ok_to_terminate.Notify();
+  }
+
+ private:
+  SpawnThreadNotifications notifications_;
+  scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_;
+};
+
+#endif  // GTEST_IS_THREADSAFE
+
+// The MixedUpTestCaseTest test case verifies that Google Test will fail a
+// test if it uses a different fixture class than what other tests in
+// the same test case use.  It deliberately contains two fixture
+// classes with the same name but defined in different namespaces.
+
+// The MixedUpTestCaseWithSameTestNameTest test case verifies that
+// when the user defines two tests with the same test case name AND
+// same test name (but in different namespaces), the second test will
+// fail.
+
+namespace foo {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
+TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace foo
+
+namespace bar {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+// The following two tests are expected to fail.  We rely on the
+// golden file to check that Google Test generates the right error message.
+TEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
+TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace bar
+
+// The following two test cases verify that Google Test catches the user
+// error of mixing TEST and TEST_F in the same test case.  The first
+// test case checks the scenario where TEST_F appears before TEST, and
+// the second one checks where TEST appears before TEST_F.
+
+class TEST_F_before_TEST_in_same_test_case : public testing::Test {
+};
+
+TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
+
+class TEST_before_TEST_F_in_same_test_case : public testing::Test {
+};
+
+TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
+}
+
+// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
+int global_integer = 0;
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
+TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
+// (static or not).
+TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
+  int m = 0;
+  static int n;
+  n = 1;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(m, n) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
+// one non-fatal failure and no fatal failure.
+TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
+// non-fatal failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
+// non-fatal failures.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure 1.";
+    ADD_FAILURE() << "Expected non-fatal failure 2.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
+// failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_NONFATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
+TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() can reference local static
+// variables.
+TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
+  static int n;
+  n = 1;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(0, n) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
+// one fatal failure and no non-fatal failure.
+TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
+  EXPECT_FATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+  }, "");
+}
+
+// A helper for generating a fatal failure.
+void FatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there are two
+// fatal failures.
+TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    FatalFailure();
+    FatalFailure();
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_FATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// This #ifdef block tests the output of typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+TYPED_TEST_CASE(TypedTest, testing::Types<int>);
+
+TYPED_TEST(TypedTest, Success) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST(TypedTest, Failure) {
+  EXPECT_EQ(1, TypeParam()) << "Expected failure";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests the output of type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, Success) {
+  EXPECT_EQ(0U, TypeParam());
+}
+
+TYPED_TEST_P(TypedTestP, Failure) {
+  EXPECT_EQ(1U, TypeParam()) << "Expected failure";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
+
+typedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if GTEST_HAS_DEATH_TEST
+
+// We rely on the golden file to verify that tests whose test case
+// name ends with DeathTest are run first.
+
+TEST(ADeathTest, ShouldRunFirst) {
+}
+
+# if GTEST_HAS_TYPED_TEST
+
+// We rely on the golden file to verify that typed tests whose test
+// case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypedDeathTest : public testing::Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
+
+TYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+# if GTEST_HAS_TYPED_TEST_P
+
+
+// We rely on the golden file to verify that type-parameterized tests
+// whose test case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypeParamDeathTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(ATypeParamDeathTest);
+
+TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
+
+# endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests various failure conditions of
+// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
+class ExpectFailureTest : public testing::Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      FAIL() << "Expected fatal failure.";
+    } else {
+      ADD_FAILURE() << "Expected non-fatal failure.";
+    }
+  }
+};
+
+TEST_F(ExpectFailureTest, ExpectFatalFailure) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
+                       "failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
+                       "expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
+                          "failure.");
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ExpectFailureWithThreadsTest : public ExpectFailureTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
+                       "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
+                          "Expected non-fatal failure.");
+}
+
+typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
+
+// Tests that the ScopedFakeTestPartResultReporter only catches failures from
+// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
+  printf("(expecting 2 failures)\n");
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailureInOtherThread(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+  }
+  // The two failures should not have been intercepted.
+  EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                      "Expected non-fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                      "Some other fatal failure expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
+                                         "failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                         "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                         "Some other non-fatal failure.");
+}
+
+
+// Two test environments for testing testing::AddGlobalTestEnvironment().
+
+class FooEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "FooEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "FooEnvironment::TearDown() called.\n");
+    FAIL() << "Expected fatal failure.";
+  }
+};
+
+class BarEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "BarEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "BarEnvironment::TearDown() called.\n");
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }
+};
+
+bool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = false;
+
+// The main function.
+//
+// The idea is to use Google Test to run all the tests we have defined (some
+// of them are intended to fail), and then compare the test results
+// with the "golden" file.
+int main(int argc, char **argv) {
+  testing::GTEST_FLAG(print_time) = false;
+
+  // We just run the tests, knowing some of them are intended to fail.
+  // We will use a separate Python script to compare the output of
+  // this program with the golden file.
+
+  // It's hard to test InitGoogleTest() directly, as it has many
+  // global side effects.  The following line serves as a sanity test
+  // for it.
+  testing::InitGoogleTest(&argc, argv);
+  if (argc >= 2 &&
+      (std::string(argv[1]) ==
+       "--gtest_internal_skip_environment_and_ad_hoc_tests"))
+    GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
+
+#if GTEST_HAS_DEATH_TEST
+  if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
+    // Skip the usual output capturing if we're running as the child
+    // process of an threadsafe-style death test.
+# if GTEST_OS_WINDOWS
+    posix::FReopen("nul:", "w", stdout);
+# else
+    posix::FReopen("/dev/null", "w", stdout);
+# endif  // GTEST_OS_WINDOWS
+    return RUN_ALL_TESTS();
+  }
+#endif  // GTEST_HAS_DEATH_TEST
+
+  if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
+    return RUN_ALL_TESTS();
+
+  // Registers two global test environments.
+  // The golden file verifies that they are set up in the order they
+  // are registered, and torn down in the reverse order.
+  testing::AddGlobalTestEnvironment(new FooEnvironment);
+  testing::AddGlobalTestEnvironment(new BarEnvironment);
+
+  return RunAllTests();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_output_test_golden_lin.txt b/vendor/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
new file mode 100644
index 0000000..960eedc
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
@@ -0,0 +1,720 @@
+The non-test part of the code is expected to have 2 failures.
+
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+gtest_output_test_.cc:#: Failure
+Value of: 3
+Expected: 2
+[==========] Running 63 tests from 28 test cases.
+[----------] Global test environment set-up.
+FooEnvironment::SetUp() called.
+BarEnvironment::SetUp() called.
+[----------] 1 test from ADeathTest
+[ RUN      ] ADeathTest.ShouldRunFirst
+[       OK ] ADeathTest.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/0, where TypeParam = int
+[ RUN      ] ATypedDeathTest/0.ShouldRunFirst
+[       OK ] ATypedDeathTest/0.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/1, where TypeParam = double
+[ RUN      ] ATypedDeathTest/1.ShouldRunFirst
+[       OK ] ATypedDeathTest/1.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int
+[ RUN      ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double
+[ RUN      ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[----------] 2 tests from PassingTest
+[ RUN      ] PassingTest.PassingTest1
+[       OK ] PassingTest.PassingTest1
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] 1 test from NonfatalFailureTest
+[ RUN      ] NonfatalFailureTest.EscapesStringOperands
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: kGoldenString
+Which is: "\"Line"
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: golden
+Which is: "\"Line"
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[----------] 6 tests from SCOPED_TRACETest
+[ RUN      ] SCOPED_TRACETest.ObeysScopes
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should have a trace.
+Google Test trace:
+gtest_output_test_.cc:#: Expected trace
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[ RUN      ] SCOPED_TRACETest.WorksInLoop
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: i = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: i = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[ RUN      ] SCOPED_TRACETest.WorksInSubroutine
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: n = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[ RUN      ] SCOPED_TRACETest.CanBeNested
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+gtest_output_test_.cc:#: 
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[ RUN      ] SCOPED_TRACETest.CanBeRepeated
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A.
+Google Test trace:
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A and B.
+Google Test trace:
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and C.
+Google Test trace:
+gtest_output_test_.cc:#: C
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and D.
+Google Test trace:
+gtest_output_test_.cc:#: D
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[ RUN      ] SCOPED_TRACETest.WorksConcurrently
+(expecting 6 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1 (in thread B, only trace B alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2 (in thread A, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3 (in thread B, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4 (in thread B, only trace A alive).
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5 (in thread A, only trace A alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #6 (in thread A, no trace alive).
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[----------] 1 test from NonFatalFailureInFixtureConstructorTest
+[ RUN      ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 5 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test body.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in TearDown.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from FatalFailureInFixtureConstructorTest
+[ RUN      ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from NonFatalFailureInSetUpTest
+[ RUN      ] NonFatalFailureInSetUpTest.FailureInSetUp
+(expecting 4 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test function.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from FatalFailureInSetUpTest
+[ RUN      ] FatalFailureInSetUpTest.FailureInSetUp
+(expecting 3 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from AddFailureAtTest
+[ RUN      ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+foo.cc:42: Failure
+Failed
+Expected failure in foo.cc
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[----------] 4 tests from MixedUpTestCaseTest
+[ RUN      ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFailToo
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[       OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseWithSameTestNameTest,
+you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[----------] 2 tests from TEST_F_before_TEST_in_same_test_case
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[       OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_F_before_TEST_in_same_test_case,
+test DefinedUsingTEST_F is defined using TEST_F but
+test DefinedUsingTESTAndShouldFail is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[----------] 2 tests from TEST_before_TEST_F_in_same_test_case
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[       OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_before_TEST_F_in_same_test_case,
+test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but
+test DefinedUsingTEST is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[----------] 8 tests from ExpectNonfatalFailureTest
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[ RUN      ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[       OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 1.
+
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 2.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[----------] 8 tests from ExpectFatalFailureTest
+[ RUN      ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[ RUN      ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[       OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[----------] 2 tests from TypedTest/0, where TypeParam = int
+[ RUN      ] TypedTest/0.Success
+[       OK ] TypedTest/0.Success
+[ RUN      ] TypedTest/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1
+Expected failure
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char
+[ RUN      ] Unsigned/TypedTestP/0.Success
+[       OK ] Unsigned/TypedTestP/0.Success
+[ RUN      ] Unsigned/TypedTestP/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: '\0'
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int
+[ RUN      ] Unsigned/TypedTestP/1.Success
+[       OK ] Unsigned/TypedTestP/1.Success
+[ RUN      ] Unsigned/TypedTestP/1.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[----------] 4 tests from ExpectFailureTest
+[ RUN      ] ExpectFailureTest.ExpectFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[----------] 2 tests from ExpectFailureWithThreadsTest
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[----------] 1 test from ScopedFakeTestPartResultReporterTest
+[ RUN      ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[----------] 1 test from PrintingFailingParams/FailingParamTest
+[ RUN      ] PrintingFailingParams/FailingParamTest.Fails/0
+gtest_output_test_.cc:#: Failure
+Value of: GetParam()
+  Actual: 2
+Expected: 1
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+[----------] Global test environment tear-down
+BarEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+FooEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+[==========] 63 tests from 28 test cases ran.
+[  PASSED  ] 21 tests.
+[  FAILED  ] 42 tests, listed below:
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+
+42 FAILED TESTS
+  YOU HAVE 1 DISABLED TEST
+
+Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
+[==========] Running 4 tests from 2 test cases.
+[----------] Global test environment set-up.
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)
+[----------] 3 tests from FatalFailureTest (? ms total)
+
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)
+[----------] 1 test from LoggingTest (? ms total)
+
+[----------] Global test environment tear-down
+[==========] 4 tests from 2 test cases ran. (? ms total)
+[  PASSED  ] 0 tests.
+[  FAILED  ] 4 tests, listed below:
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+
+ 4 FAILED TESTS
+Note: Google Test filter = *DISABLED_*
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from DisabledTestsWarningTest
+[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
+Note: Google Test filter = PassingTest.*
+Note: This is test shard 2 of 2.
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from PassingTest
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
diff --git a/vendor/gtest-1.7.0/test/gtest_pred_impl_unittest.cc b/vendor/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
new file mode 100644
index 0000000..a84eff8
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
@@ -0,0 +1,2427 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+
+// Regression test for gtest_pred_impl.h
+//
+// This file is generated by a script and quite long.  If you intend to
+// learn how Google Test works by reading its unit tests, read
+// gtest_unittest.cc instead.
+//
+// This is intended as a regression test for the Google Test predicate
+// assertions.  We compile it as part of the gtest_unittest target
+// only to keep the implementation tidy and compact, as it is quite
+// involved to set up the stage for testing Google Test using Google
+// Test itself.
+//
+// Currently, gtest_unittest takes ~11 seconds to run in the testing
+// daemon.  In the future, if it grows too large and needs much more
+// time to finish, we should consider separating this file into a
+// stand-alone regression test.
+
+#include <iostream>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// A user-defined data type.
+struct Bool {
+  explicit Bool(int val) : value(val != 0) {}
+
+  bool operator>(int n) const { return value > Bool(n).value; }
+
+  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
+
+  bool operator==(const Bool& rhs) const { return value == rhs.value; }
+
+  bool value;
+};
+
+// Enables Bool to be used in assertions.
+std::ostream& operator<<(std::ostream& os, const Bool& x) {
+  return os << (x.value ? "true" : "false");
+}
+
+// Sample functions/functors for testing unary predicate assertions.
+
+// A unary predicate function.
+template <typename T1>
+bool PredFunction1(T1 v1) {
+  return v1 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction1Int(int v1) {
+  return v1 > 0;
+}
+bool PredFunction1Bool(Bool v1) {
+  return v1 > 0;
+}
+
+// A unary predicate functor.
+struct PredFunctor1 {
+  template <typename T1>
+  bool operator()(const T1& v1) {
+    return v1 > 0;
+  }
+};
+
+// A unary predicate-formatter function.
+template <typename T1>
+testing::AssertionResult PredFormatFunction1(const char* e1,
+                                             const T1& v1) {
+  if (PredFunction1(v1))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1
+      << " is expected to be positive, but evaluates to "
+      << v1 << ".";
+}
+
+// A unary predicate-formatter functor.
+struct PredFormatFunctor1 {
+  template <typename T1>
+  testing::AssertionResult operator()(const char* e1,
+                                      const T1& v1) const {
+    return PredFormatFunction1(e1, v1);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.
+
+class Predicate1Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+};
+
+bool Predicate1Test::expected_to_finish_;
+bool Predicate1Test::finished_;
+int Predicate1Test::n1_;
+
+typedef Predicate1Test EXPECT_PRED_FORMAT1Test;
+typedef Predicate1Test ASSERT_PRED_FORMAT1Test;
+typedef Predicate1Test EXPECT_PRED1Test;
+typedef Predicate1Test ASSERT_PRED1Test;
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing binary predicate assertions.
+
+// A binary predicate function.
+template <typename T1, typename T2>
+bool PredFunction2(T1 v1, T2 v2) {
+  return v1 + v2 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction2Int(int v1, int v2) {
+  return v1 + v2 > 0;
+}
+bool PredFunction2Bool(Bool v1, Bool v2) {
+  return v1 + v2 > 0;
+}
+
+// A binary predicate functor.
+struct PredFunctor2 {
+  template <typename T1, typename T2>
+  bool operator()(const T1& v1,
+                  const T2& v2) {
+    return v1 + v2 > 0;
+  }
+};
+
+// A binary predicate-formatter function.
+template <typename T1, typename T2>
+testing::AssertionResult PredFormatFunction2(const char* e1,
+                                             const char* e2,
+                                             const T1& v1,
+                                             const T2& v2) {
+  if (PredFunction2(v1, v2))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 << ".";
+}
+
+// A binary predicate-formatter functor.
+struct PredFormatFunctor2 {
+  template <typename T1, typename T2>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const T1& v1,
+                                      const T2& v2) const {
+    return PredFormatFunction2(e1, e2, v1, v2);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.
+
+class Predicate2Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+};
+
+bool Predicate2Test::expected_to_finish_;
+bool Predicate2Test::finished_;
+int Predicate2Test::n1_;
+int Predicate2Test::n2_;
+
+typedef Predicate2Test EXPECT_PRED_FORMAT2Test;
+typedef Predicate2Test ASSERT_PRED_FORMAT2Test;
+typedef Predicate2Test EXPECT_PRED2Test;
+typedef Predicate2Test ASSERT_PRED2Test;
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing ternary predicate assertions.
+
+// A ternary predicate function.
+template <typename T1, typename T2, typename T3>
+bool PredFunction3(T1 v1, T2 v2, T3 v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction3Int(int v1, int v2, int v3) {
+  return v1 + v2 + v3 > 0;
+}
+bool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// A ternary predicate functor.
+struct PredFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3) {
+    return v1 + v2 + v3 > 0;
+  }
+};
+
+// A ternary predicate-formatter function.
+template <typename T1, typename T2, typename T3>
+testing::AssertionResult PredFormatFunction3(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3) {
+  if (PredFunction3(v1, v2, v3))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 << ".";
+}
+
+// A ternary predicate-formatter functor.
+struct PredFormatFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3) const {
+    return PredFormatFunction3(e1, e2, e3, v1, v2, v3);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.
+
+class Predicate3Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+};
+
+bool Predicate3Test::expected_to_finish_;
+bool Predicate3Test::finished_;
+int Predicate3Test::n1_;
+int Predicate3Test::n2_;
+int Predicate3Test::n3_;
+
+typedef Predicate3Test EXPECT_PRED_FORMAT3Test;
+typedef Predicate3Test ASSERT_PRED_FORMAT3Test;
+typedef Predicate3Test EXPECT_PRED3Test;
+typedef Predicate3Test ASSERT_PRED3Test;
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 4-ary predicate assertions.
+
+// A 4-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4>
+bool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction4Int(int v1, int v2, int v3, int v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+bool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// A 4-ary predicate functor.
+struct PredFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4) {
+    return v1 + v2 + v3 + v4 > 0;
+  }
+};
+
+// A 4-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4>
+testing::AssertionResult PredFormatFunction4(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4) {
+  if (PredFunction4(v1, v2, v3, v4))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 << ".";
+}
+
+// A 4-ary predicate-formatter functor.
+struct PredFormatFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4) const {
+    return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.
+
+class Predicate4Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+};
+
+bool Predicate4Test::expected_to_finish_;
+bool Predicate4Test::finished_;
+int Predicate4Test::n1_;
+int Predicate4Test::n2_;
+int Predicate4Test::n3_;
+int Predicate4Test::n4_;
+
+typedef Predicate4Test EXPECT_PRED_FORMAT4Test;
+typedef Predicate4Test ASSERT_PRED_FORMAT4Test;
+typedef Predicate4Test EXPECT_PRED4Test;
+typedef Predicate4Test ASSERT_PRED4Test;
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 5-ary predicate assertions.
+
+// A 5-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+bool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+bool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// A 5-ary predicate functor.
+struct PredFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4,
+                  const T5& v5) {
+    return v1 + v2 + v3 + v4 + v5 > 0;
+  }
+};
+
+// A 5-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+testing::AssertionResult PredFormatFunction5(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const char* e5,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4,
+                                             const T5& v5) {
+  if (PredFunction5(v1, v2, v3, v4, v5))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 + v5 << ".";
+}
+
+// A 5-ary predicate-formatter functor.
+struct PredFormatFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const char* e5,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4,
+                                      const T5& v5) const {
+    return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.
+
+class Predicate5Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = n5_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+    EXPECT_EQ(1, n5_) <<
+        "The predicate assertion didn't evaluate argument 6 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+  static int n5_;
+};
+
+bool Predicate5Test::expected_to_finish_;
+bool Predicate5Test::finished_;
+int Predicate5Test::n1_;
+int Predicate5Test::n2_;
+int Predicate5Test::n3_;
+int Predicate5Test::n4_;
+int Predicate5Test::n5_;
+
+typedef Predicate5Test EXPECT_PRED_FORMAT5Test;
+typedef Predicate5Test ASSERT_PRED_FORMAT5Test;
+typedef Predicate5Test EXPECT_PRED5Test;
+typedef Predicate5Test ASSERT_PRED5Test;
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_premature_exit_test.cc b/vendor/gtest-1.7.0/test/gtest_premature_exit_test.cc
new file mode 100644
index 0000000..f6b6be9
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_premature_exit_test.cc
@@ -0,0 +1,141 @@
+// Copyright 2013, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests that Google Test manipulates the premature-exit-detection
+// file correctly.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::internal::posix::GetEnv;
+using ::testing::internal::posix::Stat;
+using ::testing::internal::posix::StatStruct;
+
+namespace {
+
+// Is the TEST_PREMATURE_EXIT_FILE environment variable expected to be
+// set?
+const bool kTestPrematureExitFileEnvVarShouldBeSet = false;
+
+class PrematureExitTest : public Test {
+ public:
+  // Returns true iff the given file exists.
+  static bool FileExists(const char* filepath) {
+    StatStruct stat;
+    return Stat(filepath, &stat) == 0;
+  }
+
+ protected:
+  PrematureExitTest() {
+    premature_exit_file_path_ = GetEnv("TEST_PREMATURE_EXIT_FILE");
+
+    // Normalize NULL to "" for ease of handling.
+    if (premature_exit_file_path_ == NULL) {
+      premature_exit_file_path_ = "";
+    }
+  }
+
+  // Returns true iff the premature-exit file exists.
+  bool PrematureExitFileExists() const {
+    return FileExists(premature_exit_file_path_);
+  }
+
+  const char* premature_exit_file_path_;
+};
+
+typedef PrematureExitTest PrematureExitDeathTest;
+
+// Tests that:
+//   - the premature-exit file exists during the execution of a
+//     death test (EXPECT_DEATH*), and
+//   - a death test doesn't interfere with the main test process's
+//     handling of the premature-exit file.
+TEST_F(PrematureExitDeathTest, FileExistsDuringExecutionOfDeathTest) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_DEATH_IF_SUPPORTED({
+      // If the file exists, crash the process such that the main test
+      // process will catch the (expected) crash and report a success;
+      // otherwise don't crash, which will cause the main test process
+      // to report that the death test has failed.
+      if (PrematureExitFileExists()) {
+        exit(1);
+      }
+    }, "");
+}
+
+// Tests that TEST_PREMATURE_EXIT_FILE is set where it's expected to
+// be set.
+TEST_F(PrematureExitTest, TestPrematureExitFileEnvVarIsSet) {
+  if (kTestPrematureExitFileEnvVarShouldBeSet) {
+    const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+    ASSERT_TRUE(filepath != NULL);
+    ASSERT_NE(*filepath, '\0');
+  }
+}
+
+// Tests that the premature-exit file exists during the execution of a
+// normal (non-death) test.
+TEST_F(PrematureExitTest, PrematureExitFileExistsDuringTestExecution) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_TRUE(PrematureExitFileExists())
+      << " file " << premature_exit_file_path_
+      << " should exist during test execution, but doesn't.";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+  const int exit_code = RUN_ALL_TESTS();
+
+  // Test that the premature-exit file is deleted upon return from
+  // RUN_ALL_TESTS().
+  const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+  if (filepath != NULL && *filepath != '\0') {
+    if (PrematureExitTest::FileExists(filepath)) {
+      printf(
+          "File %s shouldn't exist after the test program finishes, but does.",
+          filepath);
+      return 1;
+    }
+  }
+
+  return exit_code;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_prod_test.cc b/vendor/gtest-1.7.0/test/gtest_prod_test.cc
new file mode 100644
index 0000000..060abce
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_prod_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Unit test for include/gtest/gtest_prod.h.
+
+#include "gtest/gtest.h"
+#include "test/production.h"
+
+// Tests that private members can be accessed from a TEST declared as
+// a friend of the class.
+TEST(PrivateCodeTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(1);
+  EXPECT_EQ(1, a.x_);
+}
+
+typedef testing::Test PrivateCodeFixtureTest;
+
+// Tests that private members can be accessed from a TEST_F declared
+// as a friend of the class.
+TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(2);
+  EXPECT_EQ(2, a.x_);
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_repeat_test.cc b/vendor/gtest-1.7.0/test/gtest_repeat_test.cc
new file mode 100644
index 0000000..481012a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_repeat_test.cc
@@ -0,0 +1,253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests the --gtest_repeat=number flag.
+
+#include <stdlib.h>
+#include <iostream>
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+GTEST_DECLARE_string_(death_test_style);
+GTEST_DECLARE_string_(filter);
+GTEST_DECLARE_int32_(repeat);
+
+}  // namespace testing
+
+using testing::GTEST_FLAG(death_test_style);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(repeat);
+
+namespace {
+
+// We need this when we are testing Google Test itself and therefore
+// cannot use Google Test assertions.
+#define GTEST_CHECK_INT_EQ_(expected, actual) \
+  do {\
+    const int expected_val = (expected);\
+    const int actual_val = (actual);\
+    if (::testing::internal::IsTrue(expected_val != actual_val)) {\
+      ::std::cout << "Value of: " #actual "\n"\
+                  << "  Actual: " << actual_val << "\n"\
+                  << "Expected: " #expected "\n"\
+                  << "Which is: " << expected_val << "\n";\
+      ::testing::internal::posix::Abort();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+
+// Used for verifying that global environment set-up and tear-down are
+// inside the gtest_repeat loop.
+
+int g_environment_set_up_count = 0;
+int g_environment_tear_down_count = 0;
+
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() {}
+  virtual void SetUp() { g_environment_set_up_count++; }
+  virtual void TearDown() { g_environment_tear_down_count++; }
+};
+
+// A test that should fail.
+
+int g_should_fail_count = 0;
+
+TEST(FooTest, ShouldFail) {
+  g_should_fail_count++;
+  EXPECT_EQ(0, 1) << "Expected failure.";
+}
+
+// A test that should pass.
+
+int g_should_pass_count = 0;
+
+TEST(FooTest, ShouldPass) {
+  g_should_pass_count++;
+}
+
+// A test that contains a thread-safe death test and a fast death
+// test.  It should pass.
+
+int g_death_test_count = 0;
+
+TEST(BarDeathTest, ThreadSafeAndFast) {
+  g_death_test_count++;
+
+  GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+
+  GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+}
+
+#if GTEST_HAS_PARAM_TEST
+int g_param_test_count = 0;
+
+const int kNumberOfParamTests = 10;
+
+class MyParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(MyParamTest, ShouldPass) {
+  // TODO(vladl at google.com): Make parameter value checking robust
+  //                         WRT order of tests.
+  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
+  g_param_test_count++;
+}
+INSTANTIATE_TEST_CASE_P(MyParamSequence,
+                        MyParamTest,
+                        testing::Range(0, kNumberOfParamTests));
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Resets the count for each test.
+void ResetCounts() {
+  g_environment_set_up_count = 0;
+  g_environment_tear_down_count = 0;
+  g_should_fail_count = 0;
+  g_should_pass_count = 0;
+  g_death_test_count = 0;
+#if GTEST_HAS_PARAM_TEST
+  g_param_test_count = 0;
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Checks that the count for each test is expected.
+void CheckCounts(int expected) {
+  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests the behavior of Google Test when --gtest_repeat is not specified.
+void TestRepeatUnspecified() {
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  CheckCounts(1);
+}
+
+// Tests the behavior of Google Test when --gtest_repeat has the given value.
+void TestRepeat(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
+  CheckCounts(repeat);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies an empty
+// set of tests.
+void TestRepeatWithEmptyFilter(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "None";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  CheckCounts(0);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// successful tests.
+void TestRepeatWithFilterForSuccessfulTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*-*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// failed tests.
+void TestRepeatWithFilterForFailedTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(0, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(0, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::AddGlobalTestEnvironment(new MyEnvironment);
+
+  TestRepeatUnspecified();
+  TestRepeat(0);
+  TestRepeat(1);
+  TestRepeat(5);
+
+  TestRepeatWithEmptyFilter(2);
+  TestRepeatWithEmptyFilter(3);
+
+  TestRepeatWithFilterForSuccessfulTests(3);
+
+  TestRepeatWithFilterForFailedTests(4);
+
+  // It would be nice to verify that the tests indeed loop forever
+  // when GTEST_FLAG(repeat) is negative, but this test will be quite
+  // complicated to write.  Since this flag is for interactive
+  // debugging only and doesn't affect the normal test result, such a
+  // test would be an overkill.
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_shuffle_test.py b/vendor/gtest-1.7.0/test/gtest_shuffle_test.py
new file mode 100755
index 0000000..30d0303
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_shuffle_test.py
@@ -0,0 +1,325 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that test shuffling works."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+# Command to run the gtest_shuffle_test_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_')
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+
+TEST_FILTER = 'A*.A:A*.B:C*'
+
+ALL_TESTS = []
+ACTIVE_TESTS = []
+FILTERED_TESTS = []
+SHARDED_TESTS = []
+
+SHUFFLED_ALL_TESTS = []
+SHUFFLED_ACTIVE_TESTS = []
+SHUFFLED_FILTERED_TESTS = []
+SHUFFLED_SHARDED_TESTS = []
+
+
+def AlsoRunDisabledTestsFlag():
+  return '--gtest_also_run_disabled_tests'
+
+
+def FilterFlag(test_filter):
+  return '--gtest_filter=%s' % (test_filter,)
+
+
+def RepeatFlag(n):
+  return '--gtest_repeat=%s' % (n,)
+
+
+def ShuffleFlag():
+  return '--gtest_shuffle'
+
+
+def RandomSeedFlag(n):
+  return '--gtest_random_seed=%s' % (n,)
+
+
+def RunAndReturnOutput(extra_env, args):
+  """Runs the test program and returns its output."""
+
+  environ_copy = os.environ.copy()
+  environ_copy.update(extra_env)
+
+  return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output
+
+
+def GetTestsForAllIterations(extra_env, args):
+  """Runs the test program and returns a list of test lists.
+
+  Args:
+    extra_env: a map from environment variables to their values
+    args: command line flags to pass to gtest_shuffle_test_
+
+  Returns:
+    A list where the i-th element is the list of tests run in the i-th
+    test iteration.
+  """
+
+  test_iterations = []
+  for line in RunAndReturnOutput(extra_env, args).split('\n'):
+    if line.startswith('----'):
+      tests = []
+      test_iterations.append(tests)
+    elif line.strip():
+      tests.append(line.strip())  # 'TestCaseName.TestName'
+
+  return test_iterations
+
+
+def GetTestCases(tests):
+  """Returns a list of test cases in the given full test names.
+
+  Args:
+    tests: a list of full test names
+
+  Returns:
+    A list of test cases from 'tests', in their original order.
+    Consecutive duplicates are removed.
+  """
+
+  test_cases = []
+  for test in tests:
+    test_case = test.split('.')[0]
+    if not test_case in test_cases:
+      test_cases.append(test_case)
+
+  return test_cases
+
+
+def CalculateTestLists():
+  """Calculates the list of tests run under different flags."""
+
+  if not ALL_TESTS:
+    ALL_TESTS.extend(
+        GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])
+
+  if not ACTIVE_TESTS:
+    ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])
+
+  if not FILTERED_TESTS:
+    FILTERED_TESTS.extend(
+        GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])
+
+  if not SHARDED_TESTS:
+    SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [])[0])
+
+  if not SHUFFLED_ALL_TESTS:
+    SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(
+        {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_ACTIVE_TESTS:
+    SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_FILTERED_TESTS:
+    SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])
+
+  if not SHUFFLED_SHARDED_TESTS:
+    SHUFFLED_SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+
+class GTestShuffleUnitTest(gtest_test_utils.TestCase):
+  """Tests test shuffling."""
+
+  def setUp(self):
+    CalculateTestLists()
+
+  def testShufflePreservesNumberOfTests(self):
+    self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))
+    self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))
+    self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))
+    self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleChangesTestOrder(self):
+    self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)
+    self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)
+    self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,
+                 SHUFFLED_FILTERED_TESTS)
+    self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,
+                 SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleChangesTestCaseOrder(self):
+    self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),
+                 GetTestCases(SHUFFLED_ALL_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),
+        GetTestCases(SHUFFLED_ACTIVE_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),
+        GetTestCases(SHUFFLED_FILTERED_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),
+        GetTestCases(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleDoesNotRepeatTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+
+  def testShuffleDoesNotCreateNewTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))
+
+  def testShuffleIncludesAllTests(self):
+    for test in ALL_TESTS:
+      self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))
+    for test in ACTIVE_TESTS:
+      self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))
+    for test in FILTERED_TESTS:
+      self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))
+    for test in SHARDED_TESTS:
+      self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))
+
+  def testShuffleLeavesDeathTestsAtFront(self):
+    non_death_test_found = False
+    for test in SHUFFLED_ACTIVE_TESTS:
+      if 'DeathTest.' in test:
+        self.assert_(not non_death_test_found,
+                     '%s appears after a non-death test' % (test,))
+      else:
+        non_death_test_found = True
+
+  def _VerifyTestCasesDoNotInterleave(self, tests):
+    test_cases = []
+    for test in tests:
+      [test_case, _] = test.split('.')
+      if test_cases and test_cases[-1] != test_case:
+        test_cases.append(test_case)
+        self.assertEqual(1, test_cases.count(test_case),
+                         'Test case %s is not grouped together in %s' %
+                         (test_case, tests))
+
+  def testShuffleDoesNotInterleaveTestCases(self):
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleRestoresOrderAfterEachIteration(self):
+    # Get the test lists in all 3 iterations, using random seed 1, 2,
+    # and 3 respectively.  Google Test picks a different seed in each
+    # iteration, and this test depends on the current implementation
+    # picking successive numbers.  This dependency is not ideal, but
+    # makes the test much easier to write.
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    # Make sure running the tests with random seed 1 gets the same
+    # order as in iteration 1 above.
+    [tests_with_seed1] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])
+    self.assertEqual(tests_in_iteration1, tests_with_seed1)
+
+    # Make sure running the tests with random seed 2 gets the same
+    # order as in iteration 2 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 2.
+    [tests_with_seed2] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(2)])
+    self.assertEqual(tests_in_iteration2, tests_with_seed2)
+
+    # Make sure running the tests with random seed 3 gets the same
+    # order as in iteration 3 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 3.
+    [tests_with_seed3] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(3)])
+    self.assertEqual(tests_in_iteration3, tests_with_seed3)
+
+  def testShuffleGeneratesNewOrderInEachIteration(self):
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    self.assert_(tests_in_iteration1 != tests_in_iteration2,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration1 != tests_in_iteration3,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration2 != tests_in_iteration3,
+                 tests_in_iteration2)
+
+  def testShuffleShardedTestsPreservesPartition(self):
+    # If we run M tests on N shards, the same M tests should be run in
+    # total, regardless of the random seeds used by the shards.
+    [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '0'},
+                                        [ShuffleFlag(), RandomSeedFlag(1)])
+    [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '1'},
+                                        [ShuffleFlag(), RandomSeedFlag(20)])
+    [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '2'},
+                                        [ShuffleFlag(), RandomSeedFlag(25)])
+    sorted_sharded_tests = tests1 + tests2 + tests3
+    sorted_sharded_tests.sort()
+    sorted_active_tests = []
+    sorted_active_tests.extend(ACTIVE_TESTS)
+    sorted_active_tests.sort()
+    self.assertEqual(sorted_active_tests, sorted_sharded_tests)
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_shuffle_test_.cc b/vendor/gtest-1.7.0/test/gtest_shuffle_test_.cc
new file mode 100644
index 0000000..6fb441b
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_shuffle_test_.cc
@@ -0,0 +1,103 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Verifies that test shuffling works.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Message;
+using ::testing::Test;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::UnitTest;
+using ::testing::internal::scoped_ptr;
+
+// The test methods are empty, as the sole purpose of this program is
+// to print the test names before/after shuffling.
+
+class A : public Test {};
+TEST_F(A, A) {}
+TEST_F(A, B) {}
+
+TEST(ADeathTest, A) {}
+TEST(ADeathTest, B) {}
+TEST(ADeathTest, C) {}
+
+TEST(B, A) {}
+TEST(B, B) {}
+TEST(B, C) {}
+TEST(B, DISABLED_D) {}
+TEST(B, DISABLED_E) {}
+
+TEST(BDeathTest, A) {}
+TEST(BDeathTest, B) {}
+
+TEST(C, A) {}
+TEST(C, B) {}
+TEST(C, C) {}
+TEST(C, DISABLED_D) {}
+
+TEST(CDeathTest, A) {}
+
+TEST(DISABLED_D, A) {}
+TEST(DISABLED_D, DISABLED_B) {}
+
+// This printer prints the full test names only, starting each test
+// iteration with a "----" marker.
+class TestNamePrinter : public EmptyTestEventListener {
+ public:
+  virtual void OnTestIterationStart(const UnitTest& /* unit_test */,
+                                    int /* iteration */) {
+    printf("----\n");
+  }
+
+  virtual void OnTestStart(const TestInfo& test_info) {
+    printf("%s.%s\n", test_info.test_case_name(), test_info.name());
+  }
+};
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  // Replaces the default printer with TestNamePrinter, which prints
+  // the test name only.
+  TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+  delete listeners.Release(listeners.default_result_printer());
+  listeners.Append(new TestNamePrinter);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_sole_header_test.cc b/vendor/gtest-1.7.0/test/gtest_sole_header_test.cc
new file mode 100644
index 0000000..ccd091a
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_sole_header_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// This test verifies that it's possible to use Google Test by including
+// the gtest.h header file alone.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+void Subroutine() {
+  EXPECT_EQ(42, 42);
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailure) {
+  EXPECT_NO_FATAL_FAILURE(;);
+  EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  EXPECT_NO_FATAL_FAILURE(Subroutine());
+  EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+TEST(NoFatalFailureTest, AssertNoFatalFailure) {
+  ASSERT_NO_FATAL_FAILURE(;);
+  ASSERT_NO_FATAL_FAILURE(SUCCEED());
+  ASSERT_NO_FATAL_FAILURE(Subroutine());
+  ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+}  // namespace
diff --git a/vendor/gtest-1.7.0/test/gtest_stress_test.cc b/vendor/gtest-1.7.0/test/gtest_stress_test.cc
new file mode 100644
index 0000000..e7daa43
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_stress_test.cc
@@ -0,0 +1,256 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests that SCOPED_TRACE() and various Google Test assertions can be
+// used in a large number of threads concurrently.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+#include <vector>
+
+// We must define this macro in order to #include
+// gtest-internal-inl.h.  This is how Google Test prevents a user from
+// accidentally depending on its internal implementation.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_IS_THREADSAFE
+
+namespace testing {
+namespace {
+
+using internal::Notification;
+using internal::TestPropertyKeyIs;
+using internal::ThreadWithParam;
+using internal::scoped_ptr;
+
+// In order to run tests in this file, for platforms where Google Test is
+// thread safe, implement ThreadWithParam. See the description of its API
+// in gtest-port.h, where it is defined for already supported platforms.
+
+// How many threads to create?
+const int kThreadCount = 50;
+
+std::string IdToKey(int id, const char* suffix) {
+  Message key;
+  key << "key_" << id << "_" << suffix;
+  return key.GetString();
+}
+
+std::string IdToString(int id) {
+  Message id_message;
+  id_message << id;
+  return id_message.GetString();
+}
+
+void ExpectKeyAndValueWereRecordedForId(
+    const std::vector<TestProperty>& properties,
+    int id, const char* suffix) {
+  TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());
+  const std::vector<TestProperty>::const_iterator property =
+      std::find_if(properties.begin(), properties.end(), matches_key);
+  ASSERT_TRUE(property != properties.end())
+      << "expecting " << suffix << " value for id " << id;
+  EXPECT_STREQ(IdToString(id).c_str(), property->value());
+}
+
+// Calls a large number of Google Test assertions, where exactly one of them
+// will fail.
+void ManyAsserts(int id) {
+  GTEST_LOG_(INFO) << "Thread #" << id << " running...";
+
+  SCOPED_TRACE(Message() << "Thread #" << id);
+
+  for (int i = 0; i < kThreadCount; i++) {
+    SCOPED_TRACE(Message() << "Iteration #" << i);
+
+    // A bunch of assertions that should succeed.
+    EXPECT_TRUE(true);
+    ASSERT_FALSE(false) << "This shouldn't fail.";
+    EXPECT_STREQ("a", "a");
+    ASSERT_LE(5, 6);
+    EXPECT_EQ(i, i) << "This shouldn't fail.";
+
+    // RecordProperty() should interact safely with other threads as well.
+    // The shared_key forces property updates.
+    Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str());
+    Test::RecordProperty(IdToKey(id, "int").c_str(), id);
+    Test::RecordProperty("shared_key", IdToString(id).c_str());
+
+    // This assertion should fail kThreadCount times per thread.  It
+    // is for testing whether Google Test can handle failed assertions in a
+    // multi-threaded context.
+    EXPECT_LT(i, 0) << "This should always fail.";
+  }
+}
+
+void CheckTestFailureCount(int expected_failures) {
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+  GTEST_CHECK_(expected_failures == result->total_part_count())
+      << "Logged " << result->total_part_count() << " failures "
+      << " vs. " << expected_failures << " expected";
+}
+
+// Tests using SCOPED_TRACE() and Google Test assertions in many threads
+// concurrently.
+TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {
+  {
+    scoped_ptr<ThreadWithParam<int> > threads[kThreadCount];
+    Notification threads_can_start;
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i].reset(new ThreadWithParam<int>(&ManyAsserts,
+                                                i,
+                                                &threads_can_start));
+
+    threads_can_start.Notify();
+
+    // Blocks until all the threads are done.
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i]->Join();
+  }
+
+  // Ensures that kThreadCount*kThreadCount failures have been reported.
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+
+  std::vector<TestProperty> properties;
+  // We have no access to the TestResult's list of properties but we can
+  // copy them one by one.
+  for (int i = 0; i < result->test_property_count(); ++i)
+    properties.push_back(result->GetTestProperty(i));
+
+  EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count())
+      << "String and int values recorded on each thread, "
+      << "as well as one shared_key";
+  for (int i = 0; i < kThreadCount; ++i) {
+    ExpectKeyAndValueWereRecordedForId(properties, i, "string");
+    ExpectKeyAndValueWereRecordedForId(properties, i, "int");
+  }
+  CheckTestFailureCount(kThreadCount*kThreadCount);
+}
+
+void FailingThread(bool is_fatal) {
+  if (is_fatal)
+    FAIL() << "Fatal failure in some other thread. "
+           << "(This failure is expected.)";
+  else
+    ADD_FAILURE() << "Non-fatal failure in some other thread. "
+                  << "(This failure is expected.)";
+}
+
+void GenerateFatalFailureInAnotherThread(bool is_fatal) {
+  ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL);
+  thread.Join();
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {
+  EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+void AssertNoFatalFailureIgnoresFailuresInOtherThreads() {
+  ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+}
+TEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {
+  // Using a subroutine, to make sure, that the test continues.
+  AssertNoFatalFailureIgnoresFailuresInOtherThreads();
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+TEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures.
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+TEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false),
+                          "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(false), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures,
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+}  // namespace
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  const int result = RUN_ALL_TESTS();  // Expected to fail.
+  GTEST_CHECK_(result == 1) << "RUN_ALL_TESTS() did not fail as expected";
+
+  printf("\nPASS\n");
+  return 0;
+}
+
+#else
+TEST(StressTest,
+     DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) {
+}
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+#endif  // GTEST_IS_THREADSAFE
diff --git a/vendor/gtest-1.7.0/test/gtest_test_utils.py b/vendor/gtest-1.7.0/test/gtest_test_utils.py
new file mode 100755
index 0000000..28884bd
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_test_utils.py
@@ -0,0 +1,320 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for Google C++ Testing Framework."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import atexit
+import os
+import shutil
+import sys
+import tempfile
+import unittest
+_test_module = unittest
+
+# Suppresses the 'Import not at the top of the file' lint complaint.
+# pylint: disable-msg=C6204
+try:
+  import subprocess
+  _SUBPROCESS_MODULE_AVAILABLE = True
+except:
+  import popen2
+  _SUBPROCESS_MODULE_AVAILABLE = False
+# pylint: enable-msg=C6204
+
+GTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'
+
+IS_WINDOWS = os.name == 'nt'
+IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]
+
+# The environment variable for specifying the path to the premature-exit file.
+PREMATURE_EXIT_FILE_ENV_VAR = 'TEST_PREMATURE_EXIT_FILE'
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets/unsets an environment variable to a given value."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+# Here we expose a class from a particular module, depending on the
+# environment. The comment suppresses the 'Invalid variable name' lint
+# complaint.
+TestCase = _test_module.TestCase  # pylint: disable-msg=C6409
+
+# Initially maps a flag to its default value. After
+# _ParseAndStripGTestFlags() is called, maps a flag to its actual value.
+_flag_map = {'source_dir': os.path.dirname(sys.argv[0]),
+             'build_dir': os.path.dirname(sys.argv[0])}
+_gtest_flags_are_parsed = False
+
+
+def _ParseAndStripGTestFlags(argv):
+  """Parses and strips Google Test flags from argv.  This is idempotent."""
+
+  # Suppresses the lint complaint about a global variable since we need it
+  # here to maintain module-wide state.
+  global _gtest_flags_are_parsed  # pylint: disable-msg=W0603
+  if _gtest_flags_are_parsed:
+    return
+
+  _gtest_flags_are_parsed = True
+  for flag in _flag_map:
+    # The environment variable overrides the default value.
+    if flag.upper() in os.environ:
+      _flag_map[flag] = os.environ[flag.upper()]
+
+    # The command line flag overrides the environment variable.
+    i = 1  # Skips the program name.
+    while i < len(argv):
+      prefix = '--' + flag + '='
+      if argv[i].startswith(prefix):
+        _flag_map[flag] = argv[i][len(prefix):]
+        del argv[i]
+        break
+      else:
+        # We don't increment i in case we just found a --gtest_* flag
+        # and removed it from argv.
+        i += 1
+
+
+def GetFlag(flag):
+  """Returns the value of the given flag."""
+
+  # In case GetFlag() is called before Main(), we always call
+  # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags
+  # are parsed.
+  _ParseAndStripGTestFlags(sys.argv)
+
+  return _flag_map[flag]
+
+
+def GetSourceDir():
+  """Returns the absolute path of the directory where the .py files are."""
+
+  return os.path.abspath(GetFlag('source_dir'))
+
+
+def GetBuildDir():
+  """Returns the absolute path of the directory where the test binaries are."""
+
+  return os.path.abspath(GetFlag('build_dir'))
+
+
+_temp_dir = None
+
+def _RemoveTempDir():
+  if _temp_dir:
+    shutil.rmtree(_temp_dir, ignore_errors=True)
+
+atexit.register(_RemoveTempDir)
+
+
+def GetTempDir():
+  """Returns a directory for temporary files."""
+
+  global _temp_dir
+  if not _temp_dir:
+    _temp_dir = tempfile.mkdtemp()
+  return _temp_dir
+
+
+def GetTestExecutablePath(executable_name, build_dir=None):
+  """Returns the absolute path of the test binary given its name.
+
+  The function will print a message and abort the program if the resulting file
+  doesn't exist.
+
+  Args:
+    executable_name: name of the test binary that the test script runs.
+    build_dir:       directory where to look for executables, by default
+                     the result of GetBuildDir().
+
+  Returns:
+    The absolute path of the test binary.
+  """
+
+  path = os.path.abspath(os.path.join(build_dir or GetBuildDir(),
+                                      executable_name))
+  if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'):
+    path += '.exe'
+
+  if not os.path.exists(path):
+    message = (
+        'Unable to find the test binary. Please make sure to provide path\n'
+        'to the binary via the --build_dir flag or the BUILD_DIR\n'
+        'environment variable.')
+    print >> sys.stderr, message
+    sys.exit(1)
+
+  return path
+
+
+def GetExitStatus(exit_code):
+  """Returns the argument to exit(), or -1 if exit() wasn't called.
+
+  Args:
+    exit_code: the result value of os.system(command).
+  """
+
+  if os.name == 'nt':
+    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns
+    # the argument to exit() directly.
+    return exit_code
+  else:
+    # On Unix, os.WEXITSTATUS() must be used to extract the exit status
+    # from the result of os.system().
+    if os.WIFEXITED(exit_code):
+      return os.WEXITSTATUS(exit_code)
+    else:
+      return -1
+
+
+class Subprocess:
+  def __init__(self, command, working_dir=None, capture_stderr=True, env=None):
+    """Changes into a specified directory, if provided, and executes a command.
+
+    Restores the old directory afterwards.
+
+    Args:
+      command:        The command to run, in the form of sys.argv.
+      working_dir:    The directory to change into.
+      capture_stderr: Determines whether to capture stderr in the output member
+                      or to discard it.
+      env:            Dictionary with environment to pass to the subprocess.
+
+    Returns:
+      An object that represents outcome of the executed process. It has the
+      following attributes:
+        terminated_by_signal   True iff the child process has been terminated
+                               by a signal.
+        signal                 Sygnal that terminated the child process.
+        exited                 True iff the child process exited normally.
+        exit_code              The code with which the child process exited.
+        output                 Child process's stdout and stderr output
+                               combined in a string.
+    """
+
+    # The subprocess module is the preferrable way of running programs
+    # since it is available and behaves consistently on all platforms,
+    # including Windows. But it is only available starting in python 2.4.
+    # In earlier python versions, we revert to the popen2 module, which is
+    # available in python 2.0 and later but doesn't provide required
+    # functionality (Popen4) under Windows. This allows us to support Mac
+    # OS X 10.4 Tiger, which has python 2.3 installed.
+    if _SUBPROCESS_MODULE_AVAILABLE:
+      if capture_stderr:
+        stderr = subprocess.STDOUT
+      else:
+        stderr = subprocess.PIPE
+
+      p = subprocess.Popen(command,
+                           stdout=subprocess.PIPE, stderr=stderr,
+                           cwd=working_dir, universal_newlines=True, env=env)
+      # communicate returns a tuple with the file obect for the child's
+      # output.
+      self.output = p.communicate()[0]
+      self._return_code = p.returncode
+    else:
+      old_dir = os.getcwd()
+
+      def _ReplaceEnvDict(dest, src):
+        # Changes made by os.environ.clear are not inheritable by child
+        # processes until Python 2.6. To produce inheritable changes we have
+        # to delete environment items with the del statement.
+        for key in dest.keys():
+          del dest[key]
+        dest.update(src)
+
+      # When 'env' is not None, backup the environment variables and replace
+      # them with the passed 'env'. When 'env' is None, we simply use the
+      # current 'os.environ' for compatibility with the subprocess.Popen
+      # semantics used above.
+      if env is not None:
+        old_environ = os.environ.copy()
+        _ReplaceEnvDict(os.environ, env)
+
+      try:
+        if working_dir is not None:
+          os.chdir(working_dir)
+        if capture_stderr:
+          p = popen2.Popen4(command)
+        else:
+          p = popen2.Popen3(command)
+        p.tochild.close()
+        self.output = p.fromchild.read()
+        ret_code = p.wait()
+      finally:
+        os.chdir(old_dir)
+
+        # Restore the old environment variables
+        # if they were replaced.
+        if env is not None:
+          _ReplaceEnvDict(os.environ, old_environ)
+
+      # Converts ret_code to match the semantics of
+      # subprocess.Popen.returncode.
+      if os.WIFSIGNALED(ret_code):
+        self._return_code = -os.WTERMSIG(ret_code)
+      else:  # os.WIFEXITED(ret_code) should return True here.
+        self._return_code = os.WEXITSTATUS(ret_code)
+
+    if self._return_code < 0:
+      self.terminated_by_signal = True
+      self.exited = False
+      self.signal = -self._return_code
+    else:
+      self.terminated_by_signal = False
+      self.exited = True
+      self.exit_code = self._return_code
+
+
+def Main():
+  """Runs the unit test."""
+
+  # We must call _ParseAndStripGTestFlags() before calling
+  # unittest.main().  Otherwise the latter will be confused by the
+  # --gtest_* flags.
+  _ParseAndStripGTestFlags(sys.argv)
+  # The tested binaries should not be writing XML output files unless the
+  # script explicitly instructs them to.
+  # TODO(vladl at google.com): Move this into Subprocess when we implement
+  # passing environment into it as a parameter.
+  if GTEST_OUTPUT_VAR_NAME in os.environ:
+    del os.environ[GTEST_OUTPUT_VAR_NAME]
+
+  _test_module.main()
diff --git a/vendor/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
new file mode 100644
index 0000000..8d46c76
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
@@ -0,0 +1,92 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions enabled.
+
+#include "gtest/gtest.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdexcept>
+
+// Prints the given failure message and exits the program with
+// non-zero.  We use this instead of a Google Test assertion to
+// indicate a failure, as the latter is been tested and cannot be
+// relied on.
+void Fail(const char* msg) {
+  printf("FAILURE: %s\n", msg);
+  fflush(stdout);
+  exit(1);
+}
+
+// Tests that an assertion failure throws a subclass of
+// std::runtime_error.
+void TestFailureThrowsRuntimeError() {
+  testing::GTEST_FLAG(throw_on_failure) = true;
+
+  // A successful assertion shouldn't throw.
+  try {
+    EXPECT_EQ(3, 3);
+  } catch(...) {
+    Fail("A successful assertion wrongfully threw.");
+  }
+
+  // A failed assertion should throw a subclass of std::runtime_error.
+  try {
+    EXPECT_EQ(2, 3) << "Expected failure";
+  } catch(const std::runtime_error& e) {
+    if (strstr(e.what(), "Expected failure") != NULL)
+      return;
+
+    printf("%s",
+           "A failed assertion did throw an exception of the right type, "
+           "but the message is incorrect.  Instead of containing \"Expected "
+           "failure\", it is:\n");
+    Fail(e.what());
+  } catch(...) {
+    Fail("A failed assertion threw the wrong type of exception.");
+  }
+  Fail("A failed assertion should've thrown but didn't.");
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the thrown-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  TestFailureThrowsRuntimeError();
+  return 0;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test.py b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test.py
new file mode 100755
index 0000000..5678ffe
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's throw-on-failure mode with exceptions disabled.
+
+This script invokes gtest_throw_on_failure_test_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+# Constants.
+
+# The command line flag for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE = 'gtest_throw_on_failure'
+
+# Path to the gtest_throw_on_failure_test_ program, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_throw_on_failure_test_')
+
+
+# Utilities.
+
+
+def SetEnvVar(env_var, value):
+  """Sets an environment variable to a given value; unsets it when the
+  given value is None.
+  """
+
+  env_var = env_var.upper()
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def Run(command):
+  """Runs a command; returns True/False if its exit code is/isn't 0."""
+
+  print 'Running "%s". . .' % ' '.join(command)
+  p = gtest_test_utils.Subprocess(command)
+  return p.exited and p.exit_code == 0
+
+
+# The tests.  TODO(wan at google.com): refactor the class to share common
+# logic with code in gtest_break_on_failure_unittest.py.
+class ThrowOnFailureTest(gtest_test_utils.TestCase):
+  """Tests the throw-on-failure mode."""
+
+  def RunAndVerify(self, env_var_value, flag_value, should_fail):
+    """Runs gtest_throw_on_failure_test_ and verifies that it does
+    (or does not) exit with a non-zero code.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      should_fail:      True iff the program is expected to fail.
+    """
+
+    SetEnvVar(THROW_ON_FAILURE, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % THROW_ON_FAILURE
+    else:
+      flag = '--%s' % THROW_ON_FAILURE
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if should_fail:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    failed = not Run(command)
+
+    SetEnvVar(THROW_ON_FAILURE, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero '
+           'exit code.' %
+           (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(failed == should_fail, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)
+
+  def testThrowOnFailureEnvVar(self):
+    """Tests using the GTEST_THROW_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      should_fail=True)
+
+  def testThrowOnFailureFlag(self):
+    """Tests using the --gtest_throw_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      should_fail=True)
+
+  def testThrowOnFailureFlagOverridesEnvVar(self):
+    """Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      should_fail=True)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      should_fail=True)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
new file mode 100644
index 0000000..2b88fe3
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
@@ -0,0 +1,72 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions disabled.
+//
+// This program must be compiled with exceptions disabled.  It will be
+// invoked by gtest_throw_on_failure_test.py, and is expected to exit
+// with non-zero in the throw-on-failure mode or 0 otherwise.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>                      // for fflush, fprintf, NULL, etc.
+#include <stdlib.h>                     // for exit
+#include <exception>                    // for set_terminate
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(1);
+}
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the throw-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  // In the throw-on-failure mode with exceptions disabled, this
+  // assertion will cause the program to exit with a non-zero code.
+  EXPECT_EQ(2, 3);
+
+  // When not in the throw-on-failure mode, the control will reach
+  // here.
+  return 0;
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_uninitialized_test.py b/vendor/gtest-1.7.0/test/gtest_uninitialized_test.py
new file mode 100755
index 0000000..6ae57ee
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_uninitialized_test.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test warns the user when not initialized properly."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_')
+
+
+def Assert(condition):
+  if not condition:
+    raise AssertionError
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def TestExitCodeAndOutput(command):
+  """Runs the given command and verifies its exit code and output."""
+
+  # Verifies that 'command' exits with code 1.
+  p = gtest_test_utils.Subprocess(command)
+  Assert(p.exited)
+  AssertEq(1, p.exit_code)
+  Assert('InitGoogleTest' in p.output)
+
+
+class GTestUninitializedTest(gtest_test_utils.TestCase):
+  def testExitCodeAndOutput(self):
+    TestExitCodeAndOutput(COMMAND)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_uninitialized_test_.cc b/vendor/gtest-1.7.0/test/gtest_uninitialized_test_.cc
new file mode 100644
index 0000000..4431698
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_uninitialized_test_.cc
@@ -0,0 +1,43 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+TEST(DummyTest, Dummy) {
+  // This test doesn't verify anything.  We just need it to create a
+  // realistic stage for testing the behavior of Google Test when
+  // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being
+  // called first.
+}
+
+int main() {
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_unittest.cc b/vendor/gtest-1.7.0/test/gtest_unittest.cc
new file mode 100644
index 0000000..0cab07d
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_unittest.cc
@@ -0,0 +1,7415 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+// Verifies that the command line flag variables can be accessed
+// in code once <gtest/gtest.h> has been #included.
+// Do not move it after other #includes.
+TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
+  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)
+      || testing::GTEST_FLAG(break_on_failure)
+      || testing::GTEST_FLAG(catch_exceptions)
+      || testing::GTEST_FLAG(color) != "unknown"
+      || testing::GTEST_FLAG(filter) != "unknown"
+      || testing::GTEST_FLAG(list_tests)
+      || testing::GTEST_FLAG(output) != "unknown"
+      || testing::GTEST_FLAG(print_time)
+      || testing::GTEST_FLAG(random_seed)
+      || testing::GTEST_FLAG(repeat) > 0
+      || testing::GTEST_FLAG(show_internal_stack_frames)
+      || testing::GTEST_FLAG(shuffle)
+      || testing::GTEST_FLAG(stack_trace_depth) > 0
+      || testing::GTEST_FLAG(stream_result_to) != "unknown"
+      || testing::GTEST_FLAG(throw_on_failure);
+  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.
+}
+
+#include <limits.h>  // For INT_MAX.
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <map>
+#include <vector>
+#include <ostream>
+
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+class StreamingListenerTest : public Test {
+ public:
+  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter {
+   public:
+    // Sends a string to the socket.
+    virtual void Send(const string& message) { output_ += message; }
+
+    string output_;
+  };
+
+  StreamingListenerTest()
+      : fake_sock_writer_(new FakeSocketWriter),
+        streamer_(fake_sock_writer_),
+        test_info_obj_("FooTest", "Bar", NULL, NULL, 0, NULL) {}
+
+ protected:
+  string* output() { return &(fake_sock_writer_->output_); }
+
+  FakeSocketWriter* const fake_sock_writer_;
+  StreamingListener streamer_;
+  UnitTest unit_test_;
+  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test.
+};
+
+TEST_F(StreamingListenerTest, OnTestProgramEnd) {
+  *output() = "";
+  streamer_.OnTestProgramEnd(unit_test_);
+  EXPECT_EQ("event=TestProgramEnd&passed=1\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestIterationEnd) {
+  *output() = "";
+  streamer_.OnTestIterationEnd(unit_test_, 42);
+  EXPECT_EQ("event=TestIterationEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseStart) {
+  *output() = "";
+  streamer_.OnTestCaseStart(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseStart&name=FooTest\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseEnd) {
+  *output() = "";
+  streamer_.OnTestCaseEnd(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestStart) {
+  *output() = "";
+  streamer_.OnTestStart(test_info_obj_);
+  EXPECT_EQ("event=TestStart&name=Bar\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestEnd) {
+  *output() = "";
+  streamer_.OnTestEnd(test_info_obj_);
+  EXPECT_EQ("event=TestEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestPartResult) {
+  *output() = "";
+  streamer_.OnTestPartResult(TestPartResult(
+      TestPartResult::kFatalFailure, "foo.cc", 42, "failed=\n&%"));
+
+  // Meta characters in the failure message should be properly escaped.
+  EXPECT_EQ(
+      "event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\n",
+      *output());
+}
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Provides access to otherwise private parts of the TestEventListeners class
+// that are needed to test it.
+class TestEventListenersAccessor {
+ public:
+  static TestEventListener* GetRepeater(TestEventListeners* listeners) {
+    return listeners->repeater();
+  }
+
+  static void SetDefaultResultPrinter(TestEventListeners* listeners,
+                                      TestEventListener* listener) {
+    listeners->SetDefaultResultPrinter(listener);
+  }
+  static void SetDefaultXmlGenerator(TestEventListeners* listeners,
+                                     TestEventListener* listener) {
+    listeners->SetDefaultXmlGenerator(listener);
+  }
+
+  static bool EventForwardingEnabled(const TestEventListeners& listeners) {
+    return listeners.EventForwardingEnabled();
+  }
+
+  static void SuppressEventForwarding(TestEventListeners* listeners) {
+    listeners->SuppressEventForwarding();
+  }
+};
+
+class UnitTestRecordPropertyTestHelper : public Test {
+ protected:
+  UnitTestRecordPropertyTestHelper() {}
+
+  // Forwards to UnitTest::RecordProperty() to bypass access controls.
+  void UnitTestRecordProperty(const char* key, const std::string& value) {
+    unit_test_.RecordProperty(key, value);
+  }
+
+  UnitTest unit_test_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+using testing::AssertionFailure;
+using testing::AssertionResult;
+using testing::AssertionSuccess;
+using testing::DoubleLE;
+using testing::EmptyTestEventListener;
+using testing::Environment;
+using testing::FloatLE;
+using testing::GTEST_FLAG(also_run_disabled_tests);
+using testing::GTEST_FLAG(break_on_failure);
+using testing::GTEST_FLAG(catch_exceptions);
+using testing::GTEST_FLAG(color);
+using testing::GTEST_FLAG(death_test_use_fork);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(list_tests);
+using testing::GTEST_FLAG(output);
+using testing::GTEST_FLAG(print_time);
+using testing::GTEST_FLAG(random_seed);
+using testing::GTEST_FLAG(repeat);
+using testing::GTEST_FLAG(show_internal_stack_frames);
+using testing::GTEST_FLAG(shuffle);
+using testing::GTEST_FLAG(stack_trace_depth);
+using testing::GTEST_FLAG(stream_result_to);
+using testing::GTEST_FLAG(throw_on_failure);
+using testing::IsNotSubstring;
+using testing::IsSubstring;
+using testing::Message;
+using testing::ScopedFakeTestPartResultReporter;
+using testing::StaticAssertTypeEq;
+using testing::Test;
+using testing::TestCase;
+using testing::TestEventListeners;
+using testing::TestInfo;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+using testing::TestProperty;
+using testing::TestResult;
+using testing::TimeInMillis;
+using testing::UnitTest;
+using testing::kMaxStackTraceDepth;
+using testing::internal::AddReference;
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+using testing::internal::AppendUserMessage;
+using testing::internal::ArrayAwareFind;
+using testing::internal::ArrayEq;
+using testing::internal::CodePointToUtf8;
+using testing::internal::CompileAssertTypesEqual;
+using testing::internal::CopyArray;
+using testing::internal::CountIf;
+using testing::internal::EqFailure;
+using testing::internal::FloatingPoint;
+using testing::internal::ForEach;
+using testing::internal::FormatEpochTimeInMillisAsIso8601;
+using testing::internal::FormatTimeInMillisAsSeconds;
+using testing::internal::GTestFlagSaver;
+using testing::internal::GetCurrentOsStackTraceExceptTop;
+using testing::internal::GetElementOr;
+using testing::internal::GetNextRandomSeed;
+using testing::internal::GetRandomSeedFromFlag;
+using testing::internal::GetTestTypeId;
+using testing::internal::GetTimeInMillis;
+using testing::internal::GetTypeId;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::ImplicitlyConvertible;
+using testing::internal::Int32;
+using testing::internal::Int32FromEnvOrDie;
+using testing::internal::IsAProtocolMessage;
+using testing::internal::IsContainer;
+using testing::internal::IsContainerTest;
+using testing::internal::IsNotContainer;
+using testing::internal::NativeArray;
+using testing::internal::ParseInt32Flag;
+using testing::internal::RemoveConst;
+using testing::internal::RemoveReference;
+using testing::internal::ShouldRunTestOnShard;
+using testing::internal::ShouldShard;
+using testing::internal::ShouldUseColor;
+using testing::internal::Shuffle;
+using testing::internal::ShuffleRange;
+using testing::internal::SkipPrefix;
+using testing::internal::StreamableToString;
+using testing::internal::String;
+using testing::internal::TestEventListenersAccessor;
+using testing::internal::TestResultAccessor;
+using testing::internal::UInt32;
+using testing::internal::WideStringToUtf8;
+using testing::internal::kCopy;
+using testing::internal::kMaxRandomSeed;
+using testing::internal::kReference;
+using testing::internal::kTestTypeIdInGoogleTest;
+using testing::internal::scoped_ptr;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+using testing::internal::CaptureStdout;
+using testing::internal::GetCapturedStdout;
+#endif
+
+#if GTEST_IS_THREADSAFE
+using testing::internal::ThreadWithParam;
+#endif
+
+class TestingVector : public std::vector<int> {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const TestingVector& vector) {
+  os << "{ ";
+  for (size_t i = 0; i < vector.size(); i++) {
+    os << vector[i] << " ";
+  }
+  os << "}";
+  return os;
+}
+
+// This line tests that we can define tests in an unnamed namespace.
+namespace {
+
+TEST(GetRandomSeedFromFlagTest, HandlesZero) {
+  const int seed = GetRandomSeedFromFlag(0);
+  EXPECT_LE(1, seed);
+  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {
+  EXPECT_EQ(1, GetRandomSeedFromFlag(1));
+  EXPECT_EQ(2, GetRandomSeedFromFlag(2));
+  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetRandomSeedFromFlag(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {
+  const int seed1 = GetRandomSeedFromFlag(-1);
+  EXPECT_LE(1, seed1);
+  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));
+
+  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);
+  EXPECT_LE(1, seed2);
+  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetNextRandomSeedTest, WorksForValidInput) {
+  EXPECT_EQ(2, GetNextRandomSeed(1));
+  EXPECT_EQ(3, GetNextRandomSeed(2));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetNextRandomSeed(kMaxRandomSeed - 1));
+  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));
+
+  // We deliberately don't test GetNextRandomSeed() with invalid
+  // inputs, as that requires death tests, which are expensive.  This
+  // is fine as GetNextRandomSeed() is internal and has a
+  // straightforward definition.
+}
+
+static void ClearCurrentTestPartResults() {
+  TestResultAccessor::ClearTestPartResults(
+      GetUnitTestImpl()->current_test_result());
+}
+
+// Tests GetTypeId.
+
+TEST(GetTypeIdTest, ReturnsSameValueForSameType) {
+  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());
+  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());
+}
+
+class SubClassOfTest : public Test {};
+class AnotherSubClassOfTest : public Test {};
+
+TEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());
+  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());
+}
+
+// Verifies that GetTestTypeId() returns the same value, no matter it
+// is called from inside Google Test or outside of it.
+TEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {
+  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());
+}
+
+// Tests FormatTimeInMillisAsSeconds().
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {
+  EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {
+  EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3));
+  EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10));
+  EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200));
+  EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200));
+  EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {
+  EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3));
+  EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10));
+  EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200));
+  EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200));
+  EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
+}
+
+// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion
+// for particular dates below was verified in Python using
+// datetime.datetime.fromutctimestamp(<timetamp>/1000).
+
+// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we
+// have to set up a particular timezone to obtain predictable results.
+class FormatEpochTimeInMillisAsIso8601Test : public Test {
+ public:
+  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed
+  // 32 bits, even when 64-bit integer types are available.  We have to
+  // force the constants to have a 64-bit type here.
+  static const TimeInMillis kMillisPerSec = 1000;
+
+ private:
+  virtual void SetUp() {
+    saved_tz_ = NULL;
+#if _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe
+                                // for getenv, function is deprecated for
+                                // strdup).
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+#endif
+
+    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We
+    // cannot use the local time zone because the function's output depends
+    // on the time zone.
+    SetTimeZone("UTC+00");
+  }
+
+  virtual void TearDown() {
+    SetTimeZone(saved_tz_);
+    free(const_cast<char*>(saved_tz_));
+    saved_tz_ = NULL;
+  }
+
+  static void SetTimeZone(const char* time_zone) {
+    // tzset() distinguishes between the TZ variable being present and empty
+    // and not being present, so we have to consider the case of time_zone
+    // being NULL.
+#if _MSC_VER
+    // ...Unless it's MSVC, whose standard library's _putenv doesn't
+    // distinguish between an empty and a missing variable.
+    const std::string env_var =
+        std::string("TZ=") + (time_zone ? time_zone : "");
+    _putenv(env_var.c_str());
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function is deprecated).
+    tzset();
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (time_zone) {
+      setenv(("TZ"), time_zone, 1);
+    } else {
+      unsetenv("TZ");
+    }
+    tzset();
+#endif
+  }
+
+  const char* saved_tz_;
+};
+
+const TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {
+  EXPECT_EQ("2011-10-31T18:52:42",
+            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {
+  EXPECT_EQ(
+      "2011-10-31T18:52:42",
+      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {
+  EXPECT_EQ("2011-09-03T05:07:02",
+            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {
+  EXPECT_EQ("2011-09-28T17:08:22",
+            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {
+  EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0));
+}
+
+#if GTEST_CAN_COMPARE_NULL
+
+# ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+#  pragma option push -w-ccc -w-rch
+# endif
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null
+// pointer literal.
+TEST(NullLiteralTest, IsTrueForNullLiterals) {
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));
+}
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null
+// pointer literal.
+TEST(NullLiteralTest, IsFalseForNonNullLiterals) {
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));
+}
+
+# ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+#  pragma option pop
+# endif
+
+#endif  // GTEST_CAN_COMPARE_NULL
+//
+// Tests CodePointToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeNul) {
+  EXPECT_EQ("", CodePointToUtf8(L'\0'));
+}
+
+// Tests that ASCII characters are encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeAscii) {
+  EXPECT_EQ("a", CodePointToUtf8(L'a'));
+  EXPECT_EQ("Z", CodePointToUtf8(L'Z'));
+  EXPECT_EQ("&", CodePointToUtf8(L'&'));
+  EXPECT_EQ("\x7F", CodePointToUtf8(L'\x7F'));
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_EQ("\xC3\x93", CodePointToUtf8(L'\xD3'));
+
+  // 101 0111 0110 => 110-10101 10-110110
+  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints
+  // in wide strings and wide chars. In order to accomodate them, we have to
+  // introduce such character constants as integers.
+  EXPECT_EQ("\xD5\xB6",
+            CodePointToUtf8(static_cast<wchar_t>(0x576)));
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  EXPECT_EQ("\xE0\xA3\x93",
+            CodePointToUtf8(static_cast<wchar_t>(0x8D3)));
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  EXPECT_EQ("\xEC\x9D\x8D",
+            CodePointToUtf8(static_cast<wchar_t>(0xC74D)));
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests in this group require a wchar_t to hold > 16 bits, and thus
+// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is
+// 16-bit wide. This code may not compile on those systems.
+
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_EQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3'));
+
+  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000
+  EXPECT_EQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400'));
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_EQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634'));
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_EQ("(Invalid Unicode 0x1234ABCD)", CodePointToUtf8(L'\x1234ABCD'));
+}
+
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests WideStringToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeNul) {
+  EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str());
+  EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str());
+}
+
+// Tests that ASCII strings are encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeAscii) {
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str());
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str());
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str());
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str());
+
+  // 101 0111 0110 => 110-10101 10-110110
+  const wchar_t s[] = { 0x576, '\0' };
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, 1).c_str());
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  const wchar_t s1[] = { 0x8D3, '\0' };
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, 1).c_str());
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, -1).c_str());
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  const wchar_t s2[] = { 0xC74D, '\0' };
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, 1).c_str());
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, -1).c_str());
+}
+
+// Tests that the conversion stops when the function encounters \0 character.
+TEST(WideStringToUtf8Test, StopsOnNulCharacter) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str());
+}
+
+// Tests that the conversion stops when the function reaches the limit
+// specified by the 'length' parameter.
+TEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str());
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile
+// on the systems using UTF-16 encoding.
+TEST(WideStringToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str());
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str());
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str());
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str());
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_STREQ("(Invalid Unicode 0xABCDFF)",
+               WideStringToUtf8(L"\xABCDFF", -1).c_str());
+}
+#else  // !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that surrogate pairs are encoded correctly on the systems using
+// UTF-16 encoding in the wide strings.
+TEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {
+  const wchar_t s[] = { 0xD801, 0xDC00, '\0' };
+  EXPECT_STREQ("\xF0\x90\x90\x80", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that encoding an invalid UTF-16 surrogate pair
+// generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {
+  // Leading surrogate is at the end of the string.
+  const wchar_t s1[] = { 0xD800, '\0' };
+  EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(s1, -1).c_str());
+  // Leading surrogate is not followed by the trailing surrogate.
+  const wchar_t s2[] = { 0xD800, 'M', '\0' };
+  EXPECT_STREQ("\xED\xA0\x80M", WideStringToUtf8(s2, -1).c_str());
+  // Trailing surrogate appearas without a leading surrogate.
+  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\0' };
+  EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(s3, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests that codepoint concatenation works correctly.
+#if !GTEST_WIDE_STRING_USES_UTF16_
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0x108634, 0xC74D, '\n', 0x576, 0x8D3, 0x108634, '\0'};
+  EXPECT_STREQ(
+      "\xF4\x88\x98\xB4"
+          "\xEC\x9D\x8D"
+          "\n"
+          "\xD5\xB6"
+          "\xE0\xA3\x93"
+          "\xF4\x88\x98\xB4",
+      WideStringToUtf8(s, -1).c_str());
+}
+#else
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0xC74D, '\n', 0x576, 0x8D3, '\0'};
+  EXPECT_STREQ(
+      "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93",
+      WideStringToUtf8(s, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests the Random class.
+
+TEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {
+  testing::internal::Random random(42);
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(0),
+      "Cannot generate a number in the range \\[0, 0\\)");
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(testing::internal::Random::kMaxRange + 1),
+      "Generation of a number in \\[0, 2147483649\\) was requested, "
+      "but this can only generate numbers in \\[0, 2147483648\\)");
+}
+
+TEST(RandomTest, GeneratesNumbersWithinRange) {
+  const UInt32 kRange = 10000;
+  testing::internal::Random random(12345);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i;
+  }
+
+  testing::internal::Random random2(testing::internal::Random::kMaxRange);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i;
+  }
+}
+
+TEST(RandomTest, RepeatsWhenReseeded) {
+  const int kSeed = 123;
+  const int kArraySize = 10;
+  const UInt32 kRange = 10000;
+  UInt32 values[kArraySize];
+
+  testing::internal::Random random(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    values[i] = random.Generate(kRange);
+  }
+
+  random.Reseed(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i;
+  }
+}
+
+// Tests STL container utilities.
+
+// Tests CountIf().
+
+static bool IsPositive(int n) { return n > 0; }
+
+TEST(ContainerUtilityTest, CountIf) {
+  std::vector<int> v;
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.
+
+  v.push_back(-1);
+  v.push_back(0);
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.
+
+  v.push_back(2);
+  v.push_back(-10);
+  v.push_back(10);
+  EXPECT_EQ(2, CountIf(v, IsPositive));
+}
+
+// Tests ForEach().
+
+static int g_sum = 0;
+static void Accumulate(int n) { g_sum += n; }
+
+TEST(ContainerUtilityTest, ForEach) {
+  std::vector<int> v;
+  g_sum = 0;
+  ForEach(v, Accumulate);
+  EXPECT_EQ(0, g_sum);  // Works for an empty container;
+
+  g_sum = 0;
+  v.push_back(1);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(1, g_sum);  // Works for a container with one element.
+
+  g_sum = 0;
+  v.push_back(20);
+  v.push_back(300);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(321, g_sum);
+}
+
+// Tests GetElementOr().
+TEST(ContainerUtilityTest, GetElementOr) {
+  std::vector<char> a;
+  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));
+
+  a.push_back('a');
+  a.push_back('b');
+  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));
+  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));
+}
+
+TEST(ContainerUtilityDeathTest, ShuffleRange) {
+  std::vector<int> a;
+  a.push_back(0);
+  a.push_back(1);
+  a.push_back(2);
+  testing::internal::Random random(1);
+
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, -1, 1, &a),
+      "Invalid shuffle range start -1: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 4, 4, &a),
+      "Invalid shuffle range start 4: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 2, &a),
+      "Invalid shuffle range finish 2: must be in range \\[3, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 4, &a),
+      "Invalid shuffle range finish 4: must be in range \\[3, 3\\]");
+}
+
+class VectorShuffleTest : public Test {
+ protected:
+  static const int kVectorSize = 20;
+
+  VectorShuffleTest() : random_(1) {
+    for (int i = 0; i < kVectorSize; i++) {
+      vector_.push_back(i);
+    }
+  }
+
+  static bool VectorIsCorrupt(const TestingVector& vector) {
+    if (kVectorSize != static_cast<int>(vector.size())) {
+      return true;
+    }
+
+    bool found_in_vector[kVectorSize] = { false };
+    for (size_t i = 0; i < vector.size(); i++) {
+      const int e = vector[i];
+      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {
+        return true;
+      }
+      found_in_vector[e] = true;
+    }
+
+    // Vector size is correct, elements' range is correct, no
+    // duplicate elements.  Therefore no corruption has occurred.
+    return false;
+  }
+
+  static bool VectorIsNotCorrupt(const TestingVector& vector) {
+    return !VectorIsCorrupt(vector);
+  }
+
+  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {
+    for (int i = begin; i < end; i++) {
+      if (i != vector[i]) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool RangeIsUnshuffled(
+      const TestingVector& vector, int begin, int end) {
+    return !RangeIsShuffled(vector, begin, end);
+  }
+
+  static bool VectorIsShuffled(const TestingVector& vector) {
+    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));
+  }
+
+  static bool VectorIsUnshuffled(const TestingVector& vector) {
+    return !VectorIsShuffled(vector);
+  }
+
+  testing::internal::Random random_;
+  TestingVector vector_;
+};  // class VectorShuffleTest
+
+const int VectorShuffleTest::kVectorSize;
+
+TEST_F(VectorShuffleTest, HandlesEmptyRange) {
+  // Tests an empty range at the beginning...
+  ShuffleRange(&random_, 0, 0, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...at the end...
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and past the end.
+  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+TEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {
+  // Tests a size one range at the beginning...
+  ShuffleRange(&random_, 0, 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and at the end.
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+// Because we use our own random number generator and a fixed seed,
+// we can guarantee that the following "random" tests will succeed.
+
+TEST_F(VectorShuffleTest, ShufflesEntireVector) {
+  Shuffle(&random_, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;
+
+  // Tests the first and last elements in particular to ensure that
+  // there are no off-by-one problems in our shuffle algorithm.
+  EXPECT_NE(0, vector_[0]);
+  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);
+}
+
+TEST_F(VectorShuffleTest, ShufflesStartOfVector) {
+  const int kRangeSize = kVectorSize/2;
+
+  ShuffleRange(&random_, 0, kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesEndOfVector) {
+  const int kRangeSize = kVectorSize / 2;
+  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {
+  int kRangeSize = kVectorSize/3;
+  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesRepeatably) {
+  TestingVector vector2;
+  for (int i = 0; i < kVectorSize; i++) {
+    vector2.push_back(i);
+  }
+
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector_);
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector2);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector2);
+
+  for (int i = 0; i < kVectorSize; i++) {
+    EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i;
+  }
+}
+
+// Tests the size of the AssertHelper class.
+
+TEST(AssertHelperTest, AssertHelperIsSmall) {
+  // To avoid breaking clients that use lots of assertions in one
+  // function, we cannot grow the size of AssertHelper.
+  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));
+}
+
+// Tests String::EndsWithCaseInsensitive().
+TEST(StringTest, EndsWithCaseInsensitive) {
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "BAR"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobaR", "bar"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", ""));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("", ""));
+
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("Foobar", "foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("foobar", "Foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("", "foo"));
+}
+
+// C++Builder's preprocessor is buggy; it fails to expand macros that
+// appear in macro parameters after wide char literals.  Provide an alias
+// for NULL as a workaround.
+static const wchar_t* const kNull = NULL;
+
+// Tests String::CaseInsensitiveWideCStringEquals
+TEST(StringTest, CaseInsensitiveWideCStringEquals) {
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L""));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar"));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar"));
+}
+
+#if GTEST_OS_WINDOWS
+
+// Tests String::ShowWideCString().
+TEST(StringTest, ShowWideCString) {
+  EXPECT_STREQ("(null)",
+               String::ShowWideCString(NULL).c_str());
+  EXPECT_STREQ("", String::ShowWideCString(L"").c_str());
+  EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str());
+}
+
+# if GTEST_OS_WINDOWS_MOBILE
+TEST(StringTest, AnsiAndUtf16Null) {
+  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));
+  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertBasic) {
+  const char* ansi = String::Utf16ToAnsi(L"str");
+  EXPECT_STREQ("str", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16("str");
+  EXPECT_EQ(0, wcsncmp(L"str", utf16, 3));
+  delete [] utf16;
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertPathChars) {
+  const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?");
+  EXPECT_STREQ(".:\\ \"*?", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?");
+  EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3));
+  delete [] utf16;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#endif  // GTEST_OS_WINDOWS
+
+// Tests TestProperty construction.
+TEST(TestPropertyTest, StringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("1", property.value());
+}
+
+// Tests TestProperty replacing a value.
+TEST(TestPropertyTest, ReplaceStringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("1", property.value());
+  property.SetValue("2");
+  EXPECT_STREQ("2", property.value());
+}
+
+// AddFatalFailure() and AddNonfatalFailure() must be stand-alone
+// functions (i.e. their definitions cannot be inlined at the call
+// sites), or C++Builder won't compile the code.
+static void AddFatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+static void AddNonfatalFailure() {
+  ADD_FAILURE() << "Expected non-fatal failure.";
+}
+
+class ScopedFakeTestPartResultReporterTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      AddFatalFailure();
+    } else {
+      AddNonfatalFailure();
+    }
+  }
+};
+
+// Tests that ScopedFakeTestPartResultReporter intercepts test
+// failures.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(2, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+}
+
+TEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {
+  TestPartResultArray results;
+  {
+    // Tests, that the deprecated constructor still works.
+    ScopedFakeTestPartResultReporter reporter(&results);
+    AddFailure(NONFATAL_FAILURE);
+  }
+  EXPECT_EQ(1, results.size());
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ScopedFakeTestPartResultReporterWithThreadsTest
+  : public ScopedFakeTestPartResultReporterTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,
+       InterceptsTestFailuresInAllThreads) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+    AddFailureInOtherThread(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(4, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they
+// work even if the failure is generated in a called function rather than
+// the current context.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectFatalFailureTest, AcceptsStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string("Expected fatal failure."));
+}
+#endif
+
+TEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(),
+                       ::std::string("Expected fatal failure."));
+}
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches fatal
+  // failures generated on another thread.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),
+                                      "Expected fatal failure.");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true"
+# pragma option push -w-ccc
+#endif
+
+// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void
+// function even when the statement in it contains ASSERT_*.
+
+int NonVoidFunction() {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+  return 0;
+}
+
+TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {
+  NonVoidFunction();
+}
+
+// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the
+// current function even though 'statement' generates a fatal failure.
+
+void DoesNotAbortHelper(bool* aborted) {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+
+  *aborted = false;
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+# pragma option pop
+#endif
+
+TEST_F(ExpectFatalFailureTest, DoesNotAbort) {
+  bool aborted = true;
+  DoesNotAbortHelper(&aborted);
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+
+static int global_var = 0;
+#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
+
+TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+#endif
+
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+}
+
+// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          "Expected non-fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::string("Expected non-fatal failure."));
+}
+#endif
+
+TEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::std::string("Expected non-fatal failure."));
+}
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches
+  // non-fatal failures generated on another thread.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),
+                                         "Expected non-fatal failure.");
+}
+
+// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+  EXPECT_NONFATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+}
+
+#if GTEST_IS_THREADSAFE
+
+typedef ScopedFakeTestPartResultReporterWithThreadsTest
+    ExpectFailureWithThreadsTest;
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),
+                                      "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure.");
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests the TestProperty class.
+
+TEST(TestPropertyTest, ConstructorWorks) {
+  const TestProperty property("key", "value");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value", property.value());
+}
+
+TEST(TestPropertyTest, SetValue) {
+  TestProperty property("key", "value_1");
+  EXPECT_STREQ("key", property.key());
+  property.SetValue("value_2");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value_2", property.value());
+}
+
+// Tests the TestResult class
+
+// The test fixture for testing TestResult.
+class TestResultTest : public Test {
+ protected:
+  typedef std::vector<TestPartResult> TPRVector;
+
+  // We make use of 2 TestPartResult objects,
+  TestPartResult * pr1, * pr2;
+
+  // ... and 3 TestResult objects.
+  TestResult * r0, * r1, * r2;
+
+  virtual void SetUp() {
+    // pr1 is for success.
+    pr1 = new TestPartResult(TestPartResult::kSuccess,
+                             "foo/bar.cc",
+                             10,
+                             "Success!");
+
+    // pr2 is for fatal failure.
+    pr2 = new TestPartResult(TestPartResult::kFatalFailure,
+                             "foo/bar.cc",
+                             -1,  // This line number means "unknown"
+                             "Failure!");
+
+    // Creates the TestResult objects.
+    r0 = new TestResult();
+    r1 = new TestResult();
+    r2 = new TestResult();
+
+    // In order to test TestResult, we need to modify its internal
+    // state, in particular the TestPartResult vector it holds.
+    // test_part_results() returns a const reference to this vector.
+    // We cast it to a non-const object s.t. it can be modified (yes,
+    // this is a hack).
+    TPRVector* results1 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r1));
+    TPRVector* results2 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r2));
+
+    // r0 is an empty TestResult.
+
+    // r1 contains a single SUCCESS TestPartResult.
+    results1->push_back(*pr1);
+
+    // r2 contains a SUCCESS, and a FAILURE.
+    results2->push_back(*pr1);
+    results2->push_back(*pr2);
+  }
+
+  virtual void TearDown() {
+    delete pr1;
+    delete pr2;
+
+    delete r0;
+    delete r1;
+    delete r2;
+  }
+
+  // Helper that compares two two TestPartResults.
+  static void CompareTestPartResult(const TestPartResult& expected,
+                                    const TestPartResult& actual) {
+    EXPECT_EQ(expected.type(), actual.type());
+    EXPECT_STREQ(expected.file_name(), actual.file_name());
+    EXPECT_EQ(expected.line_number(), actual.line_number());
+    EXPECT_STREQ(expected.summary(), actual.summary());
+    EXPECT_STREQ(expected.message(), actual.message());
+    EXPECT_EQ(expected.passed(), actual.passed());
+    EXPECT_EQ(expected.failed(), actual.failed());
+    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());
+    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());
+  }
+};
+
+// Tests TestResult::total_part_count().
+TEST_F(TestResultTest, total_part_count) {
+  ASSERT_EQ(0, r0->total_part_count());
+  ASSERT_EQ(1, r1->total_part_count());
+  ASSERT_EQ(2, r2->total_part_count());
+}
+
+// Tests TestResult::Passed().
+TEST_F(TestResultTest, Passed) {
+  ASSERT_TRUE(r0->Passed());
+  ASSERT_TRUE(r1->Passed());
+  ASSERT_FALSE(r2->Passed());
+}
+
+// Tests TestResult::Failed().
+TEST_F(TestResultTest, Failed) {
+  ASSERT_FALSE(r0->Failed());
+  ASSERT_FALSE(r1->Failed());
+  ASSERT_TRUE(r2->Failed());
+}
+
+// Tests TestResult::GetTestPartResult().
+
+typedef TestResultTest TestResultDeathTest;
+
+TEST_F(TestResultDeathTest, GetTestPartResult) {
+  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));
+  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), "");
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), "");
+}
+
+// Tests TestResult has no properties when none are added.
+TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {
+  TestResult test_result;
+  ASSERT_EQ(0, test_result.test_property_count());
+}
+
+// Tests TestResult has the expected property when added.
+TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property("key_1", "1");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property);
+  ASSERT_EQ(1, test_result.test_property_count());
+  const TestProperty& actual_property = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property.key());
+  EXPECT_STREQ("1", actual_property.value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("1", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("2", actual_property_2.value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {
+  TestResult test_result;
+  TestProperty property_1_1("key_1", "1");
+  TestProperty property_2_1("key_2", "2");
+  TestProperty property_1_2("key_1", "12");
+  TestProperty property_2_2("key_2", "22");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_2);
+
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("12", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("22", actual_property_2.value());
+}
+
+// Tests TestResult::GetTestProperty().
+TEST(TestResultPropertyTest, GetTestProperty) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestProperty property_3("key_3", "3");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_3);
+
+  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);
+  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);
+  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);
+
+  EXPECT_STREQ("key_1", fetched_property_1.key());
+  EXPECT_STREQ("1", fetched_property_1.value());
+
+  EXPECT_STREQ("key_2", fetched_property_2.key());
+  EXPECT_STREQ("2", fetched_property_2.value());
+
+  EXPECT_STREQ("key_3", fetched_property_3.key());
+  EXPECT_STREQ("3", fetched_property_3.value());
+
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), "");
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), "");
+}
+
+// Tests that GTestFlagSaver works on Windows and Mac.
+
+class GTestFlagSaverTest : public Test {
+ protected:
+  // Saves the Google Test flags such that we can restore them later, and
+  // then sets them to their default values.  This will be called
+  // before the first test in this test case is run.
+  static void SetUpTestCase() {
+    saver_ = new GTestFlagSaver;
+
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(color) = "auto";
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Restores the Google Test flags that the tests have modified.  This will
+  // be called after the last test in this test case is run.
+  static void TearDownTestCase() {
+    delete saver_;
+    saver_ = NULL;
+  }
+
+  // Verifies that the Google Test flags have their default values, and then
+  // modifies each of them.
+  void VerifyAndModifyFlags() {
+    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_FALSE(GTEST_FLAG(break_on_failure));
+    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));
+    EXPECT_STREQ("auto", GTEST_FLAG(color).c_str());
+    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ("", GTEST_FLAG(filter).c_str());
+    EXPECT_FALSE(GTEST_FLAG(list_tests));
+    EXPECT_STREQ("", GTEST_FLAG(output).c_str());
+    EXPECT_TRUE(GTEST_FLAG(print_time));
+    EXPECT_EQ(0, GTEST_FLAG(random_seed));
+    EXPECT_EQ(1, GTEST_FLAG(repeat));
+    EXPECT_FALSE(GTEST_FLAG(shuffle));
+    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ("", GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
+
+    GTEST_FLAG(also_run_disabled_tests) = true;
+    GTEST_FLAG(break_on_failure) = true;
+    GTEST_FLAG(catch_exceptions) = true;
+    GTEST_FLAG(color) = "no";
+    GTEST_FLAG(death_test_use_fork) = true;
+    GTEST_FLAG(filter) = "abc";
+    GTEST_FLAG(list_tests) = true;
+    GTEST_FLAG(output) = "xml:foo.xml";
+    GTEST_FLAG(print_time) = false;
+    GTEST_FLAG(random_seed) = 1;
+    GTEST_FLAG(repeat) = 100;
+    GTEST_FLAG(shuffle) = true;
+    GTEST_FLAG(stack_trace_depth) = 1;
+    GTEST_FLAG(stream_result_to) = "localhost:1234";
+    GTEST_FLAG(throw_on_failure) = true;
+  }
+
+ private:
+  // For saving Google Test flags during this test case.
+  static GTestFlagSaver* saver_;
+};
+
+GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;
+
+// Google Test doesn't guarantee the order of tests.  The following two
+// tests are designed to work regardless of their order.
+
+// Modifies the Google Test flags in the test body.
+TEST_F(GTestFlagSaverTest, ModifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Verifies that the Google Test flags in the body of the previous test were
+// restored to their original values.
+TEST_F(GTestFlagSaverTest, VerifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Sets an environment variable with the given name to the given
+// value.  If the value argument is "", unsets the environment
+// variable.  The caller must ensure that both arguments are not NULL.
+static void SetEnv(const char* name, const char* value) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Environment variables are not supported on Windows CE.
+  return;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // C++Builder's putenv only stores a pointer to its parameter; we have to
+  // ensure that the string remains valid as long as it might be needed.
+  // We use an std::map to do so.
+  static std::map<std::string, std::string*> added_env;
+
+  // Because putenv stores a pointer to the string buffer, we can't delete the
+  // previous string (if present) until after it's replaced.
+  std::string *prev_env = NULL;
+  if (added_env.find(name) != added_env.end()) {
+    prev_env = added_env[name];
+  }
+  added_env[name] = new std::string(
+      (Message() << name << "=" << value).GetString());
+
+  // The standard signature of putenv accepts a 'char*' argument. Other
+  // implementations, like C++Builder's, accept a 'const char*'.
+  // We cast away the 'const' since that would work for both variants.
+  putenv(const_cast<char*>(added_env[name]->c_str()));
+  delete prev_env;
+#elif GTEST_OS_WINDOWS  // If we are on Windows proper.
+  _putenv((Message() << name << "=" << value).GetString().c_str());
+#else
+  if (*value == '\0') {
+    unsetenv(name);
+  } else {
+    setenv(name, value, 1);
+  }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Environment variables are not supported on Windows CE.
+
+using testing::internal::Int32FromGTestEnv;
+
+// Tests Int32FromGTestEnv().
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable is not set.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "");
+  EXPECT_EQ(10, Int32FromGTestEnv("temp", 10));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable overflows as an Int32.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321");
+  EXPECT_EQ(20, Int32FromGTestEnv("temp", 20));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321");
+  EXPECT_EQ(30, Int32FromGTestEnv("temp", 30));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable does not represent a valid decimal integer.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1");
+  EXPECT_EQ(40, Int32FromGTestEnv("temp", 40));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X");
+  EXPECT_EQ(50, Int32FromGTestEnv("temp", 50));
+}
+
+// Tests that Int32FromGTestEnv() parses and returns the value of the
+// environment variable when it represents a valid decimal integer in
+// the range of an Int32.
+TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123");
+  EXPECT_EQ(123, Int32FromGTestEnv("temp", 0));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321");
+  EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests ParseInt32Flag().
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag has wrong format
+TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag overflows as an Int32.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag does not represent a valid decimal
+// integer.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() parses the value of the flag and
+// returns true when the flag represents a valid decimal integer in
+// the range of an Int32.
+TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {
+  Int32 value = 123;
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value));
+  EXPECT_EQ(456, value);
+
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789",
+                             "abc", &value));
+  EXPECT_EQ(-789, value);
+}
+
+// Tests that Int32FromEnvOrDie() parses the value of the var or
+// returns the correct default.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {
+  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123");
+  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123");
+  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable is not an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable cannot be represnted by an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that ShouldRunTestOnShard() selects all tests
+// where there is 1 shard.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));
+}
+
+class ShouldShardTest : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX";
+    total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL";
+  }
+
+  virtual void TearDown() {
+    SetEnv(index_var_, "");
+    SetEnv(total_var_, "");
+  }
+
+  const char* index_var_;
+  const char* total_var_;
+};
+
+// Tests that sharding is disabled if neither of the environment variables
+// are set.
+TEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "");
+
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is not enabled if total_shards  == 1.
+TEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "1");
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is enabled if total_shards > 1 and
+// we are not in a death test subprocess.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "22");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "8");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that we exit in error if the sharding values are not valid.
+
+typedef ShouldShardTest ShouldShardDeathTest;
+
+TEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "4");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "-2");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "5");
+  SetEnv(total_var_, "");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "5");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+}
+
+// Tests that ShouldRunTestOnShard is a partition when 5
+// shards are used.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {
+  // Choose an arbitrary number of tests and shards.
+  const int num_tests = 17;
+  const int num_shards = 5;
+
+  // Check partitioning: each test should be on exactly 1 shard.
+  for (int test_id = 0; test_id < num_tests; test_id++) {
+    int prev_selected_shard_index = -1;
+    for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {
+        if (prev_selected_shard_index < 0) {
+          prev_selected_shard_index = shard_index;
+        } else {
+          ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and "
+            << shard_index << " are both selected to run test " << test_id;
+        }
+      }
+    }
+  }
+
+  // Check balance: This is not required by the sharding protocol, but is a
+  // desirable property for performance.
+  for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+    int num_tests_on_shard = 0;
+    for (int test_id = 0; test_id < num_tests; test_id++) {
+      num_tests_on_shard +=
+        ShouldRunTestOnShard(num_shards, shard_index, test_id);
+    }
+    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);
+  }
+}
+
+// For the same reason we are not explicitly testing everything in the
+// Test class, there are no separate tests for the following classes
+// (except for some trivial cases):
+//
+//   TestCase, UnitTest, UnitTestResultPrinter.
+//
+// Similarly, there are no separate tests for the following macros:
+//
+//   TEST, TEST_F, RUN_ALL_TESTS
+
+TEST(UnitTestTest, CanGetOriginalWorkingDir) {
+  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);
+  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
+}
+
+TEST(UnitTestTest, ReturnsPlausibleTimestamp) {
+  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());
+  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());
+}
+
+// When a property using a reserved key is supplied to this function, it
+// tests that a non-fatal failure is added, a fatal failure is not added,
+// and that the property is not recorded.
+void ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+    const TestResult& test_result, const char* key) {
+  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, "1"), "Reserved key");
+  ASSERT_EQ(0, test_result.test_property_count()) << "Property for key '" << key
+                                                  << "' recorded unexpectedly.";
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+    const char* key) {
+  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(test_info != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(),
+                                                        key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+    const char* key) {
+  const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+  ASSERT_TRUE(test_case != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      test_case->ad_hoc_test_result(), key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+    const char* key) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      UnitTest::GetInstance()->ad_hoc_test_result(), key);
+}
+
+// Tests that property recording functions in UnitTest outside of tests
+// functions correcly.  Creating a separate instance of UnitTest ensures it
+// is in a state similar to the UnitTest's singleton's between tests.
+class UnitTestRecordPropertyTest :
+    public testing::internal::UnitTestRecordPropertyTestHelper {
+ public:
+  static void SetUpTestCase() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "time");
+
+    Test::RecordProperty("test_case_key_1", "1");
+    const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+    ASSERT_TRUE(test_case != NULL);
+
+    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count());
+    EXPECT_STREQ("test_case_key_1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).key());
+    EXPECT_STREQ("1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).value());
+  }
+};
+
+// Tests TestResult has the expected property when added.
+TEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+
+  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1", unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("2", unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+  UnitTestRecordProperty("key_1", "12");
+  UnitTestRecordProperty("key_2", "22");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("12",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("22",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "name");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "value_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "type_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "status");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "time");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "classname");
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddRecordWithReservedKeysGeneratesCorrectPropertyList) {
+  EXPECT_NONFATAL_FAILURE(
+      Test::RecordProperty("name", "1"),
+      "'classname', 'name', 'status', 'time', 'type_param', and 'value_param'"
+      " are reserved");
+}
+
+class UnitTestRecordPropertyTestEnvironment : public Environment {
+ public:
+  virtual void TearDown() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "timestamp");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "time");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "random_seed");
+  }
+};
+
+// This will test property recording outside of any test or test case.
+static Environment* record_property_env =
+    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment);
+
+// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
+// of various arities.  They do not attempt to be exhaustive.  Rather,
+// view them as smoke tests that can be easily reviewed and verified.
+// A more complete set of tests for predicate assertions can be found
+// in gtest_pred_impl_unittest.cc.
+
+// First, some predicates and predicate-formatters needed by the tests.
+
+// Returns true iff the argument is an even number.
+bool IsEven(int n) {
+  return (n % 2) == 0;
+}
+
+// A functor that returns true iff the argument is an even number.
+struct IsEvenFunctor {
+  bool operator()(int n) { return IsEven(n); }
+};
+
+// A predicate-formatter function that asserts the argument is an even
+// number.
+AssertionResult AssertIsEven(const char* expr, int n) {
+  if (IsEven(n)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << expr << " evaluates to " << n << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate function that returns AssertionResult for use in
+// EXPECT/ASSERT_TRUE/FALSE.
+AssertionResult ResultIsEven(int n) {
+  if (IsEven(n))
+    return AssertionSuccess() << n << " is even";
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate function that returns AssertionResult but gives no
+// explanation why it succeeds. Needed for testing that
+// EXPECT/ASSERT_FALSE handles such functions correctly.
+AssertionResult ResultIsEvenNoExplanation(int n) {
+  if (IsEven(n))
+    return AssertionSuccess();
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate-formatter functor that asserts the argument is an even
+// number.
+struct AssertIsEvenFunctor {
+  AssertionResult operator()(const char* expr, int n) {
+    return AssertIsEven(expr, n);
+  }
+};
+
+// Returns true iff the sum of the arguments is an even number.
+bool SumIsEven2(int n1, int n2) {
+  return IsEven(n1 + n2);
+}
+
+// A functor that returns true iff the sum of the arguments is an even
+// number.
+struct SumIsEven3Functor {
+  bool operator()(int n1, int n2, int n3) {
+    return IsEven(n1 + n2 + n3);
+  }
+};
+
+// A predicate-formatter function that asserts the sum of the
+// arguments is an even number.
+AssertionResult AssertSumIsEven4(
+    const char* e1, const char* e2, const char* e3, const char* e4,
+    int n1, int n2, int n3, int n4) {
+  const int sum = n1 + n2 + n3 + n4;
+  if (IsEven(sum)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4
+      << ") evaluates to " << sum << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate-formatter functor that asserts the sum of the arguments
+// is an even number.
+struct AssertSumIsEven5Functor {
+  AssertionResult operator()(
+      const char* e1, const char* e2, const char* e3, const char* e4,
+      const char* e5, int n1, int n2, int n3, int n4, int n5) {
+    const int sum = n1 + n2 + n3 + n4 + n5;
+    if (IsEven(sum)) {
+      return AssertionSuccess();
+    }
+
+    Message msg;
+    msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+        << " ("
+        << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5
+        << ") evaluates to " << sum << ", which is not even.";
+    return AssertionFailure(msg);
+  }
+};
+
+
+// Tests unary predicate assertions.
+
+// Tests unary predicate assertions that don't use a custom formatter.
+TEST(Pred1Test, WithoutFormat) {
+  // Success cases.
+  EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!";
+  ASSERT_PRED1(IsEven, 4);
+
+  // Failure cases.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(IsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),
+                       "evaluates to false");
+}
+
+// Tests unary predicate assertions that use a custom formatter.
+TEST(Pred1Test, WithFormat) {
+  // Success cases.
+  EXPECT_PRED_FORMAT1(AssertIsEven, 2);
+  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)
+    << "This failure is UNEXPECTED!";
+
+  // Failure cases.
+  const int n = 5;
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),
+                          "n evaluates to 5, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that unary predicate assertions evaluates their arguments
+// exactly once.
+TEST(Pred1Test, SingleEvaluationOnFailure) {
+  // A success case.
+  static int n = 0;
+  EXPECT_PRED1(IsEven, n++);
+  EXPECT_EQ(1, n) << "The argument is not evaluated exactly once.";
+
+  // A failure case.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(2, n) << "The argument is not evaluated exactly once.";
+}
+
+
+// Tests predicate assertions whose arity is >= 2.
+
+// Tests predicate assertions that don't use a custom formatter.
+TEST(PredTest, WithoutFormat) {
+  // Success cases.
+  ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!";
+  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);
+  }, "evaluates to false");
+}
+
+// Tests predicate assertions that use a custom formatter.
+TEST(PredTest, WithFormat) {
+  // Success cases.
+  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<
+    "This failure is UNEXPECTED!";
+  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  const int n3 = 4;
+  const int n4 = 6;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);
+  }, "evaluates to 13, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that predicate assertions evaluates their arguments
+// exactly once.
+TEST(PredTest, SingleEvaluationOnFailure) {
+  // A success case.
+  int n1 = 0;
+  int n2 = 0;
+  EXPECT_PRED2(SumIsEven2, n1++, n2++);
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+
+  // Another success case.
+  n1 = n2 = 0;
+  int n3 = 0;
+  int n4 = 0;
+  int n5 = 0;
+  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),
+                      n1++, n2++, n3++, n4++, n5++)
+                        << "This failure is UNEXPECTED!";
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+  EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once.";
+
+  // A failure case.
+  n1 = n2 = n3 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+
+  // Another failure case.
+  n1 = n2 = n3 = n4 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);
+  }, "evaluates to 1, which is not even.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PREDn and EXPECT_PREDn.
+
+bool IsPositive(double x) {
+  return x > 0;
+}
+
+template <typename T>
+bool IsNegative(T x) {
+  return x < 0;
+}
+
+template <typename T1, typename T2>
+bool GreaterThan(T1 x1, T2 x2) {
+  return x1 > x2;
+}
+
+// Tests that overloaded functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsOverloadedFunction) {
+  // C++Builder requires C-style casts rather than static_cast.
+  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT
+  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT
+}
+
+// Tests that template functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED1(IsNegative<int>, -5);
+  // Makes sure that we can handle templates with more than one
+  // parameter.
+  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.
+
+AssertionResult IsPositiveFormat(const char* /* expr */, int n) {
+  return n > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+AssertionResult IsPositiveFormat(const char* /* expr */, double x) {
+  return x > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T>
+AssertionResult IsNegativeFormat(const char* /* expr */, T x) {
+  return x < 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T1, typename T2>
+AssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,
+                             const T1& x1, const T2& x2) {
+  return x1 == x2 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+// Tests that overloaded functions can be used in *_PRED_FORMAT*
+// without explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {
+  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);
+  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);
+}
+
+// Tests that template functions can be used in *_PRED_FORMAT* without
+// explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);
+  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);
+}
+
+
+// Tests string assertions.
+
+// Tests ASSERT_STREQ with non-NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ) {
+  const char * const p1 = "good";
+  ASSERT_STREQ(p1, p1);
+
+  // Let p2 have the same content as p1, but be at a different address.
+  const char p2[] = "good";
+  ASSERT_STREQ(p1, p2);
+
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"),
+                       "Expected: \"bad\"");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null) {
+  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"),
+                       "non-null");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null2) {
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL),
+                       "non-null");
+}
+
+// Tests ASSERT_STRNE.
+TEST(StringAssertionTest, ASSERT_STRNE) {
+  ASSERT_STRNE("hi", "Hi");
+  ASSERT_STRNE("Hi", NULL);
+  ASSERT_STRNE(NULL, "Hi");
+  ASSERT_STRNE("", NULL);
+  ASSERT_STRNE(NULL, "");
+  ASSERT_STRNE("", "Hi");
+  ASSERT_STRNE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"),
+                       "\"Hi\" vs \"Hi\"");
+}
+
+// Tests ASSERT_STRCASEEQ.
+TEST(StringAssertionTest, ASSERT_STRCASEEQ) {
+  ASSERT_STRCASEEQ("hi", "Hi");
+  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);
+
+  ASSERT_STRCASEEQ("", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"),
+                       "(ignoring case)");
+}
+
+// Tests ASSERT_STRCASENE.
+TEST(StringAssertionTest, ASSERT_STRCASENE) {
+  ASSERT_STRCASENE("hi1", "Hi2");
+  ASSERT_STRCASENE("Hi", NULL);
+  ASSERT_STRCASENE(NULL, "Hi");
+  ASSERT_STRCASENE("", NULL);
+  ASSERT_STRCASENE(NULL, "");
+  ASSERT_STRCASENE("", "Hi");
+  ASSERT_STRCASENE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"),
+                       "(ignoring case)");
+}
+
+// Tests *_STREQ on wide strings.
+TEST(StringAssertionTest, STREQ_Wide) {
+  // NULL strings.
+  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);
+
+  // Empty strings.
+  ASSERT_STREQ(L"", L"");
+
+  // Non-null vs NULL.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL),
+                          "non-null");
+
+  // Equal strings.
+  EXPECT_STREQ(L"Hi", L"Hi");
+
+  // Unequal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"),
+                          "Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"),
+                          "abc");
+
+  // The streaming variation.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STREQ(L"abc\x8119", L"abc\x8121") << "Expected failure";
+  }, "Expected failure");
+}
+
+// Tests *_STRNE on wide strings.
+TEST(StringAssertionTest, STRNE_Wide) {
+  // NULL strings.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);
+  }, "");
+
+  // Empty strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""),
+                          "L\"\"");
+
+  // Non-null vs NULL.
+  ASSERT_STRNE(L"non-null", NULL);
+
+  // Equal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"),
+                          "L\"Hi\"");
+
+  // Unequal strings.
+  EXPECT_STRNE(L"abc", L"Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"),
+                          "abc");
+
+  // The streaming variation.
+  ASSERT_STRNE(L"abc\x8119", L"abc\x8120") << "This shouldn't happen";
+}
+
+// Tests for ::testing::IsSubstring().
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_FALSE(IsSubstring("", "", NULL, "a"));
+  EXPECT_FALSE(IsSubstring("", "", "b", NULL));
+  EXPECT_FALSE(IsSubstring("", "", "needle", "haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_FALSE(IsSubstring("", "", kNull, L"a"));
+  EXPECT_FALSE(IsSubstring("", "", L"b", kNull));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is const char*.
+TEST(IsSubstringTest, GeneratesCorrectMessageForCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: \"haystack\"",
+               IsSubstring("needle_expr", "haystack_expr",
+                           "needle", "haystack").failure_message());
+}
+
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world")));
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: L\"haystack\"",
+               IsSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::wstring(L"needle"), L"haystack").failure_message());
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests for ::testing::IsNotSubstring().
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: L\"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   L"needle", L"two needles").failure_message());
+}
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world")));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: \"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::string("needle"), "two needles").failure_message());
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_FALSE(
+      IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests floating-point assertions.
+
+template <typename RawType>
+class FloatingPointTest : public Test {
+ protected:
+  // Pre-calculated numbers to be used by the tests.
+  struct TestValues {
+    RawType close_to_positive_zero;
+    RawType close_to_negative_zero;
+    RawType further_from_negative_zero;
+
+    RawType close_to_one;
+    RawType further_from_one;
+
+    RawType infinity;
+    RawType close_to_infinity;
+    RawType further_from_infinity;
+
+    RawType nan1;
+    RawType nan2;
+  };
+
+  typedef typename testing::internal::FloatingPoint<RawType> Floating;
+  typedef typename Floating::Bits Bits;
+
+  virtual void SetUp() {
+    const size_t max_ulps = Floating::kMaxUlps;
+
+    // The bits that represent 0.0.
+    const Bits zero_bits = Floating(0).bits();
+
+    // Makes some numbers close to 0.0.
+    values_.close_to_positive_zero = Floating::ReinterpretBits(
+        zero_bits + max_ulps/2);
+    values_.close_to_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps - max_ulps/2);
+    values_.further_from_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps + 1 - max_ulps/2);
+
+    // The bits that represent 1.0.
+    const Bits one_bits = Floating(1).bits();
+
+    // Makes some numbers close to 1.0.
+    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);
+    values_.further_from_one = Floating::ReinterpretBits(
+        one_bits + max_ulps + 1);
+
+    // +infinity.
+    values_.infinity = Floating::Infinity();
+
+    // The bits that represent +infinity.
+    const Bits infinity_bits = Floating(values_.infinity).bits();
+
+    // Makes some numbers close to infinity.
+    values_.close_to_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps);
+    values_.further_from_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps - 1);
+
+    // Makes some NAN's.  Sets the most significant bit of the fraction so that
+    // our NaN's are quiet; trying to process a signaling NaN would raise an
+    // exception if our environment enables floating point exceptions.
+    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);
+    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);
+  }
+
+  void TestSize() {
+    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
+  }
+
+  static TestValues values_;
+};
+
+template <typename RawType>
+typename FloatingPointTest<RawType>::TestValues
+    FloatingPointTest<RawType>::values_;
+
+// Instantiates FloatingPointTest for testing *_FLOAT_EQ.
+typedef FloatingPointTest<float> FloatTest;
+
+// Tests that the size of Float::Bits matches the size of float.
+TEST_F(FloatTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(FloatTest, Zeros) {
+  EXPECT_FLOAT_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),
+                       "1.5");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_FLOAT_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(FloatTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FLOAT_EQ(v.close_to_positive_zero,
+                    v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(FloatTest, SmallDiff) {
+  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(FloatTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(FloatTest, Infinity) {
+  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity and nan1
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(FloatTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+// Nokia's STLport crashes if we try to output infinity or NaN.
+
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),
+                          "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),
+                          "v.nan1");
+
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_FLOAT_EQ are reflexive.
+TEST_F(FloatTest, Reflexive) {
+  EXPECT_FLOAT_EQ(0.0, 0.0);
+  EXPECT_FLOAT_EQ(1.0, 1.0);
+  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);
+}
+
+// Tests that *_FLOAT_EQ are commutative.
+TEST_F(FloatTest, Commutative) {
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).
+  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(FloatTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);
+  EXPECT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                          "The difference between 1.0f and 1.5f is 0.5, "
+                          "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(FloatTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);
+  ASSERT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                       "The difference between 1.0f and 1.5f is 0.5, "
+                       "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests the cases where FloatLE() should succeed.
+TEST_F(FloatTest, FloatLESucceeds) {
+  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);
+}
+
+// Tests the cases where FloatLE() should fail.
+TEST_F(FloatTest, FloatLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),
+                          "(2.0f) <= (1.0f)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);
+  }, "(values_.further_from_one) <= (1.0f)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);
+  }, "(-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.
+typedef FloatingPointTest<double> DoubleTest;
+
+// Tests that the size of Double::Bits matches the size of double.
+TEST_F(DoubleTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(DoubleTest, Zeros) {
+  EXPECT_DOUBLE_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),
+                       "1.0");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_DOUBLE_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(DoubleTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,
+                     v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(DoubleTest, SmallDiff) {
+  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(DoubleTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(DoubleTest, Infinity) {
+  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity_ and nan1_
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(DoubleTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are reflexive.
+TEST_F(DoubleTest, Reflexive) {
+  EXPECT_DOUBLE_EQ(0.0, 0.0);
+  EXPECT_DOUBLE_EQ(1.0, 1.0);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are commutative.
+TEST_F(DoubleTest, Commutative) {
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).
+  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(DoubleTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0, -1.1, 0.2);
+  EXPECT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                          "The difference between 1.0 and 1.5 is 0.5, "
+                          "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(DoubleTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0, -1.1, 0.2);
+  ASSERT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                       "The difference between 1.0 and 1.5 is 0.5, "
+                       "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests the cases where DoubleLE() should succeed.
+TEST_F(DoubleTest, DoubleLESucceeds) {
+  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);
+}
+
+// Tests the cases where DoubleLE() should fail.
+TEST_F(DoubleTest, DoubleLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),
+                          "(2.0) <= (1.0)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);
+  }, "(values_.further_from_one) <= (1.0)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);
+  }, " (-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+
+// Verifies that a test or test case whose name starts with DISABLED_ is
+// not run.
+
+// A test whose name starts with DISABLED_.
+// Should not run.
+TEST(DisabledTest, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// A test whose name does not start with DISABLED_.
+// Should run.
+TEST(DisabledTest, NotDISABLED_TestShouldRun) {
+  EXPECT_EQ(1, 1);
+}
+
+// A test case whose name starts with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// A test case and test whose names start with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// Check that when all tests in a test case are disabled, SetupTestCase() and
+// TearDownTestCase() are not called.
+class DisabledTestsTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "SetupTestCase() should not be called.";
+  }
+
+  static void TearDownTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "TearDownTestCase() should not be called.";
+  }
+};
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// Tests that disabled typed tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(TypedTest, NumericTypes);
+
+TYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+template <typename T>
+class DISABLED_TypedTest : public Test {
+};
+
+TYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);
+
+TYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Tests that disabled type-parameterized tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);
+
+template <typename T>
+class DISABLED_TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(DISABLED_TypedTestP);
+
+TYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+// Tests that assertion macros evaluate their arguments exactly once.
+
+class SingleEvaluationTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  // This helper function is needed by the FailedASSERT_STREQ test
+  // below.  It's public to work around C++Builder's bug with scoping local
+  // classes.
+  static void CompareAndIncrementCharPtrs() {
+    ASSERT_STREQ(p1_++, p2_++);
+  }
+
+  // This helper function is needed by the FailedASSERT_NE test below.  It's
+  // public to work around C++Builder's bug with scoping local classes.
+  static void CompareAndIncrementInts() {
+    ASSERT_NE(a_++, b_++);
+  }
+
+ protected:
+  SingleEvaluationTest() {
+    p1_ = s1_;
+    p2_ = s2_;
+    a_ = 0;
+    b_ = 0;
+  }
+
+  static const char* const s1_;
+  static const char* const s2_;
+  static const char* p1_;
+  static const char* p2_;
+
+  static int a_;
+  static int b_;
+};
+
+const char* const SingleEvaluationTest::s1_ = "01234";
+const char* const SingleEvaluationTest::s2_ = "abcde";
+const char* SingleEvaluationTest::p1_;
+const char* SingleEvaluationTest::p2_;
+int SingleEvaluationTest::a_;
+int SingleEvaluationTest::b_;
+
+// Tests that when ASSERT_STREQ fails, it evaluates its arguments
+// exactly once.
+TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),
+                       "p2_++");
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+}
+
+// Tests that string assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ASSERT_STR) {
+  // successful EXPECT_STRNE
+  EXPECT_STRNE(p1_++, p2_++);
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+
+  // failed EXPECT_STRCASEEQ
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),
+                          "ignoring case");
+  EXPECT_EQ(s1_ + 2, p1_);
+  EXPECT_EQ(s2_ + 2, p2_);
+}
+
+// Tests that when ASSERT_NE fails, it evaluates its arguments exactly
+// once.
+TEST_F(SingleEvaluationTest, FailedASSERT_NE) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),
+                       "(a_++) != (b_++)");
+  EXPECT_EQ(1, a_);
+  EXPECT_EQ(1, b_);
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, OtherCases) {
+  // successful EXPECT_TRUE
+  EXPECT_TRUE(0 == a_++);  // NOLINT
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_TRUE
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++");
+  EXPECT_EQ(2, a_);
+
+  // successful EXPECT_GT
+  EXPECT_GT(a_++, b_++);
+  EXPECT_EQ(3, a_);
+  EXPECT_EQ(1, b_);
+
+  // failed EXPECT_LT
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)");
+  EXPECT_EQ(4, a_);
+  EXPECT_EQ(2, b_);
+
+  // successful ASSERT_TRUE
+  ASSERT_TRUE(0 < a_++);  // NOLINT
+  EXPECT_EQ(5, a_);
+
+  // successful ASSERT_GT
+  ASSERT_GT(a_++, b_++);
+  EXPECT_EQ(6, a_);
+  EXPECT_EQ(3, b_);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAnInteger() {
+  throw 1;
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ExceptionTests) {
+  // successful EXPECT_THROW
+  EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, int);
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_THROW, throws different
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, bool), "throws a different type");
+  EXPECT_EQ(2, a_);
+
+  // failed EXPECT_THROW, throws nothing
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing");
+  EXPECT_EQ(3, a_);
+
+  // successful EXPECT_NO_THROW
+  EXPECT_NO_THROW(a_++);
+  EXPECT_EQ(4, a_);
+
+  // failed EXPECT_NO_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }), "it throws");
+  EXPECT_EQ(5, a_);
+
+  // successful EXPECT_ANY_THROW
+  EXPECT_ANY_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  });
+  EXPECT_EQ(6, a_);
+
+  // failed EXPECT_ANY_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't");
+  EXPECT_EQ(7, a_);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.
+class NoFatalFailureTest : public Test {
+ protected:
+  void Succeeds() {}
+  void FailsNonFatal() {
+    ADD_FAILURE() << "some non-fatal failure";
+  }
+  void Fails() {
+    FAIL() << "some fatal failure";
+  }
+
+  void DoAssertNoFatalFailureOnFails() {
+    ASSERT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "shold not reach here.";
+  }
+
+  void DoExpectNoFatalFailureOnFails() {
+    EXPECT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "other failure";
+  }
+};
+
+TEST_F(NoFatalFailureTest, NoFailure) {
+  EXPECT_NO_FATAL_FAILURE(Succeeds());
+  ASSERT_NO_FATAL_FAILURE(Succeeds());
+}
+
+TEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+}
+
+TEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoAssertNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+TEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoExpectNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(3, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(2).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure",
+                      gtest_failures.GetTestPartResult(2).message());
+}
+
+TEST_F(NoFatalFailureTest, MessageIsStreamable) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message";
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+// Tests non-string assertions.
+
+// Tests EqFailure(), used for implementing *EQ* assertions.
+TEST(AssertionTest, EqFailure) {
+  const std::string foo_val("5"), bar_val("6");
+  const std::string msg1(
+      EqFailure("foo", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg1.c_str());
+
+  const std::string msg2(
+      EqFailure("foo", "6", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg2.c_str());
+
+  const std::string msg3(
+      EqFailure("5", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: 5",
+      msg3.c_str());
+
+  const std::string msg4(
+      EqFailure("5", "6", foo_val, bar_val, false).failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: 5",
+      msg4.c_str());
+
+  const std::string msg5(
+      EqFailure("foo", "bar",
+                std::string("\"x\""), std::string("\"y\""),
+                true).failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: \"y\"\n"
+      "Expected: foo (ignoring case)\n"
+      "Which is: \"x\"",
+      msg5.c_str());
+}
+
+// Tests AppendUserMessage(), used for implementing the *EQ* macros.
+TEST(AssertionTest, AppendUserMessage) {
+  const std::string foo("foo");
+
+  Message msg;
+  EXPECT_STREQ("foo",
+               AppendUserMessage(foo, msg).c_str());
+
+  msg << "bar";
+  EXPECT_STREQ("foo\nbar",
+               AppendUserMessage(foo, msg).c_str());
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests ASSERT_TRUE.
+TEST(AssertionTest, ASSERT_TRUE) {
+  ASSERT_TRUE(2 > 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),
+                       "2 < 1");
+}
+
+// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertTrueWithAssertionResult) {
+  ASSERT_TRUE(ResultIsEven(2));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),
+                       "Value of: ResultIsEven(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+#endif
+  ASSERT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),
+                       "Value of: ResultIsEvenNoExplanation(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+}
+
+// Tests ASSERT_FALSE.
+TEST(AssertionTest, ASSERT_FALSE) {
+  ASSERT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),
+                       "Value of: 2 > 1\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertFalseWithAssertionResult) {
+  ASSERT_FALSE(ResultIsEven(3));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),
+                       "Value of: ResultIsEven(2)\n"
+                       "  Actual: true (2 is even)\n"
+                       "Expected: false");
+#endif
+  ASSERT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),
+                       "Value of: ResultIsEvenNoExplanation(2)\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests using ASSERT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, ASSERT_EQ_Double) {
+  // A success.
+  ASSERT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),
+                       "5.1");
+}
+
+// Tests ASSERT_EQ.
+TEST(AssertionTest, ASSERT_EQ) {
+  ASSERT_EQ(5, 2 + 3);
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),
+                       "Value of: 2*3\n"
+                       "  Actual: 6\n"
+                       "Expected: 5");
+}
+
+// Tests ASSERT_EQ(NULL, pointer).
+#if GTEST_CAN_COMPARE_NULL
+TEST(AssertionTest, ASSERT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious waring in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  ASSERT_EQ(NULL, p);
+
+  // A failure.
+  static int n = 0;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),
+                       "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, ASSERT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  ASSERT_EQ(0, n);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),
+                       "Expected: 0");
+}
+
+// Tests ASSERT_NE.
+TEST(AssertionTest, ASSERT_NE) {
+  ASSERT_NE(6, 7);
+  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),
+                       "Expected: ('a') != ('a'), "
+                       "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+}
+
+// Tests ASSERT_LE.
+TEST(AssertionTest, ASSERT_LE) {
+  ASSERT_LE(2, 3);
+  ASSERT_LE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),
+                       "Expected: (2) <= (0), actual: 2 vs 0");
+}
+
+// Tests ASSERT_LT.
+TEST(AssertionTest, ASSERT_LT) {
+  ASSERT_LT(2, 3);
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),
+                       "Expected: (2) < (2), actual: 2 vs 2");
+}
+
+// Tests ASSERT_GE.
+TEST(AssertionTest, ASSERT_GE) {
+  ASSERT_GE(2, 1);
+  ASSERT_GE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),
+                       "Expected: (2) >= (3), actual: 2 vs 3");
+}
+
+// Tests ASSERT_GT.
+TEST(AssertionTest, ASSERT_GT) {
+  ASSERT_GT(2, 1);
+  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),
+                       "Expected: (2) > (2), actual: 2 vs 2");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowNothing() {}
+
+// Tests ASSERT_THROW.
+TEST(AssertionTest, ASSERT_THROW) {
+  ASSERT_THROW(ThrowAnInteger(), int);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowAnInteger(), bool),
+      "Expected: ThrowAnInteger() throws an exception of type bool.\n"
+      "  Actual: it throws a different type.");
+# endif
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests ASSERT_NO_THROW.
+TEST(AssertionTest, ASSERT_NO_THROW) {
+  ASSERT_NO_THROW(ThrowNothing());
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),
+                       "Expected: ThrowAnInteger() doesn't throw an exception."
+                       "\n  Actual: it throws.");
+}
+
+// Tests ASSERT_ANY_THROW.
+TEST(AssertionTest, ASSERT_ANY_THROW) {
+  ASSERT_ANY_THROW(ThrowAnInteger());
+  EXPECT_FATAL_FAILURE(
+      ASSERT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Makes sure we deal with the precedence of <<.  This test should
+// compile.
+TEST(AssertionTest, AssertPrecedence) {
+  ASSERT_EQ(1 < 2, true);
+  bool false_value = false;
+  ASSERT_EQ(true && false_value, false);
+}
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// Tests calling a test subroutine that's not part of a fixture.
+TEST(AssertionTest, NonFixtureSubroutine) {
+  EXPECT_FATAL_FAILURE(TestEq1(2),
+                       "Value of: x");
+}
+
+// An uncopyable class.
+class Uncopyable {
+ public:
+  explicit Uncopyable(int a_value) : value_(a_value) {}
+
+  int value() const { return value_; }
+  bool operator==(const Uncopyable& rhs) const {
+    return value() == rhs.value();
+  }
+ private:
+  // This constructor deliberately has no implementation, as we don't
+  // want this class to be copyable.
+  Uncopyable(const Uncopyable&);  // NOLINT
+
+  int value_;
+};
+
+::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {
+  return os << value.value();
+}
+
+
+bool IsPositiveUncopyable(const Uncopyable& x) {
+  return x.value() > 0;
+}
+
+// A subroutine used by the following test.
+void TestAssertNonPositive() {
+  Uncopyable y(-1);
+  ASSERT_PRED1(IsPositiveUncopyable, y);
+}
+// A subroutine used by the following test.
+void TestAssertEqualsUncopyable() {
+  Uncopyable x(5);
+  Uncopyable y(-1);
+  ASSERT_EQ(x, y);
+}
+
+// Tests that uncopyable objects can be used in assertions.
+TEST(AssertionTest, AssertWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  ASSERT_PRED1(IsPositiveUncopyable, x);
+  ASSERT_EQ(x, x);
+  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+// Tests that uncopyable objects can be used in expects.
+TEST(AssertionTest, ExpectWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  EXPECT_PRED1(IsPositiveUncopyable, x);
+  Uncopyable y(-1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_EQ(x, x);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+enum NamedEnum {
+  kE1 = 0,
+  kE2 = 1
+};
+
+TEST(AssertionTest, NamedEnum) {
+  EXPECT_EQ(kE1, kE1);
+  EXPECT_LT(kE1, kE2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Actual: 1");
+}
+
+// The version of gcc used in XCode 2.2 has a bug and doesn't allow
+// anonymous enums in assertions.  Therefore the following test is not
+// done on Mac.
+// Sun Studio and HP aCC also reject this code.
+#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC)
+
+// Tests using assertions with anonymous enums.
+enum {
+  kCaseA = -1,
+
+# if GTEST_OS_LINUX
+
+  // We want to test the case where the size of the anonymous enum is
+  // larger than sizeof(int), to make sure our implementation of the
+  // assertions doesn't truncate the enums.  However, MSVC
+  // (incorrectly) doesn't allow an enum value to exceed the range of
+  // an int, so this has to be conditionally compiled.
+  //
+  // On Linux, kCaseB and kCaseA have the same value when truncated to
+  // int size.  We want to test whether this will confuse the
+  // assertions.
+  kCaseB = testing::internal::kMaxBiggestInt,
+
+# else
+
+  kCaseB = INT_MAX,
+
+# endif  // GTEST_OS_LINUX
+
+  kCaseC = 42
+};
+
+TEST(AssertionTest, AnonymousEnum) {
+# if GTEST_OS_LINUX
+
+  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB));
+
+# endif  // GTEST_OS_LINUX
+
+  EXPECT_EQ(kCaseA, kCaseA);
+  EXPECT_NE(kCaseA, kCaseB);
+  EXPECT_LT(kCaseA, kCaseB);
+  EXPECT_LE(kCaseA, kCaseB);
+  EXPECT_GT(kCaseB, kCaseA);
+  EXPECT_GE(kCaseA, kCaseA);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB),
+                          "(kCaseA) >= (kCaseB)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC),
+                          "-1 vs 42");
+
+  ASSERT_EQ(kCaseA, kCaseA);
+  ASSERT_NE(kCaseA, kCaseB);
+  ASSERT_LT(kCaseA, kCaseB);
+  ASSERT_LE(kCaseA, kCaseB);
+  ASSERT_GT(kCaseB, kCaseA);
+  ASSERT_GE(kCaseA, kCaseA);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB),
+                       "Value of: kCaseB");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Actual: 42");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Which is: -1");
+}
+
+#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)
+
+#if GTEST_OS_WINDOWS
+
+static HRESULT UnexpectedHRESULTFailure() {
+  return E_UNEXPECTED;
+}
+
+static HRESULT OkHRESULTSuccess() {
+  return S_OK;
+}
+
+static HRESULT FalseHRESULTSuccess() {
+  return S_FALSE;
+}
+
+// HRESULT assertion tests test both zero and non-zero
+// success codes as well as failure message for each.
+//
+// Windows CE doesn't support message texts.
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK);
+  EXPECT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {
+  ASSERT_HRESULT_SUCCEEDED(S_OK);
+  ASSERT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+// Tests that streaming to the HRESULT macros works.
+TEST(HRESULTAssertionTest, Streaming) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+# endif
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests that the assertion macros behave like single statements.
+TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    ASSERT_TRUE(false) << "This should never be executed; "
+                          "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    EXPECT_FALSE(false);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_LT(1, 3);
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_GT(3, 2) << "";
+}
+
+#if GTEST_HAS_EXCEPTIONS
+// Tests that the compiler will not complain about unreachable code in the
+// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.
+TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {
+  int n = 0;
+
+  EXPECT_THROW(throw 1, int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), "");
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), "");
+  EXPECT_NO_THROW(n++);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), "");
+  EXPECT_ANY_THROW(throw 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), "");
+}
+
+TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_THROW(ThrowNothing(), bool);
+
+  if (AlwaysTrue())
+    EXPECT_THROW(ThrowAnInteger(), int);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_NO_THROW(ThrowAnInteger());
+
+  if (AlwaysTrue())
+    EXPECT_NO_THROW(ThrowNothing());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_ANY_THROW(ThrowNothing());
+
+  if (AlwaysTrue())
+    EXPECT_ANY_THROW(ThrowAnInteger());
+  else
+    ;  // NOLINT
+}
+#endif  // GTEST_HAS_EXCEPTIONS
+
+TEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. "
+                                    << "It's a compilation test only.";
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_NO_FATAL_FAILURE(FAIL()) << "";
+  else
+    ;  // NOLINT
+
+  if (AlwaysTrue())
+    EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    ASSERT_NO_FATAL_FAILURE(SUCCEED());
+}
+
+// Tests that the assertion macros work well with switch statements.
+TEST(AssertionSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      ASSERT_TRUE(true);
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case";
+
+  // Binary assertions are implemented using a different code path
+  // than the Boolean assertions.  Hence we test them separately.
+  switch (0) {
+    case 1:
+    default:
+      ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler";
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_NE(1, 2);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAString() {
+    throw "std::string";
+}
+
+// Test that the exception assertion macros compile and work with const
+// type qualifier.
+TEST(AssertionSyntaxTest, WorksWithConst) {
+    ASSERT_THROW(ThrowAString(), const char*);
+
+    EXPECT_THROW(ThrowAString(), const char*);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+}  // namespace
+
+namespace testing {
+
+// Tests that Google Test tracks SUCCEED*.
+TEST(SuccessfulAssertionTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "OK";
+  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_*.
+TEST(SuccessfulAssertionTest, EXPECT) {
+  EXPECT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_STR*.
+TEST(SuccessfulAssertionTest, EXPECT_STR) {
+  EXPECT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_*.
+TEST(SuccessfulAssertionTest, ASSERT) {
+  ASSERT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_STR*.
+TEST(SuccessfulAssertionTest, ASSERT_STR) {
+  ASSERT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+}  // namespace testing
+
+namespace {
+
+// Tests the message streaming variation of assertions.
+
+TEST(AssertionWithMessageTest, EXPECT) {
+  EXPECT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << "Expected failure #1.",
+                          "Expected failure #1");
+  EXPECT_LE(1, 2) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << "Expected failure #2.",
+                          "Expected failure #2.");
+  EXPECT_GE(1, 0) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << "Expected failure #3.",
+                          "Expected failure #3.");
+
+  EXPECT_STREQ("1", "1") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("1", "1") << "Expected failure #4.",
+                          "Expected failure #4.");
+  EXPECT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("a", "A") << "Expected failure #5.",
+                          "Expected failure #5.");
+
+  EXPECT_FLOAT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << "Expected failure #6.",
+                          "Expected failure #6.");
+  EXPECT_NEAR(1, 1.1, 0.2) << "This should succeed.";
+}
+
+TEST(AssertionWithMessageTest, ASSERT) {
+  ASSERT_EQ(1, 1) << "This should succeed.";
+  ASSERT_NE(1, 2) << "This should succeed.";
+  ASSERT_LE(1, 2) << "This should succeed.";
+  ASSERT_LT(1, 2) << "This should succeed.";
+  ASSERT_GE(1, 0) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_STR) {
+  ASSERT_STREQ("1", "1") << "This should succeed.";
+  ASSERT_STRNE("1", "2") << "This should succeed.";
+  ASSERT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("a", "A") << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_FLOATING) {
+  ASSERT_FLOAT_EQ(1, 1) << "This should succeed.";
+  ASSERT_DOUBLE_EQ(1, 1) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << "Expect failure.",  // NOLINT
+                       "Expect failure.");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests using ASSERT_FALSE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_FALSE) {
+  ASSERT_FALSE(false) << "This shouldn't fail.";
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FALSE(true) << "Expected failure: " << 2 << " > " << 1
+                       << " evaluates to " << true;
+  }, "Expected failure");
+}
+
+// Tests using FAIL with a streamed message.
+TEST(AssertionWithMessageTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL() << 0,
+                       "0");
+}
+
+// Tests using SUCCEED with a streamed message.
+TEST(AssertionWithMessageTest, SUCCEED) {
+  SUCCEED() << "Success == " << 1;
+}
+
+// Tests using ASSERT_TRUE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_TRUE) {
+  ASSERT_TRUE(true) << "This should succeed.";
+  ASSERT_TRUE(true) << true;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_TRUE(false) << static_cast<const char *>(NULL)
+                       << static_cast<char *>(NULL);
+  }, "(null)(null)");
+}
+
+#if GTEST_OS_WINDOWS
+// Tests using wide strings in assertion messages.
+TEST(AssertionWithMessageTest, WideStringMessage) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_TRUE(false) << L"This failure is expected.\x8119";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(1, 2) << "This failure is "
+                    << L"expected too.\x8120";
+  }, "This failure is expected too.");
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests EXPECT_TRUE.
+TEST(ExpectTest, EXPECT_TRUE) {
+  EXPECT_TRUE(true) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_TRUE(2 > 1);  // NOLINT
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),
+                          "Value of: 2 < 1\n"
+                          "  Actual: false\n"
+                          "Expected: true");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),
+                          "2 > 3");
+}
+
+// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectTrueWithAssertionResult) {
+  EXPECT_TRUE(ResultIsEven(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),
+                          "Value of: ResultIsEven(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+  EXPECT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),
+                          "Value of: ResultIsEvenNoExplanation(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+}
+
+// Tests EXPECT_FALSE with a streamed message.
+TEST(ExpectTest, EXPECT_FALSE) {
+  EXPECT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FALSE(false) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),
+                          "Value of: 2 > 1\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),
+                          "2 < 3");
+}
+
+// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectFalseWithAssertionResult) {
+  EXPECT_FALSE(ResultIsEven(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),
+                          "Value of: ResultIsEven(2)\n"
+                          "  Actual: true (2 is even)\n"
+                          "Expected: false");
+  EXPECT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),
+                          "Value of: ResultIsEvenNoExplanation(2)\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests EXPECT_EQ.
+TEST(ExpectTest, EXPECT_EQ) {
+  EXPECT_EQ(5, 2 + 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),
+                          "Value of: 2*3\n"
+                          "  Actual: 6\n"
+                          "Expected: 5");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),
+                          "2 - 3");
+}
+
+// Tests using EXPECT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, EXPECT_EQ_Double) {
+  // A success.
+  EXPECT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),
+                          "5.1");
+}
+
+#if GTEST_CAN_COMPARE_NULL
+// Tests EXPECT_EQ(NULL, pointer).
+TEST(ExpectTest, EXPECT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious warning in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  EXPECT_EQ(NULL, p);
+
+  // A failure.
+  int n = 0;
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),
+                          "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, EXPECT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  EXPECT_EQ(0, n);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),
+                          "Expected: 0");
+}
+
+// Tests EXPECT_NE.
+TEST(ExpectTest, EXPECT_NE) {
+  EXPECT_NE(6, 7);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),
+                          "Expected: ('a') != ('a'), "
+                          "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),
+                          "2");
+  char* const p0 = NULL;
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),
+                          "p0");
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),
+                          "p1");
+}
+
+// Tests EXPECT_LE.
+TEST(ExpectTest, EXPECT_LE) {
+  EXPECT_LE(2, 3);
+  EXPECT_LE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),
+                          "Expected: (2) <= (0), actual: 2 vs 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),
+                          "(1.1) <= (0.9)");
+}
+
+// Tests EXPECT_LT.
+TEST(ExpectTest, EXPECT_LT) {
+  EXPECT_LT(2, 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),
+                          "Expected: (2) < (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),
+                          "(2) < (1)");
+}
+
+// Tests EXPECT_GE.
+TEST(ExpectTest, EXPECT_GE) {
+  EXPECT_GE(2, 1);
+  EXPECT_GE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),
+                          "Expected: (2) >= (3), actual: 2 vs 3");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),
+                          "(0.9) >= (1.1)");
+}
+
+// Tests EXPECT_GT.
+TEST(ExpectTest, EXPECT_GT) {
+  EXPECT_GT(2, 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),
+                          "Expected: (2) > (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),
+                          "(2) > (3)");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests EXPECT_THROW.
+TEST(ExpectTest, EXPECT_THROW) {
+  EXPECT_THROW(ThrowAnInteger(), int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),
+                          "Expected: ThrowAnInteger() throws an exception of "
+                          "type bool.\n  Actual: it throws a different type.");
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests EXPECT_NO_THROW.
+TEST(ExpectTest, EXPECT_NO_THROW) {
+  EXPECT_NO_THROW(ThrowNothing());
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),
+                          "Expected: ThrowAnInteger() doesn't throw an "
+                          "exception.\n  Actual: it throws.");
+}
+
+// Tests EXPECT_ANY_THROW.
+TEST(ExpectTest, EXPECT_ANY_THROW) {
+  EXPECT_ANY_THROW(ThrowAnInteger());
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Make sure we deal with the precedence of <<.
+TEST(ExpectTest, ExpectPrecedence) {
+  EXPECT_EQ(1 < 2, true);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),
+                          "Value of: true && false");
+}
+
+
+// Tests the StreamableToString() function.
+
+// Tests using StreamableToString() on a scalar.
+TEST(StreamableToStringTest, Scalar) {
+  EXPECT_STREQ("5", StreamableToString(5).c_str());
+}
+
+// Tests using StreamableToString() on a non-char pointer.
+TEST(StreamableToStringTest, Pointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_STRNE("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a NULL non-char pointer.
+TEST(StreamableToStringTest, NullPointer) {
+  int* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a C string.
+TEST(StreamableToStringTest, CString) {
+  EXPECT_STREQ("Foo", StreamableToString("Foo").c_str());
+}
+
+// Tests using StreamableToString() on a NULL C string.
+TEST(StreamableToStringTest, NullCString) {
+  char* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using streamable values as assertion messages.
+
+// Tests using std::string as an assertion message.
+TEST(StreamableTest, string) {
+  static const std::string str(
+      "This failure message is a std::string, and is expected.");
+  EXPECT_FATAL_FAILURE(FAIL() << str,
+                       str.c_str());
+}
+
+// Tests that we can output strings containing embedded NULs.
+// Limited to Linux because we can only do this with std::string's.
+TEST(StreamableTest, stringWithEmbeddedNUL) {
+  static const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  static const std::string string_with_nul(char_array_with_nul,
+                                           sizeof(char_array_with_nul)
+                                           - 1);  // drops the trailing NUL
+  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,
+                       "Here's a NUL\\0 and some more string");
+}
+
+// Tests that we can output a NUL char.
+TEST(StreamableTest, NULChar) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "A NUL" << '\0' << " and some more string";
+  }, "A NUL\\0 and some more string");
+}
+
+// Tests using int as an assertion message.
+TEST(StreamableTest, int) {
+  EXPECT_FATAL_FAILURE(FAIL() << 900913,
+                       "900913");
+}
+
+// Tests using NULL char pointer as an assertion message.
+//
+// In MSVC, streaming a NULL char * causes access violation.  Google Test
+// implemented a workaround (substituting "(null)" for NULL).  This
+// tests whether the workaround works.
+TEST(StreamableTest, NullCharPtr) {
+  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),
+                       "(null)");
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to testing::Message.
+TEST(StreamableTest, BasicIoManip) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "Line 1." << std::endl
+           << "A NUL char " << std::ends << std::flush << " in line 2.";
+  }, "Line 1.\nA NUL char \\0 in line 2.");
+}
+
+// Tests the macros that haven't been covered so far.
+
+void AddFailureHelper(bool* aborted) {
+  *aborted = true;
+  ADD_FAILURE() << "Intentional failure.";
+  *aborted = false;
+}
+
+// Tests ADD_FAILURE.
+TEST(MacroTest, ADD_FAILURE) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),
+                          "Intentional failure.");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests ADD_FAILURE_AT.
+TEST(MacroTest, ADD_FAILURE_AT) {
+  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and
+  // the failure message contains the user-streamed part.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42) << "Wrong!", "Wrong!");
+
+  // Verifies that the user-streamed part is optional.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42), "Failed");
+
+  // Unfortunately, we cannot verify that the failure message contains
+  // the right file path and line number the same way, as
+  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and
+  // line number.  Instead, we do that in gtest_output_test_.cc.
+}
+
+// Tests FAIL.
+TEST(MacroTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL(),
+                       "Failed");
+  EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.",
+                       "Intentional failure.");
+}
+
+// Tests SUCCEED
+TEST(MacroTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "Explicit success.";
+}
+
+// Tests for EXPECT_EQ() and ASSERT_EQ().
+//
+// These tests fail *intentionally*, s.t. the failure messages can be
+// generated and tested.
+//
+// We have different tests for different argument types.
+
+// Tests using bool values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Bool) {
+  EXPECT_EQ(true,  true);
+  EXPECT_FATAL_FAILURE({
+      bool false_value = false;
+      ASSERT_EQ(false_value, true);
+    }, "Value of: true");
+}
+
+// Tests using int values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Int) {
+  ASSERT_EQ(32, 32);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),
+                          "33");
+}
+
+// Tests using time_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Time_T) {
+  EXPECT_EQ(static_cast<time_t>(0),
+            static_cast<time_t>(0));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),
+                                 static_cast<time_t>(1234)),
+                       "1234");
+}
+
+// Tests using char values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Char) {
+  ASSERT_EQ('z', 'z');
+  const char ch = 'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch),
+                          "ch");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),
+                          "ch");
+}
+
+// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideChar) {
+  EXPECT_EQ(L'b', L'b');
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'),
+                          "Value of: L'x'\n"
+                          "  Actual: L'x' (120, 0x78)\n"
+                          "Expected: L'\0'\n"
+                          "Which is: L'\0' (0, 0x0)");
+
+  static wchar_t wchar;
+  wchar = L'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),
+                          "wchar");
+  wchar = 0x8119;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar),
+                       "Value of: wchar");
+}
+
+// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdString) {
+  // Compares a const char* to an std::string that has identical
+  // content.
+  ASSERT_EQ("Test", ::std::string("Test"));
+
+  // Compares two identical std::strings.
+  static const ::std::string str1("A * in the middle");
+  static const ::std::string str2(str1);
+  EXPECT_EQ(str1, str2);
+
+  // Compares a const char* to an std::string that has different
+  // content
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")),
+                          "\"test\"");
+
+  // Compares an std::string to a char* that has different content.
+  char* const p1 = const_cast<char*>("foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1),
+                          "p1");
+
+  // Compares two std::strings that have different contents, one of
+  // which having a NUL character in the middle.  This should fail.
+  static ::std::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),
+                       "Value of: str3\n"
+                       "  Actual: \"A \\0 in the middle\"");
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdWideString) {
+  // Compares two identical std::wstrings.
+  const ::std::wstring wstr1(L"A * in the middle");
+  const ::std::wstring wstr2(wstr1);
+  ASSERT_EQ(wstr1, wstr2);
+
+  // Compares an std::wstring to a const wchar_t* that has identical
+  // content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119);
+
+  // Compares an std::wstring to a const wchar_t* that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120);
+  }, "kTestX8120");
+
+  // Compares two std::wstrings that have different contents, one of
+  // which having a NUL character in the middle.
+  ::std::wstring wstr3(wstr1);
+  wstr3.at(2) = L'\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),
+                          "wstr3");
+
+  // Compares a wchar_t* to an std::wstring that has different
+  // content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_STRING
+// Tests using ::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalString) {
+  // Compares a const char* to a ::string that has identical content.
+  EXPECT_EQ("Test", ::string("Test"));
+
+  // Compares two identical ::strings.
+  const ::string str1("A * in the middle");
+  const ::string str2(str1);
+  ASSERT_EQ(str1, str2);
+
+  // Compares a ::string to a const char* that has different content.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"),
+                          "test");
+
+  // Compares two ::strings that have different contents, one of which
+  // having a NUL character in the middle.
+  ::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),
+                          "str3");
+
+  // Compares a ::string to a char* that has different content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(::string("bar"), const_cast<char*>("foo"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalWideString) {
+  // Compares two identical ::wstrings.
+  static const ::wstring wstr1(L"A * in the middle");
+  static const ::wstring wstr2(wstr1);
+  EXPECT_EQ(wstr1, wstr2);
+
+  // Compares a const wchar_t* to a ::wstring that has identical content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119));
+
+  // Compares a const wchar_t* to a ::wstring that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119));
+  }, "Test\\x8119");
+
+  // Compares a wchar_t* to a ::wstring that has different content.
+  wchar_t* const p1 = const_cast<wchar_t*>(L"foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")),
+                          "bar");
+
+  // Compares two ::wstrings that have different contents, one of which
+  // having a NUL character in the middle.
+  static ::wstring wstr3;
+  wstr3 = wstr1;
+  wstr3.at(2) = L'\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),
+                       "wstr3");
+}
+
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using char pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, CharPointer) {
+  char* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  char* const p2 = reinterpret_cast<char*>(pv2);
+  ASSERT_EQ(p1, p1);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),
+                                 reinterpret_cast<char*>(0xABC0)),
+                       "ABC0");
+}
+
+// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideCharPointer) {
+  wchar_t* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);
+  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);
+  EXPECT_EQ(p0, p0);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  void* pv3 = (void*)0x1234;  // NOLINT
+  void* pv4 = (void*)0xABC0;  // NOLINT
+  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);
+  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),
+                          "p4");
+}
+
+// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, OtherPointer) {
+  ASSERT_EQ(static_cast<const int*>(NULL),
+            static_cast<const int*>(NULL));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),
+                                 reinterpret_cast<const int*>(0x1234)),
+                       "0x1234");
+}
+
+// A class that supports binary comparison operators but not streaming.
+class UnprintableChar {
+ public:
+  explicit UnprintableChar(char ch) : char_(ch) {}
+
+  bool operator==(const UnprintableChar& rhs) const {
+    return char_ == rhs.char_;
+  }
+  bool operator!=(const UnprintableChar& rhs) const {
+    return char_ != rhs.char_;
+  }
+  bool operator<(const UnprintableChar& rhs) const {
+    return char_ < rhs.char_;
+  }
+  bool operator<=(const UnprintableChar& rhs) const {
+    return char_ <= rhs.char_;
+  }
+  bool operator>(const UnprintableChar& rhs) const {
+    return char_ > rhs.char_;
+  }
+  bool operator>=(const UnprintableChar& rhs) const {
+    return char_ >= rhs.char_;
+  }
+
+ private:
+  char char_;
+};
+
+// Tests that ASSERT_EQ() and friends don't require the arguments to
+// be printable.
+TEST(ComparisonAssertionTest, AcceptsUnprintableArgs) {
+  const UnprintableChar x('x'), y('y');
+  ASSERT_EQ(x, x);
+  EXPECT_NE(x, y);
+  ASSERT_LT(x, y);
+  EXPECT_LE(x, y);
+  ASSERT_GT(y, x);
+  EXPECT_GE(x, x);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <79>");
+
+  // Code tested by EXPECT_FATAL_FAILURE cannot reference local
+  // variables, so we have to write UnprintableChar('x') instead of x.
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <78>");
+#endif
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <79>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <79>");
+}
+
+// Tests the FRIEND_TEST macro.
+
+// This class has a private member we want to test.  We will test it
+// both in a TEST and in a TEST_F.
+class Foo {
+ public:
+  Foo() {}
+
+ private:
+  int Bar() const { return 1; }
+
+  // Declares the friend tests that can access the private member
+  // Bar().
+  FRIEND_TEST(FRIEND_TEST_Test, TEST);
+  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST to access a
+// class's private members.  This should compile.
+TEST(FRIEND_TEST_Test, TEST) {
+  ASSERT_EQ(1, Foo().Bar());
+}
+
+// The fixture needed to test using FRIEND_TEST with TEST_F.
+class FRIEND_TEST_Test2 : public Test {
+ protected:
+  Foo foo;
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
+// class's private members.  This should compile.
+TEST_F(FRIEND_TEST_Test2, TEST_F) {
+  ASSERT_EQ(1, foo.Bar());
+}
+
+// Tests the life cycle of Test objects.
+
+// The test fixture for testing the life cycle of Test objects.
+//
+// This class counts the number of live test objects that uses this
+// fixture.
+class TestLifeCycleTest : public Test {
+ protected:
+  // Constructor.  Increments the number of test objects that uses
+  // this fixture.
+  TestLifeCycleTest() { count_++; }
+
+  // Destructor.  Decrements the number of test objects that uses this
+  // fixture.
+  ~TestLifeCycleTest() { count_--; }
+
+  // Returns the number of live test objects that uses this fixture.
+  int count() const { return count_; }
+
+ private:
+  static int count_;
+};
+
+int TestLifeCycleTest::count_ = 0;
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test1) {
+  // There should be only one test object in this test case that's
+  // currently alive.
+  ASSERT_EQ(1, count());
+}
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test2) {
+  // After Test1 is done and Test2 is started, there should still be
+  // only one live test object, as the object for Test1 should've been
+  // deleted.
+  ASSERT_EQ(1, count());
+}
+
+}  // namespace
+
+// Tests that the copy constructor works when it is NOT optimized away by
+// the compiler.
+TEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {
+  // Checks that the copy constructor doesn't try to dereference NULL pointers
+  // in the source object.
+  AssertionResult r1 = AssertionSuccess();
+  AssertionResult r2 = r1;
+  // The following line is added to prevent the compiler from optimizing
+  // away the constructor call.
+  r1 << "abc";
+
+  AssertionResult r3 = r1;
+  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));
+  EXPECT_STREQ("abc", r1.message());
+}
+
+// Tests that AssertionSuccess and AssertionFailure construct
+// AssertionResult objects as expected.
+TEST(AssertionResultTest, ConstructionWorks) {
+  AssertionResult r1 = AssertionSuccess();
+  EXPECT_TRUE(r1);
+  EXPECT_STREQ("", r1.message());
+
+  AssertionResult r2 = AssertionSuccess() << "abc";
+  EXPECT_TRUE(r2);
+  EXPECT_STREQ("abc", r2.message());
+
+  AssertionResult r3 = AssertionFailure();
+  EXPECT_FALSE(r3);
+  EXPECT_STREQ("", r3.message());
+
+  AssertionResult r4 = AssertionFailure() << "def";
+  EXPECT_FALSE(r4);
+  EXPECT_STREQ("def", r4.message());
+
+  AssertionResult r5 = AssertionFailure(Message() << "ghi");
+  EXPECT_FALSE(r5);
+  EXPECT_STREQ("ghi", r5.message());
+}
+
+// Tests that the negation flips the predicate result but keeps the message.
+TEST(AssertionResultTest, NegationWorks) {
+  AssertionResult r1 = AssertionSuccess() << "abc";
+  EXPECT_FALSE(!r1);
+  EXPECT_STREQ("abc", (!r1).message());
+
+  AssertionResult r2 = AssertionFailure() << "def";
+  EXPECT_TRUE(!r2);
+  EXPECT_STREQ("def", (!r2).message());
+}
+
+TEST(AssertionResultTest, StreamingWorks) {
+  AssertionResult r = AssertionSuccess();
+  r << "abc" << 'd' << 0 << true;
+  EXPECT_STREQ("abcd0true", r.message());
+}
+
+TEST(AssertionResultTest, CanStreamOstreamManipulators) {
+  AssertionResult r = AssertionSuccess();
+  r << "Data" << std::endl << std::flush << std::ends << "Will be visible";
+  EXPECT_STREQ("Data\n\\0Will be visible", r.message());
+}
+
+// Tests streaming a user type whose definition and operator << are
+// both in the global namespace.
+class Base {
+ public:
+  explicit Base(int an_x) : x_(an_x) {}
+  int x() const { return x_; }
+ private:
+  int x_;
+};
+std::ostream& operator<<(std::ostream& os,
+                         const Base& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const Base* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {
+  Message msg;
+  Base a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in an unnamed namespace.
+namespace {
+class MyTypeInUnnamedNameSpace : public Base {
+ public:
+  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace
+
+TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {
+  Message msg;
+  MyTypeInUnnamedNameSpace a(1);
+
+  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in a user namespace.
+namespace namespace1 {
+class MyTypeInNameSpace1 : public Base {
+ public:
+  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace namespace1
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpace) {
+  Message msg;
+  namespace1::MyTypeInNameSpace1 a(1);
+
+  msg << a << &a;  // Uses namespace1::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition is in a user namespace
+// but whose operator<< is in the global namespace.
+namespace namespace2 {
+class MyTypeInNameSpace2 : public ::Base {
+ public:
+  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}
+};
+}  // namespace namespace2
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {
+  Message msg;
+  namespace2::MyTypeInNameSpace2 a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming NULL pointers to testing::Message.
+TEST(MessageTest, NullPointers) {
+  Message msg;
+  char* const p1 = NULL;
+  unsigned char* const p2 = NULL;
+  int* p3 = NULL;
+  double* p4 = NULL;
+  bool* p5 = NULL;
+  Message* p6 = NULL;
+
+  msg << p1 << p2 << p3 << p4 << p5 << p6;
+  ASSERT_STREQ("(null)(null)(null)(null)(null)(null)",
+               msg.GetString().c_str());
+}
+
+// Tests streaming wide strings to testing::Message.
+TEST(MessageTest, WideStrings) {
+  // Streams a NULL of type const wchar_t*.
+  const wchar_t* const_wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a NULL of type wchar_t*.
+  wchar_t* wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << wstr).GetString().c_str());
+
+  // Streams a non-NULL of type const wchar_t*.
+  const_wstr = L"abc\x8119";
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a non-NULL of type wchar_t*.
+  wstr = const_cast<wchar_t*>(const_wstr);
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << wstr).GetString().c_str());
+}
+
+
+// This line tests that we can define tests in the testing namespace.
+namespace testing {
+
+// Tests the TestInfo class.
+
+class TestInfoTest : public Test {
+ protected:
+  static const TestInfo* GetTestInfo(const char* test_name) {
+    const TestCase* const test_case = GetUnitTestImpl()->
+        GetTestCase("TestInfoTest", "", NULL, NULL);
+
+    for (int i = 0; i < test_case->total_test_count(); ++i) {
+      const TestInfo* const test_info = test_case->GetTestInfo(i);
+      if (strcmp(test_name, test_info->name()) == 0)
+        return test_info;
+    }
+    return NULL;
+  }
+
+  static const TestResult* GetTestResult(
+      const TestInfo* test_info) {
+    return test_info->result();
+  }
+};
+
+// Tests TestInfo::test_case_name() and TestInfo::name().
+TEST_F(TestInfoTest, Names) {
+  const TestInfo* const test_info = GetTestInfo("Names");
+
+  ASSERT_STREQ("TestInfoTest", test_info->test_case_name());
+  ASSERT_STREQ("Names", test_info->name());
+}
+
+// Tests TestInfo::result().
+TEST_F(TestInfoTest, result) {
+  const TestInfo* const test_info = GetTestInfo("result");
+
+  // Initially, there is no TestPartResult for this test.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+
+  // After the previous assertion, there is still none.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+}
+
+// Tests setting up and tearing down a test case.
+
+class SetUpTestCaseTest : public Test {
+ protected:
+  // This will be called once before the first test in this test case
+  // is run.
+  static void SetUpTestCase() {
+    printf("Setting up the test case . . .\n");
+
+    // Initializes some shared resource.  In this simple example, we
+    // just create a C string.  More complex stuff can be done if
+    // desired.
+    shared_resource_ = "123";
+
+    // Increments the number of test cases that have been set up.
+    counter_++;
+
+    // SetUpTestCase() should be called only once.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // This will be called once after the last test in this test case is
+  // run.
+  static void TearDownTestCase() {
+    printf("Tearing down the test case . . .\n");
+
+    // Decrements the number of test cases that have been set up.
+    counter_--;
+
+    // TearDownTestCase() should be called only once.
+    EXPECT_EQ(0, counter_);
+
+    // Cleans up the shared resource.
+    shared_resource_ = NULL;
+  }
+
+  // This will be called before each test in this test case.
+  virtual void SetUp() {
+    // SetUpTestCase() should be called only once, so counter_ should
+    // always be 1.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // Number of test cases that have been set up.
+  static int counter_;
+
+  // Some resource to be shared by all tests in this test case.
+  static const char* shared_resource_;
+};
+
+int SetUpTestCaseTest::counter_ = 0;
+const char* SetUpTestCaseTest::shared_resource_ = NULL;
+
+// A test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test1) {
+  EXPECT_STRNE(NULL, shared_resource_);
+}
+
+// Another test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test2) {
+  EXPECT_STREQ("123", shared_resource_);
+}
+
+// The InitGoogleTestTest test case tests testing::InitGoogleTest().
+
+// The Flags struct stores a copy of all Google Test flags.
+struct Flags {
+  // Constructs a Flags struct where each flag has its default value.
+  Flags() : also_run_disabled_tests(false),
+            break_on_failure(false),
+            catch_exceptions(false),
+            death_test_use_fork(false),
+            filter(""),
+            list_tests(false),
+            output(""),
+            print_time(true),
+            random_seed(0),
+            repeat(1),
+            shuffle(false),
+            stack_trace_depth(kMaxStackTraceDepth),
+            stream_result_to(""),
+            throw_on_failure(false) {}
+
+  // Factory methods.
+
+  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has
+  // the given value.
+  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {
+    Flags flags;
+    flags.also_run_disabled_tests = also_run_disabled_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_break_on_failure flag has
+  // the given value.
+  static Flags BreakOnFailure(bool break_on_failure) {
+    Flags flags;
+    flags.break_on_failure = break_on_failure;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_catch_exceptions flag has
+  // the given value.
+  static Flags CatchExceptions(bool catch_exceptions) {
+    Flags flags;
+    flags.catch_exceptions = catch_exceptions;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_death_test_use_fork flag has
+  // the given value.
+  static Flags DeathTestUseFork(bool death_test_use_fork) {
+    Flags flags;
+    flags.death_test_use_fork = death_test_use_fork;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_filter flag has the given
+  // value.
+  static Flags Filter(const char* filter) {
+    Flags flags;
+    flags.filter = filter;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_list_tests flag has the
+  // given value.
+  static Flags ListTests(bool list_tests) {
+    Flags flags;
+    flags.list_tests = list_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_output flag has the given
+  // value.
+  static Flags Output(const char* output) {
+    Flags flags;
+    flags.output = output;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_print_time flag has the given
+  // value.
+  static Flags PrintTime(bool print_time) {
+    Flags flags;
+    flags.print_time = print_time;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_random_seed flag has
+  // the given value.
+  static Flags RandomSeed(Int32 random_seed) {
+    Flags flags;
+    flags.random_seed = random_seed;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_repeat flag has the given
+  // value.
+  static Flags Repeat(Int32 repeat) {
+    Flags flags;
+    flags.repeat = repeat;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_shuffle flag has
+  // the given value.
+  static Flags Shuffle(bool shuffle) {
+    Flags flags;
+    flags.shuffle = shuffle;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has
+  // the given value.
+  static Flags StackTraceDepth(Int32 stack_trace_depth) {
+    Flags flags;
+    flags.stack_trace_depth = stack_trace_depth;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has
+  // the given value.
+  static Flags StreamResultTo(const char* stream_result_to) {
+    Flags flags;
+    flags.stream_result_to = stream_result_to;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_throw_on_failure flag has
+  // the given value.
+  static Flags ThrowOnFailure(bool throw_on_failure) {
+    Flags flags;
+    flags.throw_on_failure = throw_on_failure;
+    return flags;
+  }
+
+  // These fields store the flag values.
+  bool also_run_disabled_tests;
+  bool break_on_failure;
+  bool catch_exceptions;
+  bool death_test_use_fork;
+  const char* filter;
+  bool list_tests;
+  const char* output;
+  bool print_time;
+  Int32 random_seed;
+  Int32 repeat;
+  bool shuffle;
+  Int32 stack_trace_depth;
+  const char* stream_result_to;
+  bool throw_on_failure;
+};
+
+// Fixture for testing InitGoogleTest().
+class InitGoogleTestTest : public Test {
+ protected:
+  // Clears the flags before each test.
+  virtual void SetUp() {
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Asserts that two narrow or wide string arrays are equal.
+  template <typename CharType>
+  static void AssertStringArrayEq(size_t size1, CharType** array1,
+                                  size_t size2, CharType** array2) {
+    ASSERT_EQ(size1, size2) << " Array sizes different.";
+
+    for (size_t i = 0; i != size1; i++) {
+      ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
+    }
+  }
+
+  // Verifies that the flag values match the expected values.
+  static void CheckFlags(const Flags& expected) {
+    EXPECT_EQ(expected.also_run_disabled_tests,
+              GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));
+    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));
+    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());
+    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
+    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
+    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
+    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));
+    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
+    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));
+    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ(expected.stream_result_to,
+                 GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
+  }
+
+  // Parses a command line (specified by argc1 and argv1), then
+  // verifies that the flag values are expected and that the
+  // recognized flags are removed from the command line.
+  template <typename CharType>
+  static void TestParsingFlags(int argc1, const CharType** argv1,
+                               int argc2, const CharType** argv2,
+                               const Flags& expected, bool should_print_help) {
+    const bool saved_help_flag = ::testing::internal::g_help_flag;
+    ::testing::internal::g_help_flag = false;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    CaptureStdout();
+#endif
+
+    // Parses the command line.
+    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const std::string captured_stdout = GetCapturedStdout();
+#endif
+
+    // Verifies the flag values.
+    CheckFlags(expected);
+
+    // Verifies that the recognized flags are removed from the command
+    // line.
+    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);
+
+    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the
+    // help message for the flags it recognizes.
+    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const char* const expected_help_fragment =
+        "This program contains tests written using";
+    if (should_print_help) {
+      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);
+    } else {
+      EXPECT_PRED_FORMAT2(IsNotSubstring,
+                          expected_help_fragment, captured_stdout);
+    }
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+    ::testing::internal::g_help_flag = saved_help_flag;
+  }
+
+  // This macro wraps TestParsingFlags s.t. the user doesn't need
+  // to specify the array sizes.
+
+#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \
+  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \
+                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \
+                   expected, should_print_help)
+};
+
+// Tests parsing an empty command line.
+TEST_F(InitGoogleTestTest, Empty) {
+  const char* argv[] = {
+    NULL
+  };
+
+  const char* argv2[] = {
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a command line that has no flag.
+TEST_F(InitGoogleTestTest, NoFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a bad --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterBad) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true);
+}
+
+// Tests parsing an empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false);
+}
+
+// Tests parsing a non-empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterNonEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=abc",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false);
+}
+
+// Tests parsing --gtest_break_on_failure.
+TEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_break_on_failure=0.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=f.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=F.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_break_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, BreakOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_catch_exceptions.
+TEST_F(InitGoogleTestTest, CatchExceptions) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_catch_exceptions",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);
+}
+
+// Tests parsing --gtest_death_test_use_fork.
+TEST_F(InitGoogleTestTest, DeathTestUseFork) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_death_test_use_fork",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);
+}
+
+// Tests having the same flag twice with different values.  The
+// expected behavior is that the one coming last takes precedence.
+TEST_F(InitGoogleTestTest, DuplicatedFlags) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=a",
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false);
+}
+
+// Tests having an unrecognized flag on the command line.
+TEST_F(InitGoogleTestTest, UnrecognizedFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    "bar",  // Unrecognized by Google Test.
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "bar",
+    NULL
+  };
+
+  Flags flags;
+  flags.break_on_failure = true;
+  flags.filter = "b";
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);
+}
+
+// Tests having a --gtest_list_tests flag
+TEST_F(InitGoogleTestTest, ListTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, ListTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, ListTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=f.
+TEST_F(InitGoogleTestTest, ListTestsFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=F.
+TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_output (invalid).
+TEST_F(InitGoogleTestTest, OutputEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);
+}
+
+// Tests parsing --gtest_output=xml
+TEST_F(InitGoogleTestTest, OutputXml) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false);
+}
+
+// Tests parsing --gtest_output=xml:file
+TEST_F(InitGoogleTestTest, OutputXmlFile) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:file",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false);
+}
+
+// Tests parsing --gtest_output=xml:directory/path/
+TEST_F(InitGoogleTestTest, OutputXmlDirectory) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:directory/path/",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                            Flags::Output("xml:directory/path/"), false);
+}
+
+// Tests having a --gtest_print_time flag
+TEST_F(InitGoogleTestTest, PrintTimeFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "true" value
+TEST_F(InitGoogleTestTest, PrintTimeTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "false" value
+TEST_F(InitGoogleTestTest, PrintTimeFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=f.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=F.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_random_seed=number
+TEST_F(InitGoogleTestTest, RandomSeed) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_random_seed=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);
+}
+
+// Tests parsing --gtest_repeat=number
+TEST_F(InitGoogleTestTest, Repeat) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_repeat=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(false), false);
+}
+
+// Tests parsing --gtest_shuffle.
+TEST_F(InitGoogleTestTest, ShuffleWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_shuffle=0.
+TEST_F(InitGoogleTestTest, ShuffleFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);
+}
+
+// Tests parsing a --gtest_shuffle flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ShuffleTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_stack_trace_depth=number.
+TEST_F(InitGoogleTestTest, StackTraceDepth) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stack_trace_depth=5",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);
+}
+
+TEST_F(InitGoogleTestTest, StreamResultTo) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stream_result_to=localhost:1234",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(
+      argv, argv2, Flags::StreamResultTo("localhost:1234"), false);
+}
+
+// Tests parsing --gtest_throw_on_failure.
+TEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+// Tests parsing --gtest_throw_on_failure=0.
+TEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_throw_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ThrowOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+#if GTEST_OS_WINDOWS
+// Tests parsing wide strings.
+TEST_F(InitGoogleTestTest, WideStrings) {
+  const wchar_t* argv[] = {
+    L"foo.exe",
+    L"--gtest_filter=Foo*",
+    L"--gtest_list_tests=1",
+    L"--gtest_break_on_failure",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  const wchar_t* argv2[] = {
+    L"foo.exe",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  Flags expected_flags;
+  expected_flags.break_on_failure = true;
+  expected_flags.filter = "Foo*";
+  expected_flags.list_tests = true;
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests current_test_info() in UnitTest.
+class CurrentTestInfoTest : public Test {
+ protected:
+  // Tests that current_test_info() returns NULL before the first test in
+  // the test case is run.
+  static void SetUpTestCase() {
+    // There should be no tests running at this point.
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+
+  // Tests that current_test_info() returns NULL after the last test in
+  // the test case has run.
+  static void TearDownTestCase() {
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+};
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.
+TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.  We
+// use this test to see that the TestInfo object actually changed from
+// the previous invocation.
+TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+}  // namespace testing
+
+// These two lines test that we can define tests in a namespace that
+// has the name "testing" and is nested in another namespace.
+namespace my_namespace {
+namespace testing {
+
+// Makes sure that TEST knows to use ::testing::Test instead of
+// ::my_namespace::testing::Test.
+class Test {};
+
+// Makes sure that an assertion knows to use ::testing::Message instead of
+// ::my_namespace::testing::Message.
+class Message {};
+
+// Makes sure that an assertion knows to use
+// ::testing::AssertionResult instead of
+// ::my_namespace::testing::AssertionResult.
+class AssertionResult {};
+
+// Tests that an assertion that should succeed works as expected.
+TEST(NestedTestingNamespaceTest, Success) {
+  EXPECT_EQ(1, 1) << "This shouldn't fail.";
+}
+
+// Tests that an assertion that should fail works as expected.
+TEST(NestedTestingNamespaceTest, Failure) {
+  EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.",
+                       "This failure is expected.");
+}
+
+}  // namespace testing
+}  // namespace my_namespace
+
+// Tests that one can call superclass SetUp and TearDown methods--
+// that is, that they are not private.
+// No tests are based on this fixture; the test "passes" if it compiles
+// successfully.
+class ProtectedFixtureMethodsTest : public Test {
+ protected:
+  virtual void SetUp() {
+    Test::SetUp();
+  }
+  virtual void TearDown() {
+    Test::TearDown();
+  }
+};
+
+// StreamingAssertionsTest tests the streaming versions of a representative
+// sample of assertions.
+TEST(StreamingAssertionsTest, Unconditional) {
+  SUCCEED() << "expected success";
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(FAIL() << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+TEST(StreamingAssertionsTest, Truth) {
+  EXPECT_TRUE(true) << "unexpected failure";
+  ASSERT_TRUE(true) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, Truth2) {
+  EXPECT_FALSE(false) << "unexpected failure";
+  ASSERT_FALSE(false) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+TEST(StreamingAssertionsTest, IntegerEquals) {
+  EXPECT_EQ(1, 1) << "unexpected failure";
+  ASSERT_EQ(1, 1) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, IntegerLessThan) {
+  EXPECT_LT(1, 2) << "unexpected failure";
+  ASSERT_LT(1, 2) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqual) {
+  EXPECT_STREQ("foo", "foo") << "unexpected failure";
+  ASSERT_STREQ("foo", "foo") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsNotEqual) {
+  EXPECT_STRNE("foo", "bar") << "unexpected failure";
+  ASSERT_STRNE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {
+  EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {
+  EXPECT_STRCASENE("foo", "bar") << "unexpected failure";
+  ASSERT_STRCASENE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, FloatingPointEquals) {
+  EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                       "expected failure");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+TEST(StreamingAssertionsTest, Throw) {
+  EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, NoThrow) {
+  EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, AnyThrow) {
+  EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<
+                       "expected failure", "expected failure");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that Google Test correctly decides whether to use colors in the output.
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {
+  GTEST_FLAG(color) = "yes";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+
+  GTEST_FLAG(color) = "True";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "t";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "1";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {
+  GTEST_FLAG(color) = "no";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+
+  GTEST_FLAG(color) = "F";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "0";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "unknown";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {
+  GTEST_FLAG(color) = "auto";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {
+  GTEST_FLAG(color) = "auto";
+
+#if GTEST_OS_WINDOWS
+  // On Windows, we ignore the TERM variable as it's usually not set.
+
+  SetEnv("TERM", "dumb");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#else
+  // On non-Windows platforms, we rely on TERM to determine if the
+  // terminal supports colors.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "emacs");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "vt100");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-mono");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "linux");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "cygwin");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#endif  // GTEST_OS_WINDOWS
+}
+
+// Verifies that StaticAssertTypeEq works in a namespace scope.
+
+static bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>();
+static bool dummy2 GTEST_ATTRIBUTE_UNUSED_ =
+    StaticAssertTypeEq<const int, const int>();
+
+// Verifies that StaticAssertTypeEq works in a class.
+
+template <typename T>
+class StaticAssertTypeEqTestHelper {
+ public:
+  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }
+};
+
+TEST(StaticAssertTypeEqTest, WorksInClass) {
+  StaticAssertTypeEqTestHelper<bool>();
+}
+
+// Verifies that StaticAssertTypeEq works inside a function.
+
+typedef int IntAlias;
+
+TEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {
+  StaticAssertTypeEq<int, IntAlias>();
+  StaticAssertTypeEq<int*, IntAlias*>();
+}
+
+TEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) {
+  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
+
+  // We don't have a stack walker in Google Test yet.
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str());
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str());
+}
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasNonfatalFailure());
+}
+
+static void FailFatally() { FAIL(); }
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {
+  FailFatally();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_FALSE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+// A wrapper for calling HasNonfatalFailure outside of a test body.
+static bool HasNonfatalFailureHelper() {
+  return testing::Test::HasNonfatalFailure();
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasNonfatalFailureHelper());
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasFailure());
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {
+  FailFatally();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+// A wrapper for calling HasFailure outside of a test body.
+static bool HasFailureHelper() { return testing::Test::HasFailure(); }
+
+TEST(HasFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasFailureHelper());
+}
+
+TEST(HasFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+class TestListener : public EmptyTestEventListener {
+ public:
+  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}
+  TestListener(int* on_start_counter, bool* is_destroyed)
+      : on_start_counter_(on_start_counter),
+        is_destroyed_(is_destroyed) {}
+
+  virtual ~TestListener() {
+    if (is_destroyed_)
+      *is_destroyed_ = true;
+  }
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    if (on_start_counter_ != NULL)
+      (*on_start_counter_)++;
+  }
+
+ private:
+  int* on_start_counter_;
+  bool* is_destroyed_;
+};
+
+// Tests the constructor.
+TEST(TestEventListenersTest, ConstructionWorks) {
+  TestEventListeners listeners;
+
+  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+}
+
+// Tests that the TestEventListeners destructor deletes all the listeners it
+// owns.
+TEST(TestEventListenersTest, DestructionWorks) {
+  bool default_result_printer_is_destroyed = false;
+  bool default_xml_printer_is_destroyed = false;
+  bool extra_listener_is_destroyed = false;
+  TestListener* default_result_printer = new TestListener(
+      NULL, &default_result_printer_is_destroyed);
+  TestListener* default_xml_printer = new TestListener(
+      NULL, &default_xml_printer_is_destroyed);
+  TestListener* extra_listener = new TestListener(
+      NULL, &extra_listener_is_destroyed);
+
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,
+                                                        default_result_printer);
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,
+                                                       default_xml_printer);
+    listeners.Append(extra_listener);
+  }
+  EXPECT_TRUE(default_result_printer_is_destroyed);
+  EXPECT_TRUE(default_xml_printer_is_destroyed);
+  EXPECT_TRUE(extra_listener_is_destroyed);
+}
+
+// Tests that a listener Append'ed to a TestEventListeners list starts
+// receiving events.
+TEST(TestEventListenersTest, Append) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(1, on_start_counter);
+  }
+  EXPECT_TRUE(is_destroyed);
+}
+
+// Tests that listeners receive events in the order they were appended to
+// the list, except for *End requests, which must be received in the reverse
+// order.
+class SequenceTestingListener : public EmptyTestEventListener {
+ public:
+  SequenceTestingListener(std::vector<std::string>* vector, const char* id)
+      : vector_(vector), id_(id) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramStart"));
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramEnd"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationStart"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationEnd"));
+  }
+
+ private:
+  std::string GetEventDescription(const char* method) {
+    Message message;
+    message << id_ << "." << method;
+    return message.GetString();
+  }
+
+  std::vector<std::string>* vector_;
+  const char* const id_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);
+};
+
+TEST(EventListenerTest, AppendKeepsOrder) {
+  std::vector<std::string> vec;
+  TestEventListeners listeners;
+  listeners.Append(new SequenceTestingListener(&vec, "1st"));
+  listeners.Append(new SequenceTestingListener(&vec, "2nd"));
+  listeners.Append(new SequenceTestingListener(&vec, "3rd"));
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str());
+}
+
+// Tests that a listener removed from a TestEventListeners list stops receiving
+// events and is not deleted when the list is destroyed.
+TEST(TestEventListenersTest, Release) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    EXPECT_EQ(listener, listeners.Release(listener));
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_TRUE(listeners.Release(listener) == NULL);
+  }
+  EXPECT_EQ(0, on_start_counter);
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that no events are forwarded when event forwarding is disabled.
+TEST(EventListenerTest, SuppressEventForwarding) {
+  int on_start_counter = 0;
+  TestListener* listener = new TestListener(&on_start_counter, NULL);
+
+  TestEventListeners listeners;
+  listeners.Append(listener);
+  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::SuppressEventForwarding(&listeners);
+  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(0, on_start_counter);
+}
+
+// Tests that events generated by Google Test are not forwarded in
+// death test subprocesses.
+TEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {
+  EXPECT_DEATH_IF_SUPPORTED({
+      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(
+          *GetUnitTestImpl()->listeners())) << "expected failure";},
+      "expected failure");
+}
+
+// Tests that a listener installed via SetDefaultResultPrinter() starts
+// receiving events and is returned via default_result_printer() and that
+// the previous default_result_printer is removed from the list and deleted.
+TEST(EventListenerTest, default_result_printer) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_result_printer());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_result_printer with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_result_printer listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_result_printer() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_result_printer.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that a listener installed via SetDefaultXmlGenerator() starts
+// receiving events and is returned via default_xml_generator() and that
+// the previous default_xml_generator is removed from the list and deleted.
+TEST(EventListenerTest, default_xml_generator) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_xml_generator());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_xml_generator with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_xml_generator listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_xml_generator.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Sanity tests to ensure that the alternative, verbose spellings of
+// some of the macros work.  We don't test them thoroughly as that
+// would be quite involved.  Since their implementations are
+// straightforward, and they are rarely used, we'll just rely on the
+// users to tell us when they are broken.
+GTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.
+  GTEST_SUCCEED() << "OK";  // GTEST_SUCCEED is the same as SUCCEED.
+
+  // GTEST_FAIL is the same as FAIL.
+  EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure",
+                       "An expected failure");
+
+  // GTEST_ASSERT_XY is the same as ASSERT_XY.
+
+  GTEST_ASSERT_EQ(0, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_NE(0, 1);
+  GTEST_ASSERT_NE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LE(0, 0);
+  GTEST_ASSERT_LE(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LT(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GE(0, 0);
+  GTEST_ASSERT_GE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GT(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << "An expected failure",
+                       "An expected failure");
+}
+
+// Tests for internal utilities necessary for implementation of the universal
+// printing.
+// TODO(vladl at google.com): Find a better home for them.
+
+class ConversionHelperBase {};
+class ConversionHelperDerived : public ConversionHelperBase {};
+
+// Tests that IsAProtocolMessage<T>::value is a compile-time constant.
+TEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value,
+                        const_true);
+  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false);
+}
+
+// Tests that IsAProtocolMessage<T>::value is true when T is
+// proto2::Message or a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) {
+  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value);
+  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value);
+}
+
+// Tests that IsAProtocolMessage<T>::value is false when T is neither
+// ProtocolMessage nor a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) {
+  EXPECT_FALSE(IsAProtocolMessage<int>::value);
+  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value);
+}
+
+// Tests that CompileAssertTypesEqual compiles when the type arguments are
+// equal.
+TEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) {
+  CompileAssertTypesEqual<void, void>();
+  CompileAssertTypesEqual<int*, int*>();
+}
+
+// Tests that RemoveReference does not affect non-reference types.
+TEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) {
+  CompileAssertTypesEqual<int, RemoveReference<int>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>();
+}
+
+// Tests that RemoveReference removes reference from reference types.
+TEST(RemoveReferenceTest, RemovesReference) {
+  CompileAssertTypesEqual<int, RemoveReference<int&>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReference() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>();
+}
+
+TEST(RemoveReferenceTest, MacroVersion) {
+  TestGTestRemoveReference<int, int>();
+  TestGTestRemoveReference<const char, const char&>();
+}
+
+
+// Tests that RemoveConst does not affect non-const types.
+TEST(RemoveConstTest, DoesNotAffectNonConstType) {
+  CompileAssertTypesEqual<int, RemoveConst<int>::type>();
+  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>();
+}
+
+// Tests that RemoveConst removes const from const types.
+TEST(RemoveConstTest, RemovesConst) {
+  CompileAssertTypesEqual<int, RemoveConst<const int>::type>();
+  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>();
+  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>();
+}
+
+// Tests GTEST_REMOVE_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>();
+}
+
+TEST(RemoveConstTest, MacroVersion) {
+  TestGTestRemoveConst<int, int>();
+  TestGTestRemoveConst<double&, double&>();
+  TestGTestRemoveConst<char, const char>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReferenceAndConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();
+}
+
+TEST(RemoveReferenceToConstTest, Works) {
+  TestGTestRemoveReferenceAndConst<int, int>();
+  TestGTestRemoveReferenceAndConst<double, double&>();
+  TestGTestRemoveReferenceAndConst<char, const char>();
+  TestGTestRemoveReferenceAndConst<char, const char&>();
+  TestGTestRemoveReferenceAndConst<const char*, const char*>();
+}
+
+// Tests that AddReference does not affect reference types.
+TEST(AddReferenceTest, DoesNotAffectReferenceType) {
+  CompileAssertTypesEqual<int&, AddReference<int&>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>();
+}
+
+// Tests that AddReference adds reference to non-reference types.
+TEST(AddReferenceTest, AddsReference) {
+  CompileAssertTypesEqual<int&, AddReference<int>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char>::type>();
+}
+
+// Tests GTEST_ADD_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestAddReference() {
+  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>();
+}
+
+TEST(AddReferenceTest, MacroVersion) {
+  TestGTestAddReference<int&, int>();
+  TestGTestAddReference<const char&, const char&>();
+}
+
+// Tests GTEST_REFERENCE_TO_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestReferenceToConst() {
+  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>();
+}
+
+TEST(GTestReferenceToConstTest, Works) {
+  TestGTestReferenceToConst<const char&, char>();
+  TestGTestReferenceToConst<const int&, const int>();
+  TestGTestReferenceToConst<const double&, double>();
+  TestGTestReferenceToConst<const std::string&, const std::string&>();
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant.
+TEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true);
+  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value),
+                        const_false);
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can
+// be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) {
+  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&,
+                                     const ConversionHelperBase&>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase,
+                                     ConversionHelperBase>::value));
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1
+// cannot be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) {
+  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&,
+                                      ConversionHelperDerived&>::value));
+}
+
+// Tests IsContainerTest.
+
+class NonContainer {};
+
+TEST(IsContainerTestTest, WorksForNonContainer) {
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0)));
+}
+
+TEST(IsContainerTestTest, WorksForContainer) {
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::vector<bool> >(0)));
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::map<int, double> >(0)));
+}
+
+// Tests ArrayEq().
+
+TEST(ArrayEqTest, WorksForDegeneratedArrays) {
+  EXPECT_TRUE(ArrayEq(5, 5L));
+  EXPECT_FALSE(ArrayEq('a', 0));
+}
+
+TEST(ArrayEqTest, WorksForOneDimensionalArrays) {
+  // Note that a and b are distinct but compatible types.
+  const int a[] = { 0, 1 };
+  long b[] = { 0, 1 };
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  b[0] = 2;
+  EXPECT_FALSE(ArrayEq(a, b));
+  EXPECT_FALSE(ArrayEq(a, 1, b));
+}
+
+TEST(ArrayEqTest, WorksForTwoDimensionalArrays) {
+  const char a[][3] = { "hi", "lo" };
+  const char b[][3] = { "hi", "lo" };
+  const char c[][3] = { "hi", "li" };
+
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  EXPECT_FALSE(ArrayEq(a, c));
+  EXPECT_FALSE(ArrayEq(a, 2, c));
+}
+
+// Tests ArrayAwareFind().
+
+TEST(ArrayAwareFindTest, WorksForOneDimensionalArray) {
+  const char a[] = "hello";
+  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o'));
+  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x'));
+}
+
+TEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) {
+  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
+  const int b[2] = { 2, 3 };
+  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b));
+
+  const int c[2] = { 6, 7 };
+  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c));
+}
+
+// Tests CopyArray().
+
+TEST(CopyArrayTest, WorksForDegeneratedArrays) {
+  int n = 0;
+  CopyArray('a', &n);
+  EXPECT_EQ('a', n);
+}
+
+TEST(CopyArrayTest, WorksForOneDimensionalArrays) {
+  const char a[3] = "hi";
+  int b[3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[3];
+  CopyArray(a, 3, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+TEST(CopyArrayTest, WorksForTwoDimensionalArrays) {
+  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
+  int b[2][3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[2][3];
+  CopyArray(a, 2, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+// Tests NativeArray.
+
+TEST(NativeArrayTest, ConstructorFromArrayWorks) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kReference);
+  EXPECT_EQ(3U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+TEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) {
+  typedef int Array[2];
+  Array* a = new Array[1];
+  (*a)[0] = 0;
+  (*a)[1] = 1;
+  NativeArray<int> na(*a, 2, kCopy);
+  EXPECT_NE(*a, na.begin());
+  delete[] a;
+  EXPECT_EQ(0, na.begin()[0]);
+  EXPECT_EQ(1, na.begin()[1]);
+
+  // We rely on the heap checker to verify that na deletes the copy of
+  // array.
+}
+
+TEST(NativeArrayTest, TypeMembersAreCorrect) {
+  StaticAssertTypeEq<char, NativeArray<char>::value_type>();
+  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>();
+
+  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>();
+  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>();
+}
+
+TEST(NativeArrayTest, MethodsWork) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kCopy);
+  ASSERT_EQ(3U, na.size());
+  EXPECT_EQ(3, na.end() - na.begin());
+
+  NativeArray<int>::const_iterator it = na.begin();
+  EXPECT_EQ(0, *it);
+  ++it;
+  EXPECT_EQ(1, *it);
+  it++;
+  EXPECT_EQ(2, *it);
+  ++it;
+  EXPECT_EQ(na.end(), it);
+
+  EXPECT_TRUE(na == na);
+
+  NativeArray<int> na2(a, 3, kReference);
+  EXPECT_TRUE(na == na2);
+
+  const int b1[3] = { 0, 1, 1 };
+  const int b2[4] = { 0, 1, 2, 3 };
+  EXPECT_FALSE(na == NativeArray<int>(b1, 3, kReference));
+  EXPECT_FALSE(na == NativeArray<int>(b2, 4, kCopy));
+}
+
+TEST(NativeArrayTest, WorksForTwoDimensionalArray) {
+  const char a[2][3] = { "hi", "lo" };
+  NativeArray<char[3]> na(a, 2, kReference);
+  ASSERT_EQ(2U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+// Tests SkipPrefix().
+
+TEST(SkipPrefixTest, SkipsWhenPrefixMatches) {
+  const char* const str = "hello";
+
+  const char* p = str;
+  EXPECT_TRUE(SkipPrefix("", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_TRUE(SkipPrefix("hell", &p));
+  EXPECT_EQ(str + 4, p);
+}
+
+TEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {
+  const char* const str = "world";
+
+  const char* p = str;
+  EXPECT_FALSE(SkipPrefix("W", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_FALSE(SkipPrefix("world!", &p));
+  EXPECT_EQ(str, p);
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc b/vendor/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
new file mode 100644
index 0000000..531ced4
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile1_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyOne : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 1);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 1);
+  }
+};
+
+TEST_F(PropertyOne, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 1);
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc b/vendor/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
new file mode 100644
index 0000000..7b400b2
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile2_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyTwo : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 2);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 2);
+  }
+};
+
+TEST_F(PropertyTwo, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 2);
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_outfiles_test.py b/vendor/gtest-1.7.0/test/gtest_xml_outfiles_test.py
new file mode 100755
index 0000000..524e437
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_outfiles_test.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module."""
+
+__author__ = "keith.ray at gmail.com (Keith Ray)"
+
+import os
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_OUTPUT_SUBDIR = "xml_outfiles"
+GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
+GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
+
+EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
+  </testsuite>
+</testsuites>
+"""
+
+EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
+  </testsuite>
+</testsuites>
+"""
+
+
+class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """Unit test for Google Test's XML output functionality."""
+
+  def setUp(self):
+    # We want the trailing '/' that the last "" provides in os.path.join, for
+    # telling Google Test to create an output directory instead of a single file
+    # for xml output.
+    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),
+                                    GTEST_OUTPUT_SUBDIR, "")
+    self.DeleteFilesAndDir()
+
+  def tearDown(self):
+    self.DeleteFilesAndDir()
+
+  def DeleteFilesAndDir(self):
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.rmdir(self.output_dir_)
+    except os.error:
+      pass
+
+  def testOutfile1(self):
+    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)
+
+  def testOutfile2(self):
+    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)
+
+  def _TestOutFile(self, test_name, expected_xml):
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)
+    command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_]
+    p = gtest_test_utils.Subprocess(command,
+                                    working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+
+    # TODO(wan at google.com): libtool causes the built test binary to be
+    #   named lt-gtest_xml_outfiles_test_ instead of
+    #   gtest_xml_outfiles_test_.  To account for this possibillity, we
+    #   allow both names in the following code.  We should remove this
+    #   hack when Chandler Carruth's libtool replacement tool is ready.
+    output_file_name1 = test_name + ".xml"
+    output_file1 = os.path.join(self.output_dir_, output_file_name1)
+    output_file_name2 = 'lt-' + output_file_name1
+    output_file2 = os.path.join(self.output_dir_, output_file_name2)
+    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
+                 output_file1)
+
+    expected = minidom.parseString(expected_xml)
+    if os.path.isfile(output_file1):
+      actual = minidom.parse(output_file1)
+    else:
+      actual = minidom.parse(output_file2)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == "__main__":
+  os.environ["GTEST_STACK_TRACE_DEPTH"] = "0"
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_output_unittest.py b/vendor/gtest-1.7.0/test/gtest_xml_output_unittest.py
new file mode 100755
index 0000000..f605d4e
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_output_unittest.py
@@ -0,0 +1,307 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import datetime
+import errno
+import os
+import re
+import sys
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_FILTER_FLAG = '--gtest_filter'
+GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
+GTEST_OUTPUT_FLAG         = "--gtest_output"
+GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
+GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
+
+SUPPORTS_STACK_TRACES = False
+
+if SUPPORTS_STACK_TRACES:
+  STACK_TRACE_TEMPLATE = '\nStack trace:\n*'
+else:
+  STACK_TRACE_TEMPLATE = ''
+
+EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+  <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="Fails" status="run" time="*" classname="FailedTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
+    <testcase name="Fails" status="run" time="*" classname="MixedResultTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 3&#x0A;Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 3
+Expected: 2%(stack)s]]></failure>
+    </testcase>
+    <testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/>
+  </testsuite>
+  <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+Invalid characters in brackets []%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
+    <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
+  </testsuite>
+  <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
+    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
+    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
+    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
+    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
+  </testsuite>
+  <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
+     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
+  </testsuite>
+  <testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="HasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+  </testsuite>
+  <testsuite name="TypedTest/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/0" />
+  </testsuite>
+  <testsuite name="TypedTest/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/1" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/0" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/1" />
+  </testsuite>
+</testsuites>""" % {'stack': STACK_TRACE_TEMPLATE}
+
+EXPECTED_FILTERED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0"
+             errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+</testsuites>"""
+
+EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="0" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests">
+</testsuites>"""
+
+GTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
+
+SUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(
+    [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output
+
+
+class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """
+  Unit test for Google Test's XML output functionality.
+  """
+
+  # This test currently breaks on platforms that do not support typed and
+  # type-parameterized tests, so we don't run it under them.
+  if SUPPORTS_TYPED_TESTS:
+    def testNonEmptyXmlOutput(self):
+      """
+      Runs a test program that generates a non-empty XML output, and
+      tests that the XML output is expected.
+      """
+      self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
+
+  def testEmptyXmlOutput(self):
+    """Verifies XML output for a Google Test binary without actual tests.
+
+    Runs a test program that generates an empty XML output, and
+    tests that the XML output is expected.
+    """
+
+    self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_EMPTY_XML, 0)
+
+  def testTimestampValue(self):
+    """Checks whether the timestamp attribute in the XML output is valid.
+
+    Runs a test program that generates an empty XML output, and checks if
+    the timestamp attribute in the testsuites tag is valid.
+    """
+    actual = self._GetXmlOutput('gtest_no_test_unittest', [], 0)
+    date_time_str = actual.documentElement.getAttributeNode('timestamp').value
+    # datetime.strptime() is only available in Python 2.5+ so we have to
+    # parse the expected datetime manually.
+    match = re.match(r'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)', date_time_str)
+    self.assertTrue(
+        re.match,
+        'XML datettime string %s has incorrect format' % date_time_str)
+    date_time_from_xml = datetime.datetime(
+        year=int(match.group(1)), month=int(match.group(2)),
+        day=int(match.group(3)), hour=int(match.group(4)),
+        minute=int(match.group(5)), second=int(match.group(6)))
+
+    time_delta = abs(datetime.datetime.now() - date_time_from_xml)
+    # timestamp value should be near the current local time
+    self.assertTrue(time_delta < datetime.timedelta(seconds=600),
+                    'time_delta is %s' % time_delta)
+    actual.unlink()
+
+  def testDefaultOutputFile(self):
+    """
+    Confirms that Google Test produces an XML output file with the expected
+    default name if no name is explicitly specified.
+    """
+    output_file = os.path.join(gtest_test_utils.GetTempDir(),
+                               GTEST_DEFAULT_OUTPUT_FILE)
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
+        'gtest_no_test_unittest')
+    try:
+      os.remove(output_file)
+    except OSError, e:
+      if e.errno != errno.ENOENT:
+        raise
+
+    p = gtest_test_utils.Subprocess(
+        [gtest_prog_path, '%s=xml' % GTEST_OUTPUT_FLAG],
+        working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+    self.assert_(os.path.isfile(output_file))
+
+  def testSuppressedXmlOutput(self):
+    """
+    Tests that no XML file is generated if the default XML listener is
+    shut down before RUN_ALL_TESTS is invoked.
+    """
+
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            GTEST_PROGRAM_NAME + 'out.xml')
+    if os.path.isfile(xml_path):
+      os.remove(xml_path)
+
+    command = [GTEST_PROGRAM_PATH,
+               '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),
+               '--shut_down_xml']
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      # p.signal is avalable only if p.terminated_by_signal is True.
+      self.assertFalse(
+          p.terminated_by_signal,
+          '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(1, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, 1))
+
+    self.assert_(not os.path.isfile(xml_path))
+
+  def testFilteredTestXmlOutput(self):
+    """Verifies XML output when a filter is applied.
+
+    Runs a test program that executes only some tests and verifies that
+    non-selected tests do not show up in the XML output.
+    """
+
+    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,
+                        extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])
+
+  def _GetXmlOutput(self, gtest_prog_name, extra_args, expected_exit_code):
+    """
+    Returns the xml output generated by running the program gtest_prog_name.
+    Furthermore, the program's exit code must be expected_exit_code.
+    """
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            gtest_prog_name + 'out.xml')
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
+
+    command = ([gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +
+               extra_args)
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      self.assert_(False,
+                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(expected_exit_code, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, expected_exit_code))
+    actual = minidom.parse(xml_path)
+    return actual
+
+  def _TestXmlOutput(self, gtest_prog_name, expected_xml,
+                     expected_exit_code, extra_args=None):
+    """
+    Asserts that the XML document generated by running the program
+    gtest_prog_name matches expected_xml, a string containing another
+    XML document.  Furthermore, the program's exit code must be
+    expected_exit_code.
+    """
+
+    actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],
+                                expected_exit_code)
+    expected = minidom.parseString(expected_xml)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == '__main__':
+  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'
+  gtest_test_utils.Main()
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_output_unittest_.cc b/vendor/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
new file mode 100644
index 0000000..48b8771
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
@@ -0,0 +1,181 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: eefacm at gmail.com (Sean Mcafee)
+
+// Unit test for Google Test XML output.
+//
+// A user can specify XML output in a Google Test program to run via
+// either the GTEST_OUTPUT environment variable or the --gtest_output
+// flag.  This is used for testing such functionality.
+//
+// This program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::TestEventListeners;
+using ::testing::TestWithParam;
+using ::testing::UnitTest;
+using ::testing::Test;
+using ::testing::Values;
+
+class SuccessfulTest : public Test {
+};
+
+TEST_F(SuccessfulTest, Succeeds) {
+  SUCCEED() << "This is a success.";
+  ASSERT_EQ(1, 1);
+}
+
+class FailedTest : public Test {
+};
+
+TEST_F(FailedTest, Fails) {
+  ASSERT_EQ(1, 2);
+}
+
+class DisabledTest : public Test {
+};
+
+TEST_F(DisabledTest, DISABLED_test_not_run) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(MixedResultTest, Succeeds) {
+  EXPECT_EQ(1, 1);
+  ASSERT_EQ(1, 1);
+}
+
+TEST(MixedResultTest, Fails) {
+  EXPECT_EQ(1, 2);
+  ASSERT_EQ(2, 3);
+}
+
+TEST(MixedResultTest, DISABLED_test) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(XmlQuotingTest, OutputsCData) {
+  FAIL() << "XML output: "
+            "<?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]></top>";
+}
+
+// Helps to test that invalid characters produced by test code do not make
+// it into the XML file.
+TEST(InvalidCharactersTest, InvalidCharactersInMessage) {
+  FAIL() << "Invalid characters in brackets [\x1\x2]";
+}
+
+class PropertyRecordingTest : public Test {
+ public:
+  static void SetUpTestCase() { RecordProperty("SetUpTestCase", "yes"); }
+  static void TearDownTestCase() { RecordProperty("TearDownTestCase", "aye"); }
+};
+
+TEST_F(PropertyRecordingTest, OneProperty) {
+  RecordProperty("key_1", "1");
+}
+
+TEST_F(PropertyRecordingTest, IntValuedProperty) {
+  RecordProperty("key_int", 1);
+}
+
+TEST_F(PropertyRecordingTest, ThreeProperties) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_2", "2");
+  RecordProperty("key_3", "3");
+}
+
+TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_1", "2");
+}
+
+TEST(NoFixtureTest, RecordProperty) {
+  RecordProperty("key", "1");
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key, int value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key,
+                                            const std::string& value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
+}
+
+// Verifies that the test parameter value is output in the 'value_param'
+// XML attribute for value-parameterized tests.
+class ValueParamTest : public TestWithParam<int> {};
+TEST_P(ValueParamTest, HasValueParamAttribute) {}
+TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
+INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
+
+#if GTEST_HAS_TYPED_TEST
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for typed tests.
+template <typename T> class TypedTest : public Test {};
+typedef testing::Types<int, long> TypedTestTypes;
+TYPED_TEST_CASE(TypedTest, TypedTestTypes);
+TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
+#endif
+
+#if GTEST_HAS_TYPED_TEST_P
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for type-parameterized tests.
+template <typename T> class TypeParameterizedTestCase : public Test {};
+TYPED_TEST_CASE_P(TypeParameterizedTestCase);
+TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
+REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
+typedef testing::Types<int, long> TypeParameterizedTestCaseTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Single,
+                              TypeParameterizedTestCase,
+                              TypeParameterizedTestCaseTypes);
+#endif
+
+int main(int argc, char** argv) {
+  InitGoogleTest(&argc, argv);
+
+  if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+    delete listeners.Release(listeners.default_xml_generator());
+  }
+  testing::Test::RecordProperty("ad_hoc_property", "42");
+  return RUN_ALL_TESTS();
+}
diff --git a/vendor/gtest-1.7.0/test/gtest_xml_test_utils.py b/vendor/gtest-1.7.0/test/gtest_xml_test_utils.py
new file mode 100755
index 0000000..3d0c3b2
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/gtest_xml_test_utils.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for gtest_xml_output"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import re
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+
+
+GTEST_OUTPUT_FLAG         = '--gtest_output'
+GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
+
+class GTestXMLTestCase(gtest_test_utils.TestCase):
+  """
+  Base class for tests of Google Test's XML output functionality.
+  """
+
+
+  def AssertEquivalentNodes(self, expected_node, actual_node):
+    """
+    Asserts that actual_node (a DOM node object) is equivalent to
+    expected_node (another DOM node object), in that either both of
+    them are CDATA nodes and have the same value, or both are DOM
+    elements and actual_node meets all of the following conditions:
+
+    *  It has the same tag name as expected_node.
+    *  It has the same set of attributes as expected_node, each with
+       the same value as the corresponding attribute of expected_node.
+       Exceptions are any attribute named "time", which needs only be
+       convertible to a floating-point number and any attribute named
+       "type_param" which only has to be non-empty.
+    *  It has an equivalent set of child nodes (including elements and
+       CDATA sections) as expected_node.  Note that we ignore the
+       order of the children as they are not guaranteed to be in any
+       particular order.
+    """
+
+    if expected_node.nodeType == Node.CDATA_SECTION_NODE:
+      self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)
+      self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)
+      return
+
+    self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)
+    self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)
+    self.assertEquals(expected_node.tagName, actual_node.tagName)
+
+    expected_attributes = expected_node.attributes
+    actual_attributes   = actual_node  .attributes
+    self.assertEquals(
+        expected_attributes.length, actual_attributes.length,
+        'attribute numbers differ in element %s:\nExpected: %r\nActual: %r' % (
+            actual_node.tagName, expected_attributes.keys(),
+            actual_attributes.keys()))
+    for i in range(expected_attributes.length):
+      expected_attr = expected_attributes.item(i)
+      actual_attr   = actual_attributes.get(expected_attr.name)
+      self.assert_(
+          actual_attr is not None,
+          'expected attribute %s not found in element %s' %
+          (expected_attr.name, actual_node.tagName))
+      self.assertEquals(
+          expected_attr.value, actual_attr.value,
+          ' values of attribute %s in element %s differ: %s vs %s' %
+          (expected_attr.name, actual_node.tagName,
+           expected_attr.value, actual_attr.value))
+
+    expected_children = self._GetChildren(expected_node)
+    actual_children = self._GetChildren(actual_node)
+    self.assertEquals(
+        len(expected_children), len(actual_children),
+        'number of child elements differ in element ' + actual_node.tagName)
+    for child_id, child in expected_children.iteritems():
+      self.assert_(child_id in actual_children,
+                   '<%s> is not in <%s> (in element %s)' %
+                   (child_id, actual_children, actual_node.tagName))
+      self.AssertEquivalentNodes(child, actual_children[child_id])
+
+  identifying_attribute = {
+    'testsuites': 'name',
+    'testsuite': 'name',
+    'testcase':  'name',
+    'failure':   'message',
+    }
+
+  def _GetChildren(self, element):
+    """
+    Fetches all of the child nodes of element, a DOM Element object.
+    Returns them as the values of a dictionary keyed by the IDs of the
+    children.  For <testsuites>, <testsuite> and <testcase> elements, the ID
+    is the value of their "name" attribute; for <failure> elements, it is
+    the value of the "message" attribute; CDATA sections and non-whitespace
+    text nodes are concatenated into a single CDATA section with ID
+    "detail".  An exception is raised if any element other than the above
+    four is encountered, if two child elements with the same identifying
+    attributes are encountered, or if any other type of node is encountered.
+    """
+
+    children = {}
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.assert_(child.tagName in self.identifying_attribute,
+                     'Encountered unknown element <%s>' % child.tagName)
+        childID = child.getAttribute(self.identifying_attribute[child.tagName])
+        self.assert_(childID not in children)
+        children[childID] = child
+      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
+        if 'detail' not in children:
+          if (child.nodeType == Node.CDATA_SECTION_NODE or
+              not child.nodeValue.isspace()):
+            children['detail'] = child.ownerDocument.createCDATASection(
+                child.nodeValue)
+        else:
+          children['detail'].nodeValue += child.nodeValue
+      else:
+        self.fail('Encountered unexpected node type %d' % child.nodeType)
+    return children
+
+  def NormalizeXml(self, element):
+    """
+    Normalizes Google Test's XML output to eliminate references to transient
+    information that may change from run to run.
+
+    *  The "time" attribute of <testsuites>, <testsuite> and <testcase>
+       elements is replaced with a single asterisk, if it contains
+       only digit characters.
+    *  The "timestamp" attribute of <testsuites> elements is replaced with a
+       single asterisk, if it contains a valid ISO8601 datetime value.
+    *  The "type_param" attribute of <testcase> elements is replaced with a
+       single asterisk (if it sn non-empty) as it is the type name returned
+       by the compiler and is platform dependent.
+    *  The line info reported in the first line of the "message"
+       attribute and CDATA section of <failure> elements is replaced with the
+       file's basename and a single asterisk for the line number.
+    *  The directory names in file paths are removed.
+    *  The stack traces are removed.
+    """
+
+    if element.tagName == 'testsuites':
+      timestamp = element.getAttributeNode('timestamp')
+      timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
+                               '*', timestamp.value)
+    if element.tagName in ('testsuites', 'testsuite', 'testcase'):
+      time = element.getAttributeNode('time')
+      time.value = re.sub(r'^\d+(\.\d+)?$', '*', time.value)
+      type_param = element.getAttributeNode('type_param')
+      if type_param and type_param.value:
+        type_param.value = '*'
+    elif element.tagName == 'failure':
+      source_line_pat = r'^.*[/\\](.*:)\d+\n'
+      # Replaces the source line information with a normalized form.
+      message = element.getAttributeNode('message')
+      message.value = re.sub(source_line_pat, '\\1*\n', message.value)
+      for child in element.childNodes:
+        if child.nodeType == Node.CDATA_SECTION_NODE:
+          # Replaces the source line information with a normalized form.
+          cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)
+          # Removes the actual stack trace.
+          child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
+                                   '', cdata)
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.NormalizeXml(child)
diff --git a/vendor/gtest-1.7.0/test/production.cc b/vendor/gtest-1.7.0/test/production.cc
new file mode 100644
index 0000000..8b8a40b
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/production.cc
@@ -0,0 +1,36 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#include "production.h"
+
+PrivateCode::PrivateCode() : x_(0) {}
diff --git a/vendor/gtest-1.7.0/test/production.h b/vendor/gtest-1.7.0/test/production.h
new file mode 100644
index 0000000..98fd5e4
--- /dev/null
+++ b/vendor/gtest-1.7.0/test/production.h
@@ -0,0 +1,55 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#ifndef GTEST_TEST_PRODUCTION_H_
+#define GTEST_TEST_PRODUCTION_H_
+
+#include "gtest/gtest_prod.h"
+
+class PrivateCode {
+ public:
+  // Declares a friend test that does not use a fixture.
+  FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);
+
+  // Declares a friend test that uses a fixture.
+  FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);
+
+  PrivateCode();
+
+  int x() const { return x_; }
+ private:
+  void set_x(int an_x) { x_ = an_x; }
+  int x_;
+};
+
+#endif  // GTEST_TEST_PRODUCTION_H_
diff --git a/vendor/gtest-1.7.0/xcode/Config/DebugProject.xcconfig b/vendor/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
new file mode 100644
index 0000000..3d68157
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
@@ -0,0 +1,30 @@
+//
+//  DebugProject.xcconfig
+//
+//  These are Debug Configuration project settings for the gtest framework and
+//  examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// No optimization
+GCC_OPTIMIZATION_LEVEL = 0
+
+// Deployment postprocessing is what triggers Xcode to strip, turn it off
+DEPLOYMENT_POSTPROCESSING = NO
+
+// Dead code stripping off
+DEAD_CODE_STRIPPING = NO
+
+// Debug symbols should be on obviously
+GCC_GENERATE_DEBUGGING_SYMBOLS = YES
+
+// Define the DEBUG macro in all debug builds
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1
+
+// These are turned off to avoid STL incompatibilities with client code
+// // Turns on special C++ STL checks to "encourage" good STL use
+// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS
diff --git a/vendor/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig b/vendor/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
new file mode 100644
index 0000000..357b1c8
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
@@ -0,0 +1,17 @@
+//
+//  FrameworkTarget.xcconfig
+//
+//  These are Framework target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Dynamic libs need to be position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Dynamic libs should not have their external symbols stripped.
+STRIP_STYLE = non-global
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/vendor/gtest-1.7.0/xcode/Config/General.xcconfig b/vendor/gtest-1.7.0/xcode/Config/General.xcconfig
new file mode 100644
index 0000000..f23e322
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/General.xcconfig
@@ -0,0 +1,41 @@
+//
+//  General.xcconfig
+//
+//  These are General configuration settings for the gtest framework and
+//  examples.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Build for PPC and Intel, 32- and 64-bit
+ARCHS = i386 x86_64 ppc ppc64
+
+// Zerolink prevents link warnings so turn it off
+ZERO_LINK = NO
+
+// Prebinding considered unhelpful in 10.3 and later
+PREBINDING = NO
+
+// Strictest warning policy
+WARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow
+
+// Work around Xcode bugs by using external strip. See:
+// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html
+SEPARATE_STRIP = YES
+
+// Force C99 dialect
+GCC_C_LANGUAGE_STANDARD = c99
+
+// not sure why apple defaults this on, but it's pretty risky
+ALWAYS_SEARCH_USER_PATHS = NO
+
+// Turn on position dependent code for most cases (overridden where appropriate)
+GCC_DYNAMIC_NO_PIC = YES
+
+// Default SDK and minimum OS version is 10.4
+SDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk
+MACOSX_DEPLOYMENT_TARGET = 10.4
+GCC_VERSION = 4.0
+
+// VERSIONING BUILD SETTINGS (used in Info.plist)
+GTEST_VERSIONINFO_ABOUT =  © 2008 Google Inc.
diff --git a/vendor/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig b/vendor/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
new file mode 100644
index 0000000..5349f0a
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
@@ -0,0 +1,32 @@
+//
+//  ReleaseProject.xcconfig
+//
+//  These are Release Configuration project settings for the gtest framework
+//  and examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// subconfig/Release.xcconfig
+
+// Optimize for space and size (Apple recommendation)
+GCC_OPTIMIZATION_LEVEL = s
+
+// Deploment postprocessing is what triggers Xcode to strip
+DEPLOYMENT_POSTPROCESSING = YES
+
+// No symbols
+GCC_GENERATE_DEBUGGING_SYMBOLS = NO
+
+// Dead code strip does not affect ObjC code but can help for C
+DEAD_CODE_STRIPPING = YES
+
+// NDEBUG is used by things like assert.h, so define it for general compat.
+// ASSERT going away in release tends to create unused vars.
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable
+
+// When we strip we want to strip all symbols in release, but save externals.
+STRIP_STYLE = all
diff --git a/vendor/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig b/vendor/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
new file mode 100644
index 0000000..3922fa5
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
@@ -0,0 +1,18 @@
+//
+//  StaticLibraryTarget.xcconfig
+//
+//  These are static library target settings for libgtest.a. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Static libs can be included in bundles so make them position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Static libs should not have their internal globals or external symbols
+// stripped.
+STRIP_STYLE = debugging
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/vendor/gtest-1.7.0/xcode/Config/TestTarget.xcconfig b/vendor/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
new file mode 100644
index 0000000..e6652ba
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
@@ -0,0 +1,8 @@
+//
+//  TestTarget.xcconfig
+//
+//  These are Test target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+
+PRODUCT_NAME = $(TARGET_NAME)
+HEADER_SEARCH_PATHS = ../include
diff --git a/vendor/gtest-1.7.0/xcode/Resources/Info.plist b/vendor/gtest-1.7.0/xcode/Resources/Info.plist
new file mode 100644
index 0000000..9dd28ea
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Resources/Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.${PRODUCT_NAME}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GTEST_VERSIONINFO_LONG</string>
+	<key>CFBundleShortVersionString</key>
+	<string>GTEST_VERSIONINFO_SHORT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
new file mode 100644
index 0000000..f3852ed
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.gtest.${PRODUCT_NAME:identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
new file mode 100644
index 0000000..4a0d413
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=$@
+
+# Now execute each one in turn keeping track of how many succeeded and failed.
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
new file mode 100644
index 0000000..bfc4e7f
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
@@ -0,0 +1,63 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.cc
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest
+
+#include "widget.h"
+
+Widget::Widget(int number, const std::string& name)
+    : number_(number),
+      name_(name) {}
+
+Widget::~Widget() {}
+
+float Widget::GetFloatValue() const {
+  return number_;
+}
+
+int Widget::GetIntValue() const {
+  return static_cast<int>(number_);
+}
+
+std::string Widget::GetStringValue() const {
+  return name_;
+}
+
+void Widget::GetCharPtrValue(char* buffer, size_t max_size) const {
+  // Copy the char* representation of name_ into buffer, up to max_size.
+  strncpy(buffer, name_.c_str(), max_size-1);
+  buffer[max_size-1] = '\0';
+  return;
+}
diff --git a/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
new file mode 100644
index 0000000..0c55cdc
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
@@ -0,0 +1,59 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.h
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest. It
+// simply stores two values a string and an integer, which are returned via
+// public accessors in multiple forms.
+
+#import <string>
+
+class Widget {
+ public:
+  Widget(int number, const std::string& name);
+  ~Widget();
+
+  // Public accessors to number data
+  float GetFloatValue() const;
+  int GetIntValue() const;
+
+  // Public accessors to the string data
+  std::string GetStringValue() const;
+  void GetCharPtrValue(char* buffer, size_t max_size) const;
+
+ private:
+  // Data members
+  float number_;
+  std::string name_;
+};
diff --git a/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
new file mode 100644
index 0000000..8725994
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
@@ -0,0 +1,68 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget_test.cc
+//
+
+// This is a simple test file for the Widget class in the Widget.framework
+
+#include <string>
+#include "gtest/gtest.h"
+
+#include <Widget/widget.h>
+
+// This test verifies that the constructor sets the internal state of the
+// Widget class correctly.
+TEST(WidgetInitializerTest, TestConstructor) {
+  Widget widget(1.0f, "name");
+  EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue());
+  EXPECT_EQ(std::string("name"), widget.GetStringValue());
+}
+
+// This test verifies the conversion of the float and string values to int and
+// char*, respectively.
+TEST(WidgetInitializerTest, TestConversion) {
+  Widget widget(1.0f, "name");
+  EXPECT_EQ(1, widget.GetIntValue());
+
+  size_t max_size = 128;
+  char buffer[max_size];
+  widget.GetCharPtrValue(buffer, max_size);
+  EXPECT_STREQ("name", buffer);
+}
+
+// Use the Google Test main that is linked into the framework. It does something
+// like this:
+// int main(int argc, char** argv) {
+//   testing::InitGoogleTest(&argc, argv);
+//   return RUN_ALL_TESTS();
+// }
diff --git a/vendor/gtest-1.7.0/xcode/Scripts/runtests.sh b/vendor/gtest-1.7.0/xcode/Scripts/runtests.sh
new file mode 100644
index 0000000..3fc229f
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Scripts/runtests.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=("$BUILT_PRODUCTS_DIR/gtest_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/gtest_unittest"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-static")
+
+# Now execute each one in turn keeping track of how many succeeded and failed. 
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/vendor/gtest-1.7.0/xcode/Scripts/versiongenerate.py b/vendor/gtest-1.7.0/xcode/Scripts/versiongenerate.py
new file mode 100755
index 0000000..81de8c9
--- /dev/null
+++ b/vendor/gtest-1.7.0/xcode/Scripts/versiongenerate.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""A script to prepare version informtion for use the gtest Info.plist file.
+
+  This script extracts the version information from the configure.ac file and
+  uses it to generate a header file containing the same information. The
+  #defines in this header file will be included in during the generation of
+  the Info.plist of the framework, giving the correct value to the version
+  shown in the Finder.
+
+  This script makes the following assumptions (these are faults of the script,
+  not problems with the Autoconf):
+    1. The AC_INIT macro will be contained within the first 1024 characters
+       of configure.ac
+    2. The version string will be 3 integers separated by periods and will be
+       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
+       segment represents the major version, the second represents the minor
+       version and the third represents the fix version.
+    3. No ")" character exists between the opening "(" and closing ")" of
+       AC_INIT, including in comments and character strings.
+"""
+
+import sys
+import re
+
+# Read the command line argument (the output directory for Version.h)
+if (len(sys.argv) < 3):
+  print "Usage: versiongenerate.py input_dir output_dir"
+  sys.exit(1)
+else:
+  input_dir = sys.argv[1]
+  output_dir = sys.argv[2]
+
+# Read the first 1024 characters of the configure.ac file
+config_file = open("%s/configure.ac" % input_dir, 'r')
+buffer_size = 1024
+opening_string = config_file.read(buffer_size)
+config_file.close()
+
+# Extract the version string from the AC_INIT macro
+#   The following init_expression means:
+#     Extract three integers separated by periods and surrounded by squre
+#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
+#     (*? is the non-greedy flag) since that would pull in everything between
+#     the first "(" and the last ")" in the file.
+version_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
+                                re.DOTALL)
+version_values = version_expression.search(opening_string)
+major_version = version_values.group(1)
+minor_version = version_values.group(2)
+fix_version = version_values.group(3)
+
+# Write the version information to a header file to be included in the
+# Info.plist file.
+file_data = """//
+// DO NOT MODIFY THIS FILE (but you can delete it)
+//
+// This file is autogenerated by the versiongenerate.py script. This script
+// is executed in a "Run Script" build phase when creating gtest.framework. This
+// header file is not used during compilation of C-source. Rather, it simply
+// defines some version strings for substitution in the Info.plist. Because of
+// this, we are not not restricted to C-syntax nor are we using include guards.
+//
+
+#define GTEST_VERSIONINFO_SHORT %s.%s
+#define GTEST_VERSIONINFO_LONG %s.%s.%s
+
+""" % (major_version, minor_version, major_version, minor_version, fix_version)
+version_file = open("%s/Version.h" % output_dir, 'w')
+version_file.write(file_data)
+version_file.close()
diff --git a/vendor/nanoflann-1.1.8/nanoflann.hpp b/vendor/nanoflann-1.1.8/nanoflann.hpp
new file mode 100644
index 0000000..c651934
--- /dev/null
+++ b/vendor/nanoflann-1.1.8/nanoflann.hpp
@@ -0,0 +1,1460 @@
+/***********************************************************************
+ * Software License Agreement (BSD License)
+ *
+ * Copyright 2008-2009  Marius Muja (mariusm at cs.ubc.ca). All rights reserved.
+ * Copyright 2008-2009  David G. Lowe (lowe at cs.ubc.ca). All rights reserved.
+ * Copyright 2011-2013  Jose Luis Blanco (joseluisblancoc at gmail.com).
+ *   All rights reserved.
+ *
+ * THE BSD LICENSE
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *************************************************************************/
+
+#ifndef  NANOFLANN_HPP_
+#define  NANOFLANN_HPP_
+
+#include <vector>
+#include <cassert>
+#include <algorithm>
+#include <stdexcept>
+#include <cstdio>  // for fwrite()
+#include <cmath>   // for fabs(),...
+#include <limits>
+
+// Avoid conflicting declaration of min/max macros in windows headers
+#if !defined(NOMINMAX) && (defined(_WIN32) || defined(_WIN32_)  || defined(WIN32) || defined(_WIN64))
+# define NOMINMAX
+# ifdef max
+#  undef   max
+#  undef   min
+# endif
+#endif
+
+namespace nanoflann
+{
+/** @addtogroup nanoflann_grp nanoflann C++ library for ANN
+  *  @{ */
+
+  	/** Library version: 0xMmP (M=Major,m=minor,P=path) */
+	#define NANOFLANN_VERSION 0x118
+
+	/** @addtogroup result_sets_grp Result set classes
+	  *  @{ */
+	template <typename DistanceType, typename IndexType = size_t, typename CountType = size_t>
+	class KNNResultSet
+	{
+		IndexType * indices;
+		DistanceType* dists;
+		CountType capacity;
+		CountType count;
+
+	public:
+		inline KNNResultSet(CountType capacity_) : capacity(capacity_), count(0)
+		{
+		}
+
+		inline void init(IndexType* indices_, DistanceType* dists_)
+		{
+			indices = indices_;
+			dists = dists_;
+			count = 0;
+            if (capacity)
+                dists[capacity-1] = (std::numeric_limits<DistanceType>::max)();
+		}
+
+		inline CountType size() const
+		{
+			return count;
+		}
+
+		inline bool full() const
+		{
+			return count == capacity;
+		}
+
+
+		inline void addPoint(DistanceType dist, IndexType index)
+		{
+			CountType i;
+			for (i=count; i>0; --i) {
+#ifdef NANOFLANN_FIRST_MATCH   // If defined and two poins have the same distance, the one with the lowest-index will be returned first.
+				if ( (dists[i-1]>dist) || ((dist==dists[i-1])&&(indices[i-1]>index)) ) {
+#else
+				if (dists[i-1]>dist) {
+#endif
+					if (i<capacity) {
+						dists[i] = dists[i-1];
+						indices[i] = indices[i-1];
+					}
+				}
+				else break;
+			}
+			if (i<capacity) {
+				dists[i] = dist;
+				indices[i] = index;
+			}
+			if (count<capacity) count++;
+		}
+
+		inline DistanceType worstDist() const
+		{
+			return dists[capacity-1];
+		}
+	};
+
+
+	/**
+	 * A result-set class used when performing a radius based search.
+	 */
+	template <typename DistanceType, typename IndexType = size_t>
+	class RadiusResultSet
+	{
+	public:
+		const DistanceType radius;
+
+		std::vector<std::pair<IndexType,DistanceType> >& m_indices_dists;
+
+		inline RadiusResultSet(DistanceType radius_, std::vector<std::pair<IndexType,DistanceType> >& indices_dists) : radius(radius_), m_indices_dists(indices_dists)
+		{
+			init();
+		}
+
+		inline ~RadiusResultSet() { }
+
+		inline void init() { clear(); }
+		inline void clear() { m_indices_dists.clear(); }
+
+		inline size_t size() const { return m_indices_dists.size(); }
+
+		inline bool full() const { return true; }
+
+		inline void addPoint(DistanceType dist, IndexType index)
+		{
+			if (dist<radius)
+				m_indices_dists.push_back(std::make_pair(index,dist));
+		}
+
+		inline DistanceType worstDist() const { return radius; }
+
+		/** Clears the result set and adjusts the search radius. */
+		inline void set_radius_and_clear( const DistanceType r )
+		{
+			radius = r;
+			clear();
+		}
+
+		/**
+		 * Find the worst result (furtherest neighbor) without copying or sorting
+		 * Pre-conditions: size() > 0
+		 */
+		std::pair<IndexType,DistanceType> worst_item() const
+		{
+		   if (m_indices_dists.empty()) throw std::runtime_error("Cannot invoke RadiusResultSet::worst_item() on an empty list of results.");
+		   typedef typename std::vector<std::pair<IndexType,DistanceType> >::const_iterator DistIt;
+		   DistIt it = std::max_element(m_indices_dists.begin(), m_indices_dists.end());
+		   return *it;
+		}
+	};
+
+	/** operator "<" for std::sort() */
+	struct IndexDist_Sorter
+	{
+		/** PairType will be typically: std::pair<IndexType,DistanceType> */
+		template <typename PairType>
+		inline bool operator()(const PairType &p1, const PairType &p2) const {
+			return p1.second < p2.second;
+		}
+	};
+
+	/** @} */
+
+
+	/** @addtogroup loadsave_grp Load/save auxiliary functions
+	  * @{ */
+	template<typename T>
+	void save_value(FILE* stream, const T& value, size_t count = 1)
+	{
+		fwrite(&value, sizeof(value),count, stream);
+	}
+
+	template<typename T>
+	void save_value(FILE* stream, const std::vector<T>& value)
+	{
+		size_t size = value.size();
+		fwrite(&size, sizeof(size_t), 1, stream);
+		fwrite(&value[0], sizeof(T), size, stream);
+	}
+
+	template<typename T>
+	void load_value(FILE* stream, T& value, size_t count = 1)
+	{
+		size_t read_cnt = fread(&value, sizeof(value), count, stream);
+		if (read_cnt != count) {
+			throw std::runtime_error("Cannot read from file");
+		}
+	}
+
+
+	template<typename T>
+	void load_value(FILE* stream, std::vector<T>& value)
+	{
+		size_t size;
+		size_t read_cnt = fread(&size, sizeof(size_t), 1, stream);
+		if (read_cnt!=1) {
+			throw std::runtime_error("Cannot read from file");
+		}
+		value.resize(size);
+		read_cnt = fread(&value[0], sizeof(T), size, stream);
+		if (read_cnt!=size) {
+			throw std::runtime_error("Cannot read from file");
+		}
+	}
+	/** @} */
+
+
+	/** @addtogroup metric_grp Metric (distance) classes
+	  * @{ */
+
+	template<typename T> inline T abs(T x) { return (x<0) ? -x : x; }
+	template<> inline int abs<int>(int x) { return ::abs(x); }
+	template<> inline float abs<float>(float x) { return fabsf(x); }
+	template<> inline double abs<double>(double x) { return fabs(x); }
+	template<> inline long double abs<long double>(long double x) { return fabsl(x); }
+
+	/** Manhattan distance functor (generic version, optimized for high-dimensionality data sets).
+	  *  Corresponding distance traits: nanoflann::metric_L1
+	  * \tparam T Type of the elements (e.g. double, float, uint8_t)
+	  * \tparam DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+	  */
+	template<class T, class DataSource, typename _DistanceType = T>
+	struct L1_Adaptor
+	{
+		typedef T ElementType;
+		typedef _DistanceType DistanceType;
+
+		const DataSource &data_source;
+
+		L1_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+		inline DistanceType operator()(const T* a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const
+		{
+			DistanceType result = DistanceType();
+			const T* last = a + size;
+			const T* lastgroup = last - 3;
+			size_t d = 0;
+
+			/* Process 4 items with each loop for efficiency. */
+			while (a < lastgroup) {
+				const DistanceType diff0 = nanoflann::abs(a[0] - data_source.kdtree_get_pt(b_idx,d++));
+				const DistanceType diff1 = nanoflann::abs(a[1] - data_source.kdtree_get_pt(b_idx,d++));
+				const DistanceType diff2 = nanoflann::abs(a[2] - data_source.kdtree_get_pt(b_idx,d++));
+				const DistanceType diff3 = nanoflann::abs(a[3] - data_source.kdtree_get_pt(b_idx,d++));
+				result += diff0 + diff1 + diff2 + diff3;
+				a += 4;
+				if ((worst_dist>0)&&(result>worst_dist)) {
+					return result;
+				}
+			}
+			/* Process last 0-3 components.  Not needed for standard vector lengths. */
+			while (a < last) {
+				result += nanoflann::abs( *a++ - data_source.kdtree_get_pt(b_idx,d++) );
+			}
+			return result;
+		}
+
+		template <typename U, typename V>
+		inline DistanceType accum_dist(const U a, const V b, int ) const
+		{
+			return nanoflann::abs(a-b);
+		}
+	};
+
+	/** Squared Euclidean distance functor (generic version, optimized for high-dimensionality data sets).
+	  *  Corresponding distance traits: nanoflann::metric_L2
+	  * \tparam T Type of the elements (e.g. double, float, uint8_t)
+	  * \tparam DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+	  */
+	template<class T, class DataSource, typename _DistanceType = T>
+	struct L2_Adaptor
+	{
+		typedef T ElementType;
+		typedef _DistanceType DistanceType;
+
+		const DataSource &data_source;
+
+		L2_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+		inline DistanceType operator()(const T* a, const size_t b_idx, size_t size, DistanceType worst_dist = -1) const
+		{
+			DistanceType result = DistanceType();
+			const T* last = a + size;
+			const T* lastgroup = last - 3;
+			size_t d = 0;
+
+			/* Process 4 items with each loop for efficiency. */
+			while (a < lastgroup) {
+				const DistanceType diff0 = a[0] - data_source.kdtree_get_pt(b_idx,d++);
+				const DistanceType diff1 = a[1] - data_source.kdtree_get_pt(b_idx,d++);
+				const DistanceType diff2 = a[2] - data_source.kdtree_get_pt(b_idx,d++);
+				const DistanceType diff3 = a[3] - data_source.kdtree_get_pt(b_idx,d++);
+				result += diff0 * diff0 + diff1 * diff1 + diff2 * diff2 + diff3 * diff3;
+				a += 4;
+				if ((worst_dist>0)&&(result>worst_dist)) {
+					return result;
+				}
+			}
+			/* Process last 0-3 components.  Not needed for standard vector lengths. */
+			while (a < last) {
+				const DistanceType diff0 = *a++ - data_source.kdtree_get_pt(b_idx,d++);
+				result += diff0 * diff0;
+			}
+			return result;
+		}
+
+		template <typename U, typename V>
+		inline DistanceType accum_dist(const U a, const V b, int ) const
+		{
+			return (a-b)*(a-b);
+		}
+	};
+
+	/** Squared Euclidean distance functor (suitable for low-dimensionality datasets, like 2D or 3D point clouds)
+	  *  Corresponding distance traits: nanoflann::metric_L2_Simple
+	  * \tparam T Type of the elements (e.g. double, float, uint8_t)
+	  * \tparam DistanceType Type of distance variables (must be signed) (e.g. float, double, int64_t)
+	  */
+	template<class T, class DataSource, typename _DistanceType = T>
+	struct L2_Simple_Adaptor
+	{
+		typedef T ElementType;
+		typedef _DistanceType DistanceType;
+
+		const DataSource &data_source;
+
+		L2_Simple_Adaptor(const DataSource &_data_source) : data_source(_data_source) { }
+
+		inline DistanceType operator()(const T* a, const size_t b_idx, size_t size) const {
+			return data_source.kdtree_distance(a,b_idx,size);
+		}
+
+		template <typename U, typename V>
+		inline DistanceType accum_dist(const U a, const V b, int ) const
+		{
+			return (a-b)*(a-b);
+		}
+	};
+
+	/** Metaprogramming helper traits class for the L1 (Manhattan) metric */
+	struct metric_L1 {
+		template<class T, class DataSource>
+		struct traits {
+			typedef L1_Adaptor<T,DataSource> distance_t;
+		};
+	};
+	/** Metaprogramming helper traits class for the L2 (Euclidean) metric */
+	struct metric_L2 {
+		template<class T, class DataSource>
+		struct traits {
+			typedef L2_Adaptor<T,DataSource> distance_t;
+		};
+	};
+	/** Metaprogramming helper traits class for the L2_simple (Euclidean) metric */
+	struct metric_L2_Simple {
+		template<class T, class DataSource>
+		struct traits {
+			typedef L2_Simple_Adaptor<T,DataSource> distance_t;
+		};
+	};
+
+	/** @} */
+
+
+
+	/** @addtogroup param_grp Parameter structs
+	  * @{ */
+
+	/**  Parameters (see http://code.google.com/p/nanoflann/ for help choosing the parameters)
+	  */
+	struct KDTreeSingleIndexAdaptorParams
+	{
+		KDTreeSingleIndexAdaptorParams(size_t _leaf_max_size = 10, int dim_ = -1) :
+			leaf_max_size(_leaf_max_size), dim(dim_)
+		{}
+
+		size_t leaf_max_size;
+		int dim;
+	};
+
+	/** Search options for KDTreeSingleIndexAdaptor::findNeighbors() */
+	struct SearchParams
+	{
+		/** Note: The first argument (checks_IGNORED_) is ignored, but kept for compatibility with the FLANN interface */
+		SearchParams(int checks_IGNORED_ = 32, float eps_ = 0, bool sorted_ = true ) :
+			checks(checks_IGNORED_), eps(eps_), sorted(sorted_) {}
+
+		int   checks;  //!< Ignored parameter (Kept for compatibility with the FLANN interface).
+		float eps;  //!< search for eps-approximate neighbours (default: 0)
+		bool sorted; //!< only for radius search, require neighbours sorted by distance (default: true)
+	};
+	/** @} */
+
+
+	/** @addtogroup memalloc_grp Memory allocation
+	  * @{ */
+
+	/**
+	 * Allocates (using C's malloc) a generic type T.
+	 *
+	 * Params:
+	 *     count = number of instances to allocate.
+	 * Returns: pointer (of type T*) to memory buffer
+	 */
+	template <typename T>
+	inline T* allocate(size_t count = 1)
+	{
+		T* mem = (T*) ::malloc(sizeof(T)*count);
+		return mem;
+	}
+
+
+	/**
+	 * Pooled storage allocator
+	 *
+	 * The following routines allow for the efficient allocation of storage in
+	 * small chunks from a specified pool.  Rather than allowing each structure
+	 * to be freed individually, an entire pool of storage is freed at once.
+	 * This method has two advantages over just using malloc() and free().  First,
+	 * it is far more efficient for allocating small objects, as there is
+	 * no overhead for remembering all the information needed to free each
+	 * object or consolidating fragmented memory.  Second, the decision about
+	 * how long to keep an object is made at the time of allocation, and there
+	 * is no need to track down all the objects to free them.
+	 *
+	 */
+
+	const size_t     WORDSIZE=16;
+	const size_t     BLOCKSIZE=8192;
+
+	class PooledAllocator
+	{
+		/* We maintain memory alignment to word boundaries by requiring that all
+		    allocations be in multiples of the machine wordsize.  */
+		/* Size of machine word in bytes.  Must be power of 2. */
+		/* Minimum number of bytes requested at a time from	the system.  Must be multiple of WORDSIZE. */
+
+
+		size_t  remaining;  /* Number of bytes left in current block of storage. */
+		void*   base;     /* Pointer to base of current block of storage. */
+		void*   loc;      /* Current location in block to next allocate memory. */
+		size_t  blocksize;
+
+		void internal_init()
+		{
+			remaining = 0;
+			base = NULL;
+			usedMemory = 0;
+			wastedMemory = 0;
+		}
+
+	public:
+		size_t  usedMemory;
+		size_t  wastedMemory;
+
+		/**
+		    Default constructor. Initializes a new pool.
+		 */
+		PooledAllocator(const size_t blocksize_ = BLOCKSIZE) : blocksize(blocksize_) {
+			internal_init();
+		}
+
+		/**
+		 * Destructor. Frees all the memory allocated in this pool.
+		 */
+		~PooledAllocator() {
+			free_all();
+		}
+
+		/** Frees all allocated memory chunks */
+		void free_all()
+		{
+			while (base != NULL) {
+				void *prev = *((void**) base); /* Get pointer to prev block. */
+				::free(base);
+				base = prev;
+			}
+			internal_init();
+		}
+
+		/**
+		 * Returns a pointer to a piece of new memory of the given size in bytes
+		 * allocated from the pool.
+		 */
+		void* malloc(const size_t req_size)
+		{
+			/* Round size up to a multiple of wordsize.  The following expression
+			    only works for WORDSIZE that is a power of 2, by masking last bits of
+			    incremented size to zero.
+			 */
+			const size_t size = (req_size + (WORDSIZE - 1)) & ~(WORDSIZE - 1);
+
+			/* Check whether a new block must be allocated.  Note that the first word
+			    of a block is reserved for a pointer to the previous block.
+			 */
+			if (size > remaining) {
+
+				wastedMemory += remaining;
+
+				/* Allocate new storage. */
+				const size_t bsize = (size + sizeof(void*) + (WORDSIZE-1) > blocksize) ?
+							size + sizeof(void*) + (WORDSIZE-1) : blocksize;
+
+				// use the standard C malloc to allocate memory
+				void* m = ::malloc(bsize);
+				if (!m) {
+					fprintf(stderr,"Failed to allocate memory.\n");
+					return NULL;
+				}
+
+				/* Fill first word of new block with pointer to previous block. */
+				((void**) m)[0] = base;
+				base = m;
+
+				size_t shift = 0;
+				//int size_t = (WORDSIZE - ( (((size_t)m) + sizeof(void*)) & (WORDSIZE-1))) & (WORDSIZE-1);
+
+				remaining = bsize - sizeof(void*) - shift;
+				loc = ((char*)m + sizeof(void*) + shift);
+			}
+			void* rloc = loc;
+			loc = (char*)loc + size;
+			remaining -= size;
+
+			usedMemory += size;
+
+			return rloc;
+		}
+
+		/**
+		 * Allocates (using this pool) a generic type T.
+		 *
+		 * Params:
+		 *     count = number of instances to allocate.
+		 * Returns: pointer (of type T*) to memory buffer
+		 */
+		template <typename T>
+		T* allocate(const size_t count = 1)
+		{
+			T* mem = (T*) this->malloc(sizeof(T)*count);
+			return mem;
+		}
+
+	};
+	/** @} */
+
+	/** @addtogroup nanoflann_metaprog_grp Auxiliary metaprogramming stuff
+	  * @{ */
+
+	// ----------------  CArray -------------------------
+	/** A STL container (as wrapper) for arrays of constant size defined at compile time (class imported from the MRPT project)
+	 * This code is an adapted version from Boost, modifed for its integration
+	 *	within MRPT (JLBC, Dec/2009) (Renamed array -> CArray to avoid possible potential conflicts).
+	 * See
+	 *      http://www.josuttis.com/cppcode
+	 * for details and the latest version.
+	 * See
+	 *      http://www.boost.org/libs/array for Documentation.
+	 * for documentation.
+	 *
+	 * (C) Copyright Nicolai M. Josuttis 2001.
+	 * Permission to copy, use, modify, sell and distribute this software
+	 * is granted provided this copyright notice appears in all copies.
+	 * This software is provided "as is" without express or implied
+	 * warranty, and with no claim as to its suitability for any purpose.
+	 *
+	 * 29 Jan 2004 - minor fixes (Nico Josuttis)
+	 * 04 Dec 2003 - update to synch with library TR1 (Alisdair Meredith)
+	 * 23 Aug 2002 - fix for Non-MSVC compilers combined with MSVC libraries.
+	 * 05 Aug 2001 - minor update (Nico Josuttis)
+	 * 20 Jan 2001 - STLport fix (Beman Dawes)
+	 * 29 Sep 2000 - Initial Revision (Nico Josuttis)
+	 *
+	 * Jan 30, 2004
+	 */
+    template <typename T, std::size_t N>
+    class CArray {
+      public:
+        T elems[N];    // fixed-size array of elements of type T
+
+      public:
+        // type definitions
+        typedef T              value_type;
+        typedef T*             iterator;
+        typedef const T*       const_iterator;
+        typedef T&             reference;
+        typedef const T&       const_reference;
+        typedef std::size_t    size_type;
+        typedef std::ptrdiff_t difference_type;
+
+        // iterator support
+        inline iterator begin() { return elems; }
+        inline const_iterator begin() const { return elems; }
+        inline iterator end() { return elems+N; }
+        inline const_iterator end() const { return elems+N; }
+
+        // reverse iterator support
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR) && !defined(BOOST_NO_STD_ITERATOR_TRAITS)
+        typedef std::reverse_iterator<iterator> reverse_iterator;
+        typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
+#elif defined(_MSC_VER) && (_MSC_VER == 1300) && defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB == 310)
+        // workaround for broken reverse_iterator in VC7
+        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, iterator,
+                                      reference, iterator, reference> > reverse_iterator;
+        typedef std::reverse_iterator<std::_Ptrit<value_type, difference_type, const_iterator,
+                                      const_reference, iterator, reference> > const_reverse_iterator;
+#else
+        // workaround for broken reverse_iterator implementations
+        typedef std::reverse_iterator<iterator,T> reverse_iterator;
+        typedef std::reverse_iterator<const_iterator,T> const_reverse_iterator;
+#endif
+
+        reverse_iterator rbegin() { return reverse_iterator(end()); }
+        const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+        reverse_iterator rend() { return reverse_iterator(begin()); }
+        const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+        // operator[]
+        inline reference operator[](size_type i) { return elems[i]; }
+        inline const_reference operator[](size_type i) const { return elems[i]; }
+        // at() with range check
+        reference at(size_type i) { rangecheck(i); return elems[i]; }
+        const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
+        // front() and back()
+        reference front() { return elems[0]; }
+        const_reference front() const { return elems[0]; }
+        reference back() { return elems[N-1]; }
+        const_reference back() const { return elems[N-1]; }
+        // size is constant
+        static inline size_type size() { return N; }
+        static bool empty() { return false; }
+        static size_type max_size() { return N; }
+        enum { static_size = N };
+		/** This method has no effects in this class, but raises an exception if the expected size does not match */
+		inline void resize(const size_t nElements) { if (nElements!=N) throw std::logic_error("Try to change the size of a CArray."); }
+        // swap (note: linear complexity in N, constant for given instantiation)
+        void swap (CArray<T,N>& y) { std::swap_ranges(begin(),end(),y.begin()); }
+        // direct access to data (read-only)
+        const T* data() const { return elems; }
+        // use array as C array (direct read/write access to data)
+        T* data() { return elems; }
+        // assignment with type conversion
+        template <typename T2> CArray<T,N>& operator= (const CArray<T2,N>& rhs) {
+            std::copy(rhs.begin(),rhs.end(), begin());
+            return *this;
+        }
+        // assign one value to all elements
+        inline void assign (const T& value) { for (size_t i=0;i<N;i++) elems[i]=value; }
+        // assign (compatible with std::vector's one) (by JLBC for MRPT)
+        void assign (const size_t n, const T& value) { assert(N==n); for (size_t i=0;i<N;i++) elems[i]=value; }
+      private:
+        // check range (may be private because it is static)
+        static void rangecheck (size_type i) { if (i >= size()) { throw std::out_of_range("CArray<>: index out of range"); } }
+    }; // end of CArray
+
+	/** Used to declare fixed-size arrays when DIM>0, dynamically-allocated vectors when DIM=-1.
+	  * Fixed size version for a generic DIM:
+	  */
+	template <int DIM, typename T>
+	struct array_or_vector_selector
+	{
+		typedef CArray<T,DIM> container_t;
+	};
+	/** Dynamic size version */
+	template <typename T>
+	struct array_or_vector_selector<-1,T> {
+		typedef std::vector<T> container_t;
+	};
+	/** @} */
+
+	/** @addtogroup kdtrees_grp KD-tree classes and adaptors
+	  * @{ */
+
+	/** kd-tree index
+	 *
+	 * Contains the k-d trees and other information for indexing a set of points
+	 * for nearest-neighbor matching.
+	 *
+	 *  The class "DatasetAdaptor" must provide the following interface (can be non-virtual, inlined methods):
+	 *
+	 *  \code
+	 *   // Must return the number of data points
+	 *   inline size_t kdtree_get_point_count() const { ... }
+	 *
+	 *   // Must return the Euclidean (L2) distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
+	 *   inline DistanceType kdtree_distance(const T *p1, const size_t idx_p2,size_t size) const { ... }
+	 *
+	 *   // Must return the dim'th component of the idx'th point in the class:
+	 *   inline T kdtree_get_pt(const size_t idx, int dim) const { ... }
+	 *
+	 *   // Optional bounding-box computation: return false to default to a standard bbox computation loop.
+	 *   //   Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again.
+	 *   //   Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
+	 *   template <class BBOX>
+	 *   bool kdtree_get_bbox(BBOX &bb) const
+	 *   {
+	 *      bb[0].low = ...; bb[0].high = ...;  // 0th dimension limits
+	 *      bb[1].low = ...; bb[1].high = ...;  // 1st dimension limits
+	 *      ...
+	 *      return true;
+	 *   }
+	 *
+	 *  \endcode
+	 *
+	 * \tparam IndexType Will be typically size_t or int
+	 */
+	template <typename Distance, class DatasetAdaptor,int DIM = -1, typename IndexType = size_t>
+	class KDTreeSingleIndexAdaptor
+	{
+	private:
+		/** Hidden copy constructor, to disallow copying indices (Not implemented) */
+		KDTreeSingleIndexAdaptor(const KDTreeSingleIndexAdaptor<Distance,DatasetAdaptor,DIM,IndexType>&);
+	public:
+		typedef typename Distance::ElementType  ElementType;
+		typedef typename Distance::DistanceType DistanceType;
+	protected:
+
+		/**
+		 *  Array of indices to vectors in the dataset.
+		 */
+		std::vector<IndexType> vind;
+
+		size_t m_leaf_max_size;
+
+
+		/**
+		 * The dataset used by this index
+		 */
+		const DatasetAdaptor &dataset; //!< The source of our data
+
+		const KDTreeSingleIndexAdaptorParams index_params;
+
+		size_t m_size;
+		int dim;  //!< Dimensionality of each data point
+
+
+		/*--------------------- Internal Data Structures --------------------------*/
+		struct Node
+		{
+			union {
+				struct
+				{
+					/**
+					 * Indices of points in leaf node
+					 */
+					IndexType left, right;
+				} lr;
+				struct
+				{
+					/**
+					 * Dimension used for subdivision.
+					 */
+					int divfeat;
+					/**
+					 * The values used for subdivision.
+					 */
+					DistanceType divlow, divhigh;
+				} sub;
+			};
+			/**
+			 * The child nodes.
+			 */
+			Node* child1, * child2;
+		};
+		typedef Node* NodePtr;
+
+
+		struct Interval
+		{
+			ElementType low, high;
+		};
+
+		/** Define "BoundingBox" as a fixed-size or variable-size container depending on "DIM" */
+		typedef typename array_or_vector_selector<DIM,Interval>::container_t BoundingBox;
+
+		/** Define "distance_vector_t" as a fixed-size or variable-size container depending on "DIM" */
+		typedef typename array_or_vector_selector<DIM,DistanceType>::container_t distance_vector_t;
+
+		/** This record represents a branch point when finding neighbors in
+			the tree.  It contains a record of the minimum distance to the query
+			point, as well as the node at which the search resumes.
+		 */
+		template <typename T, typename DistanceType>
+		struct BranchStruct
+		{
+			T node;           /* Tree node at which search resumes */
+			DistanceType mindist;     /* Minimum distance to query for all nodes below. */
+
+			BranchStruct() {}
+			BranchStruct(const T& aNode, DistanceType dist) : node(aNode), mindist(dist) {}
+
+			inline bool operator<(const BranchStruct<T, DistanceType>& rhs) const
+			{
+				return mindist<rhs.mindist;
+			}
+		};
+
+		/**
+		 * Array of k-d trees used to find neighbours.
+		 */
+		NodePtr root_node;
+		typedef BranchStruct<NodePtr, DistanceType> BranchSt;
+		typedef BranchSt* Branch;
+
+		BoundingBox root_bbox;
+
+		/**
+		 * Pooled memory allocator.
+		 *
+		 * Using a pooled memory allocator is more efficient
+		 * than allocating memory directly when there is a large
+		 * number small of memory allocations.
+		 */
+		PooledAllocator pool;
+
+	public:
+
+		Distance distance;
+
+		/**
+		 * KDTree constructor
+		 *
+		 * Params:
+		 *          inputData = dataset with the input features
+		 *          params = parameters passed to the kdtree algorithm (see http://code.google.com/p/nanoflann/ for help choosing the parameters)
+		 */
+		KDTreeSingleIndexAdaptor(const int dimensionality, const DatasetAdaptor& inputData, const KDTreeSingleIndexAdaptorParams& params = KDTreeSingleIndexAdaptorParams() ) :
+			dataset(inputData), index_params(params), root_node(NULL), distance(inputData)
+		{
+			m_size = dataset.kdtree_get_point_count();
+			dim = dimensionality;
+			if (DIM>0) dim=DIM;
+			else {
+				if (params.dim>0) dim = params.dim;
+			}
+			m_leaf_max_size = params.leaf_max_size;
+
+			// Create a permutable array of indices to the input vectors.
+			init_vind();
+		}
+
+		/**
+		 * Standard destructor
+		 */
+		~KDTreeSingleIndexAdaptor()
+		{
+		}
+
+		/** Frees the previously-built index. Automatically called within buildIndex(). */
+		void freeIndex()
+		{
+			pool.free_all();
+			root_node=NULL;
+		}
+
+		/**
+		 * Builds the index
+		 */
+		void buildIndex()
+		{
+			init_vind();
+			computeBoundingBox(root_bbox);
+			freeIndex();
+            if (size())
+                root_node = divideTree(0, m_size, root_bbox);   // construct the tree
+		}
+
+		/**
+		 *  Returns size of index.
+		 */
+		size_t size() const
+		{
+			return m_size;
+		}
+
+		/**
+		 * Returns the length of an index feature.
+		 */
+		size_t veclen() const
+		{
+			return static_cast<size_t>(DIM>0 ? DIM : dim);
+		}
+
+		/**
+		 * Computes the inde memory usage
+		 * Returns: memory used by the index
+		 */
+		size_t usedMemory() const
+		{
+			return pool.usedMemory+pool.wastedMemory+dataset.kdtree_get_point_count()*sizeof(IndexType);  // pool memory and vind array memory
+		}
+
+		/** \name Query methods
+		  * @{ */
+
+		/**
+		 * Find set of nearest neighbors to vec[0:dim-1]. Their indices are stored inside
+		 * the result object.
+		 *
+		 * Params:
+		 *     result = the result object in which the indices of the nearest-neighbors are stored
+		 *     vec = the vector for which to search the nearest neighbors
+		 *
+		 * \tparam RESULTSET Should be any ResultSet<DistanceType>
+		 * \sa knnSearch, radiusSearch
+		 */
+		template <typename RESULTSET>
+		void findNeighbors(RESULTSET& result, const ElementType* vec, const SearchParams& searchParams) const
+		{
+			assert(vec);
+            if (size() == 0)
+                return;
+			if (!root_node) throw std::runtime_error("[nanoflann] findNeighbors() called before building the index.");
+			float epsError = 1+searchParams.eps;
+
+			distance_vector_t dists; // fixed or variable-sized container (depending on DIM)
+			dists.assign((DIM>0 ? DIM : dim) ,0); // Fill it with zeros.
+			DistanceType distsq = computeInitialDistances(vec, dists);
+			searchLevel(result, vec, root_node, distsq, dists, epsError);  // "count_leaf" parameter removed since was neither used nor returned to the user.
+		}
+
+		/**
+		 * Find the "num_closest" nearest neighbors to the \a query_point[0:dim-1]. Their indices are stored inside
+		 * the result object.
+		 *  \sa radiusSearch, findNeighbors
+		 * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface.
+		 */
+		inline void knnSearch(const ElementType *query_point, const size_t num_closest, IndexType *out_indices, DistanceType *out_distances_sq, const int nChecks_IGNORED = 10) const
+		{
+			nanoflann::KNNResultSet<DistanceType,IndexType> resultSet(num_closest);
+			resultSet.init(out_indices, out_distances_sq);
+			this->findNeighbors(resultSet, query_point, nanoflann::SearchParams());
+		}
+
+		/**
+		 * Find all the neighbors to \a query_point[0:dim-1] within a maximum radius.
+		 *  The output is given as a vector of pairs, of which the first element is a point index and the second the corresponding distance.
+		 *  Previous contents of \a IndicesDists are cleared.
+		 *
+		 *  If searchParams.sorted==true, the output list is sorted by ascending distances.
+		 *
+		 *  For a better performance, it is advisable to do a .reserve() on the vector if you have any wild guess about the number of expected matches.
+		 *
+		 *  \sa knnSearch, findNeighbors
+		 * \return The number of points within the given radius (i.e. indices.size() or dists.size() )
+		 */
+		size_t radiusSearch(const ElementType *query_point,const DistanceType radius, std::vector<std::pair<IndexType,DistanceType> >& IndicesDists, const SearchParams& searchParams) const
+		{
+			RadiusResultSet<DistanceType,IndexType> resultSet(radius,IndicesDists);
+			this->findNeighbors(resultSet, query_point, searchParams);
+
+			if (searchParams.sorted)
+				std::sort(IndicesDists.begin(),IndicesDists.end(), IndexDist_Sorter() );
+
+			return resultSet.size();
+		}
+
+		/** @} */
+
+	private:
+		/** Make sure the auxiliary list \a vind has the same size than the current dataset, and re-generate if size has changed. */
+		void init_vind()
+		{
+			// Create a permutable array of indices to the input vectors.
+			m_size = dataset.kdtree_get_point_count();
+			if (vind.size()!=m_size) vind.resize(m_size);
+			for (size_t i = 0; i < m_size; i++) vind[i] = i;
+		}
+
+		/// Helper accessor to the dataset points:
+		inline ElementType dataset_get(size_t idx, int component) const {
+			return dataset.kdtree_get_pt(idx,component);
+		}
+
+
+		void save_tree(FILE* stream, NodePtr tree)
+		{
+			save_value(stream, *tree);
+			if (tree->child1!=NULL) {
+				save_tree(stream, tree->child1);
+			}
+			if (tree->child2!=NULL) {
+				save_tree(stream, tree->child2);
+			}
+		}
+
+
+		void load_tree(FILE* stream, NodePtr& tree)
+		{
+			tree = pool.allocate<Node>();
+			load_value(stream, *tree);
+			if (tree->child1!=NULL) {
+				load_tree(stream, tree->child1);
+			}
+			if (tree->child2!=NULL) {
+				load_tree(stream, tree->child2);
+			}
+		}
+
+
+		void computeBoundingBox(BoundingBox& bbox)
+		{
+			bbox.resize((DIM>0 ? DIM : dim));
+			if (dataset.kdtree_get_bbox(bbox))
+			{
+				// Done! It was implemented in derived class
+			}
+			else
+			{
+				for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+					bbox[i].low =
+						bbox[i].high = dataset_get(0,i);
+				}
+				const size_t N = dataset.kdtree_get_point_count();
+				for (size_t k=1; k<N; ++k) {
+					for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+						if (dataset_get(k,i)<bbox[i].low) bbox[i].low = dataset_get(k,i);
+						if (dataset_get(k,i)>bbox[i].high) bbox[i].high = dataset_get(k,i);
+					}
+				}
+			}
+		}
+
+
+		/**
+		 * Create a tree node that subdivides the list of vecs from vind[first]
+		 * to vind[last].  The routine is called recursively on each sublist.
+		 * Place a pointer to this new tree node in the location pTree.
+		 *
+		 * Params: pTree = the new node to create
+		 *                  first = index of the first vector
+		 *                  last = index of the last vector
+		 */
+		NodePtr divideTree(const IndexType left, const IndexType right, BoundingBox& bbox)
+		{
+			NodePtr node = pool.allocate<Node>(); // allocate memory
+
+			/* If too few exemplars remain, then make this a leaf node. */
+			if ( (right-left) <= m_leaf_max_size) {
+				node->child1 = node->child2 = NULL;    /* Mark as leaf node. */
+				node->lr.left = left;
+				node->lr.right = right;
+
+				// compute bounding-box of leaf points
+				for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+					bbox[i].low = dataset_get(vind[left],i);
+					bbox[i].high = dataset_get(vind[left],i);
+				}
+				for (IndexType k=left+1; k<right; ++k) {
+					for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+						if (bbox[i].low>dataset_get(vind[k],i)) bbox[i].low=dataset_get(vind[k],i);
+						if (bbox[i].high<dataset_get(vind[k],i)) bbox[i].high=dataset_get(vind[k],i);
+					}
+				}
+			}
+			else {
+				IndexType idx;
+				int cutfeat;
+				DistanceType cutval;
+				middleSplit_(&vind[0]+left, right-left, idx, cutfeat, cutval, bbox);
+
+				node->sub.divfeat = cutfeat;
+
+				BoundingBox left_bbox(bbox);
+				left_bbox[cutfeat].high = cutval;
+				node->child1 = divideTree(left, left+idx, left_bbox);
+
+				BoundingBox right_bbox(bbox);
+				right_bbox[cutfeat].low = cutval;
+				node->child2 = divideTree(left+idx, right, right_bbox);
+
+				node->sub.divlow = left_bbox[cutfeat].high;
+				node->sub.divhigh = right_bbox[cutfeat].low;
+
+				for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+					bbox[i].low = std::min(left_bbox[i].low, right_bbox[i].low);
+					bbox[i].high = std::max(left_bbox[i].high, right_bbox[i].high);
+				}
+			}
+
+			return node;
+		}
+
+		void computeMinMax(IndexType* ind, IndexType count, int element, ElementType& min_elem, ElementType& max_elem)
+		{
+			min_elem = dataset_get(ind[0],element);
+			max_elem = dataset_get(ind[0],element);
+			for (IndexType i=1; i<count; ++i) {
+				ElementType val = dataset_get(ind[i],element);
+				if (val<min_elem) min_elem = val;
+				if (val>max_elem) max_elem = val;
+			}
+		}
+
+		void middleSplit(IndexType* ind, IndexType count, IndexType& index, int& cutfeat, DistanceType& cutval, const BoundingBox& bbox)
+		{
+			// find the largest span from the approximate bounding box
+			ElementType max_span = bbox[0].high-bbox[0].low;
+			cutfeat = 0;
+			cutval = (bbox[0].high+bbox[0].low)/2;
+			for (int i=1; i<(DIM>0 ? DIM : dim); ++i) {
+				ElementType span = bbox[i].low-bbox[i].low;
+				if (span>max_span) {
+					max_span = span;
+					cutfeat = i;
+					cutval = (bbox[i].high+bbox[i].low)/2;
+				}
+			}
+
+			// compute exact span on the found dimension
+			ElementType min_elem, max_elem;
+			computeMinMax(ind, count, cutfeat, min_elem, max_elem);
+			cutval = (min_elem+max_elem)/2;
+			max_span = max_elem - min_elem;
+
+			// check if a dimension of a largest span exists
+			size_t k = cutfeat;
+			for (size_t i=0; i<(DIM>0 ? DIM : dim); ++i) {
+				if (i==k) continue;
+				ElementType span = bbox[i].high-bbox[i].low;
+				if (span>max_span) {
+					computeMinMax(ind, count, i, min_elem, max_elem);
+					span = max_elem - min_elem;
+					if (span>max_span) {
+						max_span = span;
+						cutfeat = i;
+						cutval = (min_elem+max_elem)/2;
+					}
+				}
+			}
+			IndexType lim1, lim2;
+			planeSplit(ind, count, cutfeat, cutval, lim1, lim2);
+
+			if (lim1>count/2) index = lim1;
+			else if (lim2<count/2) index = lim2;
+			else index = count/2;
+		}
+
+
+		void middleSplit_(IndexType* ind, IndexType count, IndexType& index, int& cutfeat, DistanceType& cutval, const BoundingBox& bbox)
+		{
+			const DistanceType EPSs=static_cast<DistanceType>(0.00001);
+			ElementType max_span = bbox[0].high-bbox[0].low;
+			for (int i=1; i<(DIM>0 ? DIM : dim); ++i) {
+				ElementType span = bbox[i].high-bbox[i].low;
+				if (span>max_span) {
+					max_span = span;
+				}
+			}
+			ElementType max_spread = -1;
+			cutfeat = 0;
+			for (int i=0; i<(DIM>0 ? DIM : dim); ++i) {
+				ElementType span = bbox[i].high-bbox[i].low;
+				if (span>(1-EPSs)*max_span) {
+					ElementType min_elem, max_elem;
+					computeMinMax(ind, count, cutfeat, min_elem, max_elem);
+					ElementType spread = max_elem-min_elem;;
+					if (spread>max_spread) {
+						cutfeat = i;
+						max_spread = spread;
+					}
+				}
+			}
+			// split in the middle
+			DistanceType split_val = (bbox[cutfeat].low+bbox[cutfeat].high)/2;
+			ElementType min_elem, max_elem;
+			computeMinMax(ind, count, cutfeat, min_elem, max_elem);
+
+			if (split_val<min_elem) cutval = min_elem;
+			else if (split_val>max_elem) cutval = max_elem;
+			else cutval = split_val;
+
+			IndexType lim1, lim2;
+			planeSplit(ind, count, cutfeat, cutval, lim1, lim2);
+
+			if (lim1>count/2) index = lim1;
+			else if (lim2<count/2) index = lim2;
+			else index = count/2;
+		}
+
+
+		/**
+		 *  Subdivide the list of points by a plane perpendicular on axe corresponding
+		 *  to the 'cutfeat' dimension at 'cutval' position.
+		 *
+		 *  On return:
+		 *  dataset[ind[0..lim1-1]][cutfeat]<cutval
+		 *  dataset[ind[lim1..lim2-1]][cutfeat]==cutval
+		 *  dataset[ind[lim2..count]][cutfeat]>cutval
+		 */
+		void planeSplit(IndexType* ind, const IndexType count, int cutfeat, DistanceType cutval, IndexType& lim1, IndexType& lim2)
+		{
+			/* Move vector indices for left subtree to front of list. */
+			IndexType left = 0;
+			IndexType right = count-1;
+			for (;; ) {
+				while (left<=right && dataset_get(ind[left],cutfeat)<cutval) ++left;
+				while (right && left<=right && dataset_get(ind[right],cutfeat)>=cutval) --right;
+				if (left>right || !right) break;  // "!right" was added to support unsigned Index types
+				std::swap(ind[left], ind[right]);
+				++left;
+				--right;
+			}
+			/* If either list is empty, it means that all remaining features
+			 * are identical. Split in the middle to maintain a balanced tree.
+			 */
+			lim1 = left;
+			right = count-1;
+			for (;; ) {
+				while (left<=right && dataset_get(ind[left],cutfeat)<=cutval) ++left;
+				while (right && left<=right && dataset_get(ind[right],cutfeat)>cutval) --right;
+				if (left>right || !right) break;  // "!right" was added to support unsigned Index types
+				std::swap(ind[left], ind[right]);
+				++left;
+				--right;
+			}
+			lim2 = left;
+		}
+
+		DistanceType computeInitialDistances(const ElementType* vec, distance_vector_t& dists) const
+		{
+			assert(vec);
+			DistanceType distsq = 0.0;
+
+			for (int i = 0; i < (DIM>0 ? DIM : dim); ++i) {
+				if (vec[i] < root_bbox[i].low) {
+					dists[i] = distance.accum_dist(vec[i], root_bbox[i].low, i);
+					distsq += dists[i];
+				}
+				if (vec[i] > root_bbox[i].high) {
+					dists[i] = distance.accum_dist(vec[i], root_bbox[i].high, i);
+					distsq += dists[i];
+				}
+			}
+
+			return distsq;
+		}
+
+		/**
+		 * Performs an exact search in the tree starting from a node.
+		 * \tparam RESULTSET Should be any ResultSet<DistanceType>
+		 */
+		template <class RESULTSET>
+		void searchLevel(RESULTSET& result_set, const ElementType* vec, const NodePtr node, DistanceType mindistsq,
+						 distance_vector_t& dists, const float epsError) const
+		{
+			/* If this is a leaf node, then do check and return. */
+			if ((node->child1 == NULL)&&(node->child2 == NULL)) {
+				//count_leaf += (node->lr.right-node->lr.left);  // Removed since was neither used nor returned to the user.
+				DistanceType worst_dist = result_set.worstDist();
+				for (IndexType i=node->lr.left; i<node->lr.right; ++i) {
+					const IndexType index = vind[i];// reorder... : i;
+					DistanceType dist = distance(vec, index, (DIM>0 ? DIM : dim));
+					if (dist<worst_dist) {
+						result_set.addPoint(dist,vind[i]);
+					}
+				}
+				return;
+			}
+
+			/* Which child branch should be taken first? */
+			int idx = node->sub.divfeat;
+			ElementType val = vec[idx];
+			DistanceType diff1 = val - node->sub.divlow;
+			DistanceType diff2 = val - node->sub.divhigh;
+
+			NodePtr bestChild;
+			NodePtr otherChild;
+			DistanceType cut_dist;
+			if ((diff1+diff2)<0) {
+				bestChild = node->child1;
+				otherChild = node->child2;
+				cut_dist = distance.accum_dist(val, node->sub.divhigh, idx);
+			}
+			else {
+				bestChild = node->child2;
+				otherChild = node->child1;
+				cut_dist = distance.accum_dist( val, node->sub.divlow, idx);
+			}
+
+			/* Call recursively to search next level down. */
+			searchLevel(result_set, vec, bestChild, mindistsq, dists, epsError);
+
+			DistanceType dst = dists[idx];
+			mindistsq = mindistsq + cut_dist - dst;
+			dists[idx] = cut_dist;
+			if (mindistsq*epsError<=result_set.worstDist()) {
+				searchLevel(result_set, vec, otherChild, mindistsq, dists, epsError);
+			}
+			dists[idx] = dst;
+		}
+
+	public:
+		/**  Stores the index in a binary file.
+		  *   IMPORTANT NOTE: The set of data points is NOT stored in the file, so when loading the index object it must be constructed associated to the same source of data points used while building it.
+		  * See the example: examples/saveload_example.cpp
+		  * \sa loadIndex  */
+		void saveIndex(FILE* stream)
+		{
+			save_value(stream, m_size);
+			save_value(stream, dim);
+			save_value(stream, root_bbox);
+			save_value(stream, m_leaf_max_size);
+			save_value(stream, vind);
+			save_tree(stream, root_node);
+		}
+
+		/**  Loads a previous index from a binary file.
+		  *   IMPORTANT NOTE: The set of data points is NOT stored in the file, so the index object must be constructed associated to the same source of data points used while building the index.
+		  * See the example: examples/saveload_example.cpp
+		  * \sa loadIndex  */
+		void loadIndex(FILE* stream)
+		{
+			load_value(stream, m_size);
+			load_value(stream, dim);
+			load_value(stream, root_bbox);
+			load_value(stream, m_leaf_max_size);
+			load_value(stream, vind);
+			load_tree(stream, root_node);
+		}
+
+	};   // class KDTree
+
+
+	/** A simple KD-tree adaptor for working with data directly stored in an Eigen Matrix, without duplicating the data storage.
+	  *  Each row in the matrix represents a point in the state space.
+	  *
+	  *  Example of usage:
+	  * \code
+	  * 	Eigen::Matrix<num_t,Dynamic,Dynamic>  mat;
+	  * 	// Fill out "mat"...
+	  *
+	  * 	typedef KDTreeEigenMatrixAdaptor< Eigen::Matrix<num_t,Dynamic,Dynamic> >  my_kd_tree_t;
+	  * 	const int max_leaf = 10;
+	  * 	my_kd_tree_t   mat_index(dimdim, mat, max_leaf );
+	  * 	mat_index.index->buildIndex();
+	  * 	mat_index.index->...
+	  * \endcode
+	  *
+	  *  \tparam DIM If set to >0, it specifies a compile-time fixed dimensionality for the points in the data set, allowing more compiler optimizations.
+	  *  \tparam Distance The distance metric to use: nanoflann::metric_L1, nanoflann::metric_L2, nanoflann::metric_L2_Simple, etc.
+	  *  \tparam IndexType The type for indices in the KD-tree index (typically, size_t of int)
+	  */
+	template <class MatrixType, int DIM = -1, class Distance = nanoflann::metric_L2, typename IndexType = size_t>
+	struct KDTreeEigenMatrixAdaptor
+	{
+		typedef KDTreeEigenMatrixAdaptor<MatrixType,DIM,Distance,IndexType> self_t;
+		typedef typename MatrixType::Scalar              num_t;
+		typedef typename Distance::template traits<num_t,self_t>::distance_t metric_t;
+		typedef KDTreeSingleIndexAdaptor< metric_t,self_t,DIM,IndexType>  index_t;
+
+		index_t* index; //! The kd-tree index for the user to call its methods as usual with any other FLANN index.
+
+		/// Constructor: takes a const ref to the matrix object with the data points
+		KDTreeEigenMatrixAdaptor(const int dimensionality, const MatrixType &mat, const int leaf_max_size = 10) : m_data_matrix(mat)
+		{
+			const size_t dims = mat.cols();
+			if (DIM>0 && static_cast<int>(dims)!=DIM)
+				throw std::runtime_error("Data set dimensionality does not match the 'DIM' template argument");
+			index = new index_t( dims, *this /* adaptor */, nanoflann::KDTreeSingleIndexAdaptorParams(leaf_max_size, dims ) );
+			index->buildIndex();
+		}
+	private:
+		/** Hidden copy constructor, to disallow copying this class (Not implemented) */
+		KDTreeEigenMatrixAdaptor(const self_t&);
+	public:
+
+		~KDTreeEigenMatrixAdaptor() {
+			delete index;
+		}
+
+		const MatrixType &m_data_matrix;
+
+		/** Query for the \a num_closest closest points to a given point (entered as query_point[0:dim-1]).
+		  *  Note that this is a short-cut method for index->findNeighbors().
+		  *  The user can also call index->... methods as desired.
+		  * \note nChecks_IGNORED is ignored but kept for compatibility with the original FLANN interface.
+		  */
+		inline void query(const num_t *query_point, const size_t num_closest, IndexType *out_indices, num_t *out_distances_sq, const int nChecks_IGNORED = 10) const
+		{
+			nanoflann::KNNResultSet<typename MatrixType::Scalar,IndexType> resultSet(num_closest);
+			resultSet.init(out_indices, out_distances_sq);
+			index->findNeighbors(resultSet, query_point, nanoflann::SearchParams());
+		}
+
+		/** @name Interface expected by KDTreeSingleIndexAdaptor
+		  * @{ */
+
+		const self_t & derived() const {
+			return *this;
+		}
+		self_t & derived()       {
+			return *this;
+		}
+
+		// Must return the number of data points
+		inline size_t kdtree_get_point_count() const {
+			return m_data_matrix.rows();
+		}
+
+		// Returns the distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
+		inline num_t kdtree_distance(const num_t *p1, const size_t idx_p2,size_t size) const
+		{
+			num_t s=0;
+			for (size_t i=0; i<size; i++) {
+				const num_t d= p1[i]-m_data_matrix.coeff(idx_p2,i);
+				s+=d*d;
+			}
+			return s;
+		}
+
+		// Returns the dim'th component of the idx'th point in the class:
+		inline num_t kdtree_get_pt(const size_t idx, int dim) const {
+			return m_data_matrix.coeff(idx,dim);
+		}
+
+		// Optional bounding-box computation: return false to default to a standard bbox computation loop.
+		//   Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again.
+		//   Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
+		template <class BBOX>
+		bool kdtree_get_bbox(BBOX &bb) const {
+			return false;
+		}
+
+		/** @} */
+
+	}; // end of KDTreeEigenMatrixAdaptor
+	/** @} */
+
+/** @} */ // end of grouping
+} // end of NS
+
+
+#endif /* NANOFLANN_HPP_ */
diff --git a/vendor/rply-1.1.3/LICENSE b/vendor/rply-1.1.3/LICENSE
new file mode 100644
index 0000000..5c07c9a
--- /dev/null
+++ b/vendor/rply-1.1.3/LICENSE
@@ -0,0 +1,20 @@
+RPly 1.1.3 license
+Copyright � 2003-2013 Diego Nehab.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/vendor/rply-1.1.3/etc/convert.c b/vendor/rply-1.1.3/etc/convert.c
new file mode 100644
index 0000000..e87ac09
--- /dev/null
+++ b/vendor/rply-1.1.3/etc/convert.c
@@ -0,0 +1,130 @@
+#include <stdio.h> 
+#include <stdlib.h> 
+#include <string.h> 
+#include <stdarg.h> 
+#include "rply.h"
+
+/* internal function prototypes */
+static void error(const char *fmt, ...);
+static void help(void);
+static void parse_arguments(int argc, char **argv, 
+        e_ply_storage_mode *storage_mode, 
+        const char **iname, const char **oname);
+static void setup_callbacks(p_ply iply, p_ply oply);
+
+/* given a format mode, an input file name and an output file name,
+ * convert input file to output in given format mode */
+int main(int argc, char **argv) {
+    const char *value = NULL;
+    e_ply_storage_mode storage_mode = PLY_LITTLE_ENDIAN;
+    const char *iname = NULL, *oname = NULL;
+    p_ply iply = NULL, oply = NULL;
+    /* parse command line arguments */
+    parse_arguments(argc, argv, &storage_mode, &iname, &oname);
+    /* open input file and make sure we parsed its header */
+    iply = ply_open(iname, NULL, 0, NULL);
+    if (!iply) error("Unable to open file '%s'", iname);
+    if (!ply_read_header(iply)) error("Failed reading '%s' header", iname);
+    /* create output file */
+    oply = ply_create(oname, storage_mode, NULL, 0, NULL);
+    if (!oply) error("Unable to create file '%s'", oname);
+    /* create elements and properties in output file and 
+     * setup callbacks for them in input file */
+    setup_callbacks(iply, oply); 
+    /* pass comments and obj_infos from input to output */
+    value = NULL;
+    while ((value = ply_get_next_comment(iply, value)))
+        if (!ply_add_comment(oply, value))
+            error("Failed adding comments");
+    value = NULL;
+    while ((value = ply_get_next_obj_info(iply, value)))
+        if (!ply_add_obj_info(oply, value))
+            error("Failed adding comments");
+    /* write output header */
+    if (!ply_write_header(oply)) error("Failed writing '%s' header", oname);
+    /* read input file generating callbacks that pass data to output file */
+    if (!ply_read(iply)) error("Conversion failed");
+    /* close up, we are done */
+    if (!ply_close(iply)) error("Error closing file '%s'", iname);
+    if (!ply_close(oply)) error("Error closing file '%s'", oname);
+    return 0;
+}
+
+/* prints an error message and exits */
+static void error(const char *fmt, ...) {   
+    va_list ap;
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
+    fprintf(stderr, "\n");
+    exit(1);
+}               
+
+/* prints the help message and exits */
+static void help(void) {
+    error("Usage:\n"  
+            "    convert <option> <input> <output>\n"
+            "Options:\n"
+            "    -a, --ascii: convert to ascii format\n"
+            "    -b, --big-endian: convert to big-endian format\n"
+            "    -l, --little-endian: convert to little-endian format\n");
+}
+
+/* parse command line parameters */
+static void parse_arguments(int argc, char **argv, 
+        e_ply_storage_mode *storage_mode, 
+        const char **iname, const char **oname) {
+    if (argc < 4) help();
+    if (strcmp(argv[1], "--ascii") == 0 || 
+            strcmp(argv[1], "-a") == 0)
+        *storage_mode = PLY_ASCII;
+    else if (strcmp(argv[1], "--little-endian") == 0 || 
+            strcmp(argv[1], "-l") == 0) 
+        *storage_mode = PLY_LITTLE_ENDIAN;
+    else if (strcmp(argv[1], "--big-endian") == 0 || 
+            strcmp(argv[1], "-b") == 0) 
+        *storage_mode = PLY_BIG_ENDIAN;
+    else help(); 
+    *iname = argv[2];
+    *oname = argv[3];
+}
+
+/* read callback */
+static int callback(p_ply_argument argument) {
+    void *pdata;
+    /* just pass the value from the input file to the output file */
+    ply_get_argument_user_data(argument, &pdata, NULL);
+    ply_write((p_ply) pdata, ply_get_argument_value(argument));
+    return 1;
+}
+
+/* prepares the conversion */
+static void setup_callbacks(p_ply iply, p_ply oply) {
+    p_ply_element element = NULL;
+    /* iterate over all elements in input file */
+    while ((element = ply_get_next_element(iply, element))) {
+        p_ply_property property = NULL;
+        long ninstances = 0;
+        const char *element_name;
+        ply_get_element_info(element, &element_name, &ninstances);
+        /* add this element to output file */
+        if (!ply_add_element(oply, element_name, ninstances))
+            error("Unable to add output element '%s'", element_name);
+        /* iterate over all properties of current element */
+        while ((property = ply_get_next_property(element, property))) {
+            const char *property_name;
+            e_ply_type type, length_type, value_type;
+            ply_get_property_info(property, &property_name, &type, 
+                    &length_type, &value_type);
+            /* setup input callback for this property */
+            if (!ply_set_read_cb(iply, element_name, property_name, callback, 
+                    oply, 0))
+                error("Unable to setup input callback for property '%s'", 
+                        property_name);
+            /* add this property to output file */
+            if (!ply_add_property(oply, property_name, type, length_type, 
+                    value_type))
+                error("Unable to add output property '%s'", property_name);
+        }
+    }
+}
diff --git a/vendor/rply-1.1.3/etc/dump.c b/vendor/rply-1.1.3/etc/dump.c
new file mode 100644
index 0000000..1c84e32
--- /dev/null
+++ b/vendor/rply-1.1.3/etc/dump.c
@@ -0,0 +1,44 @@
+#include <stdio.h> 
+#include "rply.h"
+
+static int vertex_cb(p_ply_argument argument) {
+    long eol;
+    ply_get_argument_user_data(argument, NULL, &eol);
+    printf("%g", ply_get_argument_value(argument));
+    if (eol) printf("\n");
+    else printf(" ");
+    return 1;
+}
+
+static int face_cb(p_ply_argument argument) {
+    long length, value_index;
+    ply_get_argument_property(argument, NULL, &length, &value_index);
+    switch (value_index) {
+        case 0:
+        case 1: 
+            printf("%g ", ply_get_argument_value(argument));
+            break;
+        case 2:
+            printf("%g\n", ply_get_argument_value(argument));
+            break;
+        default: 
+            break;
+    }
+    return 1;
+}
+
+int main(void) {
+    long nvertices, ntriangles;
+    p_ply ply = ply_open("input.ply", NULL, 0, NULL);
+    if (!ply) return 1;
+    if (!ply_read_header(ply)) return 1;
+    nvertices = ply_set_read_cb(ply, "vertex", "x", vertex_cb, NULL, 0);
+    ply_set_read_cb(ply, "vertex", "y", vertex_cb, NULL, 0);
+    ply_set_read_cb(ply, "vertex", "z", vertex_cb, NULL, 1);
+    ntriangles = ply_set_read_cb(ply, "face", "vertex_indices", face_cb, NULL, 0);
+    printf("%ld\n%ld\n", nvertices, ntriangles);
+    if (!ply_read(ply)) return 1;
+    ply_close(ply);
+    return 0;
+}
+
diff --git a/vendor/rply-1.1.3/etc/input.ply b/vendor/rply-1.1.3/etc/input.ply
new file mode 100644
index 0000000..87ba854
--- /dev/null
+++ b/vendor/rply-1.1.3/etc/input.ply
@@ -0,0 +1,16 @@
+ply
+format ascii 1.0
+comment this is our first comment
+element vertex 3
+property float x
+property float y
+property float z
+element face 1
+property list uchar int vertex_indices
+comment this is our last comment
+end_header
+-1 0 0 
+000 1 0 
+1 0000 0
+3 1 00000 2
+3 1 0 2
diff --git a/vendor/rply-1.1.3/etc/sconvert.c b/vendor/rply-1.1.3/etc/sconvert.c
new file mode 100644
index 0000000..22d10df
--- /dev/null
+++ b/vendor/rply-1.1.3/etc/sconvert.c
@@ -0,0 +1,64 @@
+#include <stdio.h> 
+#include "rply.h"
+
+static int callback(p_ply_argument argument) {
+    void *pdata;
+    /* just pass the value from the input file to the output file */
+    ply_get_argument_user_data(argument, &pdata, NULL);
+    ply_write((p_ply) pdata, ply_get_argument_value(argument));
+    return 1;
+}
+
+static int setup_callbacks(p_ply iply, p_ply oply) {
+    p_ply_element element = NULL;
+    /* iterate over all elements in input file */
+    while ((element = ply_get_next_element(iply, element))) {
+        p_ply_property property = NULL;
+        long ninstances = 0;
+        const char *element_name;
+        ply_get_element_info(element, &element_name, &ninstances);
+        /* add this element to output file */
+        if (!ply_add_element(oply, element_name, ninstances)) return 0;
+        /* iterate over all properties of current element */
+        while ((property = ply_get_next_property(element, property))) {
+            const char *property_name;
+            e_ply_type type, length_type, value_type;
+            ply_get_property_info(property, &property_name, &type, 
+                    &length_type, &value_type);
+            /* setup input callback for this property */
+            ply_set_read_cb(iply, element_name, property_name, callback, 
+                oply, 0);
+            /* add this property to output file */
+            if (!ply_add_property(oply, property_name, type, length_type, 
+                    value_type)) return 0;
+        }
+    }
+    return 1;
+}
+
+int main(int argc, char *argv[]) {
+    const char *value;
+    p_ply iply, oply; 
+    (void) argc; (void) argv;
+    iply = ply_open("input.ply", NULL, 0, NULL);
+    if (!iply) return 1; 
+    if (!ply_read_header(iply)) return 1; 
+    oply = ply_create("output.ply", PLY_LITTLE_ENDIAN, NULL, 0, NULL);
+    if (!oply) return 1;
+    if (!setup_callbacks(iply, oply)) return 1; 
+    /* pass comments and obj_infos from input to output */
+    value = NULL;
+    while ((value = ply_get_next_comment(iply, value)))
+        if (!ply_add_comment(oply, value)) return 1; 
+    value = NULL;
+    while ((value = ply_get_next_obj_info(iply, value)))
+        if (!ply_add_obj_info(oply, value)) return 1;;
+    /* write output header */
+    if (!ply_write_header(oply)) return 1; 
+    /* read input file generating callbacks that pass data to output file */
+    if (!ply_read(iply)) return 1; 
+    /* close up, we are done */
+    if (!ply_close(iply)) return 1; 
+    if (!ply_close(oply)) return 1;
+    return 0;
+}
diff --git a/vendor/rply-1.1.3/manual/manual.html b/vendor/rply-1.1.3/manual/manual.html
new file mode 100644
index 0000000..62f5b95
--- /dev/null
+++ b/vendor/rply-1.1.3/manual/manual.html
@@ -0,0 +1,1056 @@
+<html>
+
+<head>
+<meta name="description" content="The RPly Homepage">
+<meta name="keywords" content="open source, C, Library, PLY, file format,
+input, output, tools">
+<title>
+RPly: ANSI C library for PLY file format input and output
+</title>
+<link rel="stylesheet" href="reference.css" type="text/css">
+</head>
+
+<body>
+
+<!-- header +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<div class=header>
+<hr>
+<center>
+<table summary="RPly logo">
+<tr><td align=center>
+<img border=0 alt="RPly" src="rply.png">
+</td></tr>
+<tr><td align=center valign=top>ANSI C Library for PLY file format input and output
+</td></tr>
+</table>
+</center>
+<hr>
+</div>
+
+
+<!-- Introduction +++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<h1>Introduction</h1>
+
+<p>RPly is a library that lets applications read and write PLY files.  The
+PLY file format is widely used to store geometric information, such as 3D
+models, but is general enough to be useful for other purposes.  
+</p>
+
+<p>There are other libraries out there, of course. I tried using them and
+finally decided to write my own. The result is RPly, and I
+hope you are as happy with it as I am. </p>
+
+<p>RPly is easy to use, well documented, small, free,
+open-source, ANSI C, efficient, and well tested. I will keep supporting it
+for a while because all my tools use the library for input/output. The highlights are: </p>
+<ul>
+<li> A callback mechanism that makes PLY file input straightforward; 
+<li> Support for the full range of numeric formats though the user only 
+deals with doubles;
+<li> Binary (big and little endian) and text modes are fully supported;
+<li> Input and output are buffered for efficiency;
+<li> Available under the 
+<a href=http://www.opensource.org/licenses/mit-license.html>MIT license</a> 
+for added freedom.
+</ul>
+
+<p>
+The format was developed at <a
+href=http://graphics.stanford.edu/data/3Dscanrep/>Stanford University</a> 
+for use with their 3D scanning projects. Greg Turk's PLY library, available
+from <a href=http://www.cc.gatech.edu/projects/large_models>
+Georgia Institute of Technology</a>, seems to be the standard reference
+to the PLY file format, although there are some variations out there. 
+</p>
+
+<p> Whatever documentation and examples were found, were taken into
+consideration to create RPly. In theory, since RPly doesn't try to interpret
+the meaning of the data in a PLY file, it should be able to read any PLY file.
+In practice, the library works with all PLY files that I could find.  </p>
+
+<h2>Download</h2>
+
+<p>
+Version 1.1.3 of RPly is available for download in source
+code from <a href=rply-1.1.3.tar.gz>this link</a>. Examples and documentation 
+are packed inside the tarball. Have fun!
+</p>
+
+<p>
+Copyright © 2003-2013 Diego Nehab. All rights reserved. <br>
+Author: <A href="http://www.impa.br/~diego">Diego Nehab</a>
+</p>
+
+<h2>What's new?</h2>
+
+<ul>
+<li> Remove trailing white space from lines in ASCII output.
+</ul>
+
+<h2> RPly's idea of what a PLY file is </h2>
+
+<p> A PLY file contains the description of one object. This object is
+composed by <em>elements</em>, each element type
+being defined by a group of <em>properties</em>.  The PLY file
+format specifies a syntax for the description of element types and the
+properties that compose them, as well as comments and meta-information.
+</p>
+
+<p> The element type descriptions come in a header, which is followed by
+element instances. Element instances come grouped by their type, in the
+order of declaration. Each element instance is defined by the value
+of its properties. Properties values also appear in the order of their
+declaration. Here is a sample PLY file describing a triangle: </p>
+
+<pre class=example>
+ply 
+format ascii 1.0
+comment this is a simple file
+obj_info any data, in one line of free form text
+element vertex 3
+property float x
+property float y
+property float z 
+element face 1
+property list uchar int vertex_indices
+end_header
+-1 0 0
+ 0 1 0
+ 1 0 0 
+3 0 1 2
+</pre>
+
+<p> The header goes from the first line to the line marked by
+<tt>end_header</tt>.  The first line contains only <tt>ply\n</tt> and is
+used to detect whether a file is in PLY format or not (RPly
+also accepts files that start with <tt>ply\r\n</tt>, in
+which case the end-of-line terminator is assumed to be
+<tt>\r\n</tt> throughout.)  The second line
+specifies the <tt>format</tt> number (which is always <tt>1.0</tt>) and the
+storage mode (<tt>ascii</tt>, <tt>binary_big_endian</tt> or
+<tt>binary_little_endian</tt>).  </p>
+
+<p> Lines that start with <tt>comment</tt> are just comments, of course.
+Lines that start with <tt>obj_info</tt> contain meta-information about the
+object.  <tt>Comment</tt>s and <tt>obj_info</tt>s are optional and their
+relative order in the header is irrelevant. </p>
+
+<p> In the sample PLY file, the first element type is declared with name
+<tt>vertex</tt>, and on the same line we learn that there will be 3
+instances of this element type.  The properties following describe what a
+<tt>vertex</tt> element looks like.  Each <tt>vertex</tt> is declared to
+consist of 3 scalar properties, named <tt>x</tt>, <tt>y</tt> and
+<tt>z</tt>.  Each scalar property is declared to be of type <tt>float</tt>.
+</p>
+
+<p> Scalar types can be any of the following: <tt>int8</tt>,
+<tt>uint8</tt>, <tt>int16</tt>, <tt>uint16</tt>, <tt>int32</tt>,
+<tt>uint32</tt>, <tt>float32</tt>, <tt>float64</tt>, <tt>char</tt>,
+<tt>uchar</tt>, <tt>short</tt>, <tt>ushort</tt>, <tt>int</tt>,
+<tt>uint</tt>, <tt>float</tt>, <tt>double</tt>. They consist of signed
+and unsigned integer types of sizes 8, 16 and 32 bits, as well as floating
+point types of 32 and 64bits.
+
+<p> Next, the <tt>face</tt> element type is declared, of which only 1
+instance will be given. This element consists of a <tt>list</tt> property,
+named <tt>vertex_indices</tt>. Lists are sequences on which the
+first value, the <em>length</em>, gives the number of remaining values. List properties are described by the scalar
+type of their length field and the scalar type of the remaining fields.
+In the case of <tt>vertex_indices</tt>, the length field 
+is of type <tt>uchar</tt> and the remaining values are of type
+<tt>int</tt>. </p>
+
+<p> Following the header, come the elements, in the order they were
+declared in the header.  First come the 3 elements of type <tt>vertex</tt>,
+each represented by the value of their properties <tt>x</tt>, <tt>y</tt>
+and <tt>z</tt>. Then comes the single <tt>face</tt> element, composed by a
+single list of type <tt>vertex_indices</tt> containing 3 values 
+(0 1 2).</p>
+
+<h2> How to read a file with RPly </h2>
+
+<p> Most users that want to read a PLY file already know which elements and
+properties they are interested in. In the following example, we will
+implement a simple program that dumps the contents of a PLY file to the
+terminal, in a different, simpler format that only works for triangles.
+</p>
+
+<p> This simple format has a header that gives the number of vertices in the
+first line and the number of triangles in the second line. Following the
+header come the vertices, and finally the triangles. Here is the sample
+code for the program:</p>
+
+<pre class=example>
+#include <stdio.h> 
+#include "rply.h"
+
+static int vertex_cb(p_ply_argument argument) {
+    long eol;
+    ply_get_argument_user_data(argument, NULL, &eol);
+    printf("%g", ply_get_argument_value(argument));
+    if (eol) printf("\n");
+    else printf(" ");
+    return 1;
+}
+
+static int face_cb(p_ply_argument argument) {
+    long length, value_index;
+    ply_get_argument_property(argument, NULL, &length, &value_index);
+    switch (value_index) {
+        case 0:
+        case 1: 
+            printf("%g ", ply_get_argument_value(argument));
+            break;
+        case 2:
+            printf("%g\n", ply_get_argument_value(argument));
+            break;
+        default: 
+            break;
+    }
+    return 1;
+}
+
+int main(void) {
+    long nvertices, ntriangles;
+    p_ply ply = ply_open("input.ply", NULL, 0, NULL);
+    if (!ply) return 1;
+    if (!ply_read_header(ply)) return 1;
+    nvertices = ply_set_read_cb(ply, "vertex", "x", vertex_cb, NULL, 0);
+    ply_set_read_cb(ply, "vertex", "y", vertex_cb, NULL, 0);
+    ply_set_read_cb(ply, "vertex", "z", vertex_cb, NULL, 1);
+    ntriangles = ply_set_read_cb(ply, "face", "vertex_indices", face_cb, NULL, 0);
+    printf("%ld\n%ld\n", nvertices, ntriangles);
+    if (!ply_read(ply)) return 1;
+    ply_close(ply);
+    return 0;
+}
+</pre>
+
+<p> RPly uses callbacks to pass data to an application. Independent callbacks
+can be  associated with each property of each element. For scalar
+properties, the callback is invoked once for each instance. For list
+properties, the callback is invoked first with the number of
+entries in the instance, and then once for each of the data entries. 
+<em>This is exactly the order in which the data items appear in the
+file.</em></p> 
+
+<p> To keep things simple, values are always passed as <tt>double</tt>,
+regardless of how they are stored in the file. From its parameters,
+callbacks can find out exactly which part of the file is being processed
+(including the actual type of the value), plus access custom information
+provided by the user in the form of a pointer and an integer constant. </p>
+
+<p> In our example, we start with a call to <tt>ply_open</tt> to open a
+file for reading. Then we get RPly to parse it's header, with a call to
+<tt>ply_read_header</tt>.  After the header is parsed, RPly knows which
+element types and properties are available. We then set callbacks for each
+of the <tt>vertex</tt> element properties and the <tt>face</tt> property
+(using <tt>ply_set_read_cb</tt>). Finally, we invoke the main RPly reading
+function, <tt>ply_read</tt>. This function reads all data in the file,
+passing the data to the appropriate callbacks.  After all reading is done,
+we call <tt>ply_close</tt> to release any resources used by RPly.</p> 
+
+<p>There are some details, of course. <tt>Ply_set_read_cb</tt> returns the
+number of instances of the target property (which is the same as the number
+of element instances).  This is how the program obtains the number of
+vertices and faces in the file. </p>
+
+<p>RPly lets us associate one pointer <em>and</em> one integer to each
+callback.  We are free to use either or both to link some context to our
+callbacks. Our example uses the integer placeholder to tell
+<tt>vertex_cb</tt> that it has to break the line after the <tt>z</tt>
+property (notice the last argument of <tt>ply_set_read_cb</tt>).</p>
+
+<p><tt>Vertex_cb</tt> gets the user data and the property value from it's
+argument and prints accordingly.  The <tt>face_cb</tt> callback is a bit
+more complicated because lists are more complicated.  Since the
+simple file format only supports triangles, it only prints the first 
+3 list values, after which it breaks the line. </p>
+
+<p> The output of the program, as expected, is: </p>
+
+<pre class=example>
+3
+1
+-1 0 0
+0 1 0
+1 0 0
+0 1 2
+</pre>
+
+<h2> Writing files with RPly </h2>
+
+<p> The next example is somewhat more involved. We will create a program
+that converts our simple PLY file to binary mode. Besides showing how to
+write a PLY file, this example also illustrates the query functions. We
+do not know a priori which elements and properties, comments and obj_infos
+will be in the input file, so we need a way to find out. Although our simple
+program would work on any PLY file, a better version of this program is
+available from the RPly distribution. For simplicity, the simple version
+omits error messages and command line parameter processing. </p>
+
+<p> In practice, writing a file is even easier than reading one. First we
+create a file in binary mode, with a call to <tt>ply_create</tt> (notice
+the argument <tt>PLY_LITTLE_ENDIAN</tt> that gives the storage mode).  Then,
+we define the elements using <tt>ply_add_element</tt>. After each element, we
+define its properties using <tt>ply_add_scalar_property</tt> or
+<tt>ply_add_list_property</tt>. When we are done with elements and
+properties, we add comments and obj_infos. We then write the header with
+<tt>ply_write_header</tt> and send all data items. The data items are sent
+one by one, with calls to <tt>ply_write</tt>, <em>in the same order they
+are to appear in the file</em>.  Again, to simplify things, this function
+receives data as <tt>double</tt> and performs the needed conversion. Here
+is the code for the example: </p> 
+
+<pre class=example>
+#include <stdio.h> 
+#include "rply.h"
+
+static int callback(p_ply_argument argument) {
+    void *pdata;
+    /* just pass the value from the input file to the output file */
+    ply_get_argument_user_data(argument, &pdata, NULL);
+    ply_write((p_ply) pdata, ply_get_argument_value(argument));
+    return 1;
+}
+
+static int setup_callbacks(p_ply iply, p_ply oply) {
+    p_ply_element element = NULL;
+    /* iterate over all elements in input file */
+    while ((element = ply_get_next_element(iply, element))) {
+        p_ply_property property = NULL;
+        long ninstances = 0;
+        const char *element_name;
+        ply_get_element_info(element, &element_name, &ninstances);
+        /* add this element to output file */
+        if (!ply_add_element(oply, element_name, ninstances)) return 0;
+        /* iterate over all properties of current element */
+        while ((property = ply_get_next_property(element, property))) {
+            const char *property_name;
+            e_ply_type type, length_type, value_type;
+            ply_get_property_info(property, &property_name, &type, 
+                    &length_type, &value_type);
+            /* setup input callback for this property */
+            if (!ply_set_read_cb(iply, element_name, property_name, callback, 
+                    oply, 0)) return 0;
+            /* add this property to output file */
+            if (!ply_add_property(oply, property_name, type, length_type, 
+                    value_type)) return 0;
+        }
+    }
+    return 1;
+}
+
+int main(int argc, char *argv[]) {
+    const char *value;
+    p_ply iply, oply; 
+    iply = ply_open("input.ply", NULL, 0, NULL);
+    if (!iply) return 1; 
+    if (!ply_read_header(iply)) return 1; 
+    oply = ply_create("output.ply", PLY_LITTLE_ENDIAN, NULL, 0, NULL);
+    if (!oply) return 1;
+    if (!setup_callbacks(iply, oply)) return 1; 
+    /* pass comments and obj_infos from input to output */
+    value = NULL;
+    while ((value = ply_get_next_comment(iply, value)))
+        if (!ply_add_comment(oply, value)) return 1; 
+    value = NULL;
+    while ((value = ply_get_next_obj_info(iply, value)))
+        if (!ply_add_obj_info(oply, value)) return 1;;
+    /* write output header */
+    if (!ply_write_header(oply)) return 1; 
+    /* read input file generating callbacks that pass data to output file */
+    if (!ply_read(iply)) return 1; 
+    /* close up, we are done */
+    if (!ply_close(iply)) return 1; 
+    if (!ply_close(oply)) return 1;
+    return 0;
+}
+</pre>
+
+<p> RPly uses iterators to let the user loop over a PLY file header. A
+function is used to  get the first item of a given class (element, property
+etc). Passing the last returned item to the same function produces the next
+item, until there are no more items. Examples of iterator use can be seen
+in the <tt>main</tt> function, which uses them to loop over comments and
+obj_infos, and in the <tt>setup_callbacks</tt> function, which loops over
+elements and properties. </p>
+
+<p> In the <tt>setup_callbacks</tt> function, for each element in the
+input, an equivalent element is defined in the output. For each property in
+each element, an equivalent property is defined in the output. Notice that
+the same callback is specified for all properties. It is given the output
+PLY handle as the context pointer. Each time it is called, it  passes the
+received value to <tt>ply_write</tt> on the output handle. It is as simple
+as that. </p>
+
+<h2> A note on locale </h2>
+
+<p> ASCII PLY files are supposed to use the <tt>C</tt>
+locale for numeric formatting. RPly relies on library
+functions (such as <tt>fprintf</tt> and <tt>strtod</tt>)
+that are affected by the current locale. If your software
+modifies the locale (or if it uses another library/toolkit that
+does) and you use RPly under the modified locale, you may be 
+unable to read or write properly formatted ASCII PLY files.
+</p>
+
+<p> Modifying RPly internally to hedge against different
+locales would be complicated, particularly in multi-threaded
+applications.  Therefore, RPly leaves this as your
+responsibility. To protect against locale problems in the
+simplest scenario, you should bracket RPly I/O as follows: </p>
+
+<pre class="example">
+#include <locale.h>
+/* Save application locale */
+const char *old_locale = setlocale(LC_NUMERIC, NULL);
+/* Change to PLY standard */
+setlocale(LC_NUMERIC, "C");
+/* Use the RPly library */
+...
+
+/* Restore application locale when done */
+setlocale(LC_NUMERIC, old_locale);
+</pre>
+
+<h1>Reference Manual</h1>
+
+<!-- ply_open ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_open>
+p_ply <b>ply_open</b>(const char *name, p_ply_error_cb error_cb, long idata, void *pdata)
+</p>
+
+<p class=description>
+Opens a PLY file for reading, checks if it is a valid PLY file
+and returns a handle to it.
+</p>
+
+<p class=arguments>
+<tt>Name</tt> is the file name, and <tt>error_cb</tt> is a function to
+be called when an error is found. 
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a> 
+function.  
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+    (*p_ply_error_cb)(p_ply ply, const char *message)</tt>.
+</p>
+
+<!-- ply_get_ply_user_data ++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_ply_user_data>
+int <b>ply_get_ply_user_data</b>(p_ply_ply ply, void *pdata, long *idata)
+</p>
+
+<p class=description>
+Retrieves user data from the ply handle. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is the handle passed to the error callback.
+<tt>Pdata</tt> receives the user data pointer.
+<tt>Idata</tt> receives the user data integer.
+<tt>Pdata</tt> and <tt>idata</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+
+<!-- ply_read_header +++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_read_header>
+int <b>ply_read_header</b>(p_ply ply)
+</p>
+
+<p class=description>
+Reads and parses the header of a PLY file. 
+After a call to this function, the query functions 
+<a href=#ply_get_next_element><tt>ply_get_next_element</tt></a>,
+<a href=#ply_get_next_property><tt>ply_get_next_property</tt></a>,
+<a href=#ply_get_next_comment><tt>ply_get_next_comment</tt></a>, and
+<a href=#ply_get_next_obj_info><tt>ply_get_next_obj_info</tt></a> can be
+called. Callbacks can also be set with the 
+<a href=#ply_set_read_cb><tt>ply_set_read_cb</tt></a> function. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_set_read_cb +++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_set_read_cb>
+long <b>ply_set_read_cb</b>(<br>
+   p_ply ply,<br>
+   const char *element_name,<br>
+   const char *property_name,<br>
+   p_ply_read_cb read_cb,<br>
+   void *pdata,<br>
+   long idata<br>
+)
+</p>
+
+<p class=description>
+Sets up the callback to be invoked when the value of a property is read.
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>.
+<tt>Element_name</tt> and <tt>property_name</tt> are the names of the
+element and property of interest. <tt>Read_cb</tt> is the callback
+function.  <tt>Pdata</tt> and <tt>idata</tt> are user data to be passed to
+the callback function.  
+</p>
+
+<p class=return>
+Returns the number of instances of the element of interest. 
+</p>
+
+<p class=note>
+Note: <tt>Read_cb</tt> is of type 
+<tt>int (*p_ply_read_cb)(p_ply_argument argument)</tt>. 
+The callback should return 1 to continue the reading process, 
+or return 0 to abort. 
+
+<!-- ply_get_argument_element ++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_argument_element>
+int <b>ply_get_argument_element</b>(<br>
+   p_ply_argument argument,<br>
+   p_ply_element *element,<br> 
+   long *instance_index<br>
+)
+</p>
+
+<p class=description>
+Retrieves element information from the callback argument. 
+</p>
+
+<p class=arguments>
+<tt>Argument</tt> is the handle passed to the callback. 
+<tt>Element</tt> receives a handle to the element
+originating the callback. <tt>Instance_index</tt> receives
+the index of the instance of the element
+being read. <tt>Element</tt> and <tt>instance_index</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<p class=note>
+Note: further information can be obtained from <tt>element</tt> with a
+call to <a href=#ply_get_element_info>ply_get_element_info</a>.
+</p>
+
+<!-- ply_get_argument_property +++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_argument_property>
+int <b>ply_get_argument_property</b>(<br>
+   p_ply_argument argument,<br>
+   p_ply_property *property,<br>
+   long *length,<br>
+   long *value_index<br>
+)
+</p>
+
+<p class=description>
+Retrieves property information from the callback argument. 
+</p>
+
+<p class=arguments>
+<tt>Argument</tt> is the handle passed to the callback. 
+<tt>Property</tt> receives a handle to the property
+originating the callback. <tt>Length</tt> receives the number
+of values in the list property (1 for scalar properties).
+<tt>Value_index</tt> receives the index of the current property entry (0 for
+scalar properties, -1 for the first value of a list property, the one that
+gives the number of entries). <tt>Property</tt>, <tt>length</tt> and
+<tt>value_index</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<p class=note>
+Note: further information can be obtained from <tt>property</tt> with a
+call to <a href=#ply_get_property_info>ply_get_property_info</a>.
+</p>
+
+<!-- ply_get_argument_user_data +++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_argument_user_data>
+int <b>ply_get_argument_user_data</b>(p_ply_argument argument, void *pdata,
+        long *idata)
+</p>
+
+<p class=description>
+Retrieves the user data from the callback argument. 
+</p>
+
+<p class=arguments>
+<tt>Argument</tt> is the handle passed to the callback.
+<tt>Pdata</tt> receives the user data pointer.
+<tt>Idata</tt> receives the user data integer.
+<tt>Pdata</tt> and <tt>idata</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_get_argument_value +++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_argument_value>
+double <b>ply_get_argument_value</b>(p_ply_argument argument)
+</p>
+
+<p class=description>
+Retrieves the property value from the callback argument. 
+</p>
+
+<p class=arguments>
+<tt>Argument</tt> is the handle passed to the callback.
+</p>
+
+<p class=return>
+Returns the property value. 
+</p>
+
+<!-- ply_read +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_read>
+int <b>ply_read</b>(p_ply ply)
+</p>
+
+<p class=description>
+Reads all data in file, calling appropriate callbacks. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_get_next_element ++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_next_element>
+p_ply_element <b>ply_get_next_element</b>(p_ply ply, p_ply_element last)
+</p>
+
+<p class=description>
+Iterates over all elements on the header of a PLY file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
+on the handle otherwise no elements will be found.
+<tt>Last</tt> is NULL to retrieve the first element, and an element to
+retrieve the next element.
+</p>
+
+<p class=return>
+Returns the next element, or NULL if no more elements. 
+</p>
+
+<p class=note>
+Note: further information can be obtained from an element with a
+call to <a href=#ply_get_element_info>ply_get_element_info</a>.
+</p>
+
+<!-- ply_get_next_property +++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_next_property>
+p_ply_property <b>ply_get_next_property</b>(p_ply_element element, p_ply_property last)
+</p>
+
+<p class=description>
+Iterates over all properties of an element. 
+</p>
+
+<p class=arguments>
+<tt>Element</tt> is an element handle. 
+<tt>Last</tt> is NULL to retrieve the first property, and a property to
+retrieve the next property.
+</p>
+
+<p class=return>
+Returns the next property, or NULL if no more properties. 
+</p>
+
+<p class=note>
+Note: further information can be obtained from a property with a
+call to <a href=#ply_get_property_info>ply_get_property_info</a>.
+</p>
+
+<!-- ply_get_next_comment ++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_next_comment>
+const char *<b>ply_get_next_comment</b>(p_ply ply, const char *last)
+</p>
+
+<p class=description>
+Iterates over all comments on the header of a PLY file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
+on the handle otherwise no comments will be found.
+<tt>Last</tt> is NULL to retrieve the first comment, and a comment to
+retrieve the next comment.
+</p>
+
+<p class=return>
+Returns the next comment, or NULL if no more comments. 
+</p>
+
+<!-- ply_get_next_obj_info +++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_next_obj_info>
+const char *<b>ply_get_next_obj_info</b>(p_ply ply, const char *last)
+</p>
+
+<p class=description>
+Iterates over all obj_infos on the header of a PLY file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by <a href=#ply_open><tt>ply_open</tt></a>. 
+<a href=#ply_read_header><tt>Ply_read_header</tt></a> must have been called
+on the handle otherwise no obj_infos will be found.
+<tt>Last</tt> is NULL to retrieve the first obj_info, and a obj_info to
+retrieve the next obj_info.
+</p>
+
+<p class=return>
+Returns the next obj_info, or NULL if no more obj_infos. 
+</p>
+
+<!-- ply_get_element_info ++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_element_info>
+int <b>ply_get_element_info</b>(p_ply_element element, const char** name,
+        long *ninstances)
+</p>
+
+<p class=description>
+Retrieves information from an element handle. 
+</p>
+
+<p class=arguments>
+<tt>Element</tt> is the handle of the element of interest. 
+<tt>Name</tt> receives the internal copy of the element name. 
+<tt>Ninstances</tt> receives the number of instances of this element 
+in the file. Both <tt>name</tt> and <tt>ninstances</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_get_property_info +++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_get_property_info>
+int <b>ply_get_property_info</b>(<br>
+   p_ply_property property,<br>
+   const char** name,<br>
+   e_ply_type *type,<br>
+   e_ply_type *length_type,<br>
+   e_ply_type *value_type<br>
+)
+</p>
+
+<p class=description>
+Retrieves information from a property handle. 
+</p>
+
+<p class=arguments>
+<tt>Property</tt> is the handle of the property of interest. 
+<tt>Name</tt> receives the internal copy of the property name. 
+<tt>Type</tt> receives the property type. 
+<tt>Length_type</tt> receives the scalar type of the first entry 
+in a list property (the one that gives the number of entries). 
+<tt>Value_type</tt> receives the scalar type of the remaining list entries. 
+<tt>Name</tt>, <tt>type</tt>, <tt>length_type</tt>, and
+<tt>value_type</tt> can be NULL.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<p class=note> 
+Note: <tt>Length_type</tt> and <tt>value_type</tt> can
+receive any of the constants for scalar types defined in
+<tt>e_ply_type</tt>. <tt>Type</tt> can, in addition, be <tt>PLY_LIST</tt>,
+in which case the property is a list property and the fields
+<tt>length_type</tt> and <tt>value_type</tt> become meaningful.  
+</p>
+
+<!-- ply_create ++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_create>
+p_ply <b>ply_create</b>(const char *name, e_ply_storage_mode storage_mode,
+        p_ply_error_cb error_cb)
+</p>
+
+<p class=description>
+Creates a PLY file for writing. 
+</p>
+
+<p class=arguments>
+<tt>Name</tt> is the file name, <tt>storage_mode</tt> is the file storage mode
+(<tt>PLY_ASCII</tt>, <tt>PLY_LITTLE_ENDIAN</tt>,
+<tt>PLY_BIG_ENDIAN</tt>, or <tt>PLY_DEFAULT</tt> to
+automatically detect host endianess). 
+<tt>Error_cb</tt> is a function to be called when an error is found. 
+Arguments <tt>idata</tt>
+and <tt>pdata</tt> are available to the error callback via the
+<a href=#ply_get_ply_user_data><tt>ply_get_ply_user_data</tt></a> 
+function.  
+If <tt>error_cb</tt> is NULL, the default
+error callback is used. It prints a message to the standard error stream.
+</p>
+
+<p class=return>
+Returns a handle to the file or NULL on error.
+</p>
+
+<p class=note>
+Note: <tt>Error_cb</tt> is of type <tt>void
+    (*p_ply_error_cb)(const char *message)</tt>
+</p>
+
+<!-- ply_add_element +++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_element>
+int <b>ply_add_element</b>(p_ply ply, const char *name, long ninstances)
+</p>
+
+<p class=description>
+Adds a new element to the ply file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a>, <tt>name</tt> is the element
+name and <tt>ninstances</tt> is the number of instances of this element that
+will be written to the file.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_add_property ++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_property>
+int <b>ply_add_property</b>(<br>
+   p_ply ply,<br>
+   const char *name,<br>
+   e_ply_type type,<br>
+   e_ply_type length_type,<br> 
+   e_ply_type value_type<br>
+)
+</p>
+
+<p class=description>
+Adds a new property to the last element added to the ply file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>name</tt> is the 
+property name. 
+<tt>Type</tt> is the property type. 
+<tt>Length_type</tt> is the scalar type of the first entry 
+in a list property (the one that gives the number of entries). 
+<tt>Value_type</tt> is the scalar type of the remaining list entries. 
+If <tt>type</tt> is not <tt>PLY_LIST</tt>, <tt>length_type</tt> and 
+<tt>value_type</tt> are ignored.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<p class=note>
+Note: <tt>Length_type</tt> and <tt>value_type</tt> can
+be any of the constants for scalar types defined in
+<tt>e_ply_type</tt>. <tt>Type</tt> can, in addition, be <tt>PLY_LIST</tt>,
+in which case the property is a list property and the fields
+<tt>length_type</tt> and <tt>value_type</tt> become meaningful.
+</p>
+
+<!-- ply_add_list_property ++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_list_property>
+int <b>ply_add_list_property</b>(<br>
+   p_ply ply,<br>
+   const char *name,<br>
+   e_ply_type length_type,<br>
+   e_ply_type value_type<br>
+)
+</p>
+
+<p class=description>
+Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
+<tt>type</tt> is <tt>PLY_LIST</tt>. 
+</p>
+
+<!-- ply_add_scalar_property +++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_scalar_property>
+int <b>ply_add_scalar_property</b>(p_ply ply, const char *name, e_ply_type type)
+</p>
+
+<p class=description>
+Same as <a href=#ply_add_property><tt>ply_add_property</tt></a> if
+<tt>type</tt> is <em>not</em> <tt>PLY_LIST</tt>. 
+</p>
+
+<!-- ply_add_comment +++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_comment>
+int <b>ply_add_comment</b>(p_ply ply, const char *comment);
+</p>
+
+<p class=description>
+Adds a comment to a PLY file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the 
+comment text. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_add_obj_info ++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_add_obj_info>
+int <b>ply_add_obj_info</b>(p_ply ply, const char *obj_info);
+</p>
+
+<p class=description>
+Adds a obj_info to a PLY file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>obj_info</tt> is the 
+obj_info text. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_write_header ++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_write_header>
+int <b>ply_write_header</b>(p_ply ply);
+</p>
+
+<p class=description>
+Writes the PLY file header to disk, after all elements, properties,
+comments and obj_infos have been added to the handle. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>comment</tt> is the 
+comment text. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_write +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_write>
+int <b>ply_write</b>(p_ply ply, double value);
+</p>
+
+<p class=description>
+Passes a value to be stored in the PLY file. 
+Values must be passed in the order they will appear in the file. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> and <tt>value</tt> is the
+value to be stored.  For simplicity, values are always passed as 
+<tt>double</tt> and conversion is performed as needed.
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- ply_close +++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<p class=name id=ply_close>
+int <b>ply_close</b>(p_ply ply);
+</p>
+
+<p class=description>
+Closes the handle and ensures that all resources have been freed and data
+have been written. 
+</p>
+
+<p class=arguments>
+<tt>Ply</tt> is a handle returned by 
+<a href=#ply_create><tt>ply_create</tt></a> or by 
+<a href=#ply_open><tt>ply_open</tt></a>. 
+</p>
+
+<p class=return>
+Returns 1 in case of success, 0 otherwise. 
+</p>
+
+<!-- footer ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
+
+<div class=footer>
+<hr>
+<center>
+<p>
+<small>
+Last modified by Diego Nehab on <br>
+Thu Jul  4 15:25:50 BRT 2013
+</small>
+</p>
+</center>
+</div>
+
+</body>
+</html>
diff --git a/vendor/rply-1.1.3/manual/reference.css b/vendor/rply-1.1.3/manual/reference.css
new file mode 100644
index 0000000..0d39ead
--- /dev/null
+++ b/vendor/rply-1.1.3/manual/reference.css
@@ -0,0 +1,54 @@
+body { 
+    margin-left: 1em; 
+    margin-right: 1em; 
+    font-family: "Verdana", sans-serif; 
+}
+
+tt {
+    font-family: "Andale Mono", monospace; 
+}
+
+h1, h2, h3, h4 { margin-left: 0em; }
+
+
+h3 { padding-top: 1em; }
+
+p { margin-left: 1em; }
+
+p.name { 
+    font-family: "Andale Mono", monospace; 
+    padding-top: 1em;
+    margin-left: 0em; 
+}
+
+a[href] { color: #7f0000; }
+
+blockquote { margin-left: 3em; }
+
+pre.example {
+    background: #cbb;
+    padding: 1em;
+    margin-left: 1em;
+    font-family: "Andale Mono", monospace; 
+    font-size: small;
+}
+
+hr { 
+    margin-left: 0em;
+	background: #7f0000; 
+	border: 0px;
+	height: 1px;
+}
+
+ul { list-style-type: disc; }
+
+table.index { border: 1px #7f0000; }
+table.index td { text-align: left; vertical-align: top; }
+table.index ul { padding-top: 0em; margin-top: 0em; }
+
+h1:first-letter, 
+h2:first-letter, 
+h2:first-letter, 
+h3:first-letter { color: #7f0000; }
+
+div.header, div.footer { margin-left: 0em; }
diff --git a/vendor/rply-1.1.3/manual/rply.png b/vendor/rply-1.1.3/manual/rply.png
new file mode 100644
index 0000000..e27e44f
Binary files /dev/null and b/vendor/rply-1.1.3/manual/rply.png differ
diff --git a/vendor/rply-1.1.3/rply.c b/vendor/rply-1.1.3/rply.c
new file mode 100644
index 0000000..6cbb82a
--- /dev/null
+++ b/vendor/rply-1.1.3/rply.c
@@ -0,0 +1,1593 @@
+/* ----------------------------------------------------------------------
+ * RPly library, read/write PLY files
+ * Diego Nehab, IMPA
+ * http://www.impa.br/~diego/software/rply
+ *
+ * This library is distributed under the MIT License. See notice
+ * at the end of this file.
+ * ---------------------------------------------------------------------- */
+#include <stdio.h>
+#include <ctype.h>
+#include <assert.h>
+#include <string.h>
+#include <limits.h>
+#include <float.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include "rply.h"
+
+/* ----------------------------------------------------------------------
+ * Make sure we get our integer types right
+ * ---------------------------------------------------------------------- */
+#if defined(_MSC_VER) && (_MSC_VER < 1600)
+/* C99 stdint.h only supported in MSVC++ 10.0 and up */
+typedef __int8 t_ply_int8;
+typedef __int16 t_ply_int16;
+typedef __int32 t_ply_int32;
+typedef unsigned __int8 t_ply_uint8;
+typedef unsigned __int16 t_ply_uint16;
+typedef unsigned __int32 t_ply_uint32;
+#define PLY_INT8_MAX (127)
+#define PLY_INT8_MIN (-PLY_INT8_MAX-1)
+#define PLY_INT16_MAX (32767)
+#define PLY_INT16_MIN (-PLY_INT16_MAX-1)
+#define PLY_INT32_MAX (2147483647)
+#define PLY_INT32_MIN (-PLY_INT32_MAX-1)
+#define PLY_UINT8_MAX (255)
+#define PLY_UINT16_MAX (65535)
+#define PLY_UINT32_MAX  (4294967295)
+#else
+#include <stdint.h>
+typedef int8_t t_ply_int8;
+typedef int16_t t_ply_int16;
+typedef int32_t t_ply_int32;
+typedef uint8_t t_ply_uint8;
+typedef uint16_t t_ply_uint16;
+typedef uint32_t t_ply_uint32;
+#define PLY_INT8_MIN INT8_MIN
+#define PLY_INT8_MAX INT8_MAX
+#define PLY_INT16_MIN INT16_MIN
+#define PLY_INT16_MAX INT16_MAX
+#define PLY_INT32_MIN INT32_MIN
+#define PLY_INT32_MAX INT32_MAX
+#define PLY_UINT8_MAX UINT8_MAX
+#define PLY_UINT16_MAX UINT16_MAX
+#define PLY_UINT32_MAX UINT32_MAX
+#endif
+
+/* ----------------------------------------------------------------------
+ * Constants 
+ * ---------------------------------------------------------------------- */
+#define WORDSIZE 256
+#define LINESIZE 1024
+#define BUFFERSIZE (8*1024)
+
+typedef enum e_ply_io_mode_ {
+    PLY_READ, 
+    PLY_WRITE
+} e_ply_io_mode;
+
+static const char *const ply_storage_mode_list[] = {
+    "binary_big_endian", "binary_little_endian", "ascii", NULL
+};     /* order matches e_ply_storage_mode enum */
+
+static const char *const ply_type_list[] = {
+    "int8", "uint8", "int16", "uint16", 
+    "int32", "uint32", "float32", "float64",
+    "char", "uchar", "short", "ushort", 
+    "int", "uint", "float", "double",
+    "list", NULL
+};     /* order matches e_ply_type enum */
+
+/* ----------------------------------------------------------------------
+ * Property reading callback argument
+ *
+ * element: name of element being processed
+ * property: name of property being processed
+ * nelements: number of elements of this kind in file
+ * instance_index: index current element of this kind being processed
+ * length: number of values in current list (or 1 for scalars)
+ * value_index: index of current value int this list (or 0 for scalars)
+ * value: value of property
+ * pdata/idata: user data defined with ply_set_cb
+ *
+ * Returns handle to PLY file if succesful, NULL otherwise.
+ * ---------------------------------------------------------------------- */
+typedef struct t_ply_argument_ {
+    p_ply_element element;
+    long instance_index;
+    p_ply_property property;
+    long length, value_index;
+    double value;
+    void *pdata;
+    long idata;
+} t_ply_argument;
+
+/* ----------------------------------------------------------------------
+ * Property information
+ *
+ * name: name of this property
+ * type: type of this property (list or type of scalar value)
+ * length_type, value_type: type of list property count and values
+ * read_cb: function to be called when this property is called
+ *
+ * Returns 1 if should continue processing file, 0 if should abort.
+ * ---------------------------------------------------------------------- */
+typedef struct t_ply_property_ {
+    char name[WORDSIZE];
+    e_ply_type type, value_type, length_type;
+    p_ply_read_cb read_cb;
+    void *pdata;
+    long idata;
+} t_ply_property; 
+
+/* ----------------------------------------------------------------------
+ * Element information
+ *
+ * name: name of this property
+ * ninstances: number of elements of this type in file
+ * property: property descriptions for this element
+ * nproperty: number of properties in this element
+ *
+ * Returns 1 if should continue processing file, 0 if should abort.
+ * ---------------------------------------------------------------------- */
+typedef struct t_ply_element_ {
+    char name[WORDSIZE];
+    long ninstances;
+    p_ply_property property;
+    long nproperties;
+} t_ply_element;
+
+/* ----------------------------------------------------------------------
+ * Input/output driver
+ *
+ * Depending on file mode, different functions are used to read/write 
+ * property fields. The drivers make it transparent to read/write in ascii, 
+ * big endian or little endian cases.
+ * ---------------------------------------------------------------------- */
+typedef int (*p_ply_ihandler)(p_ply ply, double *value);
+typedef int (*p_ply_ichunk)(p_ply ply, void *anydata, size_t size);
+typedef struct t_ply_idriver_ {
+    p_ply_ihandler ihandler[16];
+    p_ply_ichunk ichunk;
+    const char *name;
+} t_ply_idriver;
+typedef t_ply_idriver *p_ply_idriver;
+
+typedef int (*p_ply_ohandler)(p_ply ply, double value);
+typedef int (*p_ply_ochunk)(p_ply ply, void *anydata, size_t size);
+typedef struct t_ply_odriver_ {
+    p_ply_ohandler ohandler[16];
+    p_ply_ochunk ochunk;
+    const char *name;
+} t_ply_odriver;
+typedef t_ply_odriver *p_ply_odriver;
+
+/* ----------------------------------------------------------------------
+ * Ply file handle. 
+ *
+ * io_mode: read or write (from e_ply_io_mode)
+ * storage_mode: mode of file associated with handle (from e_ply_storage_mode)
+ * element: elements description for this file
+ * nelement: number of different elements in file
+ * comment: comments for this file
+ * ncomments: number of comments in file
+ * obj_info: obj_info items for this file
+ * nobj_infos: number of obj_info items in file
+ * fp: file pointer associated with ply file
+ * rn: skip extra char after end_header? 
+ * buffer: last word/chunck of data read from ply file
+ * buffer_first, buffer_last: interval of untouched good data in buffer
+ * buffer_token: start of parsed token (line or word) in buffer
+ * idriver, odriver: input driver used to get property fields from file 
+ * argument: storage space for callback arguments
+ * welement, wproperty: element/property type being written
+ * winstance_index: index of instance of current element being written
+ * wvalue_index: index of list property value being written 
+ * wlength: number of values in list property being written
+ * error_cb: error callback
+ * pdata/idata: user data defined with ply_open/ply_create
+ * ---------------------------------------------------------------------- */
+typedef struct t_ply_ {
+    e_ply_io_mode io_mode;
+    e_ply_storage_mode storage_mode;
+    p_ply_element element;
+    long nelements;
+    char *comment;
+    long ncomments;
+    char *obj_info;
+    long nobj_infos;
+    FILE *fp;
+    int rn;
+    char buffer[BUFFERSIZE];
+    size_t buffer_first, buffer_token, buffer_last;
+    p_ply_idriver idriver;
+    p_ply_odriver odriver;
+    t_ply_argument argument;
+    long welement, wproperty;
+    long winstance_index, wvalue_index, wlength;
+    p_ply_error_cb error_cb;
+    void *pdata;
+    long idata;
+} t_ply;
+
+/* ----------------------------------------------------------------------
+ * I/O functions and drivers
+ * ---------------------------------------------------------------------- */
+static t_ply_idriver ply_idriver_ascii;
+static t_ply_idriver ply_idriver_binary;
+static t_ply_idriver ply_idriver_binary_reverse;
+static t_ply_odriver ply_odriver_ascii;
+static t_ply_odriver ply_odriver_binary;
+static t_ply_odriver ply_odriver_binary_reverse;
+
+static int ply_read_word(p_ply ply);
+static int ply_check_word(p_ply ply);
+static void ply_finish_word(p_ply ply, size_t size);
+static int ply_read_line(p_ply ply);
+static int ply_check_line(p_ply ply);
+static int ply_read_chunk(p_ply ply, void *anybuffer, size_t size);
+static int ply_read_chunk_reverse(p_ply ply, void *anybuffer, size_t size);
+static int ply_write_chunk(p_ply ply, void *anybuffer, size_t size);
+static int ply_write_chunk_reverse(p_ply ply, void *anybuffer, size_t size);
+static void ply_reverse(void *anydata, size_t size);
+
+/* ----------------------------------------------------------------------
+ * String functions
+ * ---------------------------------------------------------------------- */
+static int ply_find_string(const char *item, const char* const list[]);
+static p_ply_element ply_find_element(p_ply ply, const char *name);
+static p_ply_property ply_find_property(p_ply_element element, 
+        const char *name);
+
+/* ----------------------------------------------------------------------
+ * Header parsing
+ * ---------------------------------------------------------------------- */
+static int ply_read_header_magic(p_ply ply); 
+static int ply_read_header_format(p_ply ply);
+static int ply_read_header_comment(p_ply ply);
+static int ply_read_header_obj_info(p_ply ply);
+static int ply_read_header_property(p_ply ply);
+static int ply_read_header_element(p_ply ply);
+
+/* ----------------------------------------------------------------------
+ * Error handling
+ * ---------------------------------------------------------------------- */
+static void ply_error_cb(p_ply ply, const char *message);
+static void ply_ferror(p_ply ply, const char *fmt, ...);
+
+/* ----------------------------------------------------------------------
+ * Memory allocation and initialization
+ * ---------------------------------------------------------------------- */
+static void ply_init(p_ply ply);
+static void ply_element_init(p_ply_element element);
+static void ply_property_init(p_ply_property property);
+static p_ply ply_alloc(void);
+static p_ply_element ply_grow_element(p_ply ply);
+static p_ply_property ply_grow_property(p_ply ply, p_ply_element element);
+static void *ply_grow_array(p_ply ply, void **pointer, long *nmemb, long size);
+
+/* ----------------------------------------------------------------------
+ * Special functions
+ * ---------------------------------------------------------------------- */
+static e_ply_storage_mode ply_arch_endian(void);
+static int ply_type_check(void); 
+
+/* ----------------------------------------------------------------------
+ * Auxiliary read functions
+ * ---------------------------------------------------------------------- */
+static int ply_read_element(p_ply ply, p_ply_element element, 
+        p_ply_argument argument);
+static int ply_read_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument);
+static int ply_read_list_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument);
+static int ply_read_scalar_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument);
+
+/* ----------------------------------------------------------------------
+ * Buffer support functions
+ * ---------------------------------------------------------------------- */
+/* pointers to tokenized word and line in buffer */
+#define BWORD(p) (p->buffer + p->buffer_token)
+#define BLINE(p) (p->buffer + p->buffer_token)
+
+/* pointer to start of untouched bytes in buffer */
+#define BFIRST(p) (p->buffer + p->buffer_first) 
+
+/* number of bytes untouched in buffer */
+#define BSIZE(p) (p->buffer_last - p->buffer_first) 
+
+/* consumes data from buffer */
+#define BSKIP(p, s) (p->buffer_first += s)
+
+/* refills the buffer */
+static int BREFILL(p_ply ply) {
+    /* move untouched data to beginning of buffer */
+    size_t size = BSIZE(ply);
+    memmove(ply->buffer, BFIRST(ply), size);
+    ply->buffer_last = size;
+    ply->buffer_first = ply->buffer_token = 0;
+    /* fill remaining with new data */
+    size = fread(ply->buffer+size, 1, BUFFERSIZE-size-1, ply->fp);
+    /* place sentinel so we can use str* functions with buffer */
+    ply->buffer[BUFFERSIZE-1] = '\0';
+    /* check if read failed */
+    if (size <= 0) return 0;
+    /* increase size to account for new data */
+    ply->buffer_last += size;
+    return 1;
+}
+
+/* We don't care about end-of-line, generally, because we
+ * separate words by any white-space character.
+ * Unfortunately, in binary mode, right after 'end_header', 
+ * we have to know *exactly* how many characters to skip */
+/* We use the end-of-line marker after the 'ply' magic
+ * number to figure out what to do */
+static int ply_read_header_magic(p_ply ply) {
+    char *magic = ply->buffer;
+    if (!BREFILL(ply)) {
+        ply->error_cb(ply, "Unable to read magic number from file");
+        return 0;
+    }
+    /* check if it is ply */
+    if (magic[0] != 'p' || magic[1] != 'l' || magic[2] != 'y' 
+            || !isspace(magic[3])) {
+        ply->error_cb(ply, "Wrong magic number. Expected 'ply'");
+        return 0;
+    }
+    /* figure out if we have to skip the extra character
+     * after header when we reach the binary part of file */
+    ply->rn = magic[3] == '\r' && magic[4] == '\n';
+    BSKIP(ply, 3);
+    return 1;
+}
+
+/* ----------------------------------------------------------------------
+ * Exported functions
+ * ---------------------------------------------------------------------- */
+/* ----------------------------------------------------------------------
+ * Read support functions
+ * ---------------------------------------------------------------------- */
+p_ply ply_open(const char *name, p_ply_error_cb error_cb, 
+        long idata, void *pdata) {
+    FILE *fp = NULL; 
+    p_ply ply = ply_alloc();
+    if (error_cb == NULL) error_cb = ply_error_cb;
+    if (!ply) {
+        error_cb(NULL, "Out of memory");
+        return NULL;
+    }
+    ply->idata = idata;
+    ply->pdata = pdata;
+    ply->io_mode = PLY_READ;
+    ply->error_cb = error_cb;
+    if (!ply_type_check()) {
+        error_cb(ply, "Incompatible type system");
+        free(ply);
+        return NULL;
+    }
+    assert(name);
+    fp = fopen(name, "rb");
+    if (!fp) {
+        error_cb(ply, "Unable to open file");
+        free(ply);
+        return NULL;
+    }
+    ply->fp = fp;
+    return ply;
+}
+
+int ply_read_header(p_ply ply) {
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    if (!ply_read_header_magic(ply)) return 0;
+    if (!ply_read_word(ply)) return 0;
+    /* parse file format */
+    if (!ply_read_header_format(ply)) {
+        ply_ferror(ply, "Invalid file format");
+        return 0;
+    }
+    /* parse elements, comments or obj_infos until the end of header */
+    while (strcmp(BWORD(ply), "end_header")) {
+        if (!ply_read_header_comment(ply) && 
+                !ply_read_header_element(ply) && 
+                !ply_read_header_obj_info(ply)) {
+            ply_ferror(ply, "Unexpected token '%s'", BWORD(ply));
+            return 0;
+        }
+    }
+    /* skip extra character? */
+    if (ply->rn) {
+        if (BSIZE(ply) < 1 && !BREFILL(ply)) {
+            ply_ferror(ply, "Unexpected end of file");
+            return 0;
+        }
+        BSKIP(ply, 1);
+    }
+    return 1;
+}
+
+long ply_set_read_cb(p_ply ply, const char *element_name, 
+        const char* property_name, p_ply_read_cb read_cb, 
+        void *pdata, long idata) {
+    p_ply_element element = NULL; 
+    p_ply_property property = NULL;
+    assert(ply && element_name && property_name);
+    element = ply_find_element(ply, element_name);
+    if (!element) return 0;
+    property = ply_find_property(element, property_name);
+    if (!property) return 0;
+    property->read_cb = read_cb;
+    property->pdata = pdata;
+    property->idata = idata;
+    return (int) element->ninstances;
+}
+
+int ply_read(p_ply ply) {
+    long i;
+    p_ply_argument argument;
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    argument = &ply->argument;
+    /* for each element type */
+    for (i = 0; i < ply->nelements; i++) {
+        p_ply_element element = &ply->element[i];
+        argument->element = element;
+        if (!ply_read_element(ply, element, argument))
+            return 0;
+    }
+    return 1;
+}
+
+/* ----------------------------------------------------------------------
+ * Write support functions
+ * ---------------------------------------------------------------------- */
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode, 
+        p_ply_error_cb error_cb, long idata, void *pdata) {
+    FILE *fp = NULL;
+    p_ply ply = ply_alloc();
+    if (error_cb == NULL) error_cb = ply_error_cb;
+    if (!ply) {
+        error_cb(NULL, "Out of memory");
+        return NULL;
+    }
+    if (!ply_type_check()) {
+        error_cb(ply, "Incompatible type system");
+        free(ply);
+        return NULL;
+    }
+    assert(name && storage_mode <= PLY_DEFAULT);
+    fp = fopen(name, "wb");
+    if (!fp) {
+        error_cb(ply, "Unable to create file");
+        free(ply);
+        return NULL;
+    }
+    ply->idata = idata;
+    ply->pdata = pdata;
+    ply->io_mode = PLY_WRITE;
+    if (storage_mode == PLY_DEFAULT) storage_mode = ply_arch_endian();
+    if (storage_mode == PLY_ASCII) ply->odriver = &ply_odriver_ascii;
+    else if (storage_mode == ply_arch_endian()) 
+        ply->odriver = &ply_odriver_binary;
+    else ply->odriver = &ply_odriver_binary_reverse;
+    ply->storage_mode = storage_mode;
+    ply->fp = fp;
+    ply->error_cb = error_cb;
+    return ply;
+}
+
+int ply_add_element(p_ply ply, const char *name, long ninstances) {
+    p_ply_element element = NULL;
+    assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
+    assert(name && strlen(name) < WORDSIZE && ninstances >= 0);
+    if (strlen(name) >= WORDSIZE || ninstances < 0) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    element = ply_grow_element(ply);
+    if (!element) return 0;
+    strcpy(element->name, name);
+    element->ninstances = ninstances;
+    return 1;
+}
+
+int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type) {
+    p_ply_element element = NULL;
+    p_ply_property property = NULL;
+    assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
+    assert(name && strlen(name) < WORDSIZE);
+    assert(type < PLY_LIST);
+    if (strlen(name) >= WORDSIZE || type >= PLY_LIST) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    element = &ply->element[ply->nelements-1];
+    property = ply_grow_property(ply, element);
+    if (!property) return 0;
+    strcpy(property->name, name);
+    property->type = type;
+    return 1;
+}
+
+int ply_add_list_property(p_ply ply, const char *name, 
+        e_ply_type length_type, e_ply_type value_type) {
+    p_ply_element element = NULL;
+    p_ply_property property = NULL;
+    assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
+    assert(name && strlen(name) < WORDSIZE);
+    if (strlen(name) >= WORDSIZE) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    assert(length_type < PLY_LIST);
+    assert(value_type < PLY_LIST);
+    if (length_type >= PLY_LIST || value_type >= PLY_LIST) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    element = &ply->element[ply->nelements-1];
+    property = ply_grow_property(ply, element);
+    if (!property) return 0;
+    strcpy(property->name, name);
+    property->type = PLY_LIST;
+    property->length_type = length_type;
+    property->value_type = value_type;
+    return 1;
+}
+
+int ply_add_property(p_ply ply, const char *name, e_ply_type type,
+        e_ply_type length_type, e_ply_type value_type) {
+    if (type == PLY_LIST) 
+        return ply_add_list_property(ply, name, length_type, value_type);
+    else 
+        return ply_add_scalar_property(ply, name, type);
+}
+
+int ply_add_comment(p_ply ply, const char *comment) {
+    char *new_comment = NULL;
+    assert(ply && comment && strlen(comment) < LINESIZE);
+    if (!comment || strlen(comment) >= LINESIZE) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    new_comment = (char *) ply_grow_array(ply, (void **) &ply->comment,
+            &ply->ncomments, LINESIZE);
+    if (!new_comment) return 0;
+    strcpy(new_comment, comment);
+    return 1;
+}
+
+int ply_add_obj_info(p_ply ply, const char *obj_info) {
+    char *new_obj_info = NULL;
+    assert(ply && obj_info && strlen(obj_info) < LINESIZE);
+    if (!obj_info || strlen(obj_info) >= LINESIZE) {
+        ply_ferror(ply, "Invalid arguments");
+        return 0;
+    }
+    new_obj_info = (char *) ply_grow_array(ply, (void **) &ply->obj_info,
+            &ply->nobj_infos, LINESIZE);
+    if (!new_obj_info) return 0;
+    strcpy(new_obj_info, obj_info);
+    return 1;
+}
+
+int ply_write_header(p_ply ply) {
+    long i, j;
+    assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
+    assert(ply->element || ply->nelements == 0); 
+    assert(!ply->element || ply->nelements > 0); 
+    if (fprintf(ply->fp, "ply\nformat %s 1.0\n", 
+                ply_storage_mode_list[ply->storage_mode]) <= 0) goto error;
+    for (i = 0; i < ply->ncomments; i++)
+        if (fprintf(ply->fp, "comment %s\n", ply->comment + LINESIZE*i) <= 0)
+            goto error;
+    for (i = 0; i < ply->nobj_infos; i++)
+        if (fprintf(ply->fp, "obj_info %s\n", ply->obj_info + LINESIZE*i) <= 0)
+            goto error;
+    for (i = 0; i < ply->nelements; i++) {
+        p_ply_element element = &ply->element[i];
+        assert(element->property || element->nproperties == 0); 
+        assert(!element->property || element->nproperties > 0); 
+        if (fprintf(ply->fp, "element %s %ld\n", element->name, 
+                    element->ninstances) <= 0) goto error;
+        for (j = 0; j < element->nproperties; j++) {
+            p_ply_property property = &element->property[j];
+            if (property->type == PLY_LIST) {
+                if (fprintf(ply->fp, "property list %s %s %s\n", 
+                            ply_type_list[property->length_type],
+                            ply_type_list[property->value_type],
+                            property->name) <= 0) goto error;
+            } else {
+                if (fprintf(ply->fp, "property %s %s\n", 
+                            ply_type_list[property->type],
+                            property->name) <= 0) goto error;
+            }
+        }
+    }
+    return fprintf(ply->fp, "end_header\n") > 0;
+error:
+    ply_ferror(ply, "Error writing to file");
+    return 0;
+}
+
+int ply_write(p_ply ply, double value) {
+    p_ply_element element = NULL;
+    p_ply_property property = NULL;
+    int type = -1;
+    int breakafter = 0;
+    int spaceafter = 1;
+    if (ply->welement > ply->nelements) return 0;
+    element = &ply->element[ply->welement];
+    if (ply->wproperty > element->nproperties) return 0;
+    property = &element->property[ply->wproperty];
+    if (property->type == PLY_LIST) {
+        if (ply->wvalue_index == 0) {
+            type = property->length_type;
+            ply->wlength = (long) value;
+        } else type = property->value_type;
+    } else {
+        type = property->type;
+        ply->wlength = 0;
+    }
+    if (!ply->odriver->ohandler[type](ply, value)) {
+        ply_ferror(ply, "Failed writing %s of %s %d (%s: %s)", 
+                    property->name, element->name, 
+                    ply->winstance_index, 
+                    ply->odriver->name, ply_type_list[type]);
+        return 0;
+    }
+    ply->wvalue_index++;
+    if (ply->wvalue_index > ply->wlength) {
+        ply->wvalue_index = 0;
+        ply->wproperty++;
+    }
+    if (ply->wproperty >= element->nproperties) {
+        ply->wproperty = 0;
+        ply->winstance_index++;
+        breakafter = 1;
+        spaceafter = 0;
+    }
+    if (ply->winstance_index >= element->ninstances) {
+        ply->winstance_index = 0;
+        do {
+            ply->welement++;
+            element = &ply->element[ply->welement];
+        } while (ply->welement < ply->nelements && !element->ninstances);
+    }
+    if (ply->storage_mode == PLY_ASCII) {
+        return (!spaceafter || putc(' ', ply->fp) > 0) && 
+               (!breakafter || putc('\n', ply->fp) > 0);
+    } else { 
+        return 1;
+    }
+}
+
+int ply_close(p_ply ply) {
+    long i;
+    assert(ply && ply->fp);
+    assert(ply->element || ply->nelements == 0);
+    assert(!ply->element || ply->nelements > 0);
+    /* write last chunk to file */
+    if (ply->io_mode == PLY_WRITE && 
+      fwrite(ply->buffer, 1, ply->buffer_last, ply->fp) < ply->buffer_last) {
+        ply_ferror(ply, "Error closing up");
+        return 0;
+    }
+    fclose(ply->fp);
+    /* free all memory used by handle */
+    if (ply->element) {
+        for (i = 0; i < ply->nelements; i++) {
+            p_ply_element element = &ply->element[i];
+            if (element->property) free(element->property);
+        }
+        free(ply->element);
+    }
+    if (ply->obj_info) free(ply->obj_info);
+    if (ply->comment) free(ply->comment);
+    free(ply);
+    return 1;
+}
+
+/* ----------------------------------------------------------------------
+ * Query support functions
+ * ---------------------------------------------------------------------- */
+p_ply_element ply_get_next_element(p_ply ply, 
+        p_ply_element last) {
+    assert(ply);
+    if (!last) return ply->element;
+    last++;
+    if (last < ply->element + ply->nelements) return last;
+    else return NULL;
+}
+
+int ply_get_element_info(p_ply_element element, const char** name,
+        long *ninstances) {
+    assert(element);
+    if (name) *name = element->name;
+    if (ninstances) *ninstances = (long) element->ninstances;
+    return 1;
+}
+
+p_ply_property ply_get_next_property(p_ply_element element, 
+        p_ply_property last) {
+    assert(element);
+    if (!last) return element->property;
+    last++;
+    if (last < element->property + element->nproperties) return last;
+    else return NULL;
+}
+
+int ply_get_property_info(p_ply_property property, const char** name,
+        e_ply_type *type, e_ply_type *length_type, e_ply_type *value_type) {
+    assert(property);
+    if (name) *name = property->name;
+    if (type) *type = property->type;
+    if (length_type) *length_type = property->length_type;
+    if (value_type) *value_type = property->value_type;
+    return 1;
+
+}
+
+const char *ply_get_next_comment(p_ply ply, const char *last) {
+    assert(ply);
+    if (!last) return ply->comment; 
+    last += LINESIZE;
+    if (last < ply->comment + LINESIZE*ply->ncomments) return last;
+    else return NULL;
+}
+
+const char *ply_get_next_obj_info(p_ply ply, const char *last) {
+    assert(ply);
+    if (!last) return ply->obj_info; 
+    last += LINESIZE;
+    if (last < ply->obj_info + LINESIZE*ply->nobj_infos) return last;
+    else return NULL;
+}
+
+/* ----------------------------------------------------------------------
+ * Callback argument support functions 
+ * ---------------------------------------------------------------------- */
+int ply_get_argument_element(p_ply_argument argument, 
+        p_ply_element *element, long *instance_index) {
+    assert(argument);
+    if (!argument) return 0;
+    if (element) *element = argument->element;
+    if (instance_index) *instance_index = argument->instance_index;
+    return 1;
+}
+
+int ply_get_argument_property(p_ply_argument argument, 
+        p_ply_property *property, long *length, long *value_index) {
+    assert(argument);
+    if (!argument) return 0;
+    if (property) *property = argument->property;
+    if (length) *length = argument->length;
+    if (value_index) *value_index = argument->value_index;
+    return 1;
+}
+
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata, 
+        long *idata) {
+    assert(argument);
+    if (!argument) return 0;
+    if (pdata) *pdata = argument->pdata;
+    if (idata) *idata = argument->idata;
+    return 1;
+}
+
+double ply_get_argument_value(p_ply_argument argument) {
+    assert(argument);
+    if (!argument) return 0.0;
+    return argument->value;
+}
+
+int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata) {
+    assert(ply);
+    if (!ply) return 0;
+    if (pdata) *pdata = ply->pdata;
+    if (idata) *idata = ply->idata;
+    return 1;
+}
+
+/* ----------------------------------------------------------------------
+ * Internal functions
+ * ---------------------------------------------------------------------- */
+static int ply_read_list_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument) {
+    int l;
+    p_ply_read_cb read_cb = property->read_cb;
+    p_ply_ihandler *driver = ply->idriver->ihandler; 
+    /* get list length */
+    p_ply_ihandler handler = driver[property->length_type];
+    double length;
+    if (!handler(ply, &length)) {
+        ply_ferror(ply, "Error reading '%s' of '%s' number %d",
+                property->name, element->name, argument->instance_index);
+        return 0;
+    }
+    /* invoke callback to pass length in value field */
+    argument->length = (long) length;
+    argument->value_index = -1;
+    argument->value = length;
+    if (read_cb && !read_cb(argument)) {
+        ply_ferror(ply, "Aborted by user");
+        return 0;
+    }
+    /* read list values */
+    handler = driver[property->value_type];
+    /* for each value in list */
+    for (l = 0; l < (long) length; l++) {
+        /* read value from file */
+        argument->value_index = l;
+        if (!handler(ply, &argument->value)) {
+            ply_ferror(ply, "Error reading value number %d of '%s' of "
+                    "'%s' number %d", l+1, property->name, 
+                    element->name, argument->instance_index);
+            return 0;
+        }
+        /* invoke callback to pass value */
+        if (read_cb && !read_cb(argument)) {
+            ply_ferror(ply, "Aborted by user");
+            return 0;
+        }
+    }
+    return 1;
+}
+
+static int ply_read_scalar_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument) {
+    p_ply_read_cb read_cb = property->read_cb;
+    p_ply_ihandler *driver = ply->idriver->ihandler; 
+    p_ply_ihandler handler = driver[property->type];
+    argument->length = 1;
+    argument->value_index = 0;
+    if (!handler(ply, &argument->value)) {
+        ply_ferror(ply, "Error reading '%s' of '%s' number %d",
+                property->name, element->name, argument->instance_index);
+        return 0;
+    }
+    if (read_cb && !read_cb(argument)) {
+        ply_ferror(ply, "Aborted by user");
+        return 0;
+    }
+    return 1;
+}
+
+static int ply_read_property(p_ply ply, p_ply_element element, 
+        p_ply_property property, p_ply_argument argument) {
+    if (property->type == PLY_LIST) 
+        return ply_read_list_property(ply, element, property, argument);
+    else 
+        return ply_read_scalar_property(ply, element, property, argument);
+}
+
+static int ply_read_element(p_ply ply, p_ply_element element, 
+        p_ply_argument argument) {
+    long j, k;
+    /* for each element of this type */
+    for (j = 0; j < element->ninstances; j++) {
+        argument->instance_index = j;
+        /* for each property */
+        for (k = 0; k < element->nproperties; k++) {
+            p_ply_property property = &element->property[k];
+            argument->property = property;
+            argument->pdata = property->pdata;
+            argument->idata = property->idata;
+            if (!ply_read_property(ply, element, property, argument))
+                return 0;
+        }
+    }
+    return 1;
+}
+
+static int ply_find_string(const char *item, const char* const list[]) {
+    int i;
+    assert(item && list);
+    for (i = 0; list[i]; i++) 
+        if (!strcmp(list[i], item)) return i;
+    return -1;
+}
+
+static p_ply_element ply_find_element(p_ply ply, const char *name) {
+    p_ply_element element;
+    int i, nelements;
+    assert(ply && name); 
+    element = ply->element;
+    nelements = ply->nelements;
+    assert(element || nelements == 0); 
+    assert(!element || nelements > 0); 
+    for (i = 0; i < nelements; i++) 
+        if (!strcmp(element[i].name, name)) return &element[i];
+    return NULL;
+}
+
+static p_ply_property ply_find_property(p_ply_element element, 
+        const char *name) {
+    p_ply_property property;
+    int i, nproperties;
+    assert(element && name); 
+    property = element->property;
+    nproperties = element->nproperties;
+    assert(property || nproperties == 0); 
+    assert(!property || nproperties > 0); 
+    for (i = 0; i < nproperties; i++) 
+        if (!strcmp(property[i].name, name)) return &property[i];
+    return NULL;
+}
+
+static int ply_check_word(p_ply ply) {
+    size_t size = strlen(BWORD(ply));
+    if (size >= WORDSIZE) {
+        ply_ferror(ply, "Word too long");
+        return 0;
+    } else if (size == 0) {
+        ply_ferror(ply, "Unexpected end of file");
+        return 0;
+    }
+    return 1;
+}
+
+static int ply_read_word(p_ply ply) {
+    size_t t = 0;
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    /* skip leading blanks */
+    while (1) {
+        t = strspn(BFIRST(ply), " \n\r\t");
+        /* check if all buffer was made of blanks */
+        if (t >= BSIZE(ply)) {
+            if (!BREFILL(ply)) {
+                ply_ferror(ply, "Unexpected end of file");
+                return 0;
+            }
+        } else break; 
+    } 
+    BSKIP(ply, t); 
+    /* look for a space after the current word */
+    t = strcspn(BFIRST(ply), " \n\r\t");
+    /* if we didn't reach the end of the buffer, we are done */
+    if (t < BSIZE(ply)) {
+        ply_finish_word(ply, t);
+        return ply_check_word(ply);
+    }
+    /* otherwise, try to refill buffer */
+    if (!BREFILL(ply)) {
+        /* if we reached the end of file, try to do with what we have */
+        ply_finish_word(ply, t);
+        return ply_check_word(ply);
+        /* ply_ferror(ply, "Unexpected end of file"); */
+        /* return 0; */
+    }
+    /* keep looking from where we left */
+    t += strcspn(BFIRST(ply) + t, " \n\r\t");
+    /* check if the token is too large for our buffer */
+    if (t >= BSIZE(ply)) {
+        ply_ferror(ply, "Token too large");
+        return 0;
+    }
+    /* we are done */
+    ply_finish_word(ply, t);
+    return ply_check_word(ply);
+}
+
+static void ply_finish_word(p_ply ply, size_t size) {
+    ply->buffer_token = ply->buffer_first;
+    BSKIP(ply, size);
+    *BFIRST(ply) = '\0';
+    BSKIP(ply, 1);
+}
+
+static int ply_check_line(p_ply ply) {
+    if (strlen(BLINE(ply)) >= LINESIZE) {
+        ply_ferror(ply, "Line too long");
+        return 0;
+    }
+    return 1;
+}
+
+static int ply_read_line(p_ply ply) {
+    const char *end = NULL;
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    /* look for a end of line */
+    end = strchr(BFIRST(ply), '\n');
+    /* if we didn't reach the end of the buffer, we are done */
+    if (end) {
+        ply->buffer_token = ply->buffer_first;
+        BSKIP(ply, end - BFIRST(ply));
+        *BFIRST(ply) = '\0';
+        BSKIP(ply, 1);
+        return ply_check_line(ply);
+    } else {
+        end = ply->buffer + BSIZE(ply); 
+        /* otherwise, try to refill buffer */
+        if (!BREFILL(ply)) {
+            ply_ferror(ply, "Unexpected end of file");
+            return 0;
+        }
+    }
+    /* keep looking from where we left */
+    end = strchr(end, '\n');
+    /* check if the token is too large for our buffer */
+    if (!end) {
+        ply_ferror(ply, "Token too large");
+        return 0;
+    }
+    /* we are done */
+    ply->buffer_token = ply->buffer_first;
+    BSKIP(ply, end - BFIRST(ply));
+    *BFIRST(ply) = '\0';
+    BSKIP(ply, 1);
+    return ply_check_line(ply);
+}
+
+static int ply_read_chunk(p_ply ply, void *anybuffer, size_t size) {
+    char *buffer = (char *) anybuffer;
+    size_t i = 0;
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    assert(ply->buffer_first <= ply->buffer_last);
+    while (i < size) {
+        if (ply->buffer_first < ply->buffer_last) {
+            buffer[i] = ply->buffer[ply->buffer_first];
+            ply->buffer_first++;
+            i++;
+        } else {
+            ply->buffer_first = 0;
+            ply->buffer_last = fread(ply->buffer, 1, BUFFERSIZE, ply->fp);
+            if (ply->buffer_last <= 0) return 0;
+        }
+    }
+    return 1;
+}
+
+static int ply_write_chunk(p_ply ply, void *anybuffer, size_t size) {
+    char *buffer = (char *) anybuffer;
+    size_t i = 0;
+    assert(ply && ply->fp && ply->io_mode == PLY_WRITE);
+    assert(ply->buffer_last <= BUFFERSIZE);
+    while (i < size) {
+        if (ply->buffer_last < BUFFERSIZE) {
+            ply->buffer[ply->buffer_last] = buffer[i];
+            ply->buffer_last++;
+            i++;
+        } else {
+            ply->buffer_last = 0;
+            if (fwrite(ply->buffer, 1, BUFFERSIZE, ply->fp) < BUFFERSIZE)
+                return 0;
+        }
+    }
+    return 1;
+}
+
+static int ply_write_chunk_reverse(p_ply ply, void *anybuffer, size_t size) {
+    int ret = 0;
+    ply_reverse(anybuffer, size);
+    ret = ply_write_chunk(ply, anybuffer, size);
+    ply_reverse(anybuffer, size);
+    return ret;
+}
+
+static int ply_read_chunk_reverse(p_ply ply, void *anybuffer, size_t size) {
+    if (!ply_read_chunk(ply, anybuffer, size)) return 0;
+    ply_reverse(anybuffer, size);
+    return 1;
+}
+
+static void ply_reverse(void *anydata, size_t size) {
+    char *data = (char *) anydata;
+    char temp;
+    size_t i;
+    for (i = 0; i < size/2; i++) {
+        temp = data[i];
+        data[i] = data[size-i-1];
+        data[size-i-1] = temp;
+    }
+}
+
+static void ply_init(p_ply ply) {
+    ply->element = NULL;
+    ply->nelements = 0;
+    ply->comment = NULL;
+    ply->ncomments = 0;
+    ply->obj_info = NULL;
+    ply->nobj_infos = 0;
+    ply->idriver = NULL;
+    ply->odriver = NULL;
+    ply->buffer[0] = '\0';
+    ply->buffer_first = ply->buffer_last = ply->buffer_token = 0;
+    ply->welement = 0;
+    ply->wproperty = 0;
+    ply->winstance_index = 0;
+    ply->wlength = 0;
+    ply->wvalue_index = 0;
+}
+
+static void ply_element_init(p_ply_element element) {
+    element->name[0] = '\0';
+    element->ninstances = 0;
+    element->property = NULL;
+    element->nproperties = 0; 
+}
+
+static void ply_property_init(p_ply_property property) {
+    property->name[0] = '\0';
+    property->type = -1;
+    property->length_type = -1;
+    property->value_type = -1;
+    property->read_cb = (p_ply_read_cb) NULL;
+    property->pdata = NULL;
+    property->idata = 0;
+}
+
+static p_ply ply_alloc(void) {
+    p_ply ply = (p_ply) calloc(1, sizeof(t_ply));
+    if (!ply) return NULL;
+    ply_init(ply);
+    return ply;
+}
+
+static void *ply_grow_array(p_ply ply, void **pointer, 
+        long *nmemb, long size) {
+    void *temp = *pointer;
+    long count = *nmemb + 1;
+    if (!temp) temp = malloc(count*size);
+    else temp = realloc(temp, count*size);
+    if (!temp) {
+        ply_ferror(ply, "Out of memory");
+        return NULL;
+    }
+    *pointer = temp;
+    *nmemb = count;
+    return (char *) temp + (count-1) * size;
+}
+
+static p_ply_element ply_grow_element(p_ply ply) {
+    p_ply_element element = NULL;
+    assert(ply); 
+    assert(ply->element || ply->nelements == 0); 
+    assert(!ply->element || ply->nelements > 0); 
+    element = (p_ply_element) ply_grow_array(ply, (void **) &ply->element, 
+            &ply->nelements, sizeof(t_ply_element));
+    if (!element) return NULL;
+    ply_element_init(element);
+    return element; 
+}
+
+static p_ply_property ply_grow_property(p_ply ply, p_ply_element element) {
+    p_ply_property property = NULL;
+    assert(ply);
+    assert(element);
+    assert(element->property || element->nproperties == 0);
+    assert(!element->property || element->nproperties > 0);
+    property = (p_ply_property) ply_grow_array(ply, 
+            (void **) &element->property, 
+            &element->nproperties, sizeof(t_ply_property));
+    if (!property) return NULL;
+    ply_property_init(property);
+    return property;
+}
+
+static int ply_read_header_format(p_ply ply) {
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    if (strcmp(BWORD(ply), "format")) return 0;
+    if (!ply_read_word(ply)) return 0;
+    ply->storage_mode = ply_find_string(BWORD(ply), ply_storage_mode_list);
+    if (ply->storage_mode == (e_ply_storage_mode) (-1)) return 0;
+    if (ply->storage_mode == PLY_ASCII) ply->idriver = &ply_idriver_ascii;
+    else if (ply->storage_mode == ply_arch_endian()) 
+        ply->idriver = &ply_idriver_binary;
+    else ply->idriver = &ply_idriver_binary_reverse;
+    if (!ply_read_word(ply)) return 0;
+    if (strcmp(BWORD(ply), "1.0")) return 0;
+    if (!ply_read_word(ply)) return 0;
+    return 1;
+}
+
+static int ply_read_header_comment(p_ply ply) {
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    if (strcmp(BWORD(ply), "comment")) return 0;
+    if (!ply_read_line(ply)) return 0;
+    if (!ply_add_comment(ply, BLINE(ply))) return 0;
+    if (!ply_read_word(ply)) return 0;
+    return 1;
+}
+
+static int ply_read_header_obj_info(p_ply ply) {
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    if (strcmp(BWORD(ply), "obj_info")) return 0;
+    if (!ply_read_line(ply)) return 0;
+    if (!ply_add_obj_info(ply, BLINE(ply))) return 0;
+    if (!ply_read_word(ply)) return 0;
+    return 1;
+}
+
+static int ply_read_header_property(p_ply ply) {
+    p_ply_element element = NULL;
+    p_ply_property property = NULL;
+    /* make sure it is a property */
+    if (strcmp(BWORD(ply), "property")) return 0;
+    element = &ply->element[ply->nelements-1];
+    property = ply_grow_property(ply, element);
+    if (!property) return 0;
+    /* get property type */
+    if (!ply_read_word(ply)) return 0;
+    property->type = ply_find_string(BWORD(ply), ply_type_list);
+    if (property->type == (e_ply_type) (-1)) return 0;
+    if (property->type == PLY_LIST) {
+        /* if it's a list, we need the base types */
+        if (!ply_read_word(ply)) return 0;
+        property->length_type = ply_find_string(BWORD(ply), ply_type_list);
+        if (property->length_type == (e_ply_type) (-1)) return 0;
+        if (!ply_read_word(ply)) return 0;
+        property->value_type = ply_find_string(BWORD(ply), ply_type_list);
+        if (property->value_type == (e_ply_type) (-1)) return 0;
+    }
+    /* get property name */
+    if (!ply_read_word(ply)) return 0;
+    strcpy(property->name, BWORD(ply));
+    if (!ply_read_word(ply)) return 0;
+    return 1;
+}
+
+static int ply_read_header_element(p_ply ply) {
+    p_ply_element element = NULL;
+    long dummy;
+    assert(ply && ply->fp && ply->io_mode == PLY_READ);
+    if (strcmp(BWORD(ply), "element")) return 0;
+    /* allocate room for new element */
+    element = ply_grow_element(ply);
+    if (!element) return 0;
+    /* get element name */
+    if (!ply_read_word(ply)) return 0;
+    strcpy(element->name, BWORD(ply));
+    /* get number of elements of this type */
+    if (!ply_read_word(ply)) return 0;
+    if (sscanf(BWORD(ply), "%ld", &dummy) != 1) {
+        ply_ferror(ply, "Expected number got '%s'", BWORD(ply));
+        return 0;
+    }
+    element->ninstances = dummy;
+    /* get all properties for this element */
+    if (!ply_read_word(ply)) return 0;
+    while (ply_read_header_property(ply) || 
+        ply_read_header_comment(ply) || ply_read_header_obj_info(ply))
+        /* do nothing */;
+    return 1;
+}
+
+static void ply_error_cb(p_ply ply, const char *message) {
+    (void) ply;
+    fprintf(stderr, "RPly: %s\n", message);
+}
+
+static void ply_ferror(p_ply ply, const char *fmt, ...) {
+    char buffer[1024];
+    va_list ap;
+    va_start(ap, fmt);
+    vsprintf(buffer, fmt, ap);
+    va_end(ap);
+    ply->error_cb(ply, buffer);
+}
+
+static e_ply_storage_mode ply_arch_endian(void) {
+    unsigned long i = 1;
+    unsigned char *s = (unsigned char *) &i;
+    if (*s == 1) return PLY_LITTLE_ENDIAN;
+    else return PLY_BIG_ENDIAN;
+}
+
+static int ply_type_check(void) {
+    assert(sizeof(t_ply_int8) == 1);
+    assert(sizeof(t_ply_uint8) == 1);
+    assert(sizeof(t_ply_int16) == 2);
+    assert(sizeof(t_ply_uint16) == 2);
+    assert(sizeof(t_ply_int32) == 4);
+    assert(sizeof(t_ply_uint32) == 4);
+    assert(sizeof(float) == 4);
+    assert(sizeof(double) == 8);
+    if (sizeof(t_ply_int8) != 1) return 0;
+    if (sizeof(t_ply_uint8) != 1) return 0;
+    if (sizeof(t_ply_int16) != 2) return 0;
+    if (sizeof(t_ply_uint16) != 2) return 0;
+    if (sizeof(t_ply_int32) != 4) return 0;
+    if (sizeof(t_ply_uint32) != 4) return 0;
+    if (sizeof(float) != 4) return 0;
+    if (sizeof(double) != 8) return 0;
+    return 1;
+}
+
+/* ----------------------------------------------------------------------
+ * Output handlers
+ * ---------------------------------------------------------------------- */
+static int oascii_int8(p_ply ply, double value) {
+    if (value > PLY_INT8_MAX || value < PLY_INT8_MIN) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_int8) value) > 0;
+}
+
+static int oascii_uint8(p_ply ply, double value) {
+    if (value > PLY_UINT8_MAX || value < 0) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_uint8) value) > 0;
+}
+
+static int oascii_int16(p_ply ply, double value) {
+    if (value > PLY_INT16_MAX || value < PLY_INT16_MIN) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_int16) value) > 0;
+}
+
+static int oascii_uint16(p_ply ply, double value) {
+    if (value > PLY_UINT16_MAX || value < 0) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_uint16) value) > 0;
+}
+
+static int oascii_int32(p_ply ply, double value) {
+    if (value > PLY_INT32_MAX || value < PLY_INT32_MIN) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_int32) value) > 0;
+}
+
+static int oascii_uint32(p_ply ply, double value) {
+    if (value > PLY_UINT32_MAX || value < 0) return 0;
+    return fprintf(ply->fp, "%d", (t_ply_uint32) value) > 0;
+}
+
+static int oascii_float32(p_ply ply, double value) {
+    if (value < -FLT_MAX || value > FLT_MAX) return 0;
+    return fprintf(ply->fp, "%g", (float) value) > 0;
+}
+
+static int oascii_float64(p_ply ply, double value) {
+    if (value < -DBL_MAX || value > DBL_MAX) return 0;
+    return fprintf(ply->fp, "%g", value) > 0;
+}
+
+static int obinary_int8(p_ply ply, double value) {
+    t_ply_int8 int8 = (t_ply_int8) value;
+    if (value > PLY_INT8_MAX || value < PLY_INT8_MIN) return 0;
+    return ply->odriver->ochunk(ply, &int8, sizeof(int8));
+}
+
+static int obinary_uint8(p_ply ply, double value) {
+    t_ply_uint8 uint8 = (t_ply_uint8) value;
+    if (value > PLY_UINT8_MAX || value < 0) return 0;
+    return ply->odriver->ochunk(ply, &uint8, sizeof(uint8)); 
+}
+
+static int obinary_int16(p_ply ply, double value) {
+    t_ply_int16 int16 = (t_ply_int16) value;
+    if (value > PLY_INT16_MAX || value < PLY_INT16_MIN) return 0;
+    return ply->odriver->ochunk(ply, &int16, sizeof(int16));
+}
+
+static int obinary_uint16(p_ply ply, double value) {
+    t_ply_uint16 uint16 = (t_ply_uint16) value;
+    if (value > PLY_UINT16_MAX || value < 0) return 0;
+    return ply->odriver->ochunk(ply, &uint16, sizeof(uint16)); 
+}
+
+static int obinary_int32(p_ply ply, double value) {
+    t_ply_int32 int32 = (t_ply_int32) value;
+    if (value > PLY_INT32_MAX || value < PLY_INT32_MIN) return 0;
+    return ply->odriver->ochunk(ply, &int32, sizeof(int32));
+}
+
+static int obinary_uint32(p_ply ply, double value) {
+    t_ply_uint32 uint32 = (t_ply_uint32) value;
+    if (value > PLY_UINT32_MAX || value < 0) return 0;
+    return ply->odriver->ochunk(ply, &uint32, sizeof(uint32));
+}
+
+static int obinary_float32(p_ply ply, double value) {
+    float float32 = (float) value;
+    if (value > FLT_MAX || value < -FLT_MAX) return 0;
+    return ply->odriver->ochunk(ply, &float32, sizeof(float32));
+}
+
+static int obinary_float64(p_ply ply, double value) {
+    return ply->odriver->ochunk(ply, &value, sizeof(value)); 
+}
+
+/* ----------------------------------------------------------------------
+ * Input  handlers
+ * ---------------------------------------------------------------------- */
+static int iascii_int8(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_INT8_MAX || *value < PLY_INT8_MIN) return 0;
+    return 1;
+}
+
+static int iascii_uint8(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_UINT8_MAX || *value < 0) return 0;
+    return 1;
+}
+
+static int iascii_int16(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_INT16_MAX || *value < PLY_INT16_MIN) return 0;
+    return 1;
+}
+
+static int iascii_uint16(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_UINT16_MAX || *value < 0) return 0;
+    return 1;
+}
+
+static int iascii_int32(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_INT32_MAX || *value < PLY_INT32_MIN) return 0;
+    return 1;
+}
+
+static int iascii_uint32(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtol(BWORD(ply), &end, 10);
+    if (*end || *value > PLY_UINT32_MAX || *value < 0) return 0;
+    return 1;
+}
+
+static int iascii_float32(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtod(BWORD(ply), &end);
+    if (*end || *value < -FLT_MAX || *value > FLT_MAX) return 0;
+    return 1;
+}
+
+static int iascii_float64(p_ply ply, double *value) {
+    char *end;
+    if (!ply_read_word(ply)) return 0;
+    *value = strtod(BWORD(ply), &end);
+    if (*end || *value < -DBL_MAX || *value > DBL_MAX) return 0;
+    return 1;
+}
+
+static int ibinary_int8(p_ply ply, double *value) {
+    t_ply_int8 int8;
+    if (!ply->idriver->ichunk(ply, &int8, 1)) return 0;
+    *value = int8;
+    return 1;
+}
+
+static int ibinary_uint8(p_ply ply, double *value) {
+    t_ply_uint8 uint8;
+    if (!ply->idriver->ichunk(ply, &uint8, 1)) return 0;
+    *value = uint8;
+    return 1;
+}
+
+static int ibinary_int16(p_ply ply, double *value) {
+    t_ply_int16 int16;
+    if (!ply->idriver->ichunk(ply, &int16, sizeof(int16))) return 0;
+    *value = int16;
+    return 1;
+}
+
+static int ibinary_uint16(p_ply ply, double *value) {
+    t_ply_uint16 uint16;
+    if (!ply->idriver->ichunk(ply, &uint16, sizeof(uint16))) return 0;
+    *value = uint16;
+    return 1;
+}
+
+static int ibinary_int32(p_ply ply, double *value) {
+    t_ply_int32 int32;
+    if (!ply->idriver->ichunk(ply, &int32, sizeof(int32))) return 0;
+    *value = int32;
+    return 1;
+}
+
+static int ibinary_uint32(p_ply ply, double *value) {
+    t_ply_uint32 uint32;
+    if (!ply->idriver->ichunk(ply, &uint32, sizeof(uint32))) return 0;
+    *value = uint32;
+    return 1;
+}
+
+static int ibinary_float32(p_ply ply, double *value) {
+    float float32;
+    if (!ply->idriver->ichunk(ply, &float32, sizeof(float32))) return 0;
+    *value = float32;
+    return 1;
+}
+
+static int ibinary_float64(p_ply ply, double *value) {
+    return ply->idriver->ichunk(ply, value, sizeof(double));
+}
+
+/* ----------------------------------------------------------------------
+ * Constants
+ * ---------------------------------------------------------------------- */
+static t_ply_idriver ply_idriver_ascii = {
+    {   iascii_int8, iascii_uint8, iascii_int16, iascii_uint16,
+        iascii_int32, iascii_uint32, iascii_float32, iascii_float64,
+        iascii_int8, iascii_uint8, iascii_int16, iascii_uint16,
+        iascii_int32, iascii_uint32, iascii_float32, iascii_float64
+    }, /* order matches e_ply_type enum */
+    NULL,
+    "ascii input"
+};
+
+static t_ply_idriver ply_idriver_binary = {
+    {   ibinary_int8, ibinary_uint8, ibinary_int16, ibinary_uint16,
+        ibinary_int32, ibinary_uint32, ibinary_float32, ibinary_float64,
+        ibinary_int8, ibinary_uint8, ibinary_int16, ibinary_uint16,
+        ibinary_int32, ibinary_uint32, ibinary_float32, ibinary_float64
+    }, /* order matches e_ply_type enum */
+    ply_read_chunk,
+    "binary input"
+};
+
+static t_ply_idriver ply_idriver_binary_reverse = {
+    {   ibinary_int8, ibinary_uint8, ibinary_int16, ibinary_uint16,
+        ibinary_int32, ibinary_uint32, ibinary_float32, ibinary_float64,
+        ibinary_int8, ibinary_uint8, ibinary_int16, ibinary_uint16,
+        ibinary_int32, ibinary_uint32, ibinary_float32, ibinary_float64
+    }, /* order matches e_ply_type enum */
+    ply_read_chunk_reverse,
+    "reverse binary input"
+};
+
+static t_ply_odriver ply_odriver_ascii = {
+    {   oascii_int8, oascii_uint8, oascii_int16, oascii_uint16,
+        oascii_int32, oascii_uint32, oascii_float32, oascii_float64,
+        oascii_int8, oascii_uint8, oascii_int16, oascii_uint16,
+        oascii_int32, oascii_uint32, oascii_float32, oascii_float64
+    }, /* order matches e_ply_type enum */
+    NULL,
+    "ascii output"
+};
+
+static t_ply_odriver ply_odriver_binary = {
+    {   obinary_int8, obinary_uint8, obinary_int16, obinary_uint16,
+        obinary_int32, obinary_uint32, obinary_float32, obinary_float64,
+        obinary_int8, obinary_uint8, obinary_int16, obinary_uint16,
+        obinary_int32, obinary_uint32, obinary_float32, obinary_float64
+    }, /* order matches e_ply_type enum */
+    ply_write_chunk,
+    "binary output"
+};
+
+static t_ply_odriver ply_odriver_binary_reverse = {
+    {   obinary_int8, obinary_uint8, obinary_int16, obinary_uint16,
+        obinary_int32, obinary_uint32, obinary_float32, obinary_float64,
+        obinary_int8, obinary_uint8, obinary_int16, obinary_uint16,
+        obinary_int32, obinary_uint32, obinary_float32, obinary_float64
+    }, /* order matches e_ply_type enum */
+    ply_write_chunk_reverse,
+    "reverse binary output"
+};
+
+/* ----------------------------------------------------------------------
+ * Copyright (C) 2003-2011 Diego Nehab.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ---------------------------------------------------------------------- */
diff --git a/vendor/rply-1.1.3/rply.h b/vendor/rply-1.1.3/rply.h
new file mode 100644
index 0000000..c284568
--- /dev/null
+++ b/vendor/rply-1.1.3/rply.h
@@ -0,0 +1,376 @@
+#ifndef RPLY_H
+#define RPLY_H
+/* ----------------------------------------------------------------------
+ * RPly library, read/write PLY files
+ * Diego Nehab, IMPA
+ * http://www.impa.br/~diego/software/rply
+ *
+ * This library is distributed under the MIT License. See notice
+ * at the end of this file.
+ * ---------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RPLY_VERSION   "RPly 1.1.3"
+#define RPLY_COPYRIGHT "Copyright (C) 2003-2013 Diego Nehab"
+#define RPLY_AUTHORS   "Diego Nehab"
+
+/* ----------------------------------------------------------------------
+ * Types
+ * ---------------------------------------------------------------------- */
+/* structures are opaque */
+typedef struct t_ply_ *p_ply;
+typedef struct t_ply_element_ *p_ply_element;
+typedef struct t_ply_property_ *p_ply_property;
+typedef struct t_ply_argument_ *p_ply_argument;
+
+/* ply format mode type */
+typedef enum e_ply_storage_mode_ {
+    PLY_BIG_ENDIAN,
+    PLY_LITTLE_ENDIAN,
+    PLY_ASCII,   
+    PLY_DEFAULT      /* has to be the last in enum */
+} e_ply_storage_mode; /* order matches ply_storage_mode_list */
+
+/* ply data type */
+typedef enum e_ply_type {
+    PLY_INT8, PLY_UINT8, PLY_INT16, PLY_UINT16, 
+    PLY_INT32, PLY_UIN32, PLY_FLOAT32, PLY_FLOAT64,
+    PLY_CHAR, PLY_UCHAR, PLY_SHORT, PLY_USHORT,
+    PLY_INT, PLY_UINT, PLY_FLOAT, PLY_DOUBLE,
+    PLY_LIST    /* has to be the last in enum */
+} e_ply_type;   /* order matches ply_type_list */
+
+/* ----------------------------------------------------------------------
+ * Error callback prototype
+ *
+ * message: error message
+ * ply: handle returned by ply_open or ply_create
+ * ---------------------------------------------------------------------- */
+typedef void (*p_ply_error_cb)(p_ply ply, const char *message);
+
+/* ----------------------------------------------------------------------
+ * Gets user data from within an error callback 
+ *
+ * ply: handle returned by ply_open or ply_create
+ * idata,pdata: contextual information set in ply_open or ply_create
+ * ---------------------------------------------------------------------- */
+int ply_get_ply_user_data(p_ply ply, void **pdata, long *idata);
+
+/* ----------------------------------------------------------------------
+ * Opens a PLY file for reading (fails if file is not a PLY file)
+ *
+ * name: file name
+ * error_cb: error callback function
+ * idata,pdata: contextual information available to users
+ *
+ * Returns 1 if successful, 0 otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_open(const char *name, p_ply_error_cb error_cb, long idata, 
+        void *pdata);
+
+/* ----------------------------------------------------------------------
+ * Reads and parses the header of a PLY file returned by ply_open
+ *
+ * ply: handle returned by ply_open
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_read_header(p_ply ply);
+
+/* ----------------------------------------------------------------------
+ * Property reading callback prototype
+ *
+ * argument: parameters for property being processed when callback is called
+ *
+ * Returns 1 if should continue processing file, 0 if should abort.
+ * ---------------------------------------------------------------------- */
+typedef int (*p_ply_read_cb)(p_ply_argument argument);
+
+/* ----------------------------------------------------------------------
+ * Sets up callbacks for property reading after header was parsed
+ *
+ * ply: handle returned by ply_open
+ * element_name: element where property is
+ * property_name: property to associate element with
+ * read_cb: function to be called for each property value
+ * pdata/idata: user data that will be passed to callback
+ *
+ * Returns 0 if no element or no property in element, returns the
+ * number of element instances otherwise. 
+ * ---------------------------------------------------------------------- */
+long ply_set_read_cb(p_ply ply, const char *element_name, 
+        const char *property_name, p_ply_read_cb read_cb, 
+        void *pdata, long idata);
+
+/* ----------------------------------------------------------------------
+ * Returns information about the element originating a callback
+ *
+ * argument: handle to argument 
+ * element: receives a the element handle (if non-null)
+ * instance_index: receives the index of the current element instance 
+ *     (if non-null)
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_get_argument_element(p_ply_argument argument, 
+        p_ply_element *element, long *instance_index);
+
+/* ----------------------------------------------------------------------
+ * Returns information about the property originating a callback
+ *
+ * argument: handle to argument 
+ * property: receives the property handle (if non-null)
+ * length: receives the number of values in this property (if non-null)
+ * value_index: receives the index of current property value (if non-null)
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_get_argument_property(p_ply_argument argument, 
+        p_ply_property *property, long *length, long *value_index);
+
+/* ----------------------------------------------------------------------
+ * Returns user data associated with callback 
+ *
+ * pdata: receives a copy of user custom data pointer (if non-null)
+ * idata: receives a copy of user custom data integer (if non-null)
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_get_argument_user_data(p_ply_argument argument, void **pdata, 
+        long *idata);
+
+/* ----------------------------------------------------------------------
+ * Returns the value associated with a callback
+ *
+ * argument: handle to argument 
+ *
+ * Returns the current data item
+ * ---------------------------------------------------------------------- */
+double ply_get_argument_value(p_ply_argument argument); 
+
+/* ----------------------------------------------------------------------
+ * Reads all elements and properties calling the callbacks defined with
+ * calls to ply_set_read_cb
+ *
+ * ply: handle returned by ply_open
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_read(p_ply ply);
+
+/* ----------------------------------------------------------------------
+ * Iterates over all elements by returning the next element.
+ * Call with NULL to return handle to first element.
+ *
+ * ply: handle returned by ply_open
+ * last: handle of last element returned (NULL for first element)
+ *
+ * Returns element if successfull or NULL if no more elements
+ * ---------------------------------------------------------------------- */
+p_ply_element ply_get_next_element(p_ply ply, p_ply_element last);
+
+/* ----------------------------------------------------------------------
+ * Iterates over all comments by returning the next comment.
+ * Call with NULL to return pointer to first comment.
+ *
+ * ply: handle returned by ply_open
+ * last: pointer to last comment returned (NULL for first comment)
+ *
+ * Returns comment if successfull or NULL if no more comments
+ * ---------------------------------------------------------------------- */
+const char *ply_get_next_comment(p_ply ply, const char *last);
+
+/* ----------------------------------------------------------------------
+ * Iterates over all obj_infos by returning the next obj_info.
+ * Call with NULL to return pointer to first obj_info.
+ *
+ * ply: handle returned by ply_open
+ * last: pointer to last obj_info returned (NULL for first obj_info)
+ *
+ * Returns obj_info if successfull or NULL if no more obj_infos
+ * ---------------------------------------------------------------------- */
+const char *ply_get_next_obj_info(p_ply ply, const char *last);
+
+/* ----------------------------------------------------------------------
+ * Returns information about an element
+ *
+ * element: element of interest
+ * name: receives a pointer to internal copy of element name (if non-null)
+ * ninstances: receives the number of instances of this element (if non-null)
+ *
+ * Returns 1 if successfull or 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_get_element_info(p_ply_element element, const char** name,
+        long *ninstances);
+
+/* ----------------------------------------------------------------------
+ * Iterates over all properties by returning the next property.
+ * Call with NULL to return handle to first property.
+ *
+ * element: handle of element with the properties of interest
+ * last: handle of last property returned (NULL for first property)
+ *
+ * Returns element if successfull or NULL if no more properties
+ * ---------------------------------------------------------------------- */
+p_ply_property ply_get_next_property(p_ply_element element, 
+        p_ply_property last);
+
+/* ----------------------------------------------------------------------
+ * Returns information about a property
+ *
+ * property: handle to property of interest
+ * name: receives a pointer to internal copy of property name (if non-null)
+ * type: receives the property type (if non-null)
+ * length_type: for list properties, receives the scalar type of
+ *     the length field (if non-null)
+ * value_type: for list properties, receives the scalar type of the value 
+ *     fields  (if non-null)
+ *
+ * Returns 1 if successfull or 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_get_property_info(p_ply_property property, const char** name,
+        e_ply_type *type, e_ply_type *length_type, e_ply_type *value_type);
+
+/* ----------------------------------------------------------------------
+ * Creates new PLY file
+ *
+ * name: file name
+ * storage_mode: file format mode
+ *
+ * Returns handle to PLY file if successfull, NULL otherwise
+ * ---------------------------------------------------------------------- */
+p_ply ply_create(const char *name, e_ply_storage_mode storage_mode, 
+        p_ply_error_cb error_cb, long idata, void *pdata);
+
+/* ----------------------------------------------------------------------
+ * Adds a new element to the PLY file created by ply_create
+ *
+ * ply: handle returned by ply_create
+ * name: name of new element
+ * ninstances: number of element of this time in file
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_element(p_ply ply, const char *name, long ninstances);
+
+/* ----------------------------------------------------------------------
+ * Adds a new property to the last element added by ply_add_element
+ *
+ * ply: handle returned by ply_create
+ * name: name of new property
+ * type: property type
+ * length_type: scalar type of length field of a list property 
+ * value_type: scalar type of value fields of a list property
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_property(p_ply ply, const char *name, e_ply_type type,
+        e_ply_type length_type, e_ply_type value_type);
+
+/* ----------------------------------------------------------------------
+ * Adds a new list property to the last element added by ply_add_element
+ *
+ * ply: handle returned by ply_create
+ * name: name of new property
+ * length_type: scalar type of length field of a list property 
+ * value_type: scalar type of value fields of a list property
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_list_property(p_ply ply, const char *name, 
+        e_ply_type length_type, e_ply_type value_type);
+
+/* ----------------------------------------------------------------------
+ * Adds a new property to the last element added by ply_add_element
+ *
+ * ply: handle returned by ply_create
+ * name: name of new property
+ * type: property type
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_scalar_property(p_ply ply, const char *name, e_ply_type type);
+
+/* ----------------------------------------------------------------------
+ * Adds a new comment item 
+ *
+ * ply: handle returned by ply_create
+ * comment: pointer to string with comment text
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_comment(p_ply ply, const char *comment);
+
+/* ----------------------------------------------------------------------
+ * Adds a new obj_info item 
+ *
+ * ply: handle returned by ply_create
+ * comment: pointer to string with obj_info data
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_add_obj_info(p_ply ply, const char *obj_info);
+
+/* ----------------------------------------------------------------------
+ * Writes the PLY file header after all element and properties have been
+ * defined by calls to ply_add_element and ply_add_property
+ *
+ * ply: handle returned by ply_create
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_write_header(p_ply ply);
+
+/* ----------------------------------------------------------------------
+ * Writes one property value, in the order they should be written to the
+ * file. For each element type, write all elements of that type in order.
+ * For each element, write all its properties in order. For scalar
+ * properties, just write the value. For list properties, write the length 
+ * and then each of the values.
+ *
+ * ply: handle returned by ply_create
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_write(p_ply ply, double value);
+
+/* ----------------------------------------------------------------------
+ * Closes a PLY file handle. Releases all memory used by handle
+ *
+ * ply: handle to be closed. 
+ *
+ * Returns 1 if successfull, 0 otherwise
+ * ---------------------------------------------------------------------- */
+int ply_close(p_ply ply);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RPLY_H */
+
+/* ----------------------------------------------------------------------
+ * Copyright (C) 2003-2011 Diego Nehab. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * ---------------------------------------------------------------------- */

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pdal.git



More information about the Pkg-grass-devel mailing list